('service', 'Service', errors);\r\n *\r\n * ...\r\n * throw error.create(Err.GENERIC);\r\n * ...\r\n * throw error.create(Err.FILE_NOT_FOUND, {'file': fileName});\r\n * ...\r\n * // Service: Could not file file: foo.txt (service/file-not-found).\r\n *\r\n * catch (e) {\r\n * assert(e.message === \"Could not find file: foo.txt.\");\r\n * if ((e as FirebaseError)?.code === 'service/file-not-found') {\r\n * console.log(\"Could not read file: \" + e['file']);\r\n * }\r\n * }\r\n */\r\nconst ERROR_NAME = 'FirebaseError';\r\n// Based on code from:\r\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error#Custom_Error_Types\r\nclass FirebaseError extends Error {\r\n constructor(\r\n /** The error code for this error. */\r\n code, message, \r\n /** Custom data for this error. */\r\n customData) {\r\n super(message);\r\n this.code = code;\r\n this.customData = customData;\r\n /** The custom name for all FirebaseErrors. */\r\n this.name = ERROR_NAME;\r\n // Fix For ES5\r\n // https://github.com/Microsoft/TypeScript-wiki/blob/master/Breaking-Changes.md#extending-built-ins-like-error-array-and-map-may-no-longer-work\r\n Object.setPrototypeOf(this, FirebaseError.prototype);\r\n // Maintains proper stack trace for where our error was thrown.\r\n // Only available on V8.\r\n if (Error.captureStackTrace) {\r\n Error.captureStackTrace(this, ErrorFactory.prototype.create);\r\n }\r\n }\r\n}\r\nclass ErrorFactory {\r\n constructor(service, serviceName, errors) {\r\n this.service = service;\r\n this.serviceName = serviceName;\r\n this.errors = errors;\r\n }\r\n create(code, ...data) {\r\n const customData = data[0] || {};\r\n const fullCode = `${this.service}/${code}`;\r\n const template = this.errors[code];\r\n const message = template ? replaceTemplate(template, customData) : 'Error';\r\n // Service Name: Error message (service/code).\r\n const fullMessage = `${this.serviceName}: ${message} (${fullCode}).`;\r\n const error = new FirebaseError(fullCode, fullMessage, customData);\r\n return error;\r\n }\r\n}\r\nfunction replaceTemplate(template, data) {\r\n return template.replace(PATTERN, (_, key) => {\r\n const value = data[key];\r\n return value != null ? String(value) : `<${key}?>`;\r\n });\r\n}\r\nconst PATTERN = /\\{\\$([^}]+)}/g;\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Evaluates a JSON string into a javascript object.\r\n *\r\n * @param {string} str A string containing JSON.\r\n * @return {*} The javascript object representing the specified JSON.\r\n */\r\nfunction jsonEval(str) {\r\n return JSON.parse(str);\r\n}\r\n/**\r\n * Returns JSON representing a javascript object.\r\n * @param {*} data Javascript object to be stringified.\r\n * @return {string} The JSON contents of the object.\r\n */\r\nfunction stringify(data) {\r\n return JSON.stringify(data);\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Decodes a Firebase auth. token into constituent parts.\r\n *\r\n * Notes:\r\n * - May return with invalid / incomplete claims if there's no native base64 decoding support.\r\n * - Doesn't check if the token is actually valid.\r\n */\r\nconst decode = function (token) {\r\n let header = {}, claims = {}, data = {}, signature = '';\r\n try {\r\n const parts = token.split('.');\r\n header = jsonEval(base64Decode(parts[0]) || '');\r\n claims = jsonEval(base64Decode(parts[1]) || '');\r\n signature = parts[2];\r\n data = claims['d'] || {};\r\n delete claims['d'];\r\n }\r\n catch (e) { }\r\n return {\r\n header,\r\n claims,\r\n data,\r\n signature\r\n };\r\n};\r\n/**\r\n * Decodes a Firebase auth. token and checks the validity of its time-based claims. Will return true if the\r\n * token is within the time window authorized by the 'nbf' (not-before) and 'iat' (issued-at) claims.\r\n *\r\n * Notes:\r\n * - May return a false negative if there's no native base64 decoding support.\r\n * - Doesn't check if the token is actually valid.\r\n */\r\nconst isValidTimestamp = function (token) {\r\n const claims = decode(token).claims;\r\n const now = Math.floor(new Date().getTime() / 1000);\r\n let validSince = 0, validUntil = 0;\r\n if (typeof claims === 'object') {\r\n if (claims.hasOwnProperty('nbf')) {\r\n validSince = claims['nbf'];\r\n }\r\n else if (claims.hasOwnProperty('iat')) {\r\n validSince = claims['iat'];\r\n }\r\n if (claims.hasOwnProperty('exp')) {\r\n validUntil = claims['exp'];\r\n }\r\n else {\r\n // token will expire after 24h by default\r\n validUntil = validSince + 86400;\r\n }\r\n }\r\n return (!!now &&\r\n !!validSince &&\r\n !!validUntil &&\r\n now >= validSince &&\r\n now <= validUntil);\r\n};\r\n/**\r\n * Decodes a Firebase auth. token and returns its issued at time if valid, null otherwise.\r\n *\r\n * Notes:\r\n * - May return null if there's no native base64 decoding support.\r\n * - Doesn't check if the token is actually valid.\r\n */\r\nconst issuedAtTime = function (token) {\r\n const claims = decode(token).claims;\r\n if (typeof claims === 'object' && claims.hasOwnProperty('iat')) {\r\n return claims['iat'];\r\n }\r\n return null;\r\n};\r\n/**\r\n * Decodes a Firebase auth. token and checks the validity of its format. Expects a valid issued-at time.\r\n *\r\n * Notes:\r\n * - May return a false negative if there's no native base64 decoding support.\r\n * - Doesn't check if the token is actually valid.\r\n */\r\nconst isValidFormat = function (token) {\r\n const decoded = decode(token), claims = decoded.claims;\r\n return !!claims && typeof claims === 'object' && claims.hasOwnProperty('iat');\r\n};\r\n/**\r\n * Attempts to peer into an auth token and determine if it's an admin auth token by looking at the claims portion.\r\n *\r\n * Notes:\r\n * - May return a false negative if there's no native base64 decoding support.\r\n * - Doesn't check if the token is actually valid.\r\n */\r\nconst isAdmin = function (token) {\r\n const claims = decode(token).claims;\r\n return typeof claims === 'object' && claims['admin'] === true;\r\n};\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction contains(obj, key) {\r\n return Object.prototype.hasOwnProperty.call(obj, key);\r\n}\r\nfunction safeGet(obj, key) {\r\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\r\n return obj[key];\r\n }\r\n else {\r\n return undefined;\r\n }\r\n}\r\nfunction isEmpty(obj) {\r\n for (const key in obj) {\r\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n}\r\nfunction map(obj, fn, contextObj) {\r\n const res = {};\r\n for (const key in obj) {\r\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\r\n res[key] = fn.call(contextObj, obj[key], key, obj);\r\n }\r\n }\r\n return res;\r\n}\r\n/**\r\n * Deep equal two objects. Support Arrays and Objects.\r\n */\r\nfunction deepEqual(a, b) {\r\n if (a === b) {\r\n return true;\r\n }\r\n const aKeys = Object.keys(a);\r\n const bKeys = Object.keys(b);\r\n for (const k of aKeys) {\r\n if (!bKeys.includes(k)) {\r\n return false;\r\n }\r\n const aProp = a[k];\r\n const bProp = b[k];\r\n if (isObject(aProp) && isObject(bProp)) {\r\n if (!deepEqual(aProp, bProp)) {\r\n return false;\r\n }\r\n }\r\n else if (aProp !== bProp) {\r\n return false;\r\n }\r\n }\r\n for (const k of bKeys) {\r\n if (!aKeys.includes(k)) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n}\r\nfunction isObject(thing) {\r\n return thing !== null && typeof thing === 'object';\r\n}\n\n/**\r\n * @license\r\n * Copyright 2022 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Rejects if the given promise doesn't resolve in timeInMS milliseconds.\r\n * @internal\r\n */\r\nfunction promiseWithTimeout(promise, timeInMS = 2000) {\r\n const deferredPromise = new Deferred();\r\n setTimeout(() => deferredPromise.reject('timeout!'), timeInMS);\r\n promise.then(deferredPromise.resolve, deferredPromise.reject);\r\n return deferredPromise.promise;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Returns a querystring-formatted string (e.g. &arg=val&arg2=val2) from a\r\n * params object (e.g. {arg: 'val', arg2: 'val2'})\r\n * Note: You must prepend it with ? when adding it to a URL.\r\n */\r\nfunction querystring(querystringParams) {\r\n const params = [];\r\n for (const [key, value] of Object.entries(querystringParams)) {\r\n if (Array.isArray(value)) {\r\n value.forEach(arrayVal => {\r\n params.push(encodeURIComponent(key) + '=' + encodeURIComponent(arrayVal));\r\n });\r\n }\r\n else {\r\n params.push(encodeURIComponent(key) + '=' + encodeURIComponent(value));\r\n }\r\n }\r\n return params.length ? '&' + params.join('&') : '';\r\n}\r\n/**\r\n * Decodes a querystring (e.g. ?arg=val&arg2=val2) into a params object\r\n * (e.g. {arg: 'val', arg2: 'val2'})\r\n */\r\nfunction querystringDecode(querystring) {\r\n const obj = {};\r\n const tokens = querystring.replace(/^\\?/, '').split('&');\r\n tokens.forEach(token => {\r\n if (token) {\r\n const [key, value] = token.split('=');\r\n obj[decodeURIComponent(key)] = decodeURIComponent(value);\r\n }\r\n });\r\n return obj;\r\n}\r\n/**\r\n * Extract the query string part of a URL, including the leading question mark (if present).\r\n */\r\nfunction extractQuerystring(url) {\r\n const queryStart = url.indexOf('?');\r\n if (!queryStart) {\r\n return '';\r\n }\r\n const fragmentStart = url.indexOf('#', queryStart);\r\n return url.substring(queryStart, fragmentStart > 0 ? fragmentStart : undefined);\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * @fileoverview SHA-1 cryptographic hash.\r\n * Variable names follow the notation in FIPS PUB 180-3:\r\n * http://csrc.nist.gov/publications/fips/fips180-3/fips180-3_final.pdf.\r\n *\r\n * Usage:\r\n * var sha1 = new sha1();\r\n * sha1.update(bytes);\r\n * var hash = sha1.digest();\r\n *\r\n * Performance:\r\n * Chrome 23: ~400 Mbit/s\r\n * Firefox 16: ~250 Mbit/s\r\n *\r\n */\r\n/**\r\n * SHA-1 cryptographic hash constructor.\r\n *\r\n * The properties declared here are discussed in the above algorithm document.\r\n * @constructor\r\n * @final\r\n * @struct\r\n */\r\nclass Sha1 {\r\n constructor() {\r\n /**\r\n * Holds the previous values of accumulated variables a-e in the compress_\r\n * function.\r\n * @private\r\n */\r\n this.chain_ = [];\r\n /**\r\n * A buffer holding the partially computed hash result.\r\n * @private\r\n */\r\n this.buf_ = [];\r\n /**\r\n * An array of 80 bytes, each a part of the message to be hashed. Referred to\r\n * as the message schedule in the docs.\r\n * @private\r\n */\r\n this.W_ = [];\r\n /**\r\n * Contains data needed to pad messages less than 64 bytes.\r\n * @private\r\n */\r\n this.pad_ = [];\r\n /**\r\n * @private {number}\r\n */\r\n this.inbuf_ = 0;\r\n /**\r\n * @private {number}\r\n */\r\n this.total_ = 0;\r\n this.blockSize = 512 / 8;\r\n this.pad_[0] = 128;\r\n for (let i = 1; i < this.blockSize; ++i) {\r\n this.pad_[i] = 0;\r\n }\r\n this.reset();\r\n }\r\n reset() {\r\n this.chain_[0] = 0x67452301;\r\n this.chain_[1] = 0xefcdab89;\r\n this.chain_[2] = 0x98badcfe;\r\n this.chain_[3] = 0x10325476;\r\n this.chain_[4] = 0xc3d2e1f0;\r\n this.inbuf_ = 0;\r\n this.total_ = 0;\r\n }\r\n /**\r\n * Internal compress helper function.\r\n * @param buf Block to compress.\r\n * @param offset Offset of the block in the buffer.\r\n * @private\r\n */\r\n compress_(buf, offset) {\r\n if (!offset) {\r\n offset = 0;\r\n }\r\n const W = this.W_;\r\n // get 16 big endian words\r\n if (typeof buf === 'string') {\r\n for (let i = 0; i < 16; i++) {\r\n // TODO(user): [bug 8140122] Recent versions of Safari for Mac OS and iOS\r\n // have a bug that turns the post-increment ++ operator into pre-increment\r\n // during JIT compilation. We have code that depends heavily on SHA-1 for\r\n // correctness and which is affected by this bug, so I've removed all uses\r\n // of post-increment ++ in which the result value is used. We can revert\r\n // this change once the Safari bug\r\n // (https://bugs.webkit.org/show_bug.cgi?id=109036) has been fixed and\r\n // most clients have been updated.\r\n W[i] =\r\n (buf.charCodeAt(offset) << 24) |\r\n (buf.charCodeAt(offset + 1) << 16) |\r\n (buf.charCodeAt(offset + 2) << 8) |\r\n buf.charCodeAt(offset + 3);\r\n offset += 4;\r\n }\r\n }\r\n else {\r\n for (let i = 0; i < 16; i++) {\r\n W[i] =\r\n (buf[offset] << 24) |\r\n (buf[offset + 1] << 16) |\r\n (buf[offset + 2] << 8) |\r\n buf[offset + 3];\r\n offset += 4;\r\n }\r\n }\r\n // expand to 80 words\r\n for (let i = 16; i < 80; i++) {\r\n const t = W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16];\r\n W[i] = ((t << 1) | (t >>> 31)) & 0xffffffff;\r\n }\r\n let a = this.chain_[0];\r\n let b = this.chain_[1];\r\n let c = this.chain_[2];\r\n let d = this.chain_[3];\r\n let e = this.chain_[4];\r\n let f, k;\r\n // TODO(user): Try to unroll this loop to speed up the computation.\r\n for (let i = 0; i < 80; i++) {\r\n if (i < 40) {\r\n if (i < 20) {\r\n f = d ^ (b & (c ^ d));\r\n k = 0x5a827999;\r\n }\r\n else {\r\n f = b ^ c ^ d;\r\n k = 0x6ed9eba1;\r\n }\r\n }\r\n else {\r\n if (i < 60) {\r\n f = (b & c) | (d & (b | c));\r\n k = 0x8f1bbcdc;\r\n }\r\n else {\r\n f = b ^ c ^ d;\r\n k = 0xca62c1d6;\r\n }\r\n }\r\n const t = (((a << 5) | (a >>> 27)) + f + e + k + W[i]) & 0xffffffff;\r\n e = d;\r\n d = c;\r\n c = ((b << 30) | (b >>> 2)) & 0xffffffff;\r\n b = a;\r\n a = t;\r\n }\r\n this.chain_[0] = (this.chain_[0] + a) & 0xffffffff;\r\n this.chain_[1] = (this.chain_[1] + b) & 0xffffffff;\r\n this.chain_[2] = (this.chain_[2] + c) & 0xffffffff;\r\n this.chain_[3] = (this.chain_[3] + d) & 0xffffffff;\r\n this.chain_[4] = (this.chain_[4] + e) & 0xffffffff;\r\n }\r\n update(bytes, length) {\r\n // TODO(johnlenz): tighten the function signature and remove this check\r\n if (bytes == null) {\r\n return;\r\n }\r\n if (length === undefined) {\r\n length = bytes.length;\r\n }\r\n const lengthMinusBlock = length - this.blockSize;\r\n let n = 0;\r\n // Using local instead of member variables gives ~5% speedup on Firefox 16.\r\n const buf = this.buf_;\r\n let inbuf = this.inbuf_;\r\n // The outer while loop should execute at most twice.\r\n while (n < length) {\r\n // When we have no data in the block to top up, we can directly process the\r\n // input buffer (assuming it contains sufficient data). This gives ~25%\r\n // speedup on Chrome 23 and ~15% speedup on Firefox 16, but requires that\r\n // the data is provided in large chunks (or in multiples of 64 bytes).\r\n if (inbuf === 0) {\r\n while (n <= lengthMinusBlock) {\r\n this.compress_(bytes, n);\r\n n += this.blockSize;\r\n }\r\n }\r\n if (typeof bytes === 'string') {\r\n while (n < length) {\r\n buf[inbuf] = bytes.charCodeAt(n);\r\n ++inbuf;\r\n ++n;\r\n if (inbuf === this.blockSize) {\r\n this.compress_(buf);\r\n inbuf = 0;\r\n // Jump to the outer loop so we use the full-block optimization.\r\n break;\r\n }\r\n }\r\n }\r\n else {\r\n while (n < length) {\r\n buf[inbuf] = bytes[n];\r\n ++inbuf;\r\n ++n;\r\n if (inbuf === this.blockSize) {\r\n this.compress_(buf);\r\n inbuf = 0;\r\n // Jump to the outer loop so we use the full-block optimization.\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n this.inbuf_ = inbuf;\r\n this.total_ += length;\r\n }\r\n /** @override */\r\n digest() {\r\n const digest = [];\r\n let totalBits = this.total_ * 8;\r\n // Add pad 0x80 0x00*.\r\n if (this.inbuf_ < 56) {\r\n this.update(this.pad_, 56 - this.inbuf_);\r\n }\r\n else {\r\n this.update(this.pad_, this.blockSize - (this.inbuf_ - 56));\r\n }\r\n // Add # bits.\r\n for (let i = this.blockSize - 1; i >= 56; i--) {\r\n this.buf_[i] = totalBits & 255;\r\n totalBits /= 256; // Don't use bit-shifting here!\r\n }\r\n this.compress_(this.buf_);\r\n let n = 0;\r\n for (let i = 0; i < 5; i++) {\r\n for (let j = 24; j >= 0; j -= 8) {\r\n digest[n] = (this.chain_[i] >> j) & 255;\r\n ++n;\r\n }\r\n }\r\n return digest;\r\n }\r\n}\n\n/**\r\n * Helper to make a Subscribe function (just like Promise helps make a\r\n * Thenable).\r\n *\r\n * @param executor Function which can make calls to a single Observer\r\n * as a proxy.\r\n * @param onNoObservers Callback when count of Observers goes to zero.\r\n */\r\nfunction createSubscribe(executor, onNoObservers) {\r\n const proxy = new ObserverProxy(executor, onNoObservers);\r\n return proxy.subscribe.bind(proxy);\r\n}\r\n/**\r\n * Implement fan-out for any number of Observers attached via a subscribe\r\n * function.\r\n */\r\nclass ObserverProxy {\r\n /**\r\n * @param executor Function which can make calls to a single Observer\r\n * as a proxy.\r\n * @param onNoObservers Callback when count of Observers goes to zero.\r\n */\r\n constructor(executor, onNoObservers) {\r\n this.observers = [];\r\n this.unsubscribes = [];\r\n this.observerCount = 0;\r\n // Micro-task scheduling by calling task.then().\r\n this.task = Promise.resolve();\r\n this.finalized = false;\r\n this.onNoObservers = onNoObservers;\r\n // Call the executor asynchronously so subscribers that are called\r\n // synchronously after the creation of the subscribe function\r\n // can still receive the very first value generated in the executor.\r\n this.task\r\n .then(() => {\r\n executor(this);\r\n })\r\n .catch(e => {\r\n this.error(e);\r\n });\r\n }\r\n next(value) {\r\n this.forEachObserver((observer) => {\r\n observer.next(value);\r\n });\r\n }\r\n error(error) {\r\n this.forEachObserver((observer) => {\r\n observer.error(error);\r\n });\r\n this.close(error);\r\n }\r\n complete() {\r\n this.forEachObserver((observer) => {\r\n observer.complete();\r\n });\r\n this.close();\r\n }\r\n /**\r\n * Subscribe function that can be used to add an Observer to the fan-out list.\r\n *\r\n * - We require that no event is sent to a subscriber sychronously to their\r\n * call to subscribe().\r\n */\r\n subscribe(nextOrObserver, error, complete) {\r\n let observer;\r\n if (nextOrObserver === undefined &&\r\n error === undefined &&\r\n complete === undefined) {\r\n throw new Error('Missing Observer.');\r\n }\r\n // Assemble an Observer object when passed as callback functions.\r\n if (implementsAnyMethods(nextOrObserver, [\r\n 'next',\r\n 'error',\r\n 'complete'\r\n ])) {\r\n observer = nextOrObserver;\r\n }\r\n else {\r\n observer = {\r\n next: nextOrObserver,\r\n error,\r\n complete\r\n };\r\n }\r\n if (observer.next === undefined) {\r\n observer.next = noop;\r\n }\r\n if (observer.error === undefined) {\r\n observer.error = noop;\r\n }\r\n if (observer.complete === undefined) {\r\n observer.complete = noop;\r\n }\r\n const unsub = this.unsubscribeOne.bind(this, this.observers.length);\r\n // Attempt to subscribe to a terminated Observable - we\r\n // just respond to the Observer with the final error or complete\r\n // event.\r\n if (this.finalized) {\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\r\n this.task.then(() => {\r\n try {\r\n if (this.finalError) {\r\n observer.error(this.finalError);\r\n }\r\n else {\r\n observer.complete();\r\n }\r\n }\r\n catch (e) {\r\n // nothing\r\n }\r\n return;\r\n });\r\n }\r\n this.observers.push(observer);\r\n return unsub;\r\n }\r\n // Unsubscribe is synchronous - we guarantee that no events are sent to\r\n // any unsubscribed Observer.\r\n unsubscribeOne(i) {\r\n if (this.observers === undefined || this.observers[i] === undefined) {\r\n return;\r\n }\r\n delete this.observers[i];\r\n this.observerCount -= 1;\r\n if (this.observerCount === 0 && this.onNoObservers !== undefined) {\r\n this.onNoObservers(this);\r\n }\r\n }\r\n forEachObserver(fn) {\r\n if (this.finalized) {\r\n // Already closed by previous event....just eat the additional values.\r\n return;\r\n }\r\n // Since sendOne calls asynchronously - there is no chance that\r\n // this.observers will become undefined.\r\n for (let i = 0; i < this.observers.length; i++) {\r\n this.sendOne(i, fn);\r\n }\r\n }\r\n // Call the Observer via one of it's callback function. We are careful to\r\n // confirm that the observe has not been unsubscribed since this asynchronous\r\n // function had been queued.\r\n sendOne(i, fn) {\r\n // Execute the callback asynchronously\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\r\n this.task.then(() => {\r\n if (this.observers !== undefined && this.observers[i] !== undefined) {\r\n try {\r\n fn(this.observers[i]);\r\n }\r\n catch (e) {\r\n // Ignore exceptions raised in Observers or missing methods of an\r\n // Observer.\r\n // Log error to console. b/31404806\r\n if (typeof console !== 'undefined' && console.error) {\r\n console.error(e);\r\n }\r\n }\r\n }\r\n });\r\n }\r\n close(err) {\r\n if (this.finalized) {\r\n return;\r\n }\r\n this.finalized = true;\r\n if (err !== undefined) {\r\n this.finalError = err;\r\n }\r\n // Proxy is no longer needed - garbage collect references\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\r\n this.task.then(() => {\r\n this.observers = undefined;\r\n this.onNoObservers = undefined;\r\n });\r\n }\r\n}\r\n/** Turn synchronous function into one called asynchronously. */\r\n// eslint-disable-next-line @typescript-eslint/ban-types\r\nfunction async(fn, onError) {\r\n return (...args) => {\r\n Promise.resolve(true)\r\n .then(() => {\r\n fn(...args);\r\n })\r\n .catch((error) => {\r\n if (onError) {\r\n onError(error);\r\n }\r\n });\r\n };\r\n}\r\n/**\r\n * Return true if the object passed in implements any of the named methods.\r\n */\r\nfunction implementsAnyMethods(obj, methods) {\r\n if (typeof obj !== 'object' || obj === null) {\r\n return false;\r\n }\r\n for (const method of methods) {\r\n if (method in obj && typeof obj[method] === 'function') {\r\n return true;\r\n }\r\n }\r\n return false;\r\n}\r\nfunction noop() {\r\n // do nothing\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Check to make sure the appropriate number of arguments are provided for a public function.\r\n * Throws an error if it fails.\r\n *\r\n * @param fnName The function name\r\n * @param minCount The minimum number of arguments to allow for the function call\r\n * @param maxCount The maximum number of argument to allow for the function call\r\n * @param argCount The actual number of arguments provided.\r\n */\r\nconst validateArgCount = function (fnName, minCount, maxCount, argCount) {\r\n let argError;\r\n if (argCount < minCount) {\r\n argError = 'at least ' + minCount;\r\n }\r\n else if (argCount > maxCount) {\r\n argError = maxCount === 0 ? 'none' : 'no more than ' + maxCount;\r\n }\r\n if (argError) {\r\n const error = fnName +\r\n ' failed: Was called with ' +\r\n argCount +\r\n (argCount === 1 ? ' argument.' : ' arguments.') +\r\n ' Expects ' +\r\n argError +\r\n '.';\r\n throw new Error(error);\r\n }\r\n};\r\n/**\r\n * Generates a string to prefix an error message about failed argument validation\r\n *\r\n * @param fnName The function name\r\n * @param argName The name of the argument\r\n * @return The prefix to add to the error thrown for validation.\r\n */\r\nfunction errorPrefix(fnName, argName) {\r\n return `${fnName} failed: ${argName} argument `;\r\n}\r\n/**\r\n * @param fnName\r\n * @param argumentNumber\r\n * @param namespace\r\n * @param optional\r\n */\r\nfunction validateNamespace(fnName, namespace, optional) {\r\n if (optional && !namespace) {\r\n return;\r\n }\r\n if (typeof namespace !== 'string') {\r\n //TODO: I should do more validation here. We only allow certain chars in namespaces.\r\n throw new Error(errorPrefix(fnName, 'namespace') + 'must be a valid firebase namespace.');\r\n }\r\n}\r\nfunction validateCallback(fnName, argumentName, \r\n// eslint-disable-next-line @typescript-eslint/ban-types\r\ncallback, optional) {\r\n if (optional && !callback) {\r\n return;\r\n }\r\n if (typeof callback !== 'function') {\r\n throw new Error(errorPrefix(fnName, argumentName) + 'must be a valid function.');\r\n }\r\n}\r\nfunction validateContextObject(fnName, argumentName, context, optional) {\r\n if (optional && !context) {\r\n return;\r\n }\r\n if (typeof context !== 'object' || context === null) {\r\n throw new Error(errorPrefix(fnName, argumentName) + 'must be a valid context object.');\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n// Code originally came from goog.crypt.stringToUtf8ByteArray, but for some reason they\r\n// automatically replaced '\\r\\n' with '\\n', and they didn't handle surrogate pairs,\r\n// so it's been modified.\r\n// Note that not all Unicode characters appear as single characters in JavaScript strings.\r\n// fromCharCode returns the UTF-16 encoding of a character - so some Unicode characters\r\n// use 2 characters in Javascript. All 4-byte UTF-8 characters begin with a first\r\n// character in the range 0xD800 - 0xDBFF (the first character of a so-called surrogate\r\n// pair).\r\n// See http://www.ecma-international.org/ecma-262/5.1/#sec-15.1.3\r\n/**\r\n * @param {string} str\r\n * @return {Array}\r\n */\r\nconst stringToByteArray = function (str) {\r\n const out = [];\r\n let p = 0;\r\n for (let i = 0; i < str.length; i++) {\r\n let c = str.charCodeAt(i);\r\n // Is this the lead surrogate in a surrogate pair?\r\n if (c >= 0xd800 && c <= 0xdbff) {\r\n const high = c - 0xd800; // the high 10 bits.\r\n i++;\r\n assert(i < str.length, 'Surrogate pair missing trail surrogate.');\r\n const low = str.charCodeAt(i) - 0xdc00; // the low 10 bits.\r\n c = 0x10000 + (high << 10) + low;\r\n }\r\n if (c < 128) {\r\n out[p++] = c;\r\n }\r\n else if (c < 2048) {\r\n out[p++] = (c >> 6) | 192;\r\n out[p++] = (c & 63) | 128;\r\n }\r\n else if (c < 65536) {\r\n out[p++] = (c >> 12) | 224;\r\n out[p++] = ((c >> 6) & 63) | 128;\r\n out[p++] = (c & 63) | 128;\r\n }\r\n else {\r\n out[p++] = (c >> 18) | 240;\r\n out[p++] = ((c >> 12) & 63) | 128;\r\n out[p++] = ((c >> 6) & 63) | 128;\r\n out[p++] = (c & 63) | 128;\r\n }\r\n }\r\n return out;\r\n};\r\n/**\r\n * Calculate length without actually converting; useful for doing cheaper validation.\r\n * @param {string} str\r\n * @return {number}\r\n */\r\nconst stringLength = function (str) {\r\n let p = 0;\r\n for (let i = 0; i < str.length; i++) {\r\n const c = str.charCodeAt(i);\r\n if (c < 128) {\r\n p++;\r\n }\r\n else if (c < 2048) {\r\n p += 2;\r\n }\r\n else if (c >= 0xd800 && c <= 0xdbff) {\r\n // Lead surrogate of a surrogate pair. The pair together will take 4 bytes to represent.\r\n p += 4;\r\n i++; // skip trail surrogate.\r\n }\r\n else {\r\n p += 3;\r\n }\r\n }\r\n return p;\r\n};\n\n/**\r\n * @license\r\n * Copyright 2022 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Copied from https://stackoverflow.com/a/2117523\r\n * Generates a new uuid.\r\n * @public\r\n */\r\nconst uuidv4 = function () {\r\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, c => {\r\n const r = (Math.random() * 16) | 0, v = c === 'x' ? r : (r & 0x3) | 0x8;\r\n return v.toString(16);\r\n });\r\n};\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * The amount of milliseconds to exponentially increase.\r\n */\r\nconst DEFAULT_INTERVAL_MILLIS = 1000;\r\n/**\r\n * The factor to backoff by.\r\n * Should be a number greater than 1.\r\n */\r\nconst DEFAULT_BACKOFF_FACTOR = 2;\r\n/**\r\n * The maximum milliseconds to increase to.\r\n *\r\n * Visible for testing\r\n */\r\nconst MAX_VALUE_MILLIS = 4 * 60 * 60 * 1000; // Four hours, like iOS and Android.\r\n/**\r\n * The percentage of backoff time to randomize by.\r\n * See\r\n * http://go/safe-client-behavior#step-1-determine-the-appropriate-retry-interval-to-handle-spike-traffic\r\n * for context.\r\n *\r\n *
Visible for testing\r\n */\r\nconst RANDOM_FACTOR = 0.5;\r\n/**\r\n * Based on the backoff method from\r\n * https://github.com/google/closure-library/blob/master/closure/goog/math/exponentialbackoff.js.\r\n * Extracted here so we don't need to pass metadata and a stateful ExponentialBackoff object around.\r\n */\r\nfunction calculateBackoffMillis(backoffCount, intervalMillis = DEFAULT_INTERVAL_MILLIS, backoffFactor = DEFAULT_BACKOFF_FACTOR) {\r\n // Calculates an exponentially increasing value.\r\n // Deviation: calculates value from count and a constant interval, so we only need to save value\r\n // and count to restore state.\r\n const currBaseValue = intervalMillis * Math.pow(backoffFactor, backoffCount);\r\n // A random \"fuzz\" to avoid waves of retries.\r\n // Deviation: randomFactor is required.\r\n const randomWait = Math.round(\r\n // A fraction of the backoff value to add/subtract.\r\n // Deviation: changes multiplication order to improve readability.\r\n RANDOM_FACTOR *\r\n currBaseValue *\r\n // A random float (rounded to int by Math.round above) in the range [-1, 1]. Determines\r\n // if we add or subtract.\r\n (Math.random() - 0.5) *\r\n 2);\r\n // Limits backoff to max to avoid effectively permanent backoff.\r\n return Math.min(MAX_VALUE_MILLIS, currBaseValue + randomWait);\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Provide English ordinal letters after a number\r\n */\r\nfunction ordinal(i) {\r\n if (!Number.isFinite(i)) {\r\n return `${i}`;\r\n }\r\n return i + indicator(i);\r\n}\r\nfunction indicator(i) {\r\n i = Math.abs(i);\r\n const cent = i % 100;\r\n if (cent >= 10 && cent <= 20) {\r\n return 'th';\r\n }\r\n const dec = i % 10;\r\n if (dec === 1) {\r\n return 'st';\r\n }\r\n if (dec === 2) {\r\n return 'nd';\r\n }\r\n if (dec === 3) {\r\n return 'rd';\r\n }\r\n return 'th';\r\n}\n\n/**\r\n * @license\r\n * Copyright 2021 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction getModularInstance(service) {\r\n if (service && service._delegate) {\r\n return service._delegate;\r\n }\r\n else {\r\n return service;\r\n }\r\n}\n\nexport { CONSTANTS, Deferred, ErrorFactory, FirebaseError, MAX_VALUE_MILLIS, RANDOM_FACTOR, Sha1, areCookiesEnabled, assert, assertionError, async, base64, base64Decode, base64Encode, base64urlEncodeWithoutPadding, calculateBackoffMillis, contains, createMockUserToken, createSubscribe, decode, deepCopy, deepEqual, deepExtend, errorPrefix, extractQuerystring, getDefaultAppConfig, getDefaultEmulatorHost, getDefaultEmulatorHostnameAndPort, getDefaults, getExperimentalSetting, getGlobal, getModularInstance, getUA, isAdmin, isBrowser, isBrowserExtension, isElectron, isEmpty, isIE, isIndexedDBAvailable, isMobileCordova, isNode, isNodeSdk, isReactNative, isSafari, isUWP, isValidFormat, isValidTimestamp, issuedAtTime, jsonEval, map, ordinal, promiseWithTimeout, querystring, querystringDecode, safeGet, stringLength, stringToByteArray, stringify, uuidv4, validateArgCount, validateCallback, validateContextObject, validateIndexedDBOpenable, validateNamespace };\n//# sourceMappingURL=index.esm2017.js.map\n","import { PACKAGE_VERSION } from './version.js';\n\n// Name of this application, used in the User-Agent.\nexport const APP_NAME = 'TinodeWeb/' + (PACKAGE_VERSION || '0.21');\n\n// API key. Use https://github.com/tinode/chat/tree/master/keygen to generate your own\nexport const API_KEY = 'AQEAAAABAAD_rAp4DJh05a1HAwFT3A6K';\n\n// The array of possible hosts to connect to.\nexport const KNOWN_HOSTS = {hosted: 'web.tinode.co', local: 'localhost:6060'};\n\n// Default host name and port to connect to.\nexport const DEFAULT_HOST = KNOWN_HOSTS.hosted;\n\n// Enable console logging.\nexport const LOGGING_ENABLED = true;\n\n// Minimum time between two keypress notifications, milliseconds.\nexport const KEYPRESS_DELAY = 3_000;\n// Delay before sending a read notification, milliseconds.\nexport const READ_DELAY = 1_500;\n\n// The default shortest allowed tag length. Matches the value on the server.\nexport const MIN_TAG_LENGTH = 2;\n// The default greatest allowed tag length. Matches the value on the server.\nexport const MAX_TAG_LENGTH = 96;\n// The default maximum number of tags allowed. Matches the value on the server.\nexport const MAX_TAG_COUNT = 16;\n\n// Access mode for P2P subscriptions initiated by the current user.\nexport const DEFAULT_P2P_ACCESS_MODE = 'JRWPS';\n// Access mode for new group topics created by the current user.\nexport const NEW_GRP_ACCESS_MODE = 'JRWPSAO';\n// Access mode for a channel.\nexport const CHANNEL_ACCESS_MODE = 'JR';\n\n// Access mode for no access.\nexport const NO_ACCESS_MODE = 'N';\n\n// Mediaquery breakpoint between desktop and mobile, in px. Should match the value\n// in @media (max-size: 640px) in base.css\nexport const MEDIA_BREAKPOINT = 640;\n// Size of css 'rem' unit in pixels. Default 1rem = 10pt = 13px.\nexport const REM_SIZE = 13;\n\n// Size of the avatar image: when image dimensions are greater or the image is not square, it's resized to\n// a square of this size or less.\nexport const AVATAR_SIZE = 384;\n\n// Maximum size of an avatar in bytes for sending in-band. Bigger avatars will be sent out of band (as uploads).\nexport const MAX_AVATAR_BYTES = 4096;\n\n// Size of the broken_image shown in MessagesView\nexport const BROKEN_IMAGE_SIZE = 32;\n\n// Size of video preview when dimensions are missing.\nexport const NO_DIMENSIONS_VIDEO = 128;\n\n// Number of chat messages to fetch in one call.\nexport const MESSAGES_PAGE = 24;\n\n// Default maximum in-band (included directly into the message) attachment size which fits into\n// a message of 256K in size. Used when the server-provided value is unavailable. The actual\n// binary size of the attachment should be smaller due to base64 encoding expansion and some overhead,\n// for instance 1024 bytes.\n// Increase this limit to a greater value in production, if desired. Also increase\n// max_message_size in the server config.\nexport const MAX_INBAND_ATTACHMENT_SIZE = 262_144;\n\n// Default absolute maximum attachment size to be used with the server = 8MB.\n// Used when the server-provided value is unavailable. Increase to something like 100MB in production.\nexport const MAX_EXTERN_ATTACHMENT_SIZE = 1 << 23;\n\n// Maximum allowed linear dimension (pixels) of an image sent inline. Larger images will be shrunk\n// to make the larger dimension fit under this size. You may want to adjust it to 1600 or\n// 2400 for production.\nexport const MAX_IMAGE_DIM = 1024;\n\n// Linear dimensions of image preview: shrink image under this size for previews.\nexport const IMAGE_PREVIEW_DIM = 64;\n\n// Linear dimensions of video screencapture: shrink image under this size for previews.\nexport const VIDEO_PREVIEW_DIM = 96;\n\n// Linear dimensions of image thumbnail: shrink image under this size for thumbnails in reply quote previews.\nexport const IMAGE_THUMBNAIL_DIM = 36;\n// Width of video thumbnail: allow it to be wider, but not taller. Use IMAGE_THUMBNAIL_DIM for height.\nexport const VIDEO_THUMBNAIL_WIDTH = 48;\n\n// Maximum number of online users to be shown in a topic title bar. Others will be\n// hidden under \"+X more\"\nexport const MAX_ONLINE_IN_TOPIC = 4;\n\n// Maximum length of user name, topic title, and private comment.\nexport const MAX_TITLE_LENGTH = 60;\n// Maximum length of topic description.\nexport const MAX_TOPIC_DESCRIPTION_LENGTH = 360;\n// Maximum length of user name when displaying a video call.\nexport const MAX_PEER_TITLE_LENGTH = 20;\n\n// Length of message previews in chat list, in characters.\nexport const MESSAGE_PREVIEW_LENGTH = 80;\n\n// Length of a quote in quoted reply (for outgoing messages).\nexport const QUOTED_REPLY_LENGTH = 30;\n// Length of a preview of a forwarded message.\nexport const FORWARDED_PREVIEW_LENGTH = 84;\n// Length of preview for a message being edited.\nexport const EDIT_PREVIEW_LENGTH = 48;\n\n// Minimum duration of an audio recording in milliseconds (2 sec).\nexport const MIN_DURATION = 2_000;\n// Maximum duration of an audio recording in milliseconds (10 min).\nexport const MAX_DURATION = 600_000;\n\n// Link for \"Contact Us\".\nexport const LINK_CONTACT_US = 'mailto:support@tinode.co';\n\n// Link to Privacy Policy.\nexport const LINK_PRIVACY_POLICY = 'https://tinode.co/privacy.html';\n\n// Link to Terms of Service.\nexport const LINK_TERMS_OF_SERVICE = 'https://tinode.co/terms.html';\n\n","// Video call states.\nexport const CALL_STATE_NONE = 0;\nexport const CALL_STATE_OUTGOING_INITATED = 1;\nexport const CALL_STATE_INCOMING_RECEIVED = 2;\nexport const CALL_STATE_IN_PROGRESS = 3;\n\n// Video call message headers representing call state.\nexport const CALL_HEAD_STARTED = 'started';\n","// File and image helper functions.\n\n// Supported image MIME types and corresponding file extensions.\nexport const SUPPORTED_IMAGE_FORMATS = ['image/jpeg', 'image/gif', 'image/png', 'image/svg', 'image/svg+xml'];\nexport const MIME_EXTENSIONS = ['jpg', 'gif', 'png', 'svg', 'svg'];\n\n// Get an URL from a theCard photo: either create a data: URL or return reference URL.\nexport function makeImageUrl(photo) {\n if (photo && typeof photo == 'object') {\n if (photo.ref) {\n return photo.ref\n }\n if (photo.data && photo.type) {\n const mime = photo.type.startsWith('image/') ? photo.type : ('image/' + photo.type);\n return 'data:' + mime + ';base64,' + photo.data;\n }\n }\n return null;\n}\n\n// Calculate linear dimensions for scaling image down to fit under a certain size.\n// Returns an object which contains destination sizes, source sizes, and offsets\n// into source (when making square images).\nexport function fitImageSize(width, height, maxWidth, maxHeight, forceSquare) {\n // Sanitize input\n width = width | 0;\n height = height | 0;\n maxWidth = maxWidth | 0;\n maxHeight = maxHeight | 0;\n\n if (width <= 0 || height <= 0 || maxWidth <= 0 || maxHeight <= 0) {\n return null;\n }\n\n if (forceSquare) {\n maxWidth = maxHeight = Math.min(maxWidth, maxHeight);\n }\n\n const scale = Math.min(\n Math.min(width, maxWidth) / width,\n Math.min(height, maxHeight) / height\n );\n\n const size = {\n dstWidth: (width * scale) | 0,\n dstHeight: (height * scale) | 0,\n };\n\n if (forceSquare) {\n // Also calculate parameters for making the image square.\n size.dstWidth = size.dstHeight = Math.min(size.dstWidth, size.dstHeight);\n size.srcWidth = size.srcHeight = Math.min(width, height);\n size.xoffset = ((width - size.srcWidth) / 2) | 0;\n size.yoffset = ((height - size.srcWidth) / 2) | 0;\n } else {\n size.xoffset = size.yoffset = 0;\n size.srcWidth = width;\n size.srcHeight = height;\n }\n return size;\n}\n\n// Ensure file's extension matches mime content type\nexport function fileNameForMime(fname, mime) {\n const idx = SUPPORTED_IMAGE_FORMATS.indexOf(mime);\n if (idx < 0 || !fname) {\n // Unknown mime or empty name.\n return fname;\n }\n const ext = MIME_EXTENSIONS[idx];\n\n const at = fname.lastIndexOf('.');\n if (at >= 0) {\n fname = fname.substring(0, at);\n }\n return fname + '.' + ext;\n}\n\n// Scale uploaded image to fit under certain dimensions and byte size, optionally constraining to a square.\n// Returns a promise which is resolven on success or rejected on failure.\nexport function imageScaled(fileOrBlob, maxWidth, maxHeight, maxSize, forceSquare) {\n return new Promise((resolve, reject) => {\n const img = new Image();\n img.crossOrigin = 'Anonymous';\n img.onerror = function(err) {\n reject(new Error(\"Image format unrecognized\"));\n }\n img.onload = async function() {\n // Once the image is loaded, the URL is no longer needed.\n URL.revokeObjectURL(img.src);\n\n // Calculate the desired image dimensions.\n const dim = fitImageSize(img.width, img.height, maxWidth, maxHeight, forceSquare);\n if (!dim) {\n reject(new Error(\"Invalid image\"));\n return;\n }\n let canvas = document.createElement('canvas');\n canvas.width = dim.dstWidth;\n canvas.height = dim.dstHeight;\n let ctx = canvas.getContext('2d');\n ctx.imageSmoothingEnabled = true;\n ctx.drawImage(img, dim.xoffset, dim.yoffset, dim.srcWidth, dim.srcHeight,\n 0, 0, dim.dstWidth, dim.dstHeight);\n\n const mime = SUPPORTED_IMAGE_FORMATS.includes(fileOrBlob.type) ? fileOrBlob.type : 'image/jpeg';\n // Generate blob to check size of the image.\n let blob = await new Promise(resolve => canvas.toBlob(resolve, mime));\n if (!blob) {\n reject(new Error(\"Unsupported image format\"));\n return;\n }\n // Ensure the image is not too large. Shrink the image keeping the aspect ratio.\n // Do nothing if maxsize is <= 0.\n while (maxSize > 0 && blob.length > maxSize) {\n dim.dstWidth = (dim.dstWidth * 0.70710678118) | 0;\n dim.dstHeight = (dim.dstHeight * 0.70710678118) | 0;\n canvas.width = dim.dstWidth;\n canvas.height = dim.dstHeight;\n ctx = canvas.getContext('2d');\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n ctx.drawImage(img, dim.xoffset, dim.yoffset, dim.srcWidth, dim.srcHeight,\n 0, 0, dim.dstWidth, dim.dstHeight);\n blob = await new Promise(resolve => canvas.toBlob(resolve, mime));\n }\n\n canvas = null;\n resolve({mime: mime, blob: blob, width: dim.dstWidth, height: dim.dstHeight, name: fileNameForMime(fileOrBlob.name, mime)});\n };\n img.src = URL.createObjectURL(fileOrBlob);\n });\n}\n\n// Scale and crop image according to specified dimensions.\n// The coordinates are in unscaled image pixels, i.e. cut the rectangle first then scale it.\n// returns a promise.\nexport function imageCrop(mime, objURL, left, top, width, height, scale) {\n return new Promise((resolve, reject) => {\n const img = new Image();\n img.crossOrigin = 'Anonymous';\n img.onerror = _ => {\n reject(new Error(\"Image format unrecognized\"));\n };\n img.onload = _ => {\n // Once the image is loaded, the URL is no longer needed.\n URL.revokeObjectURL(img.src);\n\n let canvas = document.createElement('canvas');\n canvas.width = width * scale;\n canvas.height = height * scale;\n let ctx = canvas.getContext('2d');\n ctx.imageSmoothingEnabled = true;\n ctx.drawImage(img, left, top, width, height, 0, 0, canvas.width, canvas.height);\n\n mime = SUPPORTED_IMAGE_FORMATS.includes(mime) ? mime : 'image/jpeg';\n // Generate blob to check size of the image.\n canvas.toBlob((blob) => {\n // Allow GC.\n canvas = null;\n if (blob) {\n resolve({mime: mime, blob: blob, width: width, height: height});\n } else {\n reject(new Error(\"Unsupported image format\"));\n }\n }, mime);\n };\n img.src = objURL;\n });\n}\n\n// Convert file to base64 string.\nexport function fileToBase64(file) {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onerror = _ => {\n reject(reader.error);\n };\n reader.onload = _ => {\n resolve({mime: file.type, bits: reader.result.split(',')[1], name: file.name});\n };\n reader.readAsDataURL(file);\n });\n}\n\n// Convert Blob to base64 string. Returns a promise resolved with the base64 string and mime.\nexport function blobToBase64(blob) {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onerror = _ => {\n reject(reader.error);\n };\n reader.onload = _ => {\n resolve({mime: blob.type, bits: reader.result.split(',')[1]});\n };\n reader.readAsDataURL(blob);\n });\n}\n\n// File pasted from the clipboard. It's either an inline image or a file attachment.\nexport function filePasted(event, onImageSuccess, onAttachmentSuccess, onError) {\n const items = (event.clipboardData || event.originalEvent.clipboardData || {}).items;\n if (!items || !items.length) {\n return false;\n }\n\n for (let i in items) {\n const item = items[i];\n if (item.kind === 'file') {\n const file = item.getAsFile();\n if (!file) {\n console.error(\"Failed to get file object from pasted file item\", item.kind, item.type);\n onError(\"Failed to get file object from pasted file item\");\n continue;\n }\n if (file.type && file.type.split('/')[0] == 'image') {\n onImageSuccess(file);\n } else {\n onAttachmentSuccess(file);\n }\n // Indicate that the pasted data contains a file.\n return true;\n }\n }\n // No file found.\n return false;\n}\n\n// Get mime type from data URL header.\nexport function getMimeType(header) {\n var mime = /^data:(image\\/[-+a-z0-9.]+);base64/.exec(header);\n return (mime && mime.length > 1) ? mime[1] : null;\n}\n\n// Given length of a binary object in bytes, calculate the length after\n// base64 encoding.\nexport function base64EncodedLen(n) {\n return Math.floor((n + 2) / 3) * 4;\n}\n\n// Given length of a base64-encoded object, calculate decoded size of the\n// pbject in bytes.\nexport function base64DecodedLen(n) {\n return Math.floor(n / 4) * 3;\n}\n\n// Re-encode string to standard base64 encoding with padding.\n// The string may be base64-URL encoded without the padding.\nexport function base64ReEncode(str) {\n if (str) {\n str = str.replace(/-/g, '+').replace(/_/g, '/');\n try {\n str = btoa(atob(str));\n } catch(err) {\n console.error(\"Failed to base64 re-encode string.\", err);\n str = null;\n }\n }\n return str;\n}\n\n// Convert a base64 encoded string with the provided mime type into a Blob.\nexport function base64ToBlob(str, mime) {\n if (!str) {\n return null;\n }\n\n try {\n // Make blob.\n const bin = atob(str);\n const length = bin.length;\n const buf = new ArrayBuffer(length);\n const arr = new Uint8Array(buf);\n for (let i = 0; i < length; i++) {\n arr[i] = bin.charCodeAt(i);\n }\n\n return new Blob([buf], { type: mime });\n } catch(err) {\n console.error(\"Failed to convert base64 to blob: \", err);\n }\n\n return null;\n}\n\nexport function intArrayToBase64(arr) {\n if (!Array.isArray(arr)) {\n return null;\n }\n try {\n let bin = '';\n new Uint8Array(arr).forEach(b => bin += String.fromCharCode(b));\n return window.btoa(bin);\n } catch (err) {}\n return null;\n}\n\nexport function base64ToIntArray(b64) {\n const arr = [];\n try {\n const bin = window.atob(b64);\n [...bin].forEach(c => {\n arr.push(c.charCodeAt(0));\n });\n return arr;\n } catch (err) {}\n return null;\n}\n","import React from 'react';\nimport { defineMessages } from 'react-intl';\n\nimport { Drafty } from 'tinode-sdk';\n\nimport AudioPlayer from '../widgets/audio-player.jsx'\nimport CallMessage from '../widgets/call-message.jsx'\nimport CallStatus from '../widgets/call-status.jsx';\nimport InlineVideo from '../widgets/inline-video.jsx';\nimport LazyImage from '../widgets/lazy-image.jsx'\nimport UploadingImage from '../widgets/uploading-image.jsx'\n\nimport { BROKEN_IMAGE_SIZE, IMAGE_THUMBNAIL_DIM, NO_DIMENSIONS_VIDEO, REM_SIZE, VIDEO_THUMBNAIL_WIDTH } from '../config.js';\nimport { base64ToBlob, blobToBase64, fitImageSize, imageScaled } from './blob-helpers.js';\nimport { idToColorClass, secondsToTime, shortenFileName } from './strformat.js';\nimport { cancelablePromise, sanitizeUrlForMime } from './utils.js';\n\nconst messages = defineMessages({\n drafty_form: {\n id: 'drafty_form',\n defaultMessage: 'Form: ',\n description: 'Comment for form in Drafty'\n },\n drafty_attachment: {\n id: 'drafty_attachment',\n defaultMessage: 'Attachment',\n description: 'Comment for attachment in Drafty'\n },\n drafty_image: {\n id: 'drafty_image',\n defaultMessage: 'Picture',\n description: 'Comment for embedded images in Drafty'\n },\n drafty_video: {\n id: 'drafty_video',\n defaultMessage: 'Video recording',\n description: 'Comment for videos embedded in Drafty'\n },\n drafty_unknown: {\n id: 'drafty_unknown',\n defaultMessage: 'Unsupported',\n description: 'Unsupported entity in drafty'\n }\n});\n\n// The main Drafty formatter: converts Drafty elements into React classes. 'this' is set by the caller.\n// 'this' must contain:\n// viewportWidth:\n// authorizeURL:\n// onImagePreview:\n// onVideoPreview:\n// onFormButtonClick:\n// onQuoteClick:\nexport function fullFormatter(style, data, values, key, stack) {\n if (stack.includes('QQ')) {\n return quoteFormatter.call(this, style, data, values, key);\n }\n\n if (!style) {\n // Unformatted.\n return values;\n }\n\n let el = Drafty.tagName(style);\n let attr = Drafty.attrValue(style, data) || {};\n attr.key = key;\n switch (style) {\n case 'AU':\n // Show audio player.\n if (attr.src) {\n attr.src = this.authorizeURL(sanitizeUrlForMime(attr.src, 'audio'));\n attr.duration = data.duration > 0 ? (data.duration | 0) : undefined;\n attr.preview = data.preview;\n attr.loading = 'lazy';\n }\n el = AudioPlayer;\n // Audio element cannot have content.\n values = null;\n break;\n case 'BR':\n values = null;\n break;\n case 'EX':\n // Ignore.\n break;\n case 'HL':\n // Highlighted text. Assign class name.\n attr.className = 'highlight';\n break;\n case 'HD':\n el = null;\n values = null;\n break;\n case 'IM':\n // Additional processing for images\n el = handleImageData.call(this, el, data, attr);\n // Image element cannot have content.\n values = null;\n break;\n case 'BN':\n // Button\n attr.onClick = this.onFormButtonClick;\n let inner = React.Children.map(values, (child) => {\n return typeof child == 'string' ? child : undefined;\n });\n if (!inner || inner.length == 0) {\n inner = [attr.name]\n }\n // Get text which will be sent back when the button is clicked.\n attr['data-title'] = inner.join('');\n break;\n case 'MN':\n // Mention\n attr.className = 'mention'\n if (data) {\n attr.className += ' ' + idToColorClass(data.val, false, true);\n }\n break;\n case 'FM':\n // Form\n attr.className = 'bot-form';\n break;\n case 'RW':\n // Form element formatting is dependent on element content.\n break;\n case 'QQ':\n // Quote/citation.\n attr.className = 'reply-quote'\n attr.onClick = this.onQuoteClick;\n break;\n case 'VC':\n el = CallMessage;\n // Video call messages do not have content.\n values = null;\n if (data) {\n attr.callState = data.state;\n attr.incoming = data.incoming;\n attr.duration = data.duration;\n }\n break;\n case 'VD':\n // Additional processing for videos.\n el = handleVideoData.call(this, el, data, attr);\n // Video element cannot have content.\n values = null;\n break;\n default:\n if (!el) {\n // Unknown element.\n el = React.Fragment;\n attr = {key: key};\n // Generate comment for unknown element.\n let body = values;\n if (!Array.isArray(values) || !values.join('').trim()) {\n body = [{this.formatMessage(messages.drafty_unknown)} ];\n }\n values = [extension , ' '].concat(body);\n }\n break;\n }\n if (!el) {\n return values;\n }\n return React.createElement(el, attr, values);\n}\n\n// Additional processing of image data.\nfunction handleImageData(el, data, attr) {\n if (!data) {\n attr.src = 'img/broken_image.png';\n attr.style = {\n width: IMAGE_THUMBNAIL_DIM + 'px',\n height: IMAGE_THUMBNAIL_DIM + 'px',\n };\n return el;\n }\n\n attr.className = 'inline-image';\n const dim = fitImageSize(data.width, data.height,\n this.viewportWidth > 0 ? Math.min(this.viewportWidth - REM_SIZE * 6.5, REM_SIZE * 34.5) :\n REM_SIZE * 34.5, REM_SIZE * 24, false) ||\n {dstWidth: BROKEN_IMAGE_SIZE, dstHeight: BROKEN_IMAGE_SIZE};\n attr.style = {\n width: dim.dstWidth + 'px',\n height: dim.dstHeight + 'px',\n // Looks like a Chrome bug: broken image does not respect 'width' and 'height'.\n minWidth: dim.dstWidth + 'px',\n minHeight: dim.dstHeight + 'px'\n };\n if (!Drafty.isProcessing(data)) {\n attr.src = this.authorizeURL(sanitizeUrlForMime(attr.src, 'image'));\n attr.alt = data.name;\n if (attr.src) {\n if (Math.max(data.width || 0, data.height || 0) > IMAGE_THUMBNAIL_DIM) {\n // Allow previews for large enough images.\n attr.onClick = this.onImagePreview;\n attr.className += ' image-clickable';\n }\n attr.loading = 'lazy';\n } else {\n attr.src = null;\n }\n } else {\n // Use custom element instead of .\n el = UploadingImage;\n }\n\n return el;\n}\n\n// Additional processing of image data.\nfunction handleVideoData(el, data, attr) {\n if (!data) {\n attr.src = 'img/broken_video.png';\n attr.style = {\n width: IMAGE_THUMBNAIL_DIM + 'px',\n height: IMAGE_THUMBNAIL_DIM + 'px',\n };\n return el;\n }\n attr.className = 'inline-image';\n const dim = fitImageSize(data.width, data.height,\n this.viewportWidth > 0 ? Math.min(this.viewportWidth - REM_SIZE * 6.5, REM_SIZE * 34.5) :\n REM_SIZE * 34.5, REM_SIZE * 24, false) ||\n {dstWidth: NO_DIMENSIONS_VIDEO, dstHeight: NO_DIMENSIONS_VIDEO};\n attr.style = {\n width: dim.dstWidth + 'px',\n height: dim.dstHeight + 'px',\n // Looks like a Chrome bug: broken image does not respect 'width' and 'height'.\n minWidth: dim.dstWidth + 'px',\n minHeight: dim.dstHeight + 'px'\n };\n if (!Drafty.isProcessing(data)) {\n attr.src = this.authorizeURL(sanitizeUrlForMime(attr.src, 'image'));\n attr.alt = data.name;\n if (data.ref || data.val) {\n attr.onClick = this.onVideoPreview;\n attr.loading = 'lazy';\n } else {\n attr.src = null;\n }\n el = InlineVideo;\n } else {\n // Use custom element instead of .\n el = UploadingImage;\n }\n\n return el;\n}\n\n// Converts Drafty object into a one-line preview. 'this' is set by the caller.\n// 'this' must contain:\n// formatMessage: this.props.intl.formatMessage\n// messages: formatjs messages defined with defineMessages.\nexport function previewFormatter(style, data, values, key) {\n if (!style) {\n // Unformatted.\n return values;\n }\n\n let el = Drafty.tagName(style);\n const attr = { key: key };\n switch (style) {\n case 'AU':\n // Voicemail as '[mic] 0:00'.\n el = React.Fragment;\n values = [mic , ' ', secondsToTime(data.duration/1000)];\n break;\n case 'BR':\n // Replace new line with a space.\n el = React.Fragment;\n values = [' '];\n break;\n case 'HL':\n // Make highlight less prominent in preview.\n attr.className = 'highlight preview';\n break;\n case 'LN':\n case 'MN':\n // Disable links in previews.\n el = 'span';\n break;\n case 'IM':\n // Replace image with '[icon] Image'.\n el = React.Fragment;\n values = [photo , ' ', this.formatMessage(messages.drafty_image)];\n break;\n case 'BN':\n el = 'span';\n attr.className = 'flat-button faux';\n break;\n case 'FM':\n el = React.Fragment;\n values = [dashboard ,\n this.formatMessage(messages.drafty_form)].concat(' ', values || []);\n break;\n case 'RW':\n el = React.Fragment;\n break;\n case 'EX':\n if (data) {\n if (data.mime == 'application/json') {\n // Ignore JSON attachments: they are form response payloads.\n return null;\n }\n // Clear payload.\n delete data.val;\n delete data.ref;\n }\n el = React.Fragment;\n values = [attachment , ' ', this.formatMessage(messages.drafty_attachment)];\n break;\n case 'VC':\n el = CallStatus;\n if (data) {\n attr.callState = data.state;\n attr.incoming = data.incoming;\n attr.duration = data.duration;\n }\n values = null;\n break;\n case 'QQ':\n case 'HD':\n el = null;\n values = null;\n break;\n case 'VD':\n // Replace image with '[icon] Video'.\n el = React.Fragment;\n values = [play_circle_outline , ' ', this.formatMessage(messages.drafty_video)];\n break;\n default:\n if (!el) {\n // Unknown element.\n el = React.Fragment;\n values = [extension , ' ', this.formatMessage(messages.drafty_unknown)];\n }\n break;\n }\n if (!el) {\n return values;\n }\n return React.createElement(el, attr, values);\n};\n\n// Converts Drafty object into a quoted reply; 'this' is set by the caller.\nfunction inlineImageAttr(attr, data) {\n attr.style = {\n width: IMAGE_THUMBNAIL_DIM + 'px',\n height: IMAGE_THUMBNAIL_DIM + 'px',\n maxWidth: IMAGE_THUMBNAIL_DIM + 'px',\n maxHeight: IMAGE_THUMBNAIL_DIM + 'px',\n }\n attr.className = 'inline-image';\n attr.alt = this.formatMessage(messages.drafty_image);\n if (!data) {\n attr.src = 'img/broken_image.png';\n } else {\n attr.src = attr.src || 'img/broken_image.png';\n }\n attr.title = attr.alt;\n return attr;\n}\n\n// Converts Drafty object into a quoted reply; 'this' is set by the caller.\nfunction inlineVideoAttr(attr, data) {\n const dim = fitImageSize(data.width, data.height, VIDEO_THUMBNAIL_WIDTH, IMAGE_THUMBNAIL_DIM);\n attr.style = {\n width: dim.width + 'px',\n height: dim.height + 'px',\n maxWidth: VIDEO_THUMBNAIL_WIDTH + 'px',\n maxHeight: IMAGE_THUMBNAIL_DIM + 'px',\n }\n attr.className = 'inline-image';\n attr.alt = this.formatMessage(messages.drafty_video);\n attr.title = attr.alt;\n if (!data) {\n attr.src = 'img/broken_video.png';\n } else {\n attr.src = attr.src || 'img/broken_video.png';\n }\n return attr;\n}\n\n// Displays a portion of Drafty within 'QQ' quotes. 'this' is set by the caller.\n// 'this' must contain:\n// formatMessage: this.props.intl.formatMessage\n// messages: formatjs messages defined with defineMessages.\n// authorizeURL: this.props.tinode.authorizeURL\n// onQuoteClick: this.handleQuoteClick (optional)\nfunction quoteFormatter(style, data, values, key) {\n if (['BR', 'EX', 'IM', 'MN', 'VD'].includes(style)) {\n let el = Drafty.tagName(style);\n let attr = Drafty.attrValue(style, data) || {};\n attr.key = key;\n switch(style) {\n case 'BR':\n values = null;\n break;\n case 'IM':\n attr = inlineImageAttr.call(this, attr, data);\n values = [React.createElement('img', attr, null), ' ', attr.alt];\n el = React.Fragment;\n // Fragment attributes.\n attr = {key: key};\n break;\n case 'VD':\n attr = inlineVideoAttr.call(this, attr, data);\n values = [React.createElement('img', attr, null), ' ', attr.alt];\n el = React.Fragment;\n // Fragment attributes.\n attr = {key: key};\n break;\n case 'MN':\n el = 'span';\n attr.className = 'mention'\n if (data) {\n attr.className += ' ' + idToColorClass(data.val, false, true);\n }\n break;\n case 'EX':\n let fname;\n if (data) {\n if (data.mime == 'application/json') {\n // Ignore JSON attachments: they are form response payloads.\n return null;\n }\n fname = data.name;\n // Clear payload.\n delete data.val;\n delete data.ref;\n }\n el = React.Fragment;\n values = [attachment ,\n shortenFileName(fname, 16) || this.formatMessage(messages.drafty_attachment)];\n break;\n }\n return React.createElement(el, attr, values);\n }\n return previewFormatter.call(this, style, data, values, key);\n}\n\n// Create image thumbnail suitable for inclusion in a quote.\nfunction quoteImageOrVideo(data, isVideo) {\n let promise;\n let bits, ref, mime;\n if (isVideo) {\n bits = data.preview;\n mime = data.premime || 'image/jpeg';\n ref = data.preref;\n } else {\n bits = data.val;\n mime = data.mime;\n ref = data.ref;\n }\n // Get the blob from the image data.\n if (bits) {\n const blob = base64ToBlob(bits, mime);\n if (!blob) {\n throw new Error(\"Invalid image\");\n }\n promise = Promise.resolve(blob);\n } else if (ref) {\n promise = fetch(this.authorizeURL(sanitizeUrlForMime(ref, 'image')))\n .then(evt => {\n if (evt.ok) {\n return evt.blob();\n } else {\n throw new Error(`Image fetch unsuccessful: ${evt.status} ${evt.statusText}`);\n }\n });\n } else {\n throw new Error(\"Missing image data\");\n }\n\n // Scale the blob.\n return promise\n .then(blob => {\n // If it's an image, cut the square from the center of the image and shrink it.\n // If it's a video, allow it to be rectantular.\n return imageScaled(blob, isVideo ? VIDEO_THUMBNAIL_WIDTH : IMAGE_THUMBNAIL_DIM, IMAGE_THUMBNAIL_DIM, -1, !isVideo)\n }).then(scaled => {\n if (isVideo) {\n data.premime = scaled.mime;\n } else {\n data.mime = scaled.mime;\n }\n data.size = scaled.blob.size;\n data.width = scaled.width;\n data.height = scaled.height;\n delete data.ref;\n delete data.preref;\n // Keeping the original file name, if provided: ex.data.name;\n\n data.src = URL.createObjectURL(scaled.blob);\n return blobToBase64(scaled.blob);\n }).then(b64 => {\n if (isVideo) {\n data.preview = b64.bits;\n } else {\n data.val = b64.bits;\n }\n return data;\n }).catch(err => {\n delete data.val;\n delete data.preview;\n delete data.src;\n data.width = IMAGE_THUMBNAIL_DIM;\n data.height = IMAGE_THUMBNAIL_DIM;\n // Rethrow.\n throw err;\n });\n}\n\n// Create a preview of a reply.\nexport function replyFormatter(style, data, values, key, stack) {\n if (style == 'IM' || style == 'VD') {\n const isImage = style == 'IM';\n const attr = isImage ? inlineImageAttr.call(this, {key: key}, data) :\n inlineVideoAttr.call(this, {key: key}, data);\n\n let loadedPromise;\n try {\n loadedPromise = cancelablePromise(quoteImageOrVideo.call(this, data, style == 'VD'));\n } catch (error) {\n console.warn(\"Failed to quote image:\", error.message);\n loadedPromise = cancelablePromise(error);\n }\n attr.whenDone = loadedPromise;\n values = [React.createElement(LazyImage, attr, null), ' ', attr.alt];\n return React.createElement(React.Fragment, {key: key}, values);\n } else if (style == 'QQ') {\n if (stack.includes('QQ')) {\n // Quote inside quote when forwarding a message.\n return React.createElement('span', {key: key},\n [format_quote , ' ']);\n }\n\n const attr = Drafty.attrValue('QQ', data) || {};\n attr.key = key;\n attr.className = 'reply-quote'\n return React.createElement(Drafty.tagName('QQ'), attr, values);\n }\n return quoteFormatter.call(this, style, data, values, key);\n}\n","import { KNOWN_HOSTS, DEFAULT_HOST } from '../config.js';\n\n// Detect server address from the URL\nexport function detectServerAddress() {\n let host = DEFAULT_HOST;\n if (typeof window.location == 'object') {\n if (window.location.protocol == 'file:' || window.location.hostname == 'localhost') {\n host = KNOWN_HOSTS.local;\n } else if (window.location.hostname) {\n host = window.location.hostname + (window.location.port ? ':' + window.location.port : '');\n }\n }\n return host;\n}\n\n// Detect if the page is served over HTTPS.\nexport function isSecureConnection() {\n if (typeof window.location == 'object') {\n return window.location.protocol == 'https:';\n }\n return false;\n}\n\nexport function isLocalHost() {\n if (typeof window.location == 'object') {\n return window.location.hostname == 'localhost';\n }\n return false;\n}\n","// Helper functions for storing values in localStorage.\n// By default localStorage can store only strings, not objects or other types.\n\nexport default class LocalStorageUtil {\n // Replace old object with the new one.\n static setObject(key, value) {\n localStorage.setItem(key, JSON.stringify(value));\n }\n\n // Get stored object.\n static getObject(key) {\n const value = localStorage.getItem(key);\n return value && JSON.parse(value);\n }\n\n // Partially or wholly update stored object.\n static updateObject(key, value) {\n const oldVal = this.getObject(key);\n this.setObject(key, Object.assign(oldVal || {}, value));\n }\n\n // Just a wrapper.\n static removeItem(key) {\n localStorage.removeItem(key);\n }\n}\n","// Utility class for hash navigation.\n\nexport default class HashNavigation {\n // Parse hash as in http://www.example.com/path#hash as if it were\n // path and arguments.\n static parseUrlHash(hash) {\n // Split path from args, path -> parts[0], args->path[1]\n const parts = hash.split('?', 2);\n const params = {};\n let path = [];\n if (parts[0]) {\n path = parts[0].replace('#', '').split('/');\n }\n if (parts[1]) {\n parts[1].split('&').forEach((arg) => {\n // Can't use split() because the value may contain '='.\n const eq = arg.indexOf('=');\n if (eq > 0) {\n params[arg.slice(0, eq)] = decodeURIComponent(arg.slice(eq + 1));\n }\n });\n }\n return {path: path, params: params};\n }\n\n static navigateTo(url) {\n window.location.hash = url;\n }\n\n static composeUrlHash(path, params) {\n let url = path.join('/');\n const args = [];\n for (const key in params) {\n if (params.hasOwnProperty(key)) {\n args.push(key + '=' + encodeURIComponent(params[key]));\n }\n }\n if (args.length > 0) {\n url += '?' + args.join('&');\n }\n return url;\n }\n\n static addUrlParam(hash, key, value) {\n const parsed = HashNavigation.parseUrlHash(hash);\n parsed.params[key] = value;\n return HashNavigation.composeUrlHash(parsed.path, parsed.params);\n }\n\n static removeUrlParam(hash, key) {\n const parsed = HashNavigation.parseUrlHash(hash);\n delete parsed.params[key];\n return HashNavigation.composeUrlHash(parsed.path, parsed.params);\n }\n\n static setUrlSidePanel(hash, sidepanel) {\n const parsed = HashNavigation.parseUrlHash(hash);\n parsed.path[0] = sidepanel;\n return HashNavigation.composeUrlHash(parsed.path, parsed.params);\n }\n\n static setUrlInfoPanel(hash, infopanel) {\n const parsed = HashNavigation.parseUrlHash(hash);\n if (infopanel) {\n parsed.params.info = infopanel;\n } else {\n delete parsed.params.info;\n }\n return HashNavigation.composeUrlHash(parsed.path, parsed.params);\n }\n\n static setUrlTopic(hash, topic) {\n const parsed = HashNavigation.parseUrlHash(hash);\n parsed.path[1] = topic;\n // Close InfoView on topic change.\n delete parsed.params.info;\n return HashNavigation.composeUrlHash(parsed.path, parsed.params);\n }\n}\n","// Short representation of time in the past.\nexport function shortDateFormat(then, locale) {\n locale = locale || window.navigator.userLanguage || window.navigator.language;\n const now = new Date();\n if (then.getFullYear() == now.getFullYear()) {\n // Same year.\n if (then.getMonth() == now.getMonth() && then.getDate() == now.getDate()) {\n // Same month and day, show time only.\n return then.toLocaleTimeString(locale, {hour12: false, hour: '2-digit', minute: '2-digit'});\n }\n // Different month and/or day, show month day, time.\n return then.toLocaleDateString(locale,\n {hour12: false, month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit'});\n }\n // Different year: just show the date.\n return then.toLocaleDateString(locale, {year: 'numeric', month: 'short', day: 'numeric'});\n}\n\n// Representation a date relative to now.\nexport function relativeDateFormat(then, locale) {\n locale = locale || window.navigator.userLanguage || window.navigator.language;\n const now = new Date();\n const thenDays = Math.floor((then.getTime() - then.getTimezoneOffset() * 60_000) / 86_400_000);\n const nowDays = Math.floor((now.getTime() - now.getTimezoneOffset() * 60_000) / 86_400_000);\n const diff = thenDays - nowDays;\n if (Math.abs(diff) < 2) {\n // Today or yesterday.\n return new Intl.RelativeTimeFormat(locale, { numeric: 'auto' }).format(diff, 'day')\n }\n // More than two days: just show the date.\n return new Intl.DateTimeFormat(locale).format(then);\n}\n\n// Convert seconds to [hours:]minutes:seconds, i.e. 156 sec -> 2:36, 3756 sec -> 1:02:36.\n// If fixedMins is true, then minutes are represented by at least two digits.\nexport function secondsToTime(seconds, fixedMin) {\n if (typeof seconds != 'number') {\n return '';\n }\n\n let min = (Math.floor(seconds / 60) | 0) % 60;\n let hours = Math.floor(seconds / 36000) | 0;\n\n if (fixedMin || hours > 0) {\n min = min < 10 ? `0${min}` : min;\n }\n let sec = (seconds | 0) % 60;\n sec = sec < 10 ? `0${sec}` : sec;\n if (hours == 0) {\n return `${min}:${sec}`;\n }\n return `${hours}:${min}:${sec}`;\n}\n\n// Convert a number of bytes to human-readable format.\nexport function bytesToHumanSize(bytes) {\n if (!bytes || bytes == 0) {\n return '0 Bytes';\n }\n\n const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB'];\n const bucket = Math.min(Math.floor(Math.log2(bytes) / 10) | 0, sizes.length-1);\n const count = bytes / Math.pow(1024, bucket);\n const round = bucket > 0 ? (count < 3 ? 2 : (count < 30 ? 1 : 0)) : 0;\n return count.toFixed(round) + ' ' + sizes[bucket];\n}\n\n// Shorten a file name to be under maxLength by clipping out the middle.\nexport function shortenFileName(filename, maxLength) {\n if (typeof filename != 'string') {\n return filename;\n }\n return filename.length > maxLength ?\n filename.slice(0, maxLength/2 - 1) + '…' + filename.slice(1 - maxLength/2) : filename;\n}\n\n// Get 32 bit integer hash value for a string. Ideally it should produce the same value\n// as Java's String#hash().\nfunction stringToColorHash(value) {\n let hash = 0;\n value = '' + value;\n for (let i = 0; i < value.length; i++) {\n hash = ((hash << 5) - hash) + value.charCodeAt(i);\n hash = hash & hash; // Convert to 32bit integer\n }\n return hash;\n}\n\n// User avatar letter color id.\nexport function letterTileColorId(userId) {\n return Math.abs(stringToColorHash(userId)) % 16;\n}\n\n// Converts user or topic ID to a CSS color class. Ideally it should produce the same color value as Java version.\n// params:\n// - {string} id: user or topic ID\n// - {boolean} light: light or dark version of the color.\n// - {boolean} fg: foreground (text) or background color.\nexport function idToColorClass(id, light, fg) {\n return (light ? 'lt-' : 'dk-') + (fg ? 'fg-' : 'bg-') + letterTileColorId(id);\n}\n\n// Takes ISO Alpha-2 country code, like 'US' and converts it to a flag emoji.\nexport function flagEmoji(countryCode) {\n const codePoints = countryCode\n .toUpperCase()\n .split('')\n .map(char => 0x1F1A5 + char.charCodeAt());\n return String.fromCodePoint(...codePoints);\n}\n","// Odds and ends\n\nimport { Tinode } from 'tinode-sdk';\n\n// Make shortcut icon appear with a green dot + show unread count in title.\nexport function updateFavicon(count) {\n const oldIcon = document.getElementById('shortcut-icon');\n const head = document.head || document.getElementsByTagName('head')[0];\n const newIcon = document.createElement('link');\n newIcon.type = 'image/png';\n newIcon.id = 'shortcut-icon';\n newIcon.rel = 'shortcut icon';\n newIcon.href = 'img/logo32x32' + (count > 0 ? 'a' : '') + '.png';\n if (oldIcon) {\n head.removeChild(oldIcon);\n }\n head.appendChild(newIcon);\n\n document.title = (count > 0 ? '('+count+') ' : '') + 'Tinode';\n}\n\n// Create theCard which represents user's or topic's \"public\" info.\nexport function theCard(fn, imageUrl, imageMimeType, note) {\n let card = null;\n fn = fn && fn.trim();\n note = note && note.trim();\n\n if (fn) {\n card = {\n fn: fn\n };\n }\n\n if (typeof note == 'string') {\n card = card || {};\n card.note = note ? note : Tinode.DEL_CHAR;\n }\n\n if (imageUrl) {\n card = card || {};\n let mimeType = imageMimeType;\n // Is this a data URL \"data:[][;base64],\"?\n const matches = /^data:(image\\/[-a-z0-9+.]+)?(;base64)?,/i.exec(imageUrl);\n if (matches) {\n mimeType = matches[1];\n card.photo = {\n data: imageUrl.substring(imageUrl.indexOf(',') + 1),\n ref: Tinode.DEL_CHAR\n };\n } else {\n card.photo = {\n data: Tinode.DEL_CHAR,\n ref: imageUrl\n };\n }\n card.photo.type = (mimeType || 'image/jpeg').substring('image/'.length);\n }\n\n return card;\n}\n\n// Deep-shallow compare two arrays: shallow compare each element.\nexport function arrayEqual(a, b) {\n if (a === b) {\n return true;\n }\n\n if (!Array.isArray(a) || !Array.isArray(b)) {\n return false;\n }\n\n // Compare lengths first.\n if (a.length != b.length) {\n return false;\n }\n // Order of elements is ignored.\n a.sort();\n b.sort();\n for (let i = 0, l = a.length; i < l; i++) {\n if (a[i] !== b[i]) {\n return false;\n }\n }\n return true;\n}\n\n// Checks (loosely) if the given string is a phone. If so, returns the phone number in a format\n// as close to E.164 as possible.\nexport function asPhone(val) {\n val = val.trim();\n if (/^(?:\\+?(\\d{1,3}))?[- (.]*(\\d{3})[- ).]*(\\d{3})[- .]*(\\d{2})[- .]*(\\d{2})?$/.test(val)) {\n return val.replace(/[- ().]*/, '');\n }\n return null;\n}\n\n// Checks (loosely) if the given string is an email. If so returns the email.\nexport function asEmail(val) {\n val = val.trim();\n if (/^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\\.[a-zA-Z0-9-.]+$/.test(val)) {\n return val;\n }\n return null;\n}\n\n// Checks if URL is a relative url, i.e. has no 'scheme://', including the case of missing scheme '//'.\n// The scheme is expected to be RFC-compliant, e.g. [a-z][a-z0-9+.-]*\n// example.html - ok\n// https:example.com - not ok.\n// http:/example.com - not ok.\n// ' ↲ https://example.com' - not ok. (↲ means carriage return)\nexport function isUrlRelative(url) {\n return url && !/^\\s*([a-z][a-z0-9+.-]*:|\\/\\/)/im.test(url);\n}\n\n// Ensure URL does not present an XSS risk. Optional allowedSchemes may contain an array of\n// strings with permitted URL schemes, such as ['ftp', 'ftps']; otherwise accept http and https only.\nexport function sanitizeUrl(url, allowedSchemes) {\n if (typeof url != 'string') {\n return url;\n }\n\n // Strip control characters and whitespace. They are not valid URL characters anyway.\n url = url.replace(/[^\\x20-\\x7E]/gmi, '').trim();\n\n // Relative URLs are safe.\n // Relative URL does not start with ':', abcd123: or '//'.\n if (!/^([a-z][a-z0-9+.-]*:|\\/\\/)/i.test(url)) {\n return url;\n }\n\n // Blob URLs are safe.\n if (/^blob:http/.test(url)) {\n return url;\n }\n\n // Absolute URL. Accept only safe schemes, or no scheme.\n const schemes = Array.isArray(allowedSchemes) ? allowedSchemes.join('|') : 'http|https';\n const re = new RegExp('^((' + schemes + '):|//)', 'i');\n if (!re.test(url)) {\n return null;\n }\n\n return url;\n}\n\n// Ensure URL is suitable as a source like field: the URL must be a relative URL or\n// have http:, https:, blob: or data: scheme.\n// In case of data: scheme, the URL must must be of the right MIME type such as 'data:{mimeMajor}/XXXX;base64,'.\nexport function sanitizeUrlForMime(url, mimeMajor) {\n if (!url) {\n return null;\n }\n\n const sanitizedUrl = sanitizeUrl(url);\n if (sanitizedUrl) {\n return sanitizedUrl;\n }\n\n // Is this a data: URL of the appropriate mime type?\n const re = new RegExp(`data:${mimeMajor}\\/[a-z0-9.-]+;base64,`, 'i');\n if (re.test(url.trim())) {\n return url;\n }\n\n return null;\n}\n\n// Given message's received status, return name and color of a delivery indicator icon.\nexport function deliveryMarker(received) {\n switch (received) {\n case Tinode.MESSAGE_STATUS_SENDING:\n return { name: 'access_time' }; // watch face\n case Tinode.MESSAGE_STATUS_FAILED:\n return { name: 'warning', color: 'danger-color' }; // yellow icon /!\\\n case Tinode.MESSAGE_STATUS_SENT:\n return { name: 'done' }; // checkmark\n case Tinode.MESSAGE_STATUS_RECEIVED:\n return { name: 'done_all' }; // double checkmark\n case Tinode.MESSAGE_STATUS_READ:\n return { name: 'done_all', color: 'blue' }; // blue double checkmark\n }\n return null;\n}\n\n// Wraps a promise to make it cancelable.\n// The parameter can be either a promise or an error. If it's an error, the wrapped promise is\n// created in a rejected state.\nexport function cancelablePromise(promise) {\n let hasCanceled = false;\n\n const wrappedPromise = promise instanceof Error ?\n Promise.reject(promise) :\n new Promise((resolve, reject) => {\n promise.then(\n result => hasCanceled ? reject({isCanceled: true}) : resolve(result),\n error => hasCanceled ? reject({isCanceled: true}) : reject(error)\n );\n });\n\n return {\n promise: wrappedPromise,\n cancel() {\n hasCanceled = true;\n },\n };\n};\n\n// Clips string to the specified length.\nexport function clipStr(str, length) {\n return str && str.substring(0, length);\n}\n","// This is a generated file. Don't edit.\n\nexport const PACKAGE_VERSION = \"0.21.0-rc2\";\n","// Edit account parameters.\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport CheckBox from '../widgets/checkbox.jsx';\n\nexport default class EditAccountView extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.handleCheckboxClick = this.handleCheckboxClick.bind(this);\n }\n\n handleCheckboxClick(what, checked) {\n if (what == 'sound') {\n this.props.onToggleMessageSounds(checked);\n } else if (what == 'alert') {\n this.props.onTogglePushNotifications(checked);\n } else if (what == 'incognito') {\n this.props.onToggleIncognitoMode(checked);\n }\n }\n\n render() {\n return (\n \n
\n \n \n \n \n
\n
\n \n {this.props.desktopAlertsEnabled ?\n \n :\n \n }\n \n \n
\n
\n \n \n \n \n
\n
\n );\n }\n};\n","// Edit account parameters.\nimport React from 'react';\nimport { FormattedMessage, defineMessages, injectIntl } from 'react-intl';\n\nimport InPlaceEdit from '../widgets/in-place-edit.jsx';\nimport PermissionsEditor from '../widgets/permissions-editor.jsx';\n\nconst messages = defineMessages({\n delete_account: {\n id: 'delete_account',\n defaultMessage: 'Delete account',\n description: 'Title for delete account warning'\n },\n delete_account_warning: {\n id: 'delete_account_warning',\n defaultMessage: 'Are you sure you want to delete your account? It cannot be undone.',\n description: 'Warning message when deleting an account'\n }\n});\n\nclass AccSecurityView extends React.Component {\n constructor(props) {\n super(props);\n\n const me = this.props.tinode.getMeTopic();\n let blockedCount = 0;\n me.contacts((c) => {\n if (c.acs && !c.acs.isJoiner()) {\n blockedCount ++;\n }\n });\n const defacs = me.getDefaultAccess();\n this.state = {\n auth: defacs ? defacs.auth : null,\n anon: defacs ? defacs.anon : null,\n showPermissionEditorFor: undefined,\n blockedCount: blockedCount,\n };\n\n this.handlePasswordUpdate = this.handlePasswordUpdate.bind(this);\n this.handleLaunchPermissionsEditor = this.handleLaunchPermissionsEditor.bind(this);\n this.handleHidePermissionsEditor = this.handleHidePermissionsEditor.bind(this);\n this.handlePermissionsChanged = this.handlePermissionsChanged.bind(this);\n this.handleDeleteAccount = this.handleDeleteAccount.bind(this);\n }\n\n handlePasswordUpdate(pwd) {\n this.setState({password: pwd});\n this.props.onUpdatePassword(pwd);\n }\n\n handleLaunchPermissionsEditor(which) {\n this.setState({\n showPermissionEditorFor: which,\n editedPermissions: this.state[which]\n });\n }\n\n handleHidePermissionsEditor() {\n this.setState({showPermissionEditorFor: undefined});\n }\n\n handlePermissionsChanged(perm) {\n let defacs = {};\n defacs[this.state.showPermissionEditorFor] = perm;\n this.props.onUpdateAccountDesc('me', undefined, undefined, defacs);\n\n let newState = {showPermissionEditorFor: undefined};\n newState[this.state.showPermissionEditorFor] = perm;\n this.setState(newState);\n }\n\n handleDeleteAccount(e) {\n e.preventDefault();\n const {formatMessage} = this.props.intl;\n this.props.onShowAlert(\n formatMessage(messages.delete_account), // title\n formatMessage(messages.delete_account_warning), // content\n (_ => this.props.onDeleteAccount()), // onConfirm\n null, // use default text \"OK\"\n true, // Show Reject button\n null // use default text \"Cancel\"\n );\n }\n\n render() {\n return (\n <>{this.state.showPermissionEditorFor ?\n \n :\n \n
\n
\n \n \n
\n {\n (password_unchanged) => \n } \n
\n
\n
\n
\n
\n
\n
\n \n \n \n
\n
\n
Auth: {this.state.auth}
\n
Anon: {this.state.anon}
\n
\n
\n {this.state.blockedCount > 0 ?\n <>\n
\n
\n >\n : null }\n
\n }>\n );\n }\n};\n\nexport default injectIntl(AccSecurityView);\n","// Edit account parameters.\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport { Tinode } from 'tinode-sdk';\n\nimport { APP_NAME, LINK_CONTACT_US, LINK_PRIVACY_POLICY, LINK_TERMS_OF_SERVICE } from '../config.js';\n\nexport default class AccSupportView extends React.PureComponent {\n render() {\n return (\n \n
\n
\n
\n
\n \n {APP_NAME}\n
\n
\n \n {Tinode.getLibrary()}\n
\n
\n \n {this.props.serverVersion}\n
\n
\n \n {this.props.serverAddress}\n
\n
\n
\n );\n }\n};\n","// Edit account parameters.\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport AvatarUpload from '../widgets/avatar-upload.jsx';\nimport BadgeList from '../widgets/badge-list.jsx';\n\nimport { makeImageUrl } from '../lib/blob-helpers.js';\nimport { MAX_TITLE_LENGTH, MAX_TOPIC_DESCRIPTION_LENGTH } from '../config.js';\n\nfunction _clip(str, length) {\n return str && str.substring(0, length);\n}\n\nexport default class AccountSettingsView extends React.Component {\n constructor(props) {\n super(props);\n\n const me = this.props.tinode.getMeTopic();\n this.state = {\n fullName: _clip(me.public ? me.public.fn : undefined, MAX_TITLE_LENGTH),\n description: _clip(me.public ? me.public.note : undefined, MAX_TOPIC_DESCRIPTION_LENGTH),\n avatar: makeImageUrl(me.public ? me.public.photo : null)\n };\n }\n\n render() {\n return (\n \n );\n }\n};\n","/* ContactsView holds all contacts-related stuff */\nimport React from 'react';\nimport { FormattedMessage, defineMessages } from 'react-intl';\n\nimport ContactList from '../widgets/contact-list.jsx';\n\nimport { updateFavicon } from '../lib/utils.js';\n\nconst messages = defineMessages({\n archived_contacts_title: {\n id: \"archived_contacts\",\n defaultMessage: \"Archived contacts ({count})\",\n description: \"Label for archived chats\"\n }\n});\n\nexport default class ContactsView extends React.Component {\n constructor(props) {\n super(props);\n\n this.handleAction = this.handleAction.bind(this);\n\n this.state = ContactsView.deriveStateFromProps(props);\n }\n\n static deriveStateFromProps(props) {\n const contacts = [];\n let unreadThreads = 0;\n let archivedCount = 0;\n props.chatList.map((c) => {\n const blocked = c.acs && !c.acs.isJoiner();\n // Show only blocked contacts only when props.blocked == true.\n if (blocked && props.blocked) {\n contacts.push(c);\n }\n if (blocked || props.blocked) {\n return;\n }\n\n if (c.private && c.private.arch) {\n if (props.archive) {\n contacts.push(c);\n } else {\n archivedCount ++;\n }\n } else if (!props.archive) {\n contacts.push(c);\n unreadThreads += c.unread > 0 ? 1 : 0;\n }\n });\n\n contacts.sort((a, b) => {\n return (b.touched || 0) - (a.touched || 0);\n });\n\n if (archivedCount > 0) {\n contacts.push({\n action: 'archive',\n title: messages.archived_contacts_title,\n values: {count: archivedCount}\n });\n }\n\n return {\n contactList: contacts,\n unreadThreads: unreadThreads\n };\n }\n\n componentDidUpdate(prevProps, prevState) {\n if (prevProps.chatList != this.props.chatList ||\n prevProps.archive != this.props.archive ||\n prevProps.blocked != this.props.blocked) {\n const newState = ContactsView.deriveStateFromProps(this.props);\n this.setState(newState);\n if (newState.unreadThreads != prevState.unreadThreads) {\n updateFavicon(newState.unreadThreads);\n }\n }\n }\n\n handleAction(action_ignored) {\n this.props.onShowArchive();\n }\n\n render() {\n return (\n ¯∖_(ツ)_/¯\"\n description=\"HTML message shown in ContactList when no contacts are found\">{\n (no_contacts) => \n }\n );\n }\n};\n","// Account registration.\nimport React, { Suspense } from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport AvatarCrop from '../widgets/avatar-crop.jsx';\nimport AvatarUpload from '../widgets/avatar-upload.jsx';\nimport CheckBox from '../widgets/checkbox.jsx';\nconst PhoneEdit = React.lazy(_ => import('../widgets/phone-edit.jsx'));\nimport VisiblePassword from '../widgets/visible-password.jsx';\n\nimport LocalStorageUtil from '../lib/local-storage.js';\nimport { imageScaled, blobToBase64, makeImageUrl } from '../lib/blob-helpers.js';\nimport { theCard } from '../lib/utils.js';\n\nimport { AVATAR_SIZE, MAX_AVATAR_BYTES, MAX_EXTERN_ATTACHMENT_SIZE,\n MAX_TITLE_LENGTH } from '../config.js';\n\nexport default class CreateAccountView extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.state = {\n login: '',\n password: '',\n meth: '',\n email: '',\n tel: '',\n fn: '', // full/formatted name\n imageUrl: null,\n uploadUrl: null,\n newAvatar: null,\n newAvatarMime: null,\n errorCleared: false,\n buttonDisabled: false,\n saveToken: LocalStorageUtil.getObject('keep-logged-in')\n };\n\n this.handleLoginChange = this.handleLoginChange.bind(this);\n this.handlePasswordChange = this.handlePasswordChange.bind(this);\n this.handleEmailChange = this.handleEmailChange.bind(this);\n this.handlePhoneChange = this.handlePhoneChange.bind(this);\n this.handleFnChange = this.handleFnChange.bind(this);\n this.handleImageChanged = this.handleImageChanged.bind(this);\n this.handleToggleSaveToken = this.handleToggleSaveToken.bind(this);\n this.handleAvatarCropped = this.handleAvatarCropped.bind(this);\n this.handleAvatarCropCancel = this.handleAvatarCropCancel.bind(this);\n this.uploadAvatar = this.uploadAvatar.bind(this);\n this.handleSubmit = this.handleSubmit.bind(this);\n\n // Connection will trigger change by changing the this.props.serverVersion.\n props.tinode.connect()\n .catch(err => {\n this.props.onError(err.message, 'err');\n });\n }\n\n handleLoginChange(e) {\n this.setState({login: e.target.value});\n }\n\n handlePasswordChange(password) {\n this.setState({password: password});\n }\n\n handleEmailChange(e) {\n this.setState({meth: 'email', email: e.target.value});\n }\n\n handlePhoneChange(number) {\n this.setState({meth: 'tel', tel: number});\n }\n\n handleFnChange(e) {\n this.setState({fn: e.target.value});\n }\n\n handleImageChanged(mime, img) {\n this.setState({newAvatar: img, newAvatarMime: mime});\n }\n\n handleToggleSaveToken() {\n LocalStorageUtil.setObject('keep-logged-in', !this.state.saveToken);\n this.setState({saveToken: !this.state.saveToken});\n }\n\n handleSubmit(e) {\n e.preventDefault();\n this.setState({errorCleared: false});\n this.props.onCreateAccount(\n this.state.login.trim(),\n this.state.password.trim(),\n theCard(this.state.fn.trim().substring(0, MAX_TITLE_LENGTH), this.state.uploadUrl),\n {\n 'meth': this.state.meth,\n 'val': this.state.meth == 'email' ?\n this.state.email :\n this.state.meth == 'tel' ? this.state.tel : null\n }\n );\n }\n\n // AvatarCropView calls this method when the user has cropped the image.\n handleAvatarCropped(mime, blob, width, height) {\n const url = blob ? URL.createObjectURL(blob) : null;\n this.setState({avatar: url, newAvatar: null, newAvatarMime: null});\n if (blob) {\n this.uploadAvatar(mime, blob, width, height);\n }\n }\n\n handleAvatarCropCancel() {\n this.setState({newAvatar: null, newAvatarMime: null});\n }\n\n // Utility method for converting cropped avatar blob to bytes for sending inband or\n // for uploading it to the server out of band.\n uploadAvatar(mime, blob, width, height) {\n const readyToUpload = image => {\n let {mime, blob} = image;\n this.setState({imageUrl: URL.createObjectURL(blob), buttonDisabled: true});\n if (blob.size > MAX_AVATAR_BYTES) {\n // Too large to send inband - uploading out of band and sending as a link.\n const uploader = this.props.tinode.getLargeFileHelper();\n uploader.upload(blob, 'newacc')\n .then(url => this.setState({uploadUrl: url}))\n .catch(err => this.props.onError(err.message, 'err'))\n .finally(_ => this.setState({buttonDisabled: false}));\n } else {\n // Convert blob to base64-encoded bits.\n blobToBase64(blob)\n .then(b64 => this.setState({uploadUrl: makeImageUrl({data: b64.bits, type: mime})}))\n .finally(_ => this.setState({buttonDisabled: false}));\n }\n };\n\n if (width > AVATAR_SIZE || height > AVATAR_SIZE || width != height) {\n // Avatar is not square or too large even after cropping. Shrink it and make square.\n imageScaled(blob, AVATAR_SIZE, AVATAR_SIZE, MAX_EXTERN_ATTACHMENT_SIZE, true)\n .then(scaled => readyToUpload(scaled))\n .catch(err => this.props.onError(err.message, 'err'));\n } else {\n readyToUpload({mime: mime, blob: blob, width: width, height: height});\n }\n }\n\n render() {\n // \"reqCred\":{\"auth\":[\"email\"]}\n const method = (this.props.tinode.getServerParam('reqCred', {}).auth || [])[0] || 'email';\n\n if (this.state.newAvatar) {\n return (\n \n );\n }\n\n let submitClasses = 'primary';\n if (this.props.disabled) {\n submitClasses += ' disabled';\n }\n\n return (\n \n );\n }\n};\n","// InfoView: panel with topic/user info.\nimport React from 'react';\nimport { FormattedMessage, defineMessages, injectIntl } from 'react-intl';\n\nimport { AccessMode, Tinode } from 'tinode-sdk';\n\nimport AvatarUpload from '../widgets/avatar-upload.jsx';\nimport BadgeList from '../widgets/badge-list.jsx';\nimport CheckBox from '../widgets/checkbox.jsx';\nimport ContactList from '../widgets/contact-list.jsx';\nimport ErrorPanel from '../widgets/error-panel.jsx';\nimport GroupManager from '../widgets/group-manager.jsx';\nimport MenuCancel from '../widgets/menu-cancel.jsx';\nimport PermissionsEditor from '../widgets/permissions-editor.jsx';\nimport TopicCommon from '../widgets/topic-common.jsx';\nimport TopicSecurity from '../widgets/topic-security.jsx';\n\nimport { MAX_TITLE_LENGTH, MAX_TOPIC_DESCRIPTION_LENGTH, NO_ACCESS_MODE } from '../config.js';\n\nimport { makeImageUrl } from '../lib/blob-helpers.js';\nimport { theCard, clipStr } from '../lib/utils.js';\n\nconst messages = defineMessages({\n info: {\n id: 'panel_title_info',\n description: 'Title for InfoView',\n defaultMessage: 'Info'\n },\n general: {\n id: 'panel_title_general',\n description: 'Title for TopicCommon.',\n defaultMessage: 'General'\n },\n security: {\n id: 'panel_title_security',\n description: 'Title for TopicSecirity and AccSecurity.',\n defaultMessage: 'Security'\n },\n members: {\n id: 'panel_title_members',\n description: 'Title for managing group members view.',\n defaultMessage: 'Members'\n },\n crop: {\n id: 'panel_title_crop',\n description: 'Title for AvatarCropView.',\n defaultMessage: 'Drag to Adjust'\n },\n perm_want: {\n id: 'requested_permissions',\n defaultMessage: 'Requested',\n description: 'Title for permissions'\n },\n perm_given: {\n id: 'granted_permissions',\n defaultMessage: 'Granted',\n description: 'Title for permissions'\n },\n perm_auth: {\n id: 'permissions_authenticated',\n defaultMessage: 'Authenticated',\n description: 'Title for editing default authenticated permissions'\n },\n perm_anon: {\n id: 'permissions_anonymous',\n defaultMessage: 'Anonymous',\n description: 'Title for editing default anonymous permissions'\n },\n perm_user: {\n id: 'permissions_user',\n defaultMessage: 'User\\'s Permissions',\n description: 'Title for editing user\\'s permissions'\n },\n edit_permissions: {\n id: 'menu_item_edit_permissions',\n defaultMessage: 'Edit permissions',\n description: 'Menu item [Edit permissions]'\n },\n});\n\nclass InfoView extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = {\n topic: null,\n owner: false,\n admin: false,\n sharer: false,\n deleter: false,\n muted: false,\n address: null,\n groupTopic: undefined,\n channel: undefined,\n fullName: undefined,\n description: undefined,\n avatar: null,\n private: null,\n selectedContact: null,\n access: null,\n modeGiven: null,\n modeWant: null,\n modeGiven2: null, // P2P topic, the other user mode given\n modeWant2: null, // P2P topic, the other user mode want\n auth: null,\n anon: null,\n contactList: [],\n trustedBadges: [],\n previousMetaDesc: undefined,\n previousSubsUpdated: undefined,\n };\n\n this.resetSubs = this.resetSubs.bind(this);\n this.resetDesc = this.resetDesc.bind(this);\n this.resetTags = this.resetTags.bind(this);\n this.onMetaDesc = this.onMetaDesc.bind(this);\n this.onSubsUpdated = this.onSubsUpdated.bind(this);\n this.handleImageChanged = this.handleImageChanged.bind(this);\n this.handleMuted = this.handleMuted.bind(this);\n this.handleUnarchive = this.handleUnarchive.bind(this);\n this.handlePermissionsChanged = this.handlePermissionsChanged.bind(this);\n this.handleLaunchPermissionsEditor = this.handleLaunchPermissionsEditor.bind(this);\n this.handleShowAddMembers = this.handleShowAddMembers.bind(this);\n this.handleMemberUpdateRequest = this.handleMemberUpdateRequest.bind(this);\n this.handleMemberSelected = this.handleMemberSelected.bind(this);\n this.handleContextMenu = this.handleContextMenu.bind(this);\n this.handleBackNavigate = this.handleBackNavigate.bind(this);\n }\n\n // No need to separately handle component mount.\n componentDidUpdate(props) {\n const topic = this.props.tinode.getTopic(props.topic);\n if (!topic) {\n return;\n }\n\n if (this.onMetaDesc != topic.onMetaDesc) {\n this.previousMetaDesc = topic.onMetaDesc;\n topic.onMetaDesc = this.onMetaDesc;\n\n this.previousSubsUpdated = topic.onSubsUpdated;\n topic.onSubsUpdated = this.onSubsUpdated;\n }\n\n if (this.state.topic != props.topic) {\n this.setState({topic: props.topic});\n this.resetDesc(topic, props);\n this.resetSubs(topic, props);\n this.resetTags(topic);\n }\n }\n\n componentWillUnmount() {\n const topic = this.props.tinode.getTopic(this.props.topic);\n if (!topic) {\n return;\n }\n this.setState({topic: null});\n topic.onMetaDesc = this.previousMetaDesc;\n topic.onSubsUpdated = this.previousSubsUpdated;\n }\n\n resetSubs(topic, props) {\n const newState = {contactList: []};\n if (topic.getType() == 'p2p') {\n // Fetch the other party in the p2p conversation.\n // Topic may not be ready yet, so check if user is found.\n const user2 = topic.subscriber(props.topic);\n if (user2) {\n newState.modeGiven2 = user2.acs.getGiven();\n newState.modeWant2 = user2.acs.getWant();\n } else {\n newState.modeGiven2 = NO_ACCESS_MODE;\n newState.modeWant2 = NO_ACCESS_MODE;\n }\n } else {\n topic.subscribers((sub) => {\n newState.contactList.push(sub);\n }, this);\n }\n\n this.setState(newState);\n }\n\n resetDesc(topic, props) {\n const defacs = topic.getDefaultAccess() || {};\n const acs = topic.getAccessMode();\n\n const badges = [];\n if (topic.trusted) {\n for (const [key, val] of Object.entries(topic.trusted)) {\n if (val) {\n badges.push(key);\n }\n }\n }\n\n this.setState({\n owner: acs && acs.isOwner(),\n admin: acs && acs.isAdmin(),\n sharer: acs && acs.isSharer(),\n deleter: acs && acs.isDeleter(),\n muted: acs && acs.isMuted(),\n\n fullName: clipStr(topic.public && topic.public.fn, MAX_TITLE_LENGTH),\n description: clipStr(topic.public && topic.public.note, MAX_TOPIC_DESCRIPTION_LENGTH),\n avatar: makeImageUrl(topic.public ? topic.public.photo : null),\n trustedBadges: badges,\n private: clipStr(topic.private && topic.private.comment, MAX_TITLE_LENGTH),\n archived: topic.isArchived(),\n address: topic.name,\n groupTopic: topic.isGroupType(),\n channel: topic.isChannelType() || topic.chan,\n access: acs ? acs.getMode() : undefined,\n modeGiven: acs ? acs.getGiven() : undefined,\n modeWant: acs ? acs.getWant() : undefined,\n auth: defacs.auth,\n anon: defacs.anon\n });\n }\n\n resetTags(topic) {\n if (topic.getType() != 'grp') {\n return;\n }\n\n const acs = topic.getAccessMode();\n if (acs && acs.isOwner()) {\n // Requesting tags: owner is editing the topic.\n topic.getMeta(topic.startMetaQuery().withTags().build());\n }\n }\n\n onMetaDesc(desc) {\n const topic = this.props.tinode.getTopic(this.props.topic);\n if (!topic) {\n return;\n }\n this.resetDesc(topic, this.props);\n\n if (this.previousMetaDesc && this.previousMetaDesc != this.onMetaDesc) {\n this.previousMetaDesc(desc);\n }\n }\n\n onSubsUpdated(subs) {\n const topic = this.props.tinode.getTopic(this.props.topic);\n if (!topic) {\n return;\n }\n this.resetSubs(topic, this.props);\n\n if (this.previousSubsUpdated && this.previousSubsUpdated != this.onSubsUpdated) {\n this.previousSubsUpdated(subs);\n }\n }\n\n handleImageChanged(mime, img) {\n this.setState({avatar: img});\n this.props.onTopicDescUpdate(this.props.topic, theCard(null, img || Tinode.DEL_CHAR), null);\n }\n\n handleMuted(ignored, checked) {\n this.setState({muted: checked});\n this.props.onChangePermissions(this.props.topic, checked ? '-P' : '+P');\n }\n\n handleUnarchive(ignored, ignored2) {\n this.props.onTopicUnArchive(this.props.topic);\n }\n\n handlePermissionsChanged(which, perm) {\n switch (which) {\n case 'auth':\n this.props.onTopicDescUpdateRequest(this.props.topic, null, null, {auth: perm});\n break;\n case 'anon':\n this.props.onTopicDescUpdateRequest(this.props.topic, null, null, {anon: perm});\n break;\n case 'mode':\n case 'want':\n this.props.onChangePermissions(this.props.topic, perm);\n break;\n case 'given':\n this.props.onChangePermissions(this.props.topic, perm, this.props.topic);\n break;\n case 'user':\n this.props.onChangePermissions(this.props.topic, perm, this.state.userPermissionsEdited);\n break;\n }\n\n this.handleBackNavigate();\n }\n\n handleLaunchPermissionsEditor(which, uid) {\n const {formatMessage} = this.props.intl;\n let toEdit, toCompare, toSkip, titleEdit, titleCompare, userTitle, userAvatar;\n switch (which) {\n case 'mode':\n toEdit = this.state.access;\n break;\n case 'want':\n toEdit = this.state.modeWant;\n toCompare = this.state.modeGiven;\n if (this.state.owner) {\n // Don't allow owner to unset 'O' permission. All other permissions are OK.\n toSkip = 'O';\n } else {\n // Allow accepting any of 'ASDO' permissions but don't allow asking for them.\n toSkip = AccessMode.encode(AccessMode.diff('ASDO', this.state.modeGiven));\n if (this.state.channel) {\n // Channels are read-only.\n toSkip += 'W';\n }\n }\n titleEdit = formatMessage(messages.perm_want);\n titleCompare = formatMessage(messages.perm_given);\n break;\n case 'given':\n toEdit = this.state.modeGiven2;\n toCompare = this.state.modeWant2;\n toSkip = this.state.groupTopic ? (this.state.owner ? '' : 'O') : 'ASDO';\n titleEdit = formatMessage(messages.perm_given);\n titleCompare = formatMessage(messages.perm_want);\n break;\n case 'auth':\n toEdit = this.state.auth;\n toSkip = 'O';\n break;\n case 'anon':\n toEdit = this.state.anon;\n toSkip = 'O';\n break;\n case 'user': {\n const topic = this.props.tinode.getTopic(this.props.topic);\n if (!topic) {\n return;\n }\n const user = topic.subscriber(uid);\n if (!user || !user.acs) {\n return;\n }\n toEdit = user.acs.getGiven();\n toCompare = user.acs.getWant();\n toSkip = this.state.owner ? '' : 'O';\n titleEdit = formatMessage(messages.perm_given);\n titleCompare = formatMessage(messages.perm_want);\n if (user.public) {\n userTitle = user.public.fn;\n userAvatar = user.public.photo;\n }\n break;\n }\n default:\n console.error(\"Unknown permission editing mode '\" + which + \"'\");\n return;\n }\n this.setState({\n userPermissionsEdited: uid,\n userPermissionsTitle: userTitle,\n userPermissionsAvatar: userAvatar,\n editedPermissions: toEdit,\n immutablePermissions: toCompare,\n editedPermissionsTitle: titleEdit,\n immutablePermissionsTitle: titleCompare,\n editedPermissionsSkipped: toSkip,\n });\n this.props.onNavigate(`perm/${which}`);\n }\n\n handleShowAddMembers(e) {\n e.preventDefault();\n this.props.onInitFind();\n this.props.onNavigate('members');\n }\n\n handleMemberUpdateRequest(members, added, removed) {\n this.props.onMemberUpdateRequest(this.props.topic, added, removed);\n this.props.onNavigate('info');\n }\n\n handleMemberSelected(uid) {\n this.setState({selectedContact: uid});\n }\n\n handleBackNavigate() {\n const args = (this.props.panel || 'info').split('/');\n if (args[0] == 'info') {\n this.props.onNavigate(null);\n } else if (args[0] == 'perm') {\n if (args[1] == 'user') {\n this.props.onNavigate('info');\n } else {\n this.props.onNavigate('security');\n }\n } else {\n this.props.onNavigate('info');\n }\n }\n\n handleContextMenu(params) {\n const {formatMessage} = this.props.intl;\n const topic = this.props.tinode.getTopic(this.props.topic);\n if (!topic) {\n return;\n }\n const user = topic.subscriber(params.topicName);\n if (!user || !user.acs) {\n return;\n }\n\n const isMe = this.props.tinode.isMe(params.topicName);\n const menuItems = [{\n title: formatMessage(messages.edit_permissions),\n handler: _ => this.handleLaunchPermissionsEditor(isMe ? 'want' : 'user', params.topicName)\n }];\n if (!isMe) {\n menuItems.push('member_delete');\n }\n menuItems.push(user.acs.isMuted() ? 'member_unmute' : 'member_mute');\n if (!isMe) {\n menuItems.push(user.acs.isJoiner() ? 'member_block' : 'member_unblock');\n }\n this.props.showContextMenu({\n topicName: this.props.topic,\n x: params.x,\n y: params.y,\n user: params.topicName}, menuItems);\n }\n\n render() {\n const args = (this.props.panel || 'info').split('/');\n const view = args[0];\n args.shift();\n\n const {formatMessage} = this.props.intl;\n const panelTitle = formatMessage((view == 'perm' ? messages['perm_' + args[0]] : messages[view])\n || messages['info']);\n\n return (\n \n
\n
{panelTitle}
\n
\n \n
\n
\n {this.props.displayMobile ?\n
: null}\n {view == 'members' ?\n
\n :\n view == 'perm' && args.length > 0 ?\n
this.handlePermissionsChanged(args[0], mode)}\n onCancel={this.handleBackNavigate} />\n :\n view == 'general' ?\n \n :\n view == 'security' ?\n \n :\n \n
\n
\n
\n \n \n \n \n
\n {this.state.archived ?\n
\n \n \n \n \n
\n :\n null\n }\n
\n
\n {this.state.groupTopic && this.state.sharer ?\n <>\n
\n
\n \n \n \n
\n
\n
{\n (no_members) => \n } \n >\n :\n null\n }\n
\n }\n \n );\n }\n};\n\nexport default injectIntl(InfoView);\n","// Login form.\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport CheckBox from '../widgets/checkbox.jsx';\nimport VisiblePassword from '../widgets/visible-password.jsx';\n\nexport default class LoginView extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = {\n login: props.login,\n password: '',\n hostName: props.serverAddress,\n saveToken: props.persist\n };\n this.handleLoginChange = this.handleLoginChange.bind(this);\n this.handlePasswordChange = this.handlePasswordChange.bind(this);\n this.handleToggleSaveToken = this.handleToggleSaveToken.bind(this);\n this.handleSubmit = this.handleSubmit.bind(this);\n }\n\n handleLoginChange(e) {\n this.setState({login: e.target.value});\n }\n\n handlePasswordChange(e) {\n this.setState({password: e.target.value});\n }\n\n handleToggleSaveToken() {\n this.props.onPersistenceChange(!this.state.saveToken);\n this.setState({saveToken: !this.state.saveToken});\n }\n\n handleSubmit(e) {\n e.preventDefault();\n this.props.onLogin(this.state.login.trim(), this.state.password.trim());\n }\n\n render() {\n let submitClasses = 'primary';\n if (this.props.disabled) {\n submitClasses += ' disabled';\n }\n\n return (\n \n );\n }\n};\n","/* This is just a static page to display when no conversation is selected. */\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport { Tinode } from 'tinode-sdk';\n\nimport { APP_NAME } from '../config.js';\n\nexport default class LogoView extends React.PureComponent {\n render() {\n const version = APP_NAME + ' (' + Tinode.getLibrary() + ')';\n return (\n \n
\n
\n \n Tinode Web \n \n
{version}
\n
{this.props.serverVersion} ({this.props.serverAddress})
\n
\n
\n );\n }\n};\n","// Panel with a chat.\n\nimport React from 'react';\nimport { FormattedMessage, defineMessages, injectIntl } from 'react-intl';\n\nimport { Drafty, Tinode } from 'tinode-sdk';\n\nimport CallPanel from '../widgets/call-panel.jsx';\nimport ChatMessage from '../widgets/chat-message.jsx';\nimport ContactBadges from '../widgets/contact-badges.jsx';\nimport DocPreview from '../widgets/doc-preview.jsx';\nimport ErrorPanel from '../widgets/error-panel.jsx';\nimport GroupSubs from '../widgets/group-subs.jsx';\nimport ImagePreview from '../widgets/image-preview.jsx';\nimport Invitation from '../widgets/invitation.jsx';\nimport LetterTile from '../widgets/letter-tile.jsx';\nimport LoadSpinner from '../widgets/load-spinner.jsx';\nimport LogoView from './logo-view.jsx';\nimport MetaMessage from '../widgets/meta-message.jsx';\nimport SendMessage from '../widgets/send-message.jsx';\nimport VideoPreview from '../widgets/video-preview.jsx';\n\nimport { DEFAULT_P2P_ACCESS_MODE, EDIT_PREVIEW_LENGTH, IMAGE_PREVIEW_DIM, KEYPRESS_DELAY,\n MESSAGES_PAGE, MAX_EXTERN_ATTACHMENT_SIZE, MAX_IMAGE_DIM, MAX_INBAND_ATTACHMENT_SIZE,\n READ_DELAY, QUOTED_REPLY_LENGTH, VIDEO_PREVIEW_DIM } from '../config.js';\nimport { CALL_STATE_OUTGOING_INITATED, CALL_STATE_IN_PROGRESS } from '../constants.js';\nimport { blobToBase64, fileToBase64, imageScaled, makeImageUrl } from '../lib/blob-helpers.js';\nimport HashNavigation from '../lib/navigation.js';\nimport { bytesToHumanSize, relativeDateFormat, shortDateFormat } from '../lib/strformat.js';\n\n// Run timer with this frequency (ms) for checking notification queue.\nconst NOTIFICATION_EXEC_INTERVAL = 300;\n// Scroll distance before [go to latest message] button is shown.\nconst SHOW_GO_TO_LAST_DIST = 100;\n\nconst messages = defineMessages({\n online_now: {\n id: 'online_now',\n defaultMessage: 'online now',\n description: 'Indicator that the user or topic is currently online',\n },\n last_seen: {\n id: 'last_seen_timestamp',\n defaultMessage: 'Last seen',\n description: 'Label for the timestamp of when the user or topic was last online'\n },\n not_found: {\n id: 'title_not_found',\n defaultMessage: 'Not found',\n description: 'Title shown when topic is not found'\n },\n channel: {\n id: 'channel',\n defaultMessage: 'channel',\n description: 'Subtitle shown for channels in MessagesView instead of last seen'\n },\n file_attachment_too_large: {\n id: 'file_attachment_too_large',\n defaultMessage: 'The file size {size} exceeds the {limit} limit.',\n description: 'Error message when attachment is too large'\n },\n invalid_content: {\n id: 'invalid_content',\n defaultMessage: 'invalid content',\n description: 'Shown when the message is unreadable'\n },\n editing_message: {\n id: 'editing_message',\n defaultMessage: 'Editing',\n description: 'Title over message editing preview'\n },\n drag_file: {\n id: 'drag_file',\n defaultMessage: 'Drag file here',\n description: 'Prompt on the file drag-n-drop overlay banner'\n }\n});\n\n// Checks if the access permissions are granted but not yet accepted.\nfunction isUnconfirmed(acs) {\n if (acs) {\n const ex = acs.getExcessive() || '';\n return acs.isJoiner('given') && (ex.includes('R') || ex.includes('W'));\n }\n return false;\n}\n\nfunction isPeerRestricted(acs) {\n if (acs) {\n const ms = acs.getMissing() || '';\n return acs.isJoiner('want') && (ms.includes('R') || ms.includes('W'));\n }\n return false;\n}\n\nfunction shouldPresentCallPanel(callState) {\n // Show call panel if either:\n // - call is outgoing (and the client is waiting for the other side to pick up) or,\n // - call is already in progress.\n return callState == CALL_STATE_OUTGOING_INITATED || callState == CALL_STATE_IN_PROGRESS;\n}\n\nclass MessagesView extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = MessagesView.getDerivedStateFromProps(props, {});\n\n this.leave = this.leave.bind(this);\n this.sendMessage = this.sendMessage.bind(this);\n this.retrySend = this.retrySend.bind(this);\n this.sendImageAttachment = this.sendImageAttachment.bind(this);\n this.sendVideoAttachment = this.sendVideoAttachment.bind(this);\n this.sendFileAttachment = this.sendFileAttachment.bind(this);\n this.sendAudioAttachment = this.sendAudioAttachment.bind(this);\n this.sendKeyPress = this.sendKeyPress.bind(this);\n this.subscribe = this.subscribe.bind(this);\n this.handleScrollReference = this.handleScrollReference.bind(this);\n this.mountDnDEvents = this.mountDnDEvents.bind(this);\n this.handleScrollEvent = this.handleScrollEvent.bind(this);\n this.handleDescChange = this.handleDescChange.bind(this);\n this.handleSubsUpdated = this.handleSubsUpdated.bind(this);\n this.handleMessageUpdate = this.handleMessageUpdate.bind(this);\n this.handleAllMessagesReceived = this.handleAllMessagesReceived.bind(this);\n this.handleInfoReceipt = this.handleInfoReceipt.bind(this);\n this.handleExpandMedia = this.handleExpandMedia.bind(this);\n this.handleClosePreview = this.handleClosePreview.bind(this);\n this.handleFormResponse = this.handleFormResponse.bind(this);\n this.handleContextClick = this.handleContextClick.bind(this);\n this.handleShowMessageContextMenu = this.handleShowMessageContextMenu.bind(this);\n this.handleNewChatAcceptance = this.handleNewChatAcceptance.bind(this);\n this.handleEnablePeer = this.handleEnablePeer.bind(this);\n this.handleAttachFile = this.handleAttachFile.bind(this);\n this.handleAttachImageOrVideo = this.handleAttachImageOrVideo.bind(this);\n this.handleCancelUpload = this.handleCancelUpload.bind(this);\n this.postReadNotification = this.postReadNotification.bind(this);\n this.clearNotificationQueue = this.clearNotificationQueue.bind(this);\n this.goToLatestMessage = this.goToLatestMessage.bind(this);\n this.handleFileDrop = this.handleFileDrop.bind(this);\n\n this.handlePickReply = this.handlePickReply.bind(this);\n this.handleEditMessage = this.handleEditMessage.bind(this);\n this.handleCancelReply = this.handleCancelReply.bind(this);\n this.handleQuoteClick = this.handleQuoteClick.bind(this);\n this.handleCallHangup = this.handleCallHangup.bind(this);\n\n this.isDragEnabled = this.isDragEnabled.bind(this);\n this.handleDragIn = this.handleDragIn.bind(this);\n this.handleDragOut = this.handleDragOut.bind(this);\n this.handleDrag = this.handleDrag.bind(this);\n this.handleDrop = this.handleDrop.bind(this);\n\n this.chatMessageRefs = {};\n this.getOrCreateMessageRef = this.getOrCreateMessageRef.bind(this);\n\n // Keeps track of the drag event.\n // Need a counter b/c the browser's 'drag' events may fire multiple times\n // when the user takes the mouse pointer over the container:\n // for the component itself and for all nested/child elements.\n this.dragCounter = 0;\n this.dndRef = null;\n\n this.readNotificationQueue = [];\n this.readNotificationTimer = null;\n\n this.keyPressTimer = null;\n }\n\n getOrCreateMessageRef(seqId) {\n if (this.chatMessageRefs.hasOwnProperty(seqId)) {\n return this.chatMessageRefs[seqId];\n }\n const ref = React.createRef();\n this.chatMessageRefs[seqId] = ref;\n return ref;\n }\n\n componentDidMount() {\n if (this.messagesScroller) {\n this.messagesScroller.addEventListener('scroll', this.handleScrollEvent);\n }\n\n // Drag and drop events\n if (this.dndRef) {\n this.dndRef.addEventListener('dragenter', this.handleDragIn);\n this.dndRef.addEventListener('dragleave', this.handleDragOut);\n this.dndRef.addEventListener('dragover', this.handleDrag);\n this.dndRef.addEventListener('drop', this.handleDrop);\n }\n }\n\n componentWillUnmount() {\n if (this.messagesScroller) {\n this.messagesScroller.removeEventListener('scroll', this.handleScrollEvent);\n }\n\n // Flush all notifications.\n this.clearNotificationQueue();\n\n // Drag and drop events\n if (this.dndRef) {\n this.dndRef.removeEventListener('dragenter', this.handleDragIn);\n this.dndRef.removeEventListener('dragleave', this.handleDragOut);\n this.dndRef.removeEventListener('dragover', this.handleDrag);\n this.dndRef.removeEventListener('drop', this.handleDrop);\n }\n }\n\n // Scroll last message into view on component update e.g. on message received\n // or vertical shrinking.\n componentDidUpdate(prevProps, prevState) {\n if (this.messagesScroller &&\n (prevState.topic != this.state.topic || prevState.messageCount != this.state.messageCount)) {\n // New message.\n if (this.state.scrollPosition < SHOW_GO_TO_LAST_DIST) {\n this.messagesScroller.scrollTop = this.messagesScroller.scrollHeight -\n this.state.scrollPosition -\n this.messagesScroller.offsetHeight;\n }\n }\n\n const topic = this.props.tinode ? this.props.tinode.getTopic(this.state.topic) : undefined;\n if (this.state.topic != prevState.topic) {\n if (prevState.topic && !Tinode.isNewGroupTopicName(prevState.topic)) {\n this.leave(prevState.topic);\n if (prevState.rtcPanel) {\n this.handleCallHangup(prevState.topic, prevProps.callSeq);\n }\n }\n\n if (topic) {\n topic.onData = this.handleMessageUpdate;\n topic.onAllMessagesReceived = this.handleAllMessagesReceived;\n topic.onInfo = this.handleInfoReceipt;\n topic.onMetaDesc = this.handleDescChange;\n topic.onSubsUpdated = this.handleSubsUpdated;\n topic.onPres = this.handleSubsUpdated;\n }\n }\n\n if (!this.props.applicationVisible) {\n // If application is not visible, flush all unsent 'read' notifications.\n this.clearNotificationQueue();\n } else {\n // Otherwise assume there are unread messages.\n this.postReadNotification(0);\n }\n\n if (topic && ((this.state.topic != prevState.topic) || !prevProps.ready)) {\n // Don't immediately subscribe to a new p2p topic, wait for the first message.\n if (topic._new && topic.isP2PType()) {\n topic.getMeta(topic.startMetaQuery().withDesc().build());\n } else {\n this.subscribe(topic);\n }\n }\n }\n\n static getDerivedStateFromProps(nextProps, prevState) {\n let nextState = {};\n if (!nextProps.topic) {\n // Default state: no topic.\n nextState = {\n messageCount: 0,\n latestClearId: -1,\n onlineSubs: [],\n topic: null,\n title: '',\n avatar: null,\n isVerified: false,\n isStaff: false,\n isDangerous: false,\n deleted: false,\n docPreview: null,\n imagePreview: null,\n imagePostview: null,\n videoPreview: null,\n videoPostview: null,\n rtcPanel: null,\n typingIndicator: false,\n scrollPosition: 0,\n fetchingMessages: false,\n peerMessagingDisabled: false,\n channel: false,\n reply: null,\n contentToEdit: null,\n showGoToLastButton: false,\n dragging: false\n };\n } else if (nextProps.topic != prevState.topic) {\n const topic = nextProps.tinode.getTopic(nextProps.topic);\n\n nextState = {\n topic: nextProps.topic,\n deleted: topic._deleted,\n docPreview: null,\n imagePreview: null,\n imagePostview: null,\n videoPreview: null,\n videoPostview: null,\n rtcPanel: null,\n typingIndicator: false,\n scrollPosition: 0,\n fetchingMessages: false,\n showGoToLastButton: false,\n contentToEdit: null,\n dragging: false\n };\n\n if (nextProps.forwardMessage) {\n // We are forwarding a message. Show preview.\n nextState.reply = {\n content: nextProps.forwardMessage.preview,\n seq: null\n };\n } else {\n nextState.reply = null;\n }\n\n if (topic) {\n // Topic exists.\n const subs = [];\n\n if (nextProps.connected) {\n topic.subscribers((sub) => {\n if (sub.online && sub.user != nextProps.myUserId) {\n subs.push(sub);\n }\n });\n }\n\n Object.assign(nextState, {\n onlineSubs: subs\n });\n\n if (topic.public) {\n Object.assign(nextState, {\n title: topic.public.fn,\n avatar: makeImageUrl(topic.public.photo)\n });\n } else {\n Object.assign(nextState, {\n title: '',\n avatar: null\n });\n }\n\n const peer = topic.p2pPeerDesc();\n if (peer) {\n Object.assign(nextState, {\n peerMessagingDisabled: isPeerRestricted(peer.acs)\n });\n } else if (prevState.peerMessagingDisabled) {\n Object.assign(nextState, {\n peerMessagingDisabled: false\n });\n }\n Object.assign(nextState, {\n messageCount: topic.messageCount(),\n latestClearId: topic.maxClearId(),\n channel: topic.isChannelType()\n });\n\n if (nextProps.callTopic == topic.name && shouldPresentCallPanel(nextProps.callState)) {\n nextState.rtcPanel = nextProps.callTopic;\n }\n } else {\n // Invalid topic.\n Object.assign(nextState, {\n messageCount: 0,\n latestClearId: -1,\n onlineSubs: [],\n title: '',\n avatar: null,\n peerMessagingDisabled: false,\n channel: false\n });\n }\n } else {\n // We are still in same topic. Show the call panel if necessary.\n if (nextProps.callTopic == prevState.topic && !prevState.rtcPanel &&\n shouldPresentCallPanel(nextProps.callState)) {\n nextState.rtcPanel = nextProps.callTopic;\n }\n }\n\n if (nextProps.acs) {\n if (nextProps.acs.isWriter() != prevState.isWriter) {\n nextState.isWriter = !prevState.isWriter;\n }\n if (nextProps.acs.isReader() != prevState.isReader) {\n nextState.isReader = !prevState.isReader;\n }\n if (!nextProps.acs.isReader('given') != prevState.readingBlocked) {\n nextState.readingBlocked = !prevState.readingBlocked;\n }\n if (nextProps.acs.isSharer() != prevState.isSharer) {\n nextState.isSharer = !prevState.isSharer;\n }\n } else {\n if (prevState.isWriter) {\n nextState.isWriter = false;\n }\n if (prevState.isReader) {\n nextState.isReader = false;\n }\n if (!prevState.readingBlocked) {\n prevState.readingBlocked = true;\n }\n if (prevState.isSharer) {\n nextState.isSharer = false;\n }\n }\n\n if (isUnconfirmed(nextProps.acs) == !prevState.unconformed) {\n nextState.unconfirmed = !prevState.unconformed;\n }\n\n // Clear subscribers online when there is no connection.\n if (!nextProps.connected && prevState.onlineSubs && prevState.onlineSubs.length > 0) {\n nextState.onlineSubs = [];\n }\n\n return nextState;\n }\n\n subscribe(topic) {\n if (topic.isSubscribed() || !this.props.ready) {\n return;\n }\n\n // Is this a new topic?\n const newTopic = (this.props.newTopicParams && this.props.newTopicParams._topicName == this.props.topic);\n\n // Don't request the tags. They are useless unless the user\n // is the owner and is editing the topic.\n let getQuery = topic.startMetaQuery().withLaterDesc().withLaterSub();\n if (this.state.isReader || newTopic) {\n // Reading is either permitted or we don't know because it's a new topic. Ask for messages.\n getQuery = getQuery.withLaterData(MESSAGES_PAGE);\n if (this.state.isReader) {\n getQuery = getQuery.withLaterDel();\n }\n // And show \"loading\" spinner.\n this.setState({ fetchingMessages: true });\n }\n\n const setQuery = newTopic ? this.props.newTopicParams : undefined;\n topic.subscribe(getQuery.build(), setQuery)\n .then(ctrl => {\n if (ctrl.code == 303) {\n // Redirect to another topic requested.\n HashNavigation.navigateTo(HashNavigation.setUrlTopic('', ctrl.params.topic));\n return;\n }\n if (this.state.topic != ctrl.topic) {\n this.setState({topic: ctrl.topic});\n }\n this.props.onNewTopicCreated(this.props.topic, ctrl.topic);\n // If there are unsent messages (except video call messages),\n // try sending them now. Unsent video call messages will be dropped.\n let calls = [];\n topic.queuedMessages((pub) => {\n if (pub._sending) {\n return;\n }\n if (pub.head && pub.head.webrtc) {\n // Filter out unsent video call messages.\n calls.push(pub.seq);\n return;\n }\n if (topic.isSubscribed()) {\n this.retrySend(pub);\n }\n });\n if (calls.length > 0) {\n topic.delMessagesList(calls, true);\n }\n })\n .catch(err => {\n console.error(\"Failed subscription to\", this.state.topic, err);\n this.props.onError(err.message, 'err');\n const blankState = MessagesView.getDerivedStateFromProps({}, {});\n blankState.title = this.props.intl.formatMessage(messages.not_found);\n this.setState(blankState);\n });\n }\n\n leave(oldTopicName) {\n if (!oldTopicName || !this.props.tinode.isTopicCached(oldTopicName)) {\n return;\n }\n\n const oldTopic = this.props.tinode.getTopic(oldTopicName);\n if (oldTopic && oldTopic.isSubscribed()) {\n oldTopic.leave(false)\n .catch(_ => { /* do nothing here */ })\n .finally(_ => {\n // We don't care if the request succeeded or failed.\n // The topic is dead regardless.\n this.setState({fetchingMessages: false});\n oldTopic.onData = undefined;\n oldTopic.onAllMessagesReceived = undefined;\n oldTopic.onInfo = undefined;\n oldTopic.onMetaDesc = undefined;\n oldTopic.onSubsUpdated = undefined;\n oldTopic.onPres = undefined;\n });\n }\n }\n\n // Don't use React.createRef as the ref.current is not available in componentDidMount in this component.\n handleScrollReference(node) {\n if (node) {\n node.addEventListener('scroll', this.handleScrollEvent);\n this.messagesScroller = node;\n this.messagesScroller.scrollTop = this.messagesScroller.scrollHeight - this.state.scrollPosition;\n }\n }\n\n // Get older messages and show/hide [go to latest message] button.\n handleScrollEvent(event) {\n const pos = event.target.scrollHeight - event.target.scrollTop - event.target.offsetHeight;\n this.setState({\n scrollPosition: pos,\n // Show [go to latest message] if far enough from bottom and scrolling down.\n showGoToLastButton: (pos > SHOW_GO_TO_LAST_DIST) && (pos < this.state.scrollPosition),\n });\n\n if (this.state.fetchingMessages) {\n return;\n }\n\n if (event.target.scrollTop <= 0) {\n const topic = this.props.tinode.getTopic(this.state.topic);\n if (topic && topic.isSubscribed() && topic.msgHasMoreMessages()) {\n this.setState({fetchingMessages: true}, _ => {\n topic.getMessagesPage(MESSAGES_PAGE)\n .catch(err => this.props.onError(err.message, 'err'))\n .finally(_ => this.setState({fetchingMessages: false}));\n });\n }\n }\n }\n\n /* Mound draf and drop events */\n mountDnDEvents(dnd) {\n if (dnd) {\n dnd.addEventListener('dragenter', this.handleDragIn);\n dnd.addEventListener('dragleave', this.handleDragOut);\n dnd.addEventListener('dragover', this.handleDrag);\n dnd.addEventListener('drop', this.handleDrop);\n this.dndRef = dnd;\n }\n }\n\n goToLatestMessage() {\n this.setState({scrollPosition: 0});\n if (this.messagesScroller) {\n this.messagesScroller.scrollTop = this.messagesScroller.scrollHeight;\n }\n }\n\n handleDescChange(desc) {\n if (desc.public) {\n this.setState({\n title: desc.public.fn,\n avatar: makeImageUrl(desc.public.photo)\n });\n } else {\n this.setState({\n title: '',\n avatar: null\n });\n }\n\n if (desc.acs) {\n this.setState({\n isWriter: desc.acs.isWriter(),\n isReader: desc.acs.isReader(),\n readingBlocked: !desc.acs.isReader('given'),\n unconfirmed: isUnconfirmed(desc.acs),\n });\n }\n }\n\n postReadNotification(seq) {\n // Ignore notifications if the app is invisible.\n if (!this.props.applicationVisible) {\n return;\n }\n\n // Set up the timer if it's not running already.\n if (!this.readNotificationTimer) {\n this.readNotificationTimer = setInterval(_ => {\n if (this.readNotificationQueue.length == 0) {\n // Shut down the timer if the queue is empty.\n clearInterval(this.readNotificationTimer);\n this.readNotificationTimer = null;\n return;\n }\n\n let seq = -1;\n while (this.readNotificationQueue.length > 0) {\n const n = this.readNotificationQueue[0];\n if (n.topicName != this.state.topic) {\n // Topic has changed. Drop the notification.\n this.readNotificationQueue.shift();\n continue;\n }\n\n const now = new Date();\n if (n.sendAt <= now) {\n // Remove expired notification from queue.\n this.readNotificationQueue.shift();\n seq = Math.max(seq, n.seq);\n } else {\n break;\n }\n }\n\n // Send only one notification for the whole batch of messages.\n if (seq >= 0) {\n const topic = this.props.tinode.getTopic(this.state.topic);\n if (topic) {\n topic.noteRead(seq);\n }\n }\n }, NOTIFICATION_EXEC_INTERVAL);\n }\n\n const now = new Date();\n this.readNotificationQueue.push({\n topicName: this.state.topic,\n seq: seq,\n sendAt: now.setMilliseconds(now.getMilliseconds() + READ_DELAY)\n });\n }\n\n // Clear notification queue and timer.\n clearNotificationQueue() {\n this.readNotificationQueue = [];\n if (this.readNotificationTimer) {\n clearInterval(this.readNotificationTimer);\n this.readNotificationTimer = null;\n }\n }\n\n handleSubsUpdated() {\n if (this.state.topic) {\n const subs = [];\n const topic = this.props.tinode.getTopic(this.state.topic);\n topic.subscribers((sub) => {\n if (sub.online && sub.user != this.props.myUserId) {\n subs.push(sub);\n }\n });\n const newState = {onlineSubs: subs};\n const peer = topic.p2pPeerDesc();\n if (peer) {\n Object.assign(newState, {\n peerMessagingDisabled: isPeerRestricted(peer.acs)\n });\n } else if (this.state.peerMessagingDisabled) {\n Object.assign(newState, {\n peerMessagingDisabled: false\n });\n }\n this.setState(newState);\n }\n }\n\n // The 'msg' could be false-ish if some message ranges were deleted.\n handleMessageUpdate(msg) {\n const topic = this.props.tinode.getTopic(this.state.topic);\n if (!msg) {\n // msg could be null if one or more messages were deleted.\n // Updating state to force redraw.\n this.setState({latestClearId: topic.maxClearId()});\n return;\n }\n\n clearTimeout(this.keyPressTimer)\n this.setState({messageCount: topic.messageCount(), typingIndicator: false}, _ => {\n // Scroll to the bottom if the message is added to the end of the message\n // list if already at the bottom, otherwise show [go to latest] button.\n // Implemented as a callback to be sure the scroll height has been updated.\n if (topic.isNewMessage(msg.seq)) {\n if (this.state.scrollPosition > SHOW_GO_TO_LAST_DIST) {\n this.setState({showGoToLastButton: true});\n } else {\n this.goToLatestMessage();\n }\n }\n });\n\n // Aknowledge messages except own messages. They are\n // automatically assumed to be read and recived.\n const status = topic.msgStatus(msg, true);\n if (status >= Tinode.MESSAGE_STATUS_SENT && msg.from != this.props.myUserId) {\n this.postReadNotification(msg.seq);\n }\n }\n\n handleAllMessagesReceived(count) {\n this.setState({fetchingMessages: false});\n if (count > 0) {\n // 0 means \"latest\".\n this.postReadNotification(0);\n }\n }\n\n handleInfoReceipt(info) {\n switch (info.what) {\n case 'kp': {\n clearTimeout(this.keyPressTimer);\n this.keyPressTimer = setTimeout(_ => this.setState({typingIndicator: false}), KEYPRESS_DELAY + 1000);\n if (!this.state.typingIndicator) {\n this.setState({typingIndicator: true});\n }\n break;\n }\n case 'read':\n case 'recv':\n // Redraw due to changed recv/read status.\n this.forceUpdate();\n break;\n default:\n console.info(\"Other change in topic: \", info.what);\n }\n }\n\n handleExpandMedia(content) {\n if (!content) {\n return;\n }\n\n if (content.video) {\n this.setState({ videoPostview: content });\n } else {\n this.setState({ imagePostview: content });\n }\n }\n\n handleClosePreview() {\n if (this.state.imagePreview && this.state.imagePreview.url) {\n URL.revokeObjectURL(this.state.imagePreview.url);\n }\n if (this.state.videoPreview && this.state.videoPreview.url) {\n URL.revokeObjectURL(this.state.videoPreview.url);\n }\n this.setState({ imagePostview: null, imagePreview: null, docPreview: null, videoPreview: null, videoPostview: null});\n }\n\n handleFormResponse(action, text, data) {\n if (action == 'pub') {\n this.sendMessage(Drafty.attachJSON(Drafty.parse(text), data));\n } else if (action == 'url') {\n const url = new URL(data.ref);\n const params = url.searchParams;\n for (let key in data.resp) {\n if (data.resp.hasOwnProperty(key)) {\n params.set(key, data.resp[key]);\n }\n }\n ['name', 'seq'].map((key) => {\n if (data[key]) {\n params.set(key, data[key]);\n }\n });\n params.set('uid', this.props.myUserId);\n params.set('topic', this.state.topic);\n url.search = params;\n window.open(url, '_blank');\n } else {\n console.info(\"Unknown action in form\", action);\n }\n }\n\n handleContextClick(e) {\n e.preventDefault();\n e.stopPropagation();\n this.props.showContextMenu({ topicName: this.state.topic, y: e.pageY, x: e.pageX });\n }\n\n handleShowMessageContextMenu(params, messageSpecificMenuItems) {\n if (params.userFrom == 'chan') {\n params.userFrom = this.state.topic;\n params.userName = this.state.title;\n }\n params.topicName = this.state.topic;\n const menuItems = messageSpecificMenuItems || [];\n const topic = this.props.tinode.getTopic(params.topicName);\n if (topic) {\n if (!topic.isChannelType()) {\n menuItems.push('message_delete');\n }\n const acs = topic.getAccessMode();\n if (acs && acs.isDeleter()) {\n menuItems.push('message_delete_hard');\n }\n }\n this.props.showContextMenu(params, menuItems);\n }\n\n handleNewChatAcceptance(action) {\n this.props.onNewChat(this.state.topic, action);\n }\n\n handleEnablePeer(e) {\n e.preventDefault();\n this.props.onChangePermissions(this.state.topic, DEFAULT_P2P_ACCESS_MODE, this.state.topic);\n }\n\n sendKeyPress(audio) {\n const topic = this.props.tinode.getTopic(this.state.topic);\n if (topic.isSubscribed()) {\n if (audio) {\n topic.noteRecording(true);\n } else {\n topic.noteKeyPress();\n }\n }\n }\n\n // sendMessage sends the message with an optional subscription to topic first.\n sendMessage(msg, uploadCompletionPromise, uploader) {\n let head;\n if (this.props.forwardMessage) {\n // We are forwarding a message.\n msg = this.props.forwardMessage.msg;\n head = this.props.forwardMessage.head;\n this.handleCancelReply();\n } else if (this.state.reply) {\n if (this.state.reply.editing) {\n if (msg == this.state.contentToEdit) {\n // Message unchanged.\n this.handleCancelReply();\n return;\n }\n // Editing an existing message.\n head = {replace: ':' + this.state.reply.seq};\n } else if (this.state.reply.content) {\n // Replying to a message in this topic.\n // Turn it into Drafty so we can make a quoted Drafty object later.\n head = {reply: '' + this.state.reply.seq};\n if (typeof msg == 'string') {\n msg = Drafty.parse(msg);\n }\n msg = Drafty.append(Drafty.sanitizeEntities(this.state.reply.content), msg);\n }\n this.handleCancelReply();\n }\n this.props.sendMessage(msg, uploadCompletionPromise, uploader, head);\n }\n\n // Retry sending a message.\n retrySend(pub) {\n this.props.sendMessage(pub.content, undefined, undefined, pub.head)\n .then(_ => {\n // All good. Remove the original message draft from the cache.\n const topic = this.props.tinode.getTopic(this.state.topic);\n topic.delMessagesList([pub.seq], true);\n });\n }\n\n // Send attachment as Drafty message:\n // - if file is too large, upload it and send a s link.\n // - if file is small enough, just send it in-band.\n sendFileAttachment(file) {\n // Server-provided limit reduced for base64 encoding and overhead.\n const maxInbandAttachmentSize = (this.props.tinode.getServerParam('maxMessageSize',\n MAX_INBAND_ATTACHMENT_SIZE) * 0.75 - 1024) | 0;\n\n if (file.size > maxInbandAttachmentSize) {\n // Too large to send inband - uploading out of band and sending as a link.\n const uploader = this.props.tinode.getLargeFileHelper();\n if (!uploader) {\n this.props.onError(this.props.intl.formatMessage(messages.cannot_initiate_upload));\n return;\n }\n const uploadCompletionPromise = uploader.upload(file);\n const msg = Drafty.attachFile(null, {\n mime: file.type,\n filename: file.name,\n size: file.size,\n urlPromise: uploadCompletionPromise\n });\n // Pass data and the uploader to the TinodeWeb.\n this.sendMessage(msg, uploadCompletionPromise, uploader);\n } else {\n // Small enough to send inband.\n fileToBase64(file)\n .then(b64 => this.sendMessage(Drafty.attachFile(null, {\n mime: b64.mime,\n data: b64.bits,\n filename: b64.name,\n size: file.size\n })))\n .catch(err => this.props.onError(err.message, 'err'));\n }\n }\n\n // handleAttachFile method is called when [Attach file] button is clicked: launch attachment preview.\n handleAttachFile(file) {\n const maxExternAttachmentSize = this.props.tinode.getServerParam('maxFileUploadSize', MAX_EXTERN_ATTACHMENT_SIZE);\n\n if (file.size > maxExternAttachmentSize) {\n // Too large.\n this.props.onError(this.props.intl.formatMessage(messages.file_attachment_too_large,\n {size: bytesToHumanSize(file.size), limit: bytesToHumanSize(maxExternAttachmentSize)}), 'err');\n } else {\n this.setState({\n docPreview: {\n file: file,\n name: file.name,\n size: file.size,\n type: file.type\n }\n });\n }\n }\n\n handleCallHangup(topic, seq) {\n this.props.onVideoCallClosed();\n this.setState({\n rtcPanel: null\n });\n this.props.onCallHangup(topic, seq);\n }\n\n // sendImageAttachment sends the image bits as Drafty message.\n sendImageAttachment(caption, blob) {\n const mime = this.state.imagePreview.mime;\n const width = this.state.imagePreview.width;\n const height = this.state.imagePreview.height;\n const fname = this.state.imagePreview.filename;\n\n // Server-provided limit reduced for base64 encoding and overhead.\n const maxInbandAttachmentSize = (this.props.tinode.getServerParam('maxMessageSize',\n MAX_INBAND_ATTACHMENT_SIZE) * 0.75 - 1024) | 0;\n\n if (blob.size > maxInbandAttachmentSize) {\n // Too large to send inband - uploading out of band and sending as a link.\n const uploader = this.props.tinode.getLargeFileHelper();\n if (!uploader) {\n this.props.onError(this.props.intl.formatMessage(messages.cannot_initiate_upload));\n return;\n }\n const uploadCompletionPromise = uploader.upload(blob);\n\n // Make small preview to show while uploading.\n imageScaled(blob, IMAGE_PREVIEW_DIM, IMAGE_PREVIEW_DIM, -1, false)\n // Convert tiny image into base64 for serialization and previewing.\n .then(scaled => blobToBase64(scaled.blob))\n .then(b64 => {\n let msg = Drafty.insertImage(null, 0, {\n mime: mime,\n _tempPreview: b64.bits, // This preview will not be serialized.\n bits: b64.bits, // Image thumbnail.\n width: width,\n height: height,\n filename: fname,\n size: blob.size,\n urlPromise: uploadCompletionPromise\n });\n if (caption) {\n msg = Drafty.appendLineBreak(msg);\n msg = Drafty.append(msg, Drafty.parse(caption));\n }\n // Pass data and the uploader to the TinodeWeb.\n this.sendMessage(msg, uploadCompletionPromise, uploader);\n })\n .catch(err => this.props.onError(err, 'err'));\n return;\n }\n\n // Send the image inband if it's not too big. The image has been scaled already\n // in image preview.\n blobToBase64(blob)\n .then(b64 => {\n let msg = Drafty.insertImage(null, 0, {\n mime: b64.mime,\n bits: b64.bits,\n width: width,\n height: height,\n filename: fname,\n size: blob.size\n });\n if (caption) {\n msg = Drafty.appendLineBreak(msg);\n msg = Drafty.append(msg, Drafty.parse(caption));\n }\n this.sendMessage(msg);\n });\n }\n\n // sendVideoAttachment sends the video bits as Drafty message.\n sendVideoAttachment(caption, videoBlob, previewBlob, params) {\n const width = params.width;\n const height = params.height;\n\n // Server-provided limit reduced for base64 encoding and overhead.\n const maxInbandAttachmentSize = (this.props.tinode.getServerParam('maxMessageSize',\n MAX_INBAND_ATTACHMENT_SIZE) * 0.75 - 1024) | 0;\n\n const uploads = [];\n let uploader;\n if ((videoBlob.size + previewBlob.size) > maxInbandAttachmentSize) {\n // One or both are too large to send inband. Uploading out of band and sending as a link.\n uploader = this.props.tinode.getLargeFileHelper();\n if (!uploader) {\n this.props.onError(this.props.intl.formatMessage(messages.cannot_initiate_upload));\n return;\n }\n\n uploads[0] = videoBlob.size > maxInbandAttachmentSize * 0.675 ? uploader.upload(videoBlob) : null;\n uploads[1] = previewBlob.size > maxInbandAttachmentSize * 0.275 ? uploader.upload(previewBlob) : null;\n }\n\n if (uploads.length == 0) {\n // Both video and preview are small enough to send inband.\n Promise.all([blobToBase64(videoBlob), blobToBase64(previewBlob)])\n .then(b64s => {\n const [v64, i64] = b64s;\n let msg = Drafty.insertVideo(null, 0, {\n mime: v64.mime,\n bits: v64.bits,\n preview: i64.bits,\n premime: i64.mime,\n width: width,\n height: height,\n duration: params.duration,\n filename: params.name,\n size: videoBlob.size\n });\n if (caption) {\n msg = Drafty.appendLineBreak(msg);\n msg = Drafty.append(msg, Drafty.parse(caption));\n }\n this.sendMessage(msg);\n });\n return;\n }\n\n const uploadCompletionPromise = Promise.all(uploads);\n\n const b64conv = [];\n // Small video converted to base64.\n b64conv[0] = uploads[0] ? null : blobToBase64(videoBlob);\n // Full-size preview fits inline.\n b64conv[1] = uploads[1] ? null : imageScaled(previewBlob, MAX_IMAGE_DIM, MAX_IMAGE_DIM, -1, false)\n .then(scaled => blobToBase64(scaled.blob));\n // Small preview to show while uploading.\n b64conv[2] = imageScaled(previewBlob, VIDEO_PREVIEW_DIM, VIDEO_PREVIEW_DIM, -1, false)\n .then(scaled => blobToBase64(scaled.blob));\n Promise.all(b64conv)\n // Convert tiny image into base64 for serialization and previewing.\n .then(b64s => {\n const [video, img, preview] = b64s;\n let msg = Drafty.insertVideo(null, 0, {\n mime: params.mime,\n bits: video ? video.bits : null,\n _tempPreview: preview.bits,\n preview: img ? img.bits : preview.bits,\n premime: img ? img.mime : preview.mime,\n width: width,\n height: height,\n duration: params.duration,\n filename: params.name,\n size: videoBlob.size,\n urlPromise: uploadCompletionPromise\n });\n if (caption) {\n msg = Drafty.appendLineBreak(msg);\n msg = Drafty.append(msg, Drafty.parse(caption));\n }\n // Pass data and the uploader to the TinodeWeb.\n this.sendMessage(msg, uploadCompletionPromise, uploader);\n })\n .catch(err => this.props.onError(err.message, 'err'));\n }\n\n // handleAttachImageOrVideo method is called when [Attach image or video] button is clicked: launch image or video preview.\n handleAttachImageOrVideo(file) {\n const maxExternAttachmentSize = this.props.tinode.getServerParam('maxFileUploadSize', MAX_EXTERN_ATTACHMENT_SIZE);\n\n if (file.type.startsWith('video/')) {\n this.setState({videoPreview: {\n url: URL.createObjectURL(file),\n blob: file,\n filename: file.name,\n size: file.size,\n mime: file.type\n }});\n return;\n }\n\n // Get image dimensions and size, optionally scale it down.\n imageScaled(file, MAX_IMAGE_DIM, MAX_IMAGE_DIM, maxExternAttachmentSize, false)\n .then(scaled => {\n this.setState({imagePreview: {\n url: URL.createObjectURL(scaled.blob),\n blob: scaled.blob,\n filename: scaled.name,\n width: scaled.width,\n height: scaled.height,\n size: scaled.blob.size,\n mime: scaled.mime\n }});\n }).catch(err => {\n this.props.onError(err.message, 'err');\n });\n }\n\n // handleFileDrop is called when the user drags & drops a file upon the message view.\n handleFileDrop(files) {\n if (!files || files.length == 0) {\n return;\n }\n const file = files[0];\n if (file.type && file.type.startsWith('image/')) {\n this.handleAttachImageOrVideo(file);\n } else {\n this.handleAttachFile(file);\n }\n }\n\n // sendAudioAttachment sends audio bits inband as Drafty message (no preview).\n sendAudioAttachment(url, preview, duration) {\n fetch(url)\n .then(result => result.blob())\n .then(blob => {\n // Server-provided limit reduced for base64 encoding and overhead.\n const maxInbandAttachmentSize = this.props.tinode.getServerParam('maxMessageSize', MAX_INBAND_ATTACHMENT_SIZE) * 0.75 - 1024;\n if (blob.size > maxInbandAttachmentSize) {\n // Too large to send inband - uploading out of band and sending as a link.\n const uploader = this.props.tinode.getLargeFileHelper();\n if (!uploader) {\n this.props.onError(this.props.intl.formatMessage(messages.cannot_initiate_upload));\n return;\n }\n const uploadCompletionPromise = uploader.upload(blob);\n const msg = Drafty.appendAudio(null, {\n mime: blob.type,\n size: blob.size,\n duration: duration,\n preview: preview,\n urlPromise: uploadCompletionPromise\n });\n // Pass data and the uploader to the TinodeWeb.\n this.sendMessage(msg, uploadCompletionPromise, uploader);\n } else {\n // Small enough to send inband.\n blobToBase64(blob)\n .then(b64 => {\n this.sendMessage(Drafty.appendAudio(null, {\n mime: b64.mime,\n bits: b64.bits,\n size: blob.size,\n duration: duration,\n preview: preview,\n }))\n })\n }\n })\n .catch(err => {this.props.onError(err.message, 'err')});;\n }\n\n handleCancelUpload(seq, uploader) {\n const topic = this.props.tinode.getTopic(this.state.topic);\n const found = topic.findMessage(seq);\n if (found) {\n found._cancelled = true;\n }\n uploader.cancel();\n }\n\n // seq: seq ID of the source message\n // context: message content.\n // senderId: UID of the sender of the source message.\n // senderName: full name of the sender of the original message.\n handlePickReply(seq, content, senderId, senderName) {\n if (!seq || !content) {\n this.setState({reply: null});\n return;\n }\n\n content = typeof content == 'string' ? Drafty.init(content) : content;\n if (Drafty.isValid(content)) {\n content = Drafty.replyContent(content, QUOTED_REPLY_LENGTH);\n } else {\n // /!\\ invalid content.\n content = Drafty.append(Drafty.init('\\u26A0 '),\n Drafty.wrapInto(this.props.intl.formatMessage(messages.invalid_content), 'EM'));\n }\n\n this.setState({\n reply: {\n content: Drafty.quote(senderName, senderId, content),\n seq: seq\n }\n });\n this.props.onCancelForwardMessage();\n }\n\n // seq: seq ID of the message to edit.\n // context: message content.\n handleEditMessage(seq, content) {\n if (!seq || !content) {\n this.setState({reply: null});\n return;\n }\n\n content = typeof content == 'string' ? Drafty.init(content) : content;\n const editable = Drafty.toMarkdown(content);\n if (Drafty.isValid(content)) {\n content = Drafty.replyContent(content, EDIT_PREVIEW_LENGTH);\n } else {\n // /!\\ invalid content.\n content = Drafty.append(Drafty.init('\\u26A0 '),\n Drafty.wrapInto(this.props.intl.formatMessage(messages.invalid_content), 'EM'));\n }\n\n this.setState({\n reply: {\n content: Drafty.quote(this.props.intl.formatMessage(messages.editing_message), null, content),\n seq: seq,\n editing: true\n },\n contentToEdit: editable\n });\n this.props.onCancelForwardMessage();\n }\n\n\n handleCancelReply() {\n this.setState({reply: null, contentToEdit: null});\n this.props.onCancelForwardMessage();\n }\n\n handleQuoteClick(replyToSeq) {\n const ref = this.getOrCreateMessageRef(replyToSeq);\n if (ref && ref.current) {\n ref.current.scrollIntoView({block: \"center\", behavior: \"smooth\"});\n ref.current.classList.add('flash');\n setTimeout(_ => {ref.current.classList.remove('flash')} , 1000);\n } else {\n console.error(\"Unresolved message ref\", replyToSeq);\n }\n }\n\n isDragEnabled() {\n return this.state.isWriter && !this.state.unconfirmed && !this.props.forwardMessage && !this.state.peerMessagingDisabled;\n }\n\n handleDrag(e) {\n e.preventDefault();\n e.stopPropagation();\n }\n\n handleDragIn(e) {\n e.preventDefault();\n e.stopPropagation();\n this.dragCounter++;\n if (e.dataTransfer.items && e.dataTransfer.items.length > 0) {\n this.setState({dragging: true});\n }\n }\n\n handleDragOut(e) {\n e.preventDefault();\n e.stopPropagation();\n this.dragCounter--;\n if (this.dragCounter <= 0) {\n this.setState({dragging: false});\n }\n }\n\n handleDrop(e) {\n e.preventDefault();\n e.stopPropagation();\n this.setState({dragging: false});\n if (this.isDragEnabled() && e.dataTransfer.files && e.dataTransfer.files.length > 0) {\n this.handleFileDrop(e.dataTransfer.files);\n e.dataTransfer.clearData();\n this.dragCounter = 0;\n }\n }\n\n render() {\n const {formatMessage} = this.props.intl;\n\n let component;\n if (this.props.hideSelf) {\n component = null;\n } else if (!this.state.topic) {\n component = (\n \n );\n } else {\n let component2;\n if (this.state.imagePreview) {\n // Preview image before sending.\n component2 = (\n \n );\n } else if (this.state.videoPreview) {\n // Preview video.\n component2 = (\n \n );\n } else if (this.state.imagePostview) {\n // Expand received image.\n component2 = (\n \n );\n } else if (this.state.videoPostview) {\n // Play received video.\n component2 = (\n \n );\n } else if (this.state.docPreview) {\n // Preview attachment before sending.\n component2 = (\n \n );\n } else if (this.state.rtcPanel) {\n component2 = (\n \n );\n } else {\n const topic = this.props.tinode.getTopic(this.state.topic);\n const isChannel = topic.isChannelType();\n const groupTopic = topic.isGroupType() && !isChannel;\n const icon_badges = [];\n if (topic.trusted) {\n if (topic.trusted.verified) {\n icon_badges.push({icon: 'verified', color: 'badge-inv'});\n }\n if (topic.trusted.staff) {\n icon_badges.push({icon: 'staff', color: 'badge-inv'});\n }\n if (topic.trusted.danger) {\n icon_badges.push({icon: 'dangerous', color: 'badge-inv'});\n }\n }\n\n const messageNodes = [];\n let previousFrom = null;\n let prevDate = null;\n let chatBoxClass = null;\n topic.messages((msg, prev, next, i) => {\n let nextFrom = next ? (next.from || 'chan') : null;\n\n let sequence = 'single';\n let thisFrom = msg.from || 'chan';\n if (thisFrom == previousFrom) {\n if (thisFrom == nextFrom) {\n sequence = 'middle';\n } else {\n sequence = 'last';\n }\n } else if (thisFrom == nextFrom) {\n sequence = 'first';\n }\n previousFrom = thisFrom;\n\n const isReply = !(thisFrom == this.props.myUserId);\n const deliveryStatus = topic.msgStatus(msg, true);\n\n let userFrom = thisFrom, userName, userAvatar;\n const user = topic.userDesc(thisFrom);\n if (user && user.public) {\n userName = user.public.fn;\n userAvatar = makeImageUrl(user.public.photo);\n }\n chatBoxClass = groupTopic ? 'chat-box group' : 'chat-box';\n\n // Ref for this chat message.\n const ref = this.getOrCreateMessageRef(msg.seq);\n let replyToSeq = msg.head ? parseInt(msg.head.reply) : null;\n if (!replyToSeq || isNaN(replyToSeq)) {\n replyToSeq = null;\n }\n\n if (msg.hi) {\n // Deleted message.\n messageNodes.push(\n \n );\n } else {\n const thisDate = new Date(msg.ts);\n // This message was sent on a different date than the previous.\n if (!prevDate || prevDate.toDateString() != thisDate.toDateString()) {\n messageNodes.push(\n \n );\n prevDate = thisDate;\n }\n messageNodes.push(\n \n );\n }\n });\n\n let lastSeen = null;\n if (isChannel) {\n lastSeen = formatMessage(messages.channel);\n } else {\n const cont = this.props.tinode.getMeTopic().getContact(this.state.topic);\n if (cont && Tinode.isP2PTopicName(cont.topic)) {\n if (cont.online) {\n lastSeen = formatMessage(messages.online_now);\n } else if (cont.seen) {\n lastSeen = formatMessage(messages.last_seen) + \": \" +\n shortDateFormat(cont.seen.when, this.props.intl.locale);\n // TODO: also handle user agent in c.seen.ua\n }\n }\n }\n const avatar = this.state.avatar || true;\n const online = this.state.deleted ? null :\n this.props.online ? 'online' + (this.state.typingIndicator ? ' typing' : '') : 'offline';\n\n const titleClass = 'panel-title' + (this.state.deleted ? ' deleted' : '');\n\n let messagesComponent = (\n <>\n \n
\n arrow_downward \n \n
\n {!this.state.isReader ?\n
\n {this.state.readingBlocked ?\n
\n \n
\n : null }\n
\n : null }\n
\n {this.state.peerMessagingDisabled && !this.state.unconfirmed ?\n : null}\n {this.state.unconfirmed ?\n \n :\n }\n >\n );\n\n component2 = (\n <>\n \n {this.props.displayMobile ?\n \n : null}\n \n {messagesComponent}\n {this.state.dragging && this.isDragEnabled() ?\n {formatMessage(messages.drag_file)}
\n : null}\n >\n );\n }\n component = {component2}
\n }\n return component;\n }\n};\n\nexport default injectIntl(MessagesView);\n","// Create new topic and invite users or send an invite.\nimport React from 'react';\nimport { FormattedMessage, defineMessages, injectIntl } from 'react-intl';\n\nimport { Tinode } from 'tinode-sdk';\n\nimport ContactList from '../widgets/contact-list.jsx';\nimport NewTopicById from '../widgets/new-topic-by-id.jsx';\nimport NewTopicGroup from '../widgets/new-topic-group.jsx';\nimport SearchContacts from '../widgets/search-contacts.jsx';\n\nimport HashNavigation from '../lib/navigation.js';\nimport { theCard } from '../lib/utils.js';\n\nconst messages = defineMessages({\n search_for_contacts: {\n id: \"search_for_contacts\",\n defaultMessage: \"Use search to find contacts\",\n description: \"Text shown in contacts view when user entered no search query.\"\n },\n search_no_results: {\n id: \"search_no_results\",\n defaultMessage: \"Search returned no results\",\n description: \"Text shown in contacts view when query returned no results.\"\n },\n search_placeholder: {\n id: \"search_placeholder\",\n defaultMessage: \"List like email:alice@example.com, tel:17025550003...\",\n description: \"Placeholder in contacts search field\"\n },\n});\n\nclass NewTopicView extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = {\n tabSelected: 'find',\n searchQuery: null\n };\n\n this.handleTabClick = this.handleTabClick.bind(this);\n this.handleSearchContacts = this.handleSearchContacts.bind(this);\n this.handleSearchResultSelected = this.handleSearchResultSelected.bind(this);\n this.handleNewGroupSubmit = this.handleNewGroupSubmit.bind(this);\n this.handleGroupByID = this.handleGroupByID.bind(this);\n }\n\n componentDidMount() {\n this.props.onInitFind();\n }\n\n handleTabClick(e) {\n e.preventDefault();\n HashNavigation.navigateTo(HashNavigation.addUrlParam(window.location.hash, 'tab', e.currentTarget.dataset.id));\n this.setState({tabSelected: e.currentTarget.dataset.id});\n }\n\n handleSearchContacts(query) {\n this.props.onSearchContacts(query);\n this.setState({searchQuery: Tinode.isNullValue(query) ? null : query});\n }\n\n handleSearchResultSelected(name) {\n if (this.state.tabSelected == 'find') {\n HashNavigation.navigateTo(HashNavigation.removeUrlParam(window.location.hash, 'tab'));\n this.props.onCreateTopic(name);\n }\n }\n\n handleNewGroupSubmit(name, description, dataUrl, priv, tags, isChannel) {\n HashNavigation.navigateTo(HashNavigation.removeUrlParam(window.location.hash, 'tab'));\n this.props.onCreateTopic(undefined,\n {public: theCard(name, dataUrl, null, description), private: priv, tags: tags}, isChannel);\n }\n\n handleGroupByID(topicName) {\n HashNavigation.navigateTo(HashNavigation.removeUrlParam(window.location.hash, 'tab'));\n this.props.onCreateTopic(topicName);\n }\n\n render() {\n const {formatMessage} = this.props.intl;\n const no_contacts_placeholder = formatMessage(this.state.searchQuery ?\n messages.search_no_results : messages.search_for_contacts);\n const search_placeholder = formatMessage(messages.search_placeholder);\n return (\n \n
\n {this.state.tabSelected === 'grp' ?\n
:\n this.state.tabSelected === 'byid' ?\n
:\n
\n \n \n
}\n
\n );\n }\n};\n\nexport default injectIntl(NewTopicView);\n","// A password reset form.\nimport React, { Suspense } from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nconst PhoneEdit = React.lazy(_ => import('../widgets/phone-edit.jsx'));\nimport VisiblePassword from '../widgets/visible-password.jsx';\n\nimport HashNavigation from '../lib/navigation.js';\n\nexport default class PasswordResetView extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.state = {\n tel: '',\n email: '',\n password: '',\n sent: false,\n haveCode: false,\n code: ''\n };\n\n this.handleSubmit = this.handleSubmit.bind(this);\n this.handleEmailChange = this.handleEmailChange.bind(this);\n this.handlePasswordChange = this.handlePasswordChange.bind(this);\n this.handleCodeChange = this.handleCodeChange.bind(this);\n this.handleShowCodeField = this.handleShowCodeField.bind(this);\n\n // Connection will trigger change by changing the this.props.serverVersion.\n props.tinode.connect()\n .catch(err => {\n this.props.onError(err.message, 'err');\n });\n }\n\n componentDidMount() {\n const parsed = HashNavigation.parseUrlHash(window.location.hash);\n this.setState({token: parsed.params.token, scheme: parsed.params.scheme});\n }\n\n handleSubmit(e) {\n e.preventDefault();\n if (this.state.token) {\n // Reset using token.\n this.props.onReset(this.state.password.trim(), {\n scheme: 'token',\n token: this.state.token\n });\n } else if (this.state.code && this.method) {\n // Reset using security code.\n // The secret is structured as ::, \"123456:email:alice@example.com\".\n const cred = this.state.email.trim() || this.state.tel.trim();\n this.props.onReset(this.state.password.trim(), {\n scheme: 'code',\n secret: `${this.state.code}:${this.method}:${cred}`\n });\n } else {\n const email = this.state.email.trim();\n const tel = this.state.tel.trim();\n this.setState({email: email, tel: tel});\n this.props.onRequest(this.method, email || tel).then(_ => this.setState({sent: true}));\n }\n }\n\n handleEmailChange(e) {\n this.setState({email: e.target.value});\n }\n\n handlePasswordChange(e) {\n this.setState({password: e.target.value});\n }\n\n handleCodeChange(e) {\n this.setState({code: e.target.value.replace(/[^\\d]/g, '')});\n }\n\n handleShowCodeField(e) {\n e.preventDefault();\n this.setState({haveCode: true});\n }\n\n render() {\n // \"reqCred\":{\"auth\":[\"email\"]}\n this.method = (this.props.tinode.getServerParam('reqCred', {}).auth || [])[0] || 'email';\n\n const showCredentialInput = !(this.state.token && this.state.scheme);\n const showPasswordInput = !showCredentialInput || this.state.haveCode || this.state.sent;\n\n const passwordInput = (<>\n \n \n \n {\n (placeholder) => \n } \n >);\n\n const emailInput = (<>\n {this.state.haveCode ?\n null :\n \n \n \n }\n {\n (placeholder) => \n } \n >);\n\n const phoneInput = (<>\n {this.state.haveCode ?\n null :\n \n \n
\n }\n \n \n \n \n
\n \n
}>\n this.setState({tel: number})} />\n \n \n >);\n\n const sentNotification = (<>{\n this.method == 'email' ?\n {this.state.email}}}\n description=\"Notification that the email with password reset instructions has been sent\" />\n : this.method == 'tel' ?\n {this.state.tel}}}\n description=\"Notification that the SMS with password reset instructions has been sent\" />\n :\n null\n }>);\n\n const codeInput = (<>\n \n \n \n \n
\n \n {\n (numbers_only) => \n } \n
\n >);\n\n const credentialInput = this.method == 'email' ? emailInput : this.method == 'tel' ? phoneInput : null;\n\n return (\n \n );\n }\n}\n","// Tinode config panel.\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport CheckBox from '../widgets/checkbox.jsx';\n\nimport HostSelector from '../widgets/host-selector.jsx';\n\nexport default class SettingsView extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.state = {\n transport: props.transport || 'def',\n serverAddress: props.serverAddress,\n secureConnection: props.secureConnection,\n };\n\n this.handleSubmit = this.handleSubmit.bind(this);\n this.handleTransportSelected = this.handleTransportSelected.bind(this);\n this.handleServerAddressChange = this.handleServerAddressChange.bind(this);\n this.handleToggleSecure = this.handleToggleSecure.bind(this);\n }\n\n handleSubmit(e) {\n e.preventDefault();\n this.props.onUpdate({\n transport: this.state.transport,\n serverAddress: this.state.serverAddress,\n secureConnection: this.state.secureConnection,\n });\n }\n\n handleTransportSelected(e) {\n this.setState({transport: e.currentTarget.value});\n }\n\n handleServerAddressChange(name) {\n this.setState({serverAddress: name});\n }\n\n handleToggleSecure(e) {\n this.setState({secureConnection: !this.state.secureConnection});\n }\n\n render() {\n const names = {def: \"default\", ws: \"websocket\", lp: \"long polling\"};\n const transportOptions = [];\n ['def', 'ws', 'lp'].map((item) => {\n const id = 'transport-' + item;\n const name = names[item];\n transportOptions.push(\n \n \n {name} \n \n );\n });\n\n return (\n \n );\n }\n};\n","import React from 'react';\nimport { defineMessages, injectIntl } from 'react-intl';\n\nimport ErrorPanel from '../widgets/error-panel.jsx';\nimport LoadSpinner from '../widgets/load-spinner.jsx';\nimport SideNavbar from '../widgets/side-navbar.jsx';\nimport TopicCommon from '../widgets/topic-common.jsx';\n\nimport AccountSettingsView from './account-settings-view.jsx';\nimport ContactsView from './contacts-view.jsx';\nimport CreateAccountView from './create-account-view.jsx';\nimport AccNotificationsView from './acc-notifications-view.jsx';\nimport AccSecurityView from './acc-security-view.jsx';\nimport AccSupportView from './acc-support-view.jsx';\nimport LoginView from './login-view.jsx';\nimport NewTopicView from './new-topic-view.jsx';\nimport PasswordResetView from './password-reset-view.jsx';\nimport SettingsView from './settings-view.jsx';\nimport ValidationView from './validation-view.jsx';\n\n// Panel titles for translation.\nconst messages = defineMessages({\n login: {\n id: 'sidepanel_title_login',\n description: 'Sidepanel title for LoginView.',\n defaultMessage: 'Sign In'\n },\n register: {\n id: 'sidepanel_title_register',\n description: 'Sidepanel title for CreateAccountView.',\n defaultMessage: 'Create Account'\n },\n settings: {\n id: 'sidepanel_title_settings',\n description: 'Sidepanel title for SettingsView.',\n defaultMessage: 'Settings'\n },\n edit: {\n id: 'sidepanel_title_account_settings',\n description: 'Sidepanel title for AccountSettingsView.',\n defaultMessage: 'Account Settings'\n },\n general: {\n id: 'panel_title_general',\n description: 'Title for TopicCommon.',\n defaultMessage: 'General'\n },\n security: {\n id: 'panel_title_security',\n description: 'Title for TopicSecirity and AccSecurity.',\n defaultMessage: 'Security'\n },\n crop: {\n id: 'panel_title_crop',\n description: 'Title for AvatarCropView.',\n defaultMessage: 'Drag to Adjust'\n },\n notif: {\n id: 'sidepanel_title_acc_notifications',\n description: 'Sidepanel title for AccNotificationsView.',\n defaultMessage: 'Notifications'\n },\n support: {\n id: 'sidepanel_title_acc_support',\n description: 'Sidepanel title for AccSupportView.',\n defaultMessage: 'Support'\n },\n newtpk: {\n id: 'sidepanel_title_newtpk',\n description: 'Sidepanel title for NewTopicView.',\n defaultMessage: 'Start New Chat'\n },\n cred: {\n id: 'sidepanel_title_cred',\n description: 'Sidepanel title for ValidationView.',\n defaultMessage: 'Confirm Credentials'\n },\n reset: {\n id: 'sidepanel_title_reset',\n description: 'Sidepanel title for PasswordResetView.',\n defaultMessage: 'Reset Password'\n },\n archive: {\n id: 'sidepanel_title_archive',\n description: 'Sidepanel title for ContactsView-Archive.',\n defaultMessage: 'Archived Chats'\n },\n blocked: {\n id: 'sidepanel_title_blocked',\n description: 'Sidepanel title for ContactsView-Blocked.',\n defaultMessage: 'Blocked Chats'\n }\n});\n\nclass SidepanelView extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.handleNewTopic = this.handleNewTopic.bind(this);\n }\n\n handleNewTopic() {\n this.props.onNavigate('newtpk');\n }\n\n render() {\n const {formatMessage} = this.props.intl;\n const view = this.props.state || (this.props.myUserId ? 'contacts' : 'login');\n\n let title, avatar, badges;\n if (view == 'contacts') {\n title = this.props.title;\n avatar = this.props.avatar ? this.props.avatar : true;\n badges = this.props.trustedBadges;\n } else {\n title = formatMessage(messages[view]);\n avatar = false;\n badges = null;\n }\n\n let onCancel;\n if (['login', 'contacts'].indexOf(view) == -1) {\n onCancel = this.props.onCancel;\n }\n\n return (\n \n
\n\n
\n\n
\n\n {view === 'login' ?\n
:\n\n view === 'register' ?\n
:\n\n view === 'settings' ?\n
:\n\n view === 'edit' ?\n
:\n\n (view === 'general' || view === 'crop') ?\n
:\n\n view === 'notif' ?\n
:\n\n view === 'security' ?\n
:\n\n view === 'support' ?\n
:\n\n (view === 'contacts' || view == 'archive' || view == 'blocked') ?\n
:\n\n view === 'newtpk' ?\n
:\n\n view === 'cred' ?\n
:\n\n view === 'reset' ?\n
:\n null}\n
\n );\n }\n};\n\nexport default injectIntl(SidepanelView);\n","// The top-level class to hold all functionality together.\nimport React, { Suspense } from 'react';\nimport { FormattedMessage, defineMessages, injectIntl } from 'react-intl';\n\nimport { initializeApp as firebaseInitApp } from 'firebase/app';\nimport { getMessaging as firebaseGetMessaging, getToken as firebaseGetToken,\n deleteToken as firebaseDelToken, onMessage as firebaseOnMessage } from 'firebase/messaging';\n\nimport { Drafty, Tinode } from 'tinode-sdk';\n\nimport Alert from '../widgets/alert.jsx';\nimport ContextMenu from '../widgets/context-menu.jsx';\nimport ForwardDialog from '../widgets/forward-dialog.jsx';\nimport CallIncoming from '../widgets/call-incoming.jsx';\nconst PhoneCountrySelector = React.lazy(_ => import('../widgets/phone-country-selector.jsx'));\n\nimport InfoView from './info-view.jsx';\nimport MessagesView from './messages-view.jsx';\nimport SidepanelView from './sidepanel-view.jsx';\n\nimport { API_KEY, APP_NAME, DEFAULT_P2P_ACCESS_MODE, FORWARDED_PREVIEW_LENGTH, LOGGING_ENABLED,\n MEDIA_BREAKPOINT } from '../config.js';\nimport { CALL_STATE_NONE, CALL_STATE_OUTGOING_INITATED,\n CALL_STATE_INCOMING_RECEIVED, CALL_STATE_IN_PROGRESS,\n CALL_HEAD_STARTED } from '../constants.js';\nimport { PACKAGE_VERSION } from '../version.js';\nimport { base64ReEncode, makeImageUrl } from '../lib/blob-helpers.js';\nimport { detectServerAddress, isLocalHost, isSecureConnection } from '../lib/host-name.js';\nimport LocalStorageUtil from '../lib/local-storage.js';\nimport HashNavigation from '../lib/navigation.js';\nimport { secondsToTime } from '../lib/strformat.js'\nimport { updateFavicon } from '../lib/utils.js';\n\n// Sound to play on message received.\nconst POP_SOUND = new Audio('audio/msg.m4a');\n\nconst messages = defineMessages({\n reconnect_countdown: {\n id: 'reconnect_countdown',\n defaultMessage: 'Disconnected. Reconnecting in {seconds}…',\n description: 'Message shown when an app update is available.'\n },\n reconnect_now: {\n id: 'reconnect_now',\n defaultMessage: 'Try now',\n description: 'Prompt for reconnecting now'\n },\n push_init_failed: {\n id: 'push_init_failed',\n defaultMessage: 'Failed to initialize push notifications',\n description: 'Error message when push notifications have failed to initialize.'\n },\n invalid_security_token: {\n id: 'invalid_security_token',\n defaultMessage: 'Invalid security token',\n description: 'Error message when resetting password.'\n },\n no_connection: {\n id: 'no_connection',\n defaultMessage: 'No connection',\n description: 'Warning that the user is offline.'\n },\n code_doesnot_match: {\n id: 'code_doesnot_match',\n defaultMessage: 'Code does not match',\n description: 'Error message when the credential validation code is incorrect.'\n },\n menu_item_info: {\n id: 'menu_item_info',\n defaultMessage: 'Info',\n description: 'Show extended topic information'\n },\n menu_item_audio_call: {\n id: 'menu_item_audio_call',\n defaultMessage: 'Call',\n description: 'Start audio call'\n },\n menu_item_video_call: {\n id: 'menu_item_video_call',\n defaultMessage: 'Video call',\n description: 'Start video call'\n },\n cred_confirmed_successfully: {\n id: 'cred_confirmed_successfully',\n defaultMessage: 'Confirmed successfully',\n description: 'Message explaining that the credential was successfully validated.'\n }\n});\n\nclass TinodeWeb extends React.Component {\n constructor(props) {\n super(props);\n\n this.selfRef = React.createRef();\n\n this.state = this.getBlankState();\n\n this.handleResize = this.handleResize.bind(this);\n this.handleHashRoute = this.handleHashRoute.bind(this);\n this.handleOnline = this.handleOnline.bind(this);\n this.checkForAppUpdate = this.checkForAppUpdate.bind(this);\n this.handleVisibilityEvent = this.handleVisibilityEvent.bind(this);\n this.handleError = this.handleError.bind(this);\n this.handleLoginRequest = this.handleLoginRequest.bind(this);\n this.handlePersistenceChange = this.handlePersistenceChange.bind(this);\n this.handleConnected = this.handleConnected.bind(this);\n this.handleAutoreconnectIteration = this.handleAutoreconnectIteration.bind(this);\n this.doLogin = this.doLogin.bind(this);\n this.handleLoginSuccessful = this.handleLoginSuccessful.bind(this);\n this.handleDisconnect = this.handleDisconnect.bind(this);\n this.tnMeMetaDesc = this.tnMeMetaDesc.bind(this);\n this.tnMeContactUpdate = this.tnMeContactUpdate.bind(this);\n this.tnMeSubsUpdated = this.tnMeSubsUpdated.bind(this);\n this.resetContactList = this.resetContactList.bind(this);\n this.tnInitFind = this.tnInitFind.bind(this);\n this.tnFndSubsUpdated = this.tnFndSubsUpdated.bind(this);\n this.handleSearchContacts = this.handleSearchContacts.bind(this);\n this.handleTopicSelected = this.handleTopicSelected.bind(this);\n this.handleHideMessagesView = this.handleHideMessagesView.bind(this);\n this.handleSendMessage = this.handleSendMessage.bind(this);\n this.handleNewChatInvitation = this.handleNewChatInvitation.bind(this);\n this.handleNewAccount = this.handleNewAccount.bind(this);\n this.handleNewAccountRequest = this.handleNewAccountRequest.bind(this);\n this.handleUpdatePasswordRequest = this.handleUpdatePasswordRequest.bind(this);\n this.handleUpdateAccountTagsRequest = this.handleUpdateAccountTagsRequest.bind(this);\n this.handleToggleIncognitoMode = this.handleToggleIncognitoMode.bind(this);\n this.handleSettings = this.handleSettings.bind(this);\n this.handleGlobalSettings = this.handleGlobalSettings.bind(this);\n this.handleShowArchive = this.handleShowArchive.bind(this);\n this.handleShowBlocked = this.handleShowBlocked.bind(this);\n this.handleToggleMessageSounds = this.handleToggleMessageSounds.bind(this);\n this.handleCredAdd = this.handleCredAdd.bind(this);\n this.handleCredDelete = this.handleCredDelete.bind(this);\n this.handleCredConfirm = this.handleCredConfirm.bind(this);\n this.initFCMessaging = this.initFCMessaging.bind(this);\n this.toggleFCMToken = this.toggleFCMToken.bind(this);\n this.handlePushMessage = this.handlePushMessage.bind(this);\n this.handleSidepanelCancel = this.handleSidepanelCancel.bind(this);\n this.handleStartTopicRequest = this.handleStartTopicRequest.bind(this);\n this.handleNewTopicCreated = this.handleNewTopicCreated.bind(this);\n this.handleTopicUpdateRequest = this.handleTopicUpdateRequest.bind(this);\n this.handleUnarchive = this.handleUnarchive.bind(this);\n this.handleChangePermissions = this.handleChangePermissions.bind(this);\n this.handleTagsUpdateRequest = this.handleTagsUpdateRequest.bind(this);\n this.handleLogout = this.handleLogout.bind(this);\n this.handleDeleteAccount = this.handleDeleteAccount.bind(this);\n this.handleDeleteTopicRequest = this.handleDeleteTopicRequest.bind(this);\n this.handleDeleteMessagesRequest = this.handleDeleteMessagesRequest.bind(this);\n this.handleLeaveUnsubRequest = this.handleLeaveUnsubRequest.bind(this);\n this.handleBlockTopicRequest = this.handleBlockTopicRequest.bind(this);\n this.handleReportTopic = this.handleReportTopic.bind(this);\n this.handleShowContextMenu = this.handleShowContextMenu.bind(this);\n this.defaultTopicContextMenu = this.defaultTopicContextMenu.bind(this);\n this.handleHideContextMenu = this.handleHideContextMenu.bind(this);\n this.handleShowAlert = this.handleShowAlert.bind(this);\n this.handleShowInfoView = this.handleShowInfoView.bind(this);\n this.handleMemberUpdateRequest = this.handleMemberUpdateRequest.bind(this);\n this.handleValidateCredentialsRequest = this.handleValidateCredentialsRequest.bind(this);\n this.handlePasswordResetRequest = this.handlePasswordResetRequest.bind(this);\n this.handleResetPassword = this.handleResetPassword.bind(this);\n this.handleContextMenuAction = this.handleContextMenuAction.bind(this);\n this.handleShowCountrySelector = this.handleShowCountrySelector.bind(this);\n\n this.handleShowForwardDialog = this.handleShowForwardDialog.bind(this);\n this.handleHideForwardDialog = this.handleHideForwardDialog.bind(this);\n\n this.handleStartVideoCall = this.handleStartVideoCall.bind(this);\n this.handleStartAudioCall = this.handleStartAudioCall.bind(this);\n this.handleInfoMessage = this.handleInfoMessage.bind(this);\n this.handleDataMessage = this.handleDataMessage.bind(this);\n this.handleCallClose = this.handleCallClose.bind(this);\n\n this.handleCallInvite = this.handleCallInvite.bind(this);\n this.handleCallRinging = this.handleCallRinging.bind(this);\n this.handleCallHangup = this.handleCallHangup.bind(this);\n this.handleCallSendOffer = this.handleCallSendOffer.bind(this);\n this.handleCallIceCandidate = this.handleCallIceCandidate.bind(this);\n this.handleCallSendAnswer = this.handleCallSendAnswer.bind(this);\n\n this.handleCallAccept = this.handleCallAccept.bind(this);\n\n this.sendMessageToTopic = this.sendMessageToTopic.bind(this);\n\n // FIXME: this is unused.\n this.callTimeoutTimer = null;\n }\n\n getBlankState() {\n const settings = LocalStorageUtil.getObject('settings') || {};\n const persist = !!LocalStorageUtil.getObject('keep-logged-in');\n\n return {\n connected: false,\n // Connected and subscribed to 'me'\n ready: false,\n // Try to re-login on new connection.\n autoLogin: false,\n transport: settings.transport || null,\n serverAddress: settings.serverAddress || detectServerAddress(),\n secureConnection: settings.secureConnection === undefined ?\n isSecureConnection() : settings.secureConnection,\n serverVersion: \"no connection\",\n // \"On\" is the default, so saving the \"off\" state.\n messageSounds: !settings.messageSoundsOff,\n incognitoMode: false,\n // Persistent request to enable alerts.\n desktopAlerts: persist && !!settings.desktopAlerts,\n // Enable / disable checkbox.\n desktopAlertsEnabled: (isSecureConnection() || isLocalHost()) &&\n (typeof firebaseInitApp != 'undefined') && (typeof navigator != 'undefined') &&\n (typeof FIREBASE_INIT != 'undefined'),\n firebaseToken: persist ? LocalStorageUtil.getObject('firebase-token') : null,\n\n applicationVisible: !document.hidden,\n\n errorText: '',\n errorLevel: null,\n errorAction: undefined,\n errorActionText: null,\n\n sidePanelSelected: 'login',\n sidePanelTitle: null,\n sidePanelAvatar: null,\n myTrustedBadges: [],\n loadSpinnerVisible: false,\n\n login: '',\n password: '',\n persist: persist,\n myUserId: null,\n liveConnection: navigator.onLine,\n topicSelected: '',\n topicSelectedOnline: false,\n topicSelectedAcs: null,\n newTopicParams: null,\n loginDisabled: false,\n displayMobile: (window.innerWidth <= MEDIA_BREAKPOINT),\n infoPanel: undefined,\n mobilePanel: 'sidepanel',\n\n // Video calls.\n callTopic: undefined,\n callState: CALL_STATE_NONE,\n callAudioOnly: undefined,\n // If true, call state should be transitioned to CALL_STATE_IN_PROGRESS upon\n // switching to the call topic.\n callShouldStart: false,\n\n contextMenuVisible: false,\n contextMenuBounds: null,\n contextMenuClickAt: null,\n contextMenuParams: null,\n contextMenuItems: [],\n\n forwardDialogVisible: false,\n forwardMessage: null,\n\n // Modal alert dialog.\n alertVisible: false,\n alertParams: {},\n\n // Chats as shown in the ContactsView\n chatList: [],\n // Contacts returned by a search query.\n searchResults: [],\n // Merged results of a search query and p2p chats.\n searchableContacts: [],\n // Credential validation.\n credMethod: undefined,\n credCode: undefined,\n credToken: undefined,\n // Topic to go to after login.\n requestedTopic: undefined\n };\n }\n\n componentDidMount() {\n window.addEventListener('resize', this.handleResize);\n window.addEventListener('online', (e) => { this.handleOnline(true); });\n window.addEventListener('offline', (e) => { this.handleOnline(false); });\n window.addEventListener('hashchange', this.handleHashRoute);\n\n // Process background notifications from the service worker.\n if (typeof BroadcastChannel == 'function') {\n const serviceWorkerChannel = new BroadcastChannel('tinode-sw');\n serviceWorkerChannel.addEventListener('message', this.handlePushMessage);\n } else {\n // Safari is broken by design.\n console.warn(\"Your browser does not support BroadcastChannel. Some features will not be available\");\n }\n\n // Window/tab visible or invisible for pausing timers.\n document.addEventListener('visibilitychange', this.handleVisibilityEvent);\n\n this.setState({\n viewportWidth: document.documentElement.clientWidth,\n viewportHeight: document.documentElement.clientHeight\n });\n\n new Promise((resolve, reject) => {\n this.tinode = TinodeWeb.tnSetup(this.state.serverAddress, isSecureConnection(), this.state.transport,\n this.props.intl.locale, this.state.persist, resolve);\n this.tinode.onConnect = this.handleConnected;\n this.tinode.onDisconnect = this.handleDisconnect;\n this.tinode.onAutoreconnectIteration = this.handleAutoreconnectIteration;\n this.tinode.onInfoMessage = this.handleInfoMessage;\n this.tinode.onDataMessage = this.handleDataMessage;\n }).then(_ => {\n // Initialize desktop alerts.\n if (this.state.desktopAlertsEnabled) {\n this.initFCMessaging().catch(_ => {\n // do nothing: handled earlier.\n // catch needed to pervent unnecessary logging of error.\n });\n }\n\n // Parse and save the hash navigation params.\n const parsedNav = HashNavigation.parseUrlHash(window.location.hash);\n\n // Read contacts from cache.\n this.resetContactList();\n\n const token = this.state.persist ? LocalStorageUtil.getObject('auth-token') : undefined;\n if (token) {\n this.setState({autoLogin: true});\n\n // When reading from storage, date is returned as string.\n token.expires = new Date(token.expires);\n this.tinode.setAuthToken(token);\n this.tinode.connect().catch(err => {\n // Socket error\n this.handleError(err.message, 'err');\n });\n }\n\n this.readTimer = null;\n this.readTimerCallback = null;\n\n // Maybe navigate to home screen.\n if (!['cred', 'reset', 'register'].includes(parsedNav.path[0])) {\n // Save possible topic name.\n this.setState({requestedTopic: parsedNav.path[1]});\n const path = parsedNav.params && parsedNav.params.cred_done ?\n HashNavigation.addUrlParam('', 'cred_done', parsedNav.params.cred_done):\n '';\n HashNavigation.navigateTo(path);\n } else {\n this.handleHashRoute();\n }\n });\n }\n\n componentWillUnmount() {\n window.removeEventListener('resize', this.handleResize);\n window.removeEventListener('hashchange', this.handleHashRoute);\n document.removeEventListener('visibilitychange', this.handleVisibilityEvent);\n }\n\n // Setup transport (usually websocket) and server address. This will terminate connection with the server.\n static tnSetup(serverAddress, secureConnection, transport, locale, persistentCache, onSetupCompleted) {\n const tinode = new Tinode({appName: APP_NAME, host: serverAddress, apiKey: API_KEY, transport: transport,\n secure: secureConnection, persist: persistentCache}, onSetupCompleted);\n tinode.setHumanLanguage(locale);\n tinode.enableLogging(LOGGING_ENABLED, true);\n return tinode;\n }\n\n // Tinode received a push notification from the server.\n handlePushMessage(payload) {\n this.tinode.oobNotification(payload.data || {});\n }\n\n initFCMessaging() {\n const {formatMessage, locale} = this.props.intl;\n const onError = (msg, err) => {\n console.error(msg, err);\n this.handleError(formatMessage(messages.push_init_failed), 'err');\n this.setState({firebaseToken: null});\n LocalStorageUtil.updateObject('settings', {desktopAlerts: false});\n }\n\n try {\n this.fcm = firebaseGetMessaging(firebaseInitApp(FIREBASE_INIT, APP_NAME));\n return navigator.serviceWorker.getRegistration('/service-worker.js').then(reg => {\n return reg || navigator.serviceWorker.register('/service-worker.js').then(reg => {\n this.checkForAppUpdate(reg);\n return reg;\n });\n }).then(reg => {\n // Pass locale and version config to the service worker.\n (reg.active || reg.installing).postMessage(JSON.stringify({locale: locale, version: PACKAGE_VERSION}));\n // Request token.\n return TinodeWeb.requestFCMToken(this.fcm, reg);\n }).then(token => {\n const persist = LocalStorageUtil.getObject('keep-logged-in');\n if (token != this.state.firebaseToken) {\n this.tinode.setDeviceToken(token);\n if (persist) {\n LocalStorageUtil.setObject('firebase-token', token);\n }\n }\n this.setState({firebaseToken: token, desktopAlerts: true});\n if (persist) {\n LocalStorageUtil.updateObject('settings', {desktopAlerts: true});\n }\n\n // Handhe FCM pushes\n // (a) for channels always,\n // (b) pushes when the app is in foreground but has no focus.\n firebaseOnMessage(this.fcm, payload => { this.handlePushMessage(payload); });\n }).catch(err => {\n // SW registration or FCM has failed :(\n onError(err);\n throw err;\n });\n } catch (err) {\n onError(err);\n return Promise.reject(err);\n }\n }\n\n // Google's FCM API is idiotic.\n static requestFCMToken(fcm, sw) {\n return firebaseGetToken(fcm, {\n serviceWorkerRegistration: sw,\n vapidKey: FIREBASE_INIT.messagingVapidKey\n }).then(token => {\n if (token) {\n return token;\n } else {\n // Try to request permissions.\n return Notification.requestPermission().then(permission => {\n if (permission === 'granted') {\n return firebaseGetToken(fcm, {\n serviceWorkerRegistration: reg,\n vapidKey: FIREBASE_INIT.messagingVapidKey\n }).then(token => {\n if (token) {\n return token;\n } else {\n throw new Error(\"Failed to initialize notifications\");\n }\n });\n } else {\n throw new Error(\"No permission to send notifications: \" + permission);\n }\n });\n }\n });\n }\n\n handleResize() {\n const mobile = document.documentElement.clientWidth <= MEDIA_BREAKPOINT;\n this.setState({\n viewportWidth: document.documentElement.clientWidth,\n viewportHeight: document.documentElement.clientHeight\n });\n if (this.state.displayMobile != mobile) {\n this.setState({displayMobile: mobile});\n }\n }\n\n // Check if a newer version of TinodeWeb app is available at the server.\n checkForAppUpdate(reg) {\n reg.onupdatefound = _ => {\n const installingWorker = reg.installing;\n installingWorker.onstatechange = _ => {\n if (installingWorker.state == 'installed' && navigator.serviceWorker.controller) {\n const msg = <>\n \n \n .>;\n this.handleError(msg, 'info');\n }\n }\n }\n }\n\n // Handle for hash navigation (hashchange) event: update state.\n handleHashRoute() {\n const hash = HashNavigation.parseUrlHash(window.location.hash);\n // Start with panel parameters.\n const newState = {\n infoPanel: hash.params.info,\n newTopicTabSelected: hash.params.tab\n };\n\n if (hash.path && hash.path.length > 0) {\n // Left-side panel selector.\n if (['register','settings','edit','notif','security','support','general','crop',\n 'cred','reset','newtpk','archive','blocked','contacts',''].includes(hash.path[0])) {\n newState.sidePanelSelected = hash.path[0];\n } else {\n console.warn(\"Unknown sidepanel view\", hash.path[0]);\n }\n\n // Topic for MessagesView selector.\n let topicName = hash.path[1] || null;\n if (topicName != this.state.topicSelected) {\n if (!Tinode.topicType(topicName)) {\n // Clear invalid topic name.\n topicName = null;\n }\n Object.assign(newState, {\n topicSelected: topicName,\n topicSelectedAcs: this.tinode.getTopicAccessMode(topicName)\n });\n }\n } else {\n // Empty hashpath\n Object.assign(newState, {sidePanelSelected: '', topicSelected: null});\n }\n\n // Save credential validation parameters, if available.\n if (hash.params.method) {\n newState.credMethod = hash.params.method;\n }\n if (hash.params.code) {\n newState.credCode = hash.params.code;\n }\n if (hash.params.token) {\n newState.credToken = hash.params.token;\n }\n\n // Show a message if validation was successful.\n if (hash.params.cred_done) {\n Object.assign(newState,\n TinodeWeb.stateForError(this.props.intl.formatMessage(messages.cred_confirmed_successfully), 'info'));\n }\n\n this.setState(newState);\n }\n\n handleOnline(online) {\n if (online) {\n this.handleError();\n clearInterval(this.reconnectCountdown);\n this.tinode.reconnect();\n } else {\n this.handleError(this.props.intl.formatMessage(messages.no_connection), 'warn');\n }\n this.setState({liveConnection: online});\n }\n\n handleVisibilityEvent() {\n this.setState({applicationVisible: !document.hidden});\n }\n\n static stateForError(err, level, action, actionText) {\n return {\n errorText: err,\n errorLevel: level,\n errorAction: action,\n errorActionText: actionText,\n callShouldStart: false,\n };\n }\n\n handleError(err, level, action, actionText) {\n this.setState(TinodeWeb.stateForError(err, level, action, actionText));\n }\n\n // User clicked Login button in the side panel.\n handleLoginRequest(login, password) {\n this.setState({\n loginDisabled: true,\n login: login,\n password: password,\n loadSpinnerVisible: true,\n autoLogin: true\n });\n this.handleError('', null);\n\n if (this.tinode.isConnected()) {\n this.doLogin(login, password, null, {meth: this.state.credMethod, resp: this.state.credCode});\n } else {\n this.tinode.connect().catch(err => {\n // Socket error\n this.setState({loginDisabled: false, autoLogin: false, loadSpinnerVisible: false});\n this.handleError(err.message, 'err');\n });\n }\n\n if (this.state.desktopAlertsEnabled && !this.state.firebaseToken) {\n // Firefox and Safari: \"The Notification permission may only be requested from inside a\n // short running user-generated event handler\".\n this.initFCMessaging();\n }\n }\n\n // Enable or disable saving the password and IndexedDB.\n handlePersistenceChange(persist) {\n if (persist) {\n this.tinode.initStorage().then(_ => {\n LocalStorageUtil.setObject('keep-logged-in', true);\n this.setState({persist: true});\n });\n } else {\n this.tinode.clearStorage().then(_ => {\n LocalStorageUtil.setObject('keep-logged-in', false);\n this.setState({persist: false});\n });\n }\n }\n\n // Connection succeeded.\n handleConnected() {\n // Just to be sure.\n clearInterval(this.reconnectCountdown);\n this.handleError();\n\n const params = this.tinode.getServerInfo();\n this.setState({\n serverVersion: params.ver + ' ' + (params.build ? params.build : 'none')\n });\n\n if (this.state.autoLogin) {\n this.doLogin(this.state.login, this.state.password, null,\n {meth: this.state.credMethod, resp: this.state.credCode});\n }\n }\n\n // Called for each auto-reconnect iteration.\n handleAutoreconnectIteration(sec, prom) {\n clearInterval(this.reconnectCountdown);\n\n if (sec < 0) {\n // Clear error\n this.handleError();\n return;\n }\n\n if (prom) {\n // Reconnecting now\n prom.then(_ => {\n // Reconnected: clear error\n this.handleError();\n }).catch(err => {\n this.handleError(err.message, 'err');\n });\n return;\n }\n\n const {formatMessage} = this.props.intl;\n let count = sec / 1000;\n count = count | count;\n this.reconnectCountdown = setInterval(_ => {\n if (count < -10) {\n // Count could go to negative if computer woke up from sleep.\n clearInterval(this.reconnectCountdown);\n this.tinode.reconnect();\n return;\n }\n\n const fmtTime = (count > 99) ? secondsToTime(count) : count;\n this.handleError(\n formatMessage(messages.reconnect_countdown, {seconds: fmtTime}),\n 'warn',\n _ => {\n clearInterval(this.reconnectCountdown);\n this.tinode.reconnect();\n },\n formatMessage(messages.reconnect_now)\n );\n count -= 1;\n }, 1000);\n }\n\n // Connection lost\n handleDisconnect(err) {\n this.setState({\n connected: false,\n ready: false,\n topicSelectedOnline: false,\n errorText: err && err.message ? err.message : \"Disconnected\",\n errorLevel: err && err.message ? 'err' : 'warn',\n loginDisabled: false,\n contextMenuVisible: false,\n forwardDialogVisible: false,\n serverVersion: \"no connection\"\n });\n }\n\n doLogin(login, password, tmpToken, cred) {\n if (this.tinode.isAuthenticated()) {\n // Already logged in. Go to default screen.\n HashNavigation.navigateTo('');\n return;\n }\n\n let token = tmpToken || (this.tinode.getAuthToken() || {}).token;\n if (!(login && password) && !token) {\n // No login credentials provided.\n // Make sure we are on the login page.\n HashNavigation.navigateTo('');\n this.setState({loginDisabled: false});\n return;\n }\n\n // Sanitize and package credentail.\n cred = Tinode.credential(cred);\n // May be disconnected.\n let connectionPromise = this.tinode.isConnected() ? Promise.resolve() : this.tinode.connect();\n // Try to login with login/password. If they are not available, try token; if no token, ask for login/password.\n let loginPromise;\n if (login && password) {\n token = null;\n this.setState({password: null});\n loginPromise = connectionPromise.then(_ => this.tinode.loginBasic(login, password, cred));\n } else {\n loginPromise = connectionPromise.then(_ => this.tinode.loginToken(token, cred));\n }\n\n loginPromise.then(ctrl => {\n if (ctrl.code >= 300 && ctrl.text === 'validate credentials') {\n this.setState({loadSpinnerVisible: false});\n if (cred) {\n this.handleError(this.props.intl.formatMessage(messages.code_doesnot_match), 'warn');\n }\n TinodeWeb.navigateToCredentialsView(ctrl.params);\n } else {\n this.handleLoginSuccessful();\n }\n }).catch(err => {\n const autoLogin = err.code >= 500;\n // Connection or login failed, report error.\n this.setState({\n loginDisabled: false,\n credMethod: undefined,\n credCode: undefined,\n loadSpinnerVisible: false,\n autoLogin: autoLogin\n });\n this.handleError(err.message, 'err');\n console.warn(\"Login failed\", err);\n if (!autoLogin) {\n if (token) {\n this.handleLogout();\n }\n HashNavigation.navigateTo('');\n }\n });\n }\n\n static navigateToCredentialsView(params) {\n const parsed = HashNavigation.parseUrlHash(window.location.hash);\n parsed.path[0] = 'cred';\n parsed.params['method'] = params.cred[0];\n parsed.params['token'] = params.token;\n HashNavigation.navigateTo(HashNavigation.composeUrlHash(parsed.path, parsed.params));\n }\n\n handleLoginSuccessful() {\n this.handleError();\n\n // Refresh authentication token.\n if (LocalStorageUtil.getObject('keep-logged-in')) {\n LocalStorageUtil.setObject('auth-token', this.tinode.getAuthToken());\n }\n\n const goToTopic = this.state.requestedTopic;\n // Logged in fine, subscribe to 'me' attaching callbacks from the contacts view.\n const me = this.tinode.getMeTopic();\n me.onMetaDesc = this.tnMeMetaDesc;\n me.onContactUpdate = this.tnMeContactUpdate;\n me.onSubsUpdated = this.tnMeSubsUpdated;\n this.setState({\n connected: true,\n credMethod: undefined,\n credCode: undefined,\n credToken: undefined,\n myUserId: this.tinode.getCurrentUserID(),\n autoLogin: true,\n requestedTopic: undefined,\n });\n // Subscribe, fetch topic desc, the list of subscriptions. Messages are not fetched.\n me.subscribe(\n me.startMetaQuery().\n withLaterSub().\n withDesc().\n withTags().\n withCred().\n build()\n ).catch(err => {\n this.tinode.disconnect();\n localStorage.removeItem('auth-token');\n this.handleError(err.message, 'err');\n HashNavigation.navigateTo('');\n }).finally(_ => {\n this.setState({loadSpinnerVisible: false});\n });\n let urlHash = HashNavigation.setUrlSidePanel(window.location.hash, 'contacts');\n if (goToTopic) {\n urlHash = HashNavigation.setUrlTopic(urlHash, goToTopic);\n }\n HashNavigation.navigateTo(urlHash);\n }\n\n tnMeMetaDesc(desc) {\n if (desc) {\n if (desc.public) {\n this.setState({\n sidePanelTitle: desc.public.fn,\n sidePanelAvatar: makeImageUrl(desc.public.photo)\n });\n }\n if (desc.trusted) {\n const badges = [];\n for (const [key, val] of Object.entries(desc.trusted)) {\n if (val) {\n badges.push(key);\n }\n }\n this.setState({\n myTrustedBadges: badges,\n });\n }\n if (desc.acs) {\n this.setState({\n incognitoMode: !desc.acs.isPresencer()\n });\n }\n }\n }\n\n // Reactions to updates to the contact list.\n tnMeContactUpdate(what, cont) {\n if (what == 'on' || what == 'off') {\n this.resetContactList();\n if (this.state.topicSelected == cont.topic) {\n this.setState({topicSelectedOnline: (what == 'on')});\n }\n } else if (what == 'read') {\n this.resetContactList();\n } else if (what == 'msg') {\n // Check if the topic is archived. If so, don't play a sound.\n const topic = this.tinode.getTopic(cont.topic);\n const archived = topic && topic.isArchived();\n\n // New message received. Maybe the message is from the current user, then unread is 0.\n if (cont.unread > 0 && this.state.messageSounds && !archived) {\n // Skip update if the topic is currently open, otherwise the badge will annoyingly flash.\n if (document.hidden || this.state.topicSelected != cont.topic) {\n POP_SOUND.play().catch(_ => {\n // play() throws if the user did not click the app first: https://goo.gl/xX8pDD.\n });\n }\n }\n // Reorder contact list to use possibly updated 'touched'.\n this.resetContactList();\n } else if (what == 'recv') {\n // Explicitly ignoring \"recv\" -- it causes no visible updates to contact list.\n } else if (what == 'gone' || what == 'unsub') {\n // Topic deleted or user unsubscribed. Remove topic from view.\n // If the currently selected topic is gone, clear the selection.\n if (this.state.topicSelected == cont.topic) {\n this.handleTopicSelected(null);\n }\n // Redraw without the deleted topic.\n this.resetContactList();\n } else if (what == 'acs') {\n // Permissions changed. If it's for the currently selected topic,\n // update the views.\n if (this.state.topicSelected == cont.topic) {\n this.setState({topicSelectedAcs: cont.acs});\n }\n } else if (what == 'del') {\n // TODO: messages deleted (hard or soft) -- update pill counter.\n } else if (what == 'upd' || what == 'call') {\n // upd, call - handled by the SDK. Explicitly ignoring here.\n } else {\n // TODO(gene): handle other types of notifications:\n // * ua -- user agent changes (maybe display a pictogram for mobile/desktop).\n console.info(\"Unsupported (yet) presence update:\", what, \"in\", cont.topic);\n }\n }\n\n tnMeSubsUpdated(unused) {\n this.resetContactList();\n }\n\n // Merge search results and contact list to create a single flat\n // list of known contacts for GroupManager to use.\n static prepareSearchableContacts(chatList, foundContacts) {\n const merged = {};\n\n // For chatList topics merge only p2p topics and convert them to the\n // same format as foundContacts.\n for (const c of chatList) {\n if (Tinode.isP2PTopicName(c.topic)) {\n merged[c.topic] = {\n user: c.topic,\n updated: c.updated,\n public: c.public,\n private: c.private,\n acs: c.acs\n };\n }\n }\n\n // Add all foundCountacts if they have not been added already.\n for (const c of foundContacts) {\n if (!merged[c.user]) {\n merged[c.user] = c;\n }\n }\n\n return Object.values(merged);\n }\n\n resetContactList() {\n const newState = {\n chatList: []\n };\n\n if (!this.state.ready) {\n newState.ready = true;\n }\n\n this.tinode.getMeTopic().contacts((c) => {\n if (!c.topic && !c.user) {\n // Contacts expect c.topic to be set.\n c.topic = c.name;\n }\n\n newState.chatList.push(c);\n if (this.state.topicSelected == c.topic) {\n newState.topicSelectedOnline = c.online;\n newState.topicSelectedAcs = c.acs;\n }\n });\n\n const past = new Date(0);\n newState.chatList.sort((a, b) => {\n return (a.touched || past).getTime() - (b.touched || past).getTime();\n });\n\n // Merge search results and chat list.\n newState.searchableContacts = TinodeWeb.prepareSearchableContacts(newState.chatList, this.state.searchResults);\n this.setState(newState);\n }\n\n /* Fnd topic: find contacts by tokens */\n tnInitFind() {\n const fnd = this.tinode.getFndTopic();\n fnd.onSubsUpdated = this.tnFndSubsUpdated;\n if (fnd.isSubscribed()) {\n this.tnFndSubsUpdated();\n } else {\n fnd.subscribe(fnd.startMetaQuery().withSub().build()).catch(err => {\n this.handleError(err.message, 'err');\n });\n }\n }\n\n tnFndSubsUpdated() {\n const foundContacts = [];\n // Don't attempt to create P2P topics which already exist. Server will reject the duplicates.\n this.tinode.getFndTopic().contacts((s) => {\n foundContacts.push(s);\n });\n this.setState({\n searchResults: foundContacts,\n searchableContacts: TinodeWeb.prepareSearchableContacts(this.state.chatList, foundContacts)\n });\n }\n\n /** Called when the user enters a contact into the contact search field in the NewAccount panel\n @param query {Array} is an array of contacts to search for\n */\n handleSearchContacts(query) {\n const fnd = this.tinode.getFndTopic();\n fnd.setMeta({desc: {public: query}})\n .then(_ => fnd.getMeta(fnd.startMetaQuery().withSub().build()))\n .catch(err => this.handleError(err.message, 'err'));\n }\n\n // User clicked on a topic in the side panel or deleted a topic.\n handleTopicSelected(topicName) {\n // Clear newTopicParams after use.\n if (this.state.newTopicParams && this.state.newTopicParams._topicName != topicName) {\n this.setState({\n newTopicParams: null\n });\n }\n\n if (topicName) {\n this.setState({\n errorText: '',\n errorLevel: null,\n mobilePanel: 'topic-view',\n infoPanel: undefined\n });\n // Different topic selected.\n if (this.state.topicSelected != topicName) {\n this.setState({\n topicSelectedOnline: this.tinode.isTopicOnline(topicName),\n topicSelectedAcs: this.tinode.getTopicAccessMode(topicName),\n forwardMessage: null\n });\n HashNavigation.navigateTo(HashNavigation.setUrlTopic('', topicName));\n }\n } else {\n // Currently selected contact deleted\n this.setState({\n errorText: '',\n errorLevel: null,\n mobilePanel: 'sidepanel',\n topicSelectedOnline: false,\n topicSelectedAcs: null,\n infoPanel: undefined,\n forwardMessage: null\n });\n\n HashNavigation.navigateTo(HashNavigation.setUrlTopic('', null));\n }\n }\n\n // In mobile view user requested to show sidepanel\n handleHideMessagesView() {\n this.setState({\n mobilePanel: 'sidepanel'\n });\n HashNavigation.navigateTo(HashNavigation.setUrlTopic(window.location.hash, null));\n }\n\n // User is sending a message, either plain text or a drafty object, possibly\n // with attachments.\n // - msg - Drafty message with content\n // - promise - Promise to be resolved when the upload is completed\n // - uploadCompletionPromise - for tracking progress\n // - head - head dictionary to be attached to the message\n handleSendMessage(msg, uploadCompletionPromise, uploader, head) {\n const topic = this.tinode.getTopic(this.state.topicSelected);\n /* TODO: check if return is required */\n return this.sendMessageToTopic(topic, msg, uploadCompletionPromise, uploader, head);\n }\n\n sendMessageToTopic(topic, msg, uploadCompletionPromise, uploader, head) {\n msg = topic.createMessage(msg, false);\n // The uploader is used to show progress.\n msg._uploader = uploader;\n\n if (head) {\n msg.head = Object.assign(msg.head || {}, head);\n }\n\n const completion = [];\n if (uploadCompletionPromise) {\n completion.push(uploadCompletionPromise);\n }\n\n if (!topic.isSubscribed()) {\n // Topic is not subscribed yet. Subscribe.\n const subscribePromise =\n topic.subscribe()\n .then(_ => {\n // If there are unsent messages (except video call messages),\n // try sending them now. Unsent video call messages will be dropped.\n let calls = [];\n topic.queuedMessages(pub => {\n if (pub._sending || pub.seq == msg.seq) {\n return;\n }\n if (pub.head && pub.head.webrtc) {\n // Filter out unsent video call messages.\n calls.push(pub.seq);\n return;\n }\n if (topic.isSubscribed()) {\n topic.publishMessage(pub);\n }\n });\n if (calls.length > 0) {\n topic.delMessagesList(calls, true);\n }\n });\n completion.push(subscribePromise);\n }\n\n // TODO: check if return is required.\n return topic.publishDraft(msg, Promise.all(completion))\n .then(ctrl => {\n if (topic.isArchived()) {\n topic.archive(false);\n }\n return ctrl;\n })\n .catch(err => this.handleError(err.message, 'err'));\n }\n\n handleNewChatInvitation(topicName, action) {\n const topic = this.tinode.getTopic(topicName);\n let response = null;\n switch (action) {\n case 'accept':\n // Accept given permissions.\n const mode = topic.getAccessMode().getGiven();\n response = topic.setMeta({sub: {mode: mode}});\n if (topic.isP2PType()) {\n // For P2P topics change 'given' permission of the peer too.\n // In p2p topics the other user has the same name as the topic.\n response = response.then(_ => topic.setMeta({sub: {user: topicName, mode: mode}}));\n }\n break;\n case 'delete':\n // Ignore invitation by deleting it.\n response = topic.delTopic(true);\n break;\n case 'block':\n // Ban the topic making futher invites impossible.\n // Just self-ban.\n const am = topic.getAccessMode().updateWant('-JP').getWant();\n response = topic.setMeta({sub: {mode: am}}).then(_ => this.handleTopicSelected(null));\n break;\n default:\n console.warn(\"Unknown invitation action\", '\"' + action + '\"\"');\n }\n\n if (response != null) {\n response.catch(err => this.handleError(err.message, 'err'));\n }\n }\n\n // User chose a Sign Up menu item.\n handleNewAccount() {\n this.handleError();\n\n HashNavigation.navigateTo(HashNavigation.setUrlSidePanel(window.location.hash, 'register'));\n }\n\n // Actual registration of a new account.\n handleNewAccountRequest(login_, password_, public_, cred_, tags_) {\n // Clear old error, if any.\n this.handleError();\n\n this.tinode.connect(this.state.serverAddress)\n .then(_ => {\n let attachments;\n if (public_ && public_.photo && public_.photo.ref) {\n attachments = [public_.photo.ref];\n }\n return this.tinode.createAccountBasic(login_, password_,\n {public: public_, tags: tags_, cred: Tinode.credential(cred_), attachments: attachments});\n }).then(ctrl => {\n if (ctrl.code >= 300 && ctrl.text == 'validate credentials') {\n TinodeWeb.navigateToCredentialsView(ctrl.params);\n } else {\n this.handleLoginSuccessful(this);\n }\n }).catch(err => {\n this.handleError(err.message, 'err');\n });\n }\n\n handleToggleIncognitoMode(on) {\n // Make state undefined.\n this.setState({incognitoMode: null});\n\n const me = this.tinode.getMeTopic();\n const am = me.getAccessMode().updateWant(on ? '-P' : '+P').getWant();\n me.setMeta({sub: {mode: am}}).catch(err => {\n // Request failed, keep existing state.\n this.setState({incognitoMode: !on});\n this.handleError(err.message, 'err');\n });\n }\n\n handleUpdateAccountTagsRequest(_, tags) {\n this.tinode.getMeTopic().setMeta({tags: tags})\n .catch(err => this.handleError(err.message, 'err'));\n }\n\n // User chose Settings menu item.\n handleSettings() {\n this.handleError();\n\n HashNavigation.navigateTo(HashNavigation.setUrlSidePanel(window.location.hash,\n this.state.myUserId ? 'edit' : 'settings'));\n }\n\n // User updated global parameters.\n handleGlobalSettings(settings) {\n const serverAddress = settings.serverAddress || this.state.serverAddress;\n const transport = settings.transport || this.state.transport;\n const secureConnection = settings.secureConnection === undefined ?\n this.state.secureConnection : settings.secureConnection;\n if (this.tinode) {\n this.tinode.clearStorage();\n this.tinode.onDisconnect = undefined;\n this.tinode.disconnect();\n }\n this.tinode = TinodeWeb.tnSetup(serverAddress, secureConnection, transport,\n this.props.intl.locale, LocalStorageUtil.getObject('keep-logged-in'));\n this.tinode.onConnect = this.handleConnected;\n this.tinode.onDisconnect = this.handleDisconnect;\n this.tinode.onAutoreconnectIteration = this.handleAutoreconnectIteration;\n this.tinode.onInfoMessage = this.handleInfoMessage;\n this.tinode.onDataMessage = this.handleDataMessage;\n\n this.setState({\n serverAddress: serverAddress,\n transport: transport,\n secureConnection: secureConnection,\n });\n LocalStorageUtil.setObject('settings', {\n serverAddress: serverAddress,\n transport: transport,\n secureConnection: secureConnection,\n });\n\n HashNavigation.navigateTo(HashNavigation.setUrlSidePanel(window.location.hash, ''));\n }\n\n // User chose 'Archived chats'.\n handleShowArchive() {\n HashNavigation.navigateTo(HashNavigation.setUrlSidePanel(window.location.hash,\n this.state.myUserId ? 'archive' : ''));\n }\n\n // User viewes 'Blocked chats'.\n handleShowBlocked() {\n HashNavigation.navigateTo(HashNavigation.setUrlSidePanel(window.location.hash,\n this.state.myUserId ? 'blocked' : ''));\n }\n\n toggleFCMToken(enabled) {\n if (enabled) {\n this.setState({desktopAlerts: null});\n if (!this.state.firebaseToken) {\n this.initFCMessaging();\n } else {\n this.setState({desktopAlerts: true});\n if (LocalStorageUtil.getObject('keep-logged-in')) {\n LocalStorageUtil.updateObject('settings', {desktopAlerts: true});\n }\n }\n } else if (this.state.firebaseToken && this.fcm) {\n firebaseDelToken(this.fcm).catch(err => {\n console.error(\"Unable to delete token.\", err);\n }).finally(_ => {\n LocalStorageUtil.updateObject('settings', {desktopAlerts: false});\n localStorage.removeItem('firebase-token');\n this.setState({desktopAlerts: false, firebaseToken: null});\n // Inform the server that the token was deleted.\n this.tinode.setDeviceToken(null);\n });\n } else {\n this.setState({desktopAlerts: false, firebaseToken: null});\n LocalStorageUtil.updateObject('settings', {desktopAlerts: false});\n }\n }\n\n handleToggleMessageSounds(enabled) {\n this.setState({messageSounds: enabled});\n LocalStorageUtil.updateObject('settings', {\n messageSoundsOff: !enabled\n });\n }\n\n handleCredAdd(method, value) {\n const me = this.tinode.getMeTopic();\n me.setMeta({cred: {meth: method, val: value}})\n .catch(err => this.handleError(err.message, 'err'));\n }\n\n handleCredDelete(method, value) {\n const me = this.tinode.getMeTopic();\n me.delCredential(method, value)\n .catch(err => this.handleError(err.message, 'err'));\n }\n\n handleCredConfirm(method, response) {\n TinodeWeb.navigateToCredentialsView({cred: [method]});\n }\n\n // User clicked Cancel button in Setting or Sign Up panel.\n handleSidepanelCancel() {\n const parsed = HashNavigation.parseUrlHash(window.location.hash);\n let path = '';\n if (['security','support','general','notif'].includes(parsed.path[0])) {\n path = 'edit';\n } else if ('crop' == parsed.path[0]) {\n path = 'general';\n } else if ('blocked' == parsed.path[0]) {\n path = 'security';\n } else if (this.state.myUserId) {\n path = 'contacts';\n }\n parsed.path[0] = path;\n if (parsed.params) {\n delete parsed.params.code;\n delete parsed.params.method;\n delete parsed.params.tab;\n delete parsed.params.scheme;\n delete parsed.params.token;\n }\n HashNavigation.navigateTo(HashNavigation.composeUrlHash(parsed.path, parsed.params));\n this.setState({errorText: '', errorLevel: null});\n }\n\n // Sidepanel navigator. No need to bind to 'this'.\n basicNavigator(hash) {\n HashNavigation.navigateTo(HashNavigation.setUrlSidePanel(window.location.hash, hash));\n }\n\n // Topic info navigator. No need to bind to 'this'.\n infoNavigator(hash) {\n HashNavigation.navigateTo(HashNavigation.setUrlInfoPanel(window.location.hash, hash));\n }\n\n // Request to start a topic, new or selected from search results, or \"by ID\".\n handleStartTopicRequest(topicName, newTopicParams, isChannel) {\n // Check if topic is indeed new. If not, launch it.\n if (topicName && this.tinode.isTopicCached(topicName)) {\n this.handleTopicSelected(topicName);\n return;\n }\n\n const params = {};\n if (Tinode.isP2PTopicName(topicName)) {\n // Because we are initialing the subscription, set 'want' to all permissions.\n params.sub = {mode: DEFAULT_P2P_ACCESS_MODE};\n // Give the other user all permissions too.\n params.desc = {defacs: {auth: DEFAULT_P2P_ACCESS_MODE}};\n } else {\n topicName = topicName || this.tinode.newGroupTopicName(isChannel);\n if (newTopicParams) {\n params.desc = {public: newTopicParams.public, private: {comment: newTopicParams.private}};\n params.tags = newTopicParams.tags;\n }\n }\n params._topicName = topicName;\n this.setState({newTopicParams: params}, _ => {this.handleTopicSelected(topicName)});\n }\n\n // New topic was created, here is the new topic name.\n handleNewTopicCreated(oldName, newName) {\n let nextState = {};\n if (this.state.callShouldStart) {\n nextState = {callState: CALL_STATE_IN_PROGRESS, callShouldStart: false};\n }\n if (this.state.topicSelected == oldName && oldName != newName) {\n // If the current URl contains the old topic name, replace it with new.\n // Update the name of the selected topic first so the navigator doen't clear\n // the state.\n nextState.topicSelected = newName;\n }\n this.setState(nextState, _ => {\n HashNavigation.navigateTo(HashNavigation.setUrlTopic('', newName));\n });\n }\n\n handleTopicUpdateRequest(topicName, pub, priv, defacs) {\n this.handleError();\n\n const topic = this.tinode.getTopic(topicName);\n if (topic) {\n const params = {};\n let attachments;\n if (pub) {\n if (pub.photo) {\n if (pub.photo.ref && pub.photo.ref != Tinode.DEL_CHAR) {\n attachments = [pub.photo.ref];\n } else if (!pub.photo.data || pub.photo.data == Tinode.DEL_CHAR) {\n pub.photo = Tinode.DEL_CHAR;\n }\n }\n params.public = pub;\n }\n\n if (typeof priv == 'string') {\n params.private = (priv === Tinode.DEL_CHAR) ?\n Tinode.DEL_CHAR : {comment: priv};\n }\n if (defacs) {\n params.defacs = defacs;\n }\n topic.setMeta({desc: params, attachments: attachments})\n .catch(err => this.handleError(err.message, 'err'));\n }\n }\n\n handleUnarchive(topicName) {\n const topic = this.tinode.getTopic(topicName);\n if (topic) {\n topic.archive(false).catch(err => this.handleError(err.message, 'err'));\n }\n }\n\n handleUpdatePasswordRequest(password) {\n this.handleError();\n\n if (password) {\n this.tinode.updateAccountBasic(null, this.tinode.getCurrentLogin(), password)\n .catch(err => this.handleError(err.message, 'err'));\n }\n }\n\n handleChangePermissions(topicName, mode, uid) {\n const topic = this.tinode.getTopic(topicName);\n if (topic) {\n const am = topic.getAccessMode();\n if (uid) {\n am.updateGiven(mode);\n mode = am.getGiven();\n } else {\n am.updateWant(mode);\n mode = am.getWant();\n }\n topic.setMeta({sub: {user: uid, mode: mode}})\n .catch(err => this.handleError(err.message, 'err'));\n }\n }\n\n handleTagsUpdateRequest(topicName, tags) {\n const topic = this.tinode.getTopic(topicName);\n if (topic) {\n topic.setMeta({tags: tags})\n .catch(err => this.handleError(err.message, 'err'));\n }\n }\n\n handleLogout() {\n updateFavicon(0);\n\n // Remove stored data.\n localStorage.removeItem('auth-token');\n localStorage.removeItem('firebase-token');\n localStorage.removeItem('settings');\n if (this.state.firebaseToken) {\n firebaseDelToken(this.fcm);\n }\n\n clearInterval(this.reconnectCountdown);\n\n let cleared;\n if (this.tinode) {\n cleared = this.tinode.clearStorage();\n this.tinode.onDisconnect = undefined;\n this.tinode.disconnect();\n } else {\n cleared = Promose.resolve();\n }\n this.setState(this.getBlankState());\n\n cleared.then(_ => {\n this.tinode = TinodeWeb.tnSetup(this.state.serverAddress, isSecureConnection(),\n this.state.transport, this.props.intl.locale, LocalStorageUtil.getObject('keep-logged-in'), _ => {\n this.tinode.onConnect = this.handleConnected;\n this.tinode.onDisconnect = this.handleDisconnect;\n this.tinode.onAutoreconnectIteration = this.handleAutoreconnectIteration;\n this.tinode.onInfoMessage = this.handleInfoMessage;\n this.tinode.onDataMessage = this.handleDataMessage;\n HashNavigation.navigateTo('');\n })\n });\n }\n\n handleDeleteAccount() {\n this.tinode.delCurrentUser(true).then(_ => {\n this.handleLogout();\n });\n }\n\n handleDeleteTopicRequest(topicName) {\n const topic = this.tinode.getTopic(topicName);\n if (!topic) {\n return;\n }\n\n // Request to hard-delete topic.\n topic.delTopic(true).then(_ => {\n // Hide MessagesView and InfoView panels.\n HashNavigation.navigateTo(HashNavigation.setUrlTopic(window.location.hash, ''));\n }).catch(err => {\n this.handleError(err.message, 'err');\n });\n }\n\n handleDeleteMessagesRequest(topicName) {\n const topic = this.tinode.getTopic(topicName);\n if (!topic) {\n return;\n }\n\n // Request hard-delete all messages.\n topic.delMessagesAll(true)\n .catch(err => this.handleError(err.message, 'err'));\n }\n\n handleLeaveUnsubRequest(topicName) {\n const topic = this.tinode.getTopic(topicName);\n if (!topic) {\n return;\n }\n\n topic.leave(true).then(_ => {\n // Hide MessagesView and InfoView panels.\n HashNavigation.navigateTo(HashNavigation.setUrlTopic(window.location.hash, ''));\n }).catch(err => {\n this.handleError(err.message, 'err');\n });\n }\n\n handleBlockTopicRequest(topicName) {\n const topic = this.tinode.getTopic(topicName);\n if (!topic) {\n return;\n }\n\n topic.updateMode(null, '-JP')\n .then(_ => {\n // Hide MessagesView and InfoView panels.\n HashNavigation.navigateTo(HashNavigation.setUrlTopic(window.location.hash, ''));\n })\n .catch(err => this.handleError(err.message, 'err'));\n }\n\n handleReportTopic(topicName) {\n const topic = this.tinode.getTopic(topicName);\n if (!topic) {\n return;\n }\n\n // Publish spam report.\n this.tinode.report('report', topicName);\n\n // Remove J and P permissions.\n topic.updateMode(null, '-JP')\n .then(_ => {\n // Hide MessagesView and InfoView panels.\n HashNavigation.navigateTo(HashNavigation.setUrlTopic(window.location.hash, ''));\n })\n .catch(err => this.handleError(err.message, 'err'));\n }\n\n handleShowContextMenu(params, menuItems) {\n this.setState({\n contextMenuVisible: true,\n contextMenuClickAt: {x: params.x, y: params.y},\n contextMenuParams: params,\n contextMenuItems: menuItems || this.defaultTopicContextMenu(params.topicName),\n contextMenuBounds: this.selfRef.current.getBoundingClientRect()\n });\n }\n\n //\n handleShowForwardDialog(params) {\n if (this.state.sidePanelSelected == 'newtpk') {\n // If the Find panel is active, close it.\n this.handleSidepanelCancel();\n }\n const header = '➦ ' + params.userName;\n const content = typeof params.content == 'string' ? Drafty.init(params.content) : Drafty.forwardedContent(params.content);\n const preview = Drafty.preview(content, FORWARDED_PREVIEW_LENGTH, true);\n const msg = Drafty.append(Drafty.appendLineBreak(Drafty.mention(header, params.userFrom)), content);\n const msgPreview = Drafty.quote(header, params.userFrom, preview);\n\n const head = {\n forwarded: params.topicName + ':' + params.seq\n };\n this.setState({\n forwardDialogVisible: true,\n forwardMessage: { head: head, msg: msg, preview: msgPreview }\n });\n }\n\n defaultTopicContextMenu(topicName) {\n const topic = this.tinode.getTopic(topicName);\n\n if (topic._deleted) {\n return [\n 'topic_delete'\n ];\n }\n\n let muted = false, blocked = false, self_blocked = false, subscribed = false, deleter = false,\n archived = false, webrtc = false;\n if (topic) {\n subscribed = topic.isSubscribed();\n archived = topic.isArchived();\n\n const acs = topic.getAccessMode();\n if (acs) {\n muted = acs.isMuted();\n blocked = !acs.isJoiner();\n self_blocked = !acs.isJoiner('want');\n deleter = acs.isDeleter();\n }\n }\n\n webrtc = !!this.tinode.getServerParam('iceServers');\n\n return [\n subscribed ? {\n title: this.props.intl.formatMessage(messages.menu_item_info),\n handler: this.handleShowInfoView\n } : null,\n subscribed && Tinode.isP2PTopicName(topicName) && webrtc ? {\n title: this.props.intl.formatMessage(messages.menu_item_audio_call),\n handler: this.handleStartAudioCall\n } : null,\n subscribed && Tinode.isP2PTopicName(topicName) && webrtc ? {\n title: this.props.intl.formatMessage(messages.menu_item_video_call),\n handler: this.handleStartVideoCall\n } : null,\n subscribed ? 'messages_clear' : null,\n subscribed && deleter ? 'messages_clear_hard' : null,\n muted ? (blocked ? null : 'topic_unmute') : 'topic_mute',\n self_blocked ? 'topic_unblock' : 'topic_block',\n archived ? 'topic_restore' : 'topic_archive',\n 'topic_delete'\n ];\n }\n\n handleHideContextMenu() {\n this.setState({\n contextMenuVisible: false,\n contextMenuClickAt: null,\n contextMenuParams: null,\n contextMenuBounds: null\n });\n }\n\n handleHideForwardDialog(keepForwardedMessage) {\n this.setState({\n forwardDialogVisible: false,\n forwardMessage: keepForwardedMessage ? this.state.forwardMessage : null\n });\n }\n\n handleContextMenuAction(action, promise, params) {\n if (action == 'topic_archive') {\n if (promise && params.topicName && params.topicName == this.state.topicSelected) {\n promise.then(_ => {\n this.handleTopicSelected(null);\n });\n }\n } else if (action == 'menu_item_forward') {\n this.handleShowForwardDialog(params);\n }\n }\n\n handleShowAlert(title, content, onConfirm, confirmText, onReject, rejectText) {\n this.setState({\n alertVisible: true,\n alertParams: {\n title: title,\n content: content,\n onConfirm: onConfirm,\n confirm: confirmText,\n onReject: onReject,\n reject: rejectText\n }\n });\n }\n\n handleShowInfoView() {\n HashNavigation.navigateTo(HashNavigation.addUrlParam(window.location.hash, 'info', 'info'));\n this.setState({infoPanel: 'info'});\n }\n\n handleMemberUpdateRequest(topicName, added, removed) {\n if (!topicName) {\n return;\n }\n\n const topic = this.tinode.getTopic(topicName);\n if (!topic) {\n return;\n }\n\n if (added && added.length > 0) {\n added.map((uid) => {\n topic.invite(uid, null)\n .catch(err => this.handleError(err.message, 'err'));\n });\n }\n\n if (removed && removed.length > 0) {\n removed.map((uid) => {\n topic.delSubscription(uid)\n .catch(err => this.handleError(err.message, 'err'));\n });\n }\n }\n\n handleValidateCredentialsRequest(cred, code, token) {\n if (this.tinode.isAuthenticated()) {\n // Adding new email or phone number in account setting.\n this.tinode.getMeTopic().setMeta({cred: {meth: cred, resp: code}})\n .catch(err => this.handleError(err.message, 'err'));\n } else {\n // Credential validation on signup.\n this.setState({credMethod: cred, credCode: code, credToken: token});\n this.doLogin(null, null, token, {meth: cred, resp: code});\n }\n }\n\n handlePasswordResetRequest(method, value) {\n // If already connected, connnect() will return a resolved promise.\n return this.tinode.connect()\n .then(_ => this.tinode.requestResetAuthSecret('basic', method, value))\n .catch(err => {\n // Socket error\n this.handleError(err.message, 'err');\n });\n }\n\n handleResetPassword(newPassword, tempAuth) {\n const secret = base64ReEncode(tempAuth.secret);\n if (!secret || !tempAuth.scheme) {\n this.handleError(this.props.intl.formatMessage(messages.invalid_security_token), 'err');\n } else {\n this.tinode.connect()\n .then(_ => this.tinode.updateAccountBasic(null, null, newPassword, {scheme: tempAuth.scheme, secret: secret}))\n .then(_ => HashNavigation.navigateTo(''))\n .catch(err => {\n // Socket error\n this.handleError(err.message, 'err');\n });\n }\n }\n\n handleShowCountrySelector(code, dial, selectedCallback) {\n this.handleShowAlert(\"Select country\",\n }>\n {\n this.setState({alertVisible: false});\n selectedCallback(c, d);\n }} />\n ,\n null, null, _ => {}, \"Cancel\");\n }\n\n handleStartVideoCall() {\n this.setState({\n callTopic: this.state.topicSelected,\n callState: CALL_STATE_OUTGOING_INITATED,\n callAudioOnly: false\n });\n }\n\n handleStartAudioCall() {\n this.setState({\n callTopic: this.state.topicSelected,\n callState: CALL_STATE_OUTGOING_INITATED,\n callAudioOnly: true\n });\n }\n\n handleCallInvite(callTopic, callSeq, callState, audioOnly) {\n switch (callState) {\n case CALL_STATE_OUTGOING_INITATED:\n const head = { webrtc: CALL_HEAD_STARTED, aonly: !!audioOnly };\n this.handleSendMessage(Drafty.videoCall(audioOnly), undefined, undefined, head)\n .then(ctrl => {\n if (ctrl.code < 200 || ctrl.code >= 300 || !ctrl.params || !ctrl.params.seq) {\n this.handleCallClose();\n return;\n }\n this.setState({callSeq: ctrl.params['seq']});\n });\n break;\n case CALL_STATE_IN_PROGRESS:\n const topic = this.tinode.getTopic(callTopic);\n if (!topic) {\n return;\n }\n // We've accepted the call. Let the other side know.\n topic.videoCall('accept', callSeq);\n break;\n }\n }\n\n handleCallRinging(callTopic, callSeq) {\n const topic = this.tinode.getTopic(callTopic);\n if (!topic) {\n return;\n }\n\n topic.videoCall('ringing', callSeq);\n }\n\n handleCallHangup(callTopic, callSeq) {\n const topic = this.tinode.getTopic(callTopic);\n if (!topic) {\n return;\n }\n\n topic.videoCall('hang-up', callSeq);\n }\n\n handleCallSendOffer(callTopic, callSeq, sdp) {\n const topic = this.tinode.getTopic(callTopic);\n if (!topic) {\n return;\n }\n\n topic.videoCall('offer', callSeq, sdp);\n }\n\n handleCallIceCandidate(callTopic, callSeq, candidate) {\n const topic = this.tinode.getTopic(callTopic);\n if (!topic) {\n return;\n }\n\n topic.videoCall('ice-candidate', callSeq, candidate);\n }\n handleCallSendAnswer(callTopic, callSeq, sdp) {\n const topic = this.tinode.getTopic(callTopic);\n if (!topic) {\n return;\n }\n\n topic.videoCall('answer', callSeq, sdp);\n }\n\n handleCallClose() {\n if (this.callTimeoutTimer) {\n clearTimeout(this.callTimeoutTimer);\n }\n this.setState({\n callTopic: undefined,\n callState: CALL_STATE_NONE,\n callAudioOnly: undefined\n });\n }\n\n handleCallAccept(topicName) {\n const topic = this.tinode.getTopic(topicName);\n if (!topic) {\n return;\n }\n if (topic.isSubscribed()) {\n this.handleTopicSelected(this.state.callTopic);\n this.setState({\n callState: CALL_STATE_IN_PROGRESS\n });\n } else {\n // We need to switch and subscribe to callTopic first.\n this.setState({\n callShouldStart: true,\n }, _ => this.handleTopicSelected(this.state.callTopic));\n }\n }\n\n handleInfoMessage(info) {\n if (info.what != 'call') {\n return;\n }\n switch (info.event) {\n case 'accept':\n // If another my session has accepted the call.\n if (Tinode.isMeTopicName(info.topic) && this.tinode.isMe(info.from)) {\n this.setState({\n callTopic: null,\n callState: CALL_STATE_NONE,\n callSeq: null,\n callAudioOnly: undefined\n });\n return;\n }\n if (info.topic == this.state.callTopic) {\n // Update state.\n this.setState({callState: CALL_STATE_IN_PROGRESS});\n }\n break;\n case 'hang-up':\n // Remote hangup.\n this.handleCallClose();\n break;\n }\n }\n\n handleDataMessage(data) {\n if (data.head && data.head.webrtc && data.head.webrtc == CALL_HEAD_STARTED) {\n // If it's a video call invite message.\n // See if we need to display incoming call UI.\n const topic = this.tinode.getTopic(data.topic);\n if (topic) {\n // Check if a later version of the message exists (which means the call\n // has been either accepted or finished already).\n const msg = topic.latestMsgVersion(data.seq) || data;\n if (msg.head && msg.head.webrtc && msg.head.webrtc == CALL_HEAD_STARTED) {\n // This is a legit new call.\n if (data.from != this.state.myUserId) {\n if (this.state.callState == CALL_STATE_NONE) {\n // Incoming call.\n this.setState({\n callTopic: data.topic,\n callState: CALL_STATE_INCOMING_RECEIVED,\n callSeq: data.seq,\n callAudioOnly: !!msg.head.aonly\n });\n } else {\n // Another call is either in progress or being established.\n // Reject the incoming call.\n this.handleCallHangup(data.topic, data.seq);\n }\n }\n }\n } else {\n console.warn(\"Received vc data message from unknown topic\", data.topic);\n }\n }\n }\n\n render() {\n return (\n \n {this.state.contextMenuVisible ?\n
{\n if (topicName == this.state.topicSelected) {\n this.handleTopicSelected(null);\n }\n }}\n onError={this.handleError} />\n :\n null\n }\n {this.state.forwardDialogVisible ?\n \n :\n null\n }\n {this.state.callTopic && this.state.callState == CALL_STATE_INCOMING_RECEIVED ?\n \n :\n null\n }\n {this.state.alertVisible ?\n this.setState({alertVisible: false})) : null}\n reject={this.state.alertParams.reject}\n onConfirm={this.state.alertParams.onConfirm ?\n (_ => {this.setState({alertVisible: false}); this.state.alertParams.onConfirm();}) : null}\n confirm={this.state.alertParams.confirm}\n /> : null}\n \n\n \n\n {this.state.infoPanel ?\n \n :\n null\n }\n \n );\n }\n};\n\nexport default injectIntl(TinodeWeb);\n","// ValidationView: panel for confirming credentials, like email or phone.\nimport React from 'react';\nimport { FormattedMessage, defineMessages, injectIntl } from 'react-intl';\n\nconst messages = defineMessages({\n phone: {\n id: 'phone_dative',\n defaultMessage: 'phone',\n description: \"Dative case of 'phone', i.e. 'phone' in 'by phone'\",\n },\n email: {\n id: 'email_dative',\n defaultMessage: 'email',\n description: \"Dative case of 'email', i.e. 'email' in 'by email'\",\n }\n});\n\nclass ValidationView extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.state = {\n code: props.credCode || '',\n codeReceived: props.credCode\n };\n\n this.handleChange = this.handleChange.bind(this);\n this.handleKeyPress = this.handleKeyPress.bind(this);\n this.handleSubmit = this.handleSubmit.bind(this);\n this.handleCancel = this.handleCancel.bind(this);\n }\n\n static getDerivedStateFromProps(nextProps, prevState) {\n if (nextProps.credCode != prevState.codeReceived) {\n return {\n code: nextProps.credCode || '',\n codeReceived: nextProps.credCode\n };\n }\n\n return prevState;\n }\n\n componentDidMount() {\n // Submit code automatically if it's received from the parent.\n if (this.props.credCode) {\n this.props.onSubmit(this.props.credMethod, this.props.credCode, this.props.credToken);\n }\n }\n\n componentDidUpdate(prevProps, prevState) {\n // Submit code automatically if it's received from the parent.\n if (this.state.codeReceived && this.state.code && this.state.code != prevState.code) {\n this.props.onSubmit(this.props.credMethod, this.state.code, this.props.credToken);\n }\n }\n\n\n handleChange(e) {\n this.setState({code: e.target.value.trim()});\n }\n\n handleKeyPress(e) {\n if (e.key === 'Enter') {\n this.handleSubmit(e);\n } else if (e.key == 'Escape') {\n this.handleCancel(e);\n }\n }\n\n handleSubmit(e) {\n e.preventDefault();\n if (this.state.code && this.state.code.trim()) {\n this.props.onSubmit(this.props.credMethod, this.state.code.trim(), this.props.credToken);\n }\n }\n\n handleCancel(e) {\n e.preventDefault();\n this.props.onCancel();\n }\n\n render() {\n const { formatMessage } = this.props.intl;\n const methods = {'email': formatMessage(messages.email), 'tel': formatMessage(messages.phone)};\n const method = methods[this.props.credMethod] || this.props.credMethod;\n return (\n \n
\n \n \n \n
\n
\n {\n (numbers_only) => \n } \n
\n
\n \n \n \n \n \n \n
\n
\n );\n }\n};\n\nexport default injectIntl(ValidationView);\n","import React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nexport default class Alert extends React.PureComponent {\n render() {\n return (\n
\n
{this.props.title}
\n
{this.props.content}
\n
\n {this.props.onReject ?\n \n {this.props.reject || }\n \n :\n null\n }\n {this.props.onConfirm ?\n \n {this.props.confirm || }\n \n :\n null\n }\n
\n
\n
);\n }\n};\n","import React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport FileProgress from './file-progress.jsx';\nimport { bytesToHumanSize } from '../lib/strformat.js';\nimport { isUrlRelative, sanitizeUrl } from '../lib/utils.js';\n\nexport default class Attachment extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = {\n downloader: null,\n progress: 0\n };\n\n this.downloadFile = this.downloadFile.bind(this);\n this.handleCancel = this.handleCancel.bind(this);\n }\n\n downloadFile(url, filename, mimetype) {\n if (!url) {\n this.props.onError(\"Invalid download URL '\" + url + \"'\");\n return;\n }\n\n const downloader = this.props.tinode.getLargeFileHelper();\n this.setState({downloader: downloader});\n downloader.download(url, filename, mimetype,\n loaded => this.setState({progress: loaded / this.props.size}),\n err => this.props.onError(err, 'err')\n )\n .then(_ => this.setState({downloader: null, progress: 0}))\n .catch(err => {\n if (err) {\n this.props.onError(\"Error downloading file: \" + err.message, 'err');\n }\n this.setState({downloader: null, progress: 0});\n });\n }\n\n handleCancel() {\n if (this.props.uploading) {\n this.props.onCancelUpload();\n } else if (this.state.downloader) {\n this.state.downloader.cancel();\n }\n }\n\n render() {\n let filename = this.props.filename || 'file_attachment';\n if (filename.length > 36) {\n filename = filename.substr(0, 16) + '...' + filename.substr(-16);\n }\n let size = this.props.size > 0 ?\n ({bytesToHumanSize(this.props.size)}) :\n null;\n\n // Detect if the download URL is relative or absolute.\n // If the URL is relative use LargeFileHelper to attach authentication\n // credentials to the request.\n let url, helperFunc;\n if (!this.props.uploading && !this.state.downloader && isUrlRelative(this.props.downloadUrl)) {\n // Relative URL. Use download helper.\n url = '#';\n helperFunc = (e) => {\n e.preventDefault();\n this.downloadFile(this.props.downloadUrl, this.props.filename, this.props.mimetype);\n };\n } else {\n url = sanitizeUrl(this.props.downloadUrl);\n helperFunc = null;\n }\n const downloadWidget = <>file_download >;\n return (\n \n
insert_drive_file
\n
\n
{filename} {size}
\n {this.props.uploading || this.state.downloader ?\n
\n :\n
\n }\n
\n
\n );\n }\n};\n","// Audio recorder widget.\n\nimport React from 'react';\nimport { defineMessages, injectIntl } from 'react-intl';\n\nimport { secondsToTime } from '../lib/strformat';\nimport { base64ToIntArray } from '../lib/blob-helpers';\n\n// Make canvas bigger than the element size to reduce blurring.\nconst CANVAS_UPSCALING = 2.0;\n// Thickness of a visualization bar.\nconst LINE_WIDTH = 3 * CANVAS_UPSCALING;\n// Spacing between two visualization bars.\nconst SPACING = 2 * CANVAS_UPSCALING;\n// Color of histogram bars.\nconst BAR_COLOR = '#888A';\nconst BAR_COLOR_DARK = '#666C';\nconst THUMB_COLOR = '#444E';\n// Minimum number of amplitude bars to draw.\nconst MIN_PREVIEW_LENGTH = 16;\n\nconst messages = defineMessages({\n icon_title_play: {\n id: 'icon_title_play',\n defaultMessage: 'Play recording',\n description: 'Icon tool tip for starting audio playback'\n }\n});\n\nclass AudioPlayer extends React.PureComponent {\n constructor(props) {\n super(props);\n\n let preview = base64ToIntArray(this.props.preview);\n if (!Array.isArray(preview) || preview.length < MIN_PREVIEW_LENGTH) {\n preview = null;\n }\n\n this.state = {\n canPlay: false,\n playing: false,\n currentTime: '0:00',\n duration: this.props.duration > 0 ? secondsToTime(this.props.duration / 1000) : '-:--',\n longMin: this.props.duration >= 600000,\n preview: preview\n };\n\n this.initAudio = this.initAudio.bind(this);\n this.initCanvas = this.initCanvas.bind(this);\n this.resampleBars = this.resampleBars.bind(this);\n this.visualize = this.visualize.bind(this);\n\n this.handlePlay = this.handlePlay.bind(this);\n this.handleSeek = this.handleSeek.bind(this);\n this.handleError = this.handleError.bind(this);\n\n this.audioPlayer = null;\n\n this.viewBuffer = [];\n this.canvasRef = React.createRef();\n }\n\n componentDidMount() {\n if (this.props.src) {\n this.initAudio();\n }\n\n this.initCanvas();\n }\n\n componentWillUnmount() {\n if (this.audioPlayer) {\n this.audioPlayer.oncanplay = null;\n this.audioPlayer.ontimeupdate = null;\n this.audioPlayer.onended = null;\n this.audioPlayer.pause();\n this.audioPlayer = null;\n }\n }\n\n componentDidUpdate(prevProps) {\n if (this.props.src != prevProps.src) {\n this.initAudio();\n }\n\n if (this.props.preview != prevProps.preview) {\n let preview = base64ToIntArray(this.props.preview);\n if (!Array.isArray(preview) || preview.length < MIN_PREVIEW_LENGTH) {\n preview = null;\n }\n this.setState({preview: preview}, this.initCanvas);\n }\n }\n\n initAudio() {\n this.audioPlayer = new Audio(this.props.src);\n this.audioPlayer.oncanplay = _ => this.setState({canPlay: true});\n this.audioPlayer.ontimeupdate = _ => this.setState({\n currentTime: secondsToTime(this.audioPlayer.currentTime, this.state.longMin)\n });\n this.audioPlayer.onended = _ => {\n this.audioPlayer.currentTime = 0;\n this.setState({playing: false, currentTime: secondsToTime(0, this.state.longMin)})\n }\n }\n\n initCanvas() {\n // Force canvas aspect ratio to match one of the element + upscale canvas to reduce blurring.\n this.canvasRef.current.width = this.canvasRef.current.offsetWidth * CANVAS_UPSCALING;\n this.canvasRef.current.height = this.canvasRef.current.offsetHeight * CANVAS_UPSCALING;\n\n this.canvasContext = this.canvasRef.current.getContext('2d');\n this.canvasContext.lineCap = 'round';\n\n this.viewBuffer = this.resampleBars(this.state.preview);\n this.visualize();\n }\n\n // Draw amplitude of sound.\n visualize() {\n if (!this.canvasRef.current) {\n return;\n }\n\n const width = this.effectiveWidth;\n const height = this.canvasRef.current.height;\n\n this.canvasContext.lineWidth = LINE_WIDTH;\n\n const drawFrame = _ => {\n if (!this.canvasRef.current || !this.audioPlayer) {\n // The component is unmounted.\n return;\n }\n\n this.canvasContext.clearRect(0, 0, this.canvasRef.current.width, height);\n\n if (this.viewBuffer) {\n if (this.state.playing) {\n window.requestAnimationFrame(drawFrame);\n }\n\n // Current playback position.\n const thumbAt = this.props.duration ?\n Math.max(0, Math.min(this.audioPlayer.currentTime * 1000 / this.props.duration, 1)) * (width - LINE_WIDTH * 2) : -1;\n\n // Draw amplitude bars.\n this.canvasContext.beginPath();\n this.canvasContext.strokeStyle = BAR_COLOR_DARK;\n for (let i = 0; i < this.viewBuffer.length; i++) {\n let x = 1 + i * (LINE_WIDTH + SPACING) + LINE_WIDTH * 0.5;\n let y = this.viewBuffer[i] * height * 0.9;\n\n const color = x < thumbAt ? BAR_COLOR_DARK : BAR_COLOR;\n if (this.canvasContext.strokeStyle != color) {\n this.canvasContext.stroke();\n this.canvasContext.beginPath();\n this.canvasContext.strokeStyle = color;\n }\n\n this.canvasContext.moveTo(x, (height - y) * 0.5);\n this.canvasContext.lineTo(x, height * 0.5 + y * 0.5);\n }\n // Actually draw the bars on canvas.\n this.canvasContext.stroke();\n\n // Draw thumb.\n if (this.props.duration) {\n this.canvasContext.beginPath();\n this.canvasContext.arc(thumbAt + LINE_WIDTH * 2, height * 0.5, LINE_WIDTH * 2, 0, 2 * Math.PI);\n this.canvasContext.fillStyle = THUMB_COLOR;\n this.canvasContext.fill();\n }\n }\n }\n\n drawFrame();\n }\n\n // Quick and dirty downsampling of the original preview bars into a smaller (or equal) number of bars we can display here.\n resampleBars(original) {\n const dstCount = ((this.canvasRef.current.width - SPACING) / (LINE_WIDTH + SPACING)) | 0;\n // Remove extra padding on the right due to fractional bar which is not drawn.\n this.effectiveWidth = dstCount * (LINE_WIDTH + SPACING) + SPACING;\n\n if (!Array.isArray(original) || original.length == 0) {\n return Array.apply(null, Array(dstCount)).map(_ => 0.01);\n }\n\n const factor = original.length / dstCount;\n let amps = [];\n let maxAmp = -1;\n for (let i=0; i 0) {\n return amps.map(a => a / maxAmp);\n }\n return Array.apply(null, Array(dstCount)).map(_ => 0.01);\n }\n\n handlePlay(e) {\n e.preventDefault();\n if (!this.state.canPlay) {\n return;\n }\n if (this.state.playing) {\n this.audioPlayer.pause();\n this.setState({playing: false});\n } else {\n this.audioPlayer.play();\n this.setState({playing: true}, this.visualize);\n }\n }\n\n handleError(err) {\n console.error(err);\n }\n\n handleSeek(e) {\n e.preventDefault();\n if (e.target && this.props.duration) {\n const rect = e.target.getBoundingClientRect();\n const offset = (e.clientX - rect.left) / this.effectiveWidth * CANVAS_UPSCALING;\n this.audioPlayer.currentTime = this.props.duration * offset / 1000;\n this.setState({currentTime: secondsToTime(this.audioPlayer.currentTime, this.state.longMin)});\n if (!this.state.playing) {\n this.visualize();\n }\n }\n }\n\n render() {\n const playClass = 'material-icons' +\n (this.props.short ? '' : ' large') +\n (this.state.canPlay ? '' : ' disabled');\n const play = (\n {this.state.playing ? 'pause_circle' :\n (this.state.canPlay ? 'play_circle' : 'not_interested')} \n );\n return ({this.props.short ?\n <>\n
\n {play}\n >\n :\n <>\n {play}\n
\n
\n
{this.state.currentTime}/{this.state.duration}
\n
\n >\n }\n
);\n }\n}\n\nexport default injectIntl(AudioPlayer);\n","// Edit account parameters.\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport Cropper from './cropper.jsx';\nimport { imageCrop } from '../lib/blob-helpers.js';\n\nexport default class AvatarCrop extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.state = {\n top: 0,\n left: 0,\n width: 0,\n height: 0,\n scale: 1\n };\n\n this.handleSubmit = this.handleSubmit.bind(this);\n this.handleChange = this.handleChange.bind(this);\n }\n\n // Cut out in image coordinates and desired scale factor.\n handleChange(left, top, width, height, scale) {\n this.setState({\n left: left,\n top: top,\n width: width,\n height: height,\n scale: scale\n });\n }\n\n handleSubmit() {\n imageCrop(this.props.mime, this.props.avatar,\n this.state.left, this.state.top, this.state.width, this.state.height,\n this.state.scale)\n .then(img => {\n this.props.onSubmit(img.mime, img.blob, img.width, img.height);\n })\n .catch(err => {\n this.props.onError(err);\n });\n }\n\n render() {\n return (\n \n
\n \n
\n
\n {this.props.onCancel ?\n \n \n \n : null}\n \n \n \n
\n
\n );\n }\n};\n","import React from 'react';\n\nimport LetterTile from './letter-tile.jsx';\nimport LoadSpinner from './load-spinner.jsx';\n\nimport { sanitizeUrlForMime } from '../lib/utils.js';\n\nimport { AVATAR_SIZE } from '../config.js';\n\nexport default class AvatarUpload extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = {\n source: props.avatar\n };\n\n this.handleFileReceived = this.handleFileReceived.bind(this);\n }\n\n componentDidUpdate(prevProps) {\n if (this.props.avatar != prevProps.avatar) {\n this.setState({source: this.props.avatar});\n }\n }\n\n handleFileReceived(e) {\n const image = e.target.files[0];\n this.props.onImageUpdated(image.type, URL.createObjectURL(image), image.name);\n // Clear the value so the same file can be uploaded again.\n e.target.value = '';\n }\n\n render() {\n // Randomize id value in case more than one AvatarUpload is shown\n // at the same time.\n const randId = 'file-input-avatar-' + ('' + Math.random()).substring(0, 4);\n const className = 'avatar-upload' + (this.props.readOnly ? ' read-only' : '');\n return (\n \n {this.props.readOnly || !this.state.source ?\n null :\n
{e.preventDefault(); this.props.onImageUpdated();}}>\n clear \n }\n {this.state.source ?\n
:\n this.props.readOnly && this.props.uid ?\n
\n \n
\n :\n
{AVATAR_SIZE}×{AVATAR_SIZE}
}\n {this.props.readOnly ? null :\n
}\n {this.props.readOnly ? null :\n
\n file_upload \n }\n
\n
\n );\n }\n};\n","import React from 'react';\nimport { defineMessages, injectIntl } from 'react-intl';\n\nconst icon_mapping = {'staff': 'verified_user'};\n\nconst messages = defineMessages({\n badge_verified: {\n id: 'badge_verified',\n defaultMessage: 'Verified/official',\n description: 'Explanation of a verified account or topic badge'\n },\n badge_staff: {\n id: 'badge_staff',\n defaultMessage: 'Staff-managed',\n description: 'Explanation of a staff-managed account or topic badge'\n },\n badge_danger: {\n id: 'badge_danger',\n defaultMessage: 'Untrustworthy',\n description: 'Suspicious or untrustworthy account or topic badge'\n },\n});\n\n\n/* Trusted badges with labels: verified, staff, danger */\nclass BadgeList extends React.PureComponent {\n render() {\n const {formatMessage} = this.props.intl;\n let badges = null;\n if (this.props.trustedBadges && this.props.trustedBadges.length > 0) {\n badges = [];\n this.props.trustedBadges.map((b) => {\n const comment = this.props.short ? null : formatMessage(messages['badge_' + b]);\n const style = 'material-icons ' + b + '-color';\n badges.push({icon_mapping[b] || b} {comment}
);\n });\n return <>{badges}>;\n }\n return null;\n }\n};\n\nexport default injectIntl(BadgeList);\n","// The <- button to be displayed in title bars.\nimport React from 'react';\n\nexport default class ButtonBack extends React.PureComponent {\n render() {\n return (\n {e.preventDefault(); this.props.onBack();}}>\n arrow_back \n \n );\n }\n}\n","// IncomingCall: displays Accept & Reject buttons for incoming calls.\nimport React from 'react';\n\nimport BadgeList from './badge-list.jsx';\nimport LetterTile from './letter-tile.jsx';\n\nimport { MAX_TITLE_LENGTH, MAX_PEER_TITLE_LENGTH } from '../config.js';\nimport { CALL_STATE_INCOMING_RECEIVED } from '../constants.js';\n\nimport { makeImageUrl } from '../lib/blob-helpers.js';\nimport { clipStr } from '../lib/utils.js'\n\nconst RING_SOUND = new Audio('audio/call-in.m4a');\n\nexport default class CallIncoming extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = {\n topic: null,\n fullName: undefined,\n avatar: null,\n trustedBadges: [],\n previousMetaDesc: undefined,\n };\n\n this.resetDesc = this.resetDesc.bind(this);\n this.onMetaDesc = this.onMetaDesc.bind(this);\n this.handleRejectCall = this.handleRejectCall.bind(this);\n this.handleAcceptCall = this.handleAcceptCall.bind(this);\n this.ringTimer = null;\n }\n\n componentDidMount() {\n const topic = this.props.tinode.getTopic(this.props.topic);\n if (!topic) {\n return;\n }\n\n this.resetDesc(topic);\n if (this.props.callState == CALL_STATE_INCOMING_RECEIVED) {\n // play() throws if the user did not click the app first: https://goo.gl/xX8pDD.\n RING_SOUND.play().catch(_ => {});\n this.ringTimer = setInterval(_ => {RING_SOUND.play().catch(_ => {})}, 2000);\n this.props.onRinging(this.props.topic, this.props.seq);\n }\n }\n\n // No need to separately handle component mount.\n componentDidUpdate(props) {\n const topic = this.props.tinode.getTopic(props.topic);\n if (!topic) {\n return;\n }\n\n if (this.onMetaDesc != topic.onMetaDesc) {\n this.previousMetaDesc = topic.onMetaDesc;\n topic.onMetaDesc = this.onMetaDesc;\n }\n\n if (this.state.topic != props.topic) {\n this.setState({topic: props.topic});\n this.resetDesc(topic, props);\n }\n }\n\n componentWillUnmount() {\n if (this.ringTimer != null) {\n clearInterval(this.ringTimer);\n RING_SOUND.pause();\n }\n const topic = this.props.tinode.getTopic(this.props.topic);\n if (!topic) {\n return;\n }\n this.setState({topic: null});\n topic.onMetaDesc = this.previousMetaDesc;\n }\n\n resetDesc(topic) {\n const badges = [];\n if (topic.trusted) {\n for (const [key, val] of Object.entries(topic.trusted)) {\n if (val) {\n badges.push(key);\n }\n }\n }\n\n this.setState({\n fullName: clipStr(topic.public ? topic.public.fn : undefined, MAX_TITLE_LENGTH),\n avatar: makeImageUrl(topic.public ? topic.public.photo : null),\n trustedBadges: badges,\n });\n }\n\n onMetaDesc(desc) {\n const topic = this.props.tinode.getTopic(this.props.topic);\n if (!topic) {\n return;\n }\n this.resetDesc(topic);\n\n if (this.previousMetaDesc && this.previousMetaDesc != this.onMetaDesc) {\n this.previousMetaDesc(desc);\n }\n }\n\n handleAcceptCall() {\n this.props.onAcceptCall(this.props.topic);\n }\n\n handleRejectCall() {\n this.props.onReject(this.props.topic, this.props.seq);\n this.props.onClose();\n }\n\n render() {\n return (\n \n
\n
\n
\n \n
\n
{clipStr(this.state.fullName, MAX_PEER_TITLE_LENGTH)}\n
\n
\n
\n {this.props.callState == CALL_STATE_INCOMING_RECEIVED ?\n <>\n \n call_end \n \n \n call \n \n >\n :\n null\n }\n
\n
\n
\n );\n }\n};\n","// Chat message describing a video or voice call.\n\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport { secondsToTime } from '../lib/strformat.js';\n\nexport default class CallMessage extends React.PureComponent {\n render() {\n const isCallDropped = ['declined', 'disconnected', 'missed'].includes(this.props.callState);\n const successClass = 'material-icons medium ' + (isCallDropped ? 'red' : 'green');\n const callIcon = this.props.incoming ?\n (isCallDropped ? 'call_missed' : 'call_received') :\n (isCallDropped ? 'call_missed_outgoing' : 'call_made');\n let duration;\n if (isCallDropped) {\n switch (this.props.callState) {\n case 'declined':\n duration = ;\n break;\n case 'missed':\n duration = this.props.incoming ?\n :\n ;\n break;\n default:\n duration = ;\n break;\n }\n } else {\n duration = {secondsToTime(this.props.duration / 1000)} ;\n }\n return \n
call
\n
\n
{this.props.incoming ?\n :\n \n }
\n
{callIcon} {duration}
\n
\n
;\n }\n}\n","// CallPanel displays call in progress: local and remote viewports and controls.\nimport React from 'react';\nimport { FormattedMessage, defineMessages, injectIntl } from 'react-intl';\n\nimport LetterTile from './letter-tile.jsx';\n\nimport { MAX_PEER_TITLE_LENGTH } from '../config.js';\nimport { CALL_STATE_OUTGOING_INITATED, CALL_STATE_IN_PROGRESS } from '../constants.js';\n\nimport { clipStr } from '../lib/utils.js'\n\nconst RING_SOUND = new Audio('audio/call-out.m4a');\nRING_SOUND.loop = true;\nconst CALL_ENDED_SOUND = new Audio('audio/call-end.m4a');\nCALL_ENDED_SOUND.loop = true;\nconst DIALING_SOUND = new Audio('audio/dialing.m4a');\n\nconst VIDEO_MUTED_EVENT = 'video:muted';\nconst VIDEO_UNMUTED_EVENT = 'video:unmuted';\n\nconst messages = defineMessages({\n already_in_call: {\n id: 'already_in_call',\n defaultMessage: 'You already in an ongoing call!',\n description: 'Error message when the user tried to accept a new call without finishing pervious one',\n }\n});\n\nclass CallPanel extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.state = {\n localStream: undefined,\n remoteStream: undefined,\n pc: undefined,\n dataChannel: undefined,\n\n previousOnInfo: undefined,\n waitingForPeer: false,\n // If true, the client has received a remote SDP from the peer and has sent a local SDP to the peer.\n callInitialSetupComplete: false,\n audioOnly: props.callAudioOnly,\n // Video mute/unmute in progress.\n videoToggleInProgress: false,\n // Indicates if the remote peer has informed us that their camera is on.\n remoteVideoLive: false,\n };\n\n this.localStreamConstraints = {\n audio: true,\n video: !props.callAudioOnly\n };\n this.isOutgoingCall = props.callState == CALL_STATE_OUTGOING_INITATED;\n\n this.localRef = React.createRef();\n this.remoteRef = React.createRef();\n // Cache for remote ice candidates until initial setup gets completed.\n this.remoteIceCandidatesCache = [];\n\n this.onInfo = this.onInfo.bind(this);\n this.start = this.start.bind(this);\n this.stop = this.stop.bind(this);\n\n this.createPeerConnection = this.createPeerConnection.bind(this);\n this.canSendOffer = this.canSendOffer.bind(this);\n this.drainRemoteIceCandidatesCache = this.drainRemoteIceCandidatesCache.bind(this);\n\n this.handleNegotiationNeededEvent = this.handleNegotiationNeededEvent.bind(this);\n this.handleICECandidateEvent = this.handleICECandidateEvent.bind(this);\n this.handleNewICECandidateMsg = this.handleNewICECandidateMsg.bind(this);\n this.handleICEConnectionStateChangeEvent = this.handleICEConnectionStateChangeEvent.bind(this);\n this.handleSignalingStateChangeEvent = this.handleSignalingStateChangeEvent.bind(this);\n this.handleICEGatheringStateChangeEvent = this.handleICEGatheringStateChangeEvent.bind(this);\n this.handleIceCandidateErrorEvent = this.handleIceCandidateErrorEvent.bind(this);\n this.handleTrackEvent = this.handleTrackEvent.bind(this);\n\n this.handleVideoOfferMsg = this.handleVideoOfferMsg.bind(this);\n this.handleVideoAnswerMsg = this.handleVideoAnswerMsg.bind(this);\n this.handleNewICECandidateMsg = this.handleNewICECandidateMsg.bind(this);\n\n this.reportError = this.reportError.bind(this);\n this.handleGetUserMediaError = this.handleGetUserMediaError.bind(this);\n\n this.stopTracks = this.stopTracks.bind(this);\n this.disconnectMedia = this.disconnectMedia.bind(this);\n\n this.handleCloseClick = this.handleCloseClick.bind(this);\n this.handleToggleCameraClick = this.handleToggleCameraClick.bind(this);\n this.handleToggleMicClick = this.handleToggleMicClick.bind(this);\n\n this.handleRemoteHangup = this.handleRemoteHangup.bind(this);\n this.handleVideoCallAccepted = this.handleVideoCallAccepted.bind(this);\n\n this.muteVideo = this.muteVideo.bind(this);\n this.unmuteVideo = this.unmuteVideo.bind(this);\n this.emptyVideoTrack = this.emptyVideoTrack.bind(this);\n\n this.handleDataChannelEvent = this.handleDataChannelEvent.bind(this);\n this.handleDataChannelError = this.handleDataChannelError.bind(this);\n this.handleDataChannelMessage = this.handleDataChannelMessage.bind(this);\n this.handleDataChannelOpen = this.handleDataChannelOpen.bind(this);\n this.handleDataChannelClose = this.handleDataChannelClose.bind(this);\n }\n\n componentDidMount() {\n const topic = this.props.tinode.getTopic(this.props.topic);\n this.previousOnInfo = topic.onInfo;\n topic.onInfo = this.onInfo;\n if ((this.props.callState == CALL_STATE_OUTGOING_INITATED ||\n this.props.callState == CALL_STATE_IN_PROGRESS) && this.localRef.current) {\n this.start();\n }\n }\n\n componentWillUnmount() {\n const topic = this.props.tinode.getTopic(this.props.topic);\n topic.onInfo = this.previousOnInfo;\n this.stop();\n }\n\n handleVideoCallAccepted(info) {\n RING_SOUND.pause();\n const pc = this.createPeerConnection();\n const stream = this.state.localStream;\n stream.getTracks().forEach(track => {\n pc.addTrack(track, stream);\n\n if (track.kind == 'video' && this.state.audioOnly) {\n // This is an audio-only call.\n // Remove dummy video track (placeholder remains).\n track.enabled = false;\n track.stop();\n stream.removeTrack(track);\n }\n });\n }\n\n onInfo(info) {\n if (info.what != 'call') {\n return;\n }\n switch (info.event) {\n case 'accept':\n this.handleVideoCallAccepted(info);\n break;\n case 'answer':\n this.handleVideoAnswerMsg(info);\n break;\n case 'ice-candidate':\n this.handleNewICECandidateMsg(info);\n break;\n case 'hang-up':\n this.handleRemoteHangup(info);\n break;\n case 'offer':\n this.handleVideoOfferMsg(info);\n break;\n case 'ringing':\n // play() throws if the user did not click the app first: https://goo.gl/xX8pDD.\n RING_SOUND.play().catch(_ => {});\n break;\n default:\n console.warn(\"Unknown call event\", info.event);\n break;\n }\n }\n\n // Creates an empty video track placeholder.\n emptyVideoTrack() {\n const width = 640;\n const height = 480;\n const canvas = Object.assign(document.createElement(\"canvas\"), {width, height});\n canvas.getContext('2d').fillRect(0, 0, width, height);\n const stream = canvas.captureStream(0);\n return Object.assign(stream.getVideoTracks()[0], {enabled: false});\n }\n\n start() {\n if (this.state.localStream) {\n this.props.onError(this.props.intl.formatMessage(messages.already_in_call), 'info');\n return;\n }\n\n if (this.props.callState == CALL_STATE_IN_PROGRESS) {\n // We apparently just accepted the call.\n this.props.onInvite(this.props.topic, this.props.seq, CALL_STATE_IN_PROGRESS, this.props.callAudioOnly);\n return;\n }\n\n // This is an outgoing call waiting for the other side to pick up.\n // Start local video.\n navigator.mediaDevices.getUserMedia(this.localStreamConstraints)\n .then(stream => {\n if (!this.localStreamConstraints.video) {\n // Starting an audio-only call. Create a dummy video track\n // (so video can be enabled during the call if the user desires).\n stream.addTrack(this.emptyVideoTrack());\n }\n this.setState({localStream: stream, waitingForPeer: true});\n this.localRef.current.srcObject = stream;\n\n DIALING_SOUND.play();\n\n // Send call invitation.\n this.props.onInvite(this.props.topic, this.props.seq, this.props.callState, this.props.callAudioOnly);\n })\n .catch(this.handleGetUserMediaError);\n }\n\n stop() {\n CALL_ENDED_SOUND.pause();\n CALL_ENDED_SOUND.currentTime = 0;\n RING_SOUND.pause();\n RING_SOUND.currentTime = 0;\n\n this.stopTracks(this.state.localStream);\n this.stopTracks(this.state.remoteStream);\n this.disconnectMedia(this.localRef.current);\n this.disconnectMedia(this.remoteRef.current);\n if (this.state.pc) {\n this.state.pc.ontrack = null;\n this.state.pc.onremovetrack = null;\n this.state.pc.onremovestream = null;\n this.state.pc.onicecandidate = null;\n this.state.pc.oniceconnectionstatechange = null;\n this.state.pc.onsignalingstatechange = null;\n this.state.pc.onicegatheringstatechange = null;\n this.state.pc.onnegotiationneeded = null;\n this.state.pc.onicecandidateerror = null;\n this.state.pc.ondatachannel = null;\n\n if (this.state.dataChannel) {\n this.state.dataChannel.close();\n }\n this.state.pc.close();\n }\n this.setState({pc: null, waitingForPeer: false});\n }\n\n disconnectMedia(el) {\n if (!el) {\n return;\n }\n\n el.srcObject = null;\n el.src = '';\n }\n\n stopTracks(stream) {\n if (!stream) {\n return;\n }\n\n let tracks = stream.getTracks();\n if (tracks) {\n tracks.forEach(track => {\n track.stop();\n track.enabled = false;\n });\n }\n }\n\n handleDataChannelError(error) {\n console.error('data channel error', error);\n }\n\n handleDataChannelMessage(event) {\n switch (event.data) {\n case VIDEO_MUTED_EVENT:\n this.setState({remoteVideoLive: false}, _ => { this.remoteRef.current.srcObject = this.state.remoteStream; });\n break;\n case VIDEO_UNMUTED_EVENT:\n this.setState({remoteVideoLive: true}, _ => { this.remoteRef.current.srcObject = this.state.remoteStream; });\n break;\n default:\n break;\n }\n }\n\n handleDataChannelOpen(event) {\n if (!this.state.audioOnly) {\n event.target.send(VIDEO_UNMUTED_EVENT);\n }\n }\n\n handleDataChannelClose() {\n /* no action */\n }\n\n handleDataChannelEvent(event) {\n const channel = event.channel;\n channel.onerror = this.handleDataChannelError;\n channel.onmessage = this.handleDataChannelMessage;\n channel.onopen = this.handleDataChannelOpen;\n channel.onclose = this.handleDataChannelClose;\n this.setState({dataChannel: channel});\n }\n\n createPeerConnection() {\n const iceServers = this.props.tinode.getServerParam('iceServers', null);\n const pc = iceServers ? new RTCPeerConnection({iceServers: iceServers}) : new RTCPeerConnection();\n\n pc.onicecandidate = this.handleICECandidateEvent;\n pc.oniceconnectionstatechange = this.handleICEConnectionStateChangeEvent;\n pc.onicegatheringstatechange = this.handleICEGatheringStateChangeEvent;\n pc.onsignalingstatechange = this.handleSignalingStateChangeEvent;\n pc.onnegotiationneeded = this.handleNegotiationNeededEvent;\n pc.onicecandidateerror = this.handleIceCandidateErrorEvent;\n pc.ontrack = this.handleTrackEvent;\n pc.ondatachannel = this.handleDataChannelEvent;\n\n // creating data channel events\n const channel = pc.createDataChannel(\"events\", {ordered: true});\n channel.onerror = this.handleDataChannelError;\n channel.onmessage = this.handleDataChannelMessage;\n channel.onopen = this.handleDataChannelOpen;\n channel.onclose = this.handleDataChannelClose;\n\n this.setState({pc: pc, dataChannel: channel, waitingForPeer: false});\n\n return pc;\n }\n\n handleVideoAnswerMsg(info) {\n // Configure the remote description, which is the SDP payload\n // in 'info' message.\n const desc = new RTCSessionDescription(info.payload);\n this.state.pc.setRemoteDescription(desc)\n .then(_ => {\n this.setState({ callInitialSetupComplete: true }, _ => this.drainRemoteIceCandidatesCache());\n })\n .catch(err => this.reportError(err));\n }\n\n reportError(err) {\n this.props.onError(err.message, 'err');\n }\n\n canSendOffer() {\n return this.isOutgoingCall || this.state.callInitialSetupComplete;\n }\n\n handleNegotiationNeededEvent(event) {\n const pc = event.target;\n if (!this.canSendOffer()) {\n return;\n }\n pc.createOffer().then(offer => {\n return pc.setLocalDescription(offer);\n })\n .then(_ => {\n this.props.onSendOffer(this.props.topic, this.props.seq, pc.localDescription.toJSON());\n })\n .catch(err => this.reportError(err));\n }\n\n handleIceCandidateErrorEvent(event) {\n console.warn(\"ICE candidate error:\", event);\n }\n\n handleICECandidateEvent(event) {\n if (event.candidate) {\n this.props.onIceCandidate(this.props.topic, this.props.seq, event.candidate.toJSON());\n }\n }\n\n handleNewICECandidateMsg(info) {\n const candidate = new RTCIceCandidate(info.payload);\n if (this.state.callInitialSetupComplete) {\n this.state.pc.addIceCandidate(candidate)\n .catch(err => {\n if (candidate.candidate) {\n this.reportError(err);\n }\n console.warn(\"Error adding new ice candidate\", candidate, err);\n });\n } else {\n this.remoteIceCandidatesCache.push(candidate);\n }\n }\n\n drainRemoteIceCandidatesCache() {\n this.remoteIceCandidatesCache.forEach(candidate => {\n this.state.pc.addIceCandidate(candidate)\n .catch(err => {\n if (candidate.candidate) {\n this.reportError(err);\n }\n console.warn(\"Error adding cached ice candidate\", candidate, err);\n });\n });\n this.remoteIceCandidatesCache = [];\n }\n\n handleICEConnectionStateChangeEvent(event) {\n switch (event.target.iceConnectionState) {\n case 'closed':\n case 'failed':\n this.handleCloseClick();\n break;\n }\n }\n\n handleSignalingStateChangeEvent(event) {\n if (event.target.signalingState == 'closed') {\n this.handleCloseClick();\n }\n }\n\n handleICEGatheringStateChangeEvent(event) {\n // ICE gathering change state\n }\n\n handleTrackEvent(event) {\n // Remote video becomes available.\n this.remoteRef.current.srcObject = event.streams[0];\n this.setState({remoteStream: event.streams[0]});\n }\n\n handleGetUserMediaError(e) {\n console.error(\"Error opening camera and/or microphone\", e);\n switch(e.name) {\n case 'NotFoundError':\n // Cannot start the call b/c no camera and/or microphone found.\n this.reportError(e);\n break;\n case 'SecurityError':\n case 'PermissionDeniedError':\n // Do nothing; this is the same as the user canceling the call.\n break;\n default:\n this.reportError(e);\n break;\n }\n\n // Make sure we shut down our end of the RTCPeerConnection so we're\n // ready to try again.\n this.handleCloseClick();\n }\n\n handleVideoOfferMsg(info) {\n let localStream = null;\n const pc = this.state.pc ? this.state.pc : this.createPeerConnection();\n const desc = new RTCSessionDescription(info.payload);\n\n pc.setRemoteDescription(desc).then(_ => {\n return navigator.mediaDevices.getUserMedia(this.localStreamConstraints);\n })\n .then(stream => {\n let dummyVideo;\n if (!this.localStreamConstraints.video) {\n // Starting an audio-only call. Create an empty video track so\n // so the user can enable the video during the call.\n dummyVideo = this.emptyVideoTrack();\n stream.addTrack(dummyVideo);\n }\n localStream = stream;\n this.localRef.current.srcObject = stream;\n this.setState({localStream: stream});\n\n localStream.getTracks().forEach(track => {\n pc.addTrack(track, localStream);\n });\n\n if (dummyVideo) {\n dummyVideo.enabled = false;\n dummyVideo.stop();\n stream.removeTrack(dummyVideo);\n }\n })\n .then(_ => {\n return pc.createAnswer();\n })\n .then(answer => {\n return pc.setLocalDescription(answer);\n })\n .then(_ => {\n this.props.onSendAnswer(this.props.topic, this.props.seq, pc.localDescription.toJSON());\n this.setState({ callInitialSetupComplete: true }, _ => this.drainRemoteIceCandidatesCache());\n })\n .catch(this.handleGetUserMediaError);\n }\n\n // Call disconnected by remote.\n handleRemoteHangup() {\n if (!this.state.waitingForPeer) {\n // This is live call, just hang up.\n this.handleCloseClick();\n } else {\n // This is a call which is not yet connected.\n // Stop pulse animation.\n this.setState({waitingForPeer: false});\n // Change sound and wait a bit before ending it.\n RING_SOUND.pause();\n RING_SOUND.currentTime = 0;\n CALL_ENDED_SOUND.loop = true;\n CALL_ENDED_SOUND.play().catch(_ => {});\n setTimeout(_ => {\n this.handleCloseClick();\n }, 2000);\n }\n }\n\n handleCloseClick() {\n this.stop();\n this.props.onHangup(this.props.topic, this.props.seq);\n }\n\n // Ends video track and turns off the camera.\n muteVideo() {\n if (!this.state.pc || !this.state.dataChannel) {\n return;\n }\n\n const stream = this.state.localStream;\n const t = stream.getVideoTracks()[0];\n t.enabled = false;\n t.stop();\n\n stream.removeTrack(t);\n this.state.dataChannel.send(VIDEO_MUTED_EVENT);\n this.setState({videoToggleInProgress: false});\n }\n\n unmuteVideo() {\n if (!this.state.pc || !this.state.dataChannel) {\n return;\n }\n navigator.mediaDevices.getUserMedia({ video: true })\n .then(stream => {\n // Will extract video track from stream and throw stream away,\n // and replace video track in the media sender.\n this.localRef.current.srcObject = null;\n const sender = this.state.pc.getSenders().find(s => s.track.kind == 'video');\n const track = stream.getVideoTracks()[0];\n // Remote track from new stream.\n stream.removeTrack(track);\n // Add this track to the existing local stream.\n this.state.localStream.addTrack(track);\n return sender.replaceTrack(track);\n })\n .then(_ => {\n this.localRef.current.srcObject = this.state.localStream;\n this.state.dataChannel.send(VIDEO_UNMUTED_EVENT);\n })\n .catch(err => this.handleGetUserMediaError(err))\n .finally(_ => { this.setState({videoToggleInProgress: false}); }); // Make sure we redraw the mute/unmute icons (e.g. camera -> camera_off).\n }\n\n handleToggleCameraClick() {\n if (this.state.videoToggleInProgress) {\n // Toggle currently in progress.\n return;\n }\n const tracks = this.state.localStream.getVideoTracks();\n this.setState({videoToggleInProgress: true}, _ => {\n if (tracks && tracks.length > 0 && tracks[0].enabled && tracks[0].readyState == 'live') {\n this.muteVideo();\n } else {\n this.unmuteVideo();\n }\n this.setState({audioOnly: !this.state.audioOnly});\n });\n }\n\n handleToggleMicClick() {\n const stream = this.state.localStream;\n const t = stream.getAudioTracks()[0];\n t.enabled = !t.enabled;\n // Make sure we redraw the mute/unmute icons (e.g. mic -> mic_off).\n this.forceUpdate();\n }\n\n render() {\n const audioTracks = this.state.localStream && this.state.localStream.getAudioTracks();\n const videoTracks = !this.state.audioOnly && this.state.localStream && this.state.localStream.getVideoTracks();\n const disabled = !this.state.pc || !this.state.dataChannel || !(audioTracks && audioTracks[0]);\n const audioIcon = audioTracks && audioTracks[0] && audioTracks[0].enabled ? 'mic' : 'mic_off';\n const videoIcon = videoTracks && videoTracks[0] && videoTracks[0].enabled && videoTracks[0].readyState == 'live' ? 'videocam' : 'videocam_off';\n const peerTitle = clipStr(this.props.title, MAX_PEER_TITLE_LENGTH);\n const pulseAnimation = this.state.waitingForPeer ? ' pulse' : '';\n\n let remoteActive = false;\n if (this.remoteRef.current && this.remoteRef.current.srcObject && this.state.remoteVideoLive) {\n const rstream = this.remoteRef.current.srcObject;\n if (rstream.getVideoTracks().length > 0) {\n const t = rstream.getVideoTracks()[0];\n remoteActive = t.enabled && t.readyState == 'live';\n }\n }\n\n return (\n <>\n \n
\n
\n
\n {remoteActive ?\n <>\n
\n
{peerTitle}
\n > :\n <>\n
\n
\n
\n \n
\n
{peerTitle}
\n
\n >\n }\n
\n
\n
\n \n call_end \n \n \n {videoIcon} \n \n \n {audioIcon} \n \n
\n
\n >\n );\n }\n};\n\nexport default injectIntl(CallPanel);\n","// The counter of unread messages in the topic.\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport { secondsToTime } from '../lib/strformat.js';\n\n// Props:\n// incoming: true | false.\n// success: true | false.\nexport default class CallStatus extends React.PureComponent {\n render() {\n const isCallDropped = ['declined', 'disconnected', 'missed'].includes(this.props.callState);\n const icon2 = this.props.incoming ?\n (isCallDropped ? 'call_missed' : 'call_received') :\n (isCallDropped ? 'call_missed_outgoing' : 'call_made');\n let duration;\n if (isCallDropped) {\n switch (this.props.callState) {\n case 'declined':\n duration = ;\n break;\n case 'missed':\n duration = this.props.incoming ?\n :\n ;\n break;\n default:\n duration = ;\n break;\n }\n } else if (['accepted', 'started'].includes(this.props.callState) && !this.props.duration) {\n duration = \n } else {\n duration = {secondsToTime(this.props.duration / 1000)} ;\n }\n return (\n <>\n \n call {icon2} \n
{duration}\n >\n );\n }\n};\n","// Single chat message bubble, sent or received.\n\nimport React from 'react';\nimport { FormattedMessage, injectIntl } from 'react-intl';\nimport { Drafty, Tinode } from 'tinode-sdk';\n\nimport Attachment from './attachment.jsx';\nimport LetterTile from './letter-tile.jsx';\nimport ReceivedMarker from './received-marker.jsx'\n\nimport { fullFormatter } from '../lib/formatters.js';\nimport { sanitizeUrl } from '../lib/utils.js';\n\nclass BaseChatMessage extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.state = {\n progress: 0\n };\n\n if (props.uploader) {\n props.uploader.onProgress = this.handleProgress.bind(this);\n }\n\n this.handleExpandImage = this.handleExpandImage.bind(this);\n this.handlePlayVideo = this.handlePlayVideo.bind(this);\n this.handleFormButtonClick = this.handleFormButtonClick.bind(this);\n this.handleContextClick = this.handleContextClick.bind(this);\n this.handleCancelUpload = this.handleCancelUpload.bind(this);\n this.handleQuoteClick = this.handleQuoteClick.bind(this);\n\n this.formatterContext = {\n formatMessage: props.intl.formatMessage.bind(props.intl),\n viewportWidth: props.viewportWidth,\n authorizeURL: props.tinode.authorizeURL.bind(props.tinode),\n\n onImagePreview: this.handleExpandImage,\n onVideoPreview: this.handlePlayVideo,\n onFormButtonClick: this.handleFormButtonClick,\n onQuoteClick: this.handleQuoteClick\n };\n }\n\n handleExpandImage(e) {\n e.preventDefault();\n this.props.onExpandMedia({\n url: e.target.src,\n filename: e.target.dataset.name,\n width: e.target.dataset.width,\n height: e.target.dataset.height,\n size: e.target.dataset.size,\n type: e.target.dataset.mime\n });\n }\n\n handlePlayVideo(e) {\n e.preventDefault();\n this.props.onExpandMedia({\n video: true,\n url: e.target.dataset.src,\n preview: e.target.src,\n filename: e.target.dataset.name,\n width: e.target.dataset.width,\n height: e.target.dataset.height,\n duration: e.target.dataset.duration,\n size: e.target.dataset.size,\n type: e.target.dataset.mime\n });\n }\n\n handleFormButtonClick(e) {\n e.preventDefault();\n const data = {\n seq: this.props.seq\n };\n data.resp = {};\n if (e.target.dataset.name) {\n data.resp[e.target.dataset.name] = e.target.dataset.val ? e.target.dataset.val :\n e.target.dataset.val === undefined ? 1 : '' + e.target.dataset.val;\n }\n if (e.target.dataset.act == 'url') {\n data.ref = sanitizeUrl(e.target.dataset.ref) || 'about:blank';\n }\n const text = e.target.dataset.title || 'unknown';\n this.props.onFormResponse(e.target.dataset.act, text, data);\n }\n\n handleContextClick(e) {\n e.preventDefault();\n e.stopPropagation();\n const menuItems = [];\n if (this.props.received == Tinode.MESSAGE_STATUS_FAILED) {\n menuItems.push('menu_item_send_retry');\n }\n if (this.props.userIsWriter && this.props.received > Tinode.MESSAGE_STATUS_FAILED) {\n menuItems.push('menu_item_reply');\n if (!this.props.response) {\n let immutable = false;\n Drafty.entities(this.props.content, (_0, _1, tp) => {\n immutable = ['AU', 'EX', 'FM', 'IM', 'VC', 'VD'].includes(tp);\n return immutable;\n });\n if (!immutable) {\n Drafty.styles(this.props.content, tp => {\n immutable = ['QQ'].includes(tp);\n return immutable;\n });\n }\n if (!immutable) {\n menuItems.push('menu_item_edit');\n }\n }\n }\n menuItems.push('menu_item_forward');\n\n this.props.showContextMenu({\n seq: this.props.seq,\n replace: this.props.edited ? parseInt(this.props.edited.split(':')[1]) : 0,\n content: this.props.content,\n userFrom: this.props.userFrom,\n userName: this.props.userName,\n y: e.pageY,\n x: e.pageX,\n pickReply: this.props.pickReply,\n editMessage: this.props.editMessage,\n }, menuItems);\n }\n\n handleProgress(ratio) {\n this.setState({progress: ratio});\n }\n\n handleCancelUpload() {\n this.props.onCancelUpload(this.props.seq, this.props.uploader);\n }\n\n handleQuoteClick(e) {\n e.preventDefault();\n e.stopPropagation();\n const replyToSeq = this.props.replyToSeq;\n if (replyToSeq) {\n this.props.onQuoteClick(replyToSeq);\n }\n }\n\n render() {\n const sideClass = this.props.sequence + ' ' + (this.props.response ? 'left' : 'right');\n const bubbleClass = (this.props.sequence == 'single' || this.props.sequence == 'last') ? 'bubble tip' : 'bubble';\n const avatar = this.props.userAvatar || true;\n const fullDisplay = (this.props.isGroup && this.props.response &&\n (this.props.sequence == 'single' || this.props.sequence == 'last'));\n\n let content = this.props.content;\n const attachments = [];\n if (this.props.mimeType == Drafty.getContentType() && Drafty.isValid(content)) {\n Drafty.attachments(content, (att, i) => {\n if (att.mime == 'application/json') {\n // Don't show json objects as attachments.\n // They are not meant for users.\n return;\n }\n attachments.push( );\n }, this);\n const tree = Drafty.format(content, fullFormatter, this.formatterContext);\n content = React.createElement(React.Fragment, null, tree);\n } else if (typeof content != 'string') {\n content = <>warning_amber \n >\n }\n\n return (\n \n {this.props.isGroup && this.props.response ?\n \n {fullDisplay ?\n :\n null}\n
:\n null}\n \n
\n
\n
\n {content}\n {attachments}\n
\n {this.props.timestamp ?\n
\n : null}\n
\n {this.props.showContextMenu ?\n
\n \n expand_more \n \n : null\n }\n
\n {fullDisplay ?\n
\n {this.props.userName ||\n \n }\n
\n : null\n }\n
\n \n );\n }\n};\n\nconst IntlChatMessage = injectIntl(BaseChatMessage);\nconst ChatMessage = React.forwardRef((props, ref) => );\n\nexport default ChatMessage;\n","import React from 'react';\n\n/* CheckBox: styled three-state checkbox, either clickable or static */\nexport default class CheckBox extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.handleChange = this.handleChange.bind(this);\n }\n\n handleChange() {\n this.props.onChange(this.props.name, !this.props.checked);\n }\n\n render() {\n let classList = ['material-icons'];\n let iconName;\n if (Array.isArray(this.props.className)) {\n classList.push(...this.props.className);\n } else if (this.props.className) {\n classList.push(this.props.className);\n }\n if (this.props.onChange) {\n if (this.props.checked) {\n classList.push('blue', 'clickable');\n iconName = 'check_box';\n } else if (this.props.checked === false) {\n classList.push('blue', 'clickable');\n iconName = 'check_box_outline_blank';\n } else {\n classList.push('lt-blue');\n iconName = 'indeterminate_check_box';\n }\n } else {\n if (this.props.checked) {\n iconName = 'check_box';\n } else {\n iconName = 'check_box_outline_blank';\n }\n }\n let attrs = {\n className: classList.join(' '),\n id: this.props.id,\n };\n if (this.props.onChange) {\n attrs.onClick = this.handleChange;\n }\n return React.createElement('i', attrs, iconName);\n }\n}\n","import React from 'react';\n\nimport Chip from './chip.jsx';\n\nimport { makeImageUrl } from '../lib/blob-helpers.js';\n\n/* BEGIN ChipInput: group membership widget */\nexport default class ChipInput extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = ChipInput.deriveStateFromProps(props);\n this.state.input = '';\n this.state.focused = false;\n\n this.handleTextInput = this.handleTextInput.bind(this);\n this.removeChipAt = this.removeChipAt.bind(this);\n this.handleChipCancel = this.handleChipCancel.bind(this);\n this.handleFocusGained = this.handleFocusGained.bind(this);\n this.handleFocusLost = this.handleFocusLost.bind(this);\n this.handleKeyDown = this.handleKeyDown.bind(this);\n }\n\n static deriveStateFromProps(props) {\n return {\n placeholder: props.chips ? '' : props.prompt,\n sortedChips: ChipInput.sortChips(props.chips, props.staticMembers),\n chipIndex: ChipInput.indexChips(props.chips)\n };\n }\n\n componentDidUpdate(prevProps, prevState) {\n if (prevProps.chips != this.props.chips ||\n prevProps.staticMembers != this.props.staticMembers ||\n prevProps.prompt != this.props.prompt) {\n this.setState(ChipInput.deriveStateFromProps(this.props));\n }\n if (!prevState || this.props.chips.length > prevState.sortedChips.length) {\n this.setState({input: ''});\n }\n }\n\n // Map chip index to user name\n static indexChips(chips) {\n const index = {};\n let count = 0;\n chips.map((item) => {\n index[item.user] = count;\n count ++;\n });\n return index;\n }\n\n // Have non-removable chips appear before all other chips.\n static sortChips(chips, keep) {\n const required = [];\n const normal = [];\n chips.map((item) => {\n if (keep && keep.includes(item.user)) {\n required.push(item);\n } else {\n normal.push(item);\n }\n });\n return required.concat(normal);\n }\n\n handleTextInput(e) {\n this.setState({input: e.target.value});\n if (this.props.filterFunc) {\n this.props.filterFunc(e.target.value);\n }\n }\n\n removeChipAt(idx) {\n const removed = this.state.sortedChips[idx];\n this.props.onChipRemoved(removed.user, this.state.chipIndex[removed.user]);\n }\n\n handleChipCancel(item, idx) {\n this.removeChipAt(idx);\n }\n\n handleFocusGained() {\n this.setState({focused: true});\n }\n\n handleFocusLost() {\n this.setState({focused: false});\n if (this.props.onFocusLost) {\n this.props.onFocusLost(this.state.input);\n }\n }\n\n handleKeyDown(e) {\n if (e.key === 'Backspace') {\n if (this.state.input.length == 0 && this.state.sortedChips.length > 0) {\n const at = this.state.sortedChips.length - 1;\n if (this.state.sortedChips[at].user !== this.props.staticMembers) {\n this.removeChipAt(at);\n }\n }\n } else if (e.key === 'Enter') {\n if (this.props.onEnter) {\n this.props.onEnter(this.state.input);\n }\n } else if (e.key === 'Escape') {\n if (this.props.onCancel) {\n this.props.onCancel();\n }\n }\n }\n\n render() {\n const chips = [];\n let count = 0;\n const staticMembers = this.props.staticMembers || [];\n this.state.sortedChips.map((item) => {\n chips.push(\n \n );\n count++;\n });\n const className = \"chip-input\" + (this.state.focused ? ' focused' : '');\n const autoFocus = !(this.props.tabIndex > 0);\n return (\n \n {chips}\n \n
\n );\n }\n};\n","import React from 'react';\n\nimport LetterTile from './letter-tile.jsx';\n\nexport default class Chip extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.handleCancel = this.handleCancel.bind(this);\n }\n\n handleCancel(e) {\n e.preventDefault();\n this.props.onCancel(this.props.topic, this.props.index);\n }\n\n render() {\n const title = this.props.title || this.props.topic;\n const className = this.props.invalid ? 'chip invalid' : 'chip';\n return (\n \n {this.props.noAvatar ?\n
:\n
\n \n
\n }\n
{title} \n {this.props.onCancel && !this.props.required ?\n
× \n :
}\n
\n );\n }\n};\n","// A panel included into a list of contacts with an action text.\nimport React from 'react';\nimport { injectIntl } from 'react-intl';\n\nclass ContactAction extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.handleClick = this.handleClick.bind(this);\n }\n\n handleClick(e) {\n e.preventDefault();\n e.stopPropagation();\n this.props.onAction(this.props.action);\n }\n\n render() {\n const {formatMessage} = this.props.intl;\n return (\n \n {formatMessage(this.props.title, this.props.values)}
\n \n );\n }\n};\n\nexport default injectIntl(ContactAction);\n","import React from 'react';\n\nconst icon_mapping = {'muted': 'notifications_off', 'banned': 'block', 'staff': 'verified_user'};\n\n/* Contact's labels: [you], or icons [muted], [blocked] */\nexport default class ContactBadges extends React.PureComponent {\n render() {\n let badges = null;\n if (this.props.badges && this.props.badges.length > 0) {\n badges = [];\n this.props.badges.map((b) => {\n const color = (b.color ? ' ' + b.color : '');\n if (b.icon) {\n badges.push({icon_mapping[b.icon] || b.icon} );\n } else {\n badges.push({b.name} );\n }\n });\n return <>{badges}>;\n }\n return null;\n }\n};\n","// ContactList: component for showing a list of contacts,\n// such as a list of group members in a group chat.\nimport React from 'react';\nimport { defineMessages, injectIntl } from 'react-intl';\n\nimport { Drafty, Tinode } from 'tinode-sdk';\n\nimport Contact from './contact.jsx';\nimport ContactAction from './contact-action.jsx';\n\nimport { makeImageUrl } from '../lib/blob-helpers.js';\n\nimport { MESSAGE_PREVIEW_LENGTH } from '../config.js';\n\nconst messages = defineMessages({\n badge_you: {\n id: 'badge_you',\n defaultMessage: 'you',\n description: 'Badge for indicating the current user'\n },\n badge_owner: {\n id: 'badge_owner',\n defaultMessage: 'owner',\n description: 'Badge for indicating the owner'\n }\n});\n\nclass ContactList extends React.Component {\n render() {\n const { formatMessage } = this.props.intl;\n const showCheckmark = Array.isArray(this.props.topicSelected);\n const contactNodes = [];\n let contactsCount = 0;\n if (this.props.contacts && this.props.contacts.length > 0) {\n this.props.contacts.map((c) => {\n if (c.action) {\n // Action item\n contactNodes.push(\n );\n } else {\n // Normal contact\n const key = this.props.showMode ? c.user : (c.topic || c.user);\n // If filter function is provided, filter out the items\n // which don't satisfy the condition.\n if (this.props.filterFunc && this.props.filter) {\n const filterOn = [key];\n if (c.private && c.private.comment) {\n filterOn.push(('' + c.private.comment).toLowerCase());\n }\n if (c.public && c.public.fn) {\n filterOn.push(('' + c.public.fn).toLowerCase());\n }\n if (!this.props.filterFunc(this.props.filter, filterOn)) {\n return;\n }\n }\n\n const isChannel = Tinode.isChannelTopicName(key);\n const isGroup = !isChannel && Tinode.isGroupTopicName(key);\n const selected = showCheckmark ?\n (this.props.topicSelected.indexOf(key) > -1) :\n (this.props.topicSelected === key);\n const badges = [];\n if (this.props.showMode) {\n if (key == this.props.myUserId) {\n badges.push({name: formatMessage(messages.badge_you), color: 'green'});\n }\n if (c.acs && c.acs.isOwner()) {\n badges.push({name: formatMessage(messages.badge_owner), color: 'blue'});\n }\n }\n\n const comment = Array.isArray(c.private) ?\n c.private.join(',') : (c.private ? c.private.comment : null);\n let preview;\n let forwarded;\n let previewIsResponse;\n let deliveryStatus;\n if (!this.props.showMode && c.latestMessage) {\n const msg = c.latestMessage();\n if (msg) {\n forwarded = msg.head ? msg.head.forwarded : null;\n deliveryStatus = msg._status || c.msgStatus(msg, true);\n previewIsResponse = msg.from != this.props.myUserId;\n if (msg.content) {\n preview = typeof msg.content == 'string' ?\n msg.content.substr(0, MESSAGE_PREVIEW_LENGTH) :\n Drafty.preview(msg.content, MESSAGE_PREVIEW_LENGTH);\n }\n }\n }\n\n contactNodes.push(\n \n );\n contactsCount ++;\n }\n }, this);\n }\n\n return (\n \n {contactsCount == 0 ?\n
\n :\n null\n }\n {contactNodes.length > 0 ?\n
\n :\n null\n }\n
\n );\n }\n};\n\nexport default injectIntl(ContactList);\n","// A single topic or user.\nimport React from 'react';\nimport { FormattedMessage, injectIntl } from 'react-intl';\n\nimport ContactBadges from './contact-badges.jsx';\nimport LetterTile from './letter-tile.jsx';\nimport UnreadBadge from './unread-badge.jsx';\n\nimport { Drafty } from 'tinode-sdk';\n\nimport { previewFormatter } from '../lib/formatters.js';\nimport { deliveryMarker } from '../lib/utils.js';\n\nclass Contact extends React.Component {\n constructor(props) {\n super(props);\n\n this.handleClick = this.handleClick.bind(this);\n this.handleContextClick = this.handleContextClick.bind(this);\n }\n\n handleClick(e) {\n e.preventDefault();\n e.stopPropagation();\n if (this.props.onSelected) {\n // Index this.props.index is used by GroupManager.\n this.props.onSelected(this.props.item, this.props.index);\n }\n }\n\n handleContextClick(e) {\n e.preventDefault();\n e.stopPropagation();\n this.props.showContextMenu({ topicName: this.props.item, y: e.pageY, x: e.pageX });\n }\n\n render() {\n let title = this.props.title;\n if (!title) {\n title = ;\n } else if (title.length > 30) {\n // FIXME: this is probably wrong for RTL languages.\n title = title.substring(0, 28) + '…';\n }\n const online = this.props.now ? 'online' : 'offline';\n const avatar = this.props.avatar ? this.props.avatar : true;\n const badges = this.props.badges ? this.props.badges.slice() : [];\n const icon_badges = [];\n if (this.props.isVerified) {\n icon_badges.push({icon: 'verified', color: 'verified-color'});\n }\n if (this.props.isStaff) {\n icon_badges.push({icon: 'staff', color: 'staff-color'});\n }\n if (this.props.isDangerous) {\n icon_badges.push({icon: 'dangerous', color: 'danger-color'});\n }\n if (this.props.acs) {\n if (this.props.showMode) {\n badges.push({name: this.props.acs.getMode(), key: 'mode'});\n }\n if (this.props.acs.isMuted()) {\n icon_badges.push({icon: 'muted'});\n }\n if (!this.props.acs.isJoiner()) {\n icon_badges.push({icon: 'banned'});\n }\n }\n\n // The this.props.preview contains alreay shortened Drafty or string.\n let preview;\n if (typeof this.props.preview == 'string') {\n preview = this.props.preview;\n } else if (Drafty.isValid(this.props.preview)) {\n preview = React.createElement(React.Fragment, null, Drafty.format(this.props.preview, previewFormatter,\n {formatMessage: this.props.intl.formatMessage, previewIsResponse: this.props.previewIsResponse}));\n } else if (this.props.preview) {\n preview =\n <>warning_amber \n \n >;\n }\n\n const icon = deliveryMarker(this.props.received);\n const marker = icon ? {icon.name} : null;\n const titleClass = 'contact-title' + (this.props.deleted ? ' deleted' : '');\n\n return (\n \n \n \n {this.props.deleted ? cancel :\n this.props.showOnline ? :\n (this.props.showCheckmark && this.props.selected) ?\n check_circle \n : null}\n
\n \n
{title} \n {this.props.isGroup ?
group : null}\n {this.props.isChannel ?
: null}\n
\n {!this.props.deleted ?
: null}\n
\n {this.props.showMode ?\n
:\n this.props.small ? null :
{marker}{preview || this.props.comment || '\\u00A0'}
}\n
\n {this.props.showContextMenu ?\n \n \n expand_more \n \n : null}\n \n );\n }\n};\n\nexport default injectIntl(Contact);\n","// Context Menu: popup/dropdown menu.\nimport React from 'react';\nimport { injectIntl, defineMessages } from 'react-intl';\n\nimport { REM_SIZE } from '../config.js';\n\nconst messages = defineMessages({\n info: {\n id: 'menu_item_info',\n defaultMessage: 'Info',\n description: 'Show extended topic information'\n },\n clear_messages: {\n id: 'menu_item_clear_messages',\n defaultMessage: 'Clear messages',\n description: 'Delete all messages'\n },\n clear_for_all: {\n id: 'menu_item_clear_messages_for_all',\n defaultMessage: 'Clear for All',\n description: 'Delete all message(s) for all members'\n },\n delete: {\n id: 'menu_item_delete',\n defaultMessage: 'Delete',\n description: 'Delete selected messages'\n },\n delete_for_all: {\n id: 'menu_item_delete_for_all',\n defaultMessage: 'Delete for All',\n description: 'Delete selected message(s) for all members'\n },\n send_retry: {\n id: 'menu_item_send_retry',\n defaultMessage: 'Retry',\n description: 'Retry sending message'\n },\n mute: {\n id: 'menu_item_mute',\n defaultMessage: 'Mute',\n description: 'Turn off notifications'\n },\n unmute: {\n id: 'menu_item_unmute',\n defaultMessage: 'Unmute',\n description: 'Turn notifications on'\n },\n reply: {\n id: 'menu_item_reply',\n defaultMessage: 'Reply',\n description: 'Reply to message'\n },\n forward: {\n id: 'menu_item_forward',\n defaultMessage: 'Forward',\n description: 'Forward message'\n },\n edit: {\n id: 'menu_item_edit',\n defaultMessage: 'Edit',\n description: 'Edit message'\n },\n topic_delete: {\n id: 'menu_item_delete_topic',\n defaultMessage: 'Delete',\n description: 'Delete entire topic'\n },\n topic_delete_warning: {\n id: 'topic_delete_warning',\n defaultMessage: 'Are you sure you want to delete this conversation? It cannot be undone.',\n description: 'Alert warning when deleting entire topic'\n },\n delete_messages_warning: {\n id: 'delete_messages_warning',\n defaultMessage: 'Are you sure you want to delete all messages for everyone? It cannot be undone.',\n description: 'Alert dialog warning when hard-deleting all messages.'\n },\n unblock: {\n id: 'menu_item_unblock',\n defaultMessage: 'Unblock',\n description: 'Unblock topic or user'\n },\n // Generic string suitable for either topic or user.\n block: {\n id: 'menu_item_block',\n defaultMessage: 'Block',\n description: 'Block topic or user'\n },\n topic_block_warning: {\n id: 'topic_block_warning',\n defaultMessage: 'Are you sure you want to block this conversation?',\n description: 'Alert warning when blocking a topic.'\n },\n member_delete: {\n id: 'menu_item_member_delete',\n defaultMessage: 'Remove',\n description: 'Remove user from topic'\n },\n archive: {\n id: 'menu_item_archive_topic',\n defaultMessage: 'Archive',\n description: 'Move topic from the list of active chats to archive'\n },\n unarchive: {\n id: 'menu_item_restore_topic',\n defaultMessage: 'Restore',\n description: 'Restore topic from archive'\n },\n edit_permissions: {\n id: 'menu_item_edit_permissions',\n defaultMessage: 'Edit permissions',\n description: 'Menu item [Edit permissions]'\n },\n clear_messages_warning: {\n id: 'clear_messages_warning',\n defaultMessage: 'Are you sure you want to clear all messages? It cannot be undone.',\n description: 'Alert dialog warning when deleting all messages.'\n },\n});\n\nclass ContextMenu extends React.Component {\n constructor(props) {\n super(props);\n\n this.selfRef = React.createRef();\n\n const {formatMessage} = props.intl;\n\n this.handlePageClick = this.handlePageClick.bind(this);\n this.handleEscapeKey = this.handleEscapeKey.bind(this);\n this.handleClick = this.handleClick.bind(this);\n\n // Preconfigured menu items.\n this.MenuItems = {\n 'topic_info': {\n id: 'topic_info',\n title: formatMessage(messages.info),\n handler: null\n },\n 'messages_clear': {\n id: 'messages_clear',\n title: formatMessage(messages.clear_messages),\n handler: (params, errorHandler) => {\n return props.onShowAlert(\n formatMessage(messages.clear_messages), // title\n formatMessage(messages.clear_messages_warning), // content\n (_ => { this.deleteMessages(true, false, params, errorHandler); }), // onConfirm\n null, // \"OK\"\n true, // Show Reject button\n null // \"Cancel\"\n );\n }\n },\n 'messages_clear_hard': {\n id: 'messages_clear_hard',\n title: formatMessage(messages.clear_for_all),\n handler: (params, errorHandler) => {\n return props.onShowAlert(\n formatMessage(messages.clear_for_all), // title\n formatMessage(messages.delete_messages_warning), // content\n (_ => { return this.deleteMessages(true, true, params, errorHandler); }),\n null, // \"OK\"\n true, // Show Reject button\n null // \"Cancel\"\n );\n }\n },\n 'message_delete': {\n id: 'message_delete',\n title: formatMessage(messages.delete),\n handler: (params, errorHandler) => {\n return this.deleteMessages(false, false, params, errorHandler);\n }\n },\n 'message_delete_hard': {\n id: 'message_delete_hard',\n title: formatMessage(messages.delete_for_all),\n handler: (params, errorHandler) => {\n return this.deleteMessages(false, true, params, errorHandler);\n }\n },\n 'menu_item_send_retry': {\n id: 'menu_item_send_retry',\n title: formatMessage(messages.send_retry),\n handler: (params, errorHandler) => {\n return this.retryMessage(params, errorHandler);\n }\n },\n 'menu_item_reply': {\n id: 'menu_item_reply',\n title: formatMessage(messages.reply),\n handler: (params, errorHandler) => {\n return this.replyToMessage(params, errorHandler);\n }\n },\n 'menu_item_forward': {\n id: 'menu_item_forward',\n title: formatMessage(messages.forward),\n handler: _ => {} /* the action is taken directly in tinode-web */\n },\n 'menu_item_edit': {\n id: 'menu_item_edit',\n title: formatMessage(messages.edit),\n handler: (params, errorHandler) => {\n return this.editMessage(params, errorHandler);\n }\n },\n 'topic_unmute': {\n id: 'topic_unmute',\n title: formatMessage(messages.unmute),\n handler: this.topicPermissionSetter.bind(this, '+P')\n },\n 'topic_mute': {\n id: 'topic_mute',\n title: formatMessage(messages.mute),\n handler: this.topicPermissionSetter.bind(this, '-P')\n },\n 'topic_unblock': {\n id: 'topic_unblock',\n title: formatMessage(messages.unblock),\n handler: this.topicPermissionSetter.bind(this, '+JP')\n },\n 'topic_block': {\n id: 'topic_block',\n title: formatMessage(messages.block),\n handler: (params, errorHandler) => {\n return props.onShowAlert(\n formatMessage(messages.block), // title\n formatMessage(messages.topic_block_warning), // content\n (_ => this.topicPermissionSetter('-JP', params, errorHandler).then(ctrl => {\n this.props.onTopicRemoved(params.topicName);\n return ctrl;\n })),\n null, // \"OK\"\n true, // Show Reject button\n null // \"Cancel\"\n );\n }\n },\n 'topic_delete': {\n id: 'topic_delete',\n title: formatMessage(messages.topic_delete),\n handler: (params, errorHandler) => {\n return props.onShowAlert(\n formatMessage(messages.topic_delete), // title\n formatMessage(messages.topic_delete_warning), // content\n (_ => {\n const topic = this.props.tinode.getTopic(params.topicName);\n if (!topic) {\n console.warn(\"Topic not found: \", params.topicName);\n return;\n }\n return topic.delTopic(true).catch(err => {\n if (errorHandler) {\n errorHandler(err.message, 'err');\n }\n });\n }),\n null, // \"OK\"\n true, // Show Reject button\n null // \"Cancel\"\n );\n }\n },\n 'topic_archive': {\n id: 'topic_archive',\n title: formatMessage(messages.archive),\n handler: (params, errorHandler) => {\n const topic = this.props.tinode.getTopic(params.topicName);\n if (!topic) {\n console.warn(\"Topic not found: \", params.topicName);\n return;\n }\n return topic.archive(true).catch(err => {\n if (errorHandler) {\n errorHandler(err.message, 'err');\n }\n });\n }\n },\n 'topic_restore': {\n id: 'topic_restore',\n title: formatMessage(messages.unarchive),\n handler: (params, errorHandler) => {\n const topic = this.props.tinode.getTopic(params.topicName);\n if (!topic) {\n console.warn(\"Topic not found: \", params.topicName);\n return;\n }\n return topic.archive(false).catch(err => {\n if (errorHandler) {\n errorHandler(err.message, 'err');\n }\n });\n }\n },\n // menu_item_edit_permissions is defined elsewhere.\n 'permissions': {\n id: 'permissions',\n title: formatMessage(messages.edit_permissions),\n handler: null\n },\n 'member_delete': {\n id: 'member_delete',\n title: formatMessage(messages.member_delete),\n handler: (params, errorHandler) => {\n const topic = this.props.tinode.getTopic(params.topicName);\n if (!topic || !params.user) {\n console.warn(\"Topic or user not found: '\" + params.topicName + \"', '\" + params.user + \"'\");\n return;\n }\n return topic.delSubscription(params.user).catch(err => {\n if (errorHandler) {\n errorHandler(err.message, 'err');\n }\n });\n }\n },\n 'member_mute': {\n id: 'member_mute',\n title: formatMessage(messages.mute),\n handler: this.topicPermissionSetter.bind(this, '-P')\n },\n 'member_unmute': {\n id: 'member_unmute',\n title: formatMessage(messages.unmute),\n handler: this.topicPermissionSetter.bind(this, '+P')\n },\n 'member_block': {\n id: 'member_block',\n title: formatMessage(messages.block),\n handler: this.topicPermissionSetter.bind(this, '-JP')\n },\n 'member_unblock': {\n id: 'member_unblock',\n title: formatMessage(messages.unblock),\n handler: this.topicPermissionSetter.bind(this, '+JP')\n },\n };\n }\n\n componentDidMount() {\n document.addEventListener('mousedown', this.handlePageClick, false);\n document.addEventListener('keyup', this.handleEscapeKey, false);\n }\n\n componentWillUnmount() {\n document.removeEventListener('mousedown', this.handlePageClick, false);\n document.removeEventListener('keyup', this.handleEscapeKey, false);\n }\n\n handlePageClick(e) {\n if (this.selfRef.current.contains(e.target)) {\n return;\n }\n e.preventDefault();\n e.stopPropagation();\n this.props.hide();\n }\n\n handleEscapeKey(e) {\n if (e.keyCode === 27) {\n this.props.hide();\n }\n }\n\n handleClick(e) {\n e.preventDefault();\n e.stopPropagation();\n this.props.hide();\n let item = this.props.items[e.currentTarget.dataset.id];\n if (typeof item == 'string') {\n item = this.MenuItems[item];\n }\n\n if (!item) {\n console.error(\"Invalid menu item ID\", e.currentTarget.dataset.id);\n } else {\n this.props.onAction(\n item.id,\n item.handler(this.props.params, this.props.onError),\n this.props.params);\n }\n }\n\n // Menu Actions\n\n deleteMessages(all, hard, params, errorHandler) {\n const topic = this.props.tinode.getTopic(params.topicName);\n if (!topic) {\n console.warn(\"Topic not found: \", params.topicName);\n return;\n }\n\n // We don't know if the message is still pending (e.g. attachment is being uploaded),\n // so try cancelling first. No harm if we can't cancel.\n // The message can be cancelled if transmission to the server has not\n // started yet or if the message send has failed.\n if (!all && topic.cancelSend(params.seq)) {\n return;\n }\n\n const promise = all ?\n topic.delMessagesAll(hard) :\n params.replace > 0 ?\n topic.delMessagesEdits(params.replace, hard) :\n topic.delMessagesList([params.seq], hard);\n\n return promise.catch(err => {\n if (errorHandler) {\n errorHandler(err.message, 'err');\n }\n });\n }\n\n // Retries sending failed message.\n retryMessage(params, errorHandler) {\n const topic = this.props.tinode.getTopic(params.topicName);\n // Remove the existing message entry.\n if (!topic || !topic.flushMessage(params.seq)) {\n return;\n }\n const msg = topic.createMessage(params.content, false);\n return topic.publishDraft(msg).catch(err => {\n if (errorHandler) {\n errorHandler(err.message, 'err');\n }\n });\n }\n\n // Function is used by context menu to set permissions.\n topicPermissionSetter(mode, params, errorHandler) {\n const topic = this.props.tinode.getTopic(params.topicName);\n if (!topic) {\n console.warn(\"Topic not found\", params.topicName);\n return;\n }\n\n let result = topic.updateMode(params.user, mode);\n if (errorHandler) {\n result = result.catch(err => errorHandler(err.message, 'err'));\n }\n return result;\n }\n\n replyToMessage(params, errorHandler) {\n params.pickReply(params.seq, params.content, params.userFrom, params.userName, errorHandler);\n }\n\n editMessage(params, errorHandler) {\n params.editMessage(params.replace || params.seq, params.content, errorHandler);\n }\n\n render() {\n const menu = [];\n let count = 0;\n this.props.items.map((item) => {\n if (typeof item == 'string') {\n item = this.MenuItems[item];\n }\n if (item && item.title) {\n menu.push(\n item.title == '-' ?\n \n :\n {item.title} \n );\n }\n count++;\n });\n\n // Ensure that menu is inside the app-container.\n const hSize = 12 * REM_SIZE;\n const vSize = REM_SIZE * (0.7 + menu.length * 2.5);\n const left = (this.props.bounds.right - this.props.clickAt.x < hSize) ?\n (this.props.clickAt.x - this.props.bounds.left - hSize) :\n (this.props.clickAt.x - this.props.bounds.left);\n const top = (this.props.bounds.bottom - this.props.clickAt.y < vSize) ?\n (this.props.clickAt.y - this.props.bounds.top - vSize) :\n (this.props.clickAt.y - this.props.bounds.top);\n\n const position = {\n left: left + 'px',\n top: top + 'px'\n };\n\n return (\n \n );\n }\n}\n\nexport default injectIntl(ContextMenu);\n","// Image zoom and crop widget.\n\nimport React from 'react';\n\nconst DEFAULT_MAX_ZOOM = 2.5;\n\nexport default class Cropper extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = {\n // Coordinates of the top left corner of the image in container coordinates.\n panX: 0,\n panY: 0,\n // Origin of the zoom in image coordinates.\n originX: 0,\n originY: 0,\n // Zoom scale.\n zoom: 1,\n // Zoom min and max.\n minZoom: 0,\n maxZoom: DEFAULT_MAX_ZOOM,\n };\n\n // References to DOM elements for hooking up events and getting screen dimensions.\n // The transparent element which captures mouse moves (moves with the image).\n this.overlay = React.createRef();\n // The image cutout window or view port (static).\n this.cutout = React.createRef();\n // Scaled and translated image preview.\n this.preview = React.createRef();\n // The main container (static).\n this.boundingBox = React.createRef();\n\n // The original image width and height before any scaling.\n this.imageWidth = 0;\n this.imageHeight = 0;\n\n // Mouse position when dragging.\n this.mouseX = 0\n this.mouseY = 0;\n // Length of the previous mouse move when dragging.\n this.prevDistance = 0;\n\n // Bounding rectangles of static elements.\n this.cutoutRect = {};\n this.bBoxRect = {};\n // Center of the bounding box.\n this.originX = 0;\n this.originY = 0;\n\n this.initScaling = this.initScaling.bind(this);\n this.onZoom = this.onZoom.bind(this);\n this.handleZoom = this.handleZoom.bind(this);\n this.mouseDown = this.mouseDown.bind(this);\n this.mouseUp = this.mouseUp.bind(this);\n this.mouseMove = this.mouseMove.bind(this);\n this.mouseTouch = this.mouseTouch.bind(this);\n this.positionAll = this.positionAll.bind(this);\n this.translate = this.translate.bind(this);\n }\n\n componentDidMount() {\n this.overlay.current.addEventListener('mousedown', this.mouseDown, { passive: true });\n this.overlay.current.addEventListener('touchstart', this.mouseDown, { passive: true });\n\n // The rectangle position is in viewport coordinates.\n this.bBoxRect = this.boundingBox.current.getBoundingClientRect();\n // Center of the bounding box in container coordinates.\n this.originX = this.bBoxRect.width / 2;\n this.originY = this.bBoxRect.height / 2;\n\n // The rectangle position is in viewport coordinates.\n this.cutoutRect = this.cutout.current.getBoundingClientRect();\n }\n\n componentWillUnmount() {\n this.overlay.current.removeEventListener('mousedown', this.mouseDown);\n this.overlay.current.removeEventListener('touchstart', this.mouseDown);\n }\n\n // Position all elements.\n positionAll(panX, panY, zoom) {\n // Zoom origin in image preview coordinates.\n this.setState({\n panX: panX,\n panY: panY,\n zoom: zoom,\n originX: this.originX - panX,\n originY: this.originY - panY,\n });\n\n // Pass cut out coordinates to caller.\n const left = (this.originX - panX) * zoom - this.originX;\n const top = (this.originY - panY) * zoom - this.originY;\n this.props.onChange(\n (left + this.cutoutRect.left - this.bBoxRect.left) / zoom,\n (top + this.cutoutRect.top - this.bBoxRect.top) / zoom,\n this.cutoutRect.width / zoom,\n this.cutoutRect.height / zoom,\n zoom);\n }\n\n // Check if new location is within the limits.\n static checkBound(currPan, img, cutout, delta) {\n let nextDiff = Math.min(0, cutout[0] - img[0] - delta, img[1] - cutout[1] + delta);\n if (nextDiff == 0) {\n // Cutout is completely within the image.\n currPan += delta;\n } else if (Math.min(0, cutout[0] - img[0], img[1] - cutout[1]) < nextDiff) {\n // Cutout is outside of the range but closer to the bound.\n currPan += delta;\n }\n return currPan;\n }\n\n initScaling() {\n // Initialize components.\n const imgRect = this.preview.current.getBoundingClientRect();\n\n this.imageWidth = imgRect.width;\n this.imageHeight = imgRect.height;\n\n // Set zoom slider's min and max values. Make sure the scaled image cannot be smaller than the cutout.\n const minZoom = Math.max(this.cutoutRect.width / imgRect.width, this.cutoutRect.height / imgRect.height);\n this.setState({\n minZoom: minZoom,\n maxZoom: Math.max(DEFAULT_MAX_ZOOM, minZoom + 1)\n });\n\n // Initial zoom level fills the bounding box at the smallest image dimension and overflows the largest, i.e. \"fill\" not \"fit\".\n const zoom = Math.max(this.bBoxRect.width / imgRect.width, this.bBoxRect.height / imgRect.height);\n // Converting from viewport coordinates to container, then panning.\n const panX = this.cutoutRect.left - this.bBoxRect.left -\n (imgRect.width - this.cutoutRect.width) / 2;\n const panY = this.cutoutRect.top - this.bBoxRect.top -\n (imgRect.height - this.cutoutRect.height) / 2;\n\n this.positionAll(panX, panY, zoom);\n }\n\n onZoom(e) {\n this.handleZoom(e.target.value);\n }\n\n handleZoom(zoom) {\n let panX = this.state.panX;\n let panY = this.state.panY;\n\n // Ensure that the image at the new zoom is not outside of the cutout boundaries.\n // Calculate image coordinates at the new zoom.\n const imgLeft = this.originX - (this.originX - panX) * zoom;\n const imgRight = imgLeft + this.imageWidth * zoom;\n // Cutout in the same coordinates as the image.\n const coLeft = this.cutoutRect.left - this.bBoxRect.left;\n const coRight = coLeft + this.cutoutRect.width;\n if (coLeft < imgLeft) {\n panX -= imgLeft - coLeft;\n } else if (coRight > imgRight) {\n panX += coRight - imgRight;\n }\n const imgTop = this.originY - (this.originY - panY) * zoom;\n const imgBottom = imgTop + this.imageHeight * zoom;\n const coTop = this.cutoutRect.top - this.bBoxRect.top;\n const coBottom = coTop + this.cutoutRect.height;\n if (coTop < imgTop) {\n panY -= imgTop - coTop;\n } else if (coBottom > imgBottom) {\n panY += coBottom - imgBottom;\n }\n\n this.positionAll(panX, panY, zoom);\n }\n\n mouseDown(e) {\n if (e.touches) {\n this.mouseX = e.touches[0].pageX;\n this.mouseY = e.touches[0].pageY;\n } else {\n this.mouseX = e.pageX;\n this.mouseY = e.pageY;\n }\n\n window.addEventListener('mousemove', this.mouseMove, { passive: false });\n window.addEventListener('touchmove', this.mouseTouch, { passive: false });\n window.addEventListener('mouseup', this.mouseUp, { passive: true });\n window.addEventListener('touchend', this.mouseUp, { passive: true });\n // Disable text selection in the entire document.\n document.body.style['userSelect'] = 'none';\n }\n\n // Perform image panning.\n translate(pageX, pageY) {\n const dX = pageX - this.mouseX;\n const dY = pageY - this.mouseY;\n\n this.mouseX = pageX;\n this.mouseY = pageY;\n\n // Make sure the image is within the cutout window.\n const imgRect = this.preview.current.getBoundingClientRect();\n\n // Check if the new position is within the boundaries, and if not if it's closer to them.\n let panX = Cropper.checkBound(this.state.panX, [imgRect.left, imgRect.right],\n [this.cutoutRect.left, this.cutoutRect.right], dX);\n let panY = Cropper.checkBound(this.state.panY, [imgRect.top, imgRect.bottom],\n [this.cutoutRect.top, this.cutoutRect.bottom], dY);\n\n this.positionAll(panX, panY, this.state.zoom);\n }\n\n // Image panning.\n mouseMove(e) {\n e.preventDefault();\n this.translate(e.pageX, e.pageY);\n }\n\n mouseTouch(e) {\n e.preventDefault();\n\n if (e.touches.length == 1) {\n this.translate(e.touches[0].pageX, e.touches[0].pageY);\n return;\n }\n\n // Image zooming by pinching.\n const [touch0, touch1] = e.touches;\n const distance = Math.sqrt((touch0.pageX - touch1.pageX) * (touch0.pageX - touch1.pageX) +\n (touch0.pageY - touch1.pageY) * (touch0.pageY - touch1.pageY));\n\n if (!this.prevDistance) {\n this.prevDistance = distance / this.state.zoom;\n }\n\n let scale = (distance / this.prevDistance);\n this.handleZoom(Math.max(this.minZoom, Math.min(this.maxZoom, scale)));\n }\n\n mouseUp(e) {\n window.removeEventListener('mousemove', this.mouseMove);\n window.removeEventListener('touchmove', this.mouseTouch);\n window.removeEventListener('mouseup', this.mouseUp);\n window.removeEventListener('touchend', this.mouseUp);\n // Re-enable text selection.\n document.body.style['userSelect'] = '';\n\n this.positionAll(this.state.panX, this.state.panY, this.state.zoom);\n }\n\n render() {\n // transform3d: position and scale.\n const t3d = `translate3d(${this.state.panX}px, ${this.state.panY}px, 0) scale(${this.state.zoom})`;\n // transformOrigin: zoom origin.\n const orig = `${this.state.originX}px ${this.state.originY}px`;\n\n // Overlay position and size are exactly equal to the position and size of the transformed image\n // except it uses different coordinates.\n const overlay = {\n top: `${this.originY - this.state.originY * this.state.zoom}px`,\n left: `${this.originX - this.state.originX * this.state.zoom}px`,\n width: `${this.imageWidth * this.state.zoom}px`,\n height: `${this.imageHeight * this.state.zoom}px`\n };\n return (\n \n
\n
\n
\n
\n
\n
\n \n
\n
\n );\n }\n}\n","import React from 'react';\nimport { FormattedMessage } from 'react-intl';\nimport SendMessage from '../widgets/send-message.jsx';\n\nimport { bytesToHumanSize, shortenFileName } from '../lib/strformat.js';\n\n// Get material icon name from mime type.\nfunction iconFromMime(mime) {\n // If more icons become available in material icons, add them to this mime-to-icon mapping.\n const mimeToIcon = {default: 'insert_drive_file', image: 'image', text: 'description', video: 'theaters'};\n\n return mimeToIcon[mime] || mimeToIcon[(mime || '').split('/')[0]] || mimeToIcon['default'];\n}\n\nexport default class DocPreview extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.handleSendDoc = this.handleSendDoc.bind(this);\n }\n\n handleSendDoc(caption) {\n this.props.onClose();\n this.props.onSendMessage(this.props.content.file);\n }\n\n render() {\n if (!this.props.content) {\n return null;\n }\n return (\n \n
\n
\n
\n
{iconFromMime(this.props.content.type)} \n
{shortenFileName(this.props.content.name, 24) || '-'}
\n
{this.props.content.type || 'application/octet-stream'}
\n
{bytesToHumanSize(this.props.content.size)}
\n
\n
\n
\n
\n );\n }\n};\n","import React from 'react';\n\nimport MenuCancel from './menu-cancel.jsx';\n\nexport default class ErrorPanel extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.state = {\n show: false,\n };\n\n this.hide = this.hide.bind(this);\n }\n\n componentDidUpdate(prevProps) {\n if (prevProps.level !== this.props.level) {\n this.setState({\n show: !(!this.props.level)\n });\n }\n }\n\n hide() {\n this.setState({show: false});\n if (this.props.onClearError) {\n this.props.onClearError();\n }\n }\n\n render() {\n const icons = {err: 'error', warn: 'warning', info: 'info'}\n const level = icons[this.props.level] || '';\n const className = 'info-box ' + level;\n return (\n \n );\n }\n};\n","// File uload/download progress indicator with a cancel inside.\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nexport default class FileProgress extends React.PureComponent {\n render() {\n return (\n \n );\n }\n}\n","// Forward Menu: message forwarding popup/dropdown menu.\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport { Tinode } from 'tinode-sdk';\n\nimport ContactList from './contact-list.jsx';\nimport SearchContacts from './search-contacts.jsx';\n\nexport default class ForwardDialog extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = {\n query: null\n };\n\n this.handleEscapeKey = this.handleEscapeKey.bind(this);\n this.handleClose = this.handleClose.bind(this);\n\n this.handleSearchContacts = this.handleSearchContacts.bind(this);\n this.handleContactSelected = this.handleContactSelected.bind(this);\n }\n\n componentDidMount() {\n this.props.onInitFind();\n }\n\n handleEscapeKey(e) {\n if (e.keyCode === 27) {\n // Not forwarding the message.\n this.props.hide(false);\n }\n }\n\n handleClose(e) {\n e.preventDefault();\n this.props.hide(false);\n }\n\n handleSearchContacts(query) {\n this.setState({ query: Tinode.isNullValue(query) ? null : query });\n this.props.onSearchContacts(query);\n }\n\n handleContactSelected(uid) {\n this.props.onTopicSelected(uid);\n this.props.hide(true);\n }\n\n render() {\n let contacts = this.state.query != null ? this.props.searchResults : this.props.contacts;\n // Filter out contacts without a 'W' or 'J' permissions as well as the current topic.\n contacts = contacts.filter((c) => {\n return (c.name != this.props.topicSelected) && c.acs.isJoiner() && c.acs.isWriter();\n });\n\n return (\n \n
\n
\n
{\n (search_placeholder) => \n } \n
{\n (not_found_placeholder) => \n } \n
\n
\n );\n }\n}\n","// GroupMembers: control for managing a list of group members.\nimport React from 'react';\nimport { FormattedMessage, defineMessages, injectIntl } from 'react-intl';\n\nimport ChipInput from './chip-input.jsx';\nimport ContactList from './contact-list.jsx';\n\nconst messages = defineMessages({\n no_contacts: {\n id: 'no_contacts',\n defaultMessage: 'You have no contacts :-(',\n description: 'Shown in ContactsView when the user has no contacts'\n },\n contacts_not_found_short: {\n id: 'contacts_not_found_short',\n defaultMessage: \"No contacts match ''{query}''\",\n description: 'Shown in ContactsView when search returned no results'\n }\n});\n\nclass GroupManager extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = {\n // Array of topic members\n members: props.members,\n index: GroupManager.indexMembers(props.members),\n staticMembers: GroupManager.staticMembers(props.members, props.keepInitialMembers, props.requiredMember),\n contactFilter: '',\n noContactsMessage: props.intl.formatMessage(messages.no_contacts),\n selectedContacts: GroupManager.selectedContacts(props.members)\n };\n\n this.handleContactSelected = this.handleContactSelected.bind(this);\n this.handleMemberRemoved = this.handleMemberRemoved.bind(this);\n this.handleContactFilter = this.handleContactFilter.bind(this);\n this.handleSubmit = this.handleSubmit.bind(this);\n this.handleCancel = this.handleCancel.bind(this);\n }\n\n static indexMembers(members) {\n let index = {};\n members.map((m) => {\n index[m.user] = {delta: 0, present: true}; // Delta: 0 unchanged, +1 added, -1 removed\n });\n return index;\n }\n\n static staticMembers(members, keepInitial, requiredMember) {\n let stat = [];\n members.map((m) => {\n if (keepInitial || m.user == requiredMember) {\n stat.push(m.user);\n }\n });\n return stat;\n }\n\n static selectedContacts(members) {\n let sel = [];\n members.map((m) => {\n sel.push(m.user);\n });\n return sel;\n }\n\n handleContactSelected(userId, index) {\n let status = this.state.index[userId];\n if (status) {\n if (status.present) {\n // Prevent duplicate members\n return;\n }\n status.delta += 1;\n status.present = true;\n } else {\n status = {delta: 1, present: true};\n }\n\n let m = this.state.members.slice();\n m.push(this.props.contacts[index]);\n\n const sel = GroupManager.selectedContacts(m);\n\n const i = this.state.index;\n i[userId] = status;\n\n this.setState({members: m, index: i, selectedContacts: sel});\n }\n\n handleMemberRemoved(userId, index) {\n const status = this.state.index[userId];\n if (!status || !status.present) {\n return;\n }\n status.present = false;\n status.delta -= 1;\n\n let m = this.state.members.slice();\n m.splice(index, 1);\n\n const sel = GroupManager.selectedContacts(m);\n\n const i = this.state.index;\n i[userId] = status;\n\n this.setState({members: m, index: i, selectedContacts: sel});\n }\n\n handleContactFilter(val) {\n const {formatMessage} = this.props.intl;\n const msg = !val ?\n formatMessage(messages.no_contacts) :\n formatMessage(messages.contacts_not_found_short, {query: val});\n\n this.setState({contactFilter: val, noContactsMessage: msg});\n }\n\n static doContactFiltering(filter, values) {\n if (filter) {\n for (let i=0; i= 0) {\n return true;\n }\n }\n return false;\n }\n return true;\n }\n\n handleSubmit() {\n var instance = this;\n var members = [];\n var added = [];\n var removed = [];\n\n var keys = Object.keys(this.state.index);\n keys.map(function(k) {\n if (instance.state.index[k].present) {\n members.push(k);\n }\n\n if (instance.state.index[k].delta > 0) {\n added.push(k);\n } else if (instance.state.index[k].delta < 0) {\n removed.push(k);\n }\n });\n this.props.onSubmit(members, added, removed);\n }\n\n handleCancel() {\n this.props.onCancel();\n }\n\n render() {\n const {formatMessage} = this.props.intl;\n return (\n \n
\n \n \n \n
\n
\n \n
\n
\n \n \n \n
\n
\n
\n \n \n \n \n \n \n
\n
\n );\n }\n};\n\nexport default injectIntl(GroupManager);\n","// GroupSubs: a list of group subscribers currently online.\n// Show in the topic title bar\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport { MAX_ONLINE_IN_TOPIC } from '../config.js'\n\nimport LetterTile from './letter-tile.jsx';\nimport { makeImageUrl } from '../lib/blob-helpers.js';\n\nexport default class GroupSubs extends React.Component {\n constructor(props) {\n super(props);\n }\n\n render() {\n const usersOnline = [];\n const totalCount = (this.props.subscribers || []).length;\n const countToShow = Math.min(MAX_ONLINE_IN_TOPIC, totalCount);\n\n (this.props.subscribers || []).some((sub) => {\n usersOnline.push(\n \n \n
\n );\n return usersOnline.length == countToShow;\n });\n\n return (\n {usersOnline} {totalCount > countToShow ?\n \n \n : null}\n
\n );\n }\n};\n","import React from 'react';\n\nimport { KNOWN_HOSTS } from '../config.js';\n\n/* Combobox for selecting host name */\n\nexport default class HostSelector extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.state = {\n hostName: props.serverAddress,\n changed: false\n };\n\n this.handleHostNameChange = this.handleHostNameChange.bind(this);\n this.handleEditingFinished = this.handleEditingFinished.bind(this);\n this.handleKeyDown = this.handleKeyDown.bind(this);\n }\n\n handleHostNameChange(e) {\n this.setState({hostName: e.target.value, changed: true});\n }\n\n handleEditingFinished() {\n if (this.state.changed) {\n this.setState({changed: false});\n this.props.onServerAddressChange(this.state.hostName.trim());\n }\n }\n\n handleKeyDown(e) {\n if (e.key == 'Enter') {\n this.handleEditingFinished();\n }\n }\n\n render() {\n var hostOptions = [];\n for (let key in KNOWN_HOSTS) {\n let item = KNOWN_HOSTS[key];\n hostOptions.push(\n \n );\n }\n return (\n \n \n \n {hostOptions}\n \n
\n );\n }\n}\n","import React from 'react';\nimport { FormattedMessage } from 'react-intl';\nimport SendMessage from './send-message.jsx';\n\nimport { REM_SIZE } from '../config.js';\nimport { fitImageSize } from '../lib/blob-helpers.js';\nimport { bytesToHumanSize, shortenFileName } from '../lib/strformat.js';\n\nexport default class ImagePreview extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.state = {\n width: 0,\n height: 0\n };\n\n this.handleSendImage = this.handleSendImage.bind(this);\n }\n\n assignWidth(node) {\n if (node && !this.state.width) {\n const bounds = node.getBoundingClientRect();\n this.setState({\n width: bounds.width | 0,\n height: bounds.height | 0\n });\n }\n }\n\n handleSendImage(caption) {\n this.props.onClose();\n this.props.onSendMessage(caption, this.props.content.blob);\n }\n\n render() {\n if (!this.props.content) {\n return null;\n }\n\n const dim = fitImageSize(this.props.content.width, this.props.content.height,\n this.state.width, this.state.height, false);\n const size = dim ? { width: dim.dstWidth + 'px', height: dim.dstHeight + 'px' } :\n ((this.props.content.width > this.props.content.height) ? {width: '100%'} : {height: '100%'});\n size.maxWidth = '100%';\n size.maxHeight = '100%';\n\n // Average font aspect ratio is ~0.5; File name takes 1/3 of the viewport width.\n const maxlength = Math.max(((this.state.width / REM_SIZE / 1.5) | 0) - 2, 12);\n const fname = shortenFileName(this.props.content.filename, maxlength) || '-';\n\n const width = this.props.content.width || '-';\n const height = this.props.content.height || '-';\n return (\n \n
\n
this.assignWidth(node)}>\n
\n
\n {this.props.onSendMessage ?\n
\n :\n }\n
\n );\n }\n};\n","// In-place text editor. Shows text with an icon which toggles it into an input field.\nimport React from 'react';\n\nimport VisiblePassword from './visible-password.jsx';\n\nexport default class InPlaceEdit extends React.Component {\n constructor(props) {\n super(props);\n\n this.selfRef = React.createRef();\n\n this.state = {\n active: props.active,\n initialValue: props.value || '',\n value: props.value || ''\n };\n\n this.handeTextChange = this.handeTextChange.bind(this);\n this.handleKeyDown = this.handleKeyDown.bind(this);\n this.handleStartEditing = this.handleStartEditing.bind(this);\n this.handleEditingFinished = this.handleEditingFinished.bind(this);\n this.handlePasswordFinished = this.handlePasswordFinished.bind(this);\n }\n\n componentDidUpdate(prevProps, prevState) {\n // If text has changed while in read mode, update text and discard changes.\n // Ignore update if in edit mode.\n const newValue = this.props.value || '';\n if (prevState.initialValue != newValue && !prevState.active) {\n this.setState({\n initialValue: newValue,\n value: newValue\n });\n }\n }\n\n handeTextChange(e) {\n this.setState({value: e.target.value || ''});\n }\n\n handleKeyDown(e) {\n if (e.keyCode === 27) {\n // Escape pressed\n this.setState({value: this.props.value, active: false});\n } else if (e.keyCode === 13) {\n // Enter pressed\n this.handleEditingFinished(e);\n }\n }\n\n handleStartEditing() {\n if (!this.props.readOnly) {\n this.setState({active: true}, _ => {\n if (this.selfRef.current) {\n this.selfRef.current.focus();\n }\n });\n }\n }\n\n handleEditingFinished(event) {\n const value = this.state.value.trim();\n if (this.props.required && (!event.target.checkValidity() || !value)) {\n // Empty input\n this.setState({value: this.props.value, active: false});\n return;\n }\n this.setState({active: false});\n if ((value || this.props.value) && (value !== this.props.value)) {\n this.props.onFinished(value);\n }\n }\n\n handlePasswordFinished(value) {\n this.setState({active: false});\n if (value && (value !== this.props.value)) {\n this.props.onFinished(value);\n }\n }\n\n render() {\n if (!this.state.active) {\n let spanText = this.props.type == 'password' ? '••••••••' : this.state.value;\n let spanClass = 'in-place-edit' + (this.props.readOnly ? ' disabled' : '');\n if (!spanText) {\n spanText = this.props.placeholder;\n spanClass += ' placeholder';\n }\n if (!this.props.multiline || this.props.multiline == 1) {\n spanClass += ' short';\n }\n\n return (\n {spanText} \n );\n }\n\n let element;\n const attr = {};\n if (this.props.type == 'password') {\n element = VisiblePassword;\n attr.onFinished = this.handlePasswordFinished;\n } else {\n if (this.props.multiline > 1) {\n element = 'textarea';\n attr.rows = this.props.multiline;\n attr.className = 'inplace-edit';\n } else {\n element = 'input';\n attr.type = this.props.type || 'text';\n }\n attr.value = this.state.value;\n attr.ref = this.selfRef;\n attr.onChange = this.handeTextChange;\n attr.onKeyDown = this.handleKeyDown;\n attr.onBlur = this.handleEditingFinished;\n }\n attr.placeholder = this.props.placeholder;\n attr.required = this.props.required ? 'required' : '';\n attr.autoComplete = this.props.autoComplete;\n attr.autoFocus = true;\n\n return React.createElement(element, attr, null);\n }\n};\n","// Element which shows static video preview:\n// an image with duration and a play button in the middle.\n\nimport React from 'react';\n\nimport { secondsToTime } from '../lib/strformat.js'\n\nexport default class InlineVideo extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.videoRef = React.createRef();\n\n this.handleClick = this.handleClick.bind(this);\n }\n\n handleClick(e) {\n if (this.props.onClick) {\n // the click target has to be the image element.\n this.props.onClick(e);\n }\n }\n\n render() {\n const duration = secondsToTime(this.props['data-duration'] / 1000);\n const className = 'inline-video' + (this.props.onClick ? ' image-clickable' : '');\n return (\n \n {React.createElement('img', this.props)}\n {this.props.onClick ?\n
\n play_arrow \n
\n : null}\n {duration ?
{duration}
: null}\n
\n );\n }\n};\n","// A single topic or user.\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nexport default class Invitation extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.handleButtonAction = this.handleButtonAction.bind(this);\n }\n\n handleButtonAction(evt, data) {\n evt.preventDefault();\n this.props.onAction(data);\n }\n\n render() {\n return (\n \n
\n \n
\n
\n { this.handleButtonAction(event, \"accept\"); }}>\n \n \n { this.handleButtonAction(event, \"delete\"); }}>\n \n \n { this.handleButtonAction(event, \"block\"); }}>\n \n \n
\n
\n );\n }\n};\n","// Image with a placeholder which is replaced when the promise is resolved.\nimport React from 'react';\n\nexport default class LazyImage extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.state = {\n src: this.props.isvideo ? 'img/blankvid.png' : 'img/blankimg.png',\n style: Object.assign({padding: '4px'}, this.props.style),\n className: this.props.className,\n alt: this.props.alt,\n onClick: this.props.onClick,\n };\n }\n\n componentDidMount() {\n // whenDone is a wrapper around an actual promise to be able to cancel it.\n this.props.whenDone\n .promise\n .then(data => this.setState({src: data.src, style: {...this.state.style, padding: 0}}))\n .catch(_ => this.setState({src: this.props.isvideo ? 'img/broken_video.png' : 'img/broken_image.png'}));\n }\n\n componentWillUnmount() {\n this.props.whenDone.cancel();\n }\n\n componentDidUpdate(prevProps) {\n if (prevProps.whenDone != this.props.whenDone) {\n this.setState({src: this.props.isvideo ? 'img/blankvid.png' : 'img/blankimg.png', style: {...this.state.style, padding: '4px'}});\n this.props.whenDone\n .promise\n .then(data => this.setState({src: data.src, style: {...this.state.style, padding: 0}}))\n .catch(_ => this.setState({src: this.props.isvideo ? 'img/broken_video.png' : 'img/broken_image.png'}));\n }\n }\n\n render() {\n return React.createElement('img', this.state);\n }\n};\n","import React from 'react';\n\nimport { Tinode } from 'tinode-sdk';\n\nimport { idToColorClass } from '../lib/strformat.js';\nimport { sanitizeUrlForMime } from '../lib/utils.js';\n\nexport default class LetterTile extends React.PureComponent {\n render() {\n let avatar;\n if (this.props.avatar === true) {\n const isGroup = Tinode.isGroupTopicName(this.props.topic);\n const iconColor = idToColorClass(this.props.topic, isGroup);\n if (this.props.topic && this.props.title && this.props.title.trim()) {\n const letter = this.props.title.trim().charAt(0);\n const className = 'lettertile ' + iconColor + (this.props.deleted ? ' disabled' : '');\n avatar = ()\n } else {\n const className = 'material-icons ' + iconColor + (this.props.deleted ? ' disabled' : '');\n avatar = isGroup ? group : person ;\n }\n } else if (this.props.avatar) {\n const url = this.props.tinode.authorizeURL(sanitizeUrlForMime(this.props.avatar, 'image'));\n // If avatar image is invalid, show a placeholder.\n const className = 'avatar' + (this.props.deleted ? ' deleted' : '');\n avatar = {e.target.onerror = null; e.target.src=\"../img/broken_image.png\"}} />;\n } else {\n avatar = null;\n }\n return avatar;\n }\n}\n","import React from 'react';\n\nexport default class LoadSpinner extends React.PureComponent {\n render() {\n const className = 'load-spinner-box' + (this.props.large ? ' large' : '')\n + (this.props.clear ? ' clear' : '') + (this.props.centered ? ' centered' : '');\n return (this.props.show ?\n : null);\n }\n}\n","// The X menu to be displayed in title bars.\nimport React from 'react';\n\nexport default class MenuCancel extends React.PureComponent {\n render() {\n return (\n {e.preventDefault(); this.props.onCancel();}}>\n close \n \n );\n }\n}\n","import React from 'react';\n\nexport default class MenuContacts extends React.PureComponent {\n render() {\n return (\n \n );\n }\n};\n","import React from 'react';\n\nexport default class MenuStart extends React.PureComponent {\n render() {\n return (\n \n );\n }\n};\n","// Message bubble with non-payload content, such as an indicator of deleted content or a date stamp.\n\nimport React from 'react';\n\nexport default class MetaMessage extends React.PureComponent {\n constructor(props) {\n super(props);\n }\n\n render() {\n let content = null;\n let bubbleClass = 'bubble';\n if (this.props.date) {\n // A date badge.\n content = <>{this.props.date}>\n bubbleClass += ' date';\n }\n\n if (!content) {\n return <>{null}>\n }\n\n return (\n \n \n \n );\n }\n};\n","import React from 'react';\nimport { FormattedMessage, defineMessages, injectIntl } from 'react-intl';\n\nconst messages = defineMessages({\n invalid_id: {\n id: 'error_invalid_id',\n defaultMessage: 'Invalid ID',\n description: 'Error message'\n }\n});\n\nclass NewTopicById extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.state = {\n groupId: '',\n };\n\n this.handleChange = this.handleChange.bind(this);\n this.handleKeyPress = this.handleKeyPress.bind(this);\n this.handleSubmit = this.handleSubmit.bind(this);\n }\n\n handleChange(e) {\n this.setState({groupId: e.target.value});\n }\n\n handleKeyPress(e) {\n if (e.key === 'Enter') {\n this.handleSubmit(e);\n }\n }\n\n handleSubmit(e) {\n e.preventDefault();\n if (this.state.groupId) {\n const name = this.state.groupId.trim();\n const prefix = name.substr(0, 3);\n if (name.length > 3 && ['usr', 'grp', 'chn'].includes(prefix)) {\n this.props.onSubmit(name);\n } else {\n this.props.onError(this.props.intl.formatMessage(messages.invalid_id), 'err');\n }\n }\n }\n\n render() {\n return (\n \n
\n {\n (prompt) => \n } \n
\n
\n \n \n \n
\n
\n );\n }\n};\n\nexport default injectIntl(NewTopicById);\n","import React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport AvatarCrop from './avatar-crop.jsx';\nimport AvatarUpload from './avatar-upload.jsx';\nimport CheckBox from './checkbox.jsx';\nimport TagManager from './tag-manager.jsx';\n\nimport { AVATAR_SIZE, MAX_AVATAR_BYTES, MAX_EXTERN_ATTACHMENT_SIZE, MAX_TITLE_LENGTH,\n MAX_TOPIC_DESCRIPTION_LENGTH } from '../config.js';\nimport { imageScaled, blobToBase64, makeImageUrl } from '../lib/blob-helpers.js';\n\nexport default class NewTopicGroup extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.fullName = React.createRef();\n\n this.state = {\n fullName: '', // full/formatted name\n private: '',\n description: '',\n imageUrl: null,\n tags: [],\n isChannel: false,\n newAvatar: null,\n newAvatarMime: null\n };\n\n this.handleFieldEdit = this.handleFieldEdit.bind(this);\n this.handleImageChanged = this.handleImageChanged.bind(this);\n this.handleAvatarCropped = this.handleAvatarCropped.bind(this);\n this.handleAvatarCropCancel = this.handleAvatarCropCancel.bind(this);\n this.uploadAvatar = this.uploadAvatar.bind(this);\n this.handleTagsChanged = this.handleTagsChanged.bind(this);\n this.handleChannelToggle = this.handleChannelToggle.bind(this);\n this.handleSubmit = this.handleSubmit.bind(this);\n }\n\n componentDidMount() {\n // this.fullName.current.focus();\n }\n\n handleFieldEdit(name, e) {\n this.setState({[name]: e.target.value || ''});\n }\n\n handleImageChanged(mime, img) {\n this.setState({newAvatar: img, newAvatarMime: mime});\n }\n\n handleAvatarCropped(mime, blob, width, height) {\n const url = blob ? URL.createObjectURL(blob) : null;\n this.setState({imageUrl: url, newAvatar: null, newAvatarMime: null});\n if (blob) {\n this.uploadAvatar(mime, blob, width, height);\n }\n }\n\n handleAvatarCropCancel() {\n this.setState({newAvatar: null, newAvatarMime: null});\n }\n\n // Utility method for converting cropped avatar blob to bytes for sending inband or\n // for uploading it to the server out of band.\n uploadAvatar(mime, blob, width, height) {\n const readyToUpload = image => {\n let {mime, blob} = image;\n if (blob.size > MAX_AVATAR_BYTES) {\n // Too large to send inband - uploading out of band and sending as a link.\n const uploader = this.props.tinode.getLargeFileHelper();\n uploader.upload(blob)\n .then(url => this.setState({imageUrl: url}))\n .catch(err => this.props.onError(err.message, 'err'));\n } else {\n // Convert blob to base64-encoded bits.\n blobToBase64(blob)\n .then(b64 => this.setState({imageUrl: makeImageUrl({data: b64.bits, type: mime})}));\n }\n };\n\n if (width > AVATAR_SIZE || height > AVATAR_SIZE || width != height) {\n // Avatar is not square or too large even after cropping. Shrink it and make square.\n imageScaled(blob, AVATAR_SIZE, AVATAR_SIZE, MAX_EXTERN_ATTACHMENT_SIZE, true)\n .then(scaled => readyToUpload(scaled))\n .catch(err => this.props.onError(err.message, 'err'));\n } else {\n readyToUpload({mime: mime, blob: blob, width: width, height: height});\n }\n }\n\n handleTagsChanged(tags) {\n this.setState({tags: tags});\n }\n\n handleChannelToggle() {\n this.setState({isChannel: !this.state.isChannel});\n }\n\n handleSubmit(e) {\n e.preventDefault();\n\n const fn = this.state.fullName.trim().substring(0, MAX_TITLE_LENGTH);\n const comment = this.state.private.trim().substring(0, MAX_TITLE_LENGTH);\n const description = this.state.description.trim().substring(0, MAX_TOPIC_DESCRIPTION_LENGTH);\n if (fn) {\n this.props.onSubmit(fn, description, this.state.imageUrl, comment, this.state.tags, this.state.isChannel);\n }\n }\n\n render() {\n if (this.state.newAvatar) {\n return (\n \n );\n }\n\n let submitClasses = 'primary';\n if (this.props.disabled) {\n submitClasses += ' disabled';\n }\n return (\n \n );\n }\n};\n","// PermissionsEditor: Component for editing permissions\n// \nimport React from 'react';\nimport { FormattedMessage, defineMessages, injectIntl } from 'react-intl';\n\nimport CheckBox from './checkbox.jsx';\nimport Contact from './contact.jsx';\n\nimport { makeImageUrl } from '../lib/blob-helpers.js';\n\n// Translatable permission names.\nconst messages = defineMessages({\n joiner: {\n id: 'permission_join',\n defaultMessage: \"Join ({val})\",\n description: 'Name of J permission'\n },\n reader: {\n id: 'permission_read',\n defaultMessage: \"Read ({val})\",\n description: 'Name of R permission'\n },\n writer: {\n id: 'permission_write',\n defaultMessage: \"Write ({val})\",\n description: 'Name of W permission'\n },\n preser: {\n id: 'permission_pres',\n defaultMessage: \"Get notified ({val})\",\n description: 'Name of P permission'\n },\n approver: {\n id: 'permission_admin',\n defaultMessage: \"Approve ({val})\",\n description: 'Name of A permission'\n },\n sharer: {\n id: 'permission_share',\n defaultMessage: \"Share ({val})\",\n description: 'Name of S permission'\n },\n deleter: {\n id: 'permission_delete',\n defaultMessage: \"Delete ({val})\",\n description: 'Name of D permission'\n },\n owner: {\n id: 'permission_owner',\n defaultMessage: \"Owner ({val})\",\n description: 'Name of O permission'\n }\n});\n\nclass PermissionsEditor extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = {\n mode: (props.mode || '').replace('N', '')\n };\n\n this.handleChange = this.handleChange.bind(this);\n this.handleSubmit = this.handleSubmit.bind(this);\n this.handleCancel = this.handleCancel.bind(this);\n }\n\n handleChange(val) {\n let mode = this.state.mode;\n const idx = mode.indexOf(val);\n if (idx == -1) {\n mode += val;\n } else {\n mode = mode.replace(val, '');\n }\n this.setState({mode: mode});\n }\n\n handleSubmit() {\n // Normalize string, otherwise cannot check if mode has changed.\n const mode = (this.state.mode || 'N').split('').sort().join('');\n const before = (this.props.mode || 'N').split('').sort().join('')\n if (mode !== before) {\n this.props.onSubmit(mode);\n } else {\n this.props.onCancel();\n }\n }\n\n handleCancel() {\n this.props.onCancel();\n }\n\n render() {\n const {formatMessage} = this.props.intl;\n const all = 'JRWPASDO';\n const names = {\n 'J': formatMessage(messages.joiner, {val: 'J'}),\n 'R': formatMessage(messages.reader, {val: 'R'}),\n 'W': formatMessage(messages.writer, {val: 'W'}),\n 'P': formatMessage(messages.preser, {val: 'P'}),\n 'A': formatMessage(messages.approver, {val: 'A'}),\n 'S': formatMessage(messages.sharer, {val: 'S'}),\n 'D': formatMessage(messages.deleter, {val: 'D'}),\n 'O': formatMessage(messages.owner, {val: 'O'})\n };\n\n let skip = this.props.skip || '';\n let mode = this.state.mode;\n let compare = (this.props.compare || '').replace('N', '');\n let items = [];\n for (let i=0; i= 0 && mode.indexOf(c) < 0) {\n // Permission is marked as inactive: hide unchecked permissions, disable checked permissions\n continue;\n }\n items.push(\n \n {names[c]} \n {skip.indexOf(c) < 0 ?\n = 0)} onChange={this.handleChange}/>\n :\n = 0)} />\n } {this.props.compare ? \n = 0)}/>\n : null}\n \n );\n }\n\n return (\n \n {this.props.userTitle ?\n
: null}\n
\n
\n {this.props.compare ?\n \n {this.props.modeTitle} \n {this.props.compareTitle} \n :\n null}\n \n {items}\n
\n
\n
\n \n \n \n \n \n \n
\n
\n );\n }\n};\n\nexport default injectIntl(PermissionsEditor);\n","// Received/read indicator.\nimport React from 'react';\nimport { defineMessages, injectIntl } from 'react-intl';\n\nimport { Tinode } from 'tinode-sdk';\n\nimport { deliveryMarker } from '../lib/utils.js';\n\nconst messages = defineMessages({\n message_sending: {\n id: 'message_sending',\n defaultMessage: 'sending...',\n description: 'Message being sent, in place of time stamp'\n },\n message_sending_failed: {\n id: 'message_sending_failed',\n defaultMessage: 'failed',\n description: 'Failed to send message, in place of time stamp'\n },\n message_edited_marker: {\n id: 'message_edited_marker',\n defaultMessage: ', edited',\n description: 'Marker indicating that the message was edited'\n }\n});\n\nclass ReceivedMarker extends React.PureComponent {\n render() {\n const {formatMessage} = this.props.intl;\n let timestamp;\n if (this.props.received <= Tinode.MESSAGE_STATUS_SENDING) {\n timestamp = formatMessage(messages.message_sending);\n } else if (this.props.received == Tinode.MESSAGE_STATUS_FAILED) {\n timestamp = formatMessage(messages.message_sending_failed);\n } else {\n timestamp = this.props.timestamp.toLocaleTimeString(this.props.intl.locale, { timeStyle: 'short' });\n }\n\n const icon = deliveryMarker(this.props.received);\n const marker = icon ? {icon.name} : null;\n const edited = this.props.edited ? formatMessage(messages.message_edited_marker) : null;\n\n return (\n \n {timestamp}{edited}{'\\u00a0'}{marker}\n \n );\n }\n};\n\nexport default injectIntl(ReceivedMarker);\n","import React from 'react';\n\nimport { Tinode } from 'tinode-sdk';\n\nexport default class SearchContacts extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.state = {\n edited: false,\n search: ''\n };\n\n this.handleSearchChange = this.handleSearchChange.bind(this);\n this.handleSearch = this.handleSearch.bind(this);\n this.handleClear = this.handleClear.bind(this);\n this.handleKeyDown = this.handleKeyDown.bind(this);\n }\n\n componentWillUnmount() {\n if (this.state.edited) {\n this.setState({search: '', edited: false});\n this.props.onSearchContacts(Tinode.DEL_CHAR);\n }\n }\n\n handleSearchChange(e) {\n this.setState({search: e.target.value});\n }\n\n handleSearch(e) {\n e.preventDefault();\n const query = this.state.search.trim();\n this.setState({edited: (query.length > 0)});\n this.props.onSearchContacts(query.length > 0 ? query : Tinode.DEL_CHAR);\n }\n\n handleClear(e) {\n e.preventDefault();\n if (this.state.edited) {\n this.props.onSearchContacts(Tinode.DEL_CHAR);\n }\n this.setState({search: '', edited: false});\n }\n\n handleKeyDown(e) {\n if (e.key === 'Enter') {\n this.handleSearch(e);\n } else if (e.key === 'Escape') {\n this.handleClear();\n }\n }\n\n render() {\n return (\n \n );\n }\n};\n","// Send message form.\nimport React, { Suspense } from 'react';\nimport { FormattedMessage, defineMessages, injectIntl } from 'react-intl';\nimport { Drafty } from 'tinode-sdk';\n\n// Lazy-loading AudioRecorder because it's quite large due to\n// a dependency on webm-duration-fix.\nconst AudioRecorder = React.lazy(_ => import('./audio-recorder.jsx'));\n\nimport { KEYPRESS_DELAY } from '../config.js';\nimport { filePasted } from '../lib/blob-helpers.js';\nimport { replyFormatter } from '../lib/formatters.js';\n\nconst messages = defineMessages({\n messaging_disabled: {\n id: 'messaging_disabled_prompt',\n defaultMessage: 'Messaging disabled',\n description: 'Prompt in SendMessage in read-only topic'\n },\n type_new_message: {\n id: 'new_message_prompt',\n defaultMessage: 'New message',\n description: 'Prompt in send message field'\n },\n add_image_caption: {\n id: 'image_caption_prompt',\n defaultMessage: 'Image caption',\n description: 'Prompt in SendMessage for attached image'\n },\n file_attachment_too_large: {\n id: 'file_attachment_too_large',\n defaultMessage: 'The file size {size} exceeds the {limit} limit.',\n description: 'Error message when attachment is too large'\n },\n cannot_initiate_upload: {\n id: 'cannot_initiate_file_upload',\n defaultMessage: 'Cannot initiate file upload.',\n description: 'Generic error messagewhen attachment fails'\n },\n icon_title_record_voice: {\n id: 'icon_title_record_voice',\n defaultMessage: 'Record voice message',\n description: 'Icon tool tip for recording a voice message'\n },\n icon_title_attach_file: {\n id: 'icon_title_attach_file',\n defaultMessage: 'Attach file',\n description: 'Icon tool tip for attaching a file'\n },\n icon_title_add_image: {\n id: 'icon_title_add_image',\n defaultMessage: 'Add image',\n description: 'Icon tool tip for attaching an image'\n },\n icon_title_send: {\n id: 'icon_title_send',\n defaultMessage: 'Send message',\n description: 'Icon tool tip for sending a message'\n },\n});\n\nclass SendMessage extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.state = {\n quote: null,\n message: '',\n audioRec: false,\n audioAvailable: !!(navigator.mediaDevices && navigator.mediaDevices.getUserMedia),\n };\n\n // Timestamp when the previous key press was sent to the server.\n this.keypressTimestamp = 0;\n\n this.handlePasteEvent = this.handlePasteEvent.bind(this);\n this.handleAttachImage = this.handleAttachImage.bind(this);\n this.handleAttachFile = this.handleAttachFile.bind(this);\n this.handleAttachAudio = this.handleAttachAudio.bind(this);\n this.handleSend = this.handleSend.bind(this);\n this.handleKeyPress = this.handleKeyPress.bind(this);\n this.handleMessageTyping = this.handleMessageTyping.bind(this);\n this.handleDropAttach = this.handleDropAttach.bind(this);\n\n this.handleQuoteClick = this.handleQuoteClick.bind(this);\n\n this.formatReply = this.formatReply.bind(this);\n }\n\n componentDidMount() {\n if (this.messageEditArea) {\n this.messageEditArea.addEventListener('paste', this.handlePasteEvent, false);\n if (window.getComputedStyle(this.messageEditArea).getPropertyValue('transition-property') == 'all') {\n // Set focus on desktop, but not on mobile: focus causes soft keyboard to pop up.\n this.messageEditArea.focus();\n }\n }\n\n this.setState({quote: this.formatReply()});\n }\n\n componentWillUnmount() {\n if (this.messageEditArea) {\n this.messageEditArea.removeEventListener('paste', this.handlePasteEvent, false);\n }\n }\n\n componentDidUpdate(prevProps) {\n if (this.messageEditArea) {\n if (window.getComputedStyle(this.messageEditArea).getPropertyValue('transition-property') == 'all') {\n // Set focus on desktop, but not on mobile: focus causes soft keyboard to pop up.\n this.messageEditArea.focus();\n }\n }\n\n if (prevProps.topicName != this.props.topicName) {\n this.setState({message: this.props.initMessage || '', audioRec: false, quote: null});\n } else if (prevProps.initMessage != this.props.initMessage) {\n const msg = this.props.initMessage || '';\n this.setState({message: msg}, _ => {\n // If there is text, scroll to bottom and set caret to the end.\n this.messageEditArea.scrollTop = this.messageEditArea.scrollHeight;\n this.messageEditArea.setSelectionRange(msg.length, msg.length);\n });\n }\n if (prevProps.reply != this.props.reply) {\n this.setState({quote: this.formatReply()});\n }\n }\n\n formatReply() {\n return this.props.reply ?\n Drafty.format(this.props.reply.content, replyFormatter, {\n formatMessage: this.props.intl.formatMessage.bind(this.props.intl),\n authorizeURL: this.props.tinode.authorizeURL.bind(this.props.tinode)\n }) : null;\n }\n\n handlePasteEvent(e) {\n if (this.props.disabled) {\n return;\n }\n // FIXME: handle large files too.\n if (filePasted(e,\n file => { this.props.onAttachImage(file); },\n file => { this.props.onAttachFile(file); },\n this.props.onError)) {\n\n // If a file was pasted, don't paste base64 data into input field.\n e.preventDefault();\n }\n }\n\n handleAttachImage(e) {\n if (e.target.files && e.target.files.length > 0) {\n this.props.onAttachImage(e.target.files[0]);\n }\n // Clear the value so the same file can be uploaded again.\n e.target.value = '';\n }\n\n handleAttachFile(e) {\n if (e.target.files && e.target.files.length > 0) {\n this.props.onAttachFile(e.target.files[0]);\n }\n // Clear the value so the same file can be uploaded again.\n e.target.value = '';\n }\n\n handleDropAttach(files) {\n if (files && files.length > 0) {\n this.props.onAttachFile(files[0]);\n }\n }\n\n handleAttachAudio(url, preview, duration) {\n this.setState({audioRec: false});\n this.props.onAttachAudio(url, preview, duration);\n }\n\n handleSend(e) {\n e.preventDefault();\n const message = this.state.message.trim();\n if (message || this.props.acceptBlank || this.props.noInput) {\n this.props.onSendMessage(message);\n this.setState({message: ''});\n }\n }\n\n /* Send on Enter key */\n handleKeyPress(e) {\n if (this.state.audioRec) {\n // Ignore key presses while audio is being recorded.\n e.preventDefault();\n e.stopPropagation();\n return;\n }\n\n // Remove this if you don't want Enter to trigger send\n if (e.key === 'Enter') {\n // Have Shift-Enter insert a line break instead\n if (!e.shiftKey) {\n e.preventDefault();\n e.stopPropagation();\n\n this.handleSend(e);\n }\n }\n }\n\n handleMessageTyping(e) {\n this.setState({message: e.target.value});\n if (this.props.onKeyPress) {\n const now = new Date().getTime();\n if (now - this.keypressTimestamp > KEYPRESS_DELAY) {\n this.props.onKeyPress();\n this.keypressTimestamp = now;\n }\n }\n }\n\n handleQuoteClick(e) {\n e.preventDefault();\n e.stopPropagation();\n if (this.props.reply && this.props.onQuoteClick) {\n const replyToSeq = this.props.reply.seq;\n this.props.onQuoteClick(replyToSeq);\n }\n }\n\n render() {\n const { formatMessage } = this.props.intl;\n const prompt = this.props.disabled ?\n formatMessage(messages.messaging_disabled) :\n (this.props.messagePrompt ?\n formatMessage(messages[this.props.messagePrompt]) :\n formatMessage(messages.type_new_message));\n\n const sendIcon = (this.props.reply && this.props.reply.editing) ?\n 'check_circle' : 'send';\n\n const quote = this.state.quote ?\n (\n
\n {this.state.quote}\n
) : null;\n const audioEnabled = this.state.audioAvailable && this.props.onAttachAudio;\n return (\n \n {!this.props.noInput ? quote : null}\n
}>\n
this.props.onKeyPress(true)}\n onDeleted={_ => this.setState({audioRec: false})}\n onFinished={this.handleAttachAudio}/>\n ) :\n \n \n );\n }\n};\n\nexport default injectIntl(SendMessage);\n","import React from 'react';\n\nimport LetterTile from './letter-tile.jsx';\nimport ButtonBack from './button-back.jsx';\nimport ContactBadges from './contact-badges.jsx';\nimport MenuContacts from './menu-contacts.jsx';\nimport MenuStart from './menu-start.jsx';\n\nimport { sanitizeUrlForMime } from '../lib/utils.js';\n\nexport default class SideNavbar extends React.PureComponent {\n render() {\n const icon_badges = [];\n if (this.props.trustedBadges) {\n this.props.trustedBadges.map((b) => {\n icon_badges.push({icon: b, color: 'badge-inv'});\n });\n }\n let avatar = null;\n if (this.props.tinode) {\n avatar = this.props.tinode.authorizeURL(sanitizeUrlForMime(this.props.avatar, 'image'));\n }\n return (\n \n {this.props.onCancel ?
: null}\n {avatar ?\n
\n \n
\n :\n null}\n
{this.props.title}
\n {this.props.state === 'login' ?\n
:\n this.props.state === 'contacts' ?\n
:\n null}\n
\n );\n }\n};\n","// TagManager: edit topic or user tags.\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport ChipInput from './chip-input.jsx';\n\nimport { MAX_TAG_COUNT, MAX_TAG_LENGTH, MIN_TAG_LENGTH } from '../config.js';\nimport { arrayEqual } from '../lib/utils.js';\n\nexport default class TagManager extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = {\n tags: this.props.tags || [],\n tagInput: '',\n activated: this.props.activated\n };\n\n this.handleTagInput = this.handleTagInput.bind(this);\n this.handleAddTag = this.handleAddTag.bind(this);\n this.handleRemoveTag = this.handleRemoveTag.bind(this);\n this.handleSubmit = this.handleSubmit.bind(this);\n this.handleCancel = this.handleCancel.bind(this);\n }\n\n static getDerivedStateFromProps(nextProps, prevState) {\n const tags = nextProps.tags || [];\n if (!arrayEqual(tags, prevState.tags) && !prevState.activated) {\n return {tags: tags};\n }\n return null;\n }\n\n handleTagInput(text) {\n this.setState({tagInput: text});\n if (text.length > 0) {\n const last = text[text.length-1];\n if (text[0] == '\"') {\n // This is a quoted string.\n if (text.length > 1 && last == '\"') {\n this.handleAddTag(text.substring(1, text.length-1));\n }\n } else if (last == ',' || last == ' ' || last == ';' || last == '\"') {\n // User entered ',', ' ' or ';'\n this.handleAddTag(text.substring(0, text.length-1).trim());\n }\n }\n }\n\n handleAddTag(tag) {\n const maxTagCount = this.props.tinode.getServerParam('maxTagCount', MAX_TAG_COUNT);\n\n if (tag.length > 0 && this.state.tags.length < maxTagCount) {\n const tags = this.state.tags.slice(0);\n tags.push(tag);\n\n this.setState({tags: tags, tagInput: ''});\n if (this.props.onTagsChanged) {\n this.props.onTagsChanged(tags);\n }\n return tags;\n }\n return this.state.tags;\n }\n\n handleRemoveTag(tag, index) {\n const tags = this.state.tags.slice(0);\n tags.splice(index, 1);\n this.setState({tags: tags});\n if (this.props.onTagsChanged) {\n this.props.onTagsChanged(tags);\n }\n }\n\n handleSubmit() {\n // Add unprocessed input to tags, submit the list.\n this.props.onSubmit(this.handleAddTag(this.state.tagInput.trim()));\n this.setState({activated: false, tags: this.props.tags || []});\n }\n\n handleCancel() {\n this.setState({activated: false, tagInput: '', tags: this.props.tags || []});\n if (this.props.onCancel) {\n this.props.onCancel();\n }\n }\n\n render() {\n const minTagLength = this.props.tinode.getServerParam('minTagLength', MIN_TAG_LENGTH);\n const maxTagLength = this.props.tinode.getServerParam('maxTagLength', MAX_TAG_LENGTH);\n\n let tags = [];\n if (this.state.activated) {\n this.state.tags.map((tag) => {\n tags.push({user: tag, invalid: (tag.length < minTagLength || tag.length > maxTagLength)});\n });\n } else {\n this.state.tags.map((tag) => {\n tags.push({tag} );\n });\n if (tags.length == 0) {\n tags = (\n \n \n \n );\n }\n }\n return (\n \n
\n {this.props.title} \n
\n {this.state.activated ?\n
\n
{\n (add_tags_prompt) => \n } \n {this.props.onSubmit || this.props.onCancel ?\n
\n \n \n \n \n \n \n
\n : null}\n
\n :\n
\n }\n
\n );\n }\n};\n","// View for editing topic (including 'me' topic) parameters.\n\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport TopicDescEdit from '../widgets/topic-desc-edit.jsx';\n\nimport { arrayEqual, asEmail, asPhone } from '../lib/utils.js';\n\nexport default class TopicCommon extends React.Component {\n constructor(props) {\n super(props);\n\n const topic = this.props.tinode.getTopic(this.props.topic);\n const acs = topic.getAccessMode();\n this.state = {\n isMe: this.props.topic == 'me',\n owner: acs && acs.isOwner(),\n credentials: (topic.getCredentials ? topic.getCredentials() : null) || [],\n addCredActive: false,\n addCredInvalid: false,\n newCred: '',\n tags: []\n };\n\n this.previousTagsUpdated = undefined;\n\n this.onTagsUpdated = this.onTagsUpdated.bind(this);\n this.handleTagsUpdated = this.handleTagsUpdated.bind(this);\n this.tnCredsUpdated = this.tnCredsUpdated.bind(this);\n this.handleCredChange = this.handleCredChange.bind(this);\n this.handleCredKeyDown = this.handleCredKeyDown.bind(this);\n this.handleCredEntered = this.handleCredEntered.bind(this);\n }\n\n // No need to separately handle component mount.\n componentDidUpdate(props) {\n const topic = this.props.tinode.getTopic(props.topic);\n if (!topic) {\n return;\n }\n\n topic.onCredsUpdated = this.tnCredsUpdated;\n\n if (topic.onTagsUpdated != this.onTagsUpdated) {\n if (topic.getType() == 'grp') {\n this.previousTagsUpdated = topic.onTagsUpdated;\n topic.onTagsUpdated = this.onTagsUpdated;\n } else {\n this.previousTagsUpdated = undefined;\n }\n }\n\n if (this.state.topic != props.topic) {\n this.setState({topic: props.topic});\n }\n }\n\n componentWillUnmount() {\n const topic = this.props.tinode.getTopic(this.props.topic);\n topic.onCredsUpdated = undefined;\n topic.onTagsUpdated = this.previousTagsUpdated;\n }\n\n tnCredsUpdated(creds) {\n this.setState({credentials: creds || []});\n }\n\n handleCredChange(e) {\n this.setState({newCred: e.target.value, addCredInvalid: false});\n }\n\n handleCredKeyDown(e) {\n if (e.keyCode === 27) {\n // Escape pressed\n this.setState({newCred: '', addCredActive: false});\n } else if (e.keyCode === 13) {\n // Enter pressed\n this.handleCredEntered(e);\n }\n }\n\n handleCredEntered(e) {\n const value = this.state.newCred.trim();\n if (!value) {\n this.setState({addCredActive: false, addCredInvalid: false});\n return;\n }\n\n let val = asPhone(value);\n let method;\n if (val) {\n method = 'tel';\n } else {\n val = asEmail(value);\n if (val) {\n method = 'email';\n }\n }\n if (method) {\n this.props.onCredAdd(method, val);\n this.setState({addCredActive: false, newCred: ''});\n } else {\n this.setState({addCredInvalid: true});\n }\n }\n\n // Server informs that the tags have been updated.\n onTagsUpdated(tags) {\n this.setState({tags: tags});\n\n if (this.previousTagsUpdated && this.previousTagsUpdated != this.onTagsUpdated) {\n this.previousTagsUpdated(tags);\n }\n }\n\n // Request server to change tags.\n handleTagsUpdated(tags) {\n if (!arrayEqual(this.state.tags.slice(0), tags.slice(0))) {\n this.props.onUpdateTagsRequest(this.props.topic, tags);\n }\n }\n\n render() {\n const credentials = [];\n if (this.state.isMe) {\n this.state.credentials.map((cred) => {\n credentials.push(\n \n );\n });\n }\n\n return (\n \n
\n {this.state.isMe ?\n <>\n
\n
\n
\n \n \n
\n {credentials}\n {this.state.addCredActive ?\n
{(phone_or_email_prompt) =>\n \n } \n : null}\n
\n
\n
\n >\n : null\n }\n
\n );\n }\n};\n","// Widget for editing topic description.\n\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport { Tinode } from 'tinode-sdk';\n\nimport AvatarCrop from './avatar-crop.jsx';\nimport AvatarUpload from './avatar-upload.jsx';\nimport InPlaceEdit from './in-place-edit.jsx';\nimport TagManager from './tag-manager.jsx';\n\nimport { AVATAR_SIZE, MAX_AVATAR_BYTES, MAX_EXTERN_ATTACHMENT_SIZE, MAX_TITLE_LENGTH,\n MAX_TOPIC_DESCRIPTION_LENGTH } from '../config.js';\nimport { imageScaled, blobToBase64, makeImageUrl } from '../lib/blob-helpers.js';\nimport { arrayEqual, theCard } from '../lib/utils.js';\n\nexport default class TopicDescEdit extends React.Component {\n constructor(props) {\n super(props);\n\n const topic = this.props.tinode.getTopic(this.props.topic);\n const acs = topic.getAccessMode();\n this.state = {\n isMe: Tinode.isMeTopicName(this.props.topic),\n owner: acs && acs.isOwner(),\n fullName: topic.public ? topic.public.fn : undefined,\n private: topic.private ? topic.private.comment : null,\n description: topic.public ? topic.public.note : undefined,\n avatar: makeImageUrl(topic.public ? topic.public.photo : null),\n tags: topic.tags() || [],\n newAvatar: null,\n newAvatarMime: null\n };\n\n this.previousOnTags = null;\n\n this.tnNewTags = this.tnNewTags.bind(this);\n this.handleFullNameUpdate = this.handleFullNameUpdate.bind(this);\n this.handleImageUpdated = this.handleImageUpdated.bind(this);\n this.handleAvatarCropped = this.handleAvatarCropped.bind(this);\n this.handleAvatarCropCancel = this.handleAvatarCropCancel.bind(this);\n this.uploadAvatar = this.uploadAvatar.bind(this);\n this.handlePrivateUpdate = this.handlePrivateUpdate.bind(this);\n this.handleDescriptionUpdate = this.handleDescriptionUpdate.bind(this);\n this.handleTagsUpdated = this.handleTagsUpdated.bind(this);\n }\n\n componentDidMount() {\n const topic = this.props.tinode.getTopic(this.props.topic);\n this.previousOnTags = topic.onTagsUpdated;\n topic.onTagsUpdated = this.tnNewTags;\n }\n\n componentWillUnmount() {\n const topic = this.props.tinode.getTopic(this.props.topic);\n topic.onTagsUpdated = this.previousOnTags;\n }\n\n tnNewTags(tags) {\n this.setState({tags: tags});\n }\n\n handleFullNameUpdate(fn) {\n fn = fn.trim().substring(0, MAX_TITLE_LENGTH);\n if (fn && this.state.fullName !== fn) {\n this.setState({fullName: fn});\n this.props.onUpdateTopicDesc(this.props.topic, theCard(fn, null));\n }\n }\n\n handlePrivateUpdate(comment) {\n comment = comment.trim().substring(0, MAX_TITLE_LENGTH);\n if (this.state.private !== comment) {\n this.setState({private: comment});\n this.props.onUpdateTopicDesc(this.props.topic, null, comment || Tinode.DEL_CHAR);\n }\n }\n\n handleDescriptionUpdate(desc) {\n desc = desc.trim().substring(0, MAX_TOPIC_DESCRIPTION_LENGTH);\n if (desc) {\n this.setState({description: desc});\n this.props.onUpdateTopicDesc(this.props.topic, theCard(null, null, null, desc));\n }\n }\n\n // AvatarUpload widget has changed the avatar: received a new file or deleted the avatar.\n handleImageUpdated(mime, img) {\n // This will show the AvatarCropView is img is not null.\n this.setState({newAvatar: img, newAvatarMime: mime});\n if (!img) {\n // Deleting the avatar.\n this.setState({avatar: null});\n this.props.onUpdateTopicDesc(this.props.topic, theCard(null, Tinode.DEL_CHAR));\n }\n }\n\n // AvatarCropView calls this method when the user has cropped the image.\n handleAvatarCropped(mime, blob, width, height) {\n const url = blob ? URL.createObjectURL(blob) : null;\n this.setState({avatar: url, newAvatar: null, newAvatarMime: null});\n if (blob) {\n this.uploadAvatar(mime, blob, width, height);\n }\n }\n\n // Utility method for converting cropped avatar blob to bytes for sending inband or\n // for uploading it to the server out of band.\n uploadAvatar(mime, blob, width, height) {\n const readyToUpload = image => {\n let {mime, blob} = image;\n if (blob.size > MAX_AVATAR_BYTES) {\n // Too large to send inband - uploading out of band and sending as a link.\n const uploader = this.props.tinode.getLargeFileHelper();\n uploader.upload(blob)\n .then(url => this.props.onUpdateTopicDesc(this.props.topic, theCard(null, url)))\n .catch(err => this.props.onError(err.message, 'err'));\n } else {\n // Convert blob to base64-encoded bits.\n blobToBase64(blob)\n .then(b64 => {\n const du = makeImageUrl({data: b64.bits, type: mime});\n this.setState({source: du});\n this.props.onUpdateTopicDesc(this.props.topic, theCard(null, du));\n });\n }\n };\n\n if (width > AVATAR_SIZE || height > AVATAR_SIZE || width != height) {\n // Avatar is not square or too large even after cropping. Shrink it and make square.\n imageScaled(blob, AVATAR_SIZE, AVATAR_SIZE, MAX_EXTERN_ATTACHMENT_SIZE, true)\n .then(scaled => readyToUpload(scaled))\n .catch(err => this.props.onError(err.message, 'err'));\n } else {\n readyToUpload({mime: mime, blob: blob, width: width, height: height});\n }\n }\n\n handleAvatarCropCancel() {\n this.setState({newAvatar: null, newAvatarMime: null});\n }\n\n handleTagsUpdated(tags) {\n // Check if tags have actually changed.\n if (arrayEqual(this.state.tags.slice(0), tags.slice(0))) {\n return;\n }\n this.props.onUpdateTags(tags);\n }\n\n render() {\n if (this.state.newAvatar) {\n return (\n \n );\n }\n\n const editable = this.state.isMe || this.state.owner;\n\n return (\n <>\n \n
\n \n \n {this.state.isMe ?\n
\n
\n \n \n
\n {\n (full_name_placeholder) => \n } \n
\n
\n :\n <>\n
\n
\n \n
\n
\n {\n (group_name_placeholder) => \n } \n
\n
\n
\n
\n \n \n \n
\n
\n {\n (private_placeholder) => \n } \n
\n
\n >\n }\n {editable || this.state.description ?\n
\n
\n \n
\n
\n {\n (private_placeholder) => \n } \n
\n
\n : null\n }\n
\n {editable ?\n <>\n
\n {\n (title_tag_manager) => \n } \n >\n : null\n }\n >\n );\n }\n};\n","// Edit account parameters.\nimport React from 'react';\nimport { FormattedMessage, defineMessages, injectIntl } from 'react-intl';\n\nconst messages = defineMessages({\n clear_messages: {\n id: 'action_clear_messages',\n defaultMessage: 'Clear Messages',\n description: 'Flat button [Clear Messages] (soft-delete messages)'\n },\n clear_messages_warning: {\n id: 'clear_messages_warning',\n defaultMessage: 'Are you sure you want to clear all messages? It cannot be undone.',\n description: 'Alert dialog warning when deleting all messages.'\n },\n delete_messages: {\n id: 'action_delete_messages',\n defaultMessage: 'Clear Messages for All',\n description: 'Flat button [Clear for All] (hard-delete all messages)'\n },\n delete_messages_warning: {\n id: 'delete_messages_warning',\n defaultMessage: 'Are you sure you want to delete all messages for everyone? It cannot be undone.',\n description: 'Alert dialog warning when hard-deleting all messages.'\n },\n topic_delete: {\n id: 'topic_delete',\n defaultMessage: 'Delete Conversation',\n description: 'Alert title when deleting the topic.'\n },\n topic_delete_warning: {\n id: 'topic_delete_warning',\n defaultMessage: 'Are you sure you want to delete this conversation? It cannot be undone.',\n description: 'Alert warning when deleting entire topic'\n },\n leave_chat: {\n id: 'action_leave_chat',\n defaultMessage: 'Leave Conversation',\n description: 'Flat button [Leave Conversation]'\n },\n leave_chat_warning: {\n id: 'leave_chat_warning',\n defaultMessage: 'Are you sure you want to leave this conversation?',\n description: 'Alert dialog warning when unsubscribing from a chat.'\n },\n block_contact: {\n id: 'action_block_contact',\n defaultMessage: \"Block Contact\",\n description: \"Flat button [Block Contact]\"\n },\n block_contact_warning: {\n id: 'block_contact_warning',\n defaultMessage: 'Are you sure you want to block this contact?',\n description: 'Alert dialog warning when blocking a contact.'\n },\n report_chat: {\n id: 'action_report_chat',\n defaultMessage: 'Report Conversation',\n description: 'Flat button [Report Group]'\n },\n report_chat_warning: {\n id: 'report_chat_warning',\n defaultMessage: 'Are you sure you want to block and report this conversation?',\n description: 'Alert dialog warning when reporting a conversation for abuse'\n },\n other_user: {\n id: 'label_other_user',\n defaultMessage: 'Other',\n description: 'Label for the other user when the user is unnamed'\n },\n});\n\nclass TopicSecurity extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.handleDeleteTopic = this.handleDeleteTopic.bind(this);\n this.handleDeleteMessages = this.handleDeleteMessages.bind(this);\n this.handleLeave = this.handleLeave.bind(this);\n this.handleBlock = this.handleBlock.bind(this);\n this.handleReport = this.handleReport.bind(this);\n }\n\n handleDeleteTopic(e) {\n e.preventDefault();\n const {formatMessage} = this.props.intl;\n this.props.onShowAlert(\n formatMessage(messages.topic_delete), // title\n formatMessage(messages.topic_delete_warning), // content\n _ => this.props.onDeleteTopic(this.props.topic), // onConfirm\n null, // \"OK\"\n true, // Show Reject button\n null // \"Cancel\"\n );\n }\n\n handleDeleteMessages(e) {\n e.preventDefault();\n const {formatMessage} = this.props.intl;\n this.props.onShowAlert(\n formatMessage(this.props.deleter ? messages.delete_messages : messages.clear_messages), // title\n formatMessage(this.props.deleter ? messages.delete_messages_warning : messages.clear_messages_warning), // content\n _ => this.props.onDeleteMessages(this.props.topic), // onConfirm\n null, // \"OK\"\n true, // Show Reject button\n null // \"Cancel\"\n );\n }\n\n handleLeave(e) {\n e.preventDefault();\n const {formatMessage} = this.props.intl;\n this.props.onShowAlert(\n formatMessage(messages.leave_chat), // title\n formatMessage(messages.leave_chat_warning), // content\n _ => this.props.onLeaveTopic(this.props.topic), // onConfirm\n null, // \"OK\"\n true, // Show Reject button\n null // \"Cancel\"\n );\n }\n\n handleBlock(e) {\n e.preventDefault();\n const {formatMessage} = this.props.intl;\n this.props.onShowAlert(\n formatMessage(messages.block_contact), // title\n formatMessage(messages.block_contact_warning), // content\n _ => this.props.onBlockTopic(this.props.topic), // onConfirm\n null, // \"OK\"\n true, // Show Reject button\n null // \"Cancel\"\n );\n }\n\n handleReport(e) {\n e.preventDefault();\n const {formatMessage} = this.props.intl;\n this.props.onShowAlert(\n formatMessage(messages.report_chat), // title\n formatMessage(messages.report_chat_warning), // content\n (_ => { this.props.onReportTopic(this.props.topic); }), // onConfirm\n null, // \"OK\"\n true, // Show Reject button\n null // \"Cancel\"\n );\n }\n\n render() {\n const {formatMessage} = this.props.intl;\n return (\n \n
\n
\n
\n {this.props.groupTopic ?\n <>\n
\n \n \n {e.preventDefault(); this.props.onLaunchPermissionsEditor('want')}}>\n {this.props.access}\n \n
\n {!this.props.channel ?\n
\n
\n \n \n \n
\n
\n
Auth: {\n e.preventDefault();\n if (this.props.owner) {\n this.props.onLaunchPermissionsEditor('auth');\n }\n }}>{this.props.auth} \n
\n
Anon: {\n e.preventDefault();\n if (this.props.owner) {\n this.props.onLaunchPermissionsEditor('anon');\n }\n }}>{this.props.anon} \n
\n
\n
\n :\n null\n }\n >\n :\n
\n
\n \n \n \n
\n
\n
\n {e.preventDefault(); this.props.onLaunchPermissionsEditor('want')}}>\n {this.props.access}\n \n
\n
{this.props.fullName ? this.props.fullName : formatMessage(messages.other_user)}:\n {e.preventDefault(); this.props.onLaunchPermissionsEditor('given')}}>\n {this.props.modeGiven2}\n \n
\n
\n
\n }\n
\n
\n );\n }\n};\n\nexport default injectIntl(TopicSecurity);\n","// The counter of unread messages in the topic.\nimport React from 'react';\n\nexport default class UnreadBadge extends React.PureComponent {\n render() {\n return (this.props.count > 0 ?\n {this.props.count > 9 ? \"9+\" : this.props.count} \n : null);\n }\n};\n","// Image view with progress bar and a cancel button.\nimport React from 'react';\n\nimport FileProgress from './file-progress.jsx';\n\nexport default class UploadingImage extends React.PureComponent {\n constructor(props) {\n super(props);\n }\n\n render() {\n return (\n \n {React.createElement('img', this.props)}\n
\n \n
\n
\n );\n }\n};\n","import React from 'react';\nimport { FormattedMessage, defineMessages, injectIntl } from 'react-intl';\nimport SendMessage from './send-message.jsx';\n\nimport { bytesToHumanSize } from '../lib/strformat.js';\n\nconst messages = defineMessages({\n unrecognized_video_format: {\n id: 'unrecognized_video_format',\n defaultMessage: 'Format of this video is not recognized',\n description: 'Error message when uploaded video is invalid',\n }\n});\n\nclass VideoPreview extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.videoRef = React.createRef();\n\n this.handleSendVideo = this.handleSendVideo.bind(this);\n }\n\n handleSendVideo(caption) {\n this.props.onClose();\n const params = {\n width: this.videoRef.current.videoWidth,\n height: this.videoRef.current.videoHeight,\n duration: (this.videoRef.current.duration * 1000) | 0,\n mime: this.props.content.mime,\n name: this.props.content.filename\n }\n\n if (params.width == 0 || params.height == 0) {\n this.props.onError(this.props.intl.formatMessage(messages.unrecognized_video_format), 'err');\n return;\n }\n\n // Capture screen from a video.\n const canvas = document.createElement('canvas');\n canvas.width = params.width;\n canvas.height = params.height;\n const ctx = canvas.getContext('2d');\n ctx.drawImage(this.videoRef.current, 0, 0, canvas.width, canvas.height);\n ctx.canvas.toBlob(\n preview => this.props.onSendMessage(caption, this.props.content.blob, preview, params),\n 'image/jpeg', 0.75\n );\n }\n\n render() {\n if (!this.props.content) {\n return null;\n }\n\n const width = this.props.content.width || '-';\n const height = this.props.content.height || '-';\n\n const controlist = this.props.onSendMessage ? 'nodownload' : '';\n const autoPlay = !this.props.onSendMessage;\n\n return (\n \n
\n
\n \n
\n {this.props.onSendMessage ?\n
\n :\n }\n
\n );\n }\n};\n\nexport default injectIntl(VideoPreview);\n","// Password with a visiblity toggle.\nimport React from 'react';\n\nexport default class VisiblePassword extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.inputRef = React.createRef();\n\n this.state = {\n value: this.props.value,\n visible: false\n };\n\n this.handleVisibility = this.handleVisibility.bind(this);\n this.handeTextChange = this.handeTextChange.bind(this);\n this.handleKeyDown = this.handleKeyDown.bind(this);\n this.handleEditingFinished = this.handleEditingFinished.bind(this);\n }\n\n componentDidMount() {\n if (this.props.autoFocus) {\n this.inputRef.current.focus();\n }\n }\n\n handeTextChange(e) {\n this.setState({value: e.target.value});\n if (this.props.onChange) {\n this.props.onChange(e);\n }\n }\n\n handleVisibility(e) {\n e.preventDefault();\n this.setState({visible: !this.state.visible});\n }\n\n handleKeyDown(e) {\n if (e.keyCode == 27) {\n // Escape pressed\n this.setState({value: this.props.value, visible: false});\n if (this.props.onFinished) {\n this.props.onFinished();\n }\n } else if (e.keyCode == 13) {\n // Enter pressed\n this.handleEditingFinished();\n }\n }\n\n handleEditingFinished(e) {\n if (e) {\n let currentTarget = e.currentTarget;\n setTimeout(_ => {\n if (!currentTarget.contains(document.activeElement)) {\n if (this.props.onFinished) {\n this.props.onFinished(this.state.value);\n }\n }\n }, 0);\n } else if (this.props.onFinished) {\n this.props.onFinished(this.state.value.trim());\n }\n }\n\n render() {\n return (\n \n \n \n \n {this.state.visible ? 'visibility' : 'visibility_off'}\n \n \n
\n );\n }\n}\n","'use strict';\n\nvar m = require('react-dom');\nif (process.env.NODE_ENV === 'production') {\n exports.createRoot = m.createRoot;\n exports.hydrateRoot = m.hydrateRoot;\n} else {\n var i = m.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;\n exports.createRoot = function(c, o) {\n i.usingClientEntryPoint = true;\n try {\n return m.createRoot(c, o);\n } finally {\n i.usingClientEntryPoint = false;\n }\n };\n exports.hydrateRoot = function(c, h, o) {\n i.usingClientEntryPoint = true;\n try {\n return m.hydrateRoot(c, h, o);\n } finally {\n i.usingClientEntryPoint = false;\n }\n };\n}\n","module.exports = React;","module.exports = ReactDOM;","module.exports = ReactIntl;","module.exports = Tinode;","import { Component, ComponentContainer } from '@firebase/component';\nimport { Logger, setUserLogHandler, setLogLevel as setLogLevel$1 } from '@firebase/logger';\nimport { ErrorFactory, getDefaultAppConfig, deepEqual, FirebaseError, base64urlEncodeWithoutPadding, isIndexedDBAvailable, validateIndexedDBOpenable } from '@firebase/util';\nexport { FirebaseError } from '@firebase/util';\nimport { openDB } from 'idb';\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nclass PlatformLoggerServiceImpl {\r\n constructor(container) {\r\n this.container = container;\r\n }\r\n // In initial implementation, this will be called by installations on\r\n // auth token refresh, and installations will send this string.\r\n getPlatformInfoString() {\r\n const providers = this.container.getProviders();\r\n // Loop through providers and get library/version pairs from any that are\r\n // version components.\r\n return providers\r\n .map(provider => {\r\n if (isVersionServiceProvider(provider)) {\r\n const service = provider.getImmediate();\r\n return `${service.library}/${service.version}`;\r\n }\r\n else {\r\n return null;\r\n }\r\n })\r\n .filter(logString => logString)\r\n .join(' ');\r\n }\r\n}\r\n/**\r\n *\r\n * @param provider check if this provider provides a VersionService\r\n *\r\n * NOTE: Using Provider<'app-version'> is a hack to indicate that the provider\r\n * provides VersionService. The provider is not necessarily a 'app-version'\r\n * provider.\r\n */\r\nfunction isVersionServiceProvider(provider) {\r\n const component = provider.getComponent();\r\n return (component === null || component === void 0 ? void 0 : component.type) === \"VERSION\" /* ComponentType.VERSION */;\r\n}\n\nconst name$o = \"@firebase/app\";\nconst version$1 = \"0.9.1\";\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst logger = new Logger('@firebase/app');\n\nconst name$n = \"@firebase/app-compat\";\n\nconst name$m = \"@firebase/analytics-compat\";\n\nconst name$l = \"@firebase/analytics\";\n\nconst name$k = \"@firebase/app-check-compat\";\n\nconst name$j = \"@firebase/app-check\";\n\nconst name$i = \"@firebase/auth\";\n\nconst name$h = \"@firebase/auth-compat\";\n\nconst name$g = \"@firebase/database\";\n\nconst name$f = \"@firebase/database-compat\";\n\nconst name$e = \"@firebase/functions\";\n\nconst name$d = \"@firebase/functions-compat\";\n\nconst name$c = \"@firebase/installations\";\n\nconst name$b = \"@firebase/installations-compat\";\n\nconst name$a = \"@firebase/messaging\";\n\nconst name$9 = \"@firebase/messaging-compat\";\n\nconst name$8 = \"@firebase/performance\";\n\nconst name$7 = \"@firebase/performance-compat\";\n\nconst name$6 = \"@firebase/remote-config\";\n\nconst name$5 = \"@firebase/remote-config-compat\";\n\nconst name$4 = \"@firebase/storage\";\n\nconst name$3 = \"@firebase/storage-compat\";\n\nconst name$2 = \"@firebase/firestore\";\n\nconst name$1 = \"@firebase/firestore-compat\";\n\nconst name = \"firebase\";\nconst version = \"9.16.0\";\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * The default app name\r\n *\r\n * @internal\r\n */\r\nconst DEFAULT_ENTRY_NAME = '[DEFAULT]';\r\nconst PLATFORM_LOG_STRING = {\r\n [name$o]: 'fire-core',\r\n [name$n]: 'fire-core-compat',\r\n [name$l]: 'fire-analytics',\r\n [name$m]: 'fire-analytics-compat',\r\n [name$j]: 'fire-app-check',\r\n [name$k]: 'fire-app-check-compat',\r\n [name$i]: 'fire-auth',\r\n [name$h]: 'fire-auth-compat',\r\n [name$g]: 'fire-rtdb',\r\n [name$f]: 'fire-rtdb-compat',\r\n [name$e]: 'fire-fn',\r\n [name$d]: 'fire-fn-compat',\r\n [name$c]: 'fire-iid',\r\n [name$b]: 'fire-iid-compat',\r\n [name$a]: 'fire-fcm',\r\n [name$9]: 'fire-fcm-compat',\r\n [name$8]: 'fire-perf',\r\n [name$7]: 'fire-perf-compat',\r\n [name$6]: 'fire-rc',\r\n [name$5]: 'fire-rc-compat',\r\n [name$4]: 'fire-gcs',\r\n [name$3]: 'fire-gcs-compat',\r\n [name$2]: 'fire-fst',\r\n [name$1]: 'fire-fst-compat',\r\n 'fire-js': 'fire-js',\r\n [name]: 'fire-js-all'\r\n};\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * @internal\r\n */\r\nconst _apps = new Map();\r\n/**\r\n * Registered components.\r\n *\r\n * @internal\r\n */\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\nconst _components = new Map();\r\n/**\r\n * @param component - the component being added to this app's container\r\n *\r\n * @internal\r\n */\r\nfunction _addComponent(app, component) {\r\n try {\r\n app.container.addComponent(component);\r\n }\r\n catch (e) {\r\n logger.debug(`Component ${component.name} failed to register with FirebaseApp ${app.name}`, e);\r\n }\r\n}\r\n/**\r\n *\r\n * @internal\r\n */\r\nfunction _addOrOverwriteComponent(app, component) {\r\n app.container.addOrOverwriteComponent(component);\r\n}\r\n/**\r\n *\r\n * @param component - the component to register\r\n * @returns whether or not the component is registered successfully\r\n *\r\n * @internal\r\n */\r\nfunction _registerComponent(component) {\r\n const componentName = component.name;\r\n if (_components.has(componentName)) {\r\n logger.debug(`There were multiple attempts to register component ${componentName}.`);\r\n return false;\r\n }\r\n _components.set(componentName, component);\r\n // add the component to existing app instances\r\n for (const app of _apps.values()) {\r\n _addComponent(app, component);\r\n }\r\n return true;\r\n}\r\n/**\r\n *\r\n * @param app - FirebaseApp instance\r\n * @param name - service name\r\n *\r\n * @returns the provider for the service with the matching name\r\n *\r\n * @internal\r\n */\r\nfunction _getProvider(app, name) {\r\n const heartbeatController = app.container\r\n .getProvider('heartbeat')\r\n .getImmediate({ optional: true });\r\n if (heartbeatController) {\r\n void heartbeatController.triggerHeartbeat();\r\n }\r\n return app.container.getProvider(name);\r\n}\r\n/**\r\n *\r\n * @param app - FirebaseApp instance\r\n * @param name - service name\r\n * @param instanceIdentifier - service instance identifier in case the service supports multiple instances\r\n *\r\n * @internal\r\n */\r\nfunction _removeServiceInstance(app, name, instanceIdentifier = DEFAULT_ENTRY_NAME) {\r\n _getProvider(app, name).clearInstance(instanceIdentifier);\r\n}\r\n/**\r\n * Test only\r\n *\r\n * @internal\r\n */\r\nfunction _clearComponents() {\r\n _components.clear();\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst ERRORS = {\r\n [\"no-app\" /* AppError.NO_APP */]: \"No Firebase App '{$appName}' has been created - \" +\r\n 'call Firebase App.initializeApp()',\r\n [\"bad-app-name\" /* AppError.BAD_APP_NAME */]: \"Illegal App name: '{$appName}\",\r\n [\"duplicate-app\" /* AppError.DUPLICATE_APP */]: \"Firebase App named '{$appName}' already exists with different options or config\",\r\n [\"app-deleted\" /* AppError.APP_DELETED */]: \"Firebase App named '{$appName}' already deleted\",\r\n [\"no-options\" /* AppError.NO_OPTIONS */]: 'Need to provide options, when not being deployed to hosting via source.',\r\n [\"invalid-app-argument\" /* AppError.INVALID_APP_ARGUMENT */]: 'firebase.{$appName}() takes either no argument or a ' +\r\n 'Firebase App instance.',\r\n [\"invalid-log-argument\" /* AppError.INVALID_LOG_ARGUMENT */]: 'First argument to `onLog` must be null or a function.',\r\n [\"idb-open\" /* AppError.IDB_OPEN */]: 'Error thrown when opening IndexedDB. Original error: {$originalErrorMessage}.',\r\n [\"idb-get\" /* AppError.IDB_GET */]: 'Error thrown when reading from IndexedDB. Original error: {$originalErrorMessage}.',\r\n [\"idb-set\" /* AppError.IDB_WRITE */]: 'Error thrown when writing to IndexedDB. Original error: {$originalErrorMessage}.',\r\n [\"idb-delete\" /* AppError.IDB_DELETE */]: 'Error thrown when deleting from IndexedDB. Original error: {$originalErrorMessage}.'\r\n};\r\nconst ERROR_FACTORY = new ErrorFactory('app', 'Firebase', ERRORS);\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nclass FirebaseAppImpl {\r\n constructor(options, config, container) {\r\n this._isDeleted = false;\r\n this._options = Object.assign({}, options);\r\n this._config = Object.assign({}, config);\r\n this._name = config.name;\r\n this._automaticDataCollectionEnabled =\r\n config.automaticDataCollectionEnabled;\r\n this._container = container;\r\n this.container.addComponent(new Component('app', () => this, \"PUBLIC\" /* ComponentType.PUBLIC */));\r\n }\r\n get automaticDataCollectionEnabled() {\r\n this.checkDestroyed();\r\n return this._automaticDataCollectionEnabled;\r\n }\r\n set automaticDataCollectionEnabled(val) {\r\n this.checkDestroyed();\r\n this._automaticDataCollectionEnabled = val;\r\n }\r\n get name() {\r\n this.checkDestroyed();\r\n return this._name;\r\n }\r\n get options() {\r\n this.checkDestroyed();\r\n return this._options;\r\n }\r\n get config() {\r\n this.checkDestroyed();\r\n return this._config;\r\n }\r\n get container() {\r\n return this._container;\r\n }\r\n get isDeleted() {\r\n return this._isDeleted;\r\n }\r\n set isDeleted(val) {\r\n this._isDeleted = val;\r\n }\r\n /**\r\n * This function will throw an Error if the App has already been deleted -\r\n * use before performing API actions on the App.\r\n */\r\n checkDestroyed() {\r\n if (this.isDeleted) {\r\n throw ERROR_FACTORY.create(\"app-deleted\" /* AppError.APP_DELETED */, { appName: this._name });\r\n }\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * The current SDK version.\r\n *\r\n * @public\r\n */\r\nconst SDK_VERSION = version;\r\nfunction initializeApp(_options, rawConfig = {}) {\r\n let options = _options;\r\n if (typeof rawConfig !== 'object') {\r\n const name = rawConfig;\r\n rawConfig = { name };\r\n }\r\n const config = Object.assign({ name: DEFAULT_ENTRY_NAME, automaticDataCollectionEnabled: false }, rawConfig);\r\n const name = config.name;\r\n if (typeof name !== 'string' || !name) {\r\n throw ERROR_FACTORY.create(\"bad-app-name\" /* AppError.BAD_APP_NAME */, {\r\n appName: String(name)\r\n });\r\n }\r\n options || (options = getDefaultAppConfig());\r\n if (!options) {\r\n throw ERROR_FACTORY.create(\"no-options\" /* AppError.NO_OPTIONS */);\r\n }\r\n const existingApp = _apps.get(name);\r\n if (existingApp) {\r\n // return the existing app if options and config deep equal the ones in the existing app.\r\n if (deepEqual(options, existingApp.options) &&\r\n deepEqual(config, existingApp.config)) {\r\n return existingApp;\r\n }\r\n else {\r\n throw ERROR_FACTORY.create(\"duplicate-app\" /* AppError.DUPLICATE_APP */, { appName: name });\r\n }\r\n }\r\n const container = new ComponentContainer(name);\r\n for (const component of _components.values()) {\r\n container.addComponent(component);\r\n }\r\n const newApp = new FirebaseAppImpl(options, config, container);\r\n _apps.set(name, newApp);\r\n return newApp;\r\n}\r\n/**\r\n * Retrieves a {@link @firebase/app#FirebaseApp} instance.\r\n *\r\n * When called with no arguments, the default app is returned. When an app name\r\n * is provided, the app corresponding to that name is returned.\r\n *\r\n * An exception is thrown if the app being retrieved has not yet been\r\n * initialized.\r\n *\r\n * @example\r\n * ```javascript\r\n * // Return the default app\r\n * const app = getApp();\r\n * ```\r\n *\r\n * @example\r\n * ```javascript\r\n * // Return a named app\r\n * const otherApp = getApp(\"otherApp\");\r\n * ```\r\n *\r\n * @param name - Optional name of the app to return. If no name is\r\n * provided, the default is `\"[DEFAULT]\"`.\r\n *\r\n * @returns The app corresponding to the provided app name.\r\n * If no app name is provided, the default app is returned.\r\n *\r\n * @public\r\n */\r\nfunction getApp(name = DEFAULT_ENTRY_NAME) {\r\n const app = _apps.get(name);\r\n if (!app && name === DEFAULT_ENTRY_NAME) {\r\n return initializeApp();\r\n }\r\n if (!app) {\r\n throw ERROR_FACTORY.create(\"no-app\" /* AppError.NO_APP */, { appName: name });\r\n }\r\n return app;\r\n}\r\n/**\r\n * A (read-only) array of all initialized apps.\r\n * @public\r\n */\r\nfunction getApps() {\r\n return Array.from(_apps.values());\r\n}\r\n/**\r\n * Renders this app unusable and frees the resources of all associated\r\n * services.\r\n *\r\n * @example\r\n * ```javascript\r\n * deleteApp(app)\r\n * .then(function() {\r\n * console.log(\"App deleted successfully\");\r\n * })\r\n * .catch(function(error) {\r\n * console.log(\"Error deleting app:\", error);\r\n * });\r\n * ```\r\n *\r\n * @public\r\n */\r\nasync function deleteApp(app) {\r\n const name = app.name;\r\n if (_apps.has(name)) {\r\n _apps.delete(name);\r\n await Promise.all(app.container\r\n .getProviders()\r\n .map(provider => provider.delete()));\r\n app.isDeleted = true;\r\n }\r\n}\r\n/**\r\n * Registers a library's name and version for platform logging purposes.\r\n * @param library - Name of 1p or 3p library (e.g. firestore, angularfire)\r\n * @param version - Current version of that library.\r\n * @param variant - Bundle variant, e.g., node, rn, etc.\r\n *\r\n * @public\r\n */\r\nfunction registerVersion(libraryKeyOrName, version, variant) {\r\n var _a;\r\n // TODO: We can use this check to whitelist strings when/if we set up\r\n // a good whitelist system.\r\n let library = (_a = PLATFORM_LOG_STRING[libraryKeyOrName]) !== null && _a !== void 0 ? _a : libraryKeyOrName;\r\n if (variant) {\r\n library += `-${variant}`;\r\n }\r\n const libraryMismatch = library.match(/\\s|\\//);\r\n const versionMismatch = version.match(/\\s|\\//);\r\n if (libraryMismatch || versionMismatch) {\r\n const warning = [\r\n `Unable to register library \"${library}\" with version \"${version}\":`\r\n ];\r\n if (libraryMismatch) {\r\n warning.push(`library name \"${library}\" contains illegal characters (whitespace or \"/\")`);\r\n }\r\n if (libraryMismatch && versionMismatch) {\r\n warning.push('and');\r\n }\r\n if (versionMismatch) {\r\n warning.push(`version name \"${version}\" contains illegal characters (whitespace or \"/\")`);\r\n }\r\n logger.warn(warning.join(' '));\r\n return;\r\n }\r\n _registerComponent(new Component(`${library}-version`, () => ({ library, version }), \"VERSION\" /* ComponentType.VERSION */));\r\n}\r\n/**\r\n * Sets log handler for all Firebase SDKs.\r\n * @param logCallback - An optional custom log handler that executes user code whenever\r\n * the Firebase SDK makes a logging call.\r\n *\r\n * @public\r\n */\r\nfunction onLog(logCallback, options) {\r\n if (logCallback !== null && typeof logCallback !== 'function') {\r\n throw ERROR_FACTORY.create(\"invalid-log-argument\" /* AppError.INVALID_LOG_ARGUMENT */);\r\n }\r\n setUserLogHandler(logCallback, options);\r\n}\r\n/**\r\n * Sets log level for all Firebase SDKs.\r\n *\r\n * All of the log types above the current log level are captured (i.e. if\r\n * you set the log level to `info`, errors are logged, but `debug` and\r\n * `verbose` logs are not).\r\n *\r\n * @public\r\n */\r\nfunction setLogLevel(logLevel) {\r\n setLogLevel$1(logLevel);\r\n}\n\n/**\r\n * @license\r\n * Copyright 2021 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst DB_NAME = 'firebase-heartbeat-database';\r\nconst DB_VERSION = 1;\r\nconst STORE_NAME = 'firebase-heartbeat-store';\r\nlet dbPromise = null;\r\nfunction getDbPromise() {\r\n if (!dbPromise) {\r\n dbPromise = openDB(DB_NAME, DB_VERSION, {\r\n upgrade: (db, oldVersion) => {\r\n // We don't use 'break' in this switch statement, the fall-through\r\n // behavior is what we want, because if there are multiple versions between\r\n // the old version and the current version, we want ALL the migrations\r\n // that correspond to those versions to run, not only the last one.\r\n // eslint-disable-next-line default-case\r\n switch (oldVersion) {\r\n case 0:\r\n db.createObjectStore(STORE_NAME);\r\n }\r\n }\r\n }).catch(e => {\r\n throw ERROR_FACTORY.create(\"idb-open\" /* AppError.IDB_OPEN */, {\r\n originalErrorMessage: e.message\r\n });\r\n });\r\n }\r\n return dbPromise;\r\n}\r\nasync function readHeartbeatsFromIndexedDB(app) {\r\n try {\r\n const db = await getDbPromise();\r\n return db\r\n .transaction(STORE_NAME)\r\n .objectStore(STORE_NAME)\r\n .get(computeKey(app));\r\n }\r\n catch (e) {\r\n if (e instanceof FirebaseError) {\r\n logger.warn(e.message);\r\n }\r\n else {\r\n const idbGetError = ERROR_FACTORY.create(\"idb-get\" /* AppError.IDB_GET */, {\r\n originalErrorMessage: e === null || e === void 0 ? void 0 : e.message\r\n });\r\n logger.warn(idbGetError.message);\r\n }\r\n }\r\n}\r\nasync function writeHeartbeatsToIndexedDB(app, heartbeatObject) {\r\n try {\r\n const db = await getDbPromise();\r\n const tx = db.transaction(STORE_NAME, 'readwrite');\r\n const objectStore = tx.objectStore(STORE_NAME);\r\n await objectStore.put(heartbeatObject, computeKey(app));\r\n return tx.done;\r\n }\r\n catch (e) {\r\n if (e instanceof FirebaseError) {\r\n logger.warn(e.message);\r\n }\r\n else {\r\n const idbGetError = ERROR_FACTORY.create(\"idb-set\" /* AppError.IDB_WRITE */, {\r\n originalErrorMessage: e === null || e === void 0 ? void 0 : e.message\r\n });\r\n logger.warn(idbGetError.message);\r\n }\r\n }\r\n}\r\nfunction computeKey(app) {\r\n return `${app.name}!${app.options.appId}`;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2021 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst MAX_HEADER_BYTES = 1024;\r\n// 30 days\r\nconst STORED_HEARTBEAT_RETENTION_MAX_MILLIS = 30 * 24 * 60 * 60 * 1000;\r\nclass HeartbeatServiceImpl {\r\n constructor(container) {\r\n this.container = container;\r\n /**\r\n * In-memory cache for heartbeats, used by getHeartbeatsHeader() to generate\r\n * the header string.\r\n * Stores one record per date. This will be consolidated into the standard\r\n * format of one record per user agent string before being sent as a header.\r\n * Populated from indexedDB when the controller is instantiated and should\r\n * be kept in sync with indexedDB.\r\n * Leave public for easier testing.\r\n */\r\n this._heartbeatsCache = null;\r\n const app = this.container.getProvider('app').getImmediate();\r\n this._storage = new HeartbeatStorageImpl(app);\r\n this._heartbeatsCachePromise = this._storage.read().then(result => {\r\n this._heartbeatsCache = result;\r\n return result;\r\n });\r\n }\r\n /**\r\n * Called to report a heartbeat. The function will generate\r\n * a HeartbeatsByUserAgent object, update heartbeatsCache, and persist it\r\n * to IndexedDB.\r\n * Note that we only store one heartbeat per day. So if a heartbeat for today is\r\n * already logged, subsequent calls to this function in the same day will be ignored.\r\n */\r\n async triggerHeartbeat() {\r\n const platformLogger = this.container\r\n .getProvider('platform-logger')\r\n .getImmediate();\r\n // This is the \"Firebase user agent\" string from the platform logger\r\n // service, not the browser user agent.\r\n const agent = platformLogger.getPlatformInfoString();\r\n const date = getUTCDateString();\r\n if (this._heartbeatsCache === null) {\r\n this._heartbeatsCache = await this._heartbeatsCachePromise;\r\n }\r\n // Do not store a heartbeat if one is already stored for this day\r\n // or if a header has already been sent today.\r\n if (this._heartbeatsCache.lastSentHeartbeatDate === date ||\r\n this._heartbeatsCache.heartbeats.some(singleDateHeartbeat => singleDateHeartbeat.date === date)) {\r\n return;\r\n }\r\n else {\r\n // There is no entry for this date. Create one.\r\n this._heartbeatsCache.heartbeats.push({ date, agent });\r\n }\r\n // Remove entries older than 30 days.\r\n this._heartbeatsCache.heartbeats = this._heartbeatsCache.heartbeats.filter(singleDateHeartbeat => {\r\n const hbTimestamp = new Date(singleDateHeartbeat.date).valueOf();\r\n const now = Date.now();\r\n return now - hbTimestamp <= STORED_HEARTBEAT_RETENTION_MAX_MILLIS;\r\n });\r\n return this._storage.overwrite(this._heartbeatsCache);\r\n }\r\n /**\r\n * Returns a base64 encoded string which can be attached to the heartbeat-specific header directly.\r\n * It also clears all heartbeats from memory as well as in IndexedDB.\r\n *\r\n * NOTE: Consuming product SDKs should not send the header if this method\r\n * returns an empty string.\r\n */\r\n async getHeartbeatsHeader() {\r\n if (this._heartbeatsCache === null) {\r\n await this._heartbeatsCachePromise;\r\n }\r\n // If it's still null or the array is empty, there is no data to send.\r\n if (this._heartbeatsCache === null ||\r\n this._heartbeatsCache.heartbeats.length === 0) {\r\n return '';\r\n }\r\n const date = getUTCDateString();\r\n // Extract as many heartbeats from the cache as will fit under the size limit.\r\n const { heartbeatsToSend, unsentEntries } = extractHeartbeatsForHeader(this._heartbeatsCache.heartbeats);\r\n const headerString = base64urlEncodeWithoutPadding(JSON.stringify({ version: 2, heartbeats: heartbeatsToSend }));\r\n // Store last sent date to prevent another being logged/sent for the same day.\r\n this._heartbeatsCache.lastSentHeartbeatDate = date;\r\n if (unsentEntries.length > 0) {\r\n // Store any unsent entries if they exist.\r\n this._heartbeatsCache.heartbeats = unsentEntries;\r\n // This seems more likely than emptying the array (below) to lead to some odd state\r\n // since the cache isn't empty and this will be called again on the next request,\r\n // and is probably safest if we await it.\r\n await this._storage.overwrite(this._heartbeatsCache);\r\n }\r\n else {\r\n this._heartbeatsCache.heartbeats = [];\r\n // Do not wait for this, to reduce latency.\r\n void this._storage.overwrite(this._heartbeatsCache);\r\n }\r\n return headerString;\r\n }\r\n}\r\nfunction getUTCDateString() {\r\n const today = new Date();\r\n // Returns date format 'YYYY-MM-DD'\r\n return today.toISOString().substring(0, 10);\r\n}\r\nfunction extractHeartbeatsForHeader(heartbeatsCache, maxSize = MAX_HEADER_BYTES) {\r\n // Heartbeats grouped by user agent in the standard format to be sent in\r\n // the header.\r\n const heartbeatsToSend = [];\r\n // Single date format heartbeats that are not sent.\r\n let unsentEntries = heartbeatsCache.slice();\r\n for (const singleDateHeartbeat of heartbeatsCache) {\r\n // Look for an existing entry with the same user agent.\r\n const heartbeatEntry = heartbeatsToSend.find(hb => hb.agent === singleDateHeartbeat.agent);\r\n if (!heartbeatEntry) {\r\n // If no entry for this user agent exists, create one.\r\n heartbeatsToSend.push({\r\n agent: singleDateHeartbeat.agent,\r\n dates: [singleDateHeartbeat.date]\r\n });\r\n if (countBytes(heartbeatsToSend) > maxSize) {\r\n // If the header would exceed max size, remove the added heartbeat\r\n // entry and stop adding to the header.\r\n heartbeatsToSend.pop();\r\n break;\r\n }\r\n }\r\n else {\r\n heartbeatEntry.dates.push(singleDateHeartbeat.date);\r\n // If the header would exceed max size, remove the added date\r\n // and stop adding to the header.\r\n if (countBytes(heartbeatsToSend) > maxSize) {\r\n heartbeatEntry.dates.pop();\r\n break;\r\n }\r\n }\r\n // Pop unsent entry from queue. (Skipped if adding the entry exceeded\r\n // quota and the loop breaks early.)\r\n unsentEntries = unsentEntries.slice(1);\r\n }\r\n return {\r\n heartbeatsToSend,\r\n unsentEntries\r\n };\r\n}\r\nclass HeartbeatStorageImpl {\r\n constructor(app) {\r\n this.app = app;\r\n this._canUseIndexedDBPromise = this.runIndexedDBEnvironmentCheck();\r\n }\r\n async runIndexedDBEnvironmentCheck() {\r\n if (!isIndexedDBAvailable()) {\r\n return false;\r\n }\r\n else {\r\n return validateIndexedDBOpenable()\r\n .then(() => true)\r\n .catch(() => false);\r\n }\r\n }\r\n /**\r\n * Read all heartbeats.\r\n */\r\n async read() {\r\n const canUseIndexedDB = await this._canUseIndexedDBPromise;\r\n if (!canUseIndexedDB) {\r\n return { heartbeats: [] };\r\n }\r\n else {\r\n const idbHeartbeatObject = await readHeartbeatsFromIndexedDB(this.app);\r\n return idbHeartbeatObject || { heartbeats: [] };\r\n }\r\n }\r\n // overwrite the storage with the provided heartbeats\r\n async overwrite(heartbeatsObject) {\r\n var _a;\r\n const canUseIndexedDB = await this._canUseIndexedDBPromise;\r\n if (!canUseIndexedDB) {\r\n return;\r\n }\r\n else {\r\n const existingHeartbeatsObject = await this.read();\r\n return writeHeartbeatsToIndexedDB(this.app, {\r\n lastSentHeartbeatDate: (_a = heartbeatsObject.lastSentHeartbeatDate) !== null && _a !== void 0 ? _a : existingHeartbeatsObject.lastSentHeartbeatDate,\r\n heartbeats: heartbeatsObject.heartbeats\r\n });\r\n }\r\n }\r\n // add heartbeats\r\n async add(heartbeatsObject) {\r\n var _a;\r\n const canUseIndexedDB = await this._canUseIndexedDBPromise;\r\n if (!canUseIndexedDB) {\r\n return;\r\n }\r\n else {\r\n const existingHeartbeatsObject = await this.read();\r\n return writeHeartbeatsToIndexedDB(this.app, {\r\n lastSentHeartbeatDate: (_a = heartbeatsObject.lastSentHeartbeatDate) !== null && _a !== void 0 ? _a : existingHeartbeatsObject.lastSentHeartbeatDate,\r\n heartbeats: [\r\n ...existingHeartbeatsObject.heartbeats,\r\n ...heartbeatsObject.heartbeats\r\n ]\r\n });\r\n }\r\n }\r\n}\r\n/**\r\n * Calculate bytes of a HeartbeatsByUserAgent array after being wrapped\r\n * in a platform logging header JSON object, stringified, and converted\r\n * to base 64.\r\n */\r\nfunction countBytes(heartbeatsCache) {\r\n // base64 has a restricted set of characters, all of which should be 1 byte.\r\n return base64urlEncodeWithoutPadding(\r\n // heartbeatsCache wrapper properties\r\n JSON.stringify({ version: 2, heartbeats: heartbeatsCache })).length;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction registerCoreComponents(variant) {\r\n _registerComponent(new Component('platform-logger', container => new PlatformLoggerServiceImpl(container), \"PRIVATE\" /* ComponentType.PRIVATE */));\r\n _registerComponent(new Component('heartbeat', container => new HeartbeatServiceImpl(container), \"PRIVATE\" /* ComponentType.PRIVATE */));\r\n // Register `app` package.\r\n registerVersion(name$o, version$1, variant);\r\n // BUILD_TARGET will be replaced by values like esm5, esm2017, cjs5, etc during the compilation\r\n registerVersion(name$o, version$1, 'esm2017');\r\n // Register platform SDK identifier (no version).\r\n registerVersion('fire-js', '');\r\n}\n\n/**\r\n * Firebase App\r\n *\r\n * @remarks This package coordinates the communication between the different Firebase components\r\n * @packageDocumentation\r\n */\r\nregisterCoreComponents('');\n\nexport { SDK_VERSION, DEFAULT_ENTRY_NAME as _DEFAULT_ENTRY_NAME, _addComponent, _addOrOverwriteComponent, _apps, _clearComponents, _components, _getProvider, _registerComponent, _removeServiceInstance, deleteApp, getApp, getApps, initializeApp, onLog, registerVersion, setLogLevel };\n//# sourceMappingURL=index.esm2017.js.map\n","import { Deferred } from '@firebase/util';\n\n/**\r\n * Component for service name T, e.g. `auth`, `auth-internal`\r\n */\r\nclass Component {\r\n /**\r\n *\r\n * @param name The public service name, e.g. app, auth, firestore, database\r\n * @param instanceFactory Service factory responsible for creating the public interface\r\n * @param type whether the service provided by the component is public or private\r\n */\r\n constructor(name, instanceFactory, type) {\r\n this.name = name;\r\n this.instanceFactory = instanceFactory;\r\n this.type = type;\r\n this.multipleInstances = false;\r\n /**\r\n * Properties to be added to the service namespace\r\n */\r\n this.serviceProps = {};\r\n this.instantiationMode = \"LAZY\" /* InstantiationMode.LAZY */;\r\n this.onInstanceCreated = null;\r\n }\r\n setInstantiationMode(mode) {\r\n this.instantiationMode = mode;\r\n return this;\r\n }\r\n setMultipleInstances(multipleInstances) {\r\n this.multipleInstances = multipleInstances;\r\n return this;\r\n }\r\n setServiceProps(props) {\r\n this.serviceProps = props;\r\n return this;\r\n }\r\n setInstanceCreatedCallback(callback) {\r\n this.onInstanceCreated = callback;\r\n return this;\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst DEFAULT_ENTRY_NAME = '[DEFAULT]';\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Provider for instance for service name T, e.g. 'auth', 'auth-internal'\r\n * NameServiceMapping[T] is an alias for the type of the instance\r\n */\r\nclass Provider {\r\n constructor(name, container) {\r\n this.name = name;\r\n this.container = container;\r\n this.component = null;\r\n this.instances = new Map();\r\n this.instancesDeferred = new Map();\r\n this.instancesOptions = new Map();\r\n this.onInitCallbacks = new Map();\r\n }\r\n /**\r\n * @param identifier A provider can provide mulitple instances of a service\r\n * if this.component.multipleInstances is true.\r\n */\r\n get(identifier) {\r\n // if multipleInstances is not supported, use the default name\r\n const normalizedIdentifier = this.normalizeInstanceIdentifier(identifier);\r\n if (!this.instancesDeferred.has(normalizedIdentifier)) {\r\n const deferred = new Deferred();\r\n this.instancesDeferred.set(normalizedIdentifier, deferred);\r\n if (this.isInitialized(normalizedIdentifier) ||\r\n this.shouldAutoInitialize()) {\r\n // initialize the service if it can be auto-initialized\r\n try {\r\n const instance = this.getOrInitializeService({\r\n instanceIdentifier: normalizedIdentifier\r\n });\r\n if (instance) {\r\n deferred.resolve(instance);\r\n }\r\n }\r\n catch (e) {\r\n // when the instance factory throws an exception during get(), it should not cause\r\n // a fatal error. We just return the unresolved promise in this case.\r\n }\r\n }\r\n }\r\n return this.instancesDeferred.get(normalizedIdentifier).promise;\r\n }\r\n getImmediate(options) {\r\n var _a;\r\n // if multipleInstances is not supported, use the default name\r\n const normalizedIdentifier = this.normalizeInstanceIdentifier(options === null || options === void 0 ? void 0 : options.identifier);\r\n const optional = (_a = options === null || options === void 0 ? void 0 : options.optional) !== null && _a !== void 0 ? _a : false;\r\n if (this.isInitialized(normalizedIdentifier) ||\r\n this.shouldAutoInitialize()) {\r\n try {\r\n return this.getOrInitializeService({\r\n instanceIdentifier: normalizedIdentifier\r\n });\r\n }\r\n catch (e) {\r\n if (optional) {\r\n return null;\r\n }\r\n else {\r\n throw e;\r\n }\r\n }\r\n }\r\n else {\r\n // In case a component is not initialized and should/can not be auto-initialized at the moment, return null if the optional flag is set, or throw\r\n if (optional) {\r\n return null;\r\n }\r\n else {\r\n throw Error(`Service ${this.name} is not available`);\r\n }\r\n }\r\n }\r\n getComponent() {\r\n return this.component;\r\n }\r\n setComponent(component) {\r\n if (component.name !== this.name) {\r\n throw Error(`Mismatching Component ${component.name} for Provider ${this.name}.`);\r\n }\r\n if (this.component) {\r\n throw Error(`Component for ${this.name} has already been provided`);\r\n }\r\n this.component = component;\r\n // return early without attempting to initialize the component if the component requires explicit initialization (calling `Provider.initialize()`)\r\n if (!this.shouldAutoInitialize()) {\r\n return;\r\n }\r\n // if the service is eager, initialize the default instance\r\n if (isComponentEager(component)) {\r\n try {\r\n this.getOrInitializeService({ instanceIdentifier: DEFAULT_ENTRY_NAME });\r\n }\r\n catch (e) {\r\n // when the instance factory for an eager Component throws an exception during the eager\r\n // initialization, it should not cause a fatal error.\r\n // TODO: Investigate if we need to make it configurable, because some component may want to cause\r\n // a fatal error in this case?\r\n }\r\n }\r\n // Create service instances for the pending promises and resolve them\r\n // NOTE: if this.multipleInstances is false, only the default instance will be created\r\n // and all promises with resolve with it regardless of the identifier.\r\n for (const [instanceIdentifier, instanceDeferred] of this.instancesDeferred.entries()) {\r\n const normalizedIdentifier = this.normalizeInstanceIdentifier(instanceIdentifier);\r\n try {\r\n // `getOrInitializeService()` should always return a valid instance since a component is guaranteed. use ! to make typescript happy.\r\n const instance = this.getOrInitializeService({\r\n instanceIdentifier: normalizedIdentifier\r\n });\r\n instanceDeferred.resolve(instance);\r\n }\r\n catch (e) {\r\n // when the instance factory throws an exception, it should not cause\r\n // a fatal error. We just leave the promise unresolved.\r\n }\r\n }\r\n }\r\n clearInstance(identifier = DEFAULT_ENTRY_NAME) {\r\n this.instancesDeferred.delete(identifier);\r\n this.instancesOptions.delete(identifier);\r\n this.instances.delete(identifier);\r\n }\r\n // app.delete() will call this method on every provider to delete the services\r\n // TODO: should we mark the provider as deleted?\r\n async delete() {\r\n const services = Array.from(this.instances.values());\r\n await Promise.all([\r\n ...services\r\n .filter(service => 'INTERNAL' in service) // legacy services\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n .map(service => service.INTERNAL.delete()),\r\n ...services\r\n .filter(service => '_delete' in service) // modularized services\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n .map(service => service._delete())\r\n ]);\r\n }\r\n isComponentSet() {\r\n return this.component != null;\r\n }\r\n isInitialized(identifier = DEFAULT_ENTRY_NAME) {\r\n return this.instances.has(identifier);\r\n }\r\n getOptions(identifier = DEFAULT_ENTRY_NAME) {\r\n return this.instancesOptions.get(identifier) || {};\r\n }\r\n initialize(opts = {}) {\r\n const { options = {} } = opts;\r\n const normalizedIdentifier = this.normalizeInstanceIdentifier(opts.instanceIdentifier);\r\n if (this.isInitialized(normalizedIdentifier)) {\r\n throw Error(`${this.name}(${normalizedIdentifier}) has already been initialized`);\r\n }\r\n if (!this.isComponentSet()) {\r\n throw Error(`Component ${this.name} has not been registered yet`);\r\n }\r\n const instance = this.getOrInitializeService({\r\n instanceIdentifier: normalizedIdentifier,\r\n options\r\n });\r\n // resolve any pending promise waiting for the service instance\r\n for (const [instanceIdentifier, instanceDeferred] of this.instancesDeferred.entries()) {\r\n const normalizedDeferredIdentifier = this.normalizeInstanceIdentifier(instanceIdentifier);\r\n if (normalizedIdentifier === normalizedDeferredIdentifier) {\r\n instanceDeferred.resolve(instance);\r\n }\r\n }\r\n return instance;\r\n }\r\n /**\r\n *\r\n * @param callback - a function that will be invoked after the provider has been initialized by calling provider.initialize().\r\n * The function is invoked SYNCHRONOUSLY, so it should not execute any longrunning tasks in order to not block the program.\r\n *\r\n * @param identifier An optional instance identifier\r\n * @returns a function to unregister the callback\r\n */\r\n onInit(callback, identifier) {\r\n var _a;\r\n const normalizedIdentifier = this.normalizeInstanceIdentifier(identifier);\r\n const existingCallbacks = (_a = this.onInitCallbacks.get(normalizedIdentifier)) !== null && _a !== void 0 ? _a : new Set();\r\n existingCallbacks.add(callback);\r\n this.onInitCallbacks.set(normalizedIdentifier, existingCallbacks);\r\n const existingInstance = this.instances.get(normalizedIdentifier);\r\n if (existingInstance) {\r\n callback(existingInstance, normalizedIdentifier);\r\n }\r\n return () => {\r\n existingCallbacks.delete(callback);\r\n };\r\n }\r\n /**\r\n * Invoke onInit callbacks synchronously\r\n * @param instance the service instance`\r\n */\r\n invokeOnInitCallbacks(instance, identifier) {\r\n const callbacks = this.onInitCallbacks.get(identifier);\r\n if (!callbacks) {\r\n return;\r\n }\r\n for (const callback of callbacks) {\r\n try {\r\n callback(instance, identifier);\r\n }\r\n catch (_a) {\r\n // ignore errors in the onInit callback\r\n }\r\n }\r\n }\r\n getOrInitializeService({ instanceIdentifier, options = {} }) {\r\n let instance = this.instances.get(instanceIdentifier);\r\n if (!instance && this.component) {\r\n instance = this.component.instanceFactory(this.container, {\r\n instanceIdentifier: normalizeIdentifierForFactory(instanceIdentifier),\r\n options\r\n });\r\n this.instances.set(instanceIdentifier, instance);\r\n this.instancesOptions.set(instanceIdentifier, options);\r\n /**\r\n * Invoke onInit listeners.\r\n * Note this.component.onInstanceCreated is different, which is used by the component creator,\r\n * while onInit listeners are registered by consumers of the provider.\r\n */\r\n this.invokeOnInitCallbacks(instance, instanceIdentifier);\r\n /**\r\n * Order is important\r\n * onInstanceCreated() should be called after this.instances.set(instanceIdentifier, instance); which\r\n * makes `isInitialized()` return true.\r\n */\r\n if (this.component.onInstanceCreated) {\r\n try {\r\n this.component.onInstanceCreated(this.container, instanceIdentifier, instance);\r\n }\r\n catch (_a) {\r\n // ignore errors in the onInstanceCreatedCallback\r\n }\r\n }\r\n }\r\n return instance || null;\r\n }\r\n normalizeInstanceIdentifier(identifier = DEFAULT_ENTRY_NAME) {\r\n if (this.component) {\r\n return this.component.multipleInstances ? identifier : DEFAULT_ENTRY_NAME;\r\n }\r\n else {\r\n return identifier; // assume multiple instances are supported before the component is provided.\r\n }\r\n }\r\n shouldAutoInitialize() {\r\n return (!!this.component &&\r\n this.component.instantiationMode !== \"EXPLICIT\" /* InstantiationMode.EXPLICIT */);\r\n }\r\n}\r\n// undefined should be passed to the service factory for the default instance\r\nfunction normalizeIdentifierForFactory(identifier) {\r\n return identifier === DEFAULT_ENTRY_NAME ? undefined : identifier;\r\n}\r\nfunction isComponentEager(component) {\r\n return component.instantiationMode === \"EAGER\" /* InstantiationMode.EAGER */;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * ComponentContainer that provides Providers for service name T, e.g. `auth`, `auth-internal`\r\n */\r\nclass ComponentContainer {\r\n constructor(name) {\r\n this.name = name;\r\n this.providers = new Map();\r\n }\r\n /**\r\n *\r\n * @param component Component being added\r\n * @param overwrite When a component with the same name has already been registered,\r\n * if overwrite is true: overwrite the existing component with the new component and create a new\r\n * provider with the new component. It can be useful in tests where you want to use different mocks\r\n * for different tests.\r\n * if overwrite is false: throw an exception\r\n */\r\n addComponent(component) {\r\n const provider = this.getProvider(component.name);\r\n if (provider.isComponentSet()) {\r\n throw new Error(`Component ${component.name} has already been registered with ${this.name}`);\r\n }\r\n provider.setComponent(component);\r\n }\r\n addOrOverwriteComponent(component) {\r\n const provider = this.getProvider(component.name);\r\n if (provider.isComponentSet()) {\r\n // delete the existing provider from the container, so we can register the new component\r\n this.providers.delete(component.name);\r\n }\r\n this.addComponent(component);\r\n }\r\n /**\r\n * getProvider provides a type safe interface where it can only be called with a field name\r\n * present in NameServiceMapping interface.\r\n *\r\n * Firebase SDKs providing services should extend NameServiceMapping interface to register\r\n * themselves.\r\n */\r\n getProvider(name) {\r\n if (this.providers.has(name)) {\r\n return this.providers.get(name);\r\n }\r\n // create a Provider for a service that hasn't registered with Firebase\r\n const provider = new Provider(name, this);\r\n this.providers.set(name, provider);\r\n return provider;\r\n }\r\n getProviders() {\r\n return Array.from(this.providers.values());\r\n }\r\n}\n\nexport { Component, ComponentContainer, Provider };\n//# sourceMappingURL=index.esm2017.js.map\n","import { _getProvider, getApp, _registerComponent, registerVersion } from '@firebase/app';\nimport { Component } from '@firebase/component';\nimport { ErrorFactory, FirebaseError } from '@firebase/util';\nimport { openDB } from 'idb';\n\nconst name = \"@firebase/installations\";\nconst version = \"0.6.1\";\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst PENDING_TIMEOUT_MS = 10000;\r\nconst PACKAGE_VERSION = `w:${version}`;\r\nconst INTERNAL_AUTH_VERSION = 'FIS_v2';\r\nconst INSTALLATIONS_API_URL = 'https://firebaseinstallations.googleapis.com/v1';\r\nconst TOKEN_EXPIRATION_BUFFER = 60 * 60 * 1000; // One hour\r\nconst SERVICE = 'installations';\r\nconst SERVICE_NAME = 'Installations';\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst ERROR_DESCRIPTION_MAP = {\r\n [\"missing-app-config-values\" /* ErrorCode.MISSING_APP_CONFIG_VALUES */]: 'Missing App configuration value: \"{$valueName}\"',\r\n [\"not-registered\" /* ErrorCode.NOT_REGISTERED */]: 'Firebase Installation is not registered.',\r\n [\"installation-not-found\" /* ErrorCode.INSTALLATION_NOT_FOUND */]: 'Firebase Installation not found.',\r\n [\"request-failed\" /* ErrorCode.REQUEST_FAILED */]: '{$requestName} request failed with error \"{$serverCode} {$serverStatus}: {$serverMessage}\"',\r\n [\"app-offline\" /* ErrorCode.APP_OFFLINE */]: 'Could not process request. Application offline.',\r\n [\"delete-pending-registration\" /* ErrorCode.DELETE_PENDING_REGISTRATION */]: \"Can't delete installation while there is a pending registration request.\"\r\n};\r\nconst ERROR_FACTORY = new ErrorFactory(SERVICE, SERVICE_NAME, ERROR_DESCRIPTION_MAP);\r\n/** Returns true if error is a FirebaseError that is based on an error from the server. */\r\nfunction isServerError(error) {\r\n return (error instanceof FirebaseError &&\r\n error.code.includes(\"request-failed\" /* ErrorCode.REQUEST_FAILED */));\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction getInstallationsEndpoint({ projectId }) {\r\n return `${INSTALLATIONS_API_URL}/projects/${projectId}/installations`;\r\n}\r\nfunction extractAuthTokenInfoFromResponse(response) {\r\n return {\r\n token: response.token,\r\n requestStatus: 2 /* RequestStatus.COMPLETED */,\r\n expiresIn: getExpiresInFromResponseExpiresIn(response.expiresIn),\r\n creationTime: Date.now()\r\n };\r\n}\r\nasync function getErrorFromResponse(requestName, response) {\r\n const responseJson = await response.json();\r\n const errorData = responseJson.error;\r\n return ERROR_FACTORY.create(\"request-failed\" /* ErrorCode.REQUEST_FAILED */, {\r\n requestName,\r\n serverCode: errorData.code,\r\n serverMessage: errorData.message,\r\n serverStatus: errorData.status\r\n });\r\n}\r\nfunction getHeaders({ apiKey }) {\r\n return new Headers({\r\n 'Content-Type': 'application/json',\r\n Accept: 'application/json',\r\n 'x-goog-api-key': apiKey\r\n });\r\n}\r\nfunction getHeadersWithAuth(appConfig, { refreshToken }) {\r\n const headers = getHeaders(appConfig);\r\n headers.append('Authorization', getAuthorizationHeader(refreshToken));\r\n return headers;\r\n}\r\n/**\r\n * Calls the passed in fetch wrapper and returns the response.\r\n * If the returned response has a status of 5xx, re-runs the function once and\r\n * returns the response.\r\n */\r\nasync function retryIfServerError(fn) {\r\n const result = await fn();\r\n if (result.status >= 500 && result.status < 600) {\r\n // Internal Server Error. Retry request.\r\n return fn();\r\n }\r\n return result;\r\n}\r\nfunction getExpiresInFromResponseExpiresIn(responseExpiresIn) {\r\n // This works because the server will never respond with fractions of a second.\r\n return Number(responseExpiresIn.replace('s', '000'));\r\n}\r\nfunction getAuthorizationHeader(refreshToken) {\r\n return `${INTERNAL_AUTH_VERSION} ${refreshToken}`;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nasync function createInstallationRequest({ appConfig, heartbeatServiceProvider }, { fid }) {\r\n const endpoint = getInstallationsEndpoint(appConfig);\r\n const headers = getHeaders(appConfig);\r\n // If heartbeat service exists, add the heartbeat string to the header.\r\n const heartbeatService = heartbeatServiceProvider.getImmediate({\r\n optional: true\r\n });\r\n if (heartbeatService) {\r\n const heartbeatsHeader = await heartbeatService.getHeartbeatsHeader();\r\n if (heartbeatsHeader) {\r\n headers.append('x-firebase-client', heartbeatsHeader);\r\n }\r\n }\r\n const body = {\r\n fid,\r\n authVersion: INTERNAL_AUTH_VERSION,\r\n appId: appConfig.appId,\r\n sdkVersion: PACKAGE_VERSION\r\n };\r\n const request = {\r\n method: 'POST',\r\n headers,\r\n body: JSON.stringify(body)\r\n };\r\n const response = await retryIfServerError(() => fetch(endpoint, request));\r\n if (response.ok) {\r\n const responseValue = await response.json();\r\n const registeredInstallationEntry = {\r\n fid: responseValue.fid || fid,\r\n registrationStatus: 2 /* RequestStatus.COMPLETED */,\r\n refreshToken: responseValue.refreshToken,\r\n authToken: extractAuthTokenInfoFromResponse(responseValue.authToken)\r\n };\r\n return registeredInstallationEntry;\r\n }\r\n else {\r\n throw await getErrorFromResponse('Create Installation', response);\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/** Returns a promise that resolves after given time passes. */\r\nfunction sleep(ms) {\r\n return new Promise(resolve => {\r\n setTimeout(resolve, ms);\r\n });\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction bufferToBase64UrlSafe(array) {\r\n const b64 = btoa(String.fromCharCode(...array));\r\n return b64.replace(/\\+/g, '-').replace(/\\//g, '_');\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst VALID_FID_PATTERN = /^[cdef][\\w-]{21}$/;\r\nconst INVALID_FID = '';\r\n/**\r\n * Generates a new FID using random values from Web Crypto API.\r\n * Returns an empty string if FID generation fails for any reason.\r\n */\r\nfunction generateFid() {\r\n try {\r\n // A valid FID has exactly 22 base64 characters, which is 132 bits, or 16.5\r\n // bytes. our implementation generates a 17 byte array instead.\r\n const fidByteArray = new Uint8Array(17);\r\n const crypto = self.crypto || self.msCrypto;\r\n crypto.getRandomValues(fidByteArray);\r\n // Replace the first 4 random bits with the constant FID header of 0b0111.\r\n fidByteArray[0] = 0b01110000 + (fidByteArray[0] % 0b00010000);\r\n const fid = encode(fidByteArray);\r\n return VALID_FID_PATTERN.test(fid) ? fid : INVALID_FID;\r\n }\r\n catch (_a) {\r\n // FID generation errored\r\n return INVALID_FID;\r\n }\r\n}\r\n/** Converts a FID Uint8Array to a base64 string representation. */\r\nfunction encode(fidByteArray) {\r\n const b64String = bufferToBase64UrlSafe(fidByteArray);\r\n // Remove the 23rd character that was added because of the extra 4 bits at the\r\n // end of our 17 byte array, and the '=' padding.\r\n return b64String.substr(0, 22);\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/** Returns a string key that can be used to identify the app. */\r\nfunction getKey(appConfig) {\r\n return `${appConfig.appName}!${appConfig.appId}`;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst fidChangeCallbacks = new Map();\r\n/**\r\n * Calls the onIdChange callbacks with the new FID value, and broadcasts the\r\n * change to other tabs.\r\n */\r\nfunction fidChanged(appConfig, fid) {\r\n const key = getKey(appConfig);\r\n callFidChangeCallbacks(key, fid);\r\n broadcastFidChange(key, fid);\r\n}\r\nfunction addCallback(appConfig, callback) {\r\n // Open the broadcast channel if it's not already open,\r\n // to be able to listen to change events from other tabs.\r\n getBroadcastChannel();\r\n const key = getKey(appConfig);\r\n let callbackSet = fidChangeCallbacks.get(key);\r\n if (!callbackSet) {\r\n callbackSet = new Set();\r\n fidChangeCallbacks.set(key, callbackSet);\r\n }\r\n callbackSet.add(callback);\r\n}\r\nfunction removeCallback(appConfig, callback) {\r\n const key = getKey(appConfig);\r\n const callbackSet = fidChangeCallbacks.get(key);\r\n if (!callbackSet) {\r\n return;\r\n }\r\n callbackSet.delete(callback);\r\n if (callbackSet.size === 0) {\r\n fidChangeCallbacks.delete(key);\r\n }\r\n // Close broadcast channel if there are no more callbacks.\r\n closeBroadcastChannel();\r\n}\r\nfunction callFidChangeCallbacks(key, fid) {\r\n const callbacks = fidChangeCallbacks.get(key);\r\n if (!callbacks) {\r\n return;\r\n }\r\n for (const callback of callbacks) {\r\n callback(fid);\r\n }\r\n}\r\nfunction broadcastFidChange(key, fid) {\r\n const channel = getBroadcastChannel();\r\n if (channel) {\r\n channel.postMessage({ key, fid });\r\n }\r\n closeBroadcastChannel();\r\n}\r\nlet broadcastChannel = null;\r\n/** Opens and returns a BroadcastChannel if it is supported by the browser. */\r\nfunction getBroadcastChannel() {\r\n if (!broadcastChannel && 'BroadcastChannel' in self) {\r\n broadcastChannel = new BroadcastChannel('[Firebase] FID Change');\r\n broadcastChannel.onmessage = e => {\r\n callFidChangeCallbacks(e.data.key, e.data.fid);\r\n };\r\n }\r\n return broadcastChannel;\r\n}\r\nfunction closeBroadcastChannel() {\r\n if (fidChangeCallbacks.size === 0 && broadcastChannel) {\r\n broadcastChannel.close();\r\n broadcastChannel = null;\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst DATABASE_NAME = 'firebase-installations-database';\r\nconst DATABASE_VERSION = 1;\r\nconst OBJECT_STORE_NAME = 'firebase-installations-store';\r\nlet dbPromise = null;\r\nfunction getDbPromise() {\r\n if (!dbPromise) {\r\n dbPromise = openDB(DATABASE_NAME, DATABASE_VERSION, {\r\n upgrade: (db, oldVersion) => {\r\n // We don't use 'break' in this switch statement, the fall-through\r\n // behavior is what we want, because if there are multiple versions between\r\n // the old version and the current version, we want ALL the migrations\r\n // that correspond to those versions to run, not only the last one.\r\n // eslint-disable-next-line default-case\r\n switch (oldVersion) {\r\n case 0:\r\n db.createObjectStore(OBJECT_STORE_NAME);\r\n }\r\n }\r\n });\r\n }\r\n return dbPromise;\r\n}\r\n/** Assigns or overwrites the record for the given key with the given value. */\r\nasync function set(appConfig, value) {\r\n const key = getKey(appConfig);\r\n const db = await getDbPromise();\r\n const tx = db.transaction(OBJECT_STORE_NAME, 'readwrite');\r\n const objectStore = tx.objectStore(OBJECT_STORE_NAME);\r\n const oldValue = (await objectStore.get(key));\r\n await objectStore.put(value, key);\r\n await tx.done;\r\n if (!oldValue || oldValue.fid !== value.fid) {\r\n fidChanged(appConfig, value.fid);\r\n }\r\n return value;\r\n}\r\n/** Removes record(s) from the objectStore that match the given key. */\r\nasync function remove(appConfig) {\r\n const key = getKey(appConfig);\r\n const db = await getDbPromise();\r\n const tx = db.transaction(OBJECT_STORE_NAME, 'readwrite');\r\n await tx.objectStore(OBJECT_STORE_NAME).delete(key);\r\n await tx.done;\r\n}\r\n/**\r\n * Atomically updates a record with the result of updateFn, which gets\r\n * called with the current value. If newValue is undefined, the record is\r\n * deleted instead.\r\n * @return Updated value\r\n */\r\nasync function update(appConfig, updateFn) {\r\n const key = getKey(appConfig);\r\n const db = await getDbPromise();\r\n const tx = db.transaction(OBJECT_STORE_NAME, 'readwrite');\r\n const store = tx.objectStore(OBJECT_STORE_NAME);\r\n const oldValue = (await store.get(key));\r\n const newValue = updateFn(oldValue);\r\n if (newValue === undefined) {\r\n await store.delete(key);\r\n }\r\n else {\r\n await store.put(newValue, key);\r\n }\r\n await tx.done;\r\n if (newValue && (!oldValue || oldValue.fid !== newValue.fid)) {\r\n fidChanged(appConfig, newValue.fid);\r\n }\r\n return newValue;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Updates and returns the InstallationEntry from the database.\r\n * Also triggers a registration request if it is necessary and possible.\r\n */\r\nasync function getInstallationEntry(installations) {\r\n let registrationPromise;\r\n const installationEntry = await update(installations.appConfig, oldEntry => {\r\n const installationEntry = updateOrCreateInstallationEntry(oldEntry);\r\n const entryWithPromise = triggerRegistrationIfNecessary(installations, installationEntry);\r\n registrationPromise = entryWithPromise.registrationPromise;\r\n return entryWithPromise.installationEntry;\r\n });\r\n if (installationEntry.fid === INVALID_FID) {\r\n // FID generation failed. Waiting for the FID from the server.\r\n return { installationEntry: await registrationPromise };\r\n }\r\n return {\r\n installationEntry,\r\n registrationPromise\r\n };\r\n}\r\n/**\r\n * Creates a new Installation Entry if one does not exist.\r\n * Also clears timed out pending requests.\r\n */\r\nfunction updateOrCreateInstallationEntry(oldEntry) {\r\n const entry = oldEntry || {\r\n fid: generateFid(),\r\n registrationStatus: 0 /* RequestStatus.NOT_STARTED */\r\n };\r\n return clearTimedOutRequest(entry);\r\n}\r\n/**\r\n * If the Firebase Installation is not registered yet, this will trigger the\r\n * registration and return an InProgressInstallationEntry.\r\n *\r\n * If registrationPromise does not exist, the installationEntry is guaranteed\r\n * to be registered.\r\n */\r\nfunction triggerRegistrationIfNecessary(installations, installationEntry) {\r\n if (installationEntry.registrationStatus === 0 /* RequestStatus.NOT_STARTED */) {\r\n if (!navigator.onLine) {\r\n // Registration required but app is offline.\r\n const registrationPromiseWithError = Promise.reject(ERROR_FACTORY.create(\"app-offline\" /* ErrorCode.APP_OFFLINE */));\r\n return {\r\n installationEntry,\r\n registrationPromise: registrationPromiseWithError\r\n };\r\n }\r\n // Try registering. Change status to IN_PROGRESS.\r\n const inProgressEntry = {\r\n fid: installationEntry.fid,\r\n registrationStatus: 1 /* RequestStatus.IN_PROGRESS */,\r\n registrationTime: Date.now()\r\n };\r\n const registrationPromise = registerInstallation(installations, inProgressEntry);\r\n return { installationEntry: inProgressEntry, registrationPromise };\r\n }\r\n else if (installationEntry.registrationStatus === 1 /* RequestStatus.IN_PROGRESS */) {\r\n return {\r\n installationEntry,\r\n registrationPromise: waitUntilFidRegistration(installations)\r\n };\r\n }\r\n else {\r\n return { installationEntry };\r\n }\r\n}\r\n/** This will be executed only once for each new Firebase Installation. */\r\nasync function registerInstallation(installations, installationEntry) {\r\n try {\r\n const registeredInstallationEntry = await createInstallationRequest(installations, installationEntry);\r\n return set(installations.appConfig, registeredInstallationEntry);\r\n }\r\n catch (e) {\r\n if (isServerError(e) && e.customData.serverCode === 409) {\r\n // Server returned a \"FID can not be used\" error.\r\n // Generate a new ID next time.\r\n await remove(installations.appConfig);\r\n }\r\n else {\r\n // Registration failed. Set FID as not registered.\r\n await set(installations.appConfig, {\r\n fid: installationEntry.fid,\r\n registrationStatus: 0 /* RequestStatus.NOT_STARTED */\r\n });\r\n }\r\n throw e;\r\n }\r\n}\r\n/** Call if FID registration is pending in another request. */\r\nasync function waitUntilFidRegistration(installations) {\r\n // Unfortunately, there is no way of reliably observing when a value in\r\n // IndexedDB changes (yet, see https://github.com/WICG/indexed-db-observers),\r\n // so we need to poll.\r\n let entry = await updateInstallationRequest(installations.appConfig);\r\n while (entry.registrationStatus === 1 /* RequestStatus.IN_PROGRESS */) {\r\n // createInstallation request still in progress.\r\n await sleep(100);\r\n entry = await updateInstallationRequest(installations.appConfig);\r\n }\r\n if (entry.registrationStatus === 0 /* RequestStatus.NOT_STARTED */) {\r\n // The request timed out or failed in a different call. Try again.\r\n const { installationEntry, registrationPromise } = await getInstallationEntry(installations);\r\n if (registrationPromise) {\r\n return registrationPromise;\r\n }\r\n else {\r\n // if there is no registrationPromise, entry is registered.\r\n return installationEntry;\r\n }\r\n }\r\n return entry;\r\n}\r\n/**\r\n * Called only if there is a CreateInstallation request in progress.\r\n *\r\n * Updates the InstallationEntry in the DB based on the status of the\r\n * CreateInstallation request.\r\n *\r\n * Returns the updated InstallationEntry.\r\n */\r\nfunction updateInstallationRequest(appConfig) {\r\n return update(appConfig, oldEntry => {\r\n if (!oldEntry) {\r\n throw ERROR_FACTORY.create(\"installation-not-found\" /* ErrorCode.INSTALLATION_NOT_FOUND */);\r\n }\r\n return clearTimedOutRequest(oldEntry);\r\n });\r\n}\r\nfunction clearTimedOutRequest(entry) {\r\n if (hasInstallationRequestTimedOut(entry)) {\r\n return {\r\n fid: entry.fid,\r\n registrationStatus: 0 /* RequestStatus.NOT_STARTED */\r\n };\r\n }\r\n return entry;\r\n}\r\nfunction hasInstallationRequestTimedOut(installationEntry) {\r\n return (installationEntry.registrationStatus === 1 /* RequestStatus.IN_PROGRESS */ &&\r\n installationEntry.registrationTime + PENDING_TIMEOUT_MS < Date.now());\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nasync function generateAuthTokenRequest({ appConfig, heartbeatServiceProvider }, installationEntry) {\r\n const endpoint = getGenerateAuthTokenEndpoint(appConfig, installationEntry);\r\n const headers = getHeadersWithAuth(appConfig, installationEntry);\r\n // If heartbeat service exists, add the heartbeat string to the header.\r\n const heartbeatService = heartbeatServiceProvider.getImmediate({\r\n optional: true\r\n });\r\n if (heartbeatService) {\r\n const heartbeatsHeader = await heartbeatService.getHeartbeatsHeader();\r\n if (heartbeatsHeader) {\r\n headers.append('x-firebase-client', heartbeatsHeader);\r\n }\r\n }\r\n const body = {\r\n installation: {\r\n sdkVersion: PACKAGE_VERSION,\r\n appId: appConfig.appId\r\n }\r\n };\r\n const request = {\r\n method: 'POST',\r\n headers,\r\n body: JSON.stringify(body)\r\n };\r\n const response = await retryIfServerError(() => fetch(endpoint, request));\r\n if (response.ok) {\r\n const responseValue = await response.json();\r\n const completedAuthToken = extractAuthTokenInfoFromResponse(responseValue);\r\n return completedAuthToken;\r\n }\r\n else {\r\n throw await getErrorFromResponse('Generate Auth Token', response);\r\n }\r\n}\r\nfunction getGenerateAuthTokenEndpoint(appConfig, { fid }) {\r\n return `${getInstallationsEndpoint(appConfig)}/${fid}/authTokens:generate`;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Returns a valid authentication token for the installation. Generates a new\r\n * token if one doesn't exist, is expired or about to expire.\r\n *\r\n * Should only be called if the Firebase Installation is registered.\r\n */\r\nasync function refreshAuthToken(installations, forceRefresh = false) {\r\n let tokenPromise;\r\n const entry = await update(installations.appConfig, oldEntry => {\r\n if (!isEntryRegistered(oldEntry)) {\r\n throw ERROR_FACTORY.create(\"not-registered\" /* ErrorCode.NOT_REGISTERED */);\r\n }\r\n const oldAuthToken = oldEntry.authToken;\r\n if (!forceRefresh && isAuthTokenValid(oldAuthToken)) {\r\n // There is a valid token in the DB.\r\n return oldEntry;\r\n }\r\n else if (oldAuthToken.requestStatus === 1 /* RequestStatus.IN_PROGRESS */) {\r\n // There already is a token request in progress.\r\n tokenPromise = waitUntilAuthTokenRequest(installations, forceRefresh);\r\n return oldEntry;\r\n }\r\n else {\r\n // No token or token expired.\r\n if (!navigator.onLine) {\r\n throw ERROR_FACTORY.create(\"app-offline\" /* ErrorCode.APP_OFFLINE */);\r\n }\r\n const inProgressEntry = makeAuthTokenRequestInProgressEntry(oldEntry);\r\n tokenPromise = fetchAuthTokenFromServer(installations, inProgressEntry);\r\n return inProgressEntry;\r\n }\r\n });\r\n const authToken = tokenPromise\r\n ? await tokenPromise\r\n : entry.authToken;\r\n return authToken;\r\n}\r\n/**\r\n * Call only if FID is registered and Auth Token request is in progress.\r\n *\r\n * Waits until the current pending request finishes. If the request times out,\r\n * tries once in this thread as well.\r\n */\r\nasync function waitUntilAuthTokenRequest(installations, forceRefresh) {\r\n // Unfortunately, there is no way of reliably observing when a value in\r\n // IndexedDB changes (yet, see https://github.com/WICG/indexed-db-observers),\r\n // so we need to poll.\r\n let entry = await updateAuthTokenRequest(installations.appConfig);\r\n while (entry.authToken.requestStatus === 1 /* RequestStatus.IN_PROGRESS */) {\r\n // generateAuthToken still in progress.\r\n await sleep(100);\r\n entry = await updateAuthTokenRequest(installations.appConfig);\r\n }\r\n const authToken = entry.authToken;\r\n if (authToken.requestStatus === 0 /* RequestStatus.NOT_STARTED */) {\r\n // The request timed out or failed in a different call. Try again.\r\n return refreshAuthToken(installations, forceRefresh);\r\n }\r\n else {\r\n return authToken;\r\n }\r\n}\r\n/**\r\n * Called only if there is a GenerateAuthToken request in progress.\r\n *\r\n * Updates the InstallationEntry in the DB based on the status of the\r\n * GenerateAuthToken request.\r\n *\r\n * Returns the updated InstallationEntry.\r\n */\r\nfunction updateAuthTokenRequest(appConfig) {\r\n return update(appConfig, oldEntry => {\r\n if (!isEntryRegistered(oldEntry)) {\r\n throw ERROR_FACTORY.create(\"not-registered\" /* ErrorCode.NOT_REGISTERED */);\r\n }\r\n const oldAuthToken = oldEntry.authToken;\r\n if (hasAuthTokenRequestTimedOut(oldAuthToken)) {\r\n return Object.assign(Object.assign({}, oldEntry), { authToken: { requestStatus: 0 /* RequestStatus.NOT_STARTED */ } });\r\n }\r\n return oldEntry;\r\n });\r\n}\r\nasync function fetchAuthTokenFromServer(installations, installationEntry) {\r\n try {\r\n const authToken = await generateAuthTokenRequest(installations, installationEntry);\r\n const updatedInstallationEntry = Object.assign(Object.assign({}, installationEntry), { authToken });\r\n await set(installations.appConfig, updatedInstallationEntry);\r\n return authToken;\r\n }\r\n catch (e) {\r\n if (isServerError(e) &&\r\n (e.customData.serverCode === 401 || e.customData.serverCode === 404)) {\r\n // Server returned a \"FID not found\" or a \"Invalid authentication\" error.\r\n // Generate a new ID next time.\r\n await remove(installations.appConfig);\r\n }\r\n else {\r\n const updatedInstallationEntry = Object.assign(Object.assign({}, installationEntry), { authToken: { requestStatus: 0 /* RequestStatus.NOT_STARTED */ } });\r\n await set(installations.appConfig, updatedInstallationEntry);\r\n }\r\n throw e;\r\n }\r\n}\r\nfunction isEntryRegistered(installationEntry) {\r\n return (installationEntry !== undefined &&\r\n installationEntry.registrationStatus === 2 /* RequestStatus.COMPLETED */);\r\n}\r\nfunction isAuthTokenValid(authToken) {\r\n return (authToken.requestStatus === 2 /* RequestStatus.COMPLETED */ &&\r\n !isAuthTokenExpired(authToken));\r\n}\r\nfunction isAuthTokenExpired(authToken) {\r\n const now = Date.now();\r\n return (now < authToken.creationTime ||\r\n authToken.creationTime + authToken.expiresIn < now + TOKEN_EXPIRATION_BUFFER);\r\n}\r\n/** Returns an updated InstallationEntry with an InProgressAuthToken. */\r\nfunction makeAuthTokenRequestInProgressEntry(oldEntry) {\r\n const inProgressAuthToken = {\r\n requestStatus: 1 /* RequestStatus.IN_PROGRESS */,\r\n requestTime: Date.now()\r\n };\r\n return Object.assign(Object.assign({}, oldEntry), { authToken: inProgressAuthToken });\r\n}\r\nfunction hasAuthTokenRequestTimedOut(authToken) {\r\n return (authToken.requestStatus === 1 /* RequestStatus.IN_PROGRESS */ &&\r\n authToken.requestTime + PENDING_TIMEOUT_MS < Date.now());\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Creates a Firebase Installation if there isn't one for the app and\r\n * returns the Installation ID.\r\n * @param installations - The `Installations` instance.\r\n *\r\n * @public\r\n */\r\nasync function getId(installations) {\r\n const installationsImpl = installations;\r\n const { installationEntry, registrationPromise } = await getInstallationEntry(installationsImpl);\r\n if (registrationPromise) {\r\n registrationPromise.catch(console.error);\r\n }\r\n else {\r\n // If the installation is already registered, update the authentication\r\n // token if needed.\r\n refreshAuthToken(installationsImpl).catch(console.error);\r\n }\r\n return installationEntry.fid;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Returns a Firebase Installations auth token, identifying the current\r\n * Firebase Installation.\r\n * @param installations - The `Installations` instance.\r\n * @param forceRefresh - Force refresh regardless of token expiration.\r\n *\r\n * @public\r\n */\r\nasync function getToken(installations, forceRefresh = false) {\r\n const installationsImpl = installations;\r\n await completeInstallationRegistration(installationsImpl);\r\n // At this point we either have a Registered Installation in the DB, or we've\r\n // already thrown an error.\r\n const authToken = await refreshAuthToken(installationsImpl, forceRefresh);\r\n return authToken.token;\r\n}\r\nasync function completeInstallationRegistration(installations) {\r\n const { registrationPromise } = await getInstallationEntry(installations);\r\n if (registrationPromise) {\r\n // A createInstallation request is in progress. Wait until it finishes.\r\n await registrationPromise;\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nasync function deleteInstallationRequest(appConfig, installationEntry) {\r\n const endpoint = getDeleteEndpoint(appConfig, installationEntry);\r\n const headers = getHeadersWithAuth(appConfig, installationEntry);\r\n const request = {\r\n method: 'DELETE',\r\n headers\r\n };\r\n const response = await retryIfServerError(() => fetch(endpoint, request));\r\n if (!response.ok) {\r\n throw await getErrorFromResponse('Delete Installation', response);\r\n }\r\n}\r\nfunction getDeleteEndpoint(appConfig, { fid }) {\r\n return `${getInstallationsEndpoint(appConfig)}/${fid}`;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Deletes the Firebase Installation and all associated data.\r\n * @param installations - The `Installations` instance.\r\n *\r\n * @public\r\n */\r\nasync function deleteInstallations(installations) {\r\n const { appConfig } = installations;\r\n const entry = await update(appConfig, oldEntry => {\r\n if (oldEntry && oldEntry.registrationStatus === 0 /* RequestStatus.NOT_STARTED */) {\r\n // Delete the unregistered entry without sending a deleteInstallation request.\r\n return undefined;\r\n }\r\n return oldEntry;\r\n });\r\n if (entry) {\r\n if (entry.registrationStatus === 1 /* RequestStatus.IN_PROGRESS */) {\r\n // Can't delete while trying to register.\r\n throw ERROR_FACTORY.create(\"delete-pending-registration\" /* ErrorCode.DELETE_PENDING_REGISTRATION */);\r\n }\r\n else if (entry.registrationStatus === 2 /* RequestStatus.COMPLETED */) {\r\n if (!navigator.onLine) {\r\n throw ERROR_FACTORY.create(\"app-offline\" /* ErrorCode.APP_OFFLINE */);\r\n }\r\n else {\r\n await deleteInstallationRequest(appConfig, entry);\r\n await remove(appConfig);\r\n }\r\n }\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Sets a new callback that will get called when Installation ID changes.\r\n * Returns an unsubscribe function that will remove the callback when called.\r\n * @param installations - The `Installations` instance.\r\n * @param callback - The callback function that is invoked when FID changes.\r\n * @returns A function that can be called to unsubscribe.\r\n *\r\n * @public\r\n */\r\nfunction onIdChange(installations, callback) {\r\n const { appConfig } = installations;\r\n addCallback(appConfig, callback);\r\n return () => {\r\n removeCallback(appConfig, callback);\r\n };\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Returns an instance of {@link Installations} associated with the given\r\n * {@link @firebase/app#FirebaseApp} instance.\r\n * @param app - The {@link @firebase/app#FirebaseApp} instance.\r\n *\r\n * @public\r\n */\r\nfunction getInstallations(app = getApp()) {\r\n const installationsImpl = _getProvider(app, 'installations').getImmediate();\r\n return installationsImpl;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction extractAppConfig(app) {\r\n if (!app || !app.options) {\r\n throw getMissingValueError('App Configuration');\r\n }\r\n if (!app.name) {\r\n throw getMissingValueError('App Name');\r\n }\r\n // Required app config keys\r\n const configKeys = [\r\n 'projectId',\r\n 'apiKey',\r\n 'appId'\r\n ];\r\n for (const keyName of configKeys) {\r\n if (!app.options[keyName]) {\r\n throw getMissingValueError(keyName);\r\n }\r\n }\r\n return {\r\n appName: app.name,\r\n projectId: app.options.projectId,\r\n apiKey: app.options.apiKey,\r\n appId: app.options.appId\r\n };\r\n}\r\nfunction getMissingValueError(valueName) {\r\n return ERROR_FACTORY.create(\"missing-app-config-values\" /* ErrorCode.MISSING_APP_CONFIG_VALUES */, {\r\n valueName\r\n });\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst INSTALLATIONS_NAME = 'installations';\r\nconst INSTALLATIONS_NAME_INTERNAL = 'installations-internal';\r\nconst publicFactory = (container) => {\r\n const app = container.getProvider('app').getImmediate();\r\n // Throws if app isn't configured properly.\r\n const appConfig = extractAppConfig(app);\r\n const heartbeatServiceProvider = _getProvider(app, 'heartbeat');\r\n const installationsImpl = {\r\n app,\r\n appConfig,\r\n heartbeatServiceProvider,\r\n _delete: () => Promise.resolve()\r\n };\r\n return installationsImpl;\r\n};\r\nconst internalFactory = (container) => {\r\n const app = container.getProvider('app').getImmediate();\r\n // Internal FIS instance relies on public FIS instance.\r\n const installations = _getProvider(app, INSTALLATIONS_NAME).getImmediate();\r\n const installationsInternal = {\r\n getId: () => getId(installations),\r\n getToken: (forceRefresh) => getToken(installations, forceRefresh)\r\n };\r\n return installationsInternal;\r\n};\r\nfunction registerInstallations() {\r\n _registerComponent(new Component(INSTALLATIONS_NAME, publicFactory, \"PUBLIC\" /* ComponentType.PUBLIC */));\r\n _registerComponent(new Component(INSTALLATIONS_NAME_INTERNAL, internalFactory, \"PRIVATE\" /* ComponentType.PRIVATE */));\r\n}\n\n/**\r\n * Firebase Installations\r\n *\r\n * @packageDocumentation\r\n */\r\nregisterInstallations();\r\nregisterVersion(name, version);\r\n// BUILD_TARGET will be replaced by values like esm5, esm2017, cjs5, etc during the compilation\r\nregisterVersion(name, version, 'esm2017');\n\nexport { deleteInstallations, getId, getInstallations, getToken, onIdChange };\n//# sourceMappingURL=index.esm2017.js.map\n","/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * A container for all of the Logger instances\r\n */\r\nconst instances = [];\r\n/**\r\n * The JS SDK supports 5 log levels and also allows a user the ability to\r\n * silence the logs altogether.\r\n *\r\n * The order is a follows:\r\n * DEBUG < VERBOSE < INFO < WARN < ERROR\r\n *\r\n * All of the log types above the current log level will be captured (i.e. if\r\n * you set the log level to `INFO`, errors will still be logged, but `DEBUG` and\r\n * `VERBOSE` logs will not)\r\n */\r\nvar LogLevel;\r\n(function (LogLevel) {\r\n LogLevel[LogLevel[\"DEBUG\"] = 0] = \"DEBUG\";\r\n LogLevel[LogLevel[\"VERBOSE\"] = 1] = \"VERBOSE\";\r\n LogLevel[LogLevel[\"INFO\"] = 2] = \"INFO\";\r\n LogLevel[LogLevel[\"WARN\"] = 3] = \"WARN\";\r\n LogLevel[LogLevel[\"ERROR\"] = 4] = \"ERROR\";\r\n LogLevel[LogLevel[\"SILENT\"] = 5] = \"SILENT\";\r\n})(LogLevel || (LogLevel = {}));\r\nconst levelStringToEnum = {\r\n 'debug': LogLevel.DEBUG,\r\n 'verbose': LogLevel.VERBOSE,\r\n 'info': LogLevel.INFO,\r\n 'warn': LogLevel.WARN,\r\n 'error': LogLevel.ERROR,\r\n 'silent': LogLevel.SILENT\r\n};\r\n/**\r\n * The default log level\r\n */\r\nconst defaultLogLevel = LogLevel.INFO;\r\n/**\r\n * By default, `console.debug` is not displayed in the developer console (in\r\n * chrome). To avoid forcing users to have to opt-in to these logs twice\r\n * (i.e. once for firebase, and once in the console), we are sending `DEBUG`\r\n * logs to the `console.log` function.\r\n */\r\nconst ConsoleMethod = {\r\n [LogLevel.DEBUG]: 'log',\r\n [LogLevel.VERBOSE]: 'log',\r\n [LogLevel.INFO]: 'info',\r\n [LogLevel.WARN]: 'warn',\r\n [LogLevel.ERROR]: 'error'\r\n};\r\n/**\r\n * The default log handler will forward DEBUG, VERBOSE, INFO, WARN, and ERROR\r\n * messages on to their corresponding console counterparts (if the log method\r\n * is supported by the current log level)\r\n */\r\nconst defaultLogHandler = (instance, logType, ...args) => {\r\n if (logType < instance.logLevel) {\r\n return;\r\n }\r\n const now = new Date().toISOString();\r\n const method = ConsoleMethod[logType];\r\n if (method) {\r\n console[method](`[${now}] ${instance.name}:`, ...args);\r\n }\r\n else {\r\n throw new Error(`Attempted to log a message with an invalid logType (value: ${logType})`);\r\n }\r\n};\r\nclass Logger {\r\n /**\r\n * Gives you an instance of a Logger to capture messages according to\r\n * Firebase's logging scheme.\r\n *\r\n * @param name The name that the logs will be associated with\r\n */\r\n constructor(name) {\r\n this.name = name;\r\n /**\r\n * The log level of the given Logger instance.\r\n */\r\n this._logLevel = defaultLogLevel;\r\n /**\r\n * The main (internal) log handler for the Logger instance.\r\n * Can be set to a new function in internal package code but not by user.\r\n */\r\n this._logHandler = defaultLogHandler;\r\n /**\r\n * The optional, additional, user-defined log handler for the Logger instance.\r\n */\r\n this._userLogHandler = null;\r\n /**\r\n * Capture the current instance for later use\r\n */\r\n instances.push(this);\r\n }\r\n get logLevel() {\r\n return this._logLevel;\r\n }\r\n set logLevel(val) {\r\n if (!(val in LogLevel)) {\r\n throw new TypeError(`Invalid value \"${val}\" assigned to \\`logLevel\\``);\r\n }\r\n this._logLevel = val;\r\n }\r\n // Workaround for setter/getter having to be the same type.\r\n setLogLevel(val) {\r\n this._logLevel = typeof val === 'string' ? levelStringToEnum[val] : val;\r\n }\r\n get logHandler() {\r\n return this._logHandler;\r\n }\r\n set logHandler(val) {\r\n if (typeof val !== 'function') {\r\n throw new TypeError('Value assigned to `logHandler` must be a function');\r\n }\r\n this._logHandler = val;\r\n }\r\n get userLogHandler() {\r\n return this._userLogHandler;\r\n }\r\n set userLogHandler(val) {\r\n this._userLogHandler = val;\r\n }\r\n /**\r\n * The functions below are all based on the `console` interface\r\n */\r\n debug(...args) {\r\n this._userLogHandler && this._userLogHandler(this, LogLevel.DEBUG, ...args);\r\n this._logHandler(this, LogLevel.DEBUG, ...args);\r\n }\r\n log(...args) {\r\n this._userLogHandler &&\r\n this._userLogHandler(this, LogLevel.VERBOSE, ...args);\r\n this._logHandler(this, LogLevel.VERBOSE, ...args);\r\n }\r\n info(...args) {\r\n this._userLogHandler && this._userLogHandler(this, LogLevel.INFO, ...args);\r\n this._logHandler(this, LogLevel.INFO, ...args);\r\n }\r\n warn(...args) {\r\n this._userLogHandler && this._userLogHandler(this, LogLevel.WARN, ...args);\r\n this._logHandler(this, LogLevel.WARN, ...args);\r\n }\r\n error(...args) {\r\n this._userLogHandler && this._userLogHandler(this, LogLevel.ERROR, ...args);\r\n this._logHandler(this, LogLevel.ERROR, ...args);\r\n }\r\n}\r\nfunction setLogLevel(level) {\r\n instances.forEach(inst => {\r\n inst.setLogLevel(level);\r\n });\r\n}\r\nfunction setUserLogHandler(logCallback, options) {\r\n for (const instance of instances) {\r\n let customLogLevel = null;\r\n if (options && options.level) {\r\n customLogLevel = levelStringToEnum[options.level];\r\n }\r\n if (logCallback === null) {\r\n instance.userLogHandler = null;\r\n }\r\n else {\r\n instance.userLogHandler = (instance, level, ...args) => {\r\n const message = args\r\n .map(arg => {\r\n if (arg == null) {\r\n return null;\r\n }\r\n else if (typeof arg === 'string') {\r\n return arg;\r\n }\r\n else if (typeof arg === 'number' || typeof arg === 'boolean') {\r\n return arg.toString();\r\n }\r\n else if (arg instanceof Error) {\r\n return arg.message;\r\n }\r\n else {\r\n try {\r\n return JSON.stringify(arg);\r\n }\r\n catch (ignored) {\r\n return null;\r\n }\r\n }\r\n })\r\n .filter(arg => arg)\r\n .join(' ');\r\n if (level >= (customLogLevel !== null && customLogLevel !== void 0 ? customLogLevel : instance.logLevel)) {\r\n logCallback({\r\n level: LogLevel[level].toLowerCase(),\r\n message,\r\n args,\r\n type: instance.name\r\n });\r\n }\r\n };\r\n }\r\n }\r\n}\n\nexport { LogLevel, Logger, setLogLevel, setUserLogHandler };\n//# sourceMappingURL=index.esm2017.js.map\n","import '@firebase/installations';\nimport { Component } from '@firebase/component';\nimport { openDB, deleteDB } from 'idb';\nimport { ErrorFactory, validateIndexedDBOpenable, isIndexedDBAvailable, areCookiesEnabled, getModularInstance } from '@firebase/util';\nimport { _registerComponent, registerVersion, _getProvider, getApp } from '@firebase/app';\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst DEFAULT_SW_PATH = '/firebase-messaging-sw.js';\r\nconst DEFAULT_SW_SCOPE = '/firebase-cloud-messaging-push-scope';\r\nconst DEFAULT_VAPID_KEY = 'BDOU99-h67HcA6JeFXHbSNMu7e2yNNu3RzoMj8TM4W88jITfq7ZmPvIM1Iv-4_l2LxQcYwhqby2xGpWwzjfAnG4';\r\nconst ENDPOINT = 'https://fcmregistrations.googleapis.com/v1';\r\nconst CONSOLE_CAMPAIGN_ID = 'google.c.a.c_id';\r\nconst CONSOLE_CAMPAIGN_NAME = 'google.c.a.c_l';\r\nconst CONSOLE_CAMPAIGN_TIME = 'google.c.a.ts';\r\n/** Set to '1' if Analytics is enabled for the campaign */\r\nconst CONSOLE_CAMPAIGN_ANALYTICS_ENABLED = 'google.c.a.e';\r\nvar MessageType$1;\r\n(function (MessageType) {\r\n MessageType[MessageType[\"DATA_MESSAGE\"] = 1] = \"DATA_MESSAGE\";\r\n MessageType[MessageType[\"DISPLAY_NOTIFICATION\"] = 3] = \"DISPLAY_NOTIFICATION\";\r\n})(MessageType$1 || (MessageType$1 = {}));\n\n/**\r\n * @license\r\n * Copyright 2018 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this file except\r\n * in compliance with the License. You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software distributed under the License\r\n * is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express\r\n * or implied. See the License for the specific language governing permissions and limitations under\r\n * the License.\r\n */\r\nvar MessageType;\r\n(function (MessageType) {\r\n MessageType[\"PUSH_RECEIVED\"] = \"push-received\";\r\n MessageType[\"NOTIFICATION_CLICKED\"] = \"notification-clicked\";\r\n})(MessageType || (MessageType = {}));\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction arrayToBase64(array) {\r\n const uint8Array = new Uint8Array(array);\r\n const base64String = btoa(String.fromCharCode(...uint8Array));\r\n return base64String.replace(/=/g, '').replace(/\\+/g, '-').replace(/\\//g, '_');\r\n}\r\nfunction base64ToArray(base64String) {\r\n const padding = '='.repeat((4 - (base64String.length % 4)) % 4);\r\n const base64 = (base64String + padding)\r\n .replace(/\\-/g, '+')\r\n .replace(/_/g, '/');\r\n const rawData = atob(base64);\r\n const outputArray = new Uint8Array(rawData.length);\r\n for (let i = 0; i < rawData.length; ++i) {\r\n outputArray[i] = rawData.charCodeAt(i);\r\n }\r\n return outputArray;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst OLD_DB_NAME = 'fcm_token_details_db';\r\n/**\r\n * The last DB version of 'fcm_token_details_db' was 4. This is one higher, so that the upgrade\r\n * callback is called for all versions of the old DB.\r\n */\r\nconst OLD_DB_VERSION = 5;\r\nconst OLD_OBJECT_STORE_NAME = 'fcm_token_object_Store';\r\nasync function migrateOldDatabase(senderId) {\r\n if ('databases' in indexedDB) {\r\n // indexedDb.databases() is an IndexedDB v3 API and does not exist in all browsers. TODO: Remove\r\n // typecast when it lands in TS types.\r\n const databases = await indexedDB.databases();\r\n const dbNames = databases.map(db => db.name);\r\n if (!dbNames.includes(OLD_DB_NAME)) {\r\n // old DB didn't exist, no need to open.\r\n return null;\r\n }\r\n }\r\n let tokenDetails = null;\r\n const db = await openDB(OLD_DB_NAME, OLD_DB_VERSION, {\r\n upgrade: async (db, oldVersion, newVersion, upgradeTransaction) => {\r\n var _a;\r\n if (oldVersion < 2) {\r\n // Database too old, skip migration.\r\n return;\r\n }\r\n if (!db.objectStoreNames.contains(OLD_OBJECT_STORE_NAME)) {\r\n // Database did not exist. Nothing to do.\r\n return;\r\n }\r\n const objectStore = upgradeTransaction.objectStore(OLD_OBJECT_STORE_NAME);\r\n const value = await objectStore.index('fcmSenderId').get(senderId);\r\n await objectStore.clear();\r\n if (!value) {\r\n // No entry in the database, nothing to migrate.\r\n return;\r\n }\r\n if (oldVersion === 2) {\r\n const oldDetails = value;\r\n if (!oldDetails.auth || !oldDetails.p256dh || !oldDetails.endpoint) {\r\n return;\r\n }\r\n tokenDetails = {\r\n token: oldDetails.fcmToken,\r\n createTime: (_a = oldDetails.createTime) !== null && _a !== void 0 ? _a : Date.now(),\r\n subscriptionOptions: {\r\n auth: oldDetails.auth,\r\n p256dh: oldDetails.p256dh,\r\n endpoint: oldDetails.endpoint,\r\n swScope: oldDetails.swScope,\r\n vapidKey: typeof oldDetails.vapidKey === 'string'\r\n ? oldDetails.vapidKey\r\n : arrayToBase64(oldDetails.vapidKey)\r\n }\r\n };\r\n }\r\n else if (oldVersion === 3) {\r\n const oldDetails = value;\r\n tokenDetails = {\r\n token: oldDetails.fcmToken,\r\n createTime: oldDetails.createTime,\r\n subscriptionOptions: {\r\n auth: arrayToBase64(oldDetails.auth),\r\n p256dh: arrayToBase64(oldDetails.p256dh),\r\n endpoint: oldDetails.endpoint,\r\n swScope: oldDetails.swScope,\r\n vapidKey: arrayToBase64(oldDetails.vapidKey)\r\n }\r\n };\r\n }\r\n else if (oldVersion === 4) {\r\n const oldDetails = value;\r\n tokenDetails = {\r\n token: oldDetails.fcmToken,\r\n createTime: oldDetails.createTime,\r\n subscriptionOptions: {\r\n auth: arrayToBase64(oldDetails.auth),\r\n p256dh: arrayToBase64(oldDetails.p256dh),\r\n endpoint: oldDetails.endpoint,\r\n swScope: oldDetails.swScope,\r\n vapidKey: arrayToBase64(oldDetails.vapidKey)\r\n }\r\n };\r\n }\r\n }\r\n });\r\n db.close();\r\n // Delete all old databases.\r\n await deleteDB(OLD_DB_NAME);\r\n await deleteDB('fcm_vapid_details_db');\r\n await deleteDB('undefined');\r\n return checkTokenDetails(tokenDetails) ? tokenDetails : null;\r\n}\r\nfunction checkTokenDetails(tokenDetails) {\r\n if (!tokenDetails || !tokenDetails.subscriptionOptions) {\r\n return false;\r\n }\r\n const { subscriptionOptions } = tokenDetails;\r\n return (typeof tokenDetails.createTime === 'number' &&\r\n tokenDetails.createTime > 0 &&\r\n typeof tokenDetails.token === 'string' &&\r\n tokenDetails.token.length > 0 &&\r\n typeof subscriptionOptions.auth === 'string' &&\r\n subscriptionOptions.auth.length > 0 &&\r\n typeof subscriptionOptions.p256dh === 'string' &&\r\n subscriptionOptions.p256dh.length > 0 &&\r\n typeof subscriptionOptions.endpoint === 'string' &&\r\n subscriptionOptions.endpoint.length > 0 &&\r\n typeof subscriptionOptions.swScope === 'string' &&\r\n subscriptionOptions.swScope.length > 0 &&\r\n typeof subscriptionOptions.vapidKey === 'string' &&\r\n subscriptionOptions.vapidKey.length > 0);\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n// Exported for tests.\r\nconst DATABASE_NAME = 'firebase-messaging-database';\r\nconst DATABASE_VERSION = 1;\r\nconst OBJECT_STORE_NAME = 'firebase-messaging-store';\r\nlet dbPromise = null;\r\nfunction getDbPromise() {\r\n if (!dbPromise) {\r\n dbPromise = openDB(DATABASE_NAME, DATABASE_VERSION, {\r\n upgrade: (upgradeDb, oldVersion) => {\r\n // We don't use 'break' in this switch statement, the fall-through behavior is what we want,\r\n // because if there are multiple versions between the old version and the current version, we\r\n // want ALL the migrations that correspond to those versions to run, not only the last one.\r\n // eslint-disable-next-line default-case\r\n switch (oldVersion) {\r\n case 0:\r\n upgradeDb.createObjectStore(OBJECT_STORE_NAME);\r\n }\r\n }\r\n });\r\n }\r\n return dbPromise;\r\n}\r\n/** Gets record(s) from the objectStore that match the given key. */\r\nasync function dbGet(firebaseDependencies) {\r\n const key = getKey(firebaseDependencies);\r\n const db = await getDbPromise();\r\n const tokenDetails = (await db\r\n .transaction(OBJECT_STORE_NAME)\r\n .objectStore(OBJECT_STORE_NAME)\r\n .get(key));\r\n if (tokenDetails) {\r\n return tokenDetails;\r\n }\r\n else {\r\n // Check if there is a tokenDetails object in the old DB.\r\n const oldTokenDetails = await migrateOldDatabase(firebaseDependencies.appConfig.senderId);\r\n if (oldTokenDetails) {\r\n await dbSet(firebaseDependencies, oldTokenDetails);\r\n return oldTokenDetails;\r\n }\r\n }\r\n}\r\n/** Assigns or overwrites the record for the given key with the given value. */\r\nasync function dbSet(firebaseDependencies, tokenDetails) {\r\n const key = getKey(firebaseDependencies);\r\n const db = await getDbPromise();\r\n const tx = db.transaction(OBJECT_STORE_NAME, 'readwrite');\r\n await tx.objectStore(OBJECT_STORE_NAME).put(tokenDetails, key);\r\n await tx.done;\r\n return tokenDetails;\r\n}\r\n/** Removes record(s) from the objectStore that match the given key. */\r\nasync function dbRemove(firebaseDependencies) {\r\n const key = getKey(firebaseDependencies);\r\n const db = await getDbPromise();\r\n const tx = db.transaction(OBJECT_STORE_NAME, 'readwrite');\r\n await tx.objectStore(OBJECT_STORE_NAME).delete(key);\r\n await tx.done;\r\n}\r\nfunction getKey({ appConfig }) {\r\n return appConfig.appId;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst ERROR_MAP = {\r\n [\"missing-app-config-values\" /* ErrorCode.MISSING_APP_CONFIG_VALUES */]: 'Missing App configuration value: \"{$valueName}\"',\r\n [\"only-available-in-window\" /* ErrorCode.AVAILABLE_IN_WINDOW */]: 'This method is available in a Window context.',\r\n [\"only-available-in-sw\" /* ErrorCode.AVAILABLE_IN_SW */]: 'This method is available in a service worker context.',\r\n [\"permission-default\" /* ErrorCode.PERMISSION_DEFAULT */]: 'The notification permission was not granted and dismissed instead.',\r\n [\"permission-blocked\" /* ErrorCode.PERMISSION_BLOCKED */]: 'The notification permission was not granted and blocked instead.',\r\n [\"unsupported-browser\" /* ErrorCode.UNSUPPORTED_BROWSER */]: \"This browser doesn't support the API's required to use the Firebase SDK.\",\r\n [\"indexed-db-unsupported\" /* ErrorCode.INDEXED_DB_UNSUPPORTED */]: \"This browser doesn't support indexedDb.open() (ex. Safari iFrame, Firefox Private Browsing, etc)\",\r\n [\"failed-service-worker-registration\" /* ErrorCode.FAILED_DEFAULT_REGISTRATION */]: 'We are unable to register the default service worker. {$browserErrorMessage}',\r\n [\"token-subscribe-failed\" /* ErrorCode.TOKEN_SUBSCRIBE_FAILED */]: 'A problem occurred while subscribing the user to FCM: {$errorInfo}',\r\n [\"token-subscribe-no-token\" /* ErrorCode.TOKEN_SUBSCRIBE_NO_TOKEN */]: 'FCM returned no token when subscribing the user to push.',\r\n [\"token-unsubscribe-failed\" /* ErrorCode.TOKEN_UNSUBSCRIBE_FAILED */]: 'A problem occurred while unsubscribing the ' +\r\n 'user from FCM: {$errorInfo}',\r\n [\"token-update-failed\" /* ErrorCode.TOKEN_UPDATE_FAILED */]: 'A problem occurred while updating the user from FCM: {$errorInfo}',\r\n [\"token-update-no-token\" /* ErrorCode.TOKEN_UPDATE_NO_TOKEN */]: 'FCM returned no token when updating the user to push.',\r\n [\"use-sw-after-get-token\" /* ErrorCode.USE_SW_AFTER_GET_TOKEN */]: 'The useServiceWorker() method may only be called once and must be ' +\r\n 'called before calling getToken() to ensure your service worker is used.',\r\n [\"invalid-sw-registration\" /* ErrorCode.INVALID_SW_REGISTRATION */]: 'The input to useServiceWorker() must be a ServiceWorkerRegistration.',\r\n [\"invalid-bg-handler\" /* ErrorCode.INVALID_BG_HANDLER */]: 'The input to setBackgroundMessageHandler() must be a function.',\r\n [\"invalid-vapid-key\" /* ErrorCode.INVALID_VAPID_KEY */]: 'The public VAPID key must be a string.',\r\n [\"use-vapid-key-after-get-token\" /* ErrorCode.USE_VAPID_KEY_AFTER_GET_TOKEN */]: 'The usePublicVapidKey() method may only be called once and must be ' +\r\n 'called before calling getToken() to ensure your VAPID key is used.'\r\n};\r\nconst ERROR_FACTORY = new ErrorFactory('messaging', 'Messaging', ERROR_MAP);\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nasync function requestGetToken(firebaseDependencies, subscriptionOptions) {\r\n const headers = await getHeaders(firebaseDependencies);\r\n const body = getBody(subscriptionOptions);\r\n const subscribeOptions = {\r\n method: 'POST',\r\n headers,\r\n body: JSON.stringify(body)\r\n };\r\n let responseData;\r\n try {\r\n const response = await fetch(getEndpoint(firebaseDependencies.appConfig), subscribeOptions);\r\n responseData = await response.json();\r\n }\r\n catch (err) {\r\n throw ERROR_FACTORY.create(\"token-subscribe-failed\" /* ErrorCode.TOKEN_SUBSCRIBE_FAILED */, {\r\n errorInfo: err === null || err === void 0 ? void 0 : err.toString()\r\n });\r\n }\r\n if (responseData.error) {\r\n const message = responseData.error.message;\r\n throw ERROR_FACTORY.create(\"token-subscribe-failed\" /* ErrorCode.TOKEN_SUBSCRIBE_FAILED */, {\r\n errorInfo: message\r\n });\r\n }\r\n if (!responseData.token) {\r\n throw ERROR_FACTORY.create(\"token-subscribe-no-token\" /* ErrorCode.TOKEN_SUBSCRIBE_NO_TOKEN */);\r\n }\r\n return responseData.token;\r\n}\r\nasync function requestUpdateToken(firebaseDependencies, tokenDetails) {\r\n const headers = await getHeaders(firebaseDependencies);\r\n const body = getBody(tokenDetails.subscriptionOptions);\r\n const updateOptions = {\r\n method: 'PATCH',\r\n headers,\r\n body: JSON.stringify(body)\r\n };\r\n let responseData;\r\n try {\r\n const response = await fetch(`${getEndpoint(firebaseDependencies.appConfig)}/${tokenDetails.token}`, updateOptions);\r\n responseData = await response.json();\r\n }\r\n catch (err) {\r\n throw ERROR_FACTORY.create(\"token-update-failed\" /* ErrorCode.TOKEN_UPDATE_FAILED */, {\r\n errorInfo: err === null || err === void 0 ? void 0 : err.toString()\r\n });\r\n }\r\n if (responseData.error) {\r\n const message = responseData.error.message;\r\n throw ERROR_FACTORY.create(\"token-update-failed\" /* ErrorCode.TOKEN_UPDATE_FAILED */, {\r\n errorInfo: message\r\n });\r\n }\r\n if (!responseData.token) {\r\n throw ERROR_FACTORY.create(\"token-update-no-token\" /* ErrorCode.TOKEN_UPDATE_NO_TOKEN */);\r\n }\r\n return responseData.token;\r\n}\r\nasync function requestDeleteToken(firebaseDependencies, token) {\r\n const headers = await getHeaders(firebaseDependencies);\r\n const unsubscribeOptions = {\r\n method: 'DELETE',\r\n headers\r\n };\r\n try {\r\n const response = await fetch(`${getEndpoint(firebaseDependencies.appConfig)}/${token}`, unsubscribeOptions);\r\n const responseData = await response.json();\r\n if (responseData.error) {\r\n const message = responseData.error.message;\r\n throw ERROR_FACTORY.create(\"token-unsubscribe-failed\" /* ErrorCode.TOKEN_UNSUBSCRIBE_FAILED */, {\r\n errorInfo: message\r\n });\r\n }\r\n }\r\n catch (err) {\r\n throw ERROR_FACTORY.create(\"token-unsubscribe-failed\" /* ErrorCode.TOKEN_UNSUBSCRIBE_FAILED */, {\r\n errorInfo: err === null || err === void 0 ? void 0 : err.toString()\r\n });\r\n }\r\n}\r\nfunction getEndpoint({ projectId }) {\r\n return `${ENDPOINT}/projects/${projectId}/registrations`;\r\n}\r\nasync function getHeaders({ appConfig, installations }) {\r\n const authToken = await installations.getToken();\r\n return new Headers({\r\n 'Content-Type': 'application/json',\r\n Accept: 'application/json',\r\n 'x-goog-api-key': appConfig.apiKey,\r\n 'x-goog-firebase-installations-auth': `FIS ${authToken}`\r\n });\r\n}\r\nfunction getBody({ p256dh, auth, endpoint, vapidKey }) {\r\n const body = {\r\n web: {\r\n endpoint,\r\n auth,\r\n p256dh\r\n }\r\n };\r\n if (vapidKey !== DEFAULT_VAPID_KEY) {\r\n body.web.applicationPubKey = vapidKey;\r\n }\r\n return body;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n// UpdateRegistration will be called once every week.\r\nconst TOKEN_EXPIRATION_MS = 7 * 24 * 60 * 60 * 1000; // 7 days\r\nasync function getTokenInternal(messaging) {\r\n const pushSubscription = await getPushSubscription(messaging.swRegistration, messaging.vapidKey);\r\n const subscriptionOptions = {\r\n vapidKey: messaging.vapidKey,\r\n swScope: messaging.swRegistration.scope,\r\n endpoint: pushSubscription.endpoint,\r\n auth: arrayToBase64(pushSubscription.getKey('auth')),\r\n p256dh: arrayToBase64(pushSubscription.getKey('p256dh'))\r\n };\r\n const tokenDetails = await dbGet(messaging.firebaseDependencies);\r\n if (!tokenDetails) {\r\n // No token, get a new one.\r\n return getNewToken(messaging.firebaseDependencies, subscriptionOptions);\r\n }\r\n else if (!isTokenValid(tokenDetails.subscriptionOptions, subscriptionOptions)) {\r\n // Invalid token, get a new one.\r\n try {\r\n await requestDeleteToken(messaging.firebaseDependencies, tokenDetails.token);\r\n }\r\n catch (e) {\r\n // Suppress errors because of #2364\r\n console.warn(e);\r\n }\r\n return getNewToken(messaging.firebaseDependencies, subscriptionOptions);\r\n }\r\n else if (Date.now() >= tokenDetails.createTime + TOKEN_EXPIRATION_MS) {\r\n // Weekly token refresh\r\n return updateToken(messaging, {\r\n token: tokenDetails.token,\r\n createTime: Date.now(),\r\n subscriptionOptions\r\n });\r\n }\r\n else {\r\n // Valid token, nothing to do.\r\n return tokenDetails.token;\r\n }\r\n}\r\n/**\r\n * This method deletes the token from the database, unsubscribes the token from FCM, and unregisters\r\n * the push subscription if it exists.\r\n */\r\nasync function deleteTokenInternal(messaging) {\r\n const tokenDetails = await dbGet(messaging.firebaseDependencies);\r\n if (tokenDetails) {\r\n await requestDeleteToken(messaging.firebaseDependencies, tokenDetails.token);\r\n await dbRemove(messaging.firebaseDependencies);\r\n }\r\n // Unsubscribe from the push subscription.\r\n const pushSubscription = await messaging.swRegistration.pushManager.getSubscription();\r\n if (pushSubscription) {\r\n return pushSubscription.unsubscribe();\r\n }\r\n // If there's no SW, consider it a success.\r\n return true;\r\n}\r\nasync function updateToken(messaging, tokenDetails) {\r\n try {\r\n const updatedToken = await requestUpdateToken(messaging.firebaseDependencies, tokenDetails);\r\n const updatedTokenDetails = Object.assign(Object.assign({}, tokenDetails), { token: updatedToken, createTime: Date.now() });\r\n await dbSet(messaging.firebaseDependencies, updatedTokenDetails);\r\n return updatedToken;\r\n }\r\n catch (e) {\r\n await deleteTokenInternal(messaging);\r\n throw e;\r\n }\r\n}\r\nasync function getNewToken(firebaseDependencies, subscriptionOptions) {\r\n const token = await requestGetToken(firebaseDependencies, subscriptionOptions);\r\n const tokenDetails = {\r\n token,\r\n createTime: Date.now(),\r\n subscriptionOptions\r\n };\r\n await dbSet(firebaseDependencies, tokenDetails);\r\n return tokenDetails.token;\r\n}\r\n/**\r\n * Gets a PushSubscription for the current user.\r\n */\r\nasync function getPushSubscription(swRegistration, vapidKey) {\r\n const subscription = await swRegistration.pushManager.getSubscription();\r\n if (subscription) {\r\n return subscription;\r\n }\r\n return swRegistration.pushManager.subscribe({\r\n userVisibleOnly: true,\r\n // Chrome <= 75 doesn't support base64-encoded VAPID key. For backward compatibility, VAPID key\r\n // submitted to pushManager#subscribe must be of type Uint8Array.\r\n applicationServerKey: base64ToArray(vapidKey)\r\n });\r\n}\r\n/**\r\n * Checks if the saved tokenDetails object matches the configuration provided.\r\n */\r\nfunction isTokenValid(dbOptions, currentOptions) {\r\n const isVapidKeyEqual = currentOptions.vapidKey === dbOptions.vapidKey;\r\n const isEndpointEqual = currentOptions.endpoint === dbOptions.endpoint;\r\n const isAuthEqual = currentOptions.auth === dbOptions.auth;\r\n const isP256dhEqual = currentOptions.p256dh === dbOptions.p256dh;\r\n return isVapidKeyEqual && isEndpointEqual && isAuthEqual && isP256dhEqual;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction externalizePayload(internalPayload) {\r\n const payload = {\r\n from: internalPayload.from,\r\n // eslint-disable-next-line camelcase\r\n collapseKey: internalPayload.collapse_key,\r\n // eslint-disable-next-line camelcase\r\n messageId: internalPayload.fcmMessageId\r\n };\r\n propagateNotificationPayload(payload, internalPayload);\r\n propagateDataPayload(payload, internalPayload);\r\n propagateFcmOptions(payload, internalPayload);\r\n return payload;\r\n}\r\nfunction propagateNotificationPayload(payload, messagePayloadInternal) {\r\n if (!messagePayloadInternal.notification) {\r\n return;\r\n }\r\n payload.notification = {};\r\n const title = messagePayloadInternal.notification.title;\r\n if (!!title) {\r\n payload.notification.title = title;\r\n }\r\n const body = messagePayloadInternal.notification.body;\r\n if (!!body) {\r\n payload.notification.body = body;\r\n }\r\n const image = messagePayloadInternal.notification.image;\r\n if (!!image) {\r\n payload.notification.image = image;\r\n }\r\n const icon = messagePayloadInternal.notification.icon;\r\n if (!!icon) {\r\n payload.notification.icon = icon;\r\n }\r\n}\r\nfunction propagateDataPayload(payload, messagePayloadInternal) {\r\n if (!messagePayloadInternal.data) {\r\n return;\r\n }\r\n payload.data = messagePayloadInternal.data;\r\n}\r\nfunction propagateFcmOptions(payload, messagePayloadInternal) {\r\n var _a, _b, _c, _d, _e;\r\n // fcmOptions.link value is written into notification.click_action. see more in b/232072111\r\n if (!messagePayloadInternal.fcmOptions &&\r\n !((_a = messagePayloadInternal.notification) === null || _a === void 0 ? void 0 : _a.click_action)) {\r\n return;\r\n }\r\n payload.fcmOptions = {};\r\n const link = (_c = (_b = messagePayloadInternal.fcmOptions) === null || _b === void 0 ? void 0 : _b.link) !== null && _c !== void 0 ? _c : (_d = messagePayloadInternal.notification) === null || _d === void 0 ? void 0 : _d.click_action;\r\n if (!!link) {\r\n payload.fcmOptions.link = link;\r\n }\r\n // eslint-disable-next-line camelcase\r\n const analyticsLabel = (_e = messagePayloadInternal.fcmOptions) === null || _e === void 0 ? void 0 : _e.analytics_label;\r\n if (!!analyticsLabel) {\r\n payload.fcmOptions.analyticsLabel = analyticsLabel;\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction isConsoleMessage(data) {\r\n // This message has a campaign ID, meaning it was sent using the Firebase Console.\r\n return typeof data === 'object' && !!data && CONSOLE_CAMPAIGN_ID in data;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n_mergeStrings('hts/frbslgigp.ogepscmv/ieo/eaylg', 'tp:/ieaeogn-agolai.o/1frlglgc/o');\r\n_mergeStrings('AzSCbw63g1R0nCw85jG8', 'Iaya3yLKwmgvh7cF0q4');\r\nfunction _mergeStrings(s1, s2) {\r\n const resultArray = [];\r\n for (let i = 0; i < s1.length; i++) {\r\n resultArray.push(s1.charAt(i));\r\n if (i < s2.length) {\r\n resultArray.push(s2.charAt(i));\r\n }\r\n }\r\n return resultArray.join('');\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction extractAppConfig(app) {\r\n if (!app || !app.options) {\r\n throw getMissingValueError('App Configuration Object');\r\n }\r\n if (!app.name) {\r\n throw getMissingValueError('App Name');\r\n }\r\n // Required app config keys\r\n const configKeys = [\r\n 'projectId',\r\n 'apiKey',\r\n 'appId',\r\n 'messagingSenderId'\r\n ];\r\n const { options } = app;\r\n for (const keyName of configKeys) {\r\n if (!options[keyName]) {\r\n throw getMissingValueError(keyName);\r\n }\r\n }\r\n return {\r\n appName: app.name,\r\n projectId: options.projectId,\r\n apiKey: options.apiKey,\r\n appId: options.appId,\r\n senderId: options.messagingSenderId\r\n };\r\n}\r\nfunction getMissingValueError(valueName) {\r\n return ERROR_FACTORY.create(\"missing-app-config-values\" /* ErrorCode.MISSING_APP_CONFIG_VALUES */, {\r\n valueName\r\n });\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nclass MessagingService {\r\n constructor(app, installations, analyticsProvider) {\r\n // logging is only done with end user consent. Default to false.\r\n this.deliveryMetricsExportedToBigQueryEnabled = false;\r\n this.onBackgroundMessageHandler = null;\r\n this.onMessageHandler = null;\r\n this.logEvents = [];\r\n this.isLogServiceStarted = false;\r\n const appConfig = extractAppConfig(app);\r\n this.firebaseDependencies = {\r\n app,\r\n appConfig,\r\n installations,\r\n analyticsProvider\r\n };\r\n }\r\n _delete() {\r\n return Promise.resolve();\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nasync function registerDefaultSw(messaging) {\r\n try {\r\n messaging.swRegistration = await navigator.serviceWorker.register(DEFAULT_SW_PATH, {\r\n scope: DEFAULT_SW_SCOPE\r\n });\r\n // The timing when browser updates sw when sw has an update is unreliable from experiment. It\r\n // leads to version conflict when the SDK upgrades to a newer version in the main page, but sw\r\n // is stuck with the old version. For example,\r\n // https://github.com/firebase/firebase-js-sdk/issues/2590 The following line reliably updates\r\n // sw if there was an update.\r\n messaging.swRegistration.update().catch(() => {\r\n /* it is non blocking and we don't care if it failed */\r\n });\r\n }\r\n catch (e) {\r\n throw ERROR_FACTORY.create(\"failed-service-worker-registration\" /* ErrorCode.FAILED_DEFAULT_REGISTRATION */, {\r\n browserErrorMessage: e === null || e === void 0 ? void 0 : e.message\r\n });\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nasync function updateSwReg(messaging, swRegistration) {\r\n if (!swRegistration && !messaging.swRegistration) {\r\n await registerDefaultSw(messaging);\r\n }\r\n if (!swRegistration && !!messaging.swRegistration) {\r\n return;\r\n }\r\n if (!(swRegistration instanceof ServiceWorkerRegistration)) {\r\n throw ERROR_FACTORY.create(\"invalid-sw-registration\" /* ErrorCode.INVALID_SW_REGISTRATION */);\r\n }\r\n messaging.swRegistration = swRegistration;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nasync function updateVapidKey(messaging, vapidKey) {\r\n if (!!vapidKey) {\r\n messaging.vapidKey = vapidKey;\r\n }\r\n else if (!messaging.vapidKey) {\r\n messaging.vapidKey = DEFAULT_VAPID_KEY;\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nasync function getToken$1(messaging, options) {\r\n if (!navigator) {\r\n throw ERROR_FACTORY.create(\"only-available-in-window\" /* ErrorCode.AVAILABLE_IN_WINDOW */);\r\n }\r\n if (Notification.permission === 'default') {\r\n await Notification.requestPermission();\r\n }\r\n if (Notification.permission !== 'granted') {\r\n throw ERROR_FACTORY.create(\"permission-blocked\" /* ErrorCode.PERMISSION_BLOCKED */);\r\n }\r\n await updateVapidKey(messaging, options === null || options === void 0 ? void 0 : options.vapidKey);\r\n await updateSwReg(messaging, options === null || options === void 0 ? void 0 : options.serviceWorkerRegistration);\r\n return getTokenInternal(messaging);\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nasync function logToScion(messaging, messageType, data) {\r\n const eventType = getEventType(messageType);\r\n const analytics = await messaging.firebaseDependencies.analyticsProvider.get();\r\n analytics.logEvent(eventType, {\r\n /* eslint-disable camelcase */\r\n message_id: data[CONSOLE_CAMPAIGN_ID],\r\n message_name: data[CONSOLE_CAMPAIGN_NAME],\r\n message_time: data[CONSOLE_CAMPAIGN_TIME],\r\n message_device_time: Math.floor(Date.now() / 1000)\r\n /* eslint-enable camelcase */\r\n });\r\n}\r\nfunction getEventType(messageType) {\r\n switch (messageType) {\r\n case MessageType.NOTIFICATION_CLICKED:\r\n return 'notification_open';\r\n case MessageType.PUSH_RECEIVED:\r\n return 'notification_foreground';\r\n default:\r\n throw new Error();\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nasync function messageEventListener(messaging, event) {\r\n const internalPayload = event.data;\r\n if (!internalPayload.isFirebaseMessaging) {\r\n return;\r\n }\r\n if (messaging.onMessageHandler &&\r\n internalPayload.messageType === MessageType.PUSH_RECEIVED) {\r\n if (typeof messaging.onMessageHandler === 'function') {\r\n messaging.onMessageHandler(externalizePayload(internalPayload));\r\n }\r\n else {\r\n messaging.onMessageHandler.next(externalizePayload(internalPayload));\r\n }\r\n }\r\n // Log to Scion if applicable\r\n const dataPayload = internalPayload.data;\r\n if (isConsoleMessage(dataPayload) &&\r\n dataPayload[CONSOLE_CAMPAIGN_ANALYTICS_ENABLED] === '1') {\r\n await logToScion(messaging, internalPayload.messageType, dataPayload);\r\n }\r\n}\n\nconst name = \"@firebase/messaging\";\nconst version = \"0.12.1\";\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst WindowMessagingFactory = (container) => {\r\n const messaging = new MessagingService(container.getProvider('app').getImmediate(), container.getProvider('installations-internal').getImmediate(), container.getProvider('analytics-internal'));\r\n navigator.serviceWorker.addEventListener('message', e => messageEventListener(messaging, e));\r\n return messaging;\r\n};\r\nconst WindowMessagingInternalFactory = (container) => {\r\n const messaging = container\r\n .getProvider('messaging')\r\n .getImmediate();\r\n const messagingInternal = {\r\n getToken: (options) => getToken$1(messaging, options)\r\n };\r\n return messagingInternal;\r\n};\r\nfunction registerMessagingInWindow() {\r\n _registerComponent(new Component('messaging', WindowMessagingFactory, \"PUBLIC\" /* ComponentType.PUBLIC */));\r\n _registerComponent(new Component('messaging-internal', WindowMessagingInternalFactory, \"PRIVATE\" /* ComponentType.PRIVATE */));\r\n registerVersion(name, version);\r\n // BUILD_TARGET will be replaced by values like esm5, esm2017, cjs5, etc during the compilation\r\n registerVersion(name, version, 'esm2017');\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Checks if all required APIs exist in the browser.\r\n * @returns a Promise that resolves to a boolean.\r\n *\r\n * @public\r\n */\r\nasync function isWindowSupported() {\r\n try {\r\n // This throws if open() is unsupported, so adding it to the conditional\r\n // statement below can cause an uncaught error.\r\n await validateIndexedDBOpenable();\r\n }\r\n catch (e) {\r\n return false;\r\n }\r\n // firebase-js-sdk/issues/2393 reveals that idb#open in Safari iframe and Firefox private browsing\r\n // might be prohibited to run. In these contexts, an error would be thrown during the messaging\r\n // instantiating phase, informing the developers to import/call isSupported for special handling.\r\n return (typeof window !== 'undefined' &&\r\n isIndexedDBAvailable() &&\r\n areCookiesEnabled() &&\r\n 'serviceWorker' in navigator &&\r\n 'PushManager' in window &&\r\n 'Notification' in window &&\r\n 'fetch' in window &&\r\n ServiceWorkerRegistration.prototype.hasOwnProperty('showNotification') &&\r\n PushSubscription.prototype.hasOwnProperty('getKey'));\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nasync function deleteToken$1(messaging) {\r\n if (!navigator) {\r\n throw ERROR_FACTORY.create(\"only-available-in-window\" /* ErrorCode.AVAILABLE_IN_WINDOW */);\r\n }\r\n if (!messaging.swRegistration) {\r\n await registerDefaultSw(messaging);\r\n }\r\n return deleteTokenInternal(messaging);\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction onMessage$1(messaging, nextOrObserver) {\r\n if (!navigator) {\r\n throw ERROR_FACTORY.create(\"only-available-in-window\" /* ErrorCode.AVAILABLE_IN_WINDOW */);\r\n }\r\n messaging.onMessageHandler = nextOrObserver;\r\n return () => {\r\n messaging.onMessageHandler = null;\r\n };\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Retrieves a Firebase Cloud Messaging instance.\r\n *\r\n * @returns The Firebase Cloud Messaging instance associated with the provided firebase app.\r\n *\r\n * @public\r\n */\r\nfunction getMessagingInWindow(app = getApp()) {\r\n // Conscious decision to make this async check non-blocking during the messaging instance\r\n // initialization phase for performance consideration. An error would be thrown latter for\r\n // developer's information. Developers can then choose to import and call `isSupported` for\r\n // special handling.\r\n isWindowSupported().then(isSupported => {\r\n // If `isWindowSupported()` resolved, but returned false.\r\n if (!isSupported) {\r\n throw ERROR_FACTORY.create(\"unsupported-browser\" /* ErrorCode.UNSUPPORTED_BROWSER */);\r\n }\r\n }, _ => {\r\n // If `isWindowSupported()` rejected.\r\n throw ERROR_FACTORY.create(\"indexed-db-unsupported\" /* ErrorCode.INDEXED_DB_UNSUPPORTED */);\r\n });\r\n return _getProvider(getModularInstance(app), 'messaging').getImmediate();\r\n}\r\n/**\r\n * Subscribes the {@link Messaging} instance to push notifications. Returns an Firebase Cloud\r\n * Messaging registration token that can be used to send push messages to that {@link Messaging}\r\n * instance.\r\n *\r\n * If a notification permission isn't already granted, this method asks the user for permission. The\r\n * returned promise rejects if the user does not allow the app to show notifications.\r\n *\r\n * @param messaging - The {@link Messaging} instance.\r\n * @param options - Provides an optional vapid key and an optinoal service worker registration\r\n *\r\n * @returns The promise resolves with an FCM registration token.\r\n *\r\n * @public\r\n */\r\nasync function getToken(messaging, options) {\r\n messaging = getModularInstance(messaging);\r\n return getToken$1(messaging, options);\r\n}\r\n/**\r\n * Deletes the registration token associated with this {@link Messaging} instance and unsubscribes\r\n * the {@link Messaging} instance from the push subscription.\r\n *\r\n * @param messaging - The {@link Messaging} instance.\r\n *\r\n * @returns The promise resolves when the token has been successfully deleted.\r\n *\r\n * @public\r\n */\r\nfunction deleteToken(messaging) {\r\n messaging = getModularInstance(messaging);\r\n return deleteToken$1(messaging);\r\n}\r\n/**\r\n * When a push message is received and the user is currently on a page for your origin, the\r\n * message is passed to the page and an `onMessage()` event is dispatched with the payload of\r\n * the push message.\r\n *\r\n *\r\n * @param messaging - The {@link Messaging} instance.\r\n * @param nextOrObserver - This function, or observer object with `next` defined,\r\n * is called when a message is received and the user is currently viewing your page.\r\n * @returns To stop listening for messages execute this returned function.\r\n *\r\n * @public\r\n */\r\nfunction onMessage(messaging, nextOrObserver) {\r\n messaging = getModularInstance(messaging);\r\n return onMessage$1(messaging, nextOrObserver);\r\n}\n\n/**\r\n * Firebase Cloud Messaging\r\n *\r\n * @packageDocumentation\r\n */\r\nregisterMessagingInWindow();\n\nexport { deleteToken, getMessagingInWindow as getMessaging, getToken, isWindowSupported as isSupported, onMessage };\n//# sourceMappingURL=index.esm2017.js.map\n","import { registerVersion } from '@firebase/app';\nexport * from '@firebase/app';\n\nvar name = \"firebase\";\nvar version = \"9.16.0\";\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nregisterVersion(name, version, 'app');\n//# sourceMappingURL=index.esm.js.map\n","export * from '@firebase/messaging';\n//# sourceMappingURL=index.esm.js.map\n","import { w as wrap, r as replaceTraps } from './wrap-idb-value.js';\nexport { u as unwrap, w as wrap } from './wrap-idb-value.js';\n\n/**\n * Open a database.\n *\n * @param name Name of the database.\n * @param version Schema version.\n * @param callbacks Additional callbacks.\n */\nfunction openDB(name, version, { blocked, upgrade, blocking, terminated } = {}) {\n const request = indexedDB.open(name, version);\n const openPromise = wrap(request);\n if (upgrade) {\n request.addEventListener('upgradeneeded', (event) => {\n upgrade(wrap(request.result), event.oldVersion, event.newVersion, wrap(request.transaction));\n });\n }\n if (blocked)\n request.addEventListener('blocked', () => blocked());\n openPromise\n .then((db) => {\n if (terminated)\n db.addEventListener('close', () => terminated());\n if (blocking)\n db.addEventListener('versionchange', () => blocking());\n })\n .catch(() => { });\n return openPromise;\n}\n/**\n * Delete a database.\n *\n * @param name Name of the database.\n */\nfunction deleteDB(name, { blocked } = {}) {\n const request = indexedDB.deleteDatabase(name);\n if (blocked)\n request.addEventListener('blocked', () => blocked());\n return wrap(request).then(() => undefined);\n}\n\nconst readMethods = ['get', 'getKey', 'getAll', 'getAllKeys', 'count'];\nconst writeMethods = ['put', 'add', 'delete', 'clear'];\nconst cachedMethods = new Map();\nfunction getMethod(target, prop) {\n if (!(target instanceof IDBDatabase &&\n !(prop in target) &&\n typeof prop === 'string')) {\n return;\n }\n if (cachedMethods.get(prop))\n return cachedMethods.get(prop);\n const targetFuncName = prop.replace(/FromIndex$/, '');\n const useIndex = prop !== targetFuncName;\n const isWrite = writeMethods.includes(targetFuncName);\n if (\n // Bail if the target doesn't exist on the target. Eg, getAll isn't in Edge.\n !(targetFuncName in (useIndex ? IDBIndex : IDBObjectStore).prototype) ||\n !(isWrite || readMethods.includes(targetFuncName))) {\n return;\n }\n const method = async function (storeName, ...args) {\n // isWrite ? 'readwrite' : undefined gzipps better, but fails in Edge :(\n const tx = this.transaction(storeName, isWrite ? 'readwrite' : 'readonly');\n let target = tx.store;\n if (useIndex)\n target = target.index(args.shift());\n // Must reject if op rejects.\n // If it's a write operation, must reject if tx.done rejects.\n // Must reject with op rejection first.\n // Must resolve with op value.\n // Must handle both promises (no unhandled rejections)\n return (await Promise.all([\n target[targetFuncName](...args),\n isWrite && tx.done,\n ]))[0];\n };\n cachedMethods.set(prop, method);\n return method;\n}\nreplaceTraps((oldTraps) => ({\n ...oldTraps,\n get: (target, prop, receiver) => getMethod(target, prop) || oldTraps.get(target, prop, receiver),\n has: (target, prop) => !!getMethod(target, prop) || oldTraps.has(target, prop),\n}));\n\nexport { deleteDB, openDB };\n","const instanceOfAny = (object, constructors) => constructors.some((c) => object instanceof c);\n\nlet idbProxyableTypes;\nlet cursorAdvanceMethods;\n// This is a function to prevent it throwing up in node environments.\nfunction getIdbProxyableTypes() {\n return (idbProxyableTypes ||\n (idbProxyableTypes = [\n IDBDatabase,\n IDBObjectStore,\n IDBIndex,\n IDBCursor,\n IDBTransaction,\n ]));\n}\n// This is a function to prevent it throwing up in node environments.\nfunction getCursorAdvanceMethods() {\n return (cursorAdvanceMethods ||\n (cursorAdvanceMethods = [\n IDBCursor.prototype.advance,\n IDBCursor.prototype.continue,\n IDBCursor.prototype.continuePrimaryKey,\n ]));\n}\nconst cursorRequestMap = new WeakMap();\nconst transactionDoneMap = new WeakMap();\nconst transactionStoreNamesMap = new WeakMap();\nconst transformCache = new WeakMap();\nconst reverseTransformCache = new WeakMap();\nfunction promisifyRequest(request) {\n const promise = new Promise((resolve, reject) => {\n const unlisten = () => {\n request.removeEventListener('success', success);\n request.removeEventListener('error', error);\n };\n const success = () => {\n resolve(wrap(request.result));\n unlisten();\n };\n const error = () => {\n reject(request.error);\n unlisten();\n };\n request.addEventListener('success', success);\n request.addEventListener('error', error);\n });\n promise\n .then((value) => {\n // Since cursoring reuses the IDBRequest (*sigh*), we cache it for later retrieval\n // (see wrapFunction).\n if (value instanceof IDBCursor) {\n cursorRequestMap.set(value, request);\n }\n // Catching to avoid \"Uncaught Promise exceptions\"\n })\n .catch(() => { });\n // This mapping exists in reverseTransformCache but doesn't doesn't exist in transformCache. This\n // is because we create many promises from a single IDBRequest.\n reverseTransformCache.set(promise, request);\n return promise;\n}\nfunction cacheDonePromiseForTransaction(tx) {\n // Early bail if we've already created a done promise for this transaction.\n if (transactionDoneMap.has(tx))\n return;\n const done = new Promise((resolve, reject) => {\n const unlisten = () => {\n tx.removeEventListener('complete', complete);\n tx.removeEventListener('error', error);\n tx.removeEventListener('abort', error);\n };\n const complete = () => {\n resolve();\n unlisten();\n };\n const error = () => {\n reject(tx.error || new DOMException('AbortError', 'AbortError'));\n unlisten();\n };\n tx.addEventListener('complete', complete);\n tx.addEventListener('error', error);\n tx.addEventListener('abort', error);\n });\n // Cache it for later retrieval.\n transactionDoneMap.set(tx, done);\n}\nlet idbProxyTraps = {\n get(target, prop, receiver) {\n if (target instanceof IDBTransaction) {\n // Special handling for transaction.done.\n if (prop === 'done')\n return transactionDoneMap.get(target);\n // Polyfill for objectStoreNames because of Edge.\n if (prop === 'objectStoreNames') {\n return target.objectStoreNames || transactionStoreNamesMap.get(target);\n }\n // Make tx.store return the only store in the transaction, or undefined if there are many.\n if (prop === 'store') {\n return receiver.objectStoreNames[1]\n ? undefined\n : receiver.objectStore(receiver.objectStoreNames[0]);\n }\n }\n // Else transform whatever we get back.\n return wrap(target[prop]);\n },\n set(target, prop, value) {\n target[prop] = value;\n return true;\n },\n has(target, prop) {\n if (target instanceof IDBTransaction &&\n (prop === 'done' || prop === 'store')) {\n return true;\n }\n return prop in target;\n },\n};\nfunction replaceTraps(callback) {\n idbProxyTraps = callback(idbProxyTraps);\n}\nfunction wrapFunction(func) {\n // Due to expected object equality (which is enforced by the caching in `wrap`), we\n // only create one new func per func.\n // Edge doesn't support objectStoreNames (booo), so we polyfill it here.\n if (func === IDBDatabase.prototype.transaction &&\n !('objectStoreNames' in IDBTransaction.prototype)) {\n return function (storeNames, ...args) {\n const tx = func.call(unwrap(this), storeNames, ...args);\n transactionStoreNamesMap.set(tx, storeNames.sort ? storeNames.sort() : [storeNames]);\n return wrap(tx);\n };\n }\n // Cursor methods are special, as the behaviour is a little more different to standard IDB. In\n // IDB, you advance the cursor and wait for a new 'success' on the IDBRequest that gave you the\n // cursor. It's kinda like a promise that can resolve with many values. That doesn't make sense\n // with real promises, so each advance methods returns a new promise for the cursor object, or\n // undefined if the end of the cursor has been reached.\n if (getCursorAdvanceMethods().includes(func)) {\n return function (...args) {\n // Calling the original function with the proxy as 'this' causes ILLEGAL INVOCATION, so we use\n // the original object.\n func.apply(unwrap(this), args);\n return wrap(cursorRequestMap.get(this));\n };\n }\n return function (...args) {\n // Calling the original function with the proxy as 'this' causes ILLEGAL INVOCATION, so we use\n // the original object.\n return wrap(func.apply(unwrap(this), args));\n };\n}\nfunction transformCachableValue(value) {\n if (typeof value === 'function')\n return wrapFunction(value);\n // This doesn't return, it just creates a 'done' promise for the transaction,\n // which is later returned for transaction.done (see idbObjectHandler).\n if (value instanceof IDBTransaction)\n cacheDonePromiseForTransaction(value);\n if (instanceOfAny(value, getIdbProxyableTypes()))\n return new Proxy(value, idbProxyTraps);\n // Return the same value back if we're not going to transform it.\n return value;\n}\nfunction wrap(value) {\n // We sometimes generate multiple promises from a single IDBRequest (eg when cursoring), because\n // IDB is weird and a single IDBRequest can yield many responses, so these can't be cached.\n if (value instanceof IDBRequest)\n return promisifyRequest(value);\n // If we've already transformed this value before, reuse the transformed value.\n // This is faster, but it also provides object equality.\n if (transformCache.has(value))\n return transformCache.get(value);\n const newValue = transformCachableValue(value);\n // Not all types are transformed.\n // These may be primitive types, so they can't be WeakMap keys.\n if (newValue !== value) {\n transformCache.set(value, newValue);\n reverseTransformCache.set(newValue, value);\n }\n return newValue;\n}\nconst unwrap = (value) => reverseTransformCache.get(value);\n\nexport { reverseTransformCache as a, instanceOfAny as i, replaceTraps as r, unwrap as u, wrap as w };\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","var getProto = Object.getPrototypeOf ? (obj) => (Object.getPrototypeOf(obj)) : (obj) => (obj.__proto__);\nvar leafPrototypes;\n// create a fake namespace object\n// mode & 1: value is a module id, require it\n// mode & 2: merge all properties of value into the ns\n// mode & 4: return value when already ns object\n// mode & 16: return value when it's Promise-like\n// mode & 8|1: behave like require\n__webpack_require__.t = function(value, mode) {\n\tif(mode & 1) value = this(value);\n\tif(mode & 8) return value;\n\tif(typeof value === 'object' && value) {\n\t\tif((mode & 4) && value.__esModule) return value;\n\t\tif((mode & 16) && typeof value.then === 'function') return value;\n\t}\n\tvar ns = Object.create(null);\n\t__webpack_require__.r(ns);\n\tvar def = {};\n\tleafPrototypes = leafPrototypes || [null, getProto({}), getProto([]), getProto(getProto)];\n\tfor(var current = mode & 2 && value; typeof current == 'object' && !~leafPrototypes.indexOf(current); current = getProto(current)) {\n\t\tObject.getOwnPropertyNames(current).forEach((key) => (def[key] = () => (value[key])));\n\t}\n\tdef['default'] = () => (value);\n\t__webpack_require__.d(ns, def);\n\treturn ns;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"\" + chunkId + \".dev.js\";\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","var inProgress = {};\nvar dataWebpackPrefix = \"tinode-webapp:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = (url, done, key, chunkId) => {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tscript.timeout = 120;\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = (prev, event) => {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach((fn) => (fn(event)));\n\t\tif(prev) return prev(event);\n\t};\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.p = \"/umd/\";","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t\"index\": 0\n};\n\n__webpack_require__.f.j = (chunkId, promises) => {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\n\t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n\t\t\t// a Promise means \"currently loading\".\n\t\t\tif(installedChunkData) {\n\t\t\t\tpromises.push(installedChunkData[2]);\n\t\t\t} else {\n\t\t\t\tif(true) { // all chunks have JS\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise((resolve, reject) => (installedChunkData = installedChunks[chunkId] = [resolve, reject]));\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = (event) => {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t} else installedChunks[chunkId] = 0;\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n// no on chunks loaded\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\n}\n\nvar chunkLoadingGlobal = globalThis[\"webpackChunktinode_webapp\"] = globalThis[\"webpackChunktinode_webapp\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","// Put all packages together.\n// Used to generate umd/index.prod.js\n\nimport React from 'react';\nimport { createRoot } from 'react-dom/client';\n\nimport { IntlProvider } from 'react-intl';\n\nimport TinodeWeb from './views/tinode-web.jsx';\nimport HashNavigation from './lib/navigation.js';\n\n// Insert google analytics script and tag if configured.\nif (FIREBASE_INIT && FIREBASE_INIT.measurementId) {\n const head = document.getElementsByTagName('head')[0];\n let script = document.createElement('script');\n script.src = 'https://www.googletagmanager.com/gtag/js?id=' + FIREBASE_INIT.measurementId;\n script.async = true;\n head.prepend(script);\n window.dataLayer = window.dataLayer || [];\n function gtag(){dataLayer.push(arguments);}\n gtag('js', new Date());\n gtag('config', FIREBASE_INIT.measurementId);\n}\n\n// Allow loading translation strings for just one language.\nconst messageLoader = {\n 'de': _ => import('./i18n.min/de.json'),\n 'en': _ => import('./i18n.min/en.json'),\n 'es': _ => import('./i18n.min/es.json'),\n 'fr': _ => import('./i18n.min/fr.json'),\n 'ko': _ => import('./i18n.min/ko.json'),\n 'ro': _ => import('./i18n.min/ro.json'),\n 'ru': _ => import('./i18n.min/ru.json'),\n 'zh': _ => import('./i18n.min/zh.json'),\n 'zh-TW': _ => import('./i18n.min/zh-TW.json')\n};\n\n// Detect human language to use in the UI:\n// Check parameters from URL hash #?hl=ru, then browser, then use 'en' as a fallback.\nconst { params } = HashNavigation.parseUrlHash(window.location.hash);\nconst language = (params && params.hl) ||\n (navigator.languages && navigator.languages[0]) ||\n navigator.language ||\n navigator.userLanguage ||\n 'en';\n\n// Make sure names like 'en_GB' and 'en-GB' consistently use '-'.\nconst normalized = language.replace('_', '-');\n// Get the base language 'en' from a more specific 'en-US' as a partial fallback.\nconst baseLanguage = normalized.split('-')[0].toLowerCase();\n\n// Try the full locale first, then the locale without the region code, fallback to 'en'.\nconst htmlLang = messageLoader[normalized] ? language : messageLoader[baseLanguage] ? baseLanguage : 'en';\n\n// Set lang attribute of the HTML element: \ndocument.getElementsByTagName('html')[0].setAttribute('lang', htmlLang);\n\n// Render the app.\nconst root = createRoot(document.getElementById('mountPoint'));\nmessageLoader[htmlLang]().then(messages =>\n root.render(\n \n \n \n));\n"],"names":["PACKAGE_VERSION","APP_NAME","API_KEY","KNOWN_HOSTS","hosted","local","DEFAULT_HOST","LOGGING_ENABLED","KEYPRESS_DELAY","READ_DELAY","MIN_TAG_LENGTH","MAX_TAG_LENGTH","MAX_TAG_COUNT","DEFAULT_P2P_ACCESS_MODE","NEW_GRP_ACCESS_MODE","CHANNEL_ACCESS_MODE","NO_ACCESS_MODE","MEDIA_BREAKPOINT","REM_SIZE","AVATAR_SIZE","MAX_AVATAR_BYTES","BROKEN_IMAGE_SIZE","NO_DIMENSIONS_VIDEO","MESSAGES_PAGE","MAX_INBAND_ATTACHMENT_SIZE","MAX_EXTERN_ATTACHMENT_SIZE","MAX_IMAGE_DIM","IMAGE_PREVIEW_DIM","VIDEO_PREVIEW_DIM","IMAGE_THUMBNAIL_DIM","VIDEO_THUMBNAIL_WIDTH","MAX_ONLINE_IN_TOPIC","MAX_TITLE_LENGTH","MAX_TOPIC_DESCRIPTION_LENGTH","MAX_PEER_TITLE_LENGTH","MESSAGE_PREVIEW_LENGTH","QUOTED_REPLY_LENGTH","FORWARDED_PREVIEW_LENGTH","EDIT_PREVIEW_LENGTH","MIN_DURATION","MAX_DURATION","LINK_CONTACT_US","LINK_PRIVACY_POLICY","LINK_TERMS_OF_SERVICE","CALL_STATE_NONE","CALL_STATE_OUTGOING_INITATED","CALL_STATE_INCOMING_RECEIVED","CALL_STATE_IN_PROGRESS","CALL_HEAD_STARTED","SUPPORTED_IMAGE_FORMATS","MIME_EXTENSIONS","makeImageUrl","photo","ref","data","type","mime","startsWith","fitImageSize","width","height","maxWidth","maxHeight","forceSquare","Math","min","scale","size","dstWidth","dstHeight","srcWidth","srcHeight","xoffset","yoffset","fileNameForMime","fname","idx","indexOf","ext","at","lastIndexOf","substring","imageScaled","fileOrBlob","maxSize","Promise","resolve","reject","img","Image","crossOrigin","onerror","err","Error","onload","URL","revokeObjectURL","src","dim","canvas","document","createElement","ctx","getContext","imageSmoothingEnabled","drawImage","includes","blob","toBlob","length","clearRect","name","createObjectURL","imageCrop","objURL","left","top","_","fileToBase64","file","reader","FileReader","error","bits","result","split","readAsDataURL","blobToBase64","filePasted","event","onImageSuccess","onAttachmentSuccess","onError","items","clipboardData","originalEvent","i","item","kind","getAsFile","console","getMimeType","header","exec","base64EncodedLen","n","floor","base64DecodedLen","base64ReEncode","str","replace","btoa","atob","base64ToBlob","bin","buf","ArrayBuffer","arr","Uint8Array","charCodeAt","Blob","intArrayToBase64","Array","isArray","forEach","b","String","fromCharCode","window","base64ToIntArray","b64","c","push","React","defineMessages","Drafty","AudioPlayer","CallMessage","CallStatus","InlineVideo","LazyImage","UploadingImage","idToColorClass","secondsToTime","shortenFileName","cancelablePromise","sanitizeUrlForMime","messages","drafty_form","id","defaultMessage","drafty_attachment","drafty_image","drafty_video","drafty_unknown","fullFormatter","style","values","key","stack","quoteFormatter","call","el","tagName","attr","attrValue","authorizeURL","duration","undefined","preview","loading","className","handleImageData","onClick","onFormButtonClick","inner","Children","map","child","join","val","onQuoteClick","callState","state","incoming","handleVideoData","Fragment","body","trim","formatMessage","concat","viewportWidth","minWidth","minHeight","isProcessing","alt","max","onImagePreview","onVideoPreview","previewFormatter","inlineImageAttr","title","inlineVideoAttr","quoteImageOrVideo","isVideo","promise","premime","preref","fetch","then","evt","ok","status","statusText","scaled","catch","replyFormatter","isImage","loadedPromise","warn","message","whenDone","detectServerAddress","host","location","protocol","hostname","port","isSecureConnection","isLocalHost","LocalStorageUtil","setObject","value","localStorage","setItem","JSON","stringify","getObject","getItem","parse","updateObject","oldVal","Object","assign","removeItem","HashNavigation","parseUrlHash","hash","parts","params","path","arg","eq","slice","decodeURIComponent","navigateTo","url","composeUrlHash","args","hasOwnProperty","encodeURIComponent","addUrlParam","parsed","removeUrlParam","setUrlSidePanel","sidepanel","setUrlInfoPanel","infopanel","info","setUrlTopic","topic","shortDateFormat","locale","navigator","userLanguage","language","now","Date","getFullYear","getMonth","getDate","toLocaleTimeString","hour12","hour","minute","toLocaleDateString","month","day","year","relativeDateFormat","thenDays","getTime","getTimezoneOffset","nowDays","diff","abs","Intl","RelativeTimeFormat","numeric","format","DateTimeFormat","seconds","fixedMin","hours","sec","bytesToHumanSize","bytes","sizes","bucket","log2","count","pow","round","toFixed","filename","maxLength","stringToColorHash","letterTileColorId","userId","light","fg","flagEmoji","countryCode","codePoints","toUpperCase","char","fromCodePoint","Tinode","updateFavicon","oldIcon","getElementById","head","getElementsByTagName","newIcon","rel","href","removeChild","appendChild","theCard","fn","imageUrl","imageMimeType","note","card","DEL_CHAR","mimeType","matches","arrayEqual","a","sort","l","asPhone","test","asEmail","isUrlRelative","sanitizeUrl","allowedSchemes","schemes","re","RegExp","mimeMajor","sanitizedUrl","deliveryMarker","received","MESSAGE_STATUS_SENDING","MESSAGE_STATUS_FAILED","color","MESSAGE_STATUS_SENT","MESSAGE_STATUS_RECEIVED","MESSAGE_STATUS_READ","hasCanceled","wrappedPromise","isCanceled","cancel","clipStr","FormattedMessage","CheckBox","EditAccountView","PureComponent","constructor","props","handleCheckboxClick","bind","what","checked","onToggleMessageSounds","onTogglePushNotifications","onToggleIncognitoMode","render","messageSounds","desktopAlertsEnabled","desktopAlerts","incognitoMode","injectIntl","InPlaceEdit","PermissionsEditor","delete_account","delete_account_warning","AccSecurityView","Component","me","tinode","getMeTopic","blockedCount","contacts","acs","isJoiner","defacs","getDefaultAccess","auth","anon","showPermissionEditorFor","handlePasswordUpdate","handleLaunchPermissionsEditor","handleHidePermissionsEditor","handlePermissionsChanged","handleDeleteAccount","pwd","setState","password","onUpdatePassword","which","editedPermissions","perm","onUpdateAccountDesc","newState","e","preventDefault","intl","onShowAlert","onDeleteAccount","password_unchanged","onLogout","onShowBlocked","AccSupportView","getLibrary","serverVersion","serverAddress","AvatarUpload","BadgeList","_clip","AccountSettingsView","fullName","public","description","avatar","onNavigate","myUserId","trustedBadges","ContactList","archived_contacts_title","ContactsView","handleAction","deriveStateFromProps","unreadThreads","archivedCount","chatList","blocked","private","arch","archive","unread","touched","action","contactList","componentDidUpdate","prevProps","prevState","action_ignored","onShowArchive","no_contacts","connected","topicSelected","onTopicSelected","showContextMenu","Suspense","AvatarCrop","PhoneEdit","lazy","VisiblePassword","CreateAccountView","login","meth","email","tel","uploadUrl","newAvatar","newAvatarMime","errorCleared","buttonDisabled","saveToken","handleLoginChange","handlePasswordChange","handleEmailChange","handlePhoneChange","handleFnChange","handleImageChanged","handleToggleSaveToken","handleAvatarCropped","handleAvatarCropCancel","uploadAvatar","handleSubmit","connect","target","number","onCreateAccount","readyToUpload","image","uploader","getLargeFileHelper","upload","finally","method","getServerParam","submitClasses","disabled","login_prompt","password_prompt","full_name_prompt","email_prompt","onShowCountrySelector","stay_logged_in","AccessMode","ErrorPanel","GroupManager","MenuCancel","TopicCommon","TopicSecurity","general","security","members","crop","perm_want","perm_given","perm_auth","perm_anon","perm_user","edit_permissions","InfoView","owner","admin","sharer","deleter","muted","address","groupTopic","channel","selectedContact","access","modeGiven","modeWant","modeGiven2","modeWant2","previousMetaDesc","previousSubsUpdated","resetSubs","resetDesc","resetTags","onMetaDesc","onSubsUpdated","handleMuted","handleUnarchive","handleShowAddMembers","handleMemberUpdateRequest","handleMemberSelected","handleContextMenu","handleBackNavigate","getTopic","componentWillUnmount","getType","user2","subscriber","getGiven","getWant","subscribers","sub","getAccessMode","badges","trusted","entries","isOwner","isAdmin","isSharer","isDeleter","isMuted","comment","archived","isArchived","isGroupType","isChannelType","chan","getMode","getMeta","startMetaQuery","withTags","build","desc","subs","onTopicDescUpdate","ignored","onChangePermissions","ignored2","onTopicUnArchive","onTopicDescUpdateRequest","userPermissionsEdited","uid","toEdit","toCompare","toSkip","titleEdit","titleCompare","userTitle","userAvatar","encode","user","userPermissionsTitle","userPermissionsAvatar","immutablePermissions","editedPermissionsTitle","immutablePermissionsTitle","editedPermissionsSkipped","onInitFind","added","removed","onMemberUpdateRequest","panel","topicName","isMe","menuItems","handler","x","y","view","shift","panelTitle","displayMobile","errorLevel","errorText","searchableContacts","mode","onCredAdd","onTopicTagsUpdateRequest","onCredConfirm","onCredDelete","onDeleteMessages","onLeaveTopic","onBlockTopic","onReportTopic","no_members","LoginView","hostName","persist","onPersistenceChange","onLogin","LogoView","version","CallPanel","ChatMessage","ContactBadges","DocPreview","GroupSubs","ImagePreview","Invitation","LetterTile","LoadSpinner","MetaMessage","SendMessage","VideoPreview","NOTIFICATION_EXEC_INTERVAL","SHOW_GO_TO_LAST_DIST","online_now","last_seen","not_found","file_attachment_too_large","invalid_content","editing_message","drag_file","isUnconfirmed","ex","getExcessive","isPeerRestricted","ms","getMissing","shouldPresentCallPanel","MessagesView","getDerivedStateFromProps","leave","sendMessage","retrySend","sendImageAttachment","sendVideoAttachment","sendFileAttachment","sendAudioAttachment","sendKeyPress","subscribe","handleScrollReference","mountDnDEvents","handleScrollEvent","handleDescChange","handleSubsUpdated","handleMessageUpdate","handleAllMessagesReceived","handleInfoReceipt","handleExpandMedia","handleClosePreview","handleFormResponse","handleContextClick","handleShowMessageContextMenu","handleNewChatAcceptance","handleEnablePeer","handleAttachFile","handleAttachImageOrVideo","handleCancelUpload","postReadNotification","clearNotificationQueue","goToLatestMessage","handleFileDrop","handlePickReply","handleEditMessage","handleCancelReply","handleQuoteClick","handleCallHangup","isDragEnabled","handleDragIn","handleDragOut","handleDrag","handleDrop","chatMessageRefs","getOrCreateMessageRef","dragCounter","dndRef","readNotificationQueue","readNotificationTimer","keyPressTimer","seqId","createRef","componentDidMount","messagesScroller","addEventListener","removeEventListener","messageCount","scrollPosition","scrollTop","scrollHeight","offsetHeight","isNewGroupTopicName","rtcPanel","callSeq","onData","onAllMessagesReceived","onInfo","onPres","applicationVisible","ready","_new","isP2PType","withDesc","nextProps","nextState","latestClearId","onlineSubs","isVerified","isStaff","isDangerous","deleted","docPreview","imagePreview","imagePostview","videoPreview","videoPostview","typingIndicator","fetchingMessages","peerMessagingDisabled","reply","contentToEdit","showGoToLastButton","dragging","_deleted","forwardMessage","content","seq","online","peer","p2pPeerDesc","maxClearId","callTopic","isWriter","isReader","readingBlocked","unconformed","unconfirmed","isSubscribed","newTopic","newTopicParams","_topicName","getQuery","withLaterDesc","withLaterSub","withLaterData","withLaterDel","setQuery","ctrl","code","onNewTopicCreated","calls","queuedMessages","pub","_sending","webrtc","delMessagesList","blankState","oldTopicName","isTopicCached","oldTopic","node","pos","msgHasMoreMessages","getMessagesPage","dnd","setInterval","clearInterval","sendAt","noteRead","setMilliseconds","getMilliseconds","msg","clearTimeout","isNewMessage","msgStatus","from","setTimeout","forceUpdate","video","text","attachJSON","searchParams","resp","set","search","open","stopPropagation","pageY","pageX","messageSpecificMenuItems","userFrom","userName","onNewChat","audio","noteRecording","noteKeyPress","uploadCompletionPromise","editing","append","sanitizeEntities","maxInbandAttachmentSize","cannot_initiate_upload","attachFile","urlPromise","maxExternAttachmentSize","limit","onVideoCallClosed","onCallHangup","caption","insertImage","_tempPreview","appendLineBreak","videoBlob","previewBlob","uploads","all","b64s","v64","i64","insertVideo","b64conv","files","appendAudio","found","findMessage","_cancelled","senderId","senderName","init","isValid","replyContent","wrapInto","quote","onCancelForwardMessage","editable","toMarkdown","replyToSeq","current","scrollIntoView","block","behavior","classList","add","remove","dataTransfer","clearData","component","hideSelf","component2","callAudioOnly","onCallInvite","onCallSendOffer","onCallIceCandidate","onCallSendAnswer","isChannel","icon_badges","verified","icon","staff","danger","messageNodes","previousFrom","prevDate","chatBoxClass","prev","next","nextFrom","sequence","thisFrom","isReply","deliveryStatus","userDesc","parseInt","isNaN","hi","thisDate","ts","toDateString","_uploader","lastSeen","cont","getContact","isP2PTopicName","seen","when","titleClass","messagesComponent","onHideMessagesView","NewTopicById","NewTopicGroup","SearchContacts","search_for_contacts","search_no_results","search_placeholder","NewTopicView","tabSelected","searchQuery","handleTabClick","handleSearchContacts","handleSearchResultSelected","handleNewGroupSubmit","handleGroupByID","currentTarget","dataset","query","onSearchContacts","isNullValue","onCreateTopic","dataUrl","priv","tags","no_contacts_placeholder","searchResults","PasswordResetView","sent","haveCode","handleCodeChange","handleShowCodeField","token","scheme","onReset","cred","secret","onRequest","showCredentialInput","showPasswordInput","passwordInput","placeholder","emailInput","phoneInput","sentNotification","phone","codeInput","numbers_only","credentialInput","marginRight","HostSelector","SettingsView","transport","secureConnection","handleTransportSelected","handleServerAddressChange","handleToggleSecure","onUpdate","names","def","ws","lp","transportOptions","SideNavbar","AccNotificationsView","ValidationView","register","settings","edit","notif","support","newtpk","reset","SidepanelView","handleNewTopic","onCancel","onSignUp","onSettings","errorAction","errorActionText","loadSpinnerVisible","loginDisabled","onLoginRequest","onGlobalSettings","onUpdateAccountTags","credCode","credMethod","credToken","onValidateCredentials","onPasswordResetRequest","onResetPassword","initializeApp","firebaseInitApp","getMessaging","firebaseGetMessaging","getToken","firebaseGetToken","deleteToken","firebaseDelToken","onMessage","firebaseOnMessage","Alert","ContextMenu","ForwardDialog","CallIncoming","PhoneCountrySelector","POP_SOUND","Audio","reconnect_countdown","reconnect_now","push_init_failed","invalid_security_token","no_connection","code_doesnot_match","menu_item_info","menu_item_audio_call","menu_item_video_call","cred_confirmed_successfully","TinodeWeb","selfRef","getBlankState","handleResize","handleHashRoute","handleOnline","checkForAppUpdate","handleVisibilityEvent","handleError","handleLoginRequest","handlePersistenceChange","handleConnected","handleAutoreconnectIteration","doLogin","handleLoginSuccessful","handleDisconnect","tnMeMetaDesc","tnMeContactUpdate","tnMeSubsUpdated","resetContactList","tnInitFind","tnFndSubsUpdated","handleTopicSelected","handleHideMessagesView","handleSendMessage","handleNewChatInvitation","handleNewAccount","handleNewAccountRequest","handleUpdatePasswordRequest","handleUpdateAccountTagsRequest","handleToggleIncognitoMode","handleSettings","handleGlobalSettings","handleShowArchive","handleShowBlocked","handleToggleMessageSounds","handleCredAdd","handleCredDelete","handleCredConfirm","initFCMessaging","toggleFCMToken","handlePushMessage","handleSidepanelCancel","handleStartTopicRequest","handleNewTopicCreated","handleTopicUpdateRequest","handleChangePermissions","handleTagsUpdateRequest","handleLogout","handleDeleteTopicRequest","handleDeleteMessagesRequest","handleLeaveUnsubRequest","handleBlockTopicRequest","handleReportTopic","handleShowContextMenu","defaultTopicContextMenu","handleHideContextMenu","handleShowAlert","handleShowInfoView","handleValidateCredentialsRequest","handlePasswordResetRequest","handleResetPassword","handleContextMenuAction","handleShowCountrySelector","handleShowForwardDialog","handleHideForwardDialog","handleStartVideoCall","handleStartAudioCall","handleInfoMessage","handleDataMessage","handleCallClose","handleCallInvite","handleCallRinging","handleCallSendOffer","handleCallIceCandidate","handleCallSendAnswer","handleCallAccept","sendMessageToTopic","callTimeoutTimer","autoLogin","messageSoundsOff","FIREBASE_INIT","firebaseToken","hidden","sidePanelSelected","sidePanelTitle","sidePanelAvatar","myTrustedBadges","liveConnection","onLine","topicSelectedOnline","topicSelectedAcs","innerWidth","infoPanel","mobilePanel","callShouldStart","contextMenuVisible","contextMenuBounds","contextMenuClickAt","contextMenuParams","contextMenuItems","forwardDialogVisible","alertVisible","alertParams","requestedTopic","BroadcastChannel","serviceWorkerChannel","documentElement","clientWidth","viewportHeight","clientHeight","tnSetup","onConnect","onDisconnect","onAutoreconnectIteration","onInfoMessage","onDataMessage","parsedNav","expires","setAuthToken","readTimer","readTimerCallback","cred_done","persistentCache","onSetupCompleted","appName","apiKey","secure","setHumanLanguage","enableLogging","payload","oobNotification","fcm","serviceWorker","getRegistration","reg","active","installing","postMessage","requestFCMToken","setDeviceToken","sw","serviceWorkerRegistration","vapidKey","messagingVapidKey","Notification","requestPermission","permission","mobile","onupdatefound","installingWorker","onstatechange","controller","newTopicTabSelected","tab","topicType","getTopicAccessMode","stateForError","reconnectCountdown","reconnect","level","actionText","isConnected","initStorage","clearStorage","getServerInfo","ver","prom","fmtTime","tmpToken","isAuthenticated","getAuthToken","credential","connectionPromise","loginPromise","loginBasic","loginToken","navigateToCredentialsView","goToTopic","onContactUpdate","getCurrentUserID","withCred","disconnect","urlHash","isPresencer","play","unused","prepareSearchableContacts","foundContacts","merged","updated","past","fnd","getFndTopic","withSub","s","setMeta","isTopicOnline","createMessage","completion","subscribePromise","publishMessage","publishDraft","response","delTopic","am","updateWant","login_","password_","public_","cred_","tags_","attachments","createAccountBasic","on","enabled","delCredential","basicNavigator","infoNavigator","newGroupTopicName","oldName","newName","updateAccountBasic","getCurrentLogin","updateGiven","cleared","Promose","delCurrentUser","delMessagesAll","updateMode","report","getBoundingClientRect","forwardedContent","mention","msgPreview","forwarded","self_blocked","subscribed","keepForwardedMessage","onConfirm","confirmText","onReject","rejectText","confirm","invite","delSubscription","requestResetAuthSecret","newPassword","tempAuth","dial","selectedCallback","d","audioOnly","aonly","videoCall","sdp","candidate","isMeTopicName","latestMsgVersion","handleManageGroupMembers","codeReceived","handleChange","handleKeyPress","handleCancel","onSubmit","methods","FileProgress","Attachment","downloader","progress","downloadFile","mimetype","download","loaded","uploading","onCancelUpload","substr","helperFunc","downloadUrl","downloadWidget","CANVAS_UPSCALING","LINE_WIDTH","SPACING","BAR_COLOR","BAR_COLOR_DARK","THUMB_COLOR","MIN_PREVIEW_LENGTH","icon_title_play","canPlay","playing","currentTime","longMin","initAudio","initCanvas","resampleBars","visualize","handlePlay","handleSeek","audioPlayer","viewBuffer","canvasRef","oncanplay","ontimeupdate","onended","pause","offsetWidth","canvasContext","lineCap","effectiveWidth","lineWidth","drawFrame","requestAnimationFrame","thumbAt","beginPath","strokeStyle","stroke","moveTo","lineTo","arc","PI","fillStyle","fill","original","dstCount","apply","factor","amps","maxAmp","lo","amp","j","rect","offset","clientX","playClass","short","Cropper","source","handleFileReceived","onImageUpdated","randId","random","readOnly","icon_mapping","badge_verified","badge_staff","badge_danger","ButtonBack","onBack","RING_SOUND","handleRejectCall","handleAcceptCall","ringTimer","onRinging","onAcceptCall","onClose","isCallDropped","successClass","callIcon","loop","CALL_ENDED_SOUND","DIALING_SOUND","VIDEO_MUTED_EVENT","VIDEO_UNMUTED_EVENT","already_in_call","localStream","remoteStream","pc","dataChannel","previousOnInfo","waitingForPeer","callInitialSetupComplete","videoToggleInProgress","remoteVideoLive","localStreamConstraints","isOutgoingCall","localRef","remoteRef","remoteIceCandidatesCache","start","stop","createPeerConnection","canSendOffer","drainRemoteIceCandidatesCache","handleNegotiationNeededEvent","handleICECandidateEvent","handleNewICECandidateMsg","handleICEConnectionStateChangeEvent","handleSignalingStateChangeEvent","handleICEGatheringStateChangeEvent","handleIceCandidateErrorEvent","handleTrackEvent","handleVideoOfferMsg","handleVideoAnswerMsg","reportError","handleGetUserMediaError","stopTracks","disconnectMedia","handleCloseClick","handleToggleCameraClick","handleToggleMicClick","handleRemoteHangup","handleVideoCallAccepted","muteVideo","unmuteVideo","emptyVideoTrack","handleDataChannelEvent","handleDataChannelError","handleDataChannelMessage","handleDataChannelOpen","handleDataChannelClose","stream","getTracks","track","addTrack","removeTrack","fillRect","captureStream","getVideoTracks","onInvite","mediaDevices","getUserMedia","srcObject","ontrack","onremovetrack","onremovestream","onicecandidate","oniceconnectionstatechange","onsignalingstatechange","onicegatheringstatechange","onnegotiationneeded","onicecandidateerror","ondatachannel","close","tracks","send","onmessage","onopen","onclose","iceServers","RTCPeerConnection","createDataChannel","ordered","RTCSessionDescription","setRemoteDescription","createOffer","offer","setLocalDescription","onSendOffer","localDescription","toJSON","onIceCandidate","RTCIceCandidate","addIceCandidate","iceConnectionState","signalingState","streams","dummyVideo","createAnswer","answer","onSendAnswer","onHangup","t","sender","getSenders","find","replaceTrack","readyState","getAudioTracks","audioTracks","videoTracks","audioIcon","videoIcon","peerTitle","pulseAnimation","remoteActive","rstream","icon2","ReceivedMarker","BaseChatMessage","onProgress","handleProgress","handleExpandImage","handlePlayVideo","handleFormButtonClick","formatterContext","onExpandMedia","act","onFormResponse","userIsWriter","immutable","entities","_0","_1","tp","styles","edited","pickReply","editMessage","ratio","sideClass","bubbleClass","fullDisplay","isGroup","getContentType","att","getDownloadUrl","getEntitySize","tree","innerRef","timestamp","IntlChatMessage","forwardRef","onChange","iconName","attrs","Chip","ChipInput","input","focused","handleTextInput","removeChipAt","handleChipCancel","handleFocusGained","handleFocusLost","handleKeyDown","chips","prompt","sortedChips","sortChips","staticMembers","chipIndex","indexChips","index","keep","required","normal","filterFunc","onChipRemoved","onFocusLost","onEnter","avatarDisabled","invalid","autoFocus","tabIndex","noAvatar","ContactAction","handleClick","onAction","Contact","badge_you","badge_owner","showCheckmark","contactNodes","contactsCount","showMode","filter","filterOn","toLowerCase","isChannelTopicName","isGroupTopicName","selected","previewIsResponse","latestMessage","_status","showUnread","showOnline","noScroll","__html","emptyListMessage","UnreadBadge","onSelected","marker","small","clear_messages","clear_for_all","delete","delete_for_all","send_retry","mute","unmute","forward","topic_delete","topic_delete_warning","delete_messages_warning","unblock","topic_block_warning","member_delete","unarchive","clear_messages_warning","handlePageClick","handleEscapeKey","MenuItems","errorHandler","deleteMessages","retryMessage","replyToMessage","topicPermissionSetter","onTopicRemoved","contains","hide","keyCode","hard","cancelSend","delMessagesEdits","flushMessage","menu","hSize","vSize","bounds","right","clickAt","bottom","position","DEFAULT_MAX_ZOOM","panX","panY","originX","originY","zoom","minZoom","maxZoom","overlay","cutout","boundingBox","imageWidth","imageHeight","mouseX","mouseY","prevDistance","cutoutRect","bBoxRect","initScaling","onZoom","handleZoom","mouseDown","mouseUp","mouseMove","mouseTouch","positionAll","translate","passive","checkBound","currPan","delta","nextDiff","imgRect","imgLeft","imgRight","coLeft","coRight","imgTop","imgBottom","coTop","coBottom","touches","dX","dY","touch0","touch1","distance","sqrt","t3d","orig","transform","transformOrigin","iconFromMime","mimeToIcon","default","handleSendDoc","onSendMessage","onCancelReply","show","onClearError","icons","whiteSpace","handleClose","handleContactSelected","not_found_placeholder","contacts_not_found_short","indexMembers","keepInitialMembers","requiredMember","contactFilter","noContactsMessage","selectedContacts","handleMemberRemoved","handleContactFilter","m","present","keepInitial","stat","sel","splice","doContactFiltering","instance","keys","k","usersOnline","totalCount","countToShow","some","overflow","changed","handleHostNameChange","handleEditingFinished","onServerAddressChange","hostOptions","handleSendImage","assignWidth","maxlength","initialValue","handeTextChange","handleStartEditing","handlePasswordFinished","newValue","focus","checkValidity","onFinished","spanText","spanClass","multiline","element","rows","onKeyDown","onBlur","autoComplete","videoRef","handleButtonAction","isvideo","padding","iconColor","letter","charAt","large","clear","centered","MenuContacts","onNewTopic","MenuStart","date","invalid_id","groupId","prefix","TagManager","handleFieldEdit","handleTagsChanged","handleChannelToggle","joiner","writer","preser","approver","before","skip","compare","modeTitle","compareTitle","message_sending","message_sending_failed","message_edited_marker","timeStyle","handleSearchChange","handleSearch","handleClear","AudioRecorder","messaging_disabled","type_new_message","add_image_caption","icon_title_record_voice","icon_title_attach_file","icon_title_add_image","icon_title_send","audioRec","audioAvailable","keypressTimestamp","handlePasteEvent","handleAttachImage","handleAttachAudio","handleSend","handleMessageTyping","handleDropAttach","formatReply","messageEditArea","getComputedStyle","getPropertyValue","initMessage","setSelectionRange","onAttachImage","onAttachFile","onAttachAudio","acceptBlank","noInput","shiftKey","onKeyPress","messagePrompt","sendIcon","audioEnabled","attachImage","click","display","tagInput","activated","handleTagInput","handleAddTag","handleRemoveTag","last","tag","maxTagCount","onTagsChanged","minTagLength","maxTagLength","add_tags_prompt","TopicDescEdit","credentials","getCredentials","addCredActive","addCredInvalid","newCred","previousTagsUpdated","onTagsUpdated","handleTagsUpdated","tnCredsUpdated","handleCredChange","handleCredKeyDown","handleCredEntered","onCredsUpdated","creds","onUpdateTagsRequest","done","onUpdateTopicDesc","phone_or_email_prompt","previousOnTags","tnNewTags","handleFullNameUpdate","handleImageUpdated","handlePrivateUpdate","handleDescriptionUpdate","du","onUpdateTags","full_name_placeholder","group_name_placeholder","private_placeholder","title_tag_manager","delete_messages","leave_chat","leave_chat_warning","block_contact","block_contact_warning","report_chat","report_chat_warning","other_user","handleDeleteTopic","handleDeleteMessages","handleLeave","handleBlock","handleReport","onDeleteTopic","onLaunchPermissionsEditor","unrecognized_video_format","handleSendVideo","videoWidth","videoHeight","controlist","autoPlay","inputRef","visible","handleVisibility","activeElement","createRoot","IntlProvider","measurementId","script","async","prepend","dataLayer","gtag","arguments","messageLoader","hl","languages","normalized","baseLanguage","htmlLang","setAttribute","root"],"sourceRoot":""}
\ No newline at end of file
+{"version":3,"file":"index.dev.js","mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,SAAS;AACzB;AACA;AACA;AACA,gBAAgB,SAAS;AACzB;AACA;AACA;AACA;AACA;AACA,oBAAoB,eAAe;AACnC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,gBAAgB;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sDAAsD;AACtD;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,kBAAkB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,iBAAiB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,8BAA8B;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,qBAAM;AACrB,eAAe,qBAAM;AACrB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iEAAiE;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oEAAoE,EAAE;AACtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kDAAkD,YAAY;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kDAAkD;AAClD;AACA,wCAAwC,MAAM;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,QAAQ;AAC5C;AACA;AACA;AACA;AACA;AACA,2CAA2C,QAAQ,wEAAwE,KAAK;;AAEhI;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,QAAQ;AACvD;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,qBAAM;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD,MAAM;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C,iBAAiB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,aAAa,GAAG,KAAK;AACjD;AACA;AACA;AACA,+BAA+B,iBAAiB,IAAI,SAAS,GAAG,SAAS;AACzE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mDAAmD,IAAI;AACvD,KAAK;AACL;AACA,mBAAmB,MAAM,IAAI;;AAE7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,YAAY,GAAG;AACf;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd,YAAY,QAAQ;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,aAAa,WAAW;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,yBAAyB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,yBAAyB;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA,wBAAwB,oBAAoB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,QAAQ;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,QAAQ;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,QAAQ;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,QAAQ;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,SAAS;AAClD;AACA,8BAA8B;AAC9B;AACA;AACA;AACA,wBAAwB,OAAO;AAC/B,6BAA6B,QAAQ;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,2BAA2B;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ,UAAU,SAAS;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,YAAY;AACZ;AACA;AACA;AACA;AACA,oBAAoB,gBAAgB;AACpC;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA,oDAAoD;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD;AACjD,WAAW,QAAQ;AACnB,YAAY;AACZ;AACA;AACA;AACA,oBAAoB,gBAAgB;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,EAAE;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEm8B;AACn8B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACtjE+C;AAGxC,MAAMC,QAAQ,GAAG,YAAY,IAAID,wDAAe,IAAI,MAAM,CAAC;AAG3D,MAAME,OAAO,GAAG,kCAAkC;AAGlD,MAAMC,WAAW,GAAG;EAACC,MAAM,EAAE,eAAe;EAAEC,KAAK,EAAE;AAAgB,CAAC;AAGtE,MAAMC,YAAY,GAAGH,WAAW,CAACC,MAAM;AAGvC,MAAMG,eAAe,GAAG,IAAI;AAG5B,MAAMC,cAAc,GAAG,KAAK;AAE5B,MAAMC,UAAU,GAAG,KAAK;AAGxB,MAAMC,cAAc,GAAG,CAAC;AAExB,MAAMC,cAAc,GAAG,EAAE;AAEzB,MAAMC,aAAa,GAAG,EAAE;AAGxB,MAAMC,uBAAuB,GAAG,OAAO;AAEvC,MAAMC,mBAAmB,GAAG,SAAS;AAErC,MAAMC,mBAAmB,GAAG,IAAI;AAGhC,MAAMC,cAAc,GAAG,GAAG;AAI1B,MAAMC,gBAAgB,GAAG,GAAG;AAE5B,MAAMC,QAAQ,GAAG,EAAE;AAInB,MAAMC,WAAW,GAAG,GAAG;AAGvB,MAAMC,gBAAgB,GAAG,IAAI;AAG7B,MAAMC,iBAAiB,GAAG,EAAE;AAG5B,MAAMC,mBAAmB,GAAG,GAAG;AAG/B,MAAMC,aAAa,GAAG,EAAE;AAQxB,MAAMC,0BAA0B,GAAG,OAAO;AAI1C,MAAMC,0BAA0B,GAAG,CAAC,IAAI,EAAE;AAK1C,MAAMC,aAAa,GAAG,IAAI;AAG1B,MAAMC,iBAAiB,GAAG,EAAE;AAG5B,MAAMC,iBAAiB,GAAG,EAAE;AAG5B,MAAMC,mBAAmB,GAAG,EAAE;AAE9B,MAAMC,qBAAqB,GAAG,EAAE;AAIhC,MAAMC,mBAAmB,GAAG,CAAC;AAG7B,MAAMC,gBAAgB,GAAG,EAAE;AAE3B,MAAMC,4BAA4B,GAAG,GAAG;AAExC,MAAMC,qBAAqB,GAAG,EAAE;AAGhC,MAAMC,sBAAsB,GAAG,EAAE;AAGjC,MAAMC,mBAAmB,GAAG,EAAE;AAE9B,MAAMC,wBAAwB,GAAG,EAAE;AAEnC,MAAMC,mBAAmB,GAAG,EAAE;AAG9B,MAAMC,YAAY,GAAG,KAAK;AAE1B,MAAMC,YAAY,GAAG,OAAO;AAG5B,MAAMC,eAAe,GAAG,0BAA0B;AAGlD,MAAMC,mBAAmB,GAAG,gCAAgC;AAG5D,MAAMC,qBAAqB,GAAG,8BAA8B;;;;;;;;;;;;;;;;;;ACzH5D,MAAMC,eAAe,GAAG,CAAC;AACzB,MAAMC,4BAA4B,GAAG,CAAC;AACtC,MAAMC,4BAA4B,GAAG,CAAC;AACtC,MAAMC,sBAAsB,GAAG,CAAC;AAGhC,MAAMC,iBAAiB,GAAG,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACJnC,MAAMC,uBAAuB,GAAG,CAAC,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,eAAe,CAAC;AACtG,MAAMC,eAAe,GAAW,CAAC,KAAK,EAAS,KAAK,EAAQ,KAAK,EAAQ,KAAK,EAAQ,KAAK,CAAC;AAG5F,SAASC,YAAY,CAACC,KAAK,EAAE;EAClC,IAAIA,KAAK,IAAI,OAAOA,KAAK,IAAI,QAAQ,EAAE;IACrC,IAAIA,KAAK,CAACC,GAAG,EAAE;MACb,OAAOD,KAAK,CAACC,GAAG;IAClB;IACA,IAAID,KAAK,CAACE,IAAI,IAAIF,KAAK,CAACG,IAAI,EAAE;MAC5B,MAAMC,IAAI,GAAGJ,KAAK,CAACG,IAAI,CAACE,UAAU,CAAC,QAAQ,CAAC,GAAGL,KAAK,CAACG,IAAI,GAAI,QAAQ,GAAGH,KAAK,CAACG,IAAK;MACnF,OAAO,OAAO,GAAGC,IAAI,GAAG,UAAU,GAAGJ,KAAK,CAACE,IAAI;IACjD;EACF;EACA,OAAO,IAAI;AACb;AAKO,SAASI,YAAY,CAACC,KAAK,EAAEC,MAAM,EAAEC,QAAQ,EAAEC,SAAS,EAAEC,WAAW,EAAE;EAE5EJ,KAAK,GAAGA,KAAK,GAAG,CAAC;EACjBC,MAAM,GAAGA,MAAM,GAAG,CAAC;EACnBC,QAAQ,GAAGA,QAAQ,GAAG,CAAC;EACvBC,SAAS,GAAGA,SAAS,GAAG,CAAC;EAEzB,IAAIH,KAAK,IAAI,CAAC,IAAIC,MAAM,IAAI,CAAC,IAAIC,QAAQ,IAAI,CAAC,IAAIC,SAAS,IAAI,CAAC,EAAE;IAChE,OAAO,IAAI;EACb;EAEA,IAAIC,WAAW,EAAE;IACfF,QAAQ,GAAGC,SAAS,GAAGE,IAAI,CAACC,GAAG,CAACJ,QAAQ,EAAEC,SAAS,CAAC;EACtD;EAEA,MAAMI,KAAK,GAAGF,IAAI,CAACC,GAAG,CACpBD,IAAI,CAACC,GAAG,CAACN,KAAK,EAAEE,QAAQ,CAAC,GAAGF,KAAK,EACjCK,IAAI,CAACC,GAAG,CAACL,MAAM,EAAEE,SAAS,CAAC,GAAGF,MAAM,CACrC;EAED,MAAMO,IAAI,GAAG;IACXC,QAAQ,EAAGT,KAAK,GAAGO,KAAK,GAAI,CAAC;IAC7BG,SAAS,EAAGT,MAAM,GAAGM,KAAK,GAAI;EAChC,CAAC;EAED,IAAIH,WAAW,EAAE;IAEfI,IAAI,CAACC,QAAQ,GAAGD,IAAI,CAACE,SAAS,GAAGL,IAAI,CAACC,GAAG,CAACE,IAAI,CAACC,QAAQ,EAAED,IAAI,CAACE,SAAS,CAAC;IACxEF,IAAI,CAACG,QAAQ,GAAGH,IAAI,CAACI,SAAS,GAAGP,IAAI,CAACC,GAAG,CAACN,KAAK,EAAEC,MAAM,CAAC;IACxDO,IAAI,CAACK,OAAO,GAAI,CAACb,KAAK,GAAGQ,IAAI,CAACG,QAAQ,IAAI,CAAC,GAAI,CAAC;IAChDH,IAAI,CAACM,OAAO,GAAI,CAACb,MAAM,GAAGO,IAAI,CAACG,QAAQ,IAAI,CAAC,GAAI,CAAC;EACnD,CAAC,MAAM;IACLH,IAAI,CAACK,OAAO,GAAGL,IAAI,CAACM,OAAO,GAAG,CAAC;IAC/BN,IAAI,CAACG,QAAQ,GAAGX,KAAK;IACrBQ,IAAI,CAACI,SAAS,GAAGX,MAAM;EACzB;EACA,OAAOO,IAAI;AACb;AAGO,SAASO,eAAe,CAACC,KAAK,EAAEnB,IAAI,EAAE;EAC3C,MAAMoB,GAAG,GAAG3B,uBAAuB,CAAC4B,OAAO,CAACrB,IAAI,CAAC;EACjD,IAAIoB,GAAG,GAAG,CAAC,IAAI,CAACD,KAAK,EAAE;IAErB,OAAOA,KAAK;EACd;EACA,MAAMG,GAAG,GAAG5B,eAAe,CAAC0B,GAAG,CAAC;EAEhC,MAAMG,EAAE,GAAGJ,KAAK,CAACK,WAAW,CAAC,GAAG,CAAC;EACjC,IAAID,EAAE,IAAI,CAAC,EAAE;IACXJ,KAAK,GAAGA,KAAK,CAACM,SAAS,CAAC,CAAC,EAAEF,EAAE,CAAC;EAChC;EACA,OAAOJ,KAAK,GAAG,GAAG,GAAGG,GAAG;AAC1B;AAIO,SAASI,WAAW,CAACC,UAAU,EAAEtB,QAAQ,EAAEC,SAAS,EAAEsB,OAAO,EAAErB,WAAW,EAAE;EACjF,OAAO,IAAIsB,OAAO,CAAC,CAACC,OAAO,EAAEC,MAAM,KAAK;IACtC,MAAMC,GAAG,GAAG,IAAIC,KAAK,EAAE;IACvBD,GAAG,CAACE,WAAW,GAAG,WAAW;IAC7BF,GAAG,CAACG,OAAO,GAAG,UAASC,GAAG,EAAE;MAC1BL,MAAM,CAAC,IAAIM,KAAK,CAAC,2BAA2B,CAAC,CAAC;IAChD,CAAC;IACDL,GAAG,CAACM,MAAM,GAAG,kBAAiB;MAE5BC,GAAG,CAACC,eAAe,CAACR,GAAG,CAACS,GAAG,CAAC;MAG5B,MAAMC,GAAG,GAAGxC,YAAY,CAAC8B,GAAG,CAAC7B,KAAK,EAAE6B,GAAG,CAAC5B,MAAM,EAAEC,QAAQ,EAAEC,SAAS,EAAEC,WAAW,CAAC;MACjF,IAAI,CAACmC,GAAG,EAAE;QACRX,MAAM,CAAC,IAAIM,KAAK,CAAC,eAAe,CAAC,CAAC;QAClC;MACF;MACA,IAAIM,MAAM,GAAGC,QAAQ,CAACC,aAAa,CAAC,QAAQ,CAAC;MAC7CF,MAAM,CAACxC,KAAK,GAAGuC,GAAG,CAAC9B,QAAQ;MAC3B+B,MAAM,CAACvC,MAAM,GAAGsC,GAAG,CAAC7B,SAAS;MAC7B,IAAIiC,GAAG,GAAGH,MAAM,CAACI,UAAU,CAAC,IAAI,CAAC;MACjCD,GAAG,CAACE,qBAAqB,GAAG,IAAI;MAChCF,GAAG,CAACG,SAAS,CAACjB,GAAG,EAAEU,GAAG,CAAC1B,OAAO,EAAE0B,GAAG,CAACzB,OAAO,EAAEyB,GAAG,CAAC5B,QAAQ,EAAE4B,GAAG,CAAC3B,SAAS,EACtE,CAAC,EAAE,CAAC,EAAE2B,GAAG,CAAC9B,QAAQ,EAAE8B,GAAG,CAAC7B,SAAS,CAAC;MAEpC,MAAMb,IAAI,GAAGP,uBAAuB,CAACyD,QAAQ,CAACvB,UAAU,CAAC5B,IAAI,CAAC,GAAG4B,UAAU,CAAC5B,IAAI,GAAG,YAAY;MAE/F,IAAIoD,IAAI,GAAG,MAAM,IAAItB,OAAO,CAACC,OAAO,IAAIa,MAAM,CAACS,MAAM,CAACtB,OAAO,EAAE9B,IAAI,CAAC,CAAC;MACrE,IAAI,CAACmD,IAAI,EAAE;QACTpB,MAAM,CAAC,IAAIM,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAC7C;MACF;MAGA,OAAOT,OAAO,GAAG,CAAC,IAAIuB,IAAI,CAACE,MAAM,GAAGzB,OAAO,EAAE;QAC3Cc,GAAG,CAAC9B,QAAQ,GAAI8B,GAAG,CAAC9B,QAAQ,GAAG,aAAa,GAAI,CAAC;QACjD8B,GAAG,CAAC7B,SAAS,GAAI6B,GAAG,CAAC7B,SAAS,GAAG,aAAa,GAAI,CAAC;QACnD8B,MAAM,CAACxC,KAAK,GAAGuC,GAAG,CAAC9B,QAAQ;QAC3B+B,MAAM,CAACvC,MAAM,GAAGsC,GAAG,CAAC7B,SAAS;QAC7BiC,GAAG,GAAGH,MAAM,CAACI,UAAU,CAAC,IAAI,CAAC;QAC7BD,GAAG,CAACQ,SAAS,CAAC,CAAC,EAAE,CAAC,EAAEX,MAAM,CAACxC,KAAK,EAAEwC,MAAM,CAACvC,MAAM,CAAC;QAChD0C,GAAG,CAACG,SAAS,CAACjB,GAAG,EAAEU,GAAG,CAAC1B,OAAO,EAAE0B,GAAG,CAACzB,OAAO,EAAEyB,GAAG,CAAC5B,QAAQ,EAAE4B,GAAG,CAAC3B,SAAS,EACtE,CAAC,EAAE,CAAC,EAAE2B,GAAG,CAAC9B,QAAQ,EAAE8B,GAAG,CAAC7B,SAAS,CAAC;QACpCsC,IAAI,GAAG,MAAM,IAAItB,OAAO,CAACC,OAAO,IAAIa,MAAM,CAACS,MAAM,CAACtB,OAAO,EAAE9B,IAAI,CAAC,CAAC;MACnE;MAEA2C,MAAM,GAAG,IAAI;MACbb,OAAO,CAAC;QAAC9B,IAAI,EAAEA,IAAI;QAAEmD,IAAI,EAAEA,IAAI;QAAEhD,KAAK,EAAEuC,GAAG,CAAC9B,QAAQ;QAAER,MAAM,EAAEsC,GAAG,CAAC7B,SAAS;QAAE0C,IAAI,EAAErC,eAAe,CAACS,UAAU,CAAC4B,IAAI,EAAEvD,IAAI;MAAC,CAAC,CAAC;IAC7H,CAAC;IACDgC,GAAG,CAACS,GAAG,GAAGF,GAAG,CAACiB,eAAe,CAAC7B,UAAU,CAAC;EAC3C,CAAC,CAAC;AACJ;AAKO,SAAS8B,SAAS,CAACzD,IAAI,EAAE0D,MAAM,EAAEC,IAAI,EAAEC,GAAG,EAAEzD,KAAK,EAAEC,MAAM,EAAEM,KAAK,EAAE;EACvE,OAAO,IAAImB,OAAO,CAAC,CAACC,OAAO,EAAEC,MAAM,KAAK;IACtC,MAAMC,GAAG,GAAG,IAAIC,KAAK,EAAE;IACvBD,GAAG,CAACE,WAAW,GAAG,WAAW;IAC7BF,GAAG,CAACG,OAAO,GAAG0B,CAAC,IAAI;MACjB9B,MAAM,CAAC,IAAIM,KAAK,CAAC,2BAA2B,CAAC,CAAC;IAChD,CAAC;IACDL,GAAG,CAACM,MAAM,GAAGuB,CAAC,IAAI;MAEhBtB,GAAG,CAACC,eAAe,CAACR,GAAG,CAACS,GAAG,CAAC;MAE5B,IAAIE,MAAM,GAAGC,QAAQ,CAACC,aAAa,CAAC,QAAQ,CAAC;MAC7CF,MAAM,CAACxC,KAAK,GAAGA,KAAK,GAAGO,KAAK;MAC5BiC,MAAM,CAACvC,MAAM,GAAGA,MAAM,GAAGM,KAAK;MAC9B,IAAIoC,GAAG,GAAGH,MAAM,CAACI,UAAU,CAAC,IAAI,CAAC;MACjCD,GAAG,CAACE,qBAAqB,GAAG,IAAI;MAChCF,GAAG,CAACG,SAAS,CAACjB,GAAG,EAAE2B,IAAI,EAAEC,GAAG,EAAEzD,KAAK,EAAEC,MAAM,EAAE,CAAC,EAAE,CAAC,EAAEuC,MAAM,CAACxC,KAAK,EAAEwC,MAAM,CAACvC,MAAM,CAAC;MAE/EJ,IAAI,GAAGP,uBAAuB,CAACyD,QAAQ,CAAClD,IAAI,CAAC,GAAGA,IAAI,GAAG,YAAY;MAEnE2C,MAAM,CAACS,MAAM,CAAED,IAAI,IAAK;QAEtBR,MAAM,GAAG,IAAI;QACb,IAAIQ,IAAI,EAAE;UACRrB,OAAO,CAAC;YAAC9B,IAAI,EAAEA,IAAI;YAAEmD,IAAI,EAAEA,IAAI;YAAEhD,KAAK,EAAEA,KAAK;YAAEC,MAAM,EAAEA;UAAM,CAAC,CAAC;QACjE,CAAC,MAAM;UACL2B,MAAM,CAAC,IAAIM,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAC/C;MACF,CAAC,EAAErC,IAAI,CAAC;IACV,CAAC;IACDgC,GAAG,CAACS,GAAG,GAAGiB,MAAM;EAClB,CAAC,CAAC;AACJ;AAGO,SAASI,YAAY,CAACC,IAAI,EAAE;EACjC,OAAO,IAAIlC,OAAO,CAAC,CAACC,OAAO,EAAEC,MAAM,KAAK;IACtC,MAAMiC,MAAM,GAAG,IAAIC,UAAU,EAAE;IAC/BD,MAAM,CAAC7B,OAAO,GAAG0B,CAAC,IAAI;MACpB9B,MAAM,CAACiC,MAAM,CAACE,KAAK,CAAC;IACtB,CAAC;IACDF,MAAM,CAAC1B,MAAM,GAAGuB,CAAC,IAAI;MACnB/B,OAAO,CAAC;QAAC9B,IAAI,EAAE+D,IAAI,CAAChE,IAAI;QAAEoE,IAAI,EAAEH,MAAM,CAACI,MAAM,CAACC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAAEd,IAAI,EAAEQ,IAAI,CAACR;MAAI,CAAC,CAAC;IAChF,CAAC;IACDS,MAAM,CAACM,aAAa,CAACP,IAAI,CAAC;EAC5B,CAAC,CAAC;AACJ;AAGO,SAASQ,YAAY,CAACpB,IAAI,EAAE;EACjC,OAAO,IAAItB,OAAO,CAAC,CAACC,OAAO,EAAEC,MAAM,KAAK;IACtC,MAAMiC,MAAM,GAAG,IAAIC,UAAU,EAAE;IAC/BD,MAAM,CAAC7B,OAAO,GAAG0B,CAAC,IAAI;MACpB9B,MAAM,CAACiC,MAAM,CAACE,KAAK,CAAC;IACtB,CAAC;IACDF,MAAM,CAAC1B,MAAM,GAAGuB,CAAC,IAAI;MACnB/B,OAAO,CAAC;QAAC9B,IAAI,EAAEmD,IAAI,CAACpD,IAAI;QAAEoE,IAAI,EAAEH,MAAM,CAACI,MAAM,CAACC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;MAAC,CAAC,CAAC;IAC/D,CAAC;IACDL,MAAM,CAACM,aAAa,CAACnB,IAAI,CAAC;EAC5B,CAAC,CAAC;AACJ;AAGO,SAASqB,UAAU,CAACC,KAAK,EAAEC,cAAc,EAAEC,mBAAmB,EAAEC,OAAO,EAAE;EAC9E,MAAMC,KAAK,GAAG,CAACJ,KAAK,CAACK,aAAa,IAAIL,KAAK,CAACM,aAAa,CAACD,aAAa,IAAI,CAAC,CAAC,EAAED,KAAK;EACpF,IAAI,CAACA,KAAK,IAAI,CAACA,KAAK,CAACxB,MAAM,EAAE;IAC3B,OAAO,KAAK;EACd;EAEA,KAAK,IAAI2B,CAAC,IAAIH,KAAK,EAAE;IACnB,MAAMI,IAAI,GAAGJ,KAAK,CAACG,CAAC,CAAC;IACrB,IAAIC,IAAI,CAACC,IAAI,KAAK,MAAM,EAAE;MACxB,MAAMnB,IAAI,GAAGkB,IAAI,CAACE,SAAS,EAAE;MAC7B,IAAI,CAACpB,IAAI,EAAE;QACTqB,OAAO,CAAClB,KAAK,CAAC,iDAAiD,EAAEe,IAAI,CAACC,IAAI,EAAED,IAAI,CAAClF,IAAI,CAAC;QACtF6E,OAAO,CAAC,iDAAiD,CAAC;QAC1D;MACF;MACA,IAAIb,IAAI,CAAChE,IAAI,IAAIgE,IAAI,CAAChE,IAAI,CAACsE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,OAAO,EAAE;QACnDK,cAAc,CAACX,IAAI,CAAC;MACtB,CAAC,MAAM;QACLY,mBAAmB,CAACZ,IAAI,CAAC;MAC3B;MAEA,OAAO,IAAI;IACb;EACF;EAEA,OAAO,KAAK;AACd;AAGO,SAASsB,WAAW,CAACC,MAAM,EAAE;EAClC,IAAItF,IAAI,GAAG,oCAAoC,CAACuF,IAAI,CAACD,MAAM,CAAC;EAC5D,OAAQtF,IAAI,IAAIA,IAAI,CAACqD,MAAM,GAAG,CAAC,GAAIrD,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI;AACnD;AAIO,SAASwF,gBAAgB,CAACC,CAAC,EAAE;EAClC,OAAOjF,IAAI,CAACkF,KAAK,CAAC,CAACD,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC;AACpC;AAIO,SAASE,gBAAgB,CAACF,CAAC,EAAE;EAClC,OAAOjF,IAAI,CAACkF,KAAK,CAACD,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC;AAC9B;AAIO,SAASG,cAAc,CAACC,GAAG,EAAE;EAClC,IAAIA,GAAG,EAAE;IACPA,GAAG,GAAGA,GAAG,CAACC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAACA,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC;IAC/C,IAAI;MACFD,GAAG,GAAGE,IAAI,CAACC,IAAI,CAACH,GAAG,CAAC,CAAC;IACvB,CAAC,CAAC,OAAMzD,GAAG,EAAE;MACXgD,OAAO,CAAClB,KAAK,CAAC,oCAAoC,EAAE9B,GAAG,CAAC;MACxDyD,GAAG,GAAG,IAAI;IACZ;EACF;EACA,OAAOA,GAAG;AACZ;AAGO,SAASI,YAAY,CAACJ,GAAG,EAAE7F,IAAI,EAAE;EACtC,IAAI,CAAC6F,GAAG,EAAE;IACR,OAAO,IAAI;EACb;EAEA,IAAI;IAEF,MAAMK,GAAG,GAAGF,IAAI,CAACH,GAAG,CAAC;IACrB,MAAMxC,MAAM,GAAG6C,GAAG,CAAC7C,MAAM;IACzB,MAAM8C,GAAG,GAAG,IAAIC,WAAW,CAAC/C,MAAM,CAAC;IACnC,MAAMgD,GAAG,GAAG,IAAIC,UAAU,CAACH,GAAG,CAAC;IAC/B,KAAK,IAAInB,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAG3B,MAAM,EAAE2B,CAAC,EAAE,EAAE;MAC/BqB,GAAG,CAACrB,CAAC,CAAC,GAAGkB,GAAG,CAACK,UAAU,CAACvB,CAAC,CAAC;IAC5B;IAEA,OAAO,IAAIwB,IAAI,CAAC,CAACL,GAAG,CAAC,EAAE;MAAEpG,IAAI,EAAEC;IAAK,CAAC,CAAC;EACxC,CAAC,CAAC,OAAMoC,GAAG,EAAE;IACXgD,OAAO,CAAClB,KAAK,CAAC,oCAAoC,EAAE9B,GAAG,CAAC;EAC1D;EAEA,OAAO,IAAI;AACb;AAEO,SAASqE,gBAAgB,CAACJ,GAAG,EAAE;EACpC,IAAI,CAACK,KAAK,CAACC,OAAO,CAACN,GAAG,CAAC,EAAE;IACvB,OAAO,IAAI;EACb;EACA,IAAI;IACF,IAAIH,GAAG,GAAG,EAAE;IACZ,IAAII,UAAU,CAACD,GAAG,CAAC,CAACO,OAAO,CAACC,CAAC,IAAIX,GAAG,IAAIY,MAAM,CAACC,YAAY,CAACF,CAAC,CAAC,CAAC;IAC/D,OAAOG,MAAM,CAACjB,IAAI,CAACG,GAAG,CAAC;EACzB,CAAC,CAAC,OAAO9D,GAAG,EAAE,CAAC;EACf,OAAO,IAAI;AACb;AAEO,SAAS6E,gBAAgB,CAACC,GAAG,EAAE;EACpC,MAAMb,GAAG,GAAG,EAAE;EACd,IAAI;IACF,MAAMH,GAAG,GAAIc,MAAM,CAAChB,IAAI,CAACkB,GAAG,CAAC;IAC7B,CAAC,GAAGhB,GAAG,CAAC,CAACU,OAAO,CAACO,CAAC,IAAI;MACpBd,GAAG,CAACe,IAAI,CAACD,CAAC,CAACZ,UAAU,CAAC,CAAC,CAAC,CAAC;IAC3B,CAAC,CAAC;IACF,OAAOF,GAAG;EACZ,CAAC,CAAC,OAAOjE,GAAG,EAAE,CAAC;EACf,OAAO,IAAI;AACb;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AClT0B;AACkB;AAER;AAEiB;AACA;AACD;AACE;AACL;AACU;AAEiE;AAClC;AACV;AACb;AAEnE,MAAM+F,QAAQ,GAAGb,0DAAc,CAAC;EAC9Bc,WAAW,EAAE;IACXC,EAAE,eAAe;IACjBC,cAAc;MAAA;MAAA;IAAA;EAEhB,CAAC;EACDC,iBAAiB,EAAE;IACjBF,EAAE,qBAAqB;IACvBC,cAAc;MAAA;MAAA;IAAA;EAEhB,CAAC;EACDE,YAAY,EAAE;IACZH,EAAE,gBAAgB;IAClBC,cAAc;MAAA;MAAA;IAAA;EAEhB,CAAC;EACDG,YAAY,EAAE;IACZJ,EAAE,gBAAgB;IAClBC,cAAc;MAAA;MAAA;IAAA;EAEhB,CAAC;EACDI,cAAc,EAAE;IACdL,EAAE,kBAAkB;IACpBC,cAAc;MAAA;MAAA;IAAA;EAEhB;AACF,CAAC,CAAC;AAUK,SAASK,aAAa,CAACC,KAAK,EAAE9I,IAAI,EAAE+I,MAAM,EAAEC,GAAG,EAAEC,KAAK,EAAE;EAC7D,IAAIA,KAAK,CAAC7F,QAAQ,CAAC,IAAI,CAAC,EAAE;IACxB,OAAO8F,cAAc,CAACC,IAAI,CAAC,IAAI,EAAEL,KAAK,EAAE9I,IAAI,EAAE+I,MAAM,EAAEC,GAAG,CAAC;EAC5D;EAEA,IAAI,CAACF,KAAK,EAAE;IAEV,OAAOC,MAAM;EACf;EAEA,IAAIK,EAAE,GAAG3B,sDAAc,CAACqB,KAAK,CAAC;EAC9B,IAAIQ,IAAI,GAAG7B,wDAAgB,CAACqB,KAAK,EAAE9I,IAAI,CAAC,IAAI,CAAC,CAAC;EAC9CsJ,IAAI,CAACN,GAAG,GAAGA,GAAG;EACd,QAAQF,KAAK;IACX,KAAK,IAAI;MAEP,IAAIQ,IAAI,CAAC3G,GAAG,EAAE;QACZ2G,IAAI,CAAC3G,GAAG,GAAG,IAAI,CAAC6G,YAAY,CAACpB,8DAAkB,CAACkB,IAAI,CAAC3G,GAAG,EAAE,OAAO,CAAC,CAAC;QACnE2G,IAAI,CAACG,QAAQ,GAAGzJ,IAAI,CAACyJ,QAAQ,GAAG,CAAC,GAAIzJ,IAAI,CAACyJ,QAAQ,GAAG,CAAC,GAAIC,SAAS;QACnEJ,IAAI,CAACK,OAAO,GAAG3J,IAAI,CAAC2J,OAAO;QAC3BL,IAAI,CAACM,OAAO,GAAG,MAAM;MACvB;MACAR,EAAE,GAAG1B,iEAAW;MAEhBqB,MAAM,GAAG,IAAI;MACb;IACF,KAAK,IAAI;MACPA,MAAM,GAAG,IAAI;MACb;IACF,KAAK,IAAI;MAEP;IACF,KAAK,IAAI;MAEPO,IAAI,CAACO,SAAS,GAAG,WAAW;MAC5B;IACF,KAAK,IAAI;MACPT,EAAE,GAAG,IAAI;MACTL,MAAM,GAAG,IAAI;MACb;IACF,KAAK,IAAI;MAEPK,EAAE,GAAGU,eAAe,CAACX,IAAI,CAAC,IAAI,EAAEC,EAAE,EAAEpJ,IAAI,EAAEsJ,IAAI,CAAC;MAE/CP,MAAM,GAAG,IAAI;MACb;IACF,KAAK,IAAI;MAEPO,IAAI,CAACS,OAAO,GAAG,IAAI,CAACC,iBAAiB;MACrC,IAAIC,KAAK,GAAG1C,yDAAkB,CAACwB,MAAM,EAAGqB,KAAK,IAAK;QAChD,OAAO,OAAOA,KAAK,IAAI,QAAQ,GAAGA,KAAK,GAAGV,SAAS;MACrD,CAAC,CAAC;MACF,IAAI,CAACO,KAAK,IAAIA,KAAK,CAAC1G,MAAM,IAAI,CAAC,EAAE;QAC/B0G,KAAK,GAAG,CAACX,IAAI,CAAC7F,IAAI,CAAC;MACrB;MAEA6F,IAAI,CAAC,YAAY,CAAC,GAAGW,KAAK,CAACI,IAAI,CAAC,EAAE,CAAC;MACnC;IACF,KAAK,IAAI;MAEPf,IAAI,CAACO,SAAS,GAAG,SAAS;MAC1B,IAAI7J,IAAI,EAAE;QACRsJ,IAAI,CAACO,SAAS,IAAI,GAAG,GAAG7B,8DAAc,CAAChI,IAAI,CAACsK,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC;MAC/D;MACA;IACF,KAAK,IAAI;MAEPhB,IAAI,CAACO,SAAS,GAAG,UAAU;MAC3B;IACF,KAAK,IAAI;MAEP;IACF,KAAK,IAAI;MAEPP,IAAI,CAACO,SAAS,GAAG,aAAa;MAC9BP,IAAI,CAACS,OAAO,GAAG,IAAI,CAACQ,YAAY;MAChC;IACF,KAAK,IAAI;MACPnB,EAAE,GAAGzB,iEAAW;MAEhBoB,MAAM,GAAG,IAAI;MACb,IAAI/I,IAAI,EAAE;QACRsJ,IAAI,CAACkB,SAAS,GAAGxK,IAAI,CAACyK,KAAK;QAC3BnB,IAAI,CAACoB,QAAQ,GAAG1K,IAAI,CAAC0K,QAAQ;QAC7BpB,IAAI,CAACG,QAAQ,GAAGzJ,IAAI,CAACyJ,QAAQ;MAC/B;MACA;IACF,KAAK,IAAI;MAEPL,EAAE,GAAGuB,eAAe,CAACxB,IAAI,CAAC,IAAI,EAAEC,EAAE,EAAEpJ,IAAI,EAAEsJ,IAAI,CAAC;MAE/CP,MAAM,GAAG,IAAI;MACb;IACF;MACE,IAAI,CAACK,EAAE,EAAE;QAEPA,EAAE,GAAG7B,uDAAc;QACnB+B,IAAI,GAAG;UAACN,GAAG,EAAEA;QAAG,CAAC;QAEjB,IAAI6B,IAAI,GAAG9B,MAAM;QACjB,IAAI,CAACnC,KAAK,CAACC,OAAO,CAACkC,MAAM,CAAC,IAAI,CAACA,MAAM,CAACsB,IAAI,CAAC,EAAE,CAAC,CAACS,IAAI,EAAE,EAAE;UACrDD,IAAI,GAAG,CAAC;YAAM,GAAG,EAAC,IAAI;YAAC,SAAS,EAAC;UAAM,GAAE,IAAI,CAACE,aAAa,CAAC1C,QAAQ,CAACO,cAAc,CAAC,CAAQ,CAAC;QAC/F;QACAG,MAAM,GAAG,CAAC;UAAG,GAAG,EAAC,IAAI;UAAC,SAAS,EAAC;QAAqB,GAAC,WAAS,CAAI,EAAE,GAAG,CAAC,CAACiC,MAAM,CAACH,IAAI,CAAC;MACxF;MACA;EAAM;EAEV,IAAI,CAACzB,EAAE,EAAE;IACP,OAAOL,MAAM;EACf;EACA,OAAOxB,0DAAmB,CAAC6B,EAAE,EAAEE,IAAI,EAAEP,MAAM,CAAC;AAC9C;AAGA,SAASe,eAAe,CAACV,EAAE,EAAEpJ,IAAI,EAAEsJ,IAAI,EAAE;EACvC,IAAI,CAACtJ,IAAI,EAAE;IACTsJ,IAAI,CAAC3G,GAAG,GAAG,sBAAsB;IACjC2G,IAAI,CAACR,KAAK,GAAG;MACXzI,KAAK,EAAE9B,2DAAmB,GAAG,IAAI;MACjC+B,MAAM,EAAE/B,2DAAmB,GAAG;IAChC,CAAC;IACD,OAAO6K,EAAE;EACX;EAEAE,IAAI,CAACO,SAAS,GAAG,cAAc;EAC/B,MAAMjH,GAAG,GAAGxC,+DAAY,CAACJ,IAAI,CAACK,KAAK,EAAEL,IAAI,CAACM,MAAM,EAC9C,IAAI,CAAC2K,aAAa,GAAG,CAAC,GAAGvK,IAAI,CAACC,GAAG,CAAC,IAAI,CAACsK,aAAa,GAAGrN,gDAAQ,GAAG,GAAG,EAAEA,gDAAQ,GAAG,IAAI,CAAC,GACrFA,gDAAQ,GAAG,IAAI,EAAEA,gDAAQ,GAAG,EAAE,EAAE,KAAK,CAAC,IACtC;IAACkD,QAAQ,EAAE/C,yDAAiB;IAAEgD,SAAS,EAAEhD,yDAAiBA;EAAA,CAAC;EAC/DuL,IAAI,CAACR,KAAK,GAAG;IACXzI,KAAK,EAAEuC,GAAG,CAAC9B,QAAQ,GAAG,IAAI;IAC1BR,MAAM,EAAEsC,GAAG,CAAC7B,SAAS,GAAG,IAAI;IAE5BmK,QAAQ,EAAEtI,GAAG,CAAC9B,QAAQ,GAAG,IAAI;IAC7BqK,SAAS,EAAEvI,GAAG,CAAC7B,SAAS,GAAG;EAC7B,CAAC;EACD,IAAI,CAAC0G,2DAAmB,CAACzH,IAAI,CAAC,EAAE;IAC9BsJ,IAAI,CAAC3G,GAAG,GAAG,IAAI,CAAC6G,YAAY,CAACpB,8DAAkB,CAACkB,IAAI,CAAC3G,GAAG,EAAE,OAAO,CAAC,CAAC;IACnE2G,IAAI,CAAC+B,GAAG,GAAGrL,IAAI,CAACyD,IAAI;IACpB,IAAI6F,IAAI,CAAC3G,GAAG,EAAE;MACZ,IAAIjC,IAAI,CAAC4K,GAAG,CAACtL,IAAI,CAACK,KAAK,IAAI,CAAC,EAAEL,IAAI,CAACM,MAAM,IAAI,CAAC,CAAC,GAAG/B,2DAAmB,EAAE;QAErE+K,IAAI,CAACS,OAAO,GAAG,IAAI,CAACwB,cAAc;QAClCjC,IAAI,CAACO,SAAS,IAAI,kBAAkB;MACtC;MACAP,IAAI,CAACM,OAAO,GAAG,MAAM;IACvB,CAAC,MAAM;MACLN,IAAI,CAAC3G,GAAG,GAAG,IAAI;IACjB;EACF,CAAC,MAAM;IAELyG,EAAE,GAAGrB,oEAAc;EACrB;EAEA,OAAOqB,EAAE;AACX;AAGA,SAASuB,eAAe,CAACvB,EAAE,EAAEpJ,IAAI,EAAEsJ,IAAI,EAAE;EACvC,IAAI,CAACtJ,IAAI,EAAE;IACTsJ,IAAI,CAAC3G,GAAG,GAAG,sBAAsB;IACjC2G,IAAI,CAACR,KAAK,GAAG;MACXzI,KAAK,EAAE9B,2DAAmB,GAAG,IAAI;MACjC+B,MAAM,EAAE/B,2DAAmB,GAAG;IAChC,CAAC;IACD,OAAO6K,EAAE;EACX;EACAE,IAAI,CAACO,SAAS,GAAG,cAAc;EAC/B,MAAMjH,GAAG,GAAGxC,+DAAY,CAACJ,IAAI,CAACK,KAAK,EAAEL,IAAI,CAACM,MAAM,EAC9C,IAAI,CAAC2K,aAAa,GAAG,CAAC,GAAGvK,IAAI,CAACC,GAAG,CAAC,IAAI,CAACsK,aAAa,GAAGrN,gDAAQ,GAAG,GAAG,EAAEA,gDAAQ,GAAG,IAAI,CAAC,GACrFA,gDAAQ,GAAG,IAAI,EAAEA,gDAAQ,GAAG,EAAE,EAAE,KAAK,CAAC,IACtC;IAACkD,QAAQ,EAAE9C,2DAAmB;IAAE+C,SAAS,EAAE/C,2DAAmBA;EAAA,CAAC;EACnEsL,IAAI,CAACR,KAAK,GAAG;IACXzI,KAAK,EAAEuC,GAAG,CAAC9B,QAAQ,GAAG,IAAI;IAC1BR,MAAM,EAAEsC,GAAG,CAAC7B,SAAS,GAAG,IAAI;IAE5BmK,QAAQ,EAAEtI,GAAG,CAAC9B,QAAQ,GAAG,IAAI;IAC7BqK,SAAS,EAAEvI,GAAG,CAAC7B,SAAS,GAAG;EAC7B,CAAC;EACD,IAAI,CAAC0G,2DAAmB,CAACzH,IAAI,CAAC,EAAE;IAC9BsJ,IAAI,CAAC3G,GAAG,GAAG,IAAI,CAAC6G,YAAY,CAACpB,8DAAkB,CAACkB,IAAI,CAAC3G,GAAG,EAAE,OAAO,CAAC,CAAC;IACnE2G,IAAI,CAAC+B,GAAG,GAAGrL,IAAI,CAACyD,IAAI;IACpB,IAAIzD,IAAI,CAACD,GAAG,IAAIC,IAAI,CAACsK,GAAG,EAAE;MACxBhB,IAAI,CAACS,OAAO,GAAG,IAAI,CAACyB,cAAc;MAClClC,IAAI,CAACM,OAAO,GAAG,MAAM;IACvB,CAAC,MAAM;MACLN,IAAI,CAAC3G,GAAG,GAAG,IAAI;IACjB;IACAyG,EAAE,GAAGvB,iEAAW;EAClB,CAAC,MAAM;IAELuB,EAAE,GAAGrB,oEAAc;EACrB;EAEA,OAAOqB,EAAE;AACX;AAMO,SAASqC,gBAAgB,CAAC3C,KAAK,EAAE9I,IAAI,EAAE+I,MAAM,EAAEC,GAAG,EAAE;EACzD,IAAI,CAACF,KAAK,EAAE;IAEV,OAAOC,MAAM;EACf;EAEA,IAAIK,EAAE,GAAG3B,sDAAc,CAACqB,KAAK,CAAC;EAC9B,MAAMQ,IAAI,GAAG;IAAEN,GAAG,EAAEA;EAAI,CAAC;EACzB,QAAQF,KAAK;IACX,KAAK,IAAI;MAEPM,EAAE,GAAG7B,uDAAc;MACnBwB,MAAM,GAAG,CAAC;QAAG,GAAG,EAAC,IAAI;QAAC,SAAS,EAAC;MAAgB,GAAC,KAAG,CAAI,EAAE,GAAG,EAAEd,6DAAa,CAACjI,IAAI,CAACyJ,QAAQ,GAAC,IAAI,CAAC,CAAC;MACjG;IACF,KAAK,IAAI;MAEPL,EAAE,GAAG7B,uDAAc;MACnBwB,MAAM,GAAG,CAAC,GAAG,CAAC;MACd;IACF,KAAK,IAAI;MAEPO,IAAI,CAACO,SAAS,GAAG,mBAAmB;MACpC;IACF,KAAK,IAAI;IACT,KAAK,IAAI;MAEPT,EAAE,GAAG,MAAM;MACX;IACF,KAAK,IAAI;MAEPA,EAAE,GAAG7B,uDAAc;MACnBwB,MAAM,GAAG,CAAC;QAAG,GAAG,EAAC,IAAI;QAAC,SAAS,EAAC;MAAgB,GAAC,OAAK,CAAI,EAAE,GAAG,EAAE,IAAI,CAACgC,aAAa,CAAC1C,QAAQ,CAACK,YAAY,CAAC,CAAC;MAC3G;IACF,KAAK,IAAI;MACPU,EAAE,GAAG,MAAM;MACXE,IAAI,CAACO,SAAS,GAAG,kBAAkB;MACnC;IACF,KAAK,IAAI;MACPT,EAAE,GAAG7B,uDAAc;MACnBwB,MAAM,GAAG,CAAC;QAAG,GAAG,EAAC,IAAI;QAAC,SAAS,EAAC;MAAgB,GAAC,WAAS,CAAI,EAC5D,IAAI,CAACgC,aAAa,CAAC1C,QAAQ,CAACC,WAAW,CAAC,CAAC,CAAC0C,MAAM,CAAC,GAAG,EAAEjC,MAAM,IAAI,EAAE,CAAC;MACrE;IACF,KAAK,IAAI;MACPK,EAAE,GAAG7B,uDAAc;MACnB;IACF,KAAK,IAAI;MACP,IAAIvH,IAAI,EAAE;QACR,IAAIA,IAAI,CAACE,IAAI,IAAI,kBAAkB,EAAE;UAEnC,OAAO,IAAI;QACb;QAEA,OAAOF,IAAI,CAACsK,GAAG;QACf,OAAOtK,IAAI,CAACD,GAAG;MACjB;MACAqJ,EAAE,GAAG7B,uDAAc;MACnBwB,MAAM,GAAG,CAAC;QAAG,GAAG,EAAC,IAAI;QAAC,SAAS,EAAC;MAAgB,GAAC,YAAU,CAAI,EAAE,GAAG,EAAE,IAAI,CAACgC,aAAa,CAAC1C,QAAQ,CAACI,iBAAiB,CAAC,CAAC;MACrH;IACF,KAAK,IAAI;MACPW,EAAE,GAAGxB,gEAAU;MACf,IAAI5H,IAAI,EAAE;QACRsJ,IAAI,CAACkB,SAAS,GAAGxK,IAAI,CAACyK,KAAK;QAC3BnB,IAAI,CAACoB,QAAQ,GAAG1K,IAAI,CAAC0K,QAAQ;QAC7BpB,IAAI,CAACG,QAAQ,GAAGzJ,IAAI,CAACyJ,QAAQ;MAC/B;MACAV,MAAM,GAAG,IAAI;MACb;IACF,KAAK,IAAI;IACT,KAAK,IAAI;MACPK,EAAE,GAAG,IAAI;MACTL,MAAM,GAAG,IAAI;MACb;IACF,KAAK,IAAI;MAEPK,EAAE,GAAG7B,uDAAc;MACnBwB,MAAM,GAAG,CAAC;QAAG,GAAG,EAAC,IAAI;QAAC,SAAS,EAAC;MAAgB,GAAC,qBAAmB,CAAI,EAAE,GAAG,EAAE,IAAI,CAACgC,aAAa,CAAC1C,QAAQ,CAACM,YAAY,CAAC,CAAC;MACzH;IACF;MACE,IAAI,CAACS,EAAE,EAAE;QAEPA,EAAE,GAAG7B,uDAAc;QACnBwB,MAAM,GAAG,CAAC;UAAG,GAAG,EAAC,IAAI;UAAC,SAAS,EAAC;QAAqB,GAAC,WAAS,CAAI,EAAE,GAAG,EAAE,IAAI,CAACgC,aAAa,CAAC1C,QAAQ,CAACO,cAAc,CAAC,CAAC;MACxH;MACA;EAAM;EAEV,IAAI,CAACQ,EAAE,EAAE;IACP,OAAOL,MAAM;EACf;EACA,OAAOxB,0DAAmB,CAAC6B,EAAE,EAAEE,IAAI,EAAEP,MAAM,CAAC;AAC9C;AAAC;AAGD,SAAS2C,eAAe,CAACpC,IAAI,EAAEtJ,IAAI,EAAE;EACnCsJ,IAAI,CAACR,KAAK,GAAG;IACXzI,KAAK,EAAE9B,2DAAmB,GAAG,IAAI;IACjC+B,MAAM,EAAE/B,2DAAmB,GAAG,IAAI;IAClCgC,QAAQ,EAAEhC,2DAAmB,GAAG,IAAI;IACpCiC,SAAS,EAAEjC,2DAAmB,GAAG;EACnC,CAAC;EACD+K,IAAI,CAACO,SAAS,GAAG,cAAc;EAC/BP,IAAI,CAAC+B,GAAG,GAAG,IAAI,CAACN,aAAa,CAAC1C,QAAQ,CAACK,YAAY,CAAC;EACpD,IAAI,CAAC1I,IAAI,EAAE;IACTsJ,IAAI,CAAC3G,GAAG,GAAG,sBAAsB;EACnC,CAAC,MAAM;IACL2G,IAAI,CAAC3G,GAAG,GAAG2G,IAAI,CAAC3G,GAAG,IAAI,sBAAsB;EAC/C;EACA2G,IAAI,CAACqC,KAAK,GAAGrC,IAAI,CAAC+B,GAAG;EACrB,OAAO/B,IAAI;AACb;AAGA,SAASsC,eAAe,CAACtC,IAAI,EAAEtJ,IAAI,EAAE;EACnC,MAAM4C,GAAG,GAAGxC,+DAAY,CAACJ,IAAI,CAACK,KAAK,EAAEL,IAAI,CAACM,MAAM,EAAE9B,6DAAqB,EAAED,2DAAmB,CAAC;EAC7F+K,IAAI,CAACR,KAAK,GAAG;IACXzI,KAAK,EAAEuC,GAAG,CAACvC,KAAK,GAAG,IAAI;IACvBC,MAAM,EAAEsC,GAAG,CAACtC,MAAM,GAAG,IAAI;IACzBC,QAAQ,EAAE/B,6DAAqB,GAAG,IAAI;IACtCgC,SAAS,EAAEjC,2DAAmB,GAAG;EACnC,CAAC;EACD+K,IAAI,CAACO,SAAS,GAAG,cAAc;EAC/BP,IAAI,CAAC+B,GAAG,GAAG,IAAI,CAACN,aAAa,CAAC1C,QAAQ,CAACM,YAAY,CAAC;EACpDW,IAAI,CAACqC,KAAK,GAAGrC,IAAI,CAAC+B,GAAG;EACrB,IAAI,CAACrL,IAAI,EAAE;IACTsJ,IAAI,CAAC3G,GAAG,GAAG,sBAAsB;EACnC,CAAC,MAAM;IACL2G,IAAI,CAAC3G,GAAG,GAAG2G,IAAI,CAAC3G,GAAG,IAAI,sBAAsB;EAC/C;EACA,OAAO2G,IAAI;AACb;AAQA,SAASJ,cAAc,CAACJ,KAAK,EAAE9I,IAAI,EAAE+I,MAAM,EAAEC,GAAG,EAAE;EAChD,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC5F,QAAQ,CAAC0F,KAAK,CAAC,EAAE;IAClD,IAAIM,EAAE,GAAG3B,sDAAc,CAACqB,KAAK,CAAC;IAC9B,IAAIQ,IAAI,GAAG7B,wDAAgB,CAACqB,KAAK,EAAE9I,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9CsJ,IAAI,CAACN,GAAG,GAAGA,GAAG;IACd,QAAOF,KAAK;MACV,KAAK,IAAI;QACPC,MAAM,GAAG,IAAI;QACb;MACF,KAAK,IAAI;QACPO,IAAI,GAAGoC,eAAe,CAACvC,IAAI,CAAC,IAAI,EAAEG,IAAI,EAAEtJ,IAAI,CAAC;QAC7C+I,MAAM,GAAG,CAACxB,0DAAmB,CAAC,KAAK,EAAE+B,IAAI,EAAE,IAAI,CAAC,EAAE,GAAG,EAAEA,IAAI,CAAC+B,GAAG,CAAC;QAChEjC,EAAE,GAAG7B,uDAAc;QAEnB+B,IAAI,GAAG;UAACN,GAAG,EAAEA;QAAG,CAAC;QACjB;MACF,KAAK,IAAI;QACPM,IAAI,GAAGsC,eAAe,CAACzC,IAAI,CAAC,IAAI,EAAEG,IAAI,EAAEtJ,IAAI,CAAC;QAC7C+I,MAAM,GAAG,CAACxB,0DAAmB,CAAC,KAAK,EAAE+B,IAAI,EAAE,IAAI,CAAC,EAAE,GAAG,EAAEA,IAAI,CAAC+B,GAAG,CAAC;QAChEjC,EAAE,GAAG7B,uDAAc;QAEnB+B,IAAI,GAAG;UAACN,GAAG,EAAEA;QAAG,CAAC;QACjB;MACF,KAAK,IAAI;QACPI,EAAE,GAAG,MAAM;QACXE,IAAI,CAACO,SAAS,GAAG,SAAS;QAC1B,IAAI7J,IAAI,EAAE;UACRsJ,IAAI,CAACO,SAAS,IAAI,GAAG,GAAG7B,8DAAc,CAAChI,IAAI,CAACsK,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC;QAC/D;QACA;MACF,KAAK,IAAI;QACP,IAAIjJ,KAAK;QACT,IAAIrB,IAAI,EAAE;UACR,IAAIA,IAAI,CAACE,IAAI,IAAI,kBAAkB,EAAE;YAEnC,OAAO,IAAI;UACb;UACAmB,KAAK,GAAGrB,IAAI,CAACyD,IAAI;UAEjB,OAAOzD,IAAI,CAACsK,GAAG;UACf,OAAOtK,IAAI,CAACD,GAAG;QACjB;QACAqJ,EAAE,GAAG7B,uDAAc;QACnBwB,MAAM,GAAG,CAAC;UAAG,GAAG,EAAC,IAAI;UAAC,SAAS,EAAC;QAAgB,GAAC,YAAU,CAAI,EAC7Db,+DAAe,CAAC7G,KAAK,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC0J,aAAa,CAAC1C,QAAQ,CAACI,iBAAiB,CAAC,CAAC;QAC/E;IAAM;IAEV,OAAOlB,0DAAmB,CAAC6B,EAAE,EAAEE,IAAI,EAAEP,MAAM,CAAC;EAC9C;EACA,OAAO0C,gBAAgB,CAACtC,IAAI,CAAC,IAAI,EAAEL,KAAK,EAAE9I,IAAI,EAAE+I,MAAM,EAAEC,GAAG,CAAC;AAC9D;AAGA,SAAS6C,iBAAiB,CAAC7L,IAAI,EAAE8L,OAAO,EAAE;EACxC,IAAIC,OAAO;EACX,IAAI1H,IAAI,EAAEtE,GAAG,EAAEG,IAAI;EACnB,IAAI4L,OAAO,EAAE;IACXzH,IAAI,GAAGrE,IAAI,CAAC2J,OAAO;IACnBzJ,IAAI,GAAGF,IAAI,CAACgM,OAAO,IAAI,YAAY;IACnCjM,GAAG,GAAGC,IAAI,CAACiM,MAAM;EACnB,CAAC,MAAM;IACL5H,IAAI,GAAGrE,IAAI,CAACsK,GAAG;IACfpK,IAAI,GAAGF,IAAI,CAACE,IAAI;IAChBH,GAAG,GAAGC,IAAI,CAACD,GAAG;EAChB;EAEA,IAAIsE,IAAI,EAAE;IACR,MAAMhB,IAAI,GAAG8C,+DAAY,CAAC9B,IAAI,EAAEnE,IAAI,CAAC;IACrC,IAAI,CAACmD,IAAI,EAAE;MACT,MAAM,IAAId,KAAK,CAAC,eAAe,CAAC;IAClC;IACAwJ,OAAO,GAAGhK,OAAO,CAACC,OAAO,CAACqB,IAAI,CAAC;EACjC,CAAC,MAAM,IAAItD,GAAG,EAAE;IACdgM,OAAO,GAAGG,KAAK,CAAC,IAAI,CAAC1C,YAAY,CAACpB,8DAAkB,CAACrI,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,CACjEoM,IAAI,CAACC,GAAG,IAAI;MACX,IAAIA,GAAG,CAACC,EAAE,EAAE;QACV,OAAOD,GAAG,CAAC/I,IAAI,EAAE;MACnB,CAAC,MAAM;QACL,MAAM,IAAId,KAAK,CAAE,6BAA4B6J,GAAG,CAACE,MAAO,IAAGF,GAAG,CAACG,UAAW,EAAC,CAAC;MAC9E;IACF,CAAC,CAAC;EACN,CAAC,MAAM;IACL,MAAM,IAAIhK,KAAK,CAAC,oBAAoB,CAAC;EACvC;EAGA,OAAOwJ,OAAO,CACXI,IAAI,CAAC9I,IAAI,IAAI;IAGZ,OAAOzB,8DAAW,CAACyB,IAAI,EAAEyI,OAAO,GAAGtN,6DAAqB,GAAGD,2DAAmB,EAAEA,2DAAmB,EAAE,CAAC,CAAC,EAAE,CAACuN,OAAO,CAAC;EACpH,CAAC,CAAC,CAACK,IAAI,CAACK,MAAM,IAAI;IAChB,IAAIV,OAAO,EAAE;MACX9L,IAAI,CAACgM,OAAO,GAAGQ,MAAM,CAACtM,IAAI;IAC5B,CAAC,MAAM;MACLF,IAAI,CAACE,IAAI,GAAGsM,MAAM,CAACtM,IAAI;IACzB;IACAF,IAAI,CAACa,IAAI,GAAG2L,MAAM,CAACnJ,IAAI,CAACxC,IAAI;IAC5Bb,IAAI,CAACK,KAAK,GAAGmM,MAAM,CAACnM,KAAK;IACzBL,IAAI,CAACM,MAAM,GAAGkM,MAAM,CAAClM,MAAM;IAC3B,OAAON,IAAI,CAACD,GAAG;IACf,OAAOC,IAAI,CAACiM,MAAM;IAGlBjM,IAAI,CAAC2C,GAAG,GAAGF,GAAG,CAACiB,eAAe,CAAC8I,MAAM,CAACnJ,IAAI,CAAC;IAC3C,OAAOoB,+DAAY,CAAC+H,MAAM,CAACnJ,IAAI,CAAC;EAClC,CAAC,CAAC,CAAC8I,IAAI,CAAC/E,GAAG,IAAI;IACb,IAAI0E,OAAO,EAAE;MACX9L,IAAI,CAAC2J,OAAO,GAAGvC,GAAG,CAAC/C,IAAI;IACzB,CAAC,MAAM;MACLrE,IAAI,CAACsK,GAAG,GAAGlD,GAAG,CAAC/C,IAAI;IACrB;IACA,OAAOrE,IAAI;EACb,CAAC,CAAC,CAACyM,KAAK,CAACnK,GAAG,IAAI;IACd,OAAOtC,IAAI,CAACsK,GAAG;IACf,OAAOtK,IAAI,CAAC2J,OAAO;IACnB,OAAO3J,IAAI,CAAC2C,GAAG;IACf3C,IAAI,CAACK,KAAK,GAAG9B,2DAAmB;IAChCyB,IAAI,CAACM,MAAM,GAAG/B,2DAAmB;IAEjC,MAAM+D,GAAG;EACX,CAAC,CAAC;AACN;AAGO,SAASoK,cAAc,CAAC5D,KAAK,EAAE9I,IAAI,EAAE+I,MAAM,EAAEC,GAAG,EAAEC,KAAK,EAAE;EAC9D,IAAIH,KAAK,IAAI,IAAI,IAAIA,KAAK,IAAI,IAAI,EAAE;IAClC,MAAM6D,OAAO,GAAG7D,KAAK,IAAI,IAAI;IAC7B,MAAMQ,IAAI,GAAGqD,OAAO,GAAGjB,eAAe,CAACvC,IAAI,CAAC,IAAI,EAAE;MAACH,GAAG,EAAEA;IAAG,CAAC,EAAEhJ,IAAI,CAAC,GACjE4L,eAAe,CAACzC,IAAI,CAAC,IAAI,EAAE;MAACH,GAAG,EAAEA;IAAG,CAAC,EAAEhJ,IAAI,CAAC;IAE9C,IAAI4M,aAAa;IACjB,IAAI;MACFA,aAAa,GAAGzE,6DAAiB,CAAC0D,iBAAiB,CAAC1C,IAAI,CAAC,IAAI,EAAEnJ,IAAI,EAAE8I,KAAK,IAAI,IAAI,CAAC,CAAC;IACtF,CAAC,CAAC,OAAO1E,KAAK,EAAE;MACdkB,OAAO,CAACuH,IAAI,CAAC,wBAAwB,EAAEzI,KAAK,CAAC0I,OAAO,CAAC;MACrDF,aAAa,GAAGzE,6DAAiB,CAAC/D,KAAK,CAAC;IAC1C;IACAkF,IAAI,CAACyD,QAAQ,GAAGH,aAAa;IAC7B7D,MAAM,GAAG,CAACxB,0DAAmB,CAACO,+DAAS,EAAEwB,IAAI,EAAE,IAAI,CAAC,EAAE,GAAG,EAAEA,IAAI,CAAC+B,GAAG,CAAC;IACpE,OAAO9D,0DAAmB,CAACA,uDAAc,EAAE;MAACyB,GAAG,EAAEA;IAAG,CAAC,EAAED,MAAM,CAAC;EAChE,CAAC,MAAM,IAAID,KAAK,IAAI,IAAI,EAAE;IACxB,IAAIG,KAAK,CAAC7F,QAAQ,CAAC,IAAI,CAAC,EAAE;MAExB,OAAOmE,0DAAmB,CAAC,MAAM,EAAE;QAACyB,GAAG,EAAEA;MAAG,CAAC,EAC3C,CAAC;QAAG,GAAG,EAAC,IAAI;QAAC,SAAS,EAAC;MAAgB,GAAC,cAAY,CAAI,EAAE,GAAG,CAAC,CAAC;IACnE;IAEA,MAAMM,IAAI,GAAG7B,wDAAgB,CAAC,IAAI,EAAEzH,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/CsJ,IAAI,CAACN,GAAG,GAAGA,GAAG;IACdM,IAAI,CAACO,SAAS,GAAG,aAAa;IAC9B,OAAOtC,0DAAmB,CAACE,sDAAc,CAAC,IAAI,CAAC,EAAE6B,IAAI,EAAEP,MAAM,CAAC;EAChE;EACA,OAAOG,cAAc,CAACC,IAAI,CAAC,IAAI,EAAEL,KAAK,EAAE9I,IAAI,EAAE+I,MAAM,EAAEC,GAAG,CAAC;AAC5D;;;;;;;;;;;;;;;;;AChiByD;AAGlD,SAASgE,mBAAmB,GAAG;EACpC,IAAIC,IAAI,GAAGjQ,oDAAY;EACvB,IAAI,OAAOkK,MAAM,CAACgG,QAAQ,IAAI,QAAQ,EAAE;IACtC,IAAIhG,MAAM,CAACgG,QAAQ,CAACC,QAAQ,IAAI,OAAO,IAAIjG,MAAM,CAACgG,QAAQ,CAACE,QAAQ,IAAI,WAAW,EAAE;MAClFH,IAAI,GAAGpQ,yDAAiB;IAC1B,CAAC,MAAM,IAAIqK,MAAM,CAACgG,QAAQ,CAACE,QAAQ,EAAE;MACnCH,IAAI,GAAG/F,MAAM,CAACgG,QAAQ,CAACE,QAAQ,IAAIlG,MAAM,CAACgG,QAAQ,CAACG,IAAI,GAAG,GAAG,GAAGnG,MAAM,CAACgG,QAAQ,CAACG,IAAI,GAAG,EAAE,CAAC;IAC5F;EACF;EACA,OAAOJ,IAAI;AACb;AAGO,SAASK,kBAAkB,GAAG;EACnC,IAAI,OAAOpG,MAAM,CAACgG,QAAQ,IAAI,QAAQ,EAAE;IACtC,OAAOhG,MAAM,CAACgG,QAAQ,CAACC,QAAQ,IAAI,QAAQ;EAC7C;EACA,OAAO,KAAK;AACd;AAEO,SAASI,WAAW,GAAG;EAC5B,IAAI,OAAOrG,MAAM,CAACgG,QAAQ,IAAI,QAAQ,EAAE;IACtC,OAAOhG,MAAM,CAACgG,QAAQ,CAACE,QAAQ,IAAI,WAAW;EAChD;EACA,OAAO,KAAK;AACd;;;;;;;;;;;;;;ACzBe,MAAMI,gBAAgB,CAAC;EAEpC,OAAOC,SAAS,CAACzE,GAAG,EAAE0E,KAAK,EAAE;IAC3BC,YAAY,CAACC,OAAO,CAAC5E,GAAG,EAAE6E,IAAI,CAACC,SAAS,CAACJ,KAAK,CAAC,CAAC;EAClD;EAGA,OAAOK,SAAS,CAAC/E,GAAG,EAAE;IACpB,MAAM0E,KAAK,GAAGC,YAAY,CAACK,OAAO,CAAChF,GAAG,CAAC;IACvC,OAAO0E,KAAK,IAAIG,IAAI,CAACI,KAAK,CAACP,KAAK,CAAC;EACnC;EAGA,OAAOQ,YAAY,CAAClF,GAAG,EAAE0E,KAAK,EAAE;IAC9B,MAAMS,MAAM,GAAG,IAAI,CAACJ,SAAS,CAAC/E,GAAG,CAAC;IAClC,IAAI,CAACyE,SAAS,CAACzE,GAAG,EAAEoF,MAAM,CAACC,MAAM,CAACF,MAAM,IAAI,CAAC,CAAC,EAAET,KAAK,CAAC,CAAC;EACzD;EAGA,OAAOY,UAAU,CAACtF,GAAG,EAAE;IACrB2E,YAAY,CAACW,UAAU,CAACtF,GAAG,CAAC;EAC9B;AACF;;;;;;;;;;;;;;ACvBe,MAAMuF,cAAc,CAAC;EAGlC,OAAOC,YAAY,CAACC,IAAI,EAAE;IAExB,MAAMC,KAAK,GAAGD,IAAI,CAAClK,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;IAChC,MAAMoK,MAAM,GAAG,CAAC,CAAC;IACjB,IAAIC,IAAI,GAAG,EAAE;IACb,IAAIF,KAAK,CAAC,CAAC,CAAC,EAAE;MACZE,IAAI,GAAGF,KAAK,CAAC,CAAC,CAAC,CAAC1I,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAACzB,KAAK,CAAC,GAAG,CAAC;IAC7C;IACA,IAAImK,KAAK,CAAC,CAAC,CAAC,EAAE;MACZA,KAAK,CAAC,CAAC,CAAC,CAACnK,KAAK,CAAC,GAAG,CAAC,CAACuC,OAAO,CAAE+H,GAAG,IAAK;QAEnC,MAAMC,EAAE,GAAGD,GAAG,CAACtN,OAAO,CAAC,GAAG,CAAC;QAC3B,IAAIuN,EAAE,GAAG,CAAC,EAAE;UACVH,MAAM,CAACE,GAAG,CAACE,KAAK,CAAC,CAAC,EAAED,EAAE,CAAC,CAAC,GAAGE,kBAAkB,CAACH,GAAG,CAACE,KAAK,CAACD,EAAE,GAAG,CAAC,CAAC,CAAC;QAClE;MACF,CAAC,CAAC;IACJ;IACA,OAAO;MAACF,IAAI,EAAEA,IAAI;MAAED,MAAM,EAAEA;IAAM,CAAC;EACrC;EAEA,OAAOM,UAAU,CAACC,GAAG,EAAE;IACrBhI,MAAM,CAACgG,QAAQ,CAACuB,IAAI,GAAGS,GAAG;EAC5B;EAEA,OAAOC,cAAc,CAACP,IAAI,EAAED,MAAM,EAAE;IAClC,IAAIO,GAAG,GAAGN,IAAI,CAACvE,IAAI,CAAC,GAAG,CAAC;IACxB,MAAM+E,IAAI,GAAG,EAAE;IACf,KAAK,MAAMpG,GAAG,IAAI2F,MAAM,EAAE;MACxB,IAAIA,MAAM,CAACU,cAAc,CAACrG,GAAG,CAAC,EAAE;QAC9BoG,IAAI,CAAC9H,IAAI,CAAC0B,GAAG,GAAG,GAAG,GAAGsG,kBAAkB,CAACX,MAAM,CAAC3F,GAAG,CAAC,CAAC,CAAC;MACxD;IACF;IACA,IAAIoG,IAAI,CAAC7L,MAAM,GAAG,CAAC,EAAE;MACnB2L,GAAG,IAAI,GAAG,GAAGE,IAAI,CAAC/E,IAAI,CAAC,GAAG,CAAC;IAC7B;IACA,OAAO6E,GAAG;EACZ;EAEA,OAAOK,WAAW,CAACd,IAAI,EAAEzF,GAAG,EAAE0E,KAAK,EAAE;IACnC,MAAM8B,MAAM,GAAGjB,cAAc,CAACC,YAAY,CAACC,IAAI,CAAC;IAChDe,MAAM,CAACb,MAAM,CAAC3F,GAAG,CAAC,GAAG0E,KAAK;IAC1B,OAAOa,cAAc,CAACY,cAAc,CAACK,MAAM,CAACZ,IAAI,EAAEY,MAAM,CAACb,MAAM,CAAC;EAClE;EAEA,OAAOc,cAAc,CAAChB,IAAI,EAAEzF,GAAG,EAAE;IAC/B,MAAMwG,MAAM,GAAGjB,cAAc,CAACC,YAAY,CAACC,IAAI,CAAC;IAChD,OAAOe,MAAM,CAACb,MAAM,CAAC3F,GAAG,CAAC;IACzB,OAAOuF,cAAc,CAACY,cAAc,CAACK,MAAM,CAACZ,IAAI,EAAEY,MAAM,CAACb,MAAM,CAAC;EAClE;EAEA,OAAOe,eAAe,CAACjB,IAAI,EAAEkB,SAAS,EAAE;IACtC,MAAMH,MAAM,GAAGjB,cAAc,CAACC,YAAY,CAACC,IAAI,CAAC;IAChDe,MAAM,CAACZ,IAAI,CAAC,CAAC,CAAC,GAAGe,SAAS;IAC1B,OAAOpB,cAAc,CAACY,cAAc,CAACK,MAAM,CAACZ,IAAI,EAAEY,MAAM,CAACb,MAAM,CAAC;EAClE;EAEA,OAAOiB,eAAe,CAACnB,IAAI,EAAEoB,SAAS,EAAE;IACtC,MAAML,MAAM,GAAGjB,cAAc,CAACC,YAAY,CAACC,IAAI,CAAC;IAChD,IAAIoB,SAAS,EAAE;MACbL,MAAM,CAACb,MAAM,CAACmB,IAAI,GAAGD,SAAS;IAChC,CAAC,MAAM;MACL,OAAOL,MAAM,CAACb,MAAM,CAACmB,IAAI;IAC3B;IACA,OAAOvB,cAAc,CAACY,cAAc,CAACK,MAAM,CAACZ,IAAI,EAAEY,MAAM,CAACb,MAAM,CAAC;EAClE;EAEA,OAAOoB,WAAW,CAACtB,IAAI,EAAEuB,KAAK,EAAE;IAC9B,MAAMR,MAAM,GAAGjB,cAAc,CAACC,YAAY,CAACC,IAAI,CAAC;IAChDe,MAAM,CAACZ,IAAI,CAAC,CAAC,CAAC,GAAGoB,KAAK;IAEtB,OAAOR,MAAM,CAACb,MAAM,CAACmB,IAAI;IACzB,OAAOvB,cAAc,CAACY,cAAc,CAACK,MAAM,CAACZ,IAAI,EAAEY,MAAM,CAACb,MAAM,CAAC;EAClE;AACF;;;;;;;;;;;;;;;;;;;;;AC7EO,SAASsB,eAAe,CAAC9D,IAAI,EAAE+D,MAAM,EAAE;EAC5CA,MAAM,GAAGA,MAAM,IAAIhJ,MAAM,CAACiJ,SAAS,CAACC,YAAY,IAAIlJ,MAAM,CAACiJ,SAAS,CAACE,QAAQ;EAC7E,MAAMC,GAAG,GAAG,IAAIC,IAAI,EAAE;EACtB,IAAIpE,IAAI,CAACqE,WAAW,EAAE,IAAIF,GAAG,CAACE,WAAW,EAAE,EAAE;IAE3C,IAAIrE,IAAI,CAACsE,QAAQ,EAAE,IAAIH,GAAG,CAACG,QAAQ,EAAE,IAAItE,IAAI,CAACuE,OAAO,EAAE,IAAIJ,GAAG,CAACI,OAAO,EAAE,EAAE;MAExE,OAAOvE,IAAI,CAACwE,kBAAkB,CAACT,MAAM,EAAE;QAACU,MAAM,EAAE,KAAK;QAAEC,IAAI,EAAE,SAAS;QAAEC,MAAM,EAAE;MAAS,CAAC,CAAC;IAC7F;IAEA,OAAO3E,IAAI,CAAC4E,kBAAkB,CAACb,MAAM,EACnC;MAACU,MAAM,EAAE,KAAK;MAAEI,KAAK,EAAE,OAAO;MAAEC,GAAG,EAAE,SAAS;MAAEJ,IAAI,EAAE,SAAS;MAAEC,MAAM,EAAE;IAAS,CAAC,CAAC;EACxF;EAEA,OAAO3E,IAAI,CAAC4E,kBAAkB,CAACb,MAAM,EAAE;IAACgB,IAAI,EAAE,SAAS;IAAEF,KAAK,EAAE,OAAO;IAAEC,GAAG,EAAE;EAAS,CAAC,CAAC;AAC3F;AAGO,SAASE,kBAAkB,CAAChF,IAAI,EAAE+D,MAAM,EAAE;EAC/CA,MAAM,GAAGA,MAAM,IAAIhJ,MAAM,CAACiJ,SAAS,CAACC,YAAY,IAAIlJ,MAAM,CAACiJ,SAAS,CAACE,QAAQ;EAC7E,MAAMC,GAAG,GAAG,IAAIC,IAAI,EAAE;EACtB,MAAMa,QAAQ,GAAG1Q,IAAI,CAACkF,KAAK,CAAC,CAACuG,IAAI,CAACkF,OAAO,EAAE,GAAGlF,IAAI,CAACmF,iBAAiB,EAAE,GAAG,MAAM,IAAI,UAAU,CAAC;EAC9F,MAAMC,OAAO,GAAG7Q,IAAI,CAACkF,KAAK,CAAC,CAAC0K,GAAG,CAACe,OAAO,EAAE,GAAGf,GAAG,CAACgB,iBAAiB,EAAE,GAAG,MAAM,IAAI,UAAU,CAAC;EAC3F,MAAME,IAAI,GAAGJ,QAAQ,GAAGG,OAAO;EAC/B,IAAI7Q,IAAI,CAAC+Q,GAAG,CAACD,IAAI,CAAC,GAAG,CAAC,EAAE;IAEtB,OAAO,IAAIE,IAAI,CAACC,kBAAkB,CAACzB,MAAM,EAAE;MAAE0B,OAAO,EAAE;IAAO,CAAC,CAAC,CAACC,MAAM,CAACL,IAAI,EAAE,KAAK,CAAC;EACrF;EAEA,OAAO,IAAIE,IAAI,CAACI,cAAc,CAAC5B,MAAM,CAAC,CAAC2B,MAAM,CAAC1F,IAAI,CAAC;AACrD;AAIO,SAASlE,aAAa,CAAC8J,OAAO,EAAEC,QAAQ,EAAE;EAC/C,IAAI,OAAOD,OAAO,IAAI,QAAQ,EAAE;IAC9B,OAAO,EAAE;EACX;EAEA,IAAIpR,GAAG,GAAG,CAACD,IAAI,CAACkF,KAAK,CAACmM,OAAO,GAAG,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE;EAC7C,IAAIE,KAAK,GAAGvR,IAAI,CAACkF,KAAK,CAACmM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC;EAE3C,IAAIC,QAAQ,IAAIC,KAAK,GAAG,CAAC,EAAE;IACzBtR,GAAG,GAAGA,GAAG,GAAG,EAAE,GAAI,IAAGA,GAAI,EAAC,GAAGA,GAAG;EAClC;EACA,IAAIuR,GAAG,GAAG,CAACH,OAAO,GAAG,CAAC,IAAI,EAAE;EAC5BG,GAAG,GAAGA,GAAG,GAAG,EAAE,GAAI,IAAGA,GAAI,EAAC,GAAGA,GAAG;EAChC,IAAID,KAAK,IAAI,CAAC,EAAE;IACd,OAAQ,GAAEtR,GAAI,IAAGuR,GAAI,EAAC;EACxB;EACA,OAAQ,GAAED,KAAM,IAAGtR,GAAI,IAAGuR,GAAI,EAAC;AACjC;AAGO,SAASC,gBAAgB,CAACC,KAAK,EAAE;EACtC,IAAI,CAACA,KAAK,IAAIA,KAAK,IAAI,CAAC,EAAE;IACxB,OAAO,SAAS;EAClB;EAEA,MAAMC,KAAK,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;EACrD,MAAMC,MAAM,GAAG5R,IAAI,CAACC,GAAG,CAACD,IAAI,CAACkF,KAAK,CAAClF,IAAI,CAAC6R,IAAI,CAACH,KAAK,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,EAAEC,KAAK,CAAC9O,MAAM,GAAC,CAAC,CAAC;EAC9E,MAAMiP,KAAK,GAAGJ,KAAK,GAAG1R,IAAI,CAAC+R,GAAG,CAAC,IAAI,EAAEH,MAAM,CAAC;EAC5C,MAAMI,KAAK,GAAGJ,MAAM,GAAG,CAAC,GAAIE,KAAK,GAAG,CAAC,GAAG,CAAC,GAAIA,KAAK,GAAG,EAAE,GAAG,CAAC,GAAG,CAAE,GAAI,CAAC;EACrE,OAAOA,KAAK,CAACG,OAAO,CAACD,KAAK,CAAC,GAAG,GAAG,GAAGL,KAAK,CAACC,MAAM,CAAC;AACnD;AAGO,SAASpK,eAAe,CAAC0K,QAAQ,EAAEC,SAAS,EAAE;EACnD,IAAI,OAAOD,QAAQ,IAAI,QAAQ,EAAE;IAC/B,OAAOA,QAAQ;EACjB;EACA,OAAOA,QAAQ,CAACrP,MAAM,GAAGsP,SAAS,GAChCD,QAAQ,CAAC7D,KAAK,CAAC,CAAC,EAAE8D,SAAS,GAAC,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,GAAGD,QAAQ,CAAC7D,KAAK,CAAC,CAAC,GAAG8D,SAAS,GAAC,CAAC,CAAC,GAAGD,QAAQ;AACzF;AAIA,SAASE,iBAAiB,CAACpF,KAAK,EAAE;EAChC,IAAIe,IAAI,GAAG,CAAC;EACZf,KAAK,GAAG,EAAE,GAAGA,KAAK;EAClB,KAAK,IAAIxI,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGwI,KAAK,CAACnK,MAAM,EAAE2B,CAAC,EAAE,EAAE;IACrCuJ,IAAI,GAAI,CAACA,IAAI,IAAI,CAAC,IAAIA,IAAI,GAAIf,KAAK,CAACjH,UAAU,CAACvB,CAAC,CAAC;IACjDuJ,IAAI,GAAGA,IAAI,GAAGA,IAAI;EACpB;EACA,OAAOA,IAAI;AACb;AAGO,SAASsE,iBAAiB,CAACC,MAAM,EAAE;EACxC,OAAOtS,IAAI,CAAC+Q,GAAG,CAACqB,iBAAiB,CAACE,MAAM,CAAC,CAAC,GAAG,EAAE;AACjD;AAOO,SAAShL,cAAc,CAACO,EAAE,EAAE0K,KAAK,EAAEC,EAAE,EAAE;EAC5C,OAAO,CAACD,KAAK,GAAG,KAAK,GAAG,KAAK,KAAKC,EAAE,GAAG,KAAK,GAAG,KAAK,CAAC,GAAGH,iBAAiB,CAACxK,EAAE,CAAC;AAC/E;AAGO,SAAS4K,SAAS,CAACC,WAAW,EAAE;EACrC,MAAMC,UAAU,GAAGD,WAAW,CAC3BE,WAAW,EAAE,CACb/O,KAAK,CAAC,EAAE,CAAC,CACT4F,GAAG,CAACoJ,IAAI,IAAI,OAAO,GAAGA,IAAI,CAAC9M,UAAU,EAAE,CAAC;EAC3C,OAAOO,MAAM,CAACwM,aAAa,CAAC,GAAGH,UAAU,CAAC;AAC5C;;;;;;;;;;;;;;;;;;;;;;;;;;AC3GoC;AAG7B,SAASK,aAAa,CAAClB,KAAK,EAAE;EACnC,MAAMmB,OAAO,GAAG7Q,QAAQ,CAAC8Q,cAAc,CAAC,eAAe,CAAC;EACxD,MAAMC,IAAI,GAAG/Q,QAAQ,CAAC+Q,IAAI,IAAI/Q,QAAQ,CAACgR,oBAAoB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;EACtE,MAAMC,OAAO,GAAGjR,QAAQ,CAACC,aAAa,CAAC,MAAM,CAAC;EAC9CgR,OAAO,CAAC9T,IAAI,GAAG,WAAW;EAC1B8T,OAAO,CAACxL,EAAE,GAAG,eAAe;EAC5BwL,OAAO,CAACC,GAAG,GAAG,eAAe;EAC7BD,OAAO,CAACE,IAAI,GAAG,eAAe,IAAIzB,KAAK,GAAG,CAAC,GAAG,GAAG,GAAG,EAAE,CAAC,GAAG,MAAM;EAChE,IAAImB,OAAO,EAAE;IACXE,IAAI,CAACK,WAAW,CAACP,OAAO,CAAC;EAC3B;EACAE,IAAI,CAACM,WAAW,CAACJ,OAAO,CAAC;EAEzBjR,QAAQ,CAAC6I,KAAK,GAAG,CAAC6G,KAAK,GAAG,CAAC,GAAG,GAAG,GAACA,KAAK,GAAC,IAAI,GAAG,EAAE,IAAI,QAAQ;AAC/D;AAGO,SAAS4B,OAAO,CAACC,EAAE,EAAEC,QAAQ,EAAEC,aAAa,EAAEC,IAAI,EAAE;EACzD,IAAIC,IAAI,GAAG,IAAI;EACfJ,EAAE,GAAGA,EAAE,IAAIA,EAAE,CAACvJ,IAAI,EAAE;EACpB0J,IAAI,GAAGA,IAAI,IAAIA,IAAI,CAAC1J,IAAI,EAAE;EAE1B,IAAIuJ,EAAE,EAAE;IACNI,IAAI,GAAG;MACLJ,EAAE,EAAEA;IACN,CAAC;EACH;EAEA,IAAI,OAAOG,IAAI,IAAI,QAAQ,EAAE;IAC3BC,IAAI,GAAGA,IAAI,IAAI,CAAC,CAAC;IACjBA,IAAI,CAACD,IAAI,GAAGA,IAAI,GAAGA,IAAI,GAAGf,uDAAe;EAC3C;EAEA,IAAIa,QAAQ,EAAE;IACZG,IAAI,GAAGA,IAAI,IAAI,CAAC,CAAC;IACjB,IAAIE,QAAQ,GAAGJ,aAAa;IAE5B,MAAMK,OAAO,GAAG,0CAA0C,CAACnP,IAAI,CAAC6O,QAAQ,CAAC;IACzE,IAAIM,OAAO,EAAE;MACXD,QAAQ,GAAGC,OAAO,CAAC,CAAC,CAAC;MACrBH,IAAI,CAAC3U,KAAK,GAAG;QACXE,IAAI,EAAEsU,QAAQ,CAAC3S,SAAS,CAAC2S,QAAQ,CAAC/S,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACnDxB,GAAG,EAAE0T,uDAAeiB;MACtB,CAAC;IACH,CAAC,MAAM;MACLD,IAAI,CAAC3U,KAAK,GAAG;QACXE,IAAI,EAAEyT,uDAAe;QACrB1T,GAAG,EAAEuU;MACP,CAAC;IACH;IACAG,IAAI,CAAC3U,KAAK,CAACG,IAAI,GAAG,CAAC0U,QAAQ,IAAI,YAAY,EAAEhT,SAAS,CAAC,QAAQ,CAAC4B,MAAM,CAAC;EACzE;EAEA,OAAOkR,IAAI;AACb;AAGO,SAASI,UAAU,CAACC,CAAC,EAAE/N,CAAC,EAAE;EAC/B,IAAI+N,CAAC,KAAK/N,CAAC,EAAE;IACX,OAAO,IAAI;EACb;EAEA,IAAI,CAACH,KAAK,CAACC,OAAO,CAACiO,CAAC,CAAC,IAAI,CAAClO,KAAK,CAACC,OAAO,CAACE,CAAC,CAAC,EAAE;IAC1C,OAAO,KAAK;EACd;EAGA,IAAI+N,CAAC,CAACvR,MAAM,IAAIwD,CAAC,CAACxD,MAAM,EAAE;IACxB,OAAO,KAAK;EACd;EAEAuR,CAAC,CAACC,IAAI,EAAE;EACRhO,CAAC,CAACgO,IAAI,EAAE;EACR,KAAK,IAAI7P,CAAC,GAAG,CAAC,EAAE8P,CAAC,GAAGF,CAAC,CAACvR,MAAM,EAAE2B,CAAC,GAAG8P,CAAC,EAAE9P,CAAC,EAAE,EAAE;IACxC,IAAI4P,CAAC,CAAC5P,CAAC,CAAC,KAAK6B,CAAC,CAAC7B,CAAC,CAAC,EAAE;MACjB,OAAO,KAAK;IACd;EACF;EACA,OAAO,IAAI;AACb;AAIO,SAAS+P,OAAO,CAAC3K,GAAG,EAAE;EAC3BA,GAAG,GAAGA,GAAG,CAACQ,IAAI,EAAE;EAChB,IAAI,4EAA4E,CAACoK,IAAI,CAAC5K,GAAG,CAAC,EAAE;IAC1F,OAAOA,GAAG,CAACtE,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;EACpC;EACA,OAAO,IAAI;AACb;AAGO,SAASmP,OAAO,CAAC7K,GAAG,EAAE;EAC3BA,GAAG,GAAGA,GAAG,CAACQ,IAAI,EAAE;EAChB,IAAI,kDAAkD,CAACoK,IAAI,CAAC5K,GAAG,CAAC,EAAE;IAChE,OAAOA,GAAG;EACZ;EACA,OAAO,IAAI;AACb;AAQO,SAAS8K,aAAa,CAAClG,GAAG,EAAE;EACjC,OAAOA,GAAG,IAAI,CAAC,iCAAiC,CAACgG,IAAI,CAAChG,GAAG,CAAC;AAC5D;AAIO,SAASmG,WAAW,CAACnG,GAAG,EAAEoG,cAAc,EAAE;EAC/C,IAAI,OAAOpG,GAAG,IAAI,QAAQ,EAAE;IAC1B,OAAOA,GAAG;EACZ;EAGAA,GAAG,GAAGA,GAAG,CAAClJ,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC8E,IAAI,EAAE;EAI/C,IAAI,CAAC,6BAA6B,CAACoK,IAAI,CAAChG,GAAG,CAAC,EAAE;IAC5C,OAAOA,GAAG;EACZ;EAGA,IAAI,YAAY,CAACgG,IAAI,CAAChG,GAAG,CAAC,EAAE;IAC1B,OAAOA,GAAG;EACZ;EAGA,MAAMqG,OAAO,GAAG3O,KAAK,CAACC,OAAO,CAACyO,cAAc,CAAC,GAAGA,cAAc,CAACjL,IAAI,CAAC,GAAG,CAAC,GAAG,YAAY;EACvF,MAAMmL,EAAE,GAAG,IAAIC,MAAM,CAAC,KAAK,GAAGF,OAAO,GAAG,QAAQ,EAAE,GAAG,CAAC;EACtD,IAAI,CAACC,EAAE,CAACN,IAAI,CAAChG,GAAG,CAAC,EAAE;IACjB,OAAO,IAAI;EACb;EAEA,OAAOA,GAAG;AACZ;AAKO,SAAS9G,kBAAkB,CAAC8G,GAAG,EAAEwG,SAAS,EAAE;EACjD,IAAI,CAACxG,GAAG,EAAE;IACR,OAAO,IAAI;EACb;EAEA,MAAMyG,YAAY,GAAGN,WAAW,CAACnG,GAAG,CAAC;EACrC,IAAIyG,YAAY,EAAE;IAChB,OAAOA,YAAY;EACrB;EAGA,MAAMH,EAAE,GAAG,IAAIC,MAAM,CAAE,QAAOC,SAAU,uBAAsB,EAAE,GAAG,CAAC;EACpE,IAAIF,EAAE,CAACN,IAAI,CAAChG,GAAG,CAACpE,IAAI,EAAE,CAAC,EAAE;IACvB,OAAOoE,GAAG;EACZ;EAEA,OAAO,IAAI;AACb;AAGO,SAAS0G,cAAc,CAACC,QAAQ,EAAE;EACvC,QAAQA,QAAQ;IACd,KAAKpC,qEAA6B;MAChC,OAAO;QAAEhQ,IAAI,EAAE;MAAc,CAAC;IAChC,KAAKgQ,oEAA4B;MAC/B,OAAO;QAAEhQ,IAAI,EAAE,SAAS;QAAEuS,KAAK,EAAE;MAAe,CAAC;IACnD,KAAKvC,kEAA0B;MAC7B,OAAO;QAAEhQ,IAAI,EAAE;MAAO,CAAC;IACzB,KAAKgQ,sEAA8B;MACjC,OAAO;QAAEhQ,IAAI,EAAE;MAAW,CAAC;IAC7B,KAAKgQ,kEAA0B;MAC7B,OAAO;QAAEhQ,IAAI,EAAE,UAAU;QAAEuS,KAAK,EAAE;MAAO,CAAC;EAAC;EAE/C,OAAO,IAAI;AACb;AAKO,SAAS7N,iBAAiB,CAAC4D,OAAO,EAAE;EACzC,IAAIqK,WAAW,GAAG,KAAK;EAEvB,MAAMC,cAAc,GAAGtK,OAAO,YAAYxJ,KAAK,GAC7CR,OAAO,CAACE,MAAM,CAAC8J,OAAO,CAAC,GACvB,IAAIhK,OAAO,CAAC,CAACC,OAAO,EAAEC,MAAM,KAAK;IAC/B8J,OAAO,CAACI,IAAI,CACV7H,MAAM,IAAI8R,WAAW,GAAGnU,MAAM,CAAC;MAACqU,UAAU,EAAE;IAAI,CAAC,CAAC,GAAGtU,OAAO,CAACsC,MAAM,CAAC,EACpEF,KAAK,IAAIgS,WAAW,GAAGnU,MAAM,CAAC;MAACqU,UAAU,EAAE;IAAI,CAAC,CAAC,GAAGrU,MAAM,CAACmC,KAAK,CAAC,CAClE;EACH,CAAC,CAAC;EAEJ,OAAO;IACL2H,OAAO,EAAEsK,cAAc;IACvBE,MAAM,GAAG;MACPH,WAAW,GAAG,IAAI;IACpB;EACF,CAAC;AACH;AAAC;AAGM,SAASI,OAAO,CAACzQ,GAAG,EAAExC,MAAM,EAAE;EACnC,OAAOwC,GAAG,IAAIA,GAAG,CAACpE,SAAS,CAAC,CAAC,EAAE4B,MAAM,CAAC;AACxC;;;;;;;;;;;;;;ACjNO,MAAM7G,eAAe,GAAG,YAAY;;;;;;;;;;;;;;;;;;;ACDjB;AACoB;AAEC;AAEhC,MAAMia,eAAe,SAASpP,4DAAmB,CAAC;EAC/DsP,WAAW,CAACC,KAAK,EAAE;IACjB,KAAK,CAACA,KAAK,CAAC;IAEZ,IAAI,CAACC,mBAAmB,GAAG,IAAI,CAACA,mBAAmB,CAACC,IAAI,CAAC,IAAI,CAAC;EAChE;EAEAD,mBAAmB,CAACE,IAAI,EAAEC,OAAO,EAAE;IACjC,IAAID,IAAI,IAAI,OAAO,EAAE;MACnB,IAAI,CAACH,KAAK,CAACK,qBAAqB,CAACD,OAAO,CAAC;IAC3C,CAAC,MAAM,IAAID,IAAI,IAAI,OAAO,EAAE;MAC1B,IAAI,CAACH,KAAK,CAACM,yBAAyB,CAACF,OAAO,CAAC;IAC/C,CAAC,MAAM,IAAID,IAAI,IAAI,WAAW,EAAE;MAC9B,IAAI,CAACH,KAAK,CAACO,qBAAqB,CAACH,OAAO,CAAC;IAC3C;EACF;EAEAI,MAAM,GAAG;IACP,OACI;MAAK,SAAS,EAAC;IAAkB,GAC/B;MAAK,SAAS,EAAC;IAAgB,GAC7B;MAAO,OAAO,EAAC;IAAe,GAC5B,2DAAC,wDAAgB;MAAC,EAAE,uBAAsB;MAAC,cAAc;QAAA;QAAA;MAAA;IAAiB,EACxB,CAC5C,EACR,2DAAC,6DAAQ;MAAC,IAAI,EAAC,OAAO;MAAC,EAAE,EAAC,eAAe;MACvC,OAAO,EAAE,IAAI,CAACR,KAAK,CAACS,aAAc;MAAC,QAAQ,EAAE,IAAI,CAACR;IAAoB,EAAG,CACvE,EACN;MAAK,SAAS,EAAC;IAAgB,GAC7B;MAAO,OAAO,EAAC;IAAgB,GAC9B,IAAI,CAACD,KAAK,CAACU,oBAAoB,GAC9B,2DAAC,wDAAgB;MAAC,EAAE,4BAA2B;MAAC,cAAc;QAAA;QAAA;MAAA;IAAuB,EAC/B,GAEtD,2DAAC,wDAAgB;MAAC,EAAE,qCAAoC;MACtD,cAAc;QAAA;QAAA;MAAA;IAAwC,EACF,CAEhD,EACR,2DAAC,6DAAQ;MAAC,IAAI,EAAC,OAAO;MAAC,EAAE,EAAC,gBAAgB;MACxC,OAAO,EAAE,IAAI,CAACV,KAAK,CAACW,aAAc;MAClC,QAAQ,EAAE,IAAI,CAACX,KAAK,CAACU,oBAAoB,GAAG,IAAI,CAACT,mBAAmB,GAAG;IAAK,EAAG,CAC7E,EACN;MAAK,SAAS,EAAC;IAAgB,GAC7B;MAAO,OAAO,EAAC;IAAgB,GAC7B,2DAAC,wDAAgB;MAAC,EAAE,wBAAuB;MAAC,cAAc;QAAA;QAAA;MAAA;IAAkB,EAC1B,CAC5C,EACR,2DAAC,6DAAQ;MAAC,IAAI,EAAC,WAAW;MAAC,EAAE,EAAC,gBAAgB;MAC5C,OAAO,EAAE,IAAI,CAACD,KAAK,CAACY,aAAc;MAAC,QAAQ,EAAE,IAAI,CAACX;IAAoB,EAAG,CACvE,CACF;EAEZ;AACF;AAAC;;;;;;;;;;;;;;;;;;;;AC3DyB;AACgD;AAEnB;AACW;AAElE,MAAM1O,QAAQ,GAAGb,0DAAc,CAAC;EAC9BsQ,cAAc,EAAE;IACdvP,EAAE,kBAAkB;IACpBC,cAAc;MAAA;MAAA;IAAA;EAEhB,CAAC;EACDuP,sBAAsB,EAAE;IACtBxP,EAAE,0BAA0B;IAC5BC,cAAc;MAAA;MAAA;IAAA;EAEhB;AACF,CAAC,CAAC;AAEF,MAAMwP,eAAe,SAASzQ,wDAAe,CAAC;EAC5CsP,WAAW,CAACC,KAAK,EAAE;IACjB,KAAK,CAACA,KAAK,CAAC;IAEZ,MAAMoB,EAAE,GAAG,IAAI,CAACpB,KAAK,CAACqB,MAAM,CAACC,UAAU,EAAE;IACzC,IAAIC,YAAY,GAAG,CAAC;IACpBH,EAAE,CAACI,QAAQ,CAAEjR,CAAC,IAAK;MACjB,IAAIA,CAAC,CAACkR,GAAG,IAAI,CAAClR,CAAC,CAACkR,GAAG,CAACC,QAAQ,EAAE,EAAE;QAC9BH,YAAY,EAAG;MACjB;IACF,CAAC,CAAC;IACF,MAAMI,MAAM,GAAGP,EAAE,CAACQ,gBAAgB,EAAE;IACpC,IAAI,CAACjO,KAAK,GAAG;MACXkO,IAAI,EAAEF,MAAM,GAAGA,MAAM,CAACE,IAAI,GAAG,IAAI;MACjCC,IAAI,EAAEH,MAAM,GAAGA,MAAM,CAACG,IAAI,GAAG,IAAI;MACjCC,uBAAuB,EAAEnP,SAAS;MAClC2O,YAAY,EAAEA;IAChB,CAAC;IAED,IAAI,CAACS,oBAAoB,GAAG,IAAI,CAACA,oBAAoB,CAAC9B,IAAI,CAAC,IAAI,CAAC;IAChE,IAAI,CAAC+B,6BAA6B,GAAG,IAAI,CAACA,6BAA6B,CAAC/B,IAAI,CAAC,IAAI,CAAC;IAClF,IAAI,CAACgC,2BAA2B,GAAG,IAAI,CAACA,2BAA2B,CAAChC,IAAI,CAAC,IAAI,CAAC;IAC9E,IAAI,CAACiC,wBAAwB,GAAG,IAAI,CAACA,wBAAwB,CAACjC,IAAI,CAAC,IAAI,CAAC;IACxE,IAAI,CAACkC,mBAAmB,GAAG,IAAI,CAACA,mBAAmB,CAAClC,IAAI,CAAC,IAAI,CAAC;EAChE;EAEA8B,oBAAoB,CAACK,GAAG,EAAE;IACxB,IAAI,CAACC,QAAQ,CAAC;MAACC,QAAQ,EAAEF;IAAG,CAAC,CAAC;IAC9B,IAAI,CAACrC,KAAK,CAACwC,gBAAgB,CAACH,GAAG,CAAC;EAClC;EAEAJ,6BAA6B,CAACQ,KAAK,EAAE;IACnC,IAAI,CAACH,QAAQ,CAAC;MACZP,uBAAuB,EAAEU,KAAK;MAC9BC,iBAAiB,EAAE,IAAI,CAAC/O,KAAK,CAAC8O,KAAK;IACrC,CAAC,CAAC;EACJ;EAEAP,2BAA2B,GAAG;IAC5B,IAAI,CAACI,QAAQ,CAAC;MAACP,uBAAuB,EAAEnP;IAAS,CAAC,CAAC;EACrD;EAEAuP,wBAAwB,CAACQ,IAAI,EAAE;IAC7B,IAAIhB,MAAM,GAAG,CAAC,CAAC;IACfA,MAAM,CAAC,IAAI,CAAChO,KAAK,CAACoO,uBAAuB,CAAC,GAAGY,IAAI;IACjD,IAAI,CAAC3C,KAAK,CAAC4C,mBAAmB,CAAC,IAAI,EAAEhQ,SAAS,EAAEA,SAAS,EAAE+O,MAAM,CAAC;IAElE,IAAIkB,QAAQ,GAAG;MAACd,uBAAuB,EAAEnP;IAAS,CAAC;IACnDiQ,QAAQ,CAAC,IAAI,CAAClP,KAAK,CAACoO,uBAAuB,CAAC,GAAGY,IAAI;IACnD,IAAI,CAACL,QAAQ,CAACO,QAAQ,CAAC;EACzB;EAEAT,mBAAmB,CAACU,CAAC,EAAE;IACrBA,CAAC,CAACC,cAAc,EAAE;IAClB,MAAM;MAAC9O;IAAa,CAAC,GAAG,IAAI,CAAC+L,KAAK,CAACgD,IAAI;IACvC,IAAI,CAAChD,KAAK,CAACiD,WAAW,CACpBhP,aAAa,CAAC1C,QAAQ,CAACyP,cAAc,CAAC,EACtC/M,aAAa,CAAC1C,QAAQ,CAAC0P,sBAAsB,CAAC,EAC7ChU,CAAC,IAAI,IAAI,CAAC+S,KAAK,CAACkD,eAAe,EAAE,EAClC,IAAI,EACJ,IAAI,EACJ,IAAI,CACL;EACH;EAEA1C,MAAM,GAAG;IACP,OACE,0HAAG,IAAI,CAAC7M,KAAK,CAACoO,uBAAuB,GACnC,2DAAC,uEAAiB;MAChB,IAAI,EAAE,IAAI,CAACpO,KAAK,CAAC+O,iBAAkB;MACnC,IAAI,EAAC,GAAG;MACR,QAAQ,EAAE,IAAI,CAACP,wBAAyB;MACxC,QAAQ,EAAE,IAAI,CAACD;IAA4B,EAAG,GAEhD;MAAK,SAAS,EAAC;IAAkB,GAC/B;MAAK,SAAS,EAAC;IAAmB,GAChC;MAAO,SAAS,EAAC;IAAO,GACtB,2DAAC,wDAAgB;MAAC,EAAE,kBAAiB;MAAC,cAAc;QAAA;QAAA;MAAA;IAAW,EAChB,CACzC,EACR,wEACE,2DAAC,wDAAgB;MAAC,EAAE,6BAA4B;MAAC,cAAc;QAAA;QAAA;MAAA;IAAY,GAExEiB,kBAAkB,IAAK,2DAAC,kEAAW;MAClC,WAAW,EAAEA,kBAAmB;MAChC,IAAI,EAAC,UAAU;MACf,UAAU,EAAE,IAAI,CAACnB;IAAqB,EAAG,CACzB,CAChB,CACF,EACN;MAAK,SAAS,EAAC;IAAI,EAAG,EACtB;MAAK,SAAS,EAAC;IAAmB,GAChC;MAAG,IAAI,EAAC,GAAG;MAAC,SAAS,EAAC,oBAAoB;MAAC,OAAO,EAAGc,CAAC,IAAK;QAACA,CAAC,CAACC,cAAc,EAAE;QAAE,IAAI,CAAC/C,KAAK,CAACoD,QAAQ,EAAE;MAAC;IAAE,GACtG;MAAG,SAAS,EAAC;IAAgB,GAAC,aAAW,CAAI,SAAO,6DAAC,wDAAgB;MAAC,EAAE,iBAAgB;MACtF,cAAc;QAAA;QAAA;MAAA;IAAS,EAAiC,CACxD,EACJ;MAAG,IAAI,EAAC,GAAG;MAAC,SAAS,EAAC,oBAAoB;MAAC,OAAO,EAAGN,CAAC,IAAK;QAAC,IAAI,CAACV,mBAAmB,CAACU,CAAC,CAAC;MAAC;IAAE,GACxF;MAAG,SAAS,EAAC;IAAgB,GAAC,QAAM,CAAI,SAAO,6DAAC,wDAAgB;MAAC,EAAE,yBAAwB;MACzF,cAAc;QAAA;QAAA;MAAA;IAAiB,EAAyC,CACxE,CACA,EACN;MAAK,SAAS,EAAC;IAAI,EAAG,EACtB;MAAK,SAAS,EAAC;IAAmB,GAChC,wEACE;MAAO,SAAS,EAAC;IAAO,GACtB,2DAAC,wDAAgB;MAAC,EAAE,6BAA4B;MAAC,cAAc;QAAA;QAAA;MAAA;IAAuB,EACtC,CAC1C,CACJ,EACN;MAAK,SAAS,EAAC;IAAQ,GACrB,wEAAK,QAAM;MAAI,SAAS,EAAC,WAAW;MAClC,OAAO,EAAE,IAAI,CAACb,6BAA6B,CAAC/B,IAAI,CAAC,IAAI,EAAE,MAAM;IAAE,GAAE,IAAI,CAACvM,KAAK,CAACkO,IAAI,CAAM,CAAM,EAC9F,wEAAK,QAAM;MAAI,SAAS,EAAC,WAAW;MAClC,OAAO,EAAE,IAAI,CAACI,6BAA6B,CAAC/B,IAAI,CAAC,IAAI,EAAE,MAAM;IAAE,GAAE,IAAI,CAACvM,KAAK,CAACmO,IAAI,CAAM,CAAM,CAC1F,CACF,EACL,IAAI,CAACnO,KAAK,CAAC4N,YAAY,GAAG,CAAC,GAC1B,0HACE;MAAK,SAAS,EAAC;IAAI,EAAG,EACtB;MAAK,SAAS,EAAC;IAAgB,GAC7B;MAAG,SAAS,EAAC;IAAgB,GAAC,OAAK,CAAI,QACvC;MAAG,IAAI,EAAC,GAAG;MAAC,SAAS,EAAC,MAAM;MAAC,OAAO,EAAGuB,CAAC,IAAK;QAACA,CAAC,CAACC,cAAc,EAAE;QAAE,IAAI,CAAC/C,KAAK,CAACqD,aAAa,EAAE;MAAC;IAAE,GAC7F,2DAAC,wDAAgB;MAAC,EAAE,yBAAwB;MAAC,cAAc;QAAA;QAAA;MAAA;QAAA;QAAA;MAAA;QAAA;QAAA;MAAA,EAA6B;MACtF,MAAM,EAAE;QAAE3H,KAAK,EAAE,IAAI,CAAC/H,KAAK,CAAC4N;MAAa;IAAE,EAAuC,CAClF,CACA,CACL,GACD,IAAI,CACJ,CACJ;EAER;AACF;AAAC;AAED,iEAAeV,sDAAU,CAACK,eAAe,CAAC;;;;;;;;;;;;;;;;;;;;;ACzJhB;AACoB;AAEV;AAEiE;AAEtF,MAAMoC,cAAc,SAAS7S,4DAAmB,CAAC;EAC9D+P,MAAM,GAAG;IACP,OACE;MAAK,SAAS,EAAC;IAAkB,GAC/B;MAAK,SAAS,EAAC;IAAmB,GAChC;MAAG,IAAI,EAAEnY,uDAAgB;MAAC,SAAS,EAAC,aAAa;MAAC,MAAM,EAAC;IAAQ,GAC/D;MAAG,SAAS,EAAC;IAAgB,GAAC,OAAK,CAAI,SAAO,6DAAC,wDAAgB;MAAC,EAAE,mBAAkB;MAClF,cAAc;QAAA;QAAA;MAAA;IAAa,EAAuD,CAClF,EACJ;MAAG,IAAI,EAAEE,6DAAsB;MAAC,SAAS,EAAC,aAAa;MAAC,MAAM,EAAC;IAAQ,GACrE;MAAG,SAAS,EAAC;IAAgB,GAAC,aAAW,CAAI,SAAO,6DAAC,wDAAgB;MAAC,EAAE,yBAAwB;MAC9F,cAAc;QAAA;QAAA;MAAA;IAAmB,EAAsD,CACvF,EACJ;MAAG,IAAI,EAAED,2DAAoB;MAAC,SAAS,EAAC,aAAa;MAAC,MAAM,EAAC;IAAQ,GACnE;MAAG,SAAS,EAAC;IAAgB,GAAC,QAAM,CAAI,SAAO,6DAAC,wDAAgB;MAAC,EAAE,uBAAsB;MACvF,cAAc;QAAA;QAAA;MAAA;IAAiB,EAAoD,CACnF,CACA,EACN;MAAK,SAAS,EAAC;IAAI,EAAG,EACtB;MAAK,SAAS,EAAC;IAAmB,GAChC;MAAK,SAAS,EAAC;IAAgB,GAC7B;MAAO,SAAS,EAAC;IAAO,GAAC,2DAAC,wDAAgB;MAAC,EAAE,gBAAe;MAAC,cAAc;QAAA;QAAA;MAAA;IAAU,EACxC,CAAQ,EACpDzC,gDAAQ,CACL,EACN;MAAK,SAAS,EAAC;IAAgB,GAC7B;MAAO,SAAS,EAAC;IAAO,GAAC,2DAAC,wDAAgB;MAAC,EAAE,aAAY;MAAC,cAAc;QAAA;QAAA;MAAA;IAAO,EAAG,CAAQ,EACzF8W,yDAAiB,EAAE,CAChB,EACN;MAAK,SAAS,EAAC;IAAgB,GAC7B;MAAO,SAAS,EAAC;IAAO,GAAC,2DAAC,wDAAgB;MAAC,EAAE,gBAAe;MAAC,cAAc;QAAA;QAAA;MAAA;IAAU,EACxC,CAAQ,EACpD,IAAI,CAACqD,KAAK,CAACwD,aAAa,CACrB,EACN;MAAK,SAAS,EAAC;IAAgB,GAC7B;MAAO,SAAS,EAAC;IAAO,GAAC,2DAAC,wDAAgB;MAAC,EAAE,wBAAuB;MAAC,cAAc;QAAA;QAAA;MAAA;IAAkB,EAAG,CAAQ,EAC/G,IAAI,CAACxD,KAAK,CAACyD,aAAa,CACrB,CACF,CACF;EAEV;AACF;AAAC;;;;;;;;;;;;;;;;;;;;;;;;ACjDyB;AACoB;AACc;AAEJ;AACN;AAEI;AACwB;AAClB;AAE5D,SAASK,KAAK,CAAC7U,GAAG,EAAExC,MAAM,EAAE;EAC1B,OAAOwC,GAAG,IAAIA,GAAG,CAACpE,SAAS,CAAC,CAAC,EAAE4B,MAAM,CAAC;AACxC;AAEe,MAAMsX,mBAAmB,SAAStT,wDAAe,CAAC;EAC/DsP,WAAW,CAACC,KAAK,EAAE;IACjB,KAAK,CAACA,KAAK,CAAC;IAEZ,MAAMoB,EAAE,GAAG,IAAI,CAACpB,KAAK,CAACqB,MAAM,CAACC,UAAU,EAAE;IACzC,IAAI,CAAC3N,KAAK,GAAG;MACXqQ,QAAQ,EAAEF,KAAK,CAAC1C,EAAE,CAAC6C,MAAM,GAAG7C,EAAE,CAAC6C,MAAM,CAAC1G,EAAE,GAAG3K,SAAS,EAAEhL,wDAAgB,CAAC;MACvEsc,WAAW,EAAEJ,KAAK,CAAC1C,EAAE,CAAC6C,MAAM,GAAG7C,EAAE,CAAC6C,MAAM,CAACvG,IAAI,GAAG9K,SAAS,EAAE/K,oEAA4B,CAAC;MACxFsc,MAAM,EAAEpb,kEAAY,CAACqY,EAAE,CAAC6C,MAAM,GAAG7C,EAAE,CAAC6C,MAAM,CAACjb,KAAK,GAAG,IAAI,CAAC;MACxDob,WAAW,EAAEhD,EAAE,CAACiD,cAAc,EAAE,IAAI,EAAE;MACtCC,QAAQ,EAAE1R;IACZ,CAAC;IAED,IAAI,CAAC2R,cAAc,GAAG,IAAI,CAACA,cAAc,CAACrE,IAAI,CAAC,IAAI,CAAC;EACtD;EAEAqE,cAAc,CAACC,IAAI,EAAE;IACnBhW,OAAO,CAACiW,GAAG,CAAC,oBAAoB,EAAED,IAAI,CAAC;IACvC,IAAI,CAAClC,QAAQ,CAAC;MAACgC,QAAQ,EAAEE;IAAI,CAAC,CAAC;EACjC;EAEAhE,MAAM,GAAG;IACP,IAAI,IAAI,CAAC7M,KAAK,CAAC2Q,QAAQ,EAAE;MACvB,OACE,2DAAC,oEAAc;QACb,MAAM,EAAE,IAAI,CAAC3Q,KAAK,CAAC2Q,QAAQ,CAACI,IAAK;QACjC,GAAG,EAAE,IAAI,CAAC/Q,KAAK,CAAC2Q,QAAQ,CAAC9Q,GAAI;QAC7B,IAAI,EAAE,IAAI,CAACG,KAAK,CAAC2Q,QAAQ,CAACK,IAAK;QAC/B,qBAAqB,EAAE,IAAI,CAAC3E,KAAK,CAAC4E,qBAAsB;QACxD,QAAQ,EAAEJ,IAAI,IAAI;UAAC,IAAI,CAAClC,QAAQ,CAAC;YAACgC,QAAQ,EAAE1R;UAAS,CAAC,CAAC;UAAEpE,OAAO,CAACiW,GAAG,CAAC,yBAAyB,EAAED,IAAI,CAAC;QAAA,CAAE;QACvG,QAAQ,EAAEvX,CAAC,IAAI,IAAI,CAACqV,QAAQ,CAAC;UAACgC,QAAQ,EAAE1R;QAAS,CAAC;MAAE,EAAG;IAE7D;IAEA,MAAMwR,WAAW,GAAG,EAAE;IACtB,IAAI,CAACzQ,KAAK,CAACyQ,WAAW,CAACpU,OAAO,CAAC,CAACwU,IAAI,EAAEha,GAAG,KAAK;MAC5C,IAAI,CAAC,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC8B,QAAQ,CAACkY,IAAI,CAACE,IAAI,CAAC,EAAE;QAEzC;MACF;MAEA,IAAIlR,GAAG,GAAGgR,IAAI,CAAChR,GAAG;MAClB,IAAIgR,IAAI,CAACE,IAAI,IAAI,KAAK,EAAE;QACtB,MAAMG,MAAM,GAAGnB,mFAAgB,CAACc,IAAI,CAAChR,GAAG,CAAC;QACzCA,GAAG,GAAGqR,MAAM,GAAGA,MAAM,CAACC,mBAAmB,EAAE,GAAGN,IAAI,CAAChR,GAAG;MACxD;MAEA4Q,WAAW,CAAC5T,IAAI,CACd;QAAK,SAAS,EAAC,cAAc;QAAC,GAAG,EAAEhG;MAAI,GACrC;QAAI,SAAS,EAAC,WAAW;QAAC,OAAO,EAAEsY,CAAC,IAAI;UAACA,CAAC,CAACC,cAAc,EAAE;UAAE,IAAI,CAACwB,cAAc,CAACC,IAAI,CAAC;QAAA;MAAE,GAAEhR,GAAG,CAAM,EACnG,yEAAM,GAAC,EAACgR,IAAI,CAACG,IAAI,GAAG,IAAI,GAAG;QAAG,SAAS,EAAC;MAAgB,GAAC,SAAO,CAAI,CAAQ,CACxE,CAAC;IACX,CAAC,CAAC;IACF,IAAIP,WAAW,CAAC3X,MAAM,GAAG,CAAC,EAAE;MAE1B2X,WAAW,CAACW,OAAO,CACjB;QAAO,SAAS,EAAC,OAAO;QAAC,GAAG,EAAE;MAAQ,GACpC,2DAAC,wDAAgB;QAAC,EAAE,uBAAsB;QAAC,cAAc;UAAA;UAAA;QAAA;MAAW,EAC1B,CACpC,CAAC;IACb;IAEA,OACE;MAAK,SAAS,EAAC;IAAkB,GAC/B;MAAK,SAAS,EAAC;IAAmB,GAChC;MAAG,IAAI,EAAC,GAAG;MAAC,SAAS,EAAC,yBAAyB;MAAC,OAAO,EAAEjC,CAAC,IAAI;QAACA,CAAC,CAACC,cAAc,EAAE;QAAE,IAAI,CAAC/C,KAAK,CAACgF,UAAU,CAAC,SAAS,CAAC;MAAC;IAAE,GACpH;MAAG,SAAS,EAAC;IAAgB,GAAC,MAAI,CAAI,QACtC,6DAAC,wDAAgB;MAAC,EAAE,eAAc;MAAC,cAAc;QAAA;QAAA;MAAA;IAAO,EAAuC,CAC7F,EACJ,2EACE,2DAAC,kEAAY;MACX,MAAM,EAAE,IAAI,CAAChF,KAAK,CAACqB,MAAO;MAC1B,MAAM,EAAE,IAAI,CAAC1N,KAAK,CAACwQ,MAAO;MAC1B,QAAQ,EAAE,IAAK;MACf,GAAG,EAAE,IAAI,CAACnE,KAAK,CAACiF,QAAS;MACzB,KAAK,EAAE,IAAI,CAACtR,KAAK,CAACqQ;IAAS,EAAG,CACzB,EACT;MAAK,SAAS,EAAC;IAAO,GACpB;MAAO,SAAS,EAAC;IAAO,GACtB,2DAAC,wDAAgB;MAAC,EAAE,mBAAkB;MAAC,cAAc;QAAA;QAAA;MAAA;IAAY,EACnB,CACxC,EACR;MAAK,SAAS,EAAC;IAAkB,GAAE,IAAI,CAACrQ,KAAK,CAACqQ,QAAQ,CAAO,CACzD,EACN;MAAK,SAAS,EAAC;IAAO,GACpB;MAAO,SAAS,EAAC;IAAO,GAAC,2DAAC,wDAAgB;MAAC,EAAE,iBAAgB;MAAC,cAAc;QAAA;QAAA;MAAA;IAAM,EACpC,CAAQ,QACtD,yEAAK,IAAI,CAAChE,KAAK,CAACiF,QAAQ,CAAM,CAC1B,EACN;MAAK,SAAS,EAAC;IAAO,GACpB,2DAAC,+DAAS;MAAC,aAAa,EAAE,IAAI,CAACjF,KAAK,CAACkF;IAAc,EAAG,CAClD,EACL,IAAI,CAACvR,KAAK,CAACuQ,WAAW,GACrB;MAAK,SAAS,EAAC;IAAO,GACpB;MAAO,SAAS,EAAC;IAAO,GACtB,2DAAC,wDAAgB;MAAC,EAAE,qBAAoB;MAAC,cAAc;QAAA;QAAA;MAAA;IAAc,EACf,CAChD,EACR;MAAK,SAAS,EAAC;IAAQ,GAAE,IAAI,CAACvQ,KAAK,CAACuQ,WAAW,CAAO,CAClD,GAAG,IAAI,CACX,EACN;MAAK,SAAS,EAAC;IAAI,EAAG,EACtB;MAAK,SAAS,EAAC;IAAmB,GAChC;MAAK,SAAS,EAAC;IAAO,GAAEE,WAAW,CAAO,CACtC,EACN;MAAK,SAAS,EAAC;IAAI,EAAG,EACtB;MAAK,SAAS,EAAC;IAAmB,GAChC;MAAG,IAAI,EAAC,GAAG;MAAC,SAAS,EAAC,aAAa;MAAC,OAAO,EAAGtB,CAAC,IAAK;QAACA,CAAC,CAACC,cAAc,EAAE;QAAE,IAAI,CAAC/C,KAAK,CAACgF,UAAU,CAAC,OAAO,CAAC;MAAC;IAAE,GACxG;MAAG,SAAS,EAAC;IAAgB,GAAC,eAAa,CAAI,QAAM,6DAAC,wDAAgB;MAAC,EAAE,qCAAoC;MAC3G,cAAc;QAAA;QAAA;MAAA;IAAgB,EAA2D,CACzF,EACJ;MAAG,IAAI,EAAC,GAAG;MAAC,SAAS,EAAC,aAAa;MAAC,OAAO,EAAGlC,CAAC,IAAK;QAACA,CAAC,CAACC,cAAc,EAAE;QAAE,IAAI,CAAC/C,KAAK,CAACgF,UAAU,CAAC,UAAU,CAAC;MAAC;IAAE,GAC3G;MAAG,SAAS,EAAC;IAAgB,GAAC,UAAQ,CAAI,QAAM,6DAAC,wDAAgB;MAAC,EAAE,mBAAkB;MACpF,cAAc;QAAA;QAAA;MAAA;IAAW,EAAsD,CAC/E,EACJ;MAAG,IAAI,EAAC,GAAG;MAAC,SAAS,EAAC,aAAa;MAAC,OAAO,EAAGlC,CAAC,IAAK;QAACA,CAAC,CAACC,cAAc,EAAE;QAAE,IAAI,CAAC/C,KAAK,CAACgF,UAAU,CAAC,SAAS,CAAC;MAAC;IAAE,GAC1G;MAAG,SAAS,EAAC;IAAgB,GAAC,iBAAe,CAAI,QAAM,6DAAC,wDAAgB;MAAC,EAAE,+BAA8B;MACvG,cAAc;QAAA;QAAA;MAAA;IAAU,EAAqD,CAC7E,CACA,CACF;EAEV;AACF;AAAC;;;;;;;;;;;;;;;;;;;;AC1IyB;AACoC;AAER;AAEN;AAEhD,MAAMzT,QAAQ,GAAGb,0DAAc,CAAC;EAC9B0U,uBAAuB,EAAE;IACvB3T,EAAE,qBAAqB;IACvBC,cAAc;MAAA;MAAA;IAAA;MAAA;MAAA;IAAA;MAAA;MAAA;IAAA;EAEhB;AACF,CAAC,CAAC;AAEa,MAAM2T,YAAY,SAAS5U,wDAAe,CAAC;EACxDsP,WAAW,CAACC,KAAK,EAAE;IACjB,KAAK,CAACA,KAAK,CAAC;IAEZ,IAAI,CAACsF,YAAY,GAAG,IAAI,CAACA,YAAY,CAACpF,IAAI,CAAC,IAAI,CAAC;IAEhD,IAAI,CAACvM,KAAK,GAAG0R,YAAY,CAACE,oBAAoB,CAACvF,KAAK,CAAC;EACvD;EAEA,OAAOuF,oBAAoB,CAACvF,KAAK,EAAE;IACjC,MAAMwB,QAAQ,GAAG,EAAE;IACnB,IAAIgE,aAAa,GAAG,CAAC;IACrB,IAAIC,aAAa,GAAG,CAAC;IACrBzF,KAAK,CAAC0F,QAAQ,CAACrS,GAAG,CAAE9C,CAAC,IAAK;MACxB,MAAMoV,OAAO,GAAGpV,CAAC,CAACkR,GAAG,IAAI,CAAClR,CAAC,CAACkR,GAAG,CAACC,QAAQ,EAAE;MAE1C,IAAIiE,OAAO,IAAI3F,KAAK,CAAC2F,OAAO,EAAE;QAC5BnE,QAAQ,CAAChR,IAAI,CAACD,CAAC,CAAC;MAClB;MACA,IAAIoV,OAAO,IAAI3F,KAAK,CAAC2F,OAAO,EAAE;QAC5B;MACF;MAEA,IAAIpV,CAAC,CAACqV,OAAO,IAAIrV,CAAC,CAACqV,OAAO,CAACC,IAAI,EAAE;QAC/B,IAAI7F,KAAK,CAAC8F,OAAO,EAAE;UACjBtE,QAAQ,CAAChR,IAAI,CAACD,CAAC,CAAC;QAClB,CAAC,MAAM;UACLkV,aAAa,EAAG;QAClB;MACF,CAAC,MAAM,IAAI,CAACzF,KAAK,CAAC8F,OAAO,EAAE;QACzBtE,QAAQ,CAAChR,IAAI,CAACD,CAAC,CAAC;QAChBiV,aAAa,IAAIjV,CAAC,CAACwV,MAAM,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC;MACvC;IACF,CAAC,CAAC;IAEFvE,QAAQ,CAACvD,IAAI,CAAC,CAACD,CAAC,EAAE/N,CAAC,KAAK;MACtB,OAAO,CAACA,CAAC,CAAC+V,OAAO,IAAI,CAAC,KAAKhI,CAAC,CAACgI,OAAO,IAAI,CAAC,CAAC;IAC5C,CAAC,CAAC;IAEF,IAAIP,aAAa,GAAG,CAAC,EAAE;MACrBjE,QAAQ,CAAChR,IAAI,CAAC;QACZyV,MAAM,EAAE,SAAS;QACjBpR,KAAK,EAAEtD,QAAQ,CAAC6T,uBAAuB;QACvCnT,MAAM,EAAE;UAACyJ,KAAK,EAAE+J;QAAa;MAC/B,CAAC,CAAC;IACJ;IAEA,OAAO;MACLS,WAAW,EAAE1E,QAAQ;MACrBgE,aAAa,EAAEA;IACjB,CAAC;EACH;EAEAW,kBAAkB,CAACC,SAAS,EAAEC,SAAS,EAAE;IACvC,IAAID,SAAS,CAACV,QAAQ,IAAI,IAAI,CAAC1F,KAAK,CAAC0F,QAAQ,IACzCU,SAAS,CAACN,OAAO,IAAI,IAAI,CAAC9F,KAAK,CAAC8F,OAAO,IACvCM,SAAS,CAACT,OAAO,IAAI,IAAI,CAAC3F,KAAK,CAAC2F,OAAO,EAAE;MAC3C,MAAM9C,QAAQ,GAAGwC,YAAY,CAACE,oBAAoB,CAAC,IAAI,CAACvF,KAAK,CAAC;MAC9D,IAAI,CAACsC,QAAQ,CAACO,QAAQ,CAAC;MACvB,IAAIA,QAAQ,CAAC2C,aAAa,IAAIa,SAAS,CAACb,aAAa,EAAE;QACrD5I,4DAAa,CAACiG,QAAQ,CAAC2C,aAAa,CAAC;MACvC;IACF;EACF;EAEAF,YAAY,CAACgB,cAAc,EAAE;IAC3B,IAAI,CAACtG,KAAK,CAACuG,aAAa,EAAE;EAC5B;EAEA/F,MAAM,GAAG;IACP,OACE,2DAAC,wDAAgB;MAAC,EAAE,sBAAqB;MACvC,cAAc;QAAA;QAAA;MAAA;QAAA;QAAA;MAAA;QAAA;QAAA;MAAA;IAAmC,GAEhDgG,WAAW,IAAK,2DAAC,iEAAW;MAC3B,MAAM,EAAE,IAAI,CAACxG,KAAK,CAACqB,MAAO;MAC1B,SAAS,EAAE,IAAI,CAACrB,KAAK,CAACyG,SAAU;MAChC,QAAQ,EAAE,IAAI,CAAC9S,KAAK,CAACuS,WAAY;MACjC,gBAAgB,EAAEM,WAAY;MAC9B,aAAa,EAAE,IAAI,CAACxG,KAAK,CAAC0G,aAAc;MACxC,QAAQ,EAAE,IAAI,CAAC1G,KAAK,CAACiF,QAAS;MAC9B,UAAU,EAAE,IAAK;MACjB,UAAU,EAAE,IAAK;MACjB,eAAe,EAAE,IAAI,CAACjF,KAAK,CAAC2G,eAAgB;MAC5C,eAAe,EAAE,IAAI,CAAC3G,KAAK,CAAC4G,eAAgB;MAC5C,QAAQ,EAAE,IAAI,CAACtB;IAAa,EAAG,CACf;EAExB;AACF;AAAC;;;;;;;;;;;;;;;;;;;;;;;;;;ACxGuC;AACM;AAEM;AACI;AACT;AAC/C,MAAMyB,SAAS,GAAGtW,iDAAU,CAACxD,CAAC,IAAI,qJAAmC,CAAC;AACR;AAEP;AAC0B;AACvC;AAGD;AAE1B,MAAMia,iBAAiB,SAASzW,4DAAmB,CAAC;EACjEsP,WAAW,CAACC,KAAK,EAAE;IACjB,KAAK,CAACA,KAAK,CAAC;IAEZ,IAAI,CAACrM,KAAK,GAAG;MACXwT,KAAK,EAAE,EAAE;MACT5E,QAAQ,EAAE,EAAE;MACZmC,IAAI,EAAE,EAAE;MACR0C,KAAK,EAAE,EAAE;MACTC,GAAG,EAAE,EAAE;MACP9J,EAAE,EAAE,EAAE;MACNC,QAAQ,EAAE,IAAI;MACd8J,SAAS,EAAE,IAAI;MACfC,SAAS,EAAE,IAAI;MACfC,aAAa,EAAE,IAAI;MACnBC,cAAc,EAAE,KAAK;MACrBC,SAAS,EAAEhR,uEAA0B,CAAC,gBAAgB;IACxD,CAAC;IAED,IAAI,CAACiR,iBAAiB,GAAG,IAAI,CAACA,iBAAiB,CAACzH,IAAI,CAAC,IAAI,CAAC;IAC1D,IAAI,CAAC0H,oBAAoB,GAAG,IAAI,CAACA,oBAAoB,CAAC1H,IAAI,CAAC,IAAI,CAAC;IAChE,IAAI,CAAC2H,iBAAiB,GAAG,IAAI,CAACA,iBAAiB,CAAC3H,IAAI,CAAC,IAAI,CAAC;IAC1D,IAAI,CAAC4H,iBAAiB,GAAG,IAAI,CAACA,iBAAiB,CAAC5H,IAAI,CAAC,IAAI,CAAC;IAC1D,IAAI,CAAC6H,cAAc,GAAG,IAAI,CAACA,cAAc,CAAC7H,IAAI,CAAC,IAAI,CAAC;IACpD,IAAI,CAAC8H,kBAAkB,GAAG,IAAI,CAACA,kBAAkB,CAAC9H,IAAI,CAAC,IAAI,CAAC;IAC5D,IAAI,CAAC+H,qBAAqB,GAAG,IAAI,CAACA,qBAAqB,CAAC/H,IAAI,CAAC,IAAI,CAAC;IAClE,IAAI,CAACgI,mBAAmB,GAAG,IAAI,CAACA,mBAAmB,CAAChI,IAAI,CAAC,IAAI,CAAC;IAC9D,IAAI,CAACiI,sBAAsB,GAAG,IAAI,CAACA,sBAAsB,CAACjI,IAAI,CAAC,IAAI,CAAC;IACpE,IAAI,CAACkI,YAAY,GAAG,IAAI,CAACA,YAAY,CAAClI,IAAI,CAAC,IAAI,CAAC;IAChD,IAAI,CAACmI,YAAY,GAAG,IAAI,CAACA,YAAY,CAACnI,IAAI,CAAC,IAAI,CAAC;IAGhDF,KAAK,CAACqB,MAAM,CAACiH,OAAO,EAAE,CACnB3S,KAAK,CAACnK,GAAG,IAAI;MACZ,IAAI,CAACwU,KAAK,CAAChS,OAAO,CAACxC,GAAG,CAACwK,OAAO,EAAE,KAAK,CAAC;IACxC,CAAC,CAAC;EACN;EAEA2R,iBAAiB,CAAC7E,CAAC,EAAE;IACnB,IAAI,CAACR,QAAQ,CAAC;MAAC6E,KAAK,EAAErE,CAAC,CAACyF,MAAM,CAAC3R;IAAK,CAAC,CAAC;EACxC;EAEAgR,oBAAoB,CAACrF,QAAQ,EAAE;IAC7B,IAAI,CAACD,QAAQ,CAAC;MAACC,QAAQ,EAAEA;IAAQ,CAAC,CAAC;EACrC;EAEAsF,iBAAiB,CAAC/E,CAAC,EAAE;IACnB,IAAI,CAACR,QAAQ,CAAC;MAACoC,IAAI,EAAE,OAAO;MAAE0C,KAAK,EAAEtE,CAAC,CAACyF,MAAM,CAAC3R;IAAK,CAAC,CAAC;EACvD;EAEAkR,iBAAiB,CAACjD,MAAM,EAAE;IACxB,IAAI,CAACvC,QAAQ,CAAC;MAACoC,IAAI,EAAE,KAAK;MAAE2C,GAAG,EAAExC;IAAM,CAAC,CAAC;EAC3C;EAEAkD,cAAc,CAACjF,CAAC,EAAE;IAChB,IAAI,CAACR,QAAQ,CAAC;MAAC/E,EAAE,EAAEuF,CAAC,CAACyF,MAAM,CAAC3R;IAAK,CAAC,CAAC;EACrC;EAEAoR,kBAAkB,CAAC5e,IAAI,EAAEgC,GAAG,EAAE;IAC5B,IAAI,CAACkX,QAAQ,CAAC;MAACiF,SAAS,EAAEnc,GAAG;MAAEoc,aAAa,EAAEpe;IAAI,CAAC,CAAC;EACtD;EAEA6e,qBAAqB,GAAG;IACtBvR,uEAA0B,CAAC,gBAAgB,EAAE,CAAC,IAAI,CAAC/C,KAAK,CAAC+T,SAAS,CAAC;IACnE,IAAI,CAACpF,QAAQ,CAAC;MAACoF,SAAS,EAAE,CAAC,IAAI,CAAC/T,KAAK,CAAC+T;IAAS,CAAC,CAAC;EACnD;EAEAW,YAAY,CAACvF,CAAC,EAAE;IACdA,CAAC,CAACC,cAAc,EAAE;IAClB,IAAI,CAAC/C,KAAK,CAACwI,eAAe,CACxB,IAAI,CAAC7U,KAAK,CAACwT,KAAK,CAACnT,IAAI,EAAE,EACvB,IAAI,CAACL,KAAK,CAAC4O,QAAQ,CAACvO,IAAI,EAAE,EAC1BsJ,sDAAO,CAAC,IAAI,CAAC3J,KAAK,CAAC4J,EAAE,CAACvJ,IAAI,EAAE,CAACnJ,SAAS,CAAC,CAAC,EAAEjD,wDAAgB,CAAC,EAAE,IAAI,CAAC+L,KAAK,CAAC2T,SAAS,CAAC,EAClF;MACE,MAAM,EAAE,IAAI,CAAC3T,KAAK,CAAC+Q,IAAI;MACvB,KAAK,EAAE,IAAI,CAAC/Q,KAAK,CAAC+Q,IAAI,IAAI,OAAO,GAC/B,IAAI,CAAC/Q,KAAK,CAACyT,KAAK,GACd,IAAI,CAACzT,KAAK,CAAC+Q,IAAI,IAAI,KAAK,GAAG,IAAI,CAAC/Q,KAAK,CAAC0T,GAAG,GAAG;IAClD,CAAC,CACF;EACH;EAGAa,mBAAmB,CAAC9e,IAAI,EAAEmD,IAAI,EAAEhD,KAAK,EAAEC,MAAM,EAAE;IAC7C,MAAM4O,GAAG,GAAG7L,IAAI,GAAGZ,GAAG,CAACiB,eAAe,CAACL,IAAI,CAAC,GAAG,IAAI;IACnD,IAAI,CAAC+V,QAAQ,CAAC;MAAC6B,MAAM,EAAE/L,GAAG;MAAEmP,SAAS,EAAE,IAAI;MAAEC,aAAa,EAAE;IAAI,CAAC,CAAC;IAClE,IAAIjb,IAAI,EAAE;MACR,IAAI,CAAC6b,YAAY,CAAChf,IAAI,EAAEmD,IAAI,EAAEhD,KAAK,EAAEC,MAAM,CAAC;IAC9C;EACF;EAEA2e,sBAAsB,GAAG;IACvB,IAAI,CAAC7F,QAAQ,CAAC;MAACiF,SAAS,EAAE,IAAI;MAAEC,aAAa,EAAE;IAAI,CAAC,CAAC;EACvD;EAIAY,YAAY,CAAChf,IAAI,EAAEmD,IAAI,EAAEhD,KAAK,EAAEC,MAAM,EAAE;IACtC,MAAMif,aAAa,GAAGC,KAAK,IAAI;MAC7B,IAAI;QAACtf,IAAI;QAAEmD;MAAI,CAAC,GAAGmc,KAAK;MACxB,IAAI,CAACpG,QAAQ,CAAC;QAAC9E,QAAQ,EAAE7R,GAAG,CAACiB,eAAe,CAACL,IAAI,CAAC;QAAEkb,cAAc,EAAE;MAAI,CAAC,CAAC;MAC1E,IAAIlb,IAAI,CAACxC,IAAI,GAAG/C,wDAAgB,EAAE;QAEhC,MAAM2hB,QAAQ,GAAG,IAAI,CAAC3I,KAAK,CAACqB,MAAM,CAACuH,kBAAkB,EAAE;QACvDD,QAAQ,CAACE,MAAM,CAACtc,IAAI,EAAE,QAAQ,CAAC,CAC5B8I,IAAI,CAAC+C,GAAG,IAAI,IAAI,CAACkK,QAAQ,CAAC;UAACgF,SAAS,EAAElP;QAAG,CAAC,CAAC,CAAC,CAC5CzC,KAAK,CAACnK,GAAG,IAAI,IAAI,CAACwU,KAAK,CAAChS,OAAO,CAACxC,GAAG,CAACwK,OAAO,EAAE,KAAK,CAAC,CAAC,CACpD8S,OAAO,CAAC7b,CAAC,IAAI,IAAI,CAACqV,QAAQ,CAAC;UAACmF,cAAc,EAAE;QAAK,CAAC,CAAC,CAAC;MACzD,CAAC,MAAM;QAEL9Z,kEAAY,CAACpB,IAAI,CAAC,CACf8I,IAAI,CAAC/E,GAAG,IAAI,IAAI,CAACgS,QAAQ,CAAC;UAACgF,SAAS,EAAEve,kEAAY,CAAC;YAACG,IAAI,EAAEoH,GAAG,CAAC/C,IAAI;YAAEpE,IAAI,EAAEC;UAAI,CAAC;QAAC,CAAC,CAAC,CAAC,CACnF0f,OAAO,CAAC7b,CAAC,IAAI,IAAI,CAACqV,QAAQ,CAAC;UAACmF,cAAc,EAAE;QAAK,CAAC,CAAC,CAAC;MACzD;IACF,CAAC;IAED,IAAIle,KAAK,GAAGxC,mDAAW,IAAIyC,MAAM,GAAGzC,mDAAW,IAAIwC,KAAK,IAAIC,MAAM,EAAE;MAElEsB,iEAAW,CAACyB,IAAI,EAAExF,mDAAW,EAAEA,mDAAW,EAAEM,kEAA0B,EAAE,IAAI,CAAC,CAC1EgO,IAAI,CAACK,MAAM,IAAI+S,aAAa,CAAC/S,MAAM,CAAC,CAAC,CACrCC,KAAK,CAACnK,GAAG,IAAI,IAAI,CAACwU,KAAK,CAAChS,OAAO,CAACxC,GAAG,CAACwK,OAAO,EAAE,KAAK,CAAC,CAAC;IACzD,CAAC,MAAM;MACLyS,aAAa,CAAC;QAACrf,IAAI,EAAEA,IAAI;QAAEmD,IAAI,EAAEA,IAAI;QAAEhD,KAAK,EAAEA,KAAK;QAAEC,MAAM,EAAEA;MAAM,CAAC,CAAC;IACvE;EACF;EAEAgX,MAAM,GAAG;IACP,IAAI,IAAI,CAAC7M,KAAK,CAAC4T,SAAS,EAAE;MACxB,OACE,2DAAC,gEAAU;QACT,MAAM,EAAE,IAAI,CAAC5T,KAAK,CAAC4T,SAAU;QAC7B,IAAI,EAAE,IAAI,CAAC5T,KAAK,CAAC6T,aAAc;QAC/B,QAAQ,EAAE,IAAI,CAACU,mBAAoB;QACnC,QAAQ,EAAE,IAAI,CAACC,sBAAuB;QACtC,OAAO,EAAE,IAAI,CAACnI,KAAK,CAAChS;MAAQ,EAAG;IAErC;IAEA,IAAI+a,aAAa,GAAG,SAAS;IAC7B,IAAI,IAAI,CAAC/I,KAAK,CAACgJ,QAAQ,EAAE;MACvBD,aAAa,IAAI,WAAW;IAC9B;IAEA,OACE;MAAM,SAAS,EAAC,mBAAmB;MAAC,QAAQ,EAAE,IAAI,CAACV;IAAa,GAC9D;MAAK,SAAS,EAAC;IAAgB,GAC7B;MAAK,SAAS,EAAC;IAAK,GAClB,2DAAC,wDAAgB;MAAC,EAAE,gBAAe;MAAC,cAAc;QAAA;QAAA;MAAA;IAAQ,GAEvDY,YAAY,IAAK;MAAO,IAAI,EAAC,MAAM;MAAC,WAAW,EAAEA,YAAa;MAAC,YAAY,EAAC,WAAW;MACtF,KAAK,EAAE,IAAI,CAACtV,KAAK,CAACwT,KAAM;MAAC,QAAQ,EAAE,IAAI,CAACQ,iBAAkB;MAAC,QAAQ;MAAC,SAAS;IAAA,EAAG,CAChE,EACpB,2DAAC,wDAAgB;MAAC,EAAE,mBAAkB;MAAC,cAAc;QAAA;QAAA;MAAA;IAAW,GAE7DuB,eAAe,IAAK,2DAAC,qEAAe;MAAC,WAAW,EAAEA,eAAgB;MAAC,YAAY,EAAC,cAAc;MAC7F,KAAK,EAAE,IAAI,CAACvV,KAAK,CAAC4O,QAAS;MAAC,UAAU,EAAE,IAAI,CAACqF,oBAAqB;MAClE,QAAQ,EAAE;IAAK,EAAG,CACF,CAChB,EACN,2DAAC,kEAAY;MACX,MAAM,EAAE,IAAI,CAAC5H,KAAK,CAACqB,MAAO;MAC1B,MAAM,EAAE,IAAI,CAAC1N,KAAK,CAAC6J,QAAS;MAC5B,cAAc,EAAE,IAAI,CAACwK,kBAAmB;MACxC,OAAO,EAAE,IAAI,CAAChI,KAAK,CAAChS;IAAQ,EAAG,CAC7B,EACN;MAAM,SAAS,EAAC;IAAgB,GAC9B,2DAAC,wDAAgB;MAAC,EAAE,oBAAmB;MAAC,cAAc;QAAA;QAAA;MAAA;IAA2B,GAE9Emb,gBAAgB,IAAK;MAAO,IAAI,EAAC,MAAM;MAAC,WAAW,EAAEA,gBAAiB;MAAC,YAAY,EAAC,MAAM;MACzF,KAAK,EAAE,IAAI,CAACxV,KAAK,CAAC4J,EAAG;MAAC,QAAQ,EAAE,IAAI,CAACwK,cAAe;MAAC,QAAQ;IAAA,EAAE,CAC/C,CAChB,EACL/H,KAAK,CAACoJ,aAAa,IAAI,OAAO,GAC7B;MAAK,SAAS,EAAC;IAAgB,GAC7B,2DAAC,wDAAgB;MAAC,EAAE,gBAAe;MAAC,cAAc;QAAA;QAAA;MAAA;IAA+B,GAE9EC,YAAY,IAAK;MAAO,IAAI,EAAC,OAAO;MAAC,WAAW,EAAEA,YAAa;MAAC,YAAY,EAAC,OAAO;MACnF,KAAK,EAAE,IAAI,CAAC1V,KAAK,CAACyT,KAAM;MAAC,QAAQ,EAAE,IAAI,CAACS,iBAAkB;MAAC,QAAQ;IAAA,EAAE,CACrD,CAChB,GACJ7H,KAAK,CAACoJ,aAAa,IAAI,KAAK,GAC9B,0HAAE;MAAK,SAAS,EAAC;IAAgB,GAC/B;MAAO,SAAS,EAAC;IAAY,GAAC,2DAAC,wDAAgB;MAAC,EAAE,uBAAsB;MAAC,cAAc;QAAA;QAAA;MAAA;IAAsB,EACjD,CAAQ,CAChE,EACN;MAAK,SAAS,EAAC;IAAgB,GAC7B,2DAAC,2CAAQ;MAAC,QAAQ,EAAE,wEAAK,2DAAC,wDAAgB;QAAC,EAAE,gBAAe;QAAC,cAAc;UAAA;UAAA;QAAA;MAAa,EAC/B;IAAO,GAC9D,2DAAC,SAAS;MACR,SAAS,EAAE,KAAM;MACjB,qBAAqB,EAAE,IAAI,CAACpJ,KAAK,CAAC4E,qBAAsB;MACxD,QAAQ,EAAE,IAAI,CAACkD;IAAkB,EAAG,CAC7B,CACP,CAAG,GACP,IAAI,EAER;MAAK,SAAS,EAAC;IAAgB,GAC7B,2DAAC,6DAAQ;MAAC,EAAE,EAAC,YAAY;MAAC,IAAI,EAAC,YAAY;MAAC,OAAO,EAAE,IAAI,CAACnU,KAAK,CAAC+T,SAAU;MACxE,QAAQ,EAAE,IAAI,CAACO;IAAsB,EAAG,EAC1C,2DAAC,wDAAgB;MAAC,EAAE,kBAAiB;MAAC,cAAc;QAAA;QAAA;MAAA;IAAiB,GAElEqB,cAAc,IAAK;MAAO,OAAO,EAAC;IAAY,GAAC,MAAM,EAACA,cAAc,CAAS,CAC5D,CAChB,EACN;MAAK,SAAS,EAAC;IAAgB,GAC7B;MAAQ,SAAS,EAAEP,aAAc;MAAC,IAAI,EAAC,QAAQ;MAAC,QAAQ,EAAE,IAAI,CAACpV,KAAK,CAAC8T;IAAe,GAClF,2DAAC,wDAAgB;MAAC,EAAE,kBAAiB;MAAC,cAAc;QAAA;QAAA;MAAA;IAAU,EACZ,CAC3C,CACL,CACD;EAEX;AACF;AAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACrOyB;AACgD;AAE1B;AAEQ;AACN;AACH;AACO;AACF;AACI;AACJ;AACc;AACZ;AACI;AAEoC;AAExC;AACH;AAEnD,MAAMlW,QAAQ,GAAGb,0DAAc,CAAC;EAC9BsI,IAAI,EAAE;IACJvH,EAAE,oBAAoB;IAEtBC,cAAc;MAAA;MAAA;IAAA;EAChB,CAAC;EACDmY,OAAO,EAAE;IACPpY,EAAE,uBAAuB;IAEzBC,cAAc;MAAA;MAAA;IAAA;EAChB,CAAC;EACDoY,QAAQ,EAAE;IACRrY,EAAE,wBAAwB;IAE1BC,cAAc;MAAA;MAAA;IAAA;EAChB,CAAC;EACDqY,OAAO,EAAE;IACPtY,EAAE,uBAAuB;IAEzBC,cAAc;MAAA;MAAA;IAAA;EAChB,CAAC;EACDsY,IAAI,EAAE;IACJvY,EAAE,oBAAoB;IAEtBC,cAAc;MAAA;MAAA;IAAA;EAChB,CAAC;EACDuY,SAAS,EAAE;IACTxY,EAAE,yBAAyB;IAC3BC,cAAc;MAAA;MAAA;IAAA;EAEhB,CAAC;EACDwY,UAAU,EAAE;IACVzY,EAAE,uBAAuB;IACzBC,cAAc;MAAA;MAAA;IAAA;EAEhB,CAAC;EACDyY,SAAS,EAAE;IACT1Y,EAAE,6BAA6B;IAC/BC,cAAc;MAAA;MAAA;IAAA;EAEhB,CAAC;EACD0Y,SAAS,EAAE;IACT3Y,EAAE,yBAAyB;IAC3BC,cAAc;MAAA;MAAA;IAAA;EAEhB,CAAC;EACD2Y,SAAS,EAAE;IACT5Y,EAAE,oBAAoB;IACtBC,cAAc;MAAA;MAAA;IAAA;EAEhB,CAAC;EACD4Y,gBAAgB,EAAE;IAChB7Y,EAAE,8BAA8B;IAChCC,cAAc;MAAA;MAAA;IAAA;EAEhB;AACF,CAAC,CAAC;AAEF,MAAM6Y,QAAQ,SAAS9Z,wDAAe,CAAC;EACrCsP,WAAW,CAACC,KAAK,EAAE;IACjB,KAAK,CAACA,KAAK,CAAC;IAEZ,IAAI,CAACrM,KAAK,GAAG;MACXuF,KAAK,EAAE,IAAI;MACXsR,KAAK,EAAE,KAAK;MACZC,KAAK,EAAE,KAAK;MACZC,MAAM,EAAE,KAAK;MACbC,OAAO,EAAE,KAAK;MACdC,KAAK,EAAE,KAAK;MACZC,OAAO,EAAE,IAAI;MACbC,UAAU,EAAElY,SAAS;MACrBmY,OAAO,EAAEnY,SAAS;MAClBoR,QAAQ,EAAEpR,SAAS;MACnBsR,WAAW,EAAEtR,SAAS;MACtBuR,MAAM,EAAE,IAAI;MACZyB,OAAO,EAAE,IAAI;MACboF,eAAe,EAAE,IAAI;MACrBC,MAAM,EAAE,IAAI;MACZC,SAAS,EAAE,IAAI;MACfC,QAAQ,EAAE,IAAI;MACdC,UAAU,EAAE,IAAI;MAChBC,SAAS,EAAE,IAAI;MACfxJ,IAAI,EAAE,IAAI;MACVC,IAAI,EAAE,IAAI;MACVoE,WAAW,EAAE,EAAE;MACfhB,aAAa,EAAE,EAAE;MACjBoG,gBAAgB,EAAE1Y,SAAS;MAC3B2Y,mBAAmB,EAAE3Y;IACvB,CAAC;IAED,IAAI,CAAC4Y,SAAS,GAAG,IAAI,CAACA,SAAS,CAACtL,IAAI,CAAC,IAAI,CAAC;IAC1C,IAAI,CAACuL,SAAS,GAAG,IAAI,CAACA,SAAS,CAACvL,IAAI,CAAC,IAAI,CAAC;IAC1C,IAAI,CAACwL,SAAS,GAAG,IAAI,CAACA,SAAS,CAACxL,IAAI,CAAC,IAAI,CAAC;IAC1C,IAAI,CAACyL,UAAU,GAAG,IAAI,CAACA,UAAU,CAACzL,IAAI,CAAC,IAAI,CAAC;IAC5C,IAAI,CAAC0L,aAAa,GAAG,IAAI,CAACA,aAAa,CAAC1L,IAAI,CAAC,IAAI,CAAC;IAClD,IAAI,CAAC8H,kBAAkB,GAAG,IAAI,CAACA,kBAAkB,CAAC9H,IAAI,CAAC,IAAI,CAAC;IAC5D,IAAI,CAAC2L,WAAW,GAAG,IAAI,CAACA,WAAW,CAAC3L,IAAI,CAAC,IAAI,CAAC;IAC9C,IAAI,CAAC4L,eAAe,GAAG,IAAI,CAACA,eAAe,CAAC5L,IAAI,CAAC,IAAI,CAAC;IACtD,IAAI,CAACiC,wBAAwB,GAAG,IAAI,CAACA,wBAAwB,CAACjC,IAAI,CAAC,IAAI,CAAC;IACxE,IAAI,CAAC+B,6BAA6B,GAAG,IAAI,CAACA,6BAA6B,CAAC/B,IAAI,CAAC,IAAI,CAAC;IAClF,IAAI,CAAC6L,oBAAoB,GAAG,IAAI,CAACA,oBAAoB,CAAC7L,IAAI,CAAC,IAAI,CAAC;IAChE,IAAI,CAAC8L,yBAAyB,GAAG,IAAI,CAACA,yBAAyB,CAAC9L,IAAI,CAAC,IAAI,CAAC;IAC1E,IAAI,CAAC+L,oBAAoB,GAAG,IAAI,CAACA,oBAAoB,CAAC/L,IAAI,CAAC,IAAI,CAAC;IAChE,IAAI,CAACgM,iBAAiB,GAAG,IAAI,CAACA,iBAAiB,CAAChM,IAAI,CAAC,IAAI,CAAC;IAC1D,IAAI,CAACiM,kBAAkB,GAAG,IAAI,CAACA,kBAAkB,CAACjM,IAAI,CAAC,IAAI,CAAC;EAC9D;EAGAiG,kBAAkB,CAACnG,KAAK,EAAE;IACxB,MAAM9G,KAAK,GAAG,IAAI,CAAC8G,KAAK,CAACqB,MAAM,CAAC+K,QAAQ,CAACpM,KAAK,CAAC9G,KAAK,CAAC;IACrD,IAAI,CAACA,KAAK,EAAE;MACV;IACF;IAEA,IAAI,IAAI,CAACyS,UAAU,IAAIzS,KAAK,CAACyS,UAAU,EAAE;MACvC,IAAI,CAACL,gBAAgB,GAAGpS,KAAK,CAACyS,UAAU;MACxCzS,KAAK,CAACyS,UAAU,GAAG,IAAI,CAACA,UAAU;MAElC,IAAI,CAACJ,mBAAmB,GAAGrS,KAAK,CAAC0S,aAAa;MAC9C1S,KAAK,CAAC0S,aAAa,GAAG,IAAI,CAACA,aAAa;IAC1C;IAEA,IAAI,IAAI,CAACjY,KAAK,CAACuF,KAAK,IAAI8G,KAAK,CAAC9G,KAAK,EAAE;MACnC,IAAI,CAACoJ,QAAQ,CAAC;QAACpJ,KAAK,EAAE8G,KAAK,CAAC9G;MAAK,CAAC,CAAC;MACnC,IAAI,CAACuS,SAAS,CAACvS,KAAK,EAAE8G,KAAK,CAAC;MAC5B,IAAI,CAACwL,SAAS,CAACtS,KAAK,EAAE8G,KAAK,CAAC;MAC5B,IAAI,CAAC0L,SAAS,CAACxS,KAAK,CAAC;IACvB;EACF;EAEAmT,oBAAoB,GAAG;IACrB,MAAMnT,KAAK,GAAG,IAAI,CAAC8G,KAAK,CAACqB,MAAM,CAAC+K,QAAQ,CAAC,IAAI,CAACpM,KAAK,CAAC9G,KAAK,CAAC;IAC1D,IAAI,CAACA,KAAK,EAAE;MACV;IACF;IACA,IAAI,CAACoJ,QAAQ,CAAC;MAACpJ,KAAK,EAAE;IAAI,CAAC,CAAC;IAC5BA,KAAK,CAACyS,UAAU,GAAG,IAAI,CAACL,gBAAgB;IACxCpS,KAAK,CAAC0S,aAAa,GAAG,IAAI,CAACL,mBAAmB;EAChD;EAEAC,SAAS,CAACtS,KAAK,EAAE8G,KAAK,EAAE;IACtB,MAAM6C,QAAQ,GAAG;MAACqD,WAAW,EAAE;IAAE,CAAC;IAClC,IAAIhN,KAAK,CAACoT,OAAO,EAAE,IAAI,KAAK,EAAE;MAG5B,MAAMC,KAAK,GAAGrT,KAAK,CAACsT,UAAU,CAACxM,KAAK,CAAC9G,KAAK,CAAC;MAC3C,IAAIqT,KAAK,EAAE;QACT1J,QAAQ,CAACuI,UAAU,GAAGmB,KAAK,CAAC9K,GAAG,CAACgL,QAAQ,EAAE;QAC1C5J,QAAQ,CAACwI,SAAS,GAAGkB,KAAK,CAAC9K,GAAG,CAACiL,OAAO,EAAE;MAC1C,CAAC,MAAM;QACL7J,QAAQ,CAACuI,UAAU,GAAGxkB,uDAAc;QACpCic,QAAQ,CAACwI,SAAS,GAAGzkB,uDAAc;MACrC;IACF,CAAC,MAAM;MACLsS,KAAK,CAACyT,WAAW,CAAEC,GAAG,IAAK;QACzB/J,QAAQ,CAACqD,WAAW,CAAC1V,IAAI,CAACoc,GAAG,CAAC;MAChC,CAAC,EAAE,IAAI,CAAC;IACV;IAEA,IAAI,CAACtK,QAAQ,CAACO,QAAQ,CAAC;EACzB;EAEA4I,SAAS,CAACvS,KAAK,EAAE8G,KAAK,EAAE;IACtB,MAAM2B,MAAM,GAAGzI,KAAK,CAAC0I,gBAAgB,EAAE,IAAI,CAAC,CAAC;IAC7C,MAAMH,GAAG,GAAGvI,KAAK,CAAC2T,aAAa,EAAE;IAEjC,MAAMC,MAAM,GAAG,EAAE;IACjB,IAAI5T,KAAK,CAAC6T,OAAO,EAAE;MACjB,KAAK,MAAM,CAAC7a,GAAG,EAAEsB,GAAG,CAAC,IAAI8D,MAAM,CAAC0V,OAAO,CAAC9T,KAAK,CAAC6T,OAAO,CAAC,EAAE;QACtD,IAAIvZ,GAAG,EAAE;UACPsZ,MAAM,CAACtc,IAAI,CAAC0B,GAAG,CAAC;QAClB;MACF;IACF;IAEA,IAAI,CAACoQ,QAAQ,CAAC;MACZkI,KAAK,EAAE/I,GAAG,IAAIA,GAAG,CAACwL,OAAO,EAAE;MAC3BxC,KAAK,EAAEhJ,GAAG,IAAIA,GAAG,CAACyL,OAAO,EAAE;MAC3BxC,MAAM,EAAEjJ,GAAG,IAAIA,GAAG,CAAC0L,QAAQ,EAAE;MAC7BxC,OAAO,EAAElJ,GAAG,IAAIA,GAAG,CAAC2L,SAAS,EAAE;MAC/BxC,KAAK,EAAEnJ,GAAG,IAAIA,GAAG,CAAC4L,OAAO,EAAE;MAE3BrJ,QAAQ,EAAEtE,uDAAO,CAACxG,KAAK,CAAC+K,MAAM,IAAI/K,KAAK,CAAC+K,MAAM,CAAC1G,EAAE,EAAE3V,yDAAgB,CAAC;MACpEsc,WAAW,EAAExE,uDAAO,CAACxG,KAAK,CAAC+K,MAAM,IAAI/K,KAAK,CAAC+K,MAAM,CAACvG,IAAI,EAAE7V,qEAA4B,CAAC;MACrFsc,MAAM,EAAEpb,mEAAY,CAACmQ,KAAK,CAAC+K,MAAM,GAAG/K,KAAK,CAAC+K,MAAM,CAACjb,KAAK,GAAG,IAAI,CAAC;MAC9Dkc,aAAa,EAAE4H,MAAM;MACrBlH,OAAO,EAAElG,uDAAO,CAACxG,KAAK,CAAC0M,OAAO,IAAI1M,KAAK,CAAC0M,OAAO,CAAC0H,OAAO,EAAE1lB,yDAAgB,CAAC;MAC1E2lB,QAAQ,EAAErU,KAAK,CAACsU,UAAU,EAAE;MAC5B3C,OAAO,EAAE3R,KAAK,CAACvM,IAAI;MACnBme,UAAU,EAAE5R,KAAK,CAACuU,WAAW,EAAE;MAC/B1C,OAAO,EAAE7R,KAAK,CAACwU,aAAa,EAAE,IAAIxU,KAAK,CAACyU,IAAI;MAC5C1C,MAAM,EAAExJ,GAAG,GAAGA,GAAG,CAACmM,OAAO,EAAE,GAAGhb,SAAS;MACvCsY,SAAS,EAAEzJ,GAAG,GAAGA,GAAG,CAACgL,QAAQ,EAAE,GAAG7Z,SAAS;MAC3CuY,QAAQ,EAAE1J,GAAG,GAAGA,GAAG,CAACiL,OAAO,EAAE,GAAG9Z,SAAS;MACzCiP,IAAI,EAAEF,MAAM,CAACE,IAAI;MACjBC,IAAI,EAAEH,MAAM,CAACG;IACf,CAAC,CAAC;EACJ;EAEA4J,SAAS,CAACxS,KAAK,EAAE;IACf,IAAIA,KAAK,CAACoT,OAAO,EAAE,IAAI,KAAK,EAAE;MAC5B;IACF;IAEA,MAAM7K,GAAG,GAAGvI,KAAK,CAAC2T,aAAa,EAAE;IACjC,IAAIpL,GAAG,IAAIA,GAAG,CAACwL,OAAO,EAAE,EAAE;MAExB/T,KAAK,CAAC2U,OAAO,CAAC3U,KAAK,CAAC4U,cAAc,EAAE,CAACC,QAAQ,EAAE,CAACC,KAAK,EAAE,CAAC;IAC1D;EACF;EAEArC,UAAU,CAACsC,IAAI,EAAE;IACf,MAAM/U,KAAK,GAAG,IAAI,CAAC8G,KAAK,CAACqB,MAAM,CAAC+K,QAAQ,CAAC,IAAI,CAACpM,KAAK,CAAC9G,KAAK,CAAC;IAC1D,IAAI,CAACA,KAAK,EAAE;MACV;IACF;IACA,IAAI,CAACuS,SAAS,CAACvS,KAAK,EAAE,IAAI,CAAC8G,KAAK,CAAC;IAEjC,IAAI,IAAI,CAACsL,gBAAgB,IAAI,IAAI,CAACA,gBAAgB,IAAI,IAAI,CAACK,UAAU,EAAE;MACrE,IAAI,CAACL,gBAAgB,CAAC2C,IAAI,CAAC;IAC7B;EACF;EAEArC,aAAa,CAACsC,IAAI,EAAE;IAClB,MAAMhV,KAAK,GAAG,IAAI,CAAC8G,KAAK,CAACqB,MAAM,CAAC+K,QAAQ,CAAC,IAAI,CAACpM,KAAK,CAAC9G,KAAK,CAAC;IAC1D,IAAI,CAACA,KAAK,EAAE;MACV;IACF;IACA,IAAI,CAACsS,SAAS,CAACtS,KAAK,EAAE,IAAI,CAAC8G,KAAK,CAAC;IAEjC,IAAI,IAAI,CAACuL,mBAAmB,IAAI,IAAI,CAACA,mBAAmB,IAAI,IAAI,CAACK,aAAa,EAAE;MAC9E,IAAI,CAACL,mBAAmB,CAAC2C,IAAI,CAAC;IAChC;EACF;EAEAlG,kBAAkB,CAAC5e,IAAI,EAAEgC,GAAG,EAAE;IAC5B,IAAI,CAACkX,QAAQ,CAAC;MAAC6B,MAAM,EAAE/Y;IAAG,CAAC,CAAC;IAC5B,IAAI,CAAC4U,KAAK,CAACmO,iBAAiB,CAAC,IAAI,CAACnO,KAAK,CAAC9G,KAAK,EAAEoE,uDAAO,CAAC,IAAI,EAAElS,GAAG,IAAIuR,uDAAe,CAAC,EAAE,IAAI,CAAC;EAC7F;EAEAkP,WAAW,CAACuC,OAAO,EAAEhO,OAAO,EAAE;IAC5B,IAAI,CAACkC,QAAQ,CAAC;MAACsI,KAAK,EAAExK;IAAO,CAAC,CAAC;IAC/B,IAAI,CAACJ,KAAK,CAACqO,mBAAmB,CAAC,IAAI,CAACrO,KAAK,CAAC9G,KAAK,EAAEkH,OAAO,GAAG,IAAI,GAAG,IAAI,CAAC;EACzE;EAEA0L,eAAe,CAACsC,OAAO,EAAEE,QAAQ,EAAE;IACjC,IAAI,CAACtO,KAAK,CAACuO,gBAAgB,CAAC,IAAI,CAACvO,KAAK,CAAC9G,KAAK,CAAC;EAC/C;EAEAiJ,wBAAwB,CAACM,KAAK,EAAEE,IAAI,EAAE;IACpC,QAAQF,KAAK;MACX,KAAK,MAAM;QACT,IAAI,CAACzC,KAAK,CAACwO,wBAAwB,CAAC,IAAI,CAACxO,KAAK,CAAC9G,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE;UAAC2I,IAAI,EAAEc;QAAI,CAAC,CAAC;QAC/E;MACF,KAAK,MAAM;QACT,IAAI,CAAC3C,KAAK,CAACwO,wBAAwB,CAAC,IAAI,CAACxO,KAAK,CAAC9G,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE;UAAC4I,IAAI,EAAEa;QAAI,CAAC,CAAC;QAC/E;MACF,KAAK,MAAM;MACX,KAAK,MAAM;QACT,IAAI,CAAC3C,KAAK,CAACqO,mBAAmB,CAAC,IAAI,CAACrO,KAAK,CAAC9G,KAAK,EAAEyJ,IAAI,CAAC;QACtD;MACF,KAAK,OAAO;QACV,IAAI,CAAC3C,KAAK,CAACqO,mBAAmB,CAAC,IAAI,CAACrO,KAAK,CAAC9G,KAAK,EAAEyJ,IAAI,EAAE,IAAI,CAAC3C,KAAK,CAAC9G,KAAK,CAAC;QACxE;MACF,KAAK,MAAM;QACT,IAAI,CAAC8G,KAAK,CAACqO,mBAAmB,CAAC,IAAI,CAACrO,KAAK,CAAC9G,KAAK,EAAEyJ,IAAI,EAAE,IAAI,CAAChP,KAAK,CAAC8a,qBAAqB,CAAC;QACxF;IAAM;IAGV,IAAI,CAACtC,kBAAkB,EAAE;EAC3B;EAEAlK,6BAA6B,CAACQ,KAAK,EAAEiM,GAAG,EAAE;IACxC,MAAM;MAACza;IAAa,CAAC,GAAG,IAAI,CAAC+L,KAAK,CAACgD,IAAI;IACvC,IAAI2L,MAAM,EAAEC,SAAS,EAAEC,MAAM,EAAEC,SAAS,EAAEC,YAAY,EAAEC,SAAS,EAAEC,UAAU;IAC7E,QAAQxM,KAAK;MACX,KAAK,MAAM;QACTkM,MAAM,GAAG,IAAI,CAAChb,KAAK,CAACsX,MAAM;QAC1B;MACF,KAAK,MAAM;QACT0D,MAAM,GAAG,IAAI,CAAChb,KAAK,CAACwX,QAAQ;QAC5ByD,SAAS,GAAG,IAAI,CAACjb,KAAK,CAACuX,SAAS;QAChC,IAAI,IAAI,CAACvX,KAAK,CAAC6W,KAAK,EAAE;UAEpBqE,MAAM,GAAG,GAAG;QACd,CAAC,MAAM;UAELA,MAAM,GAAGtF,yDAAiB,CAACA,uDAAe,CAAC,MAAM,EAAE,IAAI,CAAC5V,KAAK,CAACuX,SAAS,CAAC,CAAC;UACzE,IAAI,IAAI,CAACvX,KAAK,CAACoX,OAAO,EAAE;YAEtB8D,MAAM,IAAI,GAAG;UACf;QACF;QACAC,SAAS,GAAG7a,aAAa,CAAC1C,QAAQ,CAAC0Y,SAAS,CAAC;QAC7C8E,YAAY,GAAG9a,aAAa,CAAC1C,QAAQ,CAAC2Y,UAAU,CAAC;QACjD;MACF,KAAK,OAAO;QACVyE,MAAM,GAAG,IAAI,CAAChb,KAAK,CAACyX,UAAU;QAC9BwD,SAAS,GAAG,IAAI,CAACjb,KAAK,CAAC0X,SAAS;QAChCwD,MAAM,GAAG,IAAI,CAAClb,KAAK,CAACmX,UAAU,GAAI,IAAI,CAACnX,KAAK,CAAC6W,KAAK,GAAG,EAAE,GAAG,GAAG,GAAI,MAAM;QACvEsE,SAAS,GAAG7a,aAAa,CAAC1C,QAAQ,CAAC2Y,UAAU,CAAC;QAC9C6E,YAAY,GAAG9a,aAAa,CAAC1C,QAAQ,CAAC0Y,SAAS,CAAC;QAChD;MACF,KAAK,MAAM;QACT0E,MAAM,GAAG,IAAI,CAAChb,KAAK,CAACkO,IAAI;QACxBgN,MAAM,GAAG,GAAG;QACZ;MACF,KAAK,MAAM;QACTF,MAAM,GAAG,IAAI,CAAChb,KAAK,CAACmO,IAAI;QACxB+M,MAAM,GAAG,GAAG;QACZ;MACF,KAAK,MAAM;QAAE;UACX,MAAM3V,KAAK,GAAG,IAAI,CAAC8G,KAAK,CAACqB,MAAM,CAAC+K,QAAQ,CAAC,IAAI,CAACpM,KAAK,CAAC9G,KAAK,CAAC;UAC1D,IAAI,CAACA,KAAK,EAAE;YACV;UACF;UACA,MAAMiW,IAAI,GAAGjW,KAAK,CAACsT,UAAU,CAACkC,GAAG,CAAC;UAClC,IAAI,CAACS,IAAI,IAAI,CAACA,IAAI,CAAC1N,GAAG,EAAE;YACtB;UACF;UACAkN,MAAM,GAAGQ,IAAI,CAAC1N,GAAG,CAACgL,QAAQ,EAAE;UAC5BmC,SAAS,GAAGO,IAAI,CAAC1N,GAAG,CAACiL,OAAO,EAAE;UAC9BmC,MAAM,GAAG,IAAI,CAAClb,KAAK,CAAC6W,KAAK,GAAG,EAAE,GAAG,GAAG;UACpCsE,SAAS,GAAG7a,aAAa,CAAC1C,QAAQ,CAAC2Y,UAAU,CAAC;UAC9C6E,YAAY,GAAG9a,aAAa,CAAC1C,QAAQ,CAAC0Y,SAAS,CAAC;UAChD,IAAIkF,IAAI,CAAClL,MAAM,EAAE;YACf+K,SAAS,GAAGG,IAAI,CAAClL,MAAM,CAAC1G,EAAE;YAC1B0R,UAAU,GAAGE,IAAI,CAAClL,MAAM,CAACjb,KAAK;UAChC;UACA;QACF;MACA;QACEwF,OAAO,CAAClB,KAAK,CAAC,mCAAmC,GAAGmV,KAAK,GAAG,GAAG,CAAC;QAChE;IAAO;IAEX,IAAI,CAACH,QAAQ,CAAC;MACZmM,qBAAqB,EAAEC,GAAG;MAC1BU,oBAAoB,EAAEJ,SAAS;MAC/BK,qBAAqB,EAAEJ,UAAU;MACjCvM,iBAAiB,EAAEiM,MAAM;MACzBW,oBAAoB,EAAEV,SAAS;MAC/BW,sBAAsB,EAAET,SAAS;MACjCU,yBAAyB,EAAET,YAAY;MACvCU,wBAAwB,EAAEZ;IAC5B,CAAC,CAAC;IACF,IAAI,CAAC7O,KAAK,CAACgF,UAAU,CAAE,QAAOvC,KAAM,EAAC,CAAC;EACxC;EAEAsJ,oBAAoB,CAACjJ,CAAC,EAAE;IACtBA,CAAC,CAACC,cAAc,EAAE;IAClB,IAAI,CAAC/C,KAAK,CAAC0P,UAAU,EAAE;IACvB,IAAI,CAAC1P,KAAK,CAACgF,UAAU,CAAC,SAAS,CAAC;EAClC;EAEAgH,yBAAyB,CAACjC,OAAO,EAAE4F,KAAK,EAAEC,OAAO,EAAE;IACjD,IAAI,CAAC5P,KAAK,CAAC6P,qBAAqB,CAAC,IAAI,CAAC7P,KAAK,CAAC9G,KAAK,EAAEyW,KAAK,EAAEC,OAAO,CAAC;IAClE,IAAI,CAAC5P,KAAK,CAACgF,UAAU,CAAC,MAAM,CAAC;EAC/B;EAEAiH,oBAAoB,CAACyC,GAAG,EAAE;IACxB,IAAI,CAACpM,QAAQ,CAAC;MAAC0I,eAAe,EAAE0D;IAAG,CAAC,CAAC;EACvC;EAEAvC,kBAAkB,GAAG;IACnB,MAAM7T,IAAI,GAAG,CAAC,IAAI,CAAC0H,KAAK,CAAC8P,KAAK,IAAI,MAAM,EAAEriB,KAAK,CAAC,GAAG,CAAC;IACpD,IAAI6K,IAAI,CAAC,CAAC,CAAC,IAAI,MAAM,EAAE;MACrB,IAAI,CAAC0H,KAAK,CAACgF,UAAU,CAAC,IAAI,CAAC;IAC7B,CAAC,MAAM,IAAI1M,IAAI,CAAC,CAAC,CAAC,IAAI,MAAM,EAAE;MAC5B,IAAIA,IAAI,CAAC,CAAC,CAAC,IAAI,MAAM,EAAE;QACrB,IAAI,CAAC0H,KAAK,CAACgF,UAAU,CAAC,MAAM,CAAC;MAC/B,CAAC,MAAM;QACL,IAAI,CAAChF,KAAK,CAACgF,UAAU,CAAC,UAAU,CAAC;MACnC;IACF,CAAC,MAAM;MACL,IAAI,CAAChF,KAAK,CAACgF,UAAU,CAAC,MAAM,CAAC;IAC/B;EACF;EAEAkH,iBAAiB,CAACrU,MAAM,EAAE;IACxB,MAAM;MAAC5D;IAAa,CAAC,GAAG,IAAI,CAAC+L,KAAK,CAACgD,IAAI;IACvC,MAAM9J,KAAK,GAAG,IAAI,CAAC8G,KAAK,CAACqB,MAAM,CAAC+K,QAAQ,CAAC,IAAI,CAACpM,KAAK,CAAC9G,KAAK,CAAC;IAC1D,IAAI,CAACA,KAAK,EAAE;MACV;IACF;IACA,MAAMiW,IAAI,GAAGjW,KAAK,CAACsT,UAAU,CAAC3U,MAAM,CAACkY,SAAS,CAAC;IAC/C,IAAI,CAACZ,IAAI,IAAI,CAACA,IAAI,CAAC1N,GAAG,EAAE;MACtB;IACF;IAEA,MAAMuO,IAAI,GAAG,IAAI,CAAChQ,KAAK,CAACqB,MAAM,CAAC2O,IAAI,CAACnY,MAAM,CAACkY,SAAS,CAAC;IACrD,MAAME,SAAS,GAAG,CAAC;MACjBpb,KAAK,EAAEZ,aAAa,CAAC1C,QAAQ,CAAC+Y,gBAAgB,CAAC;MAC/C4F,OAAO,EAAEjjB,CAAC,IAAI,IAAI,CAACgV,6BAA6B,CAAC+N,IAAI,GAAG,MAAM,GAAG,MAAM,EAAEnY,MAAM,CAACkY,SAAS;IAC3F,CAAC,CAAC;IACF,IAAI,CAACC,IAAI,EAAE;MACTC,SAAS,CAACzf,IAAI,CAAC,eAAe,CAAC;IACjC;IACAyf,SAAS,CAACzf,IAAI,CAAC2e,IAAI,CAAC1N,GAAG,CAAC4L,OAAO,EAAE,GAAG,eAAe,GAAG,aAAa,CAAC;IACpE,IAAI,CAAC2C,IAAI,EAAE;MACTC,SAAS,CAACzf,IAAI,CAAC2e,IAAI,CAAC1N,GAAG,CAACC,QAAQ,EAAE,GAAG,cAAc,GAAG,gBAAgB,CAAC;IACzE;IACA,IAAI,CAAC1B,KAAK,CAAC4G,eAAe,CAAC;MACzBmJ,SAAS,EAAE,IAAI,CAAC/P,KAAK,CAAC9G,KAAK;MAC3BiX,CAAC,EAAEtY,MAAM,CAACsY,CAAC;MACXC,CAAC,EAAEvY,MAAM,CAACuY,CAAC;MACXjB,IAAI,EAAEtX,MAAM,CAACkY;IAAS,CAAC,EAAEE,SAAS,CAAC;EACvC;EAEAzP,MAAM,GAAG;IACP,MAAMlI,IAAI,GAAG,CAAC,IAAI,CAAC0H,KAAK,CAAC8P,KAAK,IAAI,MAAM,EAAEriB,KAAK,CAAC,GAAG,CAAC;IACpD,MAAM4iB,IAAI,GAAG/X,IAAI,CAAC,CAAC,CAAC;IACpBA,IAAI,CAACgY,KAAK,EAAE;IAEZ,MAAM;MAACrc;IAAa,CAAC,GAAG,IAAI,CAAC+L,KAAK,CAACgD,IAAI;IACvC,MAAMuN,UAAU,GAAGtc,aAAa,CAAC,CAACoc,IAAI,IAAI,MAAM,GAAG9e,QAAQ,CAAC,OAAO,GAAG+G,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG/G,QAAQ,CAAC8e,IAAI,CAAC,KAC1F9e,QAAQ,CAAC,MAAM,CAAC,CAAC;IAEtB,OACE;MAAK,EAAE,EAAC;IAAW,GACjB;MAAK,SAAS,EAAC,eAAe;MAAC,EAAE,EAAC;IAAoB,GACpD;MAAK,SAAS,EAAC,aAAa;MAAC,EAAE,EAAC;IAAY,GAAEgf,UAAU,CAAO,EAC/D,wEACE,2DAAC,gEAAU;MAAC,QAAQ,EAAE,IAAI,CAACpE;IAAmB,EAAG,CAC7C,CACF,EACL,IAAI,CAACnM,KAAK,CAACwQ,aAAa,GACvB,2DAAC,gEAAU;MACT,KAAK,EAAE,IAAI,CAACxQ,KAAK,CAACyQ,UAAW;MAC7B,IAAI,EAAE,IAAI,CAACzQ,KAAK,CAAC0Q,SAAU;MAC3B,YAAY,EAAE,IAAI,CAAC1Q,KAAK,CAAChS;IAAQ,EAAG,GAAG,IAAI,EAC9CqiB,IAAI,IAAI,SAAS,GAChB,2DAAC,kEAAY;MACX,MAAM,EAAE,IAAI,CAACrQ,KAAK,CAACqB,MAAO;MAC1B,OAAO,EAAE,IAAI,CAAC1N,KAAK,CAACuS,WAAY;MAChC,cAAc,EAAE,IAAI,CAAClG,KAAK,CAACiF,QAAS;MACpC,kBAAkB,EAAE,CAAC,IAAI,CAACtR,KAAK,CAAC8W,KAAK,IAAI,CAAC,IAAI,CAAC9W,KAAK,CAAC6W,KAAM;MAC3D,QAAQ,EAAE,IAAI,CAACxK,KAAK,CAACiF,QAAS;MAC9B,QAAQ,EAAE,IAAI,CAACjF,KAAK,CAAC2Q,kBAAmB;MACxC,QAAQ,EAAE,IAAI,CAACxE,kBAAmB;MAClC,QAAQ,EAAE,IAAI,CAACH;IAA0B,EAAG,GAEhDqE,IAAI,IAAI,MAAM,IAAI/X,IAAI,CAAC7L,MAAM,GAAG,CAAC,GAC/B,2DAAC,wEAAiB;MAChB,MAAM,EAAE,IAAI,CAACuT,KAAK,CAACqB,MAAO;MAC1B,IAAI,EAAE,IAAI,CAAC1N,KAAK,CAAC+O,iBAAkB;MACnC,OAAO,EAAE,IAAI,CAAC/O,KAAK,CAAC2b,oBAAqB;MACzC,IAAI,EAAE,IAAI,CAAC3b,KAAK,CAAC8b,wBAAyB;MAC1C,SAAS,EAAE,IAAI,CAAC9b,KAAK,CAAC4b,sBAAuB;MAC7C,YAAY,EAAE,IAAI,CAAC5b,KAAK,CAAC6b,yBAA0B;MACnD,SAAS,EAAE,IAAI,CAAC7b,KAAK,CAACyb,oBAAqB;MAC3C,IAAI,EAAE,IAAI,CAACzb,KAAK,CAAC8a,qBAAsB;MACvC,UAAU,EAAE,IAAI,CAAC9a,KAAK,CAAC0b,qBAAsB;MAC7C,QAAQ,EAAGuB,IAAI,IAAK,IAAI,CAACzO,wBAAwB,CAAC7J,IAAI,CAAC,CAAC,CAAC,EAAEsY,IAAI,CAAE;MACjE,QAAQ,EAAE,IAAI,CAACzE;IAAmB,EAAG,GAEzCkE,IAAI,IAAI,SAAS,GACf,2DAAC,+DAAe;MACd,MAAM,EAAE,IAAI,CAACrQ,KAAK,CAACqB,MAAO;MAC1B,KAAK,EAAE,IAAI,CAACrB,KAAK,CAAC9G,KAAM;MACxB,aAAa,EAAE,IAAI,CAAC8G,KAAK,CAACoJ,aAAc;MACxC,SAAS,EAAE,IAAI,CAACpJ,KAAK,CAAC6Q,SAAU;MAChC,mBAAmB,EAAE,IAAI,CAAC7Q,KAAK,CAAC8Q,wBAAyB;MACzD,aAAa,EAAE,IAAI,CAAC9Q,KAAK,CAAC+Q,aAAc;MACxC,YAAY,EAAE,IAAI,CAAC/Q,KAAK,CAACgR,YAAa;MACtC,iBAAiB,EAAE,IAAI,CAAChR,KAAK,CAACwO,wBAAyB;MACvD,OAAO,EAAE,IAAI,CAACxO,KAAK,CAAChS;IAAQ,EAAG,GAEnCqiB,IAAI,IAAI,UAAU,GAChB,2DAAC,oEAAa;MACZ,KAAK,EAAE,IAAI,CAACrQ,KAAK,CAAC9G,KAAM;MACxB,KAAK,EAAE,IAAI,CAACvF,KAAK,CAAC6W,KAAM;MACxB,KAAK,EAAE,IAAI,CAAC7W,KAAK,CAAC8W,KAAM;MACxB,MAAM,EAAE,IAAI,CAAC9W,KAAK,CAAC+W,MAAO;MAC1B,OAAO,EAAE,IAAI,CAAC/W,KAAK,CAACgX,OAAQ;MAC5B,KAAK,EAAE,IAAI,CAAChX,KAAK,CAACiX,KAAM;MAExB,UAAU,EAAE,IAAI,CAACjX,KAAK,CAACmX,UAAW;MAClC,OAAO,EAAE,IAAI,CAACnX,KAAK,CAACoX,OAAQ;MAC5B,MAAM,EAAE,IAAI,CAACpX,KAAK,CAACsX,MAAO;MAC1B,SAAS,EAAE,IAAI,CAACtX,KAAK,CAACuX,SAAU;MAChC,QAAQ,EAAE,IAAI,CAACvX,KAAK,CAACwX,QAAS;MAC9B,UAAU,EAAE,IAAI,CAACxX,KAAK,CAACyX,UAAW;MAClC,SAAS,EAAE,IAAI,CAACzX,KAAK,CAAC0X,SAAU;MAChC,IAAI,EAAE,IAAI,CAAC1X,KAAK,CAACkO,IAAK;MACtB,IAAI,EAAE,IAAI,CAAClO,KAAK,CAACmO,IAAK;MAEtB,WAAW,EAAE,IAAI,CAAC9B,KAAK,CAACiD,WAAY;MACpC,gBAAgB,EAAE,IAAI,CAACjD,KAAK,CAACiR,gBAAiB;MAC9C,YAAY,EAAE,IAAI,CAACjR,KAAK,CAACkR,YAAa;MACtC,YAAY,EAAE,IAAI,CAAClR,KAAK,CAACmR,YAAa;MACtC,aAAa,EAAE,IAAI,CAACnR,KAAK,CAACoR,aAAc;MACxC,yBAAyB,EAAE,IAAI,CAACnP,6BAA8B;MAC9D,UAAU,EAAE,IAAI,CAACjC,KAAK,CAACgF;IAAW,EAAG,GAEvC;MAAK,EAAE,EAAC,mBAAmB;MAAC,SAAS,EAAC;IAAkB,GACtD;MAAK,SAAS,EAAC;IAAmB,GAChC;MAAG,IAAI,EAAC,GAAG;MAAC,SAAS,EAAC,yBAAyB;MAAC,OAAO,EAAGlC,CAAC,IAAK;QAACA,CAAC,CAACC,cAAc,EAAE;QAAE,IAAI,CAAC/C,KAAK,CAACgF,UAAU,CAAC,SAAS,CAAC;MAAC;IAAE,GACtH;MAAG,SAAS,EAAC;IAAgB,GAAC,MAAI,CAAI,QACtC,6DAAC,wDAAgB;MAAC,EAAE,eAAc;MAAC,cAAc;QAAA;QAAA;MAAA;IAAO,EAAuC,CAC7F,EACJ,2EACE,2DAAC,kEAAY;MACX,MAAM,EAAE,IAAI,CAAChF,KAAK,CAACqB,MAAO;MAC1B,MAAM,EAAE,IAAI,CAAC1N,KAAK,CAACwQ,MAAO;MAC1B,QAAQ,EAAE,IAAK;MACf,GAAG,EAAE,IAAI,CAACnE,KAAK,CAAC9G,KAAM;MACtB,KAAK,EAAE,IAAI,CAACvF,KAAK,CAACqQ;IAAS,EAAG,CACzB,EACT;MAAK,SAAS,EAAC;IAAO,GACpB,wEAAK;MAAO,SAAS,EAAC;IAAO,GAC3B,2DAAC,wDAAgB;MAAC,EAAE,oBAAmB;MAAC,cAAc;QAAA;QAAA;MAAA;IAAO,EACd,CACzC,CAAM,EACd;MAAK,SAAS,EAAC;IAAkB,GAAE,IAAI,CAACrQ,KAAK,CAACqQ,QAAQ,EACrD,IAAI,CAACrQ,KAAK,CAACoX,OAAO,GAAG;MAAK,GAAG,EAAC,kBAAkB;MAAC,SAAS,EAAC,SAAS;MAAC,GAAG,EAAC;IAAS,EAAG,GAAG,IAAI,CAAO,CAChG,EACL,IAAI,CAACpX,KAAK,CAACiS,OAAO,GACjB;MAAK,SAAS,EAAC;IAAO,GACpB,wEAAK;MAAO,SAAS,EAAC;IAAO,GAC3B,2DAAC,wDAAgB;MAAC,EAAE,iBAAgB;MAAC,cAAc;QAAA;QAAA;MAAA;IAAkB,EACvB,CACxC,CAAM,EACd;MAAK,SAAS,EAAC;IAAkB,GAAE,IAAI,CAACjS,KAAK,CAACiS,OAAO,CAAO,CACxD,GACJ,IAAI,EAER;MAAK,SAAS,EAAC;IAAO,GACpB;MAAO,SAAS,EAAC;IAAO,GAAC,2DAAC,wDAAgB;MAAC,EAAE,iBAAgB;MAAC,cAAc;QAAA;QAAA;MAAA;IAAM,EACpC,CAAQ,QACtD,yEAAK,IAAI,CAACjS,KAAK,CAACkX,OAAO,CAAM,CACzB,EACN;MAAK,SAAS,EAAC;IAAO,GACpB,2DAAC,+DAAS;MAAC,aAAa,EAAE,IAAI,CAAClX,KAAK,CAACuR;IAAc,EAAG,CAClD,EACL,IAAI,CAACvR,KAAK,CAACuQ,WAAW,GACrB;MAAK,SAAS,EAAC;IAAO,GACpB;MAAO,SAAS,EAAC;IAAO,GACtB,2DAAC,wDAAgB;MAAC,EAAE,qBAAoB;MAAC,cAAc;QAAA;QAAA;MAAA;IAAc,EACf,CAChD,EACR,wEAAM,IAAI,CAACvQ,KAAK,CAACuQ,WAAW,CAAO,CAC/B,GAAG,IAAI,CACX,EACN;MAAK,SAAS,EAAC;IAAI,EAAG,EACtB;MAAK,SAAS,EAAC;IAAgB,GAC7B,0EACE,2DAAC,wDAAgB;MAAC,EAAE,sBAAqB;MAAC,cAAc;QAAA;QAAA;MAAA;IAAS,EACX,CAChD,EACR,2DAAC,6DAAQ;MAAC,IAAI,EAAC,GAAG;MAAC,OAAO,EAAE,IAAI,CAACvQ,KAAK,CAACiX,KAAM;MAAC,QAAQ,EAAE,IAAI,CAACiB;IAAY,EAAG,CACxE,EACL,IAAI,CAAClY,KAAK,CAAC4Z,QAAQ,GAClB;MAAK,SAAS,EAAC;IAAgB,GAC7B,0EACE,2DAAC,wDAAgB;MAAC,EAAE,yBAAwB;MAAC,cAAc;QAAA;QAAA;MAAA;IAAY,EACrB,CAC5C,EACR,2DAAC,6DAAQ;MAAC,IAAI,EAAC,UAAU;MAAC,OAAO,EAAE,IAAK;MAAC,QAAQ,EAAE,IAAI,CAACzB;IAAgB,EAAG,CACvE,GAEN,IAAI,EAEN;MAAK,SAAS,EAAC;IAAI,EAAG,EACtB;MAAK,SAAS,EAAC;IAAgB,GAC7B;MAAG,IAAI,EAAC,GAAG;MAAC,SAAS,EAAC,aAAa;MAAC,OAAO,EAAGhJ,CAAC,IAAK;QAACA,CAAC,CAACC,cAAc,EAAE;QAAE,IAAI,CAAC/C,KAAK,CAACgF,UAAU,CAAC,UAAU,CAAC;MAAC;IAAE,GAC3G;MAAG,SAAS,EAAC;IAAgB,GAAC,UAAQ,CAAI,QAAM,6DAAC,wDAAgB;MAAC,EAAE,mBAAkB;MACpF,cAAc;QAAA;QAAA;MAAA;IAAW,EAAsD,CAC/E,CACA,EACL,IAAI,CAACrR,KAAK,CAACmX,UAAU,IAAI,IAAI,CAACnX,KAAK,CAAC+W,MAAM,GACzC,0HACE;MAAK,SAAS,EAAC;IAAI,EAAG,EACtB;MAAK,SAAS,EAAC;IAAgB,GAC7B;MAAO,SAAS,EAAC;IAAO,GACtB,2DAAC,wDAAgB;MAAC,EAAE,uBAAsB;MAAC,cAAc;QAAA;QAAA;MAAA;IAAiB,EACjC,CACnC,CACJ,EACN;MAAK,SAAS,EAAC;IAAgB,GAC7B;MAAG,IAAI,EAAC,GAAG;MAAC,SAAS,EAAC,aAAa;MAAC,OAAO,EAAE,IAAI,CAACqB;IAAqB,GACrE;MAAG,SAAS,EAAC;IAAgB,GAAC,YAAU,CAAI,SAAO,6DAAC,wDAAgB;MAAC,EAAE,sBAAqB;MAC1F,cAAc;QAAA;QAAA;MAAA;IAAc,EAAsD,CAClF,CACA,EACN,2DAAC,wDAAgB;MAAC,EAAE,wBAAuB;MAAC,cAAc;QAAA;QAAA;MAAA;IAAa,GAEpEsF,UAAU,IAAK,2DAAC,iEAAW;MAC1B,MAAM,EAAE,IAAI,CAACrR,KAAK,CAACqB,MAAO;MAC1B,QAAQ,EAAE,IAAI,CAAC1N,KAAK,CAACuS,WAAY;MACjC,QAAQ,EAAE,IAAI,CAAClG,KAAK,CAACiF,QAAS;MAC9B,gBAAgB,EAAEoM,UAAW;MAC7B,aAAa,EAAE,IAAI,CAAC1d,KAAK,CAACqX,eAAgB;MAC1C,UAAU,EAAE,KAAM;MAClB,UAAU,EAAE,KAAM;MAClB,QAAQ,EAAE,IAAK;MACf,QAAQ,EAAE,IAAK;MACf,eAAe,EAAE,IAAI,CAACiB,oBAAqB;MAC3C,eAAe,EAAE,IAAI,CAACtY,KAAK,CAAC8W,KAAK,GAAG,IAAI,CAACyB,iBAAiB,GAAG;IAAM,EACnE,CACgB,CACnB,GAEH,IAAI,CAEF,CAEJ;EAEV;AACF;AAAC;AAED,iEAAerL,sDAAU,CAAC0J,QAAQ,CAAC;;;;;;;;;;;;;;;;;;;;ACxnBT;AACoB;AAEC;AACe;AAE/C,MAAM+G,SAAS,SAAS7gB,wDAAe,CAAC;EACrDsP,WAAW,CAACC,KAAK,EAAE;IACjB,KAAK,CAACA,KAAK,CAAC;IAEZ,IAAI,CAACrM,KAAK,GAAG;MACXwT,KAAK,EAAEnH,KAAK,CAACmH,KAAK;MAClB5E,QAAQ,EAAE,EAAE;MACZgP,QAAQ,EAAEvR,KAAK,CAACyD,aAAa;MAC7BiE,SAAS,EAAE1H,KAAK,CAACwR;IACnB,CAAC;IACD,IAAI,CAAC7J,iBAAiB,GAAG,IAAI,CAACA,iBAAiB,CAACzH,IAAI,CAAC,IAAI,CAAC;IAC1D,IAAI,CAAC0H,oBAAoB,GAAG,IAAI,CAACA,oBAAoB,CAAC1H,IAAI,CAAC,IAAI,CAAC;IAChE,IAAI,CAAC+H,qBAAqB,GAAG,IAAI,CAACA,qBAAqB,CAAC/H,IAAI,CAAC,IAAI,CAAC;IAClE,IAAI,CAACmI,YAAY,GAAG,IAAI,CAACA,YAAY,CAACnI,IAAI,CAAC,IAAI,CAAC;EAClD;EAEAyH,iBAAiB,CAAC7E,CAAC,EAAE;IACnB,IAAI,CAACR,QAAQ,CAAC;MAAC6E,KAAK,EAAErE,CAAC,CAACyF,MAAM,CAAC3R;IAAK,CAAC,CAAC;EACxC;EAEAgR,oBAAoB,CAAC9E,CAAC,EAAE;IACtB,IAAI,CAACR,QAAQ,CAAC;MAACC,QAAQ,EAAEO,CAAC,CAACyF,MAAM,CAAC3R;IAAK,CAAC,CAAC;EAC3C;EAEAqR,qBAAqB,GAAG;IACtB,IAAI,CAACjI,KAAK,CAACyR,mBAAmB,CAAC,CAAC,IAAI,CAAC9d,KAAK,CAAC+T,SAAS,CAAC;IACrD,IAAI,CAACpF,QAAQ,CAAC;MAACoF,SAAS,EAAE,CAAC,IAAI,CAAC/T,KAAK,CAAC+T;IAAS,CAAC,CAAC;EACnD;EAEAW,YAAY,CAACvF,CAAC,EAAE;IACdA,CAAC,CAACC,cAAc,EAAE;IAClB,IAAI,CAAC/C,KAAK,CAAC0R,OAAO,CAAC,IAAI,CAAC/d,KAAK,CAACwT,KAAK,CAACnT,IAAI,EAAE,EAAE,IAAI,CAACL,KAAK,CAAC4O,QAAQ,CAACvO,IAAI,EAAE,CAAC;EACzE;EAEAwM,MAAM,GAAG;IACP,IAAIuI,aAAa,GAAG,SAAS;IAC7B,IAAI,IAAI,CAAC/I,KAAK,CAACgJ,QAAQ,EAAE;MACvBD,aAAa,IAAI,WAAW;IAC9B;IAEA,OACE;MAAM,EAAE,EAAC,YAAY;MAAC,QAAQ,EAAE,IAAI,CAACV;IAAa,GAChD,2DAAC,wDAAgB;MAAC,EAAE,gBAAe;MAAC,cAAc;QAAA;QAAA;MAAA;IAAQ,GAGvDY,YAAY,IAAK;MAAO,IAAI,EAAC,MAAM;MAAC,EAAE,EAAC,YAAY;MAClD,WAAW,EAAEA,YAAa;MAC1B,YAAY,EAAC,UAAU;MACvB,WAAW,EAAC,KAAK;MACjB,cAAc,EAAC,MAAM;MACrB,KAAK,EAAE,IAAI,CAACtV,KAAK,CAACwT,KAAM;MACxB,QAAQ,EAAE,IAAI,CAACQ,iBAAkB;MACjC,QAAQ;MAAC,SAAS;IAAA,EAAG,CAEN,EACnB,2DAAC,wDAAgB;MAAC,EAAE,mBAAkB;MAAC,cAAc;QAAA;QAAA;MAAA;IAAW,GAG7DuB,eAAe,IAAK,2DAAC,qEAAe;MAAC,IAAI,EAAC,UAAU;MAAC,EAAE,EAAC,eAAe;MACtE,WAAW,EAAEA,eAAgB;MAC7B,YAAY,EAAC,kBAAkB;MAC/B,KAAK,EAAE,IAAI,CAACvV,KAAK,CAAC4O,QAAS;MAC3B,QAAQ,EAAE,IAAI,CAACqF,oBAAqB;MACpC,QAAQ,EAAE;IAAK,EAAG,CAEH,EACnB;MAAK,SAAS,EAAC;IAAgB,GAC7B,2DAAC,6DAAQ;MAAC,EAAE,EAAC,YAAY;MAAC,IAAI,EAAC,YAAY;MAAC,OAAO,EAAE,IAAI,CAACjU,KAAK,CAAC+T,SAAU;MACxE,QAAQ,EAAE,IAAI,CAACO;IAAsB,EAAG,EAC1C;MAAO,OAAO,EAAC;IAAY,GAAC,MAC1B,6DAAC,wDAAgB;MAAC,EAAE,kBAAiB;MAAC,cAAc;QAAA;QAAA;MAAA;IAAiB,EAC9B,CACjC,EACR;MAAG,IAAI,EAAC;IAAQ,GACd,2DAAC,wDAAgB;MAAC,EAAE,wBAAuB;MAAC,cAAc;QAAA;QAAA;MAAA;IAAmB,EAC/B,CAC5C,CACA,EACN;MAAK,SAAS,EAAC;IAAgB,GAC7B;MAAQ,SAAS,EAAEc,aAAc;MAAC,IAAI,EAAC;IAAQ,GAC7C,2DAAC,wDAAgB;MAAC,EAAE,kBAAiB;MAAC,cAAc;QAAA;QAAA;MAAA;IAAU,EAC3B,CAC5B,CACL,CACD;EAEX;AACF;AAAC;;;;;;;;;;;;;;;;;;;;;AC7FyB;AACoB;AAEV;AAEI;AAEzB,MAAM4I,QAAQ,SAASlhB,4DAAmB,CAAC;EACxD+P,MAAM,GAAG;IACP,MAAMoR,OAAO,GAAG/rB,gDAAQ,GAAG,IAAI,GAAG8W,yDAAiB,EAAE,GAAG,GAAG;IAC3D,OACE;MAAK,EAAE,EAAC;IAAY,GAClB,wEACE;MAAG,IAAI,EAAC;IAAiC,GACvC;MAAK,EAAE,EAAC,MAAM;MAAC,GAAG,EAAC,MAAM;MAAC,GAAG,EAAC;IAAc,EAAG,EAC/C,uEAAI,YAAU,CAAK,CACjB,EACJ,sEAAG,2DAAC,wDAAgB;MAAC,EAAE,gBAAe;MAAC,cAAc;QAAA;QAAA;MAAA;IAAU,EAClB,KAAC,EAACiV,OAAO,CAAK,EAC3D,sEAAG,2DAAC,wDAAgB;MAAC,EAAE,gBAAe;MAAC,cAAc;QAAA;QAAA;MAAA;IAAU,EAClB,KAAC,EAAC,IAAI,CAAC5R,KAAK,CAACwD,aAAa,EAAC,IAAE,EAAC,IAAI,CAACxD,KAAK,CAACyD,aAAa,EAAC,GAAC,CAAI,CACrG,CACF;EAEV;AACF;AAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACxByB;AACgD;AAE9B;AAEM;AACI;AACI;AACN;AACA;AACF;AACM;AACL;AACC;AACE;AACf;AACe;AACA;AACE;AAImB;AACY;AACQ;AAC7C;AAC0C;AAG5F,MAAMgP,0BAA0B,GAAG,GAAG;AAEtC,MAAMC,oBAAoB,GAAG,GAAG;AAEhC,MAAMnhB,QAAQ,GAAGb,0DAAc,CAAC;EAC9BiiB,UAAU,EAAE;IACVlhB,EAAE,cAAc;IAChBC,cAAc;MAAA;MAAA;IAAA;EAEhB,CAAC;EACDkhB,SAAS,EAAE;IACTnhB,EAAE,uBAAuB;IACzBC,cAAc;MAAA;MAAA;IAAA;EAEhB,CAAC;EACDmhB,SAAS,EAAE;IACTphB,EAAE,mBAAmB;IACrBC,cAAc;MAAA;MAAA;IAAA;EAEhB,CAAC;EACDqZ,OAAO,EAAE;IACPtZ,EAAE,WAAW;IACbC,cAAc;MAAA;MAAA;IAAA;EAEhB,CAAC;EACDohB,yBAAyB,EAAE;IACzBrhB,EAAE,6BAA6B;IAC/BC,cAAc;MAAA;MAAA;IAAA;MAAA;MAAA;IAAA;MAAA;MAAA;IAAA;MAAA;MAAA;IAAA;MAAA;MAAA;IAAA;EAEhB,CAAC;EACDqhB,eAAe,EAAE;IACfthB,EAAE,mBAAmB;IACrBC,cAAc;MAAA;MAAA;IAAA;EAEhB,CAAC;EACDshB,eAAe,EAAE;IACfvhB,EAAE,mBAAmB;IACrBC,cAAc;MAAA;MAAA;IAAA;EAEhB,CAAC;EACDuhB,SAAS,EAAE;IACTxhB,EAAE,aAAa;IACfC,cAAc;MAAA;MAAA;IAAA;EAEhB;AACF,CAAC,CAAC;AAGF,SAASwhB,aAAa,CAACzR,GAAG,EAAE;EAC1B,IAAIA,GAAG,EAAE;IACP,MAAM0R,EAAE,GAAG1R,GAAG,CAAC2R,YAAY,EAAE,IAAI,EAAE;IACnC,OAAO3R,GAAG,CAACC,QAAQ,CAAC,OAAO,CAAC,KAAKyR,EAAE,CAAC7mB,QAAQ,CAAC,GAAG,CAAC,IAAI6mB,EAAE,CAAC7mB,QAAQ,CAAC,GAAG,CAAC,CAAC;EACxE;EACA,OAAO,KAAK;AACd;AAEA,SAAS+mB,gBAAgB,CAAC5R,GAAG,EAAE;EAC7B,IAAIA,GAAG,EAAE;IACP,MAAM6R,EAAE,GAAG7R,GAAG,CAAC8R,UAAU,EAAE,IAAI,EAAE;IACjC,OAAO9R,GAAG,CAACC,QAAQ,CAAC,MAAM,CAAC,KAAK4R,EAAE,CAAChnB,QAAQ,CAAC,GAAG,CAAC,IAAIgnB,EAAE,CAAChnB,QAAQ,CAAC,GAAG,CAAC,CAAC;EACvE;EACA,OAAO,KAAK;AACd;AAEA,SAASknB,sBAAsB,CAAC9f,SAAS,EAAE;EAIzC,OAAOA,SAAS,IAAIjL,wEAA4B,IAAIiL,SAAS,IAAI/K,kEAAsB;AACzF;AAEA,MAAM8qB,YAAY,SAAShjB,wDAAe,CAAC;EACzCsP,WAAW,CAACC,KAAK,EAAE;IACjB,KAAK,CAACA,KAAK,CAAC;IAEZ,IAAI,CAACrM,KAAK,GAAG8f,YAAY,CAACC,wBAAwB,CAAC1T,KAAK,EAAE,CAAC,CAAC,CAAC;IAE7D,IAAI,CAAC2T,KAAK,GAAG,IAAI,CAACA,KAAK,CAACzT,IAAI,CAAC,IAAI,CAAC;IAClC,IAAI,CAAC0T,WAAW,GAAG,IAAI,CAACA,WAAW,CAAC1T,IAAI,CAAC,IAAI,CAAC;IAC9C,IAAI,CAAC2T,SAAS,GAAG,IAAI,CAACA,SAAS,CAAC3T,IAAI,CAAC,IAAI,CAAC;IAC1C,IAAI,CAAC4T,mBAAmB,GAAG,IAAI,CAACA,mBAAmB,CAAC5T,IAAI,CAAC,IAAI,CAAC;IAC9D,IAAI,CAAC6T,mBAAmB,GAAG,IAAI,CAACA,mBAAmB,CAAC7T,IAAI,CAAC,IAAI,CAAC;IAC9D,IAAI,CAAC8T,kBAAkB,GAAG,IAAI,CAACA,kBAAkB,CAAC9T,IAAI,CAAC,IAAI,CAAC;IAC5D,IAAI,CAAC+T,mBAAmB,GAAG,IAAI,CAACA,mBAAmB,CAAC/T,IAAI,CAAC,IAAI,CAAC;IAC9D,IAAI,CAACgU,YAAY,GAAG,IAAI,CAACA,YAAY,CAAChU,IAAI,CAAC,IAAI,CAAC;IAChD,IAAI,CAACiU,SAAS,GAAG,IAAI,CAACA,SAAS,CAACjU,IAAI,CAAC,IAAI,CAAC;IAC1C,IAAI,CAACkU,qBAAqB,GAAG,IAAI,CAACA,qBAAqB,CAAClU,IAAI,CAAC,IAAI,CAAC;IAClE,IAAI,CAACmU,cAAc,GAAG,IAAI,CAACA,cAAc,CAACnU,IAAI,CAAC,IAAI,CAAC;IACpD,IAAI,CAACoU,iBAAiB,GAAG,IAAI,CAACA,iBAAiB,CAACpU,IAAI,CAAC,IAAI,CAAC;IAC1D,IAAI,CAACqU,gBAAgB,GAAG,IAAI,CAACA,gBAAgB,CAACrU,IAAI,CAAC,IAAI,CAAC;IACxD,IAAI,CAACsU,iBAAiB,GAAG,IAAI,CAACA,iBAAiB,CAACtU,IAAI,CAAC,IAAI,CAAC;IAC1D,IAAI,CAACuU,mBAAmB,GAAG,IAAI,CAACA,mBAAmB,CAACvU,IAAI,CAAC,IAAI,CAAC;IAC9D,IAAI,CAACwU,yBAAyB,GAAG,IAAI,CAACA,yBAAyB,CAACxU,IAAI,CAAC,IAAI,CAAC;IAC1E,IAAI,CAACyU,iBAAiB,GAAG,IAAI,CAACA,iBAAiB,CAACzU,IAAI,CAAC,IAAI,CAAC;IAC1D,IAAI,CAAC0U,iBAAiB,GAAG,IAAI,CAACA,iBAAiB,CAAC1U,IAAI,CAAC,IAAI,CAAC;IAC1D,IAAI,CAAC2U,kBAAkB,GAAG,IAAI,CAACA,kBAAkB,CAAC3U,IAAI,CAAC,IAAI,CAAC;IAC5D,IAAI,CAAC4U,kBAAkB,GAAG,IAAI,CAACA,kBAAkB,CAAC5U,IAAI,CAAC,IAAI,CAAC;IAC5D,IAAI,CAAC6U,kBAAkB,GAAG,IAAI,CAACA,kBAAkB,CAAC7U,IAAI,CAAC,IAAI,CAAC;IAC5D,IAAI,CAAC8U,4BAA4B,GAAG,IAAI,CAACA,4BAA4B,CAAC9U,IAAI,CAAC,IAAI,CAAC;IAChF,IAAI,CAAC+U,uBAAuB,GAAG,IAAI,CAACA,uBAAuB,CAAC/U,IAAI,CAAC,IAAI,CAAC;IACtE,IAAI,CAACgV,gBAAgB,GAAG,IAAI,CAACA,gBAAgB,CAAChV,IAAI,CAAC,IAAI,CAAC;IACxD,IAAI,CAACiV,gBAAgB,GAAG,IAAI,CAACA,gBAAgB,CAACjV,IAAI,CAAC,IAAI,CAAC;IACxD,IAAI,CAACkV,wBAAwB,GAAG,IAAI,CAACA,wBAAwB,CAAClV,IAAI,CAAC,IAAI,CAAC;IACxE,IAAI,CAACmV,kBAAkB,GAAG,IAAI,CAACA,kBAAkB,CAACnV,IAAI,CAAC,IAAI,CAAC;IAC5D,IAAI,CAACoV,oBAAoB,GAAG,IAAI,CAACA,oBAAoB,CAACpV,IAAI,CAAC,IAAI,CAAC;IAChE,IAAI,CAACqV,sBAAsB,GAAG,IAAI,CAACA,sBAAsB,CAACrV,IAAI,CAAC,IAAI,CAAC;IACpE,IAAI,CAACsV,iBAAiB,GAAG,IAAI,CAACA,iBAAiB,CAACtV,IAAI,CAAC,IAAI,CAAC;IAC1D,IAAI,CAACuV,cAAc,GAAG,IAAI,CAACA,cAAc,CAACvV,IAAI,CAAC,IAAI,CAAC;IAEpD,IAAI,CAACwV,eAAe,GAAG,IAAI,CAACA,eAAe,CAACxV,IAAI,CAAC,IAAI,CAAC;IACtD,IAAI,CAACyV,iBAAiB,GAAG,IAAI,CAACA,iBAAiB,CAACzV,IAAI,CAAC,IAAI,CAAC;IAC1D,IAAI,CAAC0V,iBAAiB,GAAG,IAAI,CAACA,iBAAiB,CAAC1V,IAAI,CAAC,IAAI,CAAC;IAC1D,IAAI,CAAC2V,gBAAgB,GAAG,IAAI,CAACA,gBAAgB,CAAC3V,IAAI,CAAC,IAAI,CAAC;IACxD,IAAI,CAAC4V,gBAAgB,GAAG,IAAI,CAACA,gBAAgB,CAAC5V,IAAI,CAAC,IAAI,CAAC;IAExD,IAAI,CAAC6V,aAAa,GAAG,IAAI,CAACA,aAAa,CAAC7V,IAAI,CAAC,IAAI,CAAC;IAClD,IAAI,CAAC8V,YAAY,GAAG,IAAI,CAACA,YAAY,CAAC9V,IAAI,CAAC,IAAI,CAAC;IAChD,IAAI,CAAC+V,aAAa,GAAG,IAAI,CAACA,aAAa,CAAC/V,IAAI,CAAC,IAAI,CAAC;IAClD,IAAI,CAACgW,UAAU,GAAG,IAAI,CAACA,UAAU,CAAChW,IAAI,CAAC,IAAI,CAAC;IAC5C,IAAI,CAACiW,UAAU,GAAG,IAAI,CAACA,UAAU,CAACjW,IAAI,CAAC,IAAI,CAAC;IAE5C,IAAI,CAACkW,eAAe,GAAG,CAAC,CAAC;IACzB,IAAI,CAACC,qBAAqB,GAAG,IAAI,CAACA,qBAAqB,CAACnW,IAAI,CAAC,IAAI,CAAC;IAMlE,IAAI,CAACoW,WAAW,GAAG,CAAC;IACpB,IAAI,CAACC,MAAM,GAAG,IAAI;IAElB,IAAI,CAACC,qBAAqB,GAAG,EAAE;IAC/B,IAAI,CAACC,qBAAqB,GAAG,IAAI;IAEjC,IAAI,CAACC,aAAa,GAAG,IAAI;EAC3B;EAEAL,qBAAqB,CAACM,KAAK,EAAE;IAC3B,IAAI,IAAI,CAACP,eAAe,CAAC7d,cAAc,CAACoe,KAAK,CAAC,EAAE;MAC9C,OAAO,IAAI,CAACP,eAAe,CAACO,KAAK,CAAC;IACpC;IACA,MAAM1tB,GAAG,GAAGwH,sDAAe,EAAE;IAC7B,IAAI,CAAC2lB,eAAe,CAACO,KAAK,CAAC,GAAG1tB,GAAG;IACjC,OAAOA,GAAG;EACZ;EAEA4tB,iBAAiB,GAAG;IAClB,IAAI,IAAI,CAACC,gBAAgB,EAAE;MACzB,IAAI,CAACA,gBAAgB,CAACC,gBAAgB,CAAC,QAAQ,EAAE,IAAI,CAACzC,iBAAiB,CAAC;IAC1E;IAGA,IAAI,IAAI,CAACiC,MAAM,EAAE;MACf,IAAI,CAACA,MAAM,CAACQ,gBAAgB,CAAC,WAAW,EAAE,IAAI,CAACf,YAAY,CAAC;MAC5D,IAAI,CAACO,MAAM,CAACQ,gBAAgB,CAAC,WAAW,EAAE,IAAI,CAACd,aAAa,CAAC;MAC7D,IAAI,CAACM,MAAM,CAACQ,gBAAgB,CAAC,UAAU,EAAE,IAAI,CAACb,UAAU,CAAC;MACzD,IAAI,CAACK,MAAM,CAACQ,gBAAgB,CAAC,MAAM,EAAE,IAAI,CAACZ,UAAU,CAAC;IACvD;EACF;EAEA9J,oBAAoB,GAAG;IACrB,IAAI,IAAI,CAACyK,gBAAgB,EAAE;MACzB,IAAI,CAACA,gBAAgB,CAACE,mBAAmB,CAAC,QAAQ,EAAE,IAAI,CAAC1C,iBAAiB,CAAC;IAC7E;IAGA,IAAI,CAACiB,sBAAsB,EAAE;IAG7B,IAAI,IAAI,CAACgB,MAAM,EAAE;MACf,IAAI,CAACA,MAAM,CAACS,mBAAmB,CAAC,WAAW,EAAE,IAAI,CAAChB,YAAY,CAAC;MAC/D,IAAI,CAACO,MAAM,CAACS,mBAAmB,CAAC,WAAW,EAAE,IAAI,CAACf,aAAa,CAAC;MAChE,IAAI,CAACM,MAAM,CAACS,mBAAmB,CAAC,UAAU,EAAE,IAAI,CAACd,UAAU,CAAC;MAC5D,IAAI,CAACK,MAAM,CAACS,mBAAmB,CAAC,MAAM,EAAE,IAAI,CAACb,UAAU,CAAC;IAC1D;EACF;EAIAhQ,kBAAkB,CAACC,SAAS,EAAEC,SAAS,EAAE;IACvC,IAAI,IAAI,CAACyQ,gBAAgB,KACtBzQ,SAAS,CAACnN,KAAK,IAAI,IAAI,CAACvF,KAAK,CAACuF,KAAK,IAAImN,SAAS,CAAC4Q,YAAY,IAAI,IAAI,CAACtjB,KAAK,CAACsjB,YAAY,CAAC,EAAE;MAE5F,IAAI,IAAI,CAACtjB,KAAK,CAACujB,cAAc,GAAGxE,oBAAoB,EAAE;QACpD,IAAI,CAACoE,gBAAgB,CAACK,SAAS,GAAG,IAAI,CAACL,gBAAgB,CAACM,YAAY,GAClE,IAAI,CAACzjB,KAAK,CAACujB,cAAc,GACzB,IAAI,CAACJ,gBAAgB,CAACO,YAAY;MACtC;IACF;IAEA,MAAMne,KAAK,GAAG,IAAI,CAAC8G,KAAK,CAACqB,MAAM,GAAG,IAAI,CAACrB,KAAK,CAACqB,MAAM,CAAC+K,QAAQ,CAAC,IAAI,CAACzY,KAAK,CAACuF,KAAK,CAAC,GAAGtG,SAAS;IAC1F,IAAI,IAAI,CAACe,KAAK,CAACuF,KAAK,IAAImN,SAAS,CAACnN,KAAK,EAAE;MACvC,IAAImN,SAAS,CAACnN,KAAK,IAAI,CAACyD,kEAA0B,CAAC0J,SAAS,CAACnN,KAAK,CAAC,EAAE;QACnE,IAAI,CAACya,KAAK,CAACtN,SAAS,CAACnN,KAAK,CAAC;QAC3B,IAAImN,SAAS,CAACkR,QAAQ,EAAE;UACtB,IAAI,CAACzB,gBAAgB,CAACzP,SAAS,CAACnN,KAAK,EAAEkN,SAAS,CAACoR,OAAO,CAAC;QAC3D;MACF;MAEA,IAAIte,KAAK,EAAE;QACTA,KAAK,CAACue,MAAM,GAAG,IAAI,CAAChD,mBAAmB;QACvCvb,KAAK,CAACwe,qBAAqB,GAAG,IAAI,CAAChD,yBAAyB;QAC5Dxb,KAAK,CAACye,MAAM,GAAG,IAAI,CAAChD,iBAAiB;QACrCzb,KAAK,CAACyS,UAAU,GAAG,IAAI,CAAC4I,gBAAgB;QACxCrb,KAAK,CAAC0S,aAAa,GAAG,IAAI,CAAC4I,iBAAiB;QAC5Ctb,KAAK,CAAC0e,MAAM,GAAG,IAAI,CAACpD,iBAAiB;MACvC;IACF;IAEA,IAAI,CAAC,IAAI,CAACxU,KAAK,CAAC6X,kBAAkB,EAAE;MAElC,IAAI,CAACtC,sBAAsB,EAAE;IAC/B,CAAC,MAAM;MAEL,IAAI,CAACD,oBAAoB,CAAC,CAAC,CAAC;IAC9B;IAEA,IAAIpc,KAAK,KAAM,IAAI,CAACvF,KAAK,CAACuF,KAAK,IAAImN,SAAS,CAACnN,KAAK,IAAK,CAACkN,SAAS,CAAC0R,KAAK,CAAC,EAAE;MAExE,IAAI5e,KAAK,CAAC6e,IAAI,IAAI7e,KAAK,CAAC8e,SAAS,EAAE,EAAE;QACnC9e,KAAK,CAAC2U,OAAO,CAAC3U,KAAK,CAAC4U,cAAc,EAAE,CAACmK,QAAQ,EAAE,CAACjK,KAAK,EAAE,CAAC;MAC1D,CAAC,MAAM;QACL,IAAI,CAACmG,SAAS,CAACjb,KAAK,CAAC;MACvB;IACF;EACF;EAEA,OAAOwa,wBAAwB,CAACwE,SAAS,EAAE7R,SAAS,EAAE;IACpD,IAAI8R,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,CAACD,SAAS,CAAChf,KAAK,EAAE;MAEpBif,SAAS,GAAG;QACVlB,YAAY,EAAE,CAAC;QACfmB,aAAa,EAAE,CAAC,CAAC;QACjBC,UAAU,EAAE,EAAE;QACdnf,KAAK,EAAE,IAAI;QACXrE,KAAK,EAAE,EAAE;QACTsP,MAAM,EAAE,IAAI;QACZmU,UAAU,EAAE,KAAK;QACjBC,OAAO,EAAE,KAAK;QACdC,WAAW,EAAE,KAAK;QAClBC,OAAO,EAAE,KAAK;QACdC,UAAU,EAAE,IAAI;QAChBC,YAAY,EAAE,IAAI;QAClBC,aAAa,EAAE,IAAI;QACnBC,YAAY,EAAE,IAAI;QAClBC,aAAa,EAAE,IAAI;QACnBvB,QAAQ,EAAE,IAAI;QACdwB,eAAe,EAAE,KAAK;QACtB7B,cAAc,EAAE,CAAC;QACjB8B,gBAAgB,EAAE,KAAK;QACvBC,qBAAqB,EAAE,KAAK;QAC5BlO,OAAO,EAAE,KAAK;QACdmO,KAAK,EAAE,IAAI;QACXC,aAAa,EAAE,IAAI;QACnBC,kBAAkB,EAAE,KAAK;QACzBC,QAAQ,EAAE;MACZ,CAAC;IACH,CAAC,MAAM,IAAInB,SAAS,CAAChf,KAAK,IAAImN,SAAS,CAACnN,KAAK,EAAE;MAC7C,MAAMA,KAAK,GAAGgf,SAAS,CAAC7W,MAAM,CAAC+K,QAAQ,CAAC8L,SAAS,CAAChf,KAAK,CAAC;MAExDif,SAAS,GAAG;QACVjf,KAAK,EAAEgf,SAAS,CAAChf,KAAK;QACtBuf,OAAO,EAAEvf,KAAK,CAACogB,QAAQ;QACvBZ,UAAU,EAAE,IAAI;QAChBC,YAAY,EAAE,IAAI;QAClBC,aAAa,EAAE,IAAI;QACnBC,YAAY,EAAE,IAAI;QAClBC,aAAa,EAAE,IAAI;QACnBvB,QAAQ,EAAE,IAAI;QACdwB,eAAe,EAAE,KAAK;QACtB7B,cAAc,EAAE,CAAC;QACjB8B,gBAAgB,EAAE,KAAK;QACvBI,kBAAkB,EAAE,KAAK;QACzBD,aAAa,EAAE,IAAI;QACnBE,QAAQ,EAAE;MACZ,CAAC;MAED,IAAInB,SAAS,CAACqB,cAAc,EAAE;QAE5BpB,SAAS,CAACe,KAAK,GAAG;UAChBM,OAAO,EAAEtB,SAAS,CAACqB,cAAc,CAAC1mB,OAAO;UACzC4mB,GAAG,EAAE;QACP,CAAC;MACH,CAAC,MAAM;QACLtB,SAAS,CAACe,KAAK,GAAG,IAAI;MACxB;MAEA,IAAIhgB,KAAK,EAAE;QAET,MAAMgV,IAAI,GAAG,EAAE;QAEf,IAAIgK,SAAS,CAACzR,SAAS,EAAE;UACvBvN,KAAK,CAACyT,WAAW,CAAEC,GAAG,IAAK;YACzB,IAAIA,GAAG,CAAC8M,MAAM,IAAI9M,GAAG,CAACuC,IAAI,IAAI+I,SAAS,CAACjT,QAAQ,EAAE;cAChDiJ,IAAI,CAAC1d,IAAI,CAACoc,GAAG,CAAC;YAChB;UACF,CAAC,CAAC;QACJ;QAEAtV,MAAM,CAACC,MAAM,CAAC4gB,SAAS,EAAE;UACvBE,UAAU,EAAEnK;QACd,CAAC,CAAC;QAEF,IAAIhV,KAAK,CAAC+K,MAAM,EAAE;UAChB3M,MAAM,CAACC,MAAM,CAAC4gB,SAAS,EAAE;YACvBtjB,KAAK,EAAEqE,KAAK,CAAC+K,MAAM,CAAC1G,EAAE;YACtB4G,MAAM,EAAEpb,mEAAY,CAACmQ,KAAK,CAAC+K,MAAM,CAACjb,KAAK;UACzC,CAAC,CAAC;QACJ,CAAC,MAAM;UACLsO,MAAM,CAACC,MAAM,CAAC4gB,SAAS,EAAE;YACvBtjB,KAAK,EAAE,EAAE;YACTsP,MAAM,EAAE;UACV,CAAC,CAAC;QACJ;QAEA,MAAMwV,IAAI,GAAGzgB,KAAK,CAAC0gB,WAAW,EAAE;QAChC,IAAID,IAAI,EAAE;UACRriB,MAAM,CAACC,MAAM,CAAC4gB,SAAS,EAAE;YACvBc,qBAAqB,EAAE5F,gBAAgB,CAACsG,IAAI,CAAClY,GAAG;UAClD,CAAC,CAAC;QACJ,CAAC,MAAM,IAAI4E,SAAS,CAAC4S,qBAAqB,EAAE;UAC1C3hB,MAAM,CAACC,MAAM,CAAC4gB,SAAS,EAAE;YACvBc,qBAAqB,EAAE;UACzB,CAAC,CAAC;QACJ;QACA3hB,MAAM,CAACC,MAAM,CAAC4gB,SAAS,EAAE;UACvBlB,YAAY,EAAE/d,KAAK,CAAC+d,YAAY,EAAE;UAClCmB,aAAa,EAAElf,KAAK,CAAC2gB,UAAU,EAAE;UACjC9O,OAAO,EAAE7R,KAAK,CAACwU,aAAa;QAC9B,CAAC,CAAC;QAEF,IAAIwK,SAAS,CAAC4B,SAAS,IAAI5gB,KAAK,CAACvM,IAAI,IAAI6mB,sBAAsB,CAAC0E,SAAS,CAACxkB,SAAS,CAAC,EAAE;UACpFykB,SAAS,CAACZ,QAAQ,GAAGW,SAAS,CAAC4B,SAAS;QAC1C;MACF,CAAC,MAAM;QAELxiB,MAAM,CAACC,MAAM,CAAC4gB,SAAS,EAAE;UACvBlB,YAAY,EAAE,CAAC;UACfmB,aAAa,EAAE,CAAC,CAAC;UACjBC,UAAU,EAAE,EAAE;UACdxjB,KAAK,EAAE,EAAE;UACTsP,MAAM,EAAE,IAAI;UACZ8U,qBAAqB,EAAE,KAAK;UAC5BlO,OAAO,EAAE;QACX,CAAC,CAAC;MACJ;IACF,CAAC,MAAM;MAEL,IAAImN,SAAS,CAAC4B,SAAS,IAAIzT,SAAS,CAACnN,KAAK,IAAI,CAACmN,SAAS,CAACkR,QAAQ,IAC7D/D,sBAAsB,CAAC0E,SAAS,CAACxkB,SAAS,CAAC,EAAE;QAC/CykB,SAAS,CAACZ,QAAQ,GAAGW,SAAS,CAAC4B,SAAS;MAC1C;IACF;IAEA,IAAI5B,SAAS,CAACzW,GAAG,EAAE;MACjB,IAAIyW,SAAS,CAACzW,GAAG,CAACsY,QAAQ,EAAE,IAAI1T,SAAS,CAAC0T,QAAQ,EAAE;QAClD5B,SAAS,CAAC4B,QAAQ,GAAG,CAAC1T,SAAS,CAAC0T,QAAQ;MAC1C;MACA,IAAI7B,SAAS,CAACzW,GAAG,CAACuY,QAAQ,EAAE,IAAI3T,SAAS,CAAC2T,QAAQ,EAAE;QAClD7B,SAAS,CAAC6B,QAAQ,GAAG,CAAC3T,SAAS,CAAC2T,QAAQ;MAC1C;MACA,IAAI,CAAC9B,SAAS,CAACzW,GAAG,CAACuY,QAAQ,CAAC,OAAO,CAAC,IAAI3T,SAAS,CAAC4T,cAAc,EAAE;QAChE9B,SAAS,CAAC8B,cAAc,GAAG,CAAC5T,SAAS,CAAC4T,cAAc;MACtD;MACA,IAAI/B,SAAS,CAACzW,GAAG,CAAC0L,QAAQ,EAAE,IAAI9G,SAAS,CAAC8G,QAAQ,EAAE;QAClDgL,SAAS,CAAChL,QAAQ,GAAG,CAAC9G,SAAS,CAAC8G,QAAQ;MAC1C;IACF,CAAC,MAAM;MACL,IAAI9G,SAAS,CAAC0T,QAAQ,EAAE;QACtB5B,SAAS,CAAC4B,QAAQ,GAAG,KAAK;MAC5B;MACA,IAAI1T,SAAS,CAAC2T,QAAQ,EAAE;QACtB7B,SAAS,CAAC6B,QAAQ,GAAG,KAAK;MAC5B;MACA,IAAI,CAAC3T,SAAS,CAAC4T,cAAc,EAAE;QAC7B5T,SAAS,CAAC4T,cAAc,GAAG,IAAI;MACjC;MACA,IAAI5T,SAAS,CAAC8G,QAAQ,EAAE;QACtBgL,SAAS,CAAChL,QAAQ,GAAG,KAAK;MAC5B;IACF;IAEA,IAAI+F,aAAa,CAACgF,SAAS,CAACzW,GAAG,CAAC,IAAI,CAAC4E,SAAS,CAAC6T,WAAW,EAAE;MAC1D/B,SAAS,CAACgC,WAAW,GAAG,CAAC9T,SAAS,CAAC6T,WAAW;IAChD;IAGA,IAAI,CAAChC,SAAS,CAACzR,SAAS,IAAIJ,SAAS,CAACgS,UAAU,IAAIhS,SAAS,CAACgS,UAAU,CAAC5rB,MAAM,GAAG,CAAC,EAAE;MACnF0rB,SAAS,CAACE,UAAU,GAAG,EAAE;IAC3B;IAEA,OAAOF,SAAS;EAClB;EAEAhE,SAAS,CAACjb,KAAK,EAAE;IACf,IAAIA,KAAK,CAACkhB,YAAY,EAAE,IAAI,CAAC,IAAI,CAACpa,KAAK,CAAC8X,KAAK,EAAE;MAC7C;IACF;IAGA,MAAMuC,QAAQ,GAAI,IAAI,CAACra,KAAK,CAACsa,cAAc,IAAI,IAAI,CAACta,KAAK,CAACsa,cAAc,CAACC,UAAU,IAAI,IAAI,CAACva,KAAK,CAAC9G,KAAM;IAIxG,IAAIshB,QAAQ,GAAGthB,KAAK,CAAC4U,cAAc,EAAE,CAAC2M,aAAa,EAAE,CAACC,YAAY,EAAE;IACpE,IAAI,IAAI,CAAC/mB,KAAK,CAACqmB,QAAQ,IAAIK,QAAQ,EAAE;MAEnCG,QAAQ,GAAGA,QAAQ,CAACG,aAAa,CAACxzB,sDAAa,CAAC;MAChD,IAAI,IAAI,CAACwM,KAAK,CAACqmB,QAAQ,EAAE;QACvBQ,QAAQ,GAAGA,QAAQ,CAACI,YAAY,EAAE;MACpC;MAEA,IAAI,CAACtY,QAAQ,CAAC;QAAE0W,gBAAgB,EAAE;MAAK,CAAC,CAAC;IAC3C;IAEA,MAAM6B,QAAQ,GAAGR,QAAQ,GAAG,IAAI,CAACra,KAAK,CAACsa,cAAc,GAAG1nB,SAAS;IACjEsG,KAAK,CAACib,SAAS,CAACqG,QAAQ,CAACxM,KAAK,EAAE,EAAE6M,QAAQ,CAAC,CACxCxlB,IAAI,CAACylB,IAAI,IAAI;MACZ,IAAIA,IAAI,CAACC,IAAI,IAAI,GAAG,EAAE;QAEpBtjB,sEAAyB,CAACA,uEAA0B,CAAC,EAAE,EAAEqjB,IAAI,CAACjjB,MAAM,CAACqB,KAAK,CAAC,CAAC;QAC5E;MACF;MACA,IAAI,IAAI,CAACvF,KAAK,CAACuF,KAAK,IAAI4hB,IAAI,CAAC5hB,KAAK,EAAE;QAClC,IAAI,CAACoJ,QAAQ,CAAC;UAACpJ,KAAK,EAAE4hB,IAAI,CAAC5hB;QAAK,CAAC,CAAC;MACpC;MACA,IAAI,CAAC8G,KAAK,CAACgb,iBAAiB,CAAC,IAAI,CAAChb,KAAK,CAAC9G,KAAK,EAAE4hB,IAAI,CAAC5hB,KAAK,CAAC;MAG1D,IAAI+hB,KAAK,GAAG,EAAE;MACd/hB,KAAK,CAACgiB,cAAc,CAAEC,GAAG,IAAK;QAC5B,IAAIA,GAAG,CAACC,QAAQ,EAAE;UAChB;QACF;QACA,IAAID,GAAG,CAACpe,IAAI,IAAIoe,GAAG,CAACpe,IAAI,CAACse,MAAM,EAAE;UAE/BJ,KAAK,CAACzqB,IAAI,CAAC2qB,GAAG,CAAC1B,GAAG,CAAC;UACnB;QACF;QACA,IAAIvgB,KAAK,CAACkhB,YAAY,EAAE,EAAE;UACxB,IAAI,CAACvG,SAAS,CAACsH,GAAG,CAAC;QACrB;MACF,CAAC,CAAC;MACF,IAAIF,KAAK,CAACxuB,MAAM,GAAG,CAAC,EAAE;QACpByM,KAAK,CAACoiB,eAAe,CAACL,KAAK,EAAE,IAAI,CAAC;MACpC;IACF,CAAC,CAAC,CACDtlB,KAAK,CAACnK,GAAG,IAAI;MACZgD,OAAO,CAAClB,KAAK,CAAC,wBAAwB,EAAE,IAAI,CAACqG,KAAK,CAACuF,KAAK,EAAE1N,GAAG,CAAC;MAC9D,IAAI,CAACwU,KAAK,CAAChS,OAAO,CAACxC,GAAG,CAACwK,OAAO,EAAE,KAAK,CAAC;MACtC,MAAMulB,UAAU,GAAG9H,YAAY,CAACC,wBAAwB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;MAChE6H,UAAU,CAAC1mB,KAAK,GAAG,IAAI,CAACmL,KAAK,CAACgD,IAAI,CAAC/O,aAAa,CAAC1C,QAAQ,CAACshB,SAAS,CAAC;MACpE,IAAI,CAACvQ,QAAQ,CAACiZ,UAAU,CAAC;IAC3B,CAAC,CAAC;EACN;EAEA5H,KAAK,CAAC6H,YAAY,EAAE;IAClB,IAAI,CAACA,YAAY,IAAI,CAAC,IAAI,CAACxb,KAAK,CAACqB,MAAM,CAACoa,aAAa,CAACD,YAAY,CAAC,EAAE;MACnE;IACF;IAEA,MAAME,QAAQ,GAAG,IAAI,CAAC1b,KAAK,CAACqB,MAAM,CAAC+K,QAAQ,CAACoP,YAAY,CAAC;IACzD,IAAIE,QAAQ,IAAIA,QAAQ,CAACtB,YAAY,EAAE,EAAE;MACvCsB,QAAQ,CAAC/H,KAAK,CAAC,KAAK,CAAC,CAClBhe,KAAK,CAAC1I,CAAC,IAAI,CAAwB,CAAC,CAAC,CACrC6b,OAAO,CAAC7b,CAAC,IAAI;QAGZ,IAAI,CAACqV,QAAQ,CAAC;UAAC0W,gBAAgB,EAAE;QAAK,CAAC,CAAC;QACxC0C,QAAQ,CAACjE,MAAM,GAAG7kB,SAAS;QAC3B8oB,QAAQ,CAAChE,qBAAqB,GAAG9kB,SAAS;QAC1C8oB,QAAQ,CAAC/D,MAAM,GAAG/kB,SAAS;QAC3B8oB,QAAQ,CAAC/P,UAAU,GAAG/Y,SAAS;QAC/B8oB,QAAQ,CAAC9P,aAAa,GAAGhZ,SAAS;QAClC8oB,QAAQ,CAAC9D,MAAM,GAAGhlB,SAAS;MAC7B,CAAC,CAAC;IACN;EACF;EAGAwhB,qBAAqB,CAACuH,IAAI,EAAE;IAC1B,IAAIA,IAAI,EAAE;MACRA,IAAI,CAAC5E,gBAAgB,CAAC,QAAQ,EAAE,IAAI,CAACzC,iBAAiB,CAAC;MACvD,IAAI,CAACwC,gBAAgB,GAAG6E,IAAI;MAC5B,IAAI,CAAC7E,gBAAgB,CAACK,SAAS,GAAG,IAAI,CAACL,gBAAgB,CAACM,YAAY,GAAG,IAAI,CAACzjB,KAAK,CAACujB,cAAc;IAClG;EACF;EAGA5C,iBAAiB,CAACzmB,KAAK,EAAE;IACvB,MAAM+tB,GAAG,GAAG/tB,KAAK,CAAC0a,MAAM,CAAC6O,YAAY,GAAGvpB,KAAK,CAAC0a,MAAM,CAAC4O,SAAS,GAAGtpB,KAAK,CAAC0a,MAAM,CAAC8O,YAAY;IAC1F,IAAI,CAAC/U,QAAQ,CAAC;MACZ4U,cAAc,EAAE0E,GAAG;MAEnBxC,kBAAkB,EAAGwC,GAAG,GAAGlJ,oBAAoB,IAAMkJ,GAAG,GAAG,IAAI,CAACjoB,KAAK,CAACujB;IACxE,CAAC,CAAC;IAEF,IAAI,IAAI,CAACvjB,KAAK,CAACqlB,gBAAgB,EAAE;MAC/B;IACF;IAEA,IAAInrB,KAAK,CAAC0a,MAAM,CAAC4O,SAAS,IAAI,CAAC,EAAE;MAC/B,MAAMje,KAAK,GAAG,IAAI,CAAC8G,KAAK,CAACqB,MAAM,CAAC+K,QAAQ,CAAC,IAAI,CAACzY,KAAK,CAACuF,KAAK,CAAC;MAC1D,IAAIA,KAAK,IAAIA,KAAK,CAACkhB,YAAY,EAAE,IAAIlhB,KAAK,CAAC2iB,kBAAkB,EAAE,EAAE;QAC/D,IAAI,CAACvZ,QAAQ,CAAC;UAAC0W,gBAAgB,EAAE;QAAI,CAAC,EAAE/rB,CAAC,IAAI;UAC3CiM,KAAK,CAAC4iB,eAAe,CAAC30B,sDAAa,CAAC,CACjCwO,KAAK,CAACnK,GAAG,IAAI,IAAI,CAACwU,KAAK,CAAChS,OAAO,CAACxC,GAAG,CAACwK,OAAO,EAAE,KAAK,CAAC,CAAC,CACpD8S,OAAO,CAAC7b,CAAC,IAAI,IAAI,CAACqV,QAAQ,CAAC;YAAC0W,gBAAgB,EAAE;UAAK,CAAC,CAAC,CAAC;QACzD,CAAC,CAAC;MACN;IACF;EACF;EAGA3E,cAAc,CAAC0H,GAAG,EAAE;IAClB,IAAIA,GAAG,EAAE;MACPA,GAAG,CAAChF,gBAAgB,CAAC,WAAW,EAAE,IAAI,CAACf,YAAY,CAAC;MACpD+F,GAAG,CAAChF,gBAAgB,CAAC,WAAW,EAAE,IAAI,CAACd,aAAa,CAAC;MACrD8F,GAAG,CAAChF,gBAAgB,CAAC,UAAU,EAAE,IAAI,CAACb,UAAU,CAAC;MACjD6F,GAAG,CAAChF,gBAAgB,CAAC,MAAM,EAAE,IAAI,CAACZ,UAAU,CAAC;MAC7C,IAAI,CAACI,MAAM,GAAGwF,GAAG;IACnB;EACF;EAEAvG,iBAAiB,GAAG;IAClB,IAAI,CAAClT,QAAQ,CAAC;MAAC4U,cAAc,EAAE;IAAC,CAAC,CAAC;IAClC,IAAI,IAAI,CAACJ,gBAAgB,EAAE;MACzB,IAAI,CAACA,gBAAgB,CAACK,SAAS,GAAG,IAAI,CAACL,gBAAgB,CAACM,YAAY;IACtE;EACF;EAEA7C,gBAAgB,CAACtG,IAAI,EAAE;IACrB,IAAIA,IAAI,CAAChK,MAAM,EAAE;MACf,IAAI,CAAC3B,QAAQ,CAAC;QACZzN,KAAK,EAAEoZ,IAAI,CAAChK,MAAM,CAAC1G,EAAE;QACrB4G,MAAM,EAAEpb,mEAAY,CAACklB,IAAI,CAAChK,MAAM,CAACjb,KAAK;MACxC,CAAC,CAAC;IACJ,CAAC,MAAM;MACL,IAAI,CAACsZ,QAAQ,CAAC;QACZzN,KAAK,EAAE,EAAE;QACTsP,MAAM,EAAE;MACV,CAAC,CAAC;IACJ;IAEA,IAAI8J,IAAI,CAACxM,GAAG,EAAE;MACZ,IAAI,CAACa,QAAQ,CAAC;QACZyX,QAAQ,EAAE9L,IAAI,CAACxM,GAAG,CAACsY,QAAQ,EAAE;QAC7BC,QAAQ,EAAE/L,IAAI,CAACxM,GAAG,CAACuY,QAAQ,EAAE;QAC7BC,cAAc,EAAE,CAAChM,IAAI,CAACxM,GAAG,CAACuY,QAAQ,CAAC,OAAO,CAAC;QAC3CG,WAAW,EAAEjH,aAAa,CAACjF,IAAI,CAACxM,GAAG;MACrC,CAAC,CAAC;IACJ;EACF;EAEA6T,oBAAoB,CAACmE,GAAG,EAAE;IAExB,IAAI,CAAC,IAAI,CAACzZ,KAAK,CAAC6X,kBAAkB,EAAE;MAClC;IACF;IAGA,IAAI,CAAC,IAAI,CAACpB,qBAAqB,EAAE;MAC/B,IAAI,CAACA,qBAAqB,GAAGuF,WAAW,CAAC/uB,CAAC,IAAI;QAC5C,IAAI,IAAI,CAACupB,qBAAqB,CAAC/pB,MAAM,IAAI,CAAC,EAAE;UAE1CwvB,aAAa,CAAC,IAAI,CAACxF,qBAAqB,CAAC;UACzC,IAAI,CAACA,qBAAqB,GAAG,IAAI;UACjC;QACF;QAEA,IAAIgD,GAAG,GAAG,CAAC,CAAC;QACZ,OAAO,IAAI,CAACjD,qBAAqB,CAAC/pB,MAAM,GAAG,CAAC,EAAE;UAC5C,MAAMoC,CAAC,GAAG,IAAI,CAAC2nB,qBAAqB,CAAC,CAAC,CAAC;UACvC,IAAI3nB,CAAC,CAACkhB,SAAS,IAAI,IAAI,CAACpc,KAAK,CAACuF,KAAK,EAAE;YAEnC,IAAI,CAACsd,qBAAqB,CAAClG,KAAK,EAAE;YAClC;UACF;UAEA,MAAM9W,GAAG,GAAG,IAAIC,IAAI,EAAE;UACtB,IAAI5K,CAAC,CAACqtB,MAAM,IAAI1iB,GAAG,EAAE;YAEnB,IAAI,CAACgd,qBAAqB,CAAClG,KAAK,EAAE;YAClCmJ,GAAG,GAAG7vB,IAAI,CAAC4K,GAAG,CAACilB,GAAG,EAAE5qB,CAAC,CAAC4qB,GAAG,CAAC;UAC5B,CAAC,MAAM;YACL;UACF;QACF;QAGA,IAAIA,GAAG,IAAI,CAAC,EAAE;UACZ,MAAMvgB,KAAK,GAAG,IAAI,CAAC8G,KAAK,CAACqB,MAAM,CAAC+K,QAAQ,CAAC,IAAI,CAACzY,KAAK,CAACuF,KAAK,CAAC;UAC1D,IAAIA,KAAK,EAAE;YACTA,KAAK,CAACijB,QAAQ,CAAC1C,GAAG,CAAC;UACrB;QACF;MACF,CAAC,EAAEhH,0BAA0B,CAAC;IAChC;IAEA,MAAMjZ,GAAG,GAAG,IAAIC,IAAI,EAAE;IACtB,IAAI,CAAC+c,qBAAqB,CAAChmB,IAAI,CAAC;MAC9Buf,SAAS,EAAE,IAAI,CAACpc,KAAK,CAACuF,KAAK;MAC3BugB,GAAG,EAAEA,GAAG;MACRyC,MAAM,EAAE1iB,GAAG,CAAC4iB,eAAe,CAAC5iB,GAAG,CAAC6iB,eAAe,EAAE,GAAGh2B,mDAAU;IAChE,CAAC,CAAC;EACJ;EAGAkvB,sBAAsB,GAAG;IACvB,IAAI,CAACiB,qBAAqB,GAAG,EAAE;IAC/B,IAAI,IAAI,CAACC,qBAAqB,EAAE;MAC9BwF,aAAa,CAAC,IAAI,CAACxF,qBAAqB,CAAC;MACzC,IAAI,CAACA,qBAAqB,GAAG,IAAI;IACnC;EACF;EAEAjC,iBAAiB,GAAG;IAClB,IAAI,IAAI,CAAC7gB,KAAK,CAACuF,KAAK,EAAE;MACpB,MAAMgV,IAAI,GAAG,EAAE;MACf,MAAMhV,KAAK,GAAG,IAAI,CAAC8G,KAAK,CAACqB,MAAM,CAAC+K,QAAQ,CAAC,IAAI,CAACzY,KAAK,CAACuF,KAAK,CAAC;MAC1DA,KAAK,CAACyT,WAAW,CAAEC,GAAG,IAAK;QACzB,IAAIA,GAAG,CAAC8M,MAAM,IAAI9M,GAAG,CAACuC,IAAI,IAAI,IAAI,CAACnP,KAAK,CAACiF,QAAQ,EAAE;UACjDiJ,IAAI,CAAC1d,IAAI,CAACoc,GAAG,CAAC;QAChB;MACF,CAAC,CAAC;MACF,MAAM/J,QAAQ,GAAG;QAACwV,UAAU,EAAEnK;MAAI,CAAC;MACnC,MAAMyL,IAAI,GAAGzgB,KAAK,CAAC0gB,WAAW,EAAE;MAChC,IAAID,IAAI,EAAE;QACRriB,MAAM,CAACC,MAAM,CAACsL,QAAQ,EAAE;UACtBoW,qBAAqB,EAAE5F,gBAAgB,CAACsG,IAAI,CAAClY,GAAG;QAClD,CAAC,CAAC;MACJ,CAAC,MAAM,IAAI,IAAI,CAAC9N,KAAK,CAACslB,qBAAqB,EAAE;QAC3C3hB,MAAM,CAACC,MAAM,CAACsL,QAAQ,EAAE;UACtBoW,qBAAqB,EAAE;QACzB,CAAC,CAAC;MACJ;MACA,IAAI,CAAC3W,QAAQ,CAACO,QAAQ,CAAC;IACzB;EACF;EAGA4R,mBAAmB,CAAC6H,GAAG,EAAE;IACvB,MAAMpjB,KAAK,GAAG,IAAI,CAAC8G,KAAK,CAACqB,MAAM,CAAC+K,QAAQ,CAAC,IAAI,CAACzY,KAAK,CAACuF,KAAK,CAAC;IAC1D,IAAI,CAACojB,GAAG,EAAE;MAGR,IAAI,CAACha,QAAQ,CAAC;QAAC8V,aAAa,EAAElf,KAAK,CAAC2gB,UAAU;MAAE,CAAC,CAAC;MAClD;IACF;IAEA0C,YAAY,CAAC,IAAI,CAAC7F,aAAa,CAAC;IAChC,IAAI,CAACpU,QAAQ,CAAC;MAAC2U,YAAY,EAAE/d,KAAK,CAAC+d,YAAY,EAAE;MAAE8B,eAAe,EAAE;IAAK,CAAC,EAAE9rB,CAAC,IAAI;MAI/E,IAAIiM,KAAK,CAACsjB,YAAY,CAACF,GAAG,CAAC7C,GAAG,CAAC,EAAE;QAC/B,IAAI,IAAI,CAAC9lB,KAAK,CAACujB,cAAc,GAAGxE,oBAAoB,EAAE;UACpD,IAAI,CAACpQ,QAAQ,CAAC;YAAC8W,kBAAkB,EAAE;UAAI,CAAC,CAAC;QAC3C,CAAC,MAAM;UACL,IAAI,CAAC5D,iBAAiB,EAAE;QAC1B;MACF;IACF,CAAC,CAAC;IAIF,MAAMhgB,MAAM,GAAG0D,KAAK,CAACujB,SAAS,CAACH,GAAG,EAAE,IAAI,CAAC;IACzC,IAAI9mB,MAAM,IAAImH,kEAA0B,IAAI2f,GAAG,CAACI,IAAI,IAAI,IAAI,CAAC1c,KAAK,CAACiF,QAAQ,EAAE;MAC3E,IAAI,CAACqQ,oBAAoB,CAACgH,GAAG,CAAC7C,GAAG,CAAC;IACpC;EACF;EAEA/E,yBAAyB,CAAChZ,KAAK,EAAE;IAC/B,IAAI,CAAC4G,QAAQ,CAAC;MAAC0W,gBAAgB,EAAE;IAAK,CAAC,CAAC;IACxC,IAAItd,KAAK,GAAG,CAAC,EAAE;MAEb,IAAI,CAAC4Z,oBAAoB,CAAC,CAAC,CAAC;IAC9B;EACF;EAEAX,iBAAiB,CAAC3b,IAAI,EAAE;IACtB,QAAQA,IAAI,CAACmH,IAAI;MACf,KAAK,IAAI;QAAE;UACToc,YAAY,CAAC,IAAI,CAAC7F,aAAa,CAAC;UAChC,IAAI,CAACA,aAAa,GAAGiG,UAAU,CAAC1vB,CAAC,IAAI,IAAI,CAACqV,QAAQ,CAAC;YAACyW,eAAe,EAAE;UAAK,CAAC,CAAC,EAAE3yB,uDAAc,GAAG,IAAI,CAAC;UACpG,IAAI,CAAC,IAAI,CAACuN,KAAK,CAAColB,eAAe,EAAE;YAC/B,IAAI,CAACzW,QAAQ,CAAC;cAACyW,eAAe,EAAE;YAAI,CAAC,CAAC;UACxC;UACA;QACF;MACA,KAAK,MAAM;MACX,KAAK,MAAM;QAET,IAAI,CAAC6D,WAAW,EAAE;QAClB;MACF;QACEpuB,OAAO,CAACwK,IAAI,CAAC,yBAAyB,EAAEA,IAAI,CAACmH,IAAI,CAAC;IAAC;EAEzD;EAEAyU,iBAAiB,CAAC4E,OAAO,EAAE;IACzB,IAAI,CAACA,OAAO,EAAE;MACZ;IACF;IAEA,IAAIA,OAAO,CAACqD,KAAK,EAAE;MACjB,IAAI,CAACva,QAAQ,CAAC;QAAEwW,aAAa,EAAEU;MAAQ,CAAC,CAAC;IAC3C,CAAC,MAAM;MACL,IAAI,CAAClX,QAAQ,CAAC;QAAEsW,aAAa,EAAEY;MAAQ,CAAC,CAAC;IAC3C;EACF;EAEA3E,kBAAkB,GAAG;IACnB,IAAI,IAAI,CAAClhB,KAAK,CAACglB,YAAY,IAAI,IAAI,CAAChlB,KAAK,CAACglB,YAAY,CAACvgB,GAAG,EAAE;MAC1DzM,GAAG,CAACC,eAAe,CAAC,IAAI,CAAC+H,KAAK,CAACglB,YAAY,CAACvgB,GAAG,CAAC;IAClD;IACA,IAAI,IAAI,CAACzE,KAAK,CAACklB,YAAY,IAAI,IAAI,CAACllB,KAAK,CAACklB,YAAY,CAACzgB,GAAG,EAAE;MAC1DzM,GAAG,CAACC,eAAe,CAAC,IAAI,CAAC+H,KAAK,CAACklB,YAAY,CAACzgB,GAAG,CAAC;IAClD;IACA,IAAI,CAACkK,QAAQ,CAAC;MAAEsW,aAAa,EAAE,IAAI;MAAED,YAAY,EAAE,IAAI;MAAED,UAAU,EAAE,IAAI;MAAEG,YAAY,EAAE,IAAI;MAAEC,aAAa,EAAE;IAAI,CAAC,CAAC;EACtH;EAEAhE,kBAAkB,CAAC7O,MAAM,EAAE6W,IAAI,EAAE5zB,IAAI,EAAE;IACrC,IAAI+c,MAAM,IAAI,KAAK,EAAE;MACnB,IAAI,CAAC2N,WAAW,CAACjjB,yDAAiB,CAACA,oDAAY,CAACmsB,IAAI,CAAC,EAAE5zB,IAAI,CAAC,CAAC;IAC/D,CAAC,MAAM,IAAI+c,MAAM,IAAI,KAAK,EAAE;MAC1B,MAAM7N,GAAG,GAAG,IAAIzM,GAAG,CAACzC,IAAI,CAACD,GAAG,CAAC;MAC7B,MAAM4O,MAAM,GAAGO,GAAG,CAAC4kB,YAAY;MAC/B,KAAK,IAAI9qB,GAAG,IAAIhJ,IAAI,CAAC+zB,IAAI,EAAE;QACzB,IAAI/zB,IAAI,CAAC+zB,IAAI,CAAC1kB,cAAc,CAACrG,GAAG,CAAC,EAAE;UACjC2F,MAAM,CAACqlB,GAAG,CAAChrB,GAAG,EAAEhJ,IAAI,CAAC+zB,IAAI,CAAC/qB,GAAG,CAAC,CAAC;QACjC;MACF;MACA,CAAC,MAAM,EAAE,KAAK,CAAC,CAACmB,GAAG,CAAEnB,GAAG,IAAK;QAC3B,IAAIhJ,IAAI,CAACgJ,GAAG,CAAC,EAAE;UACb2F,MAAM,CAACqlB,GAAG,CAAChrB,GAAG,EAAEhJ,IAAI,CAACgJ,GAAG,CAAC,CAAC;QAC5B;MACF,CAAC,CAAC;MACF2F,MAAM,CAACqlB,GAAG,CAAC,KAAK,EAAE,IAAI,CAACld,KAAK,CAACiF,QAAQ,CAAC;MACtCpN,MAAM,CAACqlB,GAAG,CAAC,OAAO,EAAE,IAAI,CAACvpB,KAAK,CAACuF,KAAK,CAAC;MACrCd,GAAG,CAAC+kB,MAAM,GAAGtlB,MAAM;MACnBzH,MAAM,CAACgtB,IAAI,CAAChlB,GAAG,EAAE,QAAQ,CAAC;IAC5B,CAAC,MAAM;MACL5J,OAAO,CAACwK,IAAI,CAAC,wBAAwB,EAAEiN,MAAM,CAAC;IAChD;EACF;EAEA8O,kBAAkB,CAACjS,CAAC,EAAE;IACpBA,CAAC,CAACC,cAAc,EAAE;IAClBD,CAAC,CAACua,eAAe,EAAE;IACnB,IAAI,CAACrd,KAAK,CAAC4G,eAAe,CAAC;MAAEmJ,SAAS,EAAE,IAAI,CAACpc,KAAK,CAACuF,KAAK;MAAEkX,CAAC,EAAEtN,CAAC,CAACwa,KAAK;MAAEnN,CAAC,EAAErN,CAAC,CAACya;IAAM,CAAC,CAAC;EACrF;EAEAvI,4BAA4B,CAACnd,MAAM,EAAE2lB,wBAAwB,EAAE;IAC7D,IAAI3lB,MAAM,CAAC4lB,QAAQ,IAAI,MAAM,EAAE;MAC7B5lB,MAAM,CAAC4lB,QAAQ,GAAG,IAAI,CAAC9pB,KAAK,CAACuF,KAAK;MAClCrB,MAAM,CAAC6lB,QAAQ,GAAG,IAAI,CAAC/pB,KAAK,CAACkB,KAAK;IACpC;IACAgD,MAAM,CAACkY,SAAS,GAAG,IAAI,CAACpc,KAAK,CAACuF,KAAK;IACnC,MAAM+W,SAAS,GAAGuN,wBAAwB,IAAI,EAAE;IAChD,MAAMtkB,KAAK,GAAG,IAAI,CAAC8G,KAAK,CAACqB,MAAM,CAAC+K,QAAQ,CAACvU,MAAM,CAACkY,SAAS,CAAC;IAC1D,IAAI7W,KAAK,EAAE;MACT,IAAI,CAACA,KAAK,CAACwU,aAAa,EAAE,EAAE;QAC1BuC,SAAS,CAACzf,IAAI,CAAC,gBAAgB,CAAC;MAClC;MACA,MAAMiR,GAAG,GAAGvI,KAAK,CAAC2T,aAAa,EAAE;MACjC,IAAIpL,GAAG,IAAIA,GAAG,CAAC2L,SAAS,EAAE,EAAE;QAC1B6C,SAAS,CAACzf,IAAI,CAAC,qBAAqB,CAAC;MACvC;IACF;IACA,IAAI,CAACwP,KAAK,CAAC4G,eAAe,CAAC/O,MAAM,EAAEoY,SAAS,CAAC;EAC/C;EAEAgF,uBAAuB,CAAChP,MAAM,EAAE;IAC9B,IAAI,CAACjG,KAAK,CAAC2d,SAAS,CAAC,IAAI,CAAChqB,KAAK,CAACuF,KAAK,EAAE+M,MAAM,CAAC;EAChD;EAEAiP,gBAAgB,CAACpS,CAAC,EAAE;IAClBA,CAAC,CAACC,cAAc,EAAE;IAClB,IAAI,CAAC/C,KAAK,CAACqO,mBAAmB,CAAC,IAAI,CAAC1a,KAAK,CAACuF,KAAK,EAAEzS,gEAAuB,EAAE,IAAI,CAACkN,KAAK,CAACuF,KAAK,CAAC;EAC7F;EAEAgb,YAAY,CAAC0J,KAAK,EAAE;IAClB,MAAM1kB,KAAK,GAAG,IAAI,CAAC8G,KAAK,CAACqB,MAAM,CAAC+K,QAAQ,CAAC,IAAI,CAACzY,KAAK,CAACuF,KAAK,CAAC;IAC1D,IAAIA,KAAK,CAACkhB,YAAY,EAAE,EAAE;MACxB,IAAIwD,KAAK,EAAE;QACT1kB,KAAK,CAAC2kB,aAAa,CAAC,IAAI,CAAC;MAC3B,CAAC,MAAM;QACL3kB,KAAK,CAAC4kB,YAAY,EAAE;MACtB;IACF;EACF;EAGAlK,WAAW,CAAC0I,GAAG,EAAEyB,uBAAuB,EAAEpV,QAAQ,EAAE;IAClD,IAAI5L,IAAI;IACR,IAAI,IAAI,CAACiD,KAAK,CAACuZ,cAAc,EAAE;MAE7B+C,GAAG,GAAG,IAAI,CAACtc,KAAK,CAACuZ,cAAc,CAAC+C,GAAG;MACnCvf,IAAI,GAAG,IAAI,CAACiD,KAAK,CAACuZ,cAAc,CAACxc,IAAI;MACrC,IAAI,CAAC6Y,iBAAiB,EAAE;IAC1B,CAAC,MAAM,IAAI,IAAI,CAACjiB,KAAK,CAACulB,KAAK,EAAE;MAC3B,IAAI,IAAI,CAACvlB,KAAK,CAACulB,KAAK,CAAC8E,OAAO,EAAE;QAC5B,IAAI1B,GAAG,IAAI,IAAI,CAAC3oB,KAAK,CAACwlB,aAAa,EAAE;UAEnC,IAAI,CAACvD,iBAAiB,EAAE;UACxB;QACF;QAEA7Y,IAAI,GAAG;UAAC7N,OAAO,EAAE,GAAG,GAAG,IAAI,CAACyE,KAAK,CAACulB,KAAK,CAACO;QAAG,CAAC;MAC9C,CAAC,MAAM,IAAI,IAAI,CAAC9lB,KAAK,CAACulB,KAAK,CAACM,OAAO,EAAE;QAGnCzc,IAAI,GAAG;UAACmc,KAAK,EAAE,EAAE,GAAG,IAAI,CAACvlB,KAAK,CAACulB,KAAK,CAACO;QAAG,CAAC;QACzC,IAAI,OAAO6C,GAAG,IAAI,QAAQ,EAAE;UAC1BA,GAAG,GAAG3rB,oDAAY,CAAC2rB,GAAG,CAAC;QACzB;QACAA,GAAG,GAAG3rB,qDAAa,CAACA,+DAAuB,CAAC,IAAI,CAACgD,KAAK,CAACulB,KAAK,CAACM,OAAO,CAAC,EAAE8C,GAAG,CAAC;MAC7E;MACA,IAAI,CAAC1G,iBAAiB,EAAE;IAC1B;IACA,IAAI,CAAC5V,KAAK,CAAC4T,WAAW,CAAC0I,GAAG,EAAEyB,uBAAuB,EAAEpV,QAAQ,EAAE5L,IAAI,CAAC;EACtE;EAGA8W,SAAS,CAACsH,GAAG,EAAE;IACb,IAAI,CAACnb,KAAK,CAAC4T,WAAW,CAACuH,GAAG,CAAC3B,OAAO,EAAE5mB,SAAS,EAAEA,SAAS,EAAEuoB,GAAG,CAACpe,IAAI,CAAC,CAChE1H,IAAI,CAACpI,CAAC,IAAI;MAET,MAAMiM,KAAK,GAAG,IAAI,CAAC8G,KAAK,CAACqB,MAAM,CAAC+K,QAAQ,CAAC,IAAI,CAACzY,KAAK,CAACuF,KAAK,CAAC;MAC1DA,KAAK,CAACoiB,eAAe,CAAC,CAACH,GAAG,CAAC1B,GAAG,CAAC,EAAE,IAAI,CAAC;IACxC,CAAC,CAAC;EACN;EAKAzF,kBAAkB,CAAC7mB,IAAI,EAAE;IAEvB,MAAMgxB,uBAAuB,GAAI,IAAI,CAACne,KAAK,CAACqB,MAAM,CAAC+c,cAAc,CAAC,gBAAgB,EAChFh3B,mEAA0B,CAAC,GAAG,IAAI,GAAG,IAAI,GAAI,CAAC;IAEhD,IAAI+F,IAAI,CAACpD,IAAI,GAAGo0B,uBAAuB,EAAE;MAEvC,MAAMxV,QAAQ,GAAG,IAAI,CAAC3I,KAAK,CAACqB,MAAM,CAACuH,kBAAkB,EAAE;MACvD,IAAI,CAACD,QAAQ,EAAE;QACb,IAAI,CAAC3I,KAAK,CAAChS,OAAO,CAAC,IAAI,CAACgS,KAAK,CAACgD,IAAI,CAAC/O,aAAa,CAAC1C,QAAQ,CAAC8sB,sBAAsB,CAAC,CAAC;QAClF;MACF;MACA,MAAMN,uBAAuB,GAAGpV,QAAQ,CAACE,MAAM,CAAC1b,IAAI,CAAC;MACrD,MAAMmvB,GAAG,GAAG3rB,yDAAiB,CAAC,IAAI,EAAE;QAClCvH,IAAI,EAAE+D,IAAI,CAAChE,IAAI;QACf2S,QAAQ,EAAE3O,IAAI,CAACR,IAAI;QACnB5C,IAAI,EAAEoD,IAAI,CAACpD,IAAI;QACfw0B,UAAU,EAAER;MACd,CAAC,CAAC;MAEF,IAAI,CAACnK,WAAW,CAAC0I,GAAG,EAAEyB,uBAAuB,EAAEpV,QAAQ,CAAC;IAC1D,CAAC,MAAM;MAELzb,mEAAY,CAACC,IAAI,CAAC,CACfkI,IAAI,CAAC/E,GAAG,IAAI,IAAI,CAACsjB,WAAW,CAACjjB,yDAAiB,CAAC,IAAI,EAAE;QACpDvH,IAAI,EAAEkH,GAAG,CAAClH,IAAI;QACdF,IAAI,EAAEoH,GAAG,CAAC/C,IAAI;QACduO,QAAQ,EAAExL,GAAG,CAAC3D,IAAI;QAClB5C,IAAI,EAAEoD,IAAI,CAACpD;MACb,CAAC,CAAC,CAAC,CAAC,CACH4L,KAAK,CAACnK,GAAG,IAAI,IAAI,CAACwU,KAAK,CAAChS,OAAO,CAACxC,GAAG,CAACwK,OAAO,EAAE,KAAK,CAAC,CAAC;IACzD;EACF;EAGAmf,gBAAgB,CAAChoB,IAAI,EAAE;IACrB,MAAMqxB,uBAAuB,GAAG,IAAI,CAACxe,KAAK,CAACqB,MAAM,CAAC+c,cAAc,CAAC,mBAAmB,EAAE/2B,mEAA0B,CAAC;IAEjH,IAAI8F,IAAI,CAACpD,IAAI,GAAGy0B,uBAAuB,EAAE;MAEvC,IAAI,CAACxe,KAAK,CAAChS,OAAO,CAAC,IAAI,CAACgS,KAAK,CAACgD,IAAI,CAAC/O,aAAa,CAAC1C,QAAQ,CAACuhB,yBAAyB,EACjF;QAAC/oB,IAAI,EAAEsR,oEAAgB,CAAClO,IAAI,CAACpD,IAAI,CAAC;QAAE00B,KAAK,EAAEpjB,oEAAgB,CAACmjB,uBAAuB;MAAC,CAAC,CAAC,EAAE,KAAK,CAAC;IAClG,CAAC,MAAM;MACL,IAAI,CAAClc,QAAQ,CAAC;QACZoW,UAAU,EAAE;UACVvrB,IAAI,EAAEA,IAAI;UACVR,IAAI,EAAEQ,IAAI,CAACR,IAAI;UACf5C,IAAI,EAAEoD,IAAI,CAACpD,IAAI;UACfZ,IAAI,EAAEgE,IAAI,CAAChE;QACb;MACF,CAAC,CAAC;IACJ;EACF;EAEA2sB,gBAAgB,CAAC5c,KAAK,EAAEugB,GAAG,EAAE;IAC3B,IAAI,CAACzZ,KAAK,CAAC0e,iBAAiB,EAAE;IAC9B,IAAI,CAACpc,QAAQ,CAAC;MACZiV,QAAQ,EAAE;IACZ,CAAC,CAAC;IACF,IAAI,CAACvX,KAAK,CAAC2e,YAAY,CAACzlB,KAAK,EAAEugB,GAAG,CAAC;EACrC;EAGA3F,mBAAmB,CAAC8K,OAAO,EAAEryB,IAAI,EAAE;IACjC,MAAMnD,IAAI,GAAG,IAAI,CAACuK,KAAK,CAACglB,YAAY,CAACvvB,IAAI;IACzC,MAAMG,KAAK,GAAG,IAAI,CAACoK,KAAK,CAACglB,YAAY,CAACpvB,KAAK;IAC3C,MAAMC,MAAM,GAAG,IAAI,CAACmK,KAAK,CAACglB,YAAY,CAACnvB,MAAM;IAC7C,MAAMe,KAAK,GAAG,IAAI,CAACoJ,KAAK,CAACglB,YAAY,CAAC7c,QAAQ;IAG9C,MAAMqiB,uBAAuB,GAAI,IAAI,CAACne,KAAK,CAACqB,MAAM,CAAC+c,cAAc,CAAC,gBAAgB,EAChFh3B,mEAA0B,CAAC,GAAG,IAAI,GAAG,IAAI,GAAI,CAAC;IAEhD,IAAImF,IAAI,CAACxC,IAAI,GAAGo0B,uBAAuB,EAAE;MAEvC,MAAMxV,QAAQ,GAAG,IAAI,CAAC3I,KAAK,CAACqB,MAAM,CAACuH,kBAAkB,EAAE;MACvD,IAAI,CAACD,QAAQ,EAAE;QACb,IAAI,CAAC3I,KAAK,CAAChS,OAAO,CAAC,IAAI,CAACgS,KAAK,CAACgD,IAAI,CAAC/O,aAAa,CAAC1C,QAAQ,CAAC8sB,sBAAsB,CAAC,CAAC;QAClF;MACF;MACA,MAAMN,uBAAuB,GAAGpV,QAAQ,CAACE,MAAM,CAACtc,IAAI,CAAC;MAGrDzB,kEAAW,CAACyB,IAAI,EAAEhF,0DAAiB,EAAEA,0DAAiB,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,CAE/D8N,IAAI,CAACK,MAAM,IAAI/H,mEAAY,CAAC+H,MAAM,CAACnJ,IAAI,CAAC,CAAC,CACzC8I,IAAI,CAAC/E,GAAG,IAAI;QACX,IAAIgsB,GAAG,GAAG3rB,0DAAkB,CAAC,IAAI,EAAE,CAAC,EAAE;UACpCvH,IAAI,EAAEA,IAAI;UACV01B,YAAY,EAAExuB,GAAG,CAAC/C,IAAI;UACtBA,IAAI,EAAE+C,GAAG,CAAC/C,IAAI;UACdhE,KAAK,EAAEA,KAAK;UACZC,MAAM,EAAEA,MAAM;UACdsS,QAAQ,EAAEvR,KAAK;UACfR,IAAI,EAAEwC,IAAI,CAACxC,IAAI;UACfw0B,UAAU,EAAER;QACd,CAAC,CAAC;QACF,IAAIa,OAAO,EAAE;UACXtC,GAAG,GAAG3rB,8DAAsB,CAAC2rB,GAAG,CAAC;UACjCA,GAAG,GAAG3rB,qDAAa,CAAC2rB,GAAG,EAAE3rB,oDAAY,CAACiuB,OAAO,CAAC,CAAC;QACjD;QAEA,IAAI,CAAChL,WAAW,CAAC0I,GAAG,EAAEyB,uBAAuB,EAAEpV,QAAQ,CAAC;MAC1D,CAAC,CAAC,CACDhT,KAAK,CAACnK,GAAG,IAAI,IAAI,CAACwU,KAAK,CAAChS,OAAO,CAACxC,GAAG,EAAE,KAAK,CAAC,CAAC;MAC/C;IACF;IAIAmC,mEAAY,CAACpB,IAAI,CAAC,CACf8I,IAAI,CAAC/E,GAAG,IAAI;MACX,IAAIgsB,GAAG,GAAG3rB,0DAAkB,CAAC,IAAI,EAAE,CAAC,EAAE;QACpCvH,IAAI,EAAEkH,GAAG,CAAClH,IAAI;QACdmE,IAAI,EAAE+C,GAAG,CAAC/C,IAAI;QACdhE,KAAK,EAAEA,KAAK;QACZC,MAAM,EAAEA,MAAM;QACdsS,QAAQ,EAAEvR,KAAK;QACfR,IAAI,EAAEwC,IAAI,CAACxC;MACb,CAAC,CAAC;MACF,IAAI60B,OAAO,EAAE;QACXtC,GAAG,GAAG3rB,8DAAsB,CAAC2rB,GAAG,CAAC;QACjCA,GAAG,GAAG3rB,qDAAa,CAAC2rB,GAAG,EAAE3rB,oDAAY,CAACiuB,OAAO,CAAC,CAAC;MACjD;MACA,IAAI,CAAChL,WAAW,CAAC0I,GAAG,CAAC;IACvB,CAAC,CAAC;EACN;EAGAvI,mBAAmB,CAAC6K,OAAO,EAAEI,SAAS,EAAEC,WAAW,EAAEpnB,MAAM,EAAE;IAC3D,MAAMtO,KAAK,GAAGsO,MAAM,CAACtO,KAAK;IAC1B,MAAMC,MAAM,GAAGqO,MAAM,CAACrO,MAAM;IAG5B,MAAM20B,uBAAuB,GAAI,IAAI,CAACne,KAAK,CAACqB,MAAM,CAAC+c,cAAc,CAAC,gBAAgB,EAChFh3B,mEAA0B,CAAC,GAAG,IAAI,GAAG,IAAI,GAAI,CAAC;IAEhD,MAAM83B,OAAO,GAAG,EAAE;IAClB,IAAIvW,QAAQ;IACZ,IAAKqW,SAAS,CAACj1B,IAAI,GAAGk1B,WAAW,CAACl1B,IAAI,GAAIo0B,uBAAuB,EAAE;MAEjExV,QAAQ,GAAG,IAAI,CAAC3I,KAAK,CAACqB,MAAM,CAACuH,kBAAkB,EAAE;MACjD,IAAI,CAACD,QAAQ,EAAE;QACb,IAAI,CAAC3I,KAAK,CAAChS,OAAO,CAAC,IAAI,CAACgS,KAAK,CAACgD,IAAI,CAAC/O,aAAa,CAAC1C,QAAQ,CAAC8sB,sBAAsB,CAAC,CAAC;QAClF;MACF;MAEAa,OAAO,CAAC,CAAC,CAAC,GAAGF,SAAS,CAACj1B,IAAI,GAAGo0B,uBAAuB,GAAG,KAAK,GAAGxV,QAAQ,CAACE,MAAM,CAACmW,SAAS,CAAC,GAAG,IAAI;MACjGE,OAAO,CAAC,CAAC,CAAC,GAAGD,WAAW,CAACl1B,IAAI,GAAGo0B,uBAAuB,GAAG,KAAK,GAAGxV,QAAQ,CAACE,MAAM,CAACoW,WAAW,CAAC,GAAG,IAAI;IACvG;IAEA,IAAIC,OAAO,CAACzyB,MAAM,IAAI,CAAC,EAAE;MAEvBxB,OAAO,CAACk0B,GAAG,CAAC,CAACxxB,mEAAY,CAACqxB,SAAS,CAAC,EAAErxB,mEAAY,CAACsxB,WAAW,CAAC,CAAC,CAAC,CAC9D5pB,IAAI,CAAC+pB,IAAI,IAAI;QACZ,MAAM,CAACC,GAAG,EAAEC,GAAG,CAAC,GAAGF,IAAI;QACvB,IAAI9C,GAAG,GAAG3rB,0DAAkB,CAAC,IAAI,EAAE,CAAC,EAAE;UACpCvH,IAAI,EAAEi2B,GAAG,CAACj2B,IAAI;UACdmE,IAAI,EAAE8xB,GAAG,CAAC9xB,IAAI;UACdsF,OAAO,EAAEysB,GAAG,CAAC/xB,IAAI;UACjB2H,OAAO,EAAEoqB,GAAG,CAACl2B,IAAI;UACjBG,KAAK,EAAEA,KAAK;UACZC,MAAM,EAAEA,MAAM;UACdmJ,QAAQ,EAAEkF,MAAM,CAAClF,QAAQ;UACzBmJ,QAAQ,EAAEjE,MAAM,CAAClL,IAAI;UACrB5C,IAAI,EAAEi1B,SAAS,CAACj1B;QAClB,CAAC,CAAC;QACF,IAAI60B,OAAO,EAAE;UACXtC,GAAG,GAAG3rB,8DAAsB,CAAC2rB,GAAG,CAAC;UACjCA,GAAG,GAAG3rB,qDAAa,CAAC2rB,GAAG,EAAE3rB,oDAAY,CAACiuB,OAAO,CAAC,CAAC;QACjD;QACA,IAAI,CAAChL,WAAW,CAAC0I,GAAG,CAAC;MACzB,CAAC,CAAC;MACF;IACF;IAEA,MAAMyB,uBAAuB,GAAG9yB,OAAO,CAACk0B,GAAG,CAACD,OAAO,CAAC;IAEpD,MAAMM,OAAO,GAAG,EAAE;IAElBA,OAAO,CAAC,CAAC,CAAC,GAAGN,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,GAAGvxB,mEAAY,CAACqxB,SAAS,CAAC;IAExDQ,OAAO,CAAC,CAAC,CAAC,GAAGN,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,GAAGp0B,kEAAW,CAACm0B,WAAW,EAAE33B,sDAAa,EAAEA,sDAAa,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,CAC/F+N,IAAI,CAACK,MAAM,IAAI/H,mEAAY,CAAC+H,MAAM,CAACnJ,IAAI,CAAC,CAAC;IAE5CizB,OAAO,CAAC,CAAC,CAAC,GAAG10B,kEAAW,CAACm0B,WAAW,EAAEz3B,0DAAiB,EAAEA,0DAAiB,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,CACnF6N,IAAI,CAACK,MAAM,IAAI/H,mEAAY,CAAC+H,MAAM,CAACnJ,IAAI,CAAC,CAAC;IAC5CtB,OAAO,CAACk0B,GAAG,CAACK,OAAO,CAAC,CAEjBnqB,IAAI,CAAC+pB,IAAI,IAAI;MACZ,MAAM,CAACvC,KAAK,EAAEzxB,GAAG,EAAEyH,OAAO,CAAC,GAAGusB,IAAI;MAClC,IAAI9C,GAAG,GAAG3rB,0DAAkB,CAAC,IAAI,EAAE,CAAC,EAAE;QACpCvH,IAAI,EAAEyO,MAAM,CAACzO,IAAI;QACjBmE,IAAI,EAAEsvB,KAAK,GAAGA,KAAK,CAACtvB,IAAI,GAAG,IAAI;QAC/BuxB,YAAY,EAAEjsB,OAAO,CAACtF,IAAI;QAC1BsF,OAAO,EAAEzH,GAAG,GAAGA,GAAG,CAACmC,IAAI,GAAGsF,OAAO,CAACtF,IAAI;QACtC2H,OAAO,EAAE9J,GAAG,GAAGA,GAAG,CAAChC,IAAI,GAAGyJ,OAAO,CAACzJ,IAAI;QACtCG,KAAK,EAAEA,KAAK;QACZC,MAAM,EAAEA,MAAM;QACdmJ,QAAQ,EAAEkF,MAAM,CAAClF,QAAQ;QACzBmJ,QAAQ,EAAEjE,MAAM,CAAClL,IAAI;QACrB5C,IAAI,EAAEi1B,SAAS,CAACj1B,IAAI;QACpBw0B,UAAU,EAAER;MACd,CAAC,CAAC;MACF,IAAIa,OAAO,EAAE;QACXtC,GAAG,GAAG3rB,8DAAsB,CAAC2rB,GAAG,CAAC;QACjCA,GAAG,GAAG3rB,qDAAa,CAAC2rB,GAAG,EAAE3rB,oDAAY,CAACiuB,OAAO,CAAC,CAAC;MACjD;MAEA,IAAI,CAAChL,WAAW,CAAC0I,GAAG,EAAEyB,uBAAuB,EAAEpV,QAAQ,CAAC;IAC1D,CAAC,CAAC,CACDhT,KAAK,CAACnK,GAAG,IAAI,IAAI,CAACwU,KAAK,CAAChS,OAAO,CAACxC,GAAG,CAACwK,OAAO,EAAE,KAAK,CAAC,CAAC;EACzD;EAGAof,wBAAwB,CAACjoB,IAAI,EAAE;IAC7B,MAAMqxB,uBAAuB,GAAG,IAAI,CAACxe,KAAK,CAACqB,MAAM,CAAC+c,cAAc,CAAC,mBAAmB,EAAE/2B,mEAA0B,CAAC;IAEjH,IAAI8F,IAAI,CAAChE,IAAI,CAACE,UAAU,CAAC,QAAQ,CAAC,EAAE;MAClC,IAAI,CAACiZ,QAAQ,CAAC;QAACuW,YAAY,EAAE;UAC3BzgB,GAAG,EAAEzM,GAAG,CAACiB,eAAe,CAACO,IAAI,CAAC;UAC9BZ,IAAI,EAAEY,IAAI;UACV2O,QAAQ,EAAE3O,IAAI,CAACR,IAAI;UACnB5C,IAAI,EAAEoD,IAAI,CAACpD,IAAI;UACfX,IAAI,EAAE+D,IAAI,CAAChE;QACb;MAAC,CAAC,CAAC;MACH;IACF;IAGA2B,kEAAW,CAACqC,IAAI,EAAE7F,sDAAa,EAAEA,sDAAa,EAAEk3B,uBAAuB,EAAE,KAAK,CAAC,CAC5EnpB,IAAI,CAACK,MAAM,IAAI;MACd,IAAI,CAAC4M,QAAQ,CAAC;QAACqW,YAAY,EAAE;UAC3BvgB,GAAG,EAAEzM,GAAG,CAACiB,eAAe,CAAC8I,MAAM,CAACnJ,IAAI,CAAC;UACrCA,IAAI,EAAEmJ,MAAM,CAACnJ,IAAI;UACjBuP,QAAQ,EAAEpG,MAAM,CAAC/I,IAAI;UACrBpD,KAAK,EAAEmM,MAAM,CAACnM,KAAK;UACnBC,MAAM,EAAEkM,MAAM,CAAClM,MAAM;UACrBO,IAAI,EAAE2L,MAAM,CAACnJ,IAAI,CAACxC,IAAI;UACtBX,IAAI,EAAEsM,MAAM,CAACtM;QACf;MAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAACuM,KAAK,CAACnK,GAAG,IAAI;MACd,IAAI,CAACwU,KAAK,CAAChS,OAAO,CAACxC,GAAG,CAACwK,OAAO,EAAE,KAAK,CAAC;IACxC,CAAC,CAAC;EACN;EAGAyf,cAAc,CAACgK,KAAK,EAAE;IACpB,IAAI,CAACA,KAAK,IAAIA,KAAK,CAAChzB,MAAM,IAAI,CAAC,EAAE;MAC/B;IACF;IACA,MAAMU,IAAI,GAAGsyB,KAAK,CAAC,CAAC,CAAC;IACrB,IAAItyB,IAAI,CAAChE,IAAI,IAAIgE,IAAI,CAAChE,IAAI,CAACE,UAAU,CAAC,QAAQ,CAAC,EAAE;MAC/C,IAAI,CAAC+rB,wBAAwB,CAACjoB,IAAI,CAAC;IACrC,CAAC,MAAM;MACL,IAAI,CAACgoB,gBAAgB,CAAChoB,IAAI,CAAC;IAC7B;EACF;EAGA8mB,mBAAmB,CAAC7b,GAAG,EAAEvF,OAAO,EAAEF,QAAQ,EAAE;IAC1CyC,KAAK,CAACgD,GAAG,CAAC,CACP/C,IAAI,CAAC7H,MAAM,IAAIA,MAAM,CAACjB,IAAI,EAAE,CAAC,CAC7B8I,IAAI,CAAC9I,IAAI,IAAI;MAEZ,MAAM4xB,uBAAuB,GAAG,IAAI,CAACne,KAAK,CAACqB,MAAM,CAAC+c,cAAc,CAAC,gBAAgB,EAAEh3B,mEAA0B,CAAC,GAAG,IAAI,GAAG,IAAI;MAC5H,IAAImF,IAAI,CAACxC,IAAI,GAAGo0B,uBAAuB,EAAE;QAEvC,MAAMxV,QAAQ,GAAG,IAAI,CAAC3I,KAAK,CAACqB,MAAM,CAACuH,kBAAkB,EAAE;QACvD,IAAI,CAACD,QAAQ,EAAE;UACb,IAAI,CAAC3I,KAAK,CAAChS,OAAO,CAAC,IAAI,CAACgS,KAAK,CAACgD,IAAI,CAAC/O,aAAa,CAAC1C,QAAQ,CAAC8sB,sBAAsB,CAAC,CAAC;UAClF;QACF;QACA,MAAMN,uBAAuB,GAAGpV,QAAQ,CAACE,MAAM,CAACtc,IAAI,CAAC;QACrD,MAAM+vB,GAAG,GAAG3rB,0DAAkB,CAAC,IAAI,EAAE;UACnCvH,IAAI,EAAEmD,IAAI,CAACpD,IAAI;UACfY,IAAI,EAAEwC,IAAI,CAACxC,IAAI;UACf4I,QAAQ,EAAEA,QAAQ;UAClBE,OAAO,EAAEA,OAAO;UAChB0rB,UAAU,EAAER;QACd,CAAC,CAAC;QAEF,IAAI,CAACnK,WAAW,CAAC0I,GAAG,EAAEyB,uBAAuB,EAAEpV,QAAQ,CAAC;MAC1D,CAAC,MAAM;QAELhb,mEAAY,CAACpB,IAAI,CAAC,CACf8I,IAAI,CAAC/E,GAAG,IAAI;UACX,IAAI,CAACsjB,WAAW,CAACjjB,0DAAkB,CAAC,IAAI,EAAE;YACxCvH,IAAI,EAAEkH,GAAG,CAAClH,IAAI;YACdmE,IAAI,EAAE+C,GAAG,CAAC/C,IAAI;YACdxD,IAAI,EAAEwC,IAAI,CAACxC,IAAI;YACf4I,QAAQ,EAAEA,QAAQ;YAClBE,OAAO,EAAEA;UACX,CAAC,CAAC,CAAC;QACL,CAAC,CAAC;MACN;IACF,CAAC,CAAC,CACD8C,KAAK,CAACnK,GAAG,IAAI;MAAC,IAAI,CAACwU,KAAK,CAAChS,OAAO,CAACxC,GAAG,CAACwK,OAAO,EAAE,KAAK,CAAC;IAAA,CAAC,CAAC;IAAC;EAC5D;EAEAqf,kBAAkB,CAACoE,GAAG,EAAE9Q,QAAQ,EAAE;IAChC,MAAMzP,KAAK,GAAG,IAAI,CAAC8G,KAAK,CAACqB,MAAM,CAAC+K,QAAQ,CAAC,IAAI,CAACzY,KAAK,CAACuF,KAAK,CAAC;IAC1D,MAAMymB,KAAK,GAAGzmB,KAAK,CAAC0mB,WAAW,CAACnG,GAAG,CAAC;IACpC,IAAIkG,KAAK,EAAE;MACTA,KAAK,CAACE,UAAU,GAAG,IAAI;IACzB;IACAlX,QAAQ,CAAClJ,MAAM,EAAE;EACnB;EAMAiW,eAAe,CAAC+D,GAAG,EAAED,OAAO,EAAEsG,QAAQ,EAAEC,UAAU,EAAE;IAClD,IAAI,CAACtG,GAAG,IAAI,CAACD,OAAO,EAAE;MACpB,IAAI,CAAClX,QAAQ,CAAC;QAAC4W,KAAK,EAAE;MAAI,CAAC,CAAC;MAC5B;IACF;IAEAM,OAAO,GAAG,OAAOA,OAAO,IAAI,QAAQ,GAAG7oB,mDAAW,CAAC6oB,OAAO,CAAC,GAAGA,OAAO;IACrE,IAAI7oB,sDAAc,CAAC6oB,OAAO,CAAC,EAAE;MAC3BA,OAAO,GAAG7oB,2DAAmB,CAAC6oB,OAAO,EAAExxB,4DAAmB,CAAC;IAC7D,CAAC,MAAM;MAELwxB,OAAO,GAAG7oB,qDAAa,CAACA,mDAAW,CAAC,SAAS,CAAC,EAC5CA,uDAAe,CAAC,IAAI,CAACqP,KAAK,CAACgD,IAAI,CAAC/O,aAAa,CAAC1C,QAAQ,CAACwhB,eAAe,CAAC,EAAE,IAAI,CAAC,CAAC;IACnF;IAEA,IAAI,CAACzQ,QAAQ,CAAC;MACZ4W,KAAK,EAAE;QACLM,OAAO,EAAE7oB,oDAAY,CAACovB,UAAU,EAAED,QAAQ,EAAEtG,OAAO,CAAC;QACpDC,GAAG,EAAEA;MACP;IACF,CAAC,CAAC;IACF,IAAI,CAACzZ,KAAK,CAACqgB,sBAAsB,EAAE;EACrC;EAIA1K,iBAAiB,CAAC8D,GAAG,EAAED,OAAO,EAAE;IAC9B,IAAI,CAACC,GAAG,IAAI,CAACD,OAAO,EAAE;MACpB,IAAI,CAAClX,QAAQ,CAAC;QAAC4W,KAAK,EAAE;MAAI,CAAC,CAAC;MAC5B;IACF;IAEAM,OAAO,GAAG,OAAOA,OAAO,IAAI,QAAQ,GAAG7oB,mDAAW,CAAC6oB,OAAO,CAAC,GAAGA,OAAO;IACrE,MAAM8G,QAAQ,GAAG3vB,yDAAiB,CAAC6oB,OAAO,CAAC;IAC3C,IAAI7oB,sDAAc,CAAC6oB,OAAO,CAAC,EAAE;MAC3BA,OAAO,GAAG7oB,2DAAmB,CAAC6oB,OAAO,EAAEtxB,4DAAmB,CAAC;IAC7D,CAAC,MAAM;MAELsxB,OAAO,GAAG7oB,qDAAa,CAACA,mDAAW,CAAC,SAAS,CAAC,EAC5CA,uDAAe,CAAC,IAAI,CAACqP,KAAK,CAACgD,IAAI,CAAC/O,aAAa,CAAC1C,QAAQ,CAACwhB,eAAe,CAAC,EAAE,IAAI,CAAC,CAAC;IACnF;IAEA,IAAI,CAACzQ,QAAQ,CAAC;MACZ4W,KAAK,EAAE;QACLM,OAAO,EAAE7oB,oDAAY,CAAC,IAAI,CAACqP,KAAK,CAACgD,IAAI,CAAC/O,aAAa,CAAC1C,QAAQ,CAACyhB,eAAe,CAAC,EAAE,IAAI,EAAEwG,OAAO,CAAC;QAC7FC,GAAG,EAAEA,GAAG;QACRuE,OAAO,EAAE;MACX,CAAC;MACD7E,aAAa,EAAEmH;IACjB,CAAC,CAAC;IACF,IAAI,CAACtgB,KAAK,CAACqgB,sBAAsB,EAAE;EACrC;EAGAzK,iBAAiB,GAAG;IAClB,IAAI,CAACtT,QAAQ,CAAC;MAAC4W,KAAK,EAAE,IAAI;MAAEC,aAAa,EAAE;IAAI,CAAC,CAAC;IACjD,IAAI,CAACnZ,KAAK,CAACqgB,sBAAsB,EAAE;EACrC;EAEAxK,gBAAgB,CAAC2K,UAAU,EAAE;IAC3B,MAAMv3B,GAAG,GAAG,IAAI,CAACotB,qBAAqB,CAACmK,UAAU,CAAC;IAClD,IAAIv3B,GAAG,IAAIA,GAAG,CAACw3B,OAAO,EAAE;MACtBx3B,GAAG,CAACw3B,OAAO,CAACC,cAAc,CAAC;QAACC,KAAK,EAAE,QAAQ;QAAEC,QAAQ,EAAE;MAAQ,CAAC,CAAC;MACjE33B,GAAG,CAACw3B,OAAO,CAACI,SAAS,CAACC,GAAG,CAAC,OAAO,CAAC;MAClCnE,UAAU,CAAC1vB,CAAC,IAAI;QAAChE,GAAG,CAACw3B,OAAO,CAACI,SAAS,CAACE,MAAM,CAAC,OAAO,CAAC;MAAA,CAAC,EAAG,IAAI,CAAC;IACjE,CAAC,MAAM;MACLvyB,OAAO,CAAClB,KAAK,CAAC,wBAAwB,EAAEkzB,UAAU,CAAC;IACrD;EACF;EAEAzK,aAAa,GAAG;IACd,OAAO,IAAI,CAACpiB,KAAK,CAAComB,QAAQ,IAAI,CAAC,IAAI,CAACpmB,KAAK,CAACwmB,WAAW,IAAI,CAAC,IAAI,CAACna,KAAK,CAACuZ,cAAc,IAAI,CAAC,IAAI,CAAC5lB,KAAK,CAACslB,qBAAqB;EAC1H;EAEA/C,UAAU,CAACpT,CAAC,EAAE;IACZA,CAAC,CAACC,cAAc,EAAE;IAClBD,CAAC,CAACua,eAAe,EAAE;EACrB;EAEArH,YAAY,CAAClT,CAAC,EAAE;IACdA,CAAC,CAACC,cAAc,EAAE;IAClBD,CAAC,CAACua,eAAe,EAAE;IACnB,IAAI,CAAC/G,WAAW,EAAE;IAClB,IAAIxT,CAAC,CAACke,YAAY,CAAC/yB,KAAK,IAAI6U,CAAC,CAACke,YAAY,CAAC/yB,KAAK,CAACxB,MAAM,GAAG,CAAC,EAAE;MAC3D,IAAI,CAAC6V,QAAQ,CAAC;QAAC+W,QAAQ,EAAE;MAAI,CAAC,CAAC;IACjC;EACF;EAEApD,aAAa,CAACnT,CAAC,EAAE;IACfA,CAAC,CAACC,cAAc,EAAE;IAClBD,CAAC,CAACua,eAAe,EAAE;IACnB,IAAI,CAAC/G,WAAW,EAAE;IAClB,IAAI,IAAI,CAACA,WAAW,IAAI,CAAC,EAAE;MACzB,IAAI,CAAChU,QAAQ,CAAC;QAAC+W,QAAQ,EAAE;MAAK,CAAC,CAAC;IAClC;EACF;EAEAlD,UAAU,CAACrT,CAAC,EAAE;IACZA,CAAC,CAACC,cAAc,EAAE;IAClBD,CAAC,CAACua,eAAe,EAAE;IACnB,IAAI,CAAC/a,QAAQ,CAAC;MAAC+W,QAAQ,EAAE;IAAK,CAAC,CAAC;IAChC,IAAI,IAAI,CAACtD,aAAa,EAAE,IAAIjT,CAAC,CAACke,YAAY,CAACvB,KAAK,IAAI3c,CAAC,CAACke,YAAY,CAACvB,KAAK,CAAChzB,MAAM,GAAG,CAAC,EAAE;MACnF,IAAI,CAACgpB,cAAc,CAAC3S,CAAC,CAACke,YAAY,CAACvB,KAAK,CAAC;MACzC3c,CAAC,CAACke,YAAY,CAACC,SAAS,EAAE;MAC1B,IAAI,CAAC3K,WAAW,GAAG,CAAC;IACtB;EACF;EAEA9V,MAAM,GAAG;IACP,MAAM;MAACvM;IAAa,CAAC,GAAG,IAAI,CAAC+L,KAAK,CAACgD,IAAI;IAEvC,IAAIke,SAAS;IACb,IAAI,IAAI,CAAClhB,KAAK,CAACmhB,QAAQ,EAAE;MACvBD,SAAS,GAAG,IAAI;IAClB,CAAC,MAAM,IAAI,CAAC,IAAI,CAACvtB,KAAK,CAACuF,KAAK,EAAE;MAC5BgoB,SAAS,GACP,2DAAC,uDAAQ;QACP,aAAa,EAAE,IAAI,CAAClhB,KAAK,CAACwD,aAAc;QACxC,aAAa,EAAE,IAAI,CAACxD,KAAK,CAACyD;MAAc,EAC3C;IACH,CAAC,MAAM;MACL,IAAI2d,UAAU;MACd,IAAI,IAAI,CAACztB,KAAK,CAACglB,YAAY,EAAE;QAE3ByI,UAAU,GACR,2DAAC,kEAAY;UACX,OAAO,EAAE,IAAI,CAACztB,KAAK,CAACglB,YAAa;UACjC,MAAM,EAAE,IAAI,CAAC3Y,KAAK,CAACqB,MAAO;UAC1B,KAAK,EAAE,IAAI,CAAC1N,KAAK,CAACulB,KAAM;UACxB,aAAa,EAAE,IAAI,CAACtD,iBAAkB;UACtC,OAAO,EAAE,IAAI,CAACf,kBAAmB;UACjC,aAAa,EAAE,IAAI,CAACf;QAAoB,EAC3C;MACH,CAAC,MAAM,IAAI,IAAI,CAACngB,KAAK,CAACklB,YAAY,EAAE;QAElCuI,UAAU,GACR,2DAAC,mEAAY;UACX,OAAO,EAAE,IAAI,CAACztB,KAAK,CAACklB,YAAa;UACjC,MAAM,EAAE,IAAI,CAAC7Y,KAAK,CAACqB,MAAO;UAC1B,KAAK,EAAE,IAAI,CAAC1N,KAAK,CAACulB,KAAM;UACxB,OAAO,EAAE,IAAI,CAAClZ,KAAK,CAAChS,OAAQ;UAC5B,aAAa,EAAE,IAAI,CAAC4nB,iBAAkB;UACtC,OAAO,EAAE,IAAI,CAACf,kBAAmB;UACjC,aAAa,EAAE,IAAI,CAACd;QAAoB,EAC3C;MACH,CAAC,MAAM,IAAI,IAAI,CAACpgB,KAAK,CAACilB,aAAa,EAAE;QAEnCwI,UAAU,GACR,2DAAC,kEAAY;UACX,OAAO,EAAE,IAAI,CAACztB,KAAK,CAACilB,aAAc;UAClC,OAAO,EAAE,IAAI,CAAC/D;QAAmB,EACpC;MACH,CAAC,MAAM,IAAI,IAAI,CAAClhB,KAAK,CAACmlB,aAAa,EAAE;QAEnCsI,UAAU,GACR,2DAAC,mEAAY;UACX,OAAO,EAAE,IAAI,CAACztB,KAAK,CAACmlB,aAAc;UAClC,MAAM,EAAE,IAAI,CAAC9Y,KAAK,CAACqB,MAAO;UAC1B,OAAO,EAAE,IAAI,CAACrB,KAAK,CAAChS,OAAQ;UAC5B,OAAO,EAAE,IAAI,CAAC6mB;QAAmB,EACpC;MACH,CAAC,MAAM,IAAI,IAAI,CAAClhB,KAAK,CAAC+kB,UAAU,EAAE;QAEhC0I,UAAU,GACR,2DAAC,gEAAU;UACT,OAAO,EAAE,IAAI,CAACztB,KAAK,CAAC+kB,UAAW;UAC/B,MAAM,EAAE,IAAI,CAAC1Y,KAAK,CAACqB,MAAO;UAC1B,KAAK,EAAE,IAAI,CAAC1N,KAAK,CAACulB,KAAM;UACxB,aAAa,EAAE,IAAI,CAACtD,iBAAkB;UACtC,OAAO,EAAE,IAAI,CAACf,kBAAmB;UACjC,aAAa,EAAE,IAAI,CAACb;QAAmB,EAC1C;MACH,CAAC,MAAM,IAAI,IAAI,CAACrgB,KAAK,CAAC4jB,QAAQ,EAAE;QAC9B6J,UAAU,GACR,2DAAC,+DAAS;UACR,KAAK,EAAE,IAAI,CAACztB,KAAK,CAACuF,KAAM;UACxB,GAAG,EAAE,IAAI,CAAC8G,KAAK,CAACwX,OAAQ;UACxB,SAAS,EAAE,IAAI,CAACxX,KAAK,CAACtM,SAAU;UAChC,aAAa,EAAE,IAAI,CAACsM,KAAK,CAACqhB,aAAc;UACxC,MAAM,EAAE,IAAI,CAACrhB,KAAK,CAACqB,MAAO;UAC1B,KAAK,EAAE,IAAI,CAAC1N,KAAK,CAACkB,KAAM;UACxB,MAAM,EAAE,IAAI,CAAClB,KAAK,CAACwQ,MAAM,IAAI,IAAK;UAElC,OAAO,EAAE,IAAI,CAACnE,KAAK,CAAChS,OAAQ;UAC5B,QAAQ,EAAE,IAAI,CAAC8nB,gBAAiB;UAChC,QAAQ,EAAE,IAAI,CAAC9V,KAAK,CAACshB,YAAa;UAClC,WAAW,EAAE,IAAI,CAACthB,KAAK,CAACuhB,eAAgB;UACxC,cAAc,EAAE,IAAI,CAACvhB,KAAK,CAACwhB,kBAAmB;UAC9C,YAAY,EAAE,IAAI,CAACxhB,KAAK,CAACyhB;QAAiB,EAC7C;MACH,CAAC,MAAM;QACL,MAAMvoB,KAAK,GAAG,IAAI,CAAC8G,KAAK,CAACqB,MAAM,CAAC+K,QAAQ,CAAC,IAAI,CAACzY,KAAK,CAACuF,KAAK,CAAC;QAC1D,MAAMwoB,SAAS,GAAGxoB,KAAK,CAACwU,aAAa,EAAE;QACvC,MAAM5C,UAAU,GAAG5R,KAAK,CAACuU,WAAW,EAAE,IAAI,CAACiU,SAAS;QACpD,MAAMC,WAAW,GAAG,EAAE;QACtB,IAAIzoB,KAAK,CAAC6T,OAAO,EAAE;UACjB,IAAI7T,KAAK,CAAC6T,OAAO,CAAC6U,QAAQ,EAAE;YAC1BD,WAAW,CAACnxB,IAAI,CAAC;cAACqxB,IAAI,EAAE,UAAU;cAAE3iB,KAAK,EAAE;YAAW,CAAC,CAAC;UAC1D;UACA,IAAIhG,KAAK,CAAC6T,OAAO,CAAC+U,KAAK,EAAE;YACvBH,WAAW,CAACnxB,IAAI,CAAC;cAACqxB,IAAI,EAAE,OAAO;cAAE3iB,KAAK,EAAE;YAAW,CAAC,CAAC;UACvD;UACA,IAAIhG,KAAK,CAAC6T,OAAO,CAACgV,MAAM,EAAE;YACxBJ,WAAW,CAACnxB,IAAI,CAAC;cAACqxB,IAAI,EAAE,WAAW;cAAE3iB,KAAK,EAAE;YAAW,CAAC,CAAC;UAC3D;QACF;QAEA,MAAM8iB,YAAY,GAAG,EAAE;QACvB,IAAIC,YAAY,GAAG,IAAI;QACvB,IAAIC,QAAQ,GAAG,IAAI;QACnB,IAAIC,YAAY,GAAG,IAAI;QACvBjpB,KAAK,CAAC3H,QAAQ,CAAC,CAAC+qB,GAAG,EAAE8F,IAAI,EAAEC,IAAI,EAAEj0B,CAAC,KAAK;UACrC,IAAIk0B,QAAQ,GAAGD,IAAI,GAAIA,IAAI,CAAC3F,IAAI,IAAI,MAAM,GAAI,IAAI;UAElD,IAAI6F,QAAQ,GAAG,QAAQ;UACvB,IAAIC,QAAQ,GAAGlG,GAAG,CAACI,IAAI,IAAI,MAAM;UACjC,IAAI8F,QAAQ,IAAIP,YAAY,EAAE;YAC5B,IAAIO,QAAQ,IAAIF,QAAQ,EAAE;cACxBC,QAAQ,GAAG,QAAQ;YACrB,CAAC,MAAM;cACLA,QAAQ,GAAG,MAAM;YACnB;UACF,CAAC,MAAM,IAAIC,QAAQ,IAAIF,QAAQ,EAAE;YAC/BC,QAAQ,GAAG,OAAO;UACpB;UACAN,YAAY,GAAGO,QAAQ;UAEvB,MAAMC,OAAO,GAAG,EAAED,QAAQ,IAAI,IAAI,CAACxiB,KAAK,CAACiF,QAAQ,CAAC;UAClD,MAAMyd,cAAc,GAAGxpB,KAAK,CAACujB,SAAS,CAACH,GAAG,EAAE,IAAI,CAAC;UAEjD,IAAImB,QAAQ,GAAG+E,QAAQ;YAAE9E,QAAQ;YAAEzO,UAAU;UAC7C,MAAME,IAAI,GAAGjW,KAAK,CAACypB,QAAQ,CAACH,QAAQ,CAAC;UACrC,IAAIrT,IAAI,IAAIA,IAAI,CAAClL,MAAM,EAAE;YACvByZ,QAAQ,GAAGvO,IAAI,CAAClL,MAAM,CAAC1G,EAAE;YACzB0R,UAAU,GAAGlmB,mEAAY,CAAComB,IAAI,CAAClL,MAAM,CAACjb,KAAK,CAAC;UAC9C;UACAm5B,YAAY,GAAGrX,UAAU,GAAG,gBAAgB,GAAG,UAAU;UAGzD,MAAM7hB,GAAG,GAAG,IAAI,CAACotB,qBAAqB,CAACiG,GAAG,CAAC7C,GAAG,CAAC;UAC/C,IAAI+G,UAAU,GAAGlE,GAAG,CAACvf,IAAI,GAAG6lB,QAAQ,CAACtG,GAAG,CAACvf,IAAI,CAACmc,KAAK,CAAC,GAAG,IAAI;UAC3D,IAAI,CAACsH,UAAU,IAAIqC,KAAK,CAACrC,UAAU,CAAC,EAAE;YACpCA,UAAU,GAAG,IAAI;UACnB;UAEA,IAAIlE,GAAG,CAACwG,EAAE,EAAE;YAEVd,YAAY,CAACxxB,IAAI,CACf,2DAAC,kEAAW;cACV,OAAO,EAAE,IAAK;cACd,GAAG,EAAE8rB,GAAG,CAAC7C;YAAI,EAAG,CACjB;UACL,CAAC,MAAM;YACL,MAAMsJ,QAAQ,GAAG,IAAItpB,IAAI,CAAC6iB,GAAG,CAAC0G,EAAE,CAAC;YAEjC,IAAI,CAACd,QAAQ,IAAIA,QAAQ,CAACe,YAAY,EAAE,IAAIF,QAAQ,CAACE,YAAY,EAAE,EAAE;cACnEjB,YAAY,CAACxxB,IAAI,CACf,2DAAC,kEAAW;gBACV,IAAI,EAAE6J,sEAAkB,CAACiiB,GAAG,CAAC0G,EAAE,CAAE;gBACjC,MAAM,EAAE,IAAI,CAAChjB,KAAK,CAACgD,IAAI,CAAC5J,MAAO;gBAC/B,GAAG,EAAE,OAAO,GAAGkjB,GAAG,CAAC7C;cAAI,EAAG,CAC7B;cACDyI,QAAQ,GAAGa,QAAQ;YACrB;YACAf,YAAY,CAACxxB,IAAI,CACf,2DAAC,iEAAW;cACV,MAAM,EAAE,IAAI,CAACwP,KAAK,CAACqB,MAAO;cAC1B,OAAO,EAAEib,GAAG,CAAC9C,OAAQ;cACrB,QAAQ,EAAE8C,GAAG,CAACvf,IAAI,IAAIuf,GAAG,CAACvf,IAAI,CAAC3T,IAAK;cACpC,UAAU,EAAEo3B,UAAW;cACvB,MAAM,EAAElE,GAAG,CAACvf,IAAI,IAAI,CAACuf,GAAG,CAACvf,IAAI,CAACse,MAAM,IAAIiB,GAAG,CAACvf,IAAI,CAAC7N,OAAQ;cACzD,SAAS,EAAEotB,GAAG,CAAC0G,EAAG;cAClB,QAAQ,EAAEP,OAAQ;cAClB,GAAG,EAAEnG,GAAG,CAAC7C,GAAI;cACb,OAAO,EAAE3O,UAAW;cACpB,MAAM,EAAE,IAAI,CAACnX,KAAK,CAACoX,OAAQ;cAC3B,QAAQ,EAAE0S,QAAS;cACnB,QAAQ,EAAEC,QAAS;cACnB,UAAU,EAAEzO,UAAW;cACvB,QAAQ,EAAEsT,QAAS;cACnB,QAAQ,EAAEG,cAAe;cACzB,QAAQ,EAAEpG,GAAG,CAAC4G,SAAU;cACxB,YAAY,EAAE,IAAI,CAACvvB,KAAK,CAAComB,QAAS;cAClC,aAAa,EAAE,IAAI,CAAC/Z,KAAK,CAAC7L,aAAc;cACxC,eAAe,EAAE,IAAI,CAAC6gB,4BAA6B;cACnD,aAAa,EAAE,IAAI,CAACJ,iBAAkB;cACtC,cAAc,EAAE,IAAI,CAACE,kBAAmB;cACxC,cAAc,EAAE,IAAI,CAACO,kBAAmB;cACxC,SAAS,EAAE,IAAI,CAACK,eAAgB;cAChC,WAAW,EAAE,IAAI,CAACC,iBAAkB;cACpC,YAAY,EAAE,IAAI,CAACE,gBAAiB;cACpC,OAAO,EAAE,IAAI,CAAC7V,KAAK,CAAChS,OAAQ;cAC5B,GAAG,EAAE/E,GAAI;cACT,GAAG,EAAEqzB,GAAG,CAAC7C;YAAI,EAAG,CACnB;UACH;QACF,CAAC,CAAC;QAEF,IAAI0J,QAAQ,GAAG,IAAI;QACnB,IAAIzB,SAAS,EAAE;UACbyB,QAAQ,GAAGlvB,aAAa,CAAC1C,QAAQ,CAACwZ,OAAO,CAAC;QAC5C,CAAC,MAAM;UACL,MAAMqY,IAAI,GAAG,IAAI,CAACpjB,KAAK,CAACqB,MAAM,CAACC,UAAU,EAAE,CAAC+hB,UAAU,CAAC,IAAI,CAAC1vB,KAAK,CAACuF,KAAK,CAAC;UACxE,IAAIkqB,IAAI,IAAIzmB,6DAAqB,CAACymB,IAAI,CAAClqB,KAAK,CAAC,EAAE;YAC7C,IAAIkqB,IAAI,CAAC1J,MAAM,EAAE;cACfyJ,QAAQ,GAAGlvB,aAAa,CAAC1C,QAAQ,CAACohB,UAAU,CAAC;YAC/C,CAAC,MAAM,IAAIyQ,IAAI,CAACG,IAAI,EAAE;cACpBJ,QAAQ,GAAGlvB,aAAa,CAAC1C,QAAQ,CAACqhB,SAAS,CAAC,GAAG,IAAI,GACjDzZ,mEAAe,CAACiqB,IAAI,CAACG,IAAI,CAACC,IAAI,EAAE,IAAI,CAACxjB,KAAK,CAACgD,IAAI,CAAC5J,MAAM,CAAC;YAE3D;UACF;QACF;QACA,MAAM+K,MAAM,GAAG,IAAI,CAACxQ,KAAK,CAACwQ,MAAM,IAAI,IAAI;QACxC,MAAMuV,MAAM,GAAG,IAAI,CAAC/lB,KAAK,CAAC8kB,OAAO,GAAG,IAAI,GACtC,IAAI,CAACzY,KAAK,CAAC0Z,MAAM,GAAG,QAAQ,IAAI,IAAI,CAAC/lB,KAAK,CAAColB,eAAe,GAAG,SAAS,GAAG,EAAE,CAAC,GAAG,SAAS;QAE1F,MAAM0K,UAAU,GAAG,aAAa,IAAI,IAAI,CAAC9vB,KAAK,CAAC8kB,OAAO,GAAG,UAAU,GAAG,EAAE,CAAC;QAEzE,IAAIiL,iBAAiB,GACnB,0HACE;UAAK,EAAE,EAAC;QAAoB,GAC1B;UAAQ,SAAS,EAAE,eAAe,IAAI,IAAI,CAAC/vB,KAAK,CAACylB,kBAAkB,GAAG,EAAE,GAAG,SAAS,CAAE;UACpF,OAAO,EAAE,IAAI,CAAC5D;QAAkB,GAChC;UAAG,SAAS,EAAC;QAAgB,GAAC,gBAAc,CAAI,CACzC,EACT;UAAK,EAAE,EAAC,gBAAgB;UAAC,GAAG,EAAE,IAAI,CAACpB;QAAsB,GACvD;UAAI,EAAE,EAAC,UAAU;UAAC,SAAS,EAAE+N;QAAa,GACvCH,YAAY,CACV,CACD,EACL,CAAC,IAAI,CAACruB,KAAK,CAACqmB,QAAQ,GACrB;UAAK,EAAE,EAAC;QAAuB,GAC5B,IAAI,CAACrmB,KAAK,CAACsmB,cAAc,GAC1B;UAAK,EAAE,EAAC;QAAiB,GACvB,2DAAC,wDAAgB;UAAC,EAAE,yBAAwB;UAAC,cAAc;YAAA;YAAA;UAAA;QAAwB,EAClB,CAC7D,GACJ,IAAI,CACF,GACJ,IAAI,CACF,EACL,IAAI,CAACtmB,KAAK,CAACslB,qBAAqB,IAAI,CAAC,IAAI,CAACtlB,KAAK,CAACwmB,WAAW,GAC1D;UAAK,EAAE,EAAC;QAA8B,GACpC;UAAG,SAAS,EAAC;QAA0B,GAAC,OAAK,CAAI,KAAC,6DAAC,wDAAgB;UACjE,EAAE,4BAA2B;UAAC,cAAc;YAAA;YAAA;UAAA;QAAgC,EACZ,KAAC;UAAG,IAAI,EAAC,GAAG;UAC1E,OAAO,EAAE,IAAI,CAACjF;QAAiB,GAAC,2DAAC,wDAAgB;UAAC,EAAE,0BAAyB;UAC7E,cAAc;YAAA;YAAA;UAAA;QAAS,EAA2D,CAAI,KAC5F,CAAM,GAAG,IAAI,EACd,IAAI,CAACvhB,KAAK,CAACwmB,WAAW,GACrB,2DAAC,gEAAU;UAAC,QAAQ,EAAE,IAAI,CAAClF;QAAwB,EAAG,GAEtD,2DAAC,kEAAW;UACV,MAAM,EAAE,IAAI,CAACjV,KAAK,CAACqB,MAAO;UAC1B,SAAS,EAAE,IAAI,CAAC1N,KAAK,CAACuF,KAAM;UAC5B,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC8G,KAAK,CAACuZ,cAAe;UACrC,QAAQ,EAAE,CAAC,IAAI,CAAC5lB,KAAK,CAAComB,QAAQ,IAAI,IAAI,CAACpmB,KAAK,CAAC8kB,OAAQ;UACrD,KAAK,EAAE,IAAI,CAAC9kB,KAAK,CAACulB,KAAM;UACxB,WAAW,EAAE,IAAI,CAACvlB,KAAK,CAACwlB,aAAc;UACtC,UAAU,EAAE,IAAI,CAACjF,YAAa;UAC9B,mBAAmB,EAAE,IAAI,CAACA,YAAa;UACvC,aAAa,EAAE,IAAI,CAACN,WAAY;UAChC,YAAY,EAAE,IAAI,CAAC5T,KAAK,CAACuZ,cAAc,GAAG,IAAI,GAAG,IAAI,CAACpE,gBAAiB;UACvE,aAAa,EAAE,IAAI,CAACnV,KAAK,CAACuZ,cAAc,GAAG,IAAI,GAAG,IAAI,CAACnE,wBAAyB;UAChF,aAAa,EAAE,IAAI,CAACpV,KAAK,CAACuZ,cAAc,GAAG,IAAI,GAAG,IAAI,CAACtF,mBAAoB;UAC3E,OAAO,EAAE,IAAI,CAACjU,KAAK,CAAChS,OAAQ;UAC5B,YAAY,EAAE,IAAI,CAAC6nB,gBAAiB;UACpC,aAAa,EAAE,IAAI,CAACD;QAAkB,EAAG,CAEhD;QAEDwL,UAAU,GACR,0HACE;UAAK,EAAE,EAAC,qBAAqB;UAAC,SAAS,EAAC;QAAe,GACpD,IAAI,CAACphB,KAAK,CAACwQ,aAAa,GACvB;UAAG,IAAI,EAAC,GAAG;UAAC,EAAE,EAAC,mBAAmB;UAAC,OAAO,EAAG1N,CAAC,IAAK;YAACA,CAAC,CAACC,cAAc,EAAE;YAAE,IAAI,CAAC/C,KAAK,CAAC2jB,kBAAkB,EAAE;UAAC;QAAE,GACxG;UAAG,SAAS,EAAC;QAAgB,GAAC,YAAU,CAAI,CAC1C,GAEJ,IAAI,EACN;UAAK,SAAS,EAAC;QAAY,GACzB,2DAAC,iEAAU;UACT,MAAM,EAAE,IAAI,CAAC3jB,KAAK,CAACqB,MAAO;UAC1B,MAAM,EAAE8C,MAAO;UACf,KAAK,EAAE,IAAI,CAACxQ,KAAK,CAACuF,KAAM;UACxB,KAAK,EAAE,IAAI,CAACvF,KAAK,CAACkB,KAAM;UACxB,OAAO,EAAE,IAAI,CAAClB,KAAK,CAAC8kB;QAAQ,EAAG,EAChC,CAACiJ,SAAS,GAAG;UAAM,SAAS,EAAEhI;QAAO,EAAG,GAAG,IAAI,CAC5C,EACN;UAAK,EAAE,EAAC;QAAmB,GACzB;UAAK,EAAE,EAAC,aAAa;UAAC,SAAS,EAAE+J;QAAW,GAC1C,IAAI,CAAC9vB,KAAK,CAACkB,KAAK,IAChB,sEAAG,2DAAC,wDAAgB;UAAC,EAAE,iBAAgB;UAAC,cAAc;YAAA;YAAA;UAAA;QAAU,EACP,CAAI,EAC9D,2DAAC,mEAAa;UAAC,MAAM,EAAE8sB;QAAY,EAAG,CAAM,EAC7C;UAAK,EAAE,EAAC;QAAiB,GAAEwB,QAAQ,CAAO,CACtC,EACLrY,UAAU,GACT,2DAAC,+DAAS;UACR,MAAM,EAAE,IAAI,CAAC9K,KAAK,CAACqB,MAAO;UAC1B,WAAW,EAAE,IAAI,CAAC1N,KAAK,CAAC0kB;QAAW,EAAG,GACxC;UAAK,EAAE,EAAC;QAAa,EAAG,EAE1B,wEACE;UAAG,IAAI,EAAC,GAAG;UAAC,OAAO,EAAE,IAAI,CAACtD;QAAmB,GAC3C;UAAG,SAAS,EAAC;QAAgB,GAAC,WAAS,CAAI,CACzC,CACA,CACF,EACL,IAAI,CAAC/U,KAAK,CAACwQ,aAAa,GACvB,2DAAC,gEAAU;UACT,KAAK,EAAE,IAAI,CAACxQ,KAAK,CAACyQ,UAAW;UAC7B,IAAI,EAAE,IAAI,CAACzQ,KAAK,CAAC0Q,SAAU;UAC3B,YAAY,EAAE,IAAI,CAAC1Q,KAAK,CAAChS;QAAQ,EAAG,GACpC,IAAI,EACR,2DAAC,kEAAW;UAAC,IAAI,EAAE,IAAI,CAAC2F,KAAK,CAACqlB;QAAiB,EAAG,EACjD0K,iBAAiB,EACjB,IAAI,CAAC/vB,KAAK,CAAC0lB,QAAQ,IAAI,IAAI,CAACtD,aAAa,EAAE,GAC1C;UAAK,SAAS,EAAC;QAAa,GAAE9hB,aAAa,CAAC1C,QAAQ,CAAC0hB,SAAS,CAAC,CAAO,GACtE,IAAI,CAET;MACH;MACAiO,SAAS,GAAG;QAAK,EAAE,EAAC,YAAY;QAAE,GAAG,EAAE,IAAI,CAAC7M;MAAe,GAAE+M,UAAU,CAAO;IAChF;IACA,OAAOF,SAAS;EAClB;AACF;AAAC;AAED,iEAAergB,sDAAU,CAAC4S,YAAY,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;AC3kDb;AACgD;AAEtC;AAEkB;AACI;AACC;AACC;AAEV;AACR;AAE1C,MAAMliB,QAAQ,GAAGb,0DAAc,CAAC;EAC9BqzB,mBAAmB,EAAE;IACnBtyB,EAAE,uBAAuB;IACzBC,cAAc;MAAA;MAAA;IAAA;EAEhB,CAAC;EACDsyB,iBAAiB,EAAE;IACjBvyB,EAAE,qBAAqB;IACvBC,cAAc;MAAA;MAAA;IAAA;EAEhB,CAAC;EACDuyB,kBAAkB,EAAE;IAClBxyB,EAAE,sBAAsB;IACxBC,cAAc;MAAA;MAAA;IAAA;EAEhB;AACF,CAAC,CAAC;AAEF,MAAMwyB,YAAY,SAASzzB,wDAAe,CAAC;EACzCsP,WAAW,CAACC,KAAK,EAAE;IACjB,KAAK,CAACA,KAAK,CAAC;IAEZ,IAAI,CAACrM,KAAK,GAAG;MACXwwB,WAAW,EAAE,MAAM;MACnBC,WAAW,EAAE;IACf,CAAC;IAED,IAAI,CAACC,cAAc,GAAG,IAAI,CAACA,cAAc,CAACnkB,IAAI,CAAC,IAAI,CAAC;IACpD,IAAI,CAACokB,oBAAoB,GAAG,IAAI,CAACA,oBAAoB,CAACpkB,IAAI,CAAC,IAAI,CAAC;IAChE,IAAI,CAACqkB,0BAA0B,GAAG,IAAI,CAACA,0BAA0B,CAACrkB,IAAI,CAAC,IAAI,CAAC;IAC5E,IAAI,CAACskB,oBAAoB,GAAG,IAAI,CAACA,oBAAoB,CAACtkB,IAAI,CAAC,IAAI,CAAC;IAChE,IAAI,CAACukB,eAAe,GAAG,IAAI,CAACA,eAAe,CAACvkB,IAAI,CAAC,IAAI,CAAC;EACxD;EAEA2W,iBAAiB,GAAG;IAClB,IAAI,CAAC7W,KAAK,CAAC0P,UAAU,EAAE;EACzB;EAEA2U,cAAc,CAACvhB,CAAC,EAAE;IAChBA,CAAC,CAACC,cAAc,EAAE;IAClBtL,qEAAyB,CAACA,sEAA0B,CAACrH,MAAM,CAACgG,QAAQ,CAACuB,IAAI,EAAE,KAAK,EAAEmL,CAAC,CAAC4hB,aAAa,CAACC,OAAO,CAAClzB,EAAE,CAAC,CAAC;IAC9G,IAAI,CAAC6Q,QAAQ,CAAC;MAAC6hB,WAAW,EAAErhB,CAAC,CAAC4hB,aAAa,CAACC,OAAO,CAAClzB;IAAE,CAAC,CAAC;EAC1D;EAEA6yB,oBAAoB,CAACM,KAAK,EAAE;IAC1B,IAAI,CAAC5kB,KAAK,CAAC6kB,gBAAgB,CAACD,KAAK,CAAC;IAClC,IAAI,CAACtiB,QAAQ,CAAC;MAAC8hB,WAAW,EAAEznB,0DAAkB,CAACioB,KAAK,CAAC,GAAG,IAAI,GAAGA;IAAK,CAAC,CAAC;EACxE;EAEAL,0BAA0B,CAAC53B,IAAI,EAAE;IAC/B,IAAI,IAAI,CAACgH,KAAK,CAACwwB,WAAW,IAAI,MAAM,EAAE;MACpC1sB,qEAAyB,CAACA,yEAA6B,CAACrH,MAAM,CAACgG,QAAQ,CAACuB,IAAI,EAAE,KAAK,CAAC,CAAC;MACrF,IAAI,CAACqI,KAAK,CAAC+kB,aAAa,CAACp4B,IAAI,CAAC;IAChC;EACF;EAEA63B,oBAAoB,CAAC73B,IAAI,EAAEuX,WAAW,EAAE8gB,OAAO,EAAEC,IAAI,EAAEC,IAAI,EAAExD,SAAS,EAAE;IACtEjqB,qEAAyB,CAACA,yEAA6B,CAACrH,MAAM,CAACgG,QAAQ,CAACuB,IAAI,EAAE,KAAK,CAAC,CAAC;IACrF,IAAI,CAACqI,KAAK,CAAC+kB,aAAa,CAACnyB,SAAS,EAChC;MAACqR,MAAM,EAAE3G,sDAAO,CAAC3Q,IAAI,EAAEq4B,OAAO,EAAE,IAAI,EAAE9gB,WAAW,CAAC;MAAE0B,OAAO,EAAEqf,IAAI;MAAEC,IAAI,EAAEA;IAAI,CAAC,EAAExD,SAAS,CAAC;EAC9F;EAEA+C,eAAe,CAAC1U,SAAS,EAAE;IACzBtY,qEAAyB,CAACA,yEAA6B,CAACrH,MAAM,CAACgG,QAAQ,CAACuB,IAAI,EAAE,KAAK,CAAC,CAAC;IACrF,IAAI,CAACqI,KAAK,CAAC+kB,aAAa,CAAChV,SAAS,CAAC;EACrC;EAEAvP,MAAM,GAAG;IACP,MAAM;MAACvM;IAAa,CAAC,GAAG,IAAI,CAAC+L,KAAK,CAACgD,IAAI;IACvC,MAAMmiB,uBAAuB,GAAGlxB,aAAa,CAAC,IAAI,CAACN,KAAK,CAACywB,WAAW,GAClE7yB,QAAQ,CAACyyB,iBAAiB,GAAGzyB,QAAQ,CAACwyB,mBAAmB,CAAC;IAC5D,MAAME,kBAAkB,GAAGhwB,aAAa,CAAC1C,QAAQ,CAAC0yB,kBAAkB,CAAC;IACrE,OACE;MAAK,SAAS,EAAC;IAAa,GAC1B;MAAI,SAAS,EAAC;IAAQ,GACpB;MAAI,SAAS,EAAE,IAAI,CAACtwB,KAAK,CAACwwB,WAAW,KAAK,MAAM,GAAG,QAAQ,GAAG;IAAK,GACjE;MAAG,IAAI,EAAC,GAAG;MAAC,WAAQ,MAAM;MAAC,OAAO,EAAE,IAAI,CAACE;IAAe,GACtD,2DAAC,wDAAgB;MAAC,EAAE,sBAAqB;MAAC,cAAc;QAAA;QAAA;MAAA;IAAO,EAC9B,CAC/B,CACD,EACL;MAAI,SAAS,EAAE,IAAI,CAAC1wB,KAAK,CAACwwB,WAAW,KAAK,KAAK,GAAG,QAAQ,GAAG;IAAK,GAChE;MAAG,IAAI,EAAC,GAAG;MAAC,WAAQ,KAAK;MAAC,OAAO,EAAE,IAAI,CAACE;IAAe,GACrD,2DAAC,wDAAgB;MAAC,EAAE,sBAAqB;MAAC,cAAc;QAAA;QAAA;MAAA;IAAY,EAC9B,CACpC,CACD,EACL;MAAI,SAAS,EAAE,IAAI,CAAC1wB,KAAK,CAACwwB,WAAW,KAAK,MAAM,GAAG,QAAQ,GAAG;IAAK,GACjE;MAAG,IAAI,EAAC,GAAG;MAAC,WAAQ,MAAM;MAAC,OAAO,EAAE,IAAI,CAACE;IAAe,GACtD,2DAAC,wDAAgB;MAAC,EAAE,wBAAuB;MAAC,cAAc;QAAA;QAAA;MAAA;IAAQ,EACrB,CAC3C,CACD,CACF,EACJ,IAAI,CAAC1wB,KAAK,CAACwwB,WAAW,KAAK,KAAK,GAC/B,2DAAC,oEAAa;MACZ,MAAM,EAAE,IAAI,CAACnkB,KAAK,CAACqB,MAAO;MAC1B,QAAQ,EAAE,IAAI,CAACmjB,oBAAqB;MACpC,OAAO,EAAE,IAAI,CAACxkB,KAAK,CAAChS;IAAQ,EAAG,GACjC,IAAI,CAAC2F,KAAK,CAACwwB,WAAW,KAAK,MAAM,GAC/B,2DAAC,oEAAY;MACX,QAAQ,EAAE,IAAI,CAACM,eAAgB;MAC/B,OAAO,EAAE,IAAI,CAACzkB,KAAK,CAAChS;IAAQ,EAAG,GACjC;MAAK,SAAS,EAAC;IAAa,GAC1B,2DAAC,oEAAc;MACb,WAAW,EAAEi2B,kBAAmB;MAChC,gBAAgB,EAAE,IAAI,CAACK;IAAqB,EAAG,EACjD,2DAAC,iEAAW;MACV,MAAM,EAAE,IAAI,CAACtkB,KAAK,CAACqB,MAAO;MAC1B,QAAQ,EAAE,IAAI,CAACrB,KAAK,CAAColB,aAAc;MACnC,QAAQ,EAAE,IAAI,CAACplB,KAAK,CAACiF,QAAS;MAC9B,gBAAgB,EAAEkgB,uBAAwB;MAC1C,UAAU,EAAE,KAAM;MAClB,UAAU,EAAE,KAAM;MAClB,eAAe,EAAE,KAAM;MACvB,eAAe,EAAE,IAAI,CAACZ;IAA2B,EAAG,CAClD,CACN;EAEV;AACF;AAAC;AAED,iEAAe1jB,sDAAU,CAACqjB,YAAY,CAAC;;;;;;;;;;;;;;;;;;;;ACvIC;AACM;AAE9C,MAAMnd,SAAS,GAAGtW,iDAAU,CAACxD,CAAC,IAAI,qJAAmC,CAAC;AACR;AAEZ;AAEnC,MAAMo4B,iBAAiB,SAAS50B,4DAAmB,CAAC;EACjEsP,WAAW,CAACC,KAAK,EAAE;IACjB,KAAK,CAACA,KAAK,CAAC;IAEZ,IAAI,CAACrM,KAAK,GAAG;MACX0T,GAAG,EAAE,EAAE;MACPD,KAAK,EAAE,EAAE;MACT7E,QAAQ,EAAE,EAAE;MACZ+iB,IAAI,EAAE,KAAK;MACXC,QAAQ,EAAE,KAAK;MACfxK,IAAI,EAAE;IACR,CAAC;IAED,IAAI,CAAC1S,YAAY,GAAG,IAAI,CAACA,YAAY,CAACnI,IAAI,CAAC,IAAI,CAAC;IAChD,IAAI,CAAC2H,iBAAiB,GAAG,IAAI,CAACA,iBAAiB,CAAC3H,IAAI,CAAC,IAAI,CAAC;IAC1D,IAAI,CAAC0H,oBAAoB,GAAG,IAAI,CAACA,oBAAoB,CAAC1H,IAAI,CAAC,IAAI,CAAC;IAChE,IAAI,CAACslB,gBAAgB,GAAG,IAAI,CAACA,gBAAgB,CAACtlB,IAAI,CAAC,IAAI,CAAC;IACxD,IAAI,CAACulB,mBAAmB,GAAG,IAAI,CAACA,mBAAmB,CAACvlB,IAAI,CAAC,IAAI,CAAC;IAG9DF,KAAK,CAACqB,MAAM,CAACiH,OAAO,EAAE,CACnB3S,KAAK,CAACnK,GAAG,IAAI;MACZ,IAAI,CAACwU,KAAK,CAAChS,OAAO,CAACxC,GAAG,CAACwK,OAAO,EAAE,KAAK,CAAC;IACxC,CAAC,CAAC;EACN;EAEA6gB,iBAAiB,GAAG;IAClB,MAAMne,MAAM,GAAGjB,uEAA2B,CAACrH,MAAM,CAACgG,QAAQ,CAACuB,IAAI,CAAC;IAChE,IAAI,CAAC2K,QAAQ,CAAC;MAACojB,KAAK,EAAEhtB,MAAM,CAACb,MAAM,CAAC6tB,KAAK;MAAEC,MAAM,EAAEjtB,MAAM,CAACb,MAAM,CAAC8tB;IAAM,CAAC,CAAC;EAC3E;EAEAtd,YAAY,CAACvF,CAAC,EAAE;IACdA,CAAC,CAACC,cAAc,EAAE;IAClB,IAAI,IAAI,CAACpP,KAAK,CAAC+xB,KAAK,EAAE;MAEpB,IAAI,CAAC1lB,KAAK,CAAC4lB,OAAO,CAAC,IAAI,CAACjyB,KAAK,CAAC4O,QAAQ,CAACvO,IAAI,EAAE,EAAE;QAC7C2xB,MAAM,EAAE,OAAO;QACfD,KAAK,EAAE,IAAI,CAAC/xB,KAAK,CAAC+xB;MACpB,CAAC,CAAC;IACJ,CAAC,MAAM,IAAI,IAAI,CAAC/xB,KAAK,CAAConB,IAAI,IAAI,IAAI,CAAC/a,KAAK,CAACoJ,aAAa,EAAE;MAGtD,MAAM5E,IAAI,GAAG,IAAI,CAAC7Q,KAAK,CAACyT,KAAK,CAACpT,IAAI,EAAE,IAAI,IAAI,CAACL,KAAK,CAAC0T,GAAG,CAACrT,IAAI,EAAE;MAC7D,IAAI,CAACgM,KAAK,CAAC4lB,OAAO,CAAC,IAAI,CAACjyB,KAAK,CAAC4O,QAAQ,CAACvO,IAAI,EAAE,EAAE;QAC7C2xB,MAAM,EAAE,MAAM;QACdE,MAAM,EAAG,GAAE,IAAI,CAAClyB,KAAK,CAAConB,IAAK,IAAG,IAAI,CAAC/a,KAAK,CAACoJ,aAAc,IAAG5E,IAAK;MACjE,CAAC,CAAC;IACJ,CAAC,MAAM;MACL,MAAM4C,KAAK,GAAG,IAAI,CAACzT,KAAK,CAACyT,KAAK,CAACpT,IAAI,EAAE;MACrC,MAAMqT,GAAG,GAAG,IAAI,CAAC1T,KAAK,CAAC0T,GAAG,CAACrT,IAAI,EAAE;MACjC,IAAI,CAACsO,QAAQ,CAAC;QAAC8E,KAAK,EAAEA,KAAK;QAAEC,GAAG,EAAEA;MAAG,CAAC,CAAC;MACvC,IAAI,CAACrH,KAAK,CAAC8lB,SAAS,CAAC,IAAI,CAAC9lB,KAAK,CAACoJ,aAAa,EAAEhC,KAAK,IAAIC,GAAG,CAAC,CAAChS,IAAI,CAACpI,CAAC,IAAI,IAAI,CAACqV,QAAQ,CAAC;QAACgjB,IAAI,EAAE;MAAI,CAAC,CAAC,CAAC;IACrG;EACF;EAEAzd,iBAAiB,CAAC/E,CAAC,EAAE;IACnB,IAAI,CAACR,QAAQ,CAAC;MAAC8E,KAAK,EAAEtE,CAAC,CAACyF,MAAM,CAAC3R;IAAK,CAAC,CAAC;EACxC;EAEAgR,oBAAoB,CAAC9E,CAAC,EAAE;IACtB,IAAI,CAACR,QAAQ,CAAC;MAACC,QAAQ,EAAEO,CAAC,CAACyF,MAAM,CAAC3R;IAAK,CAAC,CAAC;EAC3C;EAEA4uB,gBAAgB,CAAC1iB,CAAC,EAAE;IAClB,IAAI,CAACR,QAAQ,CAAC;MAACyY,IAAI,EAAEjY,CAAC,CAACyF,MAAM,CAAC3R,KAAK,CAAC1H,OAAO,CAAC,QAAQ,EAAE,EAAE;IAAC,CAAC,CAAC;EAC7D;EAEAu2B,mBAAmB,CAAC3iB,CAAC,EAAE;IACrBA,CAAC,CAACC,cAAc,EAAE;IAClB,IAAI,CAACT,QAAQ,CAAC;MAACijB,QAAQ,EAAE;IAAI,CAAC,CAAC;EACjC;EAEA/kB,MAAM,GAAG;IACP,MAAMulB,mBAAmB,GAAG,EAAE,IAAI,CAACpyB,KAAK,CAAC+xB,KAAK,IAAI,IAAI,CAAC/xB,KAAK,CAACgyB,MAAM,CAAC;IACpE,MAAMK,iBAAiB,GAAG,CAACD,mBAAmB,IAAI,IAAI,CAACpyB,KAAK,CAAC4xB,QAAQ,IAAI,IAAI,CAAC5xB,KAAK,CAAC2xB,IAAI;IAExF,MAAMW,aAAa,GAAI,0HACnB;MAAO,SAAS,EAAC,YAAY;MAAC,OAAO,EAAC;IAAc,GAClD,2DAAC,wDAAgB;MAAC,EAAE,sBAAqB;MACvC,cAAc;QAAA;QAAA;MAAA;IAAe,EACqB,CAC9C,EACR,2DAAC,wDAAgB;MAAC,EAAE,4BAA2B;MAAC,cAAc;QAAA;QAAA;MAAA;IAAqB,GAEhFC,WAAW,IAAK,2DAAC,qEAAe;MAC/B,EAAE,EAAC,cAAc;MACjB,WAAW,EAAEA,WAAY;MACzB,YAAY,EAAC,cAAc;MAC3B,KAAK,EAAE,IAAI,CAACvyB,KAAK,CAAC4O,QAAS;MAC3B,QAAQ,EAAE,IAAK;MAAC,SAAS,EAAE,IAAK;MAChC,QAAQ,EAAE,IAAI,CAACqF;IAAqB,EAAG,CACvB,CAClB;IAEN,MAAMue,UAAU,GAAI,0HACf,IAAI,CAACxyB,KAAK,CAAC4xB,QAAQ,GAClB,IAAI,GACJ;MAAO,OAAO,EAAC;IAAY,GACzB,2DAAC,wDAAgB;MAAC,EAAE,wBAAuB;MACzC,cAAc;QAAA;QAAA;MAAA;IAA8B,EACG,CAC3C,EAEV,2DAAC,wDAAgB;MAAC,EAAE,2BAA0B;MAAC,cAAc;QAAA;QAAA;MAAA;IAA0B,GAEpFW,WAAW,IAAK;MAAO,IAAI,EAAC,OAAO;MAAC,EAAE,EAAC,YAAY;MAClD,WAAW,EAAEA,WAAY;MACzB,YAAY,EAAC,OAAO;MACpB,KAAK,EAAE,IAAI,CAACvyB,KAAK,CAACyT,KAAM;MACxB,QAAQ,EAAE,IAAI,CAACS,iBAAkB;MACjC,QAAQ;MAAC,SAAS;IAAA,EAAG,CACL,CAClB;IAEN,MAAMue,UAAU,GAAI,0HACf,IAAI,CAACzyB,KAAK,CAAC4xB,QAAQ,GAClB,IAAI,GACJ,wEAAK,0EACH,2DAAC,wDAAgB;MAAC,EAAE,4BAA2B;MAC7C,cAAc;QAAA;QAAA;MAAA;IAA6B,EACa,CACpD,CAAM,EAEhB,wEACE;MAAO,SAAS,EAAC;IAAY,GAC3B,2DAAC,wDAAgB;MAAC,EAAE,uBAAsB;MAAC,cAAc;QAAA;QAAA;MAAA;IAAsB,EACnB,CACtD,CACJ,EACN;MAAK,SAAS,EAAC;IAAgB,GAC7B,2DAAC,2CAAQ;MAAC,QAAQ,EAAE;QAAK,SAAS,EAAC;MAAgB,GAAC,2DAAC,wDAAgB;QAAC,EAAE,gBAAe;QACrF,cAAc;UAAA;UAAA;QAAA;MAAa,EAAwD;IAAO,GAC1F,2DAAC,SAAS;MACR,SAAS,EAAE,IAAK;MAChB,qBAAqB,EAAE,IAAI,CAACvlB,KAAK,CAAC4E,qBAAsB;MACxD,QAAQ,EAAEC,MAAM,IAAI,IAAI,CAACvC,QAAQ,CAAC;QAAC+E,GAAG,EAAExC;MAAM,CAAC;IAAE,EAAG,CAC7C,CACP,CACJ;IAEN,MAAMwhB,gBAAgB,GAAI,0HACtB,IAAI,CAACrmB,KAAK,CAACoJ,aAAa,IAAI,OAAO,GACjC,2DAAC,wDAAgB;MAAC,EAAE,6BAA4B;MAC9C,cAAc;QAAA;QAAA;MAAA;QAAA;QAAA;MAAA;QAAA;QAAA;MAAA,EAA8E;MAC5F,MAAM,EAAE;QAAChC,KAAK,EAAE,uEAAK,IAAI,CAACzT,KAAK,CAACyT,KAAK;MAAM;IAAE,EAC8C,GAC7F,IAAI,CAACpH,KAAK,CAACoJ,aAAa,IAAI,KAAK,GACjC,2DAAC,wDAAgB;MAAC,EAAE,2BAA0B;MAC5C,cAAc;QAAA;QAAA;MAAA;QAAA;QAAA;MAAA;QAAA;QAAA;MAAA,EAAoF;MAClG,MAAM,EAAE;QAACkd,KAAK,EAAE,uEAAK,IAAI,CAAC3yB,KAAK,CAAC0T,GAAG;MAAM;IAAE,EAC8C,GAE7F,IAAI,CACD;IAEP,MAAMkf,SAAS,GAAI,0HACf,wEACE;MAAO,SAAS,EAAC,YAAY;MAAC,OAAO,EAAC;IAAyB,GAC7D,2DAAC,wDAAgB;MAAC,EAAE,kCAAiC;MACnD,cAAc;QAAA;QAAA;MAAA;IAAoB,EACiB,CAC/C,CACJ,EACN,wEACE,2DAAC,wDAAgB;MAAC,EAAE,oCAAmC;MACrD,cAAc;QAAA;QAAA;MAAA;IAAe,GAC5BC,YAAY,IAAK;MAAO,IAAI,EAAC,MAAM;MAAC,EAAE,EAAC,yBAAyB;MAC/D,WAAW,EAAEA,YAAa;MAAC,SAAS,EAAE,EAAG;MACzC,KAAK,EAAE,IAAI,CAAC7yB,KAAK,CAAConB,IAAK;MAAC,QAAQ,EAAE,IAAI,CAACyK,gBAAiB;MAAC,QAAQ;IAAA,EAAG,CACpD,CAChB,CACJ;IAEN,MAAMiB,eAAe,GAAG,IAAI,CAACzmB,KAAK,CAACoJ,aAAa,IAAI,OAAO,GACzD+c,UAAU,GAAG,IAAI,CAACnmB,KAAK,CAACoJ,aAAa,IAAI,KAAK,GAAGgd,UAAU,GAAG,IAAI;IAEpE,OACE;MAAM,EAAE,EAAC,qBAAqB;MAAC,QAAQ,EAAE,IAAI,CAAC/d;IAAa,GACxD,IAAI,CAAC1U,KAAK,CAAC2xB,IAAI,GAAGe,gBAAgB,GAAGN,mBAAmB,GAAGU,eAAe,GAAG,IAAI,EACjF,IAAI,CAAC9yB,KAAK,CAAC4xB,QAAQ,IAAI,IAAI,CAAC5xB,KAAK,CAAC2xB,IAAI,GAAGiB,SAAS,GAAG,IAAI,EACzDP,iBAAiB,GAAGC,aAAa,GAAG,IAAI,EACzC;MAAK,SAAS,EAAC;IAAgB,GAC5B,IAAI,CAACtyB,KAAK,CAAC4xB,QAAQ,IAAI,IAAI,CAAC5xB,KAAK,CAAC2xB,IAAI,GAAG,IAAI,GAC5C;MAAG,IAAI,EAAC,GAAG;MAAC,OAAO,EAAE,IAAI,CAACG,mBAAoB;MAAC,KAAK,EAAE;QAACiB,WAAW,EAAE;MAAM;IAAE,GAC1E,2DAAC,wDAAgB;MAAC,EAAE,wBAAuB;MAAC,cAAc;QAAA;QAAA;MAAA;IAAc,EACN,CAChE,EAEN;MAAQ,SAAS,EAAC,SAAS;MAAC,IAAI,EAAC;IAAQ,GACvCV,iBAAiB,GACf,2DAAC,wDAAgB;MAAC,EAAE,gBAAe;MAAC,cAAc;QAAA;QAAA;MAAA;IAAQ,EAAgC,GAE1F,2DAAC,wDAAgB;MAAC,EAAE,uBAAsB;MAAC,cAAc;QAAA;QAAA;MAAA;IAAe,EAChC,CAClC,CACN,CACD;EAEX;AACF;;;;;;;;;;;;;;;;;;;;AC/M0B;AACoB;AAEC;AAES;AAEzC,MAAMY,YAAY,SAASn2B,4DAAmB,CAAC;EAC5DsP,WAAW,CAACC,KAAK,EAAE;IACjB,KAAK,CAACA,KAAK,CAAC;IAEZ,IAAI,CAACrM,KAAK,GAAG;MACXkzB,SAAS,EAAE7mB,KAAK,CAAC6mB,SAAS,IAAI,KAAK;MACnCpjB,aAAa,EAAEzD,KAAK,CAACyD,aAAa;MAClCqjB,gBAAgB,EAAE9mB,KAAK,CAAC8mB;IAC1B,CAAC;IAED,IAAI,CAACze,YAAY,GAAG,IAAI,CAACA,YAAY,CAACnI,IAAI,CAAC,IAAI,CAAC;IAChD,IAAI,CAAC6mB,uBAAuB,GAAG,IAAI,CAACA,uBAAuB,CAAC7mB,IAAI,CAAC,IAAI,CAAC;IACtE,IAAI,CAAC8mB,yBAAyB,GAAG,IAAI,CAACA,yBAAyB,CAAC9mB,IAAI,CAAC,IAAI,CAAC;IAC1E,IAAI,CAAC+mB,kBAAkB,GAAG,IAAI,CAACA,kBAAkB,CAAC/mB,IAAI,CAAC,IAAI,CAAC;EAC9D;EAEAmI,YAAY,CAACvF,CAAC,EAAE;IACdA,CAAC,CAACC,cAAc,EAAE;IAClB,IAAI,CAAC/C,KAAK,CAACknB,QAAQ,CAAC;MAClBL,SAAS,EAAE,IAAI,CAAClzB,KAAK,CAACkzB,SAAS;MAC/BpjB,aAAa,EAAE,IAAI,CAAC9P,KAAK,CAAC8P,aAAa;MACvCqjB,gBAAgB,EAAE,IAAI,CAACnzB,KAAK,CAACmzB;IAC/B,CAAC,CAAC;EACJ;EAEAC,uBAAuB,CAACjkB,CAAC,EAAE;IACzB,IAAI,CAACR,QAAQ,CAAC;MAACukB,SAAS,EAAE/jB,CAAC,CAAC4hB,aAAa,CAAC9tB;IAAK,CAAC,CAAC;EACnD;EAEAowB,yBAAyB,CAACr6B,IAAI,EAAE;IAC9B,IAAI,CAAC2V,QAAQ,CAAC;MAACmB,aAAa,EAAE9W;IAAI,CAAC,CAAC;EACtC;EAEAs6B,kBAAkB,CAACnkB,CAAC,EAAE;IACpB,IAAI,CAACR,QAAQ,CAAC;MAACwkB,gBAAgB,EAAE,CAAC,IAAI,CAACnzB,KAAK,CAACmzB;IAAgB,CAAC,CAAC;EACjE;EAEAtmB,MAAM,GAAG;IACP,MAAM2mB,KAAK,GAAG;MAACC,GAAG,EAAE,SAAS;MAAEC,EAAE,EAAE,WAAW;MAAEC,EAAE,EAAE;IAAc,CAAC;IACnE,MAAMC,gBAAgB,GAAG,EAAE;IAC3B,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,CAACl0B,GAAG,CAAEhF,IAAI,IAAK;MAChC,MAAMoD,EAAE,GAAG,YAAY,GAAGpD,IAAI;MAC9B,MAAM1B,IAAI,GAAGw6B,KAAK,CAAC94B,IAAI,CAAC;MACxBk5B,gBAAgB,CAAC/2B,IAAI,CACnB;QAAI,GAAG,EAAEnC;MAAK,GACZ;QAAO,IAAI,EAAC,OAAO;QAAC,EAAE,EAAEoD,EAAG;QAAC,IAAI,EAAC,kBAAkB;QAAC,KAAK,EAAEpD,IAAK;QAC9D,OAAO,EAAE,IAAI,CAACsF,KAAK,CAACkzB,SAAS,KAAKx4B,IAAK;QACvC,QAAQ,EAAE,IAAI,CAAC04B;MAAwB,EAAG,EAC5C;QAAO,OAAO,EAAEt1B;MAAG,GAAE9E,IAAI,CAAS,CAC/B,CACN;IACH,CAAC,CAAC;IAEF,OACE;MAAM,EAAE,EAAC,eAAe;MAAC,SAAS,EAAC,YAAY;MAAC,QAAQ,EAAE,IAAI,CAAC0b;IAAa,GAC1E;MAAK,SAAS,EAAC;IAAgB,GAC7B;MAAO,SAAS,EAAC;IAAO,GACtB,2DAAC,wDAAgB;MAAC,EAAE,uBAAsB;MAAC,cAAc;QAAA;QAAA;MAAA;IAAiB,EACd,CACtD,CACJ,EACN,2DAAC,kEAAY;MAAC,aAAa,EAAE,IAAI,CAAC1U,KAAK,CAAC8P,aAAc;MAAC,qBAAqB,EAAE,IAAI,CAACujB;IAA0B,EAAG,EAChH;MAAK,SAAS,EAAC;IAAgB,GAC7B,2DAAC,6DAAQ;MAAC,EAAE,EAAC,mBAAmB;MAAC,IAAI,EAAC,mBAAmB;MAAC,OAAO,EAAE,IAAI,CAACrzB,KAAK,CAACmzB,gBAAiB;MAC7F,SAAS,EAAC,QAAQ;MAAC,QAAQ,EAAE,IAAI,CAACG;IAAmB,EAAG;MAAO,OAAO,EAAC;IAAmB,GAC1F,2DAAC,wDAAgB;MAAC,EAAE,+BAA8B;MAAC,cAAc;QAAA;QAAA;MAAA;IAAwB,EACtB,CAC7D,CACJ,EACN;MAAK,SAAS,EAAC;IAAgB,GAC7B;MAAO,SAAS,EAAC;IAAO,GACtB,2DAAC,wDAAgB;MAAC,EAAE,wBAAuB;MAAC,cAAc;QAAA;QAAA;MAAA;IAAkB,EACP,CAC/D,CACJ,EACN;MAAK,SAAS,EAAC;IAAgB,GAC7B;MAAI,SAAS,EAAC;IAAQ,GACnBM,gBAAgB,CACd,CACD,EACN;MAAK,SAAS,EAAC;IAAgB,GAC7B;MAAQ,IAAI,EAAC,QAAQ;MAAC,SAAS,EAAC;IAAS,GACvC,2DAAC,wDAAgB;MAAC,EAAE,iBAAgB;MAAC,cAAc;QAAA;QAAA;MAAA;IAAS,EAC1B,CAC3B,CACL,CACD;EAEX;AACF;AAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACjGyB;AAC8B;AAEJ;AACE;AACF;AACE;AAEQ;AACf;AACW;AACM;AACV;AACF;AACX;AACO;AACU;AACX;AACI;AAGnD,MAAMh2B,QAAQ,GAAGb,0DAAc,CAAC;EAC9ByW,KAAK,EAAE;IACL1V,EAAE,yBAAyB;IAE3BC,cAAc;MAAA;MAAA;IAAA;EAChB,CAAC;EACDi2B,QAAQ,EAAE;IACRl2B,EAAE,4BAA4B;IAE9BC,cAAc;MAAA;MAAA;IAAA;EAChB,CAAC;EACDk2B,QAAQ,EAAE;IACRn2B,EAAE,4BAA4B;IAE9BC,cAAc;MAAA;MAAA;IAAA;EAChB,CAAC;EACDm2B,IAAI,EAAE;IACJp2B,EAAE,oCAAoC;IAEtCC,cAAc;MAAA;MAAA;IAAA;EAChB,CAAC;EACDmY,OAAO,EAAE;IACPpY,EAAE,uBAAuB;IAEzBC,cAAc;MAAA;MAAA;IAAA;EAChB,CAAC;EACDoY,QAAQ,EAAE;IACRrY,EAAE,wBAAwB;IAE1BC,cAAc;MAAA;MAAA;IAAA;EAChB,CAAC;EACDsY,IAAI,EAAE;IACJvY,EAAE,oBAAoB;IAEtBC,cAAc;MAAA;MAAA;IAAA;EAChB,CAAC;EACDo2B,KAAK,EAAE;IACLr2B,EAAE,qCAAqC;IAEvCC,cAAc;MAAA;MAAA;IAAA;EAChB,CAAC;EACDq2B,OAAO,EAAE;IACPt2B,EAAE,+BAA+B;IAEjCC,cAAc;MAAA;MAAA;IAAA;EAChB,CAAC;EACDs2B,MAAM,EAAE;IACNv2B,EAAE,0BAA0B;IAE5BC,cAAc;MAAA;MAAA;IAAA;EAChB,CAAC;EACD8S,IAAI,EAAE;IACJ/S,EAAE,wBAAwB;IAE1BC,cAAc;MAAA;MAAA;IAAA;EAChB,CAAC;EACDu2B,KAAK,EAAE;IACLx2B,EAAE,yBAAyB;IAE3BC,cAAc;MAAA;MAAA;IAAA;EAChB,CAAC;EACDoU,OAAO,EAAE;IACPrU,EAAE,2BAA2B;IAE7BC,cAAc;MAAA;MAAA;IAAA;EAChB,CAAC;EACDiU,OAAO,EAAE;IACPlU,EAAE,2BAA2B;IAE7BC,cAAc;MAAA;MAAA;IAAA;EAChB;AACF,CAAC,CAAC;AAEF,MAAMw2B,aAAa,SAASz3B,4DAAmB,CAAC;EAC9CsP,WAAW,CAACC,KAAK,EAAE;IACjB,KAAK,CAACA,KAAK,CAAC;IAEZ,IAAI,CAACmoB,cAAc,GAAG,IAAI,CAACA,cAAc,CAACjoB,IAAI,CAAC,IAAI,CAAC;EACtD;EAEAioB,cAAc,GAAG;IACf,IAAI,CAACnoB,KAAK,CAACgF,UAAU,CAAC,QAAQ,CAAC;EACjC;EAEAxE,MAAM,GAAG;IACP,MAAM;MAACvM;IAAa,CAAC,GAAG,IAAI,CAAC+L,KAAK,CAACgD,IAAI;IACvC,MAAMqN,IAAI,GAAG,IAAI,CAACrQ,KAAK,CAACrM,KAAK,KAAK,IAAI,CAACqM,KAAK,CAACiF,QAAQ,GAAG,UAAU,GAAG,OAAO,CAAC;IAE7E,IAAIpQ,KAAK,EAAEsP,MAAM,EAAE2I,MAAM;IACzB,IAAIuD,IAAI,IAAI,UAAU,EAAE;MACtBxb,KAAK,GAAG,IAAI,CAACmL,KAAK,CAACnL,KAAK;MACxBsP,MAAM,GAAG,IAAI,CAACnE,KAAK,CAACmE,MAAM,GAAG,IAAI,CAACnE,KAAK,CAACmE,MAAM,GAAG,IAAI;MACrD2I,MAAM,GAAG,IAAI,CAAC9M,KAAK,CAACkF,aAAa;IACnC,CAAC,MAAM;MACLrQ,KAAK,GAAGZ,aAAa,CAAC1C,QAAQ,CAAC8e,IAAI,CAAC,CAAC;MACrClM,MAAM,GAAG,KAAK;MACd2I,MAAM,GAAG,IAAI;IACf;IAEA,IAAIsb,QAAQ;IACZ,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC39B,OAAO,CAAC4lB,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE;MAC7C+X,QAAQ,GAAG,IAAI,CAACpoB,KAAK,CAACooB,QAAQ;IAChC;IAEA,OACE;MAAK,EAAE,EAAC,WAAW;MAAC,SAAS,EAAE,IAAI,CAACpoB,KAAK,CAACmhB,QAAQ,GAAG,WAAW,GAAG;IAAK,GACtE,2DAAC,gEAAU;MACT,KAAK,EAAE9Q,IAAK;MACZ,KAAK,EAAExb,KAAM;MACb,MAAM,EAAEsP,MAAO;MACf,MAAM,EAAE,IAAI,CAACnE,KAAK,CAACqB,MAAO;MAC1B,aAAa,EAAEyL,MAAO;MACtB,QAAQ,EAAE,IAAI,CAAC9M,KAAK,CAACiF,QAAS;MAC9B,QAAQ,EAAE,IAAI,CAACjF,KAAK,CAACqoB,QAAS;MAC9B,UAAU,EAAE,IAAI,CAACroB,KAAK,CAACsoB,UAAW;MAClC,UAAU,EAAE,IAAI,CAACH,cAAe;MAChC,QAAQ,EAAEC;IAAS,EAAG,EAExB,2DAAC,gEAAU;MACT,KAAK,EAAE,IAAI,CAACpoB,KAAK,CAACyQ,UAAW;MAC7B,IAAI,EAAE,IAAI,CAACzQ,KAAK,CAAC0Q,SAAU;MAC3B,MAAM,EAAE,IAAI,CAAC1Q,KAAK,CAACuoB,WAAY;MAC/B,UAAU,EAAE,IAAI,CAACvoB,KAAK,CAACwoB,eAAgB;MACvC,YAAY,EAAE,IAAI,CAACxoB,KAAK,CAAChS;IAAQ,EAAG,EAEtC,2DAAC,iEAAW;MAAC,IAAI,EAAE,IAAI,CAACgS,KAAK,CAACyoB;IAAmB,EAAG,EAEnDpY,IAAI,KAAK,OAAO,GACf,2DAAC,wDAAS;MACR,KAAK,EAAE,IAAI,CAACrQ,KAAK,CAACmH,KAAM;MACxB,QAAQ,EAAE,IAAI,CAACnH,KAAK,CAAC0oB,aAAc;MACnC,OAAO,EAAE,IAAI,CAAC1oB,KAAK,CAACwR,OAAQ;MAC5B,OAAO,EAAE,IAAI,CAACxR,KAAK,CAAC2oB,cAAe;MACnC,mBAAmB,EAAE,IAAI,CAAC3oB,KAAK,CAACyR;IAAoB,EAAG,GAEzDpB,IAAI,KAAK,UAAU,GACnB,2DAAC,gEAAiB;MAChB,MAAM,EAAE,IAAI,CAACrQ,KAAK,CAACqB,MAAO;MAC1B,aAAa,EAAE,IAAI,CAACrB,KAAK,CAACoJ,aAAc;MACxC,qBAAqB,EAAE,IAAI,CAACpJ,KAAK,CAAC4E,qBAAsB;MACxD,eAAe,EAAE,IAAI,CAAC5E,KAAK,CAACwI,eAAgB;MAC5C,QAAQ,EAAE,IAAI,CAACxI,KAAK,CAACooB,QAAS;MAC9B,OAAO,EAAE,IAAI,CAACpoB,KAAK,CAAChS;IAAQ,EAAG,GAEjCqiB,IAAI,KAAK,UAAU,GACnB,2DAAC,2DAAY;MACX,SAAS,EAAE,IAAI,CAACrQ,KAAK,CAAC6mB,SAAU;MAChC,aAAa,EAAE,IAAI,CAAC7mB,KAAK,CAACyD,aAAc;MACxC,gBAAgB,EAAE,IAAI,CAACzD,KAAK,CAAC8mB,gBAAiB;MAC9C,QAAQ,EAAE,IAAI,CAAC9mB,KAAK,CAACooB,QAAS;MAC9B,QAAQ,EAAE,IAAI,CAACpoB,KAAK,CAAC4oB;IAAiB,EAAG,GAE3CvY,IAAI,KAAK,MAAM,GACf,2DAAC,kEAAmB;MAClB,MAAM,EAAE,IAAI,CAACrQ,KAAK,CAACqB,MAAO;MAC1B,QAAQ,EAAE,IAAI,CAACrB,KAAK,CAACiF,QAAS;MAC9B,aAAa,EAAE,IAAI,CAACjF,KAAK,CAACkF,aAAc;MACxC,qBAAqB,EAAE,IAAI,CAAClF,KAAK,CAAC4E,qBAAsB;MACxD,UAAU,EAAE,IAAI,CAAC5E,KAAK,CAACgF;IAAW,EAAG,GAEtCqL,IAAI,KAAK,SAAS,IAAIA,IAAI,KAAK,MAAM,GACtC,2DAAC,8DAAe;MACd,KAAK,EAAC,IAAI;MACV,MAAM,EAAE,IAAI,CAACrQ,KAAK,CAACqB,MAAO;MAC1B,QAAQ,EAAE,IAAI,CAACrB,KAAK,CAACiF,QAAS;MAC9B,aAAa,EAAE,IAAI,CAACjF,KAAK,CAACoJ,aAAc;MACxC,iBAAiB,EAAE,IAAI,CAACpJ,KAAK,CAAC4C,mBAAoB;MAClD,mBAAmB,EAAE,IAAI,CAAC5C,KAAK,CAAC6oB,mBAAoB;MACpD,SAAS,EAAE,IAAI,CAAC7oB,KAAK,CAAC6Q,SAAU;MAChC,YAAY,EAAE,IAAI,CAAC7Q,KAAK,CAACgR,YAAa;MACtC,aAAa,EAAE,IAAI,CAAChR,KAAK,CAAC+Q,aAAc;MACxC,OAAO,EAAE,IAAI,CAAC/Q,KAAK,CAAChS;IAAQ,EAAG,GAEjCqiB,IAAI,KAAK,OAAO,GAChB,2DAAC,mEAAoB;MACnB,aAAa,EAAE,IAAI,CAACrQ,KAAK,CAACS,aAAc;MACxC,aAAa,EAAE,IAAI,CAACT,KAAK,CAACW,aAAc;MACxC,oBAAoB,EAAE,IAAI,CAACX,KAAK,CAACU,oBAAqB;MACtD,aAAa,EAAE,IAAI,CAACV,KAAK,CAACY,aAAc;MACxC,yBAAyB,EAAE,IAAI,CAACZ,KAAK,CAACM,yBAA0B;MAChE,qBAAqB,EAAE,IAAI,CAACN,KAAK,CAACK,qBAAsB;MACxD,qBAAqB,EAAE,IAAI,CAACL,KAAK,CAACO;IAAsB,EAAG,GAE7D8P,IAAI,KAAK,UAAU,GACnB,2DAAC,+DAAe;MACd,MAAM,EAAE,IAAI,CAACrQ,KAAK,CAACqB,MAAO;MAC1B,mBAAmB,EAAE,IAAI,CAACrB,KAAK,CAAC4C,mBAAoB;MACpD,gBAAgB,EAAE,IAAI,CAAC5C,KAAK,CAACwC,gBAAiB;MAC9C,QAAQ,EAAE,IAAI,CAACxC,KAAK,CAACoD,QAAS;MAC9B,eAAe,EAAE,IAAI,CAACpD,KAAK,CAACkD,eAAgB;MAC5C,WAAW,EAAE,IAAI,CAAClD,KAAK,CAACiD,WAAY;MACpC,aAAa,EAAE,IAAI,CAACjD,KAAK,CAACqD;IAAc,EAAG,GAE7CgN,IAAI,KAAK,SAAS,GAClB,2DAAC,8DAAc;MACb,aAAa,EAAE,IAAI,CAACrQ,KAAK,CAACyD,aAAc;MACxC,aAAa,EAAE,IAAI,CAACzD,KAAK,CAACwD;IAAc,EAAG,GAE5C6M,IAAI,KAAK,UAAU,IAAIA,IAAI,IAAI,SAAS,IAAIA,IAAI,IAAI,SAAS,GAC9D,2DAAC,0DAAY;MACX,MAAM,EAAE,IAAI,CAACrQ,KAAK,CAACqB,MAAO;MAC1B,QAAQ,EAAE,IAAI,CAACrB,KAAK,CAACiF,QAAS;MAC9B,SAAS,EAAE,IAAI,CAACjF,KAAK,CAACyG,SAAU;MAChC,aAAa,EAAE,IAAI,CAACzG,KAAK,CAAC0G,aAAc;MACxC,OAAO,EAAE2J,IAAI,IAAI,SAAU;MAC3B,OAAO,EAAEA,IAAI,IAAI,SAAU;MAC3B,QAAQ,EAAE,IAAI,CAACrQ,KAAK,CAAC0F,QAAS;MAC9B,eAAe,EAAE,IAAI,CAAC1F,KAAK,CAAC4G,eAAgB;MAC5C,eAAe,EAAE,IAAI,CAAC5G,KAAK,CAAC2G,eAAgB;MAC5C,aAAa,EAAE,IAAI,CAAC3G,KAAK,CAACuG;IAAc,EAAG,GAE7C8J,IAAI,KAAK,QAAQ,GACjB,2DAAC,4DAAY;MACX,MAAM,EAAE,IAAI,CAACrQ,KAAK,CAACqB,MAAO;MAC1B,aAAa,EAAE,IAAI,CAACrB,KAAK,CAAColB,aAAc;MACxC,UAAU,EAAE,IAAI,CAACplB,KAAK,CAAC0P,UAAW;MAClC,gBAAgB,EAAE,IAAI,CAAC1P,KAAK,CAAC6kB,gBAAiB;MAC9C,aAAa,EAAE,IAAI,CAAC7kB,KAAK,CAAC+kB,aAAc;MACxC,OAAO,EAAE,IAAI,CAAC/kB,KAAK,CAAChS;IAAQ,EAAG,GAEjCqiB,IAAI,KAAK,MAAM,GACf,2DAAC,6DAAc;MACb,QAAQ,EAAE,IAAI,CAACrQ,KAAK,CAAC8oB,QAAS;MAC9B,UAAU,EAAE,IAAI,CAAC9oB,KAAK,CAAC+oB,UAAW;MAClC,SAAS,EAAE,IAAI,CAAC/oB,KAAK,CAACgpB,SAAU;MAChC,QAAQ,EAAE,IAAI,CAAChpB,KAAK,CAACipB,qBAAsB;MAC3C,QAAQ,EAAE,IAAI,CAACjpB,KAAK,CAACooB;IAAS,EAAG,GAEnC/X,IAAI,KAAK,OAAO,GAChB,2DAAC,iEAAiB;MAChB,MAAM,EAAE,IAAI,CAACrQ,KAAK,CAACqB,MAAO;MAC1B,aAAa,EAAE,IAAI,CAACrB,KAAK,CAACoJ,aAAc;MACxC,qBAAqB,EAAE,IAAI,CAACpJ,KAAK,CAAC4E,qBAAsB;MACxD,SAAS,EAAE,IAAI,CAAC5E,KAAK,CAACkpB,sBAAuB;MAC7C,OAAO,EAAE,IAAI,CAAClpB,KAAK,CAACmpB,eAAgB;MACpC,QAAQ,EAAE,IAAI,CAACnpB,KAAK,CAACooB;IAAS,EAAG,GACnC,IAAI,CACF;EAEV;AACF;AAAC;AAED,iEAAevnB,sDAAU,CAACqnB,aAAa,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACtQA;AACkC;AAEV;AAE8B;AAElD;AAEH;AACa;AACI;AACF;AACxD,MAAMgC,oBAAoB,GAAGz5B,iDAAU,CAACxD,CAAC,IAAI,4NAA+C,CAAC;AAEtD;AACQ;AACE;AAGR;AAGY;AACL;AACsB;AACqB;AACpC;AACL;AACC;AACH;AAGhD,MAAMk9B,SAAS,GAAG,IAAIC,KAAK,CAAC,eAAe,CAAC;AAE5C,MAAM74B,QAAQ,GAAGb,0DAAc,CAAC;EAC9B25B,mBAAmB,EAAE;IACnB54B,EAAE,uBAAuB;IACzBC,cAAc;MAAA;MAAA;IAAA;MAAA;MAAA;IAAA;MAAA;MAAA;IAAA;EAEhB,CAAC;EACD44B,aAAa,EAAE;IACb74B,EAAE,iBAAiB;IACnBC,cAAc;MAAA;MAAA;IAAA;EAEhB,CAAC;EACD64B,gBAAgB,EAAE;IAChB94B,EAAE,oBAAoB;IACtBC,cAAc;MAAA;MAAA;IAAA;EAEhB,CAAC;EACD84B,sBAAsB,EAAE;IACtB/4B,EAAE,0BAA0B;IAC5BC,cAAc;MAAA;MAAA;IAAA;EAEhB,CAAC;EACD+4B,aAAa,EAAE;IACbh5B,EAAE,iBAAiB;IACnBC,cAAc;MAAA;MAAA;IAAA;EAEhB,CAAC;EACDg5B,kBAAkB,EAAE;IAClBj5B,EAAE,sBAAsB;IACxBC,cAAc;MAAA;MAAA;IAAA;EAEhB,CAAC;EACDi5B,cAAc,EAAE;IACdl5B,EAAE,kBAAkB;IACpBC,cAAc;MAAA;MAAA;IAAA;EAEhB,CAAC;EACDk5B,oBAAoB,EAAE;IACpBn5B,EAAE,wBAAwB;IAC1BC,cAAc;MAAA;MAAA;IAAA;EAEhB,CAAC;EACDm5B,oBAAoB,EAAE;IACpBp5B,EAAE,wBAAwB;IAC1BC,cAAc;MAAA;MAAA;IAAA;EAEhB,CAAC;EACDo5B,2BAA2B,EAAE;IAC3Br5B,EAAE,+BAA+B;IACjCC,cAAc;MAAA;MAAA;IAAA;EAEhB;AACF,CAAC,CAAC;AAEF,MAAMq5B,SAAS,SAASt6B,wDAAe,CAAC;EACtCsP,WAAW,CAACC,KAAK,EAAE;IACjB,KAAK,CAACA,KAAK,CAAC;IAEZ,IAAI,CAACgrB,OAAO,GAAGv6B,sDAAe,EAAE;IAEhC,IAAI,CAACkD,KAAK,GAAG,IAAI,CAACs3B,aAAa,EAAE;IAEjC,IAAI,CAACC,YAAY,GAAG,IAAI,CAACA,YAAY,CAAChrB,IAAI,CAAC,IAAI,CAAC;IAChD,IAAI,CAACirB,eAAe,GAAG,IAAI,CAACA,eAAe,CAACjrB,IAAI,CAAC,IAAI,CAAC;IACtD,IAAI,CAACkrB,YAAY,GAAG,IAAI,CAACA,YAAY,CAAClrB,IAAI,CAAC,IAAI,CAAC;IAChD,IAAI,CAACmrB,iBAAiB,GAAG,IAAI,CAACA,iBAAiB,CAACnrB,IAAI,CAAC,IAAI,CAAC;IAC1D,IAAI,CAACorB,qBAAqB,GAAG,IAAI,CAACA,qBAAqB,CAACprB,IAAI,CAAC,IAAI,CAAC;IAClE,IAAI,CAACqrB,WAAW,GAAG,IAAI,CAACA,WAAW,CAACrrB,IAAI,CAAC,IAAI,CAAC;IAC9C,IAAI,CAACsrB,kBAAkB,GAAG,IAAI,CAACA,kBAAkB,CAACtrB,IAAI,CAAC,IAAI,CAAC;IAC5D,IAAI,CAACurB,uBAAuB,GAAG,IAAI,CAACA,uBAAuB,CAACvrB,IAAI,CAAC,IAAI,CAAC;IACtE,IAAI,CAACwrB,eAAe,GAAG,IAAI,CAACA,eAAe,CAACxrB,IAAI,CAAC,IAAI,CAAC;IACtD,IAAI,CAACyrB,4BAA4B,GAAG,IAAI,CAACA,4BAA4B,CAACzrB,IAAI,CAAC,IAAI,CAAC;IAChF,IAAI,CAAC0rB,OAAO,GAAG,IAAI,CAACA,OAAO,CAAC1rB,IAAI,CAAC,IAAI,CAAC;IACtC,IAAI,CAAC2rB,qBAAqB,GAAG,IAAI,CAACA,qBAAqB,CAAC3rB,IAAI,CAAC,IAAI,CAAC;IAClE,IAAI,CAAC4rB,gBAAgB,GAAG,IAAI,CAACA,gBAAgB,CAAC5rB,IAAI,CAAC,IAAI,CAAC;IACxD,IAAI,CAAC6rB,YAAY,GAAG,IAAI,CAACA,YAAY,CAAC7rB,IAAI,CAAC,IAAI,CAAC;IAChD,IAAI,CAAC8rB,iBAAiB,GAAG,IAAI,CAACA,iBAAiB,CAAC9rB,IAAI,CAAC,IAAI,CAAC;IAC1D,IAAI,CAAC+rB,eAAe,GAAG,IAAI,CAACA,eAAe,CAAC/rB,IAAI,CAAC,IAAI,CAAC;IACtD,IAAI,CAACgsB,gBAAgB,GAAG,IAAI,CAACA,gBAAgB,CAAChsB,IAAI,CAAC,IAAI,CAAC;IACxD,IAAI,CAACisB,UAAU,GAAG,IAAI,CAACA,UAAU,CAACjsB,IAAI,CAAC,IAAI,CAAC;IAC5C,IAAI,CAACksB,gBAAgB,GAAG,IAAI,CAACA,gBAAgB,CAAClsB,IAAI,CAAC,IAAI,CAAC;IACxD,IAAI,CAACokB,oBAAoB,GAAG,IAAI,CAACA,oBAAoB,CAACpkB,IAAI,CAAC,IAAI,CAAC;IAChE,IAAI,CAACmsB,mBAAmB,GAAG,IAAI,CAACA,mBAAmB,CAACnsB,IAAI,CAAC,IAAI,CAAC;IAC9D,IAAI,CAACosB,sBAAsB,GAAG,IAAI,CAACA,sBAAsB,CAACpsB,IAAI,CAAC,IAAI,CAAC;IACpE,IAAI,CAACqsB,iBAAiB,GAAG,IAAI,CAACA,iBAAiB,CAACrsB,IAAI,CAAC,IAAI,CAAC;IAC1D,IAAI,CAACssB,uBAAuB,GAAG,IAAI,CAACA,uBAAuB,CAACtsB,IAAI,CAAC,IAAI,CAAC;IACtE,IAAI,CAACusB,gBAAgB,GAAG,IAAI,CAACA,gBAAgB,CAACvsB,IAAI,CAAC,IAAI,CAAC;IACxD,IAAI,CAACwsB,uBAAuB,GAAG,IAAI,CAACA,uBAAuB,CAACxsB,IAAI,CAAC,IAAI,CAAC;IACtE,IAAI,CAACysB,2BAA2B,GAAG,IAAI,CAACA,2BAA2B,CAACzsB,IAAI,CAAC,IAAI,CAAC;IAC9E,IAAI,CAAC0sB,8BAA8B,GAAG,IAAI,CAACA,8BAA8B,CAAC1sB,IAAI,CAAC,IAAI,CAAC;IACpF,IAAI,CAAC2sB,yBAAyB,GAAG,IAAI,CAACA,yBAAyB,CAAC3sB,IAAI,CAAC,IAAI,CAAC;IAC1E,IAAI,CAAC4sB,cAAc,GAAG,IAAI,CAACA,cAAc,CAAC5sB,IAAI,CAAC,IAAI,CAAC;IACpD,IAAI,CAAC6sB,oBAAoB,GAAG,IAAI,CAACA,oBAAoB,CAAC7sB,IAAI,CAAC,IAAI,CAAC;IAChE,IAAI,CAAC8sB,iBAAiB,GAAG,IAAI,CAACA,iBAAiB,CAAC9sB,IAAI,CAAC,IAAI,CAAC;IAC1D,IAAI,CAAC+sB,iBAAiB,GAAG,IAAI,CAACA,iBAAiB,CAAC/sB,IAAI,CAAC,IAAI,CAAC;IAC1D,IAAI,CAACgtB,yBAAyB,GAAG,IAAI,CAACA,yBAAyB,CAAChtB,IAAI,CAAC,IAAI,CAAC;IAC1E,IAAI,CAACitB,aAAa,GAAG,IAAI,CAACA,aAAa,CAACjtB,IAAI,CAAC,IAAI,CAAC;IAClD,IAAI,CAACktB,gBAAgB,GAAG,IAAI,CAACA,gBAAgB,CAACltB,IAAI,CAAC,IAAI,CAAC;IACxD,IAAI,CAACmtB,iBAAiB,GAAG,IAAI,CAACA,iBAAiB,CAACntB,IAAI,CAAC,IAAI,CAAC;IAC1D,IAAI,CAACotB,eAAe,GAAG,IAAI,CAACA,eAAe,CAACptB,IAAI,CAAC,IAAI,CAAC;IACtD,IAAI,CAACqtB,cAAc,GAAG,IAAI,CAACA,cAAc,CAACrtB,IAAI,CAAC,IAAI,CAAC;IACpD,IAAI,CAACstB,iBAAiB,GAAG,IAAI,CAACA,iBAAiB,CAACttB,IAAI,CAAC,IAAI,CAAC;IAC1D,IAAI,CAACutB,qBAAqB,GAAG,IAAI,CAACA,qBAAqB,CAACvtB,IAAI,CAAC,IAAI,CAAC;IAClE,IAAI,CAACwtB,uBAAuB,GAAG,IAAI,CAACA,uBAAuB,CAACxtB,IAAI,CAAC,IAAI,CAAC;IACtE,IAAI,CAACytB,qBAAqB,GAAG,IAAI,CAACA,qBAAqB,CAACztB,IAAI,CAAC,IAAI,CAAC;IAClE,IAAI,CAAC0tB,wBAAwB,GAAG,IAAI,CAACA,wBAAwB,CAAC1tB,IAAI,CAAC,IAAI,CAAC;IACxE,IAAI,CAAC4L,eAAe,GAAG,IAAI,CAACA,eAAe,CAAC5L,IAAI,CAAC,IAAI,CAAC;IACtD,IAAI,CAAC2tB,uBAAuB,GAAG,IAAI,CAACA,uBAAuB,CAAC3tB,IAAI,CAAC,IAAI,CAAC;IACtE,IAAI,CAAC4tB,uBAAuB,GAAG,IAAI,CAACA,uBAAuB,CAAC5tB,IAAI,CAAC,IAAI,CAAC;IACtE,IAAI,CAAC6tB,YAAY,GAAG,IAAI,CAACA,YAAY,CAAC7tB,IAAI,CAAC,IAAI,CAAC;IAChD,IAAI,CAACkC,mBAAmB,GAAG,IAAI,CAACA,mBAAmB,CAAClC,IAAI,CAAC,IAAI,CAAC;IAC9D,IAAI,CAAC8tB,wBAAwB,GAAG,IAAI,CAACA,wBAAwB,CAAC9tB,IAAI,CAAC,IAAI,CAAC;IACxE,IAAI,CAAC+tB,2BAA2B,GAAG,IAAI,CAACA,2BAA2B,CAAC/tB,IAAI,CAAC,IAAI,CAAC;IAC9E,IAAI,CAACguB,uBAAuB,GAAG,IAAI,CAACA,uBAAuB,CAAChuB,IAAI,CAAC,IAAI,CAAC;IACtE,IAAI,CAACiuB,uBAAuB,GAAG,IAAI,CAACA,uBAAuB,CAACjuB,IAAI,CAAC,IAAI,CAAC;IACtE,IAAI,CAACkuB,iBAAiB,GAAG,IAAI,CAACA,iBAAiB,CAACluB,IAAI,CAAC,IAAI,CAAC;IAC1D,IAAI,CAACmuB,qBAAqB,GAAG,IAAI,CAACA,qBAAqB,CAACnuB,IAAI,CAAC,IAAI,CAAC;IAClE,IAAI,CAACouB,uBAAuB,GAAG,IAAI,CAACA,uBAAuB,CAACpuB,IAAI,CAAC,IAAI,CAAC;IACtE,IAAI,CAACquB,qBAAqB,GAAG,IAAI,CAACA,qBAAqB,CAACruB,IAAI,CAAC,IAAI,CAAC;IAClE,IAAI,CAACsuB,eAAe,GAAG,IAAI,CAACA,eAAe,CAACtuB,IAAI,CAAC,IAAI,CAAC;IACtD,IAAI,CAACuuB,kBAAkB,GAAG,IAAI,CAACA,kBAAkB,CAACvuB,IAAI,CAAC,IAAI,CAAC;IAC5D,IAAI,CAAC8L,yBAAyB,GAAG,IAAI,CAACA,yBAAyB,CAAC9L,IAAI,CAAC,IAAI,CAAC;IAC1E,IAAI,CAACwuB,gCAAgC,GAAG,IAAI,CAACA,gCAAgC,CAACxuB,IAAI,CAAC,IAAI,CAAC;IACxF,IAAI,CAACyuB,0BAA0B,GAAG,IAAI,CAACA,0BAA0B,CAACzuB,IAAI,CAAC,IAAI,CAAC;IAC5E,IAAI,CAAC0uB,mBAAmB,GAAG,IAAI,CAACA,mBAAmB,CAAC1uB,IAAI,CAAC,IAAI,CAAC;IAC9D,IAAI,CAAC2uB,uBAAuB,GAAG,IAAI,CAACA,uBAAuB,CAAC3uB,IAAI,CAAC,IAAI,CAAC;IACtE,IAAI,CAAC4uB,yBAAyB,GAAI,IAAI,CAACA,yBAAyB,CAAC5uB,IAAI,CAAC,IAAI,CAAC;IAE3E,IAAI,CAAC6uB,uBAAuB,GAAG,IAAI,CAACA,uBAAuB,CAAC7uB,IAAI,CAAC,IAAI,CAAC;IACtE,IAAI,CAAC8uB,uBAAuB,GAAG,IAAI,CAACA,uBAAuB,CAAC9uB,IAAI,CAAC,IAAI,CAAC;IAEtE,IAAI,CAAC+uB,oBAAoB,GAAG,IAAI,CAACA,oBAAoB,CAAC/uB,IAAI,CAAC,IAAI,CAAC;IAChE,IAAI,CAACgvB,oBAAoB,GAAG,IAAI,CAACA,oBAAoB,CAAChvB,IAAI,CAAC,IAAI,CAAC;IAChE,IAAI,CAACivB,iBAAiB,GAAG,IAAI,CAACA,iBAAiB,CAACjvB,IAAI,CAAC,IAAI,CAAC;IAC1D,IAAI,CAACkvB,iBAAiB,GAAG,IAAI,CAACA,iBAAiB,CAAClvB,IAAI,CAAC,IAAI,CAAC;IAC1D,IAAI,CAACmvB,eAAe,GAAG,IAAI,CAACA,eAAe,CAACnvB,IAAI,CAAC,IAAI,CAAC;IAEtD,IAAI,CAACovB,gBAAgB,GAAG,IAAI,CAACA,gBAAgB,CAACpvB,IAAI,CAAC,IAAI,CAAC;IACxD,IAAI,CAACqvB,iBAAiB,GAAG,IAAI,CAACA,iBAAiB,CAACrvB,IAAI,CAAC,IAAI,CAAC;IAC1D,IAAI,CAAC4V,gBAAgB,GAAG,IAAI,CAACA,gBAAgB,CAAC5V,IAAI,CAAC,IAAI,CAAC;IACxD,IAAI,CAACsvB,mBAAmB,GAAG,IAAI,CAACA,mBAAmB,CAACtvB,IAAI,CAAC,IAAI,CAAC;IAC9D,IAAI,CAACuvB,sBAAsB,GAAG,IAAI,CAACA,sBAAsB,CAACvvB,IAAI,CAAC,IAAI,CAAC;IACpE,IAAI,CAACwvB,oBAAoB,GAAG,IAAI,CAACA,oBAAoB,CAACxvB,IAAI,CAAC,IAAI,CAAC;IAEhE,IAAI,CAACyvB,gBAAgB,GAAG,IAAI,CAACA,gBAAgB,CAACzvB,IAAI,CAAC,IAAI,CAAC;IAExD,IAAI,CAAC0vB,kBAAkB,GAAG,IAAI,CAACA,kBAAkB,CAAC1vB,IAAI,CAAC,IAAI,CAAC;IAG5D,IAAI,CAAC2vB,gBAAgB,GAAG,IAAI;EAC9B;EAEA5E,aAAa,GAAG;IACd,MAAMrD,QAAQ,GAAGlxB,wEAA0B,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IAC7D,MAAM8a,OAAO,GAAG,CAAC,CAAC9a,wEAA0B,CAAC,gBAAgB,CAAC;IAE9D,OAAO;MACL+P,SAAS,EAAE,KAAK;MAEhBqR,KAAK,EAAE,KAAK;MAEZgY,SAAS,EAAE,KAAK;MAChBjJ,SAAS,EAAEe,QAAQ,CAACf,SAAS,IAAI,IAAI;MACrCpjB,aAAa,EAAEmkB,QAAQ,CAACnkB,aAAa,IAAIvN,uEAAmB,EAAE;MAC9D4wB,gBAAgB,EAAEc,QAAQ,CAACd,gBAAgB,KAAKl0B,SAAS,GACvD4D,sEAAkB,EAAE,GAAGoxB,QAAQ,CAACd,gBAAgB;MAClDtjB,aAAa,EAAE,eAAe;MAE9B/C,aAAa,EAAE,CAACmnB,QAAQ,CAACmI,gBAAgB;MACzCnvB,aAAa,EAAE,KAAK;MAEpBD,aAAa,EAAE6Q,OAAO,IAAI,CAAC,CAACoW,QAAQ,CAACjnB,aAAa;MAElDD,oBAAoB,EAAE,CAAClK,sEAAkB,EAAE,IAAIC,+DAAW,EAAE,KACzD,OAAO4yB,uDAAe,IAAI,WAAY,IAAK,OAAOhwB,SAAS,IAAI,WAAY,IAC3E,OAAO22B,aAAa,IAAI,WAAY;MACvCC,aAAa,EAAEze,OAAO,GAAG9a,wEAA0B,CAAC,gBAAgB,CAAC,GAAG,IAAI;MAE5EmhB,kBAAkB,EAAE,CAAC7rB,QAAQ,CAACkkC,MAAM;MAEpCxf,SAAS,EAAE,EAAE;MACbD,UAAU,EAAE,IAAI;MAChB8X,WAAW,EAAE31B,SAAS;MACtB41B,eAAe,EAAE,IAAI;MAErB2H,iBAAiB,EAAE,OAAO;MAC1BC,cAAc,EAAE,IAAI;MACpBC,eAAe,EAAE,IAAI;MACrBC,eAAe,EAAE,EAAE;MACnB7H,kBAAkB,EAAE,KAAK;MAEzBthB,KAAK,EAAE,EAAE;MACT5E,QAAQ,EAAE,EAAE;MACZiP,OAAO,EAAEA,OAAO;MAChBvM,QAAQ,EAAE,IAAI;MACdsrB,cAAc,EAAEl3B,SAAS,CAACm3B,MAAM;MAChC9pB,aAAa,EAAE,EAAE;MACjB+pB,mBAAmB,EAAE,KAAK;MAC1BC,gBAAgB,EAAE,IAAI;MACtBpW,cAAc,EAAE,IAAI;MACpBoO,aAAa,EAAE,KAAK;MACpBlY,aAAa,EAAGpgB,MAAM,CAACugC,UAAU,IAAI9pC,yDAAiB;MACtD+pC,SAAS,EAAEh+B,SAAS;MACpBi+B,WAAW,EAAE,WAAW;MAGxB/W,SAAS,EAAElnB,SAAS;MACpBc,SAAS,EAAElL,2DAAe;MAC1B64B,aAAa,EAAEzuB,SAAS;MAGxBk+B,eAAe,EAAE,KAAK;MAEtBC,kBAAkB,EAAE,KAAK;MACzBC,iBAAiB,EAAE,IAAI;MACvBC,kBAAkB,EAAE,IAAI;MACxBC,iBAAiB,EAAE,IAAI;MACvBC,gBAAgB,EAAE,EAAE;MAEpBC,oBAAoB,EAAE,KAAK;MAC3B7X,cAAc,EAAE,IAAI;MAGpB8X,YAAY,EAAE,KAAK;MACnBC,WAAW,EAAE,CAAC,CAAC;MAGf5rB,QAAQ,EAAE,EAAE;MAEZ0f,aAAa,EAAE,EAAE;MAEjBzU,kBAAkB,EAAE,EAAE;MAEtBvH,aAAa,EAAExW,SAAS;MACxBm2B,UAAU,EAAEn2B,SAAS;MACrBk2B,QAAQ,EAAEl2B,SAAS;MACnBo2B,SAAS,EAAEp2B,SAAS;MAEpB2+B,cAAc,EAAE3+B;IAClB,CAAC;EACH;EAEAikB,iBAAiB,GAAG;IAClBzmB,MAAM,CAAC2mB,gBAAgB,CAAC,QAAQ,EAAE,IAAI,CAACmU,YAAY,CAAC;IACpD96B,MAAM,CAAC2mB,gBAAgB,CAAC,QAAQ,EAAGjU,CAAC,IAAK;MAAE,IAAI,CAACsoB,YAAY,CAAC,IAAI,CAAC;IAAE,CAAC,CAAC;IACtEh7B,MAAM,CAAC2mB,gBAAgB,CAAC,SAAS,EAAGjU,CAAC,IAAK;MAAE,IAAI,CAACsoB,YAAY,CAAC,KAAK,CAAC;IAAE,CAAC,CAAC;IACxEh7B,MAAM,CAAC2mB,gBAAgB,CAAC,YAAY,EAAE,IAAI,CAACoU,eAAe,CAAC;IAG3D,IAAI,OAAOqG,gBAAgB,IAAI,UAAU,EAAE;MACzC,MAAMC,oBAAoB,GAAG,IAAID,gBAAgB,CAAC,WAAW,CAAC;MAC9DC,oBAAoB,CAAC1a,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAACyW,iBAAiB,CAAC;IAC1E,CAAC,MAAM;MAELh/B,OAAO,CAACuH,IAAI,CAAC,qFAAqF,CAAC;IACrG;IAGA/J,QAAQ,CAAC+qB,gBAAgB,CAAC,kBAAkB,EAAE,IAAI,CAACuU,qBAAqB,CAAC;IAEzE,IAAI,CAAChpB,QAAQ,CAAC;MACZnO,aAAa,EAAEnI,QAAQ,CAAC0lC,eAAe,CAACC,WAAW;MACnDC,cAAc,EAAE5lC,QAAQ,CAAC0lC,eAAe,CAACG;IAC3C,CAAC,CAAC;IAEF,IAAI5mC,OAAO,CAAC,CAACC,OAAO,EAAEC,MAAM,KAAK;MAC/B,IAAI,CAACkW,MAAM,GAAG0pB,SAAS,CAAC+G,OAAO,CAAC,IAAI,CAACn+B,KAAK,CAAC8P,aAAa,EAAEjN,sEAAkB,EAAE,EAAE,IAAI,CAAC7C,KAAK,CAACkzB,SAAS,EAClG,IAAI,CAAC7mB,KAAK,CAACgD,IAAI,CAAC5J,MAAM,EAAE,IAAI,CAACzF,KAAK,CAAC6d,OAAO,EAAEtmB,OAAO,CAAC;MACtD,IAAI,CAACmW,MAAM,CAAC0wB,SAAS,GAAG,IAAI,CAACrG,eAAe;MAC5C,IAAI,CAACrqB,MAAM,CAAC2wB,YAAY,GAAG,IAAI,CAAClG,gBAAgB;MAChD,IAAI,CAACzqB,MAAM,CAAC4wB,wBAAwB,GAAG,IAAI,CAACtG,4BAA4B;MACxE,IAAI,CAACtqB,MAAM,CAAC6wB,aAAa,GAAG,IAAI,CAAC/C,iBAAiB;MAClD,IAAI,CAAC9tB,MAAM,CAAC8wB,aAAa,GAAG,IAAI,CAAC/C,iBAAiB;IACpD,CAAC,CAAC,CAAC/5B,IAAI,CAACpI,CAAC,IAAI;MAEX,IAAI,IAAI,CAAC0G,KAAK,CAAC+M,oBAAoB,EAAE;QACnC,IAAI,CAAC4sB,eAAe,EAAE,CAAC33B,KAAK,CAAC1I,CAAC,IAAI,CAGlC,CAAC,CAAC;MACJ;MAGA,MAAMmlC,SAAS,GAAG36B,wEAA2B,CAACrH,MAAM,CAACgG,QAAQ,CAACuB,IAAI,CAAC;MAGnE,IAAI,CAACu0B,gBAAgB,EAAE;MAEvB,MAAMxG,KAAK,GAAG,IAAI,CAAC/xB,KAAK,CAAC6d,OAAO,GAAG9a,wEAA0B,CAAC,YAAY,CAAC,GAAG9D,SAAS;MACvF,IAAI8yB,KAAK,EAAE;QACT,IAAI,CAACpjB,QAAQ,CAAC;UAACwtB,SAAS,EAAE;QAAI,CAAC,CAAC;QAGhCpK,KAAK,CAAC2M,OAAO,GAAG,IAAI54B,IAAI,CAACisB,KAAK,CAAC2M,OAAO,CAAC;QACvC,IAAI,CAAChxB,MAAM,CAACixB,YAAY,CAAC5M,KAAK,CAAC;QAC/B,IAAI,CAACrkB,MAAM,CAACiH,OAAO,EAAE,CAAC3S,KAAK,CAACnK,GAAG,IAAI;UAEjC,IAAI,CAAC+/B,WAAW,CAAC//B,GAAG,CAACwK,OAAO,EAAE,KAAK,CAAC;QACtC,CAAC,CAAC;MACJ;MAEA,IAAI,CAACu8B,SAAS,GAAG,IAAI;MACrB,IAAI,CAACC,iBAAiB,GAAG,IAAI;MAG7B,IAAI,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,UAAU,CAAC,CAAClmC,QAAQ,CAAC8lC,SAAS,CAACt6B,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE;QAE9D,IAAI,CAACwK,QAAQ,CAAC;UAACivB,cAAc,EAAEa,SAAS,CAACt6B,IAAI,CAAC,CAAC;QAAC,CAAC,CAAC;QAClD,MAAMA,IAAI,GAAGs6B,SAAS,CAACv6B,MAAM,IAAIu6B,SAAS,CAACv6B,MAAM,CAAC46B,SAAS,GACzDh7B,uEAA0B,CAAC,EAAE,EAAE,WAAW,EAAE26B,SAAS,CAACv6B,MAAM,CAAC46B,SAAS,CAAC,GACvE,EAAE;QACJh7B,sEAAyB,CAACK,IAAI,CAAC;MACjC,CAAC,MAAM;QACL,IAAI,CAACqzB,eAAe,EAAE;MACxB;IACF,CAAC,CAAC;EACJ;EAEA9e,oBAAoB,GAAG;IACrBjc,MAAM,CAAC4mB,mBAAmB,CAAC,QAAQ,EAAE,IAAI,CAACkU,YAAY,CAAC;IACvD96B,MAAM,CAAC4mB,mBAAmB,CAAC,YAAY,EAAE,IAAI,CAACmU,eAAe,CAAC;IAC9Dn/B,QAAQ,CAACgrB,mBAAmB,CAAC,kBAAkB,EAAE,IAAI,CAACsU,qBAAqB,CAAC;EAC9E;EAGA,OAAOwG,OAAO,CAACruB,aAAa,EAAEqjB,gBAAgB,EAAED,SAAS,EAAEztB,MAAM,EAAEs5B,eAAe,EAAEC,gBAAgB,EAAE;IACpG,MAAMtxB,MAAM,GAAG,IAAI1E,8CAAM,CAAC;MAACi2B,OAAO,EAAE/sC,iDAAQ;MAAEsQ,IAAI,EAAEsN,aAAa;MAAEovB,MAAM,EAAE/sC,gDAAO;MAAE+gC,SAAS,EAAEA,SAAS;MACtGiM,MAAM,EAAEhM,gBAAgB;MAAEtV,OAAO,EAAEkhB;IAAe,CAAC,EAAEC,gBAAgB,CAAC;IACxEtxB,MAAM,CAAC0xB,gBAAgB,CAAC35B,MAAM,CAAC;IAC/BiI,MAAM,CAAC2xB,aAAa,CAAC7sC,wDAAe,EAAE,IAAI,CAAC;IAC3C,OAAOkb,MAAM;EACf;EAGAmsB,iBAAiB,CAACyF,OAAO,EAAE;IACzB,IAAI,CAAC5xB,MAAM,CAAC6xB,eAAe,CAACD,OAAO,CAAC/pC,IAAI,IAAI,CAAC,CAAC,CAAC;EACjD;EAEAokC,eAAe,GAAG;IAChB,MAAM;MAACr5B,aAAa;MAAEmF;IAAM,CAAC,GAAG,IAAI,CAAC4G,KAAK,CAACgD,IAAI;IAC/C,MAAMhV,OAAO,GAAG,CAACsuB,GAAG,EAAE9wB,GAAG,KAAK;MAC5BgD,OAAO,CAAClB,KAAK,CAACgvB,GAAG,EAAE9wB,GAAG,CAAC;MACvB,IAAI,CAAC+/B,WAAW,CAACt3B,aAAa,CAAC1C,QAAQ,CAACg5B,gBAAgB,CAAC,EAAE,KAAK,CAAC;MACjE,IAAI,CAACjoB,QAAQ,CAAC;QAAC2tB,aAAa,EAAE;MAAI,CAAC,CAAC;MACpCv5B,2EAA6B,CAAC,UAAU,EAAE;QAACiK,aAAa,EAAE;MAAK,CAAC,CAAC;IACnE,CAAC;IAED,IAAI;MACF,IAAI,CAACwyB,GAAG,GAAG5J,gEAAoB,CAACF,2DAAe,CAAC2G,aAAa,EAAEnqC,iDAAQ,CAAC,CAAC;MACzE,OAAOwT,SAAS,CAAC+5B,aAAa,CAACC,eAAe,CAAC,oBAAoB,CAAC,CAACh+B,IAAI,CAACi+B,GAAG,IAAI;QAC/E,OAAOA,GAAG,IAAIj6B,SAAS,CAAC+5B,aAAa,CAACzL,QAAQ,CAAC,oBAAoB,CAAC,CAACtyB,IAAI,CAACi+B,GAAG,IAAI;UAC/E,IAAI,CAACjI,iBAAiB,CAACiI,GAAG,CAAC;UAC3B,OAAOA,GAAG;QACZ,CAAC,CAAC;MACJ,CAAC,CAAC,CAACj+B,IAAI,CAACi+B,GAAG,IAAI;QAEb,CAACA,GAAG,CAACC,MAAM,IAAID,GAAG,CAACE,UAAU,EAAEC,WAAW,CAAC18B,IAAI,CAACC,SAAS,CAAC;UAACoC,MAAM,EAAEA,MAAM;UAAEwY,OAAO,EAAEhsB,yDAAeA;QAAA,CAAC,CAAC,CAAC;QAEtG,OAAOmlC,SAAS,CAAC2I,eAAe,CAAC,IAAI,CAACP,GAAG,EAAEG,GAAG,CAAC;MACjD,CAAC,CAAC,CAACj+B,IAAI,CAACqwB,KAAK,IAAI;QACf,MAAMlU,OAAO,GAAG9a,wEAA0B,CAAC,gBAAgB,CAAC;QAC5D,IAAIgvB,KAAK,IAAI,IAAI,CAAC/xB,KAAK,CAACs8B,aAAa,EAAE;UACrC,IAAI,CAAC5uB,MAAM,CAACsyB,cAAc,CAACjO,KAAK,CAAC;UACjC,IAAIlU,OAAO,EAAE;YACX9a,wEAA0B,CAAC,gBAAgB,EAAEgvB,KAAK,CAAC;UACrD;QACF;QACA,IAAI,CAACpjB,QAAQ,CAAC;UAAC2tB,aAAa,EAAEvK,KAAK;UAAE/kB,aAAa,EAAE;QAAI,CAAC,CAAC;QAC1D,IAAI6Q,OAAO,EAAE;UACX9a,2EAA6B,CAAC,UAAU,EAAE;YAACiK,aAAa,EAAE;UAAI,CAAC,CAAC;QAClE;QAKAkpB,6DAAiB,CAAC,IAAI,CAACsJ,GAAG,EAAEF,OAAO,IAAI;UAAE,IAAI,CAACzF,iBAAiB,CAACyF,OAAO,CAAC;QAAE,CAAC,CAAC;MAC9E,CAAC,CAAC,CAACt9B,KAAK,CAACnK,GAAG,IAAI;QAEdwC,OAAO,CAACxC,GAAG,CAAC;QACZ,MAAMA,GAAG;MACX,CAAC,CAAC;IACJ,CAAC,CAAC,OAAOA,GAAG,EAAE;MACZwC,OAAO,CAACxC,GAAG,CAAC;MACZ,OAAOP,OAAO,CAACE,MAAM,CAACK,GAAG,CAAC;IAC5B;EACF;EAGA,OAAOkoC,eAAe,CAACP,GAAG,EAAES,EAAE,EAAE;IAC9B,OAAOnK,4DAAgB,CAAC0J,GAAG,EAAE;MAC3BU,yBAAyB,EAAED,EAAE;MAC7BE,QAAQ,EAAE9D,aAAa,CAAC+D;IAC1B,CAAC,CAAC,CAAC1+B,IAAI,CAACqwB,KAAK,IAAI;MACf,IAAIA,KAAK,EAAE;QACT,OAAOA,KAAK;MACd,CAAC,MAAM;QAEL,OAAOsO,YAAY,CAACC,iBAAiB,EAAE,CAAC5+B,IAAI,CAAC6+B,UAAU,IAAI;UACzD,IAAIA,UAAU,KAAK,SAAS,EAAE;YAC5B,OAAOzK,4DAAgB,CAAC0J,GAAG,EAAE;cAC3BU,yBAAyB,EAAEP,GAAG;cAC9BQ,QAAQ,EAAE9D,aAAa,CAAC+D;YAC1B,CAAC,CAAC,CAAC1+B,IAAI,CAACqwB,KAAK,IAAI;cACf,IAAIA,KAAK,EAAE;gBACT,OAAOA,KAAK;cACd,CAAC,MAAM;gBACL,MAAM,IAAIj6B,KAAK,CAAC,oCAAoC,CAAC;cACvD;YACF,CAAC,CAAC;UACJ,CAAC,MAAM;YACL,MAAM,IAAIA,KAAK,CAAC,uCAAuC,GAAGyoC,UAAU,CAAC;UACvE;QACF,CAAC,CAAC;MACJ;IACF,CAAC,CAAC;EACJ;EAEAhJ,YAAY,GAAG;IACb,MAAMiJ,MAAM,GAAGnoC,QAAQ,CAAC0lC,eAAe,CAACC,WAAW,IAAI9qC,yDAAgB;IACvE,IAAI,CAACyb,QAAQ,CAAC;MACZnO,aAAa,EAAEnI,QAAQ,CAAC0lC,eAAe,CAACC,WAAW;MACnDC,cAAc,EAAE5lC,QAAQ,CAAC0lC,eAAe,CAACG;IAC3C,CAAC,CAAC;IACF,IAAI,IAAI,CAACl+B,KAAK,CAAC6c,aAAa,IAAI2jB,MAAM,EAAE;MACtC,IAAI,CAAC7xB,QAAQ,CAAC;QAACkO,aAAa,EAAE2jB;MAAM,CAAC,CAAC;IACxC;EACF;EAGA9I,iBAAiB,CAACiI,GAAG,EAAE;IACrBA,GAAG,CAACc,aAAa,GAAGnnC,CAAC,IAAI;MACvB,MAAMonC,gBAAgB,GAAGf,GAAG,CAACE,UAAU;MACvCa,gBAAgB,CAACC,aAAa,GAAGrnC,CAAC,IAAI;QACpC,IAAIonC,gBAAgB,CAAC1gC,KAAK,IAAI,WAAW,IAAI0F,SAAS,CAAC+5B,aAAa,CAACmB,UAAU,EAAE;UAC/E,MAAMjY,GAAG,GAAG,0HACV,2DAAC,wDAAgB;YAAC,EAAE,oBAAmB;YACrC,cAAc;cAAA;cAAA;YAAA;UAAoB,EAC6B,KAAC;YAAG,IAAI,EAAC;UAAE,GAC1E,2DAAC,wDAAgB;YAAC,EAAE,iBAAgB;YAClC,cAAc;cAAA;cAAA;YAAA;UAAS,EACwD,CAC/E,KAAC,CAAG;UACV,IAAI,CAACiP,WAAW,CAACjP,GAAG,EAAE,MAAM,CAAC;QAC/B;MACF,CAAC;IACH,CAAC;EACH;EAGA6O,eAAe,GAAG;IAChB,MAAMxzB,IAAI,GAAGF,wEAA2B,CAACrH,MAAM,CAACgG,QAAQ,CAACuB,IAAI,CAAC;IAE9D,MAAMkL,QAAQ,GAAG;MACf+tB,SAAS,EAAEj5B,IAAI,CAACE,MAAM,CAACmB,IAAI;MAC3Bw7B,mBAAmB,EAAE78B,IAAI,CAACE,MAAM,CAAC48B;IACnC,CAAC;IAED,IAAI98B,IAAI,CAACG,IAAI,IAAIH,IAAI,CAACG,IAAI,CAACrL,MAAM,GAAG,CAAC,EAAE;MAErC,IAAI,CAAC,UAAU,EAAC,UAAU,EAAC,MAAM,EAAC,OAAO,EAAC,UAAU,EAAC,SAAS,EAAC,SAAS,EAAC,MAAM,EAC3E,MAAM,EAAC,OAAO,EAAC,QAAQ,EAAC,SAAS,EAAC,SAAS,EAAC,UAAU,EAAC,EAAE,CAAC,CAACH,QAAQ,CAACqL,IAAI,CAACG,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE;QACrF+K,QAAQ,CAACstB,iBAAiB,GAAGx4B,IAAI,CAACG,IAAI,CAAC,CAAC,CAAC;MAC3C,CAAC,MAAM;QACLtJ,OAAO,CAACuH,IAAI,CAAC,wBAAwB,EAAE4B,IAAI,CAACG,IAAI,CAAC,CAAC,CAAC,CAAC;MACtD;MAGA,IAAIiY,SAAS,GAAGpY,IAAI,CAACG,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI;MACpC,IAAIiY,SAAS,IAAI,IAAI,CAACpc,KAAK,CAAC+S,aAAa,EAAE;QACzC,IAAI,CAAC/J,wDAAgB,CAACoT,SAAS,CAAC,EAAE;UAEhCA,SAAS,GAAG,IAAI;QAClB;QACAzY,MAAM,CAACC,MAAM,CAACsL,QAAQ,EAAE;UACtB6D,aAAa,EAAEqJ,SAAS;UACxB2gB,gBAAgB,EAAE,IAAI,CAACrvB,MAAM,CAACszB,kBAAkB,CAAC5kB,SAAS;QAC5D,CAAC,CAAC;MACJ;IACF,CAAC,MAAM;MAELzY,MAAM,CAACC,MAAM,CAACsL,QAAQ,EAAE;QAACstB,iBAAiB,EAAE,EAAE;QAAEzpB,aAAa,EAAE;MAAI,CAAC,CAAC;IACvE;IAGA,IAAI/O,IAAI,CAACE,MAAM,CAAC+8B,MAAM,EAAE;MACtB/xB,QAAQ,CAACkmB,UAAU,GAAGpxB,IAAI,CAACE,MAAM,CAAC+8B,MAAM;IAC1C;IACA,IAAIj9B,IAAI,CAACE,MAAM,CAACkjB,IAAI,EAAE;MACpBlY,QAAQ,CAACimB,QAAQ,GAAGnxB,IAAI,CAACE,MAAM,CAACkjB,IAAI;IACtC;IACA,IAAIpjB,IAAI,CAACE,MAAM,CAAC6tB,KAAK,EAAE;MACrB7iB,QAAQ,CAACmmB,SAAS,GAAGrxB,IAAI,CAACE,MAAM,CAAC6tB,KAAK;IACxC;IAGA,IAAI/tB,IAAI,CAACE,MAAM,CAAC46B,SAAS,EAAE;MACzBn7B,MAAM,CAACC,MAAM,CAACsL,QAAQ,EACpBkoB,SAAS,CAAC8J,aAAa,CAAC,IAAI,CAAC70B,KAAK,CAACgD,IAAI,CAAC/O,aAAa,CAAC1C,QAAQ,CAACu5B,2BAA2B,CAAC,EAAE,MAAM,CAAC,CAAC;IACzG;IAEA,IAAI,CAACxoB,QAAQ,CAACO,QAAQ,CAAC;EACzB;EAEAuoB,YAAY,CAAC1R,MAAM,EAAE;IACnB,IAAIA,MAAM,EAAE;MACV,IAAI,CAAC6R,WAAW,EAAE;MAClBtP,aAAa,CAAC,IAAI,CAAC6Y,kBAAkB,CAAC;MACtC,IAAI,CAACzzB,MAAM,CAAC0zB,SAAS,EAAE;IACzB,CAAC,MAAM;MACL,IAAI,CAACxJ,WAAW,CAAC,IAAI,CAACvrB,KAAK,CAACgD,IAAI,CAAC/O,aAAa,CAAC1C,QAAQ,CAACk5B,aAAa,CAAC,EAAE,MAAM,CAAC;IACjF;IACA,IAAI,CAACnoB,QAAQ,CAAC;MAACiuB,cAAc,EAAE7W;IAAM,CAAC,CAAC;EACzC;EAEA4R,qBAAqB,GAAG;IACtB,IAAI,CAAChpB,QAAQ,CAAC;MAACuV,kBAAkB,EAAE,CAAC7rB,QAAQ,CAACkkC;IAAM,CAAC,CAAC;EACvD;EAEA,OAAO2E,aAAa,CAACrpC,GAAG,EAAEwpC,KAAK,EAAE/uB,MAAM,EAAEgvB,UAAU,EAAE;IACnD,OAAO;MACLvkB,SAAS,EAAEllB,GAAG;MACdilB,UAAU,EAAEukB,KAAK;MACjBzM,WAAW,EAAEtiB,MAAM;MACnBuiB,eAAe,EAAEyM,UAAU;MAC3BnE,eAAe,EAAE;IACnB,CAAC;EACH;EAEAvF,WAAW,CAAC//B,GAAG,EAAEwpC,KAAK,EAAE/uB,MAAM,EAAEgvB,UAAU,EAAE;IAC1C,IAAI,CAAC3yB,QAAQ,CAACyoB,SAAS,CAAC8J,aAAa,CAACrpC,GAAG,EAAEwpC,KAAK,EAAE/uB,MAAM,EAAEgvB,UAAU,CAAC,CAAC;EACxE;EAGAzJ,kBAAkB,CAACrkB,KAAK,EAAE5E,QAAQ,EAAE;IAClC,IAAI,CAACD,QAAQ,CAAC;MACZomB,aAAa,EAAE,IAAI;MACnBvhB,KAAK,EAAEA,KAAK;MACZ5E,QAAQ,EAAEA,QAAQ;MAClBkmB,kBAAkB,EAAE,IAAI;MACxBqH,SAAS,EAAE;IACb,CAAC,CAAC;IACF,IAAI,CAACvE,WAAW,CAAC,EAAE,EAAE,IAAI,CAAC;IAE1B,IAAI,IAAI,CAAClqB,MAAM,CAAC6zB,WAAW,EAAE,EAAE;MAC7B,IAAI,CAACtJ,OAAO,CAACzkB,KAAK,EAAE5E,QAAQ,EAAE,IAAI,EAAE;QAACmC,IAAI,EAAE,IAAI,CAAC/Q,KAAK,CAACo1B,UAAU;QAAE9L,IAAI,EAAE,IAAI,CAACtpB,KAAK,CAACm1B;MAAQ,CAAC,CAAC;IAC/F,CAAC,MAAM;MACL,IAAI,CAACznB,MAAM,CAACiH,OAAO,EAAE,CAAC3S,KAAK,CAACnK,GAAG,IAAI;QAEjC,IAAI,CAAC8W,QAAQ,CAAC;UAAComB,aAAa,EAAE,KAAK;UAAEoH,SAAS,EAAE,KAAK;UAAErH,kBAAkB,EAAE;QAAK,CAAC,CAAC;QAClF,IAAI,CAAC8C,WAAW,CAAC//B,GAAG,CAACwK,OAAO,EAAE,KAAK,CAAC;MACtC,CAAC,CAAC;IACJ;IAEA,IAAI,IAAI,CAACrC,KAAK,CAAC+M,oBAAoB,IAAI,CAAC,IAAI,CAAC/M,KAAK,CAACs8B,aAAa,EAAE;MAGhE,IAAI,CAAC3C,eAAe,EAAE;IACxB;EACF;EAGA7B,uBAAuB,CAACja,OAAO,EAAE;IAC/B,IAAIA,OAAO,EAAE;MACX,IAAI,CAACnQ,MAAM,CAAC8zB,WAAW,EAAE,CAAC9/B,IAAI,CAACpI,CAAC,IAAI;QAClCyJ,wEAA0B,CAAC,gBAAgB,EAAE,IAAI,CAAC;QAClD,IAAI,CAAC4L,QAAQ,CAAC;UAACkP,OAAO,EAAE;QAAI,CAAC,CAAC;MAChC,CAAC,CAAC;IACJ,CAAC,MAAM;MACL,IAAI,CAACnQ,MAAM,CAAC+zB,YAAY,EAAE,CAAC//B,IAAI,CAACpI,CAAC,IAAI;QACnCyJ,wEAA0B,CAAC,gBAAgB,EAAE,KAAK,CAAC;QACnD,IAAI,CAAC4L,QAAQ,CAAC;UAACkP,OAAO,EAAE;QAAK,CAAC,CAAC;MACjC,CAAC,CAAC;IACJ;EACF;EAGAka,eAAe,GAAG;IAEhBzP,aAAa,CAAC,IAAI,CAAC6Y,kBAAkB,CAAC;IACtC,IAAI,CAACvJ,WAAW,EAAE;IAElB,MAAM1zB,MAAM,GAAG,IAAI,CAACwJ,MAAM,CAACg0B,aAAa,EAAE;IAC1C,IAAI,CAAC/yB,QAAQ,CAAC;MACZkB,aAAa,EAAE3L,MAAM,CAACy9B,GAAG,GAAG,GAAG,IAAIz9B,MAAM,CAACmW,KAAK,GAAGnW,MAAM,CAACmW,KAAK,GAAG,MAAM,CAAC;MAExE5E,aAAa,EAAE,CAAC,CAACvR,MAAM,CAAC09B,OAAO,IAAI,CAAC,CAAC,EAAE1zB,IAAI,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI;IAC3D,CAAC,CAAC;IAEF,IAAI,IAAI,CAAClO,KAAK,CAACm8B,SAAS,EAAE;MACxB,IAAI,CAAClE,OAAO,CAAC,IAAI,CAACj4B,KAAK,CAACwT,KAAK,EAAE,IAAI,CAACxT,KAAK,CAAC4O,QAAQ,EAAE,IAAI,EACtD;QAACmC,IAAI,EAAE,IAAI,CAAC/Q,KAAK,CAACo1B,UAAU;QAAE9L,IAAI,EAAE,IAAI,CAACtpB,KAAK,CAACm1B;MAAQ,CAAC,CAAC;IAC7D;EACF;EAGA6C,4BAA4B,CAACvwB,GAAG,EAAEo6B,IAAI,EAAE;IACtCvZ,aAAa,CAAC,IAAI,CAAC6Y,kBAAkB,CAAC;IAEtC,IAAI15B,GAAG,GAAG,CAAC,EAAE;MAEX,IAAI,CAACmwB,WAAW,EAAE;MAClB;IACF;IAEA,IAAIiK,IAAI,EAAE;MAERA,IAAI,CAACngC,IAAI,CAACpI,CAAC,IAAI;QAEb,IAAI,CAACs+B,WAAW,EAAE;MACpB,CAAC,CAAC,CAAC51B,KAAK,CAACnK,GAAG,IAAI;QACd,IAAI,CAAC+/B,WAAW,CAAC//B,GAAG,CAACwK,OAAO,EAAE,KAAK,CAAC;MACtC,CAAC,CAAC;MACF;IACF;IAEA,MAAM;MAAC/B;IAAa,CAAC,GAAG,IAAI,CAAC+L,KAAK,CAACgD,IAAI;IACvC,IAAItH,KAAK,GAAGN,GAAG,GAAG,IAAI;IACtBM,KAAK,GAAGA,KAAK,GAAGA,KAAK;IACrB,IAAI,CAACo5B,kBAAkB,GAAG9Y,WAAW,CAAC/uB,CAAC,IAAI;MACzC,IAAIyO,KAAK,GAAG,CAAC,EAAE,EAAE;QAEfugB,aAAa,CAAC,IAAI,CAAC6Y,kBAAkB,CAAC;QACtC,IAAI,CAACzzB,MAAM,CAAC0zB,SAAS,EAAE;QACvB;MACF;MAEA,MAAMU,OAAO,GAAI/5B,KAAK,GAAG,EAAE,GAAIvK,iEAAa,CAACuK,KAAK,CAAC,GAAGA,KAAK;MAC3D,IAAI,CAAC6vB,WAAW,CACdt3B,aAAa,CAAC1C,QAAQ,CAAC84B,mBAAmB,EAAE;QAACpvB,OAAO,EAAEw6B;MAAO,CAAC,CAAC,EAC/D,MAAM,EACNxoC,CAAC,IAAI;QACHgvB,aAAa,CAAC,IAAI,CAAC6Y,kBAAkB,CAAC;QACtC,IAAI,CAACzzB,MAAM,CAAC0zB,SAAS,EAAE;MACzB,CAAC,EACD9gC,aAAa,CAAC1C,QAAQ,CAAC+4B,aAAa,CAAC,CACtC;MACD5uB,KAAK,IAAI,CAAC;IACZ,CAAC,EAAE,IAAI,CAAC;EACV;EAGAowB,gBAAgB,CAACtgC,GAAG,EAAE;IACpB,IAAI,CAAC8W,QAAQ,CAAC;MACZmE,SAAS,EAAE,KAAK;MAChBqR,KAAK,EAAE,KAAK;MACZ2Y,mBAAmB,EAAE,KAAK;MAC1B/f,SAAS,EAAEllB,GAAG,IAAIA,GAAG,CAACwK,OAAO,GAAGxK,GAAG,CAACwK,OAAO,GAAG,cAAc;MAC5Dya,UAAU,EAAEjlB,GAAG,IAAIA,GAAG,CAACwK,OAAO,GAAG,KAAK,GAAG,MAAM;MAC/C0yB,aAAa,EAAE,KAAK;MACpBqI,kBAAkB,EAAE,KAAK;MACzBK,oBAAoB,EAAE,KAAK;MAC3B5tB,aAAa,EAAE;IACjB,CAAC,CAAC;EACJ;EAEAooB,OAAO,CAACzkB,KAAK,EAAE5E,QAAQ,EAAEmzB,QAAQ,EAAElxB,IAAI,EAAE;IACvC,IAAI,IAAI,CAACnD,MAAM,CAACs0B,eAAe,EAAE,EAAE;MAEjCl+B,sEAAyB,CAAC,EAAE,CAAC;MAC7B;IACF;IAEA,IAAIiuB,KAAK,GAAGgQ,QAAQ,IAAI,CAAC,IAAI,CAACr0B,MAAM,CAACu0B,YAAY,EAAE,IAAI,CAAC,CAAC,EAAElQ,KAAK;IAChE,IAAI,EAAEve,KAAK,IAAI5E,QAAQ,CAAC,IAAI,CAACmjB,KAAK,EAAE;MAGlCjuB,sEAAyB,CAAC,EAAE,CAAC;MAC7B,IAAI,CAAC6K,QAAQ,CAAC;QAAComB,aAAa,EAAE;MAAK,CAAC,CAAC;MACrC;IACF;IAGAlkB,IAAI,GAAG7H,yDAAiB,CAAC6H,IAAI,CAAC;IAE9B,IAAIsxB,iBAAiB,GAAG,IAAI,CAACz0B,MAAM,CAAC6zB,WAAW,EAAE,GAAGjqC,OAAO,CAACC,OAAO,EAAE,GAAG,IAAI,CAACmW,MAAM,CAACiH,OAAO,EAAE;IAE7F,IAAIytB,YAAY;IAChB,IAAI5uB,KAAK,IAAI5E,QAAQ,EAAE;MACrBmjB,KAAK,GAAG,IAAI;MACZ,IAAI,CAACpjB,QAAQ,CAAC;QAACC,QAAQ,EAAE;MAAI,CAAC,CAAC;MAC/BwzB,YAAY,GAAGD,iBAAiB,CAACzgC,IAAI,CAACpI,CAAC,IAAI,IAAI,CAACoU,MAAM,CAAC20B,UAAU,CAAC7uB,KAAK,EAAE5E,QAAQ,EAAEiC,IAAI,CAAC,CAAC;IAC3F,CAAC,MAAM;MACLuxB,YAAY,GAAGD,iBAAiB,CAACzgC,IAAI,CAACpI,CAAC,IAAI,IAAI,CAACoU,MAAM,CAAC40B,UAAU,CAACvQ,KAAK,EAAElhB,IAAI,CAAC,CAAC;IACjF;IAEAuxB,YAAY,CAAC1gC,IAAI,CAACylB,IAAI,IAAI;MACxB,IAAIA,IAAI,CAACC,IAAI,IAAI,GAAG,IAAID,IAAI,CAACgC,IAAI,KAAK,sBAAsB,EAAE;QAC5D,IAAI,CAACxa,QAAQ,CAAC;UAACmmB,kBAAkB,EAAE;QAAK,CAAC,CAAC;QAC1C,IAAIjkB,IAAI,EAAE;UACR,IAAI,CAAC+mB,WAAW,CAAC,IAAI,CAACvrB,KAAK,CAACgD,IAAI,CAAC/O,aAAa,CAAC1C,QAAQ,CAACm5B,kBAAkB,CAAC,EAAE,MAAM,CAAC;QACtF;QACAK,SAAS,CAACmL,yBAAyB,CAACpb,IAAI,CAACjjB,MAAM,CAAC;MAClD,CAAC,MAAM;QACL,IAAI,CAACg0B,qBAAqB,EAAE;MAC9B;IACF,CAAC,CAAC,CAACl2B,KAAK,CAACnK,GAAG,IAAI;MACd,MAAMskC,SAAS,GAAGtkC,GAAG,CAACuvB,IAAI,IAAI,GAAG;MAEjC,IAAI,CAACzY,QAAQ,CAAC;QACZomB,aAAa,EAAE,KAAK;QACpBK,UAAU,EAAEn2B,SAAS;QACrBk2B,QAAQ,EAAEl2B,SAAS;QACnB61B,kBAAkB,EAAE,KAAK;QACzBqH,SAAS,EAAEA;MACb,CAAC,CAAC;MACF,IAAI,CAACvE,WAAW,CAAC//B,GAAG,CAACwK,OAAO,EAAE,KAAK,CAAC;MACpCxH,OAAO,CAACuH,IAAI,CAAC,cAAc,EAAEvK,GAAG,CAAC;MACjC,IAAI,CAACskC,SAAS,EAAE;QACd,IAAIpK,KAAK,EAAE;UACT,IAAI,CAACqI,YAAY,EAAE;QACrB;QACAt2B,sEAAyB,CAAC,EAAE,CAAC;MAC/B;IACF,CAAC,CAAC;EACJ;EAEA,OAAOy+B,yBAAyB,CAACr+B,MAAM,EAAE;IACvC,MAAMa,MAAM,GAAGjB,wEAA2B,CAACrH,MAAM,CAACgG,QAAQ,CAACuB,IAAI,CAAC;IAChEe,MAAM,CAACZ,IAAI,CAAC,CAAC,CAAC,GAAG,MAAM;IACvBY,MAAM,CAACb,MAAM,CAAC,QAAQ,CAAC,GAAGA,MAAM,CAAC2M,IAAI,CAAC,CAAC,CAAC;IACxC9L,MAAM,CAACb,MAAM,CAAC,OAAO,CAAC,GAAGA,MAAM,CAAC6tB,KAAK;IACrCjuB,sEAAyB,CAACA,0EAA6B,CAACiB,MAAM,CAACZ,IAAI,EAAEY,MAAM,CAACb,MAAM,CAAC,CAAC;EACtF;EAEAg0B,qBAAqB,GAAG;IACtB,IAAI,CAACN,WAAW,EAAE;IAGlB,IAAI70B,wEAA0B,CAAC,gBAAgB,CAAC,EAAE;MAChDA,wEAA0B,CAAC,YAAY,EAAE,IAAI,CAAC2K,MAAM,CAACu0B,YAAY,EAAE,CAAC;IACtE;IAEA,MAAMO,SAAS,GAAG,IAAI,CAACxiC,KAAK,CAAC49B,cAAc;IAE3C,MAAMnwB,EAAE,GAAG,IAAI,CAACC,MAAM,CAACC,UAAU,EAAE;IACnCF,EAAE,CAACuK,UAAU,GAAG,IAAI,CAACogB,YAAY;IACjC3qB,EAAE,CAACg1B,eAAe,GAAG,IAAI,CAACpK,iBAAiB;IAC3C5qB,EAAE,CAACwK,aAAa,GAAG,IAAI,CAACqgB,eAAe;IACvC,IAAI,CAAC3pB,QAAQ,CAAC;MACZmE,SAAS,EAAE,IAAI;MACfsiB,UAAU,EAAEn2B,SAAS;MACrBk2B,QAAQ,EAAEl2B,SAAS;MACnBo2B,SAAS,EAAEp2B,SAAS;MACpBqS,QAAQ,EAAE,IAAI,CAAC5D,MAAM,CAACg1B,gBAAgB,EAAE;MACxCvG,SAAS,EAAE,IAAI;MACfyB,cAAc,EAAE3+B;IAClB,CAAC,CAAC;IAEFwO,EAAE,CAAC+S,SAAS,CACV/S,EAAE,CAAC0M,cAAc,EAAE,CACjB4M,YAAY,EAAE,CACdzC,QAAQ,EAAE,CACVlK,QAAQ,EAAE,CACVuoB,QAAQ,EAAE,CACVtoB,KAAK,EAAE,CACR,CAACrY,KAAK,CAACnK,GAAG,IAAI;MACb,IAAI,CAAC6V,MAAM,CAACk1B,UAAU,EAAE;MACxB1/B,YAAY,CAACW,UAAU,CAAC,YAAY,CAAC;MACrC,IAAI,CAAC+zB,WAAW,CAAC//B,GAAG,CAACwK,OAAO,EAAE,KAAK,CAAC;MACpCyB,sEAAyB,CAAC,EAAE,CAAC;IAC/B,CAAC,CAAC,CAACqR,OAAO,CAAC7b,CAAC,IAAI;MACd,IAAI,CAACqV,QAAQ,CAAC;QAACmmB,kBAAkB,EAAE;MAAK,CAAC,CAAC;IAC5C,CAAC,CAAC;IACJ,IAAI+N,OAAO,GAAG/+B,2EAA8B,CAACrH,MAAM,CAACgG,QAAQ,CAACuB,IAAI,EAAE,UAAU,CAAC;IAC9E,IAAIw+B,SAAS,EAAE;MACbK,OAAO,GAAG/+B,uEAA0B,CAAC++B,OAAO,EAAEL,SAAS,CAAC;IAC1D;IACA1+B,sEAAyB,CAAC++B,OAAO,CAAC;EACpC;EAEAzK,YAAY,CAAC9d,IAAI,EAAE;IACjB,IAAIA,IAAI,EAAE;MACR,IAAIA,IAAI,CAAChK,MAAM,EAAE;QACf,IAAI,CAAC3B,QAAQ,CAAC;UACZ8tB,cAAc,EAAEniB,IAAI,CAAChK,MAAM,CAAC1G,EAAE;UAC9B8yB,eAAe,EAAEtnC,mEAAY,CAACklB,IAAI,CAAChK,MAAM,CAACjb,KAAK;QACjD,CAAC,CAAC;MACJ;MACA,IAAIilB,IAAI,CAAClB,OAAO,EAAE;QAChB,MAAMD,MAAM,GAAG,EAAE;QACjB,KAAK,MAAM,CAAC5a,GAAG,EAAEsB,GAAG,CAAC,IAAI8D,MAAM,CAAC0V,OAAO,CAACiB,IAAI,CAAClB,OAAO,CAAC,EAAE;UACrD,IAAIvZ,GAAG,EAAE;YACPsZ,MAAM,CAACtc,IAAI,CAAC0B,GAAG,CAAC;UAClB;QACF;QACA,IAAI,CAACoQ,QAAQ,CAAC;UACZguB,eAAe,EAAExjB;QACnB,CAAC,CAAC;MACJ;MACA,IAAImB,IAAI,CAACxM,GAAG,EAAE;QACZ,IAAI,CAACa,QAAQ,CAAC;UACZ1B,aAAa,EAAE,CAACqN,IAAI,CAACxM,GAAG,CAACg1B,WAAW;QACtC,CAAC,CAAC;MACJ;IACF;EACF;EAGAzK,iBAAiB,CAAC7rB,IAAI,EAAEijB,IAAI,EAAE;IAC5B,IAAIjjB,IAAI,IAAI,IAAI,IAAIA,IAAI,IAAI,KAAK,EAAE;MACjC,IAAI,CAAC+rB,gBAAgB,EAAE;MACvB,IAAI,IAAI,CAACv4B,KAAK,CAAC+S,aAAa,IAAI0c,IAAI,CAAClqB,KAAK,EAAE;QAC1C,IAAI,CAACoJ,QAAQ,CAAC;UAACmuB,mBAAmB,EAAGtwB,IAAI,IAAI;QAAK,CAAC,CAAC;MACtD;IACF,CAAC,MAAM,IAAIA,IAAI,IAAI,MAAM,EAAE;MACzB,IAAI,CAAC+rB,gBAAgB,EAAE;IACzB,CAAC,MAAM,IAAI/rB,IAAI,IAAI,KAAK,EAAE;MAExB,MAAMjH,KAAK,GAAG,IAAI,CAACmI,MAAM,CAAC+K,QAAQ,CAACgX,IAAI,CAAClqB,KAAK,CAAC;MAC9C,MAAMqU,QAAQ,GAAGrU,KAAK,IAAIA,KAAK,CAACsU,UAAU,EAAE;MAG5C,IAAI4V,IAAI,CAACrd,MAAM,GAAG,CAAC,IAAI,IAAI,CAACpS,KAAK,CAAC8M,aAAa,IAAI,CAAC8M,QAAQ,EAAE;QAE5D,IAAIvhB,QAAQ,CAACkkC,MAAM,IAAI,IAAI,CAACv8B,KAAK,CAAC+S,aAAa,IAAI0c,IAAI,CAAClqB,KAAK,EAAE;UAC7DixB,SAAS,CAACuM,IAAI,EAAE,CAAC/gC,KAAK,CAAC1I,CAAC,IAAI,CAE5B,CAAC,CAAC;QACJ;MACF;MAEA,IAAI,CAACi/B,gBAAgB,EAAE;IACzB,CAAC,MAAM,IAAI/rB,IAAI,IAAI,MAAM,EAAE,CAE3B,CAAC,MAAM,IAAIA,IAAI,IAAI,MAAM,IAAIA,IAAI,IAAI,OAAO,EAAE;MAG5C,IAAI,IAAI,CAACxM,KAAK,CAAC+S,aAAa,IAAI0c,IAAI,CAAClqB,KAAK,EAAE;QAC1C,IAAI,CAACmzB,mBAAmB,CAAC,IAAI,CAAC;MAChC;MAEA,IAAI,CAACH,gBAAgB,EAAE;IACzB,CAAC,MAAM,IAAI/rB,IAAI,IAAI,KAAK,EAAE;MAGxB,IAAI,IAAI,CAACxM,KAAK,CAAC+S,aAAa,IAAI0c,IAAI,CAAClqB,KAAK,EAAE;QAC1C,IAAI,CAACoJ,QAAQ,CAAC;UAACouB,gBAAgB,EAAEtN,IAAI,CAAC3hB;QAAG,CAAC,CAAC;MAC7C;IACF,CAAC,MAAM,IAAItB,IAAI,IAAI,KAAK,EAAE,CAE1B,CAAC,MAAM,IAAIA,IAAI,IAAI,KAAK,IAAIA,IAAI,IAAI,MAAM,EAAE,CAE5C,CAAC,MAAM;MAGL3R,OAAO,CAACwK,IAAI,CAAC,oCAAoC,EAAEmH,IAAI,EAAE,IAAI,EAAEijB,IAAI,CAAClqB,KAAK,CAAC;IAC5E;EACF;EAEA+yB,eAAe,CAAC0K,MAAM,EAAE;IACtB,IAAI,CAACzK,gBAAgB,EAAE;EACzB;EAIA,OAAO0K,yBAAyB,CAAClxB,QAAQ,EAAEmxB,aAAa,EAAE;IACxD,MAAMC,MAAM,GAAG,CAAC,CAAC;IAIjB,KAAK,MAAMvmC,CAAC,IAAImV,QAAQ,EAAE;MACxB,IAAI/I,6DAAqB,CAACpM,CAAC,CAAC2I,KAAK,CAAC,EAAE;QAChC49B,MAAM,CAACvmC,CAAC,CAAC2I,KAAK,CAAC,GAAG;UAChBiW,IAAI,EAAE5e,CAAC,CAAC2I,KAAK;UACb69B,OAAO,EAAExmC,CAAC,CAACwmC,OAAO;UAClB9yB,MAAM,EAAE1T,CAAC,CAAC0T,MAAM;UAChB2B,OAAO,EAAErV,CAAC,CAACqV,OAAO;UAClBnE,GAAG,EAAElR,CAAC,CAACkR;QACT,CAAC;MACL;IACF;IAGA,KAAK,MAAMlR,CAAC,IAAIsmC,aAAa,EAAE;MAC7B,IAAI,CAACC,MAAM,CAACvmC,CAAC,CAAC4e,IAAI,CAAC,EAAE;QACnB2nB,MAAM,CAACvmC,CAAC,CAAC4e,IAAI,CAAC,GAAG5e,CAAC;MACpB;IACF;IAEA,OAAO+G,MAAM,CAACrF,MAAM,CAAC6kC,MAAM,CAAC;EAC9B;EAEA5K,gBAAgB,GAAG;IACjB,MAAMrpB,QAAQ,GAAG;MACf6C,QAAQ,EAAE;IACZ,CAAC;IAED,IAAI,CAAC,IAAI,CAAC/R,KAAK,CAACmkB,KAAK,EAAE;MACrBjV,QAAQ,CAACiV,KAAK,GAAG,IAAI;IACvB;IAEA,IAAI,CAACzW,MAAM,CAACC,UAAU,EAAE,CAACE,QAAQ,CAAEjR,CAAC,IAAK;MACvC,IAAI,CAACA,CAAC,CAAC2I,KAAK,IAAI,CAAC3I,CAAC,CAAC4e,IAAI,EAAE;QAEvB5e,CAAC,CAAC2I,KAAK,GAAG3I,CAAC,CAAC5D,IAAI;MAClB;MAEAkW,QAAQ,CAAC6C,QAAQ,CAAClV,IAAI,CAACD,CAAC,CAAC;MACzB,IAAI,IAAI,CAACoD,KAAK,CAAC+S,aAAa,IAAInW,CAAC,CAAC2I,KAAK,EAAE;QACvC2J,QAAQ,CAAC4tB,mBAAmB,GAAGlgC,CAAC,CAACmpB,MAAM;QACvC7W,QAAQ,CAAC6tB,gBAAgB,GAAGngC,CAAC,CAACkR,GAAG;MACnC;IACF,CAAC,CAAC;IAEF,MAAMu1B,IAAI,GAAG,IAAIv9B,IAAI,CAAC,CAAC,CAAC;IACxBoJ,QAAQ,CAAC6C,QAAQ,CAACzH,IAAI,CAAC,CAACD,CAAC,EAAE/N,CAAC,KAAK;MAC/B,OAAO,CAAC+N,CAAC,CAACgI,OAAO,IAAIgxB,IAAI,EAAEz8B,OAAO,EAAE,GAAG,CAACtK,CAAC,CAAC+V,OAAO,IAAIgxB,IAAI,EAAEz8B,OAAO,EAAE;IACtE,CAAC,CAAC;IAGFsI,QAAQ,CAAC8N,kBAAkB,GAAGoa,SAAS,CAAC6L,yBAAyB,CAAC/zB,QAAQ,CAAC6C,QAAQ,EAAE,IAAI,CAAC/R,KAAK,CAACyxB,aAAa,CAAC;IAC9G,IAAI,CAAC9iB,QAAQ,CAACO,QAAQ,CAAC;EACzB;EAGAspB,UAAU,GAAG;IACX,MAAM8K,GAAG,GAAG,IAAI,CAAC51B,MAAM,CAAC61B,WAAW,EAAE;IACrCD,GAAG,CAACrrB,aAAa,GAAG,IAAI,CAACwgB,gBAAgB;IACzC,IAAI6K,GAAG,CAAC7c,YAAY,EAAE,EAAE;MACtB,IAAI,CAACgS,gBAAgB,EAAE;IACzB,CAAC,MAAM;MACL6K,GAAG,CAAC9iB,SAAS,CAAC8iB,GAAG,CAACnpB,cAAc,EAAE,CAACqpB,OAAO,EAAE,CAACnpB,KAAK,EAAE,CAAC,CAACrY,KAAK,CAACnK,GAAG,IAAI;QACjE,IAAI,CAAC+/B,WAAW,CAAC//B,GAAG,CAACwK,OAAO,EAAE,KAAK,CAAC;MACtC,CAAC,CAAC;IACJ;EACF;EAEAo2B,gBAAgB,GAAG;IACjB,MAAMyK,aAAa,GAAG,EAAE;IAExB,IAAI,CAACx1B,MAAM,CAAC61B,WAAW,EAAE,CAAC11B,QAAQ,CAAE41B,CAAC,IAAK;MACxCP,aAAa,CAACrmC,IAAI,CAAC4mC,CAAC,CAAC;IACvB,CAAC,CAAC;IACF,IAAI,CAAC90B,QAAQ,CAAC;MACZ8iB,aAAa,EAAEyR,aAAa;MAC5BlmB,kBAAkB,EAAEoa,SAAS,CAAC6L,yBAAyB,CAAC,IAAI,CAACjjC,KAAK,CAAC+R,QAAQ,EAAEmxB,aAAa;IAC5F,CAAC,CAAC;EACJ;EAKAvS,oBAAoB,CAACM,KAAK,EAAE;IAC1B,MAAMqS,GAAG,GAAG,IAAI,CAAC51B,MAAM,CAAC61B,WAAW,EAAE;IACrCD,GAAG,CAACI,OAAO,CAAC;MAACppB,IAAI,EAAE;QAAChK,MAAM,EAAE2gB;MAAK;IAAC,CAAC,CAAC,CACjCvvB,IAAI,CAACpI,CAAC,IAAIgqC,GAAG,CAACppB,OAAO,CAACopB,GAAG,CAACnpB,cAAc,EAAE,CAACqpB,OAAO,EAAE,CAACnpB,KAAK,EAAE,CAAC,CAAC,CAC9DrY,KAAK,CAACnK,GAAG,IAAI,IAAI,CAAC+/B,WAAW,CAAC//B,GAAG,CAACwK,OAAO,EAAE,KAAK,CAAC,CAAC;EACvD;EAGAq2B,mBAAmB,CAACtc,SAAS,EAAE;IAE7B,IAAI,IAAI,CAACpc,KAAK,CAAC2mB,cAAc,IAAI,IAAI,CAAC3mB,KAAK,CAAC2mB,cAAc,CAACC,UAAU,IAAIxK,SAAS,EAAE;MAClF,IAAI,CAACzN,QAAQ,CAAC;QACZgY,cAAc,EAAE;MAClB,CAAC,CAAC;IACJ;IAEA,IAAIvK,SAAS,EAAE;MACb,IAAI,CAACzN,QAAQ,CAAC;QACZoO,SAAS,EAAE,EAAE;QACbD,UAAU,EAAE,IAAI;QAChBogB,WAAW,EAAE,YAAY;QACzBD,SAAS,EAAEh+B;MACb,CAAC,CAAC;MAEF,IAAI,IAAI,CAACe,KAAK,CAAC+S,aAAa,IAAIqJ,SAAS,EAAE;QACzC,IAAI,CAACzN,QAAQ,CAAC;UACZmuB,mBAAmB,EAAE,IAAI,CAACpvB,MAAM,CAACi2B,aAAa,CAACvnB,SAAS,CAAC;UACzD2gB,gBAAgB,EAAE,IAAI,CAACrvB,MAAM,CAACszB,kBAAkB,CAAC5kB,SAAS,CAAC;UAC3DwJ,cAAc,EAAE;QAClB,CAAC,CAAC;QACF9hB,sEAAyB,CAACA,uEAA0B,CAAC,EAAE,EAAEsY,SAAS,CAAC,CAAC;MACtE;IACF,CAAC,MAAM;MAEL,IAAI,CAACzN,QAAQ,CAAC;QACZoO,SAAS,EAAE,EAAE;QACbD,UAAU,EAAE,IAAI;QAChBogB,WAAW,EAAE,WAAW;QACxBJ,mBAAmB,EAAE,KAAK;QAC1BC,gBAAgB,EAAE,IAAI;QACtBE,SAAS,EAAEh+B,SAAS;QACpB2mB,cAAc,EAAE;MAClB,CAAC,CAAC;MAEF9hB,sEAAyB,CAACA,uEAA0B,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IACjE;EACF;EAGA60B,sBAAsB,GAAG;IACvB,IAAI,CAAChqB,QAAQ,CAAC;MACZuuB,WAAW,EAAE;IACf,CAAC,CAAC;IACFp5B,sEAAyB,CAACA,uEAA0B,CAACrH,MAAM,CAACgG,QAAQ,CAACuB,IAAI,EAAE,IAAI,CAAC,CAAC;EACnF;EAQA40B,iBAAiB,CAACjQ,GAAG,EAAEyB,uBAAuB,EAAEpV,QAAQ,EAAE5L,IAAI,EAAE;IAC9D,MAAM7D,KAAK,GAAG,IAAI,CAACmI,MAAM,CAAC+K,QAAQ,CAAC,IAAI,CAACzY,KAAK,CAAC+S,aAAa,CAAC;IAE5D,OAAO,IAAI,CAACkpB,kBAAkB,CAAC12B,KAAK,EAAEojB,GAAG,EAAEyB,uBAAuB,EAAEpV,QAAQ,EAAE5L,IAAI,CAAC;EACrF;EAEA6yB,kBAAkB,CAAC12B,KAAK,EAAEojB,GAAG,EAAEyB,uBAAuB,EAAEpV,QAAQ,EAAE5L,IAAI,EAAE;IACtEuf,GAAG,GAAGpjB,KAAK,CAACq+B,aAAa,CAACjb,GAAG,EAAE,KAAK,CAAC;IAErCA,GAAG,CAAC4G,SAAS,GAAGva,QAAQ;IAExB,IAAI5L,IAAI,EAAE;MACRuf,GAAG,CAACvf,IAAI,GAAGzF,MAAM,CAACC,MAAM,CAAC+kB,GAAG,CAACvf,IAAI,IAAI,CAAC,CAAC,EAAEA,IAAI,CAAC;IAChD;IAEA,MAAMy6B,UAAU,GAAG,EAAE;IACrB,IAAIzZ,uBAAuB,EAAE;MAC3ByZ,UAAU,CAAChnC,IAAI,CAACutB,uBAAuB,CAAC;IAC1C;IAEA,IAAI,CAAC7kB,KAAK,CAACkhB,YAAY,EAAE,EAAE;MAEzB,MAAMqd,gBAAgB,GACpBv+B,KAAK,CAACib,SAAS,EAAE,CACd9e,IAAI,CAACpI,CAAC,IAAI;QAGT,IAAIguB,KAAK,GAAG,EAAE;QACd/hB,KAAK,CAACgiB,cAAc,CAACC,GAAG,IAAI;UAC1B,IAAIA,GAAG,CAACC,QAAQ,IAAID,GAAG,CAAC1B,GAAG,IAAI6C,GAAG,CAAC7C,GAAG,EAAE;YACtC;UACF;UACA,IAAI0B,GAAG,CAACpe,IAAI,IAAIoe,GAAG,CAACpe,IAAI,CAACse,MAAM,EAAE;YAE/BJ,KAAK,CAACzqB,IAAI,CAAC2qB,GAAG,CAAC1B,GAAG,CAAC;YACnB;UACF;UACA,IAAIvgB,KAAK,CAACkhB,YAAY,EAAE,EAAE;YACxBlhB,KAAK,CAACw+B,cAAc,CAACvc,GAAG,CAAC;UAC3B;QACF,CAAC,CAAC;QACF,IAAIF,KAAK,CAACxuB,MAAM,GAAG,CAAC,EAAE;UACpByM,KAAK,CAACoiB,eAAe,CAACL,KAAK,EAAE,IAAI,CAAC;QACpC;MACF,CAAC,CAAC;MACNuc,UAAU,CAAChnC,IAAI,CAACinC,gBAAgB,CAAC;IACnC;IAGA,OAAOv+B,KAAK,CAACy+B,YAAY,CAACrb,GAAG,EAAErxB,OAAO,CAACk0B,GAAG,CAACqY,UAAU,CAAC,CAAC,CACpDniC,IAAI,CAACylB,IAAI,IAAI;MACZ,IAAI5hB,KAAK,CAACsU,UAAU,EAAE,EAAE;QACtBtU,KAAK,CAAC4M,OAAO,CAAC,KAAK,CAAC;MACtB;MACA,OAAOgV,IAAI;IACb,CAAC,CAAC,CACDnlB,KAAK,CAACnK,GAAG,IAAI,IAAI,CAAC+/B,WAAW,CAAC//B,GAAG,CAACwK,OAAO,EAAE,KAAK,CAAC,CAAC;EACvD;EAEAw2B,uBAAuB,CAACzc,SAAS,EAAE9J,MAAM,EAAE;IACzC,MAAM/M,KAAK,GAAG,IAAI,CAACmI,MAAM,CAAC+K,QAAQ,CAAC2D,SAAS,CAAC;IAC7C,IAAI6nB,QAAQ,GAAG,IAAI;IACnB,QAAQ3xB,MAAM;MACZ,KAAK,QAAQ;QAEX,MAAM2K,IAAI,GAAG1X,KAAK,CAAC2T,aAAa,EAAE,CAACJ,QAAQ,EAAE;QAC7CmrB,QAAQ,GAAG1+B,KAAK,CAACm+B,OAAO,CAAC;UAACzqB,GAAG,EAAE;YAACgE,IAAI,EAAEA;UAAI;QAAC,CAAC,CAAC;QAC7C,IAAI1X,KAAK,CAAC8e,SAAS,EAAE,EAAE;UAGrB4f,QAAQ,GAAGA,QAAQ,CAACviC,IAAI,CAACpI,CAAC,IAAIiM,KAAK,CAACm+B,OAAO,CAAC;YAACzqB,GAAG,EAAE;cAACuC,IAAI,EAAEY,SAAS;cAAEa,IAAI,EAAEA;YAAI;UAAC,CAAC,CAAC,CAAC;QACpF;QACA;MACF,KAAK,QAAQ;QAEXgnB,QAAQ,GAAG1+B,KAAK,CAAC2+B,QAAQ,CAAC,IAAI,CAAC;QAC/B;MACF,KAAK,OAAO;QAGV,MAAMC,EAAE,GAAG5+B,KAAK,CAAC2T,aAAa,EAAE,CAACkrB,UAAU,CAAC,KAAK,CAAC,CAACrrB,OAAO,EAAE;QAC5DkrB,QAAQ,GAAG1+B,KAAK,CAACm+B,OAAO,CAAC;UAACzqB,GAAG,EAAE;YAACgE,IAAI,EAAEknB;UAAE;QAAC,CAAC,CAAC,CAACziC,IAAI,CAACpI,CAAC,IAAI,IAAI,CAACo/B,mBAAmB,CAAC,IAAI,CAAC,CAAC;QACrF;MACF;QACE79B,OAAO,CAACuH,IAAI,CAAC,2BAA2B,EAAE,GAAG,GAAGkQ,MAAM,GAAG,IAAI,CAAC;IAAC;IAGnE,IAAI2xB,QAAQ,IAAI,IAAI,EAAE;MACpBA,QAAQ,CAACjiC,KAAK,CAACnK,GAAG,IAAI,IAAI,CAAC+/B,WAAW,CAAC//B,GAAG,CAACwK,OAAO,EAAE,KAAK,CAAC,CAAC;IAC7D;EACF;EAGAy2B,gBAAgB,GAAG;IACjB,IAAI,CAAClB,WAAW,EAAE;IAElB9zB,sEAAyB,CAACA,2EAA8B,CAACrH,MAAM,CAACgG,QAAQ,CAACuB,IAAI,EAAE,UAAU,CAAC,CAAC;EAC7F;EAGA+0B,uBAAuB,CAACsL,MAAM,EAAEC,SAAS,EAAEC,OAAO,EAAEC,KAAK,EAAEC,KAAK,EAAE;IAEhE,IAAI,CAAC7M,WAAW,EAAE;IAElB,IAAI,CAAClqB,MAAM,CAACiH,OAAO,CAAC,IAAI,CAAC3U,KAAK,CAAC8P,aAAa,CAAC,CAC1CpO,IAAI,CAACpI,CAAC,IAAI;MACT,IAAIorC,WAAW;MACf,IAAIH,OAAO,IAAIA,OAAO,CAAClvC,KAAK,IAAIkvC,OAAO,CAAClvC,KAAK,CAACC,GAAG,EAAE;QACjDovC,WAAW,GAAG,CAACH,OAAO,CAAClvC,KAAK,CAACC,GAAG,CAAC;MACnC;MACA,OAAO,IAAI,CAACoY,MAAM,CAACi3B,kBAAkB,CAACN,MAAM,EAAEC,SAAS,EACrD;QAACh0B,MAAM,EAAEi0B,OAAO;QAAEhT,IAAI,EAAEkT,KAAK;QAAE5zB,IAAI,EAAE7H,yDAAiB,CAACw7B,KAAK,CAAC;QAAEE,WAAW,EAAEA;MAAW,CAAC,CAAC;IAC7F,CAAC,CAAC,CAAChjC,IAAI,CAACylB,IAAI,IAAI;MACd,IAAIA,IAAI,CAACC,IAAI,IAAI,GAAG,IAAID,IAAI,CAACgC,IAAI,IAAI,sBAAsB,EAAE;QAC3DiO,SAAS,CAACmL,yBAAyB,CAACpb,IAAI,CAACjjB,MAAM,CAAC;MAClD,CAAC,MAAM;QACL,IAAI,CAACg0B,qBAAqB,CAAC,IAAI,CAAC;MAClC;IACF,CAAC,CAAC,CAACl2B,KAAK,CAACnK,GAAG,IAAI;MACd,IAAI,CAAC+/B,WAAW,CAAC//B,GAAG,CAACwK,OAAO,EAAE,KAAK,CAAC;IACtC,CAAC,CAAC;EACN;EAEA62B,yBAAyB,CAAC0L,EAAE,EAAE;IAE5B,IAAI,CAACj2B,QAAQ,CAAC;MAAC1B,aAAa,EAAE;IAAI,CAAC,CAAC;IAEpC,MAAMQ,EAAE,GAAG,IAAI,CAACC,MAAM,CAACC,UAAU,EAAE;IACnC,MAAMw2B,EAAE,GAAG12B,EAAE,CAACyL,aAAa,EAAE,CAACkrB,UAAU,CAACQ,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC7rB,OAAO,EAAE;IACpEtL,EAAE,CAACi2B,OAAO,CAAC;MAACzqB,GAAG,EAAE;QAACgE,IAAI,EAAEknB;MAAE;IAAC,CAAC,CAAC,CAACniC,KAAK,CAACnK,GAAG,IAAI;MAEzC,IAAI,CAAC8W,QAAQ,CAAC;QAAC1B,aAAa,EAAE,CAAC23B;MAAE,CAAC,CAAC;MACnC,IAAI,CAAChN,WAAW,CAAC//B,GAAG,CAACwK,OAAO,EAAE,KAAK,CAAC;IACtC,CAAC,CAAC;EACJ;EAEA42B,8BAA8B,CAAC3/B,CAAC,EAAEi4B,IAAI,EAAE;IACtC,IAAI,CAAC7jB,MAAM,CAACC,UAAU,EAAE,CAAC+1B,OAAO,CAAC;MAACnS,IAAI,EAAEA;IAAI,CAAC,CAAC,CAC3CvvB,KAAK,CAACnK,GAAG,IAAI,IAAI,CAAC+/B,WAAW,CAAC//B,GAAG,CAACwK,OAAO,EAAE,KAAK,CAAC,CAAC;EACvD;EAGA82B,cAAc,GAAG;IACf,IAAI,CAACvB,WAAW,EAAE;IAElB9zB,sEAAyB,CAACA,2EAA8B,CAACrH,MAAM,CAACgG,QAAQ,CAACuB,IAAI,EAC3E,IAAI,CAAChE,KAAK,CAACsR,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAC,CAAC;EAC/C;EAGA8nB,oBAAoB,CAACnF,QAAQ,EAAE;IAC7B,MAAMnkB,aAAa,GAAGmkB,QAAQ,CAACnkB,aAAa,IAAI,IAAI,CAAC9P,KAAK,CAAC8P,aAAa;IACxE,MAAMojB,SAAS,GAAGe,QAAQ,CAACf,SAAS,IAAI,IAAI,CAAClzB,KAAK,CAACkzB,SAAS;IAC5D,MAAMC,gBAAgB,GAAGc,QAAQ,CAACd,gBAAgB,KAAKl0B,SAAS,GAC9D,IAAI,CAACe,KAAK,CAACmzB,gBAAgB,GAAGc,QAAQ,CAACd,gBAAgB;IACzD,IAAI,IAAI,CAACzlB,MAAM,EAAE;MACf,IAAI,CAACA,MAAM,CAAC+zB,YAAY,EAAE;MAC1B,IAAI,CAAC/zB,MAAM,CAAC2wB,YAAY,GAAGp/B,SAAS;MACpC,IAAI,CAACyO,MAAM,CAACk1B,UAAU,EAAE;IAC1B;IACA,IAAI,CAACl1B,MAAM,GAAG0pB,SAAS,CAAC+G,OAAO,CAACruB,aAAa,EAAEqjB,gBAAgB,EAAED,SAAS,EACxE,IAAI,CAAC7mB,KAAK,CAACgD,IAAI,CAAC5J,MAAM,EAAE1C,wEAA0B,CAAC,gBAAgB,CAAC,CAAC;IACvE,IAAI,CAAC2K,MAAM,CAAC0wB,SAAS,GAAG,IAAI,CAACrG,eAAe;IAC5C,IAAI,CAACrqB,MAAM,CAAC2wB,YAAY,GAAG,IAAI,CAAClG,gBAAgB;IAChD,IAAI,CAACzqB,MAAM,CAAC4wB,wBAAwB,GAAG,IAAI,CAACtG,4BAA4B;IACxE,IAAI,CAACtqB,MAAM,CAAC6wB,aAAa,GAAG,IAAI,CAAC/C,iBAAiB;IAClD,IAAI,CAAC9tB,MAAM,CAAC8wB,aAAa,GAAG,IAAI,CAAC/C,iBAAiB;IAElD,IAAI,CAAC9sB,QAAQ,CAAC;MACZmB,aAAa,EAAEA,aAAa;MAC5BojB,SAAS,EAAEA,SAAS;MACpBC,gBAAgB,EAAEA;IACpB,CAAC,CAAC;IACFpwB,wEAA0B,CAAC,UAAU,EAAE;MACrC+M,aAAa,EAAEA,aAAa;MAC5BojB,SAAS,EAAEA,SAAS;MACpBC,gBAAgB,EAAEA;IACpB,CAAC,CAAC;IAEFrvB,sEAAyB,CAACA,2EAA8B,CAACrH,MAAM,CAACgG,QAAQ,CAACuB,IAAI,EAAE,EAAE,CAAC,CAAC;EACrF;EAGAq1B,iBAAiB,GAAG;IAClBv1B,sEAAyB,CAACA,2EAA8B,CAACrH,MAAM,CAACgG,QAAQ,CAACuB,IAAI,EAC3E,IAAI,CAAChE,KAAK,CAACsR,QAAQ,GAAG,SAAS,GAAG,EAAE,CAAC,CAAC;EAC1C;EAGAgoB,iBAAiB,GAAG;IAClBx1B,sEAAyB,CAACA,2EAA8B,CAACrH,MAAM,CAACgG,QAAQ,CAACuB,IAAI,EAC3E,IAAI,CAAChE,KAAK,CAACsR,QAAQ,GAAG,SAAS,GAAG,EAAE,CAAC,CAAC;EAC1C;EAEAsoB,cAAc,CAACiL,OAAO,EAAE;IACtB,IAAIA,OAAO,EAAE;MACX,IAAI,CAACl2B,QAAQ,CAAC;QAAC3B,aAAa,EAAE;MAAI,CAAC,CAAC;MACpC,IAAI,CAAC,IAAI,CAAChN,KAAK,CAACs8B,aAAa,EAAE;QAC7B,IAAI,CAAC3C,eAAe,EAAE;MACxB,CAAC,MAAM;QACL,IAAI,CAAChrB,QAAQ,CAAC;UAAC3B,aAAa,EAAE;QAAI,CAAC,CAAC;QACpC,IAAIjK,wEAA0B,CAAC,gBAAgB,CAAC,EAAE;UAChDA,2EAA6B,CAAC,UAAU,EAAE;YAACiK,aAAa,EAAE;UAAI,CAAC,CAAC;QAClE;MACF;IACF,CAAC,MAAM,IAAI,IAAI,CAAChN,KAAK,CAACs8B,aAAa,IAAI,IAAI,CAACkD,GAAG,EAAE;MAC/CxJ,+DAAgB,CAAC,IAAI,CAACwJ,GAAG,CAAC,CAACx9B,KAAK,CAACnK,GAAG,IAAI;QACtCgD,OAAO,CAAClB,KAAK,CAAC,yBAAyB,EAAE9B,GAAG,CAAC;MAC/C,CAAC,CAAC,CAACsd,OAAO,CAAC7b,CAAC,IAAI;QACdyJ,2EAA6B,CAAC,UAAU,EAAE;UAACiK,aAAa,EAAE;QAAK,CAAC,CAAC;QACjE9J,YAAY,CAACW,UAAU,CAAC,gBAAgB,CAAC;QACzC,IAAI,CAAC8K,QAAQ,CAAC;UAAC3B,aAAa,EAAE,KAAK;UAAEsvB,aAAa,EAAE;QAAI,CAAC,CAAC;QAE1D,IAAI,CAAC5uB,MAAM,CAACsyB,cAAc,CAAC,IAAI,CAAC;MAClC,CAAC,CAAC;IACJ,CAAC,MAAM;MACL,IAAI,CAACrxB,QAAQ,CAAC;QAAC3B,aAAa,EAAE,KAAK;QAAEsvB,aAAa,EAAE;MAAI,CAAC,CAAC;MAC1Dv5B,2EAA6B,CAAC,UAAU,EAAE;QAACiK,aAAa,EAAE;MAAK,CAAC,CAAC;IACnE;EACF;EAEAusB,yBAAyB,CAACsL,OAAO,EAAE;IACjC,IAAI,CAACl2B,QAAQ,CAAC;MAAC7B,aAAa,EAAE+3B;IAAO,CAAC,CAAC;IACvC9hC,2EAA6B,CAAC,UAAU,EAAE;MACxCq5B,gBAAgB,EAAE,CAACyI;IACrB,CAAC,CAAC;EACJ;EAEArL,aAAa,CAACyH,MAAM,EAAEh+B,KAAK,EAAE;IAC3B,MAAMwK,EAAE,GAAG,IAAI,CAACC,MAAM,CAACC,UAAU,EAAE;IACnCF,EAAE,CAACi2B,OAAO,CAAC;MAAC7yB,IAAI,EAAE;QAACE,IAAI,EAAEkwB,MAAM;QAAEphC,GAAG,EAAEoD;MAAK;IAAC,CAAC,CAAC,CAC3CjB,KAAK,CAACnK,GAAG,IAAI,IAAI,CAAC+/B,WAAW,CAAC//B,GAAG,CAACwK,OAAO,EAAE,KAAK,CAAC,CAAC;EACvD;EAEAo3B,gBAAgB,CAACwH,MAAM,EAAEh+B,KAAK,EAAE;IAC9B,MAAMwK,EAAE,GAAG,IAAI,CAACC,MAAM,CAACC,UAAU,EAAE;IACnCF,EAAE,CAACq3B,aAAa,CAAC7D,MAAM,EAAEh+B,KAAK,CAAC,CAC5BjB,KAAK,CAACnK,GAAG,IAAI,IAAI,CAAC+/B,WAAW,CAAC//B,GAAG,CAACwK,OAAO,EAAE,KAAK,CAAC,CAAC;EACvD;EAEAq3B,iBAAiB,CAACuH,MAAM,EAAEgD,QAAQ,EAAE;IAClC7M,SAAS,CAACmL,yBAAyB,CAAC;MAAC1xB,IAAI,EAAE,CAACowB,MAAM;IAAC,CAAC,CAAC;EACvD;EAGAnH,qBAAqB,GAAG;IACtB,MAAM/0B,MAAM,GAAGjB,wEAA2B,CAACrH,MAAM,CAACgG,QAAQ,CAACuB,IAAI,CAAC;IAChE,IAAIG,IAAI,GAAG,EAAE;IACb,IAAI,CAAC,UAAU,EAAC,SAAS,EAAC,SAAS,EAAC,OAAO,CAAC,CAACxL,QAAQ,CAACoM,MAAM,CAACZ,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE;MACrEA,IAAI,GAAG,MAAM;IACf,CAAC,MAAM,IAAI,MAAM,IAAIY,MAAM,CAACZ,IAAI,CAAC,CAAC,CAAC,EAAE;MACnCA,IAAI,GAAG,SAAS;IAClB,CAAC,MAAM,IAAI,SAAS,IAAIY,MAAM,CAACZ,IAAI,CAAC,CAAC,CAAC,EAAE;MACtCA,IAAI,GAAG,UAAU;IACnB,CAAC,MAAM,IAAI,IAAI,CAACnE,KAAK,CAACsR,QAAQ,EAAE;MAC9BnN,IAAI,GAAG,UAAU;IACnB;IACAY,MAAM,CAACZ,IAAI,CAAC,CAAC,CAAC,GAAGA,IAAI;IACrB,IAAIY,MAAM,CAACb,MAAM,EAAE;MACjB,OAAOa,MAAM,CAACb,MAAM,CAACkjB,IAAI;MACzB,OAAOriB,MAAM,CAACb,MAAM,CAAC+8B,MAAM;MAC3B,OAAOl8B,MAAM,CAACb,MAAM,CAAC48B,GAAG;MACxB,OAAO/7B,MAAM,CAACb,MAAM,CAAC8tB,MAAM;MAC3B,OAAOjtB,MAAM,CAACb,MAAM,CAAC6tB,KAAK;IAC5B;IACAjuB,sEAAyB,CAACA,0EAA6B,CAACiB,MAAM,CAACZ,IAAI,EAAEY,MAAM,CAACb,MAAM,CAAC,CAAC;IACpF,IAAI,CAACyK,QAAQ,CAAC;MAACoO,SAAS,EAAE,EAAE;MAAED,UAAU,EAAE;IAAI,CAAC,CAAC;EAClD;EAGAioB,cAAc,CAAC/gC,IAAI,EAAE;IACnBF,sEAAyB,CAACA,2EAA8B,CAACrH,MAAM,CAACgG,QAAQ,CAACuB,IAAI,EAAEA,IAAI,CAAC,CAAC;EACvF;EAGAghC,aAAa,CAAChhC,IAAI,EAAE;IAClBF,sEAAyB,CAACA,2EAA8B,CAACrH,MAAM,CAACgG,QAAQ,CAACuB,IAAI,EAAEA,IAAI,CAAC,CAAC;EACvF;EAGA+1B,uBAAuB,CAAC3d,SAAS,EAAEuK,cAAc,EAAEoH,SAAS,EAAE;IAE5D,IAAI3R,SAAS,IAAI,IAAI,CAAC1O,MAAM,CAACoa,aAAa,CAAC1L,SAAS,CAAC,EAAE;MACrD,IAAI,CAACsc,mBAAmB,CAACtc,SAAS,CAAC;MACnC;IACF;IAEA,MAAMlY,MAAM,GAAG,CAAC,CAAC;IACjB,IAAI8E,6DAAqB,CAACoT,SAAS,CAAC,EAAE;MAEpClY,MAAM,CAAC+U,GAAG,GAAG;QAACgE,IAAI,EAAEnqB,gEAAuBA;MAAA,CAAC;MAE5CoR,MAAM,CAACoW,IAAI,GAAG;QAACtM,MAAM,EAAE;UAACE,IAAI,EAAEpb,gEAAuBA;QAAA;MAAC,CAAC;IACzD,CAAC,MAAM;MACLspB,SAAS,GAAGA,SAAS,IAAI,IAAI,CAAC1O,MAAM,CAACu3B,iBAAiB,CAAClX,SAAS,CAAC;MACjE,IAAIpH,cAAc,EAAE;QAClBziB,MAAM,CAACoW,IAAI,GAAG;UAAChK,MAAM,EAAEqW,cAAc,CAACrW,MAAM;UAAE2B,OAAO,EAAE;YAAC0H,OAAO,EAAEgN,cAAc,CAAC1U;UAAO;QAAC,CAAC;QACzF/N,MAAM,CAACqtB,IAAI,GAAG5K,cAAc,CAAC4K,IAAI;MACnC;IACF;IACArtB,MAAM,CAAC0iB,UAAU,GAAGxK,SAAS;IAC7B,IAAI,CAACzN,QAAQ,CAAC;MAACgY,cAAc,EAAEziB;IAAM,CAAC,EAAE5K,CAAC,IAAI;MAAC,IAAI,CAACo/B,mBAAmB,CAACtc,SAAS,CAAC;IAAA,CAAC,CAAC;EACrF;EAGA4d,qBAAqB,CAACkL,OAAO,EAAEC,OAAO,EAAE;IACtC,IAAI3gB,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,IAAI,CAACxkB,KAAK,CAACm9B,eAAe,EAAE;MAC9B3Y,SAAS,GAAG;QAACzkB,SAAS,EAAE/K,kEAAsB;QAAEmoC,eAAe,EAAE;MAAK,CAAC;IACzE;IACA,IAAI,IAAI,CAACn9B,KAAK,CAAC+S,aAAa,IAAImyB,OAAO,IAAIA,OAAO,IAAIC,OAAO,EAAE;MAI7D3gB,SAAS,CAACzR,aAAa,GAAGoyB,OAAO;IACnC;IACA,IAAI,CAACx2B,QAAQ,CAAC6V,SAAS,EAAElrB,CAAC,IAAI;MAC5BwK,sEAAyB,CAACA,uEAA0B,CAAC,EAAE,EAAEqhC,OAAO,CAAC,CAAC;IACpE,CAAC,CAAC;EACJ;EAEAlL,wBAAwB,CAAC7d,SAAS,EAAEoL,GAAG,EAAE8J,IAAI,EAAEtjB,MAAM,EAAE;IACrD,IAAI,CAAC4pB,WAAW,EAAE;IAElB,MAAMryB,KAAK,GAAG,IAAI,CAACmI,MAAM,CAAC+K,QAAQ,CAAC2D,SAAS,CAAC;IAC7C,IAAI7W,KAAK,EAAE;MACT,MAAMrB,MAAM,GAAG,CAAC,CAAC;MACjB,IAAIwgC,WAAW;MACf,IAAIld,GAAG,EAAE;QACP,IAAIA,GAAG,CAACnyB,KAAK,EAAE;UACb,IAAImyB,GAAG,CAACnyB,KAAK,CAACC,GAAG,IAAIkyB,GAAG,CAACnyB,KAAK,CAACC,GAAG,IAAI0T,uDAAe,EAAE;YACrD07B,WAAW,GAAG,CAACld,GAAG,CAACnyB,KAAK,CAACC,GAAG,CAAC;UAC/B,CAAC,MAAM,IAAI,CAACkyB,GAAG,CAACnyB,KAAK,CAACE,IAAI,IAAIiyB,GAAG,CAACnyB,KAAK,CAACE,IAAI,IAAIyT,uDAAe,EAAE;YAC/Dwe,GAAG,CAACnyB,KAAK,GAAG2T,uDAAe;UAC7B;QACF;QACA9E,MAAM,CAACoM,MAAM,GAAGkX,GAAG;MACrB;MAEA,IAAI,OAAO8J,IAAI,IAAI,QAAQ,EAAE;QAC3BptB,MAAM,CAAC+N,OAAO,GAAIqf,IAAI,KAAKtoB,uDAAe,GACxCA,uDAAe,GAAG;UAAC2Q,OAAO,EAAE2X;QAAI,CAAC;MACrC;MACA,IAAItjB,MAAM,EAAE;QACV9J,MAAM,CAAC8J,MAAM,GAAGA,MAAM;MACxB;MACAzI,KAAK,CAACm+B,OAAO,CAAC;QAACppB,IAAI,EAAEpW,MAAM;QAAEwgC,WAAW,EAAEA;MAAW,CAAC,CAAC,CACpD1iC,KAAK,CAACnK,GAAG,IAAI,IAAI,CAAC+/B,WAAW,CAAC//B,GAAG,CAACwK,OAAO,EAAE,KAAK,CAAC,CAAC;IACvD;EACF;EAEA8V,eAAe,CAACiE,SAAS,EAAE;IACzB,MAAM7W,KAAK,GAAG,IAAI,CAACmI,MAAM,CAAC+K,QAAQ,CAAC2D,SAAS,CAAC;IAC7C,IAAI7W,KAAK,EAAE;MACTA,KAAK,CAAC4M,OAAO,CAAC,KAAK,CAAC,CAACnQ,KAAK,CAACnK,GAAG,IAAI,IAAI,CAAC+/B,WAAW,CAAC//B,GAAG,CAACwK,OAAO,EAAE,KAAK,CAAC,CAAC;IACzE;EACF;EAEA22B,2BAA2B,CAACpqB,QAAQ,EAAG;IACrC,IAAI,CAACgpB,WAAW,EAAE;IAElB,IAAIhpB,QAAQ,EAAE;MACZ,IAAI,CAAClB,MAAM,CAAC03B,kBAAkB,CAAC,IAAI,EAAE,IAAI,CAAC13B,MAAM,CAAC23B,eAAe,EAAE,EAAEz2B,QAAQ,CAAC,CAC1E5M,KAAK,CAACnK,GAAG,IAAI,IAAI,CAAC+/B,WAAW,CAAC//B,GAAG,CAACwK,OAAO,EAAE,KAAK,CAAC,CAAC;IACvD;EACF;EAEA63B,uBAAuB,CAAC9d,SAAS,EAAEa,IAAI,EAAElC,GAAG,EAAE;IAC5C,MAAMxV,KAAK,GAAG,IAAI,CAACmI,MAAM,CAAC+K,QAAQ,CAAC2D,SAAS,CAAC;IAC7C,IAAI7W,KAAK,EAAE;MACT,MAAM4+B,EAAE,GAAG5+B,KAAK,CAAC2T,aAAa,EAAE;MAChC,IAAI6B,GAAG,EAAE;QACPopB,EAAE,CAACmB,WAAW,CAACroB,IAAI,CAAC;QACpBA,IAAI,GAAGknB,EAAE,CAACrrB,QAAQ,EAAE;MACtB,CAAC,MAAM;QACLqrB,EAAE,CAACC,UAAU,CAACnnB,IAAI,CAAC;QACnBA,IAAI,GAAGknB,EAAE,CAACprB,OAAO,EAAE;MACrB;MACAxT,KAAK,CAACm+B,OAAO,CAAC;QAACzqB,GAAG,EAAE;UAACuC,IAAI,EAAET,GAAG;UAAEkC,IAAI,EAAEA;QAAI;MAAC,CAAC,CAAC,CAC1Cjb,KAAK,CAACnK,GAAG,IAAI,IAAI,CAAC+/B,WAAW,CAAC//B,GAAG,CAACwK,OAAO,EAAE,KAAK,CAAC,CAAC;IACvD;EACF;EAEA83B,uBAAuB,CAAC/d,SAAS,EAAEmV,IAAI,EAAE;IACvC,MAAMhsB,KAAK,GAAG,IAAI,CAACmI,MAAM,CAAC+K,QAAQ,CAAC2D,SAAS,CAAC;IAC7C,IAAI7W,KAAK,EAAE;MACTA,KAAK,CAACm+B,OAAO,CAAC;QAACnS,IAAI,EAAEA;MAAI,CAAC,CAAC,CACxBvvB,KAAK,CAACnK,GAAG,IAAI,IAAI,CAAC+/B,WAAW,CAAC//B,GAAG,CAACwK,OAAO,EAAE,KAAK,CAAC,CAAC;IACvD;EACF;EAEA+3B,YAAY,GAAG;IACbnxB,6DAAa,CAAC,CAAC,CAAC;IAGhB/F,YAAY,CAACW,UAAU,CAAC,YAAY,CAAC;IACrCX,YAAY,CAACW,UAAU,CAAC,gBAAgB,CAAC;IACzCX,YAAY,CAACW,UAAU,CAAC,UAAU,CAAC;IACnC,IAAI,IAAI,CAAC7D,KAAK,CAACs8B,aAAa,EAAE;MAC5BtG,+DAAgB,CAAC,IAAI,CAACwJ,GAAG,CAAC;IAC5B;IAEAlX,aAAa,CAAC,IAAI,CAAC6Y,kBAAkB,CAAC;IAEtC,IAAIoE,OAAO;IACX,IAAI,IAAI,CAAC73B,MAAM,EAAE;MACf63B,OAAO,GAAG,IAAI,CAAC73B,MAAM,CAAC+zB,YAAY,EAAE;MACpC,IAAI,CAAC/zB,MAAM,CAAC2wB,YAAY,GAAGp/B,SAAS;MACpC,IAAI,CAACyO,MAAM,CAACk1B,UAAU,EAAE;IAC1B,CAAC,MAAM;MACL2C,OAAO,GAAGC,OAAO,CAACjuC,OAAO,EAAE;IAC7B;IACA,IAAI,CAACoX,QAAQ,CAAC,IAAI,CAAC2oB,aAAa,EAAE,CAAC;IAEnCiO,OAAO,CAAC7jC,IAAI,CAACpI,CAAC,IAAI;MAChB,IAAI,CAACoU,MAAM,GAAG0pB,SAAS,CAAC+G,OAAO,CAAC,IAAI,CAACn+B,KAAK,CAAC8P,aAAa,EAAEjN,sEAAkB,EAAE,EAC5E,IAAI,CAAC7C,KAAK,CAACkzB,SAAS,EAAE,IAAI,CAAC7mB,KAAK,CAACgD,IAAI,CAAC5J,MAAM,EAAE1C,wEAA0B,CAAC,gBAAgB,CAAC,EAAEzJ,CAAC,IAAI;QAC/F,IAAI,CAACoU,MAAM,CAAC0wB,SAAS,GAAG,IAAI,CAACrG,eAAe;QAC5C,IAAI,CAACrqB,MAAM,CAAC2wB,YAAY,GAAG,IAAI,CAAClG,gBAAgB;QAChD,IAAI,CAACzqB,MAAM,CAAC4wB,wBAAwB,GAAG,IAAI,CAACtG,4BAA4B;QACxE,IAAI,CAACtqB,MAAM,CAAC6wB,aAAa,GAAG,IAAI,CAAC/C,iBAAiB;QAClD,IAAI,CAAC9tB,MAAM,CAAC8wB,aAAa,GAAG,IAAI,CAAC/C,iBAAiB;QAClD33B,sEAAyB,CAAC,EAAE,CAAC;MAC/B,CAAC,CAAC;IACN,CAAC,CAAC;EACJ;EAEA2K,mBAAmB,GAAG;IACpB,IAAI,CAACf,MAAM,CAAC+3B,cAAc,CAAC,IAAI,CAAC,CAAC/jC,IAAI,CAACpI,CAAC,IAAI;MACzC,IAAI,CAAC8gC,YAAY,EAAE;IACrB,CAAC,CAAC;EACJ;EAEAC,wBAAwB,CAACje,SAAS,EAAE;IAClC,MAAM7W,KAAK,GAAG,IAAI,CAACmI,MAAM,CAAC+K,QAAQ,CAAC2D,SAAS,CAAC;IAC7C,IAAI,CAAC7W,KAAK,EAAE;MACV;IACF;IAGAA,KAAK,CAAC2+B,QAAQ,CAAC,IAAI,CAAC,CAACxiC,IAAI,CAACpI,CAAC,IAAI;MAE7BwK,sEAAyB,CAACA,uEAA0B,CAACrH,MAAM,CAACgG,QAAQ,CAACuB,IAAI,EAAE,EAAE,CAAC,CAAC;IACjF,CAAC,CAAC,CAAChC,KAAK,CAACnK,GAAG,IAAI;MACd,IAAI,CAAC+/B,WAAW,CAAC//B,GAAG,CAACwK,OAAO,EAAE,KAAK,CAAC;IACtC,CAAC,CAAC;EACJ;EAEAi4B,2BAA2B,CAACle,SAAS,EAAE;IACrC,MAAM7W,KAAK,GAAG,IAAI,CAACmI,MAAM,CAAC+K,QAAQ,CAAC2D,SAAS,CAAC;IAC7C,IAAI,CAAC7W,KAAK,EAAE;MACV;IACF;IAGAA,KAAK,CAACmgC,cAAc,CAAC,IAAI,CAAC,CACvB1jC,KAAK,CAACnK,GAAG,IAAI,IAAI,CAAC+/B,WAAW,CAAC//B,GAAG,CAACwK,OAAO,EAAE,KAAK,CAAC,CAAC;EACvD;EAEAk4B,uBAAuB,CAACne,SAAS,EAAE;IACjC,MAAM7W,KAAK,GAAG,IAAI,CAACmI,MAAM,CAAC+K,QAAQ,CAAC2D,SAAS,CAAC;IAC7C,IAAI,CAAC7W,KAAK,EAAE;MACV;IACF;IAEAA,KAAK,CAACya,KAAK,CAAC,IAAI,CAAC,CAACte,IAAI,CAACpI,CAAC,IAAI;MAE1BwK,sEAAyB,CAACA,uEAA0B,CAACrH,MAAM,CAACgG,QAAQ,CAACuB,IAAI,EAAE,EAAE,CAAC,CAAC;IACjF,CAAC,CAAC,CAAChC,KAAK,CAACnK,GAAG,IAAI;MACd,IAAI,CAAC+/B,WAAW,CAAC//B,GAAG,CAACwK,OAAO,EAAE,KAAK,CAAC;IACtC,CAAC,CAAC;EACJ;EAEAm4B,uBAAuB,CAACpe,SAAS,EAAE;IACjC,MAAM7W,KAAK,GAAG,IAAI,CAACmI,MAAM,CAAC+K,QAAQ,CAAC2D,SAAS,CAAC;IAC7C,IAAI,CAAC7W,KAAK,EAAE;MACV;IACF;IAEAA,KAAK,CAACogC,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,CAC1BjkC,IAAI,CAACpI,CAAC,IAAI;MAETwK,sEAAyB,CAACA,uEAA0B,CAACrH,MAAM,CAACgG,QAAQ,CAACuB,IAAI,EAAE,EAAE,CAAC,CAAC;IACjF,CAAC,CAAC,CACDhC,KAAK,CAACnK,GAAG,IAAI,IAAI,CAAC+/B,WAAW,CAAC//B,GAAG,CAACwK,OAAO,EAAE,KAAK,CAAC,CAAC;EACvD;EAEAo4B,iBAAiB,CAACre,SAAS,EAAE;IAC3B,MAAM7W,KAAK,GAAG,IAAI,CAACmI,MAAM,CAAC+K,QAAQ,CAAC2D,SAAS,CAAC;IAC7C,IAAI,CAAC7W,KAAK,EAAE;MACV;IACF;IAGA,IAAI,CAACmI,MAAM,CAACk4B,MAAM,CAAC,QAAQ,EAAExpB,SAAS,CAAC;IAGvC7W,KAAK,CAACogC,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,CAC5BjkC,IAAI,CAACpI,CAAC,IAAI;MAETwK,sEAAyB,CAACA,uEAA0B,CAACrH,MAAM,CAACgG,QAAQ,CAACuB,IAAI,EAAE,EAAE,CAAC,CAAC;IACjF,CAAC,CAAC,CACDhC,KAAK,CAACnK,GAAG,IAAI,IAAI,CAAC+/B,WAAW,CAAC//B,GAAG,CAACwK,OAAO,EAAE,KAAK,CAAC,CAAC;EACrD;EAEAq4B,qBAAqB,CAACx2B,MAAM,EAAEoY,SAAS,EAAE;IACvC,IAAI,CAAC3N,QAAQ,CAAC;MACZyuB,kBAAkB,EAAE,IAAI;MACxBE,kBAAkB,EAAE;QAAC9gB,CAAC,EAAEtY,MAAM,CAACsY,CAAC;QAAEC,CAAC,EAAEvY,MAAM,CAACuY;MAAC,CAAC;MAC9C8gB,iBAAiB,EAAEr5B,MAAM;MACzBs5B,gBAAgB,EAAElhB,SAAS,IAAI,IAAI,CAACqe,uBAAuB,CAACz2B,MAAM,CAACkY,SAAS,CAAC;MAC7EihB,iBAAiB,EAAE,IAAI,CAAChG,OAAO,CAACvK,OAAO,CAAC+Y,qBAAqB;IAC/D,CAAC,CAAC;EACJ;EAGAzK,uBAAuB,CAACl3B,MAAM,EAAE;IAC9B,IAAI,IAAI,CAAClE,KAAK,CAACw8B,iBAAiB,IAAI,QAAQ,EAAE;MAE5C,IAAI,CAAC1C,qBAAqB,EAAE;IAC9B;IACA,MAAM/+B,MAAM,GAAG,IAAI,GAAGmJ,MAAM,CAAC6lB,QAAQ;IACrC,MAAMlE,OAAO,GAAG,OAAO3hB,MAAM,CAAC2hB,OAAO,IAAI,QAAQ,GAAG7oB,mDAAW,CAACkH,MAAM,CAAC2hB,OAAO,CAAC,GAAG7oB,+DAAuB,CAACkH,MAAM,CAAC2hB,OAAO,CAAC;IACzH,MAAM3mB,OAAO,GAAGlC,sDAAc,CAAC6oB,OAAO,EAAEvxB,iEAAwB,EAAE,IAAI,CAAC;IACvE,MAAMq0B,GAAG,GAAG3rB,qDAAa,CAACA,8DAAsB,CAACA,sDAAc,CAACjC,MAAM,EAAEmJ,MAAM,CAAC4lB,QAAQ,CAAC,CAAC,EAAEjE,OAAO,CAAC;IACnG,MAAMmgB,UAAU,GAAGhpC,oDAAY,CAACjC,MAAM,EAAEmJ,MAAM,CAAC4lB,QAAQ,EAAE5qB,OAAO,CAAC;IAEjE,MAAMkK,IAAI,GAAG;MACX68B,SAAS,EAAE/hC,MAAM,CAACkY,SAAS,GAAG,GAAG,GAAGlY,MAAM,CAAC4hB;IAC7C,CAAC;IACD,IAAI,CAACnX,QAAQ,CAAC;MACZ8uB,oBAAoB,EAAE,IAAI;MAC1B7X,cAAc,EAAE;QAAExc,IAAI,EAAEA,IAAI;QAAEuf,GAAG,EAAEA,GAAG;QAAEzpB,OAAO,EAAE8mC;MAAW;IAC9D,CAAC,CAAC;EACJ;EAEArL,uBAAuB,CAACve,SAAS,EAAE;IACjC,MAAM7W,KAAK,GAAG,IAAI,CAACmI,MAAM,CAAC+K,QAAQ,CAAC2D,SAAS,CAAC;IAE7C,IAAI7W,KAAK,CAACogB,QAAQ,EAAE;MAClB,OAAO,CACL,cAAc,CACf;IACH;IAEA,IAAI1O,KAAK,GAAG,KAAK;MAAEjF,OAAO,GAAG,KAAK;MAAEk0B,YAAY,GAAG,KAAK;MAAEC,UAAU,GAAG,KAAK;MAAEnvB,OAAO,GAAG,KAAK;MAC3F4C,QAAQ,GAAG,KAAK;MAAE8N,MAAM,GAAG,KAAK;IAClC,IAAIniB,KAAK,EAAE;MACT4gC,UAAU,GAAG5gC,KAAK,CAACkhB,YAAY,EAAE;MACjC7M,QAAQ,GAAGrU,KAAK,CAACsU,UAAU,EAAE;MAE7B,MAAM/L,GAAG,GAAGvI,KAAK,CAAC2T,aAAa,EAAE;MACjC,IAAIpL,GAAG,EAAE;QACPmJ,KAAK,GAAGnJ,GAAG,CAAC4L,OAAO,EAAE;QACrB1H,OAAO,GAAG,CAAClE,GAAG,CAACC,QAAQ,EAAE;QACzBm4B,YAAY,GAAG,CAACp4B,GAAG,CAACC,QAAQ,CAAC,MAAM,CAAC;QACpCiJ,OAAO,GAAGlJ,GAAG,CAAC2L,SAAS,EAAE;MAC3B;IACF;IAEAiO,MAAM,GAAG,CAAC,CAAC,IAAI,CAACha,MAAM,CAAC+c,cAAc,CAAC,YAAY,CAAC;IAEnD,OAAO,CACL0b,UAAU,GAAG;MACXjlC,KAAK,EAAE,IAAI,CAACmL,KAAK,CAACgD,IAAI,CAAC/O,aAAa,CAAC1C,QAAQ,CAACo5B,cAAc,CAAC;MAC7Dza,OAAO,EAAE,IAAI,CAACue;IAChB,CAAC,GAAG,IAAI,EACRqL,UAAU,IAAIn9B,6DAAqB,CAACoT,SAAS,CAAC,IAAIsL,MAAM,GAAG;MACzDxmB,KAAK,EAAE,IAAI,CAACmL,KAAK,CAACgD,IAAI,CAAC/O,aAAa,CAAC1C,QAAQ,CAACq5B,oBAAoB,CAAC;MACnE1a,OAAO,EAAE,IAAI,CAACgf;IAChB,CAAC,GAAG,IAAI,EACR4K,UAAU,IAAIn9B,6DAAqB,CAACoT,SAAS,CAAC,IAAIsL,MAAM,GAAG;MACzDxmB,KAAK,EAAE,IAAI,CAACmL,KAAK,CAACgD,IAAI,CAAC/O,aAAa,CAAC1C,QAAQ,CAACs5B,oBAAoB,CAAC;MACnE3a,OAAO,EAAE,IAAI,CAAC+e;IAChB,CAAC,GAAG,IAAI,EACR6K,UAAU,GAAG,gBAAgB,GAAG,IAAI,EACpCA,UAAU,IAAInvB,OAAO,GAAG,qBAAqB,GAAG,IAAI,EACpDC,KAAK,GAAIjF,OAAO,GAAG,IAAI,GAAG,cAAc,GAAI,YAAY,EACxDk0B,YAAY,GAAG,eAAe,GAAG,aAAa,EAC9CtsB,QAAQ,GAAG,eAAe,GAAG,eAAe,EAC5C,cAAc,CACf;EACH;EAEAghB,qBAAqB,GAAG;IACtB,IAAI,CAACjsB,QAAQ,CAAC;MACZyuB,kBAAkB,EAAE,KAAK;MACzBE,kBAAkB,EAAE,IAAI;MACxBC,iBAAiB,EAAE,IAAI;MACvBF,iBAAiB,EAAE;IACrB,CAAC,CAAC;EACJ;EAEAhC,uBAAuB,CAAC+K,oBAAoB,EAAE;IAC5C,IAAI,CAACz3B,QAAQ,CAAC;MACZ8uB,oBAAoB,EAAE,KAAK;MAC3B7X,cAAc,EAAEwgB,oBAAoB,GAAG,IAAI,CAACpmC,KAAK,CAAC4lB,cAAc,GAAG;IACrE,CAAC,CAAC;EACJ;EAEAsV,uBAAuB,CAAC5oB,MAAM,EAAEhR,OAAO,EAAE4C,MAAM,EAAE;IAC/C,IAAIoO,MAAM,IAAI,eAAe,EAAE;MAC7B,IAAIhR,OAAO,IAAI4C,MAAM,CAACkY,SAAS,IAAIlY,MAAM,CAACkY,SAAS,IAAI,IAAI,CAACpc,KAAK,CAAC+S,aAAa,EAAE;QAC/EzR,OAAO,CAACI,IAAI,CAACpI,CAAC,IAAI;UAChB,IAAI,CAACo/B,mBAAmB,CAAC,IAAI,CAAC;QAChC,CAAC,CAAC;MACJ;IACF,CAAC,MAAM,IAAIpmB,MAAM,IAAI,mBAAmB,EAAE;MACxC,IAAI,CAAC8oB,uBAAuB,CAACl3B,MAAM,CAAC;IACtC;EACF;EAEA22B,eAAe,CAAC35B,KAAK,EAAE2kB,OAAO,EAAEwgB,SAAS,EAAEC,WAAW,EAAEC,QAAQ,EAAEC,UAAU,EAAE;IAC5E,IAAI,CAAC73B,QAAQ,CAAC;MACZ+uB,YAAY,EAAE,IAAI;MAClBC,WAAW,EAAE;QACXz8B,KAAK,EAAEA,KAAK;QACZ2kB,OAAO,EAAEA,OAAO;QAChBwgB,SAAS,EAAEA,SAAS;QACpBI,OAAO,EAAEH,WAAW;QACpBC,QAAQ,EAAEA,QAAQ;QAClB/uC,MAAM,EAAEgvC;MACV;IACF,CAAC,CAAC;EACJ;EAEA1L,kBAAkB,GAAG;IACnBh3B,sEAAyB,CAACA,uEAA0B,CAACrH,MAAM,CAACgG,QAAQ,CAACuB,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3F,IAAI,CAAC2K,QAAQ,CAAC;MAACsuB,SAAS,EAAE;IAAM,CAAC,CAAC;EACpC;EAEA5kB,yBAAyB,CAAC+D,SAAS,EAAEJ,KAAK,EAAEC,OAAO,EAAE;IACnD,IAAI,CAACG,SAAS,EAAE;MACd;IACF;IAEA,MAAM7W,KAAK,GAAG,IAAI,CAACmI,MAAM,CAAC+K,QAAQ,CAAC2D,SAAS,CAAC;IAC7C,IAAI,CAAC7W,KAAK,EAAE;MACV;IACF;IAEA,IAAIyW,KAAK,IAAIA,KAAK,CAACljB,MAAM,GAAG,CAAC,EAAE;MAC7BkjB,KAAK,CAACtc,GAAG,CAAEqb,GAAG,IAAK;QACjBxV,KAAK,CAACmhC,MAAM,CAAC3rB,GAAG,EAAE,IAAI,CAAC,CACpB/Y,KAAK,CAACnK,GAAG,IAAI,IAAI,CAAC+/B,WAAW,CAAC//B,GAAG,CAACwK,OAAO,EAAE,KAAK,CAAC,CAAC;MACvD,CAAC,CAAC;IACJ;IAEA,IAAI4Z,OAAO,IAAIA,OAAO,CAACnjB,MAAM,GAAG,CAAC,EAAE;MACjCmjB,OAAO,CAACvc,GAAG,CAAEqb,GAAG,IAAK;QACnBxV,KAAK,CAACohC,eAAe,CAAC5rB,GAAG,CAAC,CACvB/Y,KAAK,CAACnK,GAAG,IAAI,IAAI,CAAC+/B,WAAW,CAAC//B,GAAG,CAACwK,OAAO,EAAE,KAAK,CAAC,CAAC;MACvD,CAAC,CAAC;IACJ;EACF;EAEA04B,gCAAgC,CAAClqB,IAAI,EAAEuW,IAAI,EAAE2K,KAAK,EAAE;IAClD,IAAI,IAAI,CAACrkB,MAAM,CAACs0B,eAAe,EAAE,EAAE;MAEjC,IAAI,CAACt0B,MAAM,CAACC,UAAU,EAAE,CAAC+1B,OAAO,CAAC;QAAC7yB,IAAI,EAAE;UAACE,IAAI,EAAEF,IAAI;UAAEyY,IAAI,EAAElC;QAAI;MAAC,CAAC,CAAC,CAC/DplB,KAAK,CAACnK,GAAG,IAAI,IAAI,CAAC+/B,WAAW,CAAC//B,GAAG,CAACwK,OAAO,EAAE,KAAK,CAAC,CAAC;IACvD,CAAC,MAAM;MAEL,IAAI,CAACsM,QAAQ,CAAC;QAACymB,UAAU,EAAEvkB,IAAI;QAAEskB,QAAQ,EAAE/N,IAAI;QAAEiO,SAAS,EAAEtD;MAAK,CAAC,CAAC;MACnE,IAAI,CAACkG,OAAO,CAAC,IAAI,EAAE,IAAI,EAAElG,KAAK,EAAE;QAAChhB,IAAI,EAAEF,IAAI;QAAEyY,IAAI,EAAElC;MAAI,CAAC,CAAC;IAC3D;EACF;EAEA4T,0BAA0B,CAACiG,MAAM,EAAEh+B,KAAK,EAAE;IAExC,OAAO,IAAI,CAACyK,MAAM,CAACiH,OAAO,EAAE,CACzBjT,IAAI,CAACpI,CAAC,IAAI,IAAI,CAACoU,MAAM,CAACk5B,sBAAsB,CAAC,OAAO,EAAE3F,MAAM,EAAEh+B,KAAK,CAAC,CAAC,CACrEjB,KAAK,CAACnK,GAAG,IAAI;MAEZ,IAAI,CAAC+/B,WAAW,CAAC//B,GAAG,CAACwK,OAAO,EAAE,KAAK,CAAC;IACtC,CAAC,CAAC;EACN;EAEA44B,mBAAmB,CAAC4L,WAAW,EAAEC,QAAQ,EAAE;IACzC,MAAM5U,MAAM,GAAG72B,qEAAc,CAACyrC,QAAQ,CAAC5U,MAAM,CAAC;IAC9C,IAAI,CAACA,MAAM,IAAI,CAAC4U,QAAQ,CAAC9U,MAAM,EAAE;MAC/B,IAAI,CAAC4F,WAAW,CAAC,IAAI,CAACvrB,KAAK,CAACgD,IAAI,CAAC/O,aAAa,CAAC1C,QAAQ,CAACi5B,sBAAsB,CAAC,EAAE,KAAK,CAAC;IACzF,CAAC,MAAM;MACL,IAAI,CAACnpB,MAAM,CAACiH,OAAO,EAAE,CAClBjT,IAAI,CAACpI,CAAC,IAAI,IAAI,CAACoU,MAAM,CAAC03B,kBAAkB,CAAC,IAAI,EAAE,IAAI,EAAEyB,WAAW,EAAE;QAAC7U,MAAM,EAAE8U,QAAQ,CAAC9U,MAAM;QAAEE,MAAM,EAAEA;MAAM,CAAC,CAAC,CAAC,CAC7GxwB,IAAI,CAACpI,CAAC,IAAIwK,sEAAyB,CAAC,EAAE,CAAC,CAAC,CACxC9B,KAAK,CAACnK,GAAG,IAAI;QAEZ,IAAI,CAAC+/B,WAAW,CAAC//B,GAAG,CAACwK,OAAO,EAAE,KAAK,CAAC;MACtC,CAAC,CAAC;IACN;EACF;EAEA84B,yBAAyB,CAAC/T,IAAI,EAAE2f,IAAI,EAAEC,gBAAgB,EAAE;IACtD,IAAI,CAACnM,eAAe,CAAC,gBAAgB,EACnC,2DAAC,2CAAQ;MAAC,QAAQ,EAAE,wEAAK,2DAAC,wDAAgB;QAAC,EAAE,gBAAe;QAAC,cAAc;UAAA;UAAA;QAAA;MAAa,EAC/B;IAAO,GAC9D,2DAAC,oBAAoB;MACnB,QAAQ,EAAEzT,IAAK;MACf,QAAQ,EAAE,CAACxqB,CAAC,EAAEqqC,CAAC,KAAK;QAClB,IAAI,CAACt4B,QAAQ,CAAC;UAAC+uB,YAAY,EAAE;QAAK,CAAC,CAAC;QACpCsJ,gBAAgB,CAACpqC,CAAC,EAAEqqC,CAAC,CAAC;MACxB;IAAE,EAAG,CACE,EACX,IAAI,EAAE,IAAI,EAAE3tC,CAAC,IAAI,CAAC,CAAC,EAAE,QAAQ,CAAC;EAClC;EAEAgiC,oBAAoB,GAAG;IACrB,IAAI,CAAC3sB,QAAQ,CAAC;MACZwX,SAAS,EAAE,IAAI,CAACnmB,KAAK,CAAC+S,aAAa;MACnChT,SAAS,EAAEjL,wEAA4B;MACvC44B,aAAa,EAAE;IACjB,CAAC,CAAC;EACJ;EAEA6N,oBAAoB,GAAG;IACrB,IAAI,CAAC5sB,QAAQ,CAAC;MACZwX,SAAS,EAAE,IAAI,CAACnmB,KAAK,CAAC+S,aAAa;MACnChT,SAAS,EAAEjL,wEAA4B;MACvC44B,aAAa,EAAE;IACjB,CAAC,CAAC;EACJ;EAEAiO,gBAAgB,CAACxV,SAAS,EAAEtC,OAAO,EAAE9jB,SAAS,EAAEmnC,SAAS,EAAE;IACzD,QAAQnnC,SAAS;MACf,KAAKjL,wEAA4B;QAC/B,MAAMsU,IAAI,GAAG;UAAEse,MAAM,EAAEzyB,6DAAiB;UAAEkyC,KAAK,EAAE,CAAC,CAACD;QAAU,CAAC;QAC9D,IAAI,CAACtO,iBAAiB,CAAC57B,wDAAgB,CAACkqC,SAAS,CAAC,EAAEjoC,SAAS,EAAEA,SAAS,EAAEmK,IAAI,CAAC,CAC5E1H,IAAI,CAACylB,IAAI,IAAI;UACZ,IAAIA,IAAI,CAACC,IAAI,GAAG,GAAG,IAAID,IAAI,CAACC,IAAI,IAAI,GAAG,IAAI,CAACD,IAAI,CAACjjB,MAAM,IAAI,CAACijB,IAAI,CAACjjB,MAAM,CAAC4hB,GAAG,EAAE;YAC3E,IAAI,CAAC4V,eAAe,EAAE;YACtB;UACF;UACA,IAAI,CAAC/sB,QAAQ,CAAC;YAACkV,OAAO,EAAEsD,IAAI,CAACjjB,MAAM,CAAC,KAAK;UAAC,CAAC,CAAC;QAC9C,CAAC,CAAC;QACJ;MACF,KAAKlP,kEAAsB;QACzB,MAAMuQ,KAAK,GAAG,IAAI,CAACmI,MAAM,CAAC+K,QAAQ,CAAC0N,SAAS,CAAC;QAC7C,IAAI,CAAC5gB,KAAK,EAAE;UACV;QACF;QAEAA,KAAK,CAAC6hC,SAAS,CAAC,QAAQ,EAAEvjB,OAAO,CAAC;QAClC;IAAM;EAEZ;EAEA+X,iBAAiB,CAACzV,SAAS,EAAEtC,OAAO,EAAE;IACpC,MAAMte,KAAK,GAAG,IAAI,CAACmI,MAAM,CAAC+K,QAAQ,CAAC0N,SAAS,CAAC;IAC7C,IAAI,CAAC5gB,KAAK,EAAE;MACV;IACF;IAEAA,KAAK,CAAC6hC,SAAS,CAAC,SAAS,EAAEvjB,OAAO,CAAC;EACrC;EAEA1B,gBAAgB,CAACgE,SAAS,EAAEtC,OAAO,EAAE;IACnC,MAAMte,KAAK,GAAG,IAAI,CAACmI,MAAM,CAAC+K,QAAQ,CAAC0N,SAAS,CAAC;IAC7C,IAAI,CAAC5gB,KAAK,EAAE;MACV;IACF;IAEAA,KAAK,CAAC6hC,SAAS,CAAC,SAAS,EAAEvjB,OAAO,CAAC;EACrC;EAEAgY,mBAAmB,CAAC1V,SAAS,EAAEtC,OAAO,EAAEwjB,GAAG,EAAE;IAC3C,MAAM9hC,KAAK,GAAG,IAAI,CAACmI,MAAM,CAAC+K,QAAQ,CAAC0N,SAAS,CAAC;IAC7C,IAAI,CAAC5gB,KAAK,EAAE;MACV;IACF;IAEAA,KAAK,CAAC6hC,SAAS,CAAC,OAAO,EAAEvjB,OAAO,EAAEwjB,GAAG,CAAC;EACxC;EAEAvL,sBAAsB,CAAC3V,SAAS,EAAEtC,OAAO,EAAEyjB,SAAS,EAAE;IACpD,MAAM/hC,KAAK,GAAG,IAAI,CAACmI,MAAM,CAAC+K,QAAQ,CAAC0N,SAAS,CAAC;IAC7C,IAAI,CAAC5gB,KAAK,EAAE;MACV;IACF;IAEAA,KAAK,CAAC6hC,SAAS,CAAC,eAAe,EAAEvjB,OAAO,EAAEyjB,SAAS,CAAC;EACtD;EACAvL,oBAAoB,CAAC5V,SAAS,EAAEtC,OAAO,EAAEwjB,GAAG,EAAE;IAC5C,MAAM9hC,KAAK,GAAG,IAAI,CAACmI,MAAM,CAAC+K,QAAQ,CAAC0N,SAAS,CAAC;IAC7C,IAAI,CAAC5gB,KAAK,EAAE;MACV;IACF;IAEAA,KAAK,CAAC6hC,SAAS,CAAC,QAAQ,EAAEvjB,OAAO,EAAEwjB,GAAG,CAAC;EACzC;EAEA3L,eAAe,GAAG;IAChB,IAAI,IAAI,CAACQ,gBAAgB,EAAE;MACzBtT,YAAY,CAAC,IAAI,CAACsT,gBAAgB,CAAC;IACrC;IACA,IAAI,CAACvtB,QAAQ,CAAC;MACZwX,SAAS,EAAElnB,SAAS;MACpBc,SAAS,EAAElL,2DAAe;MAC1B64B,aAAa,EAAEzuB;IACjB,CAAC,CAAC;EACJ;EAEA+8B,gBAAgB,CAAC5f,SAAS,EAAE;IAC1B,MAAM7W,KAAK,GAAG,IAAI,CAACmI,MAAM,CAAC+K,QAAQ,CAAC2D,SAAS,CAAC;IAC7C,IAAI,CAAC7W,KAAK,EAAE;MACV;IACF;IACA,IAAIA,KAAK,CAACkhB,YAAY,EAAE,EAAE;MACxB,IAAI,CAACiS,mBAAmB,CAAC,IAAI,CAAC14B,KAAK,CAACmmB,SAAS,CAAC;MAC9C,IAAI,CAACxX,QAAQ,CAAC;QACZ5O,SAAS,EAAE/K,kEAAsBA;MACnC,CAAC,CAAC;IACJ,CAAC,MAAM;MAEL,IAAI,CAAC2Z,QAAQ,CAAC;QACZwuB,eAAe,EAAE;MACnB,CAAC,EAAE7jC,CAAC,IAAI,IAAI,CAACo/B,mBAAmB,CAAC,IAAI,CAAC14B,KAAK,CAACmmB,SAAS,CAAC,CAAC;IACzD;EACF;EAEAqV,iBAAiB,CAACn2B,IAAI,EAAE;IACtB,IAAIA,IAAI,CAACmH,IAAI,IAAI,MAAM,EAAE;MACvB;IACF;IACA,QAAQnH,IAAI,CAACnL,KAAK;MAChB,KAAK,QAAQ;QAEX,IAAI8O,4DAAoB,CAAC3D,IAAI,CAACE,KAAK,CAAC,IAAI,IAAI,CAACmI,MAAM,CAAC2O,IAAI,CAAChX,IAAI,CAAC0jB,IAAI,CAAC,EAAE;UACnE,IAAI,CAACpa,QAAQ,CAAC;YACZwX,SAAS,EAAE,IAAI;YACfpmB,SAAS,EAAElL,2DAAe;YAC1BgvB,OAAO,EAAE,IAAI;YACb6J,aAAa,EAAEzuB;UACjB,CAAC,CAAC;UACF;QACF;QACA,IAAIoG,IAAI,CAACE,KAAK,IAAI,IAAI,CAACvF,KAAK,CAACmmB,SAAS,EAAE;UAEtC,IAAI,CAACxX,QAAQ,CAAC;YAAC5O,SAAS,EAAE/K,kEAAsBA;UAAA,CAAC,CAAC;QACpD;QACA;MACF,KAAK,SAAS;QAEZ,IAAI,CAAC0mC,eAAe,EAAE;QACtB;IAAM;EAEZ;EAEAD,iBAAiB,CAAClmC,IAAI,EAAE;IACtB,IAAIA,IAAI,CAAC6T,IAAI,IAAI7T,IAAI,CAAC6T,IAAI,CAACse,MAAM,IAAInyB,IAAI,CAAC6T,IAAI,CAACse,MAAM,IAAIzyB,6DAAiB,EAAE;MAG1E,MAAMsQ,KAAK,GAAG,IAAI,CAACmI,MAAM,CAAC+K,QAAQ,CAACljB,IAAI,CAACgQ,KAAK,CAAC;MAC9C,IAAIA,KAAK,EAAE;QAGT,MAAMojB,GAAG,GAAGpjB,KAAK,CAACiiC,gBAAgB,CAACjyC,IAAI,CAACuwB,GAAG,CAAC,IAAIvwB,IAAI;QACpD,IAAIozB,GAAG,CAACvf,IAAI,IAAIuf,GAAG,CAACvf,IAAI,CAACse,MAAM,IAAIiB,GAAG,CAACvf,IAAI,CAACse,MAAM,IAAIzyB,6DAAiB,EAAE;UAEvE,IAAIM,IAAI,CAACwzB,IAAI,IAAI,IAAI,CAAC/oB,KAAK,CAACsR,QAAQ,EAAE;YACpC,IAAI,IAAI,CAACtR,KAAK,CAACD,SAAS,IAAIlL,2DAAe,EAAE;cAE3C,IAAI,CAAC8Z,QAAQ,CAAC;gBACZwX,SAAS,EAAE5wB,IAAI,CAACgQ,KAAK;gBACrBxF,SAAS,EAAEhL,wEAA4B;gBACvC8uB,OAAO,EAAEtuB,IAAI,CAACuwB,GAAG;gBACjB4H,aAAa,EAAE,CAAC,CAAC/E,GAAG,CAACvf,IAAI,CAAC+9B;cAC5B,CAAC,CAAC;YACJ,CAAC,MAAM;cAGL,IAAI,CAAChlB,gBAAgB,CAAC5sB,IAAI,CAACgQ,KAAK,EAAEhQ,IAAI,CAACuwB,GAAG,CAAC;YAC7C;UACF;QACF;MACF,CAAC,MAAM;QACLjrB,OAAO,CAACuH,IAAI,CAAC,6CAA6C,EAAE7M,IAAI,CAACgQ,KAAK,CAAC;MACzE;IACF;EACF;EAEAsH,MAAM,GAAG;IACP,OACE;MAAK,EAAE,EAAC,eAAe;MAAC,GAAG,EAAE,IAAI,CAACwqB;IAAQ,GACvC,IAAI,CAACr3B,KAAK,CAACo9B,kBAAkB,GAC5B,2DAAC,iEAAW;MACV,MAAM,EAAE,IAAI,CAAC1vB,MAAO;MACpB,MAAM,EAAE,IAAI,CAAC1N,KAAK,CAACq9B,iBAAkB;MACrC,OAAO,EAAE,IAAI,CAACr9B,KAAK,CAACs9B,kBAAmB;MACvC,MAAM,EAAE,IAAI,CAACt9B,KAAK,CAACu9B,iBAAkB;MACrC,KAAK,EAAE,IAAI,CAACv9B,KAAK,CAACw9B,gBAAiB;MACnC,IAAI,EAAE,IAAI,CAAC5C,qBAAsB;MACjC,WAAW,EAAE,IAAI,CAACC,eAAgB;MAClC,QAAQ,EAAE,IAAI,CAACK,uBAAwB;MACvC,cAAc,EAAG9e,SAAS,IAAK;QAC7B,IAAIA,SAAS,IAAI,IAAI,CAACpc,KAAK,CAAC+S,aAAa,EAAE;UACzC,IAAI,CAAC2lB,mBAAmB,CAAC,IAAI,CAAC;QAChC;MACF,CAAE;MACF,OAAO,EAAE,IAAI,CAACd;IAAY,EAAG,GAE/B,IAAI,EAEL,IAAI,CAAC53B,KAAK,CAACy9B,oBAAoB,GAC9B,2DAAC,mEAAa;MACZ,MAAM,EAAE,IAAI,CAAC/vB,MAAO;MACpB,QAAQ,EAAE,IAAI,CAAC1N,KAAK,CAAC+R,QAAS;MAC9B,aAAa,EAAE,IAAI,CAAC/R,KAAK,CAAC+S,aAAc;MACxC,QAAQ,EAAE,IAAI,CAAC/S,KAAK,CAACsR,QAAS;MAE9B,IAAI,EAAE,IAAI,CAAC+pB,uBAAwB;MACnC,UAAU,EAAE,IAAI,CAAC7C,UAAW;MAC5B,aAAa,EAAE,IAAI,CAACx4B,KAAK,CAACyxB,aAAc;MACxC,gBAAgB,EAAE,IAAI,CAACd,oBAAqB;MAC5C,eAAe,EAAE,IAAI,CAACoJ;IAAwB,EAC9C,GAEF,IAAI,EAEL,IAAI,CAAC/5B,KAAK,CAACmmB,SAAS,IAAI,IAAI,CAACnmB,KAAK,CAACD,SAAS,IAAIhL,wEAA4B,GAC3E,2DAAC,kEAAY;MACX,MAAM,EAAE,IAAI,CAAC2Y,MAAO;MACpB,KAAK,EAAE,IAAI,CAAC1N,KAAK,CAACmmB,SAAU;MAC5B,GAAG,EAAE,IAAI,CAACnmB,KAAK,CAAC6jB,OAAQ;MACxB,SAAS,EAAE,IAAI,CAAC7jB,KAAK,CAACD,SAAU;MAChC,SAAS,EAAE,IAAI,CAACC,KAAK,CAAC0tB,aAAc;MACpC,OAAO,EAAE,IAAI,CAACgO,eAAgB;MAC9B,SAAS,EAAE,IAAI,CAACE,iBAAkB;MAClC,YAAY,EAAE,IAAI,CAACI,gBAAiB;MACpC,QAAQ,EAAE,IAAI,CAAC7Z;IAAiB,EAC9B,GAEJ,IAAI,EAEL,IAAI,CAACniB,KAAK,CAAC09B,YAAY,GACtB,2DAAC,0DAAK;MACJ,KAAK,EAAE,IAAI,CAAC19B,KAAK,CAAC29B,WAAW,CAACz8B,KAAM;MACpC,OAAO,EAAE,IAAI,CAAClB,KAAK,CAAC29B,WAAW,CAAC9X,OAAQ;MACxC,QAAQ,EAAE,IAAI,CAAC7lB,KAAK,CAAC29B,WAAW,CAAC4I,QAAQ,GAAIjtC,CAAC,IAAI,IAAI,CAACqV,QAAQ,CAAC;QAAC+uB,YAAY,EAAE;MAAK,CAAC,CAAC,GAAI,IAAK;MAC/F,MAAM,EAAE,IAAI,CAAC19B,KAAK,CAAC29B,WAAW,CAACnmC,MAAO;MACtC,SAAS,EAAE,IAAI,CAACwI,KAAK,CAAC29B,WAAW,CAAC0I,SAAS,GACxC/sC,CAAC,IAAI;QAAC,IAAI,CAACqV,QAAQ,CAAC;UAAC+uB,YAAY,EAAE;QAAK,CAAC,CAAC;QAAE,IAAI,CAAC19B,KAAK,CAAC29B,WAAW,CAAC0I,SAAS,EAAE;MAAC,CAAC,GAAI,IAAK;MAC5F,OAAO,EAAE,IAAI,CAACrmC,KAAK,CAAC29B,WAAW,CAAC8I;IAAQ,EACtC,GAAG,IAAI,EACb,2DAAC,4DAAa;MACZ,MAAM,EAAE,IAAI,CAAC/4B,MAAO;MACpB,SAAS,EAAE,IAAI,CAAC1N,KAAK,CAAC8S,SAAU;MAChC,aAAa,EAAE,IAAI,CAAC9S,KAAK,CAAC6c,aAAc;MACxC,QAAQ,EAAE,IAAI,CAAC7c,KAAK,CAAC6c,aAAa,IAAI,IAAI,CAAC7c,KAAK,CAACk9B,WAAW,KAAK,WAAY;MAC7E,KAAK,EAAE,IAAI,CAACl9B,KAAK,CAACw8B,iBAAkB;MACpC,KAAK,EAAE,IAAI,CAACx8B,KAAK,CAACy8B,cAAe;MACjC,MAAM,EAAE,IAAI,CAACz8B,KAAK,CAAC08B,eAAgB;MACnC,aAAa,EAAE,IAAI,CAAC18B,KAAK,CAAC28B,eAAgB;MAC1C,KAAK,EAAE,IAAI,CAAC38B,KAAK,CAACwT,KAAM;MACxB,OAAO,EAAE,IAAI,CAACxT,KAAK,CAAC6d,OAAQ;MAC5B,QAAQ,EAAE,IAAI,CAAC7d,KAAK,CAACsR,QAAS;MAC9B,aAAa,EAAE,IAAI,CAACtR,KAAK,CAAC+0B,aAAc;MACxC,kBAAkB,EAAE,IAAI,CAAC/0B,KAAK,CAAC80B,kBAAmB;MAElD,SAAS,EAAE,IAAI,CAAC90B,KAAK,CAAC+c,SAAU;MAChC,UAAU,EAAE,IAAI,CAAC/c,KAAK,CAAC8c,UAAW;MAClC,WAAW,EAAE,IAAI,CAAC9c,KAAK,CAAC40B,WAAY;MACpC,eAAe,EAAE,IAAI,CAAC50B,KAAK,CAAC60B,eAAgB;MAE5C,aAAa,EAAE,IAAI,CAAC70B,KAAK,CAAC+S,aAAc;MACxC,QAAQ,EAAE,IAAI,CAAC/S,KAAK,CAAC+R,QAAS;MAC9B,UAAU,EAAE,IAAI,CAAC/R,KAAK,CAACo1B,UAAW;MAClC,QAAQ,EAAE,IAAI,CAACp1B,KAAK,CAACm1B,QAAS;MAC9B,SAAS,EAAE,IAAI,CAACn1B,KAAK,CAACq1B,SAAU;MAEhC,SAAS,EAAE,IAAI,CAACr1B,KAAK,CAACkzB,SAAU;MAChC,aAAa,EAAE,IAAI,CAAClzB,KAAK,CAAC8M,aAAc;MACxC,aAAa,EAAE,IAAI,CAAC9M,KAAK,CAACgN,aAAc;MACxC,oBAAoB,EAAE,IAAI,CAAChN,KAAK,CAAC+M,oBAAqB;MACtD,aAAa,EAAE,IAAI,CAAC/M,KAAK,CAACiN,aAAc;MACxC,aAAa,EAAE,IAAI,CAACjN,KAAK,CAAC8P,aAAc;MACxC,gBAAgB,EAAE,IAAI,CAAC9P,KAAK,CAACmzB,gBAAiB;MAC9C,aAAa,EAAE,IAAI,CAACnzB,KAAK,CAAC6P,aAAc;MACxC,aAAa,EAAE,IAAI,CAAC7P,KAAK,CAACyV,aAAc;MAExC,gBAAgB,EAAE,IAAI,CAAC2jB,oBAAqB;MAC5C,QAAQ,EAAE,IAAI,CAACN,gBAAiB;MAChC,UAAU,EAAE,IAAI,CAACK,cAAe;MAChC,UAAU,EAAE,IAAI,CAAC4L,cAAe;MAChC,cAAc,EAAE,IAAI,CAAClN,kBAAmB;MACxC,mBAAmB,EAAE,IAAI,CAACC,uBAAwB;MAClD,eAAe,EAAE,IAAI,CAACiB,uBAAwB;MAC9C,mBAAmB,EAAE,IAAI,CAACkB,wBAAyB;MACnD,gBAAgB,EAAE,IAAI,CAACjB,2BAA4B;MACnD,mBAAmB,EAAE,IAAI,CAACC,8BAA+B;MACzD,yBAAyB,EAAE,IAAI,CAACW,cAAe;MAC/C,qBAAqB,EAAE,IAAI,CAACL,yBAA0B;MACtD,qBAAqB,EAAE,IAAI,CAACL,yBAA0B;MACtD,SAAS,EAAE,IAAI,CAACM,aAAc;MAC9B,YAAY,EAAE,IAAI,CAACC,gBAAiB;MACpC,aAAa,EAAE,IAAI,CAACC,iBAAkB;MACtC,eAAe,EAAE,IAAI,CAAChB,mBAAoB;MAC1C,aAAa,EAAE,IAAI,CAACqB,uBAAwB;MAC5C,QAAQ,EAAE,IAAI,CAACK,YAAa;MAC5B,eAAe,EAAE,IAAI,CAAC3rB,mBAAoB;MAC1C,WAAW,EAAE,IAAI,CAACosB,eAAgB;MAClC,QAAQ,EAAE,IAAI,CAACf,qBAAsB;MACrC,OAAO,EAAE,IAAI,CAAClC,WAAY;MAC1B,qBAAqB,EAAE,IAAI,CAACmD,gCAAiC;MAC7D,sBAAsB,EAAE,IAAI,CAACC,0BAA2B;MACxD,eAAe,EAAE,IAAI,CAACC,mBAAoB;MAC1C,aAAa,EAAE,IAAI,CAAC5B,iBAAkB;MACtC,aAAa,EAAE,IAAI,CAACC,iBAAkB;MACtC,qBAAqB,EAAE,IAAI,CAAC6B,yBAA0B;MAEtD,UAAU,EAAE,IAAI,CAAC3C,UAAW;MAC5B,aAAa,EAAE,IAAI,CAACx4B,KAAK,CAACyxB,aAAc;MACxC,gBAAgB,EAAE,IAAI,CAACd,oBAAqB;MAE5C,eAAe,EAAE,IAAI,CAAC+J;IAAsB,EAAG,EAEjD,2DAAC,2DAAY;MACX,MAAM,EAAE,IAAI,CAAChtB,MAAO;MACpB,SAAS,EAAE,IAAI,CAAC1N,KAAK,CAAC8S,SAAU;MAChC,KAAK,EAAE,IAAI,CAAC9S,KAAK,CAACmkB,KAAM;MACxB,MAAM,EAAE,IAAI,CAACnkB,KAAK,CAAC88B,mBAAoB;MACvC,GAAG,EAAE,IAAI,CAAC98B,KAAK,CAAC+8B,gBAAiB;MACjC,aAAa,EAAE,IAAI,CAAC/8B,KAAK,CAAC6c,aAAc;MACxC,aAAa,EAAE,IAAI,CAAC7c,KAAK,CAACQ,aAAc;MACxC,cAAc,EAAE,IAAI,CAACR,KAAK,CAACi+B,cAAe;MAC1C,QAAQ,EAAE,IAAI,CAACj+B,KAAK,CAAC6c,aAAa,KAC/B,IAAI,CAAC7c,KAAK,CAACk9B,WAAW,KAAK,YAAY,IAAI,IAAI,CAACl9B,KAAK,CAACi9B,SAAS,CAAE;MACpE,KAAK,EAAE,IAAI,CAACj9B,KAAK,CAAC+S,aAAc;MAChC,QAAQ,EAAE,IAAI,CAAC/S,KAAK,CAACsR,QAAS;MAE9B,UAAU,EAAE,IAAI,CAACtR,KAAK,CAACy8B,cAAe;MACtC,aAAa,EAAE,IAAI,CAACz8B,KAAK,CAAC6P,aAAc;MACxC,aAAa,EAAE,IAAI,CAAC7P,KAAK,CAAC8P,aAAc;MACxC,kBAAkB,EAAE,IAAI,CAAC9P,KAAK,CAACkkB,kBAAmB;MAElD,cAAc,EAAE,IAAI,CAAClkB,KAAK,CAAC4lB,cAAe;MAC1C,sBAAsB,EAAE,IAAI,CAACyV,uBAAwB;MAErD,SAAS,EAAE,IAAI,CAACr7B,KAAK,CAACmmB,SAAU;MAChC,OAAO,EAAE,IAAI,CAACnmB,KAAK,CAAC6jB,OAAQ;MAC5B,SAAS,EAAE,IAAI,CAAC7jB,KAAK,CAACD,SAAU;MAChC,aAAa,EAAE,IAAI,CAACC,KAAK,CAAC0tB,aAAc;MACxC,YAAY,EAAE,IAAI,CAACvL,gBAAiB;MAEpC,YAAY,EAAE,IAAI,CAACwZ,gBAAiB;MACpC,eAAe,EAAE,IAAI,CAACE,mBAAoB;MAC1C,kBAAkB,EAAE,IAAI,CAACC,sBAAuB;MAChD,gBAAgB,EAAE,IAAI,CAACC,oBAAqB;MAE5C,SAAS,EAAE,IAAI,CAAC/7B,KAAK,CAAC+c,SAAU;MAChC,UAAU,EAAE,IAAI,CAAC/c,KAAK,CAAC8c,UAAW;MAClC,WAAW,EAAE,IAAI,CAAC9c,KAAK,CAAC40B,WAAY;MACpC,eAAe,EAAE,IAAI,CAAC50B,KAAK,CAAC60B,eAAgB;MAE5C,cAAc,EAAE,IAAI,CAAC70B,KAAK,CAAC2mB,cAAe;MAE1C,kBAAkB,EAAE,IAAI,CAACgS,sBAAuB;MAChD,OAAO,EAAE,IAAI,CAACf,WAAY;MAC1B,iBAAiB,EAAE,IAAI,CAACoC,qBAAsB;MAC9C,eAAe,EAAE,IAAI,CAACU,qBAAsB;MAC5C,mBAAmB,EAAE,IAAI,CAACR,uBAAwB;MAClD,SAAS,EAAE,IAAI,CAACrB,uBAAwB;MACxC,WAAW,EAAE,IAAI,CAACD,iBAAkB;MACpC,iBAAiB,EAAE,IAAI,CAAC8C;IAAgB,EAAG,EAE5C,IAAI,CAAC17B,KAAK,CAACi9B,SAAS,GACnB,2DAAC,sDAAQ;MACP,MAAM,EAAE,IAAI,CAACvvB,MAAO;MACpB,SAAS,EAAE,IAAI,CAAC1N,KAAK,CAAC8S,SAAU;MAChC,aAAa,EAAE,IAAI,CAAC9S,KAAK,CAAC6c,aAAc;MACxC,KAAK,EAAE,IAAI,CAAC7c,KAAK,CAAC+S,aAAc;MAChC,kBAAkB,EAAE,IAAI,CAAC/S,KAAK,CAACgd,kBAAmB;MAClD,QAAQ,EAAE,IAAI,CAAChd,KAAK,CAACsR,QAAS;MAC9B,KAAK,EAAE,IAAI,CAACtR,KAAK,CAACi9B,SAAU;MAE5B,SAAS,EAAE,IAAI,CAACj9B,KAAK,CAAC+c,SAAU;MAChC,UAAU,EAAE,IAAI,CAAC/c,KAAK,CAAC8c,UAAW;MAClC,WAAW,EAAE,IAAI,CAAC9c,KAAK,CAAC40B,WAAY;MACpC,eAAe,EAAE,IAAI,CAAC50B,KAAK,CAAC60B,eAAgB;MAE5C,UAAU,EAAE,IAAI,CAACmQ,aAAc;MAC/B,wBAAwB,EAAE,IAAI,CAAC/K,wBAAyB;MACxD,WAAW,EAAE,IAAI,CAACY,eAAgB;MAClC,mBAAmB,EAAE,IAAI,CAACX,uBAAwB;MAClD,qBAAqB,EAAE,IAAI,CAAC7hB,yBAA0B;MACtD,aAAa,EAAE,IAAI,CAACgiB,wBAAyB;MAC7C,gBAAgB,EAAE,IAAI,CAACC,2BAA4B;MACnD,YAAY,EAAE,IAAI,CAACC,uBAAwB;MAC3C,YAAY,EAAE,IAAI,CAACC,uBAAwB;MAC3C,aAAa,EAAE,IAAI,CAACC,iBAAkB;MACtC,WAAW,EAAE,IAAI,CAACgN,wBAAyB;MAC3C,wBAAwB,EAAE,IAAI,CAACtN,uBAAwB;MACvD,gBAAgB,EAAE,IAAI,CAAChiB,eAAgB;MACvC,UAAU,EAAE,IAAI,CAACqgB,UAAW;MAC5B,OAAO,EAAE,IAAI,CAACZ,WAAY;MAE1B,eAAe,EAAE,IAAI,CAAC8C;IAAsB,EAC1C,GAEJ,IAAI,CAEF;EAEV;AACF;AAAC;AAED,iEAAextB,sDAAU,CAACkqB,SAAS,CAAC;;;;;;;;;;;;;;;;;;AC/lEV;AAEiC;AAEd;AAE9B,MAAMphB,eAAe,SAASlZ,wDAAe,CAAC;EAC3DsP,WAAW,CAACC,KAAK,EAAE;IACjB,KAAK,CAACA,KAAK,CAAC;IAEZ,MAAM9G,KAAK,GAAG,IAAI,CAAC8G,KAAK,CAACqB,MAAM,CAAC+K,QAAQ,CAAC,IAAI,CAACpM,KAAK,CAAC9G,KAAK,CAAC;IAC1D,MAAMuI,GAAG,GAAGvI,KAAK,CAAC2T,aAAa,EAAE;IACjC,IAAI,CAAClZ,KAAK,GAAG;MACXuxB,IAAI,EAAE;IACR,CAAC;IAED,IAAI,CAACoW,mBAAmB,GAAG1oC,SAAS;IAEpC,IAAI,CAAC2oC,aAAa,GAAG,IAAI,CAACA,aAAa,CAACr7B,IAAI,CAAC,IAAI,CAAC;IAClD,IAAI,CAACs7B,iBAAiB,GAAG,IAAI,CAACA,iBAAiB,CAACt7B,IAAI,CAAC,IAAI,CAAC;EAC5D;EAGAiG,kBAAkB,CAACnG,KAAK,EAAE;IACxB,MAAM9G,KAAK,GAAG,IAAI,CAAC8G,KAAK,CAACqB,MAAM,CAAC+K,QAAQ,CAACpM,KAAK,CAAC9G,KAAK,CAAC;IACrD,IAAI,CAACA,KAAK,EAAE;MACV;IACF;IAEA,IAAIA,KAAK,CAACqiC,aAAa,IAAI,IAAI,CAACA,aAAa,EAAE;MAC7C,IAAIriC,KAAK,CAACoT,OAAO,EAAE,IAAI,KAAK,EAAE;QAC5B,IAAI,CAACgvB,mBAAmB,GAAGpiC,KAAK,CAACqiC,aAAa;QAC9CriC,KAAK,CAACqiC,aAAa,GAAG,IAAI,CAACA,aAAa;MAC1C,CAAC,MAAM;QACL,IAAI,CAACD,mBAAmB,GAAG1oC,SAAS;MACtC;IACF;IAEA,IAAI,IAAI,CAACe,KAAK,CAACuF,KAAK,IAAI8G,KAAK,CAAC9G,KAAK,EAAE;MACnC,IAAI,CAACoJ,QAAQ,CAAC;QAACpJ,KAAK,EAAE8G,KAAK,CAAC9G;MAAK,CAAC,CAAC;IACrC;EACF;EAEAmT,oBAAoB,GAAG;IACrB,MAAMnT,KAAK,GAAG,IAAI,CAAC8G,KAAK,CAACqB,MAAM,CAAC+K,QAAQ,CAAC,IAAI,CAACpM,KAAK,CAAC9G,KAAK,CAAC;IAC1DA,KAAK,CAACqiC,aAAa,GAAG,IAAI,CAACD,mBAAmB;EAChD;EAGAC,aAAa,CAACrW,IAAI,EAAE;IAClB,IAAI,CAAC5iB,QAAQ,CAAC;MAAC4iB,IAAI,EAAEA;IAAI,CAAC,CAAC;IAE3B,IAAI,IAAI,CAACoW,mBAAmB,IAAI,IAAI,CAACA,mBAAmB,IAAI,IAAI,CAACC,aAAa,EAAE;MAC9E,IAAI,CAACD,mBAAmB,CAACpW,IAAI,CAAC;IAChC;EACF;EAGAsW,iBAAiB,CAACtW,IAAI,EAAE;IACtB,IAAI,CAACnnB,yDAAU,CAAC,IAAI,CAACpK,KAAK,CAACuxB,IAAI,CAACjtB,KAAK,CAAC,CAAC,CAAC,EAAEitB,IAAI,CAACjtB,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE;MACxD,IAAI,CAAC+H,KAAK,CAACy7B,mBAAmB,CAAC,IAAI,CAACz7B,KAAK,CAAC9G,KAAK,EAAEgsB,IAAI,CAAC;IACxD;EACF;EAEA1kB,MAAM,GAAG;IACP,OACE;MAAK,SAAS,EAAC;IAAkB,GAC/B,2DAAC,oEAAa;MACZ,MAAM,EAAE,IAAI,CAACR,KAAK,CAACqB,MAAO;MAC1B,KAAK,EAAE,IAAI,CAACrB,KAAK,CAAC9G,KAAM;MACxB,iBAAiB,EAAE,IAAI,CAAC8G,KAAK,CAAC07B,iBAAkB;MAChD,YAAY,EAAE,IAAI,CAACF,iBAAkB;MACrC,OAAO,EAAE,IAAI,CAACx7B,KAAK,CAAChS;IAAQ,EAAG,CAC7B;EAEV;AACF;AAAC;;;;;;;;;;;;;;;;;;AC7EyB;AACgD;AAE1E,MAAMuD,QAAQ,GAAGb,0DAAc,CAAC;EAC9B41B,KAAK,EAAE;IACL70B,EAAE,gBAAgB;IAClBC,cAAc;MAAA;MAAA;IAAA;EAEhB,CAAC;EACD0V,KAAK,EAAE;IACL3V,EAAE,gBAAgB;IAClBC,cAAc;MAAA;MAAA;IAAA;EAEhB;AACF,CAAC,CAAC;AAEF,MAAMg2B,cAAc,SAASj3B,4DAAmB,CAAC;EAC/CsP,WAAW,CAACC,KAAK,EAAE;IACjB,KAAK,CAACA,KAAK,CAAC;IAEZ,IAAI,CAACrM,KAAK,GAAG;MACXonB,IAAI,EAAE/a,KAAK,CAAC8oB,QAAQ,IAAI,EAAE;MAC1B6S,YAAY,EAAE37B,KAAK,CAAC8oB;IACtB,CAAC;IAED,IAAI,CAAC8S,YAAY,GAAG,IAAI,CAACA,YAAY,CAAC17B,IAAI,CAAC,IAAI,CAAC;IAChD,IAAI,CAAC27B,cAAc,GAAG,IAAI,CAACA,cAAc,CAAC37B,IAAI,CAAC,IAAI,CAAC;IACpD,IAAI,CAACmI,YAAY,GAAG,IAAI,CAACA,YAAY,CAACnI,IAAI,CAAC,IAAI,CAAC;IAChD,IAAI,CAAC47B,YAAY,GAAG,IAAI,CAACA,YAAY,CAAC57B,IAAI,CAAC,IAAI,CAAC;EAClD;EAEA,OAAOwT,wBAAwB,CAACwE,SAAS,EAAE7R,SAAS,EAAE;IACpD,IAAI6R,SAAS,CAAC4Q,QAAQ,IAAIziB,SAAS,CAACs1B,YAAY,EAAE;MAChD,OAAO;QACL5gB,IAAI,EAAE7C,SAAS,CAAC4Q,QAAQ,IAAI,EAAE;QAC9B6S,YAAY,EAAEzjB,SAAS,CAAC4Q;MAC1B,CAAC;IACH;IAEA,OAAOziB,SAAS;EAClB;EAEAwQ,iBAAiB,GAAG;IAElB,IAAI,IAAI,CAAC7W,KAAK,CAAC8oB,QAAQ,EAAE;MACvB,IAAI,CAAC9oB,KAAK,CAAC+7B,QAAQ,CAAC,IAAI,CAAC/7B,KAAK,CAAC+oB,UAAU,EAAE,IAAI,CAAC/oB,KAAK,CAAC8oB,QAAQ,EAAE,IAAI,CAAC9oB,KAAK,CAACgpB,SAAS,CAAC;IACvF;EACF;EAEA7iB,kBAAkB,CAACC,SAAS,EAAEC,SAAS,EAAE;IAEvC,IAAI,IAAI,CAAC1S,KAAK,CAACgoC,YAAY,IAAI,IAAI,CAAChoC,KAAK,CAAConB,IAAI,IAAI,IAAI,CAACpnB,KAAK,CAAConB,IAAI,IAAI1U,SAAS,CAAC0U,IAAI,EAAE;MACnF,IAAI,CAAC/a,KAAK,CAAC+7B,QAAQ,CAAC,IAAI,CAAC/7B,KAAK,CAAC+oB,UAAU,EAAE,IAAI,CAACp1B,KAAK,CAAConB,IAAI,EAAE,IAAI,CAAC/a,KAAK,CAACgpB,SAAS,CAAC;IACnF;EACF;EAGA4S,YAAY,CAAC94B,CAAC,EAAE;IACd,IAAI,CAACR,QAAQ,CAAC;MAACyY,IAAI,EAAEjY,CAAC,CAACyF,MAAM,CAAC3R,KAAK,CAAC5C,IAAI;IAAE,CAAC,CAAC;EAC9C;EAEA6nC,cAAc,CAAC/4B,CAAC,EAAE;IAChB,IAAIA,CAAC,CAAC5Q,GAAG,KAAK,OAAO,EAAE;MACrB,IAAI,CAACmW,YAAY,CAACvF,CAAC,CAAC;IACtB,CAAC,MAAM,IAAIA,CAAC,CAAC5Q,GAAG,IAAI,QAAQ,EAAE;MAC5B,IAAI,CAAC4pC,YAAY,CAACh5B,CAAC,CAAC;IACtB;EACF;EAEAuF,YAAY,CAACvF,CAAC,EAAE;IACdA,CAAC,CAACC,cAAc,EAAE;IAClB,IAAI,IAAI,CAACpP,KAAK,CAAConB,IAAI,IAAI,IAAI,CAACpnB,KAAK,CAAConB,IAAI,CAAC/mB,IAAI,EAAE,EAAE;MAC7C,IAAI,CAACgM,KAAK,CAAC+7B,QAAQ,CAAC,IAAI,CAAC/7B,KAAK,CAAC+oB,UAAU,EAAE,IAAI,CAACp1B,KAAK,CAAConB,IAAI,CAAC/mB,IAAI,EAAE,EAAE,IAAI,CAACgM,KAAK,CAACgpB,SAAS,CAAC;IAC1F;EACF;EAEA8S,YAAY,CAACh5B,CAAC,EAAE;IACdA,CAAC,CAACC,cAAc,EAAE;IAClB,IAAI,CAAC/C,KAAK,CAACooB,QAAQ,EAAE;EACvB;EAEA5nB,MAAM,GAAG;IACP,MAAM;MAAEvM;IAAc,CAAC,GAAG,IAAI,CAAC+L,KAAK,CAACgD,IAAI;IACzC,MAAMg5B,OAAO,GAAG;MAAC,OAAO,EAAE/nC,aAAa,CAAC1C,QAAQ,CAAC6V,KAAK,CAAC;MAAE,KAAK,EAAEnT,aAAa,CAAC1C,QAAQ,CAAC+0B,KAAK;IAAC,CAAC;IAC9F,MAAMsO,MAAM,GAAGoH,OAAO,CAAC,IAAI,CAACh8B,KAAK,CAAC+oB,UAAU,CAAC,IAAI,IAAI,CAAC/oB,KAAK,CAAC+oB,UAAU;IACtE,OACE;MAAK,SAAS,EAAC;IAAY,GACzB;MAAK,SAAS,EAAC;IAAgB,GAC7B;MAAO,SAAS,EAAC,YAAY;MAAC,OAAO,EAAC;IAAyB,GAC7D,2DAAC,wDAAgB;MAAC,EAAE,kCAAiC;MACnD,cAAc;QAAA;QAAA;MAAA,EAAoB;MAElC,MAAM,EAAE;QAAC6L,MAAM,EAAEA;MAAM;IAAE,EAAG,CACxB,CACJ,EACN;MAAK,SAAS,EAAC;IAAgB,GAC7B,2DAAC,wDAAgB;MAAC,EAAE,oCAAmC;MACrD,cAAc;QAAA;QAAA;MAAA;IAAe,GAC5BpO,YAAY,IAAK;MAAO,IAAI,EAAC,MAAM;MAAC,EAAE,EAAC,yBAAyB;MAC/D,WAAW,EAAEA,YAAa;MAC1B,KAAK,EAAE,IAAI,CAAC7yB,KAAK,CAAConB,IAAK;MAAC,QAAQ,EAAE,IAAI,CAAC6gB,YAAa;MACpD,UAAU,EAAE,IAAI,CAACC,cAAe;MAAC,QAAQ;IAAA,EAAG,CAC5B,CAChB,EACN;MAAK,SAAS,EAAC;IAAgB,GAC7B;MAAQ,SAAS,EAAC,WAAW;MAAC,OAAO,EAAE,IAAI,CAACC;IAAa,GACvD,2DAAC,wDAAgB;MAAC,EAAE,iBAAgB;MAAC,cAAc;QAAA;QAAA;MAAA;IAAS,EAAiC,CACtF,EACT;MAAQ,SAAS,EAAC,SAAS;MAAC,OAAO,EAAE,IAAI,CAACzzB;IAAa,GACrD,2DAAC,wDAAgB;MAAC,EAAE,kBAAiB;MAAC,cAAc;QAAA;QAAA;MAAA;IAAU,EAAkC,CACzF,CACL,CACF;EAEV;AACF;AAAC;AAED,iEAAexH,sDAAU,CAAC6mB,cAAc,CAAC;;;;;;;;;;;;;;;;;;ACtHf;AACoB;AAE/B,MAAMoC,KAAK,SAASr5B,4DAAmB,CAAC;EACrD+P,MAAM,GAAG;IACP,OAAQ;MAAK,SAAS,EAAC;IAAiB,GACtC;MAAK,SAAS,EAAC;IAAO,GACpB;MAAK,SAAS,EAAC;IAAO,GAAE,IAAI,CAACR,KAAK,CAACnL,KAAK,CAAO,EAC/C;MAAK,SAAS,EAAC;IAAS,GAAE,IAAI,CAACmL,KAAK,CAACwZ,OAAO,CAAO,EACnD;MAAK,SAAS,EAAC;IAAgB,GAC5B,IAAI,CAACxZ,KAAK,CAACk6B,QAAQ,GAClB;MAAQ,SAAS,EAAC,SAAS;MAAC,OAAO,EAAE,IAAI,CAACl6B,KAAK,CAACk6B;IAAS,GACtD,IAAI,CAACl6B,KAAK,CAAC7U,MAAM,IAAI,2DAAC,wDAAgB;MAAC,EAAE,iBAAgB;MAAC,cAAc;QAAA;QAAA;MAAA;IAAS,EAAiC,CAC5G,GAET,IAAI,EAEL,IAAI,CAAC6U,KAAK,CAACg6B,SAAS,GACnB;MAAQ,SAAS,EAAC,SAAS;MAAC,OAAO,EAAE,IAAI,CAACh6B,KAAK,CAACg6B;IAAU,GACvD,IAAI,CAACh6B,KAAK,CAACo6B,OAAO,IAAI,2DAAC,wDAAgB;MAAC,EAAE,aAAY;MAAC,cAAc;QAAA;QAAA;MAAA;IAAK,EAA8B,CAClG,GAET,IAAI,CAEF,CACF,CACF;EACR;AACF;AAAC;;;;;;;;;;;;;;;;;;;;;AC5ByB;AACoB;AAEC;AACQ;AACM;AAE9C,MAAM8B,UAAU,SAASzrC,wDAAe,CAAC;EACtDsP,WAAW,CAACC,KAAK,EAAE;IACjB,KAAK,CAACA,KAAK,CAAC;IAEZ,IAAI,CAACrM,KAAK,GAAG;MACXwoC,UAAU,EAAE,IAAI;MAChBC,QAAQ,EAAE;IACZ,CAAC;IAED,IAAI,CAACC,YAAY,GAAG,IAAI,CAACA,YAAY,CAACn8B,IAAI,CAAC,IAAI,CAAC;IAChD,IAAI,CAAC47B,YAAY,GAAG,IAAI,CAACA,YAAY,CAAC57B,IAAI,CAAC,IAAI,CAAC;EAClD;EAEAm8B,YAAY,CAACjkC,GAAG,EAAE0D,QAAQ,EAAEwgC,QAAQ,EAAE;IACpC,IAAI,CAAClkC,GAAG,EAAE;MACR,IAAI,CAAC4H,KAAK,CAAChS,OAAO,CAAC,wBAAwB,GAAGoK,GAAG,GAAG,GAAG,CAAC;MACxD;IACF;IAEA,MAAM+jC,UAAU,GAAG,IAAI,CAACn8B,KAAK,CAACqB,MAAM,CAACuH,kBAAkB,EAAE;IACzD,IAAI,CAACtG,QAAQ,CAAC;MAAC65B,UAAU,EAAEA;IAAU,CAAC,CAAC;IACvCA,UAAU,CAACI,QAAQ,CAACnkC,GAAG,EAAE0D,QAAQ,EAAEwgC,QAAQ,EACzCE,MAAM,IAAI,IAAI,CAACl6B,QAAQ,CAAC;MAAC85B,QAAQ,EAAEI,MAAM,GAAG,IAAI,CAACx8B,KAAK,CAACjW;IAAI,CAAC,CAAC,EAC7DyB,GAAG,IAAI,IAAI,CAACwU,KAAK,CAAChS,OAAO,CAACxC,GAAG,EAAE,KAAK,CAAC,CACtC,CACA6J,IAAI,CAACpI,CAAC,IAAI,IAAI,CAACqV,QAAQ,CAAC;MAAC65B,UAAU,EAAE,IAAI;MAAEC,QAAQ,EAAE;IAAC,CAAC,CAAC,CAAC,CACzDzmC,KAAK,CAACnK,GAAG,IAAI;MACZ,IAAIA,GAAG,EAAE;QACP,IAAI,CAACwU,KAAK,CAAChS,OAAO,CAAC,0BAA0B,GAAGxC,GAAG,CAACwK,OAAO,EAAE,KAAK,CAAC;MACrE;MACA,IAAI,CAACsM,QAAQ,CAAC;QAAC65B,UAAU,EAAE,IAAI;QAAEC,QAAQ,EAAE;MAAC,CAAC,CAAC;IAChD,CAAC,CAAC;EACJ;EAEAN,YAAY,GAAG;IACb,IAAI,IAAI,CAAC97B,KAAK,CAACy8B,SAAS,EAAE;MACxB,IAAI,CAACz8B,KAAK,CAAC08B,cAAc,EAAE;IAC7B,CAAC,MAAM,IAAI,IAAI,CAAC/oC,KAAK,CAACwoC,UAAU,EAAE;MAChC,IAAI,CAACxoC,KAAK,CAACwoC,UAAU,CAAC18B,MAAM,EAAE;IAChC;EACF;EAEAe,MAAM,GAAG;IACP,IAAI1E,QAAQ,GAAG,IAAI,CAACkE,KAAK,CAAClE,QAAQ,IAAI,iBAAiB;IACvD,IAAIA,QAAQ,CAACrP,MAAM,GAAG,EAAE,EAAE;MACxBqP,QAAQ,GAAGA,QAAQ,CAAC6gC,MAAM,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,GAAG7gC,QAAQ,CAAC6gC,MAAM,CAAC,CAAC,EAAE,CAAC;IAClE;IACA,IAAI5yC,IAAI,GAAG,IAAI,CAACiW,KAAK,CAACjW,IAAI,GAAG,CAAC,GAC5B;MAAM,SAAS,EAAC;IAAY,GAAC,GAAC,EAACsR,mEAAgB,CAAC,IAAI,CAAC2E,KAAK,CAACjW,IAAI,CAAC,EAAC,GAAC,CAAO,GACzE,IAAI;IAKN,IAAIqO,GAAG,EAAEwkC,UAAU;IACnB,IAAI,CAAC,IAAI,CAAC58B,KAAK,CAACy8B,SAAS,IAAI,CAAC,IAAI,CAAC9oC,KAAK,CAACwoC,UAAU,IAAI79B,4DAAa,CAAC,IAAI,CAAC0B,KAAK,CAAC68B,WAAW,CAAC,EAAE;MAE5FzkC,GAAG,GAAG,GAAG;MACTwkC,UAAU,GAAI95B,CAAC,IAAK;QAClBA,CAAC,CAACC,cAAc,EAAE;QAClB,IAAI,CAACs5B,YAAY,CAAC,IAAI,CAACr8B,KAAK,CAAC68B,WAAW,EAAE,IAAI,CAAC78B,KAAK,CAAClE,QAAQ,EAAE,IAAI,CAACkE,KAAK,CAACs8B,QAAQ,CAAC;MACrF,CAAC;IACH,CAAC,MAAM;MACLlkC,GAAG,GAAGmG,0DAAW,CAAC,IAAI,CAACyB,KAAK,CAAC68B,WAAW,CAAC;MACzCD,UAAU,GAAG,IAAI;IACnB;IACA,MAAME,cAAc,GAAG,0HAAE;MAAG,SAAS,EAAC;IAAgB,GAAC,eAAa,CAAI,KAAC,6DAAC,wDAAgB;MAAC,EAAE,mBAAkB;MAC7G,cAAc;QAAA;QAAA;MAAA;IAAO,EAA4C,CAAG;IACtE,OACE;MAAK,SAAS,EAAC;IAAY,GACzB,wEAAK;MAAG,SAAS,EAAC;IAAyB,GAAC,mBAAiB,CAAI,CAAM,EACvE;MAAK,SAAS,EAAC;IAAa,GAC1B,wEAAMhhC,QAAQ,EAAC,GAAC,EAAC/R,IAAI,CAAO,EAC3B,IAAI,CAACiW,KAAK,CAACy8B,SAAS,IAAI,IAAI,CAAC9oC,KAAK,CAACwoC,UAAU,GAC5C,2DAAC,0DAAY;MAAC,QAAQ,EAAE,IAAI,CAACn8B,KAAK,CAACy8B,SAAS,GAAG,IAAI,CAACz8B,KAAK,CAACo8B,QAAQ,GAAG,IAAI,CAACzoC,KAAK,CAACyoC,QAAS;MACvF,QAAQ,EAAE,IAAI,CAACN;IAAa,EAAG,GAEjC,wEAAM1jC,GAAG,GACP;MAAG,IAAI,EAAEA,GAAI;MAAC,QAAQ,EAAE,IAAI,CAAC4H,KAAK,CAAClE,QAAS;MAAC,OAAO,EAAE8gC;IAAW,GAAEE,cAAc,CAAK,GAEtF;MAAM,SAAS,EAAC;IAAY,GAAEA,cAAc,CAAQ,CAC/C,CAEL,CACF;EAEV;AACF;AAAC;;;;;;;;;;;;;;;;;;;;AC5FyB;AAC8B;AAEP;AACM;AAGvD,MAAMC,gBAAgB,GAAG,GAAG;AAE5B,MAAMC,UAAU,GAAG,CAAC,GAAGD,gBAAgB;AAEvC,MAAME,OAAO,GAAG,CAAC,GAAGF,gBAAgB;AAEpC,MAAMG,SAAS,GAAG,OAAO;AACzB,MAAMC,cAAc,GAAG,OAAO;AAC9B,MAAMC,WAAW,GAAG,OAAO;AAE3B,MAAMC,kBAAkB,GAAG,EAAE;AAE7B,MAAM9rC,QAAQ,GAAGb,0DAAc,CAAC;EAC9B4sC,eAAe,EAAE;IACf7rC,EAAE,mBAAmB;IACrBC,cAAc;MAAA;MAAA;IAAA;EAEhB;AACF,CAAC,CAAC;AAEF,MAAMd,WAAW,SAASH,4DAAmB,CAAC;EAC5CsP,WAAW,CAACC,KAAK,EAAE;IACjB,KAAK,CAACA,KAAK,CAAC;IAEZ,IAAInN,OAAO,GAAGxC,mEAAgB,CAAC,IAAI,CAAC2P,KAAK,CAACnN,OAAO,CAAC;IAClD,IAAI,CAAC/C,KAAK,CAACC,OAAO,CAAC8C,OAAO,CAAC,IAAIA,OAAO,CAACpG,MAAM,GAAG4wC,kBAAkB,EAAE;MAClExqC,OAAO,GAAG,IAAI;IAChB;IAEA,IAAI,CAACc,KAAK,GAAG;MACX4pC,OAAO,EAAE,KAAK;MACdC,OAAO,EAAE,KAAK;MACdC,WAAW,EAAE,MAAM;MACnB9qC,QAAQ,EAAE,IAAI,CAACqN,KAAK,CAACrN,QAAQ,GAAG,CAAC,GAAGxB,6DAAa,CAAC,IAAI,CAAC6O,KAAK,CAACrN,QAAQ,GAAG,IAAI,CAAC,GAAG,MAAM;MACtF+qC,OAAO,EAAE,IAAI,CAAC19B,KAAK,CAACrN,QAAQ,IAAI,MAAM;MACtCE,OAAO,EAAEA;IACX,CAAC;IAED,IAAI,CAAC8qC,SAAS,GAAG,IAAI,CAACA,SAAS,CAACz9B,IAAI,CAAC,IAAI,CAAC;IAC1C,IAAI,CAAC09B,UAAU,GAAG,IAAI,CAACA,UAAU,CAAC19B,IAAI,CAAC,IAAI,CAAC;IAC5C,IAAI,CAAC29B,YAAY,GAAG,IAAI,CAACA,YAAY,CAAC39B,IAAI,CAAC,IAAI,CAAC;IAChD,IAAI,CAAC49B,SAAS,GAAG,IAAI,CAACA,SAAS,CAAC59B,IAAI,CAAC,IAAI,CAAC;IAE1C,IAAI,CAAC69B,UAAU,GAAG,IAAI,CAACA,UAAU,CAAC79B,IAAI,CAAC,IAAI,CAAC;IAC5C,IAAI,CAAC89B,UAAU,GAAG,IAAI,CAACA,UAAU,CAAC99B,IAAI,CAAC,IAAI,CAAC;IAC5C,IAAI,CAACqrB,WAAW,GAAG,IAAI,CAACA,WAAW,CAACrrB,IAAI,CAAC,IAAI,CAAC;IAE9C,IAAI,CAAC+9B,WAAW,GAAG,IAAI;IAEvB,IAAI,CAACC,UAAU,GAAG,EAAE;IACpB,IAAI,CAACC,SAAS,GAAG1tC,sDAAe,EAAE;EACpC;EAEAomB,iBAAiB,GAAG;IAClB,IAAI,IAAI,CAAC7W,KAAK,CAACnU,GAAG,EAAE;MAClB,IAAI,CAAC8xC,SAAS,EAAE;IAClB;IAEA,IAAI,CAACC,UAAU,EAAE;EACnB;EAEAvxB,oBAAoB,GAAG;IACrB,IAAI,IAAI,CAAC4xB,WAAW,EAAE;MACpB,IAAI,CAACA,WAAW,CAACG,SAAS,GAAG,IAAI;MACjC,IAAI,CAACH,WAAW,CAACI,YAAY,GAAG,IAAI;MACpC,IAAI,CAACJ,WAAW,CAACK,OAAO,GAAG,IAAI;MAC/B,IAAI,CAACL,WAAW,CAACM,KAAK,EAAE;MACxB,IAAI,CAACN,WAAW,GAAG,IAAI;IACzB;EACF;EAEA93B,kBAAkB,CAACC,SAAS,EAAE;IAC5B,IAAI,IAAI,CAACpG,KAAK,CAACnU,GAAG,IAAIua,SAAS,CAACva,GAAG,EAAE;MACnC,IAAI,CAAC8xC,SAAS,EAAE;IAClB;IAEA,IAAI,IAAI,CAAC39B,KAAK,CAACnN,OAAO,IAAIuT,SAAS,CAACvT,OAAO,EAAE;MAC3C,IAAIA,OAAO,GAAGxC,mEAAgB,CAAC,IAAI,CAAC2P,KAAK,CAACnN,OAAO,CAAC;MAClD,IAAI,CAAC/C,KAAK,CAACC,OAAO,CAAC8C,OAAO,CAAC,IAAIA,OAAO,CAACpG,MAAM,GAAG4wC,kBAAkB,EAAE;QAClExqC,OAAO,GAAG,IAAI;MAChB;MACA,IAAI,CAACyP,QAAQ,CAAC;QAACzP,OAAO,EAAEA;MAAO,CAAC,EAAE,IAAI,CAAC+qC,UAAU,CAAC;IACpD;EACF;EAEAD,SAAS,GAAG;IACV,IAAI,CAACM,WAAW,GAAG,IAAI7T,KAAK,CAAC,IAAI,CAACpqB,KAAK,CAACnU,GAAG,CAAC;IAC5C,IAAI,CAACoyC,WAAW,CAACG,SAAS,GAAGnxC,CAAC,IAAI,IAAI,CAACqV,QAAQ,CAAC;MAACi7B,OAAO,EAAE;IAAI,CAAC,CAAC;IAChE,IAAI,CAACU,WAAW,CAACI,YAAY,GAAGpxC,CAAC,IAAI,IAAI,CAACqV,QAAQ,CAAC;MACjDm7B,WAAW,EAAEtsC,6DAAa,CAAC,IAAI,CAAC8sC,WAAW,CAACR,WAAW,EAAE,IAAI,CAAC9pC,KAAK,CAAC+pC,OAAO;IAC7E,CAAC,CAAC;IACF,IAAI,CAACO,WAAW,CAACK,OAAO,GAAGrxC,CAAC,IAAI;MAC9B,IAAI,CAACgxC,WAAW,CAACR,WAAW,GAAG,CAAC;MAChC,IAAI,CAACn7B,QAAQ,CAAC;QAACk7B,OAAO,EAAE,KAAK;QAAEC,WAAW,EAAEtsC,6DAAa,CAAC,CAAC,EAAE,IAAI,CAACwC,KAAK,CAAC+pC,OAAO;MAAC,CAAC,CAAC;IACpF,CAAC;EACH;EAEAE,UAAU,GAAG;IAEX,IAAI,CAACO,SAAS,CAAC1d,OAAO,CAACl3B,KAAK,GAAG,IAAI,CAAC40C,SAAS,CAAC1d,OAAO,CAAC+d,WAAW,GAAGzB,gBAAgB;IACpF,IAAI,CAACoB,SAAS,CAAC1d,OAAO,CAACj3B,MAAM,GAAG,IAAI,CAAC20C,SAAS,CAAC1d,OAAO,CAACpJ,YAAY,GAAG0lB,gBAAgB;IAEtF,IAAI,CAAC0B,aAAa,GAAG,IAAI,CAACN,SAAS,CAAC1d,OAAO,CAACt0B,UAAU,CAAC,IAAI,CAAC;IAC5D,IAAI,CAACsyC,aAAa,CAACC,OAAO,GAAG,OAAO;IAEpC,IAAI,CAACR,UAAU,GAAG,IAAI,CAACL,YAAY,CAAC,IAAI,CAAClqC,KAAK,CAACd,OAAO,CAAC;IACvD,IAAI,CAACirC,SAAS,EAAE;EAClB;EAGAA,SAAS,GAAG;IACV,IAAI,CAAC,IAAI,CAACK,SAAS,CAAC1d,OAAO,EAAE;MAC3B;IACF;IAEA,MAAMl3B,KAAK,GAAG,IAAI,CAACo1C,cAAc;IACjC,MAAMn1C,MAAM,GAAG,IAAI,CAAC20C,SAAS,CAAC1d,OAAO,CAACj3B,MAAM;IAE5C,IAAI,CAACi1C,aAAa,CAACG,SAAS,GAAG5B,UAAU;IAEzC,MAAM6B,SAAS,GAAG5xC,CAAC,IAAI;MACrB,IAAI,CAAC,IAAI,CAACkxC,SAAS,CAAC1d,OAAO,IAAI,CAAC,IAAI,CAACwd,WAAW,EAAE;QAEhD;MACF;MAEA,IAAI,CAACQ,aAAa,CAAC/xC,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAACyxC,SAAS,CAAC1d,OAAO,CAACl3B,KAAK,EAAEC,MAAM,CAAC;MAExE,IAAI,IAAI,CAAC00C,UAAU,EAAE;QACnB,IAAI,IAAI,CAACvqC,KAAK,CAAC6pC,OAAO,EAAE;UACtBptC,MAAM,CAAC0uC,qBAAqB,CAACD,SAAS,CAAC;QACzC;QAGA,MAAME,OAAO,GAAG,IAAI,CAAC/+B,KAAK,CAACrN,QAAQ,GACjC/I,IAAI,CAAC4K,GAAG,CAAC,CAAC,EAAE5K,IAAI,CAACC,GAAG,CAAC,IAAI,CAACo0C,WAAW,CAACR,WAAW,GAAG,IAAI,GAAG,IAAI,CAACz9B,KAAK,CAACrN,QAAQ,EAAE,CAAC,CAAC,CAAC,IAAIpJ,KAAK,GAAGyzC,UAAU,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;QAGrH,IAAI,CAACyB,aAAa,CAACO,SAAS,EAAE;QAC9B,IAAI,CAACP,aAAa,CAACQ,WAAW,GAAG9B,cAAc;QAC/C,KAAK,IAAI/uC,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAG,IAAI,CAAC8vC,UAAU,CAACzxC,MAAM,EAAE2B,CAAC,EAAE,EAAE;UAC/C,IAAI+hB,CAAC,GAAG,CAAC,GAAG/hB,CAAC,IAAI4uC,UAAU,GAAGC,OAAO,CAAC,GAAGD,UAAU,GAAG,GAAG;UACzD,IAAI5sB,CAAC,GAAG,IAAI,CAAC8tB,UAAU,CAAC9vC,CAAC,CAAC,GAAG5E,MAAM,GAAG,GAAG;UAEzC,MAAM0V,KAAK,GAAGiR,CAAC,GAAG4uB,OAAO,GAAG5B,cAAc,GAAGD,SAAS;UACtD,IAAI,IAAI,CAACuB,aAAa,CAACQ,WAAW,IAAI//B,KAAK,EAAE;YAC3C,IAAI,CAACu/B,aAAa,CAACS,MAAM,EAAE;YAC3B,IAAI,CAACT,aAAa,CAACO,SAAS,EAAE;YAC9B,IAAI,CAACP,aAAa,CAACQ,WAAW,GAAG//B,KAAK;UACxC;UAEA,IAAI,CAACu/B,aAAa,CAACU,MAAM,CAAChvB,CAAC,EAAE,CAAC3mB,MAAM,GAAG4mB,CAAC,IAAI,GAAG,CAAC;UAChD,IAAI,CAACquB,aAAa,CAACW,MAAM,CAACjvB,CAAC,EAAE3mB,MAAM,GAAG,GAAG,GAAG4mB,CAAC,GAAG,GAAG,CAAC;QACtD;QAEA,IAAI,CAACquB,aAAa,CAACS,MAAM,EAAE;QAG3B,IAAI,IAAI,CAACl/B,KAAK,CAACrN,QAAQ,EAAE;UACvB,IAAI,CAAC8rC,aAAa,CAACO,SAAS,EAAE;UAC9B,IAAI,CAACP,aAAa,CAACY,GAAG,CAACN,OAAO,GAAG/B,UAAU,GAAG,CAAC,EAAExzC,MAAM,GAAG,GAAG,EAAEwzC,UAAU,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,GAAGpzC,IAAI,CAAC01C,EAAE,CAAC;UAC9F,IAAI,CAACb,aAAa,CAACc,SAAS,GAAGnC,WAAW;UAC1C,IAAI,CAACqB,aAAa,CAACe,IAAI,EAAE;QAC3B;MACF;IACF,CAAC;IAEDX,SAAS,EAAE;EACb;EAGAhB,YAAY,CAAC4B,QAAQ,EAAE;IACrB,MAAMC,QAAQ,GAAI,CAAC,IAAI,CAACvB,SAAS,CAAC1d,OAAO,CAACl3B,KAAK,GAAG0zC,OAAO,KAAKD,UAAU,GAAGC,OAAO,CAAC,GAAI,CAAC;IAExF,IAAI,CAAC0B,cAAc,GAAGe,QAAQ,IAAI1C,UAAU,GAAGC,OAAO,CAAC,GAAGA,OAAO;IAEjE,IAAI,CAACntC,KAAK,CAACC,OAAO,CAAC0vC,QAAQ,CAAC,IAAIA,QAAQ,CAAChzC,MAAM,IAAI,CAAC,EAAE;MACpD,OAAOqD,KAAK,CAAC6vC,KAAK,CAAC,IAAI,EAAE7vC,KAAK,CAAC4vC,QAAQ,CAAC,CAAC,CAACrsC,GAAG,CAACpG,CAAC,IAAI,IAAI,CAAC;IAC1D;IAEA,MAAM2yC,MAAM,GAAGH,QAAQ,CAAChzC,MAAM,GAAGizC,QAAQ;IACzC,IAAIG,IAAI,GAAG,EAAE;IACb,IAAIC,MAAM,GAAG,CAAC,CAAC;IACf,KAAK,IAAI1xC,CAAC,GAAC,CAAC,EAAEA,CAAC,GAACsxC,QAAQ,EAAEtxC,CAAC,EAAE,EAAE;MAC7B,IAAI2xC,EAAE,GAAI3xC,CAAC,GAAGwxC,MAAM,GAAI,CAAC;MACzB,IAAI9c,EAAE,GAAI,CAAC10B,CAAC,GAAG,CAAC,IAAIwxC,MAAM,GAAI,CAAC;MAC/B,IAAI9c,EAAE,IAAIid,EAAE,EAAE;QACZF,IAAI,CAACzxC,CAAC,CAAC,GAAGqxC,QAAQ,CAACM,EAAE,CAAC;MACxB,CAAC,MAAM;QACL,IAAIC,GAAG,GAAG,GAAG;QACb,KAAK,IAAIC,CAAC,GAACF,EAAE,EAAEE,CAAC,GAACnd,EAAE,EAAEmd,CAAC,EAAE,EAAE;UACxBD,GAAG,IAAIP,QAAQ,CAACQ,CAAC,CAAC;QACpB;QACAJ,IAAI,CAACzxC,CAAC,CAAC,GAAGxE,IAAI,CAAC4K,GAAG,CAAC,CAAC,EAAEwrC,GAAG,IAAIld,EAAE,GAAGid,EAAE,CAAC,CAAC;MACxC;MACAD,MAAM,GAAGl2C,IAAI,CAAC4K,GAAG,CAACqrC,IAAI,CAACzxC,CAAC,CAAC,EAAE0xC,MAAM,CAAC;IACpC;IAEA,IAAIA,MAAM,GAAG,CAAC,EAAE;MACd,OAAOD,IAAI,CAACxsC,GAAG,CAAC2K,CAAC,IAAIA,CAAC,GAAG8hC,MAAM,CAAC;IAClC;IACA,OAAOhwC,KAAK,CAAC6vC,KAAK,CAAC,IAAI,EAAE7vC,KAAK,CAAC4vC,QAAQ,CAAC,CAAC,CAACrsC,GAAG,CAACpG,CAAC,IAAI,IAAI,CAAC;EAC1D;EAEA8wC,UAAU,CAACj7B,CAAC,EAAE;IACZA,CAAC,CAACC,cAAc,EAAE;IAClB,IAAI,CAAC,IAAI,CAACpP,KAAK,CAAC4pC,OAAO,EAAE;MACvB;IACF;IACA,IAAI,IAAI,CAAC5pC,KAAK,CAAC6pC,OAAO,EAAE;MACtB,IAAI,CAACS,WAAW,CAACM,KAAK,EAAE;MACxB,IAAI,CAACj8B,QAAQ,CAAC;QAACk7B,OAAO,EAAE;MAAK,CAAC,CAAC;IACjC,CAAC,MAAM;MACL,IAAI,CAACS,WAAW,CAACvH,IAAI,EAAE;MACvB,IAAI,CAACp0B,QAAQ,CAAC;QAACk7B,OAAO,EAAE;MAAI,CAAC,EAAE,IAAI,CAACM,SAAS,CAAC;IAChD;EACF;EAEAvS,WAAW,CAAC//B,GAAG,EAAE;IACfgD,OAAO,CAAClB,KAAK,CAAC9B,GAAG,CAAC;EACpB;EAEAwyC,UAAU,CAACl7B,CAAC,EAAE;IACZA,CAAC,CAACC,cAAc,EAAE;IAClB,IAAID,CAAC,CAACyF,MAAM,IAAI,IAAI,CAACvI,KAAK,CAACrN,QAAQ,EAAE;MACnC,MAAMutC,IAAI,GAAGp9B,CAAC,CAACyF,MAAM,CAACixB,qBAAqB,EAAE;MAC7C,MAAM2G,MAAM,GAAG,CAACr9B,CAAC,CAACs9B,OAAO,GAAGF,IAAI,CAACnzC,IAAI,IAAI,IAAI,CAAC4xC,cAAc,GAAG5B,gBAAgB;MAC/E,IAAI,CAACkB,WAAW,CAACR,WAAW,GAAG,IAAI,CAACz9B,KAAK,CAACrN,QAAQ,GAAGwtC,MAAM,GAAG,IAAI;MAClE,IAAI,CAAC79B,QAAQ,CAAC;QAACm7B,WAAW,EAAEtsC,6DAAa,CAAC,IAAI,CAAC8sC,WAAW,CAACR,WAAW,EAAE,IAAI,CAAC9pC,KAAK,CAAC+pC,OAAO;MAAC,CAAC,CAAC;MAC7F,IAAI,CAAC,IAAI,CAAC/pC,KAAK,CAAC6pC,OAAO,EAAE;QACvB,IAAI,CAACM,SAAS,EAAE;MAClB;IACF;EACF;EAEAt9B,MAAM,GAAG;IACP,MAAM6/B,SAAS,GAAG,gBAAgB,IAC/B,IAAI,CAACrgC,KAAK,CAACsgC,KAAK,GAAG,EAAE,GAAG,QAAQ,CAAC,IACjC,IAAI,CAAC3sC,KAAK,CAAC4pC,OAAO,GAAG,EAAE,GAAG,WAAW,CAAC;IACzC,MAAM7G,IAAI,GAAI;MAAG,IAAI,EAAC,GAAG;MAAC,OAAO,EAAE,IAAI,CAACqH,UAAW;MAAC,KAAK,EAAE,IAAI,CAAC/9B,KAAK,CAACgD,IAAI,CAAC/O,aAAa,CAAC1C,QAAQ,CAAC+rC,eAAe;IAAE,GAC/G;MAAG,SAAS,EAAE+C;IAAU,GAAE,IAAI,CAAC1sC,KAAK,CAAC6pC,OAAO,GAAG,cAAc,GAC1D,IAAI,CAAC7pC,KAAK,CAAC4pC,OAAO,GAAG,aAAa,GAAG,gBAAiB,CAAK,CAC3D;IACP,OAAQ;MAAK,SAAS,EAAC;IAAc,GAAE,IAAI,CAACv9B,KAAK,CAACsgC,KAAK,GACrD,0HACE;MAAQ,SAAS,EAAC,UAAU;MAAC,GAAG,EAAE,IAAI,CAACnC,SAAU;MAAC,OAAO,EAAE,IAAI,CAACH;IAAW,EAAG,EAC7EtH,IAAI,CACJ,GAEH,0HACGA,IAAI,EACL,wEACE;MAAQ,SAAS,EAAC,UAAU;MAAC,GAAG,EAAE,IAAI,CAACyH,SAAU;MAAC,OAAO,EAAE,IAAI,CAACH;IAAW,EAAG,EAC9E;MAAK,SAAS,EAAC;IAAO,GAAE,IAAI,CAACrqC,KAAK,CAAC8pC,WAAW,EAAC,GAAC,EAAC,IAAI,CAAC9pC,KAAK,CAAChB,QAAQ,CAAO,CACvE,CACL,CAEC;EACR;AACF;AAEA,iEAAekO,sDAAU,CAACjQ,WAAW,CAAC;;;;;;;;;;;;;;;;;;;;AC7QZ;AACoB;AAEV;AACe;AAEpC,MAAMkW,UAAU,SAASrW,4DAAmB,CAAC;EAC1DsP,WAAW,CAACC,KAAK,EAAE;IACjB,KAAK,CAACA,KAAK,CAAC;IAEZ,IAAI,CAACrM,KAAK,GAAG;MACX3G,GAAG,EAAE,CAAC;MACND,IAAI,EAAE,CAAC;MACPxD,KAAK,EAAE,CAAC;MACRC,MAAM,EAAE,CAAC;MACTM,KAAK,EAAE;IACT,CAAC;IAED,IAAI,CAACue,YAAY,GAAG,IAAI,CAACA,YAAY,CAACnI,IAAI,CAAC,IAAI,CAAC;IAChD,IAAI,CAAC07B,YAAY,GAAG,IAAI,CAACA,YAAY,CAAC17B,IAAI,CAAC,IAAI,CAAC;EAClD;EAGA07B,YAAY,CAAC7uC,IAAI,EAAEC,GAAG,EAAEzD,KAAK,EAAEC,MAAM,EAAEM,KAAK,EAAE;IAC5C,IAAI,CAACwY,QAAQ,CAAC;MACZvV,IAAI,EAAEA,IAAI;MACVC,GAAG,EAAEA,GAAG;MACRzD,KAAK,EAAEA,KAAK;MACZC,MAAM,EAAEA,MAAM;MACdM,KAAK,EAAEA;IACT,CAAC,CAAC;EACJ;EAEAue,YAAY,GAAG;IACbxb,+DAAS,CAAC,IAAI,CAACmT,KAAK,CAAC5W,IAAI,EAAE,IAAI,CAAC4W,KAAK,CAACmE,MAAM,EAC1C,IAAI,CAACxQ,KAAK,CAAC5G,IAAI,EAAE,IAAI,CAAC4G,KAAK,CAAC3G,GAAG,EAAE,IAAI,CAAC2G,KAAK,CAACpK,KAAK,EAAE,IAAI,CAACoK,KAAK,CAACnK,MAAM,EACpE,IAAI,CAACmK,KAAK,CAAC7J,KAAK,CAAC,CAChBuL,IAAI,CAACjK,GAAG,IAAI;MACX,IAAI,CAAC4U,KAAK,CAAC+7B,QAAQ,CAAC3wC,GAAG,CAAChC,IAAI,EAAEgC,GAAG,CAACmB,IAAI,EAAEnB,GAAG,CAAC7B,KAAK,EAAE6B,GAAG,CAAC5B,MAAM,CAAC;IAChE,CAAC,CAAC,CACDmM,KAAK,CAACnK,GAAG,IAAI;MACZ,IAAI,CAACwU,KAAK,CAAChS,OAAO,CAACxC,GAAG,CAAC;IACzB,CAAC,CAAC;EACN;EAEAgV,MAAM,GAAG;IACP,OACE;MAAK,SAAS,EAAC;IAAY,GACzB;MAAK,SAAS,EAAC;IAAgB,GAC7B,2DAAC,oDAAO;MACN,MAAM,EAAE,IAAI,CAACR,KAAK,CAACmE,MAAO;MAC1B,QAAQ,EAAE,IAAI,CAACy3B;IAAa,EAAG,CAC7B,EACN;MAAK,SAAS,EAAC;IAAgB,GAC5B,IAAI,CAAC57B,KAAK,CAACooB,QAAQ,GAClB;MAAQ,SAAS,EAAC,WAAW;MAAC,OAAO,EAAE,IAAI,CAACpoB,KAAK,CAACooB;IAAS,GACzD,2DAAC,wDAAgB;MAAC,EAAE,iBAAgB;MAAC,cAAc;QAAA;QAAA;MAAA;IAAS,EAAiC,CACtF,GACP,IAAI,EACR;MAAQ,SAAS,EAAC,SAAS;MAAC,OAAO,EAAE,IAAI,CAAC/f;IAAa,GACrD,2DAAC,wDAAgB;MAAC,EAAE,aAAY;MAAC,cAAc;QAAA;QAAA;MAAA;IAAK,EAA6B,CAC1E,CACL,CACF;EAEV;AACF;AAAC;;;;;;;;;;;;;;;;;;;;ACnEyB;AAEiB;AACE;AAEQ;AAEV;AAE5B,MAAM1E,YAAY,SAASlT,wDAAe,CAAC;EACxDsP,WAAW,CAACC,KAAK,EAAE;IACjB,KAAK,CAACA,KAAK,CAAC;IAEZ,IAAI,CAACrM,KAAK,GAAG;MACX6sC,MAAM,EAAExgC,KAAK,CAACmE;IAChB,CAAC;IAED,IAAI,CAACs8B,kBAAkB,GAAG,IAAI,CAACA,kBAAkB,CAACvgC,IAAI,CAAC,IAAI,CAAC;EAC9D;EAEAiG,kBAAkB,CAACC,SAAS,EAAE;IAC5B,IAAI,IAAI,CAACpG,KAAK,CAACmE,MAAM,IAAIiC,SAAS,CAACjC,MAAM,EAAE;MACzC,IAAI,CAAC7B,QAAQ,CAAC;QAACk+B,MAAM,EAAE,IAAI,CAACxgC,KAAK,CAACmE;MAAM,CAAC,CAAC;IAC5C;EACF;EAEAs8B,kBAAkB,CAAC39B,CAAC,EAAE;IACpB,MAAM4F,KAAK,GAAG5F,CAAC,CAACyF,MAAM,CAACkX,KAAK,CAAC,CAAC,CAAC;IAC/B,IAAI,CAACzf,KAAK,CAAC0gC,cAAc,CAACh4B,KAAK,CAACvf,IAAI,EAAEwC,GAAG,CAACiB,eAAe,CAAC8b,KAAK,CAAC,EAAEA,KAAK,CAAC/b,IAAI,CAAC;IAE7EmW,CAAC,CAACyF,MAAM,CAAC3R,KAAK,GAAG,EAAE;EACrB;EAEA4J,MAAM,GAAG;IAGP,MAAMmgC,MAAM,GAAG,oBAAoB,GAAG,CAAC,EAAE,GAAG/2C,IAAI,CAACg3C,MAAM,EAAE,EAAE/1C,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC;IAC1E,MAAMkI,SAAS,GAAG,eAAe,IAAI,IAAI,CAACiN,KAAK,CAAC6gC,QAAQ,GAAG,YAAY,GAAG,EAAE,CAAC;IAC7E,OACE;MAAK,SAAS,EAAE9tC;IAAU,GACvB,IAAI,CAACiN,KAAK,CAAC6gC,QAAQ,IAAI,CAAC,IAAI,CAACltC,KAAK,CAAC6sC,MAAM,GACxC,IAAI,GACJ;MAAG,IAAI,EAAC,GAAG;MAAC,SAAS,EAAC,cAAc;MAAC,OAAO,EAAG19B,CAAC,IAAK;QAACA,CAAC,CAACC,cAAc,EAAE;QAAE,IAAI,CAAC/C,KAAK,CAAC0gC,cAAc,EAAE;MAAC;IAAE,GACtG;MAAG,SAAS,EAAC;IAAgB,GAAC,OAAK,CAAI,CACrC,EACL,IAAI,CAAC/sC,KAAK,CAAC6sC,MAAM,GAChB;MAAK,GAAG,EAAE,IAAI,CAACxgC,KAAK,CAACqB,MAAM,CAAC3O,YAAY,CAACpB,iEAAkB,CAAC,IAAI,CAACqC,KAAK,CAAC6sC,MAAM,EAAE,OAAO,CAAC,CAAE;MAAC,SAAS,EAAC;IAAS,EAAG,GAChH,IAAI,CAACxgC,KAAK,CAAC6gC,QAAQ,IAAI,IAAI,CAAC7gC,KAAK,CAAC0O,GAAG,GACnC;MAAK,SAAS,EAAC;IAAY,GACzB,2DAAC,wDAAU;MACT,MAAM,EAAE,IAAI,CAAC1O,KAAK,CAACqB,MAAO;MAC1B,MAAM,EAAE,IAAK;MACb,KAAK,EAAE,IAAI,CAACrB,KAAK,CAAC0O,GAAI;MACtB,KAAK,EAAE,IAAI,CAAC1O,KAAK,CAACnL;IAAM,EAAG,CACzB,GAEN;MAAK,SAAS,EAAC;IAAO,GAAE9N,mDAAW,EAAC,MAAO,EAACA,mDAAW,CAAO,EACjE,IAAI,CAACiZ,KAAK,CAAC6gC,QAAQ,GAAG,IAAI,GACzB;MAAO,IAAI,EAAC,MAAM;MAAC,EAAE,EAAEF,MAAO;MAAC,SAAS,EAAC,kBAAkB;MACzD,MAAM,EAAC,SAAS;MAAC,QAAQ,EAAE,IAAI,CAACF;IAAmB,EAAG,EACzD,IAAI,CAACzgC,KAAK,CAAC6gC,QAAQ,GAAG,IAAI,GAC3B;MAAO,OAAO,EAAEF,MAAO;MAAC,SAAS,EAAC;IAAO,GACvC;MAAG,SAAS,EAAC;IAAgB,GAAC,aAAW,CAAI,CACvC,EACR,2DAAC,yDAAW;MAAC,IAAI,EAAE,IAAI,CAAC3gC,KAAK,CAACy8B,SAAU;MAAC,KAAK,EAAE,IAAK;MAAC,KAAK,EAAE,IAAK;MAAC,QAAQ,EAAE;IAAK,EAAG,CACjF;EAEV;AACF;AAAC;;;;;;;;;;;;;;;;;;ACpEyB;AAC8B;AAExD,MAAMqE,YAAY,GAAG;EAAC,OAAO,EAAE;AAAe,CAAC;AAE/C,MAAMvvC,QAAQ,GAAGb,0DAAc,CAAC;EAC9BqwC,cAAc,EAAE;IACdtvC,EAAE,kBAAkB;IACpBC,cAAc;MAAA;MAAA;IAAA;EAEhB,CAAC;EACDsvC,WAAW,EAAE;IACXvvC,EAAE,eAAe;IACjBC,cAAc;MAAA;MAAA;IAAA;EAEhB,CAAC;EACDuvC,YAAY,EAAE;IACZxvC,EAAE,gBAAgB;IAClBC,cAAc;MAAA;MAAA;IAAA;EAEhB;AACF,CAAC,CAAC;AAIF,MAAMkS,SAAS,SAASnT,4DAAmB,CAAC;EAC1C+P,MAAM,GAAG;IACP,MAAM;MAACvM;IAAa,CAAC,GAAG,IAAI,CAAC+L,KAAK,CAACgD,IAAI;IACvC,IAAI8J,MAAM,GAAG,IAAI;IACjB,IAAI,IAAI,CAAC9M,KAAK,CAACkF,aAAa,IAAI,IAAI,CAAClF,KAAK,CAACkF,aAAa,CAACzY,MAAM,GAAG,CAAC,EAAE;MACnEqgB,MAAM,GAAG,EAAE;MACX,IAAI,CAAC9M,KAAK,CAACkF,aAAa,CAAC7R,GAAG,CAAEpD,CAAC,IAAK;QAClC,MAAMqd,OAAO,GAAG,IAAI,CAACtN,KAAK,CAACsgC,KAAK,GAAG,IAAI,GAAGrsC,aAAa,CAAC1C,QAAQ,CAAC,QAAQ,GAAGtB,CAAC,CAAC,CAAC;QAC/E,MAAM+B,KAAK,GAAG,iBAAiB,GAAG/B,CAAC,GAAG,QAAQ;QAC9C6c,MAAM,CAACtc,IAAI,CAAC;UAAK,SAAS,EAAC,eAAe;UAAC,GAAG,EAAEP;QAAE,GAAC;UAAG,SAAS,EAAE+B;QAAM,GAAE8uC,YAAY,CAAC7wC,CAAC,CAAC,IAAIA,CAAC,CAAK,KAAC,EAACqd,OAAO,CAAO,CAAC;MACrH,CAAC,CAAC;MACF,OAAO,0HAAGR,MAAM,CAAI;IACtB;IACA,OAAO,IAAI;EACb;AACF;AAAC;AAED,iEAAejM,sDAAU,CAAC+C,SAAS,CAAC;;;;;;;;;;;;;;;;ACzCV;AAEX,MAAMs9B,UAAU,SAASzwC,4DAAmB,CAAC;EAC1D+P,MAAM,GAAG;IACP,OACE;MAAG,IAAI,EAAC,GAAG;MAAC,OAAO,EAAGsC,CAAC,IAAK;QAACA,CAAC,CAACC,cAAc,EAAE;QAAE,IAAI,CAAC/C,KAAK,CAACmhC,MAAM,EAAE;MAAC;IAAE,GACrE;MAAG,SAAS,EAAC;IAAgB,GAAC,YAAU,CAAI,CAC1C;EAER;AACF;;;;;;;;;;;;;;;;;;;;;;ACV0B;AAEe;AACE;AAE4B;AACR;AAET;AACb;AAEzC,MAAMC,UAAU,GAAG,IAAIhX,KAAK,CAAC,mBAAmB,CAAC;AAElC,MAAMH,YAAY,SAASx5B,wDAAe,CAAC;EACxDsP,WAAW,CAACC,KAAK,EAAE;IACjB,KAAK,CAACA,KAAK,CAAC;IAEZ,IAAI,CAACrM,KAAK,GAAG;MACXuF,KAAK,EAAE,IAAI;MACX8K,QAAQ,EAAEpR,SAAS;MACnBuR,MAAM,EAAE,IAAI;MACZe,aAAa,EAAE,EAAE;MACjBoG,gBAAgB,EAAE1Y;IACpB,CAAC;IAED,IAAI,CAAC6Y,SAAS,GAAG,IAAI,CAACA,SAAS,CAACvL,IAAI,CAAC,IAAI,CAAC;IAC1C,IAAI,CAACyL,UAAU,GAAG,IAAI,CAACA,UAAU,CAACzL,IAAI,CAAC,IAAI,CAAC;IAC5C,IAAI,CAACmhC,gBAAgB,GAAG,IAAI,CAACA,gBAAgB,CAACnhC,IAAI,CAAC,IAAI,CAAC;IACxD,IAAI,CAACohC,gBAAgB,GAAG,IAAI,CAACA,gBAAgB,CAACphC,IAAI,CAAC,IAAI,CAAC;IACxD,IAAI,CAACqhC,SAAS,GAAG,IAAI;EACvB;EAEA1qB,iBAAiB,GAAG;IAClB,MAAM3d,KAAK,GAAG,IAAI,CAAC8G,KAAK,CAACqB,MAAM,CAAC+K,QAAQ,CAAC,IAAI,CAACpM,KAAK,CAAC9G,KAAK,CAAC;IAC1D,IAAI,CAACA,KAAK,EAAE;MACV;IACF;IAEA,IAAI,CAACuS,SAAS,CAACvS,KAAK,CAAC;IACrB,IAAI,IAAI,CAAC8G,KAAK,CAACtM,SAAS,IAAIhL,uEAA4B,EAAE;MAExD04C,UAAU,CAAC1K,IAAI,EAAE,CAAC/gC,KAAK,CAAC1I,CAAC,IAAI,CAAC,CAAC,CAAC;MAChC,IAAI,CAACs0C,SAAS,GAAGvlB,WAAW,CAAC/uB,CAAC,IAAI;QAACm0C,UAAU,CAAC1K,IAAI,EAAE,CAAC/gC,KAAK,CAAC1I,CAAC,IAAI,CAAC,CAAC,CAAC;MAAA,CAAC,EAAE,IAAI,CAAC;MAC3E,IAAI,CAAC+S,KAAK,CAACwhC,SAAS,CAAC,IAAI,CAACxhC,KAAK,CAAC9G,KAAK,EAAE,IAAI,CAAC8G,KAAK,CAACyZ,GAAG,CAAC;IACxD;EACF;EAGAtT,kBAAkB,CAACnG,KAAK,EAAE;IACxB,MAAM9G,KAAK,GAAG,IAAI,CAAC8G,KAAK,CAACqB,MAAM,CAAC+K,QAAQ,CAACpM,KAAK,CAAC9G,KAAK,CAAC;IACrD,IAAI,CAACA,KAAK,EAAE;MACV;IACF;IAEA,IAAI,IAAI,CAACyS,UAAU,IAAIzS,KAAK,CAACyS,UAAU,EAAE;MACvC,IAAI,CAACL,gBAAgB,GAAGpS,KAAK,CAACyS,UAAU;MACxCzS,KAAK,CAACyS,UAAU,GAAG,IAAI,CAACA,UAAU;IACpC;IAEA,IAAI,IAAI,CAAChY,KAAK,CAACuF,KAAK,IAAI8G,KAAK,CAAC9G,KAAK,EAAE;MACnC,IAAI,CAACoJ,QAAQ,CAAC;QAACpJ,KAAK,EAAE8G,KAAK,CAAC9G;MAAK,CAAC,CAAC;MACnC,IAAI,CAACuS,SAAS,CAACvS,KAAK,EAAE8G,KAAK,CAAC;IAC9B;EACF;EAEAqM,oBAAoB,GAAG;IACrB,IAAI,IAAI,CAACk1B,SAAS,IAAI,IAAI,EAAE;MAC1BtlB,aAAa,CAAC,IAAI,CAACslB,SAAS,CAAC;MAC7BH,UAAU,CAAC7C,KAAK,EAAE;IACpB;IACA,MAAMrlC,KAAK,GAAG,IAAI,CAAC8G,KAAK,CAACqB,MAAM,CAAC+K,QAAQ,CAAC,IAAI,CAACpM,KAAK,CAAC9G,KAAK,CAAC;IAC1D,IAAI,CAACA,KAAK,EAAE;MACV;IACF;IACA,IAAI,CAACoJ,QAAQ,CAAC;MAACpJ,KAAK,EAAE;IAAI,CAAC,CAAC;IAC5BA,KAAK,CAACyS,UAAU,GAAG,IAAI,CAACL,gBAAgB;EAC1C;EAEAG,SAAS,CAACvS,KAAK,EAAE;IACf,MAAM4T,MAAM,GAAG,EAAE;IACjB,IAAI5T,KAAK,CAAC6T,OAAO,EAAE;MACjB,KAAK,MAAM,CAAC7a,GAAG,EAAEsB,GAAG,CAAC,IAAI8D,MAAM,CAAC0V,OAAO,CAAC9T,KAAK,CAAC6T,OAAO,CAAC,EAAE;QACtD,IAAIvZ,GAAG,EAAE;UACPsZ,MAAM,CAACtc,IAAI,CAAC0B,GAAG,CAAC;QAClB;MACF;IACF;IAEA,IAAI,CAACoQ,QAAQ,CAAC;MACZ0B,QAAQ,EAAEtE,sDAAO,CAACxG,KAAK,CAAC+K,MAAM,GAAG/K,KAAK,CAAC+K,MAAM,CAAC1G,EAAE,GAAG3K,SAAS,EAAEhL,wDAAgB,CAAC;MAC/Euc,MAAM,EAAEpb,kEAAY,CAACmQ,KAAK,CAAC+K,MAAM,GAAG/K,KAAK,CAAC+K,MAAM,CAACjb,KAAK,GAAG,IAAI,CAAC;MAC9Dkc,aAAa,EAAE4H;IACjB,CAAC,CAAC;EACJ;EAEAnB,UAAU,CAACsC,IAAI,EAAE;IACf,MAAM/U,KAAK,GAAG,IAAI,CAAC8G,KAAK,CAACqB,MAAM,CAAC+K,QAAQ,CAAC,IAAI,CAACpM,KAAK,CAAC9G,KAAK,CAAC;IAC1D,IAAI,CAACA,KAAK,EAAE;MACV;IACF;IACA,IAAI,CAACuS,SAAS,CAACvS,KAAK,CAAC;IAErB,IAAI,IAAI,CAACoS,gBAAgB,IAAI,IAAI,CAACA,gBAAgB,IAAI,IAAI,CAACK,UAAU,EAAE;MACrE,IAAI,CAACL,gBAAgB,CAAC2C,IAAI,CAAC;IAC7B;EACF;EAEAqzB,gBAAgB,GAAG;IACjB,IAAI,CAACthC,KAAK,CAACyhC,YAAY,CAAC,IAAI,CAACzhC,KAAK,CAAC9G,KAAK,CAAC;EAC3C;EAEAmoC,gBAAgB,GAAG;IACjB,IAAI,CAACrhC,KAAK,CAACk6B,QAAQ,CAAC,IAAI,CAACl6B,KAAK,CAAC9G,KAAK,EAAE,IAAI,CAAC8G,KAAK,CAACyZ,GAAG,CAAC;IACrD,IAAI,CAACzZ,KAAK,CAAC0hC,OAAO,EAAE;EACtB;EAEAlhC,MAAM,GAAG;IACP,OACE;MAAK,SAAS,EAAC;IAAiB,GAC9B;MAAK,SAAS,EAAC;IAAe,GAC5B;MAAK,SAAS,EAAC;IAA4B,GACzC;MAAK,SAAS,EAAC;IAAY,GACzB,2DAAC,wDAAU;MACT,MAAM,EAAE,IAAI,CAACR,KAAK,CAACqB,MAAO;MAC1B,MAAM,EAAE,IAAI,CAAC1N,KAAK,CAACwQ,MAAM,IAAI,IAAK;MAClC,KAAK,EAAE,IAAI,CAACnE,KAAK,CAAC9G,KAAM;MACxB,KAAK,EAAE,IAAI,CAACvF,KAAK,CAACqQ;IAAS,EAAG,CAC5B,EACN;MAAK,SAAS,EAAC;IAAa,GAAEtE,sDAAO,CAAC,IAAI,CAAC/L,KAAK,CAACqQ,QAAQ,EAAElc,6DAAqB,CAAC,EAC/E,2DAAC,uDAAS;MAAC,KAAK,EAAE,IAAK;MAAC,aAAa,EAAE,IAAI,CAAC6L,KAAK,CAACuR;IAAc,EAAG,CAAM,CACvE,EACN;MAAK,SAAS,EAAC;IAAU,GACtB,IAAI,CAAClF,KAAK,CAACtM,SAAS,IAAIhL,uEAA4B,GACnD,0HACE;MAAQ,SAAS,EAAC,QAAQ;MAAC,OAAO,EAAE,IAAI,CAAC24C;IAAiB,GACxD;MAAG,SAAS,EAAC;IAAgB,GAAC,UAAQ,CAAI,CACnC,EACT;MAAQ,SAAS,EAAC,UAAU;MAAC,OAAO,EAAE,IAAI,CAACC;IAAiB,GAC1D;MAAG,SAAS,EAAC;IAAgB,GAAC,MAAI,CAAI,CAC/B,CACR,GAEH,IAAI,CAEF,CACF,CACF;EAEV;AACF;AAAC;;;;;;;;;;;;;;;;;;;ACpJyB;AACoB;AAEM;AAErC,MAAMzwC,WAAW,SAASJ,4DAAmB,CAAC;EAC3D+P,MAAM,GAAG;IACP,MAAMmhC,aAAa,GAAG,CAAC,UAAU,EAAE,cAAc,EAAE,QAAQ,CAAC,CAACr1C,QAAQ,CAAC,IAAI,CAAC0T,KAAK,CAACtM,SAAS,CAAC;IAC3F,MAAMkuC,YAAY,GAAG,wBAAwB,IAAID,aAAa,GAAG,KAAK,GAAG,OAAO,CAAC;IACjF,MAAME,QAAQ,GAAG,IAAI,CAAC7hC,KAAK,CAACpM,QAAQ,GACjC+tC,aAAa,GAAG,aAAa,GAAG,eAAe,GAC/CA,aAAa,GAAG,sBAAsB,GAAG,WAAY;IACxD,IAAIhvC,QAAQ;IACZ,IAAIgvC,aAAa,EAAE;MACjB,QAAQ,IAAI,CAAC3hC,KAAK,CAACtM,SAAS;QAC1B,KAAK,UAAU;UACbf,QAAQ,GAAG,2DAAC,wDAAgB;YAAC,EAAE,iBAAgB;YAAC,cAAc;cAAA;cAAA;YAAA;UAAW,EAAyC;UAClH;QACF,KAAK,QAAQ;UACXA,QAAQ,GAAG,IAAI,CAACqN,KAAK,CAACpM,QAAQ,GAC5B,2DAAC,wDAAgB;YAAC,EAAE,eAAc;YAAC,cAAc;cAAA;cAAA;YAAA;UAAS,EAAgD,GAC1G,2DAAC,wDAAgB;YAAC,EAAE,kBAAiB;YAAC,cAAc;cAAA;cAAA;YAAA;UAAY,EAAmD;UACrH;QACF;UACEjB,QAAQ,GAAG,2DAAC,wDAAgB;YAAC,EAAE,qBAAoB;YAAC,cAAc;cAAA;cAAA;YAAA;UAAe,EAA6C;UAC9H;MAAM;IAEZ,CAAC,MAAM;MACLA,QAAQ,GAAG,yEAAOxB,gEAAa,CAAC,IAAI,CAAC6O,KAAK,CAACrN,QAAQ,GAAG,IAAI,CAAC,CAAQ;IACrE;IACA,OAAO;MAAK,SAAS,EAAC;IAAc,GAClC,wEAAK;MAAG,SAAS,EAAC;IAAyB,GAAC,MAAI,CAAI,CAAM,EAC1D;MAAK,SAAS,EAAC;IAAoB,GACjC,wEAAM,IAAI,CAACqN,KAAK,CAACpM,QAAQ,GACvB,2DAAC,wDAAgB;MAAC,EAAE,kBAAiB;MAAC,cAAc;QAAA;QAAA;MAAA;IAAgB,EAAqC,GACzG,2DAAC,wDAAgB;MAAC,EAAE,kBAAiB;MAAC,cAAc;QAAA;QAAA;MAAA;IAAgB,EAAqC,CACpG,EACP;MAAK,SAAS,EAAC;IAAU,GAAC;MAAG,SAAS,EAAEguC;IAAa,GAAEC,QAAQ,CAAK,KAAC,EAAClvC,QAAQ,CAAO,CACjF,CACF;EACR;AACF;;;;;;;;;;;;;;;;;;;;;;AC1C0B;AACgD;AAE/B;AAEU;AACkC;AAE9C;AAEzC,MAAMyuC,UAAU,GAAG,IAAIhX,KAAK,CAAC,oBAAoB,CAAC;AAClDgX,UAAU,CAACU,IAAI,GAAG,IAAI;AACtB,MAAMC,gBAAgB,GAAG,IAAI3X,KAAK,CAAC,oBAAoB,CAAC;AACxD2X,gBAAgB,CAACD,IAAI,GAAG,IAAI;AAC5B,MAAME,aAAa,GAAG,IAAI5X,KAAK,CAAC,mBAAmB,CAAC;AAEpD,MAAM6X,iBAAiB,GAAG,aAAa;AACvC,MAAMC,mBAAmB,GAAG,eAAe;AAE3C,MAAM3wC,QAAQ,GAAGb,0DAAc,CAAC;EAC9ByxC,eAAe,EAAE;IACf1wC,EAAE,mBAAmB;IACrBC,cAAc;MAAA;MAAA;IAAA;EAEhB;AACF,CAAC,CAAC;AAEF,MAAMmgB,SAAS,SAASphB,4DAAmB,CAAC;EAC1CsP,WAAW,CAACC,KAAK,EAAE;IACjB,KAAK,CAACA,KAAK,CAAC;IAEZ,IAAI,CAACrM,KAAK,GAAG;MACXyuC,WAAW,EAAExvC,SAAS;MACtByvC,YAAY,EAAEzvC,SAAS;MACvB0vC,EAAE,EAAE1vC,SAAS;MACb2vC,WAAW,EAAE3vC,SAAS;MAEtB4vC,cAAc,EAAE5vC,SAAS;MACzB6vC,cAAc,EAAE,KAAK;MAErBC,wBAAwB,EAAE,KAAK;MAC/B7H,SAAS,EAAE76B,KAAK,CAACqhB,aAAa;MAE9BshB,qBAAqB,EAAE,KAAK;MAE5BC,eAAe,EAAE;IACnB,CAAC;IAED,IAAI,CAACC,sBAAsB,GAAG;MAC5BjlB,KAAK,EAAE,IAAI;MACXf,KAAK,EAAE,CAAC7c,KAAK,CAACqhB;IAChB,CAAC;IACD,IAAI,CAACyhB,cAAc,GAAG9iC,KAAK,CAACtM,SAAS,IAAIjL,uEAA4B;IAErE,IAAI,CAACs6C,QAAQ,GAAGtyC,sDAAe,EAAE;IACjC,IAAI,CAACuyC,SAAS,GAAGvyC,sDAAe,EAAE;IAElC,IAAI,CAACwyC,wBAAwB,GAAG,EAAE;IAElC,IAAI,CAACtrB,MAAM,GAAG,IAAI,CAACA,MAAM,CAACzX,IAAI,CAAC,IAAI,CAAC;IACpC,IAAI,CAACgjC,KAAK,GAAG,IAAI,CAACA,KAAK,CAAChjC,IAAI,CAAC,IAAI,CAAC;IAClC,IAAI,CAACijC,IAAI,GAAG,IAAI,CAACA,IAAI,CAACjjC,IAAI,CAAC,IAAI,CAAC;IAEhC,IAAI,CAACkjC,oBAAoB,GAAG,IAAI,CAACA,oBAAoB,CAACljC,IAAI,CAAC,IAAI,CAAC;IAChE,IAAI,CAACmjC,YAAY,GAAG,IAAI,CAACA,YAAY,CAACnjC,IAAI,CAAC,IAAI,CAAC;IAChD,IAAI,CAACojC,6BAA6B,GAAG,IAAI,CAACA,6BAA6B,CAACpjC,IAAI,CAAC,IAAI,CAAC;IAElF,IAAI,CAACqjC,4BAA4B,GAAG,IAAI,CAACA,4BAA4B,CAACrjC,IAAI,CAAC,IAAI,CAAC;IAChF,IAAI,CAACsjC,uBAAuB,GAAG,IAAI,CAACA,uBAAuB,CAACtjC,IAAI,CAAC,IAAI,CAAC;IACtE,IAAI,CAACujC,wBAAwB,GAAG,IAAI,CAACA,wBAAwB,CAACvjC,IAAI,CAAC,IAAI,CAAC;IACxE,IAAI,CAACwjC,mCAAmC,GAAG,IAAI,CAACA,mCAAmC,CAACxjC,IAAI,CAAC,IAAI,CAAC;IAC9F,IAAI,CAACyjC,+BAA+B,GAAG,IAAI,CAACA,+BAA+B,CAACzjC,IAAI,CAAC,IAAI,CAAC;IACtF,IAAI,CAAC0jC,kCAAkC,GAAG,IAAI,CAACA,kCAAkC,CAAC1jC,IAAI,CAAC,IAAI,CAAC;IAC5F,IAAI,CAAC2jC,4BAA4B,GAAG,IAAI,CAACA,4BAA4B,CAAC3jC,IAAI,CAAC,IAAI,CAAC;IAChF,IAAI,CAAC4jC,gBAAgB,GAAG,IAAI,CAACA,gBAAgB,CAAC5jC,IAAI,CAAC,IAAI,CAAC;IAExD,IAAI,CAAC6jC,mBAAmB,GAAG,IAAI,CAACA,mBAAmB,CAAC7jC,IAAI,CAAC,IAAI,CAAC;IAC9D,IAAI,CAAC8jC,oBAAoB,GAAG,IAAI,CAACA,oBAAoB,CAAC9jC,IAAI,CAAC,IAAI,CAAC;IAChE,IAAI,CAACujC,wBAAwB,GAAG,IAAI,CAACA,wBAAwB,CAACvjC,IAAI,CAAC,IAAI,CAAC;IAExE,IAAI,CAAC+jC,WAAW,GAAG,IAAI,CAACA,WAAW,CAAC/jC,IAAI,CAAC,IAAI,CAAC;IAC9C,IAAI,CAACgkC,uBAAuB,GAAG,IAAI,CAACA,uBAAuB,CAAChkC,IAAI,CAAC,IAAI,CAAC;IAEtE,IAAI,CAACikC,UAAU,GAAG,IAAI,CAACA,UAAU,CAACjkC,IAAI,CAAC,IAAI,CAAC;IAC5C,IAAI,CAACkkC,eAAe,GAAG,IAAI,CAACA,eAAe,CAAClkC,IAAI,CAAC,IAAI,CAAC;IAEtD,IAAI,CAACmkC,gBAAgB,GAAG,IAAI,CAACA,gBAAgB,CAACnkC,IAAI,CAAC,IAAI,CAAC;IACxD,IAAI,CAACokC,uBAAuB,GAAG,IAAI,CAACA,uBAAuB,CAACpkC,IAAI,CAAC,IAAI,CAAC;IACtE,IAAI,CAACqkC,oBAAoB,GAAG,IAAI,CAACA,oBAAoB,CAACrkC,IAAI,CAAC,IAAI,CAAC;IAEhE,IAAI,CAACskC,kBAAkB,GAAG,IAAI,CAACA,kBAAkB,CAACtkC,IAAI,CAAC,IAAI,CAAC;IAC5D,IAAI,CAACukC,uBAAuB,GAAG,IAAI,CAACA,uBAAuB,CAACvkC,IAAI,CAAC,IAAI,CAAC;IAEtE,IAAI,CAACwkC,SAAS,GAAG,IAAI,CAACA,SAAS,CAACxkC,IAAI,CAAC,IAAI,CAAC;IAC1C,IAAI,CAACykC,WAAW,GAAG,IAAI,CAACA,WAAW,CAACzkC,IAAI,CAAC,IAAI,CAAC;IAC9C,IAAI,CAAC0kC,eAAe,GAAG,IAAI,CAACA,eAAe,CAAC1kC,IAAI,CAAC,IAAI,CAAC;IAEtD,IAAI,CAAC2kC,sBAAsB,GAAG,IAAI,CAACA,sBAAsB,CAAC3kC,IAAI,CAAC,IAAI,CAAC;IACpE,IAAI,CAAC4kC,sBAAsB,GAAG,IAAI,CAACA,sBAAsB,CAAC5kC,IAAI,CAAC,IAAI,CAAC;IACpE,IAAI,CAAC6kC,wBAAwB,GAAG,IAAI,CAACA,wBAAwB,CAAC7kC,IAAI,CAAC,IAAI,CAAC;IACxE,IAAI,CAAC8kC,qBAAqB,GAAG,IAAI,CAACA,qBAAqB,CAAC9kC,IAAI,CAAC,IAAI,CAAC;IAClE,IAAI,CAAC+kC,sBAAsB,GAAG,IAAI,CAACA,sBAAsB,CAAC/kC,IAAI,CAAC,IAAI,CAAC;EACtE;EAEA2W,iBAAiB,GAAG;IAClB,MAAM3d,KAAK,GAAG,IAAI,CAAC8G,KAAK,CAACqB,MAAM,CAAC+K,QAAQ,CAAC,IAAI,CAACpM,KAAK,CAAC9G,KAAK,CAAC;IAC1D,IAAI,CAACspC,cAAc,GAAGtpC,KAAK,CAACye,MAAM;IAClCze,KAAK,CAACye,MAAM,GAAG,IAAI,CAACA,MAAM;IAC1B,IAAI,CAAC,IAAI,CAAC3X,KAAK,CAACtM,SAAS,IAAIjL,uEAA4B,IACpD,IAAI,CAACuX,KAAK,CAACtM,SAAS,IAAI/K,iEAAsB,KAAK,IAAI,CAACo6C,QAAQ,CAACtiB,OAAO,EAAE;MAC7E,IAAI,CAACyiB,KAAK,EAAE;IACd;EACF;EAEA72B,oBAAoB,GAAG;IACrB,MAAMnT,KAAK,GAAG,IAAI,CAAC8G,KAAK,CAACqB,MAAM,CAAC+K,QAAQ,CAAC,IAAI,CAACpM,KAAK,CAAC9G,KAAK,CAAC;IAC1DA,KAAK,CAACye,MAAM,GAAG,IAAI,CAAC6qB,cAAc;IAClC,IAAI,CAACW,IAAI,EAAE;EACb;EAEAsB,uBAAuB,CAACzrC,IAAI,EAAE;IAC5BooC,UAAU,CAAC7C,KAAK,EAAE;IAClB,MAAM+D,EAAE,GAAG,IAAI,CAACc,oBAAoB,EAAE;IACtC,MAAM8B,MAAM,GAAG,IAAI,CAACvxC,KAAK,CAACyuC,WAAW;IACrC8C,MAAM,CAACC,SAAS,EAAE,CAACn1C,OAAO,CAACo1C,KAAK,IAAI;MAClC9C,EAAE,CAAC+C,QAAQ,CAACD,KAAK,EAAEF,MAAM,CAAC;MAE1B,IAAIE,KAAK,CAAC92C,IAAI,IAAI,OAAO,IAAI,IAAI,CAACqF,KAAK,CAACknC,SAAS,EAAE;QAGjDuK,KAAK,CAAC5M,OAAO,GAAG,KAAK;QACrB4M,KAAK,CAACjC,IAAI,EAAE;QACZ+B,MAAM,CAACI,WAAW,CAACF,KAAK,CAAC;MAC3B;IACF,CAAC,CAAC;EACJ;EAEAztB,MAAM,CAAC3e,IAAI,EAAE;IACX,IAAIA,IAAI,CAACmH,IAAI,IAAI,MAAM,EAAE;MACvB;IACF;IACA,QAAQnH,IAAI,CAACnL,KAAK;MAChB,KAAK,QAAQ;QACX,IAAI,CAAC42C,uBAAuB,CAACzrC,IAAI,CAAC;QAClC;MACF,KAAK,QAAQ;QACX,IAAI,CAACgrC,oBAAoB,CAAChrC,IAAI,CAAC;QAC/B;MACF,KAAK,eAAe;QAClB,IAAI,CAACyqC,wBAAwB,CAACzqC,IAAI,CAAC;QACnC;MACF,KAAK,SAAS;QACZ,IAAI,CAACwrC,kBAAkB,CAACxrC,IAAI,CAAC;QAC7B;MACF,KAAK,OAAO;QACV,IAAI,CAAC+qC,mBAAmB,CAAC/qC,IAAI,CAAC;QAC9B;MACF,KAAK,SAAS;QAEZooC,UAAU,CAAC1K,IAAI,EAAE,CAAC/gC,KAAK,CAAC1I,CAAC,IAAI,CAAC,CAAC,CAAC;QAChC;MACF;QACEuB,OAAO,CAACuH,IAAI,CAAC,oBAAoB,EAAEiD,IAAI,CAACnL,KAAK,CAAC;QAC9C;IAAM;EAEZ;EAGA+2C,eAAe,GAAG;IAChB,MAAMr7C,KAAK,GAAG,GAAG;IACjB,MAAMC,MAAM,GAAG,GAAG;IAClB,MAAMuC,MAAM,GAAGuL,MAAM,CAACC,MAAM,CAACvL,QAAQ,CAACC,aAAa,CAAC,QAAQ,CAAC,EAAE;MAAC1C,KAAK;MAAEC;IAAM,CAAC,CAAC;IAC/EuC,MAAM,CAACI,UAAU,CAAC,IAAI,CAAC,CAACo5C,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAEh8C,KAAK,EAAEC,MAAM,CAAC;IACrD,MAAM07C,MAAM,GAAGn5C,MAAM,CAACy5C,aAAa,CAAC,CAAC,CAAC;IACtC,OAAOluC,MAAM,CAACC,MAAM,CAAC2tC,MAAM,CAACO,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE;MAACjN,OAAO,EAAE;IAAK,CAAC,CAAC;EACpE;EAEA0K,KAAK,GAAG;IACN,IAAI,IAAI,CAACvvC,KAAK,CAACyuC,WAAW,EAAE;MAC1B,IAAI,CAACpiC,KAAK,CAAChS,OAAO,CAAC,IAAI,CAACgS,KAAK,CAACgD,IAAI,CAAC/O,aAAa,CAAC1C,QAAQ,CAAC4wC,eAAe,CAAC,EAAE,MAAM,CAAC;MACnF;IACF;IAEA,IAAI,IAAI,CAACniC,KAAK,CAACtM,SAAS,IAAI/K,iEAAsB,EAAE;MAElD,IAAI,CAACqX,KAAK,CAAC0lC,QAAQ,CAAC,IAAI,CAAC1lC,KAAK,CAAC9G,KAAK,EAAE,IAAI,CAAC8G,KAAK,CAACyZ,GAAG,EAAE9wB,iEAAsB,EAAE,IAAI,CAACqX,KAAK,CAACqhB,aAAa,CAAC;MACvG;IACF;IAIAhoB,SAAS,CAACssC,YAAY,CAACC,YAAY,CAAC,IAAI,CAAC/C,sBAAsB,CAAC,CAC7DxtC,IAAI,CAAC6vC,MAAM,IAAI;MACd,IAAI,CAAC,IAAI,CAACrC,sBAAsB,CAAChmB,KAAK,EAAE;QAGtCqoB,MAAM,CAACG,QAAQ,CAAC,IAAI,CAACT,eAAe,EAAE,CAAC;MACzC;MACA,IAAI,CAACtiC,QAAQ,CAAC;QAAC8/B,WAAW,EAAE8C,MAAM;QAAEzC,cAAc,EAAE;MAAI,CAAC,CAAC;MAC1D,IAAI,CAACM,QAAQ,CAACtiB,OAAO,CAAColB,SAAS,GAAGX,MAAM;MAExClD,aAAa,CAACtL,IAAI,EAAE;MAGpB,IAAI,CAAC12B,KAAK,CAAC0lC,QAAQ,CAAC,IAAI,CAAC1lC,KAAK,CAAC9G,KAAK,EAAE,IAAI,CAAC8G,KAAK,CAACyZ,GAAG,EAAE,IAAI,CAACzZ,KAAK,CAACtM,SAAS,EAAE,IAAI,CAACsM,KAAK,CAACqhB,aAAa,CAAC;IACvG,CAAC,CAAC,CACD1rB,KAAK,CAAC,IAAI,CAACuuC,uBAAuB,CAAC;EACxC;EAEAf,IAAI,GAAG;IACLpB,gBAAgB,CAACxD,KAAK,EAAE;IACxBwD,gBAAgB,CAACtE,WAAW,GAAG,CAAC;IAChC2D,UAAU,CAAC7C,KAAK,EAAE;IAClB6C,UAAU,CAAC3D,WAAW,GAAG,CAAC;IAE1B,IAAI,CAAC0G,UAAU,CAAC,IAAI,CAACxwC,KAAK,CAACyuC,WAAW,CAAC;IACvC,IAAI,CAAC+B,UAAU,CAAC,IAAI,CAACxwC,KAAK,CAAC0uC,YAAY,CAAC;IACxC,IAAI,CAAC+B,eAAe,CAAC,IAAI,CAACrB,QAAQ,CAACtiB,OAAO,CAAC;IAC3C,IAAI,CAAC2jB,eAAe,CAAC,IAAI,CAACpB,SAAS,CAACviB,OAAO,CAAC;IAC5C,IAAI,IAAI,CAAC9sB,KAAK,CAAC2uC,EAAE,EAAE;MACjB,IAAI,CAAC3uC,KAAK,CAAC2uC,EAAE,CAACwD,OAAO,GAAG,IAAI;MAC5B,IAAI,CAACnyC,KAAK,CAAC2uC,EAAE,CAACyD,aAAa,GAAG,IAAI;MAClC,IAAI,CAACpyC,KAAK,CAAC2uC,EAAE,CAAC0D,cAAc,GAAG,IAAI;MACnC,IAAI,CAACryC,KAAK,CAAC2uC,EAAE,CAAC2D,cAAc,GAAG,IAAI;MACnC,IAAI,CAACtyC,KAAK,CAAC2uC,EAAE,CAAC4D,0BAA0B,GAAG,IAAI;MAC/C,IAAI,CAACvyC,KAAK,CAAC2uC,EAAE,CAAC6D,sBAAsB,GAAG,IAAI;MAC3C,IAAI,CAACxyC,KAAK,CAAC2uC,EAAE,CAAC8D,yBAAyB,GAAG,IAAI;MAC9C,IAAI,CAACzyC,KAAK,CAAC2uC,EAAE,CAAC+D,mBAAmB,GAAG,IAAI;MACxC,IAAI,CAAC1yC,KAAK,CAAC2uC,EAAE,CAACgE,mBAAmB,GAAG,IAAI;MACxC,IAAI,CAAC3yC,KAAK,CAAC2uC,EAAE,CAACiE,aAAa,GAAG,IAAI;MAElC,IAAI,IAAI,CAAC5yC,KAAK,CAAC4uC,WAAW,EAAE;QAC1B,IAAI,CAAC5uC,KAAK,CAAC4uC,WAAW,CAACiE,KAAK,EAAE;MAChC;MACA,IAAI,CAAC7yC,KAAK,CAAC2uC,EAAE,CAACkE,KAAK,EAAE;IACvB;IACA,IAAI,CAAClkC,QAAQ,CAAC;MAACggC,EAAE,EAAE,IAAI;MAAEG,cAAc,EAAE;IAAK,CAAC,CAAC;EAClD;EAEA2B,eAAe,CAAC9xC,EAAE,EAAE;IAClB,IAAI,CAACA,EAAE,EAAE;MACP;IACF;IAEAA,EAAE,CAACuzC,SAAS,GAAG,IAAI;IACnBvzC,EAAE,CAACzG,GAAG,GAAG,EAAE;EACb;EAEAs4C,UAAU,CAACe,MAAM,EAAE;IACjB,IAAI,CAACA,MAAM,EAAE;MACX;IACF;IAEA,IAAIuB,MAAM,GAAGvB,MAAM,CAACC,SAAS,EAAE;IAC/B,IAAIsB,MAAM,EAAE;MACVA,MAAM,CAACz2C,OAAO,CAACo1C,KAAK,IAAI;QACtBA,KAAK,CAACjC,IAAI,EAAE;QACZiC,KAAK,CAAC5M,OAAO,GAAG,KAAK;MACvB,CAAC,CAAC;IACJ;EACF;EAEAsM,sBAAsB,CAACx3C,KAAK,EAAE;IAC5BkB,OAAO,CAAClB,KAAK,CAAC,oBAAoB,EAAEA,KAAK,CAAC;EAC5C;EAEAy3C,wBAAwB,CAACl3C,KAAK,EAAE;IAC9B,QAAQA,KAAK,CAAC3E,IAAI;MAClB,KAAK+4C,iBAAiB;QACpB,IAAI,CAAC3/B,QAAQ,CAAC;UAACsgC,eAAe,EAAE;QAAK,CAAC,EAAE31C,CAAC,IAAI;UAAE,IAAI,CAAC+1C,SAAS,CAACviB,OAAO,CAAColB,SAAS,GAAG,IAAI,CAAClyC,KAAK,CAAC0uC,YAAY;QAAE,CAAC,CAAC;QAC7G;MACF,KAAKH,mBAAmB;QACtB,IAAI,CAAC5/B,QAAQ,CAAC;UAACsgC,eAAe,EAAE;QAAI,CAAC,EAAE31C,CAAC,IAAI;UAAE,IAAI,CAAC+1C,SAAS,CAACviB,OAAO,CAAColB,SAAS,GAAG,IAAI,CAAClyC,KAAK,CAAC0uC,YAAY;QAAE,CAAC,CAAC;QAC5G;MACF;QACE;IAAM;EAEV;EAEA2C,qBAAqB,CAACn3C,KAAK,EAAE;IAC3B,IAAI,CAAC,IAAI,CAAC8F,KAAK,CAACknC,SAAS,EAAE;MACzBhtC,KAAK,CAAC0a,MAAM,CAACm+B,IAAI,CAACxE,mBAAmB,CAAC;IACxC;EACF;EAEA+C,sBAAsB,GAAG,CAEzB;EAEAJ,sBAAsB,CAACh3C,KAAK,EAAE;IAC5B,MAAMkd,OAAO,GAAGld,KAAK,CAACkd,OAAO;IAC7BA,OAAO,CAACxf,OAAO,GAAG,IAAI,CAACu5C,sBAAsB;IAC7C/5B,OAAO,CAAC47B,SAAS,GAAG,IAAI,CAAC5B,wBAAwB;IACjDh6B,OAAO,CAAC67B,MAAM,GAAG,IAAI,CAAC5B,qBAAqB;IAC3Cj6B,OAAO,CAAC87B,OAAO,GAAG,IAAI,CAAC5B,sBAAsB;IAC7C,IAAI,CAAC3iC,QAAQ,CAAC;MAACigC,WAAW,EAAEx3B;IAAO,CAAC,CAAC;EACvC;EAEAq4B,oBAAoB,GAAG;IACrB,MAAM0D,UAAU,GAAG,IAAI,CAAC9mC,KAAK,CAACqB,MAAM,CAAC+c,cAAc,CAAC,YAAY,EAAE,IAAI,CAAC;IACvE,MAAMkkB,EAAE,GAAGwE,UAAU,GAAG,IAAIC,iBAAiB,CAAC;MAACD,UAAU,EAAEA;IAAU,CAAC,CAAC,GAAG,IAAIC,iBAAiB,EAAE;IAEjGzE,EAAE,CAAC2D,cAAc,GAAG,IAAI,CAACzC,uBAAuB;IAChDlB,EAAE,CAAC4D,0BAA0B,GAAG,IAAI,CAACxC,mCAAmC;IACxEpB,EAAE,CAAC8D,yBAAyB,GAAG,IAAI,CAACxC,kCAAkC;IACtEtB,EAAE,CAAC6D,sBAAsB,GAAG,IAAI,CAACxC,+BAA+B;IAChErB,EAAE,CAAC+D,mBAAmB,GAAG,IAAI,CAAC9C,4BAA4B;IAC1DjB,EAAE,CAACgE,mBAAmB,GAAG,IAAI,CAACzC,4BAA4B;IAC1DvB,EAAE,CAACwD,OAAO,GAAG,IAAI,CAAChC,gBAAgB;IAClCxB,EAAE,CAACiE,aAAa,GAAG,IAAI,CAAC1B,sBAAsB;IAG9C,MAAM95B,OAAO,GAAGu3B,EAAE,CAAC0E,iBAAiB,CAAC,QAAQ,EAAE;MAACC,OAAO,EAAE;IAAI,CAAC,CAAC;IAC/Dl8B,OAAO,CAACxf,OAAO,GAAG,IAAI,CAACu5C,sBAAsB;IAC7C/5B,OAAO,CAAC47B,SAAS,GAAG,IAAI,CAAC5B,wBAAwB;IACjDh6B,OAAO,CAAC67B,MAAM,GAAG,IAAI,CAAC5B,qBAAqB;IAC3Cj6B,OAAO,CAAC87B,OAAO,GAAG,IAAI,CAAC5B,sBAAsB;IAE7C,IAAI,CAAC3iC,QAAQ,CAAC;MAACggC,EAAE,EAAEA,EAAE;MAAEC,WAAW,EAAEx3B,OAAO;MAAE03B,cAAc,EAAE;IAAK,CAAC,CAAC;IAEpE,OAAOH,EAAE;EACX;EAEA0B,oBAAoB,CAAChrC,IAAI,EAAE;IAGzB,MAAMiV,IAAI,GAAG,IAAIi5B,qBAAqB,CAACluC,IAAI,CAACi6B,OAAO,CAAC;IACpD,IAAI,CAACt/B,KAAK,CAAC2uC,EAAE,CAAC6E,oBAAoB,CAACl5B,IAAI,CAAC,CACrC5Y,IAAI,CAACpI,CAAC,IAAI;MACT,IAAI,CAACqV,QAAQ,CAAC;QAAEogC,wBAAwB,EAAE;MAAK,CAAC,EAAEz1C,CAAC,IAAI,IAAI,CAACq2C,6BAA6B,EAAE,CAAC;IAC9F,CAAC,CAAC,CACD3tC,KAAK,CAACnK,GAAG,IAAI,IAAI,CAACy4C,WAAW,CAACz4C,GAAG,CAAC,CAAC;EACxC;EAEAy4C,WAAW,CAACz4C,GAAG,EAAE;IACf,IAAI,CAACwU,KAAK,CAAChS,OAAO,CAACxC,GAAG,CAACwK,OAAO,EAAE,KAAK,CAAC;EACxC;EAEAqtC,YAAY,GAAG;IACb,OAAO,IAAI,CAACP,cAAc,IAAI,IAAI,CAACnvC,KAAK,CAAC+uC,wBAAwB;EACnE;EAEAa,4BAA4B,CAAC11C,KAAK,EAAE;IAClC,MAAMy0C,EAAE,GAAGz0C,KAAK,CAAC0a,MAAM;IACvB,IAAI,CAAC,IAAI,CAAC86B,YAAY,EAAE,EAAE;MACxB;IACF;IACAf,EAAE,CAAC8E,WAAW,EAAE,CAAC/xC,IAAI,CAACgyC,KAAK,IAAI;MAC7B,OAAO/E,EAAE,CAACgF,mBAAmB,CAACD,KAAK,CAAC;IACtC,CAAC,CAAC,CACDhyC,IAAI,CAACpI,CAAC,IAAI;MACT,IAAI,CAAC+S,KAAK,CAACunC,WAAW,CAAC,IAAI,CAACvnC,KAAK,CAAC9G,KAAK,EAAE,IAAI,CAAC8G,KAAK,CAACyZ,GAAG,EAAE6oB,EAAE,CAACkF,gBAAgB,CAACC,MAAM,EAAE,CAAC;IACxF,CAAC,CAAC,CACD9xC,KAAK,CAACnK,GAAG,IAAI,IAAI,CAACy4C,WAAW,CAACz4C,GAAG,CAAC,CAAC;EACtC;EAEAq4C,4BAA4B,CAACh2C,KAAK,EAAE;IAClCW,OAAO,CAACuH,IAAI,CAAC,sBAAsB,EAAElI,KAAK,CAAC;EAC7C;EAEA21C,uBAAuB,CAAC31C,KAAK,EAAE;IAC7B,IAAIA,KAAK,CAACotC,SAAS,EAAE;MACnB,IAAI,CAACj7B,KAAK,CAAC0nC,cAAc,CAAC,IAAI,CAAC1nC,KAAK,CAAC9G,KAAK,EAAE,IAAI,CAAC8G,KAAK,CAACyZ,GAAG,EAAE5rB,KAAK,CAACotC,SAAS,CAACwM,MAAM,EAAE,CAAC;IACvF;EACF;EAEAhE,wBAAwB,CAACzqC,IAAI,EAAE;IAC7B,MAAMiiC,SAAS,GAAG,IAAI0M,eAAe,CAAC3uC,IAAI,CAACi6B,OAAO,CAAC;IACnD,IAAI,IAAI,CAACt/B,KAAK,CAAC+uC,wBAAwB,EAAE;MACvC,IAAI,CAAC/uC,KAAK,CAAC2uC,EAAE,CAACsF,eAAe,CAAC3M,SAAS,CAAC,CACrCtlC,KAAK,CAACnK,GAAG,IAAI;QACZ,IAAIyvC,SAAS,CAACA,SAAS,EAAE;UACvB,IAAI,CAACgJ,WAAW,CAACz4C,GAAG,CAAC;QACvB;QACAgD,OAAO,CAACuH,IAAI,CAAC,gCAAgC,EAAEklC,SAAS,EAAEzvC,GAAG,CAAC;MAChE,CAAC,CAAC;IACN,CAAC,MAAM;MACL,IAAI,CAACy3C,wBAAwB,CAACzyC,IAAI,CAACyqC,SAAS,CAAC;IAC/C;EACF;EAEAqI,6BAA6B,GAAG;IAC9B,IAAI,CAACL,wBAAwB,CAACjzC,OAAO,CAACirC,SAAS,IAAI;MACjD,IAAI,CAACtnC,KAAK,CAAC2uC,EAAE,CAACsF,eAAe,CAAC3M,SAAS,CAAC,CACrCtlC,KAAK,CAACnK,GAAG,IAAI;QACZ,IAAIyvC,SAAS,CAACA,SAAS,EAAE;UACvB,IAAI,CAACgJ,WAAW,CAACz4C,GAAG,CAAC;QACvB;QACAgD,OAAO,CAACuH,IAAI,CAAC,mCAAmC,EAAEklC,SAAS,EAAEzvC,GAAG,CAAC;MACnE,CAAC,CAAC;IACN,CAAC,CAAC;IACF,IAAI,CAACy3C,wBAAwB,GAAG,EAAE;EACpC;EAEAS,mCAAmC,CAAC71C,KAAK,EAAE;IACzC,QAAQA,KAAK,CAAC0a,MAAM,CAACs/B,kBAAkB;MACrC,KAAK,QAAQ;MACb,KAAK,QAAQ;QACX,IAAI,CAACxD,gBAAgB,EAAE;QACvB;IAAM;EAEZ;EAEAV,+BAA+B,CAAC91C,KAAK,EAAE;IACrC,IAAIA,KAAK,CAAC0a,MAAM,CAACu/B,cAAc,IAAI,QAAQ,EAAE;MAC3C,IAAI,CAACzD,gBAAgB,EAAE;IACzB;EACF;EAEAT,kCAAkC,CAAC/1C,KAAK,EAAE,CAE1C;EAEAi2C,gBAAgB,CAACj2C,KAAK,EAAE;IAEtB,IAAI,CAACm1C,SAAS,CAACviB,OAAO,CAAColB,SAAS,GAAGh4C,KAAK,CAACk6C,OAAO,CAAC,CAAC,CAAC;IACnD,IAAI,CAACzlC,QAAQ,CAAC;MAAC+/B,YAAY,EAAEx0C,KAAK,CAACk6C,OAAO,CAAC,CAAC;IAAC,CAAC,CAAC;EACjD;EAEA7D,uBAAuB,CAACphC,CAAC,EAAE;IACzBtU,OAAO,CAAClB,KAAK,CAAC,wCAAwC,EAAEwV,CAAC,CAAC;IAC1D,QAAOA,CAAC,CAACnW,IAAI;MACX,KAAK,eAAe;QAElB,IAAI,CAACs3C,WAAW,CAACnhC,CAAC,CAAC;QACnB;MACF,KAAK,eAAe;MACpB,KAAK,uBAAuB;QAE1B;MACF;QACE,IAAI,CAACmhC,WAAW,CAACnhC,CAAC,CAAC;QACnB;IAAM;IAKV,IAAI,CAACuhC,gBAAgB,EAAE;EACzB;EAEAN,mBAAmB,CAAC/qC,IAAI,EAAE;IACxB,IAAIopC,WAAW,GAAG,IAAI;IACtB,MAAME,EAAE,GAAG,IAAI,CAAC3uC,KAAK,CAAC2uC,EAAE,GAAG,IAAI,CAAC3uC,KAAK,CAAC2uC,EAAE,GAAG,IAAI,CAACc,oBAAoB,EAAE;IACtE,MAAMn1B,IAAI,GAAG,IAAIi5B,qBAAqB,CAACluC,IAAI,CAACi6B,OAAO,CAAC;IAEpDqP,EAAE,CAAC6E,oBAAoB,CAACl5B,IAAI,CAAC,CAAC5Y,IAAI,CAACpI,CAAC,IAAI;MACtC,OAAOoM,SAAS,CAACssC,YAAY,CAACC,YAAY,CAAC,IAAI,CAAC/C,sBAAsB,CAAC;IACzE,CAAC,CAAC,CACDxtC,IAAI,CAAC6vC,MAAM,IAAI;MACd,IAAI8C,UAAU;MACd,IAAI,CAAC,IAAI,CAACnF,sBAAsB,CAAChmB,KAAK,EAAE;QAGtCmrB,UAAU,GAAG,IAAI,CAACpD,eAAe,EAAE;QACnCM,MAAM,CAACG,QAAQ,CAAC2C,UAAU,CAAC;MAC7B;MACA5F,WAAW,GAAG8C,MAAM;MACpB,IAAI,CAACnC,QAAQ,CAACtiB,OAAO,CAAColB,SAAS,GAAGX,MAAM;MACxC,IAAI,CAAC5iC,QAAQ,CAAC;QAAC8/B,WAAW,EAAE8C;MAAM,CAAC,CAAC;MAEpC9C,WAAW,CAAC+C,SAAS,EAAE,CAACn1C,OAAO,CAACo1C,KAAK,IAAI;QACvC9C,EAAE,CAAC+C,QAAQ,CAACD,KAAK,EAAEhD,WAAW,CAAC;MACjC,CAAC,CAAC;MAEF,IAAI4F,UAAU,EAAE;QACdA,UAAU,CAACxP,OAAO,GAAG,KAAK;QAC1BwP,UAAU,CAAC7E,IAAI,EAAE;QACjB+B,MAAM,CAACI,WAAW,CAAC0C,UAAU,CAAC;MAChC;IACF,CAAC,CAAC,CACD3yC,IAAI,CAACpI,CAAC,IAAI;MACT,OAAOq1C,EAAE,CAAC2F,YAAY,EAAE;IAC1B,CAAC,CAAC,CACD5yC,IAAI,CAAC6yC,MAAM,IAAI;MACd,OAAO5F,EAAE,CAACgF,mBAAmB,CAACY,MAAM,CAAC;IACvC,CAAC,CAAC,CACD7yC,IAAI,CAACpI,CAAC,IAAI;MACT,IAAI,CAAC+S,KAAK,CAACmoC,YAAY,CAAC,IAAI,CAACnoC,KAAK,CAAC9G,KAAK,EAAE,IAAI,CAAC8G,KAAK,CAACyZ,GAAG,EAAE6oB,EAAE,CAACkF,gBAAgB,CAACC,MAAM,EAAE,CAAC;MACvF,IAAI,CAACnlC,QAAQ,CAAC;QAAEogC,wBAAwB,EAAE;MAAK,CAAC,EAAEz1C,CAAC,IAAI,IAAI,CAACq2C,6BAA6B,EAAE,CAAC;IAC9F,CAAC,CAAC,CACD3tC,KAAK,CAAC,IAAI,CAACuuC,uBAAuB,CAAC;EACtC;EAGAM,kBAAkB,GAAG;IACnB,IAAI,CAAC,IAAI,CAAC7wC,KAAK,CAAC8uC,cAAc,EAAE;MAE9B,IAAI,CAAC4B,gBAAgB,EAAE;IACzB,CAAC,MAAM;MAGL,IAAI,CAAC/hC,QAAQ,CAAC;QAACmgC,cAAc,EAAE;MAAK,CAAC,CAAC;MAEtCrB,UAAU,CAAC7C,KAAK,EAAE;MAClB6C,UAAU,CAAC3D,WAAW,GAAG,CAAC;MAC1BsE,gBAAgB,CAACD,IAAI,GAAG,IAAI;MAC5BC,gBAAgB,CAACrL,IAAI,EAAE,CAAC/gC,KAAK,CAAC1I,CAAC,IAAI,CAAC,CAAC,CAAC;MACtC0vB,UAAU,CAAC1vB,CAAC,IAAI;QACd,IAAI,CAACo3C,gBAAgB,EAAE;MACzB,CAAC,EAAE,IAAI,CAAC;IACV;EACF;EAEAA,gBAAgB,GAAG;IACjB,IAAI,CAAClB,IAAI,EAAE;IACX,IAAI,CAACnjC,KAAK,CAACooC,QAAQ,CAAC,IAAI,CAACpoC,KAAK,CAAC9G,KAAK,EAAE,IAAI,CAAC8G,KAAK,CAACyZ,GAAG,CAAC;EACvD;EAGAirB,SAAS,GAAG;IACV,IAAI,CAAC,IAAI,CAAC/wC,KAAK,CAAC2uC,EAAE,IAAI,CAAC,IAAI,CAAC3uC,KAAK,CAAC4uC,WAAW,EAAE;MAC7C;IACF;IAEA,MAAM2C,MAAM,GAAG,IAAI,CAACvxC,KAAK,CAACyuC,WAAW;IACrC,MAAMiG,CAAC,GAAGnD,MAAM,CAACO,cAAc,EAAE,CAAC,CAAC,CAAC;IACpC4C,CAAC,CAAC7P,OAAO,GAAG,KAAK;IACjB6P,CAAC,CAAClF,IAAI,EAAE;IAER+B,MAAM,CAACI,WAAW,CAAC+C,CAAC,CAAC;IACrB,IAAI,CAAC10C,KAAK,CAAC4uC,WAAW,CAACmE,IAAI,CAACzE,iBAAiB,CAAC;IAC9C,IAAI,CAAC3/B,QAAQ,CAAC;MAACqgC,qBAAqB,EAAE;IAAK,CAAC,CAAC;EAC/C;EAEAgC,WAAW,GAAG;IACZ,IAAI,CAAC,IAAI,CAAChxC,KAAK,CAAC2uC,EAAE,IAAI,CAAC,IAAI,CAAC3uC,KAAK,CAAC4uC,WAAW,EAAE;MAC7C;IACF;IACAlpC,SAAS,CAACssC,YAAY,CAACC,YAAY,CAAC;MAAE/oB,KAAK,EAAE;IAAK,CAAC,CAAC,CACjDxnB,IAAI,CAAC6vC,MAAM,IAAI;MAGd,IAAI,CAACnC,QAAQ,CAACtiB,OAAO,CAAColB,SAAS,GAAG,IAAI;MACtC,MAAMyC,MAAM,GAAG,IAAI,CAAC30C,KAAK,CAAC2uC,EAAE,CAACiG,UAAU,EAAE,CAACC,IAAI,CAACpR,CAAC,IAAIA,CAAC,CAACgO,KAAK,CAAC92C,IAAI,IAAI,OAAO,CAAC;MAC5E,MAAM82C,KAAK,GAAGF,MAAM,CAACO,cAAc,EAAE,CAAC,CAAC,CAAC;MAExCP,MAAM,CAACI,WAAW,CAACF,KAAK,CAAC;MAEzB,IAAI,CAACzxC,KAAK,CAACyuC,WAAW,CAACiD,QAAQ,CAACD,KAAK,CAAC;MACtC,OAAOkD,MAAM,CAACG,YAAY,CAACrD,KAAK,CAAC;IACnC,CAAC,CAAC,CACD/vC,IAAI,CAACpI,CAAC,IAAI;MACT,IAAI,CAAC81C,QAAQ,CAACtiB,OAAO,CAAColB,SAAS,GAAG,IAAI,CAAClyC,KAAK,CAACyuC,WAAW;MACxD,IAAI,CAACzuC,KAAK,CAAC4uC,WAAW,CAACmE,IAAI,CAACxE,mBAAmB,CAAC;IAClD,CAAC,CAAC,CACDvsC,KAAK,CAACnK,GAAG,IAAI,IAAI,CAAC04C,uBAAuB,CAAC14C,GAAG,CAAC,CAAC,CAC/Csd,OAAO,CAAC7b,CAAC,IAAI;MAAE,IAAI,CAACqV,QAAQ,CAAC;QAACqgC,qBAAqB,EAAE;MAAK,CAAC,CAAC;IAAE,CAAC,CAAC;EACrE;EAEA2B,uBAAuB,GAAG;IACxB,IAAI,IAAI,CAAC3wC,KAAK,CAACgvC,qBAAqB,EAAE;MAEpC;IACF;IACA,MAAM8D,MAAM,GAAG,IAAI,CAAC9yC,KAAK,CAACyuC,WAAW,CAACqD,cAAc,EAAE;IACtD,IAAI,CAACnjC,QAAQ,CAAC;MAACqgC,qBAAqB,EAAE;IAAI,CAAC,EAAE11C,CAAC,IAAI;MAChD,IAAIw5C,MAAM,IAAIA,MAAM,CAACh6C,MAAM,GAAG,CAAC,IAAIg6C,MAAM,CAAC,CAAC,CAAC,CAACjO,OAAO,IAAIiO,MAAM,CAAC,CAAC,CAAC,CAACiC,UAAU,IAAI,MAAM,EAAE;QACtF,IAAI,CAAChE,SAAS,EAAE;MAClB,CAAC,MAAM;QACL,IAAI,CAACC,WAAW,EAAE;MACpB;MACA,IAAI,CAACriC,QAAQ,CAAC;QAACu4B,SAAS,EAAE,CAAC,IAAI,CAAClnC,KAAK,CAACknC;MAAS,CAAC,CAAC;IACnD,CAAC,CAAC;EACJ;EAEA0J,oBAAoB,GAAG;IACrB,MAAMW,MAAM,GAAG,IAAI,CAACvxC,KAAK,CAACyuC,WAAW;IACrC,MAAMiG,CAAC,GAAGnD,MAAM,CAACyD,cAAc,EAAE,CAAC,CAAC,CAAC;IACpCN,CAAC,CAAC7P,OAAO,GAAG,CAAC6P,CAAC,CAAC7P,OAAO;IAEtB,IAAI,CAAC5b,WAAW,EAAE;EACpB;EAEApc,MAAM,GAAG;IACP,MAAMooC,WAAW,GAAG,IAAI,CAACj1C,KAAK,CAACyuC,WAAW,IAAI,IAAI,CAACzuC,KAAK,CAACyuC,WAAW,CAACuG,cAAc,EAAE;IACrF,MAAME,WAAW,GAAG,CAAC,IAAI,CAACl1C,KAAK,CAACknC,SAAS,IAAI,IAAI,CAAClnC,KAAK,CAACyuC,WAAW,IAAI,IAAI,CAACzuC,KAAK,CAACyuC,WAAW,CAACqD,cAAc,EAAE;IAC9G,MAAMz8B,QAAQ,GAAG,CAAC,IAAI,CAACrV,KAAK,CAAC2uC,EAAE,IAAI,CAAC,IAAI,CAAC3uC,KAAK,CAAC4uC,WAAW,IAAI,EAAEqG,WAAW,IAAIA,WAAW,CAAC,CAAC,CAAC,CAAC;IAC9F,MAAME,SAAS,GAAGF,WAAW,IAAIA,WAAW,CAAC,CAAC,CAAC,IAAIA,WAAW,CAAC,CAAC,CAAC,CAACpQ,OAAO,GAAG,KAAK,GAAG,SAAS;IAC7F,MAAMuQ,SAAS,GAAGF,WAAW,IAAIA,WAAW,CAAC,CAAC,CAAC,IAAIA,WAAW,CAAC,CAAC,CAAC,CAACrQ,OAAO,IAAIqQ,WAAW,CAAC,CAAC,CAAC,CAACH,UAAU,IAAI,MAAM,GAAG,UAAU,GAAG,cAAc;IAC9I,MAAMM,SAAS,GAAGtpC,sDAAO,CAAC,IAAI,CAACM,KAAK,CAACnL,KAAK,EAAE/M,6DAAqB,CAAC;IAClE,MAAMmhD,cAAc,GAAG,IAAI,CAACt1C,KAAK,CAAC8uC,cAAc,GAAG,QAAQ,GAAG,EAAE;IAEhE,IAAIyG,YAAY,GAAG,KAAK;IACxB,IAAI,IAAI,CAAClG,SAAS,CAACviB,OAAO,IAAI,IAAI,CAACuiB,SAAS,CAACviB,OAAO,CAAColB,SAAS,IAAI,IAAI,CAAClyC,KAAK,CAACivC,eAAe,EAAE;MAC5F,MAAMuG,OAAO,GAAG,IAAI,CAACnG,SAAS,CAACviB,OAAO,CAAColB,SAAS;MAChD,IAAIsD,OAAO,CAAC1D,cAAc,EAAE,CAACh5C,MAAM,GAAG,CAAC,EAAE;QACvC,MAAM47C,CAAC,GAAGc,OAAO,CAAC1D,cAAc,EAAE,CAAC,CAAC,CAAC;QACrCyD,YAAY,GAAGb,CAAC,CAAC7P,OAAO,IAAI6P,CAAC,CAACK,UAAU,IAAI,MAAM;MACpD;IACF;IAEA,OACE,0HACE;MAAK,EAAE,EAAC;IAAiB,GACvB;MAAK,EAAE,EAAC;IAAuB,GAC7B;MAAK,SAAS,EAAC,iBAAiB;MAAC,QAAQ,EAAE,IAAI,CAAC/0C,KAAK,CAACknC;IAAU,GAC9D;MAAO,GAAG,EAAE,IAAI,CAACkI,QAAS;MAAC,QAAQ;MAAC,KAAK;MAAC,WAAW;IAAA,EAAG,EACxD;MAAK,SAAS,EAAC;IAAsB,GACnC,2DAAC,wDAAgB;MAAC,EAAE,mBAAkB;MACpC,cAAc;QAAA;QAAA;MAAA;IAAM,EAAmD,CACrE,CACF,EACN;MAAK,SAAS,EAAC,iBAAiB;MAAC,QAAQ,EAAE,CAACmG;IAAa,GACtDA,YAAY,GACX,0HACE;MAAO,GAAG,EAAE,IAAI,CAAClG,SAAU;MAAC,QAAQ;MAAC,WAAW;IAAA,EAAG,EACnD;MAAK,SAAS,EAAC;IAAsB,GAAEgG,SAAS,CAAO,CACtD,GACH,0HACE;MAAO,GAAG,EAAE,IAAI,CAAChG,SAAU;MAAC,QAAQ;IAAA,EAAG,EACvC;MAAK,SAAS,EAAG,cAAaiG,cAAe;IAAE,GAC7C;MAAK,SAAS,EAAC;IAAY,GACzB,2DAAC,wDAAU;MACT,MAAM,EAAE,IAAI,CAACjpC,KAAK,CAACqB,MAAO;MAC1B,MAAM,EAAE,IAAI,CAACrB,KAAK,CAACmE,MAAO;MAC1B,KAAK,EAAE,IAAI,CAACnE,KAAK,CAAC9G,KAAM;MACxB,KAAK,EAAE,IAAI,CAAC8G,KAAK,CAACnL;IAAM,EAAG,CACzB,EACN;MAAK,SAAS,EAAC;IAAa,GAAEm0C,SAAS,CAAO,CAC1C,CACL,CAED,CACF,EACN;MAAK,SAAS,EAAC;IAAU,GACvB;MAAQ,SAAS,EAAC,QAAQ;MAAC,OAAO,EAAE,IAAI,CAAC3E;IAAiB,GACxD;MAAG,SAAS,EAAC;IAAgB,GAAC,UAAQ,CAAI,CACnC,EACT;MAAQ,SAAS,EAAC,WAAW;MAAC,OAAO,EAAE,IAAI,CAACC,uBAAwB;MAAC,QAAQ,EAAEt7B;IAAS,GACtF;MAAG,SAAS,EAAC;IAAgB,GAAE+/B,SAAS,CAAK,CACtC,EACT;MAAQ,SAAS,EAAC,WAAW;MAAC,OAAO,EAAE,IAAI,CAACxE,oBAAqB;MAAC,QAAQ,EAAEv7B;IAAS,GACnF;MAAG,SAAS,EAAC;IAAgB,GAAE8/B,SAAS,CAAK,CACtC,CACL,CACF,CACL;EAEP;AACF;AAAC;AAED,iEAAejoC,sDAAU,CAACgR,SAAS,CAAC;;;;;;;;;;;;;;;;;;;ACjoBV;AACoB;AAEM;AAKrC,MAAM/gB,UAAU,SAASL,4DAAmB,CAAC;EAC1D+P,MAAM,GAAG;IACP,MAAMmhC,aAAa,GAAG,CAAC,UAAU,EAAE,cAAc,EAAE,QAAQ,CAAC,CAACr1C,QAAQ,CAAC,IAAI,CAAC0T,KAAK,CAACtM,SAAS,CAAC;IAC3F,MAAM01C,KAAK,GAAG,IAAI,CAACppC,KAAK,CAACpM,QAAQ,GAC9B+tC,aAAa,GAAG,aAAa,GAAG,eAAe,GAC/CA,aAAa,GAAG,sBAAsB,GAAG,WAAY;IACxD,IAAIhvC,QAAQ;IACZ,IAAIgvC,aAAa,EAAE;MACjB,QAAQ,IAAI,CAAC3hC,KAAK,CAACtM,SAAS;QAC1B,KAAK,UAAU;UACbf,QAAQ,GAAG,2DAAC,wDAAgB;YAAC,EAAE,iBAAgB;YAAC,cAAc;cAAA;cAAA;YAAA;UAAW,EAAyC;UAClH;QACF,KAAK,QAAQ;UACXA,QAAQ,GAAG,IAAI,CAACqN,KAAK,CAACpM,QAAQ,GAC5B,2DAAC,wDAAgB;YAAC,EAAE,eAAc;YAAC,cAAc;cAAA;cAAA;YAAA;UAAS,EAAgD,GAC1G,2DAAC,wDAAgB;YAAC,EAAE,kBAAiB;YAAC,cAAc;cAAA;cAAA;YAAA;UAAY,EAAmD;UACrH;QACF;UACEjB,QAAQ,GAAG,2DAAC,wDAAgB;YAAC,EAAE,qBAAoB;YAAC,cAAc;cAAA;cAAA;YAAA;UAAe,EAA6C;UAC9H;MAAM;IAEZ,CAAC,MAAM,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC,CAACrG,QAAQ,CAAC,IAAI,CAAC0T,KAAK,CAACtM,SAAS,CAAC,IAAI,CAAC,IAAI,CAACsM,KAAK,CAACrN,QAAQ,EAAE;MACzFA,QAAQ,GAAG,2DAAC,wDAAgB;QAAC,EAAE,oBAAmB;QAAC,cAAc;UAAA;UAAA;QAAA;MAAc,EAA4C;IAC7H,CAAC,MAAM;MACLA,QAAQ,GAAG,yEAAOxB,gEAAa,CAAC,IAAI,CAAC6O,KAAK,CAACrN,QAAQ,GAAG,IAAI,CAAC,CAAQ;IACrE;IACA,OACE,0HACE;MAAK,SAAS,EAAC;IAAmB,GAChC;MAAG,SAAS,EAAC;IAAgB,GAAC,MAAI,CAAI;MAAG,SAAS,EAAC;IAAuB,GAAEy2C,KAAK,CAAK,CAClF,KAAC,EAACz2C,QAAQ,CACf;EAEP;AACF;AAAC;;;;;;;;;;;;;;;;;;;;;;;;;;ACzCyB;AACgC;AACd;AAEF;AACC;AACO;AAEG;AACP;AAE9C,MAAM22C,eAAe,SAAS74C,4DAAmB,CAAC;EAChDsP,WAAW,CAACC,KAAK,EAAE;IACjB,KAAK,CAACA,KAAK,CAAC;IAEZ,IAAI,CAACrM,KAAK,GAAG;MACXyoC,QAAQ,EAAE;IACZ,CAAC;IAED,IAAIp8B,KAAK,CAAC2I,QAAQ,EAAE;MAClB3I,KAAK,CAAC2I,QAAQ,CAAC4gC,UAAU,GAAG,IAAI,CAACC,cAAc,CAACtpC,IAAI,CAAC,IAAI,CAAC;IAC5D;IAEA,IAAI,CAACupC,iBAAiB,GAAG,IAAI,CAACA,iBAAiB,CAACvpC,IAAI,CAAC,IAAI,CAAC;IAC1D,IAAI,CAACwpC,eAAe,GAAG,IAAI,CAACA,eAAe,CAACxpC,IAAI,CAAC,IAAI,CAAC;IACtD,IAAI,CAACypC,qBAAqB,GAAG,IAAI,CAACA,qBAAqB,CAACzpC,IAAI,CAAC,IAAI,CAAC;IAClE,IAAI,CAAC6U,kBAAkB,GAAG,IAAI,CAACA,kBAAkB,CAAC7U,IAAI,CAAC,IAAI,CAAC;IAC5D,IAAI,CAACmV,kBAAkB,GAAG,IAAI,CAACA,kBAAkB,CAACnV,IAAI,CAAC,IAAI,CAAC;IAC5D,IAAI,CAAC2V,gBAAgB,GAAG,IAAI,CAACA,gBAAgB,CAAC3V,IAAI,CAAC,IAAI,CAAC;IAExD,IAAI,CAAC0pC,gBAAgB,GAAG;MACtB31C,aAAa,EAAE+L,KAAK,CAACgD,IAAI,CAAC/O,aAAa,CAACiM,IAAI,CAACF,KAAK,CAACgD,IAAI,CAAC;MACxD7O,aAAa,EAAE6L,KAAK,CAAC7L,aAAa;MAClCzB,YAAY,EAAEsN,KAAK,CAACqB,MAAM,CAAC3O,YAAY,CAACwN,IAAI,CAACF,KAAK,CAACqB,MAAM,CAAC;MAE1D5M,cAAc,EAAE,IAAI,CAACg1C,iBAAiB;MACtC/0C,cAAc,EAAE,IAAI,CAACg1C,eAAe;MACpCx2C,iBAAiB,EAAE,IAAI,CAACy2C,qBAAqB;MAC7Cl2C,YAAY,EAAE,IAAI,CAACoiB;IACrB,CAAC;EACH;EAEA4zB,iBAAiB,CAAC3mC,CAAC,EAAE;IACnBA,CAAC,CAACC,cAAc,EAAE;IAClB,IAAI,CAAC/C,KAAK,CAAC6pC,aAAa,CAAC;MACvBzxC,GAAG,EAAE0K,CAAC,CAACyF,MAAM,CAAC1c,GAAG;MACjBiQ,QAAQ,EAAEgH,CAAC,CAACyF,MAAM,CAACoc,OAAO,CAACh4B,IAAI;MAC/BpD,KAAK,EAAEuZ,CAAC,CAACyF,MAAM,CAACoc,OAAO,CAACp7B,KAAK;MAC7BC,MAAM,EAAEsZ,CAAC,CAACyF,MAAM,CAACoc,OAAO,CAACn7B,MAAM;MAC/BO,IAAI,EAAE+Y,CAAC,CAACyF,MAAM,CAACoc,OAAO,CAAC56B,IAAI;MAC3BZ,IAAI,EAAE2Z,CAAC,CAACyF,MAAM,CAACoc,OAAO,CAACv7B;IACzB,CAAC,CAAC;EACJ;EAEAsgD,eAAe,CAAC5mC,CAAC,EAAE;IACjBA,CAAC,CAACC,cAAc,EAAE;IAClB,IAAI,CAAC/C,KAAK,CAAC6pC,aAAa,CAAC;MACvBhtB,KAAK,EAAE,IAAI;MACXzkB,GAAG,EAAE0K,CAAC,CAACyF,MAAM,CAACoc,OAAO,CAAC94B,GAAG;MACzBgH,OAAO,EAAEiQ,CAAC,CAACyF,MAAM,CAAC1c,GAAG;MACrBiQ,QAAQ,EAAEgH,CAAC,CAACyF,MAAM,CAACoc,OAAO,CAACh4B,IAAI;MAC/BpD,KAAK,EAAEuZ,CAAC,CAACyF,MAAM,CAACoc,OAAO,CAACp7B,KAAK;MAC7BC,MAAM,EAAEsZ,CAAC,CAACyF,MAAM,CAACoc,OAAO,CAACn7B,MAAM;MAC/BmJ,QAAQ,EAAEmQ,CAAC,CAACyF,MAAM,CAACoc,OAAO,CAAChyB,QAAQ;MACnC5I,IAAI,EAAE+Y,CAAC,CAACyF,MAAM,CAACoc,OAAO,CAAC56B,IAAI;MAC3BZ,IAAI,EAAE2Z,CAAC,CAACyF,MAAM,CAACoc,OAAO,CAACv7B;IACzB,CAAC,CAAC;EACJ;EAEAugD,qBAAqB,CAAC7mC,CAAC,EAAE;IACvBA,CAAC,CAACC,cAAc,EAAE;IAClB,MAAM7Z,IAAI,GAAG;MACXuwB,GAAG,EAAE,IAAI,CAACzZ,KAAK,CAACyZ;IAClB,CAAC;IACDvwB,IAAI,CAAC+zB,IAAI,GAAG,CAAC,CAAC;IACd,IAAIna,CAAC,CAACyF,MAAM,CAACoc,OAAO,CAACh4B,IAAI,EAAE;MACzBzD,IAAI,CAAC+zB,IAAI,CAACna,CAAC,CAACyF,MAAM,CAACoc,OAAO,CAACh4B,IAAI,CAAC,GAAGmW,CAAC,CAACyF,MAAM,CAACoc,OAAO,CAACnxB,GAAG,GAAGsP,CAAC,CAACyF,MAAM,CAACoc,OAAO,CAACnxB,GAAG,GAC5EsP,CAAC,CAACyF,MAAM,CAACoc,OAAO,CAACnxB,GAAG,KAAKZ,SAAS,GAAG,CAAC,GAAG,EAAE,GAAGkQ,CAAC,CAACyF,MAAM,CAACoc,OAAO,CAACnxB,GAAG;IACtE;IACA,IAAIsP,CAAC,CAACyF,MAAM,CAACoc,OAAO,CAACmlB,GAAG,IAAI,KAAK,EAAE;MACjC5gD,IAAI,CAACD,GAAG,GAAGsV,0DAAW,CAACuE,CAAC,CAACyF,MAAM,CAACoc,OAAO,CAAC17B,GAAG,CAAC,IAAI,aAAa;IAC/D;IACA,MAAM6zB,IAAI,GAAGha,CAAC,CAACyF,MAAM,CAACoc,OAAO,CAAC9vB,KAAK,IAAI,SAAS;IAChD,IAAI,CAACmL,KAAK,CAAC+pC,cAAc,CAACjnC,CAAC,CAACyF,MAAM,CAACoc,OAAO,CAACmlB,GAAG,EAAEhtB,IAAI,EAAE5zB,IAAI,CAAC;EAC7D;EAEA6rB,kBAAkB,CAACjS,CAAC,EAAE;IACpBA,CAAC,CAACC,cAAc,EAAE;IAClBD,CAAC,CAACua,eAAe,EAAE;IACnB,MAAMpN,SAAS,GAAG,EAAE;IACpB,IAAI,IAAI,CAACjQ,KAAK,CAACjB,QAAQ,IAAIpC,oEAA4B,EAAE;MACvDsT,SAAS,CAACzf,IAAI,CAAC,sBAAsB,CAAC;IACxC;IACA,IAAI,IAAI,CAACwP,KAAK,CAACgqC,YAAY,IAAI,IAAI,CAAChqC,KAAK,CAACjB,QAAQ,GAAGpC,oEAA4B,EAAE;MACjFsT,SAAS,CAACzf,IAAI,CAAC,iBAAiB,CAAC;MACjC,IAAI,CAAC,IAAI,CAACwP,KAAK,CAAC43B,QAAQ,EAAE;QACxB,IAAIqS,SAAS,GAAG,KAAK;QACrBt5C,uDAAe,CAAC,IAAI,CAACqP,KAAK,CAACwZ,OAAO,EAAE,CAAC2wB,EAAE,EAAEC,EAAE,EAAEC,EAAE,KAAK;UAClDJ,SAAS,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC39C,QAAQ,CAAC+9C,EAAE,CAAC;UAC7D,OAAOJ,SAAS;QAClB,CAAC,CAAC;QACF,IAAI,CAACA,SAAS,EAAE;UACdt5C,qDAAa,CAAC,IAAI,CAACqP,KAAK,CAACwZ,OAAO,EAAE6wB,EAAE,IAAI;YACtCJ,SAAS,GAAG,CAAC,IAAI,CAAC,CAAC39C,QAAQ,CAAC+9C,EAAE,CAAC;YAC/B,OAAOJ,SAAS;UAClB,CAAC,CAAC;QACJ;QACA,IAAI,CAACA,SAAS,EAAE;UACdh6B,SAAS,CAACzf,IAAI,CAAC,gBAAgB,CAAC;QAClC;MACF;IACF;IACAyf,SAAS,CAACzf,IAAI,CAAC,mBAAmB,CAAC;IAEnC,IAAI,CAACwP,KAAK,CAAC4G,eAAe,CAAC;MACzB6S,GAAG,EAAE,IAAI,CAACzZ,KAAK,CAACyZ,GAAG;MACnBvqB,OAAO,EAAE,IAAI,CAAC8Q,KAAK,CAACuqC,MAAM,GAAG3nB,QAAQ,CAAC,IAAI,CAAC5iB,KAAK,CAACuqC,MAAM,CAAC98C,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;MAC1E+rB,OAAO,EAAE,IAAI,CAACxZ,KAAK,CAACwZ,OAAO;MAC3BiE,QAAQ,EAAE,IAAI,CAACzd,KAAK,CAACyd,QAAQ;MAC7BC,QAAQ,EAAE,IAAI,CAAC1d,KAAK,CAAC0d,QAAQ;MAC7BtN,CAAC,EAAEtN,CAAC,CAACwa,KAAK;MACVnN,CAAC,EAAErN,CAAC,CAACya,KAAK;MACVitB,SAAS,EAAE,IAAI,CAACxqC,KAAK,CAACwqC,SAAS;MAC/BC,WAAW,EAAE,IAAI,CAACzqC,KAAK,CAACyqC;IAC1B,CAAC,EAAEx6B,SAAS,CAAC;EACf;EAEAu5B,cAAc,CAACkB,KAAK,EAAE;IACpB,IAAI,CAACpoC,QAAQ,CAAC;MAAC85B,QAAQ,EAAEsO;IAAK,CAAC,CAAC;EAClC;EAEAr1B,kBAAkB,GAAG;IACnB,IAAI,CAACrV,KAAK,CAAC08B,cAAc,CAAC,IAAI,CAAC18B,KAAK,CAACyZ,GAAG,EAAE,IAAI,CAACzZ,KAAK,CAAC2I,QAAQ,CAAC;EAChE;EAEAkN,gBAAgB,CAAC/S,CAAC,EAAE;IAClBA,CAAC,CAACC,cAAc,EAAE;IAClBD,CAAC,CAACua,eAAe,EAAE;IACnB,MAAMmD,UAAU,GAAG,IAAI,CAACxgB,KAAK,CAACwgB,UAAU;IACxC,IAAIA,UAAU,EAAE;MACd,IAAI,CAACxgB,KAAK,CAACvM,YAAY,CAAC+sB,UAAU,CAAC;IACrC;EACF;EAEAhgB,MAAM,GAAG;IACP,MAAMmqC,SAAS,GAAG,IAAI,CAAC3qC,KAAK,CAACuiB,QAAQ,GAAG,GAAG,IAAI,IAAI,CAACviB,KAAK,CAAC43B,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAC;IACtF,MAAMgT,WAAW,GAAI,IAAI,CAAC5qC,KAAK,CAACuiB,QAAQ,IAAI,QAAQ,IAAI,IAAI,CAACviB,KAAK,CAACuiB,QAAQ,IAAI,MAAM,GAAI,YAAY,GAAG,QAAQ;IAChH,MAAMpe,MAAM,GAAG,IAAI,CAACnE,KAAK,CAACiP,UAAU,IAAI,IAAI;IAC5C,MAAM47B,WAAW,GAAI,IAAI,CAAC7qC,KAAK,CAAC8qC,OAAO,IAAI,IAAI,CAAC9qC,KAAK,CAAC43B,QAAQ,KAC3D,IAAI,CAAC53B,KAAK,CAACuiB,QAAQ,IAAI,QAAQ,IAAI,IAAI,CAACviB,KAAK,CAACuiB,QAAQ,IAAI,MAAM,CAAE;IAErE,IAAI/I,OAAO,GAAG,IAAI,CAACxZ,KAAK,CAACwZ,OAAO;IAChC,MAAM6e,WAAW,GAAG,EAAE;IACtB,IAAI,IAAI,CAACr4B,KAAK,CAACnC,QAAQ,IAAIlN,6DAAqB,EAAE,IAAIA,sDAAc,CAAC6oB,OAAO,CAAC,EAAE;MAC7E7oB,0DAAkB,CAAC6oB,OAAO,EAAE,CAACwxB,GAAG,EAAE58C,CAAC,KAAK;QACtC,IAAI48C,GAAG,CAAC5hD,IAAI,IAAI,kBAAkB,EAAE;UAGlC;QACF;QACAivC,WAAW,CAAC7nC,IAAI,CAAC,2DAAC,uDAAU;UAC1B,MAAM,EAAE,IAAI,CAACwP,KAAK,CAACqB,MAAO;UAC1B,WAAW,EAAE1Q,6DAAqB,CAACq6C,GAAG,CAAE;UACxC,QAAQ,EAAEA,GAAG,CAACr+C,IAAK;UACnB,SAAS,EAAEgE,2DAAmB,CAACq6C,GAAG,CAAE;UACpC,QAAQ,EAAEA,GAAG,CAAC5hD,IAAK;UACnB,IAAI,EAAEuH,4DAAoB,CAACq6C,GAAG,CAAE;UAChC,QAAQ,EAAE,IAAI,CAACr3C,KAAK,CAACyoC,QAAS;UAC9B,cAAc,EAAE,IAAI,CAAC/mB,kBAAmB;UACxC,OAAO,EAAE,IAAI,CAACrV,KAAK,CAAChS,OAAQ;UAC5B,GAAG,EAAEI;QAAE,EAAG,CAAC;MACf,CAAC,EAAE,IAAI,CAAC;MACR,MAAM+8C,IAAI,GAAGx6C,qDAAa,CAAC6oB,OAAO,EAAEznB,6DAAa,EAAE,IAAI,CAAC63C,gBAAgB,CAAC;MACzEpwB,OAAO,GAAG/oB,0DAAmB,CAACA,uDAAc,EAAE,IAAI,EAAE06C,IAAI,CAAC;IAC3D,CAAC,MAAM,IAAI,OAAO3xB,OAAO,IAAI,QAAQ,EAAE;MACrCA,OAAO,GAAG,0HAAE;QAAG,SAAS,EAAC;MAAqB,GAAC,eAAa,CAAI,KAAC;QAAG,SAAS,EAAC;MAAM,GAClF,2DAAC,wDAAgB;QAAC,EAAE,mBAAkB;QACpC,cAAc;UAAA;UAAA;QAAA;MAAkB,EAAsD,CAAI,CAAG;IACnG;IAEA,OACE;MAAI,GAAG,EAAE,IAAI,CAACxZ,KAAK,CAACorC,QAAS;MAAC,SAAS,EAAET;IAAU,GAChD,IAAI,CAAC3qC,KAAK,CAAC8qC,OAAO,IAAI,IAAI,CAAC9qC,KAAK,CAAC43B,QAAQ,GACxC;MAAK,SAAS,EAAC;IAAY,GACxBiT,WAAW,GACV,2DAAC,wDAAU;MACT,MAAM,EAAE,IAAI,CAAC7qC,KAAK,CAACqB,MAAO;MAC1B,KAAK,EAAE,IAAI,CAACrB,KAAK,CAACyd,QAAS;MAC3B,KAAK,EAAE,IAAI,CAACzd,KAAK,CAAC0d,QAAS;MAC3B,MAAM,EAAEvZ;IAAO,EAAG,GACpB,IAAI,CACF,GACN,IAAI,EACN,wEACE;MAAK,SAAS,EAAEymC;IAAY,GAC1B;MAAK,SAAS,EAAC;IAAc,GAC3B;MAAK,SAAS,EAAC;IAAiB,GAC7BpxB,OAAO,EACP6e,WAAW,CACR,EACL,IAAI,CAACr4B,KAAK,CAACqrC,SAAS,GACnB,2DAAC,4DAAc;MACb,MAAM,EAAE,IAAI,CAACrrC,KAAK,CAACuqC,MAAO;MAC1B,SAAS,EAAE,IAAI,CAACvqC,KAAK,CAACqrC,SAAU;MAChC,QAAQ,EAAE,IAAI,CAACrrC,KAAK,CAACjB;IAAS,EAAG,GACjC,IAAI,CACJ,EACL,IAAI,CAACiB,KAAK,CAAC4G,eAAe,GACzB;MAAM,SAAS,EAAC;IAAa,GAC3B;MAAG,IAAI,EAAC,GAAG;MAAC,OAAO,EAAE,IAAI,CAACmO;IAAmB,GAC3C;MAAG,SAAS,EAAC;IAAgB,GAAC,aAAW,CAAI,CAC3C,CACC,GAAG,IAAI,CAEZ,EACL81B,WAAW,GACV;MAAK,SAAS,EAAC;IAAQ,GACpB,IAAI,CAAC7qC,KAAK,CAAC0d,QAAQ,IAClB,sEAAG,2DAAC,wDAAgB;MAAC,EAAE,kBAAiB;MAAC,cAAc;QAAA;QAAA;MAAA;IAAY,EACQ,CAAI,CAE7E,GACJ,IAAI,CAEJ,CACH;EAET;AACF;AAAC;AAED,MAAM4tB,eAAe,GAAGzqC,sDAAU,CAACyoC,eAAe,CAAC;AACnD,MAAMx3B,WAAW,GAAGrhB,uDAAgB,CAAC,CAACuP,KAAK,EAAE/W,GAAG,KAAK,2DAAC,eAAe;EAAC,QAAQ,EAAIA;AAAI,GAAK+W,KAAK,EAAI,CAAC;AAErG,iEAAe8R,WAAW;;;;;;;;;;;;;;;;AC3OA;AAGX,MAAMlS,QAAQ,SAASnP,4DAAmB,CAAC;EACxDsP,WAAW,CAACC,KAAK,EAAE;IACjB,KAAK,CAACA,KAAK,CAAC;IAEZ,IAAI,CAAC47B,YAAY,GAAG,IAAI,CAACA,YAAY,CAAC17B,IAAI,CAAC,IAAI,CAAC;EAClD;EAEA07B,YAAY,GAAG;IACb,IAAI,CAAC57B,KAAK,CAACwrC,QAAQ,CAAC,IAAI,CAACxrC,KAAK,CAACrT,IAAI,EAAE,CAAC,IAAI,CAACqT,KAAK,CAACI,OAAO,CAAC;EAC3D;EAEAI,MAAM,GAAG;IACP,IAAIqgB,SAAS,GAAG,CAAC,gBAAgB,CAAC;IAClC,IAAI4qB,QAAQ;IACZ,IAAI37C,KAAK,CAACC,OAAO,CAAC,IAAI,CAACiQ,KAAK,CAACjN,SAAS,CAAC,EAAE;MACvC8tB,SAAS,CAACrwB,IAAI,CAAC,GAAG,IAAI,CAACwP,KAAK,CAACjN,SAAS,CAAC;IACzC,CAAC,MAAM,IAAI,IAAI,CAACiN,KAAK,CAACjN,SAAS,EAAE;MAC/B8tB,SAAS,CAACrwB,IAAI,CAAC,IAAI,CAACwP,KAAK,CAACjN,SAAS,CAAC;IACtC;IACA,IAAI,IAAI,CAACiN,KAAK,CAACwrC,QAAQ,EAAE;MACvB,IAAI,IAAI,CAACxrC,KAAK,CAACI,OAAO,EAAE;QACtBygB,SAAS,CAACrwB,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC;QACnCi7C,QAAQ,GAAG,WAAW;MACxB,CAAC,MAAM,IAAI,IAAI,CAACzrC,KAAK,CAACI,OAAO,KAAK,KAAK,EAAE;QACvCygB,SAAS,CAACrwB,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC;QACnCi7C,QAAQ,GAAG,yBAAyB;MACtC,CAAC,MAAM;QACL5qB,SAAS,CAACrwB,IAAI,CAAC,SAAS,CAAC;QACzBi7C,QAAQ,GAAG,yBAAyB;MACtC;IACF,CAAC,MAAM;MACH,IAAI,IAAI,CAACzrC,KAAK,CAACI,OAAO,EAAE;QACtBqrC,QAAQ,GAAG,WAAW;MACxB,CAAC,MAAM;QACLA,QAAQ,GAAG,yBAAyB;MACtC;IACJ;IACA,IAAIC,KAAK,GAAG;MACV34C,SAAS,EAAE8tB,SAAS,CAACttB,IAAI,CAAC,GAAG,CAAC;MAC9B9B,EAAE,EAAE,IAAI,CAACuO,KAAK,CAACvO;IACjB,CAAC;IACD,IAAI,IAAI,CAACuO,KAAK,CAACwrC,QAAQ,EAAE;MACvBE,KAAK,CAACz4C,OAAO,GAAG,IAAI,CAAC2oC,YAAY;IACnC;IACA,OAAOnrC,0DAAmB,CAAC,GAAG,EAAEi7C,KAAK,EAAED,QAAQ,CAAC;EAClD;AACF;;;;;;;;;;;;;;;;;;ACjD0B;AAEI;AAEwB;AAGvC,MAAMG,SAAS,SAASn7C,wDAAe,CAAC;EACrDsP,WAAW,CAACC,KAAK,EAAE;IACjB,KAAK,CAACA,KAAK,CAAC;IAEZ,IAAI,CAACrM,KAAK,GAAGi4C,SAAS,CAACrmC,oBAAoB,CAACvF,KAAK,CAAC;IAClD,IAAI,CAACrM,KAAK,CAACk4C,KAAK,GAAG,EAAE;IACrB,IAAI,CAACl4C,KAAK,CAACm4C,OAAO,GAAG,KAAK;IAE1B,IAAI,CAACC,eAAe,GAAG,IAAI,CAACA,eAAe,CAAC7rC,IAAI,CAAC,IAAI,CAAC;IACtD,IAAI,CAAC8rC,YAAY,GAAG,IAAI,CAACA,YAAY,CAAC9rC,IAAI,CAAC,IAAI,CAAC;IAChD,IAAI,CAAC+rC,gBAAgB,GAAG,IAAI,CAACA,gBAAgB,CAAC/rC,IAAI,CAAC,IAAI,CAAC;IACxD,IAAI,CAACgsC,iBAAiB,GAAG,IAAI,CAACA,iBAAiB,CAAChsC,IAAI,CAAC,IAAI,CAAC;IAC1D,IAAI,CAACisC,eAAe,GAAG,IAAI,CAACA,eAAe,CAACjsC,IAAI,CAAC,IAAI,CAAC;IACtD,IAAI,CAACksC,aAAa,GAAG,IAAI,CAACA,aAAa,CAAClsC,IAAI,CAAC,IAAI,CAAC;EACpD;EAEA,OAAOqF,oBAAoB,CAACvF,KAAK,EAAE;IACjC,OAAO;MACLkmB,WAAW,EAAElmB,KAAK,CAACqsC,KAAK,GAAG,EAAE,GAAGrsC,KAAK,CAACssC,MAAM;MAC5CC,WAAW,EAAEX,SAAS,CAACY,SAAS,CAACxsC,KAAK,CAACqsC,KAAK,EAAErsC,KAAK,CAACysC,aAAa,CAAC;MAClEC,SAAS,EAAEd,SAAS,CAACe,UAAU,CAAC3sC,KAAK,CAACqsC,KAAK;IAC7C,CAAC;EACH;EAEAlmC,kBAAkB,CAACC,SAAS,EAAEC,SAAS,EAAE;IACvC,IAAID,SAAS,CAACimC,KAAK,IAAI,IAAI,CAACrsC,KAAK,CAACqsC,KAAK,IACrCjmC,SAAS,CAACqmC,aAAa,IAAI,IAAI,CAACzsC,KAAK,CAACysC,aAAa,IACnDrmC,SAAS,CAACkmC,MAAM,IAAI,IAAI,CAACtsC,KAAK,CAACssC,MAAM,EAAE;MACvC,IAAI,CAAChqC,QAAQ,CAACspC,SAAS,CAACrmC,oBAAoB,CAAC,IAAI,CAACvF,KAAK,CAAC,CAAC;IAC3D;IACA,IAAI,CAACqG,SAAS,IAAI,IAAI,CAACrG,KAAK,CAACqsC,KAAK,CAAC5/C,MAAM,GAAG4Z,SAAS,CAACkmC,WAAW,CAAC9/C,MAAM,EAAE;MACxE,IAAI,CAAC6V,QAAQ,CAAC;QAACupC,KAAK,EAAE;MAAE,CAAC,CAAC;IAC5B;EACF;EAGA,OAAOc,UAAU,CAACN,KAAK,EAAE;IACvB,MAAMO,KAAK,GAAG,CAAC,CAAC;IAChB,IAAIlxC,KAAK,GAAG,CAAC;IACb2wC,KAAK,CAACh5C,GAAG,CAAEhF,IAAI,IAAK;MAClBu+C,KAAK,CAACv+C,IAAI,CAAC8gB,IAAI,CAAC,GAAGzT,KAAK;MACxBA,KAAK,EAAG;IACV,CAAC,CAAC;IACF,OAAOkxC,KAAK;EACd;EAGA,OAAOJ,SAAS,CAACH,KAAK,EAAEQ,IAAI,EAAE;IAC5B,MAAMC,QAAQ,GAAG,EAAE;IACnB,MAAMC,MAAM,GAAG,EAAE;IACjBV,KAAK,CAACh5C,GAAG,CAAEhF,IAAI,IAAK;MAClB,IAAIw+C,IAAI,IAAIA,IAAI,CAACvgD,QAAQ,CAAC+B,IAAI,CAAC8gB,IAAI,CAAC,EAAE;QACpC29B,QAAQ,CAACt8C,IAAI,CAACnC,IAAI,CAAC;MACrB,CAAC,MAAM;QACL0+C,MAAM,CAACv8C,IAAI,CAACnC,IAAI,CAAC;MACnB;IACF,CAAC,CAAC;IACF,OAAOy+C,QAAQ,CAAC54C,MAAM,CAAC64C,MAAM,CAAC;EAChC;EAEAhB,eAAe,CAACjpC,CAAC,EAAE;IACjB,IAAI,CAACR,QAAQ,CAAC;MAACupC,KAAK,EAAE/oC,CAAC,CAACyF,MAAM,CAAC3R;IAAK,CAAC,CAAC;IACtC,IAAI,IAAI,CAACoJ,KAAK,CAACgtC,UAAU,EAAE;MACzB,IAAI,CAAChtC,KAAK,CAACgtC,UAAU,CAAClqC,CAAC,CAACyF,MAAM,CAAC3R,KAAK,CAAC;IACvC;EACF;EAEAo1C,YAAY,CAACxhD,GAAG,EAAE;IAChB,MAAMolB,OAAO,GAAG,IAAI,CAACjc,KAAK,CAAC44C,WAAW,CAAC/hD,GAAG,CAAC;IAC3C,IAAI,CAACwV,KAAK,CAACitC,aAAa,CAACr9B,OAAO,CAACT,IAAI,EAAE,IAAI,CAACxb,KAAK,CAAC+4C,SAAS,CAAC98B,OAAO,CAACT,IAAI,CAAC,CAAC;EAC5E;EAEA88B,gBAAgB,CAAC59C,IAAI,EAAE7D,GAAG,EAAE;IAC1B,IAAI,CAACwhD,YAAY,CAACxhD,GAAG,CAAC;EACxB;EAEA0hD,iBAAiB,GAAG;IAClB,IAAI,CAAC5pC,QAAQ,CAAC;MAACwpC,OAAO,EAAE;IAAI,CAAC,CAAC;EAChC;EAEAK,eAAe,GAAG;IAChB,IAAI,CAAC7pC,QAAQ,CAAC;MAACwpC,OAAO,EAAE;IAAK,CAAC,CAAC;IAC/B,IAAI,IAAI,CAAC9rC,KAAK,CAACktC,WAAW,EAAE;MAC1B,IAAI,CAACltC,KAAK,CAACktC,WAAW,CAAC,IAAI,CAACv5C,KAAK,CAACk4C,KAAK,CAAC;IAC1C;EACF;EAEAO,aAAa,CAACtpC,CAAC,EAAE;IACf,IAAIA,CAAC,CAAC5Q,GAAG,KAAK,WAAW,EAAE;MACzB,IAAI,IAAI,CAACyB,KAAK,CAACk4C,KAAK,CAACp/C,MAAM,IAAI,CAAC,IAAI,IAAI,CAACkH,KAAK,CAAC44C,WAAW,CAAC9/C,MAAM,GAAG,CAAC,EAAE;QACrE,MAAM9B,EAAE,GAAG,IAAI,CAACgJ,KAAK,CAAC44C,WAAW,CAAC9/C,MAAM,GAAG,CAAC;QAC5C,IAAI,IAAI,CAACkH,KAAK,CAAC44C,WAAW,CAAC5hD,EAAE,CAAC,CAACwkB,IAAI,KAAK,IAAI,CAACnP,KAAK,CAACysC,aAAa,EAAE;UAChE,IAAI,CAACT,YAAY,CAACrhD,EAAE,CAAC;QACvB;MACF;IACF,CAAC,MAAM,IAAImY,CAAC,CAAC5Q,GAAG,KAAK,OAAO,EAAE;MAC5B,IAAI,IAAI,CAAC8N,KAAK,CAACmtC,OAAO,EAAE;QACtB,IAAI,CAACntC,KAAK,CAACmtC,OAAO,CAAC,IAAI,CAACx5C,KAAK,CAACk4C,KAAK,CAAC;MACtC;IACF,CAAC,MAAM,IAAI/oC,CAAC,CAAC5Q,GAAG,KAAK,QAAQ,EAAE;MAC7B,IAAI,IAAI,CAAC8N,KAAK,CAACooB,QAAQ,EAAE;QACvB,IAAI,CAACpoB,KAAK,CAACooB,QAAQ,EAAE;MACvB;IACF;EACF;EAEA5nB,MAAM,GAAG;IACP,MAAM6rC,KAAK,GAAG,EAAE;IAChB,IAAI3wC,KAAK,GAAG,CAAC;IACb,MAAM+wC,aAAa,GAAG,IAAI,CAACzsC,KAAK,CAACysC,aAAa,IAAI,EAAE;IACpD,IAAI,CAAC94C,KAAK,CAAC44C,WAAW,CAACl5C,GAAG,CAAEhF,IAAI,IAAK;MACnCg+C,KAAK,CAAC77C,IAAI,CACR,2DAAC,iDAAI;QACH,MAAM,EAAE,IAAI,CAACwP,KAAK,CAACqB,MAAO;QAC1B,QAAQ,EAAE,IAAI,CAAC4qC,gBAAiB;QAChC,MAAM,EAAEljD,kEAAY,CAACsF,IAAI,CAAC4V,MAAM,GAAG5V,IAAI,CAAC4V,MAAM,CAACjb,KAAK,GAAG,IAAI,CAAE;QAC7D,KAAK,EAAEqF,IAAI,CAAC4V,MAAM,GAAG5V,IAAI,CAAC4V,MAAM,CAAC1G,EAAE,GAAG3K,SAAU;QAChD,QAAQ,EAAE,IAAI,CAACoN,KAAK,CAACotC,cAAe;QACpC,KAAK,EAAE/+C,IAAI,CAAC8gB,IAAK;QACjB,QAAQ,EAAEs9B,aAAa,CAACngD,QAAQ,CAAC+B,IAAI,CAAC8gB,IAAI,CAAE;QAC5C,OAAO,EAAE9gB,IAAI,CAACg/C,OAAQ;QACtB,KAAK,EAAE3xC,KAAM;QACb,GAAG,EAAErN,IAAI,CAAC8gB;MAAK,EAAG,CACrB;MACDzT,KAAK,EAAE;IACT,CAAC,CAAC;IACF,MAAM3I,SAAS,GAAG,YAAY,IAAI,IAAI,CAACY,KAAK,CAACm4C,OAAO,GAAG,UAAU,GAAG,EAAE,CAAC;IACvE,MAAMwB,SAAS,GAAG,EAAE,IAAI,CAACttC,KAAK,CAACutC,QAAQ,GAAG,CAAC,CAAC;IAC5C,OACE;MAAK,SAAS,EAAEx6C;IAAU,GACvBs5C,KAAK,EACN;MAAO,IAAI,EAAC,MAAM;MAChB,WAAW,EAAE,IAAI,CAAC14C,KAAK,CAACuyB,WAAY;MACpC,QAAQ,EAAE,IAAI,CAAC6lB,eAAgB;MAC/B,OAAO,EAAE,IAAI,CAACG,iBAAkB;MAChC,MAAM,EAAE,IAAI,CAACC,eAAgB;MAC7B,SAAS,EAAE,IAAI,CAACC,aAAc;MAC9B,KAAK,EAAE,IAAI,CAACz4C,KAAK,CAACk4C,KAAM;MACxB,QAAQ,EAAE,IAAI,CAAC7rC,KAAK,CAACutC,QAAS;MAC9B,SAAS,EAAED;IAAU,EAAG,CACtB;EAEV;AACF;AAAC;;;;;;;;;;;;;;;;;ACtJyB;AAEiB;AAE5B,MAAM3B,IAAI,SAASl7C,4DAAmB,CAAC;EACpDsP,WAAW,CAACC,KAAK,EAAE;IACjB,KAAK,CAACA,KAAK,CAAC;IAEZ,IAAI,CAAC87B,YAAY,GAAG,IAAI,CAACA,YAAY,CAAC57B,IAAI,CAAC,IAAI,CAAC;EAClD;EAEA47B,YAAY,CAACh5B,CAAC,EAAE;IACdA,CAAC,CAACC,cAAc,EAAE;IAClB,IAAI,CAAC/C,KAAK,CAACooB,QAAQ,CAAC,IAAI,CAACpoB,KAAK,CAAC9G,KAAK,EAAE,IAAI,CAAC8G,KAAK,CAAC4sC,KAAK,CAAC;EACzD;EAEApsC,MAAM,GAAG;IACP,MAAM3L,KAAK,GAAG,IAAI,CAACmL,KAAK,CAACnL,KAAK,IAAI,IAAI,CAACmL,KAAK,CAAC9G,KAAK;IAClD,MAAMnG,SAAS,GAAG,IAAI,CAACiN,KAAK,CAACqtC,OAAO,GAAG,cAAc,GAAG,MAAM;IAC9D,OACE;MAAK,SAAS,EAAEt6C;IAAU,GACvB,IAAI,CAACiN,KAAK,CAACwtC,QAAQ,GAClB;MAAM,SAAS,EAAC;IAAQ,EAAG,GAC3B;MAAK,SAAS,EAAC;IAAY,GACzB,2DAAC,wDAAU;MACT,MAAM,EAAE,IAAI,CAACxtC,KAAK,CAACqB,MAAO;MAC1B,MAAM,EAAE,IAAI,CAACrB,KAAK,CAACmE,MAAM,IAAI,IAAK;MAClC,KAAK,EAAE,IAAI,CAACnE,KAAK,CAAC9G,KAAM;MACxB,KAAK,EAAE,IAAI,CAAC8G,KAAK,CAACnL;IAAM,EAAG,CACzB,EAER,yEAAOA,KAAK,CAAQ,EACnB,IAAI,CAACmL,KAAK,CAACooB,QAAQ,IAAI,CAAC,IAAI,CAACpoB,KAAK,CAAC8sC,QAAQ,GAC1C;MAAG,IAAI,EAAC,GAAG;MAAC,OAAO,EAAE,IAAI,CAAChR;IAAa,GAAE,MAAO,CAAI,GAClD;MAAM,SAAS,EAAC;IAAQ,EAAG,CAC3B;EAEV;AACF;AAAC;;;;;;;;;;;;;;;;;;ACrCyB;AACc;AAExC,MAAM2R,aAAa,SAASh9C,4DAAmB,CAAC;EAC9CsP,WAAW,CAACC,KAAK,EAAE;IACjB,KAAK,CAACA,KAAK,CAAC;IAEZ,IAAI,CAAC0tC,WAAW,GAAG,IAAI,CAACA,WAAW,CAACxtC,IAAI,CAAC,IAAI,CAAC;EAChD;EAEAwtC,WAAW,CAAC5qC,CAAC,EAAE;IACbA,CAAC,CAACC,cAAc,EAAE;IAClBD,CAAC,CAACua,eAAe,EAAE;IACnB,IAAI,CAACrd,KAAK,CAAC2tC,QAAQ,CAAC,IAAI,CAAC3tC,KAAK,CAACiG,MAAM,CAAC;EACxC;EAEAzF,MAAM,GAAG;IACP,MAAM;MAACvM;IAAa,CAAC,GAAG,IAAI,CAAC+L,KAAK,CAACgD,IAAI;IACvC,OACE;MAAI,OAAO,EAAE,IAAI,CAAC0qC,WAAY;MAAC,SAAS,EAAC;IAAQ,GAC/C;MAAK,SAAS,EAAC;IAAa,GAAEz5C,aAAa,CAAC,IAAI,CAAC+L,KAAK,CAACnL,KAAK,EAAE,IAAI,CAACmL,KAAK,CAAC/N,MAAM,CAAC,CAAO,CACpF;EAET;AACF;AAAC;AAED,iEAAe4O,sDAAU,CAAC4sC,aAAa,CAAC;;;;;;;;;;;;;;;;AC3Bd;AAE1B,MAAM3M,YAAY,GAAG;EAAC,OAAO,EAAE,mBAAmB;EAAE,QAAQ,EAAE,OAAO;EAAE,OAAO,EAAE;AAAe,CAAC;AAGjF,MAAM/uB,aAAa,SAASthB,4DAAmB,CAAC;EAC7D+P,MAAM,GAAG;IACP,IAAIsM,MAAM,GAAG,IAAI;IACjB,IAAI,IAAI,CAAC9M,KAAK,CAAC8M,MAAM,IAAI,IAAI,CAAC9M,KAAK,CAAC8M,MAAM,CAACrgB,MAAM,GAAG,CAAC,EAAE;MACrDqgB,MAAM,GAAG,EAAE;MACX,IAAI,CAAC9M,KAAK,CAAC8M,MAAM,CAACzZ,GAAG,CAAEpD,CAAC,IAAK;QAC3B,MAAMiP,KAAK,GAAIjP,CAAC,CAACiP,KAAK,GAAG,GAAG,GAAGjP,CAAC,CAACiP,KAAK,GAAG,EAAG;QAC5C,IAAIjP,CAAC,CAAC4xB,IAAI,EAAE;UACV/U,MAAM,CAACtc,IAAI,CAAC;YAAG,SAAS,EAAE,yBAAyB,GAAG0O,KAAM;YAAC,GAAG,EAAEjP,CAAC,CAACiC,GAAG,IAAIjC,CAAC,CAAC4xB;UAAK,GAAEif,YAAY,CAAC7wC,CAAC,CAAC4xB,IAAI,CAAC,IAAI5xB,CAAC,CAAC4xB,IAAI,CAAK,CAAC;QAC1H,CAAC,MAAM;UACL/U,MAAM,CAACtc,IAAI,CAAC;YAAM,SAAS,EAAE,OAAO,GAAG0O,KAAM;YAAC,GAAG,EAAEjP,CAAC,CAACiC,GAAG,IAAIjC,CAAC,CAACtD;UAAK,GAAEsD,CAAC,CAACtD,IAAI,CAAQ,CAAC;QACtF;MACF,CAAC,CAAC;MACF,OAAO,0HAAGmgB,MAAM,CAAI;IACtB;IACA,OAAO,IAAI;EACb;AACF;AAAC;;;;;;;;;;;;;;;;;;;;;;;;ACpByB;AAC8B;AAEZ;AAER;AACa;AAEK;AAEA;AAEtD,MAAMvb,QAAQ,GAAGb,0DAAc,CAAC;EAC9Bm9C,SAAS,EAAE;IACTp8C,EAAE,aAAa;IACfC,cAAc;MAAA;MAAA;IAAA;EAEhB,CAAC;EACDo8C,WAAW,EAAE;IACXr8C,EAAE,eAAe;IACjBC,cAAc;MAAA;MAAA;IAAA;EAEhB;AACF,CAAC,CAAC;AAEF,MAAMyT,WAAW,SAAS1U,wDAAe,CAAC;EACxC+P,MAAM,GAAG;IACP,MAAM;MAAEvM;IAAc,CAAC,GAAG,IAAI,CAAC+L,KAAK,CAACgD,IAAI;IACzC,MAAM+qC,aAAa,GAAGj+C,KAAK,CAACC,OAAO,CAAC,IAAI,CAACiQ,KAAK,CAAC0G,aAAa,CAAC;IAC7D,MAAMsnC,YAAY,GAAG,EAAE;IACvB,IAAIC,aAAa,GAAG,CAAC;IACrB,IAAI,IAAI,CAACjuC,KAAK,CAACwB,QAAQ,IAAI,IAAI,CAACxB,KAAK,CAACwB,QAAQ,CAAC/U,MAAM,GAAG,CAAC,EAAE;MACzD,IAAI,CAACuT,KAAK,CAACwB,QAAQ,CAACnO,GAAG,CAAE9C,CAAC,IAAK;QAC7B,IAAIA,CAAC,CAAC0V,MAAM,EAAE;UAEZ+nC,YAAY,CAACx9C,IAAI,CACf,2DAAC,2DAAa;YACZ,KAAK,EAAED,CAAC,CAACsE,KAAM;YAAC,MAAM,EAAEtE,CAAC,CAAC0V,MAAO;YAAC,MAAM,EAAE1V,CAAC,CAAC0B,MAAO;YACnD,GAAG,EAAE1B,CAAC,CAAC0V,MAAO;YACd,QAAQ,EAAE,IAAI,CAACjG,KAAK,CAAC2tC;UAAS,EAC5B,CAAC;QACT,CAAC,MAAM;UAEL,MAAMz7C,GAAG,GAAG,IAAI,CAAC8N,KAAK,CAACkuC,QAAQ,GAAG39C,CAAC,CAAC4e,IAAI,GAAI5e,CAAC,CAAC2I,KAAK,IAAI3I,CAAC,CAAC4e,IAAK;UAG9D,IAAI,IAAI,CAACnP,KAAK,CAACgtC,UAAU,IAAI,IAAI,CAAChtC,KAAK,CAACmuC,MAAM,EAAE;YAC9C,MAAMC,QAAQ,GAAG,CAACl8C,GAAG,CAAC;YACtB,IAAI3B,CAAC,CAACqV,OAAO,IAAIrV,CAAC,CAACqV,OAAO,CAAC0H,OAAO,EAAE;cAClC8gC,QAAQ,CAAC59C,IAAI,CAAC,CAAC,EAAE,GAAGD,CAAC,CAACqV,OAAO,CAAC0H,OAAO,EAAE+gC,WAAW,EAAE,CAAC;YACvD;YACA,IAAI99C,CAAC,CAAC0T,MAAM,IAAI1T,CAAC,CAAC0T,MAAM,CAAC1G,EAAE,EAAE;cAC3B6wC,QAAQ,CAAC59C,IAAI,CAAC,CAAC,EAAE,GAAGD,CAAC,CAAC0T,MAAM,CAAC1G,EAAE,EAAE8wC,WAAW,EAAE,CAAC;YACjD;YACA,IAAI,CAAC,IAAI,CAACruC,KAAK,CAACgtC,UAAU,CAAC,IAAI,CAAChtC,KAAK,CAACmuC,MAAM,EAAEC,QAAQ,CAAC,EAAE;cACvD;YACF;UACF;UAEA,MAAM1sB,SAAS,GAAG/kB,iEAAyB,CAACzK,GAAG,CAAC;UAChD,MAAM44C,OAAO,GAAG,CAACppB,SAAS,IAAI/kB,+DAAuB,CAACzK,GAAG,CAAC;UAC1D,MAAMs8C,QAAQ,GAAGT,aAAa,GAC3B,IAAI,CAAC/tC,KAAK,CAAC0G,aAAa,CAACjc,OAAO,CAACyH,GAAG,CAAC,GAAG,CAAC,CAAC,GAC1C,IAAI,CAAC8N,KAAK,CAAC0G,aAAa,KAAKxU,GAAI;UACpC,MAAM4a,MAAM,GAAG,EAAE;UACjB,IAAI,IAAI,CAAC9M,KAAK,CAACkuC,QAAQ,EAAE;YACvB,IAAIh8C,GAAG,IAAI,IAAI,CAAC8N,KAAK,CAACiF,QAAQ,EAAE;cAC9B6H,MAAM,CAACtc,IAAI,CAAC;gBAAC7D,IAAI,EAAEsH,aAAa,CAAC1C,QAAQ,CAACs8C,SAAS,CAAC;gBAAE3uC,KAAK,EAAE;cAAO,CAAC,CAAC;YACxE;YACA,IAAI3O,CAAC,CAACkR,GAAG,IAAIlR,CAAC,CAACkR,GAAG,CAACwL,OAAO,EAAE,EAAE;cAC5BH,MAAM,CAACtc,IAAI,CAAC;gBAAC7D,IAAI,EAAEsH,aAAa,CAAC1C,QAAQ,CAACu8C,WAAW,CAAC;gBAAE5uC,KAAK,EAAE;cAAM,CAAC,CAAC;YACzE;UACF;UAEA,MAAMoO,OAAO,GAAGxd,KAAK,CAACC,OAAO,CAACQ,CAAC,CAACqV,OAAO,CAAC,GACtCrV,CAAC,CAACqV,OAAO,CAACrS,IAAI,CAAC,GAAG,CAAC,GAAIhD,CAAC,CAACqV,OAAO,GAAGrV,CAAC,CAACqV,OAAO,CAAC0H,OAAO,GAAG,IAAK;UAC9D,IAAIza,OAAO;UACX,IAAI+mC,SAAS;UACb,IAAI6U,iBAAiB;UACrB,IAAI/rB,cAAc;UAClB,IAAI,CAAC,IAAI,CAAC1iB,KAAK,CAACkuC,QAAQ,IAAI39C,CAAC,CAACm+C,aAAa,EAAE;YAC3C,MAAMpyB,GAAG,GAAG/rB,CAAC,CAACm+C,aAAa,EAAE;YAC7B,IAAIpyB,GAAG,EAAE;cACPsd,SAAS,GAAGtd,GAAG,CAACvf,IAAI,GAAGuf,GAAG,CAACvf,IAAI,CAAC68B,SAAS,GAAG,IAAI;cAChDlX,cAAc,GAAGpG,GAAG,CAACqyB,OAAO,IAAIp+C,CAAC,CAACksB,SAAS,CAACH,GAAG,EAAE,IAAI,CAAC;cACtDmyB,iBAAiB,GAAGnyB,GAAG,CAACI,IAAI,IAAI,IAAI,CAAC1c,KAAK,CAACiF,QAAQ;cACnD,IAAIqX,GAAG,CAAC9C,OAAO,EAAE;gBACf3mB,OAAO,GAAG,OAAOypB,GAAG,CAAC9C,OAAO,IAAI,QAAQ,GACtC8C,GAAG,CAAC9C,OAAO,CAACmjB,MAAM,CAAC,CAAC,EAAE50C,8DAAsB,CAAC,GAC7C4I,sDAAc,CAAC2rB,GAAG,CAAC9C,OAAO,EAAEzxB,8DAAsB,CAAC;cACvD;YACF;UACF;UAEAimD,YAAY,CAACx9C,IAAI,CACf,2DAAC,oDAAO;YACN,MAAM,EAAE,IAAI,CAACwP,KAAK,CAACqB,MAAO;YAC1B,KAAK,EAAE9Q,CAAC,CAAC0T,MAAM,GAAG1T,CAAC,CAAC0T,MAAM,CAAC1G,EAAE,GAAG,IAAK;YACrC,MAAM,EAAExU,kEAAY,CAACwH,CAAC,CAAC0T,MAAM,GAAG1T,CAAC,CAAC0T,MAAM,CAACjb,KAAK,GAAG,IAAI,CAAE;YACvD,OAAO,EAAEskB,OAAQ;YACjB,OAAO,EAAEza,OAAQ;YACjB,iBAAiB,EAAE47C,iBAAkB;YACrC,SAAS,EAAE7U,SAAU;YACrB,QAAQ,EAAElX,cAAe;YACzB,MAAM,EAAE,IAAI,CAAC1iB,KAAK,CAAC4uC,UAAU,GAAGr+C,CAAC,CAACwV,MAAM,GAAG,CAAE;YAC7C,GAAG,EAAExV,CAAC,CAACmpB,MAAM,IAAI,IAAI,CAAC1Z,KAAK,CAACyG,SAAU;YACtC,GAAG,EAAElW,CAAC,CAACkR,GAAI;YACX,QAAQ,EAAE,IAAI,CAACzB,KAAK,CAACkuC,QAAS;YAC9B,MAAM,EAAEphC,MAAO;YACf,aAAa,EAAEihC,aAAc;YAC7B,QAAQ,EAAES,QAAS;YACnB,UAAU,EAAE,IAAI,CAACxuC,KAAK,CAAC6uC,UAAU,IAAI,CAACntB,SAAU;YAChD,SAAS,EAAEA,SAAU;YACrB,OAAO,EAAEopB,OAAQ;YACjB,eAAe,EAAE,IAAI,CAAC9qC,KAAK,CAAC4G,eAAgB;YAC5C,UAAU,EAAErW,CAAC,CAACwc,OAAO,IAAIxc,CAAC,CAACwc,OAAO,CAAC6U,QAAS;YAC5C,OAAO,EAAErxB,CAAC,CAACwc,OAAO,IAAIxc,CAAC,CAACwc,OAAO,CAAC+U,KAAM;YACtC,WAAW,EAAEvxB,CAAC,CAACwc,OAAO,IAAIxc,CAAC,CAACwc,OAAO,CAACgV,MAAO;YAC3C,OAAO,EAAExxB,CAAC,CAAC+oB,QAAS;YACpB,UAAU,EAAE,IAAI,CAACtZ,KAAK,CAAC2G,eAAgB;YACvC,IAAI,EAAEzU,GAAI;YACV,KAAK,EAAE87C,YAAY,CAACvhD,MAAO;YAC3B,GAAG,EAAEyF;UAAI,EAAG,CACf;UACD+7C,aAAa,EAAG;QAClB;MACF,CAAC,EAAE,IAAI,CAAC;IACV;IAEA,OACE;MAAK,SAAS,EAAE,IAAI,CAACjuC,KAAK,CAAC8uC,QAAQ,GAAG,IAAI,GAAG;IAAmB,GAC7Db,aAAa,IAAI,CAAC,GACjB;MAAK,SAAS,EAAC,oBAAoB;MACjC,uBAAuB,EAAE;QAACc,MAAM,EAAE,IAAI,CAAC/uC,KAAK,CAACgvC;MAAgB;IAAE,EAAG,GAEpE,IAAI,EAELhB,YAAY,CAACvhD,MAAM,GAAG,CAAC,GACtB;MAAI,SAAS,EAAC;IAAa,GACxBuhD,YAAY,CACV,GAEL,IAAI,CAEF;EAEV;AACF;AAAC;AAED,iEAAentC,sDAAU,CAACsE,WAAW,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;ACtJZ;AACgC;AAET;AACN;AACE;AAET;AAEoB;AACP;AAEjD,MAAMyoC,OAAO,SAASn9C,wDAAe,CAAC;EACpCsP,WAAW,CAACC,KAAK,EAAE;IACjB,KAAK,CAACA,KAAK,CAAC;IAEZ,IAAI,CAAC0tC,WAAW,GAAG,IAAI,CAACA,WAAW,CAACxtC,IAAI,CAAC,IAAI,CAAC;IAC9C,IAAI,CAAC6U,kBAAkB,GAAG,IAAI,CAACA,kBAAkB,CAAC7U,IAAI,CAAC,IAAI,CAAC;EAC9D;EAEAwtC,WAAW,CAAC5qC,CAAC,EAAE;IACbA,CAAC,CAACC,cAAc,EAAE;IAClBD,CAAC,CAACua,eAAe,EAAE;IACnB,IAAI,IAAI,CAACrd,KAAK,CAACkvC,UAAU,EAAE;MAEzB,IAAI,CAAClvC,KAAK,CAACkvC,UAAU,CAAC,IAAI,CAAClvC,KAAK,CAAC3R,IAAI,EAAE,IAAI,CAAC2R,KAAK,CAAC4sC,KAAK,CAAC;IAC1D;EACF;EAEA73B,kBAAkB,CAACjS,CAAC,EAAE;IACpBA,CAAC,CAACC,cAAc,EAAE;IAClBD,CAAC,CAACua,eAAe,EAAE;IACnB,IAAI,CAACrd,KAAK,CAAC4G,eAAe,CAAC;MAAEmJ,SAAS,EAAE,IAAI,CAAC/P,KAAK,CAAC3R,IAAI;MAAE+hB,CAAC,EAAEtN,CAAC,CAACwa,KAAK;MAAEnN,CAAC,EAAErN,CAAC,CAACya;IAAM,CAAC,CAAC;EACpF;EAEA/c,MAAM,GAAG;IACP,IAAI3L,KAAK,GAAG,IAAI,CAACmL,KAAK,CAACnL,KAAK;IAC5B,IAAI,CAACA,KAAK,EAAE;MACVA,KAAK,GAAG,sEAAG,2DAAC,wDAAgB;QAAC,EAAE,iBAAgB;QAAC,cAAc;UAAA;UAAA;QAAA;MAAU,EACf,CAAI;IAC/D,CAAC,MAAM,IAAIA,KAAK,CAACpI,MAAM,GAAG,EAAE,EAAE;MAE5BoI,KAAK,GAAGA,KAAK,CAAChK,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG;IACtC;IACA,MAAM6uB,MAAM,GAAG,IAAI,CAAC1Z,KAAK,CAACxG,GAAG,GAAG,QAAQ,GAAG,SAAS;IACpD,MAAM2K,MAAM,GAAG,IAAI,CAACnE,KAAK,CAACmE,MAAM,GAAG,IAAI,CAACnE,KAAK,CAACmE,MAAM,GAAG,IAAI;IAC3D,MAAM2I,MAAM,GAAG,IAAI,CAAC9M,KAAK,CAAC8M,MAAM,GAAG,IAAI,CAAC9M,KAAK,CAAC8M,MAAM,CAAC7U,KAAK,EAAE,GAAG,EAAE;IACjE,MAAM0pB,WAAW,GAAG,EAAE;IACtB,IAAI,IAAI,CAAC3hB,KAAK,CAACsY,UAAU,EAAE;MACzBqJ,WAAW,CAACnxB,IAAI,CAAC;QAACqxB,IAAI,EAAE,UAAU;QAAE3iB,KAAK,EAAE;MAAgB,CAAC,CAAC;IAC/D;IACA,IAAI,IAAI,CAACc,KAAK,CAACuY,OAAO,EAAE;MACtBoJ,WAAW,CAACnxB,IAAI,CAAC;QAACqxB,IAAI,EAAE,OAAO;QAAE3iB,KAAK,EAAE;MAAa,CAAC,CAAC;IACzD;IACA,IAAI,IAAI,CAACc,KAAK,CAACwY,WAAW,EAAE;MAC1BmJ,WAAW,CAACnxB,IAAI,CAAC;QAACqxB,IAAI,EAAE,WAAW;QAAE3iB,KAAK,EAAE;MAAc,CAAC,CAAC;IAC9D;IACA,IAAI,IAAI,CAACc,KAAK,CAACyB,GAAG,EAAE;MAClB,IAAI,IAAI,CAACzB,KAAK,CAACkuC,QAAQ,EAAE;QACvBphC,MAAM,CAACtc,IAAI,CAAC;UAAC7D,IAAI,EAAE,IAAI,CAACqT,KAAK,CAACyB,GAAG,CAACmM,OAAO,EAAE;UAAE1b,GAAG,EAAE;QAAM,CAAC,CAAC;MAC5D;MACA,IAAI,IAAI,CAAC8N,KAAK,CAACyB,GAAG,CAAC4L,OAAO,EAAE,EAAE;QAC5BsU,WAAW,CAACnxB,IAAI,CAAC;UAACqxB,IAAI,EAAE;QAAO,CAAC,CAAC;MACnC;MACA,IAAI,CAAC,IAAI,CAAC7hB,KAAK,CAACyB,GAAG,CAACC,QAAQ,EAAE,EAAE;QAC9BigB,WAAW,CAACnxB,IAAI,CAAC;UAACqxB,IAAI,EAAE;QAAQ,CAAC,CAAC;MACpC;IACF;IAGA,IAAIhvB,OAAO;IACX,IAAI,OAAO,IAAI,CAACmN,KAAK,CAACnN,OAAO,IAAI,QAAQ,EAAE;MACzCA,OAAO,GAAG,IAAI,CAACmN,KAAK,CAACnN,OAAO;IAC9B,CAAC,MAAM,IAAIlC,sDAAc,CAAC,IAAI,CAACqP,KAAK,CAACnN,OAAO,CAAC,EAAE;MAC7CA,OAAO,GAAGpC,0DAAmB,CAACA,uDAAc,EAAE,IAAI,EAAEE,qDAAa,CAAC,IAAI,CAACqP,KAAK,CAACnN,OAAO,EAAE8B,gEAAgB,EACpG;QAACV,aAAa,EAAE,IAAI,CAAC+L,KAAK,CAACgD,IAAI,CAAC/O,aAAa;QAAEw6C,iBAAiB,EAAE,IAAI,CAACzuC,KAAK,CAACyuC;MAAiB,CAAC,CAAC,CAAC;IACrG,CAAC,MAAM,IAAI,IAAI,CAACzuC,KAAK,CAACnN,OAAO,EAAE;MAC7BA,OAAO,GACL,0HAAE;QAAG,SAAS,EAAC;MAAqB,GAAC,eAAa,CAAI,KAAC;QAAG,SAAS,EAAC;MAAM,GACxE,2DAAC,wDAAgB;QAAC,EAAE,mBAAkB;QACpC,cAAc;UAAA;UAAA;QAAA;MAAkB,EAAsD,CAAI,CAC3F;IACP;IAEA,MAAMgvB,IAAI,GAAG/iB,6DAAc,CAAC,IAAI,CAACkB,KAAK,CAACjB,QAAQ,CAAC;IAChD,MAAMowC,MAAM,GAAGttB,IAAI,GAAG;MAAG,SAAS,EAAE,kCAAkC,IACnEA,IAAI,CAAC3iB,KAAK,GAAG,GAAG,GAAG2iB,IAAI,CAAC3iB,KAAK,GAAG,EAAE;IAAE,GAAE2iB,IAAI,CAACl1B,IAAI,CAAK,GAAG,IAAI;IAC9D,MAAM82B,UAAU,GAAG,eAAe,IAAI,IAAI,CAACzjB,KAAK,CAACyY,OAAO,GAAG,UAAU,GAAG,EAAE,CAAC;IAE3E,OACE;MAAI,SAAS,EAAE,CAAC,IAAI,CAACzY,KAAK,CAAC+tC,aAAa,IAAI,IAAI,CAAC/tC,KAAK,CAACwuC,QAAQ,GAAG,UAAU,GAAG,IAAK;MAAC,OAAO,EAAE,IAAI,CAACd;IAAY,GAC7G;MAAK,SAAS,EAAC;IAAY,GACzB,2DAAC,wDAAU;MACT,MAAM,EAAE,IAAI,CAAC1tC,KAAK,CAACqB,MAAO;MAC1B,MAAM,EAAE8C,MAAO;MACf,KAAK,EAAE,IAAI,CAACnE,KAAK,CAACnL,KAAM;MACxB,KAAK,EAAE,IAAI,CAACmL,KAAK,CAAC3R,IAAK;MACvB,OAAO,EAAE,IAAI,CAAC2R,KAAK,CAACyY;IAAQ,EAAG,EAChC,IAAI,CAACzY,KAAK,CAACyY,OAAO,GAAG;MAAG,SAAS,EAAC;IAAwB,GAAC,QAAM,CAAI,GACpE,IAAI,CAACzY,KAAK,CAAC6uC,UAAU,GAAG;MAAM,SAAS,EAAEn1B;IAAO,EAAG,GAClD,IAAI,CAAC1Z,KAAK,CAAC+tC,aAAa,IAAI,IAAI,CAAC/tC,KAAK,CAACwuC,QAAQ,GAChD;MAAG,SAAS,EAAC;IAA0B,GAAC,cAAY,CAAI,GACtD,IAAI,CACJ,EACN;MAAK,SAAS,EAAC;IAAU,GACvB,wEAAK;MAAM,SAAS,EAAE/qB;IAAW,GAAE5uB,KAAK,CAAQ,EAC7C,IAAI,CAACmL,KAAK,CAAC8qC,OAAO,GAAG;MAAG,SAAS,EAAC;IAAyB,GAAC,OAAK,CAAI,GAAG,IAAI,EAC5E,IAAI,CAAC9qC,KAAK,CAAC0hB,SAAS,GAAG;MAAK,GAAG,EAAC,kBAAkB;MAAC,SAAS,EAAC,SAAS;MAAC,GAAG,EAAC;IAAS,EAAG,GAAG,IAAI,EAC/F,2DAAC,2DAAa;MAAC,MAAM,EAAEC;IAAY,EAAG,EACrC,CAAC,IAAI,CAAC3hB,KAAK,CAACyY,OAAO,GAAG,2DAAC,yDAAW;MAAC,KAAK,EAAE,IAAI,CAACzY,KAAK,CAAC+F;IAAO,EAAG,GAAG,IAAI,CACnE,EACL,IAAI,CAAC/F,KAAK,CAACkuC,QAAQ,GAClB,yEAAM,2DAAC,2DAAa;MAAC,MAAM,EAAEphC;IAAO,EAAG,CAAO,GAC9C,IAAI,CAAC9M,KAAK,CAACovC,KAAK,GAAG,IAAI,GAAG;MAAK,SAAS,EAAC;IAAiB,GAAED,MAAM,EAAC,yEAAOt8C,OAAO,IAAI,IAAI,CAACmN,KAAK,CAACsN,OAAO,IAAI,QAAQ,CAAQ,CAAM,CAC/H,EACL,IAAI,CAACtN,KAAK,CAAC4G,eAAe,GACzB;MAAM,SAAS,EAAC;IAAa,GAC3B;MAAG,IAAI,EAAC,GAAG;MAAC,OAAO,EAAE,IAAI,CAACmO;IAAmB,GAC3C;MAAG,SAAS,EAAC;IAAgB,GAAC,aAAW,CAAI,CAC3C,CACC,GAAG,IAAI,CACb;EAET;AACF;AAAC;AAED,iEAAelU,sDAAU,CAAC+sC,OAAO,CAAC;;;;;;;;;;;;;;;;;;;AC9HR;AAC8B;AAEhB;AAExC,MAAMr8C,QAAQ,GAAGb,0DAAc,CAAC;EAC9BsI,IAAI,EAAE;IACJvH,EAAE,kBAAkB;IACpBC,cAAc;MAAA;MAAA;IAAA;EAEhB,CAAC;EACD29C,cAAc,EAAE;IACd59C,EAAE,4BAA4B;IAC9BC,cAAc;MAAA;MAAA;IAAA;EAEhB,CAAC;EACD49C,aAAa,EAAE;IACb79C,EAAE,oCAAoC;IACtCC,cAAc;MAAA;MAAA;IAAA;EAEhB,CAAC;EACD69C,MAAM,EAAE;IACN99C,EAAE,oBAAoB;IACtBC,cAAc;MAAA;MAAA;IAAA;EAEhB,CAAC;EACD89C,cAAc,EAAE;IACd/9C,EAAE,4BAA4B;IAC9BC,cAAc;MAAA;MAAA;IAAA;EAEhB,CAAC;EACD+9C,UAAU,EAAE;IACVh+C,EAAE,wBAAwB;IAC1BC,cAAc;MAAA;MAAA;IAAA;EAEhB,CAAC;EACDg+C,IAAI,EAAE;IACJj+C,EAAE,kBAAkB;IACpBC,cAAc;MAAA;MAAA;IAAA;EAEhB,CAAC;EACDi+C,MAAM,EAAE;IACNl+C,EAAE,oBAAoB;IACtBC,cAAc;MAAA;MAAA;IAAA;EAEhB,CAAC;EACDwnB,KAAK,EAAE;IACLznB,EAAE,mBAAmB;IACrBC,cAAc;MAAA;MAAA;IAAA;EAEhB,CAAC;EACDk+C,OAAO,EAAE;IACPn+C,EAAE,qBAAqB;IACvBC,cAAc;MAAA;MAAA;IAAA;EAEhB,CAAC;EACDm2B,IAAI,EAAE;IACJp2B,EAAE,kBAAkB;IACpBC,cAAc;MAAA;MAAA;IAAA;EAEhB,CAAC;EACDm+C,YAAY,EAAE;IACZp+C,EAAE,0BAA0B;IAC5BC,cAAc;MAAA;MAAA;IAAA;EAEhB,CAAC;EACDo+C,oBAAoB,EAAE;IACpBr+C,EAAE,wBAAwB;IAC1BC,cAAc;MAAA;MAAA;IAAA;EAEhB,CAAC;EACDq+C,uBAAuB,EAAE;IACvBt+C,EAAE,2BAA2B;IAC7BC,cAAc;MAAA;MAAA;IAAA;EAEhB,CAAC;EACDs+C,OAAO,EAAE;IACPv+C,EAAE,qBAAqB;IACvBC,cAAc;MAAA;MAAA;IAAA;EAEhB,CAAC;EAEDivB,KAAK,EAAE;IACLlvB,EAAE,mBAAmB;IACrBC,cAAc;MAAA;MAAA;IAAA;EAEhB,CAAC;EACDu+C,mBAAmB,EAAE;IACnBx+C,EAAE,uBAAuB;IACzBC,cAAc;MAAA;MAAA;IAAA;EAEhB,CAAC;EACDw+C,aAAa,EAAE;IACbz+C,EAAE,2BAA2B;IAC7BC,cAAc;MAAA;MAAA;IAAA;EAEhB,CAAC;EACDoU,OAAO,EAAE;IACPrU,EAAE,2BAA2B;IAC7BC,cAAc;MAAA;MAAA;IAAA;EAEhB,CAAC;EACDy+C,SAAS,EAAE;IACT1+C,EAAE,2BAA2B;IAC7BC,cAAc;MAAA;MAAA;IAAA;EAEhB,CAAC;EACD4Y,gBAAgB,EAAE;IAChB7Y,EAAE,8BAA8B;IAChCC,cAAc;MAAA;MAAA;IAAA;EAEhB,CAAC;EACD0+C,sBAAsB,EAAE;IACtB3+C,EAAE,0BAA0B;IAC5BC,cAAc;MAAA;MAAA;IAAA;EAEhB;AACF,CAAC,CAAC;AAEF,MAAMq4B,WAAW,SAASt5B,wDAAe,CAAC;EACxCsP,WAAW,CAACC,KAAK,EAAE;IACjB,KAAK,CAACA,KAAK,CAAC;IAEZ,IAAI,CAACgrB,OAAO,GAAGv6B,sDAAe,EAAE;IAEhC,MAAM;MAACwD;IAAa,CAAC,GAAG+L,KAAK,CAACgD,IAAI;IAElC,IAAI,CAACqtC,eAAe,GAAG,IAAI,CAACA,eAAe,CAACnwC,IAAI,CAAC,IAAI,CAAC;IACtD,IAAI,CAACowC,eAAe,GAAG,IAAI,CAACA,eAAe,CAACpwC,IAAI,CAAC,IAAI,CAAC;IACtD,IAAI,CAACwtC,WAAW,GAAG,IAAI,CAACA,WAAW,CAACxtC,IAAI,CAAC,IAAI,CAAC;IAG9C,IAAI,CAACqwC,SAAS,GAAG;MACf,YAAY,EAAE;QACZ9+C,EAAE,EAAE,YAAY;QAChBoD,KAAK,EAAEZ,aAAa,CAAC1C,QAAQ,CAACyH,IAAI,CAAC;QACnCkX,OAAO,EAAE;MACX,CAAC;MACD,gBAAgB,EAAE;QAChBze,EAAE,EAAE,gBAAgB;QACpBoD,KAAK,EAAEZ,aAAa,CAAC1C,QAAQ,CAAC89C,cAAc,CAAC;QAC7Cn/B,OAAO,EAAE,CAACrY,MAAM,EAAE24C,YAAY,KAAK;UACjC,OAAOxwC,KAAK,CAACiD,WAAW,CACtBhP,aAAa,CAAC1C,QAAQ,CAAC89C,cAAc,CAAC,EACtCp7C,aAAa,CAAC1C,QAAQ,CAAC6+C,sBAAsB,CAAC,EAC7CnjD,CAAC,IAAI;YAAE,IAAI,CAACwjD,cAAc,CAAC,IAAI,EAAE,KAAK,EAAE54C,MAAM,EAAE24C,YAAY,CAAC;UAAE,CAAC,EACjE,IAAI,EACJ,IAAI,EACJ,IAAI,CACL;QACH;MACF,CAAC;MACD,qBAAqB,EAAE;QACrB/+C,EAAE,EAAE,qBAAqB;QACzBoD,KAAK,EAAEZ,aAAa,CAAC1C,QAAQ,CAAC+9C,aAAa,CAAC;QAC5Cp/B,OAAO,EAAE,CAACrY,MAAM,EAAE24C,YAAY,KAAK;UACjC,OAAOxwC,KAAK,CAACiD,WAAW,CACtBhP,aAAa,CAAC1C,QAAQ,CAAC+9C,aAAa,CAAC,EACrCr7C,aAAa,CAAC1C,QAAQ,CAACw+C,uBAAuB,CAAC,EAC9C9iD,CAAC,IAAI;YAAE,OAAO,IAAI,CAACwjD,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE54C,MAAM,EAAE24C,YAAY,CAAC;UAAE,CAAC,EACvE,IAAI,EACJ,IAAI,EACJ,IAAI,CACL;QACH;MACF,CAAC;MACD,gBAAgB,EAAE;QAChB/+C,EAAE,EAAE,gBAAgB;QACpBoD,KAAK,EAAEZ,aAAa,CAAC1C,QAAQ,CAACg+C,MAAM,CAAC;QACrCr/B,OAAO,EAAE,CAACrY,MAAM,EAAE24C,YAAY,KAAK;UACjC,OAAO,IAAI,CAACC,cAAc,CAAC,KAAK,EAAE,KAAK,EAAE54C,MAAM,EAAE24C,YAAY,CAAC;QAChE;MACF,CAAC;MACD,qBAAqB,EAAE;QACrB/+C,EAAE,EAAE,qBAAqB;QACzBoD,KAAK,EAAEZ,aAAa,CAAC1C,QAAQ,CAACi+C,cAAc,CAAC;QAC7Ct/B,OAAO,EAAE,CAACrY,MAAM,EAAE24C,YAAY,KAAK;UACjC,OAAO,IAAI,CAACC,cAAc,CAAC,KAAK,EAAE,IAAI,EAAE54C,MAAM,EAAE24C,YAAY,CAAC;QAC/D;MACF,CAAC;MACD,sBAAsB,EAAE;QACtB/+C,EAAE,EAAE,sBAAsB;QAC1BoD,KAAK,EAAEZ,aAAa,CAAC1C,QAAQ,CAACk+C,UAAU,CAAC;QACzCv/B,OAAO,EAAE,CAACrY,MAAM,EAAE24C,YAAY,KAAK;UACjC,OAAO,IAAI,CAACE,YAAY,CAAC74C,MAAM,EAAE24C,YAAY,CAAC;QAChD;MACF,CAAC;MACD,iBAAiB,EAAE;QACjB/+C,EAAE,EAAE,iBAAiB;QACrBoD,KAAK,EAAEZ,aAAa,CAAC1C,QAAQ,CAAC2nB,KAAK,CAAC;QACpChJ,OAAO,EAAE,CAACrY,MAAM,EAAE24C,YAAY,KAAK;UACjC,OAAO,IAAI,CAACG,cAAc,CAAC94C,MAAM,EAAE24C,YAAY,CAAC;QAClD;MACF,CAAC;MACD,mBAAmB,EAAE;QACnB/+C,EAAE,EAAE,mBAAmB;QACvBoD,KAAK,EAAEZ,aAAa,CAAC1C,QAAQ,CAACq+C,OAAO,CAAC;QACtC1/B,OAAO,EAAEjjB,CAAC,IAAI,CAAC;MACjB,CAAC;MACD,gBAAgB,EAAE;QAChBwE,EAAE,EAAE,gBAAgB;QACpBoD,KAAK,EAAEZ,aAAa,CAAC1C,QAAQ,CAACs2B,IAAI,CAAC;QACnC3X,OAAO,EAAE,CAACrY,MAAM,EAAE24C,YAAY,KAAK;UACjC,OAAO,IAAI,CAAC/F,WAAW,CAAC5yC,MAAM,EAAE24C,YAAY,CAAC;QAC/C;MACF,CAAC;MACD,cAAc,EAAE;QACd/+C,EAAE,EAAE,cAAc;QAClBoD,KAAK,EAAEZ,aAAa,CAAC1C,QAAQ,CAACo+C,MAAM,CAAC;QACrCz/B,OAAO,EAAE,IAAI,CAAC0gC,qBAAqB,CAAC1wC,IAAI,CAAC,IAAI,EAAE,IAAI;MACrD,CAAC;MACD,YAAY,EAAE;QACZzO,EAAE,EAAE,YAAY;QAChBoD,KAAK,EAAEZ,aAAa,CAAC1C,QAAQ,CAACm+C,IAAI,CAAC;QACnCx/B,OAAO,EAAE,IAAI,CAAC0gC,qBAAqB,CAAC1wC,IAAI,CAAC,IAAI,EAAE,IAAI;MACrD,CAAC;MACD,eAAe,EAAE;QACfzO,EAAE,EAAE,eAAe;QACnBoD,KAAK,EAAEZ,aAAa,CAAC1C,QAAQ,CAACy+C,OAAO,CAAC;QACtC9/B,OAAO,EAAE,IAAI,CAAC0gC,qBAAqB,CAAC1wC,IAAI,CAAC,IAAI,EAAE,KAAK;MACtD,CAAC;MACD,aAAa,EAAE;QACbzO,EAAE,EAAE,aAAa;QACjBoD,KAAK,EAAEZ,aAAa,CAAC1C,QAAQ,CAACovB,KAAK,CAAC;QACpCzQ,OAAO,EAAE,CAACrY,MAAM,EAAE24C,YAAY,KAAK;UACjC,OAAOxwC,KAAK,CAACiD,WAAW,CACtBhP,aAAa,CAAC1C,QAAQ,CAACovB,KAAK,CAAC,EAC7B1sB,aAAa,CAAC1C,QAAQ,CAAC0+C,mBAAmB,CAAC,EAC1ChjD,CAAC,IAAI,IAAI,CAAC2jD,qBAAqB,CAAC,KAAK,EAAE/4C,MAAM,EAAE24C,YAAY,CAAC,CAACn7C,IAAI,CAACylB,IAAI,IAAI;YACzE,IAAI,CAAC9a,KAAK,CAAC6wC,cAAc,CAACh5C,MAAM,CAACkY,SAAS,CAAC;YAC3C,OAAO+K,IAAI;UACb,CAAC,CAAC,EACF,IAAI,EACJ,IAAI,EACJ,IAAI,CACL;QACH;MACF,CAAC;MACD,cAAc,EAAE;QACdrpB,EAAE,EAAE,cAAc;QAClBoD,KAAK,EAAEZ,aAAa,CAAC1C,QAAQ,CAACs+C,YAAY,CAAC;QAC3C3/B,OAAO,EAAE,CAACrY,MAAM,EAAE24C,YAAY,KAAK;UACjC,OAAOxwC,KAAK,CAACiD,WAAW,CACtBhP,aAAa,CAAC1C,QAAQ,CAACs+C,YAAY,CAAC,EACpC57C,aAAa,CAAC1C,QAAQ,CAACu+C,oBAAoB,CAAC,EAC3C7iD,CAAC,IAAI;YACJ,MAAMiM,KAAK,GAAG,IAAI,CAAC8G,KAAK,CAACqB,MAAM,CAAC+K,QAAQ,CAACvU,MAAM,CAACkY,SAAS,CAAC;YAC1D,IAAI,CAAC7W,KAAK,EAAE;cACV1K,OAAO,CAACuH,IAAI,CAAC,mBAAmB,EAAE8B,MAAM,CAACkY,SAAS,CAAC;cACnD;YACF;YACA,OAAO7W,KAAK,CAAC2+B,QAAQ,CAAC,IAAI,CAAC,CAACliC,KAAK,CAACnK,GAAG,IAAI;cACvC,IAAIglD,YAAY,EAAE;gBAChBA,YAAY,CAAChlD,GAAG,CAACwK,OAAO,EAAE,KAAK,CAAC;cAClC;YACF,CAAC,CAAC;UACJ,CAAC,EACD,IAAI,EACJ,IAAI,EACJ,IAAI,CACL;QACH;MACF,CAAC;MACD,eAAe,EAAE;QACfvE,EAAE,EAAE,eAAe;QACnBoD,KAAK,EAAEZ,aAAa,CAAC1C,QAAQ,CAACuU,OAAO,CAAC;QACtCoK,OAAO,EAAE,CAACrY,MAAM,EAAE24C,YAAY,KAAK;UACjC,MAAMt3C,KAAK,GAAG,IAAI,CAAC8G,KAAK,CAACqB,MAAM,CAAC+K,QAAQ,CAACvU,MAAM,CAACkY,SAAS,CAAC;UAC1D,IAAI,CAAC7W,KAAK,EAAE;YACV1K,OAAO,CAACuH,IAAI,CAAC,mBAAmB,EAAE8B,MAAM,CAACkY,SAAS,CAAC;YACnD;UACF;UACA,OAAO7W,KAAK,CAAC4M,OAAO,CAAC,IAAI,CAAC,CAACnQ,KAAK,CAACnK,GAAG,IAAI;YACtC,IAAIglD,YAAY,EAAE;cAChBA,YAAY,CAAChlD,GAAG,CAACwK,OAAO,EAAE,KAAK,CAAC;YAClC;UACF,CAAC,CAAC;QACJ;MACF,CAAC;MACD,eAAe,EAAE;QACfvE,EAAE,EAAE,eAAe;QACnBoD,KAAK,EAAEZ,aAAa,CAAC1C,QAAQ,CAAC4+C,SAAS,CAAC;QACxCjgC,OAAO,EAAE,CAACrY,MAAM,EAAE24C,YAAY,KAAK;UACjC,MAAMt3C,KAAK,GAAG,IAAI,CAAC8G,KAAK,CAACqB,MAAM,CAAC+K,QAAQ,CAACvU,MAAM,CAACkY,SAAS,CAAC;UAC1D,IAAI,CAAC7W,KAAK,EAAE;YACV1K,OAAO,CAACuH,IAAI,CAAC,mBAAmB,EAAE8B,MAAM,CAACkY,SAAS,CAAC;YACnD;UACF;UACA,OAAO7W,KAAK,CAAC4M,OAAO,CAAC,KAAK,CAAC,CAACnQ,KAAK,CAACnK,GAAG,IAAI;YACvC,IAAIglD,YAAY,EAAE;cAChBA,YAAY,CAAChlD,GAAG,CAACwK,OAAO,EAAE,KAAK,CAAC;YAClC;UACF,CAAC,CAAC;QACJ;MACF,CAAC;MAED,aAAa,EAAE;QACbvE,EAAE,EAAE,aAAa;QACjBoD,KAAK,EAAEZ,aAAa,CAAC1C,QAAQ,CAAC+Y,gBAAgB,CAAC;QAC/C4F,OAAO,EAAE;MACX,CAAC;MACD,eAAe,EAAE;QACfze,EAAE,EAAE,eAAe;QACnBoD,KAAK,EAAEZ,aAAa,CAAC1C,QAAQ,CAAC2+C,aAAa,CAAC;QAC5ChgC,OAAO,EAAE,CAACrY,MAAM,EAAE24C,YAAY,KAAK;UACjC,MAAMt3C,KAAK,GAAG,IAAI,CAAC8G,KAAK,CAACqB,MAAM,CAAC+K,QAAQ,CAACvU,MAAM,CAACkY,SAAS,CAAC;UAC1D,IAAI,CAAC7W,KAAK,IAAI,CAACrB,MAAM,CAACsX,IAAI,EAAE;YAC1B3gB,OAAO,CAACuH,IAAI,CAAC,4BAA4B,GAAG8B,MAAM,CAACkY,SAAS,GAAG,MAAM,GAAGlY,MAAM,CAACsX,IAAI,GAAG,GAAG,CAAC;YAC1F;UACF;UACA,OAAOjW,KAAK,CAACohC,eAAe,CAACziC,MAAM,CAACsX,IAAI,CAAC,CAACxZ,KAAK,CAACnK,GAAG,IAAI;YACrD,IAAIglD,YAAY,EAAE;cAChBA,YAAY,CAAChlD,GAAG,CAACwK,OAAO,EAAE,KAAK,CAAC;YAClC;UACF,CAAC,CAAC;QACJ;MACF,CAAC;MACD,aAAa,EAAE;QACbvE,EAAE,EAAE,aAAa;QACjBoD,KAAK,EAAEZ,aAAa,CAAC1C,QAAQ,CAACm+C,IAAI,CAAC;QACnCx/B,OAAO,EAAE,IAAI,CAAC0gC,qBAAqB,CAAC1wC,IAAI,CAAC,IAAI,EAAE,IAAI;MACrD,CAAC;MACD,eAAe,EAAE;QACfzO,EAAE,EAAE,eAAe;QACnBoD,KAAK,EAAEZ,aAAa,CAAC1C,QAAQ,CAACo+C,MAAM,CAAC;QACrCz/B,OAAO,EAAE,IAAI,CAAC0gC,qBAAqB,CAAC1wC,IAAI,CAAC,IAAI,EAAE,IAAI;MACrD,CAAC;MACD,cAAc,EAAE;QACdzO,EAAE,EAAE,cAAc;QAClBoD,KAAK,EAAEZ,aAAa,CAAC1C,QAAQ,CAACovB,KAAK,CAAC;QACpCzQ,OAAO,EAAE,IAAI,CAAC0gC,qBAAqB,CAAC1wC,IAAI,CAAC,IAAI,EAAE,KAAK;MACtD,CAAC;MACD,gBAAgB,EAAE;QAChBzO,EAAE,EAAE,gBAAgB;QACpBoD,KAAK,EAAEZ,aAAa,CAAC1C,QAAQ,CAACy+C,OAAO,CAAC;QACtC9/B,OAAO,EAAE,IAAI,CAAC0gC,qBAAqB,CAAC1wC,IAAI,CAAC,IAAI,EAAE,KAAK;MACtD;IACF,CAAC;EACH;EAEA2W,iBAAiB,GAAG;IAClB7qB,QAAQ,CAAC+qB,gBAAgB,CAAC,WAAW,EAAE,IAAI,CAACs5B,eAAe,EAAE,KAAK,CAAC;IACnErkD,QAAQ,CAAC+qB,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAACu5B,eAAe,EAAE,KAAK,CAAC;EACjE;EAEAjkC,oBAAoB,GAAG;IACrBrgB,QAAQ,CAACgrB,mBAAmB,CAAC,WAAW,EAAE,IAAI,CAACq5B,eAAe,EAAE,KAAK,CAAC;IACtErkD,QAAQ,CAACgrB,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAACs5B,eAAe,EAAE,KAAK,CAAC;EACpE;EAEAD,eAAe,CAACvtC,CAAC,EAAE;IACjB,IAAI,IAAI,CAACkoB,OAAO,CAACvK,OAAO,CAACqwB,QAAQ,CAAChuC,CAAC,CAACyF,MAAM,CAAC,EAAE;MAC3C;IACF;IACAzF,CAAC,CAACC,cAAc,EAAE;IAClBD,CAAC,CAACua,eAAe,EAAE;IACnB,IAAI,CAACrd,KAAK,CAAC+wC,IAAI,EAAE;EACnB;EAEAT,eAAe,CAACxtC,CAAC,EAAE;IACjB,IAAIA,CAAC,CAACkuC,OAAO,KAAK,EAAE,EAAE;MACpB,IAAI,CAAChxC,KAAK,CAAC+wC,IAAI,EAAE;IACnB;EACF;EAEArD,WAAW,CAAC5qC,CAAC,EAAE;IACbA,CAAC,CAACC,cAAc,EAAE;IAClBD,CAAC,CAACua,eAAe,EAAE;IACnB,IAAI,CAACrd,KAAK,CAAC+wC,IAAI,EAAE;IACjB,IAAI1iD,IAAI,GAAG,IAAI,CAAC2R,KAAK,CAAC/R,KAAK,CAAC6U,CAAC,CAAC4hB,aAAa,CAACC,OAAO,CAAClzB,EAAE,CAAC;IACvD,IAAI,OAAOpD,IAAI,IAAI,QAAQ,EAAE;MAC3BA,IAAI,GAAG,IAAI,CAACkiD,SAAS,CAACliD,IAAI,CAAC;IAC7B;IAEA,IAAI,CAACA,IAAI,EAAE;MACTG,OAAO,CAAClB,KAAK,CAAC,sBAAsB,EAAEwV,CAAC,CAAC4hB,aAAa,CAACC,OAAO,CAAClzB,EAAE,CAAC;IACnE,CAAC,MAAM;MACL,IAAI,CAACuO,KAAK,CAAC2tC,QAAQ,CACjBt/C,IAAI,CAACoD,EAAE,EACPpD,IAAI,CAAC6hB,OAAO,CAAC,IAAI,CAAClQ,KAAK,CAACnI,MAAM,EAAE,IAAI,CAACmI,KAAK,CAAChS,OAAO,CAAC,EACnD,IAAI,CAACgS,KAAK,CAACnI,MAAM,CAAC;IACtB;EACF;EAIA44C,cAAc,CAACtxB,GAAG,EAAE8xB,IAAI,EAAEp5C,MAAM,EAAE24C,YAAY,EAAE;IAC9C,MAAMt3C,KAAK,GAAG,IAAI,CAAC8G,KAAK,CAACqB,MAAM,CAAC+K,QAAQ,CAACvU,MAAM,CAACkY,SAAS,CAAC;IAC1D,IAAI,CAAC7W,KAAK,EAAE;MACV1K,OAAO,CAACuH,IAAI,CAAC,mBAAmB,EAAE8B,MAAM,CAACkY,SAAS,CAAC;MACnD;IACF;IAMA,IAAI,CAACoP,GAAG,IAAIjmB,KAAK,CAACg4C,UAAU,CAACr5C,MAAM,CAAC4hB,GAAG,CAAC,EAAE;MACxC;IACF;IAEA,MAAMxkB,OAAO,GAAGkqB,GAAG,GACjBjmB,KAAK,CAACmgC,cAAc,CAAC4X,IAAI,CAAC,GAC1Bp5C,MAAM,CAAC3I,OAAO,GAAG,CAAC,GAChBgK,KAAK,CAACi4C,gBAAgB,CAACt5C,MAAM,CAAC3I,OAAO,EAAE+hD,IAAI,CAAC,GAC5C/3C,KAAK,CAACoiB,eAAe,CAAC,CAACzjB,MAAM,CAAC4hB,GAAG,CAAC,EAAEw3B,IAAI,CAAC;IAE7C,OAAOh8C,OAAO,CAACU,KAAK,CAACnK,GAAG,IAAI;MAC1B,IAAIglD,YAAY,EAAE;QAChBA,YAAY,CAAChlD,GAAG,CAACwK,OAAO,EAAE,KAAK,CAAC;MAClC;IACF,CAAC,CAAC;EACJ;EAGA06C,YAAY,CAAC74C,MAAM,EAAE24C,YAAY,EAAE;IACjC,MAAMt3C,KAAK,GAAG,IAAI,CAAC8G,KAAK,CAACqB,MAAM,CAAC+K,QAAQ,CAACvU,MAAM,CAACkY,SAAS,CAAC;IAE1D,IAAI,CAAC7W,KAAK,IAAI,CAACA,KAAK,CAACk4C,YAAY,CAACv5C,MAAM,CAAC4hB,GAAG,CAAC,EAAE;MAC7C;IACF;IACA,MAAM6C,GAAG,GAAGpjB,KAAK,CAACq+B,aAAa,CAAC1/B,MAAM,CAAC2hB,OAAO,EAAE,KAAK,CAAC;IACtD,OAAOtgB,KAAK,CAACy+B,YAAY,CAACrb,GAAG,CAAC,CAAC3mB,KAAK,CAACnK,GAAG,IAAI;MAC1C,IAAIglD,YAAY,EAAE;QAChBA,YAAY,CAAChlD,GAAG,CAACwK,OAAO,EAAE,KAAK,CAAC;MAClC;IACF,CAAC,CAAC;EACJ;EAGA46C,qBAAqB,CAAChgC,IAAI,EAAE/Y,MAAM,EAAE24C,YAAY,EAAE;IAChD,MAAMt3C,KAAK,GAAG,IAAI,CAAC8G,KAAK,CAACqB,MAAM,CAAC+K,QAAQ,CAACvU,MAAM,CAACkY,SAAS,CAAC;IAC1D,IAAI,CAAC7W,KAAK,EAAE;MACV1K,OAAO,CAACuH,IAAI,CAAC,iBAAiB,EAAE8B,MAAM,CAACkY,SAAS,CAAC;MACjD;IACF;IAEA,IAAIviB,MAAM,GAAG0L,KAAK,CAACogC,UAAU,CAACzhC,MAAM,CAACsX,IAAI,EAAEyB,IAAI,CAAC;IAChD,IAAI4/B,YAAY,EAAE;MAChBhjD,MAAM,GAAGA,MAAM,CAACmI,KAAK,CAACnK,GAAG,IAAIglD,YAAY,CAAChlD,GAAG,CAACwK,OAAO,EAAE,KAAK,CAAC,CAAC;IAChE;IACA,OAAOxI,MAAM;EACf;EAEAmjD,cAAc,CAAC94C,MAAM,EAAE24C,YAAY,EAAE;IACnC34C,MAAM,CAAC2yC,SAAS,CAAC3yC,MAAM,CAAC4hB,GAAG,EAAE5hB,MAAM,CAAC2hB,OAAO,EAAE3hB,MAAM,CAAC4lB,QAAQ,EAAE5lB,MAAM,CAAC6lB,QAAQ,EAAE8yB,YAAY,CAAC;EAC9F;EAEA/F,WAAW,CAAC5yC,MAAM,EAAE24C,YAAY,EAAE;IAChC34C,MAAM,CAAC4yC,WAAW,CAAC5yC,MAAM,CAAC3I,OAAO,IAAI2I,MAAM,CAAC4hB,GAAG,EAAE5hB,MAAM,CAAC2hB,OAAO,EAAEg3B,YAAY,CAAC;EAChF;EAEAhwC,MAAM,GAAG;IACP,MAAM6wC,IAAI,GAAG,EAAE;IACf,IAAI31C,KAAK,GAAG,CAAC;IACb,IAAI,CAACsE,KAAK,CAAC/R,KAAK,CAACoF,GAAG,CAAEhF,IAAI,IAAK;MAC7B,IAAI,OAAOA,IAAI,IAAI,QAAQ,EAAE;QAC3BA,IAAI,GAAG,IAAI,CAACkiD,SAAS,CAACliD,IAAI,CAAC;MAC7B;MACA,IAAIA,IAAI,IAAIA,IAAI,CAACwG,KAAK,EAAE;QACtBw8C,IAAI,CAAC7gD,IAAI,CACPnC,IAAI,CAACwG,KAAK,IAAI,GAAG,GACf;UAAI,SAAS,EAAC,WAAW;UAAC,GAAG,EAAE6G;QAAM,EAAG,GAExC;UAAI,OAAO,EAAE,IAAI,CAACgyC,WAAY;UAAC,WAAShyC,KAAM;UAAC,GAAG,EAAEA;QAAM,GAAErN,IAAI,CAACwG,KAAK,CAAM,CAC/E;MACH;MACA6G,KAAK,EAAE;IACT,CAAC,CAAC;IAGF,MAAM41C,KAAK,GAAG,EAAE,GAAGxqD,gDAAQ;IAC3B,MAAMyqD,KAAK,GAAGzqD,gDAAQ,IAAI,GAAG,GAAGuqD,IAAI,CAAC5kD,MAAM,GAAG,GAAG,CAAC;IAClD,MAAMM,IAAI,GAAI,IAAI,CAACiT,KAAK,CAACwxC,MAAM,CAACC,KAAK,GAAG,IAAI,CAACzxC,KAAK,CAAC0xC,OAAO,CAACvhC,CAAC,GAAGmhC,KAAK,GAC/D,IAAI,CAACtxC,KAAK,CAAC0xC,OAAO,CAACvhC,CAAC,GAAG,IAAI,CAACnQ,KAAK,CAACwxC,MAAM,CAACzkD,IAAI,GAAGukD,KAAK,GACrD,IAAI,CAACtxC,KAAK,CAAC0xC,OAAO,CAACvhC,CAAC,GAAG,IAAI,CAACnQ,KAAK,CAACwxC,MAAM,CAACzkD,IAAK;IACnD,MAAMC,GAAG,GAAI,IAAI,CAACgT,KAAK,CAACwxC,MAAM,CAACG,MAAM,GAAG,IAAI,CAAC3xC,KAAK,CAAC0xC,OAAO,CAACthC,CAAC,GAAGmhC,KAAK,GAC/D,IAAI,CAACvxC,KAAK,CAAC0xC,OAAO,CAACthC,CAAC,GAAG,IAAI,CAACpQ,KAAK,CAACwxC,MAAM,CAACxkD,GAAG,GAAGukD,KAAK,GACpD,IAAI,CAACvxC,KAAK,CAAC0xC,OAAO,CAACthC,CAAC,GAAG,IAAI,CAACpQ,KAAK,CAACwxC,MAAM,CAACxkD,GAAI;IAElD,MAAM4kD,QAAQ,GAAG;MACf7kD,IAAI,EAAEA,IAAI,GAAG,IAAI;MACjBC,GAAG,EAAEA,GAAG,GAAG;IACb,CAAC;IAED,OACE;MAAI,SAAS,EAAC,MAAM;MAAC,KAAK,EAAE4kD,QAAS;MAAC,GAAG,EAAE,IAAI,CAAC5mB;IAAQ,GACrDqmB,IAAI,CACF;EAET;AACF;AAEA,iEAAexwC,sDAAU,CAACkpB,WAAW,CAAC;;;;;;;;;;;;;;;;;;;;AC5eZ;AACoB;AACL;AACmB;AAE7C,MAAMlmB,cAAc,SAASpT,4DAAmB,CAAC;EAC9DsP,WAAW,CAACC,KAAK,EAAE;IACjB,KAAK,CAACA,KAAK,CAAC;IAEZ,IAAI,CAACrM,KAAK,GAAG;MACX0T,GAAG,EAAE,EAAE;MACPD,KAAK,EAAE;IACT,CAAC;IAED,IAAI,CAACiB,YAAY,GAAG,IAAI,CAACA,YAAY,CAACnI,IAAI,CAAC,IAAI,CAAC;IAChD,IAAI,CAAC2H,iBAAiB,GAAG,IAAI,CAACA,iBAAiB,CAAC3H,IAAI,CAAC,IAAI,CAAC;IAC1D,IAAI,CAAC4H,iBAAiB,GAAG,IAAI,CAACA,iBAAiB,CAAC5H,IAAI,CAAC,IAAI,CAAC;EAC5D;EAEA2xC,iBAAiB,CAACC,GAAG,EAAE;IACrB,MAAMjtC,MAAM,GAAGnB,mFAAgB,CAACouC,GAAG,CAAC;IACpC,OAAOjtC,MAAM,GAAGA,MAAM,CAACC,mBAAmB,EAAE,GAAGgtC,GAAG;EACpD;EAEAjqC,iBAAiB,CAAC/E,CAAC,EAAE;IACnB,IAAI,CAACR,QAAQ,CAAC;MAAC8E,KAAK,EAAEtE,CAAC,CAACyF,MAAM,CAAC3R;IAAK,CAAC,CAAC;EACxC;EAEAkR,iBAAiB,CAACjD,MAAM,EAAE;IACxBrW,OAAO,CAACiW,GAAG,CAAC,mBAAmB,EAAEI,MAAM,CAAC;IACxC,IAAI,CAACvC,QAAQ,CAAC;MAAC+E,GAAG,EAAExC;IAAM,CAAC,CAAC;EAC9B;EAEAwD,YAAY,CAACvF,CAAC,EAAE;IACdA,CAAC,CAACC,cAAc,EAAE;IAClB,MAAMnM,KAAK,GAAG,IAAI,CAACoJ,KAAK,CAAC40B,MAAM,IAAI,OAAO,GAAG,IAAI,CAACjhC,KAAK,CAACyT,KAAK,GAAG,IAAI,CAACzT,KAAK,CAAC0T,GAAG;IAC9E7Y,OAAO,CAACiW,GAAG,CAAC,cAAc,EAAE7N,KAAK,CAAC;IAClC,IAAIA,KAAK,EAAE;MACT,IAAI,CAACoJ,KAAK,CAAC+7B,QAAQ,CAACnlC,KAAK,CAAC;IAC5B;EACF;EAEA4J,MAAM,GAAG;IACP,OAAQ;MAAM,SAAS,EAAC,mBAAmB;MAAC,QAAQ,EAAE,IAAI,CAAC6H;IAAa,GACrE,IAAI,CAACrI,KAAK,CAAC40B,MAAM,IAAI,OAAO,GAC3B,0HAAE;MAAK,SAAS,EAAC;IAAgB,GAC/B;MAAO,SAAS,EAAC;IAAO,GAAC,2DAAC,wDAAgB;MAAC,EAAE,gBAAe;MAAC,cAAc;QAAA;QAAA;MAAA;IAAe,EACzC,CAAQ,CACrD,EACN;MAAK,SAAS,EAAC;IAAO,GACpB;MAAO,SAAS,EAAC;IAAY,GAC3B,2DAAC,wDAAgB;MAAC,EAAE,iBAAgB;MAAC,cAAc;QAAA;QAAA;MAAA;IAAgB,EAAqC,CAClG,CACJ,CAAG,GACT,IAAI,CAAC50B,KAAK,CAAC40B,MAAM,IAAI,KAAK,GAC5B,0HAAE;MAAK,SAAS,EAAC;IAAgB,GAC/B;MAAO,SAAS,EAAC;IAAO,GAAC,2DAAC,wDAAgB;MAAC,EAAE,iBAAgB;MAAC,cAAc;QAAA;QAAA;MAAA;IAAsB,EAC3C,CAAQ,CACzD,EACN;MAAK,SAAS,EAAC;IAAO,GACpB;MAAO,SAAS,EAAC;IAAY,GAC3B,2DAAC,wDAAgB;MAAC,EAAE,iBAAgB;MAAC,cAAc;QAAA;QAAA;MAAA;IAAuB,EAAqC,CACzG,CACJ,CAAG,GACT,IAAI,EACN;MAAK,SAAS,EAAC;IAAgB,GAC7B;MAAI,SAAS,EAAC;IAAQ,GAAE,IAAI,CAACid,iBAAiB,CAAC,IAAI,CAAC7xC,KAAK,CAACxM,GAAG,CAAC,CAAM,CAChE,EACL,IAAI,CAACwM,KAAK,CAAC40B,MAAM,IAAI,OAAO,GAC3B,0HAAE;MAAK,SAAS,EAAC;IAAO,GACtB;MAAO,SAAS,EAAC;IAAY,GAAC,2DAAC,wDAAgB;MAAC,EAAE,aAAY;MAAC,cAAc;QAAA;QAAA;MAAA;IAAY,EACvC,CAAQ,CACtD,EACN;MAAK,SAAS,EAAC;IAAO,GACpB,2DAAC,wDAAgB;MAAC,EAAE,gBAAe;MAAC,cAAc;QAAA;QAAA;MAAA;IAA+B,GAE9EvrB,YAAY,IAAK;MAAO,IAAI,EAAC,OAAO;MAAC,WAAW,EAAEA,YAAa;MAAC,YAAY,EAAC,OAAO;MACnF,KAAK,EAAE,IAAI,CAAC1V,KAAK,CAACyT,KAAM;MAAC,QAAQ,EAAE,IAAI,CAACS,iBAAkB;MAAC,QAAQ;IAAA,EAAE,CACrD,CAChB,CAAG,GACP,IAAI,CAAC7H,KAAK,CAAC40B,MAAM,IAAI,KAAK,GAC5B,0HAAE;MAAK,SAAS,EAAC;IAAO,GACtB;MAAO,SAAS,EAAC;IAAY,GAAC,2DAAC,wDAAgB;MAAC,EAAE,oBAAmB;MAAC,cAAc;QAAA;QAAA;MAAA;IAAmB,EAC1C,CAAQ,CACjE,EACN;MAAK,SAAS,EAAC;IAAgB,GAC7B,2DAAC,uDAAS;MACR,SAAS,EAAE,IAAK;MAChB,qBAAqB,EAAE,IAAI,CAAC50B,KAAK,CAAC4E,qBAAsB;MACxD,QAAQ,EAAE,IAAI,CAACkD;IAAkB,EAAG,CAClC,CAAG,GACT,IAAI,EACN;MAAK,SAAS,EAAC;IAAgB,GAC7B;MAAQ,SAAS,EAAC,WAAW;MAAC,OAAO,EAAE,IAAI,CAAC9H,KAAK,CAACooB;IAAS,GACzD,2DAAC,wDAAgB;MAAC,EAAE,iBAAgB;MAAC,cAAc;QAAA;QAAA;MAAA;IAAS,EAAiC,CACtF,EACT;MAAQ,SAAS,EAAC,SAAS;MAAC,IAAI,EAAC;IAAQ,GACvC,2DAAC,wDAAgB;MAAC,EAAE,aAAY;MAAC,cAAc;QAAA;QAAA;MAAA;IAAK,EAA6B,CAC1E,CACL,CACD;EACT;AACF;;;;;;;;;;;;;;;;ACtG0B;AAE1B,MAAM2pB,gBAAgB,GAAG,GAAG;AAEb,MAAMxR,OAAO,SAAS9vC,wDAAe,CAAC;EACnDsP,WAAW,CAACC,KAAK,EAAE;IACjB,KAAK,CAACA,KAAK,CAAC;IAEZ,IAAI,CAACrM,KAAK,GAAG;MAEXq+C,IAAI,EAAE,CAAC;MACPC,IAAI,EAAE,CAAC;MAEPC,OAAO,EAAE,CAAC;MACVC,OAAO,EAAE,CAAC;MAEVC,IAAI,EAAE,CAAC;MAEPC,OAAO,EAAE,CAAC;MACVC,OAAO,EAAEP;IACX,CAAC;IAID,IAAI,CAACQ,OAAO,GAAG9hD,sDAAe,EAAE;IAEhC,IAAI,CAAC+hD,MAAM,GAAG/hD,sDAAe,EAAE;IAE/B,IAAI,CAACoC,OAAO,GAAGpC,sDAAe,EAAE;IAEhC,IAAI,CAACgiD,WAAW,GAAGhiD,sDAAe,EAAE;IAGpC,IAAI,CAACiiD,UAAU,GAAG,CAAC;IACnB,IAAI,CAACC,WAAW,GAAG,CAAC;IAGpB,IAAI,CAACC,MAAM,GAAG,CAAC;IACf,IAAI,CAACC,MAAM,GAAG,CAAC;IAEf,IAAI,CAACC,YAAY,GAAG,CAAC;IAGrB,IAAI,CAACC,UAAU,GAAG,CAAC,CAAC;IACpB,IAAI,CAACC,QAAQ,GAAG,CAAC,CAAC;IAElB,IAAI,CAACd,OAAO,GAAG,CAAC;IAChB,IAAI,CAACC,OAAO,GAAG,CAAC;IAEhB,IAAI,CAACc,WAAW,GAAG,IAAI,CAACA,WAAW,CAAC/yC,IAAI,CAAC,IAAI,CAAC;IAC9C,IAAI,CAACgzC,MAAM,GAAG,IAAI,CAACA,MAAM,CAAChzC,IAAI,CAAC,IAAI,CAAC;IACpC,IAAI,CAACizC,UAAU,GAAG,IAAI,CAACA,UAAU,CAACjzC,IAAI,CAAC,IAAI,CAAC;IAC5C,IAAI,CAACkzC,SAAS,GAAG,IAAI,CAACA,SAAS,CAAClzC,IAAI,CAAC,IAAI,CAAC;IAC1C,IAAI,CAACmzC,OAAO,GAAG,IAAI,CAACA,OAAO,CAACnzC,IAAI,CAAC,IAAI,CAAC;IACtC,IAAI,CAACozC,SAAS,GAAG,IAAI,CAACA,SAAS,CAACpzC,IAAI,CAAC,IAAI,CAAC;IAC1C,IAAI,CAACqzC,UAAU,GAAG,IAAI,CAACA,UAAU,CAACrzC,IAAI,CAAC,IAAI,CAAC;IAC5C,IAAI,CAACszC,WAAW,GAAG,IAAI,CAACA,WAAW,CAACtzC,IAAI,CAAC,IAAI,CAAC;IAC9C,IAAI,CAACuzC,SAAS,GAAG,IAAI,CAACA,SAAS,CAACvzC,IAAI,CAAC,IAAI,CAAC;EAC5C;EAEA2W,iBAAiB,GAAG;IAClB,IAAI,CAAC07B,OAAO,CAAC9xB,OAAO,CAAC1J,gBAAgB,CAAC,WAAW,EAAE,IAAI,CAACq8B,SAAS,EAAE;MAAEM,OAAO,EAAE;IAAK,CAAC,CAAC;IACrF,IAAI,CAACnB,OAAO,CAAC9xB,OAAO,CAAC1J,gBAAgB,CAAC,YAAY,EAAE,IAAI,CAACq8B,SAAS,EAAE;MAAEM,OAAO,EAAE;IAAK,CAAC,CAAC;IAGtF,IAAI,CAACV,QAAQ,GAAG,IAAI,CAACP,WAAW,CAAChyB,OAAO,CAAC+Y,qBAAqB,EAAE;IAEhE,IAAI,CAAC0Y,OAAO,GAAG,IAAI,CAACc,QAAQ,CAACzpD,KAAK,GAAG,CAAC;IACtC,IAAI,CAAC4oD,OAAO,GAAG,IAAI,CAACa,QAAQ,CAACxpD,MAAM,GAAG,CAAC;IAGvC,IAAI,CAACupD,UAAU,GAAG,IAAI,CAACP,MAAM,CAAC/xB,OAAO,CAAC+Y,qBAAqB,EAAE;EAC/D;EAEAntB,oBAAoB,GAAG;IACrB,IAAI,CAACkmC,OAAO,CAAC9xB,OAAO,CAACzJ,mBAAmB,CAAC,WAAW,EAAE,IAAI,CAACo8B,SAAS,CAAC;IACrE,IAAI,CAACb,OAAO,CAAC9xB,OAAO,CAACzJ,mBAAmB,CAAC,YAAY,EAAE,IAAI,CAACo8B,SAAS,CAAC;EACxE;EAGAI,WAAW,CAACxB,IAAI,EAAEC,IAAI,EAAEG,IAAI,EAAE;IAE5B,IAAI,CAAC9vC,QAAQ,CAAC;MACZ0vC,IAAI,EAAEA,IAAI;MACVC,IAAI,EAAEA,IAAI;MACVG,IAAI,EAAEA,IAAI;MACVF,OAAO,EAAE,IAAI,CAACA,OAAO,GAAGF,IAAI;MAC5BG,OAAO,EAAE,IAAI,CAACA,OAAO,GAAGF;IAC1B,CAAC,CAAC;IAGF,MAAMllD,IAAI,GAAG,CAAC,IAAI,CAACmlD,OAAO,GAAGF,IAAI,IAAII,IAAI,GAAG,IAAI,CAACF,OAAO;IACxD,MAAMllD,GAAG,GAAG,CAAC,IAAI,CAACmlD,OAAO,GAAGF,IAAI,IAAIG,IAAI,GAAG,IAAI,CAACD,OAAO;IACvD,IAAI,CAACnyC,KAAK,CAACwrC,QAAQ,CACjB,CAACz+C,IAAI,GAAG,IAAI,CAACgmD,UAAU,CAAChmD,IAAI,GAAG,IAAI,CAACimD,QAAQ,CAACjmD,IAAI,IAAIqlD,IAAI,EACzD,CAACplD,GAAG,GAAG,IAAI,CAAC+lD,UAAU,CAAC/lD,GAAG,GAAG,IAAI,CAACgmD,QAAQ,CAAChmD,GAAG,IAAIolD,IAAI,EACtD,IAAI,CAACW,UAAU,CAACxpD,KAAK,GAAG6oD,IAAI,EAC5B,IAAI,CAACW,UAAU,CAACvpD,MAAM,GAAG4oD,IAAI,EAC7BA,IAAI,CAAC;EACT;EAGA,OAAOuB,UAAU,CAACC,OAAO,EAAExoD,GAAG,EAAEonD,MAAM,EAAEqB,KAAK,EAAE;IAC7C,IAAIC,QAAQ,GAAGlqD,IAAI,CAACC,GAAG,CAAC,CAAC,EAAE2oD,MAAM,CAAC,CAAC,CAAC,GAAGpnD,GAAG,CAAC,CAAC,CAAC,GAAGyoD,KAAK,EAAEzoD,GAAG,CAAC,CAAC,CAAC,GAAGonD,MAAM,CAAC,CAAC,CAAC,GAAGqB,KAAK,CAAC;IAClF,IAAIC,QAAQ,IAAI,CAAC,EAAE;MAEjBF,OAAO,IAAIC,KAAK;IAClB,CAAC,MAAM,IAAIjqD,IAAI,CAACC,GAAG,CAAC,CAAC,EAAE2oD,MAAM,CAAC,CAAC,CAAC,GAAGpnD,GAAG,CAAC,CAAC,CAAC,EAAEA,GAAG,CAAC,CAAC,CAAC,GAAGonD,MAAM,CAAC,CAAC,CAAC,CAAC,GAAGsB,QAAQ,EAAE;MAEzEF,OAAO,IAAIC,KAAK;IAClB;IACA,OAAOD,OAAO;EAChB;EAEAX,WAAW,GAAG;IAEZ,MAAMc,OAAO,GAAG,IAAI,CAAClhD,OAAO,CAAC4tB,OAAO,CAAC+Y,qBAAqB,EAAE;IAE5D,IAAI,CAACkZ,UAAU,GAAGqB,OAAO,CAACxqD,KAAK;IAC/B,IAAI,CAACopD,WAAW,GAAGoB,OAAO,CAACvqD,MAAM;IAGjC,MAAM6oD,OAAO,GAAGzoD,IAAI,CAAC4K,GAAG,CAAC,IAAI,CAACu+C,UAAU,CAACxpD,KAAK,GAAGwqD,OAAO,CAACxqD,KAAK,EAAE,IAAI,CAACwpD,UAAU,CAACvpD,MAAM,GAAGuqD,OAAO,CAACvqD,MAAM,CAAC;IACxG,IAAI,CAAC8Y,QAAQ,CAAC;MACZ+vC,OAAO,EAAEA,OAAO;MAChBC,OAAO,EAAE1oD,IAAI,CAAC4K,GAAG,CAACu9C,gBAAgB,EAAEM,OAAO,GAAG,CAAC;IACjD,CAAC,CAAC;IAGF,MAAMD,IAAI,GAAGxoD,IAAI,CAAC4K,GAAG,CAAC,IAAI,CAACw+C,QAAQ,CAACzpD,KAAK,GAAGwqD,OAAO,CAACxqD,KAAK,EAAE,IAAI,CAACypD,QAAQ,CAACxpD,MAAM,GAAGuqD,OAAO,CAACvqD,MAAM,CAAC;IAEjG,MAAMwoD,IAAI,GAAG,IAAI,CAACe,UAAU,CAAChmD,IAAI,GAAG,IAAI,CAACimD,QAAQ,CAACjmD,IAAI,GACpD,CAACgnD,OAAO,CAACxqD,KAAK,GAAG,IAAI,CAACwpD,UAAU,CAACxpD,KAAK,IAAI,CAAC;IAC7C,MAAM0oD,IAAI,GAAG,IAAI,CAACc,UAAU,CAAC/lD,GAAG,GAAG,IAAI,CAACgmD,QAAQ,CAAChmD,GAAG,GAClD,CAAC+mD,OAAO,CAACvqD,MAAM,GAAG,IAAI,CAACupD,UAAU,CAACvpD,MAAM,IAAI,CAAC;IAE/C,IAAI,CAACgqD,WAAW,CAACxB,IAAI,EAAEC,IAAI,EAAEG,IAAI,CAAC;EACpC;EAEAc,MAAM,CAACpwC,CAAC,EAAE;IACR,IAAI,CAACqwC,UAAU,CAACrwC,CAAC,CAACyF,MAAM,CAAC3R,KAAK,CAAC;EACjC;EAEAu8C,UAAU,CAACf,IAAI,EAAE;IACf,IAAIJ,IAAI,GAAG,IAAI,CAACr+C,KAAK,CAACq+C,IAAI;IAC1B,IAAIC,IAAI,GAAG,IAAI,CAACt+C,KAAK,CAACs+C,IAAI;IAI1B,MAAM+B,OAAO,GAAG,IAAI,CAAC9B,OAAO,GAAG,CAAC,IAAI,CAACA,OAAO,GAAGF,IAAI,IAAII,IAAI;IAC3D,MAAM6B,QAAQ,GAAGD,OAAO,GAAG,IAAI,CAACtB,UAAU,GAAGN,IAAI;IAEjD,MAAM8B,MAAM,GAAG,IAAI,CAACnB,UAAU,CAAChmD,IAAI,GAAG,IAAI,CAACimD,QAAQ,CAACjmD,IAAI;IACxD,MAAMonD,OAAO,GAAGD,MAAM,GAAG,IAAI,CAACnB,UAAU,CAACxpD,KAAK;IAC9C,IAAI2qD,MAAM,GAAGF,OAAO,EAAE;MACpBhC,IAAI,IAAIgC,OAAO,GAAGE,MAAM;IAC1B,CAAC,MAAM,IAAIC,OAAO,GAAGF,QAAQ,EAAE;MAC7BjC,IAAI,IAAImC,OAAO,GAAGF,QAAQ;IAC5B;IACA,MAAMG,MAAM,GAAG,IAAI,CAACjC,OAAO,GAAG,CAAC,IAAI,CAACA,OAAO,GAAGF,IAAI,IAAIG,IAAI;IAC1D,MAAMiC,SAAS,GAAGD,MAAM,GAAG,IAAI,CAACzB,WAAW,GAAGP,IAAI;IAClD,MAAMkC,KAAK,GAAG,IAAI,CAACvB,UAAU,CAAC/lD,GAAG,GAAG,IAAI,CAACgmD,QAAQ,CAAChmD,GAAG;IACrD,MAAMunD,QAAQ,GAAGD,KAAK,GAAG,IAAI,CAACvB,UAAU,CAACvpD,MAAM;IAC/C,IAAI8qD,KAAK,GAAGF,MAAM,EAAE;MAClBnC,IAAI,IAAImC,MAAM,GAAGE,KAAK;IACxB,CAAC,MAAM,IAAIC,QAAQ,GAAGF,SAAS,EAAE;MAC/BpC,IAAI,IAAIsC,QAAQ,GAAGF,SAAS;IAC9B;IAEA,IAAI,CAACb,WAAW,CAACxB,IAAI,EAAEC,IAAI,EAAEG,IAAI,CAAC;EACpC;EAEAgB,SAAS,CAACtwC,CAAC,EAAE;IACX,IAAIA,CAAC,CAAC0xC,OAAO,EAAE;MACb,IAAI,CAAC5B,MAAM,GAAG9vC,CAAC,CAAC0xC,OAAO,CAAC,CAAC,CAAC,CAACj3B,KAAK;MAChC,IAAI,CAACs1B,MAAM,GAAG/vC,CAAC,CAAC0xC,OAAO,CAAC,CAAC,CAAC,CAACl3B,KAAK;IAClC,CAAC,MAAM;MACL,IAAI,CAACs1B,MAAM,GAAG9vC,CAAC,CAACya,KAAK;MACrB,IAAI,CAACs1B,MAAM,GAAG/vC,CAAC,CAACwa,KAAK;IACvB;IAEAltB,MAAM,CAAC2mB,gBAAgB,CAAC,WAAW,EAAE,IAAI,CAACu8B,SAAS,EAAE;MAAEI,OAAO,EAAE;IAAM,CAAC,CAAC;IACxEtjD,MAAM,CAAC2mB,gBAAgB,CAAC,WAAW,EAAE,IAAI,CAACw8B,UAAU,EAAE;MAAEG,OAAO,EAAE;IAAM,CAAC,CAAC;IACzEtjD,MAAM,CAAC2mB,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAACs8B,OAAO,EAAE;MAAEK,OAAO,EAAE;IAAK,CAAC,CAAC;IACnEtjD,MAAM,CAAC2mB,gBAAgB,CAAC,UAAU,EAAE,IAAI,CAACs8B,OAAO,EAAE;MAAEK,OAAO,EAAE;IAAK,CAAC,CAAC;IAEpE1nD,QAAQ,CAAC+H,IAAI,CAAC/B,KAAK,CAAC,YAAY,CAAC,GAAG,MAAM;EAC5C;EAGAyhD,SAAS,CAACl2B,KAAK,EAAED,KAAK,EAAE;IACtB,MAAMm3B,EAAE,GAAGl3B,KAAK,GAAG,IAAI,CAACq1B,MAAM;IAC9B,MAAM8B,EAAE,GAAGp3B,KAAK,GAAG,IAAI,CAACu1B,MAAM;IAE9B,IAAI,CAACD,MAAM,GAAGr1B,KAAK;IACnB,IAAI,CAACs1B,MAAM,GAAGv1B,KAAK;IAGnB,MAAMy2B,OAAO,GAAG,IAAI,CAAClhD,OAAO,CAAC4tB,OAAO,CAAC+Y,qBAAqB,EAAE;IAG5D,IAAIwY,IAAI,GAAGzR,OAAO,CAACoT,UAAU,CAAC,IAAI,CAAChgD,KAAK,CAACq+C,IAAI,EAAE,CAAC+B,OAAO,CAAChnD,IAAI,EAAEgnD,OAAO,CAACtC,KAAK,CAAC,EAC1E,CAAC,IAAI,CAACsB,UAAU,CAAChmD,IAAI,EAAE,IAAI,CAACgmD,UAAU,CAACtB,KAAK,CAAC,EAAEgD,EAAE,CAAC;IACpD,IAAIxC,IAAI,GAAG1R,OAAO,CAACoT,UAAU,CAAC,IAAI,CAAChgD,KAAK,CAACs+C,IAAI,EAAE,CAAC8B,OAAO,CAAC/mD,GAAG,EAAE+mD,OAAO,CAACpC,MAAM,CAAC,EAC1E,CAAC,IAAI,CAACoB,UAAU,CAAC/lD,GAAG,EAAE,IAAI,CAAC+lD,UAAU,CAACpB,MAAM,CAAC,EAAE+C,EAAE,CAAC;IAEpD,IAAI,CAAClB,WAAW,CAACxB,IAAI,EAAEC,IAAI,EAAE,IAAI,CAACt+C,KAAK,CAACy+C,IAAI,CAAC;EAC/C;EAGAkB,SAAS,CAACxwC,CAAC,EAAE;IACXA,CAAC,CAACC,cAAc,EAAE;IAClB,IAAI,CAAC0wC,SAAS,CAAC3wC,CAAC,CAACya,KAAK,EAAEza,CAAC,CAACwa,KAAK,CAAC;EAClC;EAEAi2B,UAAU,CAACzwC,CAAC,EAAE;IACZA,CAAC,CAACC,cAAc,EAAE;IAElB,IAAID,CAAC,CAAC0xC,OAAO,CAAC/nD,MAAM,IAAI,CAAC,EAAE;MACzB,IAAI,CAACgnD,SAAS,CAAC3wC,CAAC,CAAC0xC,OAAO,CAAC,CAAC,CAAC,CAACj3B,KAAK,EAAEza,CAAC,CAAC0xC,OAAO,CAAC,CAAC,CAAC,CAACl3B,KAAK,CAAC;MACtD;IACF;IAGA,MAAM,CAACq3B,MAAM,EAAEC,MAAM,CAAC,GAAG9xC,CAAC,CAAC0xC,OAAO;IAClC,MAAMK,QAAQ,GAAGjrD,IAAI,CAACkrD,IAAI,CAAC,CAACH,MAAM,CAACp3B,KAAK,GAAGq3B,MAAM,CAACr3B,KAAK,KAAKo3B,MAAM,CAACp3B,KAAK,GAAGq3B,MAAM,CAACr3B,KAAK,CAAC,GACtF,CAACo3B,MAAM,CAACr3B,KAAK,GAAGs3B,MAAM,CAACt3B,KAAK,KAAKq3B,MAAM,CAACr3B,KAAK,GAAGs3B,MAAM,CAACt3B,KAAK,CAAC,CAAC;IAEhE,IAAI,CAAC,IAAI,CAACw1B,YAAY,EAAE;MACpB,IAAI,CAACA,YAAY,GAAG+B,QAAQ,GAAG,IAAI,CAAClhD,KAAK,CAACy+C,IAAI;IAClD;IAEA,IAAItoD,KAAK,GAAI+qD,QAAQ,GAAG,IAAI,CAAC/B,YAAa;IAC1C,IAAI,CAACK,UAAU,CAACvpD,IAAI,CAAC4K,GAAG,CAAC,IAAI,CAAC69C,OAAO,EAAEzoD,IAAI,CAACC,GAAG,CAAC,IAAI,CAACyoD,OAAO,EAAExoD,KAAK,CAAC,CAAC,CAAC;EACxE;EAEAupD,OAAO,CAACvwC,CAAC,EAAE;IACT1S,MAAM,CAAC4mB,mBAAmB,CAAC,WAAW,EAAE,IAAI,CAACs8B,SAAS,CAAC;IACvDljD,MAAM,CAAC4mB,mBAAmB,CAAC,WAAW,EAAE,IAAI,CAACu8B,UAAU,CAAC;IACxDnjD,MAAM,CAAC4mB,mBAAmB,CAAC,SAAS,EAAE,IAAI,CAACq8B,OAAO,CAAC;IACnDjjD,MAAM,CAAC4mB,mBAAmB,CAAC,UAAU,EAAE,IAAI,CAACq8B,OAAO,CAAC;IAEpDrnD,QAAQ,CAAC+H,IAAI,CAAC/B,KAAK,CAAC,YAAY,CAAC,GAAG,EAAE;IAEtC,IAAI,CAACwhD,WAAW,CAAC,IAAI,CAAC7/C,KAAK,CAACq+C,IAAI,EAAE,IAAI,CAACr+C,KAAK,CAACs+C,IAAI,EAAE,IAAI,CAACt+C,KAAK,CAACy+C,IAAI,CAAC;EACrE;EAEA5xC,MAAM,GAAG;IAEP,MAAMu0C,GAAG,GAAI,eAAc,IAAI,CAACphD,KAAK,CAACq+C,IAAK,OAAM,IAAI,CAACr+C,KAAK,CAACs+C,IAAK,gBAAe,IAAI,CAACt+C,KAAK,CAACy+C,IAAK,GAAE;IAElG,MAAM4C,IAAI,GAAI,GAAE,IAAI,CAACrhD,KAAK,CAACu+C,OAAQ,MAAK,IAAI,CAACv+C,KAAK,CAACw+C,OAAQ,IAAG;IAI9D,MAAMI,OAAO,GAAG;MACdvlD,GAAG,EAAG,GAAE,IAAI,CAACmlD,OAAO,GAAG,IAAI,CAACx+C,KAAK,CAACw+C,OAAO,GAAG,IAAI,CAACx+C,KAAK,CAACy+C,IAAK,IAAG;MAC/DrlD,IAAI,EAAG,GAAE,IAAI,CAACmlD,OAAO,GAAG,IAAI,CAACv+C,KAAK,CAACu+C,OAAO,GAAG,IAAI,CAACv+C,KAAK,CAACy+C,IAAK,IAAG;MAChE7oD,KAAK,EAAG,GAAE,IAAI,CAACmpD,UAAU,GAAG,IAAI,CAAC/+C,KAAK,CAACy+C,IAAK,IAAG;MAC/C5oD,MAAM,EAAG,GAAE,IAAI,CAACmpD,WAAW,GAAG,IAAI,CAACh/C,KAAK,CAACy+C,IAAK;IAChD,CAAC;IACD,OACE;MAAK,SAAS,EAAC;IAAS,GACtB;MAAK,SAAS,EAAC,cAAc;MAAC,GAAG,EAAE,IAAI,CAACK;IAAY,GAClD;MAAK,GAAG,EAAE,IAAI,CAACzyC,KAAK,CAACwgC,MAAO;MAAC,SAAS,EAAC,SAAS;MAAC,GAAG,EAAC,EAAE;MACrD,KAAK,EAAE;QAACyU,SAAS,EAAEF,GAAG;QAAEG,eAAe,EAAEF;MAAI,CAAE;MAAC,GAAG,EAAE,IAAI,CAACniD,OAAQ;MAAC,MAAM,EAAE,IAAI,CAACogD;IAAY,EAAG,EACjG;MAAK,SAAS,EAAC,eAAe;MAAC,GAAG,EAAE,IAAI,CAACT;IAAO,EAAG,EACnD;MAAK,SAAS,EAAC,SAAS;MAAC,KAAK,EAAED,OAAQ;MAAC,GAAG,EAAE,IAAI,CAACA;IAAQ,EAAG,CAC1D,EACN;MAAK,SAAS,EAAC;IAAc,GAC3B;MAAO,IAAI,EAAC,OAAO;MAAC,SAAS,EAAC,QAAQ;MACpC,IAAI,EAAC,OAAO;MAAC,GAAG,EAAE,IAAI,CAAC5+C,KAAK,CAAC0+C,OAAQ;MAAC,GAAG,EAAE,IAAI,CAAC1+C,KAAK,CAAC2+C,OAAQ;MAAC,KAAK,EAAE,IAAI,CAAC3+C,KAAK,CAACy+C,IAAK;MAAC,QAAQ,EAAE,IAAI,CAACc;IAAO,EAAG,CAC9G,CACF;EAEV;AACF;;;;;;;;;;;;;;;;;;;;ACtR0B;AACoB;AACQ;AAEkB;AAGxE,SAASiC,YAAY,CAAC/rD,IAAI,EAAE;EAE1B,MAAMgsD,UAAU,GAAG;IAACC,OAAO,EAAE,mBAAmB;IAAE3sC,KAAK,EAAE,OAAO;IAAEoU,IAAI,EAAE,aAAa;IAAED,KAAK,EAAE;EAAU,CAAC;EAEzG,OAAOu4B,UAAU,CAAChsD,IAAI,CAAC,IAAIgsD,UAAU,CAAC,CAAChsD,IAAI,IAAI,EAAE,EAAEqE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI2nD,UAAU,CAAC,SAAS,CAAC;AAC5F;AAEe,MAAMpjC,UAAU,SAASvhB,4DAAmB,CAAC;EAC1DsP,WAAW,CAACC,KAAK,EAAE;IACjB,KAAK,CAACA,KAAK,CAAC;IAEZ,IAAI,CAACs1C,aAAa,GAAG,IAAI,CAACA,aAAa,CAACp1C,IAAI,CAAC,IAAI,CAAC;EACpD;EAEAo1C,aAAa,CAAC12B,OAAO,EAAE;IACrB,IAAI,CAAC5e,KAAK,CAAC0hC,OAAO,EAAE;IACpB,IAAI,CAAC1hC,KAAK,CAACu1C,aAAa,CAAC,IAAI,CAACv1C,KAAK,CAACwZ,OAAO,CAACrsB,IAAI,CAAC;EACnD;EAEAqT,MAAM,GAAG;IACP,IAAI,CAAC,IAAI,CAACR,KAAK,CAACwZ,OAAO,EAAE;MACvB,OAAO,IAAI;IACb;IACA,OACE;MAAK,EAAE,EAAC;IAAe,GACrB;MAAK,EAAE,EAAC;IAA6B,GACnC,yEAAO,IAAI,CAACxZ,KAAK,CAACwZ,OAAO,CAAC7sB,IAAI,CAAQ,EACtC;MAAG,IAAI,EAAC,GAAG;MAAC,OAAO,EAAGmW,CAAC,IAAK;QAACA,CAAC,CAACC,cAAc,EAAE;QAAE,IAAI,CAAC/C,KAAK,CAAC0hC,OAAO,EAAE;MAAC;IAAE,GAAC;MAAG,SAAS,EAAC;IAAqB,GAAC,OAAK,CAAI,CAAI,CACrH,EACN;MAAK,EAAE,EAAC;IAAyB,GAC/B;MAAK,SAAS,EAAC;IAAoB,GACjC;MAAG,SAAS,EAAC;IAAqB,GAAEyT,YAAY,CAAC,IAAI,CAACn1C,KAAK,CAACwZ,OAAO,CAACrwB,IAAI,CAAC,CAAK,EAC9E,wEAAK,sEAAG,2DAAC,wDAAgB;MAAC,EAAE,mBAAkB;MAAC,cAAc;QAAA;QAAA;MAAA;IAAa,EAClC,CAAI,KAAC,EAACiI,kEAAe,CAAC,IAAI,CAAC4O,KAAK,CAACwZ,OAAO,CAAC7sB,IAAI,EAAE,EAAE,CAAC,IAAI,GAAG,CAAO,EACxG,wEAAK,sEAAG,2DAAC,wDAAgB;MAAC,EAAE,sBAAqB;MAAC,cAAc;QAAA;QAAA;MAAA;IAAgB,EAC3B,CAAI,KAAC,EAAC,IAAI,CAACqT,KAAK,CAACwZ,OAAO,CAACrwB,IAAI,IAAI,0BAA0B,CAAO,EACvH,wEAAK,sEAAG,2DAAC,wDAAgB;MAAC,EAAE,cAAa;MAAC,cAAc;QAAA;QAAA;MAAA;IAAQ,EAC1B,CAAI,KAAC,EAACkS,mEAAgB,CAAC,IAAI,CAAC2E,KAAK,CAACwZ,OAAO,CAACzvB,IAAI,CAAC,CAAO,CACxF,CACF,EACN,2DAAC,iEAAW;MACV,OAAO,EAAE,IAAK;MACd,MAAM,EAAE,IAAI,CAACiW,KAAK,CAACqB,MAAO;MAC1B,KAAK,EAAE,IAAI,CAACrB,KAAK,CAACkZ,KAAM;MACxB,aAAa,EAAE,IAAI,CAAClZ,KAAK,CAACw1C,aAAc;MACxC,aAAa,EAAE,IAAI,CAACF,aAAc;MAClC,OAAO,EAAE,IAAI,CAACt1C,KAAK,CAAChS;IAAQ,EAAG,CAC7B;EAEV;AACF;AAAC;;;;;;;;;;;;;;;;;ACzDyB;AAEiB;AAE5B,MAAMwb,UAAU,SAAS/Y,4DAAmB,CAAC;EAC1DsP,WAAW,CAACC,KAAK,EAAE;IACjB,KAAK,CAACA,KAAK,CAAC;IAEZ,IAAI,CAACrM,KAAK,GAAG;MACX8hD,IAAI,EAAE;IACR,CAAC;IAED,IAAI,CAAC1E,IAAI,GAAG,IAAI,CAACA,IAAI,CAAC7wC,IAAI,CAAC,IAAI,CAAC;EAClC;EAEAiG,kBAAkB,CAACC,SAAS,EAAE;IAC5B,IAAIA,SAAS,CAAC4uB,KAAK,KAAK,IAAI,CAACh1B,KAAK,CAACg1B,KAAK,EAAE;MACxC,IAAI,CAAC1yB,QAAQ,CAAC;QACZmzC,IAAI,EAAE,CAAE,CAAC,IAAI,CAACz1C,KAAK,CAACg1B;MACtB,CAAC,CAAC;IACJ;EACF;EAEA+b,IAAI,GAAG;IACL,IAAI,CAACzuC,QAAQ,CAAC;MAACmzC,IAAI,EAAE;IAAK,CAAC,CAAC;IAC5B,IAAI,IAAI,CAACz1C,KAAK,CAAC01C,YAAY,EAAE;MAC3B,IAAI,CAAC11C,KAAK,CAAC01C,YAAY,EAAE;IAC3B;EACF;EAEAl1C,MAAM,GAAG;IACP,MAAMm1C,KAAK,GAAG;MAACnqD,GAAG,EAAE,OAAO;MAAEuK,IAAI,EAAE,SAAS;MAAEiD,IAAI,EAAE;IAAM,CAAC;IAC3D,MAAMg8B,KAAK,GAAG2gB,KAAK,CAAC,IAAI,CAAC31C,KAAK,CAACg1B,KAAK,CAAC,IAAI,EAAE;IAC3C,MAAMjiC,SAAS,GAAG,WAAW,GAAGiiC,KAAK;IACrC,OACE;MAAK,SAAS,EAAEjiC;IAAU,GACxB;MAAK,SAAS,EAAC;IAAM,GAAC;MAAG,SAAS,EAAC;IAAgB,GAAEiiC,KAAK,CAAK,CAAM,EACrE,yEACG,IAAI,CAACh1B,KAAK,CAAC8c,IAAI,EACf,IAAI,CAAC9c,KAAK,CAACiG,MAAM,GAChB,0HACO;MAAG,IAAI,EAAC,GAAG;MACd,KAAK,EAAE;QAAE2vC,UAAU,EAAE;MAAS,CAAE;MAChC,OAAO,EAAG9yC,CAAC,IAAK;QAACA,CAAC,CAACC,cAAc,EAAE;QAAE,IAAI,CAAC/C,KAAK,CAACiG,MAAM,EAAE;MAAC;IAAE,GAC1D,IAAI,CAACjG,KAAK,CAACi1B,UAAU,CACpB,CACH,GACH,IAAI,CACD,EACP;MAAK,SAAS,EAAC;IAAQ,GAAC,2DAAC,wDAAU;MAAC,QAAQ,EAAE,IAAI,CAAC8b;IAAK,EAAG,CAAM,CAC7D;EAEV;AACF;AAAC;;;;;;;;;;;;;;;;;;ACpDyB;AACoB;AAE/B,MAAM9U,YAAY,SAASxrC,4DAAmB,CAAC;EAC5D+P,MAAM,GAAG;IACP,OACE;MAAK,SAAS,EAAC;IAAU,GACvB,wEAAK;MAAM,KAAK,EAAE;QAACjX,KAAK,EAAG,IAAI,CAACyW,KAAK,CAACo8B,QAAQ,GAAG,GAAG,GAAI;MAAG;IAAE,EAAQ,CAAM,EAC1E,IAAI,CAACp8B,KAAK,CAACo8B,QAAQ,GAAG,KAAK,GAC1B;MAAG,IAAI,EAAC,GAAG;MAAC,OAAO,EAAGt5B,CAAC,IAAK;QAACA,CAAC,CAACC,cAAc,EAAE;QAAE,IAAI,CAAC/C,KAAK,CAACooB,QAAQ,EAAE;MAAC;IAAE,GACvE;MAAG,SAAS,EAAC;IAAgB,GAAC,OAAK,CAAI,KAAC,6DAAC,wDAAgB;MAAC,EAAE,iBAAgB;MAC1E,cAAc;QAAA;QAAA;MAAA;IAAS,EAAyC,CAChE,GAEJ,2DAAC,wDAAgB;MAAC,EAAE,oBAAmB;MAAC,cAAc;QAAA;QAAA;MAAA;IAAe,EACb,CAEtD;EAEV;AACF;;;;;;;;;;;;;;;;;;;;;;ACpB0B;AACoB;AAEV;AAES;AACM;AAEpC,MAAM4B,aAAa,SAASv5B,wDAAe,CAAC;EACzDsP,WAAW,CAACC,KAAK,EAAE;IACjB,KAAK,CAACA,KAAK,CAAC;IAEZ,IAAI,CAACrM,KAAK,GAAG;MACXixB,KAAK,EAAE;IACT,CAAC;IAED,IAAI,CAAC0rB,eAAe,GAAG,IAAI,CAACA,eAAe,CAACpwC,IAAI,CAAC,IAAI,CAAC;IACtD,IAAI,CAAC21C,WAAW,GAAG,IAAI,CAACA,WAAW,CAAC31C,IAAI,CAAC,IAAI,CAAC;IAE9C,IAAI,CAACokB,oBAAoB,GAAG,IAAI,CAACA,oBAAoB,CAACpkB,IAAI,CAAC,IAAI,CAAC;IAChE,IAAI,CAAC41C,qBAAqB,GAAG,IAAI,CAACA,qBAAqB,CAAC51C,IAAI,CAAC,IAAI,CAAC;EACpE;EAEA2W,iBAAiB,GAAG;IAClB,IAAI,CAAC7W,KAAK,CAAC0P,UAAU,EAAE;EACzB;EAEA4gC,eAAe,CAACxtC,CAAC,EAAE;IACjB,IAAIA,CAAC,CAACkuC,OAAO,KAAK,EAAE,EAAE;MAEpB,IAAI,CAAChxC,KAAK,CAAC+wC,IAAI,CAAC,KAAK,CAAC;IACxB;EACF;EAEA8E,WAAW,CAAC/yC,CAAC,EAAE;IACbA,CAAC,CAACC,cAAc,EAAE;IAClB,IAAI,CAAC/C,KAAK,CAAC+wC,IAAI,CAAC,KAAK,CAAC;EACxB;EAEAzsB,oBAAoB,CAACM,KAAK,EAAE;IAC1B,IAAI,CAACtiB,QAAQ,CAAC;MAAEsiB,KAAK,EAAEjoB,0DAAkB,CAACioB,KAAK,CAAC,GAAG,IAAI,GAAGA;IAAM,CAAC,CAAC;IAClE,IAAI,CAAC5kB,KAAK,CAAC6kB,gBAAgB,CAACD,KAAK,CAAC;EACpC;EAEAkxB,qBAAqB,CAACpnC,GAAG,EAAE;IACzB,IAAI,CAAC1O,KAAK,CAAC2G,eAAe,CAAC+H,GAAG,CAAC;IAC/B,IAAI,CAAC1O,KAAK,CAAC+wC,IAAI,CAAC,IAAI,CAAC;EACvB;EAEAvwC,MAAM,GAAG;IACP,IAAIgB,QAAQ,GAAG,IAAI,CAAC7N,KAAK,CAACixB,KAAK,IAAI,IAAI,GAAG,IAAI,CAAC5kB,KAAK,CAAColB,aAAa,GAAG,IAAI,CAACplB,KAAK,CAACwB,QAAQ;IAExFA,QAAQ,GAAGA,QAAQ,CAAC2sC,MAAM,CAAE59C,CAAC,IAAK;MAChC,OAAQA,CAAC,CAAC5D,IAAI,IAAI,IAAI,CAACqT,KAAK,CAAC0G,aAAa,IAAKnW,CAAC,CAACkR,GAAG,CAACC,QAAQ,EAAE,IAAInR,CAAC,CAACkR,GAAG,CAACsY,QAAQ,EAAE;IACrF,CAAC,CAAC;IAEF,OACE;MAAK,SAAS,EAAC;IAAiB,GAC9B;MAAK,SAAS,EAAC;IAAgB,GAC7B;MAAK,SAAS,EAAC;IAAoB,GACjC,wEAAK,2DAAC,wDAAgB;MAAC,EAAE,cAAa;MAAC,cAAc;QAAA;QAAA;MAAA,EAAa;MAChE,UAAU,EAAC;IAAgE,EAAG,CAAM,EACtF,wEAAK;MAAG,IAAI,EAAC,GAAG;MAAC,OAAO,EAAE,IAAI,CAAC87B;IAAY,GAAC;MAAG,SAAS,EAAC;IAAgB,GAAC,OAAK,CAAI,CAAI,CAAM,CACzF,EACN,2DAAC,wDAAgB;MAAC,EAAE,iCAAgC;MAAC,cAAc;QAAA;QAAA;MAAA;IAAkB,GAElF5xB,kBAAkB,IAAK,2DAAC,4DAAc;MACrC,WAAW,EAAEA,kBAAmB;MAChC,gBAAgB,EAAE,IAAI,CAACK;IAAqB,EAAG,CAC/B,EACpB,2DAAC,wDAAgB;MAAC,EAAE,qBAAoB;MAAC,cAAc;QAAA;QAAA;MAAA;IAA6B,GAEjFyxB,qBAAqB,IAAK,2DAAC,yDAAW;MACrC,MAAM,EAAE,IAAI,CAAC/1C,KAAK,CAACqB,MAAO;MAC1B,QAAQ,EAAEG,QAAS;MACnB,QAAQ,EAAE,IAAI,CAACxB,KAAK,CAACiF,QAAS;MAC9B,gBAAgB,EAAE8wC,qBAAsB;MACxC,UAAU,EAAE,KAAM;MAClB,UAAU,EAAE,KAAM;MAClB,eAAe,EAAE,KAAM;MACvB,eAAe,EAAE,IAAI,CAACD;IAAsB,EAAG,CAC/B,CAChB,CACF;EAEV;AACF;;;;;;;;;;;;;;;;;;;;ACtF0B;AACgD;AAEjC;AACI;AAE7C,MAAMvkD,QAAQ,GAAGb,0DAAc,CAAC;EAC9B8V,WAAW,EAAE;IACX/U,EAAE,eAAe;IACjBC,cAAc;MAAA;MAAA;IAAA;EAEhB,CAAC;EACDskD,wBAAwB,EAAE;IACxBvkD,EAAE,4BAA4B;IAC9BC,cAAc;MAAA;MAAA;IAAA;MAAA;MAAA;IAAA;MAAA;MAAA;IAAA;EAEhB;AACF,CAAC,CAAC;AAEF,MAAM+X,YAAY,SAAShZ,wDAAe,CAAC;EACzCsP,WAAW,CAACC,KAAK,EAAE;IACjB,KAAK,CAACA,KAAK,CAAC;IAEZ,IAAI,CAACrM,KAAK,GAAG;MAEXoW,OAAO,EAAE/J,KAAK,CAAC+J,OAAO;MACtB6iC,KAAK,EAAEnjC,YAAY,CAACwsC,YAAY,CAACj2C,KAAK,CAAC+J,OAAO,CAAC;MAC/C0iC,aAAa,EAAEhjC,YAAY,CAACgjC,aAAa,CAACzsC,KAAK,CAAC+J,OAAO,EAAE/J,KAAK,CAACk2C,kBAAkB,EAAEl2C,KAAK,CAACm2C,cAAc,CAAC;MACxGC,aAAa,EAAE,EAAE;MACjBC,iBAAiB,EAAEr2C,KAAK,CAACgD,IAAI,CAAC/O,aAAa,CAAC1C,QAAQ,CAACiV,WAAW,CAAC;MACjE8vC,gBAAgB,EAAE7sC,YAAY,CAAC6sC,gBAAgB,CAACt2C,KAAK,CAAC+J,OAAO;IAC/D,CAAC;IAED,IAAI,CAAC+rC,qBAAqB,GAAG,IAAI,CAACA,qBAAqB,CAAC51C,IAAI,CAAC,IAAI,CAAC;IAClE,IAAI,CAACq2C,mBAAmB,GAAG,IAAI,CAACA,mBAAmB,CAACr2C,IAAI,CAAC,IAAI,CAAC;IAC9D,IAAI,CAACs2C,mBAAmB,GAAG,IAAI,CAACA,mBAAmB,CAACt2C,IAAI,CAAC,IAAI,CAAC;IAC9D,IAAI,CAACmI,YAAY,GAAG,IAAI,CAACA,YAAY,CAACnI,IAAI,CAAC,IAAI,CAAC;IAChD,IAAI,CAAC47B,YAAY,GAAG,IAAI,CAACA,YAAY,CAAC57B,IAAI,CAAC,IAAI,CAAC;EAClD;EAEA,OAAO+1C,YAAY,CAAClsC,OAAO,EAAE;IAC3B,IAAI6iC,KAAK,GAAG,CAAC,CAAC;IACd7iC,OAAO,CAAC1W,GAAG,CAAEojD,CAAC,IAAK;MACjB7J,KAAK,CAAC6J,CAAC,CAACtnC,IAAI,CAAC,GAAG;QAAC0kC,KAAK,EAAE,CAAC;QAAE6C,OAAO,EAAE;MAAI,CAAC;IAC3C,CAAC,CAAC;IACF,OAAO9J,KAAK;EACd;EAEA,OAAOH,aAAa,CAAC1iC,OAAO,EAAE4sC,WAAW,EAAER,cAAc,EAAE;IACzD,IAAIS,IAAI,GAAG,EAAE;IACb7sC,OAAO,CAAC1W,GAAG,CAAEojD,CAAC,IAAK;MACjB,IAAIE,WAAW,IAAIF,CAAC,CAACtnC,IAAI,IAAIgnC,cAAc,EAAE;QAC3CS,IAAI,CAACpmD,IAAI,CAACimD,CAAC,CAACtnC,IAAI,CAAC;MACnB;IACF,CAAC,CAAC;IACF,OAAOynC,IAAI;EACb;EAEA,OAAON,gBAAgB,CAACvsC,OAAO,EAAE;IAC/B,IAAI8sC,GAAG,GAAG,EAAE;IACZ9sC,OAAO,CAAC1W,GAAG,CAAEojD,CAAC,IAAK;MACjBI,GAAG,CAACrmD,IAAI,CAACimD,CAAC,CAACtnC,IAAI,CAAC;IAClB,CAAC,CAAC;IACF,OAAO0nC,GAAG;EACZ;EAEAf,qBAAqB,CAAC55C,MAAM,EAAE0wC,KAAK,EAAE;IACnC,IAAIp3C,MAAM,GAAG,IAAI,CAAC7B,KAAK,CAACi5C,KAAK,CAAC1wC,MAAM,CAAC;IACrC,IAAI1G,MAAM,EAAE;MACV,IAAIA,MAAM,CAACkhD,OAAO,EAAE;QAElB;MACF;MACAlhD,MAAM,CAACq+C,KAAK,IAAI,CAAC;MACjBr+C,MAAM,CAACkhD,OAAO,GAAG,IAAI;IACvB,CAAC,MAAM;MACLlhD,MAAM,GAAG;QAACq+C,KAAK,EAAE,CAAC;QAAE6C,OAAO,EAAE;MAAI,CAAC;IACpC;IAEA,IAAID,CAAC,GAAG,IAAI,CAAC9iD,KAAK,CAACoW,OAAO,CAAC9R,KAAK,EAAE;IAClCw+C,CAAC,CAACjmD,IAAI,CAAC,IAAI,CAACwP,KAAK,CAACwB,QAAQ,CAACorC,KAAK,CAAC,CAAC;IAElC,MAAMiK,GAAG,GAAGptC,YAAY,CAAC6sC,gBAAgB,CAACG,CAAC,CAAC;IAE5C,MAAMroD,CAAC,GAAG,IAAI,CAACuF,KAAK,CAACi5C,KAAK;IAC1Bx+C,CAAC,CAAC8N,MAAM,CAAC,GAAG1G,MAAM;IAElB,IAAI,CAAC8M,QAAQ,CAAC;MAACyH,OAAO,EAAE0sC,CAAC;MAAE7J,KAAK,EAAEx+C,CAAC;MAAEkoD,gBAAgB,EAAEO;IAAG,CAAC,CAAC;EAC9D;EAEAN,mBAAmB,CAACr6C,MAAM,EAAE0wC,KAAK,EAAE;IACjC,MAAMp3C,MAAM,GAAG,IAAI,CAAC7B,KAAK,CAACi5C,KAAK,CAAC1wC,MAAM,CAAC;IACvC,IAAI,CAAC1G,MAAM,IAAI,CAACA,MAAM,CAACkhD,OAAO,EAAE;MAC9B;IACF;IACAlhD,MAAM,CAACkhD,OAAO,GAAG,KAAK;IACtBlhD,MAAM,CAACq+C,KAAK,IAAI,CAAC;IAEjB,IAAI4C,CAAC,GAAG,IAAI,CAAC9iD,KAAK,CAACoW,OAAO,CAAC9R,KAAK,EAAE;IAClCw+C,CAAC,CAACK,MAAM,CAAClK,KAAK,EAAE,CAAC,CAAC;IAElB,MAAMiK,GAAG,GAAGptC,YAAY,CAAC6sC,gBAAgB,CAACG,CAAC,CAAC;IAE5C,MAAMroD,CAAC,GAAG,IAAI,CAACuF,KAAK,CAACi5C,KAAK;IAC1Bx+C,CAAC,CAAC8N,MAAM,CAAC,GAAG1G,MAAM;IAElB,IAAI,CAAC8M,QAAQ,CAAC;MAACyH,OAAO,EAAE0sC,CAAC;MAAE7J,KAAK,EAAEx+C,CAAC;MAAEkoD,gBAAgB,EAAEO;IAAG,CAAC,CAAC;EAC9D;EAEAL,mBAAmB,CAAChjD,GAAG,EAAE;IACvB,MAAM;MAACS;IAAa,CAAC,GAAG,IAAI,CAAC+L,KAAK,CAACgD,IAAI;IACvC,MAAMsZ,GAAG,GAAG,CAAC9oB,GAAG,GACdS,aAAa,CAAC1C,QAAQ,CAACiV,WAAW,CAAC,GACnCvS,aAAa,CAAC1C,QAAQ,CAACykD,wBAAwB,EAAE;MAACpxB,KAAK,EAAEpxB;IAAG,CAAC,CAAC;IAEhE,IAAI,CAAC8O,QAAQ,CAAC;MAAC8zC,aAAa,EAAE5iD,GAAG;MAAE6iD,iBAAiB,EAAE/5B;IAAG,CAAC,CAAC;EAC7D;EAEA,OAAOy6B,kBAAkB,CAAC5I,MAAM,EAAEl8C,MAAM,EAAE;IACxC,IAAIk8C,MAAM,EAAE;MACV,KAAK,IAAI//C,CAAC,GAAC,CAAC,EAAEA,CAAC,GAAC6D,MAAM,CAACxF,MAAM,EAAE2B,CAAC,EAAE,EAAE;QAClC,IAAI6D,MAAM,CAAC7D,CAAC,CAAC,CAAC3D,OAAO,CAAC0jD,MAAM,CAAC,IAAI,CAAC,EAAE;UAClC,OAAO,IAAI;QACb;MACF;MACA,OAAO,KAAK;IACd;IACA,OAAO,IAAI;EACb;EAEA9lC,YAAY,GAAG;IACb,IAAI2uC,QAAQ,GAAG,IAAI;IACnB,IAAIjtC,OAAO,GAAG,EAAE;IAChB,IAAI4F,KAAK,GAAG,EAAE;IACd,IAAIC,OAAO,GAAG,EAAE;IAEhB,IAAIqnC,IAAI,GAAG3/C,MAAM,CAAC2/C,IAAI,CAAC,IAAI,CAACtjD,KAAK,CAACi5C,KAAK,CAAC;IACxCqK,IAAI,CAAC5jD,GAAG,CAAC,UAAS6jD,CAAC,EAAE;MACnB,IAAIF,QAAQ,CAACrjD,KAAK,CAACi5C,KAAK,CAACsK,CAAC,CAAC,CAACR,OAAO,EAAE;QACnC3sC,OAAO,CAACvZ,IAAI,CAAC0mD,CAAC,CAAC;MACjB;MAEA,IAAIF,QAAQ,CAACrjD,KAAK,CAACi5C,KAAK,CAACsK,CAAC,CAAC,CAACrD,KAAK,GAAG,CAAC,EAAE;QACrClkC,KAAK,CAACnf,IAAI,CAAC0mD,CAAC,CAAC;MACf,CAAC,MAAM,IAAIF,QAAQ,CAACrjD,KAAK,CAACi5C,KAAK,CAACsK,CAAC,CAAC,CAACrD,KAAK,GAAG,CAAC,EAAE;QAC5CjkC,OAAO,CAACpf,IAAI,CAAC0mD,CAAC,CAAC;MACjB;IACF,CAAC,CAAC;IACF,IAAI,CAACl3C,KAAK,CAAC+7B,QAAQ,CAAChyB,OAAO,EAAE4F,KAAK,EAAEC,OAAO,CAAC;EAC9C;EAEAksB,YAAY,GAAG;IACb,IAAI,CAAC97B,KAAK,CAACooB,QAAQ,EAAE;EACvB;EAEA5nB,MAAM,GAAG;IACP,MAAM;MAACvM;IAAa,CAAC,GAAG,IAAI,CAAC+L,KAAK,CAACgD,IAAI;IACvC,OACE;MAAK,EAAE,EAAC;IAAe,GACrB;MAAK,SAAS,EAAC;IAAgB,GAC7B;MAAO,SAAS,EAAC;IAAO,GACtB,2DAAC,wDAAgB;MAAC,EAAE,uBAAsB;MAAC,cAAc;QAAA;QAAA;MAAA;IAAgB,EAA+B,CAClG,CACJ,EACN;MAAK,SAAS,EAAC;IAAgB,GAC7B,2DAAC,uDAAS;MACR,MAAM,EAAE,IAAI,CAAChD,KAAK,CAACqB,MAAO;MAC1B,KAAK,EAAE,IAAI,CAAC1N,KAAK,CAACoW,OAAQ;MAC1B,aAAa,EAAE,IAAI,CAACpW,KAAK,CAAC84C,aAAc;MACxC,MAAM,EAAC,aAAa;MACpB,UAAU,EAAE,IAAI,CAAC+J,mBAAoB;MACrC,aAAa,EAAE,IAAI,CAACD;IAAoB,EAAG,CACzC,EACN;MAAK,SAAS,EAAC;IAAgB,GAC7B;MAAO,SAAS,EAAC;IAAO,GACtB,2DAAC,wDAAgB;MAAC,EAAE,sBAAqB;MAAC,cAAc;QAAA;QAAA;MAAA;IAAe,EACxB,CACzC,CACJ,EACN,2DAAC,yDAAW;MACV,MAAM,EAAE,IAAI,CAACv2C,KAAK,CAACqB,MAAO;MAC1B,QAAQ,EAAE,IAAI,CAACrB,KAAK,CAACwB,QAAS;MAC9B,QAAQ,EAAE,IAAI,CAACxB,KAAK,CAACiF,QAAS;MAC9B,aAAa,EAAE,IAAI,CAACtR,KAAK,CAAC2iD,gBAAiB;MAC3C,MAAM,EAAE,IAAI,CAAC3iD,KAAK,CAACyiD,aAAc;MACjC,UAAU,EAAE3sC,YAAY,CAACstC,kBAAmB;MAC5C,gBAAgB,EAAE,IAAI,CAACpjD,KAAK,CAAC0iD,iBAAkB;MAC/C,UAAU,EAAE,KAAM;MAClB,UAAU,EAAE,KAAM;MAClB,eAAe,EAAE,IAAI,CAACP;IAAsB,EAAG,EACjD;MAAK,EAAE,EAAC,uBAAuB;MAAC,SAAS,EAAC;IAAgB,GACxD;MAAQ,SAAS,EAAC,WAAW;MAAC,OAAO,EAAE,IAAI,CAACha;IAAa,GACvD,2DAAC,wDAAgB;MAAC,EAAE,iBAAgB;MAAC,cAAc;QAAA;QAAA;MAAA;IAAS,EAAiC,CACtF,EACT;MAAQ,SAAS,EAAC,SAAS;MAAC,OAAO,EAAE,IAAI,CAACzzB;IAAa,GACrD,2DAAC,wDAAgB;MAAC,EAAE,aAAY;MAAC,cAAc;QAAA;QAAA;MAAA;IAAK,EAA6B,CAC1E,CACL,CACF;EAEV;AACF;AAAC;AAED,iEAAexH,sDAAU,CAAC4I,YAAY,CAAC;;;;;;;;;;;;;;;;;;;;;AC1Mb;AACoB;AAEI;AAEP;AACW;AAEvC,MAAMwI,SAAS,SAASxhB,wDAAe,CAAC;EACrDsP,WAAW,CAACC,KAAK,EAAE;IACjB,KAAK,CAACA,KAAK,CAAC;EACd;EAEAQ,MAAM,GAAG;IACP,MAAM22C,WAAW,GAAG,EAAE;IACtB,MAAMC,UAAU,GAAG,CAAC,IAAI,CAACp3C,KAAK,CAAC2M,WAAW,IAAI,EAAE,EAAElgB,MAAM;IACxD,MAAM4qD,WAAW,GAAGztD,IAAI,CAACC,GAAG,CAAClC,2DAAmB,EAAEyvD,UAAU,CAAC;IAE7D,CAAC,IAAI,CAACp3C,KAAK,CAAC2M,WAAW,IAAI,EAAE,EAAE2qC,IAAI,CAAE1qC,GAAG,IAAK;MAC3CuqC,WAAW,CAAC3mD,IAAI,CACd;QAAK,SAAS,EAAC,YAAY;QAAC,GAAG,EAAEoc,GAAG,CAACuC;MAAK,GACxC,2DAAC,wDAAU;QACT,MAAM,EAAE,IAAI,CAACnP,KAAK,CAACqB,MAAO;QAC1B,KAAK,EAAEuL,GAAG,CAACuC,IAAK;QAChB,MAAM,EAAEpmB,kEAAY,CAAC6jB,GAAG,CAAC3I,MAAM,GAAG2I,GAAG,CAAC3I,MAAM,CAACjb,KAAK,GAAG,IAAI,CAAC,IAAI,IAAK;QACnE,KAAK,EAAE4jB,GAAG,CAAC3I,MAAM,GAAG2I,GAAG,CAAC3I,MAAM,CAAC1G,EAAE,GAAG;MAAK,EAAG,CAC1C,CACP;MACD,OAAO45C,WAAW,CAAC1qD,MAAM,IAAI4qD,WAAW;IAC1C,CAAC,CAAC;IAEF,OACE;MAAK,EAAE,EAAC;IAAa,GAAEF,WAAW,EAAC,GAAC,EAACC,UAAU,GAAGC,WAAW,GAC3D,yEACE,2DAAC,wDAAgB;MAAC,EAAE,uBAAsB;MAAC,cAAc;QAAA;QAAA;MAAA;QAAA;QAAA;MAAA;QAAA;QAAA;MAAA,EAAmB;MAExE,MAAM,EAAE;QAAEE,QAAQ,EAAGH,UAAU,GAAGC;MAAa;IAAE,EAAG,CACnD,GAAG,IAAI,CACV;EAEV;AACF;AAAC;;;;;;;;;;;;;;;;;AC3CyB;AAEiB;AAI5B,MAAM1wB,YAAY,SAASl2B,4DAAmB,CAAC;EAC5DsP,WAAW,CAACC,KAAK,EAAE;IACjB,KAAK,CAACA,KAAK,CAAC;IAEZ,IAAI,CAACrM,KAAK,GAAG;MACX4d,QAAQ,EAAEvR,KAAK,CAACyD,aAAa;MAC7B+zC,OAAO,EAAE;IACX,CAAC;IAED,IAAI,CAACC,oBAAoB,GAAG,IAAI,CAACA,oBAAoB,CAACv3C,IAAI,CAAC,IAAI,CAAC;IAChE,IAAI,CAACw3C,qBAAqB,GAAG,IAAI,CAACA,qBAAqB,CAACx3C,IAAI,CAAC,IAAI,CAAC;IAClE,IAAI,CAACksC,aAAa,GAAG,IAAI,CAACA,aAAa,CAAClsC,IAAI,CAAC,IAAI,CAAC;EACpD;EAEAu3C,oBAAoB,CAAC30C,CAAC,EAAE;IACtB,IAAI,CAACR,QAAQ,CAAC;MAACiP,QAAQ,EAAEzO,CAAC,CAACyF,MAAM,CAAC3R,KAAK;MAAE4gD,OAAO,EAAE;IAAI,CAAC,CAAC;EAC1D;EAEAE,qBAAqB,GAAG;IACtB,IAAI,IAAI,CAAC/jD,KAAK,CAAC6jD,OAAO,EAAE;MACtB,IAAI,CAACl1C,QAAQ,CAAC;QAACk1C,OAAO,EAAE;MAAK,CAAC,CAAC;MAC/B,IAAI,CAACx3C,KAAK,CAAC23C,qBAAqB,CAAC,IAAI,CAAChkD,KAAK,CAAC4d,QAAQ,CAACvd,IAAI,EAAE,CAAC;IAC9D;EACF;EAEAo4C,aAAa,CAACtpC,CAAC,EAAE;IACf,IAAIA,CAAC,CAAC5Q,GAAG,IAAI,OAAO,EAAE;MACpB,IAAI,CAACwlD,qBAAqB,EAAE;IAC9B;EACF;EAEAl3C,MAAM,GAAG;IACP,IAAIo3C,WAAW,GAAG,EAAE;IACpB,KAAK,IAAI1lD,GAAG,IAAInM,mDAAW,EAAE;MAC3B,IAAIsI,IAAI,GAAGtI,mDAAW,CAACmM,GAAG,CAAC;MAC3B0lD,WAAW,CAACpnD,IAAI,CACd;QAAQ,GAAG,EAAEnC,IAAK;QAAC,KAAK,EAAEA;MAAK,EAAG,CACnC;IACH;IACA,OACE;MAAK,SAAS,EAAC;IAAgB,GAC7B;MAAO,IAAI,EAAC,QAAQ;MAAC,EAAE,EAAC,WAAW;MAAC,WAAW,EAAE,IAAI,CAAC2R,KAAK,CAACuR,QAAS;MAAC,IAAI,EAAC,aAAa;MACtF,SAAS,EAAC,QAAQ;MAAC,KAAK,EAAE,IAAI,CAAC5d,KAAK,CAAC4d,QAAS;MAAC,QAAQ,EAAE,IAAI,CAACkmC,oBAAqB;MACnF,MAAM,EAAE,IAAI,CAACC,qBAAsB;MACnC,SAAS,EAAE,IAAI,CAACtL,aAAc;MAAC,QAAQ;IAAA,EAAG,EAC5C;MAAU,EAAE,EAAC;IAAa,GACvBwL,WAAW,CACH,CACP;EAEV;AACF;;;;;;;;;;;;;;;;;;;;;;ACzD0B;AACoB;AACD;AAEL;AACc;AACkB;AAEzD,MAAM1lC,YAAY,SAASzhB,4DAAmB,CAAC;EAC5DsP,WAAW,CAACC,KAAK,EAAE;IACjB,KAAK,CAACA,KAAK,CAAC;IAEZ,IAAI,CAACrM,KAAK,GAAG;MACXpK,KAAK,EAAE,CAAC;MACRC,MAAM,EAAE;IACV,CAAC;IAED,IAAI,CAACquD,eAAe,GAAG,IAAI,CAACA,eAAe,CAAC33C,IAAI,CAAC,IAAI,CAAC;EACxD;EAEA43C,WAAW,CAACn8B,IAAI,EAAE;IAChB,IAAIA,IAAI,IAAI,CAAC,IAAI,CAAChoB,KAAK,CAACpK,KAAK,EAAE;MAC7B,MAAMioD,MAAM,GAAG71B,IAAI,CAAC6d,qBAAqB,EAAE;MAC3C,IAAI,CAACl3B,QAAQ,CAAC;QACZ/Y,KAAK,EAAEioD,MAAM,CAACjoD,KAAK,GAAG,CAAC;QACvBC,MAAM,EAAEgoD,MAAM,CAAChoD,MAAM,GAAG;MAC1B,CAAC,CAAC;IACJ;EACF;EAEAquD,eAAe,CAACj5B,OAAO,EAAE;IACvB,IAAI,CAAC5e,KAAK,CAAC0hC,OAAO,EAAE;IACpB,IAAI,CAAC1hC,KAAK,CAACu1C,aAAa,CAAC32B,OAAO,EAAE,IAAI,CAAC5e,KAAK,CAACwZ,OAAO,CAACjtB,IAAI,CAAC;EAC5D;EAEAiU,MAAM,GAAG;IACP,IAAI,CAAC,IAAI,CAACR,KAAK,CAACwZ,OAAO,EAAE;MACvB,OAAO,IAAI;IACb;IAEA,MAAM1tB,GAAG,GAAGxC,kEAAY,CAAC,IAAI,CAAC0W,KAAK,CAACwZ,OAAO,CAACjwB,KAAK,EAAE,IAAI,CAACyW,KAAK,CAACwZ,OAAO,CAAChwB,MAAM,EAC1E,IAAI,CAACmK,KAAK,CAACpK,KAAK,EAAE,IAAI,CAACoK,KAAK,CAACnK,MAAM,EAAE,KAAK,CAAC;IAC7C,MAAMO,IAAI,GAAG+B,GAAG,GAAG;MAAEvC,KAAK,EAAEuC,GAAG,CAAC9B,QAAQ,GAAG,IAAI;MAAER,MAAM,EAAEsC,GAAG,CAAC7B,SAAS,GAAG;IAAK,CAAC,GAC3E,IAAI,CAAC+V,KAAK,CAACwZ,OAAO,CAACjwB,KAAK,GAAG,IAAI,CAACyW,KAAK,CAACwZ,OAAO,CAAChwB,MAAM,GAAI;MAACD,KAAK,EAAE;IAAM,CAAC,GAAG;MAACC,MAAM,EAAE;IAAM,CAAE;IAC/FO,IAAI,CAACN,QAAQ,GAAG,MAAM;IACtBM,IAAI,CAACL,SAAS,GAAG,MAAM;IAGvB,MAAMquD,SAAS,GAAGnuD,IAAI,CAAC4K,GAAG,CAAC,CAAE,IAAI,CAACb,KAAK,CAACpK,KAAK,GAAGzC,gDAAQ,GAAG,GAAG,GAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;IAC7E,MAAMyD,KAAK,GAAG6G,kEAAe,CAAC,IAAI,CAAC4O,KAAK,CAACwZ,OAAO,CAAC1d,QAAQ,EAAEi8C,SAAS,CAAC,IAAI,GAAG;IAE5E,MAAMxuD,KAAK,GAAG,IAAI,CAACyW,KAAK,CAACwZ,OAAO,CAACjwB,KAAK,IAAI,GAAG;IAC7C,MAAMC,MAAM,GAAG,IAAI,CAACwW,KAAK,CAACwZ,OAAO,CAAChwB,MAAM,IAAI,GAAG;IAC/C,OACE;MAAK,EAAE,EAAC;IAAe,GACrB;MAAK,EAAE,EAAC;IAA6B,GAClC,IAAI,CAACwW,KAAK,CAACu1C,aAAa,GACvB,yEAAOhrD,KAAK,CAAQ,GAEpB;MAAG,IAAI,EAAE,IAAI,CAACyV,KAAK,CAACwZ,OAAO,CAACphB,GAAI;MAAC,QAAQ,EAAE,IAAI,CAAC4H,KAAK,CAACwZ,OAAO,CAAC1d;IAAS,GACrE;MAAG,SAAS,EAAC;IAAgB,GAAC,eAAa,CAAI,KAAC,6DAAC,wDAAgB;MAC/D,EAAE,mBAAkB;MAAC,cAAc;QAAA;QAAA;MAAA;IAAW,EAA2C,CACzF,EAEN;MAAG,IAAI,EAAC,GAAG;MAAC,OAAO,EAAGgH,CAAC,IAAK;QAACA,CAAC,CAACC,cAAc,EAAE;QAAE,IAAI,CAAC/C,KAAK,CAAC0hC,OAAO,EAAE;MAAC;IAAE,GAAC;MAAG,SAAS,EAAC;IAAqB,GAAC,OAAK,CAAI,CAAI,CACrH,EACN;MAAK,EAAE,EAAC,yBAAyB;MAAC,GAAG,EAAG/lB,IAAI,IAAK,IAAI,CAACm8B,WAAW,CAACn8B,IAAI;IAAE,GACtE;MAAK,GAAG,EAAE,IAAI,CAAC3b,KAAK,CAACwZ,OAAO,CAACphB,GAAI;MAAC,KAAK,EAAErO,IAAK;MAAC,SAAS,EAAC,eAAe;MAAC,GAAG,EAAE,IAAI,CAACiW,KAAK,CAACwZ,OAAO,CAAC1d;IAAS,EAAG,CACzG,EACL,IAAI,CAACkE,KAAK,CAACu1C,aAAa,GACvB,2DAAC,yDAAW;MACV,aAAa,EAAC,mBAAmB;MACjC,WAAW,EAAE,IAAK;MAClB,MAAM,EAAE,IAAI,CAACv1C,KAAK,CAACqB,MAAO;MAC1B,KAAK,EAAE,IAAI,CAACrB,KAAK,CAACkZ,KAAM;MACxB,aAAa,EAAE,IAAI,CAAClZ,KAAK,CAACw1C,aAAc;MACxC,aAAa,EAAE,IAAI,CAACqC,eAAgB;MACpC,OAAO,EAAE,IAAI,CAAC73C,KAAK,CAAChS;IAAQ,EAAG,GAEjC;MAAK,EAAE,EAAC;IAAsB,GAC5B,wEACE,wEAAK,sEAAG,2DAAC,wDAAgB;MAAC,EAAE,mBAAkB;MAAC,cAAc;QAAA;QAAA;MAAA;IAAa,EAClC,CAAI,CAAM,EAClD,wEAAK;MAAM,KAAK,EAAE,IAAI,CAACgS,KAAK,CAACwZ,OAAO,CAAC1d;IAAS,GAAEvR,KAAK,CAAQ,CAAM,CAC/D,EACN,wEACE,wEAAK,sEAAG,2DAAC,wDAAgB;MAAC,EAAE,sBAAqB;MAAC,cAAc;QAAA;QAAA;MAAA;IAAgB,EAC3B,CAAI,CAAM,EAC/D,wEAAM,IAAI,CAACyV,KAAK,CAACwZ,OAAO,CAACrwB,IAAI,CAAO,CAChC,EACN,wEACE,wEAAK,sEAAG,2DAAC,wDAAgB;MAAC,EAAE,cAAa;MAAC,cAAc;QAAA;QAAA;MAAA;IAAQ,EAC1B,CAAI,CAAM,EAChD,wEAAMI,KAAK,EAAC,QAAS,EAACC,MAAM,EAAC,OAAK,EAAC6R,mEAAgB,CAAC,IAAI,CAAC2E,KAAK,CAACwZ,OAAO,CAACzvB,IAAI,CAAC,CAAO,CAC/E,CACF,CACJ;EAEV;AACF;AAAC;;;;;;;;;;;;;;;;;AClGyB;AAE2B;AAEtC,MAAM+W,WAAW,SAASrQ,wDAAe,CAAC;EACvDsP,WAAW,CAACC,KAAK,EAAE;IACjB,KAAK,CAACA,KAAK,CAAC;IAEZ,IAAI,CAACgrB,OAAO,GAAGv6B,sDAAe,EAAE;IAEhC,IAAI,CAACkD,KAAK,GAAG;MACX4/B,MAAM,EAAEvzB,KAAK,CAACuzB,MAAM;MACpBykB,YAAY,EAAEh4C,KAAK,CAACpJ,KAAK,IAAI,EAAE;MAC/BA,KAAK,EAAEoJ,KAAK,CAACpJ,KAAK,IAAI;IACxB,CAAC;IAED,IAAI,CAACqhD,eAAe,GAAG,IAAI,CAACA,eAAe,CAAC/3C,IAAI,CAAC,IAAI,CAAC;IACtD,IAAI,CAACksC,aAAa,GAAG,IAAI,CAACA,aAAa,CAAClsC,IAAI,CAAC,IAAI,CAAC;IAClD,IAAI,CAACg4C,kBAAkB,GAAG,IAAI,CAACA,kBAAkB,CAACh4C,IAAI,CAAC,IAAI,CAAC;IAC5D,IAAI,CAACw3C,qBAAqB,GAAG,IAAI,CAACA,qBAAqB,CAACx3C,IAAI,CAAC,IAAI,CAAC;IAClE,IAAI,CAACi4C,sBAAsB,GAAG,IAAI,CAACA,sBAAsB,CAACj4C,IAAI,CAAC,IAAI,CAAC;EACtE;EAEAiG,kBAAkB,CAACC,SAAS,EAAEC,SAAS,EAAE;IAGvC,MAAM+xC,QAAQ,GAAG,IAAI,CAACp4C,KAAK,CAACpJ,KAAK,IAAI,EAAE;IACvC,IAAIyP,SAAS,CAAC2xC,YAAY,IAAII,QAAQ,IAAI,CAAC/xC,SAAS,CAACktB,MAAM,EAAE;MAC3D,IAAI,CAACjxB,QAAQ,CAAC;QACZ01C,YAAY,EAAEI,QAAQ;QACtBxhD,KAAK,EAAEwhD;MACT,CAAC,CAAC;IACJ;EACF;EAEAH,eAAe,CAACn1C,CAAC,EAAE;IACjB,IAAI,CAACR,QAAQ,CAAC;MAAC1L,KAAK,EAAEkM,CAAC,CAACyF,MAAM,CAAC3R,KAAK,IAAI;IAAE,CAAC,CAAC;EAC9C;EAEAw1C,aAAa,CAACtpC,CAAC,EAAE;IACf,IAAIA,CAAC,CAACkuC,OAAO,KAAK,EAAE,EAAE;MAEpB,IAAI,CAAC1uC,QAAQ,CAAC;QAAC1L,KAAK,EAAE,IAAI,CAACoJ,KAAK,CAACpJ,KAAK;QAAE28B,MAAM,EAAE;MAAK,CAAC,CAAC;IACzD,CAAC,MAAM,IAAIzwB,CAAC,CAACkuC,OAAO,KAAK,EAAE,EAAE;MAE3B,IAAI,CAAC0G,qBAAqB,CAAC50C,CAAC,CAAC;IAC/B;EACF;EAECo1C,kBAAkB,GAAG;IACpB,IAAI,CAAC,IAAI,CAACl4C,KAAK,CAAC6gC,QAAQ,EAAE;MACxB,IAAI,CAACv+B,QAAQ,CAAC;QAACixB,MAAM,EAAE;MAAI,CAAC,EAAEtmC,CAAC,IAAI;QACjC,IAAI,IAAI,CAAC+9B,OAAO,CAACvK,OAAO,EAAE;UACxB,IAAI,CAACuK,OAAO,CAACvK,OAAO,CAAC43B,KAAK,EAAE;QAC9B;MACF,CAAC,CAAC;IACJ;EACF;EAEAX,qBAAqB,CAAC7pD,KAAK,EAAE;IAC3B,MAAM+I,KAAK,GAAG,IAAI,CAACjD,KAAK,CAACiD,KAAK,CAAC5C,IAAI,EAAE;IACrC,IAAI,IAAI,CAACgM,KAAK,CAAC8sC,QAAQ,KAAK,CAACj/C,KAAK,CAAC0a,MAAM,CAAC+vC,aAAa,EAAE,IAAI,CAAC1hD,KAAK,CAAC,EAAE;MAEpE,IAAI,CAAC0L,QAAQ,CAAC;QAAC1L,KAAK,EAAE,IAAI,CAACoJ,KAAK,CAACpJ,KAAK;QAAE28B,MAAM,EAAE;MAAK,CAAC,CAAC;MACvD;IACF;IACA,IAAI,CAACjxB,QAAQ,CAAC;MAACixB,MAAM,EAAE;IAAK,CAAC,CAAC;IAC9B,IAAI,CAAC38B,KAAK,IAAI,IAAI,CAACoJ,KAAK,CAACpJ,KAAK,KAAMA,KAAK,KAAK,IAAI,CAACoJ,KAAK,CAACpJ,KAAM,EAAE;MAC/D,IAAI,CAACoJ,KAAK,CAACu4C,UAAU,CAAC3hD,KAAK,CAAC;IAC9B;EACF;EAEAuhD,sBAAsB,CAACvhD,KAAK,EAAE;IAC5B,IAAI,CAAC0L,QAAQ,CAAC;MAACixB,MAAM,EAAE;IAAK,CAAC,CAAC;IAC9B,IAAI38B,KAAK,IAAKA,KAAK,KAAK,IAAI,CAACoJ,KAAK,CAACpJ,KAAM,EAAE;MACzC,IAAI,CAACoJ,KAAK,CAACu4C,UAAU,CAAC3hD,KAAK,CAAC;IAC9B;EACF;EAEA4J,MAAM,GAAG;IACP,IAAI,CAAC,IAAI,CAAC7M,KAAK,CAAC4/B,MAAM,EAAE;MACtB,IAAIilB,QAAQ,GAAG,IAAI,CAACx4C,KAAK,CAAC7W,IAAI,IAAI,UAAU,GAAG,UAAU,GAAG,IAAI,CAACwK,KAAK,CAACiD,KAAK;MAC5E,IAAI6hD,SAAS,GAAG,eAAe,IAAI,IAAI,CAACz4C,KAAK,CAAC6gC,QAAQ,GAAG,WAAW,GAAG,EAAE,CAAC;MAC1E,IAAI,CAAC2X,QAAQ,EAAE;QACbA,QAAQ,GAAG,IAAI,CAACx4C,KAAK,CAACkmB,WAAW;QACjCuyB,SAAS,IAAI,cAAc;MAC7B;MACA,IAAI,CAAC,IAAI,CAACz4C,KAAK,CAAC04C,SAAS,IAAI,IAAI,CAAC14C,KAAK,CAAC04C,SAAS,IAAI,CAAC,EAAE;QACtDD,SAAS,IAAI,QAAQ;MACvB;MAEA,OAAQ;QAAM,SAAS,EAAEA,SAAU;QAAC,OAAO,EAAE,IAAI,CAACP;MAAmB,GACnE,yEAAOM,QAAQ,CAAQ,CAClB;IACT;IAEA,IAAIG,OAAO;IACX,MAAMnmD,IAAI,GAAG,CAAC,CAAC;IACf,IAAI,IAAI,CAACwN,KAAK,CAAC7W,IAAI,IAAI,UAAU,EAAE;MACjCwvD,OAAO,GAAG1xC,6DAAe;MACzBzU,IAAI,CAAC+lD,UAAU,GAAG,IAAI,CAACJ,sBAAsB;IAC/C,CAAC,MAAM;MACL,IAAI,IAAI,CAACn4C,KAAK,CAAC04C,SAAS,GAAG,CAAC,EAAE;QAC5BC,OAAO,GAAG,UAAU;QACpBnmD,IAAI,CAAComD,IAAI,GAAG,IAAI,CAAC54C,KAAK,CAAC04C,SAAS;QAChClmD,IAAI,CAACO,SAAS,GAAG,cAAc;MACjC,CAAC,MAAM;QACL4lD,OAAO,GAAG,OAAO;QACjBnmD,IAAI,CAACrJ,IAAI,GAAG,IAAI,CAAC6W,KAAK,CAAC7W,IAAI,IAAI,MAAM;MACvC;MACAqJ,IAAI,CAACoE,KAAK,GAAG,IAAI,CAACjD,KAAK,CAACiD,KAAK;MAC7BpE,IAAI,CAACvJ,GAAG,GAAG,IAAI,CAAC+hC,OAAO;MACvBx4B,IAAI,CAACg5C,QAAQ,GAAG,IAAI,CAACyM,eAAe;MACpCzlD,IAAI,CAACqmD,SAAS,GAAG,IAAI,CAACzM,aAAa;MACnC55C,IAAI,CAACsmD,MAAM,GAAG,IAAI,CAACpB,qBAAqB;IAC1C;IACAllD,IAAI,CAAC0zB,WAAW,GAAG,IAAI,CAAClmB,KAAK,CAACkmB,WAAW;IACzC1zB,IAAI,CAACs6C,QAAQ,GAAG,IAAI,CAAC9sC,KAAK,CAAC8sC,QAAQ,GAAG,UAAU,GAAG,EAAE;IACrDt6C,IAAI,CAACumD,YAAY,GAAG,IAAI,CAAC/4C,KAAK,CAAC+4C,YAAY;IAC3CvmD,IAAI,CAAC86C,SAAS,GAAG,IAAI;IAErB,OAAO78C,0DAAmB,CAACkoD,OAAO,EAAEnmD,IAAI,EAAE,IAAI,CAAC;EACjD;AACF;AAAC;;;;;;;;;;;;;;;;;ACzHyB;AAEyB;AAEpC,MAAMzB,WAAW,SAASN,4DAAmB,CAAC;EAC3DsP,WAAW,CAACC,KAAK,EAAE;IACjB,KAAK,CAACA,KAAK,CAAC;IAEZ,IAAI,CAACg5C,QAAQ,GAAGvoD,sDAAe,EAAE;IAEjC,IAAI,CAACi9C,WAAW,GAAG,IAAI,CAACA,WAAW,CAACxtC,IAAI,CAAC,IAAI,CAAC;EAChD;EAEAwtC,WAAW,CAAC5qC,CAAC,EAAE;IACb,IAAI,IAAI,CAAC9C,KAAK,CAAC/M,OAAO,EAAE;MAEtB,IAAI,CAAC+M,KAAK,CAAC/M,OAAO,CAAC6P,CAAC,CAAC;IACvB;EACF;EAEAtC,MAAM,GAAG;IACP,MAAM7N,QAAQ,GAAGxB,gEAAa,CAAC,IAAI,CAAC6O,KAAK,CAAC,eAAe,CAAC,GAAG,IAAI,CAAC;IAClE,MAAMjN,SAAS,GAAG,cAAc,IAAI,IAAI,CAACiN,KAAK,CAAC/M,OAAO,GAAG,kBAAkB,GAAG,EAAE,CAAC;IACjF,OACE;MAAK,SAAS,EAAEF;IAAU,GACvBtC,0DAAmB,CAAC,KAAK,EAAE,IAAI,CAACuP,KAAK,CAAC,EACtC,IAAI,CAACA,KAAK,CAAC/M,OAAO,GACjB;MAAK,SAAS,EAAC;IAAc,GAC3B;MAAG,SAAS,EAAC;IAA6B,GAAC,YAAU,CAAI,CACrD,GACJ,IAAI,EACPN,QAAQ,GAAG;MAAK,SAAS,EAAC;IAAU,GAAEA,QAAQ,CAAO,GAAG,IAAI,CACzD;EAEV;AACF;AAAC;;;;;;;;;;;;;;;;;;ACrCyB;AACoB;AAE/B,MAAMwf,UAAU,SAAS1hB,4DAAmB,CAAC;EAC1DsP,WAAW,CAACC,KAAK,EAAE;IACjB,KAAK,CAACA,KAAK,CAAC;IAEZ,IAAI,CAACi5C,kBAAkB,GAAG,IAAI,CAACA,kBAAkB,CAAC/4C,IAAI,CAAC,IAAI,CAAC;EAC9D;EAEA+4C,kBAAkB,CAAC3jD,GAAG,EAAEpM,IAAI,EAAE;IAC5BoM,GAAG,CAACyN,cAAc,EAAE;IACpB,IAAI,CAAC/C,KAAK,CAAC2tC,QAAQ,CAACzkD,IAAI,CAAC;EAC3B;EAEAsX,MAAM,GAAG;IACP,OACE;MAAK,SAAS,EAAC;IAAqB,GAClC;MAAK,SAAS,EAAC;IAAO,GACpB,2DAAC,wDAAgB;MAAC,EAAE,mBAAkB;MACpC,cAAc;QAAA;QAAA;MAAA;IAAkE,EACR,CACtE,EACN;MAAK,SAAS,EAAC;IAAQ,GACrB;MAAQ,SAAS,EAAC,SAAS;MAAC,OAAO,EAAE3S,KAAK,IAAI;QAAE,IAAI,CAACorD,kBAAkB,CAACprD,KAAK,EAAE,QAAQ,CAAC;MAAE;IAAE,GAC1F,2DAAC,wDAAgB;MAAC,EAAE,0BAAyB;MAC3C,cAAc;QAAA;QAAA;MAAA;IAAS,EAAsD,CACxE,EACT;MAAQ,SAAS,EAAC,WAAW;MAAC,OAAO,EAAEA,KAAK,IAAI;QAAE,IAAI,CAACorD,kBAAkB,CAACprD,KAAK,EAAE,QAAQ,CAAC;MAAE;IAAE,GAC5F,2DAAC,wDAAgB;MAAC,EAAE,0BAAyB;MAC3C,cAAc;QAAA;QAAA;MAAA;IAAS,EAAsD,CACxE,EACT;MAAQ,SAAS,EAAC,WAAW;MAAC,OAAO,EAAEA,KAAK,IAAI;QAAE,IAAI,CAACorD,kBAAkB,CAACprD,KAAK,EAAE,OAAO,CAAC;MAAE;IAAE,GAC3F,2DAAC,wDAAgB;MAAC,EAAE,yBAAwB;MAC1C,cAAc;QAAA;QAAA;MAAA;IAAQ,EAAqD,CACtE,CACL,CACF;EAEV;AACF;AAAC;;;;;;;;;;;;;;;;ACxCyB;AAEX,MAAMmD,SAAS,SAASP,4DAAmB,CAAC;EACzDsP,WAAW,CAACC,KAAK,EAAE;IACjB,KAAK,CAACA,KAAK,CAAC;IAEZ,IAAI,CAACrM,KAAK,GAAG;MACX9H,GAAG,EAAE,IAAI,CAACmU,KAAK,CAACk5C,OAAO,GAAG,kBAAkB,GAAG,kBAAkB;MACjElnD,KAAK,EAAEsF,MAAM,CAACC,MAAM,CAAC;QAAC4hD,OAAO,EAAE;MAAK,CAAC,EAAE,IAAI,CAACn5C,KAAK,CAAChO,KAAK,CAAC;MACxDe,SAAS,EAAE,IAAI,CAACiN,KAAK,CAACjN,SAAS;MAC/BwB,GAAG,EAAE,IAAI,CAACyL,KAAK,CAACzL,GAAG;MACnBtB,OAAO,EAAE,IAAI,CAAC+M,KAAK,CAAC/M;IACtB,CAAC;EACH;EAEA4jB,iBAAiB,GAAG;IAElB,IAAI,CAAC7W,KAAK,CAAC/J,QAAQ,CAChBhB,OAAO,CACPI,IAAI,CAACnM,IAAI,IAAI,IAAI,CAACoZ,QAAQ,CAAC;MAACzW,GAAG,EAAE3C,IAAI,CAAC2C,GAAG;MAAEmG,KAAK,EAAE;QAAC,GAAG,IAAI,CAAC2B,KAAK,CAAC3B,KAAK;QAAEmnD,OAAO,EAAE;MAAC;IAAC,CAAC,CAAC,CAAC,CACtFxjD,KAAK,CAAC1I,CAAC,IAAI,IAAI,CAACqV,QAAQ,CAAC;MAACzW,GAAG,EAAE,IAAI,CAACmU,KAAK,CAACk5C,OAAO,GAAG,sBAAsB,GAAG;IAAsB,CAAC,CAAC,CAAC;EAC3G;EAEA7sC,oBAAoB,GAAG;IACrB,IAAI,CAACrM,KAAK,CAAC/J,QAAQ,CAACwJ,MAAM,EAAE;EAC9B;EAEA0G,kBAAkB,CAACC,SAAS,EAAE;IAC5B,IAAIA,SAAS,CAACnQ,QAAQ,IAAI,IAAI,CAAC+J,KAAK,CAAC/J,QAAQ,EAAE;MAC7C,IAAI,CAACqM,QAAQ,CAAC;QAACzW,GAAG,EAAE,IAAI,CAACmU,KAAK,CAACk5C,OAAO,GAAG,kBAAkB,GAAG,kBAAkB;QAAElnD,KAAK,EAAE;UAAC,GAAG,IAAI,CAAC2B,KAAK,CAAC3B,KAAK;UAAEmnD,OAAO,EAAE;QAAK;MAAC,CAAC,CAAC;MAChI,IAAI,CAACn5C,KAAK,CAAC/J,QAAQ,CAChBhB,OAAO,CACPI,IAAI,CAACnM,IAAI,IAAI,IAAI,CAACoZ,QAAQ,CAAC;QAACzW,GAAG,EAAE3C,IAAI,CAAC2C,GAAG;QAAEmG,KAAK,EAAE;UAAC,GAAG,IAAI,CAAC2B,KAAK,CAAC3B,KAAK;UAAEmnD,OAAO,EAAE;QAAC;MAAC,CAAC,CAAC,CAAC,CACtFxjD,KAAK,CAAC1I,CAAC,IAAI,IAAI,CAACqV,QAAQ,CAAC;QAACzW,GAAG,EAAE,IAAI,CAACmU,KAAK,CAACk5C,OAAO,GAAG,sBAAsB,GAAG;MAAsB,CAAC,CAAC,CAAC;IAC3G;EACF;EAEA14C,MAAM,GAAG;IACP,OAAO/P,0DAAmB,CAAC,KAAK,EAAE,IAAI,CAACkD,KAAK,CAAC;EAC/C;AACF;AAAC;;;;;;;;;;;;;;;;;;;;ACzCyB;AAEU;AAEiB;AACA;AAEtC,MAAMye,UAAU,SAAS3hB,4DAAmB,CAAC;EAC1D+P,MAAM,GAAG;IACP,IAAI2D,MAAM;IACV,IAAI,IAAI,CAACnE,KAAK,CAACmE,MAAM,KAAK,IAAI,EAAE;MAC9B,MAAM2mC,OAAO,GAAGnuC,+DAAuB,CAAC,IAAI,CAACqD,KAAK,CAAC9G,KAAK,CAAC;MACzD,MAAMkgD,SAAS,GAAGloD,iEAAc,CAAC,IAAI,CAAC8O,KAAK,CAAC9G,KAAK,EAAE4xC,OAAO,CAAC;MAC3D,IAAI,IAAI,CAAC9qC,KAAK,CAAC9G,KAAK,IAAI,IAAI,CAAC8G,KAAK,CAACnL,KAAK,IAAI,IAAI,CAACmL,KAAK,CAACnL,KAAK,CAACb,IAAI,EAAE,EAAE;QACnE,MAAMqlD,MAAM,GAAG,IAAI,CAACr5C,KAAK,CAACnL,KAAK,CAACb,IAAI,EAAE,CAACslD,MAAM,CAAC,CAAC,CAAC;QAChD,MAAMvmD,SAAS,GAAG,aAAa,GAAGqmD,SAAS,IAAI,IAAI,CAACp5C,KAAK,CAACyY,OAAO,GAAG,WAAW,GAAG,EAAE,CAAC;QACrFtU,MAAM,GAAI;UAAK,SAAS,EAAEpR;QAAU,GAAC,wEAAMsmD,MAAM,CAAO,CAAO;MACjE,CAAC,MAAM;QACL,MAAMtmD,SAAS,GAAG,iBAAiB,GAAGqmD,SAAS,IAAI,IAAI,CAACp5C,KAAK,CAACyY,OAAO,GAAG,WAAW,GAAG,EAAE,CAAC;QACzFtU,MAAM,GAAG2mC,OAAO,GAAG;UAAG,SAAS,EAAE/3C;QAAU,GAAC,OAAK,CAAI,GAAG;UAAG,SAAS,EAAEA;QAAU,GAAC,QAAM,CAAI;MAC7F;IACF,CAAC,MAAM,IAAI,IAAI,CAACiN,KAAK,CAACmE,MAAM,EAAE;MAC5B,MAAM/L,GAAG,GAAG,IAAI,CAAC4H,KAAK,CAACqB,MAAM,CAAC3O,YAAY,CAACpB,iEAAkB,CAAC,IAAI,CAAC0O,KAAK,CAACmE,MAAM,EAAE,OAAO,CAAC,CAAC;MAE1F,MAAMpR,SAAS,GAAG,QAAQ,IAAI,IAAI,CAACiN,KAAK,CAACyY,OAAO,GAAG,UAAU,GAAG,EAAE,CAAC;MACnEtU,MAAM,GAAG;QAAK,SAAS,EAAEpR,SAAU;QAAC,GAAG,EAAC,QAAQ;QAAC,GAAG,EAAEqF,GAAI;QACxD,OAAO,EAAG0K,CAAC,IAAG;UAACA,CAAC,CAACyF,MAAM,CAAChd,OAAO,GAAG,IAAI;UAAEuX,CAAC,CAACyF,MAAM,CAAC1c,GAAG,GAAC,yBAAyB;QAAA;MAAE,EAAG;IACvF,CAAC,MAAM;MACLsY,MAAM,GAAG,IAAI;IACf;IACA,OAAOA,MAAM;EACf;AACF;;;;;;;;;;;;;;;;AChC0B;AAEX,MAAMkO,WAAW,SAAS5hB,4DAAmB,CAAC;EAC3D+P,MAAM,GAAG;IACP,MAAMzN,SAAS,GAAG,kBAAkB,IAAI,IAAI,CAACiN,KAAK,CAACu5C,KAAK,GAAG,QAAQ,GAAG,EAAE,CAAC,IACpE,IAAI,CAACv5C,KAAK,CAACw5C,KAAK,GAAG,QAAQ,GAAG,EAAE,CAAC,IAAI,IAAI,CAACx5C,KAAK,CAACy5C,QAAQ,GAAG,WAAW,GAAG,EAAE,CAAC;IACjF,OAAQ,IAAI,CAACz5C,KAAK,CAACy1C,IAAI,GACrB;MAAK,SAAS,EAAE1iD;IAAU,GAAC;MAAK,SAAS,EAAC;IAAgB,EAAO,CAAM,GAAG,IAAI;EAClF;AACF;;;;;;;;;;;;;;;;ACR0B;AAEX,MAAM2W,UAAU,SAASjZ,4DAAmB,CAAC;EAC1D+P,MAAM,GAAG;IACP,OACE;MAAG,IAAI,EAAC,GAAG;MAAC,OAAO,EAAGsC,CAAC,IAAK;QAACA,CAAC,CAACC,cAAc,EAAE;QAAE,IAAI,CAAC/C,KAAK,CAACooB,QAAQ,EAAE;MAAC;IAAE,GACvE;MAAG,SAAS,EAAC;IAAgB,GAAC,OAAK,CAAI,CACrC;EAER;AACF;;;;;;;;;;;;;;;;ACX0B;AAEX,MAAMsxB,YAAY,SAASjpD,4DAAmB,CAAC;EAC5D+P,MAAM,GAAG;IACP,OACE,wEACE;MAAG,IAAI,EAAC,GAAG;MAAC,OAAO,EAAGsC,CAAC,IAAK;QAACA,CAAC,CAACC,cAAc,EAAE;QAAE,IAAI,CAAC/C,KAAK,CAAC25C,UAAU,EAAE;MAAC;IAAE,GAAC;MAAG,SAAS,EAAC;IAAgB,GAAC,MAAI,CAAI,CAAI,QAEtH;MAAG,IAAI,EAAC,GAAG;MAAC,OAAO,EAAG72C,CAAC,IAAK;QAACA,CAAC,CAACC,cAAc,EAAE;QAAE,IAAI,CAAC/C,KAAK,CAACsoB,UAAU,EAAE;MAAC;IAAE,GAAC;MAAG,SAAS,EAAC;IAAgB,GAAC,UAAQ,CAAI,CAAI,CACtH;EAEV;AACF;AAAC;;;;;;;;;;;;;;;;ACZyB;AAEX,MAAMsxB,SAAS,SAASnpD,4DAAmB,CAAC;EACzD+P,MAAM,GAAG;IACP,OACI,wEACE;MAAG,IAAI,EAAC,GAAG;MAAC,OAAO,EAAGsC,CAAC,IAAK;QAACA,CAAC,CAACC,cAAc,EAAE;QAAE,IAAI,CAAC/C,KAAK,CAACqoB,QAAQ,EAAE;MAAC;IAAE,GAAC;MAAG,SAAS,EAAC;IAAgB,GAAC,YAAU,CAAI,CAAI,QAE1H;MAAG,IAAI,EAAC,GAAG;MAAC,OAAO,EAAGvlB,CAAC,IAAK;QAACA,CAAC,CAACC,cAAc,EAAE;QAAE,IAAI,CAAC/C,KAAK,CAACsoB,UAAU,EAAE;MAAC;IAAE,GAAC;MAAG,SAAS,EAAC;IAAgB,GAAC,UAAQ,CAAI,CAAI,CACtH;EAEZ;AACF;AAAC;;;;;;;;;;;;;;;;ACVyB;AAEX,MAAMhW,WAAW,SAAS7hB,4DAAmB,CAAC;EAC3DsP,WAAW,CAACC,KAAK,EAAE;IACjB,KAAK,CAACA,KAAK,CAAC;EACd;EAEAQ,MAAM,GAAG;IACP,IAAIgZ,OAAO,GAAG,IAAI;IAClB,IAAIoxB,WAAW,GAAG,QAAQ;IAC1B,IAAI,IAAI,CAAC5qC,KAAK,CAAC65C,IAAI,EAAE;MAEnBrgC,OAAO,GAAG,0HAAG,IAAI,CAACxZ,KAAK,CAAC65C,IAAI,CAAI;MAChCjP,WAAW,IAAI,OAAO;IACxB;IAEA,IAAI,CAACpxB,OAAO,EAAE;MACZ,OAAO,0HAAG,IAAI,CAAI;IACpB;IAEA,OACE;MAAI,SAAS,EAAC;IAAM,GAClB;MAAK,SAAS,EAAEoxB;IAAY,GAC1B;MAAK,SAAS,EAAC;IAAiB,GAC7BpxB,OAAO,CACJ,CACF,CACH;EAET;AACF;AAAC;;;;;;;;;;;;;;;;;;AChCyB;AACgD;AAE1E,MAAMjoB,QAAQ,GAAGb,0DAAc,CAAC;EAC9BopD,UAAU,EAAE;IACVroD,EAAE,oBAAoB;IACtBC,cAAc;MAAA;MAAA;IAAA;EAEhB;AACF,CAAC,CAAC;AAEF,MAAMkyB,YAAY,SAASnzB,4DAAmB,CAAC;EAC7CsP,WAAW,CAACC,KAAK,EAAE;IACjB,KAAK,CAACA,KAAK,CAAC;IAEZ,IAAI,CAACrM,KAAK,GAAG;MACXomD,OAAO,EAAE;IACX,CAAC;IAED,IAAI,CAACne,YAAY,GAAG,IAAI,CAACA,YAAY,CAAC17B,IAAI,CAAC,IAAI,CAAC;IAChD,IAAI,CAAC27B,cAAc,GAAG,IAAI,CAACA,cAAc,CAAC37B,IAAI,CAAC,IAAI,CAAC;IACpD,IAAI,CAACmI,YAAY,GAAG,IAAI,CAACA,YAAY,CAACnI,IAAI,CAAC,IAAI,CAAC;EAClD;EAEA07B,YAAY,CAAC94B,CAAC,EAAE;IACd,IAAI,CAACR,QAAQ,CAAC;MAACy3C,OAAO,EAAEj3C,CAAC,CAACyF,MAAM,CAAC3R;IAAK,CAAC,CAAC;EAC1C;EAEAilC,cAAc,CAAC/4B,CAAC,EAAE;IAChB,IAAIA,CAAC,CAAC5Q,GAAG,KAAK,OAAO,EAAE;MACrB,IAAI,CAACmW,YAAY,CAACvF,CAAC,CAAC;IACtB;EACF;EAEAuF,YAAY,CAACvF,CAAC,EAAE;IACdA,CAAC,CAACC,cAAc,EAAE;IAClB,IAAI,IAAI,CAACpP,KAAK,CAAComD,OAAO,EAAE;MACtB,MAAMptD,IAAI,GAAG,IAAI,CAACgH,KAAK,CAAComD,OAAO,CAAC/lD,IAAI,EAAE;MACtC,MAAMgmD,MAAM,GAAGrtD,IAAI,CAACgwC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC;MAChC,IAAIhwC,IAAI,CAACF,MAAM,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAACH,QAAQ,CAAC0tD,MAAM,CAAC,EAAE;QAC7D,IAAI,CAACh6C,KAAK,CAAC+7B,QAAQ,CAACpvC,IAAI,CAAC;MAC3B,CAAC,MAAM;QACL,IAAI,CAACqT,KAAK,CAAChS,OAAO,CAAC,IAAI,CAACgS,KAAK,CAACgD,IAAI,CAAC/O,aAAa,CAAC1C,QAAQ,CAACuoD,UAAU,CAAC,EAAE,KAAK,CAAC;MAC/E;IACF;EACF;EAEAt5C,MAAM,GAAG;IACP,OACE;MAAK,SAAS,EAAC;IAAY,GACzB;MAAK,SAAS,EAAC;IAAgB,GAC/B,2DAAC,wDAAgB;MAAC,EAAE,wBAAuB;MAAC,cAAc;QAAA;QAAA;MAAA;IAAmB,GAE1E8rC,MAAM,IAAK;MAAO,IAAI,EAAC,MAAM;MAAC,WAAW,EAAEA,MAAO;MACjD,KAAK,EAAE,IAAI,CAAC34C,KAAK,CAAComD,OAAQ;MAAC,QAAQ,EAAE,IAAI,CAACne,YAAa;MACvD,UAAU,EAAE,IAAI,CAACC,cAAe;MAAC,QAAQ;MAAC,SAAS;IAAA,EAAG,CACtC,CACd,EACN;MAAK,SAAS,EAAC;IAAgB,GAC7B;MAAQ,SAAS,EAAC,SAAS;MAAC,OAAO,EAAE,IAAI,CAACxzB;IAAa,GACrD,2DAAC,wDAAgB;MAAC,EAAE,oBAAmB;MAAC,cAAc;QAAA;QAAA;MAAA;IAAY,EAC7B,CAC9B,CACL,CACF;EAEV;AACF;AAAC;AAED,iEAAexH,sDAAU,CAAC+iB,YAAY,CAAC;;;;;;;;;;;;;;;;;;;;;;;;ACrEb;AACoB;AAEH;AACI;AACT;AACK;AAGU;AAC4B;AAElE,MAAMC,aAAa,SAASpzB,4DAAmB,CAAC;EAC7DsP,WAAW,CAACC,KAAK,EAAE;IACjB,KAAK,CAACA,KAAK,CAAC;IAEZ,IAAI,CAACgE,QAAQ,GAAGvT,sDAAe,EAAE;IAEjC,IAAI,CAACkD,KAAK,GAAG;MACXqQ,QAAQ,EAAE,EAAE;MACZ4B,OAAO,EAAE,EAAE;MACX1B,WAAW,EAAE,EAAE;MACf1G,QAAQ,EAAE,IAAI;MACd0nB,IAAI,EAAE,EAAE;MACRxD,SAAS,EAAE,KAAK;MAChBna,SAAS,EAAE,IAAI;MACfC,aAAa,EAAE;IACjB,CAAC;IAED,IAAI,CAAC0yC,eAAe,GAAG,IAAI,CAACA,eAAe,CAACh6C,IAAI,CAAC,IAAI,CAAC;IACtD,IAAI,CAAC8H,kBAAkB,GAAG,IAAI,CAACA,kBAAkB,CAAC9H,IAAI,CAAC,IAAI,CAAC;IAC5D,IAAI,CAACgI,mBAAmB,GAAG,IAAI,CAACA,mBAAmB,CAAChI,IAAI,CAAC,IAAI,CAAC;IAC9D,IAAI,CAACiI,sBAAsB,GAAG,IAAI,CAACA,sBAAsB,CAACjI,IAAI,CAAC,IAAI,CAAC;IACpE,IAAI,CAACkI,YAAY,GAAG,IAAI,CAACA,YAAY,CAAClI,IAAI,CAAC,IAAI,CAAC;IAChD,IAAI,CAACi6C,iBAAiB,GAAG,IAAI,CAACA,iBAAiB,CAACj6C,IAAI,CAAC,IAAI,CAAC;IAC1D,IAAI,CAACk6C,mBAAmB,GAAG,IAAI,CAACA,mBAAmB,CAACl6C,IAAI,CAAC,IAAI,CAAC;IAC9D,IAAI,CAACmI,YAAY,GAAG,IAAI,CAACA,YAAY,CAACnI,IAAI,CAAC,IAAI,CAAC;EAClD;EAEA2W,iBAAiB,GAAG,CAEpB;EAEAqjC,eAAe,CAACvtD,IAAI,EAAEmW,CAAC,EAAE;IACvB,IAAI,CAACR,QAAQ,CAAC;MAAC,CAAC3V,IAAI,GAAGmW,CAAC,CAACyF,MAAM,CAAC3R,KAAK,IAAI;IAAE,CAAC,CAAC;EAC/C;EAEAoR,kBAAkB,CAAC5e,IAAI,EAAEgC,GAAG,EAAE;IAC5B,IAAI,CAACkX,QAAQ,CAAC;MAACiF,SAAS,EAAEnc,GAAG;MAAEoc,aAAa,EAAEpe;IAAI,CAAC,CAAC;EACtD;EAEA8e,mBAAmB,CAAC9e,IAAI,EAAEmD,IAAI,EAAEhD,KAAK,EAAEC,MAAM,EAAE;IAC7C,MAAM4O,GAAG,GAAG7L,IAAI,GAAGZ,GAAG,CAACiB,eAAe,CAACL,IAAI,CAAC,GAAG,IAAI;IACnD,IAAI,CAAC+V,QAAQ,CAAC;MAAC9E,QAAQ,EAAEpF,GAAG;MAAEmP,SAAS,EAAE,IAAI;MAAEC,aAAa,EAAE;IAAI,CAAC,CAAC;IACpE,IAAIjb,IAAI,EAAE;MACR,IAAI,CAAC6b,YAAY,CAAChf,IAAI,EAAEmD,IAAI,EAAEhD,KAAK,EAAEC,MAAM,CAAC;IAC9C;EACF;EAEA2e,sBAAsB,GAAG;IACvB,IAAI,CAAC7F,QAAQ,CAAC;MAACiF,SAAS,EAAE,IAAI;MAAEC,aAAa,EAAE;IAAI,CAAC,CAAC;EACvD;EAIAY,YAAY,CAAChf,IAAI,EAAEmD,IAAI,EAAEhD,KAAK,EAAEC,MAAM,EAAE;IACtC,MAAMif,aAAa,GAAGC,KAAK,IAAI;MAC7B,IAAI;QAACtf,IAAI;QAAEmD;MAAI,CAAC,GAAGmc,KAAK;MACxB,IAAInc,IAAI,CAACxC,IAAI,GAAG/C,wDAAgB,EAAE;QAEhC,MAAM2hB,QAAQ,GAAG,IAAI,CAAC3I,KAAK,CAACqB,MAAM,CAACuH,kBAAkB,EAAE;QACvDD,QAAQ,CAACE,MAAM,CAACtc,IAAI,CAAC,CAClB8I,IAAI,CAAC+C,GAAG,IAAI,IAAI,CAACkK,QAAQ,CAAC;UAAC9E,QAAQ,EAAEpF;QAAG,CAAC,CAAC,CAAC,CAC3CzC,KAAK,CAACnK,GAAG,IAAI,IAAI,CAACwU,KAAK,CAAChS,OAAO,CAACxC,GAAG,CAACwK,OAAO,EAAE,KAAK,CAAC,CAAC;MACzD,CAAC,MAAM;QAELrI,kEAAY,CAACpB,IAAI,CAAC,CACf8I,IAAI,CAAC/E,GAAG,IAAI,IAAI,CAACgS,QAAQ,CAAC;UAAC9E,QAAQ,EAAEzU,kEAAY,CAAC;YAACG,IAAI,EAAEoH,GAAG,CAAC/C,IAAI;YAAEpE,IAAI,EAAEC;UAAI,CAAC;QAAC,CAAC,CAAC,CAAC;MACvF;IACF,CAAC;IAED,IAAIG,KAAK,GAAGxC,mDAAW,IAAIyC,MAAM,GAAGzC,mDAAW,IAAIwC,KAAK,IAAIC,MAAM,EAAE;MAElEsB,iEAAW,CAACyB,IAAI,EAAExF,mDAAW,EAAEA,mDAAW,EAAEM,kEAA0B,EAAE,IAAI,CAAC,CAC1EgO,IAAI,CAACK,MAAM,IAAI+S,aAAa,CAAC/S,MAAM,CAAC,CAAC,CACrCC,KAAK,CAACnK,GAAG,IAAI,IAAI,CAACwU,KAAK,CAAChS,OAAO,CAACxC,GAAG,CAACwK,OAAO,EAAE,KAAK,CAAC,CAAC;IACzD,CAAC,MAAM;MACLyS,aAAa,CAAC;QAACrf,IAAI,EAAEA,IAAI;QAAEmD,IAAI,EAAEA,IAAI;QAAEhD,KAAK,EAAEA,KAAK;QAAEC,MAAM,EAAEA;MAAM,CAAC,CAAC;IACvE;EACF;EAEA2wD,iBAAiB,CAACj1B,IAAI,EAAE;IACtB,IAAI,CAAC5iB,QAAQ,CAAC;MAAC4iB,IAAI,EAAEA;IAAI,CAAC,CAAC;EAC7B;EAEAk1B,mBAAmB,GAAG;IACpB,IAAI,CAAC93C,QAAQ,CAAC;MAACof,SAAS,EAAE,CAAC,IAAI,CAAC/tB,KAAK,CAAC+tB;IAAS,CAAC,CAAC;EACnD;EAEArZ,YAAY,CAACvF,CAAC,EAAE;IACdA,CAAC,CAACC,cAAc,EAAE;IAElB,MAAMxF,EAAE,GAAG,IAAI,CAAC5J,KAAK,CAACqQ,QAAQ,CAAChQ,IAAI,EAAE,CAACnJ,SAAS,CAAC,CAAC,EAAEjD,wDAAgB,CAAC;IACpE,MAAM0lB,OAAO,GAAG,IAAI,CAAC3Z,KAAK,CAACiS,OAAO,CAAC5R,IAAI,EAAE,CAACnJ,SAAS,CAAC,CAAC,EAAEjD,wDAAgB,CAAC;IACxE,MAAMsc,WAAW,GAAG,IAAI,CAACvQ,KAAK,CAACuQ,WAAW,CAAClQ,IAAI,EAAE,CAACnJ,SAAS,CAAC,CAAC,EAAEhD,oEAA4B,CAAC;IAC5F,IAAI0V,EAAE,EAAE;MACN,IAAI,CAACyC,KAAK,CAAC+7B,QAAQ,CAACx+B,EAAE,EAAE2G,WAAW,EAAE,IAAI,CAACvQ,KAAK,CAAC6J,QAAQ,EAAE8P,OAAO,EAAE,IAAI,CAAC3Z,KAAK,CAACuxB,IAAI,EAAE,IAAI,CAACvxB,KAAK,CAAC+tB,SAAS,CAAC;IAC3G;EACF;EAEAlhB,MAAM,GAAG;IACP,IAAI,IAAI,CAAC7M,KAAK,CAAC4T,SAAS,EAAE;MACxB,OACE,2DAAC,wDAAU;QACT,MAAM,EAAE,IAAI,CAAC5T,KAAK,CAAC4T,SAAU;QAC7B,IAAI,EAAE,IAAI,CAAC5T,KAAK,CAAC6T,aAAc;QAC/B,QAAQ,EAAE,IAAI,CAACU,mBAAoB;QACnC,QAAQ,EAAE,IAAI,CAACC,sBAAuB;QACtC,OAAO,EAAE,IAAI,CAACnI,KAAK,CAAChS;MAAQ,EAAG;IAErC;IAEA,IAAI+a,aAAa,GAAG,SAAS;IAC7B,IAAI,IAAI,CAAC/I,KAAK,CAACgJ,QAAQ,EAAE;MACvBD,aAAa,IAAI,WAAW;IAC9B;IACA,OACE;MAAM,SAAS,EAAC,YAAY;MAAC,QAAQ,EAAE,IAAI,CAACV;IAAa,GACvD;MAAK,SAAS,EAAC;IAAmB,GAChC,2EACE,2DAAC,0DAAY;MACX,MAAM,EAAE,IAAI,CAACrI,KAAK,CAACqB,MAAO;MAC1B,MAAM,EAAE,IAAI,CAAC1N,KAAK,CAAC6J,QAAS;MAC5B,OAAO,EAAE,IAAI,CAACwC,KAAK,CAAChS,OAAQ;MAC5B,cAAc,EAAE,IAAI,CAACga;IAAmB,EAAG,CACtC,EACT;MAAK,SAAS,EAAC;IAAO,GACpB;MAAO,SAAS,EAAC,OAAO;MAAC,OAAO,EAAC;IAAc,GAC7C,2DAAC,wDAAgB;MAAC,EAAE,oBAAmB;MAAC,cAAc;QAAA;QAAA;MAAA;IAAO,EACd,CACzC,EACR,2DAAC,wDAAgB;MAAC,EAAE,kCAAiC;MAAC,cAAc;QAAA;QAAA;MAAA;IAA6B,GAE9Fke,WAAW,IAAK;MAAO,IAAI,EAAC,MAAM;MAAC,EAAE,EAAC,cAAc;MAAC,WAAW,EAAEA,WAAY;MAC7E,GAAG,EAAE,IAAI,CAACliB,QAAS;MAAC,KAAK,EAAE,IAAI,CAACrQ,KAAK,CAACqQ,QAAS;MAAC,QAAQ,EAAE,IAAI,CAACk2C,eAAe,CAACh6C,IAAI,CAAC,IAAI,EAAE,UAAU,CAAE;MACtG,SAAS;MAAC,QAAQ;MAAC,QAAQ,EAAE;IAAE,EAAG,CAClB,CAChB,EACN;MAAK,SAAS,EAAC;IAAO,GACpB;MAAO,SAAS,EAAC,OAAO;MAAC,OAAO,EAAC;IAAgB,GAC/C,2DAAC,wDAAgB;MAAC,EAAE,iBAAgB;MAAC,cAAc;QAAA;QAAA;MAAA;IAAkB,EACvB,CACxC,EACR,2DAAC,wDAAgB;MAAC,EAAE,+BAA8B;MAAC,cAAc;QAAA;QAAA;MAAA;IAAsB,GAEpFgmB,WAAW,IAAK;MAAO,IAAI,EAAC,MAAM;MAAC,EAAE,EAAC,gBAAgB;MAAC,WAAW,EAAEA,WAAY;MAC/E,KAAK,EAAE,IAAI,CAACvyB,KAAK,CAACiS,OAAQ;MAAC,QAAQ,EAAE,IAAI,CAACs0C,eAAe,CAACh6C,IAAI,CAAC,IAAI,EAAE,SAAS,CAAE;MAAC,QAAQ,EAAE;IAAE,EAAG,CAChF,CAChB,EACN;MAAK,SAAS,EAAC;IAAO,GACpB;MAAO,SAAS,EAAC,OAAO;MAAC,OAAO,EAAC;IAAgB,GAC/C,2DAAC,wDAAgB;MAAC,EAAE,qBAAoB;MAAC,cAAc;QAAA;QAAA;MAAA;IAAc,EACf,CAChD,EACR,2DAAC,wDAAgB;MAAC,EAAE,mCAAkC;MAAC,cAAc;QAAA;QAAA;MAAA;IAAyB,GAE3FgmB,WAAW,IAAK;MAAO,IAAI,EAAC,MAAM;MAAC,EAAE,EAAC,gBAAgB;MAAC,WAAW,EAAEA,WAAY;MAC/E,KAAK,EAAE,IAAI,CAACvyB,KAAK,CAACuQ,WAAY;MAAC,QAAQ,EAAE,IAAI,CAACg2C,eAAe,CAACh6C,IAAI,CAAC,IAAI,EAAE,aAAa,CAAE;MAAC,QAAQ,EAAE;IAAE,EAAG,CACxF,CAChB,CACF,EACN;MAAK,SAAS,EAAC;IAAgB,GAC7B,2DAAC,qDAAQ;MAAC,OAAO,EAAE,IAAI,CAACvM,KAAK,CAAC+tB,SAAU;MAAC,QAAQ,EAAE,CAAE;MAAC,QAAQ,EAAE,IAAI,CAAC04B;IAAoB,EAAG,QAC5F;MAAO,OAAO,EAAE,IAAI,CAACA;IAAoB,GAAC,2DAAC,wDAAgB;MAAC,EAAE,kBAAiB;MAC7E,cAAc;QAAA;QAAA;MAAA;IAAoB,EACqB,CAAQ,CAC7D,EACN,2DAAC,wDAAgB;MAAC,EAAE,qBAAoB;MAAC,cAAc;QAAA;QAAA;MAAA;IAA4B,GAEhFvlD,KAAK,IAAK,2DAAC,wDAAU;MACpB,MAAM,EAAE,IAAI,CAACmL,KAAK,CAACqB,MAAO;MAC1B,IAAI,EAAE,IAAI,CAAC1N,KAAK,CAACuxB,IAAK;MACtB,SAAS,EAAE,IAAK;MAChB,aAAa,EAAE,IAAI,CAACi1B,iBAAkB;MACtC,QAAQ,EAAE,CAAE;MACZ,KAAK,EAAEtlD;IAAM,EAAG,CACA,EACpB;MAAK,SAAS,EAAC;IAAgB,GAC7B;MAAQ,SAAS,EAAEkU;IAAc,GAC/B,2DAAC,wDAAgB;MAAC,EAAE,iBAAgB;MAAC,cAAc;QAAA;QAAA;MAAA;IAAS,EAC1B,CAC3B,CACL,CACD;EAEX;AACF;AAAC;;;;;;;;;;;;;;;;;;;;;AClMyB;AACgD;AAEpC;AACF;AAEkB;AAGtD,MAAMxX,QAAQ,GAAGb,0DAAc,CAAC;EAC9B2pD,MAAM,EAAE;IACN5oD,EAAE,mBAAmB;IACrBC,cAAc;MAAA;MAAA;IAAA;MAAA;MAAA;IAAA;MAAA;MAAA;IAAA;EAEhB,CAAC;EACDtE,MAAM,EAAE;IACNqE,EAAE,mBAAmB;IACrBC,cAAc;MAAA;MAAA;IAAA;MAAA;MAAA;IAAA;MAAA;MAAA;IAAA;EAEhB,CAAC;EACD4oD,MAAM,EAAE;IACN7oD,EAAE,oBAAoB;IACtBC,cAAc;MAAA;MAAA;IAAA;MAAA;MAAA;IAAA;MAAA;MAAA;IAAA;EAEhB,CAAC;EACD6oD,MAAM,EAAE;IACN9oD,EAAE,mBAAmB;IACrBC,cAAc;MAAA;MAAA;IAAA;MAAA;MAAA;IAAA;MAAA;MAAA;IAAA;EAEhB,CAAC;EACD8oD,QAAQ,EAAE;IACR/oD,EAAE,oBAAoB;IACtBC,cAAc;MAAA;MAAA;IAAA;MAAA;MAAA;IAAA;MAAA;MAAA;IAAA;EAEhB,CAAC;EACDgZ,MAAM,EAAE;IACNjZ,EAAE,oBAAoB;IACtBC,cAAc;MAAA;MAAA;IAAA;MAAA;MAAA;IAAA;MAAA;MAAA;IAAA;EAEhB,CAAC;EACDiZ,OAAO,EAAE;IACPlZ,EAAE,qBAAqB;IACvBC,cAAc;MAAA;MAAA;IAAA;MAAA;MAAA;IAAA;MAAA;MAAA;IAAA;EAEhB,CAAC;EACD8Y,KAAK,EAAE;IACL/Y,EAAE,oBAAoB;IACtBC,cAAc;MAAA;MAAA;IAAA;MAAA;MAAA;IAAA;MAAA;MAAA;IAAA;EAEhB;AACF,CAAC,CAAC;AAEF,MAAMqP,iBAAiB,SAAStQ,wDAAe,CAAC;EAC9CsP,WAAW,CAACC,KAAK,EAAE;IACjB,KAAK,CAACA,KAAK,CAAC;IAEZ,IAAI,CAACrM,KAAK,GAAG;MACXid,IAAI,EAAE,CAAC5Q,KAAK,CAAC4Q,IAAI,IAAI,EAAE,EAAE1hB,OAAO,CAAC,GAAG,EAAE,EAAE;IAC1C,CAAC;IAED,IAAI,CAAC0sC,YAAY,GAAG,IAAI,CAACA,YAAY,CAAC17B,IAAI,CAAC,IAAI,CAAC;IAChD,IAAI,CAACmI,YAAY,GAAG,IAAI,CAACA,YAAY,CAACnI,IAAI,CAAC,IAAI,CAAC;IAChD,IAAI,CAAC47B,YAAY,GAAG,IAAI,CAACA,YAAY,CAAC57B,IAAI,CAAC,IAAI,CAAC;EAClD;EAEA07B,YAAY,CAACpoC,GAAG,EAAE;IAChB,IAAIod,IAAI,GAAG,IAAI,CAACjd,KAAK,CAACid,IAAI;IAC1B,MAAMpmB,GAAG,GAAGomB,IAAI,CAACnmB,OAAO,CAAC+I,GAAG,CAAC;IAC7B,IAAIhJ,GAAG,IAAI,CAAC,CAAC,EAAE;MACbomB,IAAI,IAAIpd,GAAG;IACb,CAAC,MAAM;MACLod,IAAI,GAAGA,IAAI,CAAC1hB,OAAO,CAACsE,GAAG,EAAE,EAAE,CAAC;IAC9B;IACA,IAAI,CAAC8O,QAAQ,CAAC;MAACsO,IAAI,EAAEA;IAAI,CAAC,CAAC;EAC7B;EAEAvI,YAAY,GAAG;IAEb,MAAMuI,IAAI,GAAG,CAAC,IAAI,CAACjd,KAAK,CAACid,IAAI,IAAI,GAAG,EAAEnjB,KAAK,CAAC,EAAE,CAAC,CAACwQ,IAAI,EAAE,CAAC1K,IAAI,CAAC,EAAE,CAAC;IAC/D,MAAMknD,MAAM,GAAG,CAAC,IAAI,CAACz6C,KAAK,CAAC4Q,IAAI,IAAI,GAAG,EAAEnjB,KAAK,CAAC,EAAE,CAAC,CAACwQ,IAAI,EAAE,CAAC1K,IAAI,CAAC,EAAE,CAAC;IACjE,IAAIqd,IAAI,KAAK6pC,MAAM,EAAE;MACnB,IAAI,CAACz6C,KAAK,CAAC+7B,QAAQ,CAACnrB,IAAI,CAAC;IAC3B,CAAC,MAAM;MACL,IAAI,CAAC5Q,KAAK,CAACooB,QAAQ,EAAE;IACvB;EACF;EAEA0T,YAAY,GAAG;IACb,IAAI,CAAC97B,KAAK,CAACooB,QAAQ,EAAE;EACvB;EAEA5nB,MAAM,GAAG;IACP,MAAM;MAACvM;IAAa,CAAC,GAAG,IAAI,CAAC+L,KAAK,CAACgD,IAAI;IACvC,MAAMmc,GAAG,GAAG,UAAU;IACtB,MAAMgI,KAAK,GAAG;MACZ,GAAG,EAAElzB,aAAa,CAAC1C,QAAQ,CAAC8oD,MAAM,EAAE;QAAC7mD,GAAG,EAAE;MAAG,CAAC,CAAC;MAC/C,GAAG,EAAES,aAAa,CAAC1C,QAAQ,CAACnE,MAAM,EAAE;QAACoG,GAAG,EAAE;MAAG,CAAC,CAAC;MAC/C,GAAG,EAAES,aAAa,CAAC1C,QAAQ,CAAC+oD,MAAM,EAAE;QAAC9mD,GAAG,EAAE;MAAG,CAAC,CAAC;MAC/C,GAAG,EAAES,aAAa,CAAC1C,QAAQ,CAACgpD,MAAM,EAAE;QAAC/mD,GAAG,EAAE;MAAG,CAAC,CAAC;MAC/C,GAAG,EAAES,aAAa,CAAC1C,QAAQ,CAACipD,QAAQ,EAAE;QAAChnD,GAAG,EAAE;MAAG,CAAC,CAAC;MACjD,GAAG,EAAES,aAAa,CAAC1C,QAAQ,CAACmZ,MAAM,EAAE;QAAClX,GAAG,EAAE;MAAG,CAAC,CAAC;MAC/C,GAAG,EAAES,aAAa,CAAC1C,QAAQ,CAACoZ,OAAO,EAAE;QAACnX,GAAG,EAAE;MAAG,CAAC,CAAC;MAChD,GAAG,EAAES,aAAa,CAAC1C,QAAQ,CAACiZ,KAAK,EAAE;QAAChX,GAAG,EAAE;MAAG,CAAC;IAC/C,CAAC;IAED,IAAIknD,IAAI,GAAG,IAAI,CAAC16C,KAAK,CAAC06C,IAAI,IAAI,EAAE;IAChC,IAAI9pC,IAAI,GAAG,IAAI,CAACjd,KAAK,CAACid,IAAI;IAC1B,IAAI+pC,OAAO,GAAG,CAAC,IAAI,CAAC36C,KAAK,CAAC26C,OAAO,IAAI,EAAE,EAAEzrD,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC;IACzD,IAAIjB,KAAK,GAAG,EAAE;IACd,KAAK,IAAIG,CAAC,GAAC,CAAC,EAAEA,CAAC,GAAC+wB,GAAG,CAAC1yB,MAAM,EAAE2B,CAAC,EAAE,EAAE;MAC/B,IAAImC,CAAC,GAAG4uB,GAAG,CAACm6B,MAAM,CAAClrD,CAAC,CAAC;MACrB,IAAIssD,IAAI,CAACjwD,OAAO,CAAC8F,CAAC,CAAC,IAAI,CAAC,IAAIqgB,IAAI,CAACnmB,OAAO,CAAC8F,CAAC,CAAC,GAAG,CAAC,EAAE;QAE/C;MACF;MACAtC,KAAK,CAACuC,IAAI,CACR;QAAI,GAAG,EAAED;MAAE,GACT,uEAAK42B,KAAK,CAAC52B,CAAC,CAAC,CAAM,EACnB;QAAI,SAAS,EAAC;MAAU,GAAEmqD,IAAI,CAACjwD,OAAO,CAAC8F,CAAC,CAAC,GAAG,CAAC,GAC3C,2DAAC,qDAAQ;QAAC,IAAI,EAAEA,CAAE;QAAC,OAAO,EAAGqgB,IAAI,CAACnmB,OAAO,CAAC8F,CAAC,CAAC,IAAI,CAAG;QAAC,QAAQ,EAAE,IAAI,CAACqrC;MAAa,EAAE,GAElF,2DAAC,qDAAQ;QAAC,IAAI,EAAErrC,CAAE;QAAC,OAAO,EAAGqgB,IAAI,CAACnmB,OAAO,CAAC8F,CAAC,CAAC,IAAI;MAAG,EAAG,CAClD,EAAC,IAAI,CAACyP,KAAK,CAAC26C,OAAO,GAAG;QAAI,SAAS,EAAC;MAAU,GAClD,2DAAC,qDAAQ;QAAC,IAAI,EAAEpqD,CAAE;QAAC,OAAO,EAAGoqD,OAAO,CAAClwD,OAAO,CAAC8F,CAAC,CAAC,IAAI;MAAG,EAAE,CACrD,GAAG,IAAI,CACT,CACN;IACH;IAEA,OACE;MAAK,SAAS,EAAC;IAAmB,GAC/B,IAAI,CAACyP,KAAK,CAACgP,SAAS,GACnB;MAAI,SAAS,EAAC;IAAmB,GAAC,2DAAC,oDAAO;MACxC,MAAM,EAAE,IAAI,CAAChP,KAAK,CAACqB,MAAO;MAC1B,IAAI,EAAE,IAAI,CAACrB,KAAK,CAAC3R,IAAK;MACtB,KAAK,EAAE,IAAI,CAAC2R,KAAK,CAACgP,SAAU;MAC5B,KAAK,EAAE,IAAK;MACZ,MAAM,EAAEjmB,kEAAY,CAAC,IAAI,CAACiX,KAAK,CAACiP,UAAU,GAAG,IAAI,CAACjP,KAAK,CAACiP,UAAU,GAAG,IAAI;IAAE,EAAG,CAAK,GAAG,IAAI,EAC9F;MAAO,SAAS,EAAC;IAAO,GAAC,2DAAC,wDAAgB;MAAC,EAAE,qBAAoB;MAC/D,cAAc;QAAA;QAAA;MAAA;IAAc,EAA8B,CAAQ,EACpE;MAAO,SAAS,EAAC;IAAmB,GACnC,IAAI,CAACjP,KAAK,CAAC26C,OAAO,GACjB,0EAAO,uEACL,sEAAS,yEAAK,IAAI,CAAC36C,KAAK,CAAC46C,SAAS,CAAM,EACxC,uEAAK,IAAI,CAAC56C,KAAK,CAAC66C,YAAY,CAAM,CAC/B,CAAQ,GACb,IAAI,EACN,0EACG5sD,KAAK,CACA,CAAQ,EAChB,sEAAM,EACN;MAAK,SAAS,EAAC;IAAgB,GAC7B;MAAQ,SAAS,EAAC,SAAS;MAAC,OAAO,EAAE,IAAI,CAAC6tC;IAAa,GACrD,2DAAC,wDAAgB;MAAC,EAAE,iBAAgB;MAAC,cAAc;QAAA;QAAA;MAAA;IAAS,EAAiC,CACtF,EACT;MAAQ,SAAS,EAAC,SAAS;MAAC,OAAO,EAAE,IAAI,CAACzzB;IAAa,GACrD,2DAAC,wDAAgB;MAAC,EAAE,aAAY;MAAC,cAAc;QAAA;QAAA;MAAA;IAAK,EAA6B,CAC1E,CACL,CACF;EAEV;AACF;AAAC;AAED,iEAAexH,sDAAU,CAACE,iBAAiB,CAAC;;;;;;;;;;;;;;;;;;;;;;;ACpKlB;AAC8B;AACsB;AACtB;AAEf;AACI;AAE7C,MAAMxP,QAAQ,GAAGb,0DAAc,CAAC;EAC9BuqD,sBAAsB,EAAE;IACtBxpD,EAAE,0BAA0B;IAC5BC,cAAc;MAAA;MAAA;IAAA;EAEhB;AACF,CAAC,CAAC;AAEF,MAAMqV,SAAS,SAAStW,4DAAmB,CAAC;EAC1CsP,WAAW,CAACC,KAAK,EAAE;IACjB,KAAK,CAACA,KAAK,CAAC;IAEZ,IAAI,CAACk7C,OAAO,GAAG,CAAC,CAAC;IACjBF,iDAAsB,CAACG,EAAE,IAAI;MAAE,IAAI,CAACD,OAAO,CAACC,EAAE,CAACpgC,IAAI,CAAC,GAAGogC,EAAE,CAACzgB,IAAI;IAAE,CAAC,CAAC;IAElE,MAAM3f,IAAI,GAAG/a,KAAK,CAAC1D,WAAW,IAAI,IAAI;IACtC,MAAMo+B,IAAI,GAAG,IAAI,CAACwgB,OAAO,CAACngC,IAAI,CAAC;IAE/B,IAAI,CAACpnB,KAAK,GAAG;MACX2I,WAAW,EAAEye,IAAI;MACjBqgC,QAAQ,EAAE1gB,IAAI;MACd2gB,WAAW,EAAE,EAAE;MACfC,iBAAiB,EAAE,IAAI,CAACA,iBAAiB,CAACvgC,IAAI,EAAE2f,IAAI;IACtD,CAAC;IAED,IAAI,CAACkB,YAAY,GAAG,IAAI,CAACA,YAAY,CAAC17B,IAAI,CAAC,IAAI,CAAC;IAChD,IAAI,CAACq7C,cAAc,GAAG,IAAI,CAACA,cAAc,CAACr7C,IAAI,CAAC,IAAI,CAAC;IACpD,IAAI,CAACksC,aAAa,GAAG,IAAI,CAACA,aAAa,CAAClsC,IAAI,CAAC,IAAI,CAAC;IAClD,IAAI,CAACs7C,mBAAmB,GAAG,IAAI,CAACA,mBAAmB,CAACt7C,IAAI,CAAC,IAAI,CAAC;EAChE;EAEA07B,YAAY,CAAC94B,CAAC,EAAE;IACd,IAAI,CAACR,QAAQ,CAAC;MAAC+4C,WAAW,EAAE,IAAI,CAACI,YAAY,CAAC34C,CAAC,CAACyF,MAAM,CAAC3R,KAAK;IAAC,CAAC,CAAC;EACjE;EAEA2kD,cAAc,CAACz4C,CAAC,EAAE;IAChBA,CAAC,CAACC,cAAc,EAAE;IAClB,MAAM+uC,GAAG,GAAI,GAAE,IAAI,CAACn+C,KAAK,CAACynD,QAAS,GAAE,IAAI,CAACznD,KAAK,CAAC0nD,WAAW,CAACrnD,IAAI,EAAG,EAAC,CAAC9E,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;IAC1F,IAAI2V,MAAM,GAAG,IAAI;IACjB,IAAI;MACFA,MAAM,GAAGnB,mFAAgB,CAAE,IAAGouC,GAAI,EAAC,CAAC;IACtC,CAAC,CAAC,OAAOtmD,GAAG,EAAE,CAAC;IAEf,IAAI,CAACqZ,MAAM,IAAI,CAACA,MAAM,CAACob,OAAO,EAAE,EAAE;MAChC,IAAI,CAACy7B,UAAU,CAACC,iBAAiB,CAAC,IAAI,CAAC37C,KAAK,CAACgD,IAAI,CAAC/O,aAAa,CAAC1C,QAAQ,CAAC0pD,sBAAsB,CAAC,CAAC;MACjG;IACF;IACA,IAAI,CAACj7C,KAAK,CAAC+7B,QAAQ,CAACl3B,MAAM,CAAC9J,MAAM,CAAC,OAAO,CAAC,CAAC;EAC7C;EAGAqxC,aAAa,CAACtpC,CAAC,EAAE;IACf,IAAIA,CAAC,CAAC5Q,GAAG,KAAK,OAAO,EAAE;MACrB,IAAI,CAACqpD,cAAc,CAACz4C,CAAC,CAAC;IACxB;EACF;EAEA04C,mBAAmB,GAAG;IACpB,IAAI,CAACx7C,KAAK,CAAC4E,qBAAqB,CAAC,IAAI,CAACjR,KAAK,CAAC2I,WAAW,EAAE,IAAI,CAAC3I,KAAK,CAACynD,QAAQ,EAC1E,CAACrgC,IAAI,EAAE2f,IAAI,KAAK;MACZ,IAAI,CAACp4B,QAAQ,CAAC;QACZhG,WAAW,EAAEye,IAAI;QACjBqgC,QAAQ,EAAE1gB,IAAI;QACd4gB,iBAAiB,EAAE,IAAI,CAACA,iBAAiB,CAACvgC,IAAI,EAAE2f,IAAI;MACxD,CAAC,CAAC;IACJ,CAAC,CAAC;EACN;EAGA+gB,YAAY,CAAC52C,MAAM,EAAE;IACnB,IAAI,CAACA,MAAM,EAAE;MACX,OAAOA,MAAM;IACf;IAGA,OAAOA,MAAM,CAAC3V,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC;EAC3C;EAEAosD,iBAAiB,CAACvgC,IAAI,EAAE2f,IAAI,EAAE;IAC5B,MAAMkhB,MAAM,GAAGd,0EAAgB,CAAC//B,IAAI,EAAEggC,yEAAQ,CAAC;IAC/C,OAAOa,MAAM,GAAGA,MAAM,CAAC92C,mBAAmB,EAAE,CAACja,SAAS,CAAC6vC,IAAI,CAACjuC,MAAM,GAAG,CAAC,CAAC,CAACuH,IAAI,EAAE,GAAG,UAAU;EAC7F;EAEAwM,MAAM,GAAG;IACP,OACE,0HACE;MAAM,SAAS,EAAC,WAAW;MAAC,OAAO,EAAE,IAAI,CAACg7C;IAAoB,GAC5D;MAAM,SAAS,EAAC;IAAc,GAAEn/C,yDAAS,CAAC,IAAI,CAAC1I,KAAK,CAAC2I,WAAW,CAAC,EAAC,MAAM,CAAO,KAC9E,EAAC,IAAI,CAAC3I,KAAK,CAACynD,QAAQ,EAAC,MAAM,CAAO,EACrC;MAAO,IAAI,EAAC,KAAK;MAAC,GAAG,EAAEnyD,GAAG,IAAI;QAAC,IAAI,CAACyyD,UAAU,GAAGzyD,GAAG;MAAA,CAAE;MAAC,WAAW,EAAE,IAAI,CAAC0K,KAAK,CAAC2nD,iBAAkB;MAC7F,KAAK,EAAE,IAAI,CAAC3nD,KAAK,CAAC0nD,WAAY;MAAC,QAAQ,EAAE,IAAI,CAACzf,YAAa;MAC3D,SAAS,EAAE,EAAG;MAAC,SAAS,EAAE,IAAI,CAACwQ,aAAc;MAAC,MAAM,EAAE,IAAI,CAACmP,cAAe;MAC1E,QAAQ;MAAC,SAAS,EAAE,IAAI,CAACv7C,KAAK,CAACstC;IAAU,EAAG,CAC/C;EAEP;AACF;AAEA,iEAAezsC,sDAAU,CAACkG,SAAS,CAAC;;;;;;;;;;;;;;;;;;;;;AC3GV;AAC8B;AAEpB;AAEa;AAEjD,MAAMxV,QAAQ,GAAGb,0DAAc,CAAC;EAC9BmrD,eAAe,EAAE;IACfpqD,EAAE,mBAAmB;IACrBC,cAAc;MAAA;MAAA;IAAA;EAEhB,CAAC;EACDoqD,sBAAsB,EAAE;IACtBrqD,EAAE,0BAA0B;IAC5BC,cAAc;MAAA;MAAA;IAAA;EAEhB,CAAC;EACDqqD,qBAAqB,EAAE;IACrBtqD,EAAE,yBAAyB;IAC3BC,cAAc;MAAA;MAAA;IAAA;EAEhB;AACF,CAAC,CAAC;AAEF,MAAM23C,cAAc,SAAS54C,4DAAmB,CAAC;EAC/C+P,MAAM,GAAG;IACP,MAAM;MAACvM;IAAa,CAAC,GAAG,IAAI,CAAC+L,KAAK,CAACgD,IAAI;IACvC,IAAIqoC,SAAS;IACb,IAAI,IAAI,CAACrrC,KAAK,CAACjB,QAAQ,IAAIpC,qEAA6B,EAAE;MACxD0uC,SAAS,GAAGp3C,aAAa,CAAC1C,QAAQ,CAACsqD,eAAe,CAAC;IACrD,CAAC,MAAM,IAAI,IAAI,CAAC77C,KAAK,CAACjB,QAAQ,IAAIpC,oEAA4B,EAAE;MAC9D0uC,SAAS,GAAGp3C,aAAa,CAAC1C,QAAQ,CAACuqD,sBAAsB,CAAC;IAC5D,CAAC,MAAM;MACLzQ,SAAS,GAAG,IAAI,CAACrrC,KAAK,CAACqrC,SAAS,CAACxxC,kBAAkB,CAAC,IAAI,CAACmG,KAAK,CAACgD,IAAI,CAAC5J,MAAM,EAAE;QAAE4iD,SAAS,EAAE;MAAQ,CAAC,CAAC;IACrG;IAEA,MAAMn6B,IAAI,GAAG/iB,6DAAc,CAAC,IAAI,CAACkB,KAAK,CAACjB,QAAQ,CAAC;IAChD,MAAMowC,MAAM,GAAGttB,IAAI,GAAG;MAAG,SAAS,EAAE,uBAAuB,GAAGA,IAAI,CAAC3iB;IAAM,GAAE2iB,IAAI,CAACl1B,IAAI,CAAK,GAAG,IAAI;IAChG,MAAM49C,MAAM,GAAG,IAAI,CAACvqC,KAAK,CAACuqC,MAAM,GAAGt2C,aAAa,CAAC1C,QAAQ,CAACwqD,qBAAqB,CAAC,GAAG,IAAI;IAEvF,OACE;MAAM,SAAS,EAAC;IAAW,GACxB1Q,SAAS,EAAEd,MAAM,EAAE,QAAQ,EAAE4E,MAAM,CAC/B;EAEX;AACF;AAAC;AAED,iEAAetuC,sDAAU,CAACwoC,cAAc,CAAC;;;;;;;;;;;;;;;;;;AClDf;AAEU;AAErB,MAAMvlB,cAAc,SAASrzB,4DAAmB,CAAC;EAC9DsP,WAAW,CAACC,KAAK,EAAE;IACjB,KAAK,CAACA,KAAK,CAAC;IAEZ,IAAI,CAACrM,KAAK,GAAG;MACX42C,MAAM,EAAE,KAAK;MACbptB,MAAM,EAAE;IACV,CAAC;IAED,IAAI,CAAC8+B,kBAAkB,GAAG,IAAI,CAACA,kBAAkB,CAAC/7C,IAAI,CAAC,IAAI,CAAC;IAC5D,IAAI,CAACg8C,YAAY,GAAG,IAAI,CAACA,YAAY,CAACh8C,IAAI,CAAC,IAAI,CAAC;IAChD,IAAI,CAACi8C,WAAW,GAAG,IAAI,CAACA,WAAW,CAACj8C,IAAI,CAAC,IAAI,CAAC;IAC9C,IAAI,CAACksC,aAAa,GAAG,IAAI,CAACA,aAAa,CAAClsC,IAAI,CAAC,IAAI,CAAC;EACpD;EAEAmM,oBAAoB,GAAG;IACrB,IAAI,IAAI,CAAC1Y,KAAK,CAAC42C,MAAM,EAAE;MACrB,IAAI,CAACjoC,QAAQ,CAAC;QAAC6a,MAAM,EAAE,EAAE;QAAEotB,MAAM,EAAE;MAAK,CAAC,CAAC;MAC1C,IAAI,CAACvqC,KAAK,CAAC6kB,gBAAgB,CAACloB,uDAAe,CAAC;IAC9C;EACF;EAEAs/C,kBAAkB,CAACn5C,CAAC,EAAE;IACpB,IAAI,CAACR,QAAQ,CAAC;MAAC6a,MAAM,EAAEra,CAAC,CAACyF,MAAM,CAAC3R;IAAK,CAAC,CAAC;EACzC;EAEAslD,YAAY,CAACp5C,CAAC,EAAE;IACdA,CAAC,CAACC,cAAc,EAAE;IAClB,MAAM6hB,KAAK,GAAG,IAAI,CAACjxB,KAAK,CAACwpB,MAAM,CAACnpB,IAAI,EAAE;IACtC,IAAI,CAACsO,QAAQ,CAAC;MAACioC,MAAM,EAAG3lB,KAAK,CAACn4B,MAAM,GAAG;IAAE,CAAC,CAAC;IAC3C,IAAI,CAACuT,KAAK,CAAC6kB,gBAAgB,CAACD,KAAK,CAACn4B,MAAM,GAAG,CAAC,GAAGm4B,KAAK,GAAGjoB,uDAAe,CAAC;EACzE;EAEAw/C,WAAW,CAACr5C,CAAC,EAAE;IACbA,CAAC,CAACC,cAAc,EAAE;IAClB,IAAI,IAAI,CAACpP,KAAK,CAAC42C,MAAM,EAAE;MACrB,IAAI,CAACvqC,KAAK,CAAC6kB,gBAAgB,CAACloB,uDAAe,CAAC;IAC9C;IACA,IAAI,CAAC2F,QAAQ,CAAC;MAAC6a,MAAM,EAAE,EAAE;MAAEotB,MAAM,EAAE;IAAK,CAAC,CAAC;EAC5C;EAEA6B,aAAa,CAACtpC,CAAC,EAAE;IACf,IAAIA,CAAC,CAAC5Q,GAAG,KAAK,OAAO,EAAE;MACrB,IAAI,CAACgqD,YAAY,CAACp5C,CAAC,CAAC;IACtB,CAAC,MAAM,IAAIA,CAAC,CAAC5Q,GAAG,KAAK,QAAQ,EAAE;MAC7B,IAAI,CAACiqD,WAAW,EAAE;IACpB;EACF;EAEA37C,MAAM,GAAG;IACP,OACE;MAAK,SAAS,EAAC;IAAY,GACzB;MAAK,SAAS,EAAC;IAAgB,GAC7B;MAAG,SAAS,EAAC;IAAuB,GAAC,QAAM,CAAI,EAC/C;MAAO,SAAS,EAAC,QAAQ;MAAC,IAAI,EAAC,MAAM;MACjC,WAAW,EAAE,IAAI,CAACR,KAAK,CAACkmB,WAAY;MACpC,KAAK,EAAE,IAAI,CAACvyB,KAAK,CAACwpB,MAAO;MAAC,QAAQ,EAAE,IAAI,CAAC8+B,kBAAmB;MAC5D,SAAS,EAAE,IAAI,CAAC7P,aAAc;MAAC,QAAQ;MAAC,SAAS;IAAA,EAAG,EACvD,IAAI,CAACz4C,KAAK,CAACwpB,MAAM,GAChB;MAAG,IAAI,EAAC,GAAG;MAAC,OAAO,EAAE,IAAI,CAACg/B;IAAY,GAAC;MAAG,SAAS,EAAC;IAAgB,GAAC,eAAa,CAAI,CAAI,GAE1F,yEAAM;MAAG,SAAS,EAAC;IAAgB,GAAC,MAAM,CAAI,CAAO,CACnD,CACF;EAEV;AACF;AAAC;;;;;;;;;;;;;;;;;;;;;;;ACrEuC;AACkC;AACtC;AAIpC,MAAMC,aAAa,GAAG3rD,iDAAU,CAACxD,CAAC,IAAI,uRAA8B,CAAC;AAEvB;AACM;AACE;AAEtD,MAAMsE,QAAQ,GAAGb,0DAAc,CAAC;EAC9B2rD,kBAAkB,EAAE;IAClB5qD,EAAE,6BAA6B;IAC/BC,cAAc;MAAA;MAAA;IAAA;EAEhB,CAAC;EACD4qD,gBAAgB,EAAE;IAChB7qD,EAAE,sBAAsB;IACxBC,cAAc;MAAA;MAAA;IAAA;EAEhB,CAAC;EACD6qD,iBAAiB,EAAE;IACjB9qD,EAAE,wBAAwB;IAC1BC,cAAc;MAAA;MAAA;IAAA;EAEhB,CAAC;EACDohB,yBAAyB,EAAE;IACzBrhB,EAAE,6BAA6B;IAC/BC,cAAc;MAAA;MAAA;IAAA;MAAA;MAAA;IAAA;MAAA;MAAA;IAAA;MAAA;MAAA;IAAA;MAAA;MAAA;IAAA;EAEhB,CAAC;EACD2sB,sBAAsB,EAAE;IACtB5sB,EAAE,+BAA+B;IACjCC,cAAc;MAAA;MAAA;IAAA;EAEhB,CAAC;EACD8qD,uBAAuB,EAAE;IACvB/qD,EAAE,2BAA2B;IAC7BC,cAAc;MAAA;MAAA;IAAA;EAEhB,CAAC;EACD+qD,sBAAsB,EAAE;IACtBhrD,EAAE,0BAA0B;IAC5BC,cAAc;MAAA;MAAA;IAAA;EAEhB,CAAC;EACDgrD,oBAAoB,EAAE;IACpBjrD,EAAE,wBAAwB;IAC1BC,cAAc;MAAA;MAAA;IAAA;EAEhB,CAAC;EACDirD,eAAe,EAAE;IACflrD,EAAE,mBAAmB;IACrBC,cAAc;MAAA;MAAA;IAAA;EAEhB;AACF,CAAC,CAAC;AAEF,MAAM6gB,WAAW,SAAS9hB,4DAAmB,CAAC;EAC5CsP,WAAW,CAACC,KAAK,EAAE;IACjB,KAAK,CAACA,KAAK,CAAC;IAEZ,IAAI,CAACrM,KAAK,GAAG;MACXysB,KAAK,EAAE,IAAI;MACXpqB,OAAO,EAAE,EAAE;MACX4mD,QAAQ,EAAE,KAAK;MACfC,cAAc,EAAE,CAAC,EAAExjD,SAAS,CAACssC,YAAY,IAAItsC,SAAS,CAACssC,YAAY,CAACC,YAAY;IAClF,CAAC;IAGD,IAAI,CAACkX,iBAAiB,GAAG,CAAC;IAE1B,IAAI,CAACC,gBAAgB,GAAG,IAAI,CAACA,gBAAgB,CAAC78C,IAAI,CAAC,IAAI,CAAC;IACxD,IAAI,CAAC88C,iBAAiB,GAAG,IAAI,CAACA,iBAAiB,CAAC98C,IAAI,CAAC,IAAI,CAAC;IAC1D,IAAI,CAACiV,gBAAgB,GAAG,IAAI,CAACA,gBAAgB,CAACjV,IAAI,CAAC,IAAI,CAAC;IACxD,IAAI,CAAC+8C,iBAAiB,GAAG,IAAI,CAACA,iBAAiB,CAAC/8C,IAAI,CAAC,IAAI,CAAC;IAC1D,IAAI,CAACg9C,UAAU,GAAG,IAAI,CAACA,UAAU,CAACh9C,IAAI,CAAC,IAAI,CAAC;IAC5C,IAAI,CAAC27B,cAAc,GAAG,IAAI,CAACA,cAAc,CAAC37B,IAAI,CAAC,IAAI,CAAC;IACpD,IAAI,CAACi9C,mBAAmB,GAAG,IAAI,CAACA,mBAAmB,CAACj9C,IAAI,CAAC,IAAI,CAAC;IAC9D,IAAI,CAACk9C,gBAAgB,GAAG,IAAI,CAACA,gBAAgB,CAACl9C,IAAI,CAAC,IAAI,CAAC;IAExD,IAAI,CAAC2V,gBAAgB,GAAG,IAAI,CAACA,gBAAgB,CAAC3V,IAAI,CAAC,IAAI,CAAC;IAExD,IAAI,CAACm9C,WAAW,GAAG,IAAI,CAACA,WAAW,CAACn9C,IAAI,CAAC,IAAI,CAAC;EAChD;EAEA2W,iBAAiB,GAAG;IAClB,IAAI,IAAI,CAACymC,eAAe,EAAE;MACxB,IAAI,CAACA,eAAe,CAACvmC,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAACgmC,gBAAgB,EAAE,KAAK,CAAC;MAC5E,IAAI3sD,MAAM,CAACmtD,gBAAgB,CAAC,IAAI,CAACD,eAAe,CAAC,CAACE,gBAAgB,CAAC,qBAAqB,CAAC,IAAI,KAAK,EAAE;QAElG,IAAI,CAACF,eAAe,CAACjF,KAAK,EAAE;MAC9B;IACF;IAEA,IAAI,CAAC/1C,QAAQ,CAAC;MAAC8d,KAAK,EAAE,IAAI,CAACi9B,WAAW;IAAE,CAAC,CAAC;EAC5C;EAEAhxC,oBAAoB,GAAG;IACrB,IAAI,IAAI,CAACixC,eAAe,EAAE;MACxB,IAAI,CAACA,eAAe,CAACtmC,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC+lC,gBAAgB,EAAE,KAAK,CAAC;IACjF;EACF;EAEA52C,kBAAkB,CAACC,SAAS,EAAE;IAC5B,IAAI,IAAI,CAACk3C,eAAe,EAAE;MACxB,IAAIltD,MAAM,CAACmtD,gBAAgB,CAAC,IAAI,CAACD,eAAe,CAAC,CAACE,gBAAgB,CAAC,qBAAqB,CAAC,IAAI,KAAK,EAAE;QAElG,IAAI,CAACF,eAAe,CAACjF,KAAK,EAAE;MAC9B;IACF;IAEA,IAAIjyC,SAAS,CAAC2J,SAAS,IAAI,IAAI,CAAC/P,KAAK,CAAC+P,SAAS,EAAE;MAC/C,IAAI,CAACzN,QAAQ,CAAC;QAACtM,OAAO,EAAE,IAAI,CAACgK,KAAK,CAACy9C,WAAW,IAAI,EAAE;QAAEb,QAAQ,EAAE,KAAK;QAAEx8B,KAAK,EAAE;MAAI,CAAC,CAAC;IACtF,CAAC,MAAM,IAAIha,SAAS,CAACq3C,WAAW,IAAI,IAAI,CAACz9C,KAAK,CAACy9C,WAAW,EAAE;MAC1D,MAAMnhC,GAAG,GAAG,IAAI,CAACtc,KAAK,CAACy9C,WAAW,IAAI,EAAE;MACxC,IAAI,CAACn7C,QAAQ,CAAC;QAACtM,OAAO,EAAEsmB;MAAG,CAAC,EAAErvB,CAAC,IAAI;QAEjC,IAAI,CAACqwD,eAAe,CAACnmC,SAAS,GAAG,IAAI,CAACmmC,eAAe,CAAClmC,YAAY;QAClE,IAAI,CAACkmC,eAAe,CAACI,iBAAiB,CAACphC,GAAG,CAAC7vB,MAAM,EAAE6vB,GAAG,CAAC7vB,MAAM,CAAC;MAChE,CAAC,CAAC;IACJ;IACA,IAAI2Z,SAAS,CAAC8S,KAAK,IAAI,IAAI,CAAClZ,KAAK,CAACkZ,KAAK,EAAE;MACvC,IAAI,CAAC5W,QAAQ,CAAC;QAAC8d,KAAK,EAAE,IAAI,CAACi9B,WAAW;MAAE,CAAC,CAAC;IAC5C;EACF;EAEAA,WAAW,GAAG;IACZ,OAAO,IAAI,CAACr9C,KAAK,CAACkZ,KAAK,GACrBvoB,qDAAa,CAAC,IAAI,CAACqP,KAAK,CAACkZ,KAAK,CAACM,OAAO,EAAE5jB,8DAAc,EAAE;MACtD3B,aAAa,EAAE,IAAI,CAAC+L,KAAK,CAACgD,IAAI,CAAC/O,aAAa,CAACiM,IAAI,CAAC,IAAI,CAACF,KAAK,CAACgD,IAAI,CAAC;MAClEtQ,YAAY,EAAE,IAAI,CAACsN,KAAK,CAACqB,MAAM,CAAC3O,YAAY,CAACwN,IAAI,CAAC,IAAI,CAACF,KAAK,CAACqB,MAAM;IACrE,CAAC,CAAC,GAAG,IAAI;EACb;EAEA07C,gBAAgB,CAACj6C,CAAC,EAAE;IAClB,IAAI,IAAI,CAAC9C,KAAK,CAACgJ,QAAQ,EAAE;MACvB;IACF;IAEA,IAAIpb,gEAAU,CAACkV,CAAC,EACd3V,IAAI,IAAI;MAAE,IAAI,CAAC6S,KAAK,CAAC29C,aAAa,CAACxwD,IAAI,CAAC;IAAE,CAAC,EAC3CA,IAAI,IAAI;MAAE,IAAI,CAAC6S,KAAK,CAAC49C,YAAY,CAACzwD,IAAI,CAAC;IAAE,CAAC,EAC1C,IAAI,CAAC6S,KAAK,CAAChS,OAAO,CAAC,EAAE;MAGrB8U,CAAC,CAACC,cAAc,EAAE;IACpB;EACF;EAEAi6C,iBAAiB,CAACl6C,CAAC,EAAE;IACnB,IAAIA,CAAC,CAACyF,MAAM,CAACkX,KAAK,IAAI3c,CAAC,CAACyF,MAAM,CAACkX,KAAK,CAAChzB,MAAM,GAAG,CAAC,EAAE;MAC/C,IAAI,CAACuT,KAAK,CAAC29C,aAAa,CAAC76C,CAAC,CAACyF,MAAM,CAACkX,KAAK,CAAC,CAAC,CAAC,CAAC;IAC7C;IAEA3c,CAAC,CAACyF,MAAM,CAAC3R,KAAK,GAAG,EAAE;EACrB;EAEAue,gBAAgB,CAACrS,CAAC,EAAE;IAClB,IAAIA,CAAC,CAACyF,MAAM,CAACkX,KAAK,IAAI3c,CAAC,CAACyF,MAAM,CAACkX,KAAK,CAAChzB,MAAM,GAAG,CAAC,EAAE;MAC/C,IAAI,CAACuT,KAAK,CAAC49C,YAAY,CAAC96C,CAAC,CAACyF,MAAM,CAACkX,KAAK,CAAC,CAAC,CAAC,CAAC;IAC5C;IAEA3c,CAAC,CAACyF,MAAM,CAAC3R,KAAK,GAAG,EAAE;EACrB;EAEAwmD,gBAAgB,CAAC39B,KAAK,EAAE;IACtB,IAAIA,KAAK,IAAIA,KAAK,CAAChzB,MAAM,GAAG,CAAC,EAAE;MAC7B,IAAI,CAACuT,KAAK,CAAC49C,YAAY,CAACn+B,KAAK,CAAC,CAAC,CAAC,CAAC;IACnC;EACF;EAEAw9B,iBAAiB,CAAC7kD,GAAG,EAAEvF,OAAO,EAAEF,QAAQ,EAAE;IACxC,IAAI,CAAC2P,QAAQ,CAAC;MAACs6C,QAAQ,EAAE;IAAK,CAAC,CAAC;IAChC,IAAI,CAAC58C,KAAK,CAAC69C,aAAa,CAACzlD,GAAG,EAAEvF,OAAO,EAAEF,QAAQ,CAAC;EAClD;EAEAuqD,UAAU,CAACp6C,CAAC,EAAE;IACZA,CAAC,CAACC,cAAc,EAAE;IAClB,MAAM/M,OAAO,GAAG,IAAI,CAACrC,KAAK,CAACqC,OAAO,CAAChC,IAAI,EAAE;IACzC,IAAIgC,OAAO,IAAI,IAAI,CAACgK,KAAK,CAAC89C,WAAW,IAAI,IAAI,CAAC99C,KAAK,CAAC+9C,OAAO,EAAE;MAC3D,IAAI,CAAC/9C,KAAK,CAACu1C,aAAa,CAACv/C,OAAO,CAAC;MACjC,IAAI,CAACsM,QAAQ,CAAC;QAACtM,OAAO,EAAE;MAAE,CAAC,CAAC;IAC9B;EACF;EAGA6lC,cAAc,CAAC/4B,CAAC,EAAE;IAChB,IAAI,IAAI,CAACnP,KAAK,CAACipD,QAAQ,EAAE;MAEvB95C,CAAC,CAACC,cAAc,EAAE;MAClBD,CAAC,CAACua,eAAe,EAAE;MACnB;IACF;IAGA,IAAIva,CAAC,CAAC5Q,GAAG,KAAK,OAAO,EAAE;MAErB,IAAI,CAAC4Q,CAAC,CAACk7C,QAAQ,EAAE;QACfl7C,CAAC,CAACC,cAAc,EAAE;QAClBD,CAAC,CAACua,eAAe,EAAE;QAEnB,IAAI,CAAC6/B,UAAU,CAACp6C,CAAC,CAAC;MACpB;IACF;EACF;EAEAq6C,mBAAmB,CAACr6C,CAAC,EAAE;IACrB,IAAI,CAACR,QAAQ,CAAC;MAACtM,OAAO,EAAE8M,CAAC,CAACyF,MAAM,CAAC3R;IAAK,CAAC,CAAC;IACxC,IAAI,IAAI,CAACoJ,KAAK,CAACi+C,UAAU,EAAE;MACzB,MAAMzkD,GAAG,GAAG,IAAIC,IAAI,EAAE,CAACc,OAAO,EAAE;MAChC,IAAIf,GAAG,GAAG,IAAI,CAACsjD,iBAAiB,GAAG12D,sDAAc,EAAE;QACjD,IAAI,CAAC4Z,KAAK,CAACi+C,UAAU,EAAE;QACvB,IAAI,CAACnB,iBAAiB,GAAGtjD,GAAG;MAC9B;IACF;EACF;EAEAqc,gBAAgB,CAAC/S,CAAC,EAAE;IAClBA,CAAC,CAACC,cAAc,EAAE;IAClBD,CAAC,CAACua,eAAe,EAAE;IACnB,IAAI,IAAI,CAACrd,KAAK,CAACkZ,KAAK,IAAI,IAAI,CAAClZ,KAAK,CAACvM,YAAY,EAAE;MAC/C,MAAM+sB,UAAU,GAAG,IAAI,CAACxgB,KAAK,CAACkZ,KAAK,CAACO,GAAG;MACvC,IAAI,CAACzZ,KAAK,CAACvM,YAAY,CAAC+sB,UAAU,CAAC;IACrC;EACF;EAEAhgB,MAAM,GAAG;IACP,MAAM;MAAEvM;IAAc,CAAC,GAAG,IAAI,CAAC+L,KAAK,CAACgD,IAAI;IACzC,MAAMspC,MAAM,GAAG,IAAI,CAACtsC,KAAK,CAACgJ,QAAQ,GAChC/U,aAAa,CAAC1C,QAAQ,CAAC8qD,kBAAkB,CAAC,GACzC,IAAI,CAACr8C,KAAK,CAACk+C,aAAa,GACvBjqD,aAAa,CAAC1C,QAAQ,CAAC,IAAI,CAACyO,KAAK,CAACk+C,aAAa,CAAC,CAAC,GACjDjqD,aAAa,CAAC1C,QAAQ,CAAC+qD,gBAAgB,CAAE;IAE7C,MAAM6B,QAAQ,GAAI,IAAI,CAACn+C,KAAK,CAACkZ,KAAK,IAAI,IAAI,CAAClZ,KAAK,CAACkZ,KAAK,CAAC8E,OAAO,GAC5D,cAAc,GAAG,MAAM;IAEzB,MAAMoC,KAAK,GAAG,IAAI,CAACzsB,KAAK,CAACysB,KAAK,GAC3B;MAAK,EAAE,EAAC;IAAqB,GAC5B;MAAK,SAAS,EAAC;IAAQ,GACrB;MAAG,IAAI,EAAC,GAAG;MAAC,OAAO,EAAEtd,CAAC,IAAI;QAACA,CAAC,CAACC,cAAc,EAAE;QAAE,IAAI,CAAC/C,KAAK,CAACw1C,aAAa,EAAE;MAAC;IAAE,GAAC;MAAG,SAAS,EAAC;IAAqB,GAAC,OAAK,CAAI,CAAI,CACzH,EACL,IAAI,CAAC7hD,KAAK,CAACysB,KAAK,CACb,GAAI,IAAI;IAChB,MAAMg+B,YAAY,GAAG,IAAI,CAACzqD,KAAK,CAACkpD,cAAc,IAAI,IAAI,CAAC78C,KAAK,CAAC69C,aAAa;IAC1E,OACE;MAAK,EAAE,EAAC;IAAsB,GAC3B,CAAC,IAAI,CAAC79C,KAAK,CAAC+9C,OAAO,GAAG39B,KAAK,GAAG,IAAI,EACnC;MAAK,EAAE,EAAC;IAAoB,GACzB,CAAC,IAAI,CAACpgB,KAAK,CAACgJ,QAAQ,GACnB,0HACG,IAAI,CAAChJ,KAAK,CAAC49C,YAAY,IAAI,CAAC,IAAI,CAACjqD,KAAK,CAACipD,QAAQ,GAC9C,0HACE;MAAG,IAAI,EAAC,GAAG;MAAC,OAAO,EAAE95C,CAAC,IAAI;QAACA,CAAC,CAACC,cAAc,EAAE;QAAE,IAAI,CAACs7C,WAAW,CAACC,KAAK,EAAE;MAAC,CAAE;MAAC,KAAK,EAAErqD,aAAa,CAAC1C,QAAQ,CAACmrD,oBAAoB;IAAE,GAC7H;MAAG,SAAS,EAAC;IAA0B,GAAC,OAAK,CAAI,CAC/C,EACJ;MAAG,IAAI,EAAC,GAAG;MAAC,OAAO,EAAE55C,CAAC,IAAI;QAACA,CAAC,CAACC,cAAc,EAAE;QAAE,IAAI,CAACub,UAAU,CAACggC,KAAK,EAAE;MAAC,CAAE;MAAC,KAAK,EAAErqD,aAAa,CAAC1C,QAAQ,CAACkrD,sBAAsB;IAAE,GAC9H;MAAG,SAAS,EAAC;IAA0B,GAAC,aAAW,CAAI,CACrD,CACH,GAEH,IAAI,EACL,IAAI,CAACz8C,KAAK,CAAC+9C,OAAO,GAChB39B,KAAK,IAAI;MAAK,SAAS,EAAC;IAAS,EAAG,GACpC,IAAI,CAACzsB,KAAK,CAACipD,QAAQ,GACjB,2DAAC,2CAAQ;MAAC,QAAQ,EAAE,wEAAK,2DAAC,wDAAgB;QAAC,EAAE,gBAAe;QAAC,cAAc;UAAA;UAAA;QAAA;MAAa,EAClC;IAAO,GAC5D,2DAAC,aAAa;MACZ,mBAAmB,EAAE3vD,CAAC,IAAI,IAAI,CAAC+S,KAAK,CAACi+C,UAAU,CAAC,IAAI,CAAE;MACtD,SAAS,EAAEhxD,CAAC,IAAI,IAAI,CAACqV,QAAQ,CAAC;QAACs6C,QAAQ,EAAE;MAAK,CAAC,CAAE;MACjD,UAAU,EAAE,IAAI,CAACK;IAAkB,EAAE,CAC9B,GACX;MAAU,EAAE,EAAC,oBAAoB;MAAC,WAAW,EAAE3Q,MAAO;MACpD,KAAK,EAAE,IAAI,CAAC34C,KAAK,CAACqC,OAAQ;MAAC,QAAQ,EAAE,IAAI,CAACmnD,mBAAoB;MAC9D,UAAU,EAAE,IAAI,CAACthB,cAAe;MAChC,GAAG,EAAE5yC,GAAG,IAAI;QAAC,IAAI,CAACq0D,eAAe,GAAGr0D,GAAG;MAAC;IAAE,EAAI,EACnD,IAAI,CAAC0K,KAAK,CAACqC,OAAO,IAAI,CAACooD,YAAY,GAClC;MAAG,IAAI,EAAC,GAAG;MAAC,OAAO,EAAE,IAAI,CAAClB,UAAW;MAAC,KAAK,EAAEjpD,aAAa,CAAC1C,QAAQ,CAACorD,eAAe;IAAE,GACnF;MAAG,SAAS,EAAC;IAAgB,GAAEwB,QAAQ,CAAK,CAC1C,GACJ,CAAC,IAAI,CAACxqD,KAAK,CAACipD,QAAQ,GAClB;MAAG,IAAI,EAAC,GAAG;MAAC,OAAO,EAAE95C,CAAC,IAAI;QAACA,CAAC,CAACC,cAAc,EAAE;QAAE,IAAI,CAACT,QAAQ,CAAC;UAACs6C,QAAQ,EAAE;QAAI,CAAC,CAAC;MAAA,CAAE;MAAC,KAAK,EAAE3oD,aAAa,CAAC1C,QAAQ,CAACirD,uBAAuB;IAAE,GACtI;MAAG,SAAS,EAAC;IAAgB,GAAC,KAAG,CAAI,CACnC,GACJ,IAAI,EAER;MAAO,IAAI,EAAC,MAAM;MAAC,GAAG,EAAEvzD,GAAG,IAAI;QAAC,IAAI,CAACq1B,UAAU,GAAGr1B,GAAG;MAAA,CAAE;MACrD,QAAQ,EAAE,IAAI,CAACksB,gBAAiB;MAAC,KAAK,EAAE;QAACopC,OAAO,EAAE;MAAM;IAAE,EAAG,EAC/D;MAAO,IAAI,EAAC,MAAM;MAAC,GAAG,EAAEt1D,GAAG,IAAI;QAAC,IAAI,CAACo1D,WAAW,GAAGp1D,GAAG;MAAA,CAAE;MAAC,MAAM,EAAC,kBAAkB;MAChF,QAAQ,EAAE,IAAI,CAAC+zD,iBAAkB;MAAC,KAAK,EAAE;QAACuB,OAAO,EAAE;MAAM;IAAE,EAAG,CAC/D,GAEH;MAAK,EAAE,EAAC;IAAkB,GAAEjS,MAAM,CAAO,CAEvC,CACF;EAEV;AACF;AAAC;AAED,iEAAezrC,sDAAU,CAAC0R,WAAW,CAAC;;;;;;;;;;;;;;;;;;;;;;AChTZ;AAEiB;AACA;AACM;AACF;AACN;AAEY;AAEtC,MAAMiV,UAAU,SAAS/2B,4DAAmB,CAAC;EAC1D+P,MAAM,GAAG;IACP,MAAMmhB,WAAW,GAAG,EAAE;IACtB,IAAI,IAAI,CAAC3hB,KAAK,CAACkF,aAAa,EAAE;MAC5B,IAAI,CAAClF,KAAK,CAACkF,aAAa,CAAC7R,GAAG,CAAEpD,CAAC,IAAK;QAClC0xB,WAAW,CAACnxB,IAAI,CAAC;UAACqxB,IAAI,EAAE5xB,CAAC;UAAEiP,KAAK,EAAE;QAAW,CAAC,CAAC;MACjD,CAAC,CAAC;IACJ;IACA,IAAIiF,MAAM,GAAG,IAAI;IACjB,IAAI,IAAI,CAACnE,KAAK,CAACqB,MAAM,EAAE;MACrB8C,MAAM,GAAG,IAAI,CAACnE,KAAK,CAACqB,MAAM,CAAC3O,YAAY,CAACpB,iEAAkB,CAAC,IAAI,CAAC0O,KAAK,CAACmE,MAAM,EAAE,OAAO,CAAC,CAAC;IACzF;IACA,OACE;MAAK,EAAE,EAAC,oBAAoB;MAAC,SAAS,EAAC;IAAe,GACnD,IAAI,CAACnE,KAAK,CAACooB,QAAQ,GAAG,2DAAC,wDAAU;MAAC,MAAM,EAAE,IAAI,CAACpoB,KAAK,CAACooB;IAAS,EAAG,GAAG,IAAI,EACxEjkB,MAAM,GACL;MAAK,EAAE,EAAC,aAAa;MAAC,SAAS,EAAC;IAAY,GAC1C,2DAAC,wDAAU;MACT,MAAM,EAAE,IAAI,CAACnE,KAAK,CAACqB,MAAO;MAC1B,MAAM,EAAE8C,MAAO;MACf,KAAK,EAAE,IAAI,CAACnE,KAAK,CAACiF,QAAS;MAC3B,KAAK,EAAE,IAAI,CAACjF,KAAK,CAACnL;IAAM,EAAG,CACzB,GAEN,IAAI,EACN;MAAK,EAAE,EAAC,iBAAiB;MAAC,SAAS,EAAC;IAAa,GAAE,IAAI,CAACmL,KAAK,CAACnL,KAAK,EAAC,2DAAC,2DAAa;MAAC,MAAM,EAAE8sB;IAAY,EAAE,CAAM,EAC9G,IAAI,CAAC3hB,KAAK,CAACrM,KAAK,KAAK,OAAO,GACzB,2DAAC,uDAAS;MAAC,QAAQ,EAAE,IAAI,CAACqM,KAAK,CAACqoB,QAAS;MAAC,UAAU,EAAE,IAAI,CAACroB,KAAK,CAACsoB;IAAW,EAAG,GACjF,IAAI,CAACtoB,KAAK,CAACrM,KAAK,KAAK,UAAU,GAC7B,2DAAC,0DAAY;MAAC,UAAU,EAAE,IAAI,CAACqM,KAAK,CAAC25C,UAAW;MAAC,UAAU,EAAE,IAAI,CAAC35C,KAAK,CAACsoB;IAAW,EAAG,GACxF,IAAI,CACF;EAEV;AACF;AAAC;;;;;;;;;;;;;;;;;;;;;AC3CyB;AACoB;AAEL;AAEoC;AAChC;AAE9B,MAAM2xB,UAAU,SAASxpD,wDAAe,CAAC;EACtDsP,WAAW,CAACC,KAAK,EAAE;IACjB,KAAK,CAACA,KAAK,CAAC;IAEZ,IAAI,CAACrM,KAAK,GAAG;MACXuxB,IAAI,EAAE,IAAI,CAACllB,KAAK,CAACklB,IAAI,IAAI,EAAE;MAC3Bs5B,QAAQ,EAAE,EAAE;MACZC,SAAS,EAAE,IAAI,CAACz+C,KAAK,CAACy+C;IACxB,CAAC;IAED,IAAI,CAACC,cAAc,GAAG,IAAI,CAACA,cAAc,CAACx+C,IAAI,CAAC,IAAI,CAAC;IACpD,IAAI,CAACy+C,YAAY,GAAG,IAAI,CAACA,YAAY,CAACz+C,IAAI,CAAC,IAAI,CAAC;IAChD,IAAI,CAAC0+C,eAAe,GAAG,IAAI,CAACA,eAAe,CAAC1+C,IAAI,CAAC,IAAI,CAAC;IACtD,IAAI,CAACmI,YAAY,GAAG,IAAI,CAACA,YAAY,CAACnI,IAAI,CAAC,IAAI,CAAC;IAChD,IAAI,CAAC47B,YAAY,GAAG,IAAI,CAACA,YAAY,CAAC57B,IAAI,CAAC,IAAI,CAAC;EAClD;EAEA,OAAOwT,wBAAwB,CAACwE,SAAS,EAAE7R,SAAS,EAAE;IACpD,MAAM6e,IAAI,GAAGhN,SAAS,CAACgN,IAAI,IAAI,EAAE;IACjC,IAAI,CAACnnB,yDAAU,CAACmnB,IAAI,EAAE7e,SAAS,CAAC6e,IAAI,CAAC,IAAI,CAAC7e,SAAS,CAACo4C,SAAS,EAAE;MAC7D,OAAO;QAACv5B,IAAI,EAAEA;MAAI,CAAC;IACrB;IACA,OAAO,IAAI;EACb;EAEAw5B,cAAc,CAAC5hC,IAAI,EAAE;IACnB,IAAI,CAACxa,QAAQ,CAAC;MAACk8C,QAAQ,EAAE1hC;IAAI,CAAC,CAAC;IAC/B,IAAIA,IAAI,CAACrwB,MAAM,GAAG,CAAC,EAAE;MACnB,MAAMoyD,IAAI,GAAG/hC,IAAI,CAACA,IAAI,CAACrwB,MAAM,GAAC,CAAC,CAAC;MAChC,IAAIqwB,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE;QAElB,IAAIA,IAAI,CAACrwB,MAAM,GAAG,CAAC,IAAIoyD,IAAI,IAAI,GAAG,EAAE;UAClC,IAAI,CAACF,YAAY,CAAC7hC,IAAI,CAACjyB,SAAS,CAAC,CAAC,EAAEiyB,IAAI,CAACrwB,MAAM,GAAC,CAAC,CAAC,CAAC;QACrD;MACF,CAAC,MAAM,IAAIoyD,IAAI,IAAI,GAAG,IAAIA,IAAI,IAAI,GAAG,IAAIA,IAAI,IAAI,GAAG,IAAIA,IAAI,IAAI,GAAG,EAAE;QAEnE,IAAI,CAACF,YAAY,CAAC7hC,IAAI,CAACjyB,SAAS,CAAC,CAAC,EAAEiyB,IAAI,CAACrwB,MAAM,GAAC,CAAC,CAAC,CAACuH,IAAI,EAAE,CAAC;MAC5D;IACF;EACF;EAEA2qD,YAAY,CAACG,GAAG,EAAE;IAChB,MAAMC,WAAW,GAAG,IAAI,CAAC/+C,KAAK,CAACqB,MAAM,CAAC+c,cAAc,CAAC,aAAa,EAAE53B,qDAAa,CAAC;IAElF,IAAIs4D,GAAG,CAACryD,MAAM,GAAG,CAAC,IAAI,IAAI,CAACkH,KAAK,CAACuxB,IAAI,CAACz4B,MAAM,GAAGsyD,WAAW,EAAE;MAC1D,MAAM75B,IAAI,GAAG,IAAI,CAACvxB,KAAK,CAACuxB,IAAI,CAACjtB,KAAK,CAAC,CAAC,CAAC;MACrCitB,IAAI,CAAC10B,IAAI,CAACsuD,GAAG,CAAC;MAEd,IAAI,CAACx8C,QAAQ,CAAC;QAAC4iB,IAAI,EAAEA,IAAI;QAAEs5B,QAAQ,EAAE;MAAE,CAAC,CAAC;MACzC,IAAI,IAAI,CAACx+C,KAAK,CAACg/C,aAAa,EAAE;QAC5B,IAAI,CAACh/C,KAAK,CAACg/C,aAAa,CAAC95B,IAAI,CAAC;MAChC;MACA,OAAOA,IAAI;IACb;IACA,OAAO,IAAI,CAACvxB,KAAK,CAACuxB,IAAI;EACxB;EAEA05B,eAAe,CAACE,GAAG,EAAElS,KAAK,EAAE;IAC1B,MAAM1nB,IAAI,GAAG,IAAI,CAACvxB,KAAK,CAACuxB,IAAI,CAACjtB,KAAK,CAAC,CAAC,CAAC;IACrCitB,IAAI,CAAC4xB,MAAM,CAAClK,KAAK,EAAE,CAAC,CAAC;IACrB,IAAI,CAACtqC,QAAQ,CAAC;MAAC4iB,IAAI,EAAEA;IAAI,CAAC,CAAC;IAC3B,IAAI,IAAI,CAACllB,KAAK,CAACg/C,aAAa,EAAE;MAC5B,IAAI,CAACh/C,KAAK,CAACg/C,aAAa,CAAC95B,IAAI,CAAC;IAChC;EACF;EAEA7c,YAAY,GAAG;IAEb,IAAI,CAACrI,KAAK,CAAC+7B,QAAQ,CAAC,IAAI,CAAC4iB,YAAY,CAAC,IAAI,CAAChrD,KAAK,CAAC6qD,QAAQ,CAACxqD,IAAI,EAAE,CAAC,CAAC;IAClE,IAAI,CAACsO,QAAQ,CAAC;MAACm8C,SAAS,EAAE,KAAK;MAAEv5B,IAAI,EAAE,IAAI,CAACllB,KAAK,CAACklB,IAAI,IAAI;IAAE,CAAC,CAAC;EAChE;EAEA4W,YAAY,GAAG;IACb,IAAI,CAACx5B,QAAQ,CAAC;MAACm8C,SAAS,EAAE,KAAK;MAAED,QAAQ,EAAE,EAAE;MAAEt5B,IAAI,EAAE,IAAI,CAACllB,KAAK,CAACklB,IAAI,IAAI;IAAE,CAAC,CAAC;IAC5E,IAAI,IAAI,CAACllB,KAAK,CAACooB,QAAQ,EAAE;MACvB,IAAI,CAACpoB,KAAK,CAACooB,QAAQ,EAAE;IACvB;EACF;EAEA5nB,MAAM,GAAG;IACP,MAAMy+C,YAAY,GAAG,IAAI,CAACj/C,KAAK,CAACqB,MAAM,CAAC+c,cAAc,CAAC,cAAc,EAAE93B,sDAAc,CAAC;IACrF,MAAM44D,YAAY,GAAG,IAAI,CAACl/C,KAAK,CAACqB,MAAM,CAAC+c,cAAc,CAAC,cAAc,EAAE73B,sDAAc,CAAC;IAErF,IAAI2+B,IAAI,GAAG,EAAE;IACb,IAAI,IAAI,CAACvxB,KAAK,CAAC8qD,SAAS,EAAE;MACxB,IAAI,CAAC9qD,KAAK,CAACuxB,IAAI,CAAC7xB,GAAG,CAAEyrD,GAAG,IAAK;QAC3B55B,IAAI,CAAC10B,IAAI,CAAC;UAAC2e,IAAI,EAAE2vC,GAAG;UAAEzR,OAAO,EAAGyR,GAAG,CAACryD,MAAM,GAAGwyD,YAAY,IAAIH,GAAG,CAACryD,MAAM,GAAGyyD;QAAa,CAAC,CAAC;MAC3F,CAAC,CAAC;IACJ,CAAC,MAAM;MACL,IAAI,CAACvrD,KAAK,CAACuxB,IAAI,CAAC7xB,GAAG,CAAEyrD,GAAG,IAAK;QAC3B55B,IAAI,CAAC10B,IAAI,CAAC;UAAM,SAAS,EAAC,OAAO;UAAC,GAAG,EAAE00B,IAAI,CAACz4B;QAAO,GAAEqyD,GAAG,CAAQ,CAAC;MACnE,CAAC,CAAC;MACF,IAAI55B,IAAI,CAACz4B,MAAM,IAAI,CAAC,EAAE;QACpBy4B,IAAI,GACF,sEACE,2DAAC,wDAAgB;UAAC,EAAE,kBAAiB;UAAC,cAAc;YAAA;YAAA;UAAA;QAA6B,EAAkB,CAEtG;MACH;IACF;IACA,OACE;MAAK,SAAS,EAAC;IAAmB,GAChC;MAAK,SAAS,EAAC;IAAgB,GAC7B;MAAO,SAAS,EAAC;IAAO,GAAE,IAAI,CAACllB,KAAK,CAACnL,KAAK,CAAS,CAC/C,EACL,IAAI,CAAClB,KAAK,CAAC8qD,SAAS,GACrB,wEACE,2DAAC,wDAAgB;MAAC,EAAE,uBAAsB;MAAC,cAAc;QAAA;QAAA;MAAA;IAAgB,GAEtEU,eAAe,IAAK,2DAAC,uDAAS;MAC7B,MAAM,EAAE,IAAI,CAACn/C,KAAK,CAACqB,MAAO;MAC1B,KAAK,EAAE6jB,IAAK;MACZ,cAAc,EAAE,IAAK;MACrB,MAAM,EAAEi6B,eAAgB;MACxB,QAAQ,EAAE,IAAI,CAACn/C,KAAK,CAACutC,QAAS;MAC9B,OAAO,EAAE,IAAI,CAACoR,YAAa;MAC3B,WAAW,EAAE,IAAI,CAACA,YAAa;MAC/B,QAAQ,EAAE,IAAI,CAAC7iB,YAAa;MAC5B,aAAa,EAAE,IAAI,CAAC8iB,eAAgB;MACpC,UAAU,EAAE,IAAI,CAACF;IAAe,EAAG,CACnB,EACnB,IAAI,CAAC1+C,KAAK,CAAC+7B,QAAQ,IAAI,IAAI,CAAC/7B,KAAK,CAACooB,QAAQ,GACzC;MAAK,EAAE,EAAC,qBAAqB;MAAC,SAAS,EAAC;IAA+B,GACrE;MAAQ,SAAS,EAAC,SAAS;MAAC,OAAO,EAAE,IAAI,CAAC0T;IAAa,GACrD,2DAAC,wDAAgB;MAAC,EAAE,iBAAgB;MAAC,cAAc;QAAA;QAAA;MAAA;IAAS,EAAiC,CACtF,EACT;MAAQ,SAAS,EAAC,SAAS;MAAC,OAAO,EAAE,IAAI,CAACzzB;IAAa,GACrD,2DAAC,wDAAgB;MAAC,EAAE,aAAY;MAAC,cAAc;QAAA;QAAA;MAAA;IAAK,EAA6B,CAC1E,CACL,GACN,IAAI,CACF,GAEN;MAAK,SAAS,EAAC;IAAQ,GACrB;MAAG,IAAI,EAAC,GAAG;MAAC,SAAS,EAAC,aAAa;MAAC,OAAO,EAAGvF,CAAC,IAAK;QAACA,CAAC,CAACC,cAAc,EAAE;QAAE,IAAI,CAACT,QAAQ,CAAC;UAACm8C,SAAS,EAAE;QAAI,CAAC,CAAC;MAAC;IAAE,GAC1G;MAAG,SAAS,EAAC;IAAgB,GAAC,MAAI,CAAI,SAAO,6DAAC,wDAAgB;MAAC,EAAE,qBAAoB;MAAC,cAAc;QAAA;QAAA;MAAA;IAAS,EACxD,CACnD,EACJ,0HAAGv5B,IAAI,CAAI,CACP,CAEF;EAEV;AACF;AAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;ACvJyB;AACoB;AAEV;AAEO;AACI;AACD;AACH;AAGU;AAC4B;AAC3B;AAEvC,MAAMmW,aAAa,SAAS5qC,wDAAe,CAAC;EACzDsP,WAAW,CAACC,KAAK,EAAE;IACjB,KAAK,CAACA,KAAK,CAAC;IAEZ,MAAM9G,KAAK,GAAG,IAAI,CAAC8G,KAAK,CAACqB,MAAM,CAAC+K,QAAQ,CAAC,IAAI,CAACpM,KAAK,CAAC9G,KAAK,CAAC;IAC1D,MAAMuI,GAAG,GAAGvI,KAAK,CAAC2T,aAAa,EAAE;IACjC,IAAI,CAAClZ,KAAK,GAAG;MACXqc,IAAI,EAAErT,4DAAoB,CAAC,IAAI,CAACqD,KAAK,CAAC9G,KAAK,CAAC;MAC5CsR,KAAK,EAAE/I,GAAG,IAAIA,GAAG,CAACwL,OAAO,EAAE;MAC3BjJ,QAAQ,EAAE9K,KAAK,CAAC+K,MAAM,GAAG/K,KAAK,CAAC+K,MAAM,CAAC1G,EAAE,GAAG3K,SAAS;MACpDgT,OAAO,EAAE1M,KAAK,CAAC0M,OAAO,GAAG1M,KAAK,CAAC0M,OAAO,CAAC0H,OAAO,GAAG,IAAI;MACrDpJ,WAAW,EAAEhL,KAAK,CAAC+K,MAAM,GAAG/K,KAAK,CAAC+K,MAAM,CAACvG,IAAI,GAAG9K,SAAS;MACzDuR,MAAM,EAAEpb,kEAAY,CAACmQ,KAAK,CAAC+K,MAAM,GAAG/K,KAAK,CAAC+K,MAAM,CAACjb,KAAK,GAAG,IAAI,CAAC;MAC9Dk8B,IAAI,EAAEhsB,KAAK,CAACgsB,IAAI,EAAE,IAAI,EAAE;MACxB3d,SAAS,EAAE,IAAI;MACfC,aAAa,EAAE;IACjB,CAAC;IAED,IAAI,CAAC43C,cAAc,GAAG,IAAI;IAE1B,IAAI,CAACC,SAAS,GAAG,IAAI,CAACA,SAAS,CAACn/C,IAAI,CAAC,IAAI,CAAC;IAC1C,IAAI,CAACo/C,oBAAoB,GAAG,IAAI,CAACA,oBAAoB,CAACp/C,IAAI,CAAC,IAAI,CAAC;IAChE,IAAI,CAACq/C,kBAAkB,GAAG,IAAI,CAACA,kBAAkB,CAACr/C,IAAI,CAAC,IAAI,CAAC;IAC5D,IAAI,CAACgI,mBAAmB,GAAG,IAAI,CAACA,mBAAmB,CAAChI,IAAI,CAAC,IAAI,CAAC;IAC9D,IAAI,CAACiI,sBAAsB,GAAG,IAAI,CAACA,sBAAsB,CAACjI,IAAI,CAAC,IAAI,CAAC;IACpE,IAAI,CAACkI,YAAY,GAAG,IAAI,CAACA,YAAY,CAAClI,IAAI,CAAC,IAAI,CAAC;IAChD,IAAI,CAACs/C,mBAAmB,GAAG,IAAI,CAACA,mBAAmB,CAACt/C,IAAI,CAAC,IAAI,CAAC;IAC9D,IAAI,CAACu/C,uBAAuB,GAAG,IAAI,CAACA,uBAAuB,CAACv/C,IAAI,CAAC,IAAI,CAAC;IACtE,IAAI,CAACs7B,iBAAiB,GAAG,IAAI,CAACA,iBAAiB,CAACt7B,IAAI,CAAC,IAAI,CAAC;EAC5D;EAEA2W,iBAAiB,GAAG;IAClB,MAAM3d,KAAK,GAAG,IAAI,CAAC8G,KAAK,CAACqB,MAAM,CAAC+K,QAAQ,CAAC,IAAI,CAACpM,KAAK,CAAC9G,KAAK,CAAC;IAC1D,IAAI,CAACkmD,cAAc,GAAGlmD,KAAK,CAACqiC,aAAa;IACzCriC,KAAK,CAACqiC,aAAa,GAAG,IAAI,CAAC8jB,SAAS;EACtC;EAEAhzC,oBAAoB,GAAG;IACrB,MAAMnT,KAAK,GAAG,IAAI,CAAC8G,KAAK,CAACqB,MAAM,CAAC+K,QAAQ,CAAC,IAAI,CAACpM,KAAK,CAAC9G,KAAK,CAAC;IAC1DA,KAAK,CAACqiC,aAAa,GAAG,IAAI,CAAC6jB,cAAc;EAC3C;EAEAC,SAAS,CAACn6B,IAAI,EAAE;IACd,IAAI,CAAC5iB,QAAQ,CAAC;MAAC4iB,IAAI,EAAEA;IAAI,CAAC,CAAC;EAC7B;EAEAo6B,oBAAoB,CAAC/hD,EAAE,EAAE;IACvBA,EAAE,GAAGA,EAAE,CAACvJ,IAAI,EAAE,CAACnJ,SAAS,CAAC,CAAC,EAAEjD,wDAAgB,CAAC;IAC7C,IAAI2V,EAAE,IAAI,IAAI,CAAC5J,KAAK,CAACqQ,QAAQ,KAAKzG,EAAE,EAAE;MACpC,IAAI,CAAC+E,QAAQ,CAAC;QAAC0B,QAAQ,EAAEzG;MAAE,CAAC,CAAC;MAC7B,IAAI,CAACyC,KAAK,CAAC07B,iBAAiB,CAAC,IAAI,CAAC17B,KAAK,CAAC9G,KAAK,EAAEoE,sDAAO,CAACC,EAAE,EAAE,IAAI,CAAC,CAAC;IACnE;EACF;EAEAiiD,mBAAmB,CAAClyC,OAAO,EAAE;IAC3BA,OAAO,GAAGA,OAAO,CAACtZ,IAAI,EAAE,CAACnJ,SAAS,CAAC,CAAC,EAAEjD,wDAAgB,CAAC;IACvD,IAAI,IAAI,CAAC+L,KAAK,CAACiS,OAAO,KAAK0H,OAAO,EAAE;MAClC,IAAI,CAAChL,QAAQ,CAAC;QAACsD,OAAO,EAAE0H;MAAO,CAAC,CAAC;MACjC,IAAI,CAACtN,KAAK,CAAC07B,iBAAiB,CAAC,IAAI,CAAC17B,KAAK,CAAC9G,KAAK,EAAE,IAAI,EAAEoU,OAAO,IAAI3Q,uDAAe,CAAC;IAClF;EACF;EAEA8iD,uBAAuB,CAACxxC,IAAI,EAAE;IAC5BA,IAAI,GAAGA,IAAI,CAACja,IAAI,EAAE,CAACnJ,SAAS,CAAC,CAAC,EAAEhD,oEAA4B,CAAC;IAC7D,IAAIomB,IAAI,EAAE;MACR,IAAI,CAAC3L,QAAQ,CAAC;QAAC4B,WAAW,EAAE+J;MAAI,CAAC,CAAC;MAClC,IAAI,CAACjO,KAAK,CAAC07B,iBAAiB,CAAC,IAAI,CAAC17B,KAAK,CAAC9G,KAAK,EAAEoE,sDAAO,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE2Q,IAAI,CAAC,CAAC;IACjF;EACF;EAGAsxC,kBAAkB,CAACn2D,IAAI,EAAEgC,GAAG,EAAE;IAE5B,IAAI,CAACkX,QAAQ,CAAC;MAACiF,SAAS,EAAEnc,GAAG;MAAEoc,aAAa,EAAEpe;IAAI,CAAC,CAAC;IACpD,IAAI,CAACgC,GAAG,EAAE;MAER,IAAI,CAACkX,QAAQ,CAAC;QAAC6B,MAAM,EAAE;MAAI,CAAC,CAAC;MAC7B,IAAI,CAACnE,KAAK,CAAC07B,iBAAiB,CAAC,IAAI,CAAC17B,KAAK,CAAC9G,KAAK,EAAEoE,sDAAO,CAAC,IAAI,EAAEX,uDAAe,CAAC,CAAC;IAChF;EACF;EAGAuL,mBAAmB,CAAC9e,IAAI,EAAEmD,IAAI,EAAEhD,KAAK,EAAEC,MAAM,EAAE;IAC7C,MAAM4O,GAAG,GAAG7L,IAAI,GAAGZ,GAAG,CAACiB,eAAe,CAACL,IAAI,CAAC,GAAG,IAAI;IACnD,IAAI,CAAC+V,QAAQ,CAAC;MAAC6B,MAAM,EAAE/L,GAAG;MAAEmP,SAAS,EAAE,IAAI;MAAEC,aAAa,EAAE;IAAI,CAAC,CAAC;IAClE,IAAIjb,IAAI,EAAE;MACR,IAAI,CAAC6b,YAAY,CAAChf,IAAI,EAAEmD,IAAI,EAAEhD,KAAK,EAAEC,MAAM,CAAC;IAC9C;EACF;EAIA4e,YAAY,CAAChf,IAAI,EAAEmD,IAAI,EAAEhD,KAAK,EAAEC,MAAM,EAAE;IACtC,MAAMif,aAAa,GAAGC,KAAK,IAAI;MAC7B,IAAI;QAACtf,IAAI;QAAEmD;MAAI,CAAC,GAAGmc,KAAK;MACxB,IAAInc,IAAI,CAACxC,IAAI,GAAG/C,wDAAgB,EAAE;QAEhC,MAAM2hB,QAAQ,GAAG,IAAI,CAAC3I,KAAK,CAACqB,MAAM,CAACuH,kBAAkB,EAAE;QACvDD,QAAQ,CAACE,MAAM,CAACtc,IAAI,CAAC,CAClB8I,IAAI,CAAC+C,GAAG,IAAI,IAAI,CAAC4H,KAAK,CAAC07B,iBAAiB,CAAC,IAAI,CAAC17B,KAAK,CAAC9G,KAAK,EAAEoE,sDAAO,CAAC,IAAI,EAAElF,GAAG,CAAC,CAAC,CAAC,CAC/EzC,KAAK,CAACnK,GAAG,IAAI,IAAI,CAACwU,KAAK,CAAChS,OAAO,CAACxC,GAAG,CAACwK,OAAO,EAAE,KAAK,CAAC,CAAC;MACzD,CAAC,MAAM;QAELrI,kEAAY,CAACpB,IAAI,CAAC,CACf8I,IAAI,CAAC/E,GAAG,IAAI;UACX,MAAMovD,EAAE,GAAG32D,kEAAY,CAAC;YAACG,IAAI,EAAEoH,GAAG,CAAC/C,IAAI;YAAEpE,IAAI,EAAEC;UAAI,CAAC,CAAC;UACrD,IAAI,CAACkZ,QAAQ,CAAC;YAACk+B,MAAM,EAAEkf;UAAE,CAAC,CAAC;UAC3B,IAAI,CAAC1/C,KAAK,CAAC07B,iBAAiB,CAAC,IAAI,CAAC17B,KAAK,CAAC9G,KAAK,EAAEoE,sDAAO,CAAC,IAAI,EAAEoiD,EAAE,CAAC,CAAC;QACnE,CAAC,CAAC;MACN;IACF,CAAC;IAED,IAAIn2D,KAAK,GAAGxC,mDAAW,IAAIyC,MAAM,GAAGzC,mDAAW,IAAIwC,KAAK,IAAIC,MAAM,EAAE;MAElEsB,iEAAW,CAACyB,IAAI,EAAExF,mDAAW,EAAEA,mDAAW,EAAEM,kEAA0B,EAAE,IAAI,CAAC,CAC1EgO,IAAI,CAACK,MAAM,IAAI+S,aAAa,CAAC/S,MAAM,CAAC,CAAC,CACrCC,KAAK,CAACnK,GAAG,IAAI,IAAI,CAACwU,KAAK,CAAChS,OAAO,CAACxC,GAAG,CAACwK,OAAO,EAAE,KAAK,CAAC,CAAC;IACzD,CAAC,MAAM;MACLyS,aAAa,CAAC;QAACrf,IAAI,EAAEA,IAAI;QAAEmD,IAAI,EAAEA,IAAI;QAAEhD,KAAK,EAAEA,KAAK;QAAEC,MAAM,EAAEA;MAAM,CAAC,CAAC;IACvE;EACF;EAEA2e,sBAAsB,GAAG;IACvB,IAAI,CAAC7F,QAAQ,CAAC;MAACiF,SAAS,EAAE,IAAI;MAAEC,aAAa,EAAE;IAAI,CAAC,CAAC;EACvD;EAEAg0B,iBAAiB,CAACtW,IAAI,EAAE;IAEtB,IAAInnB,yDAAU,CAAC,IAAI,CAACpK,KAAK,CAACuxB,IAAI,CAACjtB,KAAK,CAAC,CAAC,CAAC,EAAEitB,IAAI,CAACjtB,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE;MACvD;IACF;IACA,IAAI,CAAC+H,KAAK,CAAC2/C,YAAY,CAACz6B,IAAI,CAAC;EAC/B;EAEA1kB,MAAM,GAAG;IACP,IAAI,IAAI,CAAC7M,KAAK,CAAC4T,SAAS,EAAE;MACxB,OACE,2DAAC,wDAAU;QACT,MAAM,EAAE,IAAI,CAAC5T,KAAK,CAAC4T,SAAU;QAC7B,IAAI,EAAE,IAAI,CAAC5T,KAAK,CAAC6T,aAAc;QAC/B,QAAQ,EAAE,IAAI,CAACU,mBAAoB;QACnC,QAAQ,EAAE,IAAI,CAACC,sBAAuB;QACtC,OAAO,EAAE,IAAI,CAACnI,KAAK,CAAChS;MAAQ,EAAG;IAErC;IAEA,MAAMsyB,QAAQ,GAAG,IAAI,CAAC3sB,KAAK,CAACqc,IAAI,IAAI,IAAI,CAACrc,KAAK,CAAC6W,KAAK;IAEpD,OACE,0HACA;MAAK,SAAS,EAAC;IAAmB,GAChC,2EACE,2DAAC,0DAAY;MACX,MAAM,EAAE,IAAI,CAACxK,KAAK,CAACqB,MAAO;MAC1B,MAAM,EAAE,IAAI,CAAC1N,KAAK,CAACwQ,MAAO;MAC1B,QAAQ,EAAE,CAACmc,QAAS;MACpB,GAAG,EAAE,IAAI,CAACtgB,KAAK,CAAC9G,KAAM;MACtB,KAAK,EAAE,IAAI,CAACvF,KAAK,CAACqQ,QAAS;MAC3B,cAAc,EAAE,IAAI,CAACu7C,kBAAmB;MACxC,OAAO,EAAE,IAAI,CAACv/C,KAAK,CAAChS;IAAQ,EAAG,CAC1B,EACR,IAAI,CAAC2F,KAAK,CAACqc,IAAI,GACd;MAAK,SAAS,EAAC;IAAO,GACpB;MAAO,SAAS,EAAC;IAAO,GACtB,2DAAC,wDAAgB;MAAC,EAAE,mBAAkB;MAAC,cAAc;QAAA;QAAA;MAAA;IAAY,EACrB,CACtC,EACR,wEACE,2DAAC,wDAAgB;MAAC,EAAE,oBAAmB;MAAC,cAAc;QAAA;QAAA;MAAA;IAA2B,GAE9E4vC,qBAAqB,IAAK,2DAAC,0DAAW;MACrC,WAAW,EAAEA,qBAAsB;MACnC,KAAK,EAAE,IAAI,CAACjsD,KAAK,CAACqQ,QAAS;MAC3B,QAAQ,EAAE,IAAK;MACf,UAAU,EAAE,IAAI,CAACs7C;IAAqB,EAAG,CACzB,CAChB,CACF,GAEN,0HACE;MAAK,SAAS,EAAC;IAAO,GACpB,wEAAK;MAAO,SAAS,EAAC;IAAO,GAC3B,2DAAC,wDAAgB;MAAC,EAAE,oBAAmB;MAAC,cAAc;QAAA;QAAA;MAAA;IAAO,EACd,CACzC,CAAM,EACd,wEACE,2DAAC,wDAAgB;MAAC,EAAE,kCAAiC;MAAC,cAAc;QAAA;QAAA;MAAA;IAA6B,GAE9FO,sBAAsB,IAAK,2DAAC,0DAAW;MACtC,WAAW,EAAEA,sBAAuB;MACpC,QAAQ,EAAE,CAACv/B,QAAS;MACpB,KAAK,EAAE,IAAI,CAAC3sB,KAAK,CAACqQ,QAAS;MAC3B,QAAQ,EAAE,IAAK;MACf,UAAU,EAAE,IAAI,CAACs7C;IAAqB,EAAG,CACzB,CAChB,CACF,EACN;MAAK,SAAS,EAAC;IAAO,GACpB,wEACE;MAAO,SAAS,EAAC;IAAO,GACtB,2DAAC,wDAAgB;MAAC,EAAE,iBAAgB;MAAC,cAAc;QAAA;QAAA;MAAA;IAAkB,EACvB,CACxC,CACJ,EACN,wEACE,2DAAC,wDAAgB;MAAC,EAAE,+BAA8B;MAAC,cAAc;QAAA;QAAA;MAAA;IAAsB,GAEpFQ,mBAAmB,IAAK,2DAAC,0DAAW;MACnC,WAAW,EAAEA,mBAAoB;MACjC,KAAK,EAAE,IAAI,CAACnsD,KAAK,CAACiS,OAAQ;MAC1B,UAAU,EAAE,IAAI,CAAC45C;IAAoB,EAAG,CACxB,CAChB,CACF,CACL,EAEJl/B,QAAQ,IAAI,IAAI,CAAC3sB,KAAK,CAACuQ,WAAW,GACjC;MAAK,SAAS,EAAC;IAAO,GACpB,wEAAK;MAAO,SAAS,EAAC;IAAO,GAC3B,2DAAC,wDAAgB;MAAC,EAAE,qBAAoB;MAAC,cAAc;QAAA;QAAA;MAAA;IAAc,EACf,CAChD,CAAM,EACd,wEACE,2DAAC,wDAAgB;MAAC,EAAE,mCAAkC;MACpD,cAAc;QAAA;QAAA;MAAA;IAAyB,GAEtC47C,mBAAmB,IAAK,2DAAC,0DAAW;MACnC,WAAW,EAAEA,mBAAoB;MACjC,QAAQ,EAAE,CAACx/B,QAAS;MACpB,KAAK,EAAE,IAAI,CAAC3sB,KAAK,CAACuQ,WAAY;MAC9B,SAAS,EAAE,CAAE;MACb,UAAU,EAAE,IAAI,CAACu7C;IAAwB,EAAG,CAC5B,CAChB,CACF,GACJ,IAAI,CAEJ,EACLn/B,QAAQ,GACP,0HACE;MAAK,SAAS,EAAC;IAAI,EAAG,EACtB,2DAAC,wDAAgB;MAAC,EAAE,qBAAoB;MAAC,cAAc;QAAA;QAAA;MAAA;IAA4B,GAE9Ey/B,iBAAiB,IAAK,2DAAC,wDAAU;MAChC,MAAM,EAAE,IAAI,CAAC//C,KAAK,CAACqB,MAAO;MAC1B,KAAK,EAAE0+C,iBAAkB;MACzB,SAAS,EAAE,KAAM;MACjB,IAAI,EAAE,IAAI,CAACpsD,KAAK,CAACuxB,IAAK;MACtB,QAAQ,EAAE,IAAI,CAACsW;IAAkB,EAAG,CACtB,CACnB,GACD,IAAI,CAEL;EAEP;AACF;AAAC;;;;;;;;;;;;;;;;;;AChRyB;AACgD;AAE1E,MAAMjqC,QAAQ,GAAGb,0DAAc,CAAC;EAC9B2+C,cAAc,EAAE;IACd59C,EAAE,yBAAyB;IAC3BC,cAAc;MAAA;MAAA;IAAA;EAEhB,CAAC;EACD0+C,sBAAsB,EAAE;IACtB3+C,EAAE,0BAA0B;IAC5BC,cAAc;MAAA;MAAA;IAAA;EAEhB,CAAC;EACDsuD,eAAe,EAAE;IACfvuD,EAAE,0BAA0B;IAC5BC,cAAc;MAAA;MAAA;IAAA;EAEhB,CAAC;EACDq+C,uBAAuB,EAAE;IACvBt+C,EAAE,2BAA2B;IAC7BC,cAAc;MAAA;MAAA;IAAA;EAEhB,CAAC;EACDm+C,YAAY,EAAE;IACZp+C,EAAE,gBAAgB;IAClBC,cAAc;MAAA;MAAA;IAAA;EAEhB,CAAC;EACDo+C,oBAAoB,EAAE;IACpBr+C,EAAE,wBAAwB;IAC1BC,cAAc;MAAA;MAAA;IAAA;EAEhB,CAAC;EACDuuD,UAAU,EAAE;IACVxuD,EAAE,qBAAqB;IACvBC,cAAc;MAAA;MAAA;IAAA;EAEhB,CAAC;EACDwuD,kBAAkB,EAAE;IAClBzuD,EAAE,sBAAsB;IACxBC,cAAc;MAAA;MAAA;IAAA;EAEhB,CAAC;EACDyuD,aAAa,EAAE;IACb1uD,EAAE,wBAAwB;IAC1BC,cAAc;MAAA;MAAA;IAAA;EAEhB,CAAC;EACD0uD,qBAAqB,EAAE;IACrB3uD,EAAE,yBAAyB;IAC3BC,cAAc;MAAA;MAAA;IAAA;EAEhB,CAAC;EACD2uD,WAAW,EAAE;IACX5uD,EAAE,sBAAsB;IACxBC,cAAc;MAAA;MAAA;IAAA;EAEhB,CAAC;EACD4uD,mBAAmB,EAAE;IACnB7uD,EAAE,uBAAuB;IACzBC,cAAc;MAAA;MAAA;IAAA;EAEhB,CAAC;EACD6uD,UAAU,EAAE;IACV9uD,EAAE,oBAAoB;IACtBC,cAAc;MAAA;MAAA;IAAA;EAEhB;AACF,CAAC,CAAC;AAEF,MAAMkY,aAAa,SAASnZ,4DAAmB,CAAC;EAC9CsP,WAAW,CAACC,KAAK,EAAE;IACjB,KAAK,CAACA,KAAK,CAAC;IAEZ,IAAI,CAACwgD,iBAAiB,GAAG,IAAI,CAACA,iBAAiB,CAACtgD,IAAI,CAAC,IAAI,CAAC;IAC1D,IAAI,CAACugD,oBAAoB,GAAG,IAAI,CAACA,oBAAoB,CAACvgD,IAAI,CAAC,IAAI,CAAC;IAChE,IAAI,CAACwgD,WAAW,GAAG,IAAI,CAACA,WAAW,CAACxgD,IAAI,CAAC,IAAI,CAAC;IAC9C,IAAI,CAACygD,WAAW,GAAG,IAAI,CAACA,WAAW,CAACzgD,IAAI,CAAC,IAAI,CAAC;IAC9C,IAAI,CAAC0gD,YAAY,GAAG,IAAI,CAACA,YAAY,CAAC1gD,IAAI,CAAC,IAAI,CAAC;EAClD;EAEAsgD,iBAAiB,CAAC19C,CAAC,EAAE;IACnBA,CAAC,CAACC,cAAc,EAAE;IAClB,MAAM;MAAC9O;IAAa,CAAC,GAAG,IAAI,CAAC+L,KAAK,CAACgD,IAAI;IACvC,IAAI,CAAChD,KAAK,CAACiD,WAAW,CACpBhP,aAAa,CAAC1C,QAAQ,CAACs+C,YAAY,CAAC,EACpC57C,aAAa,CAAC1C,QAAQ,CAACu+C,oBAAoB,CAAC,EAC5C7iD,CAAC,IAAI,IAAI,CAAC+S,KAAK,CAAC6gD,aAAa,CAAC,IAAI,CAAC7gD,KAAK,CAAC9G,KAAK,CAAC,EAC/C,IAAI,EACJ,IAAI,EACJ,IAAI,CACL;EACH;EAEAunD,oBAAoB,CAAC39C,CAAC,EAAE;IACtBA,CAAC,CAACC,cAAc,EAAE;IAClB,MAAM;MAAC9O;IAAa,CAAC,GAAG,IAAI,CAAC+L,KAAK,CAACgD,IAAI;IACvC,IAAI,CAAChD,KAAK,CAACiD,WAAW,CACpBhP,aAAa,CAAC,IAAI,CAAC+L,KAAK,CAAC2K,OAAO,GAAGpZ,QAAQ,CAACyuD,eAAe,GAAGzuD,QAAQ,CAAC89C,cAAc,CAAC,EACtFp7C,aAAa,CAAC,IAAI,CAAC+L,KAAK,CAAC2K,OAAO,GAAGpZ,QAAQ,CAACw+C,uBAAuB,GAAGx+C,QAAQ,CAAC6+C,sBAAsB,CAAC,EACtGnjD,CAAC,IAAI,IAAI,CAAC+S,KAAK,CAACiR,gBAAgB,CAAC,IAAI,CAACjR,KAAK,CAAC9G,KAAK,CAAC,EAClD,IAAI,EACJ,IAAI,EACJ,IAAI,CACL;EACH;EAEAwnD,WAAW,CAAC59C,CAAC,EAAE;IACbA,CAAC,CAACC,cAAc,EAAE;IAClB,MAAM;MAAC9O;IAAa,CAAC,GAAG,IAAI,CAAC+L,KAAK,CAACgD,IAAI;IACvC,IAAI,CAAChD,KAAK,CAACiD,WAAW,CACpBhP,aAAa,CAAC1C,QAAQ,CAAC0uD,UAAU,CAAC,EAClChsD,aAAa,CAAC1C,QAAQ,CAAC2uD,kBAAkB,CAAC,EAC1CjzD,CAAC,IAAI,IAAI,CAAC+S,KAAK,CAACkR,YAAY,CAAC,IAAI,CAAClR,KAAK,CAAC9G,KAAK,CAAC,EAC9C,IAAI,EACJ,IAAI,EACJ,IAAI,CACL;EACH;EAEAynD,WAAW,CAAC79C,CAAC,EAAE;IACbA,CAAC,CAACC,cAAc,EAAE;IAClB,MAAM;MAAC9O;IAAa,CAAC,GAAG,IAAI,CAAC+L,KAAK,CAACgD,IAAI;IACvC,IAAI,CAAChD,KAAK,CAACiD,WAAW,CACpBhP,aAAa,CAAC1C,QAAQ,CAAC4uD,aAAa,CAAC,EACrClsD,aAAa,CAAC1C,QAAQ,CAAC6uD,qBAAqB,CAAC,EAC7CnzD,CAAC,IAAI,IAAI,CAAC+S,KAAK,CAACmR,YAAY,CAAC,IAAI,CAACnR,KAAK,CAAC9G,KAAK,CAAC,EAC9C,IAAI,EACJ,IAAI,EACJ,IAAI,CACL;EACH;EAEA0nD,YAAY,CAAC99C,CAAC,EAAE;IACdA,CAAC,CAACC,cAAc,EAAE;IAClB,MAAM;MAAC9O;IAAa,CAAC,GAAG,IAAI,CAAC+L,KAAK,CAACgD,IAAI;IACvC,IAAI,CAAChD,KAAK,CAACiD,WAAW,CACpBhP,aAAa,CAAC1C,QAAQ,CAAC8uD,WAAW,CAAC,EACnCpsD,aAAa,CAAC1C,QAAQ,CAAC+uD,mBAAmB,CAAC,EAC1CrzD,CAAC,IAAI;MAAE,IAAI,CAAC+S,KAAK,CAACoR,aAAa,CAAC,IAAI,CAACpR,KAAK,CAAC9G,KAAK,CAAC;IAAE,CAAC,EACrD,IAAI,EACJ,IAAI,EACJ,IAAI,CACL;EACH;EAEAsH,MAAM,GAAG;IACP,MAAM;MAACvM;IAAa,CAAC,GAAG,IAAI,CAAC+L,KAAK,CAACgD,IAAI;IACvC,OACE;MAAK,SAAS,EAAC;IAAkB,GAC/B;MAAK,SAAS,EAAC;IAAmB,GAC/B,CAAC,IAAI,CAAChD,KAAK,CAAC+K,OAAO,GAClB;MAAG,IAAI,EAAC,GAAG;MAAC,SAAS,EAAC,aAAa;MAAC,OAAO,EAAE,IAAI,CAAC01C;IAAqB,GACrE;MAAG,SAAS,EAAC;IAAgB,GAAC,gBAAc,CAAI,SAAO,EACrDxsD,aAAa,CAAC,IAAI,CAAC+L,KAAK,CAAC2K,OAAO,GAAGpZ,QAAQ,CAACyuD,eAAe,GAAGzuD,QAAQ,CAAC89C,cAAc,CAAC,CAEtF,GAEJ,IAAI,EAEL,IAAI,CAACrvC,KAAK,CAACwK,KAAK,GACf;MAAG,IAAI,EAAC,GAAG;MAAC,SAAS,EAAC,oBAAoB;MAAC,OAAO,EAAE,IAAI,CAACg2C;IAAkB,GACzE;MAAG,SAAS,EAAC;IAAgB,GAAC,QAAM,CAAI,SAAO,EAACvsD,aAAa,CAAC1C,QAAQ,CAACs+C,YAAY,CAAC,CAClF,GAEJ;MAAG,IAAI,EAAC,GAAG;MAAC,SAAS,EAAC,oBAAoB;MAAC,OAAO,EAAE,IAAI,CAAC6Q;IAAY,GACnE;MAAG,SAAS,EAAC;IAAgB,GAAC,aAAW,CAAI,SAAO,EAACzsD,aAAa,CAAC1C,QAAQ,CAAC0uD,UAAU,CAAC,CACrF,EAEL,CAAC,IAAI,CAACjgD,KAAK,CAAC8K,UAAU,GACrB;MAAG,IAAI,EAAC,GAAG;MAAC,SAAS,EAAC,oBAAoB;MAAC,OAAO,EAAE,IAAI,CAAC61C;IAAY,GACnE;MAAG,SAAS,EAAC;IAAgB,GAAC,OAAK,CAAI,SAAO,EAAC1sD,aAAa,CAAC1C,QAAQ,CAAC4uD,aAAa,CAAC,CAClF,GAEJ,IAAI,EAEL,CAAC,IAAI,CAACngD,KAAK,CAACwK,KAAK,GAChB;MAAG,IAAI,EAAC,GAAG;MAAC,SAAS,EAAC,oBAAoB;MAAC,OAAO,EAAE,IAAI,CAACo2C;IAAa,GACpE;MAAG,SAAS,EAAC;IAAgB,GAAC,QAAM,CAAI,SAAO,EAAC3sD,aAAa,CAAC1C,QAAQ,CAAC8uD,WAAW,CAAC,CACjF,GAEJ,IAAI,CAEF,EACN;MAAK,SAAS,EAAC;IAAI,EAAG,EACtB;MAAK,SAAS,EAAC;IAAmB,GAC/B,IAAI,CAACrgD,KAAK,CAAC8K,UAAU,GACpB,0HACE;MAAK,SAAS,EAAC;IAAO,GACpB,0EACE,2DAAC,wDAAgB;MAAC,EAAE,0BAAyB;MAAC,cAAc;QAAA;QAAA;MAAA;IAAoB,EAC3B,CAC/C,KAAC;MAAI,SAAS,EAAC,WAAW;MAChC,OAAO,EAAGhI,CAAC,IAAK;QAACA,CAAC,CAACC,cAAc,EAAE;QAAE,IAAI,CAAC/C,KAAK,CAAC8gD,yBAAyB,CAAC,MAAM,CAAC;MAAA;IAAE,GAClF,IAAI,CAAC9gD,KAAK,CAACiL,MAAM,CACf,CACD,EACL,CAAC,IAAI,CAACjL,KAAK,CAAC+K,OAAO,GAClB;MAAK,SAAS,EAAC;IAAO,GACpB,wEACE;MAAO,SAAS,EAAC;IAAO,GACtB,2DAAC,wDAAgB;MAAC,EAAE,6BAA4B;MAAC,cAAc;QAAA;QAAA;MAAA;IAAuB,EACxC,CACxC,CACJ,EACN;MAAK,SAAS,EAAC;IAAQ,GACrB,wEAAK,QAAM;MAAI,SAAS,EAAE,IAAI,CAAC/K,KAAK,CAACwK,KAAK,GAAG,WAAW,GAAG,IAAK;MAC9D,OAAO,EAAG1H,CAAC,IAAK;QACdA,CAAC,CAACC,cAAc,EAAE;QAClB,IAAI,IAAI,CAAC/C,KAAK,CAACwK,KAAK,EAAE;UACpB,IAAI,CAACxK,KAAK,CAAC8gD,yBAAyB,CAAC,MAAM,CAAC;QAC9C;MACF;IAAE,GAAE,IAAI,CAAC9gD,KAAK,CAAC6B,IAAI,CAAM,CACrB,EACN,wEAAK,QAAM;MAAI,SAAS,EAAE,IAAI,CAAC7B,KAAK,CAACwK,KAAK,GAAG,WAAW,GAAG,IAAK;MAC9D,OAAO,EAAG1H,CAAC,IAAK;QACdA,CAAC,CAACC,cAAc,EAAE;QAClB,IAAI,IAAI,CAAC/C,KAAK,CAACwK,KAAK,EAAE;UACpB,IAAI,CAACxK,KAAK,CAAC8gD,yBAAyB,CAAC,MAAM,CAAC;QAC9C;MACF;IAAE,GAAE,IAAI,CAAC9gD,KAAK,CAAC8B,IAAI,CAAM,CACrB,CACF,CACF,GAEN,IAAI,CAEL,GAEH;MAAK,SAAS,EAAC;IAAO,GACpB,wEACE;MAAO,SAAS,EAAC;IAAO,GACtB,2DAAC,wDAAgB;MAAC,EAAE,qBAAoB;MAAC,cAAc;QAAA;QAAA;MAAA;IAAe,EACtC,CAC1B,CACJ,EACN;MAAK,SAAS,EAAC;IAAQ,GACrB,wEACE,2DAAC,wDAAgB;MAAC,EAAE,aAAY;MAAC,cAAc;QAAA;QAAA;MAAA;IAAO,EACT,KAAC;MAAI,SAAS,EAAC,WAAW;MACrE,OAAO,EAAGgB,CAAC,IAAK;QAACA,CAAC,CAACC,cAAc,EAAE;QAAE,IAAI,CAAC/C,KAAK,CAAC8gD,yBAAyB,CAAC,MAAM,CAAC;MAAA;IAAE,GAClF,IAAI,CAAC9gD,KAAK,CAACiL,MAAM,CACf,CACD,EACN,wEAAM,IAAI,CAACjL,KAAK,CAACgE,QAAQ,GAAG,IAAI,CAAChE,KAAK,CAACgE,QAAQ,GAAG/P,aAAa,CAAC1C,QAAQ,CAACgvD,UAAU,CAAC,EAAC,QAC7E;MAAI,SAAS,EAAC,WAAW;MAC7B,OAAO,EAAGz9C,CAAC,IAAK;QAACA,CAAC,CAACC,cAAc,EAAE;QAAE,IAAI,CAAC/C,KAAK,CAAC8gD,yBAAyB,CAAC,OAAO,CAAC;MAAA;IAAE,GACnF,IAAI,CAAC9gD,KAAK,CAACoL,UAAU,CACnB,CACD,CACF,CACF,CAEJ,CACF;EAEV;AACF;AAAC;AAED,iEAAevK,sDAAU,CAAC+I,aAAa,CAAC;;;;;;;;;;;;;;;;ACpQd;AAEX,MAAMqlC,WAAW,SAASx+C,4DAAmB,CAAC;EAC3D+P,MAAM,GAAG;IACP,OAAQ,IAAI,CAACR,KAAK,CAACtE,KAAK,GAAG,CAAC,GAC1B;MAAM,SAAS,EAAC;IAAQ,GAAE,IAAI,CAACsE,KAAK,CAACtE,KAAK,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,CAACsE,KAAK,CAACtE,KAAK,CAAQ,GAC9E,IAAI;EACV;AACF;AAAC;;;;;;;;;;;;;;;;;ACRyB;AAEqB;AAEhC,MAAMzK,cAAc,SAASR,4DAAmB,CAAC;EAC9DsP,WAAW,CAACC,KAAK,EAAE;IACjB,KAAK,CAACA,KAAK,CAAC;EACd;EAEAQ,MAAM,GAAG;IACP,OACE;MAAK,SAAS,EAAC;IAAc,GAC1B/P,0DAAmB,CAAC,KAAK,EAAE,IAAI,CAACuP,KAAK,CAAC,EACvC;MAAK,SAAS,EAAC;IAAmB,GAChC,2DAAC,0DAAY;MAAC,QAAQ,EAAE,IAAI,CAACA,KAAK,CAACo8B,QAAS;MAAC,QAAQ,EAAE,IAAI,CAACp8B,KAAK,CAAC08B;IAAe,EAAG,CAChF,CACF;EAEV;AACF;AAAC;;;;;;;;;;;;;;;;;;;;ACpByB;AACgD;AAC7B;AAEU;AAEvD,MAAMnrC,QAAQ,GAAGb,0DAAc,CAAC;EAC9BqwD,yBAAyB,EAAE;IACzBtvD,EAAE,6BAA6B;IAC/BC,cAAc;MAAA;MAAA;IAAA;EAEhB;AACF,CAAC,CAAC;AAEF,MAAM8gB,YAAY,SAAS/hB,4DAAmB,CAAC;EAC7CsP,WAAW,CAACC,KAAK,EAAE;IACjB,KAAK,CAACA,KAAK,CAAC;IAEZ,IAAI,CAACg5C,QAAQ,GAAGvoD,sDAAe,EAAE;IAEjC,IAAI,CAACuwD,eAAe,GAAG,IAAI,CAACA,eAAe,CAAC9gD,IAAI,CAAC,IAAI,CAAC;EACxD;EAEA8gD,eAAe,CAACpiC,OAAO,EAAE;IACvB,IAAI,CAAC5e,KAAK,CAAC0hC,OAAO,EAAE;IACpB,MAAM7pC,MAAM,GAAG;MACbtO,KAAK,EAAE,IAAI,CAACyvD,QAAQ,CAACv4B,OAAO,CAACwgC,UAAU;MACvCz3D,MAAM,EAAE,IAAI,CAACwvD,QAAQ,CAACv4B,OAAO,CAACygC,WAAW;MACzCvuD,QAAQ,EAAG,IAAI,CAACqmD,QAAQ,CAACv4B,OAAO,CAAC9tB,QAAQ,GAAG,IAAI,GAAI,CAAC;MACrDvJ,IAAI,EAAE,IAAI,CAAC4W,KAAK,CAACwZ,OAAO,CAACpwB,IAAI;MAC7BuD,IAAI,EAAE,IAAI,CAACqT,KAAK,CAACwZ,OAAO,CAAC1d;IAC3B,CAAC;IAED,IAAIjE,MAAM,CAACtO,KAAK,IAAI,CAAC,IAAIsO,MAAM,CAACrO,MAAM,IAAI,CAAC,EAAE;MAC3C,IAAI,CAACwW,KAAK,CAAChS,OAAO,CAAC,IAAI,CAACgS,KAAK,CAACgD,IAAI,CAAC/O,aAAa,CAAC1C,QAAQ,CAACwvD,yBAAyB,CAAC,EAAE,KAAK,CAAC;MAC5F;IACF;IAGA,MAAMh1D,MAAM,GAAGC,QAAQ,CAACC,aAAa,CAAC,QAAQ,CAAC;IAC/CF,MAAM,CAACxC,KAAK,GAAGsO,MAAM,CAACtO,KAAK;IAC3BwC,MAAM,CAACvC,MAAM,GAAGqO,MAAM,CAACrO,MAAM;IAC7B,MAAM0C,GAAG,GAAGH,MAAM,CAACI,UAAU,CAAC,IAAI,CAAC;IACnCD,GAAG,CAACG,SAAS,CAAC,IAAI,CAAC2sD,QAAQ,CAACv4B,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE10B,MAAM,CAACxC,KAAK,EAAEwC,MAAM,CAACvC,MAAM,CAAC;IACvE0C,GAAG,CAACH,MAAM,CAACS,MAAM,CACbqG,OAAO,IAAI,IAAI,CAACmN,KAAK,CAACu1C,aAAa,CAAC32B,OAAO,EAAE,IAAI,CAAC5e,KAAK,CAACwZ,OAAO,CAACjtB,IAAI,EAAEsG,OAAO,EAAEgF,MAAM,CAAC,EACtF,YAAY,EAAE,IAAI,CACrB;EACH;EAEA2I,MAAM,GAAG;IACP,IAAI,CAAC,IAAI,CAACR,KAAK,CAACwZ,OAAO,EAAE;MACvB,OAAO,IAAI;IACb;IAEA,MAAMjwB,KAAK,GAAG,IAAI,CAACyW,KAAK,CAACwZ,OAAO,CAACjwB,KAAK,IAAI,GAAG;IAC7C,MAAMC,MAAM,GAAG,IAAI,CAACwW,KAAK,CAACwZ,OAAO,CAAChwB,MAAM,IAAI,GAAG;IAE/C,MAAM23D,UAAU,GAAG,IAAI,CAACnhD,KAAK,CAACu1C,aAAa,GAAG,YAAY,GAAG,EAAE;IAC/D,MAAM6L,QAAQ,GAAG,CAAC,IAAI,CAACphD,KAAK,CAACu1C,aAAa;IAE1C,OACE;MAAK,EAAE,EAAC;IAAe,GACrB;MAAK,EAAE,EAAC;IAA6B,GACnC,yEAAO,IAAI,CAACv1C,KAAK,CAACwZ,OAAO,CAAC1d,QAAQ,CAAQ,EAC1C;MAAG,IAAI,EAAC,GAAG;MAAC,OAAO,EAAEgH,CAAC,IAAI;QAACA,CAAC,CAACC,cAAc,EAAE;QAAE,IAAI,CAAC/C,KAAK,CAAC0hC,OAAO,EAAE;MAAC;IAAE,GAAC;MAAG,SAAS,EAAC;IAAqB,GAAC,OAAK,CAAI,CAAI,CACnH,EACN;MAAK,EAAE,EAAC;IAAyB,GAC/B;MACE,SAAS,EAAC,eAAe;MACzB,QAAQ;MAAC,YAAY,EAAEyf,UAAW;MAClC,uBAAuB;MAAC,GAAG,EAAE,IAAI,CAACnI,QAAS;MAC3C,QAAQ,EAAEoI,QAAS;MACnB,GAAG,EAAE,IAAI,CAACphD,KAAK,CAACqB,MAAM,CAAC3O,YAAY,CAAC,IAAI,CAACsN,KAAK,CAACwZ,OAAO,CAACphB,GAAG,CAAE;MAC5D,MAAM,EAAE,IAAI,CAAC4H,KAAK,CAACwZ,OAAO,CAAC3mB,OAAQ;MACnC,GAAG,EAAE,IAAI,CAACmN,KAAK,CAACwZ,OAAO,CAAC1d;IAAS,EAAG,CAClC,EACL,IAAI,CAACkE,KAAK,CAACu1C,aAAa,GACzB,2DAAC,yDAAW;MACV,aAAa,EAAC,mBAAmB;MACjC,WAAW,EAAE,IAAK;MAClB,MAAM,EAAE,IAAI,CAACv1C,KAAK,CAACqB,MAAO;MAC1B,KAAK,EAAE,IAAI,CAACrB,KAAK,CAACkZ,KAAM;MACxB,aAAa,EAAE,IAAI,CAAClZ,KAAK,CAACw1C,aAAc;MACxC,aAAa,EAAE,IAAI,CAACwL,eAAgB;MACpC,OAAO,EAAE,IAAI,CAAChhD,KAAK,CAAChS;IAAQ,EAAG,GAE/B;MAAK,EAAE,EAAC;IAAsB,GAC5B,wEACE,wEAAK,sEAAG,2DAAC,wDAAgB;MAAC,EAAE,mBAAkB;MAAC,cAAc;QAAA;QAAA;MAAA;IAAa,EAClC,CAAI,CAAM,EAClD,wEAAK;MAAM,KAAK,EAAE,IAAI,CAACgS,KAAK,CAACwZ,OAAO,CAAC1d;IAAS,GAAE,IAAI,CAACkE,KAAK,CAACwZ,OAAO,CAAC1d,QAAQ,CAAQ,CAAM,CACrF,EACN,wEACE,wEAAK,sEAAG,2DAAC,wDAAgB;MAAC,EAAE,sBAAqB;MAAC,cAAc;QAAA;QAAA;MAAA;IAAgB,EAC3B,CAAI,CAAM,EAC/D,wEAAM,IAAI,CAACkE,KAAK,CAACwZ,OAAO,CAACrwB,IAAI,CAAO,CAChC,EACN,wEACE,wEAAK,sEAAG,2DAAC,wDAAgB;MAAC,EAAE,cAAa;MAAC,cAAc;QAAA;QAAA;MAAA;IAAQ,EAC1B,CAAI,CAAM,EAChD,wEAAMI,KAAK,EAAC,QAAS,EAACC,MAAM,EAAC,OAAK,EAAC6R,mEAAgB,CAAC,IAAI,CAAC2E,KAAK,CAACwZ,OAAO,CAACzvB,IAAI,CAAC,CAAO,CAC/E,CACF,CACJ;EAEV;AACF;AAAC;AAED,iEAAe8W,sDAAU,CAAC2R,YAAY,CAAC;;;;;;;;;;;;;;;;AC5Gb;AAEX,MAAMvL,eAAe,SAASxW,4DAAmB,CAAC;EAC/DsP,WAAW,CAACC,KAAK,EAAE;IACjB,KAAK,CAACA,KAAK,CAAC;IAEZ,IAAI,CAACqhD,QAAQ,GAAG5wD,sDAAe,EAAE;IAEjC,IAAI,CAACkD,KAAK,GAAG;MACXiD,KAAK,EAAE,IAAI,CAACoJ,KAAK,CAACpJ,KAAK;MACvB0qD,OAAO,EAAE;IACX,CAAC;IAED,IAAI,CAACC,gBAAgB,GAAG,IAAI,CAACA,gBAAgB,CAACrhD,IAAI,CAAC,IAAI,CAAC;IACxD,IAAI,CAAC+3C,eAAe,GAAG,IAAI,CAACA,eAAe,CAAC/3C,IAAI,CAAC,IAAI,CAAC;IACtD,IAAI,CAACksC,aAAa,GAAG,IAAI,CAACA,aAAa,CAAClsC,IAAI,CAAC,IAAI,CAAC;IAClD,IAAI,CAACw3C,qBAAqB,GAAG,IAAI,CAACA,qBAAqB,CAACx3C,IAAI,CAAC,IAAI,CAAC;EACpE;EAEA2W,iBAAiB,GAAG;IAClB,IAAI,IAAI,CAAC7W,KAAK,CAACstC,SAAS,EAAE;MACxB,IAAI,CAAC+T,QAAQ,CAAC5gC,OAAO,CAAC43B,KAAK,EAAE;IAC/B;EACF;EAEAJ,eAAe,CAACn1C,CAAC,EAAE;IACjB,IAAI,CAACR,QAAQ,CAAC;MAAC1L,KAAK,EAAEkM,CAAC,CAACyF,MAAM,CAAC3R;IAAK,CAAC,CAAC;IACtC,IAAI,IAAI,CAACoJ,KAAK,CAACwrC,QAAQ,EAAE;MACvB,IAAI,CAACxrC,KAAK,CAACwrC,QAAQ,CAAC1oC,CAAC,CAAC;IACxB;EACF;EAEAy+C,gBAAgB,CAACz+C,CAAC,EAAE;IAClBA,CAAC,CAACC,cAAc,EAAE;IAClB,IAAI,CAACT,QAAQ,CAAC;MAACg/C,OAAO,EAAE,CAAC,IAAI,CAAC3tD,KAAK,CAAC2tD;IAAO,CAAC,CAAC;EAC/C;EAEAlV,aAAa,CAACtpC,CAAC,EAAE;IACf,IAAIA,CAAC,CAACkuC,OAAO,IAAI,EAAE,EAAE;MAEnB,IAAI,CAAC1uC,QAAQ,CAAC;QAAC1L,KAAK,EAAE,IAAI,CAACoJ,KAAK,CAACpJ,KAAK;QAAE0qD,OAAO,EAAE;MAAK,CAAC,CAAC;MACxD,IAAI,IAAI,CAACthD,KAAK,CAACu4C,UAAU,EAAE;QACzB,IAAI,CAACv4C,KAAK,CAACu4C,UAAU,EAAE;MACzB;IACF,CAAC,MAAM,IAAIz1C,CAAC,CAACkuC,OAAO,IAAI,EAAE,EAAE;MAE1B,IAAI,CAAC0G,qBAAqB,EAAE;IAC9B;EACF;EAEAA,qBAAqB,CAAC50C,CAAC,EAAE;IACvB,IAAIA,CAAC,EAAE;MACL,IAAI4hB,aAAa,GAAG5hB,CAAC,CAAC4hB,aAAa;MACnC/H,UAAU,CAAC1vB,CAAC,IAAI;QACd,IAAI,CAACy3B,aAAa,CAACosB,QAAQ,CAAC9kD,QAAQ,CAACw1D,aAAa,CAAC,EAAE;UACnD,IAAI,IAAI,CAACxhD,KAAK,CAACu4C,UAAU,EAAE;YACzB,IAAI,CAACv4C,KAAK,CAACu4C,UAAU,CAAC,IAAI,CAAC5kD,KAAK,CAACiD,KAAK,CAAC;UACzC;QACF;MACF,CAAC,EAAE,CAAC,CAAC;IACP,CAAC,MAAM,IAAI,IAAI,CAACoJ,KAAK,CAACu4C,UAAU,EAAE;MAChC,IAAI,CAACv4C,KAAK,CAACu4C,UAAU,CAAC,IAAI,CAAC5kD,KAAK,CAACiD,KAAK,CAAC5C,IAAI,EAAE,CAAC;IAChD;EACF;EAEAwM,MAAM,GAAG;IACP,OACE;MAAK,QAAQ,EAAC,IAAI;MAAC,SAAS,EAAC,aAAa;MAAC,MAAM,EAAE,IAAI,CAACk3C;IAAsB,GAC5E;MAAO,SAAS,EAAC,iBAAiB;MAChC,IAAI,EAAE,IAAI,CAAC/jD,KAAK,CAAC2tD,OAAO,GAAG,MAAM,GAAG,UAAW;MAC/C,KAAK,EAAE,IAAI,CAAC3tD,KAAK,CAACiD,KAAM;MACxB,WAAW,EAAE,IAAI,CAACoJ,KAAK,CAACkmB,WAAY;MACpC,QAAQ,EAAE,IAAI,CAAClmB,KAAK,CAAC8sC,QAAQ,GAAG,UAAU,GAAG,EAAG;MAChD,SAAS,EAAE,IAAI,CAAC9sC,KAAK,CAACstC,SAAS,GAAG,WAAW,GAAG,EAAG;MACnD,YAAY,EAAE,IAAI,CAACttC,KAAK,CAAC+4C,YAAa;MACtC,QAAQ,EAAE,IAAI,CAACd,eAAgB;MAC/B,SAAS,EAAE,IAAI,CAAC7L,aAAc;MAC9B,GAAG,EAAE,IAAI,CAACiV;IAAS,EAAG,EACxB;MAAM,OAAO,EAAE,IAAI,CAACE;IAAiB,GACnC;MAAG,SAAS,EAAC;IAAqC,GAC/C,IAAI,CAAC5tD,KAAK,CAAC2tD,OAAO,GAAG,YAAY,GAAG,gBAAgB,CACnD,CACC,CACH;EAEV;AACF;;;;;;;;;;ACvFa;;AAEb,QAAQ,mBAAO,CAAC,4BAAW;AAC3B,IAAI,KAAqC,EAAE,EAG1C,CAAC;AACF;AACA,EAAE,kBAAkB;AACpB;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,EAAE,mBAAmB;AACrB;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;;;;;;;;;;;ACxBA;;;;;;;;;;ACAA;;;;;;;;;;ACAA;;;;;;;;;;ACAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACAoE;AACuB;AACkF;AAC9H;AAClB;;AAE7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,gBAAgB,GAAG,gBAAgB;AAC7D;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,oDAAM;;AAEzB;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,gBAAgB,sCAAsC,SAAS;AACjG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2EAA2E,cAAc;AACzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,gBAAgB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD,SAAS;AAClE;AACA,uEAAuE,SAAS;AAChF,0EAA0E,SAAS;AACnF,sEAAsE,SAAS;AAC/E;AACA,6EAA6E,SAAS;AACtF;AACA;AACA,iGAAiG,sBAAsB;AACvH,oGAAoG,sBAAsB;AAC1H,oGAAoG,sBAAsB;AAC1H,2GAA2G,sBAAsB;AACjI;AACA,0BAA0B,wDAAY;;AAEtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC;AACxC,uCAAuC;AACvC;AACA;AACA;AACA;AACA,wCAAwC,0DAAS;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mFAAmF,qBAAqB;AACxG;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C;AAC/C;AACA;AACA;AACA,sBAAsB;AACtB;AACA,mCAAmC,iEAAiE;AACpG;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,0BAA0B,mEAAmB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,yDAAS;AACrB,YAAY,yDAAS;AACrB;AACA;AACA;AACA,uFAAuF,eAAe;AACtG;AACA;AACA,0BAA0B,mEAAkB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,iCAAiC;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qEAAqE,eAAe;AACpF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,QAAQ;AAC/B;AACA;AACA;AACA;AACA;AACA,2CAA2C,QAAQ,kBAAkB,QAAQ;AAC7E;AACA;AACA,0CAA0C,QAAQ;AAClD;AACA;AACA;AACA;AACA;AACA,0CAA0C,QAAQ;AAClD;AACA;AACA;AACA;AACA,2BAA2B,0DAAS,IAAI,QAAQ,oBAAoB,kBAAkB;AACtF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,mEAAiB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,6DAAa;AACjB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,2CAAM;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,yDAAa;AACtC;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,yDAAa;AACtC;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,cAAc,SAAS,GAAG,kBAAkB;AAC5C;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD,aAAa;AACjE;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,kCAAkC;AAClD,6BAA6B,6EAA6B,kBAAkB,0CAA0C;AACtH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,oEAAoB;AACjC;AACA;AACA;AACA,mBAAmB,yEAAyB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA,2CAA2C;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,6EAA6B;AACxC;AACA,qBAAqB,yCAAyC;AAC9D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,0DAAS;AACpC,2BAA2B,0DAAS;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAE2R;AAC3R;;;;;;;;;;;;;;;;;;ACp6B0C;;AAE1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,oDAAQ;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC,WAAW;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD,gBAAgB,eAAe,UAAU;AAC1F;AACA;AACA,yCAAyC,WAAW;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C,wCAAwC;AACtF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB;AACxB,gBAAgB,eAAe;AAC/B;AACA;AACA,2BAA2B,UAAU,GAAG,qBAAqB;AAC7D;AACA;AACA,qCAAqC,WAAW;AAChD;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,kCAAkC;AAC/D;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4GAA4G;AAC5G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,gBAAgB,mCAAmC,UAAU;AACtG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEmD;AACnD;;;;;;;;;;;;;;;;;;;;;;;ACxZ0F;AAC1C;AACa;AAChC;;AAE7B;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,QAAQ;AACrC;AACA;AACA,gDAAgD;AAChD;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iHAAiH,WAAW;AAC5H;AACA;AACA,yDAAyD,cAAc,4BAA4B,cAAc,cAAc,GAAG,eAAe;AACjJ;AACA;AACA;AACA,0BAA0B,wDAAY;AACtC;AACA;AACA,6BAA6B,yDAAa;AAC1C;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,WAAW;AAC/C,cAAc,sBAAsB,YAAY,UAAU;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,sBAAsB,QAAQ;AAC9B;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,yCAAyC,cAAc;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,uBAAuB,EAAE,aAAa;AACpD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C,qCAAqC,IAAI,KAAK;AACzF;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,GAAG;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,kBAAkB,GAAG,gBAAgB;AACnD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,UAAU;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,2CAAM;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,yCAAyC;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C,qCAAqC;AAC/E;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mDAAmD,KAAK;AACxD,cAAc,oCAAoC,GAAG,IAAI;AACzD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD,eAAe,aAAa,oDAAoD;AACjI;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,uEAAuE,wBAAwB,WAAW;AAC1G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2EAA2E,wBAAwB,aAAa,oDAAoD;AACpK;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,eAAe,gCAAgC;AACxF;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,yCAAyC;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,sBAAsB;AAClC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,KAAK;AAC7C,cAAc,oCAAoC,GAAG,IAAI;AACzD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,YAAY;AACxB;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,YAAY;AACxB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,qBAAqB;AAChD,IAAI,iCAAiC;AACrC,qBAAqB,iCAAiC;AACtD;AACA;AACA;AACA,gCAAgC,qDAAM;AACtC,8BAA8B,2DAAY;AAC1C;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC,2DAAY;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,2DAAY;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,iEAAkB,KAAK,0DAAS;AACpC,IAAI,iEAAkB,KAAK,0DAAS;AACpC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,8DAAe;AACf;AACA,8DAAe;;AAE+D;AAC9E;;;;;;;;;;;;;;;;;;ACjoCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,4BAA4B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,IAAI,KAAK,cAAc;AACnD;AACA;AACA,sFAAsF,QAAQ;AAC9F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kDAAkD,IAAI;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;;AAE4D;AAC5D;;;;;;;;;;;;;;;;;;;;;;;;AC1NiC;AACe;AACT;AAC+F;AAC5C;;AAE1F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,sCAAsC;;AAEvC;AACA;AACA;AACA;AACA,mEAAmE;AACnE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,kCAAkC;;AAEnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,oBAAoB;AACxC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,2CAAM;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,UAAU,6CAAQ;AAClB,UAAU,6CAAQ;AAClB,UAAU,6CAAQ;AAClB;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,sBAAsB;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,2CAAM;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,WAAW;AAC7B;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iHAAiH,WAAW;AAC5H;AACA;AACA;AACA;AACA;AACA;AACA,gJAAgJ,qBAAqB;AACrK,+HAA+H,WAAW;AAC1I;AACA;AACA,yBAAyB,WAAW;AACpC,wHAAwH,WAAW;AACnI;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,wDAAY;;AAEtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,4CAA4C,GAAG,mBAAmB;AAC1G;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,4CAA4C,GAAG,MAAM;AAC7F;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,uBAAuB,WAAW;AAClC,cAAc,SAAS,YAAY,UAAU;AAC7C;AACA,4BAA4B,0BAA0B;AACtD;AACA;AACA;AACA;AACA;AACA,qDAAqD,UAAU;AAC/D,KAAK;AACL;AACA,mBAAmB,kCAAkC;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kEAAkE,mBAAmB,6CAA6C;AAClI;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,eAAe;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,UAAU;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,iEAAkB,KAAK,0DAAS;AACpC,IAAI,iEAAkB,KAAK,0DAAS;AACpC,IAAI,8DAAe;AACnB;AACA,IAAI,8DAAe;AACnB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,yEAAyB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,oEAAoB;AAC5B,QAAQ,iEAAiB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,qDAAM;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL,WAAW,2DAAY,CAAC,kEAAkB;AAC1C;AACA;AACA,mBAAmB,iBAAiB;AACpC,gFAAgF;AAChF;AACA;AACA;AACA;AACA;AACA,2BAA2B,iBAAiB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,kEAAkB;AAClC;AACA;AACA;AACA,wDAAwD,iBAAiB;AACzE,QAAQ,iBAAiB;AACzB;AACA,2BAA2B,iBAAiB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,kEAAkB;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,iBAAiB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,kEAAkB;AAClC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEoH;AACpH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACjtCgD;AAClB;;AAE9B;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8DAAe;AACf;;;;;;;;;;;;;;;;;;;;ACvBoC;AACpC;;;;;;;;;;;;;;;;;;;ACDmE;AACN;;AAE7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,yCAAyC,IAAI;AAC9E;AACA,wBAAwB,qDAAI;AAC5B;AACA;AACA,oBAAoB,qDAAI,sDAAsD,qDAAI;AAClF,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,wBAAwB;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,UAAU,IAAI;AACxC;AACA;AACA;AACA,WAAW,qDAAI;AACf;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAY;AACZ;AACA;AACA;AACA,CAAC;;AAE2B;;;;;;;;;;;;;;;;;;;ACvF5B;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,wBAAwB;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AA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ACA;AACA;;AAEA,aAAa,QAAQ;;AAErB,4CAA4C,EAAE,EAAE;AAChD,aAAa,QAAQ;;AAErB;AACA,aAAa,QAAQ;;AAErB;AACA,aAAa,QAAQ;;AAErB;AACA,aAAa,QAAQ;;AAErB;AACA,aAAa,QAAQ;;AAErB;AACA,aAAa,QAAQ;;AAErB,qLAAqL;AACrL,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;;;;;AC3GiE,CAAC;AAClE;;AAEA,sCAAsC,sEAAsB,iBAAiB;AAC7E;AACA;;AAEe;AACf;;AAEA;AACA;AACA,IAAI;AACJ;;;AAGA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;AC/BiD;AACkG;AAC7G;AACoB;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,QAAQ;AACpB,YAAY,QAAQ;AACpB,YAAY,QAAQ;AACpB,YAAY,QAAQ;AACpB,YAAY,QAAQ,GAAG,6CAA6C;AACpE;AACA,iBAAiB,+CAA+C;AAChE;AACA;AACA;AACA;AACA;;AAEe;AACf;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA,2BAA2B,8DAAc,0CAA0C;AACnF;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA,oCAAoC,+GAA+D;AACnG;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAI;;;AAGJ;AACA;AACA;;AAEA,iBAAiB,oDAAQ,YAAY;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,kBAAkB,kEAAuB;AACzC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;;;;;;;;ACrGsC;AACa;AACY;AACR;AACS;AAChE;AACA;AACA;AACA,YAAY,QAAQ;AACpB,YAAY,SAAS;AACrB,YAAY,SAAS;AACrB,YAAY,QAAQ;AACpB,YAAY,QAAQ,GAAG,6CAA6C;AACpE;;AAEe;AACf,qCAAqC,gFAAqB;;AAE1D;AACA,mBAAmB,iEAAQ;AAC3B;AACA;;AAEA,gCAAgC,qEAAqB;AACrD;;AAEA,iCAAiC,qEAAqB;AACtD,gEAAgE;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,SAAS,+DAAe,sDAAsD,+DAAe,qEAAqE,iEAAiB;AACnL;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;ACjDuH;AACpE;AACI;AACvD;AACA;AACA;AACA;AACA;AACA,YAAY,QAAQ;AACpB,YAAY,UAAU;AACtB,YAAY,QAAQ,GAAG,8CAA8C;AACrE;;AAEe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,iGAAiD;AAC/E;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAM,+DAAe,6DAA6D,+DAAe;AACjG;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA,UAAU,iEAAiB;AAC3B;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;AC9GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,sBAAsB;AAC3C,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,YAAY,QAAQ,GAAG,sEAAsE;AAC7F;AACe;AACf;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,gGAAgG;AAChG;;AAEA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0EAA0E;AAC1E;;AAEA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;;;AAGA;;AAEA;AACA;AACA,+FAA+F;AAC/F;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,QAAQ;AACR;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;AC1GqF,CAAC;AACtF;AACA;AACA;;AAEO;AACQ;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,WAAW,gFAAgC;AAC3C;;AAEA;AACA;AACA;;;;;;;;;;;;;;;AChCyE;AACzE;AACe;AACf;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,IAAI;AACJ;;;AAGA;AACA;AACA;;AAEA,SAAS,0EAA0B;AACnC;AACA;;;;;;;;;;;;;;;;ACxBA,8DAA8D,iFAAiF,gDAAgD,wHAAwH,gBAAgB,WAAW,qBAAqB,4BAA4B,cAAc,SAAS,mCAAmC;;AAE7b,kDAAkD,gBAAgB,gEAAgE,wDAAwD,6DAA6D,sDAAsD;;AAE7S,uCAAuC,uDAAuD,uCAAuC,SAAS,OAAO,oBAAoB;;AAEnI;AACS;AAChC;AACf;AACA,iBAAiB,oDAAQ;;AAEzB,kFAAkF,4BAA4B;AAC9G;AACA,+BAA+B;AAC/B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,aAAa,6DAAa;AAC1B;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;AClCsC;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,0EAA0E;AAC1E;;AAEe;AACf,4BAA4B,oDAAQ;AACpC;;AAE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A;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,QAAQ;AACpB,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;;AAEe;AACf,mBAAmB;AACnB;AACA;AACA;AACA;AACA;;AAEA,iFAAiF,4BAA4B;AAC7G;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;;;;;;ACxHsC;AACS;AAC/C,gDAAgD,uDAAY;AAC7C;AACf;AACA;AACA,IAAI;;;AAGJ,4BAA4B,oDAAQ;AACpC;AACA;;AAEA;AACA;AACA,IAAI;;;AAGJ,mEAAmE;AACnE;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;;;;;;;ACjCqC;AAC0B;AAChD;AACf;AACA;AACA;AACA;;AAEA,iBAAiB,oDAAQ;;AAEzB;AACA;AACA;AACA;;AAEA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;AACA,IAAI;;;AAGJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACO;AACP;AACA,UAAU,yEAAiB;AAC3B;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;ACrEA,wBAAwB,2BAA2B,sGAAsG,qBAAqB,mBAAmB,8HAA8H;;AAE/T,kDAAkD,0CAA0C;;AAE5F,4CAA4C,gBAAgB,kBAAkB,OAAO,2BAA2B,wDAAwD,gCAAgC,uDAAuD;;AAE/P,8DAA8D,sEAAsE,8DAA8D,kDAAkD,iBAAiB,GAAG;;AAExN,CAAC;AACjD;;AAEA,mBAAmB;;AAEnB,kBAAkB;;AAElB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA,iDAAiD;AACjD;AACA;;AAEA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,MAAM;;AAEN,GAAG;AACH;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA,QAAQ;AACR;AACA;;AAEA;AACA;AACA,GAAG;AACH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAM;;AAEN,GAAG;AACH;AACA;AACA;AACA,MAAM;;AAEN,GAAG;AACH;AACA;AACA;AACA,MAAM;;AAEN,GAAG;AACH;AACA;AACA;AACA,MAAM;;AAEN,GAAG;AACH;AACA;AACA;AACA,MAAM;;AAEN,GAAG;AACH;AACA;AACA;AACA,MAAM;;AAEN,GAAG;AACH;AACA;AACA;AACA,MAAM;;AAEN,GAAG;AACH;AACA;AACA;AACA,MAAM;;AAEN,GAAG;AACH;AACA;AACA;AACA,MAAM;;AAEN,GAAG;AACH;AACA;AACA;AACA,MAAM;;AAEN,GAAG;AACH;AACA;AACA;AACA,MAAM;;AAEN,GAAG;AACH;AACA;AACA;AACA,MAAM;;AAEN,GAAG;AACH;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,MAAM;;AAEN,GAAG;AACH;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA,CAAC;;AAE8B;;AAE/B;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;;AAEA,GAAG;AACH;AACA;AACA;AACA,MAAM;;AAEN,GAAG;AACH;AACA;AACA;AACA;AACA,MAAM;;AAEN,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,MAAM;;AAEN,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA,MAAM;AACN;AACA;;AAEA,GAAG;AACH;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA,MAAM;AACN;AACA;;AAEA,GAAG;AACH;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA,GAAG;AACH;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;;AAEA;AACA;AACA;AACA,QAAQ;AACR;;;AAGA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA,CAAC;;AAED;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;;AAEN,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;;;AAGA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA,CAAC;;AAED;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEO;AACP;AACA;AACA,IAAI;AACJ;;;AAGA;AACA,8NAA8N,0CAA0C;AACxQ;AACA,EAAE;AACF;;AAEA;;AAEA;AACA;AACA,GAAG;AACH;;AAEA;;;AAGA;AACA;AACA;AACA;AACA;AACA,YAAY,QAAQ;AACpB,YAAY,QAAQ;AACpB,YAAY;AACZ;AACA;AACA;AACA;;;AAGO;AACP;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,YAAY,QAAQ;AACpB,YAAY,QAAQ;AACpB,YAAY;AACZ;AACA;AACA;AACA;;AAEO;AACP;;AAEA;AACA;AACA;;AAEA;AACA;AACO;AACP;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,MAAM,SAAS,oEAAO;AACtB;AACA,MAAM,SAAS,oEAAO;AACtB;AACA,MAAM;AACN;AACA;AACA;AACA,EAAE,oCAAoC,EAAE;AACxC;AACA;AACA;AACA;;;;;;;;;;;;;;;;ACrpBA,8DAA8D,iFAAiF,gDAAgD,wHAAwH,gBAAgB,WAAW,qBAAqB,4BAA4B,cAAc,SAAS,mCAAmC;;AAE7b,kDAAkD,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AA+B,EAAE,mBAAmB,EAAE,MAAM,EAAE,0DAA0D,EAAE;;;;;;;;;;;;;;;;ACHx2+F;AACe;AAC3E;AACO;AACP,QAAQ,oEAAoB,CAAC,sDAAiB;AAC9C;;;;;;;;;;;;;;;;ACL4D;AACiC;AAC7F;AACO;AACP,QAAQ,oEAAoB,CAAC,sDAA0B;AACvD;;;;;;;;;;;;;;;;ACLA;AACA;AACoD;AACpD;AACe;AACf;AACA,WAAW,gEAAQ;AACnB;AACA;;;;;;;;;;;;;;;;UCRA;UACA;;UAEA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;;UAEA;UACA;;UAEA;UACA;UACA;;UAEA;UACA;;;;;WCzBA;WACA;WACA;WACA;WACA;WACA,iCAAiC,WAAW;WAC5C;WACA;;;;;WCPA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,sDAAsD;WACtD,sCAAsC,iEAAiE;WACvG;WACA;WACA;WACA;WACA;WACA;;;;;WCzBA;WACA;WACA;WACA;WACA,yCAAyC,wCAAwC;WACjF;WACA;WACA;;;;;WCPA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,EAAE;WACF;;;;;WCRA;WACA;WACA;WACA;WACA;;;;;WCJA;WACA;WACA;WACA;WACA,GAAG;WACH;WACA;WACA,CAAC;;;;;WCPD;;;;;WCAA;WACA;WACA;WACA;WACA,uBAAuB,4BAA4B;WACnD;WACA;WACA;WACA,iBAAiB,oBAAoB;WACrC;WACA,mGAAmG,YAAY;WAC/G;WACA;WACA;WACA;WACA;;WAEA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,mEAAmE,iCAAiC;WACpG;WACA;WACA;WACA;;;;;WCxCA;WACA;WACA;WACA,uDAAuD,iBAAiB;WACxE;WACA,gDAAgD,aAAa;WAC7D;;;;;WCNA;;;;;WCAA;;WAEA;WACA;WACA;WACA;WACA;WACA;;WAEA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","sources":["webpack://tinode-webapp/./node_modules/@firebase/util/dist/index.esm2017.js","webpack://tinode-webapp/./src/config.js","webpack://tinode-webapp/./src/constants.js","webpack://tinode-webapp/./src/lib/blob-helpers.js","webpack://tinode-webapp/./src/lib/formatters.js","webpack://tinode-webapp/./src/lib/host-name.js","webpack://tinode-webapp/./src/lib/local-storage.js","webpack://tinode-webapp/./src/lib/navigation.js","webpack://tinode-webapp/./src/lib/strformat.js","webpack://tinode-webapp/./src/lib/utils.js","webpack://tinode-webapp/./src/version.js","webpack://tinode-webapp/./src/views/acc-notifications-view.jsx","webpack://tinode-webapp/./src/views/acc-security-view.jsx","webpack://tinode-webapp/./src/views/acc-support-view.jsx","webpack://tinode-webapp/./src/views/account-settings-view.jsx","webpack://tinode-webapp/./src/views/contacts-view.jsx","webpack://tinode-webapp/./src/views/create-account-view.jsx","webpack://tinode-webapp/./src/views/info-view.jsx","webpack://tinode-webapp/./src/views/login-view.jsx","webpack://tinode-webapp/./src/views/logo-view.jsx","webpack://tinode-webapp/./src/views/messages-view.jsx","webpack://tinode-webapp/./src/views/new-topic-view.jsx","webpack://tinode-webapp/./src/views/password-reset-view.jsx","webpack://tinode-webapp/./src/views/settings-view.jsx","webpack://tinode-webapp/./src/views/sidepanel-view.jsx","webpack://tinode-webapp/./src/views/tinode-web.jsx","webpack://tinode-webapp/./src/views/topic-common-view.jsx","webpack://tinode-webapp/./src/views/validation-view.jsx","webpack://tinode-webapp/./src/widgets/alert.jsx","webpack://tinode-webapp/./src/widgets/attachment.jsx","webpack://tinode-webapp/./src/widgets/audio-player.jsx","webpack://tinode-webapp/./src/widgets/avatar-crop.jsx","webpack://tinode-webapp/./src/widgets/avatar-upload.jsx","webpack://tinode-webapp/./src/widgets/badge-list.jsx","webpack://tinode-webapp/./src/widgets/button-back.jsx","webpack://tinode-webapp/./src/widgets/call-incoming.jsx","webpack://tinode-webapp/./src/widgets/call-message.jsx","webpack://tinode-webapp/./src/widgets/call-panel.jsx","webpack://tinode-webapp/./src/widgets/call-status.jsx","webpack://tinode-webapp/./src/widgets/chat-message.jsx","webpack://tinode-webapp/./src/widgets/checkbox.jsx","webpack://tinode-webapp/./src/widgets/chip-input.jsx","webpack://tinode-webapp/./src/widgets/chip.jsx","webpack://tinode-webapp/./src/widgets/contact-action.jsx","webpack://tinode-webapp/./src/widgets/contact-badges.jsx","webpack://tinode-webapp/./src/widgets/contact-list.jsx","webpack://tinode-webapp/./src/widgets/contact.jsx","webpack://tinode-webapp/./src/widgets/context-menu.jsx","webpack://tinode-webapp/./src/widgets/credential-edit.jsx","webpack://tinode-webapp/./src/widgets/cropper.jsx","webpack://tinode-webapp/./src/widgets/doc-preview.jsx","webpack://tinode-webapp/./src/widgets/error-panel.jsx","webpack://tinode-webapp/./src/widgets/file-progress.jsx","webpack://tinode-webapp/./src/widgets/forward-dialog.jsx","webpack://tinode-webapp/./src/widgets/group-manager.jsx","webpack://tinode-webapp/./src/widgets/group-subs.jsx","webpack://tinode-webapp/./src/widgets/host-selector.jsx","webpack://tinode-webapp/./src/widgets/image-preview.jsx","webpack://tinode-webapp/./src/widgets/in-place-edit.jsx","webpack://tinode-webapp/./src/widgets/inline-video.jsx","webpack://tinode-webapp/./src/widgets/invitation.jsx","webpack://tinode-webapp/./src/widgets/lazy-image.jsx","webpack://tinode-webapp/./src/widgets/letter-tile.jsx","webpack://tinode-webapp/./src/widgets/load-spinner.jsx","webpack://tinode-webapp/./src/widgets/menu-cancel.jsx","webpack://tinode-webapp/./src/widgets/menu-contacts.jsx","webpack://tinode-webapp/./src/widgets/menu-start.jsx","webpack://tinode-webapp/./src/widgets/meta-message.jsx","webpack://tinode-webapp/./src/widgets/new-topic-by-id.jsx","webpack://tinode-webapp/./src/widgets/new-topic-group.jsx","webpack://tinode-webapp/./src/widgets/permissions-editor.jsx","webpack://tinode-webapp/./src/widgets/phone-edit.jsx","webpack://tinode-webapp/./src/widgets/received-marker.jsx","webpack://tinode-webapp/./src/widgets/search-contacts.jsx","webpack://tinode-webapp/./src/widgets/send-message.jsx","webpack://tinode-webapp/./src/widgets/side-navbar.jsx","webpack://tinode-webapp/./src/widgets/tag-manager.jsx","webpack://tinode-webapp/./src/widgets/topic-desc-edit.jsx","webpack://tinode-webapp/./src/widgets/topic-security.jsx","webpack://tinode-webapp/./src/widgets/unread-badge.jsx","webpack://tinode-webapp/./src/widgets/uploading-image.jsx","webpack://tinode-webapp/./src/widgets/video-preview.jsx","webpack://tinode-webapp/./src/widgets/visible-password.jsx","webpack://tinode-webapp/./node_modules/react-dom/client.js","webpack://tinode-webapp/external var \"React\"","webpack://tinode-webapp/external var \"ReactDOM\"","webpack://tinode-webapp/external var \"ReactIntl\"","webpack://tinode-webapp/external var \"Tinode\"","webpack://tinode-webapp/./node_modules/@firebase/app/dist/esm/index.esm2017.js","webpack://tinode-webapp/./node_modules/@firebase/component/dist/esm/index.esm2017.js","webpack://tinode-webapp/./node_modules/@firebase/installations/dist/esm/index.esm2017.js","webpack://tinode-webapp/./node_modules/@firebase/logger/dist/esm/index.esm2017.js","webpack://tinode-webapp/./node_modules/@firebase/messaging/dist/esm/index.esm2017.js","webpack://tinode-webapp/./node_modules/firebase/app/dist/esm/index.esm.js","webpack://tinode-webapp/./node_modules/firebase/messaging/dist/esm/index.esm.js","webpack://tinode-webapp/./node_modules/idb/build/index.js","webpack://tinode-webapp/./node_modules/idb/build/wrap-idb-value.js","webpack://tinode-webapp/./node_modules/libphonenumber-js/es6/ParseError.js","webpack://tinode-webapp/./node_modules/libphonenumber-js/es6/PhoneNumber.js","webpack://tinode-webapp/./node_modules/libphonenumber-js/es6/constants.js","webpack://tinode-webapp/./node_modules/libphonenumber-js/es6/format_.js","webpack://tinode-webapp/./node_modules/libphonenumber-js/es6/getExampleNumber.js","webpack://tinode-webapp/./node_modules/libphonenumber-js/es6/helpers/RFC3966.js","webpack://tinode-webapp/./node_modules/libphonenumber-js/es6/helpers/applyInternationalSeparatorStyle.js","webpack://tinode-webapp/./node_modules/libphonenumber-js/es6/helpers/checkNumberLength.js","webpack://tinode-webapp/./node_modules/libphonenumber-js/es6/helpers/extension/createExtensionPattern.js","webpack://tinode-webapp/./node_modules/libphonenumber-js/es6/helpers/extension/extractExtension.js","webpack://tinode-webapp/./node_modules/libphonenumber-js/es6/helpers/extractCountryCallingCode.js","webpack://tinode-webapp/./node_modules/libphonenumber-js/es6/helpers/extractCountryCallingCodeFromInternationalNumberWithoutPlusSign.js","webpack://tinode-webapp/./node_modules/libphonenumber-js/es6/helpers/extractNationalNumber.js","webpack://tinode-webapp/./node_modules/libphonenumber-js/es6/helpers/extractNationalNumberFromPossiblyIncompleteNumber.js","webpack://tinode-webapp/./node_modules/libphonenumber-js/es6/helpers/formatNationalNumberUsingFormat.js","webpack://tinode-webapp/./node_modules/libphonenumber-js/es6/helpers/getCountryByCallingCode.js","webpack://tinode-webapp/./node_modules/libphonenumber-js/es6/helpers/getCountryByNationalNumber.js","webpack://tinode-webapp/./node_modules/libphonenumber-js/es6/helpers/getIddPrefix.js","webpack://tinode-webapp/./node_modules/libphonenumber-js/es6/helpers/getNumberType.js","webpack://tinode-webapp/./node_modules/libphonenumber-js/es6/helpers/getPossibleCountriesForNumber.js","webpack://tinode-webapp/./node_modules/libphonenumber-js/es6/helpers/isViablePhoneNumber.js","webpack://tinode-webapp/./node_modules/libphonenumber-js/es6/helpers/matchesEntirely.js","webpack://tinode-webapp/./node_modules/libphonenumber-js/es6/helpers/mergeArrays.js","webpack://tinode-webapp/./node_modules/libphonenumber-js/es6/helpers/parseDigits.js","webpack://tinode-webapp/./node_modules/libphonenumber-js/es6/helpers/stripIddPrefix.js","webpack://tinode-webapp/./node_modules/libphonenumber-js/es6/isPossibleNumber_.js","webpack://tinode-webapp/./node_modules/libphonenumber-js/es6/metadata.js","webpack://tinode-webapp/./node_modules/libphonenumber-js/es6/parseIncompletePhoneNumber.js","webpack://tinode-webapp/./node_modules/libphonenumber-js/es6/parsePhoneNumber.js","webpack://tinode-webapp/./node_modules/libphonenumber-js/es6/parsePhoneNumber_.js","webpack://tinode-webapp/./node_modules/libphonenumber-js/es6/parse_.js","webpack://tinode-webapp/./node_modules/libphonenumber-js/es6/tools/semver-compare.js","webpack://tinode-webapp/./node_modules/libphonenumber-js/es6/validate_.js","webpack://tinode-webapp/./node_modules/libphonenumber-js/examples.mobile.json.js","webpack://tinode-webapp/./node_modules/libphonenumber-js/metadata.mobile.json.js","webpack://tinode-webapp/./node_modules/libphonenumber-js/mobile/exports/getExampleNumber.js","webpack://tinode-webapp/./node_modules/libphonenumber-js/mobile/exports/parsePhoneNumberWithError.js","webpack://tinode-webapp/./node_modules/libphonenumber-js/mobile/exports/withMetadataArgument.js","webpack://tinode-webapp/webpack/bootstrap","webpack://tinode-webapp/webpack/runtime/compat get default export","webpack://tinode-webapp/webpack/runtime/create fake namespace object","webpack://tinode-webapp/webpack/runtime/define property getters","webpack://tinode-webapp/webpack/runtime/ensure chunk","webpack://tinode-webapp/webpack/runtime/get javascript chunk filename","webpack://tinode-webapp/webpack/runtime/global","webpack://tinode-webapp/webpack/runtime/hasOwnProperty shorthand","webpack://tinode-webapp/webpack/runtime/load script","webpack://tinode-webapp/webpack/runtime/make namespace object","webpack://tinode-webapp/webpack/runtime/publicPath","webpack://tinode-webapp/webpack/runtime/jsonp chunk loading","webpack://tinode-webapp/./src/index.js"],"sourcesContent":["/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * @fileoverview Firebase constants. Some of these (@defines) can be overridden at compile-time.\r\n */\r\nconst CONSTANTS = {\r\n /**\r\n * @define {boolean} Whether this is the client Node.js SDK.\r\n */\r\n NODE_CLIENT: false,\r\n /**\r\n * @define {boolean} Whether this is the Admin Node.js SDK.\r\n */\r\n NODE_ADMIN: false,\r\n /**\r\n * Firebase SDK Version\r\n */\r\n SDK_VERSION: '${JSCORE_VERSION}'\r\n};\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Throws an error if the provided assertion is falsy\r\n */\r\nconst assert = function (assertion, message) {\r\n if (!assertion) {\r\n throw assertionError(message);\r\n }\r\n};\r\n/**\r\n * Returns an Error object suitable for throwing.\r\n */\r\nconst assertionError = function (message) {\r\n return new Error('Firebase Database (' +\r\n CONSTANTS.SDK_VERSION +\r\n ') INTERNAL ASSERT FAILED: ' +\r\n message);\r\n};\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst stringToByteArray$1 = function (str) {\r\n // TODO(user): Use native implementations if/when available\r\n const out = [];\r\n let p = 0;\r\n for (let i = 0; i < str.length; i++) {\r\n let c = str.charCodeAt(i);\r\n if (c < 128) {\r\n out[p++] = c;\r\n }\r\n else if (c < 2048) {\r\n out[p++] = (c >> 6) | 192;\r\n out[p++] = (c & 63) | 128;\r\n }\r\n else if ((c & 0xfc00) === 0xd800 &&\r\n i + 1 < str.length &&\r\n (str.charCodeAt(i + 1) & 0xfc00) === 0xdc00) {\r\n // Surrogate Pair\r\n c = 0x10000 + ((c & 0x03ff) << 10) + (str.charCodeAt(++i) & 0x03ff);\r\n out[p++] = (c >> 18) | 240;\r\n out[p++] = ((c >> 12) & 63) | 128;\r\n out[p++] = ((c >> 6) & 63) | 128;\r\n out[p++] = (c & 63) | 128;\r\n }\r\n else {\r\n out[p++] = (c >> 12) | 224;\r\n out[p++] = ((c >> 6) & 63) | 128;\r\n out[p++] = (c & 63) | 128;\r\n }\r\n }\r\n return out;\r\n};\r\n/**\r\n * Turns an array of numbers into the string given by the concatenation of the\r\n * characters to which the numbers correspond.\r\n * @param bytes Array of numbers representing characters.\r\n * @return Stringification of the array.\r\n */\r\nconst byteArrayToString = function (bytes) {\r\n // TODO(user): Use native implementations if/when available\r\n const out = [];\r\n let pos = 0, c = 0;\r\n while (pos < bytes.length) {\r\n const c1 = bytes[pos++];\r\n if (c1 < 128) {\r\n out[c++] = String.fromCharCode(c1);\r\n }\r\n else if (c1 > 191 && c1 < 224) {\r\n const c2 = bytes[pos++];\r\n out[c++] = String.fromCharCode(((c1 & 31) << 6) | (c2 & 63));\r\n }\r\n else if (c1 > 239 && c1 < 365) {\r\n // Surrogate Pair\r\n const c2 = bytes[pos++];\r\n const c3 = bytes[pos++];\r\n const c4 = bytes[pos++];\r\n const u = (((c1 & 7) << 18) | ((c2 & 63) << 12) | ((c3 & 63) << 6) | (c4 & 63)) -\r\n 0x10000;\r\n out[c++] = String.fromCharCode(0xd800 + (u >> 10));\r\n out[c++] = String.fromCharCode(0xdc00 + (u & 1023));\r\n }\r\n else {\r\n const c2 = bytes[pos++];\r\n const c3 = bytes[pos++];\r\n out[c++] = String.fromCharCode(((c1 & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));\r\n }\r\n }\r\n return out.join('');\r\n};\r\n// We define it as an object literal instead of a class because a class compiled down to es5 can't\r\n// be treeshaked. https://github.com/rollup/rollup/issues/1691\r\n// Static lookup maps, lazily populated by init_()\r\nconst base64 = {\r\n /**\r\n * Maps bytes to characters.\r\n */\r\n byteToCharMap_: null,\r\n /**\r\n * Maps characters to bytes.\r\n */\r\n charToByteMap_: null,\r\n /**\r\n * Maps bytes to websafe characters.\r\n * @private\r\n */\r\n byteToCharMapWebSafe_: null,\r\n /**\r\n * Maps websafe characters to bytes.\r\n * @private\r\n */\r\n charToByteMapWebSafe_: null,\r\n /**\r\n * Our default alphabet, shared between\r\n * ENCODED_VALS and ENCODED_VALS_WEBSAFE\r\n */\r\n ENCODED_VALS_BASE: 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' + 'abcdefghijklmnopqrstuvwxyz' + '0123456789',\r\n /**\r\n * Our default alphabet. Value 64 (=) is special; it means \"nothing.\"\r\n */\r\n get ENCODED_VALS() {\r\n return this.ENCODED_VALS_BASE + '+/=';\r\n },\r\n /**\r\n * Our websafe alphabet.\r\n */\r\n get ENCODED_VALS_WEBSAFE() {\r\n return this.ENCODED_VALS_BASE + '-_.';\r\n },\r\n /**\r\n * Whether this browser supports the atob and btoa functions. This extension\r\n * started at Mozilla but is now implemented by many browsers. We use the\r\n * ASSUME_* variables to avoid pulling in the full useragent detection library\r\n * but still allowing the standard per-browser compilations.\r\n *\r\n */\r\n HAS_NATIVE_SUPPORT: typeof atob === 'function',\r\n /**\r\n * Base64-encode an array of bytes.\r\n *\r\n * @param input An array of bytes (numbers with\r\n * value in [0, 255]) to encode.\r\n * @param webSafe Boolean indicating we should use the\r\n * alternative alphabet.\r\n * @return The base64 encoded string.\r\n */\r\n encodeByteArray(input, webSafe) {\r\n if (!Array.isArray(input)) {\r\n throw Error('encodeByteArray takes an array as a parameter');\r\n }\r\n this.init_();\r\n const byteToCharMap = webSafe\r\n ? this.byteToCharMapWebSafe_\r\n : this.byteToCharMap_;\r\n const output = [];\r\n for (let i = 0; i < input.length; i += 3) {\r\n const byte1 = input[i];\r\n const haveByte2 = i + 1 < input.length;\r\n const byte2 = haveByte2 ? input[i + 1] : 0;\r\n const haveByte3 = i + 2 < input.length;\r\n const byte3 = haveByte3 ? input[i + 2] : 0;\r\n const outByte1 = byte1 >> 2;\r\n const outByte2 = ((byte1 & 0x03) << 4) | (byte2 >> 4);\r\n let outByte3 = ((byte2 & 0x0f) << 2) | (byte3 >> 6);\r\n let outByte4 = byte3 & 0x3f;\r\n if (!haveByte3) {\r\n outByte4 = 64;\r\n if (!haveByte2) {\r\n outByte3 = 64;\r\n }\r\n }\r\n output.push(byteToCharMap[outByte1], byteToCharMap[outByte2], byteToCharMap[outByte3], byteToCharMap[outByte4]);\r\n }\r\n return output.join('');\r\n },\r\n /**\r\n * Base64-encode a string.\r\n *\r\n * @param input A string to encode.\r\n * @param webSafe If true, we should use the\r\n * alternative alphabet.\r\n * @return The base64 encoded string.\r\n */\r\n encodeString(input, webSafe) {\r\n // Shortcut for Mozilla browsers that implement\r\n // a native base64 encoder in the form of \"btoa/atob\"\r\n if (this.HAS_NATIVE_SUPPORT && !webSafe) {\r\n return btoa(input);\r\n }\r\n return this.encodeByteArray(stringToByteArray$1(input), webSafe);\r\n },\r\n /**\r\n * Base64-decode a string.\r\n *\r\n * @param input to decode.\r\n * @param webSafe True if we should use the\r\n * alternative alphabet.\r\n * @return string representing the decoded value.\r\n */\r\n decodeString(input, webSafe) {\r\n // Shortcut for Mozilla browsers that implement\r\n // a native base64 encoder in the form of \"btoa/atob\"\r\n if (this.HAS_NATIVE_SUPPORT && !webSafe) {\r\n return atob(input);\r\n }\r\n return byteArrayToString(this.decodeStringToByteArray(input, webSafe));\r\n },\r\n /**\r\n * Base64-decode a string.\r\n *\r\n * In base-64 decoding, groups of four characters are converted into three\r\n * bytes. If the encoder did not apply padding, the input length may not\r\n * be a multiple of 4.\r\n *\r\n * In this case, the last group will have fewer than 4 characters, and\r\n * padding will be inferred. If the group has one or two characters, it decodes\r\n * to one byte. If the group has three characters, it decodes to two bytes.\r\n *\r\n * @param input Input to decode.\r\n * @param webSafe True if we should use the web-safe alphabet.\r\n * @return bytes representing the decoded value.\r\n */\r\n decodeStringToByteArray(input, webSafe) {\r\n this.init_();\r\n const charToByteMap = webSafe\r\n ? this.charToByteMapWebSafe_\r\n : this.charToByteMap_;\r\n const output = [];\r\n for (let i = 0; i < input.length;) {\r\n const byte1 = charToByteMap[input.charAt(i++)];\r\n const haveByte2 = i < input.length;\r\n const byte2 = haveByte2 ? charToByteMap[input.charAt(i)] : 0;\r\n ++i;\r\n const haveByte3 = i < input.length;\r\n const byte3 = haveByte3 ? charToByteMap[input.charAt(i)] : 64;\r\n ++i;\r\n const haveByte4 = i < input.length;\r\n const byte4 = haveByte4 ? charToByteMap[input.charAt(i)] : 64;\r\n ++i;\r\n if (byte1 == null || byte2 == null || byte3 == null || byte4 == null) {\r\n throw Error();\r\n }\r\n const outByte1 = (byte1 << 2) | (byte2 >> 4);\r\n output.push(outByte1);\r\n if (byte3 !== 64) {\r\n const outByte2 = ((byte2 << 4) & 0xf0) | (byte3 >> 2);\r\n output.push(outByte2);\r\n if (byte4 !== 64) {\r\n const outByte3 = ((byte3 << 6) & 0xc0) | byte4;\r\n output.push(outByte3);\r\n }\r\n }\r\n }\r\n return output;\r\n },\r\n /**\r\n * Lazy static initialization function. Called before\r\n * accessing any of the static map variables.\r\n * @private\r\n */\r\n init_() {\r\n if (!this.byteToCharMap_) {\r\n this.byteToCharMap_ = {};\r\n this.charToByteMap_ = {};\r\n this.byteToCharMapWebSafe_ = {};\r\n this.charToByteMapWebSafe_ = {};\r\n // We want quick mappings back and forth, so we precompute two maps.\r\n for (let i = 0; i < this.ENCODED_VALS.length; i++) {\r\n this.byteToCharMap_[i] = this.ENCODED_VALS.charAt(i);\r\n this.charToByteMap_[this.byteToCharMap_[i]] = i;\r\n this.byteToCharMapWebSafe_[i] = this.ENCODED_VALS_WEBSAFE.charAt(i);\r\n this.charToByteMapWebSafe_[this.byteToCharMapWebSafe_[i]] = i;\r\n // Be forgiving when decoding and correctly decode both encodings.\r\n if (i >= this.ENCODED_VALS_BASE.length) {\r\n this.charToByteMap_[this.ENCODED_VALS_WEBSAFE.charAt(i)] = i;\r\n this.charToByteMapWebSafe_[this.ENCODED_VALS.charAt(i)] = i;\r\n }\r\n }\r\n }\r\n }\r\n};\r\n/**\r\n * URL-safe base64 encoding\r\n */\r\nconst base64Encode = function (str) {\r\n const utf8Bytes = stringToByteArray$1(str);\r\n return base64.encodeByteArray(utf8Bytes, true);\r\n};\r\n/**\r\n * URL-safe base64 encoding (without \".\" padding in the end).\r\n * e.g. Used in JSON Web Token (JWT) parts.\r\n */\r\nconst base64urlEncodeWithoutPadding = function (str) {\r\n // Use base64url encoding and remove padding in the end (dot characters).\r\n return base64Encode(str).replace(/\\./g, '');\r\n};\r\n/**\r\n * URL-safe base64 decoding\r\n *\r\n * NOTE: DO NOT use the global atob() function - it does NOT support the\r\n * base64Url variant encoding.\r\n *\r\n * @param str To be decoded\r\n * @return Decoded result, if possible\r\n */\r\nconst base64Decode = function (str) {\r\n try {\r\n return base64.decodeString(str, true);\r\n }\r\n catch (e) {\r\n console.error('base64Decode failed: ', e);\r\n }\r\n return null;\r\n};\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Do a deep-copy of basic JavaScript Objects or Arrays.\r\n */\r\nfunction deepCopy(value) {\r\n return deepExtend(undefined, value);\r\n}\r\n/**\r\n * Copy properties from source to target (recursively allows extension\r\n * of Objects and Arrays). Scalar values in the target are over-written.\r\n * If target is undefined, an object of the appropriate type will be created\r\n * (and returned).\r\n *\r\n * We recursively copy all child properties of plain Objects in the source- so\r\n * that namespace- like dictionaries are merged.\r\n *\r\n * Note that the target can be a function, in which case the properties in\r\n * the source Object are copied onto it as static properties of the Function.\r\n *\r\n * Note: we don't merge __proto__ to prevent prototype pollution\r\n */\r\nfunction deepExtend(target, source) {\r\n if (!(source instanceof Object)) {\r\n return source;\r\n }\r\n switch (source.constructor) {\r\n case Date:\r\n // Treat Dates like scalars; if the target date object had any child\r\n // properties - they will be lost!\r\n const dateValue = source;\r\n return new Date(dateValue.getTime());\r\n case Object:\r\n if (target === undefined) {\r\n target = {};\r\n }\r\n break;\r\n case Array:\r\n // Always copy the array source and overwrite the target.\r\n target = [];\r\n break;\r\n default:\r\n // Not a plain Object - treat it as a scalar.\r\n return source;\r\n }\r\n for (const prop in source) {\r\n // use isValidKey to guard against prototype pollution. See https://snyk.io/vuln/SNYK-JS-LODASH-450202\r\n if (!source.hasOwnProperty(prop) || !isValidKey(prop)) {\r\n continue;\r\n }\r\n target[prop] = deepExtend(target[prop], source[prop]);\r\n }\r\n return target;\r\n}\r\nfunction isValidKey(key) {\r\n return key !== '__proto__';\r\n}\n\n/**\r\n * @license\r\n * Copyright 2022 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Polyfill for `globalThis` object.\r\n * @returns the `globalThis` object for the given environment.\r\n * @public\r\n */\r\nfunction getGlobal() {\r\n if (typeof self !== 'undefined') {\r\n return self;\r\n }\r\n if (typeof window !== 'undefined') {\r\n return window;\r\n }\r\n if (typeof global !== 'undefined') {\r\n return global;\r\n }\r\n throw new Error('Unable to locate global object.');\r\n}\n\n/**\r\n * @license\r\n * Copyright 2022 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst getDefaultsFromGlobal = () => getGlobal().__FIREBASE_DEFAULTS__;\r\n/**\r\n * Attempt to read defaults from a JSON string provided to\r\n * process(.)env(.)__FIREBASE_DEFAULTS__ or a JSON file whose path is in\r\n * process(.)env(.)__FIREBASE_DEFAULTS_PATH__\r\n * The dots are in parens because certain compilers (Vite?) cannot\r\n * handle seeing that variable in comments.\r\n * See https://github.com/firebase/firebase-js-sdk/issues/6838\r\n */\r\nconst getDefaultsFromEnvVariable = () => {\r\n if (typeof process === 'undefined' || typeof process.env === 'undefined') {\r\n return;\r\n }\r\n const defaultsJsonString = process.env.__FIREBASE_DEFAULTS__;\r\n if (defaultsJsonString) {\r\n return JSON.parse(defaultsJsonString);\r\n }\r\n};\r\nconst getDefaultsFromCookie = () => {\r\n if (typeof document === 'undefined') {\r\n return;\r\n }\r\n let match;\r\n try {\r\n match = document.cookie.match(/__FIREBASE_DEFAULTS__=([^;]+)/);\r\n }\r\n catch (e) {\r\n // Some environments such as Angular Universal SSR have a\r\n // `document` object but error on accessing `document.cookie`.\r\n return;\r\n }\r\n const decoded = match && base64Decode(match[1]);\r\n return decoded && JSON.parse(decoded);\r\n};\r\n/**\r\n * Get the __FIREBASE_DEFAULTS__ object. It checks in order:\r\n * (1) if such an object exists as a property of `globalThis`\r\n * (2) if such an object was provided on a shell environment variable\r\n * (3) if such an object exists in a cookie\r\n * @public\r\n */\r\nconst getDefaults = () => {\r\n try {\r\n return (getDefaultsFromGlobal() ||\r\n getDefaultsFromEnvVariable() ||\r\n getDefaultsFromCookie());\r\n }\r\n catch (e) {\r\n /**\r\n * Catch-all for being unable to get __FIREBASE_DEFAULTS__ due\r\n * to any environment case we have not accounted for. Log to\r\n * info instead of swallowing so we can find these unknown cases\r\n * and add paths for them if needed.\r\n */\r\n console.info(`Unable to get __FIREBASE_DEFAULTS__ due to: ${e}`);\r\n return;\r\n }\r\n};\r\n/**\r\n * Returns emulator host stored in the __FIREBASE_DEFAULTS__ object\r\n * for the given product.\r\n * @returns a URL host formatted like `127.0.0.1:9999` or `[::1]:4000` if available\r\n * @public\r\n */\r\nconst getDefaultEmulatorHost = (productName) => { var _a, _b; return (_b = (_a = getDefaults()) === null || _a === void 0 ? void 0 : _a.emulatorHosts) === null || _b === void 0 ? void 0 : _b[productName]; };\r\n/**\r\n * Returns emulator hostname and port stored in the __FIREBASE_DEFAULTS__ object\r\n * for the given product.\r\n * @returns a pair of hostname and port like `[\"::1\", 4000]` if available\r\n * @public\r\n */\r\nconst getDefaultEmulatorHostnameAndPort = (productName) => {\r\n const host = getDefaultEmulatorHost(productName);\r\n if (!host) {\r\n return undefined;\r\n }\r\n const separatorIndex = host.lastIndexOf(':'); // Finding the last since IPv6 addr also has colons.\r\n if (separatorIndex <= 0 || separatorIndex + 1 === host.length) {\r\n throw new Error(`Invalid host ${host} with no separate hostname and port!`);\r\n }\r\n // eslint-disable-next-line no-restricted-globals\r\n const port = parseInt(host.substring(separatorIndex + 1), 10);\r\n if (host[0] === '[') {\r\n // Bracket-quoted `[ipv6addr]:port` => return \"ipv6addr\" (without brackets).\r\n return [host.substring(1, separatorIndex - 1), port];\r\n }\r\n else {\r\n return [host.substring(0, separatorIndex), port];\r\n }\r\n};\r\n/**\r\n * Returns Firebase app config stored in the __FIREBASE_DEFAULTS__ object.\r\n * @public\r\n */\r\nconst getDefaultAppConfig = () => { var _a; return (_a = getDefaults()) === null || _a === void 0 ? void 0 : _a.config; };\r\n/**\r\n * Returns an experimental setting on the __FIREBASE_DEFAULTS__ object (properties\r\n * prefixed by \"_\")\r\n * @public\r\n */\r\nconst getExperimentalSetting = (name) => { var _a; return (_a = getDefaults()) === null || _a === void 0 ? void 0 : _a[`_${name}`]; };\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nclass Deferred {\r\n constructor() {\r\n this.reject = () => { };\r\n this.resolve = () => { };\r\n this.promise = new Promise((resolve, reject) => {\r\n this.resolve = resolve;\r\n this.reject = reject;\r\n });\r\n }\r\n /**\r\n * Our API internals are not promiseified and cannot because our callback APIs have subtle expectations around\r\n * invoking promises inline, which Promises are forbidden to do. This method accepts an optional node-style callback\r\n * and returns a node-style callback which will resolve or reject the Deferred's promise.\r\n */\r\n wrapCallback(callback) {\r\n return (error, value) => {\r\n if (error) {\r\n this.reject(error);\r\n }\r\n else {\r\n this.resolve(value);\r\n }\r\n if (typeof callback === 'function') {\r\n // Attaching noop handler just in case developer wasn't expecting\r\n // promises\r\n this.promise.catch(() => { });\r\n // Some of our callbacks don't expect a value and our own tests\r\n // assert that the parameter length is 1\r\n if (callback.length === 1) {\r\n callback(error);\r\n }\r\n else {\r\n callback(error, value);\r\n }\r\n }\r\n };\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2021 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction createMockUserToken(token, projectId) {\r\n if (token.uid) {\r\n throw new Error('The \"uid\" field is no longer supported by mockUserToken. Please use \"sub\" instead for Firebase Auth User ID.');\r\n }\r\n // Unsecured JWTs use \"none\" as the algorithm.\r\n const header = {\r\n alg: 'none',\r\n type: 'JWT'\r\n };\r\n const project = projectId || 'demo-project';\r\n const iat = token.iat || 0;\r\n const sub = token.sub || token.user_id;\r\n if (!sub) {\r\n throw new Error(\"mockUserToken must contain 'sub' or 'user_id' field!\");\r\n }\r\n const payload = Object.assign({ \r\n // Set all required fields to decent defaults\r\n iss: `https://securetoken.google.com/${project}`, aud: project, iat, exp: iat + 3600, auth_time: iat, sub, user_id: sub, firebase: {\r\n sign_in_provider: 'custom',\r\n identities: {}\r\n } }, token);\r\n // Unsecured JWTs use the empty string as a signature.\r\n const signature = '';\r\n return [\r\n base64urlEncodeWithoutPadding(JSON.stringify(header)),\r\n base64urlEncodeWithoutPadding(JSON.stringify(payload)),\r\n signature\r\n ].join('.');\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Returns navigator.userAgent string or '' if it's not defined.\r\n * @return user agent string\r\n */\r\nfunction getUA() {\r\n if (typeof navigator !== 'undefined' &&\r\n typeof navigator['userAgent'] === 'string') {\r\n return navigator['userAgent'];\r\n }\r\n else {\r\n return '';\r\n }\r\n}\r\n/**\r\n * Detect Cordova / PhoneGap / Ionic frameworks on a mobile device.\r\n *\r\n * Deliberately does not rely on checking `file://` URLs (as this fails PhoneGap\r\n * in the Ripple emulator) nor Cordova `onDeviceReady`, which would normally\r\n * wait for a callback.\r\n */\r\nfunction isMobileCordova() {\r\n return (typeof window !== 'undefined' &&\r\n // @ts-ignore Setting up an broadly applicable index signature for Window\r\n // just to deal with this case would probably be a bad idea.\r\n !!(window['cordova'] || window['phonegap'] || window['PhoneGap']) &&\r\n /ios|iphone|ipod|ipad|android|blackberry|iemobile/i.test(getUA()));\r\n}\r\n/**\r\n * Detect Node.js.\r\n *\r\n * @return true if Node.js environment is detected or specified.\r\n */\r\n// Node detection logic from: https://github.com/iliakan/detect-node/\r\nfunction isNode() {\r\n var _a;\r\n const forceEnvironment = (_a = getDefaults()) === null || _a === void 0 ? void 0 : _a.forceEnvironment;\r\n if (forceEnvironment === 'node') {\r\n return true;\r\n }\r\n else if (forceEnvironment === 'browser') {\r\n return false;\r\n }\r\n try {\r\n return (Object.prototype.toString.call(global.process) === '[object process]');\r\n }\r\n catch (e) {\r\n return false;\r\n }\r\n}\r\n/**\r\n * Detect Browser Environment\r\n */\r\nfunction isBrowser() {\r\n return typeof self === 'object' && self.self === self;\r\n}\r\nfunction isBrowserExtension() {\r\n const runtime = typeof chrome === 'object'\r\n ? chrome.runtime\r\n : typeof browser === 'object'\r\n ? browser.runtime\r\n : undefined;\r\n return typeof runtime === 'object' && runtime.id !== undefined;\r\n}\r\n/**\r\n * Detect React Native.\r\n *\r\n * @return true if ReactNative environment is detected.\r\n */\r\nfunction isReactNative() {\r\n return (typeof navigator === 'object' && navigator['product'] === 'ReactNative');\r\n}\r\n/** Detects Electron apps. */\r\nfunction isElectron() {\r\n return getUA().indexOf('Electron/') >= 0;\r\n}\r\n/** Detects Internet Explorer. */\r\nfunction isIE() {\r\n const ua = getUA();\r\n return ua.indexOf('MSIE ') >= 0 || ua.indexOf('Trident/') >= 0;\r\n}\r\n/** Detects Universal Windows Platform apps. */\r\nfunction isUWP() {\r\n return getUA().indexOf('MSAppHost/') >= 0;\r\n}\r\n/**\r\n * Detect whether the current SDK build is the Node version.\r\n *\r\n * @return true if it's the Node SDK build.\r\n */\r\nfunction isNodeSdk() {\r\n return CONSTANTS.NODE_CLIENT === true || CONSTANTS.NODE_ADMIN === true;\r\n}\r\n/** Returns true if we are running in Safari. */\r\nfunction isSafari() {\r\n return (!isNode() &&\r\n navigator.userAgent.includes('Safari') &&\r\n !navigator.userAgent.includes('Chrome'));\r\n}\r\n/**\r\n * This method checks if indexedDB is supported by current browser/service worker context\r\n * @return true if indexedDB is supported by current browser/service worker context\r\n */\r\nfunction isIndexedDBAvailable() {\r\n try {\r\n return typeof indexedDB === 'object';\r\n }\r\n catch (e) {\r\n return false;\r\n }\r\n}\r\n/**\r\n * This method validates browser/sw context for indexedDB by opening a dummy indexedDB database and reject\r\n * if errors occur during the database open operation.\r\n *\r\n * @throws exception if current browser/sw context can't run idb.open (ex: Safari iframe, Firefox\r\n * private browsing)\r\n */\r\nfunction validateIndexedDBOpenable() {\r\n return new Promise((resolve, reject) => {\r\n try {\r\n let preExist = true;\r\n const DB_CHECK_NAME = 'validate-browser-context-for-indexeddb-analytics-module';\r\n const request = self.indexedDB.open(DB_CHECK_NAME);\r\n request.onsuccess = () => {\r\n request.result.close();\r\n // delete database only when it doesn't pre-exist\r\n if (!preExist) {\r\n self.indexedDB.deleteDatabase(DB_CHECK_NAME);\r\n }\r\n resolve(true);\r\n };\r\n request.onupgradeneeded = () => {\r\n preExist = false;\r\n };\r\n request.onerror = () => {\r\n var _a;\r\n reject(((_a = request.error) === null || _a === void 0 ? void 0 : _a.message) || '');\r\n };\r\n }\r\n catch (error) {\r\n reject(error);\r\n }\r\n });\r\n}\r\n/**\r\n *\r\n * This method checks whether cookie is enabled within current browser\r\n * @return true if cookie is enabled within current browser\r\n */\r\nfunction areCookiesEnabled() {\r\n if (typeof navigator === 'undefined' || !navigator.cookieEnabled) {\r\n return false;\r\n }\r\n return true;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * @fileoverview Standardized Firebase Error.\r\n *\r\n * Usage:\r\n *\r\n * // Typescript string literals for type-safe codes\r\n * type Err =\r\n * 'unknown' |\r\n * 'object-not-found'\r\n * ;\r\n *\r\n * // Closure enum for type-safe error codes\r\n * // at-enum {string}\r\n * var Err = {\r\n * UNKNOWN: 'unknown',\r\n * OBJECT_NOT_FOUND: 'object-not-found',\r\n * }\r\n *\r\n * let errors: Map = {\r\n * 'generic-error': \"Unknown error\",\r\n * 'file-not-found': \"Could not find file: {$file}\",\r\n * };\r\n *\r\n * // Type-safe function - must pass a valid error code as param.\r\n * let error = new ErrorFactory('service', 'Service', errors);\r\n *\r\n * ...\r\n * throw error.create(Err.GENERIC);\r\n * ...\r\n * throw error.create(Err.FILE_NOT_FOUND, {'file': fileName});\r\n * ...\r\n * // Service: Could not file file: foo.txt (service/file-not-found).\r\n *\r\n * catch (e) {\r\n * assert(e.message === \"Could not find file: foo.txt.\");\r\n * if ((e as FirebaseError)?.code === 'service/file-not-found') {\r\n * console.log(\"Could not read file: \" + e['file']);\r\n * }\r\n * }\r\n */\r\nconst ERROR_NAME = 'FirebaseError';\r\n// Based on code from:\r\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error#Custom_Error_Types\r\nclass FirebaseError extends Error {\r\n constructor(\r\n /** The error code for this error. */\r\n code, message, \r\n /** Custom data for this error. */\r\n customData) {\r\n super(message);\r\n this.code = code;\r\n this.customData = customData;\r\n /** The custom name for all FirebaseErrors. */\r\n this.name = ERROR_NAME;\r\n // Fix For ES5\r\n // https://github.com/Microsoft/TypeScript-wiki/blob/master/Breaking-Changes.md#extending-built-ins-like-error-array-and-map-may-no-longer-work\r\n Object.setPrototypeOf(this, FirebaseError.prototype);\r\n // Maintains proper stack trace for where our error was thrown.\r\n // Only available on V8.\r\n if (Error.captureStackTrace) {\r\n Error.captureStackTrace(this, ErrorFactory.prototype.create);\r\n }\r\n }\r\n}\r\nclass ErrorFactory {\r\n constructor(service, serviceName, errors) {\r\n this.service = service;\r\n this.serviceName = serviceName;\r\n this.errors = errors;\r\n }\r\n create(code, ...data) {\r\n const customData = data[0] || {};\r\n const fullCode = `${this.service}/${code}`;\r\n const template = this.errors[code];\r\n const message = template ? replaceTemplate(template, customData) : 'Error';\r\n // Service Name: Error message (service/code).\r\n const fullMessage = `${this.serviceName}: ${message} (${fullCode}).`;\r\n const error = new FirebaseError(fullCode, fullMessage, customData);\r\n return error;\r\n }\r\n}\r\nfunction replaceTemplate(template, data) {\r\n return template.replace(PATTERN, (_, key) => {\r\n const value = data[key];\r\n return value != null ? String(value) : `<${key}?>`;\r\n });\r\n}\r\nconst PATTERN = /\\{\\$([^}]+)}/g;\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Evaluates a JSON string into a javascript object.\r\n *\r\n * @param {string} str A string containing JSON.\r\n * @return {*} The javascript object representing the specified JSON.\r\n */\r\nfunction jsonEval(str) {\r\n return JSON.parse(str);\r\n}\r\n/**\r\n * Returns JSON representing a javascript object.\r\n * @param {*} data Javascript object to be stringified.\r\n * @return {string} The JSON contents of the object.\r\n */\r\nfunction stringify(data) {\r\n return JSON.stringify(data);\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Decodes a Firebase auth. token into constituent parts.\r\n *\r\n * Notes:\r\n * - May return with invalid / incomplete claims if there's no native base64 decoding support.\r\n * - Doesn't check if the token is actually valid.\r\n */\r\nconst decode = function (token) {\r\n let header = {}, claims = {}, data = {}, signature = '';\r\n try {\r\n const parts = token.split('.');\r\n header = jsonEval(base64Decode(parts[0]) || '');\r\n claims = jsonEval(base64Decode(parts[1]) || '');\r\n signature = parts[2];\r\n data = claims['d'] || {};\r\n delete claims['d'];\r\n }\r\n catch (e) { }\r\n return {\r\n header,\r\n claims,\r\n data,\r\n signature\r\n };\r\n};\r\n/**\r\n * Decodes a Firebase auth. token and checks the validity of its time-based claims. Will return true if the\r\n * token is within the time window authorized by the 'nbf' (not-before) and 'iat' (issued-at) claims.\r\n *\r\n * Notes:\r\n * - May return a false negative if there's no native base64 decoding support.\r\n * - Doesn't check if the token is actually valid.\r\n */\r\nconst isValidTimestamp = function (token) {\r\n const claims = decode(token).claims;\r\n const now = Math.floor(new Date().getTime() / 1000);\r\n let validSince = 0, validUntil = 0;\r\n if (typeof claims === 'object') {\r\n if (claims.hasOwnProperty('nbf')) {\r\n validSince = claims['nbf'];\r\n }\r\n else if (claims.hasOwnProperty('iat')) {\r\n validSince = claims['iat'];\r\n }\r\n if (claims.hasOwnProperty('exp')) {\r\n validUntil = claims['exp'];\r\n }\r\n else {\r\n // token will expire after 24h by default\r\n validUntil = validSince + 86400;\r\n }\r\n }\r\n return (!!now &&\r\n !!validSince &&\r\n !!validUntil &&\r\n now >= validSince &&\r\n now <= validUntil);\r\n};\r\n/**\r\n * Decodes a Firebase auth. token and returns its issued at time if valid, null otherwise.\r\n *\r\n * Notes:\r\n * - May return null if there's no native base64 decoding support.\r\n * - Doesn't check if the token is actually valid.\r\n */\r\nconst issuedAtTime = function (token) {\r\n const claims = decode(token).claims;\r\n if (typeof claims === 'object' && claims.hasOwnProperty('iat')) {\r\n return claims['iat'];\r\n }\r\n return null;\r\n};\r\n/**\r\n * Decodes a Firebase auth. token and checks the validity of its format. Expects a valid issued-at time.\r\n *\r\n * Notes:\r\n * - May return a false negative if there's no native base64 decoding support.\r\n * - Doesn't check if the token is actually valid.\r\n */\r\nconst isValidFormat = function (token) {\r\n const decoded = decode(token), claims = decoded.claims;\r\n return !!claims && typeof claims === 'object' && claims.hasOwnProperty('iat');\r\n};\r\n/**\r\n * Attempts to peer into an auth token and determine if it's an admin auth token by looking at the claims portion.\r\n *\r\n * Notes:\r\n * - May return a false negative if there's no native base64 decoding support.\r\n * - Doesn't check if the token is actually valid.\r\n */\r\nconst isAdmin = function (token) {\r\n const claims = decode(token).claims;\r\n return typeof claims === 'object' && claims['admin'] === true;\r\n};\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction contains(obj, key) {\r\n return Object.prototype.hasOwnProperty.call(obj, key);\r\n}\r\nfunction safeGet(obj, key) {\r\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\r\n return obj[key];\r\n }\r\n else {\r\n return undefined;\r\n }\r\n}\r\nfunction isEmpty(obj) {\r\n for (const key in obj) {\r\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n}\r\nfunction map(obj, fn, contextObj) {\r\n const res = {};\r\n for (const key in obj) {\r\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\r\n res[key] = fn.call(contextObj, obj[key], key, obj);\r\n }\r\n }\r\n return res;\r\n}\r\n/**\r\n * Deep equal two objects. Support Arrays and Objects.\r\n */\r\nfunction deepEqual(a, b) {\r\n if (a === b) {\r\n return true;\r\n }\r\n const aKeys = Object.keys(a);\r\n const bKeys = Object.keys(b);\r\n for (const k of aKeys) {\r\n if (!bKeys.includes(k)) {\r\n return false;\r\n }\r\n const aProp = a[k];\r\n const bProp = b[k];\r\n if (isObject(aProp) && isObject(bProp)) {\r\n if (!deepEqual(aProp, bProp)) {\r\n return false;\r\n }\r\n }\r\n else if (aProp !== bProp) {\r\n return false;\r\n }\r\n }\r\n for (const k of bKeys) {\r\n if (!aKeys.includes(k)) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n}\r\nfunction isObject(thing) {\r\n return thing !== null && typeof thing === 'object';\r\n}\n\n/**\r\n * @license\r\n * Copyright 2022 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Rejects if the given promise doesn't resolve in timeInMS milliseconds.\r\n * @internal\r\n */\r\nfunction promiseWithTimeout(promise, timeInMS = 2000) {\r\n const deferredPromise = new Deferred();\r\n setTimeout(() => deferredPromise.reject('timeout!'), timeInMS);\r\n promise.then(deferredPromise.resolve, deferredPromise.reject);\r\n return deferredPromise.promise;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Returns a querystring-formatted string (e.g. &arg=val&arg2=val2) from a\r\n * params object (e.g. {arg: 'val', arg2: 'val2'})\r\n * Note: You must prepend it with ? when adding it to a URL.\r\n */\r\nfunction querystring(querystringParams) {\r\n const params = [];\r\n for (const [key, value] of Object.entries(querystringParams)) {\r\n if (Array.isArray(value)) {\r\n value.forEach(arrayVal => {\r\n params.push(encodeURIComponent(key) + '=' + encodeURIComponent(arrayVal));\r\n });\r\n }\r\n else {\r\n params.push(encodeURIComponent(key) + '=' + encodeURIComponent(value));\r\n }\r\n }\r\n return params.length ? '&' + params.join('&') : '';\r\n}\r\n/**\r\n * Decodes a querystring (e.g. ?arg=val&arg2=val2) into a params object\r\n * (e.g. {arg: 'val', arg2: 'val2'})\r\n */\r\nfunction querystringDecode(querystring) {\r\n const obj = {};\r\n const tokens = querystring.replace(/^\\?/, '').split('&');\r\n tokens.forEach(token => {\r\n if (token) {\r\n const [key, value] = token.split('=');\r\n obj[decodeURIComponent(key)] = decodeURIComponent(value);\r\n }\r\n });\r\n return obj;\r\n}\r\n/**\r\n * Extract the query string part of a URL, including the leading question mark (if present).\r\n */\r\nfunction extractQuerystring(url) {\r\n const queryStart = url.indexOf('?');\r\n if (!queryStart) {\r\n return '';\r\n }\r\n const fragmentStart = url.indexOf('#', queryStart);\r\n return url.substring(queryStart, fragmentStart > 0 ? fragmentStart : undefined);\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * @fileoverview SHA-1 cryptographic hash.\r\n * Variable names follow the notation in FIPS PUB 180-3:\r\n * http://csrc.nist.gov/publications/fips/fips180-3/fips180-3_final.pdf.\r\n *\r\n * Usage:\r\n * var sha1 = new sha1();\r\n * sha1.update(bytes);\r\n * var hash = sha1.digest();\r\n *\r\n * Performance:\r\n * Chrome 23: ~400 Mbit/s\r\n * Firefox 16: ~250 Mbit/s\r\n *\r\n */\r\n/**\r\n * SHA-1 cryptographic hash constructor.\r\n *\r\n * The properties declared here are discussed in the above algorithm document.\r\n * @constructor\r\n * @final\r\n * @struct\r\n */\r\nclass Sha1 {\r\n constructor() {\r\n /**\r\n * Holds the previous values of accumulated variables a-e in the compress_\r\n * function.\r\n * @private\r\n */\r\n this.chain_ = [];\r\n /**\r\n * A buffer holding the partially computed hash result.\r\n * @private\r\n */\r\n this.buf_ = [];\r\n /**\r\n * An array of 80 bytes, each a part of the message to be hashed. Referred to\r\n * as the message schedule in the docs.\r\n * @private\r\n */\r\n this.W_ = [];\r\n /**\r\n * Contains data needed to pad messages less than 64 bytes.\r\n * @private\r\n */\r\n this.pad_ = [];\r\n /**\r\n * @private {number}\r\n */\r\n this.inbuf_ = 0;\r\n /**\r\n * @private {number}\r\n */\r\n this.total_ = 0;\r\n this.blockSize = 512 / 8;\r\n this.pad_[0] = 128;\r\n for (let i = 1; i < this.blockSize; ++i) {\r\n this.pad_[i] = 0;\r\n }\r\n this.reset();\r\n }\r\n reset() {\r\n this.chain_[0] = 0x67452301;\r\n this.chain_[1] = 0xefcdab89;\r\n this.chain_[2] = 0x98badcfe;\r\n this.chain_[3] = 0x10325476;\r\n this.chain_[4] = 0xc3d2e1f0;\r\n this.inbuf_ = 0;\r\n this.total_ = 0;\r\n }\r\n /**\r\n * Internal compress helper function.\r\n * @param buf Block to compress.\r\n * @param offset Offset of the block in the buffer.\r\n * @private\r\n */\r\n compress_(buf, offset) {\r\n if (!offset) {\r\n offset = 0;\r\n }\r\n const W = this.W_;\r\n // get 16 big endian words\r\n if (typeof buf === 'string') {\r\n for (let i = 0; i < 16; i++) {\r\n // TODO(user): [bug 8140122] Recent versions of Safari for Mac OS and iOS\r\n // have a bug that turns the post-increment ++ operator into pre-increment\r\n // during JIT compilation. We have code that depends heavily on SHA-1 for\r\n // correctness and which is affected by this bug, so I've removed all uses\r\n // of post-increment ++ in which the result value is used. We can revert\r\n // this change once the Safari bug\r\n // (https://bugs.webkit.org/show_bug.cgi?id=109036) has been fixed and\r\n // most clients have been updated.\r\n W[i] =\r\n (buf.charCodeAt(offset) << 24) |\r\n (buf.charCodeAt(offset + 1) << 16) |\r\n (buf.charCodeAt(offset + 2) << 8) |\r\n buf.charCodeAt(offset + 3);\r\n offset += 4;\r\n }\r\n }\r\n else {\r\n for (let i = 0; i < 16; i++) {\r\n W[i] =\r\n (buf[offset] << 24) |\r\n (buf[offset + 1] << 16) |\r\n (buf[offset + 2] << 8) |\r\n buf[offset + 3];\r\n offset += 4;\r\n }\r\n }\r\n // expand to 80 words\r\n for (let i = 16; i < 80; i++) {\r\n const t = W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16];\r\n W[i] = ((t << 1) | (t >>> 31)) & 0xffffffff;\r\n }\r\n let a = this.chain_[0];\r\n let b = this.chain_[1];\r\n let c = this.chain_[2];\r\n let d = this.chain_[3];\r\n let e = this.chain_[4];\r\n let f, k;\r\n // TODO(user): Try to unroll this loop to speed up the computation.\r\n for (let i = 0; i < 80; i++) {\r\n if (i < 40) {\r\n if (i < 20) {\r\n f = d ^ (b & (c ^ d));\r\n k = 0x5a827999;\r\n }\r\n else {\r\n f = b ^ c ^ d;\r\n k = 0x6ed9eba1;\r\n }\r\n }\r\n else {\r\n if (i < 60) {\r\n f = (b & c) | (d & (b | c));\r\n k = 0x8f1bbcdc;\r\n }\r\n else {\r\n f = b ^ c ^ d;\r\n k = 0xca62c1d6;\r\n }\r\n }\r\n const t = (((a << 5) | (a >>> 27)) + f + e + k + W[i]) & 0xffffffff;\r\n e = d;\r\n d = c;\r\n c = ((b << 30) | (b >>> 2)) & 0xffffffff;\r\n b = a;\r\n a = t;\r\n }\r\n this.chain_[0] = (this.chain_[0] + a) & 0xffffffff;\r\n this.chain_[1] = (this.chain_[1] + b) & 0xffffffff;\r\n this.chain_[2] = (this.chain_[2] + c) & 0xffffffff;\r\n this.chain_[3] = (this.chain_[3] + d) & 0xffffffff;\r\n this.chain_[4] = (this.chain_[4] + e) & 0xffffffff;\r\n }\r\n update(bytes, length) {\r\n // TODO(johnlenz): tighten the function signature and remove this check\r\n if (bytes == null) {\r\n return;\r\n }\r\n if (length === undefined) {\r\n length = bytes.length;\r\n }\r\n const lengthMinusBlock = length - this.blockSize;\r\n let n = 0;\r\n // Using local instead of member variables gives ~5% speedup on Firefox 16.\r\n const buf = this.buf_;\r\n let inbuf = this.inbuf_;\r\n // The outer while loop should execute at most twice.\r\n while (n < length) {\r\n // When we have no data in the block to top up, we can directly process the\r\n // input buffer (assuming it contains sufficient data). This gives ~25%\r\n // speedup on Chrome 23 and ~15% speedup on Firefox 16, but requires that\r\n // the data is provided in large chunks (or in multiples of 64 bytes).\r\n if (inbuf === 0) {\r\n while (n <= lengthMinusBlock) {\r\n this.compress_(bytes, n);\r\n n += this.blockSize;\r\n }\r\n }\r\n if (typeof bytes === 'string') {\r\n while (n < length) {\r\n buf[inbuf] = bytes.charCodeAt(n);\r\n ++inbuf;\r\n ++n;\r\n if (inbuf === this.blockSize) {\r\n this.compress_(buf);\r\n inbuf = 0;\r\n // Jump to the outer loop so we use the full-block optimization.\r\n break;\r\n }\r\n }\r\n }\r\n else {\r\n while (n < length) {\r\n buf[inbuf] = bytes[n];\r\n ++inbuf;\r\n ++n;\r\n if (inbuf === this.blockSize) {\r\n this.compress_(buf);\r\n inbuf = 0;\r\n // Jump to the outer loop so we use the full-block optimization.\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n this.inbuf_ = inbuf;\r\n this.total_ += length;\r\n }\r\n /** @override */\r\n digest() {\r\n const digest = [];\r\n let totalBits = this.total_ * 8;\r\n // Add pad 0x80 0x00*.\r\n if (this.inbuf_ < 56) {\r\n this.update(this.pad_, 56 - this.inbuf_);\r\n }\r\n else {\r\n this.update(this.pad_, this.blockSize - (this.inbuf_ - 56));\r\n }\r\n // Add # bits.\r\n for (let i = this.blockSize - 1; i >= 56; i--) {\r\n this.buf_[i] = totalBits & 255;\r\n totalBits /= 256; // Don't use bit-shifting here!\r\n }\r\n this.compress_(this.buf_);\r\n let n = 0;\r\n for (let i = 0; i < 5; i++) {\r\n for (let j = 24; j >= 0; j -= 8) {\r\n digest[n] = (this.chain_[i] >> j) & 255;\r\n ++n;\r\n }\r\n }\r\n return digest;\r\n }\r\n}\n\n/**\r\n * Helper to make a Subscribe function (just like Promise helps make a\r\n * Thenable).\r\n *\r\n * @param executor Function which can make calls to a single Observer\r\n * as a proxy.\r\n * @param onNoObservers Callback when count of Observers goes to zero.\r\n */\r\nfunction createSubscribe(executor, onNoObservers) {\r\n const proxy = new ObserverProxy(executor, onNoObservers);\r\n return proxy.subscribe.bind(proxy);\r\n}\r\n/**\r\n * Implement fan-out for any number of Observers attached via a subscribe\r\n * function.\r\n */\r\nclass ObserverProxy {\r\n /**\r\n * @param executor Function which can make calls to a single Observer\r\n * as a proxy.\r\n * @param onNoObservers Callback when count of Observers goes to zero.\r\n */\r\n constructor(executor, onNoObservers) {\r\n this.observers = [];\r\n this.unsubscribes = [];\r\n this.observerCount = 0;\r\n // Micro-task scheduling by calling task.then().\r\n this.task = Promise.resolve();\r\n this.finalized = false;\r\n this.onNoObservers = onNoObservers;\r\n // Call the executor asynchronously so subscribers that are called\r\n // synchronously after the creation of the subscribe function\r\n // can still receive the very first value generated in the executor.\r\n this.task\r\n .then(() => {\r\n executor(this);\r\n })\r\n .catch(e => {\r\n this.error(e);\r\n });\r\n }\r\n next(value) {\r\n this.forEachObserver((observer) => {\r\n observer.next(value);\r\n });\r\n }\r\n error(error) {\r\n this.forEachObserver((observer) => {\r\n observer.error(error);\r\n });\r\n this.close(error);\r\n }\r\n complete() {\r\n this.forEachObserver((observer) => {\r\n observer.complete();\r\n });\r\n this.close();\r\n }\r\n /**\r\n * Subscribe function that can be used to add an Observer to the fan-out list.\r\n *\r\n * - We require that no event is sent to a subscriber sychronously to their\r\n * call to subscribe().\r\n */\r\n subscribe(nextOrObserver, error, complete) {\r\n let observer;\r\n if (nextOrObserver === undefined &&\r\n error === undefined &&\r\n complete === undefined) {\r\n throw new Error('Missing Observer.');\r\n }\r\n // Assemble an Observer object when passed as callback functions.\r\n if (implementsAnyMethods(nextOrObserver, [\r\n 'next',\r\n 'error',\r\n 'complete'\r\n ])) {\r\n observer = nextOrObserver;\r\n }\r\n else {\r\n observer = {\r\n next: nextOrObserver,\r\n error,\r\n complete\r\n };\r\n }\r\n if (observer.next === undefined) {\r\n observer.next = noop;\r\n }\r\n if (observer.error === undefined) {\r\n observer.error = noop;\r\n }\r\n if (observer.complete === undefined) {\r\n observer.complete = noop;\r\n }\r\n const unsub = this.unsubscribeOne.bind(this, this.observers.length);\r\n // Attempt to subscribe to a terminated Observable - we\r\n // just respond to the Observer with the final error or complete\r\n // event.\r\n if (this.finalized) {\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\r\n this.task.then(() => {\r\n try {\r\n if (this.finalError) {\r\n observer.error(this.finalError);\r\n }\r\n else {\r\n observer.complete();\r\n }\r\n }\r\n catch (e) {\r\n // nothing\r\n }\r\n return;\r\n });\r\n }\r\n this.observers.push(observer);\r\n return unsub;\r\n }\r\n // Unsubscribe is synchronous - we guarantee that no events are sent to\r\n // any unsubscribed Observer.\r\n unsubscribeOne(i) {\r\n if (this.observers === undefined || this.observers[i] === undefined) {\r\n return;\r\n }\r\n delete this.observers[i];\r\n this.observerCount -= 1;\r\n if (this.observerCount === 0 && this.onNoObservers !== undefined) {\r\n this.onNoObservers(this);\r\n }\r\n }\r\n forEachObserver(fn) {\r\n if (this.finalized) {\r\n // Already closed by previous event....just eat the additional values.\r\n return;\r\n }\r\n // Since sendOne calls asynchronously - there is no chance that\r\n // this.observers will become undefined.\r\n for (let i = 0; i < this.observers.length; i++) {\r\n this.sendOne(i, fn);\r\n }\r\n }\r\n // Call the Observer via one of it's callback function. We are careful to\r\n // confirm that the observe has not been unsubscribed since this asynchronous\r\n // function had been queued.\r\n sendOne(i, fn) {\r\n // Execute the callback asynchronously\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\r\n this.task.then(() => {\r\n if (this.observers !== undefined && this.observers[i] !== undefined) {\r\n try {\r\n fn(this.observers[i]);\r\n }\r\n catch (e) {\r\n // Ignore exceptions raised in Observers or missing methods of an\r\n // Observer.\r\n // Log error to console. b/31404806\r\n if (typeof console !== 'undefined' && console.error) {\r\n console.error(e);\r\n }\r\n }\r\n }\r\n });\r\n }\r\n close(err) {\r\n if (this.finalized) {\r\n return;\r\n }\r\n this.finalized = true;\r\n if (err !== undefined) {\r\n this.finalError = err;\r\n }\r\n // Proxy is no longer needed - garbage collect references\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\r\n this.task.then(() => {\r\n this.observers = undefined;\r\n this.onNoObservers = undefined;\r\n });\r\n }\r\n}\r\n/** Turn synchronous function into one called asynchronously. */\r\n// eslint-disable-next-line @typescript-eslint/ban-types\r\nfunction async(fn, onError) {\r\n return (...args) => {\r\n Promise.resolve(true)\r\n .then(() => {\r\n fn(...args);\r\n })\r\n .catch((error) => {\r\n if (onError) {\r\n onError(error);\r\n }\r\n });\r\n };\r\n}\r\n/**\r\n * Return true if the object passed in implements any of the named methods.\r\n */\r\nfunction implementsAnyMethods(obj, methods) {\r\n if (typeof obj !== 'object' || obj === null) {\r\n return false;\r\n }\r\n for (const method of methods) {\r\n if (method in obj && typeof obj[method] === 'function') {\r\n return true;\r\n }\r\n }\r\n return false;\r\n}\r\nfunction noop() {\r\n // do nothing\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Check to make sure the appropriate number of arguments are provided for a public function.\r\n * Throws an error if it fails.\r\n *\r\n * @param fnName The function name\r\n * @param minCount The minimum number of arguments to allow for the function call\r\n * @param maxCount The maximum number of argument to allow for the function call\r\n * @param argCount The actual number of arguments provided.\r\n */\r\nconst validateArgCount = function (fnName, minCount, maxCount, argCount) {\r\n let argError;\r\n if (argCount < minCount) {\r\n argError = 'at least ' + minCount;\r\n }\r\n else if (argCount > maxCount) {\r\n argError = maxCount === 0 ? 'none' : 'no more than ' + maxCount;\r\n }\r\n if (argError) {\r\n const error = fnName +\r\n ' failed: Was called with ' +\r\n argCount +\r\n (argCount === 1 ? ' argument.' : ' arguments.') +\r\n ' Expects ' +\r\n argError +\r\n '.';\r\n throw new Error(error);\r\n }\r\n};\r\n/**\r\n * Generates a string to prefix an error message about failed argument validation\r\n *\r\n * @param fnName The function name\r\n * @param argName The name of the argument\r\n * @return The prefix to add to the error thrown for validation.\r\n */\r\nfunction errorPrefix(fnName, argName) {\r\n return `${fnName} failed: ${argName} argument `;\r\n}\r\n/**\r\n * @param fnName\r\n * @param argumentNumber\r\n * @param namespace\r\n * @param optional\r\n */\r\nfunction validateNamespace(fnName, namespace, optional) {\r\n if (optional && !namespace) {\r\n return;\r\n }\r\n if (typeof namespace !== 'string') {\r\n //TODO: I should do more validation here. We only allow certain chars in namespaces.\r\n throw new Error(errorPrefix(fnName, 'namespace') + 'must be a valid firebase namespace.');\r\n }\r\n}\r\nfunction validateCallback(fnName, argumentName, \r\n// eslint-disable-next-line @typescript-eslint/ban-types\r\ncallback, optional) {\r\n if (optional && !callback) {\r\n return;\r\n }\r\n if (typeof callback !== 'function') {\r\n throw new Error(errorPrefix(fnName, argumentName) + 'must be a valid function.');\r\n }\r\n}\r\nfunction validateContextObject(fnName, argumentName, context, optional) {\r\n if (optional && !context) {\r\n return;\r\n }\r\n if (typeof context !== 'object' || context === null) {\r\n throw new Error(errorPrefix(fnName, argumentName) + 'must be a valid context object.');\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n// Code originally came from goog.crypt.stringToUtf8ByteArray, but for some reason they\r\n// automatically replaced '\\r\\n' with '\\n', and they didn't handle surrogate pairs,\r\n// so it's been modified.\r\n// Note that not all Unicode characters appear as single characters in JavaScript strings.\r\n// fromCharCode returns the UTF-16 encoding of a character - so some Unicode characters\r\n// use 2 characters in Javascript. All 4-byte UTF-8 characters begin with a first\r\n// character in the range 0xD800 - 0xDBFF (the first character of a so-called surrogate\r\n// pair).\r\n// See http://www.ecma-international.org/ecma-262/5.1/#sec-15.1.3\r\n/**\r\n * @param {string} str\r\n * @return {Array}\r\n */\r\nconst stringToByteArray = function (str) {\r\n const out = [];\r\n let p = 0;\r\n for (let i = 0; i < str.length; i++) {\r\n let c = str.charCodeAt(i);\r\n // Is this the lead surrogate in a surrogate pair?\r\n if (c >= 0xd800 && c <= 0xdbff) {\r\n const high = c - 0xd800; // the high 10 bits.\r\n i++;\r\n assert(i < str.length, 'Surrogate pair missing trail surrogate.');\r\n const low = str.charCodeAt(i) - 0xdc00; // the low 10 bits.\r\n c = 0x10000 + (high << 10) + low;\r\n }\r\n if (c < 128) {\r\n out[p++] = c;\r\n }\r\n else if (c < 2048) {\r\n out[p++] = (c >> 6) | 192;\r\n out[p++] = (c & 63) | 128;\r\n }\r\n else if (c < 65536) {\r\n out[p++] = (c >> 12) | 224;\r\n out[p++] = ((c >> 6) & 63) | 128;\r\n out[p++] = (c & 63) | 128;\r\n }\r\n else {\r\n out[p++] = (c >> 18) | 240;\r\n out[p++] = ((c >> 12) & 63) | 128;\r\n out[p++] = ((c >> 6) & 63) | 128;\r\n out[p++] = (c & 63) | 128;\r\n }\r\n }\r\n return out;\r\n};\r\n/**\r\n * Calculate length without actually converting; useful for doing cheaper validation.\r\n * @param {string} str\r\n * @return {number}\r\n */\r\nconst stringLength = function (str) {\r\n let p = 0;\r\n for (let i = 0; i < str.length; i++) {\r\n const c = str.charCodeAt(i);\r\n if (c < 128) {\r\n p++;\r\n }\r\n else if (c < 2048) {\r\n p += 2;\r\n }\r\n else if (c >= 0xd800 && c <= 0xdbff) {\r\n // Lead surrogate of a surrogate pair. The pair together will take 4 bytes to represent.\r\n p += 4;\r\n i++; // skip trail surrogate.\r\n }\r\n else {\r\n p += 3;\r\n }\r\n }\r\n return p;\r\n};\n\n/**\r\n * @license\r\n * Copyright 2022 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Copied from https://stackoverflow.com/a/2117523\r\n * Generates a new uuid.\r\n * @public\r\n */\r\nconst uuidv4 = function () {\r\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, c => {\r\n const r = (Math.random() * 16) | 0, v = c === 'x' ? r : (r & 0x3) | 0x8;\r\n return v.toString(16);\r\n });\r\n};\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * The amount of milliseconds to exponentially increase.\r\n */\r\nconst DEFAULT_INTERVAL_MILLIS = 1000;\r\n/**\r\n * The factor to backoff by.\r\n * Should be a number greater than 1.\r\n */\r\nconst DEFAULT_BACKOFF_FACTOR = 2;\r\n/**\r\n * The maximum milliseconds to increase to.\r\n *\r\n * Visible for testing\r\n */\r\nconst MAX_VALUE_MILLIS = 4 * 60 * 60 * 1000; // Four hours, like iOS and Android.\r\n/**\r\n * The percentage of backoff time to randomize by.\r\n * See\r\n * http://go/safe-client-behavior#step-1-determine-the-appropriate-retry-interval-to-handle-spike-traffic\r\n * for context.\r\n *\r\n *
Visible for testing\r\n */\r\nconst RANDOM_FACTOR = 0.5;\r\n/**\r\n * Based on the backoff method from\r\n * https://github.com/google/closure-library/blob/master/closure/goog/math/exponentialbackoff.js.\r\n * Extracted here so we don't need to pass metadata and a stateful ExponentialBackoff object around.\r\n */\r\nfunction calculateBackoffMillis(backoffCount, intervalMillis = DEFAULT_INTERVAL_MILLIS, backoffFactor = DEFAULT_BACKOFF_FACTOR) {\r\n // Calculates an exponentially increasing value.\r\n // Deviation: calculates value from count and a constant interval, so we only need to save value\r\n // and count to restore state.\r\n const currBaseValue = intervalMillis * Math.pow(backoffFactor, backoffCount);\r\n // A random \"fuzz\" to avoid waves of retries.\r\n // Deviation: randomFactor is required.\r\n const randomWait = Math.round(\r\n // A fraction of the backoff value to add/subtract.\r\n // Deviation: changes multiplication order to improve readability.\r\n RANDOM_FACTOR *\r\n currBaseValue *\r\n // A random float (rounded to int by Math.round above) in the range [-1, 1]. Determines\r\n // if we add or subtract.\r\n (Math.random() - 0.5) *\r\n 2);\r\n // Limits backoff to max to avoid effectively permanent backoff.\r\n return Math.min(MAX_VALUE_MILLIS, currBaseValue + randomWait);\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Provide English ordinal letters after a number\r\n */\r\nfunction ordinal(i) {\r\n if (!Number.isFinite(i)) {\r\n return `${i}`;\r\n }\r\n return i + indicator(i);\r\n}\r\nfunction indicator(i) {\r\n i = Math.abs(i);\r\n const cent = i % 100;\r\n if (cent >= 10 && cent <= 20) {\r\n return 'th';\r\n }\r\n const dec = i % 10;\r\n if (dec === 1) {\r\n return 'st';\r\n }\r\n if (dec === 2) {\r\n return 'nd';\r\n }\r\n if (dec === 3) {\r\n return 'rd';\r\n }\r\n return 'th';\r\n}\n\n/**\r\n * @license\r\n * Copyright 2021 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction getModularInstance(service) {\r\n if (service && service._delegate) {\r\n return service._delegate;\r\n }\r\n else {\r\n return service;\r\n }\r\n}\n\nexport { CONSTANTS, Deferred, ErrorFactory, FirebaseError, MAX_VALUE_MILLIS, RANDOM_FACTOR, Sha1, areCookiesEnabled, assert, assertionError, async, base64, base64Decode, base64Encode, base64urlEncodeWithoutPadding, calculateBackoffMillis, contains, createMockUserToken, createSubscribe, decode, deepCopy, deepEqual, deepExtend, errorPrefix, extractQuerystring, getDefaultAppConfig, getDefaultEmulatorHost, getDefaultEmulatorHostnameAndPort, getDefaults, getExperimentalSetting, getGlobal, getModularInstance, getUA, isAdmin, isBrowser, isBrowserExtension, isElectron, isEmpty, isIE, isIndexedDBAvailable, isMobileCordova, isNode, isNodeSdk, isReactNative, isSafari, isUWP, isValidFormat, isValidTimestamp, issuedAtTime, jsonEval, map, ordinal, promiseWithTimeout, querystring, querystringDecode, safeGet, stringLength, stringToByteArray, stringify, uuidv4, validateArgCount, validateCallback, validateContextObject, validateIndexedDBOpenable, validateNamespace };\n//# sourceMappingURL=index.esm2017.js.map\n","import { PACKAGE_VERSION } from './version.js';\n\n// Name of this application, used in the User-Agent.\nexport const APP_NAME = 'TinodeWeb/' + (PACKAGE_VERSION || '0.21');\n\n// API key. Use https://github.com/tinode/chat/tree/master/keygen to generate your own\nexport const API_KEY = 'AQEAAAABAAD_rAp4DJh05a1HAwFT3A6K';\n\n// The array of possible hosts to connect to.\nexport const KNOWN_HOSTS = {hosted: 'web.tinode.co', local: 'localhost:6060'};\n\n// Default host name and port to connect to.\nexport const DEFAULT_HOST = KNOWN_HOSTS.hosted;\n\n// Enable console logging.\nexport const LOGGING_ENABLED = true;\n\n// Minimum time between two keypress notifications, milliseconds.\nexport const KEYPRESS_DELAY = 3_000;\n// Delay before sending a read notification, milliseconds.\nexport const READ_DELAY = 1_500;\n\n// The default shortest allowed tag length. Matches the value on the server.\nexport const MIN_TAG_LENGTH = 2;\n// The default greatest allowed tag length. Matches the value on the server.\nexport const MAX_TAG_LENGTH = 96;\n// The default maximum number of tags allowed. Matches the value on the server.\nexport const MAX_TAG_COUNT = 16;\n\n// Access mode for P2P subscriptions initiated by the current user.\nexport const DEFAULT_P2P_ACCESS_MODE = 'JRWPS';\n// Access mode for new group topics created by the current user.\nexport const NEW_GRP_ACCESS_MODE = 'JRWPSAO';\n// Access mode for a channel.\nexport const CHANNEL_ACCESS_MODE = 'JR';\n\n// Access mode for no access.\nexport const NO_ACCESS_MODE = 'N';\n\n// Mediaquery breakpoint between desktop and mobile, in px. Should match the value\n// in @media (max-size: 640px) in base.css\nexport const MEDIA_BREAKPOINT = 640;\n// Size of css 'rem' unit in pixels. Default 1rem = 10pt = 13px.\nexport const REM_SIZE = 13;\n\n// Size of the avatar image: when image dimensions are greater or the image is not square, it's resized to\n// a square of this size or less.\nexport const AVATAR_SIZE = 384;\n\n// Maximum size of an avatar in bytes for sending in-band. Bigger avatars will be sent out of band (as uploads).\nexport const MAX_AVATAR_BYTES = 4096;\n\n// Size of the broken_image shown in MessagesView\nexport const BROKEN_IMAGE_SIZE = 32;\n\n// Size of video preview when dimensions are missing.\nexport const NO_DIMENSIONS_VIDEO = 128;\n\n// Number of chat messages to fetch in one call.\nexport const MESSAGES_PAGE = 24;\n\n// Default maximum in-band (included directly into the message) attachment size which fits into\n// a message of 256K in size. Used when the server-provided value is unavailable. The actual\n// binary size of the attachment should be smaller due to base64 encoding expansion and some overhead,\n// for instance 1024 bytes.\n// Increase this limit to a greater value in production, if desired. Also increase\n// max_message_size in the server config.\nexport const MAX_INBAND_ATTACHMENT_SIZE = 262_144;\n\n// Default absolute maximum attachment size to be used with the server = 8MB.\n// Used when the server-provided value is unavailable. Increase to something like 100MB in production.\nexport const MAX_EXTERN_ATTACHMENT_SIZE = 1 << 23;\n\n// Maximum allowed linear dimension (pixels) of an image sent inline. Larger images will be shrunk\n// to make the larger dimension fit under this size. You may want to adjust it to 1600 or\n// 2400 for production.\nexport const MAX_IMAGE_DIM = 1024;\n\n// Linear dimensions of image preview: shrink image under this size for previews.\nexport const IMAGE_PREVIEW_DIM = 64;\n\n// Linear dimensions of video screencapture: shrink image under this size for previews.\nexport const VIDEO_PREVIEW_DIM = 96;\n\n// Linear dimensions of image thumbnail: shrink image under this size for thumbnails in reply quote previews.\nexport const IMAGE_THUMBNAIL_DIM = 36;\n// Width of video thumbnail: allow it to be wider, but not taller. Use IMAGE_THUMBNAIL_DIM for height.\nexport const VIDEO_THUMBNAIL_WIDTH = 48;\n\n// Maximum number of online users to be shown in a topic title bar. Others will be\n// hidden under \"+X more\"\nexport const MAX_ONLINE_IN_TOPIC = 4;\n\n// Maximum length of user name, topic title, and private comment.\nexport const MAX_TITLE_LENGTH = 60;\n// Maximum length of topic description.\nexport const MAX_TOPIC_DESCRIPTION_LENGTH = 360;\n// Maximum length of user name when displaying a video call.\nexport const MAX_PEER_TITLE_LENGTH = 20;\n\n// Length of message previews in chat list, in characters.\nexport const MESSAGE_PREVIEW_LENGTH = 80;\n\n// Length of a quote in quoted reply (for outgoing messages).\nexport const QUOTED_REPLY_LENGTH = 30;\n// Length of a preview of a forwarded message.\nexport const FORWARDED_PREVIEW_LENGTH = 84;\n// Length of preview for a message being edited.\nexport const EDIT_PREVIEW_LENGTH = 48;\n\n// Minimum duration of an audio recording in milliseconds (2 sec).\nexport const MIN_DURATION = 2_000;\n// Maximum duration of an audio recording in milliseconds (10 min).\nexport const MAX_DURATION = 600_000;\n\n// Link for \"Contact Us\".\nexport const LINK_CONTACT_US = 'mailto:support@tinode.co';\n\n// Link to Privacy Policy.\nexport const LINK_PRIVACY_POLICY = 'https://tinode.co/privacy.html';\n\n// Link to Terms of Service.\nexport const LINK_TERMS_OF_SERVICE = 'https://tinode.co/terms.html';\n\n","// Video call states.\nexport const CALL_STATE_NONE = 0;\nexport const CALL_STATE_OUTGOING_INITATED = 1;\nexport const CALL_STATE_INCOMING_RECEIVED = 2;\nexport const CALL_STATE_IN_PROGRESS = 3;\n\n// Video call message headers representing call state.\nexport const CALL_HEAD_STARTED = 'started';\n","// File and image helper functions.\n\n// Supported image MIME types and corresponding file extensions.\nexport const SUPPORTED_IMAGE_FORMATS = ['image/jpeg', 'image/gif', 'image/png', 'image/svg', 'image/svg+xml'];\nexport const MIME_EXTENSIONS = ['jpg', 'gif', 'png', 'svg', 'svg'];\n\n// Get an URL from a theCard photo: either create a data: URL or return reference URL.\nexport function makeImageUrl(photo) {\n if (photo && typeof photo == 'object') {\n if (photo.ref) {\n return photo.ref\n }\n if (photo.data && photo.type) {\n const mime = photo.type.startsWith('image/') ? photo.type : ('image/' + photo.type);\n return 'data:' + mime + ';base64,' + photo.data;\n }\n }\n return null;\n}\n\n// Calculate linear dimensions for scaling image down to fit under a certain size.\n// Returns an object which contains destination sizes, source sizes, and offsets\n// into source (when making square images).\nexport function fitImageSize(width, height, maxWidth, maxHeight, forceSquare) {\n // Sanitize input\n width = width | 0;\n height = height | 0;\n maxWidth = maxWidth | 0;\n maxHeight = maxHeight | 0;\n\n if (width <= 0 || height <= 0 || maxWidth <= 0 || maxHeight <= 0) {\n return null;\n }\n\n if (forceSquare) {\n maxWidth = maxHeight = Math.min(maxWidth, maxHeight);\n }\n\n const scale = Math.min(\n Math.min(width, maxWidth) / width,\n Math.min(height, maxHeight) / height\n );\n\n const size = {\n dstWidth: (width * scale) | 0,\n dstHeight: (height * scale) | 0,\n };\n\n if (forceSquare) {\n // Also calculate parameters for making the image square.\n size.dstWidth = size.dstHeight = Math.min(size.dstWidth, size.dstHeight);\n size.srcWidth = size.srcHeight = Math.min(width, height);\n size.xoffset = ((width - size.srcWidth) / 2) | 0;\n size.yoffset = ((height - size.srcWidth) / 2) | 0;\n } else {\n size.xoffset = size.yoffset = 0;\n size.srcWidth = width;\n size.srcHeight = height;\n }\n return size;\n}\n\n// Ensure file's extension matches mime content type\nexport function fileNameForMime(fname, mime) {\n const idx = SUPPORTED_IMAGE_FORMATS.indexOf(mime);\n if (idx < 0 || !fname) {\n // Unknown mime or empty name.\n return fname;\n }\n const ext = MIME_EXTENSIONS[idx];\n\n const at = fname.lastIndexOf('.');\n if (at >= 0) {\n fname = fname.substring(0, at);\n }\n return fname + '.' + ext;\n}\n\n// Scale uploaded image to fit under certain dimensions and byte size, optionally constraining to a square.\n// Returns a promise which is resolven on success or rejected on failure.\nexport function imageScaled(fileOrBlob, maxWidth, maxHeight, maxSize, forceSquare) {\n return new Promise((resolve, reject) => {\n const img = new Image();\n img.crossOrigin = 'Anonymous';\n img.onerror = function(err) {\n reject(new Error(\"Image format unrecognized\"));\n }\n img.onload = async function() {\n // Once the image is loaded, the URL is no longer needed.\n URL.revokeObjectURL(img.src);\n\n // Calculate the desired image dimensions.\n const dim = fitImageSize(img.width, img.height, maxWidth, maxHeight, forceSquare);\n if (!dim) {\n reject(new Error(\"Invalid image\"));\n return;\n }\n let canvas = document.createElement('canvas');\n canvas.width = dim.dstWidth;\n canvas.height = dim.dstHeight;\n let ctx = canvas.getContext('2d');\n ctx.imageSmoothingEnabled = true;\n ctx.drawImage(img, dim.xoffset, dim.yoffset, dim.srcWidth, dim.srcHeight,\n 0, 0, dim.dstWidth, dim.dstHeight);\n\n const mime = SUPPORTED_IMAGE_FORMATS.includes(fileOrBlob.type) ? fileOrBlob.type : 'image/jpeg';\n // Generate blob to check size of the image.\n let blob = await new Promise(resolve => canvas.toBlob(resolve, mime));\n if (!blob) {\n reject(new Error(\"Unsupported image format\"));\n return;\n }\n // Ensure the image is not too large. Shrink the image keeping the aspect ratio.\n // Do nothing if maxsize is <= 0.\n while (maxSize > 0 && blob.length > maxSize) {\n dim.dstWidth = (dim.dstWidth * 0.70710678118) | 0;\n dim.dstHeight = (dim.dstHeight * 0.70710678118) | 0;\n canvas.width = dim.dstWidth;\n canvas.height = dim.dstHeight;\n ctx = canvas.getContext('2d');\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n ctx.drawImage(img, dim.xoffset, dim.yoffset, dim.srcWidth, dim.srcHeight,\n 0, 0, dim.dstWidth, dim.dstHeight);\n blob = await new Promise(resolve => canvas.toBlob(resolve, mime));\n }\n\n canvas = null;\n resolve({mime: mime, blob: blob, width: dim.dstWidth, height: dim.dstHeight, name: fileNameForMime(fileOrBlob.name, mime)});\n };\n img.src = URL.createObjectURL(fileOrBlob);\n });\n}\n\n// Scale and crop image according to specified dimensions.\n// The coordinates are in unscaled image pixels, i.e. cut the rectangle first then scale it.\n// returns a promise.\nexport function imageCrop(mime, objURL, left, top, width, height, scale) {\n return new Promise((resolve, reject) => {\n const img = new Image();\n img.crossOrigin = 'Anonymous';\n img.onerror = _ => {\n reject(new Error(\"Image format unrecognized\"));\n };\n img.onload = _ => {\n // Once the image is loaded, the URL is no longer needed.\n URL.revokeObjectURL(img.src);\n\n let canvas = document.createElement('canvas');\n canvas.width = width * scale;\n canvas.height = height * scale;\n let ctx = canvas.getContext('2d');\n ctx.imageSmoothingEnabled = true;\n ctx.drawImage(img, left, top, width, height, 0, 0, canvas.width, canvas.height);\n\n mime = SUPPORTED_IMAGE_FORMATS.includes(mime) ? mime : 'image/jpeg';\n // Generate blob to check size of the image.\n canvas.toBlob((blob) => {\n // Allow GC.\n canvas = null;\n if (blob) {\n resolve({mime: mime, blob: blob, width: width, height: height});\n } else {\n reject(new Error(\"Unsupported image format\"));\n }\n }, mime);\n };\n img.src = objURL;\n });\n}\n\n// Convert file to base64 string.\nexport function fileToBase64(file) {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onerror = _ => {\n reject(reader.error);\n };\n reader.onload = _ => {\n resolve({mime: file.type, bits: reader.result.split(',')[1], name: file.name});\n };\n reader.readAsDataURL(file);\n });\n}\n\n// Convert Blob to base64 string. Returns a promise resolved with the base64 string and mime.\nexport function blobToBase64(blob) {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onerror = _ => {\n reject(reader.error);\n };\n reader.onload = _ => {\n resolve({mime: blob.type, bits: reader.result.split(',')[1]});\n };\n reader.readAsDataURL(blob);\n });\n}\n\n// File pasted from the clipboard. It's either an inline image or a file attachment.\nexport function filePasted(event, onImageSuccess, onAttachmentSuccess, onError) {\n const items = (event.clipboardData || event.originalEvent.clipboardData || {}).items;\n if (!items || !items.length) {\n return false;\n }\n\n for (let i in items) {\n const item = items[i];\n if (item.kind === 'file') {\n const file = item.getAsFile();\n if (!file) {\n console.error(\"Failed to get file object from pasted file item\", item.kind, item.type);\n onError(\"Failed to get file object from pasted file item\");\n continue;\n }\n if (file.type && file.type.split('/')[0] == 'image') {\n onImageSuccess(file);\n } else {\n onAttachmentSuccess(file);\n }\n // Indicate that the pasted data contains a file.\n return true;\n }\n }\n // No file found.\n return false;\n}\n\n// Get mime type from data URL header.\nexport function getMimeType(header) {\n var mime = /^data:(image\\/[-+a-z0-9.]+);base64/.exec(header);\n return (mime && mime.length > 1) ? mime[1] : null;\n}\n\n// Given length of a binary object in bytes, calculate the length after\n// base64 encoding.\nexport function base64EncodedLen(n) {\n return Math.floor((n + 2) / 3) * 4;\n}\n\n// Given length of a base64-encoded object, calculate decoded size of the\n// pbject in bytes.\nexport function base64DecodedLen(n) {\n return Math.floor(n / 4) * 3;\n}\n\n// Re-encode string to standard base64 encoding with padding.\n// The string may be base64-URL encoded without the padding.\nexport function base64ReEncode(str) {\n if (str) {\n str = str.replace(/-/g, '+').replace(/_/g, '/');\n try {\n str = btoa(atob(str));\n } catch(err) {\n console.error(\"Failed to base64 re-encode string.\", err);\n str = null;\n }\n }\n return str;\n}\n\n// Convert a base64 encoded string with the provided mime type into a Blob.\nexport function base64ToBlob(str, mime) {\n if (!str) {\n return null;\n }\n\n try {\n // Make blob.\n const bin = atob(str);\n const length = bin.length;\n const buf = new ArrayBuffer(length);\n const arr = new Uint8Array(buf);\n for (let i = 0; i < length; i++) {\n arr[i] = bin.charCodeAt(i);\n }\n\n return new Blob([buf], { type: mime });\n } catch(err) {\n console.error(\"Failed to convert base64 to blob: \", err);\n }\n\n return null;\n}\n\nexport function intArrayToBase64(arr) {\n if (!Array.isArray(arr)) {\n return null;\n }\n try {\n let bin = '';\n new Uint8Array(arr).forEach(b => bin += String.fromCharCode(b));\n return window.btoa(bin);\n } catch (err) {}\n return null;\n}\n\nexport function base64ToIntArray(b64) {\n const arr = [];\n try {\n const bin = window.atob(b64);\n [...bin].forEach(c => {\n arr.push(c.charCodeAt(0));\n });\n return arr;\n } catch (err) {}\n return null;\n}\n","import React from 'react';\nimport { defineMessages } from 'react-intl';\n\nimport { Drafty } from 'tinode-sdk';\n\nimport AudioPlayer from '../widgets/audio-player.jsx'\nimport CallMessage from '../widgets/call-message.jsx'\nimport CallStatus from '../widgets/call-status.jsx';\nimport InlineVideo from '../widgets/inline-video.jsx';\nimport LazyImage from '../widgets/lazy-image.jsx'\nimport UploadingImage from '../widgets/uploading-image.jsx'\n\nimport { BROKEN_IMAGE_SIZE, IMAGE_THUMBNAIL_DIM, NO_DIMENSIONS_VIDEO, REM_SIZE, VIDEO_THUMBNAIL_WIDTH } from '../config.js';\nimport { base64ToBlob, blobToBase64, fitImageSize, imageScaled } from './blob-helpers.js';\nimport { idToColorClass, secondsToTime, shortenFileName } from './strformat.js';\nimport { cancelablePromise, sanitizeUrlForMime } from './utils.js';\n\nconst messages = defineMessages({\n drafty_form: {\n id: 'drafty_form',\n defaultMessage: 'Form: ',\n description: 'Comment for form in Drafty'\n },\n drafty_attachment: {\n id: 'drafty_attachment',\n defaultMessage: 'Attachment',\n description: 'Comment for attachment in Drafty'\n },\n drafty_image: {\n id: 'drafty_image',\n defaultMessage: 'Picture',\n description: 'Comment for embedded images in Drafty'\n },\n drafty_video: {\n id: 'drafty_video',\n defaultMessage: 'Video recording',\n description: 'Comment for videos embedded in Drafty'\n },\n drafty_unknown: {\n id: 'drafty_unknown',\n defaultMessage: 'Unsupported',\n description: 'Unsupported entity in drafty'\n }\n});\n\n// The main Drafty formatter: converts Drafty elements into React classes. 'this' is set by the caller.\n// 'this' must contain:\n// viewportWidth:\n// authorizeURL:\n// onImagePreview:\n// onVideoPreview:\n// onFormButtonClick:\n// onQuoteClick:\nexport function fullFormatter(style, data, values, key, stack) {\n if (stack.includes('QQ')) {\n return quoteFormatter.call(this, style, data, values, key);\n }\n\n if (!style) {\n // Unformatted.\n return values;\n }\n\n let el = Drafty.tagName(style);\n let attr = Drafty.attrValue(style, data) || {};\n attr.key = key;\n switch (style) {\n case 'AU':\n // Show audio player.\n if (attr.src) {\n attr.src = this.authorizeURL(sanitizeUrlForMime(attr.src, 'audio'));\n attr.duration = data.duration > 0 ? (data.duration | 0) : undefined;\n attr.preview = data.preview;\n attr.loading = 'lazy';\n }\n el = AudioPlayer;\n // Audio element cannot have content.\n values = null;\n break;\n case 'BR':\n values = null;\n break;\n case 'EX':\n // Ignore.\n break;\n case 'HL':\n // Highlighted text. Assign class name.\n attr.className = 'highlight';\n break;\n case 'HD':\n el = null;\n values = null;\n break;\n case 'IM':\n // Additional processing for images\n el = handleImageData.call(this, el, data, attr);\n // Image element cannot have content.\n values = null;\n break;\n case 'BN':\n // Button\n attr.onClick = this.onFormButtonClick;\n let inner = React.Children.map(values, (child) => {\n return typeof child == 'string' ? child : undefined;\n });\n if (!inner || inner.length == 0) {\n inner = [attr.name]\n }\n // Get text which will be sent back when the button is clicked.\n attr['data-title'] = inner.join('');\n break;\n case 'MN':\n // Mention\n attr.className = 'mention'\n if (data) {\n attr.className += ' ' + idToColorClass(data.val, false, true);\n }\n break;\n case 'FM':\n // Form\n attr.className = 'bot-form';\n break;\n case 'RW':\n // Form element formatting is dependent on element content.\n break;\n case 'QQ':\n // Quote/citation.\n attr.className = 'reply-quote'\n attr.onClick = this.onQuoteClick;\n break;\n case 'VC':\n el = CallMessage;\n // Video call messages do not have content.\n values = null;\n if (data) {\n attr.callState = data.state;\n attr.incoming = data.incoming;\n attr.duration = data.duration;\n }\n break;\n case 'VD':\n // Additional processing for videos.\n el = handleVideoData.call(this, el, data, attr);\n // Video element cannot have content.\n values = null;\n break;\n default:\n if (!el) {\n // Unknown element.\n el = React.Fragment;\n attr = {key: key};\n // Generate comment for unknown element.\n let body = values;\n if (!Array.isArray(values) || !values.join('').trim()) {\n body = [{this.formatMessage(messages.drafty_unknown)} ];\n }\n values = [extension , ' '].concat(body);\n }\n break;\n }\n if (!el) {\n return values;\n }\n return React.createElement(el, attr, values);\n}\n\n// Additional processing of image data.\nfunction handleImageData(el, data, attr) {\n if (!data) {\n attr.src = 'img/broken_image.png';\n attr.style = {\n width: IMAGE_THUMBNAIL_DIM + 'px',\n height: IMAGE_THUMBNAIL_DIM + 'px',\n };\n return el;\n }\n\n attr.className = 'inline-image';\n const dim = fitImageSize(data.width, data.height,\n this.viewportWidth > 0 ? Math.min(this.viewportWidth - REM_SIZE * 6.5, REM_SIZE * 34.5) :\n REM_SIZE * 34.5, REM_SIZE * 24, false) ||\n {dstWidth: BROKEN_IMAGE_SIZE, dstHeight: BROKEN_IMAGE_SIZE};\n attr.style = {\n width: dim.dstWidth + 'px',\n height: dim.dstHeight + 'px',\n // Looks like a Chrome bug: broken image does not respect 'width' and 'height'.\n minWidth: dim.dstWidth + 'px',\n minHeight: dim.dstHeight + 'px'\n };\n if (!Drafty.isProcessing(data)) {\n attr.src = this.authorizeURL(sanitizeUrlForMime(attr.src, 'image'));\n attr.alt = data.name;\n if (attr.src) {\n if (Math.max(data.width || 0, data.height || 0) > IMAGE_THUMBNAIL_DIM) {\n // Allow previews for large enough images.\n attr.onClick = this.onImagePreview;\n attr.className += ' image-clickable';\n }\n attr.loading = 'lazy';\n } else {\n attr.src = null;\n }\n } else {\n // Use custom element instead of .\n el = UploadingImage;\n }\n\n return el;\n}\n\n// Additional processing of image data.\nfunction handleVideoData(el, data, attr) {\n if (!data) {\n attr.src = 'img/broken_video.png';\n attr.style = {\n width: IMAGE_THUMBNAIL_DIM + 'px',\n height: IMAGE_THUMBNAIL_DIM + 'px',\n };\n return el;\n }\n attr.className = 'inline-image';\n const dim = fitImageSize(data.width, data.height,\n this.viewportWidth > 0 ? Math.min(this.viewportWidth - REM_SIZE * 6.5, REM_SIZE * 34.5) :\n REM_SIZE * 34.5, REM_SIZE * 24, false) ||\n {dstWidth: NO_DIMENSIONS_VIDEO, dstHeight: NO_DIMENSIONS_VIDEO};\n attr.style = {\n width: dim.dstWidth + 'px',\n height: dim.dstHeight + 'px',\n // Looks like a Chrome bug: broken image does not respect 'width' and 'height'.\n minWidth: dim.dstWidth + 'px',\n minHeight: dim.dstHeight + 'px'\n };\n if (!Drafty.isProcessing(data)) {\n attr.src = this.authorizeURL(sanitizeUrlForMime(attr.src, 'image'));\n attr.alt = data.name;\n if (data.ref || data.val) {\n attr.onClick = this.onVideoPreview;\n attr.loading = 'lazy';\n } else {\n attr.src = null;\n }\n el = InlineVideo;\n } else {\n // Use custom element instead of .\n el = UploadingImage;\n }\n\n return el;\n}\n\n// Converts Drafty object into a one-line preview. 'this' is set by the caller.\n// 'this' must contain:\n// formatMessage: this.props.intl.formatMessage\n// messages: formatjs messages defined with defineMessages.\nexport function previewFormatter(style, data, values, key) {\n if (!style) {\n // Unformatted.\n return values;\n }\n\n let el = Drafty.tagName(style);\n const attr = { key: key };\n switch (style) {\n case 'AU':\n // Voicemail as '[mic] 0:00'.\n el = React.Fragment;\n values = [mic , ' ', secondsToTime(data.duration/1000)];\n break;\n case 'BR':\n // Replace new line with a space.\n el = React.Fragment;\n values = [' '];\n break;\n case 'HL':\n // Make highlight less prominent in preview.\n attr.className = 'highlight preview';\n break;\n case 'LN':\n case 'MN':\n // Disable links in previews.\n el = 'span';\n break;\n case 'IM':\n // Replace image with '[icon] Image'.\n el = React.Fragment;\n values = [photo , ' ', this.formatMessage(messages.drafty_image)];\n break;\n case 'BN':\n el = 'span';\n attr.className = 'flat-button faux';\n break;\n case 'FM':\n el = React.Fragment;\n values = [dashboard ,\n this.formatMessage(messages.drafty_form)].concat(' ', values || []);\n break;\n case 'RW':\n el = React.Fragment;\n break;\n case 'EX':\n if (data) {\n if (data.mime == 'application/json') {\n // Ignore JSON attachments: they are form response payloads.\n return null;\n }\n // Clear payload.\n delete data.val;\n delete data.ref;\n }\n el = React.Fragment;\n values = [attachment , ' ', this.formatMessage(messages.drafty_attachment)];\n break;\n case 'VC':\n el = CallStatus;\n if (data) {\n attr.callState = data.state;\n attr.incoming = data.incoming;\n attr.duration = data.duration;\n }\n values = null;\n break;\n case 'QQ':\n case 'HD':\n el = null;\n values = null;\n break;\n case 'VD':\n // Replace image with '[icon] Video'.\n el = React.Fragment;\n values = [play_circle_outline , ' ', this.formatMessage(messages.drafty_video)];\n break;\n default:\n if (!el) {\n // Unknown element.\n el = React.Fragment;\n values = [extension , ' ', this.formatMessage(messages.drafty_unknown)];\n }\n break;\n }\n if (!el) {\n return values;\n }\n return React.createElement(el, attr, values);\n};\n\n// Converts Drafty object into a quoted reply; 'this' is set by the caller.\nfunction inlineImageAttr(attr, data) {\n attr.style = {\n width: IMAGE_THUMBNAIL_DIM + 'px',\n height: IMAGE_THUMBNAIL_DIM + 'px',\n maxWidth: IMAGE_THUMBNAIL_DIM + 'px',\n maxHeight: IMAGE_THUMBNAIL_DIM + 'px',\n }\n attr.className = 'inline-image';\n attr.alt = this.formatMessage(messages.drafty_image);\n if (!data) {\n attr.src = 'img/broken_image.png';\n } else {\n attr.src = attr.src || 'img/broken_image.png';\n }\n attr.title = attr.alt;\n return attr;\n}\n\n// Converts Drafty object into a quoted reply; 'this' is set by the caller.\nfunction inlineVideoAttr(attr, data) {\n const dim = fitImageSize(data.width, data.height, VIDEO_THUMBNAIL_WIDTH, IMAGE_THUMBNAIL_DIM);\n attr.style = {\n width: dim.width + 'px',\n height: dim.height + 'px',\n maxWidth: VIDEO_THUMBNAIL_WIDTH + 'px',\n maxHeight: IMAGE_THUMBNAIL_DIM + 'px',\n }\n attr.className = 'inline-image';\n attr.alt = this.formatMessage(messages.drafty_video);\n attr.title = attr.alt;\n if (!data) {\n attr.src = 'img/broken_video.png';\n } else {\n attr.src = attr.src || 'img/broken_video.png';\n }\n return attr;\n}\n\n// Displays a portion of Drafty within 'QQ' quotes. 'this' is set by the caller.\n// 'this' must contain:\n// formatMessage: this.props.intl.formatMessage\n// messages: formatjs messages defined with defineMessages.\n// authorizeURL: this.props.tinode.authorizeURL\n// onQuoteClick: this.handleQuoteClick (optional)\nfunction quoteFormatter(style, data, values, key) {\n if (['BR', 'EX', 'IM', 'MN', 'VD'].includes(style)) {\n let el = Drafty.tagName(style);\n let attr = Drafty.attrValue(style, data) || {};\n attr.key = key;\n switch(style) {\n case 'BR':\n values = null;\n break;\n case 'IM':\n attr = inlineImageAttr.call(this, attr, data);\n values = [React.createElement('img', attr, null), ' ', attr.alt];\n el = React.Fragment;\n // Fragment attributes.\n attr = {key: key};\n break;\n case 'VD':\n attr = inlineVideoAttr.call(this, attr, data);\n values = [React.createElement('img', attr, null), ' ', attr.alt];\n el = React.Fragment;\n // Fragment attributes.\n attr = {key: key};\n break;\n case 'MN':\n el = 'span';\n attr.className = 'mention'\n if (data) {\n attr.className += ' ' + idToColorClass(data.val, false, true);\n }\n break;\n case 'EX':\n let fname;\n if (data) {\n if (data.mime == 'application/json') {\n // Ignore JSON attachments: they are form response payloads.\n return null;\n }\n fname = data.name;\n // Clear payload.\n delete data.val;\n delete data.ref;\n }\n el = React.Fragment;\n values = [attachment ,\n shortenFileName(fname, 16) || this.formatMessage(messages.drafty_attachment)];\n break;\n }\n return React.createElement(el, attr, values);\n }\n return previewFormatter.call(this, style, data, values, key);\n}\n\n// Create image thumbnail suitable for inclusion in a quote.\nfunction quoteImageOrVideo(data, isVideo) {\n let promise;\n let bits, ref, mime;\n if (isVideo) {\n bits = data.preview;\n mime = data.premime || 'image/jpeg';\n ref = data.preref;\n } else {\n bits = data.val;\n mime = data.mime;\n ref = data.ref;\n }\n // Get the blob from the image data.\n if (bits) {\n const blob = base64ToBlob(bits, mime);\n if (!blob) {\n throw new Error(\"Invalid image\");\n }\n promise = Promise.resolve(blob);\n } else if (ref) {\n promise = fetch(this.authorizeURL(sanitizeUrlForMime(ref, 'image')))\n .then(evt => {\n if (evt.ok) {\n return evt.blob();\n } else {\n throw new Error(`Image fetch unsuccessful: ${evt.status} ${evt.statusText}`);\n }\n });\n } else {\n throw new Error(\"Missing image data\");\n }\n\n // Scale the blob.\n return promise\n .then(blob => {\n // If it's an image, cut the square from the center of the image and shrink it.\n // If it's a video, allow it to be rectantular.\n return imageScaled(blob, isVideo ? VIDEO_THUMBNAIL_WIDTH : IMAGE_THUMBNAIL_DIM, IMAGE_THUMBNAIL_DIM, -1, !isVideo)\n }).then(scaled => {\n if (isVideo) {\n data.premime = scaled.mime;\n } else {\n data.mime = scaled.mime;\n }\n data.size = scaled.blob.size;\n data.width = scaled.width;\n data.height = scaled.height;\n delete data.ref;\n delete data.preref;\n // Keeping the original file name, if provided: ex.data.name;\n\n data.src = URL.createObjectURL(scaled.blob);\n return blobToBase64(scaled.blob);\n }).then(b64 => {\n if (isVideo) {\n data.preview = b64.bits;\n } else {\n data.val = b64.bits;\n }\n return data;\n }).catch(err => {\n delete data.val;\n delete data.preview;\n delete data.src;\n data.width = IMAGE_THUMBNAIL_DIM;\n data.height = IMAGE_THUMBNAIL_DIM;\n // Rethrow.\n throw err;\n });\n}\n\n// Create a preview of a reply.\nexport function replyFormatter(style, data, values, key, stack) {\n if (style == 'IM' || style == 'VD') {\n const isImage = style == 'IM';\n const attr = isImage ? inlineImageAttr.call(this, {key: key}, data) :\n inlineVideoAttr.call(this, {key: key}, data);\n\n let loadedPromise;\n try {\n loadedPromise = cancelablePromise(quoteImageOrVideo.call(this, data, style == 'VD'));\n } catch (error) {\n console.warn(\"Failed to quote image:\", error.message);\n loadedPromise = cancelablePromise(error);\n }\n attr.whenDone = loadedPromise;\n values = [React.createElement(LazyImage, attr, null), ' ', attr.alt];\n return React.createElement(React.Fragment, {key: key}, values);\n } else if (style == 'QQ') {\n if (stack.includes('QQ')) {\n // Quote inside quote when forwarding a message.\n return React.createElement('span', {key: key},\n [format_quote , ' ']);\n }\n\n const attr = Drafty.attrValue('QQ', data) || {};\n attr.key = key;\n attr.className = 'reply-quote'\n return React.createElement(Drafty.tagName('QQ'), attr, values);\n }\n return quoteFormatter.call(this, style, data, values, key);\n}\n","import { KNOWN_HOSTS, DEFAULT_HOST } from '../config.js';\n\n// Detect server address from the URL\nexport function detectServerAddress() {\n let host = DEFAULT_HOST;\n if (typeof window.location == 'object') {\n if (window.location.protocol == 'file:' || window.location.hostname == 'localhost') {\n host = KNOWN_HOSTS.local;\n } else if (window.location.hostname) {\n host = window.location.hostname + (window.location.port ? ':' + window.location.port : '');\n }\n }\n return host;\n}\n\n// Detect if the page is served over HTTPS.\nexport function isSecureConnection() {\n if (typeof window.location == 'object') {\n return window.location.protocol == 'https:';\n }\n return false;\n}\n\nexport function isLocalHost() {\n if (typeof window.location == 'object') {\n return window.location.hostname == 'localhost';\n }\n return false;\n}\n","// Helper functions for storing values in localStorage.\n// By default localStorage can store only strings, not objects or other types.\n\nexport default class LocalStorageUtil {\n // Replace old object with the new one.\n static setObject(key, value) {\n localStorage.setItem(key, JSON.stringify(value));\n }\n\n // Get stored object.\n static getObject(key) {\n const value = localStorage.getItem(key);\n return value && JSON.parse(value);\n }\n\n // Partially or wholly update stored object.\n static updateObject(key, value) {\n const oldVal = this.getObject(key);\n this.setObject(key, Object.assign(oldVal || {}, value));\n }\n\n // Just a wrapper.\n static removeItem(key) {\n localStorage.removeItem(key);\n }\n}\n","// Utility class for hash navigation.\n\nexport default class HashNavigation {\n // Parse hash as in http://www.example.com/path#hash as if it were\n // path and arguments.\n static parseUrlHash(hash) {\n // Split path from args, path -> parts[0], args->path[1]\n const parts = hash.split('?', 2);\n const params = {};\n let path = [];\n if (parts[0]) {\n path = parts[0].replace('#', '').split('/');\n }\n if (parts[1]) {\n parts[1].split('&').forEach((arg) => {\n // Can't use split() because the value may contain '='.\n const eq = arg.indexOf('=');\n if (eq > 0) {\n params[arg.slice(0, eq)] = decodeURIComponent(arg.slice(eq + 1));\n }\n });\n }\n return {path: path, params: params};\n }\n\n static navigateTo(url) {\n window.location.hash = url;\n }\n\n static composeUrlHash(path, params) {\n let url = path.join('/');\n const args = [];\n for (const key in params) {\n if (params.hasOwnProperty(key)) {\n args.push(key + '=' + encodeURIComponent(params[key]));\n }\n }\n if (args.length > 0) {\n url += '?' + args.join('&');\n }\n return url;\n }\n\n static addUrlParam(hash, key, value) {\n const parsed = HashNavigation.parseUrlHash(hash);\n parsed.params[key] = value;\n return HashNavigation.composeUrlHash(parsed.path, parsed.params);\n }\n\n static removeUrlParam(hash, key) {\n const parsed = HashNavigation.parseUrlHash(hash);\n delete parsed.params[key];\n return HashNavigation.composeUrlHash(parsed.path, parsed.params);\n }\n\n static setUrlSidePanel(hash, sidepanel) {\n const parsed = HashNavigation.parseUrlHash(hash);\n parsed.path[0] = sidepanel;\n return HashNavigation.composeUrlHash(parsed.path, parsed.params);\n }\n\n static setUrlInfoPanel(hash, infopanel) {\n const parsed = HashNavigation.parseUrlHash(hash);\n if (infopanel) {\n parsed.params.info = infopanel;\n } else {\n delete parsed.params.info;\n }\n return HashNavigation.composeUrlHash(parsed.path, parsed.params);\n }\n\n static setUrlTopic(hash, topic) {\n const parsed = HashNavigation.parseUrlHash(hash);\n parsed.path[1] = topic;\n // Close InfoView on topic change.\n delete parsed.params.info;\n return HashNavigation.composeUrlHash(parsed.path, parsed.params);\n }\n}\n","// Short representation of time in the past.\nexport function shortDateFormat(then, locale) {\n locale = locale || window.navigator.userLanguage || window.navigator.language;\n const now = new Date();\n if (then.getFullYear() == now.getFullYear()) {\n // Same year.\n if (then.getMonth() == now.getMonth() && then.getDate() == now.getDate()) {\n // Same month and day, show time only.\n return then.toLocaleTimeString(locale, {hour12: false, hour: '2-digit', minute: '2-digit'});\n }\n // Different month and/or day, show month day, time.\n return then.toLocaleDateString(locale,\n {hour12: false, month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit'});\n }\n // Different year: just show the date.\n return then.toLocaleDateString(locale, {year: 'numeric', month: 'short', day: 'numeric'});\n}\n\n// Representation a date relative to now.\nexport function relativeDateFormat(then, locale) {\n locale = locale || window.navigator.userLanguage || window.navigator.language;\n const now = new Date();\n const thenDays = Math.floor((then.getTime() - then.getTimezoneOffset() * 60_000) / 86_400_000);\n const nowDays = Math.floor((now.getTime() - now.getTimezoneOffset() * 60_000) / 86_400_000);\n const diff = thenDays - nowDays;\n if (Math.abs(diff) < 2) {\n // Today or yesterday.\n return new Intl.RelativeTimeFormat(locale, { numeric: 'auto' }).format(diff, 'day')\n }\n // More than two days: just show the date.\n return new Intl.DateTimeFormat(locale).format(then);\n}\n\n// Convert seconds to [hours:]minutes:seconds, i.e. 156 sec -> 2:36, 3756 sec -> 1:02:36.\n// If fixedMins is true, then minutes are represented by at least two digits.\nexport function secondsToTime(seconds, fixedMin) {\n if (typeof seconds != 'number') {\n return '';\n }\n\n let min = (Math.floor(seconds / 60) | 0) % 60;\n let hours = Math.floor(seconds / 36000) | 0;\n\n if (fixedMin || hours > 0) {\n min = min < 10 ? `0${min}` : min;\n }\n let sec = (seconds | 0) % 60;\n sec = sec < 10 ? `0${sec}` : sec;\n if (hours == 0) {\n return `${min}:${sec}`;\n }\n return `${hours}:${min}:${sec}`;\n}\n\n// Convert a number of bytes to human-readable format.\nexport function bytesToHumanSize(bytes) {\n if (!bytes || bytes == 0) {\n return '0 Bytes';\n }\n\n const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB'];\n const bucket = Math.min(Math.floor(Math.log2(bytes) / 10) | 0, sizes.length-1);\n const count = bytes / Math.pow(1024, bucket);\n const round = bucket > 0 ? (count < 3 ? 2 : (count < 30 ? 1 : 0)) : 0;\n return count.toFixed(round) + ' ' + sizes[bucket];\n}\n\n// Shorten a file name to be under maxLength by clipping out the middle.\nexport function shortenFileName(filename, maxLength) {\n if (typeof filename != 'string') {\n return filename;\n }\n return filename.length > maxLength ?\n filename.slice(0, maxLength/2 - 1) + '…' + filename.slice(1 - maxLength/2) : filename;\n}\n\n// Get 32 bit integer hash value for a string. Ideally it should produce the same value\n// as Java's String#hash().\nfunction stringToColorHash(value) {\n let hash = 0;\n value = '' + value;\n for (let i = 0; i < value.length; i++) {\n hash = ((hash << 5) - hash) + value.charCodeAt(i);\n hash = hash & hash; // Convert to 32bit integer\n }\n return hash;\n}\n\n// User avatar letter color id.\nexport function letterTileColorId(userId) {\n return Math.abs(stringToColorHash(userId)) % 16;\n}\n\n// Converts user or topic ID to a CSS color class. Ideally it should produce the same color value as Java version.\n// params:\n// - {string} id: user or topic ID\n// - {boolean} light: light or dark version of the color.\n// - {boolean} fg: foreground (text) or background color.\nexport function idToColorClass(id, light, fg) {\n return (light ? 'lt-' : 'dk-') + (fg ? 'fg-' : 'bg-') + letterTileColorId(id);\n}\n\n// Takes ISO Alpha-2 country code, like 'US' and converts it to a flag emoji.\nexport function flagEmoji(countryCode) {\n const codePoints = countryCode\n .toUpperCase()\n .split('')\n .map(char => 0x1F1A5 + char.charCodeAt());\n return String.fromCodePoint(...codePoints);\n}\n","// Odds and ends\n\nimport { Tinode } from 'tinode-sdk';\n\n// Make shortcut icon appear with a green dot + show unread count in title.\nexport function updateFavicon(count) {\n const oldIcon = document.getElementById('shortcut-icon');\n const head = document.head || document.getElementsByTagName('head')[0];\n const newIcon = document.createElement('link');\n newIcon.type = 'image/png';\n newIcon.id = 'shortcut-icon';\n newIcon.rel = 'shortcut icon';\n newIcon.href = 'img/logo32x32' + (count > 0 ? 'a' : '') + '.png';\n if (oldIcon) {\n head.removeChild(oldIcon);\n }\n head.appendChild(newIcon);\n\n document.title = (count > 0 ? '('+count+') ' : '') + 'Tinode';\n}\n\n// Create theCard which represents user's or topic's \"public\" info.\nexport function theCard(fn, imageUrl, imageMimeType, note) {\n let card = null;\n fn = fn && fn.trim();\n note = note && note.trim();\n\n if (fn) {\n card = {\n fn: fn\n };\n }\n\n if (typeof note == 'string') {\n card = card || {};\n card.note = note ? note : Tinode.DEL_CHAR;\n }\n\n if (imageUrl) {\n card = card || {};\n let mimeType = imageMimeType;\n // Is this a data URL \"data:[][;base64],\"?\n const matches = /^data:(image\\/[-a-z0-9+.]+)?(;base64)?,/i.exec(imageUrl);\n if (matches) {\n mimeType = matches[1];\n card.photo = {\n data: imageUrl.substring(imageUrl.indexOf(',') + 1),\n ref: Tinode.DEL_CHAR\n };\n } else {\n card.photo = {\n data: Tinode.DEL_CHAR,\n ref: imageUrl\n };\n }\n card.photo.type = (mimeType || 'image/jpeg').substring('image/'.length);\n }\n\n return card;\n}\n\n// Deep-shallow compare two arrays: shallow compare each element.\nexport function arrayEqual(a, b) {\n if (a === b) {\n return true;\n }\n\n if (!Array.isArray(a) || !Array.isArray(b)) {\n return false;\n }\n\n // Compare lengths first.\n if (a.length != b.length) {\n return false;\n }\n // Order of elements is ignored.\n a.sort();\n b.sort();\n for (let i = 0, l = a.length; i < l; i++) {\n if (a[i] !== b[i]) {\n return false;\n }\n }\n return true;\n}\n\n// Checks (loosely) if the given string is a phone. If so, returns the phone number in a format\n// as close to E.164 as possible.\nexport function asPhone(val) {\n val = val.trim();\n if (/^(?:\\+?(\\d{1,3}))?[- (.]*(\\d{3})[- ).]*(\\d{3})[- .]*(\\d{2})[- .]*(\\d{2})?$/.test(val)) {\n return val.replace(/[- ().]*/, '');\n }\n return null;\n}\n\n// Checks (loosely) if the given string is an email. If so returns the email.\nexport function asEmail(val) {\n val = val.trim();\n if (/^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\\.[a-zA-Z0-9-.]+$/.test(val)) {\n return val;\n }\n return null;\n}\n\n// Checks if URL is a relative url, i.e. has no 'scheme://', including the case of missing scheme '//'.\n// The scheme is expected to be RFC-compliant, e.g. [a-z][a-z0-9+.-]*\n// example.html - ok\n// https:example.com - not ok.\n// http:/example.com - not ok.\n// ' ↲ https://example.com' - not ok. (↲ means carriage return)\nexport function isUrlRelative(url) {\n return url && !/^\\s*([a-z][a-z0-9+.-]*:|\\/\\/)/im.test(url);\n}\n\n// Ensure URL does not present an XSS risk. Optional allowedSchemes may contain an array of\n// strings with permitted URL schemes, such as ['ftp', 'ftps']; otherwise accept http and https only.\nexport function sanitizeUrl(url, allowedSchemes) {\n if (typeof url != 'string') {\n return url;\n }\n\n // Strip control characters and whitespace. They are not valid URL characters anyway.\n url = url.replace(/[^\\x20-\\x7E]/gmi, '').trim();\n\n // Relative URLs are safe.\n // Relative URL does not start with ':', abcd123: or '//'.\n if (!/^([a-z][a-z0-9+.-]*:|\\/\\/)/i.test(url)) {\n return url;\n }\n\n // Blob URLs are safe.\n if (/^blob:http/.test(url)) {\n return url;\n }\n\n // Absolute URL. Accept only safe schemes, or no scheme.\n const schemes = Array.isArray(allowedSchemes) ? allowedSchemes.join('|') : 'http|https';\n const re = new RegExp('^((' + schemes + '):|//)', 'i');\n if (!re.test(url)) {\n return null;\n }\n\n return url;\n}\n\n// Ensure URL is suitable as a source like field: the URL must be a relative URL or\n// have http:, https:, blob: or data: scheme.\n// In case of data: scheme, the URL must must be of the right MIME type such as 'data:{mimeMajor}/XXXX;base64,'.\nexport function sanitizeUrlForMime(url, mimeMajor) {\n if (!url) {\n return null;\n }\n\n const sanitizedUrl = sanitizeUrl(url);\n if (sanitizedUrl) {\n return sanitizedUrl;\n }\n\n // Is this a data: URL of the appropriate mime type?\n const re = new RegExp(`data:${mimeMajor}\\/[a-z0-9.-]+;base64,`, 'i');\n if (re.test(url.trim())) {\n return url;\n }\n\n return null;\n}\n\n// Given message's received status, return name and color of a delivery indicator icon.\nexport function deliveryMarker(received) {\n switch (received) {\n case Tinode.MESSAGE_STATUS_SENDING:\n return { name: 'access_time' }; // watch face\n case Tinode.MESSAGE_STATUS_FAILED:\n return { name: 'warning', color: 'danger-color' }; // yellow icon /!\\\n case Tinode.MESSAGE_STATUS_SENT:\n return { name: 'done' }; // checkmark\n case Tinode.MESSAGE_STATUS_RECEIVED:\n return { name: 'done_all' }; // double checkmark\n case Tinode.MESSAGE_STATUS_READ:\n return { name: 'done_all', color: 'blue' }; // blue double checkmark\n }\n return null;\n}\n\n// Wraps a promise to make it cancelable.\n// The parameter can be either a promise or an error. If it's an error, the wrapped promise is\n// created in a rejected state.\nexport function cancelablePromise(promise) {\n let hasCanceled = false;\n\n const wrappedPromise = promise instanceof Error ?\n Promise.reject(promise) :\n new Promise((resolve, reject) => {\n promise.then(\n result => hasCanceled ? reject({isCanceled: true}) : resolve(result),\n error => hasCanceled ? reject({isCanceled: true}) : reject(error)\n );\n });\n\n return {\n promise: wrappedPromise,\n cancel() {\n hasCanceled = true;\n },\n };\n};\n\n// Clips string to the specified length.\nexport function clipStr(str, length) {\n return str && str.substring(0, length);\n}\n","// This is a generated file. Don't edit.\n\nexport const PACKAGE_VERSION = \"0.21.0-rc2\";\n","// Edit account parameters.\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport CheckBox from '../widgets/checkbox.jsx';\n\nexport default class EditAccountView extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.handleCheckboxClick = this.handleCheckboxClick.bind(this);\n }\n\n handleCheckboxClick(what, checked) {\n if (what == 'sound') {\n this.props.onToggleMessageSounds(checked);\n } else if (what == 'alert') {\n this.props.onTogglePushNotifications(checked);\n } else if (what == 'incognito') {\n this.props.onToggleIncognitoMode(checked);\n }\n }\n\n render() {\n return (\n \n
\n \n \n \n \n
\n
\n \n {this.props.desktopAlertsEnabled ?\n \n :\n \n }\n \n \n
\n
\n \n \n \n \n
\n
\n );\n }\n};\n","// Edit account parameters.\nimport React from 'react';\nimport { FormattedMessage, defineMessages, injectIntl } from 'react-intl';\n\nimport InPlaceEdit from '../widgets/in-place-edit.jsx';\nimport PermissionsEditor from '../widgets/permissions-editor.jsx';\n\nconst messages = defineMessages({\n delete_account: {\n id: 'delete_account',\n defaultMessage: 'Delete account',\n description: 'Title for delete account warning'\n },\n delete_account_warning: {\n id: 'delete_account_warning',\n defaultMessage: 'Are you sure you want to delete your account? It cannot be undone.',\n description: 'Warning message when deleting an account'\n }\n});\n\nclass AccSecurityView extends React.Component {\n constructor(props) {\n super(props);\n\n const me = this.props.tinode.getMeTopic();\n let blockedCount = 0;\n me.contacts((c) => {\n if (c.acs && !c.acs.isJoiner()) {\n blockedCount ++;\n }\n });\n const defacs = me.getDefaultAccess();\n this.state = {\n auth: defacs ? defacs.auth : null,\n anon: defacs ? defacs.anon : null,\n showPermissionEditorFor: undefined,\n blockedCount: blockedCount,\n };\n\n this.handlePasswordUpdate = this.handlePasswordUpdate.bind(this);\n this.handleLaunchPermissionsEditor = this.handleLaunchPermissionsEditor.bind(this);\n this.handleHidePermissionsEditor = this.handleHidePermissionsEditor.bind(this);\n this.handlePermissionsChanged = this.handlePermissionsChanged.bind(this);\n this.handleDeleteAccount = this.handleDeleteAccount.bind(this);\n }\n\n handlePasswordUpdate(pwd) {\n this.setState({password: pwd});\n this.props.onUpdatePassword(pwd);\n }\n\n handleLaunchPermissionsEditor(which) {\n this.setState({\n showPermissionEditorFor: which,\n editedPermissions: this.state[which]\n });\n }\n\n handleHidePermissionsEditor() {\n this.setState({showPermissionEditorFor: undefined});\n }\n\n handlePermissionsChanged(perm) {\n let defacs = {};\n defacs[this.state.showPermissionEditorFor] = perm;\n this.props.onUpdateAccountDesc('me', undefined, undefined, defacs);\n\n let newState = {showPermissionEditorFor: undefined};\n newState[this.state.showPermissionEditorFor] = perm;\n this.setState(newState);\n }\n\n handleDeleteAccount(e) {\n e.preventDefault();\n const {formatMessage} = this.props.intl;\n this.props.onShowAlert(\n formatMessage(messages.delete_account), // title\n formatMessage(messages.delete_account_warning), // content\n (_ => this.props.onDeleteAccount()), // onConfirm\n null, // use default text \"OK\"\n true, // Show Reject button\n null // use default text \"Cancel\"\n );\n }\n\n render() {\n return (\n <>{this.state.showPermissionEditorFor ?\n \n :\n \n
\n
\n \n \n
\n {\n (password_unchanged) => \n } \n
\n
\n
\n
\n
\n
\n
\n \n \n \n
\n
\n
Auth: {this.state.auth}
\n
Anon: {this.state.anon}
\n
\n
\n {this.state.blockedCount > 0 ?\n <>\n
\n
\n >\n : null }\n
\n }>\n );\n }\n};\n\nexport default injectIntl(AccSecurityView);\n","// Edit account parameters.\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport { Tinode } from 'tinode-sdk';\n\nimport { APP_NAME, LINK_CONTACT_US, LINK_PRIVACY_POLICY, LINK_TERMS_OF_SERVICE } from '../config.js';\n\nexport default class AccSupportView extends React.PureComponent {\n render() {\n return (\n \n
\n
\n
\n
\n \n {APP_NAME}\n
\n
\n \n {Tinode.getLibrary()}\n
\n
\n \n {this.props.serverVersion}\n
\n
\n \n {this.props.serverAddress}\n
\n
\n
\n );\n }\n};\n","// Edit account parameters.\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\nimport { parsePhoneNumber } from 'libphonenumber-js/mobile';\n\nimport AvatarUpload from '../widgets/avatar-upload.jsx';\nimport BadgeList from '../widgets/badge-list.jsx';\n\nimport { makeImageUrl } from '../lib/blob-helpers.js';\nimport { MAX_TITLE_LENGTH, MAX_TOPIC_DESCRIPTION_LENGTH } from '../config.js';\nimport CredentialEdit from '../widgets/credential-edit.jsx';\n\nfunction _clip(str, length) {\n return str && str.substring(0, length);\n}\n\nexport default class AccountSettingsView extends React.Component {\n constructor(props) {\n super(props);\n\n const me = this.props.tinode.getMeTopic();\n this.state = {\n fullName: _clip(me.public ? me.public.fn : undefined, MAX_TITLE_LENGTH),\n description: _clip(me.public ? me.public.note : undefined, MAX_TOPIC_DESCRIPTION_LENGTH),\n avatar: makeImageUrl(me.public ? me.public.photo : null),\n credentials: me.getCredentials() || [],\n credEdit: undefined\n };\n\n this.handleEditCred = this.handleEditCred.bind(this);\n }\n\n handleEditCred(cred) {\n console.log(\"Start editing cred\", cred);\n this.setState({credEdit: cred});\n }\n\n render() {\n if (this.state.credEdit) {\n return (\n {this.setState({credEdit: undefined}); console.log(\"Credential editing done\", cred)}}\n onCancel={_ => this.setState({credEdit: undefined})} />\n );\n }\n\n const credentials = [];\n this.state.credentials.forEach((cred, idx) => {\n if (!['email', 'tel'].includes(cred.meth)) {\n // Skip unknown methods.\n return ;\n }\n\n let val = cred.val\n if (cred.meth == 'tel') {\n const number = parsePhoneNumber(cred.val);\n val = number ? number.formatInternational() : cred.val;\n }\n\n credentials.push(\n \n {e.preventDefault(); this.handleEditCred(cred)}}>{val} \n {cred.done ? null : pending } \n
);\n });\n if (credentials.length > 0) {\n // Add title as the first element.\n credentials.unshift(\n \n \n );\n }\n\n return (\n \n );\n }\n};\n","/* ContactsView holds all contacts-related stuff */\nimport React from 'react';\nimport { FormattedMessage, defineMessages } from 'react-intl';\n\nimport ContactList from '../widgets/contact-list.jsx';\n\nimport { updateFavicon } from '../lib/utils.js';\n\nconst messages = defineMessages({\n archived_contacts_title: {\n id: \"archived_contacts\",\n defaultMessage: \"Archived contacts ({count})\",\n description: \"Label for archived chats\"\n }\n});\n\nexport default class ContactsView extends React.Component {\n constructor(props) {\n super(props);\n\n this.handleAction = this.handleAction.bind(this);\n\n this.state = ContactsView.deriveStateFromProps(props);\n }\n\n static deriveStateFromProps(props) {\n const contacts = [];\n let unreadThreads = 0;\n let archivedCount = 0;\n props.chatList.map((c) => {\n const blocked = c.acs && !c.acs.isJoiner();\n // Show only blocked contacts only when props.blocked == true.\n if (blocked && props.blocked) {\n contacts.push(c);\n }\n if (blocked || props.blocked) {\n return;\n }\n\n if (c.private && c.private.arch) {\n if (props.archive) {\n contacts.push(c);\n } else {\n archivedCount ++;\n }\n } else if (!props.archive) {\n contacts.push(c);\n unreadThreads += c.unread > 0 ? 1 : 0;\n }\n });\n\n contacts.sort((a, b) => {\n return (b.touched || 0) - (a.touched || 0);\n });\n\n if (archivedCount > 0) {\n contacts.push({\n action: 'archive',\n title: messages.archived_contacts_title,\n values: {count: archivedCount}\n });\n }\n\n return {\n contactList: contacts,\n unreadThreads: unreadThreads\n };\n }\n\n componentDidUpdate(prevProps, prevState) {\n if (prevProps.chatList != this.props.chatList ||\n prevProps.archive != this.props.archive ||\n prevProps.blocked != this.props.blocked) {\n const newState = ContactsView.deriveStateFromProps(this.props);\n this.setState(newState);\n if (newState.unreadThreads != prevState.unreadThreads) {\n updateFavicon(newState.unreadThreads);\n }\n }\n }\n\n handleAction(action_ignored) {\n this.props.onShowArchive();\n }\n\n render() {\n return (\n ¯∖_(ツ)_/¯\"\n description=\"HTML message shown in ContactList when no contacts are found\">{\n (no_contacts) => \n }
\n );\n }\n};\n","// Account registration.\nimport React, { Suspense } from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport AvatarCrop from '../widgets/avatar-crop.jsx';\nimport AvatarUpload from '../widgets/avatar-upload.jsx';\nimport CheckBox from '../widgets/checkbox.jsx';\nconst PhoneEdit = React.lazy(_ => import('../widgets/phone-edit.jsx'));\nimport VisiblePassword from '../widgets/visible-password.jsx';\n\nimport LocalStorageUtil from '../lib/local-storage.js';\nimport { imageScaled, blobToBase64, makeImageUrl } from '../lib/blob-helpers.js';\nimport { theCard } from '../lib/utils.js';\n\nimport { AVATAR_SIZE, MAX_AVATAR_BYTES, MAX_EXTERN_ATTACHMENT_SIZE,\n MAX_TITLE_LENGTH } from '../config.js';\n\nexport default class CreateAccountView extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.state = {\n login: '',\n password: '',\n meth: '',\n email: '',\n tel: '',\n fn: '', // full/formatted name\n imageUrl: null,\n uploadUrl: null,\n newAvatar: null,\n newAvatarMime: null,\n buttonDisabled: false,\n saveToken: LocalStorageUtil.getObject('keep-logged-in')\n };\n\n this.handleLoginChange = this.handleLoginChange.bind(this);\n this.handlePasswordChange = this.handlePasswordChange.bind(this);\n this.handleEmailChange = this.handleEmailChange.bind(this);\n this.handlePhoneChange = this.handlePhoneChange.bind(this);\n this.handleFnChange = this.handleFnChange.bind(this);\n this.handleImageChanged = this.handleImageChanged.bind(this);\n this.handleToggleSaveToken = this.handleToggleSaveToken.bind(this);\n this.handleAvatarCropped = this.handleAvatarCropped.bind(this);\n this.handleAvatarCropCancel = this.handleAvatarCropCancel.bind(this);\n this.uploadAvatar = this.uploadAvatar.bind(this);\n this.handleSubmit = this.handleSubmit.bind(this);\n\n // Connection will trigger change by changing the this.props.serverVersion.\n props.tinode.connect()\n .catch(err => {\n this.props.onError(err.message, 'err');\n });\n }\n\n handleLoginChange(e) {\n this.setState({login: e.target.value});\n }\n\n handlePasswordChange(password) {\n this.setState({password: password});\n }\n\n handleEmailChange(e) {\n this.setState({meth: 'email', email: e.target.value});\n }\n\n handlePhoneChange(number) {\n this.setState({meth: 'tel', tel: number});\n }\n\n handleFnChange(e) {\n this.setState({fn: e.target.value});\n }\n\n handleImageChanged(mime, img) {\n this.setState({newAvatar: img, newAvatarMime: mime});\n }\n\n handleToggleSaveToken() {\n LocalStorageUtil.setObject('keep-logged-in', !this.state.saveToken);\n this.setState({saveToken: !this.state.saveToken});\n }\n\n handleSubmit(e) {\n e.preventDefault();\n this.props.onCreateAccount(\n this.state.login.trim(),\n this.state.password.trim(),\n theCard(this.state.fn.trim().substring(0, MAX_TITLE_LENGTH), this.state.uploadUrl),\n {\n 'meth': this.state.meth,\n 'val': this.state.meth == 'email' ?\n this.state.email :\n this.state.meth == 'tel' ? this.state.tel : null\n }\n );\n }\n\n // AvatarCropView calls this method when the user has cropped the image.\n handleAvatarCropped(mime, blob, width, height) {\n const url = blob ? URL.createObjectURL(blob) : null;\n this.setState({avatar: url, newAvatar: null, newAvatarMime: null});\n if (blob) {\n this.uploadAvatar(mime, blob, width, height);\n }\n }\n\n handleAvatarCropCancel() {\n this.setState({newAvatar: null, newAvatarMime: null});\n }\n\n // Utility method for converting cropped avatar blob to bytes for sending inband or\n // for uploading it to the server out of band.\n uploadAvatar(mime, blob, width, height) {\n const readyToUpload = image => {\n let {mime, blob} = image;\n this.setState({imageUrl: URL.createObjectURL(blob), buttonDisabled: true});\n if (blob.size > MAX_AVATAR_BYTES) {\n // Too large to send inband - uploading out of band and sending as a link.\n const uploader = this.props.tinode.getLargeFileHelper();\n uploader.upload(blob, 'newacc')\n .then(url => this.setState({uploadUrl: url}))\n .catch(err => this.props.onError(err.message, 'err'))\n .finally(_ => this.setState({buttonDisabled: false}));\n } else {\n // Convert blob to base64-encoded bits.\n blobToBase64(blob)\n .then(b64 => this.setState({uploadUrl: makeImageUrl({data: b64.bits, type: mime})}))\n .finally(_ => this.setState({buttonDisabled: false}));\n }\n };\n\n if (width > AVATAR_SIZE || height > AVATAR_SIZE || width != height) {\n // Avatar is not square or too large even after cropping. Shrink it and make square.\n imageScaled(blob, AVATAR_SIZE, AVATAR_SIZE, MAX_EXTERN_ATTACHMENT_SIZE, true)\n .then(scaled => readyToUpload(scaled))\n .catch(err => this.props.onError(err.message, 'err'));\n } else {\n readyToUpload({mime: mime, blob: blob, width: width, height: height});\n }\n }\n\n render() {\n if (this.state.newAvatar) {\n return (\n \n );\n }\n\n let submitClasses = 'primary';\n if (this.props.disabled) {\n submitClasses += ' disabled';\n }\n\n return (\n \n );\n }\n};\n","// InfoView: panel with topic/user info.\nimport React from 'react';\nimport { FormattedMessage, defineMessages, injectIntl } from 'react-intl';\n\nimport { AccessMode, Tinode } from 'tinode-sdk';\n\nimport AvatarUpload from '../widgets/avatar-upload.jsx';\nimport BadgeList from '../widgets/badge-list.jsx';\nimport CheckBox from '../widgets/checkbox.jsx';\nimport ContactList from '../widgets/contact-list.jsx';\nimport ErrorPanel from '../widgets/error-panel.jsx';\nimport GroupManager from '../widgets/group-manager.jsx';\nimport MenuCancel from '../widgets/menu-cancel.jsx';\nimport PermissionsEditor from '../widgets/permissions-editor.jsx';\nimport TopicCommonView from './topic-common-view.jsx';\nimport TopicSecurity from '../widgets/topic-security.jsx';\n\nimport { MAX_TITLE_LENGTH, MAX_TOPIC_DESCRIPTION_LENGTH, NO_ACCESS_MODE } from '../config.js';\n\nimport { makeImageUrl } from '../lib/blob-helpers.js';\nimport { theCard, clipStr } from '../lib/utils.js';\n\nconst messages = defineMessages({\n info: {\n id: 'panel_title_info',\n description: 'Title for InfoView',\n defaultMessage: 'Info'\n },\n general: {\n id: 'panel_title_general',\n description: 'Title for TopicCommon.',\n defaultMessage: 'General'\n },\n security: {\n id: 'panel_title_security',\n description: 'Title for TopicSecirity and AccSecurity.',\n defaultMessage: 'Security'\n },\n members: {\n id: 'panel_title_members',\n description: 'Title for managing group members view.',\n defaultMessage: 'Members'\n },\n crop: {\n id: 'panel_title_crop',\n description: 'Title for AvatarCropView.',\n defaultMessage: 'Drag to Adjust'\n },\n perm_want: {\n id: 'requested_permissions',\n defaultMessage: 'Requested',\n description: 'Title for permissions'\n },\n perm_given: {\n id: 'granted_permissions',\n defaultMessage: 'Granted',\n description: 'Title for permissions'\n },\n perm_auth: {\n id: 'permissions_authenticated',\n defaultMessage: 'Authenticated',\n description: 'Title for editing default authenticated permissions'\n },\n perm_anon: {\n id: 'permissions_anonymous',\n defaultMessage: 'Anonymous',\n description: 'Title for editing default anonymous permissions'\n },\n perm_user: {\n id: 'permissions_user',\n defaultMessage: 'User\\'s Permissions',\n description: 'Title for editing user\\'s permissions'\n },\n edit_permissions: {\n id: 'menu_item_edit_permissions',\n defaultMessage: 'Edit permissions',\n description: 'Menu item [Edit permissions]'\n },\n});\n\nclass InfoView extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = {\n topic: null,\n owner: false,\n admin: false,\n sharer: false,\n deleter: false,\n muted: false,\n address: null,\n groupTopic: undefined,\n channel: undefined,\n fullName: undefined,\n description: undefined,\n avatar: null,\n private: null,\n selectedContact: null,\n access: null,\n modeGiven: null,\n modeWant: null,\n modeGiven2: null, // P2P topic, the other user mode given\n modeWant2: null, // P2P topic, the other user mode want\n auth: null,\n anon: null,\n contactList: [],\n trustedBadges: [],\n previousMetaDesc: undefined,\n previousSubsUpdated: undefined,\n };\n\n this.resetSubs = this.resetSubs.bind(this);\n this.resetDesc = this.resetDesc.bind(this);\n this.resetTags = this.resetTags.bind(this);\n this.onMetaDesc = this.onMetaDesc.bind(this);\n this.onSubsUpdated = this.onSubsUpdated.bind(this);\n this.handleImageChanged = this.handleImageChanged.bind(this);\n this.handleMuted = this.handleMuted.bind(this);\n this.handleUnarchive = this.handleUnarchive.bind(this);\n this.handlePermissionsChanged = this.handlePermissionsChanged.bind(this);\n this.handleLaunchPermissionsEditor = this.handleLaunchPermissionsEditor.bind(this);\n this.handleShowAddMembers = this.handleShowAddMembers.bind(this);\n this.handleMemberUpdateRequest = this.handleMemberUpdateRequest.bind(this);\n this.handleMemberSelected = this.handleMemberSelected.bind(this);\n this.handleContextMenu = this.handleContextMenu.bind(this);\n this.handleBackNavigate = this.handleBackNavigate.bind(this);\n }\n\n // No need to separately handle component mount.\n componentDidUpdate(props) {\n const topic = this.props.tinode.getTopic(props.topic);\n if (!topic) {\n return;\n }\n\n if (this.onMetaDesc != topic.onMetaDesc) {\n this.previousMetaDesc = topic.onMetaDesc;\n topic.onMetaDesc = this.onMetaDesc;\n\n this.previousSubsUpdated = topic.onSubsUpdated;\n topic.onSubsUpdated = this.onSubsUpdated;\n }\n\n if (this.state.topic != props.topic) {\n this.setState({topic: props.topic});\n this.resetDesc(topic, props);\n this.resetSubs(topic, props);\n this.resetTags(topic);\n }\n }\n\n componentWillUnmount() {\n const topic = this.props.tinode.getTopic(this.props.topic);\n if (!topic) {\n return;\n }\n this.setState({topic: null});\n topic.onMetaDesc = this.previousMetaDesc;\n topic.onSubsUpdated = this.previousSubsUpdated;\n }\n\n resetSubs(topic, props) {\n const newState = {contactList: []};\n if (topic.getType() == 'p2p') {\n // Fetch the other party in the p2p conversation.\n // Topic may not be ready yet, so check if user is found.\n const user2 = topic.subscriber(props.topic);\n if (user2) {\n newState.modeGiven2 = user2.acs.getGiven();\n newState.modeWant2 = user2.acs.getWant();\n } else {\n newState.modeGiven2 = NO_ACCESS_MODE;\n newState.modeWant2 = NO_ACCESS_MODE;\n }\n } else {\n topic.subscribers((sub) => {\n newState.contactList.push(sub);\n }, this);\n }\n\n this.setState(newState);\n }\n\n resetDesc(topic, props) {\n const defacs = topic.getDefaultAccess() || {};\n const acs = topic.getAccessMode();\n\n const badges = [];\n if (topic.trusted) {\n for (const [key, val] of Object.entries(topic.trusted)) {\n if (val) {\n badges.push(key);\n }\n }\n }\n\n this.setState({\n owner: acs && acs.isOwner(),\n admin: acs && acs.isAdmin(),\n sharer: acs && acs.isSharer(),\n deleter: acs && acs.isDeleter(),\n muted: acs && acs.isMuted(),\n\n fullName: clipStr(topic.public && topic.public.fn, MAX_TITLE_LENGTH),\n description: clipStr(topic.public && topic.public.note, MAX_TOPIC_DESCRIPTION_LENGTH),\n avatar: makeImageUrl(topic.public ? topic.public.photo : null),\n trustedBadges: badges,\n private: clipStr(topic.private && topic.private.comment, MAX_TITLE_LENGTH),\n archived: topic.isArchived(),\n address: topic.name,\n groupTopic: topic.isGroupType(),\n channel: topic.isChannelType() || topic.chan,\n access: acs ? acs.getMode() : undefined,\n modeGiven: acs ? acs.getGiven() : undefined,\n modeWant: acs ? acs.getWant() : undefined,\n auth: defacs.auth,\n anon: defacs.anon\n });\n }\n\n resetTags(topic) {\n if (topic.getType() != 'grp') {\n return;\n }\n\n const acs = topic.getAccessMode();\n if (acs && acs.isOwner()) {\n // Requesting tags: owner is editing the topic.\n topic.getMeta(topic.startMetaQuery().withTags().build());\n }\n }\n\n onMetaDesc(desc) {\n const topic = this.props.tinode.getTopic(this.props.topic);\n if (!topic) {\n return;\n }\n this.resetDesc(topic, this.props);\n\n if (this.previousMetaDesc && this.previousMetaDesc != this.onMetaDesc) {\n this.previousMetaDesc(desc);\n }\n }\n\n onSubsUpdated(subs) {\n const topic = this.props.tinode.getTopic(this.props.topic);\n if (!topic) {\n return;\n }\n this.resetSubs(topic, this.props);\n\n if (this.previousSubsUpdated && this.previousSubsUpdated != this.onSubsUpdated) {\n this.previousSubsUpdated(subs);\n }\n }\n\n handleImageChanged(mime, img) {\n this.setState({avatar: img});\n this.props.onTopicDescUpdate(this.props.topic, theCard(null, img || Tinode.DEL_CHAR), null);\n }\n\n handleMuted(ignored, checked) {\n this.setState({muted: checked});\n this.props.onChangePermissions(this.props.topic, checked ? '-P' : '+P');\n }\n\n handleUnarchive(ignored, ignored2) {\n this.props.onTopicUnArchive(this.props.topic);\n }\n\n handlePermissionsChanged(which, perm) {\n switch (which) {\n case 'auth':\n this.props.onTopicDescUpdateRequest(this.props.topic, null, null, {auth: perm});\n break;\n case 'anon':\n this.props.onTopicDescUpdateRequest(this.props.topic, null, null, {anon: perm});\n break;\n case 'mode':\n case 'want':\n this.props.onChangePermissions(this.props.topic, perm);\n break;\n case 'given':\n this.props.onChangePermissions(this.props.topic, perm, this.props.topic);\n break;\n case 'user':\n this.props.onChangePermissions(this.props.topic, perm, this.state.userPermissionsEdited);\n break;\n }\n\n this.handleBackNavigate();\n }\n\n handleLaunchPermissionsEditor(which, uid) {\n const {formatMessage} = this.props.intl;\n let toEdit, toCompare, toSkip, titleEdit, titleCompare, userTitle, userAvatar;\n switch (which) {\n case 'mode':\n toEdit = this.state.access;\n break;\n case 'want':\n toEdit = this.state.modeWant;\n toCompare = this.state.modeGiven;\n if (this.state.owner) {\n // Don't allow owner to unset 'O' permission. All other permissions are OK.\n toSkip = 'O';\n } else {\n // Allow accepting any of 'ASDO' permissions but don't allow asking for them.\n toSkip = AccessMode.encode(AccessMode.diff('ASDO', this.state.modeGiven));\n if (this.state.channel) {\n // Channels are read-only.\n toSkip += 'W';\n }\n }\n titleEdit = formatMessage(messages.perm_want);\n titleCompare = formatMessage(messages.perm_given);\n break;\n case 'given':\n toEdit = this.state.modeGiven2;\n toCompare = this.state.modeWant2;\n toSkip = this.state.groupTopic ? (this.state.owner ? '' : 'O') : 'ASDO';\n titleEdit = formatMessage(messages.perm_given);\n titleCompare = formatMessage(messages.perm_want);\n break;\n case 'auth':\n toEdit = this.state.auth;\n toSkip = 'O';\n break;\n case 'anon':\n toEdit = this.state.anon;\n toSkip = 'O';\n break;\n case 'user': {\n const topic = this.props.tinode.getTopic(this.props.topic);\n if (!topic) {\n return;\n }\n const user = topic.subscriber(uid);\n if (!user || !user.acs) {\n return;\n }\n toEdit = user.acs.getGiven();\n toCompare = user.acs.getWant();\n toSkip = this.state.owner ? '' : 'O';\n titleEdit = formatMessage(messages.perm_given);\n titleCompare = formatMessage(messages.perm_want);\n if (user.public) {\n userTitle = user.public.fn;\n userAvatar = user.public.photo;\n }\n break;\n }\n default:\n console.error(\"Unknown permission editing mode '\" + which + \"'\");\n return;\n }\n this.setState({\n userPermissionsEdited: uid,\n userPermissionsTitle: userTitle,\n userPermissionsAvatar: userAvatar,\n editedPermissions: toEdit,\n immutablePermissions: toCompare,\n editedPermissionsTitle: titleEdit,\n immutablePermissionsTitle: titleCompare,\n editedPermissionsSkipped: toSkip,\n });\n this.props.onNavigate(`perm/${which}`);\n }\n\n handleShowAddMembers(e) {\n e.preventDefault();\n this.props.onInitFind();\n this.props.onNavigate('members');\n }\n\n handleMemberUpdateRequest(members, added, removed) {\n this.props.onMemberUpdateRequest(this.props.topic, added, removed);\n this.props.onNavigate('info');\n }\n\n handleMemberSelected(uid) {\n this.setState({selectedContact: uid});\n }\n\n handleBackNavigate() {\n const args = (this.props.panel || 'info').split('/');\n if (args[0] == 'info') {\n this.props.onNavigate(null);\n } else if (args[0] == 'perm') {\n if (args[1] == 'user') {\n this.props.onNavigate('info');\n } else {\n this.props.onNavigate('security');\n }\n } else {\n this.props.onNavigate('info');\n }\n }\n\n handleContextMenu(params) {\n const {formatMessage} = this.props.intl;\n const topic = this.props.tinode.getTopic(this.props.topic);\n if (!topic) {\n return;\n }\n const user = topic.subscriber(params.topicName);\n if (!user || !user.acs) {\n return;\n }\n\n const isMe = this.props.tinode.isMe(params.topicName);\n const menuItems = [{\n title: formatMessage(messages.edit_permissions),\n handler: _ => this.handleLaunchPermissionsEditor(isMe ? 'want' : 'user', params.topicName)\n }];\n if (!isMe) {\n menuItems.push('member_delete');\n }\n menuItems.push(user.acs.isMuted() ? 'member_unmute' : 'member_mute');\n if (!isMe) {\n menuItems.push(user.acs.isJoiner() ? 'member_block' : 'member_unblock');\n }\n this.props.showContextMenu({\n topicName: this.props.topic,\n x: params.x,\n y: params.y,\n user: params.topicName}, menuItems);\n }\n\n render() {\n const args = (this.props.panel || 'info').split('/');\n const view = args[0];\n args.shift();\n\n const {formatMessage} = this.props.intl;\n const panelTitle = formatMessage((view == 'perm' ? messages['perm_' + args[0]] : messages[view])\n || messages['info']);\n\n return (\n \n
\n
{panelTitle}
\n
\n \n
\n
\n {this.props.displayMobile ?\n
: null}\n {view == 'members' ?\n
\n :\n view == 'perm' && args.length > 0 ?\n
this.handlePermissionsChanged(args[0], mode)}\n onCancel={this.handleBackNavigate} />\n :\n view == 'general' ?\n \n :\n view == 'security' ?\n \n :\n \n
\n
\n
\n \n \n \n \n
\n {this.state.archived ?\n
\n \n \n \n \n
\n :\n null\n }\n
\n
\n {this.state.groupTopic && this.state.sharer ?\n <>\n
\n
\n \n \n \n
\n
\n
{\n (no_members) => \n } \n >\n :\n null\n }\n
\n }\n \n );\n }\n};\n\nexport default injectIntl(InfoView);\n","// Login form.\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport CheckBox from '../widgets/checkbox.jsx';\nimport VisiblePassword from '../widgets/visible-password.jsx';\n\nexport default class LoginView extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = {\n login: props.login,\n password: '',\n hostName: props.serverAddress,\n saveToken: props.persist\n };\n this.handleLoginChange = this.handleLoginChange.bind(this);\n this.handlePasswordChange = this.handlePasswordChange.bind(this);\n this.handleToggleSaveToken = this.handleToggleSaveToken.bind(this);\n this.handleSubmit = this.handleSubmit.bind(this);\n }\n\n handleLoginChange(e) {\n this.setState({login: e.target.value});\n }\n\n handlePasswordChange(e) {\n this.setState({password: e.target.value});\n }\n\n handleToggleSaveToken() {\n this.props.onPersistenceChange(!this.state.saveToken);\n this.setState({saveToken: !this.state.saveToken});\n }\n\n handleSubmit(e) {\n e.preventDefault();\n this.props.onLogin(this.state.login.trim(), this.state.password.trim());\n }\n\n render() {\n let submitClasses = 'primary';\n if (this.props.disabled) {\n submitClasses += ' disabled';\n }\n\n return (\n \n );\n }\n};\n","/* This is just a static page to display when no conversation is selected. */\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport { Tinode } from 'tinode-sdk';\n\nimport { APP_NAME } from '../config.js';\n\nexport default class LogoView extends React.PureComponent {\n render() {\n const version = APP_NAME + ' (' + Tinode.getLibrary() + ')';\n return (\n \n
\n
\n \n Tinode Web \n \n
{version}
\n
{this.props.serverVersion} ({this.props.serverAddress})
\n
\n
\n );\n }\n};\n","// Panel with a chat.\n\nimport React from 'react';\nimport { FormattedMessage, defineMessages, injectIntl } from 'react-intl';\n\nimport { Drafty, Tinode } from 'tinode-sdk';\n\nimport CallPanel from '../widgets/call-panel.jsx';\nimport ChatMessage from '../widgets/chat-message.jsx';\nimport ContactBadges from '../widgets/contact-badges.jsx';\nimport DocPreview from '../widgets/doc-preview.jsx';\nimport ErrorPanel from '../widgets/error-panel.jsx';\nimport GroupSubs from '../widgets/group-subs.jsx';\nimport ImagePreview from '../widgets/image-preview.jsx';\nimport Invitation from '../widgets/invitation.jsx';\nimport LetterTile from '../widgets/letter-tile.jsx';\nimport LoadSpinner from '../widgets/load-spinner.jsx';\nimport LogoView from './logo-view.jsx';\nimport MetaMessage from '../widgets/meta-message.jsx';\nimport SendMessage from '../widgets/send-message.jsx';\nimport VideoPreview from '../widgets/video-preview.jsx';\n\nimport { DEFAULT_P2P_ACCESS_MODE, EDIT_PREVIEW_LENGTH, IMAGE_PREVIEW_DIM, KEYPRESS_DELAY,\n MESSAGES_PAGE, MAX_EXTERN_ATTACHMENT_SIZE, MAX_IMAGE_DIM, MAX_INBAND_ATTACHMENT_SIZE,\n READ_DELAY, QUOTED_REPLY_LENGTH, VIDEO_PREVIEW_DIM } from '../config.js';\nimport { CALL_STATE_OUTGOING_INITATED, CALL_STATE_IN_PROGRESS } from '../constants.js';\nimport { blobToBase64, fileToBase64, imageScaled, makeImageUrl } from '../lib/blob-helpers.js';\nimport HashNavigation from '../lib/navigation.js';\nimport { bytesToHumanSize, relativeDateFormat, shortDateFormat } from '../lib/strformat.js';\n\n// Run timer with this frequency (ms) for checking notification queue.\nconst NOTIFICATION_EXEC_INTERVAL = 300;\n// Scroll distance before [go to latest message] button is shown.\nconst SHOW_GO_TO_LAST_DIST = 100;\n\nconst messages = defineMessages({\n online_now: {\n id: 'online_now',\n defaultMessage: 'online now',\n description: 'Indicator that the user or topic is currently online',\n },\n last_seen: {\n id: 'last_seen_timestamp',\n defaultMessage: 'Last seen',\n description: 'Label for the timestamp of when the user or topic was last online'\n },\n not_found: {\n id: 'title_not_found',\n defaultMessage: 'Not found',\n description: 'Title shown when topic is not found'\n },\n channel: {\n id: 'channel',\n defaultMessage: 'channel',\n description: 'Subtitle shown for channels in MessagesView instead of last seen'\n },\n file_attachment_too_large: {\n id: 'file_attachment_too_large',\n defaultMessage: 'The file size {size} exceeds the {limit} limit.',\n description: 'Error message when attachment is too large'\n },\n invalid_content: {\n id: 'invalid_content',\n defaultMessage: 'invalid content',\n description: 'Shown when the message is unreadable'\n },\n editing_message: {\n id: 'editing_message',\n defaultMessage: 'Editing',\n description: 'Title over message editing preview'\n },\n drag_file: {\n id: 'drag_file',\n defaultMessage: 'Drag file here',\n description: 'Prompt on the file drag-n-drop overlay banner'\n }\n});\n\n// Checks if the access permissions are granted but not yet accepted.\nfunction isUnconfirmed(acs) {\n if (acs) {\n const ex = acs.getExcessive() || '';\n return acs.isJoiner('given') && (ex.includes('R') || ex.includes('W'));\n }\n return false;\n}\n\nfunction isPeerRestricted(acs) {\n if (acs) {\n const ms = acs.getMissing() || '';\n return acs.isJoiner('want') && (ms.includes('R') || ms.includes('W'));\n }\n return false;\n}\n\nfunction shouldPresentCallPanel(callState) {\n // Show call panel if either:\n // - call is outgoing (and the client is waiting for the other side to pick up) or,\n // - call is already in progress.\n return callState == CALL_STATE_OUTGOING_INITATED || callState == CALL_STATE_IN_PROGRESS;\n}\n\nclass MessagesView extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = MessagesView.getDerivedStateFromProps(props, {});\n\n this.leave = this.leave.bind(this);\n this.sendMessage = this.sendMessage.bind(this);\n this.retrySend = this.retrySend.bind(this);\n this.sendImageAttachment = this.sendImageAttachment.bind(this);\n this.sendVideoAttachment = this.sendVideoAttachment.bind(this);\n this.sendFileAttachment = this.sendFileAttachment.bind(this);\n this.sendAudioAttachment = this.sendAudioAttachment.bind(this);\n this.sendKeyPress = this.sendKeyPress.bind(this);\n this.subscribe = this.subscribe.bind(this);\n this.handleScrollReference = this.handleScrollReference.bind(this);\n this.mountDnDEvents = this.mountDnDEvents.bind(this);\n this.handleScrollEvent = this.handleScrollEvent.bind(this);\n this.handleDescChange = this.handleDescChange.bind(this);\n this.handleSubsUpdated = this.handleSubsUpdated.bind(this);\n this.handleMessageUpdate = this.handleMessageUpdate.bind(this);\n this.handleAllMessagesReceived = this.handleAllMessagesReceived.bind(this);\n this.handleInfoReceipt = this.handleInfoReceipt.bind(this);\n this.handleExpandMedia = this.handleExpandMedia.bind(this);\n this.handleClosePreview = this.handleClosePreview.bind(this);\n this.handleFormResponse = this.handleFormResponse.bind(this);\n this.handleContextClick = this.handleContextClick.bind(this);\n this.handleShowMessageContextMenu = this.handleShowMessageContextMenu.bind(this);\n this.handleNewChatAcceptance = this.handleNewChatAcceptance.bind(this);\n this.handleEnablePeer = this.handleEnablePeer.bind(this);\n this.handleAttachFile = this.handleAttachFile.bind(this);\n this.handleAttachImageOrVideo = this.handleAttachImageOrVideo.bind(this);\n this.handleCancelUpload = this.handleCancelUpload.bind(this);\n this.postReadNotification = this.postReadNotification.bind(this);\n this.clearNotificationQueue = this.clearNotificationQueue.bind(this);\n this.goToLatestMessage = this.goToLatestMessage.bind(this);\n this.handleFileDrop = this.handleFileDrop.bind(this);\n\n this.handlePickReply = this.handlePickReply.bind(this);\n this.handleEditMessage = this.handleEditMessage.bind(this);\n this.handleCancelReply = this.handleCancelReply.bind(this);\n this.handleQuoteClick = this.handleQuoteClick.bind(this);\n this.handleCallHangup = this.handleCallHangup.bind(this);\n\n this.isDragEnabled = this.isDragEnabled.bind(this);\n this.handleDragIn = this.handleDragIn.bind(this);\n this.handleDragOut = this.handleDragOut.bind(this);\n this.handleDrag = this.handleDrag.bind(this);\n this.handleDrop = this.handleDrop.bind(this);\n\n this.chatMessageRefs = {};\n this.getOrCreateMessageRef = this.getOrCreateMessageRef.bind(this);\n\n // Keeps track of the drag event.\n // Need a counter b/c the browser's 'drag' events may fire multiple times\n // when the user takes the mouse pointer over the container:\n // for the component itself and for all nested/child elements.\n this.dragCounter = 0;\n this.dndRef = null;\n\n this.readNotificationQueue = [];\n this.readNotificationTimer = null;\n\n this.keyPressTimer = null;\n }\n\n getOrCreateMessageRef(seqId) {\n if (this.chatMessageRefs.hasOwnProperty(seqId)) {\n return this.chatMessageRefs[seqId];\n }\n const ref = React.createRef();\n this.chatMessageRefs[seqId] = ref;\n return ref;\n }\n\n componentDidMount() {\n if (this.messagesScroller) {\n this.messagesScroller.addEventListener('scroll', this.handleScrollEvent);\n }\n\n // Drag and drop events\n if (this.dndRef) {\n this.dndRef.addEventListener('dragenter', this.handleDragIn);\n this.dndRef.addEventListener('dragleave', this.handleDragOut);\n this.dndRef.addEventListener('dragover', this.handleDrag);\n this.dndRef.addEventListener('drop', this.handleDrop);\n }\n }\n\n componentWillUnmount() {\n if (this.messagesScroller) {\n this.messagesScroller.removeEventListener('scroll', this.handleScrollEvent);\n }\n\n // Flush all notifications.\n this.clearNotificationQueue();\n\n // Drag and drop events\n if (this.dndRef) {\n this.dndRef.removeEventListener('dragenter', this.handleDragIn);\n this.dndRef.removeEventListener('dragleave', this.handleDragOut);\n this.dndRef.removeEventListener('dragover', this.handleDrag);\n this.dndRef.removeEventListener('drop', this.handleDrop);\n }\n }\n\n // Scroll last message into view on component update e.g. on message received\n // or vertical shrinking.\n componentDidUpdate(prevProps, prevState) {\n if (this.messagesScroller &&\n (prevState.topic != this.state.topic || prevState.messageCount != this.state.messageCount)) {\n // New message.\n if (this.state.scrollPosition < SHOW_GO_TO_LAST_DIST) {\n this.messagesScroller.scrollTop = this.messagesScroller.scrollHeight -\n this.state.scrollPosition -\n this.messagesScroller.offsetHeight;\n }\n }\n\n const topic = this.props.tinode ? this.props.tinode.getTopic(this.state.topic) : undefined;\n if (this.state.topic != prevState.topic) {\n if (prevState.topic && !Tinode.isNewGroupTopicName(prevState.topic)) {\n this.leave(prevState.topic);\n if (prevState.rtcPanel) {\n this.handleCallHangup(prevState.topic, prevProps.callSeq);\n }\n }\n\n if (topic) {\n topic.onData = this.handleMessageUpdate;\n topic.onAllMessagesReceived = this.handleAllMessagesReceived;\n topic.onInfo = this.handleInfoReceipt;\n topic.onMetaDesc = this.handleDescChange;\n topic.onSubsUpdated = this.handleSubsUpdated;\n topic.onPres = this.handleSubsUpdated;\n }\n }\n\n if (!this.props.applicationVisible) {\n // If application is not visible, flush all unsent 'read' notifications.\n this.clearNotificationQueue();\n } else {\n // Otherwise assume there are unread messages.\n this.postReadNotification(0);\n }\n\n if (topic && ((this.state.topic != prevState.topic) || !prevProps.ready)) {\n // Don't immediately subscribe to a new p2p topic, wait for the first message.\n if (topic._new && topic.isP2PType()) {\n topic.getMeta(topic.startMetaQuery().withDesc().build());\n } else {\n this.subscribe(topic);\n }\n }\n }\n\n static getDerivedStateFromProps(nextProps, prevState) {\n let nextState = {};\n if (!nextProps.topic) {\n // Default state: no topic.\n nextState = {\n messageCount: 0,\n latestClearId: -1,\n onlineSubs: [],\n topic: null,\n title: '',\n avatar: null,\n isVerified: false,\n isStaff: false,\n isDangerous: false,\n deleted: false,\n docPreview: null,\n imagePreview: null,\n imagePostview: null,\n videoPreview: null,\n videoPostview: null,\n rtcPanel: null,\n typingIndicator: false,\n scrollPosition: 0,\n fetchingMessages: false,\n peerMessagingDisabled: false,\n channel: false,\n reply: null,\n contentToEdit: null,\n showGoToLastButton: false,\n dragging: false\n };\n } else if (nextProps.topic != prevState.topic) {\n const topic = nextProps.tinode.getTopic(nextProps.topic);\n\n nextState = {\n topic: nextProps.topic,\n deleted: topic._deleted,\n docPreview: null,\n imagePreview: null,\n imagePostview: null,\n videoPreview: null,\n videoPostview: null,\n rtcPanel: null,\n typingIndicator: false,\n scrollPosition: 0,\n fetchingMessages: false,\n showGoToLastButton: false,\n contentToEdit: null,\n dragging: false\n };\n\n if (nextProps.forwardMessage) {\n // We are forwarding a message. Show preview.\n nextState.reply = {\n content: nextProps.forwardMessage.preview,\n seq: null\n };\n } else {\n nextState.reply = null;\n }\n\n if (topic) {\n // Topic exists.\n const subs = [];\n\n if (nextProps.connected) {\n topic.subscribers((sub) => {\n if (sub.online && sub.user != nextProps.myUserId) {\n subs.push(sub);\n }\n });\n }\n\n Object.assign(nextState, {\n onlineSubs: subs\n });\n\n if (topic.public) {\n Object.assign(nextState, {\n title: topic.public.fn,\n avatar: makeImageUrl(topic.public.photo)\n });\n } else {\n Object.assign(nextState, {\n title: '',\n avatar: null\n });\n }\n\n const peer = topic.p2pPeerDesc();\n if (peer) {\n Object.assign(nextState, {\n peerMessagingDisabled: isPeerRestricted(peer.acs)\n });\n } else if (prevState.peerMessagingDisabled) {\n Object.assign(nextState, {\n peerMessagingDisabled: false\n });\n }\n Object.assign(nextState, {\n messageCount: topic.messageCount(),\n latestClearId: topic.maxClearId(),\n channel: topic.isChannelType()\n });\n\n if (nextProps.callTopic == topic.name && shouldPresentCallPanel(nextProps.callState)) {\n nextState.rtcPanel = nextProps.callTopic;\n }\n } else {\n // Invalid topic.\n Object.assign(nextState, {\n messageCount: 0,\n latestClearId: -1,\n onlineSubs: [],\n title: '',\n avatar: null,\n peerMessagingDisabled: false,\n channel: false\n });\n }\n } else {\n // We are still in same topic. Show the call panel if necessary.\n if (nextProps.callTopic == prevState.topic && !prevState.rtcPanel &&\n shouldPresentCallPanel(nextProps.callState)) {\n nextState.rtcPanel = nextProps.callTopic;\n }\n }\n\n if (nextProps.acs) {\n if (nextProps.acs.isWriter() != prevState.isWriter) {\n nextState.isWriter = !prevState.isWriter;\n }\n if (nextProps.acs.isReader() != prevState.isReader) {\n nextState.isReader = !prevState.isReader;\n }\n if (!nextProps.acs.isReader('given') != prevState.readingBlocked) {\n nextState.readingBlocked = !prevState.readingBlocked;\n }\n if (nextProps.acs.isSharer() != prevState.isSharer) {\n nextState.isSharer = !prevState.isSharer;\n }\n } else {\n if (prevState.isWriter) {\n nextState.isWriter = false;\n }\n if (prevState.isReader) {\n nextState.isReader = false;\n }\n if (!prevState.readingBlocked) {\n prevState.readingBlocked = true;\n }\n if (prevState.isSharer) {\n nextState.isSharer = false;\n }\n }\n\n if (isUnconfirmed(nextProps.acs) == !prevState.unconformed) {\n nextState.unconfirmed = !prevState.unconformed;\n }\n\n // Clear subscribers online when there is no connection.\n if (!nextProps.connected && prevState.onlineSubs && prevState.onlineSubs.length > 0) {\n nextState.onlineSubs = [];\n }\n\n return nextState;\n }\n\n subscribe(topic) {\n if (topic.isSubscribed() || !this.props.ready) {\n return;\n }\n\n // Is this a new topic?\n const newTopic = (this.props.newTopicParams && this.props.newTopicParams._topicName == this.props.topic);\n\n // Don't request the tags. They are useless unless the user\n // is the owner and is editing the topic.\n let getQuery = topic.startMetaQuery().withLaterDesc().withLaterSub();\n if (this.state.isReader || newTopic) {\n // Reading is either permitted or we don't know because it's a new topic. Ask for messages.\n getQuery = getQuery.withLaterData(MESSAGES_PAGE);\n if (this.state.isReader) {\n getQuery = getQuery.withLaterDel();\n }\n // And show \"loading\" spinner.\n this.setState({ fetchingMessages: true });\n }\n\n const setQuery = newTopic ? this.props.newTopicParams : undefined;\n topic.subscribe(getQuery.build(), setQuery)\n .then(ctrl => {\n if (ctrl.code == 303) {\n // Redirect to another topic requested.\n HashNavigation.navigateTo(HashNavigation.setUrlTopic('', ctrl.params.topic));\n return;\n }\n if (this.state.topic != ctrl.topic) {\n this.setState({topic: ctrl.topic});\n }\n this.props.onNewTopicCreated(this.props.topic, ctrl.topic);\n // If there are unsent messages (except video call messages),\n // try sending them now. Unsent video call messages will be dropped.\n let calls = [];\n topic.queuedMessages((pub) => {\n if (pub._sending) {\n return;\n }\n if (pub.head && pub.head.webrtc) {\n // Filter out unsent video call messages.\n calls.push(pub.seq);\n return;\n }\n if (topic.isSubscribed()) {\n this.retrySend(pub);\n }\n });\n if (calls.length > 0) {\n topic.delMessagesList(calls, true);\n }\n })\n .catch(err => {\n console.error(\"Failed subscription to\", this.state.topic, err);\n this.props.onError(err.message, 'err');\n const blankState = MessagesView.getDerivedStateFromProps({}, {});\n blankState.title = this.props.intl.formatMessage(messages.not_found);\n this.setState(blankState);\n });\n }\n\n leave(oldTopicName) {\n if (!oldTopicName || !this.props.tinode.isTopicCached(oldTopicName)) {\n return;\n }\n\n const oldTopic = this.props.tinode.getTopic(oldTopicName);\n if (oldTopic && oldTopic.isSubscribed()) {\n oldTopic.leave(false)\n .catch(_ => { /* do nothing here */ })\n .finally(_ => {\n // We don't care if the request succeeded or failed.\n // The topic is dead regardless.\n this.setState({fetchingMessages: false});\n oldTopic.onData = undefined;\n oldTopic.onAllMessagesReceived = undefined;\n oldTopic.onInfo = undefined;\n oldTopic.onMetaDesc = undefined;\n oldTopic.onSubsUpdated = undefined;\n oldTopic.onPres = undefined;\n });\n }\n }\n\n // Don't use React.createRef as the ref.current is not available in componentDidMount in this component.\n handleScrollReference(node) {\n if (node) {\n node.addEventListener('scroll', this.handleScrollEvent);\n this.messagesScroller = node;\n this.messagesScroller.scrollTop = this.messagesScroller.scrollHeight - this.state.scrollPosition;\n }\n }\n\n // Get older messages and show/hide [go to latest message] button.\n handleScrollEvent(event) {\n const pos = event.target.scrollHeight - event.target.scrollTop - event.target.offsetHeight;\n this.setState({\n scrollPosition: pos,\n // Show [go to latest message] if far enough from bottom and scrolling down.\n showGoToLastButton: (pos > SHOW_GO_TO_LAST_DIST) && (pos < this.state.scrollPosition),\n });\n\n if (this.state.fetchingMessages) {\n return;\n }\n\n if (event.target.scrollTop <= 0) {\n const topic = this.props.tinode.getTopic(this.state.topic);\n if (topic && topic.isSubscribed() && topic.msgHasMoreMessages()) {\n this.setState({fetchingMessages: true}, _ => {\n topic.getMessagesPage(MESSAGES_PAGE)\n .catch(err => this.props.onError(err.message, 'err'))\n .finally(_ => this.setState({fetchingMessages: false}));\n });\n }\n }\n }\n\n /* Mound draf and drop events */\n mountDnDEvents(dnd) {\n if (dnd) {\n dnd.addEventListener('dragenter', this.handleDragIn);\n dnd.addEventListener('dragleave', this.handleDragOut);\n dnd.addEventListener('dragover', this.handleDrag);\n dnd.addEventListener('drop', this.handleDrop);\n this.dndRef = dnd;\n }\n }\n\n goToLatestMessage() {\n this.setState({scrollPosition: 0});\n if (this.messagesScroller) {\n this.messagesScroller.scrollTop = this.messagesScroller.scrollHeight;\n }\n }\n\n handleDescChange(desc) {\n if (desc.public) {\n this.setState({\n title: desc.public.fn,\n avatar: makeImageUrl(desc.public.photo)\n });\n } else {\n this.setState({\n title: '',\n avatar: null\n });\n }\n\n if (desc.acs) {\n this.setState({\n isWriter: desc.acs.isWriter(),\n isReader: desc.acs.isReader(),\n readingBlocked: !desc.acs.isReader('given'),\n unconfirmed: isUnconfirmed(desc.acs),\n });\n }\n }\n\n postReadNotification(seq) {\n // Ignore notifications if the app is invisible.\n if (!this.props.applicationVisible) {\n return;\n }\n\n // Set up the timer if it's not running already.\n if (!this.readNotificationTimer) {\n this.readNotificationTimer = setInterval(_ => {\n if (this.readNotificationQueue.length == 0) {\n // Shut down the timer if the queue is empty.\n clearInterval(this.readNotificationTimer);\n this.readNotificationTimer = null;\n return;\n }\n\n let seq = -1;\n while (this.readNotificationQueue.length > 0) {\n const n = this.readNotificationQueue[0];\n if (n.topicName != this.state.topic) {\n // Topic has changed. Drop the notification.\n this.readNotificationQueue.shift();\n continue;\n }\n\n const now = new Date();\n if (n.sendAt <= now) {\n // Remove expired notification from queue.\n this.readNotificationQueue.shift();\n seq = Math.max(seq, n.seq);\n } else {\n break;\n }\n }\n\n // Send only one notification for the whole batch of messages.\n if (seq >= 0) {\n const topic = this.props.tinode.getTopic(this.state.topic);\n if (topic) {\n topic.noteRead(seq);\n }\n }\n }, NOTIFICATION_EXEC_INTERVAL);\n }\n\n const now = new Date();\n this.readNotificationQueue.push({\n topicName: this.state.topic,\n seq: seq,\n sendAt: now.setMilliseconds(now.getMilliseconds() + READ_DELAY)\n });\n }\n\n // Clear notification queue and timer.\n clearNotificationQueue() {\n this.readNotificationQueue = [];\n if (this.readNotificationTimer) {\n clearInterval(this.readNotificationTimer);\n this.readNotificationTimer = null;\n }\n }\n\n handleSubsUpdated() {\n if (this.state.topic) {\n const subs = [];\n const topic = this.props.tinode.getTopic(this.state.topic);\n topic.subscribers((sub) => {\n if (sub.online && sub.user != this.props.myUserId) {\n subs.push(sub);\n }\n });\n const newState = {onlineSubs: subs};\n const peer = topic.p2pPeerDesc();\n if (peer) {\n Object.assign(newState, {\n peerMessagingDisabled: isPeerRestricted(peer.acs)\n });\n } else if (this.state.peerMessagingDisabled) {\n Object.assign(newState, {\n peerMessagingDisabled: false\n });\n }\n this.setState(newState);\n }\n }\n\n // The 'msg' could be false-ish if some message ranges were deleted.\n handleMessageUpdate(msg) {\n const topic = this.props.tinode.getTopic(this.state.topic);\n if (!msg) {\n // msg could be null if one or more messages were deleted.\n // Updating state to force redraw.\n this.setState({latestClearId: topic.maxClearId()});\n return;\n }\n\n clearTimeout(this.keyPressTimer)\n this.setState({messageCount: topic.messageCount(), typingIndicator: false}, _ => {\n // Scroll to the bottom if the message is added to the end of the message\n // list if already at the bottom, otherwise show [go to latest] button.\n // Implemented as a callback to be sure the scroll height has been updated.\n if (topic.isNewMessage(msg.seq)) {\n if (this.state.scrollPosition > SHOW_GO_TO_LAST_DIST) {\n this.setState({showGoToLastButton: true});\n } else {\n this.goToLatestMessage();\n }\n }\n });\n\n // Aknowledge messages except own messages. They are\n // automatically assumed to be read and recived.\n const status = topic.msgStatus(msg, true);\n if (status >= Tinode.MESSAGE_STATUS_SENT && msg.from != this.props.myUserId) {\n this.postReadNotification(msg.seq);\n }\n }\n\n handleAllMessagesReceived(count) {\n this.setState({fetchingMessages: false});\n if (count > 0) {\n // 0 means \"latest\".\n this.postReadNotification(0);\n }\n }\n\n handleInfoReceipt(info) {\n switch (info.what) {\n case 'kp': {\n clearTimeout(this.keyPressTimer);\n this.keyPressTimer = setTimeout(_ => this.setState({typingIndicator: false}), KEYPRESS_DELAY + 1000);\n if (!this.state.typingIndicator) {\n this.setState({typingIndicator: true});\n }\n break;\n }\n case 'read':\n case 'recv':\n // Redraw due to changed recv/read status.\n this.forceUpdate();\n break;\n default:\n console.info(\"Other change in topic: \", info.what);\n }\n }\n\n handleExpandMedia(content) {\n if (!content) {\n return;\n }\n\n if (content.video) {\n this.setState({ videoPostview: content });\n } else {\n this.setState({ imagePostview: content });\n }\n }\n\n handleClosePreview() {\n if (this.state.imagePreview && this.state.imagePreview.url) {\n URL.revokeObjectURL(this.state.imagePreview.url);\n }\n if (this.state.videoPreview && this.state.videoPreview.url) {\n URL.revokeObjectURL(this.state.videoPreview.url);\n }\n this.setState({ imagePostview: null, imagePreview: null, docPreview: null, videoPreview: null, videoPostview: null});\n }\n\n handleFormResponse(action, text, data) {\n if (action == 'pub') {\n this.sendMessage(Drafty.attachJSON(Drafty.parse(text), data));\n } else if (action == 'url') {\n const url = new URL(data.ref);\n const params = url.searchParams;\n for (let key in data.resp) {\n if (data.resp.hasOwnProperty(key)) {\n params.set(key, data.resp[key]);\n }\n }\n ['name', 'seq'].map((key) => {\n if (data[key]) {\n params.set(key, data[key]);\n }\n });\n params.set('uid', this.props.myUserId);\n params.set('topic', this.state.topic);\n url.search = params;\n window.open(url, '_blank');\n } else {\n console.info(\"Unknown action in form\", action);\n }\n }\n\n handleContextClick(e) {\n e.preventDefault();\n e.stopPropagation();\n this.props.showContextMenu({ topicName: this.state.topic, y: e.pageY, x: e.pageX });\n }\n\n handleShowMessageContextMenu(params, messageSpecificMenuItems) {\n if (params.userFrom == 'chan') {\n params.userFrom = this.state.topic;\n params.userName = this.state.title;\n }\n params.topicName = this.state.topic;\n const menuItems = messageSpecificMenuItems || [];\n const topic = this.props.tinode.getTopic(params.topicName);\n if (topic) {\n if (!topic.isChannelType()) {\n menuItems.push('message_delete');\n }\n const acs = topic.getAccessMode();\n if (acs && acs.isDeleter()) {\n menuItems.push('message_delete_hard');\n }\n }\n this.props.showContextMenu(params, menuItems);\n }\n\n handleNewChatAcceptance(action) {\n this.props.onNewChat(this.state.topic, action);\n }\n\n handleEnablePeer(e) {\n e.preventDefault();\n this.props.onChangePermissions(this.state.topic, DEFAULT_P2P_ACCESS_MODE, this.state.topic);\n }\n\n sendKeyPress(audio) {\n const topic = this.props.tinode.getTopic(this.state.topic);\n if (topic.isSubscribed()) {\n if (audio) {\n topic.noteRecording(true);\n } else {\n topic.noteKeyPress();\n }\n }\n }\n\n // sendMessage sends the message with an optional subscription to topic first.\n sendMessage(msg, uploadCompletionPromise, uploader) {\n let head;\n if (this.props.forwardMessage) {\n // We are forwarding a message.\n msg = this.props.forwardMessage.msg;\n head = this.props.forwardMessage.head;\n this.handleCancelReply();\n } else if (this.state.reply) {\n if (this.state.reply.editing) {\n if (msg == this.state.contentToEdit) {\n // Message unchanged.\n this.handleCancelReply();\n return;\n }\n // Editing an existing message.\n head = {replace: ':' + this.state.reply.seq};\n } else if (this.state.reply.content) {\n // Replying to a message in this topic.\n // Turn it into Drafty so we can make a quoted Drafty object later.\n head = {reply: '' + this.state.reply.seq};\n if (typeof msg == 'string') {\n msg = Drafty.parse(msg);\n }\n msg = Drafty.append(Drafty.sanitizeEntities(this.state.reply.content), msg);\n }\n this.handleCancelReply();\n }\n this.props.sendMessage(msg, uploadCompletionPromise, uploader, head);\n }\n\n // Retry sending a message.\n retrySend(pub) {\n this.props.sendMessage(pub.content, undefined, undefined, pub.head)\n .then(_ => {\n // All good. Remove the original message draft from the cache.\n const topic = this.props.tinode.getTopic(this.state.topic);\n topic.delMessagesList([pub.seq], true);\n });\n }\n\n // Send attachment as Drafty message:\n // - if file is too large, upload it and send a s link.\n // - if file is small enough, just send it in-band.\n sendFileAttachment(file) {\n // Server-provided limit reduced for base64 encoding and overhead.\n const maxInbandAttachmentSize = (this.props.tinode.getServerParam('maxMessageSize',\n MAX_INBAND_ATTACHMENT_SIZE) * 0.75 - 1024) | 0;\n\n if (file.size > maxInbandAttachmentSize) {\n // Too large to send inband - uploading out of band and sending as a link.\n const uploader = this.props.tinode.getLargeFileHelper();\n if (!uploader) {\n this.props.onError(this.props.intl.formatMessage(messages.cannot_initiate_upload));\n return;\n }\n const uploadCompletionPromise = uploader.upload(file);\n const msg = Drafty.attachFile(null, {\n mime: file.type,\n filename: file.name,\n size: file.size,\n urlPromise: uploadCompletionPromise\n });\n // Pass data and the uploader to the TinodeWeb.\n this.sendMessage(msg, uploadCompletionPromise, uploader);\n } else {\n // Small enough to send inband.\n fileToBase64(file)\n .then(b64 => this.sendMessage(Drafty.attachFile(null, {\n mime: b64.mime,\n data: b64.bits,\n filename: b64.name,\n size: file.size\n })))\n .catch(err => this.props.onError(err.message, 'err'));\n }\n }\n\n // handleAttachFile method is called when [Attach file] button is clicked: launch attachment preview.\n handleAttachFile(file) {\n const maxExternAttachmentSize = this.props.tinode.getServerParam('maxFileUploadSize', MAX_EXTERN_ATTACHMENT_SIZE);\n\n if (file.size > maxExternAttachmentSize) {\n // Too large.\n this.props.onError(this.props.intl.formatMessage(messages.file_attachment_too_large,\n {size: bytesToHumanSize(file.size), limit: bytesToHumanSize(maxExternAttachmentSize)}), 'err');\n } else {\n this.setState({\n docPreview: {\n file: file,\n name: file.name,\n size: file.size,\n type: file.type\n }\n });\n }\n }\n\n handleCallHangup(topic, seq) {\n this.props.onVideoCallClosed();\n this.setState({\n rtcPanel: null\n });\n this.props.onCallHangup(topic, seq);\n }\n\n // sendImageAttachment sends the image bits as Drafty message.\n sendImageAttachment(caption, blob) {\n const mime = this.state.imagePreview.mime;\n const width = this.state.imagePreview.width;\n const height = this.state.imagePreview.height;\n const fname = this.state.imagePreview.filename;\n\n // Server-provided limit reduced for base64 encoding and overhead.\n const maxInbandAttachmentSize = (this.props.tinode.getServerParam('maxMessageSize',\n MAX_INBAND_ATTACHMENT_SIZE) * 0.75 - 1024) | 0;\n\n if (blob.size > maxInbandAttachmentSize) {\n // Too large to send inband - uploading out of band and sending as a link.\n const uploader = this.props.tinode.getLargeFileHelper();\n if (!uploader) {\n this.props.onError(this.props.intl.formatMessage(messages.cannot_initiate_upload));\n return;\n }\n const uploadCompletionPromise = uploader.upload(blob);\n\n // Make small preview to show while uploading.\n imageScaled(blob, IMAGE_PREVIEW_DIM, IMAGE_PREVIEW_DIM, -1, false)\n // Convert tiny image into base64 for serialization and previewing.\n .then(scaled => blobToBase64(scaled.blob))\n .then(b64 => {\n let msg = Drafty.insertImage(null, 0, {\n mime: mime,\n _tempPreview: b64.bits, // This preview will not be serialized.\n bits: b64.bits, // Image thumbnail.\n width: width,\n height: height,\n filename: fname,\n size: blob.size,\n urlPromise: uploadCompletionPromise\n });\n if (caption) {\n msg = Drafty.appendLineBreak(msg);\n msg = Drafty.append(msg, Drafty.parse(caption));\n }\n // Pass data and the uploader to the TinodeWeb.\n this.sendMessage(msg, uploadCompletionPromise, uploader);\n })\n .catch(err => this.props.onError(err, 'err'));\n return;\n }\n\n // Send the image inband if it's not too big. The image has been scaled already\n // in image preview.\n blobToBase64(blob)\n .then(b64 => {\n let msg = Drafty.insertImage(null, 0, {\n mime: b64.mime,\n bits: b64.bits,\n width: width,\n height: height,\n filename: fname,\n size: blob.size\n });\n if (caption) {\n msg = Drafty.appendLineBreak(msg);\n msg = Drafty.append(msg, Drafty.parse(caption));\n }\n this.sendMessage(msg);\n });\n }\n\n // sendVideoAttachment sends the video bits as Drafty message.\n sendVideoAttachment(caption, videoBlob, previewBlob, params) {\n const width = params.width;\n const height = params.height;\n\n // Server-provided limit reduced for base64 encoding and overhead.\n const maxInbandAttachmentSize = (this.props.tinode.getServerParam('maxMessageSize',\n MAX_INBAND_ATTACHMENT_SIZE) * 0.75 - 1024) | 0;\n\n const uploads = [];\n let uploader;\n if ((videoBlob.size + previewBlob.size) > maxInbandAttachmentSize) {\n // One or both are too large to send inband. Uploading out of band and sending as a link.\n uploader = this.props.tinode.getLargeFileHelper();\n if (!uploader) {\n this.props.onError(this.props.intl.formatMessage(messages.cannot_initiate_upload));\n return;\n }\n\n uploads[0] = videoBlob.size > maxInbandAttachmentSize * 0.675 ? uploader.upload(videoBlob) : null;\n uploads[1] = previewBlob.size > maxInbandAttachmentSize * 0.275 ? uploader.upload(previewBlob) : null;\n }\n\n if (uploads.length == 0) {\n // Both video and preview are small enough to send inband.\n Promise.all([blobToBase64(videoBlob), blobToBase64(previewBlob)])\n .then(b64s => {\n const [v64, i64] = b64s;\n let msg = Drafty.insertVideo(null, 0, {\n mime: v64.mime,\n bits: v64.bits,\n preview: i64.bits,\n premime: i64.mime,\n width: width,\n height: height,\n duration: params.duration,\n filename: params.name,\n size: videoBlob.size\n });\n if (caption) {\n msg = Drafty.appendLineBreak(msg);\n msg = Drafty.append(msg, Drafty.parse(caption));\n }\n this.sendMessage(msg);\n });\n return;\n }\n\n const uploadCompletionPromise = Promise.all(uploads);\n\n const b64conv = [];\n // Small video converted to base64.\n b64conv[0] = uploads[0] ? null : blobToBase64(videoBlob);\n // Full-size preview fits inline.\n b64conv[1] = uploads[1] ? null : imageScaled(previewBlob, MAX_IMAGE_DIM, MAX_IMAGE_DIM, -1, false)\n .then(scaled => blobToBase64(scaled.blob));\n // Small preview to show while uploading.\n b64conv[2] = imageScaled(previewBlob, VIDEO_PREVIEW_DIM, VIDEO_PREVIEW_DIM, -1, false)\n .then(scaled => blobToBase64(scaled.blob));\n Promise.all(b64conv)\n // Convert tiny image into base64 for serialization and previewing.\n .then(b64s => {\n const [video, img, preview] = b64s;\n let msg = Drafty.insertVideo(null, 0, {\n mime: params.mime,\n bits: video ? video.bits : null,\n _tempPreview: preview.bits,\n preview: img ? img.bits : preview.bits,\n premime: img ? img.mime : preview.mime,\n width: width,\n height: height,\n duration: params.duration,\n filename: params.name,\n size: videoBlob.size,\n urlPromise: uploadCompletionPromise\n });\n if (caption) {\n msg = Drafty.appendLineBreak(msg);\n msg = Drafty.append(msg, Drafty.parse(caption));\n }\n // Pass data and the uploader to the TinodeWeb.\n this.sendMessage(msg, uploadCompletionPromise, uploader);\n })\n .catch(err => this.props.onError(err.message, 'err'));\n }\n\n // handleAttachImageOrVideo method is called when [Attach image or video] button is clicked: launch image or video preview.\n handleAttachImageOrVideo(file) {\n const maxExternAttachmentSize = this.props.tinode.getServerParam('maxFileUploadSize', MAX_EXTERN_ATTACHMENT_SIZE);\n\n if (file.type.startsWith('video/')) {\n this.setState({videoPreview: {\n url: URL.createObjectURL(file),\n blob: file,\n filename: file.name,\n size: file.size,\n mime: file.type\n }});\n return;\n }\n\n // Get image dimensions and size, optionally scale it down.\n imageScaled(file, MAX_IMAGE_DIM, MAX_IMAGE_DIM, maxExternAttachmentSize, false)\n .then(scaled => {\n this.setState({imagePreview: {\n url: URL.createObjectURL(scaled.blob),\n blob: scaled.blob,\n filename: scaled.name,\n width: scaled.width,\n height: scaled.height,\n size: scaled.blob.size,\n mime: scaled.mime\n }});\n }).catch(err => {\n this.props.onError(err.message, 'err');\n });\n }\n\n // handleFileDrop is called when the user drags & drops a file upon the message view.\n handleFileDrop(files) {\n if (!files || files.length == 0) {\n return;\n }\n const file = files[0];\n if (file.type && file.type.startsWith('image/')) {\n this.handleAttachImageOrVideo(file);\n } else {\n this.handleAttachFile(file);\n }\n }\n\n // sendAudioAttachment sends audio bits inband as Drafty message (no preview).\n sendAudioAttachment(url, preview, duration) {\n fetch(url)\n .then(result => result.blob())\n .then(blob => {\n // Server-provided limit reduced for base64 encoding and overhead.\n const maxInbandAttachmentSize = this.props.tinode.getServerParam('maxMessageSize', MAX_INBAND_ATTACHMENT_SIZE) * 0.75 - 1024;\n if (blob.size > maxInbandAttachmentSize) {\n // Too large to send inband - uploading out of band and sending as a link.\n const uploader = this.props.tinode.getLargeFileHelper();\n if (!uploader) {\n this.props.onError(this.props.intl.formatMessage(messages.cannot_initiate_upload));\n return;\n }\n const uploadCompletionPromise = uploader.upload(blob);\n const msg = Drafty.appendAudio(null, {\n mime: blob.type,\n size: blob.size,\n duration: duration,\n preview: preview,\n urlPromise: uploadCompletionPromise\n });\n // Pass data and the uploader to the TinodeWeb.\n this.sendMessage(msg, uploadCompletionPromise, uploader);\n } else {\n // Small enough to send inband.\n blobToBase64(blob)\n .then(b64 => {\n this.sendMessage(Drafty.appendAudio(null, {\n mime: b64.mime,\n bits: b64.bits,\n size: blob.size,\n duration: duration,\n preview: preview,\n }))\n })\n }\n })\n .catch(err => {this.props.onError(err.message, 'err')});;\n }\n\n handleCancelUpload(seq, uploader) {\n const topic = this.props.tinode.getTopic(this.state.topic);\n const found = topic.findMessage(seq);\n if (found) {\n found._cancelled = true;\n }\n uploader.cancel();\n }\n\n // seq: seq ID of the source message\n // context: message content.\n // senderId: UID of the sender of the source message.\n // senderName: full name of the sender of the original message.\n handlePickReply(seq, content, senderId, senderName) {\n if (!seq || !content) {\n this.setState({reply: null});\n return;\n }\n\n content = typeof content == 'string' ? Drafty.init(content) : content;\n if (Drafty.isValid(content)) {\n content = Drafty.replyContent(content, QUOTED_REPLY_LENGTH);\n } else {\n // /!\\ invalid content.\n content = Drafty.append(Drafty.init('\\u26A0 '),\n Drafty.wrapInto(this.props.intl.formatMessage(messages.invalid_content), 'EM'));\n }\n\n this.setState({\n reply: {\n content: Drafty.quote(senderName, senderId, content),\n seq: seq\n }\n });\n this.props.onCancelForwardMessage();\n }\n\n // seq: seq ID of the message to edit.\n // context: message content.\n handleEditMessage(seq, content) {\n if (!seq || !content) {\n this.setState({reply: null});\n return;\n }\n\n content = typeof content == 'string' ? Drafty.init(content) : content;\n const editable = Drafty.toMarkdown(content);\n if (Drafty.isValid(content)) {\n content = Drafty.replyContent(content, EDIT_PREVIEW_LENGTH);\n } else {\n // /!\\ invalid content.\n content = Drafty.append(Drafty.init('\\u26A0 '),\n Drafty.wrapInto(this.props.intl.formatMessage(messages.invalid_content), 'EM'));\n }\n\n this.setState({\n reply: {\n content: Drafty.quote(this.props.intl.formatMessage(messages.editing_message), null, content),\n seq: seq,\n editing: true\n },\n contentToEdit: editable\n });\n this.props.onCancelForwardMessage();\n }\n\n\n handleCancelReply() {\n this.setState({reply: null, contentToEdit: null});\n this.props.onCancelForwardMessage();\n }\n\n handleQuoteClick(replyToSeq) {\n const ref = this.getOrCreateMessageRef(replyToSeq);\n if (ref && ref.current) {\n ref.current.scrollIntoView({block: \"center\", behavior: \"smooth\"});\n ref.current.classList.add('flash');\n setTimeout(_ => {ref.current.classList.remove('flash')} , 1000);\n } else {\n console.error(\"Unresolved message ref\", replyToSeq);\n }\n }\n\n isDragEnabled() {\n return this.state.isWriter && !this.state.unconfirmed && !this.props.forwardMessage && !this.state.peerMessagingDisabled;\n }\n\n handleDrag(e) {\n e.preventDefault();\n e.stopPropagation();\n }\n\n handleDragIn(e) {\n e.preventDefault();\n e.stopPropagation();\n this.dragCounter++;\n if (e.dataTransfer.items && e.dataTransfer.items.length > 0) {\n this.setState({dragging: true});\n }\n }\n\n handleDragOut(e) {\n e.preventDefault();\n e.stopPropagation();\n this.dragCounter--;\n if (this.dragCounter <= 0) {\n this.setState({dragging: false});\n }\n }\n\n handleDrop(e) {\n e.preventDefault();\n e.stopPropagation();\n this.setState({dragging: false});\n if (this.isDragEnabled() && e.dataTransfer.files && e.dataTransfer.files.length > 0) {\n this.handleFileDrop(e.dataTransfer.files);\n e.dataTransfer.clearData();\n this.dragCounter = 0;\n }\n }\n\n render() {\n const {formatMessage} = this.props.intl;\n\n let component;\n if (this.props.hideSelf) {\n component = null;\n } else if (!this.state.topic) {\n component = (\n \n );\n } else {\n let component2;\n if (this.state.imagePreview) {\n // Preview image before sending.\n component2 = (\n \n );\n } else if (this.state.videoPreview) {\n // Preview video.\n component2 = (\n \n );\n } else if (this.state.imagePostview) {\n // Expand received image.\n component2 = (\n \n );\n } else if (this.state.videoPostview) {\n // Play received video.\n component2 = (\n \n );\n } else if (this.state.docPreview) {\n // Preview attachment before sending.\n component2 = (\n \n );\n } else if (this.state.rtcPanel) {\n component2 = (\n \n );\n } else {\n const topic = this.props.tinode.getTopic(this.state.topic);\n const isChannel = topic.isChannelType();\n const groupTopic = topic.isGroupType() && !isChannel;\n const icon_badges = [];\n if (topic.trusted) {\n if (topic.trusted.verified) {\n icon_badges.push({icon: 'verified', color: 'badge-inv'});\n }\n if (topic.trusted.staff) {\n icon_badges.push({icon: 'staff', color: 'badge-inv'});\n }\n if (topic.trusted.danger) {\n icon_badges.push({icon: 'dangerous', color: 'badge-inv'});\n }\n }\n\n const messageNodes = [];\n let previousFrom = null;\n let prevDate = null;\n let chatBoxClass = null;\n topic.messages((msg, prev, next, i) => {\n let nextFrom = next ? (next.from || 'chan') : null;\n\n let sequence = 'single';\n let thisFrom = msg.from || 'chan';\n if (thisFrom == previousFrom) {\n if (thisFrom == nextFrom) {\n sequence = 'middle';\n } else {\n sequence = 'last';\n }\n } else if (thisFrom == nextFrom) {\n sequence = 'first';\n }\n previousFrom = thisFrom;\n\n const isReply = !(thisFrom == this.props.myUserId);\n const deliveryStatus = topic.msgStatus(msg, true);\n\n let userFrom = thisFrom, userName, userAvatar;\n const user = topic.userDesc(thisFrom);\n if (user && user.public) {\n userName = user.public.fn;\n userAvatar = makeImageUrl(user.public.photo);\n }\n chatBoxClass = groupTopic ? 'chat-box group' : 'chat-box';\n\n // Ref for this chat message.\n const ref = this.getOrCreateMessageRef(msg.seq);\n let replyToSeq = msg.head ? parseInt(msg.head.reply) : null;\n if (!replyToSeq || isNaN(replyToSeq)) {\n replyToSeq = null;\n }\n\n if (msg.hi) {\n // Deleted message.\n messageNodes.push(\n \n );\n } else {\n const thisDate = new Date(msg.ts);\n // This message was sent on a different date than the previous.\n if (!prevDate || prevDate.toDateString() != thisDate.toDateString()) {\n messageNodes.push(\n \n );\n prevDate = thisDate;\n }\n messageNodes.push(\n \n );\n }\n });\n\n let lastSeen = null;\n if (isChannel) {\n lastSeen = formatMessage(messages.channel);\n } else {\n const cont = this.props.tinode.getMeTopic().getContact(this.state.topic);\n if (cont && Tinode.isP2PTopicName(cont.topic)) {\n if (cont.online) {\n lastSeen = formatMessage(messages.online_now);\n } else if (cont.seen) {\n lastSeen = formatMessage(messages.last_seen) + \": \" +\n shortDateFormat(cont.seen.when, this.props.intl.locale);\n // TODO: also handle user agent in c.seen.ua\n }\n }\n }\n const avatar = this.state.avatar || true;\n const online = this.state.deleted ? null :\n this.props.online ? 'online' + (this.state.typingIndicator ? ' typing' : '') : 'offline';\n\n const titleClass = 'panel-title' + (this.state.deleted ? ' deleted' : '');\n\n let messagesComponent = (\n <>\n \n
\n arrow_downward \n \n
\n {!this.state.isReader ?\n
\n {this.state.readingBlocked ?\n
\n \n
\n : null }\n
\n : null }\n
\n {this.state.peerMessagingDisabled && !this.state.unconfirmed ?\n : null}\n {this.state.unconfirmed ?\n \n :\n }\n >\n );\n\n component2 = (\n <>\n \n {this.props.displayMobile ?\n \n : null}\n \n {messagesComponent}\n {this.state.dragging && this.isDragEnabled() ?\n {formatMessage(messages.drag_file)}
\n : null}\n >\n );\n }\n component = {component2}
\n }\n return component;\n }\n};\n\nexport default injectIntl(MessagesView);\n","// Create new topic and invite users or send an invite.\nimport React from 'react';\nimport { FormattedMessage, defineMessages, injectIntl } from 'react-intl';\n\nimport { Tinode } from 'tinode-sdk';\n\nimport ContactList from '../widgets/contact-list.jsx';\nimport NewTopicById from '../widgets/new-topic-by-id.jsx';\nimport NewTopicGroup from '../widgets/new-topic-group.jsx';\nimport SearchContacts from '../widgets/search-contacts.jsx';\n\nimport HashNavigation from '../lib/navigation.js';\nimport { theCard } from '../lib/utils.js';\n\nconst messages = defineMessages({\n search_for_contacts: {\n id: \"search_for_contacts\",\n defaultMessage: \"Use search to find contacts\",\n description: \"Text shown in contacts view when user entered no search query.\"\n },\n search_no_results: {\n id: \"search_no_results\",\n defaultMessage: \"Search returned no results\",\n description: \"Text shown in contacts view when query returned no results.\"\n },\n search_placeholder: {\n id: \"search_placeholder\",\n defaultMessage: \"List like email:alice@example.com, tel:17025550003...\",\n description: \"Placeholder in contacts search field\"\n },\n});\n\nclass NewTopicView extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = {\n tabSelected: 'find',\n searchQuery: null\n };\n\n this.handleTabClick = this.handleTabClick.bind(this);\n this.handleSearchContacts = this.handleSearchContacts.bind(this);\n this.handleSearchResultSelected = this.handleSearchResultSelected.bind(this);\n this.handleNewGroupSubmit = this.handleNewGroupSubmit.bind(this);\n this.handleGroupByID = this.handleGroupByID.bind(this);\n }\n\n componentDidMount() {\n this.props.onInitFind();\n }\n\n handleTabClick(e) {\n e.preventDefault();\n HashNavigation.navigateTo(HashNavigation.addUrlParam(window.location.hash, 'tab', e.currentTarget.dataset.id));\n this.setState({tabSelected: e.currentTarget.dataset.id});\n }\n\n handleSearchContacts(query) {\n this.props.onSearchContacts(query);\n this.setState({searchQuery: Tinode.isNullValue(query) ? null : query});\n }\n\n handleSearchResultSelected(name) {\n if (this.state.tabSelected == 'find') {\n HashNavigation.navigateTo(HashNavigation.removeUrlParam(window.location.hash, 'tab'));\n this.props.onCreateTopic(name);\n }\n }\n\n handleNewGroupSubmit(name, description, dataUrl, priv, tags, isChannel) {\n HashNavigation.navigateTo(HashNavigation.removeUrlParam(window.location.hash, 'tab'));\n this.props.onCreateTopic(undefined,\n {public: theCard(name, dataUrl, null, description), private: priv, tags: tags}, isChannel);\n }\n\n handleGroupByID(topicName) {\n HashNavigation.navigateTo(HashNavigation.removeUrlParam(window.location.hash, 'tab'));\n this.props.onCreateTopic(topicName);\n }\n\n render() {\n const {formatMessage} = this.props.intl;\n const no_contacts_placeholder = formatMessage(this.state.searchQuery ?\n messages.search_no_results : messages.search_for_contacts);\n const search_placeholder = formatMessage(messages.search_placeholder);\n return (\n \n
\n {this.state.tabSelected === 'grp' ?\n
:\n this.state.tabSelected === 'byid' ?\n
:\n
\n \n \n
}\n
\n );\n }\n};\n\nexport default injectIntl(NewTopicView);\n","// A password reset form.\nimport React, { Suspense } from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nconst PhoneEdit = React.lazy(_ => import('../widgets/phone-edit.jsx'));\nimport VisiblePassword from '../widgets/visible-password.jsx';\n\nimport HashNavigation from '../lib/navigation.js';\n\nexport default class PasswordResetView extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.state = {\n tel: '',\n email: '',\n password: '',\n sent: false,\n haveCode: false,\n code: ''\n };\n\n this.handleSubmit = this.handleSubmit.bind(this);\n this.handleEmailChange = this.handleEmailChange.bind(this);\n this.handlePasswordChange = this.handlePasswordChange.bind(this);\n this.handleCodeChange = this.handleCodeChange.bind(this);\n this.handleShowCodeField = this.handleShowCodeField.bind(this);\n\n // Connection will trigger change by changing the this.props.serverVersion.\n props.tinode.connect()\n .catch(err => {\n this.props.onError(err.message, 'err');\n });\n }\n\n componentDidMount() {\n const parsed = HashNavigation.parseUrlHash(window.location.hash);\n this.setState({token: parsed.params.token, scheme: parsed.params.scheme});\n }\n\n handleSubmit(e) {\n e.preventDefault();\n if (this.state.token) {\n // Reset using token.\n this.props.onReset(this.state.password.trim(), {\n scheme: 'token',\n token: this.state.token\n });\n } else if (this.state.code && this.props.reqCredMethod) {\n // Reset using security code.\n // The secret is structured as ::, \"123456:email:alice@example.com\".\n const cred = this.state.email.trim() || this.state.tel.trim();\n this.props.onReset(this.state.password.trim(), {\n scheme: 'code',\n secret: `${this.state.code}:${this.props.reqCredMethod}:${cred}`\n });\n } else {\n const email = this.state.email.trim();\n const tel = this.state.tel.trim();\n this.setState({email: email, tel: tel});\n this.props.onRequest(this.props.reqCredMethod, email || tel).then(_ => this.setState({sent: true}));\n }\n }\n\n handleEmailChange(e) {\n this.setState({email: e.target.value});\n }\n\n handlePasswordChange(e) {\n this.setState({password: e.target.value});\n }\n\n handleCodeChange(e) {\n this.setState({code: e.target.value.replace(/[^\\d]/g, '')});\n }\n\n handleShowCodeField(e) {\n e.preventDefault();\n this.setState({haveCode: true});\n }\n\n render() {\n const showCredentialInput = !(this.state.token && this.state.scheme);\n const showPasswordInput = !showCredentialInput || this.state.haveCode || this.state.sent;\n\n const passwordInput = (<>\n \n \n \n {\n (placeholder) => \n } \n >);\n\n const emailInput = (<>\n {this.state.haveCode ?\n null :\n \n \n \n }\n {\n (placeholder) => \n } \n >);\n\n const phoneInput = (<>\n {this.state.haveCode ?\n null :\n \n \n
\n }\n \n \n \n \n
\n \n
}>\n this.setState({tel: number})} />\n \n \n >);\n\n const sentNotification = (<>{\n this.props.reqCredMethod == 'email' ?\n {this.state.email}}}\n description=\"Notification that the email with password reset instructions has been sent\" />\n : this.props.reqCredMethod == 'tel' ?\n {this.state.tel}}}\n description=\"Notification that the SMS with password reset instructions has been sent\" />\n :\n null\n }>);\n\n const codeInput = (<>\n \n \n \n \n
\n \n {\n (numbers_only) => \n } \n
\n >);\n\n const credentialInput = this.props.reqCredMethod == 'email' ?\n emailInput : this.props.reqCredMethod == 'tel' ? phoneInput : null;\n\n return (\n \n );\n }\n}\n","// Tinode config panel.\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport CheckBox from '../widgets/checkbox.jsx';\n\nimport HostSelector from '../widgets/host-selector.jsx';\n\nexport default class SettingsView extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.state = {\n transport: props.transport || 'def',\n serverAddress: props.serverAddress,\n secureConnection: props.secureConnection,\n };\n\n this.handleSubmit = this.handleSubmit.bind(this);\n this.handleTransportSelected = this.handleTransportSelected.bind(this);\n this.handleServerAddressChange = this.handleServerAddressChange.bind(this);\n this.handleToggleSecure = this.handleToggleSecure.bind(this);\n }\n\n handleSubmit(e) {\n e.preventDefault();\n this.props.onUpdate({\n transport: this.state.transport,\n serverAddress: this.state.serverAddress,\n secureConnection: this.state.secureConnection,\n });\n }\n\n handleTransportSelected(e) {\n this.setState({transport: e.currentTarget.value});\n }\n\n handleServerAddressChange(name) {\n this.setState({serverAddress: name});\n }\n\n handleToggleSecure(e) {\n this.setState({secureConnection: !this.state.secureConnection});\n }\n\n render() {\n const names = {def: \"default\", ws: \"websocket\", lp: \"long polling\"};\n const transportOptions = [];\n ['def', 'ws', 'lp'].map((item) => {\n const id = 'transport-' + item;\n const name = names[item];\n transportOptions.push(\n \n \n {name} \n \n );\n });\n\n return (\n \n );\n }\n};\n","import React from 'react';\nimport { defineMessages, injectIntl } from 'react-intl';\n\nimport ErrorPanel from '../widgets/error-panel.jsx';\nimport LoadSpinner from '../widgets/load-spinner.jsx';\nimport SideNavbar from '../widgets/side-navbar.jsx';\nimport TopicCommonView from './topic-common-view.jsx';\n\nimport AccountSettingsView from './account-settings-view.jsx';\nimport ContactsView from './contacts-view.jsx';\nimport CreateAccountView from './create-account-view.jsx';\nimport AccNotificationsView from './acc-notifications-view.jsx';\nimport AccSecurityView from './acc-security-view.jsx';\nimport AccSupportView from './acc-support-view.jsx';\nimport LoginView from './login-view.jsx';\nimport NewTopicView from './new-topic-view.jsx';\nimport PasswordResetView from './password-reset-view.jsx';\nimport SettingsView from './settings-view.jsx';\nimport ValidationView from './validation-view.jsx';\n\n// Panel titles for translation.\nconst messages = defineMessages({\n login: {\n id: 'sidepanel_title_login',\n description: 'Sidepanel title for LoginView.',\n defaultMessage: 'Sign In'\n },\n register: {\n id: 'sidepanel_title_register',\n description: 'Sidepanel title for CreateAccountView.',\n defaultMessage: 'Create Account'\n },\n settings: {\n id: 'sidepanel_title_settings',\n description: 'Sidepanel title for SettingsView.',\n defaultMessage: 'Settings'\n },\n edit: {\n id: 'sidepanel_title_account_settings',\n description: 'Sidepanel title for AccountSettingsView.',\n defaultMessage: 'Account Settings'\n },\n general: {\n id: 'panel_title_general',\n description: 'Title for TopicCommon.',\n defaultMessage: 'General'\n },\n security: {\n id: 'panel_title_security',\n description: 'Title for TopicSecirity and AccSecurity.',\n defaultMessage: 'Security'\n },\n crop: {\n id: 'panel_title_crop',\n description: 'Title for AvatarCropView.',\n defaultMessage: 'Drag to Adjust'\n },\n notif: {\n id: 'sidepanel_title_acc_notifications',\n description: 'Sidepanel title for AccNotificationsView.',\n defaultMessage: 'Notifications'\n },\n support: {\n id: 'sidepanel_title_acc_support',\n description: 'Sidepanel title for AccSupportView.',\n defaultMessage: 'Support'\n },\n newtpk: {\n id: 'sidepanel_title_newtpk',\n description: 'Sidepanel title for NewTopicView.',\n defaultMessage: 'Start New Chat'\n },\n cred: {\n id: 'sidepanel_title_cred',\n description: 'Sidepanel title for ValidationView.',\n defaultMessage: 'Confirm Credentials'\n },\n reset: {\n id: 'sidepanel_title_reset',\n description: 'Sidepanel title for PasswordResetView.',\n defaultMessage: 'Reset Password'\n },\n archive: {\n id: 'sidepanel_title_archive',\n description: 'Sidepanel title for ContactsView-Archive.',\n defaultMessage: 'Archived Chats'\n },\n blocked: {\n id: 'sidepanel_title_blocked',\n description: 'Sidepanel title for ContactsView-Blocked.',\n defaultMessage: 'Blocked Chats'\n }\n});\n\nclass SidepanelView extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.handleNewTopic = this.handleNewTopic.bind(this);\n }\n\n handleNewTopic() {\n this.props.onNavigate('newtpk');\n }\n\n render() {\n const {formatMessage} = this.props.intl;\n const view = this.props.state || (this.props.myUserId ? 'contacts' : 'login');\n\n let title, avatar, badges;\n if (view == 'contacts') {\n title = this.props.title;\n avatar = this.props.avatar ? this.props.avatar : true;\n badges = this.props.trustedBadges;\n } else {\n title = formatMessage(messages[view]);\n avatar = false;\n badges = null;\n }\n\n let onCancel;\n if (['login', 'contacts'].indexOf(view) == -1) {\n onCancel = this.props.onCancel;\n }\n\n return (\n \n
\n\n
\n\n
\n\n {view === 'login' ?\n
:\n\n view === 'register' ?\n
:\n\n view === 'settings' ?\n
:\n\n view === 'edit' ?\n
:\n\n (view === 'general' || view === 'crop') ?\n
:\n\n view === 'notif' ?\n
:\n\n view === 'security' ?\n
:\n\n view === 'support' ?\n
:\n\n (view === 'contacts' || view == 'archive' || view == 'blocked') ?\n
:\n\n view === 'newtpk' ?\n
:\n\n view === 'cred' ?\n
:\n\n view === 'reset' ?\n
:\n null}\n
\n );\n }\n};\n\nexport default injectIntl(SidepanelView);\n","// The top-level class to hold all functionality together.\nimport React, { Suspense } from 'react';\nimport { FormattedMessage, defineMessages, injectIntl } from 'react-intl';\n\nimport { initializeApp as firebaseInitApp } from 'firebase/app';\nimport { getMessaging as firebaseGetMessaging, getToken as firebaseGetToken,\n deleteToken as firebaseDelToken, onMessage as firebaseOnMessage } from 'firebase/messaging';\n\nimport { Drafty, Tinode } from 'tinode-sdk';\n\nimport Alert from '../widgets/alert.jsx';\nimport ContextMenu from '../widgets/context-menu.jsx';\nimport ForwardDialog from '../widgets/forward-dialog.jsx';\nimport CallIncoming from '../widgets/call-incoming.jsx';\nconst PhoneCountrySelector = React.lazy(_ => import('../widgets/phone-country-selector.jsx'));\n\nimport InfoView from './info-view.jsx';\nimport MessagesView from './messages-view.jsx';\nimport SidepanelView from './sidepanel-view.jsx';\n\nimport { API_KEY, APP_NAME, DEFAULT_P2P_ACCESS_MODE, FORWARDED_PREVIEW_LENGTH, LOGGING_ENABLED,\n MEDIA_BREAKPOINT } from '../config.js';\nimport { CALL_STATE_NONE, CALL_STATE_OUTGOING_INITATED,\n CALL_STATE_INCOMING_RECEIVED, CALL_STATE_IN_PROGRESS,\n CALL_HEAD_STARTED } from '../constants.js';\nimport { PACKAGE_VERSION } from '../version.js';\nimport { base64ReEncode, makeImageUrl } from '../lib/blob-helpers.js';\nimport { detectServerAddress, isLocalHost, isSecureConnection } from '../lib/host-name.js';\nimport LocalStorageUtil from '../lib/local-storage.js';\nimport HashNavigation from '../lib/navigation.js';\nimport { secondsToTime } from '../lib/strformat.js'\nimport { updateFavicon } from '../lib/utils.js';\n\n// Sound to play on message received.\nconst POP_SOUND = new Audio('audio/msg.m4a');\n\nconst messages = defineMessages({\n reconnect_countdown: {\n id: 'reconnect_countdown',\n defaultMessage: 'Disconnected. Reconnecting in {seconds}…',\n description: 'Message shown when an app update is available.'\n },\n reconnect_now: {\n id: 'reconnect_now',\n defaultMessage: 'Try now',\n description: 'Prompt for reconnecting now'\n },\n push_init_failed: {\n id: 'push_init_failed',\n defaultMessage: 'Failed to initialize push notifications',\n description: 'Error message when push notifications have failed to initialize.'\n },\n invalid_security_token: {\n id: 'invalid_security_token',\n defaultMessage: 'Invalid security token',\n description: 'Error message when resetting password.'\n },\n no_connection: {\n id: 'no_connection',\n defaultMessage: 'No connection',\n description: 'Warning that the user is offline.'\n },\n code_doesnot_match: {\n id: 'code_doesnot_match',\n defaultMessage: 'Code does not match',\n description: 'Error message when the credential validation code is incorrect.'\n },\n menu_item_info: {\n id: 'menu_item_info',\n defaultMessage: 'Info',\n description: 'Show extended topic information'\n },\n menu_item_audio_call: {\n id: 'menu_item_audio_call',\n defaultMessage: 'Call',\n description: 'Start audio call'\n },\n menu_item_video_call: {\n id: 'menu_item_video_call',\n defaultMessage: 'Video call',\n description: 'Start video call'\n },\n cred_confirmed_successfully: {\n id: 'cred_confirmed_successfully',\n defaultMessage: 'Confirmed successfully',\n description: 'Message explaining that the credential was successfully validated.'\n }\n});\n\nclass TinodeWeb extends React.Component {\n constructor(props) {\n super(props);\n\n this.selfRef = React.createRef();\n\n this.state = this.getBlankState();\n\n this.handleResize = this.handleResize.bind(this);\n this.handleHashRoute = this.handleHashRoute.bind(this);\n this.handleOnline = this.handleOnline.bind(this);\n this.checkForAppUpdate = this.checkForAppUpdate.bind(this);\n this.handleVisibilityEvent = this.handleVisibilityEvent.bind(this);\n this.handleError = this.handleError.bind(this);\n this.handleLoginRequest = this.handleLoginRequest.bind(this);\n this.handlePersistenceChange = this.handlePersistenceChange.bind(this);\n this.handleConnected = this.handleConnected.bind(this);\n this.handleAutoreconnectIteration = this.handleAutoreconnectIteration.bind(this);\n this.doLogin = this.doLogin.bind(this);\n this.handleLoginSuccessful = this.handleLoginSuccessful.bind(this);\n this.handleDisconnect = this.handleDisconnect.bind(this);\n this.tnMeMetaDesc = this.tnMeMetaDesc.bind(this);\n this.tnMeContactUpdate = this.tnMeContactUpdate.bind(this);\n this.tnMeSubsUpdated = this.tnMeSubsUpdated.bind(this);\n this.resetContactList = this.resetContactList.bind(this);\n this.tnInitFind = this.tnInitFind.bind(this);\n this.tnFndSubsUpdated = this.tnFndSubsUpdated.bind(this);\n this.handleSearchContacts = this.handleSearchContacts.bind(this);\n this.handleTopicSelected = this.handleTopicSelected.bind(this);\n this.handleHideMessagesView = this.handleHideMessagesView.bind(this);\n this.handleSendMessage = this.handleSendMessage.bind(this);\n this.handleNewChatInvitation = this.handleNewChatInvitation.bind(this);\n this.handleNewAccount = this.handleNewAccount.bind(this);\n this.handleNewAccountRequest = this.handleNewAccountRequest.bind(this);\n this.handleUpdatePasswordRequest = this.handleUpdatePasswordRequest.bind(this);\n this.handleUpdateAccountTagsRequest = this.handleUpdateAccountTagsRequest.bind(this);\n this.handleToggleIncognitoMode = this.handleToggleIncognitoMode.bind(this);\n this.handleSettings = this.handleSettings.bind(this);\n this.handleGlobalSettings = this.handleGlobalSettings.bind(this);\n this.handleShowArchive = this.handleShowArchive.bind(this);\n this.handleShowBlocked = this.handleShowBlocked.bind(this);\n this.handleToggleMessageSounds = this.handleToggleMessageSounds.bind(this);\n this.handleCredAdd = this.handleCredAdd.bind(this);\n this.handleCredDelete = this.handleCredDelete.bind(this);\n this.handleCredConfirm = this.handleCredConfirm.bind(this);\n this.initFCMessaging = this.initFCMessaging.bind(this);\n this.toggleFCMToken = this.toggleFCMToken.bind(this);\n this.handlePushMessage = this.handlePushMessage.bind(this);\n this.handleSidepanelCancel = this.handleSidepanelCancel.bind(this);\n this.handleStartTopicRequest = this.handleStartTopicRequest.bind(this);\n this.handleNewTopicCreated = this.handleNewTopicCreated.bind(this);\n this.handleTopicUpdateRequest = this.handleTopicUpdateRequest.bind(this);\n this.handleUnarchive = this.handleUnarchive.bind(this);\n this.handleChangePermissions = this.handleChangePermissions.bind(this);\n this.handleTagsUpdateRequest = this.handleTagsUpdateRequest.bind(this);\n this.handleLogout = this.handleLogout.bind(this);\n this.handleDeleteAccount = this.handleDeleteAccount.bind(this);\n this.handleDeleteTopicRequest = this.handleDeleteTopicRequest.bind(this);\n this.handleDeleteMessagesRequest = this.handleDeleteMessagesRequest.bind(this);\n this.handleLeaveUnsubRequest = this.handleLeaveUnsubRequest.bind(this);\n this.handleBlockTopicRequest = this.handleBlockTopicRequest.bind(this);\n this.handleReportTopic = this.handleReportTopic.bind(this);\n this.handleShowContextMenu = this.handleShowContextMenu.bind(this);\n this.defaultTopicContextMenu = this.defaultTopicContextMenu.bind(this);\n this.handleHideContextMenu = this.handleHideContextMenu.bind(this);\n this.handleShowAlert = this.handleShowAlert.bind(this);\n this.handleShowInfoView = this.handleShowInfoView.bind(this);\n this.handleMemberUpdateRequest = this.handleMemberUpdateRequest.bind(this);\n this.handleValidateCredentialsRequest = this.handleValidateCredentialsRequest.bind(this);\n this.handlePasswordResetRequest = this.handlePasswordResetRequest.bind(this);\n this.handleResetPassword = this.handleResetPassword.bind(this);\n this.handleContextMenuAction = this.handleContextMenuAction.bind(this);\n this.handleShowCountrySelector = this.handleShowCountrySelector.bind(this);\n\n this.handleShowForwardDialog = this.handleShowForwardDialog.bind(this);\n this.handleHideForwardDialog = this.handleHideForwardDialog.bind(this);\n\n this.handleStartVideoCall = this.handleStartVideoCall.bind(this);\n this.handleStartAudioCall = this.handleStartAudioCall.bind(this);\n this.handleInfoMessage = this.handleInfoMessage.bind(this);\n this.handleDataMessage = this.handleDataMessage.bind(this);\n this.handleCallClose = this.handleCallClose.bind(this);\n\n this.handleCallInvite = this.handleCallInvite.bind(this);\n this.handleCallRinging = this.handleCallRinging.bind(this);\n this.handleCallHangup = this.handleCallHangup.bind(this);\n this.handleCallSendOffer = this.handleCallSendOffer.bind(this);\n this.handleCallIceCandidate = this.handleCallIceCandidate.bind(this);\n this.handleCallSendAnswer = this.handleCallSendAnswer.bind(this);\n\n this.handleCallAccept = this.handleCallAccept.bind(this);\n\n this.sendMessageToTopic = this.sendMessageToTopic.bind(this);\n\n // FIXME: this is unused.\n this.callTimeoutTimer = null;\n }\n\n getBlankState() {\n const settings = LocalStorageUtil.getObject('settings') || {};\n const persist = !!LocalStorageUtil.getObject('keep-logged-in');\n\n return {\n connected: false,\n // Connected and subscribed to 'me'\n ready: false,\n // Try to re-login on new connection.\n autoLogin: false,\n transport: settings.transport || null,\n serverAddress: settings.serverAddress || detectServerAddress(),\n secureConnection: settings.secureConnection === undefined ?\n isSecureConnection() : settings.secureConnection,\n serverVersion: \"no connection\",\n // \"On\" is the default, so saving the \"off\" state.\n messageSounds: !settings.messageSoundsOff,\n incognitoMode: false,\n // Persistent request to enable alerts.\n desktopAlerts: persist && !!settings.desktopAlerts,\n // Enable / disable checkbox.\n desktopAlertsEnabled: (isSecureConnection() || isLocalHost()) &&\n (typeof firebaseInitApp != 'undefined') && (typeof navigator != 'undefined') &&\n (typeof FIREBASE_INIT != 'undefined'),\n firebaseToken: persist ? LocalStorageUtil.getObject('firebase-token') : null,\n\n applicationVisible: !document.hidden,\n\n errorText: '',\n errorLevel: null,\n errorAction: undefined,\n errorActionText: null,\n\n sidePanelSelected: 'login',\n sidePanelTitle: null,\n sidePanelAvatar: null,\n myTrustedBadges: [],\n loadSpinnerVisible: false,\n\n login: '',\n password: '',\n persist: persist,\n myUserId: null,\n liveConnection: navigator.onLine,\n topicSelected: '',\n topicSelectedOnline: false,\n topicSelectedAcs: null,\n newTopicParams: null,\n loginDisabled: false,\n displayMobile: (window.innerWidth <= MEDIA_BREAKPOINT),\n infoPanel: undefined,\n mobilePanel: 'sidepanel',\n\n // Video calls.\n callTopic: undefined,\n callState: CALL_STATE_NONE,\n callAudioOnly: undefined,\n // If true, call state should be transitioned to CALL_STATE_IN_PROGRESS upon\n // switching to the call topic.\n callShouldStart: false,\n\n contextMenuVisible: false,\n contextMenuBounds: null,\n contextMenuClickAt: null,\n contextMenuParams: null,\n contextMenuItems: [],\n\n forwardDialogVisible: false,\n forwardMessage: null,\n\n // Modal alert dialog.\n alertVisible: false,\n alertParams: {},\n\n // Chats as shown in the ContactsView\n chatList: [],\n // Contacts returned by a search query.\n searchResults: [],\n // Merged results of a search query and p2p chats.\n searchableContacts: [],\n // Credential validation.\n reqCredMethod: undefined,\n credMethod: undefined,\n credCode: undefined,\n credToken: undefined,\n // Topic to go to after login.\n requestedTopic: undefined\n };\n }\n\n componentDidMount() {\n window.addEventListener('resize', this.handleResize);\n window.addEventListener('online', (e) => { this.handleOnline(true); });\n window.addEventListener('offline', (e) => { this.handleOnline(false); });\n window.addEventListener('hashchange', this.handleHashRoute);\n\n // Process background notifications from the service worker.\n if (typeof BroadcastChannel == 'function') {\n const serviceWorkerChannel = new BroadcastChannel('tinode-sw');\n serviceWorkerChannel.addEventListener('message', this.handlePushMessage);\n } else {\n // Safari is broken by design.\n console.warn(\"Your browser does not support BroadcastChannel. Some features will not be available\");\n }\n\n // Window/tab visible or invisible for pausing timers.\n document.addEventListener('visibilitychange', this.handleVisibilityEvent);\n\n this.setState({\n viewportWidth: document.documentElement.clientWidth,\n viewportHeight: document.documentElement.clientHeight\n });\n\n new Promise((resolve, reject) => {\n this.tinode = TinodeWeb.tnSetup(this.state.serverAddress, isSecureConnection(), this.state.transport,\n this.props.intl.locale, this.state.persist, resolve);\n this.tinode.onConnect = this.handleConnected;\n this.tinode.onDisconnect = this.handleDisconnect;\n this.tinode.onAutoreconnectIteration = this.handleAutoreconnectIteration;\n this.tinode.onInfoMessage = this.handleInfoMessage;\n this.tinode.onDataMessage = this.handleDataMessage;\n }).then(_ => {\n // Initialize desktop alerts.\n if (this.state.desktopAlertsEnabled) {\n this.initFCMessaging().catch(_ => {\n // do nothing: handled earlier.\n // catch needed to pervent unnecessary logging of error.\n });\n }\n\n // Parse and save the hash navigation params.\n const parsedNav = HashNavigation.parseUrlHash(window.location.hash);\n\n // Read contacts from cache.\n this.resetContactList();\n\n const token = this.state.persist ? LocalStorageUtil.getObject('auth-token') : undefined;\n if (token) {\n this.setState({autoLogin: true});\n\n // When reading from storage, date is returned as string.\n token.expires = new Date(token.expires);\n this.tinode.setAuthToken(token);\n this.tinode.connect().catch(err => {\n // Socket error\n this.handleError(err.message, 'err');\n });\n }\n\n this.readTimer = null;\n this.readTimerCallback = null;\n\n // Maybe navigate to home screen.\n if (!['cred', 'reset', 'register'].includes(parsedNav.path[0])) {\n // Save possible topic name.\n this.setState({requestedTopic: parsedNav.path[1]});\n const path = parsedNav.params && parsedNav.params.cred_done ?\n HashNavigation.addUrlParam('', 'cred_done', parsedNav.params.cred_done):\n '';\n HashNavigation.navigateTo(path);\n } else {\n this.handleHashRoute();\n }\n });\n }\n\n componentWillUnmount() {\n window.removeEventListener('resize', this.handleResize);\n window.removeEventListener('hashchange', this.handleHashRoute);\n document.removeEventListener('visibilitychange', this.handleVisibilityEvent);\n }\n\n // Setup transport (usually websocket) and server address. This will terminate connection with the server.\n static tnSetup(serverAddress, secureConnection, transport, locale, persistentCache, onSetupCompleted) {\n const tinode = new Tinode({appName: APP_NAME, host: serverAddress, apiKey: API_KEY, transport: transport,\n secure: secureConnection, persist: persistentCache}, onSetupCompleted);\n tinode.setHumanLanguage(locale);\n tinode.enableLogging(LOGGING_ENABLED, true);\n return tinode;\n }\n\n // Tinode received a push notification from the server.\n handlePushMessage(payload) {\n this.tinode.oobNotification(payload.data || {});\n }\n\n initFCMessaging() {\n const {formatMessage, locale} = this.props.intl;\n const onError = (msg, err) => {\n console.error(msg, err);\n this.handleError(formatMessage(messages.push_init_failed), 'err');\n this.setState({firebaseToken: null});\n LocalStorageUtil.updateObject('settings', {desktopAlerts: false});\n }\n\n try {\n this.fcm = firebaseGetMessaging(firebaseInitApp(FIREBASE_INIT, APP_NAME));\n return navigator.serviceWorker.getRegistration('/service-worker.js').then(reg => {\n return reg || navigator.serviceWorker.register('/service-worker.js').then(reg => {\n this.checkForAppUpdate(reg);\n return reg;\n });\n }).then(reg => {\n // Pass locale and version config to the service worker.\n (reg.active || reg.installing).postMessage(JSON.stringify({locale: locale, version: PACKAGE_VERSION}));\n // Request token.\n return TinodeWeb.requestFCMToken(this.fcm, reg);\n }).then(token => {\n const persist = LocalStorageUtil.getObject('keep-logged-in');\n if (token != this.state.firebaseToken) {\n this.tinode.setDeviceToken(token);\n if (persist) {\n LocalStorageUtil.setObject('firebase-token', token);\n }\n }\n this.setState({firebaseToken: token, desktopAlerts: true});\n if (persist) {\n LocalStorageUtil.updateObject('settings', {desktopAlerts: true});\n }\n\n // Handhe FCM pushes\n // (a) for channels always,\n // (b) pushes when the app is in foreground but has no focus.\n firebaseOnMessage(this.fcm, payload => { this.handlePushMessage(payload); });\n }).catch(err => {\n // SW registration or FCM has failed :(\n onError(err);\n throw err;\n });\n } catch (err) {\n onError(err);\n return Promise.reject(err);\n }\n }\n\n // Google's FCM API is idiotic.\n static requestFCMToken(fcm, sw) {\n return firebaseGetToken(fcm, {\n serviceWorkerRegistration: sw,\n vapidKey: FIREBASE_INIT.messagingVapidKey\n }).then(token => {\n if (token) {\n return token;\n } else {\n // Try to request permissions.\n return Notification.requestPermission().then(permission => {\n if (permission === 'granted') {\n return firebaseGetToken(fcm, {\n serviceWorkerRegistration: reg,\n vapidKey: FIREBASE_INIT.messagingVapidKey\n }).then(token => {\n if (token) {\n return token;\n } else {\n throw new Error(\"Failed to initialize notifications\");\n }\n });\n } else {\n throw new Error(\"No permission to send notifications: \" + permission);\n }\n });\n }\n });\n }\n\n handleResize() {\n const mobile = document.documentElement.clientWidth <= MEDIA_BREAKPOINT;\n this.setState({\n viewportWidth: document.documentElement.clientWidth,\n viewportHeight: document.documentElement.clientHeight\n });\n if (this.state.displayMobile != mobile) {\n this.setState({displayMobile: mobile});\n }\n }\n\n // Check if a newer version of TinodeWeb app is available at the server.\n checkForAppUpdate(reg) {\n reg.onupdatefound = _ => {\n const installingWorker = reg.installing;\n installingWorker.onstatechange = _ => {\n if (installingWorker.state == 'installed' && navigator.serviceWorker.controller) {\n const msg = <>\n \n \n .>;\n this.handleError(msg, 'info');\n }\n }\n }\n }\n\n // Handle for hash navigation (hashchange) event: update state.\n handleHashRoute() {\n const hash = HashNavigation.parseUrlHash(window.location.hash);\n // Start with panel parameters.\n const newState = {\n infoPanel: hash.params.info,\n newTopicTabSelected: hash.params.tab\n };\n\n if (hash.path && hash.path.length > 0) {\n // Left-side panel selector.\n if (['register','settings','edit','notif','security','support','general','crop',\n 'cred','reset','newtpk','archive','blocked','contacts',''].includes(hash.path[0])) {\n newState.sidePanelSelected = hash.path[0];\n } else {\n console.warn(\"Unknown sidepanel view\", hash.path[0]);\n }\n\n // Topic for MessagesView selector.\n let topicName = hash.path[1] || null;\n if (topicName != this.state.topicSelected) {\n if (!Tinode.topicType(topicName)) {\n // Clear invalid topic name.\n topicName = null;\n }\n Object.assign(newState, {\n topicSelected: topicName,\n topicSelectedAcs: this.tinode.getTopicAccessMode(topicName)\n });\n }\n } else {\n // Empty hashpath\n Object.assign(newState, {sidePanelSelected: '', topicSelected: null});\n }\n\n // Save credential validation parameters, if available.\n if (hash.params.method) {\n newState.credMethod = hash.params.method;\n }\n if (hash.params.code) {\n newState.credCode = hash.params.code;\n }\n if (hash.params.token) {\n newState.credToken = hash.params.token;\n }\n\n // Show a message if validation was successful.\n if (hash.params.cred_done) {\n Object.assign(newState,\n TinodeWeb.stateForError(this.props.intl.formatMessage(messages.cred_confirmed_successfully), 'info'));\n }\n\n this.setState(newState);\n }\n\n handleOnline(online) {\n if (online) {\n this.handleError();\n clearInterval(this.reconnectCountdown);\n this.tinode.reconnect();\n } else {\n this.handleError(this.props.intl.formatMessage(messages.no_connection), 'warn');\n }\n this.setState({liveConnection: online});\n }\n\n handleVisibilityEvent() {\n this.setState({applicationVisible: !document.hidden});\n }\n\n static stateForError(err, level, action, actionText) {\n return {\n errorText: err,\n errorLevel: level,\n errorAction: action,\n errorActionText: actionText,\n callShouldStart: false,\n };\n }\n\n handleError(err, level, action, actionText) {\n this.setState(TinodeWeb.stateForError(err, level, action, actionText));\n }\n\n // User clicked Login button in the side panel.\n handleLoginRequest(login, password) {\n this.setState({\n loginDisabled: true,\n login: login,\n password: password,\n loadSpinnerVisible: true,\n autoLogin: true\n });\n this.handleError('', null);\n\n if (this.tinode.isConnected()) {\n this.doLogin(login, password, null, {meth: this.state.credMethod, resp: this.state.credCode});\n } else {\n this.tinode.connect().catch(err => {\n // Socket error\n this.setState({loginDisabled: false, autoLogin: false, loadSpinnerVisible: false});\n this.handleError(err.message, 'err');\n });\n }\n\n if (this.state.desktopAlertsEnabled && !this.state.firebaseToken) {\n // Firefox and Safari: \"The Notification permission may only be requested from inside a\n // short running user-generated event handler\".\n this.initFCMessaging();\n }\n }\n\n // Enable or disable saving the password and IndexedDB.\n handlePersistenceChange(persist) {\n if (persist) {\n this.tinode.initStorage().then(_ => {\n LocalStorageUtil.setObject('keep-logged-in', true);\n this.setState({persist: true});\n });\n } else {\n this.tinode.clearStorage().then(_ => {\n LocalStorageUtil.setObject('keep-logged-in', false);\n this.setState({persist: false});\n });\n }\n }\n\n // Connection succeeded.\n handleConnected() {\n // Just to be sure.\n clearInterval(this.reconnectCountdown);\n this.handleError();\n\n const params = this.tinode.getServerInfo();\n this.setState({\n serverVersion: params.ver + ' ' + (params.build ? params.build : 'none'),\n // \"reqCred\":{\"auth\":[\"email\"]}\n reqCredMethod: ((params.reqCred || {}).auth || [])[0] || 'email'\n });\n\n if (this.state.autoLogin) {\n this.doLogin(this.state.login, this.state.password, null,\n {meth: this.state.credMethod, resp: this.state.credCode});\n }\n }\n\n // Called for each auto-reconnect iteration.\n handleAutoreconnectIteration(sec, prom) {\n clearInterval(this.reconnectCountdown);\n\n if (sec < 0) {\n // Clear error\n this.handleError();\n return;\n }\n\n if (prom) {\n // Reconnecting now\n prom.then(_ => {\n // Reconnected: clear error\n this.handleError();\n }).catch(err => {\n this.handleError(err.message, 'err');\n });\n return;\n }\n\n const {formatMessage} = this.props.intl;\n let count = sec / 1000;\n count = count | count;\n this.reconnectCountdown = setInterval(_ => {\n if (count < -10) {\n // Count could go to negative if computer woke up from sleep.\n clearInterval(this.reconnectCountdown);\n this.tinode.reconnect();\n return;\n }\n\n const fmtTime = (count > 99) ? secondsToTime(count) : count;\n this.handleError(\n formatMessage(messages.reconnect_countdown, {seconds: fmtTime}),\n 'warn',\n _ => {\n clearInterval(this.reconnectCountdown);\n this.tinode.reconnect();\n },\n formatMessage(messages.reconnect_now)\n );\n count -= 1;\n }, 1000);\n }\n\n // Connection lost\n handleDisconnect(err) {\n this.setState({\n connected: false,\n ready: false,\n topicSelectedOnline: false,\n errorText: err && err.message ? err.message : \"Disconnected\",\n errorLevel: err && err.message ? 'err' : 'warn',\n loginDisabled: false,\n contextMenuVisible: false,\n forwardDialogVisible: false,\n serverVersion: \"no connection\"\n });\n }\n\n doLogin(login, password, tmpToken, cred) {\n if (this.tinode.isAuthenticated()) {\n // Already logged in. Go to default screen.\n HashNavigation.navigateTo('');\n return;\n }\n\n let token = tmpToken || (this.tinode.getAuthToken() || {}).token;\n if (!(login && password) && !token) {\n // No login credentials provided.\n // Make sure we are on the login page.\n HashNavigation.navigateTo('');\n this.setState({loginDisabled: false});\n return;\n }\n\n // Sanitize and package credentail.\n cred = Tinode.credential(cred);\n // May be disconnected.\n let connectionPromise = this.tinode.isConnected() ? Promise.resolve() : this.tinode.connect();\n // Try to login with login/password. If they are not available, try token; if no token, ask for login/password.\n let loginPromise;\n if (login && password) {\n token = null;\n this.setState({password: null});\n loginPromise = connectionPromise.then(_ => this.tinode.loginBasic(login, password, cred));\n } else {\n loginPromise = connectionPromise.then(_ => this.tinode.loginToken(token, cred));\n }\n\n loginPromise.then(ctrl => {\n if (ctrl.code >= 300 && ctrl.text === 'validate credentials') {\n this.setState({loadSpinnerVisible: false});\n if (cred) {\n this.handleError(this.props.intl.formatMessage(messages.code_doesnot_match), 'warn');\n }\n TinodeWeb.navigateToCredentialsView(ctrl.params);\n } else {\n this.handleLoginSuccessful();\n }\n }).catch(err => {\n const autoLogin = err.code >= 500;\n // Connection or login failed, report error.\n this.setState({\n loginDisabled: false,\n credMethod: undefined,\n credCode: undefined,\n loadSpinnerVisible: false,\n autoLogin: autoLogin\n });\n this.handleError(err.message, 'err');\n console.warn(\"Login failed\", err);\n if (!autoLogin) {\n if (token) {\n this.handleLogout();\n }\n HashNavigation.navigateTo('');\n }\n });\n }\n\n static navigateToCredentialsView(params) {\n const parsed = HashNavigation.parseUrlHash(window.location.hash);\n parsed.path[0] = 'cred';\n parsed.params['method'] = params.cred[0];\n parsed.params['token'] = params.token;\n HashNavigation.navigateTo(HashNavigation.composeUrlHash(parsed.path, parsed.params));\n }\n\n handleLoginSuccessful() {\n this.handleError();\n\n // Refresh authentication token.\n if (LocalStorageUtil.getObject('keep-logged-in')) {\n LocalStorageUtil.setObject('auth-token', this.tinode.getAuthToken());\n }\n\n const goToTopic = this.state.requestedTopic;\n // Logged in fine, subscribe to 'me' attaching callbacks from the contacts view.\n const me = this.tinode.getMeTopic();\n me.onMetaDesc = this.tnMeMetaDesc;\n me.onContactUpdate = this.tnMeContactUpdate;\n me.onSubsUpdated = this.tnMeSubsUpdated;\n this.setState({\n connected: true,\n credMethod: undefined,\n credCode: undefined,\n credToken: undefined,\n myUserId: this.tinode.getCurrentUserID(),\n autoLogin: true,\n requestedTopic: undefined,\n });\n // Subscribe, fetch topic desc, the list of subscriptions. Messages are not fetched.\n me.subscribe(\n me.startMetaQuery().\n withLaterSub().\n withDesc().\n withTags().\n withCred().\n build()\n ).catch(err => {\n this.tinode.disconnect();\n localStorage.removeItem('auth-token');\n this.handleError(err.message, 'err');\n HashNavigation.navigateTo('');\n }).finally(_ => {\n this.setState({loadSpinnerVisible: false});\n });\n let urlHash = HashNavigation.setUrlSidePanel(window.location.hash, 'contacts');\n if (goToTopic) {\n urlHash = HashNavigation.setUrlTopic(urlHash, goToTopic);\n }\n HashNavigation.navigateTo(urlHash);\n }\n\n tnMeMetaDesc(desc) {\n if (desc) {\n if (desc.public) {\n this.setState({\n sidePanelTitle: desc.public.fn,\n sidePanelAvatar: makeImageUrl(desc.public.photo)\n });\n }\n if (desc.trusted) {\n const badges = [];\n for (const [key, val] of Object.entries(desc.trusted)) {\n if (val) {\n badges.push(key);\n }\n }\n this.setState({\n myTrustedBadges: badges,\n });\n }\n if (desc.acs) {\n this.setState({\n incognitoMode: !desc.acs.isPresencer()\n });\n }\n }\n }\n\n // Reactions to updates to the contact list.\n tnMeContactUpdate(what, cont) {\n if (what == 'on' || what == 'off') {\n this.resetContactList();\n if (this.state.topicSelected == cont.topic) {\n this.setState({topicSelectedOnline: (what == 'on')});\n }\n } else if (what == 'read') {\n this.resetContactList();\n } else if (what == 'msg') {\n // Check if the topic is archived. If so, don't play a sound.\n const topic = this.tinode.getTopic(cont.topic);\n const archived = topic && topic.isArchived();\n\n // New message received. Maybe the message is from the current user, then unread is 0.\n if (cont.unread > 0 && this.state.messageSounds && !archived) {\n // Skip update if the topic is currently open, otherwise the badge will annoyingly flash.\n if (document.hidden || this.state.topicSelected != cont.topic) {\n POP_SOUND.play().catch(_ => {\n // play() throws if the user did not click the app first: https://goo.gl/xX8pDD.\n });\n }\n }\n // Reorder contact list to use possibly updated 'touched'.\n this.resetContactList();\n } else if (what == 'recv') {\n // Explicitly ignoring \"recv\" -- it causes no visible updates to contact list.\n } else if (what == 'gone' || what == 'unsub') {\n // Topic deleted or user unsubscribed. Remove topic from view.\n // If the currently selected topic is gone, clear the selection.\n if (this.state.topicSelected == cont.topic) {\n this.handleTopicSelected(null);\n }\n // Redraw without the deleted topic.\n this.resetContactList();\n } else if (what == 'acs') {\n // Permissions changed. If it's for the currently selected topic,\n // update the views.\n if (this.state.topicSelected == cont.topic) {\n this.setState({topicSelectedAcs: cont.acs});\n }\n } else if (what == 'del') {\n // TODO: messages deleted (hard or soft) -- update pill counter.\n } else if (what == 'upd' || what == 'call') {\n // upd, call - handled by the SDK. Explicitly ignoring here.\n } else {\n // TODO(gene): handle other types of notifications:\n // * ua -- user agent changes (maybe display a pictogram for mobile/desktop).\n console.info(\"Unsupported (yet) presence update:\", what, \"in\", cont.topic);\n }\n }\n\n tnMeSubsUpdated(unused) {\n this.resetContactList();\n }\n\n // Merge search results and contact list to create a single flat\n // list of known contacts for GroupManager to use.\n static prepareSearchableContacts(chatList, foundContacts) {\n const merged = {};\n\n // For chatList topics merge only p2p topics and convert them to the\n // same format as foundContacts.\n for (const c of chatList) {\n if (Tinode.isP2PTopicName(c.topic)) {\n merged[c.topic] = {\n user: c.topic,\n updated: c.updated,\n public: c.public,\n private: c.private,\n acs: c.acs\n };\n }\n }\n\n // Add all foundCountacts if they have not been added already.\n for (const c of foundContacts) {\n if (!merged[c.user]) {\n merged[c.user] = c;\n }\n }\n\n return Object.values(merged);\n }\n\n resetContactList() {\n const newState = {\n chatList: []\n };\n\n if (!this.state.ready) {\n newState.ready = true;\n }\n\n this.tinode.getMeTopic().contacts((c) => {\n if (!c.topic && !c.user) {\n // Contacts expect c.topic to be set.\n c.topic = c.name;\n }\n\n newState.chatList.push(c);\n if (this.state.topicSelected == c.topic) {\n newState.topicSelectedOnline = c.online;\n newState.topicSelectedAcs = c.acs;\n }\n });\n\n const past = new Date(0);\n newState.chatList.sort((a, b) => {\n return (a.touched || past).getTime() - (b.touched || past).getTime();\n });\n\n // Merge search results and chat list.\n newState.searchableContacts = TinodeWeb.prepareSearchableContacts(newState.chatList, this.state.searchResults);\n this.setState(newState);\n }\n\n /* Fnd topic: find contacts by tokens */\n tnInitFind() {\n const fnd = this.tinode.getFndTopic();\n fnd.onSubsUpdated = this.tnFndSubsUpdated;\n if (fnd.isSubscribed()) {\n this.tnFndSubsUpdated();\n } else {\n fnd.subscribe(fnd.startMetaQuery().withSub().build()).catch(err => {\n this.handleError(err.message, 'err');\n });\n }\n }\n\n tnFndSubsUpdated() {\n const foundContacts = [];\n // Don't attempt to create P2P topics which already exist. Server will reject the duplicates.\n this.tinode.getFndTopic().contacts((s) => {\n foundContacts.push(s);\n });\n this.setState({\n searchResults: foundContacts,\n searchableContacts: TinodeWeb.prepareSearchableContacts(this.state.chatList, foundContacts)\n });\n }\n\n /** Called when the user enters a contact into the contact search field in the NewAccount panel\n @param query {Array} is an array of contacts to search for\n */\n handleSearchContacts(query) {\n const fnd = this.tinode.getFndTopic();\n fnd.setMeta({desc: {public: query}})\n .then(_ => fnd.getMeta(fnd.startMetaQuery().withSub().build()))\n .catch(err => this.handleError(err.message, 'err'));\n }\n\n // User clicked on a topic in the side panel or deleted a topic.\n handleTopicSelected(topicName) {\n // Clear newTopicParams after use.\n if (this.state.newTopicParams && this.state.newTopicParams._topicName != topicName) {\n this.setState({\n newTopicParams: null\n });\n }\n\n if (topicName) {\n this.setState({\n errorText: '',\n errorLevel: null,\n mobilePanel: 'topic-view',\n infoPanel: undefined\n });\n // Different topic selected.\n if (this.state.topicSelected != topicName) {\n this.setState({\n topicSelectedOnline: this.tinode.isTopicOnline(topicName),\n topicSelectedAcs: this.tinode.getTopicAccessMode(topicName),\n forwardMessage: null\n });\n HashNavigation.navigateTo(HashNavigation.setUrlTopic('', topicName));\n }\n } else {\n // Currently selected contact deleted\n this.setState({\n errorText: '',\n errorLevel: null,\n mobilePanel: 'sidepanel',\n topicSelectedOnline: false,\n topicSelectedAcs: null,\n infoPanel: undefined,\n forwardMessage: null\n });\n\n HashNavigation.navigateTo(HashNavigation.setUrlTopic('', null));\n }\n }\n\n // In mobile view user requested to show sidepanel\n handleHideMessagesView() {\n this.setState({\n mobilePanel: 'sidepanel'\n });\n HashNavigation.navigateTo(HashNavigation.setUrlTopic(window.location.hash, null));\n }\n\n // User is sending a message, either plain text or a drafty object, possibly\n // with attachments.\n // - msg - Drafty message with content\n // - promise - Promise to be resolved when the upload is completed\n // - uploadCompletionPromise - for tracking progress\n // - head - head dictionary to be attached to the message\n handleSendMessage(msg, uploadCompletionPromise, uploader, head) {\n const topic = this.tinode.getTopic(this.state.topicSelected);\n /* TODO: check if return is required */\n return this.sendMessageToTopic(topic, msg, uploadCompletionPromise, uploader, head);\n }\n\n sendMessageToTopic(topic, msg, uploadCompletionPromise, uploader, head) {\n msg = topic.createMessage(msg, false);\n // The uploader is used to show progress.\n msg._uploader = uploader;\n\n if (head) {\n msg.head = Object.assign(msg.head || {}, head);\n }\n\n const completion = [];\n if (uploadCompletionPromise) {\n completion.push(uploadCompletionPromise);\n }\n\n if (!topic.isSubscribed()) {\n // Topic is not subscribed yet. Subscribe.\n const subscribePromise =\n topic.subscribe()\n .then(_ => {\n // If there are unsent messages (except video call messages),\n // try sending them now. Unsent video call messages will be dropped.\n let calls = [];\n topic.queuedMessages(pub => {\n if (pub._sending || pub.seq == msg.seq) {\n return;\n }\n if (pub.head && pub.head.webrtc) {\n // Filter out unsent video call messages.\n calls.push(pub.seq);\n return;\n }\n if (topic.isSubscribed()) {\n topic.publishMessage(pub);\n }\n });\n if (calls.length > 0) {\n topic.delMessagesList(calls, true);\n }\n });\n completion.push(subscribePromise);\n }\n\n // TODO: check if return is required.\n return topic.publishDraft(msg, Promise.all(completion))\n .then(ctrl => {\n if (topic.isArchived()) {\n topic.archive(false);\n }\n return ctrl;\n })\n .catch(err => this.handleError(err.message, 'err'));\n }\n\n handleNewChatInvitation(topicName, action) {\n const topic = this.tinode.getTopic(topicName);\n let response = null;\n switch (action) {\n case 'accept':\n // Accept given permissions.\n const mode = topic.getAccessMode().getGiven();\n response = topic.setMeta({sub: {mode: mode}});\n if (topic.isP2PType()) {\n // For P2P topics change 'given' permission of the peer too.\n // In p2p topics the other user has the same name as the topic.\n response = response.then(_ => topic.setMeta({sub: {user: topicName, mode: mode}}));\n }\n break;\n case 'delete':\n // Ignore invitation by deleting it.\n response = topic.delTopic(true);\n break;\n case 'block':\n // Ban the topic making futher invites impossible.\n // Just self-ban.\n const am = topic.getAccessMode().updateWant('-JP').getWant();\n response = topic.setMeta({sub: {mode: am}}).then(_ => this.handleTopicSelected(null));\n break;\n default:\n console.warn(\"Unknown invitation action\", '\"' + action + '\"\"');\n }\n\n if (response != null) {\n response.catch(err => this.handleError(err.message, 'err'));\n }\n }\n\n // User chose a Sign Up menu item.\n handleNewAccount() {\n this.handleError();\n\n HashNavigation.navigateTo(HashNavigation.setUrlSidePanel(window.location.hash, 'register'));\n }\n\n // Actual registration of a new account.\n handleNewAccountRequest(login_, password_, public_, cred_, tags_) {\n // Clear old error, if any.\n this.handleError();\n\n this.tinode.connect(this.state.serverAddress)\n .then(_ => {\n let attachments;\n if (public_ && public_.photo && public_.photo.ref) {\n attachments = [public_.photo.ref];\n }\n return this.tinode.createAccountBasic(login_, password_,\n {public: public_, tags: tags_, cred: Tinode.credential(cred_), attachments: attachments});\n }).then(ctrl => {\n if (ctrl.code >= 300 && ctrl.text == 'validate credentials') {\n TinodeWeb.navigateToCredentialsView(ctrl.params);\n } else {\n this.handleLoginSuccessful(this);\n }\n }).catch(err => {\n this.handleError(err.message, 'err');\n });\n }\n\n handleToggleIncognitoMode(on) {\n // Make state undefined.\n this.setState({incognitoMode: null});\n\n const me = this.tinode.getMeTopic();\n const am = me.getAccessMode().updateWant(on ? '-P' : '+P').getWant();\n me.setMeta({sub: {mode: am}}).catch(err => {\n // Request failed, keep existing state.\n this.setState({incognitoMode: !on});\n this.handleError(err.message, 'err');\n });\n }\n\n handleUpdateAccountTagsRequest(_, tags) {\n this.tinode.getMeTopic().setMeta({tags: tags})\n .catch(err => this.handleError(err.message, 'err'));\n }\n\n // User chose Settings menu item.\n handleSettings() {\n this.handleError();\n\n HashNavigation.navigateTo(HashNavigation.setUrlSidePanel(window.location.hash,\n this.state.myUserId ? 'edit' : 'settings'));\n }\n\n // User updated global parameters.\n handleGlobalSettings(settings) {\n const serverAddress = settings.serverAddress || this.state.serverAddress;\n const transport = settings.transport || this.state.transport;\n const secureConnection = settings.secureConnection === undefined ?\n this.state.secureConnection : settings.secureConnection;\n if (this.tinode) {\n this.tinode.clearStorage();\n this.tinode.onDisconnect = undefined;\n this.tinode.disconnect();\n }\n this.tinode = TinodeWeb.tnSetup(serverAddress, secureConnection, transport,\n this.props.intl.locale, LocalStorageUtil.getObject('keep-logged-in'));\n this.tinode.onConnect = this.handleConnected;\n this.tinode.onDisconnect = this.handleDisconnect;\n this.tinode.onAutoreconnectIteration = this.handleAutoreconnectIteration;\n this.tinode.onInfoMessage = this.handleInfoMessage;\n this.tinode.onDataMessage = this.handleDataMessage;\n\n this.setState({\n serverAddress: serverAddress,\n transport: transport,\n secureConnection: secureConnection,\n });\n LocalStorageUtil.setObject('settings', {\n serverAddress: serverAddress,\n transport: transport,\n secureConnection: secureConnection,\n });\n\n HashNavigation.navigateTo(HashNavigation.setUrlSidePanel(window.location.hash, ''));\n }\n\n // User chose 'Archived chats'.\n handleShowArchive() {\n HashNavigation.navigateTo(HashNavigation.setUrlSidePanel(window.location.hash,\n this.state.myUserId ? 'archive' : ''));\n }\n\n // User viewes 'Blocked chats'.\n handleShowBlocked() {\n HashNavigation.navigateTo(HashNavigation.setUrlSidePanel(window.location.hash,\n this.state.myUserId ? 'blocked' : ''));\n }\n\n toggleFCMToken(enabled) {\n if (enabled) {\n this.setState({desktopAlerts: null});\n if (!this.state.firebaseToken) {\n this.initFCMessaging();\n } else {\n this.setState({desktopAlerts: true});\n if (LocalStorageUtil.getObject('keep-logged-in')) {\n LocalStorageUtil.updateObject('settings', {desktopAlerts: true});\n }\n }\n } else if (this.state.firebaseToken && this.fcm) {\n firebaseDelToken(this.fcm).catch(err => {\n console.error(\"Unable to delete token.\", err);\n }).finally(_ => {\n LocalStorageUtil.updateObject('settings', {desktopAlerts: false});\n localStorage.removeItem('firebase-token');\n this.setState({desktopAlerts: false, firebaseToken: null});\n // Inform the server that the token was deleted.\n this.tinode.setDeviceToken(null);\n });\n } else {\n this.setState({desktopAlerts: false, firebaseToken: null});\n LocalStorageUtil.updateObject('settings', {desktopAlerts: false});\n }\n }\n\n handleToggleMessageSounds(enabled) {\n this.setState({messageSounds: enabled});\n LocalStorageUtil.updateObject('settings', {\n messageSoundsOff: !enabled\n });\n }\n\n handleCredAdd(method, value) {\n const me = this.tinode.getMeTopic();\n me.setMeta({cred: {meth: method, val: value}})\n .catch(err => this.handleError(err.message, 'err'));\n }\n\n handleCredDelete(method, value) {\n const me = this.tinode.getMeTopic();\n me.delCredential(method, value)\n .catch(err => this.handleError(err.message, 'err'));\n }\n\n handleCredConfirm(method, response) {\n TinodeWeb.navigateToCredentialsView({cred: [method]});\n }\n\n // User clicked Cancel button in Setting or Sign Up panel.\n handleSidepanelCancel() {\n const parsed = HashNavigation.parseUrlHash(window.location.hash);\n let path = '';\n if (['security','support','general','notif'].includes(parsed.path[0])) {\n path = 'edit';\n } else if ('crop' == parsed.path[0]) {\n path = 'general';\n } else if ('blocked' == parsed.path[0]) {\n path = 'security';\n } else if (this.state.myUserId) {\n path = 'contacts';\n }\n parsed.path[0] = path;\n if (parsed.params) {\n delete parsed.params.code;\n delete parsed.params.method;\n delete parsed.params.tab;\n delete parsed.params.scheme;\n delete parsed.params.token;\n }\n HashNavigation.navigateTo(HashNavigation.composeUrlHash(parsed.path, parsed.params));\n this.setState({errorText: '', errorLevel: null});\n }\n\n // Sidepanel navigator. No need to bind to 'this'.\n basicNavigator(hash) {\n HashNavigation.navigateTo(HashNavigation.setUrlSidePanel(window.location.hash, hash));\n }\n\n // Topic info navigator. No need to bind to 'this'.\n infoNavigator(hash) {\n HashNavigation.navigateTo(HashNavigation.setUrlInfoPanel(window.location.hash, hash));\n }\n\n // Request to start a topic, new or selected from search results, or \"by ID\".\n handleStartTopicRequest(topicName, newTopicParams, isChannel) {\n // Check if topic is indeed new. If not, launch it.\n if (topicName && this.tinode.isTopicCached(topicName)) {\n this.handleTopicSelected(topicName);\n return;\n }\n\n const params = {};\n if (Tinode.isP2PTopicName(topicName)) {\n // Because we are initialing the subscription, set 'want' to all permissions.\n params.sub = {mode: DEFAULT_P2P_ACCESS_MODE};\n // Give the other user all permissions too.\n params.desc = {defacs: {auth: DEFAULT_P2P_ACCESS_MODE}};\n } else {\n topicName = topicName || this.tinode.newGroupTopicName(isChannel);\n if (newTopicParams) {\n params.desc = {public: newTopicParams.public, private: {comment: newTopicParams.private}};\n params.tags = newTopicParams.tags;\n }\n }\n params._topicName = topicName;\n this.setState({newTopicParams: params}, _ => {this.handleTopicSelected(topicName)});\n }\n\n // New topic was created, here is the new topic name.\n handleNewTopicCreated(oldName, newName) {\n let nextState = {};\n if (this.state.callShouldStart) {\n nextState = {callState: CALL_STATE_IN_PROGRESS, callShouldStart: false};\n }\n if (this.state.topicSelected == oldName && oldName != newName) {\n // If the current URl contains the old topic name, replace it with new.\n // Update the name of the selected topic first so the navigator doen't clear\n // the state.\n nextState.topicSelected = newName;\n }\n this.setState(nextState, _ => {\n HashNavigation.navigateTo(HashNavigation.setUrlTopic('', newName));\n });\n }\n\n handleTopicUpdateRequest(topicName, pub, priv, defacs) {\n this.handleError();\n\n const topic = this.tinode.getTopic(topicName);\n if (topic) {\n const params = {};\n let attachments;\n if (pub) {\n if (pub.photo) {\n if (pub.photo.ref && pub.photo.ref != Tinode.DEL_CHAR) {\n attachments = [pub.photo.ref];\n } else if (!pub.photo.data || pub.photo.data == Tinode.DEL_CHAR) {\n pub.photo = Tinode.DEL_CHAR;\n }\n }\n params.public = pub;\n }\n\n if (typeof priv == 'string') {\n params.private = (priv === Tinode.DEL_CHAR) ?\n Tinode.DEL_CHAR : {comment: priv};\n }\n if (defacs) {\n params.defacs = defacs;\n }\n topic.setMeta({desc: params, attachments: attachments})\n .catch(err => this.handleError(err.message, 'err'));\n }\n }\n\n handleUnarchive(topicName) {\n const topic = this.tinode.getTopic(topicName);\n if (topic) {\n topic.archive(false).catch(err => this.handleError(err.message, 'err'));\n }\n }\n\n handleUpdatePasswordRequest(password) {\n this.handleError();\n\n if (password) {\n this.tinode.updateAccountBasic(null, this.tinode.getCurrentLogin(), password)\n .catch(err => this.handleError(err.message, 'err'));\n }\n }\n\n handleChangePermissions(topicName, mode, uid) {\n const topic = this.tinode.getTopic(topicName);\n if (topic) {\n const am = topic.getAccessMode();\n if (uid) {\n am.updateGiven(mode);\n mode = am.getGiven();\n } else {\n am.updateWant(mode);\n mode = am.getWant();\n }\n topic.setMeta({sub: {user: uid, mode: mode}})\n .catch(err => this.handleError(err.message, 'err'));\n }\n }\n\n handleTagsUpdateRequest(topicName, tags) {\n const topic = this.tinode.getTopic(topicName);\n if (topic) {\n topic.setMeta({tags: tags})\n .catch(err => this.handleError(err.message, 'err'));\n }\n }\n\n handleLogout() {\n updateFavicon(0);\n\n // Remove stored data.\n localStorage.removeItem('auth-token');\n localStorage.removeItem('firebase-token');\n localStorage.removeItem('settings');\n if (this.state.firebaseToken) {\n firebaseDelToken(this.fcm);\n }\n\n clearInterval(this.reconnectCountdown);\n\n let cleared;\n if (this.tinode) {\n cleared = this.tinode.clearStorage();\n this.tinode.onDisconnect = undefined;\n this.tinode.disconnect();\n } else {\n cleared = Promose.resolve();\n }\n this.setState(this.getBlankState());\n\n cleared.then(_ => {\n this.tinode = TinodeWeb.tnSetup(this.state.serverAddress, isSecureConnection(),\n this.state.transport, this.props.intl.locale, LocalStorageUtil.getObject('keep-logged-in'), _ => {\n this.tinode.onConnect = this.handleConnected;\n this.tinode.onDisconnect = this.handleDisconnect;\n this.tinode.onAutoreconnectIteration = this.handleAutoreconnectIteration;\n this.tinode.onInfoMessage = this.handleInfoMessage;\n this.tinode.onDataMessage = this.handleDataMessage;\n HashNavigation.navigateTo('');\n })\n });\n }\n\n handleDeleteAccount() {\n this.tinode.delCurrentUser(true).then(_ => {\n this.handleLogout();\n });\n }\n\n handleDeleteTopicRequest(topicName) {\n const topic = this.tinode.getTopic(topicName);\n if (!topic) {\n return;\n }\n\n // Request to hard-delete topic.\n topic.delTopic(true).then(_ => {\n // Hide MessagesView and InfoView panels.\n HashNavigation.navigateTo(HashNavigation.setUrlTopic(window.location.hash, ''));\n }).catch(err => {\n this.handleError(err.message, 'err');\n });\n }\n\n handleDeleteMessagesRequest(topicName) {\n const topic = this.tinode.getTopic(topicName);\n if (!topic) {\n return;\n }\n\n // Request hard-delete all messages.\n topic.delMessagesAll(true)\n .catch(err => this.handleError(err.message, 'err'));\n }\n\n handleLeaveUnsubRequest(topicName) {\n const topic = this.tinode.getTopic(topicName);\n if (!topic) {\n return;\n }\n\n topic.leave(true).then(_ => {\n // Hide MessagesView and InfoView panels.\n HashNavigation.navigateTo(HashNavigation.setUrlTopic(window.location.hash, ''));\n }).catch(err => {\n this.handleError(err.message, 'err');\n });\n }\n\n handleBlockTopicRequest(topicName) {\n const topic = this.tinode.getTopic(topicName);\n if (!topic) {\n return;\n }\n\n topic.updateMode(null, '-JP')\n .then(_ => {\n // Hide MessagesView and InfoView panels.\n HashNavigation.navigateTo(HashNavigation.setUrlTopic(window.location.hash, ''));\n })\n .catch(err => this.handleError(err.message, 'err'));\n }\n\n handleReportTopic(topicName) {\n const topic = this.tinode.getTopic(topicName);\n if (!topic) {\n return;\n }\n\n // Publish spam report.\n this.tinode.report('report', topicName);\n\n // Remove J and P permissions.\n topic.updateMode(null, '-JP')\n .then(_ => {\n // Hide MessagesView and InfoView panels.\n HashNavigation.navigateTo(HashNavigation.setUrlTopic(window.location.hash, ''));\n })\n .catch(err => this.handleError(err.message, 'err'));\n }\n\n handleShowContextMenu(params, menuItems) {\n this.setState({\n contextMenuVisible: true,\n contextMenuClickAt: {x: params.x, y: params.y},\n contextMenuParams: params,\n contextMenuItems: menuItems || this.defaultTopicContextMenu(params.topicName),\n contextMenuBounds: this.selfRef.current.getBoundingClientRect()\n });\n }\n\n //\n handleShowForwardDialog(params) {\n if (this.state.sidePanelSelected == 'newtpk') {\n // If the Find panel is active, close it.\n this.handleSidepanelCancel();\n }\n const header = '➦ ' + params.userName;\n const content = typeof params.content == 'string' ? Drafty.init(params.content) : Drafty.forwardedContent(params.content);\n const preview = Drafty.preview(content, FORWARDED_PREVIEW_LENGTH, true);\n const msg = Drafty.append(Drafty.appendLineBreak(Drafty.mention(header, params.userFrom)), content);\n const msgPreview = Drafty.quote(header, params.userFrom, preview);\n\n const head = {\n forwarded: params.topicName + ':' + params.seq\n };\n this.setState({\n forwardDialogVisible: true,\n forwardMessage: { head: head, msg: msg, preview: msgPreview }\n });\n }\n\n defaultTopicContextMenu(topicName) {\n const topic = this.tinode.getTopic(topicName);\n\n if (topic._deleted) {\n return [\n 'topic_delete'\n ];\n }\n\n let muted = false, blocked = false, self_blocked = false, subscribed = false, deleter = false,\n archived = false, webrtc = false;\n if (topic) {\n subscribed = topic.isSubscribed();\n archived = topic.isArchived();\n\n const acs = topic.getAccessMode();\n if (acs) {\n muted = acs.isMuted();\n blocked = !acs.isJoiner();\n self_blocked = !acs.isJoiner('want');\n deleter = acs.isDeleter();\n }\n }\n\n webrtc = !!this.tinode.getServerParam('iceServers');\n\n return [\n subscribed ? {\n title: this.props.intl.formatMessage(messages.menu_item_info),\n handler: this.handleShowInfoView\n } : null,\n subscribed && Tinode.isP2PTopicName(topicName) && webrtc ? {\n title: this.props.intl.formatMessage(messages.menu_item_audio_call),\n handler: this.handleStartAudioCall\n } : null,\n subscribed && Tinode.isP2PTopicName(topicName) && webrtc ? {\n title: this.props.intl.formatMessage(messages.menu_item_video_call),\n handler: this.handleStartVideoCall\n } : null,\n subscribed ? 'messages_clear' : null,\n subscribed && deleter ? 'messages_clear_hard' : null,\n muted ? (blocked ? null : 'topic_unmute') : 'topic_mute',\n self_blocked ? 'topic_unblock' : 'topic_block',\n archived ? 'topic_restore' : 'topic_archive',\n 'topic_delete'\n ];\n }\n\n handleHideContextMenu() {\n this.setState({\n contextMenuVisible: false,\n contextMenuClickAt: null,\n contextMenuParams: null,\n contextMenuBounds: null\n });\n }\n\n handleHideForwardDialog(keepForwardedMessage) {\n this.setState({\n forwardDialogVisible: false,\n forwardMessage: keepForwardedMessage ? this.state.forwardMessage : null\n });\n }\n\n handleContextMenuAction(action, promise, params) {\n if (action == 'topic_archive') {\n if (promise && params.topicName && params.topicName == this.state.topicSelected) {\n promise.then(_ => {\n this.handleTopicSelected(null);\n });\n }\n } else if (action == 'menu_item_forward') {\n this.handleShowForwardDialog(params);\n }\n }\n\n handleShowAlert(title, content, onConfirm, confirmText, onReject, rejectText) {\n this.setState({\n alertVisible: true,\n alertParams: {\n title: title,\n content: content,\n onConfirm: onConfirm,\n confirm: confirmText,\n onReject: onReject,\n reject: rejectText\n }\n });\n }\n\n handleShowInfoView() {\n HashNavigation.navigateTo(HashNavigation.addUrlParam(window.location.hash, 'info', 'info'));\n this.setState({infoPanel: 'info'});\n }\n\n handleMemberUpdateRequest(topicName, added, removed) {\n if (!topicName) {\n return;\n }\n\n const topic = this.tinode.getTopic(topicName);\n if (!topic) {\n return;\n }\n\n if (added && added.length > 0) {\n added.map((uid) => {\n topic.invite(uid, null)\n .catch(err => this.handleError(err.message, 'err'));\n });\n }\n\n if (removed && removed.length > 0) {\n removed.map((uid) => {\n topic.delSubscription(uid)\n .catch(err => this.handleError(err.message, 'err'));\n });\n }\n }\n\n handleValidateCredentialsRequest(cred, code, token) {\n if (this.tinode.isAuthenticated()) {\n // Adding new email or phone number in account setting.\n this.tinode.getMeTopic().setMeta({cred: {meth: cred, resp: code}})\n .catch(err => this.handleError(err.message, 'err'));\n } else {\n // Credential validation on signup.\n this.setState({credMethod: cred, credCode: code, credToken: token});\n this.doLogin(null, null, token, {meth: cred, resp: code});\n }\n }\n\n handlePasswordResetRequest(method, value) {\n // If already connected, connnect() will return a resolved promise.\n return this.tinode.connect()\n .then(_ => this.tinode.requestResetAuthSecret('basic', method, value))\n .catch(err => {\n // Socket error\n this.handleError(err.message, 'err');\n });\n }\n\n handleResetPassword(newPassword, tempAuth) {\n const secret = base64ReEncode(tempAuth.secret);\n if (!secret || !tempAuth.scheme) {\n this.handleError(this.props.intl.formatMessage(messages.invalid_security_token), 'err');\n } else {\n this.tinode.connect()\n .then(_ => this.tinode.updateAccountBasic(null, null, newPassword, {scheme: tempAuth.scheme, secret: secret}))\n .then(_ => HashNavigation.navigateTo(''))\n .catch(err => {\n // Socket error\n this.handleError(err.message, 'err');\n });\n }\n }\n\n handleShowCountrySelector(code, dial, selectedCallback) {\n this.handleShowAlert(\"Select country\",\n }>\n {\n this.setState({alertVisible: false});\n selectedCallback(c, d);\n }} />\n ,\n null, null, _ => {}, \"Cancel\");\n }\n\n handleStartVideoCall() {\n this.setState({\n callTopic: this.state.topicSelected,\n callState: CALL_STATE_OUTGOING_INITATED,\n callAudioOnly: false\n });\n }\n\n handleStartAudioCall() {\n this.setState({\n callTopic: this.state.topicSelected,\n callState: CALL_STATE_OUTGOING_INITATED,\n callAudioOnly: true\n });\n }\n\n handleCallInvite(callTopic, callSeq, callState, audioOnly) {\n switch (callState) {\n case CALL_STATE_OUTGOING_INITATED:\n const head = { webrtc: CALL_HEAD_STARTED, aonly: !!audioOnly };\n this.handleSendMessage(Drafty.videoCall(audioOnly), undefined, undefined, head)\n .then(ctrl => {\n if (ctrl.code < 200 || ctrl.code >= 300 || !ctrl.params || !ctrl.params.seq) {\n this.handleCallClose();\n return;\n }\n this.setState({callSeq: ctrl.params['seq']});\n });\n break;\n case CALL_STATE_IN_PROGRESS:\n const topic = this.tinode.getTopic(callTopic);\n if (!topic) {\n return;\n }\n // We've accepted the call. Let the other side know.\n topic.videoCall('accept', callSeq);\n break;\n }\n }\n\n handleCallRinging(callTopic, callSeq) {\n const topic = this.tinode.getTopic(callTopic);\n if (!topic) {\n return;\n }\n\n topic.videoCall('ringing', callSeq);\n }\n\n handleCallHangup(callTopic, callSeq) {\n const topic = this.tinode.getTopic(callTopic);\n if (!topic) {\n return;\n }\n\n topic.videoCall('hang-up', callSeq);\n }\n\n handleCallSendOffer(callTopic, callSeq, sdp) {\n const topic = this.tinode.getTopic(callTopic);\n if (!topic) {\n return;\n }\n\n topic.videoCall('offer', callSeq, sdp);\n }\n\n handleCallIceCandidate(callTopic, callSeq, candidate) {\n const topic = this.tinode.getTopic(callTopic);\n if (!topic) {\n return;\n }\n\n topic.videoCall('ice-candidate', callSeq, candidate);\n }\n handleCallSendAnswer(callTopic, callSeq, sdp) {\n const topic = this.tinode.getTopic(callTopic);\n if (!topic) {\n return;\n }\n\n topic.videoCall('answer', callSeq, sdp);\n }\n\n handleCallClose() {\n if (this.callTimeoutTimer) {\n clearTimeout(this.callTimeoutTimer);\n }\n this.setState({\n callTopic: undefined,\n callState: CALL_STATE_NONE,\n callAudioOnly: undefined\n });\n }\n\n handleCallAccept(topicName) {\n const topic = this.tinode.getTopic(topicName);\n if (!topic) {\n return;\n }\n if (topic.isSubscribed()) {\n this.handleTopicSelected(this.state.callTopic);\n this.setState({\n callState: CALL_STATE_IN_PROGRESS\n });\n } else {\n // We need to switch and subscribe to callTopic first.\n this.setState({\n callShouldStart: true,\n }, _ => this.handleTopicSelected(this.state.callTopic));\n }\n }\n\n handleInfoMessage(info) {\n if (info.what != 'call') {\n return;\n }\n switch (info.event) {\n case 'accept':\n // If another my session has accepted the call.\n if (Tinode.isMeTopicName(info.topic) && this.tinode.isMe(info.from)) {\n this.setState({\n callTopic: null,\n callState: CALL_STATE_NONE,\n callSeq: null,\n callAudioOnly: undefined\n });\n return;\n }\n if (info.topic == this.state.callTopic) {\n // Update state.\n this.setState({callState: CALL_STATE_IN_PROGRESS});\n }\n break;\n case 'hang-up':\n // Remote hangup.\n this.handleCallClose();\n break;\n }\n }\n\n handleDataMessage(data) {\n if (data.head && data.head.webrtc && data.head.webrtc == CALL_HEAD_STARTED) {\n // If it's a video call invite message.\n // See if we need to display incoming call UI.\n const topic = this.tinode.getTopic(data.topic);\n if (topic) {\n // Check if a later version of the message exists (which means the call\n // has been either accepted or finished already).\n const msg = topic.latestMsgVersion(data.seq) || data;\n if (msg.head && msg.head.webrtc && msg.head.webrtc == CALL_HEAD_STARTED) {\n // This is a legit new call.\n if (data.from != this.state.myUserId) {\n if (this.state.callState == CALL_STATE_NONE) {\n // Incoming call.\n this.setState({\n callTopic: data.topic,\n callState: CALL_STATE_INCOMING_RECEIVED,\n callSeq: data.seq,\n callAudioOnly: !!msg.head.aonly\n });\n } else {\n // Another call is either in progress or being established.\n // Reject the incoming call.\n this.handleCallHangup(data.topic, data.seq);\n }\n }\n }\n } else {\n console.warn(\"Received vc data message from unknown topic\", data.topic);\n }\n }\n }\n\n render() {\n return (\n \n {this.state.contextMenuVisible ?\n
{\n if (topicName == this.state.topicSelected) {\n this.handleTopicSelected(null);\n }\n }}\n onError={this.handleError} />\n :\n null\n }\n {this.state.forwardDialogVisible ?\n \n :\n null\n }\n {this.state.callTopic && this.state.callState == CALL_STATE_INCOMING_RECEIVED ?\n \n :\n null\n }\n {this.state.alertVisible ?\n this.setState({alertVisible: false})) : null}\n reject={this.state.alertParams.reject}\n onConfirm={this.state.alertParams.onConfirm ?\n (_ => {this.setState({alertVisible: false}); this.state.alertParams.onConfirm();}) : null}\n confirm={this.state.alertParams.confirm}\n /> : null}\n \n\n \n\n {this.state.infoPanel ?\n \n :\n null\n }\n \n );\n }\n};\n\nexport default injectIntl(TinodeWeb);\n","// View for editing topic parameters (including 'me' topic).\n\nimport React from 'react';\n\nimport TopicDescEdit from '../widgets/topic-desc-edit.jsx';\n\nimport { arrayEqual } from '../lib/utils.js';\n\nexport default class TopicCommonView extends React.Component {\n constructor(props) {\n super(props);\n\n const topic = this.props.tinode.getTopic(this.props.topic);\n const acs = topic.getAccessMode();\n this.state = {\n tags: []\n };\n\n this.previousTagsUpdated = undefined;\n\n this.onTagsUpdated = this.onTagsUpdated.bind(this);\n this.handleTagsUpdated = this.handleTagsUpdated.bind(this);\n }\n\n // No need to separately handle component mount.\n componentDidUpdate(props) {\n const topic = this.props.tinode.getTopic(props.topic);\n if (!topic) {\n return;\n }\n\n if (topic.onTagsUpdated != this.onTagsUpdated) {\n if (topic.getType() == 'grp') {\n this.previousTagsUpdated = topic.onTagsUpdated;\n topic.onTagsUpdated = this.onTagsUpdated;\n } else {\n this.previousTagsUpdated = undefined;\n }\n }\n\n if (this.state.topic != props.topic) {\n this.setState({topic: props.topic});\n }\n }\n\n componentWillUnmount() {\n const topic = this.props.tinode.getTopic(this.props.topic);\n topic.onTagsUpdated = this.previousTagsUpdated;\n }\n\n // Server informs that the tags have been updated.\n onTagsUpdated(tags) {\n this.setState({tags: tags});\n\n if (this.previousTagsUpdated && this.previousTagsUpdated != this.onTagsUpdated) {\n this.previousTagsUpdated(tags);\n }\n }\n\n // Request server to change tags.\n handleTagsUpdated(tags) {\n if (!arrayEqual(this.state.tags.slice(0), tags.slice(0))) {\n this.props.onUpdateTagsRequest(this.props.topic, tags);\n }\n }\n\n render() {\n return (\n \n \n
\n );\n }\n};\n","// ValidationView: panel for confirming credentials, like email or phone.\nimport React from 'react';\nimport { FormattedMessage, defineMessages, injectIntl } from 'react-intl';\n\nconst messages = defineMessages({\n phone: {\n id: 'phone_dative',\n defaultMessage: 'phone',\n description: \"Dative case of 'phone', i.e. 'phone' in 'by phone'\",\n },\n email: {\n id: 'email_dative',\n defaultMessage: 'email',\n description: \"Dative case of 'email', i.e. 'email' in 'by email'\",\n }\n});\n\nclass ValidationView extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.state = {\n code: props.credCode || '',\n codeReceived: props.credCode\n };\n\n this.handleChange = this.handleChange.bind(this);\n this.handleKeyPress = this.handleKeyPress.bind(this);\n this.handleSubmit = this.handleSubmit.bind(this);\n this.handleCancel = this.handleCancel.bind(this);\n }\n\n static getDerivedStateFromProps(nextProps, prevState) {\n if (nextProps.credCode != prevState.codeReceived) {\n return {\n code: nextProps.credCode || '',\n codeReceived: nextProps.credCode\n };\n }\n\n return prevState;\n }\n\n componentDidMount() {\n // Submit code automatically if it's received from the parent.\n if (this.props.credCode) {\n this.props.onSubmit(this.props.credMethod, this.props.credCode, this.props.credToken);\n }\n }\n\n componentDidUpdate(prevProps, prevState) {\n // Submit code automatically if it's received from the parent.\n if (this.state.codeReceived && this.state.code && this.state.code != prevState.code) {\n this.props.onSubmit(this.props.credMethod, this.state.code, this.props.credToken);\n }\n }\n\n\n handleChange(e) {\n this.setState({code: e.target.value.trim()});\n }\n\n handleKeyPress(e) {\n if (e.key === 'Enter') {\n this.handleSubmit(e);\n } else if (e.key == 'Escape') {\n this.handleCancel(e);\n }\n }\n\n handleSubmit(e) {\n e.preventDefault();\n if (this.state.code && this.state.code.trim()) {\n this.props.onSubmit(this.props.credMethod, this.state.code.trim(), this.props.credToken);\n }\n }\n\n handleCancel(e) {\n e.preventDefault();\n this.props.onCancel();\n }\n\n render() {\n const { formatMessage } = this.props.intl;\n const methods = {'email': formatMessage(messages.email), 'tel': formatMessage(messages.phone)};\n const method = methods[this.props.credMethod] || this.props.credMethod;\n return (\n \n
\n \n \n \n
\n
\n {\n (numbers_only) => \n } \n
\n
\n \n \n \n \n \n \n
\n
\n );\n }\n};\n\nexport default injectIntl(ValidationView);\n","import React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nexport default class Alert extends React.PureComponent {\n render() {\n return (\n
\n
{this.props.title}
\n
{this.props.content}
\n
\n {this.props.onReject ?\n \n {this.props.reject || }\n \n :\n null\n }\n {this.props.onConfirm ?\n \n {this.props.confirm || }\n \n :\n null\n }\n
\n
\n
);\n }\n};\n","import React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport FileProgress from './file-progress.jsx';\nimport { bytesToHumanSize } from '../lib/strformat.js';\nimport { isUrlRelative, sanitizeUrl } from '../lib/utils.js';\n\nexport default class Attachment extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = {\n downloader: null,\n progress: 0\n };\n\n this.downloadFile = this.downloadFile.bind(this);\n this.handleCancel = this.handleCancel.bind(this);\n }\n\n downloadFile(url, filename, mimetype) {\n if (!url) {\n this.props.onError(\"Invalid download URL '\" + url + \"'\");\n return;\n }\n\n const downloader = this.props.tinode.getLargeFileHelper();\n this.setState({downloader: downloader});\n downloader.download(url, filename, mimetype,\n loaded => this.setState({progress: loaded / this.props.size}),\n err => this.props.onError(err, 'err')\n )\n .then(_ => this.setState({downloader: null, progress: 0}))\n .catch(err => {\n if (err) {\n this.props.onError(\"Error downloading file: \" + err.message, 'err');\n }\n this.setState({downloader: null, progress: 0});\n });\n }\n\n handleCancel() {\n if (this.props.uploading) {\n this.props.onCancelUpload();\n } else if (this.state.downloader) {\n this.state.downloader.cancel();\n }\n }\n\n render() {\n let filename = this.props.filename || 'file_attachment';\n if (filename.length > 36) {\n filename = filename.substr(0, 16) + '...' + filename.substr(-16);\n }\n let size = this.props.size > 0 ?\n ({bytesToHumanSize(this.props.size)}) :\n null;\n\n // Detect if the download URL is relative or absolute.\n // If the URL is relative use LargeFileHelper to attach authentication\n // credentials to the request.\n let url, helperFunc;\n if (!this.props.uploading && !this.state.downloader && isUrlRelative(this.props.downloadUrl)) {\n // Relative URL. Use download helper.\n url = '#';\n helperFunc = (e) => {\n e.preventDefault();\n this.downloadFile(this.props.downloadUrl, this.props.filename, this.props.mimetype);\n };\n } else {\n url = sanitizeUrl(this.props.downloadUrl);\n helperFunc = null;\n }\n const downloadWidget = <>file_download >;\n return (\n \n
insert_drive_file
\n
\n
{filename} {size}
\n {this.props.uploading || this.state.downloader ?\n
\n :\n
\n }\n
\n
\n );\n }\n};\n","// Audio recorder widget.\n\nimport React from 'react';\nimport { defineMessages, injectIntl } from 'react-intl';\n\nimport { secondsToTime } from '../lib/strformat';\nimport { base64ToIntArray } from '../lib/blob-helpers';\n\n// Make canvas bigger than the element size to reduce blurring.\nconst CANVAS_UPSCALING = 2.0;\n// Thickness of a visualization bar.\nconst LINE_WIDTH = 3 * CANVAS_UPSCALING;\n// Spacing between two visualization bars.\nconst SPACING = 2 * CANVAS_UPSCALING;\n// Color of histogram bars.\nconst BAR_COLOR = '#888A';\nconst BAR_COLOR_DARK = '#666C';\nconst THUMB_COLOR = '#444E';\n// Minimum number of amplitude bars to draw.\nconst MIN_PREVIEW_LENGTH = 16;\n\nconst messages = defineMessages({\n icon_title_play: {\n id: 'icon_title_play',\n defaultMessage: 'Play recording',\n description: 'Icon tool tip for starting audio playback'\n }\n});\n\nclass AudioPlayer extends React.PureComponent {\n constructor(props) {\n super(props);\n\n let preview = base64ToIntArray(this.props.preview);\n if (!Array.isArray(preview) || preview.length < MIN_PREVIEW_LENGTH) {\n preview = null;\n }\n\n this.state = {\n canPlay: false,\n playing: false,\n currentTime: '0:00',\n duration: this.props.duration > 0 ? secondsToTime(this.props.duration / 1000) : '-:--',\n longMin: this.props.duration >= 600000,\n preview: preview\n };\n\n this.initAudio = this.initAudio.bind(this);\n this.initCanvas = this.initCanvas.bind(this);\n this.resampleBars = this.resampleBars.bind(this);\n this.visualize = this.visualize.bind(this);\n\n this.handlePlay = this.handlePlay.bind(this);\n this.handleSeek = this.handleSeek.bind(this);\n this.handleError = this.handleError.bind(this);\n\n this.audioPlayer = null;\n\n this.viewBuffer = [];\n this.canvasRef = React.createRef();\n }\n\n componentDidMount() {\n if (this.props.src) {\n this.initAudio();\n }\n\n this.initCanvas();\n }\n\n componentWillUnmount() {\n if (this.audioPlayer) {\n this.audioPlayer.oncanplay = null;\n this.audioPlayer.ontimeupdate = null;\n this.audioPlayer.onended = null;\n this.audioPlayer.pause();\n this.audioPlayer = null;\n }\n }\n\n componentDidUpdate(prevProps) {\n if (this.props.src != prevProps.src) {\n this.initAudio();\n }\n\n if (this.props.preview != prevProps.preview) {\n let preview = base64ToIntArray(this.props.preview);\n if (!Array.isArray(preview) || preview.length < MIN_PREVIEW_LENGTH) {\n preview = null;\n }\n this.setState({preview: preview}, this.initCanvas);\n }\n }\n\n initAudio() {\n this.audioPlayer = new Audio(this.props.src);\n this.audioPlayer.oncanplay = _ => this.setState({canPlay: true});\n this.audioPlayer.ontimeupdate = _ => this.setState({\n currentTime: secondsToTime(this.audioPlayer.currentTime, this.state.longMin)\n });\n this.audioPlayer.onended = _ => {\n this.audioPlayer.currentTime = 0;\n this.setState({playing: false, currentTime: secondsToTime(0, this.state.longMin)})\n }\n }\n\n initCanvas() {\n // Force canvas aspect ratio to match one of the element + upscale canvas to reduce blurring.\n this.canvasRef.current.width = this.canvasRef.current.offsetWidth * CANVAS_UPSCALING;\n this.canvasRef.current.height = this.canvasRef.current.offsetHeight * CANVAS_UPSCALING;\n\n this.canvasContext = this.canvasRef.current.getContext('2d');\n this.canvasContext.lineCap = 'round';\n\n this.viewBuffer = this.resampleBars(this.state.preview);\n this.visualize();\n }\n\n // Draw amplitude of sound.\n visualize() {\n if (!this.canvasRef.current) {\n return;\n }\n\n const width = this.effectiveWidth;\n const height = this.canvasRef.current.height;\n\n this.canvasContext.lineWidth = LINE_WIDTH;\n\n const drawFrame = _ => {\n if (!this.canvasRef.current || !this.audioPlayer) {\n // The component is unmounted.\n return;\n }\n\n this.canvasContext.clearRect(0, 0, this.canvasRef.current.width, height);\n\n if (this.viewBuffer) {\n if (this.state.playing) {\n window.requestAnimationFrame(drawFrame);\n }\n\n // Current playback position.\n const thumbAt = this.props.duration ?\n Math.max(0, Math.min(this.audioPlayer.currentTime * 1000 / this.props.duration, 1)) * (width - LINE_WIDTH * 2) : -1;\n\n // Draw amplitude bars.\n this.canvasContext.beginPath();\n this.canvasContext.strokeStyle = BAR_COLOR_DARK;\n for (let i = 0; i < this.viewBuffer.length; i++) {\n let x = 1 + i * (LINE_WIDTH + SPACING) + LINE_WIDTH * 0.5;\n let y = this.viewBuffer[i] * height * 0.9;\n\n const color = x < thumbAt ? BAR_COLOR_DARK : BAR_COLOR;\n if (this.canvasContext.strokeStyle != color) {\n this.canvasContext.stroke();\n this.canvasContext.beginPath();\n this.canvasContext.strokeStyle = color;\n }\n\n this.canvasContext.moveTo(x, (height - y) * 0.5);\n this.canvasContext.lineTo(x, height * 0.5 + y * 0.5);\n }\n // Actually draw the bars on canvas.\n this.canvasContext.stroke();\n\n // Draw thumb.\n if (this.props.duration) {\n this.canvasContext.beginPath();\n this.canvasContext.arc(thumbAt + LINE_WIDTH * 2, height * 0.5, LINE_WIDTH * 2, 0, 2 * Math.PI);\n this.canvasContext.fillStyle = THUMB_COLOR;\n this.canvasContext.fill();\n }\n }\n }\n\n drawFrame();\n }\n\n // Quick and dirty downsampling of the original preview bars into a smaller (or equal) number of bars we can display here.\n resampleBars(original) {\n const dstCount = ((this.canvasRef.current.width - SPACING) / (LINE_WIDTH + SPACING)) | 0;\n // Remove extra padding on the right due to fractional bar which is not drawn.\n this.effectiveWidth = dstCount * (LINE_WIDTH + SPACING) + SPACING;\n\n if (!Array.isArray(original) || original.length == 0) {\n return Array.apply(null, Array(dstCount)).map(_ => 0.01);\n }\n\n const factor = original.length / dstCount;\n let amps = [];\n let maxAmp = -1;\n for (let i=0; i 0) {\n return amps.map(a => a / maxAmp);\n }\n return Array.apply(null, Array(dstCount)).map(_ => 0.01);\n }\n\n handlePlay(e) {\n e.preventDefault();\n if (!this.state.canPlay) {\n return;\n }\n if (this.state.playing) {\n this.audioPlayer.pause();\n this.setState({playing: false});\n } else {\n this.audioPlayer.play();\n this.setState({playing: true}, this.visualize);\n }\n }\n\n handleError(err) {\n console.error(err);\n }\n\n handleSeek(e) {\n e.preventDefault();\n if (e.target && this.props.duration) {\n const rect = e.target.getBoundingClientRect();\n const offset = (e.clientX - rect.left) / this.effectiveWidth * CANVAS_UPSCALING;\n this.audioPlayer.currentTime = this.props.duration * offset / 1000;\n this.setState({currentTime: secondsToTime(this.audioPlayer.currentTime, this.state.longMin)});\n if (!this.state.playing) {\n this.visualize();\n }\n }\n }\n\n render() {\n const playClass = 'material-icons' +\n (this.props.short ? '' : ' large') +\n (this.state.canPlay ? '' : ' disabled');\n const play = (\n {this.state.playing ? 'pause_circle' :\n (this.state.canPlay ? 'play_circle' : 'not_interested')} \n );\n return ({this.props.short ?\n <>\n
\n {play}\n >\n :\n <>\n {play}\n
\n
\n
{this.state.currentTime}/{this.state.duration}
\n
\n >\n }\n
);\n }\n}\n\nexport default injectIntl(AudioPlayer);\n","// Edit account parameters.\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport Cropper from './cropper.jsx';\nimport { imageCrop } from '../lib/blob-helpers.js';\n\nexport default class AvatarCrop extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.state = {\n top: 0,\n left: 0,\n width: 0,\n height: 0,\n scale: 1\n };\n\n this.handleSubmit = this.handleSubmit.bind(this);\n this.handleChange = this.handleChange.bind(this);\n }\n\n // Cut out in image coordinates and desired scale factor.\n handleChange(left, top, width, height, scale) {\n this.setState({\n left: left,\n top: top,\n width: width,\n height: height,\n scale: scale\n });\n }\n\n handleSubmit() {\n imageCrop(this.props.mime, this.props.avatar,\n this.state.left, this.state.top, this.state.width, this.state.height,\n this.state.scale)\n .then(img => {\n this.props.onSubmit(img.mime, img.blob, img.width, img.height);\n })\n .catch(err => {\n this.props.onError(err);\n });\n }\n\n render() {\n return (\n \n
\n \n
\n
\n {this.props.onCancel ?\n \n \n \n : null}\n \n \n \n
\n
\n );\n }\n};\n","import React from 'react';\n\nimport LetterTile from './letter-tile.jsx';\nimport LoadSpinner from './load-spinner.jsx';\n\nimport { sanitizeUrlForMime } from '../lib/utils.js';\n\nimport { AVATAR_SIZE } from '../config.js';\n\nexport default class AvatarUpload extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = {\n source: props.avatar\n };\n\n this.handleFileReceived = this.handleFileReceived.bind(this);\n }\n\n componentDidUpdate(prevProps) {\n if (this.props.avatar != prevProps.avatar) {\n this.setState({source: this.props.avatar});\n }\n }\n\n handleFileReceived(e) {\n const image = e.target.files[0];\n this.props.onImageUpdated(image.type, URL.createObjectURL(image), image.name);\n // Clear the value so the same file can be uploaded again.\n e.target.value = '';\n }\n\n render() {\n // Randomize id value in case more than one AvatarUpload is shown\n // at the same time.\n const randId = 'file-input-avatar-' + ('' + Math.random()).substring(0, 4);\n const className = 'avatar-upload' + (this.props.readOnly ? ' read-only' : '');\n return (\n \n {this.props.readOnly || !this.state.source ?\n null :\n
{e.preventDefault(); this.props.onImageUpdated();}}>\n clear \n }\n {this.state.source ?\n
:\n this.props.readOnly && this.props.uid ?\n
\n \n
\n :\n
{AVATAR_SIZE}×{AVATAR_SIZE}
}\n {this.props.readOnly ? null :\n
}\n {this.props.readOnly ? null :\n
\n file_upload \n }\n
\n
\n );\n }\n};\n","import React from 'react';\nimport { defineMessages, injectIntl } from 'react-intl';\n\nconst icon_mapping = {'staff': 'verified_user'};\n\nconst messages = defineMessages({\n badge_verified: {\n id: 'badge_verified',\n defaultMessage: 'Verified/official',\n description: 'Explanation of a verified account or topic badge'\n },\n badge_staff: {\n id: 'badge_staff',\n defaultMessage: 'Staff-managed',\n description: 'Explanation of a staff-managed account or topic badge'\n },\n badge_danger: {\n id: 'badge_danger',\n defaultMessage: 'Untrustworthy',\n description: 'Suspicious or untrustworthy account or topic badge'\n },\n});\n\n\n/* Trusted badges with labels: verified, staff, danger */\nclass BadgeList extends React.PureComponent {\n render() {\n const {formatMessage} = this.props.intl;\n let badges = null;\n if (this.props.trustedBadges && this.props.trustedBadges.length > 0) {\n badges = [];\n this.props.trustedBadges.map((b) => {\n const comment = this.props.short ? null : formatMessage(messages['badge_' + b]);\n const style = 'material-icons ' + b + '-color';\n badges.push({icon_mapping[b] || b} {comment}
);\n });\n return <>{badges}>;\n }\n return null;\n }\n};\n\nexport default injectIntl(BadgeList);\n","// The <- button to be displayed in title bars.\nimport React from 'react';\n\nexport default class ButtonBack extends React.PureComponent {\n render() {\n return (\n {e.preventDefault(); this.props.onBack();}}>\n arrow_back \n \n );\n }\n}\n","// IncomingCall: displays Accept & Reject buttons for incoming calls.\nimport React from 'react';\n\nimport BadgeList from './badge-list.jsx';\nimport LetterTile from './letter-tile.jsx';\n\nimport { MAX_TITLE_LENGTH, MAX_PEER_TITLE_LENGTH } from '../config.js';\nimport { CALL_STATE_INCOMING_RECEIVED } from '../constants.js';\n\nimport { makeImageUrl } from '../lib/blob-helpers.js';\nimport { clipStr } from '../lib/utils.js'\n\nconst RING_SOUND = new Audio('audio/call-in.m4a');\n\nexport default class CallIncoming extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = {\n topic: null,\n fullName: undefined,\n avatar: null,\n trustedBadges: [],\n previousMetaDesc: undefined,\n };\n\n this.resetDesc = this.resetDesc.bind(this);\n this.onMetaDesc = this.onMetaDesc.bind(this);\n this.handleRejectCall = this.handleRejectCall.bind(this);\n this.handleAcceptCall = this.handleAcceptCall.bind(this);\n this.ringTimer = null;\n }\n\n componentDidMount() {\n const topic = this.props.tinode.getTopic(this.props.topic);\n if (!topic) {\n return;\n }\n\n this.resetDesc(topic);\n if (this.props.callState == CALL_STATE_INCOMING_RECEIVED) {\n // play() throws if the user did not click the app first: https://goo.gl/xX8pDD.\n RING_SOUND.play().catch(_ => {});\n this.ringTimer = setInterval(_ => {RING_SOUND.play().catch(_ => {})}, 2000);\n this.props.onRinging(this.props.topic, this.props.seq);\n }\n }\n\n // No need to separately handle component mount.\n componentDidUpdate(props) {\n const topic = this.props.tinode.getTopic(props.topic);\n if (!topic) {\n return;\n }\n\n if (this.onMetaDesc != topic.onMetaDesc) {\n this.previousMetaDesc = topic.onMetaDesc;\n topic.onMetaDesc = this.onMetaDesc;\n }\n\n if (this.state.topic != props.topic) {\n this.setState({topic: props.topic});\n this.resetDesc(topic, props);\n }\n }\n\n componentWillUnmount() {\n if (this.ringTimer != null) {\n clearInterval(this.ringTimer);\n RING_SOUND.pause();\n }\n const topic = this.props.tinode.getTopic(this.props.topic);\n if (!topic) {\n return;\n }\n this.setState({topic: null});\n topic.onMetaDesc = this.previousMetaDesc;\n }\n\n resetDesc(topic) {\n const badges = [];\n if (topic.trusted) {\n for (const [key, val] of Object.entries(topic.trusted)) {\n if (val) {\n badges.push(key);\n }\n }\n }\n\n this.setState({\n fullName: clipStr(topic.public ? topic.public.fn : undefined, MAX_TITLE_LENGTH),\n avatar: makeImageUrl(topic.public ? topic.public.photo : null),\n trustedBadges: badges,\n });\n }\n\n onMetaDesc(desc) {\n const topic = this.props.tinode.getTopic(this.props.topic);\n if (!topic) {\n return;\n }\n this.resetDesc(topic);\n\n if (this.previousMetaDesc && this.previousMetaDesc != this.onMetaDesc) {\n this.previousMetaDesc(desc);\n }\n }\n\n handleAcceptCall() {\n this.props.onAcceptCall(this.props.topic);\n }\n\n handleRejectCall() {\n this.props.onReject(this.props.topic, this.props.seq);\n this.props.onClose();\n }\n\n render() {\n return (\n \n
\n
\n
\n \n
\n
{clipStr(this.state.fullName, MAX_PEER_TITLE_LENGTH)}\n
\n
\n
\n {this.props.callState == CALL_STATE_INCOMING_RECEIVED ?\n <>\n \n call_end \n \n \n call \n \n >\n :\n null\n }\n
\n
\n
\n );\n }\n};\n","// Chat message describing a video or voice call.\n\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport { secondsToTime } from '../lib/strformat.js';\n\nexport default class CallMessage extends React.PureComponent {\n render() {\n const isCallDropped = ['declined', 'disconnected', 'missed'].includes(this.props.callState);\n const successClass = 'material-icons medium ' + (isCallDropped ? 'red' : 'green');\n const callIcon = this.props.incoming ?\n (isCallDropped ? 'call_missed' : 'call_received') :\n (isCallDropped ? 'call_missed_outgoing' : 'call_made');\n let duration;\n if (isCallDropped) {\n switch (this.props.callState) {\n case 'declined':\n duration = ;\n break;\n case 'missed':\n duration = this.props.incoming ?\n :\n ;\n break;\n default:\n duration = ;\n break;\n }\n } else {\n duration = {secondsToTime(this.props.duration / 1000)} ;\n }\n return \n
call
\n
\n
{this.props.incoming ?\n :\n \n }
\n
{callIcon} {duration}
\n
\n
;\n }\n}\n","// CallPanel displays call in progress: local and remote viewports and controls.\nimport React from 'react';\nimport { FormattedMessage, defineMessages, injectIntl } from 'react-intl';\n\nimport LetterTile from './letter-tile.jsx';\n\nimport { MAX_PEER_TITLE_LENGTH } from '../config.js';\nimport { CALL_STATE_OUTGOING_INITATED, CALL_STATE_IN_PROGRESS } from '../constants.js';\n\nimport { clipStr } from '../lib/utils.js'\n\nconst RING_SOUND = new Audio('audio/call-out.m4a');\nRING_SOUND.loop = true;\nconst CALL_ENDED_SOUND = new Audio('audio/call-end.m4a');\nCALL_ENDED_SOUND.loop = true;\nconst DIALING_SOUND = new Audio('audio/dialing.m4a');\n\nconst VIDEO_MUTED_EVENT = 'video:muted';\nconst VIDEO_UNMUTED_EVENT = 'video:unmuted';\n\nconst messages = defineMessages({\n already_in_call: {\n id: 'already_in_call',\n defaultMessage: 'You already in an ongoing call!',\n description: 'Error message when the user tried to accept a new call without finishing pervious one',\n }\n});\n\nclass CallPanel extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.state = {\n localStream: undefined,\n remoteStream: undefined,\n pc: undefined,\n dataChannel: undefined,\n\n previousOnInfo: undefined,\n waitingForPeer: false,\n // If true, the client has received a remote SDP from the peer and has sent a local SDP to the peer.\n callInitialSetupComplete: false,\n audioOnly: props.callAudioOnly,\n // Video mute/unmute in progress.\n videoToggleInProgress: false,\n // Indicates if the remote peer has informed us that their camera is on.\n remoteVideoLive: false,\n };\n\n this.localStreamConstraints = {\n audio: true,\n video: !props.callAudioOnly\n };\n this.isOutgoingCall = props.callState == CALL_STATE_OUTGOING_INITATED;\n\n this.localRef = React.createRef();\n this.remoteRef = React.createRef();\n // Cache for remote ice candidates until initial setup gets completed.\n this.remoteIceCandidatesCache = [];\n\n this.onInfo = this.onInfo.bind(this);\n this.start = this.start.bind(this);\n this.stop = this.stop.bind(this);\n\n this.createPeerConnection = this.createPeerConnection.bind(this);\n this.canSendOffer = this.canSendOffer.bind(this);\n this.drainRemoteIceCandidatesCache = this.drainRemoteIceCandidatesCache.bind(this);\n\n this.handleNegotiationNeededEvent = this.handleNegotiationNeededEvent.bind(this);\n this.handleICECandidateEvent = this.handleICECandidateEvent.bind(this);\n this.handleNewICECandidateMsg = this.handleNewICECandidateMsg.bind(this);\n this.handleICEConnectionStateChangeEvent = this.handleICEConnectionStateChangeEvent.bind(this);\n this.handleSignalingStateChangeEvent = this.handleSignalingStateChangeEvent.bind(this);\n this.handleICEGatheringStateChangeEvent = this.handleICEGatheringStateChangeEvent.bind(this);\n this.handleIceCandidateErrorEvent = this.handleIceCandidateErrorEvent.bind(this);\n this.handleTrackEvent = this.handleTrackEvent.bind(this);\n\n this.handleVideoOfferMsg = this.handleVideoOfferMsg.bind(this);\n this.handleVideoAnswerMsg = this.handleVideoAnswerMsg.bind(this);\n this.handleNewICECandidateMsg = this.handleNewICECandidateMsg.bind(this);\n\n this.reportError = this.reportError.bind(this);\n this.handleGetUserMediaError = this.handleGetUserMediaError.bind(this);\n\n this.stopTracks = this.stopTracks.bind(this);\n this.disconnectMedia = this.disconnectMedia.bind(this);\n\n this.handleCloseClick = this.handleCloseClick.bind(this);\n this.handleToggleCameraClick = this.handleToggleCameraClick.bind(this);\n this.handleToggleMicClick = this.handleToggleMicClick.bind(this);\n\n this.handleRemoteHangup = this.handleRemoteHangup.bind(this);\n this.handleVideoCallAccepted = this.handleVideoCallAccepted.bind(this);\n\n this.muteVideo = this.muteVideo.bind(this);\n this.unmuteVideo = this.unmuteVideo.bind(this);\n this.emptyVideoTrack = this.emptyVideoTrack.bind(this);\n\n this.handleDataChannelEvent = this.handleDataChannelEvent.bind(this);\n this.handleDataChannelError = this.handleDataChannelError.bind(this);\n this.handleDataChannelMessage = this.handleDataChannelMessage.bind(this);\n this.handleDataChannelOpen = this.handleDataChannelOpen.bind(this);\n this.handleDataChannelClose = this.handleDataChannelClose.bind(this);\n }\n\n componentDidMount() {\n const topic = this.props.tinode.getTopic(this.props.topic);\n this.previousOnInfo = topic.onInfo;\n topic.onInfo = this.onInfo;\n if ((this.props.callState == CALL_STATE_OUTGOING_INITATED ||\n this.props.callState == CALL_STATE_IN_PROGRESS) && this.localRef.current) {\n this.start();\n }\n }\n\n componentWillUnmount() {\n const topic = this.props.tinode.getTopic(this.props.topic);\n topic.onInfo = this.previousOnInfo;\n this.stop();\n }\n\n handleVideoCallAccepted(info) {\n RING_SOUND.pause();\n const pc = this.createPeerConnection();\n const stream = this.state.localStream;\n stream.getTracks().forEach(track => {\n pc.addTrack(track, stream);\n\n if (track.kind == 'video' && this.state.audioOnly) {\n // This is an audio-only call.\n // Remove dummy video track (placeholder remains).\n track.enabled = false;\n track.stop();\n stream.removeTrack(track);\n }\n });\n }\n\n onInfo(info) {\n if (info.what != 'call') {\n return;\n }\n switch (info.event) {\n case 'accept':\n this.handleVideoCallAccepted(info);\n break;\n case 'answer':\n this.handleVideoAnswerMsg(info);\n break;\n case 'ice-candidate':\n this.handleNewICECandidateMsg(info);\n break;\n case 'hang-up':\n this.handleRemoteHangup(info);\n break;\n case 'offer':\n this.handleVideoOfferMsg(info);\n break;\n case 'ringing':\n // play() throws if the user did not click the app first: https://goo.gl/xX8pDD.\n RING_SOUND.play().catch(_ => {});\n break;\n default:\n console.warn(\"Unknown call event\", info.event);\n break;\n }\n }\n\n // Creates an empty video track placeholder.\n emptyVideoTrack() {\n const width = 640;\n const height = 480;\n const canvas = Object.assign(document.createElement(\"canvas\"), {width, height});\n canvas.getContext('2d').fillRect(0, 0, width, height);\n const stream = canvas.captureStream(0);\n return Object.assign(stream.getVideoTracks()[0], {enabled: false});\n }\n\n start() {\n if (this.state.localStream) {\n this.props.onError(this.props.intl.formatMessage(messages.already_in_call), 'info');\n return;\n }\n\n if (this.props.callState == CALL_STATE_IN_PROGRESS) {\n // We apparently just accepted the call.\n this.props.onInvite(this.props.topic, this.props.seq, CALL_STATE_IN_PROGRESS, this.props.callAudioOnly);\n return;\n }\n\n // This is an outgoing call waiting for the other side to pick up.\n // Start local video.\n navigator.mediaDevices.getUserMedia(this.localStreamConstraints)\n .then(stream => {\n if (!this.localStreamConstraints.video) {\n // Starting an audio-only call. Create a dummy video track\n // (so video can be enabled during the call if the user desires).\n stream.addTrack(this.emptyVideoTrack());\n }\n this.setState({localStream: stream, waitingForPeer: true});\n this.localRef.current.srcObject = stream;\n\n DIALING_SOUND.play();\n\n // Send call invitation.\n this.props.onInvite(this.props.topic, this.props.seq, this.props.callState, this.props.callAudioOnly);\n })\n .catch(this.handleGetUserMediaError);\n }\n\n stop() {\n CALL_ENDED_SOUND.pause();\n CALL_ENDED_SOUND.currentTime = 0;\n RING_SOUND.pause();\n RING_SOUND.currentTime = 0;\n\n this.stopTracks(this.state.localStream);\n this.stopTracks(this.state.remoteStream);\n this.disconnectMedia(this.localRef.current);\n this.disconnectMedia(this.remoteRef.current);\n if (this.state.pc) {\n this.state.pc.ontrack = null;\n this.state.pc.onremovetrack = null;\n this.state.pc.onremovestream = null;\n this.state.pc.onicecandidate = null;\n this.state.pc.oniceconnectionstatechange = null;\n this.state.pc.onsignalingstatechange = null;\n this.state.pc.onicegatheringstatechange = null;\n this.state.pc.onnegotiationneeded = null;\n this.state.pc.onicecandidateerror = null;\n this.state.pc.ondatachannel = null;\n\n if (this.state.dataChannel) {\n this.state.dataChannel.close();\n }\n this.state.pc.close();\n }\n this.setState({pc: null, waitingForPeer: false});\n }\n\n disconnectMedia(el) {\n if (!el) {\n return;\n }\n\n el.srcObject = null;\n el.src = '';\n }\n\n stopTracks(stream) {\n if (!stream) {\n return;\n }\n\n let tracks = stream.getTracks();\n if (tracks) {\n tracks.forEach(track => {\n track.stop();\n track.enabled = false;\n });\n }\n }\n\n handleDataChannelError(error) {\n console.error('data channel error', error);\n }\n\n handleDataChannelMessage(event) {\n switch (event.data) {\n case VIDEO_MUTED_EVENT:\n this.setState({remoteVideoLive: false}, _ => { this.remoteRef.current.srcObject = this.state.remoteStream; });\n break;\n case VIDEO_UNMUTED_EVENT:\n this.setState({remoteVideoLive: true}, _ => { this.remoteRef.current.srcObject = this.state.remoteStream; });\n break;\n default:\n break;\n }\n }\n\n handleDataChannelOpen(event) {\n if (!this.state.audioOnly) {\n event.target.send(VIDEO_UNMUTED_EVENT);\n }\n }\n\n handleDataChannelClose() {\n /* no action */\n }\n\n handleDataChannelEvent(event) {\n const channel = event.channel;\n channel.onerror = this.handleDataChannelError;\n channel.onmessage = this.handleDataChannelMessage;\n channel.onopen = this.handleDataChannelOpen;\n channel.onclose = this.handleDataChannelClose;\n this.setState({dataChannel: channel});\n }\n\n createPeerConnection() {\n const iceServers = this.props.tinode.getServerParam('iceServers', null);\n const pc = iceServers ? new RTCPeerConnection({iceServers: iceServers}) : new RTCPeerConnection();\n\n pc.onicecandidate = this.handleICECandidateEvent;\n pc.oniceconnectionstatechange = this.handleICEConnectionStateChangeEvent;\n pc.onicegatheringstatechange = this.handleICEGatheringStateChangeEvent;\n pc.onsignalingstatechange = this.handleSignalingStateChangeEvent;\n pc.onnegotiationneeded = this.handleNegotiationNeededEvent;\n pc.onicecandidateerror = this.handleIceCandidateErrorEvent;\n pc.ontrack = this.handleTrackEvent;\n pc.ondatachannel = this.handleDataChannelEvent;\n\n // creating data channel events\n const channel = pc.createDataChannel(\"events\", {ordered: true});\n channel.onerror = this.handleDataChannelError;\n channel.onmessage = this.handleDataChannelMessage;\n channel.onopen = this.handleDataChannelOpen;\n channel.onclose = this.handleDataChannelClose;\n\n this.setState({pc: pc, dataChannel: channel, waitingForPeer: false});\n\n return pc;\n }\n\n handleVideoAnswerMsg(info) {\n // Configure the remote description, which is the SDP payload\n // in 'info' message.\n const desc = new RTCSessionDescription(info.payload);\n this.state.pc.setRemoteDescription(desc)\n .then(_ => {\n this.setState({ callInitialSetupComplete: true }, _ => this.drainRemoteIceCandidatesCache());\n })\n .catch(err => this.reportError(err));\n }\n\n reportError(err) {\n this.props.onError(err.message, 'err');\n }\n\n canSendOffer() {\n return this.isOutgoingCall || this.state.callInitialSetupComplete;\n }\n\n handleNegotiationNeededEvent(event) {\n const pc = event.target;\n if (!this.canSendOffer()) {\n return;\n }\n pc.createOffer().then(offer => {\n return pc.setLocalDescription(offer);\n })\n .then(_ => {\n this.props.onSendOffer(this.props.topic, this.props.seq, pc.localDescription.toJSON());\n })\n .catch(err => this.reportError(err));\n }\n\n handleIceCandidateErrorEvent(event) {\n console.warn(\"ICE candidate error:\", event);\n }\n\n handleICECandidateEvent(event) {\n if (event.candidate) {\n this.props.onIceCandidate(this.props.topic, this.props.seq, event.candidate.toJSON());\n }\n }\n\n handleNewICECandidateMsg(info) {\n const candidate = new RTCIceCandidate(info.payload);\n if (this.state.callInitialSetupComplete) {\n this.state.pc.addIceCandidate(candidate)\n .catch(err => {\n if (candidate.candidate) {\n this.reportError(err);\n }\n console.warn(\"Error adding new ice candidate\", candidate, err);\n });\n } else {\n this.remoteIceCandidatesCache.push(candidate);\n }\n }\n\n drainRemoteIceCandidatesCache() {\n this.remoteIceCandidatesCache.forEach(candidate => {\n this.state.pc.addIceCandidate(candidate)\n .catch(err => {\n if (candidate.candidate) {\n this.reportError(err);\n }\n console.warn(\"Error adding cached ice candidate\", candidate, err);\n });\n });\n this.remoteIceCandidatesCache = [];\n }\n\n handleICEConnectionStateChangeEvent(event) {\n switch (event.target.iceConnectionState) {\n case 'closed':\n case 'failed':\n this.handleCloseClick();\n break;\n }\n }\n\n handleSignalingStateChangeEvent(event) {\n if (event.target.signalingState == 'closed') {\n this.handleCloseClick();\n }\n }\n\n handleICEGatheringStateChangeEvent(event) {\n // ICE gathering change state\n }\n\n handleTrackEvent(event) {\n // Remote video becomes available.\n this.remoteRef.current.srcObject = event.streams[0];\n this.setState({remoteStream: event.streams[0]});\n }\n\n handleGetUserMediaError(e) {\n console.error(\"Error opening camera and/or microphone\", e);\n switch(e.name) {\n case 'NotFoundError':\n // Cannot start the call b/c no camera and/or microphone found.\n this.reportError(e);\n break;\n case 'SecurityError':\n case 'PermissionDeniedError':\n // Do nothing; this is the same as the user canceling the call.\n break;\n default:\n this.reportError(e);\n break;\n }\n\n // Make sure we shut down our end of the RTCPeerConnection so we're\n // ready to try again.\n this.handleCloseClick();\n }\n\n handleVideoOfferMsg(info) {\n let localStream = null;\n const pc = this.state.pc ? this.state.pc : this.createPeerConnection();\n const desc = new RTCSessionDescription(info.payload);\n\n pc.setRemoteDescription(desc).then(_ => {\n return navigator.mediaDevices.getUserMedia(this.localStreamConstraints);\n })\n .then(stream => {\n let dummyVideo;\n if (!this.localStreamConstraints.video) {\n // Starting an audio-only call. Create an empty video track so\n // so the user can enable the video during the call.\n dummyVideo = this.emptyVideoTrack();\n stream.addTrack(dummyVideo);\n }\n localStream = stream;\n this.localRef.current.srcObject = stream;\n this.setState({localStream: stream});\n\n localStream.getTracks().forEach(track => {\n pc.addTrack(track, localStream);\n });\n\n if (dummyVideo) {\n dummyVideo.enabled = false;\n dummyVideo.stop();\n stream.removeTrack(dummyVideo);\n }\n })\n .then(_ => {\n return pc.createAnswer();\n })\n .then(answer => {\n return pc.setLocalDescription(answer);\n })\n .then(_ => {\n this.props.onSendAnswer(this.props.topic, this.props.seq, pc.localDescription.toJSON());\n this.setState({ callInitialSetupComplete: true }, _ => this.drainRemoteIceCandidatesCache());\n })\n .catch(this.handleGetUserMediaError);\n }\n\n // Call disconnected by remote.\n handleRemoteHangup() {\n if (!this.state.waitingForPeer) {\n // This is live call, just hang up.\n this.handleCloseClick();\n } else {\n // This is a call which is not yet connected.\n // Stop pulse animation.\n this.setState({waitingForPeer: false});\n // Change sound and wait a bit before ending it.\n RING_SOUND.pause();\n RING_SOUND.currentTime = 0;\n CALL_ENDED_SOUND.loop = true;\n CALL_ENDED_SOUND.play().catch(_ => {});\n setTimeout(_ => {\n this.handleCloseClick();\n }, 2000);\n }\n }\n\n handleCloseClick() {\n this.stop();\n this.props.onHangup(this.props.topic, this.props.seq);\n }\n\n // Ends video track and turns off the camera.\n muteVideo() {\n if (!this.state.pc || !this.state.dataChannel) {\n return;\n }\n\n const stream = this.state.localStream;\n const t = stream.getVideoTracks()[0];\n t.enabled = false;\n t.stop();\n\n stream.removeTrack(t);\n this.state.dataChannel.send(VIDEO_MUTED_EVENT);\n this.setState({videoToggleInProgress: false});\n }\n\n unmuteVideo() {\n if (!this.state.pc || !this.state.dataChannel) {\n return;\n }\n navigator.mediaDevices.getUserMedia({ video: true })\n .then(stream => {\n // Will extract video track from stream and throw stream away,\n // and replace video track in the media sender.\n this.localRef.current.srcObject = null;\n const sender = this.state.pc.getSenders().find(s => s.track.kind == 'video');\n const track = stream.getVideoTracks()[0];\n // Remote track from new stream.\n stream.removeTrack(track);\n // Add this track to the existing local stream.\n this.state.localStream.addTrack(track);\n return sender.replaceTrack(track);\n })\n .then(_ => {\n this.localRef.current.srcObject = this.state.localStream;\n this.state.dataChannel.send(VIDEO_UNMUTED_EVENT);\n })\n .catch(err => this.handleGetUserMediaError(err))\n .finally(_ => { this.setState({videoToggleInProgress: false}); }); // Make sure we redraw the mute/unmute icons (e.g. camera -> camera_off).\n }\n\n handleToggleCameraClick() {\n if (this.state.videoToggleInProgress) {\n // Toggle currently in progress.\n return;\n }\n const tracks = this.state.localStream.getVideoTracks();\n this.setState({videoToggleInProgress: true}, _ => {\n if (tracks && tracks.length > 0 && tracks[0].enabled && tracks[0].readyState == 'live') {\n this.muteVideo();\n } else {\n this.unmuteVideo();\n }\n this.setState({audioOnly: !this.state.audioOnly});\n });\n }\n\n handleToggleMicClick() {\n const stream = this.state.localStream;\n const t = stream.getAudioTracks()[0];\n t.enabled = !t.enabled;\n // Make sure we redraw the mute/unmute icons (e.g. mic -> mic_off).\n this.forceUpdate();\n }\n\n render() {\n const audioTracks = this.state.localStream && this.state.localStream.getAudioTracks();\n const videoTracks = !this.state.audioOnly && this.state.localStream && this.state.localStream.getVideoTracks();\n const disabled = !this.state.pc || !this.state.dataChannel || !(audioTracks && audioTracks[0]);\n const audioIcon = audioTracks && audioTracks[0] && audioTracks[0].enabled ? 'mic' : 'mic_off';\n const videoIcon = videoTracks && videoTracks[0] && videoTracks[0].enabled && videoTracks[0].readyState == 'live' ? 'videocam' : 'videocam_off';\n const peerTitle = clipStr(this.props.title, MAX_PEER_TITLE_LENGTH);\n const pulseAnimation = this.state.waitingForPeer ? ' pulse' : '';\n\n let remoteActive = false;\n if (this.remoteRef.current && this.remoteRef.current.srcObject && this.state.remoteVideoLive) {\n const rstream = this.remoteRef.current.srcObject;\n if (rstream.getVideoTracks().length > 0) {\n const t = rstream.getVideoTracks()[0];\n remoteActive = t.enabled && t.readyState == 'live';\n }\n }\n\n return (\n <>\n \n
\n
\n
\n {remoteActive ?\n <>\n
\n
{peerTitle}
\n > :\n <>\n
\n
\n
\n \n
\n
{peerTitle}
\n
\n >\n }\n
\n
\n
\n \n call_end \n \n \n {videoIcon} \n \n \n {audioIcon} \n \n
\n
\n >\n );\n }\n};\n\nexport default injectIntl(CallPanel);\n","// The counter of unread messages in the topic.\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport { secondsToTime } from '../lib/strformat.js';\n\n// Props:\n// incoming: true | false.\n// success: true | false.\nexport default class CallStatus extends React.PureComponent {\n render() {\n const isCallDropped = ['declined', 'disconnected', 'missed'].includes(this.props.callState);\n const icon2 = this.props.incoming ?\n (isCallDropped ? 'call_missed' : 'call_received') :\n (isCallDropped ? 'call_missed_outgoing' : 'call_made');\n let duration;\n if (isCallDropped) {\n switch (this.props.callState) {\n case 'declined':\n duration = ;\n break;\n case 'missed':\n duration = this.props.incoming ?\n :\n ;\n break;\n default:\n duration = ;\n break;\n }\n } else if (['accepted', 'started'].includes(this.props.callState) && !this.props.duration) {\n duration = \n } else {\n duration = {secondsToTime(this.props.duration / 1000)} ;\n }\n return (\n <>\n \n call {icon2} \n
{duration}\n >\n );\n }\n};\n","// Single chat message bubble, sent or received.\n\nimport React from 'react';\nimport { FormattedMessage, injectIntl } from 'react-intl';\nimport { Drafty, Tinode } from 'tinode-sdk';\n\nimport Attachment from './attachment.jsx';\nimport LetterTile from './letter-tile.jsx';\nimport ReceivedMarker from './received-marker.jsx'\n\nimport { fullFormatter } from '../lib/formatters.js';\nimport { sanitizeUrl } from '../lib/utils.js';\n\nclass BaseChatMessage extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.state = {\n progress: 0\n };\n\n if (props.uploader) {\n props.uploader.onProgress = this.handleProgress.bind(this);\n }\n\n this.handleExpandImage = this.handleExpandImage.bind(this);\n this.handlePlayVideo = this.handlePlayVideo.bind(this);\n this.handleFormButtonClick = this.handleFormButtonClick.bind(this);\n this.handleContextClick = this.handleContextClick.bind(this);\n this.handleCancelUpload = this.handleCancelUpload.bind(this);\n this.handleQuoteClick = this.handleQuoteClick.bind(this);\n\n this.formatterContext = {\n formatMessage: props.intl.formatMessage.bind(props.intl),\n viewportWidth: props.viewportWidth,\n authorizeURL: props.tinode.authorizeURL.bind(props.tinode),\n\n onImagePreview: this.handleExpandImage,\n onVideoPreview: this.handlePlayVideo,\n onFormButtonClick: this.handleFormButtonClick,\n onQuoteClick: this.handleQuoteClick\n };\n }\n\n handleExpandImage(e) {\n e.preventDefault();\n this.props.onExpandMedia({\n url: e.target.src,\n filename: e.target.dataset.name,\n width: e.target.dataset.width,\n height: e.target.dataset.height,\n size: e.target.dataset.size,\n type: e.target.dataset.mime\n });\n }\n\n handlePlayVideo(e) {\n e.preventDefault();\n this.props.onExpandMedia({\n video: true,\n url: e.target.dataset.src,\n preview: e.target.src,\n filename: e.target.dataset.name,\n width: e.target.dataset.width,\n height: e.target.dataset.height,\n duration: e.target.dataset.duration,\n size: e.target.dataset.size,\n type: e.target.dataset.mime\n });\n }\n\n handleFormButtonClick(e) {\n e.preventDefault();\n const data = {\n seq: this.props.seq\n };\n data.resp = {};\n if (e.target.dataset.name) {\n data.resp[e.target.dataset.name] = e.target.dataset.val ? e.target.dataset.val :\n e.target.dataset.val === undefined ? 1 : '' + e.target.dataset.val;\n }\n if (e.target.dataset.act == 'url') {\n data.ref = sanitizeUrl(e.target.dataset.ref) || 'about:blank';\n }\n const text = e.target.dataset.title || 'unknown';\n this.props.onFormResponse(e.target.dataset.act, text, data);\n }\n\n handleContextClick(e) {\n e.preventDefault();\n e.stopPropagation();\n const menuItems = [];\n if (this.props.received == Tinode.MESSAGE_STATUS_FAILED) {\n menuItems.push('menu_item_send_retry');\n }\n if (this.props.userIsWriter && this.props.received > Tinode.MESSAGE_STATUS_FAILED) {\n menuItems.push('menu_item_reply');\n if (!this.props.response) {\n let immutable = false;\n Drafty.entities(this.props.content, (_0, _1, tp) => {\n immutable = ['AU', 'EX', 'FM', 'IM', 'VC', 'VD'].includes(tp);\n return immutable;\n });\n if (!immutable) {\n Drafty.styles(this.props.content, tp => {\n immutable = ['QQ'].includes(tp);\n return immutable;\n });\n }\n if (!immutable) {\n menuItems.push('menu_item_edit');\n }\n }\n }\n menuItems.push('menu_item_forward');\n\n this.props.showContextMenu({\n seq: this.props.seq,\n replace: this.props.edited ? parseInt(this.props.edited.split(':')[1]) : 0,\n content: this.props.content,\n userFrom: this.props.userFrom,\n userName: this.props.userName,\n y: e.pageY,\n x: e.pageX,\n pickReply: this.props.pickReply,\n editMessage: this.props.editMessage,\n }, menuItems);\n }\n\n handleProgress(ratio) {\n this.setState({progress: ratio});\n }\n\n handleCancelUpload() {\n this.props.onCancelUpload(this.props.seq, this.props.uploader);\n }\n\n handleQuoteClick(e) {\n e.preventDefault();\n e.stopPropagation();\n const replyToSeq = this.props.replyToSeq;\n if (replyToSeq) {\n this.props.onQuoteClick(replyToSeq);\n }\n }\n\n render() {\n const sideClass = this.props.sequence + ' ' + (this.props.response ? 'left' : 'right');\n const bubbleClass = (this.props.sequence == 'single' || this.props.sequence == 'last') ? 'bubble tip' : 'bubble';\n const avatar = this.props.userAvatar || true;\n const fullDisplay = (this.props.isGroup && this.props.response &&\n (this.props.sequence == 'single' || this.props.sequence == 'last'));\n\n let content = this.props.content;\n const attachments = [];\n if (this.props.mimeType == Drafty.getContentType() && Drafty.isValid(content)) {\n Drafty.attachments(content, (att, i) => {\n if (att.mime == 'application/json') {\n // Don't show json objects as attachments.\n // They are not meant for users.\n return;\n }\n attachments.push( );\n }, this);\n const tree = Drafty.format(content, fullFormatter, this.formatterContext);\n content = React.createElement(React.Fragment, null, tree);\n } else if (typeof content != 'string') {\n content = <>warning_amber \n >\n }\n\n return (\n \n {this.props.isGroup && this.props.response ?\n \n {fullDisplay ?\n :\n null}\n
:\n null}\n \n
\n
\n
\n {content}\n {attachments}\n
\n {this.props.timestamp ?\n
\n : null}\n
\n {this.props.showContextMenu ?\n
\n \n expand_more \n \n : null\n }\n
\n {fullDisplay ?\n
\n {this.props.userName ||\n \n }\n
\n : null\n }\n
\n \n );\n }\n};\n\nconst IntlChatMessage = injectIntl(BaseChatMessage);\nconst ChatMessage = React.forwardRef((props, ref) => );\n\nexport default ChatMessage;\n","import React from 'react';\n\n/* CheckBox: styled three-state checkbox, either clickable or static */\nexport default class CheckBox extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.handleChange = this.handleChange.bind(this);\n }\n\n handleChange() {\n this.props.onChange(this.props.name, !this.props.checked);\n }\n\n render() {\n let classList = ['material-icons'];\n let iconName;\n if (Array.isArray(this.props.className)) {\n classList.push(...this.props.className);\n } else if (this.props.className) {\n classList.push(this.props.className);\n }\n if (this.props.onChange) {\n if (this.props.checked) {\n classList.push('blue', 'clickable');\n iconName = 'check_box';\n } else if (this.props.checked === false) {\n classList.push('blue', 'clickable');\n iconName = 'check_box_outline_blank';\n } else {\n classList.push('lt-blue');\n iconName = 'indeterminate_check_box';\n }\n } else {\n if (this.props.checked) {\n iconName = 'check_box';\n } else {\n iconName = 'check_box_outline_blank';\n }\n }\n let attrs = {\n className: classList.join(' '),\n id: this.props.id,\n };\n if (this.props.onChange) {\n attrs.onClick = this.handleChange;\n }\n return React.createElement('i', attrs, iconName);\n }\n}\n","import React from 'react';\n\nimport Chip from './chip.jsx';\n\nimport { makeImageUrl } from '../lib/blob-helpers.js';\n\n/* BEGIN ChipInput: group membership widget */\nexport default class ChipInput extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = ChipInput.deriveStateFromProps(props);\n this.state.input = '';\n this.state.focused = false;\n\n this.handleTextInput = this.handleTextInput.bind(this);\n this.removeChipAt = this.removeChipAt.bind(this);\n this.handleChipCancel = this.handleChipCancel.bind(this);\n this.handleFocusGained = this.handleFocusGained.bind(this);\n this.handleFocusLost = this.handleFocusLost.bind(this);\n this.handleKeyDown = this.handleKeyDown.bind(this);\n }\n\n static deriveStateFromProps(props) {\n return {\n placeholder: props.chips ? '' : props.prompt,\n sortedChips: ChipInput.sortChips(props.chips, props.staticMembers),\n chipIndex: ChipInput.indexChips(props.chips)\n };\n }\n\n componentDidUpdate(prevProps, prevState) {\n if (prevProps.chips != this.props.chips ||\n prevProps.staticMembers != this.props.staticMembers ||\n prevProps.prompt != this.props.prompt) {\n this.setState(ChipInput.deriveStateFromProps(this.props));\n }\n if (!prevState || this.props.chips.length > prevState.sortedChips.length) {\n this.setState({input: ''});\n }\n }\n\n // Map chip index to user name\n static indexChips(chips) {\n const index = {};\n let count = 0;\n chips.map((item) => {\n index[item.user] = count;\n count ++;\n });\n return index;\n }\n\n // Have non-removable chips appear before all other chips.\n static sortChips(chips, keep) {\n const required = [];\n const normal = [];\n chips.map((item) => {\n if (keep && keep.includes(item.user)) {\n required.push(item);\n } else {\n normal.push(item);\n }\n });\n return required.concat(normal);\n }\n\n handleTextInput(e) {\n this.setState({input: e.target.value});\n if (this.props.filterFunc) {\n this.props.filterFunc(e.target.value);\n }\n }\n\n removeChipAt(idx) {\n const removed = this.state.sortedChips[idx];\n this.props.onChipRemoved(removed.user, this.state.chipIndex[removed.user]);\n }\n\n handleChipCancel(item, idx) {\n this.removeChipAt(idx);\n }\n\n handleFocusGained() {\n this.setState({focused: true});\n }\n\n handleFocusLost() {\n this.setState({focused: false});\n if (this.props.onFocusLost) {\n this.props.onFocusLost(this.state.input);\n }\n }\n\n handleKeyDown(e) {\n if (e.key === 'Backspace') {\n if (this.state.input.length == 0 && this.state.sortedChips.length > 0) {\n const at = this.state.sortedChips.length - 1;\n if (this.state.sortedChips[at].user !== this.props.staticMembers) {\n this.removeChipAt(at);\n }\n }\n } else if (e.key === 'Enter') {\n if (this.props.onEnter) {\n this.props.onEnter(this.state.input);\n }\n } else if (e.key === 'Escape') {\n if (this.props.onCancel) {\n this.props.onCancel();\n }\n }\n }\n\n render() {\n const chips = [];\n let count = 0;\n const staticMembers = this.props.staticMembers || [];\n this.state.sortedChips.map((item) => {\n chips.push(\n \n );\n count++;\n });\n const className = \"chip-input\" + (this.state.focused ? ' focused' : '');\n const autoFocus = !(this.props.tabIndex > 0);\n return (\n \n {chips}\n \n
\n );\n }\n};\n","import React from 'react';\n\nimport LetterTile from './letter-tile.jsx';\n\nexport default class Chip extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.handleCancel = this.handleCancel.bind(this);\n }\n\n handleCancel(e) {\n e.preventDefault();\n this.props.onCancel(this.props.topic, this.props.index);\n }\n\n render() {\n const title = this.props.title || this.props.topic;\n const className = this.props.invalid ? 'chip invalid' : 'chip';\n return (\n \n {this.props.noAvatar ?\n
:\n
\n \n
\n }\n
{title} \n {this.props.onCancel && !this.props.required ?\n
× \n :
}\n
\n );\n }\n};\n","// A panel included into a list of contacts with an action text.\nimport React from 'react';\nimport { injectIntl } from 'react-intl';\n\nclass ContactAction extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.handleClick = this.handleClick.bind(this);\n }\n\n handleClick(e) {\n e.preventDefault();\n e.stopPropagation();\n this.props.onAction(this.props.action);\n }\n\n render() {\n const {formatMessage} = this.props.intl;\n return (\n \n {formatMessage(this.props.title, this.props.values)}
\n \n );\n }\n};\n\nexport default injectIntl(ContactAction);\n","import React from 'react';\n\nconst icon_mapping = {'muted': 'notifications_off', 'banned': 'block', 'staff': 'verified_user'};\n\n/* Contact's labels: [you], or icons [muted], [blocked] */\nexport default class ContactBadges extends React.PureComponent {\n render() {\n let badges = null;\n if (this.props.badges && this.props.badges.length > 0) {\n badges = [];\n this.props.badges.map((b) => {\n const color = (b.color ? ' ' + b.color : '');\n if (b.icon) {\n badges.push({icon_mapping[b.icon] || b.icon} );\n } else {\n badges.push({b.name} );\n }\n });\n return <>{badges}>;\n }\n return null;\n }\n};\n","// ContactList: component for showing a list of contacts,\n// such as a list of group members in a group chat.\nimport React from 'react';\nimport { defineMessages, injectIntl } from 'react-intl';\n\nimport { Drafty, Tinode } from 'tinode-sdk';\n\nimport Contact from './contact.jsx';\nimport ContactAction from './contact-action.jsx';\n\nimport { makeImageUrl } from '../lib/blob-helpers.js';\n\nimport { MESSAGE_PREVIEW_LENGTH } from '../config.js';\n\nconst messages = defineMessages({\n badge_you: {\n id: 'badge_you',\n defaultMessage: 'you',\n description: 'Badge for indicating the current user'\n },\n badge_owner: {\n id: 'badge_owner',\n defaultMessage: 'owner',\n description: 'Badge for indicating the owner'\n }\n});\n\nclass ContactList extends React.Component {\n render() {\n const { formatMessage } = this.props.intl;\n const showCheckmark = Array.isArray(this.props.topicSelected);\n const contactNodes = [];\n let contactsCount = 0;\n if (this.props.contacts && this.props.contacts.length > 0) {\n this.props.contacts.map((c) => {\n if (c.action) {\n // Action item\n contactNodes.push(\n );\n } else {\n // Normal contact\n const key = this.props.showMode ? c.user : (c.topic || c.user);\n // If filter function is provided, filter out the items\n // which don't satisfy the condition.\n if (this.props.filterFunc && this.props.filter) {\n const filterOn = [key];\n if (c.private && c.private.comment) {\n filterOn.push(('' + c.private.comment).toLowerCase());\n }\n if (c.public && c.public.fn) {\n filterOn.push(('' + c.public.fn).toLowerCase());\n }\n if (!this.props.filterFunc(this.props.filter, filterOn)) {\n return;\n }\n }\n\n const isChannel = Tinode.isChannelTopicName(key);\n const isGroup = !isChannel && Tinode.isGroupTopicName(key);\n const selected = showCheckmark ?\n (this.props.topicSelected.indexOf(key) > -1) :\n (this.props.topicSelected === key);\n const badges = [];\n if (this.props.showMode) {\n if (key == this.props.myUserId) {\n badges.push({name: formatMessage(messages.badge_you), color: 'green'});\n }\n if (c.acs && c.acs.isOwner()) {\n badges.push({name: formatMessage(messages.badge_owner), color: 'blue'});\n }\n }\n\n const comment = Array.isArray(c.private) ?\n c.private.join(',') : (c.private ? c.private.comment : null);\n let preview;\n let forwarded;\n let previewIsResponse;\n let deliveryStatus;\n if (!this.props.showMode && c.latestMessage) {\n const msg = c.latestMessage();\n if (msg) {\n forwarded = msg.head ? msg.head.forwarded : null;\n deliveryStatus = msg._status || c.msgStatus(msg, true);\n previewIsResponse = msg.from != this.props.myUserId;\n if (msg.content) {\n preview = typeof msg.content == 'string' ?\n msg.content.substr(0, MESSAGE_PREVIEW_LENGTH) :\n Drafty.preview(msg.content, MESSAGE_PREVIEW_LENGTH);\n }\n }\n }\n\n contactNodes.push(\n \n );\n contactsCount ++;\n }\n }, this);\n }\n\n return (\n \n {contactsCount == 0 ?\n
\n :\n null\n }\n {contactNodes.length > 0 ?\n
\n :\n null\n }\n
\n );\n }\n};\n\nexport default injectIntl(ContactList);\n","// A single topic or user.\nimport React from 'react';\nimport { FormattedMessage, injectIntl } from 'react-intl';\n\nimport ContactBadges from './contact-badges.jsx';\nimport LetterTile from './letter-tile.jsx';\nimport UnreadBadge from './unread-badge.jsx';\n\nimport { Drafty } from 'tinode-sdk';\n\nimport { previewFormatter } from '../lib/formatters.js';\nimport { deliveryMarker } from '../lib/utils.js';\n\nclass Contact extends React.Component {\n constructor(props) {\n super(props);\n\n this.handleClick = this.handleClick.bind(this);\n this.handleContextClick = this.handleContextClick.bind(this);\n }\n\n handleClick(e) {\n e.preventDefault();\n e.stopPropagation();\n if (this.props.onSelected) {\n // Index this.props.index is used by GroupManager.\n this.props.onSelected(this.props.item, this.props.index);\n }\n }\n\n handleContextClick(e) {\n e.preventDefault();\n e.stopPropagation();\n this.props.showContextMenu({ topicName: this.props.item, y: e.pageY, x: e.pageX });\n }\n\n render() {\n let title = this.props.title;\n if (!title) {\n title = ;\n } else if (title.length > 30) {\n // FIXME: this is probably wrong for RTL languages.\n title = title.substring(0, 28) + '…';\n }\n const online = this.props.now ? 'online' : 'offline';\n const avatar = this.props.avatar ? this.props.avatar : true;\n const badges = this.props.badges ? this.props.badges.slice() : [];\n const icon_badges = [];\n if (this.props.isVerified) {\n icon_badges.push({icon: 'verified', color: 'verified-color'});\n }\n if (this.props.isStaff) {\n icon_badges.push({icon: 'staff', color: 'staff-color'});\n }\n if (this.props.isDangerous) {\n icon_badges.push({icon: 'dangerous', color: 'danger-color'});\n }\n if (this.props.acs) {\n if (this.props.showMode) {\n badges.push({name: this.props.acs.getMode(), key: 'mode'});\n }\n if (this.props.acs.isMuted()) {\n icon_badges.push({icon: 'muted'});\n }\n if (!this.props.acs.isJoiner()) {\n icon_badges.push({icon: 'banned'});\n }\n }\n\n // The this.props.preview contains alreay shortened Drafty or string.\n let preview;\n if (typeof this.props.preview == 'string') {\n preview = this.props.preview;\n } else if (Drafty.isValid(this.props.preview)) {\n preview = React.createElement(React.Fragment, null, Drafty.format(this.props.preview, previewFormatter,\n {formatMessage: this.props.intl.formatMessage, previewIsResponse: this.props.previewIsResponse}));\n } else if (this.props.preview) {\n preview =\n <>warning_amber \n \n >;\n }\n\n const icon = deliveryMarker(this.props.received);\n const marker = icon ? {icon.name} : null;\n const titleClass = 'contact-title' + (this.props.deleted ? ' deleted' : '');\n\n return (\n \n \n \n {this.props.deleted ? cancel :\n this.props.showOnline ? :\n (this.props.showCheckmark && this.props.selected) ?\n check_circle \n : null}\n
\n \n
{title} \n {this.props.isGroup ?
group : null}\n {this.props.isChannel ?
: null}\n
\n {!this.props.deleted ?
: null}\n
\n {this.props.showMode ?\n
:\n this.props.small ? null :
{marker}{preview || this.props.comment || '\\u00A0'}
}\n
\n {this.props.showContextMenu ?\n \n \n expand_more \n \n : null}\n \n );\n }\n};\n\nexport default injectIntl(Contact);\n","// Context Menu: popup/dropdown menu.\nimport React from 'react';\nimport { injectIntl, defineMessages } from 'react-intl';\n\nimport { REM_SIZE } from '../config.js';\n\nconst messages = defineMessages({\n info: {\n id: 'menu_item_info',\n defaultMessage: 'Info',\n description: 'Show extended topic information'\n },\n clear_messages: {\n id: 'menu_item_clear_messages',\n defaultMessage: 'Clear messages',\n description: 'Delete all messages'\n },\n clear_for_all: {\n id: 'menu_item_clear_messages_for_all',\n defaultMessage: 'Clear for All',\n description: 'Delete all message(s) for all members'\n },\n delete: {\n id: 'menu_item_delete',\n defaultMessage: 'Delete',\n description: 'Delete selected messages'\n },\n delete_for_all: {\n id: 'menu_item_delete_for_all',\n defaultMessage: 'Delete for All',\n description: 'Delete selected message(s) for all members'\n },\n send_retry: {\n id: 'menu_item_send_retry',\n defaultMessage: 'Retry',\n description: 'Retry sending message'\n },\n mute: {\n id: 'menu_item_mute',\n defaultMessage: 'Mute',\n description: 'Turn off notifications'\n },\n unmute: {\n id: 'menu_item_unmute',\n defaultMessage: 'Unmute',\n description: 'Turn notifications on'\n },\n reply: {\n id: 'menu_item_reply',\n defaultMessage: 'Reply',\n description: 'Reply to message'\n },\n forward: {\n id: 'menu_item_forward',\n defaultMessage: 'Forward',\n description: 'Forward message'\n },\n edit: {\n id: 'menu_item_edit',\n defaultMessage: 'Edit',\n description: 'Edit message'\n },\n topic_delete: {\n id: 'menu_item_delete_topic',\n defaultMessage: 'Delete',\n description: 'Delete entire topic'\n },\n topic_delete_warning: {\n id: 'topic_delete_warning',\n defaultMessage: 'Are you sure you want to delete this conversation? It cannot be undone.',\n description: 'Alert warning when deleting entire topic'\n },\n delete_messages_warning: {\n id: 'delete_messages_warning',\n defaultMessage: 'Are you sure you want to delete all messages for everyone? It cannot be undone.',\n description: 'Alert dialog warning when hard-deleting all messages.'\n },\n unblock: {\n id: 'menu_item_unblock',\n defaultMessage: 'Unblock',\n description: 'Unblock topic or user'\n },\n // Generic string suitable for either topic or user.\n block: {\n id: 'menu_item_block',\n defaultMessage: 'Block',\n description: 'Block topic or user'\n },\n topic_block_warning: {\n id: 'topic_block_warning',\n defaultMessage: 'Are you sure you want to block this conversation?',\n description: 'Alert warning when blocking a topic.'\n },\n member_delete: {\n id: 'menu_item_member_delete',\n defaultMessage: 'Remove',\n description: 'Remove user from topic'\n },\n archive: {\n id: 'menu_item_archive_topic',\n defaultMessage: 'Archive',\n description: 'Move topic from the list of active chats to archive'\n },\n unarchive: {\n id: 'menu_item_restore_topic',\n defaultMessage: 'Restore',\n description: 'Restore topic from archive'\n },\n edit_permissions: {\n id: 'menu_item_edit_permissions',\n defaultMessage: 'Edit permissions',\n description: 'Menu item [Edit permissions]'\n },\n clear_messages_warning: {\n id: 'clear_messages_warning',\n defaultMessage: 'Are you sure you want to clear all messages? It cannot be undone.',\n description: 'Alert dialog warning when deleting all messages.'\n },\n});\n\nclass ContextMenu extends React.Component {\n constructor(props) {\n super(props);\n\n this.selfRef = React.createRef();\n\n const {formatMessage} = props.intl;\n\n this.handlePageClick = this.handlePageClick.bind(this);\n this.handleEscapeKey = this.handleEscapeKey.bind(this);\n this.handleClick = this.handleClick.bind(this);\n\n // Preconfigured menu items.\n this.MenuItems = {\n 'topic_info': {\n id: 'topic_info',\n title: formatMessage(messages.info),\n handler: null\n },\n 'messages_clear': {\n id: 'messages_clear',\n title: formatMessage(messages.clear_messages),\n handler: (params, errorHandler) => {\n return props.onShowAlert(\n formatMessage(messages.clear_messages), // title\n formatMessage(messages.clear_messages_warning), // content\n (_ => { this.deleteMessages(true, false, params, errorHandler); }), // onConfirm\n null, // \"OK\"\n true, // Show Reject button\n null // \"Cancel\"\n );\n }\n },\n 'messages_clear_hard': {\n id: 'messages_clear_hard',\n title: formatMessage(messages.clear_for_all),\n handler: (params, errorHandler) => {\n return props.onShowAlert(\n formatMessage(messages.clear_for_all), // title\n formatMessage(messages.delete_messages_warning), // content\n (_ => { return this.deleteMessages(true, true, params, errorHandler); }),\n null, // \"OK\"\n true, // Show Reject button\n null // \"Cancel\"\n );\n }\n },\n 'message_delete': {\n id: 'message_delete',\n title: formatMessage(messages.delete),\n handler: (params, errorHandler) => {\n return this.deleteMessages(false, false, params, errorHandler);\n }\n },\n 'message_delete_hard': {\n id: 'message_delete_hard',\n title: formatMessage(messages.delete_for_all),\n handler: (params, errorHandler) => {\n return this.deleteMessages(false, true, params, errorHandler);\n }\n },\n 'menu_item_send_retry': {\n id: 'menu_item_send_retry',\n title: formatMessage(messages.send_retry),\n handler: (params, errorHandler) => {\n return this.retryMessage(params, errorHandler);\n }\n },\n 'menu_item_reply': {\n id: 'menu_item_reply',\n title: formatMessage(messages.reply),\n handler: (params, errorHandler) => {\n return this.replyToMessage(params, errorHandler);\n }\n },\n 'menu_item_forward': {\n id: 'menu_item_forward',\n title: formatMessage(messages.forward),\n handler: _ => {} /* the action is taken directly in tinode-web */\n },\n 'menu_item_edit': {\n id: 'menu_item_edit',\n title: formatMessage(messages.edit),\n handler: (params, errorHandler) => {\n return this.editMessage(params, errorHandler);\n }\n },\n 'topic_unmute': {\n id: 'topic_unmute',\n title: formatMessage(messages.unmute),\n handler: this.topicPermissionSetter.bind(this, '+P')\n },\n 'topic_mute': {\n id: 'topic_mute',\n title: formatMessage(messages.mute),\n handler: this.topicPermissionSetter.bind(this, '-P')\n },\n 'topic_unblock': {\n id: 'topic_unblock',\n title: formatMessage(messages.unblock),\n handler: this.topicPermissionSetter.bind(this, '+JP')\n },\n 'topic_block': {\n id: 'topic_block',\n title: formatMessage(messages.block),\n handler: (params, errorHandler) => {\n return props.onShowAlert(\n formatMessage(messages.block), // title\n formatMessage(messages.topic_block_warning), // content\n (_ => this.topicPermissionSetter('-JP', params, errorHandler).then(ctrl => {\n this.props.onTopicRemoved(params.topicName);\n return ctrl;\n })),\n null, // \"OK\"\n true, // Show Reject button\n null // \"Cancel\"\n );\n }\n },\n 'topic_delete': {\n id: 'topic_delete',\n title: formatMessage(messages.topic_delete),\n handler: (params, errorHandler) => {\n return props.onShowAlert(\n formatMessage(messages.topic_delete), // title\n formatMessage(messages.topic_delete_warning), // content\n (_ => {\n const topic = this.props.tinode.getTopic(params.topicName);\n if (!topic) {\n console.warn(\"Topic not found: \", params.topicName);\n return;\n }\n return topic.delTopic(true).catch(err => {\n if (errorHandler) {\n errorHandler(err.message, 'err');\n }\n });\n }),\n null, // \"OK\"\n true, // Show Reject button\n null // \"Cancel\"\n );\n }\n },\n 'topic_archive': {\n id: 'topic_archive',\n title: formatMessage(messages.archive),\n handler: (params, errorHandler) => {\n const topic = this.props.tinode.getTopic(params.topicName);\n if (!topic) {\n console.warn(\"Topic not found: \", params.topicName);\n return;\n }\n return topic.archive(true).catch(err => {\n if (errorHandler) {\n errorHandler(err.message, 'err');\n }\n });\n }\n },\n 'topic_restore': {\n id: 'topic_restore',\n title: formatMessage(messages.unarchive),\n handler: (params, errorHandler) => {\n const topic = this.props.tinode.getTopic(params.topicName);\n if (!topic) {\n console.warn(\"Topic not found: \", params.topicName);\n return;\n }\n return topic.archive(false).catch(err => {\n if (errorHandler) {\n errorHandler(err.message, 'err');\n }\n });\n }\n },\n // menu_item_edit_permissions is defined elsewhere.\n 'permissions': {\n id: 'permissions',\n title: formatMessage(messages.edit_permissions),\n handler: null\n },\n 'member_delete': {\n id: 'member_delete',\n title: formatMessage(messages.member_delete),\n handler: (params, errorHandler) => {\n const topic = this.props.tinode.getTopic(params.topicName);\n if (!topic || !params.user) {\n console.warn(\"Topic or user not found: '\" + params.topicName + \"', '\" + params.user + \"'\");\n return;\n }\n return topic.delSubscription(params.user).catch(err => {\n if (errorHandler) {\n errorHandler(err.message, 'err');\n }\n });\n }\n },\n 'member_mute': {\n id: 'member_mute',\n title: formatMessage(messages.mute),\n handler: this.topicPermissionSetter.bind(this, '-P')\n },\n 'member_unmute': {\n id: 'member_unmute',\n title: formatMessage(messages.unmute),\n handler: this.topicPermissionSetter.bind(this, '+P')\n },\n 'member_block': {\n id: 'member_block',\n title: formatMessage(messages.block),\n handler: this.topicPermissionSetter.bind(this, '-JP')\n },\n 'member_unblock': {\n id: 'member_unblock',\n title: formatMessage(messages.unblock),\n handler: this.topicPermissionSetter.bind(this, '+JP')\n },\n };\n }\n\n componentDidMount() {\n document.addEventListener('mousedown', this.handlePageClick, false);\n document.addEventListener('keyup', this.handleEscapeKey, false);\n }\n\n componentWillUnmount() {\n document.removeEventListener('mousedown', this.handlePageClick, false);\n document.removeEventListener('keyup', this.handleEscapeKey, false);\n }\n\n handlePageClick(e) {\n if (this.selfRef.current.contains(e.target)) {\n return;\n }\n e.preventDefault();\n e.stopPropagation();\n this.props.hide();\n }\n\n handleEscapeKey(e) {\n if (e.keyCode === 27) {\n this.props.hide();\n }\n }\n\n handleClick(e) {\n e.preventDefault();\n e.stopPropagation();\n this.props.hide();\n let item = this.props.items[e.currentTarget.dataset.id];\n if (typeof item == 'string') {\n item = this.MenuItems[item];\n }\n\n if (!item) {\n console.error(\"Invalid menu item ID\", e.currentTarget.dataset.id);\n } else {\n this.props.onAction(\n item.id,\n item.handler(this.props.params, this.props.onError),\n this.props.params);\n }\n }\n\n // Menu Actions\n\n deleteMessages(all, hard, params, errorHandler) {\n const topic = this.props.tinode.getTopic(params.topicName);\n if (!topic) {\n console.warn(\"Topic not found: \", params.topicName);\n return;\n }\n\n // We don't know if the message is still pending (e.g. attachment is being uploaded),\n // so try cancelling first. No harm if we can't cancel.\n // The message can be cancelled if transmission to the server has not\n // started yet or if the message send has failed.\n if (!all && topic.cancelSend(params.seq)) {\n return;\n }\n\n const promise = all ?\n topic.delMessagesAll(hard) :\n params.replace > 0 ?\n topic.delMessagesEdits(params.replace, hard) :\n topic.delMessagesList([params.seq], hard);\n\n return promise.catch(err => {\n if (errorHandler) {\n errorHandler(err.message, 'err');\n }\n });\n }\n\n // Retries sending failed message.\n retryMessage(params, errorHandler) {\n const topic = this.props.tinode.getTopic(params.topicName);\n // Remove the existing message entry.\n if (!topic || !topic.flushMessage(params.seq)) {\n return;\n }\n const msg = topic.createMessage(params.content, false);\n return topic.publishDraft(msg).catch(err => {\n if (errorHandler) {\n errorHandler(err.message, 'err');\n }\n });\n }\n\n // Function is used by context menu to set permissions.\n topicPermissionSetter(mode, params, errorHandler) {\n const topic = this.props.tinode.getTopic(params.topicName);\n if (!topic) {\n console.warn(\"Topic not found\", params.topicName);\n return;\n }\n\n let result = topic.updateMode(params.user, mode);\n if (errorHandler) {\n result = result.catch(err => errorHandler(err.message, 'err'));\n }\n return result;\n }\n\n replyToMessage(params, errorHandler) {\n params.pickReply(params.seq, params.content, params.userFrom, params.userName, errorHandler);\n }\n\n editMessage(params, errorHandler) {\n params.editMessage(params.replace || params.seq, params.content, errorHandler);\n }\n\n render() {\n const menu = [];\n let count = 0;\n this.props.items.map((item) => {\n if (typeof item == 'string') {\n item = this.MenuItems[item];\n }\n if (item && item.title) {\n menu.push(\n item.title == '-' ?\n \n :\n {item.title} \n );\n }\n count++;\n });\n\n // Ensure that menu is inside the app-container.\n const hSize = 12 * REM_SIZE;\n const vSize = REM_SIZE * (0.7 + menu.length * 2.5);\n const left = (this.props.bounds.right - this.props.clickAt.x < hSize) ?\n (this.props.clickAt.x - this.props.bounds.left - hSize) :\n (this.props.clickAt.x - this.props.bounds.left);\n const top = (this.props.bounds.bottom - this.props.clickAt.y < vSize) ?\n (this.props.clickAt.y - this.props.bounds.top - vSize) :\n (this.props.clickAt.y - this.props.bounds.top);\n\n const position = {\n left: left + 'px',\n top: top + 'px'\n };\n\n return (\n \n );\n }\n}\n\nexport default injectIntl(ContextMenu);\n","// Enter one credential at a time.\n\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\nimport PhoneEdit from './phone-edit.jsx';\nimport { parsePhoneNumber } from 'libphonenumber-js/mobile';\n\nexport default class CredentialEdit extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.state = {\n tel: '',\n email: ''\n };\n\n this.handleSubmit = this.handleSubmit.bind(this);\n this.handleEmailChange = this.handleEmailChange.bind(this);\n this.handlePhoneChange = this.handlePhoneChange.bind(this);\n }\n\n formatPhoneNumber(raw) {\n const number = parsePhoneNumber(raw);\n return number ? number.formatInternational() : raw;\n }\n\n handleEmailChange(e) {\n this.setState({email: e.target.value});\n }\n\n handlePhoneChange(number) {\n console.log(\"handlePhoneChange\", number);\n this.setState({tel: number});\n }\n\n handleSubmit(e) {\n e.preventDefault();\n const value = this.props.method == 'email' ? this.state.email : this.state.tel;\n console.log(\"handleSubmit\", value);\n if (value) {\n this.props.onSubmit(value);\n }\n }\n\n render() {\n return ();\n }\n}\n","// Image zoom and crop widget.\n\nimport React from 'react';\n\nconst DEFAULT_MAX_ZOOM = 2.5;\n\nexport default class Cropper extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = {\n // Coordinates of the top left corner of the image in container coordinates.\n panX: 0,\n panY: 0,\n // Origin of the zoom in image coordinates.\n originX: 0,\n originY: 0,\n // Zoom scale.\n zoom: 1,\n // Zoom min and max.\n minZoom: 0,\n maxZoom: DEFAULT_MAX_ZOOM,\n };\n\n // References to DOM elements for hooking up events and getting screen dimensions.\n // The transparent element which captures mouse moves (moves with the image).\n this.overlay = React.createRef();\n // The image cutout window or view port (static).\n this.cutout = React.createRef();\n // Scaled and translated image preview.\n this.preview = React.createRef();\n // The main container (static).\n this.boundingBox = React.createRef();\n\n // The original image width and height before any scaling.\n this.imageWidth = 0;\n this.imageHeight = 0;\n\n // Mouse position when dragging.\n this.mouseX = 0\n this.mouseY = 0;\n // Length of the previous mouse move when dragging.\n this.prevDistance = 0;\n\n // Bounding rectangles of static elements.\n this.cutoutRect = {};\n this.bBoxRect = {};\n // Center of the bounding box.\n this.originX = 0;\n this.originY = 0;\n\n this.initScaling = this.initScaling.bind(this);\n this.onZoom = this.onZoom.bind(this);\n this.handleZoom = this.handleZoom.bind(this);\n this.mouseDown = this.mouseDown.bind(this);\n this.mouseUp = this.mouseUp.bind(this);\n this.mouseMove = this.mouseMove.bind(this);\n this.mouseTouch = this.mouseTouch.bind(this);\n this.positionAll = this.positionAll.bind(this);\n this.translate = this.translate.bind(this);\n }\n\n componentDidMount() {\n this.overlay.current.addEventListener('mousedown', this.mouseDown, { passive: true });\n this.overlay.current.addEventListener('touchstart', this.mouseDown, { passive: true });\n\n // The rectangle position is in viewport coordinates.\n this.bBoxRect = this.boundingBox.current.getBoundingClientRect();\n // Center of the bounding box in container coordinates.\n this.originX = this.bBoxRect.width / 2;\n this.originY = this.bBoxRect.height / 2;\n\n // The rectangle position is in viewport coordinates.\n this.cutoutRect = this.cutout.current.getBoundingClientRect();\n }\n\n componentWillUnmount() {\n this.overlay.current.removeEventListener('mousedown', this.mouseDown);\n this.overlay.current.removeEventListener('touchstart', this.mouseDown);\n }\n\n // Position all elements.\n positionAll(panX, panY, zoom) {\n // Zoom origin in image preview coordinates.\n this.setState({\n panX: panX,\n panY: panY,\n zoom: zoom,\n originX: this.originX - panX,\n originY: this.originY - panY,\n });\n\n // Pass cut out coordinates to caller.\n const left = (this.originX - panX) * zoom - this.originX;\n const top = (this.originY - panY) * zoom - this.originY;\n this.props.onChange(\n (left + this.cutoutRect.left - this.bBoxRect.left) / zoom,\n (top + this.cutoutRect.top - this.bBoxRect.top) / zoom,\n this.cutoutRect.width / zoom,\n this.cutoutRect.height / zoom,\n zoom);\n }\n\n // Check if new location is within the limits.\n static checkBound(currPan, img, cutout, delta) {\n let nextDiff = Math.min(0, cutout[0] - img[0] - delta, img[1] - cutout[1] + delta);\n if (nextDiff == 0) {\n // Cutout is completely within the image.\n currPan += delta;\n } else if (Math.min(0, cutout[0] - img[0], img[1] - cutout[1]) < nextDiff) {\n // Cutout is outside of the range but closer to the bound.\n currPan += delta;\n }\n return currPan;\n }\n\n initScaling() {\n // Initialize components.\n const imgRect = this.preview.current.getBoundingClientRect();\n\n this.imageWidth = imgRect.width;\n this.imageHeight = imgRect.height;\n\n // Set zoom slider's min and max values. Make sure the scaled image cannot be smaller than the cutout.\n const minZoom = Math.max(this.cutoutRect.width / imgRect.width, this.cutoutRect.height / imgRect.height);\n this.setState({\n minZoom: minZoom,\n maxZoom: Math.max(DEFAULT_MAX_ZOOM, minZoom + 1)\n });\n\n // Initial zoom level fills the bounding box at the smallest image dimension and overflows the largest, i.e. \"fill\" not \"fit\".\n const zoom = Math.max(this.bBoxRect.width / imgRect.width, this.bBoxRect.height / imgRect.height);\n // Converting from viewport coordinates to container, then panning.\n const panX = this.cutoutRect.left - this.bBoxRect.left -\n (imgRect.width - this.cutoutRect.width) / 2;\n const panY = this.cutoutRect.top - this.bBoxRect.top -\n (imgRect.height - this.cutoutRect.height) / 2;\n\n this.positionAll(panX, panY, zoom);\n }\n\n onZoom(e) {\n this.handleZoom(e.target.value);\n }\n\n handleZoom(zoom) {\n let panX = this.state.panX;\n let panY = this.state.panY;\n\n // Ensure that the image at the new zoom is not outside of the cutout boundaries.\n // Calculate image coordinates at the new zoom.\n const imgLeft = this.originX - (this.originX - panX) * zoom;\n const imgRight = imgLeft + this.imageWidth * zoom;\n // Cutout in the same coordinates as the image.\n const coLeft = this.cutoutRect.left - this.bBoxRect.left;\n const coRight = coLeft + this.cutoutRect.width;\n if (coLeft < imgLeft) {\n panX -= imgLeft - coLeft;\n } else if (coRight > imgRight) {\n panX += coRight - imgRight;\n }\n const imgTop = this.originY - (this.originY - panY) * zoom;\n const imgBottom = imgTop + this.imageHeight * zoom;\n const coTop = this.cutoutRect.top - this.bBoxRect.top;\n const coBottom = coTop + this.cutoutRect.height;\n if (coTop < imgTop) {\n panY -= imgTop - coTop;\n } else if (coBottom > imgBottom) {\n panY += coBottom - imgBottom;\n }\n\n this.positionAll(panX, panY, zoom);\n }\n\n mouseDown(e) {\n if (e.touches) {\n this.mouseX = e.touches[0].pageX;\n this.mouseY = e.touches[0].pageY;\n } else {\n this.mouseX = e.pageX;\n this.mouseY = e.pageY;\n }\n\n window.addEventListener('mousemove', this.mouseMove, { passive: false });\n window.addEventListener('touchmove', this.mouseTouch, { passive: false });\n window.addEventListener('mouseup', this.mouseUp, { passive: true });\n window.addEventListener('touchend', this.mouseUp, { passive: true });\n // Disable text selection in the entire document.\n document.body.style['userSelect'] = 'none';\n }\n\n // Perform image panning.\n translate(pageX, pageY) {\n const dX = pageX - this.mouseX;\n const dY = pageY - this.mouseY;\n\n this.mouseX = pageX;\n this.mouseY = pageY;\n\n // Make sure the image is within the cutout window.\n const imgRect = this.preview.current.getBoundingClientRect();\n\n // Check if the new position is within the boundaries, and if not if it's closer to them.\n let panX = Cropper.checkBound(this.state.panX, [imgRect.left, imgRect.right],\n [this.cutoutRect.left, this.cutoutRect.right], dX);\n let panY = Cropper.checkBound(this.state.panY, [imgRect.top, imgRect.bottom],\n [this.cutoutRect.top, this.cutoutRect.bottom], dY);\n\n this.positionAll(panX, panY, this.state.zoom);\n }\n\n // Image panning.\n mouseMove(e) {\n e.preventDefault();\n this.translate(e.pageX, e.pageY);\n }\n\n mouseTouch(e) {\n e.preventDefault();\n\n if (e.touches.length == 1) {\n this.translate(e.touches[0].pageX, e.touches[0].pageY);\n return;\n }\n\n // Image zooming by pinching.\n const [touch0, touch1] = e.touches;\n const distance = Math.sqrt((touch0.pageX - touch1.pageX) * (touch0.pageX - touch1.pageX) +\n (touch0.pageY - touch1.pageY) * (touch0.pageY - touch1.pageY));\n\n if (!this.prevDistance) {\n this.prevDistance = distance / this.state.zoom;\n }\n\n let scale = (distance / this.prevDistance);\n this.handleZoom(Math.max(this.minZoom, Math.min(this.maxZoom, scale)));\n }\n\n mouseUp(e) {\n window.removeEventListener('mousemove', this.mouseMove);\n window.removeEventListener('touchmove', this.mouseTouch);\n window.removeEventListener('mouseup', this.mouseUp);\n window.removeEventListener('touchend', this.mouseUp);\n // Re-enable text selection.\n document.body.style['userSelect'] = '';\n\n this.positionAll(this.state.panX, this.state.panY, this.state.zoom);\n }\n\n render() {\n // transform3d: position and scale.\n const t3d = `translate3d(${this.state.panX}px, ${this.state.panY}px, 0) scale(${this.state.zoom})`;\n // transformOrigin: zoom origin.\n const orig = `${this.state.originX}px ${this.state.originY}px`;\n\n // Overlay position and size are exactly equal to the position and size of the transformed image\n // except it uses different coordinates.\n const overlay = {\n top: `${this.originY - this.state.originY * this.state.zoom}px`,\n left: `${this.originX - this.state.originX * this.state.zoom}px`,\n width: `${this.imageWidth * this.state.zoom}px`,\n height: `${this.imageHeight * this.state.zoom}px`\n };\n return (\n \n
\n
\n
\n
\n
\n
\n \n
\n
\n );\n }\n}\n","import React from 'react';\nimport { FormattedMessage } from 'react-intl';\nimport SendMessage from '../widgets/send-message.jsx';\n\nimport { bytesToHumanSize, shortenFileName } from '../lib/strformat.js';\n\n// Get material icon name from mime type.\nfunction iconFromMime(mime) {\n // If more icons become available in material icons, add them to this mime-to-icon mapping.\n const mimeToIcon = {default: 'insert_drive_file', image: 'image', text: 'description', video: 'theaters'};\n\n return mimeToIcon[mime] || mimeToIcon[(mime || '').split('/')[0]] || mimeToIcon['default'];\n}\n\nexport default class DocPreview extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.handleSendDoc = this.handleSendDoc.bind(this);\n }\n\n handleSendDoc(caption) {\n this.props.onClose();\n this.props.onSendMessage(this.props.content.file);\n }\n\n render() {\n if (!this.props.content) {\n return null;\n }\n return (\n \n
\n
\n
\n
{iconFromMime(this.props.content.type)} \n
{shortenFileName(this.props.content.name, 24) || '-'}
\n
{this.props.content.type || 'application/octet-stream'}
\n
{bytesToHumanSize(this.props.content.size)}
\n
\n
\n
\n
\n );\n }\n};\n","import React from 'react';\n\nimport MenuCancel from './menu-cancel.jsx';\n\nexport default class ErrorPanel extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.state = {\n show: false,\n };\n\n this.hide = this.hide.bind(this);\n }\n\n componentDidUpdate(prevProps) {\n if (prevProps.level !== this.props.level) {\n this.setState({\n show: !(!this.props.level)\n });\n }\n }\n\n hide() {\n this.setState({show: false});\n if (this.props.onClearError) {\n this.props.onClearError();\n }\n }\n\n render() {\n const icons = {err: 'error', warn: 'warning', info: 'info'}\n const level = icons[this.props.level] || '';\n const className = 'info-box ' + level;\n return (\n \n );\n }\n};\n","// File uload/download progress indicator with a cancel inside.\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nexport default class FileProgress extends React.PureComponent {\n render() {\n return (\n \n );\n }\n}\n","// Forward Menu: message forwarding popup/dropdown menu.\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport { Tinode } from 'tinode-sdk';\n\nimport ContactList from './contact-list.jsx';\nimport SearchContacts from './search-contacts.jsx';\n\nexport default class ForwardDialog extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = {\n query: null\n };\n\n this.handleEscapeKey = this.handleEscapeKey.bind(this);\n this.handleClose = this.handleClose.bind(this);\n\n this.handleSearchContacts = this.handleSearchContacts.bind(this);\n this.handleContactSelected = this.handleContactSelected.bind(this);\n }\n\n componentDidMount() {\n this.props.onInitFind();\n }\n\n handleEscapeKey(e) {\n if (e.keyCode === 27) {\n // Not forwarding the message.\n this.props.hide(false);\n }\n }\n\n handleClose(e) {\n e.preventDefault();\n this.props.hide(false);\n }\n\n handleSearchContacts(query) {\n this.setState({ query: Tinode.isNullValue(query) ? null : query });\n this.props.onSearchContacts(query);\n }\n\n handleContactSelected(uid) {\n this.props.onTopicSelected(uid);\n this.props.hide(true);\n }\n\n render() {\n let contacts = this.state.query != null ? this.props.searchResults : this.props.contacts;\n // Filter out contacts without a 'W' or 'J' permissions as well as the current topic.\n contacts = contacts.filter((c) => {\n return (c.name != this.props.topicSelected) && c.acs.isJoiner() && c.acs.isWriter();\n });\n\n return (\n \n
\n
\n
{\n (search_placeholder) => \n } \n
{\n (not_found_placeholder) => \n } \n
\n
\n );\n }\n}\n","// GroupMembers: control for managing a list of group members.\nimport React from 'react';\nimport { FormattedMessage, defineMessages, injectIntl } from 'react-intl';\n\nimport ChipInput from './chip-input.jsx';\nimport ContactList from './contact-list.jsx';\n\nconst messages = defineMessages({\n no_contacts: {\n id: 'no_contacts',\n defaultMessage: 'You have no contacts :-(',\n description: 'Shown in ContactsView when the user has no contacts'\n },\n contacts_not_found_short: {\n id: 'contacts_not_found_short',\n defaultMessage: \"No contacts match ''{query}''\",\n description: 'Shown in ContactsView when search returned no results'\n }\n});\n\nclass GroupManager extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = {\n // Array of topic members\n members: props.members,\n index: GroupManager.indexMembers(props.members),\n staticMembers: GroupManager.staticMembers(props.members, props.keepInitialMembers, props.requiredMember),\n contactFilter: '',\n noContactsMessage: props.intl.formatMessage(messages.no_contacts),\n selectedContacts: GroupManager.selectedContacts(props.members)\n };\n\n this.handleContactSelected = this.handleContactSelected.bind(this);\n this.handleMemberRemoved = this.handleMemberRemoved.bind(this);\n this.handleContactFilter = this.handleContactFilter.bind(this);\n this.handleSubmit = this.handleSubmit.bind(this);\n this.handleCancel = this.handleCancel.bind(this);\n }\n\n static indexMembers(members) {\n let index = {};\n members.map((m) => {\n index[m.user] = {delta: 0, present: true}; // Delta: 0 unchanged, +1 added, -1 removed\n });\n return index;\n }\n\n static staticMembers(members, keepInitial, requiredMember) {\n let stat = [];\n members.map((m) => {\n if (keepInitial || m.user == requiredMember) {\n stat.push(m.user);\n }\n });\n return stat;\n }\n\n static selectedContacts(members) {\n let sel = [];\n members.map((m) => {\n sel.push(m.user);\n });\n return sel;\n }\n\n handleContactSelected(userId, index) {\n let status = this.state.index[userId];\n if (status) {\n if (status.present) {\n // Prevent duplicate members\n return;\n }\n status.delta += 1;\n status.present = true;\n } else {\n status = {delta: 1, present: true};\n }\n\n let m = this.state.members.slice();\n m.push(this.props.contacts[index]);\n\n const sel = GroupManager.selectedContacts(m);\n\n const i = this.state.index;\n i[userId] = status;\n\n this.setState({members: m, index: i, selectedContacts: sel});\n }\n\n handleMemberRemoved(userId, index) {\n const status = this.state.index[userId];\n if (!status || !status.present) {\n return;\n }\n status.present = false;\n status.delta -= 1;\n\n let m = this.state.members.slice();\n m.splice(index, 1);\n\n const sel = GroupManager.selectedContacts(m);\n\n const i = this.state.index;\n i[userId] = status;\n\n this.setState({members: m, index: i, selectedContacts: sel});\n }\n\n handleContactFilter(val) {\n const {formatMessage} = this.props.intl;\n const msg = !val ?\n formatMessage(messages.no_contacts) :\n formatMessage(messages.contacts_not_found_short, {query: val});\n\n this.setState({contactFilter: val, noContactsMessage: msg});\n }\n\n static doContactFiltering(filter, values) {\n if (filter) {\n for (let i=0; i= 0) {\n return true;\n }\n }\n return false;\n }\n return true;\n }\n\n handleSubmit() {\n var instance = this;\n var members = [];\n var added = [];\n var removed = [];\n\n var keys = Object.keys(this.state.index);\n keys.map(function(k) {\n if (instance.state.index[k].present) {\n members.push(k);\n }\n\n if (instance.state.index[k].delta > 0) {\n added.push(k);\n } else if (instance.state.index[k].delta < 0) {\n removed.push(k);\n }\n });\n this.props.onSubmit(members, added, removed);\n }\n\n handleCancel() {\n this.props.onCancel();\n }\n\n render() {\n const {formatMessage} = this.props.intl;\n return (\n \n
\n \n \n \n
\n
\n \n
\n
\n \n \n \n
\n
\n
\n \n \n \n \n \n \n
\n
\n );\n }\n};\n\nexport default injectIntl(GroupManager);\n","// GroupSubs: a list of group subscribers currently online.\n// Show in the topic title bar\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport { MAX_ONLINE_IN_TOPIC } from '../config.js'\n\nimport LetterTile from './letter-tile.jsx';\nimport { makeImageUrl } from '../lib/blob-helpers.js';\n\nexport default class GroupSubs extends React.Component {\n constructor(props) {\n super(props);\n }\n\n render() {\n const usersOnline = [];\n const totalCount = (this.props.subscribers || []).length;\n const countToShow = Math.min(MAX_ONLINE_IN_TOPIC, totalCount);\n\n (this.props.subscribers || []).some((sub) => {\n usersOnline.push(\n \n \n
\n );\n return usersOnline.length == countToShow;\n });\n\n return (\n {usersOnline} {totalCount > countToShow ?\n \n \n : null}\n
\n );\n }\n};\n","import React from 'react';\n\nimport { KNOWN_HOSTS } from '../config.js';\n\n/* Combobox for selecting host name */\n\nexport default class HostSelector extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.state = {\n hostName: props.serverAddress,\n changed: false\n };\n\n this.handleHostNameChange = this.handleHostNameChange.bind(this);\n this.handleEditingFinished = this.handleEditingFinished.bind(this);\n this.handleKeyDown = this.handleKeyDown.bind(this);\n }\n\n handleHostNameChange(e) {\n this.setState({hostName: e.target.value, changed: true});\n }\n\n handleEditingFinished() {\n if (this.state.changed) {\n this.setState({changed: false});\n this.props.onServerAddressChange(this.state.hostName.trim());\n }\n }\n\n handleKeyDown(e) {\n if (e.key == 'Enter') {\n this.handleEditingFinished();\n }\n }\n\n render() {\n var hostOptions = [];\n for (let key in KNOWN_HOSTS) {\n let item = KNOWN_HOSTS[key];\n hostOptions.push(\n \n );\n }\n return (\n \n \n \n {hostOptions}\n \n
\n );\n }\n}\n","import React from 'react';\nimport { FormattedMessage } from 'react-intl';\nimport SendMessage from './send-message.jsx';\n\nimport { REM_SIZE } from '../config.js';\nimport { fitImageSize } from '../lib/blob-helpers.js';\nimport { bytesToHumanSize, shortenFileName } from '../lib/strformat.js';\n\nexport default class ImagePreview extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.state = {\n width: 0,\n height: 0\n };\n\n this.handleSendImage = this.handleSendImage.bind(this);\n }\n\n assignWidth(node) {\n if (node && !this.state.width) {\n const bounds = node.getBoundingClientRect();\n this.setState({\n width: bounds.width | 0,\n height: bounds.height | 0\n });\n }\n }\n\n handleSendImage(caption) {\n this.props.onClose();\n this.props.onSendMessage(caption, this.props.content.blob);\n }\n\n render() {\n if (!this.props.content) {\n return null;\n }\n\n const dim = fitImageSize(this.props.content.width, this.props.content.height,\n this.state.width, this.state.height, false);\n const size = dim ? { width: dim.dstWidth + 'px', height: dim.dstHeight + 'px' } :\n ((this.props.content.width > this.props.content.height) ? {width: '100%'} : {height: '100%'});\n size.maxWidth = '100%';\n size.maxHeight = '100%';\n\n // Average font aspect ratio is ~0.5; File name takes 1/3 of the viewport width.\n const maxlength = Math.max(((this.state.width / REM_SIZE / 1.5) | 0) - 2, 12);\n const fname = shortenFileName(this.props.content.filename, maxlength) || '-';\n\n const width = this.props.content.width || '-';\n const height = this.props.content.height || '-';\n return (\n \n
\n
this.assignWidth(node)}>\n
\n
\n {this.props.onSendMessage ?\n
\n :\n }\n
\n );\n }\n};\n","// In-place text editor. Shows text with an icon which toggles it into an input field.\nimport React from 'react';\n\nimport VisiblePassword from './visible-password.jsx';\n\nexport default class InPlaceEdit extends React.Component {\n constructor(props) {\n super(props);\n\n this.selfRef = React.createRef();\n\n this.state = {\n active: props.active,\n initialValue: props.value || '',\n value: props.value || ''\n };\n\n this.handeTextChange = this.handeTextChange.bind(this);\n this.handleKeyDown = this.handleKeyDown.bind(this);\n this.handleStartEditing = this.handleStartEditing.bind(this);\n this.handleEditingFinished = this.handleEditingFinished.bind(this);\n this.handlePasswordFinished = this.handlePasswordFinished.bind(this);\n }\n\n componentDidUpdate(prevProps, prevState) {\n // If text has changed while in read mode, update text and discard changes.\n // Ignore update if in edit mode.\n const newValue = this.props.value || '';\n if (prevState.initialValue != newValue && !prevState.active) {\n this.setState({\n initialValue: newValue,\n value: newValue\n });\n }\n }\n\n handeTextChange(e) {\n this.setState({value: e.target.value || ''});\n }\n\n handleKeyDown(e) {\n if (e.keyCode === 27) {\n // Escape pressed\n this.setState({value: this.props.value, active: false});\n } else if (e.keyCode === 13) {\n // Enter pressed\n this.handleEditingFinished(e);\n }\n }\n\n handleStartEditing() {\n if (!this.props.readOnly) {\n this.setState({active: true}, _ => {\n if (this.selfRef.current) {\n this.selfRef.current.focus();\n }\n });\n }\n }\n\n handleEditingFinished(event) {\n const value = this.state.value.trim();\n if (this.props.required && (!event.target.checkValidity() || !value)) {\n // Empty input\n this.setState({value: this.props.value, active: false});\n return;\n }\n this.setState({active: false});\n if ((value || this.props.value) && (value !== this.props.value)) {\n this.props.onFinished(value);\n }\n }\n\n handlePasswordFinished(value) {\n this.setState({active: false});\n if (value && (value !== this.props.value)) {\n this.props.onFinished(value);\n }\n }\n\n render() {\n if (!this.state.active) {\n let spanText = this.props.type == 'password' ? '••••••••' : this.state.value;\n let spanClass = 'in-place-edit' + (this.props.readOnly ? ' disabled' : '');\n if (!spanText) {\n spanText = this.props.placeholder;\n spanClass += ' placeholder';\n }\n if (!this.props.multiline || this.props.multiline == 1) {\n spanClass += ' short';\n }\n\n return (\n {spanText} \n );\n }\n\n let element;\n const attr = {};\n if (this.props.type == 'password') {\n element = VisiblePassword;\n attr.onFinished = this.handlePasswordFinished;\n } else {\n if (this.props.multiline > 1) {\n element = 'textarea';\n attr.rows = this.props.multiline;\n attr.className = 'inplace-edit';\n } else {\n element = 'input';\n attr.type = this.props.type || 'text';\n }\n attr.value = this.state.value;\n attr.ref = this.selfRef;\n attr.onChange = this.handeTextChange;\n attr.onKeyDown = this.handleKeyDown;\n attr.onBlur = this.handleEditingFinished;\n }\n attr.placeholder = this.props.placeholder;\n attr.required = this.props.required ? 'required' : '';\n attr.autoComplete = this.props.autoComplete;\n attr.autoFocus = true;\n\n return React.createElement(element, attr, null);\n }\n};\n","// Element which shows static video preview:\n// an image with duration and a play button in the middle.\n\nimport React from 'react';\n\nimport { secondsToTime } from '../lib/strformat.js'\n\nexport default class InlineVideo extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.videoRef = React.createRef();\n\n this.handleClick = this.handleClick.bind(this);\n }\n\n handleClick(e) {\n if (this.props.onClick) {\n // the click target has to be the image element.\n this.props.onClick(e);\n }\n }\n\n render() {\n const duration = secondsToTime(this.props['data-duration'] / 1000);\n const className = 'inline-video' + (this.props.onClick ? ' image-clickable' : '');\n return (\n \n {React.createElement('img', this.props)}\n {this.props.onClick ?\n
\n play_arrow \n
\n : null}\n {duration ?
{duration}
: null}\n
\n );\n }\n};\n","// A single topic or user.\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nexport default class Invitation extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.handleButtonAction = this.handleButtonAction.bind(this);\n }\n\n handleButtonAction(evt, data) {\n evt.preventDefault();\n this.props.onAction(data);\n }\n\n render() {\n return (\n \n
\n \n
\n
\n { this.handleButtonAction(event, \"accept\"); }}>\n \n \n { this.handleButtonAction(event, \"delete\"); }}>\n \n \n { this.handleButtonAction(event, \"block\"); }}>\n \n \n
\n
\n );\n }\n};\n","// Image with a placeholder which is replaced when the promise is resolved.\nimport React from 'react';\n\nexport default class LazyImage extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.state = {\n src: this.props.isvideo ? 'img/blankvid.png' : 'img/blankimg.png',\n style: Object.assign({padding: '4px'}, this.props.style),\n className: this.props.className,\n alt: this.props.alt,\n onClick: this.props.onClick,\n };\n }\n\n componentDidMount() {\n // whenDone is a wrapper around an actual promise to be able to cancel it.\n this.props.whenDone\n .promise\n .then(data => this.setState({src: data.src, style: {...this.state.style, padding: 0}}))\n .catch(_ => this.setState({src: this.props.isvideo ? 'img/broken_video.png' : 'img/broken_image.png'}));\n }\n\n componentWillUnmount() {\n this.props.whenDone.cancel();\n }\n\n componentDidUpdate(prevProps) {\n if (prevProps.whenDone != this.props.whenDone) {\n this.setState({src: this.props.isvideo ? 'img/blankvid.png' : 'img/blankimg.png', style: {...this.state.style, padding: '4px'}});\n this.props.whenDone\n .promise\n .then(data => this.setState({src: data.src, style: {...this.state.style, padding: 0}}))\n .catch(_ => this.setState({src: this.props.isvideo ? 'img/broken_video.png' : 'img/broken_image.png'}));\n }\n }\n\n render() {\n return React.createElement('img', this.state);\n }\n};\n","import React from 'react';\n\nimport { Tinode } from 'tinode-sdk';\n\nimport { idToColorClass } from '../lib/strformat.js';\nimport { sanitizeUrlForMime } from '../lib/utils.js';\n\nexport default class LetterTile extends React.PureComponent {\n render() {\n let avatar;\n if (this.props.avatar === true) {\n const isGroup = Tinode.isGroupTopicName(this.props.topic);\n const iconColor = idToColorClass(this.props.topic, isGroup);\n if (this.props.topic && this.props.title && this.props.title.trim()) {\n const letter = this.props.title.trim().charAt(0);\n const className = 'lettertile ' + iconColor + (this.props.deleted ? ' disabled' : '');\n avatar = ()\n } else {\n const className = 'material-icons ' + iconColor + (this.props.deleted ? ' disabled' : '');\n avatar = isGroup ? group : person ;\n }\n } else if (this.props.avatar) {\n const url = this.props.tinode.authorizeURL(sanitizeUrlForMime(this.props.avatar, 'image'));\n // If avatar image is invalid, show a placeholder.\n const className = 'avatar' + (this.props.deleted ? ' deleted' : '');\n avatar = {e.target.onerror = null; e.target.src=\"../img/broken_image.png\"}} />;\n } else {\n avatar = null;\n }\n return avatar;\n }\n}\n","import React from 'react';\n\nexport default class LoadSpinner extends React.PureComponent {\n render() {\n const className = 'load-spinner-box' + (this.props.large ? ' large' : '')\n + (this.props.clear ? ' clear' : '') + (this.props.centered ? ' centered' : '');\n return (this.props.show ?\n : null);\n }\n}\n","// The X menu to be displayed in title bars.\nimport React from 'react';\n\nexport default class MenuCancel extends React.PureComponent {\n render() {\n return (\n {e.preventDefault(); this.props.onCancel();}}>\n close \n \n );\n }\n}\n","import React from 'react';\n\nexport default class MenuContacts extends React.PureComponent {\n render() {\n return (\n \n );\n }\n};\n","import React from 'react';\n\nexport default class MenuStart extends React.PureComponent {\n render() {\n return (\n \n );\n }\n};\n","// Message bubble with non-payload content, such as an indicator of deleted content or a date stamp.\n\nimport React from 'react';\n\nexport default class MetaMessage extends React.PureComponent {\n constructor(props) {\n super(props);\n }\n\n render() {\n let content = null;\n let bubbleClass = 'bubble';\n if (this.props.date) {\n // A date badge.\n content = <>{this.props.date}>\n bubbleClass += ' date';\n }\n\n if (!content) {\n return <>{null}>\n }\n\n return (\n \n \n \n );\n }\n};\n","import React from 'react';\nimport { FormattedMessage, defineMessages, injectIntl } from 'react-intl';\n\nconst messages = defineMessages({\n invalid_id: {\n id: 'error_invalid_id',\n defaultMessage: 'Invalid ID',\n description: 'Error message'\n }\n});\n\nclass NewTopicById extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.state = {\n groupId: '',\n };\n\n this.handleChange = this.handleChange.bind(this);\n this.handleKeyPress = this.handleKeyPress.bind(this);\n this.handleSubmit = this.handleSubmit.bind(this);\n }\n\n handleChange(e) {\n this.setState({groupId: e.target.value});\n }\n\n handleKeyPress(e) {\n if (e.key === 'Enter') {\n this.handleSubmit(e);\n }\n }\n\n handleSubmit(e) {\n e.preventDefault();\n if (this.state.groupId) {\n const name = this.state.groupId.trim();\n const prefix = name.substr(0, 3);\n if (name.length > 3 && ['usr', 'grp', 'chn'].includes(prefix)) {\n this.props.onSubmit(name);\n } else {\n this.props.onError(this.props.intl.formatMessage(messages.invalid_id), 'err');\n }\n }\n }\n\n render() {\n return (\n \n
\n {\n (prompt) => \n } \n
\n
\n \n \n \n
\n
\n );\n }\n};\n\nexport default injectIntl(NewTopicById);\n","import React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport AvatarCrop from './avatar-crop.jsx';\nimport AvatarUpload from './avatar-upload.jsx';\nimport CheckBox from './checkbox.jsx';\nimport TagManager from './tag-manager.jsx';\n\nimport { AVATAR_SIZE, MAX_AVATAR_BYTES, MAX_EXTERN_ATTACHMENT_SIZE, MAX_TITLE_LENGTH,\n MAX_TOPIC_DESCRIPTION_LENGTH } from '../config.js';\nimport { imageScaled, blobToBase64, makeImageUrl } from '../lib/blob-helpers.js';\n\nexport default class NewTopicGroup extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.fullName = React.createRef();\n\n this.state = {\n fullName: '', // full/formatted name\n private: '',\n description: '',\n imageUrl: null,\n tags: [],\n isChannel: false,\n newAvatar: null,\n newAvatarMime: null\n };\n\n this.handleFieldEdit = this.handleFieldEdit.bind(this);\n this.handleImageChanged = this.handleImageChanged.bind(this);\n this.handleAvatarCropped = this.handleAvatarCropped.bind(this);\n this.handleAvatarCropCancel = this.handleAvatarCropCancel.bind(this);\n this.uploadAvatar = this.uploadAvatar.bind(this);\n this.handleTagsChanged = this.handleTagsChanged.bind(this);\n this.handleChannelToggle = this.handleChannelToggle.bind(this);\n this.handleSubmit = this.handleSubmit.bind(this);\n }\n\n componentDidMount() {\n // this.fullName.current.focus();\n }\n\n handleFieldEdit(name, e) {\n this.setState({[name]: e.target.value || ''});\n }\n\n handleImageChanged(mime, img) {\n this.setState({newAvatar: img, newAvatarMime: mime});\n }\n\n handleAvatarCropped(mime, blob, width, height) {\n const url = blob ? URL.createObjectURL(blob) : null;\n this.setState({imageUrl: url, newAvatar: null, newAvatarMime: null});\n if (blob) {\n this.uploadAvatar(mime, blob, width, height);\n }\n }\n\n handleAvatarCropCancel() {\n this.setState({newAvatar: null, newAvatarMime: null});\n }\n\n // Utility method for converting cropped avatar blob to bytes for sending inband or\n // for uploading it to the server out of band.\n uploadAvatar(mime, blob, width, height) {\n const readyToUpload = image => {\n let {mime, blob} = image;\n if (blob.size > MAX_AVATAR_BYTES) {\n // Too large to send inband - uploading out of band and sending as a link.\n const uploader = this.props.tinode.getLargeFileHelper();\n uploader.upload(blob)\n .then(url => this.setState({imageUrl: url}))\n .catch(err => this.props.onError(err.message, 'err'));\n } else {\n // Convert blob to base64-encoded bits.\n blobToBase64(blob)\n .then(b64 => this.setState({imageUrl: makeImageUrl({data: b64.bits, type: mime})}));\n }\n };\n\n if (width > AVATAR_SIZE || height > AVATAR_SIZE || width != height) {\n // Avatar is not square or too large even after cropping. Shrink it and make square.\n imageScaled(blob, AVATAR_SIZE, AVATAR_SIZE, MAX_EXTERN_ATTACHMENT_SIZE, true)\n .then(scaled => readyToUpload(scaled))\n .catch(err => this.props.onError(err.message, 'err'));\n } else {\n readyToUpload({mime: mime, blob: blob, width: width, height: height});\n }\n }\n\n handleTagsChanged(tags) {\n this.setState({tags: tags});\n }\n\n handleChannelToggle() {\n this.setState({isChannel: !this.state.isChannel});\n }\n\n handleSubmit(e) {\n e.preventDefault();\n\n const fn = this.state.fullName.trim().substring(0, MAX_TITLE_LENGTH);\n const comment = this.state.private.trim().substring(0, MAX_TITLE_LENGTH);\n const description = this.state.description.trim().substring(0, MAX_TOPIC_DESCRIPTION_LENGTH);\n if (fn) {\n this.props.onSubmit(fn, description, this.state.imageUrl, comment, this.state.tags, this.state.isChannel);\n }\n }\n\n render() {\n if (this.state.newAvatar) {\n return (\n \n );\n }\n\n let submitClasses = 'primary';\n if (this.props.disabled) {\n submitClasses += ' disabled';\n }\n return (\n \n );\n }\n};\n","// PermissionsEditor: Component for editing permissions\n// \nimport React from 'react';\nimport { FormattedMessage, defineMessages, injectIntl } from 'react-intl';\n\nimport CheckBox from './checkbox.jsx';\nimport Contact from './contact.jsx';\n\nimport { makeImageUrl } from '../lib/blob-helpers.js';\n\n// Translatable permission names.\nconst messages = defineMessages({\n joiner: {\n id: 'permission_join',\n defaultMessage: \"Join ({val})\",\n description: 'Name of J permission'\n },\n reader: {\n id: 'permission_read',\n defaultMessage: \"Read ({val})\",\n description: 'Name of R permission'\n },\n writer: {\n id: 'permission_write',\n defaultMessage: \"Write ({val})\",\n description: 'Name of W permission'\n },\n preser: {\n id: 'permission_pres',\n defaultMessage: \"Get notified ({val})\",\n description: 'Name of P permission'\n },\n approver: {\n id: 'permission_admin',\n defaultMessage: \"Approve ({val})\",\n description: 'Name of A permission'\n },\n sharer: {\n id: 'permission_share',\n defaultMessage: \"Share ({val})\",\n description: 'Name of S permission'\n },\n deleter: {\n id: 'permission_delete',\n defaultMessage: \"Delete ({val})\",\n description: 'Name of D permission'\n },\n owner: {\n id: 'permission_owner',\n defaultMessage: \"Owner ({val})\",\n description: 'Name of O permission'\n }\n});\n\nclass PermissionsEditor extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = {\n mode: (props.mode || '').replace('N', '')\n };\n\n this.handleChange = this.handleChange.bind(this);\n this.handleSubmit = this.handleSubmit.bind(this);\n this.handleCancel = this.handleCancel.bind(this);\n }\n\n handleChange(val) {\n let mode = this.state.mode;\n const idx = mode.indexOf(val);\n if (idx == -1) {\n mode += val;\n } else {\n mode = mode.replace(val, '');\n }\n this.setState({mode: mode});\n }\n\n handleSubmit() {\n // Normalize string, otherwise cannot check if mode has changed.\n const mode = (this.state.mode || 'N').split('').sort().join('');\n const before = (this.props.mode || 'N').split('').sort().join('')\n if (mode !== before) {\n this.props.onSubmit(mode);\n } else {\n this.props.onCancel();\n }\n }\n\n handleCancel() {\n this.props.onCancel();\n }\n\n render() {\n const {formatMessage} = this.props.intl;\n const all = 'JRWPASDO';\n const names = {\n 'J': formatMessage(messages.joiner, {val: 'J'}),\n 'R': formatMessage(messages.reader, {val: 'R'}),\n 'W': formatMessage(messages.writer, {val: 'W'}),\n 'P': formatMessage(messages.preser, {val: 'P'}),\n 'A': formatMessage(messages.approver, {val: 'A'}),\n 'S': formatMessage(messages.sharer, {val: 'S'}),\n 'D': formatMessage(messages.deleter, {val: 'D'}),\n 'O': formatMessage(messages.owner, {val: 'O'})\n };\n\n let skip = this.props.skip || '';\n let mode = this.state.mode;\n let compare = (this.props.compare || '').replace('N', '');\n let items = [];\n for (let i=0; i= 0 && mode.indexOf(c) < 0) {\n // Permission is marked as inactive: hide unchecked permissions, disable checked permissions\n continue;\n }\n items.push(\n \n {names[c]} \n {skip.indexOf(c) < 0 ?\n = 0)} onChange={this.handleChange}/>\n :\n = 0)} />\n } {this.props.compare ? \n = 0)}/>\n : null}\n \n );\n }\n\n return (\n \n {this.props.userTitle ?\n
: null}\n
\n
\n {this.props.compare ?\n \n {this.props.modeTitle} \n {this.props.compareTitle} \n :\n null}\n \n {items}\n
\n
\n
\n \n \n \n \n \n \n
\n
\n );\n }\n};\n\nexport default injectIntl(PermissionsEditor);\n","// Editor for a phone number.\n\nimport React from 'react';\nimport { defineMessages, injectIntl } from 'react-intl';\nimport { getExampleNumber, parsePhoneNumber } from 'libphonenumber-js/mobile';\nimport examples from 'libphonenumber-js/mobile/examples'\n\nimport * as dcodes from '../dcodes.json';\nimport { flagEmoji } from '../lib/strformat';\n\nconst messages = defineMessages({\n mobile_number_required: {\n id: 'mobile_number_required',\n defaultMessage: 'Mobile phone number required',\n description: 'Error message'\n }\n});\n\nclass PhoneEdit extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.codeMap = {};\n dcodes.default.forEach(dc => { this.codeMap[dc.code] = dc.dial; });\n\n const code = props.countryCode || 'US';\n const dial = this.codeMap[code];\n\n this.state = {\n countryCode: code,\n dialCode: dial,\n localNumber: '',\n placeholderNumber: this.placeholderNumber(code, dial)\n };\n\n this.handleChange = this.handleChange.bind(this);\n this.handleFinished = this.handleFinished.bind(this);\n this.handleKeyDown = this.handleKeyDown.bind(this);\n this.showCountrySelector = this.showCountrySelector.bind(this);\n }\n\n handleChange(e) {\n this.setState({localNumber: this.filterNumber(e.target.value)});\n }\n\n handleFinished(e) {\n e.preventDefault();\n const raw = `${this.state.dialCode}${this.state.localNumber.trim()}`.replace(/[^\\d]/g, '');\n let number = null;\n try {\n number = parsePhoneNumber(`+${raw}`);\n } catch (err) {}\n\n if (!number || !number.isValid()) {\n this.inputField.setCustomValidity(this.props.intl.formatMessage(messages.mobile_number_required));\n return;\n }\n this.props.onSubmit(number.format('E.164'));\n }\n\n\n handleKeyDown(e) {\n if (e.key === 'Enter') {\n this.handleFinished(e);\n }\n }\n\n showCountrySelector() {\n this.props.onShowCountrySelector(this.state.countryCode, this.state.dialCode,\n (code, dial) => {\n this.setState({\n countryCode: code,\n dialCode: dial,\n placeholderNumber: this.placeholderNumber(code, dial)\n })\n });\n }\n\n // Filter out characters not permitted in a phone number.\n filterNumber(number) {\n if (!number) {\n return number;\n }\n // Leave numbers, space, (, ), -, and .\n // The + is not allowed: it's handled by the country code portion.\n return number.replace(/[^-\\s().\\d]/g, '');\n }\n\n placeholderNumber(code, dial) {\n const sample = getExampleNumber(code, examples);\n return sample ? sample.formatInternational().substring(dial.length + 1).trim() : '123 0123';\n }\n\n render() {\n return (\n <>\n \n {flagEmoji(this.state.countryCode)} \n +{this.state.dialCode} \n {this.inputField = ref}} placeholder={this.state.placeholderNumber}\n value={this.state.localNumber} onChange={this.handleChange}\n maxLength={17} onKeyDown={this.handleKeyDown} onBlur={this.handleFinished}\n required autoFocus={this.props.autoFocus} />\n >\n );\n }\n}\n\nexport default injectIntl(PhoneEdit);\n","// Received/read indicator.\nimport React from 'react';\nimport { defineMessages, injectIntl } from 'react-intl';\n\nimport { Tinode } from 'tinode-sdk';\n\nimport { deliveryMarker } from '../lib/utils.js';\n\nconst messages = defineMessages({\n message_sending: {\n id: 'message_sending',\n defaultMessage: 'sending...',\n description: 'Message being sent, in place of time stamp'\n },\n message_sending_failed: {\n id: 'message_sending_failed',\n defaultMessage: 'failed',\n description: 'Failed to send message, in place of time stamp'\n },\n message_edited_marker: {\n id: 'message_edited_marker',\n defaultMessage: ', edited',\n description: 'Marker indicating that the message was edited'\n }\n});\n\nclass ReceivedMarker extends React.PureComponent {\n render() {\n const {formatMessage} = this.props.intl;\n let timestamp;\n if (this.props.received <= Tinode.MESSAGE_STATUS_SENDING) {\n timestamp = formatMessage(messages.message_sending);\n } else if (this.props.received == Tinode.MESSAGE_STATUS_FAILED) {\n timestamp = formatMessage(messages.message_sending_failed);\n } else {\n timestamp = this.props.timestamp.toLocaleTimeString(this.props.intl.locale, { timeStyle: 'short' });\n }\n\n const icon = deliveryMarker(this.props.received);\n const marker = icon ? {icon.name} : null;\n const edited = this.props.edited ? formatMessage(messages.message_edited_marker) : null;\n\n return (\n \n {timestamp}{edited}{'\\u00a0'}{marker}\n \n );\n }\n};\n\nexport default injectIntl(ReceivedMarker);\n","import React from 'react';\n\nimport { Tinode } from 'tinode-sdk';\n\nexport default class SearchContacts extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.state = {\n edited: false,\n search: ''\n };\n\n this.handleSearchChange = this.handleSearchChange.bind(this);\n this.handleSearch = this.handleSearch.bind(this);\n this.handleClear = this.handleClear.bind(this);\n this.handleKeyDown = this.handleKeyDown.bind(this);\n }\n\n componentWillUnmount() {\n if (this.state.edited) {\n this.setState({search: '', edited: false});\n this.props.onSearchContacts(Tinode.DEL_CHAR);\n }\n }\n\n handleSearchChange(e) {\n this.setState({search: e.target.value});\n }\n\n handleSearch(e) {\n e.preventDefault();\n const query = this.state.search.trim();\n this.setState({edited: (query.length > 0)});\n this.props.onSearchContacts(query.length > 0 ? query : Tinode.DEL_CHAR);\n }\n\n handleClear(e) {\n e.preventDefault();\n if (this.state.edited) {\n this.props.onSearchContacts(Tinode.DEL_CHAR);\n }\n this.setState({search: '', edited: false});\n }\n\n handleKeyDown(e) {\n if (e.key === 'Enter') {\n this.handleSearch(e);\n } else if (e.key === 'Escape') {\n this.handleClear();\n }\n }\n\n render() {\n return (\n \n );\n }\n};\n","// Send message form.\nimport React, { Suspense } from 'react';\nimport { FormattedMessage, defineMessages, injectIntl } from 'react-intl';\nimport { Drafty } from 'tinode-sdk';\n\n// Lazy-loading AudioRecorder because it's quite large due to\n// a dependency on webm-duration-fix.\nconst AudioRecorder = React.lazy(_ => import('./audio-recorder.jsx'));\n\nimport { KEYPRESS_DELAY } from '../config.js';\nimport { filePasted } from '../lib/blob-helpers.js';\nimport { replyFormatter } from '../lib/formatters.js';\n\nconst messages = defineMessages({\n messaging_disabled: {\n id: 'messaging_disabled_prompt',\n defaultMessage: 'Messaging disabled',\n description: 'Prompt in SendMessage in read-only topic'\n },\n type_new_message: {\n id: 'new_message_prompt',\n defaultMessage: 'New message',\n description: 'Prompt in send message field'\n },\n add_image_caption: {\n id: 'image_caption_prompt',\n defaultMessage: 'Image caption',\n description: 'Prompt in SendMessage for attached image'\n },\n file_attachment_too_large: {\n id: 'file_attachment_too_large',\n defaultMessage: 'The file size {size} exceeds the {limit} limit.',\n description: 'Error message when attachment is too large'\n },\n cannot_initiate_upload: {\n id: 'cannot_initiate_file_upload',\n defaultMessage: 'Cannot initiate file upload.',\n description: 'Generic error messagewhen attachment fails'\n },\n icon_title_record_voice: {\n id: 'icon_title_record_voice',\n defaultMessage: 'Record voice message',\n description: 'Icon tool tip for recording a voice message'\n },\n icon_title_attach_file: {\n id: 'icon_title_attach_file',\n defaultMessage: 'Attach file',\n description: 'Icon tool tip for attaching a file'\n },\n icon_title_add_image: {\n id: 'icon_title_add_image',\n defaultMessage: 'Add image',\n description: 'Icon tool tip for attaching an image'\n },\n icon_title_send: {\n id: 'icon_title_send',\n defaultMessage: 'Send message',\n description: 'Icon tool tip for sending a message'\n },\n});\n\nclass SendMessage extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.state = {\n quote: null,\n message: '',\n audioRec: false,\n audioAvailable: !!(navigator.mediaDevices && navigator.mediaDevices.getUserMedia),\n };\n\n // Timestamp when the previous key press was sent to the server.\n this.keypressTimestamp = 0;\n\n this.handlePasteEvent = this.handlePasteEvent.bind(this);\n this.handleAttachImage = this.handleAttachImage.bind(this);\n this.handleAttachFile = this.handleAttachFile.bind(this);\n this.handleAttachAudio = this.handleAttachAudio.bind(this);\n this.handleSend = this.handleSend.bind(this);\n this.handleKeyPress = this.handleKeyPress.bind(this);\n this.handleMessageTyping = this.handleMessageTyping.bind(this);\n this.handleDropAttach = this.handleDropAttach.bind(this);\n\n this.handleQuoteClick = this.handleQuoteClick.bind(this);\n\n this.formatReply = this.formatReply.bind(this);\n }\n\n componentDidMount() {\n if (this.messageEditArea) {\n this.messageEditArea.addEventListener('paste', this.handlePasteEvent, false);\n if (window.getComputedStyle(this.messageEditArea).getPropertyValue('transition-property') == 'all') {\n // Set focus on desktop, but not on mobile: focus causes soft keyboard to pop up.\n this.messageEditArea.focus();\n }\n }\n\n this.setState({quote: this.formatReply()});\n }\n\n componentWillUnmount() {\n if (this.messageEditArea) {\n this.messageEditArea.removeEventListener('paste', this.handlePasteEvent, false);\n }\n }\n\n componentDidUpdate(prevProps) {\n if (this.messageEditArea) {\n if (window.getComputedStyle(this.messageEditArea).getPropertyValue('transition-property') == 'all') {\n // Set focus on desktop, but not on mobile: focus causes soft keyboard to pop up.\n this.messageEditArea.focus();\n }\n }\n\n if (prevProps.topicName != this.props.topicName) {\n this.setState({message: this.props.initMessage || '', audioRec: false, quote: null});\n } else if (prevProps.initMessage != this.props.initMessage) {\n const msg = this.props.initMessage || '';\n this.setState({message: msg}, _ => {\n // If there is text, scroll to bottom and set caret to the end.\n this.messageEditArea.scrollTop = this.messageEditArea.scrollHeight;\n this.messageEditArea.setSelectionRange(msg.length, msg.length);\n });\n }\n if (prevProps.reply != this.props.reply) {\n this.setState({quote: this.formatReply()});\n }\n }\n\n formatReply() {\n return this.props.reply ?\n Drafty.format(this.props.reply.content, replyFormatter, {\n formatMessage: this.props.intl.formatMessage.bind(this.props.intl),\n authorizeURL: this.props.tinode.authorizeURL.bind(this.props.tinode)\n }) : null;\n }\n\n handlePasteEvent(e) {\n if (this.props.disabled) {\n return;\n }\n // FIXME: handle large files too.\n if (filePasted(e,\n file => { this.props.onAttachImage(file); },\n file => { this.props.onAttachFile(file); },\n this.props.onError)) {\n\n // If a file was pasted, don't paste base64 data into input field.\n e.preventDefault();\n }\n }\n\n handleAttachImage(e) {\n if (e.target.files && e.target.files.length > 0) {\n this.props.onAttachImage(e.target.files[0]);\n }\n // Clear the value so the same file can be uploaded again.\n e.target.value = '';\n }\n\n handleAttachFile(e) {\n if (e.target.files && e.target.files.length > 0) {\n this.props.onAttachFile(e.target.files[0]);\n }\n // Clear the value so the same file can be uploaded again.\n e.target.value = '';\n }\n\n handleDropAttach(files) {\n if (files && files.length > 0) {\n this.props.onAttachFile(files[0]);\n }\n }\n\n handleAttachAudio(url, preview, duration) {\n this.setState({audioRec: false});\n this.props.onAttachAudio(url, preview, duration);\n }\n\n handleSend(e) {\n e.preventDefault();\n const message = this.state.message.trim();\n if (message || this.props.acceptBlank || this.props.noInput) {\n this.props.onSendMessage(message);\n this.setState({message: ''});\n }\n }\n\n /* Send on Enter key */\n handleKeyPress(e) {\n if (this.state.audioRec) {\n // Ignore key presses while audio is being recorded.\n e.preventDefault();\n e.stopPropagation();\n return;\n }\n\n // Remove this if you don't want Enter to trigger send\n if (e.key === 'Enter') {\n // Have Shift-Enter insert a line break instead\n if (!e.shiftKey) {\n e.preventDefault();\n e.stopPropagation();\n\n this.handleSend(e);\n }\n }\n }\n\n handleMessageTyping(e) {\n this.setState({message: e.target.value});\n if (this.props.onKeyPress) {\n const now = new Date().getTime();\n if (now - this.keypressTimestamp > KEYPRESS_DELAY) {\n this.props.onKeyPress();\n this.keypressTimestamp = now;\n }\n }\n }\n\n handleQuoteClick(e) {\n e.preventDefault();\n e.stopPropagation();\n if (this.props.reply && this.props.onQuoteClick) {\n const replyToSeq = this.props.reply.seq;\n this.props.onQuoteClick(replyToSeq);\n }\n }\n\n render() {\n const { formatMessage } = this.props.intl;\n const prompt = this.props.disabled ?\n formatMessage(messages.messaging_disabled) :\n (this.props.messagePrompt ?\n formatMessage(messages[this.props.messagePrompt]) :\n formatMessage(messages.type_new_message));\n\n const sendIcon = (this.props.reply && this.props.reply.editing) ?\n 'check_circle' : 'send';\n\n const quote = this.state.quote ?\n (\n
\n {this.state.quote}\n
) : null;\n const audioEnabled = this.state.audioAvailable && this.props.onAttachAudio;\n return (\n \n {!this.props.noInput ? quote : null}\n
}>\n
this.props.onKeyPress(true)}\n onDeleted={_ => this.setState({audioRec: false})}\n onFinished={this.handleAttachAudio}/>\n ) :\n \n \n );\n }\n};\n\nexport default injectIntl(SendMessage);\n","import React from 'react';\n\nimport LetterTile from './letter-tile.jsx';\nimport ButtonBack from './button-back.jsx';\nimport ContactBadges from './contact-badges.jsx';\nimport MenuContacts from './menu-contacts.jsx';\nimport MenuStart from './menu-start.jsx';\n\nimport { sanitizeUrlForMime } from '../lib/utils.js';\n\nexport default class SideNavbar extends React.PureComponent {\n render() {\n const icon_badges = [];\n if (this.props.trustedBadges) {\n this.props.trustedBadges.map((b) => {\n icon_badges.push({icon: b, color: 'badge-inv'});\n });\n }\n let avatar = null;\n if (this.props.tinode) {\n avatar = this.props.tinode.authorizeURL(sanitizeUrlForMime(this.props.avatar, 'image'));\n }\n return (\n \n {this.props.onCancel ?
: null}\n {avatar ?\n
\n \n
\n :\n null}\n
{this.props.title}
\n {this.props.state === 'login' ?\n
:\n this.props.state === 'contacts' ?\n
:\n null}\n
\n );\n }\n};\n","// TagManager: edit topic or user tags.\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport ChipInput from './chip-input.jsx';\n\nimport { MAX_TAG_COUNT, MAX_TAG_LENGTH, MIN_TAG_LENGTH } from '../config.js';\nimport { arrayEqual } from '../lib/utils.js';\n\nexport default class TagManager extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = {\n tags: this.props.tags || [],\n tagInput: '',\n activated: this.props.activated\n };\n\n this.handleTagInput = this.handleTagInput.bind(this);\n this.handleAddTag = this.handleAddTag.bind(this);\n this.handleRemoveTag = this.handleRemoveTag.bind(this);\n this.handleSubmit = this.handleSubmit.bind(this);\n this.handleCancel = this.handleCancel.bind(this);\n }\n\n static getDerivedStateFromProps(nextProps, prevState) {\n const tags = nextProps.tags || [];\n if (!arrayEqual(tags, prevState.tags) && !prevState.activated) {\n return {tags: tags};\n }\n return null;\n }\n\n handleTagInput(text) {\n this.setState({tagInput: text});\n if (text.length > 0) {\n const last = text[text.length-1];\n if (text[0] == '\"') {\n // This is a quoted string.\n if (text.length > 1 && last == '\"') {\n this.handleAddTag(text.substring(1, text.length-1));\n }\n } else if (last == ',' || last == ' ' || last == ';' || last == '\"') {\n // User entered ',', ' ' or ';'\n this.handleAddTag(text.substring(0, text.length-1).trim());\n }\n }\n }\n\n handleAddTag(tag) {\n const maxTagCount = this.props.tinode.getServerParam('maxTagCount', MAX_TAG_COUNT);\n\n if (tag.length > 0 && this.state.tags.length < maxTagCount) {\n const tags = this.state.tags.slice(0);\n tags.push(tag);\n\n this.setState({tags: tags, tagInput: ''});\n if (this.props.onTagsChanged) {\n this.props.onTagsChanged(tags);\n }\n return tags;\n }\n return this.state.tags;\n }\n\n handleRemoveTag(tag, index) {\n const tags = this.state.tags.slice(0);\n tags.splice(index, 1);\n this.setState({tags: tags});\n if (this.props.onTagsChanged) {\n this.props.onTagsChanged(tags);\n }\n }\n\n handleSubmit() {\n // Add unprocessed input to tags, submit the list.\n this.props.onSubmit(this.handleAddTag(this.state.tagInput.trim()));\n this.setState({activated: false, tags: this.props.tags || []});\n }\n\n handleCancel() {\n this.setState({activated: false, tagInput: '', tags: this.props.tags || []});\n if (this.props.onCancel) {\n this.props.onCancel();\n }\n }\n\n render() {\n const minTagLength = this.props.tinode.getServerParam('minTagLength', MIN_TAG_LENGTH);\n const maxTagLength = this.props.tinode.getServerParam('maxTagLength', MAX_TAG_LENGTH);\n\n let tags = [];\n if (this.state.activated) {\n this.state.tags.map((tag) => {\n tags.push({user: tag, invalid: (tag.length < minTagLength || tag.length > maxTagLength)});\n });\n } else {\n this.state.tags.map((tag) => {\n tags.push({tag} );\n });\n if (tags.length == 0) {\n tags = (\n \n \n \n );\n }\n }\n return (\n \n
\n {this.props.title} \n
\n {this.state.activated ?\n
\n
{\n (add_tags_prompt) => \n } \n {this.props.onSubmit || this.props.onCancel ?\n
\n \n \n \n \n \n \n
\n : null}\n
\n :\n
\n }\n
\n );\n }\n};\n","// Widget for editing topic description.\n\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport { Tinode } from 'tinode-sdk';\n\nimport AvatarCrop from './avatar-crop.jsx';\nimport AvatarUpload from './avatar-upload.jsx';\nimport InPlaceEdit from './in-place-edit.jsx';\nimport TagManager from './tag-manager.jsx';\n\nimport { AVATAR_SIZE, MAX_AVATAR_BYTES, MAX_EXTERN_ATTACHMENT_SIZE, MAX_TITLE_LENGTH,\n MAX_TOPIC_DESCRIPTION_LENGTH } from '../config.js';\nimport { imageScaled, blobToBase64, makeImageUrl } from '../lib/blob-helpers.js';\nimport { arrayEqual, theCard } from '../lib/utils.js';\n\nexport default class TopicDescEdit extends React.Component {\n constructor(props) {\n super(props);\n\n const topic = this.props.tinode.getTopic(this.props.topic);\n const acs = topic.getAccessMode();\n this.state = {\n isMe: Tinode.isMeTopicName(this.props.topic),\n owner: acs && acs.isOwner(),\n fullName: topic.public ? topic.public.fn : undefined,\n private: topic.private ? topic.private.comment : null,\n description: topic.public ? topic.public.note : undefined,\n avatar: makeImageUrl(topic.public ? topic.public.photo : null),\n tags: topic.tags() || [],\n newAvatar: null,\n newAvatarMime: null\n };\n\n this.previousOnTags = null;\n\n this.tnNewTags = this.tnNewTags.bind(this);\n this.handleFullNameUpdate = this.handleFullNameUpdate.bind(this);\n this.handleImageUpdated = this.handleImageUpdated.bind(this);\n this.handleAvatarCropped = this.handleAvatarCropped.bind(this);\n this.handleAvatarCropCancel = this.handleAvatarCropCancel.bind(this);\n this.uploadAvatar = this.uploadAvatar.bind(this);\n this.handlePrivateUpdate = this.handlePrivateUpdate.bind(this);\n this.handleDescriptionUpdate = this.handleDescriptionUpdate.bind(this);\n this.handleTagsUpdated = this.handleTagsUpdated.bind(this);\n }\n\n componentDidMount() {\n const topic = this.props.tinode.getTopic(this.props.topic);\n this.previousOnTags = topic.onTagsUpdated;\n topic.onTagsUpdated = this.tnNewTags;\n }\n\n componentWillUnmount() {\n const topic = this.props.tinode.getTopic(this.props.topic);\n topic.onTagsUpdated = this.previousOnTags;\n }\n\n tnNewTags(tags) {\n this.setState({tags: tags});\n }\n\n handleFullNameUpdate(fn) {\n fn = fn.trim().substring(0, MAX_TITLE_LENGTH);\n if (fn && this.state.fullName !== fn) {\n this.setState({fullName: fn});\n this.props.onUpdateTopicDesc(this.props.topic, theCard(fn, null));\n }\n }\n\n handlePrivateUpdate(comment) {\n comment = comment.trim().substring(0, MAX_TITLE_LENGTH);\n if (this.state.private !== comment) {\n this.setState({private: comment});\n this.props.onUpdateTopicDesc(this.props.topic, null, comment || Tinode.DEL_CHAR);\n }\n }\n\n handleDescriptionUpdate(desc) {\n desc = desc.trim().substring(0, MAX_TOPIC_DESCRIPTION_LENGTH);\n if (desc) {\n this.setState({description: desc});\n this.props.onUpdateTopicDesc(this.props.topic, theCard(null, null, null, desc));\n }\n }\n\n // AvatarUpload widget has changed the avatar: received a new file or deleted the avatar.\n handleImageUpdated(mime, img) {\n // This will show the AvatarCropView is img is not null.\n this.setState({newAvatar: img, newAvatarMime: mime});\n if (!img) {\n // Deleting the avatar.\n this.setState({avatar: null});\n this.props.onUpdateTopicDesc(this.props.topic, theCard(null, Tinode.DEL_CHAR));\n }\n }\n\n // AvatarCropView calls this method when the user has cropped the image.\n handleAvatarCropped(mime, blob, width, height) {\n const url = blob ? URL.createObjectURL(blob) : null;\n this.setState({avatar: url, newAvatar: null, newAvatarMime: null});\n if (blob) {\n this.uploadAvatar(mime, blob, width, height);\n }\n }\n\n // Utility method for converting cropped avatar blob to bytes for sending inband or\n // for uploading it to the server out of band.\n uploadAvatar(mime, blob, width, height) {\n const readyToUpload = image => {\n let {mime, blob} = image;\n if (blob.size > MAX_AVATAR_BYTES) {\n // Too large to send inband - uploading out of band and sending as a link.\n const uploader = this.props.tinode.getLargeFileHelper();\n uploader.upload(blob)\n .then(url => this.props.onUpdateTopicDesc(this.props.topic, theCard(null, url)))\n .catch(err => this.props.onError(err.message, 'err'));\n } else {\n // Convert blob to base64-encoded bits.\n blobToBase64(blob)\n .then(b64 => {\n const du = makeImageUrl({data: b64.bits, type: mime});\n this.setState({source: du});\n this.props.onUpdateTopicDesc(this.props.topic, theCard(null, du));\n });\n }\n };\n\n if (width > AVATAR_SIZE || height > AVATAR_SIZE || width != height) {\n // Avatar is not square or too large even after cropping. Shrink it and make square.\n imageScaled(blob, AVATAR_SIZE, AVATAR_SIZE, MAX_EXTERN_ATTACHMENT_SIZE, true)\n .then(scaled => readyToUpload(scaled))\n .catch(err => this.props.onError(err.message, 'err'));\n } else {\n readyToUpload({mime: mime, blob: blob, width: width, height: height});\n }\n }\n\n handleAvatarCropCancel() {\n this.setState({newAvatar: null, newAvatarMime: null});\n }\n\n handleTagsUpdated(tags) {\n // Check if tags have actually changed.\n if (arrayEqual(this.state.tags.slice(0), tags.slice(0))) {\n return;\n }\n this.props.onUpdateTags(tags);\n }\n\n render() {\n if (this.state.newAvatar) {\n return (\n \n );\n }\n\n const editable = this.state.isMe || this.state.owner;\n\n return (\n <>\n \n
\n \n \n {this.state.isMe ?\n
\n
\n \n \n
\n {\n (full_name_placeholder) => \n } \n
\n
\n :\n <>\n
\n
\n \n
\n
\n {\n (group_name_placeholder) => \n } \n
\n
\n
\n
\n \n \n \n
\n
\n {\n (private_placeholder) => \n } \n
\n
\n >\n }\n {editable || this.state.description ?\n
\n
\n \n
\n
\n {\n (private_placeholder) => \n } \n
\n
\n : null\n }\n
\n {editable ?\n <>\n
\n {\n (title_tag_manager) => \n } \n >\n : null\n }\n >\n );\n }\n};\n","// Edit account parameters.\nimport React from 'react';\nimport { FormattedMessage, defineMessages, injectIntl } from 'react-intl';\n\nconst messages = defineMessages({\n clear_messages: {\n id: 'action_clear_messages',\n defaultMessage: 'Clear Messages',\n description: 'Flat button [Clear Messages] (soft-delete messages)'\n },\n clear_messages_warning: {\n id: 'clear_messages_warning',\n defaultMessage: 'Are you sure you want to clear all messages? It cannot be undone.',\n description: 'Alert dialog warning when deleting all messages.'\n },\n delete_messages: {\n id: 'action_delete_messages',\n defaultMessage: 'Clear Messages for All',\n description: 'Flat button [Clear for All] (hard-delete all messages)'\n },\n delete_messages_warning: {\n id: 'delete_messages_warning',\n defaultMessage: 'Are you sure you want to delete all messages for everyone? It cannot be undone.',\n description: 'Alert dialog warning when hard-deleting all messages.'\n },\n topic_delete: {\n id: 'topic_delete',\n defaultMessage: 'Delete Conversation',\n description: 'Alert title when deleting the topic.'\n },\n topic_delete_warning: {\n id: 'topic_delete_warning',\n defaultMessage: 'Are you sure you want to delete this conversation? It cannot be undone.',\n description: 'Alert warning when deleting entire topic'\n },\n leave_chat: {\n id: 'action_leave_chat',\n defaultMessage: 'Leave Conversation',\n description: 'Flat button [Leave Conversation]'\n },\n leave_chat_warning: {\n id: 'leave_chat_warning',\n defaultMessage: 'Are you sure you want to leave this conversation?',\n description: 'Alert dialog warning when unsubscribing from a chat.'\n },\n block_contact: {\n id: 'action_block_contact',\n defaultMessage: \"Block Contact\",\n description: \"Flat button [Block Contact]\"\n },\n block_contact_warning: {\n id: 'block_contact_warning',\n defaultMessage: 'Are you sure you want to block this contact?',\n description: 'Alert dialog warning when blocking a contact.'\n },\n report_chat: {\n id: 'action_report_chat',\n defaultMessage: 'Report Conversation',\n description: 'Flat button [Report Group]'\n },\n report_chat_warning: {\n id: 'report_chat_warning',\n defaultMessage: 'Are you sure you want to block and report this conversation?',\n description: 'Alert dialog warning when reporting a conversation for abuse'\n },\n other_user: {\n id: 'label_other_user',\n defaultMessage: 'Other',\n description: 'Label for the other user when the user is unnamed'\n },\n});\n\nclass TopicSecurity extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.handleDeleteTopic = this.handleDeleteTopic.bind(this);\n this.handleDeleteMessages = this.handleDeleteMessages.bind(this);\n this.handleLeave = this.handleLeave.bind(this);\n this.handleBlock = this.handleBlock.bind(this);\n this.handleReport = this.handleReport.bind(this);\n }\n\n handleDeleteTopic(e) {\n e.preventDefault();\n const {formatMessage} = this.props.intl;\n this.props.onShowAlert(\n formatMessage(messages.topic_delete), // title\n formatMessage(messages.topic_delete_warning), // content\n _ => this.props.onDeleteTopic(this.props.topic), // onConfirm\n null, // \"OK\"\n true, // Show Reject button\n null // \"Cancel\"\n );\n }\n\n handleDeleteMessages(e) {\n e.preventDefault();\n const {formatMessage} = this.props.intl;\n this.props.onShowAlert(\n formatMessage(this.props.deleter ? messages.delete_messages : messages.clear_messages), // title\n formatMessage(this.props.deleter ? messages.delete_messages_warning : messages.clear_messages_warning), // content\n _ => this.props.onDeleteMessages(this.props.topic), // onConfirm\n null, // \"OK\"\n true, // Show Reject button\n null // \"Cancel\"\n );\n }\n\n handleLeave(e) {\n e.preventDefault();\n const {formatMessage} = this.props.intl;\n this.props.onShowAlert(\n formatMessage(messages.leave_chat), // title\n formatMessage(messages.leave_chat_warning), // content\n _ => this.props.onLeaveTopic(this.props.topic), // onConfirm\n null, // \"OK\"\n true, // Show Reject button\n null // \"Cancel\"\n );\n }\n\n handleBlock(e) {\n e.preventDefault();\n const {formatMessage} = this.props.intl;\n this.props.onShowAlert(\n formatMessage(messages.block_contact), // title\n formatMessage(messages.block_contact_warning), // content\n _ => this.props.onBlockTopic(this.props.topic), // onConfirm\n null, // \"OK\"\n true, // Show Reject button\n null // \"Cancel\"\n );\n }\n\n handleReport(e) {\n e.preventDefault();\n const {formatMessage} = this.props.intl;\n this.props.onShowAlert(\n formatMessage(messages.report_chat), // title\n formatMessage(messages.report_chat_warning), // content\n (_ => { this.props.onReportTopic(this.props.topic); }), // onConfirm\n null, // \"OK\"\n true, // Show Reject button\n null // \"Cancel\"\n );\n }\n\n render() {\n const {formatMessage} = this.props.intl;\n return (\n \n
\n
\n
\n {this.props.groupTopic ?\n <>\n
\n \n \n {e.preventDefault(); this.props.onLaunchPermissionsEditor('want')}}>\n {this.props.access}\n \n
\n {!this.props.channel ?\n
\n
\n \n \n \n
\n
\n
Auth: {\n e.preventDefault();\n if (this.props.owner) {\n this.props.onLaunchPermissionsEditor('auth');\n }\n }}>{this.props.auth} \n
\n
Anon: {\n e.preventDefault();\n if (this.props.owner) {\n this.props.onLaunchPermissionsEditor('anon');\n }\n }}>{this.props.anon} \n
\n
\n
\n :\n null\n }\n >\n :\n
\n
\n \n \n \n
\n
\n
\n {e.preventDefault(); this.props.onLaunchPermissionsEditor('want')}}>\n {this.props.access}\n \n
\n
{this.props.fullName ? this.props.fullName : formatMessage(messages.other_user)}:\n {e.preventDefault(); this.props.onLaunchPermissionsEditor('given')}}>\n {this.props.modeGiven2}\n \n
\n
\n
\n }\n
\n
\n );\n }\n};\n\nexport default injectIntl(TopicSecurity);\n","// The counter of unread messages in the topic.\nimport React from 'react';\n\nexport default class UnreadBadge extends React.PureComponent {\n render() {\n return (this.props.count > 0 ?\n {this.props.count > 9 ? \"9+\" : this.props.count} \n : null);\n }\n};\n","// Image view with progress bar and a cancel button.\nimport React from 'react';\n\nimport FileProgress from './file-progress.jsx';\n\nexport default class UploadingImage extends React.PureComponent {\n constructor(props) {\n super(props);\n }\n\n render() {\n return (\n \n {React.createElement('img', this.props)}\n
\n \n
\n
\n );\n }\n};\n","import React from 'react';\nimport { FormattedMessage, defineMessages, injectIntl } from 'react-intl';\nimport SendMessage from './send-message.jsx';\n\nimport { bytesToHumanSize } from '../lib/strformat.js';\n\nconst messages = defineMessages({\n unrecognized_video_format: {\n id: 'unrecognized_video_format',\n defaultMessage: 'Format of this video is not recognized',\n description: 'Error message when uploaded video is invalid',\n }\n});\n\nclass VideoPreview extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.videoRef = React.createRef();\n\n this.handleSendVideo = this.handleSendVideo.bind(this);\n }\n\n handleSendVideo(caption) {\n this.props.onClose();\n const params = {\n width: this.videoRef.current.videoWidth,\n height: this.videoRef.current.videoHeight,\n duration: (this.videoRef.current.duration * 1000) | 0,\n mime: this.props.content.mime,\n name: this.props.content.filename\n }\n\n if (params.width == 0 || params.height == 0) {\n this.props.onError(this.props.intl.formatMessage(messages.unrecognized_video_format), 'err');\n return;\n }\n\n // Capture screen from a video.\n const canvas = document.createElement('canvas');\n canvas.width = params.width;\n canvas.height = params.height;\n const ctx = canvas.getContext('2d');\n ctx.drawImage(this.videoRef.current, 0, 0, canvas.width, canvas.height);\n ctx.canvas.toBlob(\n preview => this.props.onSendMessage(caption, this.props.content.blob, preview, params),\n 'image/jpeg', 0.75\n );\n }\n\n render() {\n if (!this.props.content) {\n return null;\n }\n\n const width = this.props.content.width || '-';\n const height = this.props.content.height || '-';\n\n const controlist = this.props.onSendMessage ? 'nodownload' : '';\n const autoPlay = !this.props.onSendMessage;\n\n return (\n \n
\n
\n \n
\n {this.props.onSendMessage ?\n
\n :\n }\n
\n );\n }\n};\n\nexport default injectIntl(VideoPreview);\n","// Password with a visiblity toggle.\nimport React from 'react';\n\nexport default class VisiblePassword extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.inputRef = React.createRef();\n\n this.state = {\n value: this.props.value,\n visible: false\n };\n\n this.handleVisibility = this.handleVisibility.bind(this);\n this.handeTextChange = this.handeTextChange.bind(this);\n this.handleKeyDown = this.handleKeyDown.bind(this);\n this.handleEditingFinished = this.handleEditingFinished.bind(this);\n }\n\n componentDidMount() {\n if (this.props.autoFocus) {\n this.inputRef.current.focus();\n }\n }\n\n handeTextChange(e) {\n this.setState({value: e.target.value});\n if (this.props.onChange) {\n this.props.onChange(e);\n }\n }\n\n handleVisibility(e) {\n e.preventDefault();\n this.setState({visible: !this.state.visible});\n }\n\n handleKeyDown(e) {\n if (e.keyCode == 27) {\n // Escape pressed\n this.setState({value: this.props.value, visible: false});\n if (this.props.onFinished) {\n this.props.onFinished();\n }\n } else if (e.keyCode == 13) {\n // Enter pressed\n this.handleEditingFinished();\n }\n }\n\n handleEditingFinished(e) {\n if (e) {\n let currentTarget = e.currentTarget;\n setTimeout(_ => {\n if (!currentTarget.contains(document.activeElement)) {\n if (this.props.onFinished) {\n this.props.onFinished(this.state.value);\n }\n }\n }, 0);\n } else if (this.props.onFinished) {\n this.props.onFinished(this.state.value.trim());\n }\n }\n\n render() {\n return (\n \n \n \n \n {this.state.visible ? 'visibility' : 'visibility_off'}\n \n \n
\n );\n }\n}\n","'use strict';\n\nvar m = require('react-dom');\nif (process.env.NODE_ENV === 'production') {\n exports.createRoot = m.createRoot;\n exports.hydrateRoot = m.hydrateRoot;\n} else {\n var i = m.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;\n exports.createRoot = function(c, o) {\n i.usingClientEntryPoint = true;\n try {\n return m.createRoot(c, o);\n } finally {\n i.usingClientEntryPoint = false;\n }\n };\n exports.hydrateRoot = function(c, h, o) {\n i.usingClientEntryPoint = true;\n try {\n return m.hydrateRoot(c, h, o);\n } finally {\n i.usingClientEntryPoint = false;\n }\n };\n}\n","module.exports = React;","module.exports = ReactDOM;","module.exports = ReactIntl;","module.exports = Tinode;","import { Component, ComponentContainer } from '@firebase/component';\nimport { Logger, setUserLogHandler, setLogLevel as setLogLevel$1 } from '@firebase/logger';\nimport { ErrorFactory, getDefaultAppConfig, deepEqual, FirebaseError, base64urlEncodeWithoutPadding, isIndexedDBAvailable, validateIndexedDBOpenable } from '@firebase/util';\nexport { FirebaseError } from '@firebase/util';\nimport { openDB } from 'idb';\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nclass PlatformLoggerServiceImpl {\r\n constructor(container) {\r\n this.container = container;\r\n }\r\n // In initial implementation, this will be called by installations on\r\n // auth token refresh, and installations will send this string.\r\n getPlatformInfoString() {\r\n const providers = this.container.getProviders();\r\n // Loop through providers and get library/version pairs from any that are\r\n // version components.\r\n return providers\r\n .map(provider => {\r\n if (isVersionServiceProvider(provider)) {\r\n const service = provider.getImmediate();\r\n return `${service.library}/${service.version}`;\r\n }\r\n else {\r\n return null;\r\n }\r\n })\r\n .filter(logString => logString)\r\n .join(' ');\r\n }\r\n}\r\n/**\r\n *\r\n * @param provider check if this provider provides a VersionService\r\n *\r\n * NOTE: Using Provider<'app-version'> is a hack to indicate that the provider\r\n * provides VersionService. The provider is not necessarily a 'app-version'\r\n * provider.\r\n */\r\nfunction isVersionServiceProvider(provider) {\r\n const component = provider.getComponent();\r\n return (component === null || component === void 0 ? void 0 : component.type) === \"VERSION\" /* ComponentType.VERSION */;\r\n}\n\nconst name$o = \"@firebase/app\";\nconst version$1 = \"0.9.1\";\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst logger = new Logger('@firebase/app');\n\nconst name$n = \"@firebase/app-compat\";\n\nconst name$m = \"@firebase/analytics-compat\";\n\nconst name$l = \"@firebase/analytics\";\n\nconst name$k = \"@firebase/app-check-compat\";\n\nconst name$j = \"@firebase/app-check\";\n\nconst name$i = \"@firebase/auth\";\n\nconst name$h = \"@firebase/auth-compat\";\n\nconst name$g = \"@firebase/database\";\n\nconst name$f = \"@firebase/database-compat\";\n\nconst name$e = \"@firebase/functions\";\n\nconst name$d = \"@firebase/functions-compat\";\n\nconst name$c = \"@firebase/installations\";\n\nconst name$b = \"@firebase/installations-compat\";\n\nconst name$a = \"@firebase/messaging\";\n\nconst name$9 = \"@firebase/messaging-compat\";\n\nconst name$8 = \"@firebase/performance\";\n\nconst name$7 = \"@firebase/performance-compat\";\n\nconst name$6 = \"@firebase/remote-config\";\n\nconst name$5 = \"@firebase/remote-config-compat\";\n\nconst name$4 = \"@firebase/storage\";\n\nconst name$3 = \"@firebase/storage-compat\";\n\nconst name$2 = \"@firebase/firestore\";\n\nconst name$1 = \"@firebase/firestore-compat\";\n\nconst name = \"firebase\";\nconst version = \"9.16.0\";\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * The default app name\r\n *\r\n * @internal\r\n */\r\nconst DEFAULT_ENTRY_NAME = '[DEFAULT]';\r\nconst PLATFORM_LOG_STRING = {\r\n [name$o]: 'fire-core',\r\n [name$n]: 'fire-core-compat',\r\n [name$l]: 'fire-analytics',\r\n [name$m]: 'fire-analytics-compat',\r\n [name$j]: 'fire-app-check',\r\n [name$k]: 'fire-app-check-compat',\r\n [name$i]: 'fire-auth',\r\n [name$h]: 'fire-auth-compat',\r\n [name$g]: 'fire-rtdb',\r\n [name$f]: 'fire-rtdb-compat',\r\n [name$e]: 'fire-fn',\r\n [name$d]: 'fire-fn-compat',\r\n [name$c]: 'fire-iid',\r\n [name$b]: 'fire-iid-compat',\r\n [name$a]: 'fire-fcm',\r\n [name$9]: 'fire-fcm-compat',\r\n [name$8]: 'fire-perf',\r\n [name$7]: 'fire-perf-compat',\r\n [name$6]: 'fire-rc',\r\n [name$5]: 'fire-rc-compat',\r\n [name$4]: 'fire-gcs',\r\n [name$3]: 'fire-gcs-compat',\r\n [name$2]: 'fire-fst',\r\n [name$1]: 'fire-fst-compat',\r\n 'fire-js': 'fire-js',\r\n [name]: 'fire-js-all'\r\n};\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * @internal\r\n */\r\nconst _apps = new Map();\r\n/**\r\n * Registered components.\r\n *\r\n * @internal\r\n */\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\nconst _components = new Map();\r\n/**\r\n * @param component - the component being added to this app's container\r\n *\r\n * @internal\r\n */\r\nfunction _addComponent(app, component) {\r\n try {\r\n app.container.addComponent(component);\r\n }\r\n catch (e) {\r\n logger.debug(`Component ${component.name} failed to register with FirebaseApp ${app.name}`, e);\r\n }\r\n}\r\n/**\r\n *\r\n * @internal\r\n */\r\nfunction _addOrOverwriteComponent(app, component) {\r\n app.container.addOrOverwriteComponent(component);\r\n}\r\n/**\r\n *\r\n * @param component - the component to register\r\n * @returns whether or not the component is registered successfully\r\n *\r\n * @internal\r\n */\r\nfunction _registerComponent(component) {\r\n const componentName = component.name;\r\n if (_components.has(componentName)) {\r\n logger.debug(`There were multiple attempts to register component ${componentName}.`);\r\n return false;\r\n }\r\n _components.set(componentName, component);\r\n // add the component to existing app instances\r\n for (const app of _apps.values()) {\r\n _addComponent(app, component);\r\n }\r\n return true;\r\n}\r\n/**\r\n *\r\n * @param app - FirebaseApp instance\r\n * @param name - service name\r\n *\r\n * @returns the provider for the service with the matching name\r\n *\r\n * @internal\r\n */\r\nfunction _getProvider(app, name) {\r\n const heartbeatController = app.container\r\n .getProvider('heartbeat')\r\n .getImmediate({ optional: true });\r\n if (heartbeatController) {\r\n void heartbeatController.triggerHeartbeat();\r\n }\r\n return app.container.getProvider(name);\r\n}\r\n/**\r\n *\r\n * @param app - FirebaseApp instance\r\n * @param name - service name\r\n * @param instanceIdentifier - service instance identifier in case the service supports multiple instances\r\n *\r\n * @internal\r\n */\r\nfunction _removeServiceInstance(app, name, instanceIdentifier = DEFAULT_ENTRY_NAME) {\r\n _getProvider(app, name).clearInstance(instanceIdentifier);\r\n}\r\n/**\r\n * Test only\r\n *\r\n * @internal\r\n */\r\nfunction _clearComponents() {\r\n _components.clear();\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst ERRORS = {\r\n [\"no-app\" /* AppError.NO_APP */]: \"No Firebase App '{$appName}' has been created - \" +\r\n 'call Firebase App.initializeApp()',\r\n [\"bad-app-name\" /* AppError.BAD_APP_NAME */]: \"Illegal App name: '{$appName}\",\r\n [\"duplicate-app\" /* AppError.DUPLICATE_APP */]: \"Firebase App named '{$appName}' already exists with different options or config\",\r\n [\"app-deleted\" /* AppError.APP_DELETED */]: \"Firebase App named '{$appName}' already deleted\",\r\n [\"no-options\" /* AppError.NO_OPTIONS */]: 'Need to provide options, when not being deployed to hosting via source.',\r\n [\"invalid-app-argument\" /* AppError.INVALID_APP_ARGUMENT */]: 'firebase.{$appName}() takes either no argument or a ' +\r\n 'Firebase App instance.',\r\n [\"invalid-log-argument\" /* AppError.INVALID_LOG_ARGUMENT */]: 'First argument to `onLog` must be null or a function.',\r\n [\"idb-open\" /* AppError.IDB_OPEN */]: 'Error thrown when opening IndexedDB. Original error: {$originalErrorMessage}.',\r\n [\"idb-get\" /* AppError.IDB_GET */]: 'Error thrown when reading from IndexedDB. Original error: {$originalErrorMessage}.',\r\n [\"idb-set\" /* AppError.IDB_WRITE */]: 'Error thrown when writing to IndexedDB. Original error: {$originalErrorMessage}.',\r\n [\"idb-delete\" /* AppError.IDB_DELETE */]: 'Error thrown when deleting from IndexedDB. Original error: {$originalErrorMessage}.'\r\n};\r\nconst ERROR_FACTORY = new ErrorFactory('app', 'Firebase', ERRORS);\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nclass FirebaseAppImpl {\r\n constructor(options, config, container) {\r\n this._isDeleted = false;\r\n this._options = Object.assign({}, options);\r\n this._config = Object.assign({}, config);\r\n this._name = config.name;\r\n this._automaticDataCollectionEnabled =\r\n config.automaticDataCollectionEnabled;\r\n this._container = container;\r\n this.container.addComponent(new Component('app', () => this, \"PUBLIC\" /* ComponentType.PUBLIC */));\r\n }\r\n get automaticDataCollectionEnabled() {\r\n this.checkDestroyed();\r\n return this._automaticDataCollectionEnabled;\r\n }\r\n set automaticDataCollectionEnabled(val) {\r\n this.checkDestroyed();\r\n this._automaticDataCollectionEnabled = val;\r\n }\r\n get name() {\r\n this.checkDestroyed();\r\n return this._name;\r\n }\r\n get options() {\r\n this.checkDestroyed();\r\n return this._options;\r\n }\r\n get config() {\r\n this.checkDestroyed();\r\n return this._config;\r\n }\r\n get container() {\r\n return this._container;\r\n }\r\n get isDeleted() {\r\n return this._isDeleted;\r\n }\r\n set isDeleted(val) {\r\n this._isDeleted = val;\r\n }\r\n /**\r\n * This function will throw an Error if the App has already been deleted -\r\n * use before performing API actions on the App.\r\n */\r\n checkDestroyed() {\r\n if (this.isDeleted) {\r\n throw ERROR_FACTORY.create(\"app-deleted\" /* AppError.APP_DELETED */, { appName: this._name });\r\n }\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * The current SDK version.\r\n *\r\n * @public\r\n */\r\nconst SDK_VERSION = version;\r\nfunction initializeApp(_options, rawConfig = {}) {\r\n let options = _options;\r\n if (typeof rawConfig !== 'object') {\r\n const name = rawConfig;\r\n rawConfig = { name };\r\n }\r\n const config = Object.assign({ name: DEFAULT_ENTRY_NAME, automaticDataCollectionEnabled: false }, rawConfig);\r\n const name = config.name;\r\n if (typeof name !== 'string' || !name) {\r\n throw ERROR_FACTORY.create(\"bad-app-name\" /* AppError.BAD_APP_NAME */, {\r\n appName: String(name)\r\n });\r\n }\r\n options || (options = getDefaultAppConfig());\r\n if (!options) {\r\n throw ERROR_FACTORY.create(\"no-options\" /* AppError.NO_OPTIONS */);\r\n }\r\n const existingApp = _apps.get(name);\r\n if (existingApp) {\r\n // return the existing app if options and config deep equal the ones in the existing app.\r\n if (deepEqual(options, existingApp.options) &&\r\n deepEqual(config, existingApp.config)) {\r\n return existingApp;\r\n }\r\n else {\r\n throw ERROR_FACTORY.create(\"duplicate-app\" /* AppError.DUPLICATE_APP */, { appName: name });\r\n }\r\n }\r\n const container = new ComponentContainer(name);\r\n for (const component of _components.values()) {\r\n container.addComponent(component);\r\n }\r\n const newApp = new FirebaseAppImpl(options, config, container);\r\n _apps.set(name, newApp);\r\n return newApp;\r\n}\r\n/**\r\n * Retrieves a {@link @firebase/app#FirebaseApp} instance.\r\n *\r\n * When called with no arguments, the default app is returned. When an app name\r\n * is provided, the app corresponding to that name is returned.\r\n *\r\n * An exception is thrown if the app being retrieved has not yet been\r\n * initialized.\r\n *\r\n * @example\r\n * ```javascript\r\n * // Return the default app\r\n * const app = getApp();\r\n * ```\r\n *\r\n * @example\r\n * ```javascript\r\n * // Return a named app\r\n * const otherApp = getApp(\"otherApp\");\r\n * ```\r\n *\r\n * @param name - Optional name of the app to return. If no name is\r\n * provided, the default is `\"[DEFAULT]\"`.\r\n *\r\n * @returns The app corresponding to the provided app name.\r\n * If no app name is provided, the default app is returned.\r\n *\r\n * @public\r\n */\r\nfunction getApp(name = DEFAULT_ENTRY_NAME) {\r\n const app = _apps.get(name);\r\n if (!app && name === DEFAULT_ENTRY_NAME) {\r\n return initializeApp();\r\n }\r\n if (!app) {\r\n throw ERROR_FACTORY.create(\"no-app\" /* AppError.NO_APP */, { appName: name });\r\n }\r\n return app;\r\n}\r\n/**\r\n * A (read-only) array of all initialized apps.\r\n * @public\r\n */\r\nfunction getApps() {\r\n return Array.from(_apps.values());\r\n}\r\n/**\r\n * Renders this app unusable and frees the resources of all associated\r\n * services.\r\n *\r\n * @example\r\n * ```javascript\r\n * deleteApp(app)\r\n * .then(function() {\r\n * console.log(\"App deleted successfully\");\r\n * })\r\n * .catch(function(error) {\r\n * console.log(\"Error deleting app:\", error);\r\n * });\r\n * ```\r\n *\r\n * @public\r\n */\r\nasync function deleteApp(app) {\r\n const name = app.name;\r\n if (_apps.has(name)) {\r\n _apps.delete(name);\r\n await Promise.all(app.container\r\n .getProviders()\r\n .map(provider => provider.delete()));\r\n app.isDeleted = true;\r\n }\r\n}\r\n/**\r\n * Registers a library's name and version for platform logging purposes.\r\n * @param library - Name of 1p or 3p library (e.g. firestore, angularfire)\r\n * @param version - Current version of that library.\r\n * @param variant - Bundle variant, e.g., node, rn, etc.\r\n *\r\n * @public\r\n */\r\nfunction registerVersion(libraryKeyOrName, version, variant) {\r\n var _a;\r\n // TODO: We can use this check to whitelist strings when/if we set up\r\n // a good whitelist system.\r\n let library = (_a = PLATFORM_LOG_STRING[libraryKeyOrName]) !== null && _a !== void 0 ? _a : libraryKeyOrName;\r\n if (variant) {\r\n library += `-${variant}`;\r\n }\r\n const libraryMismatch = library.match(/\\s|\\//);\r\n const versionMismatch = version.match(/\\s|\\//);\r\n if (libraryMismatch || versionMismatch) {\r\n const warning = [\r\n `Unable to register library \"${library}\" with version \"${version}\":`\r\n ];\r\n if (libraryMismatch) {\r\n warning.push(`library name \"${library}\" contains illegal characters (whitespace or \"/\")`);\r\n }\r\n if (libraryMismatch && versionMismatch) {\r\n warning.push('and');\r\n }\r\n if (versionMismatch) {\r\n warning.push(`version name \"${version}\" contains illegal characters (whitespace or \"/\")`);\r\n }\r\n logger.warn(warning.join(' '));\r\n return;\r\n }\r\n _registerComponent(new Component(`${library}-version`, () => ({ library, version }), \"VERSION\" /* ComponentType.VERSION */));\r\n}\r\n/**\r\n * Sets log handler for all Firebase SDKs.\r\n * @param logCallback - An optional custom log handler that executes user code whenever\r\n * the Firebase SDK makes a logging call.\r\n *\r\n * @public\r\n */\r\nfunction onLog(logCallback, options) {\r\n if (logCallback !== null && typeof logCallback !== 'function') {\r\n throw ERROR_FACTORY.create(\"invalid-log-argument\" /* AppError.INVALID_LOG_ARGUMENT */);\r\n }\r\n setUserLogHandler(logCallback, options);\r\n}\r\n/**\r\n * Sets log level for all Firebase SDKs.\r\n *\r\n * All of the log types above the current log level are captured (i.e. if\r\n * you set the log level to `info`, errors are logged, but `debug` and\r\n * `verbose` logs are not).\r\n *\r\n * @public\r\n */\r\nfunction setLogLevel(logLevel) {\r\n setLogLevel$1(logLevel);\r\n}\n\n/**\r\n * @license\r\n * Copyright 2021 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst DB_NAME = 'firebase-heartbeat-database';\r\nconst DB_VERSION = 1;\r\nconst STORE_NAME = 'firebase-heartbeat-store';\r\nlet dbPromise = null;\r\nfunction getDbPromise() {\r\n if (!dbPromise) {\r\n dbPromise = openDB(DB_NAME, DB_VERSION, {\r\n upgrade: (db, oldVersion) => {\r\n // We don't use 'break' in this switch statement, the fall-through\r\n // behavior is what we want, because if there are multiple versions between\r\n // the old version and the current version, we want ALL the migrations\r\n // that correspond to those versions to run, not only the last one.\r\n // eslint-disable-next-line default-case\r\n switch (oldVersion) {\r\n case 0:\r\n db.createObjectStore(STORE_NAME);\r\n }\r\n }\r\n }).catch(e => {\r\n throw ERROR_FACTORY.create(\"idb-open\" /* AppError.IDB_OPEN */, {\r\n originalErrorMessage: e.message\r\n });\r\n });\r\n }\r\n return dbPromise;\r\n}\r\nasync function readHeartbeatsFromIndexedDB(app) {\r\n try {\r\n const db = await getDbPromise();\r\n return db\r\n .transaction(STORE_NAME)\r\n .objectStore(STORE_NAME)\r\n .get(computeKey(app));\r\n }\r\n catch (e) {\r\n if (e instanceof FirebaseError) {\r\n logger.warn(e.message);\r\n }\r\n else {\r\n const idbGetError = ERROR_FACTORY.create(\"idb-get\" /* AppError.IDB_GET */, {\r\n originalErrorMessage: e === null || e === void 0 ? void 0 : e.message\r\n });\r\n logger.warn(idbGetError.message);\r\n }\r\n }\r\n}\r\nasync function writeHeartbeatsToIndexedDB(app, heartbeatObject) {\r\n try {\r\n const db = await getDbPromise();\r\n const tx = db.transaction(STORE_NAME, 'readwrite');\r\n const objectStore = tx.objectStore(STORE_NAME);\r\n await objectStore.put(heartbeatObject, computeKey(app));\r\n return tx.done;\r\n }\r\n catch (e) {\r\n if (e instanceof FirebaseError) {\r\n logger.warn(e.message);\r\n }\r\n else {\r\n const idbGetError = ERROR_FACTORY.create(\"idb-set\" /* AppError.IDB_WRITE */, {\r\n originalErrorMessage: e === null || e === void 0 ? void 0 : e.message\r\n });\r\n logger.warn(idbGetError.message);\r\n }\r\n }\r\n}\r\nfunction computeKey(app) {\r\n return `${app.name}!${app.options.appId}`;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2021 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst MAX_HEADER_BYTES = 1024;\r\n// 30 days\r\nconst STORED_HEARTBEAT_RETENTION_MAX_MILLIS = 30 * 24 * 60 * 60 * 1000;\r\nclass HeartbeatServiceImpl {\r\n constructor(container) {\r\n this.container = container;\r\n /**\r\n * In-memory cache for heartbeats, used by getHeartbeatsHeader() to generate\r\n * the header string.\r\n * Stores one record per date. This will be consolidated into the standard\r\n * format of one record per user agent string before being sent as a header.\r\n * Populated from indexedDB when the controller is instantiated and should\r\n * be kept in sync with indexedDB.\r\n * Leave public for easier testing.\r\n */\r\n this._heartbeatsCache = null;\r\n const app = this.container.getProvider('app').getImmediate();\r\n this._storage = new HeartbeatStorageImpl(app);\r\n this._heartbeatsCachePromise = this._storage.read().then(result => {\r\n this._heartbeatsCache = result;\r\n return result;\r\n });\r\n }\r\n /**\r\n * Called to report a heartbeat. The function will generate\r\n * a HeartbeatsByUserAgent object, update heartbeatsCache, and persist it\r\n * to IndexedDB.\r\n * Note that we only store one heartbeat per day. So if a heartbeat for today is\r\n * already logged, subsequent calls to this function in the same day will be ignored.\r\n */\r\n async triggerHeartbeat() {\r\n const platformLogger = this.container\r\n .getProvider('platform-logger')\r\n .getImmediate();\r\n // This is the \"Firebase user agent\" string from the platform logger\r\n // service, not the browser user agent.\r\n const agent = platformLogger.getPlatformInfoString();\r\n const date = getUTCDateString();\r\n if (this._heartbeatsCache === null) {\r\n this._heartbeatsCache = await this._heartbeatsCachePromise;\r\n }\r\n // Do not store a heartbeat if one is already stored for this day\r\n // or if a header has already been sent today.\r\n if (this._heartbeatsCache.lastSentHeartbeatDate === date ||\r\n this._heartbeatsCache.heartbeats.some(singleDateHeartbeat => singleDateHeartbeat.date === date)) {\r\n return;\r\n }\r\n else {\r\n // There is no entry for this date. Create one.\r\n this._heartbeatsCache.heartbeats.push({ date, agent });\r\n }\r\n // Remove entries older than 30 days.\r\n this._heartbeatsCache.heartbeats = this._heartbeatsCache.heartbeats.filter(singleDateHeartbeat => {\r\n const hbTimestamp = new Date(singleDateHeartbeat.date).valueOf();\r\n const now = Date.now();\r\n return now - hbTimestamp <= STORED_HEARTBEAT_RETENTION_MAX_MILLIS;\r\n });\r\n return this._storage.overwrite(this._heartbeatsCache);\r\n }\r\n /**\r\n * Returns a base64 encoded string which can be attached to the heartbeat-specific header directly.\r\n * It also clears all heartbeats from memory as well as in IndexedDB.\r\n *\r\n * NOTE: Consuming product SDKs should not send the header if this method\r\n * returns an empty string.\r\n */\r\n async getHeartbeatsHeader() {\r\n if (this._heartbeatsCache === null) {\r\n await this._heartbeatsCachePromise;\r\n }\r\n // If it's still null or the array is empty, there is no data to send.\r\n if (this._heartbeatsCache === null ||\r\n this._heartbeatsCache.heartbeats.length === 0) {\r\n return '';\r\n }\r\n const date = getUTCDateString();\r\n // Extract as many heartbeats from the cache as will fit under the size limit.\r\n const { heartbeatsToSend, unsentEntries } = extractHeartbeatsForHeader(this._heartbeatsCache.heartbeats);\r\n const headerString = base64urlEncodeWithoutPadding(JSON.stringify({ version: 2, heartbeats: heartbeatsToSend }));\r\n // Store last sent date to prevent another being logged/sent for the same day.\r\n this._heartbeatsCache.lastSentHeartbeatDate = date;\r\n if (unsentEntries.length > 0) {\r\n // Store any unsent entries if they exist.\r\n this._heartbeatsCache.heartbeats = unsentEntries;\r\n // This seems more likely than emptying the array (below) to lead to some odd state\r\n // since the cache isn't empty and this will be called again on the next request,\r\n // and is probably safest if we await it.\r\n await this._storage.overwrite(this._heartbeatsCache);\r\n }\r\n else {\r\n this._heartbeatsCache.heartbeats = [];\r\n // Do not wait for this, to reduce latency.\r\n void this._storage.overwrite(this._heartbeatsCache);\r\n }\r\n return headerString;\r\n }\r\n}\r\nfunction getUTCDateString() {\r\n const today = new Date();\r\n // Returns date format 'YYYY-MM-DD'\r\n return today.toISOString().substring(0, 10);\r\n}\r\nfunction extractHeartbeatsForHeader(heartbeatsCache, maxSize = MAX_HEADER_BYTES) {\r\n // Heartbeats grouped by user agent in the standard format to be sent in\r\n // the header.\r\n const heartbeatsToSend = [];\r\n // Single date format heartbeats that are not sent.\r\n let unsentEntries = heartbeatsCache.slice();\r\n for (const singleDateHeartbeat of heartbeatsCache) {\r\n // Look for an existing entry with the same user agent.\r\n const heartbeatEntry = heartbeatsToSend.find(hb => hb.agent === singleDateHeartbeat.agent);\r\n if (!heartbeatEntry) {\r\n // If no entry for this user agent exists, create one.\r\n heartbeatsToSend.push({\r\n agent: singleDateHeartbeat.agent,\r\n dates: [singleDateHeartbeat.date]\r\n });\r\n if (countBytes(heartbeatsToSend) > maxSize) {\r\n // If the header would exceed max size, remove the added heartbeat\r\n // entry and stop adding to the header.\r\n heartbeatsToSend.pop();\r\n break;\r\n }\r\n }\r\n else {\r\n heartbeatEntry.dates.push(singleDateHeartbeat.date);\r\n // If the header would exceed max size, remove the added date\r\n // and stop adding to the header.\r\n if (countBytes(heartbeatsToSend) > maxSize) {\r\n heartbeatEntry.dates.pop();\r\n break;\r\n }\r\n }\r\n // Pop unsent entry from queue. (Skipped if adding the entry exceeded\r\n // quota and the loop breaks early.)\r\n unsentEntries = unsentEntries.slice(1);\r\n }\r\n return {\r\n heartbeatsToSend,\r\n unsentEntries\r\n };\r\n}\r\nclass HeartbeatStorageImpl {\r\n constructor(app) {\r\n this.app = app;\r\n this._canUseIndexedDBPromise = this.runIndexedDBEnvironmentCheck();\r\n }\r\n async runIndexedDBEnvironmentCheck() {\r\n if (!isIndexedDBAvailable()) {\r\n return false;\r\n }\r\n else {\r\n return validateIndexedDBOpenable()\r\n .then(() => true)\r\n .catch(() => false);\r\n }\r\n }\r\n /**\r\n * Read all heartbeats.\r\n */\r\n async read() {\r\n const canUseIndexedDB = await this._canUseIndexedDBPromise;\r\n if (!canUseIndexedDB) {\r\n return { heartbeats: [] };\r\n }\r\n else {\r\n const idbHeartbeatObject = await readHeartbeatsFromIndexedDB(this.app);\r\n return idbHeartbeatObject || { heartbeats: [] };\r\n }\r\n }\r\n // overwrite the storage with the provided heartbeats\r\n async overwrite(heartbeatsObject) {\r\n var _a;\r\n const canUseIndexedDB = await this._canUseIndexedDBPromise;\r\n if (!canUseIndexedDB) {\r\n return;\r\n }\r\n else {\r\n const existingHeartbeatsObject = await this.read();\r\n return writeHeartbeatsToIndexedDB(this.app, {\r\n lastSentHeartbeatDate: (_a = heartbeatsObject.lastSentHeartbeatDate) !== null && _a !== void 0 ? _a : existingHeartbeatsObject.lastSentHeartbeatDate,\r\n heartbeats: heartbeatsObject.heartbeats\r\n });\r\n }\r\n }\r\n // add heartbeats\r\n async add(heartbeatsObject) {\r\n var _a;\r\n const canUseIndexedDB = await this._canUseIndexedDBPromise;\r\n if (!canUseIndexedDB) {\r\n return;\r\n }\r\n else {\r\n const existingHeartbeatsObject = await this.read();\r\n return writeHeartbeatsToIndexedDB(this.app, {\r\n lastSentHeartbeatDate: (_a = heartbeatsObject.lastSentHeartbeatDate) !== null && _a !== void 0 ? _a : existingHeartbeatsObject.lastSentHeartbeatDate,\r\n heartbeats: [\r\n ...existingHeartbeatsObject.heartbeats,\r\n ...heartbeatsObject.heartbeats\r\n ]\r\n });\r\n }\r\n }\r\n}\r\n/**\r\n * Calculate bytes of a HeartbeatsByUserAgent array after being wrapped\r\n * in a platform logging header JSON object, stringified, and converted\r\n * to base 64.\r\n */\r\nfunction countBytes(heartbeatsCache) {\r\n // base64 has a restricted set of characters, all of which should be 1 byte.\r\n return base64urlEncodeWithoutPadding(\r\n // heartbeatsCache wrapper properties\r\n JSON.stringify({ version: 2, heartbeats: heartbeatsCache })).length;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction registerCoreComponents(variant) {\r\n _registerComponent(new Component('platform-logger', container => new PlatformLoggerServiceImpl(container), \"PRIVATE\" /* ComponentType.PRIVATE */));\r\n _registerComponent(new Component('heartbeat', container => new HeartbeatServiceImpl(container), \"PRIVATE\" /* ComponentType.PRIVATE */));\r\n // Register `app` package.\r\n registerVersion(name$o, version$1, variant);\r\n // BUILD_TARGET will be replaced by values like esm5, esm2017, cjs5, etc during the compilation\r\n registerVersion(name$o, version$1, 'esm2017');\r\n // Register platform SDK identifier (no version).\r\n registerVersion('fire-js', '');\r\n}\n\n/**\r\n * Firebase App\r\n *\r\n * @remarks This package coordinates the communication between the different Firebase components\r\n * @packageDocumentation\r\n */\r\nregisterCoreComponents('');\n\nexport { SDK_VERSION, DEFAULT_ENTRY_NAME as _DEFAULT_ENTRY_NAME, _addComponent, _addOrOverwriteComponent, _apps, _clearComponents, _components, _getProvider, _registerComponent, _removeServiceInstance, deleteApp, getApp, getApps, initializeApp, onLog, registerVersion, setLogLevel };\n//# sourceMappingURL=index.esm2017.js.map\n","import { Deferred } from '@firebase/util';\n\n/**\r\n * Component for service name T, e.g. `auth`, `auth-internal`\r\n */\r\nclass Component {\r\n /**\r\n *\r\n * @param name The public service name, e.g. app, auth, firestore, database\r\n * @param instanceFactory Service factory responsible for creating the public interface\r\n * @param type whether the service provided by the component is public or private\r\n */\r\n constructor(name, instanceFactory, type) {\r\n this.name = name;\r\n this.instanceFactory = instanceFactory;\r\n this.type = type;\r\n this.multipleInstances = false;\r\n /**\r\n * Properties to be added to the service namespace\r\n */\r\n this.serviceProps = {};\r\n this.instantiationMode = \"LAZY\" /* InstantiationMode.LAZY */;\r\n this.onInstanceCreated = null;\r\n }\r\n setInstantiationMode(mode) {\r\n this.instantiationMode = mode;\r\n return this;\r\n }\r\n setMultipleInstances(multipleInstances) {\r\n this.multipleInstances = multipleInstances;\r\n return this;\r\n }\r\n setServiceProps(props) {\r\n this.serviceProps = props;\r\n return this;\r\n }\r\n setInstanceCreatedCallback(callback) {\r\n this.onInstanceCreated = callback;\r\n return this;\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst DEFAULT_ENTRY_NAME = '[DEFAULT]';\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Provider for instance for service name T, e.g. 'auth', 'auth-internal'\r\n * NameServiceMapping[T] is an alias for the type of the instance\r\n */\r\nclass Provider {\r\n constructor(name, container) {\r\n this.name = name;\r\n this.container = container;\r\n this.component = null;\r\n this.instances = new Map();\r\n this.instancesDeferred = new Map();\r\n this.instancesOptions = new Map();\r\n this.onInitCallbacks = new Map();\r\n }\r\n /**\r\n * @param identifier A provider can provide mulitple instances of a service\r\n * if this.component.multipleInstances is true.\r\n */\r\n get(identifier) {\r\n // if multipleInstances is not supported, use the default name\r\n const normalizedIdentifier = this.normalizeInstanceIdentifier(identifier);\r\n if (!this.instancesDeferred.has(normalizedIdentifier)) {\r\n const deferred = new Deferred();\r\n this.instancesDeferred.set(normalizedIdentifier, deferred);\r\n if (this.isInitialized(normalizedIdentifier) ||\r\n this.shouldAutoInitialize()) {\r\n // initialize the service if it can be auto-initialized\r\n try {\r\n const instance = this.getOrInitializeService({\r\n instanceIdentifier: normalizedIdentifier\r\n });\r\n if (instance) {\r\n deferred.resolve(instance);\r\n }\r\n }\r\n catch (e) {\r\n // when the instance factory throws an exception during get(), it should not cause\r\n // a fatal error. We just return the unresolved promise in this case.\r\n }\r\n }\r\n }\r\n return this.instancesDeferred.get(normalizedIdentifier).promise;\r\n }\r\n getImmediate(options) {\r\n var _a;\r\n // if multipleInstances is not supported, use the default name\r\n const normalizedIdentifier = this.normalizeInstanceIdentifier(options === null || options === void 0 ? void 0 : options.identifier);\r\n const optional = (_a = options === null || options === void 0 ? void 0 : options.optional) !== null && _a !== void 0 ? _a : false;\r\n if (this.isInitialized(normalizedIdentifier) ||\r\n this.shouldAutoInitialize()) {\r\n try {\r\n return this.getOrInitializeService({\r\n instanceIdentifier: normalizedIdentifier\r\n });\r\n }\r\n catch (e) {\r\n if (optional) {\r\n return null;\r\n }\r\n else {\r\n throw e;\r\n }\r\n }\r\n }\r\n else {\r\n // In case a component is not initialized and should/can not be auto-initialized at the moment, return null if the optional flag is set, or throw\r\n if (optional) {\r\n return null;\r\n }\r\n else {\r\n throw Error(`Service ${this.name} is not available`);\r\n }\r\n }\r\n }\r\n getComponent() {\r\n return this.component;\r\n }\r\n setComponent(component) {\r\n if (component.name !== this.name) {\r\n throw Error(`Mismatching Component ${component.name} for Provider ${this.name}.`);\r\n }\r\n if (this.component) {\r\n throw Error(`Component for ${this.name} has already been provided`);\r\n }\r\n this.component = component;\r\n // return early without attempting to initialize the component if the component requires explicit initialization (calling `Provider.initialize()`)\r\n if (!this.shouldAutoInitialize()) {\r\n return;\r\n }\r\n // if the service is eager, initialize the default instance\r\n if (isComponentEager(component)) {\r\n try {\r\n this.getOrInitializeService({ instanceIdentifier: DEFAULT_ENTRY_NAME });\r\n }\r\n catch (e) {\r\n // when the instance factory for an eager Component throws an exception during the eager\r\n // initialization, it should not cause a fatal error.\r\n // TODO: Investigate if we need to make it configurable, because some component may want to cause\r\n // a fatal error in this case?\r\n }\r\n }\r\n // Create service instances for the pending promises and resolve them\r\n // NOTE: if this.multipleInstances is false, only the default instance will be created\r\n // and all promises with resolve with it regardless of the identifier.\r\n for (const [instanceIdentifier, instanceDeferred] of this.instancesDeferred.entries()) {\r\n const normalizedIdentifier = this.normalizeInstanceIdentifier(instanceIdentifier);\r\n try {\r\n // `getOrInitializeService()` should always return a valid instance since a component is guaranteed. use ! to make typescript happy.\r\n const instance = this.getOrInitializeService({\r\n instanceIdentifier: normalizedIdentifier\r\n });\r\n instanceDeferred.resolve(instance);\r\n }\r\n catch (e) {\r\n // when the instance factory throws an exception, it should not cause\r\n // a fatal error. We just leave the promise unresolved.\r\n }\r\n }\r\n }\r\n clearInstance(identifier = DEFAULT_ENTRY_NAME) {\r\n this.instancesDeferred.delete(identifier);\r\n this.instancesOptions.delete(identifier);\r\n this.instances.delete(identifier);\r\n }\r\n // app.delete() will call this method on every provider to delete the services\r\n // TODO: should we mark the provider as deleted?\r\n async delete() {\r\n const services = Array.from(this.instances.values());\r\n await Promise.all([\r\n ...services\r\n .filter(service => 'INTERNAL' in service) // legacy services\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n .map(service => service.INTERNAL.delete()),\r\n ...services\r\n .filter(service => '_delete' in service) // modularized services\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n .map(service => service._delete())\r\n ]);\r\n }\r\n isComponentSet() {\r\n return this.component != null;\r\n }\r\n isInitialized(identifier = DEFAULT_ENTRY_NAME) {\r\n return this.instances.has(identifier);\r\n }\r\n getOptions(identifier = DEFAULT_ENTRY_NAME) {\r\n return this.instancesOptions.get(identifier) || {};\r\n }\r\n initialize(opts = {}) {\r\n const { options = {} } = opts;\r\n const normalizedIdentifier = this.normalizeInstanceIdentifier(opts.instanceIdentifier);\r\n if (this.isInitialized(normalizedIdentifier)) {\r\n throw Error(`${this.name}(${normalizedIdentifier}) has already been initialized`);\r\n }\r\n if (!this.isComponentSet()) {\r\n throw Error(`Component ${this.name} has not been registered yet`);\r\n }\r\n const instance = this.getOrInitializeService({\r\n instanceIdentifier: normalizedIdentifier,\r\n options\r\n });\r\n // resolve any pending promise waiting for the service instance\r\n for (const [instanceIdentifier, instanceDeferred] of this.instancesDeferred.entries()) {\r\n const normalizedDeferredIdentifier = this.normalizeInstanceIdentifier(instanceIdentifier);\r\n if (normalizedIdentifier === normalizedDeferredIdentifier) {\r\n instanceDeferred.resolve(instance);\r\n }\r\n }\r\n return instance;\r\n }\r\n /**\r\n *\r\n * @param callback - a function that will be invoked after the provider has been initialized by calling provider.initialize().\r\n * The function is invoked SYNCHRONOUSLY, so it should not execute any longrunning tasks in order to not block the program.\r\n *\r\n * @param identifier An optional instance identifier\r\n * @returns a function to unregister the callback\r\n */\r\n onInit(callback, identifier) {\r\n var _a;\r\n const normalizedIdentifier = this.normalizeInstanceIdentifier(identifier);\r\n const existingCallbacks = (_a = this.onInitCallbacks.get(normalizedIdentifier)) !== null && _a !== void 0 ? _a : new Set();\r\n existingCallbacks.add(callback);\r\n this.onInitCallbacks.set(normalizedIdentifier, existingCallbacks);\r\n const existingInstance = this.instances.get(normalizedIdentifier);\r\n if (existingInstance) {\r\n callback(existingInstance, normalizedIdentifier);\r\n }\r\n return () => {\r\n existingCallbacks.delete(callback);\r\n };\r\n }\r\n /**\r\n * Invoke onInit callbacks synchronously\r\n * @param instance the service instance`\r\n */\r\n invokeOnInitCallbacks(instance, identifier) {\r\n const callbacks = this.onInitCallbacks.get(identifier);\r\n if (!callbacks) {\r\n return;\r\n }\r\n for (const callback of callbacks) {\r\n try {\r\n callback(instance, identifier);\r\n }\r\n catch (_a) {\r\n // ignore errors in the onInit callback\r\n }\r\n }\r\n }\r\n getOrInitializeService({ instanceIdentifier, options = {} }) {\r\n let instance = this.instances.get(instanceIdentifier);\r\n if (!instance && this.component) {\r\n instance = this.component.instanceFactory(this.container, {\r\n instanceIdentifier: normalizeIdentifierForFactory(instanceIdentifier),\r\n options\r\n });\r\n this.instances.set(instanceIdentifier, instance);\r\n this.instancesOptions.set(instanceIdentifier, options);\r\n /**\r\n * Invoke onInit listeners.\r\n * Note this.component.onInstanceCreated is different, which is used by the component creator,\r\n * while onInit listeners are registered by consumers of the provider.\r\n */\r\n this.invokeOnInitCallbacks(instance, instanceIdentifier);\r\n /**\r\n * Order is important\r\n * onInstanceCreated() should be called after this.instances.set(instanceIdentifier, instance); which\r\n * makes `isInitialized()` return true.\r\n */\r\n if (this.component.onInstanceCreated) {\r\n try {\r\n this.component.onInstanceCreated(this.container, instanceIdentifier, instance);\r\n }\r\n catch (_a) {\r\n // ignore errors in the onInstanceCreatedCallback\r\n }\r\n }\r\n }\r\n return instance || null;\r\n }\r\n normalizeInstanceIdentifier(identifier = DEFAULT_ENTRY_NAME) {\r\n if (this.component) {\r\n return this.component.multipleInstances ? identifier : DEFAULT_ENTRY_NAME;\r\n }\r\n else {\r\n return identifier; // assume multiple instances are supported before the component is provided.\r\n }\r\n }\r\n shouldAutoInitialize() {\r\n return (!!this.component &&\r\n this.component.instantiationMode !== \"EXPLICIT\" /* InstantiationMode.EXPLICIT */);\r\n }\r\n}\r\n// undefined should be passed to the service factory for the default instance\r\nfunction normalizeIdentifierForFactory(identifier) {\r\n return identifier === DEFAULT_ENTRY_NAME ? undefined : identifier;\r\n}\r\nfunction isComponentEager(component) {\r\n return component.instantiationMode === \"EAGER\" /* InstantiationMode.EAGER */;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * ComponentContainer that provides Providers for service name T, e.g. `auth`, `auth-internal`\r\n */\r\nclass ComponentContainer {\r\n constructor(name) {\r\n this.name = name;\r\n this.providers = new Map();\r\n }\r\n /**\r\n *\r\n * @param component Component being added\r\n * @param overwrite When a component with the same name has already been registered,\r\n * if overwrite is true: overwrite the existing component with the new component and create a new\r\n * provider with the new component. It can be useful in tests where you want to use different mocks\r\n * for different tests.\r\n * if overwrite is false: throw an exception\r\n */\r\n addComponent(component) {\r\n const provider = this.getProvider(component.name);\r\n if (provider.isComponentSet()) {\r\n throw new Error(`Component ${component.name} has already been registered with ${this.name}`);\r\n }\r\n provider.setComponent(component);\r\n }\r\n addOrOverwriteComponent(component) {\r\n const provider = this.getProvider(component.name);\r\n if (provider.isComponentSet()) {\r\n // delete the existing provider from the container, so we can register the new component\r\n this.providers.delete(component.name);\r\n }\r\n this.addComponent(component);\r\n }\r\n /**\r\n * getProvider provides a type safe interface where it can only be called with a field name\r\n * present in NameServiceMapping interface.\r\n *\r\n * Firebase SDKs providing services should extend NameServiceMapping interface to register\r\n * themselves.\r\n */\r\n getProvider(name) {\r\n if (this.providers.has(name)) {\r\n return this.providers.get(name);\r\n }\r\n // create a Provider for a service that hasn't registered with Firebase\r\n const provider = new Provider(name, this);\r\n this.providers.set(name, provider);\r\n return provider;\r\n }\r\n getProviders() {\r\n return Array.from(this.providers.values());\r\n }\r\n}\n\nexport { Component, ComponentContainer, Provider };\n//# sourceMappingURL=index.esm2017.js.map\n","import { _getProvider, getApp, _registerComponent, registerVersion } from '@firebase/app';\nimport { Component } from '@firebase/component';\nimport { ErrorFactory, FirebaseError } from '@firebase/util';\nimport { openDB } from 'idb';\n\nconst name = \"@firebase/installations\";\nconst version = \"0.6.1\";\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst PENDING_TIMEOUT_MS = 10000;\r\nconst PACKAGE_VERSION = `w:${version}`;\r\nconst INTERNAL_AUTH_VERSION = 'FIS_v2';\r\nconst INSTALLATIONS_API_URL = 'https://firebaseinstallations.googleapis.com/v1';\r\nconst TOKEN_EXPIRATION_BUFFER = 60 * 60 * 1000; // One hour\r\nconst SERVICE = 'installations';\r\nconst SERVICE_NAME = 'Installations';\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst ERROR_DESCRIPTION_MAP = {\r\n [\"missing-app-config-values\" /* ErrorCode.MISSING_APP_CONFIG_VALUES */]: 'Missing App configuration value: \"{$valueName}\"',\r\n [\"not-registered\" /* ErrorCode.NOT_REGISTERED */]: 'Firebase Installation is not registered.',\r\n [\"installation-not-found\" /* ErrorCode.INSTALLATION_NOT_FOUND */]: 'Firebase Installation not found.',\r\n [\"request-failed\" /* ErrorCode.REQUEST_FAILED */]: '{$requestName} request failed with error \"{$serverCode} {$serverStatus}: {$serverMessage}\"',\r\n [\"app-offline\" /* ErrorCode.APP_OFFLINE */]: 'Could not process request. Application offline.',\r\n [\"delete-pending-registration\" /* ErrorCode.DELETE_PENDING_REGISTRATION */]: \"Can't delete installation while there is a pending registration request.\"\r\n};\r\nconst ERROR_FACTORY = new ErrorFactory(SERVICE, SERVICE_NAME, ERROR_DESCRIPTION_MAP);\r\n/** Returns true if error is a FirebaseError that is based on an error from the server. */\r\nfunction isServerError(error) {\r\n return (error instanceof FirebaseError &&\r\n error.code.includes(\"request-failed\" /* ErrorCode.REQUEST_FAILED */));\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction getInstallationsEndpoint({ projectId }) {\r\n return `${INSTALLATIONS_API_URL}/projects/${projectId}/installations`;\r\n}\r\nfunction extractAuthTokenInfoFromResponse(response) {\r\n return {\r\n token: response.token,\r\n requestStatus: 2 /* RequestStatus.COMPLETED */,\r\n expiresIn: getExpiresInFromResponseExpiresIn(response.expiresIn),\r\n creationTime: Date.now()\r\n };\r\n}\r\nasync function getErrorFromResponse(requestName, response) {\r\n const responseJson = await response.json();\r\n const errorData = responseJson.error;\r\n return ERROR_FACTORY.create(\"request-failed\" /* ErrorCode.REQUEST_FAILED */, {\r\n requestName,\r\n serverCode: errorData.code,\r\n serverMessage: errorData.message,\r\n serverStatus: errorData.status\r\n });\r\n}\r\nfunction getHeaders({ apiKey }) {\r\n return new Headers({\r\n 'Content-Type': 'application/json',\r\n Accept: 'application/json',\r\n 'x-goog-api-key': apiKey\r\n });\r\n}\r\nfunction getHeadersWithAuth(appConfig, { refreshToken }) {\r\n const headers = getHeaders(appConfig);\r\n headers.append('Authorization', getAuthorizationHeader(refreshToken));\r\n return headers;\r\n}\r\n/**\r\n * Calls the passed in fetch wrapper and returns the response.\r\n * If the returned response has a status of 5xx, re-runs the function once and\r\n * returns the response.\r\n */\r\nasync function retryIfServerError(fn) {\r\n const result = await fn();\r\n if (result.status >= 500 && result.status < 600) {\r\n // Internal Server Error. Retry request.\r\n return fn();\r\n }\r\n return result;\r\n}\r\nfunction getExpiresInFromResponseExpiresIn(responseExpiresIn) {\r\n // This works because the server will never respond with fractions of a second.\r\n return Number(responseExpiresIn.replace('s', '000'));\r\n}\r\nfunction getAuthorizationHeader(refreshToken) {\r\n return `${INTERNAL_AUTH_VERSION} ${refreshToken}`;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nasync function createInstallationRequest({ appConfig, heartbeatServiceProvider }, { fid }) {\r\n const endpoint = getInstallationsEndpoint(appConfig);\r\n const headers = getHeaders(appConfig);\r\n // If heartbeat service exists, add the heartbeat string to the header.\r\n const heartbeatService = heartbeatServiceProvider.getImmediate({\r\n optional: true\r\n });\r\n if (heartbeatService) {\r\n const heartbeatsHeader = await heartbeatService.getHeartbeatsHeader();\r\n if (heartbeatsHeader) {\r\n headers.append('x-firebase-client', heartbeatsHeader);\r\n }\r\n }\r\n const body = {\r\n fid,\r\n authVersion: INTERNAL_AUTH_VERSION,\r\n appId: appConfig.appId,\r\n sdkVersion: PACKAGE_VERSION\r\n };\r\n const request = {\r\n method: 'POST',\r\n headers,\r\n body: JSON.stringify(body)\r\n };\r\n const response = await retryIfServerError(() => fetch(endpoint, request));\r\n if (response.ok) {\r\n const responseValue = await response.json();\r\n const registeredInstallationEntry = {\r\n fid: responseValue.fid || fid,\r\n registrationStatus: 2 /* RequestStatus.COMPLETED */,\r\n refreshToken: responseValue.refreshToken,\r\n authToken: extractAuthTokenInfoFromResponse(responseValue.authToken)\r\n };\r\n return registeredInstallationEntry;\r\n }\r\n else {\r\n throw await getErrorFromResponse('Create Installation', response);\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/** Returns a promise that resolves after given time passes. */\r\nfunction sleep(ms) {\r\n return new Promise(resolve => {\r\n setTimeout(resolve, ms);\r\n });\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction bufferToBase64UrlSafe(array) {\r\n const b64 = btoa(String.fromCharCode(...array));\r\n return b64.replace(/\\+/g, '-').replace(/\\//g, '_');\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst VALID_FID_PATTERN = /^[cdef][\\w-]{21}$/;\r\nconst INVALID_FID = '';\r\n/**\r\n * Generates a new FID using random values from Web Crypto API.\r\n * Returns an empty string if FID generation fails for any reason.\r\n */\r\nfunction generateFid() {\r\n try {\r\n // A valid FID has exactly 22 base64 characters, which is 132 bits, or 16.5\r\n // bytes. our implementation generates a 17 byte array instead.\r\n const fidByteArray = new Uint8Array(17);\r\n const crypto = self.crypto || self.msCrypto;\r\n crypto.getRandomValues(fidByteArray);\r\n // Replace the first 4 random bits with the constant FID header of 0b0111.\r\n fidByteArray[0] = 0b01110000 + (fidByteArray[0] % 0b00010000);\r\n const fid = encode(fidByteArray);\r\n return VALID_FID_PATTERN.test(fid) ? fid : INVALID_FID;\r\n }\r\n catch (_a) {\r\n // FID generation errored\r\n return INVALID_FID;\r\n }\r\n}\r\n/** Converts a FID Uint8Array to a base64 string representation. */\r\nfunction encode(fidByteArray) {\r\n const b64String = bufferToBase64UrlSafe(fidByteArray);\r\n // Remove the 23rd character that was added because of the extra 4 bits at the\r\n // end of our 17 byte array, and the '=' padding.\r\n return b64String.substr(0, 22);\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/** Returns a string key that can be used to identify the app. */\r\nfunction getKey(appConfig) {\r\n return `${appConfig.appName}!${appConfig.appId}`;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst fidChangeCallbacks = new Map();\r\n/**\r\n * Calls the onIdChange callbacks with the new FID value, and broadcasts the\r\n * change to other tabs.\r\n */\r\nfunction fidChanged(appConfig, fid) {\r\n const key = getKey(appConfig);\r\n callFidChangeCallbacks(key, fid);\r\n broadcastFidChange(key, fid);\r\n}\r\nfunction addCallback(appConfig, callback) {\r\n // Open the broadcast channel if it's not already open,\r\n // to be able to listen to change events from other tabs.\r\n getBroadcastChannel();\r\n const key = getKey(appConfig);\r\n let callbackSet = fidChangeCallbacks.get(key);\r\n if (!callbackSet) {\r\n callbackSet = new Set();\r\n fidChangeCallbacks.set(key, callbackSet);\r\n }\r\n callbackSet.add(callback);\r\n}\r\nfunction removeCallback(appConfig, callback) {\r\n const key = getKey(appConfig);\r\n const callbackSet = fidChangeCallbacks.get(key);\r\n if (!callbackSet) {\r\n return;\r\n }\r\n callbackSet.delete(callback);\r\n if (callbackSet.size === 0) {\r\n fidChangeCallbacks.delete(key);\r\n }\r\n // Close broadcast channel if there are no more callbacks.\r\n closeBroadcastChannel();\r\n}\r\nfunction callFidChangeCallbacks(key, fid) {\r\n const callbacks = fidChangeCallbacks.get(key);\r\n if (!callbacks) {\r\n return;\r\n }\r\n for (const callback of callbacks) {\r\n callback(fid);\r\n }\r\n}\r\nfunction broadcastFidChange(key, fid) {\r\n const channel = getBroadcastChannel();\r\n if (channel) {\r\n channel.postMessage({ key, fid });\r\n }\r\n closeBroadcastChannel();\r\n}\r\nlet broadcastChannel = null;\r\n/** Opens and returns a BroadcastChannel if it is supported by the browser. */\r\nfunction getBroadcastChannel() {\r\n if (!broadcastChannel && 'BroadcastChannel' in self) {\r\n broadcastChannel = new BroadcastChannel('[Firebase] FID Change');\r\n broadcastChannel.onmessage = e => {\r\n callFidChangeCallbacks(e.data.key, e.data.fid);\r\n };\r\n }\r\n return broadcastChannel;\r\n}\r\nfunction closeBroadcastChannel() {\r\n if (fidChangeCallbacks.size === 0 && broadcastChannel) {\r\n broadcastChannel.close();\r\n broadcastChannel = null;\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst DATABASE_NAME = 'firebase-installations-database';\r\nconst DATABASE_VERSION = 1;\r\nconst OBJECT_STORE_NAME = 'firebase-installations-store';\r\nlet dbPromise = null;\r\nfunction getDbPromise() {\r\n if (!dbPromise) {\r\n dbPromise = openDB(DATABASE_NAME, DATABASE_VERSION, {\r\n upgrade: (db, oldVersion) => {\r\n // We don't use 'break' in this switch statement, the fall-through\r\n // behavior is what we want, because if there are multiple versions between\r\n // the old version and the current version, we want ALL the migrations\r\n // that correspond to those versions to run, not only the last one.\r\n // eslint-disable-next-line default-case\r\n switch (oldVersion) {\r\n case 0:\r\n db.createObjectStore(OBJECT_STORE_NAME);\r\n }\r\n }\r\n });\r\n }\r\n return dbPromise;\r\n}\r\n/** Assigns or overwrites the record for the given key with the given value. */\r\nasync function set(appConfig, value) {\r\n const key = getKey(appConfig);\r\n const db = await getDbPromise();\r\n const tx = db.transaction(OBJECT_STORE_NAME, 'readwrite');\r\n const objectStore = tx.objectStore(OBJECT_STORE_NAME);\r\n const oldValue = (await objectStore.get(key));\r\n await objectStore.put(value, key);\r\n await tx.done;\r\n if (!oldValue || oldValue.fid !== value.fid) {\r\n fidChanged(appConfig, value.fid);\r\n }\r\n return value;\r\n}\r\n/** Removes record(s) from the objectStore that match the given key. */\r\nasync function remove(appConfig) {\r\n const key = getKey(appConfig);\r\n const db = await getDbPromise();\r\n const tx = db.transaction(OBJECT_STORE_NAME, 'readwrite');\r\n await tx.objectStore(OBJECT_STORE_NAME).delete(key);\r\n await tx.done;\r\n}\r\n/**\r\n * Atomically updates a record with the result of updateFn, which gets\r\n * called with the current value. If newValue is undefined, the record is\r\n * deleted instead.\r\n * @return Updated value\r\n */\r\nasync function update(appConfig, updateFn) {\r\n const key = getKey(appConfig);\r\n const db = await getDbPromise();\r\n const tx = db.transaction(OBJECT_STORE_NAME, 'readwrite');\r\n const store = tx.objectStore(OBJECT_STORE_NAME);\r\n const oldValue = (await store.get(key));\r\n const newValue = updateFn(oldValue);\r\n if (newValue === undefined) {\r\n await store.delete(key);\r\n }\r\n else {\r\n await store.put(newValue, key);\r\n }\r\n await tx.done;\r\n if (newValue && (!oldValue || oldValue.fid !== newValue.fid)) {\r\n fidChanged(appConfig, newValue.fid);\r\n }\r\n return newValue;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Updates and returns the InstallationEntry from the database.\r\n * Also triggers a registration request if it is necessary and possible.\r\n */\r\nasync function getInstallationEntry(installations) {\r\n let registrationPromise;\r\n const installationEntry = await update(installations.appConfig, oldEntry => {\r\n const installationEntry = updateOrCreateInstallationEntry(oldEntry);\r\n const entryWithPromise = triggerRegistrationIfNecessary(installations, installationEntry);\r\n registrationPromise = entryWithPromise.registrationPromise;\r\n return entryWithPromise.installationEntry;\r\n });\r\n if (installationEntry.fid === INVALID_FID) {\r\n // FID generation failed. Waiting for the FID from the server.\r\n return { installationEntry: await registrationPromise };\r\n }\r\n return {\r\n installationEntry,\r\n registrationPromise\r\n };\r\n}\r\n/**\r\n * Creates a new Installation Entry if one does not exist.\r\n * Also clears timed out pending requests.\r\n */\r\nfunction updateOrCreateInstallationEntry(oldEntry) {\r\n const entry = oldEntry || {\r\n fid: generateFid(),\r\n registrationStatus: 0 /* RequestStatus.NOT_STARTED */\r\n };\r\n return clearTimedOutRequest(entry);\r\n}\r\n/**\r\n * If the Firebase Installation is not registered yet, this will trigger the\r\n * registration and return an InProgressInstallationEntry.\r\n *\r\n * If registrationPromise does not exist, the installationEntry is guaranteed\r\n * to be registered.\r\n */\r\nfunction triggerRegistrationIfNecessary(installations, installationEntry) {\r\n if (installationEntry.registrationStatus === 0 /* RequestStatus.NOT_STARTED */) {\r\n if (!navigator.onLine) {\r\n // Registration required but app is offline.\r\n const registrationPromiseWithError = Promise.reject(ERROR_FACTORY.create(\"app-offline\" /* ErrorCode.APP_OFFLINE */));\r\n return {\r\n installationEntry,\r\n registrationPromise: registrationPromiseWithError\r\n };\r\n }\r\n // Try registering. Change status to IN_PROGRESS.\r\n const inProgressEntry = {\r\n fid: installationEntry.fid,\r\n registrationStatus: 1 /* RequestStatus.IN_PROGRESS */,\r\n registrationTime: Date.now()\r\n };\r\n const registrationPromise = registerInstallation(installations, inProgressEntry);\r\n return { installationEntry: inProgressEntry, registrationPromise };\r\n }\r\n else if (installationEntry.registrationStatus === 1 /* RequestStatus.IN_PROGRESS */) {\r\n return {\r\n installationEntry,\r\n registrationPromise: waitUntilFidRegistration(installations)\r\n };\r\n }\r\n else {\r\n return { installationEntry };\r\n }\r\n}\r\n/** This will be executed only once for each new Firebase Installation. */\r\nasync function registerInstallation(installations, installationEntry) {\r\n try {\r\n const registeredInstallationEntry = await createInstallationRequest(installations, installationEntry);\r\n return set(installations.appConfig, registeredInstallationEntry);\r\n }\r\n catch (e) {\r\n if (isServerError(e) && e.customData.serverCode === 409) {\r\n // Server returned a \"FID can not be used\" error.\r\n // Generate a new ID next time.\r\n await remove(installations.appConfig);\r\n }\r\n else {\r\n // Registration failed. Set FID as not registered.\r\n await set(installations.appConfig, {\r\n fid: installationEntry.fid,\r\n registrationStatus: 0 /* RequestStatus.NOT_STARTED */\r\n });\r\n }\r\n throw e;\r\n }\r\n}\r\n/** Call if FID registration is pending in another request. */\r\nasync function waitUntilFidRegistration(installations) {\r\n // Unfortunately, there is no way of reliably observing when a value in\r\n // IndexedDB changes (yet, see https://github.com/WICG/indexed-db-observers),\r\n // so we need to poll.\r\n let entry = await updateInstallationRequest(installations.appConfig);\r\n while (entry.registrationStatus === 1 /* RequestStatus.IN_PROGRESS */) {\r\n // createInstallation request still in progress.\r\n await sleep(100);\r\n entry = await updateInstallationRequest(installations.appConfig);\r\n }\r\n if (entry.registrationStatus === 0 /* RequestStatus.NOT_STARTED */) {\r\n // The request timed out or failed in a different call. Try again.\r\n const { installationEntry, registrationPromise } = await getInstallationEntry(installations);\r\n if (registrationPromise) {\r\n return registrationPromise;\r\n }\r\n else {\r\n // if there is no registrationPromise, entry is registered.\r\n return installationEntry;\r\n }\r\n }\r\n return entry;\r\n}\r\n/**\r\n * Called only if there is a CreateInstallation request in progress.\r\n *\r\n * Updates the InstallationEntry in the DB based on the status of the\r\n * CreateInstallation request.\r\n *\r\n * Returns the updated InstallationEntry.\r\n */\r\nfunction updateInstallationRequest(appConfig) {\r\n return update(appConfig, oldEntry => {\r\n if (!oldEntry) {\r\n throw ERROR_FACTORY.create(\"installation-not-found\" /* ErrorCode.INSTALLATION_NOT_FOUND */);\r\n }\r\n return clearTimedOutRequest(oldEntry);\r\n });\r\n}\r\nfunction clearTimedOutRequest(entry) {\r\n if (hasInstallationRequestTimedOut(entry)) {\r\n return {\r\n fid: entry.fid,\r\n registrationStatus: 0 /* RequestStatus.NOT_STARTED */\r\n };\r\n }\r\n return entry;\r\n}\r\nfunction hasInstallationRequestTimedOut(installationEntry) {\r\n return (installationEntry.registrationStatus === 1 /* RequestStatus.IN_PROGRESS */ &&\r\n installationEntry.registrationTime + PENDING_TIMEOUT_MS < Date.now());\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nasync function generateAuthTokenRequest({ appConfig, heartbeatServiceProvider }, installationEntry) {\r\n const endpoint = getGenerateAuthTokenEndpoint(appConfig, installationEntry);\r\n const headers = getHeadersWithAuth(appConfig, installationEntry);\r\n // If heartbeat service exists, add the heartbeat string to the header.\r\n const heartbeatService = heartbeatServiceProvider.getImmediate({\r\n optional: true\r\n });\r\n if (heartbeatService) {\r\n const heartbeatsHeader = await heartbeatService.getHeartbeatsHeader();\r\n if (heartbeatsHeader) {\r\n headers.append('x-firebase-client', heartbeatsHeader);\r\n }\r\n }\r\n const body = {\r\n installation: {\r\n sdkVersion: PACKAGE_VERSION,\r\n appId: appConfig.appId\r\n }\r\n };\r\n const request = {\r\n method: 'POST',\r\n headers,\r\n body: JSON.stringify(body)\r\n };\r\n const response = await retryIfServerError(() => fetch(endpoint, request));\r\n if (response.ok) {\r\n const responseValue = await response.json();\r\n const completedAuthToken = extractAuthTokenInfoFromResponse(responseValue);\r\n return completedAuthToken;\r\n }\r\n else {\r\n throw await getErrorFromResponse('Generate Auth Token', response);\r\n }\r\n}\r\nfunction getGenerateAuthTokenEndpoint(appConfig, { fid }) {\r\n return `${getInstallationsEndpoint(appConfig)}/${fid}/authTokens:generate`;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Returns a valid authentication token for the installation. Generates a new\r\n * token if one doesn't exist, is expired or about to expire.\r\n *\r\n * Should only be called if the Firebase Installation is registered.\r\n */\r\nasync function refreshAuthToken(installations, forceRefresh = false) {\r\n let tokenPromise;\r\n const entry = await update(installations.appConfig, oldEntry => {\r\n if (!isEntryRegistered(oldEntry)) {\r\n throw ERROR_FACTORY.create(\"not-registered\" /* ErrorCode.NOT_REGISTERED */);\r\n }\r\n const oldAuthToken = oldEntry.authToken;\r\n if (!forceRefresh && isAuthTokenValid(oldAuthToken)) {\r\n // There is a valid token in the DB.\r\n return oldEntry;\r\n }\r\n else if (oldAuthToken.requestStatus === 1 /* RequestStatus.IN_PROGRESS */) {\r\n // There already is a token request in progress.\r\n tokenPromise = waitUntilAuthTokenRequest(installations, forceRefresh);\r\n return oldEntry;\r\n }\r\n else {\r\n // No token or token expired.\r\n if (!navigator.onLine) {\r\n throw ERROR_FACTORY.create(\"app-offline\" /* ErrorCode.APP_OFFLINE */);\r\n }\r\n const inProgressEntry = makeAuthTokenRequestInProgressEntry(oldEntry);\r\n tokenPromise = fetchAuthTokenFromServer(installations, inProgressEntry);\r\n return inProgressEntry;\r\n }\r\n });\r\n const authToken = tokenPromise\r\n ? await tokenPromise\r\n : entry.authToken;\r\n return authToken;\r\n}\r\n/**\r\n * Call only if FID is registered and Auth Token request is in progress.\r\n *\r\n * Waits until the current pending request finishes. If the request times out,\r\n * tries once in this thread as well.\r\n */\r\nasync function waitUntilAuthTokenRequest(installations, forceRefresh) {\r\n // Unfortunately, there is no way of reliably observing when a value in\r\n // IndexedDB changes (yet, see https://github.com/WICG/indexed-db-observers),\r\n // so we need to poll.\r\n let entry = await updateAuthTokenRequest(installations.appConfig);\r\n while (entry.authToken.requestStatus === 1 /* RequestStatus.IN_PROGRESS */) {\r\n // generateAuthToken still in progress.\r\n await sleep(100);\r\n entry = await updateAuthTokenRequest(installations.appConfig);\r\n }\r\n const authToken = entry.authToken;\r\n if (authToken.requestStatus === 0 /* RequestStatus.NOT_STARTED */) {\r\n // The request timed out or failed in a different call. Try again.\r\n return refreshAuthToken(installations, forceRefresh);\r\n }\r\n else {\r\n return authToken;\r\n }\r\n}\r\n/**\r\n * Called only if there is a GenerateAuthToken request in progress.\r\n *\r\n * Updates the InstallationEntry in the DB based on the status of the\r\n * GenerateAuthToken request.\r\n *\r\n * Returns the updated InstallationEntry.\r\n */\r\nfunction updateAuthTokenRequest(appConfig) {\r\n return update(appConfig, oldEntry => {\r\n if (!isEntryRegistered(oldEntry)) {\r\n throw ERROR_FACTORY.create(\"not-registered\" /* ErrorCode.NOT_REGISTERED */);\r\n }\r\n const oldAuthToken = oldEntry.authToken;\r\n if (hasAuthTokenRequestTimedOut(oldAuthToken)) {\r\n return Object.assign(Object.assign({}, oldEntry), { authToken: { requestStatus: 0 /* RequestStatus.NOT_STARTED */ } });\r\n }\r\n return oldEntry;\r\n });\r\n}\r\nasync function fetchAuthTokenFromServer(installations, installationEntry) {\r\n try {\r\n const authToken = await generateAuthTokenRequest(installations, installationEntry);\r\n const updatedInstallationEntry = Object.assign(Object.assign({}, installationEntry), { authToken });\r\n await set(installations.appConfig, updatedInstallationEntry);\r\n return authToken;\r\n }\r\n catch (e) {\r\n if (isServerError(e) &&\r\n (e.customData.serverCode === 401 || e.customData.serverCode === 404)) {\r\n // Server returned a \"FID not found\" or a \"Invalid authentication\" error.\r\n // Generate a new ID next time.\r\n await remove(installations.appConfig);\r\n }\r\n else {\r\n const updatedInstallationEntry = Object.assign(Object.assign({}, installationEntry), { authToken: { requestStatus: 0 /* RequestStatus.NOT_STARTED */ } });\r\n await set(installations.appConfig, updatedInstallationEntry);\r\n }\r\n throw e;\r\n }\r\n}\r\nfunction isEntryRegistered(installationEntry) {\r\n return (installationEntry !== undefined &&\r\n installationEntry.registrationStatus === 2 /* RequestStatus.COMPLETED */);\r\n}\r\nfunction isAuthTokenValid(authToken) {\r\n return (authToken.requestStatus === 2 /* RequestStatus.COMPLETED */ &&\r\n !isAuthTokenExpired(authToken));\r\n}\r\nfunction isAuthTokenExpired(authToken) {\r\n const now = Date.now();\r\n return (now < authToken.creationTime ||\r\n authToken.creationTime + authToken.expiresIn < now + TOKEN_EXPIRATION_BUFFER);\r\n}\r\n/** Returns an updated InstallationEntry with an InProgressAuthToken. */\r\nfunction makeAuthTokenRequestInProgressEntry(oldEntry) {\r\n const inProgressAuthToken = {\r\n requestStatus: 1 /* RequestStatus.IN_PROGRESS */,\r\n requestTime: Date.now()\r\n };\r\n return Object.assign(Object.assign({}, oldEntry), { authToken: inProgressAuthToken });\r\n}\r\nfunction hasAuthTokenRequestTimedOut(authToken) {\r\n return (authToken.requestStatus === 1 /* RequestStatus.IN_PROGRESS */ &&\r\n authToken.requestTime + PENDING_TIMEOUT_MS < Date.now());\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Creates a Firebase Installation if there isn't one for the app and\r\n * returns the Installation ID.\r\n * @param installations - The `Installations` instance.\r\n *\r\n * @public\r\n */\r\nasync function getId(installations) {\r\n const installationsImpl = installations;\r\n const { installationEntry, registrationPromise } = await getInstallationEntry(installationsImpl);\r\n if (registrationPromise) {\r\n registrationPromise.catch(console.error);\r\n }\r\n else {\r\n // If the installation is already registered, update the authentication\r\n // token if needed.\r\n refreshAuthToken(installationsImpl).catch(console.error);\r\n }\r\n return installationEntry.fid;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Returns a Firebase Installations auth token, identifying the current\r\n * Firebase Installation.\r\n * @param installations - The `Installations` instance.\r\n * @param forceRefresh - Force refresh regardless of token expiration.\r\n *\r\n * @public\r\n */\r\nasync function getToken(installations, forceRefresh = false) {\r\n const installationsImpl = installations;\r\n await completeInstallationRegistration(installationsImpl);\r\n // At this point we either have a Registered Installation in the DB, or we've\r\n // already thrown an error.\r\n const authToken = await refreshAuthToken(installationsImpl, forceRefresh);\r\n return authToken.token;\r\n}\r\nasync function completeInstallationRegistration(installations) {\r\n const { registrationPromise } = await getInstallationEntry(installations);\r\n if (registrationPromise) {\r\n // A createInstallation request is in progress. Wait until it finishes.\r\n await registrationPromise;\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nasync function deleteInstallationRequest(appConfig, installationEntry) {\r\n const endpoint = getDeleteEndpoint(appConfig, installationEntry);\r\n const headers = getHeadersWithAuth(appConfig, installationEntry);\r\n const request = {\r\n method: 'DELETE',\r\n headers\r\n };\r\n const response = await retryIfServerError(() => fetch(endpoint, request));\r\n if (!response.ok) {\r\n throw await getErrorFromResponse('Delete Installation', response);\r\n }\r\n}\r\nfunction getDeleteEndpoint(appConfig, { fid }) {\r\n return `${getInstallationsEndpoint(appConfig)}/${fid}`;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Deletes the Firebase Installation and all associated data.\r\n * @param installations - The `Installations` instance.\r\n *\r\n * @public\r\n */\r\nasync function deleteInstallations(installations) {\r\n const { appConfig } = installations;\r\n const entry = await update(appConfig, oldEntry => {\r\n if (oldEntry && oldEntry.registrationStatus === 0 /* RequestStatus.NOT_STARTED */) {\r\n // Delete the unregistered entry without sending a deleteInstallation request.\r\n return undefined;\r\n }\r\n return oldEntry;\r\n });\r\n if (entry) {\r\n if (entry.registrationStatus === 1 /* RequestStatus.IN_PROGRESS */) {\r\n // Can't delete while trying to register.\r\n throw ERROR_FACTORY.create(\"delete-pending-registration\" /* ErrorCode.DELETE_PENDING_REGISTRATION */);\r\n }\r\n else if (entry.registrationStatus === 2 /* RequestStatus.COMPLETED */) {\r\n if (!navigator.onLine) {\r\n throw ERROR_FACTORY.create(\"app-offline\" /* ErrorCode.APP_OFFLINE */);\r\n }\r\n else {\r\n await deleteInstallationRequest(appConfig, entry);\r\n await remove(appConfig);\r\n }\r\n }\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Sets a new callback that will get called when Installation ID changes.\r\n * Returns an unsubscribe function that will remove the callback when called.\r\n * @param installations - The `Installations` instance.\r\n * @param callback - The callback function that is invoked when FID changes.\r\n * @returns A function that can be called to unsubscribe.\r\n *\r\n * @public\r\n */\r\nfunction onIdChange(installations, callback) {\r\n const { appConfig } = installations;\r\n addCallback(appConfig, callback);\r\n return () => {\r\n removeCallback(appConfig, callback);\r\n };\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Returns an instance of {@link Installations} associated with the given\r\n * {@link @firebase/app#FirebaseApp} instance.\r\n * @param app - The {@link @firebase/app#FirebaseApp} instance.\r\n *\r\n * @public\r\n */\r\nfunction getInstallations(app = getApp()) {\r\n const installationsImpl = _getProvider(app, 'installations').getImmediate();\r\n return installationsImpl;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction extractAppConfig(app) {\r\n if (!app || !app.options) {\r\n throw getMissingValueError('App Configuration');\r\n }\r\n if (!app.name) {\r\n throw getMissingValueError('App Name');\r\n }\r\n // Required app config keys\r\n const configKeys = [\r\n 'projectId',\r\n 'apiKey',\r\n 'appId'\r\n ];\r\n for (const keyName of configKeys) {\r\n if (!app.options[keyName]) {\r\n throw getMissingValueError(keyName);\r\n }\r\n }\r\n return {\r\n appName: app.name,\r\n projectId: app.options.projectId,\r\n apiKey: app.options.apiKey,\r\n appId: app.options.appId\r\n };\r\n}\r\nfunction getMissingValueError(valueName) {\r\n return ERROR_FACTORY.create(\"missing-app-config-values\" /* ErrorCode.MISSING_APP_CONFIG_VALUES */, {\r\n valueName\r\n });\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst INSTALLATIONS_NAME = 'installations';\r\nconst INSTALLATIONS_NAME_INTERNAL = 'installations-internal';\r\nconst publicFactory = (container) => {\r\n const app = container.getProvider('app').getImmediate();\r\n // Throws if app isn't configured properly.\r\n const appConfig = extractAppConfig(app);\r\n const heartbeatServiceProvider = _getProvider(app, 'heartbeat');\r\n const installationsImpl = {\r\n app,\r\n appConfig,\r\n heartbeatServiceProvider,\r\n _delete: () => Promise.resolve()\r\n };\r\n return installationsImpl;\r\n};\r\nconst internalFactory = (container) => {\r\n const app = container.getProvider('app').getImmediate();\r\n // Internal FIS instance relies on public FIS instance.\r\n const installations = _getProvider(app, INSTALLATIONS_NAME).getImmediate();\r\n const installationsInternal = {\r\n getId: () => getId(installations),\r\n getToken: (forceRefresh) => getToken(installations, forceRefresh)\r\n };\r\n return installationsInternal;\r\n};\r\nfunction registerInstallations() {\r\n _registerComponent(new Component(INSTALLATIONS_NAME, publicFactory, \"PUBLIC\" /* ComponentType.PUBLIC */));\r\n _registerComponent(new Component(INSTALLATIONS_NAME_INTERNAL, internalFactory, \"PRIVATE\" /* ComponentType.PRIVATE */));\r\n}\n\n/**\r\n * Firebase Installations\r\n *\r\n * @packageDocumentation\r\n */\r\nregisterInstallations();\r\nregisterVersion(name, version);\r\n// BUILD_TARGET will be replaced by values like esm5, esm2017, cjs5, etc during the compilation\r\nregisterVersion(name, version, 'esm2017');\n\nexport { deleteInstallations, getId, getInstallations, getToken, onIdChange };\n//# sourceMappingURL=index.esm2017.js.map\n","/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * A container for all of the Logger instances\r\n */\r\nconst instances = [];\r\n/**\r\n * The JS SDK supports 5 log levels and also allows a user the ability to\r\n * silence the logs altogether.\r\n *\r\n * The order is a follows:\r\n * DEBUG < VERBOSE < INFO < WARN < ERROR\r\n *\r\n * All of the log types above the current log level will be captured (i.e. if\r\n * you set the log level to `INFO`, errors will still be logged, but `DEBUG` and\r\n * `VERBOSE` logs will not)\r\n */\r\nvar LogLevel;\r\n(function (LogLevel) {\r\n LogLevel[LogLevel[\"DEBUG\"] = 0] = \"DEBUG\";\r\n LogLevel[LogLevel[\"VERBOSE\"] = 1] = \"VERBOSE\";\r\n LogLevel[LogLevel[\"INFO\"] = 2] = \"INFO\";\r\n LogLevel[LogLevel[\"WARN\"] = 3] = \"WARN\";\r\n LogLevel[LogLevel[\"ERROR\"] = 4] = \"ERROR\";\r\n LogLevel[LogLevel[\"SILENT\"] = 5] = \"SILENT\";\r\n})(LogLevel || (LogLevel = {}));\r\nconst levelStringToEnum = {\r\n 'debug': LogLevel.DEBUG,\r\n 'verbose': LogLevel.VERBOSE,\r\n 'info': LogLevel.INFO,\r\n 'warn': LogLevel.WARN,\r\n 'error': LogLevel.ERROR,\r\n 'silent': LogLevel.SILENT\r\n};\r\n/**\r\n * The default log level\r\n */\r\nconst defaultLogLevel = LogLevel.INFO;\r\n/**\r\n * By default, `console.debug` is not displayed in the developer console (in\r\n * chrome). To avoid forcing users to have to opt-in to these logs twice\r\n * (i.e. once for firebase, and once in the console), we are sending `DEBUG`\r\n * logs to the `console.log` function.\r\n */\r\nconst ConsoleMethod = {\r\n [LogLevel.DEBUG]: 'log',\r\n [LogLevel.VERBOSE]: 'log',\r\n [LogLevel.INFO]: 'info',\r\n [LogLevel.WARN]: 'warn',\r\n [LogLevel.ERROR]: 'error'\r\n};\r\n/**\r\n * The default log handler will forward DEBUG, VERBOSE, INFO, WARN, and ERROR\r\n * messages on to their corresponding console counterparts (if the log method\r\n * is supported by the current log level)\r\n */\r\nconst defaultLogHandler = (instance, logType, ...args) => {\r\n if (logType < instance.logLevel) {\r\n return;\r\n }\r\n const now = new Date().toISOString();\r\n const method = ConsoleMethod[logType];\r\n if (method) {\r\n console[method](`[${now}] ${instance.name}:`, ...args);\r\n }\r\n else {\r\n throw new Error(`Attempted to log a message with an invalid logType (value: ${logType})`);\r\n }\r\n};\r\nclass Logger {\r\n /**\r\n * Gives you an instance of a Logger to capture messages according to\r\n * Firebase's logging scheme.\r\n *\r\n * @param name The name that the logs will be associated with\r\n */\r\n constructor(name) {\r\n this.name = name;\r\n /**\r\n * The log level of the given Logger instance.\r\n */\r\n this._logLevel = defaultLogLevel;\r\n /**\r\n * The main (internal) log handler for the Logger instance.\r\n * Can be set to a new function in internal package code but not by user.\r\n */\r\n this._logHandler = defaultLogHandler;\r\n /**\r\n * The optional, additional, user-defined log handler for the Logger instance.\r\n */\r\n this._userLogHandler = null;\r\n /**\r\n * Capture the current instance for later use\r\n */\r\n instances.push(this);\r\n }\r\n get logLevel() {\r\n return this._logLevel;\r\n }\r\n set logLevel(val) {\r\n if (!(val in LogLevel)) {\r\n throw new TypeError(`Invalid value \"${val}\" assigned to \\`logLevel\\``);\r\n }\r\n this._logLevel = val;\r\n }\r\n // Workaround for setter/getter having to be the same type.\r\n setLogLevel(val) {\r\n this._logLevel = typeof val === 'string' ? levelStringToEnum[val] : val;\r\n }\r\n get logHandler() {\r\n return this._logHandler;\r\n }\r\n set logHandler(val) {\r\n if (typeof val !== 'function') {\r\n throw new TypeError('Value assigned to `logHandler` must be a function');\r\n }\r\n this._logHandler = val;\r\n }\r\n get userLogHandler() {\r\n return this._userLogHandler;\r\n }\r\n set userLogHandler(val) {\r\n this._userLogHandler = val;\r\n }\r\n /**\r\n * The functions below are all based on the `console` interface\r\n */\r\n debug(...args) {\r\n this._userLogHandler && this._userLogHandler(this, LogLevel.DEBUG, ...args);\r\n this._logHandler(this, LogLevel.DEBUG, ...args);\r\n }\r\n log(...args) {\r\n this._userLogHandler &&\r\n this._userLogHandler(this, LogLevel.VERBOSE, ...args);\r\n this._logHandler(this, LogLevel.VERBOSE, ...args);\r\n }\r\n info(...args) {\r\n this._userLogHandler && this._userLogHandler(this, LogLevel.INFO, ...args);\r\n this._logHandler(this, LogLevel.INFO, ...args);\r\n }\r\n warn(...args) {\r\n this._userLogHandler && this._userLogHandler(this, LogLevel.WARN, ...args);\r\n this._logHandler(this, LogLevel.WARN, ...args);\r\n }\r\n error(...args) {\r\n this._userLogHandler && this._userLogHandler(this, LogLevel.ERROR, ...args);\r\n this._logHandler(this, LogLevel.ERROR, ...args);\r\n }\r\n}\r\nfunction setLogLevel(level) {\r\n instances.forEach(inst => {\r\n inst.setLogLevel(level);\r\n });\r\n}\r\nfunction setUserLogHandler(logCallback, options) {\r\n for (const instance of instances) {\r\n let customLogLevel = null;\r\n if (options && options.level) {\r\n customLogLevel = levelStringToEnum[options.level];\r\n }\r\n if (logCallback === null) {\r\n instance.userLogHandler = null;\r\n }\r\n else {\r\n instance.userLogHandler = (instance, level, ...args) => {\r\n const message = args\r\n .map(arg => {\r\n if (arg == null) {\r\n return null;\r\n }\r\n else if (typeof arg === 'string') {\r\n return arg;\r\n }\r\n else if (typeof arg === 'number' || typeof arg === 'boolean') {\r\n return arg.toString();\r\n }\r\n else if (arg instanceof Error) {\r\n return arg.message;\r\n }\r\n else {\r\n try {\r\n return JSON.stringify(arg);\r\n }\r\n catch (ignored) {\r\n return null;\r\n }\r\n }\r\n })\r\n .filter(arg => arg)\r\n .join(' ');\r\n if (level >= (customLogLevel !== null && customLogLevel !== void 0 ? customLogLevel : instance.logLevel)) {\r\n logCallback({\r\n level: LogLevel[level].toLowerCase(),\r\n message,\r\n args,\r\n type: instance.name\r\n });\r\n }\r\n };\r\n }\r\n }\r\n}\n\nexport { LogLevel, Logger, setLogLevel, setUserLogHandler };\n//# sourceMappingURL=index.esm2017.js.map\n","import '@firebase/installations';\nimport { Component } from '@firebase/component';\nimport { openDB, deleteDB } from 'idb';\nimport { ErrorFactory, validateIndexedDBOpenable, isIndexedDBAvailable, areCookiesEnabled, getModularInstance } from '@firebase/util';\nimport { _registerComponent, registerVersion, _getProvider, getApp } from '@firebase/app';\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst DEFAULT_SW_PATH = '/firebase-messaging-sw.js';\r\nconst DEFAULT_SW_SCOPE = '/firebase-cloud-messaging-push-scope';\r\nconst DEFAULT_VAPID_KEY = 'BDOU99-h67HcA6JeFXHbSNMu7e2yNNu3RzoMj8TM4W88jITfq7ZmPvIM1Iv-4_l2LxQcYwhqby2xGpWwzjfAnG4';\r\nconst ENDPOINT = 'https://fcmregistrations.googleapis.com/v1';\r\nconst CONSOLE_CAMPAIGN_ID = 'google.c.a.c_id';\r\nconst CONSOLE_CAMPAIGN_NAME = 'google.c.a.c_l';\r\nconst CONSOLE_CAMPAIGN_TIME = 'google.c.a.ts';\r\n/** Set to '1' if Analytics is enabled for the campaign */\r\nconst CONSOLE_CAMPAIGN_ANALYTICS_ENABLED = 'google.c.a.e';\r\nvar MessageType$1;\r\n(function (MessageType) {\r\n MessageType[MessageType[\"DATA_MESSAGE\"] = 1] = \"DATA_MESSAGE\";\r\n MessageType[MessageType[\"DISPLAY_NOTIFICATION\"] = 3] = \"DISPLAY_NOTIFICATION\";\r\n})(MessageType$1 || (MessageType$1 = {}));\n\n/**\r\n * @license\r\n * Copyright 2018 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this file except\r\n * in compliance with the License. You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software distributed under the License\r\n * is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express\r\n * or implied. See the License for the specific language governing permissions and limitations under\r\n * the License.\r\n */\r\nvar MessageType;\r\n(function (MessageType) {\r\n MessageType[\"PUSH_RECEIVED\"] = \"push-received\";\r\n MessageType[\"NOTIFICATION_CLICKED\"] = \"notification-clicked\";\r\n})(MessageType || (MessageType = {}));\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction arrayToBase64(array) {\r\n const uint8Array = new Uint8Array(array);\r\n const base64String = btoa(String.fromCharCode(...uint8Array));\r\n return base64String.replace(/=/g, '').replace(/\\+/g, '-').replace(/\\//g, '_');\r\n}\r\nfunction base64ToArray(base64String) {\r\n const padding = '='.repeat((4 - (base64String.length % 4)) % 4);\r\n const base64 = (base64String + padding)\r\n .replace(/\\-/g, '+')\r\n .replace(/_/g, '/');\r\n const rawData = atob(base64);\r\n const outputArray = new Uint8Array(rawData.length);\r\n for (let i = 0; i < rawData.length; ++i) {\r\n outputArray[i] = rawData.charCodeAt(i);\r\n }\r\n return outputArray;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst OLD_DB_NAME = 'fcm_token_details_db';\r\n/**\r\n * The last DB version of 'fcm_token_details_db' was 4. This is one higher, so that the upgrade\r\n * callback is called for all versions of the old DB.\r\n */\r\nconst OLD_DB_VERSION = 5;\r\nconst OLD_OBJECT_STORE_NAME = 'fcm_token_object_Store';\r\nasync function migrateOldDatabase(senderId) {\r\n if ('databases' in indexedDB) {\r\n // indexedDb.databases() is an IndexedDB v3 API and does not exist in all browsers. TODO: Remove\r\n // typecast when it lands in TS types.\r\n const databases = await indexedDB.databases();\r\n const dbNames = databases.map(db => db.name);\r\n if (!dbNames.includes(OLD_DB_NAME)) {\r\n // old DB didn't exist, no need to open.\r\n return null;\r\n }\r\n }\r\n let tokenDetails = null;\r\n const db = await openDB(OLD_DB_NAME, OLD_DB_VERSION, {\r\n upgrade: async (db, oldVersion, newVersion, upgradeTransaction) => {\r\n var _a;\r\n if (oldVersion < 2) {\r\n // Database too old, skip migration.\r\n return;\r\n }\r\n if (!db.objectStoreNames.contains(OLD_OBJECT_STORE_NAME)) {\r\n // Database did not exist. Nothing to do.\r\n return;\r\n }\r\n const objectStore = upgradeTransaction.objectStore(OLD_OBJECT_STORE_NAME);\r\n const value = await objectStore.index('fcmSenderId').get(senderId);\r\n await objectStore.clear();\r\n if (!value) {\r\n // No entry in the database, nothing to migrate.\r\n return;\r\n }\r\n if (oldVersion === 2) {\r\n const oldDetails = value;\r\n if (!oldDetails.auth || !oldDetails.p256dh || !oldDetails.endpoint) {\r\n return;\r\n }\r\n tokenDetails = {\r\n token: oldDetails.fcmToken,\r\n createTime: (_a = oldDetails.createTime) !== null && _a !== void 0 ? _a : Date.now(),\r\n subscriptionOptions: {\r\n auth: oldDetails.auth,\r\n p256dh: oldDetails.p256dh,\r\n endpoint: oldDetails.endpoint,\r\n swScope: oldDetails.swScope,\r\n vapidKey: typeof oldDetails.vapidKey === 'string'\r\n ? oldDetails.vapidKey\r\n : arrayToBase64(oldDetails.vapidKey)\r\n }\r\n };\r\n }\r\n else if (oldVersion === 3) {\r\n const oldDetails = value;\r\n tokenDetails = {\r\n token: oldDetails.fcmToken,\r\n createTime: oldDetails.createTime,\r\n subscriptionOptions: {\r\n auth: arrayToBase64(oldDetails.auth),\r\n p256dh: arrayToBase64(oldDetails.p256dh),\r\n endpoint: oldDetails.endpoint,\r\n swScope: oldDetails.swScope,\r\n vapidKey: arrayToBase64(oldDetails.vapidKey)\r\n }\r\n };\r\n }\r\n else if (oldVersion === 4) {\r\n const oldDetails = value;\r\n tokenDetails = {\r\n token: oldDetails.fcmToken,\r\n createTime: oldDetails.createTime,\r\n subscriptionOptions: {\r\n auth: arrayToBase64(oldDetails.auth),\r\n p256dh: arrayToBase64(oldDetails.p256dh),\r\n endpoint: oldDetails.endpoint,\r\n swScope: oldDetails.swScope,\r\n vapidKey: arrayToBase64(oldDetails.vapidKey)\r\n }\r\n };\r\n }\r\n }\r\n });\r\n db.close();\r\n // Delete all old databases.\r\n await deleteDB(OLD_DB_NAME);\r\n await deleteDB('fcm_vapid_details_db');\r\n await deleteDB('undefined');\r\n return checkTokenDetails(tokenDetails) ? tokenDetails : null;\r\n}\r\nfunction checkTokenDetails(tokenDetails) {\r\n if (!tokenDetails || !tokenDetails.subscriptionOptions) {\r\n return false;\r\n }\r\n const { subscriptionOptions } = tokenDetails;\r\n return (typeof tokenDetails.createTime === 'number' &&\r\n tokenDetails.createTime > 0 &&\r\n typeof tokenDetails.token === 'string' &&\r\n tokenDetails.token.length > 0 &&\r\n typeof subscriptionOptions.auth === 'string' &&\r\n subscriptionOptions.auth.length > 0 &&\r\n typeof subscriptionOptions.p256dh === 'string' &&\r\n subscriptionOptions.p256dh.length > 0 &&\r\n typeof subscriptionOptions.endpoint === 'string' &&\r\n subscriptionOptions.endpoint.length > 0 &&\r\n typeof subscriptionOptions.swScope === 'string' &&\r\n subscriptionOptions.swScope.length > 0 &&\r\n typeof subscriptionOptions.vapidKey === 'string' &&\r\n subscriptionOptions.vapidKey.length > 0);\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n// Exported for tests.\r\nconst DATABASE_NAME = 'firebase-messaging-database';\r\nconst DATABASE_VERSION = 1;\r\nconst OBJECT_STORE_NAME = 'firebase-messaging-store';\r\nlet dbPromise = null;\r\nfunction getDbPromise() {\r\n if (!dbPromise) {\r\n dbPromise = openDB(DATABASE_NAME, DATABASE_VERSION, {\r\n upgrade: (upgradeDb, oldVersion) => {\r\n // We don't use 'break' in this switch statement, the fall-through behavior is what we want,\r\n // because if there are multiple versions between the old version and the current version, we\r\n // want ALL the migrations that correspond to those versions to run, not only the last one.\r\n // eslint-disable-next-line default-case\r\n switch (oldVersion) {\r\n case 0:\r\n upgradeDb.createObjectStore(OBJECT_STORE_NAME);\r\n }\r\n }\r\n });\r\n }\r\n return dbPromise;\r\n}\r\n/** Gets record(s) from the objectStore that match the given key. */\r\nasync function dbGet(firebaseDependencies) {\r\n const key = getKey(firebaseDependencies);\r\n const db = await getDbPromise();\r\n const tokenDetails = (await db\r\n .transaction(OBJECT_STORE_NAME)\r\n .objectStore(OBJECT_STORE_NAME)\r\n .get(key));\r\n if (tokenDetails) {\r\n return tokenDetails;\r\n }\r\n else {\r\n // Check if there is a tokenDetails object in the old DB.\r\n const oldTokenDetails = await migrateOldDatabase(firebaseDependencies.appConfig.senderId);\r\n if (oldTokenDetails) {\r\n await dbSet(firebaseDependencies, oldTokenDetails);\r\n return oldTokenDetails;\r\n }\r\n }\r\n}\r\n/** Assigns or overwrites the record for the given key with the given value. */\r\nasync function dbSet(firebaseDependencies, tokenDetails) {\r\n const key = getKey(firebaseDependencies);\r\n const db = await getDbPromise();\r\n const tx = db.transaction(OBJECT_STORE_NAME, 'readwrite');\r\n await tx.objectStore(OBJECT_STORE_NAME).put(tokenDetails, key);\r\n await tx.done;\r\n return tokenDetails;\r\n}\r\n/** Removes record(s) from the objectStore that match the given key. */\r\nasync function dbRemove(firebaseDependencies) {\r\n const key = getKey(firebaseDependencies);\r\n const db = await getDbPromise();\r\n const tx = db.transaction(OBJECT_STORE_NAME, 'readwrite');\r\n await tx.objectStore(OBJECT_STORE_NAME).delete(key);\r\n await tx.done;\r\n}\r\nfunction getKey({ appConfig }) {\r\n return appConfig.appId;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst ERROR_MAP = {\r\n [\"missing-app-config-values\" /* ErrorCode.MISSING_APP_CONFIG_VALUES */]: 'Missing App configuration value: \"{$valueName}\"',\r\n [\"only-available-in-window\" /* ErrorCode.AVAILABLE_IN_WINDOW */]: 'This method is available in a Window context.',\r\n [\"only-available-in-sw\" /* ErrorCode.AVAILABLE_IN_SW */]: 'This method is available in a service worker context.',\r\n [\"permission-default\" /* ErrorCode.PERMISSION_DEFAULT */]: 'The notification permission was not granted and dismissed instead.',\r\n [\"permission-blocked\" /* ErrorCode.PERMISSION_BLOCKED */]: 'The notification permission was not granted and blocked instead.',\r\n [\"unsupported-browser\" /* ErrorCode.UNSUPPORTED_BROWSER */]: \"This browser doesn't support the API's required to use the Firebase SDK.\",\r\n [\"indexed-db-unsupported\" /* ErrorCode.INDEXED_DB_UNSUPPORTED */]: \"This browser doesn't support indexedDb.open() (ex. Safari iFrame, Firefox Private Browsing, etc)\",\r\n [\"failed-service-worker-registration\" /* ErrorCode.FAILED_DEFAULT_REGISTRATION */]: 'We are unable to register the default service worker. {$browserErrorMessage}',\r\n [\"token-subscribe-failed\" /* ErrorCode.TOKEN_SUBSCRIBE_FAILED */]: 'A problem occurred while subscribing the user to FCM: {$errorInfo}',\r\n [\"token-subscribe-no-token\" /* ErrorCode.TOKEN_SUBSCRIBE_NO_TOKEN */]: 'FCM returned no token when subscribing the user to push.',\r\n [\"token-unsubscribe-failed\" /* ErrorCode.TOKEN_UNSUBSCRIBE_FAILED */]: 'A problem occurred while unsubscribing the ' +\r\n 'user from FCM: {$errorInfo}',\r\n [\"token-update-failed\" /* ErrorCode.TOKEN_UPDATE_FAILED */]: 'A problem occurred while updating the user from FCM: {$errorInfo}',\r\n [\"token-update-no-token\" /* ErrorCode.TOKEN_UPDATE_NO_TOKEN */]: 'FCM returned no token when updating the user to push.',\r\n [\"use-sw-after-get-token\" /* ErrorCode.USE_SW_AFTER_GET_TOKEN */]: 'The useServiceWorker() method may only be called once and must be ' +\r\n 'called before calling getToken() to ensure your service worker is used.',\r\n [\"invalid-sw-registration\" /* ErrorCode.INVALID_SW_REGISTRATION */]: 'The input to useServiceWorker() must be a ServiceWorkerRegistration.',\r\n [\"invalid-bg-handler\" /* ErrorCode.INVALID_BG_HANDLER */]: 'The input to setBackgroundMessageHandler() must be a function.',\r\n [\"invalid-vapid-key\" /* ErrorCode.INVALID_VAPID_KEY */]: 'The public VAPID key must be a string.',\r\n [\"use-vapid-key-after-get-token\" /* ErrorCode.USE_VAPID_KEY_AFTER_GET_TOKEN */]: 'The usePublicVapidKey() method may only be called once and must be ' +\r\n 'called before calling getToken() to ensure your VAPID key is used.'\r\n};\r\nconst ERROR_FACTORY = new ErrorFactory('messaging', 'Messaging', ERROR_MAP);\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nasync function requestGetToken(firebaseDependencies, subscriptionOptions) {\r\n const headers = await getHeaders(firebaseDependencies);\r\n const body = getBody(subscriptionOptions);\r\n const subscribeOptions = {\r\n method: 'POST',\r\n headers,\r\n body: JSON.stringify(body)\r\n };\r\n let responseData;\r\n try {\r\n const response = await fetch(getEndpoint(firebaseDependencies.appConfig), subscribeOptions);\r\n responseData = await response.json();\r\n }\r\n catch (err) {\r\n throw ERROR_FACTORY.create(\"token-subscribe-failed\" /* ErrorCode.TOKEN_SUBSCRIBE_FAILED */, {\r\n errorInfo: err === null || err === void 0 ? void 0 : err.toString()\r\n });\r\n }\r\n if (responseData.error) {\r\n const message = responseData.error.message;\r\n throw ERROR_FACTORY.create(\"token-subscribe-failed\" /* ErrorCode.TOKEN_SUBSCRIBE_FAILED */, {\r\n errorInfo: message\r\n });\r\n }\r\n if (!responseData.token) {\r\n throw ERROR_FACTORY.create(\"token-subscribe-no-token\" /* ErrorCode.TOKEN_SUBSCRIBE_NO_TOKEN */);\r\n }\r\n return responseData.token;\r\n}\r\nasync function requestUpdateToken(firebaseDependencies, tokenDetails) {\r\n const headers = await getHeaders(firebaseDependencies);\r\n const body = getBody(tokenDetails.subscriptionOptions);\r\n const updateOptions = {\r\n method: 'PATCH',\r\n headers,\r\n body: JSON.stringify(body)\r\n };\r\n let responseData;\r\n try {\r\n const response = await fetch(`${getEndpoint(firebaseDependencies.appConfig)}/${tokenDetails.token}`, updateOptions);\r\n responseData = await response.json();\r\n }\r\n catch (err) {\r\n throw ERROR_FACTORY.create(\"token-update-failed\" /* ErrorCode.TOKEN_UPDATE_FAILED */, {\r\n errorInfo: err === null || err === void 0 ? void 0 : err.toString()\r\n });\r\n }\r\n if (responseData.error) {\r\n const message = responseData.error.message;\r\n throw ERROR_FACTORY.create(\"token-update-failed\" /* ErrorCode.TOKEN_UPDATE_FAILED */, {\r\n errorInfo: message\r\n });\r\n }\r\n if (!responseData.token) {\r\n throw ERROR_FACTORY.create(\"token-update-no-token\" /* ErrorCode.TOKEN_UPDATE_NO_TOKEN */);\r\n }\r\n return responseData.token;\r\n}\r\nasync function requestDeleteToken(firebaseDependencies, token) {\r\n const headers = await getHeaders(firebaseDependencies);\r\n const unsubscribeOptions = {\r\n method: 'DELETE',\r\n headers\r\n };\r\n try {\r\n const response = await fetch(`${getEndpoint(firebaseDependencies.appConfig)}/${token}`, unsubscribeOptions);\r\n const responseData = await response.json();\r\n if (responseData.error) {\r\n const message = responseData.error.message;\r\n throw ERROR_FACTORY.create(\"token-unsubscribe-failed\" /* ErrorCode.TOKEN_UNSUBSCRIBE_FAILED */, {\r\n errorInfo: message\r\n });\r\n }\r\n }\r\n catch (err) {\r\n throw ERROR_FACTORY.create(\"token-unsubscribe-failed\" /* ErrorCode.TOKEN_UNSUBSCRIBE_FAILED */, {\r\n errorInfo: err === null || err === void 0 ? void 0 : err.toString()\r\n });\r\n }\r\n}\r\nfunction getEndpoint({ projectId }) {\r\n return `${ENDPOINT}/projects/${projectId}/registrations`;\r\n}\r\nasync function getHeaders({ appConfig, installations }) {\r\n const authToken = await installations.getToken();\r\n return new Headers({\r\n 'Content-Type': 'application/json',\r\n Accept: 'application/json',\r\n 'x-goog-api-key': appConfig.apiKey,\r\n 'x-goog-firebase-installations-auth': `FIS ${authToken}`\r\n });\r\n}\r\nfunction getBody({ p256dh, auth, endpoint, vapidKey }) {\r\n const body = {\r\n web: {\r\n endpoint,\r\n auth,\r\n p256dh\r\n }\r\n };\r\n if (vapidKey !== DEFAULT_VAPID_KEY) {\r\n body.web.applicationPubKey = vapidKey;\r\n }\r\n return body;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n// UpdateRegistration will be called once every week.\r\nconst TOKEN_EXPIRATION_MS = 7 * 24 * 60 * 60 * 1000; // 7 days\r\nasync function getTokenInternal(messaging) {\r\n const pushSubscription = await getPushSubscription(messaging.swRegistration, messaging.vapidKey);\r\n const subscriptionOptions = {\r\n vapidKey: messaging.vapidKey,\r\n swScope: messaging.swRegistration.scope,\r\n endpoint: pushSubscription.endpoint,\r\n auth: arrayToBase64(pushSubscription.getKey('auth')),\r\n p256dh: arrayToBase64(pushSubscription.getKey('p256dh'))\r\n };\r\n const tokenDetails = await dbGet(messaging.firebaseDependencies);\r\n if (!tokenDetails) {\r\n // No token, get a new one.\r\n return getNewToken(messaging.firebaseDependencies, subscriptionOptions);\r\n }\r\n else if (!isTokenValid(tokenDetails.subscriptionOptions, subscriptionOptions)) {\r\n // Invalid token, get a new one.\r\n try {\r\n await requestDeleteToken(messaging.firebaseDependencies, tokenDetails.token);\r\n }\r\n catch (e) {\r\n // Suppress errors because of #2364\r\n console.warn(e);\r\n }\r\n return getNewToken(messaging.firebaseDependencies, subscriptionOptions);\r\n }\r\n else if (Date.now() >= tokenDetails.createTime + TOKEN_EXPIRATION_MS) {\r\n // Weekly token refresh\r\n return updateToken(messaging, {\r\n token: tokenDetails.token,\r\n createTime: Date.now(),\r\n subscriptionOptions\r\n });\r\n }\r\n else {\r\n // Valid token, nothing to do.\r\n return tokenDetails.token;\r\n }\r\n}\r\n/**\r\n * This method deletes the token from the database, unsubscribes the token from FCM, and unregisters\r\n * the push subscription if it exists.\r\n */\r\nasync function deleteTokenInternal(messaging) {\r\n const tokenDetails = await dbGet(messaging.firebaseDependencies);\r\n if (tokenDetails) {\r\n await requestDeleteToken(messaging.firebaseDependencies, tokenDetails.token);\r\n await dbRemove(messaging.firebaseDependencies);\r\n }\r\n // Unsubscribe from the push subscription.\r\n const pushSubscription = await messaging.swRegistration.pushManager.getSubscription();\r\n if (pushSubscription) {\r\n return pushSubscription.unsubscribe();\r\n }\r\n // If there's no SW, consider it a success.\r\n return true;\r\n}\r\nasync function updateToken(messaging, tokenDetails) {\r\n try {\r\n const updatedToken = await requestUpdateToken(messaging.firebaseDependencies, tokenDetails);\r\n const updatedTokenDetails = Object.assign(Object.assign({}, tokenDetails), { token: updatedToken, createTime: Date.now() });\r\n await dbSet(messaging.firebaseDependencies, updatedTokenDetails);\r\n return updatedToken;\r\n }\r\n catch (e) {\r\n await deleteTokenInternal(messaging);\r\n throw e;\r\n }\r\n}\r\nasync function getNewToken(firebaseDependencies, subscriptionOptions) {\r\n const token = await requestGetToken(firebaseDependencies, subscriptionOptions);\r\n const tokenDetails = {\r\n token,\r\n createTime: Date.now(),\r\n subscriptionOptions\r\n };\r\n await dbSet(firebaseDependencies, tokenDetails);\r\n return tokenDetails.token;\r\n}\r\n/**\r\n * Gets a PushSubscription for the current user.\r\n */\r\nasync function getPushSubscription(swRegistration, vapidKey) {\r\n const subscription = await swRegistration.pushManager.getSubscription();\r\n if (subscription) {\r\n return subscription;\r\n }\r\n return swRegistration.pushManager.subscribe({\r\n userVisibleOnly: true,\r\n // Chrome <= 75 doesn't support base64-encoded VAPID key. For backward compatibility, VAPID key\r\n // submitted to pushManager#subscribe must be of type Uint8Array.\r\n applicationServerKey: base64ToArray(vapidKey)\r\n });\r\n}\r\n/**\r\n * Checks if the saved tokenDetails object matches the configuration provided.\r\n */\r\nfunction isTokenValid(dbOptions, currentOptions) {\r\n const isVapidKeyEqual = currentOptions.vapidKey === dbOptions.vapidKey;\r\n const isEndpointEqual = currentOptions.endpoint === dbOptions.endpoint;\r\n const isAuthEqual = currentOptions.auth === dbOptions.auth;\r\n const isP256dhEqual = currentOptions.p256dh === dbOptions.p256dh;\r\n return isVapidKeyEqual && isEndpointEqual && isAuthEqual && isP256dhEqual;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction externalizePayload(internalPayload) {\r\n const payload = {\r\n from: internalPayload.from,\r\n // eslint-disable-next-line camelcase\r\n collapseKey: internalPayload.collapse_key,\r\n // eslint-disable-next-line camelcase\r\n messageId: internalPayload.fcmMessageId\r\n };\r\n propagateNotificationPayload(payload, internalPayload);\r\n propagateDataPayload(payload, internalPayload);\r\n propagateFcmOptions(payload, internalPayload);\r\n return payload;\r\n}\r\nfunction propagateNotificationPayload(payload, messagePayloadInternal) {\r\n if (!messagePayloadInternal.notification) {\r\n return;\r\n }\r\n payload.notification = {};\r\n const title = messagePayloadInternal.notification.title;\r\n if (!!title) {\r\n payload.notification.title = title;\r\n }\r\n const body = messagePayloadInternal.notification.body;\r\n if (!!body) {\r\n payload.notification.body = body;\r\n }\r\n const image = messagePayloadInternal.notification.image;\r\n if (!!image) {\r\n payload.notification.image = image;\r\n }\r\n const icon = messagePayloadInternal.notification.icon;\r\n if (!!icon) {\r\n payload.notification.icon = icon;\r\n }\r\n}\r\nfunction propagateDataPayload(payload, messagePayloadInternal) {\r\n if (!messagePayloadInternal.data) {\r\n return;\r\n }\r\n payload.data = messagePayloadInternal.data;\r\n}\r\nfunction propagateFcmOptions(payload, messagePayloadInternal) {\r\n var _a, _b, _c, _d, _e;\r\n // fcmOptions.link value is written into notification.click_action. see more in b/232072111\r\n if (!messagePayloadInternal.fcmOptions &&\r\n !((_a = messagePayloadInternal.notification) === null || _a === void 0 ? void 0 : _a.click_action)) {\r\n return;\r\n }\r\n payload.fcmOptions = {};\r\n const link = (_c = (_b = messagePayloadInternal.fcmOptions) === null || _b === void 0 ? void 0 : _b.link) !== null && _c !== void 0 ? _c : (_d = messagePayloadInternal.notification) === null || _d === void 0 ? void 0 : _d.click_action;\r\n if (!!link) {\r\n payload.fcmOptions.link = link;\r\n }\r\n // eslint-disable-next-line camelcase\r\n const analyticsLabel = (_e = messagePayloadInternal.fcmOptions) === null || _e === void 0 ? void 0 : _e.analytics_label;\r\n if (!!analyticsLabel) {\r\n payload.fcmOptions.analyticsLabel = analyticsLabel;\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction isConsoleMessage(data) {\r\n // This message has a campaign ID, meaning it was sent using the Firebase Console.\r\n return typeof data === 'object' && !!data && CONSOLE_CAMPAIGN_ID in data;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n_mergeStrings('hts/frbslgigp.ogepscmv/ieo/eaylg', 'tp:/ieaeogn-agolai.o/1frlglgc/o');\r\n_mergeStrings('AzSCbw63g1R0nCw85jG8', 'Iaya3yLKwmgvh7cF0q4');\r\nfunction _mergeStrings(s1, s2) {\r\n const resultArray = [];\r\n for (let i = 0; i < s1.length; i++) {\r\n resultArray.push(s1.charAt(i));\r\n if (i < s2.length) {\r\n resultArray.push(s2.charAt(i));\r\n }\r\n }\r\n return resultArray.join('');\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction extractAppConfig(app) {\r\n if (!app || !app.options) {\r\n throw getMissingValueError('App Configuration Object');\r\n }\r\n if (!app.name) {\r\n throw getMissingValueError('App Name');\r\n }\r\n // Required app config keys\r\n const configKeys = [\r\n 'projectId',\r\n 'apiKey',\r\n 'appId',\r\n 'messagingSenderId'\r\n ];\r\n const { options } = app;\r\n for (const keyName of configKeys) {\r\n if (!options[keyName]) {\r\n throw getMissingValueError(keyName);\r\n }\r\n }\r\n return {\r\n appName: app.name,\r\n projectId: options.projectId,\r\n apiKey: options.apiKey,\r\n appId: options.appId,\r\n senderId: options.messagingSenderId\r\n };\r\n}\r\nfunction getMissingValueError(valueName) {\r\n return ERROR_FACTORY.create(\"missing-app-config-values\" /* ErrorCode.MISSING_APP_CONFIG_VALUES */, {\r\n valueName\r\n });\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nclass MessagingService {\r\n constructor(app, installations, analyticsProvider) {\r\n // logging is only done with end user consent. Default to false.\r\n this.deliveryMetricsExportedToBigQueryEnabled = false;\r\n this.onBackgroundMessageHandler = null;\r\n this.onMessageHandler = null;\r\n this.logEvents = [];\r\n this.isLogServiceStarted = false;\r\n const appConfig = extractAppConfig(app);\r\n this.firebaseDependencies = {\r\n app,\r\n appConfig,\r\n installations,\r\n analyticsProvider\r\n };\r\n }\r\n _delete() {\r\n return Promise.resolve();\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nasync function registerDefaultSw(messaging) {\r\n try {\r\n messaging.swRegistration = await navigator.serviceWorker.register(DEFAULT_SW_PATH, {\r\n scope: DEFAULT_SW_SCOPE\r\n });\r\n // The timing when browser updates sw when sw has an update is unreliable from experiment. It\r\n // leads to version conflict when the SDK upgrades to a newer version in the main page, but sw\r\n // is stuck with the old version. For example,\r\n // https://github.com/firebase/firebase-js-sdk/issues/2590 The following line reliably updates\r\n // sw if there was an update.\r\n messaging.swRegistration.update().catch(() => {\r\n /* it is non blocking and we don't care if it failed */\r\n });\r\n }\r\n catch (e) {\r\n throw ERROR_FACTORY.create(\"failed-service-worker-registration\" /* ErrorCode.FAILED_DEFAULT_REGISTRATION */, {\r\n browserErrorMessage: e === null || e === void 0 ? void 0 : e.message\r\n });\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nasync function updateSwReg(messaging, swRegistration) {\r\n if (!swRegistration && !messaging.swRegistration) {\r\n await registerDefaultSw(messaging);\r\n }\r\n if (!swRegistration && !!messaging.swRegistration) {\r\n return;\r\n }\r\n if (!(swRegistration instanceof ServiceWorkerRegistration)) {\r\n throw ERROR_FACTORY.create(\"invalid-sw-registration\" /* ErrorCode.INVALID_SW_REGISTRATION */);\r\n }\r\n messaging.swRegistration = swRegistration;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nasync function updateVapidKey(messaging, vapidKey) {\r\n if (!!vapidKey) {\r\n messaging.vapidKey = vapidKey;\r\n }\r\n else if (!messaging.vapidKey) {\r\n messaging.vapidKey = DEFAULT_VAPID_KEY;\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nasync function getToken$1(messaging, options) {\r\n if (!navigator) {\r\n throw ERROR_FACTORY.create(\"only-available-in-window\" /* ErrorCode.AVAILABLE_IN_WINDOW */);\r\n }\r\n if (Notification.permission === 'default') {\r\n await Notification.requestPermission();\r\n }\r\n if (Notification.permission !== 'granted') {\r\n throw ERROR_FACTORY.create(\"permission-blocked\" /* ErrorCode.PERMISSION_BLOCKED */);\r\n }\r\n await updateVapidKey(messaging, options === null || options === void 0 ? void 0 : options.vapidKey);\r\n await updateSwReg(messaging, options === null || options === void 0 ? void 0 : options.serviceWorkerRegistration);\r\n return getTokenInternal(messaging);\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nasync function logToScion(messaging, messageType, data) {\r\n const eventType = getEventType(messageType);\r\n const analytics = await messaging.firebaseDependencies.analyticsProvider.get();\r\n analytics.logEvent(eventType, {\r\n /* eslint-disable camelcase */\r\n message_id: data[CONSOLE_CAMPAIGN_ID],\r\n message_name: data[CONSOLE_CAMPAIGN_NAME],\r\n message_time: data[CONSOLE_CAMPAIGN_TIME],\r\n message_device_time: Math.floor(Date.now() / 1000)\r\n /* eslint-enable camelcase */\r\n });\r\n}\r\nfunction getEventType(messageType) {\r\n switch (messageType) {\r\n case MessageType.NOTIFICATION_CLICKED:\r\n return 'notification_open';\r\n case MessageType.PUSH_RECEIVED:\r\n return 'notification_foreground';\r\n default:\r\n throw new Error();\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nasync function messageEventListener(messaging, event) {\r\n const internalPayload = event.data;\r\n if (!internalPayload.isFirebaseMessaging) {\r\n return;\r\n }\r\n if (messaging.onMessageHandler &&\r\n internalPayload.messageType === MessageType.PUSH_RECEIVED) {\r\n if (typeof messaging.onMessageHandler === 'function') {\r\n messaging.onMessageHandler(externalizePayload(internalPayload));\r\n }\r\n else {\r\n messaging.onMessageHandler.next(externalizePayload(internalPayload));\r\n }\r\n }\r\n // Log to Scion if applicable\r\n const dataPayload = internalPayload.data;\r\n if (isConsoleMessage(dataPayload) &&\r\n dataPayload[CONSOLE_CAMPAIGN_ANALYTICS_ENABLED] === '1') {\r\n await logToScion(messaging, internalPayload.messageType, dataPayload);\r\n }\r\n}\n\nconst name = \"@firebase/messaging\";\nconst version = \"0.12.1\";\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst WindowMessagingFactory = (container) => {\r\n const messaging = new MessagingService(container.getProvider('app').getImmediate(), container.getProvider('installations-internal').getImmediate(), container.getProvider('analytics-internal'));\r\n navigator.serviceWorker.addEventListener('message', e => messageEventListener(messaging, e));\r\n return messaging;\r\n};\r\nconst WindowMessagingInternalFactory = (container) => {\r\n const messaging = container\r\n .getProvider('messaging')\r\n .getImmediate();\r\n const messagingInternal = {\r\n getToken: (options) => getToken$1(messaging, options)\r\n };\r\n return messagingInternal;\r\n};\r\nfunction registerMessagingInWindow() {\r\n _registerComponent(new Component('messaging', WindowMessagingFactory, \"PUBLIC\" /* ComponentType.PUBLIC */));\r\n _registerComponent(new Component('messaging-internal', WindowMessagingInternalFactory, \"PRIVATE\" /* ComponentType.PRIVATE */));\r\n registerVersion(name, version);\r\n // BUILD_TARGET will be replaced by values like esm5, esm2017, cjs5, etc during the compilation\r\n registerVersion(name, version, 'esm2017');\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Checks if all required APIs exist in the browser.\r\n * @returns a Promise that resolves to a boolean.\r\n *\r\n * @public\r\n */\r\nasync function isWindowSupported() {\r\n try {\r\n // This throws if open() is unsupported, so adding it to the conditional\r\n // statement below can cause an uncaught error.\r\n await validateIndexedDBOpenable();\r\n }\r\n catch (e) {\r\n return false;\r\n }\r\n // firebase-js-sdk/issues/2393 reveals that idb#open in Safari iframe and Firefox private browsing\r\n // might be prohibited to run. In these contexts, an error would be thrown during the messaging\r\n // instantiating phase, informing the developers to import/call isSupported for special handling.\r\n return (typeof window !== 'undefined' &&\r\n isIndexedDBAvailable() &&\r\n areCookiesEnabled() &&\r\n 'serviceWorker' in navigator &&\r\n 'PushManager' in window &&\r\n 'Notification' in window &&\r\n 'fetch' in window &&\r\n ServiceWorkerRegistration.prototype.hasOwnProperty('showNotification') &&\r\n PushSubscription.prototype.hasOwnProperty('getKey'));\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nasync function deleteToken$1(messaging) {\r\n if (!navigator) {\r\n throw ERROR_FACTORY.create(\"only-available-in-window\" /* ErrorCode.AVAILABLE_IN_WINDOW */);\r\n }\r\n if (!messaging.swRegistration) {\r\n await registerDefaultSw(messaging);\r\n }\r\n return deleteTokenInternal(messaging);\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction onMessage$1(messaging, nextOrObserver) {\r\n if (!navigator) {\r\n throw ERROR_FACTORY.create(\"only-available-in-window\" /* ErrorCode.AVAILABLE_IN_WINDOW */);\r\n }\r\n messaging.onMessageHandler = nextOrObserver;\r\n return () => {\r\n messaging.onMessageHandler = null;\r\n };\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Retrieves a Firebase Cloud Messaging instance.\r\n *\r\n * @returns The Firebase Cloud Messaging instance associated with the provided firebase app.\r\n *\r\n * @public\r\n */\r\nfunction getMessagingInWindow(app = getApp()) {\r\n // Conscious decision to make this async check non-blocking during the messaging instance\r\n // initialization phase for performance consideration. An error would be thrown latter for\r\n // developer's information. Developers can then choose to import and call `isSupported` for\r\n // special handling.\r\n isWindowSupported().then(isSupported => {\r\n // If `isWindowSupported()` resolved, but returned false.\r\n if (!isSupported) {\r\n throw ERROR_FACTORY.create(\"unsupported-browser\" /* ErrorCode.UNSUPPORTED_BROWSER */);\r\n }\r\n }, _ => {\r\n // If `isWindowSupported()` rejected.\r\n throw ERROR_FACTORY.create(\"indexed-db-unsupported\" /* ErrorCode.INDEXED_DB_UNSUPPORTED */);\r\n });\r\n return _getProvider(getModularInstance(app), 'messaging').getImmediate();\r\n}\r\n/**\r\n * Subscribes the {@link Messaging} instance to push notifications. Returns an Firebase Cloud\r\n * Messaging registration token that can be used to send push messages to that {@link Messaging}\r\n * instance.\r\n *\r\n * If a notification permission isn't already granted, this method asks the user for permission. The\r\n * returned promise rejects if the user does not allow the app to show notifications.\r\n *\r\n * @param messaging - The {@link Messaging} instance.\r\n * @param options - Provides an optional vapid key and an optinoal service worker registration\r\n *\r\n * @returns The promise resolves with an FCM registration token.\r\n *\r\n * @public\r\n */\r\nasync function getToken(messaging, options) {\r\n messaging = getModularInstance(messaging);\r\n return getToken$1(messaging, options);\r\n}\r\n/**\r\n * Deletes the registration token associated with this {@link Messaging} instance and unsubscribes\r\n * the {@link Messaging} instance from the push subscription.\r\n *\r\n * @param messaging - The {@link Messaging} instance.\r\n *\r\n * @returns The promise resolves when the token has been successfully deleted.\r\n *\r\n * @public\r\n */\r\nfunction deleteToken(messaging) {\r\n messaging = getModularInstance(messaging);\r\n return deleteToken$1(messaging);\r\n}\r\n/**\r\n * When a push message is received and the user is currently on a page for your origin, the\r\n * message is passed to the page and an `onMessage()` event is dispatched with the payload of\r\n * the push message.\r\n *\r\n *\r\n * @param messaging - The {@link Messaging} instance.\r\n * @param nextOrObserver - This function, or observer object with `next` defined,\r\n * is called when a message is received and the user is currently viewing your page.\r\n * @returns To stop listening for messages execute this returned function.\r\n *\r\n * @public\r\n */\r\nfunction onMessage(messaging, nextOrObserver) {\r\n messaging = getModularInstance(messaging);\r\n return onMessage$1(messaging, nextOrObserver);\r\n}\n\n/**\r\n * Firebase Cloud Messaging\r\n *\r\n * @packageDocumentation\r\n */\r\nregisterMessagingInWindow();\n\nexport { deleteToken, getMessagingInWindow as getMessaging, getToken, isWindowSupported as isSupported, onMessage };\n//# sourceMappingURL=index.esm2017.js.map\n","import { registerVersion } from '@firebase/app';\nexport * from '@firebase/app';\n\nvar name = \"firebase\";\nvar version = \"9.16.0\";\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nregisterVersion(name, version, 'app');\n//# sourceMappingURL=index.esm.js.map\n","export * from '@firebase/messaging';\n//# sourceMappingURL=index.esm.js.map\n","import { w as wrap, r as replaceTraps } from './wrap-idb-value.js';\nexport { u as unwrap, w as wrap } from './wrap-idb-value.js';\n\n/**\n * Open a database.\n *\n * @param name Name of the database.\n * @param version Schema version.\n * @param callbacks Additional callbacks.\n */\nfunction openDB(name, version, { blocked, upgrade, blocking, terminated } = {}) {\n const request = indexedDB.open(name, version);\n const openPromise = wrap(request);\n if (upgrade) {\n request.addEventListener('upgradeneeded', (event) => {\n upgrade(wrap(request.result), event.oldVersion, event.newVersion, wrap(request.transaction));\n });\n }\n if (blocked)\n request.addEventListener('blocked', () => blocked());\n openPromise\n .then((db) => {\n if (terminated)\n db.addEventListener('close', () => terminated());\n if (blocking)\n db.addEventListener('versionchange', () => blocking());\n })\n .catch(() => { });\n return openPromise;\n}\n/**\n * Delete a database.\n *\n * @param name Name of the database.\n */\nfunction deleteDB(name, { blocked } = {}) {\n const request = indexedDB.deleteDatabase(name);\n if (blocked)\n request.addEventListener('blocked', () => blocked());\n return wrap(request).then(() => undefined);\n}\n\nconst readMethods = ['get', 'getKey', 'getAll', 'getAllKeys', 'count'];\nconst writeMethods = ['put', 'add', 'delete', 'clear'];\nconst cachedMethods = new Map();\nfunction getMethod(target, prop) {\n if (!(target instanceof IDBDatabase &&\n !(prop in target) &&\n typeof prop === 'string')) {\n return;\n }\n if (cachedMethods.get(prop))\n return cachedMethods.get(prop);\n const targetFuncName = prop.replace(/FromIndex$/, '');\n const useIndex = prop !== targetFuncName;\n const isWrite = writeMethods.includes(targetFuncName);\n if (\n // Bail if the target doesn't exist on the target. Eg, getAll isn't in Edge.\n !(targetFuncName in (useIndex ? IDBIndex : IDBObjectStore).prototype) ||\n !(isWrite || readMethods.includes(targetFuncName))) {\n return;\n }\n const method = async function (storeName, ...args) {\n // isWrite ? 'readwrite' : undefined gzipps better, but fails in Edge :(\n const tx = this.transaction(storeName, isWrite ? 'readwrite' : 'readonly');\n let target = tx.store;\n if (useIndex)\n target = target.index(args.shift());\n // Must reject if op rejects.\n // If it's a write operation, must reject if tx.done rejects.\n // Must reject with op rejection first.\n // Must resolve with op value.\n // Must handle both promises (no unhandled rejections)\n return (await Promise.all([\n target[targetFuncName](...args),\n isWrite && tx.done,\n ]))[0];\n };\n cachedMethods.set(prop, method);\n return method;\n}\nreplaceTraps((oldTraps) => ({\n ...oldTraps,\n get: (target, prop, receiver) => getMethod(target, prop) || oldTraps.get(target, prop, receiver),\n has: (target, prop) => !!getMethod(target, prop) || oldTraps.has(target, prop),\n}));\n\nexport { deleteDB, openDB };\n","const instanceOfAny = (object, constructors) => constructors.some((c) => object instanceof c);\n\nlet idbProxyableTypes;\nlet cursorAdvanceMethods;\n// This is a function to prevent it throwing up in node environments.\nfunction getIdbProxyableTypes() {\n return (idbProxyableTypes ||\n (idbProxyableTypes = [\n IDBDatabase,\n IDBObjectStore,\n IDBIndex,\n IDBCursor,\n IDBTransaction,\n ]));\n}\n// This is a function to prevent it throwing up in node environments.\nfunction getCursorAdvanceMethods() {\n return (cursorAdvanceMethods ||\n (cursorAdvanceMethods = [\n IDBCursor.prototype.advance,\n IDBCursor.prototype.continue,\n IDBCursor.prototype.continuePrimaryKey,\n ]));\n}\nconst cursorRequestMap = new WeakMap();\nconst transactionDoneMap = new WeakMap();\nconst transactionStoreNamesMap = new WeakMap();\nconst transformCache = new WeakMap();\nconst reverseTransformCache = new WeakMap();\nfunction promisifyRequest(request) {\n const promise = new Promise((resolve, reject) => {\n const unlisten = () => {\n request.removeEventListener('success', success);\n request.removeEventListener('error', error);\n };\n const success = () => {\n resolve(wrap(request.result));\n unlisten();\n };\n const error = () => {\n reject(request.error);\n unlisten();\n };\n request.addEventListener('success', success);\n request.addEventListener('error', error);\n });\n promise\n .then((value) => {\n // Since cursoring reuses the IDBRequest (*sigh*), we cache it for later retrieval\n // (see wrapFunction).\n if (value instanceof IDBCursor) {\n cursorRequestMap.set(value, request);\n }\n // Catching to avoid \"Uncaught Promise exceptions\"\n })\n .catch(() => { });\n // This mapping exists in reverseTransformCache but doesn't doesn't exist in transformCache. This\n // is because we create many promises from a single IDBRequest.\n reverseTransformCache.set(promise, request);\n return promise;\n}\nfunction cacheDonePromiseForTransaction(tx) {\n // Early bail if we've already created a done promise for this transaction.\n if (transactionDoneMap.has(tx))\n return;\n const done = new Promise((resolve, reject) => {\n const unlisten = () => {\n tx.removeEventListener('complete', complete);\n tx.removeEventListener('error', error);\n tx.removeEventListener('abort', error);\n };\n const complete = () => {\n resolve();\n unlisten();\n };\n const error = () => {\n reject(tx.error || new DOMException('AbortError', 'AbortError'));\n unlisten();\n };\n tx.addEventListener('complete', complete);\n tx.addEventListener('error', error);\n tx.addEventListener('abort', error);\n });\n // Cache it for later retrieval.\n transactionDoneMap.set(tx, done);\n}\nlet idbProxyTraps = {\n get(target, prop, receiver) {\n if (target instanceof IDBTransaction) {\n // Special handling for transaction.done.\n if (prop === 'done')\n return transactionDoneMap.get(target);\n // Polyfill for objectStoreNames because of Edge.\n if (prop === 'objectStoreNames') {\n return target.objectStoreNames || transactionStoreNamesMap.get(target);\n }\n // Make tx.store return the only store in the transaction, or undefined if there are many.\n if (prop === 'store') {\n return receiver.objectStoreNames[1]\n ? undefined\n : receiver.objectStore(receiver.objectStoreNames[0]);\n }\n }\n // Else transform whatever we get back.\n return wrap(target[prop]);\n },\n set(target, prop, value) {\n target[prop] = value;\n return true;\n },\n has(target, prop) {\n if (target instanceof IDBTransaction &&\n (prop === 'done' || prop === 'store')) {\n return true;\n }\n return prop in target;\n },\n};\nfunction replaceTraps(callback) {\n idbProxyTraps = callback(idbProxyTraps);\n}\nfunction wrapFunction(func) {\n // Due to expected object equality (which is enforced by the caching in `wrap`), we\n // only create one new func per func.\n // Edge doesn't support objectStoreNames (booo), so we polyfill it here.\n if (func === IDBDatabase.prototype.transaction &&\n !('objectStoreNames' in IDBTransaction.prototype)) {\n return function (storeNames, ...args) {\n const tx = func.call(unwrap(this), storeNames, ...args);\n transactionStoreNamesMap.set(tx, storeNames.sort ? storeNames.sort() : [storeNames]);\n return wrap(tx);\n };\n }\n // Cursor methods are special, as the behaviour is a little more different to standard IDB. In\n // IDB, you advance the cursor and wait for a new 'success' on the IDBRequest that gave you the\n // cursor. It's kinda like a promise that can resolve with many values. That doesn't make sense\n // with real promises, so each advance methods returns a new promise for the cursor object, or\n // undefined if the end of the cursor has been reached.\n if (getCursorAdvanceMethods().includes(func)) {\n return function (...args) {\n // Calling the original function with the proxy as 'this' causes ILLEGAL INVOCATION, so we use\n // the original object.\n func.apply(unwrap(this), args);\n return wrap(cursorRequestMap.get(this));\n };\n }\n return function (...args) {\n // Calling the original function with the proxy as 'this' causes ILLEGAL INVOCATION, so we use\n // the original object.\n return wrap(func.apply(unwrap(this), args));\n };\n}\nfunction transformCachableValue(value) {\n if (typeof value === 'function')\n return wrapFunction(value);\n // This doesn't return, it just creates a 'done' promise for the transaction,\n // which is later returned for transaction.done (see idbObjectHandler).\n if (value instanceof IDBTransaction)\n cacheDonePromiseForTransaction(value);\n if (instanceOfAny(value, getIdbProxyableTypes()))\n return new Proxy(value, idbProxyTraps);\n // Return the same value back if we're not going to transform it.\n return value;\n}\nfunction wrap(value) {\n // We sometimes generate multiple promises from a single IDBRequest (eg when cursoring), because\n // IDB is weird and a single IDBRequest can yield many responses, so these can't be cached.\n if (value instanceof IDBRequest)\n return promisifyRequest(value);\n // If we've already transformed this value before, reuse the transformed value.\n // This is faster, but it also provides object equality.\n if (transformCache.has(value))\n return transformCache.get(value);\n const newValue = transformCachableValue(value);\n // Not all types are transformed.\n // These may be primitive types, so they can't be WeakMap keys.\n if (newValue !== value) {\n transformCache.set(value, newValue);\n reverseTransformCache.set(newValue, value);\n }\n return newValue;\n}\nconst unwrap = (value) => reverseTransformCache.get(value);\n\nexport { reverseTransformCache as a, instanceOfAny as i, replaceTraps as r, unwrap as u, wrap as w };\n","function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, \"prototype\", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } else if (call !== void 0) { throw new TypeError(\"Derived constructors may only return object or undefined\"); } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _wrapNativeSuper(Class) { var _cache = typeof Map === \"function\" ? new Map() : undefined; _wrapNativeSuper = function _wrapNativeSuper(Class) { if (Class === null || !_isNativeFunction(Class)) return Class; if (typeof Class !== \"function\") { throw new TypeError(\"Super expression must either be null or a function\"); } if (typeof _cache !== \"undefined\") { if (_cache.has(Class)) return _cache.get(Class); _cache.set(Class, Wrapper); } function Wrapper() { return _construct(Class, arguments, _getPrototypeOf(this).constructor); } Wrapper.prototype = Object.create(Class.prototype, { constructor: { value: Wrapper, enumerable: false, writable: true, configurable: true } }); return _setPrototypeOf(Wrapper, Class); }; return _wrapNativeSuper(Class); }\n\nfunction _construct(Parent, args, Class) { if (_isNativeReflectConstruct()) { _construct = Reflect.construct; } else { _construct = function _construct(Parent, args, Class) { var a = [null]; a.push.apply(a, args); var Constructor = Function.bind.apply(Parent, a); var instance = new Constructor(); if (Class) _setPrototypeOf(instance, Class.prototype); return instance; }; } return _construct.apply(null, arguments); }\n\nfunction _isNativeReflectConstruct() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }\n\nfunction _isNativeFunction(fn) { return Function.toString.call(fn).indexOf(\"[native code]\") !== -1; }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\n// https://stackoverflow.com/a/46971044/970769\n// \"Breaking changes in Typescript 2.1\"\n// \"Extending built-ins like Error, Array, and Map may no longer work.\"\n// \"As a recommendation, you can manually adjust the prototype immediately after any super(...) calls.\"\n// https://github.com/Microsoft/TypeScript-wiki/blob/main/Breaking-Changes.md#extending-built-ins-like-error-array-and-map-may-no-longer-work\nvar ParseError = /*#__PURE__*/function (_Error) {\n _inherits(ParseError, _Error);\n\n var _super = _createSuper(ParseError);\n\n function ParseError(code) {\n var _this;\n\n _classCallCheck(this, ParseError);\n\n _this = _super.call(this, code); // Set the prototype explicitly.\n // Any subclass of FooError will have to manually set the prototype as well.\n\n Object.setPrototypeOf(_assertThisInitialized(_this), ParseError.prototype);\n _this.name = _this.constructor.name;\n return _this;\n }\n\n return _createClass(ParseError);\n}( /*#__PURE__*/_wrapNativeSuper(Error));\n\nexport { ParseError as default };\n//# sourceMappingURL=ParseError.js.map","function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\nimport Metadata from './metadata.js';\nimport isPossibleNumber from './isPossibleNumber_.js';\nimport isValidNumber from './validate_.js';\nimport isValidNumberForRegion from './isValidNumberForRegion_.js';\nimport getNumberType from './helpers/getNumberType.js';\nimport getPossibleCountriesForNumber from './helpers/getPossibleCountriesForNumber.js';\nimport formatNumber from './format_.js';\nvar USE_NON_GEOGRAPHIC_COUNTRY_CODE = false;\n\nvar PhoneNumber = /*#__PURE__*/function () {\n function PhoneNumber(countryCallingCode, nationalNumber, metadata) {\n _classCallCheck(this, PhoneNumber);\n\n if (!countryCallingCode) {\n throw new TypeError('`country` or `countryCallingCode` not passed');\n }\n\n if (!nationalNumber) {\n throw new TypeError('`nationalNumber` not passed');\n }\n\n if (!metadata) {\n throw new TypeError('`metadata` not passed');\n }\n\n var _metadata = new Metadata(metadata); // If country code is passed then derive `countryCallingCode` from it.\n // Also store the country code as `.country`.\n\n\n if (isCountryCode(countryCallingCode)) {\n this.country = countryCallingCode;\n\n _metadata.country(countryCallingCode);\n\n countryCallingCode = _metadata.countryCallingCode();\n } else {\n /* istanbul ignore if */\n if (USE_NON_GEOGRAPHIC_COUNTRY_CODE) {\n if (_metadata.isNonGeographicCallingCode(countryCallingCode)) {\n this.country = '001';\n }\n }\n }\n\n this.countryCallingCode = countryCallingCode;\n this.nationalNumber = nationalNumber;\n this.number = '+' + this.countryCallingCode + this.nationalNumber;\n this.metadata = metadata;\n }\n\n _createClass(PhoneNumber, [{\n key: \"setExt\",\n value: function setExt(ext) {\n this.ext = ext;\n }\n }, {\n key: \"getPossibleCountries\",\n value: function getPossibleCountries() {\n if (this.country) {\n return [this.country];\n }\n\n return getPossibleCountriesForNumber(this.countryCallingCode, this.nationalNumber, this.metadata);\n }\n }, {\n key: \"isPossible\",\n value: function isPossible() {\n return isPossibleNumber(this, {\n v2: true\n }, this.metadata);\n }\n }, {\n key: \"isValid\",\n value: function isValid() {\n return isValidNumber(this, {\n v2: true\n }, this.metadata);\n }\n }, {\n key: \"isNonGeographic\",\n value: function isNonGeographic() {\n var metadata = new Metadata(this.metadata);\n return metadata.isNonGeographicCallingCode(this.countryCallingCode);\n }\n }, {\n key: \"isEqual\",\n value: function isEqual(phoneNumber) {\n return this.number === phoneNumber.number && this.ext === phoneNumber.ext;\n } // // Is just an alias for `this.isValid() && this.country === country`.\n // // https://github.com/googlei18n/libphonenumber/blob/master/FAQ.md#when-should-i-use-isvalidnumberforregion\n // isValidForRegion(country) {\n // \treturn isValidNumberForRegion(this, country, { v2: true }, this.metadata)\n // }\n\n }, {\n key: \"getType\",\n value: function getType() {\n return getNumberType(this, {\n v2: true\n }, this.metadata);\n }\n }, {\n key: \"format\",\n value: function format(_format, options) {\n return formatNumber(this, _format, options ? _objectSpread(_objectSpread({}, options), {}, {\n v2: true\n }) : {\n v2: true\n }, this.metadata);\n }\n }, {\n key: \"formatNational\",\n value: function formatNational(options) {\n return this.format('NATIONAL', options);\n }\n }, {\n key: \"formatInternational\",\n value: function formatInternational(options) {\n return this.format('INTERNATIONAL', options);\n }\n }, {\n key: \"getURI\",\n value: function getURI(options) {\n return this.format('RFC3966', options);\n }\n }]);\n\n return PhoneNumber;\n}();\n\nexport { PhoneNumber as default };\n\nvar isCountryCode = function isCountryCode(value) {\n return /^[A-Z]{2}$/.test(value);\n};\n//# sourceMappingURL=PhoneNumber.js.map","// The minimum length of the national significant number.\nexport var MIN_LENGTH_FOR_NSN = 2; // The ITU says the maximum length should be 15,\n// but one can find longer numbers in Germany.\n\nexport var MAX_LENGTH_FOR_NSN = 17; // The maximum length of the country calling code.\n\nexport var MAX_LENGTH_COUNTRY_CODE = 3; // Digits accepted in phone numbers\n// (ascii, fullwidth, arabic-indic, and eastern arabic digits).\n\nexport var VALID_DIGITS = \"0-9\\uFF10-\\uFF19\\u0660-\\u0669\\u06F0-\\u06F9\"; // `DASHES` will be right after the opening square bracket of the \"character class\"\n\nvar DASHES = \"-\\u2010-\\u2015\\u2212\\u30FC\\uFF0D\";\nvar SLASHES = \"\\uFF0F/\";\nvar DOTS = \"\\uFF0E.\";\nexport var WHITESPACE = \" \\xA0\\xAD\\u200B\\u2060\\u3000\";\nvar BRACKETS = \"()\\uFF08\\uFF09\\uFF3B\\uFF3D\\\\[\\\\]\"; // export const OPENING_BRACKETS = '(\\uFF08\\uFF3B\\\\\\['\n\nvar TILDES = \"~\\u2053\\u223C\\uFF5E\"; // Regular expression of acceptable punctuation found in phone numbers. This\n// excludes punctuation found as a leading character only. This consists of dash\n// characters, white space characters, full stops, slashes, square brackets,\n// parentheses and tildes. Full-width variants are also present.\n\nexport var VALID_PUNCTUATION = \"\".concat(DASHES).concat(SLASHES).concat(DOTS).concat(WHITESPACE).concat(BRACKETS).concat(TILDES);\nexport var PLUS_CHARS = \"+\\uFF0B\"; // const LEADING_PLUS_CHARS_PATTERN = new RegExp('^[' + PLUS_CHARS + ']+')\n//# sourceMappingURL=constants.js.map","function _createForOfIteratorHelperLoose(o, allowArrayLike) { var it = typeof Symbol !== \"undefined\" && o[Symbol.iterator] || o[\"@@iterator\"]; if (it) return (it = it.call(o)).next.bind(it); if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") { if (it) o = it; var i = 0; return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\n\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\n\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n// This is a port of Google Android `libphonenumber`'s\n// `phonenumberutil.js` of December 31th, 2018.\n//\n// https://github.com/googlei18n/libphonenumber/commits/master/javascript/i18n/phonenumbers/phonenumberutil.js\nimport matchesEntirely from './helpers/matchesEntirely.js';\nimport formatNationalNumberUsingFormat from './helpers/formatNationalNumberUsingFormat.js';\nimport Metadata, { getCountryCallingCode } from './metadata.js';\nimport getIddPrefix from './helpers/getIddPrefix.js';\nimport { formatRFC3966 } from './helpers/RFC3966.js';\nvar DEFAULT_OPTIONS = {\n formatExtension: function formatExtension(formattedNumber, extension, metadata) {\n return \"\".concat(formattedNumber).concat(metadata.ext()).concat(extension);\n }\n}; // Formats a phone number\n//\n// Example use cases:\n//\n// ```js\n// formatNumber('8005553535', 'RU', 'INTERNATIONAL')\n// formatNumber('8005553535', 'RU', 'INTERNATIONAL', metadata)\n// formatNumber({ phone: '8005553535', country: 'RU' }, 'INTERNATIONAL')\n// formatNumber({ phone: '8005553535', country: 'RU' }, 'INTERNATIONAL', metadata)\n// formatNumber('+78005553535', 'NATIONAL')\n// formatNumber('+78005553535', 'NATIONAL', metadata)\n// ```\n//\n\nexport default function formatNumber(input, format, options, metadata) {\n // Apply default options.\n if (options) {\n options = _objectSpread(_objectSpread({}, DEFAULT_OPTIONS), options);\n } else {\n options = DEFAULT_OPTIONS;\n }\n\n metadata = new Metadata(metadata);\n\n if (input.country && input.country !== '001') {\n // Validate `input.country`.\n if (!metadata.hasCountry(input.country)) {\n throw new Error(\"Unknown country: \".concat(input.country));\n }\n\n metadata.country(input.country);\n } else if (input.countryCallingCode) {\n metadata.selectNumberingPlan(input.countryCallingCode);\n } else return input.phone || '';\n\n var countryCallingCode = metadata.countryCallingCode();\n var nationalNumber = options.v2 ? input.nationalNumber : input.phone; // This variable should have been declared inside `case`s\n // but Babel has a bug and it says \"duplicate variable declaration\".\n\n var number;\n\n switch (format) {\n case 'NATIONAL':\n // Legacy argument support.\n // (`{ country: ..., phone: '' }`)\n if (!nationalNumber) {\n return '';\n }\n\n number = formatNationalNumber(nationalNumber, input.carrierCode, 'NATIONAL', metadata, options);\n return addExtension(number, input.ext, metadata, options.formatExtension);\n\n case 'INTERNATIONAL':\n // Legacy argument support.\n // (`{ country: ..., phone: '' }`)\n if (!nationalNumber) {\n return \"+\".concat(countryCallingCode);\n }\n\n number = formatNationalNumber(nationalNumber, null, 'INTERNATIONAL', metadata, options);\n number = \"+\".concat(countryCallingCode, \" \").concat(number);\n return addExtension(number, input.ext, metadata, options.formatExtension);\n\n case 'E.164':\n // `E.164` doesn't define \"phone number extensions\".\n return \"+\".concat(countryCallingCode).concat(nationalNumber);\n\n case 'RFC3966':\n return formatRFC3966({\n number: \"+\".concat(countryCallingCode).concat(nationalNumber),\n ext: input.ext\n });\n // For reference, here's Google's IDD formatter:\n // https://github.com/google/libphonenumber/blob/32719cf74e68796788d1ca45abc85dcdc63ba5b9/java/libphonenumber/src/com/google/i18n/phonenumbers/PhoneNumberUtil.java#L1546\n // Not saying that this IDD formatter replicates it 1:1, but it seems to work.\n // Who would even need to format phone numbers in IDD format anyway?\n\n case 'IDD':\n if (!options.fromCountry) {\n return; // throw new Error('`fromCountry` option not passed for IDD-prefixed formatting.')\n }\n\n var formattedNumber = formatIDD(nationalNumber, input.carrierCode, countryCallingCode, options.fromCountry, metadata);\n return addExtension(formattedNumber, input.ext, metadata, options.formatExtension);\n\n default:\n throw new Error(\"Unknown \\\"format\\\" argument passed to \\\"formatNumber()\\\": \\\"\".concat(format, \"\\\"\"));\n }\n}\n\nfunction formatNationalNumber(number, carrierCode, formatAs, metadata, options) {\n var format = chooseFormatForNumber(metadata.formats(), number);\n\n if (!format) {\n return number;\n }\n\n return formatNationalNumberUsingFormat(number, format, {\n useInternationalFormat: formatAs === 'INTERNATIONAL',\n withNationalPrefix: format.nationalPrefixIsOptionalWhenFormattingInNationalFormat() && options && options.nationalPrefix === false ? false : true,\n carrierCode: carrierCode,\n metadata: metadata\n });\n}\n\nfunction chooseFormatForNumber(availableFormats, nationalNnumber) {\n for (var _iterator = _createForOfIteratorHelperLoose(availableFormats), _step; !(_step = _iterator()).done;) {\n var format = _step.value;\n\n // Validate leading digits.\n // The test case for \"else path\" could be found by searching for\n // \"format.leadingDigitsPatterns().length === 0\".\n if (format.leadingDigitsPatterns().length > 0) {\n // The last leading_digits_pattern is used here, as it is the most detailed\n var lastLeadingDigitsPattern = format.leadingDigitsPatterns()[format.leadingDigitsPatterns().length - 1]; // If leading digits don't match then move on to the next phone number format\n\n if (nationalNnumber.search(lastLeadingDigitsPattern) !== 0) {\n continue;\n }\n } // Check that the national number matches the phone number format regular expression\n\n\n if (matchesEntirely(nationalNnumber, format.pattern())) {\n return format;\n }\n }\n}\n\nfunction addExtension(formattedNumber, ext, metadata, formatExtension) {\n return ext ? formatExtension(formattedNumber, ext, metadata) : formattedNumber;\n}\n\nfunction formatIDD(nationalNumber, carrierCode, countryCallingCode, fromCountry, metadata) {\n var fromCountryCallingCode = getCountryCallingCode(fromCountry, metadata.metadata); // When calling within the same country calling code.\n\n if (fromCountryCallingCode === countryCallingCode) {\n var formattedNumber = formatNationalNumber(nationalNumber, carrierCode, 'NATIONAL', metadata); // For NANPA regions, return the national format for these regions\n // but prefix it with the country calling code.\n\n if (countryCallingCode === '1') {\n return countryCallingCode + ' ' + formattedNumber;\n } // If regions share a country calling code, the country calling code need\n // not be dialled. This also applies when dialling within a region, so this\n // if clause covers both these cases. Technically this is the case for\n // dialling from La Reunion to other overseas departments of France (French\n // Guiana, Martinique, Guadeloupe), but not vice versa - so we don't cover\n // this edge case for now and for those cases return the version including\n // country calling code. Details here:\n // http://www.petitfute.com/voyage/225-info-pratiques-reunion\n //\n\n\n return formattedNumber;\n }\n\n var iddPrefix = getIddPrefix(fromCountry, undefined, metadata.metadata);\n\n if (iddPrefix) {\n return \"\".concat(iddPrefix, \" \").concat(countryCallingCode, \" \").concat(formatNationalNumber(nationalNumber, null, 'INTERNATIONAL', metadata));\n }\n}\n//# sourceMappingURL=format_.js.map","import PhoneNumber from './PhoneNumber.js';\nexport default function getExampleNumber(country, examples, metadata) {\n if (examples[country]) {\n return new PhoneNumber(country, examples[country], metadata);\n }\n}\n//# sourceMappingURL=getExampleNumber.js.map","function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }\n\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\n\nfunction _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== \"undefined\" && arr[Symbol.iterator] || arr[\"@@iterator\"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"] != null) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; }\n\nfunction _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }\n\nfunction _createForOfIteratorHelperLoose(o, allowArrayLike) { var it = typeof Symbol !== \"undefined\" && o[Symbol.iterator] || o[\"@@iterator\"]; if (it) return (it = it.call(o)).next.bind(it); if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") { if (it) o = it; var i = 0; return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\n\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\n\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n\nimport isViablePhoneNumber from './isViablePhoneNumber.js'; // https://www.ietf.org/rfc/rfc3966.txt\n\n/**\r\n * @param {string} text - Phone URI (RFC 3966).\r\n * @return {object} `{ ?number, ?ext }`.\r\n */\n\nexport function parseRFC3966(text) {\n var number;\n var ext; // Replace \"tel:\" with \"tel=\" for parsing convenience.\n\n text = text.replace(/^tel:/, 'tel=');\n\n for (var _iterator = _createForOfIteratorHelperLoose(text.split(';')), _step; !(_step = _iterator()).done;) {\n var part = _step.value;\n\n var _part$split = part.split('='),\n _part$split2 = _slicedToArray(_part$split, 2),\n name = _part$split2[0],\n value = _part$split2[1];\n\n switch (name) {\n case 'tel':\n number = value;\n break;\n\n case 'ext':\n ext = value;\n break;\n\n case 'phone-context':\n // Only \"country contexts\" are supported.\n // \"Domain contexts\" are ignored.\n if (value[0] === '+') {\n number = value + number;\n }\n\n break;\n }\n } // If the phone number is not viable, then abort.\n\n\n if (!isViablePhoneNumber(number)) {\n return {};\n }\n\n var result = {\n number: number\n };\n\n if (ext) {\n result.ext = ext;\n }\n\n return result;\n}\n/**\r\n * @param {object} - `{ ?number, ?extension }`.\r\n * @return {string} Phone URI (RFC 3966).\r\n */\n\nexport function formatRFC3966(_ref) {\n var number = _ref.number,\n ext = _ref.ext;\n\n if (!number) {\n return '';\n }\n\n if (number[0] !== '+') {\n throw new Error(\"\\\"formatRFC3966()\\\" expects \\\"number\\\" to be in E.164 format.\");\n }\n\n return \"tel:\".concat(number).concat(ext ? ';ext=' + ext : '');\n}\n//# sourceMappingURL=RFC3966.js.map","import { VALID_PUNCTUATION } from '../constants.js'; // Removes brackets and replaces dashes with spaces.\n//\n// E.g. \"(999) 111-22-33\" -> \"999 111 22 33\"\n//\n// For some reason Google's metadata contains ` `s with brackets and dashes.\n// Meanwhile, there's no single opinion about using punctuation in international phone numbers.\n//\n// For example, Google's ` ` for USA is `+1 213-373-4253`.\n// And here's a quote from WikiPedia's \"North American Numbering Plan\" page:\n// https://en.wikipedia.org/wiki/North_American_Numbering_Plan\n//\n// \"The country calling code for all countries participating in the NANP is 1.\n// In international format, an NANP number should be listed as +1 301 555 01 00,\n// where 301 is an area code (Maryland).\"\n//\n// I personally prefer the international format without any punctuation.\n// For example, brackets are remnants of the old age, meaning that the\n// phone number part in brackets (so called \"area code\") can be omitted\n// if dialing within the same \"area\".\n// And hyphens were clearly introduced for splitting local numbers into memorizable groups.\n// For example, remembering \"5553535\" is difficult but \"555-35-35\" is much simpler.\n// Imagine a man taking a bus from home to work and seeing an ad with a phone number.\n// He has a couple of seconds to memorize that number until it passes by.\n// If it were spaces instead of hyphens the man wouldn't necessarily get it,\n// but with hyphens instead of spaces the grouping is more explicit.\n// I personally think that hyphens introduce visual clutter,\n// so I prefer replacing them with spaces in international numbers.\n// In the modern age all output is done on displays where spaces are clearly distinguishable\n// so hyphens can be safely replaced with spaces without losing any legibility.\n//\n\nexport default function applyInternationalSeparatorStyle(formattedNumber) {\n return formattedNumber.replace(new RegExp(\"[\".concat(VALID_PUNCTUATION, \"]+\"), 'g'), ' ').trim();\n}\n//# sourceMappingURL=applyInternationalSeparatorStyle.js.map","import mergeArrays from './mergeArrays.js';\nexport default function checkNumberLength(nationalNumber, metadata) {\n return checkNumberLengthForType(nationalNumber, undefined, metadata);\n} // Checks whether a number is possible for the country based on its length.\n// Should only be called for the \"new\" metadata which has \"possible lengths\".\n\nexport function checkNumberLengthForType(nationalNumber, type, metadata) {\n var type_info = metadata.type(type); // There should always be \" \" set for every type element.\n // This is declared in the XML schema.\n // For size efficiency, where a sub-description (e.g. fixed-line)\n // has the same \" \" as the \"general description\", this is missing,\n // so we fall back to the \"general description\". Where no numbers of the type\n // exist at all, there is one possible length (-1) which is guaranteed\n // not to match the length of any real phone number.\n\n var possible_lengths = type_info && type_info.possibleLengths() || metadata.possibleLengths(); // let local_lengths = type_info && type.possibleLengthsLocal() || metadata.possibleLengthsLocal()\n // Metadata before version `1.0.18` didn't contain `possible_lengths`.\n\n if (!possible_lengths) {\n return 'IS_POSSIBLE';\n }\n\n if (type === 'FIXED_LINE_OR_MOBILE') {\n // No such country in metadata.\n\n /* istanbul ignore next */\n if (!metadata.type('FIXED_LINE')) {\n // The rare case has been encountered where no fixedLine data is available\n // (true for some non-geographic entities), so we just check mobile.\n return checkNumberLengthForType(nationalNumber, 'MOBILE', metadata);\n }\n\n var mobile_type = metadata.type('MOBILE');\n\n if (mobile_type) {\n // Merge the mobile data in if there was any. \"Concat\" creates a new\n // array, it doesn't edit possible_lengths in place, so we don't need a copy.\n // Note that when adding the possible lengths from mobile, we have\n // to again check they aren't empty since if they are this indicates\n // they are the same as the general desc and should be obtained from there.\n possible_lengths = mergeArrays(possible_lengths, mobile_type.possibleLengths()); // The current list is sorted; we need to merge in the new list and\n // re-sort (duplicates are okay). Sorting isn't so expensive because\n // the lists are very small.\n // if (local_lengths) {\n // \tlocal_lengths = mergeArrays(local_lengths, mobile_type.possibleLengthsLocal())\n // } else {\n // \tlocal_lengths = mobile_type.possibleLengthsLocal()\n // }\n }\n } // If the type doesn't exist then return 'INVALID_LENGTH'.\n else if (type && !type_info) {\n return 'INVALID_LENGTH';\n }\n\n var actual_length = nationalNumber.length; // In `libphonenumber-js` all \"local-only\" formats are dropped for simplicity.\n // // This is safe because there is never an overlap beween the possible lengths\n // // and the local-only lengths; this is checked at build time.\n // if (local_lengths && local_lengths.indexOf(nationalNumber.length) >= 0)\n // {\n // \treturn 'IS_POSSIBLE_LOCAL_ONLY'\n // }\n\n var minimum_length = possible_lengths[0];\n\n if (minimum_length === actual_length) {\n return 'IS_POSSIBLE';\n }\n\n if (minimum_length > actual_length) {\n return 'TOO_SHORT';\n }\n\n if (possible_lengths[possible_lengths.length - 1] < actual_length) {\n return 'TOO_LONG';\n } // We skip the first element since we've already checked it.\n\n\n return possible_lengths.indexOf(actual_length, 1) >= 0 ? 'IS_POSSIBLE' : 'INVALID_LENGTH';\n}\n//# sourceMappingURL=checkNumberLength.js.map","import { VALID_DIGITS } from '../../constants.js'; // The RFC 3966 format for extensions.\n\nvar RFC3966_EXTN_PREFIX = ';ext=';\n/**\r\n * Helper method for constructing regular expressions for parsing. Creates\r\n * an expression that captures up to max_length digits.\r\n * @return {string} RegEx pattern to capture extension digits.\r\n */\n\nvar getExtensionDigitsPattern = function getExtensionDigitsPattern(maxLength) {\n return \"([\".concat(VALID_DIGITS, \"]{1,\").concat(maxLength, \"})\");\n};\n/**\r\n * Helper initialiser method to create the regular-expression pattern to match\r\n * extensions.\r\n * Copy-pasted from Google's `libphonenumber`:\r\n * https://github.com/google/libphonenumber/blob/55b2646ec9393f4d3d6661b9c82ef9e258e8b829/javascript/i18n/phonenumbers/phonenumberutil.js#L759-L766\r\n * @return {string} RegEx pattern to capture extensions.\r\n */\n\n\nexport default function createExtensionPattern(purpose) {\n // We cap the maximum length of an extension based on the ambiguity of the way\n // the extension is prefixed. As per ITU, the officially allowed length for\n // extensions is actually 40, but we don't support this since we haven't seen real\n // examples and this introduces many false interpretations as the extension labels\n // are not standardized.\n\n /** @type {string} */\n var extLimitAfterExplicitLabel = '20';\n /** @type {string} */\n\n var extLimitAfterLikelyLabel = '15';\n /** @type {string} */\n\n var extLimitAfterAmbiguousChar = '9';\n /** @type {string} */\n\n var extLimitWhenNotSure = '6';\n /** @type {string} */\n\n var possibleSeparatorsBetweenNumberAndExtLabel = \"[ \\xA0\\\\t,]*\"; // Optional full stop (.) or colon, followed by zero or more spaces/tabs/commas.\n\n /** @type {string} */\n\n var possibleCharsAfterExtLabel = \"[:\\\\.\\uFF0E]?[ \\xA0\\\\t,-]*\";\n /** @type {string} */\n\n var optionalExtnSuffix = \"#?\"; // Here the extension is called out in more explicit way, i.e mentioning it obvious\n // patterns like \"ext.\".\n\n /** @type {string} */\n\n var explicitExtLabels = \"(?:e?xt(?:ensi(?:o\\u0301?|\\xF3))?n?|\\uFF45?\\uFF58\\uFF54\\uFF4E?|\\u0434\\u043E\\u0431|anexo)\"; // One-character symbols that can be used to indicate an extension, and less\n // commonly used or more ambiguous extension labels.\n\n /** @type {string} */\n\n var ambiguousExtLabels = \"(?:[x\\uFF58#\\uFF03~\\uFF5E]|int|\\uFF49\\uFF4E\\uFF54)\"; // When extension is not separated clearly.\n\n /** @type {string} */\n\n var ambiguousSeparator = \"[- ]+\"; // This is the same as possibleSeparatorsBetweenNumberAndExtLabel, but not matching\n // comma as extension label may have it.\n\n /** @type {string} */\n\n var possibleSeparatorsNumberExtLabelNoComma = \"[ \\xA0\\\\t]*\"; // \",,\" is commonly used for auto dialling the extension when connected. First\n // comma is matched through possibleSeparatorsBetweenNumberAndExtLabel, so we do\n // not repeat it here. Semi-colon works in Iphone and Android also to pop up a\n // button with the extension number following.\n\n /** @type {string} */\n\n var autoDiallingAndExtLabelsFound = \"(?:,{2}|;)\";\n /** @type {string} */\n\n var rfcExtn = RFC3966_EXTN_PREFIX + getExtensionDigitsPattern(extLimitAfterExplicitLabel);\n /** @type {string} */\n\n var explicitExtn = possibleSeparatorsBetweenNumberAndExtLabel + explicitExtLabels + possibleCharsAfterExtLabel + getExtensionDigitsPattern(extLimitAfterExplicitLabel) + optionalExtnSuffix;\n /** @type {string} */\n\n var ambiguousExtn = possibleSeparatorsBetweenNumberAndExtLabel + ambiguousExtLabels + possibleCharsAfterExtLabel + getExtensionDigitsPattern(extLimitAfterAmbiguousChar) + optionalExtnSuffix;\n /** @type {string} */\n\n var americanStyleExtnWithSuffix = ambiguousSeparator + getExtensionDigitsPattern(extLimitWhenNotSure) + \"#\";\n /** @type {string} */\n\n var autoDiallingExtn = possibleSeparatorsNumberExtLabelNoComma + autoDiallingAndExtLabelsFound + possibleCharsAfterExtLabel + getExtensionDigitsPattern(extLimitAfterLikelyLabel) + optionalExtnSuffix;\n /** @type {string} */\n\n var onlyCommasExtn = possibleSeparatorsNumberExtLabelNoComma + \"(?:,)+\" + possibleCharsAfterExtLabel + getExtensionDigitsPattern(extLimitAfterAmbiguousChar) + optionalExtnSuffix; // The first regular expression covers RFC 3966 format, where the extension is added\n // using \";ext=\". The second more generic where extension is mentioned with explicit\n // labels like \"ext:\". In both the above cases we allow more numbers in extension than\n // any other extension labels. The third one captures when single character extension\n // labels or less commonly used labels are used. In such cases we capture fewer\n // extension digits in order to reduce the chance of falsely interpreting two\n // numbers beside each other as a number + extension. The fourth one covers the\n // special case of American numbers where the extension is written with a hash\n // at the end, such as \"- 503#\". The fifth one is exclusively for extension\n // autodialling formats which are used when dialling and in this case we accept longer\n // extensions. The last one is more liberal on the number of commas that acts as\n // extension labels, so we have a strict cap on the number of digits in such extensions.\n\n return rfcExtn + \"|\" + explicitExtn + \"|\" + ambiguousExtn + \"|\" + americanStyleExtnWithSuffix + \"|\" + autoDiallingExtn + \"|\" + onlyCommasExtn;\n}\n//# sourceMappingURL=createExtensionPattern.js.map","import createExtensionPattern from './createExtensionPattern.js'; // Regexp of all known extension prefixes used by different regions followed by\n// 1 or more valid digits, for use when parsing.\n\nvar EXTN_PATTERN = new RegExp('(?:' + createExtensionPattern() + ')$', 'i'); // Strips any extension (as in, the part of the number dialled after the call is\n// connected, usually indicated with extn, ext, x or similar) from the end of\n// the number, and returns it.\n\nexport default function extractExtension(number) {\n var start = number.search(EXTN_PATTERN);\n\n if (start < 0) {\n return {};\n } // If we find a potential extension, and the number preceding this is a viable\n // number, we assume it is an extension.\n\n\n var numberWithoutExtension = number.slice(0, start);\n var matches = number.match(EXTN_PATTERN);\n var i = 1;\n\n while (i < matches.length) {\n if (matches[i]) {\n return {\n number: numberWithoutExtension,\n ext: matches[i]\n };\n }\n\n i++;\n }\n}\n//# sourceMappingURL=extractExtension.js.map","import stripIddPrefix from './stripIddPrefix.js';\nimport extractCountryCallingCodeFromInternationalNumberWithoutPlusSign from './extractCountryCallingCodeFromInternationalNumberWithoutPlusSign.js';\nimport Metadata from '../metadata.js';\nimport { MAX_LENGTH_COUNTRY_CODE } from '../constants.js';\n/**\r\n * Converts a phone number digits (possibly with a `+`)\r\n * into a calling code and the rest phone number digits.\r\n * The \"rest phone number digits\" could include\r\n * a national prefix, carrier code, and national\r\n * (significant) number.\r\n * @param {string} number — Phone number digits (possibly with a `+`).\r\n * @param {string} [country] — Default country.\r\n * @param {string} [callingCode] — Default calling code (some phone numbering plans are non-geographic).\r\n * @param {object} metadata\r\n * @return {object} `{ countryCallingCode: string?, number: string }`\r\n * @example\r\n * // Returns `{ countryCallingCode: \"1\", number: \"2133734253\" }`.\r\n * extractCountryCallingCode('2133734253', 'US', null, metadata)\r\n * extractCountryCallingCode('2133734253', null, '1', metadata)\r\n * extractCountryCallingCode('+12133734253', null, null, metadata)\r\n * extractCountryCallingCode('+12133734253', 'RU', null, metadata)\r\n */\n\nexport default function extractCountryCallingCode(number, country, callingCode, metadata) {\n if (!number) {\n return {};\n } // If this is not an international phone number,\n // then either extract an \"IDD\" prefix, or extract a\n // country calling code from a number by autocorrecting it\n // by prepending a leading `+` in cases when it starts\n // with the country calling code.\n // https://wikitravel.org/en/International_dialling_prefix\n // https://github.com/catamphetamine/libphonenumber-js/issues/376\n\n\n if (number[0] !== '+') {\n // Convert an \"out-of-country\" dialing phone number\n // to a proper international phone number.\n var numberWithoutIDD = stripIddPrefix(number, country, callingCode, metadata); // If an IDD prefix was stripped then\n // convert the number to international one\n // for subsequent parsing.\n\n if (numberWithoutIDD && numberWithoutIDD !== number) {\n number = '+' + numberWithoutIDD;\n } else {\n // Check to see if the number starts with the country calling code\n // for the default country. If so, we remove the country calling code,\n // and do some checks on the validity of the number before and after.\n // https://github.com/catamphetamine/libphonenumber-js/issues/376\n if (country || callingCode) {\n var _extractCountryCallin = extractCountryCallingCodeFromInternationalNumberWithoutPlusSign(number, country, callingCode, metadata),\n countryCallingCode = _extractCountryCallin.countryCallingCode,\n shorterNumber = _extractCountryCallin.number;\n\n if (countryCallingCode) {\n return {\n countryCallingCode: countryCallingCode,\n number: shorterNumber\n };\n }\n }\n\n return {\n number: number\n };\n }\n } // Fast abortion: country codes do not begin with a '0'\n\n\n if (number[1] === '0') {\n return {};\n }\n\n metadata = new Metadata(metadata); // The thing with country phone codes\n // is that they are orthogonal to each other\n // i.e. there's no such country phone code A\n // for which country phone code B exists\n // where B starts with A.\n // Therefore, while scanning digits,\n // if a valid country code is found,\n // that means that it is the country code.\n //\n\n var i = 2;\n\n while (i - 1 <= MAX_LENGTH_COUNTRY_CODE && i <= number.length) {\n var _countryCallingCode = number.slice(1, i);\n\n if (metadata.hasCallingCode(_countryCallingCode)) {\n metadata.selectNumberingPlan(_countryCallingCode);\n return {\n countryCallingCode: _countryCallingCode,\n number: number.slice(i)\n };\n }\n\n i++;\n }\n\n return {};\n}\n//# sourceMappingURL=extractCountryCallingCode.js.map","import Metadata from '../metadata.js';\nimport matchesEntirely from './matchesEntirely.js';\nimport extractNationalNumber from './extractNationalNumber.js';\nimport checkNumberLength from './checkNumberLength.js';\nimport getCountryCallingCode from '../getCountryCallingCode.js';\n/**\r\n * Sometimes some people incorrectly input international phone numbers\r\n * without the leading `+`. This function corrects such input.\r\n * @param {string} number — Phone number digits.\r\n * @param {string?} country\r\n * @param {string?} callingCode\r\n * @param {object} metadata\r\n * @return {object} `{ countryCallingCode: string?, number: string }`.\r\n */\n\nexport default function extractCountryCallingCodeFromInternationalNumberWithoutPlusSign(number, country, callingCode, metadata) {\n var countryCallingCode = country ? getCountryCallingCode(country, metadata) : callingCode;\n\n if (number.indexOf(countryCallingCode) === 0) {\n metadata = new Metadata(metadata);\n metadata.selectNumberingPlan(country, callingCode);\n var possibleShorterNumber = number.slice(countryCallingCode.length);\n\n var _extractNationalNumbe = extractNationalNumber(possibleShorterNumber, metadata),\n possibleShorterNationalNumber = _extractNationalNumbe.nationalNumber;\n\n var _extractNationalNumbe2 = extractNationalNumber(number, metadata),\n nationalNumber = _extractNationalNumbe2.nationalNumber; // If the number was not valid before but is valid now,\n // or if it was too long before, we consider the number\n // with the country calling code stripped to be a better result\n // and keep that instead.\n // For example, in Germany (+49), `49` is a valid area code,\n // so if a number starts with `49`, it could be both a valid\n // national German number or an international number without\n // a leading `+`.\n\n\n if (!matchesEntirely(nationalNumber, metadata.nationalNumberPattern()) && matchesEntirely(possibleShorterNationalNumber, metadata.nationalNumberPattern()) || checkNumberLength(nationalNumber, metadata) === 'TOO_LONG') {\n return {\n countryCallingCode: countryCallingCode,\n number: possibleShorterNumber\n };\n }\n }\n\n return {\n number: number\n };\n}\n//# sourceMappingURL=extractCountryCallingCodeFromInternationalNumberWithoutPlusSign.js.map","import extractNationalNumberFromPossiblyIncompleteNumber from './extractNationalNumberFromPossiblyIncompleteNumber.js';\nimport matchesEntirely from './matchesEntirely.js';\nimport checkNumberLength from './checkNumberLength.js';\n/**\r\n * Strips national prefix and carrier code from a complete phone number.\r\n * The difference from the non-\"FromCompleteNumber\" function is that\r\n * it won't extract national prefix if the resultant number is too short\r\n * to be a complete number for the selected phone numbering plan.\r\n * @param {string} number — Complete phone number digits.\r\n * @param {Metadata} metadata — Metadata with a phone numbering plan selected.\r\n * @return {object} `{ nationalNumber: string, carrierCode: string? }`.\r\n */\n\nexport default function extractNationalNumber(number, metadata) {\n // Parsing national prefixes and carrier codes\n // is only required for local phone numbers\n // but some people don't understand that\n // and sometimes write international phone numbers\n // with national prefixes (or maybe even carrier codes).\n // http://ucken.blogspot.ru/2016/03/trunk-prefixes-in-skype4b.html\n // Google's original library forgives such mistakes\n // and so does this library, because it has been requested:\n // https://github.com/catamphetamine/libphonenumber-js/issues/127\n var _extractNationalNumbe = extractNationalNumberFromPossiblyIncompleteNumber(number, metadata),\n carrierCode = _extractNationalNumbe.carrierCode,\n nationalNumber = _extractNationalNumbe.nationalNumber;\n\n if (nationalNumber !== number) {\n if (!shouldHaveExtractedNationalPrefix(number, nationalNumber, metadata)) {\n // Don't strip the national prefix.\n return {\n nationalNumber: number\n };\n } // Check the national (significant) number length after extracting national prefix and carrier code.\n // Legacy generated metadata (before `1.0.18`) didn't support the \"possible lengths\" feature.\n\n\n if (metadata.possibleLengths()) {\n // The number remaining after stripping the national prefix and carrier code\n // should be long enough to have a possible length for the country.\n // Otherwise, don't strip the national prefix and carrier code,\n // since the original number could be a valid number.\n // This check has been copy-pasted \"as is\" from Google's original library:\n // https://github.com/google/libphonenumber/blob/876268eb1ad6cdc1b7b5bef17fc5e43052702d57/java/libphonenumber/src/com/google/i18n/phonenumbers/PhoneNumberUtil.java#L3236-L3250\n // It doesn't check for the \"possibility\" of the original `number`.\n // I guess it's fine not checking that one. It works as is anyway.\n if (!isPossibleIncompleteNationalNumber(nationalNumber, metadata)) {\n // Don't strip the national prefix.\n return {\n nationalNumber: number\n };\n }\n }\n }\n\n return {\n nationalNumber: nationalNumber,\n carrierCode: carrierCode\n };\n} // In some countries, the same digit could be a national prefix\n// or a leading digit of a valid phone number.\n// For example, in Russia, national prefix is `8`,\n// and also `800 555 35 35` is a valid number\n// in which `8` is not a national prefix, but the first digit\n// of a national (significant) number.\n// Same's with Belarus:\n// `82004910060` is a valid national (significant) number,\n// but `2004910060` is not.\n// To support such cases (to prevent the code from always stripping\n// national prefix), a condition is imposed: a national prefix\n// is not extracted when the original number is \"viable\" and the\n// resultant number is not, a \"viable\" national number being the one\n// that matches `national_number_pattern`.\n\nfunction shouldHaveExtractedNationalPrefix(nationalNumberBefore, nationalNumberAfter, metadata) {\n // The equivalent in Google's code is:\n // https://github.com/google/libphonenumber/blob/e326fa1fc4283bb05eb35cb3c15c18f98a31af33/java/libphonenumber/src/com/google/i18n/phonenumbers/PhoneNumberUtil.java#L2969-L3004\n if (matchesEntirely(nationalNumberBefore, metadata.nationalNumberPattern()) && !matchesEntirely(nationalNumberAfter, metadata.nationalNumberPattern())) {\n return false;\n } // This \"is possible\" national number (length) check has been commented out\n // because it's superceded by the (effectively) same check done in the\n // `extractNationalNumber()` function after it calls `shouldHaveExtractedNationalPrefix()`.\n // In other words, why run the same check twice if it could only be run once.\n // // Check the national (significant) number length after extracting national prefix and carrier code.\n // // Fixes a minor \"weird behavior\" bug: https://gitlab.com/catamphetamine/libphonenumber-js/-/issues/57\n // // (Legacy generated metadata (before `1.0.18`) didn't support the \"possible lengths\" feature).\n // if (metadata.possibleLengths()) {\n // \tif (isPossibleIncompleteNationalNumber(nationalNumberBefore, metadata) &&\n // \t\t!isPossibleIncompleteNationalNumber(nationalNumberAfter, metadata)) {\n // \t\treturn false\n // \t}\n // }\n\n\n return true;\n}\n\nfunction isPossibleIncompleteNationalNumber(nationalNumber, metadata) {\n switch (checkNumberLength(nationalNumber, metadata)) {\n case 'TOO_SHORT':\n case 'INVALID_LENGTH':\n // This library ignores \"local-only\" phone numbers (for simplicity).\n // See the readme for more info on what are \"local-only\" phone numbers.\n // case 'IS_POSSIBLE_LOCAL_ONLY':\n return false;\n\n default:\n return true;\n }\n}\n//# sourceMappingURL=extractNationalNumber.js.map","/**\r\n * Strips any national prefix (such as 0, 1) present in a\r\n * (possibly incomplete) number provided.\r\n * \"Carrier codes\" are only used in Colombia and Brazil,\r\n * and only when dialing within those countries from a mobile phone to a fixed line number.\r\n * Sometimes it won't actually strip national prefix\r\n * and will instead prepend some digits to the `number`:\r\n * for example, when number `2345678` is passed with `VI` country selected,\r\n * it will return `{ number: \"3402345678\" }`, because `340` area code is prepended.\r\n * @param {string} number — National number digits.\r\n * @param {object} metadata — Metadata with country selected.\r\n * @return {object} `{ nationalNumber: string, nationalPrefix: string? carrierCode: string? }`. Even if a national prefix was extracted, it's not necessarily present in the returned object, so don't rely on its presence in the returned object in order to find out whether a national prefix has been extracted or not.\r\n */\nexport default function extractNationalNumberFromPossiblyIncompleteNumber(number, metadata) {\n if (number && metadata.numberingPlan.nationalPrefixForParsing()) {\n // See METADATA.md for the description of\n // `national_prefix_for_parsing` and `national_prefix_transform_rule`.\n // Attempt to parse the first digits as a national prefix.\n var prefixPattern = new RegExp('^(?:' + metadata.numberingPlan.nationalPrefixForParsing() + ')');\n var prefixMatch = prefixPattern.exec(number);\n\n if (prefixMatch) {\n var nationalNumber;\n var carrierCode; // https://gitlab.com/catamphetamine/libphonenumber-js/-/blob/master/METADATA.md#national_prefix_for_parsing--national_prefix_transform_rule\n // If a `national_prefix_for_parsing` has any \"capturing groups\"\n // then it means that the national (significant) number is equal to\n // those \"capturing groups\" transformed via `national_prefix_transform_rule`,\n // and nothing could be said about the actual national prefix:\n // what is it and was it even there.\n // If a `national_prefix_for_parsing` doesn't have any \"capturing groups\",\n // then everything it matches is a national prefix.\n // To determine whether `national_prefix_for_parsing` matched any\n // \"capturing groups\", the value of the result of calling `.exec()`\n // is looked at, and if it has non-undefined values where there're\n // \"capturing groups\" in the regular expression, then it means\n // that \"capturing groups\" have been matched.\n // It's not possible to tell whether there'll be any \"capturing gropus\"\n // before the matching process, because a `national_prefix_for_parsing`\n // could exhibit both behaviors.\n\n var capturedGroupsCount = prefixMatch.length - 1;\n var hasCapturedGroups = capturedGroupsCount > 0 && prefixMatch[capturedGroupsCount];\n\n if (metadata.nationalPrefixTransformRule() && hasCapturedGroups) {\n nationalNumber = number.replace(prefixPattern, metadata.nationalPrefixTransformRule()); // If there's more than one captured group,\n // then carrier code is the second one.\n\n if (capturedGroupsCount > 1) {\n carrierCode = prefixMatch[1];\n }\n } // If there're no \"capturing groups\",\n // or if there're \"capturing groups\" but no\n // `national_prefix_transform_rule`,\n // then just strip the national prefix from the number,\n // and possibly a carrier code.\n // Seems like there could be more.\n else {\n // `prefixBeforeNationalNumber` is the whole substring matched by\n // the `national_prefix_for_parsing` regular expression.\n // There seem to be no guarantees that it's just a national prefix.\n // For example, if there's a carrier code, it's gonna be a\n // part of `prefixBeforeNationalNumber` too.\n var prefixBeforeNationalNumber = prefixMatch[0];\n nationalNumber = number.slice(prefixBeforeNationalNumber.length); // If there's at least one captured group,\n // then carrier code is the first one.\n\n if (hasCapturedGroups) {\n carrierCode = prefixMatch[1];\n }\n } // Tries to guess whether a national prefix was present in the input.\n // This is not something copy-pasted from Google's library:\n // they don't seem to have an equivalent for that.\n // So this isn't an \"officially approved\" way of doing something like that.\n // But since there seems no other existing method, this library uses it.\n\n\n var nationalPrefix;\n\n if (hasCapturedGroups) {\n var possiblePositionOfTheFirstCapturedGroup = number.indexOf(prefixMatch[1]);\n var possibleNationalPrefix = number.slice(0, possiblePositionOfTheFirstCapturedGroup); // Example: an Argentinian (AR) phone number `0111523456789`.\n // `prefixMatch[0]` is `01115`, and `$1` is `11`,\n // and the rest of the phone number is `23456789`.\n // The national number is transformed via `9$1` to `91123456789`.\n // National prefix `0` is detected being present at the start.\n // if (possibleNationalPrefix.indexOf(metadata.numberingPlan.nationalPrefix()) === 0) {\n\n if (possibleNationalPrefix === metadata.numberingPlan.nationalPrefix()) {\n nationalPrefix = metadata.numberingPlan.nationalPrefix();\n }\n } else {\n nationalPrefix = prefixMatch[0];\n }\n\n return {\n nationalNumber: nationalNumber,\n nationalPrefix: nationalPrefix,\n carrierCode: carrierCode\n };\n }\n }\n\n return {\n nationalNumber: number\n };\n}\n//# sourceMappingURL=extractNationalNumberFromPossiblyIncompleteNumber.js.map","import applyInternationalSeparatorStyle from './applyInternationalSeparatorStyle.js'; // This was originally set to $1 but there are some countries for which the\n// first group is not used in the national pattern (e.g. Argentina) so the $1\n// group does not match correctly. Therefore, we use `\\d`, so that the first\n// group actually used in the pattern will be matched.\n\nexport var FIRST_GROUP_PATTERN = /(\\$\\d)/;\nexport default function formatNationalNumberUsingFormat(number, format, _ref) {\n var useInternationalFormat = _ref.useInternationalFormat,\n withNationalPrefix = _ref.withNationalPrefix,\n carrierCode = _ref.carrierCode,\n metadata = _ref.metadata;\n var formattedNumber = number.replace(new RegExp(format.pattern()), useInternationalFormat ? format.internationalFormat() : // This library doesn't use `domestic_carrier_code_formatting_rule`,\n // because that one is only used when formatting phone numbers\n // for dialing from a mobile phone, and this is not a dialing library.\n // carrierCode && format.domesticCarrierCodeFormattingRule()\n // \t// First, replace the $CC in the formatting rule with the desired carrier code.\n // \t// Then, replace the $FG in the formatting rule with the first group\n // \t// and the carrier code combined in the appropriate way.\n // \t? format.format().replace(FIRST_GROUP_PATTERN, format.domesticCarrierCodeFormattingRule().replace('$CC', carrierCode))\n // \t: (\n // \t\twithNationalPrefix && format.nationalPrefixFormattingRule()\n // \t\t\t? format.format().replace(FIRST_GROUP_PATTERN, format.nationalPrefixFormattingRule())\n // \t\t\t: format.format()\n // \t)\n withNationalPrefix && format.nationalPrefixFormattingRule() ? format.format().replace(FIRST_GROUP_PATTERN, format.nationalPrefixFormattingRule()) : format.format());\n\n if (useInternationalFormat) {\n return applyInternationalSeparatorStyle(formattedNumber);\n }\n\n return formattedNumber;\n}\n//# sourceMappingURL=formatNationalNumberUsingFormat.js.map","import getCountryByNationalNumber from './getCountryByNationalNumber.js';\nvar USE_NON_GEOGRAPHIC_COUNTRY_CODE = false;\nexport default function getCountryByCallingCode(callingCode, nationalPhoneNumber, metadata) {\n /* istanbul ignore if */\n if (USE_NON_GEOGRAPHIC_COUNTRY_CODE) {\n if (metadata.isNonGeographicCallingCode(callingCode)) {\n return '001';\n }\n }\n\n var possibleCountries = metadata.getCountryCodesForCallingCode(callingCode);\n\n if (!possibleCountries) {\n return;\n } // If there's just one country corresponding to the country code,\n // then just return it, without further phone number digits validation.\n\n\n if (possibleCountries.length === 1) {\n return possibleCountries[0];\n }\n\n return getCountryByNationalNumber(possibleCountries, nationalPhoneNumber, metadata.metadata);\n}\n//# sourceMappingURL=getCountryByCallingCode.js.map","function _createForOfIteratorHelperLoose(o, allowArrayLike) { var it = typeof Symbol !== \"undefined\" && o[Symbol.iterator] || o[\"@@iterator\"]; if (it) return (it = it.call(o)).next.bind(it); if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") { if (it) o = it; var i = 0; return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\n\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\n\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n\nimport Metadata from '../metadata.js';\nimport getNumberType from './getNumberType.js';\nexport default function getCountryByNationalNumber(possibleCountries, nationalPhoneNumber, metadata) {\n // Re-create `metadata` because it will be selecting a `country`.\n metadata = new Metadata(metadata);\n\n for (var _iterator = _createForOfIteratorHelperLoose(possibleCountries), _step; !(_step = _iterator()).done;) {\n var country = _step.value;\n metadata.country(country); // \"Leading digits\" patterns are only defined for about 20% of all countries.\n // By definition, matching \"leading digits\" is a sufficient but not a necessary\n // condition for a phone number to belong to a country.\n // The point of \"leading digits\" check is that it's the fastest one to get a match.\n // https://gitlab.com/catamphetamine/libphonenumber-js/blob/master/METADATA.md#leading_digits\n\n if (metadata.leadingDigits()) {\n if (nationalPhoneNumber && nationalPhoneNumber.search(metadata.leadingDigits()) === 0) {\n return country;\n }\n } // Else perform full validation with all of those\n // fixed-line/mobile/etc regular expressions.\n else if (getNumberType({\n phone: nationalPhoneNumber,\n country: country\n }, undefined, metadata.metadata)) {\n return country;\n }\n }\n}\n//# sourceMappingURL=getCountryByNationalNumber.js.map","import Metadata from '../metadata.js';\n/**\r\n * Pattern that makes it easy to distinguish whether a region has a single\r\n * international dialing prefix or not. If a region has a single international\r\n * prefix (e.g. 011 in USA), it will be represented as a string that contains\r\n * a sequence of ASCII digits, and possibly a tilde, which signals waiting for\r\n * the tone. If there are multiple available international prefixes in a\r\n * region, they will be represented as a regex string that always contains one\r\n * or more characters that are not ASCII digits or a tilde.\r\n */\n\nvar SINGLE_IDD_PREFIX_REG_EXP = /^[\\d]+(?:[~\\u2053\\u223C\\uFF5E][\\d]+)?$/; // For regions that have multiple IDD prefixes\n// a preferred IDD prefix is returned.\n\nexport default function getIddPrefix(country, callingCode, metadata) {\n var countryMetadata = new Metadata(metadata);\n countryMetadata.selectNumberingPlan(country, callingCode);\n\n if (countryMetadata.defaultIDDPrefix()) {\n return countryMetadata.defaultIDDPrefix();\n }\n\n if (SINGLE_IDD_PREFIX_REG_EXP.test(countryMetadata.IDDPrefix())) {\n return countryMetadata.IDDPrefix();\n }\n}\n//# sourceMappingURL=getIddPrefix.js.map","function _createForOfIteratorHelperLoose(o, allowArrayLike) { var it = typeof Symbol !== \"undefined\" && o[Symbol.iterator] || o[\"@@iterator\"]; if (it) return (it = it.call(o)).next.bind(it); if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") { if (it) o = it; var i = 0; return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\n\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\n\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n\nimport Metadata from '../metadata.js';\nimport matchesEntirely from './matchesEntirely.js';\nvar NON_FIXED_LINE_PHONE_TYPES = ['MOBILE', 'PREMIUM_RATE', 'TOLL_FREE', 'SHARED_COST', 'VOIP', 'PERSONAL_NUMBER', 'PAGER', 'UAN', 'VOICEMAIL']; // Finds out national phone number type (fixed line, mobile, etc)\n\nexport default function getNumberType(input, options, metadata) {\n // If assigning the `{}` default value is moved to the arguments above,\n // code coverage would decrease for some weird reason.\n options = options || {}; // When `parse()` returned `{}`\n // meaning that the phone number is not a valid one.\n\n if (!input.country) {\n return;\n }\n\n metadata = new Metadata(metadata);\n metadata.selectNumberingPlan(input.country, input.countryCallingCode);\n var nationalNumber = options.v2 ? input.nationalNumber : input.phone; // The following is copy-pasted from the original function:\n // https://github.com/googlei18n/libphonenumber/blob/3ea547d4fbaa2d0b67588904dfa5d3f2557c27ff/javascript/i18n/phonenumbers/phonenumberutil.js#L2835\n // Is this national number even valid for this country\n\n if (!matchesEntirely(nationalNumber, metadata.nationalNumberPattern())) {\n return;\n } // Is it fixed line number\n\n\n if (isNumberTypeEqualTo(nationalNumber, 'FIXED_LINE', metadata)) {\n // Because duplicate regular expressions are removed\n // to reduce metadata size, if \"mobile\" pattern is \"\"\n // then it means it was removed due to being a duplicate of the fixed-line pattern.\n //\n if (metadata.type('MOBILE') && metadata.type('MOBILE').pattern() === '') {\n return 'FIXED_LINE_OR_MOBILE';\n } // `MOBILE` type pattern isn't included if it matched `FIXED_LINE` one.\n // For example, for \"US\" country.\n // Old metadata (< `1.0.18`) had a specific \"types\" data structure\n // that happened to be `undefined` for `MOBILE` in that case.\n // Newer metadata (>= `1.0.18`) has another data structure that is\n // not `undefined` for `MOBILE` in that case (it's just an empty array).\n // So this `if` is just for backwards compatibility with old metadata.\n\n\n if (!metadata.type('MOBILE')) {\n return 'FIXED_LINE_OR_MOBILE';\n } // Check if the number happens to qualify as both fixed line and mobile.\n // (no such country in the minimal metadata set)\n\n /* istanbul ignore if */\n\n\n if (isNumberTypeEqualTo(nationalNumber, 'MOBILE', metadata)) {\n return 'FIXED_LINE_OR_MOBILE';\n }\n\n return 'FIXED_LINE';\n }\n\n for (var _iterator = _createForOfIteratorHelperLoose(NON_FIXED_LINE_PHONE_TYPES), _step; !(_step = _iterator()).done;) {\n var type = _step.value;\n\n if (isNumberTypeEqualTo(nationalNumber, type, metadata)) {\n return type;\n }\n }\n}\nexport function isNumberTypeEqualTo(nationalNumber, type, metadata) {\n type = metadata.type(type);\n\n if (!type || !type.pattern()) {\n return false;\n } // Check if any possible number lengths are present;\n // if so, we use them to avoid checking\n // the validation pattern if they don't match.\n // If they are absent, this means they match\n // the general description, which we have\n // already checked before a specific number type.\n\n\n if (type.possibleLengths() && type.possibleLengths().indexOf(nationalNumber.length) < 0) {\n return false;\n }\n\n return matchesEntirely(nationalNumber, type.pattern());\n}\n//# sourceMappingURL=getNumberType.js.map","import Metadata from '../metadata.js';\n/**\r\n * Returns a list of countries that the phone number could potentially belong to.\r\n * @param {string} callingCode — Calling code.\r\n * @param {string} nationalNumber — National (significant) number.\r\n * @param {object} metadata — Metadata.\r\n * @return {string[]} A list of possible countries.\r\n */\n\nexport default function getPossibleCountriesForNumber(callingCode, nationalNumber, metadata) {\n var _metadata = new Metadata(metadata);\n\n var possibleCountries = _metadata.getCountryCodesForCallingCode(callingCode);\n\n if (!possibleCountries) {\n return [];\n }\n\n return possibleCountries.filter(function (country) {\n return couldNationalNumberBelongToCountry(nationalNumber, country, metadata);\n });\n}\n\nfunction couldNationalNumberBelongToCountry(nationalNumber, country, metadata) {\n var _metadata = new Metadata(metadata);\n\n _metadata.selectNumberingPlan(country);\n\n if (_metadata.numberingPlan.possibleLengths().indexOf(nationalNumber.length) >= 0) {\n return true;\n }\n\n return false;\n}\n//# sourceMappingURL=getPossibleCountriesForNumber.js.map","import { MIN_LENGTH_FOR_NSN, VALID_DIGITS, VALID_PUNCTUATION, PLUS_CHARS } from '../constants.js';\nimport createExtensionPattern from './extension/createExtensionPattern.js'; // Regular expression of viable phone numbers. This is location independent.\n// Checks we have at least three leading digits, and only valid punctuation,\n// alpha characters and digits in the phone number. Does not include extension\n// data. The symbol 'x' is allowed here as valid punctuation since it is often\n// used as a placeholder for carrier codes, for example in Brazilian phone\n// numbers. We also allow multiple '+' characters at the start.\n//\n// Corresponds to the following:\n// [digits]{minLengthNsn}|\n// plus_sign*\n// (([punctuation]|[star])*[digits]){3,}([punctuation]|[star]|[digits]|[alpha])*\n//\n// The first reg-ex is to allow short numbers (two digits long) to be parsed if\n// they are entered as \"15\" etc, but only if there is no punctuation in them.\n// The second expression restricts the number of digits to three or more, but\n// then allows them to be in international form, and to have alpha-characters\n// and punctuation. We split up the two reg-exes here and combine them when\n// creating the reg-ex VALID_PHONE_NUMBER_PATTERN itself so we can prefix it\n// with ^ and append $ to each branch.\n//\n// \"Note VALID_PUNCTUATION starts with a -,\n// so must be the first in the range\" (c) Google devs.\n// (wtf did they mean by saying that; probably nothing)\n//\n\nvar MIN_LENGTH_PHONE_NUMBER_PATTERN = '[' + VALID_DIGITS + ']{' + MIN_LENGTH_FOR_NSN + '}'; //\n// And this is the second reg-exp:\n// (see MIN_LENGTH_PHONE_NUMBER_PATTERN for a full description of this reg-exp)\n//\n\nexport var VALID_PHONE_NUMBER = '[' + PLUS_CHARS + ']{0,1}' + '(?:' + '[' + VALID_PUNCTUATION + ']*' + '[' + VALID_DIGITS + ']' + '){3,}' + '[' + VALID_PUNCTUATION + VALID_DIGITS + ']*'; // This regular expression isn't present in Google's `libphonenumber`\n// and is only used to determine whether the phone number being input\n// is too short for it to even consider it a \"valid\" number.\n// This is just a way to differentiate between a really invalid phone\n// number like \"abcde\" and a valid phone number that a user has just\n// started inputting, like \"+1\" or \"1\": both these cases would be\n// considered `NOT_A_NUMBER` by Google's `libphonenumber`, but this\n// library can provide a more detailed error message — whether it's\n// really \"not a number\", or is it just a start of a valid phone number.\n\nvar VALID_PHONE_NUMBER_START_REG_EXP = new RegExp('^' + '[' + PLUS_CHARS + ']{0,1}' + '(?:' + '[' + VALID_PUNCTUATION + ']*' + '[' + VALID_DIGITS + ']' + '){1,2}' + '$', 'i');\nexport var VALID_PHONE_NUMBER_WITH_EXTENSION = VALID_PHONE_NUMBER + // Phone number extensions\n'(?:' + createExtensionPattern() + ')?'; // The combined regular expression for valid phone numbers:\n//\n\nvar VALID_PHONE_NUMBER_PATTERN = new RegExp( // Either a short two-digit-only phone number\n'^' + MIN_LENGTH_PHONE_NUMBER_PATTERN + '$' + '|' + // Or a longer fully parsed phone number (min 3 characters)\n'^' + VALID_PHONE_NUMBER_WITH_EXTENSION + '$', 'i'); // Checks to see if the string of characters could possibly be a phone number at\n// all. At the moment, checks to see that the string begins with at least 2\n// digits, ignoring any punctuation commonly found in phone numbers. This method\n// does not require the number to be normalized in advance - but does assume\n// that leading non-number symbols have been removed, such as by the method\n// `extract_possible_number`.\n//\n\nexport default function isViablePhoneNumber(number) {\n return number.length >= MIN_LENGTH_FOR_NSN && VALID_PHONE_NUMBER_PATTERN.test(number);\n} // This is just a way to differentiate between a really invalid phone\n// number like \"abcde\" and a valid phone number that a user has just\n// started inputting, like \"+1\" or \"1\": both these cases would be\n// considered `NOT_A_NUMBER` by Google's `libphonenumber`, but this\n// library can provide a more detailed error message — whether it's\n// really \"not a number\", or is it just a start of a valid phone number.\n\nexport function isViablePhoneNumberStart(number) {\n return VALID_PHONE_NUMBER_START_REG_EXP.test(number);\n}\n//# sourceMappingURL=isViablePhoneNumber.js.map","/**\r\n * Checks whether the entire input sequence can be matched\r\n * against the regular expression.\r\n * @return {boolean}\r\n */\nexport default function matchesEntirely(text, regular_expression) {\n // If assigning the `''` default value is moved to the arguments above,\n // code coverage would decrease for some weird reason.\n text = text || '';\n return new RegExp('^(?:' + regular_expression + ')$').test(text);\n}\n//# sourceMappingURL=matchesEntirely.js.map","function _createForOfIteratorHelperLoose(o, allowArrayLike) { var it = typeof Symbol !== \"undefined\" && o[Symbol.iterator] || o[\"@@iterator\"]; if (it) return (it = it.call(o)).next.bind(it); if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") { if (it) o = it; var i = 0; return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\n\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\n\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n\n/**\r\n * Merges two arrays.\r\n * @param {*} a\r\n * @param {*} b\r\n * @return {*}\r\n */\nexport default function mergeArrays(a, b) {\n var merged = a.slice();\n\n for (var _iterator = _createForOfIteratorHelperLoose(b), _step; !(_step = _iterator()).done;) {\n var element = _step.value;\n\n if (a.indexOf(element) < 0) {\n merged.push(element);\n }\n }\n\n return merged.sort(function (a, b) {\n return a - b;\n }); // ES6 version, requires Set polyfill.\n // let merged = new Set(a)\n // for (const element of b) {\n // \tmerged.add(i)\n // }\n // return Array.from(merged).sort((a, b) => a - b)\n}\n//# sourceMappingURL=mergeArrays.js.map","function _createForOfIteratorHelperLoose(o, allowArrayLike) { var it = typeof Symbol !== \"undefined\" && o[Symbol.iterator] || o[\"@@iterator\"]; if (it) return (it = it.call(o)).next.bind(it); if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") { if (it) o = it; var i = 0; return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\n\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\n\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n\n// These mappings map a character (key) to a specific digit that should\n// replace it for normalization purposes. Non-European digits that\n// may be used in phone numbers are mapped to a European equivalent.\n//\n// E.g. in Iraq they don't write `+442323234` but rather `+٤٤٢٣٢٣٢٣٤`.\n//\nexport var DIGITS = {\n '0': '0',\n '1': '1',\n '2': '2',\n '3': '3',\n '4': '4',\n '5': '5',\n '6': '6',\n '7': '7',\n '8': '8',\n '9': '9',\n \"\\uFF10\": '0',\n // Fullwidth digit 0\n \"\\uFF11\": '1',\n // Fullwidth digit 1\n \"\\uFF12\": '2',\n // Fullwidth digit 2\n \"\\uFF13\": '3',\n // Fullwidth digit 3\n \"\\uFF14\": '4',\n // Fullwidth digit 4\n \"\\uFF15\": '5',\n // Fullwidth digit 5\n \"\\uFF16\": '6',\n // Fullwidth digit 6\n \"\\uFF17\": '7',\n // Fullwidth digit 7\n \"\\uFF18\": '8',\n // Fullwidth digit 8\n \"\\uFF19\": '9',\n // Fullwidth digit 9\n \"\\u0660\": '0',\n // Arabic-indic digit 0\n \"\\u0661\": '1',\n // Arabic-indic digit 1\n \"\\u0662\": '2',\n // Arabic-indic digit 2\n \"\\u0663\": '3',\n // Arabic-indic digit 3\n \"\\u0664\": '4',\n // Arabic-indic digit 4\n \"\\u0665\": '5',\n // Arabic-indic digit 5\n \"\\u0666\": '6',\n // Arabic-indic digit 6\n \"\\u0667\": '7',\n // Arabic-indic digit 7\n \"\\u0668\": '8',\n // Arabic-indic digit 8\n \"\\u0669\": '9',\n // Arabic-indic digit 9\n \"\\u06F0\": '0',\n // Eastern-Arabic digit 0\n \"\\u06F1\": '1',\n // Eastern-Arabic digit 1\n \"\\u06F2\": '2',\n // Eastern-Arabic digit 2\n \"\\u06F3\": '3',\n // Eastern-Arabic digit 3\n \"\\u06F4\": '4',\n // Eastern-Arabic digit 4\n \"\\u06F5\": '5',\n // Eastern-Arabic digit 5\n \"\\u06F6\": '6',\n // Eastern-Arabic digit 6\n \"\\u06F7\": '7',\n // Eastern-Arabic digit 7\n \"\\u06F8\": '8',\n // Eastern-Arabic digit 8\n \"\\u06F9\": '9' // Eastern-Arabic digit 9\n\n};\nexport function parseDigit(character) {\n return DIGITS[character];\n}\n/**\r\n * Parses phone number digits from a string.\r\n * Drops all punctuation leaving only digits.\r\n * Also converts wide-ascii and arabic-indic numerals to conventional numerals.\r\n * E.g. in Iraq they don't write `+442323234` but rather `+٤٤٢٣٢٣٢٣٤`.\r\n * @param {string} string\r\n * @return {string}\r\n * @example\r\n * ```js\r\n * parseDigits('8 (800) 555')\r\n * // Outputs '8800555'.\r\n * ```\r\n */\n\nexport default function parseDigits(string) {\n var result = ''; // Using `.split('')` here instead of normal `for ... of`\n // because the importing application doesn't neccessarily include an ES6 polyfill.\n // The `.split('')` approach discards \"exotic\" UTF-8 characters\n // (the ones consisting of four bytes) but digits\n // (including non-European ones) don't fall into that range\n // so such \"exotic\" characters would be discarded anyway.\n\n for (var _iterator = _createForOfIteratorHelperLoose(string.split('')), _step; !(_step = _iterator()).done;) {\n var character = _step.value;\n var digit = parseDigit(character);\n\n if (digit) {\n result += digit;\n }\n }\n\n return result;\n}\n//# sourceMappingURL=parseDigits.js.map","import Metadata from '../metadata.js';\nimport { VALID_DIGITS } from '../constants.js';\nvar CAPTURING_DIGIT_PATTERN = new RegExp('([' + VALID_DIGITS + '])');\nexport default function stripIddPrefix(number, country, callingCode, metadata) {\n if (!country) {\n return;\n } // Check if the number is IDD-prefixed.\n\n\n var countryMetadata = new Metadata(metadata);\n countryMetadata.selectNumberingPlan(country, callingCode);\n var IDDPrefixPattern = new RegExp(countryMetadata.IDDPrefix());\n\n if (number.search(IDDPrefixPattern) !== 0) {\n return;\n } // Strip IDD prefix.\n\n\n number = number.slice(number.match(IDDPrefixPattern)[0].length); // If there're any digits after an IDD prefix,\n // then those digits are a country calling code.\n // Since no country code starts with a `0`,\n // the code below validates that the next digit (if present) is not `0`.\n\n var matchedGroups = number.match(CAPTURING_DIGIT_PATTERN);\n\n if (matchedGroups && matchedGroups[1] != null && matchedGroups[1].length > 0) {\n if (matchedGroups[1] === '0') {\n return;\n }\n }\n\n return number;\n}\n//# sourceMappingURL=stripIddPrefix.js.map","import Metadata from './metadata.js';\nimport checkNumberLength from './helpers/checkNumberLength.js';\nexport default function isPossiblePhoneNumber(input, options, metadata) {\n /* istanbul ignore if */\n if (options === undefined) {\n options = {};\n }\n\n metadata = new Metadata(metadata);\n\n if (options.v2) {\n if (!input.countryCallingCode) {\n throw new Error('Invalid phone number object passed');\n }\n\n metadata.selectNumberingPlan(input.countryCallingCode);\n } else {\n if (!input.phone) {\n return false;\n }\n\n if (input.country) {\n if (!metadata.hasCountry(input.country)) {\n throw new Error(\"Unknown country: \".concat(input.country));\n }\n\n metadata.country(input.country);\n } else {\n if (!input.countryCallingCode) {\n throw new Error('Invalid phone number object passed');\n }\n\n metadata.selectNumberingPlan(input.countryCallingCode);\n }\n } // Old metadata (< 1.0.18) had no \"possible length\" data.\n\n\n if (metadata.possibleLengths()) {\n return isPossibleNumber(input.phone || input.nationalNumber, metadata);\n } else {\n // There was a bug between `1.7.35` and `1.7.37` where \"possible_lengths\"\n // were missing for \"non-geographical\" numbering plans.\n // Just assume the number is possible in such cases:\n // it's unlikely that anyone generated their custom metadata\n // in that short period of time (one day).\n // This code can be removed in some future major version update.\n if (input.countryCallingCode && metadata.isNonGeographicCallingCode(input.countryCallingCode)) {\n // \"Non-geographic entities\" did't have `possibleLengths`\n // due to a bug in metadata generation process.\n return true;\n } else {\n throw new Error('Missing \"possibleLengths\" in metadata. Perhaps the metadata has been generated before v1.0.18.');\n }\n }\n}\nexport function isPossibleNumber(nationalNumber, metadata) {\n //, isInternational) {\n switch (checkNumberLength(nationalNumber, metadata)) {\n case 'IS_POSSIBLE':\n return true;\n // This library ignores \"local-only\" phone numbers (for simplicity).\n // See the readme for more info on what are \"local-only\" phone numbers.\n // case 'IS_POSSIBLE_LOCAL_ONLY':\n // \treturn !isInternational\n\n default:\n return false;\n }\n}\n//# sourceMappingURL=isPossibleNumber_.js.map","function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\nimport compare from './tools/semver-compare.js'; // Added \"possibleLengths\" and renamed\n// \"country_phone_code_to_countries\" to \"country_calling_codes\".\n\nvar V2 = '1.0.18'; // Added \"idd_prefix\" and \"default_idd_prefix\".\n\nvar V3 = '1.2.0'; // Moved `001` country code to \"nonGeographic\" section of metadata.\n\nvar V4 = '1.7.35';\nvar DEFAULT_EXT_PREFIX = ' ext. ';\nvar CALLING_CODE_REG_EXP = /^\\d+$/;\n/**\r\n * See: https://gitlab.com/catamphetamine/libphonenumber-js/blob/master/METADATA.md\r\n */\n\nvar Metadata = /*#__PURE__*/function () {\n function Metadata(metadata) {\n _classCallCheck(this, Metadata);\n\n validateMetadata(metadata);\n this.metadata = metadata;\n setVersion.call(this, metadata);\n }\n\n _createClass(Metadata, [{\n key: \"getCountries\",\n value: function getCountries() {\n return Object.keys(this.metadata.countries).filter(function (_) {\n return _ !== '001';\n });\n }\n }, {\n key: \"getCountryMetadata\",\n value: function getCountryMetadata(countryCode) {\n return this.metadata.countries[countryCode];\n }\n }, {\n key: \"nonGeographic\",\n value: function nonGeographic() {\n if (this.v1 || this.v2 || this.v3) return; // `nonGeographical` was a typo.\n // It's present in metadata generated from `1.7.35` to `1.7.37`.\n // The test case could be found by searching for \"nonGeographical\".\n\n return this.metadata.nonGeographic || this.metadata.nonGeographical;\n }\n }, {\n key: \"hasCountry\",\n value: function hasCountry(country) {\n return this.getCountryMetadata(country) !== undefined;\n }\n }, {\n key: \"hasCallingCode\",\n value: function hasCallingCode(callingCode) {\n if (this.getCountryCodesForCallingCode(callingCode)) {\n return true;\n }\n\n if (this.nonGeographic()) {\n if (this.nonGeographic()[callingCode]) {\n return true;\n }\n } else {\n // A hacky workaround for old custom metadata (generated before V4).\n var countryCodes = this.countryCallingCodes()[callingCode];\n\n if (countryCodes && countryCodes.length === 1 && countryCodes[0] === '001') {\n return true;\n }\n }\n }\n }, {\n key: \"isNonGeographicCallingCode\",\n value: function isNonGeographicCallingCode(callingCode) {\n if (this.nonGeographic()) {\n return this.nonGeographic()[callingCode] ? true : false;\n } else {\n return this.getCountryCodesForCallingCode(callingCode) ? false : true;\n }\n } // Deprecated.\n\n }, {\n key: \"country\",\n value: function country(countryCode) {\n return this.selectNumberingPlan(countryCode);\n }\n }, {\n key: \"selectNumberingPlan\",\n value: function selectNumberingPlan(countryCode, callingCode) {\n // Supports just passing `callingCode` as the first argument.\n if (countryCode && CALLING_CODE_REG_EXP.test(countryCode)) {\n callingCode = countryCode;\n countryCode = null;\n }\n\n if (countryCode && countryCode !== '001') {\n if (!this.hasCountry(countryCode)) {\n throw new Error(\"Unknown country: \".concat(countryCode));\n }\n\n this.numberingPlan = new NumberingPlan(this.getCountryMetadata(countryCode), this);\n } else if (callingCode) {\n if (!this.hasCallingCode(callingCode)) {\n throw new Error(\"Unknown calling code: \".concat(callingCode));\n }\n\n this.numberingPlan = new NumberingPlan(this.getNumberingPlanMetadata(callingCode), this);\n } else {\n this.numberingPlan = undefined;\n }\n\n return this;\n }\n }, {\n key: \"getCountryCodesForCallingCode\",\n value: function getCountryCodesForCallingCode(callingCode) {\n var countryCodes = this.countryCallingCodes()[callingCode];\n\n if (countryCodes) {\n // Metadata before V4 included \"non-geographic entity\" calling codes\n // inside `country_calling_codes` (for example, `\"881\":[\"001\"]`).\n // Now the semantics of `country_calling_codes` has changed:\n // it's specifically for \"countries\" now.\n // Older versions of custom metadata will simply skip parsing\n // \"non-geographic entity\" phone numbers with new versions\n // of this library: it's not considered a bug,\n // because such numbers are extremely rare,\n // and developers extremely rarely use custom metadata.\n if (countryCodes.length === 1 && countryCodes[0].length === 3) {\n return;\n }\n\n return countryCodes;\n }\n }\n }, {\n key: \"getCountryCodeForCallingCode\",\n value: function getCountryCodeForCallingCode(callingCode) {\n var countryCodes = this.getCountryCodesForCallingCode(callingCode);\n\n if (countryCodes) {\n return countryCodes[0];\n }\n }\n }, {\n key: \"getNumberingPlanMetadata\",\n value: function getNumberingPlanMetadata(callingCode) {\n var countryCode = this.getCountryCodeForCallingCode(callingCode);\n\n if (countryCode) {\n return this.getCountryMetadata(countryCode);\n }\n\n if (this.nonGeographic()) {\n var metadata = this.nonGeographic()[callingCode];\n\n if (metadata) {\n return metadata;\n }\n } else {\n // A hacky workaround for old custom metadata (generated before V4).\n // In that metadata, there was no concept of \"non-geographic\" metadata\n // so metadata for `001` country code was stored along with other countries.\n // The test case can be found by searching for:\n // \"should work around `nonGeographic` metadata not existing\".\n var countryCodes = this.countryCallingCodes()[callingCode];\n\n if (countryCodes && countryCodes.length === 1 && countryCodes[0] === '001') {\n return this.metadata.countries['001'];\n }\n }\n } // Deprecated.\n\n }, {\n key: \"countryCallingCode\",\n value: function countryCallingCode() {\n return this.numberingPlan.callingCode();\n } // Deprecated.\n\n }, {\n key: \"IDDPrefix\",\n value: function IDDPrefix() {\n return this.numberingPlan.IDDPrefix();\n } // Deprecated.\n\n }, {\n key: \"defaultIDDPrefix\",\n value: function defaultIDDPrefix() {\n return this.numberingPlan.defaultIDDPrefix();\n } // Deprecated.\n\n }, {\n key: \"nationalNumberPattern\",\n value: function nationalNumberPattern() {\n return this.numberingPlan.nationalNumberPattern();\n } // Deprecated.\n\n }, {\n key: \"possibleLengths\",\n value: function possibleLengths() {\n return this.numberingPlan.possibleLengths();\n } // Deprecated.\n\n }, {\n key: \"formats\",\n value: function formats() {\n return this.numberingPlan.formats();\n } // Deprecated.\n\n }, {\n key: \"nationalPrefixForParsing\",\n value: function nationalPrefixForParsing() {\n return this.numberingPlan.nationalPrefixForParsing();\n } // Deprecated.\n\n }, {\n key: \"nationalPrefixTransformRule\",\n value: function nationalPrefixTransformRule() {\n return this.numberingPlan.nationalPrefixTransformRule();\n } // Deprecated.\n\n }, {\n key: \"leadingDigits\",\n value: function leadingDigits() {\n return this.numberingPlan.leadingDigits();\n } // Deprecated.\n\n }, {\n key: \"hasTypes\",\n value: function hasTypes() {\n return this.numberingPlan.hasTypes();\n } // Deprecated.\n\n }, {\n key: \"type\",\n value: function type(_type) {\n return this.numberingPlan.type(_type);\n } // Deprecated.\n\n }, {\n key: \"ext\",\n value: function ext() {\n return this.numberingPlan.ext();\n }\n }, {\n key: \"countryCallingCodes\",\n value: function countryCallingCodes() {\n if (this.v1) return this.metadata.country_phone_code_to_countries;\n return this.metadata.country_calling_codes;\n } // Deprecated.\n\n }, {\n key: \"chooseCountryByCountryCallingCode\",\n value: function chooseCountryByCountryCallingCode(callingCode) {\n return this.selectNumberingPlan(callingCode);\n }\n }, {\n key: \"hasSelectedNumberingPlan\",\n value: function hasSelectedNumberingPlan() {\n return this.numberingPlan !== undefined;\n }\n }]);\n\n return Metadata;\n}();\n\nexport { Metadata as default };\n\nvar NumberingPlan = /*#__PURE__*/function () {\n function NumberingPlan(metadata, globalMetadataObject) {\n _classCallCheck(this, NumberingPlan);\n\n this.globalMetadataObject = globalMetadataObject;\n this.metadata = metadata;\n setVersion.call(this, globalMetadataObject.metadata);\n }\n\n _createClass(NumberingPlan, [{\n key: \"callingCode\",\n value: function callingCode() {\n return this.metadata[0];\n } // Formatting information for regions which share\n // a country calling code is contained by only one region\n // for performance reasons. For example, for NANPA region\n // (\"North American Numbering Plan Administration\",\n // which includes USA, Canada, Cayman Islands, Bahamas, etc)\n // it will be contained in the metadata for `US`.\n\n }, {\n key: \"getDefaultCountryMetadataForRegion\",\n value: function getDefaultCountryMetadataForRegion() {\n return this.globalMetadataObject.getNumberingPlanMetadata(this.callingCode());\n } // Is always present.\n\n }, {\n key: \"IDDPrefix\",\n value: function IDDPrefix() {\n if (this.v1 || this.v2) return;\n return this.metadata[1];\n } // Is only present when a country supports multiple IDD prefixes.\n\n }, {\n key: \"defaultIDDPrefix\",\n value: function defaultIDDPrefix() {\n if (this.v1 || this.v2) return;\n return this.metadata[12];\n }\n }, {\n key: \"nationalNumberPattern\",\n value: function nationalNumberPattern() {\n if (this.v1 || this.v2) return this.metadata[1];\n return this.metadata[2];\n } // \"possible length\" data is always present in Google's metadata.\n\n }, {\n key: \"possibleLengths\",\n value: function possibleLengths() {\n if (this.v1) return;\n return this.metadata[this.v2 ? 2 : 3];\n }\n }, {\n key: \"_getFormats\",\n value: function _getFormats(metadata) {\n return metadata[this.v1 ? 2 : this.v2 ? 3 : 4];\n } // For countries of the same region (e.g. NANPA)\n // formats are all stored in the \"main\" country for that region.\n // E.g. \"RU\" and \"KZ\", \"US\" and \"CA\".\n\n }, {\n key: \"formats\",\n value: function formats() {\n var _this = this;\n\n var formats = this._getFormats(this.metadata) || this._getFormats(this.getDefaultCountryMetadataForRegion()) || [];\n return formats.map(function (_) {\n return new Format(_, _this);\n });\n }\n }, {\n key: \"nationalPrefix\",\n value: function nationalPrefix() {\n return this.metadata[this.v1 ? 3 : this.v2 ? 4 : 5];\n }\n }, {\n key: \"_getNationalPrefixFormattingRule\",\n value: function _getNationalPrefixFormattingRule(metadata) {\n return metadata[this.v1 ? 4 : this.v2 ? 5 : 6];\n } // For countries of the same region (e.g. NANPA)\n // national prefix formatting rule is stored in the \"main\" country for that region.\n // E.g. \"RU\" and \"KZ\", \"US\" and \"CA\".\n\n }, {\n key: \"nationalPrefixFormattingRule\",\n value: function nationalPrefixFormattingRule() {\n return this._getNationalPrefixFormattingRule(this.metadata) || this._getNationalPrefixFormattingRule(this.getDefaultCountryMetadataForRegion());\n }\n }, {\n key: \"_nationalPrefixForParsing\",\n value: function _nationalPrefixForParsing() {\n return this.metadata[this.v1 ? 5 : this.v2 ? 6 : 7];\n }\n }, {\n key: \"nationalPrefixForParsing\",\n value: function nationalPrefixForParsing() {\n // If `national_prefix_for_parsing` is not set explicitly,\n // then infer it from `national_prefix` (if any)\n return this._nationalPrefixForParsing() || this.nationalPrefix();\n }\n }, {\n key: \"nationalPrefixTransformRule\",\n value: function nationalPrefixTransformRule() {\n return this.metadata[this.v1 ? 6 : this.v2 ? 7 : 8];\n }\n }, {\n key: \"_getNationalPrefixIsOptionalWhenFormatting\",\n value: function _getNationalPrefixIsOptionalWhenFormatting() {\n return !!this.metadata[this.v1 ? 7 : this.v2 ? 8 : 9];\n } // For countries of the same region (e.g. NANPA)\n // \"national prefix is optional when formatting\" flag is\n // stored in the \"main\" country for that region.\n // E.g. \"RU\" and \"KZ\", \"US\" and \"CA\".\n\n }, {\n key: \"nationalPrefixIsOptionalWhenFormattingInNationalFormat\",\n value: function nationalPrefixIsOptionalWhenFormattingInNationalFormat() {\n return this._getNationalPrefixIsOptionalWhenFormatting(this.metadata) || this._getNationalPrefixIsOptionalWhenFormatting(this.getDefaultCountryMetadataForRegion());\n }\n }, {\n key: \"leadingDigits\",\n value: function leadingDigits() {\n return this.metadata[this.v1 ? 8 : this.v2 ? 9 : 10];\n }\n }, {\n key: \"types\",\n value: function types() {\n return this.metadata[this.v1 ? 9 : this.v2 ? 10 : 11];\n }\n }, {\n key: \"hasTypes\",\n value: function hasTypes() {\n // Versions 1.2.0 - 1.2.4: can be `[]`.\n\n /* istanbul ignore next */\n if (this.types() && this.types().length === 0) {\n return false;\n } // Versions <= 1.2.4: can be `undefined`.\n // Version >= 1.2.5: can be `0`.\n\n\n return !!this.types();\n }\n }, {\n key: \"type\",\n value: function type(_type2) {\n if (this.hasTypes() && getType(this.types(), _type2)) {\n return new Type(getType(this.types(), _type2), this);\n }\n }\n }, {\n key: \"ext\",\n value: function ext() {\n if (this.v1 || this.v2) return DEFAULT_EXT_PREFIX;\n return this.metadata[13] || DEFAULT_EXT_PREFIX;\n }\n }]);\n\n return NumberingPlan;\n}();\n\nvar Format = /*#__PURE__*/function () {\n function Format(format, metadata) {\n _classCallCheck(this, Format);\n\n this._format = format;\n this.metadata = metadata;\n }\n\n _createClass(Format, [{\n key: \"pattern\",\n value: function pattern() {\n return this._format[0];\n }\n }, {\n key: \"format\",\n value: function format() {\n return this._format[1];\n }\n }, {\n key: \"leadingDigitsPatterns\",\n value: function leadingDigitsPatterns() {\n return this._format[2] || [];\n }\n }, {\n key: \"nationalPrefixFormattingRule\",\n value: function nationalPrefixFormattingRule() {\n return this._format[3] || this.metadata.nationalPrefixFormattingRule();\n }\n }, {\n key: \"nationalPrefixIsOptionalWhenFormattingInNationalFormat\",\n value: function nationalPrefixIsOptionalWhenFormattingInNationalFormat() {\n return !!this._format[4] || this.metadata.nationalPrefixIsOptionalWhenFormattingInNationalFormat();\n }\n }, {\n key: \"nationalPrefixIsMandatoryWhenFormattingInNationalFormat\",\n value: function nationalPrefixIsMandatoryWhenFormattingInNationalFormat() {\n // National prefix is omitted if there's no national prefix formatting rule\n // set for this country, or when the national prefix formatting rule\n // contains no national prefix itself, or when this rule is set but\n // national prefix is optional for this phone number format\n // (and it is not enforced explicitly)\n return this.usesNationalPrefix() && !this.nationalPrefixIsOptionalWhenFormattingInNationalFormat();\n } // Checks whether national prefix formatting rule contains national prefix.\n\n }, {\n key: \"usesNationalPrefix\",\n value: function usesNationalPrefix() {\n return this.nationalPrefixFormattingRule() && // Check that national prefix formatting rule is not a \"dummy\" one.\n !FIRST_GROUP_ONLY_PREFIX_PATTERN.test(this.nationalPrefixFormattingRule()) // In compressed metadata, `this.nationalPrefixFormattingRule()` is `0`\n // when `national_prefix_formatting_rule` is not present.\n // So, `true` or `false` are returned explicitly here, so that\n // `0` number isn't returned.\n ? true : false;\n }\n }, {\n key: \"internationalFormat\",\n value: function internationalFormat() {\n return this._format[5] || this.format();\n }\n }]);\n\n return Format;\n}();\n/**\r\n * A pattern that is used to determine if the national prefix formatting rule\r\n * has the first group only, i.e., does not start with the national prefix.\r\n * Note that the pattern explicitly allows for unbalanced parentheses.\r\n */\n\n\nvar FIRST_GROUP_ONLY_PREFIX_PATTERN = /^\\(?\\$1\\)?$/;\n\nvar Type = /*#__PURE__*/function () {\n function Type(type, metadata) {\n _classCallCheck(this, Type);\n\n this.type = type;\n this.metadata = metadata;\n }\n\n _createClass(Type, [{\n key: \"pattern\",\n value: function pattern() {\n if (this.metadata.v1) return this.type;\n return this.type[0];\n }\n }, {\n key: \"possibleLengths\",\n value: function possibleLengths() {\n if (this.metadata.v1) return;\n return this.type[1] || this.metadata.possibleLengths();\n }\n }]);\n\n return Type;\n}();\n\nfunction getType(types, type) {\n switch (type) {\n case 'FIXED_LINE':\n return types[0];\n\n case 'MOBILE':\n return types[1];\n\n case 'TOLL_FREE':\n return types[2];\n\n case 'PREMIUM_RATE':\n return types[3];\n\n case 'PERSONAL_NUMBER':\n return types[4];\n\n case 'VOICEMAIL':\n return types[5];\n\n case 'UAN':\n return types[6];\n\n case 'PAGER':\n return types[7];\n\n case 'VOIP':\n return types[8];\n\n case 'SHARED_COST':\n return types[9];\n }\n}\n\nexport function validateMetadata(metadata) {\n if (!metadata) {\n throw new Error('[libphonenumber-js] `metadata` argument not passed. Check your arguments.');\n } // `country_phone_code_to_countries` was renamed to\n // `country_calling_codes` in `1.0.18`.\n\n\n if (!is_object(metadata) || !is_object(metadata.countries)) {\n throw new Error(\"[libphonenumber-js] `metadata` argument was passed but it's not a valid metadata. Must be an object having `.countries` child object property. Got \".concat(is_object(metadata) ? 'an object of shape: { ' + Object.keys(metadata).join(', ') + ' }' : 'a ' + type_of(metadata) + ': ' + metadata, \".\"));\n }\n} // Babel transforms `typeof` into some \"branches\"\n// so istanbul will show this as \"branch not covered\".\n\n/* istanbul ignore next */\n\nvar is_object = function is_object(_) {\n return _typeof(_) === 'object';\n}; // Babel transforms `typeof` into some \"branches\"\n// so istanbul will show this as \"branch not covered\".\n\n/* istanbul ignore next */\n\n\nvar type_of = function type_of(_) {\n return _typeof(_);\n};\n/**\r\n * Returns extension prefix for a country.\r\n * @param {string} country\r\n * @param {object} metadata\r\n * @return {string?}\r\n * @example\r\n * // Returns \" ext. \"\r\n * getExtPrefix(\"US\")\r\n */\n\n\nexport function getExtPrefix(country, metadata) {\n metadata = new Metadata(metadata);\n\n if (metadata.hasCountry(country)) {\n return metadata.country(country).ext();\n }\n\n return DEFAULT_EXT_PREFIX;\n}\n/**\r\n * Returns \"country calling code\" for a country.\r\n * Throws an error if the country doesn't exist or isn't supported by this library.\r\n * @param {string} country\r\n * @param {object} metadata\r\n * @return {string}\r\n * @example\r\n * // Returns \"44\"\r\n * getCountryCallingCode(\"GB\")\r\n */\n\nexport function getCountryCallingCode(country, metadata) {\n metadata = new Metadata(metadata);\n\n if (metadata.hasCountry(country)) {\n return metadata.country(country).countryCallingCode();\n }\n\n throw new Error(\"Unknown country: \".concat(country));\n}\nexport function isSupportedCountry(country, metadata) {\n // metadata = new Metadata(metadata)\n // return metadata.hasCountry(country)\n return metadata.countries[country] !== undefined;\n}\n\nfunction setVersion(metadata) {\n var version = metadata.version;\n\n if (typeof version === 'number') {\n this.v1 = version === 1;\n this.v2 = version === 2;\n this.v3 = version === 3;\n this.v4 = version === 4;\n } else {\n if (!version) {\n this.v1 = true;\n } else if (compare(version, V3) === -1) {\n this.v2 = true;\n } else if (compare(version, V4) === -1) {\n this.v3 = true;\n } else {\n this.v4 = true;\n }\n }\n} // const ISO_COUNTRY_CODE = /^[A-Z]{2}$/\n// function isCountryCode(countryCode) {\n// \treturn ISO_COUNTRY_CODE.test(countryCodeOrCountryCallingCode)\n// }\n//# sourceMappingURL=metadata.js.map","function _createForOfIteratorHelperLoose(o, allowArrayLike) { var it = typeof Symbol !== \"undefined\" && o[Symbol.iterator] || o[\"@@iterator\"]; if (it) return (it = it.call(o)).next.bind(it); if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") { if (it) o = it; var i = 0; return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\n\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\n\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n\nimport { parseDigit } from './helpers/parseDigits.js';\n/**\r\n * Parses phone number characters from a string.\r\n * Drops all punctuation leaving only digits and the leading `+` sign (if any).\r\n * Also converts wide-ascii and arabic-indic numerals to conventional numerals.\r\n * E.g. in Iraq they don't write `+442323234` but rather `+٤٤٢٣٢٣٢٣٤`.\r\n * @param {string} string\r\n * @return {string}\r\n * @example\r\n * ```js\r\n * // Outputs '8800555'.\r\n * parseIncompletePhoneNumber('8 (800) 555')\r\n * // Outputs '+7800555'.\r\n * parseIncompletePhoneNumber('+7 800 555')\r\n * ```\r\n */\n\nexport default function parseIncompletePhoneNumber(string) {\n var result = ''; // Using `.split('')` here instead of normal `for ... of`\n // because the importing application doesn't neccessarily include an ES6 polyfill.\n // The `.split('')` approach discards \"exotic\" UTF-8 characters\n // (the ones consisting of four bytes) but digits\n // (including non-European ones) don't fall into that range\n // so such \"exotic\" characters would be discarded anyway.\n\n for (var _iterator = _createForOfIteratorHelperLoose(string.split('')), _step; !(_step = _iterator()).done;) {\n var character = _step.value;\n result += parsePhoneNumberCharacter(character, result) || '';\n }\n\n return result;\n}\n/**\r\n * Parses next character while parsing phone number digits (including a `+`)\r\n * from text: discards everything except `+` and digits, and `+` is only allowed\r\n * at the start of a phone number.\r\n * For example, is used in `react-phone-number-input` where it uses\r\n * [`input-format`](https://gitlab.com/catamphetamine/input-format).\r\n * @param {string} character - Yet another character from raw input string.\r\n * @param {string?} prevParsedCharacters - Previous parsed characters.\r\n * @param {object} meta - Optional custom use-case-specific metadata.\r\n * @return {string?} The parsed character.\r\n */\n\nexport function parsePhoneNumberCharacter(character, prevParsedCharacters) {\n // Only allow a leading `+`.\n if (character === '+') {\n // If this `+` is not the first parsed character\n // then discard it.\n if (prevParsedCharacters) {\n return;\n }\n\n return '+';\n } // Allow digits.\n\n\n return parseDigit(character);\n}\n//# sourceMappingURL=parseIncompletePhoneNumber.js.map","function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }\n\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\n\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\n\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n\nfunction _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== \"undefined\" && arr[Symbol.iterator] || arr[\"@@iterator\"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"] != null) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; }\n\nfunction _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }\n\nimport parsePhoneNumber_ from './parsePhoneNumber_.js';\nexport default function parsePhoneNumber() {\n var _normalizeArguments = normalizeArguments(arguments),\n text = _normalizeArguments.text,\n options = _normalizeArguments.options,\n metadata = _normalizeArguments.metadata;\n\n return parsePhoneNumber_(text, options, metadata);\n}\nexport function normalizeArguments(args) {\n var _Array$prototype$slic = Array.prototype.slice.call(args),\n _Array$prototype$slic2 = _slicedToArray(_Array$prototype$slic, 4),\n arg_1 = _Array$prototype$slic2[0],\n arg_2 = _Array$prototype$slic2[1],\n arg_3 = _Array$prototype$slic2[2],\n arg_4 = _Array$prototype$slic2[3];\n\n var text;\n var options;\n var metadata; // If the phone number is passed as a string.\n // `parsePhoneNumber('88005553535', ...)`.\n\n if (typeof arg_1 === 'string') {\n text = arg_1;\n } else throw new TypeError('A text for parsing must be a string.'); // If \"default country\" argument is being passed then move it to `options`.\n // `parsePhoneNumber('88005553535', 'RU', [options], metadata)`.\n\n\n if (!arg_2 || typeof arg_2 === 'string') {\n if (arg_4) {\n options = arg_3;\n metadata = arg_4;\n } else {\n options = undefined;\n metadata = arg_3;\n }\n\n if (arg_2) {\n options = _objectSpread({\n defaultCountry: arg_2\n }, options);\n }\n } // `defaultCountry` is not passed.\n // Example: `parsePhoneNumber('+78005553535', [options], metadata)`.\n else if (isObject(arg_2)) {\n if (arg_3) {\n options = arg_2;\n metadata = arg_3;\n } else {\n metadata = arg_2;\n }\n } else throw new Error(\"Invalid second argument: \".concat(arg_2));\n\n return {\n text: text,\n options: options,\n metadata: metadata\n };\n} // Otherwise istanbul would show this as \"branch not covered\".\n\n/* istanbul ignore next */\n\nvar isObject = function isObject(_) {\n return _typeof(_) === 'object';\n};\n//# sourceMappingURL=parsePhoneNumber.js.map","function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nimport parseNumber from './parse_.js';\nexport default function parsePhoneNumber(text, options, metadata) {\n return parseNumber(text, _objectSpread(_objectSpread({}, options), {}, {\n v2: true\n }), metadata);\n}\n//# sourceMappingURL=parsePhoneNumber_.js.map","// This is a port of Google Android `libphonenumber`'s\n// `phonenumberutil.js` of December 31th, 2018.\n//\n// https://github.com/googlei18n/libphonenumber/commits/master/javascript/i18n/phonenumbers/phonenumberutil.js\nimport { VALID_DIGITS, PLUS_CHARS, MIN_LENGTH_FOR_NSN, MAX_LENGTH_FOR_NSN } from './constants.js';\nimport ParseError from './ParseError.js';\nimport Metadata from './metadata.js';\nimport isViablePhoneNumber, { isViablePhoneNumberStart } from './helpers/isViablePhoneNumber.js';\nimport extractExtension from './helpers/extension/extractExtension.js';\nimport parseIncompletePhoneNumber from './parseIncompletePhoneNumber.js';\nimport getCountryCallingCode from './getCountryCallingCode.js';\nimport { isPossibleNumber } from './isPossibleNumber_.js';\nimport { parseRFC3966 } from './helpers/RFC3966.js';\nimport PhoneNumber from './PhoneNumber.js';\nimport matchesEntirely from './helpers/matchesEntirely.js';\nimport extractCountryCallingCode from './helpers/extractCountryCallingCode.js';\nimport extractCountryCallingCodeFromInternationalNumberWithoutPlusSign from './helpers/extractCountryCallingCodeFromInternationalNumberWithoutPlusSign.js';\nimport extractNationalNumber from './helpers/extractNationalNumber.js';\nimport stripIddPrefix from './helpers/stripIddPrefix.js';\nimport getCountryByCallingCode from './helpers/getCountryByCallingCode.js'; // We don't allow input strings for parsing to be longer than 250 chars.\n// This prevents malicious input from consuming CPU.\n\nvar MAX_INPUT_STRING_LENGTH = 250; // This consists of the plus symbol, digits, and arabic-indic digits.\n\nvar PHONE_NUMBER_START_PATTERN = new RegExp('[' + PLUS_CHARS + VALID_DIGITS + ']'); // Regular expression of trailing characters that we want to remove.\n// A trailing `#` is sometimes used when writing phone numbers with extensions in US.\n// Example: \"+1 (645) 123 1234-910#\" number has extension \"910\".\n\nvar AFTER_PHONE_NUMBER_END_PATTERN = new RegExp('[^' + VALID_DIGITS + '#' + ']+$');\nvar USE_NON_GEOGRAPHIC_COUNTRY_CODE = false; // Examples:\n//\n// ```js\n// parse('8 (800) 555-35-35', 'RU')\n// parse('8 (800) 555-35-35', 'RU', metadata)\n// parse('8 (800) 555-35-35', { country: { default: 'RU' } })\n// parse('8 (800) 555-35-35', { country: { default: 'RU' } }, metadata)\n// parse('+7 800 555 35 35')\n// parse('+7 800 555 35 35', metadata)\n// ```\n//\n\nexport default function parse(text, options, metadata) {\n // If assigning the `{}` default value is moved to the arguments above,\n // code coverage would decrease for some weird reason.\n options = options || {};\n metadata = new Metadata(metadata); // Validate `defaultCountry`.\n\n if (options.defaultCountry && !metadata.hasCountry(options.defaultCountry)) {\n if (options.v2) {\n throw new ParseError('INVALID_COUNTRY');\n }\n\n throw new Error(\"Unknown country: \".concat(options.defaultCountry));\n } // Parse the phone number.\n\n\n var _parseInput = parseInput(text, options.v2, options.extract),\n formattedPhoneNumber = _parseInput.number,\n ext = _parseInput.ext,\n error = _parseInput.error; // If the phone number is not viable then return nothing.\n\n\n if (!formattedPhoneNumber) {\n if (options.v2) {\n if (error === 'TOO_SHORT') {\n throw new ParseError('TOO_SHORT');\n }\n\n throw new ParseError('NOT_A_NUMBER');\n }\n\n return {};\n }\n\n var _parsePhoneNumber = parsePhoneNumber(formattedPhoneNumber, options.defaultCountry, options.defaultCallingCode, metadata),\n country = _parsePhoneNumber.country,\n nationalNumber = _parsePhoneNumber.nationalNumber,\n countryCallingCode = _parsePhoneNumber.countryCallingCode,\n carrierCode = _parsePhoneNumber.carrierCode;\n\n if (!metadata.hasSelectedNumberingPlan()) {\n if (options.v2) {\n throw new ParseError('INVALID_COUNTRY');\n }\n\n return {};\n } // Validate national (significant) number length.\n\n\n if (!nationalNumber || nationalNumber.length < MIN_LENGTH_FOR_NSN) {\n // Won't throw here because the regexp already demands length > 1.\n\n /* istanbul ignore if */\n if (options.v2) {\n throw new ParseError('TOO_SHORT');\n } // Google's demo just throws an error in this case.\n\n\n return {};\n } // Validate national (significant) number length.\n //\n // A sidenote:\n //\n // They say that sometimes national (significant) numbers\n // can be longer than `MAX_LENGTH_FOR_NSN` (e.g. in Germany).\n // https://github.com/googlei18n/libphonenumber/blob/7e1748645552da39c4e1ba731e47969d97bdb539/resources/phonenumber.proto#L36\n // Such numbers will just be discarded.\n //\n\n\n if (nationalNumber.length > MAX_LENGTH_FOR_NSN) {\n if (options.v2) {\n throw new ParseError('TOO_LONG');\n } // Google's demo just throws an error in this case.\n\n\n return {};\n }\n\n if (options.v2) {\n var phoneNumber = new PhoneNumber(countryCallingCode, nationalNumber, metadata.metadata);\n\n if (country) {\n phoneNumber.country = country;\n }\n\n if (carrierCode) {\n phoneNumber.carrierCode = carrierCode;\n }\n\n if (ext) {\n phoneNumber.ext = ext;\n }\n\n return phoneNumber;\n } // Check if national phone number pattern matches the number.\n // National number pattern is different for each country,\n // even for those ones which are part of the \"NANPA\" group.\n\n\n var valid = (options.extended ? metadata.hasSelectedNumberingPlan() : country) ? matchesEntirely(nationalNumber, metadata.nationalNumberPattern()) : false;\n\n if (!options.extended) {\n return valid ? result(country, nationalNumber, ext) : {};\n } // isInternational: countryCallingCode !== undefined\n\n\n return {\n country: country,\n countryCallingCode: countryCallingCode,\n carrierCode: carrierCode,\n valid: valid,\n possible: valid ? true : options.extended === true && metadata.possibleLengths() && isPossibleNumber(nationalNumber, metadata) ? true : false,\n phone: nationalNumber,\n ext: ext\n };\n}\n/**\r\n * Extracts a formatted phone number from text.\r\n * Doesn't guarantee that the extracted phone number\r\n * is a valid phone number (for example, doesn't validate its length).\r\n * @param {string} text\r\n * @param {boolean} [extract] — If `false`, then will parse the entire `text` as a phone number.\r\n * @param {boolean} [throwOnError] — By default, it won't throw if the text is too long.\r\n * @return {string}\r\n * @example\r\n * // Returns \"(213) 373-4253\".\r\n * extractFormattedPhoneNumber(\"Call (213) 373-4253 for assistance.\")\r\n */\n\nfunction extractFormattedPhoneNumber(text, extract, throwOnError) {\n if (!text) {\n return;\n }\n\n if (text.length > MAX_INPUT_STRING_LENGTH) {\n if (throwOnError) {\n throw new ParseError('TOO_LONG');\n }\n\n return;\n }\n\n if (extract === false) {\n return text;\n } // Attempt to extract a possible number from the string passed in\n\n\n var startsAt = text.search(PHONE_NUMBER_START_PATTERN);\n\n if (startsAt < 0) {\n return;\n }\n\n return text // Trim everything to the left of the phone number\n .slice(startsAt) // Remove trailing non-numerical characters\n .replace(AFTER_PHONE_NUMBER_END_PATTERN, '');\n}\n/**\r\n * @param {string} text - Input.\r\n * @param {boolean} v2 - Legacy API functions don't pass `v2: true` flag.\r\n * @param {boolean} [extract] - Whether to extract a phone number from `text`, or attempt to parse the entire text as a phone number.\r\n * @return {object} `{ ?number, ?ext }`.\r\n */\n\n\nfunction parseInput(text, v2, extract) {\n // Parse RFC 3966 phone number URI.\n if (text && text.indexOf('tel:') === 0) {\n return parseRFC3966(text);\n }\n\n var number = extractFormattedPhoneNumber(text, extract, v2); // If the phone number is not viable, then abort.\n\n if (!number) {\n return {};\n }\n\n if (!isViablePhoneNumber(number)) {\n if (isViablePhoneNumberStart(number)) {\n return {\n error: 'TOO_SHORT'\n };\n }\n\n return {};\n } // Attempt to parse extension first, since it doesn't require region-specific\n // data and we want to have the non-normalised number here.\n\n\n var withExtensionStripped = extractExtension(number);\n\n if (withExtensionStripped.ext) {\n return withExtensionStripped;\n }\n\n return {\n number: number\n };\n}\n/**\r\n * Creates `parse()` result object.\r\n */\n\n\nfunction result(country, nationalNumber, ext) {\n var result = {\n country: country,\n phone: nationalNumber\n };\n\n if (ext) {\n result.ext = ext;\n }\n\n return result;\n}\n/**\r\n * Parses a viable phone number.\r\n * @param {string} formattedPhoneNumber — Example: \"(213) 373-4253\".\r\n * @param {string} [defaultCountry]\r\n * @param {string} [defaultCallingCode]\r\n * @param {Metadata} metadata\r\n * @return {object} Returns `{ country: string?, countryCallingCode: string?, nationalNumber: string? }`.\r\n */\n\n\nfunction parsePhoneNumber(formattedPhoneNumber, defaultCountry, defaultCallingCode, metadata) {\n // Extract calling code from phone number.\n var _extractCountryCallin = extractCountryCallingCode(parseIncompletePhoneNumber(formattedPhoneNumber), defaultCountry, defaultCallingCode, metadata.metadata),\n countryCallingCode = _extractCountryCallin.countryCallingCode,\n number = _extractCountryCallin.number; // Choose a country by `countryCallingCode`.\n\n\n var country;\n\n if (countryCallingCode) {\n metadata.selectNumberingPlan(countryCallingCode);\n } // If `formattedPhoneNumber` is in \"national\" format\n // then `number` is defined and `countryCallingCode` isn't.\n else if (number && (defaultCountry || defaultCallingCode)) {\n metadata.selectNumberingPlan(defaultCountry, defaultCallingCode);\n\n if (defaultCountry) {\n country = defaultCountry;\n } else {\n /* istanbul ignore if */\n if (USE_NON_GEOGRAPHIC_COUNTRY_CODE) {\n if (metadata.isNonGeographicCallingCode(defaultCallingCode)) {\n country = '001';\n }\n }\n }\n\n countryCallingCode = defaultCallingCode || getCountryCallingCode(defaultCountry, metadata.metadata);\n } else return {};\n\n if (!number) {\n return {\n countryCallingCode: countryCallingCode\n };\n }\n\n var _extractNationalNumbe = extractNationalNumber(parseIncompletePhoneNumber(number), metadata),\n nationalNumber = _extractNationalNumbe.nationalNumber,\n carrierCode = _extractNationalNumbe.carrierCode; // Sometimes there are several countries\n // corresponding to the same country phone code\n // (e.g. NANPA countries all having `1` country phone code).\n // Therefore, to reliably determine the exact country,\n // national (significant) number should have been parsed first.\n //\n // When `metadata.json` is generated, all \"ambiguous\" country phone codes\n // get their countries populated with the full set of\n // \"phone number type\" regular expressions.\n //\n\n\n var exactCountry = getCountryByCallingCode(countryCallingCode, nationalNumber, metadata);\n\n if (exactCountry) {\n country = exactCountry;\n /* istanbul ignore if */\n\n if (exactCountry === '001') {// Can't happen with `USE_NON_GEOGRAPHIC_COUNTRY_CODE` being `false`.\n // If `USE_NON_GEOGRAPHIC_COUNTRY_CODE` is set to `true` for some reason,\n // then remove the \"istanbul ignore if\".\n } else {\n metadata.country(country);\n }\n }\n\n return {\n country: country,\n countryCallingCode: countryCallingCode,\n nationalNumber: nationalNumber,\n carrierCode: carrierCode\n };\n}\n//# sourceMappingURL=parse_.js.map","// Copy-pasted from:\n// https://github.com/substack/semver-compare/blob/master/index.js\n//\n// Inlining this function because some users reported issues with\n// importing from `semver-compare` in a browser with ES6 \"native\" modules.\n//\n// Fixes `semver-compare` not being able to compare versions with alpha/beta/etc \"tags\".\n// https://github.com/catamphetamine/libphonenumber-js/issues/381\nexport default function (a, b) {\n a = a.split('-');\n b = b.split('-');\n var pa = a[0].split('.');\n var pb = b[0].split('.');\n\n for (var i = 0; i < 3; i++) {\n var na = Number(pa[i]);\n var nb = Number(pb[i]);\n if (na > nb) return 1;\n if (nb > na) return -1;\n if (!isNaN(na) && isNaN(nb)) return 1;\n if (isNaN(na) && !isNaN(nb)) return -1;\n }\n\n if (a[1] && b[1]) {\n return a[1] > b[1] ? 1 : a[1] < b[1] ? -1 : 0;\n }\n\n return !a[1] && b[1] ? 1 : a[1] && !b[1] ? -1 : 0;\n}\n//# sourceMappingURL=semver-compare.js.map","import Metadata from './metadata.js';\nimport matchesEntirely from './helpers/matchesEntirely.js';\nimport getNumberType from './helpers/getNumberType.js';\n/**\r\n * Checks if a given phone number is valid.\r\n *\r\n * If the `number` is a string, it will be parsed to an object,\r\n * but only if it contains only valid phone number characters (including punctuation).\r\n * If the `number` is an object, it is used as is.\r\n *\r\n * The optional `defaultCountry` argument is the default country.\r\n * I.e. it does not restrict to just that country,\r\n * e.g. in those cases where several countries share\r\n * the same phone numbering rules (NANPA, Britain, etc).\r\n * For example, even though the number `07624 369230`\r\n * belongs to the Isle of Man (\"IM\" country code)\r\n * calling `isValidNumber('07624369230', 'GB', metadata)`\r\n * still returns `true` because the country is not restricted to `GB`,\r\n * it's just that `GB` is the default one for the phone numbering rules.\r\n * For restricting the country see `isValidNumberForRegion()`\r\n * though restricting a country might not be a good idea.\r\n * https://github.com/googlei18n/libphonenumber/blob/master/FAQ.md#when-should-i-use-isvalidnumberforregion\r\n *\r\n * Examples:\r\n *\r\n * ```js\r\n * isValidNumber('+78005553535', metadata)\r\n * isValidNumber('8005553535', 'RU', metadata)\r\n * isValidNumber('88005553535', 'RU', metadata)\r\n * isValidNumber({ phone: '8005553535', country: 'RU' }, metadata)\r\n * ```\r\n */\n\nexport default function isValidNumber(input, options, metadata) {\n // If assigning the `{}` default value is moved to the arguments above,\n // code coverage would decrease for some weird reason.\n options = options || {};\n metadata = new Metadata(metadata); // This is just to support `isValidNumber({})`\n // for cases when `parseNumber()` returns `{}`.\n\n if (!input.country) {\n return false;\n }\n\n metadata.selectNumberingPlan(input.country, input.countryCallingCode); // By default, countries only have type regexps when it's required for\n // distinguishing different countries having the same `countryCallingCode`.\n\n if (metadata.hasTypes()) {\n return getNumberType(input, options, metadata.metadata) !== undefined;\n } // If there are no type regexps for this country in metadata then use\n // `nationalNumberPattern` as a \"better than nothing\" replacement.\n\n\n var national_number = options.v2 ? input.nationalNumber : input.phone;\n return matchesEntirely(national_number, metadata.nationalNumberPattern());\n}\n//# sourceMappingURL=validate_.js.map","// This file is a workaround for a bug in web browsers' \"native\"\n// ES6 importing system which is uncapable of importing \"*.json\" files.\n// https://github.com/catamphetamine/libphonenumber-js/issues/239\nexport default {\"AC\":\"40123\",\"AD\":\"312345\",\"AE\":\"501234567\",\"AF\":\"701234567\",\"AG\":\"2684641234\",\"AI\":\"2642351234\",\"AL\":\"672123456\",\"AM\":\"77123456\",\"AO\":\"923123456\",\"AR\":\"91123456789\",\"AS\":\"6847331234\",\"AT\":\"664123456\",\"AU\":\"412345678\",\"AW\":\"5601234\",\"AX\":\"412345678\",\"AZ\":\"401234567\",\"BA\":\"61123456\",\"BB\":\"2462501234\",\"BD\":\"1812345678\",\"BE\":\"470123456\",\"BF\":\"70123456\",\"BG\":\"43012345\",\"BH\":\"36001234\",\"BI\":\"79561234\",\"BJ\":\"90011234\",\"BL\":\"690001234\",\"BM\":\"4413701234\",\"BN\":\"7123456\",\"BO\":\"71234567\",\"BQ\":\"3181234\",\"BR\":\"11961234567\",\"BS\":\"2423591234\",\"BT\":\"17123456\",\"BW\":\"71123456\",\"BY\":\"294911911\",\"BZ\":\"6221234\",\"CA\":\"5062345678\",\"CC\":\"412345678\",\"CD\":\"991234567\",\"CF\":\"70012345\",\"CG\":\"061234567\",\"CH\":\"781234567\",\"CI\":\"0123456789\",\"CK\":\"71234\",\"CL\":\"221234567\",\"CM\":\"671234567\",\"CN\":\"13123456789\",\"CO\":\"3211234567\",\"CR\":\"83123456\",\"CU\":\"51234567\",\"CV\":\"9911234\",\"CW\":\"95181234\",\"CX\":\"412345678\",\"CY\":\"96123456\",\"CZ\":\"601123456\",\"DE\":\"15123456789\",\"DJ\":\"77831001\",\"DK\":\"32123456\",\"DM\":\"7672251234\",\"DO\":\"8092345678\",\"DZ\":\"551234567\",\"EC\":\"991234567\",\"EE\":\"51234567\",\"EG\":\"1001234567\",\"EH\":\"650123456\",\"ER\":\"7123456\",\"ES\":\"612345678\",\"ET\":\"911234567\",\"FI\":\"412345678\",\"FJ\":\"7012345\",\"FK\":\"51234\",\"FM\":\"3501234\",\"FO\":\"211234\",\"FR\":\"612345678\",\"GA\":\"06031234\",\"GB\":\"7400123456\",\"GD\":\"4734031234\",\"GE\":\"555123456\",\"GF\":\"694201234\",\"GG\":\"7781123456\",\"GH\":\"231234567\",\"GI\":\"57123456\",\"GL\":\"221234\",\"GM\":\"3012345\",\"GN\":\"601123456\",\"GP\":\"690001234\",\"GQ\":\"222123456\",\"GR\":\"6912345678\",\"GT\":\"51234567\",\"GU\":\"6713001234\",\"GW\":\"955012345\",\"GY\":\"6091234\",\"HK\":\"51234567\",\"HN\":\"91234567\",\"HR\":\"921234567\",\"HT\":\"34101234\",\"HU\":\"201234567\",\"ID\":\"812345678\",\"IE\":\"850123456\",\"IL\":\"502345678\",\"IM\":\"7924123456\",\"IN\":\"8123456789\",\"IO\":\"3801234\",\"IQ\":\"7912345678\",\"IR\":\"9123456789\",\"IS\":\"6111234\",\"IT\":\"3123456789\",\"JE\":\"7797712345\",\"JM\":\"8762101234\",\"JO\":\"790123456\",\"JP\":\"9012345678\",\"KE\":\"712123456\",\"KG\":\"700123456\",\"KH\":\"91234567\",\"KI\":\"72001234\",\"KM\":\"3212345\",\"KN\":\"8697652917\",\"KP\":\"1921234567\",\"KR\":\"1020000000\",\"KW\":\"50012345\",\"KY\":\"3453231234\",\"KZ\":\"7710009998\",\"LA\":\"2023123456\",\"LB\":\"71123456\",\"LC\":\"7582845678\",\"LI\":\"660234567\",\"LK\":\"712345678\",\"LR\":\"770123456\",\"LS\":\"50123456\",\"LT\":\"61234567\",\"LU\":\"628123456\",\"LV\":\"21234567\",\"LY\":\"912345678\",\"MA\":\"650123456\",\"MC\":\"612345678\",\"MD\":\"62112345\",\"ME\":\"67622901\",\"MF\":\"690001234\",\"MG\":\"321234567\",\"MH\":\"2351234\",\"MK\":\"72345678\",\"ML\":\"65012345\",\"MM\":\"92123456\",\"MN\":\"88123456\",\"MO\":\"66123456\",\"MP\":\"6702345678\",\"MQ\":\"696201234\",\"MR\":\"22123456\",\"MS\":\"6644923456\",\"MT\":\"96961234\",\"MU\":\"52512345\",\"MV\":\"7712345\",\"MW\":\"991234567\",\"MX\":\"12221234567\",\"MY\":\"123456789\",\"MZ\":\"821234567\",\"NA\":\"811234567\",\"NC\":\"751234\",\"NE\":\"93123456\",\"NF\":\"381234\",\"NG\":\"8021234567\",\"NI\":\"81234567\",\"NL\":\"612345678\",\"NO\":\"40612345\",\"NP\":\"9841234567\",\"NR\":\"5551234\",\"NU\":\"8884012\",\"NZ\":\"211234567\",\"OM\":\"92123456\",\"PA\":\"61234567\",\"PE\":\"912345678\",\"PF\":\"87123456\",\"PG\":\"70123456\",\"PH\":\"9051234567\",\"PK\":\"3012345678\",\"PL\":\"512345678\",\"PM\":\"551234\",\"PR\":\"7872345678\",\"PS\":\"599123456\",\"PT\":\"912345678\",\"PW\":\"6201234\",\"PY\":\"961456789\",\"QA\":\"33123456\",\"RE\":\"692123456\",\"RO\":\"712034567\",\"RS\":\"601234567\",\"RU\":\"9123456789\",\"RW\":\"720123456\",\"SA\":\"512345678\",\"SB\":\"7421234\",\"SC\":\"2510123\",\"SD\":\"911231234\",\"SE\":\"701234567\",\"SG\":\"81234567\",\"SH\":\"51234\",\"SI\":\"31234567\",\"SJ\":\"41234567\",\"SK\":\"912123456\",\"SL\":\"25123456\",\"SM\":\"66661212\",\"SN\":\"701234567\",\"SO\":\"71123456\",\"SR\":\"7412345\",\"SS\":\"977123456\",\"ST\":\"9812345\",\"SV\":\"70123456\",\"SX\":\"7215205678\",\"SY\":\"944567890\",\"SZ\":\"76123456\",\"TA\":\"8999\",\"TC\":\"6492311234\",\"TD\":\"63012345\",\"TG\":\"90112345\",\"TH\":\"812345678\",\"TJ\":\"917123456\",\"TK\":\"7290\",\"TL\":\"77212345\",\"TM\":\"66123456\",\"TN\":\"20123456\",\"TO\":\"7715123\",\"TR\":\"5012345678\",\"TT\":\"8682911234\",\"TV\":\"901234\",\"TW\":\"912345678\",\"TZ\":\"621234567\",\"UA\":\"501234567\",\"UG\":\"712345678\",\"US\":\"2015550123\",\"UY\":\"94231234\",\"UZ\":\"912345678\",\"VA\":\"3123456789\",\"VC\":\"7844301234\",\"VE\":\"4121234567\",\"VG\":\"2843001234\",\"VI\":\"3406421234\",\"VN\":\"912345678\",\"VU\":\"5912345\",\"WF\":\"821234\",\"WS\":\"7212345\",\"XK\":\"43201234\",\"YE\":\"712345678\",\"YT\":\"639012345\",\"ZA\":\"711234567\",\"ZM\":\"955123456\",\"ZW\":\"712345678\"}","// This file is a workaround for a bug in web browsers' \"native\"\n// ES6 importing system which is uncapable of importing \"*.json\" files.\n// https://github.com/catamphetamine/libphonenumber-js/issues/239\nexport default {\"version\":4,\"country_calling_codes\":{\"1\":[\"US\",\"AG\",\"AI\",\"AS\",\"BB\",\"BM\",\"BS\",\"CA\",\"DM\",\"DO\",\"GD\",\"GU\",\"JM\",\"KN\",\"KY\",\"LC\",\"MP\",\"MS\",\"PR\",\"SX\",\"TC\",\"TT\",\"VC\",\"VG\",\"VI\"],\"7\":[\"RU\",\"KZ\"],\"20\":[\"EG\"],\"27\":[\"ZA\"],\"30\":[\"GR\"],\"31\":[\"NL\"],\"32\":[\"BE\"],\"33\":[\"FR\"],\"34\":[\"ES\"],\"36\":[\"HU\"],\"39\":[\"IT\",\"VA\"],\"40\":[\"RO\"],\"41\":[\"CH\"],\"43\":[\"AT\"],\"44\":[\"GB\",\"GG\",\"IM\",\"JE\"],\"45\":[\"DK\"],\"46\":[\"SE\"],\"47\":[\"NO\",\"SJ\"],\"48\":[\"PL\"],\"49\":[\"DE\"],\"51\":[\"PE\"],\"52\":[\"MX\"],\"53\":[\"CU\"],\"54\":[\"AR\"],\"55\":[\"BR\"],\"56\":[\"CL\"],\"57\":[\"CO\"],\"58\":[\"VE\"],\"60\":[\"MY\"],\"61\":[\"AU\",\"CC\",\"CX\"],\"62\":[\"ID\"],\"63\":[\"PH\"],\"64\":[\"NZ\"],\"65\":[\"SG\"],\"66\":[\"TH\"],\"81\":[\"JP\"],\"82\":[\"KR\"],\"84\":[\"VN\"],\"86\":[\"CN\"],\"90\":[\"TR\"],\"91\":[\"IN\"],\"92\":[\"PK\"],\"93\":[\"AF\"],\"94\":[\"LK\"],\"95\":[\"MM\"],\"98\":[\"IR\"],\"211\":[\"SS\"],\"212\":[\"MA\",\"EH\"],\"213\":[\"DZ\"],\"216\":[\"TN\"],\"218\":[\"LY\"],\"220\":[\"GM\"],\"221\":[\"SN\"],\"222\":[\"MR\"],\"223\":[\"ML\"],\"224\":[\"GN\"],\"225\":[\"CI\"],\"226\":[\"BF\"],\"227\":[\"NE\"],\"228\":[\"TG\"],\"229\":[\"BJ\"],\"230\":[\"MU\"],\"231\":[\"LR\"],\"232\":[\"SL\"],\"233\":[\"GH\"],\"234\":[\"NG\"],\"235\":[\"TD\"],\"236\":[\"CF\"],\"237\":[\"CM\"],\"238\":[\"CV\"],\"239\":[\"ST\"],\"240\":[\"GQ\"],\"241\":[\"GA\"],\"242\":[\"CG\"],\"243\":[\"CD\"],\"244\":[\"AO\"],\"245\":[\"GW\"],\"246\":[\"IO\"],\"247\":[\"AC\"],\"248\":[\"SC\"],\"249\":[\"SD\"],\"250\":[\"RW\"],\"251\":[\"ET\"],\"252\":[\"SO\"],\"253\":[\"DJ\"],\"254\":[\"KE\"],\"255\":[\"TZ\"],\"256\":[\"UG\"],\"257\":[\"BI\"],\"258\":[\"MZ\"],\"260\":[\"ZM\"],\"261\":[\"MG\"],\"262\":[\"RE\",\"YT\"],\"263\":[\"ZW\"],\"264\":[\"NA\"],\"265\":[\"MW\"],\"266\":[\"LS\"],\"267\":[\"BW\"],\"268\":[\"SZ\"],\"269\":[\"KM\"],\"290\":[\"SH\",\"TA\"],\"291\":[\"ER\"],\"297\":[\"AW\"],\"298\":[\"FO\"],\"299\":[\"GL\"],\"350\":[\"GI\"],\"351\":[\"PT\"],\"352\":[\"LU\"],\"353\":[\"IE\"],\"354\":[\"IS\"],\"355\":[\"AL\"],\"356\":[\"MT\"],\"357\":[\"CY\"],\"358\":[\"FI\",\"AX\"],\"359\":[\"BG\"],\"370\":[\"LT\"],\"371\":[\"LV\"],\"372\":[\"EE\"],\"373\":[\"MD\"],\"374\":[\"AM\"],\"375\":[\"BY\"],\"376\":[\"AD\"],\"377\":[\"MC\"],\"378\":[\"SM\"],\"380\":[\"UA\"],\"381\":[\"RS\"],\"382\":[\"ME\"],\"383\":[\"XK\"],\"385\":[\"HR\"],\"386\":[\"SI\"],\"387\":[\"BA\"],\"389\":[\"MK\"],\"420\":[\"CZ\"],\"421\":[\"SK\"],\"423\":[\"LI\"],\"500\":[\"FK\"],\"501\":[\"BZ\"],\"502\":[\"GT\"],\"503\":[\"SV\"],\"504\":[\"HN\"],\"505\":[\"NI\"],\"506\":[\"CR\"],\"507\":[\"PA\"],\"508\":[\"PM\"],\"509\":[\"HT\"],\"590\":[\"GP\",\"BL\",\"MF\"],\"591\":[\"BO\"],\"592\":[\"GY\"],\"593\":[\"EC\"],\"594\":[\"GF\"],\"595\":[\"PY\"],\"596\":[\"MQ\"],\"597\":[\"SR\"],\"598\":[\"UY\"],\"599\":[\"CW\",\"BQ\"],\"670\":[\"TL\"],\"672\":[\"NF\"],\"673\":[\"BN\"],\"674\":[\"NR\"],\"675\":[\"PG\"],\"676\":[\"TO\"],\"677\":[\"SB\"],\"678\":[\"VU\"],\"679\":[\"FJ\"],\"680\":[\"PW\"],\"681\":[\"WF\"],\"682\":[\"CK\"],\"683\":[\"NU\"],\"685\":[\"WS\"],\"686\":[\"KI\"],\"687\":[\"NC\"],\"688\":[\"TV\"],\"689\":[\"PF\"],\"690\":[\"TK\"],\"691\":[\"FM\"],\"692\":[\"MH\"],\"850\":[\"KP\"],\"852\":[\"HK\"],\"853\":[\"MO\"],\"855\":[\"KH\"],\"856\":[\"LA\"],\"880\":[\"BD\"],\"886\":[\"TW\"],\"960\":[\"MV\"],\"961\":[\"LB\"],\"962\":[\"JO\"],\"963\":[\"SY\"],\"964\":[\"IQ\"],\"965\":[\"KW\"],\"966\":[\"SA\"],\"967\":[\"YE\"],\"968\":[\"OM\"],\"970\":[\"PS\"],\"971\":[\"AE\"],\"972\":[\"IL\"],\"973\":[\"BH\"],\"974\":[\"QA\"],\"975\":[\"BT\"],\"976\":[\"MN\"],\"977\":[\"NP\"],\"992\":[\"TJ\"],\"993\":[\"TM\"],\"994\":[\"AZ\"],\"995\":[\"GE\"],\"996\":[\"KG\"],\"998\":[\"UZ\"]},\"countries\":{\"AC\":[\"247\",\"00\",\"(?:[01589]\\\\d|[46])\\\\d{4}\",[5,6],0,0,0,0,0,0,0,[0,[\"4\\\\d{4}\",[5]]]],\"AD\":[\"376\",\"00\",\"(?:1|6\\\\d)\\\\d{7}|[135-9]\\\\d{5}\",[6,8,9],[[\"(\\\\d{3})(\\\\d{3})\",\"$1 $2\",[\"[135-9]\"]],[\"(\\\\d{4})(\\\\d{4})\",\"$1 $2\",[\"1\"]],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"6\"]]],0,0,0,0,0,0,[0,[\"690\\\\d{6}|[356]\\\\d{5}\",[6,9]]]],\"AE\":[\"971\",\"00\",\"(?:[4-7]\\\\d|9[0-689])\\\\d{7}|800\\\\d{2,9}|[2-4679]\\\\d{7}\",[5,6,7,8,9,10,11,12],[[\"(\\\\d{3})(\\\\d{2,9})\",\"$1 $2\",[\"60|8\"]],[\"(\\\\d)(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"[236]|[479][2-8]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d)(\\\\d{5})\",\"$1 $2 $3\",[\"[479]\"]],[\"(\\\\d{2})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"5\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"5[024-68]\\\\d{7}\",[9]]]],\"AF\":[\"93\",\"00\",\"[2-7]\\\\d{8}\",[9],[[\"(\\\\d{2})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"[2-7]\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"7\\\\d{8}\"]]],\"AG\":[\"1\",\"011\",\"(?:268|[58]\\\\d\\\\d|900)\\\\d{7}\",[10],0,\"1\",0,\"1|([457]\\\\d{6})$\",\"268$1\",0,\"268\",[0,[\"268(?:464|7(?:1[3-9]|[28]\\\\d|3[0246]|64|7[0-689]))\\\\d{4}\"]]],\"AI\":[\"1\",\"011\",\"(?:264|[58]\\\\d\\\\d|900)\\\\d{7}\",[10],0,\"1\",0,\"1|([2457]\\\\d{6})$\",\"264$1\",0,\"264\",[0,[\"264(?:235|4(?:69|76)|5(?:3[6-9]|8[1-4])|7(?:29|72))\\\\d{4}\"]]],\"AL\":[\"355\",\"00\",\"(?:700\\\\d\\\\d|900)\\\\d{3}|8\\\\d{5,7}|(?:[2-5]|6\\\\d)\\\\d{7}\",[6,7,8,9],[[\"(\\\\d{3})(\\\\d{3,4})\",\"$1 $2\",[\"80|9\"],\"0$1\"],[\"(\\\\d)(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"4[2-6]\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"[2358][2-5]|4\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{5})\",\"$1 $2\",[\"[23578]\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"6\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"6(?:[78][2-9]|9\\\\d)\\\\d{6}\",[9]]]],\"AM\":[\"374\",\"00\",\"(?:[1-489]\\\\d|55|60|77)\\\\d{6}\",[8],[[\"(\\\\d{3})(\\\\d{2})(\\\\d{3})\",\"$1 $2 $3\",[\"[89]0\"],\"0 $1\"],[\"(\\\\d{3})(\\\\d{5})\",\"$1 $2\",[\"2|3[12]\"],\"(0$1)\"],[\"(\\\\d{2})(\\\\d{6})\",\"$1 $2\",[\"1|47\"],\"(0$1)\"],[\"(\\\\d{2})(\\\\d{6})\",\"$1 $2\",[\"[3-9]\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"(?:33|4[1349]|55|77|88|9[13-9])\\\\d{6}\"]]],\"AO\":[\"244\",\"00\",\"[29]\\\\d{8}\",[9],[[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"[29]\"]]],0,0,0,0,0,0,[0,[\"9[1-59]\\\\d{7}\"]]],\"AR\":[\"54\",\"00\",\"(?:11|[89]\\\\d\\\\d)\\\\d{8}|[2368]\\\\d{9}\",[10,11],[[\"(\\\\d{4})(\\\\d{2})(\\\\d{4})\",\"$1 $2-$3\",[\"2(?:2[024-9]|3[0-59]|47|6[245]|9[02-8])|3(?:3[28]|4[03-9]|5[2-46-8]|7[1-578]|8[2-9])\",\"2(?:[23]02|6(?:[25]|4[6-8])|9(?:[02356]|4[02568]|72|8[23]))|3(?:3[28]|4(?:[04679]|3[5-8]|5[4-68]|8[2379])|5(?:[2467]|3[237]|8[2-5])|7[1-578]|8(?:[2469]|3[2578]|5[4-8]|7[36-8]|8[5-8]))|2(?:2[24-9]|3[1-59]|47)\",\"2(?:[23]02|6(?:[25]|4(?:64|[78]))|9(?:[02356]|4(?:[0268]|5[2-6])|72|8[23]))|3(?:3[28]|4(?:[04679]|3[78]|5(?:4[46]|8)|8[2379])|5(?:[2467]|3[237]|8[23])|7[1-578]|8(?:[2469]|3[278]|5[56][46]|86[3-6]))|2(?:2[24-9]|3[1-59]|47)|38(?:[58][78]|7[378])|3(?:4[35][56]|58[45]|8(?:[38]5|54|76))[4-6]\",\"2(?:[23]02|6(?:[25]|4(?:64|[78]))|9(?:[02356]|4(?:[0268]|5[2-6])|72|8[23]))|3(?:3[28]|4(?:[04679]|3(?:5(?:4[0-25689]|[56])|[78])|58|8[2379])|5(?:[2467]|3[237]|8(?:[23]|4(?:[45]|60)|5(?:4[0-39]|5|64)))|7[1-578]|8(?:[2469]|3[278]|54(?:4|5[13-7]|6[89])|86[3-6]))|2(?:2[24-9]|3[1-59]|47)|38(?:[58][78]|7[378])|3(?:454|85[56])[46]|3(?:4(?:36|5[56])|8(?:[38]5|76))[4-6]\"],\"0$1\",1],[\"(\\\\d{2})(\\\\d{4})(\\\\d{4})\",\"$1 $2-$3\",[\"1\"],\"0$1\",1],[\"(\\\\d{3})(\\\\d{3})(\\\\d{4})\",\"$1-$2-$3\",[\"[68]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{4})\",\"$1 $2-$3\",[\"[23]\"],\"0$1\",1],[\"(\\\\d)(\\\\d{4})(\\\\d{2})(\\\\d{4})\",\"$2 15-$3-$4\",[\"9(?:2[2-469]|3[3-578])\",\"9(?:2(?:2[024-9]|3[0-59]|47|6[245]|9[02-8])|3(?:3[28]|4[03-9]|5[2-46-8]|7[1-578]|8[2-9]))\",\"9(?:2(?:[23]02|6(?:[25]|4[6-8])|9(?:[02356]|4[02568]|72|8[23]))|3(?:3[28]|4(?:[04679]|3[5-8]|5[4-68]|8[2379])|5(?:[2467]|3[237]|8[2-5])|7[1-578]|8(?:[2469]|3[2578]|5[4-8]|7[36-8]|8[5-8])))|92(?:2[24-9]|3[1-59]|47)\",\"9(?:2(?:[23]02|6(?:[25]|4(?:64|[78]))|9(?:[02356]|4(?:[0268]|5[2-6])|72|8[23]))|3(?:3[28]|4(?:[04679]|3[78]|5(?:4[46]|8)|8[2379])|5(?:[2467]|3[237]|8[23])|7[1-578]|8(?:[2469]|3[278]|5(?:[56][46]|[78])|7[378]|8(?:6[3-6]|[78]))))|92(?:2[24-9]|3[1-59]|47)|93(?:4[35][56]|58[45]|8(?:[38]5|54|76))[4-6]\",\"9(?:2(?:[23]02|6(?:[25]|4(?:64|[78]))|9(?:[02356]|4(?:[0268]|5[2-6])|72|8[23]))|3(?:3[28]|4(?:[04679]|3(?:5(?:4[0-25689]|[56])|[78])|5(?:4[46]|8)|8[2379])|5(?:[2467]|3[237]|8(?:[23]|4(?:[45]|60)|5(?:4[0-39]|5|64)))|7[1-578]|8(?:[2469]|3[278]|5(?:4(?:4|5[13-7]|6[89])|[56][46]|[78])|7[378]|8(?:6[3-6]|[78]))))|92(?:2[24-9]|3[1-59]|47)|93(?:4(?:36|5[56])|8(?:[38]5|76))[4-6]\"],\"0$1\",0,\"$1 $2 $3-$4\"],[\"(\\\\d)(\\\\d{2})(\\\\d{4})(\\\\d{4})\",\"$2 15-$3-$4\",[\"91\"],\"0$1\",0,\"$1 $2 $3-$4\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{5})\",\"$1-$2-$3\",[\"8\"],\"0$1\"],[\"(\\\\d)(\\\\d{3})(\\\\d{3})(\\\\d{4})\",\"$2 15-$3-$4\",[\"9\"],\"0$1\",0,\"$1 $2 $3-$4\"]],\"0\",0,\"0?(?:(11|2(?:2(?:02?|[13]|2[13-79]|4[1-6]|5[2457]|6[124-8]|7[1-4]|8[13-6]|9[1267])|3(?:02?|1[467]|2[03-6]|3[13-8]|[49][2-6]|5[2-8]|[67])|4(?:7[3-578]|9)|6(?:[0136]|2[24-6]|4[6-8]?|5[15-8])|80|9(?:0[1-3]|[19]|2\\\\d|3[1-6]|4[02568]?|5[2-4]|6[2-46]|72?|8[23]?))|3(?:3(?:2[79]|6|8[2578])|4(?:0[0-24-9]|[12]|3[5-8]?|4[24-7]|5[4-68]?|6[02-9]|7[126]|8[2379]?|9[1-36-8])|5(?:1|2[1245]|3[237]?|4[1-46-9]|6[2-4]|7[1-6]|8[2-5]?)|6[24]|7(?:[069]|1[1568]|2[15]|3[145]|4[13]|5[14-8]|7[2-57]|8[126])|8(?:[01]|2[15-7]|3[2578]?|4[13-6]|5[4-8]?|6[1-357-9]|7[36-8]?|8[5-8]?|9[124])))15)?\",\"9$1\",0,0,[0,[\"93(?:7(?:1[15]|81)[46]|8(?:(?:21|4[16]|69|9[12])[46]|88[013-9]))\\\\d{5}|9(?:29(?:54|66)|3(?:7(?:55|77)|865))[2-8]\\\\d{5}|9(?:2(?:2(?:2[59]|44|52)|3(?:26|44)|473|9(?:[07]2|2[26]|34|46))|3327)[45]\\\\d{5}|9(?:2(?:284|3(?:02|23)|657|920)|3(?:4(?:8[27]|92)|541|878))[2-7]\\\\d{5}|9(?:2(?:(?:26|62)2|320|477|9(?:42|83))|3(?:329|4(?:[47]6|62|89)|564))[2-6]\\\\d{5}|(?:675\\\\d|9(?:11[1-8]\\\\d|2(?:2(?:0[45]|1[2-6]|3[3-6])|3(?:[06]4|7[45])|494|6(?:04|1[2-8]|[36][45]|4[3-6])|80[45]|9(?:[17][4-6]|[48][45]|9[3-6]))|3(?:364|4(?:1[2-7]|[235][4-6]|84)|5(?:1[2-9]|[38][4-6])|6(?:2[45]|44)|7[069][45]|8(?:0[45]|[17][2-6]|3[4-6]|[58][3-6]))))\\\\d{6}|92(?:2(?:21|4[23]|6[145]|7[1-4]|8[356]|9[267])|3(?:16|3[13-8]|43|5[346-8]|9[3-5])|475|6(?:2[46]|4[78]|5[1568])|9(?:03|2[1457-9]|3[1356]|4[08]|[56][23]|82))4\\\\d{5}|9(?:2(?:2(?:57|81)|3(?:24|46|92)|9(?:01|23|64))|3(?:4(?:42|71)|5(?:25|37|4[347]|71)|7(?:18|5[17])))[3-6]\\\\d{5}|9(?:2(?:2(?:02|2[3467]|4[156]|5[45]|6[6-8]|91)|3(?:1[47]|25|[45][25]|96)|47[48]|625|932)|3(?:38[2578]|4(?:0[0-24-9]|3[78]|4[457]|58|6[03-9]|72|83|9[136-8])|5(?:2[124]|[368][23]|4[2689]|7[2-6])|7(?:16|2[15]|3[145]|4[13]|5[468]|7[2-5]|8[26])|8(?:2[5-7]|3[278]|4[3-5]|5[78]|6[1-378]|[78]7|94)))[4-6]\\\\d{5}\"]]],\"AS\":[\"1\",\"011\",\"(?:[58]\\\\d\\\\d|684|900)\\\\d{7}\",[10],0,\"1\",0,\"1|([267]\\\\d{6})$\",\"684$1\",0,\"684\",[0,[\"684(?:2(?:48|5[2468]|7[26])|7(?:3[13]|70|82))\\\\d{4}\"]]],\"AT\":[\"43\",\"00\",\"1\\\\d{3,12}|2\\\\d{6,12}|43(?:(?:0\\\\d|5[02-9])\\\\d{3,9}|2\\\\d{4,5}|[3467]\\\\d{4}|8\\\\d{4,6}|9\\\\d{4,7})|5\\\\d{4,12}|8\\\\d{7,12}|9\\\\d{8,12}|(?:[367]\\\\d|4[0-24-9])\\\\d{4,11}\",[4,5,6,7,8,9,10,11,12,13],[[\"(\\\\d)(\\\\d{3,12})\",\"$1 $2\",[\"1(?:11|[2-9])\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{2})\",\"$1 $2\",[\"517\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3,5})\",\"$1 $2\",[\"5[079]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3,10})\",\"$1 $2\",[\"(?:31|4)6|51|6(?:5[0-3579]|[6-9])|7(?:20|32|8)|[89]\"],\"0$1\"],[\"(\\\\d{4})(\\\\d{3,9})\",\"$1 $2\",[\"[2-467]|5[2-6]\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{3,4})\",\"$1 $2 $3\",[\"5\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{4})(\\\\d{4,7})\",\"$1 $2 $3\",[\"5\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"6(?:5[0-3579]|6[013-9]|[7-9]\\\\d)\\\\d{4,10}\",[7,8,9,10,11,12,13]]]],\"AU\":[\"61\",\"001[14-689]|14(?:1[14]|34|4[17]|[56]6|7[47]|88)0011\",\"1(?:[0-79]\\\\d{7}(?:\\\\d(?:\\\\d{2})?)?|8[0-24-9]\\\\d{7})|[2-478]\\\\d{8}|1\\\\d{4,7}\",[5,6,7,8,9,10,12],[[\"(\\\\d{2})(\\\\d{3,4})\",\"$1 $2\",[\"16\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{2,4})\",\"$1 $2 $3\",[\"16\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"14|4\"],\"0$1\"],[\"(\\\\d)(\\\\d{4})(\\\\d{4})\",\"$1 $2 $3\",[\"[2378]\"],\"(0$1)\"],[\"(\\\\d{4})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"1(?:30|[89])\"]]],\"0\",0,\"0|(183[12])\",0,0,0,[0,[\"4(?:83[0-389]|93[0-6])\\\\d{5}|4(?:[0-3]\\\\d|4[047-9]|5[0-25-9]|6[016-9]|7[02-9]|8[0-24-9]|9[0-27-9])\\\\d{6}\",[9]]],\"0011\"],\"AW\":[\"297\",\"00\",\"(?:[25-79]\\\\d\\\\d|800)\\\\d{4}\",[7],[[\"(\\\\d{3})(\\\\d{4})\",\"$1 $2\",[\"[25-9]\"]]],0,0,0,0,0,0,[0,[\"(?:290|5[69]\\\\d|6(?:[03]0|22|4[0-2]|[69]\\\\d)|7(?:[34]\\\\d|7[07])|9(?:6[45]|9[4-8]))\\\\d{4}\"]]],\"AX\":[\"358\",\"00|99(?:[01469]|5(?:[14]1|3[23]|5[59]|77|88|9[09]))\",\"2\\\\d{4,9}|35\\\\d{4,5}|(?:60\\\\d\\\\d|800)\\\\d{4,6}|7\\\\d{5,11}|(?:[14]\\\\d|3[0-46-9]|50)\\\\d{4,8}\",[5,6,7,8,9,10,11,12],0,\"0\",0,0,0,0,\"18\",[0,[\"4946\\\\d{2,6}|(?:4[0-8]|50)\\\\d{4,8}\",[6,7,8,9,10]]],\"00\"],\"AZ\":[\"994\",\"00\",\"365\\\\d{6}|(?:[124579]\\\\d|60|88)\\\\d{7}\",[9],[[\"(\\\\d{3})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"90\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"1[28]|2|365|46\",\"1[28]|2|365[45]|46\",\"1[28]|2|365(?:4|5[02])|46\"],\"(0$1)\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"[13-9]\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"36554\\\\d{4}|(?:[16]0|4[04]|5[015]|7[07]|99)\\\\d{7}\"]]],\"BA\":[\"387\",\"00\",\"6\\\\d{8}|(?:[35689]\\\\d|49|70)\\\\d{6}\",[8,9],[[\"(\\\\d{2})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"6[1-3]|[7-9]\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{3})\",\"$1 $2-$3\",[\"[3-5]|6[56]\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{2})(\\\\d{2})(\\\\d{3})\",\"$1 $2 $3 $4\",[\"6\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"6040\\\\d{5}|6(?:03|[1-356]|44|7\\\\d)\\\\d{6}\"]]],\"BB\":[\"1\",\"011\",\"(?:246|[58]\\\\d\\\\d|900)\\\\d{7}\",[10],0,\"1\",0,\"1|([2-9]\\\\d{6})$\",\"246$1\",0,\"246\",[0,[\"246(?:(?:2(?:[3568]\\\\d|4[0-57-9])|3(?:5[2-9]|6[0-6])|4(?:46|5\\\\d)|69[5-7]|8(?:[2-5]\\\\d|83))\\\\d|52(?:1[147]|20))\\\\d{3}\"]]],\"BD\":[\"880\",\"00\",\"[1-469]\\\\d{9}|8[0-79]\\\\d{7,8}|[2-79]\\\\d{8}|[2-9]\\\\d{7}|[3-9]\\\\d{6}|[57-9]\\\\d{5}\",[6,7,8,9,10],[[\"(\\\\d{2})(\\\\d{4,6})\",\"$1-$2\",[\"31[5-8]|[459]1\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3,7})\",\"$1-$2\",[\"3(?:[67]|8[013-9])|4(?:6[168]|7|[89][18])|5(?:6[128]|9)|6(?:28|4[14]|5)|7[2-589]|8(?:0[014-9]|[12])|9[358]|(?:3[2-5]|4[235]|5[2-578]|6[0389]|76|8[3-7]|9[24])1|(?:44|66)[01346-9]\"],\"0$1\"],[\"(\\\\d{4})(\\\\d{3,6})\",\"$1-$2\",[\"[13-9]|22\"],\"0$1\"],[\"(\\\\d)(\\\\d{7,8})\",\"$1-$2\",[\"2\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"(?:1[13-9]\\\\d|644)\\\\d{7}|(?:3[78]|44|66)[02-9]\\\\d{7}\",[10]]]],\"BE\":[\"32\",\"00\",\"4\\\\d{8}|[1-9]\\\\d{7}\",[8,9],[[\"(\\\\d{3})(\\\\d{2})(\\\\d{3})\",\"$1 $2 $3\",[\"(?:80|9)0\"],\"0$1\"],[\"(\\\\d)(\\\\d{3})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"[239]|4[23]\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"[15-8]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"4\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"4[5-9]\\\\d{7}\",[9]]]],\"BF\":[\"226\",\"00\",\"[025-7]\\\\d{7}\",[8],[[\"(\\\\d{2})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"[025-7]\"]]],0,0,0,0,0,0,[0,[\"(?:0[1-35-7]|5[1-8]|[67]\\\\d)\\\\d{6}\"]]],\"BG\":[\"359\",\"00\",\"00800\\\\d{7}|[2-7]\\\\d{6,7}|[89]\\\\d{6,8}|2\\\\d{5}\",[6,7,8,9,12],[[\"(\\\\d)(\\\\d)(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"2\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{4})\",\"$1 $2\",[\"43[1-6]|70[1-9]\"],\"0$1\"],[\"(\\\\d)(\\\\d{3})(\\\\d{3,4})\",\"$1 $2 $3\",[\"2\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{2,3})\",\"$1 $2 $3\",[\"[356]|4[124-7]|7[1-9]|8[1-6]|9[1-7]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{2})(\\\\d{3})\",\"$1 $2 $3\",[\"(?:70|8)0\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{2})\",\"$1 $2 $3\",[\"43[1-7]|7\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{3,4})\",\"$1 $2 $3\",[\"[48]|9[08]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"9\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"(?:43[07-9]|99[69]\\\\d)\\\\d{5}|(?:8[7-9]|98)\\\\d{7}\",[8,9]]]],\"BH\":[\"973\",\"00\",\"[136-9]\\\\d{7}\",[8],[[\"(\\\\d{4})(\\\\d{4})\",\"$1 $2\",[\"[13679]|8[047]\"]]],0,0,0,0,0,0,[0,[\"(?:3(?:[1-79]\\\\d|8[0-47-9])\\\\d|6(?:3(?:00|33|6[16])|6(?:3[03-9]|[69]\\\\d|7[0-6])))\\\\d{4}\"]]],\"BI\":[\"257\",\"00\",\"(?:[267]\\\\d|31)\\\\d{6}\",[8],[[\"(\\\\d{2})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"[2367]\"]]],0,0,0,0,0,0,[0,[\"(?:29|[67][125-9])\\\\d{6}\"]]],\"BJ\":[\"229\",\"00\",\"[24-689]\\\\d{7}\",[8],[[\"(\\\\d{2})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"[24-689]\"]]],0,0,0,0,0,0,[0,[\"(?:4[01]|5[1-9]|6\\\\d|9[013-9])\\\\d{6}\"]]],\"BL\":[\"590\",\"00\",\"(?:590|(?:69|80)\\\\d|976)\\\\d{6}\",[9],0,\"0\",0,0,0,0,0,[0,[\"69(?:0\\\\d\\\\d|1(?:2[2-9]|3[0-5]))\\\\d{4}\"]]],\"BM\":[\"1\",\"011\",\"(?:441|[58]\\\\d\\\\d|900)\\\\d{7}\",[10],0,\"1\",0,\"1|([2-9]\\\\d{6})$\",\"441$1\",0,\"441\",[0,[\"441(?:[2378]\\\\d|5[0-39]|92)\\\\d{5}\"]]],\"BN\":[\"673\",\"00\",\"[2-578]\\\\d{6}\",[7],[[\"(\\\\d{3})(\\\\d{4})\",\"$1 $2\",[\"[2-578]\"]]],0,0,0,0,0,0,[0,[\"(?:22[89]|[78]\\\\d\\\\d)\\\\d{4}\"]]],\"BO\":[\"591\",\"00(?:1\\\\d)?\",\"(?:[2-467]\\\\d\\\\d|8001)\\\\d{5}\",[8,9],[[\"(\\\\d)(\\\\d{7})\",\"$1 $2\",[\"[23]|4[46]\"]],[\"(\\\\d{8})\",\"$1\",[\"[67]\"]],[\"(\\\\d{3})(\\\\d{2})(\\\\d{4})\",\"$1 $2 $3\",[\"8\"]]],\"0\",0,\"0(1\\\\d)?\",0,0,0,[0,[\"[67]\\\\d{7}\",[8]]]],\"BQ\":[\"599\",\"00\",\"(?:[34]1|7\\\\d)\\\\d{5}\",[7],0,0,0,0,0,0,\"[347]\",[0,[\"(?:31(?:8[14-8]|9[14578])|416[14-9]|7(?:0[01]|7[07]|8\\\\d|9[056])\\\\d)\\\\d{3}\"]]],\"BR\":[\"55\",\"00(?:1[245]|2[1-35]|31|4[13]|[56]5|99)\",\"(?:[1-46-9]\\\\d\\\\d|5(?:[0-46-9]\\\\d|5[0-46-9]))\\\\d{8}|[1-9]\\\\d{9}|[3589]\\\\d{8}|[34]\\\\d{7}\",[8,9,10,11],[[\"(\\\\d{4})(\\\\d{4})\",\"$1-$2\",[\"300|4(?:0[02]|37)\",\"4(?:02|37)0|[34]00\"]],[\"(\\\\d{3})(\\\\d{2,3})(\\\\d{4})\",\"$1 $2 $3\",[\"(?:[358]|90)0\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{4})(\\\\d{4})\",\"$1 $2-$3\",[\"(?:[14689][1-9]|2[12478]|3[1-578]|5[13-5]|7[13-579])[2-57]\"],\"($1)\"],[\"(\\\\d{2})(\\\\d{5})(\\\\d{4})\",\"$1 $2-$3\",[\"[16][1-9]|[2-57-9]\"],\"($1)\"]],\"0\",0,\"(?:0|90)(?:(1[245]|2[1-35]|31|4[13]|[56]5|99)(\\\\d{10,11}))?\",\"$2\",0,0,[0,[\"(?:[14689][1-9]|2[12478]|3[1-578]|5[13-5]|7[13-579])(?:7|9\\\\d)\\\\d{7}\",[10,11]]]],\"BS\":[\"1\",\"011\",\"(?:242|[58]\\\\d\\\\d|900)\\\\d{7}\",[10],0,\"1\",0,\"1|([3-8]\\\\d{6})$\",\"242$1\",0,\"242\",[0,[\"242(?:3(?:5[79]|7[56]|95)|4(?:[23][1-9]|4[1-35-9]|5[1-8]|6[2-8]|7\\\\d|81)|5(?:2[45]|3[35]|44|5[1-46-9]|65|77)|6[34]6|7(?:27|38)|8(?:0[1-9]|1[02-9]|2\\\\d|[89]9))\\\\d{4}\"]]],\"BT\":[\"975\",\"00\",\"[17]\\\\d{7}|[2-8]\\\\d{6}\",[7,8],[[\"(\\\\d)(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"[2-68]|7[246]\"]],[\"(\\\\d{2})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"1[67]|7\"]]],0,0,0,0,0,0,[0,[\"(?:1[67]|77)\\\\d{6}\",[8]]]],\"BW\":[\"267\",\"00\",\"(?:0800|(?:[37]|800)\\\\d)\\\\d{6}|(?:[2-6]\\\\d|90)\\\\d{5}\",[7,8,10],[[\"(\\\\d{2})(\\\\d{5})\",\"$1 $2\",[\"90\"]],[\"(\\\\d{3})(\\\\d{4})\",\"$1 $2\",[\"[24-6]|3[15-79]\"]],[\"(\\\\d{2})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"[37]\"]],[\"(\\\\d{4})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"0\"]],[\"(\\\\d{3})(\\\\d{4})(\\\\d{3})\",\"$1 $2 $3\",[\"8\"]]],0,0,0,0,0,0,[0,[\"(?:321|7(?:[1-7]\\\\d|8[0-4]))\\\\d{5}\",[8]]]],\"BY\":[\"375\",\"810\",\"(?:[12]\\\\d|33|44|902)\\\\d{7}|8(?:0[0-79]\\\\d{5,7}|[1-7]\\\\d{9})|8(?:1[0-489]|[5-79]\\\\d)\\\\d{7}|8[1-79]\\\\d{6,7}|8[0-79]\\\\d{5}|8\\\\d{5}\",[6,7,8,9,10,11],[[\"(\\\\d{3})(\\\\d{3})\",\"$1 $2\",[\"800\"],\"8 $1\"],[\"(\\\\d{3})(\\\\d{2})(\\\\d{2,4})\",\"$1 $2 $3\",[\"800\"],\"8 $1\"],[\"(\\\\d{4})(\\\\d{2})(\\\\d{3})\",\"$1 $2-$3\",[\"1(?:5[169]|6[3-5]|7[179])|2(?:1[35]|2[34]|3[3-5])\",\"1(?:5[169]|6(?:3[1-3]|4|5[125])|7(?:1[3-9]|7[0-24-6]|9[2-7]))|2(?:1[35]|2[34]|3[3-5])\"],\"8 0$1\"],[\"(\\\\d{3})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2-$3-$4\",[\"1(?:[56]|7[467])|2[1-3]\"],\"8 0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{2})(\\\\d{2})\",\"$1 $2-$3-$4\",[\"[1-4]\"],\"8 0$1\"],[\"(\\\\d{3})(\\\\d{3,4})(\\\\d{4})\",\"$1 $2 $3\",[\"[89]\"],\"8 $1\"]],\"8\",0,\"0|80?\",0,0,0,[0,[\"(?:2(?:5[5-79]|9[1-9])|(?:33|44)\\\\d)\\\\d{6}\",[9]]],\"8~10\"],\"BZ\":[\"501\",\"00\",\"(?:0800\\\\d|[2-8])\\\\d{6}\",[7,11],[[\"(\\\\d{3})(\\\\d{4})\",\"$1-$2\",[\"[2-8]\"]],[\"(\\\\d)(\\\\d{3})(\\\\d{4})(\\\\d{3})\",\"$1-$2-$3-$4\",[\"0\"]]],0,0,0,0,0,0,[0,[\"6[0-35-7]\\\\d{5}\",[7]]]],\"CA\":[\"1\",\"011\",\"(?:[2-8]\\\\d|90)\\\\d{8}|3\\\\d{6}\",[7,10],0,\"1\",0,0,0,0,0,[0,[\"(?:2(?:04|[23]6|[48]9|50|63)|3(?:06|43|54|6[578]|82)|4(?:03|1[68]|3[178]|50|68|74)|5(?:06|1[49]|48|79|8[147])|6(?:04|[18]3|39|47|72)|7(?:0[59]|42|53|78|8[02])|8(?:[06]7|19|25|73)|90[25])[2-9]\\\\d{6}\",[10]]]],\"CC\":[\"61\",\"001[14-689]|14(?:1[14]|34|4[17]|[56]6|7[47]|88)0011\",\"1(?:[0-79]\\\\d{8}(?:\\\\d{2})?|8[0-24-9]\\\\d{7})|[148]\\\\d{8}|1\\\\d{5,7}\",[6,7,8,9,10,12],0,\"0\",0,\"0|([59]\\\\d{7})$\",\"8$1\",0,0,[0,[\"4(?:83[0-389]|93[0-6])\\\\d{5}|4(?:[0-3]\\\\d|4[047-9]|5[0-25-9]|6[016-9]|7[02-9]|8[0-24-9]|9[0-27-9])\\\\d{6}\",[9]]],\"0011\"],\"CD\":[\"243\",\"00\",\"[189]\\\\d{8}|[1-68]\\\\d{6}\",[7,9],[[\"(\\\\d{2})(\\\\d{2})(\\\\d{3})\",\"$1 $2 $3\",[\"88\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{5})\",\"$1 $2\",[\"[1-6]\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"1\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"[89]\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"88\\\\d{5}|(?:8[0-59]|9[017-9])\\\\d{7}\"]]],\"CF\":[\"236\",\"00\",\"(?:[27]\\\\d{3}|8776)\\\\d{4}\",[8],[[\"(\\\\d{2})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"[278]\"]]],0,0,0,0,0,0,[0,[\"7[02457]\\\\d{6}\"]]],\"CG\":[\"242\",\"00\",\"222\\\\d{6}|(?:0\\\\d|80)\\\\d{7}\",[9],[[\"(\\\\d)(\\\\d{4})(\\\\d{4})\",\"$1 $2 $3\",[\"8\"]],[\"(\\\\d{2})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"[02]\"]]],0,0,0,0,0,0,[0,[\"026(?:1[0-5]|6[6-9])\\\\d{4}|0(?:[14-6]\\\\d\\\\d|2(?:40|5[5-8]|6[07-9]))\\\\d{5}\"]]],\"CH\":[\"41\",\"00\",\"8\\\\d{11}|[2-9]\\\\d{8}\",[9],[[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"8[047]|90\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"[2-79]|81\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{2})(\\\\d{3})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4 $5\",[\"8\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"7[35-9]\\\\d{7}\"]]],\"CI\":[\"225\",\"00\",\"[02]\\\\d{9}\",[10],[[\"(\\\\d{2})(\\\\d{2})(\\\\d)(\\\\d{5})\",\"$1 $2 $3 $4\",[\"2\"]],[\"(\\\\d{2})(\\\\d{2})(\\\\d{2})(\\\\d{4})\",\"$1 $2 $3 $4\",[\"0\"]]],0,0,0,0,0,0,[0,[\"0[157]\\\\d{8}\"]]],\"CK\":[\"682\",\"00\",\"[2-578]\\\\d{4}\",[5],[[\"(\\\\d{2})(\\\\d{3})\",\"$1 $2\",[\"[2-578]\"]]],0,0,0,0,0,0,[0,[\"[578]\\\\d{4}\"]]],\"CL\":[\"56\",\"(?:0|1(?:1[0-69]|2[02-5]|5[13-58]|69|7[0167]|8[018]))0\",\"12300\\\\d{6}|6\\\\d{9,10}|[2-9]\\\\d{8}\",[9,10,11],[[\"(\\\\d{5})(\\\\d{4})\",\"$1 $2\",[\"219\",\"2196\"],\"($1)\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"44\"]],[\"(\\\\d)(\\\\d{4})(\\\\d{4})\",\"$1 $2 $3\",[\"2[1-36]\"],\"($1)\"],[\"(\\\\d)(\\\\d{4})(\\\\d{4})\",\"$1 $2 $3\",[\"9[2-9]\"]],[\"(\\\\d{2})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"3[2-5]|[47]|5[1-3578]|6[13-57]|8(?:0[1-9]|[1-9])\"],\"($1)\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3,4})\",\"$1 $2 $3\",[\"60|8\"]],[\"(\\\\d{4})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"1\"]],[\"(\\\\d{3})(\\\\d{3})(\\\\d{2})(\\\\d{3})\",\"$1 $2 $3 $4\",[\"60\"]]],0,0,0,0,0,0,[0,[\"2(?:1982[0-6]|3314[05-9])\\\\d{3}|(?:2(?:1(?:160|962)|3(?:2\\\\d\\\\d|3(?:[0346]\\\\d|1[0-35-9]|2[1-9]|5[0-24-9]|7[0-3])|600)|646[59])|80[1-9]\\\\d\\\\d|9(?:3(?:[0-57-9]\\\\d\\\\d|6(?:0[02-9]|[1-9]\\\\d))|6(?:[0-8]\\\\d\\\\d|9(?:[02-79]\\\\d|1[05-9]))|7[1-9]\\\\d\\\\d|9(?:[03-9]\\\\d\\\\d|1(?:[0235-9]\\\\d|4[0-24-9])|2(?:[0-79]\\\\d|8[0-46-9]))))\\\\d{4}|(?:22|3[2-5]|[47][1-35]|5[1-3578]|6[13-57]|8[1-9]|9[2458])\\\\d{7}\",[9]]]],\"CM\":[\"237\",\"00\",\"[26]\\\\d{8}|88\\\\d{6,7}\",[8,9],[[\"(\\\\d{2})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"88\"]],[\"(\\\\d)(\\\\d{2})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4 $5\",[\"[26]|88\"]]],0,0,0,0,0,0,[0,[\"(?:24[23]|6[25-9]\\\\d)\\\\d{6}\",[9]]]],\"CN\":[\"86\",\"00|1(?:[12]\\\\d|79)\\\\d\\\\d00\",\"1[127]\\\\d{8,9}|2\\\\d{9}(?:\\\\d{2})?|[12]\\\\d{6,7}|86\\\\d{6}|(?:1[03-689]\\\\d|6)\\\\d{7,9}|(?:[3-579]\\\\d|8[0-57-9])\\\\d{6,9}\",[7,8,9,10,11,12],[[\"(\\\\d{2})(\\\\d{5,6})\",\"$1 $2\",[\"(?:10|2[0-57-9])[19]\",\"(?:10|2[0-57-9])(?:10|9[56])\",\"10(?:10|9[56])|2[0-57-9](?:100|9[56])\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{5,6})\",\"$1 $2\",[\"3(?:[157]|35|49|9[1-68])|4(?:[17]|2[179]|6[47-9]|8[23])|5(?:[1357]|2[37]|4[36]|6[1-46]|80)|6(?:3[1-5]|6[0238]|9[12])|7(?:01|[1579]|2[248]|3[014-9]|4[3-6]|6[023689])|8(?:1[236-8]|2[5-7]|[37]|8[36-8]|9[1-8])|9(?:0[1-3689]|1[1-79]|[379]|4[13]|5[1-5])|(?:4[35]|59|85)[1-9]\",\"(?:3(?:[157]\\\\d|35|49|9[1-68])|4(?:[17]\\\\d|2[179]|[35][1-9]|6[47-9]|8[23])|5(?:[1357]\\\\d|2[37]|4[36]|6[1-46]|80|9[1-9])|6(?:3[1-5]|6[0238]|9[12])|7(?:01|[1579]\\\\d|2[248]|3[014-9]|4[3-6]|6[023689])|8(?:1[236-8]|2[5-7]|[37]\\\\d|5[1-9]|8[36-8]|9[1-8])|9(?:0[1-3689]|1[1-79]|[379]\\\\d|4[13]|5[1-5]))[19]\",\"85[23](?:10|95)|(?:3(?:[157]\\\\d|35|49|9[1-68])|4(?:[17]\\\\d|2[179]|[35][1-9]|6[47-9]|8[23])|5(?:[1357]\\\\d|2[37]|4[36]|6[1-46]|80|9[1-9])|6(?:3[1-5]|6[0238]|9[12])|7(?:01|[1579]\\\\d|2[248]|3[014-9]|4[3-6]|6[023689])|8(?:1[236-8]|2[5-7]|[37]\\\\d|5[14-9]|8[36-8]|9[1-8])|9(?:0[1-3689]|1[1-79]|[379]\\\\d|4[13]|5[1-5]))(?:10|9[56])\",\"85[23](?:100|95)|(?:3(?:[157]\\\\d|35|49|9[1-68])|4(?:[17]\\\\d|2[179]|[35][1-9]|6[47-9]|8[23])|5(?:[1357]\\\\d|2[37]|4[36]|6[1-46]|80|9[1-9])|6(?:3[1-5]|6[0238]|9[12])|7(?:01|[1579]\\\\d|2[248]|3[014-9]|4[3-6]|6[023689])|8(?:1[236-8]|2[5-7]|[37]\\\\d|5[14-9]|8[36-8]|9[1-8])|9(?:0[1-3689]|1[1-79]|[379]\\\\d|4[13]|5[1-5]))(?:100|9[56])\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"(?:4|80)0\"]],[\"(\\\\d{2})(\\\\d{4})(\\\\d{4})\",\"$1 $2 $3\",[\"10|2(?:[02-57-9]|1[1-9])\",\"10|2(?:[02-57-9]|1[1-9])\",\"10[0-79]|2(?:[02-57-9]|1[1-79])|(?:10|21)8(?:0[1-9]|[1-9])\"],\"0$1\",1],[\"(\\\\d{3})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"3(?:[3-59]|7[02-68])|4(?:[26-8]|3[3-9]|5[2-9])|5(?:3[03-9]|[468]|7[028]|9[2-46-9])|6|7(?:[0-247]|3[04-9]|5[0-4689]|6[2368])|8(?:[1-358]|9[1-7])|9(?:[013479]|5[1-5])|(?:[34]1|55|79|87)[02-9]\"],\"0$1\",1],[\"(\\\\d{3})(\\\\d{7,8})\",\"$1 $2\",[\"9\"]],[\"(\\\\d{4})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"80\"],\"0$1\",1],[\"(\\\\d{3})(\\\\d{4})(\\\\d{4})\",\"$1 $2 $3\",[\"[3-578]\"],\"0$1\",1],[\"(\\\\d{3})(\\\\d{4})(\\\\d{4})\",\"$1 $2 $3\",[\"1[3-9]\"]],[\"(\\\\d{2})(\\\\d{3})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3 $4\",[\"[12]\"],\"0$1\",1]],\"0\",0,\"0|(1(?:[12]\\\\d|79)\\\\d\\\\d)\",0,0,0,[0,[\"1740[0-5]\\\\d{6}|1(?:[38]\\\\d|4[57]|[59][0-35-9]|6[25-7]|7[0-35-8])\\\\d{8}\",[11]]],\"00\"],\"CO\":[\"57\",\"00(?:4(?:[14]4|56)|[579])\",\"(?:60\\\\d\\\\d|9101)\\\\d{6}|(?:1\\\\d|3)\\\\d{9}\",[10,11],[[\"(\\\\d{3})(\\\\d{7})\",\"$1 $2\",[\"6\"],\"($1)\"],[\"(\\\\d{3})(\\\\d{7})\",\"$1 $2\",[\"3[0-357]|91\"]],[\"(\\\\d)(\\\\d{3})(\\\\d{7})\",\"$1-$2-$3\",[\"1\"],\"0$1\",0,\"$1 $2 $3\"]],\"0\",0,\"0(4(?:[14]4|56)|[579])?\",0,0,0,[0,[\"3333(?:0(?:0\\\\d|1[0-5])|[4-9]\\\\d\\\\d)\\\\d{3}|(?:3(?:24[1-9]|3(?:00|3[0-24-9]))|9101)\\\\d{6}|3(?:0[0-5]|1\\\\d|2[0-3]|5[01]|70)\\\\d{7}\",[10]]]],\"CR\":[\"506\",\"00\",\"(?:8\\\\d|90)\\\\d{8}|(?:[24-8]\\\\d{3}|3005)\\\\d{4}\",[8,10],[[\"(\\\\d{4})(\\\\d{4})\",\"$1 $2\",[\"[2-7]|8[3-9]\"]],[\"(\\\\d{3})(\\\\d{3})(\\\\d{4})\",\"$1-$2-$3\",[\"[89]\"]]],0,0,\"(19(?:0[0-2468]|1[09]|20|66|77|99))\",0,0,0,[0,[\"(?:3005\\\\d|6500[01])\\\\d{3}|(?:5[07]|6[0-4]|7[0-3]|8[3-9])\\\\d{6}\",[8]]]],\"CU\":[\"53\",\"119\",\"[27]\\\\d{6,7}|[34]\\\\d{5,7}|(?:5|8\\\\d\\\\d)\\\\d{7}\",[6,7,8,10],[[\"(\\\\d{2})(\\\\d{4,6})\",\"$1 $2\",[\"2[1-4]|[34]\"],\"(0$1)\"],[\"(\\\\d)(\\\\d{6,7})\",\"$1 $2\",[\"7\"],\"(0$1)\"],[\"(\\\\d)(\\\\d{7})\",\"$1 $2\",[\"5\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{7})\",\"$1 $2\",[\"8\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"5\\\\d{7}\",[8]]]],\"CV\":[\"238\",\"0\",\"(?:[2-59]\\\\d\\\\d|800)\\\\d{4}\",[7],[[\"(\\\\d{3})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3\",[\"[2-589]\"]]],0,0,0,0,0,0,[0,[\"(?:36|5[1-389]|9\\\\d)\\\\d{5}\"]]],\"CW\":[\"599\",\"00\",\"(?:[34]1|60|(?:7|9\\\\d)\\\\d)\\\\d{5}\",[7,8],[[\"(\\\\d{3})(\\\\d{4})\",\"$1 $2\",[\"[3467]\"]],[\"(\\\\d)(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"9[4-8]\"]]],0,0,0,0,0,\"[69]\",[0,[\"953[01]\\\\d{4}|9(?:5[12467]|6[5-9])\\\\d{5}\"]]],\"CX\":[\"61\",\"001[14-689]|14(?:1[14]|34|4[17]|[56]6|7[47]|88)0011\",\"1(?:[0-79]\\\\d{8}(?:\\\\d{2})?|8[0-24-9]\\\\d{7})|[148]\\\\d{8}|1\\\\d{5,7}\",[6,7,8,9,10,12],0,\"0\",0,\"0|([59]\\\\d{7})$\",\"8$1\",0,0,[0,[\"4(?:83[0-389]|93[0-6])\\\\d{5}|4(?:[0-3]\\\\d|4[047-9]|5[0-25-9]|6[016-9]|7[02-9]|8[0-24-9]|9[0-27-9])\\\\d{6}\",[9]]],\"0011\"],\"CY\":[\"357\",\"00\",\"(?:[279]\\\\d|[58]0)\\\\d{6}\",[8],[[\"(\\\\d{2})(\\\\d{6})\",\"$1 $2\",[\"[257-9]\"]]],0,0,0,0,0,0,[0,[\"9(?:10|[4-79]\\\\d)\\\\d{5}\"]]],\"CZ\":[\"420\",\"00\",\"(?:[2-578]\\\\d|60)\\\\d{7}|9\\\\d{8,11}\",[9],[[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"[2-8]|9[015-7]\"]],[\"(\\\\d{2})(\\\\d{3})(\\\\d{3})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"96\"]],[\"(\\\\d{2})(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3 $4\",[\"9\"]],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3 $4\",[\"9\"]]],0,0,0,0,0,0,[0,[\"(?:60[1-8]|7(?:0[2-5]|[2379]\\\\d))\\\\d{6}\"]]],\"DE\":[\"49\",\"00\",\"[2579]\\\\d{5,14}|49(?:[34]0|69|8\\\\d)\\\\d\\\\d?|49(?:37|49|60|7[089]|9\\\\d)\\\\d{1,3}|49(?:2[024-9]|3[2-689]|7[1-7])\\\\d{1,8}|(?:1|[368]\\\\d|4[0-8])\\\\d{3,13}|49(?:[015]\\\\d|2[13]|31|[46][1-8])\\\\d{1,9}\",[4,5,6,7,8,9,10,11,12,13,14,15],[[\"(\\\\d{2})(\\\\d{3,13})\",\"$1 $2\",[\"3[02]|40|[68]9\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3,12})\",\"$1 $2\",[\"2(?:0[1-389]|1[124]|2[18]|3[14])|3(?:[35-9][15]|4[015])|906|(?:2[4-9]|4[2-9]|[579][1-9]|[68][1-8])1\",\"2(?:0[1-389]|12[0-8])|3(?:[35-9][15]|4[015])|906|2(?:[13][14]|2[18])|(?:2[4-9]|4[2-9]|[579][1-9]|[68][1-8])1\"],\"0$1\"],[\"(\\\\d{4})(\\\\d{2,11})\",\"$1 $2\",[\"[24-6]|3(?:[3569][02-46-9]|4[2-4679]|7[2-467]|8[2-46-8])|70[2-8]|8(?:0[2-9]|[1-8])|90[7-9]|[79][1-9]\",\"[24-6]|3(?:3(?:0[1-467]|2[127-9]|3[124578]|7[1257-9]|8[1256]|9[145])|4(?:2[135]|4[13578]|9[1346])|5(?:0[14]|2[1-3589]|6[1-4]|7[13468]|8[13568])|6(?:2[1-489]|3[124-6]|6[13]|7[12579]|8[1-356]|9[135])|7(?:2[1-7]|4[145]|6[1-5]|7[1-4])|8(?:21|3[1468]|6|7[1467]|8[136])|9(?:0[12479]|2[1358]|4[134679]|6[1-9]|7[136]|8[147]|9[1468]))|70[2-8]|8(?:0[2-9]|[1-8])|90[7-9]|[79][1-9]|3[68]4[1347]|3(?:47|60)[1356]|3(?:3[46]|46|5[49])[1246]|3[4579]3[1357]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{4})\",\"$1 $2\",[\"138\"],\"0$1\"],[\"(\\\\d{5})(\\\\d{2,10})\",\"$1 $2\",[\"3\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{5,11})\",\"$1 $2\",[\"181\"],\"0$1\"],[\"(\\\\d{3})(\\\\d)(\\\\d{4,10})\",\"$1 $2 $3\",[\"1(?:3|80)|9\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{7,8})\",\"$1 $2\",[\"1[67]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{7,12})\",\"$1 $2\",[\"8\"],\"0$1\"],[\"(\\\\d{5})(\\\\d{6})\",\"$1 $2\",[\"185\",\"1850\",\"18500\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{4})(\\\\d{4})\",\"$1 $2 $3\",[\"7\"],\"0$1\"],[\"(\\\\d{4})(\\\\d{7})\",\"$1 $2\",[\"18[68]\"],\"0$1\"],[\"(\\\\d{5})(\\\\d{6})\",\"$1 $2\",[\"15[0568]\"],\"0$1\"],[\"(\\\\d{4})(\\\\d{7})\",\"$1 $2\",[\"15[1279]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{8})\",\"$1 $2\",[\"18\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{2})(\\\\d{7,8})\",\"$1 $2 $3\",[\"1(?:6[023]|7)\"],\"0$1\"],[\"(\\\\d{4})(\\\\d{2})(\\\\d{7})\",\"$1 $2 $3\",[\"15[279]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{2})(\\\\d{8})\",\"$1 $2 $3\",[\"15\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"15[0-25-9]\\\\d{8}|1(?:6[023]|7\\\\d)\\\\d{7,8}\",[10,11]]]],\"DJ\":[\"253\",\"00\",\"(?:2\\\\d|77)\\\\d{6}\",[8],[[\"(\\\\d{2})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"[27]\"]]],0,0,0,0,0,0,[0,[\"77\\\\d{6}\"]]],\"DK\":[\"45\",\"00\",\"[2-9]\\\\d{7}\",[8],[[\"(\\\\d{2})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"[2-9]\"]]],0,0,0,0,0,0,[0,[\"(?:[2-7]\\\\d|8[126-9]|9[1-46-9])\\\\d{6}\"]]],\"DM\":[\"1\",\"011\",\"(?:[58]\\\\d\\\\d|767|900)\\\\d{7}\",[10],0,\"1\",0,\"1|([2-7]\\\\d{6})$\",\"767$1\",0,\"767\",[0,[\"767(?:2(?:[2-4689]5|7[5-7])|31[5-7]|61[1-8]|70[1-6])\\\\d{4}\"]]],\"DO\":[\"1\",\"011\",\"(?:[58]\\\\d\\\\d|900)\\\\d{7}\",[10],0,\"1\",0,0,0,0,\"8001|8[024]9\",[0,[\"8[024]9[2-9]\\\\d{6}\"]]],\"DZ\":[\"213\",\"00\",\"(?:[1-4]|[5-79]\\\\d|80)\\\\d{7}\",[8,9],[[\"(\\\\d{2})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"[1-4]\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"9\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"[5-8]\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"(?:5(?:4[0-29]|5\\\\d|6[0-2])|6(?:[569]\\\\d|7[0-6])|7[7-9]\\\\d)\\\\d{6}\",[9]]]],\"EC\":[\"593\",\"00\",\"1\\\\d{9,10}|(?:[2-7]|9\\\\d)\\\\d{7}\",[8,9,10,11],[[\"(\\\\d)(\\\\d{3})(\\\\d{4})\",\"$1 $2-$3\",[\"[2-7]\"],\"(0$1)\",0,\"$1-$2-$3\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"9\"],\"0$1\"],[\"(\\\\d{4})(\\\\d{3})(\\\\d{3,4})\",\"$1 $2 $3\",[\"1\"]]],\"0\",0,0,0,0,0,[0,[\"964[0-2]\\\\d{5}|9(?:39|[57][89]|6[0-36-9]|[89]\\\\d)\\\\d{6}\",[9]]]],\"EE\":[\"372\",\"00\",\"8\\\\d{9}|[4578]\\\\d{7}|(?:[3-8]\\\\d|90)\\\\d{5}\",[7,8,10],[[\"(\\\\d{3})(\\\\d{4})\",\"$1 $2\",[\"[369]|4[3-8]|5(?:[0-2]|5[0-478]|6[45])|7[1-9]|88\",\"[369]|4[3-8]|5(?:[02]|1(?:[0-8]|95)|5[0-478]|6(?:4[0-4]|5[1-589]))|7[1-9]|88\"]],[\"(\\\\d{4})(\\\\d{3,4})\",\"$1 $2\",[\"[45]|8(?:00|[1-49])\",\"[45]|8(?:00[1-9]|[1-49])\"]],[\"(\\\\d{2})(\\\\d{2})(\\\\d{4})\",\"$1 $2 $3\",[\"7\"]],[\"(\\\\d{4})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"8\"]]],0,0,0,0,0,0,[0,[\"(?:5\\\\d{5}|8(?:1(?:0(?:000|[3-9]\\\\d\\\\d)|(?:1(?:0[236]|1\\\\d)|(?:23|[3-79]\\\\d)\\\\d)\\\\d)|2(?:0(?:000|(?:19|[2-7]\\\\d)\\\\d)|(?:(?:[124-6]\\\\d|3[5-9])\\\\d|7(?:[3679]\\\\d|8[13-9])|8(?:[2-6]\\\\d|7[01]))\\\\d)|[349]\\\\d{4}))\\\\d\\\\d|5(?:(?:[02]\\\\d|5[0-478])\\\\d|1(?:[0-8]\\\\d|95)|6(?:4[0-4]|5[1-589]))\\\\d{3}\",[7,8]]]],\"EG\":[\"20\",\"00\",\"[189]\\\\d{8,9}|[24-6]\\\\d{8}|[135]\\\\d{7}\",[8,9,10],[[\"(\\\\d)(\\\\d{7,8})\",\"$1 $2\",[\"[23]\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{6,7})\",\"$1 $2\",[\"1[35]|[4-6]|8[2468]|9[235-7]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"[189]\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"1[0-25]\\\\d{8}\",[10]]]],\"EH\":[\"212\",\"00\",\"[5-8]\\\\d{8}\",[9],0,\"0\",0,0,0,0,\"528[89]\",[0,[\"(?:6(?:[0-79]\\\\d|8[0-247-9])|7(?:[017]\\\\d|2[0-2]|6[0-8]|8[0-3]))\\\\d{6}\"]]],\"ER\":[\"291\",\"00\",\"[178]\\\\d{6}\",[7],[[\"(\\\\d)(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"[178]\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"(?:17[1-3]|7\\\\d\\\\d)\\\\d{4}\"]]],\"ES\":[\"34\",\"00\",\"[5-9]\\\\d{8}\",[9],[[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"[89]00\"]],[\"(\\\\d{3})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"[5-9]\"]]],0,0,0,0,0,0,[0,[\"(?:590[16]00\\\\d|9(?:6906(?:09|10)|7390\\\\d\\\\d))\\\\d\\\\d|(?:6\\\\d|7[1-48])\\\\d{7}\"]]],\"ET\":[\"251\",\"00\",\"(?:11|[2-579]\\\\d)\\\\d{7}\",[9],[[\"(\\\\d{2})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"[1-579]\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"7001\\\\d{5}|(?:7(?:0[1-9]|1[01]|77|86|99)|9\\\\d\\\\d)\\\\d{6}\"]]],\"FI\":[\"358\",\"00|99(?:[01469]|5(?:[14]1|3[23]|5[59]|77|88|9[09]))\",\"[1-35689]\\\\d{4}|7\\\\d{10,11}|(?:[124-7]\\\\d|3[0-46-9])\\\\d{8}|[1-9]\\\\d{5,8}\",[5,6,7,8,9,10,11,12],[[\"(\\\\d)(\\\\d{4,9})\",\"$1 $2\",[\"[2568][1-8]|3(?:0[1-9]|[1-9])|9\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3,7})\",\"$1 $2\",[\"[12]00|[368]|70[07-9]\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{4,8})\",\"$1 $2\",[\"[1245]|7[135]\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{6,10})\",\"$1 $2\",[\"7\"],\"0$1\"]],\"0\",0,0,0,0,\"1[03-79]|[2-9]\",[0,[\"4946\\\\d{2,6}|(?:4[0-8]|50)\\\\d{4,8}\",[6,7,8,9,10]]],\"00\"],\"FJ\":[\"679\",\"0(?:0|52)\",\"45\\\\d{5}|(?:0800\\\\d|[235-9])\\\\d{6}\",[7,11],[[\"(\\\\d{3})(\\\\d{4})\",\"$1 $2\",[\"[235-9]|45\"]],[\"(\\\\d{4})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"0\"]]],0,0,0,0,0,0,[0,[\"(?:[279]\\\\d|45|5[01568]|8[034679])\\\\d{5}\",[7]]],\"00\"],\"FK\":[\"500\",\"00\",\"[2-7]\\\\d{4}\",[5],0,0,0,0,0,0,0,[0,[\"[56]\\\\d{4}\"]]],\"FM\":[\"691\",\"00\",\"(?:[39]\\\\d\\\\d|820)\\\\d{4}\",[7],[[\"(\\\\d{3})(\\\\d{4})\",\"$1 $2\",[\"[389]\"]]],0,0,0,0,0,0,[0,[\"31(?:00[67]|208|309)\\\\d\\\\d|(?:3(?:[2357]0[1-9]|602|804|905)|(?:820|9[2-7]\\\\d)\\\\d)\\\\d{3}\"]]],\"FO\":[\"298\",\"00\",\"[2-9]\\\\d{5}\",[6],[[\"(\\\\d{6})\",\"$1\",[\"[2-9]\"]]],0,0,\"(10(?:01|[12]0|88))\",0,0,0,[0,[\"(?:[27][1-9]|5\\\\d|9[16])\\\\d{4}\"]]],\"FR\":[\"33\",\"00\",\"[1-9]\\\\d{8}\",[9],[[\"(\\\\d{3})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"8\"],\"0 $1\"],[\"(\\\\d)(\\\\d{2})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4 $5\",[\"[1-79]\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"(?:6(?:[0-24-8]\\\\d|3[0-8]|9[589])|7(?:00|[3-9]\\\\d))\\\\d{6}\"]]],\"GA\":[\"241\",\"00\",\"(?:[067]\\\\d|11)\\\\d{6}|[2-7]\\\\d{6}\",[7,8],[[\"(\\\\d)(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"[2-7]\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"0\"]],[\"(\\\\d{2})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"11|[67]\"],\"0$1\"]],0,0,\"0(11\\\\d{6}|60\\\\d{6}|61\\\\d{6}|6[256]\\\\d{6}|7[467]\\\\d{6})\",\"$1\",0,0,[0,[\"(?:(?:0[2-7]|7[467])\\\\d|6(?:0[0-4]|10|[256]\\\\d))\\\\d{5}|[2-7]\\\\d{6}\"]]],\"GB\":[\"44\",\"00\",\"[1-357-9]\\\\d{9}|[18]\\\\d{8}|8\\\\d{6}\",[7,9,10],[[\"(\\\\d{3})(\\\\d{4})\",\"$1 $2\",[\"800\",\"8001\",\"80011\",\"800111\",\"8001111\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3\",[\"845\",\"8454\",\"84546\",\"845464\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{6})\",\"$1 $2\",[\"800\"],\"0$1\"],[\"(\\\\d{5})(\\\\d{4,5})\",\"$1 $2\",[\"1(?:38|5[23]|69|76|94)\",\"1(?:(?:38|69)7|5(?:24|39)|768|946)\",\"1(?:3873|5(?:242|39[4-6])|(?:697|768)[347]|9467)\"],\"0$1\"],[\"(\\\\d{4})(\\\\d{5,6})\",\"$1 $2\",[\"1(?:[2-69][02-9]|[78])\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{4})(\\\\d{4})\",\"$1 $2 $3\",[\"[25]|7(?:0|6[02-9])\",\"[25]|7(?:0|6(?:[03-9]|2[356]))\"],\"0$1\"],[\"(\\\\d{4})(\\\\d{6})\",\"$1 $2\",[\"7\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"[1389]\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"7(?:457[0-57-9]|700[01]|911[028])\\\\d{5}|7(?:[1-3]\\\\d\\\\d|4(?:[0-46-9]\\\\d|5[0-689])|5(?:0[0-8]|[13-9]\\\\d|2[0-35-9])|7(?:0[1-9]|[1-7]\\\\d|8[02-9]|9[0-689])|8(?:[014-9]\\\\d|[23][0-8])|9(?:[024-9]\\\\d|1[02-9]|3[0-689]))\\\\d{6}\",[10]]],0,\" x\"],\"GD\":[\"1\",\"011\",\"(?:473|[58]\\\\d\\\\d|900)\\\\d{7}\",[10],0,\"1\",0,\"1|([2-9]\\\\d{6})$\",\"473$1\",0,\"473\",[0,[\"473(?:4(?:0[2-79]|1[04-9]|2[0-5]|58)|5(?:2[01]|3[3-8])|901)\\\\d{4}\"]]],\"GE\":[\"995\",\"00\",\"(?:[3-57]\\\\d\\\\d|800)\\\\d{6}\",[9],[[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"70\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"32\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"[57]\"]],[\"(\\\\d{3})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"[348]\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"5(?:(?:0555|1(?:[17]77|555))[5-9]|757(?:7[7-9]|8[01]))\\\\d{3}|5(?:0070|11(?:33|51)|[25]222|3333)[0-4]\\\\d{3}|5(?:00(?:0\\\\d|5[05])|11(?:00|[124]\\\\d|3[01])|5200|75(?:00|[57]5)|8(?:0(?:[01]\\\\d|2[0-4])|58[89]|8(?:55|88)))\\\\d{4}|(?:5(?:[14]4|5[0157-9]|68|7[0147-9]|9[1-35-9])|790)\\\\d{6}\"]]],\"GF\":[\"594\",\"00\",\"(?:[56]94|80\\\\d|976)\\\\d{6}\",[9],[[\"(\\\\d{3})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"[569]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"8\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"694(?:[0-249]\\\\d|3[0-8])\\\\d{4}\"]]],\"GG\":[\"44\",\"00\",\"(?:1481|[357-9]\\\\d{3})\\\\d{6}|8\\\\d{6}(?:\\\\d{2})?\",[7,9,10],0,\"0\",0,\"0|([25-9]\\\\d{5})$\",\"1481$1\",0,0,[0,[\"7(?:(?:781|839)\\\\d|911[17])\\\\d{5}\",[10]]]],\"GH\":[\"233\",\"00\",\"(?:[235]\\\\d{3}|800)\\\\d{5}\",[8,9],[[\"(\\\\d{3})(\\\\d{5})\",\"$1 $2\",[\"8\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"[235]\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"(?:2(?:[0346-9]\\\\d|5[67])|5(?:[03-7]\\\\d|9[1-9]))\\\\d{6}\",[9]]]],\"GI\":[\"350\",\"00\",\"(?:[25]\\\\d\\\\d|606)\\\\d{5}\",[8],[[\"(\\\\d{3})(\\\\d{5})\",\"$1 $2\",[\"2\"]]],0,0,0,0,0,0,[0,[\"525(?:0\\\\d|1[0-4])\\\\d{3}|(?:5[146-8]\\\\d|606)\\\\d{5}\"]]],\"GL\":[\"299\",\"00\",\"(?:19|[2-689]\\\\d|70)\\\\d{4}\",[6],[[\"(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3\",[\"19|[2-9]\"]]],0,0,0,0,0,0,[0,[\"[245]\\\\d{5}\"]]],\"GM\":[\"220\",\"00\",\"[2-9]\\\\d{6}\",[7],[[\"(\\\\d{3})(\\\\d{4})\",\"$1 $2\",[\"[2-9]\"]]],0,0,0,0,0,0,[0,[\"(?:[23679]\\\\d|5[0-389])\\\\d{5}\"]]],\"GN\":[\"224\",\"00\",\"722\\\\d{6}|(?:3|6\\\\d)\\\\d{7}\",[8,9],[[\"(\\\\d{2})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"3\"]],[\"(\\\\d{3})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"[67]\"]]],0,0,0,0,0,0,[0,[\"6[0-356]\\\\d{7}\",[9]]]],\"GP\":[\"590\",\"00\",\"(?:590|(?:69|80)\\\\d|976)\\\\d{6}\",[9],[[\"(\\\\d{3})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"[569]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"8\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"69(?:0\\\\d\\\\d|1(?:2[2-9]|3[0-5]))\\\\d{4}\"]]],\"GQ\":[\"240\",\"00\",\"222\\\\d{6}|(?:3\\\\d|55|[89]0)\\\\d{7}\",[9],[[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"[235]\"]],[\"(\\\\d{3})(\\\\d{6})\",\"$1 $2\",[\"[89]\"]]],0,0,0,0,0,0,[0,[\"(?:222|55\\\\d)\\\\d{6}\"]]],\"GR\":[\"30\",\"00\",\"5005000\\\\d{3}|8\\\\d{9,11}|(?:[269]\\\\d|70)\\\\d{8}\",[10,11,12],[[\"(\\\\d{2})(\\\\d{4})(\\\\d{4})\",\"$1 $2 $3\",[\"21|7\"]],[\"(\\\\d{4})(\\\\d{6})\",\"$1 $2\",[\"2(?:2|3[2-57-9]|4[2-469]|5[2-59]|6[2-9]|7[2-69]|8[2-49])|5\"]],[\"(\\\\d{3})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"[2689]\"]],[\"(\\\\d{3})(\\\\d{3,4})(\\\\d{5})\",\"$1 $2 $3\",[\"8\"]]],0,0,0,0,0,0,[0,[\"68[57-9]\\\\d{7}|(?:69|94)\\\\d{8}\",[10]]]],\"GT\":[\"502\",\"00\",\"(?:1\\\\d{3}|[2-7])\\\\d{7}\",[8,11],[[\"(\\\\d{4})(\\\\d{4})\",\"$1 $2\",[\"[2-7]\"]],[\"(\\\\d{4})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"1\"]]],0,0,0,0,0,0,[0,[\"[3-5]\\\\d{7}\",[8]]]],\"GU\":[\"1\",\"011\",\"(?:[58]\\\\d\\\\d|671|900)\\\\d{7}\",[10],0,\"1\",0,\"1|([3-9]\\\\d{6})$\",\"671$1\",0,\"671\",[0,[\"671(?:3(?:00|3[39]|4[349]|55|6[26])|4(?:00|56|7[1-9]|8[02-46-9])|5(?:55|6[2-5]|88)|6(?:3[2-578]|4[24-9]|5[34]|78|8[235-9])|7(?:[0479]7|2[0167]|3[45]|8[7-9])|8(?:[2-57-9]8|6[48])|9(?:2[29]|6[79]|7[1279]|8[7-9]|9[78]))\\\\d{4}\"]]],\"GW\":[\"245\",\"00\",\"[49]\\\\d{8}|4\\\\d{6}\",[7,9],[[\"(\\\\d{3})(\\\\d{4})\",\"$1 $2\",[\"40\"]],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"[49]\"]]],0,0,0,0,0,0,[0,[\"9(?:5\\\\d|6[569]|77)\\\\d{6}\",[9]]]],\"GY\":[\"592\",\"001\",\"9008\\\\d{3}|(?:[2-467]\\\\d\\\\d|862)\\\\d{4}\",[7],[[\"(\\\\d{3})(\\\\d{4})\",\"$1 $2\",[\"[2-46-9]\"]]],0,0,0,0,0,0,[0,[\"(?:6\\\\d\\\\d|70[0-35-7])\\\\d{4}\"]]],\"HK\":[\"852\",\"00(?:30|5[09]|[126-9]?)\",\"8[0-46-9]\\\\d{6,7}|9\\\\d{4,7}|(?:[2-7]|9\\\\d{3})\\\\d{7}\",[5,6,7,8,9,11],[[\"(\\\\d{3})(\\\\d{2,5})\",\"$1 $2\",[\"900\",\"9003\"]],[\"(\\\\d{4})(\\\\d{4})\",\"$1 $2\",[\"[2-7]|8[1-4]|9(?:0[1-9]|[1-8])\"]],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"8\"]],[\"(\\\\d{3})(\\\\d{2})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3 $4\",[\"9\"]]],0,0,0,0,0,0,[0,[\"(?:4(?:44[5-9]|6(?:0[0-7]|1[0-6]|4[0-57-9]|6[0-4]|7[0-8]))|573[0-6]|6(?:26[013-8]|66[0-3])|70(?:7[1-5]|8[0-4])|848[015-9]|9(?:29[013-9]|59[0-4]))\\\\d{4}|(?:4(?:4[01]|6[2358])|5(?:[1-59][0-46-9]|6[0-4689]|7[0-246-9])|6(?:0[1-9]|[13-59]\\\\d|[268][0-57-9]|7[0-79])|84[09]|9(?:0[1-9]|1[02-9]|[2358][0-8]|[467]\\\\d))\\\\d{5}\",[8]]],\"00\"],\"HN\":[\"504\",\"00\",\"8\\\\d{10}|[237-9]\\\\d{7}\",[8,11],[[\"(\\\\d{4})(\\\\d{4})\",\"$1-$2\",[\"[237-9]\"]]],0,0,0,0,0,0,[0,[\"[37-9]\\\\d{7}\",[8]]]],\"HR\":[\"385\",\"00\",\"(?:[24-69]\\\\d|3[0-79])\\\\d{7}|80\\\\d{5,7}|[1-79]\\\\d{7}|6\\\\d{5,6}\",[6,7,8,9],[[\"(\\\\d{2})(\\\\d{2})(\\\\d{2,3})\",\"$1 $2 $3\",[\"6[01]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{2})(\\\\d{2,3})\",\"$1 $2 $3\",[\"8\"],\"0$1\"],[\"(\\\\d)(\\\\d{4})(\\\\d{3})\",\"$1 $2 $3\",[\"1\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{3,4})\",\"$1 $2 $3\",[\"[67]\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{3,4})\",\"$1 $2 $3\",[\"9\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{3,4})\",\"$1 $2 $3\",[\"[2-5]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"8\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"98\\\\d{6,7}|975(?:1\\\\d|77|9[67])\\\\d{4}|9(?:0[1-9]|[1259]\\\\d|7[0679])\\\\d{6}\",[8,9]]]],\"HT\":[\"509\",\"00\",\"(?:[2-489]\\\\d|55)\\\\d{6}\",[8],[[\"(\\\\d{2})(\\\\d{2})(\\\\d{4})\",\"$1 $2 $3\",[\"[2-589]\"]]],0,0,0,0,0,0,[0,[\"(?:[34]\\\\d|55)\\\\d{6}\"]]],\"HU\":[\"36\",\"00\",\"[235-7]\\\\d{8}|[1-9]\\\\d{7}\",[8,9],[[\"(\\\\d)(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"1\"],\"(06 $1)\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"[27][2-9]|3[2-7]|4[24-9]|5[2-79]|6|8[2-57-9]|9[2-69]\"],\"(06 $1)\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{3,4})\",\"$1 $2 $3\",[\"[2-9]\"],\"06 $1\"]],\"06\",0,0,0,0,0,[0,[\"(?:[257]0|3[01])\\\\d{7}\",[9]]]],\"ID\":[\"62\",\"00[89]\",\"(?:(?:00[1-9]|8\\\\d)\\\\d{4}|[1-36])\\\\d{6}|00\\\\d{10}|[1-9]\\\\d{8,10}|[2-9]\\\\d{7}\",[7,8,9,10,11,12,13],[[\"(\\\\d)(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"15\"]],[\"(\\\\d{2})(\\\\d{5,9})\",\"$1 $2\",[\"2[124]|[36]1\"],\"(0$1)\"],[\"(\\\\d{3})(\\\\d{5,7})\",\"$1 $2\",[\"800\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{5,8})\",\"$1 $2\",[\"[2-79]\"],\"(0$1)\"],[\"(\\\\d{3})(\\\\d{3,4})(\\\\d{3})\",\"$1-$2-$3\",[\"8[1-35-9]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{6,8})\",\"$1 $2\",[\"1\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"804\"],\"0$1\"],[\"(\\\\d{3})(\\\\d)(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3 $4\",[\"80\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{4})(\\\\d{4,5})\",\"$1-$2-$3\",[\"8\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"8[1-35-9]\\\\d{7,10}\",[9,10,11,12]]]],\"IE\":[\"353\",\"00\",\"(?:1\\\\d|[2569])\\\\d{6,8}|4\\\\d{6,9}|7\\\\d{8}|8\\\\d{8,9}\",[7,8,9,10],[[\"(\\\\d{2})(\\\\d{5})\",\"$1 $2\",[\"2[24-9]|47|58|6[237-9]|9[35-9]\"],\"(0$1)\"],[\"(\\\\d{3})(\\\\d{5})\",\"$1 $2\",[\"[45]0\"],\"(0$1)\"],[\"(\\\\d)(\\\\d{3,4})(\\\\d{4})\",\"$1 $2 $3\",[\"1\"],\"(0$1)\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{3,4})\",\"$1 $2 $3\",[\"[2569]|4[1-69]|7[14]\"],\"(0$1)\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"70\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"81\"],\"(0$1)\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"[78]\"],\"0$1\"],[\"(\\\\d{4})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"1\"]],[\"(\\\\d{2})(\\\\d{4})(\\\\d{4})\",\"$1 $2 $3\",[\"4\"],\"(0$1)\"],[\"(\\\\d{2})(\\\\d)(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3 $4\",[\"8\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"8(?:22|[35-9]\\\\d)\\\\d{6}\",[9]]]],\"IL\":[\"972\",\"0(?:0|1[2-9])\",\"1\\\\d{6}(?:\\\\d{3,5})?|[57]\\\\d{8}|[1-489]\\\\d{7}\",[7,8,9,10,11,12],[[\"(\\\\d{4})(\\\\d{3})\",\"$1-$2\",[\"125\"]],[\"(\\\\d{4})(\\\\d{2})(\\\\d{2})\",\"$1-$2-$3\",[\"121\"]],[\"(\\\\d)(\\\\d{3})(\\\\d{4})\",\"$1-$2-$3\",[\"[2-489]\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{4})\",\"$1-$2-$3\",[\"[57]\"],\"0$1\"],[\"(\\\\d{4})(\\\\d{3})(\\\\d{3})\",\"$1-$2-$3\",[\"12\"]],[\"(\\\\d{4})(\\\\d{6})\",\"$1-$2\",[\"159\"]],[\"(\\\\d)(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1-$2-$3-$4\",[\"1[7-9]\"]],[\"(\\\\d{3})(\\\\d{1,2})(\\\\d{3})(\\\\d{4})\",\"$1-$2 $3-$4\",[\"15\"]]],\"0\",0,0,0,0,0,[0,[\"5(?:(?:[02368]\\\\d|[19][2-9]|4[1-9])\\\\d|5(?:01|1[79]|2[2-9]|3[0-3]|4[34]|5[015689]|6[6-8]|7[0-267]|8[7-9]|9[1-9]))\\\\d{5}\",[9]]]],\"IM\":[\"44\",\"00\",\"1624\\\\d{6}|(?:[3578]\\\\d|90)\\\\d{8}\",[10],0,\"0\",0,\"0|([25-8]\\\\d{5})$\",\"1624$1\",0,\"74576|(?:16|7[56])24\",[0,[\"76245[06]\\\\d{4}|7(?:4576|[59]24\\\\d|624[0-4689])\\\\d{5}\"]]],\"IN\":[\"91\",\"00\",\"(?:000800|[2-9]\\\\d\\\\d)\\\\d{7}|1\\\\d{7,12}\",[8,9,10,11,12,13],[[\"(\\\\d{8})\",\"$1\",[\"5(?:0|2[23]|3[03]|[67]1|88)\",\"5(?:0|2(?:21|3)|3(?:0|3[23])|616|717|888)\",\"5(?:0|2(?:21|3)|3(?:0|3[23])|616|717|8888)\"],0,1],[\"(\\\\d{4})(\\\\d{4,5})\",\"$1 $2\",[\"180\",\"1800\"],0,1],[\"(\\\\d{3})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"140\"],0,1],[\"(\\\\d{2})(\\\\d{4})(\\\\d{4})\",\"$1 $2 $3\",[\"11|2[02]|33|4[04]|79[1-7]|80[2-46]\",\"11|2[02]|33|4[04]|79(?:[1-6]|7[19])|80(?:[2-4]|6[0-589])\",\"11|2[02]|33|4[04]|79(?:[124-6]|3(?:[02-9]|1[0-24-9])|7(?:1|9[1-6]))|80(?:[2-4]|6[0-589])\"],\"0$1\",1],[\"(\\\\d{3})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"1(?:2[0-249]|3[0-25]|4[145]|[68]|7[1257])|2(?:1[257]|3[013]|4[01]|5[0137]|6[0158]|78|8[1568])|3(?:26|4[1-3]|5[34]|6[01489]|7[02-46]|8[159])|4(?:1[36]|2[1-47]|5[12]|6[0-26-9]|7[0-24-9]|8[013-57]|9[014-7])|5(?:1[025]|22|[36][25]|4[28]|5[12]|[78]1)|6(?:12|[2-4]1|5[17]|6[13]|80)|7(?:12|3[134]|4[47]|61|88)|8(?:16|2[014]|3[126]|6[136]|7[078]|8[34]|91)|(?:43|59|75)[15]|(?:1[59]|29|67|72)[14]\",\"1(?:2[0-24]|3[0-25]|4[145]|[59][14]|6[1-9]|7[1257]|8[1-57-9])|2(?:1[257]|3[013]|4[01]|5[0137]|6[058]|78|8[1568]|9[14])|3(?:26|4[1-3]|5[34]|6[01489]|7[02-46]|8[159])|4(?:1[36]|2[1-47]|3[15]|5[12]|6[0-26-9]|7[0-24-9]|8[013-57]|9[014-7])|5(?:1[025]|22|[36][25]|4[28]|[578]1|9[15])|674|7(?:(?:2[14]|3[34]|5[15])[2-6]|61[346]|88[0-8])|8(?:70[2-6]|84[235-7]|91[3-7])|(?:1(?:29|60|8[06])|261|552|6(?:12|[2-47]1|5[17]|6[13]|80)|7(?:12|31|4[47])|8(?:16|2[014]|3[126]|6[136]|7[78]|83))[2-7]\",\"1(?:2[0-24]|3[0-25]|4[145]|[59][14]|6[1-9]|7[1257]|8[1-57-9])|2(?:1[257]|3[013]|4[01]|5[0137]|6[058]|78|8[1568]|9[14])|3(?:26|4[1-3]|5[34]|6[01489]|7[02-46]|8[159])|4(?:1[36]|2[1-47]|3[15]|5[12]|6[0-26-9]|7[0-24-9]|8[013-57]|9[014-7])|5(?:1[025]|22|[36][25]|4[28]|[578]1|9[15])|6(?:12(?:[2-6]|7[0-8])|74[2-7])|7(?:(?:2[14]|5[15])[2-6]|3171|61[346]|88(?:[2-7]|82))|8(?:70[2-6]|84(?:[2356]|7[19])|91(?:[3-6]|7[19]))|73[134][2-6]|(?:74[47]|8(?:16|2[014]|3[126]|6[136]|7[78]|83))(?:[2-6]|7[19])|(?:1(?:29|60|8[06])|261|552|6(?:[2-4]1|5[17]|6[13]|7(?:1|4[0189])|80)|7(?:12|88[01]))[2-7]\"],\"0$1\",1],[\"(\\\\d{4})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"1(?:[2-479]|5[0235-9])|[2-5]|6(?:1[1358]|2[2457-9]|3[2-5]|4[235-7]|5[2-689]|6[24578]|7[235689]|8[1-6])|7(?:1[013-9]|28|3[129]|4[1-35689]|5[29]|6[02-5]|70)|807\",\"1(?:[2-479]|5[0235-9])|[2-5]|6(?:1[1358]|2(?:[2457]|84|95)|3(?:[2-4]|55)|4[235-7]|5[2-689]|6[24578]|7[235689]|8[1-6])|7(?:1(?:[013-8]|9[6-9])|28[6-8]|3(?:17|2[0-49]|9[2-57])|4(?:1[2-4]|[29][0-7]|3[0-8]|[56]|8[0-24-7])|5(?:2[1-3]|9[0-6])|6(?:0[5689]|2[5-9]|3[02-8]|4|5[0-367])|70[13-7])|807[19]\",\"1(?:[2-479]|5(?:[0236-9]|5[013-9]))|[2-5]|6(?:2(?:84|95)|355|83)|73179|807(?:1|9[1-3])|(?:1552|6(?:1[1358]|2[2457]|3[2-4]|4[235-7]|5[2-689]|6[24578]|7[235689]|8[124-6])\\\\d|7(?:1(?:[013-8]\\\\d|9[6-9])|28[6-8]|3(?:2[0-49]|9[2-57])|4(?:1[2-4]|[29][0-7]|3[0-8]|[56]\\\\d|8[0-24-7])|5(?:2[1-3]|9[0-6])|6(?:0[5689]|2[5-9]|3[02-8]|4\\\\d|5[0-367])|70[13-7]))[2-7]\"],\"0$1\",1],[\"(\\\\d{5})(\\\\d{5})\",\"$1 $2\",[\"[6-9]\"],\"0$1\",1],[\"(\\\\d{4})(\\\\d{2,4})(\\\\d{4})\",\"$1 $2 $3\",[\"1(?:6|8[06])\",\"1(?:6|8[06]0)\"],0,1],[\"(\\\\d{4})(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3 $4\",[\"18\"],0,1]],\"0\",0,0,0,0,0,[0,[\"(?:61279|7(?:887[02-9]|9(?:313|79[07-9]))|8(?:079[04-9]|(?:84|91)7[02-8]))\\\\d{5}|(?:6(?:12|[2-47]1|5[17]|6[13]|80)[0189]|7(?:1(?:2[0189]|9[0-5])|2(?:[14][017-9]|8[0-59])|3(?:2[5-8]|[34][017-9]|9[016-9])|4(?:1[015-9]|[29][89]|39|8[389])|5(?:[15][017-9]|2[04-9]|9[7-9])|6(?:0[0-47]|1[0-257-9]|2[0-4]|3[19]|5[4589])|70[0289]|88[089]|97[02-8])|8(?:0(?:6[67]|7[02-8])|70[017-9]|84[01489]|91[0-289]))\\\\d{6}|(?:7(?:31|4[47])|8(?:16|2[014]|3[126]|6[136]|7[78]|83))(?:[0189]\\\\d|7[02-8])\\\\d{5}|(?:6(?:[09]\\\\d|1[04679]|2[03689]|3[05-9]|4[0489]|50|6[069]|7[07]|8[7-9])|7(?:0\\\\d|2[0235-79]|3[05-8]|40|5[0346-8]|6[6-9]|7[1-9]|8[0-79]|9[089])|8(?:0[01589]|1[0-57-9]|2[235-9]|3[03-57-9]|[45]\\\\d|6[02457-9]|7[1-69]|8[0-25-9]|9[02-9])|9\\\\d\\\\d)\\\\d{7}|(?:6(?:(?:1[1358]|2[2457]|3[2-4]|4[235-7]|5[2-689]|6[24578]|8[124-6])\\\\d|7(?:[235689]\\\\d|4[0189]))|7(?:1(?:[013-8]\\\\d|9[6-9])|28[6-8]|3(?:2[0-49]|9[2-5])|4(?:1[2-4]|[29][0-7]|3[0-8]|[56]\\\\d|8[0-24-7])|5(?:2[1-3]|9[0-6])|6(?:0[5689]|2[5-9]|3[02-8]|4\\\\d|5[0-367])|70[13-7]|881))[0189]\\\\d{5}\",[10]]]],\"IO\":[\"246\",\"00\",\"3\\\\d{6}\",[7],[[\"(\\\\d{3})(\\\\d{4})\",\"$1 $2\",[\"3\"]]],0,0,0,0,0,0,[0,[\"38\\\\d{5}\"]]],\"IQ\":[\"964\",\"00\",\"(?:1|7\\\\d\\\\d)\\\\d{7}|[2-6]\\\\d{7,8}\",[8,9,10],[[\"(\\\\d)(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"1\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{3,4})\",\"$1 $2 $3\",[\"[2-6]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"7\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"7[3-9]\\\\d{8}\",[10]]]],\"IR\":[\"98\",\"00\",\"[1-9]\\\\d{9}|(?:[1-8]\\\\d\\\\d|9)\\\\d{3,4}\",[4,5,6,7,10],[[\"(\\\\d{4,5})\",\"$1\",[\"96\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{4,5})\",\"$1 $2\",[\"(?:1[137]|2[13-68]|3[1458]|4[145]|5[1468]|6[16]|7[1467]|8[13467])[12689]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3,4})\",\"$1 $2 $3\",[\"9\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{4})(\\\\d{4})\",\"$1 $2 $3\",[\"[1-8]\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"9(?:(?:0(?:[0-35]\\\\d|4[4-6])|(?:[13]\\\\d|2[0-3])\\\\d)\\\\d|9(?:[0-46]\\\\d\\\\d|5[15]0|8(?:1\\\\d|88)|9(?:0[0-3]|[19]\\\\d|21|77|8[7-9])))\\\\d{5}\",[10]]]],\"IS\":[\"354\",\"00|1(?:0(?:01|[12]0)|100)\",\"(?:38\\\\d|[4-9])\\\\d{6}\",[7,9],[[\"(\\\\d{3})(\\\\d{4})\",\"$1 $2\",[\"[4-9]\"]],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"3\"]]],0,0,0,0,0,0,[0,[\"(?:38[589]\\\\d\\\\d|6(?:1[1-8]|2[0-6]|3[026-9]|4[014679]|5[0159]|6[0-69]|70|8[06-8]|9\\\\d)|7(?:5[057]|[6-9]\\\\d)|8(?:2[0-59]|[3-69]\\\\d|8[238]))\\\\d{4}\"]],\"00\"],\"IT\":[\"39\",\"00\",\"0\\\\d{5,10}|1\\\\d{8,10}|3(?:[0-8]\\\\d{7,10}|9\\\\d{7,8})|(?:55|70)\\\\d{8}|8\\\\d{5}(?:\\\\d{2,4})?\",[6,7,8,9,10,11],[[\"(\\\\d{2})(\\\\d{4,6})\",\"$1 $2\",[\"0[26]\"]],[\"(\\\\d{3})(\\\\d{3,6})\",\"$1 $2\",[\"0[13-57-9][0159]|8(?:03|4[17]|9[2-5])\",\"0[13-57-9][0159]|8(?:03|4[17]|9(?:2|3[04]|[45][0-4]))\"]],[\"(\\\\d{4})(\\\\d{2,6})\",\"$1 $2\",[\"0(?:[13-579][2-46-8]|8[236-8])\"]],[\"(\\\\d{4})(\\\\d{4})\",\"$1 $2\",[\"894\"]],[\"(\\\\d{2})(\\\\d{3,4})(\\\\d{4})\",\"$1 $2 $3\",[\"0[26]|5\"]],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3,4})\",\"$1 $2 $3\",[\"1(?:44|[679])|[378]\"]],[\"(\\\\d{3})(\\\\d{3,4})(\\\\d{4})\",\"$1 $2 $3\",[\"0[13-57-9][0159]|14\"]],[\"(\\\\d{2})(\\\\d{4})(\\\\d{5})\",\"$1 $2 $3\",[\"0[26]\"]],[\"(\\\\d{4})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"0\"]],[\"(\\\\d{3})(\\\\d{4})(\\\\d{4,5})\",\"$1 $2 $3\",[\"3\"]]],0,0,0,0,0,0,[0,[\"3[1-9]\\\\d{8}|3[2-9]\\\\d{7}\",[9,10]]]],\"JE\":[\"44\",\"00\",\"1534\\\\d{6}|(?:[3578]\\\\d|90)\\\\d{8}\",[10],0,\"0\",0,\"0|([0-24-8]\\\\d{5})$\",\"1534$1\",0,0,[0,[\"7(?:(?:(?:50|82)9|937)\\\\d|7(?:00[378]|97[7-9]))\\\\d{5}\"]]],\"JM\":[\"1\",\"011\",\"(?:[58]\\\\d\\\\d|658|900)\\\\d{7}\",[10],0,\"1\",0,0,0,0,\"658|876\",[0,[\"(?:658295|876(?:2(?:0[1-9]|[13-9]\\\\d|2[013-9])|[348]\\\\d\\\\d|5(?:0[1-9]|[1-9]\\\\d)|6(?:4[89]|6[67])|7(?:0[07]|7\\\\d|8[1-47-9]|9[0-36-9])|9(?:[01]9|9[0579])))\\\\d{4}\"]]],\"JO\":[\"962\",\"00\",\"(?:(?:[2689]|7\\\\d)\\\\d|32|53)\\\\d{6}\",[8,9],[[\"(\\\\d)(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"[2356]|87\"],\"(0$1)\"],[\"(\\\\d{3})(\\\\d{5,6})\",\"$1 $2\",[\"[89]\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{7})\",\"$1 $2\",[\"70\"],\"0$1\"],[\"(\\\\d)(\\\\d{4})(\\\\d{4})\",\"$1 $2 $3\",[\"7\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"7(?:[78][0-25-9]|9\\\\d)\\\\d{6}\",[9]]]],\"JP\":[\"81\",\"010\",\"00[1-9]\\\\d{6,14}|[257-9]\\\\d{9}|(?:00|[1-9]\\\\d\\\\d)\\\\d{6}\",[8,9,10,11,12,13,14,15,16,17],[[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1-$2-$3\",[\"(?:12|57|99)0\"],\"0$1\"],[\"(\\\\d{4})(\\\\d)(\\\\d{4})\",\"$1-$2-$3\",[\"1(?:26|3[79]|4[56]|5[4-68]|6[3-5])|499|5(?:76|97)|746|8(?:3[89]|47|51|63)|9(?:80|9[16])\",\"1(?:267|3(?:7[247]|9[278])|466|5(?:47|58|64)|6(?:3[245]|48|5[4-68]))|499[2468]|5(?:76|97)9|7468|8(?:3(?:8[7-9]|96)|477|51[2-9]|636)|9(?:802|9(?:1[23]|69))|1(?:45|58)[67]\",\"1(?:267|3(?:7[247]|9[278])|466|5(?:47|58|64)|6(?:3[245]|48|5[4-68]))|499[2468]|5(?:769|979[2-69])|7468|8(?:3(?:8[7-9]|96[2457-9])|477|51[2-9]|636[457-9])|9(?:802|9(?:1[23]|69))|1(?:45|58)[67]\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{4})\",\"$1-$2-$3\",[\"60\"],\"0$1\"],[\"(\\\\d)(\\\\d{4})(\\\\d{4})\",\"$1-$2-$3\",[\"[36]|4(?:2[09]|7[01])\",\"[36]|4(?:2(?:0|9[02-69])|7(?:0[019]|1))\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{4})\",\"$1-$2-$3\",[\"1(?:1|5[45]|77|88|9[69])|2(?:2[1-37]|3[0-269]|4[59]|5|6[24]|7[1-358]|8[1369]|9[0-38])|4(?:[28][1-9]|3[0-57]|[45]|6[248]|7[2-579]|9[29])|5(?:2|3[045]|4[0-369]|5[29]|8[02389]|9[0-389])|7(?:2[02-46-9]|34|[58]|6[0249]|7[57]|9[2-6])|8(?:2[124589]|3[27-9]|49|51|6|7[0-468]|8[68]|9[019])|9(?:[23][1-9]|4[15]|5[138]|6[1-3]|7[156]|8[189]|9[1-489])\",\"1(?:1|5(?:4[018]|5[017])|77|88|9[69])|2(?:2(?:[127]|3[014-9])|3[0-269]|4[59]|5(?:[1-3]|5[0-69]|9[19])|62|7(?:[1-35]|8[0189])|8(?:[16]|3[0134]|9[0-5])|9(?:[028]|17))|4(?:2(?:[13-79]|8[014-6])|3[0-57]|[45]|6[248]|7[2-47]|8[1-9])|5(?:2|3[045]|4[0-369]|8[02389]|9[0-3])|7(?:2[02-46-9]|34|[58]|6[0249]|7[57]|9(?:[23]|4[0-59]|5[01569]|6[0167]))|8(?:2(?:[1258]|4[0-39]|9[0-2469])|49|51|6(?:[0-24]|36|5[0-3589]|72|9[01459])|7[0-468]|8[68])|9(?:[23][1-9]|4[15]|5[138]|6[1-3]|7[156]|8[189]|9(?:[1289]|3[34]|4[0178]))|(?:49|55|83)[29]|(?:264|837)[016-9]|2(?:57|93)[015-9]|(?:25[0468]|422|838)[01]|(?:47[59]|59[89]|8(?:6[68]|9))[019]\",\"1(?:1|5(?:4[018]|5[017])|77|88|9[69])|2(?:2[127]|3[0-269]|4[59]|5(?:[1-3]|5[0-69]|9(?:17|99))|6(?:2|4[016-9])|7(?:[1-35]|8[0189])|8(?:[16]|3[0134]|9[0-5])|9(?:[028]|17))|4(?:2(?:[13-79]|8[014-6])|3[0-57]|[45]|6[248]|7[2-47]|9[29])|5(?:2|3[045]|4[0-369]|5[29]|8[02389]|9[0-3])|7(?:2[02-46-9]|34|[58]|6[0249]|7[57]|9(?:[23]|4[0-59]|5[01569]|6[0167]))|8(?:2(?:[1258]|4[0-39]|9[0169])|3(?:[29]|7(?:[017-9]|6[6-8]))|49|51|6(?:[0-24]|36[23]|5(?:[0-389]|5[23])|6(?:[01]|9[178])|72|9[0145])|7[0-468]|8[68])|9(?:4[15]|5[138]|7[156]|8[189]|9(?:[1289]|3(?:31|4[357])|4[0178]))|(?:8294|96)[1-3]|2(?:57|93)[015-9]|(?:223|8699)[014-9]|(?:25[0468]|422|838)[01]|(?:48|8292|9[23])[1-9]|(?:47[59]|59[89]|8(?:68|9))[019]\",\"1(?:1|5(?:4[018]|5[017])|77|88|9[69])|2(?:2[127]|3[0-269]|4[59]|5(?:[1-3]|5[0-69]|7[015-9]|9(?:17|99))|6(?:2|4[016-9])|7(?:[1-35]|8[0189])|8(?:[16]|3[0134]|9[0-5])|9(?:[028]|17|3[015-9]))|4(?:2(?:[13-79]|8[014-6])|3[0-57]|[45]|6[248]|7[2-47]|9[29])|5(?:2|3[045]|4[0-369]|5[29]|8[02389]|9[0-3])|7(?:2[02-46-9]|34|[58]|6[0249]|7[57]|9(?:[23]|4[0-59]|5[01569]|6[0167]))|8(?:2(?:[1258]|4[0-39]|9(?:[019]|4[1-3]|6(?:[0-47-9]|5[01346-9])))|3(?:[29]|7(?:[017-9]|6[6-8]))|49|51|6(?:[0-24]|36[23]|5(?:[0-389]|5[23])|6(?:[01]|9[178])|72|9[0145])|7[0-468]|8[68])|9(?:4[15]|5[138]|6[1-3]|7[156]|8[189]|9(?:[1289]|3(?:31|4[357])|4[0178]))|(?:223|8699)[014-9]|(?:25[0468]|422|838)[01]|(?:48|829(?:2|66)|9[23])[1-9]|(?:47[59]|59[89]|8(?:68|9))[019]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{2})(\\\\d{4})\",\"$1-$2-$3\",[\"[14]|[289][2-9]|5[3-9]|7[2-4679]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{4})\",\"$1-$2-$3\",[\"800\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{4})(\\\\d{4})\",\"$1-$2-$3\",[\"[257-9]\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"[7-9]0[1-9]\\\\d{7}\",[10]]]],\"KE\":[\"254\",\"000\",\"(?:[17]\\\\d\\\\d|900)\\\\d{6}|(?:2|80)0\\\\d{6,7}|[4-6]\\\\d{6,8}\",[7,8,9,10],[[\"(\\\\d{2})(\\\\d{5,7})\",\"$1 $2\",[\"[24-6]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{6})\",\"$1 $2\",[\"[17]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3,4})\",\"$1 $2 $3\",[\"[89]\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"(?:1(?:0[0-6]|1[0-5]|2[014]|30)|7\\\\d\\\\d)\\\\d{6}\",[9]]]],\"KG\":[\"996\",\"00\",\"8\\\\d{9}|(?:[235-8]\\\\d|99)\\\\d{7}\",[9,10],[[\"(\\\\d{4})(\\\\d{5})\",\"$1 $2\",[\"3(?:1[346]|[24-79])\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"[235-79]|88\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d)(\\\\d{2,3})\",\"$1 $2 $3 $4\",[\"8\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"312(?:58\\\\d|973)\\\\d{3}|(?:2(?:0[0-35]|2\\\\d)|5[0-24-7]\\\\d|600|7(?:[07]\\\\d|55)|88[08]|99[05-9])\\\\d{6}\",[9]]]],\"KH\":[\"855\",\"00[14-9]\",\"1\\\\d{9}|[1-9]\\\\d{7,8}\",[8,9,10],[[\"(\\\\d{2})(\\\\d{3})(\\\\d{3,4})\",\"$1 $2 $3\",[\"[1-9]\"],\"0$1\"],[\"(\\\\d{4})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"1\"]]],\"0\",0,0,0,0,0,[0,[\"(?:(?:1[28]|3[18]|9[67])\\\\d|6[016-9]|7(?:[07-9]|[16]\\\\d)|8(?:[013-79]|8\\\\d))\\\\d{6}|(?:1\\\\d|9[0-57-9])\\\\d{6}|(?:2[3-6]|3[2-6]|4[2-4]|[5-7][2-5])48\\\\d{5}\",[8,9]]]],\"KI\":[\"686\",\"00\",\"(?:[37]\\\\d|6[0-79])\\\\d{6}|(?:[2-48]\\\\d|50)\\\\d{3}\",[5,8],0,\"0\",0,0,0,0,0,[0,[\"(?:63\\\\d{3}|73(?:0[0-5]\\\\d|140))\\\\d{3}|[67]200[01]\\\\d{3}\",[8]]]],\"KM\":[\"269\",\"00\",\"[3478]\\\\d{6}\",[7],[[\"(\\\\d{3})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3\",[\"[3478]\"]]],0,0,0,0,0,0,[0,[\"[34]\\\\d{6}\"]]],\"KN\":[\"1\",\"011\",\"(?:[58]\\\\d\\\\d|900)\\\\d{7}\",[10],0,\"1\",0,\"1|([2-7]\\\\d{6})$\",\"869$1\",0,\"869\",[0,[\"869(?:48[89]|55[6-8]|66\\\\d|76[02-7])\\\\d{4}\"]]],\"KP\":[\"850\",\"00|99\",\"85\\\\d{6}|(?:19\\\\d|[2-7])\\\\d{7}\",[8,10],[[\"(\\\\d{2})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"8\"],\"0$1\"],[\"(\\\\d)(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"[2-7]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"1\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"19[1-3]\\\\d{7}\",[10]]]],\"KR\":[\"82\",\"00(?:[125689]|3(?:[46]5|91)|7(?:00|27|3|55|6[126]))\",\"00[1-9]\\\\d{8,11}|(?:[12]|5\\\\d{3})\\\\d{7}|[13-6]\\\\d{9}|(?:[1-6]\\\\d|80)\\\\d{7}|[3-6]\\\\d{4,5}|(?:00|7)0\\\\d{8}\",[5,6,8,9,10,11,12,13,14],[[\"(\\\\d{2})(\\\\d{3,4})\",\"$1-$2\",[\"(?:3[1-3]|[46][1-4]|5[1-5])1\"],\"0$1\"],[\"(\\\\d{4})(\\\\d{4})\",\"$1-$2\",[\"1\"]],[\"(\\\\d)(\\\\d{3,4})(\\\\d{4})\",\"$1-$2-$3\",[\"2\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{4})\",\"$1-$2-$3\",[\"60|8\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3,4})(\\\\d{4})\",\"$1-$2-$3\",[\"[1346]|5[1-5]\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{4})(\\\\d{4})\",\"$1-$2-$3\",[\"[57]\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{5})(\\\\d{4})\",\"$1-$2-$3\",[\"5\"],\"0$1\"]],\"0\",0,\"0(8(?:[1-46-8]|5\\\\d\\\\d))?\",0,0,0,[0,[\"1(?:05(?:[0-8]\\\\d|9[0-6])|22[13]\\\\d)\\\\d{4,5}|1(?:0[1-46-9]|[16-9]\\\\d|2[013-9])\\\\d{6,7}\",[9,10]]]],\"KW\":[\"965\",\"00\",\"18\\\\d{5}|(?:[2569]\\\\d|41)\\\\d{6}\",[7,8],[[\"(\\\\d{4})(\\\\d{3,4})\",\"$1 $2\",[\"[169]|2(?:[235]|4[1-35-9])|52\"]],[\"(\\\\d{3})(\\\\d{5})\",\"$1 $2\",[\"[245]\"]]],0,0,0,0,0,0,[0,[\"(?:41\\\\d\\\\d|5(?:(?:[05]\\\\d|1[0-7]|6[56])\\\\d|2(?:22|5[25])|7(?:55|77)|88[58])|6(?:(?:0[034679]|5[015-9]|6\\\\d)\\\\d|1(?:00|11|66)|222|3[36]3|444|7(?:0[013-9]|[67]\\\\d)|888|9(?:[069]\\\\d|3[039]))|9(?:(?:0[09]|22|[4679]\\\\d|8[057-9])\\\\d|1(?:1[01]|99)|3(?:00|33)|5(?:00|5\\\\d)))\\\\d{4}\",[8]]]],\"KY\":[\"1\",\"011\",\"(?:345|[58]\\\\d\\\\d|900)\\\\d{7}\",[10],0,\"1\",0,\"1|([2-9]\\\\d{6})$\",\"345$1\",0,\"345\",[0,[\"345(?:32[1-9]|42[0-4]|5(?:1[67]|2[5-79]|4[6-9]|50|76)|649|82[56]|9(?:1[679]|2[2-9]|3[06-9]|90))\\\\d{4}\"]]],\"KZ\":[\"7\",\"810\",\"(?:33622|8\\\\d{8})\\\\d{5}|[78]\\\\d{9}\",[10,14],0,\"8\",0,0,0,0,\"33|7\",[0,[\"7(?:0[0-25-8]|47|6[0-4]|7[15-8]|85)\\\\d{7}\",[10]]],\"8~10\"],\"LA\":[\"856\",\"00\",\"[23]\\\\d{9}|3\\\\d{8}|(?:[235-8]\\\\d|41)\\\\d{6}\",[8,9,10],[[\"(\\\\d{2})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"2[13]|3[14]|[4-8]\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{2})(\\\\d{2})(\\\\d{3})\",\"$1 $2 $3 $4\",[\"30[013-9]\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{2})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3 $4\",[\"[23]\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"(?:20(?:[239]\\\\d|5[24-9]|7[6-8]|88)|302\\\\d)\\\\d{6}\",[10]]]],\"LB\":[\"961\",\"00\",\"[27-9]\\\\d{7}|[13-9]\\\\d{6}\",[7,8],[[\"(\\\\d)(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"[13-69]|7(?:[2-57]|62|8[0-7]|9[04-9])|8[02-9]\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"[27-9]\"]]],\"0\",0,0,0,0,0,[0,[\"793(?:[01]\\\\d|2[0-4])\\\\d{3}|(?:(?:3|81)\\\\d|7(?:[01]\\\\d|6[013-9]|8[89]|9[12]))\\\\d{5}\"]]],\"LC\":[\"1\",\"011\",\"(?:[58]\\\\d\\\\d|758|900)\\\\d{7}\",[10],0,\"1\",0,\"1|([2-8]\\\\d{6})$\",\"758$1\",0,\"758\",[0,[\"758(?:28[4-7]|384|4(?:6[01]|8[4-9])|5(?:1[89]|20|84)|7(?:1[2-9]|2\\\\d|3[0-3])|812)\\\\d{4}\"]]],\"LI\":[\"423\",\"00\",\"[68]\\\\d{8}|(?:[2378]\\\\d|90)\\\\d{5}\",[7,9],[[\"(\\\\d{3})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3\",[\"[2379]|8(?:0[09]|7)\",\"[2379]|8(?:0(?:02|9)|7)\"]],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"8\"]],[\"(\\\\d{2})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"69\"]],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"6\"]]],\"0\",0,\"0|(1001)\",0,0,0,[0,[\"(?:6(?:(?:4[5-9]|5[0-4])\\\\d|6(?:[0245]\\\\d|[17]0|3[7-9]))\\\\d|7(?:[37-9]\\\\d|42|56))\\\\d{4}\"]]],\"LK\":[\"94\",\"00\",\"[1-9]\\\\d{8}\",[9],[[\"(\\\\d{2})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"7\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"[1-689]\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"7(?:[0-25-8]\\\\d|4[0-4])\\\\d{6}\"]]],\"LR\":[\"231\",\"00\",\"(?:[25]\\\\d|33|77|88)\\\\d{7}|(?:2\\\\d|[4-6])\\\\d{6}\",[7,8,9],[[\"(\\\\d)(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"[4-6]\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"2\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"[23578]\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"(?:(?:(?:22|33)0|555|(?:77|88)\\\\d)\\\\d|4[67])\\\\d{5}|[56]\\\\d{6}\",[7,9]]]],\"LS\":[\"266\",\"00\",\"(?:[256]\\\\d\\\\d|800)\\\\d{5}\",[8],[[\"(\\\\d{4})(\\\\d{4})\",\"$1 $2\",[\"[2568]\"]]],0,0,0,0,0,0,[0,[\"[56]\\\\d{7}\"]]],\"LT\":[\"370\",\"00\",\"(?:[3469]\\\\d|52|[78]0)\\\\d{6}\",[8],[[\"(\\\\d)(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"52[0-7]\"],\"(8-$1)\",1],[\"(\\\\d{3})(\\\\d{2})(\\\\d{3})\",\"$1 $2 $3\",[\"[7-9]\"],\"8 $1\",1],[\"(\\\\d{2})(\\\\d{6})\",\"$1 $2\",[\"37|4(?:[15]|6[1-8])\"],\"(8-$1)\",1],[\"(\\\\d{3})(\\\\d{5})\",\"$1 $2\",[\"[3-6]\"],\"(8-$1)\",1]],\"8\",0,\"[08]\",0,0,0,[0,[\"6\\\\d{7}\"]]],\"LU\":[\"352\",\"00\",\"35[013-9]\\\\d{4,8}|6\\\\d{8}|35\\\\d{2,4}|(?:[2457-9]\\\\d|3[0-46-9])\\\\d{2,9}\",[4,5,6,7,8,9,10,11],[[\"(\\\\d{2})(\\\\d{3})\",\"$1 $2\",[\"2(?:0[2-689]|[2-9])|[3-57]|8(?:0[2-9]|[13-9])|9(?:0[89]|[2-579])\"]],[\"(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3\",[\"2(?:0[2-689]|[2-9])|[3-57]|8(?:0[2-9]|[13-9])|9(?:0[89]|[2-579])\"]],[\"(\\\\d{2})(\\\\d{2})(\\\\d{3})\",\"$1 $2 $3\",[\"20[2-689]\"]],[\"(\\\\d{2})(\\\\d{2})(\\\\d{2})(\\\\d{1,2})\",\"$1 $2 $3 $4\",[\"2(?:[0367]|4[3-8])\"]],[\"(\\\\d{3})(\\\\d{2})(\\\\d{3})\",\"$1 $2 $3\",[\"80[01]|90[015]\"]],[\"(\\\\d{2})(\\\\d{2})(\\\\d{2})(\\\\d{3})\",\"$1 $2 $3 $4\",[\"20\"]],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"6\"]],[\"(\\\\d{2})(\\\\d{2})(\\\\d{2})(\\\\d{2})(\\\\d{1,2})\",\"$1 $2 $3 $4 $5\",[\"2(?:[0367]|4[3-8])\"]],[\"(\\\\d{2})(\\\\d{2})(\\\\d{2})(\\\\d{1,5})\",\"$1 $2 $3 $4\",[\"[3-57]|8[13-9]|9(?:0[89]|[2-579])|(?:2|80)[2-9]\"]]],0,0,\"(15(?:0[06]|1[12]|[35]5|4[04]|6[26]|77|88|99)\\\\d)\",0,0,0,[0,[\"6(?:[269][18]|5[1568]|7[189]|81)\\\\d{6}\",[9]]]],\"LV\":[\"371\",\"00\",\"(?:[268]\\\\d|90)\\\\d{6}\",[8],[[\"(\\\\d{2})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"[269]|8[01]\"]]],0,0,0,0,0,0,[0,[\"23(?:23[0-57-9]|33[0238])\\\\d{3}|2(?:[0-24-9]\\\\d\\\\d|3(?:0[07]|[14-9]\\\\d|2[024-9]|3[0-24-9]))\\\\d{4}\"]]],\"LY\":[\"218\",\"00\",\"[2-9]\\\\d{8}\",[9],[[\"(\\\\d{2})(\\\\d{7})\",\"$1-$2\",[\"[2-9]\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"9[1-6]\\\\d{7}\"]]],\"MA\":[\"212\",\"00\",\"[5-8]\\\\d{8}\",[9],[[\"(\\\\d{5})(\\\\d{4})\",\"$1-$2\",[\"5(?:29|38)\",\"5(?:29[1289]|389)\",\"529(?:1[1-46-9]|2[013-8]|90)|5(?:298|389)[0-46-9]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"5[45]\"],\"0$1\"],[\"(\\\\d{4})(\\\\d{5})\",\"$1-$2\",[\"5(?:2[2-489]|3[5-9]|9)|892\",\"5(?:2(?:[2-49]|8[235-9])|3[5-9]|9)|892\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{7})\",\"$1-$2\",[\"8\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{6})\",\"$1-$2\",[\"[5-7]\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"(?:6(?:[0-79]\\\\d|8[0-247-9])|7(?:[017]\\\\d|2[0-2]|6[0-8]|8[0-3]))\\\\d{6}\"]]],\"MC\":[\"377\",\"00\",\"(?:[3489]|6\\\\d)\\\\d{7}\",[8,9],[[\"(\\\\d{2})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"4\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"[389]\"]],[\"(\\\\d)(\\\\d{2})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4 $5\",[\"6\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"4(?:[46]\\\\d|5[1-9])\\\\d{5}|(?:3|6\\\\d)\\\\d{7}\"]]],\"MD\":[\"373\",\"00\",\"(?:[235-7]\\\\d|[89]0)\\\\d{6}\",[8],[[\"(\\\\d{3})(\\\\d{5})\",\"$1 $2\",[\"[89]\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"22|3\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{2})(\\\\d{3})\",\"$1 $2 $3\",[\"[25-7]\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"562\\\\d{5}|(?:6\\\\d|7[16-9])\\\\d{6}\"]]],\"ME\":[\"382\",\"00\",\"(?:20|[3-79]\\\\d)\\\\d{6}|80\\\\d{6,7}\",[8,9],[[\"(\\\\d{2})(\\\\d{3})(\\\\d{3,4})\",\"$1 $2 $3\",[\"[2-9]\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"6(?:[07-9]\\\\d|3[024]|6[0-25])\\\\d{5}\",[8]]]],\"MF\":[\"590\",\"00\",\"(?:590|(?:69|80)\\\\d|976)\\\\d{6}\",[9],0,\"0\",0,0,0,0,0,[0,[\"69(?:0\\\\d\\\\d|1(?:2[2-9]|3[0-5]))\\\\d{4}\"]]],\"MG\":[\"261\",\"00\",\"[23]\\\\d{8}\",[9],[[\"(\\\\d{2})(\\\\d{2})(\\\\d{3})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"[23]\"],\"0$1\"]],\"0\",0,\"0|([24-9]\\\\d{6})$\",\"20$1\",0,0,[0,[\"3[2-47-9]\\\\d{7}\"]]],\"MH\":[\"692\",\"011\",\"329\\\\d{4}|(?:[256]\\\\d|45)\\\\d{5}\",[7],[[\"(\\\\d{3})(\\\\d{4})\",\"$1-$2\",[\"[2-6]\"]]],\"1\",0,0,0,0,0,[0,[\"(?:(?:23|54)5|329|45[356])\\\\d{4}\"]]],\"MK\":[\"389\",\"00\",\"[2-578]\\\\d{7}\",[8],[[\"(\\\\d)(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"2|34[47]|4(?:[37]7|5[47]|64)\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"[347]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d)(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"[58]\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"7(?:3555|(?:474|9[019]7)7)\\\\d{3}|7(?:[0-25-8]\\\\d\\\\d|3(?:[1-48]\\\\d|7[01578])|4(?:2\\\\d|60|7[01578])|9(?:[2-4]\\\\d|7[015]))\\\\d{4}\"]]],\"ML\":[\"223\",\"00\",\"[24-9]\\\\d{7}\",[8],[[\"(\\\\d{2})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"[24-9]\"]]],0,0,0,0,0,0,[0,[\"2(?:0(?:01|79)|17\\\\d)\\\\d{4}|(?:5[01]|[679]\\\\d|8[2-49])\\\\d{6}\"]]],\"MM\":[\"95\",\"00\",\"1\\\\d{5,7}|95\\\\d{6}|(?:[4-7]|9[0-46-9])\\\\d{6,8}|(?:2|8\\\\d)\\\\d{5,8}\",[6,7,8,9,10],[[\"(\\\\d)(\\\\d{2})(\\\\d{3})\",\"$1 $2 $3\",[\"16|2\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{2})(\\\\d{3})\",\"$1 $2 $3\",[\"[45]|6(?:0[23]|[1-689]|7[235-7])|7(?:[0-4]|5[2-7])|8[1-6]\"],\"0$1\"],[\"(\\\\d)(\\\\d{3})(\\\\d{3,4})\",\"$1 $2 $3\",[\"[12]\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{3,4})\",\"$1 $2 $3\",[\"[4-7]|8[1-35]\"],\"0$1\"],[\"(\\\\d)(\\\\d{3})(\\\\d{4,6})\",\"$1 $2 $3\",[\"9(?:2[0-4]|[35-9]|4[137-9])\"],\"0$1\"],[\"(\\\\d)(\\\\d{4})(\\\\d{4})\",\"$1 $2 $3\",[\"2\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"8\"],\"0$1\"],[\"(\\\\d)(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3 $4\",[\"92\"],\"0$1\"],[\"(\\\\d)(\\\\d{5})(\\\\d{4})\",\"$1 $2 $3\",[\"9\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"(?:17[01]|9(?:2(?:[0-4]|[56]\\\\d\\\\d)|(?:3(?:[0-36]|4\\\\d)|(?:6\\\\d|9[4-8])\\\\d|7(?:3|40|[5-9]\\\\d)|8(?:78|[89]\\\\d))\\\\d|4(?:(?:[0245]\\\\d|[1379])\\\\d|88)|5[0-6])\\\\d)\\\\d{4}|9[69]1\\\\d{6}|9(?:[68]\\\\d|9[089])\\\\d{5}\",[7,8,9,10]]]],\"MN\":[\"976\",\"001\",\"[12]\\\\d{7,9}|[5-9]\\\\d{7}\",[8,9,10],[[\"(\\\\d{2})(\\\\d{2})(\\\\d{4})\",\"$1 $2 $3\",[\"[12]1\"],\"0$1\"],[\"(\\\\d{4})(\\\\d{4})\",\"$1 $2\",[\"[5-9]\"]],[\"(\\\\d{3})(\\\\d{5,6})\",\"$1 $2\",[\"[12]2[1-3]\"],\"0$1\"],[\"(\\\\d{4})(\\\\d{5,6})\",\"$1 $2\",[\"[12](?:27|3[2-8]|4[2-68]|5[1-4689])\",\"[12](?:27|3[2-8]|4[2-68]|5[1-4689])[0-3]\"],\"0$1\"],[\"(\\\\d{5})(\\\\d{4,5})\",\"$1 $2\",[\"[12]\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"(?:83[01]|920)\\\\d{5}|(?:5[05]|6[06]|8[015689]|9[013-9])\\\\d{6}\",[8]]]],\"MO\":[\"853\",\"00\",\"0800\\\\d{3}|(?:28|[68]\\\\d)\\\\d{6}\",[7,8],[[\"(\\\\d{4})(\\\\d{3})\",\"$1 $2\",[\"0\"]],[\"(\\\\d{4})(\\\\d{4})\",\"$1 $2\",[\"[268]\"]]],0,0,0,0,0,0,[0,[\"6800[0-79]\\\\d{3}|6(?:[235]\\\\d\\\\d|6(?:0[0-5]|[1-9]\\\\d)|8(?:0[1-9]|[14-8]\\\\d|2[5-9]|[39][0-4]))\\\\d{4}\",[8]]]],\"MP\":[\"1\",\"011\",\"[58]\\\\d{9}|(?:67|90)0\\\\d{7}\",[10],0,\"1\",0,\"1|([2-9]\\\\d{6})$\",\"670$1\",0,\"670\",[0,[\"670(?:2(?:3[3-7]|56|8[4-8])|32[1-38]|4(?:33|8[348])|5(?:32|55|88)|6(?:64|70|82)|78[3589]|8[3-9]8|989)\\\\d{4}\"]]],\"MQ\":[\"596\",\"00\",\"(?:69|80)\\\\d{7}|(?:59|97)6\\\\d{6}\",[9],[[\"(\\\\d{3})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"[569]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"8\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"69(?:6(?:[0-46-9]\\\\d|5[0-6])|727)\\\\d{4}\"]]],\"MR\":[\"222\",\"00\",\"(?:[2-4]\\\\d\\\\d|800)\\\\d{5}\",[8],[[\"(\\\\d{2})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"[2-48]\"]]],0,0,0,0,0,0,[0,[\"[2-4][0-46-9]\\\\d{6}\"]]],\"MS\":[\"1\",\"011\",\"(?:[58]\\\\d\\\\d|664|900)\\\\d{7}\",[10],0,\"1\",0,\"1|([34]\\\\d{6})$\",\"664$1\",0,\"664\",[0,[\"664(?:3(?:49|9[1-6])|49[2-6])\\\\d{4}\"]]],\"MT\":[\"356\",\"00\",\"3550\\\\d{4}|(?:[2579]\\\\d\\\\d|800)\\\\d{5}\",[8],[[\"(\\\\d{4})(\\\\d{4})\",\"$1 $2\",[\"[2357-9]\"]]],0,0,0,0,0,0,[0,[\"(?:7(?:210|[79]\\\\d\\\\d)|9(?:[29]\\\\d\\\\d|69[67]|8(?:1[1-3]|89|97)))\\\\d{4}\"]]],\"MU\":[\"230\",\"0(?:0|[24-7]0|3[03])\",\"(?:[57]|8\\\\d\\\\d)\\\\d{7}|[2-468]\\\\d{6}\",[7,8,10],[[\"(\\\\d{3})(\\\\d{4})\",\"$1 $2\",[\"[2-46]|8[013]\"]],[\"(\\\\d{4})(\\\\d{4})\",\"$1 $2\",[\"[57]\"]],[\"(\\\\d{5})(\\\\d{5})\",\"$1 $2\",[\"8\"]]],0,0,0,0,0,0,[0,[\"5(?:4(?:2[1-389]|7[1-9])|87[15-8])\\\\d{4}|(?:5(?:2[5-9]|4[3-689]|[57]\\\\d|8[0-689]|9[0-8])|7(?:01|30))\\\\d{5}\",[8]]],\"020\"],\"MV\":[\"960\",\"0(?:0|19)\",\"(?:800|9[0-57-9]\\\\d)\\\\d{7}|[34679]\\\\d{6}\",[7,10],[[\"(\\\\d{3})(\\\\d{4})\",\"$1-$2\",[\"[3467]|9[1-9]\"]],[\"(\\\\d{3})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"[89]\"]]],0,0,0,0,0,0,[0,[\"46[46]\\\\d{4}|(?:7\\\\d|9[1-9])\\\\d{5}\",[7]]],\"00\"],\"MW\":[\"265\",\"00\",\"(?:[1289]\\\\d|31|77)\\\\d{7}|1\\\\d{6}\",[7,9],[[\"(\\\\d)(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"1[2-9]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"2\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"[137-9]\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"111\\\\d{6}|(?:31|77|[89][89])\\\\d{7}\",[9]]]],\"MX\":[\"52\",\"0[09]\",\"1(?:(?:[27]2|44|99)[1-9]|65[0-689])\\\\d{7}|(?:1(?:[01]\\\\d|2[13-9]|[35][1-9]|4[0-35-9]|6[0-46-9]|7[013-9]|8[1-79]|9[1-8])|[2-9]\\\\d)\\\\d{8}\",[10,11],[[\"(\\\\d{2})(\\\\d{4})(\\\\d{4})\",\"$1 $2 $3\",[\"33|5[56]|81\"],0,1],[\"(\\\\d{3})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"[2-9]\"],0,1],[\"(\\\\d)(\\\\d{2})(\\\\d{4})(\\\\d{4})\",\"$2 $3 $4\",[\"1(?:33|5[56]|81)\"],0,1],[\"(\\\\d)(\\\\d{3})(\\\\d{3})(\\\\d{4})\",\"$2 $3 $4\",[\"1\"],0,1]],\"01\",0,\"0(?:[12]|4[45])|1\",0,0,0,[0,[\"657[12]\\\\d{6}|(?:1(?:2(?:2[1-9]|3[1-35-8]|4[13-9]|7[1-689]|8[1-578]|9[467])|3(?:1[1-79]|[2458][1-9]|3\\\\d|7[1-8]|9[1-5])|4(?:1[1-57-9]|[24-7][1-9]|3[1-8]|8[1-35-9]|9[2-689])|5(?:[56]\\\\d|88|9[1-79])|6(?:1[2-68]|[2-4][1-9]|5[1-3689]|6[1-57-9]|7[1-7]|8[67]|9[4-8])|7(?:[1-467][1-9]|5[13-9]|8[1-69]|9[17])|8(?:1\\\\d|2[13-689]|3[1-6]|4[124-6]|6[1246-9]|7[1-378]|9[12479])|9(?:1[346-9]|2[1-4]|3[2-46-8]|5[1348]|[69][1-9]|7[12]|8[1-8]))|2(?:2\\\\d|3[1-35-8]|4[13-9]|7[1-689]|8[1-578]|9[467])|3(?:1[1-79]|[2458][1-9]|3\\\\d|7[1-8]|9[1-5])|4(?:1[1-57-9]|[25-7][1-9]|3[1-8]|4\\\\d|8[1-35-9]|9[2-689])|5(?:[56]\\\\d|88|9[1-79])|6(?:1[2-68]|[2-4][1-9]|5[1-3689]|6[1-57-9]|7[1-7]|8[67]|9[4-8])|7(?:[13467][1-9]|2\\\\d|5[13-9]|8[1-69]|9[17])|8(?:1\\\\d|2[13-689]|3[1-6]|4[124-6]|6[1246-9]|7[1-378]|9[12479])|9(?:1[346-9]|2[1-4]|3[2-46-8]|5[1348]|6[1-9]|7[12]|8[1-8]|9\\\\d))\\\\d{7}\"]],\"00\"],\"MY\":[\"60\",\"00\",\"1\\\\d{8,9}|(?:3\\\\d|[4-9])\\\\d{7}\",[8,9,10],[[\"(\\\\d)(\\\\d{3})(\\\\d{4})\",\"$1-$2 $3\",[\"[4-79]\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{3,4})\",\"$1-$2 $3\",[\"1(?:[02469]|[378][1-9]|53)|8\",\"1(?:[02469]|[37][1-9]|53|8(?:[1-46-9]|5[7-9]))|8\"],\"0$1\"],[\"(\\\\d)(\\\\d{4})(\\\\d{4})\",\"$1-$2 $3\",[\"3\"],\"0$1\"],[\"(\\\\d)(\\\\d{3})(\\\\d{2})(\\\\d{4})\",\"$1-$2-$3-$4\",[\"1(?:[367]|80)\"]],[\"(\\\\d{3})(\\\\d{3})(\\\\d{4})\",\"$1-$2 $3\",[\"15\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{4})(\\\\d{4})\",\"$1-$2 $3\",[\"1\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"1(?:1888[689]|4400|8(?:47|8[27])[0-4])\\\\d{4}|1(?:0(?:[23568]\\\\d|4[0-6]|7[016-9]|9[0-8])|1(?:[1-5]\\\\d\\\\d|6(?:0[5-9]|[1-9]\\\\d)|7(?:[0134]\\\\d|2[1-9]|5[0-6]))|(?:[269]\\\\d|[37][1-9]|4[235-9])\\\\d|5(?:31|9\\\\d\\\\d)|8(?:1[23]|[236]\\\\d|4[06]|5(?:46|[7-9])|7[016-9]|8[01]|9[0-8]))\\\\d{5}\",[9,10]]]],\"MZ\":[\"258\",\"00\",\"(?:2|8\\\\d)\\\\d{7}\",[8,9],[[\"(\\\\d{2})(\\\\d{3})(\\\\d{3,4})\",\"$1 $2 $3\",[\"2|8[2-79]\"]],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"8\"]]],0,0,0,0,0,0,[0,[\"8[2-79]\\\\d{7}\",[9]]]],\"NA\":[\"264\",\"00\",\"[68]\\\\d{7,8}\",[8,9],[[\"(\\\\d{2})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"88\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{3,4})\",\"$1 $2 $3\",[\"6\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"87\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"8\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"(?:60|8[1245])\\\\d{7}\",[9]]]],\"NC\":[\"687\",\"00\",\"(?:050|[2-57-9]\\\\d\\\\d)\\\\d{3}\",[6],[[\"(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1.$2.$3\",[\"[02-57-9]\"]]],0,0,0,0,0,0,[0,[\"(?:5[0-4]|[79]\\\\d|8[0-79])\\\\d{4}\"]]],\"NE\":[\"227\",\"00\",\"[027-9]\\\\d{7}\",[8],[[\"(\\\\d{2})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"08\"]],[\"(\\\\d{2})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"[089]|2[013]|7[04]\"]]],0,0,0,0,0,0,[0,[\"(?:23|7[04]|[89]\\\\d)\\\\d{6}\"]]],\"NF\":[\"672\",\"00\",\"[13]\\\\d{5}\",[6],[[\"(\\\\d{2})(\\\\d{4})\",\"$1 $2\",[\"1[0-3]\"]],[\"(\\\\d)(\\\\d{5})\",\"$1 $2\",[\"[13]\"]]],0,0,\"([0-258]\\\\d{4})$\",\"3$1\",0,0,[0,[\"(?:14|3[58])\\\\d{4}\"]]],\"NG\":[\"234\",\"009\",\"(?:[124-7]|9\\\\d{3})\\\\d{6}|[1-9]\\\\d{7}|[78]\\\\d{9,13}\",[7,8,10,11,12,13,14],[[\"(\\\\d{2})(\\\\d{2})(\\\\d{3})\",\"$1 $2 $3\",[\"78\"],\"0$1\"],[\"(\\\\d)(\\\\d{3})(\\\\d{3,4})\",\"$1 $2 $3\",[\"[12]|9(?:0[3-9]|[1-9])\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{2,3})\",\"$1 $2 $3\",[\"[3-7]|8[2-9]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3,4})\",\"$1 $2 $3\",[\"[7-9]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{4})(\\\\d{4,5})\",\"$1 $2 $3\",[\"[78]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{5})(\\\\d{5,6})\",\"$1 $2 $3\",[\"[78]\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"(?:702[0-24-9]|819[01])\\\\d{6}|(?:70[13-689]|8(?:0[1-9]|1[0-8])|9(?:0[1-9]|1[1-356]))\\\\d{7}\",[10]]]],\"NI\":[\"505\",\"00\",\"(?:1800|[25-8]\\\\d{3})\\\\d{4}\",[8],[[\"(\\\\d{4})(\\\\d{4})\",\"$1 $2\",[\"[125-8]\"]]],0,0,0,0,0,0,[0,[\"(?:5(?:5[0-7]|[78]\\\\d)|6(?:20|3[035]|4[045]|5[05]|77|8[1-9]|9[059])|(?:7[5-8]|8\\\\d)\\\\d)\\\\d{5}\"]]],\"NL\":[\"31\",\"00\",\"(?:[124-7]\\\\d\\\\d|3(?:[02-9]\\\\d|1[0-8]))\\\\d{6}|8\\\\d{6,9}|9\\\\d{6,10}|1\\\\d{4,5}\",[5,6,7,8,9,10,11],[[\"(\\\\d{3})(\\\\d{4,7})\",\"$1 $2\",[\"[89]0\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{7})\",\"$1 $2\",[\"66\"],\"0$1\"],[\"(\\\\d)(\\\\d{8})\",\"$1 $2\",[\"6\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"1[16-8]|2[259]|3[124]|4[17-9]|5[124679]\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"[1-578]|91\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{5})\",\"$1 $2 $3\",[\"9\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"(?:6[1-58]|970\\\\d)\\\\d{7}\",[9,11]]]],\"NO\":[\"47\",\"00\",\"(?:0|[2-9]\\\\d{3})\\\\d{4}\",[5,8],[[\"(\\\\d{3})(\\\\d{2})(\\\\d{3})\",\"$1 $2 $3\",[\"[489]|59\"]],[\"(\\\\d{2})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"[235-7]\"]]],0,0,0,0,0,\"[02-689]|7[0-8]\",[0,[\"(?:4[015-8]|59|9\\\\d)\\\\d{6}\",[8]]]],\"NP\":[\"977\",\"00\",\"(?:1\\\\d|9)\\\\d{9}|[1-9]\\\\d{7}\",[8,10,11],[[\"(\\\\d)(\\\\d{7})\",\"$1-$2\",[\"1[2-6]\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{6})\",\"$1-$2\",[\"1[01]|[2-8]|9(?:[1-59]|[67][2-6])\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{7})\",\"$1-$2\",[\"9\"]]],\"0\",0,0,0,0,0,[0,[\"9(?:6[0-3]|7[024-6]|8[0-24-68])\\\\d{7}\",[10]]]],\"NR\":[\"674\",\"00\",\"(?:444|(?:55|8\\\\d)\\\\d|666)\\\\d{4}\",[7],[[\"(\\\\d{3})(\\\\d{4})\",\"$1 $2\",[\"[4-68]\"]]],0,0,0,0,0,0,[0,[\"(?:55[3-9]|666|8\\\\d\\\\d)\\\\d{4}\"]]],\"NU\":[\"683\",\"00\",\"(?:[47]|888\\\\d)\\\\d{3}\",[4,7],[[\"(\\\\d{3})(\\\\d{4})\",\"$1 $2\",[\"8\"]]],0,0,0,0,0,0,[0,[\"888[4-9]\\\\d{3}\",[7]]]],\"NZ\":[\"64\",\"0(?:0|161)\",\"[29]\\\\d{7,9}|50\\\\d{5}(?:\\\\d{2,3})?|6[0-35-9]\\\\d{6}|7\\\\d{7,8}|8\\\\d{4,9}|(?:11\\\\d|[34])\\\\d{7}\",[5,6,7,8,9,10],[[\"(\\\\d{2})(\\\\d{3,8})\",\"$1 $2\",[\"8[1-579]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{2})(\\\\d{2,3})\",\"$1 $2 $3\",[\"50[036-8]|[89]0\",\"50(?:[0367]|88)|[89]0\"],\"0$1\"],[\"(\\\\d)(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"24|[346]|7[2-57-9]|9[2-9]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3,4})\",\"$1 $2 $3\",[\"2(?:10|74)|[59]|80\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3,4})(\\\\d{4})\",\"$1 $2 $3\",[\"1|2[028]\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{3,5})\",\"$1 $2 $3\",[\"2(?:[169]|7[0-35-9])|7|86\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"2[0-27-9]\\\\d{7,8}|21\\\\d{6}\",[8,9,10]]],\"00\"],\"OM\":[\"968\",\"00\",\"(?:1505|[279]\\\\d{3}|500)\\\\d{4}|800\\\\d{5,6}\",[7,8,9],[[\"(\\\\d{3})(\\\\d{4,6})\",\"$1 $2\",[\"[58]\"]],[\"(\\\\d{2})(\\\\d{6})\",\"$1 $2\",[\"2\"]],[\"(\\\\d{4})(\\\\d{4})\",\"$1 $2\",[\"[179]\"]]],0,0,0,0,0,0,[0,[\"1505\\\\d{4}|(?:7(?:[1289]\\\\d|7[0-5])|9(?:0[1-9]|[1-9]\\\\d))\\\\d{5}\",[8]]]],\"PA\":[\"507\",\"00\",\"(?:00800|8\\\\d{3})\\\\d{6}|[68]\\\\d{7}|[1-57-9]\\\\d{6}\",[7,8,10,11],[[\"(\\\\d{3})(\\\\d{4})\",\"$1-$2\",[\"[1-57-9]\"]],[\"(\\\\d{4})(\\\\d{4})\",\"$1-$2\",[\"[68]\"]],[\"(\\\\d{3})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"8\"]]],0,0,0,0,0,0,[0,[\"(?:1[16]1|21[89]|6\\\\d{3}|8(?:1[01]|7[23]))\\\\d{4}\",[7,8]]]],\"PE\":[\"51\",\"00|19(?:1[124]|77|90)00\",\"(?:[14-8]|9\\\\d)\\\\d{7}\",[8,9],[[\"(\\\\d{3})(\\\\d{5})\",\"$1 $2\",[\"80\"],\"(0$1)\"],[\"(\\\\d)(\\\\d{7})\",\"$1 $2\",[\"1\"],\"(0$1)\"],[\"(\\\\d{2})(\\\\d{6})\",\"$1 $2\",[\"[4-8]\"],\"(0$1)\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"9\"]]],\"0\",0,0,0,0,0,[0,[\"9\\\\d{8}\",[9]]],\"00\",\" Anexo \"],\"PF\":[\"689\",\"00\",\"4\\\\d{5}(?:\\\\d{2})?|8\\\\d{7,8}\",[6,8,9],[[\"(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3\",[\"44\"]],[\"(\\\\d{2})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"4|8[7-9]\"]],[\"(\\\\d{3})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"8\"]]],0,0,0,0,0,0,[0,[\"8[7-9]\\\\d{6}\",[8]]]],\"PG\":[\"675\",\"00|140[1-3]\",\"(?:180|[78]\\\\d{3})\\\\d{4}|(?:[2-589]\\\\d|64)\\\\d{5}\",[7,8],[[\"(\\\\d{3})(\\\\d{4})\",\"$1 $2\",[\"18|[2-69]|85\"]],[\"(\\\\d{4})(\\\\d{4})\",\"$1 $2\",[\"[78]\"]]],0,0,0,0,0,0,[0,[\"(?:7\\\\d|8[128])\\\\d{6}\",[8]]],\"00\"],\"PH\":[\"63\",\"00\",\"(?:[2-7]|9\\\\d)\\\\d{8}|2\\\\d{5}|(?:1800|8)\\\\d{7,9}\",[6,8,9,10,11,12,13],[[\"(\\\\d)(\\\\d{5})\",\"$1 $2\",[\"2\"],\"(0$1)\"],[\"(\\\\d{4})(\\\\d{4,6})\",\"$1 $2\",[\"3(?:23|39|46)|4(?:2[3-6]|[35]9|4[26]|76)|544|88[245]|(?:52|64|86)2\",\"3(?:230|397|461)|4(?:2(?:35|[46]4|51)|396|4(?:22|63)|59[347]|76[15])|5(?:221|446)|642[23]|8(?:622|8(?:[24]2|5[13]))\"],\"(0$1)\"],[\"(\\\\d{5})(\\\\d{4})\",\"$1 $2\",[\"346|4(?:27|9[35])|883\",\"3469|4(?:279|9(?:30|56))|8834\"],\"(0$1)\"],[\"(\\\\d)(\\\\d{4})(\\\\d{4})\",\"$1 $2 $3\",[\"2\"],\"(0$1)\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"[3-7]|8[2-8]\"],\"(0$1)\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"[89]\"],\"0$1\"],[\"(\\\\d{4})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"1\"]],[\"(\\\\d{4})(\\\\d{1,2})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3 $4\",[\"1\"]]],\"0\",0,0,0,0,0,[0,[\"(?:8(?:1[37]|9[5-8])|9(?:0[5-9]|1[0-24-9]|[235-7]\\\\d|4[2-9]|8[135-9]|9[1-9]))\\\\d{7}\",[10]]]],\"PK\":[\"92\",\"00\",\"122\\\\d{6}|[24-8]\\\\d{10,11}|9(?:[013-9]\\\\d{8,10}|2(?:[01]\\\\d\\\\d|2(?:[06-8]\\\\d|1[01]))\\\\d{7})|(?:[2-8]\\\\d{3}|92(?:[0-7]\\\\d|8[1-9]))\\\\d{6}|[24-9]\\\\d{8}|[89]\\\\d{7}\",[8,9,10,11,12],[[\"(\\\\d{3})(\\\\d{3})(\\\\d{2,7})\",\"$1 $2 $3\",[\"[89]0\"],\"0$1\"],[\"(\\\\d{4})(\\\\d{5})\",\"$1 $2\",[\"1\"]],[\"(\\\\d{3})(\\\\d{6,7})\",\"$1 $2\",[\"2(?:3[2358]|4[2-4]|9[2-8])|45[3479]|54[2-467]|60[468]|72[236]|8(?:2[2-689]|3[23578]|4[3478]|5[2356])|9(?:2[2-8]|3[27-9]|4[2-6]|6[3569]|9[25-8])\",\"9(?:2[3-8]|98)|(?:2(?:3[2358]|4[2-4]|9[2-8])|45[3479]|54[2-467]|60[468]|72[236]|8(?:2[2-689]|3[23578]|4[3478]|5[2356])|9(?:22|3[27-9]|4[2-6]|6[3569]|9[25-7]))[2-9]\"],\"(0$1)\"],[\"(\\\\d{2})(\\\\d{7,8})\",\"$1 $2\",[\"(?:2[125]|4[0-246-9]|5[1-35-7]|6[1-8]|7[14]|8[16]|91)[2-9]\"],\"(0$1)\"],[\"(\\\\d{5})(\\\\d{5})\",\"$1 $2\",[\"58\"],\"(0$1)\"],[\"(\\\\d{3})(\\\\d{7})\",\"$1 $2\",[\"3\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3 $4\",[\"2[125]|4[0-246-9]|5[1-35-7]|6[1-8]|7[14]|8[16]|91\"],\"(0$1)\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3 $4\",[\"[24-9]\"],\"(0$1)\"]],\"0\",0,0,0,0,0,[0,[\"3(?:[0-24]\\\\d|3[0-7]|55|64)\\\\d{7}\",[10]]]],\"PL\":[\"48\",\"00\",\"(?:6|8\\\\d\\\\d)\\\\d{7}|[1-9]\\\\d{6}(?:\\\\d{2})?|[26]\\\\d{5}\",[6,7,8,9,10],[[\"(\\\\d{5})\",\"$1\",[\"19\"]],[\"(\\\\d{3})(\\\\d{3})\",\"$1 $2\",[\"11|20|64\"]],[\"(\\\\d{2})(\\\\d{2})(\\\\d{3})\",\"$1 $2 $3\",[\"(?:1[2-8]|2[2-69]|3[2-4]|4[1-468]|5[24-689]|6[1-3578]|7[14-7]|8[1-79]|9[145])1\",\"(?:1[2-8]|2[2-69]|3[2-4]|4[1-468]|5[24-689]|6[1-3578]|7[14-7]|8[1-79]|9[145])19\"]],[\"(\\\\d{3})(\\\\d{2})(\\\\d{2,3})\",\"$1 $2 $3\",[\"64\"]],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"21|39|45|5[0137]|6[0469]|7[02389]|8(?:0[14]|8)\"]],[\"(\\\\d{2})(\\\\d{3})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"1[2-8]|[2-7]|8[1-79]|9[145]\"]],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3,4})\",\"$1 $2 $3\",[\"8\"]]],0,0,0,0,0,0,[0,[\"21(?:1(?:[145]\\\\d|3[1-5])|2[0-4]\\\\d)\\\\d{4}|(?:45|5[0137]|6[069]|7[2389]|88)\\\\d{7}\",[9]]]],\"PM\":[\"508\",\"00\",\"(?:[45]|80\\\\d\\\\d)\\\\d{5}\",[6,9],[[\"(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3\",[\"[45]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"8\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"(?:4[02-4]|5[056])\\\\d{4}\",[6]]]],\"PR\":[\"1\",\"011\",\"(?:[589]\\\\d\\\\d|787)\\\\d{7}\",[10],0,\"1\",0,0,0,0,\"787|939\",[0,[\"(?:787|939)[2-9]\\\\d{6}\"]]],\"PS\":[\"970\",\"00\",\"[2489]2\\\\d{6}|(?:1\\\\d|5)\\\\d{8}\",[8,9,10],[[\"(\\\\d)(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"[2489]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"5\"],\"0$1\"],[\"(\\\\d{4})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"1\"]]],\"0\",0,0,0,0,0,[0,[\"5[69]\\\\d{7}\",[9]]]],\"PT\":[\"351\",\"00\",\"1693\\\\d{5}|(?:[26-9]\\\\d|30)\\\\d{7}\",[9],[[\"(\\\\d{2})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"2[12]\"]],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"16|[236-9]\"]]],0,0,0,0,0,0,[0,[\"6(?:[06]92(?:30|9\\\\d)|[35]92(?:3[03]|9\\\\d))\\\\d{3}|(?:(?:16|6[0356])93|9(?:[1-36]\\\\d\\\\d|480))\\\\d{5}\"]]],\"PW\":[\"680\",\"01[12]\",\"(?:[24-8]\\\\d\\\\d|345|900)\\\\d{4}\",[7],[[\"(\\\\d{3})(\\\\d{4})\",\"$1 $2\",[\"[2-9]\"]]],0,0,0,0,0,0,[0,[\"(?:(?:46|83)[0-5]|6[2-4689]0)\\\\d{4}|(?:45|77|88)\\\\d{5}\"]]],\"PY\":[\"595\",\"00\",\"59\\\\d{4,6}|9\\\\d{5,10}|(?:[2-46-8]\\\\d|5[0-8])\\\\d{4,7}\",[6,7,8,9,10,11],[[\"(\\\\d{3})(\\\\d{3,6})\",\"$1 $2\",[\"[2-9]0\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{5})\",\"$1 $2\",[\"[26]1|3[289]|4[1246-8]|7[1-3]|8[1-36]\"],\"(0$1)\"],[\"(\\\\d{3})(\\\\d{4,5})\",\"$1 $2\",[\"2[279]|3[13-5]|4[359]|5|6(?:[34]|7[1-46-8])|7[46-8]|85\"],\"(0$1)\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{3,4})\",\"$1 $2 $3\",[\"2[14-68]|3[26-9]|4[1246-8]|6(?:1|75)|7[1-35]|8[1-36]\"],\"(0$1)\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"87\"]],[\"(\\\\d{3})(\\\\d{6})\",\"$1 $2\",[\"9(?:[5-79]|8[1-6])\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"[2-8]\"],\"0$1\"],[\"(\\\\d{4})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"9\"]]],\"0\",0,0,0,0,0,[0,[\"9(?:51|6[129]|[78][1-6]|9[1-5])\\\\d{6}\",[9]]]],\"QA\":[\"974\",\"00\",\"800\\\\d{4}|(?:2|800)\\\\d{6}|(?:0080|[3-7])\\\\d{7}\",[7,8,9,11],[[\"(\\\\d{3})(\\\\d{4})\",\"$1 $2\",[\"2[16]|8\"]],[\"(\\\\d{4})(\\\\d{4})\",\"$1 $2\",[\"[3-7]\"]]],0,0,0,0,0,0,[0,[\"[35-7]\\\\d{7}\",[8]]]],\"RE\":[\"262\",\"00\",\"976\\\\d{6}|(?:26|[68]\\\\d)\\\\d{7}\",[9],[[\"(\\\\d{3})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"[2689]\"],\"0$1\"]],\"0\",0,0,0,0,\"26[23]|69|[89]\",[0,[\"(?:69(?:2\\\\d\\\\d|3(?:0[0-46]|1[013]|2[0-2]|3[0-39]|4\\\\d|5[0-5]|6[0-6]|7[0-27]|8[0-8]|9[0-479]))|976(?:2[27]|3[0-37]|9\\\\d))\\\\d{4}\"]]],\"RO\":[\"40\",\"00\",\"(?:[2378]\\\\d|90)\\\\d{7}|[23]\\\\d{5}\",[6,9],[[\"(\\\\d{3})(\\\\d{3})\",\"$1 $2\",[\"2[3-6]\",\"2[3-6]\\\\d9\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{4})\",\"$1 $2\",[\"219|31\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"[23]1\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"[237-9]\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"7020\\\\d{5}|7(?:0[013-9]|1[0-3]|[2-7]\\\\d|8[03-8]|9[019])\\\\d{6}\",[9]]],0,\" int \"],\"RS\":[\"381\",\"00\",\"38[02-9]\\\\d{6,9}|6\\\\d{7,9}|90\\\\d{4,8}|38\\\\d{5,6}|(?:7\\\\d\\\\d|800)\\\\d{3,9}|(?:[12]\\\\d|3[0-79])\\\\d{5,10}\",[6,7,8,9,10,11,12],[[\"(\\\\d{3})(\\\\d{3,9})\",\"$1 $2\",[\"(?:2[389]|39)0|[7-9]\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{5,10})\",\"$1 $2\",[\"[1-36]\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"6(?:[0-689]|7\\\\d)\\\\d{6,7}\",[8,9,10]]]],\"RU\":[\"7\",\"810\",\"8\\\\d{13}|[347-9]\\\\d{9}\",[10,14],[[\"(\\\\d{4})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"7(?:1[0-8]|2[1-9])\",\"7(?:1(?:[0-356]2|4[29]|7|8[27])|2(?:1[23]|[2-9]2))\",\"7(?:1(?:[0-356]2|4[29]|7|8[27])|2(?:13[03-69]|62[013-9]))|72[1-57-9]2\"],\"8 ($1)\",1],[\"(\\\\d{5})(\\\\d)(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"7(?:1[0-68]|2[1-9])\",\"7(?:1(?:[06][3-6]|[18]|2[35]|[3-5][3-5])|2(?:[13][3-5]|[24-689]|7[457]))\",\"7(?:1(?:0(?:[356]|4[023])|[18]|2(?:3[013-9]|5)|3[45]|43[013-79]|5(?:3[1-8]|4[1-7]|5)|6(?:3[0-35-9]|[4-6]))|2(?:1(?:3[178]|[45])|[24-689]|3[35]|7[457]))|7(?:14|23)4[0-8]|71(?:33|45)[1-79]\"],\"8 ($1)\",1],[\"(\\\\d{3})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"7\"],\"8 ($1)\",1],[\"(\\\\d{3})(\\\\d{3})(\\\\d{2})(\\\\d{2})\",\"$1 $2-$3-$4\",[\"[349]|8(?:[02-7]|1[1-8])\"],\"8 ($1)\",1],[\"(\\\\d{4})(\\\\d{4})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3 $4\",[\"8\"],\"8 ($1)\"]],\"8\",0,0,0,0,\"3[04-689]|[489]\",[0,[\"9\\\\d{9}\",[10]]],\"8~10\"],\"RW\":[\"250\",\"00\",\"(?:06|[27]\\\\d\\\\d|[89]00)\\\\d{6}\",[8,9],[[\"(\\\\d{2})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"0\"]],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"[7-9]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"2\"]]],\"0\",0,0,0,0,0,[0,[\"7[2389]\\\\d{7}\",[9]]]],\"SA\":[\"966\",\"00\",\"92\\\\d{7}|(?:[15]|8\\\\d)\\\\d{8}\",[9,10],[[\"(\\\\d{4})(\\\\d{5})\",\"$1 $2\",[\"9\"]],[\"(\\\\d{2})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"1\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"5\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3,4})\",\"$1 $2 $3\",[\"81\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"8\"]]],\"0\",0,0,0,0,0,[0,[\"579[01]\\\\d{5}|5(?:[013-689]\\\\d|7[0-35-8])\\\\d{6}\",[9]]]],\"SB\":[\"677\",\"0[01]\",\"(?:[1-6]|[7-9]\\\\d\\\\d)\\\\d{4}\",[5,7],[[\"(\\\\d{2})(\\\\d{5})\",\"$1 $2\",[\"7|8[4-9]|9(?:[1-8]|9[0-8])\"]]],0,0,0,0,0,0,[0,[\"48\\\\d{3}|(?:(?:7[1-9]|8[4-9])\\\\d|9(?:1[2-9]|2[013-9]|3[0-2]|[46]\\\\d|5[0-46-9]|7[0-689]|8[0-79]|9[0-8]))\\\\d{4}\"]]],\"SC\":[\"248\",\"010|0[0-2]\",\"800\\\\d{4}|(?:[249]\\\\d|64)\\\\d{5}\",[7],[[\"(\\\\d)(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"[246]|9[57]\"]]],0,0,0,0,0,0,[0,[\"2[125-8]\\\\d{5}\"]],\"00\"],\"SD\":[\"249\",\"00\",\"[19]\\\\d{8}\",[9],[[\"(\\\\d{2})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"[19]\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"(?:1[0-2]|9[0-3569])\\\\d{7}\"]]],\"SE\":[\"46\",\"00\",\"(?:[26]\\\\d\\\\d|9)\\\\d{9}|[1-9]\\\\d{8}|[1-689]\\\\d{7}|[1-4689]\\\\d{6}|2\\\\d{5}\",[6,7,8,9,10],[[\"(\\\\d{2})(\\\\d{2,3})(\\\\d{2})\",\"$1-$2 $3\",[\"20\"],\"0$1\",0,\"$1 $2 $3\"],[\"(\\\\d{3})(\\\\d{4})\",\"$1-$2\",[\"9(?:00|39|44|9)\"],\"0$1\",0,\"$1 $2\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{2})\",\"$1-$2 $3\",[\"[12][136]|3[356]|4[0246]|6[03]|90[1-9]\"],\"0$1\",0,\"$1 $2 $3\"],[\"(\\\\d)(\\\\d{2,3})(\\\\d{2})(\\\\d{2})\",\"$1-$2 $3 $4\",[\"8\"],\"0$1\",0,\"$1 $2 $3 $4\"],[\"(\\\\d{3})(\\\\d{2,3})(\\\\d{2})\",\"$1-$2 $3\",[\"1[2457]|2(?:[247-9]|5[0138])|3[0247-9]|4[1357-9]|5[0-35-9]|6(?:[125689]|4[02-57]|7[0-2])|9(?:[125-8]|3[02-5]|4[0-3])\"],\"0$1\",0,\"$1 $2 $3\"],[\"(\\\\d{3})(\\\\d{2,3})(\\\\d{3})\",\"$1-$2 $3\",[\"9(?:00|39|44)\"],\"0$1\",0,\"$1 $2 $3\"],[\"(\\\\d{2})(\\\\d{2,3})(\\\\d{2})(\\\\d{2})\",\"$1-$2 $3 $4\",[\"1[13689]|2[0136]|3[1356]|4[0246]|54|6[03]|90[1-9]\"],\"0$1\",0,\"$1 $2 $3 $4\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{2})(\\\\d{2})\",\"$1-$2 $3 $4\",[\"10|7\"],\"0$1\",0,\"$1 $2 $3 $4\"],[\"(\\\\d)(\\\\d{3})(\\\\d{3})(\\\\d{2})\",\"$1-$2 $3 $4\",[\"8\"],\"0$1\",0,\"$1 $2 $3 $4\"],[\"(\\\\d{3})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1-$2 $3 $4\",[\"[13-5]|2(?:[247-9]|5[0138])|6(?:[124-689]|7[0-2])|9(?:[125-8]|3[02-5]|4[0-3])\"],\"0$1\",0,\"$1 $2 $3 $4\"],[\"(\\\\d{3})(\\\\d{2})(\\\\d{2})(\\\\d{3})\",\"$1-$2 $3 $4\",[\"9\"],\"0$1\",0,\"$1 $2 $3 $4\"],[\"(\\\\d{3})(\\\\d{2})(\\\\d{3})(\\\\d{2})(\\\\d{2})\",\"$1-$2 $3 $4 $5\",[\"[26]\"],\"0$1\",0,\"$1 $2 $3 $4 $5\"]],\"0\",0,0,0,0,0,[0,[\"7[02369]\\\\d{7}\",[9]]]],\"SG\":[\"65\",\"0[0-3]\\\\d\",\"(?:(?:1\\\\d|8)\\\\d\\\\d|7000)\\\\d{7}|[3689]\\\\d{7}\",[8,10,11],[[\"(\\\\d{4})(\\\\d{4})\",\"$1 $2\",[\"[369]|8(?:0[1-6]|[1-9])\"]],[\"(\\\\d{3})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"8\"]],[\"(\\\\d{4})(\\\\d{4})(\\\\d{3})\",\"$1 $2 $3\",[\"7\"]],[\"(\\\\d{4})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"1\"]]],0,0,0,0,0,0,[0,[\"8(?:06[0-6]|95[0-2])\\\\d{4}|(?:8(?:0[1-5]|[1-8]\\\\d|9[0-4])|9[0-8]\\\\d)\\\\d{5}\",[8]]]],\"SH\":[\"290\",\"00\",\"(?:[256]\\\\d|8)\\\\d{3}\",[4,5],0,0,0,0,0,0,\"[256]\",[0,[\"[56]\\\\d{4}\",[5]]]],\"SI\":[\"386\",\"00|10(?:22|66|88|99)\",\"[1-7]\\\\d{7}|8\\\\d{4,7}|90\\\\d{4,6}\",[5,6,7,8],[[\"(\\\\d{2})(\\\\d{3,6})\",\"$1 $2\",[\"8[09]|9\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{5})\",\"$1 $2\",[\"59|8\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"[37][01]|4[0139]|51|6\"],\"0$1\"],[\"(\\\\d)(\\\\d{3})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"[1-57]\"],\"(0$1)\"]],\"0\",0,0,0,0,0,[0,[\"65(?:1\\\\d|5[56]|6[01]|70)\\\\d{4}|(?:[37][01]|4[0139]|51|6[489])\\\\d{6}\",[8]]],\"00\"],\"SJ\":[\"47\",\"00\",\"0\\\\d{4}|(?:[489]\\\\d|[57]9)\\\\d{6}\",[5,8],0,0,0,0,0,0,\"79\",[0,[\"(?:4[015-8]|59|9\\\\d)\\\\d{6}\",[8]]]],\"SK\":[\"421\",\"00\",\"[2-689]\\\\d{8}|[2-59]\\\\d{6}|[2-5]\\\\d{5}\",[6,7,9],[[\"(\\\\d)(\\\\d{2})(\\\\d{3,4})\",\"$1 $2 $3\",[\"21\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{2})(\\\\d{2,3})\",\"$1 $2 $3\",[\"[3-5][1-8]1\",\"[3-5][1-8]1[67]\"],\"0$1\"],[\"(\\\\d)(\\\\d{3})(\\\\d{3})(\\\\d{2})\",\"$1/$2 $3 $4\",[\"2\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"[689]\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{2})(\\\\d{2})\",\"$1/$2 $3 $4\",[\"[3-5]\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"909[1-9]\\\\d{5}|9(?:0[1-8]|1[0-24-9]|4[03-57-9]|5\\\\d)\\\\d{6}\",[9]]]],\"SL\":[\"232\",\"00\",\"(?:[237-9]\\\\d|66)\\\\d{6}\",[8],[[\"(\\\\d{2})(\\\\d{6})\",\"$1 $2\",[\"[236-9]\"],\"(0$1)\"]],\"0\",0,0,0,0,0,[0,[\"(?:25|3[0-5]|66|7[2-9]|8[08]|9[09])\\\\d{6}\"]]],\"SM\":[\"378\",\"00\",\"(?:0549|[5-7]\\\\d)\\\\d{6}\",[8,10],[[\"(\\\\d{2})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"[5-7]\"]],[\"(\\\\d{4})(\\\\d{6})\",\"$1 $2\",[\"0\"]]],0,0,\"([89]\\\\d{5})$\",\"0549$1\",0,0,[0,[\"6[16]\\\\d{6}\",[8]]]],\"SN\":[\"221\",\"00\",\"(?:[378]\\\\d|93)\\\\d{7}\",[9],[[\"(\\\\d{3})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"8\"]],[\"(\\\\d{2})(\\\\d{3})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"[379]\"]]],0,0,0,0,0,0,[0,[\"7(?:(?:[06-8]\\\\d|21|90)\\\\d|5(?:01|[19]0|25|[38]3|[4-7]\\\\d))\\\\d{5}\"]]],\"SO\":[\"252\",\"00\",\"[346-9]\\\\d{8}|[12679]\\\\d{7}|[1-5]\\\\d{6}|[1348]\\\\d{5}\",[6,7,8,9],[[\"(\\\\d{2})(\\\\d{4})\",\"$1 $2\",[\"8[125]\"]],[\"(\\\\d{6})\",\"$1\",[\"[134]\"]],[\"(\\\\d)(\\\\d{6})\",\"$1 $2\",[\"[15]|2[0-79]|3[0-46-8]|4[0-7]\"]],[\"(\\\\d)(\\\\d{7})\",\"$1 $2\",[\"(?:2|90)4|[67]\"]],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"[3478]|64|90\"]],[\"(\\\\d{2})(\\\\d{5,7})\",\"$1 $2\",[\"1|28|6(?:0[5-7]|[1-35-9])|9[2-9]\"]]],\"0\",0,0,0,0,0,[0,[\"(?:(?:15|(?:3[59]|4[89]|79|8[08])\\\\d|6(?:0[5-7]|[1-9]\\\\d)|9(?:0\\\\d|[2-9]))\\\\d|2(?:4\\\\d|8))\\\\d{5}|(?:[67]\\\\d\\\\d|904)\\\\d{5}\",[7,8,9]]]],\"SR\":[\"597\",\"00\",\"(?:[2-5]|68|[78]\\\\d)\\\\d{5}\",[6,7],[[\"(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1-$2-$3\",[\"56\"]],[\"(\\\\d{3})(\\\\d{3})\",\"$1-$2\",[\"[2-5]\"]],[\"(\\\\d{3})(\\\\d{4})\",\"$1-$2\",[\"[6-8]\"]]],0,0,0,0,0,0,[0,[\"(?:7[124-7]|8[124-9])\\\\d{5}\",[7]]]],\"SS\":[\"211\",\"00\",\"[19]\\\\d{8}\",[9],[[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"[19]\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"(?:12|9[1257-9])\\\\d{7}\"]]],\"ST\":[\"239\",\"00\",\"(?:22|9\\\\d)\\\\d{5}\",[7],[[\"(\\\\d{3})(\\\\d{4})\",\"$1 $2\",[\"[29]\"]]],0,0,0,0,0,0,[0,[\"900[5-9]\\\\d{3}|9(?:0[1-9]|[89]\\\\d)\\\\d{4}\"]]],\"SV\":[\"503\",\"00\",\"[267]\\\\d{7}|[89]00\\\\d{4}(?:\\\\d{4})?\",[7,8,11],[[\"(\\\\d{3})(\\\\d{4})\",\"$1 $2\",[\"[89]\"]],[\"(\\\\d{4})(\\\\d{4})\",\"$1 $2\",[\"[267]\"]],[\"(\\\\d{3})(\\\\d{4})(\\\\d{4})\",\"$1 $2 $3\",[\"[89]\"]]],0,0,0,0,0,0,[0,[\"66(?:[02-9]\\\\d\\\\d|1(?:[02-9]\\\\d|16))\\\\d{3}|(?:6[0-57-9]|7\\\\d)\\\\d{6}\",[8]]]],\"SX\":[\"1\",\"011\",\"7215\\\\d{6}|(?:[58]\\\\d\\\\d|900)\\\\d{7}\",[10],0,\"1\",0,\"1|(5\\\\d{6})$\",\"721$1\",0,\"721\",[0,[\"7215(?:1[02]|2\\\\d|5[034679]|8[014-8])\\\\d{4}\"]]],\"SY\":[\"963\",\"00\",\"[1-39]\\\\d{8}|[1-5]\\\\d{7}\",[8,9],[[\"(\\\\d{2})(\\\\d{3})(\\\\d{3,4})\",\"$1 $2 $3\",[\"[1-5]\"],\"0$1\",1],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"9\"],\"0$1\",1]],\"0\",0,0,0,0,0,[0,[\"9[1-689]\\\\d{7}\",[9]]]],\"SZ\":[\"268\",\"00\",\"0800\\\\d{4}|(?:[237]\\\\d|900)\\\\d{6}\",[8,9],[[\"(\\\\d{4})(\\\\d{4})\",\"$1 $2\",[\"[0237]\"]],[\"(\\\\d{5})(\\\\d{4})\",\"$1 $2\",[\"9\"]]],0,0,0,0,0,0,[0,[\"7[6-9]\\\\d{6}\",[8]]]],\"TA\":[\"290\",\"00\",\"8\\\\d{3}\",[4],0,0,0,0,0,0,\"8\"],\"TC\":[\"1\",\"011\",\"(?:[58]\\\\d\\\\d|649|900)\\\\d{7}\",[10],0,\"1\",0,\"1|([2-479]\\\\d{6})$\",\"649$1\",0,\"649\",[0,[\"649(?:2(?:3[129]|4[1-79])|3\\\\d\\\\d|4[34][1-3])\\\\d{4}\"]]],\"TD\":[\"235\",\"00|16\",\"(?:22|[69]\\\\d|77)\\\\d{6}\",[8],[[\"(\\\\d{2})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"[2679]\"]]],0,0,0,0,0,0,[0,[\"(?:6[023568]|77|9\\\\d)\\\\d{6}\"]],\"00\"],\"TG\":[\"228\",\"00\",\"[279]\\\\d{7}\",[8],[[\"(\\\\d{2})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"[279]\"]]],0,0,0,0,0,0,[0,[\"(?:7[09]|9[0-36-9])\\\\d{6}\"]]],\"TH\":[\"66\",\"00[1-9]\",\"(?:001800|[2-57]|[689]\\\\d)\\\\d{7}|1\\\\d{7,9}\",[8,9,10,13],[[\"(\\\\d)(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"2\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{3,4})\",\"$1 $2 $3\",[\"[13-9]\"],\"0$1\"],[\"(\\\\d{4})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"1\"]]],\"0\",0,0,0,0,0,[0,[\"671[0-8]\\\\d{5}|(?:14|6[1-6]|[89]\\\\d)\\\\d{7}\",[9]]]],\"TJ\":[\"992\",\"810\",\"(?:00|[1-57-9]\\\\d)\\\\d{7}\",[9],[[\"(\\\\d{6})(\\\\d)(\\\\d{2})\",\"$1 $2 $3\",[\"331\",\"3317\"]],[\"(\\\\d{3})(\\\\d{2})(\\\\d{4})\",\"$1 $2 $3\",[\"[34]7|91[78]\"]],[\"(\\\\d{4})(\\\\d)(\\\\d{4})\",\"$1 $2 $3\",[\"3[1-5]\"]],[\"(\\\\d{2})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"[0-57-9]\"]]],0,0,0,0,0,0,[0,[\"41[18]\\\\d{6}|(?:[034]0|1[017]|2[02]|5[05]|7[0178]|8[078]|9\\\\d)\\\\d{7}\"]],\"8~10\"],\"TK\":[\"690\",\"00\",\"[2-47]\\\\d{3,6}\",[4,5,6,7],0,0,0,0,0,0,0,[0,[\"7[2-4]\\\\d{2,5}\"]]],\"TL\":[\"670\",\"00\",\"7\\\\d{7}|(?:[2-47]\\\\d|[89]0)\\\\d{5}\",[7,8],[[\"(\\\\d{3})(\\\\d{4})\",\"$1 $2\",[\"[2-489]|70\"]],[\"(\\\\d{4})(\\\\d{4})\",\"$1 $2\",[\"7\"]]],0,0,0,0,0,0,[0,[\"7[2-8]\\\\d{6}\",[8]]]],\"TM\":[\"993\",\"810\",\"[1-6]\\\\d{7}\",[8],[[\"(\\\\d{2})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2-$3-$4\",[\"12\"],\"(8 $1)\"],[\"(\\\\d{3})(\\\\d)(\\\\d{2})(\\\\d{2})\",\"$1 $2-$3-$4\",[\"[1-5]\"],\"(8 $1)\"],[\"(\\\\d{2})(\\\\d{6})\",\"$1 $2\",[\"6\"],\"8 $1\"]],\"8\",0,0,0,0,0,[0,[\"6\\\\d{7}\"]],\"8~10\"],\"TN\":[\"216\",\"00\",\"[2-57-9]\\\\d{7}\",[8],[[\"(\\\\d{2})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"[2-57-9]\"]]],0,0,0,0,0,0,[0,[\"3(?:001|[12]40)\\\\d{4}|(?:(?:[259]\\\\d|4[0-7])\\\\d|3(?:1[1-35]|6[0-4]|91))\\\\d{5}\"]]],\"TO\":[\"676\",\"00\",\"(?:0800|(?:[5-8]\\\\d\\\\d|999)\\\\d)\\\\d{3}|[2-8]\\\\d{4}\",[5,7],[[\"(\\\\d{2})(\\\\d{3})\",\"$1-$2\",[\"[2-4]|50|6[09]|7[0-24-69]|8[05]\"]],[\"(\\\\d{4})(\\\\d{3})\",\"$1 $2\",[\"0\"]],[\"(\\\\d{3})(\\\\d{4})\",\"$1 $2\",[\"[5-9]\"]]],0,0,0,0,0,0,[0,[\"(?:55[4-6]|6(?:[09]\\\\d|3[02]|8[15-9])|(?:7\\\\d|8[46-9])\\\\d|999)\\\\d{4}\",[7]]]],\"TR\":[\"90\",\"00\",\"4\\\\d{6}|8\\\\d{11,12}|(?:[2-58]\\\\d\\\\d|900)\\\\d{7}\",[7,10,12,13],[[\"(\\\\d{3})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"512|8[01589]|90\"],\"0$1\",1],[\"(\\\\d{3})(\\\\d{3})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"5(?:[0-59]|61)\",\"5(?:[0-59]|616)\",\"5(?:[0-59]|6161)\"],\"0$1\",1],[\"(\\\\d{3})(\\\\d{3})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"[24][1-8]|3[1-9]\"],\"(0$1)\",1],[\"(\\\\d{3})(\\\\d{3})(\\\\d{6,7})\",\"$1 $2 $3\",[\"80\"],\"0$1\",1]],\"0\",0,0,0,0,0,[0,[\"56161\\\\d{5}|5(?:0[15-7]|1[06]|24|[34]\\\\d|5[1-59]|9[46])\\\\d{7}\",[10]]]],\"TT\":[\"1\",\"011\",\"(?:[58]\\\\d\\\\d|900)\\\\d{7}\",[10],0,\"1\",0,\"1|([2-46-8]\\\\d{6})$\",\"868$1\",0,\"868\",[0,[\"868(?:(?:2[5-9]|3\\\\d)\\\\d|4(?:3[0-6]|[6-9]\\\\d)|6(?:20|78|8\\\\d)|7(?:0[1-9]|1[02-9]|[2-9]\\\\d))\\\\d{4}\"]]],\"TV\":[\"688\",\"00\",\"(?:2|7\\\\d\\\\d|90)\\\\d{4}\",[5,6,7],[[\"(\\\\d{2})(\\\\d{3})\",\"$1 $2\",[\"2\"]],[\"(\\\\d{2})(\\\\d{4})\",\"$1 $2\",[\"90\"]],[\"(\\\\d{2})(\\\\d{5})\",\"$1 $2\",[\"7\"]]],0,0,0,0,0,0,[0,[\"(?:7[01]\\\\d|90)\\\\d{4}\",[6,7]]]],\"TW\":[\"886\",\"0(?:0[25-79]|19)\",\"[2-689]\\\\d{8}|7\\\\d{9,10}|[2-8]\\\\d{7}|2\\\\d{6}\",[7,8,9,10,11],[[\"(\\\\d{2})(\\\\d)(\\\\d{4})\",\"$1 $2 $3\",[\"202\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{3,4})\",\"$1 $2 $3\",[\"[258]0\"],\"0$1\"],[\"(\\\\d)(\\\\d{3,4})(\\\\d{4})\",\"$1 $2 $3\",[\"[23568]|4(?:0[02-48]|[1-47-9])|7[1-9]\",\"[23568]|4(?:0[2-48]|[1-47-9])|(?:400|7)[1-9]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"[49]\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{4})(\\\\d{4,5})\",\"$1 $2 $3\",[\"7\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"(?:40001[0-2]|9[0-8]\\\\d{4})\\\\d{3}\",[9]]],0,\"#\"],\"TZ\":[\"255\",\"00[056]\",\"(?:[25-8]\\\\d|41|90)\\\\d{7}\",[9],[[\"(\\\\d{3})(\\\\d{2})(\\\\d{4})\",\"$1 $2 $3\",[\"[89]\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"[24]\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{7})\",\"$1 $2\",[\"5\"]],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"[67]\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"77[2-9]\\\\d{6}|(?:6[125-9]|7[13-689])\\\\d{7}\"]]],\"UA\":[\"380\",\"00\",\"[89]\\\\d{9}|[3-9]\\\\d{8}\",[9,10],[[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"6[12][29]|(?:3[1-8]|4[136-8]|5[12457]|6[49])2|(?:56|65)[24]\",\"6[12][29]|(?:35|4[1378]|5[12457]|6[49])2|(?:56|65)[24]|(?:3[1-46-8]|46)2[013-9]\"],\"0$1\"],[\"(\\\\d{4})(\\\\d{5})\",\"$1 $2\",[\"3[1-8]|4(?:[1367]|[45][6-9]|8[4-6])|5(?:[1-5]|6[0135689]|7[4-6])|6(?:[12][3-7]|[459])\",\"3[1-8]|4(?:[1367]|[45][6-9]|8[4-6])|5(?:[1-5]|6(?:[015689]|3[02389])|7[4-6])|6(?:[12][3-7]|[459])\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"[3-7]|89|9[1-9]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3,4})\",\"$1 $2 $3\",[\"[89]\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"(?:39|50|6[36-8]|7[1-3]|9[1-9])\\\\d{7}\",[9]]],\"0~0\"],\"UG\":[\"256\",\"00[057]\",\"800\\\\d{6}|(?:[29]0|[347]\\\\d)\\\\d{7}\",[9],[[\"(\\\\d{4})(\\\\d{5})\",\"$1 $2\",[\"202\",\"2024\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{6})\",\"$1 $2\",[\"[27-9]|4(?:6[45]|[7-9])\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{7})\",\"$1 $2\",[\"[34]\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"726[01]\\\\d{5}|7(?:[01578]\\\\d|20|36|[46][0-4]|9[89])\\\\d{6}\"]]],\"US\":[\"1\",\"011\",\"[2-9]\\\\d{9}|3\\\\d{6}\",[10],[[\"(\\\\d{3})(\\\\d{4})\",\"$1-$2\",[\"310\"],0,1],[\"(\\\\d{3})(\\\\d{3})(\\\\d{4})\",\"($1) $2-$3\",[\"[2-9]\"],0,1,\"$1-$2-$3\"]],\"1\",0,0,0,0,0,[0,[\"505(?:[2-57-9]\\\\d\\\\d|6(?:[0-35-9]\\\\d|4[46]))\\\\d{4}|(?:2(?:0[1-35-9]|1[02-9]|2[03-589]|3[149]|4[08]|5[1-46]|6[0279]|7[0269]|8[13])|3(?:0[1-57-9]|1[02-9]|2[01356]|3[0-24679]|4[167]|5[0-2]|6[014]|8[056])|4(?:0[124-9]|1[02-579]|2[3-5]|3[0245]|4[023578]|58|6[349]|7[0589]|8[04])|5(?:0[1-47-9]|1[0235-8]|20|3[0149]|4[01]|5[19]|6[1-47]|7[0-5]|8[0256])|6(?:0[1-35-9]|1[024-9]|2[03689]|[34][016]|5[01679]|6[0-279]|78|8[0-29])|7(?:0[1-46-8]|1[2-9]|2[04-7]|3[1247]|4[037]|5[47]|6[02359]|7[0-59]|8[156])|8(?:0[1-68]|1[02-8]|2[068]|3[0-2589]|4[03578]|5[046-9]|6[02-5]|7[028])|9(?:0[1346-9]|1[02-9]|2[0589]|3[0146-8]|4[01357-9]|5[12469]|7[0-389]|8[04-69]))[2-9]\\\\d{6}\"]]],\"UY\":[\"598\",\"0(?:0|1[3-9]\\\\d)\",\"(?:0004|4)\\\\d{9}|[1249]\\\\d{7}|(?:[49]\\\\d|80)\\\\d{5}\",[7,8,10,13],[[\"(\\\\d{3})(\\\\d{4})\",\"$1 $2\",[\"405|8|90\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"9\"],\"0$1\"],[\"(\\\\d{4})(\\\\d{4})\",\"$1 $2\",[\"[124]\"]],[\"(\\\\d{3})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"4\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3 $4\",[\"0\"]]],\"0\",0,0,0,0,0,[0,[\"9[1-9]\\\\d{6}\",[8]]],\"00\",\" int. \"],\"UZ\":[\"998\",\"810\",\"(?:33|[5-79]\\\\d|88)\\\\d{7}\",[9],[[\"(\\\\d{2})(\\\\d{3})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"[35-9]\"],\"8 $1\"]],\"8\",0,0,0,0,0,[0,[\"(?:(?:33|88|9[0-57-9])\\\\d{3}|5(?:0\\\\d{3}|5(?:50[013]|90\\\\d))|6(?:1(?:2(?:2[01]|98)|35[0-4]|50\\\\d|61[23]|7(?:[01][017]|4\\\\d|55|9[5-9]))|2(?:(?:11|7\\\\d)\\\\d|2(?:[12]1|9[01379])|5(?:[126]\\\\d|3[0-4]))|5(?:19[01]|2(?:27|9[26])|(?:30|59|7\\\\d)\\\\d)|6(?:2(?:1[5-9]|2[0367]|38|41|52|60)|(?:3[79]|9[0-3])\\\\d|4(?:56|83)|7(?:[07]\\\\d|1[017]|3[07]|4[047]|5[057]|67|8[0178]|9[79]))|7(?:2(?:24|3[237]|4[5-9]|7[15-8])|5(?:7[12]|8[0589])|7(?:0\\\\d|[39][07])|9(?:0\\\\d|7[079]))|9(?:2(?:1[1267]|3[01]|5\\\\d|7[0-4])|(?:5[67]|7\\\\d)\\\\d|6(?:2[0-26]|8\\\\d)))|7(?:[07]\\\\d{3}|1(?:13[01]|6(?:0[47]|1[67]|66)|71[3-69]|98\\\\d)|2(?:2(?:2[79]|95)|3(?:2[5-9]|6[0-6])|57\\\\d|7(?:0\\\\d|1[17]|2[27]|3[37]|44|5[057]|66|88))|3(?:2(?:1[0-6]|21|3[469]|7[159])|(?:33|9[4-6])\\\\d|5(?:0[0-4]|5[579]|9\\\\d)|7(?:[0-3579]\\\\d|4[0467]|6[67]|8[078]))|4(?:2(?:29|5[0257]|6[0-7]|7[1-57])|5(?:1[0-4]|8\\\\d|9[5-9])|7(?:0\\\\d|1[024589]|2[0-27]|3[0137]|[46][07]|5[01]|7[5-9]|9[079])|9(?:7[015-9]|[89]\\\\d))|5(?:112|2(?:0\\\\d|2[29]|[49]4)|3[1568]\\\\d|52[6-9]|7(?:0[01578]|1[017]|[23]7|4[047]|[5-7]\\\\d|8[78]|9[079]))|6(?:2(?:2[1245]|4[2-4])|39\\\\d|41[179]|5(?:[349]\\\\d|5[0-2])|7(?:0[017]|[13]\\\\d|22|44|55|67|88))|9(?:22[128]|3(?:2[0-4]|7\\\\d)|57[02569]|7(?:2[05-9]|3[37]|4\\\\d|60|7[2579]|87|9[07]))))\\\\d{4}\"]],\"8~10\"],\"VA\":[\"39\",\"00\",\"0\\\\d{5,10}|3[0-8]\\\\d{7,10}|55\\\\d{8}|8\\\\d{5}(?:\\\\d{2,4})?|(?:1\\\\d|39)\\\\d{7,8}\",[6,7,8,9,10,11],0,0,0,0,0,0,\"06698\",[0,[\"3[1-9]\\\\d{8}|3[2-9]\\\\d{7}\",[9,10]]]],\"VC\":[\"1\",\"011\",\"(?:[58]\\\\d\\\\d|784|900)\\\\d{7}\",[10],0,\"1\",0,\"1|([2-7]\\\\d{6})$\",\"784$1\",0,\"784\",[0,[\"784(?:4(?:3[0-5]|5[45]|89|9[0-8])|5(?:2[6-9]|3[0-4])|720)\\\\d{4}\"]]],\"VE\":[\"58\",\"00\",\"[68]00\\\\d{7}|(?:[24]\\\\d|[59]0)\\\\d{8}\",[10],[[\"(\\\\d{3})(\\\\d{7})\",\"$1-$2\",[\"[24-689]\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"4(?:1[24-8]|2[46])\\\\d{7}\"]]],\"VG\":[\"1\",\"011\",\"(?:284|[58]\\\\d\\\\d|900)\\\\d{7}\",[10],0,\"1\",0,\"1|([2-578]\\\\d{6})$\",\"284$1\",0,\"284\",[0,[\"284496[6-9]\\\\d{3}|284(?:245|3(?:0[0-3]|4[0-7]|68|9[34])|4(?:4[0-6]|68|99)|5(?:4[0-7]|68|9[69]))\\\\d{4}\"]]],\"VI\":[\"1\",\"011\",\"[58]\\\\d{9}|(?:34|90)0\\\\d{7}\",[10],0,\"1\",0,\"1|([2-9]\\\\d{6})$\",\"340$1\",0,\"340\",[0,[\"340(?:2(?:0[0-368]|2[06-8]|4[49]|77)|3(?:32|44)|4(?:2[23]|44|7[34]|89)|5(?:1[34]|55)|6(?:2[56]|4[23]|77|9[023])|7(?:1[2-57-9]|2[57]|7\\\\d)|884|998)\\\\d{4}\"]]],\"VN\":[\"84\",\"00\",\"[12]\\\\d{9}|[135-9]\\\\d{8}|[16]\\\\d{7}|[16-8]\\\\d{6}\",[7,8,9,10],[[\"(\\\\d{2})(\\\\d{5})\",\"$1 $2\",[\"80\"],\"0$1\",1],[\"(\\\\d{4})(\\\\d{4,6})\",\"$1 $2\",[\"1\"],0,1],[\"(\\\\d{2})(\\\\d{3})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"[69]\"],\"0$1\",1],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"[3578]\"],\"0$1\",1],[\"(\\\\d{2})(\\\\d{4})(\\\\d{4})\",\"$1 $2 $3\",[\"2[48]\"],\"0$1\",1],[\"(\\\\d{3})(\\\\d{4})(\\\\d{3})\",\"$1 $2 $3\",[\"2\"],\"0$1\",1]],\"0\",0,0,0,0,0,[0,[\"(?:5(?:2[238]|59)|89[6-9]|99[013-9])\\\\d{6}|(?:3\\\\d|5[689]|7[06-9]|8[1-8]|9[0-8])\\\\d{7}\",[9]]]],\"VU\":[\"678\",\"00\",\"[57-9]\\\\d{6}|(?:[238]\\\\d|48)\\\\d{3}\",[5,7],[[\"(\\\\d{3})(\\\\d{4})\",\"$1 $2\",[\"[57-9]\"]]],0,0,0,0,0,0,[0,[\"(?:[58]\\\\d|7[013-7])\\\\d{5}\",[7]]]],\"WF\":[\"681\",\"00\",\"(?:40|72)\\\\d{4}|8\\\\d{5}(?:\\\\d{3})?\",[6,9],[[\"(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3\",[\"[478]\"]],[\"(\\\\d{3})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"8\"]]],0,0,0,0,0,0,[0,[\"(?:72|8[23])\\\\d{4}\",[6]]]],\"WS\":[\"685\",\"0\",\"(?:[2-6]|8\\\\d{5})\\\\d{4}|[78]\\\\d{6}|[68]\\\\d{5}\",[5,6,7,10],[[\"(\\\\d{5})\",\"$1\",[\"[2-5]|6[1-9]\"]],[\"(\\\\d{3})(\\\\d{3,7})\",\"$1 $2\",[\"[68]\"]],[\"(\\\\d{2})(\\\\d{5})\",\"$1 $2\",[\"7\"]]],0,0,0,0,0,0,[0,[\"(?:7[1-35-7]|8(?:[3-7]|9\\\\d{3}))\\\\d{5}\",[7,10]]]],\"XK\":[\"383\",\"00\",\"[23]\\\\d{7,8}|(?:4\\\\d\\\\d|[89]00)\\\\d{5}\",[8,9],[[\"(\\\\d{3})(\\\\d{5})\",\"$1 $2\",[\"[89]\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"[2-4]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"[23]\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"4[3-9]\\\\d{6}\",[8]]]],\"YE\":[\"967\",\"00\",\"(?:1|7\\\\d)\\\\d{7}|[1-7]\\\\d{6}\",[7,8,9],[[\"(\\\\d)(\\\\d{3})(\\\\d{3,4})\",\"$1 $2 $3\",[\"[1-6]|7(?:[24-6]|8[0-7])\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"7\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"7[01378]\\\\d{7}\",[9]]]],\"YT\":[\"262\",\"00\",\"80\\\\d{7}|(?:26|63)9\\\\d{6}\",[9],0,\"0\",0,0,0,0,\"269|63\",[0,[\"639(?:0[0-79]|1[019]|[267]\\\\d|3[09]|40|5[05-9]|9[04-79])\\\\d{4}\"]]],\"ZA\":[\"27\",\"00\",\"[1-79]\\\\d{8}|8\\\\d{4,9}\",[5,6,7,8,9,10],[[\"(\\\\d{2})(\\\\d{3,4})\",\"$1 $2\",[\"8[1-4]\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{2,3})\",\"$1 $2 $3\",[\"8[1-4]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"860\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"[1-9]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"8\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"(?:1(?:3492[0-25]|4495[0235]|549(?:20|5[01]))|4[34]492[01])\\\\d{3}|8[1-4]\\\\d{3,7}|(?:2[27]|47|54)4950\\\\d{3}|(?:1(?:049[2-4]|9[12]\\\\d\\\\d)|(?:6\\\\d|7[0-46-9])\\\\d{3}|8(?:5\\\\d{3}|7(?:08[67]|158|28[5-9]|310)))\\\\d{4}|(?:1[6-8]|28|3[2-69]|4[025689]|5[36-8])4920\\\\d{3}|(?:12|[2-5]1)492\\\\d{4}\",[5,6,7,8,9]]]],\"ZM\":[\"260\",\"00\",\"800\\\\d{6}|(?:21|63|[79]\\\\d)\\\\d{7}\",[9],[[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"[28]\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{7})\",\"$1 $2\",[\"[79]\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"(?:7[5-79]|9[5-8])\\\\d{7}\"]]],\"ZW\":[\"263\",\"00\",\"2(?:[0-57-9]\\\\d{6,8}|6[0-24-9]\\\\d{6,7})|[38]\\\\d{9}|[35-8]\\\\d{8}|[3-6]\\\\d{7}|[1-689]\\\\d{6}|[1-3569]\\\\d{5}|[1356]\\\\d{4}\",[5,6,7,8,9,10],[[\"(\\\\d{3})(\\\\d{3,5})\",\"$1 $2\",[\"2(?:0[45]|2[278]|[49]8)|3(?:[09]8|17)|6(?:[29]8|37|75)|[23][78]|(?:33|5[15]|6[68])[78]\"],\"0$1\"],[\"(\\\\d)(\\\\d{3})(\\\\d{2,4})\",\"$1 $2 $3\",[\"[49]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{4})\",\"$1 $2\",[\"80\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{7})\",\"$1 $2\",[\"24|8[13-59]|(?:2[05-79]|39|5[45]|6[15-8])2\",\"2(?:02[014]|4|[56]20|[79]2)|392|5(?:42|525)|6(?:[16-8]21|52[013])|8[13-59]\"],\"(0$1)\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"7\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3,4})\",\"$1 $2 $3\",[\"2(?:1[39]|2[0157]|[378]|[56][14])|3(?:12|29)\",\"2(?:1[39]|2[0157]|[378]|[56][14])|3(?:123|29)\"],\"0$1\"],[\"(\\\\d{4})(\\\\d{6})\",\"$1 $2\",[\"8\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3,5})\",\"$1 $2\",[\"1|2(?:0[0-36-9]|12|29|[56])|3(?:1[0-689]|[24-6])|5(?:[0236-9]|1[2-4])|6(?:[013-59]|7[0-46-9])|(?:33|55|6[68])[0-69]|(?:29|3[09]|62)[0-79]\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{3,4})\",\"$1 $2 $3\",[\"29[013-9]|39|54\"],\"0$1\"],[\"(\\\\d{4})(\\\\d{3,5})\",\"$1 $2\",[\"(?:25|54)8\",\"258|5483\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"7(?:[178]\\\\d|3[1-9])\\\\d{6}\",[9]]]]},\"nonGeographic\":{\"800\":[\"800\",0,\"(?:00|[1-9]\\\\d)\\\\d{6}\",[8],[[\"(\\\\d{4})(\\\\d{4})\",\"$1 $2\",[\"\\\\d\"]]],0,0,0,0,0,0,[0,0,[\"(?:00|[1-9]\\\\d)\\\\d{6}\"]]],\"808\":[\"808\",0,\"[1-9]\\\\d{7}\",[8],[[\"(\\\\d{4})(\\\\d{4})\",\"$1 $2\",[\"[1-9]\"]]],0,0,0,0,0,0,[0,0,0,0,0,0,0,0,0,[\"[1-9]\\\\d{7}\"]]],\"870\":[\"870\",0,\"7\\\\d{11}|[35-7]\\\\d{8}\",[9,12],[[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"[35-7]\"]]],0,0,0,0,0,0,[0,[\"(?:[356]|774[45])\\\\d{8}|7[6-8]\\\\d{7}\"]]],\"878\":[\"878\",0,\"10\\\\d{10}\",[12],[[\"(\\\\d{2})(\\\\d{5})(\\\\d{5})\",\"$1 $2 $3\",[\"1\"]]],0,0,0,0,0,0,[0,0,0,0,0,0,0,0,[\"10\\\\d{10}\"]]],\"881\":[\"881\",0,\"[0-36-9]\\\\d{8}\",[9],[[\"(\\\\d)(\\\\d{3})(\\\\d{5})\",\"$1 $2 $3\",[\"[0-36-9]\"]]],0,0,0,0,0,0,[0,[\"[0-36-9]\\\\d{8}\"]]],\"882\":[\"882\",0,\"[13]\\\\d{6}(?:\\\\d{2,5})?|[19]\\\\d{7}|(?:[25]\\\\d\\\\d|4)\\\\d{7}(?:\\\\d{2})?\",[7,8,9,10,11,12],[[\"(\\\\d{2})(\\\\d{5})\",\"$1 $2\",[\"16|342\"]],[\"(\\\\d{2})(\\\\d{6})\",\"$1 $2\",[\"49\"]],[\"(\\\\d{2})(\\\\d{2})(\\\\d{4})\",\"$1 $2 $3\",[\"1[36]|9\"]],[\"(\\\\d{2})(\\\\d{4})(\\\\d{3})\",\"$1 $2 $3\",[\"3[23]\"]],[\"(\\\\d{2})(\\\\d{3,4})(\\\\d{4})\",\"$1 $2 $3\",[\"16\"]],[\"(\\\\d{2})(\\\\d{4})(\\\\d{4})\",\"$1 $2 $3\",[\"10|23|3(?:[15]|4[57])|4|51\"]],[\"(\\\\d{3})(\\\\d{4})(\\\\d{4})\",\"$1 $2 $3\",[\"34\"]],[\"(\\\\d{2})(\\\\d{4,5})(\\\\d{5})\",\"$1 $2 $3\",[\"[1-35]\"]]],0,0,0,0,0,0,[0,[\"342\\\\d{4}|(?:337|49)\\\\d{6}|(?:3(?:2|47|7\\\\d{3})|50\\\\d{3})\\\\d{7}\",[7,8,9,10,12]],0,0,0,0,0,0,[\"1(?:3(?:0[0347]|[13][0139]|2[035]|4[013568]|6[0459]|7[06]|8[15-8]|9[0689])\\\\d{4}|6\\\\d{5,10})|(?:345\\\\d|9[89])\\\\d{6}|(?:10|2(?:3|85\\\\d)|3(?:[15]|[69]\\\\d\\\\d)|4[15-8]|51)\\\\d{8}\"]]],\"883\":[\"883\",0,\"(?:[1-4]\\\\d|51)\\\\d{6,10}\",[8,9,10,11,12],[[\"(\\\\d{3})(\\\\d{3})(\\\\d{2,8})\",\"$1 $2 $3\",[\"[14]|2[24-689]|3[02-689]|51[24-9]\"]],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"510\"]],[\"(\\\\d{3})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"21\"]],[\"(\\\\d{4})(\\\\d{4})(\\\\d{4})\",\"$1 $2 $3\",[\"51[13]\"]],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3 $4\",[\"[235]\"]]],0,0,0,0,0,0,[0,0,0,0,0,0,0,0,[\"(?:2(?:00\\\\d\\\\d|10)|(?:370[1-9]|51\\\\d0)\\\\d)\\\\d{7}|51(?:00\\\\d{5}|[24-9]0\\\\d{4,7})|(?:1[013-79]|2[24-689]|3[02-689]|4[0-4])0\\\\d{5,9}\"]]],\"888\":[\"888\",0,\"\\\\d{11}\",[11],[[\"(\\\\d{3})(\\\\d{3})(\\\\d{5})\",\"$1 $2 $3\"]],0,0,0,0,0,0,[0,0,0,0,0,0,[\"\\\\d{11}\"]]],\"979\":[\"979\",0,\"[1359]\\\\d{8}\",[9],[[\"(\\\\d)(\\\\d{4})(\\\\d{4})\",\"$1 $2 $3\",[\"[1359]\"]]],0,0,0,0,0,0,[0,0,0,[\"[1359]\\\\d{8}\"]]]}}","import withMetadataArgument from './withMetadataArgument.js'\r\nimport { getExampleNumber as _getExampleNumber } from '../../core/index.js'\r\n\r\nexport function getExampleNumber() {\r\n\treturn withMetadataArgument(_getExampleNumber, arguments)\r\n}","import withMetadataArgument from './withMetadataArgument.js'\r\nimport { parsePhoneNumberWithError as _parsePhoneNumberWithError } from '../../core/index.js'\r\n\r\nexport function parsePhoneNumberWithError() {\r\n\treturn withMetadataArgument(_parsePhoneNumberWithError, arguments)\r\n}\r\n","// Importing from a \".js\" file is a workaround for Node.js \"ES Modules\"\r\n// importing system which is even uncapable of importing \"*.json\" files.\r\nimport metadata from '../../metadata.mobile.json.js'\r\n\r\nexport default function withMetadataArgument(func, _arguments) {\r\n\tvar args = Array.prototype.slice.call(_arguments)\r\n\targs.push(metadata)\r\n\treturn func.apply(this, args)\r\n}","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","var getProto = Object.getPrototypeOf ? (obj) => (Object.getPrototypeOf(obj)) : (obj) => (obj.__proto__);\nvar leafPrototypes;\n// create a fake namespace object\n// mode & 1: value is a module id, require it\n// mode & 2: merge all properties of value into the ns\n// mode & 4: return value when already ns object\n// mode & 16: return value when it's Promise-like\n// mode & 8|1: behave like require\n__webpack_require__.t = function(value, mode) {\n\tif(mode & 1) value = this(value);\n\tif(mode & 8) return value;\n\tif(typeof value === 'object' && value) {\n\t\tif((mode & 4) && value.__esModule) return value;\n\t\tif((mode & 16) && typeof value.then === 'function') return value;\n\t}\n\tvar ns = Object.create(null);\n\t__webpack_require__.r(ns);\n\tvar def = {};\n\tleafPrototypes = leafPrototypes || [null, getProto({}), getProto([]), getProto(getProto)];\n\tfor(var current = mode & 2 && value; typeof current == 'object' && !~leafPrototypes.indexOf(current); current = getProto(current)) {\n\t\tObject.getOwnPropertyNames(current).forEach((key) => (def[key] = () => (value[key])));\n\t}\n\tdef['default'] = () => (value);\n\t__webpack_require__.d(ns, def);\n\treturn ns;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"\" + chunkId + \".dev.js\";\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","var inProgress = {};\nvar dataWebpackPrefix = \"tinode-webapp:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = (url, done, key, chunkId) => {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tscript.timeout = 120;\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = (prev, event) => {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach((fn) => (fn(event)));\n\t\tif(prev) return prev(event);\n\t};\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.p = \"/umd/\";","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t\"index\": 0\n};\n\n__webpack_require__.f.j = (chunkId, promises) => {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\n\t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n\t\t\t// a Promise means \"currently loading\".\n\t\t\tif(installedChunkData) {\n\t\t\t\tpromises.push(installedChunkData[2]);\n\t\t\t} else {\n\t\t\t\tif(true) { // all chunks have JS\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise((resolve, reject) => (installedChunkData = installedChunks[chunkId] = [resolve, reject]));\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = (event) => {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t} else installedChunks[chunkId] = 0;\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n// no on chunks loaded\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\n}\n\nvar chunkLoadingGlobal = globalThis[\"webpackChunktinode_webapp\"] = globalThis[\"webpackChunktinode_webapp\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","// Put all packages together.\n// Used to generate umd/index.prod.js\n\nimport React from 'react';\nimport { createRoot } from 'react-dom/client';\n\nimport { IntlProvider } from 'react-intl';\n\nimport TinodeWeb from './views/tinode-web.jsx';\nimport HashNavigation from './lib/navigation.js';\n\n// Insert google analytics script and tag if configured.\nif (FIREBASE_INIT && FIREBASE_INIT.measurementId) {\n const head = document.getElementsByTagName('head')[0];\n let script = document.createElement('script');\n script.src = 'https://www.googletagmanager.com/gtag/js?id=' + FIREBASE_INIT.measurementId;\n script.async = true;\n head.prepend(script);\n window.dataLayer = window.dataLayer || [];\n function gtag(){dataLayer.push(arguments);}\n gtag('js', new Date());\n gtag('config', FIREBASE_INIT.measurementId);\n}\n\n// Allow loading translation strings for just one language.\nconst messageLoader = {\n 'de': _ => import('./i18n.min/de.json'),\n 'en': _ => import('./i18n.min/en.json'),\n 'es': _ => import('./i18n.min/es.json'),\n 'fr': _ => import('./i18n.min/fr.json'),\n 'ko': _ => import('./i18n.min/ko.json'),\n 'ro': _ => import('./i18n.min/ro.json'),\n 'ru': _ => import('./i18n.min/ru.json'),\n 'zh': _ => import('./i18n.min/zh.json'),\n 'zh-TW': _ => import('./i18n.min/zh-TW.json')\n};\n\n// Detect human language to use in the UI:\n// Check parameters from URL hash #?hl=ru, then browser, then use 'en' as a fallback.\nconst { params } = HashNavigation.parseUrlHash(window.location.hash);\nconst language = (params && params.hl) ||\n (navigator.languages && navigator.languages[0]) ||\n navigator.language ||\n navigator.userLanguage ||\n 'en';\n\n// Make sure names like 'en_GB' and 'en-GB' consistently use '-'.\nconst normalized = language.replace('_', '-');\n// Get the base language 'en' from a more specific 'en-US' as a partial fallback.\nconst baseLanguage = normalized.split('-')[0].toLowerCase();\n\n// Try the full locale first, then the locale without the region code, fallback to 'en'.\nconst htmlLang = messageLoader[normalized] ? language : messageLoader[baseLanguage] ? baseLanguage : 'en';\n\n// Set lang attribute of the HTML element: \ndocument.getElementsByTagName('html')[0].setAttribute('lang', htmlLang);\n\n// Render the app.\nconst root = createRoot(document.getElementById('mountPoint'));\nmessageLoader[htmlLang]().then(messages =>\n root.render(\n \n \n \n));\n"],"names":["PACKAGE_VERSION","APP_NAME","API_KEY","KNOWN_HOSTS","hosted","local","DEFAULT_HOST","LOGGING_ENABLED","KEYPRESS_DELAY","READ_DELAY","MIN_TAG_LENGTH","MAX_TAG_LENGTH","MAX_TAG_COUNT","DEFAULT_P2P_ACCESS_MODE","NEW_GRP_ACCESS_MODE","CHANNEL_ACCESS_MODE","NO_ACCESS_MODE","MEDIA_BREAKPOINT","REM_SIZE","AVATAR_SIZE","MAX_AVATAR_BYTES","BROKEN_IMAGE_SIZE","NO_DIMENSIONS_VIDEO","MESSAGES_PAGE","MAX_INBAND_ATTACHMENT_SIZE","MAX_EXTERN_ATTACHMENT_SIZE","MAX_IMAGE_DIM","IMAGE_PREVIEW_DIM","VIDEO_PREVIEW_DIM","IMAGE_THUMBNAIL_DIM","VIDEO_THUMBNAIL_WIDTH","MAX_ONLINE_IN_TOPIC","MAX_TITLE_LENGTH","MAX_TOPIC_DESCRIPTION_LENGTH","MAX_PEER_TITLE_LENGTH","MESSAGE_PREVIEW_LENGTH","QUOTED_REPLY_LENGTH","FORWARDED_PREVIEW_LENGTH","EDIT_PREVIEW_LENGTH","MIN_DURATION","MAX_DURATION","LINK_CONTACT_US","LINK_PRIVACY_POLICY","LINK_TERMS_OF_SERVICE","CALL_STATE_NONE","CALL_STATE_OUTGOING_INITATED","CALL_STATE_INCOMING_RECEIVED","CALL_STATE_IN_PROGRESS","CALL_HEAD_STARTED","SUPPORTED_IMAGE_FORMATS","MIME_EXTENSIONS","makeImageUrl","photo","ref","data","type","mime","startsWith","fitImageSize","width","height","maxWidth","maxHeight","forceSquare","Math","min","scale","size","dstWidth","dstHeight","srcWidth","srcHeight","xoffset","yoffset","fileNameForMime","fname","idx","indexOf","ext","at","lastIndexOf","substring","imageScaled","fileOrBlob","maxSize","Promise","resolve","reject","img","Image","crossOrigin","onerror","err","Error","onload","URL","revokeObjectURL","src","dim","canvas","document","createElement","ctx","getContext","imageSmoothingEnabled","drawImage","includes","blob","toBlob","length","clearRect","name","createObjectURL","imageCrop","objURL","left","top","_","fileToBase64","file","reader","FileReader","error","bits","result","split","readAsDataURL","blobToBase64","filePasted","event","onImageSuccess","onAttachmentSuccess","onError","items","clipboardData","originalEvent","i","item","kind","getAsFile","console","getMimeType","header","exec","base64EncodedLen","n","floor","base64DecodedLen","base64ReEncode","str","replace","btoa","atob","base64ToBlob","bin","buf","ArrayBuffer","arr","Uint8Array","charCodeAt","Blob","intArrayToBase64","Array","isArray","forEach","b","String","fromCharCode","window","base64ToIntArray","b64","c","push","React","defineMessages","Drafty","AudioPlayer","CallMessage","CallStatus","InlineVideo","LazyImage","UploadingImage","idToColorClass","secondsToTime","shortenFileName","cancelablePromise","sanitizeUrlForMime","messages","drafty_form","id","defaultMessage","drafty_attachment","drafty_image","drafty_video","drafty_unknown","fullFormatter","style","values","key","stack","quoteFormatter","call","el","tagName","attr","attrValue","authorizeURL","duration","undefined","preview","loading","className","handleImageData","onClick","onFormButtonClick","inner","Children","map","child","join","val","onQuoteClick","callState","state","incoming","handleVideoData","Fragment","body","trim","formatMessage","concat","viewportWidth","minWidth","minHeight","isProcessing","alt","max","onImagePreview","onVideoPreview","previewFormatter","inlineImageAttr","title","inlineVideoAttr","quoteImageOrVideo","isVideo","promise","premime","preref","fetch","then","evt","ok","status","statusText","scaled","catch","replyFormatter","isImage","loadedPromise","warn","message","whenDone","detectServerAddress","host","location","protocol","hostname","port","isSecureConnection","isLocalHost","LocalStorageUtil","setObject","value","localStorage","setItem","JSON","stringify","getObject","getItem","parse","updateObject","oldVal","Object","assign","removeItem","HashNavigation","parseUrlHash","hash","parts","params","path","arg","eq","slice","decodeURIComponent","navigateTo","url","composeUrlHash","args","hasOwnProperty","encodeURIComponent","addUrlParam","parsed","removeUrlParam","setUrlSidePanel","sidepanel","setUrlInfoPanel","infopanel","info","setUrlTopic","topic","shortDateFormat","locale","navigator","userLanguage","language","now","Date","getFullYear","getMonth","getDate","toLocaleTimeString","hour12","hour","minute","toLocaleDateString","month","day","year","relativeDateFormat","thenDays","getTime","getTimezoneOffset","nowDays","diff","abs","Intl","RelativeTimeFormat","numeric","format","DateTimeFormat","seconds","fixedMin","hours","sec","bytesToHumanSize","bytes","sizes","bucket","log2","count","pow","round","toFixed","filename","maxLength","stringToColorHash","letterTileColorId","userId","light","fg","flagEmoji","countryCode","codePoints","toUpperCase","char","fromCodePoint","Tinode","updateFavicon","oldIcon","getElementById","head","getElementsByTagName","newIcon","rel","href","removeChild","appendChild","theCard","fn","imageUrl","imageMimeType","note","card","DEL_CHAR","mimeType","matches","arrayEqual","a","sort","l","asPhone","test","asEmail","isUrlRelative","sanitizeUrl","allowedSchemes","schemes","re","RegExp","mimeMajor","sanitizedUrl","deliveryMarker","received","MESSAGE_STATUS_SENDING","MESSAGE_STATUS_FAILED","color","MESSAGE_STATUS_SENT","MESSAGE_STATUS_RECEIVED","MESSAGE_STATUS_READ","hasCanceled","wrappedPromise","isCanceled","cancel","clipStr","FormattedMessage","CheckBox","EditAccountView","PureComponent","constructor","props","handleCheckboxClick","bind","what","checked","onToggleMessageSounds","onTogglePushNotifications","onToggleIncognitoMode","render","messageSounds","desktopAlertsEnabled","desktopAlerts","incognitoMode","injectIntl","InPlaceEdit","PermissionsEditor","delete_account","delete_account_warning","AccSecurityView","Component","me","tinode","getMeTopic","blockedCount","contacts","acs","isJoiner","defacs","getDefaultAccess","auth","anon","showPermissionEditorFor","handlePasswordUpdate","handleLaunchPermissionsEditor","handleHidePermissionsEditor","handlePermissionsChanged","handleDeleteAccount","pwd","setState","password","onUpdatePassword","which","editedPermissions","perm","onUpdateAccountDesc","newState","e","preventDefault","intl","onShowAlert","onDeleteAccount","password_unchanged","onLogout","onShowBlocked","AccSupportView","getLibrary","serverVersion","serverAddress","parsePhoneNumber","AvatarUpload","BadgeList","CredentialEdit","_clip","AccountSettingsView","fullName","public","description","avatar","credentials","getCredentials","credEdit","handleEditCred","cred","log","meth","done","onShowCountrySelector","number","formatInternational","unshift","onNavigate","myUserId","trustedBadges","ContactList","archived_contacts_title","ContactsView","handleAction","deriveStateFromProps","unreadThreads","archivedCount","chatList","blocked","private","arch","archive","unread","touched","action","contactList","componentDidUpdate","prevProps","prevState","action_ignored","onShowArchive","no_contacts","connected","topicSelected","onTopicSelected","showContextMenu","Suspense","AvatarCrop","PhoneEdit","lazy","VisiblePassword","CreateAccountView","login","email","tel","uploadUrl","newAvatar","newAvatarMime","buttonDisabled","saveToken","handleLoginChange","handlePasswordChange","handleEmailChange","handlePhoneChange","handleFnChange","handleImageChanged","handleToggleSaveToken","handleAvatarCropped","handleAvatarCropCancel","uploadAvatar","handleSubmit","connect","target","onCreateAccount","readyToUpload","image","uploader","getLargeFileHelper","upload","finally","submitClasses","disabled","login_prompt","password_prompt","full_name_prompt","reqCredMethod","email_prompt","stay_logged_in","AccessMode","ErrorPanel","GroupManager","MenuCancel","TopicCommonView","TopicSecurity","general","security","members","crop","perm_want","perm_given","perm_auth","perm_anon","perm_user","edit_permissions","InfoView","owner","admin","sharer","deleter","muted","address","groupTopic","channel","selectedContact","access","modeGiven","modeWant","modeGiven2","modeWant2","previousMetaDesc","previousSubsUpdated","resetSubs","resetDesc","resetTags","onMetaDesc","onSubsUpdated","handleMuted","handleUnarchive","handleShowAddMembers","handleMemberUpdateRequest","handleMemberSelected","handleContextMenu","handleBackNavigate","getTopic","componentWillUnmount","getType","user2","subscriber","getGiven","getWant","subscribers","sub","getAccessMode","badges","trusted","entries","isOwner","isAdmin","isSharer","isDeleter","isMuted","comment","archived","isArchived","isGroupType","isChannelType","chan","getMode","getMeta","startMetaQuery","withTags","build","desc","subs","onTopicDescUpdate","ignored","onChangePermissions","ignored2","onTopicUnArchive","onTopicDescUpdateRequest","userPermissionsEdited","uid","toEdit","toCompare","toSkip","titleEdit","titleCompare","userTitle","userAvatar","encode","user","userPermissionsTitle","userPermissionsAvatar","immutablePermissions","editedPermissionsTitle","immutablePermissionsTitle","editedPermissionsSkipped","onInitFind","added","removed","onMemberUpdateRequest","panel","topicName","isMe","menuItems","handler","x","y","view","shift","panelTitle","displayMobile","errorLevel","errorText","searchableContacts","mode","onCredAdd","onTopicTagsUpdateRequest","onCredConfirm","onCredDelete","onDeleteMessages","onLeaveTopic","onBlockTopic","onReportTopic","no_members","LoginView","hostName","persist","onPersistenceChange","onLogin","LogoView","version","CallPanel","ChatMessage","ContactBadges","DocPreview","GroupSubs","ImagePreview","Invitation","LetterTile","LoadSpinner","MetaMessage","SendMessage","VideoPreview","NOTIFICATION_EXEC_INTERVAL","SHOW_GO_TO_LAST_DIST","online_now","last_seen","not_found","file_attachment_too_large","invalid_content","editing_message","drag_file","isUnconfirmed","ex","getExcessive","isPeerRestricted","ms","getMissing","shouldPresentCallPanel","MessagesView","getDerivedStateFromProps","leave","sendMessage","retrySend","sendImageAttachment","sendVideoAttachment","sendFileAttachment","sendAudioAttachment","sendKeyPress","subscribe","handleScrollReference","mountDnDEvents","handleScrollEvent","handleDescChange","handleSubsUpdated","handleMessageUpdate","handleAllMessagesReceived","handleInfoReceipt","handleExpandMedia","handleClosePreview","handleFormResponse","handleContextClick","handleShowMessageContextMenu","handleNewChatAcceptance","handleEnablePeer","handleAttachFile","handleAttachImageOrVideo","handleCancelUpload","postReadNotification","clearNotificationQueue","goToLatestMessage","handleFileDrop","handlePickReply","handleEditMessage","handleCancelReply","handleQuoteClick","handleCallHangup","isDragEnabled","handleDragIn","handleDragOut","handleDrag","handleDrop","chatMessageRefs","getOrCreateMessageRef","dragCounter","dndRef","readNotificationQueue","readNotificationTimer","keyPressTimer","seqId","createRef","componentDidMount","messagesScroller","addEventListener","removeEventListener","messageCount","scrollPosition","scrollTop","scrollHeight","offsetHeight","isNewGroupTopicName","rtcPanel","callSeq","onData","onAllMessagesReceived","onInfo","onPres","applicationVisible","ready","_new","isP2PType","withDesc","nextProps","nextState","latestClearId","onlineSubs","isVerified","isStaff","isDangerous","deleted","docPreview","imagePreview","imagePostview","videoPreview","videoPostview","typingIndicator","fetchingMessages","peerMessagingDisabled","reply","contentToEdit","showGoToLastButton","dragging","_deleted","forwardMessage","content","seq","online","peer","p2pPeerDesc","maxClearId","callTopic","isWriter","isReader","readingBlocked","unconformed","unconfirmed","isSubscribed","newTopic","newTopicParams","_topicName","getQuery","withLaterDesc","withLaterSub","withLaterData","withLaterDel","setQuery","ctrl","code","onNewTopicCreated","calls","queuedMessages","pub","_sending","webrtc","delMessagesList","blankState","oldTopicName","isTopicCached","oldTopic","node","pos","msgHasMoreMessages","getMessagesPage","dnd","setInterval","clearInterval","sendAt","noteRead","setMilliseconds","getMilliseconds","msg","clearTimeout","isNewMessage","msgStatus","from","setTimeout","forceUpdate","video","text","attachJSON","searchParams","resp","set","search","open","stopPropagation","pageY","pageX","messageSpecificMenuItems","userFrom","userName","onNewChat","audio","noteRecording","noteKeyPress","uploadCompletionPromise","editing","append","sanitizeEntities","maxInbandAttachmentSize","getServerParam","cannot_initiate_upload","attachFile","urlPromise","maxExternAttachmentSize","limit","onVideoCallClosed","onCallHangup","caption","insertImage","_tempPreview","appendLineBreak","videoBlob","previewBlob","uploads","all","b64s","v64","i64","insertVideo","b64conv","files","appendAudio","found","findMessage","_cancelled","senderId","senderName","init","isValid","replyContent","wrapInto","quote","onCancelForwardMessage","editable","toMarkdown","replyToSeq","current","scrollIntoView","block","behavior","classList","add","remove","dataTransfer","clearData","component","hideSelf","component2","callAudioOnly","onCallInvite","onCallSendOffer","onCallIceCandidate","onCallSendAnswer","isChannel","icon_badges","verified","icon","staff","danger","messageNodes","previousFrom","prevDate","chatBoxClass","prev","next","nextFrom","sequence","thisFrom","isReply","deliveryStatus","userDesc","parseInt","isNaN","hi","thisDate","ts","toDateString","_uploader","lastSeen","cont","getContact","isP2PTopicName","seen","when","titleClass","messagesComponent","onHideMessagesView","NewTopicById","NewTopicGroup","SearchContacts","search_for_contacts","search_no_results","search_placeholder","NewTopicView","tabSelected","searchQuery","handleTabClick","handleSearchContacts","handleSearchResultSelected","handleNewGroupSubmit","handleGroupByID","currentTarget","dataset","query","onSearchContacts","isNullValue","onCreateTopic","dataUrl","priv","tags","no_contacts_placeholder","searchResults","PasswordResetView","sent","haveCode","handleCodeChange","handleShowCodeField","token","scheme","onReset","secret","onRequest","showCredentialInput","showPasswordInput","passwordInput","placeholder","emailInput","phoneInput","sentNotification","phone","codeInput","numbers_only","credentialInput","marginRight","HostSelector","SettingsView","transport","secureConnection","handleTransportSelected","handleServerAddressChange","handleToggleSecure","onUpdate","names","def","ws","lp","transportOptions","SideNavbar","AccNotificationsView","ValidationView","register","settings","edit","notif","support","newtpk","reset","SidepanelView","handleNewTopic","onCancel","onSignUp","onSettings","errorAction","errorActionText","loadSpinnerVisible","loginDisabled","onLoginRequest","onGlobalSettings","onUpdateAccountTags","credCode","credMethod","credToken","onValidateCredentials","onPasswordResetRequest","onResetPassword","initializeApp","firebaseInitApp","getMessaging","firebaseGetMessaging","getToken","firebaseGetToken","deleteToken","firebaseDelToken","onMessage","firebaseOnMessage","Alert","ContextMenu","ForwardDialog","CallIncoming","PhoneCountrySelector","POP_SOUND","Audio","reconnect_countdown","reconnect_now","push_init_failed","invalid_security_token","no_connection","code_doesnot_match","menu_item_info","menu_item_audio_call","menu_item_video_call","cred_confirmed_successfully","TinodeWeb","selfRef","getBlankState","handleResize","handleHashRoute","handleOnline","checkForAppUpdate","handleVisibilityEvent","handleError","handleLoginRequest","handlePersistenceChange","handleConnected","handleAutoreconnectIteration","doLogin","handleLoginSuccessful","handleDisconnect","tnMeMetaDesc","tnMeContactUpdate","tnMeSubsUpdated","resetContactList","tnInitFind","tnFndSubsUpdated","handleTopicSelected","handleHideMessagesView","handleSendMessage","handleNewChatInvitation","handleNewAccount","handleNewAccountRequest","handleUpdatePasswordRequest","handleUpdateAccountTagsRequest","handleToggleIncognitoMode","handleSettings","handleGlobalSettings","handleShowArchive","handleShowBlocked","handleToggleMessageSounds","handleCredAdd","handleCredDelete","handleCredConfirm","initFCMessaging","toggleFCMToken","handlePushMessage","handleSidepanelCancel","handleStartTopicRequest","handleNewTopicCreated","handleTopicUpdateRequest","handleChangePermissions","handleTagsUpdateRequest","handleLogout","handleDeleteTopicRequest","handleDeleteMessagesRequest","handleLeaveUnsubRequest","handleBlockTopicRequest","handleReportTopic","handleShowContextMenu","defaultTopicContextMenu","handleHideContextMenu","handleShowAlert","handleShowInfoView","handleValidateCredentialsRequest","handlePasswordResetRequest","handleResetPassword","handleContextMenuAction","handleShowCountrySelector","handleShowForwardDialog","handleHideForwardDialog","handleStartVideoCall","handleStartAudioCall","handleInfoMessage","handleDataMessage","handleCallClose","handleCallInvite","handleCallRinging","handleCallSendOffer","handleCallIceCandidate","handleCallSendAnswer","handleCallAccept","sendMessageToTopic","callTimeoutTimer","autoLogin","messageSoundsOff","FIREBASE_INIT","firebaseToken","hidden","sidePanelSelected","sidePanelTitle","sidePanelAvatar","myTrustedBadges","liveConnection","onLine","topicSelectedOnline","topicSelectedAcs","innerWidth","infoPanel","mobilePanel","callShouldStart","contextMenuVisible","contextMenuBounds","contextMenuClickAt","contextMenuParams","contextMenuItems","forwardDialogVisible","alertVisible","alertParams","requestedTopic","BroadcastChannel","serviceWorkerChannel","documentElement","clientWidth","viewportHeight","clientHeight","tnSetup","onConnect","onDisconnect","onAutoreconnectIteration","onInfoMessage","onDataMessage","parsedNav","expires","setAuthToken","readTimer","readTimerCallback","cred_done","persistentCache","onSetupCompleted","appName","apiKey","secure","setHumanLanguage","enableLogging","payload","oobNotification","fcm","serviceWorker","getRegistration","reg","active","installing","postMessage","requestFCMToken","setDeviceToken","sw","serviceWorkerRegistration","vapidKey","messagingVapidKey","Notification","requestPermission","permission","mobile","onupdatefound","installingWorker","onstatechange","controller","newTopicTabSelected","tab","topicType","getTopicAccessMode","method","stateForError","reconnectCountdown","reconnect","level","actionText","isConnected","initStorage","clearStorage","getServerInfo","ver","reqCred","prom","fmtTime","tmpToken","isAuthenticated","getAuthToken","credential","connectionPromise","loginPromise","loginBasic","loginToken","navigateToCredentialsView","goToTopic","onContactUpdate","getCurrentUserID","withCred","disconnect","urlHash","isPresencer","play","unused","prepareSearchableContacts","foundContacts","merged","updated","past","fnd","getFndTopic","withSub","s","setMeta","isTopicOnline","createMessage","completion","subscribePromise","publishMessage","publishDraft","response","delTopic","am","updateWant","login_","password_","public_","cred_","tags_","attachments","createAccountBasic","on","enabled","delCredential","basicNavigator","infoNavigator","newGroupTopicName","oldName","newName","updateAccountBasic","getCurrentLogin","updateGiven","cleared","Promose","delCurrentUser","delMessagesAll","updateMode","report","getBoundingClientRect","forwardedContent","mention","msgPreview","forwarded","self_blocked","subscribed","keepForwardedMessage","onConfirm","confirmText","onReject","rejectText","confirm","invite","delSubscription","requestResetAuthSecret","newPassword","tempAuth","dial","selectedCallback","d","audioOnly","aonly","videoCall","sdp","candidate","isMeTopicName","latestMsgVersion","handleManageGroupMembers","TopicDescEdit","previousTagsUpdated","onTagsUpdated","handleTagsUpdated","onUpdateTagsRequest","onUpdateTopicDesc","codeReceived","handleChange","handleKeyPress","handleCancel","onSubmit","methods","FileProgress","Attachment","downloader","progress","downloadFile","mimetype","download","loaded","uploading","onCancelUpload","substr","helperFunc","downloadUrl","downloadWidget","CANVAS_UPSCALING","LINE_WIDTH","SPACING","BAR_COLOR","BAR_COLOR_DARK","THUMB_COLOR","MIN_PREVIEW_LENGTH","icon_title_play","canPlay","playing","currentTime","longMin","initAudio","initCanvas","resampleBars","visualize","handlePlay","handleSeek","audioPlayer","viewBuffer","canvasRef","oncanplay","ontimeupdate","onended","pause","offsetWidth","canvasContext","lineCap","effectiveWidth","lineWidth","drawFrame","requestAnimationFrame","thumbAt","beginPath","strokeStyle","stroke","moveTo","lineTo","arc","PI","fillStyle","fill","original","dstCount","apply","factor","amps","maxAmp","lo","amp","j","rect","offset","clientX","playClass","short","Cropper","source","handleFileReceived","onImageUpdated","randId","random","readOnly","icon_mapping","badge_verified","badge_staff","badge_danger","ButtonBack","onBack","RING_SOUND","handleRejectCall","handleAcceptCall","ringTimer","onRinging","onAcceptCall","onClose","isCallDropped","successClass","callIcon","loop","CALL_ENDED_SOUND","DIALING_SOUND","VIDEO_MUTED_EVENT","VIDEO_UNMUTED_EVENT","already_in_call","localStream","remoteStream","pc","dataChannel","previousOnInfo","waitingForPeer","callInitialSetupComplete","videoToggleInProgress","remoteVideoLive","localStreamConstraints","isOutgoingCall","localRef","remoteRef","remoteIceCandidatesCache","start","stop","createPeerConnection","canSendOffer","drainRemoteIceCandidatesCache","handleNegotiationNeededEvent","handleICECandidateEvent","handleNewICECandidateMsg","handleICEConnectionStateChangeEvent","handleSignalingStateChangeEvent","handleICEGatheringStateChangeEvent","handleIceCandidateErrorEvent","handleTrackEvent","handleVideoOfferMsg","handleVideoAnswerMsg","reportError","handleGetUserMediaError","stopTracks","disconnectMedia","handleCloseClick","handleToggleCameraClick","handleToggleMicClick","handleRemoteHangup","handleVideoCallAccepted","muteVideo","unmuteVideo","emptyVideoTrack","handleDataChannelEvent","handleDataChannelError","handleDataChannelMessage","handleDataChannelOpen","handleDataChannelClose","stream","getTracks","track","addTrack","removeTrack","fillRect","captureStream","getVideoTracks","onInvite","mediaDevices","getUserMedia","srcObject","ontrack","onremovetrack","onremovestream","onicecandidate","oniceconnectionstatechange","onsignalingstatechange","onicegatheringstatechange","onnegotiationneeded","onicecandidateerror","ondatachannel","close","tracks","send","onmessage","onopen","onclose","iceServers","RTCPeerConnection","createDataChannel","ordered","RTCSessionDescription","setRemoteDescription","createOffer","offer","setLocalDescription","onSendOffer","localDescription","toJSON","onIceCandidate","RTCIceCandidate","addIceCandidate","iceConnectionState","signalingState","streams","dummyVideo","createAnswer","answer","onSendAnswer","onHangup","t","sender","getSenders","find","replaceTrack","readyState","getAudioTracks","audioTracks","videoTracks","audioIcon","videoIcon","peerTitle","pulseAnimation","remoteActive","rstream","icon2","ReceivedMarker","BaseChatMessage","onProgress","handleProgress","handleExpandImage","handlePlayVideo","handleFormButtonClick","formatterContext","onExpandMedia","act","onFormResponse","userIsWriter","immutable","entities","_0","_1","tp","styles","edited","pickReply","editMessage","ratio","sideClass","bubbleClass","fullDisplay","isGroup","getContentType","att","getDownloadUrl","getEntitySize","tree","innerRef","timestamp","IntlChatMessage","forwardRef","onChange","iconName","attrs","Chip","ChipInput","input","focused","handleTextInput","removeChipAt","handleChipCancel","handleFocusGained","handleFocusLost","handleKeyDown","chips","prompt","sortedChips","sortChips","staticMembers","chipIndex","indexChips","index","keep","required","normal","filterFunc","onChipRemoved","onFocusLost","onEnter","avatarDisabled","invalid","autoFocus","tabIndex","noAvatar","ContactAction","handleClick","onAction","Contact","badge_you","badge_owner","showCheckmark","contactNodes","contactsCount","showMode","filter","filterOn","toLowerCase","isChannelTopicName","isGroupTopicName","selected","previewIsResponse","latestMessage","_status","showUnread","showOnline","noScroll","__html","emptyListMessage","UnreadBadge","onSelected","marker","small","clear_messages","clear_for_all","delete","delete_for_all","send_retry","mute","unmute","forward","topic_delete","topic_delete_warning","delete_messages_warning","unblock","topic_block_warning","member_delete","unarchive","clear_messages_warning","handlePageClick","handleEscapeKey","MenuItems","errorHandler","deleteMessages","retryMessage","replyToMessage","topicPermissionSetter","onTopicRemoved","contains","hide","keyCode","hard","cancelSend","delMessagesEdits","flushMessage","menu","hSize","vSize","bounds","right","clickAt","bottom","position","formatPhoneNumber","raw","DEFAULT_MAX_ZOOM","panX","panY","originX","originY","zoom","minZoom","maxZoom","overlay","cutout","boundingBox","imageWidth","imageHeight","mouseX","mouseY","prevDistance","cutoutRect","bBoxRect","initScaling","onZoom","handleZoom","mouseDown","mouseUp","mouseMove","mouseTouch","positionAll","translate","passive","checkBound","currPan","delta","nextDiff","imgRect","imgLeft","imgRight","coLeft","coRight","imgTop","imgBottom","coTop","coBottom","touches","dX","dY","touch0","touch1","distance","sqrt","t3d","orig","transform","transformOrigin","iconFromMime","mimeToIcon","default","handleSendDoc","onSendMessage","onCancelReply","show","onClearError","icons","whiteSpace","handleClose","handleContactSelected","not_found_placeholder","contacts_not_found_short","indexMembers","keepInitialMembers","requiredMember","contactFilter","noContactsMessage","selectedContacts","handleMemberRemoved","handleContactFilter","m","present","keepInitial","stat","sel","splice","doContactFiltering","instance","keys","k","usersOnline","totalCount","countToShow","some","overflow","changed","handleHostNameChange","handleEditingFinished","onServerAddressChange","hostOptions","handleSendImage","assignWidth","maxlength","initialValue","handeTextChange","handleStartEditing","handlePasswordFinished","newValue","focus","checkValidity","onFinished","spanText","spanClass","multiline","element","rows","onKeyDown","onBlur","autoComplete","videoRef","handleButtonAction","isvideo","padding","iconColor","letter","charAt","large","clear","centered","MenuContacts","onNewTopic","MenuStart","date","invalid_id","groupId","prefix","TagManager","handleFieldEdit","handleTagsChanged","handleChannelToggle","joiner","writer","preser","approver","before","skip","compare","modeTitle","compareTitle","getExampleNumber","examples","dcodes","mobile_number_required","codeMap","dc","dialCode","localNumber","placeholderNumber","handleFinished","showCountrySelector","filterNumber","inputField","setCustomValidity","sample","message_sending","message_sending_failed","message_edited_marker","timeStyle","handleSearchChange","handleSearch","handleClear","AudioRecorder","messaging_disabled","type_new_message","add_image_caption","icon_title_record_voice","icon_title_attach_file","icon_title_add_image","icon_title_send","audioRec","audioAvailable","keypressTimestamp","handlePasteEvent","handleAttachImage","handleAttachAudio","handleSend","handleMessageTyping","handleDropAttach","formatReply","messageEditArea","getComputedStyle","getPropertyValue","initMessage","setSelectionRange","onAttachImage","onAttachFile","onAttachAudio","acceptBlank","noInput","shiftKey","onKeyPress","messagePrompt","sendIcon","audioEnabled","attachImage","click","display","tagInput","activated","handleTagInput","handleAddTag","handleRemoveTag","last","tag","maxTagCount","onTagsChanged","minTagLength","maxTagLength","add_tags_prompt","previousOnTags","tnNewTags","handleFullNameUpdate","handleImageUpdated","handlePrivateUpdate","handleDescriptionUpdate","du","onUpdateTags","full_name_placeholder","group_name_placeholder","private_placeholder","title_tag_manager","delete_messages","leave_chat","leave_chat_warning","block_contact","block_contact_warning","report_chat","report_chat_warning","other_user","handleDeleteTopic","handleDeleteMessages","handleLeave","handleBlock","handleReport","onDeleteTopic","onLaunchPermissionsEditor","unrecognized_video_format","handleSendVideo","videoWidth","videoHeight","controlist","autoPlay","inputRef","visible","handleVisibility","activeElement","createRoot","IntlProvider","measurementId","script","async","prepend","dataLayer","gtag","arguments","messageLoader","hl","languages","normalized","baseLanguage","htmlLang","setAttribute","root"],"sourceRoot":""}
\ No newline at end of file
diff --git a/umd/index.prod.js b/umd/index.prod.js
index f00835b8..a7e72745 100644
--- a/umd/index.prod.js
+++ b/umd/index.prod.js
@@ -1,2 +1,2 @@
-(()=>{"use strict";var e,t,s,a,i={8962:(e,t,s)=>{s.d(t,{$_:()=>k,$h:()=>i,EI:()=>P,GQ:()=>S,H2:()=>_,Hm:()=>C,IX:()=>v,JG:()=>o,Mv:()=>r,NW:()=>j,RK:()=>u,Rc:()=>n,S8:()=>D,S9:()=>q,VL:()=>d,Zd:()=>N,Zf:()=>O,cG:()=>h,cl:()=>F,dm:()=>A,gD:()=>I,iC:()=>a,kd:()=>w,l8:()=>c,li:()=>B,ly:()=>T,mc:()=>l,nT:()=>U,o6:()=>f,pM:()=>p,rV:()=>R,rX:()=>L,sA:()=>E,uv:()=>b,vX:()=>x,wO:()=>y,xt:()=>m,yW:()=>M,yl:()=>g});const a="TinodeWeb/"+(s(3119).l||"0.21"),i="AQEAAAABAAD_rAp4DJh05a1HAwFT3A6K",n={hosted:"web.tinode.co",local:"localhost:6060"},r=n.hosted,o=!0,l=3e3,c=1500,d=2,h=96,p=16,u="JRWPS",m="N",g=640,f=13,v=384,b=4096,E=32,y=128,C=24,w=262144,S=1<<23,M=1024,_=64,T=96,k=36,N=48,A=4,D=60,P=360,I=20,R=80,F=30,x=84,U=48,L=2e3,O=6e5,B="mailto:support@tinode.co",j="https://tinode.co/privacy.html",q="https://tinode.co/terms.html"},8405:(e,t,s)=>{s.d(t,{DC:()=>u,EA:()=>l,Id:()=>c,JG:()=>g,Jr:()=>m,PD:()=>n,Y:()=>p,ay:()=>f,rS:()=>r,sT:()=>d,w8:()=>h});const a=["image/jpeg","image/gif","image/png","image/svg","image/svg+xml"],i=["jpg","gif","png","svg","svg"];function n(e){if(e&&"object"==typeof e){if(e.ref)return e.ref;if(e.data&&e.type){return"data:"+(e.type.startsWith("image/")?e.type:"image/"+e.type)+";base64,"+e.data}}return null}function r(e,t,s,a,i){if(t|=0,s|=0,a|=0,(e|=0)<=0||t<=0||s<=0||a<=0)return null;i&&(s=a=Math.min(s,a));const n=Math.min(Math.min(e,s)/e,Math.min(t,a)/t),r={dstWidth:e*n|0,dstHeight:t*n|0};return i?(r.dstWidth=r.dstHeight=Math.min(r.dstWidth,r.dstHeight),r.srcWidth=r.srcHeight=Math.min(e,t),r.xoffset=(e-r.srcWidth)/2|0,r.yoffset=(t-r.srcWidth)/2|0):(r.xoffset=r.yoffset=0,r.srcWidth=e,r.srcHeight=t),r}function o(e,t){const s=a.indexOf(t);if(s<0||!e)return e;const n=i[s],r=e.lastIndexOf(".");return r>=0&&(e=e.substring(0,r)),e+"."+n}function l(e,t,s,i,n){return new Promise(((l,c)=>{const d=new Image;d.crossOrigin="Anonymous",d.onerror=function(e){c(new Error("Image format unrecognized"))},d.onload=async function(){URL.revokeObjectURL(d.src);const h=r(d.width,d.height,t,s,n);if(!h)return void c(new Error("Invalid image"));let p=document.createElement("canvas");p.width=h.dstWidth,p.height=h.dstHeight;let u=p.getContext("2d");u.imageSmoothingEnabled=!0,u.drawImage(d,h.xoffset,h.yoffset,h.srcWidth,h.srcHeight,0,0,h.dstWidth,h.dstHeight);const m=a.includes(e.type)?e.type:"image/jpeg";let g=await new Promise((e=>p.toBlob(e,m)));if(g){for(;i>0&&g.length>i;)h.dstWidth=.70710678118*h.dstWidth|0,h.dstHeight=.70710678118*h.dstHeight|0,p.width=h.dstWidth,p.height=h.dstHeight,u=p.getContext("2d"),u.clearRect(0,0,p.width,p.height),u.drawImage(d,h.xoffset,h.yoffset,h.srcWidth,h.srcHeight,0,0,h.dstWidth,h.dstHeight),g=await new Promise((e=>p.toBlob(e,m)));p=null,l({mime:m,blob:g,width:h.dstWidth,height:h.dstHeight,name:o(e.name,m)})}else c(new Error("Unsupported image format"))},d.src=URL.createObjectURL(e)}))}function c(e,t,s,i,n,r,o){return new Promise(((l,c)=>{const d=new Image;d.crossOrigin="Anonymous",d.onerror=e=>{c(new Error("Image format unrecognized"))},d.onload=t=>{URL.revokeObjectURL(d.src);let h=document.createElement("canvas");h.width=n*o,h.height=r*o;let p=h.getContext("2d");p.imageSmoothingEnabled=!0,p.drawImage(d,s,i,n,r,0,0,h.width,h.height),e=a.includes(e)?e:"image/jpeg",h.toBlob((t=>{h=null,t?l({mime:e,blob:t,width:n,height:r}):c(new Error("Unsupported image format"))}),e)},d.src=t}))}function d(e){return new Promise(((t,s)=>{const a=new FileReader;a.onerror=e=>{s(a.error)},a.onload=s=>{t({mime:e.type,bits:a.result.split(",")[1],name:e.name})},a.readAsDataURL(e)}))}function h(e){return new Promise(((t,s)=>{const a=new FileReader;a.onerror=e=>{s(a.error)},a.onload=s=>{t({mime:e.type,bits:a.result.split(",")[1]})},a.readAsDataURL(e)}))}function p(e,t,s,a){const i=(e.clipboardData||e.originalEvent.clipboardData||{}).items;if(!i||!i.length)return!1;for(let e in i){const n=i[e];if("file"===n.kind){const e=n.getAsFile();if(!e){console.error("Failed to get file object from pasted file item",n.kind,n.type),a("Failed to get file object from pasted file item");continue}return e.type&&"image"==e.type.split("/")[0]?t(e):s(e),!0}}return!1}function u(e){if(e){e=e.replace(/-/g,"+").replace(/_/g,"/");try{e=btoa(atob(e))}catch(t){console.error("Failed to base64 re-encode string.",t),e=null}}return e}function m(e,t){if(!e)return null;try{const s=atob(e),a=s.length,i=new ArrayBuffer(a),n=new Uint8Array(i);for(let e=0;et+=String.fromCharCode(e))),window.btoa(t)}catch(e){}return null}function f(e){const t=[];try{return[...window.atob(e)].forEach((e=>{t.push(e.charCodeAt(0))})),t}catch(e){}return null}},3905:(e,t,s)=>{function a(e,t){t=t||window.navigator.userLanguage||window.navigator.language;const s=new Date;return e.getFullYear()==s.getFullYear()?e.getMonth()==s.getMonth()&&e.getDate()==s.getDate()?e.toLocaleTimeString(t,{hour12:!1,hour:"2-digit",minute:"2-digit"}):e.toLocaleDateString(t,{hour12:!1,month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"}):e.toLocaleDateString(t,{year:"numeric",month:"short",day:"numeric"})}function i(e,t){t=t||window.navigator.userLanguage||window.navigator.language;const s=new Date,a=Math.floor((e.getTime()-6e4*e.getTimezoneOffset())/864e5)-Math.floor((s.getTime()-6e4*s.getTimezoneOffset())/864e5);return Math.abs(a)<2?new Intl.RelativeTimeFormat(t,{numeric:"auto"}).format(a,"day"):new Intl.DateTimeFormat(t).format(e)}function n(e,t){if("number"!=typeof e)return"";let s=(0|Math.floor(e/60))%60,a=0|Math.floor(e/36e3);(t||a>0)&&(s=s<10?`0${s}`:s);let i=(0|e)%60;return i=i<10?`0${i}`:i,0==a?`${s}:${i}`:`${a}:${s}:${i}`}function r(e){if(!e||0==e)return"0 Bytes";const t=["Bytes","KB","MB","GB","TB","PB"],s=Math.min(0|Math.floor(Math.log2(e)/10),t.length-1),a=e/Math.pow(1024,s),i=s>0?a<3?2:a<30?1:0:0;return a.toFixed(i)+" "+t[s]}function o(e,t){return"string"!=typeof e?e:e.length>t?e.slice(0,t/2-1)+"…"+e.slice(1-t/2):e}function l(e,t,s){return(t?"lt-":"dk-")+(s?"fg-":"bg-")+(a=e,Math.abs(function(e){let t=0;e=""+e;for(let s=0;s127397+e.charCodeAt()));return String.fromCodePoint(...t)}s.d(t,{Cj:()=>l,EZ:()=>i,FK:()=>r,TX:()=>o,Yu:()=>c,nH:()=>n,pz:()=>a})},3119:(e,t,s)=>{s.d(t,{l:()=>a});const a="0.21.0-rc2"},4861:(e,t,s)=>{s.d(t,{Z:()=>h});var a=s(7363),i=s.n(a),n=s(916),r=s(3905),o=s(8405);const l="#666C",c=(0,n.defineMessages)({icon_title_play:{id:"icon_title_play",defaultMessage:[{type:0,value:"Play recording"}]}});class d extends i().PureComponent{constructor(e){super(e);let t=(0,o.ay)(this.props.preview);(!Array.isArray(t)||t.length<16)&&(t=null),this.state={canPlay:!1,playing:!1,currentTime:"0:00",duration:this.props.duration>0?(0,r.nH)(this.props.duration/1e3):"-:--",longMin:this.props.duration>=6e5,preview:t},this.initAudio=this.initAudio.bind(this),this.initCanvas=this.initCanvas.bind(this),this.resampleBars=this.resampleBars.bind(this),this.visualize=this.visualize.bind(this),this.handlePlay=this.handlePlay.bind(this),this.handleSeek=this.handleSeek.bind(this),this.handleError=this.handleError.bind(this),this.audioPlayer=null,this.viewBuffer=[],this.canvasRef=i().createRef()}componentDidMount(){this.props.src&&this.initAudio(),this.initCanvas()}componentWillUnmount(){this.audioPlayer&&(this.audioPlayer.oncanplay=null,this.audioPlayer.ontimeupdate=null,this.audioPlayer.onended=null,this.audioPlayer.pause(),this.audioPlayer=null)}componentDidUpdate(e){if(this.props.src!=e.src&&this.initAudio(),this.props.preview!=e.preview){let e=(0,o.ay)(this.props.preview);(!Array.isArray(e)||e.length<16)&&(e=null),this.setState({preview:e},this.initCanvas)}}initAudio(){this.audioPlayer=new Audio(this.props.src),this.audioPlayer.oncanplay=e=>this.setState({canPlay:!0}),this.audioPlayer.ontimeupdate=e=>this.setState({currentTime:(0,r.nH)(this.audioPlayer.currentTime,this.state.longMin)}),this.audioPlayer.onended=e=>{this.audioPlayer.currentTime=0,this.setState({playing:!1,currentTime:(0,r.nH)(0,this.state.longMin)})}}initCanvas(){this.canvasRef.current.width=2*this.canvasRef.current.offsetWidth,this.canvasRef.current.height=2*this.canvasRef.current.offsetHeight,this.canvasContext=this.canvasRef.current.getContext("2d"),this.canvasContext.lineCap="round",this.viewBuffer=this.resampleBars(this.state.preview),this.visualize()}visualize(){if(!this.canvasRef.current)return;const e=this.effectiveWidth,t=this.canvasRef.current.height;this.canvasContext.lineWidth=6;const s=a=>{if(this.canvasRef.current&&this.audioPlayer&&(this.canvasContext.clearRect(0,0,this.canvasRef.current.width,t),this.viewBuffer)){this.state.playing&&window.requestAnimationFrame(s);const a=this.props.duration?Math.max(0,Math.min(1e3*this.audioPlayer.currentTime/this.props.duration,1))*(e-12):-1;this.canvasContext.beginPath(),this.canvasContext.strokeStyle=l;for(let e=0;e.01));const s=e.length/t;let a=[],i=-1;for(let n=0;n0?a.map((e=>e/i)):Array.apply(null,Array(t)).map((e=>.01))}handlePlay(e){e.preventDefault(),this.state.canPlay&&(this.state.playing?(this.audioPlayer.pause(),this.setState({playing:!1})):(this.audioPlayer.play(),this.setState({playing:!0},this.visualize)))}handleError(e){console.error(e)}handleSeek(e){if(e.preventDefault(),e.target&&this.props.duration){const t=e.target.getBoundingClientRect(),s=(e.clientX-t.left)/this.effectiveWidth*2;this.audioPlayer.currentTime=this.props.duration*s/1e3,this.setState({currentTime:(0,r.nH)(this.audioPlayer.currentTime,this.state.longMin)}),this.state.playing||this.visualize()}}render(){const e="material-icons"+(this.props.short?"":" large")+(this.state.canPlay?"":" disabled"),t=i().createElement("a",{href:"#",onClick:this.handlePlay,title:this.props.intl.formatMessage(c.icon_title_play)},i().createElement("i",{className:e},this.state.playing?"pause_circle":this.state.canPlay?"play_circle":"not_interested"));return i().createElement("div",{className:"audio-player"},this.props.short?i().createElement(i().Fragment,null,i().createElement("canvas",{className:"playback",ref:this.canvasRef,onClick:this.handleSeek}),t):i().createElement(i().Fragment,null,t,i().createElement("div",null,i().createElement("canvas",{className:"playback",ref:this.canvasRef,onClick:this.handleSeek}),i().createElement("div",{className:"timer"},this.state.currentTime,"/",this.state.duration))))}}const h=(0,n.injectIntl)(d)},745:(e,t,s)=>{var a=s(1533);t.s=a.createRoot,a.hydrateRoot},7363:e=>{e.exports=React},1533:e=>{e.exports=ReactDOM},916:e=>{e.exports=ReactIntl}},n={};function r(e){var t=n[e];if(void 0!==t)return t.exports;var s=n[e]={exports:{}};return i[e].call(s.exports,s,s.exports,r),s.exports}r.m=i,r.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return r.d(t,{a:t}),t},t=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,r.t=function(s,a){if(1&a&&(s=this(s)),8&a)return s;if("object"==typeof s&&s){if(4&a&&s.__esModule)return s;if(16&a&&"function"==typeof s.then)return s}var i=Object.create(null);r.r(i);var n={};e=e||[null,t({}),t([]),t(t)];for(var o=2&a&&s;"object"==typeof o&&!~e.indexOf(o);o=t(o))Object.getOwnPropertyNames(o).forEach((e=>n[e]=()=>s[e]));return n.default=()=>s,r.d(i,n),i},r.d=(e,t)=>{for(var s in t)r.o(t,s)&&!r.o(e,s)&&Object.defineProperty(e,s,{enumerable:!0,get:t[s]})},r.f={},r.e=e=>Promise.all(Object.keys(r.f).reduce(((t,s)=>(r.f[s](e,t),t)),[])),r.u=e=>e+".prod.js",r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),r.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),s={},a="tinode-webapp:",r.l=(e,t,i,n)=>{if(s[e])s[e].push(t);else{var o,l;if(void 0!==i)for(var c=document.getElementsByTagName("script"),d=0;d{o.onerror=o.onload=null,clearTimeout(u);var i=s[e];if(delete s[e],o.parentNode&&o.parentNode.removeChild(o),i&&i.forEach((e=>e(a))),t)return t(a)},u=setTimeout(p.bind(null,void 0,{type:"timeout",target:o}),12e4);o.onerror=p.bind(null,o.onerror),o.onload=p.bind(null,o.onload),l&&document.head.appendChild(o)}},r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.p="/umd/",(()=>{var e={826:0};r.f.j=(t,s)=>{var a=r.o(e,t)?e[t]:void 0;if(0!==a)if(a)s.push(a[2]);else{var i=new Promise(((s,i)=>a=e[t]=[s,i]));s.push(a[2]=i);var n=r.p+r.u(t),o=new Error;r.l(n,(s=>{if(r.o(e,t)&&(0!==(a=e[t])&&(e[t]=void 0),a)){var i=s&&("load"===s.type?"missing":s.type),n=s&&s.target&&s.target.src;o.message="Loading chunk "+t+" failed.\n("+i+": "+n+")",o.name="ChunkLoadError",o.type=i,o.request=n,a[1](o)}}),"chunk-"+t,t)}};var t=(t,s)=>{var a,i,[n,o,l]=s,c=0;if(n.some((t=>0!==e[t]))){for(a in o)r.o(o,a)&&(r.m[a]=o[a]);if(l)l(r)}for(t&&t(s);c{var e=r(7363),t=r.n(e),s=r(745),a=r(916);const i=function(e){const t=[];let s=0;for(let a=0;a>6|192,t[s++]=63&i|128):55296==(64512&i)&&a+1>18|240,t[s++]=i>>12&63|128,t[s++]=i>>6&63|128,t[s++]=63&i|128):(t[s++]=i>>12|224,t[s++]=i>>6&63|128,t[s++]=63&i|128)}return t},n={byteToCharMap_:null,charToByteMap_:null,byteToCharMapWebSafe_:null,charToByteMapWebSafe_:null,ENCODED_VALS_BASE:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",get ENCODED_VALS(){return this.ENCODED_VALS_BASE+"+/="},get ENCODED_VALS_WEBSAFE(){return this.ENCODED_VALS_BASE+"-_."},HAS_NATIVE_SUPPORT:"function"==typeof atob,encodeByteArray(e,t){if(!Array.isArray(e))throw Error("encodeByteArray takes an array as a parameter");this.init_();const s=t?this.byteToCharMapWebSafe_:this.byteToCharMap_,a=[];for(let t=0;t>2,d=(3&i)<<4|r>>4;let h=(15&r)<<2|l>>6,p=63&l;o||(p=64,n||(h=64)),a.push(s[c],s[d],s[h],s[p])}return a.join("")},encodeString(e,t){return this.HAS_NATIVE_SUPPORT&&!t?btoa(e):this.encodeByteArray(i(e),t)},decodeString(e,t){return this.HAS_NATIVE_SUPPORT&&!t?atob(e):function(e){const t=[];let s=0,a=0;for(;s191&&i<224){const n=e[s++];t[a++]=String.fromCharCode((31&i)<<6|63&n)}else if(i>239&&i<365){const n=((7&i)<<18|(63&e[s++])<<12|(63&e[s++])<<6|63&e[s++])-65536;t[a++]=String.fromCharCode(55296+(n>>10)),t[a++]=String.fromCharCode(56320+(1023&n))}else{const n=e[s++],r=e[s++];t[a++]=String.fromCharCode((15&i)<<12|(63&n)<<6|63&r)}}return t.join("")}(this.decodeStringToByteArray(e,t))},decodeStringToByteArray(e,t){this.init_();const s=t?this.charToByteMapWebSafe_:this.charToByteMap_,a=[];for(let t=0;t>4;if(a.push(l),64!==r){const e=n<<4&240|r>>2;if(a.push(e),64!==o){const e=r<<6&192|o;a.push(e)}}}return a},init_(){if(!this.byteToCharMap_){this.byteToCharMap_={},this.charToByteMap_={},this.byteToCharMapWebSafe_={},this.charToByteMapWebSafe_={};for(let e=0;e=this.ENCODED_VALS_BASE.length&&(this.charToByteMap_[this.ENCODED_VALS_WEBSAFE.charAt(e)]=e,this.charToByteMapWebSafe_[this.ENCODED_VALS.charAt(e)]=e)}}},o=function(e){return function(e){const t=i(e);return n.encodeByteArray(t,!0)}(e).replace(/\./g,"")},l=function(e){try{return n.decodeString(e,!0)}catch(e){console.error("base64Decode failed: ",e)}return null};const c=()=>function(){if("undefined"!=typeof self)return self;if("undefined"!=typeof window)return window;if(void 0!==r.g)return r.g;throw new Error("Unable to locate global object.")}().__FIREBASE_DEFAULTS__,d=()=>{try{return c()||(()=>{if("undefined"==typeof process||void 0===process.env)return;const e=process.env.__FIREBASE_DEFAULTS__;return e?JSON.parse(e):void 0})()||(()=>{if("undefined"==typeof document)return;let e;try{e=document.cookie.match(/__FIREBASE_DEFAULTS__=([^;]+)/)}catch(e){return}const t=e&&l(e[1]);return t&&JSON.parse(t)})()}catch(e){return void console.info(`Unable to get __FIREBASE_DEFAULTS__ due to: ${e}`)}};class h{constructor(){this.reject=()=>{},this.resolve=()=>{},this.promise=new Promise(((e,t)=>{this.resolve=e,this.reject=t}))}wrapCallback(e){return(t,s)=>{t?this.reject(t):this.resolve(s),"function"==typeof e&&(this.promise.catch((()=>{})),1===e.length?e(t):e(t,s))}}}function p(){try{return"object"==typeof indexedDB}catch(e){return!1}}function u(){return new Promise(((e,t)=>{try{let s=!0;const a="validate-browser-context-for-indexeddb-analytics-module",i=self.indexedDB.open(a);i.onsuccess=()=>{i.result.close(),s||self.indexedDB.deleteDatabase(a),e(!0)},i.onupgradeneeded=()=>{s=!1},i.onerror=()=>{var e;t((null===(e=i.error)||void 0===e?void 0:e.message)||"")}}catch(e){t(e)}}))}class m extends Error{constructor(e,t,s){super(t),this.code=e,this.customData=s,this.name="FirebaseError",Object.setPrototypeOf(this,m.prototype),Error.captureStackTrace&&Error.captureStackTrace(this,g.prototype.create)}}class g{constructor(e,t,s){this.service=e,this.serviceName=t,this.errors=s}create(e,...t){const s=t[0]||{},a=`${this.service}/${e}`,i=this.errors[e],n=i?function(e,t){return e.replace(f,((e,s)=>{const a=t[s];return null!=a?String(a):`<${s}?>`}))}(i,s):"Error",r=`${this.serviceName}: ${n} (${a}).`;return new m(a,r,s)}}const f=/\{\$([^}]+)}/g;function v(e,t){if(e===t)return!0;const s=Object.keys(e),a=Object.keys(t);for(const i of s){if(!a.includes(i))return!1;const s=e[i],n=t[i];if(b(s)&&b(n)){if(!v(s,n))return!1}else if(s!==n)return!1}for(const e of a)if(!s.includes(e))return!1;return!0}function b(e){return null!==e&&"object"==typeof e}function E(e){return e&&e._delegate?e._delegate:e}class y{constructor(e,t,s){this.name=e,this.instanceFactory=t,this.type=s,this.multipleInstances=!1,this.serviceProps={},this.instantiationMode="LAZY",this.onInstanceCreated=null}setInstantiationMode(e){return this.instantiationMode=e,this}setMultipleInstances(e){return this.multipleInstances=e,this}setServiceProps(e){return this.serviceProps=e,this}setInstanceCreatedCallback(e){return this.onInstanceCreated=e,this}}const C="[DEFAULT]";class w{constructor(e,t){this.name=e,this.container=t,this.component=null,this.instances=new Map,this.instancesDeferred=new Map,this.instancesOptions=new Map,this.onInitCallbacks=new Map}get(e){const t=this.normalizeInstanceIdentifier(e);if(!this.instancesDeferred.has(t)){const e=new h;if(this.instancesDeferred.set(t,e),this.isInitialized(t)||this.shouldAutoInitialize())try{const s=this.getOrInitializeService({instanceIdentifier:t});s&&e.resolve(s)}catch(e){}}return this.instancesDeferred.get(t).promise}getImmediate(e){var t;const s=this.normalizeInstanceIdentifier(null==e?void 0:e.identifier),a=null!==(t=null==e?void 0:e.optional)&&void 0!==t&&t;if(!this.isInitialized(s)&&!this.shouldAutoInitialize()){if(a)return null;throw Error(`Service ${this.name} is not available`)}try{return this.getOrInitializeService({instanceIdentifier:s})}catch(e){if(a)return null;throw e}}getComponent(){return this.component}setComponent(e){if(e.name!==this.name)throw Error(`Mismatching Component ${e.name} for Provider ${this.name}.`);if(this.component)throw Error(`Component for ${this.name} has already been provided`);if(this.component=e,this.shouldAutoInitialize()){if(function(e){return"EAGER"===e.instantiationMode}(e))try{this.getOrInitializeService({instanceIdentifier:C})}catch(e){}for(const[e,t]of this.instancesDeferred.entries()){const s=this.normalizeInstanceIdentifier(e);try{const e=this.getOrInitializeService({instanceIdentifier:s});t.resolve(e)}catch(e){}}}}clearInstance(e=C){this.instancesDeferred.delete(e),this.instancesOptions.delete(e),this.instances.delete(e)}async delete(){const e=Array.from(this.instances.values());await Promise.all([...e.filter((e=>"INTERNAL"in e)).map((e=>e.INTERNAL.delete())),...e.filter((e=>"_delete"in e)).map((e=>e._delete()))])}isComponentSet(){return null!=this.component}isInitialized(e=C){return this.instances.has(e)}getOptions(e=C){return this.instancesOptions.get(e)||{}}initialize(e={}){const{options:t={}}=e,s=this.normalizeInstanceIdentifier(e.instanceIdentifier);if(this.isInitialized(s))throw Error(`${this.name}(${s}) has already been initialized`);if(!this.isComponentSet())throw Error(`Component ${this.name} has not been registered yet`);const a=this.getOrInitializeService({instanceIdentifier:s,options:t});for(const[e,t]of this.instancesDeferred.entries()){s===this.normalizeInstanceIdentifier(e)&&t.resolve(a)}return a}onInit(e,t){var s;const a=this.normalizeInstanceIdentifier(t),i=null!==(s=this.onInitCallbacks.get(a))&&void 0!==s?s:new Set;i.add(e),this.onInitCallbacks.set(a,i);const n=this.instances.get(a);return n&&e(n,a),()=>{i.delete(e)}}invokeOnInitCallbacks(e,t){const s=this.onInitCallbacks.get(t);if(s)for(const a of s)try{a(e,t)}catch(e){}}getOrInitializeService({instanceIdentifier:e,options:t={}}){let s=this.instances.get(e);if(!s&&this.component&&(s=this.component.instanceFactory(this.container,{instanceIdentifier:(a=e,a===C?void 0:a),options:t}),this.instances.set(e,s),this.instancesOptions.set(e,t),this.invokeOnInitCallbacks(s,e),this.component.onInstanceCreated))try{this.component.onInstanceCreated(this.container,e,s)}catch(e){}var a;return s||null}normalizeInstanceIdentifier(e=C){return this.component?this.component.multipleInstances?e:C:e}shouldAutoInitialize(){return!!this.component&&"EXPLICIT"!==this.component.instantiationMode}}class S{constructor(e){this.name=e,this.providers=new Map}addComponent(e){const t=this.getProvider(e.name);if(t.isComponentSet())throw new Error(`Component ${e.name} has already been registered with ${this.name}`);t.setComponent(e)}addOrOverwriteComponent(e){this.getProvider(e.name).isComponentSet()&&this.providers.delete(e.name),this.addComponent(e)}getProvider(e){if(this.providers.has(e))return this.providers.get(e);const t=new w(e,this);return this.providers.set(e,t),t}getProviders(){return Array.from(this.providers.values())}}const M=[];var _;!function(e){e[e.DEBUG=0]="DEBUG",e[e.VERBOSE=1]="VERBOSE",e[e.INFO=2]="INFO",e[e.WARN=3]="WARN",e[e.ERROR=4]="ERROR",e[e.SILENT=5]="SILENT"}(_||(_={}));const T={debug:_.DEBUG,verbose:_.VERBOSE,info:_.INFO,warn:_.WARN,error:_.ERROR,silent:_.SILENT},k=_.INFO,N={[_.DEBUG]:"log",[_.VERBOSE]:"log",[_.INFO]:"info",[_.WARN]:"warn",[_.ERROR]:"error"},A=(e,t,...s)=>{if(t(e[t]=s,!0),has:(e,t)=>e instanceof IDBTransaction&&("done"===t||"store"===t)||t in e};function O(e){return e!==IDBDatabase.prototype.transaction||"objectStoreNames"in IDBTransaction.prototype?(P||(P=[IDBCursor.prototype.advance,IDBCursor.prototype.continue,IDBCursor.prototype.continuePrimaryKey])).includes(e)?function(...t){return e.apply(q(this),t),j(I.get(this))}:function(...t){return j(e.apply(q(this),t))}:function(t,...s){const a=e.call(q(this),t,...s);return F.set(a,t.sort?t.sort():[t]),j(a)}}function B(e){return"function"==typeof e?O(e):(e instanceof IDBTransaction&&function(e){if(R.has(e))return;const t=new Promise(((t,s)=>{const a=()=>{e.removeEventListener("complete",i),e.removeEventListener("error",n),e.removeEventListener("abort",n)},i=()=>{t(),a()},n=()=>{s(e.error||new DOMException("AbortError","AbortError")),a()};e.addEventListener("complete",i),e.addEventListener("error",n),e.addEventListener("abort",n)}));R.set(e,t)}(e),t=e,(D||(D=[IDBDatabase,IDBObjectStore,IDBIndex,IDBCursor,IDBTransaction])).some((e=>t instanceof e))?new Proxy(e,L):e);var t}function j(e){if(e instanceof IDBRequest)return function(e){const t=new Promise(((t,s)=>{const a=()=>{e.removeEventListener("success",i),e.removeEventListener("error",n)},i=()=>{t(j(e.result)),a()},n=()=>{s(e.error),a()};e.addEventListener("success",i),e.addEventListener("error",n)}));return t.then((t=>{t instanceof IDBCursor&&I.set(t,e)})).catch((()=>{})),U.set(t,e),t}(e);if(x.has(e))return x.get(e);const t=B(e);return t!==e&&(x.set(e,t),U.set(t,e)),t}const q=e=>U.get(e);function V(e,t,{blocked:s,upgrade:a,blocking:i,terminated:n}={}){const r=indexedDB.open(e,t),o=j(r);return a&&r.addEventListener("upgradeneeded",(e=>{a(j(r.result),e.oldVersion,e.newVersion,j(r.transaction))})),s&&r.addEventListener("blocked",(()=>s())),o.then((e=>{n&&e.addEventListener("close",(()=>n())),i&&e.addEventListener("versionchange",(()=>i()))})).catch((()=>{})),o}function H(e,{blocked:t}={}){const s=indexedDB.deleteDatabase(e);return t&&s.addEventListener("blocked",(()=>t())),j(s).then((()=>{}))}const W=["get","getKey","getAll","getAllKeys","count"],z=["put","add","delete","clear"],K=new Map;function G(e,t){if(!(e instanceof IDBDatabase)||t in e||"string"!=typeof t)return;if(K.get(t))return K.get(t);const s=t.replace(/FromIndex$/,""),a=t!==s,i=z.includes(s);if(!(s in(a?IDBIndex:IDBObjectStore).prototype)||!i&&!W.includes(s))return;const n=async function(e,...t){const n=this.transaction(e,i?"readwrite":"readonly");let r=n.store;return a&&(r=r.index(t.shift())),(await Promise.all([r[s](...t),i&&n.done]))[0]};return K.set(t,n),n}L=(e=>({...e,get:(t,s,a)=>G(t,s)||e.get(t,s,a),has:(t,s)=>!!G(t,s)||e.has(t,s)}))(L);class ${constructor(e){this.container=e}getPlatformInfoString(){return this.container.getProviders().map((e=>{if(function(e){const t=e.getComponent();return"VERSION"===(null==t?void 0:t.type)}(e)){const t=e.getImmediate();return`${t.library}/${t.version}`}return null})).filter((e=>e)).join(" ")}}const Q="@firebase/app",X="0.9.1",Y=new class{constructor(e){this.name=e,this._logLevel=k,this._logHandler=A,this._userLogHandler=null,M.push(this)}get logLevel(){return this._logLevel}set logLevel(e){if(!(e in _))throw new TypeError(`Invalid value "${e}" assigned to \`logLevel\``);this._logLevel=e}setLogLevel(e){this._logLevel="string"==typeof e?T[e]:e}get logHandler(){return this._logHandler}set logHandler(e){if("function"!=typeof e)throw new TypeError("Value assigned to `logHandler` must be a function");this._logHandler=e}get userLogHandler(){return this._userLogHandler}set userLogHandler(e){this._userLogHandler=e}debug(...e){this._userLogHandler&&this._userLogHandler(this,_.DEBUG,...e),this._logHandler(this,_.DEBUG,...e)}log(...e){this._userLogHandler&&this._userLogHandler(this,_.VERBOSE,...e),this._logHandler(this,_.VERBOSE,...e)}info(...e){this._userLogHandler&&this._userLogHandler(this,_.INFO,...e),this._logHandler(this,_.INFO,...e)}warn(...e){this._userLogHandler&&this._userLogHandler(this,_.WARN,...e),this._logHandler(this,_.WARN,...e)}error(...e){this._userLogHandler&&this._userLogHandler(this,_.ERROR,...e),this._logHandler(this,_.ERROR,...e)}}("@firebase/app"),J="[DEFAULT]",Z={[Q]:"fire-core","@firebase/app-compat":"fire-core-compat","@firebase/analytics":"fire-analytics","@firebase/analytics-compat":"fire-analytics-compat","@firebase/app-check":"fire-app-check","@firebase/app-check-compat":"fire-app-check-compat","@firebase/auth":"fire-auth","@firebase/auth-compat":"fire-auth-compat","@firebase/database":"fire-rtdb","@firebase/database-compat":"fire-rtdb-compat","@firebase/functions":"fire-fn","@firebase/functions-compat":"fire-fn-compat","@firebase/installations":"fire-iid","@firebase/installations-compat":"fire-iid-compat","@firebase/messaging":"fire-fcm","@firebase/messaging-compat":"fire-fcm-compat","@firebase/performance":"fire-perf","@firebase/performance-compat":"fire-perf-compat","@firebase/remote-config":"fire-rc","@firebase/remote-config-compat":"fire-rc-compat","@firebase/storage":"fire-gcs","@firebase/storage-compat":"fire-gcs-compat","@firebase/firestore":"fire-fst","@firebase/firestore-compat":"fire-fst-compat","fire-js":"fire-js",firebase:"fire-js-all"},ee=new Map,te=new Map;function se(e,t){try{e.container.addComponent(t)}catch(s){Y.debug(`Component ${t.name} failed to register with FirebaseApp ${e.name}`,s)}}function ae(e){const t=e.name;if(te.has(t))return Y.debug(`There were multiple attempts to register component ${t}.`),!1;te.set(t,e);for(const t of ee.values())se(t,e);return!0}function ie(e,t){const s=e.container.getProvider("heartbeat").getImmediate({optional:!0});return s&&s.triggerHeartbeat(),e.container.getProvider(t)}const ne=new g("app","Firebase",{"no-app":"No Firebase App '{$appName}' has been created - call Firebase App.initializeApp()","bad-app-name":"Illegal App name: '{$appName}","duplicate-app":"Firebase App named '{$appName}' already exists with different options or config","app-deleted":"Firebase App named '{$appName}' already deleted","no-options":"Need to provide options, when not being deployed to hosting via source.","invalid-app-argument":"firebase.{$appName}() takes either no argument or a Firebase App instance.","invalid-log-argument":"First argument to `onLog` must be null or a function.","idb-open":"Error thrown when opening IndexedDB. Original error: {$originalErrorMessage}.","idb-get":"Error thrown when reading from IndexedDB. Original error: {$originalErrorMessage}.","idb-set":"Error thrown when writing to IndexedDB. Original error: {$originalErrorMessage}.","idb-delete":"Error thrown when deleting from IndexedDB. Original error: {$originalErrorMessage}."});class re{constructor(e,t,s){this._isDeleted=!1,this._options=Object.assign({},e),this._config=Object.assign({},t),this._name=t.name,this._automaticDataCollectionEnabled=t.automaticDataCollectionEnabled,this._container=s,this.container.addComponent(new y("app",(()=>this),"PUBLIC"))}get automaticDataCollectionEnabled(){return this.checkDestroyed(),this._automaticDataCollectionEnabled}set automaticDataCollectionEnabled(e){this.checkDestroyed(),this._automaticDataCollectionEnabled=e}get name(){return this.checkDestroyed(),this._name}get options(){return this.checkDestroyed(),this._options}get config(){return this.checkDestroyed(),this._config}get container(){return this._container}get isDeleted(){return this._isDeleted}set isDeleted(e){this._isDeleted=e}checkDestroyed(){if(this.isDeleted)throw ne.create("app-deleted",{appName:this._name})}}function oe(e,t={}){let s=e;if("object"!=typeof t){t={name:t}}const a=Object.assign({name:J,automaticDataCollectionEnabled:!1},t),i=a.name;if("string"!=typeof i||!i)throw ne.create("bad-app-name",{appName:String(i)});var n;if(s||(s=null===(n=d())||void 0===n?void 0:n.config),!s)throw ne.create("no-options");const r=ee.get(i);if(r){if(v(s,r.options)&&v(a,r.config))return r;throw ne.create("duplicate-app",{appName:i})}const o=new S(i);for(const e of te.values())o.addComponent(e);const l=new re(s,a,o);return ee.set(i,l),l}function le(e,t,s){var a;let i=null!==(a=Z[e])&&void 0!==a?a:e;s&&(i+=`-${s}`);const n=i.match(/\s|\//),r=t.match(/\s|\//);if(n||r){const e=[`Unable to register library "${i}" with version "${t}":`];return n&&e.push(`library name "${i}" contains illegal characters (whitespace or "/")`),n&&r&&e.push("and"),r&&e.push(`version name "${t}" contains illegal characters (whitespace or "/")`),void Y.warn(e.join(" "))}ae(new y(`${i}-version`,(()=>({library:i,version:t})),"VERSION"))}const ce="firebase-heartbeat-store";let de=null;function he(){return de||(de=V("firebase-heartbeat-database",1,{upgrade:(e,t)=>{if(0===t)e.createObjectStore(ce)}}).catch((e=>{throw ne.create("idb-open",{originalErrorMessage:e.message})}))),de}async function pe(e,t){try{const s=(await he()).transaction(ce,"readwrite"),a=s.objectStore(ce);return await a.put(t,ue(e)),s.done}catch(e){if(e instanceof m)Y.warn(e.message);else{const t=ne.create("idb-set",{originalErrorMessage:null==e?void 0:e.message});Y.warn(t.message)}}}function ue(e){return`${e.name}!${e.options.appId}`}class me{constructor(e){this.container=e,this._heartbeatsCache=null;const t=this.container.getProvider("app").getImmediate();this._storage=new fe(t),this._heartbeatsCachePromise=this._storage.read().then((e=>(this._heartbeatsCache=e,e)))}async triggerHeartbeat(){const e=this.container.getProvider("platform-logger").getImmediate().getPlatformInfoString(),t=ge();if(null===this._heartbeatsCache&&(this._heartbeatsCache=await this._heartbeatsCachePromise),this._heartbeatsCache.lastSentHeartbeatDate!==t&&!this._heartbeatsCache.heartbeats.some((e=>e.date===t)))return this._heartbeatsCache.heartbeats.push({date:t,agent:e}),this._heartbeatsCache.heartbeats=this._heartbeatsCache.heartbeats.filter((e=>{const t=new Date(e.date).valueOf();return Date.now()-t<=2592e6})),this._storage.overwrite(this._heartbeatsCache)}async getHeartbeatsHeader(){if(null===this._heartbeatsCache&&await this._heartbeatsCachePromise,null===this._heartbeatsCache||0===this._heartbeatsCache.heartbeats.length)return"";const e=ge(),{heartbeatsToSend:t,unsentEntries:s}=function(e,t=1024){const s=[];let a=e.slice();for(const i of e){const e=s.find((e=>e.agent===i.agent));if(e){if(e.dates.push(i.date),ve(s)>t){e.dates.pop();break}}else if(s.push({agent:i.agent,dates:[i.date]}),ve(s)>t){s.pop();break}a=a.slice(1)}return{heartbeatsToSend:s,unsentEntries:a}}(this._heartbeatsCache.heartbeats),a=o(JSON.stringify({version:2,heartbeats:t}));return this._heartbeatsCache.lastSentHeartbeatDate=e,s.length>0?(this._heartbeatsCache.heartbeats=s,await this._storage.overwrite(this._heartbeatsCache)):(this._heartbeatsCache.heartbeats=[],this._storage.overwrite(this._heartbeatsCache)),a}}function ge(){return(new Date).toISOString().substring(0,10)}class fe{constructor(e){this.app=e,this._canUseIndexedDBPromise=this.runIndexedDBEnvironmentCheck()}async runIndexedDBEnvironmentCheck(){return!!p()&&u().then((()=>!0)).catch((()=>!1))}async read(){if(await this._canUseIndexedDBPromise){return await async function(e){try{return(await he()).transaction(ce).objectStore(ce).get(ue(e))}catch(e){if(e instanceof m)Y.warn(e.message);else{const t=ne.create("idb-get",{originalErrorMessage:null==e?void 0:e.message});Y.warn(t.message)}}}(this.app)||{heartbeats:[]}}return{heartbeats:[]}}async overwrite(e){var t;if(await this._canUseIndexedDBPromise){const s=await this.read();return pe(this.app,{lastSentHeartbeatDate:null!==(t=e.lastSentHeartbeatDate)&&void 0!==t?t:s.lastSentHeartbeatDate,heartbeats:e.heartbeats})}}async add(e){var t;if(await this._canUseIndexedDBPromise){const s=await this.read();return pe(this.app,{lastSentHeartbeatDate:null!==(t=e.lastSentHeartbeatDate)&&void 0!==t?t:s.lastSentHeartbeatDate,heartbeats:[...s.heartbeats,...e.heartbeats]})}}}function ve(e){return o(JSON.stringify({version:2,heartbeats:e})).length}var be;be="",ae(new y("platform-logger",(e=>new $(e)),"PRIVATE")),ae(new y("heartbeat",(e=>new me(e)),"PRIVATE")),le(Q,X,be),le(Q,X,"esm2017"),le("fire-js","");le("firebase","9.16.0","app");const Ee="@firebase/installations",ye="0.6.1",Ce=1e4,we=`w:${ye}`,Se="FIS_v2",Me=36e5,_e=new g("installations","Installations",{"missing-app-config-values":'Missing App configuration value: "{$valueName}"',"not-registered":"Firebase Installation is not registered.","installation-not-found":"Firebase Installation not found.","request-failed":'{$requestName} request failed with error "{$serverCode} {$serverStatus}: {$serverMessage}"',"app-offline":"Could not process request. Application offline.","delete-pending-registration":"Can't delete installation while there is a pending registration request."});function Te(e){return e instanceof m&&e.code.includes("request-failed")}function ke({projectId:e}){return`https://firebaseinstallations.googleapis.com/v1/projects/${e}/installations`}function Ne(e){return{token:e.token,requestStatus:2,expiresIn:(t=e.expiresIn,Number(t.replace("s","000"))),creationTime:Date.now()};var t}async function Ae(e,t){const s=(await t.json()).error;return _e.create("request-failed",{requestName:e,serverCode:s.code,serverMessage:s.message,serverStatus:s.status})}function De({apiKey:e}){return new Headers({"Content-Type":"application/json",Accept:"application/json","x-goog-api-key":e})}function Pe(e,{refreshToken:t}){const s=De(e);return s.append("Authorization",function(e){return`${Se} ${e}`}(t)),s}async function Ie(e){const t=await e();return t.status>=500&&t.status<600?e():t}function Re(e){return new Promise((t=>{setTimeout(t,e)}))}const Fe=/^[cdef][\w-]{21}$/;function xe(){try{const e=new Uint8Array(17);(self.crypto||self.msCrypto).getRandomValues(e),e[0]=112+e[0]%16;const t=function(e){const t=(s=e,btoa(String.fromCharCode(...s)).replace(/\+/g,"-").replace(/\//g,"_"));var s;return t.substr(0,22)}(e);return Fe.test(t)?t:""}catch(e){return""}}function Ue(e){return`${e.appName}!${e.appId}`}const Le=new Map;function Oe(e,t){const s=Ue(e);Be(s,t),function(e,t){const s=qe();s&&s.postMessage({key:e,fid:t});Ve()}(s,t)}function Be(e,t){const s=Le.get(e);if(s)for(const e of s)e(t)}let je=null;function qe(){return!je&&"BroadcastChannel"in self&&(je=new BroadcastChannel("[Firebase] FID Change"),je.onmessage=e=>{Be(e.data.key,e.data.fid)}),je}function Ve(){0===Le.size&&je&&(je.close(),je=null)}const He="firebase-installations-store";let We=null;function ze(){return We||(We=V("firebase-installations-database",1,{upgrade:(e,t)=>{if(0===t)e.createObjectStore(He)}})),We}async function Ke(e,t){const s=Ue(e),a=(await ze()).transaction(He,"readwrite"),i=a.objectStore(He),n=await i.get(s);return await i.put(t,s),await a.done,n&&n.fid===t.fid||Oe(e,t.fid),t}async function Ge(e){const t=Ue(e),s=(await ze()).transaction(He,"readwrite");await s.objectStore(He).delete(t),await s.done}async function $e(e,t){const s=Ue(e),a=(await ze()).transaction(He,"readwrite"),i=a.objectStore(He),n=await i.get(s),r=t(n);return void 0===r?await i.delete(s):await i.put(r,s),await a.done,!r||n&&n.fid===r.fid||Oe(e,r.fid),r}async function Qe(e){let t;const s=await $e(e.appConfig,(s=>{const a=function(e){const t=e||{fid:xe(),registrationStatus:0};return Je(t)}(s),i=function(e,t){if(0===t.registrationStatus){if(!navigator.onLine){return{installationEntry:t,registrationPromise:Promise.reject(_e.create("app-offline"))}}const s={fid:t.fid,registrationStatus:1,registrationTime:Date.now()},a=async function(e,t){try{const s=await async function({appConfig:e,heartbeatServiceProvider:t},{fid:s}){const a=ke(e),i=De(e),n=t.getImmediate({optional:!0});if(n){const e=await n.getHeartbeatsHeader();e&&i.append("x-firebase-client",e)}const r={fid:s,authVersion:Se,appId:e.appId,sdkVersion:we},o={method:"POST",headers:i,body:JSON.stringify(r)},l=await Ie((()=>fetch(a,o)));if(l.ok){const e=await l.json();return{fid:e.fid||s,registrationStatus:2,refreshToken:e.refreshToken,authToken:Ne(e.authToken)}}throw await Ae("Create Installation",l)}(e,t);return Ke(e.appConfig,s)}catch(s){throw Te(s)&&409===s.customData.serverCode?await Ge(e.appConfig):await Ke(e.appConfig,{fid:t.fid,registrationStatus:0}),s}}(e,s);return{installationEntry:s,registrationPromise:a}}return 1===t.registrationStatus?{installationEntry:t,registrationPromise:Xe(e)}:{installationEntry:t}}(e,a);return t=i.registrationPromise,i.installationEntry}));return""===s.fid?{installationEntry:await t}:{installationEntry:s,registrationPromise:t}}async function Xe(e){let t=await Ye(e.appConfig);for(;1===t.registrationStatus;)await Re(100),t=await Ye(e.appConfig);if(0===t.registrationStatus){const{installationEntry:t,registrationPromise:s}=await Qe(e);return s||t}return t}function Ye(e){return $e(e,(e=>{if(!e)throw _e.create("installation-not-found");return Je(e)}))}function Je(e){return 1===(t=e).registrationStatus&&t.registrationTime+Cefetch(a,o)));if(l.ok){return Ne(await l.json())}throw await Ae("Generate Auth Token",l)}async function et(e,t=!1){let s;const a=await $e(e.appConfig,(a=>{if(!st(a))throw _e.create("not-registered");const i=a.authToken;if(!t&&function(e){return 2===e.requestStatus&&!function(e){const t=Date.now();return t{if(!st(e))throw _e.create("not-registered");const t=e.authToken;return 1===(s=t).requestStatus&&s.requestTime+Ce{const t=ie(e.getProvider("app").getImmediate(),nt).getImmediate();return{getId:()=>async function(e){const t=e,{installationEntry:s,registrationPromise:a}=await Qe(t);return a?a.catch(console.error):et(t).catch(console.error),s.fid}(t),getToken:e=>at(t,e)}};ae(new y(nt,(e=>{const t=e.getProvider("app").getImmediate(),s=function(e){if(!e||!e.options)throw it("App Configuration");if(!e.name)throw it("App Name");const t=["projectId","apiKey","appId"];for(const s of t)if(!e.options[s])throw it(s);return{appName:e.name,projectId:e.options.projectId,apiKey:e.options.apiKey,appId:e.options.appId}}(t);return{app:t,appConfig:s,heartbeatServiceProvider:ie(t,"heartbeat"),_delete:()=>Promise.resolve()}}),"PUBLIC")),ae(new y("installations-internal",rt,"PRIVATE")),le(Ee,ye),le(Ee,ye,"esm2017");const ot="BDOU99-h67HcA6JeFXHbSNMu7e2yNNu3RzoMj8TM4W88jITfq7ZmPvIM1Iv-4_l2LxQcYwhqby2xGpWwzjfAnG4",lt="google.c.a.c_id";var ct,dt;function ht(e){const t=new Uint8Array(e);return btoa(String.fromCharCode(...t)).replace(/=/g,"").replace(/\+/g,"-").replace(/\//g,"_")}function pt(e){const t=(e+"=".repeat((4-e.length%4)%4)).replace(/\-/g,"+").replace(/_/g,"/"),s=atob(t),a=new Uint8Array(s.length);for(let e=0;e{if(0===t)e.createObjectStore(gt)}})),ft}async function bt(e){const t=yt(e),s=await vt(),a=await s.transaction(gt).objectStore(gt).get(t);if(a)return a;{const t=await async function(e){if("databases"in indexedDB){const e=(await indexedDB.databases()).map((e=>e.name));if(!e.includes(ut))return null}let t=null;return(await V(ut,5,{upgrade:async(s,a,i,n)=>{var r;if(a<2)return;if(!s.objectStoreNames.contains(mt))return;const o=n.objectStore(mt),l=await o.index("fcmSenderId").get(e);if(await o.clear(),l)if(2===a){const e=l;if(!e.auth||!e.p256dh||!e.endpoint)return;t={token:e.fcmToken,createTime:null!==(r=e.createTime)&&void 0!==r?r:Date.now(),subscriptionOptions:{auth:e.auth,p256dh:e.p256dh,endpoint:e.endpoint,swScope:e.swScope,vapidKey:"string"==typeof e.vapidKey?e.vapidKey:ht(e.vapidKey)}}}else if(3===a){const e=l;t={token:e.fcmToken,createTime:e.createTime,subscriptionOptions:{auth:ht(e.auth),p256dh:ht(e.p256dh),endpoint:e.endpoint,swScope:e.swScope,vapidKey:ht(e.vapidKey)}}}else if(4===a){const e=l;t={token:e.fcmToken,createTime:e.createTime,subscriptionOptions:{auth:ht(e.auth),p256dh:ht(e.p256dh),endpoint:e.endpoint,swScope:e.swScope,vapidKey:ht(e.vapidKey)}}}}})).close(),await H(ut),await H("fcm_vapid_details_db"),await H("undefined"),function(e){if(!e||!e.subscriptionOptions)return!1;const{subscriptionOptions:t}=e;return"number"==typeof e.createTime&&e.createTime>0&&"string"==typeof e.token&&e.token.length>0&&"string"==typeof t.auth&&t.auth.length>0&&"string"==typeof t.p256dh&&t.p256dh.length>0&&"string"==typeof t.endpoint&&t.endpoint.length>0&&"string"==typeof t.swScope&&t.swScope.length>0&&"string"==typeof t.vapidKey&&t.vapidKey.length>0}(t)?t:null}(e.appConfig.senderId);if(t)return await Et(e,t),t}}async function Et(e,t){const s=yt(e),a=(await vt()).transaction(gt,"readwrite");return await a.objectStore(gt).put(t,s),await a.done,t}function yt({appConfig:e}){return e.appId}const Ct=new g("messaging","Messaging",{"missing-app-config-values":'Missing App configuration value: "{$valueName}"',"only-available-in-window":"This method is available in a Window context.","only-available-in-sw":"This method is available in a service worker context.","permission-default":"The notification permission was not granted and dismissed instead.","permission-blocked":"The notification permission was not granted and blocked instead.","unsupported-browser":"This browser doesn't support the API's required to use the Firebase SDK.","indexed-db-unsupported":"This browser doesn't support indexedDb.open() (ex. Safari iFrame, Firefox Private Browsing, etc)","failed-service-worker-registration":"We are unable to register the default service worker. {$browserErrorMessage}","token-subscribe-failed":"A problem occurred while subscribing the user to FCM: {$errorInfo}","token-subscribe-no-token":"FCM returned no token when subscribing the user to push.","token-unsubscribe-failed":"A problem occurred while unsubscribing the user from FCM: {$errorInfo}","token-update-failed":"A problem occurred while updating the user from FCM: {$errorInfo}","token-update-no-token":"FCM returned no token when updating the user to push.","use-sw-after-get-token":"The useServiceWorker() method may only be called once and must be called before calling getToken() to ensure your service worker is used.","invalid-sw-registration":"The input to useServiceWorker() must be a ServiceWorkerRegistration.","invalid-bg-handler":"The input to setBackgroundMessageHandler() must be a function.","invalid-vapid-key":"The public VAPID key must be a string.","use-vapid-key-after-get-token":"The usePublicVapidKey() method may only be called once and must be called before calling getToken() to ensure your VAPID key is used."});async function wt(e,t){const s={method:"DELETE",headers:await Mt(e)};try{const a=await fetch(`${St(e.appConfig)}/${t}`,s),i=await a.json();if(i.error){const e=i.error.message;throw Ct.create("token-unsubscribe-failed",{errorInfo:e})}}catch(e){throw Ct.create("token-unsubscribe-failed",{errorInfo:null==e?void 0:e.toString()})}}function St({projectId:e}){return`https://fcmregistrations.googleapis.com/v1/projects/${e}/registrations`}async function Mt({appConfig:e,installations:t}){const s=await t.getToken();return new Headers({"Content-Type":"application/json",Accept:"application/json","x-goog-api-key":e.apiKey,"x-goog-firebase-installations-auth":`FIS ${s}`})}function _t({p256dh:e,auth:t,endpoint:s,vapidKey:a}){const i={web:{endpoint:s,auth:t,p256dh:e}};return a!==ot&&(i.web.applicationPubKey=a),i}async function Tt(e){const t=await async function(e,t){const s=await e.pushManager.getSubscription();if(s)return s;return e.pushManager.subscribe({userVisibleOnly:!0,applicationServerKey:pt(t)})}(e.swRegistration,e.vapidKey),s={vapidKey:e.vapidKey,swScope:e.swRegistration.scope,endpoint:t.endpoint,auth:ht(t.getKey("auth")),p256dh:ht(t.getKey("p256dh"))},a=await bt(e.firebaseDependencies);if(a){if(function(e,t){const s=t.vapidKey===e.vapidKey,a=t.endpoint===e.endpoint,i=t.auth===e.auth,n=t.p256dh===e.p256dh;return s&&a&&i&&n}(a.subscriptionOptions,s))return Date.now()>=a.createTime+6048e5?async function(e,t){try{const s=await async function(e,t){const s=await Mt(e),a=_t(t.subscriptionOptions),i={method:"PATCH",headers:s,body:JSON.stringify(a)};let n;try{const s=await fetch(`${St(e.appConfig)}/${t.token}`,i);n=await s.json()}catch(e){throw Ct.create("token-update-failed",{errorInfo:null==e?void 0:e.toString()})}if(n.error){const e=n.error.message;throw Ct.create("token-update-failed",{errorInfo:e})}if(!n.token)throw Ct.create("token-update-no-token");return n.token}(e.firebaseDependencies,t),a=Object.assign(Object.assign({},t),{token:s,createTime:Date.now()});return await Et(e.firebaseDependencies,a),s}catch(t){throw await kt(e),t}}(e,{token:a.token,createTime:Date.now(),subscriptionOptions:s}):a.token;try{await wt(e.firebaseDependencies,a.token)}catch(e){console.warn(e)}return Nt(e.firebaseDependencies,s)}return Nt(e.firebaseDependencies,s)}async function kt(e){const t=await bt(e.firebaseDependencies);t&&(await wt(e.firebaseDependencies,t.token),await async function(e){const t=yt(e),s=(await vt()).transaction(gt,"readwrite");await s.objectStore(gt).delete(t),await s.done}(e.firebaseDependencies));const s=await e.swRegistration.pushManager.getSubscription();return!s||s.unsubscribe()}async function Nt(e,t){const s=await async function(e,t){const s=await Mt(e),a=_t(t),i={method:"POST",headers:s,body:JSON.stringify(a)};let n;try{const t=await fetch(St(e.appConfig),i);n=await t.json()}catch(e){throw Ct.create("token-subscribe-failed",{errorInfo:null==e?void 0:e.toString()})}if(n.error){const e=n.error.message;throw Ct.create("token-subscribe-failed",{errorInfo:e})}if(!n.token)throw Ct.create("token-subscribe-no-token");return n.token}(e,t),a={token:s,createTime:Date.now(),subscriptionOptions:t};return await Et(e,a),a.token}function At(e){const t={from:e.from,collapseKey:e.collapse_key,messageId:e.fcmMessageId};return function(e,t){if(!t.notification)return;e.notification={};const s=t.notification.title;s&&(e.notification.title=s);const a=t.notification.body;a&&(e.notification.body=a);const i=t.notification.image;i&&(e.notification.image=i);const n=t.notification.icon;n&&(e.notification.icon=n)}(t,e),function(e,t){if(!t.data)return;e.data=t.data}(t,e),function(e,t){var s,a,i,n,r;if(!t.fcmOptions&&!(null===(s=t.notification)||void 0===s?void 0:s.click_action))return;e.fcmOptions={};const o=null!==(i=null===(a=t.fcmOptions)||void 0===a?void 0:a.link)&&void 0!==i?i:null===(n=t.notification)||void 0===n?void 0:n.click_action;o&&(e.fcmOptions.link=o);const l=null===(r=t.fcmOptions)||void 0===r?void 0:r.analytics_label;l&&(e.fcmOptions.analyticsLabel=l)}(t,e),t}function Dt(e,t){const s=[];for(let a=0;a{}))}catch(e){throw Ct.create("failed-service-worker-registration",{browserErrorMessage:null==e?void 0:e.message})}}async function Ft(e,t){if(!navigator)throw Ct.create("only-available-in-window");if("default"===Notification.permission&&await Notification.requestPermission(),"granted"!==Notification.permission)throw Ct.create("permission-blocked");return await async function(e,t){t?e.vapidKey=t:e.vapidKey||(e.vapidKey=ot)}(e,null==t?void 0:t.vapidKey),await async function(e,t){if(t||e.swRegistration||await Rt(e),t||!e.swRegistration){if(!(t instanceof ServiceWorkerRegistration))throw Ct.create("invalid-sw-registration");e.swRegistration=t}}(e,null==t?void 0:t.serviceWorkerRegistration),Tt(e)}async function xt(e,t,s){const a=function(e){switch(e){case dt.NOTIFICATION_CLICKED:return"notification_open";case dt.PUSH_RECEIVED:return"notification_foreground";default:throw new Error}}(t);(await e.firebaseDependencies.analyticsProvider.get()).logEvent(a,{message_id:s[lt],message_name:s["google.c.a.c_l"],message_time:s["google.c.a.ts"],message_device_time:Math.floor(Date.now()/1e3)})}async function Ut(e,t){const s=t.data;if(!s.isFirebaseMessaging)return;e.onMessageHandler&&s.messageType===dt.PUSH_RECEIVED&&("function"==typeof e.onMessageHandler?e.onMessageHandler(At(s)):e.onMessageHandler.next(At(s)));const a=s.data;var i;"object"==typeof(i=a)&&i&< in i&&"1"===a["google.c.a.e"]&&await xt(e,s.messageType,a)}const Lt="@firebase/messaging",Ot="0.12.1",Bt=e=>{const t=e.getProvider("messaging").getImmediate();return{getToken:e=>Ft(t,e)}};async function jt(){try{await u()}catch(e){return!1}return"undefined"!=typeof window&&p()&&!("undefined"==typeof navigator||!navigator.cookieEnabled)&&"serviceWorker"in navigator&&"PushManager"in window&&"Notification"in window&&"fetch"in window&&ServiceWorkerRegistration.prototype.hasOwnProperty("showNotification")&&PushSubscription.prototype.hasOwnProperty("getKey")}function qt(e=function(e=J){const t=ee.get(e);if(!t&&e===J)return oe();if(!t)throw ne.create("no-app",{appName:e});return t}()){return jt().then((e=>{if(!e)throw Ct.create("unsupported-browser")}),(e=>{throw Ct.create("indexed-db-unsupported")})),ie(E(e),"messaging").getImmediate()}async function Vt(e,t){return Ft(e=E(e),t)}function Ht(e){return async function(e){if(!navigator)throw Ct.create("only-available-in-window");return e.swRegistration||await Rt(e),kt(e)}(e=E(e))}function Wt(e,t){return function(e,t){if(!navigator)throw Ct.create("only-available-in-window");return e.onMessageHandler=t,()=>{e.onMessageHandler=null}}(e=E(e),t)}ae(new y("messaging",(e=>{const t=new It(e.getProvider("app").getImmediate(),e.getProvider("installations-internal").getImmediate(),e.getProvider("analytics-internal"));return navigator.serviceWorker.addEventListener("message",(e=>Ut(t,e))),t}),"PUBLIC")),ae(new y("messaging-internal",Bt,"PRIVATE")),le(Lt,Ot),le(Lt,Ot,"esm2017");const zt=Tinode;class Kt extends t().PureComponent{render(){return t().createElement("div",{className:"alert-container"},t().createElement("div",{className:"alert"},t().createElement("div",{className:"title"},this.props.title),t().createElement("div",{className:"content"},this.props.content),t().createElement("div",{className:"dialog-buttons"},this.props.onReject?t().createElement("button",{className:"outline",onClick:this.props.onReject},this.props.reject||t().createElement(a.FormattedMessage,{id:"button_cancel",defaultMessage:[{type:0,value:"Cancel"}]})):null,this.props.onConfirm?t().createElement("button",{className:"primary",onClick:this.props.onConfirm},this.props.confirm||t().createElement(a.FormattedMessage,{id:"button_ok",defaultMessage:[{type:0,value:"OK"}]})):null)))}}var Gt=r(8962);const $t=(0,a.defineMessages)({info:{id:"menu_item_info",defaultMessage:[{type:0,value:"Info"}]},clear_messages:{id:"menu_item_clear_messages",defaultMessage:[{type:0,value:"Clear messages"}]},clear_for_all:{id:"menu_item_clear_messages_for_all",defaultMessage:[{type:0,value:"Clear for All"}]},delete:{id:"menu_item_delete",defaultMessage:[{type:0,value:"Delete"}]},delete_for_all:{id:"menu_item_delete_for_all",defaultMessage:[{type:0,value:"Delete for All"}]},send_retry:{id:"menu_item_send_retry",defaultMessage:[{type:0,value:"Retry"}]},mute:{id:"menu_item_mute",defaultMessage:[{type:0,value:"Mute"}]},unmute:{id:"menu_item_unmute",defaultMessage:[{type:0,value:"Unmute"}]},reply:{id:"menu_item_reply",defaultMessage:[{type:0,value:"Reply"}]},forward:{id:"menu_item_forward",defaultMessage:[{type:0,value:"Forward"}]},edit:{id:"menu_item_edit",defaultMessage:[{type:0,value:"Edit"}]},topic_delete:{id:"menu_item_delete_topic",defaultMessage:[{type:0,value:"Delete"}]},topic_delete_warning:{id:"topic_delete_warning",defaultMessage:[{type:0,value:"Are you sure you want to delete this conversation? It cannot be undone."}]},delete_messages_warning:{id:"delete_messages_warning",defaultMessage:[{type:0,value:"Are you sure you want to delete all messages for everyone? It cannot be undone."}]},unblock:{id:"menu_item_unblock",defaultMessage:[{type:0,value:"Unblock"}]},block:{id:"menu_item_block",defaultMessage:[{type:0,value:"Block"}]},topic_block_warning:{id:"topic_block_warning",defaultMessage:[{type:0,value:"Are you sure you want to block this conversation?"}]},member_delete:{id:"menu_item_member_delete",defaultMessage:[{type:0,value:"Remove"}]},archive:{id:"menu_item_archive_topic",defaultMessage:[{type:0,value:"Archive"}]},unarchive:{id:"menu_item_restore_topic",defaultMessage:[{type:0,value:"Restore"}]},edit_permissions:{id:"menu_item_edit_permissions",defaultMessage:[{type:0,value:"Edit permissions"}]},clear_messages_warning:{id:"clear_messages_warning",defaultMessage:[{type:0,value:"Are you sure you want to clear all messages? It cannot be undone."}]}});class Qt extends t().Component{constructor(e){super(e),this.selfRef=t().createRef();const{formatMessage:s}=e.intl;this.handlePageClick=this.handlePageClick.bind(this),this.handleEscapeKey=this.handleEscapeKey.bind(this),this.handleClick=this.handleClick.bind(this),this.MenuItems={topic_info:{id:"topic_info",title:s($t.info),handler:null},messages_clear:{id:"messages_clear",title:s($t.clear_messages),handler:(t,a)=>e.onShowAlert(s($t.clear_messages),s($t.clear_messages_warning),(e=>{this.deleteMessages(!0,!1,t,a)}),null,!0,null)},messages_clear_hard:{id:"messages_clear_hard",title:s($t.clear_for_all),handler:(t,a)=>e.onShowAlert(s($t.clear_for_all),s($t.delete_messages_warning),(e=>this.deleteMessages(!0,!0,t,a)),null,!0,null)},message_delete:{id:"message_delete",title:s($t.delete),handler:(e,t)=>this.deleteMessages(!1,!1,e,t)},message_delete_hard:{id:"message_delete_hard",title:s($t.delete_for_all),handler:(e,t)=>this.deleteMessages(!1,!0,e,t)},menu_item_send_retry:{id:"menu_item_send_retry",title:s($t.send_retry),handler:(e,t)=>this.retryMessage(e,t)},menu_item_reply:{id:"menu_item_reply",title:s($t.reply),handler:(e,t)=>this.replyToMessage(e,t)},menu_item_forward:{id:"menu_item_forward",title:s($t.forward),handler:e=>{}},menu_item_edit:{id:"menu_item_edit",title:s($t.edit),handler:(e,t)=>this.editMessage(e,t)},topic_unmute:{id:"topic_unmute",title:s($t.unmute),handler:this.topicPermissionSetter.bind(this,"+P")},topic_mute:{id:"topic_mute",title:s($t.mute),handler:this.topicPermissionSetter.bind(this,"-P")},topic_unblock:{id:"topic_unblock",title:s($t.unblock),handler:this.topicPermissionSetter.bind(this,"+JP")},topic_block:{id:"topic_block",title:s($t.block),handler:(t,a)=>e.onShowAlert(s($t.block),s($t.topic_block_warning),(e=>this.topicPermissionSetter("-JP",t,a).then((e=>(this.props.onTopicRemoved(t.topicName),e)))),null,!0,null)},topic_delete:{id:"topic_delete",title:s($t.topic_delete),handler:(t,a)=>e.onShowAlert(s($t.topic_delete),s($t.topic_delete_warning),(e=>{const s=this.props.tinode.getTopic(t.topicName);if(s)return s.delTopic(!0).catch((e=>{a&&a(e.message,"err")}));console.warn("Topic not found: ",t.topicName)}),null,!0,null)},topic_archive:{id:"topic_archive",title:s($t.archive),handler:(e,t)=>{const s=this.props.tinode.getTopic(e.topicName);if(s)return s.archive(!0).catch((e=>{t&&t(e.message,"err")}));console.warn("Topic not found: ",e.topicName)}},topic_restore:{id:"topic_restore",title:s($t.unarchive),handler:(e,t)=>{const s=this.props.tinode.getTopic(e.topicName);if(s)return s.archive(!1).catch((e=>{t&&t(e.message,"err")}));console.warn("Topic not found: ",e.topicName)}},permissions:{id:"permissions",title:s($t.edit_permissions),handler:null},member_delete:{id:"member_delete",title:s($t.member_delete),handler:(e,t)=>{const s=this.props.tinode.getTopic(e.topicName);if(s&&e.user)return s.delSubscription(e.user).catch((e=>{t&&t(e.message,"err")}));console.warn("Topic or user not found: '"+e.topicName+"', '"+e.user+"'")}},member_mute:{id:"member_mute",title:s($t.mute),handler:this.topicPermissionSetter.bind(this,"-P")},member_unmute:{id:"member_unmute",title:s($t.unmute),handler:this.topicPermissionSetter.bind(this,"+P")},member_block:{id:"member_block",title:s($t.block),handler:this.topicPermissionSetter.bind(this,"-JP")},member_unblock:{id:"member_unblock",title:s($t.unblock),handler:this.topicPermissionSetter.bind(this,"+JP")}}}componentDidMount(){document.addEventListener("mousedown",this.handlePageClick,!1),document.addEventListener("keyup",this.handleEscapeKey,!1)}componentWillUnmount(){document.removeEventListener("mousedown",this.handlePageClick,!1),document.removeEventListener("keyup",this.handleEscapeKey,!1)}handlePageClick(e){this.selfRef.current.contains(e.target)||(e.preventDefault(),e.stopPropagation(),this.props.hide())}handleEscapeKey(e){27===e.keyCode&&this.props.hide()}handleClick(e){e.preventDefault(),e.stopPropagation(),this.props.hide();let t=this.props.items[e.currentTarget.dataset.id];"string"==typeof t&&(t=this.MenuItems[t]),t?this.props.onAction(t.id,t.handler(this.props.params,this.props.onError),this.props.params):console.error("Invalid menu item ID",e.currentTarget.dataset.id)}deleteMessages(e,t,s,a){const i=this.props.tinode.getTopic(s.topicName);if(!i)return void console.warn("Topic not found: ",s.topicName);if(!e&&i.cancelSend(s.seq))return;return(e?i.delMessagesAll(t):s.replace>0?i.delMessagesEdits(s.replace,t):i.delMessagesList([s.seq],t)).catch((e=>{a&&a(e.message,"err")}))}retryMessage(e,t){const s=this.props.tinode.getTopic(e.topicName);if(!s||!s.flushMessage(e.seq))return;const a=s.createMessage(e.content,!1);return s.publishDraft(a).catch((e=>{t&&t(e.message,"err")}))}topicPermissionSetter(e,t,s){const a=this.props.tinode.getTopic(t.topicName);if(!a)return void console.warn("Topic not found",t.topicName);let i=a.updateMode(t.user,e);return s&&(i=i.catch((e=>s(e.message,"err")))),i}replyToMessage(e,t){e.pickReply(e.seq,e.content,e.userFrom,e.userName,t)}editMessage(e,t){e.editMessage(e.replace||e.seq,e.content,t)}render(){const e=[];let s=0;this.props.items.map((a=>{"string"==typeof a&&(a=this.MenuItems[a]),a&&a.title&&e.push("-"==a.title?t().createElement("li",{className:"separator",key:s}):t().createElement("li",{onClick:this.handleClick,"data-id":s,key:s},a.title)),s++}));const a=12*Gt.o6,i=Gt.o6*(.7+2.5*e.length),n={left:(this.props.bounds.right-this.props.clickAt.x0?(e=[],this.props.badges.map((s=>{const a=s.color?" "+s.color:"";s.icon?e.push(t().createElement("i",{className:"material-icons as-badge"+a,key:s.key||s.icon},Yt[s.icon]||s.icon)):e.push(t().createElement("span",{className:"badge"+a,key:s.key||s.name},s.name))})),t().createElement(t().Fragment,null,e)):null}}var Zt=r(3905);function es(e){const t=document.getElementById("shortcut-icon"),s=document.head||document.getElementsByTagName("head")[0],a=document.createElement("link");a.type="image/png",a.id="shortcut-icon",a.rel="shortcut icon",a.href="img/logo32x32"+(e>0?"a":"")+".png",t&&s.removeChild(t),s.appendChild(a),document.title=(e>0?"("+e+") ":"")+"Tinode"}function ts(e,t,s,a){let i=null;if((e=e&&e.trim())&&(i={fn:e}),"string"==typeof(a=a&&a.trim())&&(i=i||{},i.note=a||zt.Tinode.DEL_CHAR),t){i=i||{};let e=s;const a=/^data:(image\/[-a-z0-9+.]+)?(;base64)?,/i.exec(t);a?(e=a[1],i.photo={data:t.substring(t.indexOf(",")+1),ref:zt.Tinode.DEL_CHAR}):i.photo={data:zt.Tinode.DEL_CHAR,ref:t},i.photo.type=(e||"image/jpeg").substring("image/".length)}return i}function ss(e,t){if(e===t)return!0;if(!Array.isArray(e)||!Array.isArray(t))return!1;if(e.length!=t.length)return!1;e.sort(),t.sort();for(let s=0,a=e.length;s {e.then((e=>t?a({isCanceled:!0}):s(e)),(e=>a(t?{isCanceled:!0}:e)))})),cancel(){t=!0}}}function os(e,t){return e&&e.substring(0,t)}class ls extends t().PureComponent{render(){let e;if(!0===this.props.avatar){const s=zt.Tinode.isGroupTopicName(this.props.topic),a=(0,Zt.Cj)(this.props.topic,s);if(this.props.topic&&this.props.title&&this.props.title.trim()){const s=this.props.title.trim().charAt(0),i="lettertile "+a+(this.props.deleted?" disabled":"");e=t().createElement("div",{className:i},t().createElement("div",null,s))}else{const i="material-icons "+a+(this.props.deleted?" disabled":"");e=s?t().createElement("i",{className:i},"group"):t().createElement("i",{className:i},"person")}}else if(this.props.avatar){const s=this.props.tinode.authorizeURL(is(this.props.avatar,"image")),a="avatar"+(this.props.deleted?" deleted":"");e=t().createElement("img",{className:a,alt:"avatar",src:s,onError:e=>{e.target.onerror=null,e.target.src="../img/broken_image.png"}})}else e=null;return e}}class cs extends t().PureComponent{render(){return this.props.count>0?t().createElement("span",{className:"unread"},this.props.count>9?"9+":this.props.count):null}}var ds=r(4861);class hs extends t().PureComponent{render(){const e=["declined","disconnected","missed"].includes(this.props.callState),s="material-icons medium "+(e?"red":"green"),i=this.props.incoming?e?"call_missed":"call_received":e?"call_missed_outgoing":"call_made";let n;if(e)switch(this.props.callState){case"declined":n=t().createElement(a.FormattedMessage,{id:"call_declined",defaultMessage:[{type:0,value:"declined"}]});break;case"missed":n=this.props.incoming?t().createElement(a.FormattedMessage,{id:"call_missed",defaultMessage:[{type:0,value:"missed"}]}):t().createElement(a.FormattedMessage,{id:"call_cancelled",defaultMessage:[{type:0,value:"cancelled"}]});break;default:n=t().createElement(a.FormattedMessage,{id:"call_disconnected",defaultMessage:[{type:0,value:"disconnected"}]})}else n=t().createElement("span",null,(0,Zt.nH)(this.props.duration/1e3));return t().createElement("div",{className:"call-message"},t().createElement("div",null,t().createElement("i",{className:"material-icons big gray"},"call")),t().createElement("div",{className:"flex-column narrow"},t().createElement("div",null,this.props.incoming?t().createElement(a.FormattedMessage,{id:"calls_incoming",defaultMessage:[{type:0,value:"Incoming call"}]}):t().createElement(a.FormattedMessage,{id:"calls_outgoing",defaultMessage:[{type:0,value:"Outgoing call"}]})),t().createElement("div",{className:"duration"},t().createElement("i",{className:s},i)," ",n)))}}class ps extends t().PureComponent{render(){const e=["declined","disconnected","missed"].includes(this.props.callState),s=this.props.incoming?e?"call_missed":"call_received":e?"call_missed_outgoing":"call_made";let i;if(e)switch(this.props.callState){case"declined":i=t().createElement(a.FormattedMessage,{id:"call_declined",defaultMessage:[{type:0,value:"declined"}]});break;case"missed":i=this.props.incoming?t().createElement(a.FormattedMessage,{id:"call_missed",defaultMessage:[{type:0,value:"missed"}]}):t().createElement(a.FormattedMessage,{id:"call_cancelled",defaultMessage:[{type:0,value:"cancelled"}]});break;default:i=t().createElement(a.FormattedMessage,{id:"call_disconnected",defaultMessage:[{type:0,value:"disconnected"}]})}else i=["accepted","started"].includes(this.props.callState)&&!this.props.duration?t().createElement(a.FormattedMessage,{id:"call_in_progress",defaultMessage:[{type:0,value:"in progress"}]}):t().createElement("span",null,(0,Zt.nH)(this.props.duration/1e3));return t().createElement(t().Fragment,null,t().createElement("div",{className:"composed-material"},t().createElement("i",{className:"material-icons"},"call"),t().createElement("i",{className:"material-icons second"},s))," ",i)}}class us extends t().PureComponent{constructor(e){super(e),this.videoRef=t().createRef(),this.handleClick=this.handleClick.bind(this)}handleClick(e){this.props.onClick&&this.props.onClick(e)}render(){const e=(0,Zt.nH)(this.props["data-duration"]/1e3),s="inline-video"+(this.props.onClick?" image-clickable":"");return t().createElement("div",{className:s},t().createElement("img",this.props),this.props.onClick?t().createElement("div",{className:"play-control"},t().createElement("i",{className:"material-icons white bigger"},"play_arrow")):null,e?t().createElement("div",{className:"duration"},e):null)}}class ms extends t().PureComponent{constructor(e){super(e),this.state={src:this.props.isvideo?"img/blankvid.png":"img/blankimg.png",style:Object.assign({padding:"4px"},this.props.style),className:this.props.className,alt:this.props.alt,onClick:this.props.onClick}}componentDidMount(){this.props.whenDone.promise.then((e=>this.setState({src:e.src,style:{...this.state.style,padding:0}}))).catch((e=>this.setState({src:this.props.isvideo?"img/broken_video.png":"img/broken_image.png"})))}componentWillUnmount(){this.props.whenDone.cancel()}componentDidUpdate(e){e.whenDone!=this.props.whenDone&&(this.setState({src:this.props.isvideo?"img/blankvid.png":"img/blankimg.png",style:{...this.state.style,padding:"4px"}}),this.props.whenDone.promise.then((e=>this.setState({src:e.src,style:{...this.state.style,padding:0}}))).catch((e=>this.setState({src:this.props.isvideo?"img/broken_video.png":"img/broken_image.png"}))))}render(){return t().createElement("img",this.state)}}class gs extends t().PureComponent{render(){return t().createElement("div",{className:"uploader"},t().createElement("div",null,t().createElement("span",{style:{width:100*this.props.progress+"%"}})),this.props.progress<.999?t().createElement("a",{href:"#",onClick:e=>{e.preventDefault(),this.props.onCancel()}},t().createElement("i",{className:"material-icons"},"close")," ",t().createElement(a.FormattedMessage,{id:"action_cancel",defaultMessage:[{type:0,value:"cancel"}]})):t().createElement(a.FormattedMessage,{id:"upload_finishing",defaultMessage:[{type:0,value:"finishing..."}]}))}}class fs extends t().PureComponent{constructor(e){super(e)}render(){return t().createElement("div",{className:"inline-image"},t().createElement("img",this.props),t().createElement("div",{className:"rounded-container"},t().createElement(gs,{progress:this.props.progress,onCancel:this.props.onCancelUpload})))}}var vs=r(8405);const bs=(0,a.defineMessages)({drafty_form:{id:"drafty_form",defaultMessage:[{type:0,value:"Form:"}]},drafty_attachment:{id:"drafty_attachment",defaultMessage:[{type:0,value:"Attachment"}]},drafty_image:{id:"drafty_image",defaultMessage:[{type:0,value:"Picture"}]},drafty_video:{id:"drafty_video",defaultMessage:[{type:0,value:"Video recording"}]},drafty_unknown:{id:"drafty_unknown",defaultMessage:[{type:0,value:"Unsupported"}]}});function Es(e,s,a,i,n){if(n.includes("QQ"))return _s.call(this,e,s,a,i);if(!e)return a;let r=zt.Drafty.tagName(e),o=zt.Drafty.attrValue(e,s)||{};switch(o.key=i,e){case"AU":o.src&&(o.src=this.authorizeURL(is(o.src,"audio")),o.duration=s.duration>0?0|s.duration:void 0,o.preview=s.preview,o.loading="lazy"),r=ds.Z,a=null;break;case"BR":a=null;break;case"EX":case"RW":break;case"HL":o.className="highlight";break;case"HD":r=null,a=null;break;case"IM":r=ys.call(this,r,s,o),a=null;break;case"BN":o.onClick=this.onFormButtonClick;let e=t().Children.map(a,(e=>"string"==typeof e?e:void 0));e&&0!=e.length||(e=[o.name]),o["data-title"]=e.join("");break;case"MN":o.className="mention",s&&(o.className+=" "+(0,Zt.Cj)(s.val,!1,!0));break;case"FM":o.className="bot-form";break;case"QQ":o.className="reply-quote",o.onClick=this.onQuoteClick;break;case"VC":r=hs,a=null,s&&(o.callState=s.state,o.incoming=s.incoming,o.duration=s.duration);break;case"VD":r=Cs.call(this,r,s,o),a=null;break;default:if(!r){r=t().Fragment,o={key:i};let e=a;Array.isArray(a)&&a.join("").trim()||(e=[t().createElement("span",{key:"x1",className:"gray"},this.formatMessage(bs.drafty_unknown))]),a=[t().createElement("i",{key:"x0",className:"material-icons gray"},"extension")," "].concat(e)}}return r?t().createElement(r,o,a):a}function ys(e,t,s){if(!t)return s.src="img/broken_image.png",s.style={width:Gt.$_+"px",height:Gt.$_+"px"},e;s.className="inline-image";const a=(0,vs.rS)(t.width,t.height,this.viewportWidth>0?Math.min(this.viewportWidth-6.5*Gt.o6,34.5*Gt.o6):34.5*Gt.o6,24*Gt.o6,!1)||{dstWidth:Gt.sA,dstHeight:Gt.sA};return s.style={width:a.dstWidth+"px",height:a.dstHeight+"px",minWidth:a.dstWidth+"px",minHeight:a.dstHeight+"px"},zt.Drafty.isProcessing(t)?e=fs:(s.src=this.authorizeURL(is(s.src,"image")),s.alt=t.name,s.src?(Math.max(t.width||0,t.height||0)>Gt.$_&&(s.onClick=this.onImagePreview,s.className+=" image-clickable"),s.loading="lazy"):s.src=null),e}function Cs(e,t,s){if(!t)return s.src="img/broken_video.png",s.style={width:Gt.$_+"px",height:Gt.$_+"px"},e;s.className="inline-image";const a=(0,vs.rS)(t.width,t.height,this.viewportWidth>0?Math.min(this.viewportWidth-6.5*Gt.o6,34.5*Gt.o6):34.5*Gt.o6,24*Gt.o6,!1)||{dstWidth:Gt.wO,dstHeight:Gt.wO};return s.style={width:a.dstWidth+"px",height:a.dstHeight+"px",minWidth:a.dstWidth+"px",minHeight:a.dstHeight+"px"},zt.Drafty.isProcessing(t)?e=fs:(s.src=this.authorizeURL(is(s.src,"image")),s.alt=t.name,t.ref||t.val?(s.onClick=this.onVideoPreview,s.loading="lazy"):s.src=null,e=us),e}function ws(e,s,a,i){if(!e)return a;let n=zt.Drafty.tagName(e);const r={key:i};switch(e){case"AU":n=t().Fragment,a=[t().createElement("i",{key:"au",className:"material-icons"},"mic")," ",(0,Zt.nH)(s.duration/1e3)];break;case"BR":n=t().Fragment,a=[" "];break;case"HL":r.className="highlight preview";break;case"LN":case"MN":n="span";break;case"IM":n=t().Fragment,a=[t().createElement("i",{key:"im",className:"material-icons"},"photo")," ",this.formatMessage(bs.drafty_image)];break;case"BN":n="span",r.className="flat-button faux";break;case"FM":n=t().Fragment,a=[t().createElement("i",{key:"fm",className:"material-icons"},"dashboard"),this.formatMessage(bs.drafty_form)].concat(" ",a||[]);break;case"RW":n=t().Fragment;break;case"EX":if(s){if("application/json"==s.mime)return null;delete s.val,delete s.ref}n=t().Fragment,a=[t().createElement("i",{key:"ex",className:"material-icons"},"attachment")," ",this.formatMessage(bs.drafty_attachment)];break;case"VC":n=ps,s&&(r.callState=s.state,r.incoming=s.incoming,r.duration=s.duration),a=null;break;case"QQ":case"HD":n=null,a=null;break;case"VD":n=t().Fragment,a=[t().createElement("i",{key:"im",className:"material-icons"},"play_circle_outline")," ",this.formatMessage(bs.drafty_video)];break;default:n||(n=t().Fragment,a=[t().createElement("i",{key:"x0",className:"material-icons gray"},"extension")," ",this.formatMessage(bs.drafty_unknown)])}return n?t().createElement(n,r,a):a}function Ss(e,t){return e.style={width:Gt.$_+"px",height:Gt.$_+"px",maxWidth:Gt.$_+"px",maxHeight:Gt.$_+"px"},e.className="inline-image",e.alt=this.formatMessage(bs.drafty_image),e.src=t&&e.src||"img/broken_image.png",e.title=e.alt,e}function Ms(e,t){const s=(0,vs.rS)(t.width,t.height,Gt.Zd,Gt.$_);return e.style={width:s.width+"px",height:s.height+"px",maxWidth:Gt.Zd+"px",maxHeight:Gt.$_+"px"},e.className="inline-image",e.alt=this.formatMessage(bs.drafty_video),e.title=e.alt,e.src=t&&e.src||"img/broken_video.png",e}function _s(e,s,a,i){if(["BR","EX","IM","MN","VD"].includes(e)){let n=zt.Drafty.tagName(e),r=zt.Drafty.attrValue(e,s)||{};switch(r.key=i,e){case"BR":a=null;break;case"IM":r=Ss.call(this,r,s),a=[t().createElement("img",r,null)," ",r.alt],n=t().Fragment,r={key:i};break;case"VD":r=Ms.call(this,r,s),a=[t().createElement("img",r,null)," ",r.alt],n=t().Fragment,r={key:i};break;case"MN":n="span",r.className="mention",s&&(r.className+=" "+(0,Zt.Cj)(s.val,!1,!0));break;case"EX":let e;if(s){if("application/json"==s.mime)return null;e=s.name,delete s.val,delete s.ref}n=t().Fragment,a=[t().createElement("i",{key:"ex",className:"material-icons"},"attachment"),(0,Zt.TX)(e,16)||this.formatMessage(bs.drafty_attachment)]}return t().createElement(n,r,a)}return ws.call(this,e,s,a,i)}function Ts(e,t){let s,a,i,n;if(t?(a=e.preview,n=e.premime||"image/jpeg",i=e.preref):(a=e.val,n=e.mime,i=e.ref),a){const e=(0,vs.Jr)(a,n);if(!e)throw new Error("Invalid image");s=Promise.resolve(e)}else{if(!i)throw new Error("Missing image data");s=fetch(this.authorizeURL(is(i,"image"))).then((e=>{if(e.ok)return e.blob();throw new Error(`Image fetch unsuccessful: ${e.status} ${e.statusText}`)}))}return s.then((e=>(0,vs.EA)(e,t?Gt.Zd:Gt.$_,Gt.$_,-1,!t))).then((s=>(t?e.premime=s.mime:e.mime=s.mime,e.size=s.blob.size,e.width=s.width,e.height=s.height,delete e.ref,delete e.preref,e.src=URL.createObjectURL(s.blob),(0,vs.w8)(s.blob)))).then((s=>(t?e.preview=s.bits:e.val=s.bits,e))).catch((t=>{throw delete e.val,delete e.preview,delete e.src,e.width=Gt.$_,e.height=Gt.$_,t}))}function ks(e,s,a,i,n){if("IM"==e||"VD"==e){const n="IM"==e?Ss.call(this,{key:i},s):Ms.call(this,{key:i},s);let r;try{r=rs(Ts.call(this,s,"VD"==e))}catch(e){console.warn("Failed to quote image:",e.message),r=rs(e)}return n.whenDone=r,a=[t().createElement(ms,n,null)," ",n.alt],t().createElement(t().Fragment,{key:i},a)}if("QQ"==e){if(n.includes("QQ"))return t().createElement("span",{key:i},[t().createElement("i",{key:"qq",className:"material-icons"},"format_quote")," "]);const e=zt.Drafty.attrValue("QQ",s)||{};return e.key=i,e.className="reply-quote",t().createElement(zt.Drafty.tagName("QQ"),e,a)}return _s.call(this,e,s,a,i)}class Ns extends t().Component{constructor(e){super(e),this.handleClick=this.handleClick.bind(this),this.handleContextClick=this.handleContextClick.bind(this)}handleClick(e){e.preventDefault(),e.stopPropagation(),this.props.onSelected&&this.props.onSelected(this.props.item,this.props.index)}handleContextClick(e){e.preventDefault(),e.stopPropagation(),this.props.showContextMenu({topicName:this.props.item,y:e.pageY,x:e.pageX})}render(){let e=this.props.title;e?e.length>30&&(e=e.substring(0,28)+"…"):e=t().createElement("i",null,t().createElement(a.FormattedMessage,{id:"unnamed_topic",defaultMessage:[{type:0,value:"Unnamed"}]}));const s=this.props.now?"online":"offline",i=!this.props.avatar||this.props.avatar,n=this.props.badges?this.props.badges.slice():[],r=[];let o;this.props.isVerified&&r.push({icon:"verified",color:"verified-color"}),this.props.isStaff&&r.push({icon:"staff",color:"staff-color"}),this.props.isDangerous&&r.push({icon:"dangerous",color:"danger-color"}),this.props.acs&&(this.props.showMode&&n.push({name:this.props.acs.getMode(),key:"mode"}),this.props.acs.isMuted()&&r.push({icon:"muted"}),this.props.acs.isJoiner()||r.push({icon:"banned"})),"string"==typeof this.props.preview?o=this.props.preview:zt.Drafty.isValid(this.props.preview)?o=t().createElement(t().Fragment,null,zt.Drafty.format(this.props.preview,ws,{formatMessage:this.props.intl.formatMessage,previewIsResponse:this.props.previewIsResponse})):this.props.preview&&(o=t().createElement(t().Fragment,null,t().createElement("i",{className:"material-icons gray"},"warning_amber")," ",t().createElement("i",{className:"gray"},t().createElement(a.FormattedMessage,{id:"invalid_content",defaultMessage:[{type:0,value:"invalid content"}]}))));const l=ns(this.props.received),c=l?t().createElement("i",{className:"material-icons small space-right"+(l.color?" "+l.color:"")},l.name):null,d="contact-title"+(this.props.deleted?" deleted":"");return t().createElement("li",{className:!this.props.showCheckmark&&this.props.selected?"selected":null,onClick:this.handleClick},t().createElement("div",{className:"avatar-box"},t().createElement(ls,{tinode:this.props.tinode,avatar:i,title:this.props.title,topic:this.props.item,deleted:this.props.deleted}),this.props.deleted?t().createElement("i",{className:"deleted material-icons"},"cancel"):this.props.showOnline?t().createElement("span",{className:s}):this.props.showCheckmark&&this.props.selected?t().createElement("i",{className:"checkmark material-icons"},"check_circle"):null),t().createElement("div",{className:"text-box"},t().createElement("div",null,t().createElement("span",{className:d},e),this.props.isGroup?t().createElement("i",{className:"material-icons as-badge"},"group"):null,this.props.isChannel?t().createElement("img",{src:"/img/channel.png",className:"channel",alt:"channel"}):null,t().createElement(Jt,{badges:r}),this.props.deleted?null:t().createElement(cs,{count:this.props.unread})),this.props.showMode?t().createElement("span",null,t().createElement(Jt,{badges:n})):this.props.small?null:t().createElement("div",{className:"contact-comment"},c,t().createElement("span",null,o||this.props.comment||" "))),this.props.showContextMenu?t().createElement("span",{className:"menuTrigger"},t().createElement("a",{href:"#",onClick:this.handleContextClick},t().createElement("i",{className:"material-icons"},"expand_more"))):null)}}const As=(0,a.injectIntl)(Ns);class Ds extends t().PureComponent{constructor(e){super(e),this.handleClick=this.handleClick.bind(this)}handleClick(e){e.preventDefault(),e.stopPropagation(),this.props.onAction(this.props.action)}render(){const{formatMessage:e}=this.props.intl;return t().createElement("li",{onClick:this.handleClick,className:"action"},t().createElement("div",{className:"action-text"},e(this.props.title,this.props.values)))}}const Ps=(0,a.injectIntl)(Ds),Is=(0,a.defineMessages)({badge_you:{id:"badge_you",defaultMessage:[{type:0,value:"you"}]},badge_owner:{id:"badge_owner",defaultMessage:[{type:0,value:"owner"}]}});class Rs extends t().Component{render(){const{formatMessage:e}=this.props.intl,s=Array.isArray(this.props.topicSelected),a=[];let i=0;return this.props.contacts&&this.props.contacts.length>0&&this.props.contacts.map((n=>{if(n.action)a.push(t().createElement(Ps,{title:n.title,action:n.action,values:n.values,key:n.action,onAction:this.props.onAction}));else{const r=this.props.showMode?n.user:n.topic||n.user;if(this.props.filterFunc&&this.props.filter){const e=[r];if(n.private&&n.private.comment&&e.push((""+n.private.comment).toLowerCase()),n.public&&n.public.fn&&e.push((""+n.public.fn).toLowerCase()),!this.props.filterFunc(this.props.filter,e))return}const o=zt.Tinode.isChannelTopicName(r),l=!o&&zt.Tinode.isGroupTopicName(r),c=s?this.props.topicSelected.indexOf(r)>-1:this.props.topicSelected===r,d=[];this.props.showMode&&(r==this.props.myUserId&&d.push({name:e(Is.badge_you),color:"green"}),n.acs&&n.acs.isOwner()&&d.push({name:e(Is.badge_owner),color:"blue"}));const h=Array.isArray(n.private)?n.private.join(","):n.private?n.private.comment:null;let p,u,m,g;if(!this.props.showMode&&n.latestMessage){const e=n.latestMessage();e&&(u=e.head?e.head.forwarded:null,g=e._status||n.msgStatus(e,!0),m=e.from!=this.props.myUserId,e.content&&(p="string"==typeof e.content?e.content.substr(0,Gt.rV):zt.Drafty.preview(e.content,Gt.rV)))}a.push(t().createElement(As,{tinode:this.props.tinode,title:n.public?n.public.fn:null,avatar:(0,vs.PD)(n.public?n.public.photo:null),comment:h,preview:p,previewIsResponse:m,forwarded:u,received:g,unread:this.props.showUnread?n.unread:0,now:n.online&&this.props.connected,acs:n.acs,showMode:this.props.showMode,badges:d,showCheckmark:s,selected:c,showOnline:this.props.showOnline&&!o,isChannel:o,isGroup:l,showContextMenu:this.props.showContextMenu,isVerified:n.trusted&&n.trusted.verified,isStaff:n.trusted&&n.trusted.staff,isDangerous:n.trusted&&n.trusted.danger,deleted:n._deleted,onSelected:this.props.onTopicSelected,item:r,index:a.length,key:r})),i++}}),this),t().createElement("div",{className:this.props.noScroll?null:"scrollable-panel"},0==i?t().createElement("div",{className:"center-medium-text",dangerouslySetInnerHTML:{__html:this.props.emptyListMessage}}):null,a.length>0?t().createElement("ul",{className:"contact-box"},a):null)}}const Fs=(0,a.injectIntl)(Rs);class xs extends t().PureComponent{constructor(e){super(e),this.state={edited:!1,search:""},this.handleSearchChange=this.handleSearchChange.bind(this),this.handleSearch=this.handleSearch.bind(this),this.handleClear=this.handleClear.bind(this),this.handleKeyDown=this.handleKeyDown.bind(this)}componentWillUnmount(){this.state.edited&&(this.setState({search:"",edited:!1}),this.props.onSearchContacts(zt.Tinode.DEL_CHAR))}handleSearchChange(e){this.setState({search:e.target.value})}handleSearch(e){e.preventDefault();const t=this.state.search.trim();this.setState({edited:t.length>0}),this.props.onSearchContacts(t.length>0?t:zt.Tinode.DEL_CHAR)}handleClear(e){e.preventDefault(),this.state.edited&&this.props.onSearchContacts(zt.Tinode.DEL_CHAR),this.setState({search:"",edited:!1})}handleKeyDown(e){"Enter"===e.key?this.handleSearch(e):"Escape"===e.key&&this.handleClear()}render(){return t().createElement("div",{className:"panel-form"},t().createElement("div",{className:"panel-form-row"},t().createElement("i",{className:"material-icons search"},"search"),t().createElement("input",{className:"search",type:"text",placeholder:this.props.placeholder,value:this.state.search,onChange:this.handleSearchChange,onKeyDown:this.handleKeyDown,required:!0,autoFocus:!0}),this.state.search?t().createElement("a",{href:"#",onClick:this.handleClear},t().createElement("i",{className:"material-icons"},"highlight_off")):t().createElement("span",null,t().createElement("i",{className:"material-icons"}," "))))}}class Us extends t().Component{constructor(e){super(e),this.state={query:null},this.handleEscapeKey=this.handleEscapeKey.bind(this),this.handleClose=this.handleClose.bind(this),this.handleSearchContacts=this.handleSearchContacts.bind(this),this.handleContactSelected=this.handleContactSelected.bind(this)}componentDidMount(){this.props.onInitFind()}handleEscapeKey(e){27===e.keyCode&&this.props.hide(!1)}handleClose(e){e.preventDefault(),this.props.hide(!1)}handleSearchContacts(e){this.setState({query:zt.Tinode.isNullValue(e)?null:e}),this.props.onSearchContacts(e)}handleContactSelected(e){this.props.onTopicSelected(e),this.props.hide(!0)}render(){let e=null!=this.state.query?this.props.searchResults:this.props.contacts;return e=e.filter((e=>e.name!=this.props.topicSelected&&e.acs.isJoiner()&&e.acs.isWriter())),t().createElement("div",{className:"alert-container"},t().createElement("div",{className:"forward-dialog"},t().createElement("div",{className:"title with-control"},t().createElement("div",null,t().createElement(a.FormattedMessage,{id:"forward_to",defaultMessage:[{type:0,value:"Forward to"}],desription:"Title of the contact selector dialog when forwarding a message"})),t().createElement("div",null,t().createElement("a",{href:"#",onClick:this.handleClose},t().createElement("i",{className:"material-icons"},"close")))),t().createElement(a.FormattedMessage,{id:"forward_to_search_placeholder",defaultMessage:[{type:0,value:"Search contacts"}]},(e=>t().createElement(xs,{placeholder:e,onSearchContacts:this.handleSearchContacts}))),t().createElement(a.FormattedMessage,{id:"search_no_results",defaultMessage:[{type:0,value:"Search returned no results"}]},(s=>t().createElement(Fs,{tinode:this.props.tinode,contacts:e,myUserId:this.props.myUserId,emptyListMessage:s,showOnline:!1,showUnread:!1,showContextMenu:!1,onTopicSelected:this.handleContactSelected})))))}}const Ls={staff:"verified_user"},Os=(0,a.defineMessages)({badge_verified:{id:"badge_verified",defaultMessage:[{type:0,value:"Verified/official"}]},badge_staff:{id:"badge_staff",defaultMessage:[{type:0,value:"Staff-managed"}]},badge_danger:{id:"badge_danger",defaultMessage:[{type:0,value:"Untrustworthy"}]}});class Bs extends t().PureComponent{render(){const{formatMessage:e}=this.props.intl;let s=null;return this.props.trustedBadges&&this.props.trustedBadges.length>0?(s=[],this.props.trustedBadges.map((a=>{const i=this.props.short?null:e(Os["badge_"+a]),n="material-icons "+a+"-color";s.push(t().createElement("div",{className:"trusted-badge",key:a},t().createElement("i",{className:n},Ls[a]||a)," ",i))})),t().createElement(t().Fragment,null,s)):null}}const js=(0,a.injectIntl)(Bs),qs="started",Vs=new Audio("audio/call-in.m4a");class Hs extends t().Component{constructor(e){super(e),this.state={topic:null,fullName:void 0,avatar:null,trustedBadges:[],previousMetaDesc:void 0},this.resetDesc=this.resetDesc.bind(this),this.onMetaDesc=this.onMetaDesc.bind(this),this.handleRejectCall=this.handleRejectCall.bind(this),this.handleAcceptCall=this.handleAcceptCall.bind(this),this.ringTimer=null}componentDidMount(){const e=this.props.tinode.getTopic(this.props.topic);e&&(this.resetDesc(e),2==this.props.callState&&(Vs.play().catch((e=>{})),this.ringTimer=setInterval((e=>{Vs.play().catch((e=>{}))}),2e3),this.props.onRinging(this.props.topic,this.props.seq)))}componentDidUpdate(e){const t=this.props.tinode.getTopic(e.topic);t&&(this.onMetaDesc!=t.onMetaDesc&&(this.previousMetaDesc=t.onMetaDesc,t.onMetaDesc=this.onMetaDesc),this.state.topic!=e.topic&&(this.setState({topic:e.topic}),this.resetDesc(t,e)))}componentWillUnmount(){null!=this.ringTimer&&(clearInterval(this.ringTimer),Vs.pause());const e=this.props.tinode.getTopic(this.props.topic);e&&(this.setState({topic:null}),e.onMetaDesc=this.previousMetaDesc)}resetDesc(e){const t=[];if(e.trusted)for(const[s,a]of Object.entries(e.trusted))a&&t.push(s);this.setState({fullName:os(e.public?e.public.fn:void 0,Gt.S8),avatar:(0,vs.PD)(e.public?e.public.photo:null),trustedBadges:t})}onMetaDesc(e){const t=this.props.tinode.getTopic(this.props.topic);t&&(this.resetDesc(t),this.previousMetaDesc&&this.previousMetaDesc!=this.onMetaDesc&&this.previousMetaDesc(e))}handleAcceptCall(){this.props.onAcceptCall(this.props.topic)}handleRejectCall(){this.props.onReject(this.props.topic,this.props.seq),this.props.onClose()}render(){return t().createElement("div",{className:"alert-container"},t().createElement("div",{className:"incoming-call"},t().createElement("div",{className:"caller-card incoming pulse"},t().createElement("div",{className:"avatar-box"},t().createElement(ls,{tinode:this.props.tinode,avatar:this.state.avatar||!0,topic:this.props.topic,title:this.state.fullName})),t().createElement("div",{className:"caller-name"},os(this.state.fullName,Gt.gD),t().createElement(js,{short:!0,trustedBadges:this.state.trustedBadges}))),t().createElement("div",{className:"controls"},2==this.props.callState?t().createElement(t().Fragment,null,t().createElement("button",{className:"danger",onClick:this.handleRejectCall},t().createElement("i",{className:"material-icons"},"call_end")),t().createElement("button",{className:"positive",onClick:this.handleAcceptCall},t().createElement("i",{className:"material-icons"},"call"))):null)))}}class Ws extends t().PureComponent{render(){const e="load-spinner-box"+(this.props.large?" large":"")+(this.props.clear?" clear":"")+(this.props.centered?" centered":"");return this.props.show?t().createElement("div",{className:e},t().createElement("div",{className:"loader-spinner"})):null}}class zs extends t().Component{constructor(e){super(e),this.state={source:e.avatar},this.handleFileReceived=this.handleFileReceived.bind(this)}componentDidUpdate(e){this.props.avatar!=e.avatar&&this.setState({source:this.props.avatar})}handleFileReceived(e){const t=e.target.files[0];this.props.onImageUpdated(t.type,URL.createObjectURL(t),t.name),e.target.value=""}render(){const e="file-input-avatar-"+(""+Math.random()).substring(0,4),s="avatar-upload"+(this.props.readOnly?" read-only":"");return t().createElement("div",{className:s},this.props.readOnly||!this.state.source?null:t().createElement("a",{href:"#",className:"clear-avatar",onClick:e=>{e.preventDefault(),this.props.onImageUpdated()}},t().createElement("i",{className:"material-icons"},"clear")),this.state.source?t().createElement("img",{src:this.props.tinode.authorizeURL(is(this.state.source,"image")),className:"preview"}):this.props.readOnly&&this.props.uid?t().createElement("div",{className:"avatar-box"},t().createElement(ls,{tinode:this.props.tinode,avatar:!0,topic:this.props.uid,title:this.props.title})):t().createElement("div",{className:"blank"},Gt.IX,"×",Gt.IX),this.props.readOnly?null:t().createElement("input",{type:"file",id:e,className:"inputfile hidden",accept:"image/*",onChange:this.handleFileReceived}),this.props.readOnly?null:t().createElement("label",{htmlFor:e,className:"round"},t().createElement("i",{className:"material-icons"},"file_upload")),t().createElement(Ws,{show:this.props.uploading,large:!0,clear:!0,centered:!0}))}}class Ks extends t().PureComponent{constructor(e){super(e),this.handleChange=this.handleChange.bind(this)}handleChange(){this.props.onChange(this.props.name,!this.props.checked)}render(){let e,s=["material-icons"];Array.isArray(this.props.className)?s.push(...this.props.className):this.props.className&&s.push(this.props.className),this.props.onChange?this.props.checked?(s.push("blue","clickable"),e="check_box"):!1===this.props.checked?(s.push("blue","clickable"),e="check_box_outline_blank"):(s.push("lt-blue"),e="indeterminate_check_box"):e=this.props.checked?"check_box":"check_box_outline_blank";let a={className:s.join(" "),id:this.props.id};return this.props.onChange&&(a.onClick=this.handleChange),t().createElement("i",a,e)}}class Gs extends t().PureComponent{render(){return t().createElement("a",{href:"#",onClick:e=>{e.preventDefault(),this.props.onCancel()}},t().createElement("i",{className:"material-icons"},"close"))}}class $s extends t().PureComponent{constructor(e){super(e),this.state={show:!1},this.hide=this.hide.bind(this)}componentDidUpdate(e){e.level!==this.props.level&&this.setState({show:!!this.props.level})}hide(){this.setState({show:!1}),this.props.onClearError&&this.props.onClearError()}render(){const e={err:"error",warn:"warning",info:"info"}[this.props.level]||"",s="info-box "+e;return t().createElement("div",{className:s},t().createElement("div",{className:"icon"},t().createElement("i",{className:"material-icons"},e)),t().createElement("span",null,this.props.text,this.props.action?t().createElement(t().Fragment,null,t().createElement("a",{href:"#",style:{whiteSpace:"nowrap"},onClick:e=>{e.preventDefault(),this.props.action()}},this.props.actionText)):null),t().createElement("div",{className:"cancel"},t().createElement(Gs,{onCancel:this.hide})))}}class Qs extends t().PureComponent{constructor(e){super(e),this.handleCancel=this.handleCancel.bind(this)}handleCancel(e){e.preventDefault(),this.props.onCancel(this.props.topic,this.props.index)}render(){const e=this.props.title||this.props.topic,s=this.props.invalid?"chip invalid":"chip";return t().createElement("div",{className:s},this.props.noAvatar?t().createElement("span",{className:"spacer"}):t().createElement("div",{className:"avatar-box"},t().createElement(ls,{tinode:this.props.tinode,avatar:this.props.avatar||!0,topic:this.props.topic,title:this.props.title})),t().createElement("span",null,e),this.props.onCancel&&!this.props.required?t().createElement("a",{href:"#",onClick:this.handleCancel},"×"):t().createElement("span",{className:"spacer"}))}}class Xs extends t().Component{constructor(e){super(e),this.state=Xs.deriveStateFromProps(e),this.state.input="",this.state.focused=!1,this.handleTextInput=this.handleTextInput.bind(this),this.removeChipAt=this.removeChipAt.bind(this),this.handleChipCancel=this.handleChipCancel.bind(this),this.handleFocusGained=this.handleFocusGained.bind(this),this.handleFocusLost=this.handleFocusLost.bind(this),this.handleKeyDown=this.handleKeyDown.bind(this)}static deriveStateFromProps(e){return{placeholder:e.chips?"":e.prompt,sortedChips:Xs.sortChips(e.chips,e.staticMembers),chipIndex:Xs.indexChips(e.chips)}}componentDidUpdate(e,t){e.chips==this.props.chips&&e.staticMembers==this.props.staticMembers&&e.prompt==this.props.prompt||this.setState(Xs.deriveStateFromProps(this.props)),(!t||this.props.chips.length>t.sortedChips.length)&&this.setState({input:""})}static indexChips(e){const t={};let s=0;return e.map((e=>{t[e.user]=s,s++})),t}static sortChips(e,t){const s=[],a=[];return e.map((e=>{t&&t.includes(e.user)?s.push(e):a.push(e)})),s.concat(a)}handleTextInput(e){this.setState({input:e.target.value}),this.props.filterFunc&&this.props.filterFunc(e.target.value)}removeChipAt(e){const t=this.state.sortedChips[e];this.props.onChipRemoved(t.user,this.state.chipIndex[t.user])}handleChipCancel(e,t){this.removeChipAt(t)}handleFocusGained(){this.setState({focused:!0})}handleFocusLost(){this.setState({focused:!1}),this.props.onFocusLost&&this.props.onFocusLost(this.state.input)}handleKeyDown(e){if("Backspace"===e.key){if(0==this.state.input.length&&this.state.sortedChips.length>0){const e=this.state.sortedChips.length-1;this.state.sortedChips[e].user!==this.props.staticMembers&&this.removeChipAt(e)}}else"Enter"===e.key?this.props.onEnter&&this.props.onEnter(this.state.input):"Escape"===e.key&&this.props.onCancel&&this.props.onCancel()}render(){const e=[];let s=0;const a=this.props.staticMembers||[];this.state.sortedChips.map((i=>{e.push(t().createElement(Qs,{tinode:this.props.tinode,onCancel:this.handleChipCancel,avatar:(0,vs.PD)(i.public?i.public.photo:null),title:i.public?i.public.fn:void 0,noAvatar:this.props.avatarDisabled,topic:i.user,required:a.includes(i.user),invalid:i.invalid,index:s,key:i.user})),s++}));const i="chip-input"+(this.state.focused?" focused":""),n=!(this.props.tabIndex>0);return t().createElement("div",{className:i},e,t().createElement("input",{type:"text",placeholder:this.state.placeholder,onChange:this.handleTextInput,onFocus:this.handleFocusGained,onBlur:this.handleFocusLost,onKeyDown:this.handleKeyDown,value:this.state.input,tabIndex:this.props.tabIndex,autoFocus:n}))}}const Ys=(0,a.defineMessages)({no_contacts:{id:"no_contacts",defaultMessage:[{type:0,value:"You have no contacts :-("}]},contacts_not_found_short:{id:"contacts_not_found_short",defaultMessage:[{type:0,value:"No contacts match '"},{type:1,value:"query"},{type:0,value:"'"}]}});class Js extends t().Component{constructor(e){super(e),this.state={members:e.members,index:Js.indexMembers(e.members),staticMembers:Js.staticMembers(e.members,e.keepInitialMembers,e.requiredMember),contactFilter:"",noContactsMessage:e.intl.formatMessage(Ys.no_contacts),selectedContacts:Js.selectedContacts(e.members)},this.handleContactSelected=this.handleContactSelected.bind(this),this.handleMemberRemoved=this.handleMemberRemoved.bind(this),this.handleContactFilter=this.handleContactFilter.bind(this),this.handleSubmit=this.handleSubmit.bind(this),this.handleCancel=this.handleCancel.bind(this)}static indexMembers(e){let t={};return e.map((e=>{t[e.user]={delta:0,present:!0}})),t}static staticMembers(e,t,s){let a=[];return e.map((e=>{(t||e.user==s)&&a.push(e.user)})),a}static selectedContacts(e){let t=[];return e.map((e=>{t.push(e.user)})),t}handleContactSelected(e,t){let s=this.state.index[e];if(s){if(s.present)return;s.delta+=1,s.present=!0}else s={delta:1,present:!0};let a=this.state.members.slice();a.push(this.props.contacts[t]);const i=Js.selectedContacts(a),n=this.state.index;n[e]=s,this.setState({members:a,index:n,selectedContacts:i})}handleMemberRemoved(e,t){const s=this.state.index[e];if(!s||!s.present)return;s.present=!1,s.delta-=1;let a=this.state.members.slice();a.splice(t,1);const i=Js.selectedContacts(a),n=this.state.index;n[e]=s,this.setState({members:a,index:n,selectedContacts:i})}handleContactFilter(e){const{formatMessage:t}=this.props.intl,s=e?t(Ys.contacts_not_found_short,{query:e}):t(Ys.no_contacts);this.setState({contactFilter:e,noContactsMessage:s})}static doContactFiltering(e,t){if(e){for(let s=0;s=0)return!0;return!1}return!0}handleSubmit(){var e=this,t=[],s=[],a=[];Object.keys(this.state.index).map((function(i){e.state.index[i].present&&t.push(i),e.state.index[i].delta>0?s.push(i):e.state.index[i].delta<0&&a.push(i)})),this.props.onSubmit(t,s,a)}handleCancel(){this.props.onCancel()}render(){const{formatMessage:e}=this.props.intl;return t().createElement("div",{id:"group-manager"},t().createElement("div",{className:"panel-form-row"},t().createElement("label",{className:"small"},t().createElement(a.FormattedMessage,{id:"title_group_members",defaultMessage:[{type:0,value:"Group Members"}]}))),t().createElement("div",{className:"panel-form-row"},t().createElement(Xs,{tinode:this.props.tinode,chips:this.state.members,staticMembers:this.state.staticMembers,prompt:"add members",filterFunc:this.handleContactFilter,onChipRemoved:this.handleMemberRemoved})),t().createElement("div",{className:"panel-form-row"},t().createElement("label",{className:"small"},t().createElement(a.FormattedMessage,{id:"title_all_contacts",defaultMessage:[{type:0,value:"All Contacts"}]}))),t().createElement(Fs,{tinode:this.props.tinode,contacts:this.props.contacts,myUserId:this.props.myUserId,topicSelected:this.state.selectedContacts,filter:this.state.contactFilter,filterFunc:Js.doContactFiltering,emptyListMessage:this.state.noContactsMessage,showOnline:!1,showUnread:!1,onTopicSelected:this.handleContactSelected}),t().createElement("div",{id:"group-manager-buttons",className:"panel-form-row"},t().createElement("button",{className:"secondary",onClick:this.handleCancel},t().createElement(a.FormattedMessage,{id:"button_cancel",defaultMessage:[{type:0,value:"Cancel"}]})),t().createElement("button",{className:"primary",onClick:this.handleSubmit},t().createElement(a.FormattedMessage,{id:"button_ok",defaultMessage:[{type:0,value:"OK"}]}))))}}const Zs=(0,a.injectIntl)(Js),ea=(0,a.defineMessages)({joiner:{id:"permission_join",defaultMessage:[{type:0,value:"Join ("},{type:1,value:"val"},{type:0,value:")"}]},reader:{id:"permission_read",defaultMessage:[{type:0,value:"Read ("},{type:1,value:"val"},{type:0,value:")"}]},writer:{id:"permission_write",defaultMessage:[{type:0,value:"Write ("},{type:1,value:"val"},{type:0,value:")"}]},preser:{id:"permission_pres",defaultMessage:[{type:0,value:"Get notified ("},{type:1,value:"val"},{type:0,value:")"}]},approver:{id:"permission_admin",defaultMessage:[{type:0,value:"Approve ("},{type:1,value:"val"},{type:0,value:")"}]},sharer:{id:"permission_share",defaultMessage:[{type:0,value:"Share ("},{type:1,value:"val"},{type:0,value:")"}]},deleter:{id:"permission_delete",defaultMessage:[{type:0,value:"Delete ("},{type:1,value:"val"},{type:0,value:")"}]},owner:{id:"permission_owner",defaultMessage:[{type:0,value:"Owner ("},{type:1,value:"val"},{type:0,value:")"}]}});class ta extends t().Component{constructor(e){super(e),this.state={mode:(e.mode||"").replace("N","")},this.handleChange=this.handleChange.bind(this),this.handleSubmit=this.handleSubmit.bind(this),this.handleCancel=this.handleCancel.bind(this)}handleChange(e){let t=this.state.mode;-1==t.indexOf(e)?t+=e:t=t.replace(e,""),this.setState({mode:t})}handleSubmit(){const e=(this.state.mode||"N").split("").sort().join("");e!==(this.props.mode||"N").split("").sort().join("")?this.props.onSubmit(e):this.props.onCancel()}handleCancel(){this.props.onCancel()}render(){const{formatMessage:e}=this.props.intl,s="JRWPASDO",i={J:e(ea.joiner,{val:"J"}),R:e(ea.reader,{val:"R"}),W:e(ea.writer,{val:"W"}),P:e(ea.preser,{val:"P"}),A:e(ea.approver,{val:"A"}),S:e(ea.sharer,{val:"S"}),D:e(ea.deleter,{val:"D"}),O:e(ea.owner,{val:"O"})};let n=this.props.skip||"",r=this.state.mode,o=(this.props.compare||"").replace("N",""),l=[];for(let e=0;e=0&&r.indexOf(a)<0||l.push(t().createElement("tr",{key:a},t().createElement("td",null,i[a]),t().createElement("td",{className:"checkbox"},n.indexOf(a)<0?t().createElement(Ks,{name:a,checked:r.indexOf(a)>=0,onChange:this.handleChange}):t().createElement(Ks,{name:a,checked:r.indexOf(a)>=0})),this.props.compare?t().createElement("td",{className:"checkbox"},t().createElement(Ks,{name:a,checked:o.indexOf(a)>=0})):null))}return t().createElement("div",{className:"panel-form-column"},this.props.userTitle?t().createElement("ul",{className:"contact-box small"},t().createElement(As,{tinode:this.props.tinode,item:this.props.item,title:this.props.userTitle,small:!0,avatar:(0,vs.PD)(this.props.userAvatar?this.props.userAvatar:null)})):null,t().createElement("label",{className:"small"},t().createElement(a.FormattedMessage,{id:"title_permissions",defaultMessage:[{type:0,value:"Permissions"}]})),t().createElement("table",{className:"permission-editor"},this.props.compare?t().createElement("thead",null,t().createElement("tr",null,t().createElement("th",null),t().createElement("th",null,this.props.modeTitle),t().createElement("th",null,this.props.compareTitle))):null,t().createElement("tbody",null,l)),t().createElement("br",null),t().createElement("div",{className:"dialog-buttons"},t().createElement("button",{className:"outline",onClick:this.handleCancel},t().createElement(a.FormattedMessage,{id:"button_cancel",defaultMessage:[{type:0,value:"Cancel"}]})),t().createElement("button",{className:"primary",onClick:this.handleSubmit},t().createElement(a.FormattedMessage,{id:"button_ok",defaultMessage:[{type:0,value:"OK"}]}))))}}const sa=(0,a.injectIntl)(ta);class aa extends t().Component{constructor(e){super(e),this.state={panX:0,panY:0,originX:0,originY:0,zoom:1,minZoom:0,maxZoom:2.5},this.overlay=t().createRef(),this.cutout=t().createRef(),this.preview=t().createRef(),this.boundingBox=t().createRef(),this.imageWidth=0,this.imageHeight=0,this.mouseX=0,this.mouseY=0,this.prevDistance=0,this.cutoutRect={},this.bBoxRect={},this.originX=0,this.originY=0,this.initScaling=this.initScaling.bind(this),this.onZoom=this.onZoom.bind(this),this.handleZoom=this.handleZoom.bind(this),this.mouseDown=this.mouseDown.bind(this),this.mouseUp=this.mouseUp.bind(this),this.mouseMove=this.mouseMove.bind(this),this.mouseTouch=this.mouseTouch.bind(this),this.positionAll=this.positionAll.bind(this),this.translate=this.translate.bind(this)}componentDidMount(){this.overlay.current.addEventListener("mousedown",this.mouseDown,{passive:!0}),this.overlay.current.addEventListener("touchstart",this.mouseDown,{passive:!0}),this.bBoxRect=this.boundingBox.current.getBoundingClientRect(),this.originX=this.bBoxRect.width/2,this.originY=this.bBoxRect.height/2,this.cutoutRect=this.cutout.current.getBoundingClientRect()}componentWillUnmount(){this.overlay.current.removeEventListener("mousedown",this.mouseDown),this.overlay.current.removeEventListener("touchstart",this.mouseDown)}positionAll(e,t,s){this.setState({panX:e,panY:t,zoom:s,originX:this.originX-e,originY:this.originY-t});const a=(this.originX-e)*s-this.originX,i=(this.originY-t)*s-this.originY;this.props.onChange((a+this.cutoutRect.left-this.bBoxRect.left)/s,(i+this.cutoutRect.top-this.bBoxRect.top)/s,this.cutoutRect.width/s,this.cutoutRect.height/s,s)}static checkBound(e,t,s,a){let i=Math.min(0,s[0]-t[0]-a,t[1]-s[1]+a);return(0==i||Math.min(0,s[0]-t[0],t[1]-s[1])i&&(t+=r-i);const o=this.originY-(this.originY-s)*e,l=o+this.imageHeight*e,c=this.cutoutRect.top-this.bBoxRect.top,d=c+this.cutoutRect.height;cl&&(s+=d-l),this.positionAll(t,s,e)}mouseDown(e){e.touches?(this.mouseX=e.touches[0].pageX,this.mouseY=e.touches[0].pageY):(this.mouseX=e.pageX,this.mouseY=e.pageY),window.addEventListener("mousemove",this.mouseMove,{passive:!1}),window.addEventListener("touchmove",this.mouseTouch,{passive:!1}),window.addEventListener("mouseup",this.mouseUp,{passive:!0}),window.addEventListener("touchend",this.mouseUp,{passive:!0}),document.body.style.userSelect="none"}translate(e,t){const s=e-this.mouseX,a=t-this.mouseY;this.mouseX=e,this.mouseY=t;const i=this.preview.current.getBoundingClientRect();let n=aa.checkBound(this.state.panX,[i.left,i.right],[this.cutoutRect.left,this.cutoutRect.right],s),r=aa.checkBound(this.state.panY,[i.top,i.bottom],[this.cutoutRect.top,this.cutoutRect.bottom],a);this.positionAll(n,r,this.state.zoom)}mouseMove(e){e.preventDefault(),this.translate(e.pageX,e.pageY)}mouseTouch(e){if(e.preventDefault(),1==e.touches.length)return void this.translate(e.touches[0].pageX,e.touches[0].pageY);const[t,s]=e.touches,a=Math.sqrt((t.pageX-s.pageX)*(t.pageX-s.pageX)+(t.pageY-s.pageY)*(t.pageY-s.pageY));this.prevDistance||(this.prevDistance=a/this.state.zoom);let i=a/this.prevDistance;this.handleZoom(Math.max(this.minZoom,Math.min(this.maxZoom,i)))}mouseUp(e){window.removeEventListener("mousemove",this.mouseMove),window.removeEventListener("touchmove",this.mouseTouch),window.removeEventListener("mouseup",this.mouseUp),window.removeEventListener("touchend",this.mouseUp),document.body.style.userSelect="",this.positionAll(this.state.panX,this.state.panY,this.state.zoom)}render(){const e=`translate3d(${this.state.panX}px, ${this.state.panY}px, 0) scale(${this.state.zoom})`,s=`${this.state.originX}px ${this.state.originY}px`,a={top:this.originY-this.state.originY*this.state.zoom+"px",left:this.originX-this.state.originX*this.state.zoom+"px",width:this.imageWidth*this.state.zoom+"px",height:this.imageHeight*this.state.zoom+"px"};return t().createElement("div",{className:"cropper"},t().createElement("div",{className:"bounding-box",ref:this.boundingBox},t().createElement("img",{src:this.props.source,className:"preview",alt:"",style:{transform:e,transformOrigin:s},ref:this.preview,onLoad:this.initScaling}),t().createElement("div",{className:"cutout circle",ref:this.cutout}),t().createElement("div",{className:"overlay",style:a,ref:this.overlay})),t().createElement("div",{className:"zoom-wrapper"},t().createElement("input",{type:"range",className:"zoomer",step:"0.001",min:this.state.minZoom,max:this.state.maxZoom,value:this.state.zoom,onChange:this.onZoom})))}}class ia extends t().PureComponent{constructor(e){super(e),this.state={top:0,left:0,width:0,height:0,scale:1},this.handleSubmit=this.handleSubmit.bind(this),this.handleChange=this.handleChange.bind(this)}handleChange(e,t,s,a,i){this.setState({left:e,top:t,width:s,height:a,scale:i})}handleSubmit(){(0,vs.Id)(this.props.mime,this.props.avatar,this.state.left,this.state.top,this.state.width,this.state.height,this.state.scale).then((e=>{this.props.onSubmit(e.mime,e.blob,e.width,e.height)})).catch((e=>{this.props.onError(e)}))}render(){return t().createElement("div",{className:"panel-form"},t().createElement("div",{className:"panel-form-row"},t().createElement(aa,{source:this.props.avatar,onChange:this.handleChange})),t().createElement("div",{className:"dialog-buttons"},this.props.onCancel?t().createElement("button",{className:"secondary",onClick:this.props.onCancel},t().createElement(a.FormattedMessage,{id:"button_cancel",defaultMessage:[{type:0,value:"Cancel"}]})):null,t().createElement("button",{className:"primary",onClick:this.handleSubmit},t().createElement(a.FormattedMessage,{id:"button_ok",defaultMessage:[{type:0,value:"OK"}]}))))}}class na extends t().PureComponent{constructor(e){super(e),this.inputRef=t().createRef(),this.state={value:this.props.value,visible:!1},this.handleVisibility=this.handleVisibility.bind(this),this.handeTextChange=this.handeTextChange.bind(this),this.handleKeyDown=this.handleKeyDown.bind(this),this.handleEditingFinished=this.handleEditingFinished.bind(this)}componentDidMount(){this.props.autoFocus&&this.inputRef.current.focus()}handeTextChange(e){this.setState({value:e.target.value}),this.props.onChange&&this.props.onChange(e)}handleVisibility(e){e.preventDefault(),this.setState({visible:!this.state.visible})}handleKeyDown(e){27==e.keyCode?(this.setState({value:this.props.value,visible:!1}),this.props.onFinished&&this.props.onFinished()):13==e.keyCode&&this.handleEditingFinished()}handleEditingFinished(e){if(e){let t=e.currentTarget;setTimeout((e=>{t.contains(document.activeElement)||this.props.onFinished&&this.props.onFinished(this.state.value)}),0)}else this.props.onFinished&&this.props.onFinished(this.state.value.trim())}render(){return t().createElement("div",{tabIndex:"-1",className:"group-focus",onBlur:this.handleEditingFinished},t().createElement("input",{className:"with-visibility",type:this.state.visible?"text":"password",value:this.state.value,placeholder:this.props.placeholder,required:this.props.required?"required":"",autoFocus:this.props.autoFocus?"autoFocus":"",autoComplete:this.props.autoComplete,onChange:this.handeTextChange,onKeyDown:this.handleKeyDown,ref:this.inputRef}),t().createElement("span",{onClick:this.handleVisibility},t().createElement("i",{className:"material-icons clickable light-gray"},this.state.visible?"visibility":"visibility_off")))}}class ra extends t().Component{constructor(e){super(e),this.selfRef=t().createRef(),this.state={active:e.active,initialValue:e.value||"",value:e.value||""},this.handeTextChange=this.handeTextChange.bind(this),this.handleKeyDown=this.handleKeyDown.bind(this),this.handleStartEditing=this.handleStartEditing.bind(this),this.handleEditingFinished=this.handleEditingFinished.bind(this),this.handlePasswordFinished=this.handlePasswordFinished.bind(this)}componentDidUpdate(e,t){const s=this.props.value||"";t.initialValue==s||t.active||this.setState({initialValue:s,value:s})}handeTextChange(e){this.setState({value:e.target.value||""})}handleKeyDown(e){27===e.keyCode?this.setState({value:this.props.value,active:!1}):13===e.keyCode&&this.handleEditingFinished(e)}handleStartEditing(){this.props.readOnly||this.setState({active:!0},(e=>{this.selfRef.current&&this.selfRef.current.focus()}))}handleEditingFinished(e){const t=this.state.value.trim();!this.props.required||e.target.checkValidity()&&t?(this.setState({active:!1}),(t||this.props.value)&&t!==this.props.value&&this.props.onFinished(t)):this.setState({value:this.props.value,active:!1})}handlePasswordFinished(e){this.setState({active:!1}),e&&e!==this.props.value&&this.props.onFinished(e)}render(){if(!this.state.active){let e="password"==this.props.type?"••••••••":this.state.value,s="in-place-edit"+(this.props.readOnly?" disabled":"");return e||(e=this.props.placeholder,s+=" placeholder"),this.props.multiline&&1!=this.props.multiline||(s+=" short"),t().createElement("span",{className:s,onClick:this.handleStartEditing},t().createElement("span",null,e))}let e;const s={};return"password"==this.props.type?(e=na,s.onFinished=this.handlePasswordFinished):(this.props.multiline>1?(e="textarea",s.rows=this.props.multiline,s.className="inplace-edit"):(e="input",s.type=this.props.type||"text"),s.value=this.state.value,s.ref=this.selfRef,s.onChange=this.handeTextChange,s.onKeyDown=this.handleKeyDown,s.onBlur=this.handleEditingFinished),s.placeholder=this.props.placeholder,s.required=this.props.required?"required":"",s.autoComplete=this.props.autoComplete,s.autoFocus=!0,t().createElement(e,s,null)}}class oa extends t().Component{constructor(e){super(e),this.state={tags:this.props.tags||[],tagInput:"",activated:this.props.activated},this.handleTagInput=this.handleTagInput.bind(this),this.handleAddTag=this.handleAddTag.bind(this),this.handleRemoveTag=this.handleRemoveTag.bind(this),this.handleSubmit=this.handleSubmit.bind(this),this.handleCancel=this.handleCancel.bind(this)}static getDerivedStateFromProps(e,t){const s=e.tags||[];return ss(s,t.tags)||t.activated?null:{tags:s}}handleTagInput(e){if(this.setState({tagInput:e}),e.length>0){const t=e[e.length-1];'"'==e[0]?e.length>1&&'"'==t&&this.handleAddTag(e.substring(1,e.length-1)):","!=t&&" "!=t&&";"!=t&&'"'!=t||this.handleAddTag(e.substring(0,e.length-1).trim())}}handleAddTag(e){const t=this.props.tinode.getServerParam("maxTagCount",Gt.pM);if(e.length>0&&this.state.tags.length{i.push({user:t,invalid:t.lengths})})):(this.state.tags.map((e=>{i.push(t().createElement("span",{className:"badge",key:i.length},e))})),0==i.length&&(i=t().createElement("i",null,t().createElement(a.FormattedMessage,{id:"tags_not_found",defaultMessage:[{type:0,value:"No tags defined. Add some."}]})))),t().createElement("div",{className:"panel-form-column"},t().createElement("div",{className:"panel-form-row"},t().createElement("label",{className:"small"},this.props.title)),this.state.activated?t().createElement("div",null,t().createElement(a.FormattedMessage,{id:"tags_editor_no_tags",defaultMessage:[{type:0,value:"Add some tags"}]},(e=>t().createElement(Xs,{tinode:this.props.tinode,chips:i,avatarDisabled:!0,prompt:e,tabIndex:this.props.tabIndex,onEnter:this.handleAddTag,onFocusLost:this.handleAddTag,onCancel:this.handleCancel,onChipRemoved:this.handleRemoveTag,filterFunc:this.handleTagInput}))),this.props.onSubmit||this.props.onCancel?t().createElement("div",{id:"tag-manager-buttons",className:"dialog-buttons panel-form-row"},t().createElement("button",{className:"outline",onClick:this.handleCancel},t().createElement(a.FormattedMessage,{id:"button_cancel",defaultMessage:[{type:0,value:"Cancel"}]})),t().createElement("button",{className:"primary",onClick:this.handleSubmit},t().createElement(a.FormattedMessage,{id:"button_ok",defaultMessage:[{type:0,value:"OK"}]}))):null):t().createElement("div",{className:"quoted"},t().createElement("a",{href:"#",className:"flat-button",onClick:e=>{e.preventDefault(),this.setState({activated:!0})}},t().createElement("i",{className:"material-icons"},"edit")," ",t().createElement(a.FormattedMessage,{id:"title_manage_tags",defaultMessage:[{type:0,value:"Manage"}]})),t().createElement(t().Fragment,null,i)))}}class la extends t().Component{constructor(e){super(e);const t=this.props.tinode.getTopic(this.props.topic),s=t.getAccessMode();this.state={isMe:zt.Tinode.isMeTopicName(this.props.topic),owner:s&&s.isOwner(),fullName:t.public?t.public.fn:void 0,private:t.private?t.private.comment:null,description:t.public?t.public.note:void 0,avatar:(0,vs.PD)(t.public?t.public.photo:null),tags:t.tags()||[],newAvatar:null,newAvatarMime:null},this.previousOnTags=null,this.tnNewTags=this.tnNewTags.bind(this),this.handleFullNameUpdate=this.handleFullNameUpdate.bind(this),this.handleImageUpdated=this.handleImageUpdated.bind(this),this.handleAvatarCropped=this.handleAvatarCropped.bind(this),this.handleAvatarCropCancel=this.handleAvatarCropCancel.bind(this),this.uploadAvatar=this.uploadAvatar.bind(this),this.handlePrivateUpdate=this.handlePrivateUpdate.bind(this),this.handleDescriptionUpdate=this.handleDescriptionUpdate.bind(this),this.handleTagsUpdated=this.handleTagsUpdated.bind(this)}componentDidMount(){const e=this.props.tinode.getTopic(this.props.topic);this.previousOnTags=e.onTagsUpdated,e.onTagsUpdated=this.tnNewTags}componentWillUnmount(){this.props.tinode.getTopic(this.props.topic).onTagsUpdated=this.previousOnTags}tnNewTags(e){this.setState({tags:e})}handleFullNameUpdate(e){(e=e.trim().substring(0,Gt.S8))&&this.state.fullName!==e&&(this.setState({fullName:e}),this.props.onUpdateTopicDesc(this.props.topic,ts(e,null)))}handlePrivateUpdate(e){e=e.trim().substring(0,Gt.S8),this.state.private!==e&&(this.setState({private:e}),this.props.onUpdateTopicDesc(this.props.topic,null,e||zt.Tinode.DEL_CHAR))}handleDescriptionUpdate(e){(e=e.trim().substring(0,Gt.EI))&&(this.setState({description:e}),this.props.onUpdateTopicDesc(this.props.topic,ts(null,null,null,e)))}handleImageUpdated(e,t){this.setState({newAvatar:t,newAvatarMime:e}),t||(this.setState({avatar:null}),this.props.onUpdateTopicDesc(this.props.topic,ts(null,zt.Tinode.DEL_CHAR)))}handleAvatarCropped(e,t,s,a){const i=t?URL.createObjectURL(t):null;this.setState({avatar:i,newAvatar:null,newAvatarMime:null}),t&&this.uploadAvatar(e,t,s,a)}uploadAvatar(e,t,s,a){const i=e=>{let{mime:t,blob:s}=e;if(s.size>Gt.uv){this.props.tinode.getLargeFileHelper().upload(s).then((e=>this.props.onUpdateTopicDesc(this.props.topic,ts(null,e)))).catch((e=>this.props.onError(e.message,"err")))}else(0,vs.w8)(s).then((e=>{const s=(0,vs.PD)({data:e.bits,type:t});this.setState({source:s}),this.props.onUpdateTopicDesc(this.props.topic,ts(null,s))}))};s>Gt.IX||a>Gt.IX||s!=a?(0,vs.EA)(t,Gt.IX,Gt.IX,Gt.GQ,!0).then((e=>i(e))).catch((e=>this.props.onError(e.message,"err"))):i({mime:e,blob:t,width:s,height:a})}handleAvatarCropCancel(){this.setState({newAvatar:null,newAvatarMime:null})}handleTagsUpdated(e){ss(this.state.tags.slice(0),e.slice(0))||this.props.onUpdateTags(e)}render(){if(this.state.newAvatar)return t().createElement(ia,{avatar:this.state.newAvatar,mime:this.state.newAvatarMime,onSubmit:this.handleAvatarCropped,onCancel:this.handleAvatarCropCancel,onError:this.props.onError});const e=this.state.isMe||this.state.owner;return t().createElement(t().Fragment,null,t().createElement("div",{className:"panel-form-column"},t().createElement("center",null,t().createElement(zs,{tinode:this.props.tinode,avatar:this.state.avatar,readOnly:!e,uid:this.props.topic,title:this.state.fullName,onImageUpdated:this.handleImageUpdated,onError:this.props.onError})),this.state.isMe?t().createElement("div",{className:"group"},t().createElement("label",{className:"small"},t().createElement(a.FormattedMessage,{id:"label_your_name",defaultMessage:[{type:0,value:"Your name"}]})),t().createElement("div",null,t().createElement(a.FormattedMessage,{id:"full_name_prompt",defaultMessage:[{type:0,value:"Full name, e.g. John Doe"}]},(e=>t().createElement(ra,{placeholder:e,value:this.state.fullName,required:!0,onFinished:this.handleFullNameUpdate}))))):t().createElement(t().Fragment,null,t().createElement("div",{className:"group"},t().createElement("div",null,t().createElement("label",{className:"small"},t().createElement(a.FormattedMessage,{id:"label_topic_name",defaultMessage:[{type:0,value:"Name"}]}))),t().createElement("div",null,t().createElement(a.FormattedMessage,{id:"topic_name_editing_placeholder",defaultMessage:[{type:0,value:"Freeform name of the group"}]},(s=>t().createElement(ra,{placeholder:s,readOnly:!e,value:this.state.fullName,required:!0,onFinished:this.handleFullNameUpdate}))))),t().createElement("div",{className:"group"},t().createElement("div",null,t().createElement("label",{className:"small"},t().createElement(a.FormattedMessage,{id:"label_private",defaultMessage:[{type:0,value:"Private comment"}]}))),t().createElement("div",null,t().createElement(a.FormattedMessage,{id:"private_editing_placeholder",defaultMessage:[{type:0,value:"Visible to you only"}]},(e=>t().createElement(ra,{placeholder:e,value:this.state.private,onFinished:this.handlePrivateUpdate})))))),e||this.state.description?t().createElement("div",{className:"group"},t().createElement("div",null,t().createElement("label",{className:"small"},t().createElement(a.FormattedMessage,{id:"label_description",defaultMessage:[{type:0,value:"Description"}]}))),t().createElement("div",null,t().createElement(a.FormattedMessage,{id:"description_editing_placeholder",defaultMessage:[{type:0,value:"Description (optional)"}]},(s=>t().createElement(ra,{placeholder:s,readOnly:!e,value:this.state.description,multiline:2,onFinished:this.handleDescriptionUpdate}))))):null),e?t().createElement(t().Fragment,null,t().createElement("div",{className:"hr"}),t().createElement(a.FormattedMessage,{id:"title_tag_manager",defaultMessage:[{type:0,value:"Tags (search & discovery)"}]},(e=>t().createElement(oa,{tinode:this.props.tinode,title:e,activated:!1,tags:this.state.tags,onSubmit:this.handleTagsUpdated})))):null)}}class ca extends t().Component{constructor(e){super(e);const t=this.props.tinode.getTopic(this.props.topic),s=t.getAccessMode();this.state={isMe:"me"==this.props.topic,owner:s&&s.isOwner(),credentials:(t.getCredentials?t.getCredentials():null)||[],addCredActive:!1,addCredInvalid:!1,newCred:"",tags:[]},this.previousTagsUpdated=void 0,this.onTagsUpdated=this.onTagsUpdated.bind(this),this.handleTagsUpdated=this.handleTagsUpdated.bind(this),this.tnCredsUpdated=this.tnCredsUpdated.bind(this),this.handleCredChange=this.handleCredChange.bind(this),this.handleCredKeyDown=this.handleCredKeyDown.bind(this),this.handleCredEntered=this.handleCredEntered.bind(this)}componentDidUpdate(e){const t=this.props.tinode.getTopic(e.topic);t&&(t.onCredsUpdated=this.tnCredsUpdated,t.onTagsUpdated!=this.onTagsUpdated&&("grp"==t.getType()?(this.previousTagsUpdated=t.onTagsUpdated,t.onTagsUpdated=this.onTagsUpdated):this.previousTagsUpdated=void 0),this.state.topic!=e.topic&&this.setState({topic:e.topic}))}componentWillUnmount(){const e=this.props.tinode.getTopic(this.props.topic);e.onCredsUpdated=void 0,e.onTagsUpdated=this.previousTagsUpdated}tnCredsUpdated(e){this.setState({credentials:e||[]})}handleCredChange(e){this.setState({newCred:e.target.value,addCredInvalid:!1})}handleCredKeyDown(e){27===e.keyCode?this.setState({newCred:"",addCredActive:!1}):13===e.keyCode&&this.handleCredEntered(e)}handleCredEntered(e){const t=this.state.newCred.trim();if(!t)return void this.setState({addCredActive:!1,addCredInvalid:!1});let s,a=function(e){return e=e.trim(),/^(?:\+?(\d{1,3}))?[- (.]*(\d{3})[- ).]*(\d{3})[- .]*(\d{2})[- .]*(\d{2})?$/.test(e)?e.replace(/[- ().]*/,""):null}(t);a?s="tel":(a=function(e){return e=e.trim(),/^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$/.test(e)?e:null}(t),a&&(s="email")),s?(this.props.onCredAdd(s,a),this.setState({addCredActive:!1,newCred:""})):this.setState({addCredInvalid:!0})}onTagsUpdated(e){this.setState({tags:e}),this.previousTagsUpdated&&this.previousTagsUpdated!=this.onTagsUpdated&&this.previousTagsUpdated(e)}handleTagsUpdated(e){ss(this.state.tags.slice(0),e.slice(0))||this.props.onUpdateTagsRequest(this.props.topic,e)}render(){const e=[];return this.state.isMe&&this.state.credentials.map((s=>{e.push(t().createElement("div",{key:s.meth+":"+s.val+":"+s.done},s.meth,": ",t().createElement("tt",null,s.val),t().createElement("span",null," ",s.done?null:t().createElement("a",{href:"#",onClick:e=>{e.preventDefault(),this.props.onCredConfirm(s.meth,s.val)}},t().createElement(a.FormattedMessage,{id:"validate_credential_action",defaultMessage:[{type:0,value:"confirm"}]}))," ",t().createElement("a",{href:"#",onClick:e=>{e.preventDefault(),this.props.onCredDelete(s.meth,s.val)}},t().createElement("i",{className:"material-icons gray"},"delete_outline")))))})),t().createElement("div",{className:"scrollable-panel"},t().createElement(la,{tinode:this.props.tinode,topic:this.props.topic,onUpdateTopicDesc:this.props.onUpdateTopicDesc,onUpdateTags:this.handleTagsUpdated,onError:this.props.onError}),this.state.isMe?t().createElement(t().Fragment,null,t().createElement("div",{className:"hr"}),t().createElement("div",{className:"panel-form-column"},t().createElement("label",{className:"small"},t().createElement(a.FormattedMessage,{id:"label_user_contacts",defaultMessage:[{type:0,value:"Contacts:"}]})),t().createElement("div",{className:"quoted"},e,this.state.addCredActive?t().createElement(a.FormattedMessage,{id:"phone_or_email_prompt",defaultMessage:[{type:0,value:"Phone number or email"}]},(e=>t().createElement("input",{type:"text",value:this.state.value,className:this.state.addCredInvalid?"invalid":null,placeholder:e,required:"required",autoFocus:!0,onChange:this.handleCredChange,onKeyDown:this.handleCredKeyDown,onBlur:this.handleCredEntered}))):null,t().createElement("div",null,t().createElement("a",{href:"#",onClick:e=>{e.preventDefault(),this.setState({addCredActive:!0})}},t().createElement("i",{className:"material-icons"},"add"),t().createElement(a.FormattedMessage,{id:"button_add_another",defaultMessage:[{type:0,value:"Add another"}]})))))):null)}}const da=(0,a.defineMessages)({clear_messages:{id:"action_clear_messages",defaultMessage:[{type:0,value:"Clear Messages"}]},clear_messages_warning:{id:"clear_messages_warning",defaultMessage:[{type:0,value:"Are you sure you want to clear all messages? It cannot be undone."}]},delete_messages:{id:"action_delete_messages",defaultMessage:[{type:0,value:"Clear Messages for All"}]},delete_messages_warning:{id:"delete_messages_warning",defaultMessage:[{type:0,value:"Are you sure you want to delete all messages for everyone? It cannot be undone."}]},topic_delete:{id:"topic_delete",defaultMessage:[{type:0,value:"Delete Conversation"}]},topic_delete_warning:{id:"topic_delete_warning",defaultMessage:[{type:0,value:"Are you sure you want to delete this conversation? It cannot be undone."}]},leave_chat:{id:"action_leave_chat",defaultMessage:[{type:0,value:"Leave Conversation"}]},leave_chat_warning:{id:"leave_chat_warning",defaultMessage:[{type:0,value:"Are you sure you want to leave this conversation?"}]},block_contact:{id:"action_block_contact",defaultMessage:[{type:0,value:"Block Contact"}]},block_contact_warning:{id:"block_contact_warning",defaultMessage:[{type:0,value:"Are you sure you want to block this contact?"}]},report_chat:{id:"action_report_chat",defaultMessage:[{type:0,value:"Report Conversation"}]},report_chat_warning:{id:"report_chat_warning",defaultMessage:[{type:0,value:"Are you sure you want to block and report this conversation?"}]},other_user:{id:"label_other_user",defaultMessage:[{type:0,value:"Other"}]}});class ha extends t().PureComponent{constructor(e){super(e),this.handleDeleteTopic=this.handleDeleteTopic.bind(this),this.handleDeleteMessages=this.handleDeleteMessages.bind(this),this.handleLeave=this.handleLeave.bind(this),this.handleBlock=this.handleBlock.bind(this),this.handleReport=this.handleReport.bind(this)}handleDeleteTopic(e){e.preventDefault();const{formatMessage:t}=this.props.intl;this.props.onShowAlert(t(da.topic_delete),t(da.topic_delete_warning),(e=>this.props.onDeleteTopic(this.props.topic)),null,!0,null)}handleDeleteMessages(e){e.preventDefault();const{formatMessage:t}=this.props.intl;this.props.onShowAlert(t(this.props.deleter?da.delete_messages:da.clear_messages),t(this.props.deleter?da.delete_messages_warning:da.clear_messages_warning),(e=>this.props.onDeleteMessages(this.props.topic)),null,!0,null)}handleLeave(e){e.preventDefault();const{formatMessage:t}=this.props.intl;this.props.onShowAlert(t(da.leave_chat),t(da.leave_chat_warning),(e=>this.props.onLeaveTopic(this.props.topic)),null,!0,null)}handleBlock(e){e.preventDefault();const{formatMessage:t}=this.props.intl;this.props.onShowAlert(t(da.block_contact),t(da.block_contact_warning),(e=>this.props.onBlockTopic(this.props.topic)),null,!0,null)}handleReport(e){e.preventDefault();const{formatMessage:t}=this.props.intl;this.props.onShowAlert(t(da.report_chat),t(da.report_chat_warning),(e=>{this.props.onReportTopic(this.props.topic)}),null,!0,null)}render(){const{formatMessage:e}=this.props.intl;return t().createElement("div",{className:"scrollable-panel"},t().createElement("div",{className:"panel-form-column"},this.props.channel?null:t().createElement("a",{href:"#",className:"flat-button",onClick:this.handleDeleteMessages},t().createElement("i",{className:"material-icons"},"delete_outline")," ",e(this.props.deleter?da.delete_messages:da.clear_messages)),this.props.owner?t().createElement("a",{href:"#",className:"danger flat-button",onClick:this.handleDeleteTopic},t().createElement("i",{className:"material-icons"},"delete")," ",e(da.topic_delete)):t().createElement("a",{href:"#",className:"danger flat-button",onClick:this.handleLeave},t().createElement("i",{className:"material-icons"},"exit_to_app")," ",e(da.leave_chat)),this.props.groupTopic?null:t().createElement("a",{href:"#",className:"danger flat-button",onClick:this.handleBlock},t().createElement("i",{className:"material-icons"},"block")," ",e(da.block_contact)),this.props.owner?null:t().createElement("a",{href:"#",className:"danger flat-button",onClick:this.handleReport},t().createElement("i",{className:"material-icons"},"report")," ",e(da.report_chat))),t().createElement("div",{className:"hr"}),t().createElement("div",{className:"panel-form-column"},this.props.groupTopic?t().createElement(t().Fragment,null,t().createElement("div",{className:"group"},t().createElement("label",null,t().createElement(a.FormattedMessage,{id:"label_your_permissions",defaultMessage:[{type:0,value:"Your permissions:"}]}))," ",t().createElement("tt",{className:"clickable",onClick:e=>{e.preventDefault(),this.props.onLaunchPermissionsEditor("want")}},this.props.access)),this.props.channel?null:t().createElement("div",{className:"group"},t().createElement("div",null,t().createElement("label",{className:"small"},t().createElement(a.FormattedMessage,{id:"label_default_access_mode",defaultMessage:[{type:0,value:"Default access mode:"}]}))),t().createElement("div",{className:"quoted"},t().createElement("div",null,"Auth: ",t().createElement("tt",{className:this.props.owner?"clickable":null,onClick:e=>{e.preventDefault(),this.props.owner&&this.props.onLaunchPermissionsEditor("auth")}},this.props.auth)),t().createElement("div",null,"Anon: ",t().createElement("tt",{className:this.props.owner?"clickable":null,onClick:e=>{e.preventDefault(),this.props.owner&&this.props.onLaunchPermissionsEditor("anon")}},this.props.anon))))):t().createElement("div",{className:"group"},t().createElement("div",null,t().createElement("label",{className:"small"},t().createElement(a.FormattedMessage,{id:"label_permissions",defaultMessage:[{type:0,value:"Permissions:"}]}))),t().createElement("div",{className:"quoted"},t().createElement("div",null,t().createElement(a.FormattedMessage,{id:"label_you",defaultMessage:[{type:0,value:"You:"}]})," ",t().createElement("tt",{className:"clickable",onClick:e=>{e.preventDefault(),this.props.onLaunchPermissionsEditor("want")}},this.props.access)),t().createElement("div",null,this.props.fullName?this.props.fullName:e(da.other_user),": ",t().createElement("tt",{className:"clickable",onClick:e=>{e.preventDefault(),this.props.onLaunchPermissionsEditor("given")}},this.props.modeGiven2))))))}}const pa=(0,a.injectIntl)(ha),ua=(0,a.defineMessages)({info:{id:"panel_title_info",defaultMessage:[{type:0,value:"Info"}]},general:{id:"panel_title_general",defaultMessage:[{type:0,value:"General"}]},security:{id:"panel_title_security",defaultMessage:[{type:0,value:"Security"}]},members:{id:"panel_title_members",defaultMessage:[{type:0,value:"Members"}]},crop:{id:"panel_title_crop",defaultMessage:[{type:0,value:"Drag to Adjust"}]},perm_want:{id:"requested_permissions",defaultMessage:[{type:0,value:"Requested"}]},perm_given:{id:"granted_permissions",defaultMessage:[{type:0,value:"Granted"}]},perm_auth:{id:"permissions_authenticated",defaultMessage:[{type:0,value:"Authenticated"}]},perm_anon:{id:"permissions_anonymous",defaultMessage:[{type:0,value:"Anonymous"}]},perm_user:{id:"permissions_user",defaultMessage:[{type:0,value:"User's Permissions"}]},edit_permissions:{id:"menu_item_edit_permissions",defaultMessage:[{type:0,value:"Edit permissions"}]}});class ma extends t().Component{constructor(e){super(e),this.state={topic:null,owner:!1,admin:!1,sharer:!1,deleter:!1,muted:!1,address:null,groupTopic:void 0,channel:void 0,fullName:void 0,description:void 0,avatar:null,private:null,selectedContact:null,access:null,modeGiven:null,modeWant:null,modeGiven2:null,modeWant2:null,auth:null,anon:null,contactList:[],trustedBadges:[],previousMetaDesc:void 0,previousSubsUpdated:void 0},this.resetSubs=this.resetSubs.bind(this),this.resetDesc=this.resetDesc.bind(this),this.resetTags=this.resetTags.bind(this),this.onMetaDesc=this.onMetaDesc.bind(this),this.onSubsUpdated=this.onSubsUpdated.bind(this),this.handleImageChanged=this.handleImageChanged.bind(this),this.handleMuted=this.handleMuted.bind(this),this.handleUnarchive=this.handleUnarchive.bind(this),this.handlePermissionsChanged=this.handlePermissionsChanged.bind(this),this.handleLaunchPermissionsEditor=this.handleLaunchPermissionsEditor.bind(this),this.handleShowAddMembers=this.handleShowAddMembers.bind(this),this.handleMemberUpdateRequest=this.handleMemberUpdateRequest.bind(this),this.handleMemberSelected=this.handleMemberSelected.bind(this),this.handleContextMenu=this.handleContextMenu.bind(this),this.handleBackNavigate=this.handleBackNavigate.bind(this)}componentDidUpdate(e){const t=this.props.tinode.getTopic(e.topic);t&&(this.onMetaDesc!=t.onMetaDesc&&(this.previousMetaDesc=t.onMetaDesc,t.onMetaDesc=this.onMetaDesc,this.previousSubsUpdated=t.onSubsUpdated,t.onSubsUpdated=this.onSubsUpdated),this.state.topic!=e.topic&&(this.setState({topic:e.topic}),this.resetDesc(t,e),this.resetSubs(t,e),this.resetTags(t)))}componentWillUnmount(){const e=this.props.tinode.getTopic(this.props.topic);e&&(this.setState({topic:null}),e.onMetaDesc=this.previousMetaDesc,e.onSubsUpdated=this.previousSubsUpdated)}resetSubs(e,t){const s={contactList:[]};if("p2p"==e.getType()){const a=e.subscriber(t.topic);a?(s.modeGiven2=a.acs.getGiven(),s.modeWant2=a.acs.getWant()):(s.modeGiven2=Gt.xt,s.modeWant2=Gt.xt)}else e.subscribers((e=>{s.contactList.push(e)}),this);this.setState(s)}resetDesc(e,t){const s=e.getDefaultAccess()||{},a=e.getAccessMode(),i=[];if(e.trusted)for(const[t,s]of Object.entries(e.trusted))s&&i.push(t);this.setState({owner:a&&a.isOwner(),admin:a&&a.isAdmin(),sharer:a&&a.isSharer(),deleter:a&&a.isDeleter(),muted:a&&a.isMuted(),fullName:os(e.public&&e.public.fn,Gt.S8),description:os(e.public&&e.public.note,Gt.EI),avatar:(0,vs.PD)(e.public?e.public.photo:null),trustedBadges:i,private:os(e.private&&e.private.comment,Gt.S8),archived:e.isArchived(),address:e.name,groupTopic:e.isGroupType(),channel:e.isChannelType()||e.chan,access:a?a.getMode():void 0,modeGiven:a?a.getGiven():void 0,modeWant:a?a.getWant():void 0,auth:s.auth,anon:s.anon})}resetTags(e){if("grp"!=e.getType())return;const t=e.getAccessMode();t&&t.isOwner()&&e.getMeta(e.startMetaQuery().withTags().build())}onMetaDesc(e){const t=this.props.tinode.getTopic(this.props.topic);t&&(this.resetDesc(t,this.props),this.previousMetaDesc&&this.previousMetaDesc!=this.onMetaDesc&&this.previousMetaDesc(e))}onSubsUpdated(e){const t=this.props.tinode.getTopic(this.props.topic);t&&(this.resetSubs(t,this.props),this.previousSubsUpdated&&this.previousSubsUpdated!=this.onSubsUpdated&&this.previousSubsUpdated(e))}handleImageChanged(e,t){this.setState({avatar:t}),this.props.onTopicDescUpdate(this.props.topic,ts(null,t||zt.Tinode.DEL_CHAR),null)}handleMuted(e,t){this.setState({muted:t}),this.props.onChangePermissions(this.props.topic,t?"-P":"+P")}handleUnarchive(e,t){this.props.onTopicUnArchive(this.props.topic)}handlePermissionsChanged(e,t){switch(e){case"auth":this.props.onTopicDescUpdateRequest(this.props.topic,null,null,{auth:t});break;case"anon":this.props.onTopicDescUpdateRequest(this.props.topic,null,null,{anon:t});break;case"mode":case"want":this.props.onChangePermissions(this.props.topic,t);break;case"given":this.props.onChangePermissions(this.props.topic,t,this.props.topic);break;case"user":this.props.onChangePermissions(this.props.topic,t,this.state.userPermissionsEdited)}this.handleBackNavigate()}handleLaunchPermissionsEditor(e,t){const{formatMessage:s}=this.props.intl;let a,i,n,r,o,l,c;switch(e){case"mode":a=this.state.access;break;case"want":a=this.state.modeWant,i=this.state.modeGiven,this.state.owner?n="O":(n=zt.AccessMode.encode(zt.AccessMode.diff("ASDO",this.state.modeGiven)),this.state.channel&&(n+="W")),r=s(ua.perm_want),o=s(ua.perm_given);break;case"given":a=this.state.modeGiven2,i=this.state.modeWant2,n=this.state.groupTopic?this.state.owner?"":"O":"ASDO",r=s(ua.perm_given),o=s(ua.perm_want);break;case"auth":a=this.state.auth,n="O";break;case"anon":a=this.state.anon,n="O";break;case"user":{const e=this.props.tinode.getTopic(this.props.topic);if(!e)return;const d=e.subscriber(t);if(!d||!d.acs)return;a=d.acs.getGiven(),i=d.acs.getWant(),n=this.state.owner?"":"O",r=s(ua.perm_given),o=s(ua.perm_want),d.public&&(l=d.public.fn,c=d.public.photo);break}default:return void console.error("Unknown permission editing mode '"+e+"'")}this.setState({userPermissionsEdited:t,userPermissionsTitle:l,userPermissionsAvatar:c,editedPermissions:a,immutablePermissions:i,editedPermissionsTitle:r,immutablePermissionsTitle:o,editedPermissionsSkipped:n}),this.props.onNavigate(`perm/${e}`)}handleShowAddMembers(e){e.preventDefault(),this.props.onInitFind(),this.props.onNavigate("members")}handleMemberUpdateRequest(e,t,s){this.props.onMemberUpdateRequest(this.props.topic,t,s),this.props.onNavigate("info")}handleMemberSelected(e){this.setState({selectedContact:e})}handleBackNavigate(){const e=(this.props.panel||"info").split("/");"info"==e[0]?this.props.onNavigate(null):"perm"==e[0]?"user"==e[1]?this.props.onNavigate("info"):this.props.onNavigate("security"):this.props.onNavigate("info")}handleContextMenu(e){const{formatMessage:t}=this.props.intl,s=this.props.tinode.getTopic(this.props.topic);if(!s)return;const a=s.subscriber(e.topicName);if(!a||!a.acs)return;const i=this.props.tinode.isMe(e.topicName),n=[{title:t(ua.edit_permissions),handler:t=>this.handleLaunchPermissionsEditor(i?"want":"user",e.topicName)}];i||n.push("member_delete"),n.push(a.acs.isMuted()?"member_unmute":"member_mute"),i||n.push(a.acs.isJoiner()?"member_block":"member_unblock"),this.props.showContextMenu({topicName:this.props.topic,x:e.x,y:e.y,user:e.topicName},n)}render(){const e=(this.props.panel||"info").split("/"),s=e[0];e.shift();const{formatMessage:i}=this.props.intl,n=i(("perm"==s?ua["perm_"+e[0]]:ua[s])||ua.info);return t().createElement("div",{id:"info-view"},t().createElement("div",{className:"caption-panel",id:"info-caption-panel"},t().createElement("div",{className:"panel-title",id:"info-title"},n),t().createElement("div",null,t().createElement(Gs,{onCancel:this.handleBackNavigate}))),this.props.displayMobile?t().createElement($s,{level:this.props.errorLevel,text:this.props.errorText,onClearError:this.props.onError}):null,"members"==s?t().createElement(Zs,{tinode:this.props.tinode,members:this.state.contactList,requiredMember:this.props.myUserId,keepInitialMembers:!this.state.admin&&!this.state.owner,myUserId:this.props.myUserId,contacts:this.props.searchableContacts,onCancel:this.handleBackNavigate,onSubmit:this.handleMemberUpdateRequest}):"perm"==s&&e.length>0?t().createElement(sa,{tinode:this.props.tinode,mode:this.state.editedPermissions,compare:this.state.immutablePermissions,skip:this.state.editedPermissionsSkipped,modeTitle:this.state.editedPermissionsTitle,compareTitle:this.state.immutablePermissionsTitle,userTitle:this.state.userPermissionsTitle,item:this.state.userPermissionsEdited,userAvatar:this.state.userPermissionsAvatar,onSubmit:t=>this.handlePermissionsChanged(e[0],t),onCancel:this.handleBackNavigate}):"general"==s?t().createElement(ca,{tinode:this.props.tinode,topic:this.props.topic,onCredAdd:this.props.onCredAdd,onUpdateTagsRequest:this.props.onTopicTagsUpdateRequest,onCredConfirm:this.props.onCredConfirm,onCredDelete:this.props.onCredDelete,onUpdateTopicDesc:this.props.onTopicDescUpdateRequest,onError:this.props.onError}):"security"==s?t().createElement(pa,{topic:this.props.topic,owner:this.state.owner,admin:this.state.admin,sharer:this.state.sharer,deleter:this.state.deleter,muted:this.state.muted,groupTopic:this.state.groupTopic,channel:this.state.channel,access:this.state.access,modeGiven:this.state.modeGiven,modeWant:this.state.modeWant,modeGiven2:this.state.modeGiven2,modeWant2:this.state.modeWant2,auth:this.state.auth,anon:this.state.anon,onShowAlert:this.props.onShowAlert,onDeleteMessages:this.props.onDeleteMessages,onLeaveTopic:this.props.onLeaveTopic,onBlockTopic:this.props.onBlockTopic,onReportTopic:this.props.onReportTopic,onLaunchPermissionsEditor:this.handleLaunchPermissionsEditor,onNavigate:this.props.onNavigate}):t().createElement("div",{id:"info-view-content",className:"scrollable-panel"},t().createElement("div",{className:"panel-form-column"},t().createElement("a",{href:"#",className:"flat-button float-right",onClick:e=>{e.preventDefault(),this.props.onNavigate("general")}},t().createElement("i",{className:"material-icons"},"edit")," ",t().createElement(a.FormattedMessage,{id:"button_edit",defaultMessage:[{type:0,value:"Edit"}]})),t().createElement("center",null,t().createElement(zs,{tinode:this.props.tinode,avatar:this.state.avatar,readOnly:!0,uid:this.props.topic,title:this.state.fullName})),t().createElement("div",{className:"group"},t().createElement("div",null,t().createElement("label",{className:"small"},t().createElement(a.FormattedMessage,{id:"label_topic_name",defaultMessage:[{type:0,value:"Name"}]}))),t().createElement("div",{className:"large ellipsized"},this.state.fullName,this.state.channel?t().createElement("img",{src:"/img/channel.png",className:"channel",alt:"channel"}):null)),this.state.private?t().createElement("div",{className:"group"},t().createElement("div",null,t().createElement("label",{className:"small"},t().createElement(a.FormattedMessage,{id:"label_private",defaultMessage:[{type:0,value:"Private comment"}]}))),t().createElement("div",{className:"large ellipsized"},this.state.private)):null,t().createElement("div",{className:"group"},t().createElement("label",{className:"small"},t().createElement(a.FormattedMessage,{id:"label_user_id",defaultMessage:[{type:0,value:"ID:"}]}))," ",t().createElement("tt",null,this.state.address)),t().createElement("div",{className:"group"},t().createElement(js,{trustedBadges:this.state.trustedBadges})),this.state.description?t().createElement("div",{className:"group"},t().createElement("label",{className:"small"},t().createElement(a.FormattedMessage,{id:"label_description",defaultMessage:[{type:0,value:"Description"}]})),t().createElement("div",null,this.state.description)):null),t().createElement("div",{className:"hr"}),t().createElement("div",{className:"panel-form-row"},t().createElement("label",null,t().createElement(a.FormattedMessage,{id:"label_muting_topic",defaultMessage:[{type:0,value:"Muted:"}]})),t().createElement(Ks,{name:"P",checked:this.state.muted,onChange:this.handleMuted})),this.state.archived?t().createElement("div",{className:"panel-form-row"},t().createElement("label",null,t().createElement(a.FormattedMessage,{id:"label_unarchive_topic",defaultMessage:[{type:0,value:"Archived:"}]})),t().createElement(Ks,{name:"archived",checked:!0,onChange:this.handleUnarchive})):null,t().createElement("div",{className:"hr"}),t().createElement("div",{className:"panel-form-row"},t().createElement("a",{href:"#",className:"flat-button",onClick:e=>{e.preventDefault(),this.props.onNavigate("security")}},t().createElement("i",{className:"material-icons"},"security")," ",t().createElement(a.FormattedMessage,{id:"button_security",defaultMessage:[{type:0,value:"Security"}]}))),this.state.groupTopic&&this.state.sharer?t().createElement(t().Fragment,null,t().createElement("div",{className:"hr"}),t().createElement("div",{className:"panel-form-row"},t().createElement("label",{className:"small"},t().createElement(a.FormattedMessage,{id:"label_group_members",defaultMessage:[{type:0,value:"Group members:"}]}))),t().createElement("div",{className:"panel-form-row"},t().createElement("a",{href:"#",className:"flat-button",onClick:this.handleShowAddMembers},t().createElement("i",{className:"material-icons"},"person_add")," ",t().createElement(a.FormattedMessage,{id:"button_add_members",defaultMessage:[{type:0,value:"Add members"}]}))),t().createElement(a.FormattedMessage,{id:"group_has_no_members",defaultMessage:[{type:0,value:"No members"}]},(e=>t().createElement(Fs,{tinode:this.props.tinode,contacts:this.state.contactList,myUserId:this.props.myUserId,emptyListMessage:e,topicSelected:this.state.selectedContact,showOnline:!1,showUnread:!1,showMode:!0,noScroll:!0,onTopicSelected:this.handleMemberSelected,showContextMenu:!!this.state.admin&&this.handleContextMenu})))):null))}}const ga=(0,a.injectIntl)(ma),fa=new Audio("audio/call-out.m4a");fa.loop=!0;const va=new Audio("audio/call-end.m4a");va.loop=!0;const ba=new Audio("audio/dialing.m4a"),Ea="video:muted",ya="video:unmuted",Ca=(0,a.defineMessages)({already_in_call:{id:"already_in_call",defaultMessage:[{type:0,value:"You already in an ongoing call!"}]}});class wa extends t().PureComponent{constructor(e){super(e),this.state={localStream:void 0,remoteStream:void 0,pc:void 0,dataChannel:void 0,previousOnInfo:void 0,waitingForPeer:!1,callInitialSetupComplete:!1,audioOnly:e.callAudioOnly,videoToggleInProgress:!1,remoteVideoLive:!1},this.localStreamConstraints={audio:!0,video:!e.callAudioOnly},this.isOutgoingCall=1==e.callState,this.localRef=t().createRef(),this.remoteRef=t().createRef(),this.remoteIceCandidatesCache=[],this.onInfo=this.onInfo.bind(this),this.start=this.start.bind(this),this.stop=this.stop.bind(this),this.createPeerConnection=this.createPeerConnection.bind(this),this.canSendOffer=this.canSendOffer.bind(this),this.drainRemoteIceCandidatesCache=this.drainRemoteIceCandidatesCache.bind(this),this.handleNegotiationNeededEvent=this.handleNegotiationNeededEvent.bind(this),this.handleICECandidateEvent=this.handleICECandidateEvent.bind(this),this.handleNewICECandidateMsg=this.handleNewICECandidateMsg.bind(this),this.handleICEConnectionStateChangeEvent=this.handleICEConnectionStateChangeEvent.bind(this),this.handleSignalingStateChangeEvent=this.handleSignalingStateChangeEvent.bind(this),this.handleICEGatheringStateChangeEvent=this.handleICEGatheringStateChangeEvent.bind(this),this.handleIceCandidateErrorEvent=this.handleIceCandidateErrorEvent.bind(this),this.handleTrackEvent=this.handleTrackEvent.bind(this),this.handleVideoOfferMsg=this.handleVideoOfferMsg.bind(this),this.handleVideoAnswerMsg=this.handleVideoAnswerMsg.bind(this),this.handleNewICECandidateMsg=this.handleNewICECandidateMsg.bind(this),this.reportError=this.reportError.bind(this),this.handleGetUserMediaError=this.handleGetUserMediaError.bind(this),this.stopTracks=this.stopTracks.bind(this),this.disconnectMedia=this.disconnectMedia.bind(this),this.handleCloseClick=this.handleCloseClick.bind(this),this.handleToggleCameraClick=this.handleToggleCameraClick.bind(this),this.handleToggleMicClick=this.handleToggleMicClick.bind(this),this.handleRemoteHangup=this.handleRemoteHangup.bind(this),this.handleVideoCallAccepted=this.handleVideoCallAccepted.bind(this),this.muteVideo=this.muteVideo.bind(this),this.unmuteVideo=this.unmuteVideo.bind(this),this.emptyVideoTrack=this.emptyVideoTrack.bind(this),this.handleDataChannelEvent=this.handleDataChannelEvent.bind(this),this.handleDataChannelError=this.handleDataChannelError.bind(this),this.handleDataChannelMessage=this.handleDataChannelMessage.bind(this),this.handleDataChannelOpen=this.handleDataChannelOpen.bind(this),this.handleDataChannelClose=this.handleDataChannelClose.bind(this)}componentDidMount(){const e=this.props.tinode.getTopic(this.props.topic);this.previousOnInfo=e.onInfo,e.onInfo=this.onInfo,1!=this.props.callState&&3!=this.props.callState||!this.localRef.current||this.start()}componentWillUnmount(){this.props.tinode.getTopic(this.props.topic).onInfo=this.previousOnInfo,this.stop()}handleVideoCallAccepted(e){fa.pause();const t=this.createPeerConnection(),s=this.state.localStream;s.getTracks().forEach((e=>{t.addTrack(e,s),"video"==e.kind&&this.state.audioOnly&&(e.enabled=!1,e.stop(),s.removeTrack(e))}))}onInfo(e){if("call"==e.what)switch(e.event){case"accept":this.handleVideoCallAccepted(e);break;case"answer":this.handleVideoAnswerMsg(e);break;case"ice-candidate":this.handleNewICECandidateMsg(e);break;case"hang-up":this.handleRemoteHangup(e);break;case"offer":this.handleVideoOfferMsg(e);break;case"ringing":fa.play().catch((e=>{}));break;default:console.warn("Unknown call event",e.event)}}emptyVideoTrack(){const e=Object.assign(document.createElement("canvas"),{width:640,height:480});e.getContext("2d").fillRect(0,0,640,480);const t=e.captureStream(0);return Object.assign(t.getVideoTracks()[0],{enabled:!1})}start(){this.state.localStream?this.props.onError(this.props.intl.formatMessage(Ca.already_in_call),"info"):3!=this.props.callState?navigator.mediaDevices.getUserMedia(this.localStreamConstraints).then((e=>{this.localStreamConstraints.video||e.addTrack(this.emptyVideoTrack()),this.setState({localStream:e,waitingForPeer:!0}),this.localRef.current.srcObject=e,ba.play(),this.props.onInvite(this.props.topic,this.props.seq,this.props.callState,this.props.callAudioOnly)})).catch(this.handleGetUserMediaError):this.props.onInvite(this.props.topic,this.props.seq,3,this.props.callAudioOnly)}stop(){va.pause(),va.currentTime=0,fa.pause(),fa.currentTime=0,this.stopTracks(this.state.localStream),this.stopTracks(this.state.remoteStream),this.disconnectMedia(this.localRef.current),this.disconnectMedia(this.remoteRef.current),this.state.pc&&(this.state.pc.ontrack=null,this.state.pc.onremovetrack=null,this.state.pc.onremovestream=null,this.state.pc.onicecandidate=null,this.state.pc.oniceconnectionstatechange=null,this.state.pc.onsignalingstatechange=null,this.state.pc.onicegatheringstatechange=null,this.state.pc.onnegotiationneeded=null,this.state.pc.onicecandidateerror=null,this.state.pc.ondatachannel=null,this.state.dataChannel&&this.state.dataChannel.close(),this.state.pc.close()),this.setState({pc:null,waitingForPeer:!1})}disconnectMedia(e){e&&(e.srcObject=null,e.src="")}stopTracks(e){if(!e)return;let t=e.getTracks();t&&t.forEach((e=>{e.stop(),e.enabled=!1}))}handleDataChannelError(e){console.error("data channel error",e)}handleDataChannelMessage(e){switch(e.data){case Ea:this.setState({remoteVideoLive:!1},(e=>{this.remoteRef.current.srcObject=this.state.remoteStream}));break;case ya:this.setState({remoteVideoLive:!0},(e=>{this.remoteRef.current.srcObject=this.state.remoteStream}))}}handleDataChannelOpen(e){this.state.audioOnly||e.target.send(ya)}handleDataChannelClose(){}handleDataChannelEvent(e){const t=e.channel;t.onerror=this.handleDataChannelError,t.onmessage=this.handleDataChannelMessage,t.onopen=this.handleDataChannelOpen,t.onclose=this.handleDataChannelClose,this.setState({dataChannel:t})}createPeerConnection(){const e=this.props.tinode.getServerParam("iceServers",null),t=e?new RTCPeerConnection({iceServers:e}):new RTCPeerConnection;t.onicecandidate=this.handleICECandidateEvent,t.oniceconnectionstatechange=this.handleICEConnectionStateChangeEvent,t.onicegatheringstatechange=this.handleICEGatheringStateChangeEvent,t.onsignalingstatechange=this.handleSignalingStateChangeEvent,t.onnegotiationneeded=this.handleNegotiationNeededEvent,t.onicecandidateerror=this.handleIceCandidateErrorEvent,t.ontrack=this.handleTrackEvent,t.ondatachannel=this.handleDataChannelEvent;const s=t.createDataChannel("events",{ordered:!0});return s.onerror=this.handleDataChannelError,s.onmessage=this.handleDataChannelMessage,s.onopen=this.handleDataChannelOpen,s.onclose=this.handleDataChannelClose,this.setState({pc:t,dataChannel:s,waitingForPeer:!1}),t}handleVideoAnswerMsg(e){const t=new RTCSessionDescription(e.payload);this.state.pc.setRemoteDescription(t).then((e=>{this.setState({callInitialSetupComplete:!0},(e=>this.drainRemoteIceCandidatesCache()))})).catch((e=>this.reportError(e)))}reportError(e){this.props.onError(e.message,"err")}canSendOffer(){return this.isOutgoingCall||this.state.callInitialSetupComplete}handleNegotiationNeededEvent(e){const t=e.target;this.canSendOffer()&&t.createOffer().then((e=>t.setLocalDescription(e))).then((e=>{this.props.onSendOffer(this.props.topic,this.props.seq,t.localDescription.toJSON())})).catch((e=>this.reportError(e)))}handleIceCandidateErrorEvent(e){console.warn("ICE candidate error:",e)}handleICECandidateEvent(e){e.candidate&&this.props.onIceCandidate(this.props.topic,this.props.seq,e.candidate.toJSON())}handleNewICECandidateMsg(e){const t=new RTCIceCandidate(e.payload);this.state.callInitialSetupComplete?this.state.pc.addIceCandidate(t).catch((e=>{t.candidate&&this.reportError(e),console.warn("Error adding new ice candidate",t,e)})):this.remoteIceCandidatesCache.push(t)}drainRemoteIceCandidatesCache(){this.remoteIceCandidatesCache.forEach((e=>{this.state.pc.addIceCandidate(e).catch((t=>{e.candidate&&this.reportError(t),console.warn("Error adding cached ice candidate",e,t)}))})),this.remoteIceCandidatesCache=[]}handleICEConnectionStateChangeEvent(e){switch(e.target.iceConnectionState){case"closed":case"failed":this.handleCloseClick()}}handleSignalingStateChangeEvent(e){"closed"==e.target.signalingState&&this.handleCloseClick()}handleICEGatheringStateChangeEvent(e){}handleTrackEvent(e){this.remoteRef.current.srcObject=e.streams[0],this.setState({remoteStream:e.streams[0]})}handleGetUserMediaError(e){switch(console.error("Error opening camera and/or microphone",e),e.name){case"NotFoundError":default:this.reportError(e);case"SecurityError":case"PermissionDeniedError":}this.handleCloseClick()}handleVideoOfferMsg(e){let t=null;const s=this.state.pc?this.state.pc:this.createPeerConnection(),a=new RTCSessionDescription(e.payload);s.setRemoteDescription(a).then((e=>navigator.mediaDevices.getUserMedia(this.localStreamConstraints))).then((e=>{let a;this.localStreamConstraints.video||(a=this.emptyVideoTrack(),e.addTrack(a)),t=e,this.localRef.current.srcObject=e,this.setState({localStream:e}),t.getTracks().forEach((e=>{s.addTrack(e,t)})),a&&(a.enabled=!1,a.stop(),e.removeTrack(a))})).then((e=>s.createAnswer())).then((e=>s.setLocalDescription(e))).then((e=>{this.props.onSendAnswer(this.props.topic,this.props.seq,s.localDescription.toJSON()),this.setState({callInitialSetupComplete:!0},(e=>this.drainRemoteIceCandidatesCache()))})).catch(this.handleGetUserMediaError)}handleRemoteHangup(){this.state.waitingForPeer?(this.setState({waitingForPeer:!1}),fa.pause(),fa.currentTime=0,va.loop=!0,va.play().catch((e=>{})),setTimeout((e=>{this.handleCloseClick()}),2e3)):this.handleCloseClick()}handleCloseClick(){this.stop(),this.props.onHangup(this.props.topic,this.props.seq)}muteVideo(){if(!this.state.pc||!this.state.dataChannel)return;const e=this.state.localStream,t=e.getVideoTracks()[0];t.enabled=!1,t.stop(),e.removeTrack(t),this.state.dataChannel.send(Ea),this.setState({videoToggleInProgress:!1})}unmuteVideo(){this.state.pc&&this.state.dataChannel&&navigator.mediaDevices.getUserMedia({video:!0}).then((e=>{this.localRef.current.srcObject=null;const t=this.state.pc.getSenders().find((e=>"video"==e.track.kind)),s=e.getVideoTracks()[0];return e.removeTrack(s),this.state.localStream.addTrack(s),t.replaceTrack(s)})).then((e=>{this.localRef.current.srcObject=this.state.localStream,this.state.dataChannel.send(ya)})).catch((e=>this.handleGetUserMediaError(e))).finally((e=>{this.setState({videoToggleInProgress:!1})}))}handleToggleCameraClick(){if(this.state.videoToggleInProgress)return;const e=this.state.localStream.getVideoTracks();this.setState({videoToggleInProgress:!0},(t=>{e&&e.length>0&&e[0].enabled&&"live"==e[0].readyState?this.muteVideo():this.unmuteVideo(),this.setState({audioOnly:!this.state.audioOnly})}))}handleToggleMicClick(){const e=this.state.localStream.getAudioTracks()[0];e.enabled=!e.enabled,this.forceUpdate()}render(){const e=this.state.localStream&&this.state.localStream.getAudioTracks(),s=!this.state.audioOnly&&this.state.localStream&&this.state.localStream.getVideoTracks(),i=!this.state.pc||!this.state.dataChannel||!(e&&e[0]),n=e&&e[0]&&e[0].enabled?"mic":"mic_off",r=s&&s[0]&&s[0].enabled&&"live"==s[0].readyState?"videocam":"videocam_off",o=os(this.props.title,Gt.gD),l=this.state.waitingForPeer?" pulse":"";let c=!1;if(this.remoteRef.current&&this.remoteRef.current.srcObject&&this.state.remoteVideoLive){const e=this.remoteRef.current.srcObject;if(e.getVideoTracks().length>0){const t=e.getVideoTracks()[0];c=t.enabled&&"live"==t.readyState}}return t().createElement(t().Fragment,null,t().createElement("div",{id:"video-container"},t().createElement("div",{id:"video-container-panel"},t().createElement("div",{className:"call-party self",disabled:this.state.audioOnly},t().createElement("video",{ref:this.localRef,autoPlay:!0,muted:!0,playsInline:!0}),t().createElement("div",{className:"caller-name inactive"},t().createElement(a.FormattedMessage,{id:"calls_you_label",defaultMessage:[{type:0,value:"You"}]}))),t().createElement("div",{className:"call-party peer",disabled:!c},c?t().createElement(t().Fragment,null,t().createElement("video",{ref:this.remoteRef,autoPlay:!0,playsInline:!0}),t().createElement("div",{className:"caller-name inactive"},o)):t().createElement(t().Fragment,null,t().createElement("audio",{ref:this.remoteRef,autoPlay:!0}),t().createElement("div",{className:`caller-card${l}`},t().createElement("div",{className:"avatar-box"},t().createElement(ls,{tinode:this.props.tinode,avatar:this.props.avatar,topic:this.props.topic,title:this.props.title})),t().createElement("div",{className:"caller-name"},o))))),t().createElement("div",{className:"controls"},t().createElement("button",{className:"danger",onClick:this.handleCloseClick},t().createElement("i",{className:"material-icons"},"call_end")),t().createElement("button",{className:"secondary",onClick:this.handleToggleCameraClick,disabled:i},t().createElement("i",{className:"material-icons"},r)),t().createElement("button",{className:"secondary",onClick:this.handleToggleMicClick,disabled:i},t().createElement("i",{className:"material-icons"},n)))))}}const Sa=(0,a.injectIntl)(wa);class Ma extends t().Component{constructor(e){super(e),this.state={downloader:null,progress:0},this.downloadFile=this.downloadFile.bind(this),this.handleCancel=this.handleCancel.bind(this)}downloadFile(e,t,s){if(!e)return void this.props.onError("Invalid download URL '"+e+"'");const a=this.props.tinode.getLargeFileHelper();this.setState({downloader:a}),a.download(e,t,s,(e=>this.setState({progress:e/this.props.size})),(e=>this.props.onError(e,"err"))).then((e=>this.setState({downloader:null,progress:0}))).catch((e=>{e&&this.props.onError("Error downloading file: "+e.message,"err"),this.setState({downloader:null,progress:0})}))}handleCancel(){this.props.uploading?this.props.onCancelUpload():this.state.downloader&&this.state.downloader.cancel()}render(){let e=this.props.filename||"file_attachment";e.length>36&&(e=e.substr(0,16)+"..."+e.substr(-16));let s,i,n=this.props.size>0?t().createElement("span",{className:"small gray"},"(",(0,Zt.FK)(this.props.size),")"):null;this.props.uploading||this.state.downloader||!function(e){return e&&!/^\s*([a-z][a-z0-9+.-]*:|\/\/)/im.test(e)}(this.props.downloadUrl)?(s=as(this.props.downloadUrl),i=null):(s="#",i=e=>{e.preventDefault(),this.downloadFile(this.props.downloadUrl,this.props.filename,this.props.mimetype)});const r=t().createElement(t().Fragment,null,t().createElement("i",{className:"material-icons"},"file_download")," ",t().createElement(a.FormattedMessage,{id:"save_attachment",defaultMessage:[{type:0,value:"save"}]}));return t().createElement("div",{className:"attachment"},t().createElement("div",null,t().createElement("i",{className:"material-icons big gray"},"insert_drive_file")),t().createElement("div",{className:"flex-column"},t().createElement("div",null,e," ",n),this.props.uploading||this.state.downloader?t().createElement(gs,{progress:this.props.uploading?this.props.progress:this.state.progress,onCancel:this.handleCancel}):t().createElement("div",null,s?t().createElement("a",{href:s,download:this.props.filename,onClick:i},r):t().createElement("span",{className:"light-gray"},r))))}}const _a=(0,a.defineMessages)({message_sending:{id:"message_sending",defaultMessage:[{type:0,value:"sending..."}]},message_sending_failed:{id:"message_sending_failed",defaultMessage:[{type:0,value:"failed"}]},message_edited_marker:{id:"message_edited_marker",defaultMessage:[{type:0,value:", edited"}]}});class Ta extends t().PureComponent{render(){const{formatMessage:e}=this.props.intl;let s;s=this.props.received<=zt.Tinode.MESSAGE_STATUS_SENDING?e(_a.message_sending):this.props.received==zt.Tinode.MESSAGE_STATUS_FAILED?e(_a.message_sending_failed):this.props.timestamp.toLocaleTimeString(this.props.intl.locale,{timeStyle:"short"});const a=ns(this.props.received),i=a?t().createElement("i",{className:"material-icons small "+a.color},a.name):null,n=this.props.edited?e(_a.message_edited_marker):null;return t().createElement("span",{className:"timestamp"},s,n," ",i)}}const ka=(0,a.injectIntl)(Ta);function Na(){return Na=Object.assign?Object.assign.bind():function(e){for(var t=1;tzt.Tinode.MESSAGE_STATUS_FAILED&&(t.push("menu_item_reply"),!this.props.response)){let e=!1;zt.Drafty.entities(this.props.content,((t,s,a)=>(e=["AU","EX","FM","IM","VC","VD"].includes(a),e))),e||zt.Drafty.styles(this.props.content,(t=>(e=["QQ"].includes(t),e))),e||t.push("menu_item_edit")}t.push("menu_item_forward"),this.props.showContextMenu({seq:this.props.seq,replace:this.props.edited?parseInt(this.props.edited.split(":")[1]):0,content:this.props.content,userFrom:this.props.userFrom,userName:this.props.userName,y:e.pageY,x:e.pageX,pickReply:this.props.pickReply,editMessage:this.props.editMessage},t)}handleProgress(e){this.setState({progress:e})}handleCancelUpload(){this.props.onCancelUpload(this.props.seq,this.props.uploader)}handleQuoteClick(e){e.preventDefault(),e.stopPropagation();const t=this.props.replyToSeq;t&&this.props.onQuoteClick(t)}render(){const e=this.props.sequence+" "+(this.props.response?"left":"right"),s="single"==this.props.sequence||"last"==this.props.sequence?"bubble tip":"bubble",i=this.props.userAvatar||!0,n=this.props.isGroup&&this.props.response&&("single"==this.props.sequence||"last"==this.props.sequence);let r=this.props.content;const o=[];if(this.props.mimeType==zt.Drafty.getContentType()&&zt.Drafty.isValid(r)){zt.Drafty.attachments(r,((e,s)=>{"application/json"!=e.mime&&o.push(t().createElement(Ma,{tinode:this.props.tinode,downloadUrl:zt.Drafty.getDownloadUrl(e),filename:e.name,uploading:zt.Drafty.isProcessing(e),mimetype:e.mime,size:zt.Drafty.getEntitySize(e),progress:this.state.progress,onCancelUpload:this.handleCancelUpload,onError:this.props.onError,key:s}))}),this);const e=zt.Drafty.format(r,Es,this.formatterContext);r=t().createElement(t().Fragment,null,e)}else"string"!=typeof r&&(r=t().createElement(t().Fragment,null,t().createElement("i",{className:"material-icons gray"},"warning_amber")," ",t().createElement("i",{className:"gray"},t().createElement(a.FormattedMessage,{id:"invalid_content",defaultMessage:[{type:0,value:"invalid content"}]}))));return t().createElement("li",{ref:this.props.innerRef,className:e},this.props.isGroup&&this.props.response?t().createElement("div",{className:"avatar-box"},n?t().createElement(ls,{tinode:this.props.tinode,topic:this.props.userFrom,title:this.props.userName,avatar:i}):null):null,t().createElement("div",null,t().createElement("div",{className:s},t().createElement("div",{className:"content-meta"},t().createElement("div",{className:"message-content"},r,o),this.props.timestamp?t().createElement(ka,{edited:this.props.edited,timestamp:this.props.timestamp,received:this.props.received}):null),this.props.showContextMenu?t().createElement("span",{className:"menuTrigger"},t().createElement("a",{href:"#",onClick:this.handleContextClick},t().createElement("i",{className:"material-icons"},"expand_more"))):null),n?t().createElement("div",{className:"author"},this.props.userName||t().createElement("i",null,t().createElement(a.FormattedMessage,{id:"user_not_found",defaultMessage:[{type:0,value:"Not found"}]}))):null))}}const Da=(0,a.injectIntl)(Aa),Pa=t().forwardRef(((e,s)=>t().createElement(Da,Na({innerRef:s},e)))),Ia=t().lazy((e=>Promise.all([r.e(246),r.e(252)]).then(r.bind(r,252)))),Ra=(0,a.defineMessages)({messaging_disabled:{id:"messaging_disabled_prompt",defaultMessage:[{type:0,value:"Messaging disabled"}]},type_new_message:{id:"new_message_prompt",defaultMessage:[{type:0,value:"New message"}]},add_image_caption:{id:"image_caption_prompt",defaultMessage:[{type:0,value:"Image caption"}]},file_attachment_too_large:{id:"file_attachment_too_large",defaultMessage:[{type:0,value:"The file size "},{type:1,value:"size"},{type:0,value:" exceeds the "},{type:1,value:"limit"},{type:0,value:" limit."}]},cannot_initiate_upload:{id:"cannot_initiate_file_upload",defaultMessage:[{type:0,value:"Cannot initiate file upload."}]},icon_title_record_voice:{id:"icon_title_record_voice",defaultMessage:[{type:0,value:"Record voice message"}]},icon_title_attach_file:{id:"icon_title_attach_file",defaultMessage:[{type:0,value:"Attach file"}]},icon_title_add_image:{id:"icon_title_add_image",defaultMessage:[{type:0,value:"Add image"}]},icon_title_send:{id:"icon_title_send",defaultMessage:[{type:0,value:"Send message"}]}});class Fa extends t().PureComponent{constructor(e){super(e),this.state={quote:null,message:"",audioRec:!1,audioAvailable:!(!navigator.mediaDevices||!navigator.mediaDevices.getUserMedia)},this.keypressTimestamp=0,this.handlePasteEvent=this.handlePasteEvent.bind(this),this.handleAttachImage=this.handleAttachImage.bind(this),this.handleAttachFile=this.handleAttachFile.bind(this),this.handleAttachAudio=this.handleAttachAudio.bind(this),this.handleSend=this.handleSend.bind(this),this.handleKeyPress=this.handleKeyPress.bind(this),this.handleMessageTyping=this.handleMessageTyping.bind(this),this.handleDropAttach=this.handleDropAttach.bind(this),this.handleQuoteClick=this.handleQuoteClick.bind(this),this.formatReply=this.formatReply.bind(this)}componentDidMount(){this.messageEditArea&&(this.messageEditArea.addEventListener("paste",this.handlePasteEvent,!1),"all"==window.getComputedStyle(this.messageEditArea).getPropertyValue("transition-property")&&this.messageEditArea.focus()),this.setState({quote:this.formatReply()})}componentWillUnmount(){this.messageEditArea&&this.messageEditArea.removeEventListener("paste",this.handlePasteEvent,!1)}componentDidUpdate(e){if(this.messageEditArea&&"all"==window.getComputedStyle(this.messageEditArea).getPropertyValue("transition-property")&&this.messageEditArea.focus(),e.topicName!=this.props.topicName)this.setState({message:this.props.initMessage||"",audioRec:!1,quote:null});else if(e.initMessage!=this.props.initMessage){const e=this.props.initMessage||"";this.setState({message:e},(t=>{this.messageEditArea.scrollTop=this.messageEditArea.scrollHeight,this.messageEditArea.setSelectionRange(e.length,e.length)}))}e.reply!=this.props.reply&&this.setState({quote:this.formatReply()})}formatReply(){return this.props.reply?zt.Drafty.format(this.props.reply.content,ks,{formatMessage:this.props.intl.formatMessage.bind(this.props.intl),authorizeURL:this.props.tinode.authorizeURL.bind(this.props.tinode)}):null}handlePasteEvent(e){this.props.disabled||(0,vs.Y)(e,(e=>{this.props.onAttachImage(e)}),(e=>{this.props.onAttachFile(e)}),this.props.onError)&&e.preventDefault()}handleAttachImage(e){e.target.files&&e.target.files.length>0&&this.props.onAttachImage(e.target.files[0]),e.target.value=""}handleAttachFile(e){e.target.files&&e.target.files.length>0&&this.props.onAttachFile(e.target.files[0]),e.target.value=""}handleDropAttach(e){e&&e.length>0&&this.props.onAttachFile(e[0])}handleAttachAudio(e,t,s){this.setState({audioRec:!1}),this.props.onAttachAudio(e,t,s)}handleSend(e){e.preventDefault();const t=this.state.message.trim();(t||this.props.acceptBlank||this.props.noInput)&&(this.props.onSendMessage(t),this.setState({message:""}))}handleKeyPress(e){if(this.state.audioRec)return e.preventDefault(),void e.stopPropagation();"Enter"===e.key&&(e.shiftKey||(e.preventDefault(),e.stopPropagation(),this.handleSend(e)))}handleMessageTyping(e){if(this.setState({message:e.target.value}),this.props.onKeyPress){const e=(new Date).getTime();e-this.keypressTimestamp>Gt.mc&&(this.props.onKeyPress(),this.keypressTimestamp=e)}}handleQuoteClick(e){if(e.preventDefault(),e.stopPropagation(),this.props.reply&&this.props.onQuoteClick){const e=this.props.reply.seq;this.props.onQuoteClick(e)}}render(){const{formatMessage:s}=this.props.intl,i=this.props.disabled?s(Ra.messaging_disabled):this.props.messagePrompt?s(Ra[this.props.messagePrompt]):s(Ra.type_new_message),n=this.props.reply&&this.props.reply.editing?"check_circle":"send",r=this.state.quote?t().createElement("div",{id:"reply-quote-preview"},t().createElement("div",{className:"cancel"},t().createElement("a",{href:"#",onClick:e=>{e.preventDefault(),this.props.onCancelReply()}},t().createElement("i",{className:"material-icons gray"},"close"))),this.state.quote):null,o=this.state.audioAvailable&&this.props.onAttachAudio;return t().createElement("div",{id:"send-message-wrapper"},this.props.noInput?null:r,t().createElement("div",{id:"send-message-panel"},this.props.disabled?t().createElement("div",{id:"writing-disabled"},i):t().createElement(t().Fragment,null,this.props.onAttachFile&&!this.state.audioRec?t().createElement(t().Fragment,null,t().createElement("a",{href:"#",onClick:e=>{e.preventDefault(),this.attachImage.click()},title:s(Ra.icon_title_add_image)},t().createElement("i",{className:"material-icons secondary"},"photo")),t().createElement("a",{href:"#",onClick:e=>{e.preventDefault(),this.attachFile.click()},title:s(Ra.icon_title_attach_file)},t().createElement("i",{className:"material-icons secondary"},"attach_file"))):null,this.props.noInput?r||t().createElement("div",{className:"hr thin"}):this.state.audioRec?t().createElement(e.Suspense,{fallback:t().createElement("div",null,t().createElement(a.FormattedMessage,{id:"loading_note",defaultMessage:[{type:0,value:"Loading..."}]}))},t().createElement(Ia,{onRecordingProgress:e=>this.props.onKeyPress(!0),onDeleted:e=>this.setState({audioRec:!1}),onFinished:this.handleAttachAudio})):t().createElement("textarea",{id:"send-message-input",placeholder:i,value:this.state.message,onChange:this.handleMessageTyping,onKeyPress:this.handleKeyPress,ref:e=>{this.messageEditArea=e}}),this.state.message||!o?t().createElement("a",{href:"#",onClick:this.handleSend,title:s(Ra.icon_title_send)},t().createElement("i",{className:"material-icons"},n)):this.state.audioRec?null:t().createElement("a",{href:"#",onClick:e=>{e.preventDefault(),this.setState({audioRec:!0})},title:s(Ra.icon_title_record_voice)},t().createElement("i",{className:"material-icons"},"mic")),t().createElement("input",{type:"file",ref:e=>{this.attachFile=e},onChange:this.handleAttachFile,style:{display:"none"}}),t().createElement("input",{type:"file",ref:e=>{this.attachImage=e},accept:"image/*, video/*",onChange:this.handleAttachImage,style:{display:"none"}}))))}}const xa=(0,a.injectIntl)(Fa);class Ua extends t().PureComponent{constructor(e){super(e),this.handleSendDoc=this.handleSendDoc.bind(this)}handleSendDoc(e){this.props.onClose(),this.props.onSendMessage(this.props.content.file)}render(){return this.props.content?t().createElement("div",{id:"image-preview"},t().createElement("div",{id:"image-preview-caption-panel"},t().createElement("span",null,this.props.content.name),t().createElement("a",{href:"#",onClick:e=>{e.preventDefault(),this.props.onClose()}},t().createElement("i",{className:"material-icons gray"},"close"))),t().createElement("div",{id:"image-preview-container"},t().createElement("div",{className:"flex-column narrow"},t().createElement("i",{className:"material-icons gray"},function(e){const t={default:"insert_drive_file",image:"image",text:"description",video:"theaters"};return t[e]||t[(e||"").split("/")[0]]||t.default}(this.props.content.type)),t().createElement("div",null,t().createElement("b",null,t().createElement(a.FormattedMessage,{id:"label_file_name",defaultMessage:[{type:0,value:"File name:"}]}))," ",(0,Zt.TX)(this.props.content.name,24)||"-"),t().createElement("div",null,t().createElement("b",null,t().createElement(a.FormattedMessage,{id:"label_content_type",defaultMessage:[{type:0,value:"Content type:"}]}))," ",this.props.content.type||"application/octet-stream"),t().createElement("div",null,t().createElement("b",null,t().createElement(a.FormattedMessage,{id:"label_size",defaultMessage:[{type:0,value:"Size:"}]}))," ",(0,Zt.FK)(this.props.content.size)))),t().createElement(xa,{noInput:!0,tinode:this.props.tinode,reply:this.props.reply,onCancelReply:this.props.onCancelReply,onSendMessage:this.handleSendDoc,onError:this.props.onError})):null}}class La extends t().Component{constructor(e){super(e)}render(){const e=[],s=(this.props.subscribers||[]).length,i=Math.min(Gt.dm,s);return(this.props.subscribers||[]).some((s=>(e.push(t().createElement("div",{className:"avatar-box",key:s.user},t().createElement(ls,{tinode:this.props.tinode,topic:s.user,avatar:(0,vs.PD)(s.public?s.public.photo:null)||!0,title:s.public?s.public.fn:null}))),e.length==i))),t().createElement("div",{id:"topic-users"},e," ",s>i?t().createElement("span",null,t().createElement(a.FormattedMessage,{id:"more_online_members",defaultMessage:[{type:0,value:"+"},{type:1,value:"overflow"},{type:0,value:" more"}],values:{overflow:s-i}})):null)}}class Oa extends t().PureComponent{constructor(e){super(e),this.state={width:0,height:0},this.handleSendImage=this.handleSendImage.bind(this)}assignWidth(e){if(e&&!this.state.width){const t=e.getBoundingClientRect();this.setState({width:0|t.width,height:0|t.height})}}handleSendImage(e){this.props.onClose(),this.props.onSendMessage(e,this.props.content.blob)}render(){if(!this.props.content)return null;const e=(0,vs.rS)(this.props.content.width,this.props.content.height,this.state.width,this.state.height,!1),s=e?{width:e.dstWidth+"px",height:e.dstHeight+"px"}:this.props.content.width>this.props.content.height?{width:"100%"}:{height:"100%"};s.maxWidth="100%",s.maxHeight="100%";const i=Math.max((this.state.width/Gt.o6/1.5|0)-2,12),n=(0,Zt.TX)(this.props.content.filename,i)||"-",r=this.props.content.width||"-",o=this.props.content.height||"-";return t().createElement("div",{id:"image-preview"},t().createElement("div",{id:"image-preview-caption-panel"},this.props.onSendMessage?t().createElement("span",null,n):t().createElement("a",{href:this.props.content.url,download:this.props.content.filename},t().createElement("i",{className:"material-icons"},"file_download")," ",t().createElement(a.FormattedMessage,{id:"download_action",defaultMessage:[{type:0,value:"download"}]})),t().createElement("a",{href:"#",onClick:e=>{e.preventDefault(),this.props.onClose()}},t().createElement("i",{className:"material-icons gray"},"close"))),t().createElement("div",{id:"image-preview-container",ref:e=>this.assignWidth(e)},t().createElement("img",{src:this.props.content.url,style:s,className:"image-preview",alt:this.props.content.filename})),this.props.onSendMessage?t().createElement(xa,{messagePrompt:"add_image_caption",acceptBlank:!0,tinode:this.props.tinode,reply:this.props.reply,onCancelReply:this.props.onCancelReply,onSendMessage:this.handleSendImage,onError:this.props.onError}):t().createElement("div",{id:"image-preview-footer"},t().createElement("div",null,t().createElement("div",null,t().createElement("b",null,t().createElement(a.FormattedMessage,{id:"label_file_name",defaultMessage:[{type:0,value:"File name:"}]}))),t().createElement("div",null,t().createElement("span",{title:this.props.content.filename},n))),t().createElement("div",null,t().createElement("div",null,t().createElement("b",null,t().createElement(a.FormattedMessage,{id:"label_content_type",defaultMessage:[{type:0,value:"Content type:"}]}))),t().createElement("div",null,this.props.content.type)),t().createElement("div",null,t().createElement("div",null,t().createElement("b",null,t().createElement(a.FormattedMessage,{id:"label_size",defaultMessage:[{type:0,value:"Size:"}]}))),t().createElement("div",null,r," × ",o," px; ",(0,Zt.FK)(this.props.content.size)))))}}class Ba extends t().PureComponent{constructor(e){super(e),this.handleButtonAction=this.handleButtonAction.bind(this)}handleButtonAction(e,t){e.preventDefault(),this.props.onAction(t)}render(){return t().createElement("div",{className:"accept-invite-panel"},t().createElement("div",{className:"title"},t().createElement(a.FormattedMessage,{id:"chat_invitation",defaultMessage:[{type:0,value:"You are invited to start a new chat. What would you like to do?"}]})),t().createElement("div",{className:"footer"},t().createElement("button",{className:"primary",onClick:e=>{this.handleButtonAction(e,"accept")}},t().createElement(a.FormattedMessage,{id:"chat_invitation_accept",defaultMessage:[{type:0,value:"Accept"}]})),t().createElement("button",{className:"secondary",onClick:e=>{this.handleButtonAction(e,"delete")}},t().createElement(a.FormattedMessage,{id:"chat_invitation_ignore",defaultMessage:[{type:0,value:"Ignore"}]})),t().createElement("button",{className:"secondary",onClick:e=>{this.handleButtonAction(e,"block")}},t().createElement(a.FormattedMessage,{id:"chat_invitation_block",defaultMessage:[{type:0,value:"Block"}]}))))}}class ja extends t().PureComponent{render(){const e=Gt.iC+" ("+zt.Tinode.getLibrary()+")";return t().createElement("div",{id:"dummy-view"},t().createElement("div",null,t().createElement("a",{href:"https://github.com/tinode/chat/"},t().createElement("img",{id:"logo",alt:"logo",src:"img/logo.svg"}),t().createElement("h2",null,"Tinode Web")),t().createElement("p",null,t().createElement(a.FormattedMessage,{id:"label_client",defaultMessage:[{type:0,value:"Client:"}]})," ",e),t().createElement("p",null,t().createElement(a.FormattedMessage,{id:"label_server",defaultMessage:[{type:0,value:"Server:"}]})," ",this.props.serverVersion," (",this.props.serverAddress,")")))}}class qa extends t().PureComponent{constructor(e){super(e)}render(){let e=null,s="bubble";return this.props.date&&(e=t().createElement(t().Fragment,null,this.props.date),s+=" date"),e?t().createElement("li",{className:"meta"},t().createElement("div",{className:s},t().createElement("div",{className:"message-content"},e))):t().createElement(t().Fragment,null,null)}}const Va=(0,a.defineMessages)({unrecognized_video_format:{id:"unrecognized_video_format",defaultMessage:[{type:0,value:"Format of this video is not recognized"}]}});class Ha extends t().PureComponent{constructor(e){super(e),this.videoRef=t().createRef(),this.handleSendVideo=this.handleSendVideo.bind(this)}handleSendVideo(e){this.props.onClose();const t={width:this.videoRef.current.videoWidth,height:this.videoRef.current.videoHeight,duration:1e3*this.videoRef.current.duration|0,mime:this.props.content.mime,name:this.props.content.filename};if(0==t.width||0==t.height)return void this.props.onError(this.props.intl.formatMessage(Va.unrecognized_video_format),"err");const s=document.createElement("canvas");s.width=t.width,s.height=t.height;const a=s.getContext("2d");a.drawImage(this.videoRef.current,0,0,s.width,s.height),a.canvas.toBlob((s=>this.props.onSendMessage(e,this.props.content.blob,s,t)),"image/jpeg",.75)}render(){if(!this.props.content)return null;const e=this.props.content.width||"-",s=this.props.content.height||"-",i=this.props.onSendMessage?"nodownload":"",n=!this.props.onSendMessage;return t().createElement("div",{id:"image-preview"},t().createElement("div",{id:"image-preview-caption-panel"},t().createElement("span",null,this.props.content.filename),t().createElement("a",{href:"#",onClick:e=>{e.preventDefault(),this.props.onClose()}},t().createElement("i",{className:"material-icons gray"},"close"))),t().createElement("div",{id:"image-preview-container"},t().createElement("video",{className:"image-preview",controls:!0,controlsList:i,disablePictureInPicture:!0,ref:this.videoRef,autoPlay:n,src:this.props.tinode.authorizeURL(this.props.content.url),poster:this.props.content.preview,alt:this.props.content.filename})),this.props.onSendMessage?t().createElement(xa,{messagePrompt:"add_image_caption",acceptBlank:!0,tinode:this.props.tinode,reply:this.props.reply,onCancelReply:this.props.onCancelReply,onSendMessage:this.handleSendVideo,onError:this.props.onError}):t().createElement("div",{id:"image-preview-footer"},t().createElement("div",null,t().createElement("div",null,t().createElement("b",null,t().createElement(a.FormattedMessage,{id:"label_file_name",defaultMessage:[{type:0,value:"File name:"}]}))),t().createElement("div",null,t().createElement("span",{title:this.props.content.filename},this.props.content.filename))),t().createElement("div",null,t().createElement("div",null,t().createElement("b",null,t().createElement(a.FormattedMessage,{id:"label_content_type",defaultMessage:[{type:0,value:"Content type:"}]}))),t().createElement("div",null,this.props.content.type)),t().createElement("div",null,t().createElement("div",null,t().createElement("b",null,t().createElement(a.FormattedMessage,{id:"label_size",defaultMessage:[{type:0,value:"Size:"}]}))),t().createElement("div",null,e," × ",s," px; ",(0,Zt.FK)(this.props.content.size)))))}}const Wa=(0,a.injectIntl)(Ha);class za{static parseUrlHash(e){const t=e.split("?",2),s={};let a=[];return t[0]&&(a=t[0].replace("#","").split("/")),t[1]&&t[1].split("&").forEach((e=>{const t=e.indexOf("=");t>0&&(s[e.slice(0,t)]=decodeURIComponent(e.slice(t+1)))})),{path:a,params:s}}static navigateTo(e){window.location.hash=e}static composeUrlHash(e,t){let s=e.join("/");const a=[];for(const e in t)t.hasOwnProperty(e)&&a.push(e+"="+encodeURIComponent(t[e]));return a.length>0&&(s+="?"+a.join("&")),s}static addUrlParam(e,t,s){const a=za.parseUrlHash(e);return a.params[t]=s,za.composeUrlHash(a.path,a.params)}static removeUrlParam(e,t){const s=za.parseUrlHash(e);return delete s.params[t],za.composeUrlHash(s.path,s.params)}static setUrlSidePanel(e,t){const s=za.parseUrlHash(e);return s.path[0]=t,za.composeUrlHash(s.path,s.params)}static setUrlInfoPanel(e,t){const s=za.parseUrlHash(e);return t?s.params.info=t:delete s.params.info,za.composeUrlHash(s.path,s.params)}static setUrlTopic(e,t){const s=za.parseUrlHash(e);return s.path[1]=t,delete s.params.info,za.composeUrlHash(s.path,s.params)}}const Ka=(0,a.defineMessages)({online_now:{id:"online_now",defaultMessage:[{type:0,value:"online now"}]},last_seen:{id:"last_seen_timestamp",defaultMessage:[{type:0,value:"Last seen"}]},not_found:{id:"title_not_found",defaultMessage:[{type:0,value:"Not found"}]},channel:{id:"channel",defaultMessage:[{type:0,value:"channel"}]},file_attachment_too_large:{id:"file_attachment_too_large",defaultMessage:[{type:0,value:"The file size "},{type:1,value:"size"},{type:0,value:" exceeds the "},{type:1,value:"limit"},{type:0,value:" limit."}]},invalid_content:{id:"invalid_content",defaultMessage:[{type:0,value:"invalid content"}]},editing_message:{id:"editing_message",defaultMessage:[{type:0,value:"Editing"}]},drag_file:{id:"drag_file",defaultMessage:[{type:0,value:"Drag file here"}]}});function Ga(e){if(e){const t=e.getExcessive()||"";return e.isJoiner("given")&&(t.includes("R")||t.includes("W"))}return!1}function $a(e){if(e){const t=e.getMissing()||"";return e.isJoiner("want")&&(t.includes("R")||t.includes("W"))}return!1}function Qa(e){return 1==e||3==e}class Xa extends t().Component{constructor(e){super(e),this.state=Xa.getDerivedStateFromProps(e,{}),this.leave=this.leave.bind(this),this.sendMessage=this.sendMessage.bind(this),this.retrySend=this.retrySend.bind(this),this.sendImageAttachment=this.sendImageAttachment.bind(this),this.sendVideoAttachment=this.sendVideoAttachment.bind(this),this.sendFileAttachment=this.sendFileAttachment.bind(this),this.sendAudioAttachment=this.sendAudioAttachment.bind(this),this.sendKeyPress=this.sendKeyPress.bind(this),this.subscribe=this.subscribe.bind(this),this.handleScrollReference=this.handleScrollReference.bind(this),this.mountDnDEvents=this.mountDnDEvents.bind(this),this.handleScrollEvent=this.handleScrollEvent.bind(this),this.handleDescChange=this.handleDescChange.bind(this),this.handleSubsUpdated=this.handleSubsUpdated.bind(this),this.handleMessageUpdate=this.handleMessageUpdate.bind(this),this.handleAllMessagesReceived=this.handleAllMessagesReceived.bind(this),this.handleInfoReceipt=this.handleInfoReceipt.bind(this),this.handleExpandMedia=this.handleExpandMedia.bind(this),this.handleClosePreview=this.handleClosePreview.bind(this),this.handleFormResponse=this.handleFormResponse.bind(this),this.handleContextClick=this.handleContextClick.bind(this),this.handleShowMessageContextMenu=this.handleShowMessageContextMenu.bind(this),this.handleNewChatAcceptance=this.handleNewChatAcceptance.bind(this),this.handleEnablePeer=this.handleEnablePeer.bind(this),this.handleAttachFile=this.handleAttachFile.bind(this),this.handleAttachImageOrVideo=this.handleAttachImageOrVideo.bind(this),this.handleCancelUpload=this.handleCancelUpload.bind(this),this.postReadNotification=this.postReadNotification.bind(this),this.clearNotificationQueue=this.clearNotificationQueue.bind(this),this.goToLatestMessage=this.goToLatestMessage.bind(this),this.handleFileDrop=this.handleFileDrop.bind(this),this.handlePickReply=this.handlePickReply.bind(this),this.handleEditMessage=this.handleEditMessage.bind(this),this.handleCancelReply=this.handleCancelReply.bind(this),this.handleQuoteClick=this.handleQuoteClick.bind(this),this.handleCallHangup=this.handleCallHangup.bind(this),this.isDragEnabled=this.isDragEnabled.bind(this),this.handleDragIn=this.handleDragIn.bind(this),this.handleDragOut=this.handleDragOut.bind(this),this.handleDrag=this.handleDrag.bind(this),this.handleDrop=this.handleDrop.bind(this),this.chatMessageRefs={},this.getOrCreateMessageRef=this.getOrCreateMessageRef.bind(this),this.dragCounter=0,this.dndRef=null,this.readNotificationQueue=[],this.readNotificationTimer=null,this.keyPressTimer=null}getOrCreateMessageRef(e){if(this.chatMessageRefs.hasOwnProperty(e))return this.chatMessageRefs[e];const s=t().createRef();return this.chatMessageRefs[e]=s,s}componentDidMount(){this.messagesScroller&&this.messagesScroller.addEventListener("scroll",this.handleScrollEvent),this.dndRef&&(this.dndRef.addEventListener("dragenter",this.handleDragIn),this.dndRef.addEventListener("dragleave",this.handleDragOut),this.dndRef.addEventListener("dragover",this.handleDrag),this.dndRef.addEventListener("drop",this.handleDrop))}componentWillUnmount(){this.messagesScroller&&this.messagesScroller.removeEventListener("scroll",this.handleScrollEvent),this.clearNotificationQueue(),this.dndRef&&(this.dndRef.removeEventListener("dragenter",this.handleDragIn),this.dndRef.removeEventListener("dragleave",this.handleDragOut),this.dndRef.removeEventListener("dragover",this.handleDrag),this.dndRef.removeEventListener("drop",this.handleDrop))}componentDidUpdate(e,t){!this.messagesScroller||t.topic==this.state.topic&&t.messageCount==this.state.messageCount||this.state.scrollPosition<100&&(this.messagesScroller.scrollTop=this.messagesScroller.scrollHeight-this.state.scrollPosition-this.messagesScroller.offsetHeight);const s=this.props.tinode?this.props.tinode.getTopic(this.state.topic):void 0;this.state.topic!=t.topic&&(t.topic&&!zt.Tinode.isNewGroupTopicName(t.topic)&&(this.leave(t.topic),t.rtcPanel&&this.handleCallHangup(t.topic,e.callSeq)),s&&(s.onData=this.handleMessageUpdate,s.onAllMessagesReceived=this.handleAllMessagesReceived,s.onInfo=this.handleInfoReceipt,s.onMetaDesc=this.handleDescChange,s.onSubsUpdated=this.handleSubsUpdated,s.onPres=this.handleSubsUpdated)),this.props.applicationVisible?this.postReadNotification(0):this.clearNotificationQueue(),!s||this.state.topic==t.topic&&e.ready||(s._new&&s.isP2PType()?s.getMeta(s.startMetaQuery().withDesc().build()):this.subscribe(s))}static getDerivedStateFromProps(e,t){let s={};if(e.topic)if(e.topic!=t.topic){const a=e.tinode.getTopic(e.topic);if(s={topic:e.topic,deleted:a._deleted,docPreview:null,imagePreview:null,imagePostview:null,videoPreview:null,videoPostview:null,rtcPanel:null,typingIndicator:!1,scrollPosition:0,fetchingMessages:!1,showGoToLastButton:!1,contentToEdit:null,dragging:!1},e.forwardMessage?s.reply={content:e.forwardMessage.preview,seq:null}:s.reply=null,a){const i=[];e.connected&&a.subscribers((t=>{t.online&&t.user!=e.myUserId&&i.push(t)})),Object.assign(s,{onlineSubs:i}),a.public?Object.assign(s,{title:a.public.fn,avatar:(0,vs.PD)(a.public.photo)}):Object.assign(s,{title:"",avatar:null});const n=a.p2pPeerDesc();n?Object.assign(s,{peerMessagingDisabled:$a(n.acs)}):t.peerMessagingDisabled&&Object.assign(s,{peerMessagingDisabled:!1}),Object.assign(s,{messageCount:a.messageCount(),latestClearId:a.maxClearId(),channel:a.isChannelType()}),e.callTopic==a.name&&Qa(e.callState)&&(s.rtcPanel=e.callTopic)}else Object.assign(s,{messageCount:0,latestClearId:-1,onlineSubs:[],title:"",avatar:null,peerMessagingDisabled:!1,channel:!1})}else e.callTopic==t.topic&&!t.rtcPanel&&Qa(e.callState)&&(s.rtcPanel=e.callTopic);else s={messageCount:0,latestClearId:-1,onlineSubs:[],topic:null,title:"",avatar:null,isVerified:!1,isStaff:!1,isDangerous:!1,deleted:!1,docPreview:null,imagePreview:null,imagePostview:null,videoPreview:null,videoPostview:null,rtcPanel:null,typingIndicator:!1,scrollPosition:0,fetchingMessages:!1,peerMessagingDisabled:!1,channel:!1,reply:null,contentToEdit:null,showGoToLastButton:!1,dragging:!1};return e.acs?(e.acs.isWriter()!=t.isWriter&&(s.isWriter=!t.isWriter),e.acs.isReader()!=t.isReader&&(s.isReader=!t.isReader),!e.acs.isReader("given")!=t.readingBlocked&&(s.readingBlocked=!t.readingBlocked),e.acs.isSharer()!=t.isSharer&&(s.isSharer=!t.isSharer)):(t.isWriter&&(s.isWriter=!1),t.isReader&&(s.isReader=!1),t.readingBlocked||(t.readingBlocked=!0),t.isSharer&&(s.isSharer=!1)),Ga(e.acs)==!t.unconformed&&(s.unconfirmed=!t.unconformed),!e.connected&&t.onlineSubs&&t.onlineSubs.length>0&&(s.onlineSubs=[]),s}subscribe(e){if(e.isSubscribed()||!this.props.ready)return;const t=this.props.newTopicParams&&this.props.newTopicParams._topicName==this.props.topic;let s=e.startMetaQuery().withLaterDesc().withLaterSub();(this.state.isReader||t)&&(s=s.withLaterData(Gt.Hm),this.state.isReader&&(s=s.withLaterDel()),this.setState({fetchingMessages:!0}));const a=t?this.props.newTopicParams:void 0;e.subscribe(s.build(),a).then((t=>{if(303==t.code)return void za.navigateTo(za.setUrlTopic("",t.params.topic));this.state.topic!=t.topic&&this.setState({topic:t.topic}),this.props.onNewTopicCreated(this.props.topic,t.topic);let s=[];e.queuedMessages((t=>{t._sending||(t.head&&t.head.webrtc?s.push(t.seq):e.isSubscribed()&&this.retrySend(t))})),s.length>0&&e.delMessagesList(s,!0)})).catch((e=>{console.error("Failed subscription to",this.state.topic,e),this.props.onError(e.message,"err");const t=Xa.getDerivedStateFromProps({},{});t.title=this.props.intl.formatMessage(Ka.not_found),this.setState(t)}))}leave(e){if(!e||!this.props.tinode.isTopicCached(e))return;const t=this.props.tinode.getTopic(e);t&&t.isSubscribed()&&t.leave(!1).catch((e=>{})).finally((e=>{this.setState({fetchingMessages:!1}),t.onData=void 0,t.onAllMessagesReceived=void 0,t.onInfo=void 0,t.onMetaDesc=void 0,t.onSubsUpdated=void 0,t.onPres=void 0}))}handleScrollReference(e){e&&(e.addEventListener("scroll",this.handleScrollEvent),this.messagesScroller=e,this.messagesScroller.scrollTop=this.messagesScroller.scrollHeight-this.state.scrollPosition)}handleScrollEvent(e){const t=e.target.scrollHeight-e.target.scrollTop-e.target.offsetHeight;if(this.setState({scrollPosition:t,showGoToLastButton:t>100&&t{e.getMessagesPage(Gt.Hm).catch((e=>this.props.onError(e.message,"err"))).finally((e=>this.setState({fetchingMessages:!1})))}))}}mountDnDEvents(e){e&&(e.addEventListener("dragenter",this.handleDragIn),e.addEventListener("dragleave",this.handleDragOut),e.addEventListener("dragover",this.handleDrag),e.addEventListener("drop",this.handleDrop),this.dndRef=e)}goToLatestMessage(){this.setState({scrollPosition:0}),this.messagesScroller&&(this.messagesScroller.scrollTop=this.messagesScroller.scrollHeight)}handleDescChange(e){e.public?this.setState({title:e.public.fn,avatar:(0,vs.PD)(e.public.photo)}):this.setState({title:"",avatar:null}),e.acs&&this.setState({isWriter:e.acs.isWriter(),isReader:e.acs.isReader(),readingBlocked:!e.acs.isReader("given"),unconfirmed:Ga(e.acs)})}postReadNotification(e){if(!this.props.applicationVisible)return;this.readNotificationTimer||(this.readNotificationTimer=setInterval((e=>{if(0==this.readNotificationQueue.length)return clearInterval(this.readNotificationTimer),void(this.readNotificationTimer=null);let t=-1;for(;this.readNotificationQueue.length>0;){const e=this.readNotificationQueue[0];if(e.topicName!=this.state.topic){this.readNotificationQueue.shift();continue}const s=new Date;if(!(e.sendAt<=s))break;this.readNotificationQueue.shift(),t=Math.max(t,e.seq)}if(t>=0){const e=this.props.tinode.getTopic(this.state.topic);e&&e.noteRead(t)}}),300));const t=new Date;this.readNotificationQueue.push({topicName:this.state.topic,seq:e,sendAt:t.setMilliseconds(t.getMilliseconds()+Gt.l8)})}clearNotificationQueue(){this.readNotificationQueue=[],this.readNotificationTimer&&(clearInterval(this.readNotificationTimer),this.readNotificationTimer=null)}handleSubsUpdated(){if(this.state.topic){const e=[],t=this.props.tinode.getTopic(this.state.topic);t.subscribers((t=>{t.online&&t.user!=this.props.myUserId&&e.push(t)}));const s={onlineSubs:e},a=t.p2pPeerDesc();a?Object.assign(s,{peerMessagingDisabled:$a(a.acs)}):this.state.peerMessagingDisabled&&Object.assign(s,{peerMessagingDisabled:!1}),this.setState(s)}}handleMessageUpdate(e){const t=this.props.tinode.getTopic(this.state.topic);if(!e)return void this.setState({latestClearId:t.maxClearId()});clearTimeout(this.keyPressTimer),this.setState({messageCount:t.messageCount(),typingIndicator:!1},(s=>{t.isNewMessage(e.seq)&&(this.state.scrollPosition>100?this.setState({showGoToLastButton:!0}):this.goToLatestMessage())}));t.msgStatus(e,!0)>=zt.Tinode.MESSAGE_STATUS_SENT&&e.from!=this.props.myUserId&&this.postReadNotification(e.seq)}handleAllMessagesReceived(e){this.setState({fetchingMessages:!1}),e>0&&this.postReadNotification(0)}handleInfoReceipt(e){switch(e.what){case"kp":clearTimeout(this.keyPressTimer),this.keyPressTimer=setTimeout((e=>this.setState({typingIndicator:!1})),Gt.mc+1e3),this.state.typingIndicator||this.setState({typingIndicator:!0});break;case"read":case"recv":this.forceUpdate();break;default:console.info("Other change in topic: ",e.what)}}handleExpandMedia(e){e&&(e.video?this.setState({videoPostview:e}):this.setState({imagePostview:e}))}handleClosePreview(){this.state.imagePreview&&this.state.imagePreview.url&&URL.revokeObjectURL(this.state.imagePreview.url),this.state.videoPreview&&this.state.videoPreview.url&&URL.revokeObjectURL(this.state.videoPreview.url),this.setState({imagePostview:null,imagePreview:null,docPreview:null,videoPreview:null,videoPostview:null})}handleFormResponse(e,t,s){if("pub"==e)this.sendMessage(zt.Drafty.attachJSON(zt.Drafty.parse(t),s));else if("url"==e){const e=new URL(s.ref),t=e.searchParams;for(let e in s.resp)s.resp.hasOwnProperty(e)&&t.set(e,s.resp[e]);["name","seq"].map((e=>{s[e]&&t.set(e,s[e])})),t.set("uid",this.props.myUserId),t.set("topic",this.state.topic),e.search=t,window.open(e,"_blank")}else console.info("Unknown action in form",e)}handleContextClick(e){e.preventDefault(),e.stopPropagation(),this.props.showContextMenu({topicName:this.state.topic,y:e.pageY,x:e.pageX})}handleShowMessageContextMenu(e,t){"chan"==e.userFrom&&(e.userFrom=this.state.topic,e.userName=this.state.title),e.topicName=this.state.topic;const s=t||[],a=this.props.tinode.getTopic(e.topicName);if(a){a.isChannelType()||s.push("message_delete");const e=a.getAccessMode();e&&e.isDeleter()&&s.push("message_delete_hard")}this.props.showContextMenu(e,s)}handleNewChatAcceptance(e){this.props.onNewChat(this.state.topic,e)}handleEnablePeer(e){e.preventDefault(),this.props.onChangePermissions(this.state.topic,Gt.RK,this.state.topic)}sendKeyPress(e){const t=this.props.tinode.getTopic(this.state.topic);t.isSubscribed()&&(e?t.noteRecording(!0):t.noteKeyPress())}sendMessage(e,t,s){let a;if(this.props.forwardMessage)e=this.props.forwardMessage.msg,a=this.props.forwardMessage.head,this.handleCancelReply();else if(this.state.reply){if(this.state.reply.editing){if(e==this.state.contentToEdit)return void this.handleCancelReply();a={replace:":"+this.state.reply.seq}}else this.state.reply.content&&(a={reply:""+this.state.reply.seq},"string"==typeof e&&(e=zt.Drafty.parse(e)),e=zt.Drafty.append(zt.Drafty.sanitizeEntities(this.state.reply.content),e));this.handleCancelReply()}this.props.sendMessage(e,t,s,a)}retrySend(e){this.props.sendMessage(e.content,void 0,void 0,e.head).then((t=>{this.props.tinode.getTopic(this.state.topic).delMessagesList([e.seq],!0)}))}sendFileAttachment(e){const t=.75*this.props.tinode.getServerParam("maxMessageSize",Gt.kd)-1024|0;if(e.size>t){const t=this.props.tinode.getLargeFileHelper();if(!t)return void this.props.onError(this.props.intl.formatMessage(Ka.cannot_initiate_upload));const s=t.upload(e),a=zt.Drafty.attachFile(null,{mime:e.type,filename:e.name,size:e.size,urlPromise:s});this.sendMessage(a,s,t)}else(0,vs.sT)(e).then((t=>this.sendMessage(zt.Drafty.attachFile(null,{mime:t.mime,data:t.bits,filename:t.name,size:e.size})))).catch((e=>this.props.onError(e.message,"err")))}handleAttachFile(e){const t=this.props.tinode.getServerParam("maxFileUploadSize",Gt.GQ);e.size>t?this.props.onError(this.props.intl.formatMessage(Ka.file_attachment_too_large,{size:(0,Zt.FK)(e.size),limit:(0,Zt.FK)(t)}),"err"):this.setState({docPreview:{file:e,name:e.name,size:e.size,type:e.type}})}handleCallHangup(e,t){this.props.onVideoCallClosed(),this.setState({rtcPanel:null}),this.props.onCallHangup(e,t)}sendImageAttachment(e,t){const s=this.state.imagePreview.mime,a=this.state.imagePreview.width,i=this.state.imagePreview.height,n=this.state.imagePreview.filename,r=.75*this.props.tinode.getServerParam("maxMessageSize",Gt.kd)-1024|0;if(t.size>r){const r=this.props.tinode.getLargeFileHelper();if(!r)return void this.props.onError(this.props.intl.formatMessage(Ka.cannot_initiate_upload));const o=r.upload(t);(0,vs.EA)(t,Gt.H2,Gt.H2,-1,!1).then((e=>(0,vs.w8)(e.blob))).then((l=>{let c=zt.Drafty.insertImage(null,0,{mime:s,_tempPreview:l.bits,bits:l.bits,width:a,height:i,filename:n,size:t.size,urlPromise:o});e&&(c=zt.Drafty.appendLineBreak(c),c=zt.Drafty.append(c,zt.Drafty.parse(e))),this.sendMessage(c,o,r)})).catch((e=>this.props.onError(e,"err")))}else(0,vs.w8)(t).then((s=>{let r=zt.Drafty.insertImage(null,0,{mime:s.mime,bits:s.bits,width:a,height:i,filename:n,size:t.size});e&&(r=zt.Drafty.appendLineBreak(r),r=zt.Drafty.append(r,zt.Drafty.parse(e))),this.sendMessage(r)}))}sendVideoAttachment(e,t,s,a){const i=a.width,n=a.height,r=.75*this.props.tinode.getServerParam("maxMessageSize",Gt.kd)-1024|0,o=[];let l;if(t.size+s.size>r){if(l=this.props.tinode.getLargeFileHelper(),!l)return void this.props.onError(this.props.intl.formatMessage(Ka.cannot_initiate_upload));o[0]=t.size>.675*r?l.upload(t):null,o[1]=s.size>.275*r?l.upload(s):null}if(0==o.length)return void Promise.all([(0,vs.w8)(t),(0,vs.w8)(s)]).then((s=>{const[r,o]=s;let l=zt.Drafty.insertVideo(null,0,{mime:r.mime,bits:r.bits,preview:o.bits,premime:o.mime,width:i,height:n,duration:a.duration,filename:a.name,size:t.size});e&&(l=zt.Drafty.appendLineBreak(l),l=zt.Drafty.append(l,zt.Drafty.parse(e))),this.sendMessage(l)}));const c=Promise.all(o),d=[];d[0]=o[0]?null:(0,vs.w8)(t),d[1]=o[1]?null:(0,vs.EA)(s,Gt.yW,Gt.yW,-1,!1).then((e=>(0,vs.w8)(e.blob))),d[2]=(0,vs.EA)(s,Gt.ly,Gt.ly,-1,!1).then((e=>(0,vs.w8)(e.blob))),Promise.all(d).then((s=>{const[r,o,d]=s;let h=zt.Drafty.insertVideo(null,0,{mime:a.mime,bits:r?r.bits:null,_tempPreview:d.bits,preview:o?o.bits:d.bits,premime:o?o.mime:d.mime,width:i,height:n,duration:a.duration,filename:a.name,size:t.size,urlPromise:c});e&&(h=zt.Drafty.appendLineBreak(h),h=zt.Drafty.append(h,zt.Drafty.parse(e))),this.sendMessage(h,c,l)})).catch((e=>this.props.onError(e.message,"err")))}handleAttachImageOrVideo(e){const t=this.props.tinode.getServerParam("maxFileUploadSize",Gt.GQ);e.type.startsWith("video/")?this.setState({videoPreview:{url:URL.createObjectURL(e),blob:e,filename:e.name,size:e.size,mime:e.type}}):(0,vs.EA)(e,Gt.yW,Gt.yW,t,!1).then((e=>{this.setState({imagePreview:{url:URL.createObjectURL(e.blob),blob:e.blob,filename:e.name,width:e.width,height:e.height,size:e.blob.size,mime:e.mime}})})).catch((e=>{this.props.onError(e.message,"err")}))}handleFileDrop(e){if(!e||0==e.length)return;const t=e[0];t.type&&t.type.startsWith("image/")?this.handleAttachImageOrVideo(t):this.handleAttachFile(t)}sendAudioAttachment(e,t,s){fetch(e).then((e=>e.blob())).then((e=>{const a=.75*this.props.tinode.getServerParam("maxMessageSize",Gt.kd)-1024;if(e.size>a){const a=this.props.tinode.getLargeFileHelper();if(!a)return void this.props.onError(this.props.intl.formatMessage(Ka.cannot_initiate_upload));const i=a.upload(e),n=zt.Drafty.appendAudio(null,{mime:e.type,size:e.size,duration:s,preview:t,urlPromise:i});this.sendMessage(n,i,a)}else(0,vs.w8)(e).then((a=>{this.sendMessage(zt.Drafty.appendAudio(null,{mime:a.mime,bits:a.bits,size:e.size,duration:s,preview:t}))}))})).catch((e=>{this.props.onError(e.message,"err")}))}handleCancelUpload(e,t){const s=this.props.tinode.getTopic(this.state.topic).findMessage(e);s&&(s._cancelled=!0),t.cancel()}handlePickReply(e,t,s,a){e&&t?(t="string"==typeof t?zt.Drafty.init(t):t,t=zt.Drafty.isValid(t)?zt.Drafty.replyContent(t,Gt.cl):zt.Drafty.append(zt.Drafty.init("⚠ "),zt.Drafty.wrapInto(this.props.intl.formatMessage(Ka.invalid_content),"EM")),this.setState({reply:{content:zt.Drafty.quote(a,s,t),seq:e}}),this.props.onCancelForwardMessage()):this.setState({reply:null})}handleEditMessage(e,t){if(!e||!t)return void this.setState({reply:null});t="string"==typeof t?zt.Drafty.init(t):t;const s=zt.Drafty.toMarkdown(t);t=zt.Drafty.isValid(t)?zt.Drafty.replyContent(t,Gt.nT):zt.Drafty.append(zt.Drafty.init("⚠ "),zt.Drafty.wrapInto(this.props.intl.formatMessage(Ka.invalid_content),"EM")),this.setState({reply:{content:zt.Drafty.quote(this.props.intl.formatMessage(Ka.editing_message),null,t),seq:e,editing:!0},contentToEdit:s}),this.props.onCancelForwardMessage()}handleCancelReply(){this.setState({reply:null,contentToEdit:null}),this.props.onCancelForwardMessage()}handleQuoteClick(e){const t=this.getOrCreateMessageRef(e);t&&t.current?(t.current.scrollIntoView({block:"center",behavior:"smooth"}),t.current.classList.add("flash"),setTimeout((e=>{t.current.classList.remove("flash")}),1e3)):console.error("Unresolved message ref",e)}isDragEnabled(){return this.state.isWriter&&!this.state.unconfirmed&&!this.props.forwardMessage&&!this.state.peerMessagingDisabled}handleDrag(e){e.preventDefault(),e.stopPropagation()}handleDragIn(e){e.preventDefault(),e.stopPropagation(),this.dragCounter++,e.dataTransfer.items&&e.dataTransfer.items.length>0&&this.setState({dragging:!0})}handleDragOut(e){e.preventDefault(),e.stopPropagation(),this.dragCounter--,this.dragCounter<=0&&this.setState({dragging:!1})}handleDrop(e){e.preventDefault(),e.stopPropagation(),this.setState({dragging:!1}),this.isDragEnabled()&&e.dataTransfer.files&&e.dataTransfer.files.length>0&&(this.handleFileDrop(e.dataTransfer.files),e.dataTransfer.clearData(),this.dragCounter=0)}render(){const{formatMessage:e}=this.props.intl;let s;if(this.props.hideSelf)s=null;else if(this.state.topic){let i;if(this.state.imagePreview)i=t().createElement(Oa,{content:this.state.imagePreview,tinode:this.props.tinode,reply:this.state.reply,onCancelReply:this.handleCancelReply,onClose:this.handleClosePreview,onSendMessage:this.sendImageAttachment});else if(this.state.videoPreview)i=t().createElement(Wa,{content:this.state.videoPreview,tinode:this.props.tinode,reply:this.state.reply,onError:this.props.onError,onCancelReply:this.handleCancelReply,onClose:this.handleClosePreview,onSendMessage:this.sendVideoAttachment});else if(this.state.imagePostview)i=t().createElement(Oa,{content:this.state.imagePostview,onClose:this.handleClosePreview});else if(this.state.videoPostview)i=t().createElement(Wa,{content:this.state.videoPostview,tinode:this.props.tinode,onError:this.props.onError,onClose:this.handleClosePreview});else if(this.state.docPreview)i=t().createElement(Ua,{content:this.state.docPreview,tinode:this.props.tinode,reply:this.state.reply,onCancelReply:this.handleCancelReply,onClose:this.handleClosePreview,onSendMessage:this.sendFileAttachment});else if(this.state.rtcPanel)i=t().createElement(Sa,{topic:this.state.topic,seq:this.props.callSeq,callState:this.props.callState,callAudioOnly:this.props.callAudioOnly,tinode:this.props.tinode,title:this.state.title,avatar:this.state.avatar||!0,onError:this.props.onError,onHangup:this.handleCallHangup,onInvite:this.props.onCallInvite,onSendOffer:this.props.onCallSendOffer,onIceCandidate:this.props.onCallIceCandidate,onSendAnswer:this.props.onCallSendAnswer});else{const s=this.props.tinode.getTopic(this.state.topic),n=s.isChannelType(),r=s.isGroupType()&&!n,o=[];s.trusted&&(s.trusted.verified&&o.push({icon:"verified",color:"badge-inv"}),s.trusted.staff&&o.push({icon:"staff",color:"badge-inv"}),s.trusted.danger&&o.push({icon:"dangerous",color:"badge-inv"}));const l=[];let c=null,d=null,h=null;s.messages(((e,a,i,n)=>{let o=i?i.from||"chan":null,p="single",u=e.from||"chan";u==c?p=u==o?"middle":"last":u==o&&(p="first"),c=u;const m=!(u==this.props.myUserId),g=s.msgStatus(e,!0);let f,v,b=u;const E=s.userDesc(u);E&&E.public&&(f=E.public.fn,v=(0,vs.PD)(E.public.photo)),h=r?"chat-box group":"chat-box";const y=this.getOrCreateMessageRef(e.seq);let C=e.head?parseInt(e.head.reply):null;if(C&&!isNaN(C)||(C=null),e.hi)l.push(t().createElement(qa,{deleted:!0,key:e.seq}));else{const s=new Date(e.ts);d&&d.toDateString()==s.toDateString()||(l.push(t().createElement(qa,{date:(0,Zt.EZ)(e.ts),locale:this.props.intl.locale,key:"date-"+e.seq})),d=s),l.push(t().createElement(Pa,{tinode:this.props.tinode,content:e.content,mimeType:e.head&&e.head.mime,replyToSeq:C,edited:e.head&&!e.head.webrtc&&e.head.replace,timestamp:e.ts,response:m,seq:e.seq,isGroup:r,isChan:this.state.channel,userFrom:b,userName:f,userAvatar:v,sequence:p,received:g,uploader:e._uploader,userIsWriter:this.state.isWriter,viewportWidth:this.props.viewportWidth,showContextMenu:this.handleShowMessageContextMenu,onExpandMedia:this.handleExpandMedia,onFormResponse:this.handleFormResponse,onCancelUpload:this.handleCancelUpload,pickReply:this.handlePickReply,editMessage:this.handleEditMessage,onQuoteClick:this.handleQuoteClick,onError:this.props.onError,ref:y,key:e.seq}))}}));let p=null;if(n)p=e(Ka.channel);else{const t=this.props.tinode.getMeTopic().getContact(this.state.topic);t&&zt.Tinode.isP2PTopicName(t.topic)&&(t.online?p=e(Ka.online_now):t.seen&&(p=e(Ka.last_seen)+": "+(0,Zt.pz)(t.seen.when,this.props.intl.locale)))}const u=this.state.avatar||!0,m=this.state.deleted?null:this.props.online?"online"+(this.state.typingIndicator?" typing":""):"offline",g="panel-title"+(this.state.deleted?" deleted":"");let f=t().createElement(t().Fragment,null,t().createElement("div",{id:"messages-container"},t().createElement("button",{className:"action-button"+(this.state.showGoToLastButton?"":" hidden"),onClick:this.goToLatestMessage},t().createElement("i",{className:"material-icons"},"arrow_downward")),t().createElement("div",{id:"messages-panel",ref:this.handleScrollReference},t().createElement("ul",{id:"scroller",className:h},l)),this.state.isReader?null:t().createElement("div",{id:"write-only-background"},this.state.readingBlocked?t().createElement("div",{id:"write-only-note"},t().createElement(a.FormattedMessage,{id:"messages_not_readable",defaultMessage:[{type:0,value:"no access to messages"}]})):null)),this.state.peerMessagingDisabled&&!this.state.unconfirmed?t().createElement("div",{id:"peer-messaging-disabled-note"},t().createElement("i",{className:"material-icons secondary"},"block")," ",t().createElement(a.FormattedMessage,{id:"peers_messaging_disabled",defaultMessage:[{type:0,value:"Peer's messaging is disabled."}]})," ",t().createElement("a",{href:"#",onClick:this.handleEnablePeer},t().createElement(a.FormattedMessage,{id:"enable_peers_messaging",defaultMessage:[{type:0,value:"Enable"}]})),"."):null,this.state.unconfirmed?t().createElement(Ba,{onAction:this.handleNewChatAcceptance}):t().createElement(xa,{tinode:this.props.tinode,topicName:this.state.topic,noInput:!!this.props.forwardMessage,disabled:!this.state.isWriter||this.state.deleted,reply:this.state.reply,initMessage:this.state.contentToEdit,onKeyPress:this.sendKeyPress,onRecordingProgress:this.sendKeyPress,onSendMessage:this.sendMessage,onAttachFile:this.props.forwardMessage?null:this.handleAttachFile,onAttachImage:this.props.forwardMessage?null:this.handleAttachImageOrVideo,onAttachAudio:this.props.forwardMessage?null:this.sendAudioAttachment,onError:this.props.onError,onQuoteClick:this.handleQuoteClick,onCancelReply:this.handleCancelReply}));i=t().createElement(t().Fragment,null,t().createElement("div",{id:"topic-caption-panel",className:"caption-panel"},this.props.displayMobile?t().createElement("a",{href:"#",id:"hide-message-view",onClick:e=>{e.preventDefault(),this.props.onHideMessagesView()}},t().createElement("i",{className:"material-icons"},"arrow_back")):null,t().createElement("div",{className:"avatar-box"},t().createElement(ls,{tinode:this.props.tinode,avatar:u,topic:this.state.topic,title:this.state.title,deleted:this.state.deleted}),n?null:t().createElement("span",{className:m})),t().createElement("div",{id:"topic-title-group"},t().createElement("div",{id:"topic-title",className:g},this.state.title||t().createElement("i",null,t().createElement(a.FormattedMessage,{id:"unnamed_topic",defaultMessage:[{type:0,value:"Unnamed"}]})),t().createElement(Jt,{badges:o})),t().createElement("div",{id:"topic-last-seen"},p)),r?t().createElement(La,{tinode:this.props.tinode,subscribers:this.state.onlineSubs}):t().createElement("div",{id:"topic-users"}),t().createElement("div",null,t().createElement("a",{href:"#",onClick:this.handleContextClick},t().createElement("i",{className:"material-icons"},"more_vert")))),this.props.displayMobile?t().createElement($s,{level:this.props.errorLevel,text:this.props.errorText,onClearError:this.props.onError}):null,t().createElement(Ws,{show:this.state.fetchingMessages}),f,this.state.dragging&&this.isDragEnabled()?t().createElement("div",{className:"drag-n-drop"},e(Ka.drag_file)):null)}s=t().createElement("div",{id:"topic-view",ref:this.mountDnDEvents},i)}else s=t().createElement(ja,{serverVersion:this.props.serverVersion,serverAddress:this.props.serverAddress});return s}}const Ya=(0,a.injectIntl)(Xa);class Ja extends t().PureComponent{render(){return t().createElement("a",{href:"#",onClick:e=>{e.preventDefault(),this.props.onBack()}},t().createElement("i",{className:"material-icons"},"arrow_back"))}}class Za extends t().PureComponent{render(){return t().createElement("div",null,t().createElement("a",{href:"#",onClick:e=>{e.preventDefault(),this.props.onNewTopic()}},t().createElement("i",{className:"material-icons"},"chat"))," ",t().createElement("a",{href:"#",onClick:e=>{e.preventDefault(),this.props.onSettings()}},t().createElement("i",{className:"material-icons"},"settings")))}}class ei extends t().PureComponent{render(){return t().createElement("div",null,t().createElement("a",{href:"#",onClick:e=>{e.preventDefault(),this.props.onSignUp()}},t().createElement("i",{className:"material-icons"},"person_add"))," ",t().createElement("a",{href:"#",onClick:e=>{e.preventDefault(),this.props.onSettings()}},t().createElement("i",{className:"material-icons"},"settings")))}}class ti extends t().PureComponent{render(){const e=[];this.props.trustedBadges&&this.props.trustedBadges.map((t=>{e.push({icon:t,color:"badge-inv"})}));let s=null;return this.props.tinode&&(s=this.props.tinode.authorizeURL(is(this.props.avatar,"image"))),t().createElement("div",{id:"side-caption-panel",className:"caption-panel"},this.props.onCancel?t().createElement(Ja,{onBack:this.props.onCancel}):null,s?t().createElement("div",{id:"self-avatar",className:"avatar-box"},t().createElement(ls,{tinode:this.props.tinode,avatar:s,topic:this.props.myUserId,title:this.props.title})):null,t().createElement("div",{id:"sidepanel-title",className:"panel-title"},this.props.title,t().createElement(Jt,{badges:e})),"login"===this.props.state?t().createElement(ei,{onSignUp:this.props.onSignUp,onSettings:this.props.onSettings}):"contacts"===this.props.state?t().createElement(Za,{onNewTopic:this.props.onNewTopic,onSettings:this.props.onSettings}):null)}}function si(e,t){return e&&e.substring(0,t)}class ai extends t().Component{constructor(e){super(e);const t=this.props.tinode.getMeTopic();this.state={fullName:si(t.public?t.public.fn:void 0,Gt.S8),description:si(t.public?t.public.note:void 0,Gt.EI),avatar:(0,vs.PD)(t.public?t.public.photo:null)}}render(){return t().createElement("div",{className:"scrollable-panel"},t().createElement("div",{className:"panel-form-column"},t().createElement("a",{href:"#",className:"flat-button float-right",onClick:e=>{e.preventDefault(),this.props.onNavigate("general")}},t().createElement("i",{className:"material-icons"},"edit")," ",t().createElement(a.FormattedMessage,{id:"button_edit",defaultMessage:[{type:0,value:"Edit"}]})),t().createElement("center",null,t().createElement(zs,{tinode:this.props.tinode,avatar:this.state.avatar,readOnly:!0,uid:this.props.myUserId,title:this.state.fullName})),t().createElement("div",{className:"group"},t().createElement("label",{className:"small"},t().createElement(a.FormattedMessage,{id:"label_your_name",defaultMessage:[{type:0,value:"Your name"}]})),t().createElement("div",{className:"large ellipsized"},this.state.fullName)),t().createElement("div",{className:"group"},t().createElement("label",{className:"small"},t().createElement(a.FormattedMessage,{id:"label_user_id",defaultMessage:[{type:0,value:"ID:"}]}))," ",t().createElement("tt",null,this.props.myUserId)),t().createElement("div",{className:"group"},t().createElement(js,{trustedBadges:this.props.trustedBadges})),this.state.description?t().createElement("div",{className:"group"},t().createElement("label",{className:"small"},t().createElement(a.FormattedMessage,{id:"label_description",defaultMessage:[{type:0,value:"Description"}]})),t().createElement("div",null,this.state.description)):null),t().createElement("div",{className:"hr"}),t().createElement("div",{className:"panel-form-column"},t().createElement("a",{href:"#",className:"flat-button",onClick:e=>{e.preventDefault(),this.props.onNavigate("notif")}},t().createElement("i",{className:"material-icons"},"notifications")," ",t().createElement(a.FormattedMessage,{id:"sidepanel_title_acc_notifications",defaultMessage:[{type:0,value:"Notifications"}]})),t().createElement("a",{href:"#",className:"flat-button",onClick:e=>{e.preventDefault(),this.props.onNavigate("security")}},t().createElement("i",{className:"material-icons"},"security")," ",t().createElement(a.FormattedMessage,{id:"button_security",defaultMessage:[{type:0,value:"Security"}]})),t().createElement("a",{href:"#",className:"flat-button",onClick:e=>{e.preventDefault(),this.props.onNavigate("support")}},t().createElement("i",{className:"material-icons"},"contact_support")," ",t().createElement(a.FormattedMessage,{id:"sidepanel_title_acc_support",defaultMessage:[{type:0,value:"Support"}]}))))}}const ii=(0,a.defineMessages)({archived_contacts_title:{id:"archived_contacts",defaultMessage:[{type:0,value:"Archived contacts ("},{type:1,value:"count"},{type:0,value:")"}]}});class ni extends t().Component{constructor(e){super(e),this.handleAction=this.handleAction.bind(this),this.state=ni.deriveStateFromProps(e)}static deriveStateFromProps(e){const t=[];let s=0,a=0;return e.chatList.map((i=>{const n=i.acs&&!i.acs.isJoiner();n&&e.blocked&&t.push(i),n||e.blocked||(i.private&&i.private.arch?e.archive?t.push(i):a++:e.archive||(t.push(i),s+=i.unread>0?1:0))})),t.sort(((e,t)=>(t.touched||0)-(e.touched||0))),a>0&&t.push({action:"archive",title:ii.archived_contacts_title,values:{count:a}}),{contactList:t,unreadThreads:s}}componentDidUpdate(e,t){if(e.chatList!=this.props.chatList||e.archive!=this.props.archive||e.blocked!=this.props.blocked){const e=ni.deriveStateFromProps(this.props);this.setState(e),e.unreadThreads!=t.unreadThreads&&es(e.unreadThreads)}}handleAction(e){this.props.onShowArchive()}render(){return t().createElement(a.FormattedMessage,{id:"contacts_not_found",defaultMessage:[{type:0,value:"You have no chats"},{type:0,value:" "},{type:0,value:"¯∖_(ツ)_/¯"}]},(e=>t().createElement(Fs,{tinode:this.props.tinode,connected:this.props.connected,contacts:this.state.contactList,emptyListMessage:e,topicSelected:this.props.topicSelected,myUserId:this.props.myUserId,showOnline:!0,showUnread:!0,onTopicSelected:this.props.onTopicSelected,showContextMenu:this.props.showContextMenu,onAction:this.handleAction})))}}class ri{static setObject(e,t){localStorage.setItem(e,JSON.stringify(t))}static getObject(e){const t=localStorage.getItem(e);return t&&JSON.parse(t)}static updateObject(e,t){const s=this.getObject(e);this.setObject(e,Object.assign(s||{},t))}static removeItem(e){localStorage.removeItem(e)}}const oi=t().lazy((e=>Promise.all([r.e(765),r.e(78)]).then(r.bind(r,2078))));class li extends t().PureComponent{constructor(e){super(e),this.state={login:"",password:"",meth:"",email:"",tel:"",fn:"",imageUrl:null,uploadUrl:null,newAvatar:null,newAvatarMime:null,errorCleared:!1,buttonDisabled:!1,saveToken:ri.getObject("keep-logged-in")},this.handleLoginChange=this.handleLoginChange.bind(this),this.handlePasswordChange=this.handlePasswordChange.bind(this),this.handleEmailChange=this.handleEmailChange.bind(this),this.handlePhoneChange=this.handlePhoneChange.bind(this),this.handleFnChange=this.handleFnChange.bind(this),this.handleImageChanged=this.handleImageChanged.bind(this),this.handleToggleSaveToken=this.handleToggleSaveToken.bind(this),this.handleAvatarCropped=this.handleAvatarCropped.bind(this),this.handleAvatarCropCancel=this.handleAvatarCropCancel.bind(this),this.uploadAvatar=this.uploadAvatar.bind(this),this.handleSubmit=this.handleSubmit.bind(this),e.tinode.connect().catch((e=>{this.props.onError(e.message,"err")}))}handleLoginChange(e){this.setState({login:e.target.value})}handlePasswordChange(e){this.setState({password:e})}handleEmailChange(e){this.setState({meth:"email",email:e.target.value})}handlePhoneChange(e){this.setState({meth:"tel",tel:e})}handleFnChange(e){this.setState({fn:e.target.value})}handleImageChanged(e,t){this.setState({newAvatar:t,newAvatarMime:e})}handleToggleSaveToken(){ri.setObject("keep-logged-in",!this.state.saveToken),this.setState({saveToken:!this.state.saveToken})}handleSubmit(e){e.preventDefault(),this.setState({errorCleared:!1}),this.props.onCreateAccount(this.state.login.trim(),this.state.password.trim(),ts(this.state.fn.trim().substring(0,Gt.S8),this.state.uploadUrl),{meth:this.state.meth,val:"email"==this.state.meth?this.state.email:"tel"==this.state.meth?this.state.tel:null})}handleAvatarCropped(e,t,s,a){const i=t?URL.createObjectURL(t):null;this.setState({avatar:i,newAvatar:null,newAvatarMime:null}),t&&this.uploadAvatar(e,t,s,a)}handleAvatarCropCancel(){this.setState({newAvatar:null,newAvatarMime:null})}uploadAvatar(e,t,s,a){const i=e=>{let{mime:t,blob:s}=e;if(this.setState({imageUrl:URL.createObjectURL(s),buttonDisabled:!0}),s.size>Gt.uv){this.props.tinode.getLargeFileHelper().upload(s,"newacc").then((e=>this.setState({uploadUrl:e}))).catch((e=>this.props.onError(e.message,"err"))).finally((e=>this.setState({buttonDisabled:!1})))}else(0,vs.w8)(s).then((e=>this.setState({uploadUrl:(0,vs.PD)({data:e.bits,type:t})}))).finally((e=>this.setState({buttonDisabled:!1})))};s>Gt.IX||a>Gt.IX||s!=a?(0,vs.EA)(t,Gt.IX,Gt.IX,Gt.GQ,!0).then((e=>i(e))).catch((e=>this.props.onError(e.message,"err"))):i({mime:e,blob:t,width:s,height:a})}render(){const s=(this.props.tinode.getServerParam("reqCred",{}).auth||[])[0]||"email";if(this.state.newAvatar)return t().createElement(ia,{avatar:this.state.newAvatar,mime:this.state.newAvatarMime,onSubmit:this.handleAvatarCropped,onCancel:this.handleAvatarCropCancel,onError:this.props.onError});let i="primary";return this.props.disabled&&(i+=" disabled"),t().createElement("form",{className:"panel-form-column",onSubmit:this.handleSubmit},t().createElement("div",{className:"panel-form-row"},t().createElement("div",{className:"umn"},t().createElement(a.FormattedMessage,{id:"login_prompt",defaultMessage:[{type:0,value:"Login"}]},(e=>t().createElement("input",{type:"text",placeholder:e,autoComplete:"user-name",value:this.state.login,onChange:this.handleLoginChange,required:!0,autoFocus:!0}))),t().createElement(a.FormattedMessage,{id:"password_prompt",defaultMessage:[{type:0,value:"Password"}]},(e=>t().createElement(na,{placeholder:e,autoComplete:"new-password",value:this.state.password,onFinished:this.handlePasswordChange,required:!0})))),t().createElement(zs,{tinode:this.props.tinode,avatar:this.state.imageUrl,onImageUpdated:this.handleImageChanged,onError:this.props.onError})),t().createElement("div",{className:"panel-form-row"},t().createElement(a.FormattedMessage,{id:"full_name_prompt",defaultMessage:[{type:0,value:"Full name, e.g. John Doe"}]},(e=>t().createElement("input",{type:"text",placeholder:e,autoComplete:"name",value:this.state.fn,onChange:this.handleFnChange,required:!0})))),"email"==s?t().createElement("div",{className:"panel-form-row"},t().createElement(a.FormattedMessage,{id:"email_prompt",defaultMessage:[{type:0,value:"Email, e.g. jdoe@example.com"}]},(e=>t().createElement("input",{type:"email",placeholder:e,autoComplete:"email",value:this.state.email,onChange:this.handleEmailChange,required:!0})))):"tel"==s?t().createElement(t().Fragment,null,t().createElement("div",{className:"panel-form-row"},t().createElement("label",{className:"small gray"},t().createElement(a.FormattedMessage,{id:"mobile_phone_number",defaultMessage:[{type:0,value:"Mobile phone number"}]}))),t().createElement("div",{className:"panel-form-row"},t().createElement(e.Suspense,{fallback:t().createElement("div",null,t().createElement(a.FormattedMessage,{id:"loading_note",defaultMessage:[{type:0,value:"Loading..."}]}))},t().createElement(oi,{autoFocus:!1,onShowCountrySelector:this.props.onShowCountrySelector,onSubmit:this.handlePhoneChange})))):null,t().createElement("div",{className:"panel-form-row"},t().createElement(Ks,{id:"save-token",name:"save-token",checked:this.state.saveToken,onChange:this.handleToggleSaveToken}),t().createElement(a.FormattedMessage,{id:"stay_logged_in",defaultMessage:[{type:0,value:"Stay logged in"}]},(e=>t().createElement("label",{htmlFor:"save-token"}," ",e)))),t().createElement("div",{className:"dialog-buttons"},t().createElement("button",{className:i,type:"submit",disabled:this.state.buttonDisabled},t().createElement(a.FormattedMessage,{id:"button_sign_up",defaultMessage:[{type:0,value:"Sign up"}]}))))}}class ci extends t().PureComponent{constructor(e){super(e),this.handleCheckboxClick=this.handleCheckboxClick.bind(this)}handleCheckboxClick(e,t){"sound"==e?this.props.onToggleMessageSounds(t):"alert"==e?this.props.onTogglePushNotifications(t):"incognito"==e&&this.props.onToggleIncognitoMode(t)}render(){return t().createElement("div",{className:"scrollable-panel"},t().createElement("div",{className:"panel-form-row"},t().createElement("label",{htmlFor:"message-sound"},t().createElement(a.FormattedMessage,{id:"label_message_sound",defaultMessage:[{type:0,value:"Message sound:"}]})),t().createElement(Ks,{name:"sound",id:"message-sound",checked:this.props.messageSounds,onChange:this.handleCheckboxClick})),t().createElement("div",{className:"panel-form-row"},t().createElement("label",{htmlFor:"desktop-alerts"},this.props.desktopAlertsEnabled?t().createElement(a.FormattedMessage,{id:"label_push_notifications",defaultMessage:[{type:0,value:"Notification alerts:"}]}):t().createElement(a.FormattedMessage,{id:"label_push_notifications_disabled",defaultMessage:[{type:0,value:"Notification alerts (requires HTTPS):"}]})),t().createElement(Ks,{name:"alert",id:"desktop-alerts",checked:this.props.desktopAlerts,onChange:this.props.desktopAlertsEnabled?this.handleCheckboxClick:null})),t().createElement("div",{className:"panel-form-row"},t().createElement("label",{htmlFor:"incognito-mode"},t().createElement(a.FormattedMessage,{id:"label_incognito_mode",defaultMessage:[{type:0,value:"Incognito mode:"}]})),t().createElement(Ks,{name:"incognito",id:"incognito-mode",checked:this.props.incognitoMode,onChange:this.handleCheckboxClick})))}}const di=(0,a.defineMessages)({delete_account:{id:"delete_account",defaultMessage:[{type:0,value:"Delete account"}]},delete_account_warning:{id:"delete_account_warning",defaultMessage:[{type:0,value:"Are you sure you want to delete your account? It cannot be undone."}]}});class hi extends t().Component{constructor(e){super(e);const t=this.props.tinode.getMeTopic();let s=0;t.contacts((e=>{e.acs&&!e.acs.isJoiner()&&s++}));const a=t.getDefaultAccess();this.state={auth:a?a.auth:null,anon:a?a.anon:null,showPermissionEditorFor:void 0,blockedCount:s},this.handlePasswordUpdate=this.handlePasswordUpdate.bind(this),this.handleLaunchPermissionsEditor=this.handleLaunchPermissionsEditor.bind(this),this.handleHidePermissionsEditor=this.handleHidePermissionsEditor.bind(this),this.handlePermissionsChanged=this.handlePermissionsChanged.bind(this),this.handleDeleteAccount=this.handleDeleteAccount.bind(this)}handlePasswordUpdate(e){this.setState({password:e}),this.props.onUpdatePassword(e)}handleLaunchPermissionsEditor(e){this.setState({showPermissionEditorFor:e,editedPermissions:this.state[e]})}handleHidePermissionsEditor(){this.setState({showPermissionEditorFor:void 0})}handlePermissionsChanged(e){let t={};t[this.state.showPermissionEditorFor]=e,this.props.onUpdateAccountDesc("me",void 0,void 0,t);let s={showPermissionEditorFor:void 0};s[this.state.showPermissionEditorFor]=e,this.setState(s)}handleDeleteAccount(e){e.preventDefault();const{formatMessage:t}=this.props.intl;this.props.onShowAlert(t(di.delete_account),t(di.delete_account_warning),(e=>this.props.onDeleteAccount()),null,!0,null)}render(){return t().createElement(t().Fragment,null,this.state.showPermissionEditorFor?t().createElement(sa,{mode:this.state.editedPermissions,skip:"O",onSubmit:this.handlePermissionsChanged,onCancel:this.handleHidePermissionsEditor}):t().createElement("div",{className:"scrollable-panel"},t().createElement("div",{className:"panel-form-column"},t().createElement("label",{className:"small"},t().createElement(a.FormattedMessage,{id:"label_password",defaultMessage:[{type:0,value:"Password"}]})),t().createElement("div",null,t().createElement(a.FormattedMessage,{id:"password_unchanged_prompt",defaultMessage:[{type:0,value:"Unchanged"}]},(e=>t().createElement(ra,{placeholder:e,type:"password",onFinished:this.handlePasswordUpdate}))))),t().createElement("div",{className:"hr"}),t().createElement("div",{className:"panel-form-column"},t().createElement("a",{href:"#",className:"danger flat-button",onClick:e=>{e.preventDefault(),this.props.onLogout()}},t().createElement("i",{className:"material-icons"},"exit_to_app")," ",t().createElement(a.FormattedMessage,{id:"button_logout",defaultMessage:[{type:0,value:"Logout"}]})),t().createElement("a",{href:"#",className:"danger flat-button",onClick:e=>{this.handleDeleteAccount(e)}},t().createElement("i",{className:"material-icons"},"delete")," ",t().createElement(a.FormattedMessage,{id:"button_delete_account",defaultMessage:[{type:0,value:"Delete account"}]}))),t().createElement("div",{className:"hr"}),t().createElement("div",{className:"panel-form-column"},t().createElement("div",null,t().createElement("label",{className:"small"},t().createElement(a.FormattedMessage,{id:"label_default_access_mode",defaultMessage:[{type:0,value:"Default access mode:"}]}))),t().createElement("div",{className:"quoted"},t().createElement("div",null,"Auth: ",t().createElement("tt",{className:"clickable",onClick:this.handleLaunchPermissionsEditor.bind(this,"auth")},this.state.auth)),t().createElement("div",null,"Anon: ",t().createElement("tt",{className:"clickable",onClick:this.handleLaunchPermissionsEditor.bind(this,"anon")},this.state.anon)))),this.state.blockedCount>0?t().createElement(t().Fragment,null,t().createElement("div",{className:"hr"}),t().createElement("div",{className:"panel-form-row"},t().createElement("i",{className:"material-icons"},"block")," ",t().createElement("a",{href:"#",className:"gray",onClick:e=>{e.preventDefault(),this.props.onShowBlocked()}},t().createElement(a.FormattedMessage,{id:"blocked_contacts_link",defaultMessage:[{type:0,value:"Blocked contacts ("},{type:1,value:"count"},{type:0,value:")"}],values:{count:this.state.blockedCount}})))):null))}}const pi=(0,a.injectIntl)(hi);class ui extends t().PureComponent{render(){return t().createElement("div",{className:"scrollable-panel"},t().createElement("div",{className:"panel-form-column"},t().createElement("a",{href:Gt.li,className:"flat-button",target:"_blank"},t().createElement("i",{className:"material-icons"},"email")," ",t().createElement(a.FormattedMessage,{id:"link_contact_us",defaultMessage:[{type:0,value:"Contact Us"}]})),t().createElement("a",{href:Gt.S9,className:"flat-button",target:"_blank"},t().createElement("i",{className:"material-icons"},"description")," ",t().createElement(a.FormattedMessage,{id:"link_terms_of_service",defaultMessage:[{type:0,value:"Terms of Service"}]})),t().createElement("a",{href:Gt.NW,className:"flat-button",target:"_blank"},t().createElement("i",{className:"material-icons"},"policy")," ",t().createElement(a.FormattedMessage,{id:"link_privacy_policy",defaultMessage:[{type:0,value:"Privacy Policy"}]}))),t().createElement("div",{className:"hr"}),t().createElement("div",{className:"panel-form-column"},t().createElement("div",{className:"panel-form-row"},t().createElement("label",{className:"small"},t().createElement(a.FormattedMessage,{id:"label_client",defaultMessage:[{type:0,value:"Client:"}]})),Gt.iC),t().createElement("div",{className:"panel-form-row"},t().createElement("label",{className:"small"},t().createElement(a.FormattedMessage,{id:"label_sdk",defaultMessage:[{type:0,value:"SDK:"}]})),zt.Tinode.getLibrary()),t().createElement("div",{className:"panel-form-row"},t().createElement("label",{className:"small"},t().createElement(a.FormattedMessage,{id:"label_server",defaultMessage:[{type:0,value:"Server:"}]})),this.props.serverVersion),t().createElement("div",{className:"panel-form-row"},t().createElement("label",{className:"small"},t().createElement(a.FormattedMessage,{id:"label_server_address",defaultMessage:[{type:0,value:"Server address:"}]})),this.props.serverAddress)))}}class mi extends t().Component{constructor(e){super(e),this.state={login:e.login,password:"",hostName:e.serverAddress,saveToken:e.persist},this.handleLoginChange=this.handleLoginChange.bind(this),this.handlePasswordChange=this.handlePasswordChange.bind(this),this.handleToggleSaveToken=this.handleToggleSaveToken.bind(this),this.handleSubmit=this.handleSubmit.bind(this)}handleLoginChange(e){this.setState({login:e.target.value})}handlePasswordChange(e){this.setState({password:e.target.value})}handleToggleSaveToken(){this.props.onPersistenceChange(!this.state.saveToken),this.setState({saveToken:!this.state.saveToken})}handleSubmit(e){e.preventDefault(),this.props.onLogin(this.state.login.trim(),this.state.password.trim())}render(){let e="primary";return this.props.disabled&&(e+=" disabled"),t().createElement("form",{id:"login-form",onSubmit:this.handleSubmit},t().createElement(a.FormattedMessage,{id:"login_prompt",defaultMessage:[{type:0,value:"Login"}]},(e=>t().createElement("input",{type:"text",id:"inputLogin",placeholder:e,autoComplete:"username",autoCorrect:"off",autoCapitalize:"none",value:this.state.login,onChange:this.handleLoginChange,required:!0,autoFocus:!0}))),t().createElement(a.FormattedMessage,{id:"password_prompt",defaultMessage:[{type:0,value:"Password"}]},(e=>t().createElement(na,{type:"password",id:"inputPassword",placeholder:e,autoComplete:"current-password",value:this.state.password,onChange:this.handlePasswordChange,required:!0}))),t().createElement("div",{className:"panel-form-row"},t().createElement(Ks,{id:"save-token",name:"save-token",checked:this.state.saveToken,onChange:this.handleToggleSaveToken}),t().createElement("label",{htmlFor:"save-token"}," ",t().createElement(a.FormattedMessage,{id:"stay_logged_in",defaultMessage:[{type:0,value:"Stay logged in"}]})),t().createElement("a",{href:"#reset"},t().createElement(a.FormattedMessage,{id:"forgot_password_link",defaultMessage:[{type:0,value:"Forgot password?"}]}))),t().createElement("div",{className:"dialog-buttons"},t().createElement("button",{className:e,type:"submit"},t().createElement(a.FormattedMessage,{id:"button_sign_in",defaultMessage:[{type:0,value:"Sign in"}]}))))}}const gi=(0,a.defineMessages)({invalid_id:{id:"error_invalid_id",defaultMessage:[{type:0,value:"Invalid ID"}]}});class fi extends t().PureComponent{constructor(e){super(e),this.state={groupId:""},this.handleChange=this.handleChange.bind(this),this.handleKeyPress=this.handleKeyPress.bind(this),this.handleSubmit=this.handleSubmit.bind(this)}handleChange(e){this.setState({groupId:e.target.value})}handleKeyPress(e){"Enter"===e.key&&this.handleSubmit(e)}handleSubmit(e){if(e.preventDefault(),this.state.groupId){const e=this.state.groupId.trim(),t=e.substr(0,3);e.length>3&&["usr","grp","chn"].includes(t)?this.props.onSubmit(e):this.props.onError(this.props.intl.formatMessage(gi.invalid_id),"err")}}render(){return t().createElement("div",{className:"panel-form"},t().createElement("div",{className:"panel-form-row"},t().createElement(a.FormattedMessage,{id:"group_user_id_prompt",defaultMessage:[{type:0,value:"Group or User ID"}]},(e=>t().createElement("input",{type:"text",placeholder:e,value:this.state.groupId,onChange:this.handleChange,onKeyPress:this.handleKeyPress,required:!0,autoFocus:!0})))),t().createElement("div",{className:"dialog-buttons"},t().createElement("button",{className:"primary",onClick:this.handleSubmit},t().createElement(a.FormattedMessage,{id:"button_subscribe",defaultMessage:[{type:0,value:"Subscribe"}]}))))}}const vi=(0,a.injectIntl)(fi);class bi extends t().PureComponent{constructor(e){super(e),this.fullName=t().createRef(),this.state={fullName:"",private:"",description:"",imageUrl:null,tags:[],isChannel:!1,newAvatar:null,newAvatarMime:null},this.handleFieldEdit=this.handleFieldEdit.bind(this),this.handleImageChanged=this.handleImageChanged.bind(this),this.handleAvatarCropped=this.handleAvatarCropped.bind(this),this.handleAvatarCropCancel=this.handleAvatarCropCancel.bind(this),this.uploadAvatar=this.uploadAvatar.bind(this),this.handleTagsChanged=this.handleTagsChanged.bind(this),this.handleChannelToggle=this.handleChannelToggle.bind(this),this.handleSubmit=this.handleSubmit.bind(this)}componentDidMount(){}handleFieldEdit(e,t){this.setState({[e]:t.target.value||""})}handleImageChanged(e,t){this.setState({newAvatar:t,newAvatarMime:e})}handleAvatarCropped(e,t,s,a){const i=t?URL.createObjectURL(t):null;this.setState({imageUrl:i,newAvatar:null,newAvatarMime:null}),t&&this.uploadAvatar(e,t,s,a)}handleAvatarCropCancel(){this.setState({newAvatar:null,newAvatarMime:null})}uploadAvatar(e,t,s,a){const i=e=>{let{mime:t,blob:s}=e;if(s.size>Gt.uv){this.props.tinode.getLargeFileHelper().upload(s).then((e=>this.setState({imageUrl:e}))).catch((e=>this.props.onError(e.message,"err")))}else(0,vs.w8)(s).then((e=>this.setState({imageUrl:(0,vs.PD)({data:e.bits,type:t})})))};s>Gt.IX||a>Gt.IX||s!=a?(0,vs.EA)(t,Gt.IX,Gt.IX,Gt.GQ,!0).then((e=>i(e))).catch((e=>this.props.onError(e.message,"err"))):i({mime:e,blob:t,width:s,height:a})}handleTagsChanged(e){this.setState({tags:e})}handleChannelToggle(){this.setState({isChannel:!this.state.isChannel})}handleSubmit(e){e.preventDefault();const t=this.state.fullName.trim().substring(0,Gt.S8),s=this.state.private.trim().substring(0,Gt.S8),a=this.state.description.trim().substring(0,Gt.EI);t&&this.props.onSubmit(t,a,this.state.imageUrl,s,this.state.tags,this.state.isChannel)}render(){if(this.state.newAvatar)return t().createElement(ia,{avatar:this.state.newAvatar,mime:this.state.newAvatarMime,onSubmit:this.handleAvatarCropped,onCancel:this.handleAvatarCropCancel,onError:this.props.onError});let e="primary";return this.props.disabled&&(e+=" disabled"),t().createElement("form",{className:"panel-form",onSubmit:this.handleSubmit},t().createElement("div",{className:"panel-form-column"},t().createElement("center",null,t().createElement(zs,{tinode:this.props.tinode,avatar:this.state.imageUrl,onError:this.props.onError,onImageUpdated:this.handleImageChanged})),t().createElement("div",{className:"group"},t().createElement("label",{className:"small",htmlFor:"new-topic-fn"},t().createElement(a.FormattedMessage,{id:"label_topic_name",defaultMessage:[{type:0,value:"Name"}]})),t().createElement(a.FormattedMessage,{id:"topic_name_editing_placeholder",defaultMessage:[{type:0,value:"Freeform name of the group"}]},(e=>t().createElement("input",{type:"text",id:"new-topic-fn",placeholder:e,ref:this.fullName,value:this.state.fullName,onChange:this.handleFieldEdit.bind(this,"fullName"),autoFocus:!0,required:!0,tabIndex:0})))),t().createElement("div",{className:"group"},t().createElement("label",{className:"small",htmlFor:"new-topic-priv"},t().createElement(a.FormattedMessage,{id:"label_private",defaultMessage:[{type:0,value:"Private comment"}]})),t().createElement(a.FormattedMessage,{id:"private_editing_placeholder",defaultMessage:[{type:0,value:"Visible to you only"}]},(e=>t().createElement("input",{type:"text",id:"new-topic-priv",placeholder:e,value:this.state.private,onChange:this.handleFieldEdit.bind(this,"private"),tabIndex:1})))),t().createElement("div",{className:"group"},t().createElement("label",{className:"small",htmlFor:"new-topic-desc"},t().createElement(a.FormattedMessage,{id:"label_description",defaultMessage:[{type:0,value:"Description"}]})),t().createElement(a.FormattedMessage,{id:"description_editing_placeholder",defaultMessage:[{type:0,value:"Description (optional)"}]},(e=>t().createElement("input",{type:"text",id:"new-topic-desc",placeholder:e,value:this.state.description,onChange:this.handleFieldEdit.bind(this,"description"),tabIndex:2}))))),t().createElement("div",{className:"panel-form-row"},t().createElement(Ks,{checked:this.state.isChannel,tabIndex:3,onChange:this.handleChannelToggle})," ",t().createElement("label",{onClick:this.handleChannelToggle},t().createElement(a.FormattedMessage,{id:"channel_prompt",defaultMessage:[{type:0,value:"This is a channel"}]}))),t().createElement(a.FormattedMessage,{id:"title_tag_manager",defaultMessage:[{type:0,value:"Tags (search & discovery)"}]},(e=>t().createElement(oa,{tinode:this.props.tinode,tags:this.state.tags,activated:!0,onTagsChanged:this.handleTagsChanged,tabIndex:4,title:e}))),t().createElement("div",{className:"dialog-buttons"},t().createElement("button",{className:e},t().createElement(a.FormattedMessage,{id:"button_create",defaultMessage:[{type:0,value:"Create"}]}))))}}const Ei=(0,a.defineMessages)({search_for_contacts:{id:"search_for_contacts",defaultMessage:[{type:0,value:"Use search to find contacts"}]},search_no_results:{id:"search_no_results",defaultMessage:[{type:0,value:"Search returned no results"}]},search_placeholder:{id:"search_placeholder",defaultMessage:[{type:0,value:"List like email:alice@example.com, tel:17025550003..."}]}});class yi extends t().Component{constructor(e){super(e),this.state={tabSelected:"find",searchQuery:null},this.handleTabClick=this.handleTabClick.bind(this),this.handleSearchContacts=this.handleSearchContacts.bind(this),this.handleSearchResultSelected=this.handleSearchResultSelected.bind(this),this.handleNewGroupSubmit=this.handleNewGroupSubmit.bind(this),this.handleGroupByID=this.handleGroupByID.bind(this)}componentDidMount(){this.props.onInitFind()}handleTabClick(e){e.preventDefault(),za.navigateTo(za.addUrlParam(window.location.hash,"tab",e.currentTarget.dataset.id)),this.setState({tabSelected:e.currentTarget.dataset.id})}handleSearchContacts(e){this.props.onSearchContacts(e),this.setState({searchQuery:zt.Tinode.isNullValue(e)?null:e})}handleSearchResultSelected(e){"find"==this.state.tabSelected&&(za.navigateTo(za.removeUrlParam(window.location.hash,"tab")),this.props.onCreateTopic(e))}handleNewGroupSubmit(e,t,s,a,i,n){za.navigateTo(za.removeUrlParam(window.location.hash,"tab")),this.props.onCreateTopic(void 0,{public:ts(e,s,null,t),private:a,tags:i},n)}handleGroupByID(e){za.navigateTo(za.removeUrlParam(window.location.hash,"tab")),this.props.onCreateTopic(e)}render(){const{formatMessage:e}=this.props.intl,s=e(this.state.searchQuery?Ei.search_no_results:Ei.search_for_contacts),i=e(Ei.search_placeholder);return t().createElement("div",{className:"flex-column"},t().createElement("ul",{className:"tabbar"},t().createElement("li",{className:"find"===this.state.tabSelected?"active":null},t().createElement("a",{href:"#","data-id":"find",onClick:this.handleTabClick},t().createElement(a.FormattedMessage,{id:"tabtitle_find_user",defaultMessage:[{type:0,value:"find"}]}))),t().createElement("li",{className:"grp"===this.state.tabSelected?"active":null},t().createElement("a",{href:"#","data-id":"grp",onClick:this.handleTabClick},t().createElement(a.FormattedMessage,{id:"tabtitle_new_group",defaultMessage:[{type:0,value:"new group"}]}))),t().createElement("li",{className:"byid"===this.state.tabSelected?"active":null},t().createElement("a",{href:"#","data-id":"byid",onClick:this.handleTabClick},t().createElement(a.FormattedMessage,{id:"tabtitle_group_by_id",defaultMessage:[{type:0,value:"by id"}]})))),"grp"===this.state.tabSelected?t().createElement(bi,{tinode:this.props.tinode,onSubmit:this.handleNewGroupSubmit,onError:this.props.onError}):"byid"===this.state.tabSelected?t().createElement(vi,{onSubmit:this.handleGroupByID,onError:this.props.onError}):t().createElement("div",{className:"flex-column"},t().createElement(xs,{placeholder:i,onSearchContacts:this.handleSearchContacts}),t().createElement(Fs,{tinode:this.props.tinode,contacts:this.props.searchResults,myUserId:this.props.myUserId,emptyListMessage:s,showOnline:!1,showUnread:!1,showContextMenu:!1,onTopicSelected:this.handleSearchResultSelected})))}}const Ci=(0,a.injectIntl)(yi),wi=t().lazy((e=>Promise.all([r.e(765),r.e(78)]).then(r.bind(r,2078))));class Si extends t().PureComponent{constructor(e){super(e),this.state={tel:"",email:"",password:"",sent:!1,haveCode:!1,code:""},this.handleSubmit=this.handleSubmit.bind(this),this.handleEmailChange=this.handleEmailChange.bind(this),this.handlePasswordChange=this.handlePasswordChange.bind(this),this.handleCodeChange=this.handleCodeChange.bind(this),this.handleShowCodeField=this.handleShowCodeField.bind(this),e.tinode.connect().catch((e=>{this.props.onError(e.message,"err")}))}componentDidMount(){const e=za.parseUrlHash(window.location.hash);this.setState({token:e.params.token,scheme:e.params.scheme})}handleSubmit(e){if(e.preventDefault(),this.state.token)this.props.onReset(this.state.password.trim(),{scheme:"token",token:this.state.token});else if(this.state.code&&this.method){const e=this.state.email.trim()||this.state.tel.trim();this.props.onReset(this.state.password.trim(),{scheme:"code",secret:`${this.state.code}:${this.method}:${e}`})}else{const e=this.state.email.trim(),t=this.state.tel.trim();this.setState({email:e,tel:t}),this.props.onRequest(this.method,e||t).then((e=>this.setState({sent:!0})))}}handleEmailChange(e){this.setState({email:e.target.value})}handlePasswordChange(e){this.setState({password:e.target.value})}handleCodeChange(e){this.setState({code:e.target.value.replace(/[^\d]/g,"")})}handleShowCodeField(e){e.preventDefault(),this.setState({haveCode:!0})}render(){this.method=(this.props.tinode.getServerParam("reqCred",{}).auth||[])[0]||"email";const s=!(this.state.token&&this.state.scheme),i=!s||this.state.haveCode||this.state.sent,n=t().createElement(t().Fragment,null,t().createElement("label",{className:"small gray",htmlFor:"new-password"},t().createElement(a.FormattedMessage,{id:"label_new_password",defaultMessage:[{type:0,value:"New password"}]})),t().createElement(a.FormattedMessage,{id:"new_password_placeholder",defaultMessage:[{type:0,value:"Enter new password"}]},(e=>t().createElement(na,{id:"new-password",placeholder:e,autoComplete:"new-password",value:this.state.password,required:!0,autoFocus:!0,onChange:this.handlePasswordChange})))),r=t().createElement(t().Fragment,null,this.state.haveCode?null:t().createElement("label",{htmlFor:"inputEmail"},t().createElement(a.FormattedMessage,{id:"label_reset_password",defaultMessage:[{type:0,value:"Send a password reset email"}]})),t().createElement(a.FormattedMessage,{id:"credential_email_prompt",defaultMessage:[{type:0,value:"Your registration email"}]},(e=>t().createElement("input",{type:"email",id:"inputEmail",placeholder:e,autoComplete:"email",value:this.state.email,onChange:this.handleEmailChange,required:!0,autoFocus:!0})))),o=t().createElement(t().Fragment,null,this.state.haveCode?null:t().createElement("div",null,t().createElement("label",null,t().createElement(a.FormattedMessage,{id:"label_reset_password_tel",defaultMessage:[{type:0,value:"Send SMS to reset password"}]}))),t().createElement("div",null,t().createElement("label",{className:"small gray"},t().createElement(a.FormattedMessage,{id:"mobile_phone_number",defaultMessage:[{type:0,value:"Mobile phone number"}]}))),t().createElement("div",{className:"panel-form-row"},t().createElement(e.Suspense,{fallback:t().createElement("div",{className:"panel-form-row"},t().createElement(a.FormattedMessage,{id:"loading_note",defaultMessage:[{type:0,value:"Loading..."}]}))},t().createElement(wi,{autoFocus:!0,onShowCountrySelector:this.props.onShowCountrySelector,onSubmit:e=>this.setState({tel:e})})))),l=t().createElement(t().Fragment,null,"email"==this.method?t().createElement(a.FormattedMessage,{id:"password_reset_email_sent",defaultMessage:[{type:0,value:"An email with security code has been sent to "},{type:1,value:"email"},{type:0,value:". Enter the code below."}],values:{email:t().createElement("tt",null,this.state.email)}}):"tel"==this.method?t().createElement(a.FormattedMessage,{id:"password_reset_sms_sent",defaultMessage:[{type:0,value:"A text message with security code has been sent to "},{type:1,value:"phone"},{type:0,value:". Enter the code below."}],values:{phone:t().createElement("tt",null,this.state.tel)}}):null),c=t().createElement(t().Fragment,null,t().createElement("div",null,t().createElement("label",{className:"small gray",htmlFor:"enter-confirmation-code"},t().createElement(a.FormattedMessage,{id:"enter_confirmation_code_prompt",defaultMessage:[{type:0,value:"Confirmation code"}]}))),t().createElement("div",null,t().createElement(a.FormattedMessage,{id:"numeric_confirmation_code_prompt",defaultMessage:[{type:0,value:"Numbers only"}]},(e=>t().createElement("input",{type:"text",id:"enter-confirmation-code",placeholder:e,maxLength:10,value:this.state.code,onChange:this.handleCodeChange,required:!0}))))),d="email"==this.method?r:"tel"==this.method?o:null;return t().createElement("form",{id:"password-reset-form",onSubmit:this.handleSubmit},this.state.sent?l:s?d:null,this.state.haveCode||this.state.sent?c:null,i?n:null,t().createElement("div",{className:"dialog-buttons"},this.state.haveCode||this.state.sent?null:t().createElement("a",{href:"#",onClick:this.handleShowCodeField,style:{marginRight:"auto"}},t().createElement(a.FormattedMessage,{id:"password_i_have_code",defaultMessage:[{type:0,value:"I have code"}]})),t().createElement("button",{className:"primary",type:"submit"},i?t().createElement(a.FormattedMessage,{id:"button_reset",defaultMessage:[{type:0,value:"Reset"}]}):t().createElement(a.FormattedMessage,{id:"button_send_request",defaultMessage:[{type:0,value:"Send request"}]}))))}}class Mi extends t().PureComponent{constructor(e){super(e),this.state={hostName:e.serverAddress,changed:!1},this.handleHostNameChange=this.handleHostNameChange.bind(this),this.handleEditingFinished=this.handleEditingFinished.bind(this),this.handleKeyDown=this.handleKeyDown.bind(this)}handleHostNameChange(e){this.setState({hostName:e.target.value,changed:!0})}handleEditingFinished(){this.state.changed&&(this.setState({changed:!1}),this.props.onServerAddressChange(this.state.hostName.trim()))}handleKeyDown(e){"Enter"==e.key&&this.handleEditingFinished()}render(){var e=[];for(let s in Gt.Rc){let a=Gt.Rc[s];e.push(t().createElement("option",{key:a,value:a}))}return t().createElement("div",{className:"panel-form-row"},t().createElement("input",{type:"search",id:"host-name",placeholder:this.props.hostName,list:"known-hosts",className:"quoted",value:this.state.hostName,onChange:this.handleHostNameChange,onBlur:this.handleEditingFinished,onKeyDown:this.handleKeyDown,required:!0}),t().createElement("datalist",{id:"known-hosts"},e))}}class _i extends t().PureComponent{constructor(e){super(e),this.state={transport:e.transport||"def",serverAddress:e.serverAddress,secureConnection:e.secureConnection},this.handleSubmit=this.handleSubmit.bind(this),this.handleTransportSelected=this.handleTransportSelected.bind(this),this.handleServerAddressChange=this.handleServerAddressChange.bind(this),this.handleToggleSecure=this.handleToggleSecure.bind(this)}handleSubmit(e){e.preventDefault(),this.props.onUpdate({transport:this.state.transport,serverAddress:this.state.serverAddress,secureConnection:this.state.secureConnection})}handleTransportSelected(e){this.setState({transport:e.currentTarget.value})}handleServerAddressChange(e){this.setState({serverAddress:e})}handleToggleSecure(e){this.setState({secureConnection:!this.state.secureConnection})}render(){const e={def:"default",ws:"websocket",lp:"long polling"},s=[];return["def","ws","lp"].map((a=>{const i="transport-"+a,n=e[a];s.push(t().createElement("li",{key:a},t().createElement("input",{type:"radio",id:i,name:"transport-select",value:a,checked:this.state.transport===a,onChange:this.handleTransportSelected}),t().createElement("label",{htmlFor:i},n)))})),t().createElement("form",{id:"settings-form",className:"panel-form",onSubmit:this.handleSubmit},t().createElement("div",{className:"panel-form-row"},t().createElement("label",{className:"small"},t().createElement(a.FormattedMessage,{id:"label_server_to_use",defaultMessage:[{type:0,value:"Server to use:"}]}))),t().createElement(Mi,{serverAddress:this.state.serverAddress,onServerAddressChange:this.handleServerAddressChange}),t().createElement("div",{className:"panel-form-row"},t().createElement(Ks,{id:"secure-connection",name:"secure-connection",checked:this.state.secureConnection,className:"quoted",onChange:this.handleToggleSecure}),t().createElement("label",{htmlFor:"secure-connection"},t().createElement(a.FormattedMessage,{id:"label_use_secure_connection",defaultMessage:[{type:0,value:"Use secure connection"}]}))),t().createElement("div",{className:"panel-form-row"},t().createElement("label",{className:"small"},t().createElement(a.FormattedMessage,{id:"label_wire_transport",defaultMessage:[{type:0,value:"Wire transport:"}]}))),t().createElement("div",{className:"panel-form-row"},t().createElement("ul",{className:"quoted"},s)),t().createElement("div",{className:"dialog-buttons"},t().createElement("button",{type:"submit",className:"primary"},t().createElement(a.FormattedMessage,{id:"button_update",defaultMessage:[{type:0,value:"Update"}]}))))}}const Ti=(0,a.defineMessages)({phone:{id:"phone_dative",defaultMessage:[{type:0,value:"phone"}]},email:{id:"email_dative",defaultMessage:[{type:0,value:"email"}]}});class ki extends t().PureComponent{constructor(e){super(e),this.state={code:e.credCode||"",codeReceived:e.credCode},this.handleChange=this.handleChange.bind(this),this.handleKeyPress=this.handleKeyPress.bind(this),this.handleSubmit=this.handleSubmit.bind(this),this.handleCancel=this.handleCancel.bind(this)}static getDerivedStateFromProps(e,t){return e.credCode!=t.codeReceived?{code:e.credCode||"",codeReceived:e.credCode}:t}componentDidMount(){this.props.credCode&&this.props.onSubmit(this.props.credMethod,this.props.credCode,this.props.credToken)}componentDidUpdate(e,t){this.state.codeReceived&&this.state.code&&this.state.code!=t.code&&this.props.onSubmit(this.props.credMethod,this.state.code,this.props.credToken)}handleChange(e){this.setState({code:e.target.value.trim()})}handleKeyPress(e){"Enter"===e.key?this.handleSubmit(e):"Escape"==e.key&&this.handleCancel(e)}handleSubmit(e){e.preventDefault(),this.state.code&&this.state.code.trim()&&this.props.onSubmit(this.props.credMethod,this.state.code.trim(),this.props.credToken)}handleCancel(e){e.preventDefault(),this.props.onCancel()}render(){const{formatMessage:e}=this.props.intl,s={email:e(Ti.email),tel:e(Ti.phone)}[this.props.credMethod]||this.props.credMethod;return t().createElement("div",{className:"panel-form"},t().createElement("div",{className:"panel-form-row"},t().createElement("label",{className:"small gray",htmlFor:"enter-confirmation-code"},t().createElement(a.FormattedMessage,{id:"enter_confirmation_code_prompt",defaultMessage:[{type:0,value:"Confirmation code"}],values:{method:s}}))),t().createElement("div",{className:"panel-form-row"},t().createElement(a.FormattedMessage,{id:"numeric_confirmation_code_prompt",defaultMessage:[{type:0,value:"Numbers only"}]},(e=>t().createElement("input",{type:"text",id:"enter-confirmation-code",placeholder:e,value:this.state.code,onChange:this.handleChange,onKeyPress:this.handleKeyPress,required:!0})))),t().createElement("div",{className:"dialog-buttons"},t().createElement("button",{className:"secondary",onClick:this.handleCancel},t().createElement(a.FormattedMessage,{id:"button_cancel",defaultMessage:[{type:0,value:"Cancel"}]})),t().createElement("button",{className:"primary",onClick:this.handleSubmit},t().createElement(a.FormattedMessage,{id:"button_confirm",defaultMessage:[{type:0,value:"Confirm"}]}))))}}const Ni=(0,a.injectIntl)(ki),Ai=(0,a.defineMessages)({login:{id:"sidepanel_title_login",defaultMessage:[{type:0,value:"Sign In"}]},register:{id:"sidepanel_title_register",defaultMessage:[{type:0,value:"Create Account"}]},settings:{id:"sidepanel_title_settings",defaultMessage:[{type:0,value:"Settings"}]},edit:{id:"sidepanel_title_account_settings",defaultMessage:[{type:0,value:"Account Settings"}]},general:{id:"panel_title_general",defaultMessage:[{type:0,value:"General"}]},security:{id:"panel_title_security",defaultMessage:[{type:0,value:"Security"}]},crop:{id:"panel_title_crop",defaultMessage:[{type:0,value:"Drag to Adjust"}]},notif:{id:"sidepanel_title_acc_notifications",defaultMessage:[{type:0,value:"Notifications"}]},support:{id:"sidepanel_title_acc_support",defaultMessage:[{type:0,value:"Support"}]},newtpk:{id:"sidepanel_title_newtpk",defaultMessage:[{type:0,value:"Start New Chat"}]},cred:{id:"sidepanel_title_cred",defaultMessage:[{type:0,value:"Confirm Credentials"}]},reset:{id:"sidepanel_title_reset",defaultMessage:[{type:0,value:"Reset Password"}]},archive:{id:"sidepanel_title_archive",defaultMessage:[{type:0,value:"Archived Chats"}]},blocked:{id:"sidepanel_title_blocked",defaultMessage:[{type:0,value:"Blocked Chats"}]}});class Di extends t().PureComponent{constructor(e){super(e),this.handleNewTopic=this.handleNewTopic.bind(this)}handleNewTopic(){this.props.onNavigate("newtpk")}render(){const{formatMessage:e}=this.props.intl,s=this.props.state||(this.props.myUserId?"contacts":"login");let a,i,n,r;return"contacts"==s?(a=this.props.title,i=!this.props.avatar||this.props.avatar,n=this.props.trustedBadges):(a=e(Ai[s]),i=!1,n=null),-1==["login","contacts"].indexOf(s)&&(r=this.props.onCancel),t().createElement("div",{id:"sidepanel",className:this.props.hideSelf?"nodisplay":null},t().createElement(ti,{state:s,title:a,avatar:i,tinode:this.props.tinode,trustedBadges:n,myUserId:this.props.myUserId,onSignUp:this.props.onSignUp,onSettings:this.props.onSettings,onNewTopic:this.handleNewTopic,onCancel:r}),t().createElement($s,{level:this.props.errorLevel,text:this.props.errorText,action:this.props.errorAction,actionText:this.props.errorActionText,onClearError:this.props.onError}),t().createElement(Ws,{show:this.props.loadSpinnerVisible}),"login"===s?t().createElement(mi,{login:this.props.login,disabled:this.props.loginDisabled,persist:this.props.persist,onLogin:this.props.onLoginRequest,onPersistenceChange:this.props.onPersistenceChange}):"register"===s?t().createElement(li,{tinode:this.props.tinode,serverVersion:this.props.serverVersion,onShowCountrySelector:this.props.onShowCountrySelector,onCreateAccount:this.props.onCreateAccount,onCancel:this.props.onCancel,onError:this.props.onError}):"settings"===s?t().createElement(_i,{transport:this.props.transport,serverAddress:this.props.serverAddress,secureConnection:this.props.secureConnection,onCancel:this.props.onCancel,onUpdate:this.props.onGlobalSettings}):"edit"===s?t().createElement(ai,{tinode:this.props.tinode,myUserId:this.props.myUserId,trustedBadges:this.props.trustedBadges,onNavigate:this.props.onNavigate}):"general"===s||"crop"===s?t().createElement(ca,{topic:"me",tinode:this.props.tinode,myUserId:this.props.myUserId,onUpdateTopicDesc:this.props.onUpdateAccountDesc,onUpdateTagsRequest:this.props.onUpdateAccountTags,onCredAdd:this.props.onCredAdd,onCredDelete:this.props.onCredDelete,onCredConfirm:this.props.onCredConfirm,onError:this.props.onError}):"notif"===s?t().createElement(ci,{messageSounds:this.props.messageSounds,desktopAlerts:this.props.desktopAlerts,desktopAlertsEnabled:this.props.desktopAlertsEnabled,incognitoMode:this.props.incognitoMode,onTogglePushNotifications:this.props.onTogglePushNotifications,onToggleMessageSounds:this.props.onToggleMessageSounds,onToggleIncognitoMode:this.props.onToggleIncognitoMode}):"security"===s?t().createElement(pi,{tinode:this.props.tinode,onUpdateAccountDesc:this.props.onUpdateAccountDesc,onUpdatePassword:this.props.onUpdatePassword,onLogout:this.props.onLogout,onDeleteAccount:this.props.onDeleteAccount,onShowAlert:this.props.onShowAlert,onShowBlocked:this.props.onShowBlocked}):"support"===s?t().createElement(ui,{serverAddress:this.props.serverAddress,serverVersion:this.props.serverVersion}):"contacts"===s||"archive"==s||"blocked"==s?t().createElement(ni,{tinode:this.props.tinode,myUserId:this.props.myUserId,connected:this.props.connected,topicSelected:this.props.topicSelected,archive:"archive"==s,blocked:"blocked"==s,chatList:this.props.chatList,showContextMenu:this.props.showContextMenu,onTopicSelected:this.props.onTopicSelected,onShowArchive:this.props.onShowArchive}):"newtpk"===s?t().createElement(Ci,{tinode:this.props.tinode,searchResults:this.props.searchResults,onInitFind:this.props.onInitFind,onSearchContacts:this.props.onSearchContacts,onCreateTopic:this.props.onCreateTopic,onError:this.props.onError}):"cred"===s?t().createElement(Ni,{credCode:this.props.credCode,credMethod:this.props.credMethod,credToken:this.props.credToken,onSubmit:this.props.onValidateCredentials,onCancel:this.props.onCancel}):"reset"===s?t().createElement(Si,{tinode:this.props.tinode,serverVersion:this.props.serverVersion,onShowCountrySelector:this.props.onShowCountrySelector,onRequest:this.props.onPasswordResetRequest,onReset:this.props.onResetPassword,onCancel:this.props.onCancel}):null)}}const Pi=(0,a.injectIntl)(Di);var Ii=r(3119);function Ri(){let e=Gt.Mv;return"object"==typeof window.location&&("file:"==window.location.protocol||"localhost"==window.location.hostname?e=Gt.Rc.local:window.location.hostname&&(e=window.location.hostname+(window.location.port?":"+window.location.port:""))),e}function Fi(){return"object"==typeof window.location&&"https:"==window.location.protocol}const xi=t().lazy((e=>r.e(290).then(r.bind(r,1290)))),Ui=new Audio("audio/msg.m4a"),Li=(0,a.defineMessages)({reconnect_countdown:{id:"reconnect_countdown",defaultMessage:[{type:0,value:"Disconnected. Reconnecting in "},{type:1,value:"seconds"},{type:0,value:"…"}]},reconnect_now:{id:"reconnect_now",defaultMessage:[{type:0,value:"Try now"}]},push_init_failed:{id:"push_init_failed",defaultMessage:[{type:0,value:"Failed to initialize push notifications"}]},invalid_security_token:{id:"invalid_security_token",defaultMessage:[{type:0,value:"Invalid security token"}]},no_connection:{id:"no_connection",defaultMessage:[{type:0,value:"No connection"}]},code_doesnot_match:{id:"code_doesnot_match",defaultMessage:[{type:0,value:"Code does not match"}]},menu_item_info:{id:"menu_item_info",defaultMessage:[{type:0,value:"Info"}]},menu_item_audio_call:{id:"menu_item_audio_call",defaultMessage:[{type:0,value:"Call"}]},menu_item_video_call:{id:"menu_item_video_call",defaultMessage:[{type:0,value:"Video call"}]},cred_confirmed_successfully:{id:"cred_confirmed_successfully",defaultMessage:[{type:0,value:"Confirmed successfully"}]}});class Oi extends t().Component{constructor(e){super(e),this.selfRef=t().createRef(),this.state=this.getBlankState(),this.handleResize=this.handleResize.bind(this),this.handleHashRoute=this.handleHashRoute.bind(this),this.handleOnline=this.handleOnline.bind(this),this.checkForAppUpdate=this.checkForAppUpdate.bind(this),this.handleVisibilityEvent=this.handleVisibilityEvent.bind(this),this.handleError=this.handleError.bind(this),this.handleLoginRequest=this.handleLoginRequest.bind(this),this.handlePersistenceChange=this.handlePersistenceChange.bind(this),this.handleConnected=this.handleConnected.bind(this),this.handleAutoreconnectIteration=this.handleAutoreconnectIteration.bind(this),this.doLogin=this.doLogin.bind(this),this.handleLoginSuccessful=this.handleLoginSuccessful.bind(this),this.handleDisconnect=this.handleDisconnect.bind(this),this.tnMeMetaDesc=this.tnMeMetaDesc.bind(this),this.tnMeContactUpdate=this.tnMeContactUpdate.bind(this),this.tnMeSubsUpdated=this.tnMeSubsUpdated.bind(this),this.resetContactList=this.resetContactList.bind(this),this.tnInitFind=this.tnInitFind.bind(this),this.tnFndSubsUpdated=this.tnFndSubsUpdated.bind(this),this.handleSearchContacts=this.handleSearchContacts.bind(this),this.handleTopicSelected=this.handleTopicSelected.bind(this),this.handleHideMessagesView=this.handleHideMessagesView.bind(this),this.handleSendMessage=this.handleSendMessage.bind(this),this.handleNewChatInvitation=this.handleNewChatInvitation.bind(this),this.handleNewAccount=this.handleNewAccount.bind(this),this.handleNewAccountRequest=this.handleNewAccountRequest.bind(this),this.handleUpdatePasswordRequest=this.handleUpdatePasswordRequest.bind(this),this.handleUpdateAccountTagsRequest=this.handleUpdateAccountTagsRequest.bind(this),this.handleToggleIncognitoMode=this.handleToggleIncognitoMode.bind(this),this.handleSettings=this.handleSettings.bind(this),this.handleGlobalSettings=this.handleGlobalSettings.bind(this),this.handleShowArchive=this.handleShowArchive.bind(this),this.handleShowBlocked=this.handleShowBlocked.bind(this),this.handleToggleMessageSounds=this.handleToggleMessageSounds.bind(this),this.handleCredAdd=this.handleCredAdd.bind(this),this.handleCredDelete=this.handleCredDelete.bind(this),this.handleCredConfirm=this.handleCredConfirm.bind(this),this.initFCMessaging=this.initFCMessaging.bind(this),this.toggleFCMToken=this.toggleFCMToken.bind(this),this.handlePushMessage=this.handlePushMessage.bind(this),this.handleSidepanelCancel=this.handleSidepanelCancel.bind(this),this.handleStartTopicRequest=this.handleStartTopicRequest.bind(this),this.handleNewTopicCreated=this.handleNewTopicCreated.bind(this),this.handleTopicUpdateRequest=this.handleTopicUpdateRequest.bind(this),this.handleUnarchive=this.handleUnarchive.bind(this),this.handleChangePermissions=this.handleChangePermissions.bind(this),this.handleTagsUpdateRequest=this.handleTagsUpdateRequest.bind(this),this.handleLogout=this.handleLogout.bind(this),this.handleDeleteAccount=this.handleDeleteAccount.bind(this),this.handleDeleteTopicRequest=this.handleDeleteTopicRequest.bind(this),this.handleDeleteMessagesRequest=this.handleDeleteMessagesRequest.bind(this),this.handleLeaveUnsubRequest=this.handleLeaveUnsubRequest.bind(this),this.handleBlockTopicRequest=this.handleBlockTopicRequest.bind(this),this.handleReportTopic=this.handleReportTopic.bind(this),this.handleShowContextMenu=this.handleShowContextMenu.bind(this),this.defaultTopicContextMenu=this.defaultTopicContextMenu.bind(this),this.handleHideContextMenu=this.handleHideContextMenu.bind(this),this.handleShowAlert=this.handleShowAlert.bind(this),this.handleShowInfoView=this.handleShowInfoView.bind(this),this.handleMemberUpdateRequest=this.handleMemberUpdateRequest.bind(this),this.handleValidateCredentialsRequest=this.handleValidateCredentialsRequest.bind(this),this.handlePasswordResetRequest=this.handlePasswordResetRequest.bind(this),this.handleResetPassword=this.handleResetPassword.bind(this),this.handleContextMenuAction=this.handleContextMenuAction.bind(this),this.handleShowCountrySelector=this.handleShowCountrySelector.bind(this),this.handleShowForwardDialog=this.handleShowForwardDialog.bind(this),this.handleHideForwardDialog=this.handleHideForwardDialog.bind(this),this.handleStartVideoCall=this.handleStartVideoCall.bind(this),this.handleStartAudioCall=this.handleStartAudioCall.bind(this),this.handleInfoMessage=this.handleInfoMessage.bind(this),this.handleDataMessage=this.handleDataMessage.bind(this),this.handleCallClose=this.handleCallClose.bind(this),this.handleCallInvite=this.handleCallInvite.bind(this),this.handleCallRinging=this.handleCallRinging.bind(this),this.handleCallHangup=this.handleCallHangup.bind(this),this.handleCallSendOffer=this.handleCallSendOffer.bind(this),this.handleCallIceCandidate=this.handleCallIceCandidate.bind(this),this.handleCallSendAnswer=this.handleCallSendAnswer.bind(this),this.handleCallAccept=this.handleCallAccept.bind(this),this.sendMessageToTopic=this.sendMessageToTopic.bind(this),this.callTimeoutTimer=null}getBlankState(){const e=ri.getObject("settings")||{},t=!!ri.getObject("keep-logged-in");return{connected:!1,ready:!1,autoLogin:!1,transport:e.transport||null,serverAddress:e.serverAddress||Ri(),secureConnection:void 0===e.secureConnection?Fi():e.secureConnection,serverVersion:"no connection",messageSounds:!e.messageSoundsOff,incognitoMode:!1,desktopAlerts:t&&!!e.desktopAlerts,desktopAlertsEnabled:(Fi()||"object"==typeof window.location&&"localhost"==window.location.hostname)&&void 0!==oe&&"undefined"!=typeof navigator&&"undefined"!=typeof FIREBASE_INIT,firebaseToken:t?ri.getObject("firebase-token"):null,applicationVisible:!document.hidden,errorText:"",errorLevel:null,errorAction:void 0,errorActionText:null,sidePanelSelected:"login",sidePanelTitle:null,sidePanelAvatar:null,myTrustedBadges:[],loadSpinnerVisible:!1,login:"",password:"",persist:t,myUserId:null,liveConnection:navigator.onLine,topicSelected:"",topicSelectedOnline:!1,topicSelectedAcs:null,newTopicParams:null,loginDisabled:!1,displayMobile:window.innerWidth<=Gt.yl,infoPanel:void 0,mobilePanel:"sidepanel",callTopic:void 0,callState:0,callAudioOnly:void 0,callShouldStart:!1,contextMenuVisible:!1,contextMenuBounds:null,contextMenuClickAt:null,contextMenuParams:null,contextMenuItems:[],forwardDialogVisible:!1,forwardMessage:null,alertVisible:!1,alertParams:{},chatList:[],searchResults:[],searchableContacts:[],credMethod:void 0,credCode:void 0,credToken:void 0,requestedTopic:void 0}}componentDidMount(){if(window.addEventListener("resize",this.handleResize),window.addEventListener("online",(e=>{this.handleOnline(!0)})),window.addEventListener("offline",(e=>{this.handleOnline(!1)})),window.addEventListener("hashchange",this.handleHashRoute),"function"==typeof BroadcastChannel){new BroadcastChannel("tinode-sw").addEventListener("message",this.handlePushMessage)}else console.warn("Your browser does not support BroadcastChannel. Some features will not be available");document.addEventListener("visibilitychange",this.handleVisibilityEvent),this.setState({viewportWidth:document.documentElement.clientWidth,viewportHeight:document.documentElement.clientHeight}),new Promise(((e,t)=>{this.tinode=Oi.tnSetup(this.state.serverAddress,Fi(),this.state.transport,this.props.intl.locale,this.state.persist,e),this.tinode.onConnect=this.handleConnected,this.tinode.onDisconnect=this.handleDisconnect,this.tinode.onAutoreconnectIteration=this.handleAutoreconnectIteration,this.tinode.onInfoMessage=this.handleInfoMessage,this.tinode.onDataMessage=this.handleDataMessage})).then((e=>{this.state.desktopAlertsEnabled&&this.initFCMessaging().catch((e=>{}));const t=za.parseUrlHash(window.location.hash);this.resetContactList();const s=this.state.persist?ri.getObject("auth-token"):void 0;if(s&&(this.setState({autoLogin:!0}),s.expires=new Date(s.expires),this.tinode.setAuthToken(s),this.tinode.connect().catch((e=>{this.handleError(e.message,"err")}))),this.readTimer=null,this.readTimerCallback=null,["cred","reset","register"].includes(t.path[0]))this.handleHashRoute();else{this.setState({requestedTopic:t.path[1]});const e=t.params&&t.params.cred_done?za.addUrlParam("","cred_done",t.params.cred_done):"";za.navigateTo(e)}}))}componentWillUnmount(){window.removeEventListener("resize",this.handleResize),window.removeEventListener("hashchange",this.handleHashRoute),document.removeEventListener("visibilitychange",this.handleVisibilityEvent)}static tnSetup(e,t,s,a,i,n){const r=new zt.Tinode({appName:Gt.iC,host:e,apiKey:Gt.$h,transport:s,secure:t,persist:i},n);return r.setHumanLanguage(a),r.enableLogging(Gt.JG,!0),r}handlePushMessage(e){this.tinode.oobNotification(e.data||{})}initFCMessaging(){const{formatMessage:e,locale:t}=this.props.intl,s=(t,s)=>{console.error(t,s),this.handleError(e(Li.push_init_failed),"err"),this.setState({firebaseToken:null}),ri.updateObject("settings",{desktopAlerts:!1})};try{return this.fcm=qt(oe(FIREBASE_INIT,Gt.iC)),navigator.serviceWorker.getRegistration("/service-worker.js").then((e=>e||navigator.serviceWorker.register("/service-worker.js").then((e=>(this.checkForAppUpdate(e),e))))).then((e=>((e.active||e.installing).postMessage(JSON.stringify({locale:t,version:Ii.l})),Oi.requestFCMToken(this.fcm,e)))).then((e=>{const t=ri.getObject("keep-logged-in");e!=this.state.firebaseToken&&(this.tinode.setDeviceToken(e),t&&ri.setObject("firebase-token",e)),this.setState({firebaseToken:e,desktopAlerts:!0}),t&&ri.updateObject("settings",{desktopAlerts:!0}),Wt(this.fcm,(e=>{this.handlePushMessage(e)}))})).catch((e=>{throw s(e),e}))}catch(e){return s(e),Promise.reject(e)}}static requestFCMToken(e,t){return Vt(e,{serviceWorkerRegistration:t,vapidKey:FIREBASE_INIT.messagingVapidKey}).then((t=>t||Notification.requestPermission().then((t=>{if("granted"===t)return Vt(e,{serviceWorkerRegistration:reg,vapidKey:FIREBASE_INIT.messagingVapidKey}).then((e=>{if(e)return e;throw new Error("Failed to initialize notifications")}));throw new Error("No permission to send notifications: "+t)}))))}handleResize(){const e=document.documentElement.clientWidth<=Gt.yl;this.setState({viewportWidth:document.documentElement.clientWidth,viewportHeight:document.documentElement.clientHeight}),this.state.displayMobile!=e&&this.setState({displayMobile:e})}checkForAppUpdate(e){e.onupdatefound=s=>{const i=e.installing;i.onstatechange=e=>{if("installed"==i.state&&navigator.serviceWorker.controller){const e=t().createElement(t().Fragment,null,t().createElement(a.FormattedMessage,{id:"update_available",defaultMessage:[{type:0,value:"Update available."}]})," ",t().createElement("a",{href:""},t().createElement(a.FormattedMessage,{id:"reload_update",defaultMessage:[{type:0,value:"Reload"}]})),".");this.handleError(e,"info")}}}}handleHashRoute(){const e=za.parseUrlHash(window.location.hash),t={infoPanel:e.params.info,newTopicTabSelected:e.params.tab};if(e.path&&e.path.length>0){["register","settings","edit","notif","security","support","general","crop","cred","reset","newtpk","archive","blocked","contacts",""].includes(e.path[0])?t.sidePanelSelected=e.path[0]:console.warn("Unknown sidepanel view",e.path[0]);let s=e.path[1]||null;s!=this.state.topicSelected&&(zt.Tinode.topicType(s)||(s=null),Object.assign(t,{topicSelected:s,topicSelectedAcs:this.tinode.getTopicAccessMode(s)}))}else Object.assign(t,{sidePanelSelected:"",topicSelected:null});e.params.method&&(t.credMethod=e.params.method),e.params.code&&(t.credCode=e.params.code),e.params.token&&(t.credToken=e.params.token),e.params.cred_done&&Object.assign(t,Oi.stateForError(this.props.intl.formatMessage(Li.cred_confirmed_successfully),"info")),this.setState(t)}handleOnline(e){e?(this.handleError(),clearInterval(this.reconnectCountdown),this.tinode.reconnect()):this.handleError(this.props.intl.formatMessage(Li.no_connection),"warn"),this.setState({liveConnection:e})}handleVisibilityEvent(){this.setState({applicationVisible:!document.hidden})}static stateForError(e,t,s,a){return{errorText:e,errorLevel:t,errorAction:s,errorActionText:a,callShouldStart:!1}}handleError(e,t,s,a){this.setState(Oi.stateForError(e,t,s,a))}handleLoginRequest(e,t){this.setState({loginDisabled:!0,login:e,password:t,loadSpinnerVisible:!0,autoLogin:!0}),this.handleError("",null),this.tinode.isConnected()?this.doLogin(e,t,null,{meth:this.state.credMethod,resp:this.state.credCode}):this.tinode.connect().catch((e=>{this.setState({loginDisabled:!1,autoLogin:!1,loadSpinnerVisible:!1}),this.handleError(e.message,"err")})),this.state.desktopAlertsEnabled&&!this.state.firebaseToken&&this.initFCMessaging()}handlePersistenceChange(e){e?this.tinode.initStorage().then((e=>{ri.setObject("keep-logged-in",!0),this.setState({persist:!0})})):this.tinode.clearStorage().then((e=>{ri.setObject("keep-logged-in",!1),this.setState({persist:!1})}))}handleConnected(){clearInterval(this.reconnectCountdown),this.handleError();const e=this.tinode.getServerInfo();this.setState({serverVersion:e.ver+" "+(e.build?e.build:"none")}),this.state.autoLogin&&this.doLogin(this.state.login,this.state.password,null,{meth:this.state.credMethod,resp:this.state.credCode})}handleAutoreconnectIteration(e,t){if(clearInterval(this.reconnectCountdown),e<0)return void this.handleError();if(t)return void t.then((e=>{this.handleError()})).catch((e=>{this.handleError(e.message,"err")}));const{formatMessage:s}=this.props.intl;let a=e/1e3;a|=a,this.reconnectCountdown=setInterval((e=>{if(a<-10)return clearInterval(this.reconnectCountdown),void this.tinode.reconnect();const t=a>99?(0,Zt.nH)(a):a;this.handleError(s(Li.reconnect_countdown,{seconds:t}),"warn",(e=>{clearInterval(this.reconnectCountdown),this.tinode.reconnect()}),s(Li.reconnect_now)),a-=1}),1e3)}handleDisconnect(e){this.setState({connected:!1,ready:!1,topicSelectedOnline:!1,errorText:e&&e.message?e.message:"Disconnected",errorLevel:e&&e.message?"err":"warn",loginDisabled:!1,contextMenuVisible:!1,forwardDialogVisible:!1,serverVersion:"no connection"})}doLogin(e,t,s,a){if(this.tinode.isAuthenticated())return void za.navigateTo("");let i=s||(this.tinode.getAuthToken()||{}).token;if(!(e&&t||i))return za.navigateTo(""),void this.setState({loginDisabled:!1});a=zt.Tinode.credential(a);let n,r=this.tinode.isConnected()?Promise.resolve():this.tinode.connect();e&&t?(i=null,this.setState({password:null}),n=r.then((s=>this.tinode.loginBasic(e,t,a)))):n=r.then((e=>this.tinode.loginToken(i,a))),n.then((e=>{e.code>=300&&"validate credentials"===e.text?(this.setState({loadSpinnerVisible:!1}),a&&this.handleError(this.props.intl.formatMessage(Li.code_doesnot_match),"warn"),Oi.navigateToCredentialsView(e.params)):this.handleLoginSuccessful()})).catch((e=>{const t=e.code>=500;this.setState({loginDisabled:!1,credMethod:void 0,credCode:void 0,loadSpinnerVisible:!1,autoLogin:t}),this.handleError(e.message,"err"),console.warn("Login failed",e),t||(i&&this.handleLogout(),za.navigateTo(""))}))}static navigateToCredentialsView(e){const t=za.parseUrlHash(window.location.hash);t.path[0]="cred",t.params.method=e.cred[0],t.params.token=e.token,za.navigateTo(za.composeUrlHash(t.path,t.params))}handleLoginSuccessful(){this.handleError(),ri.getObject("keep-logged-in")&&ri.setObject("auth-token",this.tinode.getAuthToken());const e=this.state.requestedTopic,t=this.tinode.getMeTopic();t.onMetaDesc=this.tnMeMetaDesc,t.onContactUpdate=this.tnMeContactUpdate,t.onSubsUpdated=this.tnMeSubsUpdated,this.setState({connected:!0,credMethod:void 0,credCode:void 0,credToken:void 0,myUserId:this.tinode.getCurrentUserID(),autoLogin:!0,requestedTopic:void 0}),t.subscribe(t.startMetaQuery().withLaterSub().withDesc().withTags().withCred().build()).catch((e=>{this.tinode.disconnect(),localStorage.removeItem("auth-token"),this.handleError(e.message,"err"),za.navigateTo("")})).finally((e=>{this.setState({loadSpinnerVisible:!1})}));let s=za.setUrlSidePanel(window.location.hash,"contacts");e&&(s=za.setUrlTopic(s,e)),za.navigateTo(s)}tnMeMetaDesc(e){if(e){if(e.public&&this.setState({sidePanelTitle:e.public.fn,sidePanelAvatar:(0,vs.PD)(e.public.photo)}),e.trusted){const t=[];for(const[s,a]of Object.entries(e.trusted))a&&t.push(s);this.setState({myTrustedBadges:t})}e.acs&&this.setState({incognitoMode:!e.acs.isPresencer()})}}tnMeContactUpdate(e,t){if("on"==e||"off"==e)this.resetContactList(),this.state.topicSelected==t.topic&&this.setState({topicSelectedOnline:"on"==e});else if("read"==e)this.resetContactList();else if("msg"==e){const e=this.tinode.getTopic(t.topic),s=e&&e.isArchived();t.unread>0&&this.state.messageSounds&&!s&&(document.hidden||this.state.topicSelected!=t.topic)&&Ui.play().catch((e=>{})),this.resetContactList()}else"recv"==e||("gone"==e||"unsub"==e?(this.state.topicSelected==t.topic&&this.handleTopicSelected(null),this.resetContactList()):"acs"==e?this.state.topicSelected==t.topic&&this.setState({topicSelectedAcs:t.acs}):"del"==e||"upd"==e||"call"==e||console.info("Unsupported (yet) presence update:",e,"in",t.topic))}tnMeSubsUpdated(e){this.resetContactList()}static prepareSearchableContacts(e,t){const s={};for(const t of e)zt.Tinode.isP2PTopicName(t.topic)&&(s[t.topic]={user:t.topic,updated:t.updated,public:t.public,private:t.private,acs:t.acs});for(const e of t)s[e.user]||(s[e.user]=e);return Object.values(s)}resetContactList(){const e={chatList:[]};this.state.ready||(e.ready=!0),this.tinode.getMeTopic().contacts((t=>{t.topic||t.user||(t.topic=t.name),e.chatList.push(t),this.state.topicSelected==t.topic&&(e.topicSelectedOnline=t.online,e.topicSelectedAcs=t.acs)}));const t=new Date(0);e.chatList.sort(((e,s)=>(e.touched||t).getTime()-(s.touched||t).getTime())),e.searchableContacts=Oi.prepareSearchableContacts(e.chatList,this.state.searchResults),this.setState(e)}tnInitFind(){const e=this.tinode.getFndTopic();e.onSubsUpdated=this.tnFndSubsUpdated,e.isSubscribed()?this.tnFndSubsUpdated():e.subscribe(e.startMetaQuery().withSub().build()).catch((e=>{this.handleError(e.message,"err")}))}tnFndSubsUpdated(){const e=[];this.tinode.getFndTopic().contacts((t=>{e.push(t)})),this.setState({searchResults:e,searchableContacts:Oi.prepareSearchableContacts(this.state.chatList,e)})}handleSearchContacts(e){const t=this.tinode.getFndTopic();t.setMeta({desc:{public:e}}).then((e=>t.getMeta(t.startMetaQuery().withSub().build()))).catch((e=>this.handleError(e.message,"err")))}handleTopicSelected(e){this.state.newTopicParams&&this.state.newTopicParams._topicName!=e&&this.setState({newTopicParams:null}),e?(this.setState({errorText:"",errorLevel:null,mobilePanel:"topic-view",infoPanel:void 0}),this.state.topicSelected!=e&&(this.setState({topicSelectedOnline:this.tinode.isTopicOnline(e),topicSelectedAcs:this.tinode.getTopicAccessMode(e),forwardMessage:null}),za.navigateTo(za.setUrlTopic("",e)))):(this.setState({errorText:"",errorLevel:null,mobilePanel:"sidepanel",topicSelectedOnline:!1,topicSelectedAcs:null,infoPanel:void 0,forwardMessage:null}),za.navigateTo(za.setUrlTopic("",null)))}handleHideMessagesView(){this.setState({mobilePanel:"sidepanel"}),za.navigateTo(za.setUrlTopic(window.location.hash,null))}handleSendMessage(e,t,s,a){const i=this.tinode.getTopic(this.state.topicSelected);return this.sendMessageToTopic(i,e,t,s,a)}sendMessageToTopic(e,t,s,a,i){(t=e.createMessage(t,!1))._uploader=a,i&&(t.head=Object.assign(t.head||{},i));const n=[];if(s&&n.push(s),!e.isSubscribed()){const s=e.subscribe().then((s=>{let a=[];e.queuedMessages((s=>{s._sending||s.seq==t.seq||(s.head&&s.head.webrtc?a.push(s.seq):e.isSubscribed()&&e.publishMessage(s))})),a.length>0&&e.delMessagesList(a,!0)}));n.push(s)}return e.publishDraft(t,Promise.all(n)).then((t=>(e.isArchived()&&e.archive(!1),t))).catch((e=>this.handleError(e.message,"err")))}handleNewChatInvitation(e,t){const s=this.tinode.getTopic(e);let a=null;switch(t){case"accept":const i=s.getAccessMode().getGiven();a=s.setMeta({sub:{mode:i}}),s.isP2PType()&&(a=a.then((t=>s.setMeta({sub:{user:e,mode:i}}))));break;case"delete":a=s.delTopic(!0);break;case"block":const n=s.getAccessMode().updateWant("-JP").getWant();a=s.setMeta({sub:{mode:n}}).then((e=>this.handleTopicSelected(null)));break;default:console.warn("Unknown invitation action",'"'+t+'""')}null!=a&&a.catch((e=>this.handleError(e.message,"err")))}handleNewAccount(){this.handleError(),za.navigateTo(za.setUrlSidePanel(window.location.hash,"register"))}handleNewAccountRequest(e,t,s,a,i){this.handleError(),this.tinode.connect(this.state.serverAddress).then((n=>{let r;return s&&s.photo&&s.photo.ref&&(r=[s.photo.ref]),this.tinode.createAccountBasic(e,t,{public:s,tags:i,cred:zt.Tinode.credential(a),attachments:r})})).then((e=>{e.code>=300&&"validate credentials"==e.text?Oi.navigateToCredentialsView(e.params):this.handleLoginSuccessful(this)})).catch((e=>{this.handleError(e.message,"err")}))}handleToggleIncognitoMode(e){this.setState({incognitoMode:null});const t=this.tinode.getMeTopic(),s=t.getAccessMode().updateWant(e?"-P":"+P").getWant();t.setMeta({sub:{mode:s}}).catch((t=>{this.setState({incognitoMode:!e}),this.handleError(t.message,"err")}))}handleUpdateAccountTagsRequest(e,t){this.tinode.getMeTopic().setMeta({tags:t}).catch((e=>this.handleError(e.message,"err")))}handleSettings(){this.handleError(),za.navigateTo(za.setUrlSidePanel(window.location.hash,this.state.myUserId?"edit":"settings"))}handleGlobalSettings(e){const t=e.serverAddress||this.state.serverAddress,s=e.transport||this.state.transport,a=void 0===e.secureConnection?this.state.secureConnection:e.secureConnection;this.tinode&&(this.tinode.clearStorage(),this.tinode.onDisconnect=void 0,this.tinode.disconnect()),this.tinode=Oi.tnSetup(t,a,s,this.props.intl.locale,ri.getObject("keep-logged-in")),this.tinode.onConnect=this.handleConnected,this.tinode.onDisconnect=this.handleDisconnect,this.tinode.onAutoreconnectIteration=this.handleAutoreconnectIteration,this.tinode.onInfoMessage=this.handleInfoMessage,this.tinode.onDataMessage=this.handleDataMessage,this.setState({serverAddress:t,transport:s,secureConnection:a}),ri.setObject("settings",{serverAddress:t,transport:s,secureConnection:a}),za.navigateTo(za.setUrlSidePanel(window.location.hash,""))}handleShowArchive(){za.navigateTo(za.setUrlSidePanel(window.location.hash,this.state.myUserId?"archive":""))}handleShowBlocked(){za.navigateTo(za.setUrlSidePanel(window.location.hash,this.state.myUserId?"blocked":""))}toggleFCMToken(e){e?(this.setState({desktopAlerts:null}),this.state.firebaseToken?(this.setState({desktopAlerts:!0}),ri.getObject("keep-logged-in")&&ri.updateObject("settings",{desktopAlerts:!0})):this.initFCMessaging()):this.state.firebaseToken&&this.fcm?Ht(this.fcm).catch((e=>{console.error("Unable to delete token.",e)})).finally((e=>{ri.updateObject("settings",{desktopAlerts:!1}),localStorage.removeItem("firebase-token"),this.setState({desktopAlerts:!1,firebaseToken:null}),this.tinode.setDeviceToken(null)})):(this.setState({desktopAlerts:!1,firebaseToken:null}),ri.updateObject("settings",{desktopAlerts:!1}))}handleToggleMessageSounds(e){this.setState({messageSounds:e}),ri.updateObject("settings",{messageSoundsOff:!e})}handleCredAdd(e,t){this.tinode.getMeTopic().setMeta({cred:{meth:e,val:t}}).catch((e=>this.handleError(e.message,"err")))}handleCredDelete(e,t){this.tinode.getMeTopic().delCredential(e,t).catch((e=>this.handleError(e.message,"err")))}handleCredConfirm(e,t){Oi.navigateToCredentialsView({cred:[e]})}handleSidepanelCancel(){const e=za.parseUrlHash(window.location.hash);let t="";["security","support","general","notif"].includes(e.path[0])?t="edit":"crop"==e.path[0]?t="general":"blocked"==e.path[0]?t="security":this.state.myUserId&&(t="contacts"),e.path[0]=t,e.params&&(delete e.params.code,delete e.params.method,delete e.params.tab,delete e.params.scheme,delete e.params.token),za.navigateTo(za.composeUrlHash(e.path,e.params)),this.setState({errorText:"",errorLevel:null})}basicNavigator(e){za.navigateTo(za.setUrlSidePanel(window.location.hash,e))}infoNavigator(e){za.navigateTo(za.setUrlInfoPanel(window.location.hash,e))}handleStartTopicRequest(e,t,s){if(e&&this.tinode.isTopicCached(e))return void this.handleTopicSelected(e);const a={};zt.Tinode.isP2PTopicName(e)?(a.sub={mode:Gt.RK},a.desc={defacs:{auth:Gt.RK}}):(e=e||this.tinode.newGroupTopicName(s),t&&(a.desc={public:t.public,private:{comment:t.private}},a.tags=t.tags)),a._topicName=e,this.setState({newTopicParams:a},(t=>{this.handleTopicSelected(e)}))}handleNewTopicCreated(e,t){let s={};this.state.callShouldStart&&(s={callState:3,callShouldStart:!1}),this.state.topicSelected==e&&e!=t&&(s.topicSelected=t),this.setState(s,(e=>{za.navigateTo(za.setUrlTopic("",t))}))}handleTopicUpdateRequest(e,t,s,a){this.handleError();const i=this.tinode.getTopic(e);if(i){const e={};let n;t&&(t.photo&&(t.photo.ref&&t.photo.ref!=zt.Tinode.DEL_CHAR?n=[t.photo.ref]:t.photo.data&&t.photo.data!=zt.Tinode.DEL_CHAR||(t.photo=zt.Tinode.DEL_CHAR)),e.public=t),"string"==typeof s&&(e.private=s===zt.Tinode.DEL_CHAR?zt.Tinode.DEL_CHAR:{comment:s}),a&&(e.defacs=a),i.setMeta({desc:e,attachments:n}).catch((e=>this.handleError(e.message,"err")))}}handleUnarchive(e){const t=this.tinode.getTopic(e);t&&t.archive(!1).catch((e=>this.handleError(e.message,"err")))}handleUpdatePasswordRequest(e){this.handleError(),e&&this.tinode.updateAccountBasic(null,this.tinode.getCurrentLogin(),e).catch((e=>this.handleError(e.message,"err")))}handleChangePermissions(e,t,s){const a=this.tinode.getTopic(e);if(a){const e=a.getAccessMode();s?(e.updateGiven(t),t=e.getGiven()):(e.updateWant(t),t=e.getWant()),a.setMeta({sub:{user:s,mode:t}}).catch((e=>this.handleError(e.message,"err")))}}handleTagsUpdateRequest(e,t){const s=this.tinode.getTopic(e);s&&s.setMeta({tags:t}).catch((e=>this.handleError(e.message,"err")))}handleLogout(){let e;es(0),localStorage.removeItem("auth-token"),localStorage.removeItem("firebase-token"),localStorage.removeItem("settings"),this.state.firebaseToken&&Ht(this.fcm),clearInterval(this.reconnectCountdown),this.tinode?(e=this.tinode.clearStorage(),this.tinode.onDisconnect=void 0,this.tinode.disconnect()):e=Promose.resolve(),this.setState(this.getBlankState()),e.then((e=>{this.tinode=Oi.tnSetup(this.state.serverAddress,Fi(),this.state.transport,this.props.intl.locale,ri.getObject("keep-logged-in"),(e=>{this.tinode.onConnect=this.handleConnected,this.tinode.onDisconnect=this.handleDisconnect,this.tinode.onAutoreconnectIteration=this.handleAutoreconnectIteration,this.tinode.onInfoMessage=this.handleInfoMessage,this.tinode.onDataMessage=this.handleDataMessage,za.navigateTo("")}))}))}handleDeleteAccount(){this.tinode.delCurrentUser(!0).then((e=>{this.handleLogout()}))}handleDeleteTopicRequest(e){const t=this.tinode.getTopic(e);t&&t.delTopic(!0).then((e=>{za.navigateTo(za.setUrlTopic(window.location.hash,""))})).catch((e=>{this.handleError(e.message,"err")}))}handleDeleteMessagesRequest(e){const t=this.tinode.getTopic(e);t&&t.delMessagesAll(!0).catch((e=>this.handleError(e.message,"err")))}handleLeaveUnsubRequest(e){const t=this.tinode.getTopic(e);t&&t.leave(!0).then((e=>{za.navigateTo(za.setUrlTopic(window.location.hash,""))})).catch((e=>{this.handleError(e.message,"err")}))}handleBlockTopicRequest(e){const t=this.tinode.getTopic(e);t&&t.updateMode(null,"-JP").then((e=>{za.navigateTo(za.setUrlTopic(window.location.hash,""))})).catch((e=>this.handleError(e.message,"err")))}handleReportTopic(e){const t=this.tinode.getTopic(e);t&&(this.tinode.report("report",e),t.updateMode(null,"-JP").then((e=>{za.navigateTo(za.setUrlTopic(window.location.hash,""))})).catch((e=>this.handleError(e.message,"err"))))}handleShowContextMenu(e,t){this.setState({contextMenuVisible:!0,contextMenuClickAt:{x:e.x,y:e.y},contextMenuParams:e,contextMenuItems:t||this.defaultTopicContextMenu(e.topicName),contextMenuBounds:this.selfRef.current.getBoundingClientRect()})}handleShowForwardDialog(e){"newtpk"==this.state.sidePanelSelected&&this.handleSidepanelCancel();const t="➦ "+e.userName,s="string"==typeof e.content?zt.Drafty.init(e.content):zt.Drafty.forwardedContent(e.content),a=zt.Drafty.preview(s,Gt.vX,!0),i=zt.Drafty.append(zt.Drafty.appendLineBreak(zt.Drafty.mention(t,e.userFrom)),s),n=zt.Drafty.quote(t,e.userFrom,a),r={forwarded:e.topicName+":"+e.seq};this.setState({forwardDialogVisible:!0,forwardMessage:{head:r,msg:i,preview:n}})}defaultTopicContextMenu(e){const t=this.tinode.getTopic(e);if(t._deleted)return["topic_delete"];let s=!1,a=!1,i=!1,n=!1,r=!1,o=!1,l=!1;if(t){n=t.isSubscribed(),o=t.isArchived();const e=t.getAccessMode();e&&(s=e.isMuted(),a=!e.isJoiner(),i=!e.isJoiner("want"),r=e.isDeleter())}return l=!!this.tinode.getServerParam("iceServers"),[n?{title:this.props.intl.formatMessage(Li.menu_item_info),handler:this.handleShowInfoView}:null,n&&zt.Tinode.isP2PTopicName(e)&&l?{title:this.props.intl.formatMessage(Li.menu_item_audio_call),handler:this.handleStartAudioCall}:null,n&&zt.Tinode.isP2PTopicName(e)&&l?{title:this.props.intl.formatMessage(Li.menu_item_video_call),handler:this.handleStartVideoCall}:null,n?"messages_clear":null,n&&r?"messages_clear_hard":null,s?a?null:"topic_unmute":"topic_mute",i?"topic_unblock":"topic_block",o?"topic_restore":"topic_archive","topic_delete"]}handleHideContextMenu(){this.setState({contextMenuVisible:!1,contextMenuClickAt:null,contextMenuParams:null,contextMenuBounds:null})}handleHideForwardDialog(e){this.setState({forwardDialogVisible:!1,forwardMessage:e?this.state.forwardMessage:null})}handleContextMenuAction(e,t,s){"topic_archive"==e?t&&s.topicName&&s.topicName==this.state.topicSelected&&t.then((e=>{this.handleTopicSelected(null)})):"menu_item_forward"==e&&this.handleShowForwardDialog(s)}handleShowAlert(e,t,s,a,i,n){this.setState({alertVisible:!0,alertParams:{title:e,content:t,onConfirm:s,confirm:a,onReject:i,reject:n}})}handleShowInfoView(){za.navigateTo(za.addUrlParam(window.location.hash,"info","info")),this.setState({infoPanel:"info"})}handleMemberUpdateRequest(e,t,s){if(!e)return;const a=this.tinode.getTopic(e);a&&(t&&t.length>0&&t.map((e=>{a.invite(e,null).catch((e=>this.handleError(e.message,"err")))})),s&&s.length>0&&s.map((e=>{a.delSubscription(e).catch((e=>this.handleError(e.message,"err")))})))}handleValidateCredentialsRequest(e,t,s){this.tinode.isAuthenticated()?this.tinode.getMeTopic().setMeta({cred:{meth:e,resp:t}}).catch((e=>this.handleError(e.message,"err"))):(this.setState({credMethod:e,credCode:t,credToken:s}),this.doLogin(null,null,s,{meth:e,resp:t}))}handlePasswordResetRequest(e,t){return this.tinode.connect().then((s=>this.tinode.requestResetAuthSecret("basic",e,t))).catch((e=>{this.handleError(e.message,"err")}))}handleResetPassword(e,t){const s=(0,vs.DC)(t.secret);s&&t.scheme?this.tinode.connect().then((a=>this.tinode.updateAccountBasic(null,null,e,{scheme:t.scheme,secret:s}))).then((e=>za.navigateTo(""))).catch((e=>{this.handleError(e.message,"err")})):this.handleError(this.props.intl.formatMessage(Li.invalid_security_token),"err")}handleShowCountrySelector(s,i,n){this.handleShowAlert("Select country",t().createElement(e.Suspense,{fallback:t().createElement("div",null,t().createElement(a.FormattedMessage,{id:"loading_note",defaultMessage:[{type:0,value:"Loading..."}]}))},t().createElement(xi,{selected:s,onSubmit:(e,t)=>{this.setState({alertVisible:!1}),n(e,t)}})),null,null,(e=>{}),"Cancel")}handleStartVideoCall(){this.setState({callTopic:this.state.topicSelected,callState:1,callAudioOnly:!1})}handleStartAudioCall(){this.setState({callTopic:this.state.topicSelected,callState:1,callAudioOnly:!0})}handleCallInvite(e,t,s,a){switch(s){case 1:const s={webrtc:qs,aonly:!!a};this.handleSendMessage(zt.Drafty.videoCall(a),void 0,void 0,s).then((e=>{e.code<200||e.code>=300||!e.params||!e.params.seq?this.handleCallClose():this.setState({callSeq:e.params.seq})}));break;case 3:const i=this.tinode.getTopic(e);if(!i)return;i.videoCall("accept",t)}}handleCallRinging(e,t){const s=this.tinode.getTopic(e);s&&s.videoCall("ringing",t)}handleCallHangup(e,t){const s=this.tinode.getTopic(e);s&&s.videoCall("hang-up",t)}handleCallSendOffer(e,t,s){const a=this.tinode.getTopic(e);a&&a.videoCall("offer",t,s)}handleCallIceCandidate(e,t,s){const a=this.tinode.getTopic(e);a&&a.videoCall("ice-candidate",t,s)}handleCallSendAnswer(e,t,s){const a=this.tinode.getTopic(e);a&&a.videoCall("answer",t,s)}handleCallClose(){this.callTimeoutTimer&&clearTimeout(this.callTimeoutTimer),this.setState({callTopic:void 0,callState:0,callAudioOnly:void 0})}handleCallAccept(e){const t=this.tinode.getTopic(e);t&&(t.isSubscribed()?(this.handleTopicSelected(this.state.callTopic),this.setState({callState:3})):this.setState({callShouldStart:!0},(e=>this.handleTopicSelected(this.state.callTopic))))}handleInfoMessage(e){if("call"==e.what)switch(e.event){case"accept":if(zt.Tinode.isMeTopicName(e.topic)&&this.tinode.isMe(e.from))return void this.setState({callTopic:null,callState:0,callSeq:null,callAudioOnly:void 0});e.topic==this.state.callTopic&&this.setState({callState:3});break;case"hang-up":this.handleCallClose()}}handleDataMessage(e){if(e.head&&e.head.webrtc&&e.head.webrtc==qs){const t=this.tinode.getTopic(e.topic);if(t){const s=t.latestMsgVersion(e.seq)||e;s.head&&s.head.webrtc&&s.head.webrtc==qs&&e.from!=this.state.myUserId&&(0==this.state.callState?this.setState({callTopic:e.topic,callState:2,callSeq:e.seq,callAudioOnly:!!s.head.aonly}):this.handleCallHangup(e.topic,e.seq))}else console.warn("Received vc data message from unknown topic",e.topic)}}render(){return t().createElement("div",{id:"app-container",ref:this.selfRef},this.state.contextMenuVisible?t().createElement(Xt,{tinode:this.tinode,bounds:this.state.contextMenuBounds,clickAt:this.state.contextMenuClickAt,params:this.state.contextMenuParams,items:this.state.contextMenuItems,hide:this.handleHideContextMenu,onShowAlert:this.handleShowAlert,onAction:this.handleContextMenuAction,onTopicRemoved:e=>{e==this.state.topicSelected&&this.handleTopicSelected(null)},onError:this.handleError}):null,this.state.forwardDialogVisible?t().createElement(Us,{tinode:this.tinode,contacts:this.state.chatList,topicSelected:this.state.topicSelected,myUserId:this.state.myUserId,hide:this.handleHideForwardDialog,onInitFind:this.tnInitFind,searchResults:this.state.searchResults,onSearchContacts:this.handleSearchContacts,onTopicSelected:this.handleStartTopicRequest}):null,this.state.callTopic&&2==this.state.callState?t().createElement(Hs,{tinode:this.tinode,topic:this.state.callTopic,seq:this.state.callSeq,callState:this.state.callState,audioOnly:this.state.callAudioOnly,onClose:this.handleCallClose,onRinging:this.handleCallRinging,onAcceptCall:this.handleCallAccept,onReject:this.handleCallHangup}):null,this.state.alertVisible?t().createElement(Kt,{title:this.state.alertParams.title,content:this.state.alertParams.content,onReject:this.state.alertParams.onReject?e=>this.setState({alertVisible:!1}):null,reject:this.state.alertParams.reject,onConfirm:this.state.alertParams.onConfirm?e=>{this.setState({alertVisible:!1}),this.state.alertParams.onConfirm()}:null,confirm:this.state.alertParams.confirm}):null,t().createElement(Pi,{tinode:this.tinode,connected:this.state.connected,displayMobile:this.state.displayMobile,hideSelf:this.state.displayMobile&&"sidepanel"!==this.state.mobilePanel,state:this.state.sidePanelSelected,title:this.state.sidePanelTitle,avatar:this.state.sidePanelAvatar,trustedBadges:this.state.myTrustedBadges,login:this.state.login,persist:this.state.persist,myUserId:this.state.myUserId,loginDisabled:this.state.loginDisabled,loadSpinnerVisible:this.state.loadSpinnerVisible,errorText:this.state.errorText,errorLevel:this.state.errorLevel,errorAction:this.state.errorAction,errorActionText:this.state.errorActionText,topicSelected:this.state.topicSelected,chatList:this.state.chatList,credMethod:this.state.credMethod,credCode:this.state.credCode,credToken:this.state.credToken,transport:this.state.transport,messageSounds:this.state.messageSounds,desktopAlerts:this.state.desktopAlerts,desktopAlertsEnabled:this.state.desktopAlertsEnabled,incognitoMode:this.state.incognitoMode,serverAddress:this.state.serverAddress,secureConnection:this.state.secureConnection,serverVersion:this.state.serverVersion,onGlobalSettings:this.handleGlobalSettings,onSignUp:this.handleNewAccount,onSettings:this.handleSettings,onNavigate:this.basicNavigator,onLoginRequest:this.handleLoginRequest,onPersistenceChange:this.handlePersistenceChange,onCreateAccount:this.handleNewAccountRequest,onUpdateAccountDesc:this.handleTopicUpdateRequest,onUpdatePassword:this.handleUpdatePasswordRequest,onUpdateAccountTags:this.handleUpdateAccountTagsRequest,onTogglePushNotifications:this.toggleFCMToken,onToggleMessageSounds:this.handleToggleMessageSounds,onToggleIncognitoMode:this.handleToggleIncognitoMode,onCredAdd:this.handleCredAdd,onCredDelete:this.handleCredDelete,onCredConfirm:this.handleCredConfirm,onTopicSelected:this.handleTopicSelected,onCreateTopic:this.handleStartTopicRequest,onLogout:this.handleLogout,onDeleteAccount:this.handleDeleteAccount,onShowAlert:this.handleShowAlert,onCancel:this.handleSidepanelCancel,onError:this.handleError,onValidateCredentials:this.handleValidateCredentialsRequest,onPasswordResetRequest:this.handlePasswordResetRequest,onResetPassword:this.handleResetPassword,onShowArchive:this.handleShowArchive,onShowBlocked:this.handleShowBlocked,onShowCountrySelector:this.handleShowCountrySelector,onInitFind:this.tnInitFind,searchResults:this.state.searchResults,onSearchContacts:this.handleSearchContacts,showContextMenu:this.handleShowContextMenu}),t().createElement(Ya,{tinode:this.tinode,connected:this.state.connected,ready:this.state.ready,online:this.state.topicSelectedOnline,acs:this.state.topicSelectedAcs,displayMobile:this.state.displayMobile,viewportWidth:this.state.viewportWidth,viewportHeight:this.state.viewportHeight,hideSelf:this.state.displayMobile&&("topic-view"!==this.state.mobilePanel||this.state.infoPanel),topic:this.state.topicSelected,myUserId:this.state.myUserId,myUserName:this.state.sidePanelTitle,serverVersion:this.state.serverVersion,serverAddress:this.state.serverAddress,applicationVisible:this.state.applicationVisible,forwardMessage:this.state.forwardMessage,onCancelForwardMessage:this.handleHideForwardDialog,callTopic:this.state.callTopic,callSeq:this.state.callSeq,callState:this.state.callState,callAudioOnly:this.state.callAudioOnly,onCallHangup:this.handleCallHangup,onCallInvite:this.handleCallInvite,onCallSendOffer:this.handleCallSendOffer,onCallIceCandidate:this.handleCallIceCandidate,onCallSendAnswer:this.handleCallSendAnswer,errorText:this.state.errorText,errorLevel:this.state.errorLevel,errorAction:this.state.errorAction,errorActionText:this.state.errorActionText,newTopicParams:this.state.newTopicParams,onHideMessagesView:this.handleHideMessagesView,onError:this.handleError,onNewTopicCreated:this.handleNewTopicCreated,showContextMenu:this.handleShowContextMenu,onChangePermissions:this.handleChangePermissions,onNewChat:this.handleNewChatInvitation,sendMessage:this.handleSendMessage,onVideoCallClosed:this.handleCallClose}),this.state.infoPanel?t().createElement(ga,{tinode:this.tinode,connected:this.state.connected,displayMobile:this.state.displayMobile,topic:this.state.topicSelected,searchableContacts:this.state.searchableContacts,myUserId:this.state.myUserId,panel:this.state.infoPanel,errorText:this.state.errorText,errorLevel:this.state.errorLevel,errorAction:this.state.errorAction,errorActionText:this.state.errorActionText,onNavigate:this.infoNavigator,onTopicDescUpdateRequest:this.handleTopicUpdateRequest,onShowAlert:this.handleShowAlert,onChangePermissions:this.handleChangePermissions,onMemberUpdateRequest:this.handleMemberUpdateRequest,onDeleteTopic:this.handleDeleteTopicRequest,onDeleteMessages:this.handleDeleteMessagesRequest,onLeaveTopic:this.handleLeaveUnsubRequest,onBlockTopic:this.handleBlockTopicRequest,onReportTopic:this.handleReportTopic,onAddMember:this.handleManageGroupMembers,onTopicTagsUpdateRequest:this.handleTagsUpdateRequest,onTopicUnArchive:this.handleUnarchive,onInitFind:this.tnInitFind,onError:this.handleError,showContextMenu:this.handleShowContextMenu}):null)}}const Bi=(0,a.injectIntl)(Oi);if(FIREBASE_INIT&&FIREBASE_INIT.measurementId){const Gi=document.getElementsByTagName("head")[0];let $i=document.createElement("script");function Qi(){dataLayer.push(arguments)}$i.src="https://www.googletagmanager.com/gtag/js?id="+FIREBASE_INIT.measurementId,$i.async=!0,Gi.prepend($i),window.dataLayer=window.dataLayer||[],Qi("js",new Date),Qi("config",FIREBASE_INIT.measurementId)}const ji={de:e=>r.e(92).then(r.t.bind(r,6092,19)),en:e=>r.e(514).then(r.t.bind(r,4514,19)),es:e=>r.e(932).then(r.t.bind(r,9932,19)),fr:e=>r.e(107).then(r.t.bind(r,107,19)),ko:e=>r.e(898).then(r.t.bind(r,898,19)),ro:e=>r.e(817).then(r.t.bind(r,4817,19)),ru:e=>r.e(734).then(r.t.bind(r,3734,19)),zh:e=>r.e(700).then(r.t.bind(r,5700,19)),"zh-TW":e=>r.e(226).then(r.t.bind(r,5226,19))},{params:qi}=za.parseUrlHash(window.location.hash),Vi=qi&&qi.hl||navigator.languages&&navigator.languages[0]||navigator.language||navigator.userLanguage||"en",Hi=Vi.replace("_","-"),Wi=Hi.split("-")[0].toLowerCase(),zi=ji[Hi]?Vi:ji[Wi]?Wi:"en";document.getElementsByTagName("html")[0].setAttribute("lang",zi);const Ki=(0,s.s)(document.getElementById("mountPoint"));ji[zi]().then((e=>Ki.render(t().createElement(a.IntlProvider,{locale:Vi,messages:e,textComponent:t().Fragment},t().createElement(Bi,null)))))})()})();
+(()=>{"use strict";var e,t,a,s,n={8962:(e,t,a)=>{a.d(t,{$_:()=>T,$h:()=>n,EI:()=>P,GQ:()=>w,H2:()=>M,Hm:()=>E,IX:()=>v,JG:()=>o,Mv:()=>r,NW:()=>B,RK:()=>u,Rc:()=>i,S8:()=>A,S9:()=>j,VL:()=>c,Zd:()=>N,Zf:()=>U,cG:()=>h,cl:()=>R,dm:()=>k,gD:()=>D,iC:()=>s,kd:()=>C,l8:()=>l,li:()=>L,ly:()=>_,mc:()=>d,nT:()=>x,o6:()=>f,pM:()=>p,rV:()=>I,rX:()=>O,sA:()=>b,uv:()=>$,vX:()=>F,wO:()=>y,xt:()=>m,yW:()=>S,yl:()=>g});const s="TinodeWeb/"+(a(3119).l||"0.21"),n="AQEAAAABAAD_rAp4DJh05a1HAwFT3A6K",i={hosted:"web.tinode.co",local:"localhost:6060"},r=i.hosted,o=!0,d=3e3,l=1500,c=2,h=96,p=16,u="JRWPS",m="N",g=640,f=13,v=384,$=4096,b=32,y=128,E=24,C=262144,w=1<<23,S=1024,M=64,_=96,T=36,N=48,k=4,A=60,P=360,D=20,I=80,R=30,F=84,x=48,O=2e3,U=6e5,L="mailto:support@tinode.co",B="https://tinode.co/privacy.html",j="https://tinode.co/terms.html"},8405:(e,t,a)=>{a.d(t,{DC:()=>u,EA:()=>d,Id:()=>l,JG:()=>g,Jr:()=>m,PD:()=>i,Y:()=>p,ay:()=>f,rS:()=>r,sT:()=>c,w8:()=>h});const s=["image/jpeg","image/gif","image/png","image/svg","image/svg+xml"],n=["jpg","gif","png","svg","svg"];function i(e){if(e&&"object"==typeof e){if(e.ref)return e.ref;if(e.data&&e.type){return"data:"+(e.type.startsWith("image/")?e.type:"image/"+e.type)+";base64,"+e.data}}return null}function r(e,t,a,s,n){if(t|=0,a|=0,s|=0,(e|=0)<=0||t<=0||a<=0||s<=0)return null;n&&(a=s=Math.min(a,s));const i=Math.min(Math.min(e,a)/e,Math.min(t,s)/t),r={dstWidth:e*i|0,dstHeight:t*i|0};return n?(r.dstWidth=r.dstHeight=Math.min(r.dstWidth,r.dstHeight),r.srcWidth=r.srcHeight=Math.min(e,t),r.xoffset=(e-r.srcWidth)/2|0,r.yoffset=(t-r.srcWidth)/2|0):(r.xoffset=r.yoffset=0,r.srcWidth=e,r.srcHeight=t),r}function o(e,t){const a=s.indexOf(t);if(a<0||!e)return e;const i=n[a],r=e.lastIndexOf(".");return r>=0&&(e=e.substring(0,r)),e+"."+i}function d(e,t,a,n,i){return new Promise(((d,l)=>{const c=new Image;c.crossOrigin="Anonymous",c.onerror=function(e){l(new Error("Image format unrecognized"))},c.onload=async function(){URL.revokeObjectURL(c.src);const h=r(c.width,c.height,t,a,i);if(!h)return void l(new Error("Invalid image"));let p=document.createElement("canvas");p.width=h.dstWidth,p.height=h.dstHeight;let u=p.getContext("2d");u.imageSmoothingEnabled=!0,u.drawImage(c,h.xoffset,h.yoffset,h.srcWidth,h.srcHeight,0,0,h.dstWidth,h.dstHeight);const m=s.includes(e.type)?e.type:"image/jpeg";let g=await new Promise((e=>p.toBlob(e,m)));if(g){for(;n>0&&g.length>n;)h.dstWidth=.70710678118*h.dstWidth|0,h.dstHeight=.70710678118*h.dstHeight|0,p.width=h.dstWidth,p.height=h.dstHeight,u=p.getContext("2d"),u.clearRect(0,0,p.width,p.height),u.drawImage(c,h.xoffset,h.yoffset,h.srcWidth,h.srcHeight,0,0,h.dstWidth,h.dstHeight),g=await new Promise((e=>p.toBlob(e,m)));p=null,d({mime:m,blob:g,width:h.dstWidth,height:h.dstHeight,name:o(e.name,m)})}else l(new Error("Unsupported image format"))},c.src=URL.createObjectURL(e)}))}function l(e,t,a,n,i,r,o){return new Promise(((d,l)=>{const c=new Image;c.crossOrigin="Anonymous",c.onerror=e=>{l(new Error("Image format unrecognized"))},c.onload=t=>{URL.revokeObjectURL(c.src);let h=document.createElement("canvas");h.width=i*o,h.height=r*o;let p=h.getContext("2d");p.imageSmoothingEnabled=!0,p.drawImage(c,a,n,i,r,0,0,h.width,h.height),e=s.includes(e)?e:"image/jpeg",h.toBlob((t=>{h=null,t?d({mime:e,blob:t,width:i,height:r}):l(new Error("Unsupported image format"))}),e)},c.src=t}))}function c(e){return new Promise(((t,a)=>{const s=new FileReader;s.onerror=e=>{a(s.error)},s.onload=a=>{t({mime:e.type,bits:s.result.split(",")[1],name:e.name})},s.readAsDataURL(e)}))}function h(e){return new Promise(((t,a)=>{const s=new FileReader;s.onerror=e=>{a(s.error)},s.onload=a=>{t({mime:e.type,bits:s.result.split(",")[1]})},s.readAsDataURL(e)}))}function p(e,t,a,s){const n=(e.clipboardData||e.originalEvent.clipboardData||{}).items;if(!n||!n.length)return!1;for(let e in n){const i=n[e];if("file"===i.kind){const e=i.getAsFile();if(!e){console.error("Failed to get file object from pasted file item",i.kind,i.type),s("Failed to get file object from pasted file item");continue}return e.type&&"image"==e.type.split("/")[0]?t(e):a(e),!0}}return!1}function u(e){if(e){e=e.replace(/-/g,"+").replace(/_/g,"/");try{e=btoa(atob(e))}catch(t){console.error("Failed to base64 re-encode string.",t),e=null}}return e}function m(e,t){if(!e)return null;try{const a=atob(e),s=a.length,n=new ArrayBuffer(s),i=new Uint8Array(n);for(let e=0;et+=String.fromCharCode(e))),window.btoa(t)}catch(e){}return null}function f(e){const t=[];try{return[...window.atob(e)].forEach((e=>{t.push(e.charCodeAt(0))})),t}catch(e){}return null}},3905:(e,t,a)=>{function s(e,t){t=t||window.navigator.userLanguage||window.navigator.language;const a=new Date;return e.getFullYear()==a.getFullYear()?e.getMonth()==a.getMonth()&&e.getDate()==a.getDate()?e.toLocaleTimeString(t,{hour12:!1,hour:"2-digit",minute:"2-digit"}):e.toLocaleDateString(t,{hour12:!1,month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"}):e.toLocaleDateString(t,{year:"numeric",month:"short",day:"numeric"})}function n(e,t){t=t||window.navigator.userLanguage||window.navigator.language;const a=new Date,s=Math.floor((e.getTime()-6e4*e.getTimezoneOffset())/864e5)-Math.floor((a.getTime()-6e4*a.getTimezoneOffset())/864e5);return Math.abs(s)<2?new Intl.RelativeTimeFormat(t,{numeric:"auto"}).format(s,"day"):new Intl.DateTimeFormat(t).format(e)}function i(e,t){if("number"!=typeof e)return"";let a=(0|Math.floor(e/60))%60,s=0|Math.floor(e/36e3);(t||s>0)&&(a=a<10?`0${a}`:a);let n=(0|e)%60;return n=n<10?`0${n}`:n,0==s?`${a}:${n}`:`${s}:${a}:${n}`}function r(e){if(!e||0==e)return"0 Bytes";const t=["Bytes","KB","MB","GB","TB","PB"],a=Math.min(0|Math.floor(Math.log2(e)/10),t.length-1),s=e/Math.pow(1024,a),n=a>0?s<3?2:s<30?1:0:0;return s.toFixed(n)+" "+t[a]}function o(e,t){return"string"!=typeof e?e:e.length>t?e.slice(0,t/2-1)+"…"+e.slice(1-t/2):e}function d(e,t,a){return(t?"lt-":"dk-")+(a?"fg-":"bg-")+(s=e,Math.abs(function(e){let t=0;e=""+e;for(let a=0;a127397+e.charCodeAt()));return String.fromCodePoint(...t)}a.d(t,{Cj:()=>d,EZ:()=>n,FK:()=>r,TX:()=>o,Yu:()=>l,nH:()=>i,pz:()=>s})},3119:(e,t,a)=>{a.d(t,{l:()=>s});const s="0.21.0-rc2"},4861:(e,t,a)=>{a.d(t,{Z:()=>h});var s=a(7363),n=a.n(s),i=a(916),r=a(3905),o=a(8405);const d="#666C",l=(0,i.defineMessages)({icon_title_play:{id:"icon_title_play",defaultMessage:[{type:0,value:"Play recording"}]}});class c extends n().PureComponent{constructor(e){super(e);let t=(0,o.ay)(this.props.preview);(!Array.isArray(t)||t.length<16)&&(t=null),this.state={canPlay:!1,playing:!1,currentTime:"0:00",duration:this.props.duration>0?(0,r.nH)(this.props.duration/1e3):"-:--",longMin:this.props.duration>=6e5,preview:t},this.initAudio=this.initAudio.bind(this),this.initCanvas=this.initCanvas.bind(this),this.resampleBars=this.resampleBars.bind(this),this.visualize=this.visualize.bind(this),this.handlePlay=this.handlePlay.bind(this),this.handleSeek=this.handleSeek.bind(this),this.handleError=this.handleError.bind(this),this.audioPlayer=null,this.viewBuffer=[],this.canvasRef=n().createRef()}componentDidMount(){this.props.src&&this.initAudio(),this.initCanvas()}componentWillUnmount(){this.audioPlayer&&(this.audioPlayer.oncanplay=null,this.audioPlayer.ontimeupdate=null,this.audioPlayer.onended=null,this.audioPlayer.pause(),this.audioPlayer=null)}componentDidUpdate(e){if(this.props.src!=e.src&&this.initAudio(),this.props.preview!=e.preview){let e=(0,o.ay)(this.props.preview);(!Array.isArray(e)||e.length<16)&&(e=null),this.setState({preview:e},this.initCanvas)}}initAudio(){this.audioPlayer=new Audio(this.props.src),this.audioPlayer.oncanplay=e=>this.setState({canPlay:!0}),this.audioPlayer.ontimeupdate=e=>this.setState({currentTime:(0,r.nH)(this.audioPlayer.currentTime,this.state.longMin)}),this.audioPlayer.onended=e=>{this.audioPlayer.currentTime=0,this.setState({playing:!1,currentTime:(0,r.nH)(0,this.state.longMin)})}}initCanvas(){this.canvasRef.current.width=2*this.canvasRef.current.offsetWidth,this.canvasRef.current.height=2*this.canvasRef.current.offsetHeight,this.canvasContext=this.canvasRef.current.getContext("2d"),this.canvasContext.lineCap="round",this.viewBuffer=this.resampleBars(this.state.preview),this.visualize()}visualize(){if(!this.canvasRef.current)return;const e=this.effectiveWidth,t=this.canvasRef.current.height;this.canvasContext.lineWidth=6;const a=s=>{if(this.canvasRef.current&&this.audioPlayer&&(this.canvasContext.clearRect(0,0,this.canvasRef.current.width,t),this.viewBuffer)){this.state.playing&&window.requestAnimationFrame(a);const s=this.props.duration?Math.max(0,Math.min(1e3*this.audioPlayer.currentTime/this.props.duration,1))*(e-12):-1;this.canvasContext.beginPath(),this.canvasContext.strokeStyle=d;for(let e=0;e.01));const a=e.length/t;let s=[],n=-1;for(let i=0;i0?s.map((e=>e/n)):Array.apply(null,Array(t)).map((e=>.01))}handlePlay(e){e.preventDefault(),this.state.canPlay&&(this.state.playing?(this.audioPlayer.pause(),this.setState({playing:!1})):(this.audioPlayer.play(),this.setState({playing:!0},this.visualize)))}handleError(e){console.error(e)}handleSeek(e){if(e.preventDefault(),e.target&&this.props.duration){const t=e.target.getBoundingClientRect(),a=(e.clientX-t.left)/this.effectiveWidth*2;this.audioPlayer.currentTime=this.props.duration*a/1e3,this.setState({currentTime:(0,r.nH)(this.audioPlayer.currentTime,this.state.longMin)}),this.state.playing||this.visualize()}}render(){const e="material-icons"+(this.props.short?"":" large")+(this.state.canPlay?"":" disabled"),t=n().createElement("a",{href:"#",onClick:this.handlePlay,title:this.props.intl.formatMessage(l.icon_title_play)},n().createElement("i",{className:e},this.state.playing?"pause_circle":this.state.canPlay?"play_circle":"not_interested"));return n().createElement("div",{className:"audio-player"},this.props.short?n().createElement(n().Fragment,null,n().createElement("canvas",{className:"playback",ref:this.canvasRef,onClick:this.handleSeek}),t):n().createElement(n().Fragment,null,t,n().createElement("div",null,n().createElement("canvas",{className:"playback",ref:this.canvasRef,onClick:this.handleSeek}),n().createElement("div",{className:"timer"},this.state.currentTime,"/",this.state.duration))))}}const h=(0,i.injectIntl)(c)},781:(e,t,a)=>{a.r(t),a.d(t,{default:()=>g});var s=a(7363),n=a.n(s),i=a(916),r=a(2703),o=a(8659),d=a(8006);function l(e,t,a){if(t[e])return new d.Z(e,t[e],a)}const c={AC:"40123",AD:"312345",AE:"501234567",AF:"701234567",AG:"2684641234",AI:"2642351234",AL:"672123456",AM:"77123456",AO:"923123456",AR:"91123456789",AS:"6847331234",AT:"664123456",AU:"412345678",AW:"5601234",AX:"412345678",AZ:"401234567",BA:"61123456",BB:"2462501234",BD:"1812345678",BE:"470123456",BF:"70123456",BG:"43012345",BH:"36001234",BI:"79561234",BJ:"90011234",BL:"690001234",BM:"4413701234",BN:"7123456",BO:"71234567",BQ:"3181234",BR:"11961234567",BS:"2423591234",BT:"17123456",BW:"71123456",BY:"294911911",BZ:"6221234",CA:"5062345678",CC:"412345678",CD:"991234567",CF:"70012345",CG:"061234567",CH:"781234567",CI:"0123456789",CK:"71234",CL:"221234567",CM:"671234567",CN:"13123456789",CO:"3211234567",CR:"83123456",CU:"51234567",CV:"9911234",CW:"95181234",CX:"412345678",CY:"96123456",CZ:"601123456",DE:"15123456789",DJ:"77831001",DK:"32123456",DM:"7672251234",DO:"8092345678",DZ:"551234567",EC:"991234567",EE:"51234567",EG:"1001234567",EH:"650123456",ER:"7123456",ES:"612345678",ET:"911234567",FI:"412345678",FJ:"7012345",FK:"51234",FM:"3501234",FO:"211234",FR:"612345678",GA:"06031234",GB:"7400123456",GD:"4734031234",GE:"555123456",GF:"694201234",GG:"7781123456",GH:"231234567",GI:"57123456",GL:"221234",GM:"3012345",GN:"601123456",GP:"690001234",GQ:"222123456",GR:"6912345678",GT:"51234567",GU:"6713001234",GW:"955012345",GY:"6091234",HK:"51234567",HN:"91234567",HR:"921234567",HT:"34101234",HU:"201234567",ID:"812345678",IE:"850123456",IL:"502345678",IM:"7924123456",IN:"8123456789",IO:"3801234",IQ:"7912345678",IR:"9123456789",IS:"6111234",IT:"3123456789",JE:"7797712345",JM:"8762101234",JO:"790123456",JP:"9012345678",KE:"712123456",KG:"700123456",KH:"91234567",KI:"72001234",KM:"3212345",KN:"8697652917",KP:"1921234567",KR:"1020000000",KW:"50012345",KY:"3453231234",KZ:"7710009998",LA:"2023123456",LB:"71123456",LC:"7582845678",LI:"660234567",LK:"712345678",LR:"770123456",LS:"50123456",LT:"61234567",LU:"628123456",LV:"21234567",LY:"912345678",MA:"650123456",MC:"612345678",MD:"62112345",ME:"67622901",MF:"690001234",MG:"321234567",MH:"2351234",MK:"72345678",ML:"65012345",MM:"92123456",MN:"88123456",MO:"66123456",MP:"6702345678",MQ:"696201234",MR:"22123456",MS:"6644923456",MT:"96961234",MU:"52512345",MV:"7712345",MW:"991234567",MX:"12221234567",MY:"123456789",MZ:"821234567",NA:"811234567",NC:"751234",NE:"93123456",NF:"381234",NG:"8021234567",NI:"81234567",NL:"612345678",NO:"40612345",NP:"9841234567",NR:"5551234",NU:"8884012",NZ:"211234567",OM:"92123456",PA:"61234567",PE:"912345678",PF:"87123456",PG:"70123456",PH:"9051234567",PK:"3012345678",PL:"512345678",PM:"551234",PR:"7872345678",PS:"599123456",PT:"912345678",PW:"6201234",PY:"961456789",QA:"33123456",RE:"692123456",RO:"712034567",RS:"601234567",RU:"9123456789",RW:"720123456",SA:"512345678",SB:"7421234",SC:"2510123",SD:"911231234",SE:"701234567",SG:"81234567",SH:"51234",SI:"31234567",SJ:"41234567",SK:"912123456",SL:"25123456",SM:"66661212",SN:"701234567",SO:"71123456",SR:"7412345",SS:"977123456",ST:"9812345",SV:"70123456",SX:"7215205678",SY:"944567890",SZ:"76123456",TA:"8999",TC:"6492311234",TD:"63012345",TG:"90112345",TH:"812345678",TJ:"917123456",TK:"7290",TL:"77212345",TM:"66123456",TN:"20123456",TO:"7715123",TR:"5012345678",TT:"8682911234",TV:"901234",TW:"912345678",TZ:"621234567",UA:"501234567",UG:"712345678",US:"2015550123",UY:"94231234",UZ:"912345678",VA:"3123456789",VC:"7844301234",VE:"4121234567",VG:"2843001234",VI:"3406421234",VN:"912345678",VU:"5912345",WF:"821234",WS:"7212345",XK:"43201234",YE:"712345678",YT:"639012345",ZA:"711234567",ZM:"955123456",ZW:"712345678"};var h=a(6670),p=a(3905);const u=(0,i.defineMessages)({mobile_number_required:{id:"mobile_number_required",defaultMessage:[{type:0,value:"Mobile phone number required"}]}});class m extends n().PureComponent{constructor(e){super(e),this.codeMap={},h.forEach((e=>{this.codeMap[e.code]=e.dial}));const t=e.countryCode||"US",a=this.codeMap[t];this.state={countryCode:t,dialCode:a,localNumber:"",placeholderNumber:this.placeholderNumber(t,a)},this.handleChange=this.handleChange.bind(this),this.handleFinished=this.handleFinished.bind(this),this.handleKeyDown=this.handleKeyDown.bind(this),this.showCountrySelector=this.showCountrySelector.bind(this)}handleChange(e){this.setState({localNumber:this.filterNumber(e.target.value)})}handleFinished(e){e.preventDefault();const t=`${this.state.dialCode}${this.state.localNumber.trim()}`.replace(/[^\d]/g,"");let a=null;try{a=(0,r.h)(`+${t}`)}catch(e){}a&&a.isValid()?this.props.onSubmit(a.format("E.164")):this.inputField.setCustomValidity(this.props.intl.formatMessage(u.mobile_number_required))}handleKeyDown(e){"Enter"===e.key&&this.handleFinished(e)}showCountrySelector(){this.props.onShowCountrySelector(this.state.countryCode,this.state.dialCode,((e,t)=>{this.setState({countryCode:e,dialCode:t,placeholderNumber:this.placeholderNumber(e,t)})}))}filterNumber(e){return e?e.replace(/[^-\s().\d]/g,""):e}placeholderNumber(e,t){const a=function(){return(0,o.Z)(l,arguments)}(e,c);return a?a.formatInternational().substring(t.length+1).trim():"123 0123"}render(){return n().createElement(n().Fragment,null,n().createElement("span",{className:"dial-code",onClick:this.showCountrySelector},n().createElement("span",{className:"country-flag"},(0,p.Yu)(this.state.countryCode)," "),"+",this.state.dialCode," "),n().createElement("input",{type:"tel",ref:e=>{this.inputField=e},placeholder:this.state.placeholderNumber,value:this.state.localNumber,onChange:this.handleChange,maxLength:17,onKeyDown:this.handleKeyDown,onBlur:this.handleFinished,required:!0,autoFocus:this.props.autoFocus}))}}const g=(0,i.injectIntl)(m)},745:(e,t,a)=>{var s=a(1533);t.s=s.createRoot,s.hydrateRoot},7363:e=>{e.exports=React},1533:e=>{e.exports=ReactDOM},916:e=>{e.exports=ReactIntl},8006:(e,t,a)=>{a.d(t,{Z:()=>_});var s=a(2581),n=a(5864),i=a(1316),r=a(1089);function o(e,t,a){var n=new s.ZP(a).getCountryCodesForCallingCode(e);return n?n.filter((function(e){return function(e,t,a){var n=new s.ZP(a);if(n.selectNumberingPlan(t),n.numberingPlan.possibleLengths().indexOf(e.length)>=0)return!0;return!1}(t,e,a)})):[]}var d=a(5619);var l=/(\$\d)/;function c(e,t,a){var s=a.useInternationalFormat,n=a.withNationalPrefix,i=(a.carrierCode,a.metadata,e.replace(new RegExp(t.pattern()),s?t.internationalFormat():n&&t.nationalPrefixFormattingRule()?t.format().replace(l,t.nationalPrefixFormattingRule()):t.format()));return s?function(e){return e.replace(new RegExp("[".concat(d.uv,"]+"),"g")," ").trim()}(i):i}var h=/^[\d]+(?:[~\u2053\u223C\uFF5E][\d]+)?$/;var p=a(457);function u(e,t){var a="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(a)return(a=a.call(e)).next.bind(a);if(Array.isArray(e)||(a=function(e,t){if(!e)return;if("string"==typeof e)return m(e,t);var a=Object.prototype.toString.call(e).slice(8,-1);"Object"===a&&e.constructor&&(a=e.constructor.name);if("Map"===a||"Set"===a)return Array.from(e);if("Arguments"===a||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(a))return m(e,t)}(e))||t&&e&&"number"==typeof e.length){a&&(e=a);var s=0;return function(){return s>=e.length?{done:!0}:{done:!1,value:e[s++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function m(e,t){(null==t||t>e.length)&&(t=e.length);for(var a=0,s=new Array(t);a0){var r=n.leadingDigitsPatterns()[n.leadingDigitsPatterns().length-1];if(0!==t.search(r))continue}if((0,i.Z)(t,n.pattern()))return n}}(s.formats(),e);return r?c(e,r,{useInternationalFormat:"INTERNATIONAL"===a,withNationalPrefix:!r.nationalPrefixIsOptionalWhenFormattingInNationalFormat()||!n||!1!==n.nationalPrefix,carrierCode:t,metadata:s}):e}function E(e,t,a,s){return t?s(e,t,a):e}function C(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);t&&(s=s.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,s)}return a}function w(e){for(var t=1;t{a.d(t,{ex:()=>s,sJ:()=>n,uv:()=>o,xc:()=>r,xg:()=>i,xy:()=>d});var s=2,n=17,i=3,r="0-90-9٠-٩۰-۹",o="".concat("-‐-―−ー-").concat("//").concat("..").concat(" ").concat("()()[]\\[\\]").concat("~⁓∼~"),d="++"},457:(e,t,a)=>{a.d(t,{Y:()=>d,m:()=>o});var s=a(3345);function n(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var a=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null==a)return;var s,n,i=[],r=!0,o=!1;try{for(a=a.call(e);!(r=(s=a.next()).done)&&(i.push(s.value),!t||i.length!==t);r=!0);}catch(e){o=!0,n=e}finally{try{r||null==a.return||a.return()}finally{if(o)throw n}}return i}(e,t)||i(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function i(e,t){if(e){if("string"==typeof e)return r(e,t);var a=Object.prototype.toString.call(e).slice(8,-1);return"Object"===a&&e.constructor&&(a=e.constructor.name),"Map"===a||"Set"===a?Array.from(e):"Arguments"===a||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(a)?r(e,t):void 0}}function r(e,t){(null==t||t>e.length)&&(t=e.length);for(var a=0,s=new Array(t);a=e.length?{done:!0}:{done:!1,value:e[s++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}((e=e.replace(/^tel:/,"tel=")).split(";"));!(r=o()).done;){var d=n(r.value.split("="),2),l=d[0],c=d[1];switch(l){case"tel":t=c;break;case"ext":a=c;break;case"phone-context":"+"===c[0]&&(t=c+t)}}if(!(0,s.ZP)(t))return{};var h={number:t};return a&&(h.ext=a),h}function d(e){var t=e.number,a=e.ext;if(!t)return"";if("+"!==t[0])throw new Error('"formatRFC3966()" expects "number" to be in E.164 format.');return"tel:".concat(t).concat(a?";ext="+a:"")}},7856:(e,t,a)=>{function s(e,t){var a="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(a)return(a=a.call(e)).next.bind(a);if(Array.isArray(e)||(a=function(e,t){if(!e)return;if("string"==typeof e)return n(e,t);var a=Object.prototype.toString.call(e).slice(8,-1);"Object"===a&&e.constructor&&(a=e.constructor.name);if("Map"===a||"Set"===a)return Array.from(e);if("Arguments"===a||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(a))return n(e,t)}(e))||t&&e&&"number"==typeof e.length){a&&(e=a);var s=0;return function(){return s>=e.length?{done:!0}:{done:!1,value:e[s++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function n(e,t){(null==t||t>e.length)&&(t=e.length);for(var a=0,s=new Array(t);ad?"TOO_SHORT":i[i.length-1]=0?"IS_POSSIBLE":"INVALID_LENGTH"}a.d(t,{Z:()=>i})},3878:(e,t,a)=>{a.d(t,{Z:()=>i});var s=a(5619),n=function(e){return"([".concat(s.xc,"]{1,").concat(e,"})")};function i(e){var t="[ \\t,]*",a="[:\\..]?[ \\t,-]*",s="#?",i="[ \\t]*";return";ext="+n("20")+"|"+(t+"(?:e?xt(?:ensi(?:ó?|ó))?n?|e?xtn?|доб|anexo)"+a+n("20")+s)+"|"+(t+"(?:[xx##~~]|int|int)"+a+n("9")+s)+"|"+("[- ]+"+n("6")+"#")+"|"+(i+"(?:,{2}|;)"+a+n("15")+s)+"|"+(i+"(?:,)+"+a+n("9")+s)}},1089:(e,t,a)=>{a.d(t,{Z:()=>d});var s=a(2581),n=a(1316);function i(e,t){var a="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(a)return(a=a.call(e)).next.bind(a);if(Array.isArray(e)||(a=function(e,t){if(!e)return;if("string"==typeof e)return r(e,t);var a=Object.prototype.toString.call(e).slice(8,-1);"Object"===a&&e.constructor&&(a=e.constructor.name);if("Map"===a||"Set"===a)return Array.from(e);if("Arguments"===a||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(a))return r(e,t)}(e))||t&&e&&"number"==typeof e.length){a&&(e=a);var s=0;return function(){return s>=e.length?{done:!0}:{done:!1,value:e[s++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function r(e,t){(null==t||t>e.length)&&(t=e.length);for(var a=0,s=new Array(t);a{a.d(t,{ZP:()=>c,ch:()=>h});var s=a(5619),n=a(3878),i="["+s.xc+"]{"+s.ex+"}",r="["+s.xy+"]{0,1}(?:["+s.uv+"]*["+s.xc+"]){3,}["+s.uv+s.xc+"]*",o=new RegExp("^["+s.xy+"]{0,1}(?:["+s.uv+"]*["+s.xc+"]){1,2}$","i"),d=r+"(?:"+(0,n.Z)()+")?",l=new RegExp("^"+i+"$|^"+d+"$","i");function c(e){return e.length>=s.ex&&l.test(e)}function h(e){return o.test(e)}},1316:(e,t,a)=>{function s(e,t){return e=e||"",new RegExp("^(?:"+t+")$").test(e)}a.d(t,{Z:()=>s})},5864:(e,t,a)=>{a.d(t,{D:()=>r,Z:()=>i});var s=a(2581),n=a(7856);function i(e,t,a){if(void 0===t&&(t={}),a=new s.ZP(a),t.v2){if(!e.countryCallingCode)throw new Error("Invalid phone number object passed");a.selectNumberingPlan(e.countryCallingCode)}else{if(!e.phone)return!1;if(e.country){if(!a.hasCountry(e.country))throw new Error("Unknown country: ".concat(e.country));a.country(e.country)}else{if(!e.countryCallingCode)throw new Error("Invalid phone number object passed");a.selectNumberingPlan(e.countryCallingCode)}}if(a.possibleLengths())return r(e.phone||e.nationalNumber,a);if(e.countryCallingCode&&a.isNonGeographicCallingCode(e.countryCallingCode))return!0;throw new Error('Missing "possibleLengths" in metadata. Perhaps the metadata has been generated before v1.0.18.')}function r(e,t){return"IS_POSSIBLE"===(0,n.Z)(e,t)}},2581:(e,t,a)=>{function s(e,t){e=e.split("-"),t=t.split("-");for(var a=e[0].split("."),s=t[0].split("."),n=0;n<3;n++){var i=Number(a[n]),r=Number(s[n]);if(i>r)return 1;if(r>i)return-1;if(!isNaN(i)&&isNaN(r))return 1;if(isNaN(i)&&!isNaN(r))return-1}return e[1]&&t[1]?e[1]>t[1]?1:e[1]c,Gg:()=>$});var d=" ext. ",l=/^\d+$/,c=function(){function e(t){i(this,e),function(e){if(!e)throw new Error("[libphonenumber-js] `metadata` argument not passed. Check your arguments.");if(!f(e)||!f(e.countries))throw new Error("[libphonenumber-js] `metadata` argument was passed but it's not a valid metadata. Must be an object having `.countries` child object property. Got ".concat(f(e)?"an object of shape: { "+Object.keys(e).join(", ")+" }":"a "+v(e)+": "+e,"."))}(t),this.metadata=t,b.call(this,t)}return o(e,[{key:"getCountries",value:function(){return Object.keys(this.metadata.countries).filter((function(e){return"001"!==e}))}},{key:"getCountryMetadata",value:function(e){return this.metadata.countries[e]}},{key:"nonGeographic",value:function(){if(!(this.v1||this.v2||this.v3))return this.metadata.nonGeographic||this.metadata.nonGeographical}},{key:"hasCountry",value:function(e){return void 0!==this.getCountryMetadata(e)}},{key:"hasCallingCode",value:function(e){if(this.getCountryCodesForCallingCode(e))return!0;if(this.nonGeographic()){if(this.nonGeographic()[e])return!0}else{var t=this.countryCallingCodes()[e];if(t&&1===t.length&&"001"===t[0])return!0}}},{key:"isNonGeographicCallingCode",value:function(e){return this.nonGeographic()?!!this.nonGeographic()[e]:!this.getCountryCodesForCallingCode(e)}},{key:"country",value:function(e){return this.selectNumberingPlan(e)}},{key:"selectNumberingPlan",value:function(e,t){if(e&&l.test(e)&&(t=e,e=null),e&&"001"!==e){if(!this.hasCountry(e))throw new Error("Unknown country: ".concat(e));this.numberingPlan=new h(this.getCountryMetadata(e),this)}else if(t){if(!this.hasCallingCode(t))throw new Error("Unknown calling code: ".concat(t));this.numberingPlan=new h(this.getNumberingPlanMetadata(t),this)}else this.numberingPlan=void 0;return this}},{key:"getCountryCodesForCallingCode",value:function(e){var t=this.countryCallingCodes()[e];if(t){if(1===t.length&&3===t[0].length)return;return t}}},{key:"getCountryCodeForCallingCode",value:function(e){var t=this.getCountryCodesForCallingCode(e);if(t)return t[0]}},{key:"getNumberingPlanMetadata",value:function(e){var t=this.getCountryCodeForCallingCode(e);if(t)return this.getCountryMetadata(t);if(this.nonGeographic()){var a=this.nonGeographic()[e];if(a)return a}else{var s=this.countryCallingCodes()[e];if(s&&1===s.length&&"001"===s[0])return this.metadata.countries["001"]}}},{key:"countryCallingCode",value:function(){return this.numberingPlan.callingCode()}},{key:"IDDPrefix",value:function(){return this.numberingPlan.IDDPrefix()}},{key:"defaultIDDPrefix",value:function(){return this.numberingPlan.defaultIDDPrefix()}},{key:"nationalNumberPattern",value:function(){return this.numberingPlan.nationalNumberPattern()}},{key:"possibleLengths",value:function(){return this.numberingPlan.possibleLengths()}},{key:"formats",value:function(){return this.numberingPlan.formats()}},{key:"nationalPrefixForParsing",value:function(){return this.numberingPlan.nationalPrefixForParsing()}},{key:"nationalPrefixTransformRule",value:function(){return this.numberingPlan.nationalPrefixTransformRule()}},{key:"leadingDigits",value:function(){return this.numberingPlan.leadingDigits()}},{key:"hasTypes",value:function(){return this.numberingPlan.hasTypes()}},{key:"type",value:function(e){return this.numberingPlan.type(e)}},{key:"ext",value:function(){return this.numberingPlan.ext()}},{key:"countryCallingCodes",value:function(){return this.v1?this.metadata.country_phone_code_to_countries:this.metadata.country_calling_codes}},{key:"chooseCountryByCountryCallingCode",value:function(e){return this.selectNumberingPlan(e)}},{key:"hasSelectedNumberingPlan",value:function(){return void 0!==this.numberingPlan}}]),e}(),h=function(){function e(t,a){i(this,e),this.globalMetadataObject=a,this.metadata=t,b.call(this,a.metadata)}return o(e,[{key:"callingCode",value:function(){return this.metadata[0]}},{key:"getDefaultCountryMetadataForRegion",value:function(){return this.globalMetadataObject.getNumberingPlanMetadata(this.callingCode())}},{key:"IDDPrefix",value:function(){if(!this.v1&&!this.v2)return this.metadata[1]}},{key:"defaultIDDPrefix",value:function(){if(!this.v1&&!this.v2)return this.metadata[12]}},{key:"nationalNumberPattern",value:function(){return this.v1||this.v2?this.metadata[1]:this.metadata[2]}},{key:"possibleLengths",value:function(){if(!this.v1)return this.metadata[this.v2?2:3]}},{key:"_getFormats",value:function(e){return e[this.v1?2:this.v2?3:4]}},{key:"formats",value:function(){var e=this,t=this._getFormats(this.metadata)||this._getFormats(this.getDefaultCountryMetadataForRegion())||[];return t.map((function(t){return new p(t,e)}))}},{key:"nationalPrefix",value:function(){return this.metadata[this.v1?3:this.v2?4:5]}},{key:"_getNationalPrefixFormattingRule",value:function(e){return e[this.v1?4:this.v2?5:6]}},{key:"nationalPrefixFormattingRule",value:function(){return this._getNationalPrefixFormattingRule(this.metadata)||this._getNationalPrefixFormattingRule(this.getDefaultCountryMetadataForRegion())}},{key:"_nationalPrefixForParsing",value:function(){return this.metadata[this.v1?5:this.v2?6:7]}},{key:"nationalPrefixForParsing",value:function(){return this._nationalPrefixForParsing()||this.nationalPrefix()}},{key:"nationalPrefixTransformRule",value:function(){return this.metadata[this.v1?6:this.v2?7:8]}},{key:"_getNationalPrefixIsOptionalWhenFormatting",value:function(){return!!this.metadata[this.v1?7:this.v2?8:9]}},{key:"nationalPrefixIsOptionalWhenFormattingInNationalFormat",value:function(){return this._getNationalPrefixIsOptionalWhenFormatting(this.metadata)||this._getNationalPrefixIsOptionalWhenFormatting(this.getDefaultCountryMetadataForRegion())}},{key:"leadingDigits",value:function(){return this.metadata[this.v1?8:this.v2?9:10]}},{key:"types",value:function(){return this.metadata[this.v1?9:this.v2?10:11]}},{key:"hasTypes",value:function(){return(!this.types()||0!==this.types().length)&&!!this.types()}},{key:"type",value:function(e){if(this.hasTypes()&&g(this.types(),e))return new m(g(this.types(),e),this)}},{key:"ext",value:function(){return this.v1||this.v2?d:this.metadata[13]||d}}]),e}(),p=function(){function e(t,a){i(this,e),this._format=t,this.metadata=a}return o(e,[{key:"pattern",value:function(){return this._format[0]}},{key:"format",value:function(){return this._format[1]}},{key:"leadingDigitsPatterns",value:function(){return this._format[2]||[]}},{key:"nationalPrefixFormattingRule",value:function(){return this._format[3]||this.metadata.nationalPrefixFormattingRule()}},{key:"nationalPrefixIsOptionalWhenFormattingInNationalFormat",value:function(){return!!this._format[4]||this.metadata.nationalPrefixIsOptionalWhenFormattingInNationalFormat()}},{key:"nationalPrefixIsMandatoryWhenFormattingInNationalFormat",value:function(){return this.usesNationalPrefix()&&!this.nationalPrefixIsOptionalWhenFormattingInNationalFormat()}},{key:"usesNationalPrefix",value:function(){return!(!this.nationalPrefixFormattingRule()||u.test(this.nationalPrefixFormattingRule()))}},{key:"internationalFormat",value:function(){return this._format[5]||this.format()}}]),e}(),u=/^\(?\$1\)?$/,m=function(){function e(t,a){i(this,e),this.type=t,this.metadata=a}return o(e,[{key:"pattern",value:function(){return this.metadata.v1?this.type:this.type[0]}},{key:"possibleLengths",value:function(){if(!this.metadata.v1)return this.type[1]||this.metadata.possibleLengths()}}]),e}();function g(e,t){switch(t){case"FIXED_LINE":return e[0];case"MOBILE":return e[1];case"TOLL_FREE":return e[2];case"PREMIUM_RATE":return e[3];case"PERSONAL_NUMBER":return e[4];case"VOICEMAIL":return e[5];case"UAN":return e[6];case"PAGER":return e[7];case"VOIP":return e[8];case"SHARED_COST":return e[9]}}var f=function(e){return"object"===n(e)},v=function(e){return n(e)};function $(e,t){if((t=new c(t)).hasCountry(e))return t.country(e).countryCallingCode();throw new Error("Unknown country: ".concat(e))}function b(e){var t=e.version;"number"==typeof t?(this.v1=1===t,this.v2=2===t,this.v3=3===t,this.v4=4===t):t?-1===s(t,"1.2.0")?this.v2=!0:-1===s(t,"1.7.35")?this.v3=!0:this.v4=!0:this.v1=!0}},2703:(e,t,a)=>{a.d(t,{h:()=>Q});var s=a(8659),n=a(5619);function i(e){return i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},i(e)}function r(e,t){for(var a=0;a=e.length?{done:!0}:{done:!1,value:e[s++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function C(e,t){(null==t||t>e.length)&&(t=e.length);for(var a=0,s=new Array(t);a0&&s[o];if(t.nationalPrefixTransformRule()&&d)n=e.replace(a,t.nationalPrefixTransformRule()),o>1&&(i=s[1]);else{var l=s[0];n=e.slice(l.length),d&&(i=s[1])}if(d){var c=e.indexOf(s[1]);e.slice(0,c)===t.numberingPlan.nationalPrefix()&&(r=t.numberingPlan.nationalPrefix())}else r=s[0];return{nationalNumber:n,nationalPrefix:r,carrierCode:i}}}return{nationalNumber:e}}(e,t),s=a.carrierCode,n=a.nationalNumber;if(n!==e){if(!function(e,t,a){if((0,N.Z)(e,a.nationalNumberPattern())&&!(0,N.Z)(t,a.nationalNumberPattern()))return!1;return!0}(e,n,t))return{nationalNumber:e};if(t.possibleLengths()&&!function(e,t){switch((0,A.Z)(e,t)){case"TOO_SHORT":case"INVALID_LENGTH":return!1;default:return!0}}(n,t))return{nationalNumber:e}}return{nationalNumber:n,carrierCode:s}}function D(e,t,a,s){if(!e)return{};if("+"!==e[0]){var i=function(e,t,a,s){if(t){var n=new g.ZP(s);n.selectNumberingPlan(t,a);var i=new RegExp(n.IDDPrefix());if(0===e.search(i)){var r=(e=e.slice(e.match(i)[0].length)).match(k);if(!(r&&null!=r[1]&&r[1].length>0&&"0"===r[1]))return e}}}(e,t,a,s);if(!i||i===e){if(t||a){var r=function(e,t,a,s){var n=t?(0,g.Gg)(t,s):a;if(0===e.indexOf(n)){(s=new g.ZP(s)).selectNumberingPlan(t,a);var i=e.slice(n.length),r=P(i,s).nationalNumber,o=P(e,s).nationalNumber;if(!(0,N.Z)(o,s.nationalNumberPattern())&&(0,N.Z)(r,s.nationalNumberPattern())||"TOO_LONG"===(0,A.Z)(o,s))return{countryCallingCode:n,number:i}}return{number:e}}(e,t,a,s),o=r.countryCallingCode,d=r.number;if(o)return{countryCallingCode:o,number:d}}return{number:e}}e="+"+i}if("0"===e[1])return{};s=new g.ZP(s);for(var l=2;l-1<=n.xg&&l<=e.length;){var c=e.slice(1,l);if(s.hasCallingCode(c))return s.selectNumberingPlan(c),{countryCallingCode:c,number:e.slice(l)};l++}return{}}var I=a(1089);function R(e,t){var a="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(a)return(a=a.call(e)).next.bind(a);if(Array.isArray(e)||(a=function(e,t){if(!e)return;if("string"==typeof e)return F(e,t);var a=Object.prototype.toString.call(e).slice(8,-1);"Object"===a&&e.constructor&&(a=e.constructor.name);if("Map"===a||"Set"===a)return Array.from(e);if("Arguments"===a||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(a))return F(e,t)}(e))||t&&e&&"number"==typeof e.length){a&&(e=a);var s=0;return function(){return s>=e.length?{done:!0}:{done:!1,value:e[s++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function F(e,t){(null==t||t>e.length)&&(t=e.length);for(var a=0,s=new Array(t);a250){if(a)throw new m("TOO_LONG");return}if(!1===t)return e;var s=e.search(O);if(s<0)return;return e.slice(s).replace(U,"")}(e,a,t);if(!s)return{};if(!(0,f.ZP)(s))return(0,f.ch)(s)?{error:"TOO_SHORT"}:{};var n=function(e){var t=e.search($);if(t<0)return{};for(var a=e.slice(0,t),s=e.match($),n=1;nn.sJ){if(t.v2)throw new m("TOO_LONG");return{}}if(t.v2){var u=new T.Z(h,c,a.metadata);return l&&(u.country=l),p&&(u.carrierCode=p),r&&(u.ext=r),u}var v=!!(t.extended?a.hasSelectedNumberingPlan():l)&&(0,N.Z)(c,a.nationalNumberPattern());return t.extended?{country:l,countryCallingCode:h,carrierCode:p,valid:v,possible:!!v||!(!0!==t.extended||!a.possibleLengths()||!(0,M.D)(c,a)),phone:c,ext:r}:v?function(e,t,a){var s={country:e,phone:t};a&&(s.ext=a);return s}(l,c,r):{}}function B(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);t&&(s=s.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,s)}return a}function j(e){for(var t=1;te.length)&&(t=e.length);for(var a=0,s=new Array(t);a{a.d(t,{Z:()=>n});const s={version:4,country_calling_codes:{1:["US","AG","AI","AS","BB","BM","BS","CA","DM","DO","GD","GU","JM","KN","KY","LC","MP","MS","PR","SX","TC","TT","VC","VG","VI"],7:["RU","KZ"],20:["EG"],27:["ZA"],30:["GR"],31:["NL"],32:["BE"],33:["FR"],34:["ES"],36:["HU"],39:["IT","VA"],40:["RO"],41:["CH"],43:["AT"],44:["GB","GG","IM","JE"],45:["DK"],46:["SE"],47:["NO","SJ"],48:["PL"],49:["DE"],51:["PE"],52:["MX"],53:["CU"],54:["AR"],55:["BR"],56:["CL"],57:["CO"],58:["VE"],60:["MY"],61:["AU","CC","CX"],62:["ID"],63:["PH"],64:["NZ"],65:["SG"],66:["TH"],81:["JP"],82:["KR"],84:["VN"],86:["CN"],90:["TR"],91:["IN"],92:["PK"],93:["AF"],94:["LK"],95:["MM"],98:["IR"],211:["SS"],212:["MA","EH"],213:["DZ"],216:["TN"],218:["LY"],220:["GM"],221:["SN"],222:["MR"],223:["ML"],224:["GN"],225:["CI"],226:["BF"],227:["NE"],228:["TG"],229:["BJ"],230:["MU"],231:["LR"],232:["SL"],233:["GH"],234:["NG"],235:["TD"],236:["CF"],237:["CM"],238:["CV"],239:["ST"],240:["GQ"],241:["GA"],242:["CG"],243:["CD"],244:["AO"],245:["GW"],246:["IO"],247:["AC"],248:["SC"],249:["SD"],250:["RW"],251:["ET"],252:["SO"],253:["DJ"],254:["KE"],255:["TZ"],256:["UG"],257:["BI"],258:["MZ"],260:["ZM"],261:["MG"],262:["RE","YT"],263:["ZW"],264:["NA"],265:["MW"],266:["LS"],267:["BW"],268:["SZ"],269:["KM"],290:["SH","TA"],291:["ER"],297:["AW"],298:["FO"],299:["GL"],350:["GI"],351:["PT"],352:["LU"],353:["IE"],354:["IS"],355:["AL"],356:["MT"],357:["CY"],358:["FI","AX"],359:["BG"],370:["LT"],371:["LV"],372:["EE"],373:["MD"],374:["AM"],375:["BY"],376:["AD"],377:["MC"],378:["SM"],380:["UA"],381:["RS"],382:["ME"],383:["XK"],385:["HR"],386:["SI"],387:["BA"],389:["MK"],420:["CZ"],421:["SK"],423:["LI"],500:["FK"],501:["BZ"],502:["GT"],503:["SV"],504:["HN"],505:["NI"],506:["CR"],507:["PA"],508:["PM"],509:["HT"],590:["GP","BL","MF"],591:["BO"],592:["GY"],593:["EC"],594:["GF"],595:["PY"],596:["MQ"],597:["SR"],598:["UY"],599:["CW","BQ"],670:["TL"],672:["NF"],673:["BN"],674:["NR"],675:["PG"],676:["TO"],677:["SB"],678:["VU"],679:["FJ"],680:["PW"],681:["WF"],682:["CK"],683:["NU"],685:["WS"],686:["KI"],687:["NC"],688:["TV"],689:["PF"],690:["TK"],691:["FM"],692:["MH"],850:["KP"],852:["HK"],853:["MO"],855:["KH"],856:["LA"],880:["BD"],886:["TW"],960:["MV"],961:["LB"],962:["JO"],963:["SY"],964:["IQ"],965:["KW"],966:["SA"],967:["YE"],968:["OM"],970:["PS"],971:["AE"],972:["IL"],973:["BH"],974:["QA"],975:["BT"],976:["MN"],977:["NP"],992:["TJ"],993:["TM"],994:["AZ"],995:["GE"],996:["KG"],998:["UZ"]},countries:{AC:["247","00","(?:[01589]\\d|[46])\\d{4}",[5,6],0,0,0,0,0,0,0,[0,["4\\d{4}",[5]]]],AD:["376","00","(?:1|6\\d)\\d{7}|[135-9]\\d{5}",[6,8,9],[["(\\d{3})(\\d{3})","$1 $2",["[135-9]"]],["(\\d{4})(\\d{4})","$1 $2",["1"]],["(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3",["6"]]],0,0,0,0,0,0,[0,["690\\d{6}|[356]\\d{5}",[6,9]]]],AE:["971","00","(?:[4-7]\\d|9[0-689])\\d{7}|800\\d{2,9}|[2-4679]\\d{7}",[5,6,7,8,9,10,11,12],[["(\\d{3})(\\d{2,9})","$1 $2",["60|8"]],["(\\d)(\\d{3})(\\d{4})","$1 $2 $3",["[236]|[479][2-8]"],"0$1"],["(\\d{3})(\\d)(\\d{5})","$1 $2 $3",["[479]"]],["(\\d{2})(\\d{3})(\\d{4})","$1 $2 $3",["5"],"0$1"]],"0",0,0,0,0,0,[0,["5[024-68]\\d{7}",[9]]]],AF:["93","00","[2-7]\\d{8}",[9],[["(\\d{2})(\\d{3})(\\d{4})","$1 $2 $3",["[2-7]"],"0$1"]],"0",0,0,0,0,0,[0,["7\\d{8}"]]],AG:["1","011","(?:268|[58]\\d\\d|900)\\d{7}",[10],0,"1",0,"1|([457]\\d{6})$","268$1",0,"268",[0,["268(?:464|7(?:1[3-9]|[28]\\d|3[0246]|64|7[0-689]))\\d{4}"]]],AI:["1","011","(?:264|[58]\\d\\d|900)\\d{7}",[10],0,"1",0,"1|([2457]\\d{6})$","264$1",0,"264",[0,["264(?:235|4(?:69|76)|5(?:3[6-9]|8[1-4])|7(?:29|72))\\d{4}"]]],AL:["355","00","(?:700\\d\\d|900)\\d{3}|8\\d{5,7}|(?:[2-5]|6\\d)\\d{7}",[6,7,8,9],[["(\\d{3})(\\d{3,4})","$1 $2",["80|9"],"0$1"],["(\\d)(\\d{3})(\\d{4})","$1 $2 $3",["4[2-6]"],"0$1"],["(\\d{2})(\\d{3})(\\d{3})","$1 $2 $3",["[2358][2-5]|4"],"0$1"],["(\\d{3})(\\d{5})","$1 $2",["[23578]"],"0$1"],["(\\d{2})(\\d{3})(\\d{4})","$1 $2 $3",["6"],"0$1"]],"0",0,0,0,0,0,[0,["6(?:[78][2-9]|9\\d)\\d{6}",[9]]]],AM:["374","00","(?:[1-489]\\d|55|60|77)\\d{6}",[8],[["(\\d{3})(\\d{2})(\\d{3})","$1 $2 $3",["[89]0"],"0 $1"],["(\\d{3})(\\d{5})","$1 $2",["2|3[12]"],"(0$1)"],["(\\d{2})(\\d{6})","$1 $2",["1|47"],"(0$1)"],["(\\d{2})(\\d{6})","$1 $2",["[3-9]"],"0$1"]],"0",0,0,0,0,0,[0,["(?:33|4[1349]|55|77|88|9[13-9])\\d{6}"]]],AO:["244","00","[29]\\d{8}",[9],[["(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3",["[29]"]]],0,0,0,0,0,0,[0,["9[1-59]\\d{7}"]]],AR:["54","00","(?:11|[89]\\d\\d)\\d{8}|[2368]\\d{9}",[10,11],[["(\\d{4})(\\d{2})(\\d{4})","$1 $2-$3",["2(?:2[024-9]|3[0-59]|47|6[245]|9[02-8])|3(?:3[28]|4[03-9]|5[2-46-8]|7[1-578]|8[2-9])","2(?:[23]02|6(?:[25]|4[6-8])|9(?:[02356]|4[02568]|72|8[23]))|3(?:3[28]|4(?:[04679]|3[5-8]|5[4-68]|8[2379])|5(?:[2467]|3[237]|8[2-5])|7[1-578]|8(?:[2469]|3[2578]|5[4-8]|7[36-8]|8[5-8]))|2(?:2[24-9]|3[1-59]|47)","2(?:[23]02|6(?:[25]|4(?:64|[78]))|9(?:[02356]|4(?:[0268]|5[2-6])|72|8[23]))|3(?:3[28]|4(?:[04679]|3[78]|5(?:4[46]|8)|8[2379])|5(?:[2467]|3[237]|8[23])|7[1-578]|8(?:[2469]|3[278]|5[56][46]|86[3-6]))|2(?:2[24-9]|3[1-59]|47)|38(?:[58][78]|7[378])|3(?:4[35][56]|58[45]|8(?:[38]5|54|76))[4-6]","2(?:[23]02|6(?:[25]|4(?:64|[78]))|9(?:[02356]|4(?:[0268]|5[2-6])|72|8[23]))|3(?:3[28]|4(?:[04679]|3(?:5(?:4[0-25689]|[56])|[78])|58|8[2379])|5(?:[2467]|3[237]|8(?:[23]|4(?:[45]|60)|5(?:4[0-39]|5|64)))|7[1-578]|8(?:[2469]|3[278]|54(?:4|5[13-7]|6[89])|86[3-6]))|2(?:2[24-9]|3[1-59]|47)|38(?:[58][78]|7[378])|3(?:454|85[56])[46]|3(?:4(?:36|5[56])|8(?:[38]5|76))[4-6]"],"0$1",1],["(\\d{2})(\\d{4})(\\d{4})","$1 $2-$3",["1"],"0$1",1],["(\\d{3})(\\d{3})(\\d{4})","$1-$2-$3",["[68]"],"0$1"],["(\\d{3})(\\d{3})(\\d{4})","$1 $2-$3",["[23]"],"0$1",1],["(\\d)(\\d{4})(\\d{2})(\\d{4})","$2 15-$3-$4",["9(?:2[2-469]|3[3-578])","9(?:2(?:2[024-9]|3[0-59]|47|6[245]|9[02-8])|3(?:3[28]|4[03-9]|5[2-46-8]|7[1-578]|8[2-9]))","9(?:2(?:[23]02|6(?:[25]|4[6-8])|9(?:[02356]|4[02568]|72|8[23]))|3(?:3[28]|4(?:[04679]|3[5-8]|5[4-68]|8[2379])|5(?:[2467]|3[237]|8[2-5])|7[1-578]|8(?:[2469]|3[2578]|5[4-8]|7[36-8]|8[5-8])))|92(?:2[24-9]|3[1-59]|47)","9(?:2(?:[23]02|6(?:[25]|4(?:64|[78]))|9(?:[02356]|4(?:[0268]|5[2-6])|72|8[23]))|3(?:3[28]|4(?:[04679]|3[78]|5(?:4[46]|8)|8[2379])|5(?:[2467]|3[237]|8[23])|7[1-578]|8(?:[2469]|3[278]|5(?:[56][46]|[78])|7[378]|8(?:6[3-6]|[78]))))|92(?:2[24-9]|3[1-59]|47)|93(?:4[35][56]|58[45]|8(?:[38]5|54|76))[4-6]","9(?:2(?:[23]02|6(?:[25]|4(?:64|[78]))|9(?:[02356]|4(?:[0268]|5[2-6])|72|8[23]))|3(?:3[28]|4(?:[04679]|3(?:5(?:4[0-25689]|[56])|[78])|5(?:4[46]|8)|8[2379])|5(?:[2467]|3[237]|8(?:[23]|4(?:[45]|60)|5(?:4[0-39]|5|64)))|7[1-578]|8(?:[2469]|3[278]|5(?:4(?:4|5[13-7]|6[89])|[56][46]|[78])|7[378]|8(?:6[3-6]|[78]))))|92(?:2[24-9]|3[1-59]|47)|93(?:4(?:36|5[56])|8(?:[38]5|76))[4-6]"],"0$1",0,"$1 $2 $3-$4"],["(\\d)(\\d{2})(\\d{4})(\\d{4})","$2 15-$3-$4",["91"],"0$1",0,"$1 $2 $3-$4"],["(\\d{3})(\\d{3})(\\d{5})","$1-$2-$3",["8"],"0$1"],["(\\d)(\\d{3})(\\d{3})(\\d{4})","$2 15-$3-$4",["9"],"0$1",0,"$1 $2 $3-$4"]],"0",0,"0?(?:(11|2(?:2(?:02?|[13]|2[13-79]|4[1-6]|5[2457]|6[124-8]|7[1-4]|8[13-6]|9[1267])|3(?:02?|1[467]|2[03-6]|3[13-8]|[49][2-6]|5[2-8]|[67])|4(?:7[3-578]|9)|6(?:[0136]|2[24-6]|4[6-8]?|5[15-8])|80|9(?:0[1-3]|[19]|2\\d|3[1-6]|4[02568]?|5[2-4]|6[2-46]|72?|8[23]?))|3(?:3(?:2[79]|6|8[2578])|4(?:0[0-24-9]|[12]|3[5-8]?|4[24-7]|5[4-68]?|6[02-9]|7[126]|8[2379]?|9[1-36-8])|5(?:1|2[1245]|3[237]?|4[1-46-9]|6[2-4]|7[1-6]|8[2-5]?)|6[24]|7(?:[069]|1[1568]|2[15]|3[145]|4[13]|5[14-8]|7[2-57]|8[126])|8(?:[01]|2[15-7]|3[2578]?|4[13-6]|5[4-8]?|6[1-357-9]|7[36-8]?|8[5-8]?|9[124])))15)?","9$1",0,0,[0,["93(?:7(?:1[15]|81)[46]|8(?:(?:21|4[16]|69|9[12])[46]|88[013-9]))\\d{5}|9(?:29(?:54|66)|3(?:7(?:55|77)|865))[2-8]\\d{5}|9(?:2(?:2(?:2[59]|44|52)|3(?:26|44)|473|9(?:[07]2|2[26]|34|46))|3327)[45]\\d{5}|9(?:2(?:284|3(?:02|23)|657|920)|3(?:4(?:8[27]|92)|541|878))[2-7]\\d{5}|9(?:2(?:(?:26|62)2|320|477|9(?:42|83))|3(?:329|4(?:[47]6|62|89)|564))[2-6]\\d{5}|(?:675\\d|9(?:11[1-8]\\d|2(?:2(?:0[45]|1[2-6]|3[3-6])|3(?:[06]4|7[45])|494|6(?:04|1[2-8]|[36][45]|4[3-6])|80[45]|9(?:[17][4-6]|[48][45]|9[3-6]))|3(?:364|4(?:1[2-7]|[235][4-6]|84)|5(?:1[2-9]|[38][4-6])|6(?:2[45]|44)|7[069][45]|8(?:0[45]|[17][2-6]|3[4-6]|[58][3-6]))))\\d{6}|92(?:2(?:21|4[23]|6[145]|7[1-4]|8[356]|9[267])|3(?:16|3[13-8]|43|5[346-8]|9[3-5])|475|6(?:2[46]|4[78]|5[1568])|9(?:03|2[1457-9]|3[1356]|4[08]|[56][23]|82))4\\d{5}|9(?:2(?:2(?:57|81)|3(?:24|46|92)|9(?:01|23|64))|3(?:4(?:42|71)|5(?:25|37|4[347]|71)|7(?:18|5[17])))[3-6]\\d{5}|9(?:2(?:2(?:02|2[3467]|4[156]|5[45]|6[6-8]|91)|3(?:1[47]|25|[45][25]|96)|47[48]|625|932)|3(?:38[2578]|4(?:0[0-24-9]|3[78]|4[457]|58|6[03-9]|72|83|9[136-8])|5(?:2[124]|[368][23]|4[2689]|7[2-6])|7(?:16|2[15]|3[145]|4[13]|5[468]|7[2-5]|8[26])|8(?:2[5-7]|3[278]|4[3-5]|5[78]|6[1-378]|[78]7|94)))[4-6]\\d{5}"]]],AS:["1","011","(?:[58]\\d\\d|684|900)\\d{7}",[10],0,"1",0,"1|([267]\\d{6})$","684$1",0,"684",[0,["684(?:2(?:48|5[2468]|7[26])|7(?:3[13]|70|82))\\d{4}"]]],AT:["43","00","1\\d{3,12}|2\\d{6,12}|43(?:(?:0\\d|5[02-9])\\d{3,9}|2\\d{4,5}|[3467]\\d{4}|8\\d{4,6}|9\\d{4,7})|5\\d{4,12}|8\\d{7,12}|9\\d{8,12}|(?:[367]\\d|4[0-24-9])\\d{4,11}",[4,5,6,7,8,9,10,11,12,13],[["(\\d)(\\d{3,12})","$1 $2",["1(?:11|[2-9])"],"0$1"],["(\\d{3})(\\d{2})","$1 $2",["517"],"0$1"],["(\\d{2})(\\d{3,5})","$1 $2",["5[079]"],"0$1"],["(\\d{3})(\\d{3,10})","$1 $2",["(?:31|4)6|51|6(?:5[0-3579]|[6-9])|7(?:20|32|8)|[89]"],"0$1"],["(\\d{4})(\\d{3,9})","$1 $2",["[2-467]|5[2-6]"],"0$1"],["(\\d{2})(\\d{3})(\\d{3,4})","$1 $2 $3",["5"],"0$1"],["(\\d{2})(\\d{4})(\\d{4,7})","$1 $2 $3",["5"],"0$1"]],"0",0,0,0,0,0,[0,["6(?:5[0-3579]|6[013-9]|[7-9]\\d)\\d{4,10}",[7,8,9,10,11,12,13]]]],AU:["61","001[14-689]|14(?:1[14]|34|4[17]|[56]6|7[47]|88)0011","1(?:[0-79]\\d{7}(?:\\d(?:\\d{2})?)?|8[0-24-9]\\d{7})|[2-478]\\d{8}|1\\d{4,7}",[5,6,7,8,9,10,12],[["(\\d{2})(\\d{3,4})","$1 $2",["16"],"0$1"],["(\\d{2})(\\d{3})(\\d{2,4})","$1 $2 $3",["16"],"0$1"],["(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3",["14|4"],"0$1"],["(\\d)(\\d{4})(\\d{4})","$1 $2 $3",["[2378]"],"(0$1)"],["(\\d{4})(\\d{3})(\\d{3})","$1 $2 $3",["1(?:30|[89])"]]],"0",0,"0|(183[12])",0,0,0,[0,["4(?:83[0-389]|93[0-6])\\d{5}|4(?:[0-3]\\d|4[047-9]|5[0-25-9]|6[016-9]|7[02-9]|8[0-24-9]|9[0-27-9])\\d{6}",[9]]],"0011"],AW:["297","00","(?:[25-79]\\d\\d|800)\\d{4}",[7],[["(\\d{3})(\\d{4})","$1 $2",["[25-9]"]]],0,0,0,0,0,0,[0,["(?:290|5[69]\\d|6(?:[03]0|22|4[0-2]|[69]\\d)|7(?:[34]\\d|7[07])|9(?:6[45]|9[4-8]))\\d{4}"]]],AX:["358","00|99(?:[01469]|5(?:[14]1|3[23]|5[59]|77|88|9[09]))","2\\d{4,9}|35\\d{4,5}|(?:60\\d\\d|800)\\d{4,6}|7\\d{5,11}|(?:[14]\\d|3[0-46-9]|50)\\d{4,8}",[5,6,7,8,9,10,11,12],0,"0",0,0,0,0,"18",[0,["4946\\d{2,6}|(?:4[0-8]|50)\\d{4,8}",[6,7,8,9,10]]],"00"],AZ:["994","00","365\\d{6}|(?:[124579]\\d|60|88)\\d{7}",[9],[["(\\d{3})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",["90"],"0$1"],["(\\d{2})(\\d{3})(\\d{2})(\\d{2})","$1 $2 $3 $4",["1[28]|2|365|46","1[28]|2|365[45]|46","1[28]|2|365(?:4|5[02])|46"],"(0$1)"],["(\\d{2})(\\d{3})(\\d{2})(\\d{2})","$1 $2 $3 $4",["[13-9]"],"0$1"]],"0",0,0,0,0,0,[0,["36554\\d{4}|(?:[16]0|4[04]|5[015]|7[07]|99)\\d{7}"]]],BA:["387","00","6\\d{8}|(?:[35689]\\d|49|70)\\d{6}",[8,9],[["(\\d{2})(\\d{3})(\\d{3})","$1 $2 $3",["6[1-3]|[7-9]"],"0$1"],["(\\d{2})(\\d{3})(\\d{3})","$1 $2-$3",["[3-5]|6[56]"],"0$1"],["(\\d{2})(\\d{2})(\\d{2})(\\d{3})","$1 $2 $3 $4",["6"],"0$1"]],"0",0,0,0,0,0,[0,["6040\\d{5}|6(?:03|[1-356]|44|7\\d)\\d{6}"]]],BB:["1","011","(?:246|[58]\\d\\d|900)\\d{7}",[10],0,"1",0,"1|([2-9]\\d{6})$","246$1",0,"246",[0,["246(?:(?:2(?:[3568]\\d|4[0-57-9])|3(?:5[2-9]|6[0-6])|4(?:46|5\\d)|69[5-7]|8(?:[2-5]\\d|83))\\d|52(?:1[147]|20))\\d{3}"]]],BD:["880","00","[1-469]\\d{9}|8[0-79]\\d{7,8}|[2-79]\\d{8}|[2-9]\\d{7}|[3-9]\\d{6}|[57-9]\\d{5}",[6,7,8,9,10],[["(\\d{2})(\\d{4,6})","$1-$2",["31[5-8]|[459]1"],"0$1"],["(\\d{3})(\\d{3,7})","$1-$2",["3(?:[67]|8[013-9])|4(?:6[168]|7|[89][18])|5(?:6[128]|9)|6(?:28|4[14]|5)|7[2-589]|8(?:0[014-9]|[12])|9[358]|(?:3[2-5]|4[235]|5[2-578]|6[0389]|76|8[3-7]|9[24])1|(?:44|66)[01346-9]"],"0$1"],["(\\d{4})(\\d{3,6})","$1-$2",["[13-9]|22"],"0$1"],["(\\d)(\\d{7,8})","$1-$2",["2"],"0$1"]],"0",0,0,0,0,0,[0,["(?:1[13-9]\\d|644)\\d{7}|(?:3[78]|44|66)[02-9]\\d{7}",[10]]]],BE:["32","00","4\\d{8}|[1-9]\\d{7}",[8,9],[["(\\d{3})(\\d{2})(\\d{3})","$1 $2 $3",["(?:80|9)0"],"0$1"],["(\\d)(\\d{3})(\\d{2})(\\d{2})","$1 $2 $3 $4",["[239]|4[23]"],"0$1"],["(\\d{2})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",["[15-8]"],"0$1"],["(\\d{3})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",["4"],"0$1"]],"0",0,0,0,0,0,[0,["4[5-9]\\d{7}",[9]]]],BF:["226","00","[025-7]\\d{7}",[8],[["(\\d{2})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",["[025-7]"]]],0,0,0,0,0,0,[0,["(?:0[1-35-7]|5[1-8]|[67]\\d)\\d{6}"]]],BG:["359","00","00800\\d{7}|[2-7]\\d{6,7}|[89]\\d{6,8}|2\\d{5}",[6,7,8,9,12],[["(\\d)(\\d)(\\d{2})(\\d{2})","$1 $2 $3 $4",["2"],"0$1"],["(\\d{3})(\\d{4})","$1 $2",["43[1-6]|70[1-9]"],"0$1"],["(\\d)(\\d{3})(\\d{3,4})","$1 $2 $3",["2"],"0$1"],["(\\d{2})(\\d{3})(\\d{2,3})","$1 $2 $3",["[356]|4[124-7]|7[1-9]|8[1-6]|9[1-7]"],"0$1"],["(\\d{3})(\\d{2})(\\d{3})","$1 $2 $3",["(?:70|8)0"],"0$1"],["(\\d{3})(\\d{3})(\\d{2})","$1 $2 $3",["43[1-7]|7"],"0$1"],["(\\d{2})(\\d{3})(\\d{3,4})","$1 $2 $3",["[48]|9[08]"],"0$1"],["(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3",["9"],"0$1"]],"0",0,0,0,0,0,[0,["(?:43[07-9]|99[69]\\d)\\d{5}|(?:8[7-9]|98)\\d{7}",[8,9]]]],BH:["973","00","[136-9]\\d{7}",[8],[["(\\d{4})(\\d{4})","$1 $2",["[13679]|8[047]"]]],0,0,0,0,0,0,[0,["(?:3(?:[1-79]\\d|8[0-47-9])\\d|6(?:3(?:00|33|6[16])|6(?:3[03-9]|[69]\\d|7[0-6])))\\d{4}"]]],BI:["257","00","(?:[267]\\d|31)\\d{6}",[8],[["(\\d{2})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",["[2367]"]]],0,0,0,0,0,0,[0,["(?:29|[67][125-9])\\d{6}"]]],BJ:["229","00","[24-689]\\d{7}",[8],[["(\\d{2})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",["[24-689]"]]],0,0,0,0,0,0,[0,["(?:4[01]|5[1-9]|6\\d|9[013-9])\\d{6}"]]],BL:["590","00","(?:590|(?:69|80)\\d|976)\\d{6}",[9],0,"0",0,0,0,0,0,[0,["69(?:0\\d\\d|1(?:2[2-9]|3[0-5]))\\d{4}"]]],BM:["1","011","(?:441|[58]\\d\\d|900)\\d{7}",[10],0,"1",0,"1|([2-9]\\d{6})$","441$1",0,"441",[0,["441(?:[2378]\\d|5[0-39]|92)\\d{5}"]]],BN:["673","00","[2-578]\\d{6}",[7],[["(\\d{3})(\\d{4})","$1 $2",["[2-578]"]]],0,0,0,0,0,0,[0,["(?:22[89]|[78]\\d\\d)\\d{4}"]]],BO:["591","00(?:1\\d)?","(?:[2-467]\\d\\d|8001)\\d{5}",[8,9],[["(\\d)(\\d{7})","$1 $2",["[23]|4[46]"]],["(\\d{8})","$1",["[67]"]],["(\\d{3})(\\d{2})(\\d{4})","$1 $2 $3",["8"]]],"0",0,"0(1\\d)?",0,0,0,[0,["[67]\\d{7}",[8]]]],BQ:["599","00","(?:[34]1|7\\d)\\d{5}",[7],0,0,0,0,0,0,"[347]",[0,["(?:31(?:8[14-8]|9[14578])|416[14-9]|7(?:0[01]|7[07]|8\\d|9[056])\\d)\\d{3}"]]],BR:["55","00(?:1[245]|2[1-35]|31|4[13]|[56]5|99)","(?:[1-46-9]\\d\\d|5(?:[0-46-9]\\d|5[0-46-9]))\\d{8}|[1-9]\\d{9}|[3589]\\d{8}|[34]\\d{7}",[8,9,10,11],[["(\\d{4})(\\d{4})","$1-$2",["300|4(?:0[02]|37)","4(?:02|37)0|[34]00"]],["(\\d{3})(\\d{2,3})(\\d{4})","$1 $2 $3",["(?:[358]|90)0"],"0$1"],["(\\d{2})(\\d{4})(\\d{4})","$1 $2-$3",["(?:[14689][1-9]|2[12478]|3[1-578]|5[13-5]|7[13-579])[2-57]"],"($1)"],["(\\d{2})(\\d{5})(\\d{4})","$1 $2-$3",["[16][1-9]|[2-57-9]"],"($1)"]],"0",0,"(?:0|90)(?:(1[245]|2[1-35]|31|4[13]|[56]5|99)(\\d{10,11}))?","$2",0,0,[0,["(?:[14689][1-9]|2[12478]|3[1-578]|5[13-5]|7[13-579])(?:7|9\\d)\\d{7}",[10,11]]]],BS:["1","011","(?:242|[58]\\d\\d|900)\\d{7}",[10],0,"1",0,"1|([3-8]\\d{6})$","242$1",0,"242",[0,["242(?:3(?:5[79]|7[56]|95)|4(?:[23][1-9]|4[1-35-9]|5[1-8]|6[2-8]|7\\d|81)|5(?:2[45]|3[35]|44|5[1-46-9]|65|77)|6[34]6|7(?:27|38)|8(?:0[1-9]|1[02-9]|2\\d|[89]9))\\d{4}"]]],BT:["975","00","[17]\\d{7}|[2-8]\\d{6}",[7,8],[["(\\d)(\\d{3})(\\d{3})","$1 $2 $3",["[2-68]|7[246]"]],["(\\d{2})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",["1[67]|7"]]],0,0,0,0,0,0,[0,["(?:1[67]|77)\\d{6}",[8]]]],BW:["267","00","(?:0800|(?:[37]|800)\\d)\\d{6}|(?:[2-6]\\d|90)\\d{5}",[7,8,10],[["(\\d{2})(\\d{5})","$1 $2",["90"]],["(\\d{3})(\\d{4})","$1 $2",["[24-6]|3[15-79]"]],["(\\d{2})(\\d{3})(\\d{3})","$1 $2 $3",["[37]"]],["(\\d{4})(\\d{3})(\\d{3})","$1 $2 $3",["0"]],["(\\d{3})(\\d{4})(\\d{3})","$1 $2 $3",["8"]]],0,0,0,0,0,0,[0,["(?:321|7(?:[1-7]\\d|8[0-4]))\\d{5}",[8]]]],BY:["375","810","(?:[12]\\d|33|44|902)\\d{7}|8(?:0[0-79]\\d{5,7}|[1-7]\\d{9})|8(?:1[0-489]|[5-79]\\d)\\d{7}|8[1-79]\\d{6,7}|8[0-79]\\d{5}|8\\d{5}",[6,7,8,9,10,11],[["(\\d{3})(\\d{3})","$1 $2",["800"],"8 $1"],["(\\d{3})(\\d{2})(\\d{2,4})","$1 $2 $3",["800"],"8 $1"],["(\\d{4})(\\d{2})(\\d{3})","$1 $2-$3",["1(?:5[169]|6[3-5]|7[179])|2(?:1[35]|2[34]|3[3-5])","1(?:5[169]|6(?:3[1-3]|4|5[125])|7(?:1[3-9]|7[0-24-6]|9[2-7]))|2(?:1[35]|2[34]|3[3-5])"],"8 0$1"],["(\\d{3})(\\d{2})(\\d{2})(\\d{2})","$1 $2-$3-$4",["1(?:[56]|7[467])|2[1-3]"],"8 0$1"],["(\\d{2})(\\d{3})(\\d{2})(\\d{2})","$1 $2-$3-$4",["[1-4]"],"8 0$1"],["(\\d{3})(\\d{3,4})(\\d{4})","$1 $2 $3",["[89]"],"8 $1"]],"8",0,"0|80?",0,0,0,[0,["(?:2(?:5[5-79]|9[1-9])|(?:33|44)\\d)\\d{6}",[9]]],"8~10"],BZ:["501","00","(?:0800\\d|[2-8])\\d{6}",[7,11],[["(\\d{3})(\\d{4})","$1-$2",["[2-8]"]],["(\\d)(\\d{3})(\\d{4})(\\d{3})","$1-$2-$3-$4",["0"]]],0,0,0,0,0,0,[0,["6[0-35-7]\\d{5}",[7]]]],CA:["1","011","(?:[2-8]\\d|90)\\d{8}|3\\d{6}",[7,10],0,"1",0,0,0,0,0,[0,["(?:2(?:04|[23]6|[48]9|50|63)|3(?:06|43|54|6[578]|82)|4(?:03|1[68]|3[178]|50|68|74)|5(?:06|1[49]|48|79|8[147])|6(?:04|[18]3|39|47|72)|7(?:0[59]|42|53|78|8[02])|8(?:[06]7|19|25|73)|90[25])[2-9]\\d{6}",[10]]]],CC:["61","001[14-689]|14(?:1[14]|34|4[17]|[56]6|7[47]|88)0011","1(?:[0-79]\\d{8}(?:\\d{2})?|8[0-24-9]\\d{7})|[148]\\d{8}|1\\d{5,7}",[6,7,8,9,10,12],0,"0",0,"0|([59]\\d{7})$","8$1",0,0,[0,["4(?:83[0-389]|93[0-6])\\d{5}|4(?:[0-3]\\d|4[047-9]|5[0-25-9]|6[016-9]|7[02-9]|8[0-24-9]|9[0-27-9])\\d{6}",[9]]],"0011"],CD:["243","00","[189]\\d{8}|[1-68]\\d{6}",[7,9],[["(\\d{2})(\\d{2})(\\d{3})","$1 $2 $3",["88"],"0$1"],["(\\d{2})(\\d{5})","$1 $2",["[1-6]"],"0$1"],["(\\d{2})(\\d{3})(\\d{4})","$1 $2 $3",["1"],"0$1"],["(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3",["[89]"],"0$1"]],"0",0,0,0,0,0,[0,["88\\d{5}|(?:8[0-59]|9[017-9])\\d{7}"]]],CF:["236","00","(?:[27]\\d{3}|8776)\\d{4}",[8],[["(\\d{2})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",["[278]"]]],0,0,0,0,0,0,[0,["7[02457]\\d{6}"]]],CG:["242","00","222\\d{6}|(?:0\\d|80)\\d{7}",[9],[["(\\d)(\\d{4})(\\d{4})","$1 $2 $3",["8"]],["(\\d{2})(\\d{3})(\\d{4})","$1 $2 $3",["[02]"]]],0,0,0,0,0,0,[0,["026(?:1[0-5]|6[6-9])\\d{4}|0(?:[14-6]\\d\\d|2(?:40|5[5-8]|6[07-9]))\\d{5}"]]],CH:["41","00","8\\d{11}|[2-9]\\d{8}",[9],[["(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3",["8[047]|90"],"0$1"],["(\\d{2})(\\d{3})(\\d{2})(\\d{2})","$1 $2 $3 $4",["[2-79]|81"],"0$1"],["(\\d{3})(\\d{2})(\\d{3})(\\d{2})(\\d{2})","$1 $2 $3 $4 $5",["8"],"0$1"]],"0",0,0,0,0,0,[0,["7[35-9]\\d{7}"]]],CI:["225","00","[02]\\d{9}",[10],[["(\\d{2})(\\d{2})(\\d)(\\d{5})","$1 $2 $3 $4",["2"]],["(\\d{2})(\\d{2})(\\d{2})(\\d{4})","$1 $2 $3 $4",["0"]]],0,0,0,0,0,0,[0,["0[157]\\d{8}"]]],CK:["682","00","[2-578]\\d{4}",[5],[["(\\d{2})(\\d{3})","$1 $2",["[2-578]"]]],0,0,0,0,0,0,[0,["[578]\\d{4}"]]],CL:["56","(?:0|1(?:1[0-69]|2[02-5]|5[13-58]|69|7[0167]|8[018]))0","12300\\d{6}|6\\d{9,10}|[2-9]\\d{8}",[9,10,11],[["(\\d{5})(\\d{4})","$1 $2",["219","2196"],"($1)"],["(\\d{2})(\\d{3})(\\d{4})","$1 $2 $3",["44"]],["(\\d)(\\d{4})(\\d{4})","$1 $2 $3",["2[1-36]"],"($1)"],["(\\d)(\\d{4})(\\d{4})","$1 $2 $3",["9[2-9]"]],["(\\d{2})(\\d{3})(\\d{4})","$1 $2 $3",["3[2-5]|[47]|5[1-3578]|6[13-57]|8(?:0[1-9]|[1-9])"],"($1)"],["(\\d{3})(\\d{3})(\\d{3,4})","$1 $2 $3",["60|8"]],["(\\d{4})(\\d{3})(\\d{4})","$1 $2 $3",["1"]],["(\\d{3})(\\d{3})(\\d{2})(\\d{3})","$1 $2 $3 $4",["60"]]],0,0,0,0,0,0,[0,["2(?:1982[0-6]|3314[05-9])\\d{3}|(?:2(?:1(?:160|962)|3(?:2\\d\\d|3(?:[0346]\\d|1[0-35-9]|2[1-9]|5[0-24-9]|7[0-3])|600)|646[59])|80[1-9]\\d\\d|9(?:3(?:[0-57-9]\\d\\d|6(?:0[02-9]|[1-9]\\d))|6(?:[0-8]\\d\\d|9(?:[02-79]\\d|1[05-9]))|7[1-9]\\d\\d|9(?:[03-9]\\d\\d|1(?:[0235-9]\\d|4[0-24-9])|2(?:[0-79]\\d|8[0-46-9]))))\\d{4}|(?:22|3[2-5]|[47][1-35]|5[1-3578]|6[13-57]|8[1-9]|9[2458])\\d{7}",[9]]]],CM:["237","00","[26]\\d{8}|88\\d{6,7}",[8,9],[["(\\d{2})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",["88"]],["(\\d)(\\d{2})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4 $5",["[26]|88"]]],0,0,0,0,0,0,[0,["(?:24[23]|6[25-9]\\d)\\d{6}",[9]]]],CN:["86","00|1(?:[12]\\d|79)\\d\\d00","1[127]\\d{8,9}|2\\d{9}(?:\\d{2})?|[12]\\d{6,7}|86\\d{6}|(?:1[03-689]\\d|6)\\d{7,9}|(?:[3-579]\\d|8[0-57-9])\\d{6,9}",[7,8,9,10,11,12],[["(\\d{2})(\\d{5,6})","$1 $2",["(?:10|2[0-57-9])[19]","(?:10|2[0-57-9])(?:10|9[56])","10(?:10|9[56])|2[0-57-9](?:100|9[56])"],"0$1"],["(\\d{3})(\\d{5,6})","$1 $2",["3(?:[157]|35|49|9[1-68])|4(?:[17]|2[179]|6[47-9]|8[23])|5(?:[1357]|2[37]|4[36]|6[1-46]|80)|6(?:3[1-5]|6[0238]|9[12])|7(?:01|[1579]|2[248]|3[014-9]|4[3-6]|6[023689])|8(?:1[236-8]|2[5-7]|[37]|8[36-8]|9[1-8])|9(?:0[1-3689]|1[1-79]|[379]|4[13]|5[1-5])|(?:4[35]|59|85)[1-9]","(?:3(?:[157]\\d|35|49|9[1-68])|4(?:[17]\\d|2[179]|[35][1-9]|6[47-9]|8[23])|5(?:[1357]\\d|2[37]|4[36]|6[1-46]|80|9[1-9])|6(?:3[1-5]|6[0238]|9[12])|7(?:01|[1579]\\d|2[248]|3[014-9]|4[3-6]|6[023689])|8(?:1[236-8]|2[5-7]|[37]\\d|5[1-9]|8[36-8]|9[1-8])|9(?:0[1-3689]|1[1-79]|[379]\\d|4[13]|5[1-5]))[19]","85[23](?:10|95)|(?:3(?:[157]\\d|35|49|9[1-68])|4(?:[17]\\d|2[179]|[35][1-9]|6[47-9]|8[23])|5(?:[1357]\\d|2[37]|4[36]|6[1-46]|80|9[1-9])|6(?:3[1-5]|6[0238]|9[12])|7(?:01|[1579]\\d|2[248]|3[014-9]|4[3-6]|6[023689])|8(?:1[236-8]|2[5-7]|[37]\\d|5[14-9]|8[36-8]|9[1-8])|9(?:0[1-3689]|1[1-79]|[379]\\d|4[13]|5[1-5]))(?:10|9[56])","85[23](?:100|95)|(?:3(?:[157]\\d|35|49|9[1-68])|4(?:[17]\\d|2[179]|[35][1-9]|6[47-9]|8[23])|5(?:[1357]\\d|2[37]|4[36]|6[1-46]|80|9[1-9])|6(?:3[1-5]|6[0238]|9[12])|7(?:01|[1579]\\d|2[248]|3[014-9]|4[3-6]|6[023689])|8(?:1[236-8]|2[5-7]|[37]\\d|5[14-9]|8[36-8]|9[1-8])|9(?:0[1-3689]|1[1-79]|[379]\\d|4[13]|5[1-5]))(?:100|9[56])"],"0$1"],["(\\d{3})(\\d{3})(\\d{4})","$1 $2 $3",["(?:4|80)0"]],["(\\d{2})(\\d{4})(\\d{4})","$1 $2 $3",["10|2(?:[02-57-9]|1[1-9])","10|2(?:[02-57-9]|1[1-9])","10[0-79]|2(?:[02-57-9]|1[1-79])|(?:10|21)8(?:0[1-9]|[1-9])"],"0$1",1],["(\\d{3})(\\d{3})(\\d{4})","$1 $2 $3",["3(?:[3-59]|7[02-68])|4(?:[26-8]|3[3-9]|5[2-9])|5(?:3[03-9]|[468]|7[028]|9[2-46-9])|6|7(?:[0-247]|3[04-9]|5[0-4689]|6[2368])|8(?:[1-358]|9[1-7])|9(?:[013479]|5[1-5])|(?:[34]1|55|79|87)[02-9]"],"0$1",1],["(\\d{3})(\\d{7,8})","$1 $2",["9"]],["(\\d{4})(\\d{3})(\\d{4})","$1 $2 $3",["80"],"0$1",1],["(\\d{3})(\\d{4})(\\d{4})","$1 $2 $3",["[3-578]"],"0$1",1],["(\\d{3})(\\d{4})(\\d{4})","$1 $2 $3",["1[3-9]"]],["(\\d{2})(\\d{3})(\\d{3})(\\d{4})","$1 $2 $3 $4",["[12]"],"0$1",1]],"0",0,"0|(1(?:[12]\\d|79)\\d\\d)",0,0,0,[0,["1740[0-5]\\d{6}|1(?:[38]\\d|4[57]|[59][0-35-9]|6[25-7]|7[0-35-8])\\d{8}",[11]]],"00"],CO:["57","00(?:4(?:[14]4|56)|[579])","(?:60\\d\\d|9101)\\d{6}|(?:1\\d|3)\\d{9}",[10,11],[["(\\d{3})(\\d{7})","$1 $2",["6"],"($1)"],["(\\d{3})(\\d{7})","$1 $2",["3[0-357]|91"]],["(\\d)(\\d{3})(\\d{7})","$1-$2-$3",["1"],"0$1",0,"$1 $2 $3"]],"0",0,"0(4(?:[14]4|56)|[579])?",0,0,0,[0,["3333(?:0(?:0\\d|1[0-5])|[4-9]\\d\\d)\\d{3}|(?:3(?:24[1-9]|3(?:00|3[0-24-9]))|9101)\\d{6}|3(?:0[0-5]|1\\d|2[0-3]|5[01]|70)\\d{7}",[10]]]],CR:["506","00","(?:8\\d|90)\\d{8}|(?:[24-8]\\d{3}|3005)\\d{4}",[8,10],[["(\\d{4})(\\d{4})","$1 $2",["[2-7]|8[3-9]"]],["(\\d{3})(\\d{3})(\\d{4})","$1-$2-$3",["[89]"]]],0,0,"(19(?:0[0-2468]|1[09]|20|66|77|99))",0,0,0,[0,["(?:3005\\d|6500[01])\\d{3}|(?:5[07]|6[0-4]|7[0-3]|8[3-9])\\d{6}",[8]]]],CU:["53","119","[27]\\d{6,7}|[34]\\d{5,7}|(?:5|8\\d\\d)\\d{7}",[6,7,8,10],[["(\\d{2})(\\d{4,6})","$1 $2",["2[1-4]|[34]"],"(0$1)"],["(\\d)(\\d{6,7})","$1 $2",["7"],"(0$1)"],["(\\d)(\\d{7})","$1 $2",["5"],"0$1"],["(\\d{3})(\\d{7})","$1 $2",["8"],"0$1"]],"0",0,0,0,0,0,[0,["5\\d{7}",[8]]]],CV:["238","0","(?:[2-59]\\d\\d|800)\\d{4}",[7],[["(\\d{3})(\\d{2})(\\d{2})","$1 $2 $3",["[2-589]"]]],0,0,0,0,0,0,[0,["(?:36|5[1-389]|9\\d)\\d{5}"]]],CW:["599","00","(?:[34]1|60|(?:7|9\\d)\\d)\\d{5}",[7,8],[["(\\d{3})(\\d{4})","$1 $2",["[3467]"]],["(\\d)(\\d{3})(\\d{4})","$1 $2 $3",["9[4-8]"]]],0,0,0,0,0,"[69]",[0,["953[01]\\d{4}|9(?:5[12467]|6[5-9])\\d{5}"]]],CX:["61","001[14-689]|14(?:1[14]|34|4[17]|[56]6|7[47]|88)0011","1(?:[0-79]\\d{8}(?:\\d{2})?|8[0-24-9]\\d{7})|[148]\\d{8}|1\\d{5,7}",[6,7,8,9,10,12],0,"0",0,"0|([59]\\d{7})$","8$1",0,0,[0,["4(?:83[0-389]|93[0-6])\\d{5}|4(?:[0-3]\\d|4[047-9]|5[0-25-9]|6[016-9]|7[02-9]|8[0-24-9]|9[0-27-9])\\d{6}",[9]]],"0011"],CY:["357","00","(?:[279]\\d|[58]0)\\d{6}",[8],[["(\\d{2})(\\d{6})","$1 $2",["[257-9]"]]],0,0,0,0,0,0,[0,["9(?:10|[4-79]\\d)\\d{5}"]]],CZ:["420","00","(?:[2-578]\\d|60)\\d{7}|9\\d{8,11}",[9],[["(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3",["[2-8]|9[015-7]"]],["(\\d{2})(\\d{3})(\\d{3})(\\d{2})","$1 $2 $3 $4",["96"]],["(\\d{2})(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3 $4",["9"]],["(\\d{3})(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3 $4",["9"]]],0,0,0,0,0,0,[0,["(?:60[1-8]|7(?:0[2-5]|[2379]\\d))\\d{6}"]]],DE:["49","00","[2579]\\d{5,14}|49(?:[34]0|69|8\\d)\\d\\d?|49(?:37|49|60|7[089]|9\\d)\\d{1,3}|49(?:2[024-9]|3[2-689]|7[1-7])\\d{1,8}|(?:1|[368]\\d|4[0-8])\\d{3,13}|49(?:[015]\\d|2[13]|31|[46][1-8])\\d{1,9}",[4,5,6,7,8,9,10,11,12,13,14,15],[["(\\d{2})(\\d{3,13})","$1 $2",["3[02]|40|[68]9"],"0$1"],["(\\d{3})(\\d{3,12})","$1 $2",["2(?:0[1-389]|1[124]|2[18]|3[14])|3(?:[35-9][15]|4[015])|906|(?:2[4-9]|4[2-9]|[579][1-9]|[68][1-8])1","2(?:0[1-389]|12[0-8])|3(?:[35-9][15]|4[015])|906|2(?:[13][14]|2[18])|(?:2[4-9]|4[2-9]|[579][1-9]|[68][1-8])1"],"0$1"],["(\\d{4})(\\d{2,11})","$1 $2",["[24-6]|3(?:[3569][02-46-9]|4[2-4679]|7[2-467]|8[2-46-8])|70[2-8]|8(?:0[2-9]|[1-8])|90[7-9]|[79][1-9]","[24-6]|3(?:3(?:0[1-467]|2[127-9]|3[124578]|7[1257-9]|8[1256]|9[145])|4(?:2[135]|4[13578]|9[1346])|5(?:0[14]|2[1-3589]|6[1-4]|7[13468]|8[13568])|6(?:2[1-489]|3[124-6]|6[13]|7[12579]|8[1-356]|9[135])|7(?:2[1-7]|4[145]|6[1-5]|7[1-4])|8(?:21|3[1468]|6|7[1467]|8[136])|9(?:0[12479]|2[1358]|4[134679]|6[1-9]|7[136]|8[147]|9[1468]))|70[2-8]|8(?:0[2-9]|[1-8])|90[7-9]|[79][1-9]|3[68]4[1347]|3(?:47|60)[1356]|3(?:3[46]|46|5[49])[1246]|3[4579]3[1357]"],"0$1"],["(\\d{3})(\\d{4})","$1 $2",["138"],"0$1"],["(\\d{5})(\\d{2,10})","$1 $2",["3"],"0$1"],["(\\d{3})(\\d{5,11})","$1 $2",["181"],"0$1"],["(\\d{3})(\\d)(\\d{4,10})","$1 $2 $3",["1(?:3|80)|9"],"0$1"],["(\\d{3})(\\d{7,8})","$1 $2",["1[67]"],"0$1"],["(\\d{3})(\\d{7,12})","$1 $2",["8"],"0$1"],["(\\d{5})(\\d{6})","$1 $2",["185","1850","18500"],"0$1"],["(\\d{3})(\\d{4})(\\d{4})","$1 $2 $3",["7"],"0$1"],["(\\d{4})(\\d{7})","$1 $2",["18[68]"],"0$1"],["(\\d{5})(\\d{6})","$1 $2",["15[0568]"],"0$1"],["(\\d{4})(\\d{7})","$1 $2",["15[1279]"],"0$1"],["(\\d{3})(\\d{8})","$1 $2",["18"],"0$1"],["(\\d{3})(\\d{2})(\\d{7,8})","$1 $2 $3",["1(?:6[023]|7)"],"0$1"],["(\\d{4})(\\d{2})(\\d{7})","$1 $2 $3",["15[279]"],"0$1"],["(\\d{3})(\\d{2})(\\d{8})","$1 $2 $3",["15"],"0$1"]],"0",0,0,0,0,0,[0,["15[0-25-9]\\d{8}|1(?:6[023]|7\\d)\\d{7,8}",[10,11]]]],DJ:["253","00","(?:2\\d|77)\\d{6}",[8],[["(\\d{2})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",["[27]"]]],0,0,0,0,0,0,[0,["77\\d{6}"]]],DK:["45","00","[2-9]\\d{7}",[8],[["(\\d{2})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",["[2-9]"]]],0,0,0,0,0,0,[0,["(?:[2-7]\\d|8[126-9]|9[1-46-9])\\d{6}"]]],DM:["1","011","(?:[58]\\d\\d|767|900)\\d{7}",[10],0,"1",0,"1|([2-7]\\d{6})$","767$1",0,"767",[0,["767(?:2(?:[2-4689]5|7[5-7])|31[5-7]|61[1-8]|70[1-6])\\d{4}"]]],DO:["1","011","(?:[58]\\d\\d|900)\\d{7}",[10],0,"1",0,0,0,0,"8001|8[024]9",[0,["8[024]9[2-9]\\d{6}"]]],DZ:["213","00","(?:[1-4]|[5-79]\\d|80)\\d{7}",[8,9],[["(\\d{2})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",["[1-4]"],"0$1"],["(\\d{2})(\\d{3})(\\d{2})(\\d{2})","$1 $2 $3 $4",["9"],"0$1"],["(\\d{3})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",["[5-8]"],"0$1"]],"0",0,0,0,0,0,[0,["(?:5(?:4[0-29]|5\\d|6[0-2])|6(?:[569]\\d|7[0-6])|7[7-9]\\d)\\d{6}",[9]]]],EC:["593","00","1\\d{9,10}|(?:[2-7]|9\\d)\\d{7}",[8,9,10,11],[["(\\d)(\\d{3})(\\d{4})","$1 $2-$3",["[2-7]"],"(0$1)",0,"$1-$2-$3"],["(\\d{2})(\\d{3})(\\d{4})","$1 $2 $3",["9"],"0$1"],["(\\d{4})(\\d{3})(\\d{3,4})","$1 $2 $3",["1"]]],"0",0,0,0,0,0,[0,["964[0-2]\\d{5}|9(?:39|[57][89]|6[0-36-9]|[89]\\d)\\d{6}",[9]]]],EE:["372","00","8\\d{9}|[4578]\\d{7}|(?:[3-8]\\d|90)\\d{5}",[7,8,10],[["(\\d{3})(\\d{4})","$1 $2",["[369]|4[3-8]|5(?:[0-2]|5[0-478]|6[45])|7[1-9]|88","[369]|4[3-8]|5(?:[02]|1(?:[0-8]|95)|5[0-478]|6(?:4[0-4]|5[1-589]))|7[1-9]|88"]],["(\\d{4})(\\d{3,4})","$1 $2",["[45]|8(?:00|[1-49])","[45]|8(?:00[1-9]|[1-49])"]],["(\\d{2})(\\d{2})(\\d{4})","$1 $2 $3",["7"]],["(\\d{4})(\\d{3})(\\d{3})","$1 $2 $3",["8"]]],0,0,0,0,0,0,[0,["(?:5\\d{5}|8(?:1(?:0(?:000|[3-9]\\d\\d)|(?:1(?:0[236]|1\\d)|(?:23|[3-79]\\d)\\d)\\d)|2(?:0(?:000|(?:19|[2-7]\\d)\\d)|(?:(?:[124-6]\\d|3[5-9])\\d|7(?:[3679]\\d|8[13-9])|8(?:[2-6]\\d|7[01]))\\d)|[349]\\d{4}))\\d\\d|5(?:(?:[02]\\d|5[0-478])\\d|1(?:[0-8]\\d|95)|6(?:4[0-4]|5[1-589]))\\d{3}",[7,8]]]],EG:["20","00","[189]\\d{8,9}|[24-6]\\d{8}|[135]\\d{7}",[8,9,10],[["(\\d)(\\d{7,8})","$1 $2",["[23]"],"0$1"],["(\\d{2})(\\d{6,7})","$1 $2",["1[35]|[4-6]|8[2468]|9[235-7]"],"0$1"],["(\\d{3})(\\d{3})(\\d{4})","$1 $2 $3",["[189]"],"0$1"]],"0",0,0,0,0,0,[0,["1[0-25]\\d{8}",[10]]]],EH:["212","00","[5-8]\\d{8}",[9],0,"0",0,0,0,0,"528[89]",[0,["(?:6(?:[0-79]\\d|8[0-247-9])|7(?:[017]\\d|2[0-2]|6[0-8]|8[0-3]))\\d{6}"]]],ER:["291","00","[178]\\d{6}",[7],[["(\\d)(\\d{3})(\\d{3})","$1 $2 $3",["[178]"],"0$1"]],"0",0,0,0,0,0,[0,["(?:17[1-3]|7\\d\\d)\\d{4}"]]],ES:["34","00","[5-9]\\d{8}",[9],[["(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3",["[89]00"]],["(\\d{3})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",["[5-9]"]]],0,0,0,0,0,0,[0,["(?:590[16]00\\d|9(?:6906(?:09|10)|7390\\d\\d))\\d\\d|(?:6\\d|7[1-48])\\d{7}"]]],ET:["251","00","(?:11|[2-579]\\d)\\d{7}",[9],[["(\\d{2})(\\d{3})(\\d{4})","$1 $2 $3",["[1-579]"],"0$1"]],"0",0,0,0,0,0,[0,["7001\\d{5}|(?:7(?:0[1-9]|1[01]|77|86|99)|9\\d\\d)\\d{6}"]]],FI:["358","00|99(?:[01469]|5(?:[14]1|3[23]|5[59]|77|88|9[09]))","[1-35689]\\d{4}|7\\d{10,11}|(?:[124-7]\\d|3[0-46-9])\\d{8}|[1-9]\\d{5,8}",[5,6,7,8,9,10,11,12],[["(\\d)(\\d{4,9})","$1 $2",["[2568][1-8]|3(?:0[1-9]|[1-9])|9"],"0$1"],["(\\d{3})(\\d{3,7})","$1 $2",["[12]00|[368]|70[07-9]"],"0$1"],["(\\d{2})(\\d{4,8})","$1 $2",["[1245]|7[135]"],"0$1"],["(\\d{2})(\\d{6,10})","$1 $2",["7"],"0$1"]],"0",0,0,0,0,"1[03-79]|[2-9]",[0,["4946\\d{2,6}|(?:4[0-8]|50)\\d{4,8}",[6,7,8,9,10]]],"00"],FJ:["679","0(?:0|52)","45\\d{5}|(?:0800\\d|[235-9])\\d{6}",[7,11],[["(\\d{3})(\\d{4})","$1 $2",["[235-9]|45"]],["(\\d{4})(\\d{3})(\\d{4})","$1 $2 $3",["0"]]],0,0,0,0,0,0,[0,["(?:[279]\\d|45|5[01568]|8[034679])\\d{5}",[7]]],"00"],FK:["500","00","[2-7]\\d{4}",[5],0,0,0,0,0,0,0,[0,["[56]\\d{4}"]]],FM:["691","00","(?:[39]\\d\\d|820)\\d{4}",[7],[["(\\d{3})(\\d{4})","$1 $2",["[389]"]]],0,0,0,0,0,0,[0,["31(?:00[67]|208|309)\\d\\d|(?:3(?:[2357]0[1-9]|602|804|905)|(?:820|9[2-7]\\d)\\d)\\d{3}"]]],FO:["298","00","[2-9]\\d{5}",[6],[["(\\d{6})","$1",["[2-9]"]]],0,0,"(10(?:01|[12]0|88))",0,0,0,[0,["(?:[27][1-9]|5\\d|9[16])\\d{4}"]]],FR:["33","00","[1-9]\\d{8}",[9],[["(\\d{3})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",["8"],"0 $1"],["(\\d)(\\d{2})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4 $5",["[1-79]"],"0$1"]],"0",0,0,0,0,0,[0,["(?:6(?:[0-24-8]\\d|3[0-8]|9[589])|7(?:00|[3-9]\\d))\\d{6}"]]],GA:["241","00","(?:[067]\\d|11)\\d{6}|[2-7]\\d{6}",[7,8],[["(\\d)(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",["[2-7]"],"0$1"],["(\\d{2})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",["0"]],["(\\d{2})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",["11|[67]"],"0$1"]],0,0,"0(11\\d{6}|60\\d{6}|61\\d{6}|6[256]\\d{6}|7[467]\\d{6})","$1",0,0,[0,["(?:(?:0[2-7]|7[467])\\d|6(?:0[0-4]|10|[256]\\d))\\d{5}|[2-7]\\d{6}"]]],GB:["44","00","[1-357-9]\\d{9}|[18]\\d{8}|8\\d{6}",[7,9,10],[["(\\d{3})(\\d{4})","$1 $2",["800","8001","80011","800111","8001111"],"0$1"],["(\\d{3})(\\d{2})(\\d{2})","$1 $2 $3",["845","8454","84546","845464"],"0$1"],["(\\d{3})(\\d{6})","$1 $2",["800"],"0$1"],["(\\d{5})(\\d{4,5})","$1 $2",["1(?:38|5[23]|69|76|94)","1(?:(?:38|69)7|5(?:24|39)|768|946)","1(?:3873|5(?:242|39[4-6])|(?:697|768)[347]|9467)"],"0$1"],["(\\d{4})(\\d{5,6})","$1 $2",["1(?:[2-69][02-9]|[78])"],"0$1"],["(\\d{2})(\\d{4})(\\d{4})","$1 $2 $3",["[25]|7(?:0|6[02-9])","[25]|7(?:0|6(?:[03-9]|2[356]))"],"0$1"],["(\\d{4})(\\d{6})","$1 $2",["7"],"0$1"],["(\\d{3})(\\d{3})(\\d{4})","$1 $2 $3",["[1389]"],"0$1"]],"0",0,0,0,0,0,[0,["7(?:457[0-57-9]|700[01]|911[028])\\d{5}|7(?:[1-3]\\d\\d|4(?:[0-46-9]\\d|5[0-689])|5(?:0[0-8]|[13-9]\\d|2[0-35-9])|7(?:0[1-9]|[1-7]\\d|8[02-9]|9[0-689])|8(?:[014-9]\\d|[23][0-8])|9(?:[024-9]\\d|1[02-9]|3[0-689]))\\d{6}",[10]]],0," x"],GD:["1","011","(?:473|[58]\\d\\d|900)\\d{7}",[10],0,"1",0,"1|([2-9]\\d{6})$","473$1",0,"473",[0,["473(?:4(?:0[2-79]|1[04-9]|2[0-5]|58)|5(?:2[01]|3[3-8])|901)\\d{4}"]]],GE:["995","00","(?:[3-57]\\d\\d|800)\\d{6}",[9],[["(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3",["70"],"0$1"],["(\\d{2})(\\d{3})(\\d{2})(\\d{2})","$1 $2 $3 $4",["32"],"0$1"],["(\\d{3})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",["[57]"]],["(\\d{3})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",["[348]"],"0$1"]],"0",0,0,0,0,0,[0,["5(?:(?:0555|1(?:[17]77|555))[5-9]|757(?:7[7-9]|8[01]))\\d{3}|5(?:0070|11(?:33|51)|[25]222|3333)[0-4]\\d{3}|5(?:00(?:0\\d|5[05])|11(?:00|[124]\\d|3[01])|5200|75(?:00|[57]5)|8(?:0(?:[01]\\d|2[0-4])|58[89]|8(?:55|88)))\\d{4}|(?:5(?:[14]4|5[0157-9]|68|7[0147-9]|9[1-35-9])|790)\\d{6}"]]],GF:["594","00","(?:[56]94|80\\d|976)\\d{6}",[9],[["(\\d{3})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",["[569]"],"0$1"],["(\\d{3})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",["8"],"0$1"]],"0",0,0,0,0,0,[0,["694(?:[0-249]\\d|3[0-8])\\d{4}"]]],GG:["44","00","(?:1481|[357-9]\\d{3})\\d{6}|8\\d{6}(?:\\d{2})?",[7,9,10],0,"0",0,"0|([25-9]\\d{5})$","1481$1",0,0,[0,["7(?:(?:781|839)\\d|911[17])\\d{5}",[10]]]],GH:["233","00","(?:[235]\\d{3}|800)\\d{5}",[8,9],[["(\\d{3})(\\d{5})","$1 $2",["8"],"0$1"],["(\\d{2})(\\d{3})(\\d{4})","$1 $2 $3",["[235]"],"0$1"]],"0",0,0,0,0,0,[0,["(?:2(?:[0346-9]\\d|5[67])|5(?:[03-7]\\d|9[1-9]))\\d{6}",[9]]]],GI:["350","00","(?:[25]\\d\\d|606)\\d{5}",[8],[["(\\d{3})(\\d{5})","$1 $2",["2"]]],0,0,0,0,0,0,[0,["525(?:0\\d|1[0-4])\\d{3}|(?:5[146-8]\\d|606)\\d{5}"]]],GL:["299","00","(?:19|[2-689]\\d|70)\\d{4}",[6],[["(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3",["19|[2-9]"]]],0,0,0,0,0,0,[0,["[245]\\d{5}"]]],GM:["220","00","[2-9]\\d{6}",[7],[["(\\d{3})(\\d{4})","$1 $2",["[2-9]"]]],0,0,0,0,0,0,[0,["(?:[23679]\\d|5[0-389])\\d{5}"]]],GN:["224","00","722\\d{6}|(?:3|6\\d)\\d{7}",[8,9],[["(\\d{2})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",["3"]],["(\\d{3})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",["[67]"]]],0,0,0,0,0,0,[0,["6[0-356]\\d{7}",[9]]]],GP:["590","00","(?:590|(?:69|80)\\d|976)\\d{6}",[9],[["(\\d{3})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",["[569]"],"0$1"],["(\\d{3})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",["8"],"0$1"]],"0",0,0,0,0,0,[0,["69(?:0\\d\\d|1(?:2[2-9]|3[0-5]))\\d{4}"]]],GQ:["240","00","222\\d{6}|(?:3\\d|55|[89]0)\\d{7}",[9],[["(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3",["[235]"]],["(\\d{3})(\\d{6})","$1 $2",["[89]"]]],0,0,0,0,0,0,[0,["(?:222|55\\d)\\d{6}"]]],GR:["30","00","5005000\\d{3}|8\\d{9,11}|(?:[269]\\d|70)\\d{8}",[10,11,12],[["(\\d{2})(\\d{4})(\\d{4})","$1 $2 $3",["21|7"]],["(\\d{4})(\\d{6})","$1 $2",["2(?:2|3[2-57-9]|4[2-469]|5[2-59]|6[2-9]|7[2-69]|8[2-49])|5"]],["(\\d{3})(\\d{3})(\\d{4})","$1 $2 $3",["[2689]"]],["(\\d{3})(\\d{3,4})(\\d{5})","$1 $2 $3",["8"]]],0,0,0,0,0,0,[0,["68[57-9]\\d{7}|(?:69|94)\\d{8}",[10]]]],GT:["502","00","(?:1\\d{3}|[2-7])\\d{7}",[8,11],[["(\\d{4})(\\d{4})","$1 $2",["[2-7]"]],["(\\d{4})(\\d{3})(\\d{4})","$1 $2 $3",["1"]]],0,0,0,0,0,0,[0,["[3-5]\\d{7}",[8]]]],GU:["1","011","(?:[58]\\d\\d|671|900)\\d{7}",[10],0,"1",0,"1|([3-9]\\d{6})$","671$1",0,"671",[0,["671(?:3(?:00|3[39]|4[349]|55|6[26])|4(?:00|56|7[1-9]|8[02-46-9])|5(?:55|6[2-5]|88)|6(?:3[2-578]|4[24-9]|5[34]|78|8[235-9])|7(?:[0479]7|2[0167]|3[45]|8[7-9])|8(?:[2-57-9]8|6[48])|9(?:2[29]|6[79]|7[1279]|8[7-9]|9[78]))\\d{4}"]]],GW:["245","00","[49]\\d{8}|4\\d{6}",[7,9],[["(\\d{3})(\\d{4})","$1 $2",["40"]],["(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3",["[49]"]]],0,0,0,0,0,0,[0,["9(?:5\\d|6[569]|77)\\d{6}",[9]]]],GY:["592","001","9008\\d{3}|(?:[2-467]\\d\\d|862)\\d{4}",[7],[["(\\d{3})(\\d{4})","$1 $2",["[2-46-9]"]]],0,0,0,0,0,0,[0,["(?:6\\d\\d|70[0-35-7])\\d{4}"]]],HK:["852","00(?:30|5[09]|[126-9]?)","8[0-46-9]\\d{6,7}|9\\d{4,7}|(?:[2-7]|9\\d{3})\\d{7}",[5,6,7,8,9,11],[["(\\d{3})(\\d{2,5})","$1 $2",["900","9003"]],["(\\d{4})(\\d{4})","$1 $2",["[2-7]|8[1-4]|9(?:0[1-9]|[1-8])"]],["(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3",["8"]],["(\\d{3})(\\d{2})(\\d{3})(\\d{3})","$1 $2 $3 $4",["9"]]],0,0,0,0,0,0,[0,["(?:4(?:44[5-9]|6(?:0[0-7]|1[0-6]|4[0-57-9]|6[0-4]|7[0-8]))|573[0-6]|6(?:26[013-8]|66[0-3])|70(?:7[1-5]|8[0-4])|848[015-9]|9(?:29[013-9]|59[0-4]))\\d{4}|(?:4(?:4[01]|6[2358])|5(?:[1-59][0-46-9]|6[0-4689]|7[0-246-9])|6(?:0[1-9]|[13-59]\\d|[268][0-57-9]|7[0-79])|84[09]|9(?:0[1-9]|1[02-9]|[2358][0-8]|[467]\\d))\\d{5}",[8]]],"00"],HN:["504","00","8\\d{10}|[237-9]\\d{7}",[8,11],[["(\\d{4})(\\d{4})","$1-$2",["[237-9]"]]],0,0,0,0,0,0,[0,["[37-9]\\d{7}",[8]]]],HR:["385","00","(?:[24-69]\\d|3[0-79])\\d{7}|80\\d{5,7}|[1-79]\\d{7}|6\\d{5,6}",[6,7,8,9],[["(\\d{2})(\\d{2})(\\d{2,3})","$1 $2 $3",["6[01]"],"0$1"],["(\\d{3})(\\d{2})(\\d{2,3})","$1 $2 $3",["8"],"0$1"],["(\\d)(\\d{4})(\\d{3})","$1 $2 $3",["1"],"0$1"],["(\\d{2})(\\d{3})(\\d{3,4})","$1 $2 $3",["[67]"],"0$1"],["(\\d{2})(\\d{3})(\\d{3,4})","$1 $2 $3",["9"],"0$1"],["(\\d{2})(\\d{3})(\\d{3,4})","$1 $2 $3",["[2-5]"],"0$1"],["(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3",["8"],"0$1"]],"0",0,0,0,0,0,[0,["98\\d{6,7}|975(?:1\\d|77|9[67])\\d{4}|9(?:0[1-9]|[1259]\\d|7[0679])\\d{6}",[8,9]]]],HT:["509","00","(?:[2-489]\\d|55)\\d{6}",[8],[["(\\d{2})(\\d{2})(\\d{4})","$1 $2 $3",["[2-589]"]]],0,0,0,0,0,0,[0,["(?:[34]\\d|55)\\d{6}"]]],HU:["36","00","[235-7]\\d{8}|[1-9]\\d{7}",[8,9],[["(\\d)(\\d{3})(\\d{4})","$1 $2 $3",["1"],"(06 $1)"],["(\\d{2})(\\d{3})(\\d{3})","$1 $2 $3",["[27][2-9]|3[2-7]|4[24-9]|5[2-79]|6|8[2-57-9]|9[2-69]"],"(06 $1)"],["(\\d{2})(\\d{3})(\\d{3,4})","$1 $2 $3",["[2-9]"],"06 $1"]],"06",0,0,0,0,0,[0,["(?:[257]0|3[01])\\d{7}",[9]]]],ID:["62","00[89]","(?:(?:00[1-9]|8\\d)\\d{4}|[1-36])\\d{6}|00\\d{10}|[1-9]\\d{8,10}|[2-9]\\d{7}",[7,8,9,10,11,12,13],[["(\\d)(\\d{3})(\\d{3})","$1 $2 $3",["15"]],["(\\d{2})(\\d{5,9})","$1 $2",["2[124]|[36]1"],"(0$1)"],["(\\d{3})(\\d{5,7})","$1 $2",["800"],"0$1"],["(\\d{3})(\\d{5,8})","$1 $2",["[2-79]"],"(0$1)"],["(\\d{3})(\\d{3,4})(\\d{3})","$1-$2-$3",["8[1-35-9]"],"0$1"],["(\\d{3})(\\d{6,8})","$1 $2",["1"],"0$1"],["(\\d{3})(\\d{3})(\\d{4})","$1 $2 $3",["804"],"0$1"],["(\\d{3})(\\d)(\\d{3})(\\d{3})","$1 $2 $3 $4",["80"],"0$1"],["(\\d{3})(\\d{4})(\\d{4,5})","$1-$2-$3",["8"],"0$1"]],"0",0,0,0,0,0,[0,["8[1-35-9]\\d{7,10}",[9,10,11,12]]]],IE:["353","00","(?:1\\d|[2569])\\d{6,8}|4\\d{6,9}|7\\d{8}|8\\d{8,9}",[7,8,9,10],[["(\\d{2})(\\d{5})","$1 $2",["2[24-9]|47|58|6[237-9]|9[35-9]"],"(0$1)"],["(\\d{3})(\\d{5})","$1 $2",["[45]0"],"(0$1)"],["(\\d)(\\d{3,4})(\\d{4})","$1 $2 $3",["1"],"(0$1)"],["(\\d{2})(\\d{3})(\\d{3,4})","$1 $2 $3",["[2569]|4[1-69]|7[14]"],"(0$1)"],["(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3",["70"],"0$1"],["(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3",["81"],"(0$1)"],["(\\d{2})(\\d{3})(\\d{4})","$1 $2 $3",["[78]"],"0$1"],["(\\d{4})(\\d{3})(\\d{3})","$1 $2 $3",["1"]],["(\\d{2})(\\d{4})(\\d{4})","$1 $2 $3",["4"],"(0$1)"],["(\\d{2})(\\d)(\\d{3})(\\d{4})","$1 $2 $3 $4",["8"],"0$1"]],"0",0,0,0,0,0,[0,["8(?:22|[35-9]\\d)\\d{6}",[9]]]],IL:["972","0(?:0|1[2-9])","1\\d{6}(?:\\d{3,5})?|[57]\\d{8}|[1-489]\\d{7}",[7,8,9,10,11,12],[["(\\d{4})(\\d{3})","$1-$2",["125"]],["(\\d{4})(\\d{2})(\\d{2})","$1-$2-$3",["121"]],["(\\d)(\\d{3})(\\d{4})","$1-$2-$3",["[2-489]"],"0$1"],["(\\d{2})(\\d{3})(\\d{4})","$1-$2-$3",["[57]"],"0$1"],["(\\d{4})(\\d{3})(\\d{3})","$1-$2-$3",["12"]],["(\\d{4})(\\d{6})","$1-$2",["159"]],["(\\d)(\\d{3})(\\d{3})(\\d{3})","$1-$2-$3-$4",["1[7-9]"]],["(\\d{3})(\\d{1,2})(\\d{3})(\\d{4})","$1-$2 $3-$4",["15"]]],"0",0,0,0,0,0,[0,["5(?:(?:[02368]\\d|[19][2-9]|4[1-9])\\d|5(?:01|1[79]|2[2-9]|3[0-3]|4[34]|5[015689]|6[6-8]|7[0-267]|8[7-9]|9[1-9]))\\d{5}",[9]]]],IM:["44","00","1624\\d{6}|(?:[3578]\\d|90)\\d{8}",[10],0,"0",0,"0|([25-8]\\d{5})$","1624$1",0,"74576|(?:16|7[56])24",[0,["76245[06]\\d{4}|7(?:4576|[59]24\\d|624[0-4689])\\d{5}"]]],IN:["91","00","(?:000800|[2-9]\\d\\d)\\d{7}|1\\d{7,12}",[8,9,10,11,12,13],[["(\\d{8})","$1",["5(?:0|2[23]|3[03]|[67]1|88)","5(?:0|2(?:21|3)|3(?:0|3[23])|616|717|888)","5(?:0|2(?:21|3)|3(?:0|3[23])|616|717|8888)"],0,1],["(\\d{4})(\\d{4,5})","$1 $2",["180","1800"],0,1],["(\\d{3})(\\d{3})(\\d{4})","$1 $2 $3",["140"],0,1],["(\\d{2})(\\d{4})(\\d{4})","$1 $2 $3",["11|2[02]|33|4[04]|79[1-7]|80[2-46]","11|2[02]|33|4[04]|79(?:[1-6]|7[19])|80(?:[2-4]|6[0-589])","11|2[02]|33|4[04]|79(?:[124-6]|3(?:[02-9]|1[0-24-9])|7(?:1|9[1-6]))|80(?:[2-4]|6[0-589])"],"0$1",1],["(\\d{3})(\\d{3})(\\d{4})","$1 $2 $3",["1(?:2[0-249]|3[0-25]|4[145]|[68]|7[1257])|2(?:1[257]|3[013]|4[01]|5[0137]|6[0158]|78|8[1568])|3(?:26|4[1-3]|5[34]|6[01489]|7[02-46]|8[159])|4(?:1[36]|2[1-47]|5[12]|6[0-26-9]|7[0-24-9]|8[013-57]|9[014-7])|5(?:1[025]|22|[36][25]|4[28]|5[12]|[78]1)|6(?:12|[2-4]1|5[17]|6[13]|80)|7(?:12|3[134]|4[47]|61|88)|8(?:16|2[014]|3[126]|6[136]|7[078]|8[34]|91)|(?:43|59|75)[15]|(?:1[59]|29|67|72)[14]","1(?:2[0-24]|3[0-25]|4[145]|[59][14]|6[1-9]|7[1257]|8[1-57-9])|2(?:1[257]|3[013]|4[01]|5[0137]|6[058]|78|8[1568]|9[14])|3(?:26|4[1-3]|5[34]|6[01489]|7[02-46]|8[159])|4(?:1[36]|2[1-47]|3[15]|5[12]|6[0-26-9]|7[0-24-9]|8[013-57]|9[014-7])|5(?:1[025]|22|[36][25]|4[28]|[578]1|9[15])|674|7(?:(?:2[14]|3[34]|5[15])[2-6]|61[346]|88[0-8])|8(?:70[2-6]|84[235-7]|91[3-7])|(?:1(?:29|60|8[06])|261|552|6(?:12|[2-47]1|5[17]|6[13]|80)|7(?:12|31|4[47])|8(?:16|2[014]|3[126]|6[136]|7[78]|83))[2-7]","1(?:2[0-24]|3[0-25]|4[145]|[59][14]|6[1-9]|7[1257]|8[1-57-9])|2(?:1[257]|3[013]|4[01]|5[0137]|6[058]|78|8[1568]|9[14])|3(?:26|4[1-3]|5[34]|6[01489]|7[02-46]|8[159])|4(?:1[36]|2[1-47]|3[15]|5[12]|6[0-26-9]|7[0-24-9]|8[013-57]|9[014-7])|5(?:1[025]|22|[36][25]|4[28]|[578]1|9[15])|6(?:12(?:[2-6]|7[0-8])|74[2-7])|7(?:(?:2[14]|5[15])[2-6]|3171|61[346]|88(?:[2-7]|82))|8(?:70[2-6]|84(?:[2356]|7[19])|91(?:[3-6]|7[19]))|73[134][2-6]|(?:74[47]|8(?:16|2[014]|3[126]|6[136]|7[78]|83))(?:[2-6]|7[19])|(?:1(?:29|60|8[06])|261|552|6(?:[2-4]1|5[17]|6[13]|7(?:1|4[0189])|80)|7(?:12|88[01]))[2-7]"],"0$1",1],["(\\d{4})(\\d{3})(\\d{3})","$1 $2 $3",["1(?:[2-479]|5[0235-9])|[2-5]|6(?:1[1358]|2[2457-9]|3[2-5]|4[235-7]|5[2-689]|6[24578]|7[235689]|8[1-6])|7(?:1[013-9]|28|3[129]|4[1-35689]|5[29]|6[02-5]|70)|807","1(?:[2-479]|5[0235-9])|[2-5]|6(?:1[1358]|2(?:[2457]|84|95)|3(?:[2-4]|55)|4[235-7]|5[2-689]|6[24578]|7[235689]|8[1-6])|7(?:1(?:[013-8]|9[6-9])|28[6-8]|3(?:17|2[0-49]|9[2-57])|4(?:1[2-4]|[29][0-7]|3[0-8]|[56]|8[0-24-7])|5(?:2[1-3]|9[0-6])|6(?:0[5689]|2[5-9]|3[02-8]|4|5[0-367])|70[13-7])|807[19]","1(?:[2-479]|5(?:[0236-9]|5[013-9]))|[2-5]|6(?:2(?:84|95)|355|83)|73179|807(?:1|9[1-3])|(?:1552|6(?:1[1358]|2[2457]|3[2-4]|4[235-7]|5[2-689]|6[24578]|7[235689]|8[124-6])\\d|7(?:1(?:[013-8]\\d|9[6-9])|28[6-8]|3(?:2[0-49]|9[2-57])|4(?:1[2-4]|[29][0-7]|3[0-8]|[56]\\d|8[0-24-7])|5(?:2[1-3]|9[0-6])|6(?:0[5689]|2[5-9]|3[02-8]|4\\d|5[0-367])|70[13-7]))[2-7]"],"0$1",1],["(\\d{5})(\\d{5})","$1 $2",["[6-9]"],"0$1",1],["(\\d{4})(\\d{2,4})(\\d{4})","$1 $2 $3",["1(?:6|8[06])","1(?:6|8[06]0)"],0,1],["(\\d{4})(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3 $4",["18"],0,1]],"0",0,0,0,0,0,[0,["(?:61279|7(?:887[02-9]|9(?:313|79[07-9]))|8(?:079[04-9]|(?:84|91)7[02-8]))\\d{5}|(?:6(?:12|[2-47]1|5[17]|6[13]|80)[0189]|7(?:1(?:2[0189]|9[0-5])|2(?:[14][017-9]|8[0-59])|3(?:2[5-8]|[34][017-9]|9[016-9])|4(?:1[015-9]|[29][89]|39|8[389])|5(?:[15][017-9]|2[04-9]|9[7-9])|6(?:0[0-47]|1[0-257-9]|2[0-4]|3[19]|5[4589])|70[0289]|88[089]|97[02-8])|8(?:0(?:6[67]|7[02-8])|70[017-9]|84[01489]|91[0-289]))\\d{6}|(?:7(?:31|4[47])|8(?:16|2[014]|3[126]|6[136]|7[78]|83))(?:[0189]\\d|7[02-8])\\d{5}|(?:6(?:[09]\\d|1[04679]|2[03689]|3[05-9]|4[0489]|50|6[069]|7[07]|8[7-9])|7(?:0\\d|2[0235-79]|3[05-8]|40|5[0346-8]|6[6-9]|7[1-9]|8[0-79]|9[089])|8(?:0[01589]|1[0-57-9]|2[235-9]|3[03-57-9]|[45]\\d|6[02457-9]|7[1-69]|8[0-25-9]|9[02-9])|9\\d\\d)\\d{7}|(?:6(?:(?:1[1358]|2[2457]|3[2-4]|4[235-7]|5[2-689]|6[24578]|8[124-6])\\d|7(?:[235689]\\d|4[0189]))|7(?:1(?:[013-8]\\d|9[6-9])|28[6-8]|3(?:2[0-49]|9[2-5])|4(?:1[2-4]|[29][0-7]|3[0-8]|[56]\\d|8[0-24-7])|5(?:2[1-3]|9[0-6])|6(?:0[5689]|2[5-9]|3[02-8]|4\\d|5[0-367])|70[13-7]|881))[0189]\\d{5}",[10]]]],IO:["246","00","3\\d{6}",[7],[["(\\d{3})(\\d{4})","$1 $2",["3"]]],0,0,0,0,0,0,[0,["38\\d{5}"]]],IQ:["964","00","(?:1|7\\d\\d)\\d{7}|[2-6]\\d{7,8}",[8,9,10],[["(\\d)(\\d{3})(\\d{4})","$1 $2 $3",["1"],"0$1"],["(\\d{2})(\\d{3})(\\d{3,4})","$1 $2 $3",["[2-6]"],"0$1"],["(\\d{3})(\\d{3})(\\d{4})","$1 $2 $3",["7"],"0$1"]],"0",0,0,0,0,0,[0,["7[3-9]\\d{8}",[10]]]],IR:["98","00","[1-9]\\d{9}|(?:[1-8]\\d\\d|9)\\d{3,4}",[4,5,6,7,10],[["(\\d{4,5})","$1",["96"],"0$1"],["(\\d{2})(\\d{4,5})","$1 $2",["(?:1[137]|2[13-68]|3[1458]|4[145]|5[1468]|6[16]|7[1467]|8[13467])[12689]"],"0$1"],["(\\d{3})(\\d{3})(\\d{3,4})","$1 $2 $3",["9"],"0$1"],["(\\d{2})(\\d{4})(\\d{4})","$1 $2 $3",["[1-8]"],"0$1"]],"0",0,0,0,0,0,[0,["9(?:(?:0(?:[0-35]\\d|4[4-6])|(?:[13]\\d|2[0-3])\\d)\\d|9(?:[0-46]\\d\\d|5[15]0|8(?:1\\d|88)|9(?:0[0-3]|[19]\\d|21|77|8[7-9])))\\d{5}",[10]]]],IS:["354","00|1(?:0(?:01|[12]0)|100)","(?:38\\d|[4-9])\\d{6}",[7,9],[["(\\d{3})(\\d{4})","$1 $2",["[4-9]"]],["(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3",["3"]]],0,0,0,0,0,0,[0,["(?:38[589]\\d\\d|6(?:1[1-8]|2[0-6]|3[026-9]|4[014679]|5[0159]|6[0-69]|70|8[06-8]|9\\d)|7(?:5[057]|[6-9]\\d)|8(?:2[0-59]|[3-69]\\d|8[238]))\\d{4}"]],"00"],IT:["39","00","0\\d{5,10}|1\\d{8,10}|3(?:[0-8]\\d{7,10}|9\\d{7,8})|(?:55|70)\\d{8}|8\\d{5}(?:\\d{2,4})?",[6,7,8,9,10,11],[["(\\d{2})(\\d{4,6})","$1 $2",["0[26]"]],["(\\d{3})(\\d{3,6})","$1 $2",["0[13-57-9][0159]|8(?:03|4[17]|9[2-5])","0[13-57-9][0159]|8(?:03|4[17]|9(?:2|3[04]|[45][0-4]))"]],["(\\d{4})(\\d{2,6})","$1 $2",["0(?:[13-579][2-46-8]|8[236-8])"]],["(\\d{4})(\\d{4})","$1 $2",["894"]],["(\\d{2})(\\d{3,4})(\\d{4})","$1 $2 $3",["0[26]|5"]],["(\\d{3})(\\d{3})(\\d{3,4})","$1 $2 $3",["1(?:44|[679])|[378]"]],["(\\d{3})(\\d{3,4})(\\d{4})","$1 $2 $3",["0[13-57-9][0159]|14"]],["(\\d{2})(\\d{4})(\\d{5})","$1 $2 $3",["0[26]"]],["(\\d{4})(\\d{3})(\\d{4})","$1 $2 $3",["0"]],["(\\d{3})(\\d{4})(\\d{4,5})","$1 $2 $3",["3"]]],0,0,0,0,0,0,[0,["3[1-9]\\d{8}|3[2-9]\\d{7}",[9,10]]]],JE:["44","00","1534\\d{6}|(?:[3578]\\d|90)\\d{8}",[10],0,"0",0,"0|([0-24-8]\\d{5})$","1534$1",0,0,[0,["7(?:(?:(?:50|82)9|937)\\d|7(?:00[378]|97[7-9]))\\d{5}"]]],JM:["1","011","(?:[58]\\d\\d|658|900)\\d{7}",[10],0,"1",0,0,0,0,"658|876",[0,["(?:658295|876(?:2(?:0[1-9]|[13-9]\\d|2[013-9])|[348]\\d\\d|5(?:0[1-9]|[1-9]\\d)|6(?:4[89]|6[67])|7(?:0[07]|7\\d|8[1-47-9]|9[0-36-9])|9(?:[01]9|9[0579])))\\d{4}"]]],JO:["962","00","(?:(?:[2689]|7\\d)\\d|32|53)\\d{6}",[8,9],[["(\\d)(\\d{3})(\\d{4})","$1 $2 $3",["[2356]|87"],"(0$1)"],["(\\d{3})(\\d{5,6})","$1 $2",["[89]"],"0$1"],["(\\d{2})(\\d{7})","$1 $2",["70"],"0$1"],["(\\d)(\\d{4})(\\d{4})","$1 $2 $3",["7"],"0$1"]],"0",0,0,0,0,0,[0,["7(?:[78][0-25-9]|9\\d)\\d{6}",[9]]]],JP:["81","010","00[1-9]\\d{6,14}|[257-9]\\d{9}|(?:00|[1-9]\\d\\d)\\d{6}",[8,9,10,11,12,13,14,15,16,17],[["(\\d{3})(\\d{3})(\\d{3})","$1-$2-$3",["(?:12|57|99)0"],"0$1"],["(\\d{4})(\\d)(\\d{4})","$1-$2-$3",["1(?:26|3[79]|4[56]|5[4-68]|6[3-5])|499|5(?:76|97)|746|8(?:3[89]|47|51|63)|9(?:80|9[16])","1(?:267|3(?:7[247]|9[278])|466|5(?:47|58|64)|6(?:3[245]|48|5[4-68]))|499[2468]|5(?:76|97)9|7468|8(?:3(?:8[7-9]|96)|477|51[2-9]|636)|9(?:802|9(?:1[23]|69))|1(?:45|58)[67]","1(?:267|3(?:7[247]|9[278])|466|5(?:47|58|64)|6(?:3[245]|48|5[4-68]))|499[2468]|5(?:769|979[2-69])|7468|8(?:3(?:8[7-9]|96[2457-9])|477|51[2-9]|636[457-9])|9(?:802|9(?:1[23]|69))|1(?:45|58)[67]"],"0$1"],["(\\d{2})(\\d{3})(\\d{4})","$1-$2-$3",["60"],"0$1"],["(\\d)(\\d{4})(\\d{4})","$1-$2-$3",["[36]|4(?:2[09]|7[01])","[36]|4(?:2(?:0|9[02-69])|7(?:0[019]|1))"],"0$1"],["(\\d{2})(\\d{3})(\\d{4})","$1-$2-$3",["1(?:1|5[45]|77|88|9[69])|2(?:2[1-37]|3[0-269]|4[59]|5|6[24]|7[1-358]|8[1369]|9[0-38])|4(?:[28][1-9]|3[0-57]|[45]|6[248]|7[2-579]|9[29])|5(?:2|3[045]|4[0-369]|5[29]|8[02389]|9[0-389])|7(?:2[02-46-9]|34|[58]|6[0249]|7[57]|9[2-6])|8(?:2[124589]|3[27-9]|49|51|6|7[0-468]|8[68]|9[019])|9(?:[23][1-9]|4[15]|5[138]|6[1-3]|7[156]|8[189]|9[1-489])","1(?:1|5(?:4[018]|5[017])|77|88|9[69])|2(?:2(?:[127]|3[014-9])|3[0-269]|4[59]|5(?:[1-3]|5[0-69]|9[19])|62|7(?:[1-35]|8[0189])|8(?:[16]|3[0134]|9[0-5])|9(?:[028]|17))|4(?:2(?:[13-79]|8[014-6])|3[0-57]|[45]|6[248]|7[2-47]|8[1-9])|5(?:2|3[045]|4[0-369]|8[02389]|9[0-3])|7(?:2[02-46-9]|34|[58]|6[0249]|7[57]|9(?:[23]|4[0-59]|5[01569]|6[0167]))|8(?:2(?:[1258]|4[0-39]|9[0-2469])|49|51|6(?:[0-24]|36|5[0-3589]|72|9[01459])|7[0-468]|8[68])|9(?:[23][1-9]|4[15]|5[138]|6[1-3]|7[156]|8[189]|9(?:[1289]|3[34]|4[0178]))|(?:49|55|83)[29]|(?:264|837)[016-9]|2(?:57|93)[015-9]|(?:25[0468]|422|838)[01]|(?:47[59]|59[89]|8(?:6[68]|9))[019]","1(?:1|5(?:4[018]|5[017])|77|88|9[69])|2(?:2[127]|3[0-269]|4[59]|5(?:[1-3]|5[0-69]|9(?:17|99))|6(?:2|4[016-9])|7(?:[1-35]|8[0189])|8(?:[16]|3[0134]|9[0-5])|9(?:[028]|17))|4(?:2(?:[13-79]|8[014-6])|3[0-57]|[45]|6[248]|7[2-47]|9[29])|5(?:2|3[045]|4[0-369]|5[29]|8[02389]|9[0-3])|7(?:2[02-46-9]|34|[58]|6[0249]|7[57]|9(?:[23]|4[0-59]|5[01569]|6[0167]))|8(?:2(?:[1258]|4[0-39]|9[0169])|3(?:[29]|7(?:[017-9]|6[6-8]))|49|51|6(?:[0-24]|36[23]|5(?:[0-389]|5[23])|6(?:[01]|9[178])|72|9[0145])|7[0-468]|8[68])|9(?:4[15]|5[138]|7[156]|8[189]|9(?:[1289]|3(?:31|4[357])|4[0178]))|(?:8294|96)[1-3]|2(?:57|93)[015-9]|(?:223|8699)[014-9]|(?:25[0468]|422|838)[01]|(?:48|8292|9[23])[1-9]|(?:47[59]|59[89]|8(?:68|9))[019]","1(?:1|5(?:4[018]|5[017])|77|88|9[69])|2(?:2[127]|3[0-269]|4[59]|5(?:[1-3]|5[0-69]|7[015-9]|9(?:17|99))|6(?:2|4[016-9])|7(?:[1-35]|8[0189])|8(?:[16]|3[0134]|9[0-5])|9(?:[028]|17|3[015-9]))|4(?:2(?:[13-79]|8[014-6])|3[0-57]|[45]|6[248]|7[2-47]|9[29])|5(?:2|3[045]|4[0-369]|5[29]|8[02389]|9[0-3])|7(?:2[02-46-9]|34|[58]|6[0249]|7[57]|9(?:[23]|4[0-59]|5[01569]|6[0167]))|8(?:2(?:[1258]|4[0-39]|9(?:[019]|4[1-3]|6(?:[0-47-9]|5[01346-9])))|3(?:[29]|7(?:[017-9]|6[6-8]))|49|51|6(?:[0-24]|36[23]|5(?:[0-389]|5[23])|6(?:[01]|9[178])|72|9[0145])|7[0-468]|8[68])|9(?:4[15]|5[138]|6[1-3]|7[156]|8[189]|9(?:[1289]|3(?:31|4[357])|4[0178]))|(?:223|8699)[014-9]|(?:25[0468]|422|838)[01]|(?:48|829(?:2|66)|9[23])[1-9]|(?:47[59]|59[89]|8(?:68|9))[019]"],"0$1"],["(\\d{3})(\\d{2})(\\d{4})","$1-$2-$3",["[14]|[289][2-9]|5[3-9]|7[2-4679]"],"0$1"],["(\\d{3})(\\d{3})(\\d{4})","$1-$2-$3",["800"],"0$1"],["(\\d{2})(\\d{4})(\\d{4})","$1-$2-$3",["[257-9]"],"0$1"]],"0",0,0,0,0,0,[0,["[7-9]0[1-9]\\d{7}",[10]]]],KE:["254","000","(?:[17]\\d\\d|900)\\d{6}|(?:2|80)0\\d{6,7}|[4-6]\\d{6,8}",[7,8,9,10],[["(\\d{2})(\\d{5,7})","$1 $2",["[24-6]"],"0$1"],["(\\d{3})(\\d{6})","$1 $2",["[17]"],"0$1"],["(\\d{3})(\\d{3})(\\d{3,4})","$1 $2 $3",["[89]"],"0$1"]],"0",0,0,0,0,0,[0,["(?:1(?:0[0-6]|1[0-5]|2[014]|30)|7\\d\\d)\\d{6}",[9]]]],KG:["996","00","8\\d{9}|(?:[235-8]\\d|99)\\d{7}",[9,10],[["(\\d{4})(\\d{5})","$1 $2",["3(?:1[346]|[24-79])"],"0$1"],["(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3",["[235-79]|88"],"0$1"],["(\\d{3})(\\d{3})(\\d)(\\d{2,3})","$1 $2 $3 $4",["8"],"0$1"]],"0",0,0,0,0,0,[0,["312(?:58\\d|973)\\d{3}|(?:2(?:0[0-35]|2\\d)|5[0-24-7]\\d|600|7(?:[07]\\d|55)|88[08]|99[05-9])\\d{6}",[9]]]],KH:["855","00[14-9]","1\\d{9}|[1-9]\\d{7,8}",[8,9,10],[["(\\d{2})(\\d{3})(\\d{3,4})","$1 $2 $3",["[1-9]"],"0$1"],["(\\d{4})(\\d{3})(\\d{3})","$1 $2 $3",["1"]]],"0",0,0,0,0,0,[0,["(?:(?:1[28]|3[18]|9[67])\\d|6[016-9]|7(?:[07-9]|[16]\\d)|8(?:[013-79]|8\\d))\\d{6}|(?:1\\d|9[0-57-9])\\d{6}|(?:2[3-6]|3[2-6]|4[2-4]|[5-7][2-5])48\\d{5}",[8,9]]]],KI:["686","00","(?:[37]\\d|6[0-79])\\d{6}|(?:[2-48]\\d|50)\\d{3}",[5,8],0,"0",0,0,0,0,0,[0,["(?:63\\d{3}|73(?:0[0-5]\\d|140))\\d{3}|[67]200[01]\\d{3}",[8]]]],KM:["269","00","[3478]\\d{6}",[7],[["(\\d{3})(\\d{2})(\\d{2})","$1 $2 $3",["[3478]"]]],0,0,0,0,0,0,[0,["[34]\\d{6}"]]],KN:["1","011","(?:[58]\\d\\d|900)\\d{7}",[10],0,"1",0,"1|([2-7]\\d{6})$","869$1",0,"869",[0,["869(?:48[89]|55[6-8]|66\\d|76[02-7])\\d{4}"]]],KP:["850","00|99","85\\d{6}|(?:19\\d|[2-7])\\d{7}",[8,10],[["(\\d{2})(\\d{3})(\\d{3})","$1 $2 $3",["8"],"0$1"],["(\\d)(\\d{3})(\\d{4})","$1 $2 $3",["[2-7]"],"0$1"],["(\\d{3})(\\d{3})(\\d{4})","$1 $2 $3",["1"],"0$1"]],"0",0,0,0,0,0,[0,["19[1-3]\\d{7}",[10]]]],KR:["82","00(?:[125689]|3(?:[46]5|91)|7(?:00|27|3|55|6[126]))","00[1-9]\\d{8,11}|(?:[12]|5\\d{3})\\d{7}|[13-6]\\d{9}|(?:[1-6]\\d|80)\\d{7}|[3-6]\\d{4,5}|(?:00|7)0\\d{8}",[5,6,8,9,10,11,12,13,14],[["(\\d{2})(\\d{3,4})","$1-$2",["(?:3[1-3]|[46][1-4]|5[1-5])1"],"0$1"],["(\\d{4})(\\d{4})","$1-$2",["1"]],["(\\d)(\\d{3,4})(\\d{4})","$1-$2-$3",["2"],"0$1"],["(\\d{2})(\\d{3})(\\d{4})","$1-$2-$3",["60|8"],"0$1"],["(\\d{2})(\\d{3,4})(\\d{4})","$1-$2-$3",["[1346]|5[1-5]"],"0$1"],["(\\d{2})(\\d{4})(\\d{4})","$1-$2-$3",["[57]"],"0$1"],["(\\d{2})(\\d{5})(\\d{4})","$1-$2-$3",["5"],"0$1"]],"0",0,"0(8(?:[1-46-8]|5\\d\\d))?",0,0,0,[0,["1(?:05(?:[0-8]\\d|9[0-6])|22[13]\\d)\\d{4,5}|1(?:0[1-46-9]|[16-9]\\d|2[013-9])\\d{6,7}",[9,10]]]],KW:["965","00","18\\d{5}|(?:[2569]\\d|41)\\d{6}",[7,8],[["(\\d{4})(\\d{3,4})","$1 $2",["[169]|2(?:[235]|4[1-35-9])|52"]],["(\\d{3})(\\d{5})","$1 $2",["[245]"]]],0,0,0,0,0,0,[0,["(?:41\\d\\d|5(?:(?:[05]\\d|1[0-7]|6[56])\\d|2(?:22|5[25])|7(?:55|77)|88[58])|6(?:(?:0[034679]|5[015-9]|6\\d)\\d|1(?:00|11|66)|222|3[36]3|444|7(?:0[013-9]|[67]\\d)|888|9(?:[069]\\d|3[039]))|9(?:(?:0[09]|22|[4679]\\d|8[057-9])\\d|1(?:1[01]|99)|3(?:00|33)|5(?:00|5\\d)))\\d{4}",[8]]]],KY:["1","011","(?:345|[58]\\d\\d|900)\\d{7}",[10],0,"1",0,"1|([2-9]\\d{6})$","345$1",0,"345",[0,["345(?:32[1-9]|42[0-4]|5(?:1[67]|2[5-79]|4[6-9]|50|76)|649|82[56]|9(?:1[679]|2[2-9]|3[06-9]|90))\\d{4}"]]],KZ:["7","810","(?:33622|8\\d{8})\\d{5}|[78]\\d{9}",[10,14],0,"8",0,0,0,0,"33|7",[0,["7(?:0[0-25-8]|47|6[0-4]|7[15-8]|85)\\d{7}",[10]]],"8~10"],LA:["856","00","[23]\\d{9}|3\\d{8}|(?:[235-8]\\d|41)\\d{6}",[8,9,10],[["(\\d{2})(\\d{3})(\\d{3})","$1 $2 $3",["2[13]|3[14]|[4-8]"],"0$1"],["(\\d{2})(\\d{2})(\\d{2})(\\d{3})","$1 $2 $3 $4",["30[013-9]"],"0$1"],["(\\d{2})(\\d{2})(\\d{3})(\\d{3})","$1 $2 $3 $4",["[23]"],"0$1"]],"0",0,0,0,0,0,[0,["(?:20(?:[239]\\d|5[24-9]|7[6-8]|88)|302\\d)\\d{6}",[10]]]],LB:["961","00","[27-9]\\d{7}|[13-9]\\d{6}",[7,8],[["(\\d)(\\d{3})(\\d{3})","$1 $2 $3",["[13-69]|7(?:[2-57]|62|8[0-7]|9[04-9])|8[02-9]"],"0$1"],["(\\d{2})(\\d{3})(\\d{3})","$1 $2 $3",["[27-9]"]]],"0",0,0,0,0,0,[0,["793(?:[01]\\d|2[0-4])\\d{3}|(?:(?:3|81)\\d|7(?:[01]\\d|6[013-9]|8[89]|9[12]))\\d{5}"]]],LC:["1","011","(?:[58]\\d\\d|758|900)\\d{7}",[10],0,"1",0,"1|([2-8]\\d{6})$","758$1",0,"758",[0,["758(?:28[4-7]|384|4(?:6[01]|8[4-9])|5(?:1[89]|20|84)|7(?:1[2-9]|2\\d|3[0-3])|812)\\d{4}"]]],LI:["423","00","[68]\\d{8}|(?:[2378]\\d|90)\\d{5}",[7,9],[["(\\d{3})(\\d{2})(\\d{2})","$1 $2 $3",["[2379]|8(?:0[09]|7)","[2379]|8(?:0(?:02|9)|7)"]],["(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3",["8"]],["(\\d{2})(\\d{3})(\\d{4})","$1 $2 $3",["69"]],["(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3",["6"]]],"0",0,"0|(1001)",0,0,0,[0,["(?:6(?:(?:4[5-9]|5[0-4])\\d|6(?:[0245]\\d|[17]0|3[7-9]))\\d|7(?:[37-9]\\d|42|56))\\d{4}"]]],LK:["94","00","[1-9]\\d{8}",[9],[["(\\d{2})(\\d{3})(\\d{4})","$1 $2 $3",["7"],"0$1"],["(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3",["[1-689]"],"0$1"]],"0",0,0,0,0,0,[0,["7(?:[0-25-8]\\d|4[0-4])\\d{6}"]]],LR:["231","00","(?:[25]\\d|33|77|88)\\d{7}|(?:2\\d|[4-6])\\d{6}",[7,8,9],[["(\\d)(\\d{3})(\\d{3})","$1 $2 $3",["[4-6]"],"0$1"],["(\\d{2})(\\d{3})(\\d{3})","$1 $2 $3",["2"],"0$1"],["(\\d{2})(\\d{3})(\\d{4})","$1 $2 $3",["[23578]"],"0$1"]],"0",0,0,0,0,0,[0,["(?:(?:(?:22|33)0|555|(?:77|88)\\d)\\d|4[67])\\d{5}|[56]\\d{6}",[7,9]]]],LS:["266","00","(?:[256]\\d\\d|800)\\d{5}",[8],[["(\\d{4})(\\d{4})","$1 $2",["[2568]"]]],0,0,0,0,0,0,[0,["[56]\\d{7}"]]],LT:["370","00","(?:[3469]\\d|52|[78]0)\\d{6}",[8],[["(\\d)(\\d{3})(\\d{4})","$1 $2 $3",["52[0-7]"],"(8-$1)",1],["(\\d{3})(\\d{2})(\\d{3})","$1 $2 $3",["[7-9]"],"8 $1",1],["(\\d{2})(\\d{6})","$1 $2",["37|4(?:[15]|6[1-8])"],"(8-$1)",1],["(\\d{3})(\\d{5})","$1 $2",["[3-6]"],"(8-$1)",1]],"8",0,"[08]",0,0,0,[0,["6\\d{7}"]]],LU:["352","00","35[013-9]\\d{4,8}|6\\d{8}|35\\d{2,4}|(?:[2457-9]\\d|3[0-46-9])\\d{2,9}",[4,5,6,7,8,9,10,11],[["(\\d{2})(\\d{3})","$1 $2",["2(?:0[2-689]|[2-9])|[3-57]|8(?:0[2-9]|[13-9])|9(?:0[89]|[2-579])"]],["(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3",["2(?:0[2-689]|[2-9])|[3-57]|8(?:0[2-9]|[13-9])|9(?:0[89]|[2-579])"]],["(\\d{2})(\\d{2})(\\d{3})","$1 $2 $3",["20[2-689]"]],["(\\d{2})(\\d{2})(\\d{2})(\\d{1,2})","$1 $2 $3 $4",["2(?:[0367]|4[3-8])"]],["(\\d{3})(\\d{2})(\\d{3})","$1 $2 $3",["80[01]|90[015]"]],["(\\d{2})(\\d{2})(\\d{2})(\\d{3})","$1 $2 $3 $4",["20"]],["(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3",["6"]],["(\\d{2})(\\d{2})(\\d{2})(\\d{2})(\\d{1,2})","$1 $2 $3 $4 $5",["2(?:[0367]|4[3-8])"]],["(\\d{2})(\\d{2})(\\d{2})(\\d{1,5})","$1 $2 $3 $4",["[3-57]|8[13-9]|9(?:0[89]|[2-579])|(?:2|80)[2-9]"]]],0,0,"(15(?:0[06]|1[12]|[35]5|4[04]|6[26]|77|88|99)\\d)",0,0,0,[0,["6(?:[269][18]|5[1568]|7[189]|81)\\d{6}",[9]]]],LV:["371","00","(?:[268]\\d|90)\\d{6}",[8],[["(\\d{2})(\\d{3})(\\d{3})","$1 $2 $3",["[269]|8[01]"]]],0,0,0,0,0,0,[0,["23(?:23[0-57-9]|33[0238])\\d{3}|2(?:[0-24-9]\\d\\d|3(?:0[07]|[14-9]\\d|2[024-9]|3[0-24-9]))\\d{4}"]]],LY:["218","00","[2-9]\\d{8}",[9],[["(\\d{2})(\\d{7})","$1-$2",["[2-9]"],"0$1"]],"0",0,0,0,0,0,[0,["9[1-6]\\d{7}"]]],MA:["212","00","[5-8]\\d{8}",[9],[["(\\d{5})(\\d{4})","$1-$2",["5(?:29|38)","5(?:29[1289]|389)","529(?:1[1-46-9]|2[013-8]|90)|5(?:298|389)[0-46-9]"],"0$1"],["(\\d{3})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",["5[45]"],"0$1"],["(\\d{4})(\\d{5})","$1-$2",["5(?:2[2-489]|3[5-9]|9)|892","5(?:2(?:[2-49]|8[235-9])|3[5-9]|9)|892"],"0$1"],["(\\d{2})(\\d{7})","$1-$2",["8"],"0$1"],["(\\d{3})(\\d{6})","$1-$2",["[5-7]"],"0$1"]],"0",0,0,0,0,0,[0,["(?:6(?:[0-79]\\d|8[0-247-9])|7(?:[017]\\d|2[0-2]|6[0-8]|8[0-3]))\\d{6}"]]],MC:["377","00","(?:[3489]|6\\d)\\d{7}",[8,9],[["(\\d{2})(\\d{3})(\\d{3})","$1 $2 $3",["4"],"0$1"],["(\\d{2})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",["[389]"]],["(\\d)(\\d{2})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4 $5",["6"],"0$1"]],"0",0,0,0,0,0,[0,["4(?:[46]\\d|5[1-9])\\d{5}|(?:3|6\\d)\\d{7}"]]],MD:["373","00","(?:[235-7]\\d|[89]0)\\d{6}",[8],[["(\\d{3})(\\d{5})","$1 $2",["[89]"],"0$1"],["(\\d{2})(\\d{3})(\\d{3})","$1 $2 $3",["22|3"],"0$1"],["(\\d{3})(\\d{2})(\\d{3})","$1 $2 $3",["[25-7]"],"0$1"]],"0",0,0,0,0,0,[0,["562\\d{5}|(?:6\\d|7[16-9])\\d{6}"]]],ME:["382","00","(?:20|[3-79]\\d)\\d{6}|80\\d{6,7}",[8,9],[["(\\d{2})(\\d{3})(\\d{3,4})","$1 $2 $3",["[2-9]"],"0$1"]],"0",0,0,0,0,0,[0,["6(?:[07-9]\\d|3[024]|6[0-25])\\d{5}",[8]]]],MF:["590","00","(?:590|(?:69|80)\\d|976)\\d{6}",[9],0,"0",0,0,0,0,0,[0,["69(?:0\\d\\d|1(?:2[2-9]|3[0-5]))\\d{4}"]]],MG:["261","00","[23]\\d{8}",[9],[["(\\d{2})(\\d{2})(\\d{3})(\\d{2})","$1 $2 $3 $4",["[23]"],"0$1"]],"0",0,"0|([24-9]\\d{6})$","20$1",0,0,[0,["3[2-47-9]\\d{7}"]]],MH:["692","011","329\\d{4}|(?:[256]\\d|45)\\d{5}",[7],[["(\\d{3})(\\d{4})","$1-$2",["[2-6]"]]],"1",0,0,0,0,0,[0,["(?:(?:23|54)5|329|45[356])\\d{4}"]]],MK:["389","00","[2-578]\\d{7}",[8],[["(\\d)(\\d{3})(\\d{4})","$1 $2 $3",["2|34[47]|4(?:[37]7|5[47]|64)"],"0$1"],["(\\d{2})(\\d{3})(\\d{3})","$1 $2 $3",["[347]"],"0$1"],["(\\d{3})(\\d)(\\d{2})(\\d{2})","$1 $2 $3 $4",["[58]"],"0$1"]],"0",0,0,0,0,0,[0,["7(?:3555|(?:474|9[019]7)7)\\d{3}|7(?:[0-25-8]\\d\\d|3(?:[1-48]\\d|7[01578])|4(?:2\\d|60|7[01578])|9(?:[2-4]\\d|7[015]))\\d{4}"]]],ML:["223","00","[24-9]\\d{7}",[8],[["(\\d{2})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",["[24-9]"]]],0,0,0,0,0,0,[0,["2(?:0(?:01|79)|17\\d)\\d{4}|(?:5[01]|[679]\\d|8[2-49])\\d{6}"]]],MM:["95","00","1\\d{5,7}|95\\d{6}|(?:[4-7]|9[0-46-9])\\d{6,8}|(?:2|8\\d)\\d{5,8}",[6,7,8,9,10],[["(\\d)(\\d{2})(\\d{3})","$1 $2 $3",["16|2"],"0$1"],["(\\d{2})(\\d{2})(\\d{3})","$1 $2 $3",["[45]|6(?:0[23]|[1-689]|7[235-7])|7(?:[0-4]|5[2-7])|8[1-6]"],"0$1"],["(\\d)(\\d{3})(\\d{3,4})","$1 $2 $3",["[12]"],"0$1"],["(\\d{2})(\\d{3})(\\d{3,4})","$1 $2 $3",["[4-7]|8[1-35]"],"0$1"],["(\\d)(\\d{3})(\\d{4,6})","$1 $2 $3",["9(?:2[0-4]|[35-9]|4[137-9])"],"0$1"],["(\\d)(\\d{4})(\\d{4})","$1 $2 $3",["2"],"0$1"],["(\\d{3})(\\d{3})(\\d{4})","$1 $2 $3",["8"],"0$1"],["(\\d)(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3 $4",["92"],"0$1"],["(\\d)(\\d{5})(\\d{4})","$1 $2 $3",["9"],"0$1"]],"0",0,0,0,0,0,[0,["(?:17[01]|9(?:2(?:[0-4]|[56]\\d\\d)|(?:3(?:[0-36]|4\\d)|(?:6\\d|9[4-8])\\d|7(?:3|40|[5-9]\\d)|8(?:78|[89]\\d))\\d|4(?:(?:[0245]\\d|[1379])\\d|88)|5[0-6])\\d)\\d{4}|9[69]1\\d{6}|9(?:[68]\\d|9[089])\\d{5}",[7,8,9,10]]]],MN:["976","001","[12]\\d{7,9}|[5-9]\\d{7}",[8,9,10],[["(\\d{2})(\\d{2})(\\d{4})","$1 $2 $3",["[12]1"],"0$1"],["(\\d{4})(\\d{4})","$1 $2",["[5-9]"]],["(\\d{3})(\\d{5,6})","$1 $2",["[12]2[1-3]"],"0$1"],["(\\d{4})(\\d{5,6})","$1 $2",["[12](?:27|3[2-8]|4[2-68]|5[1-4689])","[12](?:27|3[2-8]|4[2-68]|5[1-4689])[0-3]"],"0$1"],["(\\d{5})(\\d{4,5})","$1 $2",["[12]"],"0$1"]],"0",0,0,0,0,0,[0,["(?:83[01]|920)\\d{5}|(?:5[05]|6[06]|8[015689]|9[013-9])\\d{6}",[8]]]],MO:["853","00","0800\\d{3}|(?:28|[68]\\d)\\d{6}",[7,8],[["(\\d{4})(\\d{3})","$1 $2",["0"]],["(\\d{4})(\\d{4})","$1 $2",["[268]"]]],0,0,0,0,0,0,[0,["6800[0-79]\\d{3}|6(?:[235]\\d\\d|6(?:0[0-5]|[1-9]\\d)|8(?:0[1-9]|[14-8]\\d|2[5-9]|[39][0-4]))\\d{4}",[8]]]],MP:["1","011","[58]\\d{9}|(?:67|90)0\\d{7}",[10],0,"1",0,"1|([2-9]\\d{6})$","670$1",0,"670",[0,["670(?:2(?:3[3-7]|56|8[4-8])|32[1-38]|4(?:33|8[348])|5(?:32|55|88)|6(?:64|70|82)|78[3589]|8[3-9]8|989)\\d{4}"]]],MQ:["596","00","(?:69|80)\\d{7}|(?:59|97)6\\d{6}",[9],[["(\\d{3})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",["[569]"],"0$1"],["(\\d{3})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",["8"],"0$1"]],"0",0,0,0,0,0,[0,["69(?:6(?:[0-46-9]\\d|5[0-6])|727)\\d{4}"]]],MR:["222","00","(?:[2-4]\\d\\d|800)\\d{5}",[8],[["(\\d{2})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",["[2-48]"]]],0,0,0,0,0,0,[0,["[2-4][0-46-9]\\d{6}"]]],MS:["1","011","(?:[58]\\d\\d|664|900)\\d{7}",[10],0,"1",0,"1|([34]\\d{6})$","664$1",0,"664",[0,["664(?:3(?:49|9[1-6])|49[2-6])\\d{4}"]]],MT:["356","00","3550\\d{4}|(?:[2579]\\d\\d|800)\\d{5}",[8],[["(\\d{4})(\\d{4})","$1 $2",["[2357-9]"]]],0,0,0,0,0,0,[0,["(?:7(?:210|[79]\\d\\d)|9(?:[29]\\d\\d|69[67]|8(?:1[1-3]|89|97)))\\d{4}"]]],MU:["230","0(?:0|[24-7]0|3[03])","(?:[57]|8\\d\\d)\\d{7}|[2-468]\\d{6}",[7,8,10],[["(\\d{3})(\\d{4})","$1 $2",["[2-46]|8[013]"]],["(\\d{4})(\\d{4})","$1 $2",["[57]"]],["(\\d{5})(\\d{5})","$1 $2",["8"]]],0,0,0,0,0,0,[0,["5(?:4(?:2[1-389]|7[1-9])|87[15-8])\\d{4}|(?:5(?:2[5-9]|4[3-689]|[57]\\d|8[0-689]|9[0-8])|7(?:01|30))\\d{5}",[8]]],"020"],MV:["960","0(?:0|19)","(?:800|9[0-57-9]\\d)\\d{7}|[34679]\\d{6}",[7,10],[["(\\d{3})(\\d{4})","$1-$2",["[3467]|9[1-9]"]],["(\\d{3})(\\d{3})(\\d{4})","$1 $2 $3",["[89]"]]],0,0,0,0,0,0,[0,["46[46]\\d{4}|(?:7\\d|9[1-9])\\d{5}",[7]]],"00"],MW:["265","00","(?:[1289]\\d|31|77)\\d{7}|1\\d{6}",[7,9],[["(\\d)(\\d{3})(\\d{3})","$1 $2 $3",["1[2-9]"],"0$1"],["(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3",["2"],"0$1"],["(\\d{3})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",["[137-9]"],"0$1"]],"0",0,0,0,0,0,[0,["111\\d{6}|(?:31|77|[89][89])\\d{7}",[9]]]],MX:["52","0[09]","1(?:(?:[27]2|44|99)[1-9]|65[0-689])\\d{7}|(?:1(?:[01]\\d|2[13-9]|[35][1-9]|4[0-35-9]|6[0-46-9]|7[013-9]|8[1-79]|9[1-8])|[2-9]\\d)\\d{8}",[10,11],[["(\\d{2})(\\d{4})(\\d{4})","$1 $2 $3",["33|5[56]|81"],0,1],["(\\d{3})(\\d{3})(\\d{4})","$1 $2 $3",["[2-9]"],0,1],["(\\d)(\\d{2})(\\d{4})(\\d{4})","$2 $3 $4",["1(?:33|5[56]|81)"],0,1],["(\\d)(\\d{3})(\\d{3})(\\d{4})","$2 $3 $4",["1"],0,1]],"01",0,"0(?:[12]|4[45])|1",0,0,0,[0,["657[12]\\d{6}|(?:1(?:2(?:2[1-9]|3[1-35-8]|4[13-9]|7[1-689]|8[1-578]|9[467])|3(?:1[1-79]|[2458][1-9]|3\\d|7[1-8]|9[1-5])|4(?:1[1-57-9]|[24-7][1-9]|3[1-8]|8[1-35-9]|9[2-689])|5(?:[56]\\d|88|9[1-79])|6(?:1[2-68]|[2-4][1-9]|5[1-3689]|6[1-57-9]|7[1-7]|8[67]|9[4-8])|7(?:[1-467][1-9]|5[13-9]|8[1-69]|9[17])|8(?:1\\d|2[13-689]|3[1-6]|4[124-6]|6[1246-9]|7[1-378]|9[12479])|9(?:1[346-9]|2[1-4]|3[2-46-8]|5[1348]|[69][1-9]|7[12]|8[1-8]))|2(?:2\\d|3[1-35-8]|4[13-9]|7[1-689]|8[1-578]|9[467])|3(?:1[1-79]|[2458][1-9]|3\\d|7[1-8]|9[1-5])|4(?:1[1-57-9]|[25-7][1-9]|3[1-8]|4\\d|8[1-35-9]|9[2-689])|5(?:[56]\\d|88|9[1-79])|6(?:1[2-68]|[2-4][1-9]|5[1-3689]|6[1-57-9]|7[1-7]|8[67]|9[4-8])|7(?:[13467][1-9]|2\\d|5[13-9]|8[1-69]|9[17])|8(?:1\\d|2[13-689]|3[1-6]|4[124-6]|6[1246-9]|7[1-378]|9[12479])|9(?:1[346-9]|2[1-4]|3[2-46-8]|5[1348]|6[1-9]|7[12]|8[1-8]|9\\d))\\d{7}"]],"00"],MY:["60","00","1\\d{8,9}|(?:3\\d|[4-9])\\d{7}",[8,9,10],[["(\\d)(\\d{3})(\\d{4})","$1-$2 $3",["[4-79]"],"0$1"],["(\\d{2})(\\d{3})(\\d{3,4})","$1-$2 $3",["1(?:[02469]|[378][1-9]|53)|8","1(?:[02469]|[37][1-9]|53|8(?:[1-46-9]|5[7-9]))|8"],"0$1"],["(\\d)(\\d{4})(\\d{4})","$1-$2 $3",["3"],"0$1"],["(\\d)(\\d{3})(\\d{2})(\\d{4})","$1-$2-$3-$4",["1(?:[367]|80)"]],["(\\d{3})(\\d{3})(\\d{4})","$1-$2 $3",["15"],"0$1"],["(\\d{2})(\\d{4})(\\d{4})","$1-$2 $3",["1"],"0$1"]],"0",0,0,0,0,0,[0,["1(?:1888[689]|4400|8(?:47|8[27])[0-4])\\d{4}|1(?:0(?:[23568]\\d|4[0-6]|7[016-9]|9[0-8])|1(?:[1-5]\\d\\d|6(?:0[5-9]|[1-9]\\d)|7(?:[0134]\\d|2[1-9]|5[0-6]))|(?:[269]\\d|[37][1-9]|4[235-9])\\d|5(?:31|9\\d\\d)|8(?:1[23]|[236]\\d|4[06]|5(?:46|[7-9])|7[016-9]|8[01]|9[0-8]))\\d{5}",[9,10]]]],MZ:["258","00","(?:2|8\\d)\\d{7}",[8,9],[["(\\d{2})(\\d{3})(\\d{3,4})","$1 $2 $3",["2|8[2-79]"]],["(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3",["8"]]],0,0,0,0,0,0,[0,["8[2-79]\\d{7}",[9]]]],NA:["264","00","[68]\\d{7,8}",[8,9],[["(\\d{2})(\\d{3})(\\d{3})","$1 $2 $3",["88"],"0$1"],["(\\d{2})(\\d{3})(\\d{3,4})","$1 $2 $3",["6"],"0$1"],["(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3",["87"],"0$1"],["(\\d{2})(\\d{3})(\\d{4})","$1 $2 $3",["8"],"0$1"]],"0",0,0,0,0,0,[0,["(?:60|8[1245])\\d{7}",[9]]]],NC:["687","00","(?:050|[2-57-9]\\d\\d)\\d{3}",[6],[["(\\d{2})(\\d{2})(\\d{2})","$1.$2.$3",["[02-57-9]"]]],0,0,0,0,0,0,[0,["(?:5[0-4]|[79]\\d|8[0-79])\\d{4}"]]],NE:["227","00","[027-9]\\d{7}",[8],[["(\\d{2})(\\d{3})(\\d{3})","$1 $2 $3",["08"]],["(\\d{2})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",["[089]|2[013]|7[04]"]]],0,0,0,0,0,0,[0,["(?:23|7[04]|[89]\\d)\\d{6}"]]],NF:["672","00","[13]\\d{5}",[6],[["(\\d{2})(\\d{4})","$1 $2",["1[0-3]"]],["(\\d)(\\d{5})","$1 $2",["[13]"]]],0,0,"([0-258]\\d{4})$","3$1",0,0,[0,["(?:14|3[58])\\d{4}"]]],NG:["234","009","(?:[124-7]|9\\d{3})\\d{6}|[1-9]\\d{7}|[78]\\d{9,13}",[7,8,10,11,12,13,14],[["(\\d{2})(\\d{2})(\\d{3})","$1 $2 $3",["78"],"0$1"],["(\\d)(\\d{3})(\\d{3,4})","$1 $2 $3",["[12]|9(?:0[3-9]|[1-9])"],"0$1"],["(\\d{2})(\\d{3})(\\d{2,3})","$1 $2 $3",["[3-7]|8[2-9]"],"0$1"],["(\\d{3})(\\d{3})(\\d{3,4})","$1 $2 $3",["[7-9]"],"0$1"],["(\\d{3})(\\d{4})(\\d{4,5})","$1 $2 $3",["[78]"],"0$1"],["(\\d{3})(\\d{5})(\\d{5,6})","$1 $2 $3",["[78]"],"0$1"]],"0",0,0,0,0,0,[0,["(?:702[0-24-9]|819[01])\\d{6}|(?:70[13-689]|8(?:0[1-9]|1[0-8])|9(?:0[1-9]|1[1-356]))\\d{7}",[10]]]],NI:["505","00","(?:1800|[25-8]\\d{3})\\d{4}",[8],[["(\\d{4})(\\d{4})","$1 $2",["[125-8]"]]],0,0,0,0,0,0,[0,["(?:5(?:5[0-7]|[78]\\d)|6(?:20|3[035]|4[045]|5[05]|77|8[1-9]|9[059])|(?:7[5-8]|8\\d)\\d)\\d{5}"]]],NL:["31","00","(?:[124-7]\\d\\d|3(?:[02-9]\\d|1[0-8]))\\d{6}|8\\d{6,9}|9\\d{6,10}|1\\d{4,5}",[5,6,7,8,9,10,11],[["(\\d{3})(\\d{4,7})","$1 $2",["[89]0"],"0$1"],["(\\d{2})(\\d{7})","$1 $2",["66"],"0$1"],["(\\d)(\\d{8})","$1 $2",["6"],"0$1"],["(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3",["1[16-8]|2[259]|3[124]|4[17-9]|5[124679]"],"0$1"],["(\\d{2})(\\d{3})(\\d{4})","$1 $2 $3",["[1-578]|91"],"0$1"],["(\\d{3})(\\d{3})(\\d{5})","$1 $2 $3",["9"],"0$1"]],"0",0,0,0,0,0,[0,["(?:6[1-58]|970\\d)\\d{7}",[9,11]]]],NO:["47","00","(?:0|[2-9]\\d{3})\\d{4}",[5,8],[["(\\d{3})(\\d{2})(\\d{3})","$1 $2 $3",["[489]|59"]],["(\\d{2})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",["[235-7]"]]],0,0,0,0,0,"[02-689]|7[0-8]",[0,["(?:4[015-8]|59|9\\d)\\d{6}",[8]]]],NP:["977","00","(?:1\\d|9)\\d{9}|[1-9]\\d{7}",[8,10,11],[["(\\d)(\\d{7})","$1-$2",["1[2-6]"],"0$1"],["(\\d{2})(\\d{6})","$1-$2",["1[01]|[2-8]|9(?:[1-59]|[67][2-6])"],"0$1"],["(\\d{3})(\\d{7})","$1-$2",["9"]]],"0",0,0,0,0,0,[0,["9(?:6[0-3]|7[024-6]|8[0-24-68])\\d{7}",[10]]]],NR:["674","00","(?:444|(?:55|8\\d)\\d|666)\\d{4}",[7],[["(\\d{3})(\\d{4})","$1 $2",["[4-68]"]]],0,0,0,0,0,0,[0,["(?:55[3-9]|666|8\\d\\d)\\d{4}"]]],NU:["683","00","(?:[47]|888\\d)\\d{3}",[4,7],[["(\\d{3})(\\d{4})","$1 $2",["8"]]],0,0,0,0,0,0,[0,["888[4-9]\\d{3}",[7]]]],NZ:["64","0(?:0|161)","[29]\\d{7,9}|50\\d{5}(?:\\d{2,3})?|6[0-35-9]\\d{6}|7\\d{7,8}|8\\d{4,9}|(?:11\\d|[34])\\d{7}",[5,6,7,8,9,10],[["(\\d{2})(\\d{3,8})","$1 $2",["8[1-579]"],"0$1"],["(\\d{3})(\\d{2})(\\d{2,3})","$1 $2 $3",["50[036-8]|[89]0","50(?:[0367]|88)|[89]0"],"0$1"],["(\\d)(\\d{3})(\\d{4})","$1 $2 $3",["24|[346]|7[2-57-9]|9[2-9]"],"0$1"],["(\\d{3})(\\d{3})(\\d{3,4})","$1 $2 $3",["2(?:10|74)|[59]|80"],"0$1"],["(\\d{2})(\\d{3,4})(\\d{4})","$1 $2 $3",["1|2[028]"],"0$1"],["(\\d{2})(\\d{3})(\\d{3,5})","$1 $2 $3",["2(?:[169]|7[0-35-9])|7|86"],"0$1"]],"0",0,0,0,0,0,[0,["2[0-27-9]\\d{7,8}|21\\d{6}",[8,9,10]]],"00"],OM:["968","00","(?:1505|[279]\\d{3}|500)\\d{4}|800\\d{5,6}",[7,8,9],[["(\\d{3})(\\d{4,6})","$1 $2",["[58]"]],["(\\d{2})(\\d{6})","$1 $2",["2"]],["(\\d{4})(\\d{4})","$1 $2",["[179]"]]],0,0,0,0,0,0,[0,["1505\\d{4}|(?:7(?:[1289]\\d|7[0-5])|9(?:0[1-9]|[1-9]\\d))\\d{5}",[8]]]],PA:["507","00","(?:00800|8\\d{3})\\d{6}|[68]\\d{7}|[1-57-9]\\d{6}",[7,8,10,11],[["(\\d{3})(\\d{4})","$1-$2",["[1-57-9]"]],["(\\d{4})(\\d{4})","$1-$2",["[68]"]],["(\\d{3})(\\d{3})(\\d{4})","$1 $2 $3",["8"]]],0,0,0,0,0,0,[0,["(?:1[16]1|21[89]|6\\d{3}|8(?:1[01]|7[23]))\\d{4}",[7,8]]]],PE:["51","00|19(?:1[124]|77|90)00","(?:[14-8]|9\\d)\\d{7}",[8,9],[["(\\d{3})(\\d{5})","$1 $2",["80"],"(0$1)"],["(\\d)(\\d{7})","$1 $2",["1"],"(0$1)"],["(\\d{2})(\\d{6})","$1 $2",["[4-8]"],"(0$1)"],["(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3",["9"]]],"0",0,0,0,0,0,[0,["9\\d{8}",[9]]],"00"," Anexo "],PF:["689","00","4\\d{5}(?:\\d{2})?|8\\d{7,8}",[6,8,9],[["(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3",["44"]],["(\\d{2})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",["4|8[7-9]"]],["(\\d{3})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",["8"]]],0,0,0,0,0,0,[0,["8[7-9]\\d{6}",[8]]]],PG:["675","00|140[1-3]","(?:180|[78]\\d{3})\\d{4}|(?:[2-589]\\d|64)\\d{5}",[7,8],[["(\\d{3})(\\d{4})","$1 $2",["18|[2-69]|85"]],["(\\d{4})(\\d{4})","$1 $2",["[78]"]]],0,0,0,0,0,0,[0,["(?:7\\d|8[128])\\d{6}",[8]]],"00"],PH:["63","00","(?:[2-7]|9\\d)\\d{8}|2\\d{5}|(?:1800|8)\\d{7,9}",[6,8,9,10,11,12,13],[["(\\d)(\\d{5})","$1 $2",["2"],"(0$1)"],["(\\d{4})(\\d{4,6})","$1 $2",["3(?:23|39|46)|4(?:2[3-6]|[35]9|4[26]|76)|544|88[245]|(?:52|64|86)2","3(?:230|397|461)|4(?:2(?:35|[46]4|51)|396|4(?:22|63)|59[347]|76[15])|5(?:221|446)|642[23]|8(?:622|8(?:[24]2|5[13]))"],"(0$1)"],["(\\d{5})(\\d{4})","$1 $2",["346|4(?:27|9[35])|883","3469|4(?:279|9(?:30|56))|8834"],"(0$1)"],["(\\d)(\\d{4})(\\d{4})","$1 $2 $3",["2"],"(0$1)"],["(\\d{2})(\\d{3})(\\d{4})","$1 $2 $3",["[3-7]|8[2-8]"],"(0$1)"],["(\\d{3})(\\d{3})(\\d{4})","$1 $2 $3",["[89]"],"0$1"],["(\\d{4})(\\d{3})(\\d{4})","$1 $2 $3",["1"]],["(\\d{4})(\\d{1,2})(\\d{3})(\\d{4})","$1 $2 $3 $4",["1"]]],"0",0,0,0,0,0,[0,["(?:8(?:1[37]|9[5-8])|9(?:0[5-9]|1[0-24-9]|[235-7]\\d|4[2-9]|8[135-9]|9[1-9]))\\d{7}",[10]]]],PK:["92","00","122\\d{6}|[24-8]\\d{10,11}|9(?:[013-9]\\d{8,10}|2(?:[01]\\d\\d|2(?:[06-8]\\d|1[01]))\\d{7})|(?:[2-8]\\d{3}|92(?:[0-7]\\d|8[1-9]))\\d{6}|[24-9]\\d{8}|[89]\\d{7}",[8,9,10,11,12],[["(\\d{3})(\\d{3})(\\d{2,7})","$1 $2 $3",["[89]0"],"0$1"],["(\\d{4})(\\d{5})","$1 $2",["1"]],["(\\d{3})(\\d{6,7})","$1 $2",["2(?:3[2358]|4[2-4]|9[2-8])|45[3479]|54[2-467]|60[468]|72[236]|8(?:2[2-689]|3[23578]|4[3478]|5[2356])|9(?:2[2-8]|3[27-9]|4[2-6]|6[3569]|9[25-8])","9(?:2[3-8]|98)|(?:2(?:3[2358]|4[2-4]|9[2-8])|45[3479]|54[2-467]|60[468]|72[236]|8(?:2[2-689]|3[23578]|4[3478]|5[2356])|9(?:22|3[27-9]|4[2-6]|6[3569]|9[25-7]))[2-9]"],"(0$1)"],["(\\d{2})(\\d{7,8})","$1 $2",["(?:2[125]|4[0-246-9]|5[1-35-7]|6[1-8]|7[14]|8[16]|91)[2-9]"],"(0$1)"],["(\\d{5})(\\d{5})","$1 $2",["58"],"(0$1)"],["(\\d{3})(\\d{7})","$1 $2",["3"],"0$1"],["(\\d{2})(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3 $4",["2[125]|4[0-246-9]|5[1-35-7]|6[1-8]|7[14]|8[16]|91"],"(0$1)"],["(\\d{3})(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3 $4",["[24-9]"],"(0$1)"]],"0",0,0,0,0,0,[0,["3(?:[0-24]\\d|3[0-7]|55|64)\\d{7}",[10]]]],PL:["48","00","(?:6|8\\d\\d)\\d{7}|[1-9]\\d{6}(?:\\d{2})?|[26]\\d{5}",[6,7,8,9,10],[["(\\d{5})","$1",["19"]],["(\\d{3})(\\d{3})","$1 $2",["11|20|64"]],["(\\d{2})(\\d{2})(\\d{3})","$1 $2 $3",["(?:1[2-8]|2[2-69]|3[2-4]|4[1-468]|5[24-689]|6[1-3578]|7[14-7]|8[1-79]|9[145])1","(?:1[2-8]|2[2-69]|3[2-4]|4[1-468]|5[24-689]|6[1-3578]|7[14-7]|8[1-79]|9[145])19"]],["(\\d{3})(\\d{2})(\\d{2,3})","$1 $2 $3",["64"]],["(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3",["21|39|45|5[0137]|6[0469]|7[02389]|8(?:0[14]|8)"]],["(\\d{2})(\\d{3})(\\d{2})(\\d{2})","$1 $2 $3 $4",["1[2-8]|[2-7]|8[1-79]|9[145]"]],["(\\d{3})(\\d{3})(\\d{3,4})","$1 $2 $3",["8"]]],0,0,0,0,0,0,[0,["21(?:1(?:[145]\\d|3[1-5])|2[0-4]\\d)\\d{4}|(?:45|5[0137]|6[069]|7[2389]|88)\\d{7}",[9]]]],PM:["508","00","(?:[45]|80\\d\\d)\\d{5}",[6,9],[["(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3",["[45]"],"0$1"],["(\\d{3})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",["8"],"0$1"]],"0",0,0,0,0,0,[0,["(?:4[02-4]|5[056])\\d{4}",[6]]]],PR:["1","011","(?:[589]\\d\\d|787)\\d{7}",[10],0,"1",0,0,0,0,"787|939",[0,["(?:787|939)[2-9]\\d{6}"]]],PS:["970","00","[2489]2\\d{6}|(?:1\\d|5)\\d{8}",[8,9,10],[["(\\d)(\\d{3})(\\d{4})","$1 $2 $3",["[2489]"],"0$1"],["(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3",["5"],"0$1"],["(\\d{4})(\\d{3})(\\d{3})","$1 $2 $3",["1"]]],"0",0,0,0,0,0,[0,["5[69]\\d{7}",[9]]]],PT:["351","00","1693\\d{5}|(?:[26-9]\\d|30)\\d{7}",[9],[["(\\d{2})(\\d{3})(\\d{4})","$1 $2 $3",["2[12]"]],["(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3",["16|[236-9]"]]],0,0,0,0,0,0,[0,["6(?:[06]92(?:30|9\\d)|[35]92(?:3[03]|9\\d))\\d{3}|(?:(?:16|6[0356])93|9(?:[1-36]\\d\\d|480))\\d{5}"]]],PW:["680","01[12]","(?:[24-8]\\d\\d|345|900)\\d{4}",[7],[["(\\d{3})(\\d{4})","$1 $2",["[2-9]"]]],0,0,0,0,0,0,[0,["(?:(?:46|83)[0-5]|6[2-4689]0)\\d{4}|(?:45|77|88)\\d{5}"]]],PY:["595","00","59\\d{4,6}|9\\d{5,10}|(?:[2-46-8]\\d|5[0-8])\\d{4,7}",[6,7,8,9,10,11],[["(\\d{3})(\\d{3,6})","$1 $2",["[2-9]0"],"0$1"],["(\\d{2})(\\d{5})","$1 $2",["[26]1|3[289]|4[1246-8]|7[1-3]|8[1-36]"],"(0$1)"],["(\\d{3})(\\d{4,5})","$1 $2",["2[279]|3[13-5]|4[359]|5|6(?:[34]|7[1-46-8])|7[46-8]|85"],"(0$1)"],["(\\d{2})(\\d{3})(\\d{3,4})","$1 $2 $3",["2[14-68]|3[26-9]|4[1246-8]|6(?:1|75)|7[1-35]|8[1-36]"],"(0$1)"],["(\\d{2})(\\d{3})(\\d{4})","$1 $2 $3",["87"]],["(\\d{3})(\\d{6})","$1 $2",["9(?:[5-79]|8[1-6])"],"0$1"],["(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3",["[2-8]"],"0$1"],["(\\d{4})(\\d{3})(\\d{4})","$1 $2 $3",["9"]]],"0",0,0,0,0,0,[0,["9(?:51|6[129]|[78][1-6]|9[1-5])\\d{6}",[9]]]],QA:["974","00","800\\d{4}|(?:2|800)\\d{6}|(?:0080|[3-7])\\d{7}",[7,8,9,11],[["(\\d{3})(\\d{4})","$1 $2",["2[16]|8"]],["(\\d{4})(\\d{4})","$1 $2",["[3-7]"]]],0,0,0,0,0,0,[0,["[35-7]\\d{7}",[8]]]],RE:["262","00","976\\d{6}|(?:26|[68]\\d)\\d{7}",[9],[["(\\d{3})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",["[2689]"],"0$1"]],"0",0,0,0,0,"26[23]|69|[89]",[0,["(?:69(?:2\\d\\d|3(?:0[0-46]|1[013]|2[0-2]|3[0-39]|4\\d|5[0-5]|6[0-6]|7[0-27]|8[0-8]|9[0-479]))|976(?:2[27]|3[0-37]|9\\d))\\d{4}"]]],RO:["40","00","(?:[2378]\\d|90)\\d{7}|[23]\\d{5}",[6,9],[["(\\d{3})(\\d{3})","$1 $2",["2[3-6]","2[3-6]\\d9"],"0$1"],["(\\d{2})(\\d{4})","$1 $2",["219|31"],"0$1"],["(\\d{2})(\\d{3})(\\d{4})","$1 $2 $3",["[23]1"],"0$1"],["(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3",["[237-9]"],"0$1"]],"0",0,0,0,0,0,[0,["7020\\d{5}|7(?:0[013-9]|1[0-3]|[2-7]\\d|8[03-8]|9[019])\\d{6}",[9]]],0," int "],RS:["381","00","38[02-9]\\d{6,9}|6\\d{7,9}|90\\d{4,8}|38\\d{5,6}|(?:7\\d\\d|800)\\d{3,9}|(?:[12]\\d|3[0-79])\\d{5,10}",[6,7,8,9,10,11,12],[["(\\d{3})(\\d{3,9})","$1 $2",["(?:2[389]|39)0|[7-9]"],"0$1"],["(\\d{2})(\\d{5,10})","$1 $2",["[1-36]"],"0$1"]],"0",0,0,0,0,0,[0,["6(?:[0-689]|7\\d)\\d{6,7}",[8,9,10]]]],RU:["7","810","8\\d{13}|[347-9]\\d{9}",[10,14],[["(\\d{4})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",["7(?:1[0-8]|2[1-9])","7(?:1(?:[0-356]2|4[29]|7|8[27])|2(?:1[23]|[2-9]2))","7(?:1(?:[0-356]2|4[29]|7|8[27])|2(?:13[03-69]|62[013-9]))|72[1-57-9]2"],"8 ($1)",1],["(\\d{5})(\\d)(\\d{2})(\\d{2})","$1 $2 $3 $4",["7(?:1[0-68]|2[1-9])","7(?:1(?:[06][3-6]|[18]|2[35]|[3-5][3-5])|2(?:[13][3-5]|[24-689]|7[457]))","7(?:1(?:0(?:[356]|4[023])|[18]|2(?:3[013-9]|5)|3[45]|43[013-79]|5(?:3[1-8]|4[1-7]|5)|6(?:3[0-35-9]|[4-6]))|2(?:1(?:3[178]|[45])|[24-689]|3[35]|7[457]))|7(?:14|23)4[0-8]|71(?:33|45)[1-79]"],"8 ($1)",1],["(\\d{3})(\\d{3})(\\d{4})","$1 $2 $3",["7"],"8 ($1)",1],["(\\d{3})(\\d{3})(\\d{2})(\\d{2})","$1 $2-$3-$4",["[349]|8(?:[02-7]|1[1-8])"],"8 ($1)",1],["(\\d{4})(\\d{4})(\\d{3})(\\d{3})","$1 $2 $3 $4",["8"],"8 ($1)"]],"8",0,0,0,0,"3[04-689]|[489]",[0,["9\\d{9}",[10]]],"8~10"],RW:["250","00","(?:06|[27]\\d\\d|[89]00)\\d{6}",[8,9],[["(\\d{2})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",["0"]],["(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3",["[7-9]"],"0$1"],["(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3",["2"]]],"0",0,0,0,0,0,[0,["7[2389]\\d{7}",[9]]]],SA:["966","00","92\\d{7}|(?:[15]|8\\d)\\d{8}",[9,10],[["(\\d{4})(\\d{5})","$1 $2",["9"]],["(\\d{2})(\\d{3})(\\d{4})","$1 $2 $3",["1"],"0$1"],["(\\d{2})(\\d{3})(\\d{4})","$1 $2 $3",["5"],"0$1"],["(\\d{3})(\\d{3})(\\d{3,4})","$1 $2 $3",["81"],"0$1"],["(\\d{3})(\\d{3})(\\d{4})","$1 $2 $3",["8"]]],"0",0,0,0,0,0,[0,["579[01]\\d{5}|5(?:[013-689]\\d|7[0-35-8])\\d{6}",[9]]]],SB:["677","0[01]","(?:[1-6]|[7-9]\\d\\d)\\d{4}",[5,7],[["(\\d{2})(\\d{5})","$1 $2",["7|8[4-9]|9(?:[1-8]|9[0-8])"]]],0,0,0,0,0,0,[0,["48\\d{3}|(?:(?:7[1-9]|8[4-9])\\d|9(?:1[2-9]|2[013-9]|3[0-2]|[46]\\d|5[0-46-9]|7[0-689]|8[0-79]|9[0-8]))\\d{4}"]]],SC:["248","010|0[0-2]","800\\d{4}|(?:[249]\\d|64)\\d{5}",[7],[["(\\d)(\\d{3})(\\d{3})","$1 $2 $3",["[246]|9[57]"]]],0,0,0,0,0,0,[0,["2[125-8]\\d{5}"]],"00"],SD:["249","00","[19]\\d{8}",[9],[["(\\d{2})(\\d{3})(\\d{4})","$1 $2 $3",["[19]"],"0$1"]],"0",0,0,0,0,0,[0,["(?:1[0-2]|9[0-3569])\\d{7}"]]],SE:["46","00","(?:[26]\\d\\d|9)\\d{9}|[1-9]\\d{8}|[1-689]\\d{7}|[1-4689]\\d{6}|2\\d{5}",[6,7,8,9,10],[["(\\d{2})(\\d{2,3})(\\d{2})","$1-$2 $3",["20"],"0$1",0,"$1 $2 $3"],["(\\d{3})(\\d{4})","$1-$2",["9(?:00|39|44|9)"],"0$1",0,"$1 $2"],["(\\d{2})(\\d{3})(\\d{2})","$1-$2 $3",["[12][136]|3[356]|4[0246]|6[03]|90[1-9]"],"0$1",0,"$1 $2 $3"],["(\\d)(\\d{2,3})(\\d{2})(\\d{2})","$1-$2 $3 $4",["8"],"0$1",0,"$1 $2 $3 $4"],["(\\d{3})(\\d{2,3})(\\d{2})","$1-$2 $3",["1[2457]|2(?:[247-9]|5[0138])|3[0247-9]|4[1357-9]|5[0-35-9]|6(?:[125689]|4[02-57]|7[0-2])|9(?:[125-8]|3[02-5]|4[0-3])"],"0$1",0,"$1 $2 $3"],["(\\d{3})(\\d{2,3})(\\d{3})","$1-$2 $3",["9(?:00|39|44)"],"0$1",0,"$1 $2 $3"],["(\\d{2})(\\d{2,3})(\\d{2})(\\d{2})","$1-$2 $3 $4",["1[13689]|2[0136]|3[1356]|4[0246]|54|6[03]|90[1-9]"],"0$1",0,"$1 $2 $3 $4"],["(\\d{2})(\\d{3})(\\d{2})(\\d{2})","$1-$2 $3 $4",["10|7"],"0$1",0,"$1 $2 $3 $4"],["(\\d)(\\d{3})(\\d{3})(\\d{2})","$1-$2 $3 $4",["8"],"0$1",0,"$1 $2 $3 $4"],["(\\d{3})(\\d{2})(\\d{2})(\\d{2})","$1-$2 $3 $4",["[13-5]|2(?:[247-9]|5[0138])|6(?:[124-689]|7[0-2])|9(?:[125-8]|3[02-5]|4[0-3])"],"0$1",0,"$1 $2 $3 $4"],["(\\d{3})(\\d{2})(\\d{2})(\\d{3})","$1-$2 $3 $4",["9"],"0$1",0,"$1 $2 $3 $4"],["(\\d{3})(\\d{2})(\\d{3})(\\d{2})(\\d{2})","$1-$2 $3 $4 $5",["[26]"],"0$1",0,"$1 $2 $3 $4 $5"]],"0",0,0,0,0,0,[0,["7[02369]\\d{7}",[9]]]],SG:["65","0[0-3]\\d","(?:(?:1\\d|8)\\d\\d|7000)\\d{7}|[3689]\\d{7}",[8,10,11],[["(\\d{4})(\\d{4})","$1 $2",["[369]|8(?:0[1-6]|[1-9])"]],["(\\d{3})(\\d{3})(\\d{4})","$1 $2 $3",["8"]],["(\\d{4})(\\d{4})(\\d{3})","$1 $2 $3",["7"]],["(\\d{4})(\\d{3})(\\d{4})","$1 $2 $3",["1"]]],0,0,0,0,0,0,[0,["8(?:06[0-6]|95[0-2])\\d{4}|(?:8(?:0[1-5]|[1-8]\\d|9[0-4])|9[0-8]\\d)\\d{5}",[8]]]],SH:["290","00","(?:[256]\\d|8)\\d{3}",[4,5],0,0,0,0,0,0,"[256]",[0,["[56]\\d{4}",[5]]]],SI:["386","00|10(?:22|66|88|99)","[1-7]\\d{7}|8\\d{4,7}|90\\d{4,6}",[5,6,7,8],[["(\\d{2})(\\d{3,6})","$1 $2",["8[09]|9"],"0$1"],["(\\d{3})(\\d{5})","$1 $2",["59|8"],"0$1"],["(\\d{2})(\\d{3})(\\d{3})","$1 $2 $3",["[37][01]|4[0139]|51|6"],"0$1"],["(\\d)(\\d{3})(\\d{2})(\\d{2})","$1 $2 $3 $4",["[1-57]"],"(0$1)"]],"0",0,0,0,0,0,[0,["65(?:1\\d|5[56]|6[01]|70)\\d{4}|(?:[37][01]|4[0139]|51|6[489])\\d{6}",[8]]],"00"],SJ:["47","00","0\\d{4}|(?:[489]\\d|[57]9)\\d{6}",[5,8],0,0,0,0,0,0,"79",[0,["(?:4[015-8]|59|9\\d)\\d{6}",[8]]]],SK:["421","00","[2-689]\\d{8}|[2-59]\\d{6}|[2-5]\\d{5}",[6,7,9],[["(\\d)(\\d{2})(\\d{3,4})","$1 $2 $3",["21"],"0$1"],["(\\d{2})(\\d{2})(\\d{2,3})","$1 $2 $3",["[3-5][1-8]1","[3-5][1-8]1[67]"],"0$1"],["(\\d)(\\d{3})(\\d{3})(\\d{2})","$1/$2 $3 $4",["2"],"0$1"],["(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3",["[689]"],"0$1"],["(\\d{2})(\\d{3})(\\d{2})(\\d{2})","$1/$2 $3 $4",["[3-5]"],"0$1"]],"0",0,0,0,0,0,[0,["909[1-9]\\d{5}|9(?:0[1-8]|1[0-24-9]|4[03-57-9]|5\\d)\\d{6}",[9]]]],SL:["232","00","(?:[237-9]\\d|66)\\d{6}",[8],[["(\\d{2})(\\d{6})","$1 $2",["[236-9]"],"(0$1)"]],"0",0,0,0,0,0,[0,["(?:25|3[0-5]|66|7[2-9]|8[08]|9[09])\\d{6}"]]],SM:["378","00","(?:0549|[5-7]\\d)\\d{6}",[8,10],[["(\\d{2})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",["[5-7]"]],["(\\d{4})(\\d{6})","$1 $2",["0"]]],0,0,"([89]\\d{5})$","0549$1",0,0,[0,["6[16]\\d{6}",[8]]]],SN:["221","00","(?:[378]\\d|93)\\d{7}",[9],[["(\\d{3})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",["8"]],["(\\d{2})(\\d{3})(\\d{2})(\\d{2})","$1 $2 $3 $4",["[379]"]]],0,0,0,0,0,0,[0,["7(?:(?:[06-8]\\d|21|90)\\d|5(?:01|[19]0|25|[38]3|[4-7]\\d))\\d{5}"]]],SO:["252","00","[346-9]\\d{8}|[12679]\\d{7}|[1-5]\\d{6}|[1348]\\d{5}",[6,7,8,9],[["(\\d{2})(\\d{4})","$1 $2",["8[125]"]],["(\\d{6})","$1",["[134]"]],["(\\d)(\\d{6})","$1 $2",["[15]|2[0-79]|3[0-46-8]|4[0-7]"]],["(\\d)(\\d{7})","$1 $2",["(?:2|90)4|[67]"]],["(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3",["[3478]|64|90"]],["(\\d{2})(\\d{5,7})","$1 $2",["1|28|6(?:0[5-7]|[1-35-9])|9[2-9]"]]],"0",0,0,0,0,0,[0,["(?:(?:15|(?:3[59]|4[89]|79|8[08])\\d|6(?:0[5-7]|[1-9]\\d)|9(?:0\\d|[2-9]))\\d|2(?:4\\d|8))\\d{5}|(?:[67]\\d\\d|904)\\d{5}",[7,8,9]]]],SR:["597","00","(?:[2-5]|68|[78]\\d)\\d{5}",[6,7],[["(\\d{2})(\\d{2})(\\d{2})","$1-$2-$3",["56"]],["(\\d{3})(\\d{3})","$1-$2",["[2-5]"]],["(\\d{3})(\\d{4})","$1-$2",["[6-8]"]]],0,0,0,0,0,0,[0,["(?:7[124-7]|8[124-9])\\d{5}",[7]]]],SS:["211","00","[19]\\d{8}",[9],[["(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3",["[19]"],"0$1"]],"0",0,0,0,0,0,[0,["(?:12|9[1257-9])\\d{7}"]]],ST:["239","00","(?:22|9\\d)\\d{5}",[7],[["(\\d{3})(\\d{4})","$1 $2",["[29]"]]],0,0,0,0,0,0,[0,["900[5-9]\\d{3}|9(?:0[1-9]|[89]\\d)\\d{4}"]]],SV:["503","00","[267]\\d{7}|[89]00\\d{4}(?:\\d{4})?",[7,8,11],[["(\\d{3})(\\d{4})","$1 $2",["[89]"]],["(\\d{4})(\\d{4})","$1 $2",["[267]"]],["(\\d{3})(\\d{4})(\\d{4})","$1 $2 $3",["[89]"]]],0,0,0,0,0,0,[0,["66(?:[02-9]\\d\\d|1(?:[02-9]\\d|16))\\d{3}|(?:6[0-57-9]|7\\d)\\d{6}",[8]]]],SX:["1","011","7215\\d{6}|(?:[58]\\d\\d|900)\\d{7}",[10],0,"1",0,"1|(5\\d{6})$","721$1",0,"721",[0,["7215(?:1[02]|2\\d|5[034679]|8[014-8])\\d{4}"]]],SY:["963","00","[1-39]\\d{8}|[1-5]\\d{7}",[8,9],[["(\\d{2})(\\d{3})(\\d{3,4})","$1 $2 $3",["[1-5]"],"0$1",1],["(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3",["9"],"0$1",1]],"0",0,0,0,0,0,[0,["9[1-689]\\d{7}",[9]]]],SZ:["268","00","0800\\d{4}|(?:[237]\\d|900)\\d{6}",[8,9],[["(\\d{4})(\\d{4})","$1 $2",["[0237]"]],["(\\d{5})(\\d{4})","$1 $2",["9"]]],0,0,0,0,0,0,[0,["7[6-9]\\d{6}",[8]]]],TA:["290","00","8\\d{3}",[4],0,0,0,0,0,0,"8"],TC:["1","011","(?:[58]\\d\\d|649|900)\\d{7}",[10],0,"1",0,"1|([2-479]\\d{6})$","649$1",0,"649",[0,["649(?:2(?:3[129]|4[1-79])|3\\d\\d|4[34][1-3])\\d{4}"]]],TD:["235","00|16","(?:22|[69]\\d|77)\\d{6}",[8],[["(\\d{2})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",["[2679]"]]],0,0,0,0,0,0,[0,["(?:6[023568]|77|9\\d)\\d{6}"]],"00"],TG:["228","00","[279]\\d{7}",[8],[["(\\d{2})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",["[279]"]]],0,0,0,0,0,0,[0,["(?:7[09]|9[0-36-9])\\d{6}"]]],TH:["66","00[1-9]","(?:001800|[2-57]|[689]\\d)\\d{7}|1\\d{7,9}",[8,9,10,13],[["(\\d)(\\d{3})(\\d{4})","$1 $2 $3",["2"],"0$1"],["(\\d{2})(\\d{3})(\\d{3,4})","$1 $2 $3",["[13-9]"],"0$1"],["(\\d{4})(\\d{3})(\\d{3})","$1 $2 $3",["1"]]],"0",0,0,0,0,0,[0,["671[0-8]\\d{5}|(?:14|6[1-6]|[89]\\d)\\d{7}",[9]]]],TJ:["992","810","(?:00|[1-57-9]\\d)\\d{7}",[9],[["(\\d{6})(\\d)(\\d{2})","$1 $2 $3",["331","3317"]],["(\\d{3})(\\d{2})(\\d{4})","$1 $2 $3",["[34]7|91[78]"]],["(\\d{4})(\\d)(\\d{4})","$1 $2 $3",["3[1-5]"]],["(\\d{2})(\\d{3})(\\d{4})","$1 $2 $3",["[0-57-9]"]]],0,0,0,0,0,0,[0,["41[18]\\d{6}|(?:[034]0|1[017]|2[02]|5[05]|7[0178]|8[078]|9\\d)\\d{7}"]],"8~10"],TK:["690","00","[2-47]\\d{3,6}",[4,5,6,7],0,0,0,0,0,0,0,[0,["7[2-4]\\d{2,5}"]]],TL:["670","00","7\\d{7}|(?:[2-47]\\d|[89]0)\\d{5}",[7,8],[["(\\d{3})(\\d{4})","$1 $2",["[2-489]|70"]],["(\\d{4})(\\d{4})","$1 $2",["7"]]],0,0,0,0,0,0,[0,["7[2-8]\\d{6}",[8]]]],TM:["993","810","[1-6]\\d{7}",[8],[["(\\d{2})(\\d{2})(\\d{2})(\\d{2})","$1 $2-$3-$4",["12"],"(8 $1)"],["(\\d{3})(\\d)(\\d{2})(\\d{2})","$1 $2-$3-$4",["[1-5]"],"(8 $1)"],["(\\d{2})(\\d{6})","$1 $2",["6"],"8 $1"]],"8",0,0,0,0,0,[0,["6\\d{7}"]],"8~10"],TN:["216","00","[2-57-9]\\d{7}",[8],[["(\\d{2})(\\d{3})(\\d{3})","$1 $2 $3",["[2-57-9]"]]],0,0,0,0,0,0,[0,["3(?:001|[12]40)\\d{4}|(?:(?:[259]\\d|4[0-7])\\d|3(?:1[1-35]|6[0-4]|91))\\d{5}"]]],TO:["676","00","(?:0800|(?:[5-8]\\d\\d|999)\\d)\\d{3}|[2-8]\\d{4}",[5,7],[["(\\d{2})(\\d{3})","$1-$2",["[2-4]|50|6[09]|7[0-24-69]|8[05]"]],["(\\d{4})(\\d{3})","$1 $2",["0"]],["(\\d{3})(\\d{4})","$1 $2",["[5-9]"]]],0,0,0,0,0,0,[0,["(?:55[4-6]|6(?:[09]\\d|3[02]|8[15-9])|(?:7\\d|8[46-9])\\d|999)\\d{4}",[7]]]],TR:["90","00","4\\d{6}|8\\d{11,12}|(?:[2-58]\\d\\d|900)\\d{7}",[7,10,12,13],[["(\\d{3})(\\d{3})(\\d{4})","$1 $2 $3",["512|8[01589]|90"],"0$1",1],["(\\d{3})(\\d{3})(\\d{2})(\\d{2})","$1 $2 $3 $4",["5(?:[0-59]|61)","5(?:[0-59]|616)","5(?:[0-59]|6161)"],"0$1",1],["(\\d{3})(\\d{3})(\\d{2})(\\d{2})","$1 $2 $3 $4",["[24][1-8]|3[1-9]"],"(0$1)",1],["(\\d{3})(\\d{3})(\\d{6,7})","$1 $2 $3",["80"],"0$1",1]],"0",0,0,0,0,0,[0,["56161\\d{5}|5(?:0[15-7]|1[06]|24|[34]\\d|5[1-59]|9[46])\\d{7}",[10]]]],TT:["1","011","(?:[58]\\d\\d|900)\\d{7}",[10],0,"1",0,"1|([2-46-8]\\d{6})$","868$1",0,"868",[0,["868(?:(?:2[5-9]|3\\d)\\d|4(?:3[0-6]|[6-9]\\d)|6(?:20|78|8\\d)|7(?:0[1-9]|1[02-9]|[2-9]\\d))\\d{4}"]]],TV:["688","00","(?:2|7\\d\\d|90)\\d{4}",[5,6,7],[["(\\d{2})(\\d{3})","$1 $2",["2"]],["(\\d{2})(\\d{4})","$1 $2",["90"]],["(\\d{2})(\\d{5})","$1 $2",["7"]]],0,0,0,0,0,0,[0,["(?:7[01]\\d|90)\\d{4}",[6,7]]]],TW:["886","0(?:0[25-79]|19)","[2-689]\\d{8}|7\\d{9,10}|[2-8]\\d{7}|2\\d{6}",[7,8,9,10,11],[["(\\d{2})(\\d)(\\d{4})","$1 $2 $3",["202"],"0$1"],["(\\d{2})(\\d{3})(\\d{3,4})","$1 $2 $3",["[258]0"],"0$1"],["(\\d)(\\d{3,4})(\\d{4})","$1 $2 $3",["[23568]|4(?:0[02-48]|[1-47-9])|7[1-9]","[23568]|4(?:0[2-48]|[1-47-9])|(?:400|7)[1-9]"],"0$1"],["(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3",["[49]"],"0$1"],["(\\d{2})(\\d{4})(\\d{4,5})","$1 $2 $3",["7"],"0$1"]],"0",0,0,0,0,0,[0,["(?:40001[0-2]|9[0-8]\\d{4})\\d{3}",[9]]],0,"#"],TZ:["255","00[056]","(?:[25-8]\\d|41|90)\\d{7}",[9],[["(\\d{3})(\\d{2})(\\d{4})","$1 $2 $3",["[89]"],"0$1"],["(\\d{2})(\\d{3})(\\d{4})","$1 $2 $3",["[24]"],"0$1"],["(\\d{2})(\\d{7})","$1 $2",["5"]],["(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3",["[67]"],"0$1"]],"0",0,0,0,0,0,[0,["77[2-9]\\d{6}|(?:6[125-9]|7[13-689])\\d{7}"]]],UA:["380","00","[89]\\d{9}|[3-9]\\d{8}",[9,10],[["(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3",["6[12][29]|(?:3[1-8]|4[136-8]|5[12457]|6[49])2|(?:56|65)[24]","6[12][29]|(?:35|4[1378]|5[12457]|6[49])2|(?:56|65)[24]|(?:3[1-46-8]|46)2[013-9]"],"0$1"],["(\\d{4})(\\d{5})","$1 $2",["3[1-8]|4(?:[1367]|[45][6-9]|8[4-6])|5(?:[1-5]|6[0135689]|7[4-6])|6(?:[12][3-7]|[459])","3[1-8]|4(?:[1367]|[45][6-9]|8[4-6])|5(?:[1-5]|6(?:[015689]|3[02389])|7[4-6])|6(?:[12][3-7]|[459])"],"0$1"],["(\\d{2})(\\d{3})(\\d{4})","$1 $2 $3",["[3-7]|89|9[1-9]"],"0$1"],["(\\d{3})(\\d{3})(\\d{3,4})","$1 $2 $3",["[89]"],"0$1"]],"0",0,0,0,0,0,[0,["(?:39|50|6[36-8]|7[1-3]|9[1-9])\\d{7}",[9]]],"0~0"],UG:["256","00[057]","800\\d{6}|(?:[29]0|[347]\\d)\\d{7}",[9],[["(\\d{4})(\\d{5})","$1 $2",["202","2024"],"0$1"],["(\\d{3})(\\d{6})","$1 $2",["[27-9]|4(?:6[45]|[7-9])"],"0$1"],["(\\d{2})(\\d{7})","$1 $2",["[34]"],"0$1"]],"0",0,0,0,0,0,[0,["726[01]\\d{5}|7(?:[01578]\\d|20|36|[46][0-4]|9[89])\\d{6}"]]],US:["1","011","[2-9]\\d{9}|3\\d{6}",[10],[["(\\d{3})(\\d{4})","$1-$2",["310"],0,1],["(\\d{3})(\\d{3})(\\d{4})","($1) $2-$3",["[2-9]"],0,1,"$1-$2-$3"]],"1",0,0,0,0,0,[0,["505(?:[2-57-9]\\d\\d|6(?:[0-35-9]\\d|4[46]))\\d{4}|(?:2(?:0[1-35-9]|1[02-9]|2[03-589]|3[149]|4[08]|5[1-46]|6[0279]|7[0269]|8[13])|3(?:0[1-57-9]|1[02-9]|2[01356]|3[0-24679]|4[167]|5[0-2]|6[014]|8[056])|4(?:0[124-9]|1[02-579]|2[3-5]|3[0245]|4[023578]|58|6[349]|7[0589]|8[04])|5(?:0[1-47-9]|1[0235-8]|20|3[0149]|4[01]|5[19]|6[1-47]|7[0-5]|8[0256])|6(?:0[1-35-9]|1[024-9]|2[03689]|[34][016]|5[01679]|6[0-279]|78|8[0-29])|7(?:0[1-46-8]|1[2-9]|2[04-7]|3[1247]|4[037]|5[47]|6[02359]|7[0-59]|8[156])|8(?:0[1-68]|1[02-8]|2[068]|3[0-2589]|4[03578]|5[046-9]|6[02-5]|7[028])|9(?:0[1346-9]|1[02-9]|2[0589]|3[0146-8]|4[01357-9]|5[12469]|7[0-389]|8[04-69]))[2-9]\\d{6}"]]],UY:["598","0(?:0|1[3-9]\\d)","(?:0004|4)\\d{9}|[1249]\\d{7}|(?:[49]\\d|80)\\d{5}",[7,8,10,13],[["(\\d{3})(\\d{4})","$1 $2",["405|8|90"],"0$1"],["(\\d{2})(\\d{3})(\\d{3})","$1 $2 $3",["9"],"0$1"],["(\\d{4})(\\d{4})","$1 $2",["[124]"]],["(\\d{3})(\\d{3})(\\d{4})","$1 $2 $3",["4"],"0$1"],["(\\d{3})(\\d{3})(\\d{3})(\\d{4})","$1 $2 $3 $4",["0"]]],"0",0,0,0,0,0,[0,["9[1-9]\\d{6}",[8]]],"00"," int. "],UZ:["998","810","(?:33|[5-79]\\d|88)\\d{7}",[9],[["(\\d{2})(\\d{3})(\\d{2})(\\d{2})","$1 $2 $3 $4",["[35-9]"],"8 $1"]],"8",0,0,0,0,0,[0,["(?:(?:33|88|9[0-57-9])\\d{3}|5(?:0\\d{3}|5(?:50[013]|90\\d))|6(?:1(?:2(?:2[01]|98)|35[0-4]|50\\d|61[23]|7(?:[01][017]|4\\d|55|9[5-9]))|2(?:(?:11|7\\d)\\d|2(?:[12]1|9[01379])|5(?:[126]\\d|3[0-4]))|5(?:19[01]|2(?:27|9[26])|(?:30|59|7\\d)\\d)|6(?:2(?:1[5-9]|2[0367]|38|41|52|60)|(?:3[79]|9[0-3])\\d|4(?:56|83)|7(?:[07]\\d|1[017]|3[07]|4[047]|5[057]|67|8[0178]|9[79]))|7(?:2(?:24|3[237]|4[5-9]|7[15-8])|5(?:7[12]|8[0589])|7(?:0\\d|[39][07])|9(?:0\\d|7[079]))|9(?:2(?:1[1267]|3[01]|5\\d|7[0-4])|(?:5[67]|7\\d)\\d|6(?:2[0-26]|8\\d)))|7(?:[07]\\d{3}|1(?:13[01]|6(?:0[47]|1[67]|66)|71[3-69]|98\\d)|2(?:2(?:2[79]|95)|3(?:2[5-9]|6[0-6])|57\\d|7(?:0\\d|1[17]|2[27]|3[37]|44|5[057]|66|88))|3(?:2(?:1[0-6]|21|3[469]|7[159])|(?:33|9[4-6])\\d|5(?:0[0-4]|5[579]|9\\d)|7(?:[0-3579]\\d|4[0467]|6[67]|8[078]))|4(?:2(?:29|5[0257]|6[0-7]|7[1-57])|5(?:1[0-4]|8\\d|9[5-9])|7(?:0\\d|1[024589]|2[0-27]|3[0137]|[46][07]|5[01]|7[5-9]|9[079])|9(?:7[015-9]|[89]\\d))|5(?:112|2(?:0\\d|2[29]|[49]4)|3[1568]\\d|52[6-9]|7(?:0[01578]|1[017]|[23]7|4[047]|[5-7]\\d|8[78]|9[079]))|6(?:2(?:2[1245]|4[2-4])|39\\d|41[179]|5(?:[349]\\d|5[0-2])|7(?:0[017]|[13]\\d|22|44|55|67|88))|9(?:22[128]|3(?:2[0-4]|7\\d)|57[02569]|7(?:2[05-9]|3[37]|4\\d|60|7[2579]|87|9[07]))))\\d{4}"]],"8~10"],VA:["39","00","0\\d{5,10}|3[0-8]\\d{7,10}|55\\d{8}|8\\d{5}(?:\\d{2,4})?|(?:1\\d|39)\\d{7,8}",[6,7,8,9,10,11],0,0,0,0,0,0,"06698",[0,["3[1-9]\\d{8}|3[2-9]\\d{7}",[9,10]]]],VC:["1","011","(?:[58]\\d\\d|784|900)\\d{7}",[10],0,"1",0,"1|([2-7]\\d{6})$","784$1",0,"784",[0,["784(?:4(?:3[0-5]|5[45]|89|9[0-8])|5(?:2[6-9]|3[0-4])|720)\\d{4}"]]],VE:["58","00","[68]00\\d{7}|(?:[24]\\d|[59]0)\\d{8}",[10],[["(\\d{3})(\\d{7})","$1-$2",["[24-689]"],"0$1"]],"0",0,0,0,0,0,[0,["4(?:1[24-8]|2[46])\\d{7}"]]],VG:["1","011","(?:284|[58]\\d\\d|900)\\d{7}",[10],0,"1",0,"1|([2-578]\\d{6})$","284$1",0,"284",[0,["284496[6-9]\\d{3}|284(?:245|3(?:0[0-3]|4[0-7]|68|9[34])|4(?:4[0-6]|68|99)|5(?:4[0-7]|68|9[69]))\\d{4}"]]],VI:["1","011","[58]\\d{9}|(?:34|90)0\\d{7}",[10],0,"1",0,"1|([2-9]\\d{6})$","340$1",0,"340",[0,["340(?:2(?:0[0-368]|2[06-8]|4[49]|77)|3(?:32|44)|4(?:2[23]|44|7[34]|89)|5(?:1[34]|55)|6(?:2[56]|4[23]|77|9[023])|7(?:1[2-57-9]|2[57]|7\\d)|884|998)\\d{4}"]]],VN:["84","00","[12]\\d{9}|[135-9]\\d{8}|[16]\\d{7}|[16-8]\\d{6}",[7,8,9,10],[["(\\d{2})(\\d{5})","$1 $2",["80"],"0$1",1],["(\\d{4})(\\d{4,6})","$1 $2",["1"],0,1],["(\\d{2})(\\d{3})(\\d{2})(\\d{2})","$1 $2 $3 $4",["[69]"],"0$1",1],["(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3",["[3578]"],"0$1",1],["(\\d{2})(\\d{4})(\\d{4})","$1 $2 $3",["2[48]"],"0$1",1],["(\\d{3})(\\d{4})(\\d{3})","$1 $2 $3",["2"],"0$1",1]],"0",0,0,0,0,0,[0,["(?:5(?:2[238]|59)|89[6-9]|99[013-9])\\d{6}|(?:3\\d|5[689]|7[06-9]|8[1-8]|9[0-8])\\d{7}",[9]]]],VU:["678","00","[57-9]\\d{6}|(?:[238]\\d|48)\\d{3}",[5,7],[["(\\d{3})(\\d{4})","$1 $2",["[57-9]"]]],0,0,0,0,0,0,[0,["(?:[58]\\d|7[013-7])\\d{5}",[7]]]],WF:["681","00","(?:40|72)\\d{4}|8\\d{5}(?:\\d{3})?",[6,9],[["(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3",["[478]"]],["(\\d{3})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",["8"]]],0,0,0,0,0,0,[0,["(?:72|8[23])\\d{4}",[6]]]],WS:["685","0","(?:[2-6]|8\\d{5})\\d{4}|[78]\\d{6}|[68]\\d{5}",[5,6,7,10],[["(\\d{5})","$1",["[2-5]|6[1-9]"]],["(\\d{3})(\\d{3,7})","$1 $2",["[68]"]],["(\\d{2})(\\d{5})","$1 $2",["7"]]],0,0,0,0,0,0,[0,["(?:7[1-35-7]|8(?:[3-7]|9\\d{3}))\\d{5}",[7,10]]]],XK:["383","00","[23]\\d{7,8}|(?:4\\d\\d|[89]00)\\d{5}",[8,9],[["(\\d{3})(\\d{5})","$1 $2",["[89]"],"0$1"],["(\\d{2})(\\d{3})(\\d{3})","$1 $2 $3",["[2-4]"],"0$1"],["(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3",["[23]"],"0$1"]],"0",0,0,0,0,0,[0,["4[3-9]\\d{6}",[8]]]],YE:["967","00","(?:1|7\\d)\\d{7}|[1-7]\\d{6}",[7,8,9],[["(\\d)(\\d{3})(\\d{3,4})","$1 $2 $3",["[1-6]|7(?:[24-6]|8[0-7])"],"0$1"],["(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3",["7"],"0$1"]],"0",0,0,0,0,0,[0,["7[01378]\\d{7}",[9]]]],YT:["262","00","80\\d{7}|(?:26|63)9\\d{6}",[9],0,"0",0,0,0,0,"269|63",[0,["639(?:0[0-79]|1[019]|[267]\\d|3[09]|40|5[05-9]|9[04-79])\\d{4}"]]],ZA:["27","00","[1-79]\\d{8}|8\\d{4,9}",[5,6,7,8,9,10],[["(\\d{2})(\\d{3,4})","$1 $2",["8[1-4]"],"0$1"],["(\\d{2})(\\d{3})(\\d{2,3})","$1 $2 $3",["8[1-4]"],"0$1"],["(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3",["860"],"0$1"],["(\\d{2})(\\d{3})(\\d{4})","$1 $2 $3",["[1-9]"],"0$1"],["(\\d{3})(\\d{3})(\\d{4})","$1 $2 $3",["8"],"0$1"]],"0",0,0,0,0,0,[0,["(?:1(?:3492[0-25]|4495[0235]|549(?:20|5[01]))|4[34]492[01])\\d{3}|8[1-4]\\d{3,7}|(?:2[27]|47|54)4950\\d{3}|(?:1(?:049[2-4]|9[12]\\d\\d)|(?:6\\d|7[0-46-9])\\d{3}|8(?:5\\d{3}|7(?:08[67]|158|28[5-9]|310)))\\d{4}|(?:1[6-8]|28|3[2-69]|4[025689]|5[36-8])4920\\d{3}|(?:12|[2-5]1)492\\d{4}",[5,6,7,8,9]]]],ZM:["260","00","800\\d{6}|(?:21|63|[79]\\d)\\d{7}",[9],[["(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3",["[28]"],"0$1"],["(\\d{2})(\\d{7})","$1 $2",["[79]"],"0$1"]],"0",0,0,0,0,0,[0,["(?:7[5-79]|9[5-8])\\d{7}"]]],ZW:["263","00","2(?:[0-57-9]\\d{6,8}|6[0-24-9]\\d{6,7})|[38]\\d{9}|[35-8]\\d{8}|[3-6]\\d{7}|[1-689]\\d{6}|[1-3569]\\d{5}|[1356]\\d{4}",[5,6,7,8,9,10],[["(\\d{3})(\\d{3,5})","$1 $2",["2(?:0[45]|2[278]|[49]8)|3(?:[09]8|17)|6(?:[29]8|37|75)|[23][78]|(?:33|5[15]|6[68])[78]"],"0$1"],["(\\d)(\\d{3})(\\d{2,4})","$1 $2 $3",["[49]"],"0$1"],["(\\d{3})(\\d{4})","$1 $2",["80"],"0$1"],["(\\d{2})(\\d{7})","$1 $2",["24|8[13-59]|(?:2[05-79]|39|5[45]|6[15-8])2","2(?:02[014]|4|[56]20|[79]2)|392|5(?:42|525)|6(?:[16-8]21|52[013])|8[13-59]"],"(0$1)"],["(\\d{2})(\\d{3})(\\d{4})","$1 $2 $3",["7"],"0$1"],["(\\d{3})(\\d{3})(\\d{3,4})","$1 $2 $3",["2(?:1[39]|2[0157]|[378]|[56][14])|3(?:12|29)","2(?:1[39]|2[0157]|[378]|[56][14])|3(?:123|29)"],"0$1"],["(\\d{4})(\\d{6})","$1 $2",["8"],"0$1"],["(\\d{2})(\\d{3,5})","$1 $2",["1|2(?:0[0-36-9]|12|29|[56])|3(?:1[0-689]|[24-6])|5(?:[0236-9]|1[2-4])|6(?:[013-59]|7[0-46-9])|(?:33|55|6[68])[0-69]|(?:29|3[09]|62)[0-79]"],"0$1"],["(\\d{2})(\\d{3})(\\d{3,4})","$1 $2 $3",["29[013-9]|39|54"],"0$1"],["(\\d{4})(\\d{3,5})","$1 $2",["(?:25|54)8","258|5483"],"0$1"]],"0",0,0,0,0,0,[0,["7(?:[178]\\d|3[1-9])\\d{6}",[9]]]]},nonGeographic:{800:["800",0,"(?:00|[1-9]\\d)\\d{6}",[8],[["(\\d{4})(\\d{4})","$1 $2",["\\d"]]],0,0,0,0,0,0,[0,0,["(?:00|[1-9]\\d)\\d{6}"]]],808:["808",0,"[1-9]\\d{7}",[8],[["(\\d{4})(\\d{4})","$1 $2",["[1-9]"]]],0,0,0,0,0,0,[0,0,0,0,0,0,0,0,0,["[1-9]\\d{7}"]]],870:["870",0,"7\\d{11}|[35-7]\\d{8}",[9,12],[["(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3",["[35-7]"]]],0,0,0,0,0,0,[0,["(?:[356]|774[45])\\d{8}|7[6-8]\\d{7}"]]],878:["878",0,"10\\d{10}",[12],[["(\\d{2})(\\d{5})(\\d{5})","$1 $2 $3",["1"]]],0,0,0,0,0,0,[0,0,0,0,0,0,0,0,["10\\d{10}"]]],881:["881",0,"[0-36-9]\\d{8}",[9],[["(\\d)(\\d{3})(\\d{5})","$1 $2 $3",["[0-36-9]"]]],0,0,0,0,0,0,[0,["[0-36-9]\\d{8}"]]],882:["882",0,"[13]\\d{6}(?:\\d{2,5})?|[19]\\d{7}|(?:[25]\\d\\d|4)\\d{7}(?:\\d{2})?",[7,8,9,10,11,12],[["(\\d{2})(\\d{5})","$1 $2",["16|342"]],["(\\d{2})(\\d{6})","$1 $2",["49"]],["(\\d{2})(\\d{2})(\\d{4})","$1 $2 $3",["1[36]|9"]],["(\\d{2})(\\d{4})(\\d{3})","$1 $2 $3",["3[23]"]],["(\\d{2})(\\d{3,4})(\\d{4})","$1 $2 $3",["16"]],["(\\d{2})(\\d{4})(\\d{4})","$1 $2 $3",["10|23|3(?:[15]|4[57])|4|51"]],["(\\d{3})(\\d{4})(\\d{4})","$1 $2 $3",["34"]],["(\\d{2})(\\d{4,5})(\\d{5})","$1 $2 $3",["[1-35]"]]],0,0,0,0,0,0,[0,["342\\d{4}|(?:337|49)\\d{6}|(?:3(?:2|47|7\\d{3})|50\\d{3})\\d{7}",[7,8,9,10,12]],0,0,0,0,0,0,["1(?:3(?:0[0347]|[13][0139]|2[035]|4[013568]|6[0459]|7[06]|8[15-8]|9[0689])\\d{4}|6\\d{5,10})|(?:345\\d|9[89])\\d{6}|(?:10|2(?:3|85\\d)|3(?:[15]|[69]\\d\\d)|4[15-8]|51)\\d{8}"]]],883:["883",0,"(?:[1-4]\\d|51)\\d{6,10}",[8,9,10,11,12],[["(\\d{3})(\\d{3})(\\d{2,8})","$1 $2 $3",["[14]|2[24-689]|3[02-689]|51[24-9]"]],["(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3",["510"]],["(\\d{3})(\\d{3})(\\d{4})","$1 $2 $3",["21"]],["(\\d{4})(\\d{4})(\\d{4})","$1 $2 $3",["51[13]"]],["(\\d{3})(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3 $4",["[235]"]]],0,0,0,0,0,0,[0,0,0,0,0,0,0,0,["(?:2(?:00\\d\\d|10)|(?:370[1-9]|51\\d0)\\d)\\d{7}|51(?:00\\d{5}|[24-9]0\\d{4,7})|(?:1[013-79]|2[24-689]|3[02-689]|4[0-4])0\\d{5,9}"]]],888:["888",0,"\\d{11}",[11],[["(\\d{3})(\\d{3})(\\d{5})","$1 $2 $3"]],0,0,0,0,0,0,[0,0,0,0,0,0,["\\d{11}"]]],979:["979",0,"[1359]\\d{8}",[9],[["(\\d)(\\d{4})(\\d{4})","$1 $2 $3",["[1359]"]]],0,0,0,0,0,0,[0,0,0,["[1359]\\d{8}"]]]}};function n(e,t){var a=Array.prototype.slice.call(t);return a.push(s),e.apply(this,a)}},6670:e=>{e.exports=JSON.parse('[{"dial":"93","code":"AF"},{"dial":"355","code":"AL"},{"dial":"213","code":"DZ"},{"dial":"1-684","code":"AS"},{"dial":"376","code":"AD"},{"dial":"244","code":"AO"},{"dial":"1-264","code":"AI"},{"dial":"672","code":"AQ"},{"dial":"1-268","code":"AG"},{"dial":"54","code":"AR"},{"dial":"374","code":"AM"},{"dial":"297","code":"AW"},{"dial":"61","code":"AU"},{"dial":"43","code":"AT"},{"dial":"994","code":"AZ"},{"dial":"1-242","code":"BS"},{"dial":"973","code":"BH"},{"dial":"880","code":"BD"},{"dial":"1-246","code":"BB"},{"dial":"375","code":"BY"},{"dial":"32","code":"BE"},{"dial":"501","code":"BZ"},{"dial":"229","code":"BJ"},{"dial":"1-441","code":"BM"},{"dial":"975","code":"BT"},{"dial":"591","code":"BO"},{"dial":"387","code":"BA"},{"dial":"267","code":"BW"},{"dial":"55","code":"BR"},{"dial":"246","code":"IO"},{"dial":"1-284","code":"VG"},{"dial":"673","code":"BN"},{"dial":"359","code":"BG"},{"dial":"226","code":"BF"},{"dial":"257","code":"BI"},{"dial":"855","code":"KH"},{"dial":"237","code":"CM"},{"dial":"1","code":"CA"},{"dial":"238","code":"CV"},{"dial":"1-345","code":"KY"},{"dial":"236","code":"CF"},{"dial":"235","code":"TD"},{"dial":"56","code":"CL"},{"dial":"86","code":"CN"},{"dial":"61","code":"CX"},{"dial":"61","code":"CC"},{"dial":"57","code":"CO"},{"dial":"269","code":"KM"},{"dial":"682","code":"CK"},{"dial":"506","code":"CR"},{"dial":"385","code":"HR"},{"dial":"53","code":"CU"},{"dial":"599","code":"CW"},{"dial":"357","code":"CY"},{"dial":"420","code":"CZ"},{"dial":"243","code":"CD"},{"dial":"45","code":"DK"},{"dial":"253","code":"DJ"},{"dial":"1-767","code":"DM"},{"dial":"1-809, 1-829, 1-849","code":"DO"},{"dial":"670","code":"TL"},{"dial":"593","code":"EC"},{"dial":"20","code":"EG"},{"dial":"503","code":"SV"},{"dial":"240","code":"GQ"},{"dial":"291","code":"ER"},{"dial":"372","code":"EE"},{"dial":"251","code":"ET"},{"dial":"500","code":"FK"},{"dial":"298","code":"FO"},{"dial":"679","code":"FJ"},{"dial":"358","code":"FI"},{"dial":"33","code":"FR"},{"dial":"689","code":"PF"},{"dial":"241","code":"GA"},{"dial":"220","code":"GM"},{"dial":"995","code":"GE"},{"dial":"49","code":"DE"},{"dial":"233","code":"GH"},{"dial":"350","code":"GI"},{"dial":"30","code":"GR"},{"dial":"299","code":"GL"},{"dial":"1-473","code":"GD"},{"dial":"1-671","code":"GU"},{"dial":"502","code":"GT"},{"dial":"44-1481","code":"GG"},{"dial":"224","code":"GN"},{"dial":"245","code":"GW"},{"dial":"592","code":"GY"},{"dial":"509","code":"HT"},{"dial":"504","code":"HN"},{"dial":"852","code":"HK"},{"dial":"36","code":"HU"},{"dial":"354","code":"IS"},{"dial":"91","code":"IN"},{"dial":"62","code":"ID"},{"dial":"98","code":"IR"},{"dial":"964","code":"IQ"},{"dial":"353","code":"IE"},{"dial":"44-1624","code":"IM"},{"dial":"972","code":"IL"},{"dial":"39","code":"IT"},{"dial":"225","code":"CI"},{"dial":"1-876","code":"JM"},{"dial":"81","code":"JP"},{"dial":"44-1534","code":"JE"},{"dial":"962","code":"JO"},{"dial":"7, 997","code":"KZ"},{"dial":"254","code":"KE"},{"dial":"686","code":"KI"},{"dial":"383","code":"XK"},{"dial":"965","code":"KW"},{"dial":"996","code":"KG"},{"dial":"856","code":"LA"},{"dial":"371","code":"LV"},{"dial":"961","code":"LB"},{"dial":"266","code":"LS"},{"dial":"231","code":"LR"},{"dial":"218","code":"LY"},{"dial":"423","code":"LI"},{"dial":"370","code":"LT"},{"dial":"352","code":"LU"},{"dial":"853","code":"MO"},{"dial":"389","code":"MK"},{"dial":"261","code":"MG"},{"dial":"265","code":"MW"},{"dial":"60","code":"MY"},{"dial":"960","code":"MV"},{"dial":"223","code":"ML"},{"dial":"356","code":"MT"},{"dial":"692","code":"MH"},{"dial":"222","code":"MR"},{"dial":"230","code":"MU"},{"dial":"262","code":"YT"},{"dial":"52","code":"MX"},{"dial":"691","code":"FM"},{"dial":"373","code":"MD"},{"dial":"377","code":"MC"},{"dial":"976","code":"MN"},{"dial":"382","code":"ME"},{"dial":"1-664","code":"MS"},{"dial":"212","code":"MA"},{"dial":"258","code":"MZ"},{"dial":"95","code":"MM"},{"dial":"264","code":"NA"},{"dial":"674","code":"NR"},{"dial":"977","code":"NP"},{"dial":"31","code":"NL"},{"dial":"599","code":"CW"},{"dial":"687","code":"NC"},{"dial":"64","code":"NZ"},{"dial":"505","code":"NI"},{"dial":"227","code":"NE"},{"dial":"234","code":"NG"},{"dial":"683","code":"NU"},{"dial":"850","code":"KP"},{"dial":"1-670","code":"MP"},{"dial":"47","code":"NO"},{"dial":"968","code":"OM"},{"dial":"92","code":"PK"},{"dial":"680","code":"PW"},{"dial":"970","code":"PS"},{"dial":"507","code":"PA"},{"dial":"675","code":"PG"},{"dial":"595","code":"PY"},{"dial":"51","code":"PE"},{"dial":"63","code":"PH"},{"dial":"64","code":"PN"},{"dial":"48","code":"PL"},{"dial":"351","code":"PT"},{"dial":"1-787, 1-939","code":"PR"},{"dial":"974","code":"QA"},{"dial":"242","code":"CG"},{"dial":"262","code":"RE"},{"dial":"40","code":"RO"},{"dial":"7","code":"RU"},{"dial":"250","code":"RW"},{"dial":"590","code":"BL"},{"dial":"290","code":"SH"},{"dial":"1-869","code":"KN"},{"dial":"1-758","code":"LC"},{"dial":"590","code":"MF"},{"dial":"508","code":"PM"},{"dial":"1-784","code":"VC"},{"dial":"685","code":"WS"},{"dial":"378","code":"SM"},{"dial":"239","code":"ST"},{"dial":"966","code":"SA"},{"dial":"221","code":"SN"},{"dial":"381","code":"RS"},{"dial":"248","code":"SC"},{"dial":"232","code":"SL"},{"dial":"65","code":"SG"},{"dial":"1-721","code":"SX"},{"dial":"421","code":"SK"},{"dial":"386","code":"SI"},{"dial":"677","code":"SB"},{"dial":"252","code":"SO"},{"dial":"27","code":"ZA"},{"dial":"82","code":"KR"},{"dial":"211","code":"SS"},{"dial":"34","code":"ES"},{"dial":"94","code":"LK"},{"dial":"249","code":"SD"},{"dial":"597","code":"SR"},{"dial":"47","code":"SJ"},{"dial":"268","code":"SZ"},{"dial":"46","code":"SE"},{"dial":"41","code":"CH"},{"dial":"963","code":"SY"},{"dial":"886","code":"TW"},{"dial":"992","code":"TJ"},{"dial":"255","code":"TZ"},{"dial":"66","code":"TH"},{"dial":"228","code":"TG"},{"dial":"690","code":"TK"},{"dial":"676","code":"TO"},{"dial":"1-868","code":"TT"},{"dial":"216","code":"TN"},{"dial":"90","code":"TR"},{"dial":"993","code":"TM"},{"dial":"1-649","code":"TC"},{"dial":"688","code":"TV"},{"dial":"1-340","code":"VI"},{"dial":"256","code":"UG"},{"dial":"380","code":"UA"},{"dial":"971","code":"AE"},{"dial":"44","code":"GB"},{"dial":"1","code":"US"},{"dial":"598","code":"UY"},{"dial":"998","code":"UZ"},{"dial":"678","code":"VU"},{"dial":"379","code":"VA"},{"dial":"58","code":"VE"},{"dial":"84","code":"VN"},{"dial":"681","code":"WF"},{"dial":"212","code":"EH"},{"dial":"967","code":"YE"},{"dial":"260","code":"ZM"},{"dial":"263","code":"ZW"}]')}},i={};function r(e){var t=i[e];if(void 0!==t)return t.exports;var a=i[e]={exports:{}};return n[e].call(a.exports,a,a.exports,r),a.exports}r.m=n,r.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return r.d(t,{a:t}),t},t=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,r.t=function(a,s){if(1&s&&(a=this(a)),8&s)return a;if("object"==typeof a&&a){if(4&s&&a.__esModule)return a;if(16&s&&"function"==typeof a.then)return a}var n=Object.create(null);r.r(n);var i={};e=e||[null,t({}),t([]),t(t)];for(var o=2&s&&a;"object"==typeof o&&!~e.indexOf(o);o=t(o))Object.getOwnPropertyNames(o).forEach((e=>i[e]=()=>a[e]));return i.default=()=>a,r.d(n,i),n},r.d=(e,t)=>{for(var a in t)r.o(t,a)&&!r.o(e,a)&&Object.defineProperty(e,a,{enumerable:!0,get:t[a]})},r.f={},r.e=e=>Promise.all(Object.keys(r.f).reduce(((t,a)=>(r.f[a](e,t),t)),[])),r.u=e=>e+".prod.js",r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),r.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),a={},s="tinode-webapp:",r.l=(e,t,n,i)=>{if(a[e])a[e].push(t);else{var o,d;if(void 0!==n)for(var l=document.getElementsByTagName("script"),c=0;c{o.onerror=o.onload=null,clearTimeout(u);var n=a[e];if(delete a[e],o.parentNode&&o.parentNode.removeChild(o),n&&n.forEach((e=>e(s))),t)return t(s)},u=setTimeout(p.bind(null,void 0,{type:"timeout",target:o}),12e4);o.onerror=p.bind(null,o.onerror),o.onload=p.bind(null,o.onload),d&&document.head.appendChild(o)}},r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.p="/umd/",(()=>{var e={826:0};r.f.j=(t,a)=>{var s=r.o(e,t)?e[t]:void 0;if(0!==s)if(s)a.push(s[2]);else{var n=new Promise(((a,n)=>s=e[t]=[a,n]));a.push(s[2]=n);var i=r.p+r.u(t),o=new Error;r.l(i,(a=>{if(r.o(e,t)&&(0!==(s=e[t])&&(e[t]=void 0),s)){var n=a&&("load"===a.type?"missing":a.type),i=a&&a.target&&a.target.src;o.message="Loading chunk "+t+" failed.\n("+n+": "+i+")",o.name="ChunkLoadError",o.type=n,o.request=i,s[1](o)}}),"chunk-"+t,t)}};var t=(t,a)=>{var s,n,[i,o,d]=a,l=0;if(i.some((t=>0!==e[t]))){for(s in o)r.o(o,s)&&(r.m[s]=o[s]);if(d)d(r)}for(t&&t(a);l{var e=r(7363),t=r.n(e),a=r(745),s=r(916);const n=function(e){const t=[];let a=0;for(let s=0;s>6|192,t[a++]=63&n|128):55296==(64512&n)&&s+1>18|240,t[a++]=n>>12&63|128,t[a++]=n>>6&63|128,t[a++]=63&n|128):(t[a++]=n>>12|224,t[a++]=n>>6&63|128,t[a++]=63&n|128)}return t},i={byteToCharMap_:null,charToByteMap_:null,byteToCharMapWebSafe_:null,charToByteMapWebSafe_:null,ENCODED_VALS_BASE:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",get ENCODED_VALS(){return this.ENCODED_VALS_BASE+"+/="},get ENCODED_VALS_WEBSAFE(){return this.ENCODED_VALS_BASE+"-_."},HAS_NATIVE_SUPPORT:"function"==typeof atob,encodeByteArray(e,t){if(!Array.isArray(e))throw Error("encodeByteArray takes an array as a parameter");this.init_();const a=t?this.byteToCharMapWebSafe_:this.byteToCharMap_,s=[];for(let t=0;t>2,c=(3&n)<<4|r>>4;let h=(15&r)<<2|d>>6,p=63&d;o||(p=64,i||(h=64)),s.push(a[l],a[c],a[h],a[p])}return s.join("")},encodeString(e,t){return this.HAS_NATIVE_SUPPORT&&!t?btoa(e):this.encodeByteArray(n(e),t)},decodeString(e,t){return this.HAS_NATIVE_SUPPORT&&!t?atob(e):function(e){const t=[];let a=0,s=0;for(;a191&&n<224){const i=e[a++];t[s++]=String.fromCharCode((31&n)<<6|63&i)}else if(n>239&&n<365){const i=((7&n)<<18|(63&e[a++])<<12|(63&e[a++])<<6|63&e[a++])-65536;t[s++]=String.fromCharCode(55296+(i>>10)),t[s++]=String.fromCharCode(56320+(1023&i))}else{const i=e[a++],r=e[a++];t[s++]=String.fromCharCode((15&n)<<12|(63&i)<<6|63&r)}}return t.join("")}(this.decodeStringToByteArray(e,t))},decodeStringToByteArray(e,t){this.init_();const a=t?this.charToByteMapWebSafe_:this.charToByteMap_,s=[];for(let t=0;t>4;if(s.push(d),64!==r){const e=i<<4&240|r>>2;if(s.push(e),64!==o){const e=r<<6&192|o;s.push(e)}}}return s},init_(){if(!this.byteToCharMap_){this.byteToCharMap_={},this.charToByteMap_={},this.byteToCharMapWebSafe_={},this.charToByteMapWebSafe_={};for(let e=0;e=this.ENCODED_VALS_BASE.length&&(this.charToByteMap_[this.ENCODED_VALS_WEBSAFE.charAt(e)]=e,this.charToByteMapWebSafe_[this.ENCODED_VALS.charAt(e)]=e)}}},o=function(e){return function(e){const t=n(e);return i.encodeByteArray(t,!0)}(e).replace(/\./g,"")},d=function(e){try{return i.decodeString(e,!0)}catch(e){console.error("base64Decode failed: ",e)}return null};const l=()=>function(){if("undefined"!=typeof self)return self;if("undefined"!=typeof window)return window;if(void 0!==r.g)return r.g;throw new Error("Unable to locate global object.")}().__FIREBASE_DEFAULTS__,c=()=>{try{return l()||(()=>{if("undefined"==typeof process||void 0===process.env)return;const e=process.env.__FIREBASE_DEFAULTS__;return e?JSON.parse(e):void 0})()||(()=>{if("undefined"==typeof document)return;let e;try{e=document.cookie.match(/__FIREBASE_DEFAULTS__=([^;]+)/)}catch(e){return}const t=e&&d(e[1]);return t&&JSON.parse(t)})()}catch(e){return void console.info(`Unable to get __FIREBASE_DEFAULTS__ due to: ${e}`)}};class h{constructor(){this.reject=()=>{},this.resolve=()=>{},this.promise=new Promise(((e,t)=>{this.resolve=e,this.reject=t}))}wrapCallback(e){return(t,a)=>{t?this.reject(t):this.resolve(a),"function"==typeof e&&(this.promise.catch((()=>{})),1===e.length?e(t):e(t,a))}}}function p(){try{return"object"==typeof indexedDB}catch(e){return!1}}function u(){return new Promise(((e,t)=>{try{let a=!0;const s="validate-browser-context-for-indexeddb-analytics-module",n=self.indexedDB.open(s);n.onsuccess=()=>{n.result.close(),a||self.indexedDB.deleteDatabase(s),e(!0)},n.onupgradeneeded=()=>{a=!1},n.onerror=()=>{var e;t((null===(e=n.error)||void 0===e?void 0:e.message)||"")}}catch(e){t(e)}}))}class m extends Error{constructor(e,t,a){super(t),this.code=e,this.customData=a,this.name="FirebaseError",Object.setPrototypeOf(this,m.prototype),Error.captureStackTrace&&Error.captureStackTrace(this,g.prototype.create)}}class g{constructor(e,t,a){this.service=e,this.serviceName=t,this.errors=a}create(e,...t){const a=t[0]||{},s=`${this.service}/${e}`,n=this.errors[e],i=n?function(e,t){return e.replace(f,((e,a)=>{const s=t[a];return null!=s?String(s):`<${a}?>`}))}(n,a):"Error",r=`${this.serviceName}: ${i} (${s}).`;return new m(s,r,a)}}const f=/\{\$([^}]+)}/g;function v(e,t){if(e===t)return!0;const a=Object.keys(e),s=Object.keys(t);for(const n of a){if(!s.includes(n))return!1;const a=e[n],i=t[n];if($(a)&&$(i)){if(!v(a,i))return!1}else if(a!==i)return!1}for(const e of s)if(!a.includes(e))return!1;return!0}function $(e){return null!==e&&"object"==typeof e}function b(e){return e&&e._delegate?e._delegate:e}class y{constructor(e,t,a){this.name=e,this.instanceFactory=t,this.type=a,this.multipleInstances=!1,this.serviceProps={},this.instantiationMode="LAZY",this.onInstanceCreated=null}setInstantiationMode(e){return this.instantiationMode=e,this}setMultipleInstances(e){return this.multipleInstances=e,this}setServiceProps(e){return this.serviceProps=e,this}setInstanceCreatedCallback(e){return this.onInstanceCreated=e,this}}const E="[DEFAULT]";class C{constructor(e,t){this.name=e,this.container=t,this.component=null,this.instances=new Map,this.instancesDeferred=new Map,this.instancesOptions=new Map,this.onInitCallbacks=new Map}get(e){const t=this.normalizeInstanceIdentifier(e);if(!this.instancesDeferred.has(t)){const e=new h;if(this.instancesDeferred.set(t,e),this.isInitialized(t)||this.shouldAutoInitialize())try{const a=this.getOrInitializeService({instanceIdentifier:t});a&&e.resolve(a)}catch(e){}}return this.instancesDeferred.get(t).promise}getImmediate(e){var t;const a=this.normalizeInstanceIdentifier(null==e?void 0:e.identifier),s=null!==(t=null==e?void 0:e.optional)&&void 0!==t&&t;if(!this.isInitialized(a)&&!this.shouldAutoInitialize()){if(s)return null;throw Error(`Service ${this.name} is not available`)}try{return this.getOrInitializeService({instanceIdentifier:a})}catch(e){if(s)return null;throw e}}getComponent(){return this.component}setComponent(e){if(e.name!==this.name)throw Error(`Mismatching Component ${e.name} for Provider ${this.name}.`);if(this.component)throw Error(`Component for ${this.name} has already been provided`);if(this.component=e,this.shouldAutoInitialize()){if(function(e){return"EAGER"===e.instantiationMode}(e))try{this.getOrInitializeService({instanceIdentifier:E})}catch(e){}for(const[e,t]of this.instancesDeferred.entries()){const a=this.normalizeInstanceIdentifier(e);try{const e=this.getOrInitializeService({instanceIdentifier:a});t.resolve(e)}catch(e){}}}}clearInstance(e=E){this.instancesDeferred.delete(e),this.instancesOptions.delete(e),this.instances.delete(e)}async delete(){const e=Array.from(this.instances.values());await Promise.all([...e.filter((e=>"INTERNAL"in e)).map((e=>e.INTERNAL.delete())),...e.filter((e=>"_delete"in e)).map((e=>e._delete()))])}isComponentSet(){return null!=this.component}isInitialized(e=E){return this.instances.has(e)}getOptions(e=E){return this.instancesOptions.get(e)||{}}initialize(e={}){const{options:t={}}=e,a=this.normalizeInstanceIdentifier(e.instanceIdentifier);if(this.isInitialized(a))throw Error(`${this.name}(${a}) has already been initialized`);if(!this.isComponentSet())throw Error(`Component ${this.name} has not been registered yet`);const s=this.getOrInitializeService({instanceIdentifier:a,options:t});for(const[e,t]of this.instancesDeferred.entries()){a===this.normalizeInstanceIdentifier(e)&&t.resolve(s)}return s}onInit(e,t){var a;const s=this.normalizeInstanceIdentifier(t),n=null!==(a=this.onInitCallbacks.get(s))&&void 0!==a?a:new Set;n.add(e),this.onInitCallbacks.set(s,n);const i=this.instances.get(s);return i&&e(i,s),()=>{n.delete(e)}}invokeOnInitCallbacks(e,t){const a=this.onInitCallbacks.get(t);if(a)for(const s of a)try{s(e,t)}catch(e){}}getOrInitializeService({instanceIdentifier:e,options:t={}}){let a=this.instances.get(e);if(!a&&this.component&&(a=this.component.instanceFactory(this.container,{instanceIdentifier:(s=e,s===E?void 0:s),options:t}),this.instances.set(e,a),this.instancesOptions.set(e,t),this.invokeOnInitCallbacks(a,e),this.component.onInstanceCreated))try{this.component.onInstanceCreated(this.container,e,a)}catch(e){}var s;return a||null}normalizeInstanceIdentifier(e=E){return this.component?this.component.multipleInstances?e:E:e}shouldAutoInitialize(){return!!this.component&&"EXPLICIT"!==this.component.instantiationMode}}class w{constructor(e){this.name=e,this.providers=new Map}addComponent(e){const t=this.getProvider(e.name);if(t.isComponentSet())throw new Error(`Component ${e.name} has already been registered with ${this.name}`);t.setComponent(e)}addOrOverwriteComponent(e){this.getProvider(e.name).isComponentSet()&&this.providers.delete(e.name),this.addComponent(e)}getProvider(e){if(this.providers.has(e))return this.providers.get(e);const t=new C(e,this);return this.providers.set(e,t),t}getProviders(){return Array.from(this.providers.values())}}const S=[];var M;!function(e){e[e.DEBUG=0]="DEBUG",e[e.VERBOSE=1]="VERBOSE",e[e.INFO=2]="INFO",e[e.WARN=3]="WARN",e[e.ERROR=4]="ERROR",e[e.SILENT=5]="SILENT"}(M||(M={}));const _={debug:M.DEBUG,verbose:M.VERBOSE,info:M.INFO,warn:M.WARN,error:M.ERROR,silent:M.SILENT},T=M.INFO,N={[M.DEBUG]:"log",[M.VERBOSE]:"log",[M.INFO]:"info",[M.WARN]:"warn",[M.ERROR]:"error"},k=(e,t,...a)=>{if(t(e[t]=a,!0),has:(e,t)=>e instanceof IDBTransaction&&("done"===t||"store"===t)||t in e};function U(e){return e!==IDBDatabase.prototype.transaction||"objectStoreNames"in IDBTransaction.prototype?(P||(P=[IDBCursor.prototype.advance,IDBCursor.prototype.continue,IDBCursor.prototype.continuePrimaryKey])).includes(e)?function(...t){return e.apply(j(this),t),B(D.get(this))}:function(...t){return B(e.apply(j(this),t))}:function(t,...a){const s=e.call(j(this),t,...a);return R.set(s,t.sort?t.sort():[t]),B(s)}}function L(e){return"function"==typeof e?U(e):(e instanceof IDBTransaction&&function(e){if(I.has(e))return;const t=new Promise(((t,a)=>{const s=()=>{e.removeEventListener("complete",n),e.removeEventListener("error",i),e.removeEventListener("abort",i)},n=()=>{t(),s()},i=()=>{a(e.error||new DOMException("AbortError","AbortError")),s()};e.addEventListener("complete",n),e.addEventListener("error",i),e.addEventListener("abort",i)}));I.set(e,t)}(e),t=e,(A||(A=[IDBDatabase,IDBObjectStore,IDBIndex,IDBCursor,IDBTransaction])).some((e=>t instanceof e))?new Proxy(e,O):e);var t}function B(e){if(e instanceof IDBRequest)return function(e){const t=new Promise(((t,a)=>{const s=()=>{e.removeEventListener("success",n),e.removeEventListener("error",i)},n=()=>{t(B(e.result)),s()},i=()=>{a(e.error),s()};e.addEventListener("success",n),e.addEventListener("error",i)}));return t.then((t=>{t instanceof IDBCursor&&D.set(t,e)})).catch((()=>{})),x.set(t,e),t}(e);if(F.has(e))return F.get(e);const t=L(e);return t!==e&&(F.set(e,t),x.set(t,e)),t}const j=e=>x.get(e);function H(e,t,{blocked:a,upgrade:s,blocking:n,terminated:i}={}){const r=indexedDB.open(e,t),o=B(r);return s&&r.addEventListener("upgradeneeded",(e=>{s(B(r.result),e.oldVersion,e.newVersion,B(r.transaction))})),a&&r.addEventListener("blocked",(()=>a())),o.then((e=>{i&&e.addEventListener("close",(()=>i())),n&&e.addEventListener("versionchange",(()=>n()))})).catch((()=>{})),o}function V(e,{blocked:t}={}){const a=indexedDB.deleteDatabase(e);return t&&a.addEventListener("blocked",(()=>t())),B(a).then((()=>{}))}const q=["get","getKey","getAll","getAllKeys","count"],G=["put","add","delete","clear"],W=new Map;function K(e,t){if(!(e instanceof IDBDatabase)||t in e||"string"!=typeof t)return;if(W.get(t))return W.get(t);const a=t.replace(/FromIndex$/,""),s=t!==a,n=G.includes(a);if(!(a in(s?IDBIndex:IDBObjectStore).prototype)||!n&&!q.includes(a))return;const i=async function(e,...t){const i=this.transaction(e,n?"readwrite":"readonly");let r=i.store;return s&&(r=r.index(t.shift())),(await Promise.all([r[a](...t),n&&i.done]))[0]};return W.set(t,i),i}O=(e=>({...e,get:(t,a,s)=>K(t,a)||e.get(t,a,s),has:(t,a)=>!!K(t,a)||e.has(t,a)}))(O);class z{constructor(e){this.container=e}getPlatformInfoString(){return this.container.getProviders().map((e=>{if(function(e){const t=e.getComponent();return"VERSION"===(null==t?void 0:t.type)}(e)){const t=e.getImmediate();return`${t.library}/${t.version}`}return null})).filter((e=>e)).join(" ")}}const Z="@firebase/app",Y="0.9.1",X=new class{constructor(e){this.name=e,this._logLevel=T,this._logHandler=k,this._userLogHandler=null,S.push(this)}get logLevel(){return this._logLevel}set logLevel(e){if(!(e in M))throw new TypeError(`Invalid value "${e}" assigned to \`logLevel\``);this._logLevel=e}setLogLevel(e){this._logLevel="string"==typeof e?_[e]:e}get logHandler(){return this._logHandler}set logHandler(e){if("function"!=typeof e)throw new TypeError("Value assigned to `logHandler` must be a function");this._logHandler=e}get userLogHandler(){return this._userLogHandler}set userLogHandler(e){this._userLogHandler=e}debug(...e){this._userLogHandler&&this._userLogHandler(this,M.DEBUG,...e),this._logHandler(this,M.DEBUG,...e)}log(...e){this._userLogHandler&&this._userLogHandler(this,M.VERBOSE,...e),this._logHandler(this,M.VERBOSE,...e)}info(...e){this._userLogHandler&&this._userLogHandler(this,M.INFO,...e),this._logHandler(this,M.INFO,...e)}warn(...e){this._userLogHandler&&this._userLogHandler(this,M.WARN,...e),this._logHandler(this,M.WARN,...e)}error(...e){this._userLogHandler&&this._userLogHandler(this,M.ERROR,...e),this._logHandler(this,M.ERROR,...e)}}("@firebase/app"),Q="[DEFAULT]",J={[Z]:"fire-core","@firebase/app-compat":"fire-core-compat","@firebase/analytics":"fire-analytics","@firebase/analytics-compat":"fire-analytics-compat","@firebase/app-check":"fire-app-check","@firebase/app-check-compat":"fire-app-check-compat","@firebase/auth":"fire-auth","@firebase/auth-compat":"fire-auth-compat","@firebase/database":"fire-rtdb","@firebase/database-compat":"fire-rtdb-compat","@firebase/functions":"fire-fn","@firebase/functions-compat":"fire-fn-compat","@firebase/installations":"fire-iid","@firebase/installations-compat":"fire-iid-compat","@firebase/messaging":"fire-fcm","@firebase/messaging-compat":"fire-fcm-compat","@firebase/performance":"fire-perf","@firebase/performance-compat":"fire-perf-compat","@firebase/remote-config":"fire-rc","@firebase/remote-config-compat":"fire-rc-compat","@firebase/storage":"fire-gcs","@firebase/storage-compat":"fire-gcs-compat","@firebase/firestore":"fire-fst","@firebase/firestore-compat":"fire-fst-compat","fire-js":"fire-js",firebase:"fire-js-all"},ee=new Map,te=new Map;function ae(e,t){try{e.container.addComponent(t)}catch(a){X.debug(`Component ${t.name} failed to register with FirebaseApp ${e.name}`,a)}}function se(e){const t=e.name;if(te.has(t))return X.debug(`There were multiple attempts to register component ${t}.`),!1;te.set(t,e);for(const t of ee.values())ae(t,e);return!0}function ne(e,t){const a=e.container.getProvider("heartbeat").getImmediate({optional:!0});return a&&a.triggerHeartbeat(),e.container.getProvider(t)}const ie=new g("app","Firebase",{"no-app":"No Firebase App '{$appName}' has been created - call Firebase App.initializeApp()","bad-app-name":"Illegal App name: '{$appName}","duplicate-app":"Firebase App named '{$appName}' already exists with different options or config","app-deleted":"Firebase App named '{$appName}' already deleted","no-options":"Need to provide options, when not being deployed to hosting via source.","invalid-app-argument":"firebase.{$appName}() takes either no argument or a Firebase App instance.","invalid-log-argument":"First argument to `onLog` must be null or a function.","idb-open":"Error thrown when opening IndexedDB. Original error: {$originalErrorMessage}.","idb-get":"Error thrown when reading from IndexedDB. Original error: {$originalErrorMessage}.","idb-set":"Error thrown when writing to IndexedDB. Original error: {$originalErrorMessage}.","idb-delete":"Error thrown when deleting from IndexedDB. Original error: {$originalErrorMessage}."});class re{constructor(e,t,a){this._isDeleted=!1,this._options=Object.assign({},e),this._config=Object.assign({},t),this._name=t.name,this._automaticDataCollectionEnabled=t.automaticDataCollectionEnabled,this._container=a,this.container.addComponent(new y("app",(()=>this),"PUBLIC"))}get automaticDataCollectionEnabled(){return this.checkDestroyed(),this._automaticDataCollectionEnabled}set automaticDataCollectionEnabled(e){this.checkDestroyed(),this._automaticDataCollectionEnabled=e}get name(){return this.checkDestroyed(),this._name}get options(){return this.checkDestroyed(),this._options}get config(){return this.checkDestroyed(),this._config}get container(){return this._container}get isDeleted(){return this._isDeleted}set isDeleted(e){this._isDeleted=e}checkDestroyed(){if(this.isDeleted)throw ie.create("app-deleted",{appName:this._name})}}function oe(e,t={}){let a=e;if("object"!=typeof t){t={name:t}}const s=Object.assign({name:Q,automaticDataCollectionEnabled:!1},t),n=s.name;if("string"!=typeof n||!n)throw ie.create("bad-app-name",{appName:String(n)});var i;if(a||(a=null===(i=c())||void 0===i?void 0:i.config),!a)throw ie.create("no-options");const r=ee.get(n);if(r){if(v(a,r.options)&&v(s,r.config))return r;throw ie.create("duplicate-app",{appName:n})}const o=new w(n);for(const e of te.values())o.addComponent(e);const d=new re(a,s,o);return ee.set(n,d),d}function de(e,t,a){var s;let n=null!==(s=J[e])&&void 0!==s?s:e;a&&(n+=`-${a}`);const i=n.match(/\s|\//),r=t.match(/\s|\//);if(i||r){const e=[`Unable to register library "${n}" with version "${t}":`];return i&&e.push(`library name "${n}" contains illegal characters (whitespace or "/")`),i&&r&&e.push("and"),r&&e.push(`version name "${t}" contains illegal characters (whitespace or "/")`),void X.warn(e.join(" "))}se(new y(`${n}-version`,(()=>({library:n,version:t})),"VERSION"))}const le="firebase-heartbeat-store";let ce=null;function he(){return ce||(ce=H("firebase-heartbeat-database",1,{upgrade:(e,t)=>{if(0===t)e.createObjectStore(le)}}).catch((e=>{throw ie.create("idb-open",{originalErrorMessage:e.message})}))),ce}async function pe(e,t){try{const a=(await he()).transaction(le,"readwrite"),s=a.objectStore(le);return await s.put(t,ue(e)),a.done}catch(e){if(e instanceof m)X.warn(e.message);else{const t=ie.create("idb-set",{originalErrorMessage:null==e?void 0:e.message});X.warn(t.message)}}}function ue(e){return`${e.name}!${e.options.appId}`}class me{constructor(e){this.container=e,this._heartbeatsCache=null;const t=this.container.getProvider("app").getImmediate();this._storage=new fe(t),this._heartbeatsCachePromise=this._storage.read().then((e=>(this._heartbeatsCache=e,e)))}async triggerHeartbeat(){const e=this.container.getProvider("platform-logger").getImmediate().getPlatformInfoString(),t=ge();if(null===this._heartbeatsCache&&(this._heartbeatsCache=await this._heartbeatsCachePromise),this._heartbeatsCache.lastSentHeartbeatDate!==t&&!this._heartbeatsCache.heartbeats.some((e=>e.date===t)))return this._heartbeatsCache.heartbeats.push({date:t,agent:e}),this._heartbeatsCache.heartbeats=this._heartbeatsCache.heartbeats.filter((e=>{const t=new Date(e.date).valueOf();return Date.now()-t<=2592e6})),this._storage.overwrite(this._heartbeatsCache)}async getHeartbeatsHeader(){if(null===this._heartbeatsCache&&await this._heartbeatsCachePromise,null===this._heartbeatsCache||0===this._heartbeatsCache.heartbeats.length)return"";const e=ge(),{heartbeatsToSend:t,unsentEntries:a}=function(e,t=1024){const a=[];let s=e.slice();for(const n of e){const e=a.find((e=>e.agent===n.agent));if(e){if(e.dates.push(n.date),ve(a)>t){e.dates.pop();break}}else if(a.push({agent:n.agent,dates:[n.date]}),ve(a)>t){a.pop();break}s=s.slice(1)}return{heartbeatsToSend:a,unsentEntries:s}}(this._heartbeatsCache.heartbeats),s=o(JSON.stringify({version:2,heartbeats:t}));return this._heartbeatsCache.lastSentHeartbeatDate=e,a.length>0?(this._heartbeatsCache.heartbeats=a,await this._storage.overwrite(this._heartbeatsCache)):(this._heartbeatsCache.heartbeats=[],this._storage.overwrite(this._heartbeatsCache)),s}}function ge(){return(new Date).toISOString().substring(0,10)}class fe{constructor(e){this.app=e,this._canUseIndexedDBPromise=this.runIndexedDBEnvironmentCheck()}async runIndexedDBEnvironmentCheck(){return!!p()&&u().then((()=>!0)).catch((()=>!1))}async read(){if(await this._canUseIndexedDBPromise){return await async function(e){try{return(await he()).transaction(le).objectStore(le).get(ue(e))}catch(e){if(e instanceof m)X.warn(e.message);else{const t=ie.create("idb-get",{originalErrorMessage:null==e?void 0:e.message});X.warn(t.message)}}}(this.app)||{heartbeats:[]}}return{heartbeats:[]}}async overwrite(e){var t;if(await this._canUseIndexedDBPromise){const a=await this.read();return pe(this.app,{lastSentHeartbeatDate:null!==(t=e.lastSentHeartbeatDate)&&void 0!==t?t:a.lastSentHeartbeatDate,heartbeats:e.heartbeats})}}async add(e){var t;if(await this._canUseIndexedDBPromise){const a=await this.read();return pe(this.app,{lastSentHeartbeatDate:null!==(t=e.lastSentHeartbeatDate)&&void 0!==t?t:a.lastSentHeartbeatDate,heartbeats:[...a.heartbeats,...e.heartbeats]})}}}function ve(e){return o(JSON.stringify({version:2,heartbeats:e})).length}var $e;$e="",se(new y("platform-logger",(e=>new z(e)),"PRIVATE")),se(new y("heartbeat",(e=>new me(e)),"PRIVATE")),de(Z,Y,$e),de(Z,Y,"esm2017"),de("fire-js","");de("firebase","9.16.0","app");const be="@firebase/installations",ye="0.6.1",Ee=1e4,Ce=`w:${ye}`,we="FIS_v2",Se=36e5,Me=new g("installations","Installations",{"missing-app-config-values":'Missing App configuration value: "{$valueName}"',"not-registered":"Firebase Installation is not registered.","installation-not-found":"Firebase Installation not found.","request-failed":'{$requestName} request failed with error "{$serverCode} {$serverStatus}: {$serverMessage}"',"app-offline":"Could not process request. Application offline.","delete-pending-registration":"Can't delete installation while there is a pending registration request."});function _e(e){return e instanceof m&&e.code.includes("request-failed")}function Te({projectId:e}){return`https://firebaseinstallations.googleapis.com/v1/projects/${e}/installations`}function Ne(e){return{token:e.token,requestStatus:2,expiresIn:(t=e.expiresIn,Number(t.replace("s","000"))),creationTime:Date.now()};var t}async function ke(e,t){const a=(await t.json()).error;return Me.create("request-failed",{requestName:e,serverCode:a.code,serverMessage:a.message,serverStatus:a.status})}function Ae({apiKey:e}){return new Headers({"Content-Type":"application/json",Accept:"application/json","x-goog-api-key":e})}function Pe(e,{refreshToken:t}){const a=Ae(e);return a.append("Authorization",function(e){return`${we} ${e}`}(t)),a}async function De(e){const t=await e();return t.status>=500&&t.status<600?e():t}function Ie(e){return new Promise((t=>{setTimeout(t,e)}))}const Re=/^[cdef][\w-]{21}$/;function Fe(){try{const e=new Uint8Array(17);(self.crypto||self.msCrypto).getRandomValues(e),e[0]=112+e[0]%16;const t=function(e){const t=(a=e,btoa(String.fromCharCode(...a)).replace(/\+/g,"-").replace(/\//g,"_"));var a;return t.substr(0,22)}(e);return Re.test(t)?t:""}catch(e){return""}}function xe(e){return`${e.appName}!${e.appId}`}const Oe=new Map;function Ue(e,t){const a=xe(e);Le(a,t),function(e,t){const a=je();a&&a.postMessage({key:e,fid:t});He()}(a,t)}function Le(e,t){const a=Oe.get(e);if(a)for(const e of a)e(t)}let Be=null;function je(){return!Be&&"BroadcastChannel"in self&&(Be=new BroadcastChannel("[Firebase] FID Change"),Be.onmessage=e=>{Le(e.data.key,e.data.fid)}),Be}function He(){0===Oe.size&&Be&&(Be.close(),Be=null)}const Ve="firebase-installations-store";let qe=null;function Ge(){return qe||(qe=H("firebase-installations-database",1,{upgrade:(e,t)=>{if(0===t)e.createObjectStore(Ve)}})),qe}async function We(e,t){const a=xe(e),s=(await Ge()).transaction(Ve,"readwrite"),n=s.objectStore(Ve),i=await n.get(a);return await n.put(t,a),await s.done,i&&i.fid===t.fid||Ue(e,t.fid),t}async function Ke(e){const t=xe(e),a=(await Ge()).transaction(Ve,"readwrite");await a.objectStore(Ve).delete(t),await a.done}async function ze(e,t){const a=xe(e),s=(await Ge()).transaction(Ve,"readwrite"),n=s.objectStore(Ve),i=await n.get(a),r=t(i);return void 0===r?await n.delete(a):await n.put(r,a),await s.done,!r||i&&i.fid===r.fid||Ue(e,r.fid),r}async function Ze(e){let t;const a=await ze(e.appConfig,(a=>{const s=function(e){const t=e||{fid:Fe(),registrationStatus:0};return Qe(t)}(a),n=function(e,t){if(0===t.registrationStatus){if(!navigator.onLine){return{installationEntry:t,registrationPromise:Promise.reject(Me.create("app-offline"))}}const a={fid:t.fid,registrationStatus:1,registrationTime:Date.now()},s=async function(e,t){try{const a=await async function({appConfig:e,heartbeatServiceProvider:t},{fid:a}){const s=Te(e),n=Ae(e),i=t.getImmediate({optional:!0});if(i){const e=await i.getHeartbeatsHeader();e&&n.append("x-firebase-client",e)}const r={fid:a,authVersion:we,appId:e.appId,sdkVersion:Ce},o={method:"POST",headers:n,body:JSON.stringify(r)},d=await De((()=>fetch(s,o)));if(d.ok){const e=await d.json();return{fid:e.fid||a,registrationStatus:2,refreshToken:e.refreshToken,authToken:Ne(e.authToken)}}throw await ke("Create Installation",d)}(e,t);return We(e.appConfig,a)}catch(a){throw _e(a)&&409===a.customData.serverCode?await Ke(e.appConfig):await We(e.appConfig,{fid:t.fid,registrationStatus:0}),a}}(e,a);return{installationEntry:a,registrationPromise:s}}return 1===t.registrationStatus?{installationEntry:t,registrationPromise:Ye(e)}:{installationEntry:t}}(e,s);return t=n.registrationPromise,n.installationEntry}));return""===a.fid?{installationEntry:await t}:{installationEntry:a,registrationPromise:t}}async function Ye(e){let t=await Xe(e.appConfig);for(;1===t.registrationStatus;)await Ie(100),t=await Xe(e.appConfig);if(0===t.registrationStatus){const{installationEntry:t,registrationPromise:a}=await Ze(e);return a||t}return t}function Xe(e){return ze(e,(e=>{if(!e)throw Me.create("installation-not-found");return Qe(e)}))}function Qe(e){return 1===(t=e).registrationStatus&&t.registrationTime+Eefetch(s,o)));if(d.ok){return Ne(await d.json())}throw await ke("Generate Auth Token",d)}async function et(e,t=!1){let a;const s=await ze(e.appConfig,(s=>{if(!at(s))throw Me.create("not-registered");const n=s.authToken;if(!t&&function(e){return 2===e.requestStatus&&!function(e){const t=Date.now();return t{if(!at(e))throw Me.create("not-registered");const t=e.authToken;return 1===(a=t).requestStatus&&a.requestTime+Ee{const t=ne(e.getProvider("app").getImmediate(),it).getImmediate();return{getId:()=>async function(e){const t=e,{installationEntry:a,registrationPromise:s}=await Ze(t);return s?s.catch(console.error):et(t).catch(console.error),a.fid}(t),getToken:e=>st(t,e)}};se(new y(it,(e=>{const t=e.getProvider("app").getImmediate(),a=function(e){if(!e||!e.options)throw nt("App Configuration");if(!e.name)throw nt("App Name");const t=["projectId","apiKey","appId"];for(const a of t)if(!e.options[a])throw nt(a);return{appName:e.name,projectId:e.options.projectId,apiKey:e.options.apiKey,appId:e.options.appId}}(t);return{app:t,appConfig:a,heartbeatServiceProvider:ne(t,"heartbeat"),_delete:()=>Promise.resolve()}}),"PUBLIC")),se(new y("installations-internal",rt,"PRIVATE")),de(be,ye),de(be,ye,"esm2017");const ot="BDOU99-h67HcA6JeFXHbSNMu7e2yNNu3RzoMj8TM4W88jITfq7ZmPvIM1Iv-4_l2LxQcYwhqby2xGpWwzjfAnG4",dt="google.c.a.c_id";var lt,ct;function ht(e){const t=new Uint8Array(e);return btoa(String.fromCharCode(...t)).replace(/=/g,"").replace(/\+/g,"-").replace(/\//g,"_")}function pt(e){const t=(e+"=".repeat((4-e.length%4)%4)).replace(/\-/g,"+").replace(/_/g,"/"),a=atob(t),s=new Uint8Array(a.length);for(let e=0;e{if(0===t)e.createObjectStore(gt)}})),ft}async function $t(e){const t=yt(e),a=await vt(),s=await a.transaction(gt).objectStore(gt).get(t);if(s)return s;{const t=await async function(e){if("databases"in indexedDB){const e=(await indexedDB.databases()).map((e=>e.name));if(!e.includes(ut))return null}let t=null;return(await H(ut,5,{upgrade:async(a,s,n,i)=>{var r;if(s<2)return;if(!a.objectStoreNames.contains(mt))return;const o=i.objectStore(mt),d=await o.index("fcmSenderId").get(e);if(await o.clear(),d)if(2===s){const e=d;if(!e.auth||!e.p256dh||!e.endpoint)return;t={token:e.fcmToken,createTime:null!==(r=e.createTime)&&void 0!==r?r:Date.now(),subscriptionOptions:{auth:e.auth,p256dh:e.p256dh,endpoint:e.endpoint,swScope:e.swScope,vapidKey:"string"==typeof e.vapidKey?e.vapidKey:ht(e.vapidKey)}}}else if(3===s){const e=d;t={token:e.fcmToken,createTime:e.createTime,subscriptionOptions:{auth:ht(e.auth),p256dh:ht(e.p256dh),endpoint:e.endpoint,swScope:e.swScope,vapidKey:ht(e.vapidKey)}}}else if(4===s){const e=d;t={token:e.fcmToken,createTime:e.createTime,subscriptionOptions:{auth:ht(e.auth),p256dh:ht(e.p256dh),endpoint:e.endpoint,swScope:e.swScope,vapidKey:ht(e.vapidKey)}}}}})).close(),await V(ut),await V("fcm_vapid_details_db"),await V("undefined"),function(e){if(!e||!e.subscriptionOptions)return!1;const{subscriptionOptions:t}=e;return"number"==typeof e.createTime&&e.createTime>0&&"string"==typeof e.token&&e.token.length>0&&"string"==typeof t.auth&&t.auth.length>0&&"string"==typeof t.p256dh&&t.p256dh.length>0&&"string"==typeof t.endpoint&&t.endpoint.length>0&&"string"==typeof t.swScope&&t.swScope.length>0&&"string"==typeof t.vapidKey&&t.vapidKey.length>0}(t)?t:null}(e.appConfig.senderId);if(t)return await bt(e,t),t}}async function bt(e,t){const a=yt(e),s=(await vt()).transaction(gt,"readwrite");return await s.objectStore(gt).put(t,a),await s.done,t}function yt({appConfig:e}){return e.appId}const Et=new g("messaging","Messaging",{"missing-app-config-values":'Missing App configuration value: "{$valueName}"',"only-available-in-window":"This method is available in a Window context.","only-available-in-sw":"This method is available in a service worker context.","permission-default":"The notification permission was not granted and dismissed instead.","permission-blocked":"The notification permission was not granted and blocked instead.","unsupported-browser":"This browser doesn't support the API's required to use the Firebase SDK.","indexed-db-unsupported":"This browser doesn't support indexedDb.open() (ex. Safari iFrame, Firefox Private Browsing, etc)","failed-service-worker-registration":"We are unable to register the default service worker. {$browserErrorMessage}","token-subscribe-failed":"A problem occurred while subscribing the user to FCM: {$errorInfo}","token-subscribe-no-token":"FCM returned no token when subscribing the user to push.","token-unsubscribe-failed":"A problem occurred while unsubscribing the user from FCM: {$errorInfo}","token-update-failed":"A problem occurred while updating the user from FCM: {$errorInfo}","token-update-no-token":"FCM returned no token when updating the user to push.","use-sw-after-get-token":"The useServiceWorker() method may only be called once and must be called before calling getToken() to ensure your service worker is used.","invalid-sw-registration":"The input to useServiceWorker() must be a ServiceWorkerRegistration.","invalid-bg-handler":"The input to setBackgroundMessageHandler() must be a function.","invalid-vapid-key":"The public VAPID key must be a string.","use-vapid-key-after-get-token":"The usePublicVapidKey() method may only be called once and must be called before calling getToken() to ensure your VAPID key is used."});async function Ct(e,t){const a={method:"DELETE",headers:await St(e)};try{const s=await fetch(`${wt(e.appConfig)}/${t}`,a),n=await s.json();if(n.error){const e=n.error.message;throw Et.create("token-unsubscribe-failed",{errorInfo:e})}}catch(e){throw Et.create("token-unsubscribe-failed",{errorInfo:null==e?void 0:e.toString()})}}function wt({projectId:e}){return`https://fcmregistrations.googleapis.com/v1/projects/${e}/registrations`}async function St({appConfig:e,installations:t}){const a=await t.getToken();return new Headers({"Content-Type":"application/json",Accept:"application/json","x-goog-api-key":e.apiKey,"x-goog-firebase-installations-auth":`FIS ${a}`})}function Mt({p256dh:e,auth:t,endpoint:a,vapidKey:s}){const n={web:{endpoint:a,auth:t,p256dh:e}};return s!==ot&&(n.web.applicationPubKey=s),n}async function _t(e){const t=await async function(e,t){const a=await e.pushManager.getSubscription();if(a)return a;return e.pushManager.subscribe({userVisibleOnly:!0,applicationServerKey:pt(t)})}(e.swRegistration,e.vapidKey),a={vapidKey:e.vapidKey,swScope:e.swRegistration.scope,endpoint:t.endpoint,auth:ht(t.getKey("auth")),p256dh:ht(t.getKey("p256dh"))},s=await $t(e.firebaseDependencies);if(s){if(function(e,t){const a=t.vapidKey===e.vapidKey,s=t.endpoint===e.endpoint,n=t.auth===e.auth,i=t.p256dh===e.p256dh;return a&&s&&n&&i}(s.subscriptionOptions,a))return Date.now()>=s.createTime+6048e5?async function(e,t){try{const a=await async function(e,t){const a=await St(e),s=Mt(t.subscriptionOptions),n={method:"PATCH",headers:a,body:JSON.stringify(s)};let i;try{const a=await fetch(`${wt(e.appConfig)}/${t.token}`,n);i=await a.json()}catch(e){throw Et.create("token-update-failed",{errorInfo:null==e?void 0:e.toString()})}if(i.error){const e=i.error.message;throw Et.create("token-update-failed",{errorInfo:e})}if(!i.token)throw Et.create("token-update-no-token");return i.token}(e.firebaseDependencies,t),s=Object.assign(Object.assign({},t),{token:a,createTime:Date.now()});return await bt(e.firebaseDependencies,s),a}catch(t){throw await Tt(e),t}}(e,{token:s.token,createTime:Date.now(),subscriptionOptions:a}):s.token;try{await Ct(e.firebaseDependencies,s.token)}catch(e){console.warn(e)}return Nt(e.firebaseDependencies,a)}return Nt(e.firebaseDependencies,a)}async function Tt(e){const t=await $t(e.firebaseDependencies);t&&(await Ct(e.firebaseDependencies,t.token),await async function(e){const t=yt(e),a=(await vt()).transaction(gt,"readwrite");await a.objectStore(gt).delete(t),await a.done}(e.firebaseDependencies));const a=await e.swRegistration.pushManager.getSubscription();return!a||a.unsubscribe()}async function Nt(e,t){const a=await async function(e,t){const a=await St(e),s=Mt(t),n={method:"POST",headers:a,body:JSON.stringify(s)};let i;try{const t=await fetch(wt(e.appConfig),n);i=await t.json()}catch(e){throw Et.create("token-subscribe-failed",{errorInfo:null==e?void 0:e.toString()})}if(i.error){const e=i.error.message;throw Et.create("token-subscribe-failed",{errorInfo:e})}if(!i.token)throw Et.create("token-subscribe-no-token");return i.token}(e,t),s={token:a,createTime:Date.now(),subscriptionOptions:t};return await bt(e,s),s.token}function kt(e){const t={from:e.from,collapseKey:e.collapse_key,messageId:e.fcmMessageId};return function(e,t){if(!t.notification)return;e.notification={};const a=t.notification.title;a&&(e.notification.title=a);const s=t.notification.body;s&&(e.notification.body=s);const n=t.notification.image;n&&(e.notification.image=n);const i=t.notification.icon;i&&(e.notification.icon=i)}(t,e),function(e,t){if(!t.data)return;e.data=t.data}(t,e),function(e,t){var a,s,n,i,r;if(!t.fcmOptions&&!(null===(a=t.notification)||void 0===a?void 0:a.click_action))return;e.fcmOptions={};const o=null!==(n=null===(s=t.fcmOptions)||void 0===s?void 0:s.link)&&void 0!==n?n:null===(i=t.notification)||void 0===i?void 0:i.click_action;o&&(e.fcmOptions.link=o);const d=null===(r=t.fcmOptions)||void 0===r?void 0:r.analytics_label;d&&(e.fcmOptions.analyticsLabel=d)}(t,e),t}function At(e,t){const a=[];for(let s=0;s{}))}catch(e){throw Et.create("failed-service-worker-registration",{browserErrorMessage:null==e?void 0:e.message})}}async function Rt(e,t){if(!navigator)throw Et.create("only-available-in-window");if("default"===Notification.permission&&await Notification.requestPermission(),"granted"!==Notification.permission)throw Et.create("permission-blocked");return await async function(e,t){t?e.vapidKey=t:e.vapidKey||(e.vapidKey=ot)}(e,null==t?void 0:t.vapidKey),await async function(e,t){if(t||e.swRegistration||await It(e),t||!e.swRegistration){if(!(t instanceof ServiceWorkerRegistration))throw Et.create("invalid-sw-registration");e.swRegistration=t}}(e,null==t?void 0:t.serviceWorkerRegistration),_t(e)}async function Ft(e,t,a){const s=function(e){switch(e){case ct.NOTIFICATION_CLICKED:return"notification_open";case ct.PUSH_RECEIVED:return"notification_foreground";default:throw new Error}}(t);(await e.firebaseDependencies.analyticsProvider.get()).logEvent(s,{message_id:a[dt],message_name:a["google.c.a.c_l"],message_time:a["google.c.a.ts"],message_device_time:Math.floor(Date.now()/1e3)})}async function xt(e,t){const a=t.data;if(!a.isFirebaseMessaging)return;e.onMessageHandler&&a.messageType===ct.PUSH_RECEIVED&&("function"==typeof e.onMessageHandler?e.onMessageHandler(kt(a)):e.onMessageHandler.next(kt(a)));const s=a.data;var n;"object"==typeof(n=s)&&n&&dt in n&&"1"===s["google.c.a.e"]&&await Ft(e,a.messageType,s)}const Ot="@firebase/messaging",Ut="0.12.1",Lt=e=>{const t=e.getProvider("messaging").getImmediate();return{getToken:e=>Rt(t,e)}};async function Bt(){try{await u()}catch(e){return!1}return"undefined"!=typeof window&&p()&&!("undefined"==typeof navigator||!navigator.cookieEnabled)&&"serviceWorker"in navigator&&"PushManager"in window&&"Notification"in window&&"fetch"in window&&ServiceWorkerRegistration.prototype.hasOwnProperty("showNotification")&&PushSubscription.prototype.hasOwnProperty("getKey")}function jt(e=function(e=Q){const t=ee.get(e);if(!t&&e===Q)return oe();if(!t)throw ie.create("no-app",{appName:e});return t}()){return Bt().then((e=>{if(!e)throw Et.create("unsupported-browser")}),(e=>{throw Et.create("indexed-db-unsupported")})),ne(b(e),"messaging").getImmediate()}async function Ht(e,t){return Rt(e=b(e),t)}function Vt(e){return async function(e){if(!navigator)throw Et.create("only-available-in-window");return e.swRegistration||await It(e),Tt(e)}(e=b(e))}function qt(e,t){return function(e,t){if(!navigator)throw Et.create("only-available-in-window");return e.onMessageHandler=t,()=>{e.onMessageHandler=null}}(e=b(e),t)}se(new y("messaging",(e=>{const t=new Dt(e.getProvider("app").getImmediate(),e.getProvider("installations-internal").getImmediate(),e.getProvider("analytics-internal"));return navigator.serviceWorker.addEventListener("message",(e=>xt(t,e))),t}),"PUBLIC")),se(new y("messaging-internal",Lt,"PRIVATE")),de(Ot,Ut),de(Ot,Ut,"esm2017");const Gt=Tinode;class Wt extends t().PureComponent{render(){return t().createElement("div",{className:"alert-container"},t().createElement("div",{className:"alert"},t().createElement("div",{className:"title"},this.props.title),t().createElement("div",{className:"content"},this.props.content),t().createElement("div",{className:"dialog-buttons"},this.props.onReject?t().createElement("button",{className:"outline",onClick:this.props.onReject},this.props.reject||t().createElement(s.FormattedMessage,{id:"button_cancel",defaultMessage:[{type:0,value:"Cancel"}]})):null,this.props.onConfirm?t().createElement("button",{className:"primary",onClick:this.props.onConfirm},this.props.confirm||t().createElement(s.FormattedMessage,{id:"button_ok",defaultMessage:[{type:0,value:"OK"}]})):null)))}}var Kt=r(8962);const zt=(0,s.defineMessages)({info:{id:"menu_item_info",defaultMessage:[{type:0,value:"Info"}]},clear_messages:{id:"menu_item_clear_messages",defaultMessage:[{type:0,value:"Clear messages"}]},clear_for_all:{id:"menu_item_clear_messages_for_all",defaultMessage:[{type:0,value:"Clear for All"}]},delete:{id:"menu_item_delete",defaultMessage:[{type:0,value:"Delete"}]},delete_for_all:{id:"menu_item_delete_for_all",defaultMessage:[{type:0,value:"Delete for All"}]},send_retry:{id:"menu_item_send_retry",defaultMessage:[{type:0,value:"Retry"}]},mute:{id:"menu_item_mute",defaultMessage:[{type:0,value:"Mute"}]},unmute:{id:"menu_item_unmute",defaultMessage:[{type:0,value:"Unmute"}]},reply:{id:"menu_item_reply",defaultMessage:[{type:0,value:"Reply"}]},forward:{id:"menu_item_forward",defaultMessage:[{type:0,value:"Forward"}]},edit:{id:"menu_item_edit",defaultMessage:[{type:0,value:"Edit"}]},topic_delete:{id:"menu_item_delete_topic",defaultMessage:[{type:0,value:"Delete"}]},topic_delete_warning:{id:"topic_delete_warning",defaultMessage:[{type:0,value:"Are you sure you want to delete this conversation? It cannot be undone."}]},delete_messages_warning:{id:"delete_messages_warning",defaultMessage:[{type:0,value:"Are you sure you want to delete all messages for everyone? It cannot be undone."}]},unblock:{id:"menu_item_unblock",defaultMessage:[{type:0,value:"Unblock"}]},block:{id:"menu_item_block",defaultMessage:[{type:0,value:"Block"}]},topic_block_warning:{id:"topic_block_warning",defaultMessage:[{type:0,value:"Are you sure you want to block this conversation?"}]},member_delete:{id:"menu_item_member_delete",defaultMessage:[{type:0,value:"Remove"}]},archive:{id:"menu_item_archive_topic",defaultMessage:[{type:0,value:"Archive"}]},unarchive:{id:"menu_item_restore_topic",defaultMessage:[{type:0,value:"Restore"}]},edit_permissions:{id:"menu_item_edit_permissions",defaultMessage:[{type:0,value:"Edit permissions"}]},clear_messages_warning:{id:"clear_messages_warning",defaultMessage:[{type:0,value:"Are you sure you want to clear all messages? It cannot be undone."}]}});class Zt extends t().Component{constructor(e){super(e),this.selfRef=t().createRef();const{formatMessage:a}=e.intl;this.handlePageClick=this.handlePageClick.bind(this),this.handleEscapeKey=this.handleEscapeKey.bind(this),this.handleClick=this.handleClick.bind(this),this.MenuItems={topic_info:{id:"topic_info",title:a(zt.info),handler:null},messages_clear:{id:"messages_clear",title:a(zt.clear_messages),handler:(t,s)=>e.onShowAlert(a(zt.clear_messages),a(zt.clear_messages_warning),(e=>{this.deleteMessages(!0,!1,t,s)}),null,!0,null)},messages_clear_hard:{id:"messages_clear_hard",title:a(zt.clear_for_all),handler:(t,s)=>e.onShowAlert(a(zt.clear_for_all),a(zt.delete_messages_warning),(e=>this.deleteMessages(!0,!0,t,s)),null,!0,null)},message_delete:{id:"message_delete",title:a(zt.delete),handler:(e,t)=>this.deleteMessages(!1,!1,e,t)},message_delete_hard:{id:"message_delete_hard",title:a(zt.delete_for_all),handler:(e,t)=>this.deleteMessages(!1,!0,e,t)},menu_item_send_retry:{id:"menu_item_send_retry",title:a(zt.send_retry),handler:(e,t)=>this.retryMessage(e,t)},menu_item_reply:{id:"menu_item_reply",title:a(zt.reply),handler:(e,t)=>this.replyToMessage(e,t)},menu_item_forward:{id:"menu_item_forward",title:a(zt.forward),handler:e=>{}},menu_item_edit:{id:"menu_item_edit",title:a(zt.edit),handler:(e,t)=>this.editMessage(e,t)},topic_unmute:{id:"topic_unmute",title:a(zt.unmute),handler:this.topicPermissionSetter.bind(this,"+P")},topic_mute:{id:"topic_mute",title:a(zt.mute),handler:this.topicPermissionSetter.bind(this,"-P")},topic_unblock:{id:"topic_unblock",title:a(zt.unblock),handler:this.topicPermissionSetter.bind(this,"+JP")},topic_block:{id:"topic_block",title:a(zt.block),handler:(t,s)=>e.onShowAlert(a(zt.block),a(zt.topic_block_warning),(e=>this.topicPermissionSetter("-JP",t,s).then((e=>(this.props.onTopicRemoved(t.topicName),e)))),null,!0,null)},topic_delete:{id:"topic_delete",title:a(zt.topic_delete),handler:(t,s)=>e.onShowAlert(a(zt.topic_delete),a(zt.topic_delete_warning),(e=>{const a=this.props.tinode.getTopic(t.topicName);if(a)return a.delTopic(!0).catch((e=>{s&&s(e.message,"err")}));console.warn("Topic not found: ",t.topicName)}),null,!0,null)},topic_archive:{id:"topic_archive",title:a(zt.archive),handler:(e,t)=>{const a=this.props.tinode.getTopic(e.topicName);if(a)return a.archive(!0).catch((e=>{t&&t(e.message,"err")}));console.warn("Topic not found: ",e.topicName)}},topic_restore:{id:"topic_restore",title:a(zt.unarchive),handler:(e,t)=>{const a=this.props.tinode.getTopic(e.topicName);if(a)return a.archive(!1).catch((e=>{t&&t(e.message,"err")}));console.warn("Topic not found: ",e.topicName)}},permissions:{id:"permissions",title:a(zt.edit_permissions),handler:null},member_delete:{id:"member_delete",title:a(zt.member_delete),handler:(e,t)=>{const a=this.props.tinode.getTopic(e.topicName);if(a&&e.user)return a.delSubscription(e.user).catch((e=>{t&&t(e.message,"err")}));console.warn("Topic or user not found: '"+e.topicName+"', '"+e.user+"'")}},member_mute:{id:"member_mute",title:a(zt.mute),handler:this.topicPermissionSetter.bind(this,"-P")},member_unmute:{id:"member_unmute",title:a(zt.unmute),handler:this.topicPermissionSetter.bind(this,"+P")},member_block:{id:"member_block",title:a(zt.block),handler:this.topicPermissionSetter.bind(this,"-JP")},member_unblock:{id:"member_unblock",title:a(zt.unblock),handler:this.topicPermissionSetter.bind(this,"+JP")}}}componentDidMount(){document.addEventListener("mousedown",this.handlePageClick,!1),document.addEventListener("keyup",this.handleEscapeKey,!1)}componentWillUnmount(){document.removeEventListener("mousedown",this.handlePageClick,!1),document.removeEventListener("keyup",this.handleEscapeKey,!1)}handlePageClick(e){this.selfRef.current.contains(e.target)||(e.preventDefault(),e.stopPropagation(),this.props.hide())}handleEscapeKey(e){27===e.keyCode&&this.props.hide()}handleClick(e){e.preventDefault(),e.stopPropagation(),this.props.hide();let t=this.props.items[e.currentTarget.dataset.id];"string"==typeof t&&(t=this.MenuItems[t]),t?this.props.onAction(t.id,t.handler(this.props.params,this.props.onError),this.props.params):console.error("Invalid menu item ID",e.currentTarget.dataset.id)}deleteMessages(e,t,a,s){const n=this.props.tinode.getTopic(a.topicName);if(!n)return void console.warn("Topic not found: ",a.topicName);if(!e&&n.cancelSend(a.seq))return;return(e?n.delMessagesAll(t):a.replace>0?n.delMessagesEdits(a.replace,t):n.delMessagesList([a.seq],t)).catch((e=>{s&&s(e.message,"err")}))}retryMessage(e,t){const a=this.props.tinode.getTopic(e.topicName);if(!a||!a.flushMessage(e.seq))return;const s=a.createMessage(e.content,!1);return a.publishDraft(s).catch((e=>{t&&t(e.message,"err")}))}topicPermissionSetter(e,t,a){const s=this.props.tinode.getTopic(t.topicName);if(!s)return void console.warn("Topic not found",t.topicName);let n=s.updateMode(t.user,e);return a&&(n=n.catch((e=>a(e.message,"err")))),n}replyToMessage(e,t){e.pickReply(e.seq,e.content,e.userFrom,e.userName,t)}editMessage(e,t){e.editMessage(e.replace||e.seq,e.content,t)}render(){const e=[];let a=0;this.props.items.map((s=>{"string"==typeof s&&(s=this.MenuItems[s]),s&&s.title&&e.push("-"==s.title?t().createElement("li",{className:"separator",key:a}):t().createElement("li",{onClick:this.handleClick,"data-id":a,key:a},s.title)),a++}));const s=12*Kt.o6,n=Kt.o6*(.7+2.5*e.length),i={left:(this.props.bounds.right-this.props.clickAt.x0?(e=[],this.props.badges.map((a=>{const s=a.color?" "+a.color:"";a.icon?e.push(t().createElement("i",{className:"material-icons as-badge"+s,key:a.key||a.icon},Xt[a.icon]||a.icon)):e.push(t().createElement("span",{className:"badge"+s,key:a.key||a.name},a.name))})),t().createElement(t().Fragment,null,e)):null}}var Jt=r(3905);function ea(e){const t=document.getElementById("shortcut-icon"),a=document.head||document.getElementsByTagName("head")[0],s=document.createElement("link");s.type="image/png",s.id="shortcut-icon",s.rel="shortcut icon",s.href="img/logo32x32"+(e>0?"a":"")+".png",t&&a.removeChild(t),a.appendChild(s),document.title=(e>0?"("+e+") ":"")+"Tinode"}function ta(e,t,a,s){let n=null;if((e=e&&e.trim())&&(n={fn:e}),"string"==typeof(s=s&&s.trim())&&(n=n||{},n.note=s||Gt.Tinode.DEL_CHAR),t){n=n||{};let e=a;const s=/^data:(image\/[-a-z0-9+.]+)?(;base64)?,/i.exec(t);s?(e=s[1],n.photo={data:t.substring(t.indexOf(",")+1),ref:Gt.Tinode.DEL_CHAR}):n.photo={data:Gt.Tinode.DEL_CHAR,ref:t},n.photo.type=(e||"image/jpeg").substring("image/".length)}return n}function aa(e,t){if(e===t)return!0;if(!Array.isArray(e)||!Array.isArray(t))return!1;if(e.length!=t.length)return!1;e.sort(),t.sort();for(let a=0,s=e.length;a{e.then((e=>t?s({isCanceled:!0}):a(e)),(e=>s(t?{isCanceled:!0}:e)))})),cancel(){t=!0}}}function oa(e,t){return e&&e.substring(0,t)}class da extends t().PureComponent{render(){let e;if(!0===this.props.avatar){const a=Gt.Tinode.isGroupTopicName(this.props.topic),s=(0,Jt.Cj)(this.props.topic,a);if(this.props.topic&&this.props.title&&this.props.title.trim()){const a=this.props.title.trim().charAt(0),n="lettertile "+s+(this.props.deleted?" disabled":"");e=t().createElement("div",{className:n},t().createElement("div",null,a))}else{const n="material-icons "+s+(this.props.deleted?" disabled":"");e=a?t().createElement("i",{className:n},"group"):t().createElement("i",{className:n},"person")}}else if(this.props.avatar){const a=this.props.tinode.authorizeURL(na(this.props.avatar,"image")),s="avatar"+(this.props.deleted?" deleted":"");e=t().createElement("img",{className:s,alt:"avatar",src:a,onError:e=>{e.target.onerror=null,e.target.src="../img/broken_image.png"}})}else e=null;return e}}class la extends t().PureComponent{render(){return this.props.count>0?t().createElement("span",{className:"unread"},this.props.count>9?"9+":this.props.count):null}}var ca=r(4861);class ha extends t().PureComponent{render(){const e=["declined","disconnected","missed"].includes(this.props.callState),a="material-icons medium "+(e?"red":"green"),n=this.props.incoming?e?"call_missed":"call_received":e?"call_missed_outgoing":"call_made";let i;if(e)switch(this.props.callState){case"declined":i=t().createElement(s.FormattedMessage,{id:"call_declined",defaultMessage:[{type:0,value:"declined"}]});break;case"missed":i=this.props.incoming?t().createElement(s.FormattedMessage,{id:"call_missed",defaultMessage:[{type:0,value:"missed"}]}):t().createElement(s.FormattedMessage,{id:"call_cancelled",defaultMessage:[{type:0,value:"cancelled"}]});break;default:i=t().createElement(s.FormattedMessage,{id:"call_disconnected",defaultMessage:[{type:0,value:"disconnected"}]})}else i=t().createElement("span",null,(0,Jt.nH)(this.props.duration/1e3));return t().createElement("div",{className:"call-message"},t().createElement("div",null,t().createElement("i",{className:"material-icons big gray"},"call")),t().createElement("div",{className:"flex-column narrow"},t().createElement("div",null,this.props.incoming?t().createElement(s.FormattedMessage,{id:"calls_incoming",defaultMessage:[{type:0,value:"Incoming call"}]}):t().createElement(s.FormattedMessage,{id:"calls_outgoing",defaultMessage:[{type:0,value:"Outgoing call"}]})),t().createElement("div",{className:"duration"},t().createElement("i",{className:a},n)," ",i)))}}class pa extends t().PureComponent{render(){const e=["declined","disconnected","missed"].includes(this.props.callState),a=this.props.incoming?e?"call_missed":"call_received":e?"call_missed_outgoing":"call_made";let n;if(e)switch(this.props.callState){case"declined":n=t().createElement(s.FormattedMessage,{id:"call_declined",defaultMessage:[{type:0,value:"declined"}]});break;case"missed":n=this.props.incoming?t().createElement(s.FormattedMessage,{id:"call_missed",defaultMessage:[{type:0,value:"missed"}]}):t().createElement(s.FormattedMessage,{id:"call_cancelled",defaultMessage:[{type:0,value:"cancelled"}]});break;default:n=t().createElement(s.FormattedMessage,{id:"call_disconnected",defaultMessage:[{type:0,value:"disconnected"}]})}else n=["accepted","started"].includes(this.props.callState)&&!this.props.duration?t().createElement(s.FormattedMessage,{id:"call_in_progress",defaultMessage:[{type:0,value:"in progress"}]}):t().createElement("span",null,(0,Jt.nH)(this.props.duration/1e3));return t().createElement(t().Fragment,null,t().createElement("div",{className:"composed-material"},t().createElement("i",{className:"material-icons"},"call"),t().createElement("i",{className:"material-icons second"},a))," ",n)}}class ua extends t().PureComponent{constructor(e){super(e),this.videoRef=t().createRef(),this.handleClick=this.handleClick.bind(this)}handleClick(e){this.props.onClick&&this.props.onClick(e)}render(){const e=(0,Jt.nH)(this.props["data-duration"]/1e3),a="inline-video"+(this.props.onClick?" image-clickable":"");return t().createElement("div",{className:a},t().createElement("img",this.props),this.props.onClick?t().createElement("div",{className:"play-control"},t().createElement("i",{className:"material-icons white bigger"},"play_arrow")):null,e?t().createElement("div",{className:"duration"},e):null)}}class ma extends t().PureComponent{constructor(e){super(e),this.state={src:this.props.isvideo?"img/blankvid.png":"img/blankimg.png",style:Object.assign({padding:"4px"},this.props.style),className:this.props.className,alt:this.props.alt,onClick:this.props.onClick}}componentDidMount(){this.props.whenDone.promise.then((e=>this.setState({src:e.src,style:{...this.state.style,padding:0}}))).catch((e=>this.setState({src:this.props.isvideo?"img/broken_video.png":"img/broken_image.png"})))}componentWillUnmount(){this.props.whenDone.cancel()}componentDidUpdate(e){e.whenDone!=this.props.whenDone&&(this.setState({src:this.props.isvideo?"img/blankvid.png":"img/blankimg.png",style:{...this.state.style,padding:"4px"}}),this.props.whenDone.promise.then((e=>this.setState({src:e.src,style:{...this.state.style,padding:0}}))).catch((e=>this.setState({src:this.props.isvideo?"img/broken_video.png":"img/broken_image.png"}))))}render(){return t().createElement("img",this.state)}}class ga extends t().PureComponent{render(){return t().createElement("div",{className:"uploader"},t().createElement("div",null,t().createElement("span",{style:{width:100*this.props.progress+"%"}})),this.props.progress<.999?t().createElement("a",{href:"#",onClick:e=>{e.preventDefault(),this.props.onCancel()}},t().createElement("i",{className:"material-icons"},"close")," ",t().createElement(s.FormattedMessage,{id:"action_cancel",defaultMessage:[{type:0,value:"cancel"}]})):t().createElement(s.FormattedMessage,{id:"upload_finishing",defaultMessage:[{type:0,value:"finishing..."}]}))}}class fa extends t().PureComponent{constructor(e){super(e)}render(){return t().createElement("div",{className:"inline-image"},t().createElement("img",this.props),t().createElement("div",{className:"rounded-container"},t().createElement(ga,{progress:this.props.progress,onCancel:this.props.onCancelUpload})))}}var va=r(8405);const $a=(0,s.defineMessages)({drafty_form:{id:"drafty_form",defaultMessage:[{type:0,value:"Form:"}]},drafty_attachment:{id:"drafty_attachment",defaultMessage:[{type:0,value:"Attachment"}]},drafty_image:{id:"drafty_image",defaultMessage:[{type:0,value:"Picture"}]},drafty_video:{id:"drafty_video",defaultMessage:[{type:0,value:"Video recording"}]},drafty_unknown:{id:"drafty_unknown",defaultMessage:[{type:0,value:"Unsupported"}]}});function ba(e,a,s,n,i){if(i.includes("QQ"))return Ma.call(this,e,a,s,n);if(!e)return s;let r=Gt.Drafty.tagName(e),o=Gt.Drafty.attrValue(e,a)||{};switch(o.key=n,e){case"AU":o.src&&(o.src=this.authorizeURL(na(o.src,"audio")),o.duration=a.duration>0?0|a.duration:void 0,o.preview=a.preview,o.loading="lazy"),r=ca.Z,s=null;break;case"BR":s=null;break;case"EX":case"RW":break;case"HL":o.className="highlight";break;case"HD":r=null,s=null;break;case"IM":r=ya.call(this,r,a,o),s=null;break;case"BN":o.onClick=this.onFormButtonClick;let e=t().Children.map(s,(e=>"string"==typeof e?e:void 0));e&&0!=e.length||(e=[o.name]),o["data-title"]=e.join("");break;case"MN":o.className="mention",a&&(o.className+=" "+(0,Jt.Cj)(a.val,!1,!0));break;case"FM":o.className="bot-form";break;case"QQ":o.className="reply-quote",o.onClick=this.onQuoteClick;break;case"VC":r=ha,s=null,a&&(o.callState=a.state,o.incoming=a.incoming,o.duration=a.duration);break;case"VD":r=Ea.call(this,r,a,o),s=null;break;default:if(!r){r=t().Fragment,o={key:n};let e=s;Array.isArray(s)&&s.join("").trim()||(e=[t().createElement("span",{key:"x1",className:"gray"},this.formatMessage($a.drafty_unknown))]),s=[t().createElement("i",{key:"x0",className:"material-icons gray"},"extension")," "].concat(e)}}return r?t().createElement(r,o,s):s}function ya(e,t,a){if(!t)return a.src="img/broken_image.png",a.style={width:Kt.$_+"px",height:Kt.$_+"px"},e;a.className="inline-image";const s=(0,va.rS)(t.width,t.height,this.viewportWidth>0?Math.min(this.viewportWidth-6.5*Kt.o6,34.5*Kt.o6):34.5*Kt.o6,24*Kt.o6,!1)||{dstWidth:Kt.sA,dstHeight:Kt.sA};return a.style={width:s.dstWidth+"px",height:s.dstHeight+"px",minWidth:s.dstWidth+"px",minHeight:s.dstHeight+"px"},Gt.Drafty.isProcessing(t)?e=fa:(a.src=this.authorizeURL(na(a.src,"image")),a.alt=t.name,a.src?(Math.max(t.width||0,t.height||0)>Kt.$_&&(a.onClick=this.onImagePreview,a.className+=" image-clickable"),a.loading="lazy"):a.src=null),e}function Ea(e,t,a){if(!t)return a.src="img/broken_video.png",a.style={width:Kt.$_+"px",height:Kt.$_+"px"},e;a.className="inline-image";const s=(0,va.rS)(t.width,t.height,this.viewportWidth>0?Math.min(this.viewportWidth-6.5*Kt.o6,34.5*Kt.o6):34.5*Kt.o6,24*Kt.o6,!1)||{dstWidth:Kt.wO,dstHeight:Kt.wO};return a.style={width:s.dstWidth+"px",height:s.dstHeight+"px",minWidth:s.dstWidth+"px",minHeight:s.dstHeight+"px"},Gt.Drafty.isProcessing(t)?e=fa:(a.src=this.authorizeURL(na(a.src,"image")),a.alt=t.name,t.ref||t.val?(a.onClick=this.onVideoPreview,a.loading="lazy"):a.src=null,e=ua),e}function Ca(e,a,s,n){if(!e)return s;let i=Gt.Drafty.tagName(e);const r={key:n};switch(e){case"AU":i=t().Fragment,s=[t().createElement("i",{key:"au",className:"material-icons"},"mic")," ",(0,Jt.nH)(a.duration/1e3)];break;case"BR":i=t().Fragment,s=[" "];break;case"HL":r.className="highlight preview";break;case"LN":case"MN":i="span";break;case"IM":i=t().Fragment,s=[t().createElement("i",{key:"im",className:"material-icons"},"photo")," ",this.formatMessage($a.drafty_image)];break;case"BN":i="span",r.className="flat-button faux";break;case"FM":i=t().Fragment,s=[t().createElement("i",{key:"fm",className:"material-icons"},"dashboard"),this.formatMessage($a.drafty_form)].concat(" ",s||[]);break;case"RW":i=t().Fragment;break;case"EX":if(a){if("application/json"==a.mime)return null;delete a.val,delete a.ref}i=t().Fragment,s=[t().createElement("i",{key:"ex",className:"material-icons"},"attachment")," ",this.formatMessage($a.drafty_attachment)];break;case"VC":i=pa,a&&(r.callState=a.state,r.incoming=a.incoming,r.duration=a.duration),s=null;break;case"QQ":case"HD":i=null,s=null;break;case"VD":i=t().Fragment,s=[t().createElement("i",{key:"im",className:"material-icons"},"play_circle_outline")," ",this.formatMessage($a.drafty_video)];break;default:i||(i=t().Fragment,s=[t().createElement("i",{key:"x0",className:"material-icons gray"},"extension")," ",this.formatMessage($a.drafty_unknown)])}return i?t().createElement(i,r,s):s}function wa(e,t){return e.style={width:Kt.$_+"px",height:Kt.$_+"px",maxWidth:Kt.$_+"px",maxHeight:Kt.$_+"px"},e.className="inline-image",e.alt=this.formatMessage($a.drafty_image),e.src=t&&e.src||"img/broken_image.png",e.title=e.alt,e}function Sa(e,t){const a=(0,va.rS)(t.width,t.height,Kt.Zd,Kt.$_);return e.style={width:a.width+"px",height:a.height+"px",maxWidth:Kt.Zd+"px",maxHeight:Kt.$_+"px"},e.className="inline-image",e.alt=this.formatMessage($a.drafty_video),e.title=e.alt,e.src=t&&e.src||"img/broken_video.png",e}function Ma(e,a,s,n){if(["BR","EX","IM","MN","VD"].includes(e)){let i=Gt.Drafty.tagName(e),r=Gt.Drafty.attrValue(e,a)||{};switch(r.key=n,e){case"BR":s=null;break;case"IM":r=wa.call(this,r,a),s=[t().createElement("img",r,null)," ",r.alt],i=t().Fragment,r={key:n};break;case"VD":r=Sa.call(this,r,a),s=[t().createElement("img",r,null)," ",r.alt],i=t().Fragment,r={key:n};break;case"MN":i="span",r.className="mention",a&&(r.className+=" "+(0,Jt.Cj)(a.val,!1,!0));break;case"EX":let e;if(a){if("application/json"==a.mime)return null;e=a.name,delete a.val,delete a.ref}i=t().Fragment,s=[t().createElement("i",{key:"ex",className:"material-icons"},"attachment"),(0,Jt.TX)(e,16)||this.formatMessage($a.drafty_attachment)]}return t().createElement(i,r,s)}return Ca.call(this,e,a,s,n)}function _a(e,t){let a,s,n,i;if(t?(s=e.preview,i=e.premime||"image/jpeg",n=e.preref):(s=e.val,i=e.mime,n=e.ref),s){const e=(0,va.Jr)(s,i);if(!e)throw new Error("Invalid image");a=Promise.resolve(e)}else{if(!n)throw new Error("Missing image data");a=fetch(this.authorizeURL(na(n,"image"))).then((e=>{if(e.ok)return e.blob();throw new Error(`Image fetch unsuccessful: ${e.status} ${e.statusText}`)}))}return a.then((e=>(0,va.EA)(e,t?Kt.Zd:Kt.$_,Kt.$_,-1,!t))).then((a=>(t?e.premime=a.mime:e.mime=a.mime,e.size=a.blob.size,e.width=a.width,e.height=a.height,delete e.ref,delete e.preref,e.src=URL.createObjectURL(a.blob),(0,va.w8)(a.blob)))).then((a=>(t?e.preview=a.bits:e.val=a.bits,e))).catch((t=>{throw delete e.val,delete e.preview,delete e.src,e.width=Kt.$_,e.height=Kt.$_,t}))}function Ta(e,a,s,n,i){if("IM"==e||"VD"==e){const i="IM"==e?wa.call(this,{key:n},a):Sa.call(this,{key:n},a);let r;try{r=ra(_a.call(this,a,"VD"==e))}catch(e){console.warn("Failed to quote image:",e.message),r=ra(e)}return i.whenDone=r,s=[t().createElement(ma,i,null)," ",i.alt],t().createElement(t().Fragment,{key:n},s)}if("QQ"==e){if(i.includes("QQ"))return t().createElement("span",{key:n},[t().createElement("i",{key:"qq",className:"material-icons"},"format_quote")," "]);const e=Gt.Drafty.attrValue("QQ",a)||{};return e.key=n,e.className="reply-quote",t().createElement(Gt.Drafty.tagName("QQ"),e,s)}return Ma.call(this,e,a,s,n)}class Na extends t().Component{constructor(e){super(e),this.handleClick=this.handleClick.bind(this),this.handleContextClick=this.handleContextClick.bind(this)}handleClick(e){e.preventDefault(),e.stopPropagation(),this.props.onSelected&&this.props.onSelected(this.props.item,this.props.index)}handleContextClick(e){e.preventDefault(),e.stopPropagation(),this.props.showContextMenu({topicName:this.props.item,y:e.pageY,x:e.pageX})}render(){let e=this.props.title;e?e.length>30&&(e=e.substring(0,28)+"…"):e=t().createElement("i",null,t().createElement(s.FormattedMessage,{id:"unnamed_topic",defaultMessage:[{type:0,value:"Unnamed"}]}));const a=this.props.now?"online":"offline",n=!this.props.avatar||this.props.avatar,i=this.props.badges?this.props.badges.slice():[],r=[];let o;this.props.isVerified&&r.push({icon:"verified",color:"verified-color"}),this.props.isStaff&&r.push({icon:"staff",color:"staff-color"}),this.props.isDangerous&&r.push({icon:"dangerous",color:"danger-color"}),this.props.acs&&(this.props.showMode&&i.push({name:this.props.acs.getMode(),key:"mode"}),this.props.acs.isMuted()&&r.push({icon:"muted"}),this.props.acs.isJoiner()||r.push({icon:"banned"})),"string"==typeof this.props.preview?o=this.props.preview:Gt.Drafty.isValid(this.props.preview)?o=t().createElement(t().Fragment,null,Gt.Drafty.format(this.props.preview,Ca,{formatMessage:this.props.intl.formatMessage,previewIsResponse:this.props.previewIsResponse})):this.props.preview&&(o=t().createElement(t().Fragment,null,t().createElement("i",{className:"material-icons gray"},"warning_amber")," ",t().createElement("i",{className:"gray"},t().createElement(s.FormattedMessage,{id:"invalid_content",defaultMessage:[{type:0,value:"invalid content"}]}))));const d=ia(this.props.received),l=d?t().createElement("i",{className:"material-icons small space-right"+(d.color?" "+d.color:"")},d.name):null,c="contact-title"+(this.props.deleted?" deleted":"");return t().createElement("li",{className:!this.props.showCheckmark&&this.props.selected?"selected":null,onClick:this.handleClick},t().createElement("div",{className:"avatar-box"},t().createElement(da,{tinode:this.props.tinode,avatar:n,title:this.props.title,topic:this.props.item,deleted:this.props.deleted}),this.props.deleted?t().createElement("i",{className:"deleted material-icons"},"cancel"):this.props.showOnline?t().createElement("span",{className:a}):this.props.showCheckmark&&this.props.selected?t().createElement("i",{className:"checkmark material-icons"},"check_circle"):null),t().createElement("div",{className:"text-box"},t().createElement("div",null,t().createElement("span",{className:c},e),this.props.isGroup?t().createElement("i",{className:"material-icons as-badge"},"group"):null,this.props.isChannel?t().createElement("img",{src:"/img/channel.png",className:"channel",alt:"channel"}):null,t().createElement(Qt,{badges:r}),this.props.deleted?null:t().createElement(la,{count:this.props.unread})),this.props.showMode?t().createElement("span",null,t().createElement(Qt,{badges:i})):this.props.small?null:t().createElement("div",{className:"contact-comment"},l,t().createElement("span",null,o||this.props.comment||" "))),this.props.showContextMenu?t().createElement("span",{className:"menuTrigger"},t().createElement("a",{href:"#",onClick:this.handleContextClick},t().createElement("i",{className:"material-icons"},"expand_more"))):null)}}const ka=(0,s.injectIntl)(Na);class Aa extends t().PureComponent{constructor(e){super(e),this.handleClick=this.handleClick.bind(this)}handleClick(e){e.preventDefault(),e.stopPropagation(),this.props.onAction(this.props.action)}render(){const{formatMessage:e}=this.props.intl;return t().createElement("li",{onClick:this.handleClick,className:"action"},t().createElement("div",{className:"action-text"},e(this.props.title,this.props.values)))}}const Pa=(0,s.injectIntl)(Aa),Da=(0,s.defineMessages)({badge_you:{id:"badge_you",defaultMessage:[{type:0,value:"you"}]},badge_owner:{id:"badge_owner",defaultMessage:[{type:0,value:"owner"}]}});class Ia extends t().Component{render(){const{formatMessage:e}=this.props.intl,a=Array.isArray(this.props.topicSelected),s=[];let n=0;return this.props.contacts&&this.props.contacts.length>0&&this.props.contacts.map((i=>{if(i.action)s.push(t().createElement(Pa,{title:i.title,action:i.action,values:i.values,key:i.action,onAction:this.props.onAction}));else{const r=this.props.showMode?i.user:i.topic||i.user;if(this.props.filterFunc&&this.props.filter){const e=[r];if(i.private&&i.private.comment&&e.push((""+i.private.comment).toLowerCase()),i.public&&i.public.fn&&e.push((""+i.public.fn).toLowerCase()),!this.props.filterFunc(this.props.filter,e))return}const o=Gt.Tinode.isChannelTopicName(r),d=!o&&Gt.Tinode.isGroupTopicName(r),l=a?this.props.topicSelected.indexOf(r)>-1:this.props.topicSelected===r,c=[];this.props.showMode&&(r==this.props.myUserId&&c.push({name:e(Da.badge_you),color:"green"}),i.acs&&i.acs.isOwner()&&c.push({name:e(Da.badge_owner),color:"blue"}));const h=Array.isArray(i.private)?i.private.join(","):i.private?i.private.comment:null;let p,u,m,g;if(!this.props.showMode&&i.latestMessage){const e=i.latestMessage();e&&(u=e.head?e.head.forwarded:null,g=e._status||i.msgStatus(e,!0),m=e.from!=this.props.myUserId,e.content&&(p="string"==typeof e.content?e.content.substr(0,Kt.rV):Gt.Drafty.preview(e.content,Kt.rV)))}s.push(t().createElement(ka,{tinode:this.props.tinode,title:i.public?i.public.fn:null,avatar:(0,va.PD)(i.public?i.public.photo:null),comment:h,preview:p,previewIsResponse:m,forwarded:u,received:g,unread:this.props.showUnread?i.unread:0,now:i.online&&this.props.connected,acs:i.acs,showMode:this.props.showMode,badges:c,showCheckmark:a,selected:l,showOnline:this.props.showOnline&&!o,isChannel:o,isGroup:d,showContextMenu:this.props.showContextMenu,isVerified:i.trusted&&i.trusted.verified,isStaff:i.trusted&&i.trusted.staff,isDangerous:i.trusted&&i.trusted.danger,deleted:i._deleted,onSelected:this.props.onTopicSelected,item:r,index:s.length,key:r})),n++}}),this),t().createElement("div",{className:this.props.noScroll?null:"scrollable-panel"},0==n?t().createElement("div",{className:"center-medium-text",dangerouslySetInnerHTML:{__html:this.props.emptyListMessage}}):null,s.length>0?t().createElement("ul",{className:"contact-box"},s):null)}}const Ra=(0,s.injectIntl)(Ia);class Fa extends t().PureComponent{constructor(e){super(e),this.state={edited:!1,search:""},this.handleSearchChange=this.handleSearchChange.bind(this),this.handleSearch=this.handleSearch.bind(this),this.handleClear=this.handleClear.bind(this),this.handleKeyDown=this.handleKeyDown.bind(this)}componentWillUnmount(){this.state.edited&&(this.setState({search:"",edited:!1}),this.props.onSearchContacts(Gt.Tinode.DEL_CHAR))}handleSearchChange(e){this.setState({search:e.target.value})}handleSearch(e){e.preventDefault();const t=this.state.search.trim();this.setState({edited:t.length>0}),this.props.onSearchContacts(t.length>0?t:Gt.Tinode.DEL_CHAR)}handleClear(e){e.preventDefault(),this.state.edited&&this.props.onSearchContacts(Gt.Tinode.DEL_CHAR),this.setState({search:"",edited:!1})}handleKeyDown(e){"Enter"===e.key?this.handleSearch(e):"Escape"===e.key&&this.handleClear()}render(){return t().createElement("div",{className:"panel-form"},t().createElement("div",{className:"panel-form-row"},t().createElement("i",{className:"material-icons search"},"search"),t().createElement("input",{className:"search",type:"text",placeholder:this.props.placeholder,value:this.state.search,onChange:this.handleSearchChange,onKeyDown:this.handleKeyDown,required:!0,autoFocus:!0}),this.state.search?t().createElement("a",{href:"#",onClick:this.handleClear},t().createElement("i",{className:"material-icons"},"highlight_off")):t().createElement("span",null,t().createElement("i",{className:"material-icons"}," "))))}}class xa extends t().Component{constructor(e){super(e),this.state={query:null},this.handleEscapeKey=this.handleEscapeKey.bind(this),this.handleClose=this.handleClose.bind(this),this.handleSearchContacts=this.handleSearchContacts.bind(this),this.handleContactSelected=this.handleContactSelected.bind(this)}componentDidMount(){this.props.onInitFind()}handleEscapeKey(e){27===e.keyCode&&this.props.hide(!1)}handleClose(e){e.preventDefault(),this.props.hide(!1)}handleSearchContacts(e){this.setState({query:Gt.Tinode.isNullValue(e)?null:e}),this.props.onSearchContacts(e)}handleContactSelected(e){this.props.onTopicSelected(e),this.props.hide(!0)}render(){let e=null!=this.state.query?this.props.searchResults:this.props.contacts;return e=e.filter((e=>e.name!=this.props.topicSelected&&e.acs.isJoiner()&&e.acs.isWriter())),t().createElement("div",{className:"alert-container"},t().createElement("div",{className:"forward-dialog"},t().createElement("div",{className:"title with-control"},t().createElement("div",null,t().createElement(s.FormattedMessage,{id:"forward_to",defaultMessage:[{type:0,value:"Forward to"}],desription:"Title of the contact selector dialog when forwarding a message"})),t().createElement("div",null,t().createElement("a",{href:"#",onClick:this.handleClose},t().createElement("i",{className:"material-icons"},"close")))),t().createElement(s.FormattedMessage,{id:"forward_to_search_placeholder",defaultMessage:[{type:0,value:"Search contacts"}]},(e=>t().createElement(Fa,{placeholder:e,onSearchContacts:this.handleSearchContacts}))),t().createElement(s.FormattedMessage,{id:"search_no_results",defaultMessage:[{type:0,value:"Search returned no results"}]},(a=>t().createElement(Ra,{tinode:this.props.tinode,contacts:e,myUserId:this.props.myUserId,emptyListMessage:a,showOnline:!1,showUnread:!1,showContextMenu:!1,onTopicSelected:this.handleContactSelected})))))}}const Oa={staff:"verified_user"},Ua=(0,s.defineMessages)({badge_verified:{id:"badge_verified",defaultMessage:[{type:0,value:"Verified/official"}]},badge_staff:{id:"badge_staff",defaultMessage:[{type:0,value:"Staff-managed"}]},badge_danger:{id:"badge_danger",defaultMessage:[{type:0,value:"Untrustworthy"}]}});class La extends t().PureComponent{render(){const{formatMessage:e}=this.props.intl;let a=null;return this.props.trustedBadges&&this.props.trustedBadges.length>0?(a=[],this.props.trustedBadges.map((s=>{const n=this.props.short?null:e(Ua["badge_"+s]),i="material-icons "+s+"-color";a.push(t().createElement("div",{className:"trusted-badge",key:s},t().createElement("i",{className:i},Oa[s]||s)," ",n))})),t().createElement(t().Fragment,null,a)):null}}const Ba=(0,s.injectIntl)(La),ja="started",Ha=new Audio("audio/call-in.m4a");class Va extends t().Component{constructor(e){super(e),this.state={topic:null,fullName:void 0,avatar:null,trustedBadges:[],previousMetaDesc:void 0},this.resetDesc=this.resetDesc.bind(this),this.onMetaDesc=this.onMetaDesc.bind(this),this.handleRejectCall=this.handleRejectCall.bind(this),this.handleAcceptCall=this.handleAcceptCall.bind(this),this.ringTimer=null}componentDidMount(){const e=this.props.tinode.getTopic(this.props.topic);e&&(this.resetDesc(e),2==this.props.callState&&(Ha.play().catch((e=>{})),this.ringTimer=setInterval((e=>{Ha.play().catch((e=>{}))}),2e3),this.props.onRinging(this.props.topic,this.props.seq)))}componentDidUpdate(e){const t=this.props.tinode.getTopic(e.topic);t&&(this.onMetaDesc!=t.onMetaDesc&&(this.previousMetaDesc=t.onMetaDesc,t.onMetaDesc=this.onMetaDesc),this.state.topic!=e.topic&&(this.setState({topic:e.topic}),this.resetDesc(t,e)))}componentWillUnmount(){null!=this.ringTimer&&(clearInterval(this.ringTimer),Ha.pause());const e=this.props.tinode.getTopic(this.props.topic);e&&(this.setState({topic:null}),e.onMetaDesc=this.previousMetaDesc)}resetDesc(e){const t=[];if(e.trusted)for(const[a,s]of Object.entries(e.trusted))s&&t.push(a);this.setState({fullName:oa(e.public?e.public.fn:void 0,Kt.S8),avatar:(0,va.PD)(e.public?e.public.photo:null),trustedBadges:t})}onMetaDesc(e){const t=this.props.tinode.getTopic(this.props.topic);t&&(this.resetDesc(t),this.previousMetaDesc&&this.previousMetaDesc!=this.onMetaDesc&&this.previousMetaDesc(e))}handleAcceptCall(){this.props.onAcceptCall(this.props.topic)}handleRejectCall(){this.props.onReject(this.props.topic,this.props.seq),this.props.onClose()}render(){return t().createElement("div",{className:"alert-container"},t().createElement("div",{className:"incoming-call"},t().createElement("div",{className:"caller-card incoming pulse"},t().createElement("div",{className:"avatar-box"},t().createElement(da,{tinode:this.props.tinode,avatar:this.state.avatar||!0,topic:this.props.topic,title:this.state.fullName})),t().createElement("div",{className:"caller-name"},oa(this.state.fullName,Kt.gD),t().createElement(Ba,{short:!0,trustedBadges:this.state.trustedBadges}))),t().createElement("div",{className:"controls"},2==this.props.callState?t().createElement(t().Fragment,null,t().createElement("button",{className:"danger",onClick:this.handleRejectCall},t().createElement("i",{className:"material-icons"},"call_end")),t().createElement("button",{className:"positive",onClick:this.handleAcceptCall},t().createElement("i",{className:"material-icons"},"call"))):null)))}}class qa extends t().PureComponent{render(){const e="load-spinner-box"+(this.props.large?" large":"")+(this.props.clear?" clear":"")+(this.props.centered?" centered":"");return this.props.show?t().createElement("div",{className:e},t().createElement("div",{className:"loader-spinner"})):null}}class Ga extends t().Component{constructor(e){super(e),this.state={source:e.avatar},this.handleFileReceived=this.handleFileReceived.bind(this)}componentDidUpdate(e){this.props.avatar!=e.avatar&&this.setState({source:this.props.avatar})}handleFileReceived(e){const t=e.target.files[0];this.props.onImageUpdated(t.type,URL.createObjectURL(t),t.name),e.target.value=""}render(){const e="file-input-avatar-"+(""+Math.random()).substring(0,4),a="avatar-upload"+(this.props.readOnly?" read-only":"");return t().createElement("div",{className:a},this.props.readOnly||!this.state.source?null:t().createElement("a",{href:"#",className:"clear-avatar",onClick:e=>{e.preventDefault(),this.props.onImageUpdated()}},t().createElement("i",{className:"material-icons"},"clear")),this.state.source?t().createElement("img",{src:this.props.tinode.authorizeURL(na(this.state.source,"image")),className:"preview"}):this.props.readOnly&&this.props.uid?t().createElement("div",{className:"avatar-box"},t().createElement(da,{tinode:this.props.tinode,avatar:!0,topic:this.props.uid,title:this.props.title})):t().createElement("div",{className:"blank"},Kt.IX,"×",Kt.IX),this.props.readOnly?null:t().createElement("input",{type:"file",id:e,className:"inputfile hidden",accept:"image/*",onChange:this.handleFileReceived}),this.props.readOnly?null:t().createElement("label",{htmlFor:e,className:"round"},t().createElement("i",{className:"material-icons"},"file_upload")),t().createElement(qa,{show:this.props.uploading,large:!0,clear:!0,centered:!0}))}}class Wa extends t().PureComponent{constructor(e){super(e),this.handleChange=this.handleChange.bind(this)}handleChange(){this.props.onChange(this.props.name,!this.props.checked)}render(){let e,a=["material-icons"];Array.isArray(this.props.className)?a.push(...this.props.className):this.props.className&&a.push(this.props.className),this.props.onChange?this.props.checked?(a.push("blue","clickable"),e="check_box"):!1===this.props.checked?(a.push("blue","clickable"),e="check_box_outline_blank"):(a.push("lt-blue"),e="indeterminate_check_box"):e=this.props.checked?"check_box":"check_box_outline_blank";let s={className:a.join(" "),id:this.props.id};return this.props.onChange&&(s.onClick=this.handleChange),t().createElement("i",s,e)}}class Ka extends t().PureComponent{render(){return t().createElement("a",{href:"#",onClick:e=>{e.preventDefault(),this.props.onCancel()}},t().createElement("i",{className:"material-icons"},"close"))}}class za extends t().PureComponent{constructor(e){super(e),this.state={show:!1},this.hide=this.hide.bind(this)}componentDidUpdate(e){e.level!==this.props.level&&this.setState({show:!!this.props.level})}hide(){this.setState({show:!1}),this.props.onClearError&&this.props.onClearError()}render(){const e={err:"error",warn:"warning",info:"info"}[this.props.level]||"",a="info-box "+e;return t().createElement("div",{className:a},t().createElement("div",{className:"icon"},t().createElement("i",{className:"material-icons"},e)),t().createElement("span",null,this.props.text,this.props.action?t().createElement(t().Fragment,null,t().createElement("a",{href:"#",style:{whiteSpace:"nowrap"},onClick:e=>{e.preventDefault(),this.props.action()}},this.props.actionText)):null),t().createElement("div",{className:"cancel"},t().createElement(Ka,{onCancel:this.hide})))}}class Za extends t().PureComponent{constructor(e){super(e),this.handleCancel=this.handleCancel.bind(this)}handleCancel(e){e.preventDefault(),this.props.onCancel(this.props.topic,this.props.index)}render(){const e=this.props.title||this.props.topic,a=this.props.invalid?"chip invalid":"chip";return t().createElement("div",{className:a},this.props.noAvatar?t().createElement("span",{className:"spacer"}):t().createElement("div",{className:"avatar-box"},t().createElement(da,{tinode:this.props.tinode,avatar:this.props.avatar||!0,topic:this.props.topic,title:this.props.title})),t().createElement("span",null,e),this.props.onCancel&&!this.props.required?t().createElement("a",{href:"#",onClick:this.handleCancel},"×"):t().createElement("span",{className:"spacer"}))}}class Ya extends t().Component{constructor(e){super(e),this.state=Ya.deriveStateFromProps(e),this.state.input="",this.state.focused=!1,this.handleTextInput=this.handleTextInput.bind(this),this.removeChipAt=this.removeChipAt.bind(this),this.handleChipCancel=this.handleChipCancel.bind(this),this.handleFocusGained=this.handleFocusGained.bind(this),this.handleFocusLost=this.handleFocusLost.bind(this),this.handleKeyDown=this.handleKeyDown.bind(this)}static deriveStateFromProps(e){return{placeholder:e.chips?"":e.prompt,sortedChips:Ya.sortChips(e.chips,e.staticMembers),chipIndex:Ya.indexChips(e.chips)}}componentDidUpdate(e,t){e.chips==this.props.chips&&e.staticMembers==this.props.staticMembers&&e.prompt==this.props.prompt||this.setState(Ya.deriveStateFromProps(this.props)),(!t||this.props.chips.length>t.sortedChips.length)&&this.setState({input:""})}static indexChips(e){const t={};let a=0;return e.map((e=>{t[e.user]=a,a++})),t}static sortChips(e,t){const a=[],s=[];return e.map((e=>{t&&t.includes(e.user)?a.push(e):s.push(e)})),a.concat(s)}handleTextInput(e){this.setState({input:e.target.value}),this.props.filterFunc&&this.props.filterFunc(e.target.value)}removeChipAt(e){const t=this.state.sortedChips[e];this.props.onChipRemoved(t.user,this.state.chipIndex[t.user])}handleChipCancel(e,t){this.removeChipAt(t)}handleFocusGained(){this.setState({focused:!0})}handleFocusLost(){this.setState({focused:!1}),this.props.onFocusLost&&this.props.onFocusLost(this.state.input)}handleKeyDown(e){if("Backspace"===e.key){if(0==this.state.input.length&&this.state.sortedChips.length>0){const e=this.state.sortedChips.length-1;this.state.sortedChips[e].user!==this.props.staticMembers&&this.removeChipAt(e)}}else"Enter"===e.key?this.props.onEnter&&this.props.onEnter(this.state.input):"Escape"===e.key&&this.props.onCancel&&this.props.onCancel()}render(){const e=[];let a=0;const s=this.props.staticMembers||[];this.state.sortedChips.map((n=>{e.push(t().createElement(Za,{tinode:this.props.tinode,onCancel:this.handleChipCancel,avatar:(0,va.PD)(n.public?n.public.photo:null),title:n.public?n.public.fn:void 0,noAvatar:this.props.avatarDisabled,topic:n.user,required:s.includes(n.user),invalid:n.invalid,index:a,key:n.user})),a++}));const n="chip-input"+(this.state.focused?" focused":""),i=!(this.props.tabIndex>0);return t().createElement("div",{className:n},e,t().createElement("input",{type:"text",placeholder:this.state.placeholder,onChange:this.handleTextInput,onFocus:this.handleFocusGained,onBlur:this.handleFocusLost,onKeyDown:this.handleKeyDown,value:this.state.input,tabIndex:this.props.tabIndex,autoFocus:i}))}}const Xa=(0,s.defineMessages)({no_contacts:{id:"no_contacts",defaultMessage:[{type:0,value:"You have no contacts :-("}]},contacts_not_found_short:{id:"contacts_not_found_short",defaultMessage:[{type:0,value:"No contacts match '"},{type:1,value:"query"},{type:0,value:"'"}]}});class Qa extends t().Component{constructor(e){super(e),this.state={members:e.members,index:Qa.indexMembers(e.members),staticMembers:Qa.staticMembers(e.members,e.keepInitialMembers,e.requiredMember),contactFilter:"",noContactsMessage:e.intl.formatMessage(Xa.no_contacts),selectedContacts:Qa.selectedContacts(e.members)},this.handleContactSelected=this.handleContactSelected.bind(this),this.handleMemberRemoved=this.handleMemberRemoved.bind(this),this.handleContactFilter=this.handleContactFilter.bind(this),this.handleSubmit=this.handleSubmit.bind(this),this.handleCancel=this.handleCancel.bind(this)}static indexMembers(e){let t={};return e.map((e=>{t[e.user]={delta:0,present:!0}})),t}static staticMembers(e,t,a){let s=[];return e.map((e=>{(t||e.user==a)&&s.push(e.user)})),s}static selectedContacts(e){let t=[];return e.map((e=>{t.push(e.user)})),t}handleContactSelected(e,t){let a=this.state.index[e];if(a){if(a.present)return;a.delta+=1,a.present=!0}else a={delta:1,present:!0};let s=this.state.members.slice();s.push(this.props.contacts[t]);const n=Qa.selectedContacts(s),i=this.state.index;i[e]=a,this.setState({members:s,index:i,selectedContacts:n})}handleMemberRemoved(e,t){const a=this.state.index[e];if(!a||!a.present)return;a.present=!1,a.delta-=1;let s=this.state.members.slice();s.splice(t,1);const n=Qa.selectedContacts(s),i=this.state.index;i[e]=a,this.setState({members:s,index:i,selectedContacts:n})}handleContactFilter(e){const{formatMessage:t}=this.props.intl,a=e?t(Xa.contacts_not_found_short,{query:e}):t(Xa.no_contacts);this.setState({contactFilter:e,noContactsMessage:a})}static doContactFiltering(e,t){if(e){for(let a=0;a=0)return!0;return!1}return!0}handleSubmit(){var e=this,t=[],a=[],s=[];Object.keys(this.state.index).map((function(n){e.state.index[n].present&&t.push(n),e.state.index[n].delta>0?a.push(n):e.state.index[n].delta<0&&s.push(n)})),this.props.onSubmit(t,a,s)}handleCancel(){this.props.onCancel()}render(){const{formatMessage:e}=this.props.intl;return t().createElement("div",{id:"group-manager"},t().createElement("div",{className:"panel-form-row"},t().createElement("label",{className:"small"},t().createElement(s.FormattedMessage,{id:"title_group_members",defaultMessage:[{type:0,value:"Group Members"}]}))),t().createElement("div",{className:"panel-form-row"},t().createElement(Ya,{tinode:this.props.tinode,chips:this.state.members,staticMembers:this.state.staticMembers,prompt:"add members",filterFunc:this.handleContactFilter,onChipRemoved:this.handleMemberRemoved})),t().createElement("div",{className:"panel-form-row"},t().createElement("label",{className:"small"},t().createElement(s.FormattedMessage,{id:"title_all_contacts",defaultMessage:[{type:0,value:"All Contacts"}]}))),t().createElement(Ra,{tinode:this.props.tinode,contacts:this.props.contacts,myUserId:this.props.myUserId,topicSelected:this.state.selectedContacts,filter:this.state.contactFilter,filterFunc:Qa.doContactFiltering,emptyListMessage:this.state.noContactsMessage,showOnline:!1,showUnread:!1,onTopicSelected:this.handleContactSelected}),t().createElement("div",{id:"group-manager-buttons",className:"panel-form-row"},t().createElement("button",{className:"secondary",onClick:this.handleCancel},t().createElement(s.FormattedMessage,{id:"button_cancel",defaultMessage:[{type:0,value:"Cancel"}]})),t().createElement("button",{className:"primary",onClick:this.handleSubmit},t().createElement(s.FormattedMessage,{id:"button_ok",defaultMessage:[{type:0,value:"OK"}]}))))}}const Ja=(0,s.injectIntl)(Qa),es=(0,s.defineMessages)({joiner:{id:"permission_join",defaultMessage:[{type:0,value:"Join ("},{type:1,value:"val"},{type:0,value:")"}]},reader:{id:"permission_read",defaultMessage:[{type:0,value:"Read ("},{type:1,value:"val"},{type:0,value:")"}]},writer:{id:"permission_write",defaultMessage:[{type:0,value:"Write ("},{type:1,value:"val"},{type:0,value:")"}]},preser:{id:"permission_pres",defaultMessage:[{type:0,value:"Get notified ("},{type:1,value:"val"},{type:0,value:")"}]},approver:{id:"permission_admin",defaultMessage:[{type:0,value:"Approve ("},{type:1,value:"val"},{type:0,value:")"}]},sharer:{id:"permission_share",defaultMessage:[{type:0,value:"Share ("},{type:1,value:"val"},{type:0,value:")"}]},deleter:{id:"permission_delete",defaultMessage:[{type:0,value:"Delete ("},{type:1,value:"val"},{type:0,value:")"}]},owner:{id:"permission_owner",defaultMessage:[{type:0,value:"Owner ("},{type:1,value:"val"},{type:0,value:")"}]}});class ts extends t().Component{constructor(e){super(e),this.state={mode:(e.mode||"").replace("N","")},this.handleChange=this.handleChange.bind(this),this.handleSubmit=this.handleSubmit.bind(this),this.handleCancel=this.handleCancel.bind(this)}handleChange(e){let t=this.state.mode;-1==t.indexOf(e)?t+=e:t=t.replace(e,""),this.setState({mode:t})}handleSubmit(){const e=(this.state.mode||"N").split("").sort().join("");e!==(this.props.mode||"N").split("").sort().join("")?this.props.onSubmit(e):this.props.onCancel()}handleCancel(){this.props.onCancel()}render(){const{formatMessage:e}=this.props.intl,a="JRWPASDO",n={J:e(es.joiner,{val:"J"}),R:e(es.reader,{val:"R"}),W:e(es.writer,{val:"W"}),P:e(es.preser,{val:"P"}),A:e(es.approver,{val:"A"}),S:e(es.sharer,{val:"S"}),D:e(es.deleter,{val:"D"}),O:e(es.owner,{val:"O"})};let i=this.props.skip||"",r=this.state.mode,o=(this.props.compare||"").replace("N",""),d=[];for(let e=0;e=0&&r.indexOf(s)<0||d.push(t().createElement("tr",{key:s},t().createElement("td",null,n[s]),t().createElement("td",{className:"checkbox"},i.indexOf(s)<0?t().createElement(Wa,{name:s,checked:r.indexOf(s)>=0,onChange:this.handleChange}):t().createElement(Wa,{name:s,checked:r.indexOf(s)>=0})),this.props.compare?t().createElement("td",{className:"checkbox"},t().createElement(Wa,{name:s,checked:o.indexOf(s)>=0})):null))}return t().createElement("div",{className:"panel-form-column"},this.props.userTitle?t().createElement("ul",{className:"contact-box small"},t().createElement(ka,{tinode:this.props.tinode,item:this.props.item,title:this.props.userTitle,small:!0,avatar:(0,va.PD)(this.props.userAvatar?this.props.userAvatar:null)})):null,t().createElement("label",{className:"small"},t().createElement(s.FormattedMessage,{id:"title_permissions",defaultMessage:[{type:0,value:"Permissions"}]})),t().createElement("table",{className:"permission-editor"},this.props.compare?t().createElement("thead",null,t().createElement("tr",null,t().createElement("th",null),t().createElement("th",null,this.props.modeTitle),t().createElement("th",null,this.props.compareTitle))):null,t().createElement("tbody",null,d)),t().createElement("br",null),t().createElement("div",{className:"dialog-buttons"},t().createElement("button",{className:"outline",onClick:this.handleCancel},t().createElement(s.FormattedMessage,{id:"button_cancel",defaultMessage:[{type:0,value:"Cancel"}]})),t().createElement("button",{className:"primary",onClick:this.handleSubmit},t().createElement(s.FormattedMessage,{id:"button_ok",defaultMessage:[{type:0,value:"OK"}]}))))}}const as=(0,s.injectIntl)(ts);class ss extends t().Component{constructor(e){super(e),this.state={panX:0,panY:0,originX:0,originY:0,zoom:1,minZoom:0,maxZoom:2.5},this.overlay=t().createRef(),this.cutout=t().createRef(),this.preview=t().createRef(),this.boundingBox=t().createRef(),this.imageWidth=0,this.imageHeight=0,this.mouseX=0,this.mouseY=0,this.prevDistance=0,this.cutoutRect={},this.bBoxRect={},this.originX=0,this.originY=0,this.initScaling=this.initScaling.bind(this),this.onZoom=this.onZoom.bind(this),this.handleZoom=this.handleZoom.bind(this),this.mouseDown=this.mouseDown.bind(this),this.mouseUp=this.mouseUp.bind(this),this.mouseMove=this.mouseMove.bind(this),this.mouseTouch=this.mouseTouch.bind(this),this.positionAll=this.positionAll.bind(this),this.translate=this.translate.bind(this)}componentDidMount(){this.overlay.current.addEventListener("mousedown",this.mouseDown,{passive:!0}),this.overlay.current.addEventListener("touchstart",this.mouseDown,{passive:!0}),this.bBoxRect=this.boundingBox.current.getBoundingClientRect(),this.originX=this.bBoxRect.width/2,this.originY=this.bBoxRect.height/2,this.cutoutRect=this.cutout.current.getBoundingClientRect()}componentWillUnmount(){this.overlay.current.removeEventListener("mousedown",this.mouseDown),this.overlay.current.removeEventListener("touchstart",this.mouseDown)}positionAll(e,t,a){this.setState({panX:e,panY:t,zoom:a,originX:this.originX-e,originY:this.originY-t});const s=(this.originX-e)*a-this.originX,n=(this.originY-t)*a-this.originY;this.props.onChange((s+this.cutoutRect.left-this.bBoxRect.left)/a,(n+this.cutoutRect.top-this.bBoxRect.top)/a,this.cutoutRect.width/a,this.cutoutRect.height/a,a)}static checkBound(e,t,a,s){let n=Math.min(0,a[0]-t[0]-s,t[1]-a[1]+s);return(0==n||Math.min(0,a[0]-t[0],t[1]-a[1])n&&(t+=r-n);const o=this.originY-(this.originY-a)*e,d=o+this.imageHeight*e,l=this.cutoutRect.top-this.bBoxRect.top,c=l+this.cutoutRect.height;ld&&(a+=c-d),this.positionAll(t,a,e)}mouseDown(e){e.touches?(this.mouseX=e.touches[0].pageX,this.mouseY=e.touches[0].pageY):(this.mouseX=e.pageX,this.mouseY=e.pageY),window.addEventListener("mousemove",this.mouseMove,{passive:!1}),window.addEventListener("touchmove",this.mouseTouch,{passive:!1}),window.addEventListener("mouseup",this.mouseUp,{passive:!0}),window.addEventListener("touchend",this.mouseUp,{passive:!0}),document.body.style.userSelect="none"}translate(e,t){const a=e-this.mouseX,s=t-this.mouseY;this.mouseX=e,this.mouseY=t;const n=this.preview.current.getBoundingClientRect();let i=ss.checkBound(this.state.panX,[n.left,n.right],[this.cutoutRect.left,this.cutoutRect.right],a),r=ss.checkBound(this.state.panY,[n.top,n.bottom],[this.cutoutRect.top,this.cutoutRect.bottom],s);this.positionAll(i,r,this.state.zoom)}mouseMove(e){e.preventDefault(),this.translate(e.pageX,e.pageY)}mouseTouch(e){if(e.preventDefault(),1==e.touches.length)return void this.translate(e.touches[0].pageX,e.touches[0].pageY);const[t,a]=e.touches,s=Math.sqrt((t.pageX-a.pageX)*(t.pageX-a.pageX)+(t.pageY-a.pageY)*(t.pageY-a.pageY));this.prevDistance||(this.prevDistance=s/this.state.zoom);let n=s/this.prevDistance;this.handleZoom(Math.max(this.minZoom,Math.min(this.maxZoom,n)))}mouseUp(e){window.removeEventListener("mousemove",this.mouseMove),window.removeEventListener("touchmove",this.mouseTouch),window.removeEventListener("mouseup",this.mouseUp),window.removeEventListener("touchend",this.mouseUp),document.body.style.userSelect="",this.positionAll(this.state.panX,this.state.panY,this.state.zoom)}render(){const e=`translate3d(${this.state.panX}px, ${this.state.panY}px, 0) scale(${this.state.zoom})`,a=`${this.state.originX}px ${this.state.originY}px`,s={top:this.originY-this.state.originY*this.state.zoom+"px",left:this.originX-this.state.originX*this.state.zoom+"px",width:this.imageWidth*this.state.zoom+"px",height:this.imageHeight*this.state.zoom+"px"};return t().createElement("div",{className:"cropper"},t().createElement("div",{className:"bounding-box",ref:this.boundingBox},t().createElement("img",{src:this.props.source,className:"preview",alt:"",style:{transform:e,transformOrigin:a},ref:this.preview,onLoad:this.initScaling}),t().createElement("div",{className:"cutout circle",ref:this.cutout}),t().createElement("div",{className:"overlay",style:s,ref:this.overlay})),t().createElement("div",{className:"zoom-wrapper"},t().createElement("input",{type:"range",className:"zoomer",step:"0.001",min:this.state.minZoom,max:this.state.maxZoom,value:this.state.zoom,onChange:this.onZoom})))}}class ns extends t().PureComponent{constructor(e){super(e),this.state={top:0,left:0,width:0,height:0,scale:1},this.handleSubmit=this.handleSubmit.bind(this),this.handleChange=this.handleChange.bind(this)}handleChange(e,t,a,s,n){this.setState({left:e,top:t,width:a,height:s,scale:n})}handleSubmit(){(0,va.Id)(this.props.mime,this.props.avatar,this.state.left,this.state.top,this.state.width,this.state.height,this.state.scale).then((e=>{this.props.onSubmit(e.mime,e.blob,e.width,e.height)})).catch((e=>{this.props.onError(e)}))}render(){return t().createElement("div",{className:"panel-form"},t().createElement("div",{className:"panel-form-row"},t().createElement(ss,{source:this.props.avatar,onChange:this.handleChange})),t().createElement("div",{className:"dialog-buttons"},this.props.onCancel?t().createElement("button",{className:"secondary",onClick:this.props.onCancel},t().createElement(s.FormattedMessage,{id:"button_cancel",defaultMessage:[{type:0,value:"Cancel"}]})):null,t().createElement("button",{className:"primary",onClick:this.handleSubmit},t().createElement(s.FormattedMessage,{id:"button_ok",defaultMessage:[{type:0,value:"OK"}]}))))}}class is extends t().PureComponent{constructor(e){super(e),this.inputRef=t().createRef(),this.state={value:this.props.value,visible:!1},this.handleVisibility=this.handleVisibility.bind(this),this.handeTextChange=this.handeTextChange.bind(this),this.handleKeyDown=this.handleKeyDown.bind(this),this.handleEditingFinished=this.handleEditingFinished.bind(this)}componentDidMount(){this.props.autoFocus&&this.inputRef.current.focus()}handeTextChange(e){this.setState({value:e.target.value}),this.props.onChange&&this.props.onChange(e)}handleVisibility(e){e.preventDefault(),this.setState({visible:!this.state.visible})}handleKeyDown(e){27==e.keyCode?(this.setState({value:this.props.value,visible:!1}),this.props.onFinished&&this.props.onFinished()):13==e.keyCode&&this.handleEditingFinished()}handleEditingFinished(e){if(e){let t=e.currentTarget;setTimeout((e=>{t.contains(document.activeElement)||this.props.onFinished&&this.props.onFinished(this.state.value)}),0)}else this.props.onFinished&&this.props.onFinished(this.state.value.trim())}render(){return t().createElement("div",{tabIndex:"-1",className:"group-focus",onBlur:this.handleEditingFinished},t().createElement("input",{className:"with-visibility",type:this.state.visible?"text":"password",value:this.state.value,placeholder:this.props.placeholder,required:this.props.required?"required":"",autoFocus:this.props.autoFocus?"autoFocus":"",autoComplete:this.props.autoComplete,onChange:this.handeTextChange,onKeyDown:this.handleKeyDown,ref:this.inputRef}),t().createElement("span",{onClick:this.handleVisibility},t().createElement("i",{className:"material-icons clickable light-gray"},this.state.visible?"visibility":"visibility_off")))}}class rs extends t().Component{constructor(e){super(e),this.selfRef=t().createRef(),this.state={active:e.active,initialValue:e.value||"",value:e.value||""},this.handeTextChange=this.handeTextChange.bind(this),this.handleKeyDown=this.handleKeyDown.bind(this),this.handleStartEditing=this.handleStartEditing.bind(this),this.handleEditingFinished=this.handleEditingFinished.bind(this),this.handlePasswordFinished=this.handlePasswordFinished.bind(this)}componentDidUpdate(e,t){const a=this.props.value||"";t.initialValue==a||t.active||this.setState({initialValue:a,value:a})}handeTextChange(e){this.setState({value:e.target.value||""})}handleKeyDown(e){27===e.keyCode?this.setState({value:this.props.value,active:!1}):13===e.keyCode&&this.handleEditingFinished(e)}handleStartEditing(){this.props.readOnly||this.setState({active:!0},(e=>{this.selfRef.current&&this.selfRef.current.focus()}))}handleEditingFinished(e){const t=this.state.value.trim();!this.props.required||e.target.checkValidity()&&t?(this.setState({active:!1}),(t||this.props.value)&&t!==this.props.value&&this.props.onFinished(t)):this.setState({value:this.props.value,active:!1})}handlePasswordFinished(e){this.setState({active:!1}),e&&e!==this.props.value&&this.props.onFinished(e)}render(){if(!this.state.active){let e="password"==this.props.type?"••••••••":this.state.value,a="in-place-edit"+(this.props.readOnly?" disabled":"");return e||(e=this.props.placeholder,a+=" placeholder"),this.props.multiline&&1!=this.props.multiline||(a+=" short"),t().createElement("span",{className:a,onClick:this.handleStartEditing},t().createElement("span",null,e))}let e;const a={};return"password"==this.props.type?(e=is,a.onFinished=this.handlePasswordFinished):(this.props.multiline>1?(e="textarea",a.rows=this.props.multiline,a.className="inplace-edit"):(e="input",a.type=this.props.type||"text"),a.value=this.state.value,a.ref=this.selfRef,a.onChange=this.handeTextChange,a.onKeyDown=this.handleKeyDown,a.onBlur=this.handleEditingFinished),a.placeholder=this.props.placeholder,a.required=this.props.required?"required":"",a.autoComplete=this.props.autoComplete,a.autoFocus=!0,t().createElement(e,a,null)}}class os extends t().Component{constructor(e){super(e),this.state={tags:this.props.tags||[],tagInput:"",activated:this.props.activated},this.handleTagInput=this.handleTagInput.bind(this),this.handleAddTag=this.handleAddTag.bind(this),this.handleRemoveTag=this.handleRemoveTag.bind(this),this.handleSubmit=this.handleSubmit.bind(this),this.handleCancel=this.handleCancel.bind(this)}static getDerivedStateFromProps(e,t){const a=e.tags||[];return aa(a,t.tags)||t.activated?null:{tags:a}}handleTagInput(e){if(this.setState({tagInput:e}),e.length>0){const t=e[e.length-1];'"'==e[0]?e.length>1&&'"'==t&&this.handleAddTag(e.substring(1,e.length-1)):","!=t&&" "!=t&&";"!=t&&'"'!=t||this.handleAddTag(e.substring(0,e.length-1).trim())}}handleAddTag(e){const t=this.props.tinode.getServerParam("maxTagCount",Kt.pM);if(e.length>0&&this.state.tags.length{n.push({user:t,invalid:t.lengtha})})):(this.state.tags.map((e=>{n.push(t().createElement("span",{className:"badge",key:n.length},e))})),0==n.length&&(n=t().createElement("i",null,t().createElement(s.FormattedMessage,{id:"tags_not_found",defaultMessage:[{type:0,value:"No tags defined. Add some."}]})))),t().createElement("div",{className:"panel-form-column"},t().createElement("div",{className:"panel-form-row"},t().createElement("label",{className:"small"},this.props.title)),this.state.activated?t().createElement("div",null,t().createElement(s.FormattedMessage,{id:"tags_editor_no_tags",defaultMessage:[{type:0,value:"Add some tags"}]},(e=>t().createElement(Ya,{tinode:this.props.tinode,chips:n,avatarDisabled:!0,prompt:e,tabIndex:this.props.tabIndex,onEnter:this.handleAddTag,onFocusLost:this.handleAddTag,onCancel:this.handleCancel,onChipRemoved:this.handleRemoveTag,filterFunc:this.handleTagInput}))),this.props.onSubmit||this.props.onCancel?t().createElement("div",{id:"tag-manager-buttons",className:"dialog-buttons panel-form-row"},t().createElement("button",{className:"outline",onClick:this.handleCancel},t().createElement(s.FormattedMessage,{id:"button_cancel",defaultMessage:[{type:0,value:"Cancel"}]})),t().createElement("button",{className:"primary",onClick:this.handleSubmit},t().createElement(s.FormattedMessage,{id:"button_ok",defaultMessage:[{type:0,value:"OK"}]}))):null):t().createElement("div",{className:"quoted"},t().createElement("a",{href:"#",className:"flat-button",onClick:e=>{e.preventDefault(),this.setState({activated:!0})}},t().createElement("i",{className:"material-icons"},"edit")," ",t().createElement(s.FormattedMessage,{id:"title_manage_tags",defaultMessage:[{type:0,value:"Manage"}]})),t().createElement(t().Fragment,null,n)))}}class ds extends t().Component{constructor(e){super(e);const t=this.props.tinode.getTopic(this.props.topic),a=t.getAccessMode();this.state={isMe:Gt.Tinode.isMeTopicName(this.props.topic),owner:a&&a.isOwner(),fullName:t.public?t.public.fn:void 0,private:t.private?t.private.comment:null,description:t.public?t.public.note:void 0,avatar:(0,va.PD)(t.public?t.public.photo:null),tags:t.tags()||[],newAvatar:null,newAvatarMime:null},this.previousOnTags=null,this.tnNewTags=this.tnNewTags.bind(this),this.handleFullNameUpdate=this.handleFullNameUpdate.bind(this),this.handleImageUpdated=this.handleImageUpdated.bind(this),this.handleAvatarCropped=this.handleAvatarCropped.bind(this),this.handleAvatarCropCancel=this.handleAvatarCropCancel.bind(this),this.uploadAvatar=this.uploadAvatar.bind(this),this.handlePrivateUpdate=this.handlePrivateUpdate.bind(this),this.handleDescriptionUpdate=this.handleDescriptionUpdate.bind(this),this.handleTagsUpdated=this.handleTagsUpdated.bind(this)}componentDidMount(){const e=this.props.tinode.getTopic(this.props.topic);this.previousOnTags=e.onTagsUpdated,e.onTagsUpdated=this.tnNewTags}componentWillUnmount(){this.props.tinode.getTopic(this.props.topic).onTagsUpdated=this.previousOnTags}tnNewTags(e){this.setState({tags:e})}handleFullNameUpdate(e){(e=e.trim().substring(0,Kt.S8))&&this.state.fullName!==e&&(this.setState({fullName:e}),this.props.onUpdateTopicDesc(this.props.topic,ta(e,null)))}handlePrivateUpdate(e){e=e.trim().substring(0,Kt.S8),this.state.private!==e&&(this.setState({private:e}),this.props.onUpdateTopicDesc(this.props.topic,null,e||Gt.Tinode.DEL_CHAR))}handleDescriptionUpdate(e){(e=e.trim().substring(0,Kt.EI))&&(this.setState({description:e}),this.props.onUpdateTopicDesc(this.props.topic,ta(null,null,null,e)))}handleImageUpdated(e,t){this.setState({newAvatar:t,newAvatarMime:e}),t||(this.setState({avatar:null}),this.props.onUpdateTopicDesc(this.props.topic,ta(null,Gt.Tinode.DEL_CHAR)))}handleAvatarCropped(e,t,a,s){const n=t?URL.createObjectURL(t):null;this.setState({avatar:n,newAvatar:null,newAvatarMime:null}),t&&this.uploadAvatar(e,t,a,s)}uploadAvatar(e,t,a,s){const n=e=>{let{mime:t,blob:a}=e;if(a.size>Kt.uv){this.props.tinode.getLargeFileHelper().upload(a).then((e=>this.props.onUpdateTopicDesc(this.props.topic,ta(null,e)))).catch((e=>this.props.onError(e.message,"err")))}else(0,va.w8)(a).then((e=>{const a=(0,va.PD)({data:e.bits,type:t});this.setState({source:a}),this.props.onUpdateTopicDesc(this.props.topic,ta(null,a))}))};a>Kt.IX||s>Kt.IX||a!=s?(0,va.EA)(t,Kt.IX,Kt.IX,Kt.GQ,!0).then((e=>n(e))).catch((e=>this.props.onError(e.message,"err"))):n({mime:e,blob:t,width:a,height:s})}handleAvatarCropCancel(){this.setState({newAvatar:null,newAvatarMime:null})}handleTagsUpdated(e){aa(this.state.tags.slice(0),e.slice(0))||this.props.onUpdateTags(e)}render(){if(this.state.newAvatar)return t().createElement(ns,{avatar:this.state.newAvatar,mime:this.state.newAvatarMime,onSubmit:this.handleAvatarCropped,onCancel:this.handleAvatarCropCancel,onError:this.props.onError});const e=this.state.isMe||this.state.owner;return t().createElement(t().Fragment,null,t().createElement("div",{className:"panel-form-column"},t().createElement("center",null,t().createElement(Ga,{tinode:this.props.tinode,avatar:this.state.avatar,readOnly:!e,uid:this.props.topic,title:this.state.fullName,onImageUpdated:this.handleImageUpdated,onError:this.props.onError})),this.state.isMe?t().createElement("div",{className:"group"},t().createElement("label",{className:"small"},t().createElement(s.FormattedMessage,{id:"label_your_name",defaultMessage:[{type:0,value:"Your name"}]})),t().createElement("div",null,t().createElement(s.FormattedMessage,{id:"full_name_prompt",defaultMessage:[{type:0,value:"Full name, e.g. John Doe"}]},(e=>t().createElement(rs,{placeholder:e,value:this.state.fullName,required:!0,onFinished:this.handleFullNameUpdate}))))):t().createElement(t().Fragment,null,t().createElement("div",{className:"group"},t().createElement("div",null,t().createElement("label",{className:"small"},t().createElement(s.FormattedMessage,{id:"label_topic_name",defaultMessage:[{type:0,value:"Name"}]}))),t().createElement("div",null,t().createElement(s.FormattedMessage,{id:"topic_name_editing_placeholder",defaultMessage:[{type:0,value:"Freeform name of the group"}]},(a=>t().createElement(rs,{placeholder:a,readOnly:!e,value:this.state.fullName,required:!0,onFinished:this.handleFullNameUpdate}))))),t().createElement("div",{className:"group"},t().createElement("div",null,t().createElement("label",{className:"small"},t().createElement(s.FormattedMessage,{id:"label_private",defaultMessage:[{type:0,value:"Private comment"}]}))),t().createElement("div",null,t().createElement(s.FormattedMessage,{id:"private_editing_placeholder",defaultMessage:[{type:0,value:"Visible to you only"}]},(e=>t().createElement(rs,{placeholder:e,value:this.state.private,onFinished:this.handlePrivateUpdate})))))),e||this.state.description?t().createElement("div",{className:"group"},t().createElement("div",null,t().createElement("label",{className:"small"},t().createElement(s.FormattedMessage,{id:"label_description",defaultMessage:[{type:0,value:"Description"}]}))),t().createElement("div",null,t().createElement(s.FormattedMessage,{id:"description_editing_placeholder",defaultMessage:[{type:0,value:"Description (optional)"}]},(a=>t().createElement(rs,{placeholder:a,readOnly:!e,value:this.state.description,multiline:2,onFinished:this.handleDescriptionUpdate}))))):null),e?t().createElement(t().Fragment,null,t().createElement("div",{className:"hr"}),t().createElement(s.FormattedMessage,{id:"title_tag_manager",defaultMessage:[{type:0,value:"Tags (search & discovery)"}]},(e=>t().createElement(os,{tinode:this.props.tinode,title:e,activated:!1,tags:this.state.tags,onSubmit:this.handleTagsUpdated})))):null)}}class ls extends t().Component{constructor(e){super(e);this.props.tinode.getTopic(this.props.topic).getAccessMode();this.state={tags:[]},this.previousTagsUpdated=void 0,this.onTagsUpdated=this.onTagsUpdated.bind(this),this.handleTagsUpdated=this.handleTagsUpdated.bind(this)}componentDidUpdate(e){const t=this.props.tinode.getTopic(e.topic);t&&(t.onTagsUpdated!=this.onTagsUpdated&&("grp"==t.getType()?(this.previousTagsUpdated=t.onTagsUpdated,t.onTagsUpdated=this.onTagsUpdated):this.previousTagsUpdated=void 0),this.state.topic!=e.topic&&this.setState({topic:e.topic}))}componentWillUnmount(){this.props.tinode.getTopic(this.props.topic).onTagsUpdated=this.previousTagsUpdated}onTagsUpdated(e){this.setState({tags:e}),this.previousTagsUpdated&&this.previousTagsUpdated!=this.onTagsUpdated&&this.previousTagsUpdated(e)}handleTagsUpdated(e){aa(this.state.tags.slice(0),e.slice(0))||this.props.onUpdateTagsRequest(this.props.topic,e)}render(){return t().createElement("div",{className:"scrollable-panel"},t().createElement(ds,{tinode:this.props.tinode,topic:this.props.topic,onUpdateTopicDesc:this.props.onUpdateTopicDesc,onUpdateTags:this.handleTagsUpdated,onError:this.props.onError}))}}const cs=(0,s.defineMessages)({clear_messages:{id:"action_clear_messages",defaultMessage:[{type:0,value:"Clear Messages"}]},clear_messages_warning:{id:"clear_messages_warning",defaultMessage:[{type:0,value:"Are you sure you want to clear all messages? It cannot be undone."}]},delete_messages:{id:"action_delete_messages",defaultMessage:[{type:0,value:"Clear Messages for All"}]},delete_messages_warning:{id:"delete_messages_warning",defaultMessage:[{type:0,value:"Are you sure you want to delete all messages for everyone? It cannot be undone."}]},topic_delete:{id:"topic_delete",defaultMessage:[{type:0,value:"Delete Conversation"}]},topic_delete_warning:{id:"topic_delete_warning",defaultMessage:[{type:0,value:"Are you sure you want to delete this conversation? It cannot be undone."}]},leave_chat:{id:"action_leave_chat",defaultMessage:[{type:0,value:"Leave Conversation"}]},leave_chat_warning:{id:"leave_chat_warning",defaultMessage:[{type:0,value:"Are you sure you want to leave this conversation?"}]},block_contact:{id:"action_block_contact",defaultMessage:[{type:0,value:"Block Contact"}]},block_contact_warning:{id:"block_contact_warning",defaultMessage:[{type:0,value:"Are you sure you want to block this contact?"}]},report_chat:{id:"action_report_chat",defaultMessage:[{type:0,value:"Report Conversation"}]},report_chat_warning:{id:"report_chat_warning",defaultMessage:[{type:0,value:"Are you sure you want to block and report this conversation?"}]},other_user:{id:"label_other_user",defaultMessage:[{type:0,value:"Other"}]}});class hs extends t().PureComponent{constructor(e){super(e),this.handleDeleteTopic=this.handleDeleteTopic.bind(this),this.handleDeleteMessages=this.handleDeleteMessages.bind(this),this.handleLeave=this.handleLeave.bind(this),this.handleBlock=this.handleBlock.bind(this),this.handleReport=this.handleReport.bind(this)}handleDeleteTopic(e){e.preventDefault();const{formatMessage:t}=this.props.intl;this.props.onShowAlert(t(cs.topic_delete),t(cs.topic_delete_warning),(e=>this.props.onDeleteTopic(this.props.topic)),null,!0,null)}handleDeleteMessages(e){e.preventDefault();const{formatMessage:t}=this.props.intl;this.props.onShowAlert(t(this.props.deleter?cs.delete_messages:cs.clear_messages),t(this.props.deleter?cs.delete_messages_warning:cs.clear_messages_warning),(e=>this.props.onDeleteMessages(this.props.topic)),null,!0,null)}handleLeave(e){e.preventDefault();const{formatMessage:t}=this.props.intl;this.props.onShowAlert(t(cs.leave_chat),t(cs.leave_chat_warning),(e=>this.props.onLeaveTopic(this.props.topic)),null,!0,null)}handleBlock(e){e.preventDefault();const{formatMessage:t}=this.props.intl;this.props.onShowAlert(t(cs.block_contact),t(cs.block_contact_warning),(e=>this.props.onBlockTopic(this.props.topic)),null,!0,null)}handleReport(e){e.preventDefault();const{formatMessage:t}=this.props.intl;this.props.onShowAlert(t(cs.report_chat),t(cs.report_chat_warning),(e=>{this.props.onReportTopic(this.props.topic)}),null,!0,null)}render(){const{formatMessage:e}=this.props.intl;return t().createElement("div",{className:"scrollable-panel"},t().createElement("div",{className:"panel-form-column"},this.props.channel?null:t().createElement("a",{href:"#",className:"flat-button",onClick:this.handleDeleteMessages},t().createElement("i",{className:"material-icons"},"delete_outline")," ",e(this.props.deleter?cs.delete_messages:cs.clear_messages)),this.props.owner?t().createElement("a",{href:"#",className:"danger flat-button",onClick:this.handleDeleteTopic},t().createElement("i",{className:"material-icons"},"delete")," ",e(cs.topic_delete)):t().createElement("a",{href:"#",className:"danger flat-button",onClick:this.handleLeave},t().createElement("i",{className:"material-icons"},"exit_to_app")," ",e(cs.leave_chat)),this.props.groupTopic?null:t().createElement("a",{href:"#",className:"danger flat-button",onClick:this.handleBlock},t().createElement("i",{className:"material-icons"},"block")," ",e(cs.block_contact)),this.props.owner?null:t().createElement("a",{href:"#",className:"danger flat-button",onClick:this.handleReport},t().createElement("i",{className:"material-icons"},"report")," ",e(cs.report_chat))),t().createElement("div",{className:"hr"}),t().createElement("div",{className:"panel-form-column"},this.props.groupTopic?t().createElement(t().Fragment,null,t().createElement("div",{className:"group"},t().createElement("label",null,t().createElement(s.FormattedMessage,{id:"label_your_permissions",defaultMessage:[{type:0,value:"Your permissions:"}]}))," ",t().createElement("tt",{className:"clickable",onClick:e=>{e.preventDefault(),this.props.onLaunchPermissionsEditor("want")}},this.props.access)),this.props.channel?null:t().createElement("div",{className:"group"},t().createElement("div",null,t().createElement("label",{className:"small"},t().createElement(s.FormattedMessage,{id:"label_default_access_mode",defaultMessage:[{type:0,value:"Default access mode:"}]}))),t().createElement("div",{className:"quoted"},t().createElement("div",null,"Auth: ",t().createElement("tt",{className:this.props.owner?"clickable":null,onClick:e=>{e.preventDefault(),this.props.owner&&this.props.onLaunchPermissionsEditor("auth")}},this.props.auth)),t().createElement("div",null,"Anon: ",t().createElement("tt",{className:this.props.owner?"clickable":null,onClick:e=>{e.preventDefault(),this.props.owner&&this.props.onLaunchPermissionsEditor("anon")}},this.props.anon))))):t().createElement("div",{className:"group"},t().createElement("div",null,t().createElement("label",{className:"small"},t().createElement(s.FormattedMessage,{id:"label_permissions",defaultMessage:[{type:0,value:"Permissions:"}]}))),t().createElement("div",{className:"quoted"},t().createElement("div",null,t().createElement(s.FormattedMessage,{id:"label_you",defaultMessage:[{type:0,value:"You:"}]})," ",t().createElement("tt",{className:"clickable",onClick:e=>{e.preventDefault(),this.props.onLaunchPermissionsEditor("want")}},this.props.access)),t().createElement("div",null,this.props.fullName?this.props.fullName:e(cs.other_user),": ",t().createElement("tt",{className:"clickable",onClick:e=>{e.preventDefault(),this.props.onLaunchPermissionsEditor("given")}},this.props.modeGiven2))))))}}const ps=(0,s.injectIntl)(hs),us=(0,s.defineMessages)({info:{id:"panel_title_info",defaultMessage:[{type:0,value:"Info"}]},general:{id:"panel_title_general",defaultMessage:[{type:0,value:"General"}]},security:{id:"panel_title_security",defaultMessage:[{type:0,value:"Security"}]},members:{id:"panel_title_members",defaultMessage:[{type:0,value:"Members"}]},crop:{id:"panel_title_crop",defaultMessage:[{type:0,value:"Drag to Adjust"}]},perm_want:{id:"requested_permissions",defaultMessage:[{type:0,value:"Requested"}]},perm_given:{id:"granted_permissions",defaultMessage:[{type:0,value:"Granted"}]},perm_auth:{id:"permissions_authenticated",defaultMessage:[{type:0,value:"Authenticated"}]},perm_anon:{id:"permissions_anonymous",defaultMessage:[{type:0,value:"Anonymous"}]},perm_user:{id:"permissions_user",defaultMessage:[{type:0,value:"User's Permissions"}]},edit_permissions:{id:"menu_item_edit_permissions",defaultMessage:[{type:0,value:"Edit permissions"}]}});class ms extends t().Component{constructor(e){super(e),this.state={topic:null,owner:!1,admin:!1,sharer:!1,deleter:!1,muted:!1,address:null,groupTopic:void 0,channel:void 0,fullName:void 0,description:void 0,avatar:null,private:null,selectedContact:null,access:null,modeGiven:null,modeWant:null,modeGiven2:null,modeWant2:null,auth:null,anon:null,contactList:[],trustedBadges:[],previousMetaDesc:void 0,previousSubsUpdated:void 0},this.resetSubs=this.resetSubs.bind(this),this.resetDesc=this.resetDesc.bind(this),this.resetTags=this.resetTags.bind(this),this.onMetaDesc=this.onMetaDesc.bind(this),this.onSubsUpdated=this.onSubsUpdated.bind(this),this.handleImageChanged=this.handleImageChanged.bind(this),this.handleMuted=this.handleMuted.bind(this),this.handleUnarchive=this.handleUnarchive.bind(this),this.handlePermissionsChanged=this.handlePermissionsChanged.bind(this),this.handleLaunchPermissionsEditor=this.handleLaunchPermissionsEditor.bind(this),this.handleShowAddMembers=this.handleShowAddMembers.bind(this),this.handleMemberUpdateRequest=this.handleMemberUpdateRequest.bind(this),this.handleMemberSelected=this.handleMemberSelected.bind(this),this.handleContextMenu=this.handleContextMenu.bind(this),this.handleBackNavigate=this.handleBackNavigate.bind(this)}componentDidUpdate(e){const t=this.props.tinode.getTopic(e.topic);t&&(this.onMetaDesc!=t.onMetaDesc&&(this.previousMetaDesc=t.onMetaDesc,t.onMetaDesc=this.onMetaDesc,this.previousSubsUpdated=t.onSubsUpdated,t.onSubsUpdated=this.onSubsUpdated),this.state.topic!=e.topic&&(this.setState({topic:e.topic}),this.resetDesc(t,e),this.resetSubs(t,e),this.resetTags(t)))}componentWillUnmount(){const e=this.props.tinode.getTopic(this.props.topic);e&&(this.setState({topic:null}),e.onMetaDesc=this.previousMetaDesc,e.onSubsUpdated=this.previousSubsUpdated)}resetSubs(e,t){const a={contactList:[]};if("p2p"==e.getType()){const s=e.subscriber(t.topic);s?(a.modeGiven2=s.acs.getGiven(),a.modeWant2=s.acs.getWant()):(a.modeGiven2=Kt.xt,a.modeWant2=Kt.xt)}else e.subscribers((e=>{a.contactList.push(e)}),this);this.setState(a)}resetDesc(e,t){const a=e.getDefaultAccess()||{},s=e.getAccessMode(),n=[];if(e.trusted)for(const[t,a]of Object.entries(e.trusted))a&&n.push(t);this.setState({owner:s&&s.isOwner(),admin:s&&s.isAdmin(),sharer:s&&s.isSharer(),deleter:s&&s.isDeleter(),muted:s&&s.isMuted(),fullName:oa(e.public&&e.public.fn,Kt.S8),description:oa(e.public&&e.public.note,Kt.EI),avatar:(0,va.PD)(e.public?e.public.photo:null),trustedBadges:n,private:oa(e.private&&e.private.comment,Kt.S8),archived:e.isArchived(),address:e.name,groupTopic:e.isGroupType(),channel:e.isChannelType()||e.chan,access:s?s.getMode():void 0,modeGiven:s?s.getGiven():void 0,modeWant:s?s.getWant():void 0,auth:a.auth,anon:a.anon})}resetTags(e){if("grp"!=e.getType())return;const t=e.getAccessMode();t&&t.isOwner()&&e.getMeta(e.startMetaQuery().withTags().build())}onMetaDesc(e){const t=this.props.tinode.getTopic(this.props.topic);t&&(this.resetDesc(t,this.props),this.previousMetaDesc&&this.previousMetaDesc!=this.onMetaDesc&&this.previousMetaDesc(e))}onSubsUpdated(e){const t=this.props.tinode.getTopic(this.props.topic);t&&(this.resetSubs(t,this.props),this.previousSubsUpdated&&this.previousSubsUpdated!=this.onSubsUpdated&&this.previousSubsUpdated(e))}handleImageChanged(e,t){this.setState({avatar:t}),this.props.onTopicDescUpdate(this.props.topic,ta(null,t||Gt.Tinode.DEL_CHAR),null)}handleMuted(e,t){this.setState({muted:t}),this.props.onChangePermissions(this.props.topic,t?"-P":"+P")}handleUnarchive(e,t){this.props.onTopicUnArchive(this.props.topic)}handlePermissionsChanged(e,t){switch(e){case"auth":this.props.onTopicDescUpdateRequest(this.props.topic,null,null,{auth:t});break;case"anon":this.props.onTopicDescUpdateRequest(this.props.topic,null,null,{anon:t});break;case"mode":case"want":this.props.onChangePermissions(this.props.topic,t);break;case"given":this.props.onChangePermissions(this.props.topic,t,this.props.topic);break;case"user":this.props.onChangePermissions(this.props.topic,t,this.state.userPermissionsEdited)}this.handleBackNavigate()}handleLaunchPermissionsEditor(e,t){const{formatMessage:a}=this.props.intl;let s,n,i,r,o,d,l;switch(e){case"mode":s=this.state.access;break;case"want":s=this.state.modeWant,n=this.state.modeGiven,this.state.owner?i="O":(i=Gt.AccessMode.encode(Gt.AccessMode.diff("ASDO",this.state.modeGiven)),this.state.channel&&(i+="W")),r=a(us.perm_want),o=a(us.perm_given);break;case"given":s=this.state.modeGiven2,n=this.state.modeWant2,i=this.state.groupTopic?this.state.owner?"":"O":"ASDO",r=a(us.perm_given),o=a(us.perm_want);break;case"auth":s=this.state.auth,i="O";break;case"anon":s=this.state.anon,i="O";break;case"user":{const e=this.props.tinode.getTopic(this.props.topic);if(!e)return;const c=e.subscriber(t);if(!c||!c.acs)return;s=c.acs.getGiven(),n=c.acs.getWant(),i=this.state.owner?"":"O",r=a(us.perm_given),o=a(us.perm_want),c.public&&(d=c.public.fn,l=c.public.photo);break}default:return void console.error("Unknown permission editing mode '"+e+"'")}this.setState({userPermissionsEdited:t,userPermissionsTitle:d,userPermissionsAvatar:l,editedPermissions:s,immutablePermissions:n,editedPermissionsTitle:r,immutablePermissionsTitle:o,editedPermissionsSkipped:i}),this.props.onNavigate(`perm/${e}`)}handleShowAddMembers(e){e.preventDefault(),this.props.onInitFind(),this.props.onNavigate("members")}handleMemberUpdateRequest(e,t,a){this.props.onMemberUpdateRequest(this.props.topic,t,a),this.props.onNavigate("info")}handleMemberSelected(e){this.setState({selectedContact:e})}handleBackNavigate(){const e=(this.props.panel||"info").split("/");"info"==e[0]?this.props.onNavigate(null):"perm"==e[0]?"user"==e[1]?this.props.onNavigate("info"):this.props.onNavigate("security"):this.props.onNavigate("info")}handleContextMenu(e){const{formatMessage:t}=this.props.intl,a=this.props.tinode.getTopic(this.props.topic);if(!a)return;const s=a.subscriber(e.topicName);if(!s||!s.acs)return;const n=this.props.tinode.isMe(e.topicName),i=[{title:t(us.edit_permissions),handler:t=>this.handleLaunchPermissionsEditor(n?"want":"user",e.topicName)}];n||i.push("member_delete"),i.push(s.acs.isMuted()?"member_unmute":"member_mute"),n||i.push(s.acs.isJoiner()?"member_block":"member_unblock"),this.props.showContextMenu({topicName:this.props.topic,x:e.x,y:e.y,user:e.topicName},i)}render(){const e=(this.props.panel||"info").split("/"),a=e[0];e.shift();const{formatMessage:n}=this.props.intl,i=n(("perm"==a?us["perm_"+e[0]]:us[a])||us.info);return t().createElement("div",{id:"info-view"},t().createElement("div",{className:"caption-panel",id:"info-caption-panel"},t().createElement("div",{className:"panel-title",id:"info-title"},i),t().createElement("div",null,t().createElement(Ka,{onCancel:this.handleBackNavigate}))),this.props.displayMobile?t().createElement(za,{level:this.props.errorLevel,text:this.props.errorText,onClearError:this.props.onError}):null,"members"==a?t().createElement(Ja,{tinode:this.props.tinode,members:this.state.contactList,requiredMember:this.props.myUserId,keepInitialMembers:!this.state.admin&&!this.state.owner,myUserId:this.props.myUserId,contacts:this.props.searchableContacts,onCancel:this.handleBackNavigate,onSubmit:this.handleMemberUpdateRequest}):"perm"==a&&e.length>0?t().createElement(as,{tinode:this.props.tinode,mode:this.state.editedPermissions,compare:this.state.immutablePermissions,skip:this.state.editedPermissionsSkipped,modeTitle:this.state.editedPermissionsTitle,compareTitle:this.state.immutablePermissionsTitle,userTitle:this.state.userPermissionsTitle,item:this.state.userPermissionsEdited,userAvatar:this.state.userPermissionsAvatar,onSubmit:t=>this.handlePermissionsChanged(e[0],t),onCancel:this.handleBackNavigate}):"general"==a?t().createElement(ls,{tinode:this.props.tinode,topic:this.props.topic,reqCredMethod:this.props.reqCredMethod,onCredAdd:this.props.onCredAdd,onUpdateTagsRequest:this.props.onTopicTagsUpdateRequest,onCredConfirm:this.props.onCredConfirm,onCredDelete:this.props.onCredDelete,onUpdateTopicDesc:this.props.onTopicDescUpdateRequest,onError:this.props.onError}):"security"==a?t().createElement(ps,{topic:this.props.topic,owner:this.state.owner,admin:this.state.admin,sharer:this.state.sharer,deleter:this.state.deleter,muted:this.state.muted,groupTopic:this.state.groupTopic,channel:this.state.channel,access:this.state.access,modeGiven:this.state.modeGiven,modeWant:this.state.modeWant,modeGiven2:this.state.modeGiven2,modeWant2:this.state.modeWant2,auth:this.state.auth,anon:this.state.anon,onShowAlert:this.props.onShowAlert,onDeleteMessages:this.props.onDeleteMessages,onLeaveTopic:this.props.onLeaveTopic,onBlockTopic:this.props.onBlockTopic,onReportTopic:this.props.onReportTopic,onLaunchPermissionsEditor:this.handleLaunchPermissionsEditor,onNavigate:this.props.onNavigate}):t().createElement("div",{id:"info-view-content",className:"scrollable-panel"},t().createElement("div",{className:"panel-form-column"},t().createElement("a",{href:"#",className:"flat-button float-right",onClick:e=>{e.preventDefault(),this.props.onNavigate("general")}},t().createElement("i",{className:"material-icons"},"edit")," ",t().createElement(s.FormattedMessage,{id:"button_edit",defaultMessage:[{type:0,value:"Edit"}]})),t().createElement("center",null,t().createElement(Ga,{tinode:this.props.tinode,avatar:this.state.avatar,readOnly:!0,uid:this.props.topic,title:this.state.fullName})),t().createElement("div",{className:"group"},t().createElement("div",null,t().createElement("label",{className:"small"},t().createElement(s.FormattedMessage,{id:"label_topic_name",defaultMessage:[{type:0,value:"Name"}]}))),t().createElement("div",{className:"large ellipsized"},this.state.fullName,this.state.channel?t().createElement("img",{src:"/img/channel.png",className:"channel",alt:"channel"}):null)),this.state.private?t().createElement("div",{className:"group"},t().createElement("div",null,t().createElement("label",{className:"small"},t().createElement(s.FormattedMessage,{id:"label_private",defaultMessage:[{type:0,value:"Private comment"}]}))),t().createElement("div",{className:"large ellipsized"},this.state.private)):null,t().createElement("div",{className:"group"},t().createElement("label",{className:"small"},t().createElement(s.FormattedMessage,{id:"label_user_id",defaultMessage:[{type:0,value:"ID:"}]}))," ",t().createElement("tt",null,this.state.address)),t().createElement("div",{className:"group"},t().createElement(Ba,{trustedBadges:this.state.trustedBadges})),this.state.description?t().createElement("div",{className:"group"},t().createElement("label",{className:"small"},t().createElement(s.FormattedMessage,{id:"label_description",defaultMessage:[{type:0,value:"Description"}]})),t().createElement("div",null,this.state.description)):null),t().createElement("div",{className:"hr"}),t().createElement("div",{className:"panel-form-row"},t().createElement("label",null,t().createElement(s.FormattedMessage,{id:"label_muting_topic",defaultMessage:[{type:0,value:"Muted:"}]})),t().createElement(Wa,{name:"P",checked:this.state.muted,onChange:this.handleMuted})),this.state.archived?t().createElement("div",{className:"panel-form-row"},t().createElement("label",null,t().createElement(s.FormattedMessage,{id:"label_unarchive_topic",defaultMessage:[{type:0,value:"Archived:"}]})),t().createElement(Wa,{name:"archived",checked:!0,onChange:this.handleUnarchive})):null,t().createElement("div",{className:"hr"}),t().createElement("div",{className:"panel-form-row"},t().createElement("a",{href:"#",className:"flat-button",onClick:e=>{e.preventDefault(),this.props.onNavigate("security")}},t().createElement("i",{className:"material-icons"},"security")," ",t().createElement(s.FormattedMessage,{id:"button_security",defaultMessage:[{type:0,value:"Security"}]}))),this.state.groupTopic&&this.state.sharer?t().createElement(t().Fragment,null,t().createElement("div",{className:"hr"}),t().createElement("div",{className:"panel-form-row"},t().createElement("label",{className:"small"},t().createElement(s.FormattedMessage,{id:"label_group_members",defaultMessage:[{type:0,value:"Group members:"}]}))),t().createElement("div",{className:"panel-form-row"},t().createElement("a",{href:"#",className:"flat-button",onClick:this.handleShowAddMembers},t().createElement("i",{className:"material-icons"},"person_add")," ",t().createElement(s.FormattedMessage,{id:"button_add_members",defaultMessage:[{type:0,value:"Add members"}]}))),t().createElement(s.FormattedMessage,{id:"group_has_no_members",defaultMessage:[{type:0,value:"No members"}]},(e=>t().createElement(Ra,{tinode:this.props.tinode,contacts:this.state.contactList,myUserId:this.props.myUserId,emptyListMessage:e,topicSelected:this.state.selectedContact,showOnline:!1,showUnread:!1,showMode:!0,noScroll:!0,onTopicSelected:this.handleMemberSelected,showContextMenu:!!this.state.admin&&this.handleContextMenu})))):null))}}const gs=(0,s.injectIntl)(ms),fs=new Audio("audio/call-out.m4a");fs.loop=!0;const vs=new Audio("audio/call-end.m4a");vs.loop=!0;const $s=new Audio("audio/dialing.m4a"),bs="video:muted",ys="video:unmuted",Es=(0,s.defineMessages)({already_in_call:{id:"already_in_call",defaultMessage:[{type:0,value:"You already in an ongoing call!"}]}});class Cs extends t().PureComponent{constructor(e){super(e),this.state={localStream:void 0,remoteStream:void 0,pc:void 0,dataChannel:void 0,previousOnInfo:void 0,waitingForPeer:!1,callInitialSetupComplete:!1,audioOnly:e.callAudioOnly,videoToggleInProgress:!1,remoteVideoLive:!1},this.localStreamConstraints={audio:!0,video:!e.callAudioOnly},this.isOutgoingCall=1==e.callState,this.localRef=t().createRef(),this.remoteRef=t().createRef(),this.remoteIceCandidatesCache=[],this.onInfo=this.onInfo.bind(this),this.start=this.start.bind(this),this.stop=this.stop.bind(this),this.createPeerConnection=this.createPeerConnection.bind(this),this.canSendOffer=this.canSendOffer.bind(this),this.drainRemoteIceCandidatesCache=this.drainRemoteIceCandidatesCache.bind(this),this.handleNegotiationNeededEvent=this.handleNegotiationNeededEvent.bind(this),this.handleICECandidateEvent=this.handleICECandidateEvent.bind(this),this.handleNewICECandidateMsg=this.handleNewICECandidateMsg.bind(this),this.handleICEConnectionStateChangeEvent=this.handleICEConnectionStateChangeEvent.bind(this),this.handleSignalingStateChangeEvent=this.handleSignalingStateChangeEvent.bind(this),this.handleICEGatheringStateChangeEvent=this.handleICEGatheringStateChangeEvent.bind(this),this.handleIceCandidateErrorEvent=this.handleIceCandidateErrorEvent.bind(this),this.handleTrackEvent=this.handleTrackEvent.bind(this),this.handleVideoOfferMsg=this.handleVideoOfferMsg.bind(this),this.handleVideoAnswerMsg=this.handleVideoAnswerMsg.bind(this),this.handleNewICECandidateMsg=this.handleNewICECandidateMsg.bind(this),this.reportError=this.reportError.bind(this),this.handleGetUserMediaError=this.handleGetUserMediaError.bind(this),this.stopTracks=this.stopTracks.bind(this),this.disconnectMedia=this.disconnectMedia.bind(this),this.handleCloseClick=this.handleCloseClick.bind(this),this.handleToggleCameraClick=this.handleToggleCameraClick.bind(this),this.handleToggleMicClick=this.handleToggleMicClick.bind(this),this.handleRemoteHangup=this.handleRemoteHangup.bind(this),this.handleVideoCallAccepted=this.handleVideoCallAccepted.bind(this),this.muteVideo=this.muteVideo.bind(this),this.unmuteVideo=this.unmuteVideo.bind(this),this.emptyVideoTrack=this.emptyVideoTrack.bind(this),this.handleDataChannelEvent=this.handleDataChannelEvent.bind(this),this.handleDataChannelError=this.handleDataChannelError.bind(this),this.handleDataChannelMessage=this.handleDataChannelMessage.bind(this),this.handleDataChannelOpen=this.handleDataChannelOpen.bind(this),this.handleDataChannelClose=this.handleDataChannelClose.bind(this)}componentDidMount(){const e=this.props.tinode.getTopic(this.props.topic);this.previousOnInfo=e.onInfo,e.onInfo=this.onInfo,1!=this.props.callState&&3!=this.props.callState||!this.localRef.current||this.start()}componentWillUnmount(){this.props.tinode.getTopic(this.props.topic).onInfo=this.previousOnInfo,this.stop()}handleVideoCallAccepted(e){fs.pause();const t=this.createPeerConnection(),a=this.state.localStream;a.getTracks().forEach((e=>{t.addTrack(e,a),"video"==e.kind&&this.state.audioOnly&&(e.enabled=!1,e.stop(),a.removeTrack(e))}))}onInfo(e){if("call"==e.what)switch(e.event){case"accept":this.handleVideoCallAccepted(e);break;case"answer":this.handleVideoAnswerMsg(e);break;case"ice-candidate":this.handleNewICECandidateMsg(e);break;case"hang-up":this.handleRemoteHangup(e);break;case"offer":this.handleVideoOfferMsg(e);break;case"ringing":fs.play().catch((e=>{}));break;default:console.warn("Unknown call event",e.event)}}emptyVideoTrack(){const e=Object.assign(document.createElement("canvas"),{width:640,height:480});e.getContext("2d").fillRect(0,0,640,480);const t=e.captureStream(0);return Object.assign(t.getVideoTracks()[0],{enabled:!1})}start(){this.state.localStream?this.props.onError(this.props.intl.formatMessage(Es.already_in_call),"info"):3!=this.props.callState?navigator.mediaDevices.getUserMedia(this.localStreamConstraints).then((e=>{this.localStreamConstraints.video||e.addTrack(this.emptyVideoTrack()),this.setState({localStream:e,waitingForPeer:!0}),this.localRef.current.srcObject=e,$s.play(),this.props.onInvite(this.props.topic,this.props.seq,this.props.callState,this.props.callAudioOnly)})).catch(this.handleGetUserMediaError):this.props.onInvite(this.props.topic,this.props.seq,3,this.props.callAudioOnly)}stop(){vs.pause(),vs.currentTime=0,fs.pause(),fs.currentTime=0,this.stopTracks(this.state.localStream),this.stopTracks(this.state.remoteStream),this.disconnectMedia(this.localRef.current),this.disconnectMedia(this.remoteRef.current),this.state.pc&&(this.state.pc.ontrack=null,this.state.pc.onremovetrack=null,this.state.pc.onremovestream=null,this.state.pc.onicecandidate=null,this.state.pc.oniceconnectionstatechange=null,this.state.pc.onsignalingstatechange=null,this.state.pc.onicegatheringstatechange=null,this.state.pc.onnegotiationneeded=null,this.state.pc.onicecandidateerror=null,this.state.pc.ondatachannel=null,this.state.dataChannel&&this.state.dataChannel.close(),this.state.pc.close()),this.setState({pc:null,waitingForPeer:!1})}disconnectMedia(e){e&&(e.srcObject=null,e.src="")}stopTracks(e){if(!e)return;let t=e.getTracks();t&&t.forEach((e=>{e.stop(),e.enabled=!1}))}handleDataChannelError(e){console.error("data channel error",e)}handleDataChannelMessage(e){switch(e.data){case bs:this.setState({remoteVideoLive:!1},(e=>{this.remoteRef.current.srcObject=this.state.remoteStream}));break;case ys:this.setState({remoteVideoLive:!0},(e=>{this.remoteRef.current.srcObject=this.state.remoteStream}))}}handleDataChannelOpen(e){this.state.audioOnly||e.target.send(ys)}handleDataChannelClose(){}handleDataChannelEvent(e){const t=e.channel;t.onerror=this.handleDataChannelError,t.onmessage=this.handleDataChannelMessage,t.onopen=this.handleDataChannelOpen,t.onclose=this.handleDataChannelClose,this.setState({dataChannel:t})}createPeerConnection(){const e=this.props.tinode.getServerParam("iceServers",null),t=e?new RTCPeerConnection({iceServers:e}):new RTCPeerConnection;t.onicecandidate=this.handleICECandidateEvent,t.oniceconnectionstatechange=this.handleICEConnectionStateChangeEvent,t.onicegatheringstatechange=this.handleICEGatheringStateChangeEvent,t.onsignalingstatechange=this.handleSignalingStateChangeEvent,t.onnegotiationneeded=this.handleNegotiationNeededEvent,t.onicecandidateerror=this.handleIceCandidateErrorEvent,t.ontrack=this.handleTrackEvent,t.ondatachannel=this.handleDataChannelEvent;const a=t.createDataChannel("events",{ordered:!0});return a.onerror=this.handleDataChannelError,a.onmessage=this.handleDataChannelMessage,a.onopen=this.handleDataChannelOpen,a.onclose=this.handleDataChannelClose,this.setState({pc:t,dataChannel:a,waitingForPeer:!1}),t}handleVideoAnswerMsg(e){const t=new RTCSessionDescription(e.payload);this.state.pc.setRemoteDescription(t).then((e=>{this.setState({callInitialSetupComplete:!0},(e=>this.drainRemoteIceCandidatesCache()))})).catch((e=>this.reportError(e)))}reportError(e){this.props.onError(e.message,"err")}canSendOffer(){return this.isOutgoingCall||this.state.callInitialSetupComplete}handleNegotiationNeededEvent(e){const t=e.target;this.canSendOffer()&&t.createOffer().then((e=>t.setLocalDescription(e))).then((e=>{this.props.onSendOffer(this.props.topic,this.props.seq,t.localDescription.toJSON())})).catch((e=>this.reportError(e)))}handleIceCandidateErrorEvent(e){console.warn("ICE candidate error:",e)}handleICECandidateEvent(e){e.candidate&&this.props.onIceCandidate(this.props.topic,this.props.seq,e.candidate.toJSON())}handleNewICECandidateMsg(e){const t=new RTCIceCandidate(e.payload);this.state.callInitialSetupComplete?this.state.pc.addIceCandidate(t).catch((e=>{t.candidate&&this.reportError(e),console.warn("Error adding new ice candidate",t,e)})):this.remoteIceCandidatesCache.push(t)}drainRemoteIceCandidatesCache(){this.remoteIceCandidatesCache.forEach((e=>{this.state.pc.addIceCandidate(e).catch((t=>{e.candidate&&this.reportError(t),console.warn("Error adding cached ice candidate",e,t)}))})),this.remoteIceCandidatesCache=[]}handleICEConnectionStateChangeEvent(e){switch(e.target.iceConnectionState){case"closed":case"failed":this.handleCloseClick()}}handleSignalingStateChangeEvent(e){"closed"==e.target.signalingState&&this.handleCloseClick()}handleICEGatheringStateChangeEvent(e){}handleTrackEvent(e){this.remoteRef.current.srcObject=e.streams[0],this.setState({remoteStream:e.streams[0]})}handleGetUserMediaError(e){switch(console.error("Error opening camera and/or microphone",e),e.name){case"NotFoundError":default:this.reportError(e);case"SecurityError":case"PermissionDeniedError":}this.handleCloseClick()}handleVideoOfferMsg(e){let t=null;const a=this.state.pc?this.state.pc:this.createPeerConnection(),s=new RTCSessionDescription(e.payload);a.setRemoteDescription(s).then((e=>navigator.mediaDevices.getUserMedia(this.localStreamConstraints))).then((e=>{let s;this.localStreamConstraints.video||(s=this.emptyVideoTrack(),e.addTrack(s)),t=e,this.localRef.current.srcObject=e,this.setState({localStream:e}),t.getTracks().forEach((e=>{a.addTrack(e,t)})),s&&(s.enabled=!1,s.stop(),e.removeTrack(s))})).then((e=>a.createAnswer())).then((e=>a.setLocalDescription(e))).then((e=>{this.props.onSendAnswer(this.props.topic,this.props.seq,a.localDescription.toJSON()),this.setState({callInitialSetupComplete:!0},(e=>this.drainRemoteIceCandidatesCache()))})).catch(this.handleGetUserMediaError)}handleRemoteHangup(){this.state.waitingForPeer?(this.setState({waitingForPeer:!1}),fs.pause(),fs.currentTime=0,vs.loop=!0,vs.play().catch((e=>{})),setTimeout((e=>{this.handleCloseClick()}),2e3)):this.handleCloseClick()}handleCloseClick(){this.stop(),this.props.onHangup(this.props.topic,this.props.seq)}muteVideo(){if(!this.state.pc||!this.state.dataChannel)return;const e=this.state.localStream,t=e.getVideoTracks()[0];t.enabled=!1,t.stop(),e.removeTrack(t),this.state.dataChannel.send(bs),this.setState({videoToggleInProgress:!1})}unmuteVideo(){this.state.pc&&this.state.dataChannel&&navigator.mediaDevices.getUserMedia({video:!0}).then((e=>{this.localRef.current.srcObject=null;const t=this.state.pc.getSenders().find((e=>"video"==e.track.kind)),a=e.getVideoTracks()[0];return e.removeTrack(a),this.state.localStream.addTrack(a),t.replaceTrack(a)})).then((e=>{this.localRef.current.srcObject=this.state.localStream,this.state.dataChannel.send(ys)})).catch((e=>this.handleGetUserMediaError(e))).finally((e=>{this.setState({videoToggleInProgress:!1})}))}handleToggleCameraClick(){if(this.state.videoToggleInProgress)return;const e=this.state.localStream.getVideoTracks();this.setState({videoToggleInProgress:!0},(t=>{e&&e.length>0&&e[0].enabled&&"live"==e[0].readyState?this.muteVideo():this.unmuteVideo(),this.setState({audioOnly:!this.state.audioOnly})}))}handleToggleMicClick(){const e=this.state.localStream.getAudioTracks()[0];e.enabled=!e.enabled,this.forceUpdate()}render(){const e=this.state.localStream&&this.state.localStream.getAudioTracks(),a=!this.state.audioOnly&&this.state.localStream&&this.state.localStream.getVideoTracks(),n=!this.state.pc||!this.state.dataChannel||!(e&&e[0]),i=e&&e[0]&&e[0].enabled?"mic":"mic_off",r=a&&a[0]&&a[0].enabled&&"live"==a[0].readyState?"videocam":"videocam_off",o=oa(this.props.title,Kt.gD),d=this.state.waitingForPeer?" pulse":"";let l=!1;if(this.remoteRef.current&&this.remoteRef.current.srcObject&&this.state.remoteVideoLive){const e=this.remoteRef.current.srcObject;if(e.getVideoTracks().length>0){const t=e.getVideoTracks()[0];l=t.enabled&&"live"==t.readyState}}return t().createElement(t().Fragment,null,t().createElement("div",{id:"video-container"},t().createElement("div",{id:"video-container-panel"},t().createElement("div",{className:"call-party self",disabled:this.state.audioOnly},t().createElement("video",{ref:this.localRef,autoPlay:!0,muted:!0,playsInline:!0}),t().createElement("div",{className:"caller-name inactive"},t().createElement(s.FormattedMessage,{id:"calls_you_label",defaultMessage:[{type:0,value:"You"}]}))),t().createElement("div",{className:"call-party peer",disabled:!l},l?t().createElement(t().Fragment,null,t().createElement("video",{ref:this.remoteRef,autoPlay:!0,playsInline:!0}),t().createElement("div",{className:"caller-name inactive"},o)):t().createElement(t().Fragment,null,t().createElement("audio",{ref:this.remoteRef,autoPlay:!0}),t().createElement("div",{className:`caller-card${d}`},t().createElement("div",{className:"avatar-box"},t().createElement(da,{tinode:this.props.tinode,avatar:this.props.avatar,topic:this.props.topic,title:this.props.title})),t().createElement("div",{className:"caller-name"},o))))),t().createElement("div",{className:"controls"},t().createElement("button",{className:"danger",onClick:this.handleCloseClick},t().createElement("i",{className:"material-icons"},"call_end")),t().createElement("button",{className:"secondary",onClick:this.handleToggleCameraClick,disabled:n},t().createElement("i",{className:"material-icons"},r)),t().createElement("button",{className:"secondary",onClick:this.handleToggleMicClick,disabled:n},t().createElement("i",{className:"material-icons"},i)))))}}const ws=(0,s.injectIntl)(Cs);class Ss extends t().Component{constructor(e){super(e),this.state={downloader:null,progress:0},this.downloadFile=this.downloadFile.bind(this),this.handleCancel=this.handleCancel.bind(this)}downloadFile(e,t,a){if(!e)return void this.props.onError("Invalid download URL '"+e+"'");const s=this.props.tinode.getLargeFileHelper();this.setState({downloader:s}),s.download(e,t,a,(e=>this.setState({progress:e/this.props.size})),(e=>this.props.onError(e,"err"))).then((e=>this.setState({downloader:null,progress:0}))).catch((e=>{e&&this.props.onError("Error downloading file: "+e.message,"err"),this.setState({downloader:null,progress:0})}))}handleCancel(){this.props.uploading?this.props.onCancelUpload():this.state.downloader&&this.state.downloader.cancel()}render(){let e=this.props.filename||"file_attachment";e.length>36&&(e=e.substr(0,16)+"..."+e.substr(-16));let a,n,i=this.props.size>0?t().createElement("span",{className:"small gray"},"(",(0,Jt.FK)(this.props.size),")"):null;this.props.uploading||this.state.downloader||!function(e){return e&&!/^\s*([a-z][a-z0-9+.-]*:|\/\/)/im.test(e)}(this.props.downloadUrl)?(a=sa(this.props.downloadUrl),n=null):(a="#",n=e=>{e.preventDefault(),this.downloadFile(this.props.downloadUrl,this.props.filename,this.props.mimetype)});const r=t().createElement(t().Fragment,null,t().createElement("i",{className:"material-icons"},"file_download")," ",t().createElement(s.FormattedMessage,{id:"save_attachment",defaultMessage:[{type:0,value:"save"}]}));return t().createElement("div",{className:"attachment"},t().createElement("div",null,t().createElement("i",{className:"material-icons big gray"},"insert_drive_file")),t().createElement("div",{className:"flex-column"},t().createElement("div",null,e," ",i),this.props.uploading||this.state.downloader?t().createElement(ga,{progress:this.props.uploading?this.props.progress:this.state.progress,onCancel:this.handleCancel}):t().createElement("div",null,a?t().createElement("a",{href:a,download:this.props.filename,onClick:n},r):t().createElement("span",{className:"light-gray"},r))))}}const Ms=(0,s.defineMessages)({message_sending:{id:"message_sending",defaultMessage:[{type:0,value:"sending..."}]},message_sending_failed:{id:"message_sending_failed",defaultMessage:[{type:0,value:"failed"}]},message_edited_marker:{id:"message_edited_marker",defaultMessage:[{type:0,value:", edited"}]}});class _s extends t().PureComponent{render(){const{formatMessage:e}=this.props.intl;let a;a=this.props.received<=Gt.Tinode.MESSAGE_STATUS_SENDING?e(Ms.message_sending):this.props.received==Gt.Tinode.MESSAGE_STATUS_FAILED?e(Ms.message_sending_failed):this.props.timestamp.toLocaleTimeString(this.props.intl.locale,{timeStyle:"short"});const s=ia(this.props.received),n=s?t().createElement("i",{className:"material-icons small "+s.color},s.name):null,i=this.props.edited?e(Ms.message_edited_marker):null;return t().createElement("span",{className:"timestamp"},a,i," ",n)}}const Ts=(0,s.injectIntl)(_s);function Ns(){return Ns=Object.assign?Object.assign.bind():function(e){for(var t=1;tGt.Tinode.MESSAGE_STATUS_FAILED&&(t.push("menu_item_reply"),!this.props.response)){let e=!1;Gt.Drafty.entities(this.props.content,((t,a,s)=>(e=["AU","EX","FM","IM","VC","VD"].includes(s),e))),e||Gt.Drafty.styles(this.props.content,(t=>(e=["QQ"].includes(t),e))),e||t.push("menu_item_edit")}t.push("menu_item_forward"),this.props.showContextMenu({seq:this.props.seq,replace:this.props.edited?parseInt(this.props.edited.split(":")[1]):0,content:this.props.content,userFrom:this.props.userFrom,userName:this.props.userName,y:e.pageY,x:e.pageX,pickReply:this.props.pickReply,editMessage:this.props.editMessage},t)}handleProgress(e){this.setState({progress:e})}handleCancelUpload(){this.props.onCancelUpload(this.props.seq,this.props.uploader)}handleQuoteClick(e){e.preventDefault(),e.stopPropagation();const t=this.props.replyToSeq;t&&this.props.onQuoteClick(t)}render(){const e=this.props.sequence+" "+(this.props.response?"left":"right"),a="single"==this.props.sequence||"last"==this.props.sequence?"bubble tip":"bubble",n=this.props.userAvatar||!0,i=this.props.isGroup&&this.props.response&&("single"==this.props.sequence||"last"==this.props.sequence);let r=this.props.content;const o=[];if(this.props.mimeType==Gt.Drafty.getContentType()&&Gt.Drafty.isValid(r)){Gt.Drafty.attachments(r,((e,a)=>{"application/json"!=e.mime&&o.push(t().createElement(Ss,{tinode:this.props.tinode,downloadUrl:Gt.Drafty.getDownloadUrl(e),filename:e.name,uploading:Gt.Drafty.isProcessing(e),mimetype:e.mime,size:Gt.Drafty.getEntitySize(e),progress:this.state.progress,onCancelUpload:this.handleCancelUpload,onError:this.props.onError,key:a}))}),this);const e=Gt.Drafty.format(r,ba,this.formatterContext);r=t().createElement(t().Fragment,null,e)}else"string"!=typeof r&&(r=t().createElement(t().Fragment,null,t().createElement("i",{className:"material-icons gray"},"warning_amber")," ",t().createElement("i",{className:"gray"},t().createElement(s.FormattedMessage,{id:"invalid_content",defaultMessage:[{type:0,value:"invalid content"}]}))));return t().createElement("li",{ref:this.props.innerRef,className:e},this.props.isGroup&&this.props.response?t().createElement("div",{className:"avatar-box"},i?t().createElement(da,{tinode:this.props.tinode,topic:this.props.userFrom,title:this.props.userName,avatar:n}):null):null,t().createElement("div",null,t().createElement("div",{className:a},t().createElement("div",{className:"content-meta"},t().createElement("div",{className:"message-content"},r,o),this.props.timestamp?t().createElement(Ts,{edited:this.props.edited,timestamp:this.props.timestamp,received:this.props.received}):null),this.props.showContextMenu?t().createElement("span",{className:"menuTrigger"},t().createElement("a",{href:"#",onClick:this.handleContextClick},t().createElement("i",{className:"material-icons"},"expand_more"))):null),i?t().createElement("div",{className:"author"},this.props.userName||t().createElement("i",null,t().createElement(s.FormattedMessage,{id:"user_not_found",defaultMessage:[{type:0,value:"Not found"}]}))):null))}}const As=(0,s.injectIntl)(ks),Ps=t().forwardRef(((e,a)=>t().createElement(As,Ns({innerRef:a},e)))),Ds=t().lazy((e=>Promise.all([r.e(246),r.e(252)]).then(r.bind(r,252)))),Is=(0,s.defineMessages)({messaging_disabled:{id:"messaging_disabled_prompt",defaultMessage:[{type:0,value:"Messaging disabled"}]},type_new_message:{id:"new_message_prompt",defaultMessage:[{type:0,value:"New message"}]},add_image_caption:{id:"image_caption_prompt",defaultMessage:[{type:0,value:"Image caption"}]},file_attachment_too_large:{id:"file_attachment_too_large",defaultMessage:[{type:0,value:"The file size "},{type:1,value:"size"},{type:0,value:" exceeds the "},{type:1,value:"limit"},{type:0,value:" limit."}]},cannot_initiate_upload:{id:"cannot_initiate_file_upload",defaultMessage:[{type:0,value:"Cannot initiate file upload."}]},icon_title_record_voice:{id:"icon_title_record_voice",defaultMessage:[{type:0,value:"Record voice message"}]},icon_title_attach_file:{id:"icon_title_attach_file",defaultMessage:[{type:0,value:"Attach file"}]},icon_title_add_image:{id:"icon_title_add_image",defaultMessage:[{type:0,value:"Add image"}]},icon_title_send:{id:"icon_title_send",defaultMessage:[{type:0,value:"Send message"}]}});class Rs extends t().PureComponent{constructor(e){super(e),this.state={quote:null,message:"",audioRec:!1,audioAvailable:!(!navigator.mediaDevices||!navigator.mediaDevices.getUserMedia)},this.keypressTimestamp=0,this.handlePasteEvent=this.handlePasteEvent.bind(this),this.handleAttachImage=this.handleAttachImage.bind(this),this.handleAttachFile=this.handleAttachFile.bind(this),this.handleAttachAudio=this.handleAttachAudio.bind(this),this.handleSend=this.handleSend.bind(this),this.handleKeyPress=this.handleKeyPress.bind(this),this.handleMessageTyping=this.handleMessageTyping.bind(this),this.handleDropAttach=this.handleDropAttach.bind(this),this.handleQuoteClick=this.handleQuoteClick.bind(this),this.formatReply=this.formatReply.bind(this)}componentDidMount(){this.messageEditArea&&(this.messageEditArea.addEventListener("paste",this.handlePasteEvent,!1),"all"==window.getComputedStyle(this.messageEditArea).getPropertyValue("transition-property")&&this.messageEditArea.focus()),this.setState({quote:this.formatReply()})}componentWillUnmount(){this.messageEditArea&&this.messageEditArea.removeEventListener("paste",this.handlePasteEvent,!1)}componentDidUpdate(e){if(this.messageEditArea&&"all"==window.getComputedStyle(this.messageEditArea).getPropertyValue("transition-property")&&this.messageEditArea.focus(),e.topicName!=this.props.topicName)this.setState({message:this.props.initMessage||"",audioRec:!1,quote:null});else if(e.initMessage!=this.props.initMessage){const e=this.props.initMessage||"";this.setState({message:e},(t=>{this.messageEditArea.scrollTop=this.messageEditArea.scrollHeight,this.messageEditArea.setSelectionRange(e.length,e.length)}))}e.reply!=this.props.reply&&this.setState({quote:this.formatReply()})}formatReply(){return this.props.reply?Gt.Drafty.format(this.props.reply.content,Ta,{formatMessage:this.props.intl.formatMessage.bind(this.props.intl),authorizeURL:this.props.tinode.authorizeURL.bind(this.props.tinode)}):null}handlePasteEvent(e){this.props.disabled||(0,va.Y)(e,(e=>{this.props.onAttachImage(e)}),(e=>{this.props.onAttachFile(e)}),this.props.onError)&&e.preventDefault()}handleAttachImage(e){e.target.files&&e.target.files.length>0&&this.props.onAttachImage(e.target.files[0]),e.target.value=""}handleAttachFile(e){e.target.files&&e.target.files.length>0&&this.props.onAttachFile(e.target.files[0]),e.target.value=""}handleDropAttach(e){e&&e.length>0&&this.props.onAttachFile(e[0])}handleAttachAudio(e,t,a){this.setState({audioRec:!1}),this.props.onAttachAudio(e,t,a)}handleSend(e){e.preventDefault();const t=this.state.message.trim();(t||this.props.acceptBlank||this.props.noInput)&&(this.props.onSendMessage(t),this.setState({message:""}))}handleKeyPress(e){if(this.state.audioRec)return e.preventDefault(),void e.stopPropagation();"Enter"===e.key&&(e.shiftKey||(e.preventDefault(),e.stopPropagation(),this.handleSend(e)))}handleMessageTyping(e){if(this.setState({message:e.target.value}),this.props.onKeyPress){const e=(new Date).getTime();e-this.keypressTimestamp>Kt.mc&&(this.props.onKeyPress(),this.keypressTimestamp=e)}}handleQuoteClick(e){if(e.preventDefault(),e.stopPropagation(),this.props.reply&&this.props.onQuoteClick){const e=this.props.reply.seq;this.props.onQuoteClick(e)}}render(){const{formatMessage:a}=this.props.intl,n=this.props.disabled?a(Is.messaging_disabled):this.props.messagePrompt?a(Is[this.props.messagePrompt]):a(Is.type_new_message),i=this.props.reply&&this.props.reply.editing?"check_circle":"send",r=this.state.quote?t().createElement("div",{id:"reply-quote-preview"},t().createElement("div",{className:"cancel"},t().createElement("a",{href:"#",onClick:e=>{e.preventDefault(),this.props.onCancelReply()}},t().createElement("i",{className:"material-icons gray"},"close"))),this.state.quote):null,o=this.state.audioAvailable&&this.props.onAttachAudio;return t().createElement("div",{id:"send-message-wrapper"},this.props.noInput?null:r,t().createElement("div",{id:"send-message-panel"},this.props.disabled?t().createElement("div",{id:"writing-disabled"},n):t().createElement(t().Fragment,null,this.props.onAttachFile&&!this.state.audioRec?t().createElement(t().Fragment,null,t().createElement("a",{href:"#",onClick:e=>{e.preventDefault(),this.attachImage.click()},title:a(Is.icon_title_add_image)},t().createElement("i",{className:"material-icons secondary"},"photo")),t().createElement("a",{href:"#",onClick:e=>{e.preventDefault(),this.attachFile.click()},title:a(Is.icon_title_attach_file)},t().createElement("i",{className:"material-icons secondary"},"attach_file"))):null,this.props.noInput?r||t().createElement("div",{className:"hr thin"}):this.state.audioRec?t().createElement(e.Suspense,{fallback:t().createElement("div",null,t().createElement(s.FormattedMessage,{id:"loading_note",defaultMessage:[{type:0,value:"Loading..."}]}))},t().createElement(Ds,{onRecordingProgress:e=>this.props.onKeyPress(!0),onDeleted:e=>this.setState({audioRec:!1}),onFinished:this.handleAttachAudio})):t().createElement("textarea",{id:"send-message-input",placeholder:n,value:this.state.message,onChange:this.handleMessageTyping,onKeyPress:this.handleKeyPress,ref:e=>{this.messageEditArea=e}}),this.state.message||!o?t().createElement("a",{href:"#",onClick:this.handleSend,title:a(Is.icon_title_send)},t().createElement("i",{className:"material-icons"},i)):this.state.audioRec?null:t().createElement("a",{href:"#",onClick:e=>{e.preventDefault(),this.setState({audioRec:!0})},title:a(Is.icon_title_record_voice)},t().createElement("i",{className:"material-icons"},"mic")),t().createElement("input",{type:"file",ref:e=>{this.attachFile=e},onChange:this.handleAttachFile,style:{display:"none"}}),t().createElement("input",{type:"file",ref:e=>{this.attachImage=e},accept:"image/*, video/*",onChange:this.handleAttachImage,style:{display:"none"}}))))}}const Fs=(0,s.injectIntl)(Rs);class xs extends t().PureComponent{constructor(e){super(e),this.handleSendDoc=this.handleSendDoc.bind(this)}handleSendDoc(e){this.props.onClose(),this.props.onSendMessage(this.props.content.file)}render(){return this.props.content?t().createElement("div",{id:"image-preview"},t().createElement("div",{id:"image-preview-caption-panel"},t().createElement("span",null,this.props.content.name),t().createElement("a",{href:"#",onClick:e=>{e.preventDefault(),this.props.onClose()}},t().createElement("i",{className:"material-icons gray"},"close"))),t().createElement("div",{id:"image-preview-container"},t().createElement("div",{className:"flex-column narrow"},t().createElement("i",{className:"material-icons gray"},function(e){const t={default:"insert_drive_file",image:"image",text:"description",video:"theaters"};return t[e]||t[(e||"").split("/")[0]]||t.default}(this.props.content.type)),t().createElement("div",null,t().createElement("b",null,t().createElement(s.FormattedMessage,{id:"label_file_name",defaultMessage:[{type:0,value:"File name:"}]}))," ",(0,Jt.TX)(this.props.content.name,24)||"-"),t().createElement("div",null,t().createElement("b",null,t().createElement(s.FormattedMessage,{id:"label_content_type",defaultMessage:[{type:0,value:"Content type:"}]}))," ",this.props.content.type||"application/octet-stream"),t().createElement("div",null,t().createElement("b",null,t().createElement(s.FormattedMessage,{id:"label_size",defaultMessage:[{type:0,value:"Size:"}]}))," ",(0,Jt.FK)(this.props.content.size)))),t().createElement(Fs,{noInput:!0,tinode:this.props.tinode,reply:this.props.reply,onCancelReply:this.props.onCancelReply,onSendMessage:this.handleSendDoc,onError:this.props.onError})):null}}class Os extends t().Component{constructor(e){super(e)}render(){const e=[],a=(this.props.subscribers||[]).length,n=Math.min(Kt.dm,a);return(this.props.subscribers||[]).some((a=>(e.push(t().createElement("div",{className:"avatar-box",key:a.user},t().createElement(da,{tinode:this.props.tinode,topic:a.user,avatar:(0,va.PD)(a.public?a.public.photo:null)||!0,title:a.public?a.public.fn:null}))),e.length==n))),t().createElement("div",{id:"topic-users"},e," ",a>n?t().createElement("span",null,t().createElement(s.FormattedMessage,{id:"more_online_members",defaultMessage:[{type:0,value:"+"},{type:1,value:"overflow"},{type:0,value:" more"}],values:{overflow:a-n}})):null)}}class Us extends t().PureComponent{constructor(e){super(e),this.state={width:0,height:0},this.handleSendImage=this.handleSendImage.bind(this)}assignWidth(e){if(e&&!this.state.width){const t=e.getBoundingClientRect();this.setState({width:0|t.width,height:0|t.height})}}handleSendImage(e){this.props.onClose(),this.props.onSendMessage(e,this.props.content.blob)}render(){if(!this.props.content)return null;const e=(0,va.rS)(this.props.content.width,this.props.content.height,this.state.width,this.state.height,!1),a=e?{width:e.dstWidth+"px",height:e.dstHeight+"px"}:this.props.content.width>this.props.content.height?{width:"100%"}:{height:"100%"};a.maxWidth="100%",a.maxHeight="100%";const n=Math.max((this.state.width/Kt.o6/1.5|0)-2,12),i=(0,Jt.TX)(this.props.content.filename,n)||"-",r=this.props.content.width||"-",o=this.props.content.height||"-";return t().createElement("div",{id:"image-preview"},t().createElement("div",{id:"image-preview-caption-panel"},this.props.onSendMessage?t().createElement("span",null,i):t().createElement("a",{href:this.props.content.url,download:this.props.content.filename},t().createElement("i",{className:"material-icons"},"file_download")," ",t().createElement(s.FormattedMessage,{id:"download_action",defaultMessage:[{type:0,value:"download"}]})),t().createElement("a",{href:"#",onClick:e=>{e.preventDefault(),this.props.onClose()}},t().createElement("i",{className:"material-icons gray"},"close"))),t().createElement("div",{id:"image-preview-container",ref:e=>this.assignWidth(e)},t().createElement("img",{src:this.props.content.url,style:a,className:"image-preview",alt:this.props.content.filename})),this.props.onSendMessage?t().createElement(Fs,{messagePrompt:"add_image_caption",acceptBlank:!0,tinode:this.props.tinode,reply:this.props.reply,onCancelReply:this.props.onCancelReply,onSendMessage:this.handleSendImage,onError:this.props.onError}):t().createElement("div",{id:"image-preview-footer"},t().createElement("div",null,t().createElement("div",null,t().createElement("b",null,t().createElement(s.FormattedMessage,{id:"label_file_name",defaultMessage:[{type:0,value:"File name:"}]}))),t().createElement("div",null,t().createElement("span",{title:this.props.content.filename},i))),t().createElement("div",null,t().createElement("div",null,t().createElement("b",null,t().createElement(s.FormattedMessage,{id:"label_content_type",defaultMessage:[{type:0,value:"Content type:"}]}))),t().createElement("div",null,this.props.content.type)),t().createElement("div",null,t().createElement("div",null,t().createElement("b",null,t().createElement(s.FormattedMessage,{id:"label_size",defaultMessage:[{type:0,value:"Size:"}]}))),t().createElement("div",null,r," × ",o," px; ",(0,Jt.FK)(this.props.content.size)))))}}class Ls extends t().PureComponent{constructor(e){super(e),this.handleButtonAction=this.handleButtonAction.bind(this)}handleButtonAction(e,t){e.preventDefault(),this.props.onAction(t)}render(){return t().createElement("div",{className:"accept-invite-panel"},t().createElement("div",{className:"title"},t().createElement(s.FormattedMessage,{id:"chat_invitation",defaultMessage:[{type:0,value:"You are invited to start a new chat. What would you like to do?"}]})),t().createElement("div",{className:"footer"},t().createElement("button",{className:"primary",onClick:e=>{this.handleButtonAction(e,"accept")}},t().createElement(s.FormattedMessage,{id:"chat_invitation_accept",defaultMessage:[{type:0,value:"Accept"}]})),t().createElement("button",{className:"secondary",onClick:e=>{this.handleButtonAction(e,"delete")}},t().createElement(s.FormattedMessage,{id:"chat_invitation_ignore",defaultMessage:[{type:0,value:"Ignore"}]})),t().createElement("button",{className:"secondary",onClick:e=>{this.handleButtonAction(e,"block")}},t().createElement(s.FormattedMessage,{id:"chat_invitation_block",defaultMessage:[{type:0,value:"Block"}]}))))}}class Bs extends t().PureComponent{render(){const e=Kt.iC+" ("+Gt.Tinode.getLibrary()+")";return t().createElement("div",{id:"dummy-view"},t().createElement("div",null,t().createElement("a",{href:"https://github.com/tinode/chat/"},t().createElement("img",{id:"logo",alt:"logo",src:"img/logo.svg"}),t().createElement("h2",null,"Tinode Web")),t().createElement("p",null,t().createElement(s.FormattedMessage,{id:"label_client",defaultMessage:[{type:0,value:"Client:"}]})," ",e),t().createElement("p",null,t().createElement(s.FormattedMessage,{id:"label_server",defaultMessage:[{type:0,value:"Server:"}]})," ",this.props.serverVersion," (",this.props.serverAddress,")")))}}class js extends t().PureComponent{constructor(e){super(e)}render(){let e=null,a="bubble";return this.props.date&&(e=t().createElement(t().Fragment,null,this.props.date),a+=" date"),e?t().createElement("li",{className:"meta"},t().createElement("div",{className:a},t().createElement("div",{className:"message-content"},e))):t().createElement(t().Fragment,null,null)}}const Hs=(0,s.defineMessages)({unrecognized_video_format:{id:"unrecognized_video_format",defaultMessage:[{type:0,value:"Format of this video is not recognized"}]}});class Vs extends t().PureComponent{constructor(e){super(e),this.videoRef=t().createRef(),this.handleSendVideo=this.handleSendVideo.bind(this)}handleSendVideo(e){this.props.onClose();const t={width:this.videoRef.current.videoWidth,height:this.videoRef.current.videoHeight,duration:1e3*this.videoRef.current.duration|0,mime:this.props.content.mime,name:this.props.content.filename};if(0==t.width||0==t.height)return void this.props.onError(this.props.intl.formatMessage(Hs.unrecognized_video_format),"err");const a=document.createElement("canvas");a.width=t.width,a.height=t.height;const s=a.getContext("2d");s.drawImage(this.videoRef.current,0,0,a.width,a.height),s.canvas.toBlob((a=>this.props.onSendMessage(e,this.props.content.blob,a,t)),"image/jpeg",.75)}render(){if(!this.props.content)return null;const e=this.props.content.width||"-",a=this.props.content.height||"-",n=this.props.onSendMessage?"nodownload":"",i=!this.props.onSendMessage;return t().createElement("div",{id:"image-preview"},t().createElement("div",{id:"image-preview-caption-panel"},t().createElement("span",null,this.props.content.filename),t().createElement("a",{href:"#",onClick:e=>{e.preventDefault(),this.props.onClose()}},t().createElement("i",{className:"material-icons gray"},"close"))),t().createElement("div",{id:"image-preview-container"},t().createElement("video",{className:"image-preview",controls:!0,controlsList:n,disablePictureInPicture:!0,ref:this.videoRef,autoPlay:i,src:this.props.tinode.authorizeURL(this.props.content.url),poster:this.props.content.preview,alt:this.props.content.filename})),this.props.onSendMessage?t().createElement(Fs,{messagePrompt:"add_image_caption",acceptBlank:!0,tinode:this.props.tinode,reply:this.props.reply,onCancelReply:this.props.onCancelReply,onSendMessage:this.handleSendVideo,onError:this.props.onError}):t().createElement("div",{id:"image-preview-footer"},t().createElement("div",null,t().createElement("div",null,t().createElement("b",null,t().createElement(s.FormattedMessage,{id:"label_file_name",defaultMessage:[{type:0,value:"File name:"}]}))),t().createElement("div",null,t().createElement("span",{title:this.props.content.filename},this.props.content.filename))),t().createElement("div",null,t().createElement("div",null,t().createElement("b",null,t().createElement(s.FormattedMessage,{id:"label_content_type",defaultMessage:[{type:0,value:"Content type:"}]}))),t().createElement("div",null,this.props.content.type)),t().createElement("div",null,t().createElement("div",null,t().createElement("b",null,t().createElement(s.FormattedMessage,{id:"label_size",defaultMessage:[{type:0,value:"Size:"}]}))),t().createElement("div",null,e," × ",a," px; ",(0,Jt.FK)(this.props.content.size)))))}}const qs=(0,s.injectIntl)(Vs);class Gs{static parseUrlHash(e){const t=e.split("?",2),a={};let s=[];return t[0]&&(s=t[0].replace("#","").split("/")),t[1]&&t[1].split("&").forEach((e=>{const t=e.indexOf("=");t>0&&(a[e.slice(0,t)]=decodeURIComponent(e.slice(t+1)))})),{path:s,params:a}}static navigateTo(e){window.location.hash=e}static composeUrlHash(e,t){let a=e.join("/");const s=[];for(const e in t)t.hasOwnProperty(e)&&s.push(e+"="+encodeURIComponent(t[e]));return s.length>0&&(a+="?"+s.join("&")),a}static addUrlParam(e,t,a){const s=Gs.parseUrlHash(e);return s.params[t]=a,Gs.composeUrlHash(s.path,s.params)}static removeUrlParam(e,t){const a=Gs.parseUrlHash(e);return delete a.params[t],Gs.composeUrlHash(a.path,a.params)}static setUrlSidePanel(e,t){const a=Gs.parseUrlHash(e);return a.path[0]=t,Gs.composeUrlHash(a.path,a.params)}static setUrlInfoPanel(e,t){const a=Gs.parseUrlHash(e);return t?a.params.info=t:delete a.params.info,Gs.composeUrlHash(a.path,a.params)}static setUrlTopic(e,t){const a=Gs.parseUrlHash(e);return a.path[1]=t,delete a.params.info,Gs.composeUrlHash(a.path,a.params)}}const Ws=(0,s.defineMessages)({online_now:{id:"online_now",defaultMessage:[{type:0,value:"online now"}]},last_seen:{id:"last_seen_timestamp",defaultMessage:[{type:0,value:"Last seen"}]},not_found:{id:"title_not_found",defaultMessage:[{type:0,value:"Not found"}]},channel:{id:"channel",defaultMessage:[{type:0,value:"channel"}]},file_attachment_too_large:{id:"file_attachment_too_large",defaultMessage:[{type:0,value:"The file size "},{type:1,value:"size"},{type:0,value:" exceeds the "},{type:1,value:"limit"},{type:0,value:" limit."}]},invalid_content:{id:"invalid_content",defaultMessage:[{type:0,value:"invalid content"}]},editing_message:{id:"editing_message",defaultMessage:[{type:0,value:"Editing"}]},drag_file:{id:"drag_file",defaultMessage:[{type:0,value:"Drag file here"}]}});function Ks(e){if(e){const t=e.getExcessive()||"";return e.isJoiner("given")&&(t.includes("R")||t.includes("W"))}return!1}function zs(e){if(e){const t=e.getMissing()||"";return e.isJoiner("want")&&(t.includes("R")||t.includes("W"))}return!1}function Zs(e){return 1==e||3==e}class Ys extends t().Component{constructor(e){super(e),this.state=Ys.getDerivedStateFromProps(e,{}),this.leave=this.leave.bind(this),this.sendMessage=this.sendMessage.bind(this),this.retrySend=this.retrySend.bind(this),this.sendImageAttachment=this.sendImageAttachment.bind(this),this.sendVideoAttachment=this.sendVideoAttachment.bind(this),this.sendFileAttachment=this.sendFileAttachment.bind(this),this.sendAudioAttachment=this.sendAudioAttachment.bind(this),this.sendKeyPress=this.sendKeyPress.bind(this),this.subscribe=this.subscribe.bind(this),this.handleScrollReference=this.handleScrollReference.bind(this),this.mountDnDEvents=this.mountDnDEvents.bind(this),this.handleScrollEvent=this.handleScrollEvent.bind(this),this.handleDescChange=this.handleDescChange.bind(this),this.handleSubsUpdated=this.handleSubsUpdated.bind(this),this.handleMessageUpdate=this.handleMessageUpdate.bind(this),this.handleAllMessagesReceived=this.handleAllMessagesReceived.bind(this),this.handleInfoReceipt=this.handleInfoReceipt.bind(this),this.handleExpandMedia=this.handleExpandMedia.bind(this),this.handleClosePreview=this.handleClosePreview.bind(this),this.handleFormResponse=this.handleFormResponse.bind(this),this.handleContextClick=this.handleContextClick.bind(this),this.handleShowMessageContextMenu=this.handleShowMessageContextMenu.bind(this),this.handleNewChatAcceptance=this.handleNewChatAcceptance.bind(this),this.handleEnablePeer=this.handleEnablePeer.bind(this),this.handleAttachFile=this.handleAttachFile.bind(this),this.handleAttachImageOrVideo=this.handleAttachImageOrVideo.bind(this),this.handleCancelUpload=this.handleCancelUpload.bind(this),this.postReadNotification=this.postReadNotification.bind(this),this.clearNotificationQueue=this.clearNotificationQueue.bind(this),this.goToLatestMessage=this.goToLatestMessage.bind(this),this.handleFileDrop=this.handleFileDrop.bind(this),this.handlePickReply=this.handlePickReply.bind(this),this.handleEditMessage=this.handleEditMessage.bind(this),this.handleCancelReply=this.handleCancelReply.bind(this),this.handleQuoteClick=this.handleQuoteClick.bind(this),this.handleCallHangup=this.handleCallHangup.bind(this),this.isDragEnabled=this.isDragEnabled.bind(this),this.handleDragIn=this.handleDragIn.bind(this),this.handleDragOut=this.handleDragOut.bind(this),this.handleDrag=this.handleDrag.bind(this),this.handleDrop=this.handleDrop.bind(this),this.chatMessageRefs={},this.getOrCreateMessageRef=this.getOrCreateMessageRef.bind(this),this.dragCounter=0,this.dndRef=null,this.readNotificationQueue=[],this.readNotificationTimer=null,this.keyPressTimer=null}getOrCreateMessageRef(e){if(this.chatMessageRefs.hasOwnProperty(e))return this.chatMessageRefs[e];const a=t().createRef();return this.chatMessageRefs[e]=a,a}componentDidMount(){this.messagesScroller&&this.messagesScroller.addEventListener("scroll",this.handleScrollEvent),this.dndRef&&(this.dndRef.addEventListener("dragenter",this.handleDragIn),this.dndRef.addEventListener("dragleave",this.handleDragOut),this.dndRef.addEventListener("dragover",this.handleDrag),this.dndRef.addEventListener("drop",this.handleDrop))}componentWillUnmount(){this.messagesScroller&&this.messagesScroller.removeEventListener("scroll",this.handleScrollEvent),this.clearNotificationQueue(),this.dndRef&&(this.dndRef.removeEventListener("dragenter",this.handleDragIn),this.dndRef.removeEventListener("dragleave",this.handleDragOut),this.dndRef.removeEventListener("dragover",this.handleDrag),this.dndRef.removeEventListener("drop",this.handleDrop))}componentDidUpdate(e,t){!this.messagesScroller||t.topic==this.state.topic&&t.messageCount==this.state.messageCount||this.state.scrollPosition<100&&(this.messagesScroller.scrollTop=this.messagesScroller.scrollHeight-this.state.scrollPosition-this.messagesScroller.offsetHeight);const a=this.props.tinode?this.props.tinode.getTopic(this.state.topic):void 0;this.state.topic!=t.topic&&(t.topic&&!Gt.Tinode.isNewGroupTopicName(t.topic)&&(this.leave(t.topic),t.rtcPanel&&this.handleCallHangup(t.topic,e.callSeq)),a&&(a.onData=this.handleMessageUpdate,a.onAllMessagesReceived=this.handleAllMessagesReceived,a.onInfo=this.handleInfoReceipt,a.onMetaDesc=this.handleDescChange,a.onSubsUpdated=this.handleSubsUpdated,a.onPres=this.handleSubsUpdated)),this.props.applicationVisible?this.postReadNotification(0):this.clearNotificationQueue(),!a||this.state.topic==t.topic&&e.ready||(a._new&&a.isP2PType()?a.getMeta(a.startMetaQuery().withDesc().build()):this.subscribe(a))}static getDerivedStateFromProps(e,t){let a={};if(e.topic)if(e.topic!=t.topic){const s=e.tinode.getTopic(e.topic);if(a={topic:e.topic,deleted:s._deleted,docPreview:null,imagePreview:null,imagePostview:null,videoPreview:null,videoPostview:null,rtcPanel:null,typingIndicator:!1,scrollPosition:0,fetchingMessages:!1,showGoToLastButton:!1,contentToEdit:null,dragging:!1},e.forwardMessage?a.reply={content:e.forwardMessage.preview,seq:null}:a.reply=null,s){const n=[];e.connected&&s.subscribers((t=>{t.online&&t.user!=e.myUserId&&n.push(t)})),Object.assign(a,{onlineSubs:n}),s.public?Object.assign(a,{title:s.public.fn,avatar:(0,va.PD)(s.public.photo)}):Object.assign(a,{title:"",avatar:null});const i=s.p2pPeerDesc();i?Object.assign(a,{peerMessagingDisabled:zs(i.acs)}):t.peerMessagingDisabled&&Object.assign(a,{peerMessagingDisabled:!1}),Object.assign(a,{messageCount:s.messageCount(),latestClearId:s.maxClearId(),channel:s.isChannelType()}),e.callTopic==s.name&&Zs(e.callState)&&(a.rtcPanel=e.callTopic)}else Object.assign(a,{messageCount:0,latestClearId:-1,onlineSubs:[],title:"",avatar:null,peerMessagingDisabled:!1,channel:!1})}else e.callTopic==t.topic&&!t.rtcPanel&&Zs(e.callState)&&(a.rtcPanel=e.callTopic);else a={messageCount:0,latestClearId:-1,onlineSubs:[],topic:null,title:"",avatar:null,isVerified:!1,isStaff:!1,isDangerous:!1,deleted:!1,docPreview:null,imagePreview:null,imagePostview:null,videoPreview:null,videoPostview:null,rtcPanel:null,typingIndicator:!1,scrollPosition:0,fetchingMessages:!1,peerMessagingDisabled:!1,channel:!1,reply:null,contentToEdit:null,showGoToLastButton:!1,dragging:!1};return e.acs?(e.acs.isWriter()!=t.isWriter&&(a.isWriter=!t.isWriter),e.acs.isReader()!=t.isReader&&(a.isReader=!t.isReader),!e.acs.isReader("given")!=t.readingBlocked&&(a.readingBlocked=!t.readingBlocked),e.acs.isSharer()!=t.isSharer&&(a.isSharer=!t.isSharer)):(t.isWriter&&(a.isWriter=!1),t.isReader&&(a.isReader=!1),t.readingBlocked||(t.readingBlocked=!0),t.isSharer&&(a.isSharer=!1)),Ks(e.acs)==!t.unconformed&&(a.unconfirmed=!t.unconformed),!e.connected&&t.onlineSubs&&t.onlineSubs.length>0&&(a.onlineSubs=[]),a}subscribe(e){if(e.isSubscribed()||!this.props.ready)return;const t=this.props.newTopicParams&&this.props.newTopicParams._topicName==this.props.topic;let a=e.startMetaQuery().withLaterDesc().withLaterSub();(this.state.isReader||t)&&(a=a.withLaterData(Kt.Hm),this.state.isReader&&(a=a.withLaterDel()),this.setState({fetchingMessages:!0}));const s=t?this.props.newTopicParams:void 0;e.subscribe(a.build(),s).then((t=>{if(303==t.code)return void Gs.navigateTo(Gs.setUrlTopic("",t.params.topic));this.state.topic!=t.topic&&this.setState({topic:t.topic}),this.props.onNewTopicCreated(this.props.topic,t.topic);let a=[];e.queuedMessages((t=>{t._sending||(t.head&&t.head.webrtc?a.push(t.seq):e.isSubscribed()&&this.retrySend(t))})),a.length>0&&e.delMessagesList(a,!0)})).catch((e=>{console.error("Failed subscription to",this.state.topic,e),this.props.onError(e.message,"err");const t=Ys.getDerivedStateFromProps({},{});t.title=this.props.intl.formatMessage(Ws.not_found),this.setState(t)}))}leave(e){if(!e||!this.props.tinode.isTopicCached(e))return;const t=this.props.tinode.getTopic(e);t&&t.isSubscribed()&&t.leave(!1).catch((e=>{})).finally((e=>{this.setState({fetchingMessages:!1}),t.onData=void 0,t.onAllMessagesReceived=void 0,t.onInfo=void 0,t.onMetaDesc=void 0,t.onSubsUpdated=void 0,t.onPres=void 0}))}handleScrollReference(e){e&&(e.addEventListener("scroll",this.handleScrollEvent),this.messagesScroller=e,this.messagesScroller.scrollTop=this.messagesScroller.scrollHeight-this.state.scrollPosition)}handleScrollEvent(e){const t=e.target.scrollHeight-e.target.scrollTop-e.target.offsetHeight;if(this.setState({scrollPosition:t,showGoToLastButton:t>100&&t{e.getMessagesPage(Kt.Hm).catch((e=>this.props.onError(e.message,"err"))).finally((e=>this.setState({fetchingMessages:!1})))}))}}mountDnDEvents(e){e&&(e.addEventListener("dragenter",this.handleDragIn),e.addEventListener("dragleave",this.handleDragOut),e.addEventListener("dragover",this.handleDrag),e.addEventListener("drop",this.handleDrop),this.dndRef=e)}goToLatestMessage(){this.setState({scrollPosition:0}),this.messagesScroller&&(this.messagesScroller.scrollTop=this.messagesScroller.scrollHeight)}handleDescChange(e){e.public?this.setState({title:e.public.fn,avatar:(0,va.PD)(e.public.photo)}):this.setState({title:"",avatar:null}),e.acs&&this.setState({isWriter:e.acs.isWriter(),isReader:e.acs.isReader(),readingBlocked:!e.acs.isReader("given"),unconfirmed:Ks(e.acs)})}postReadNotification(e){if(!this.props.applicationVisible)return;this.readNotificationTimer||(this.readNotificationTimer=setInterval((e=>{if(0==this.readNotificationQueue.length)return clearInterval(this.readNotificationTimer),void(this.readNotificationTimer=null);let t=-1;for(;this.readNotificationQueue.length>0;){const e=this.readNotificationQueue[0];if(e.topicName!=this.state.topic){this.readNotificationQueue.shift();continue}const a=new Date;if(!(e.sendAt<=a))break;this.readNotificationQueue.shift(),t=Math.max(t,e.seq)}if(t>=0){const e=this.props.tinode.getTopic(this.state.topic);e&&e.noteRead(t)}}),300));const t=new Date;this.readNotificationQueue.push({topicName:this.state.topic,seq:e,sendAt:t.setMilliseconds(t.getMilliseconds()+Kt.l8)})}clearNotificationQueue(){this.readNotificationQueue=[],this.readNotificationTimer&&(clearInterval(this.readNotificationTimer),this.readNotificationTimer=null)}handleSubsUpdated(){if(this.state.topic){const e=[],t=this.props.tinode.getTopic(this.state.topic);t.subscribers((t=>{t.online&&t.user!=this.props.myUserId&&e.push(t)}));const a={onlineSubs:e},s=t.p2pPeerDesc();s?Object.assign(a,{peerMessagingDisabled:zs(s.acs)}):this.state.peerMessagingDisabled&&Object.assign(a,{peerMessagingDisabled:!1}),this.setState(a)}}handleMessageUpdate(e){const t=this.props.tinode.getTopic(this.state.topic);if(!e)return void this.setState({latestClearId:t.maxClearId()});clearTimeout(this.keyPressTimer),this.setState({messageCount:t.messageCount(),typingIndicator:!1},(a=>{t.isNewMessage(e.seq)&&(this.state.scrollPosition>100?this.setState({showGoToLastButton:!0}):this.goToLatestMessage())}));t.msgStatus(e,!0)>=Gt.Tinode.MESSAGE_STATUS_SENT&&e.from!=this.props.myUserId&&this.postReadNotification(e.seq)}handleAllMessagesReceived(e){this.setState({fetchingMessages:!1}),e>0&&this.postReadNotification(0)}handleInfoReceipt(e){switch(e.what){case"kp":clearTimeout(this.keyPressTimer),this.keyPressTimer=setTimeout((e=>this.setState({typingIndicator:!1})),Kt.mc+1e3),this.state.typingIndicator||this.setState({typingIndicator:!0});break;case"read":case"recv":this.forceUpdate();break;default:console.info("Other change in topic: ",e.what)}}handleExpandMedia(e){e&&(e.video?this.setState({videoPostview:e}):this.setState({imagePostview:e}))}handleClosePreview(){this.state.imagePreview&&this.state.imagePreview.url&&URL.revokeObjectURL(this.state.imagePreview.url),this.state.videoPreview&&this.state.videoPreview.url&&URL.revokeObjectURL(this.state.videoPreview.url),this.setState({imagePostview:null,imagePreview:null,docPreview:null,videoPreview:null,videoPostview:null})}handleFormResponse(e,t,a){if("pub"==e)this.sendMessage(Gt.Drafty.attachJSON(Gt.Drafty.parse(t),a));else if("url"==e){const e=new URL(a.ref),t=e.searchParams;for(let e in a.resp)a.resp.hasOwnProperty(e)&&t.set(e,a.resp[e]);["name","seq"].map((e=>{a[e]&&t.set(e,a[e])})),t.set("uid",this.props.myUserId),t.set("topic",this.state.topic),e.search=t,window.open(e,"_blank")}else console.info("Unknown action in form",e)}handleContextClick(e){e.preventDefault(),e.stopPropagation(),this.props.showContextMenu({topicName:this.state.topic,y:e.pageY,x:e.pageX})}handleShowMessageContextMenu(e,t){"chan"==e.userFrom&&(e.userFrom=this.state.topic,e.userName=this.state.title),e.topicName=this.state.topic;const a=t||[],s=this.props.tinode.getTopic(e.topicName);if(s){s.isChannelType()||a.push("message_delete");const e=s.getAccessMode();e&&e.isDeleter()&&a.push("message_delete_hard")}this.props.showContextMenu(e,a)}handleNewChatAcceptance(e){this.props.onNewChat(this.state.topic,e)}handleEnablePeer(e){e.preventDefault(),this.props.onChangePermissions(this.state.topic,Kt.RK,this.state.topic)}sendKeyPress(e){const t=this.props.tinode.getTopic(this.state.topic);t.isSubscribed()&&(e?t.noteRecording(!0):t.noteKeyPress())}sendMessage(e,t,a){let s;if(this.props.forwardMessage)e=this.props.forwardMessage.msg,s=this.props.forwardMessage.head,this.handleCancelReply();else if(this.state.reply){if(this.state.reply.editing){if(e==this.state.contentToEdit)return void this.handleCancelReply();s={replace:":"+this.state.reply.seq}}else this.state.reply.content&&(s={reply:""+this.state.reply.seq},"string"==typeof e&&(e=Gt.Drafty.parse(e)),e=Gt.Drafty.append(Gt.Drafty.sanitizeEntities(this.state.reply.content),e));this.handleCancelReply()}this.props.sendMessage(e,t,a,s)}retrySend(e){this.props.sendMessage(e.content,void 0,void 0,e.head).then((t=>{this.props.tinode.getTopic(this.state.topic).delMessagesList([e.seq],!0)}))}sendFileAttachment(e){const t=.75*this.props.tinode.getServerParam("maxMessageSize",Kt.kd)-1024|0;if(e.size>t){const t=this.props.tinode.getLargeFileHelper();if(!t)return void this.props.onError(this.props.intl.formatMessage(Ws.cannot_initiate_upload));const a=t.upload(e),s=Gt.Drafty.attachFile(null,{mime:e.type,filename:e.name,size:e.size,urlPromise:a});this.sendMessage(s,a,t)}else(0,va.sT)(e).then((t=>this.sendMessage(Gt.Drafty.attachFile(null,{mime:t.mime,data:t.bits,filename:t.name,size:e.size})))).catch((e=>this.props.onError(e.message,"err")))}handleAttachFile(e){const t=this.props.tinode.getServerParam("maxFileUploadSize",Kt.GQ);e.size>t?this.props.onError(this.props.intl.formatMessage(Ws.file_attachment_too_large,{size:(0,Jt.FK)(e.size),limit:(0,Jt.FK)(t)}),"err"):this.setState({docPreview:{file:e,name:e.name,size:e.size,type:e.type}})}handleCallHangup(e,t){this.props.onVideoCallClosed(),this.setState({rtcPanel:null}),this.props.onCallHangup(e,t)}sendImageAttachment(e,t){const a=this.state.imagePreview.mime,s=this.state.imagePreview.width,n=this.state.imagePreview.height,i=this.state.imagePreview.filename,r=.75*this.props.tinode.getServerParam("maxMessageSize",Kt.kd)-1024|0;if(t.size>r){const r=this.props.tinode.getLargeFileHelper();if(!r)return void this.props.onError(this.props.intl.formatMessage(Ws.cannot_initiate_upload));const o=r.upload(t);(0,va.EA)(t,Kt.H2,Kt.H2,-1,!1).then((e=>(0,va.w8)(e.blob))).then((d=>{let l=Gt.Drafty.insertImage(null,0,{mime:a,_tempPreview:d.bits,bits:d.bits,width:s,height:n,filename:i,size:t.size,urlPromise:o});e&&(l=Gt.Drafty.appendLineBreak(l),l=Gt.Drafty.append(l,Gt.Drafty.parse(e))),this.sendMessage(l,o,r)})).catch((e=>this.props.onError(e,"err")))}else(0,va.w8)(t).then((a=>{let r=Gt.Drafty.insertImage(null,0,{mime:a.mime,bits:a.bits,width:s,height:n,filename:i,size:t.size});e&&(r=Gt.Drafty.appendLineBreak(r),r=Gt.Drafty.append(r,Gt.Drafty.parse(e))),this.sendMessage(r)}))}sendVideoAttachment(e,t,a,s){const n=s.width,i=s.height,r=.75*this.props.tinode.getServerParam("maxMessageSize",Kt.kd)-1024|0,o=[];let d;if(t.size+a.size>r){if(d=this.props.tinode.getLargeFileHelper(),!d)return void this.props.onError(this.props.intl.formatMessage(Ws.cannot_initiate_upload));o[0]=t.size>.675*r?d.upload(t):null,o[1]=a.size>.275*r?d.upload(a):null}if(0==o.length)return void Promise.all([(0,va.w8)(t),(0,va.w8)(a)]).then((a=>{const[r,o]=a;let d=Gt.Drafty.insertVideo(null,0,{mime:r.mime,bits:r.bits,preview:o.bits,premime:o.mime,width:n,height:i,duration:s.duration,filename:s.name,size:t.size});e&&(d=Gt.Drafty.appendLineBreak(d),d=Gt.Drafty.append(d,Gt.Drafty.parse(e))),this.sendMessage(d)}));const l=Promise.all(o),c=[];c[0]=o[0]?null:(0,va.w8)(t),c[1]=o[1]?null:(0,va.EA)(a,Kt.yW,Kt.yW,-1,!1).then((e=>(0,va.w8)(e.blob))),c[2]=(0,va.EA)(a,Kt.ly,Kt.ly,-1,!1).then((e=>(0,va.w8)(e.blob))),Promise.all(c).then((a=>{const[r,o,c]=a;let h=Gt.Drafty.insertVideo(null,0,{mime:s.mime,bits:r?r.bits:null,_tempPreview:c.bits,preview:o?o.bits:c.bits,premime:o?o.mime:c.mime,width:n,height:i,duration:s.duration,filename:s.name,size:t.size,urlPromise:l});e&&(h=Gt.Drafty.appendLineBreak(h),h=Gt.Drafty.append(h,Gt.Drafty.parse(e))),this.sendMessage(h,l,d)})).catch((e=>this.props.onError(e.message,"err")))}handleAttachImageOrVideo(e){const t=this.props.tinode.getServerParam("maxFileUploadSize",Kt.GQ);e.type.startsWith("video/")?this.setState({videoPreview:{url:URL.createObjectURL(e),blob:e,filename:e.name,size:e.size,mime:e.type}}):(0,va.EA)(e,Kt.yW,Kt.yW,t,!1).then((e=>{this.setState({imagePreview:{url:URL.createObjectURL(e.blob),blob:e.blob,filename:e.name,width:e.width,height:e.height,size:e.blob.size,mime:e.mime}})})).catch((e=>{this.props.onError(e.message,"err")}))}handleFileDrop(e){if(!e||0==e.length)return;const t=e[0];t.type&&t.type.startsWith("image/")?this.handleAttachImageOrVideo(t):this.handleAttachFile(t)}sendAudioAttachment(e,t,a){fetch(e).then((e=>e.blob())).then((e=>{const s=.75*this.props.tinode.getServerParam("maxMessageSize",Kt.kd)-1024;if(e.size>s){const s=this.props.tinode.getLargeFileHelper();if(!s)return void this.props.onError(this.props.intl.formatMessage(Ws.cannot_initiate_upload));const n=s.upload(e),i=Gt.Drafty.appendAudio(null,{mime:e.type,size:e.size,duration:a,preview:t,urlPromise:n});this.sendMessage(i,n,s)}else(0,va.w8)(e).then((s=>{this.sendMessage(Gt.Drafty.appendAudio(null,{mime:s.mime,bits:s.bits,size:e.size,duration:a,preview:t}))}))})).catch((e=>{this.props.onError(e.message,"err")}))}handleCancelUpload(e,t){const a=this.props.tinode.getTopic(this.state.topic).findMessage(e);a&&(a._cancelled=!0),t.cancel()}handlePickReply(e,t,a,s){e&&t?(t="string"==typeof t?Gt.Drafty.init(t):t,t=Gt.Drafty.isValid(t)?Gt.Drafty.replyContent(t,Kt.cl):Gt.Drafty.append(Gt.Drafty.init("⚠ "),Gt.Drafty.wrapInto(this.props.intl.formatMessage(Ws.invalid_content),"EM")),this.setState({reply:{content:Gt.Drafty.quote(s,a,t),seq:e}}),this.props.onCancelForwardMessage()):this.setState({reply:null})}handleEditMessage(e,t){if(!e||!t)return void this.setState({reply:null});t="string"==typeof t?Gt.Drafty.init(t):t;const a=Gt.Drafty.toMarkdown(t);t=Gt.Drafty.isValid(t)?Gt.Drafty.replyContent(t,Kt.nT):Gt.Drafty.append(Gt.Drafty.init("⚠ "),Gt.Drafty.wrapInto(this.props.intl.formatMessage(Ws.invalid_content),"EM")),this.setState({reply:{content:Gt.Drafty.quote(this.props.intl.formatMessage(Ws.editing_message),null,t),seq:e,editing:!0},contentToEdit:a}),this.props.onCancelForwardMessage()}handleCancelReply(){this.setState({reply:null,contentToEdit:null}),this.props.onCancelForwardMessage()}handleQuoteClick(e){const t=this.getOrCreateMessageRef(e);t&&t.current?(t.current.scrollIntoView({block:"center",behavior:"smooth"}),t.current.classList.add("flash"),setTimeout((e=>{t.current.classList.remove("flash")}),1e3)):console.error("Unresolved message ref",e)}isDragEnabled(){return this.state.isWriter&&!this.state.unconfirmed&&!this.props.forwardMessage&&!this.state.peerMessagingDisabled}handleDrag(e){e.preventDefault(),e.stopPropagation()}handleDragIn(e){e.preventDefault(),e.stopPropagation(),this.dragCounter++,e.dataTransfer.items&&e.dataTransfer.items.length>0&&this.setState({dragging:!0})}handleDragOut(e){e.preventDefault(),e.stopPropagation(),this.dragCounter--,this.dragCounter<=0&&this.setState({dragging:!1})}handleDrop(e){e.preventDefault(),e.stopPropagation(),this.setState({dragging:!1}),this.isDragEnabled()&&e.dataTransfer.files&&e.dataTransfer.files.length>0&&(this.handleFileDrop(e.dataTransfer.files),e.dataTransfer.clearData(),this.dragCounter=0)}render(){const{formatMessage:e}=this.props.intl;let a;if(this.props.hideSelf)a=null;else if(this.state.topic){let n;if(this.state.imagePreview)n=t().createElement(Us,{content:this.state.imagePreview,tinode:this.props.tinode,reply:this.state.reply,onCancelReply:this.handleCancelReply,onClose:this.handleClosePreview,onSendMessage:this.sendImageAttachment});else if(this.state.videoPreview)n=t().createElement(qs,{content:this.state.videoPreview,tinode:this.props.tinode,reply:this.state.reply,onError:this.props.onError,onCancelReply:this.handleCancelReply,onClose:this.handleClosePreview,onSendMessage:this.sendVideoAttachment});else if(this.state.imagePostview)n=t().createElement(Us,{content:this.state.imagePostview,onClose:this.handleClosePreview});else if(this.state.videoPostview)n=t().createElement(qs,{content:this.state.videoPostview,tinode:this.props.tinode,onError:this.props.onError,onClose:this.handleClosePreview});else if(this.state.docPreview)n=t().createElement(xs,{content:this.state.docPreview,tinode:this.props.tinode,reply:this.state.reply,onCancelReply:this.handleCancelReply,onClose:this.handleClosePreview,onSendMessage:this.sendFileAttachment});else if(this.state.rtcPanel)n=t().createElement(ws,{topic:this.state.topic,seq:this.props.callSeq,callState:this.props.callState,callAudioOnly:this.props.callAudioOnly,tinode:this.props.tinode,title:this.state.title,avatar:this.state.avatar||!0,onError:this.props.onError,onHangup:this.handleCallHangup,onInvite:this.props.onCallInvite,onSendOffer:this.props.onCallSendOffer,onIceCandidate:this.props.onCallIceCandidate,onSendAnswer:this.props.onCallSendAnswer});else{const a=this.props.tinode.getTopic(this.state.topic),i=a.isChannelType(),r=a.isGroupType()&&!i,o=[];a.trusted&&(a.trusted.verified&&o.push({icon:"verified",color:"badge-inv"}),a.trusted.staff&&o.push({icon:"staff",color:"badge-inv"}),a.trusted.danger&&o.push({icon:"dangerous",color:"badge-inv"}));const d=[];let l=null,c=null,h=null;a.messages(((e,s,n,i)=>{let o=n?n.from||"chan":null,p="single",u=e.from||"chan";u==l?p=u==o?"middle":"last":u==o&&(p="first"),l=u;const m=!(u==this.props.myUserId),g=a.msgStatus(e,!0);let f,v,$=u;const b=a.userDesc(u);b&&b.public&&(f=b.public.fn,v=(0,va.PD)(b.public.photo)),h=r?"chat-box group":"chat-box";const y=this.getOrCreateMessageRef(e.seq);let E=e.head?parseInt(e.head.reply):null;if(E&&!isNaN(E)||(E=null),e.hi)d.push(t().createElement(js,{deleted:!0,key:e.seq}));else{const a=new Date(e.ts);c&&c.toDateString()==a.toDateString()||(d.push(t().createElement(js,{date:(0,Jt.EZ)(e.ts),locale:this.props.intl.locale,key:"date-"+e.seq})),c=a),d.push(t().createElement(Ps,{tinode:this.props.tinode,content:e.content,mimeType:e.head&&e.head.mime,replyToSeq:E,edited:e.head&&!e.head.webrtc&&e.head.replace,timestamp:e.ts,response:m,seq:e.seq,isGroup:r,isChan:this.state.channel,userFrom:$,userName:f,userAvatar:v,sequence:p,received:g,uploader:e._uploader,userIsWriter:this.state.isWriter,viewportWidth:this.props.viewportWidth,showContextMenu:this.handleShowMessageContextMenu,onExpandMedia:this.handleExpandMedia,onFormResponse:this.handleFormResponse,onCancelUpload:this.handleCancelUpload,pickReply:this.handlePickReply,editMessage:this.handleEditMessage,onQuoteClick:this.handleQuoteClick,onError:this.props.onError,ref:y,key:e.seq}))}}));let p=null;if(i)p=e(Ws.channel);else{const t=this.props.tinode.getMeTopic().getContact(this.state.topic);t&&Gt.Tinode.isP2PTopicName(t.topic)&&(t.online?p=e(Ws.online_now):t.seen&&(p=e(Ws.last_seen)+": "+(0,Jt.pz)(t.seen.when,this.props.intl.locale)))}const u=this.state.avatar||!0,m=this.state.deleted?null:this.props.online?"online"+(this.state.typingIndicator?" typing":""):"offline",g="panel-title"+(this.state.deleted?" deleted":"");let f=t().createElement(t().Fragment,null,t().createElement("div",{id:"messages-container"},t().createElement("button",{className:"action-button"+(this.state.showGoToLastButton?"":" hidden"),onClick:this.goToLatestMessage},t().createElement("i",{className:"material-icons"},"arrow_downward")),t().createElement("div",{id:"messages-panel",ref:this.handleScrollReference},t().createElement("ul",{id:"scroller",className:h},d)),this.state.isReader?null:t().createElement("div",{id:"write-only-background"},this.state.readingBlocked?t().createElement("div",{id:"write-only-note"},t().createElement(s.FormattedMessage,{id:"messages_not_readable",defaultMessage:[{type:0,value:"no access to messages"}]})):null)),this.state.peerMessagingDisabled&&!this.state.unconfirmed?t().createElement("div",{id:"peer-messaging-disabled-note"},t().createElement("i",{className:"material-icons secondary"},"block")," ",t().createElement(s.FormattedMessage,{id:"peers_messaging_disabled",defaultMessage:[{type:0,value:"Peer's messaging is disabled."}]})," ",t().createElement("a",{href:"#",onClick:this.handleEnablePeer},t().createElement(s.FormattedMessage,{id:"enable_peers_messaging",defaultMessage:[{type:0,value:"Enable"}]})),"."):null,this.state.unconfirmed?t().createElement(Ls,{onAction:this.handleNewChatAcceptance}):t().createElement(Fs,{tinode:this.props.tinode,topicName:this.state.topic,noInput:!!this.props.forwardMessage,disabled:!this.state.isWriter||this.state.deleted,reply:this.state.reply,initMessage:this.state.contentToEdit,onKeyPress:this.sendKeyPress,onRecordingProgress:this.sendKeyPress,onSendMessage:this.sendMessage,onAttachFile:this.props.forwardMessage?null:this.handleAttachFile,onAttachImage:this.props.forwardMessage?null:this.handleAttachImageOrVideo,onAttachAudio:this.props.forwardMessage?null:this.sendAudioAttachment,onError:this.props.onError,onQuoteClick:this.handleQuoteClick,onCancelReply:this.handleCancelReply}));n=t().createElement(t().Fragment,null,t().createElement("div",{id:"topic-caption-panel",className:"caption-panel"},this.props.displayMobile?t().createElement("a",{href:"#",id:"hide-message-view",onClick:e=>{e.preventDefault(),this.props.onHideMessagesView()}},t().createElement("i",{className:"material-icons"},"arrow_back")):null,t().createElement("div",{className:"avatar-box"},t().createElement(da,{tinode:this.props.tinode,avatar:u,topic:this.state.topic,title:this.state.title,deleted:this.state.deleted}),i?null:t().createElement("span",{className:m})),t().createElement("div",{id:"topic-title-group"},t().createElement("div",{id:"topic-title",className:g},this.state.title||t().createElement("i",null,t().createElement(s.FormattedMessage,{id:"unnamed_topic",defaultMessage:[{type:0,value:"Unnamed"}]})),t().createElement(Qt,{badges:o})),t().createElement("div",{id:"topic-last-seen"},p)),r?t().createElement(Os,{tinode:this.props.tinode,subscribers:this.state.onlineSubs}):t().createElement("div",{id:"topic-users"}),t().createElement("div",null,t().createElement("a",{href:"#",onClick:this.handleContextClick},t().createElement("i",{className:"material-icons"},"more_vert")))),this.props.displayMobile?t().createElement(za,{level:this.props.errorLevel,text:this.props.errorText,onClearError:this.props.onError}):null,t().createElement(qa,{show:this.state.fetchingMessages}),f,this.state.dragging&&this.isDragEnabled()?t().createElement("div",{className:"drag-n-drop"},e(Ws.drag_file)):null)}a=t().createElement("div",{id:"topic-view",ref:this.mountDnDEvents},n)}else a=t().createElement(Bs,{serverVersion:this.props.serverVersion,serverAddress:this.props.serverAddress});return a}}const Xs=(0,s.injectIntl)(Ys);class Qs extends t().PureComponent{render(){return t().createElement("a",{href:"#",onClick:e=>{e.preventDefault(),this.props.onBack()}},t().createElement("i",{className:"material-icons"},"arrow_back"))}}class Js extends t().PureComponent{render(){return t().createElement("div",null,t().createElement("a",{href:"#",onClick:e=>{e.preventDefault(),this.props.onNewTopic()}},t().createElement("i",{className:"material-icons"},"chat"))," ",t().createElement("a",{href:"#",onClick:e=>{e.preventDefault(),this.props.onSettings()}},t().createElement("i",{className:"material-icons"},"settings")))}}class en extends t().PureComponent{render(){return t().createElement("div",null,t().createElement("a",{href:"#",onClick:e=>{e.preventDefault(),this.props.onSignUp()}},t().createElement("i",{className:"material-icons"},"person_add"))," ",t().createElement("a",{href:"#",onClick:e=>{e.preventDefault(),this.props.onSettings()}},t().createElement("i",{className:"material-icons"},"settings")))}}class tn extends t().PureComponent{render(){const e=[];this.props.trustedBadges&&this.props.trustedBadges.map((t=>{e.push({icon:t,color:"badge-inv"})}));let a=null;return this.props.tinode&&(a=this.props.tinode.authorizeURL(na(this.props.avatar,"image"))),t().createElement("div",{id:"side-caption-panel",className:"caption-panel"},this.props.onCancel?t().createElement(Qs,{onBack:this.props.onCancel}):null,a?t().createElement("div",{id:"self-avatar",className:"avatar-box"},t().createElement(da,{tinode:this.props.tinode,avatar:a,topic:this.props.myUserId,title:this.props.title})):null,t().createElement("div",{id:"sidepanel-title",className:"panel-title"},this.props.title,t().createElement(Qt,{badges:e})),"login"===this.props.state?t().createElement(en,{onSignUp:this.props.onSignUp,onSettings:this.props.onSettings}):"contacts"===this.props.state?t().createElement(Js,{onNewTopic:this.props.onNewTopic,onSettings:this.props.onSettings}):null)}}var an=r(2703),sn=r(781);class nn extends t().PureComponent{constructor(e){super(e),this.state={tel:"",email:""},this.handleSubmit=this.handleSubmit.bind(this),this.handleEmailChange=this.handleEmailChange.bind(this),this.handlePhoneChange=this.handlePhoneChange.bind(this)}formatPhoneNumber(e){const t=(0,an.h)(e);return t?t.formatInternational():e}handleEmailChange(e){this.setState({email:e.target.value})}handlePhoneChange(e){console.log("handlePhoneChange",e),this.setState({tel:e})}handleSubmit(e){e.preventDefault();const t="email"==this.props.method?this.state.email:this.state.tel;console.log("handleSubmit",t),t&&this.props.onSubmit(t)}render(){return t().createElement("form",{className:"panel-form-column",onSubmit:this.handleSubmit},"email"==this.props.method?t().createElement(t().Fragment,null,t().createElement("div",{className:"panel-form-row"},t().createElement("label",{className:"large"},t().createElement(s.FormattedMessage,{id:"change_email",defaultMessage:[{type:0,value:"Change email"}]}))),t().createElement("div",{className:"group"},t().createElement("label",{className:"small gray"},t().createElement(s.FormattedMessage,{id:"current_email",defaultMessage:[{type:0,value:"Current email"}]})))):"tel"==this.props.method?t().createElement(t().Fragment,null,t().createElement("div",{className:"panel-form-row"},t().createElement("label",{className:"large"},t().createElement(s.FormattedMessage,{id:"change_phonel",defaultMessage:[{type:0,value:"Change phone number"}]}))),t().createElement("div",{className:"group"},t().createElement("label",{className:"small gray"},t().createElement(s.FormattedMessage,{id:"current_phone",defaultMessage:[{type:0,value:"Current phone number"}]})))):null,t().createElement("div",{className:"panel-form-row"},t().createElement("tt",{className:"quoted"},this.formatPhoneNumber(this.props.val))),"email"==this.props.method?t().createElement(t().Fragment,null,t().createElement("div",{className:"group"},t().createElement("label",{className:"small gray"},t().createElement(s.FormattedMessage,{id:"new_email",defaultMessage:[{type:0,value:"New email"}]}))),t().createElement("div",{className:"group"},t().createElement(s.FormattedMessage,{id:"email_prompt",defaultMessage:[{type:0,value:"Email, e.g. jdoe@example.com"}]},(e=>t().createElement("input",{type:"email",placeholder:e,autoComplete:"email",value:this.state.email,onChange:this.handleEmailChange,required:!0}))))):"tel"==this.props.method?t().createElement(t().Fragment,null,t().createElement("div",{className:"group"},t().createElement("label",{className:"small gray"},t().createElement(s.FormattedMessage,{id:"new_phone_number",defaultMessage:[{type:0,value:"New phone number"}]}))),t().createElement("div",{className:"panel-form-row"},t().createElement(sn.default,{autoFocus:!0,onShowCountrySelector:this.props.onShowCountrySelector,onSubmit:this.handlePhoneChange}))):null,t().createElement("div",{className:"dialog-buttons"},t().createElement("button",{className:"secondary",onClick:this.props.onCancel},t().createElement(s.FormattedMessage,{id:"button_cancel",defaultMessage:[{type:0,value:"Cancel"}]})),t().createElement("button",{className:"primary",type:"submit"},t().createElement(s.FormattedMessage,{id:"button_ok",defaultMessage:[{type:0,value:"OK"}]}))))}}function rn(e,t){return e&&e.substring(0,t)}class on extends t().Component{constructor(e){super(e);const t=this.props.tinode.getMeTopic();this.state={fullName:rn(t.public?t.public.fn:void 0,Kt.S8),description:rn(t.public?t.public.note:void 0,Kt.EI),avatar:(0,va.PD)(t.public?t.public.photo:null),credentials:t.getCredentials()||[],credEdit:void 0},this.handleEditCred=this.handleEditCred.bind(this)}handleEditCred(e){console.log("Start editing cred",e),this.setState({credEdit:e})}render(){if(this.state.credEdit)return t().createElement(nn,{method:this.state.credEdit.meth,val:this.state.credEdit.val,done:this.state.credEdit.done,onShowCountrySelector:this.props.onShowCountrySelector,onSubmit:e=>{this.setState({credEdit:void 0}),console.log("Credential editing done",e)},onCancel:e=>this.setState({credEdit:void 0})});const e=[];return this.state.credentials.forEach(((a,s)=>{if(!["email","tel"].includes(a.meth))return;let n=a.val;if("tel"==a.meth){const e=(0,an.h)(a.val);n=e?e.formatInternational():a.val}e.push(t().createElement("div",{className:"group quoted",key:s},t().createElement("tt",{className:"clickable",onClick:e=>{e.preventDefault(),this.handleEditCred(a)}},n),t().createElement("span",null," ",a.done?null:t().createElement("i",{className:"material-icons"},"pending"))))})),e.length>0&&e.unshift(t().createElement("label",{className:"small",key:"title"},t().createElement(s.FormattedMessage,{id:"label_user_contacts",defaultMessage:[{type:0,value:"Contacts"}]}))),t().createElement("div",{className:"scrollable-panel"},t().createElement("div",{className:"panel-form-column"},t().createElement("a",{href:"#",className:"flat-button float-right",onClick:e=>{e.preventDefault(),this.props.onNavigate("general")}},t().createElement("i",{className:"material-icons"},"edit")," ",t().createElement(s.FormattedMessage,{id:"button_edit",defaultMessage:[{type:0,value:"Edit"}]})),t().createElement("center",null,t().createElement(Ga,{tinode:this.props.tinode,avatar:this.state.avatar,readOnly:!0,uid:this.props.myUserId,title:this.state.fullName})),t().createElement("div",{className:"group"},t().createElement("label",{className:"small"},t().createElement(s.FormattedMessage,{id:"label_your_name",defaultMessage:[{type:0,value:"Your name"}]})),t().createElement("div",{className:"large ellipsized"},this.state.fullName)),t().createElement("div",{className:"group"},t().createElement("label",{className:"small"},t().createElement(s.FormattedMessage,{id:"label_user_id",defaultMessage:[{type:0,value:"ID:"}]}))," ",t().createElement("tt",null,this.props.myUserId)),t().createElement("div",{className:"group"},t().createElement(Ba,{trustedBadges:this.props.trustedBadges})),this.state.description?t().createElement("div",{className:"group"},t().createElement("label",{className:"small"},t().createElement(s.FormattedMessage,{id:"label_description",defaultMessage:[{type:0,value:"Description"}]})),t().createElement("div",{className:"quoted"},this.state.description)):null),t().createElement("div",{className:"hr"}),t().createElement("div",{className:"panel-form-column"},t().createElement("div",{className:"group"},e)),t().createElement("div",{className:"hr"}),t().createElement("div",{className:"panel-form-column"},t().createElement("a",{href:"#",className:"flat-button",onClick:e=>{e.preventDefault(),this.props.onNavigate("notif")}},t().createElement("i",{className:"material-icons"},"notifications")," ",t().createElement(s.FormattedMessage,{id:"sidepanel_title_acc_notifications",defaultMessage:[{type:0,value:"Notifications"}]})),t().createElement("a",{href:"#",className:"flat-button",onClick:e=>{e.preventDefault(),this.props.onNavigate("security")}},t().createElement("i",{className:"material-icons"},"security")," ",t().createElement(s.FormattedMessage,{id:"button_security",defaultMessage:[{type:0,value:"Security"}]})),t().createElement("a",{href:"#",className:"flat-button",onClick:e=>{e.preventDefault(),this.props.onNavigate("support")}},t().createElement("i",{className:"material-icons"},"contact_support")," ",t().createElement(s.FormattedMessage,{id:"sidepanel_title_acc_support",defaultMessage:[{type:0,value:"Support"}]}))))}}const dn=(0,s.defineMessages)({archived_contacts_title:{id:"archived_contacts",defaultMessage:[{type:0,value:"Archived contacts ("},{type:1,value:"count"},{type:0,value:")"}]}});class ln extends t().Component{constructor(e){super(e),this.handleAction=this.handleAction.bind(this),this.state=ln.deriveStateFromProps(e)}static deriveStateFromProps(e){const t=[];let a=0,s=0;return e.chatList.map((n=>{const i=n.acs&&!n.acs.isJoiner();i&&e.blocked&&t.push(n),i||e.blocked||(n.private&&n.private.arch?e.archive?t.push(n):s++:e.archive||(t.push(n),a+=n.unread>0?1:0))})),t.sort(((e,t)=>(t.touched||0)-(e.touched||0))),s>0&&t.push({action:"archive",title:dn.archived_contacts_title,values:{count:s}}),{contactList:t,unreadThreads:a}}componentDidUpdate(e,t){if(e.chatList!=this.props.chatList||e.archive!=this.props.archive||e.blocked!=this.props.blocked){const e=ln.deriveStateFromProps(this.props);this.setState(e),e.unreadThreads!=t.unreadThreads&&ea(e.unreadThreads)}}handleAction(e){this.props.onShowArchive()}render(){return t().createElement(s.FormattedMessage,{id:"contacts_not_found",defaultMessage:[{type:0,value:"You have no chats"},{type:0,value:" "},{type:0,value:"¯∖_(ツ)_/¯"}]},(e=>t().createElement(Ra,{tinode:this.props.tinode,connected:this.props.connected,contacts:this.state.contactList,emptyListMessage:e,topicSelected:this.props.topicSelected,myUserId:this.props.myUserId,showOnline:!0,showUnread:!0,onTopicSelected:this.props.onTopicSelected,showContextMenu:this.props.showContextMenu,onAction:this.handleAction})))}}class cn{static setObject(e,t){localStorage.setItem(e,JSON.stringify(t))}static getObject(e){const t=localStorage.getItem(e);return t&&JSON.parse(t)}static updateObject(e,t){const a=this.getObject(e);this.setObject(e,Object.assign(a||{},t))}static removeItem(e){localStorage.removeItem(e)}}const hn=t().lazy((e=>Promise.resolve().then(r.bind(r,781))));class pn extends t().PureComponent{constructor(e){super(e),this.state={login:"",password:"",meth:"",email:"",tel:"",fn:"",imageUrl:null,uploadUrl:null,newAvatar:null,newAvatarMime:null,buttonDisabled:!1,saveToken:cn.getObject("keep-logged-in")},this.handleLoginChange=this.handleLoginChange.bind(this),this.handlePasswordChange=this.handlePasswordChange.bind(this),this.handleEmailChange=this.handleEmailChange.bind(this),this.handlePhoneChange=this.handlePhoneChange.bind(this),this.handleFnChange=this.handleFnChange.bind(this),this.handleImageChanged=this.handleImageChanged.bind(this),this.handleToggleSaveToken=this.handleToggleSaveToken.bind(this),this.handleAvatarCropped=this.handleAvatarCropped.bind(this),this.handleAvatarCropCancel=this.handleAvatarCropCancel.bind(this),this.uploadAvatar=this.uploadAvatar.bind(this),this.handleSubmit=this.handleSubmit.bind(this),e.tinode.connect().catch((e=>{this.props.onError(e.message,"err")}))}handleLoginChange(e){this.setState({login:e.target.value})}handlePasswordChange(e){this.setState({password:e})}handleEmailChange(e){this.setState({meth:"email",email:e.target.value})}handlePhoneChange(e){this.setState({meth:"tel",tel:e})}handleFnChange(e){this.setState({fn:e.target.value})}handleImageChanged(e,t){this.setState({newAvatar:t,newAvatarMime:e})}handleToggleSaveToken(){cn.setObject("keep-logged-in",!this.state.saveToken),this.setState({saveToken:!this.state.saveToken})}handleSubmit(e){e.preventDefault(),this.props.onCreateAccount(this.state.login.trim(),this.state.password.trim(),ta(this.state.fn.trim().substring(0,Kt.S8),this.state.uploadUrl),{meth:this.state.meth,val:"email"==this.state.meth?this.state.email:"tel"==this.state.meth?this.state.tel:null})}handleAvatarCropped(e,t,a,s){const n=t?URL.createObjectURL(t):null;this.setState({avatar:n,newAvatar:null,newAvatarMime:null}),t&&this.uploadAvatar(e,t,a,s)}handleAvatarCropCancel(){this.setState({newAvatar:null,newAvatarMime:null})}uploadAvatar(e,t,a,s){const n=e=>{let{mime:t,blob:a}=e;if(this.setState({imageUrl:URL.createObjectURL(a),buttonDisabled:!0}),a.size>Kt.uv){this.props.tinode.getLargeFileHelper().upload(a,"newacc").then((e=>this.setState({uploadUrl:e}))).catch((e=>this.props.onError(e.message,"err"))).finally((e=>this.setState({buttonDisabled:!1})))}else(0,va.w8)(a).then((e=>this.setState({uploadUrl:(0,va.PD)({data:e.bits,type:t})}))).finally((e=>this.setState({buttonDisabled:!1})))};a>Kt.IX||s>Kt.IX||a!=s?(0,va.EA)(t,Kt.IX,Kt.IX,Kt.GQ,!0).then((e=>n(e))).catch((e=>this.props.onError(e.message,"err"))):n({mime:e,blob:t,width:a,height:s})}render(){if(this.state.newAvatar)return t().createElement(ns,{avatar:this.state.newAvatar,mime:this.state.newAvatarMime,onSubmit:this.handleAvatarCropped,onCancel:this.handleAvatarCropCancel,onError:this.props.onError});let a="primary";return this.props.disabled&&(a+=" disabled"),t().createElement("form",{className:"panel-form-column",onSubmit:this.handleSubmit},t().createElement("div",{className:"panel-form-row"},t().createElement("div",{className:"umn"},t().createElement(s.FormattedMessage,{id:"login_prompt",defaultMessage:[{type:0,value:"Login"}]},(e=>t().createElement("input",{type:"text",placeholder:e,autoComplete:"user-name",value:this.state.login,onChange:this.handleLoginChange,required:!0,autoFocus:!0}))),t().createElement(s.FormattedMessage,{id:"password_prompt",defaultMessage:[{type:0,value:"Password"}]},(e=>t().createElement(is,{placeholder:e,autoComplete:"new-password",value:this.state.password,onFinished:this.handlePasswordChange,required:!0})))),t().createElement(Ga,{tinode:this.props.tinode,avatar:this.state.imageUrl,onImageUpdated:this.handleImageChanged,onError:this.props.onError})),t().createElement("div",{className:"panel-form-row"},t().createElement(s.FormattedMessage,{id:"full_name_prompt",defaultMessage:[{type:0,value:"Full name, e.g. John Doe"}]},(e=>t().createElement("input",{type:"text",placeholder:e,autoComplete:"name",value:this.state.fn,onChange:this.handleFnChange,required:!0})))),"email"==props.reqCredMethod?t().createElement("div",{className:"panel-form-row"},t().createElement(s.FormattedMessage,{id:"email_prompt",defaultMessage:[{type:0,value:"Email, e.g. jdoe@example.com"}]},(e=>t().createElement("input",{type:"email",placeholder:e,autoComplete:"email",value:this.state.email,onChange:this.handleEmailChange,required:!0})))):"tel"==props.reqCredMethod?t().createElement(t().Fragment,null,t().createElement("div",{className:"panel-form-row"},t().createElement("label",{className:"small gray"},t().createElement(s.FormattedMessage,{id:"mobile_phone_number",defaultMessage:[{type:0,value:"Mobile phone number"}]}))),t().createElement("div",{className:"panel-form-row"},t().createElement(e.Suspense,{fallback:t().createElement("div",null,t().createElement(s.FormattedMessage,{id:"loading_note",defaultMessage:[{type:0,value:"Loading..."}]}))},t().createElement(hn,{autoFocus:!1,onShowCountrySelector:this.props.onShowCountrySelector,onSubmit:this.handlePhoneChange})))):null,t().createElement("div",{className:"panel-form-row"},t().createElement(Wa,{id:"save-token",name:"save-token",checked:this.state.saveToken,onChange:this.handleToggleSaveToken}),t().createElement(s.FormattedMessage,{id:"stay_logged_in",defaultMessage:[{type:0,value:"Stay logged in"}]},(e=>t().createElement("label",{htmlFor:"save-token"}," ",e)))),t().createElement("div",{className:"dialog-buttons"},t().createElement("button",{className:a,type:"submit",disabled:this.state.buttonDisabled},t().createElement(s.FormattedMessage,{id:"button_sign_up",defaultMessage:[{type:0,value:"Sign up"}]}))))}}class un extends t().PureComponent{constructor(e){super(e),this.handleCheckboxClick=this.handleCheckboxClick.bind(this)}handleCheckboxClick(e,t){"sound"==e?this.props.onToggleMessageSounds(t):"alert"==e?this.props.onTogglePushNotifications(t):"incognito"==e&&this.props.onToggleIncognitoMode(t)}render(){return t().createElement("div",{className:"scrollable-panel"},t().createElement("div",{className:"panel-form-row"},t().createElement("label",{htmlFor:"message-sound"},t().createElement(s.FormattedMessage,{id:"label_message_sound",defaultMessage:[{type:0,value:"Message sound:"}]})),t().createElement(Wa,{name:"sound",id:"message-sound",checked:this.props.messageSounds,onChange:this.handleCheckboxClick})),t().createElement("div",{className:"panel-form-row"},t().createElement("label",{htmlFor:"desktop-alerts"},this.props.desktopAlertsEnabled?t().createElement(s.FormattedMessage,{id:"label_push_notifications",defaultMessage:[{type:0,value:"Notification alerts:"}]}):t().createElement(s.FormattedMessage,{id:"label_push_notifications_disabled",defaultMessage:[{type:0,value:"Notification alerts (requires HTTPS):"}]})),t().createElement(Wa,{name:"alert",id:"desktop-alerts",checked:this.props.desktopAlerts,onChange:this.props.desktopAlertsEnabled?this.handleCheckboxClick:null})),t().createElement("div",{className:"panel-form-row"},t().createElement("label",{htmlFor:"incognito-mode"},t().createElement(s.FormattedMessage,{id:"label_incognito_mode",defaultMessage:[{type:0,value:"Incognito mode:"}]})),t().createElement(Wa,{name:"incognito",id:"incognito-mode",checked:this.props.incognitoMode,onChange:this.handleCheckboxClick})))}}const mn=(0,s.defineMessages)({delete_account:{id:"delete_account",defaultMessage:[{type:0,value:"Delete account"}]},delete_account_warning:{id:"delete_account_warning",defaultMessage:[{type:0,value:"Are you sure you want to delete your account? It cannot be undone."}]}});class gn extends t().Component{constructor(e){super(e);const t=this.props.tinode.getMeTopic();let a=0;t.contacts((e=>{e.acs&&!e.acs.isJoiner()&&a++}));const s=t.getDefaultAccess();this.state={auth:s?s.auth:null,anon:s?s.anon:null,showPermissionEditorFor:void 0,blockedCount:a},this.handlePasswordUpdate=this.handlePasswordUpdate.bind(this),this.handleLaunchPermissionsEditor=this.handleLaunchPermissionsEditor.bind(this),this.handleHidePermissionsEditor=this.handleHidePermissionsEditor.bind(this),this.handlePermissionsChanged=this.handlePermissionsChanged.bind(this),this.handleDeleteAccount=this.handleDeleteAccount.bind(this)}handlePasswordUpdate(e){this.setState({password:e}),this.props.onUpdatePassword(e)}handleLaunchPermissionsEditor(e){this.setState({showPermissionEditorFor:e,editedPermissions:this.state[e]})}handleHidePermissionsEditor(){this.setState({showPermissionEditorFor:void 0})}handlePermissionsChanged(e){let t={};t[this.state.showPermissionEditorFor]=e,this.props.onUpdateAccountDesc("me",void 0,void 0,t);let a={showPermissionEditorFor:void 0};a[this.state.showPermissionEditorFor]=e,this.setState(a)}handleDeleteAccount(e){e.preventDefault();const{formatMessage:t}=this.props.intl;this.props.onShowAlert(t(mn.delete_account),t(mn.delete_account_warning),(e=>this.props.onDeleteAccount()),null,!0,null)}render(){return t().createElement(t().Fragment,null,this.state.showPermissionEditorFor?t().createElement(as,{mode:this.state.editedPermissions,skip:"O",onSubmit:this.handlePermissionsChanged,onCancel:this.handleHidePermissionsEditor}):t().createElement("div",{className:"scrollable-panel"},t().createElement("div",{className:"panel-form-column"},t().createElement("label",{className:"small"},t().createElement(s.FormattedMessage,{id:"label_password",defaultMessage:[{type:0,value:"Password"}]})),t().createElement("div",null,t().createElement(s.FormattedMessage,{id:"password_unchanged_prompt",defaultMessage:[{type:0,value:"Unchanged"}]},(e=>t().createElement(rs,{placeholder:e,type:"password",onFinished:this.handlePasswordUpdate}))))),t().createElement("div",{className:"hr"}),t().createElement("div",{className:"panel-form-column"},t().createElement("a",{href:"#",className:"danger flat-button",onClick:e=>{e.preventDefault(),this.props.onLogout()}},t().createElement("i",{className:"material-icons"},"exit_to_app")," ",t().createElement(s.FormattedMessage,{id:"button_logout",defaultMessage:[{type:0,value:"Logout"}]})),t().createElement("a",{href:"#",className:"danger flat-button",onClick:e=>{this.handleDeleteAccount(e)}},t().createElement("i",{className:"material-icons"},"delete")," ",t().createElement(s.FormattedMessage,{id:"button_delete_account",defaultMessage:[{type:0,value:"Delete account"}]}))),t().createElement("div",{className:"hr"}),t().createElement("div",{className:"panel-form-column"},t().createElement("div",null,t().createElement("label",{className:"small"},t().createElement(s.FormattedMessage,{id:"label_default_access_mode",defaultMessage:[{type:0,value:"Default access mode:"}]}))),t().createElement("div",{className:"quoted"},t().createElement("div",null,"Auth: ",t().createElement("tt",{className:"clickable",onClick:this.handleLaunchPermissionsEditor.bind(this,"auth")},this.state.auth)),t().createElement("div",null,"Anon: ",t().createElement("tt",{className:"clickable",onClick:this.handleLaunchPermissionsEditor.bind(this,"anon")},this.state.anon)))),this.state.blockedCount>0?t().createElement(t().Fragment,null,t().createElement("div",{className:"hr"}),t().createElement("div",{className:"panel-form-row"},t().createElement("i",{className:"material-icons"},"block")," ",t().createElement("a",{href:"#",className:"gray",onClick:e=>{e.preventDefault(),this.props.onShowBlocked()}},t().createElement(s.FormattedMessage,{id:"blocked_contacts_link",defaultMessage:[{type:0,value:"Blocked contacts ("},{type:1,value:"count"},{type:0,value:")"}],values:{count:this.state.blockedCount}})))):null))}}const fn=(0,s.injectIntl)(gn);class vn extends t().PureComponent{render(){return t().createElement("div",{className:"scrollable-panel"},t().createElement("div",{className:"panel-form-column"},t().createElement("a",{href:Kt.li,className:"flat-button",target:"_blank"},t().createElement("i",{className:"material-icons"},"email")," ",t().createElement(s.FormattedMessage,{id:"link_contact_us",defaultMessage:[{type:0,value:"Contact Us"}]})),t().createElement("a",{href:Kt.S9,className:"flat-button",target:"_blank"},t().createElement("i",{className:"material-icons"},"description")," ",t().createElement(s.FormattedMessage,{id:"link_terms_of_service",defaultMessage:[{type:0,value:"Terms of Service"}]})),t().createElement("a",{href:Kt.NW,className:"flat-button",target:"_blank"},t().createElement("i",{className:"material-icons"},"policy")," ",t().createElement(s.FormattedMessage,{id:"link_privacy_policy",defaultMessage:[{type:0,value:"Privacy Policy"}]}))),t().createElement("div",{className:"hr"}),t().createElement("div",{className:"panel-form-column"},t().createElement("div",{className:"panel-form-row"},t().createElement("label",{className:"small"},t().createElement(s.FormattedMessage,{id:"label_client",defaultMessage:[{type:0,value:"Client:"}]})),Kt.iC),t().createElement("div",{className:"panel-form-row"},t().createElement("label",{className:"small"},t().createElement(s.FormattedMessage,{id:"label_sdk",defaultMessage:[{type:0,value:"SDK:"}]})),Gt.Tinode.getLibrary()),t().createElement("div",{className:"panel-form-row"},t().createElement("label",{className:"small"},t().createElement(s.FormattedMessage,{id:"label_server",defaultMessage:[{type:0,value:"Server:"}]})),this.props.serverVersion),t().createElement("div",{className:"panel-form-row"},t().createElement("label",{className:"small"},t().createElement(s.FormattedMessage,{id:"label_server_address",defaultMessage:[{type:0,value:"Server address:"}]})),this.props.serverAddress)))}}class $n extends t().Component{constructor(e){super(e),this.state={login:e.login,password:"",hostName:e.serverAddress,saveToken:e.persist},this.handleLoginChange=this.handleLoginChange.bind(this),this.handlePasswordChange=this.handlePasswordChange.bind(this),this.handleToggleSaveToken=this.handleToggleSaveToken.bind(this),this.handleSubmit=this.handleSubmit.bind(this)}handleLoginChange(e){this.setState({login:e.target.value})}handlePasswordChange(e){this.setState({password:e.target.value})}handleToggleSaveToken(){this.props.onPersistenceChange(!this.state.saveToken),this.setState({saveToken:!this.state.saveToken})}handleSubmit(e){e.preventDefault(),this.props.onLogin(this.state.login.trim(),this.state.password.trim())}render(){let e="primary";return this.props.disabled&&(e+=" disabled"),t().createElement("form",{id:"login-form",onSubmit:this.handleSubmit},t().createElement(s.FormattedMessage,{id:"login_prompt",defaultMessage:[{type:0,value:"Login"}]},(e=>t().createElement("input",{type:"text",id:"inputLogin",placeholder:e,autoComplete:"username",autoCorrect:"off",autoCapitalize:"none",value:this.state.login,onChange:this.handleLoginChange,required:!0,autoFocus:!0}))),t().createElement(s.FormattedMessage,{id:"password_prompt",defaultMessage:[{type:0,value:"Password"}]},(e=>t().createElement(is,{type:"password",id:"inputPassword",placeholder:e,autoComplete:"current-password",value:this.state.password,onChange:this.handlePasswordChange,required:!0}))),t().createElement("div",{className:"panel-form-row"},t().createElement(Wa,{id:"save-token",name:"save-token",checked:this.state.saveToken,onChange:this.handleToggleSaveToken}),t().createElement("label",{htmlFor:"save-token"}," ",t().createElement(s.FormattedMessage,{id:"stay_logged_in",defaultMessage:[{type:0,value:"Stay logged in"}]})),t().createElement("a",{href:"#reset"},t().createElement(s.FormattedMessage,{id:"forgot_password_link",defaultMessage:[{type:0,value:"Forgot password?"}]}))),t().createElement("div",{className:"dialog-buttons"},t().createElement("button",{className:e,type:"submit"},t().createElement(s.FormattedMessage,{id:"button_sign_in",defaultMessage:[{type:0,value:"Sign in"}]}))))}}const bn=(0,s.defineMessages)({invalid_id:{id:"error_invalid_id",defaultMessage:[{type:0,value:"Invalid ID"}]}});class yn extends t().PureComponent{constructor(e){super(e),this.state={groupId:""},this.handleChange=this.handleChange.bind(this),this.handleKeyPress=this.handleKeyPress.bind(this),this.handleSubmit=this.handleSubmit.bind(this)}handleChange(e){this.setState({groupId:e.target.value})}handleKeyPress(e){"Enter"===e.key&&this.handleSubmit(e)}handleSubmit(e){if(e.preventDefault(),this.state.groupId){const e=this.state.groupId.trim(),t=e.substr(0,3);e.length>3&&["usr","grp","chn"].includes(t)?this.props.onSubmit(e):this.props.onError(this.props.intl.formatMessage(bn.invalid_id),"err")}}render(){return t().createElement("div",{className:"panel-form"},t().createElement("div",{className:"panel-form-row"},t().createElement(s.FormattedMessage,{id:"group_user_id_prompt",defaultMessage:[{type:0,value:"Group or User ID"}]},(e=>t().createElement("input",{type:"text",placeholder:e,value:this.state.groupId,onChange:this.handleChange,onKeyPress:this.handleKeyPress,required:!0,autoFocus:!0})))),t().createElement("div",{className:"dialog-buttons"},t().createElement("button",{className:"primary",onClick:this.handleSubmit},t().createElement(s.FormattedMessage,{id:"button_subscribe",defaultMessage:[{type:0,value:"Subscribe"}]}))))}}const En=(0,s.injectIntl)(yn);class Cn extends t().PureComponent{constructor(e){super(e),this.fullName=t().createRef(),this.state={fullName:"",private:"",description:"",imageUrl:null,tags:[],isChannel:!1,newAvatar:null,newAvatarMime:null},this.handleFieldEdit=this.handleFieldEdit.bind(this),this.handleImageChanged=this.handleImageChanged.bind(this),this.handleAvatarCropped=this.handleAvatarCropped.bind(this),this.handleAvatarCropCancel=this.handleAvatarCropCancel.bind(this),this.uploadAvatar=this.uploadAvatar.bind(this),this.handleTagsChanged=this.handleTagsChanged.bind(this),this.handleChannelToggle=this.handleChannelToggle.bind(this),this.handleSubmit=this.handleSubmit.bind(this)}componentDidMount(){}handleFieldEdit(e,t){this.setState({[e]:t.target.value||""})}handleImageChanged(e,t){this.setState({newAvatar:t,newAvatarMime:e})}handleAvatarCropped(e,t,a,s){const n=t?URL.createObjectURL(t):null;this.setState({imageUrl:n,newAvatar:null,newAvatarMime:null}),t&&this.uploadAvatar(e,t,a,s)}handleAvatarCropCancel(){this.setState({newAvatar:null,newAvatarMime:null})}uploadAvatar(e,t,a,s){const n=e=>{let{mime:t,blob:a}=e;if(a.size>Kt.uv){this.props.tinode.getLargeFileHelper().upload(a).then((e=>this.setState({imageUrl:e}))).catch((e=>this.props.onError(e.message,"err")))}else(0,va.w8)(a).then((e=>this.setState({imageUrl:(0,va.PD)({data:e.bits,type:t})})))};a>Kt.IX||s>Kt.IX||a!=s?(0,va.EA)(t,Kt.IX,Kt.IX,Kt.GQ,!0).then((e=>n(e))).catch((e=>this.props.onError(e.message,"err"))):n({mime:e,blob:t,width:a,height:s})}handleTagsChanged(e){this.setState({tags:e})}handleChannelToggle(){this.setState({isChannel:!this.state.isChannel})}handleSubmit(e){e.preventDefault();const t=this.state.fullName.trim().substring(0,Kt.S8),a=this.state.private.trim().substring(0,Kt.S8),s=this.state.description.trim().substring(0,Kt.EI);t&&this.props.onSubmit(t,s,this.state.imageUrl,a,this.state.tags,this.state.isChannel)}render(){if(this.state.newAvatar)return t().createElement(ns,{avatar:this.state.newAvatar,mime:this.state.newAvatarMime,onSubmit:this.handleAvatarCropped,onCancel:this.handleAvatarCropCancel,onError:this.props.onError});let e="primary";return this.props.disabled&&(e+=" disabled"),t().createElement("form",{className:"panel-form",onSubmit:this.handleSubmit},t().createElement("div",{className:"panel-form-column"},t().createElement("center",null,t().createElement(Ga,{tinode:this.props.tinode,avatar:this.state.imageUrl,onError:this.props.onError,onImageUpdated:this.handleImageChanged})),t().createElement("div",{className:"group"},t().createElement("label",{className:"small",htmlFor:"new-topic-fn"},t().createElement(s.FormattedMessage,{id:"label_topic_name",defaultMessage:[{type:0,value:"Name"}]})),t().createElement(s.FormattedMessage,{id:"topic_name_editing_placeholder",defaultMessage:[{type:0,value:"Freeform name of the group"}]},(e=>t().createElement("input",{type:"text",id:"new-topic-fn",placeholder:e,ref:this.fullName,value:this.state.fullName,onChange:this.handleFieldEdit.bind(this,"fullName"),autoFocus:!0,required:!0,tabIndex:0})))),t().createElement("div",{className:"group"},t().createElement("label",{className:"small",htmlFor:"new-topic-priv"},t().createElement(s.FormattedMessage,{id:"label_private",defaultMessage:[{type:0,value:"Private comment"}]})),t().createElement(s.FormattedMessage,{id:"private_editing_placeholder",defaultMessage:[{type:0,value:"Visible to you only"}]},(e=>t().createElement("input",{type:"text",id:"new-topic-priv",placeholder:e,value:this.state.private,onChange:this.handleFieldEdit.bind(this,"private"),tabIndex:1})))),t().createElement("div",{className:"group"},t().createElement("label",{className:"small",htmlFor:"new-topic-desc"},t().createElement(s.FormattedMessage,{id:"label_description",defaultMessage:[{type:0,value:"Description"}]})),t().createElement(s.FormattedMessage,{id:"description_editing_placeholder",defaultMessage:[{type:0,value:"Description (optional)"}]},(e=>t().createElement("input",{type:"text",id:"new-topic-desc",placeholder:e,value:this.state.description,onChange:this.handleFieldEdit.bind(this,"description"),tabIndex:2}))))),t().createElement("div",{className:"panel-form-row"},t().createElement(Wa,{checked:this.state.isChannel,tabIndex:3,onChange:this.handleChannelToggle})," ",t().createElement("label",{onClick:this.handleChannelToggle},t().createElement(s.FormattedMessage,{id:"channel_prompt",defaultMessage:[{type:0,value:"This is a channel"}]}))),t().createElement(s.FormattedMessage,{id:"title_tag_manager",defaultMessage:[{type:0,value:"Tags (search & discovery)"}]},(e=>t().createElement(os,{tinode:this.props.tinode,tags:this.state.tags,activated:!0,onTagsChanged:this.handleTagsChanged,tabIndex:4,title:e}))),t().createElement("div",{className:"dialog-buttons"},t().createElement("button",{className:e},t().createElement(s.FormattedMessage,{id:"button_create",defaultMessage:[{type:0,value:"Create"}]}))))}}const wn=(0,s.defineMessages)({search_for_contacts:{id:"search_for_contacts",defaultMessage:[{type:0,value:"Use search to find contacts"}]},search_no_results:{id:"search_no_results",defaultMessage:[{type:0,value:"Search returned no results"}]},search_placeholder:{id:"search_placeholder",defaultMessage:[{type:0,value:"List like email:alice@example.com, tel:17025550003..."}]}});class Sn extends t().Component{constructor(e){super(e),this.state={tabSelected:"find",searchQuery:null},this.handleTabClick=this.handleTabClick.bind(this),this.handleSearchContacts=this.handleSearchContacts.bind(this),this.handleSearchResultSelected=this.handleSearchResultSelected.bind(this),this.handleNewGroupSubmit=this.handleNewGroupSubmit.bind(this),this.handleGroupByID=this.handleGroupByID.bind(this)}componentDidMount(){this.props.onInitFind()}handleTabClick(e){e.preventDefault(),Gs.navigateTo(Gs.addUrlParam(window.location.hash,"tab",e.currentTarget.dataset.id)),this.setState({tabSelected:e.currentTarget.dataset.id})}handleSearchContacts(e){this.props.onSearchContacts(e),this.setState({searchQuery:Gt.Tinode.isNullValue(e)?null:e})}handleSearchResultSelected(e){"find"==this.state.tabSelected&&(Gs.navigateTo(Gs.removeUrlParam(window.location.hash,"tab")),this.props.onCreateTopic(e))}handleNewGroupSubmit(e,t,a,s,n,i){Gs.navigateTo(Gs.removeUrlParam(window.location.hash,"tab")),this.props.onCreateTopic(void 0,{public:ta(e,a,null,t),private:s,tags:n},i)}handleGroupByID(e){Gs.navigateTo(Gs.removeUrlParam(window.location.hash,"tab")),this.props.onCreateTopic(e)}render(){const{formatMessage:e}=this.props.intl,a=e(this.state.searchQuery?wn.search_no_results:wn.search_for_contacts),n=e(wn.search_placeholder);return t().createElement("div",{className:"flex-column"},t().createElement("ul",{className:"tabbar"},t().createElement("li",{className:"find"===this.state.tabSelected?"active":null},t().createElement("a",{href:"#","data-id":"find",onClick:this.handleTabClick},t().createElement(s.FormattedMessage,{id:"tabtitle_find_user",defaultMessage:[{type:0,value:"find"}]}))),t().createElement("li",{className:"grp"===this.state.tabSelected?"active":null},t().createElement("a",{href:"#","data-id":"grp",onClick:this.handleTabClick},t().createElement(s.FormattedMessage,{id:"tabtitle_new_group",defaultMessage:[{type:0,value:"new group"}]}))),t().createElement("li",{className:"byid"===this.state.tabSelected?"active":null},t().createElement("a",{href:"#","data-id":"byid",onClick:this.handleTabClick},t().createElement(s.FormattedMessage,{id:"tabtitle_group_by_id",defaultMessage:[{type:0,value:"by id"}]})))),"grp"===this.state.tabSelected?t().createElement(Cn,{tinode:this.props.tinode,onSubmit:this.handleNewGroupSubmit,onError:this.props.onError}):"byid"===this.state.tabSelected?t().createElement(En,{onSubmit:this.handleGroupByID,onError:this.props.onError}):t().createElement("div",{className:"flex-column"},t().createElement(Fa,{placeholder:n,onSearchContacts:this.handleSearchContacts}),t().createElement(Ra,{tinode:this.props.tinode,contacts:this.props.searchResults,myUserId:this.props.myUserId,emptyListMessage:a,showOnline:!1,showUnread:!1,showContextMenu:!1,onTopicSelected:this.handleSearchResultSelected})))}}const Mn=(0,s.injectIntl)(Sn),_n=t().lazy((e=>Promise.resolve().then(r.bind(r,781))));class Tn extends t().PureComponent{constructor(e){super(e),this.state={tel:"",email:"",password:"",sent:!1,haveCode:!1,code:""},this.handleSubmit=this.handleSubmit.bind(this),this.handleEmailChange=this.handleEmailChange.bind(this),this.handlePasswordChange=this.handlePasswordChange.bind(this),this.handleCodeChange=this.handleCodeChange.bind(this),this.handleShowCodeField=this.handleShowCodeField.bind(this),e.tinode.connect().catch((e=>{this.props.onError(e.message,"err")}))}componentDidMount(){const e=Gs.parseUrlHash(window.location.hash);this.setState({token:e.params.token,scheme:e.params.scheme})}handleSubmit(e){if(e.preventDefault(),this.state.token)this.props.onReset(this.state.password.trim(),{scheme:"token",token:this.state.token});else if(this.state.code&&this.props.reqCredMethod){const e=this.state.email.trim()||this.state.tel.trim();this.props.onReset(this.state.password.trim(),{scheme:"code",secret:`${this.state.code}:${this.props.reqCredMethod}:${e}`})}else{const e=this.state.email.trim(),t=this.state.tel.trim();this.setState({email:e,tel:t}),this.props.onRequest(this.props.reqCredMethod,e||t).then((e=>this.setState({sent:!0})))}}handleEmailChange(e){this.setState({email:e.target.value})}handlePasswordChange(e){this.setState({password:e.target.value})}handleCodeChange(e){this.setState({code:e.target.value.replace(/[^\d]/g,"")})}handleShowCodeField(e){e.preventDefault(),this.setState({haveCode:!0})}render(){const a=!(this.state.token&&this.state.scheme),n=!a||this.state.haveCode||this.state.sent,i=t().createElement(t().Fragment,null,t().createElement("label",{className:"small gray",htmlFor:"new-password"},t().createElement(s.FormattedMessage,{id:"label_new_password",defaultMessage:[{type:0,value:"New password"}]})),t().createElement(s.FormattedMessage,{id:"new_password_placeholder",defaultMessage:[{type:0,value:"Enter new password"}]},(e=>t().createElement(is,{id:"new-password",placeholder:e,autoComplete:"new-password",value:this.state.password,required:!0,autoFocus:!0,onChange:this.handlePasswordChange})))),r=t().createElement(t().Fragment,null,this.state.haveCode?null:t().createElement("label",{htmlFor:"inputEmail"},t().createElement(s.FormattedMessage,{id:"label_reset_password",defaultMessage:[{type:0,value:"Send a password reset email"}]})),t().createElement(s.FormattedMessage,{id:"credential_email_prompt",defaultMessage:[{type:0,value:"Your registration email"}]},(e=>t().createElement("input",{type:"email",id:"inputEmail",placeholder:e,autoComplete:"email",value:this.state.email,onChange:this.handleEmailChange,required:!0,autoFocus:!0})))),o=t().createElement(t().Fragment,null,this.state.haveCode?null:t().createElement("div",null,t().createElement("label",null,t().createElement(s.FormattedMessage,{id:"label_reset_password_tel",defaultMessage:[{type:0,value:"Send SMS to reset password"}]}))),t().createElement("div",null,t().createElement("label",{className:"small gray"},t().createElement(s.FormattedMessage,{id:"mobile_phone_number",defaultMessage:[{type:0,value:"Mobile phone number"}]}))),t().createElement("div",{className:"panel-form-row"},t().createElement(e.Suspense,{fallback:t().createElement("div",{className:"panel-form-row"},t().createElement(s.FormattedMessage,{id:"loading_note",defaultMessage:[{type:0,value:"Loading..."}]}))},t().createElement(_n,{autoFocus:!0,onShowCountrySelector:this.props.onShowCountrySelector,onSubmit:e=>this.setState({tel:e})})))),d=t().createElement(t().Fragment,null,"email"==this.props.reqCredMethod?t().createElement(s.FormattedMessage,{id:"password_reset_email_sent",defaultMessage:[{type:0,value:"An email with security code has been sent to "},{type:1,value:"email"},{type:0,value:". Enter the code below."}],values:{email:t().createElement("tt",null,this.state.email)}}):"tel"==this.props.reqCredMethod?t().createElement(s.FormattedMessage,{id:"password_reset_sms_sent",defaultMessage:[{type:0,value:"A text message with security code has been sent to "},{type:1,value:"phone"},{type:0,value:". Enter the code below."}],values:{phone:t().createElement("tt",null,this.state.tel)}}):null),l=t().createElement(t().Fragment,null,t().createElement("div",null,t().createElement("label",{className:"small gray",htmlFor:"enter-confirmation-code"},t().createElement(s.FormattedMessage,{id:"enter_confirmation_code_prompt",defaultMessage:[{type:0,value:"Confirmation code"}]}))),t().createElement("div",null,t().createElement(s.FormattedMessage,{id:"numeric_confirmation_code_prompt",defaultMessage:[{type:0,value:"Numbers only"}]},(e=>t().createElement("input",{type:"text",id:"enter-confirmation-code",placeholder:e,maxLength:10,value:this.state.code,onChange:this.handleCodeChange,required:!0}))))),c="email"==this.props.reqCredMethod?r:"tel"==this.props.reqCredMethod?o:null;return t().createElement("form",{id:"password-reset-form",onSubmit:this.handleSubmit},this.state.sent?d:a?c:null,this.state.haveCode||this.state.sent?l:null,n?i:null,t().createElement("div",{className:"dialog-buttons"},this.state.haveCode||this.state.sent?null:t().createElement("a",{href:"#",onClick:this.handleShowCodeField,style:{marginRight:"auto"}},t().createElement(s.FormattedMessage,{id:"password_i_have_code",defaultMessage:[{type:0,value:"I have code"}]})),t().createElement("button",{className:"primary",type:"submit"},n?t().createElement(s.FormattedMessage,{id:"button_reset",defaultMessage:[{type:0,value:"Reset"}]}):t().createElement(s.FormattedMessage,{id:"button_send_request",defaultMessage:[{type:0,value:"Send request"}]}))))}}class Nn extends t().PureComponent{constructor(e){super(e),this.state={hostName:e.serverAddress,changed:!1},this.handleHostNameChange=this.handleHostNameChange.bind(this),this.handleEditingFinished=this.handleEditingFinished.bind(this),this.handleKeyDown=this.handleKeyDown.bind(this)}handleHostNameChange(e){this.setState({hostName:e.target.value,changed:!0})}handleEditingFinished(){this.state.changed&&(this.setState({changed:!1}),this.props.onServerAddressChange(this.state.hostName.trim()))}handleKeyDown(e){"Enter"==e.key&&this.handleEditingFinished()}render(){var e=[];for(let a in Kt.Rc){let s=Kt.Rc[a];e.push(t().createElement("option",{key:s,value:s}))}return t().createElement("div",{className:"panel-form-row"},t().createElement("input",{type:"search",id:"host-name",placeholder:this.props.hostName,list:"known-hosts",className:"quoted",value:this.state.hostName,onChange:this.handleHostNameChange,onBlur:this.handleEditingFinished,onKeyDown:this.handleKeyDown,required:!0}),t().createElement("datalist",{id:"known-hosts"},e))}}class kn extends t().PureComponent{constructor(e){super(e),this.state={transport:e.transport||"def",serverAddress:e.serverAddress,secureConnection:e.secureConnection},this.handleSubmit=this.handleSubmit.bind(this),this.handleTransportSelected=this.handleTransportSelected.bind(this),this.handleServerAddressChange=this.handleServerAddressChange.bind(this),this.handleToggleSecure=this.handleToggleSecure.bind(this)}handleSubmit(e){e.preventDefault(),this.props.onUpdate({transport:this.state.transport,serverAddress:this.state.serverAddress,secureConnection:this.state.secureConnection})}handleTransportSelected(e){this.setState({transport:e.currentTarget.value})}handleServerAddressChange(e){this.setState({serverAddress:e})}handleToggleSecure(e){this.setState({secureConnection:!this.state.secureConnection})}render(){const e={def:"default",ws:"websocket",lp:"long polling"},a=[];return["def","ws","lp"].map((s=>{const n="transport-"+s,i=e[s];a.push(t().createElement("li",{key:s},t().createElement("input",{type:"radio",id:n,name:"transport-select",value:s,checked:this.state.transport===s,onChange:this.handleTransportSelected}),t().createElement("label",{htmlFor:n},i)))})),t().createElement("form",{id:"settings-form",className:"panel-form",onSubmit:this.handleSubmit},t().createElement("div",{className:"panel-form-row"},t().createElement("label",{className:"small"},t().createElement(s.FormattedMessage,{id:"label_server_to_use",defaultMessage:[{type:0,value:"Server to use:"}]}))),t().createElement(Nn,{serverAddress:this.state.serverAddress,onServerAddressChange:this.handleServerAddressChange}),t().createElement("div",{className:"panel-form-row"},t().createElement(Wa,{id:"secure-connection",name:"secure-connection",checked:this.state.secureConnection,className:"quoted",onChange:this.handleToggleSecure}),t().createElement("label",{htmlFor:"secure-connection"},t().createElement(s.FormattedMessage,{id:"label_use_secure_connection",defaultMessage:[{type:0,value:"Use secure connection"}]}))),t().createElement("div",{className:"panel-form-row"},t().createElement("label",{className:"small"},t().createElement(s.FormattedMessage,{id:"label_wire_transport",defaultMessage:[{type:0,value:"Wire transport:"}]}))),t().createElement("div",{className:"panel-form-row"},t().createElement("ul",{className:"quoted"},a)),t().createElement("div",{className:"dialog-buttons"},t().createElement("button",{type:"submit",className:"primary"},t().createElement(s.FormattedMessage,{id:"button_update",defaultMessage:[{type:0,value:"Update"}]}))))}}const An=(0,s.defineMessages)({phone:{id:"phone_dative",defaultMessage:[{type:0,value:"phone"}]},email:{id:"email_dative",defaultMessage:[{type:0,value:"email"}]}});class Pn extends t().PureComponent{constructor(e){super(e),this.state={code:e.credCode||"",codeReceived:e.credCode},this.handleChange=this.handleChange.bind(this),this.handleKeyPress=this.handleKeyPress.bind(this),this.handleSubmit=this.handleSubmit.bind(this),this.handleCancel=this.handleCancel.bind(this)}static getDerivedStateFromProps(e,t){return e.credCode!=t.codeReceived?{code:e.credCode||"",codeReceived:e.credCode}:t}componentDidMount(){this.props.credCode&&this.props.onSubmit(this.props.credMethod,this.props.credCode,this.props.credToken)}componentDidUpdate(e,t){this.state.codeReceived&&this.state.code&&this.state.code!=t.code&&this.props.onSubmit(this.props.credMethod,this.state.code,this.props.credToken)}handleChange(e){this.setState({code:e.target.value.trim()})}handleKeyPress(e){"Enter"===e.key?this.handleSubmit(e):"Escape"==e.key&&this.handleCancel(e)}handleSubmit(e){e.preventDefault(),this.state.code&&this.state.code.trim()&&this.props.onSubmit(this.props.credMethod,this.state.code.trim(),this.props.credToken)}handleCancel(e){e.preventDefault(),this.props.onCancel()}render(){const{formatMessage:e}=this.props.intl,a={email:e(An.email),tel:e(An.phone)}[this.props.credMethod]||this.props.credMethod;return t().createElement("div",{className:"panel-form"},t().createElement("div",{className:"panel-form-row"},t().createElement("label",{className:"small gray",htmlFor:"enter-confirmation-code"},t().createElement(s.FormattedMessage,{id:"enter_confirmation_code_prompt",defaultMessage:[{type:0,value:"Confirmation code"}],values:{method:a}}))),t().createElement("div",{className:"panel-form-row"},t().createElement(s.FormattedMessage,{id:"numeric_confirmation_code_prompt",defaultMessage:[{type:0,value:"Numbers only"}]},(e=>t().createElement("input",{type:"text",id:"enter-confirmation-code",placeholder:e,value:this.state.code,onChange:this.handleChange,onKeyPress:this.handleKeyPress,required:!0})))),t().createElement("div",{className:"dialog-buttons"},t().createElement("button",{className:"secondary",onClick:this.handleCancel},t().createElement(s.FormattedMessage,{id:"button_cancel",defaultMessage:[{type:0,value:"Cancel"}]})),t().createElement("button",{className:"primary",onClick:this.handleSubmit},t().createElement(s.FormattedMessage,{id:"button_confirm",defaultMessage:[{type:0,value:"Confirm"}]}))))}}const Dn=(0,s.injectIntl)(Pn),In=(0,s.defineMessages)({login:{id:"sidepanel_title_login",defaultMessage:[{type:0,value:"Sign In"}]},register:{id:"sidepanel_title_register",defaultMessage:[{type:0,value:"Create Account"}]},settings:{id:"sidepanel_title_settings",defaultMessage:[{type:0,value:"Settings"}]},edit:{id:"sidepanel_title_account_settings",defaultMessage:[{type:0,value:"Account Settings"}]},general:{id:"panel_title_general",defaultMessage:[{type:0,value:"General"}]},security:{id:"panel_title_security",defaultMessage:[{type:0,value:"Security"}]},crop:{id:"panel_title_crop",defaultMessage:[{type:0,value:"Drag to Adjust"}]},notif:{id:"sidepanel_title_acc_notifications",defaultMessage:[{type:0,value:"Notifications"}]},support:{id:"sidepanel_title_acc_support",defaultMessage:[{type:0,value:"Support"}]},newtpk:{id:"sidepanel_title_newtpk",defaultMessage:[{type:0,value:"Start New Chat"}]},cred:{id:"sidepanel_title_cred",defaultMessage:[{type:0,value:"Confirm Credentials"}]},reset:{id:"sidepanel_title_reset",defaultMessage:[{type:0,value:"Reset Password"}]},archive:{id:"sidepanel_title_archive",defaultMessage:[{type:0,value:"Archived Chats"}]},blocked:{id:"sidepanel_title_blocked",defaultMessage:[{type:0,value:"Blocked Chats"}]}});class Rn extends t().PureComponent{constructor(e){super(e),this.handleNewTopic=this.handleNewTopic.bind(this)}handleNewTopic(){this.props.onNavigate("newtpk")}render(){const{formatMessage:e}=this.props.intl,a=this.props.state||(this.props.myUserId?"contacts":"login");let s,n,i,r;return"contacts"==a?(s=this.props.title,n=!this.props.avatar||this.props.avatar,i=this.props.trustedBadges):(s=e(In[a]),n=!1,i=null),-1==["login","contacts"].indexOf(a)&&(r=this.props.onCancel),t().createElement("div",{id:"sidepanel",className:this.props.hideSelf?"nodisplay":null},t().createElement(tn,{state:a,title:s,avatar:n,tinode:this.props.tinode,trustedBadges:i,myUserId:this.props.myUserId,onSignUp:this.props.onSignUp,onSettings:this.props.onSettings,onNewTopic:this.handleNewTopic,onCancel:r}),t().createElement(za,{level:this.props.errorLevel,text:this.props.errorText,action:this.props.errorAction,actionText:this.props.errorActionText,onClearError:this.props.onError}),t().createElement(qa,{show:this.props.loadSpinnerVisible}),"login"===a?t().createElement($n,{login:this.props.login,disabled:this.props.loginDisabled,persist:this.props.persist,onLogin:this.props.onLoginRequest,onPersistenceChange:this.props.onPersistenceChange}):"register"===a?t().createElement(pn,{tinode:this.props.tinode,reqCredMethod:this.props.reqCredMethod,onShowCountrySelector:this.props.onShowCountrySelector,onCreateAccount:this.props.onCreateAccount,onCancel:this.props.onCancel,onError:this.props.onError}):"settings"===a?t().createElement(kn,{transport:this.props.transport,serverAddress:this.props.serverAddress,secureConnection:this.props.secureConnection,onCancel:this.props.onCancel,onUpdate:this.props.onGlobalSettings}):"edit"===a?t().createElement(on,{tinode:this.props.tinode,myUserId:this.props.myUserId,trustedBadges:this.props.trustedBadges,onShowCountrySelector:this.props.onShowCountrySelector,onNavigate:this.props.onNavigate}):"general"===a||"crop"===a?t().createElement(ls,{topic:"me",tinode:this.props.tinode,myUserId:this.props.myUserId,reqCredMethod:this.props.reqCredMethod,onUpdateTopicDesc:this.props.onUpdateAccountDesc,onUpdateTagsRequest:this.props.onUpdateAccountTags,onCredAdd:this.props.onCredAdd,onCredDelete:this.props.onCredDelete,onCredConfirm:this.props.onCredConfirm,onError:this.props.onError}):"notif"===a?t().createElement(un,{messageSounds:this.props.messageSounds,desktopAlerts:this.props.desktopAlerts,desktopAlertsEnabled:this.props.desktopAlertsEnabled,incognitoMode:this.props.incognitoMode,onTogglePushNotifications:this.props.onTogglePushNotifications,onToggleMessageSounds:this.props.onToggleMessageSounds,onToggleIncognitoMode:this.props.onToggleIncognitoMode}):"security"===a?t().createElement(fn,{tinode:this.props.tinode,onUpdateAccountDesc:this.props.onUpdateAccountDesc,onUpdatePassword:this.props.onUpdatePassword,onLogout:this.props.onLogout,onDeleteAccount:this.props.onDeleteAccount,onShowAlert:this.props.onShowAlert,onShowBlocked:this.props.onShowBlocked}):"support"===a?t().createElement(vn,{serverAddress:this.props.serverAddress,serverVersion:this.props.serverVersion}):"contacts"===a||"archive"==a||"blocked"==a?t().createElement(ln,{tinode:this.props.tinode,myUserId:this.props.myUserId,connected:this.props.connected,topicSelected:this.props.topicSelected,archive:"archive"==a,blocked:"blocked"==a,chatList:this.props.chatList,showContextMenu:this.props.showContextMenu,onTopicSelected:this.props.onTopicSelected,onShowArchive:this.props.onShowArchive}):"newtpk"===a?t().createElement(Mn,{tinode:this.props.tinode,searchResults:this.props.searchResults,onInitFind:this.props.onInitFind,onSearchContacts:this.props.onSearchContacts,onCreateTopic:this.props.onCreateTopic,onError:this.props.onError}):"cred"===a?t().createElement(Dn,{credCode:this.props.credCode,credMethod:this.props.credMethod,credToken:this.props.credToken,onSubmit:this.props.onValidateCredentials,onCancel:this.props.onCancel}):"reset"===a?t().createElement(Tn,{tinode:this.props.tinode,reqCredMethod:this.props.reqCredMethod,onShowCountrySelector:this.props.onShowCountrySelector,onRequest:this.props.onPasswordResetRequest,onReset:this.props.onResetPassword,onCancel:this.props.onCancel}):null)}}const Fn=(0,s.injectIntl)(Rn);var xn=r(3119);function On(){let e=Kt.Mv;return"object"==typeof window.location&&("file:"==window.location.protocol||"localhost"==window.location.hostname?e=Kt.Rc.local:window.location.hostname&&(e=window.location.hostname+(window.location.port?":"+window.location.port:""))),e}function Un(){return"object"==typeof window.location&&"https:"==window.location.protocol}const Ln=t().lazy((e=>r.e(290).then(r.bind(r,1290)))),Bn=new Audio("audio/msg.m4a"),jn=(0,s.defineMessages)({reconnect_countdown:{id:"reconnect_countdown",defaultMessage:[{type:0,value:"Disconnected. Reconnecting in "},{type:1,value:"seconds"},{type:0,value:"…"}]},reconnect_now:{id:"reconnect_now",defaultMessage:[{type:0,value:"Try now"}]},push_init_failed:{id:"push_init_failed",defaultMessage:[{type:0,value:"Failed to initialize push notifications"}]},invalid_security_token:{id:"invalid_security_token",defaultMessage:[{type:0,value:"Invalid security token"}]},no_connection:{id:"no_connection",defaultMessage:[{type:0,value:"No connection"}]},code_doesnot_match:{id:"code_doesnot_match",defaultMessage:[{type:0,value:"Code does not match"}]},menu_item_info:{id:"menu_item_info",defaultMessage:[{type:0,value:"Info"}]},menu_item_audio_call:{id:"menu_item_audio_call",defaultMessage:[{type:0,value:"Call"}]},menu_item_video_call:{id:"menu_item_video_call",defaultMessage:[{type:0,value:"Video call"}]},cred_confirmed_successfully:{id:"cred_confirmed_successfully",defaultMessage:[{type:0,value:"Confirmed successfully"}]}});class Hn extends t().Component{constructor(e){super(e),this.selfRef=t().createRef(),this.state=this.getBlankState(),this.handleResize=this.handleResize.bind(this),this.handleHashRoute=this.handleHashRoute.bind(this),this.handleOnline=this.handleOnline.bind(this),this.checkForAppUpdate=this.checkForAppUpdate.bind(this),this.handleVisibilityEvent=this.handleVisibilityEvent.bind(this),this.handleError=this.handleError.bind(this),this.handleLoginRequest=this.handleLoginRequest.bind(this),this.handlePersistenceChange=this.handlePersistenceChange.bind(this),this.handleConnected=this.handleConnected.bind(this),this.handleAutoreconnectIteration=this.handleAutoreconnectIteration.bind(this),this.doLogin=this.doLogin.bind(this),this.handleLoginSuccessful=this.handleLoginSuccessful.bind(this),this.handleDisconnect=this.handleDisconnect.bind(this),this.tnMeMetaDesc=this.tnMeMetaDesc.bind(this),this.tnMeContactUpdate=this.tnMeContactUpdate.bind(this),this.tnMeSubsUpdated=this.tnMeSubsUpdated.bind(this),this.resetContactList=this.resetContactList.bind(this),this.tnInitFind=this.tnInitFind.bind(this),this.tnFndSubsUpdated=this.tnFndSubsUpdated.bind(this),this.handleSearchContacts=this.handleSearchContacts.bind(this),this.handleTopicSelected=this.handleTopicSelected.bind(this),this.handleHideMessagesView=this.handleHideMessagesView.bind(this),this.handleSendMessage=this.handleSendMessage.bind(this),this.handleNewChatInvitation=this.handleNewChatInvitation.bind(this),this.handleNewAccount=this.handleNewAccount.bind(this),this.handleNewAccountRequest=this.handleNewAccountRequest.bind(this),this.handleUpdatePasswordRequest=this.handleUpdatePasswordRequest.bind(this),this.handleUpdateAccountTagsRequest=this.handleUpdateAccountTagsRequest.bind(this),this.handleToggleIncognitoMode=this.handleToggleIncognitoMode.bind(this),this.handleSettings=this.handleSettings.bind(this),this.handleGlobalSettings=this.handleGlobalSettings.bind(this),this.handleShowArchive=this.handleShowArchive.bind(this),this.handleShowBlocked=this.handleShowBlocked.bind(this),this.handleToggleMessageSounds=this.handleToggleMessageSounds.bind(this),this.handleCredAdd=this.handleCredAdd.bind(this),this.handleCredDelete=this.handleCredDelete.bind(this),this.handleCredConfirm=this.handleCredConfirm.bind(this),this.initFCMessaging=this.initFCMessaging.bind(this),this.toggleFCMToken=this.toggleFCMToken.bind(this),this.handlePushMessage=this.handlePushMessage.bind(this),this.handleSidepanelCancel=this.handleSidepanelCancel.bind(this),this.handleStartTopicRequest=this.handleStartTopicRequest.bind(this),this.handleNewTopicCreated=this.handleNewTopicCreated.bind(this),this.handleTopicUpdateRequest=this.handleTopicUpdateRequest.bind(this),this.handleUnarchive=this.handleUnarchive.bind(this),this.handleChangePermissions=this.handleChangePermissions.bind(this),this.handleTagsUpdateRequest=this.handleTagsUpdateRequest.bind(this),this.handleLogout=this.handleLogout.bind(this),this.handleDeleteAccount=this.handleDeleteAccount.bind(this),this.handleDeleteTopicRequest=this.handleDeleteTopicRequest.bind(this),this.handleDeleteMessagesRequest=this.handleDeleteMessagesRequest.bind(this),this.handleLeaveUnsubRequest=this.handleLeaveUnsubRequest.bind(this),this.handleBlockTopicRequest=this.handleBlockTopicRequest.bind(this),this.handleReportTopic=this.handleReportTopic.bind(this),this.handleShowContextMenu=this.handleShowContextMenu.bind(this),this.defaultTopicContextMenu=this.defaultTopicContextMenu.bind(this),this.handleHideContextMenu=this.handleHideContextMenu.bind(this),this.handleShowAlert=this.handleShowAlert.bind(this),this.handleShowInfoView=this.handleShowInfoView.bind(this),this.handleMemberUpdateRequest=this.handleMemberUpdateRequest.bind(this),this.handleValidateCredentialsRequest=this.handleValidateCredentialsRequest.bind(this),this.handlePasswordResetRequest=this.handlePasswordResetRequest.bind(this),this.handleResetPassword=this.handleResetPassword.bind(this),this.handleContextMenuAction=this.handleContextMenuAction.bind(this),this.handleShowCountrySelector=this.handleShowCountrySelector.bind(this),this.handleShowForwardDialog=this.handleShowForwardDialog.bind(this),this.handleHideForwardDialog=this.handleHideForwardDialog.bind(this),this.handleStartVideoCall=this.handleStartVideoCall.bind(this),this.handleStartAudioCall=this.handleStartAudioCall.bind(this),this.handleInfoMessage=this.handleInfoMessage.bind(this),this.handleDataMessage=this.handleDataMessage.bind(this),this.handleCallClose=this.handleCallClose.bind(this),this.handleCallInvite=this.handleCallInvite.bind(this),this.handleCallRinging=this.handleCallRinging.bind(this),this.handleCallHangup=this.handleCallHangup.bind(this),this.handleCallSendOffer=this.handleCallSendOffer.bind(this),this.handleCallIceCandidate=this.handleCallIceCandidate.bind(this),this.handleCallSendAnswer=this.handleCallSendAnswer.bind(this),this.handleCallAccept=this.handleCallAccept.bind(this),this.sendMessageToTopic=this.sendMessageToTopic.bind(this),this.callTimeoutTimer=null}getBlankState(){const e=cn.getObject("settings")||{},t=!!cn.getObject("keep-logged-in");return{connected:!1,ready:!1,autoLogin:!1,transport:e.transport||null,serverAddress:e.serverAddress||On(),secureConnection:void 0===e.secureConnection?Un():e.secureConnection,serverVersion:"no connection",messageSounds:!e.messageSoundsOff,incognitoMode:!1,desktopAlerts:t&&!!e.desktopAlerts,desktopAlertsEnabled:(Un()||"object"==typeof window.location&&"localhost"==window.location.hostname)&&void 0!==oe&&"undefined"!=typeof navigator&&"undefined"!=typeof FIREBASE_INIT,firebaseToken:t?cn.getObject("firebase-token"):null,applicationVisible:!document.hidden,errorText:"",errorLevel:null,errorAction:void 0,errorActionText:null,sidePanelSelected:"login",sidePanelTitle:null,sidePanelAvatar:null,myTrustedBadges:[],loadSpinnerVisible:!1,login:"",password:"",persist:t,myUserId:null,liveConnection:navigator.onLine,topicSelected:"",topicSelectedOnline:!1,topicSelectedAcs:null,newTopicParams:null,loginDisabled:!1,displayMobile:window.innerWidth<=Kt.yl,infoPanel:void 0,mobilePanel:"sidepanel",callTopic:void 0,callState:0,callAudioOnly:void 0,callShouldStart:!1,contextMenuVisible:!1,contextMenuBounds:null,contextMenuClickAt:null,contextMenuParams:null,contextMenuItems:[],forwardDialogVisible:!1,forwardMessage:null,alertVisible:!1,alertParams:{},chatList:[],searchResults:[],searchableContacts:[],reqCredMethod:void 0,credMethod:void 0,credCode:void 0,credToken:void 0,requestedTopic:void 0}}componentDidMount(){if(window.addEventListener("resize",this.handleResize),window.addEventListener("online",(e=>{this.handleOnline(!0)})),window.addEventListener("offline",(e=>{this.handleOnline(!1)})),window.addEventListener("hashchange",this.handleHashRoute),"function"==typeof BroadcastChannel){new BroadcastChannel("tinode-sw").addEventListener("message",this.handlePushMessage)}else console.warn("Your browser does not support BroadcastChannel. Some features will not be available");document.addEventListener("visibilitychange",this.handleVisibilityEvent),this.setState({viewportWidth:document.documentElement.clientWidth,viewportHeight:document.documentElement.clientHeight}),new Promise(((e,t)=>{this.tinode=Hn.tnSetup(this.state.serverAddress,Un(),this.state.transport,this.props.intl.locale,this.state.persist,e),this.tinode.onConnect=this.handleConnected,this.tinode.onDisconnect=this.handleDisconnect,this.tinode.onAutoreconnectIteration=this.handleAutoreconnectIteration,this.tinode.onInfoMessage=this.handleInfoMessage,this.tinode.onDataMessage=this.handleDataMessage})).then((e=>{this.state.desktopAlertsEnabled&&this.initFCMessaging().catch((e=>{}));const t=Gs.parseUrlHash(window.location.hash);this.resetContactList();const a=this.state.persist?cn.getObject("auth-token"):void 0;if(a&&(this.setState({autoLogin:!0}),a.expires=new Date(a.expires),this.tinode.setAuthToken(a),this.tinode.connect().catch((e=>{this.handleError(e.message,"err")}))),this.readTimer=null,this.readTimerCallback=null,["cred","reset","register"].includes(t.path[0]))this.handleHashRoute();else{this.setState({requestedTopic:t.path[1]});const e=t.params&&t.params.cred_done?Gs.addUrlParam("","cred_done",t.params.cred_done):"";Gs.navigateTo(e)}}))}componentWillUnmount(){window.removeEventListener("resize",this.handleResize),window.removeEventListener("hashchange",this.handleHashRoute),document.removeEventListener("visibilitychange",this.handleVisibilityEvent)}static tnSetup(e,t,a,s,n,i){const r=new Gt.Tinode({appName:Kt.iC,host:e,apiKey:Kt.$h,transport:a,secure:t,persist:n},i);return r.setHumanLanguage(s),r.enableLogging(Kt.JG,!0),r}handlePushMessage(e){this.tinode.oobNotification(e.data||{})}initFCMessaging(){const{formatMessage:e,locale:t}=this.props.intl,a=(t,a)=>{console.error(t,a),this.handleError(e(jn.push_init_failed),"err"),this.setState({firebaseToken:null}),cn.updateObject("settings",{desktopAlerts:!1})};try{return this.fcm=jt(oe(FIREBASE_INIT,Kt.iC)),navigator.serviceWorker.getRegistration("/service-worker.js").then((e=>e||navigator.serviceWorker.register("/service-worker.js").then((e=>(this.checkForAppUpdate(e),e))))).then((e=>((e.active||e.installing).postMessage(JSON.stringify({locale:t,version:xn.l})),Hn.requestFCMToken(this.fcm,e)))).then((e=>{const t=cn.getObject("keep-logged-in");e!=this.state.firebaseToken&&(this.tinode.setDeviceToken(e),t&&cn.setObject("firebase-token",e)),this.setState({firebaseToken:e,desktopAlerts:!0}),t&&cn.updateObject("settings",{desktopAlerts:!0}),qt(this.fcm,(e=>{this.handlePushMessage(e)}))})).catch((e=>{throw a(e),e}))}catch(e){return a(e),Promise.reject(e)}}static requestFCMToken(e,t){return Ht(e,{serviceWorkerRegistration:t,vapidKey:FIREBASE_INIT.messagingVapidKey}).then((t=>t||Notification.requestPermission().then((t=>{if("granted"===t)return Ht(e,{serviceWorkerRegistration:reg,vapidKey:FIREBASE_INIT.messagingVapidKey}).then((e=>{if(e)return e;throw new Error("Failed to initialize notifications")}));throw new Error("No permission to send notifications: "+t)}))))}handleResize(){const e=document.documentElement.clientWidth<=Kt.yl;this.setState({viewportWidth:document.documentElement.clientWidth,viewportHeight:document.documentElement.clientHeight}),this.state.displayMobile!=e&&this.setState({displayMobile:e})}checkForAppUpdate(e){e.onupdatefound=a=>{const n=e.installing;n.onstatechange=e=>{if("installed"==n.state&&navigator.serviceWorker.controller){const e=t().createElement(t().Fragment,null,t().createElement(s.FormattedMessage,{id:"update_available",defaultMessage:[{type:0,value:"Update available."}]})," ",t().createElement("a",{href:""},t().createElement(s.FormattedMessage,{id:"reload_update",defaultMessage:[{type:0,value:"Reload"}]})),".");this.handleError(e,"info")}}}}handleHashRoute(){const e=Gs.parseUrlHash(window.location.hash),t={infoPanel:e.params.info,newTopicTabSelected:e.params.tab};if(e.path&&e.path.length>0){["register","settings","edit","notif","security","support","general","crop","cred","reset","newtpk","archive","blocked","contacts",""].includes(e.path[0])?t.sidePanelSelected=e.path[0]:console.warn("Unknown sidepanel view",e.path[0]);let a=e.path[1]||null;a!=this.state.topicSelected&&(Gt.Tinode.topicType(a)||(a=null),Object.assign(t,{topicSelected:a,topicSelectedAcs:this.tinode.getTopicAccessMode(a)}))}else Object.assign(t,{sidePanelSelected:"",topicSelected:null});e.params.method&&(t.credMethod=e.params.method),e.params.code&&(t.credCode=e.params.code),e.params.token&&(t.credToken=e.params.token),e.params.cred_done&&Object.assign(t,Hn.stateForError(this.props.intl.formatMessage(jn.cred_confirmed_successfully),"info")),this.setState(t)}handleOnline(e){e?(this.handleError(),clearInterval(this.reconnectCountdown),this.tinode.reconnect()):this.handleError(this.props.intl.formatMessage(jn.no_connection),"warn"),this.setState({liveConnection:e})}handleVisibilityEvent(){this.setState({applicationVisible:!document.hidden})}static stateForError(e,t,a,s){return{errorText:e,errorLevel:t,errorAction:a,errorActionText:s,callShouldStart:!1}}handleError(e,t,a,s){this.setState(Hn.stateForError(e,t,a,s))}handleLoginRequest(e,t){this.setState({loginDisabled:!0,login:e,password:t,loadSpinnerVisible:!0,autoLogin:!0}),this.handleError("",null),this.tinode.isConnected()?this.doLogin(e,t,null,{meth:this.state.credMethod,resp:this.state.credCode}):this.tinode.connect().catch((e=>{this.setState({loginDisabled:!1,autoLogin:!1,loadSpinnerVisible:!1}),this.handleError(e.message,"err")})),this.state.desktopAlertsEnabled&&!this.state.firebaseToken&&this.initFCMessaging()}handlePersistenceChange(e){e?this.tinode.initStorage().then((e=>{cn.setObject("keep-logged-in",!0),this.setState({persist:!0})})):this.tinode.clearStorage().then((e=>{cn.setObject("keep-logged-in",!1),this.setState({persist:!1})}))}handleConnected(){clearInterval(this.reconnectCountdown),this.handleError();const e=this.tinode.getServerInfo();this.setState({serverVersion:e.ver+" "+(e.build?e.build:"none"),reqCredMethod:((e.reqCred||{}).auth||[])[0]||"email"}),this.state.autoLogin&&this.doLogin(this.state.login,this.state.password,null,{meth:this.state.credMethod,resp:this.state.credCode})}handleAutoreconnectIteration(e,t){if(clearInterval(this.reconnectCountdown),e<0)return void this.handleError();if(t)return void t.then((e=>{this.handleError()})).catch((e=>{this.handleError(e.message,"err")}));const{formatMessage:a}=this.props.intl;let s=e/1e3;s|=s,this.reconnectCountdown=setInterval((e=>{if(s<-10)return clearInterval(this.reconnectCountdown),void this.tinode.reconnect();const t=s>99?(0,Jt.nH)(s):s;this.handleError(a(jn.reconnect_countdown,{seconds:t}),"warn",(e=>{clearInterval(this.reconnectCountdown),this.tinode.reconnect()}),a(jn.reconnect_now)),s-=1}),1e3)}handleDisconnect(e){this.setState({connected:!1,ready:!1,topicSelectedOnline:!1,errorText:e&&e.message?e.message:"Disconnected",errorLevel:e&&e.message?"err":"warn",loginDisabled:!1,contextMenuVisible:!1,forwardDialogVisible:!1,serverVersion:"no connection"})}doLogin(e,t,a,s){if(this.tinode.isAuthenticated())return void Gs.navigateTo("");let n=a||(this.tinode.getAuthToken()||{}).token;if(!(e&&t||n))return Gs.navigateTo(""),void this.setState({loginDisabled:!1});s=Gt.Tinode.credential(s);let i,r=this.tinode.isConnected()?Promise.resolve():this.tinode.connect();e&&t?(n=null,this.setState({password:null}),i=r.then((a=>this.tinode.loginBasic(e,t,s)))):i=r.then((e=>this.tinode.loginToken(n,s))),i.then((e=>{e.code>=300&&"validate credentials"===e.text?(this.setState({loadSpinnerVisible:!1}),s&&this.handleError(this.props.intl.formatMessage(jn.code_doesnot_match),"warn"),Hn.navigateToCredentialsView(e.params)):this.handleLoginSuccessful()})).catch((e=>{const t=e.code>=500;this.setState({loginDisabled:!1,credMethod:void 0,credCode:void 0,loadSpinnerVisible:!1,autoLogin:t}),this.handleError(e.message,"err"),console.warn("Login failed",e),t||(n&&this.handleLogout(),Gs.navigateTo(""))}))}static navigateToCredentialsView(e){const t=Gs.parseUrlHash(window.location.hash);t.path[0]="cred",t.params.method=e.cred[0],t.params.token=e.token,Gs.navigateTo(Gs.composeUrlHash(t.path,t.params))}handleLoginSuccessful(){this.handleError(),cn.getObject("keep-logged-in")&&cn.setObject("auth-token",this.tinode.getAuthToken());const e=this.state.requestedTopic,t=this.tinode.getMeTopic();t.onMetaDesc=this.tnMeMetaDesc,t.onContactUpdate=this.tnMeContactUpdate,t.onSubsUpdated=this.tnMeSubsUpdated,this.setState({connected:!0,credMethod:void 0,credCode:void 0,credToken:void 0,myUserId:this.tinode.getCurrentUserID(),autoLogin:!0,requestedTopic:void 0}),t.subscribe(t.startMetaQuery().withLaterSub().withDesc().withTags().withCred().build()).catch((e=>{this.tinode.disconnect(),localStorage.removeItem("auth-token"),this.handleError(e.message,"err"),Gs.navigateTo("")})).finally((e=>{this.setState({loadSpinnerVisible:!1})}));let a=Gs.setUrlSidePanel(window.location.hash,"contacts");e&&(a=Gs.setUrlTopic(a,e)),Gs.navigateTo(a)}tnMeMetaDesc(e){if(e){if(e.public&&this.setState({sidePanelTitle:e.public.fn,sidePanelAvatar:(0,va.PD)(e.public.photo)}),e.trusted){const t=[];for(const[a,s]of Object.entries(e.trusted))s&&t.push(a);this.setState({myTrustedBadges:t})}e.acs&&this.setState({incognitoMode:!e.acs.isPresencer()})}}tnMeContactUpdate(e,t){if("on"==e||"off"==e)this.resetContactList(),this.state.topicSelected==t.topic&&this.setState({topicSelectedOnline:"on"==e});else if("read"==e)this.resetContactList();else if("msg"==e){const e=this.tinode.getTopic(t.topic),a=e&&e.isArchived();t.unread>0&&this.state.messageSounds&&!a&&(document.hidden||this.state.topicSelected!=t.topic)&&Bn.play().catch((e=>{})),this.resetContactList()}else"recv"==e||("gone"==e||"unsub"==e?(this.state.topicSelected==t.topic&&this.handleTopicSelected(null),this.resetContactList()):"acs"==e?this.state.topicSelected==t.topic&&this.setState({topicSelectedAcs:t.acs}):"del"==e||"upd"==e||"call"==e||console.info("Unsupported (yet) presence update:",e,"in",t.topic))}tnMeSubsUpdated(e){this.resetContactList()}static prepareSearchableContacts(e,t){const a={};for(const t of e)Gt.Tinode.isP2PTopicName(t.topic)&&(a[t.topic]={user:t.topic,updated:t.updated,public:t.public,private:t.private,acs:t.acs});for(const e of t)a[e.user]||(a[e.user]=e);return Object.values(a)}resetContactList(){const e={chatList:[]};this.state.ready||(e.ready=!0),this.tinode.getMeTopic().contacts((t=>{t.topic||t.user||(t.topic=t.name),e.chatList.push(t),this.state.topicSelected==t.topic&&(e.topicSelectedOnline=t.online,e.topicSelectedAcs=t.acs)}));const t=new Date(0);e.chatList.sort(((e,a)=>(e.touched||t).getTime()-(a.touched||t).getTime())),e.searchableContacts=Hn.prepareSearchableContacts(e.chatList,this.state.searchResults),this.setState(e)}tnInitFind(){const e=this.tinode.getFndTopic();e.onSubsUpdated=this.tnFndSubsUpdated,e.isSubscribed()?this.tnFndSubsUpdated():e.subscribe(e.startMetaQuery().withSub().build()).catch((e=>{this.handleError(e.message,"err")}))}tnFndSubsUpdated(){const e=[];this.tinode.getFndTopic().contacts((t=>{e.push(t)})),this.setState({searchResults:e,searchableContacts:Hn.prepareSearchableContacts(this.state.chatList,e)})}handleSearchContacts(e){const t=this.tinode.getFndTopic();t.setMeta({desc:{public:e}}).then((e=>t.getMeta(t.startMetaQuery().withSub().build()))).catch((e=>this.handleError(e.message,"err")))}handleTopicSelected(e){this.state.newTopicParams&&this.state.newTopicParams._topicName!=e&&this.setState({newTopicParams:null}),e?(this.setState({errorText:"",errorLevel:null,mobilePanel:"topic-view",infoPanel:void 0}),this.state.topicSelected!=e&&(this.setState({topicSelectedOnline:this.tinode.isTopicOnline(e),topicSelectedAcs:this.tinode.getTopicAccessMode(e),forwardMessage:null}),Gs.navigateTo(Gs.setUrlTopic("",e)))):(this.setState({errorText:"",errorLevel:null,mobilePanel:"sidepanel",topicSelectedOnline:!1,topicSelectedAcs:null,infoPanel:void 0,forwardMessage:null}),Gs.navigateTo(Gs.setUrlTopic("",null)))}handleHideMessagesView(){this.setState({mobilePanel:"sidepanel"}),Gs.navigateTo(Gs.setUrlTopic(window.location.hash,null))}handleSendMessage(e,t,a,s){const n=this.tinode.getTopic(this.state.topicSelected);return this.sendMessageToTopic(n,e,t,a,s)}sendMessageToTopic(e,t,a,s,n){(t=e.createMessage(t,!1))._uploader=s,n&&(t.head=Object.assign(t.head||{},n));const i=[];if(a&&i.push(a),!e.isSubscribed()){const a=e.subscribe().then((a=>{let s=[];e.queuedMessages((a=>{a._sending||a.seq==t.seq||(a.head&&a.head.webrtc?s.push(a.seq):e.isSubscribed()&&e.publishMessage(a))})),s.length>0&&e.delMessagesList(s,!0)}));i.push(a)}return e.publishDraft(t,Promise.all(i)).then((t=>(e.isArchived()&&e.archive(!1),t))).catch((e=>this.handleError(e.message,"err")))}handleNewChatInvitation(e,t){const a=this.tinode.getTopic(e);let s=null;switch(t){case"accept":const n=a.getAccessMode().getGiven();s=a.setMeta({sub:{mode:n}}),a.isP2PType()&&(s=s.then((t=>a.setMeta({sub:{user:e,mode:n}}))));break;case"delete":s=a.delTopic(!0);break;case"block":const i=a.getAccessMode().updateWant("-JP").getWant();s=a.setMeta({sub:{mode:i}}).then((e=>this.handleTopicSelected(null)));break;default:console.warn("Unknown invitation action",'"'+t+'""')}null!=s&&s.catch((e=>this.handleError(e.message,"err")))}handleNewAccount(){this.handleError(),Gs.navigateTo(Gs.setUrlSidePanel(window.location.hash,"register"))}handleNewAccountRequest(e,t,a,s,n){this.handleError(),this.tinode.connect(this.state.serverAddress).then((i=>{let r;return a&&a.photo&&a.photo.ref&&(r=[a.photo.ref]),this.tinode.createAccountBasic(e,t,{public:a,tags:n,cred:Gt.Tinode.credential(s),attachments:r})})).then((e=>{e.code>=300&&"validate credentials"==e.text?Hn.navigateToCredentialsView(e.params):this.handleLoginSuccessful(this)})).catch((e=>{this.handleError(e.message,"err")}))}handleToggleIncognitoMode(e){this.setState({incognitoMode:null});const t=this.tinode.getMeTopic(),a=t.getAccessMode().updateWant(e?"-P":"+P").getWant();t.setMeta({sub:{mode:a}}).catch((t=>{this.setState({incognitoMode:!e}),this.handleError(t.message,"err")}))}handleUpdateAccountTagsRequest(e,t){this.tinode.getMeTopic().setMeta({tags:t}).catch((e=>this.handleError(e.message,"err")))}handleSettings(){this.handleError(),Gs.navigateTo(Gs.setUrlSidePanel(window.location.hash,this.state.myUserId?"edit":"settings"))}handleGlobalSettings(e){const t=e.serverAddress||this.state.serverAddress,a=e.transport||this.state.transport,s=void 0===e.secureConnection?this.state.secureConnection:e.secureConnection;this.tinode&&(this.tinode.clearStorage(),this.tinode.onDisconnect=void 0,this.tinode.disconnect()),this.tinode=Hn.tnSetup(t,s,a,this.props.intl.locale,cn.getObject("keep-logged-in")),this.tinode.onConnect=this.handleConnected,this.tinode.onDisconnect=this.handleDisconnect,this.tinode.onAutoreconnectIteration=this.handleAutoreconnectIteration,this.tinode.onInfoMessage=this.handleInfoMessage,this.tinode.onDataMessage=this.handleDataMessage,this.setState({serverAddress:t,transport:a,secureConnection:s}),cn.setObject("settings",{serverAddress:t,transport:a,secureConnection:s}),Gs.navigateTo(Gs.setUrlSidePanel(window.location.hash,""))}handleShowArchive(){Gs.navigateTo(Gs.setUrlSidePanel(window.location.hash,this.state.myUserId?"archive":""))}handleShowBlocked(){Gs.navigateTo(Gs.setUrlSidePanel(window.location.hash,this.state.myUserId?"blocked":""))}toggleFCMToken(e){e?(this.setState({desktopAlerts:null}),this.state.firebaseToken?(this.setState({desktopAlerts:!0}),cn.getObject("keep-logged-in")&&cn.updateObject("settings",{desktopAlerts:!0})):this.initFCMessaging()):this.state.firebaseToken&&this.fcm?Vt(this.fcm).catch((e=>{console.error("Unable to delete token.",e)})).finally((e=>{cn.updateObject("settings",{desktopAlerts:!1}),localStorage.removeItem("firebase-token"),this.setState({desktopAlerts:!1,firebaseToken:null}),this.tinode.setDeviceToken(null)})):(this.setState({desktopAlerts:!1,firebaseToken:null}),cn.updateObject("settings",{desktopAlerts:!1}))}handleToggleMessageSounds(e){this.setState({messageSounds:e}),cn.updateObject("settings",{messageSoundsOff:!e})}handleCredAdd(e,t){this.tinode.getMeTopic().setMeta({cred:{meth:e,val:t}}).catch((e=>this.handleError(e.message,"err")))}handleCredDelete(e,t){this.tinode.getMeTopic().delCredential(e,t).catch((e=>this.handleError(e.message,"err")))}handleCredConfirm(e,t){Hn.navigateToCredentialsView({cred:[e]})}handleSidepanelCancel(){const e=Gs.parseUrlHash(window.location.hash);let t="";["security","support","general","notif"].includes(e.path[0])?t="edit":"crop"==e.path[0]?t="general":"blocked"==e.path[0]?t="security":this.state.myUserId&&(t="contacts"),e.path[0]=t,e.params&&(delete e.params.code,delete e.params.method,delete e.params.tab,delete e.params.scheme,delete e.params.token),Gs.navigateTo(Gs.composeUrlHash(e.path,e.params)),this.setState({errorText:"",errorLevel:null})}basicNavigator(e){Gs.navigateTo(Gs.setUrlSidePanel(window.location.hash,e))}infoNavigator(e){Gs.navigateTo(Gs.setUrlInfoPanel(window.location.hash,e))}handleStartTopicRequest(e,t,a){if(e&&this.tinode.isTopicCached(e))return void this.handleTopicSelected(e);const s={};Gt.Tinode.isP2PTopicName(e)?(s.sub={mode:Kt.RK},s.desc={defacs:{auth:Kt.RK}}):(e=e||this.tinode.newGroupTopicName(a),t&&(s.desc={public:t.public,private:{comment:t.private}},s.tags=t.tags)),s._topicName=e,this.setState({newTopicParams:s},(t=>{this.handleTopicSelected(e)}))}handleNewTopicCreated(e,t){let a={};this.state.callShouldStart&&(a={callState:3,callShouldStart:!1}),this.state.topicSelected==e&&e!=t&&(a.topicSelected=t),this.setState(a,(e=>{Gs.navigateTo(Gs.setUrlTopic("",t))}))}handleTopicUpdateRequest(e,t,a,s){this.handleError();const n=this.tinode.getTopic(e);if(n){const e={};let i;t&&(t.photo&&(t.photo.ref&&t.photo.ref!=Gt.Tinode.DEL_CHAR?i=[t.photo.ref]:t.photo.data&&t.photo.data!=Gt.Tinode.DEL_CHAR||(t.photo=Gt.Tinode.DEL_CHAR)),e.public=t),"string"==typeof a&&(e.private=a===Gt.Tinode.DEL_CHAR?Gt.Tinode.DEL_CHAR:{comment:a}),s&&(e.defacs=s),n.setMeta({desc:e,attachments:i}).catch((e=>this.handleError(e.message,"err")))}}handleUnarchive(e){const t=this.tinode.getTopic(e);t&&t.archive(!1).catch((e=>this.handleError(e.message,"err")))}handleUpdatePasswordRequest(e){this.handleError(),e&&this.tinode.updateAccountBasic(null,this.tinode.getCurrentLogin(),e).catch((e=>this.handleError(e.message,"err")))}handleChangePermissions(e,t,a){const s=this.tinode.getTopic(e);if(s){const e=s.getAccessMode();a?(e.updateGiven(t),t=e.getGiven()):(e.updateWant(t),t=e.getWant()),s.setMeta({sub:{user:a,mode:t}}).catch((e=>this.handleError(e.message,"err")))}}handleTagsUpdateRequest(e,t){const a=this.tinode.getTopic(e);a&&a.setMeta({tags:t}).catch((e=>this.handleError(e.message,"err")))}handleLogout(){let e;ea(0),localStorage.removeItem("auth-token"),localStorage.removeItem("firebase-token"),localStorage.removeItem("settings"),this.state.firebaseToken&&Vt(this.fcm),clearInterval(this.reconnectCountdown),this.tinode?(e=this.tinode.clearStorage(),this.tinode.onDisconnect=void 0,this.tinode.disconnect()):e=Promose.resolve(),this.setState(this.getBlankState()),e.then((e=>{this.tinode=Hn.tnSetup(this.state.serverAddress,Un(),this.state.transport,this.props.intl.locale,cn.getObject("keep-logged-in"),(e=>{this.tinode.onConnect=this.handleConnected,this.tinode.onDisconnect=this.handleDisconnect,this.tinode.onAutoreconnectIteration=this.handleAutoreconnectIteration,this.tinode.onInfoMessage=this.handleInfoMessage,this.tinode.onDataMessage=this.handleDataMessage,Gs.navigateTo("")}))}))}handleDeleteAccount(){this.tinode.delCurrentUser(!0).then((e=>{this.handleLogout()}))}handleDeleteTopicRequest(e){const t=this.tinode.getTopic(e);t&&t.delTopic(!0).then((e=>{Gs.navigateTo(Gs.setUrlTopic(window.location.hash,""))})).catch((e=>{this.handleError(e.message,"err")}))}handleDeleteMessagesRequest(e){const t=this.tinode.getTopic(e);t&&t.delMessagesAll(!0).catch((e=>this.handleError(e.message,"err")))}handleLeaveUnsubRequest(e){const t=this.tinode.getTopic(e);t&&t.leave(!0).then((e=>{Gs.navigateTo(Gs.setUrlTopic(window.location.hash,""))})).catch((e=>{this.handleError(e.message,"err")}))}handleBlockTopicRequest(e){const t=this.tinode.getTopic(e);t&&t.updateMode(null,"-JP").then((e=>{Gs.navigateTo(Gs.setUrlTopic(window.location.hash,""))})).catch((e=>this.handleError(e.message,"err")))}handleReportTopic(e){const t=this.tinode.getTopic(e);t&&(this.tinode.report("report",e),t.updateMode(null,"-JP").then((e=>{Gs.navigateTo(Gs.setUrlTopic(window.location.hash,""))})).catch((e=>this.handleError(e.message,"err"))))}handleShowContextMenu(e,t){this.setState({contextMenuVisible:!0,contextMenuClickAt:{x:e.x,y:e.y},contextMenuParams:e,contextMenuItems:t||this.defaultTopicContextMenu(e.topicName),contextMenuBounds:this.selfRef.current.getBoundingClientRect()})}handleShowForwardDialog(e){"newtpk"==this.state.sidePanelSelected&&this.handleSidepanelCancel();const t="➦ "+e.userName,a="string"==typeof e.content?Gt.Drafty.init(e.content):Gt.Drafty.forwardedContent(e.content),s=Gt.Drafty.preview(a,Kt.vX,!0),n=Gt.Drafty.append(Gt.Drafty.appendLineBreak(Gt.Drafty.mention(t,e.userFrom)),a),i=Gt.Drafty.quote(t,e.userFrom,s),r={forwarded:e.topicName+":"+e.seq};this.setState({forwardDialogVisible:!0,forwardMessage:{head:r,msg:n,preview:i}})}defaultTopicContextMenu(e){const t=this.tinode.getTopic(e);if(t._deleted)return["topic_delete"];let a=!1,s=!1,n=!1,i=!1,r=!1,o=!1,d=!1;if(t){i=t.isSubscribed(),o=t.isArchived();const e=t.getAccessMode();e&&(a=e.isMuted(),s=!e.isJoiner(),n=!e.isJoiner("want"),r=e.isDeleter())}return d=!!this.tinode.getServerParam("iceServers"),[i?{title:this.props.intl.formatMessage(jn.menu_item_info),handler:this.handleShowInfoView}:null,i&&Gt.Tinode.isP2PTopicName(e)&&d?{title:this.props.intl.formatMessage(jn.menu_item_audio_call),handler:this.handleStartAudioCall}:null,i&&Gt.Tinode.isP2PTopicName(e)&&d?{title:this.props.intl.formatMessage(jn.menu_item_video_call),handler:this.handleStartVideoCall}:null,i?"messages_clear":null,i&&r?"messages_clear_hard":null,a?s?null:"topic_unmute":"topic_mute",n?"topic_unblock":"topic_block",o?"topic_restore":"topic_archive","topic_delete"]}handleHideContextMenu(){this.setState({contextMenuVisible:!1,contextMenuClickAt:null,contextMenuParams:null,contextMenuBounds:null})}handleHideForwardDialog(e){this.setState({forwardDialogVisible:!1,forwardMessage:e?this.state.forwardMessage:null})}handleContextMenuAction(e,t,a){"topic_archive"==e?t&&a.topicName&&a.topicName==this.state.topicSelected&&t.then((e=>{this.handleTopicSelected(null)})):"menu_item_forward"==e&&this.handleShowForwardDialog(a)}handleShowAlert(e,t,a,s,n,i){this.setState({alertVisible:!0,alertParams:{title:e,content:t,onConfirm:a,confirm:s,onReject:n,reject:i}})}handleShowInfoView(){Gs.navigateTo(Gs.addUrlParam(window.location.hash,"info","info")),this.setState({infoPanel:"info"})}handleMemberUpdateRequest(e,t,a){if(!e)return;const s=this.tinode.getTopic(e);s&&(t&&t.length>0&&t.map((e=>{s.invite(e,null).catch((e=>this.handleError(e.message,"err")))})),a&&a.length>0&&a.map((e=>{s.delSubscription(e).catch((e=>this.handleError(e.message,"err")))})))}handleValidateCredentialsRequest(e,t,a){this.tinode.isAuthenticated()?this.tinode.getMeTopic().setMeta({cred:{meth:e,resp:t}}).catch((e=>this.handleError(e.message,"err"))):(this.setState({credMethod:e,credCode:t,credToken:a}),this.doLogin(null,null,a,{meth:e,resp:t}))}handlePasswordResetRequest(e,t){return this.tinode.connect().then((a=>this.tinode.requestResetAuthSecret("basic",e,t))).catch((e=>{this.handleError(e.message,"err")}))}handleResetPassword(e,t){const a=(0,va.DC)(t.secret);a&&t.scheme?this.tinode.connect().then((s=>this.tinode.updateAccountBasic(null,null,e,{scheme:t.scheme,secret:a}))).then((e=>Gs.navigateTo(""))).catch((e=>{this.handleError(e.message,"err")})):this.handleError(this.props.intl.formatMessage(jn.invalid_security_token),"err")}handleShowCountrySelector(a,n,i){this.handleShowAlert("Select country",t().createElement(e.Suspense,{fallback:t().createElement("div",null,t().createElement(s.FormattedMessage,{id:"loading_note",defaultMessage:[{type:0,value:"Loading..."}]}))},t().createElement(Ln,{selected:a,onSubmit:(e,t)=>{this.setState({alertVisible:!1}),i(e,t)}})),null,null,(e=>{}),"Cancel")}handleStartVideoCall(){this.setState({callTopic:this.state.topicSelected,callState:1,callAudioOnly:!1})}handleStartAudioCall(){this.setState({callTopic:this.state.topicSelected,callState:1,callAudioOnly:!0})}handleCallInvite(e,t,a,s){switch(a){case 1:const a={webrtc:ja,aonly:!!s};this.handleSendMessage(Gt.Drafty.videoCall(s),void 0,void 0,a).then((e=>{e.code<200||e.code>=300||!e.params||!e.params.seq?this.handleCallClose():this.setState({callSeq:e.params.seq})}));break;case 3:const n=this.tinode.getTopic(e);if(!n)return;n.videoCall("accept",t)}}handleCallRinging(e,t){const a=this.tinode.getTopic(e);a&&a.videoCall("ringing",t)}handleCallHangup(e,t){const a=this.tinode.getTopic(e);a&&a.videoCall("hang-up",t)}handleCallSendOffer(e,t,a){const s=this.tinode.getTopic(e);s&&s.videoCall("offer",t,a)}handleCallIceCandidate(e,t,a){const s=this.tinode.getTopic(e);s&&s.videoCall("ice-candidate",t,a)}handleCallSendAnswer(e,t,a){const s=this.tinode.getTopic(e);s&&s.videoCall("answer",t,a)}handleCallClose(){this.callTimeoutTimer&&clearTimeout(this.callTimeoutTimer),this.setState({callTopic:void 0,callState:0,callAudioOnly:void 0})}handleCallAccept(e){const t=this.tinode.getTopic(e);t&&(t.isSubscribed()?(this.handleTopicSelected(this.state.callTopic),this.setState({callState:3})):this.setState({callShouldStart:!0},(e=>this.handleTopicSelected(this.state.callTopic))))}handleInfoMessage(e){if("call"==e.what)switch(e.event){case"accept":if(Gt.Tinode.isMeTopicName(e.topic)&&this.tinode.isMe(e.from))return void this.setState({callTopic:null,callState:0,callSeq:null,callAudioOnly:void 0});e.topic==this.state.callTopic&&this.setState({callState:3});break;case"hang-up":this.handleCallClose()}}handleDataMessage(e){if(e.head&&e.head.webrtc&&e.head.webrtc==ja){const t=this.tinode.getTopic(e.topic);if(t){const a=t.latestMsgVersion(e.seq)||e;a.head&&a.head.webrtc&&a.head.webrtc==ja&&e.from!=this.state.myUserId&&(0==this.state.callState?this.setState({callTopic:e.topic,callState:2,callSeq:e.seq,callAudioOnly:!!a.head.aonly}):this.handleCallHangup(e.topic,e.seq))}else console.warn("Received vc data message from unknown topic",e.topic)}}render(){return t().createElement("div",{id:"app-container",ref:this.selfRef},this.state.contextMenuVisible?t().createElement(Yt,{tinode:this.tinode,bounds:this.state.contextMenuBounds,clickAt:this.state.contextMenuClickAt,params:this.state.contextMenuParams,items:this.state.contextMenuItems,hide:this.handleHideContextMenu,onShowAlert:this.handleShowAlert,onAction:this.handleContextMenuAction,onTopicRemoved:e=>{e==this.state.topicSelected&&this.handleTopicSelected(null)},onError:this.handleError}):null,this.state.forwardDialogVisible?t().createElement(xa,{tinode:this.tinode,contacts:this.state.chatList,topicSelected:this.state.topicSelected,myUserId:this.state.myUserId,hide:this.handleHideForwardDialog,onInitFind:this.tnInitFind,searchResults:this.state.searchResults,onSearchContacts:this.handleSearchContacts,onTopicSelected:this.handleStartTopicRequest}):null,this.state.callTopic&&2==this.state.callState?t().createElement(Va,{tinode:this.tinode,topic:this.state.callTopic,seq:this.state.callSeq,callState:this.state.callState,audioOnly:this.state.callAudioOnly,onClose:this.handleCallClose,onRinging:this.handleCallRinging,onAcceptCall:this.handleCallAccept,onReject:this.handleCallHangup}):null,this.state.alertVisible?t().createElement(Wt,{title:this.state.alertParams.title,content:this.state.alertParams.content,onReject:this.state.alertParams.onReject?e=>this.setState({alertVisible:!1}):null,reject:this.state.alertParams.reject,onConfirm:this.state.alertParams.onConfirm?e=>{this.setState({alertVisible:!1}),this.state.alertParams.onConfirm()}:null,confirm:this.state.alertParams.confirm}):null,t().createElement(Fn,{tinode:this.tinode,connected:this.state.connected,displayMobile:this.state.displayMobile,hideSelf:this.state.displayMobile&&"sidepanel"!==this.state.mobilePanel,state:this.state.sidePanelSelected,title:this.state.sidePanelTitle,avatar:this.state.sidePanelAvatar,trustedBadges:this.state.myTrustedBadges,login:this.state.login,persist:this.state.persist,myUserId:this.state.myUserId,loginDisabled:this.state.loginDisabled,loadSpinnerVisible:this.state.loadSpinnerVisible,errorText:this.state.errorText,errorLevel:this.state.errorLevel,errorAction:this.state.errorAction,errorActionText:this.state.errorActionText,topicSelected:this.state.topicSelected,chatList:this.state.chatList,credMethod:this.state.credMethod,credCode:this.state.credCode,credToken:this.state.credToken,transport:this.state.transport,messageSounds:this.state.messageSounds,desktopAlerts:this.state.desktopAlerts,desktopAlertsEnabled:this.state.desktopAlertsEnabled,incognitoMode:this.state.incognitoMode,serverAddress:this.state.serverAddress,secureConnection:this.state.secureConnection,serverVersion:this.state.serverVersion,reqCredMethod:this.state.reqCredMethod,onGlobalSettings:this.handleGlobalSettings,onSignUp:this.handleNewAccount,onSettings:this.handleSettings,onNavigate:this.basicNavigator,onLoginRequest:this.handleLoginRequest,onPersistenceChange:this.handlePersistenceChange,onCreateAccount:this.handleNewAccountRequest,onUpdateAccountDesc:this.handleTopicUpdateRequest,onUpdatePassword:this.handleUpdatePasswordRequest,onUpdateAccountTags:this.handleUpdateAccountTagsRequest,onTogglePushNotifications:this.toggleFCMToken,onToggleMessageSounds:this.handleToggleMessageSounds,onToggleIncognitoMode:this.handleToggleIncognitoMode,onCredAdd:this.handleCredAdd,onCredDelete:this.handleCredDelete,onCredConfirm:this.handleCredConfirm,onTopicSelected:this.handleTopicSelected,onCreateTopic:this.handleStartTopicRequest,onLogout:this.handleLogout,onDeleteAccount:this.handleDeleteAccount,onShowAlert:this.handleShowAlert,onCancel:this.handleSidepanelCancel,onError:this.handleError,onValidateCredentials:this.handleValidateCredentialsRequest,onPasswordResetRequest:this.handlePasswordResetRequest,onResetPassword:this.handleResetPassword,onShowArchive:this.handleShowArchive,onShowBlocked:this.handleShowBlocked,onShowCountrySelector:this.handleShowCountrySelector,onInitFind:this.tnInitFind,searchResults:this.state.searchResults,onSearchContacts:this.handleSearchContacts,showContextMenu:this.handleShowContextMenu}),t().createElement(Xs,{tinode:this.tinode,connected:this.state.connected,ready:this.state.ready,online:this.state.topicSelectedOnline,acs:this.state.topicSelectedAcs,displayMobile:this.state.displayMobile,viewportWidth:this.state.viewportWidth,viewportHeight:this.state.viewportHeight,hideSelf:this.state.displayMobile&&("topic-view"!==this.state.mobilePanel||this.state.infoPanel),topic:this.state.topicSelected,myUserId:this.state.myUserId,myUserName:this.state.sidePanelTitle,serverVersion:this.state.serverVersion,serverAddress:this.state.serverAddress,applicationVisible:this.state.applicationVisible,forwardMessage:this.state.forwardMessage,onCancelForwardMessage:this.handleHideForwardDialog,callTopic:this.state.callTopic,callSeq:this.state.callSeq,callState:this.state.callState,callAudioOnly:this.state.callAudioOnly,onCallHangup:this.handleCallHangup,onCallInvite:this.handleCallInvite,onCallSendOffer:this.handleCallSendOffer,onCallIceCandidate:this.handleCallIceCandidate,onCallSendAnswer:this.handleCallSendAnswer,errorText:this.state.errorText,errorLevel:this.state.errorLevel,errorAction:this.state.errorAction,errorActionText:this.state.errorActionText,newTopicParams:this.state.newTopicParams,onHideMessagesView:this.handleHideMessagesView,onError:this.handleError,onNewTopicCreated:this.handleNewTopicCreated,showContextMenu:this.handleShowContextMenu,onChangePermissions:this.handleChangePermissions,onNewChat:this.handleNewChatInvitation,sendMessage:this.handleSendMessage,onVideoCallClosed:this.handleCallClose}),this.state.infoPanel?t().createElement(gs,{tinode:this.tinode,connected:this.state.connected,displayMobile:this.state.displayMobile,topic:this.state.topicSelected,searchableContacts:this.state.searchableContacts,myUserId:this.state.myUserId,panel:this.state.infoPanel,errorText:this.state.errorText,errorLevel:this.state.errorLevel,errorAction:this.state.errorAction,errorActionText:this.state.errorActionText,onNavigate:this.infoNavigator,onTopicDescUpdateRequest:this.handleTopicUpdateRequest,onShowAlert:this.handleShowAlert,onChangePermissions:this.handleChangePermissions,onMemberUpdateRequest:this.handleMemberUpdateRequest,onDeleteTopic:this.handleDeleteTopicRequest,onDeleteMessages:this.handleDeleteMessagesRequest,onLeaveTopic:this.handleLeaveUnsubRequest,onBlockTopic:this.handleBlockTopicRequest,onReportTopic:this.handleReportTopic,onAddMember:this.handleManageGroupMembers,onTopicTagsUpdateRequest:this.handleTagsUpdateRequest,onTopicUnArchive:this.handleUnarchive,onInitFind:this.tnInitFind,onError:this.handleError,showContextMenu:this.handleShowContextMenu}):null)}}const Vn=(0,s.injectIntl)(Hn);if(FIREBASE_INIT&&FIREBASE_INIT.measurementId){const Xn=document.getElementsByTagName("head")[0];let Qn=document.createElement("script");function Jn(){dataLayer.push(arguments)}Qn.src="https://www.googletagmanager.com/gtag/js?id="+FIREBASE_INIT.measurementId,Qn.async=!0,Xn.prepend(Qn),window.dataLayer=window.dataLayer||[],Jn("js",new Date),Jn("config",FIREBASE_INIT.measurementId)}const qn={de:e=>r.e(92).then(r.t.bind(r,6092,19)),en:e=>r.e(514).then(r.t.bind(r,4514,19)),es:e=>r.e(932).then(r.t.bind(r,9932,19)),fr:e=>r.e(107).then(r.t.bind(r,107,19)),ko:e=>r.e(898).then(r.t.bind(r,898,19)),ro:e=>r.e(817).then(r.t.bind(r,4817,19)),ru:e=>r.e(734).then(r.t.bind(r,3734,19)),zh:e=>r.e(700).then(r.t.bind(r,5700,19)),"zh-TW":e=>r.e(226).then(r.t.bind(r,5226,19))},{params:Gn}=Gs.parseUrlHash(window.location.hash),Wn=Gn&&Gn.hl||navigator.languages&&navigator.languages[0]||navigator.language||navigator.userLanguage||"en",Kn=Wn.replace("_","-"),zn=Kn.split("-")[0].toLowerCase(),Zn=qn[Kn]?Wn:qn[zn]?zn:"en";document.getElementsByTagName("html")[0].setAttribute("lang",Zn);const Yn=(0,a.s)(document.getElementById("mountPoint"));qn[Zn]().then((e=>Yn.render(t().createElement(s.IntlProvider,{locale:Wn,messages:e,textComponent:t().Fragment},t().createElement(Vn,null)))))})()})();
//# sourceMappingURL=index.prod.js.map
\ No newline at end of file
diff --git a/umd/index.prod.js.map b/umd/index.prod.js.map
index 475e3d03..8721adf8 100644
--- a/umd/index.prod.js.map
+++ b/umd/index.prod.js.map
@@ -1 +1 @@
-{"version":3,"file":"index.prod.js","mappings":"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","sources":["webpack://tinode-webapp/webpack/runtime/create fake namespace object","webpack://tinode-webapp/webpack/runtime/load script","webpack://tinode-webapp/./src/config.js","webpack://tinode-webapp/./src/lib/blob-helpers.js","webpack://tinode-webapp/./src/lib/strformat.js","webpack://tinode-webapp/./src/version.js","webpack://tinode-webapp/./src/widgets/audio-player.jsx","webpack://tinode-webapp/./node_modules/react-dom/client.js","webpack://tinode-webapp/external var \"React\"","webpack://tinode-webapp/external var \"ReactDOM\"","webpack://tinode-webapp/external var \"ReactIntl\"","webpack://tinode-webapp/webpack/bootstrap","webpack://tinode-webapp/webpack/runtime/compat get default export","webpack://tinode-webapp/webpack/runtime/define property getters","webpack://tinode-webapp/webpack/runtime/ensure chunk","webpack://tinode-webapp/webpack/runtime/get javascript chunk filename","webpack://tinode-webapp/webpack/runtime/global","webpack://tinode-webapp/webpack/runtime/hasOwnProperty shorthand","webpack://tinode-webapp/webpack/runtime/make namespace object","webpack://tinode-webapp/webpack/runtime/publicPath","webpack://tinode-webapp/webpack/runtime/jsonp chunk loading","webpack://tinode-webapp/./node_modules/@firebase/util/dist/index.esm2017.js","webpack://tinode-webapp/./node_modules/@firebase/component/dist/esm/index.esm2017.js","webpack://tinode-webapp/./node_modules/@firebase/logger/dist/esm/index.esm2017.js","webpack://tinode-webapp/./node_modules/idb/build/wrap-idb-value.js","webpack://tinode-webapp/./node_modules/idb/build/index.js","webpack://tinode-webapp/./node_modules/@firebase/app/dist/esm/index.esm2017.js","webpack://tinode-webapp/./node_modules/firebase/app/dist/esm/index.esm.js","webpack://tinode-webapp/./node_modules/@firebase/installations/dist/esm/index.esm2017.js","webpack://tinode-webapp/./node_modules/@firebase/messaging/dist/esm/index.esm2017.js","webpack://tinode-webapp/external var \"Tinode\"","webpack://tinode-webapp/./src/widgets/alert.jsx","webpack://tinode-webapp/./src/widgets/context-menu.jsx","webpack://tinode-webapp/./src/widgets/contact-badges.jsx","webpack://tinode-webapp/./src/lib/utils.js","webpack://tinode-webapp/./src/widgets/letter-tile.jsx","webpack://tinode-webapp/./src/widgets/unread-badge.jsx","webpack://tinode-webapp/./src/widgets/call-message.jsx","webpack://tinode-webapp/./src/widgets/call-status.jsx","webpack://tinode-webapp/./src/widgets/inline-video.jsx","webpack://tinode-webapp/./src/widgets/lazy-image.jsx","webpack://tinode-webapp/./src/widgets/file-progress.jsx","webpack://tinode-webapp/./src/widgets/uploading-image.jsx","webpack://tinode-webapp/./src/lib/formatters.js","webpack://tinode-webapp/./src/widgets/contact.jsx","webpack://tinode-webapp/./src/widgets/contact-action.jsx","webpack://tinode-webapp/./src/widgets/contact-list.jsx","webpack://tinode-webapp/./src/widgets/search-contacts.jsx","webpack://tinode-webapp/./src/widgets/forward-dialog.jsx","webpack://tinode-webapp/./src/widgets/badge-list.jsx","webpack://tinode-webapp/./src/constants.js","webpack://tinode-webapp/./src/widgets/call-incoming.jsx","webpack://tinode-webapp/./src/widgets/load-spinner.jsx","webpack://tinode-webapp/./src/widgets/avatar-upload.jsx","webpack://tinode-webapp/./src/widgets/checkbox.jsx","webpack://tinode-webapp/./src/widgets/menu-cancel.jsx","webpack://tinode-webapp/./src/widgets/error-panel.jsx","webpack://tinode-webapp/./src/widgets/chip.jsx","webpack://tinode-webapp/./src/widgets/chip-input.jsx","webpack://tinode-webapp/./src/widgets/group-manager.jsx","webpack://tinode-webapp/./src/widgets/permissions-editor.jsx","webpack://tinode-webapp/./src/widgets/cropper.jsx","webpack://tinode-webapp/./src/widgets/avatar-crop.jsx","webpack://tinode-webapp/./src/widgets/visible-password.jsx","webpack://tinode-webapp/./src/widgets/in-place-edit.jsx","webpack://tinode-webapp/./src/widgets/tag-manager.jsx","webpack://tinode-webapp/./src/widgets/topic-desc-edit.jsx","webpack://tinode-webapp/./src/widgets/topic-common.jsx","webpack://tinode-webapp/./src/widgets/topic-security.jsx","webpack://tinode-webapp/./src/views/info-view.jsx","webpack://tinode-webapp/./src/widgets/call-panel.jsx","webpack://tinode-webapp/./src/widgets/attachment.jsx","webpack://tinode-webapp/./src/widgets/received-marker.jsx","webpack://tinode-webapp/./src/widgets/chat-message.jsx","webpack://tinode-webapp/./src/widgets/send-message.jsx","webpack://tinode-webapp/./src/widgets/doc-preview.jsx","webpack://tinode-webapp/./src/widgets/group-subs.jsx","webpack://tinode-webapp/./src/widgets/image-preview.jsx","webpack://tinode-webapp/./src/widgets/invitation.jsx","webpack://tinode-webapp/./src/views/logo-view.jsx","webpack://tinode-webapp/./src/widgets/meta-message.jsx","webpack://tinode-webapp/./src/widgets/video-preview.jsx","webpack://tinode-webapp/./src/lib/navigation.js","webpack://tinode-webapp/./src/views/messages-view.jsx","webpack://tinode-webapp/./src/widgets/button-back.jsx","webpack://tinode-webapp/./src/widgets/menu-contacts.jsx","webpack://tinode-webapp/./src/widgets/menu-start.jsx","webpack://tinode-webapp/./src/widgets/side-navbar.jsx","webpack://tinode-webapp/./src/views/account-settings-view.jsx","webpack://tinode-webapp/./src/views/contacts-view.jsx","webpack://tinode-webapp/./src/lib/local-storage.js","webpack://tinode-webapp/./src/views/create-account-view.jsx","webpack://tinode-webapp/./src/views/acc-notifications-view.jsx","webpack://tinode-webapp/./src/views/acc-security-view.jsx","webpack://tinode-webapp/./src/views/acc-support-view.jsx","webpack://tinode-webapp/./src/views/login-view.jsx","webpack://tinode-webapp/./src/widgets/new-topic-by-id.jsx","webpack://tinode-webapp/./src/widgets/new-topic-group.jsx","webpack://tinode-webapp/./src/views/new-topic-view.jsx","webpack://tinode-webapp/./src/views/password-reset-view.jsx","webpack://tinode-webapp/./src/widgets/host-selector.jsx","webpack://tinode-webapp/./src/views/settings-view.jsx","webpack://tinode-webapp/./src/views/validation-view.jsx","webpack://tinode-webapp/./src/views/sidepanel-view.jsx","webpack://tinode-webapp/./src/lib/host-name.js","webpack://tinode-webapp/./src/views/tinode-web.jsx","webpack://tinode-webapp/./src/index.js"],"sourcesContent":["var getProto = Object.getPrototypeOf ? (obj) => (Object.getPrototypeOf(obj)) : (obj) => (obj.__proto__);\nvar leafPrototypes;\n// create a fake namespace object\n// mode & 1: value is a module id, require it\n// mode & 2: merge all properties of value into the ns\n// mode & 4: return value when already ns object\n// mode & 16: return value when it's Promise-like\n// mode & 8|1: behave like require\n__webpack_require__.t = function(value, mode) {\n\tif(mode & 1) value = this(value);\n\tif(mode & 8) return value;\n\tif(typeof value === 'object' && value) {\n\t\tif((mode & 4) && value.__esModule) return value;\n\t\tif((mode & 16) && typeof value.then === 'function') return value;\n\t}\n\tvar ns = Object.create(null);\n\t__webpack_require__.r(ns);\n\tvar def = {};\n\tleafPrototypes = leafPrototypes || [null, getProto({}), getProto([]), getProto(getProto)];\n\tfor(var current = mode & 2 && value; typeof current == 'object' && !~leafPrototypes.indexOf(current); current = getProto(current)) {\n\t\tObject.getOwnPropertyNames(current).forEach((key) => (def[key] = () => (value[key])));\n\t}\n\tdef['default'] = () => (value);\n\t__webpack_require__.d(ns, def);\n\treturn ns;\n};","var inProgress = {};\nvar dataWebpackPrefix = \"tinode-webapp:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = (url, done, key, chunkId) => {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tscript.timeout = 120;\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = (prev, event) => {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach((fn) => (fn(event)));\n\t\tif(prev) return prev(event);\n\t};\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","import { PACKAGE_VERSION } from './version.js';\n\n// Name of this application, used in the User-Agent.\nexport const APP_NAME = 'TinodeWeb/' + (PACKAGE_VERSION || '0.21');\n\n// API key. Use https://github.com/tinode/chat/tree/master/keygen to generate your own\nexport const API_KEY = 'AQEAAAABAAD_rAp4DJh05a1HAwFT3A6K';\n\n// The array of possible hosts to connect to.\nexport const KNOWN_HOSTS = {hosted: 'web.tinode.co', local: 'localhost:6060'};\n\n// Default host name and port to connect to.\nexport const DEFAULT_HOST = KNOWN_HOSTS.hosted;\n\n// Enable console logging.\nexport const LOGGING_ENABLED = true;\n\n// Minimum time between two keypress notifications, milliseconds.\nexport const KEYPRESS_DELAY = 3_000;\n// Delay before sending a read notification, milliseconds.\nexport const READ_DELAY = 1_500;\n\n// The default shortest allowed tag length. Matches the value on the server.\nexport const MIN_TAG_LENGTH = 2;\n// The default greatest allowed tag length. Matches the value on the server.\nexport const MAX_TAG_LENGTH = 96;\n// The default maximum number of tags allowed. Matches the value on the server.\nexport const MAX_TAG_COUNT = 16;\n\n// Access mode for P2P subscriptions initiated by the current user.\nexport const DEFAULT_P2P_ACCESS_MODE = 'JRWPS';\n// Access mode for new group topics created by the current user.\nexport const NEW_GRP_ACCESS_MODE = 'JRWPSAO';\n// Access mode for a channel.\nexport const CHANNEL_ACCESS_MODE = 'JR';\n\n// Access mode for no access.\nexport const NO_ACCESS_MODE = 'N';\n\n// Mediaquery breakpoint between desktop and mobile, in px. Should match the value\n// in @media (max-size: 640px) in base.css\nexport const MEDIA_BREAKPOINT = 640;\n// Size of css 'rem' unit in pixels. Default 1rem = 10pt = 13px.\nexport const REM_SIZE = 13;\n\n// Size of the avatar image: when image dimensions are greater or the image is not square, it's resized to\n// a square of this size or less.\nexport const AVATAR_SIZE = 384;\n\n// Maximum size of an avatar in bytes for sending in-band. Bigger avatars will be sent out of band (as uploads).\nexport const MAX_AVATAR_BYTES = 4096;\n\n// Size of the broken_image shown in MessagesView\nexport const BROKEN_IMAGE_SIZE = 32;\n\n// Size of video preview when dimensions are missing.\nexport const NO_DIMENSIONS_VIDEO = 128;\n\n// Number of chat messages to fetch in one call.\nexport const MESSAGES_PAGE = 24;\n\n// Default maximum in-band (included directly into the message) attachment size which fits into\n// a message of 256K in size. Used when the server-provided value is unavailable. The actual\n// binary size of the attachment should be smaller due to base64 encoding expansion and some overhead,\n// for instance 1024 bytes.\n// Increase this limit to a greater value in production, if desired. Also increase\n// max_message_size in the server config.\nexport const MAX_INBAND_ATTACHMENT_SIZE = 262_144;\n\n// Default absolute maximum attachment size to be used with the server = 8MB.\n// Used when the server-provided value is unavailable. Increase to something like 100MB in production.\nexport const MAX_EXTERN_ATTACHMENT_SIZE = 1 << 23;\n\n// Maximum allowed linear dimension (pixels) of an image sent inline. Larger images will be shrunk\n// to make the larger dimension fit under this size. You may want to adjust it to 1600 or\n// 2400 for production.\nexport const MAX_IMAGE_DIM = 1024;\n\n// Linear dimensions of image preview: shrink image under this size for previews.\nexport const IMAGE_PREVIEW_DIM = 64;\n\n// Linear dimensions of video screencapture: shrink image under this size for previews.\nexport const VIDEO_PREVIEW_DIM = 96;\n\n// Linear dimensions of image thumbnail: shrink image under this size for thumbnails in reply quote previews.\nexport const IMAGE_THUMBNAIL_DIM = 36;\n// Width of video thumbnail: allow it to be wider, but not taller. Use IMAGE_THUMBNAIL_DIM for height.\nexport const VIDEO_THUMBNAIL_WIDTH = 48;\n\n// Maximum number of online users to be shown in a topic title bar. Others will be\n// hidden under \"+X more\"\nexport const MAX_ONLINE_IN_TOPIC = 4;\n\n// Maximum length of user name, topic title, and private comment.\nexport const MAX_TITLE_LENGTH = 60;\n// Maximum length of topic description.\nexport const MAX_TOPIC_DESCRIPTION_LENGTH = 360;\n// Maximum length of user name when displaying a video call.\nexport const MAX_PEER_TITLE_LENGTH = 20;\n\n// Length of message previews in chat list, in characters.\nexport const MESSAGE_PREVIEW_LENGTH = 80;\n\n// Length of a quote in quoted reply (for outgoing messages).\nexport const QUOTED_REPLY_LENGTH = 30;\n// Length of a preview of a forwarded message.\nexport const FORWARDED_PREVIEW_LENGTH = 84;\n// Length of preview for a message being edited.\nexport const EDIT_PREVIEW_LENGTH = 48;\n\n// Minimum duration of an audio recording in milliseconds (2 sec).\nexport const MIN_DURATION = 2_000;\n// Maximum duration of an audio recording in milliseconds (10 min).\nexport const MAX_DURATION = 600_000;\n\n// Link for \"Contact Us\".\nexport const LINK_CONTACT_US = 'mailto:support@tinode.co';\n\n// Link to Privacy Policy.\nexport const LINK_PRIVACY_POLICY = 'https://tinode.co/privacy.html';\n\n// Link to Terms of Service.\nexport const LINK_TERMS_OF_SERVICE = 'https://tinode.co/terms.html';\n\n","// File and image helper functions.\n\n// Supported image MIME types and corresponding file extensions.\nexport const SUPPORTED_IMAGE_FORMATS = ['image/jpeg', 'image/gif', 'image/png', 'image/svg', 'image/svg+xml'];\nexport const MIME_EXTENSIONS = ['jpg', 'gif', 'png', 'svg', 'svg'];\n\n// Get an URL from a theCard photo: either create a data: URL or return reference URL.\nexport function makeImageUrl(photo) {\n if (photo && typeof photo == 'object') {\n if (photo.ref) {\n return photo.ref\n }\n if (photo.data && photo.type) {\n const mime = photo.type.startsWith('image/') ? photo.type : ('image/' + photo.type);\n return 'data:' + mime + ';base64,' + photo.data;\n }\n }\n return null;\n}\n\n// Calculate linear dimensions for scaling image down to fit under a certain size.\n// Returns an object which contains destination sizes, source sizes, and offsets\n// into source (when making square images).\nexport function fitImageSize(width, height, maxWidth, maxHeight, forceSquare) {\n // Sanitize input\n width = width | 0;\n height = height | 0;\n maxWidth = maxWidth | 0;\n maxHeight = maxHeight | 0;\n\n if (width <= 0 || height <= 0 || maxWidth <= 0 || maxHeight <= 0) {\n return null;\n }\n\n if (forceSquare) {\n maxWidth = maxHeight = Math.min(maxWidth, maxHeight);\n }\n\n const scale = Math.min(\n Math.min(width, maxWidth) / width,\n Math.min(height, maxHeight) / height\n );\n\n const size = {\n dstWidth: (width * scale) | 0,\n dstHeight: (height * scale) | 0,\n };\n\n if (forceSquare) {\n // Also calculate parameters for making the image square.\n size.dstWidth = size.dstHeight = Math.min(size.dstWidth, size.dstHeight);\n size.srcWidth = size.srcHeight = Math.min(width, height);\n size.xoffset = ((width - size.srcWidth) / 2) | 0;\n size.yoffset = ((height - size.srcWidth) / 2) | 0;\n } else {\n size.xoffset = size.yoffset = 0;\n size.srcWidth = width;\n size.srcHeight = height;\n }\n return size;\n}\n\n// Ensure file's extension matches mime content type\nexport function fileNameForMime(fname, mime) {\n const idx = SUPPORTED_IMAGE_FORMATS.indexOf(mime);\n if (idx < 0 || !fname) {\n // Unknown mime or empty name.\n return fname;\n }\n const ext = MIME_EXTENSIONS[idx];\n\n const at = fname.lastIndexOf('.');\n if (at >= 0) {\n fname = fname.substring(0, at);\n }\n return fname + '.' + ext;\n}\n\n// Scale uploaded image to fit under certain dimensions and byte size, optionally constraining to a square.\n// Returns a promise which is resolven on success or rejected on failure.\nexport function imageScaled(fileOrBlob, maxWidth, maxHeight, maxSize, forceSquare) {\n return new Promise((resolve, reject) => {\n const img = new Image();\n img.crossOrigin = 'Anonymous';\n img.onerror = function(err) {\n reject(new Error(\"Image format unrecognized\"));\n }\n img.onload = async function() {\n // Once the image is loaded, the URL is no longer needed.\n URL.revokeObjectURL(img.src);\n\n // Calculate the desired image dimensions.\n const dim = fitImageSize(img.width, img.height, maxWidth, maxHeight, forceSquare);\n if (!dim) {\n reject(new Error(\"Invalid image\"));\n return;\n }\n let canvas = document.createElement('canvas');\n canvas.width = dim.dstWidth;\n canvas.height = dim.dstHeight;\n let ctx = canvas.getContext('2d');\n ctx.imageSmoothingEnabled = true;\n ctx.drawImage(img, dim.xoffset, dim.yoffset, dim.srcWidth, dim.srcHeight,\n 0, 0, dim.dstWidth, dim.dstHeight);\n\n const mime = SUPPORTED_IMAGE_FORMATS.includes(fileOrBlob.type) ? fileOrBlob.type : 'image/jpeg';\n // Generate blob to check size of the image.\n let blob = await new Promise(resolve => canvas.toBlob(resolve, mime));\n if (!blob) {\n reject(new Error(\"Unsupported image format\"));\n return;\n }\n // Ensure the image is not too large. Shrink the image keeping the aspect ratio.\n // Do nothing if maxsize is <= 0.\n while (maxSize > 0 && blob.length > maxSize) {\n dim.dstWidth = (dim.dstWidth * 0.70710678118) | 0;\n dim.dstHeight = (dim.dstHeight * 0.70710678118) | 0;\n canvas.width = dim.dstWidth;\n canvas.height = dim.dstHeight;\n ctx = canvas.getContext('2d');\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n ctx.drawImage(img, dim.xoffset, dim.yoffset, dim.srcWidth, dim.srcHeight,\n 0, 0, dim.dstWidth, dim.dstHeight);\n blob = await new Promise(resolve => canvas.toBlob(resolve, mime));\n }\n\n canvas = null;\n resolve({mime: mime, blob: blob, width: dim.dstWidth, height: dim.dstHeight, name: fileNameForMime(fileOrBlob.name, mime)});\n };\n img.src = URL.createObjectURL(fileOrBlob);\n });\n}\n\n// Scale and crop image according to specified dimensions.\n// The coordinates are in unscaled image pixels, i.e. cut the rectangle first then scale it.\n// returns a promise.\nexport function imageCrop(mime, objURL, left, top, width, height, scale) {\n return new Promise((resolve, reject) => {\n const img = new Image();\n img.crossOrigin = 'Anonymous';\n img.onerror = _ => {\n reject(new Error(\"Image format unrecognized\"));\n };\n img.onload = _ => {\n // Once the image is loaded, the URL is no longer needed.\n URL.revokeObjectURL(img.src);\n\n let canvas = document.createElement('canvas');\n canvas.width = width * scale;\n canvas.height = height * scale;\n let ctx = canvas.getContext('2d');\n ctx.imageSmoothingEnabled = true;\n ctx.drawImage(img, left, top, width, height, 0, 0, canvas.width, canvas.height);\n\n mime = SUPPORTED_IMAGE_FORMATS.includes(mime) ? mime : 'image/jpeg';\n // Generate blob to check size of the image.\n canvas.toBlob((blob) => {\n // Allow GC.\n canvas = null;\n if (blob) {\n resolve({mime: mime, blob: blob, width: width, height: height});\n } else {\n reject(new Error(\"Unsupported image format\"));\n }\n }, mime);\n };\n img.src = objURL;\n });\n}\n\n// Convert file to base64 string.\nexport function fileToBase64(file) {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onerror = _ => {\n reject(reader.error);\n };\n reader.onload = _ => {\n resolve({mime: file.type, bits: reader.result.split(',')[1], name: file.name});\n };\n reader.readAsDataURL(file);\n });\n}\n\n// Convert Blob to base64 string. Returns a promise resolved with the base64 string and mime.\nexport function blobToBase64(blob) {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onerror = _ => {\n reject(reader.error);\n };\n reader.onload = _ => {\n resolve({mime: blob.type, bits: reader.result.split(',')[1]});\n };\n reader.readAsDataURL(blob);\n });\n}\n\n// File pasted from the clipboard. It's either an inline image or a file attachment.\nexport function filePasted(event, onImageSuccess, onAttachmentSuccess, onError) {\n const items = (event.clipboardData || event.originalEvent.clipboardData || {}).items;\n if (!items || !items.length) {\n return false;\n }\n\n for (let i in items) {\n const item = items[i];\n if (item.kind === 'file') {\n const file = item.getAsFile();\n if (!file) {\n console.error(\"Failed to get file object from pasted file item\", item.kind, item.type);\n onError(\"Failed to get file object from pasted file item\");\n continue;\n }\n if (file.type && file.type.split('/')[0] == 'image') {\n onImageSuccess(file);\n } else {\n onAttachmentSuccess(file);\n }\n // Indicate that the pasted data contains a file.\n return true;\n }\n }\n // No file found.\n return false;\n}\n\n// Get mime type from data URL header.\nexport function getMimeType(header) {\n var mime = /^data:(image\\/[-+a-z0-9.]+);base64/.exec(header);\n return (mime && mime.length > 1) ? mime[1] : null;\n}\n\n// Given length of a binary object in bytes, calculate the length after\n// base64 encoding.\nexport function base64EncodedLen(n) {\n return Math.floor((n + 2) / 3) * 4;\n}\n\n// Given length of a base64-encoded object, calculate decoded size of the\n// pbject in bytes.\nexport function base64DecodedLen(n) {\n return Math.floor(n / 4) * 3;\n}\n\n// Re-encode string to standard base64 encoding with padding.\n// The string may be base64-URL encoded without the padding.\nexport function base64ReEncode(str) {\n if (str) {\n str = str.replace(/-/g, '+').replace(/_/g, '/');\n try {\n str = btoa(atob(str));\n } catch(err) {\n console.error(\"Failed to base64 re-encode string.\", err);\n str = null;\n }\n }\n return str;\n}\n\n// Convert a base64 encoded string with the provided mime type into a Blob.\nexport function base64ToBlob(str, mime) {\n if (!str) {\n return null;\n }\n\n try {\n // Make blob.\n const bin = atob(str);\n const length = bin.length;\n const buf = new ArrayBuffer(length);\n const arr = new Uint8Array(buf);\n for (let i = 0; i < length; i++) {\n arr[i] = bin.charCodeAt(i);\n }\n\n return new Blob([buf], { type: mime });\n } catch(err) {\n console.error(\"Failed to convert base64 to blob: \", err);\n }\n\n return null;\n}\n\nexport function intArrayToBase64(arr) {\n if (!Array.isArray(arr)) {\n return null;\n }\n try {\n let bin = '';\n new Uint8Array(arr).forEach(b => bin += String.fromCharCode(b));\n return window.btoa(bin);\n } catch (err) {}\n return null;\n}\n\nexport function base64ToIntArray(b64) {\n const arr = [];\n try {\n const bin = window.atob(b64);\n [...bin].forEach(c => {\n arr.push(c.charCodeAt(0));\n });\n return arr;\n } catch (err) {}\n return null;\n}\n","// Short representation of time in the past.\nexport function shortDateFormat(then, locale) {\n locale = locale || window.navigator.userLanguage || window.navigator.language;\n const now = new Date();\n if (then.getFullYear() == now.getFullYear()) {\n // Same year.\n if (then.getMonth() == now.getMonth() && then.getDate() == now.getDate()) {\n // Same month and day, show time only.\n return then.toLocaleTimeString(locale, {hour12: false, hour: '2-digit', minute: '2-digit'});\n }\n // Different month and/or day, show month day, time.\n return then.toLocaleDateString(locale,\n {hour12: false, month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit'});\n }\n // Different year: just show the date.\n return then.toLocaleDateString(locale, {year: 'numeric', month: 'short', day: 'numeric'});\n}\n\n// Representation a date relative to now.\nexport function relativeDateFormat(then, locale) {\n locale = locale || window.navigator.userLanguage || window.navigator.language;\n const now = new Date();\n const thenDays = Math.floor((then.getTime() - then.getTimezoneOffset() * 60_000) / 86_400_000);\n const nowDays = Math.floor((now.getTime() - now.getTimezoneOffset() * 60_000) / 86_400_000);\n const diff = thenDays - nowDays;\n if (Math.abs(diff) < 2) {\n // Today or yesterday.\n return new Intl.RelativeTimeFormat(locale, { numeric: 'auto' }).format(diff, 'day')\n }\n // More than two days: just show the date.\n return new Intl.DateTimeFormat(locale).format(then);\n}\n\n// Convert seconds to [hours:]minutes:seconds, i.e. 156 sec -> 2:36, 3756 sec -> 1:02:36.\n// If fixedMins is true, then minutes are represented by at least two digits.\nexport function secondsToTime(seconds, fixedMin) {\n if (typeof seconds != 'number') {\n return '';\n }\n\n let min = (Math.floor(seconds / 60) | 0) % 60;\n let hours = Math.floor(seconds / 36000) | 0;\n\n if (fixedMin || hours > 0) {\n min = min < 10 ? `0${min}` : min;\n }\n let sec = (seconds | 0) % 60;\n sec = sec < 10 ? `0${sec}` : sec;\n if (hours == 0) {\n return `${min}:${sec}`;\n }\n return `${hours}:${min}:${sec}`;\n}\n\n// Convert a number of bytes to human-readable format.\nexport function bytesToHumanSize(bytes) {\n if (!bytes || bytes == 0) {\n return '0 Bytes';\n }\n\n const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB'];\n const bucket = Math.min(Math.floor(Math.log2(bytes) / 10) | 0, sizes.length-1);\n const count = bytes / Math.pow(1024, bucket);\n const round = bucket > 0 ? (count < 3 ? 2 : (count < 30 ? 1 : 0)) : 0;\n return count.toFixed(round) + ' ' + sizes[bucket];\n}\n\n// Shorten a file name to be under maxLength by clipping out the middle.\nexport function shortenFileName(filename, maxLength) {\n if (typeof filename != 'string') {\n return filename;\n }\n return filename.length > maxLength ?\n filename.slice(0, maxLength/2 - 1) + '…' + filename.slice(1 - maxLength/2) : filename;\n}\n\n// Get 32 bit integer hash value for a string. Ideally it should produce the same value\n// as Java's String#hash().\nfunction stringToColorHash(value) {\n let hash = 0;\n value = '' + value;\n for (let i = 0; i < value.length; i++) {\n hash = ((hash << 5) - hash) + value.charCodeAt(i);\n hash = hash & hash; // Convert to 32bit integer\n }\n return hash;\n}\n\n// User avatar letter color id.\nexport function letterTileColorId(userId) {\n return Math.abs(stringToColorHash(userId)) % 16;\n}\n\n// Converts user or topic ID to a CSS color class. Ideally it should produce the same color value as Java version.\n// params:\n// - {string} id: user or topic ID\n// - {boolean} light: light or dark version of the color.\n// - {boolean} fg: foreground (text) or background color.\nexport function idToColorClass(id, light, fg) {\n return (light ? 'lt-' : 'dk-') + (fg ? 'fg-' : 'bg-') + letterTileColorId(id);\n}\n\n// Takes ISO Alpha-2 country code, like 'US' and converts it to a flag emoji.\nexport function flagEmoji(countryCode) {\n const codePoints = countryCode\n .toUpperCase()\n .split('')\n .map(char => 0x1F1A5 + char.charCodeAt());\n return String.fromCodePoint(...codePoints);\n}\n","// This is a generated file. Don't edit.\n\nexport const PACKAGE_VERSION = \"0.21.0-rc2\";\n","// Audio recorder widget.\n\nimport React from 'react';\nimport { defineMessages, injectIntl } from 'react-intl';\n\nimport { secondsToTime } from '../lib/strformat';\nimport { base64ToIntArray } from '../lib/blob-helpers';\n\n// Make canvas bigger than the element size to reduce blurring.\nconst CANVAS_UPSCALING = 2.0;\n// Thickness of a visualization bar.\nconst LINE_WIDTH = 3 * CANVAS_UPSCALING;\n// Spacing between two visualization bars.\nconst SPACING = 2 * CANVAS_UPSCALING;\n// Color of histogram bars.\nconst BAR_COLOR = '#888A';\nconst BAR_COLOR_DARK = '#666C';\nconst THUMB_COLOR = '#444E';\n// Minimum number of amplitude bars to draw.\nconst MIN_PREVIEW_LENGTH = 16;\n\nconst messages = defineMessages({\n icon_title_play: {\n id: 'icon_title_play',\n defaultMessage: 'Play recording',\n description: 'Icon tool tip for starting audio playback'\n }\n});\n\nclass AudioPlayer extends React.PureComponent {\n constructor(props) {\n super(props);\n\n let preview = base64ToIntArray(this.props.preview);\n if (!Array.isArray(preview) || preview.length < MIN_PREVIEW_LENGTH) {\n preview = null;\n }\n\n this.state = {\n canPlay: false,\n playing: false,\n currentTime: '0:00',\n duration: this.props.duration > 0 ? secondsToTime(this.props.duration / 1000) : '-:--',\n longMin: this.props.duration >= 600000,\n preview: preview\n };\n\n this.initAudio = this.initAudio.bind(this);\n this.initCanvas = this.initCanvas.bind(this);\n this.resampleBars = this.resampleBars.bind(this);\n this.visualize = this.visualize.bind(this);\n\n this.handlePlay = this.handlePlay.bind(this);\n this.handleSeek = this.handleSeek.bind(this);\n this.handleError = this.handleError.bind(this);\n\n this.audioPlayer = null;\n\n this.viewBuffer = [];\n this.canvasRef = React.createRef();\n }\n\n componentDidMount() {\n if (this.props.src) {\n this.initAudio();\n }\n\n this.initCanvas();\n }\n\n componentWillUnmount() {\n if (this.audioPlayer) {\n this.audioPlayer.oncanplay = null;\n this.audioPlayer.ontimeupdate = null;\n this.audioPlayer.onended = null;\n this.audioPlayer.pause();\n this.audioPlayer = null;\n }\n }\n\n componentDidUpdate(prevProps) {\n if (this.props.src != prevProps.src) {\n this.initAudio();\n }\n\n if (this.props.preview != prevProps.preview) {\n let preview = base64ToIntArray(this.props.preview);\n if (!Array.isArray(preview) || preview.length < MIN_PREVIEW_LENGTH) {\n preview = null;\n }\n this.setState({preview: preview}, this.initCanvas);\n }\n }\n\n initAudio() {\n this.audioPlayer = new Audio(this.props.src);\n this.audioPlayer.oncanplay = _ => this.setState({canPlay: true});\n this.audioPlayer.ontimeupdate = _ => this.setState({\n currentTime: secondsToTime(this.audioPlayer.currentTime, this.state.longMin)\n });\n this.audioPlayer.onended = _ => {\n this.audioPlayer.currentTime = 0;\n this.setState({playing: false, currentTime: secondsToTime(0, this.state.longMin)})\n }\n }\n\n initCanvas() {\n // Force canvas aspect ratio to match one of the element + upscale canvas to reduce blurring.\n this.canvasRef.current.width = this.canvasRef.current.offsetWidth * CANVAS_UPSCALING;\n this.canvasRef.current.height = this.canvasRef.current.offsetHeight * CANVAS_UPSCALING;\n\n this.canvasContext = this.canvasRef.current.getContext('2d');\n this.canvasContext.lineCap = 'round';\n\n this.viewBuffer = this.resampleBars(this.state.preview);\n this.visualize();\n }\n\n // Draw amplitude of sound.\n visualize() {\n if (!this.canvasRef.current) {\n return;\n }\n\n const width = this.effectiveWidth;\n const height = this.canvasRef.current.height;\n\n this.canvasContext.lineWidth = LINE_WIDTH;\n\n const drawFrame = _ => {\n if (!this.canvasRef.current || !this.audioPlayer) {\n // The component is unmounted.\n return;\n }\n\n this.canvasContext.clearRect(0, 0, this.canvasRef.current.width, height);\n\n if (this.viewBuffer) {\n if (this.state.playing) {\n window.requestAnimationFrame(drawFrame);\n }\n\n // Current playback position.\n const thumbAt = this.props.duration ?\n Math.max(0, Math.min(this.audioPlayer.currentTime * 1000 / this.props.duration, 1)) * (width - LINE_WIDTH * 2) : -1;\n\n // Draw amplitude bars.\n this.canvasContext.beginPath();\n this.canvasContext.strokeStyle = BAR_COLOR_DARK;\n for (let i = 0; i < this.viewBuffer.length; i++) {\n let x = 1 + i * (LINE_WIDTH + SPACING) + LINE_WIDTH * 0.5;\n let y = this.viewBuffer[i] * height * 0.9;\n\n const color = x < thumbAt ? BAR_COLOR_DARK : BAR_COLOR;\n if (this.canvasContext.strokeStyle != color) {\n this.canvasContext.stroke();\n this.canvasContext.beginPath();\n this.canvasContext.strokeStyle = color;\n }\n\n this.canvasContext.moveTo(x, (height - y) * 0.5);\n this.canvasContext.lineTo(x, height * 0.5 + y * 0.5);\n }\n // Actually draw the bars on canvas.\n this.canvasContext.stroke();\n\n // Draw thumb.\n if (this.props.duration) {\n this.canvasContext.beginPath();\n this.canvasContext.arc(thumbAt + LINE_WIDTH * 2, height * 0.5, LINE_WIDTH * 2, 0, 2 * Math.PI);\n this.canvasContext.fillStyle = THUMB_COLOR;\n this.canvasContext.fill();\n }\n }\n }\n\n drawFrame();\n }\n\n // Quick and dirty downsampling of the original preview bars into a smaller (or equal) number of bars we can display here.\n resampleBars(original) {\n const dstCount = ((this.canvasRef.current.width - SPACING) / (LINE_WIDTH + SPACING)) | 0;\n // Remove extra padding on the right due to fractional bar which is not drawn.\n this.effectiveWidth = dstCount * (LINE_WIDTH + SPACING) + SPACING;\n\n if (!Array.isArray(original) || original.length == 0) {\n return Array.apply(null, Array(dstCount)).map(_ => 0.01);\n }\n\n const factor = original.length / dstCount;\n let amps = [];\n let maxAmp = -1;\n for (let i=0; i 0) {\n return amps.map(a => a / maxAmp);\n }\n return Array.apply(null, Array(dstCount)).map(_ => 0.01);\n }\n\n handlePlay(e) {\n e.preventDefault();\n if (!this.state.canPlay) {\n return;\n }\n if (this.state.playing) {\n this.audioPlayer.pause();\n this.setState({playing: false});\n } else {\n this.audioPlayer.play();\n this.setState({playing: true}, this.visualize);\n }\n }\n\n handleError(err) {\n console.error(err);\n }\n\n handleSeek(e) {\n e.preventDefault();\n if (e.target && this.props.duration) {\n const rect = e.target.getBoundingClientRect();\n const offset = (e.clientX - rect.left) / this.effectiveWidth * CANVAS_UPSCALING;\n this.audioPlayer.currentTime = this.props.duration * offset / 1000;\n this.setState({currentTime: secondsToTime(this.audioPlayer.currentTime, this.state.longMin)});\n if (!this.state.playing) {\n this.visualize();\n }\n }\n }\n\n render() {\n const playClass = 'material-icons' +\n (this.props.short ? '' : ' large') +\n (this.state.canPlay ? '' : ' disabled');\n const play = (\n {this.state.playing ? 'pause_circle' :\n (this.state.canPlay ? 'play_circle' : 'not_interested')} \n );\n return ({this.props.short ?\n <>\n
\n {play}\n >\n :\n <>\n {play}\n
\n
\n
{this.state.currentTime}/{this.state.duration}
\n
\n >\n }\n
);\n }\n}\n\nexport default injectIntl(AudioPlayer);\n","'use strict';\n\nvar m = require('react-dom');\nif (process.env.NODE_ENV === 'production') {\n exports.createRoot = m.createRoot;\n exports.hydrateRoot = m.hydrateRoot;\n} else {\n var i = m.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;\n exports.createRoot = function(c, o) {\n i.usingClientEntryPoint = true;\n try {\n return m.createRoot(c, o);\n } finally {\n i.usingClientEntryPoint = false;\n }\n };\n exports.hydrateRoot = function(c, h, o) {\n i.usingClientEntryPoint = true;\n try {\n return m.hydrateRoot(c, h, o);\n } finally {\n i.usingClientEntryPoint = false;\n }\n };\n}\n","module.exports = React;","module.exports = ReactDOM;","module.exports = ReactIntl;","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"\" + chunkId + \".prod.js\";\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.p = \"/umd/\";","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t826: 0\n};\n\n__webpack_require__.f.j = (chunkId, promises) => {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\n\t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n\t\t\t// a Promise means \"currently loading\".\n\t\t\tif(installedChunkData) {\n\t\t\t\tpromises.push(installedChunkData[2]);\n\t\t\t} else {\n\t\t\t\tif(true) { // all chunks have JS\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise((resolve, reject) => (installedChunkData = installedChunks[chunkId] = [resolve, reject]));\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = (event) => {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t} else installedChunks[chunkId] = 0;\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n// no on chunks loaded\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\n}\n\nvar chunkLoadingGlobal = globalThis[\"webpackChunktinode_webapp\"] = globalThis[\"webpackChunktinode_webapp\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * @fileoverview Firebase constants. Some of these (@defines) can be overridden at compile-time.\r\n */\r\nconst CONSTANTS = {\r\n /**\r\n * @define {boolean} Whether this is the client Node.js SDK.\r\n */\r\n NODE_CLIENT: false,\r\n /**\r\n * @define {boolean} Whether this is the Admin Node.js SDK.\r\n */\r\n NODE_ADMIN: false,\r\n /**\r\n * Firebase SDK Version\r\n */\r\n SDK_VERSION: '${JSCORE_VERSION}'\r\n};\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Throws an error if the provided assertion is falsy\r\n */\r\nconst assert = function (assertion, message) {\r\n if (!assertion) {\r\n throw assertionError(message);\r\n }\r\n};\r\n/**\r\n * Returns an Error object suitable for throwing.\r\n */\r\nconst assertionError = function (message) {\r\n return new Error('Firebase Database (' +\r\n CONSTANTS.SDK_VERSION +\r\n ') INTERNAL ASSERT FAILED: ' +\r\n message);\r\n};\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst stringToByteArray$1 = function (str) {\r\n // TODO(user): Use native implementations if/when available\r\n const out = [];\r\n let p = 0;\r\n for (let i = 0; i < str.length; i++) {\r\n let c = str.charCodeAt(i);\r\n if (c < 128) {\r\n out[p++] = c;\r\n }\r\n else if (c < 2048) {\r\n out[p++] = (c >> 6) | 192;\r\n out[p++] = (c & 63) | 128;\r\n }\r\n else if ((c & 0xfc00) === 0xd800 &&\r\n i + 1 < str.length &&\r\n (str.charCodeAt(i + 1) & 0xfc00) === 0xdc00) {\r\n // Surrogate Pair\r\n c = 0x10000 + ((c & 0x03ff) << 10) + (str.charCodeAt(++i) & 0x03ff);\r\n out[p++] = (c >> 18) | 240;\r\n out[p++] = ((c >> 12) & 63) | 128;\r\n out[p++] = ((c >> 6) & 63) | 128;\r\n out[p++] = (c & 63) | 128;\r\n }\r\n else {\r\n out[p++] = (c >> 12) | 224;\r\n out[p++] = ((c >> 6) & 63) | 128;\r\n out[p++] = (c & 63) | 128;\r\n }\r\n }\r\n return out;\r\n};\r\n/**\r\n * Turns an array of numbers into the string given by the concatenation of the\r\n * characters to which the numbers correspond.\r\n * @param bytes Array of numbers representing characters.\r\n * @return Stringification of the array.\r\n */\r\nconst byteArrayToString = function (bytes) {\r\n // TODO(user): Use native implementations if/when available\r\n const out = [];\r\n let pos = 0, c = 0;\r\n while (pos < bytes.length) {\r\n const c1 = bytes[pos++];\r\n if (c1 < 128) {\r\n out[c++] = String.fromCharCode(c1);\r\n }\r\n else if (c1 > 191 && c1 < 224) {\r\n const c2 = bytes[pos++];\r\n out[c++] = String.fromCharCode(((c1 & 31) << 6) | (c2 & 63));\r\n }\r\n else if (c1 > 239 && c1 < 365) {\r\n // Surrogate Pair\r\n const c2 = bytes[pos++];\r\n const c3 = bytes[pos++];\r\n const c4 = bytes[pos++];\r\n const u = (((c1 & 7) << 18) | ((c2 & 63) << 12) | ((c3 & 63) << 6) | (c4 & 63)) -\r\n 0x10000;\r\n out[c++] = String.fromCharCode(0xd800 + (u >> 10));\r\n out[c++] = String.fromCharCode(0xdc00 + (u & 1023));\r\n }\r\n else {\r\n const c2 = bytes[pos++];\r\n const c3 = bytes[pos++];\r\n out[c++] = String.fromCharCode(((c1 & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));\r\n }\r\n }\r\n return out.join('');\r\n};\r\n// We define it as an object literal instead of a class because a class compiled down to es5 can't\r\n// be treeshaked. https://github.com/rollup/rollup/issues/1691\r\n// Static lookup maps, lazily populated by init_()\r\nconst base64 = {\r\n /**\r\n * Maps bytes to characters.\r\n */\r\n byteToCharMap_: null,\r\n /**\r\n * Maps characters to bytes.\r\n */\r\n charToByteMap_: null,\r\n /**\r\n * Maps bytes to websafe characters.\r\n * @private\r\n */\r\n byteToCharMapWebSafe_: null,\r\n /**\r\n * Maps websafe characters to bytes.\r\n * @private\r\n */\r\n charToByteMapWebSafe_: null,\r\n /**\r\n * Our default alphabet, shared between\r\n * ENCODED_VALS and ENCODED_VALS_WEBSAFE\r\n */\r\n ENCODED_VALS_BASE: 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' + 'abcdefghijklmnopqrstuvwxyz' + '0123456789',\r\n /**\r\n * Our default alphabet. Value 64 (=) is special; it means \"nothing.\"\r\n */\r\n get ENCODED_VALS() {\r\n return this.ENCODED_VALS_BASE + '+/=';\r\n },\r\n /**\r\n * Our websafe alphabet.\r\n */\r\n get ENCODED_VALS_WEBSAFE() {\r\n return this.ENCODED_VALS_BASE + '-_.';\r\n },\r\n /**\r\n * Whether this browser supports the atob and btoa functions. This extension\r\n * started at Mozilla but is now implemented by many browsers. We use the\r\n * ASSUME_* variables to avoid pulling in the full useragent detection library\r\n * but still allowing the standard per-browser compilations.\r\n *\r\n */\r\n HAS_NATIVE_SUPPORT: typeof atob === 'function',\r\n /**\r\n * Base64-encode an array of bytes.\r\n *\r\n * @param input An array of bytes (numbers with\r\n * value in [0, 255]) to encode.\r\n * @param webSafe Boolean indicating we should use the\r\n * alternative alphabet.\r\n * @return The base64 encoded string.\r\n */\r\n encodeByteArray(input, webSafe) {\r\n if (!Array.isArray(input)) {\r\n throw Error('encodeByteArray takes an array as a parameter');\r\n }\r\n this.init_();\r\n const byteToCharMap = webSafe\r\n ? this.byteToCharMapWebSafe_\r\n : this.byteToCharMap_;\r\n const output = [];\r\n for (let i = 0; i < input.length; i += 3) {\r\n const byte1 = input[i];\r\n const haveByte2 = i + 1 < input.length;\r\n const byte2 = haveByte2 ? input[i + 1] : 0;\r\n const haveByte3 = i + 2 < input.length;\r\n const byte3 = haveByte3 ? input[i + 2] : 0;\r\n const outByte1 = byte1 >> 2;\r\n const outByte2 = ((byte1 & 0x03) << 4) | (byte2 >> 4);\r\n let outByte3 = ((byte2 & 0x0f) << 2) | (byte3 >> 6);\r\n let outByte4 = byte3 & 0x3f;\r\n if (!haveByte3) {\r\n outByte4 = 64;\r\n if (!haveByte2) {\r\n outByte3 = 64;\r\n }\r\n }\r\n output.push(byteToCharMap[outByte1], byteToCharMap[outByte2], byteToCharMap[outByte3], byteToCharMap[outByte4]);\r\n }\r\n return output.join('');\r\n },\r\n /**\r\n * Base64-encode a string.\r\n *\r\n * @param input A string to encode.\r\n * @param webSafe If true, we should use the\r\n * alternative alphabet.\r\n * @return The base64 encoded string.\r\n */\r\n encodeString(input, webSafe) {\r\n // Shortcut for Mozilla browsers that implement\r\n // a native base64 encoder in the form of \"btoa/atob\"\r\n if (this.HAS_NATIVE_SUPPORT && !webSafe) {\r\n return btoa(input);\r\n }\r\n return this.encodeByteArray(stringToByteArray$1(input), webSafe);\r\n },\r\n /**\r\n * Base64-decode a string.\r\n *\r\n * @param input to decode.\r\n * @param webSafe True if we should use the\r\n * alternative alphabet.\r\n * @return string representing the decoded value.\r\n */\r\n decodeString(input, webSafe) {\r\n // Shortcut for Mozilla browsers that implement\r\n // a native base64 encoder in the form of \"btoa/atob\"\r\n if (this.HAS_NATIVE_SUPPORT && !webSafe) {\r\n return atob(input);\r\n }\r\n return byteArrayToString(this.decodeStringToByteArray(input, webSafe));\r\n },\r\n /**\r\n * Base64-decode a string.\r\n *\r\n * In base-64 decoding, groups of four characters are converted into three\r\n * bytes. If the encoder did not apply padding, the input length may not\r\n * be a multiple of 4.\r\n *\r\n * In this case, the last group will have fewer than 4 characters, and\r\n * padding will be inferred. If the group has one or two characters, it decodes\r\n * to one byte. If the group has three characters, it decodes to two bytes.\r\n *\r\n * @param input Input to decode.\r\n * @param webSafe True if we should use the web-safe alphabet.\r\n * @return bytes representing the decoded value.\r\n */\r\n decodeStringToByteArray(input, webSafe) {\r\n this.init_();\r\n const charToByteMap = webSafe\r\n ? this.charToByteMapWebSafe_\r\n : this.charToByteMap_;\r\n const output = [];\r\n for (let i = 0; i < input.length;) {\r\n const byte1 = charToByteMap[input.charAt(i++)];\r\n const haveByte2 = i < input.length;\r\n const byte2 = haveByte2 ? charToByteMap[input.charAt(i)] : 0;\r\n ++i;\r\n const haveByte3 = i < input.length;\r\n const byte3 = haveByte3 ? charToByteMap[input.charAt(i)] : 64;\r\n ++i;\r\n const haveByte4 = i < input.length;\r\n const byte4 = haveByte4 ? charToByteMap[input.charAt(i)] : 64;\r\n ++i;\r\n if (byte1 == null || byte2 == null || byte3 == null || byte4 == null) {\r\n throw Error();\r\n }\r\n const outByte1 = (byte1 << 2) | (byte2 >> 4);\r\n output.push(outByte1);\r\n if (byte3 !== 64) {\r\n const outByte2 = ((byte2 << 4) & 0xf0) | (byte3 >> 2);\r\n output.push(outByte2);\r\n if (byte4 !== 64) {\r\n const outByte3 = ((byte3 << 6) & 0xc0) | byte4;\r\n output.push(outByte3);\r\n }\r\n }\r\n }\r\n return output;\r\n },\r\n /**\r\n * Lazy static initialization function. Called before\r\n * accessing any of the static map variables.\r\n * @private\r\n */\r\n init_() {\r\n if (!this.byteToCharMap_) {\r\n this.byteToCharMap_ = {};\r\n this.charToByteMap_ = {};\r\n this.byteToCharMapWebSafe_ = {};\r\n this.charToByteMapWebSafe_ = {};\r\n // We want quick mappings back and forth, so we precompute two maps.\r\n for (let i = 0; i < this.ENCODED_VALS.length; i++) {\r\n this.byteToCharMap_[i] = this.ENCODED_VALS.charAt(i);\r\n this.charToByteMap_[this.byteToCharMap_[i]] = i;\r\n this.byteToCharMapWebSafe_[i] = this.ENCODED_VALS_WEBSAFE.charAt(i);\r\n this.charToByteMapWebSafe_[this.byteToCharMapWebSafe_[i]] = i;\r\n // Be forgiving when decoding and correctly decode both encodings.\r\n if (i >= this.ENCODED_VALS_BASE.length) {\r\n this.charToByteMap_[this.ENCODED_VALS_WEBSAFE.charAt(i)] = i;\r\n this.charToByteMapWebSafe_[this.ENCODED_VALS.charAt(i)] = i;\r\n }\r\n }\r\n }\r\n }\r\n};\r\n/**\r\n * URL-safe base64 encoding\r\n */\r\nconst base64Encode = function (str) {\r\n const utf8Bytes = stringToByteArray$1(str);\r\n return base64.encodeByteArray(utf8Bytes, true);\r\n};\r\n/**\r\n * URL-safe base64 encoding (without \".\" padding in the end).\r\n * e.g. Used in JSON Web Token (JWT) parts.\r\n */\r\nconst base64urlEncodeWithoutPadding = function (str) {\r\n // Use base64url encoding and remove padding in the end (dot characters).\r\n return base64Encode(str).replace(/\\./g, '');\r\n};\r\n/**\r\n * URL-safe base64 decoding\r\n *\r\n * NOTE: DO NOT use the global atob() function - it does NOT support the\r\n * base64Url variant encoding.\r\n *\r\n * @param str To be decoded\r\n * @return Decoded result, if possible\r\n */\r\nconst base64Decode = function (str) {\r\n try {\r\n return base64.decodeString(str, true);\r\n }\r\n catch (e) {\r\n console.error('base64Decode failed: ', e);\r\n }\r\n return null;\r\n};\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Do a deep-copy of basic JavaScript Objects or Arrays.\r\n */\r\nfunction deepCopy(value) {\r\n return deepExtend(undefined, value);\r\n}\r\n/**\r\n * Copy properties from source to target (recursively allows extension\r\n * of Objects and Arrays). Scalar values in the target are over-written.\r\n * If target is undefined, an object of the appropriate type will be created\r\n * (and returned).\r\n *\r\n * We recursively copy all child properties of plain Objects in the source- so\r\n * that namespace- like dictionaries are merged.\r\n *\r\n * Note that the target can be a function, in which case the properties in\r\n * the source Object are copied onto it as static properties of the Function.\r\n *\r\n * Note: we don't merge __proto__ to prevent prototype pollution\r\n */\r\nfunction deepExtend(target, source) {\r\n if (!(source instanceof Object)) {\r\n return source;\r\n }\r\n switch (source.constructor) {\r\n case Date:\r\n // Treat Dates like scalars; if the target date object had any child\r\n // properties - they will be lost!\r\n const dateValue = source;\r\n return new Date(dateValue.getTime());\r\n case Object:\r\n if (target === undefined) {\r\n target = {};\r\n }\r\n break;\r\n case Array:\r\n // Always copy the array source and overwrite the target.\r\n target = [];\r\n break;\r\n default:\r\n // Not a plain Object - treat it as a scalar.\r\n return source;\r\n }\r\n for (const prop in source) {\r\n // use isValidKey to guard against prototype pollution. See https://snyk.io/vuln/SNYK-JS-LODASH-450202\r\n if (!source.hasOwnProperty(prop) || !isValidKey(prop)) {\r\n continue;\r\n }\r\n target[prop] = deepExtend(target[prop], source[prop]);\r\n }\r\n return target;\r\n}\r\nfunction isValidKey(key) {\r\n return key !== '__proto__';\r\n}\n\n/**\r\n * @license\r\n * Copyright 2022 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Polyfill for `globalThis` object.\r\n * @returns the `globalThis` object for the given environment.\r\n * @public\r\n */\r\nfunction getGlobal() {\r\n if (typeof self !== 'undefined') {\r\n return self;\r\n }\r\n if (typeof window !== 'undefined') {\r\n return window;\r\n }\r\n if (typeof global !== 'undefined') {\r\n return global;\r\n }\r\n throw new Error('Unable to locate global object.');\r\n}\n\n/**\r\n * @license\r\n * Copyright 2022 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst getDefaultsFromGlobal = () => getGlobal().__FIREBASE_DEFAULTS__;\r\n/**\r\n * Attempt to read defaults from a JSON string provided to\r\n * process(.)env(.)__FIREBASE_DEFAULTS__ or a JSON file whose path is in\r\n * process(.)env(.)__FIREBASE_DEFAULTS_PATH__\r\n * The dots are in parens because certain compilers (Vite?) cannot\r\n * handle seeing that variable in comments.\r\n * See https://github.com/firebase/firebase-js-sdk/issues/6838\r\n */\r\nconst getDefaultsFromEnvVariable = () => {\r\n if (typeof process === 'undefined' || typeof process.env === 'undefined') {\r\n return;\r\n }\r\n const defaultsJsonString = process.env.__FIREBASE_DEFAULTS__;\r\n if (defaultsJsonString) {\r\n return JSON.parse(defaultsJsonString);\r\n }\r\n};\r\nconst getDefaultsFromCookie = () => {\r\n if (typeof document === 'undefined') {\r\n return;\r\n }\r\n let match;\r\n try {\r\n match = document.cookie.match(/__FIREBASE_DEFAULTS__=([^;]+)/);\r\n }\r\n catch (e) {\r\n // Some environments such as Angular Universal SSR have a\r\n // `document` object but error on accessing `document.cookie`.\r\n return;\r\n }\r\n const decoded = match && base64Decode(match[1]);\r\n return decoded && JSON.parse(decoded);\r\n};\r\n/**\r\n * Get the __FIREBASE_DEFAULTS__ object. It checks in order:\r\n * (1) if such an object exists as a property of `globalThis`\r\n * (2) if such an object was provided on a shell environment variable\r\n * (3) if such an object exists in a cookie\r\n * @public\r\n */\r\nconst getDefaults = () => {\r\n try {\r\n return (getDefaultsFromGlobal() ||\r\n getDefaultsFromEnvVariable() ||\r\n getDefaultsFromCookie());\r\n }\r\n catch (e) {\r\n /**\r\n * Catch-all for being unable to get __FIREBASE_DEFAULTS__ due\r\n * to any environment case we have not accounted for. Log to\r\n * info instead of swallowing so we can find these unknown cases\r\n * and add paths for them if needed.\r\n */\r\n console.info(`Unable to get __FIREBASE_DEFAULTS__ due to: ${e}`);\r\n return;\r\n }\r\n};\r\n/**\r\n * Returns emulator host stored in the __FIREBASE_DEFAULTS__ object\r\n * for the given product.\r\n * @returns a URL host formatted like `127.0.0.1:9999` or `[::1]:4000` if available\r\n * @public\r\n */\r\nconst getDefaultEmulatorHost = (productName) => { var _a, _b; return (_b = (_a = getDefaults()) === null || _a === void 0 ? void 0 : _a.emulatorHosts) === null || _b === void 0 ? void 0 : _b[productName]; };\r\n/**\r\n * Returns emulator hostname and port stored in the __FIREBASE_DEFAULTS__ object\r\n * for the given product.\r\n * @returns a pair of hostname and port like `[\"::1\", 4000]` if available\r\n * @public\r\n */\r\nconst getDefaultEmulatorHostnameAndPort = (productName) => {\r\n const host = getDefaultEmulatorHost(productName);\r\n if (!host) {\r\n return undefined;\r\n }\r\n const separatorIndex = host.lastIndexOf(':'); // Finding the last since IPv6 addr also has colons.\r\n if (separatorIndex <= 0 || separatorIndex + 1 === host.length) {\r\n throw new Error(`Invalid host ${host} with no separate hostname and port!`);\r\n }\r\n // eslint-disable-next-line no-restricted-globals\r\n const port = parseInt(host.substring(separatorIndex + 1), 10);\r\n if (host[0] === '[') {\r\n // Bracket-quoted `[ipv6addr]:port` => return \"ipv6addr\" (without brackets).\r\n return [host.substring(1, separatorIndex - 1), port];\r\n }\r\n else {\r\n return [host.substring(0, separatorIndex), port];\r\n }\r\n};\r\n/**\r\n * Returns Firebase app config stored in the __FIREBASE_DEFAULTS__ object.\r\n * @public\r\n */\r\nconst getDefaultAppConfig = () => { var _a; return (_a = getDefaults()) === null || _a === void 0 ? void 0 : _a.config; };\r\n/**\r\n * Returns an experimental setting on the __FIREBASE_DEFAULTS__ object (properties\r\n * prefixed by \"_\")\r\n * @public\r\n */\r\nconst getExperimentalSetting = (name) => { var _a; return (_a = getDefaults()) === null || _a === void 0 ? void 0 : _a[`_${name}`]; };\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nclass Deferred {\r\n constructor() {\r\n this.reject = () => { };\r\n this.resolve = () => { };\r\n this.promise = new Promise((resolve, reject) => {\r\n this.resolve = resolve;\r\n this.reject = reject;\r\n });\r\n }\r\n /**\r\n * Our API internals are not promiseified and cannot because our callback APIs have subtle expectations around\r\n * invoking promises inline, which Promises are forbidden to do. This method accepts an optional node-style callback\r\n * and returns a node-style callback which will resolve or reject the Deferred's promise.\r\n */\r\n wrapCallback(callback) {\r\n return (error, value) => {\r\n if (error) {\r\n this.reject(error);\r\n }\r\n else {\r\n this.resolve(value);\r\n }\r\n if (typeof callback === 'function') {\r\n // Attaching noop handler just in case developer wasn't expecting\r\n // promises\r\n this.promise.catch(() => { });\r\n // Some of our callbacks don't expect a value and our own tests\r\n // assert that the parameter length is 1\r\n if (callback.length === 1) {\r\n callback(error);\r\n }\r\n else {\r\n callback(error, value);\r\n }\r\n }\r\n };\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2021 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction createMockUserToken(token, projectId) {\r\n if (token.uid) {\r\n throw new Error('The \"uid\" field is no longer supported by mockUserToken. Please use \"sub\" instead for Firebase Auth User ID.');\r\n }\r\n // Unsecured JWTs use \"none\" as the algorithm.\r\n const header = {\r\n alg: 'none',\r\n type: 'JWT'\r\n };\r\n const project = projectId || 'demo-project';\r\n const iat = token.iat || 0;\r\n const sub = token.sub || token.user_id;\r\n if (!sub) {\r\n throw new Error(\"mockUserToken must contain 'sub' or 'user_id' field!\");\r\n }\r\n const payload = Object.assign({ \r\n // Set all required fields to decent defaults\r\n iss: `https://securetoken.google.com/${project}`, aud: project, iat, exp: iat + 3600, auth_time: iat, sub, user_id: sub, firebase: {\r\n sign_in_provider: 'custom',\r\n identities: {}\r\n } }, token);\r\n // Unsecured JWTs use the empty string as a signature.\r\n const signature = '';\r\n return [\r\n base64urlEncodeWithoutPadding(JSON.stringify(header)),\r\n base64urlEncodeWithoutPadding(JSON.stringify(payload)),\r\n signature\r\n ].join('.');\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Returns navigator.userAgent string or '' if it's not defined.\r\n * @return user agent string\r\n */\r\nfunction getUA() {\r\n if (typeof navigator !== 'undefined' &&\r\n typeof navigator['userAgent'] === 'string') {\r\n return navigator['userAgent'];\r\n }\r\n else {\r\n return '';\r\n }\r\n}\r\n/**\r\n * Detect Cordova / PhoneGap / Ionic frameworks on a mobile device.\r\n *\r\n * Deliberately does not rely on checking `file://` URLs (as this fails PhoneGap\r\n * in the Ripple emulator) nor Cordova `onDeviceReady`, which would normally\r\n * wait for a callback.\r\n */\r\nfunction isMobileCordova() {\r\n return (typeof window !== 'undefined' &&\r\n // @ts-ignore Setting up an broadly applicable index signature for Window\r\n // just to deal with this case would probably be a bad idea.\r\n !!(window['cordova'] || window['phonegap'] || window['PhoneGap']) &&\r\n /ios|iphone|ipod|ipad|android|blackberry|iemobile/i.test(getUA()));\r\n}\r\n/**\r\n * Detect Node.js.\r\n *\r\n * @return true if Node.js environment is detected or specified.\r\n */\r\n// Node detection logic from: https://github.com/iliakan/detect-node/\r\nfunction isNode() {\r\n var _a;\r\n const forceEnvironment = (_a = getDefaults()) === null || _a === void 0 ? void 0 : _a.forceEnvironment;\r\n if (forceEnvironment === 'node') {\r\n return true;\r\n }\r\n else if (forceEnvironment === 'browser') {\r\n return false;\r\n }\r\n try {\r\n return (Object.prototype.toString.call(global.process) === '[object process]');\r\n }\r\n catch (e) {\r\n return false;\r\n }\r\n}\r\n/**\r\n * Detect Browser Environment\r\n */\r\nfunction isBrowser() {\r\n return typeof self === 'object' && self.self === self;\r\n}\r\nfunction isBrowserExtension() {\r\n const runtime = typeof chrome === 'object'\r\n ? chrome.runtime\r\n : typeof browser === 'object'\r\n ? browser.runtime\r\n : undefined;\r\n return typeof runtime === 'object' && runtime.id !== undefined;\r\n}\r\n/**\r\n * Detect React Native.\r\n *\r\n * @return true if ReactNative environment is detected.\r\n */\r\nfunction isReactNative() {\r\n return (typeof navigator === 'object' && navigator['product'] === 'ReactNative');\r\n}\r\n/** Detects Electron apps. */\r\nfunction isElectron() {\r\n return getUA().indexOf('Electron/') >= 0;\r\n}\r\n/** Detects Internet Explorer. */\r\nfunction isIE() {\r\n const ua = getUA();\r\n return ua.indexOf('MSIE ') >= 0 || ua.indexOf('Trident/') >= 0;\r\n}\r\n/** Detects Universal Windows Platform apps. */\r\nfunction isUWP() {\r\n return getUA().indexOf('MSAppHost/') >= 0;\r\n}\r\n/**\r\n * Detect whether the current SDK build is the Node version.\r\n *\r\n * @return true if it's the Node SDK build.\r\n */\r\nfunction isNodeSdk() {\r\n return CONSTANTS.NODE_CLIENT === true || CONSTANTS.NODE_ADMIN === true;\r\n}\r\n/** Returns true if we are running in Safari. */\r\nfunction isSafari() {\r\n return (!isNode() &&\r\n navigator.userAgent.includes('Safari') &&\r\n !navigator.userAgent.includes('Chrome'));\r\n}\r\n/**\r\n * This method checks if indexedDB is supported by current browser/service worker context\r\n * @return true if indexedDB is supported by current browser/service worker context\r\n */\r\nfunction isIndexedDBAvailable() {\r\n try {\r\n return typeof indexedDB === 'object';\r\n }\r\n catch (e) {\r\n return false;\r\n }\r\n}\r\n/**\r\n * This method validates browser/sw context for indexedDB by opening a dummy indexedDB database and reject\r\n * if errors occur during the database open operation.\r\n *\r\n * @throws exception if current browser/sw context can't run idb.open (ex: Safari iframe, Firefox\r\n * private browsing)\r\n */\r\nfunction validateIndexedDBOpenable() {\r\n return new Promise((resolve, reject) => {\r\n try {\r\n let preExist = true;\r\n const DB_CHECK_NAME = 'validate-browser-context-for-indexeddb-analytics-module';\r\n const request = self.indexedDB.open(DB_CHECK_NAME);\r\n request.onsuccess = () => {\r\n request.result.close();\r\n // delete database only when it doesn't pre-exist\r\n if (!preExist) {\r\n self.indexedDB.deleteDatabase(DB_CHECK_NAME);\r\n }\r\n resolve(true);\r\n };\r\n request.onupgradeneeded = () => {\r\n preExist = false;\r\n };\r\n request.onerror = () => {\r\n var _a;\r\n reject(((_a = request.error) === null || _a === void 0 ? void 0 : _a.message) || '');\r\n };\r\n }\r\n catch (error) {\r\n reject(error);\r\n }\r\n });\r\n}\r\n/**\r\n *\r\n * This method checks whether cookie is enabled within current browser\r\n * @return true if cookie is enabled within current browser\r\n */\r\nfunction areCookiesEnabled() {\r\n if (typeof navigator === 'undefined' || !navigator.cookieEnabled) {\r\n return false;\r\n }\r\n return true;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * @fileoverview Standardized Firebase Error.\r\n *\r\n * Usage:\r\n *\r\n * // Typescript string literals for type-safe codes\r\n * type Err =\r\n * 'unknown' |\r\n * 'object-not-found'\r\n * ;\r\n *\r\n * // Closure enum for type-safe error codes\r\n * // at-enum {string}\r\n * var Err = {\r\n * UNKNOWN: 'unknown',\r\n * OBJECT_NOT_FOUND: 'object-not-found',\r\n * }\r\n *\r\n * let errors: Map = {\r\n * 'generic-error': \"Unknown error\",\r\n * 'file-not-found': \"Could not find file: {$file}\",\r\n * };\r\n *\r\n * // Type-safe function - must pass a valid error code as param.\r\n * let error = new ErrorFactory('service', 'Service', errors);\r\n *\r\n * ...\r\n * throw error.create(Err.GENERIC);\r\n * ...\r\n * throw error.create(Err.FILE_NOT_FOUND, {'file': fileName});\r\n * ...\r\n * // Service: Could not file file: foo.txt (service/file-not-found).\r\n *\r\n * catch (e) {\r\n * assert(e.message === \"Could not find file: foo.txt.\");\r\n * if ((e as FirebaseError)?.code === 'service/file-not-found') {\r\n * console.log(\"Could not read file: \" + e['file']);\r\n * }\r\n * }\r\n */\r\nconst ERROR_NAME = 'FirebaseError';\r\n// Based on code from:\r\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error#Custom_Error_Types\r\nclass FirebaseError extends Error {\r\n constructor(\r\n /** The error code for this error. */\r\n code, message, \r\n /** Custom data for this error. */\r\n customData) {\r\n super(message);\r\n this.code = code;\r\n this.customData = customData;\r\n /** The custom name for all FirebaseErrors. */\r\n this.name = ERROR_NAME;\r\n // Fix For ES5\r\n // https://github.com/Microsoft/TypeScript-wiki/blob/master/Breaking-Changes.md#extending-built-ins-like-error-array-and-map-may-no-longer-work\r\n Object.setPrototypeOf(this, FirebaseError.prototype);\r\n // Maintains proper stack trace for where our error was thrown.\r\n // Only available on V8.\r\n if (Error.captureStackTrace) {\r\n Error.captureStackTrace(this, ErrorFactory.prototype.create);\r\n }\r\n }\r\n}\r\nclass ErrorFactory {\r\n constructor(service, serviceName, errors) {\r\n this.service = service;\r\n this.serviceName = serviceName;\r\n this.errors = errors;\r\n }\r\n create(code, ...data) {\r\n const customData = data[0] || {};\r\n const fullCode = `${this.service}/${code}`;\r\n const template = this.errors[code];\r\n const message = template ? replaceTemplate(template, customData) : 'Error';\r\n // Service Name: Error message (service/code).\r\n const fullMessage = `${this.serviceName}: ${message} (${fullCode}).`;\r\n const error = new FirebaseError(fullCode, fullMessage, customData);\r\n return error;\r\n }\r\n}\r\nfunction replaceTemplate(template, data) {\r\n return template.replace(PATTERN, (_, key) => {\r\n const value = data[key];\r\n return value != null ? String(value) : `<${key}?>`;\r\n });\r\n}\r\nconst PATTERN = /\\{\\$([^}]+)}/g;\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Evaluates a JSON string into a javascript object.\r\n *\r\n * @param {string} str A string containing JSON.\r\n * @return {*} The javascript object representing the specified JSON.\r\n */\r\nfunction jsonEval(str) {\r\n return JSON.parse(str);\r\n}\r\n/**\r\n * Returns JSON representing a javascript object.\r\n * @param {*} data Javascript object to be stringified.\r\n * @return {string} The JSON contents of the object.\r\n */\r\nfunction stringify(data) {\r\n return JSON.stringify(data);\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Decodes a Firebase auth. token into constituent parts.\r\n *\r\n * Notes:\r\n * - May return with invalid / incomplete claims if there's no native base64 decoding support.\r\n * - Doesn't check if the token is actually valid.\r\n */\r\nconst decode = function (token) {\r\n let header = {}, claims = {}, data = {}, signature = '';\r\n try {\r\n const parts = token.split('.');\r\n header = jsonEval(base64Decode(parts[0]) || '');\r\n claims = jsonEval(base64Decode(parts[1]) || '');\r\n signature = parts[2];\r\n data = claims['d'] || {};\r\n delete claims['d'];\r\n }\r\n catch (e) { }\r\n return {\r\n header,\r\n claims,\r\n data,\r\n signature\r\n };\r\n};\r\n/**\r\n * Decodes a Firebase auth. token and checks the validity of its time-based claims. Will return true if the\r\n * token is within the time window authorized by the 'nbf' (not-before) and 'iat' (issued-at) claims.\r\n *\r\n * Notes:\r\n * - May return a false negative if there's no native base64 decoding support.\r\n * - Doesn't check if the token is actually valid.\r\n */\r\nconst isValidTimestamp = function (token) {\r\n const claims = decode(token).claims;\r\n const now = Math.floor(new Date().getTime() / 1000);\r\n let validSince = 0, validUntil = 0;\r\n if (typeof claims === 'object') {\r\n if (claims.hasOwnProperty('nbf')) {\r\n validSince = claims['nbf'];\r\n }\r\n else if (claims.hasOwnProperty('iat')) {\r\n validSince = claims['iat'];\r\n }\r\n if (claims.hasOwnProperty('exp')) {\r\n validUntil = claims['exp'];\r\n }\r\n else {\r\n // token will expire after 24h by default\r\n validUntil = validSince + 86400;\r\n }\r\n }\r\n return (!!now &&\r\n !!validSince &&\r\n !!validUntil &&\r\n now >= validSince &&\r\n now <= validUntil);\r\n};\r\n/**\r\n * Decodes a Firebase auth. token and returns its issued at time if valid, null otherwise.\r\n *\r\n * Notes:\r\n * - May return null if there's no native base64 decoding support.\r\n * - Doesn't check if the token is actually valid.\r\n */\r\nconst issuedAtTime = function (token) {\r\n const claims = decode(token).claims;\r\n if (typeof claims === 'object' && claims.hasOwnProperty('iat')) {\r\n return claims['iat'];\r\n }\r\n return null;\r\n};\r\n/**\r\n * Decodes a Firebase auth. token and checks the validity of its format. Expects a valid issued-at time.\r\n *\r\n * Notes:\r\n * - May return a false negative if there's no native base64 decoding support.\r\n * - Doesn't check if the token is actually valid.\r\n */\r\nconst isValidFormat = function (token) {\r\n const decoded = decode(token), claims = decoded.claims;\r\n return !!claims && typeof claims === 'object' && claims.hasOwnProperty('iat');\r\n};\r\n/**\r\n * Attempts to peer into an auth token and determine if it's an admin auth token by looking at the claims portion.\r\n *\r\n * Notes:\r\n * - May return a false negative if there's no native base64 decoding support.\r\n * - Doesn't check if the token is actually valid.\r\n */\r\nconst isAdmin = function (token) {\r\n const claims = decode(token).claims;\r\n return typeof claims === 'object' && claims['admin'] === true;\r\n};\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction contains(obj, key) {\r\n return Object.prototype.hasOwnProperty.call(obj, key);\r\n}\r\nfunction safeGet(obj, key) {\r\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\r\n return obj[key];\r\n }\r\n else {\r\n return undefined;\r\n }\r\n}\r\nfunction isEmpty(obj) {\r\n for (const key in obj) {\r\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n}\r\nfunction map(obj, fn, contextObj) {\r\n const res = {};\r\n for (const key in obj) {\r\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\r\n res[key] = fn.call(contextObj, obj[key], key, obj);\r\n }\r\n }\r\n return res;\r\n}\r\n/**\r\n * Deep equal two objects. Support Arrays and Objects.\r\n */\r\nfunction deepEqual(a, b) {\r\n if (a === b) {\r\n return true;\r\n }\r\n const aKeys = Object.keys(a);\r\n const bKeys = Object.keys(b);\r\n for (const k of aKeys) {\r\n if (!bKeys.includes(k)) {\r\n return false;\r\n }\r\n const aProp = a[k];\r\n const bProp = b[k];\r\n if (isObject(aProp) && isObject(bProp)) {\r\n if (!deepEqual(aProp, bProp)) {\r\n return false;\r\n }\r\n }\r\n else if (aProp !== bProp) {\r\n return false;\r\n }\r\n }\r\n for (const k of bKeys) {\r\n if (!aKeys.includes(k)) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n}\r\nfunction isObject(thing) {\r\n return thing !== null && typeof thing === 'object';\r\n}\n\n/**\r\n * @license\r\n * Copyright 2022 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Rejects if the given promise doesn't resolve in timeInMS milliseconds.\r\n * @internal\r\n */\r\nfunction promiseWithTimeout(promise, timeInMS = 2000) {\r\n const deferredPromise = new Deferred();\r\n setTimeout(() => deferredPromise.reject('timeout!'), timeInMS);\r\n promise.then(deferredPromise.resolve, deferredPromise.reject);\r\n return deferredPromise.promise;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Returns a querystring-formatted string (e.g. &arg=val&arg2=val2) from a\r\n * params object (e.g. {arg: 'val', arg2: 'val2'})\r\n * Note: You must prepend it with ? when adding it to a URL.\r\n */\r\nfunction querystring(querystringParams) {\r\n const params = [];\r\n for (const [key, value] of Object.entries(querystringParams)) {\r\n if (Array.isArray(value)) {\r\n value.forEach(arrayVal => {\r\n params.push(encodeURIComponent(key) + '=' + encodeURIComponent(arrayVal));\r\n });\r\n }\r\n else {\r\n params.push(encodeURIComponent(key) + '=' + encodeURIComponent(value));\r\n }\r\n }\r\n return params.length ? '&' + params.join('&') : '';\r\n}\r\n/**\r\n * Decodes a querystring (e.g. ?arg=val&arg2=val2) into a params object\r\n * (e.g. {arg: 'val', arg2: 'val2'})\r\n */\r\nfunction querystringDecode(querystring) {\r\n const obj = {};\r\n const tokens = querystring.replace(/^\\?/, '').split('&');\r\n tokens.forEach(token => {\r\n if (token) {\r\n const [key, value] = token.split('=');\r\n obj[decodeURIComponent(key)] = decodeURIComponent(value);\r\n }\r\n });\r\n return obj;\r\n}\r\n/**\r\n * Extract the query string part of a URL, including the leading question mark (if present).\r\n */\r\nfunction extractQuerystring(url) {\r\n const queryStart = url.indexOf('?');\r\n if (!queryStart) {\r\n return '';\r\n }\r\n const fragmentStart = url.indexOf('#', queryStart);\r\n return url.substring(queryStart, fragmentStart > 0 ? fragmentStart : undefined);\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * @fileoverview SHA-1 cryptographic hash.\r\n * Variable names follow the notation in FIPS PUB 180-3:\r\n * http://csrc.nist.gov/publications/fips/fips180-3/fips180-3_final.pdf.\r\n *\r\n * Usage:\r\n * var sha1 = new sha1();\r\n * sha1.update(bytes);\r\n * var hash = sha1.digest();\r\n *\r\n * Performance:\r\n * Chrome 23: ~400 Mbit/s\r\n * Firefox 16: ~250 Mbit/s\r\n *\r\n */\r\n/**\r\n * SHA-1 cryptographic hash constructor.\r\n *\r\n * The properties declared here are discussed in the above algorithm document.\r\n * @constructor\r\n * @final\r\n * @struct\r\n */\r\nclass Sha1 {\r\n constructor() {\r\n /**\r\n * Holds the previous values of accumulated variables a-e in the compress_\r\n * function.\r\n * @private\r\n */\r\n this.chain_ = [];\r\n /**\r\n * A buffer holding the partially computed hash result.\r\n * @private\r\n */\r\n this.buf_ = [];\r\n /**\r\n * An array of 80 bytes, each a part of the message to be hashed. Referred to\r\n * as the message schedule in the docs.\r\n * @private\r\n */\r\n this.W_ = [];\r\n /**\r\n * Contains data needed to pad messages less than 64 bytes.\r\n * @private\r\n */\r\n this.pad_ = [];\r\n /**\r\n * @private {number}\r\n */\r\n this.inbuf_ = 0;\r\n /**\r\n * @private {number}\r\n */\r\n this.total_ = 0;\r\n this.blockSize = 512 / 8;\r\n this.pad_[0] = 128;\r\n for (let i = 1; i < this.blockSize; ++i) {\r\n this.pad_[i] = 0;\r\n }\r\n this.reset();\r\n }\r\n reset() {\r\n this.chain_[0] = 0x67452301;\r\n this.chain_[1] = 0xefcdab89;\r\n this.chain_[2] = 0x98badcfe;\r\n this.chain_[3] = 0x10325476;\r\n this.chain_[4] = 0xc3d2e1f0;\r\n this.inbuf_ = 0;\r\n this.total_ = 0;\r\n }\r\n /**\r\n * Internal compress helper function.\r\n * @param buf Block to compress.\r\n * @param offset Offset of the block in the buffer.\r\n * @private\r\n */\r\n compress_(buf, offset) {\r\n if (!offset) {\r\n offset = 0;\r\n }\r\n const W = this.W_;\r\n // get 16 big endian words\r\n if (typeof buf === 'string') {\r\n for (let i = 0; i < 16; i++) {\r\n // TODO(user): [bug 8140122] Recent versions of Safari for Mac OS and iOS\r\n // have a bug that turns the post-increment ++ operator into pre-increment\r\n // during JIT compilation. We have code that depends heavily on SHA-1 for\r\n // correctness and which is affected by this bug, so I've removed all uses\r\n // of post-increment ++ in which the result value is used. We can revert\r\n // this change once the Safari bug\r\n // (https://bugs.webkit.org/show_bug.cgi?id=109036) has been fixed and\r\n // most clients have been updated.\r\n W[i] =\r\n (buf.charCodeAt(offset) << 24) |\r\n (buf.charCodeAt(offset + 1) << 16) |\r\n (buf.charCodeAt(offset + 2) << 8) |\r\n buf.charCodeAt(offset + 3);\r\n offset += 4;\r\n }\r\n }\r\n else {\r\n for (let i = 0; i < 16; i++) {\r\n W[i] =\r\n (buf[offset] << 24) |\r\n (buf[offset + 1] << 16) |\r\n (buf[offset + 2] << 8) |\r\n buf[offset + 3];\r\n offset += 4;\r\n }\r\n }\r\n // expand to 80 words\r\n for (let i = 16; i < 80; i++) {\r\n const t = W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16];\r\n W[i] = ((t << 1) | (t >>> 31)) & 0xffffffff;\r\n }\r\n let a = this.chain_[0];\r\n let b = this.chain_[1];\r\n let c = this.chain_[2];\r\n let d = this.chain_[3];\r\n let e = this.chain_[4];\r\n let f, k;\r\n // TODO(user): Try to unroll this loop to speed up the computation.\r\n for (let i = 0; i < 80; i++) {\r\n if (i < 40) {\r\n if (i < 20) {\r\n f = d ^ (b & (c ^ d));\r\n k = 0x5a827999;\r\n }\r\n else {\r\n f = b ^ c ^ d;\r\n k = 0x6ed9eba1;\r\n }\r\n }\r\n else {\r\n if (i < 60) {\r\n f = (b & c) | (d & (b | c));\r\n k = 0x8f1bbcdc;\r\n }\r\n else {\r\n f = b ^ c ^ d;\r\n k = 0xca62c1d6;\r\n }\r\n }\r\n const t = (((a << 5) | (a >>> 27)) + f + e + k + W[i]) & 0xffffffff;\r\n e = d;\r\n d = c;\r\n c = ((b << 30) | (b >>> 2)) & 0xffffffff;\r\n b = a;\r\n a = t;\r\n }\r\n this.chain_[0] = (this.chain_[0] + a) & 0xffffffff;\r\n this.chain_[1] = (this.chain_[1] + b) & 0xffffffff;\r\n this.chain_[2] = (this.chain_[2] + c) & 0xffffffff;\r\n this.chain_[3] = (this.chain_[3] + d) & 0xffffffff;\r\n this.chain_[4] = (this.chain_[4] + e) & 0xffffffff;\r\n }\r\n update(bytes, length) {\r\n // TODO(johnlenz): tighten the function signature and remove this check\r\n if (bytes == null) {\r\n return;\r\n }\r\n if (length === undefined) {\r\n length = bytes.length;\r\n }\r\n const lengthMinusBlock = length - this.blockSize;\r\n let n = 0;\r\n // Using local instead of member variables gives ~5% speedup on Firefox 16.\r\n const buf = this.buf_;\r\n let inbuf = this.inbuf_;\r\n // The outer while loop should execute at most twice.\r\n while (n < length) {\r\n // When we have no data in the block to top up, we can directly process the\r\n // input buffer (assuming it contains sufficient data). This gives ~25%\r\n // speedup on Chrome 23 and ~15% speedup on Firefox 16, but requires that\r\n // the data is provided in large chunks (or in multiples of 64 bytes).\r\n if (inbuf === 0) {\r\n while (n <= lengthMinusBlock) {\r\n this.compress_(bytes, n);\r\n n += this.blockSize;\r\n }\r\n }\r\n if (typeof bytes === 'string') {\r\n while (n < length) {\r\n buf[inbuf] = bytes.charCodeAt(n);\r\n ++inbuf;\r\n ++n;\r\n if (inbuf === this.blockSize) {\r\n this.compress_(buf);\r\n inbuf = 0;\r\n // Jump to the outer loop so we use the full-block optimization.\r\n break;\r\n }\r\n }\r\n }\r\n else {\r\n while (n < length) {\r\n buf[inbuf] = bytes[n];\r\n ++inbuf;\r\n ++n;\r\n if (inbuf === this.blockSize) {\r\n this.compress_(buf);\r\n inbuf = 0;\r\n // Jump to the outer loop so we use the full-block optimization.\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n this.inbuf_ = inbuf;\r\n this.total_ += length;\r\n }\r\n /** @override */\r\n digest() {\r\n const digest = [];\r\n let totalBits = this.total_ * 8;\r\n // Add pad 0x80 0x00*.\r\n if (this.inbuf_ < 56) {\r\n this.update(this.pad_, 56 - this.inbuf_);\r\n }\r\n else {\r\n this.update(this.pad_, this.blockSize - (this.inbuf_ - 56));\r\n }\r\n // Add # bits.\r\n for (let i = this.blockSize - 1; i >= 56; i--) {\r\n this.buf_[i] = totalBits & 255;\r\n totalBits /= 256; // Don't use bit-shifting here!\r\n }\r\n this.compress_(this.buf_);\r\n let n = 0;\r\n for (let i = 0; i < 5; i++) {\r\n for (let j = 24; j >= 0; j -= 8) {\r\n digest[n] = (this.chain_[i] >> j) & 255;\r\n ++n;\r\n }\r\n }\r\n return digest;\r\n }\r\n}\n\n/**\r\n * Helper to make a Subscribe function (just like Promise helps make a\r\n * Thenable).\r\n *\r\n * @param executor Function which can make calls to a single Observer\r\n * as a proxy.\r\n * @param onNoObservers Callback when count of Observers goes to zero.\r\n */\r\nfunction createSubscribe(executor, onNoObservers) {\r\n const proxy = new ObserverProxy(executor, onNoObservers);\r\n return proxy.subscribe.bind(proxy);\r\n}\r\n/**\r\n * Implement fan-out for any number of Observers attached via a subscribe\r\n * function.\r\n */\r\nclass ObserverProxy {\r\n /**\r\n * @param executor Function which can make calls to a single Observer\r\n * as a proxy.\r\n * @param onNoObservers Callback when count of Observers goes to zero.\r\n */\r\n constructor(executor, onNoObservers) {\r\n this.observers = [];\r\n this.unsubscribes = [];\r\n this.observerCount = 0;\r\n // Micro-task scheduling by calling task.then().\r\n this.task = Promise.resolve();\r\n this.finalized = false;\r\n this.onNoObservers = onNoObservers;\r\n // Call the executor asynchronously so subscribers that are called\r\n // synchronously after the creation of the subscribe function\r\n // can still receive the very first value generated in the executor.\r\n this.task\r\n .then(() => {\r\n executor(this);\r\n })\r\n .catch(e => {\r\n this.error(e);\r\n });\r\n }\r\n next(value) {\r\n this.forEachObserver((observer) => {\r\n observer.next(value);\r\n });\r\n }\r\n error(error) {\r\n this.forEachObserver((observer) => {\r\n observer.error(error);\r\n });\r\n this.close(error);\r\n }\r\n complete() {\r\n this.forEachObserver((observer) => {\r\n observer.complete();\r\n });\r\n this.close();\r\n }\r\n /**\r\n * Subscribe function that can be used to add an Observer to the fan-out list.\r\n *\r\n * - We require that no event is sent to a subscriber sychronously to their\r\n * call to subscribe().\r\n */\r\n subscribe(nextOrObserver, error, complete) {\r\n let observer;\r\n if (nextOrObserver === undefined &&\r\n error === undefined &&\r\n complete === undefined) {\r\n throw new Error('Missing Observer.');\r\n }\r\n // Assemble an Observer object when passed as callback functions.\r\n if (implementsAnyMethods(nextOrObserver, [\r\n 'next',\r\n 'error',\r\n 'complete'\r\n ])) {\r\n observer = nextOrObserver;\r\n }\r\n else {\r\n observer = {\r\n next: nextOrObserver,\r\n error,\r\n complete\r\n };\r\n }\r\n if (observer.next === undefined) {\r\n observer.next = noop;\r\n }\r\n if (observer.error === undefined) {\r\n observer.error = noop;\r\n }\r\n if (observer.complete === undefined) {\r\n observer.complete = noop;\r\n }\r\n const unsub = this.unsubscribeOne.bind(this, this.observers.length);\r\n // Attempt to subscribe to a terminated Observable - we\r\n // just respond to the Observer with the final error or complete\r\n // event.\r\n if (this.finalized) {\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\r\n this.task.then(() => {\r\n try {\r\n if (this.finalError) {\r\n observer.error(this.finalError);\r\n }\r\n else {\r\n observer.complete();\r\n }\r\n }\r\n catch (e) {\r\n // nothing\r\n }\r\n return;\r\n });\r\n }\r\n this.observers.push(observer);\r\n return unsub;\r\n }\r\n // Unsubscribe is synchronous - we guarantee that no events are sent to\r\n // any unsubscribed Observer.\r\n unsubscribeOne(i) {\r\n if (this.observers === undefined || this.observers[i] === undefined) {\r\n return;\r\n }\r\n delete this.observers[i];\r\n this.observerCount -= 1;\r\n if (this.observerCount === 0 && this.onNoObservers !== undefined) {\r\n this.onNoObservers(this);\r\n }\r\n }\r\n forEachObserver(fn) {\r\n if (this.finalized) {\r\n // Already closed by previous event....just eat the additional values.\r\n return;\r\n }\r\n // Since sendOne calls asynchronously - there is no chance that\r\n // this.observers will become undefined.\r\n for (let i = 0; i < this.observers.length; i++) {\r\n this.sendOne(i, fn);\r\n }\r\n }\r\n // Call the Observer via one of it's callback function. We are careful to\r\n // confirm that the observe has not been unsubscribed since this asynchronous\r\n // function had been queued.\r\n sendOne(i, fn) {\r\n // Execute the callback asynchronously\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\r\n this.task.then(() => {\r\n if (this.observers !== undefined && this.observers[i] !== undefined) {\r\n try {\r\n fn(this.observers[i]);\r\n }\r\n catch (e) {\r\n // Ignore exceptions raised in Observers or missing methods of an\r\n // Observer.\r\n // Log error to console. b/31404806\r\n if (typeof console !== 'undefined' && console.error) {\r\n console.error(e);\r\n }\r\n }\r\n }\r\n });\r\n }\r\n close(err) {\r\n if (this.finalized) {\r\n return;\r\n }\r\n this.finalized = true;\r\n if (err !== undefined) {\r\n this.finalError = err;\r\n }\r\n // Proxy is no longer needed - garbage collect references\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\r\n this.task.then(() => {\r\n this.observers = undefined;\r\n this.onNoObservers = undefined;\r\n });\r\n }\r\n}\r\n/** Turn synchronous function into one called asynchronously. */\r\n// eslint-disable-next-line @typescript-eslint/ban-types\r\nfunction async(fn, onError) {\r\n return (...args) => {\r\n Promise.resolve(true)\r\n .then(() => {\r\n fn(...args);\r\n })\r\n .catch((error) => {\r\n if (onError) {\r\n onError(error);\r\n }\r\n });\r\n };\r\n}\r\n/**\r\n * Return true if the object passed in implements any of the named methods.\r\n */\r\nfunction implementsAnyMethods(obj, methods) {\r\n if (typeof obj !== 'object' || obj === null) {\r\n return false;\r\n }\r\n for (const method of methods) {\r\n if (method in obj && typeof obj[method] === 'function') {\r\n return true;\r\n }\r\n }\r\n return false;\r\n}\r\nfunction noop() {\r\n // do nothing\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Check to make sure the appropriate number of arguments are provided for a public function.\r\n * Throws an error if it fails.\r\n *\r\n * @param fnName The function name\r\n * @param minCount The minimum number of arguments to allow for the function call\r\n * @param maxCount The maximum number of argument to allow for the function call\r\n * @param argCount The actual number of arguments provided.\r\n */\r\nconst validateArgCount = function (fnName, minCount, maxCount, argCount) {\r\n let argError;\r\n if (argCount < minCount) {\r\n argError = 'at least ' + minCount;\r\n }\r\n else if (argCount > maxCount) {\r\n argError = maxCount === 0 ? 'none' : 'no more than ' + maxCount;\r\n }\r\n if (argError) {\r\n const error = fnName +\r\n ' failed: Was called with ' +\r\n argCount +\r\n (argCount === 1 ? ' argument.' : ' arguments.') +\r\n ' Expects ' +\r\n argError +\r\n '.';\r\n throw new Error(error);\r\n }\r\n};\r\n/**\r\n * Generates a string to prefix an error message about failed argument validation\r\n *\r\n * @param fnName The function name\r\n * @param argName The name of the argument\r\n * @return The prefix to add to the error thrown for validation.\r\n */\r\nfunction errorPrefix(fnName, argName) {\r\n return `${fnName} failed: ${argName} argument `;\r\n}\r\n/**\r\n * @param fnName\r\n * @param argumentNumber\r\n * @param namespace\r\n * @param optional\r\n */\r\nfunction validateNamespace(fnName, namespace, optional) {\r\n if (optional && !namespace) {\r\n return;\r\n }\r\n if (typeof namespace !== 'string') {\r\n //TODO: I should do more validation here. We only allow certain chars in namespaces.\r\n throw new Error(errorPrefix(fnName, 'namespace') + 'must be a valid firebase namespace.');\r\n }\r\n}\r\nfunction validateCallback(fnName, argumentName, \r\n// eslint-disable-next-line @typescript-eslint/ban-types\r\ncallback, optional) {\r\n if (optional && !callback) {\r\n return;\r\n }\r\n if (typeof callback !== 'function') {\r\n throw new Error(errorPrefix(fnName, argumentName) + 'must be a valid function.');\r\n }\r\n}\r\nfunction validateContextObject(fnName, argumentName, context, optional) {\r\n if (optional && !context) {\r\n return;\r\n }\r\n if (typeof context !== 'object' || context === null) {\r\n throw new Error(errorPrefix(fnName, argumentName) + 'must be a valid context object.');\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n// Code originally came from goog.crypt.stringToUtf8ByteArray, but for some reason they\r\n// automatically replaced '\\r\\n' with '\\n', and they didn't handle surrogate pairs,\r\n// so it's been modified.\r\n// Note that not all Unicode characters appear as single characters in JavaScript strings.\r\n// fromCharCode returns the UTF-16 encoding of a character - so some Unicode characters\r\n// use 2 characters in Javascript. All 4-byte UTF-8 characters begin with a first\r\n// character in the range 0xD800 - 0xDBFF (the first character of a so-called surrogate\r\n// pair).\r\n// See http://www.ecma-international.org/ecma-262/5.1/#sec-15.1.3\r\n/**\r\n * @param {string} str\r\n * @return {Array}\r\n */\r\nconst stringToByteArray = function (str) {\r\n const out = [];\r\n let p = 0;\r\n for (let i = 0; i < str.length; i++) {\r\n let c = str.charCodeAt(i);\r\n // Is this the lead surrogate in a surrogate pair?\r\n if (c >= 0xd800 && c <= 0xdbff) {\r\n const high = c - 0xd800; // the high 10 bits.\r\n i++;\r\n assert(i < str.length, 'Surrogate pair missing trail surrogate.');\r\n const low = str.charCodeAt(i) - 0xdc00; // the low 10 bits.\r\n c = 0x10000 + (high << 10) + low;\r\n }\r\n if (c < 128) {\r\n out[p++] = c;\r\n }\r\n else if (c < 2048) {\r\n out[p++] = (c >> 6) | 192;\r\n out[p++] = (c & 63) | 128;\r\n }\r\n else if (c < 65536) {\r\n out[p++] = (c >> 12) | 224;\r\n out[p++] = ((c >> 6) & 63) | 128;\r\n out[p++] = (c & 63) | 128;\r\n }\r\n else {\r\n out[p++] = (c >> 18) | 240;\r\n out[p++] = ((c >> 12) & 63) | 128;\r\n out[p++] = ((c >> 6) & 63) | 128;\r\n out[p++] = (c & 63) | 128;\r\n }\r\n }\r\n return out;\r\n};\r\n/**\r\n * Calculate length without actually converting; useful for doing cheaper validation.\r\n * @param {string} str\r\n * @return {number}\r\n */\r\nconst stringLength = function (str) {\r\n let p = 0;\r\n for (let i = 0; i < str.length; i++) {\r\n const c = str.charCodeAt(i);\r\n if (c < 128) {\r\n p++;\r\n }\r\n else if (c < 2048) {\r\n p += 2;\r\n }\r\n else if (c >= 0xd800 && c <= 0xdbff) {\r\n // Lead surrogate of a surrogate pair. The pair together will take 4 bytes to represent.\r\n p += 4;\r\n i++; // skip trail surrogate.\r\n }\r\n else {\r\n p += 3;\r\n }\r\n }\r\n return p;\r\n};\n\n/**\r\n * @license\r\n * Copyright 2022 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Copied from https://stackoverflow.com/a/2117523\r\n * Generates a new uuid.\r\n * @public\r\n */\r\nconst uuidv4 = function () {\r\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, c => {\r\n const r = (Math.random() * 16) | 0, v = c === 'x' ? r : (r & 0x3) | 0x8;\r\n return v.toString(16);\r\n });\r\n};\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * The amount of milliseconds to exponentially increase.\r\n */\r\nconst DEFAULT_INTERVAL_MILLIS = 1000;\r\n/**\r\n * The factor to backoff by.\r\n * Should be a number greater than 1.\r\n */\r\nconst DEFAULT_BACKOFF_FACTOR = 2;\r\n/**\r\n * The maximum milliseconds to increase to.\r\n *\r\n * Visible for testing\r\n */\r\nconst MAX_VALUE_MILLIS = 4 * 60 * 60 * 1000; // Four hours, like iOS and Android.\r\n/**\r\n * The percentage of backoff time to randomize by.\r\n * See\r\n * http://go/safe-client-behavior#step-1-determine-the-appropriate-retry-interval-to-handle-spike-traffic\r\n * for context.\r\n *\r\n *
Visible for testing\r\n */\r\nconst RANDOM_FACTOR = 0.5;\r\n/**\r\n * Based on the backoff method from\r\n * https://github.com/google/closure-library/blob/master/closure/goog/math/exponentialbackoff.js.\r\n * Extracted here so we don't need to pass metadata and a stateful ExponentialBackoff object around.\r\n */\r\nfunction calculateBackoffMillis(backoffCount, intervalMillis = DEFAULT_INTERVAL_MILLIS, backoffFactor = DEFAULT_BACKOFF_FACTOR) {\r\n // Calculates an exponentially increasing value.\r\n // Deviation: calculates value from count and a constant interval, so we only need to save value\r\n // and count to restore state.\r\n const currBaseValue = intervalMillis * Math.pow(backoffFactor, backoffCount);\r\n // A random \"fuzz\" to avoid waves of retries.\r\n // Deviation: randomFactor is required.\r\n const randomWait = Math.round(\r\n // A fraction of the backoff value to add/subtract.\r\n // Deviation: changes multiplication order to improve readability.\r\n RANDOM_FACTOR *\r\n currBaseValue *\r\n // A random float (rounded to int by Math.round above) in the range [-1, 1]. Determines\r\n // if we add or subtract.\r\n (Math.random() - 0.5) *\r\n 2);\r\n // Limits backoff to max to avoid effectively permanent backoff.\r\n return Math.min(MAX_VALUE_MILLIS, currBaseValue + randomWait);\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Provide English ordinal letters after a number\r\n */\r\nfunction ordinal(i) {\r\n if (!Number.isFinite(i)) {\r\n return `${i}`;\r\n }\r\n return i + indicator(i);\r\n}\r\nfunction indicator(i) {\r\n i = Math.abs(i);\r\n const cent = i % 100;\r\n if (cent >= 10 && cent <= 20) {\r\n return 'th';\r\n }\r\n const dec = i % 10;\r\n if (dec === 1) {\r\n return 'st';\r\n }\r\n if (dec === 2) {\r\n return 'nd';\r\n }\r\n if (dec === 3) {\r\n return 'rd';\r\n }\r\n return 'th';\r\n}\n\n/**\r\n * @license\r\n * Copyright 2021 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction getModularInstance(service) {\r\n if (service && service._delegate) {\r\n return service._delegate;\r\n }\r\n else {\r\n return service;\r\n }\r\n}\n\nexport { CONSTANTS, Deferred, ErrorFactory, FirebaseError, MAX_VALUE_MILLIS, RANDOM_FACTOR, Sha1, areCookiesEnabled, assert, assertionError, async, base64, base64Decode, base64Encode, base64urlEncodeWithoutPadding, calculateBackoffMillis, contains, createMockUserToken, createSubscribe, decode, deepCopy, deepEqual, deepExtend, errorPrefix, extractQuerystring, getDefaultAppConfig, getDefaultEmulatorHost, getDefaultEmulatorHostnameAndPort, getDefaults, getExperimentalSetting, getGlobal, getModularInstance, getUA, isAdmin, isBrowser, isBrowserExtension, isElectron, isEmpty, isIE, isIndexedDBAvailable, isMobileCordova, isNode, isNodeSdk, isReactNative, isSafari, isUWP, isValidFormat, isValidTimestamp, issuedAtTime, jsonEval, map, ordinal, promiseWithTimeout, querystring, querystringDecode, safeGet, stringLength, stringToByteArray, stringify, uuidv4, validateArgCount, validateCallback, validateContextObject, validateIndexedDBOpenable, validateNamespace };\n//# sourceMappingURL=index.esm2017.js.map\n","import { Deferred } from '@firebase/util';\n\n/**\r\n * Component for service name T, e.g. `auth`, `auth-internal`\r\n */\r\nclass Component {\r\n /**\r\n *\r\n * @param name The public service name, e.g. app, auth, firestore, database\r\n * @param instanceFactory Service factory responsible for creating the public interface\r\n * @param type whether the service provided by the component is public or private\r\n */\r\n constructor(name, instanceFactory, type) {\r\n this.name = name;\r\n this.instanceFactory = instanceFactory;\r\n this.type = type;\r\n this.multipleInstances = false;\r\n /**\r\n * Properties to be added to the service namespace\r\n */\r\n this.serviceProps = {};\r\n this.instantiationMode = \"LAZY\" /* InstantiationMode.LAZY */;\r\n this.onInstanceCreated = null;\r\n }\r\n setInstantiationMode(mode) {\r\n this.instantiationMode = mode;\r\n return this;\r\n }\r\n setMultipleInstances(multipleInstances) {\r\n this.multipleInstances = multipleInstances;\r\n return this;\r\n }\r\n setServiceProps(props) {\r\n this.serviceProps = props;\r\n return this;\r\n }\r\n setInstanceCreatedCallback(callback) {\r\n this.onInstanceCreated = callback;\r\n return this;\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst DEFAULT_ENTRY_NAME = '[DEFAULT]';\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Provider for instance for service name T, e.g. 'auth', 'auth-internal'\r\n * NameServiceMapping[T] is an alias for the type of the instance\r\n */\r\nclass Provider {\r\n constructor(name, container) {\r\n this.name = name;\r\n this.container = container;\r\n this.component = null;\r\n this.instances = new Map();\r\n this.instancesDeferred = new Map();\r\n this.instancesOptions = new Map();\r\n this.onInitCallbacks = new Map();\r\n }\r\n /**\r\n * @param identifier A provider can provide mulitple instances of a service\r\n * if this.component.multipleInstances is true.\r\n */\r\n get(identifier) {\r\n // if multipleInstances is not supported, use the default name\r\n const normalizedIdentifier = this.normalizeInstanceIdentifier(identifier);\r\n if (!this.instancesDeferred.has(normalizedIdentifier)) {\r\n const deferred = new Deferred();\r\n this.instancesDeferred.set(normalizedIdentifier, deferred);\r\n if (this.isInitialized(normalizedIdentifier) ||\r\n this.shouldAutoInitialize()) {\r\n // initialize the service if it can be auto-initialized\r\n try {\r\n const instance = this.getOrInitializeService({\r\n instanceIdentifier: normalizedIdentifier\r\n });\r\n if (instance) {\r\n deferred.resolve(instance);\r\n }\r\n }\r\n catch (e) {\r\n // when the instance factory throws an exception during get(), it should not cause\r\n // a fatal error. We just return the unresolved promise in this case.\r\n }\r\n }\r\n }\r\n return this.instancesDeferred.get(normalizedIdentifier).promise;\r\n }\r\n getImmediate(options) {\r\n var _a;\r\n // if multipleInstances is not supported, use the default name\r\n const normalizedIdentifier = this.normalizeInstanceIdentifier(options === null || options === void 0 ? void 0 : options.identifier);\r\n const optional = (_a = options === null || options === void 0 ? void 0 : options.optional) !== null && _a !== void 0 ? _a : false;\r\n if (this.isInitialized(normalizedIdentifier) ||\r\n this.shouldAutoInitialize()) {\r\n try {\r\n return this.getOrInitializeService({\r\n instanceIdentifier: normalizedIdentifier\r\n });\r\n }\r\n catch (e) {\r\n if (optional) {\r\n return null;\r\n }\r\n else {\r\n throw e;\r\n }\r\n }\r\n }\r\n else {\r\n // In case a component is not initialized and should/can not be auto-initialized at the moment, return null if the optional flag is set, or throw\r\n if (optional) {\r\n return null;\r\n }\r\n else {\r\n throw Error(`Service ${this.name} is not available`);\r\n }\r\n }\r\n }\r\n getComponent() {\r\n return this.component;\r\n }\r\n setComponent(component) {\r\n if (component.name !== this.name) {\r\n throw Error(`Mismatching Component ${component.name} for Provider ${this.name}.`);\r\n }\r\n if (this.component) {\r\n throw Error(`Component for ${this.name} has already been provided`);\r\n }\r\n this.component = component;\r\n // return early without attempting to initialize the component if the component requires explicit initialization (calling `Provider.initialize()`)\r\n if (!this.shouldAutoInitialize()) {\r\n return;\r\n }\r\n // if the service is eager, initialize the default instance\r\n if (isComponentEager(component)) {\r\n try {\r\n this.getOrInitializeService({ instanceIdentifier: DEFAULT_ENTRY_NAME });\r\n }\r\n catch (e) {\r\n // when the instance factory for an eager Component throws an exception during the eager\r\n // initialization, it should not cause a fatal error.\r\n // TODO: Investigate if we need to make it configurable, because some component may want to cause\r\n // a fatal error in this case?\r\n }\r\n }\r\n // Create service instances for the pending promises and resolve them\r\n // NOTE: if this.multipleInstances is false, only the default instance will be created\r\n // and all promises with resolve with it regardless of the identifier.\r\n for (const [instanceIdentifier, instanceDeferred] of this.instancesDeferred.entries()) {\r\n const normalizedIdentifier = this.normalizeInstanceIdentifier(instanceIdentifier);\r\n try {\r\n // `getOrInitializeService()` should always return a valid instance since a component is guaranteed. use ! to make typescript happy.\r\n const instance = this.getOrInitializeService({\r\n instanceIdentifier: normalizedIdentifier\r\n });\r\n instanceDeferred.resolve(instance);\r\n }\r\n catch (e) {\r\n // when the instance factory throws an exception, it should not cause\r\n // a fatal error. We just leave the promise unresolved.\r\n }\r\n }\r\n }\r\n clearInstance(identifier = DEFAULT_ENTRY_NAME) {\r\n this.instancesDeferred.delete(identifier);\r\n this.instancesOptions.delete(identifier);\r\n this.instances.delete(identifier);\r\n }\r\n // app.delete() will call this method on every provider to delete the services\r\n // TODO: should we mark the provider as deleted?\r\n async delete() {\r\n const services = Array.from(this.instances.values());\r\n await Promise.all([\r\n ...services\r\n .filter(service => 'INTERNAL' in service) // legacy services\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n .map(service => service.INTERNAL.delete()),\r\n ...services\r\n .filter(service => '_delete' in service) // modularized services\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n .map(service => service._delete())\r\n ]);\r\n }\r\n isComponentSet() {\r\n return this.component != null;\r\n }\r\n isInitialized(identifier = DEFAULT_ENTRY_NAME) {\r\n return this.instances.has(identifier);\r\n }\r\n getOptions(identifier = DEFAULT_ENTRY_NAME) {\r\n return this.instancesOptions.get(identifier) || {};\r\n }\r\n initialize(opts = {}) {\r\n const { options = {} } = opts;\r\n const normalizedIdentifier = this.normalizeInstanceIdentifier(opts.instanceIdentifier);\r\n if (this.isInitialized(normalizedIdentifier)) {\r\n throw Error(`${this.name}(${normalizedIdentifier}) has already been initialized`);\r\n }\r\n if (!this.isComponentSet()) {\r\n throw Error(`Component ${this.name} has not been registered yet`);\r\n }\r\n const instance = this.getOrInitializeService({\r\n instanceIdentifier: normalizedIdentifier,\r\n options\r\n });\r\n // resolve any pending promise waiting for the service instance\r\n for (const [instanceIdentifier, instanceDeferred] of this.instancesDeferred.entries()) {\r\n const normalizedDeferredIdentifier = this.normalizeInstanceIdentifier(instanceIdentifier);\r\n if (normalizedIdentifier === normalizedDeferredIdentifier) {\r\n instanceDeferred.resolve(instance);\r\n }\r\n }\r\n return instance;\r\n }\r\n /**\r\n *\r\n * @param callback - a function that will be invoked after the provider has been initialized by calling provider.initialize().\r\n * The function is invoked SYNCHRONOUSLY, so it should not execute any longrunning tasks in order to not block the program.\r\n *\r\n * @param identifier An optional instance identifier\r\n * @returns a function to unregister the callback\r\n */\r\n onInit(callback, identifier) {\r\n var _a;\r\n const normalizedIdentifier = this.normalizeInstanceIdentifier(identifier);\r\n const existingCallbacks = (_a = this.onInitCallbacks.get(normalizedIdentifier)) !== null && _a !== void 0 ? _a : new Set();\r\n existingCallbacks.add(callback);\r\n this.onInitCallbacks.set(normalizedIdentifier, existingCallbacks);\r\n const existingInstance = this.instances.get(normalizedIdentifier);\r\n if (existingInstance) {\r\n callback(existingInstance, normalizedIdentifier);\r\n }\r\n return () => {\r\n existingCallbacks.delete(callback);\r\n };\r\n }\r\n /**\r\n * Invoke onInit callbacks synchronously\r\n * @param instance the service instance`\r\n */\r\n invokeOnInitCallbacks(instance, identifier) {\r\n const callbacks = this.onInitCallbacks.get(identifier);\r\n if (!callbacks) {\r\n return;\r\n }\r\n for (const callback of callbacks) {\r\n try {\r\n callback(instance, identifier);\r\n }\r\n catch (_a) {\r\n // ignore errors in the onInit callback\r\n }\r\n }\r\n }\r\n getOrInitializeService({ instanceIdentifier, options = {} }) {\r\n let instance = this.instances.get(instanceIdentifier);\r\n if (!instance && this.component) {\r\n instance = this.component.instanceFactory(this.container, {\r\n instanceIdentifier: normalizeIdentifierForFactory(instanceIdentifier),\r\n options\r\n });\r\n this.instances.set(instanceIdentifier, instance);\r\n this.instancesOptions.set(instanceIdentifier, options);\r\n /**\r\n * Invoke onInit listeners.\r\n * Note this.component.onInstanceCreated is different, which is used by the component creator,\r\n * while onInit listeners are registered by consumers of the provider.\r\n */\r\n this.invokeOnInitCallbacks(instance, instanceIdentifier);\r\n /**\r\n * Order is important\r\n * onInstanceCreated() should be called after this.instances.set(instanceIdentifier, instance); which\r\n * makes `isInitialized()` return true.\r\n */\r\n if (this.component.onInstanceCreated) {\r\n try {\r\n this.component.onInstanceCreated(this.container, instanceIdentifier, instance);\r\n }\r\n catch (_a) {\r\n // ignore errors in the onInstanceCreatedCallback\r\n }\r\n }\r\n }\r\n return instance || null;\r\n }\r\n normalizeInstanceIdentifier(identifier = DEFAULT_ENTRY_NAME) {\r\n if (this.component) {\r\n return this.component.multipleInstances ? identifier : DEFAULT_ENTRY_NAME;\r\n }\r\n else {\r\n return identifier; // assume multiple instances are supported before the component is provided.\r\n }\r\n }\r\n shouldAutoInitialize() {\r\n return (!!this.component &&\r\n this.component.instantiationMode !== \"EXPLICIT\" /* InstantiationMode.EXPLICIT */);\r\n }\r\n}\r\n// undefined should be passed to the service factory for the default instance\r\nfunction normalizeIdentifierForFactory(identifier) {\r\n return identifier === DEFAULT_ENTRY_NAME ? undefined : identifier;\r\n}\r\nfunction isComponentEager(component) {\r\n return component.instantiationMode === \"EAGER\" /* InstantiationMode.EAGER */;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * ComponentContainer that provides Providers for service name T, e.g. `auth`, `auth-internal`\r\n */\r\nclass ComponentContainer {\r\n constructor(name) {\r\n this.name = name;\r\n this.providers = new Map();\r\n }\r\n /**\r\n *\r\n * @param component Component being added\r\n * @param overwrite When a component with the same name has already been registered,\r\n * if overwrite is true: overwrite the existing component with the new component and create a new\r\n * provider with the new component. It can be useful in tests where you want to use different mocks\r\n * for different tests.\r\n * if overwrite is false: throw an exception\r\n */\r\n addComponent(component) {\r\n const provider = this.getProvider(component.name);\r\n if (provider.isComponentSet()) {\r\n throw new Error(`Component ${component.name} has already been registered with ${this.name}`);\r\n }\r\n provider.setComponent(component);\r\n }\r\n addOrOverwriteComponent(component) {\r\n const provider = this.getProvider(component.name);\r\n if (provider.isComponentSet()) {\r\n // delete the existing provider from the container, so we can register the new component\r\n this.providers.delete(component.name);\r\n }\r\n this.addComponent(component);\r\n }\r\n /**\r\n * getProvider provides a type safe interface where it can only be called with a field name\r\n * present in NameServiceMapping interface.\r\n *\r\n * Firebase SDKs providing services should extend NameServiceMapping interface to register\r\n * themselves.\r\n */\r\n getProvider(name) {\r\n if (this.providers.has(name)) {\r\n return this.providers.get(name);\r\n }\r\n // create a Provider for a service that hasn't registered with Firebase\r\n const provider = new Provider(name, this);\r\n this.providers.set(name, provider);\r\n return provider;\r\n }\r\n getProviders() {\r\n return Array.from(this.providers.values());\r\n }\r\n}\n\nexport { Component, ComponentContainer, Provider };\n//# sourceMappingURL=index.esm2017.js.map\n","/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * A container for all of the Logger instances\r\n */\r\nconst instances = [];\r\n/**\r\n * The JS SDK supports 5 log levels and also allows a user the ability to\r\n * silence the logs altogether.\r\n *\r\n * The order is a follows:\r\n * DEBUG < VERBOSE < INFO < WARN < ERROR\r\n *\r\n * All of the log types above the current log level will be captured (i.e. if\r\n * you set the log level to `INFO`, errors will still be logged, but `DEBUG` and\r\n * `VERBOSE` logs will not)\r\n */\r\nvar LogLevel;\r\n(function (LogLevel) {\r\n LogLevel[LogLevel[\"DEBUG\"] = 0] = \"DEBUG\";\r\n LogLevel[LogLevel[\"VERBOSE\"] = 1] = \"VERBOSE\";\r\n LogLevel[LogLevel[\"INFO\"] = 2] = \"INFO\";\r\n LogLevel[LogLevel[\"WARN\"] = 3] = \"WARN\";\r\n LogLevel[LogLevel[\"ERROR\"] = 4] = \"ERROR\";\r\n LogLevel[LogLevel[\"SILENT\"] = 5] = \"SILENT\";\r\n})(LogLevel || (LogLevel = {}));\r\nconst levelStringToEnum = {\r\n 'debug': LogLevel.DEBUG,\r\n 'verbose': LogLevel.VERBOSE,\r\n 'info': LogLevel.INFO,\r\n 'warn': LogLevel.WARN,\r\n 'error': LogLevel.ERROR,\r\n 'silent': LogLevel.SILENT\r\n};\r\n/**\r\n * The default log level\r\n */\r\nconst defaultLogLevel = LogLevel.INFO;\r\n/**\r\n * By default, `console.debug` is not displayed in the developer console (in\r\n * chrome). To avoid forcing users to have to opt-in to these logs twice\r\n * (i.e. once for firebase, and once in the console), we are sending `DEBUG`\r\n * logs to the `console.log` function.\r\n */\r\nconst ConsoleMethod = {\r\n [LogLevel.DEBUG]: 'log',\r\n [LogLevel.VERBOSE]: 'log',\r\n [LogLevel.INFO]: 'info',\r\n [LogLevel.WARN]: 'warn',\r\n [LogLevel.ERROR]: 'error'\r\n};\r\n/**\r\n * The default log handler will forward DEBUG, VERBOSE, INFO, WARN, and ERROR\r\n * messages on to their corresponding console counterparts (if the log method\r\n * is supported by the current log level)\r\n */\r\nconst defaultLogHandler = (instance, logType, ...args) => {\r\n if (logType < instance.logLevel) {\r\n return;\r\n }\r\n const now = new Date().toISOString();\r\n const method = ConsoleMethod[logType];\r\n if (method) {\r\n console[method](`[${now}] ${instance.name}:`, ...args);\r\n }\r\n else {\r\n throw new Error(`Attempted to log a message with an invalid logType (value: ${logType})`);\r\n }\r\n};\r\nclass Logger {\r\n /**\r\n * Gives you an instance of a Logger to capture messages according to\r\n * Firebase's logging scheme.\r\n *\r\n * @param name The name that the logs will be associated with\r\n */\r\n constructor(name) {\r\n this.name = name;\r\n /**\r\n * The log level of the given Logger instance.\r\n */\r\n this._logLevel = defaultLogLevel;\r\n /**\r\n * The main (internal) log handler for the Logger instance.\r\n * Can be set to a new function in internal package code but not by user.\r\n */\r\n this._logHandler = defaultLogHandler;\r\n /**\r\n * The optional, additional, user-defined log handler for the Logger instance.\r\n */\r\n this._userLogHandler = null;\r\n /**\r\n * Capture the current instance for later use\r\n */\r\n instances.push(this);\r\n }\r\n get logLevel() {\r\n return this._logLevel;\r\n }\r\n set logLevel(val) {\r\n if (!(val in LogLevel)) {\r\n throw new TypeError(`Invalid value \"${val}\" assigned to \\`logLevel\\``);\r\n }\r\n this._logLevel = val;\r\n }\r\n // Workaround for setter/getter having to be the same type.\r\n setLogLevel(val) {\r\n this._logLevel = typeof val === 'string' ? levelStringToEnum[val] : val;\r\n }\r\n get logHandler() {\r\n return this._logHandler;\r\n }\r\n set logHandler(val) {\r\n if (typeof val !== 'function') {\r\n throw new TypeError('Value assigned to `logHandler` must be a function');\r\n }\r\n this._logHandler = val;\r\n }\r\n get userLogHandler() {\r\n return this._userLogHandler;\r\n }\r\n set userLogHandler(val) {\r\n this._userLogHandler = val;\r\n }\r\n /**\r\n * The functions below are all based on the `console` interface\r\n */\r\n debug(...args) {\r\n this._userLogHandler && this._userLogHandler(this, LogLevel.DEBUG, ...args);\r\n this._logHandler(this, LogLevel.DEBUG, ...args);\r\n }\r\n log(...args) {\r\n this._userLogHandler &&\r\n this._userLogHandler(this, LogLevel.VERBOSE, ...args);\r\n this._logHandler(this, LogLevel.VERBOSE, ...args);\r\n }\r\n info(...args) {\r\n this._userLogHandler && this._userLogHandler(this, LogLevel.INFO, ...args);\r\n this._logHandler(this, LogLevel.INFO, ...args);\r\n }\r\n warn(...args) {\r\n this._userLogHandler && this._userLogHandler(this, LogLevel.WARN, ...args);\r\n this._logHandler(this, LogLevel.WARN, ...args);\r\n }\r\n error(...args) {\r\n this._userLogHandler && this._userLogHandler(this, LogLevel.ERROR, ...args);\r\n this._logHandler(this, LogLevel.ERROR, ...args);\r\n }\r\n}\r\nfunction setLogLevel(level) {\r\n instances.forEach(inst => {\r\n inst.setLogLevel(level);\r\n });\r\n}\r\nfunction setUserLogHandler(logCallback, options) {\r\n for (const instance of instances) {\r\n let customLogLevel = null;\r\n if (options && options.level) {\r\n customLogLevel = levelStringToEnum[options.level];\r\n }\r\n if (logCallback === null) {\r\n instance.userLogHandler = null;\r\n }\r\n else {\r\n instance.userLogHandler = (instance, level, ...args) => {\r\n const message = args\r\n .map(arg => {\r\n if (arg == null) {\r\n return null;\r\n }\r\n else if (typeof arg === 'string') {\r\n return arg;\r\n }\r\n else if (typeof arg === 'number' || typeof arg === 'boolean') {\r\n return arg.toString();\r\n }\r\n else if (arg instanceof Error) {\r\n return arg.message;\r\n }\r\n else {\r\n try {\r\n return JSON.stringify(arg);\r\n }\r\n catch (ignored) {\r\n return null;\r\n }\r\n }\r\n })\r\n .filter(arg => arg)\r\n .join(' ');\r\n if (level >= (customLogLevel !== null && customLogLevel !== void 0 ? customLogLevel : instance.logLevel)) {\r\n logCallback({\r\n level: LogLevel[level].toLowerCase(),\r\n message,\r\n args,\r\n type: instance.name\r\n });\r\n }\r\n };\r\n }\r\n }\r\n}\n\nexport { LogLevel, Logger, setLogLevel, setUserLogHandler };\n//# sourceMappingURL=index.esm2017.js.map\n","const instanceOfAny = (object, constructors) => constructors.some((c) => object instanceof c);\n\nlet idbProxyableTypes;\nlet cursorAdvanceMethods;\n// This is a function to prevent it throwing up in node environments.\nfunction getIdbProxyableTypes() {\n return (idbProxyableTypes ||\n (idbProxyableTypes = [\n IDBDatabase,\n IDBObjectStore,\n IDBIndex,\n IDBCursor,\n IDBTransaction,\n ]));\n}\n// This is a function to prevent it throwing up in node environments.\nfunction getCursorAdvanceMethods() {\n return (cursorAdvanceMethods ||\n (cursorAdvanceMethods = [\n IDBCursor.prototype.advance,\n IDBCursor.prototype.continue,\n IDBCursor.prototype.continuePrimaryKey,\n ]));\n}\nconst cursorRequestMap = new WeakMap();\nconst transactionDoneMap = new WeakMap();\nconst transactionStoreNamesMap = new WeakMap();\nconst transformCache = new WeakMap();\nconst reverseTransformCache = new WeakMap();\nfunction promisifyRequest(request) {\n const promise = new Promise((resolve, reject) => {\n const unlisten = () => {\n request.removeEventListener('success', success);\n request.removeEventListener('error', error);\n };\n const success = () => {\n resolve(wrap(request.result));\n unlisten();\n };\n const error = () => {\n reject(request.error);\n unlisten();\n };\n request.addEventListener('success', success);\n request.addEventListener('error', error);\n });\n promise\n .then((value) => {\n // Since cursoring reuses the IDBRequest (*sigh*), we cache it for later retrieval\n // (see wrapFunction).\n if (value instanceof IDBCursor) {\n cursorRequestMap.set(value, request);\n }\n // Catching to avoid \"Uncaught Promise exceptions\"\n })\n .catch(() => { });\n // This mapping exists in reverseTransformCache but doesn't doesn't exist in transformCache. This\n // is because we create many promises from a single IDBRequest.\n reverseTransformCache.set(promise, request);\n return promise;\n}\nfunction cacheDonePromiseForTransaction(tx) {\n // Early bail if we've already created a done promise for this transaction.\n if (transactionDoneMap.has(tx))\n return;\n const done = new Promise((resolve, reject) => {\n const unlisten = () => {\n tx.removeEventListener('complete', complete);\n tx.removeEventListener('error', error);\n tx.removeEventListener('abort', error);\n };\n const complete = () => {\n resolve();\n unlisten();\n };\n const error = () => {\n reject(tx.error || new DOMException('AbortError', 'AbortError'));\n unlisten();\n };\n tx.addEventListener('complete', complete);\n tx.addEventListener('error', error);\n tx.addEventListener('abort', error);\n });\n // Cache it for later retrieval.\n transactionDoneMap.set(tx, done);\n}\nlet idbProxyTraps = {\n get(target, prop, receiver) {\n if (target instanceof IDBTransaction) {\n // Special handling for transaction.done.\n if (prop === 'done')\n return transactionDoneMap.get(target);\n // Polyfill for objectStoreNames because of Edge.\n if (prop === 'objectStoreNames') {\n return target.objectStoreNames || transactionStoreNamesMap.get(target);\n }\n // Make tx.store return the only store in the transaction, or undefined if there are many.\n if (prop === 'store') {\n return receiver.objectStoreNames[1]\n ? undefined\n : receiver.objectStore(receiver.objectStoreNames[0]);\n }\n }\n // Else transform whatever we get back.\n return wrap(target[prop]);\n },\n set(target, prop, value) {\n target[prop] = value;\n return true;\n },\n has(target, prop) {\n if (target instanceof IDBTransaction &&\n (prop === 'done' || prop === 'store')) {\n return true;\n }\n return prop in target;\n },\n};\nfunction replaceTraps(callback) {\n idbProxyTraps = callback(idbProxyTraps);\n}\nfunction wrapFunction(func) {\n // Due to expected object equality (which is enforced by the caching in `wrap`), we\n // only create one new func per func.\n // Edge doesn't support objectStoreNames (booo), so we polyfill it here.\n if (func === IDBDatabase.prototype.transaction &&\n !('objectStoreNames' in IDBTransaction.prototype)) {\n return function (storeNames, ...args) {\n const tx = func.call(unwrap(this), storeNames, ...args);\n transactionStoreNamesMap.set(tx, storeNames.sort ? storeNames.sort() : [storeNames]);\n return wrap(tx);\n };\n }\n // Cursor methods are special, as the behaviour is a little more different to standard IDB. In\n // IDB, you advance the cursor and wait for a new 'success' on the IDBRequest that gave you the\n // cursor. It's kinda like a promise that can resolve with many values. That doesn't make sense\n // with real promises, so each advance methods returns a new promise for the cursor object, or\n // undefined if the end of the cursor has been reached.\n if (getCursorAdvanceMethods().includes(func)) {\n return function (...args) {\n // Calling the original function with the proxy as 'this' causes ILLEGAL INVOCATION, so we use\n // the original object.\n func.apply(unwrap(this), args);\n return wrap(cursorRequestMap.get(this));\n };\n }\n return function (...args) {\n // Calling the original function with the proxy as 'this' causes ILLEGAL INVOCATION, so we use\n // the original object.\n return wrap(func.apply(unwrap(this), args));\n };\n}\nfunction transformCachableValue(value) {\n if (typeof value === 'function')\n return wrapFunction(value);\n // This doesn't return, it just creates a 'done' promise for the transaction,\n // which is later returned for transaction.done (see idbObjectHandler).\n if (value instanceof IDBTransaction)\n cacheDonePromiseForTransaction(value);\n if (instanceOfAny(value, getIdbProxyableTypes()))\n return new Proxy(value, idbProxyTraps);\n // Return the same value back if we're not going to transform it.\n return value;\n}\nfunction wrap(value) {\n // We sometimes generate multiple promises from a single IDBRequest (eg when cursoring), because\n // IDB is weird and a single IDBRequest can yield many responses, so these can't be cached.\n if (value instanceof IDBRequest)\n return promisifyRequest(value);\n // If we've already transformed this value before, reuse the transformed value.\n // This is faster, but it also provides object equality.\n if (transformCache.has(value))\n return transformCache.get(value);\n const newValue = transformCachableValue(value);\n // Not all types are transformed.\n // These may be primitive types, so they can't be WeakMap keys.\n if (newValue !== value) {\n transformCache.set(value, newValue);\n reverseTransformCache.set(newValue, value);\n }\n return newValue;\n}\nconst unwrap = (value) => reverseTransformCache.get(value);\n\nexport { reverseTransformCache as a, instanceOfAny as i, replaceTraps as r, unwrap as u, wrap as w };\n","import { w as wrap, r as replaceTraps } from './wrap-idb-value.js';\nexport { u as unwrap, w as wrap } from './wrap-idb-value.js';\n\n/**\n * Open a database.\n *\n * @param name Name of the database.\n * @param version Schema version.\n * @param callbacks Additional callbacks.\n */\nfunction openDB(name, version, { blocked, upgrade, blocking, terminated } = {}) {\n const request = indexedDB.open(name, version);\n const openPromise = wrap(request);\n if (upgrade) {\n request.addEventListener('upgradeneeded', (event) => {\n upgrade(wrap(request.result), event.oldVersion, event.newVersion, wrap(request.transaction));\n });\n }\n if (blocked)\n request.addEventListener('blocked', () => blocked());\n openPromise\n .then((db) => {\n if (terminated)\n db.addEventListener('close', () => terminated());\n if (blocking)\n db.addEventListener('versionchange', () => blocking());\n })\n .catch(() => { });\n return openPromise;\n}\n/**\n * Delete a database.\n *\n * @param name Name of the database.\n */\nfunction deleteDB(name, { blocked } = {}) {\n const request = indexedDB.deleteDatabase(name);\n if (blocked)\n request.addEventListener('blocked', () => blocked());\n return wrap(request).then(() => undefined);\n}\n\nconst readMethods = ['get', 'getKey', 'getAll', 'getAllKeys', 'count'];\nconst writeMethods = ['put', 'add', 'delete', 'clear'];\nconst cachedMethods = new Map();\nfunction getMethod(target, prop) {\n if (!(target instanceof IDBDatabase &&\n !(prop in target) &&\n typeof prop === 'string')) {\n return;\n }\n if (cachedMethods.get(prop))\n return cachedMethods.get(prop);\n const targetFuncName = prop.replace(/FromIndex$/, '');\n const useIndex = prop !== targetFuncName;\n const isWrite = writeMethods.includes(targetFuncName);\n if (\n // Bail if the target doesn't exist on the target. Eg, getAll isn't in Edge.\n !(targetFuncName in (useIndex ? IDBIndex : IDBObjectStore).prototype) ||\n !(isWrite || readMethods.includes(targetFuncName))) {\n return;\n }\n const method = async function (storeName, ...args) {\n // isWrite ? 'readwrite' : undefined gzipps better, but fails in Edge :(\n const tx = this.transaction(storeName, isWrite ? 'readwrite' : 'readonly');\n let target = tx.store;\n if (useIndex)\n target = target.index(args.shift());\n // Must reject if op rejects.\n // If it's a write operation, must reject if tx.done rejects.\n // Must reject with op rejection first.\n // Must resolve with op value.\n // Must handle both promises (no unhandled rejections)\n return (await Promise.all([\n target[targetFuncName](...args),\n isWrite && tx.done,\n ]))[0];\n };\n cachedMethods.set(prop, method);\n return method;\n}\nreplaceTraps((oldTraps) => ({\n ...oldTraps,\n get: (target, prop, receiver) => getMethod(target, prop) || oldTraps.get(target, prop, receiver),\n has: (target, prop) => !!getMethod(target, prop) || oldTraps.has(target, prop),\n}));\n\nexport { deleteDB, openDB };\n","import { Component, ComponentContainer } from '@firebase/component';\nimport { Logger, setUserLogHandler, setLogLevel as setLogLevel$1 } from '@firebase/logger';\nimport { ErrorFactory, getDefaultAppConfig, deepEqual, FirebaseError, base64urlEncodeWithoutPadding, isIndexedDBAvailable, validateIndexedDBOpenable } from '@firebase/util';\nexport { FirebaseError } from '@firebase/util';\nimport { openDB } from 'idb';\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nclass PlatformLoggerServiceImpl {\r\n constructor(container) {\r\n this.container = container;\r\n }\r\n // In initial implementation, this will be called by installations on\r\n // auth token refresh, and installations will send this string.\r\n getPlatformInfoString() {\r\n const providers = this.container.getProviders();\r\n // Loop through providers and get library/version pairs from any that are\r\n // version components.\r\n return providers\r\n .map(provider => {\r\n if (isVersionServiceProvider(provider)) {\r\n const service = provider.getImmediate();\r\n return `${service.library}/${service.version}`;\r\n }\r\n else {\r\n return null;\r\n }\r\n })\r\n .filter(logString => logString)\r\n .join(' ');\r\n }\r\n}\r\n/**\r\n *\r\n * @param provider check if this provider provides a VersionService\r\n *\r\n * NOTE: Using Provider<'app-version'> is a hack to indicate that the provider\r\n * provides VersionService. The provider is not necessarily a 'app-version'\r\n * provider.\r\n */\r\nfunction isVersionServiceProvider(provider) {\r\n const component = provider.getComponent();\r\n return (component === null || component === void 0 ? void 0 : component.type) === \"VERSION\" /* ComponentType.VERSION */;\r\n}\n\nconst name$o = \"@firebase/app\";\nconst version$1 = \"0.9.1\";\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst logger = new Logger('@firebase/app');\n\nconst name$n = \"@firebase/app-compat\";\n\nconst name$m = \"@firebase/analytics-compat\";\n\nconst name$l = \"@firebase/analytics\";\n\nconst name$k = \"@firebase/app-check-compat\";\n\nconst name$j = \"@firebase/app-check\";\n\nconst name$i = \"@firebase/auth\";\n\nconst name$h = \"@firebase/auth-compat\";\n\nconst name$g = \"@firebase/database\";\n\nconst name$f = \"@firebase/database-compat\";\n\nconst name$e = \"@firebase/functions\";\n\nconst name$d = \"@firebase/functions-compat\";\n\nconst name$c = \"@firebase/installations\";\n\nconst name$b = \"@firebase/installations-compat\";\n\nconst name$a = \"@firebase/messaging\";\n\nconst name$9 = \"@firebase/messaging-compat\";\n\nconst name$8 = \"@firebase/performance\";\n\nconst name$7 = \"@firebase/performance-compat\";\n\nconst name$6 = \"@firebase/remote-config\";\n\nconst name$5 = \"@firebase/remote-config-compat\";\n\nconst name$4 = \"@firebase/storage\";\n\nconst name$3 = \"@firebase/storage-compat\";\n\nconst name$2 = \"@firebase/firestore\";\n\nconst name$1 = \"@firebase/firestore-compat\";\n\nconst name = \"firebase\";\nconst version = \"9.16.0\";\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * The default app name\r\n *\r\n * @internal\r\n */\r\nconst DEFAULT_ENTRY_NAME = '[DEFAULT]';\r\nconst PLATFORM_LOG_STRING = {\r\n [name$o]: 'fire-core',\r\n [name$n]: 'fire-core-compat',\r\n [name$l]: 'fire-analytics',\r\n [name$m]: 'fire-analytics-compat',\r\n [name$j]: 'fire-app-check',\r\n [name$k]: 'fire-app-check-compat',\r\n [name$i]: 'fire-auth',\r\n [name$h]: 'fire-auth-compat',\r\n [name$g]: 'fire-rtdb',\r\n [name$f]: 'fire-rtdb-compat',\r\n [name$e]: 'fire-fn',\r\n [name$d]: 'fire-fn-compat',\r\n [name$c]: 'fire-iid',\r\n [name$b]: 'fire-iid-compat',\r\n [name$a]: 'fire-fcm',\r\n [name$9]: 'fire-fcm-compat',\r\n [name$8]: 'fire-perf',\r\n [name$7]: 'fire-perf-compat',\r\n [name$6]: 'fire-rc',\r\n [name$5]: 'fire-rc-compat',\r\n [name$4]: 'fire-gcs',\r\n [name$3]: 'fire-gcs-compat',\r\n [name$2]: 'fire-fst',\r\n [name$1]: 'fire-fst-compat',\r\n 'fire-js': 'fire-js',\r\n [name]: 'fire-js-all'\r\n};\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * @internal\r\n */\r\nconst _apps = new Map();\r\n/**\r\n * Registered components.\r\n *\r\n * @internal\r\n */\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\nconst _components = new Map();\r\n/**\r\n * @param component - the component being added to this app's container\r\n *\r\n * @internal\r\n */\r\nfunction _addComponent(app, component) {\r\n try {\r\n app.container.addComponent(component);\r\n }\r\n catch (e) {\r\n logger.debug(`Component ${component.name} failed to register with FirebaseApp ${app.name}`, e);\r\n }\r\n}\r\n/**\r\n *\r\n * @internal\r\n */\r\nfunction _addOrOverwriteComponent(app, component) {\r\n app.container.addOrOverwriteComponent(component);\r\n}\r\n/**\r\n *\r\n * @param component - the component to register\r\n * @returns whether or not the component is registered successfully\r\n *\r\n * @internal\r\n */\r\nfunction _registerComponent(component) {\r\n const componentName = component.name;\r\n if (_components.has(componentName)) {\r\n logger.debug(`There were multiple attempts to register component ${componentName}.`);\r\n return false;\r\n }\r\n _components.set(componentName, component);\r\n // add the component to existing app instances\r\n for (const app of _apps.values()) {\r\n _addComponent(app, component);\r\n }\r\n return true;\r\n}\r\n/**\r\n *\r\n * @param app - FirebaseApp instance\r\n * @param name - service name\r\n *\r\n * @returns the provider for the service with the matching name\r\n *\r\n * @internal\r\n */\r\nfunction _getProvider(app, name) {\r\n const heartbeatController = app.container\r\n .getProvider('heartbeat')\r\n .getImmediate({ optional: true });\r\n if (heartbeatController) {\r\n void heartbeatController.triggerHeartbeat();\r\n }\r\n return app.container.getProvider(name);\r\n}\r\n/**\r\n *\r\n * @param app - FirebaseApp instance\r\n * @param name - service name\r\n * @param instanceIdentifier - service instance identifier in case the service supports multiple instances\r\n *\r\n * @internal\r\n */\r\nfunction _removeServiceInstance(app, name, instanceIdentifier = DEFAULT_ENTRY_NAME) {\r\n _getProvider(app, name).clearInstance(instanceIdentifier);\r\n}\r\n/**\r\n * Test only\r\n *\r\n * @internal\r\n */\r\nfunction _clearComponents() {\r\n _components.clear();\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst ERRORS = {\r\n [\"no-app\" /* AppError.NO_APP */]: \"No Firebase App '{$appName}' has been created - \" +\r\n 'call Firebase App.initializeApp()',\r\n [\"bad-app-name\" /* AppError.BAD_APP_NAME */]: \"Illegal App name: '{$appName}\",\r\n [\"duplicate-app\" /* AppError.DUPLICATE_APP */]: \"Firebase App named '{$appName}' already exists with different options or config\",\r\n [\"app-deleted\" /* AppError.APP_DELETED */]: \"Firebase App named '{$appName}' already deleted\",\r\n [\"no-options\" /* AppError.NO_OPTIONS */]: 'Need to provide options, when not being deployed to hosting via source.',\r\n [\"invalid-app-argument\" /* AppError.INVALID_APP_ARGUMENT */]: 'firebase.{$appName}() takes either no argument or a ' +\r\n 'Firebase App instance.',\r\n [\"invalid-log-argument\" /* AppError.INVALID_LOG_ARGUMENT */]: 'First argument to `onLog` must be null or a function.',\r\n [\"idb-open\" /* AppError.IDB_OPEN */]: 'Error thrown when opening IndexedDB. Original error: {$originalErrorMessage}.',\r\n [\"idb-get\" /* AppError.IDB_GET */]: 'Error thrown when reading from IndexedDB. Original error: {$originalErrorMessage}.',\r\n [\"idb-set\" /* AppError.IDB_WRITE */]: 'Error thrown when writing to IndexedDB. Original error: {$originalErrorMessage}.',\r\n [\"idb-delete\" /* AppError.IDB_DELETE */]: 'Error thrown when deleting from IndexedDB. Original error: {$originalErrorMessage}.'\r\n};\r\nconst ERROR_FACTORY = new ErrorFactory('app', 'Firebase', ERRORS);\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nclass FirebaseAppImpl {\r\n constructor(options, config, container) {\r\n this._isDeleted = false;\r\n this._options = Object.assign({}, options);\r\n this._config = Object.assign({}, config);\r\n this._name = config.name;\r\n this._automaticDataCollectionEnabled =\r\n config.automaticDataCollectionEnabled;\r\n this._container = container;\r\n this.container.addComponent(new Component('app', () => this, \"PUBLIC\" /* ComponentType.PUBLIC */));\r\n }\r\n get automaticDataCollectionEnabled() {\r\n this.checkDestroyed();\r\n return this._automaticDataCollectionEnabled;\r\n }\r\n set automaticDataCollectionEnabled(val) {\r\n this.checkDestroyed();\r\n this._automaticDataCollectionEnabled = val;\r\n }\r\n get name() {\r\n this.checkDestroyed();\r\n return this._name;\r\n }\r\n get options() {\r\n this.checkDestroyed();\r\n return this._options;\r\n }\r\n get config() {\r\n this.checkDestroyed();\r\n return this._config;\r\n }\r\n get container() {\r\n return this._container;\r\n }\r\n get isDeleted() {\r\n return this._isDeleted;\r\n }\r\n set isDeleted(val) {\r\n this._isDeleted = val;\r\n }\r\n /**\r\n * This function will throw an Error if the App has already been deleted -\r\n * use before performing API actions on the App.\r\n */\r\n checkDestroyed() {\r\n if (this.isDeleted) {\r\n throw ERROR_FACTORY.create(\"app-deleted\" /* AppError.APP_DELETED */, { appName: this._name });\r\n }\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * The current SDK version.\r\n *\r\n * @public\r\n */\r\nconst SDK_VERSION = version;\r\nfunction initializeApp(_options, rawConfig = {}) {\r\n let options = _options;\r\n if (typeof rawConfig !== 'object') {\r\n const name = rawConfig;\r\n rawConfig = { name };\r\n }\r\n const config = Object.assign({ name: DEFAULT_ENTRY_NAME, automaticDataCollectionEnabled: false }, rawConfig);\r\n const name = config.name;\r\n if (typeof name !== 'string' || !name) {\r\n throw ERROR_FACTORY.create(\"bad-app-name\" /* AppError.BAD_APP_NAME */, {\r\n appName: String(name)\r\n });\r\n }\r\n options || (options = getDefaultAppConfig());\r\n if (!options) {\r\n throw ERROR_FACTORY.create(\"no-options\" /* AppError.NO_OPTIONS */);\r\n }\r\n const existingApp = _apps.get(name);\r\n if (existingApp) {\r\n // return the existing app if options and config deep equal the ones in the existing app.\r\n if (deepEqual(options, existingApp.options) &&\r\n deepEqual(config, existingApp.config)) {\r\n return existingApp;\r\n }\r\n else {\r\n throw ERROR_FACTORY.create(\"duplicate-app\" /* AppError.DUPLICATE_APP */, { appName: name });\r\n }\r\n }\r\n const container = new ComponentContainer(name);\r\n for (const component of _components.values()) {\r\n container.addComponent(component);\r\n }\r\n const newApp = new FirebaseAppImpl(options, config, container);\r\n _apps.set(name, newApp);\r\n return newApp;\r\n}\r\n/**\r\n * Retrieves a {@link @firebase/app#FirebaseApp} instance.\r\n *\r\n * When called with no arguments, the default app is returned. When an app name\r\n * is provided, the app corresponding to that name is returned.\r\n *\r\n * An exception is thrown if the app being retrieved has not yet been\r\n * initialized.\r\n *\r\n * @example\r\n * ```javascript\r\n * // Return the default app\r\n * const app = getApp();\r\n * ```\r\n *\r\n * @example\r\n * ```javascript\r\n * // Return a named app\r\n * const otherApp = getApp(\"otherApp\");\r\n * ```\r\n *\r\n * @param name - Optional name of the app to return. If no name is\r\n * provided, the default is `\"[DEFAULT]\"`.\r\n *\r\n * @returns The app corresponding to the provided app name.\r\n * If no app name is provided, the default app is returned.\r\n *\r\n * @public\r\n */\r\nfunction getApp(name = DEFAULT_ENTRY_NAME) {\r\n const app = _apps.get(name);\r\n if (!app && name === DEFAULT_ENTRY_NAME) {\r\n return initializeApp();\r\n }\r\n if (!app) {\r\n throw ERROR_FACTORY.create(\"no-app\" /* AppError.NO_APP */, { appName: name });\r\n }\r\n return app;\r\n}\r\n/**\r\n * A (read-only) array of all initialized apps.\r\n * @public\r\n */\r\nfunction getApps() {\r\n return Array.from(_apps.values());\r\n}\r\n/**\r\n * Renders this app unusable and frees the resources of all associated\r\n * services.\r\n *\r\n * @example\r\n * ```javascript\r\n * deleteApp(app)\r\n * .then(function() {\r\n * console.log(\"App deleted successfully\");\r\n * })\r\n * .catch(function(error) {\r\n * console.log(\"Error deleting app:\", error);\r\n * });\r\n * ```\r\n *\r\n * @public\r\n */\r\nasync function deleteApp(app) {\r\n const name = app.name;\r\n if (_apps.has(name)) {\r\n _apps.delete(name);\r\n await Promise.all(app.container\r\n .getProviders()\r\n .map(provider => provider.delete()));\r\n app.isDeleted = true;\r\n }\r\n}\r\n/**\r\n * Registers a library's name and version for platform logging purposes.\r\n * @param library - Name of 1p or 3p library (e.g. firestore, angularfire)\r\n * @param version - Current version of that library.\r\n * @param variant - Bundle variant, e.g., node, rn, etc.\r\n *\r\n * @public\r\n */\r\nfunction registerVersion(libraryKeyOrName, version, variant) {\r\n var _a;\r\n // TODO: We can use this check to whitelist strings when/if we set up\r\n // a good whitelist system.\r\n let library = (_a = PLATFORM_LOG_STRING[libraryKeyOrName]) !== null && _a !== void 0 ? _a : libraryKeyOrName;\r\n if (variant) {\r\n library += `-${variant}`;\r\n }\r\n const libraryMismatch = library.match(/\\s|\\//);\r\n const versionMismatch = version.match(/\\s|\\//);\r\n if (libraryMismatch || versionMismatch) {\r\n const warning = [\r\n `Unable to register library \"${library}\" with version \"${version}\":`\r\n ];\r\n if (libraryMismatch) {\r\n warning.push(`library name \"${library}\" contains illegal characters (whitespace or \"/\")`);\r\n }\r\n if (libraryMismatch && versionMismatch) {\r\n warning.push('and');\r\n }\r\n if (versionMismatch) {\r\n warning.push(`version name \"${version}\" contains illegal characters (whitespace or \"/\")`);\r\n }\r\n logger.warn(warning.join(' '));\r\n return;\r\n }\r\n _registerComponent(new Component(`${library}-version`, () => ({ library, version }), \"VERSION\" /* ComponentType.VERSION */));\r\n}\r\n/**\r\n * Sets log handler for all Firebase SDKs.\r\n * @param logCallback - An optional custom log handler that executes user code whenever\r\n * the Firebase SDK makes a logging call.\r\n *\r\n * @public\r\n */\r\nfunction onLog(logCallback, options) {\r\n if (logCallback !== null && typeof logCallback !== 'function') {\r\n throw ERROR_FACTORY.create(\"invalid-log-argument\" /* AppError.INVALID_LOG_ARGUMENT */);\r\n }\r\n setUserLogHandler(logCallback, options);\r\n}\r\n/**\r\n * Sets log level for all Firebase SDKs.\r\n *\r\n * All of the log types above the current log level are captured (i.e. if\r\n * you set the log level to `info`, errors are logged, but `debug` and\r\n * `verbose` logs are not).\r\n *\r\n * @public\r\n */\r\nfunction setLogLevel(logLevel) {\r\n setLogLevel$1(logLevel);\r\n}\n\n/**\r\n * @license\r\n * Copyright 2021 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst DB_NAME = 'firebase-heartbeat-database';\r\nconst DB_VERSION = 1;\r\nconst STORE_NAME = 'firebase-heartbeat-store';\r\nlet dbPromise = null;\r\nfunction getDbPromise() {\r\n if (!dbPromise) {\r\n dbPromise = openDB(DB_NAME, DB_VERSION, {\r\n upgrade: (db, oldVersion) => {\r\n // We don't use 'break' in this switch statement, the fall-through\r\n // behavior is what we want, because if there are multiple versions between\r\n // the old version and the current version, we want ALL the migrations\r\n // that correspond to those versions to run, not only the last one.\r\n // eslint-disable-next-line default-case\r\n switch (oldVersion) {\r\n case 0:\r\n db.createObjectStore(STORE_NAME);\r\n }\r\n }\r\n }).catch(e => {\r\n throw ERROR_FACTORY.create(\"idb-open\" /* AppError.IDB_OPEN */, {\r\n originalErrorMessage: e.message\r\n });\r\n });\r\n }\r\n return dbPromise;\r\n}\r\nasync function readHeartbeatsFromIndexedDB(app) {\r\n try {\r\n const db = await getDbPromise();\r\n return db\r\n .transaction(STORE_NAME)\r\n .objectStore(STORE_NAME)\r\n .get(computeKey(app));\r\n }\r\n catch (e) {\r\n if (e instanceof FirebaseError) {\r\n logger.warn(e.message);\r\n }\r\n else {\r\n const idbGetError = ERROR_FACTORY.create(\"idb-get\" /* AppError.IDB_GET */, {\r\n originalErrorMessage: e === null || e === void 0 ? void 0 : e.message\r\n });\r\n logger.warn(idbGetError.message);\r\n }\r\n }\r\n}\r\nasync function writeHeartbeatsToIndexedDB(app, heartbeatObject) {\r\n try {\r\n const db = await getDbPromise();\r\n const tx = db.transaction(STORE_NAME, 'readwrite');\r\n const objectStore = tx.objectStore(STORE_NAME);\r\n await objectStore.put(heartbeatObject, computeKey(app));\r\n return tx.done;\r\n }\r\n catch (e) {\r\n if (e instanceof FirebaseError) {\r\n logger.warn(e.message);\r\n }\r\n else {\r\n const idbGetError = ERROR_FACTORY.create(\"idb-set\" /* AppError.IDB_WRITE */, {\r\n originalErrorMessage: e === null || e === void 0 ? void 0 : e.message\r\n });\r\n logger.warn(idbGetError.message);\r\n }\r\n }\r\n}\r\nfunction computeKey(app) {\r\n return `${app.name}!${app.options.appId}`;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2021 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst MAX_HEADER_BYTES = 1024;\r\n// 30 days\r\nconst STORED_HEARTBEAT_RETENTION_MAX_MILLIS = 30 * 24 * 60 * 60 * 1000;\r\nclass HeartbeatServiceImpl {\r\n constructor(container) {\r\n this.container = container;\r\n /**\r\n * In-memory cache for heartbeats, used by getHeartbeatsHeader() to generate\r\n * the header string.\r\n * Stores one record per date. This will be consolidated into the standard\r\n * format of one record per user agent string before being sent as a header.\r\n * Populated from indexedDB when the controller is instantiated and should\r\n * be kept in sync with indexedDB.\r\n * Leave public for easier testing.\r\n */\r\n this._heartbeatsCache = null;\r\n const app = this.container.getProvider('app').getImmediate();\r\n this._storage = new HeartbeatStorageImpl(app);\r\n this._heartbeatsCachePromise = this._storage.read().then(result => {\r\n this._heartbeatsCache = result;\r\n return result;\r\n });\r\n }\r\n /**\r\n * Called to report a heartbeat. The function will generate\r\n * a HeartbeatsByUserAgent object, update heartbeatsCache, and persist it\r\n * to IndexedDB.\r\n * Note that we only store one heartbeat per day. So if a heartbeat for today is\r\n * already logged, subsequent calls to this function in the same day will be ignored.\r\n */\r\n async triggerHeartbeat() {\r\n const platformLogger = this.container\r\n .getProvider('platform-logger')\r\n .getImmediate();\r\n // This is the \"Firebase user agent\" string from the platform logger\r\n // service, not the browser user agent.\r\n const agent = platformLogger.getPlatformInfoString();\r\n const date = getUTCDateString();\r\n if (this._heartbeatsCache === null) {\r\n this._heartbeatsCache = await this._heartbeatsCachePromise;\r\n }\r\n // Do not store a heartbeat if one is already stored for this day\r\n // or if a header has already been sent today.\r\n if (this._heartbeatsCache.lastSentHeartbeatDate === date ||\r\n this._heartbeatsCache.heartbeats.some(singleDateHeartbeat => singleDateHeartbeat.date === date)) {\r\n return;\r\n }\r\n else {\r\n // There is no entry for this date. Create one.\r\n this._heartbeatsCache.heartbeats.push({ date, agent });\r\n }\r\n // Remove entries older than 30 days.\r\n this._heartbeatsCache.heartbeats = this._heartbeatsCache.heartbeats.filter(singleDateHeartbeat => {\r\n const hbTimestamp = new Date(singleDateHeartbeat.date).valueOf();\r\n const now = Date.now();\r\n return now - hbTimestamp <= STORED_HEARTBEAT_RETENTION_MAX_MILLIS;\r\n });\r\n return this._storage.overwrite(this._heartbeatsCache);\r\n }\r\n /**\r\n * Returns a base64 encoded string which can be attached to the heartbeat-specific header directly.\r\n * It also clears all heartbeats from memory as well as in IndexedDB.\r\n *\r\n * NOTE: Consuming product SDKs should not send the header if this method\r\n * returns an empty string.\r\n */\r\n async getHeartbeatsHeader() {\r\n if (this._heartbeatsCache === null) {\r\n await this._heartbeatsCachePromise;\r\n }\r\n // If it's still null or the array is empty, there is no data to send.\r\n if (this._heartbeatsCache === null ||\r\n this._heartbeatsCache.heartbeats.length === 0) {\r\n return '';\r\n }\r\n const date = getUTCDateString();\r\n // Extract as many heartbeats from the cache as will fit under the size limit.\r\n const { heartbeatsToSend, unsentEntries } = extractHeartbeatsForHeader(this._heartbeatsCache.heartbeats);\r\n const headerString = base64urlEncodeWithoutPadding(JSON.stringify({ version: 2, heartbeats: heartbeatsToSend }));\r\n // Store last sent date to prevent another being logged/sent for the same day.\r\n this._heartbeatsCache.lastSentHeartbeatDate = date;\r\n if (unsentEntries.length > 0) {\r\n // Store any unsent entries if they exist.\r\n this._heartbeatsCache.heartbeats = unsentEntries;\r\n // This seems more likely than emptying the array (below) to lead to some odd state\r\n // since the cache isn't empty and this will be called again on the next request,\r\n // and is probably safest if we await it.\r\n await this._storage.overwrite(this._heartbeatsCache);\r\n }\r\n else {\r\n this._heartbeatsCache.heartbeats = [];\r\n // Do not wait for this, to reduce latency.\r\n void this._storage.overwrite(this._heartbeatsCache);\r\n }\r\n return headerString;\r\n }\r\n}\r\nfunction getUTCDateString() {\r\n const today = new Date();\r\n // Returns date format 'YYYY-MM-DD'\r\n return today.toISOString().substring(0, 10);\r\n}\r\nfunction extractHeartbeatsForHeader(heartbeatsCache, maxSize = MAX_HEADER_BYTES) {\r\n // Heartbeats grouped by user agent in the standard format to be sent in\r\n // the header.\r\n const heartbeatsToSend = [];\r\n // Single date format heartbeats that are not sent.\r\n let unsentEntries = heartbeatsCache.slice();\r\n for (const singleDateHeartbeat of heartbeatsCache) {\r\n // Look for an existing entry with the same user agent.\r\n const heartbeatEntry = heartbeatsToSend.find(hb => hb.agent === singleDateHeartbeat.agent);\r\n if (!heartbeatEntry) {\r\n // If no entry for this user agent exists, create one.\r\n heartbeatsToSend.push({\r\n agent: singleDateHeartbeat.agent,\r\n dates: [singleDateHeartbeat.date]\r\n });\r\n if (countBytes(heartbeatsToSend) > maxSize) {\r\n // If the header would exceed max size, remove the added heartbeat\r\n // entry and stop adding to the header.\r\n heartbeatsToSend.pop();\r\n break;\r\n }\r\n }\r\n else {\r\n heartbeatEntry.dates.push(singleDateHeartbeat.date);\r\n // If the header would exceed max size, remove the added date\r\n // and stop adding to the header.\r\n if (countBytes(heartbeatsToSend) > maxSize) {\r\n heartbeatEntry.dates.pop();\r\n break;\r\n }\r\n }\r\n // Pop unsent entry from queue. (Skipped if adding the entry exceeded\r\n // quota and the loop breaks early.)\r\n unsentEntries = unsentEntries.slice(1);\r\n }\r\n return {\r\n heartbeatsToSend,\r\n unsentEntries\r\n };\r\n}\r\nclass HeartbeatStorageImpl {\r\n constructor(app) {\r\n this.app = app;\r\n this._canUseIndexedDBPromise = this.runIndexedDBEnvironmentCheck();\r\n }\r\n async runIndexedDBEnvironmentCheck() {\r\n if (!isIndexedDBAvailable()) {\r\n return false;\r\n }\r\n else {\r\n return validateIndexedDBOpenable()\r\n .then(() => true)\r\n .catch(() => false);\r\n }\r\n }\r\n /**\r\n * Read all heartbeats.\r\n */\r\n async read() {\r\n const canUseIndexedDB = await this._canUseIndexedDBPromise;\r\n if (!canUseIndexedDB) {\r\n return { heartbeats: [] };\r\n }\r\n else {\r\n const idbHeartbeatObject = await readHeartbeatsFromIndexedDB(this.app);\r\n return idbHeartbeatObject || { heartbeats: [] };\r\n }\r\n }\r\n // overwrite the storage with the provided heartbeats\r\n async overwrite(heartbeatsObject) {\r\n var _a;\r\n const canUseIndexedDB = await this._canUseIndexedDBPromise;\r\n if (!canUseIndexedDB) {\r\n return;\r\n }\r\n else {\r\n const existingHeartbeatsObject = await this.read();\r\n return writeHeartbeatsToIndexedDB(this.app, {\r\n lastSentHeartbeatDate: (_a = heartbeatsObject.lastSentHeartbeatDate) !== null && _a !== void 0 ? _a : existingHeartbeatsObject.lastSentHeartbeatDate,\r\n heartbeats: heartbeatsObject.heartbeats\r\n });\r\n }\r\n }\r\n // add heartbeats\r\n async add(heartbeatsObject) {\r\n var _a;\r\n const canUseIndexedDB = await this._canUseIndexedDBPromise;\r\n if (!canUseIndexedDB) {\r\n return;\r\n }\r\n else {\r\n const existingHeartbeatsObject = await this.read();\r\n return writeHeartbeatsToIndexedDB(this.app, {\r\n lastSentHeartbeatDate: (_a = heartbeatsObject.lastSentHeartbeatDate) !== null && _a !== void 0 ? _a : existingHeartbeatsObject.lastSentHeartbeatDate,\r\n heartbeats: [\r\n ...existingHeartbeatsObject.heartbeats,\r\n ...heartbeatsObject.heartbeats\r\n ]\r\n });\r\n }\r\n }\r\n}\r\n/**\r\n * Calculate bytes of a HeartbeatsByUserAgent array after being wrapped\r\n * in a platform logging header JSON object, stringified, and converted\r\n * to base 64.\r\n */\r\nfunction countBytes(heartbeatsCache) {\r\n // base64 has a restricted set of characters, all of which should be 1 byte.\r\n return base64urlEncodeWithoutPadding(\r\n // heartbeatsCache wrapper properties\r\n JSON.stringify({ version: 2, heartbeats: heartbeatsCache })).length;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction registerCoreComponents(variant) {\r\n _registerComponent(new Component('platform-logger', container => new PlatformLoggerServiceImpl(container), \"PRIVATE\" /* ComponentType.PRIVATE */));\r\n _registerComponent(new Component('heartbeat', container => new HeartbeatServiceImpl(container), \"PRIVATE\" /* ComponentType.PRIVATE */));\r\n // Register `app` package.\r\n registerVersion(name$o, version$1, variant);\r\n // BUILD_TARGET will be replaced by values like esm5, esm2017, cjs5, etc during the compilation\r\n registerVersion(name$o, version$1, 'esm2017');\r\n // Register platform SDK identifier (no version).\r\n registerVersion('fire-js', '');\r\n}\n\n/**\r\n * Firebase App\r\n *\r\n * @remarks This package coordinates the communication between the different Firebase components\r\n * @packageDocumentation\r\n */\r\nregisterCoreComponents('');\n\nexport { SDK_VERSION, DEFAULT_ENTRY_NAME as _DEFAULT_ENTRY_NAME, _addComponent, _addOrOverwriteComponent, _apps, _clearComponents, _components, _getProvider, _registerComponent, _removeServiceInstance, deleteApp, getApp, getApps, initializeApp, onLog, registerVersion, setLogLevel };\n//# sourceMappingURL=index.esm2017.js.map\n","import { registerVersion } from '@firebase/app';\nexport * from '@firebase/app';\n\nvar name = \"firebase\";\nvar version = \"9.16.0\";\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nregisterVersion(name, version, 'app');\n//# sourceMappingURL=index.esm.js.map\n","import { _getProvider, getApp, _registerComponent, registerVersion } from '@firebase/app';\nimport { Component } from '@firebase/component';\nimport { ErrorFactory, FirebaseError } from '@firebase/util';\nimport { openDB } from 'idb';\n\nconst name = \"@firebase/installations\";\nconst version = \"0.6.1\";\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst PENDING_TIMEOUT_MS = 10000;\r\nconst PACKAGE_VERSION = `w:${version}`;\r\nconst INTERNAL_AUTH_VERSION = 'FIS_v2';\r\nconst INSTALLATIONS_API_URL = 'https://firebaseinstallations.googleapis.com/v1';\r\nconst TOKEN_EXPIRATION_BUFFER = 60 * 60 * 1000; // One hour\r\nconst SERVICE = 'installations';\r\nconst SERVICE_NAME = 'Installations';\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst ERROR_DESCRIPTION_MAP = {\r\n [\"missing-app-config-values\" /* ErrorCode.MISSING_APP_CONFIG_VALUES */]: 'Missing App configuration value: \"{$valueName}\"',\r\n [\"not-registered\" /* ErrorCode.NOT_REGISTERED */]: 'Firebase Installation is not registered.',\r\n [\"installation-not-found\" /* ErrorCode.INSTALLATION_NOT_FOUND */]: 'Firebase Installation not found.',\r\n [\"request-failed\" /* ErrorCode.REQUEST_FAILED */]: '{$requestName} request failed with error \"{$serverCode} {$serverStatus}: {$serverMessage}\"',\r\n [\"app-offline\" /* ErrorCode.APP_OFFLINE */]: 'Could not process request. Application offline.',\r\n [\"delete-pending-registration\" /* ErrorCode.DELETE_PENDING_REGISTRATION */]: \"Can't delete installation while there is a pending registration request.\"\r\n};\r\nconst ERROR_FACTORY = new ErrorFactory(SERVICE, SERVICE_NAME, ERROR_DESCRIPTION_MAP);\r\n/** Returns true if error is a FirebaseError that is based on an error from the server. */\r\nfunction isServerError(error) {\r\n return (error instanceof FirebaseError &&\r\n error.code.includes(\"request-failed\" /* ErrorCode.REQUEST_FAILED */));\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction getInstallationsEndpoint({ projectId }) {\r\n return `${INSTALLATIONS_API_URL}/projects/${projectId}/installations`;\r\n}\r\nfunction extractAuthTokenInfoFromResponse(response) {\r\n return {\r\n token: response.token,\r\n requestStatus: 2 /* RequestStatus.COMPLETED */,\r\n expiresIn: getExpiresInFromResponseExpiresIn(response.expiresIn),\r\n creationTime: Date.now()\r\n };\r\n}\r\nasync function getErrorFromResponse(requestName, response) {\r\n const responseJson = await response.json();\r\n const errorData = responseJson.error;\r\n return ERROR_FACTORY.create(\"request-failed\" /* ErrorCode.REQUEST_FAILED */, {\r\n requestName,\r\n serverCode: errorData.code,\r\n serverMessage: errorData.message,\r\n serverStatus: errorData.status\r\n });\r\n}\r\nfunction getHeaders({ apiKey }) {\r\n return new Headers({\r\n 'Content-Type': 'application/json',\r\n Accept: 'application/json',\r\n 'x-goog-api-key': apiKey\r\n });\r\n}\r\nfunction getHeadersWithAuth(appConfig, { refreshToken }) {\r\n const headers = getHeaders(appConfig);\r\n headers.append('Authorization', getAuthorizationHeader(refreshToken));\r\n return headers;\r\n}\r\n/**\r\n * Calls the passed in fetch wrapper and returns the response.\r\n * If the returned response has a status of 5xx, re-runs the function once and\r\n * returns the response.\r\n */\r\nasync function retryIfServerError(fn) {\r\n const result = await fn();\r\n if (result.status >= 500 && result.status < 600) {\r\n // Internal Server Error. Retry request.\r\n return fn();\r\n }\r\n return result;\r\n}\r\nfunction getExpiresInFromResponseExpiresIn(responseExpiresIn) {\r\n // This works because the server will never respond with fractions of a second.\r\n return Number(responseExpiresIn.replace('s', '000'));\r\n}\r\nfunction getAuthorizationHeader(refreshToken) {\r\n return `${INTERNAL_AUTH_VERSION} ${refreshToken}`;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nasync function createInstallationRequest({ appConfig, heartbeatServiceProvider }, { fid }) {\r\n const endpoint = getInstallationsEndpoint(appConfig);\r\n const headers = getHeaders(appConfig);\r\n // If heartbeat service exists, add the heartbeat string to the header.\r\n const heartbeatService = heartbeatServiceProvider.getImmediate({\r\n optional: true\r\n });\r\n if (heartbeatService) {\r\n const heartbeatsHeader = await heartbeatService.getHeartbeatsHeader();\r\n if (heartbeatsHeader) {\r\n headers.append('x-firebase-client', heartbeatsHeader);\r\n }\r\n }\r\n const body = {\r\n fid,\r\n authVersion: INTERNAL_AUTH_VERSION,\r\n appId: appConfig.appId,\r\n sdkVersion: PACKAGE_VERSION\r\n };\r\n const request = {\r\n method: 'POST',\r\n headers,\r\n body: JSON.stringify(body)\r\n };\r\n const response = await retryIfServerError(() => fetch(endpoint, request));\r\n if (response.ok) {\r\n const responseValue = await response.json();\r\n const registeredInstallationEntry = {\r\n fid: responseValue.fid || fid,\r\n registrationStatus: 2 /* RequestStatus.COMPLETED */,\r\n refreshToken: responseValue.refreshToken,\r\n authToken: extractAuthTokenInfoFromResponse(responseValue.authToken)\r\n };\r\n return registeredInstallationEntry;\r\n }\r\n else {\r\n throw await getErrorFromResponse('Create Installation', response);\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/** Returns a promise that resolves after given time passes. */\r\nfunction sleep(ms) {\r\n return new Promise(resolve => {\r\n setTimeout(resolve, ms);\r\n });\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction bufferToBase64UrlSafe(array) {\r\n const b64 = btoa(String.fromCharCode(...array));\r\n return b64.replace(/\\+/g, '-').replace(/\\//g, '_');\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst VALID_FID_PATTERN = /^[cdef][\\w-]{21}$/;\r\nconst INVALID_FID = '';\r\n/**\r\n * Generates a new FID using random values from Web Crypto API.\r\n * Returns an empty string if FID generation fails for any reason.\r\n */\r\nfunction generateFid() {\r\n try {\r\n // A valid FID has exactly 22 base64 characters, which is 132 bits, or 16.5\r\n // bytes. our implementation generates a 17 byte array instead.\r\n const fidByteArray = new Uint8Array(17);\r\n const crypto = self.crypto || self.msCrypto;\r\n crypto.getRandomValues(fidByteArray);\r\n // Replace the first 4 random bits with the constant FID header of 0b0111.\r\n fidByteArray[0] = 0b01110000 + (fidByteArray[0] % 0b00010000);\r\n const fid = encode(fidByteArray);\r\n return VALID_FID_PATTERN.test(fid) ? fid : INVALID_FID;\r\n }\r\n catch (_a) {\r\n // FID generation errored\r\n return INVALID_FID;\r\n }\r\n}\r\n/** Converts a FID Uint8Array to a base64 string representation. */\r\nfunction encode(fidByteArray) {\r\n const b64String = bufferToBase64UrlSafe(fidByteArray);\r\n // Remove the 23rd character that was added because of the extra 4 bits at the\r\n // end of our 17 byte array, and the '=' padding.\r\n return b64String.substr(0, 22);\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/** Returns a string key that can be used to identify the app. */\r\nfunction getKey(appConfig) {\r\n return `${appConfig.appName}!${appConfig.appId}`;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst fidChangeCallbacks = new Map();\r\n/**\r\n * Calls the onIdChange callbacks with the new FID value, and broadcasts the\r\n * change to other tabs.\r\n */\r\nfunction fidChanged(appConfig, fid) {\r\n const key = getKey(appConfig);\r\n callFidChangeCallbacks(key, fid);\r\n broadcastFidChange(key, fid);\r\n}\r\nfunction addCallback(appConfig, callback) {\r\n // Open the broadcast channel if it's not already open,\r\n // to be able to listen to change events from other tabs.\r\n getBroadcastChannel();\r\n const key = getKey(appConfig);\r\n let callbackSet = fidChangeCallbacks.get(key);\r\n if (!callbackSet) {\r\n callbackSet = new Set();\r\n fidChangeCallbacks.set(key, callbackSet);\r\n }\r\n callbackSet.add(callback);\r\n}\r\nfunction removeCallback(appConfig, callback) {\r\n const key = getKey(appConfig);\r\n const callbackSet = fidChangeCallbacks.get(key);\r\n if (!callbackSet) {\r\n return;\r\n }\r\n callbackSet.delete(callback);\r\n if (callbackSet.size === 0) {\r\n fidChangeCallbacks.delete(key);\r\n }\r\n // Close broadcast channel if there are no more callbacks.\r\n closeBroadcastChannel();\r\n}\r\nfunction callFidChangeCallbacks(key, fid) {\r\n const callbacks = fidChangeCallbacks.get(key);\r\n if (!callbacks) {\r\n return;\r\n }\r\n for (const callback of callbacks) {\r\n callback(fid);\r\n }\r\n}\r\nfunction broadcastFidChange(key, fid) {\r\n const channel = getBroadcastChannel();\r\n if (channel) {\r\n channel.postMessage({ key, fid });\r\n }\r\n closeBroadcastChannel();\r\n}\r\nlet broadcastChannel = null;\r\n/** Opens and returns a BroadcastChannel if it is supported by the browser. */\r\nfunction getBroadcastChannel() {\r\n if (!broadcastChannel && 'BroadcastChannel' in self) {\r\n broadcastChannel = new BroadcastChannel('[Firebase] FID Change');\r\n broadcastChannel.onmessage = e => {\r\n callFidChangeCallbacks(e.data.key, e.data.fid);\r\n };\r\n }\r\n return broadcastChannel;\r\n}\r\nfunction closeBroadcastChannel() {\r\n if (fidChangeCallbacks.size === 0 && broadcastChannel) {\r\n broadcastChannel.close();\r\n broadcastChannel = null;\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst DATABASE_NAME = 'firebase-installations-database';\r\nconst DATABASE_VERSION = 1;\r\nconst OBJECT_STORE_NAME = 'firebase-installations-store';\r\nlet dbPromise = null;\r\nfunction getDbPromise() {\r\n if (!dbPromise) {\r\n dbPromise = openDB(DATABASE_NAME, DATABASE_VERSION, {\r\n upgrade: (db, oldVersion) => {\r\n // We don't use 'break' in this switch statement, the fall-through\r\n // behavior is what we want, because if there are multiple versions between\r\n // the old version and the current version, we want ALL the migrations\r\n // that correspond to those versions to run, not only the last one.\r\n // eslint-disable-next-line default-case\r\n switch (oldVersion) {\r\n case 0:\r\n db.createObjectStore(OBJECT_STORE_NAME);\r\n }\r\n }\r\n });\r\n }\r\n return dbPromise;\r\n}\r\n/** Assigns or overwrites the record for the given key with the given value. */\r\nasync function set(appConfig, value) {\r\n const key = getKey(appConfig);\r\n const db = await getDbPromise();\r\n const tx = db.transaction(OBJECT_STORE_NAME, 'readwrite');\r\n const objectStore = tx.objectStore(OBJECT_STORE_NAME);\r\n const oldValue = (await objectStore.get(key));\r\n await objectStore.put(value, key);\r\n await tx.done;\r\n if (!oldValue || oldValue.fid !== value.fid) {\r\n fidChanged(appConfig, value.fid);\r\n }\r\n return value;\r\n}\r\n/** Removes record(s) from the objectStore that match the given key. */\r\nasync function remove(appConfig) {\r\n const key = getKey(appConfig);\r\n const db = await getDbPromise();\r\n const tx = db.transaction(OBJECT_STORE_NAME, 'readwrite');\r\n await tx.objectStore(OBJECT_STORE_NAME).delete(key);\r\n await tx.done;\r\n}\r\n/**\r\n * Atomically updates a record with the result of updateFn, which gets\r\n * called with the current value. If newValue is undefined, the record is\r\n * deleted instead.\r\n * @return Updated value\r\n */\r\nasync function update(appConfig, updateFn) {\r\n const key = getKey(appConfig);\r\n const db = await getDbPromise();\r\n const tx = db.transaction(OBJECT_STORE_NAME, 'readwrite');\r\n const store = tx.objectStore(OBJECT_STORE_NAME);\r\n const oldValue = (await store.get(key));\r\n const newValue = updateFn(oldValue);\r\n if (newValue === undefined) {\r\n await store.delete(key);\r\n }\r\n else {\r\n await store.put(newValue, key);\r\n }\r\n await tx.done;\r\n if (newValue && (!oldValue || oldValue.fid !== newValue.fid)) {\r\n fidChanged(appConfig, newValue.fid);\r\n }\r\n return newValue;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Updates and returns the InstallationEntry from the database.\r\n * Also triggers a registration request if it is necessary and possible.\r\n */\r\nasync function getInstallationEntry(installations) {\r\n let registrationPromise;\r\n const installationEntry = await update(installations.appConfig, oldEntry => {\r\n const installationEntry = updateOrCreateInstallationEntry(oldEntry);\r\n const entryWithPromise = triggerRegistrationIfNecessary(installations, installationEntry);\r\n registrationPromise = entryWithPromise.registrationPromise;\r\n return entryWithPromise.installationEntry;\r\n });\r\n if (installationEntry.fid === INVALID_FID) {\r\n // FID generation failed. Waiting for the FID from the server.\r\n return { installationEntry: await registrationPromise };\r\n }\r\n return {\r\n installationEntry,\r\n registrationPromise\r\n };\r\n}\r\n/**\r\n * Creates a new Installation Entry if one does not exist.\r\n * Also clears timed out pending requests.\r\n */\r\nfunction updateOrCreateInstallationEntry(oldEntry) {\r\n const entry = oldEntry || {\r\n fid: generateFid(),\r\n registrationStatus: 0 /* RequestStatus.NOT_STARTED */\r\n };\r\n return clearTimedOutRequest(entry);\r\n}\r\n/**\r\n * If the Firebase Installation is not registered yet, this will trigger the\r\n * registration and return an InProgressInstallationEntry.\r\n *\r\n * If registrationPromise does not exist, the installationEntry is guaranteed\r\n * to be registered.\r\n */\r\nfunction triggerRegistrationIfNecessary(installations, installationEntry) {\r\n if (installationEntry.registrationStatus === 0 /* RequestStatus.NOT_STARTED */) {\r\n if (!navigator.onLine) {\r\n // Registration required but app is offline.\r\n const registrationPromiseWithError = Promise.reject(ERROR_FACTORY.create(\"app-offline\" /* ErrorCode.APP_OFFLINE */));\r\n return {\r\n installationEntry,\r\n registrationPromise: registrationPromiseWithError\r\n };\r\n }\r\n // Try registering. Change status to IN_PROGRESS.\r\n const inProgressEntry = {\r\n fid: installationEntry.fid,\r\n registrationStatus: 1 /* RequestStatus.IN_PROGRESS */,\r\n registrationTime: Date.now()\r\n };\r\n const registrationPromise = registerInstallation(installations, inProgressEntry);\r\n return { installationEntry: inProgressEntry, registrationPromise };\r\n }\r\n else if (installationEntry.registrationStatus === 1 /* RequestStatus.IN_PROGRESS */) {\r\n return {\r\n installationEntry,\r\n registrationPromise: waitUntilFidRegistration(installations)\r\n };\r\n }\r\n else {\r\n return { installationEntry };\r\n }\r\n}\r\n/** This will be executed only once for each new Firebase Installation. */\r\nasync function registerInstallation(installations, installationEntry) {\r\n try {\r\n const registeredInstallationEntry = await createInstallationRequest(installations, installationEntry);\r\n return set(installations.appConfig, registeredInstallationEntry);\r\n }\r\n catch (e) {\r\n if (isServerError(e) && e.customData.serverCode === 409) {\r\n // Server returned a \"FID can not be used\" error.\r\n // Generate a new ID next time.\r\n await remove(installations.appConfig);\r\n }\r\n else {\r\n // Registration failed. Set FID as not registered.\r\n await set(installations.appConfig, {\r\n fid: installationEntry.fid,\r\n registrationStatus: 0 /* RequestStatus.NOT_STARTED */\r\n });\r\n }\r\n throw e;\r\n }\r\n}\r\n/** Call if FID registration is pending in another request. */\r\nasync function waitUntilFidRegistration(installations) {\r\n // Unfortunately, there is no way of reliably observing when a value in\r\n // IndexedDB changes (yet, see https://github.com/WICG/indexed-db-observers),\r\n // so we need to poll.\r\n let entry = await updateInstallationRequest(installations.appConfig);\r\n while (entry.registrationStatus === 1 /* RequestStatus.IN_PROGRESS */) {\r\n // createInstallation request still in progress.\r\n await sleep(100);\r\n entry = await updateInstallationRequest(installations.appConfig);\r\n }\r\n if (entry.registrationStatus === 0 /* RequestStatus.NOT_STARTED */) {\r\n // The request timed out or failed in a different call. Try again.\r\n const { installationEntry, registrationPromise } = await getInstallationEntry(installations);\r\n if (registrationPromise) {\r\n return registrationPromise;\r\n }\r\n else {\r\n // if there is no registrationPromise, entry is registered.\r\n return installationEntry;\r\n }\r\n }\r\n return entry;\r\n}\r\n/**\r\n * Called only if there is a CreateInstallation request in progress.\r\n *\r\n * Updates the InstallationEntry in the DB based on the status of the\r\n * CreateInstallation request.\r\n *\r\n * Returns the updated InstallationEntry.\r\n */\r\nfunction updateInstallationRequest(appConfig) {\r\n return update(appConfig, oldEntry => {\r\n if (!oldEntry) {\r\n throw ERROR_FACTORY.create(\"installation-not-found\" /* ErrorCode.INSTALLATION_NOT_FOUND */);\r\n }\r\n return clearTimedOutRequest(oldEntry);\r\n });\r\n}\r\nfunction clearTimedOutRequest(entry) {\r\n if (hasInstallationRequestTimedOut(entry)) {\r\n return {\r\n fid: entry.fid,\r\n registrationStatus: 0 /* RequestStatus.NOT_STARTED */\r\n };\r\n }\r\n return entry;\r\n}\r\nfunction hasInstallationRequestTimedOut(installationEntry) {\r\n return (installationEntry.registrationStatus === 1 /* RequestStatus.IN_PROGRESS */ &&\r\n installationEntry.registrationTime + PENDING_TIMEOUT_MS < Date.now());\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nasync function generateAuthTokenRequest({ appConfig, heartbeatServiceProvider }, installationEntry) {\r\n const endpoint = getGenerateAuthTokenEndpoint(appConfig, installationEntry);\r\n const headers = getHeadersWithAuth(appConfig, installationEntry);\r\n // If heartbeat service exists, add the heartbeat string to the header.\r\n const heartbeatService = heartbeatServiceProvider.getImmediate({\r\n optional: true\r\n });\r\n if (heartbeatService) {\r\n const heartbeatsHeader = await heartbeatService.getHeartbeatsHeader();\r\n if (heartbeatsHeader) {\r\n headers.append('x-firebase-client', heartbeatsHeader);\r\n }\r\n }\r\n const body = {\r\n installation: {\r\n sdkVersion: PACKAGE_VERSION,\r\n appId: appConfig.appId\r\n }\r\n };\r\n const request = {\r\n method: 'POST',\r\n headers,\r\n body: JSON.stringify(body)\r\n };\r\n const response = await retryIfServerError(() => fetch(endpoint, request));\r\n if (response.ok) {\r\n const responseValue = await response.json();\r\n const completedAuthToken = extractAuthTokenInfoFromResponse(responseValue);\r\n return completedAuthToken;\r\n }\r\n else {\r\n throw await getErrorFromResponse('Generate Auth Token', response);\r\n }\r\n}\r\nfunction getGenerateAuthTokenEndpoint(appConfig, { fid }) {\r\n return `${getInstallationsEndpoint(appConfig)}/${fid}/authTokens:generate`;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Returns a valid authentication token for the installation. Generates a new\r\n * token if one doesn't exist, is expired or about to expire.\r\n *\r\n * Should only be called if the Firebase Installation is registered.\r\n */\r\nasync function refreshAuthToken(installations, forceRefresh = false) {\r\n let tokenPromise;\r\n const entry = await update(installations.appConfig, oldEntry => {\r\n if (!isEntryRegistered(oldEntry)) {\r\n throw ERROR_FACTORY.create(\"not-registered\" /* ErrorCode.NOT_REGISTERED */);\r\n }\r\n const oldAuthToken = oldEntry.authToken;\r\n if (!forceRefresh && isAuthTokenValid(oldAuthToken)) {\r\n // There is a valid token in the DB.\r\n return oldEntry;\r\n }\r\n else if (oldAuthToken.requestStatus === 1 /* RequestStatus.IN_PROGRESS */) {\r\n // There already is a token request in progress.\r\n tokenPromise = waitUntilAuthTokenRequest(installations, forceRefresh);\r\n return oldEntry;\r\n }\r\n else {\r\n // No token or token expired.\r\n if (!navigator.onLine) {\r\n throw ERROR_FACTORY.create(\"app-offline\" /* ErrorCode.APP_OFFLINE */);\r\n }\r\n const inProgressEntry = makeAuthTokenRequestInProgressEntry(oldEntry);\r\n tokenPromise = fetchAuthTokenFromServer(installations, inProgressEntry);\r\n return inProgressEntry;\r\n }\r\n });\r\n const authToken = tokenPromise\r\n ? await tokenPromise\r\n : entry.authToken;\r\n return authToken;\r\n}\r\n/**\r\n * Call only if FID is registered and Auth Token request is in progress.\r\n *\r\n * Waits until the current pending request finishes. If the request times out,\r\n * tries once in this thread as well.\r\n */\r\nasync function waitUntilAuthTokenRequest(installations, forceRefresh) {\r\n // Unfortunately, there is no way of reliably observing when a value in\r\n // IndexedDB changes (yet, see https://github.com/WICG/indexed-db-observers),\r\n // so we need to poll.\r\n let entry = await updateAuthTokenRequest(installations.appConfig);\r\n while (entry.authToken.requestStatus === 1 /* RequestStatus.IN_PROGRESS */) {\r\n // generateAuthToken still in progress.\r\n await sleep(100);\r\n entry = await updateAuthTokenRequest(installations.appConfig);\r\n }\r\n const authToken = entry.authToken;\r\n if (authToken.requestStatus === 0 /* RequestStatus.NOT_STARTED */) {\r\n // The request timed out or failed in a different call. Try again.\r\n return refreshAuthToken(installations, forceRefresh);\r\n }\r\n else {\r\n return authToken;\r\n }\r\n}\r\n/**\r\n * Called only if there is a GenerateAuthToken request in progress.\r\n *\r\n * Updates the InstallationEntry in the DB based on the status of the\r\n * GenerateAuthToken request.\r\n *\r\n * Returns the updated InstallationEntry.\r\n */\r\nfunction updateAuthTokenRequest(appConfig) {\r\n return update(appConfig, oldEntry => {\r\n if (!isEntryRegistered(oldEntry)) {\r\n throw ERROR_FACTORY.create(\"not-registered\" /* ErrorCode.NOT_REGISTERED */);\r\n }\r\n const oldAuthToken = oldEntry.authToken;\r\n if (hasAuthTokenRequestTimedOut(oldAuthToken)) {\r\n return Object.assign(Object.assign({}, oldEntry), { authToken: { requestStatus: 0 /* RequestStatus.NOT_STARTED */ } });\r\n }\r\n return oldEntry;\r\n });\r\n}\r\nasync function fetchAuthTokenFromServer(installations, installationEntry) {\r\n try {\r\n const authToken = await generateAuthTokenRequest(installations, installationEntry);\r\n const updatedInstallationEntry = Object.assign(Object.assign({}, installationEntry), { authToken });\r\n await set(installations.appConfig, updatedInstallationEntry);\r\n return authToken;\r\n }\r\n catch (e) {\r\n if (isServerError(e) &&\r\n (e.customData.serverCode === 401 || e.customData.serverCode === 404)) {\r\n // Server returned a \"FID not found\" or a \"Invalid authentication\" error.\r\n // Generate a new ID next time.\r\n await remove(installations.appConfig);\r\n }\r\n else {\r\n const updatedInstallationEntry = Object.assign(Object.assign({}, installationEntry), { authToken: { requestStatus: 0 /* RequestStatus.NOT_STARTED */ } });\r\n await set(installations.appConfig, updatedInstallationEntry);\r\n }\r\n throw e;\r\n }\r\n}\r\nfunction isEntryRegistered(installationEntry) {\r\n return (installationEntry !== undefined &&\r\n installationEntry.registrationStatus === 2 /* RequestStatus.COMPLETED */);\r\n}\r\nfunction isAuthTokenValid(authToken) {\r\n return (authToken.requestStatus === 2 /* RequestStatus.COMPLETED */ &&\r\n !isAuthTokenExpired(authToken));\r\n}\r\nfunction isAuthTokenExpired(authToken) {\r\n const now = Date.now();\r\n return (now < authToken.creationTime ||\r\n authToken.creationTime + authToken.expiresIn < now + TOKEN_EXPIRATION_BUFFER);\r\n}\r\n/** Returns an updated InstallationEntry with an InProgressAuthToken. */\r\nfunction makeAuthTokenRequestInProgressEntry(oldEntry) {\r\n const inProgressAuthToken = {\r\n requestStatus: 1 /* RequestStatus.IN_PROGRESS */,\r\n requestTime: Date.now()\r\n };\r\n return Object.assign(Object.assign({}, oldEntry), { authToken: inProgressAuthToken });\r\n}\r\nfunction hasAuthTokenRequestTimedOut(authToken) {\r\n return (authToken.requestStatus === 1 /* RequestStatus.IN_PROGRESS */ &&\r\n authToken.requestTime + PENDING_TIMEOUT_MS < Date.now());\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Creates a Firebase Installation if there isn't one for the app and\r\n * returns the Installation ID.\r\n * @param installations - The `Installations` instance.\r\n *\r\n * @public\r\n */\r\nasync function getId(installations) {\r\n const installationsImpl = installations;\r\n const { installationEntry, registrationPromise } = await getInstallationEntry(installationsImpl);\r\n if (registrationPromise) {\r\n registrationPromise.catch(console.error);\r\n }\r\n else {\r\n // If the installation is already registered, update the authentication\r\n // token if needed.\r\n refreshAuthToken(installationsImpl).catch(console.error);\r\n }\r\n return installationEntry.fid;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Returns a Firebase Installations auth token, identifying the current\r\n * Firebase Installation.\r\n * @param installations - The `Installations` instance.\r\n * @param forceRefresh - Force refresh regardless of token expiration.\r\n *\r\n * @public\r\n */\r\nasync function getToken(installations, forceRefresh = false) {\r\n const installationsImpl = installations;\r\n await completeInstallationRegistration(installationsImpl);\r\n // At this point we either have a Registered Installation in the DB, or we've\r\n // already thrown an error.\r\n const authToken = await refreshAuthToken(installationsImpl, forceRefresh);\r\n return authToken.token;\r\n}\r\nasync function completeInstallationRegistration(installations) {\r\n const { registrationPromise } = await getInstallationEntry(installations);\r\n if (registrationPromise) {\r\n // A createInstallation request is in progress. Wait until it finishes.\r\n await registrationPromise;\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nasync function deleteInstallationRequest(appConfig, installationEntry) {\r\n const endpoint = getDeleteEndpoint(appConfig, installationEntry);\r\n const headers = getHeadersWithAuth(appConfig, installationEntry);\r\n const request = {\r\n method: 'DELETE',\r\n headers\r\n };\r\n const response = await retryIfServerError(() => fetch(endpoint, request));\r\n if (!response.ok) {\r\n throw await getErrorFromResponse('Delete Installation', response);\r\n }\r\n}\r\nfunction getDeleteEndpoint(appConfig, { fid }) {\r\n return `${getInstallationsEndpoint(appConfig)}/${fid}`;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Deletes the Firebase Installation and all associated data.\r\n * @param installations - The `Installations` instance.\r\n *\r\n * @public\r\n */\r\nasync function deleteInstallations(installations) {\r\n const { appConfig } = installations;\r\n const entry = await update(appConfig, oldEntry => {\r\n if (oldEntry && oldEntry.registrationStatus === 0 /* RequestStatus.NOT_STARTED */) {\r\n // Delete the unregistered entry without sending a deleteInstallation request.\r\n return undefined;\r\n }\r\n return oldEntry;\r\n });\r\n if (entry) {\r\n if (entry.registrationStatus === 1 /* RequestStatus.IN_PROGRESS */) {\r\n // Can't delete while trying to register.\r\n throw ERROR_FACTORY.create(\"delete-pending-registration\" /* ErrorCode.DELETE_PENDING_REGISTRATION */);\r\n }\r\n else if (entry.registrationStatus === 2 /* RequestStatus.COMPLETED */) {\r\n if (!navigator.onLine) {\r\n throw ERROR_FACTORY.create(\"app-offline\" /* ErrorCode.APP_OFFLINE */);\r\n }\r\n else {\r\n await deleteInstallationRequest(appConfig, entry);\r\n await remove(appConfig);\r\n }\r\n }\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Sets a new callback that will get called when Installation ID changes.\r\n * Returns an unsubscribe function that will remove the callback when called.\r\n * @param installations - The `Installations` instance.\r\n * @param callback - The callback function that is invoked when FID changes.\r\n * @returns A function that can be called to unsubscribe.\r\n *\r\n * @public\r\n */\r\nfunction onIdChange(installations, callback) {\r\n const { appConfig } = installations;\r\n addCallback(appConfig, callback);\r\n return () => {\r\n removeCallback(appConfig, callback);\r\n };\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Returns an instance of {@link Installations} associated with the given\r\n * {@link @firebase/app#FirebaseApp} instance.\r\n * @param app - The {@link @firebase/app#FirebaseApp} instance.\r\n *\r\n * @public\r\n */\r\nfunction getInstallations(app = getApp()) {\r\n const installationsImpl = _getProvider(app, 'installations').getImmediate();\r\n return installationsImpl;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction extractAppConfig(app) {\r\n if (!app || !app.options) {\r\n throw getMissingValueError('App Configuration');\r\n }\r\n if (!app.name) {\r\n throw getMissingValueError('App Name');\r\n }\r\n // Required app config keys\r\n const configKeys = [\r\n 'projectId',\r\n 'apiKey',\r\n 'appId'\r\n ];\r\n for (const keyName of configKeys) {\r\n if (!app.options[keyName]) {\r\n throw getMissingValueError(keyName);\r\n }\r\n }\r\n return {\r\n appName: app.name,\r\n projectId: app.options.projectId,\r\n apiKey: app.options.apiKey,\r\n appId: app.options.appId\r\n };\r\n}\r\nfunction getMissingValueError(valueName) {\r\n return ERROR_FACTORY.create(\"missing-app-config-values\" /* ErrorCode.MISSING_APP_CONFIG_VALUES */, {\r\n valueName\r\n });\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst INSTALLATIONS_NAME = 'installations';\r\nconst INSTALLATIONS_NAME_INTERNAL = 'installations-internal';\r\nconst publicFactory = (container) => {\r\n const app = container.getProvider('app').getImmediate();\r\n // Throws if app isn't configured properly.\r\n const appConfig = extractAppConfig(app);\r\n const heartbeatServiceProvider = _getProvider(app, 'heartbeat');\r\n const installationsImpl = {\r\n app,\r\n appConfig,\r\n heartbeatServiceProvider,\r\n _delete: () => Promise.resolve()\r\n };\r\n return installationsImpl;\r\n};\r\nconst internalFactory = (container) => {\r\n const app = container.getProvider('app').getImmediate();\r\n // Internal FIS instance relies on public FIS instance.\r\n const installations = _getProvider(app, INSTALLATIONS_NAME).getImmediate();\r\n const installationsInternal = {\r\n getId: () => getId(installations),\r\n getToken: (forceRefresh) => getToken(installations, forceRefresh)\r\n };\r\n return installationsInternal;\r\n};\r\nfunction registerInstallations() {\r\n _registerComponent(new Component(INSTALLATIONS_NAME, publicFactory, \"PUBLIC\" /* ComponentType.PUBLIC */));\r\n _registerComponent(new Component(INSTALLATIONS_NAME_INTERNAL, internalFactory, \"PRIVATE\" /* ComponentType.PRIVATE */));\r\n}\n\n/**\r\n * Firebase Installations\r\n *\r\n * @packageDocumentation\r\n */\r\nregisterInstallations();\r\nregisterVersion(name, version);\r\n// BUILD_TARGET will be replaced by values like esm5, esm2017, cjs5, etc during the compilation\r\nregisterVersion(name, version, 'esm2017');\n\nexport { deleteInstallations, getId, getInstallations, getToken, onIdChange };\n//# sourceMappingURL=index.esm2017.js.map\n","import '@firebase/installations';\nimport { Component } from '@firebase/component';\nimport { openDB, deleteDB } from 'idb';\nimport { ErrorFactory, validateIndexedDBOpenable, isIndexedDBAvailable, areCookiesEnabled, getModularInstance } from '@firebase/util';\nimport { _registerComponent, registerVersion, _getProvider, getApp } from '@firebase/app';\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst DEFAULT_SW_PATH = '/firebase-messaging-sw.js';\r\nconst DEFAULT_SW_SCOPE = '/firebase-cloud-messaging-push-scope';\r\nconst DEFAULT_VAPID_KEY = 'BDOU99-h67HcA6JeFXHbSNMu7e2yNNu3RzoMj8TM4W88jITfq7ZmPvIM1Iv-4_l2LxQcYwhqby2xGpWwzjfAnG4';\r\nconst ENDPOINT = 'https://fcmregistrations.googleapis.com/v1';\r\nconst CONSOLE_CAMPAIGN_ID = 'google.c.a.c_id';\r\nconst CONSOLE_CAMPAIGN_NAME = 'google.c.a.c_l';\r\nconst CONSOLE_CAMPAIGN_TIME = 'google.c.a.ts';\r\n/** Set to '1' if Analytics is enabled for the campaign */\r\nconst CONSOLE_CAMPAIGN_ANALYTICS_ENABLED = 'google.c.a.e';\r\nvar MessageType$1;\r\n(function (MessageType) {\r\n MessageType[MessageType[\"DATA_MESSAGE\"] = 1] = \"DATA_MESSAGE\";\r\n MessageType[MessageType[\"DISPLAY_NOTIFICATION\"] = 3] = \"DISPLAY_NOTIFICATION\";\r\n})(MessageType$1 || (MessageType$1 = {}));\n\n/**\r\n * @license\r\n * Copyright 2018 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this file except\r\n * in compliance with the License. You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software distributed under the License\r\n * is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express\r\n * or implied. See the License for the specific language governing permissions and limitations under\r\n * the License.\r\n */\r\nvar MessageType;\r\n(function (MessageType) {\r\n MessageType[\"PUSH_RECEIVED\"] = \"push-received\";\r\n MessageType[\"NOTIFICATION_CLICKED\"] = \"notification-clicked\";\r\n})(MessageType || (MessageType = {}));\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction arrayToBase64(array) {\r\n const uint8Array = new Uint8Array(array);\r\n const base64String = btoa(String.fromCharCode(...uint8Array));\r\n return base64String.replace(/=/g, '').replace(/\\+/g, '-').replace(/\\//g, '_');\r\n}\r\nfunction base64ToArray(base64String) {\r\n const padding = '='.repeat((4 - (base64String.length % 4)) % 4);\r\n const base64 = (base64String + padding)\r\n .replace(/\\-/g, '+')\r\n .replace(/_/g, '/');\r\n const rawData = atob(base64);\r\n const outputArray = new Uint8Array(rawData.length);\r\n for (let i = 0; i < rawData.length; ++i) {\r\n outputArray[i] = rawData.charCodeAt(i);\r\n }\r\n return outputArray;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst OLD_DB_NAME = 'fcm_token_details_db';\r\n/**\r\n * The last DB version of 'fcm_token_details_db' was 4. This is one higher, so that the upgrade\r\n * callback is called for all versions of the old DB.\r\n */\r\nconst OLD_DB_VERSION = 5;\r\nconst OLD_OBJECT_STORE_NAME = 'fcm_token_object_Store';\r\nasync function migrateOldDatabase(senderId) {\r\n if ('databases' in indexedDB) {\r\n // indexedDb.databases() is an IndexedDB v3 API and does not exist in all browsers. TODO: Remove\r\n // typecast when it lands in TS types.\r\n const databases = await indexedDB.databases();\r\n const dbNames = databases.map(db => db.name);\r\n if (!dbNames.includes(OLD_DB_NAME)) {\r\n // old DB didn't exist, no need to open.\r\n return null;\r\n }\r\n }\r\n let tokenDetails = null;\r\n const db = await openDB(OLD_DB_NAME, OLD_DB_VERSION, {\r\n upgrade: async (db, oldVersion, newVersion, upgradeTransaction) => {\r\n var _a;\r\n if (oldVersion < 2) {\r\n // Database too old, skip migration.\r\n return;\r\n }\r\n if (!db.objectStoreNames.contains(OLD_OBJECT_STORE_NAME)) {\r\n // Database did not exist. Nothing to do.\r\n return;\r\n }\r\n const objectStore = upgradeTransaction.objectStore(OLD_OBJECT_STORE_NAME);\r\n const value = await objectStore.index('fcmSenderId').get(senderId);\r\n await objectStore.clear();\r\n if (!value) {\r\n // No entry in the database, nothing to migrate.\r\n return;\r\n }\r\n if (oldVersion === 2) {\r\n const oldDetails = value;\r\n if (!oldDetails.auth || !oldDetails.p256dh || !oldDetails.endpoint) {\r\n return;\r\n }\r\n tokenDetails = {\r\n token: oldDetails.fcmToken,\r\n createTime: (_a = oldDetails.createTime) !== null && _a !== void 0 ? _a : Date.now(),\r\n subscriptionOptions: {\r\n auth: oldDetails.auth,\r\n p256dh: oldDetails.p256dh,\r\n endpoint: oldDetails.endpoint,\r\n swScope: oldDetails.swScope,\r\n vapidKey: typeof oldDetails.vapidKey === 'string'\r\n ? oldDetails.vapidKey\r\n : arrayToBase64(oldDetails.vapidKey)\r\n }\r\n };\r\n }\r\n else if (oldVersion === 3) {\r\n const oldDetails = value;\r\n tokenDetails = {\r\n token: oldDetails.fcmToken,\r\n createTime: oldDetails.createTime,\r\n subscriptionOptions: {\r\n auth: arrayToBase64(oldDetails.auth),\r\n p256dh: arrayToBase64(oldDetails.p256dh),\r\n endpoint: oldDetails.endpoint,\r\n swScope: oldDetails.swScope,\r\n vapidKey: arrayToBase64(oldDetails.vapidKey)\r\n }\r\n };\r\n }\r\n else if (oldVersion === 4) {\r\n const oldDetails = value;\r\n tokenDetails = {\r\n token: oldDetails.fcmToken,\r\n createTime: oldDetails.createTime,\r\n subscriptionOptions: {\r\n auth: arrayToBase64(oldDetails.auth),\r\n p256dh: arrayToBase64(oldDetails.p256dh),\r\n endpoint: oldDetails.endpoint,\r\n swScope: oldDetails.swScope,\r\n vapidKey: arrayToBase64(oldDetails.vapidKey)\r\n }\r\n };\r\n }\r\n }\r\n });\r\n db.close();\r\n // Delete all old databases.\r\n await deleteDB(OLD_DB_NAME);\r\n await deleteDB('fcm_vapid_details_db');\r\n await deleteDB('undefined');\r\n return checkTokenDetails(tokenDetails) ? tokenDetails : null;\r\n}\r\nfunction checkTokenDetails(tokenDetails) {\r\n if (!tokenDetails || !tokenDetails.subscriptionOptions) {\r\n return false;\r\n }\r\n const { subscriptionOptions } = tokenDetails;\r\n return (typeof tokenDetails.createTime === 'number' &&\r\n tokenDetails.createTime > 0 &&\r\n typeof tokenDetails.token === 'string' &&\r\n tokenDetails.token.length > 0 &&\r\n typeof subscriptionOptions.auth === 'string' &&\r\n subscriptionOptions.auth.length > 0 &&\r\n typeof subscriptionOptions.p256dh === 'string' &&\r\n subscriptionOptions.p256dh.length > 0 &&\r\n typeof subscriptionOptions.endpoint === 'string' &&\r\n subscriptionOptions.endpoint.length > 0 &&\r\n typeof subscriptionOptions.swScope === 'string' &&\r\n subscriptionOptions.swScope.length > 0 &&\r\n typeof subscriptionOptions.vapidKey === 'string' &&\r\n subscriptionOptions.vapidKey.length > 0);\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n// Exported for tests.\r\nconst DATABASE_NAME = 'firebase-messaging-database';\r\nconst DATABASE_VERSION = 1;\r\nconst OBJECT_STORE_NAME = 'firebase-messaging-store';\r\nlet dbPromise = null;\r\nfunction getDbPromise() {\r\n if (!dbPromise) {\r\n dbPromise = openDB(DATABASE_NAME, DATABASE_VERSION, {\r\n upgrade: (upgradeDb, oldVersion) => {\r\n // We don't use 'break' in this switch statement, the fall-through behavior is what we want,\r\n // because if there are multiple versions between the old version and the current version, we\r\n // want ALL the migrations that correspond to those versions to run, not only the last one.\r\n // eslint-disable-next-line default-case\r\n switch (oldVersion) {\r\n case 0:\r\n upgradeDb.createObjectStore(OBJECT_STORE_NAME);\r\n }\r\n }\r\n });\r\n }\r\n return dbPromise;\r\n}\r\n/** Gets record(s) from the objectStore that match the given key. */\r\nasync function dbGet(firebaseDependencies) {\r\n const key = getKey(firebaseDependencies);\r\n const db = await getDbPromise();\r\n const tokenDetails = (await db\r\n .transaction(OBJECT_STORE_NAME)\r\n .objectStore(OBJECT_STORE_NAME)\r\n .get(key));\r\n if (tokenDetails) {\r\n return tokenDetails;\r\n }\r\n else {\r\n // Check if there is a tokenDetails object in the old DB.\r\n const oldTokenDetails = await migrateOldDatabase(firebaseDependencies.appConfig.senderId);\r\n if (oldTokenDetails) {\r\n await dbSet(firebaseDependencies, oldTokenDetails);\r\n return oldTokenDetails;\r\n }\r\n }\r\n}\r\n/** Assigns or overwrites the record for the given key with the given value. */\r\nasync function dbSet(firebaseDependencies, tokenDetails) {\r\n const key = getKey(firebaseDependencies);\r\n const db = await getDbPromise();\r\n const tx = db.transaction(OBJECT_STORE_NAME, 'readwrite');\r\n await tx.objectStore(OBJECT_STORE_NAME).put(tokenDetails, key);\r\n await tx.done;\r\n return tokenDetails;\r\n}\r\n/** Removes record(s) from the objectStore that match the given key. */\r\nasync function dbRemove(firebaseDependencies) {\r\n const key = getKey(firebaseDependencies);\r\n const db = await getDbPromise();\r\n const tx = db.transaction(OBJECT_STORE_NAME, 'readwrite');\r\n await tx.objectStore(OBJECT_STORE_NAME).delete(key);\r\n await tx.done;\r\n}\r\nfunction getKey({ appConfig }) {\r\n return appConfig.appId;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst ERROR_MAP = {\r\n [\"missing-app-config-values\" /* ErrorCode.MISSING_APP_CONFIG_VALUES */]: 'Missing App configuration value: \"{$valueName}\"',\r\n [\"only-available-in-window\" /* ErrorCode.AVAILABLE_IN_WINDOW */]: 'This method is available in a Window context.',\r\n [\"only-available-in-sw\" /* ErrorCode.AVAILABLE_IN_SW */]: 'This method is available in a service worker context.',\r\n [\"permission-default\" /* ErrorCode.PERMISSION_DEFAULT */]: 'The notification permission was not granted and dismissed instead.',\r\n [\"permission-blocked\" /* ErrorCode.PERMISSION_BLOCKED */]: 'The notification permission was not granted and blocked instead.',\r\n [\"unsupported-browser\" /* ErrorCode.UNSUPPORTED_BROWSER */]: \"This browser doesn't support the API's required to use the Firebase SDK.\",\r\n [\"indexed-db-unsupported\" /* ErrorCode.INDEXED_DB_UNSUPPORTED */]: \"This browser doesn't support indexedDb.open() (ex. Safari iFrame, Firefox Private Browsing, etc)\",\r\n [\"failed-service-worker-registration\" /* ErrorCode.FAILED_DEFAULT_REGISTRATION */]: 'We are unable to register the default service worker. {$browserErrorMessage}',\r\n [\"token-subscribe-failed\" /* ErrorCode.TOKEN_SUBSCRIBE_FAILED */]: 'A problem occurred while subscribing the user to FCM: {$errorInfo}',\r\n [\"token-subscribe-no-token\" /* ErrorCode.TOKEN_SUBSCRIBE_NO_TOKEN */]: 'FCM returned no token when subscribing the user to push.',\r\n [\"token-unsubscribe-failed\" /* ErrorCode.TOKEN_UNSUBSCRIBE_FAILED */]: 'A problem occurred while unsubscribing the ' +\r\n 'user from FCM: {$errorInfo}',\r\n [\"token-update-failed\" /* ErrorCode.TOKEN_UPDATE_FAILED */]: 'A problem occurred while updating the user from FCM: {$errorInfo}',\r\n [\"token-update-no-token\" /* ErrorCode.TOKEN_UPDATE_NO_TOKEN */]: 'FCM returned no token when updating the user to push.',\r\n [\"use-sw-after-get-token\" /* ErrorCode.USE_SW_AFTER_GET_TOKEN */]: 'The useServiceWorker() method may only be called once and must be ' +\r\n 'called before calling getToken() to ensure your service worker is used.',\r\n [\"invalid-sw-registration\" /* ErrorCode.INVALID_SW_REGISTRATION */]: 'The input to useServiceWorker() must be a ServiceWorkerRegistration.',\r\n [\"invalid-bg-handler\" /* ErrorCode.INVALID_BG_HANDLER */]: 'The input to setBackgroundMessageHandler() must be a function.',\r\n [\"invalid-vapid-key\" /* ErrorCode.INVALID_VAPID_KEY */]: 'The public VAPID key must be a string.',\r\n [\"use-vapid-key-after-get-token\" /* ErrorCode.USE_VAPID_KEY_AFTER_GET_TOKEN */]: 'The usePublicVapidKey() method may only be called once and must be ' +\r\n 'called before calling getToken() to ensure your VAPID key is used.'\r\n};\r\nconst ERROR_FACTORY = new ErrorFactory('messaging', 'Messaging', ERROR_MAP);\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nasync function requestGetToken(firebaseDependencies, subscriptionOptions) {\r\n const headers = await getHeaders(firebaseDependencies);\r\n const body = getBody(subscriptionOptions);\r\n const subscribeOptions = {\r\n method: 'POST',\r\n headers,\r\n body: JSON.stringify(body)\r\n };\r\n let responseData;\r\n try {\r\n const response = await fetch(getEndpoint(firebaseDependencies.appConfig), subscribeOptions);\r\n responseData = await response.json();\r\n }\r\n catch (err) {\r\n throw ERROR_FACTORY.create(\"token-subscribe-failed\" /* ErrorCode.TOKEN_SUBSCRIBE_FAILED */, {\r\n errorInfo: err === null || err === void 0 ? void 0 : err.toString()\r\n });\r\n }\r\n if (responseData.error) {\r\n const message = responseData.error.message;\r\n throw ERROR_FACTORY.create(\"token-subscribe-failed\" /* ErrorCode.TOKEN_SUBSCRIBE_FAILED */, {\r\n errorInfo: message\r\n });\r\n }\r\n if (!responseData.token) {\r\n throw ERROR_FACTORY.create(\"token-subscribe-no-token\" /* ErrorCode.TOKEN_SUBSCRIBE_NO_TOKEN */);\r\n }\r\n return responseData.token;\r\n}\r\nasync function requestUpdateToken(firebaseDependencies, tokenDetails) {\r\n const headers = await getHeaders(firebaseDependencies);\r\n const body = getBody(tokenDetails.subscriptionOptions);\r\n const updateOptions = {\r\n method: 'PATCH',\r\n headers,\r\n body: JSON.stringify(body)\r\n };\r\n let responseData;\r\n try {\r\n const response = await fetch(`${getEndpoint(firebaseDependencies.appConfig)}/${tokenDetails.token}`, updateOptions);\r\n responseData = await response.json();\r\n }\r\n catch (err) {\r\n throw ERROR_FACTORY.create(\"token-update-failed\" /* ErrorCode.TOKEN_UPDATE_FAILED */, {\r\n errorInfo: err === null || err === void 0 ? void 0 : err.toString()\r\n });\r\n }\r\n if (responseData.error) {\r\n const message = responseData.error.message;\r\n throw ERROR_FACTORY.create(\"token-update-failed\" /* ErrorCode.TOKEN_UPDATE_FAILED */, {\r\n errorInfo: message\r\n });\r\n }\r\n if (!responseData.token) {\r\n throw ERROR_FACTORY.create(\"token-update-no-token\" /* ErrorCode.TOKEN_UPDATE_NO_TOKEN */);\r\n }\r\n return responseData.token;\r\n}\r\nasync function requestDeleteToken(firebaseDependencies, token) {\r\n const headers = await getHeaders(firebaseDependencies);\r\n const unsubscribeOptions = {\r\n method: 'DELETE',\r\n headers\r\n };\r\n try {\r\n const response = await fetch(`${getEndpoint(firebaseDependencies.appConfig)}/${token}`, unsubscribeOptions);\r\n const responseData = await response.json();\r\n if (responseData.error) {\r\n const message = responseData.error.message;\r\n throw ERROR_FACTORY.create(\"token-unsubscribe-failed\" /* ErrorCode.TOKEN_UNSUBSCRIBE_FAILED */, {\r\n errorInfo: message\r\n });\r\n }\r\n }\r\n catch (err) {\r\n throw ERROR_FACTORY.create(\"token-unsubscribe-failed\" /* ErrorCode.TOKEN_UNSUBSCRIBE_FAILED */, {\r\n errorInfo: err === null || err === void 0 ? void 0 : err.toString()\r\n });\r\n }\r\n}\r\nfunction getEndpoint({ projectId }) {\r\n return `${ENDPOINT}/projects/${projectId}/registrations`;\r\n}\r\nasync function getHeaders({ appConfig, installations }) {\r\n const authToken = await installations.getToken();\r\n return new Headers({\r\n 'Content-Type': 'application/json',\r\n Accept: 'application/json',\r\n 'x-goog-api-key': appConfig.apiKey,\r\n 'x-goog-firebase-installations-auth': `FIS ${authToken}`\r\n });\r\n}\r\nfunction getBody({ p256dh, auth, endpoint, vapidKey }) {\r\n const body = {\r\n web: {\r\n endpoint,\r\n auth,\r\n p256dh\r\n }\r\n };\r\n if (vapidKey !== DEFAULT_VAPID_KEY) {\r\n body.web.applicationPubKey = vapidKey;\r\n }\r\n return body;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n// UpdateRegistration will be called once every week.\r\nconst TOKEN_EXPIRATION_MS = 7 * 24 * 60 * 60 * 1000; // 7 days\r\nasync function getTokenInternal(messaging) {\r\n const pushSubscription = await getPushSubscription(messaging.swRegistration, messaging.vapidKey);\r\n const subscriptionOptions = {\r\n vapidKey: messaging.vapidKey,\r\n swScope: messaging.swRegistration.scope,\r\n endpoint: pushSubscription.endpoint,\r\n auth: arrayToBase64(pushSubscription.getKey('auth')),\r\n p256dh: arrayToBase64(pushSubscription.getKey('p256dh'))\r\n };\r\n const tokenDetails = await dbGet(messaging.firebaseDependencies);\r\n if (!tokenDetails) {\r\n // No token, get a new one.\r\n return getNewToken(messaging.firebaseDependencies, subscriptionOptions);\r\n }\r\n else if (!isTokenValid(tokenDetails.subscriptionOptions, subscriptionOptions)) {\r\n // Invalid token, get a new one.\r\n try {\r\n await requestDeleteToken(messaging.firebaseDependencies, tokenDetails.token);\r\n }\r\n catch (e) {\r\n // Suppress errors because of #2364\r\n console.warn(e);\r\n }\r\n return getNewToken(messaging.firebaseDependencies, subscriptionOptions);\r\n }\r\n else if (Date.now() >= tokenDetails.createTime + TOKEN_EXPIRATION_MS) {\r\n // Weekly token refresh\r\n return updateToken(messaging, {\r\n token: tokenDetails.token,\r\n createTime: Date.now(),\r\n subscriptionOptions\r\n });\r\n }\r\n else {\r\n // Valid token, nothing to do.\r\n return tokenDetails.token;\r\n }\r\n}\r\n/**\r\n * This method deletes the token from the database, unsubscribes the token from FCM, and unregisters\r\n * the push subscription if it exists.\r\n */\r\nasync function deleteTokenInternal(messaging) {\r\n const tokenDetails = await dbGet(messaging.firebaseDependencies);\r\n if (tokenDetails) {\r\n await requestDeleteToken(messaging.firebaseDependencies, tokenDetails.token);\r\n await dbRemove(messaging.firebaseDependencies);\r\n }\r\n // Unsubscribe from the push subscription.\r\n const pushSubscription = await messaging.swRegistration.pushManager.getSubscription();\r\n if (pushSubscription) {\r\n return pushSubscription.unsubscribe();\r\n }\r\n // If there's no SW, consider it a success.\r\n return true;\r\n}\r\nasync function updateToken(messaging, tokenDetails) {\r\n try {\r\n const updatedToken = await requestUpdateToken(messaging.firebaseDependencies, tokenDetails);\r\n const updatedTokenDetails = Object.assign(Object.assign({}, tokenDetails), { token: updatedToken, createTime: Date.now() });\r\n await dbSet(messaging.firebaseDependencies, updatedTokenDetails);\r\n return updatedToken;\r\n }\r\n catch (e) {\r\n await deleteTokenInternal(messaging);\r\n throw e;\r\n }\r\n}\r\nasync function getNewToken(firebaseDependencies, subscriptionOptions) {\r\n const token = await requestGetToken(firebaseDependencies, subscriptionOptions);\r\n const tokenDetails = {\r\n token,\r\n createTime: Date.now(),\r\n subscriptionOptions\r\n };\r\n await dbSet(firebaseDependencies, tokenDetails);\r\n return tokenDetails.token;\r\n}\r\n/**\r\n * Gets a PushSubscription for the current user.\r\n */\r\nasync function getPushSubscription(swRegistration, vapidKey) {\r\n const subscription = await swRegistration.pushManager.getSubscription();\r\n if (subscription) {\r\n return subscription;\r\n }\r\n return swRegistration.pushManager.subscribe({\r\n userVisibleOnly: true,\r\n // Chrome <= 75 doesn't support base64-encoded VAPID key. For backward compatibility, VAPID key\r\n // submitted to pushManager#subscribe must be of type Uint8Array.\r\n applicationServerKey: base64ToArray(vapidKey)\r\n });\r\n}\r\n/**\r\n * Checks if the saved tokenDetails object matches the configuration provided.\r\n */\r\nfunction isTokenValid(dbOptions, currentOptions) {\r\n const isVapidKeyEqual = currentOptions.vapidKey === dbOptions.vapidKey;\r\n const isEndpointEqual = currentOptions.endpoint === dbOptions.endpoint;\r\n const isAuthEqual = currentOptions.auth === dbOptions.auth;\r\n const isP256dhEqual = currentOptions.p256dh === dbOptions.p256dh;\r\n return isVapidKeyEqual && isEndpointEqual && isAuthEqual && isP256dhEqual;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction externalizePayload(internalPayload) {\r\n const payload = {\r\n from: internalPayload.from,\r\n // eslint-disable-next-line camelcase\r\n collapseKey: internalPayload.collapse_key,\r\n // eslint-disable-next-line camelcase\r\n messageId: internalPayload.fcmMessageId\r\n };\r\n propagateNotificationPayload(payload, internalPayload);\r\n propagateDataPayload(payload, internalPayload);\r\n propagateFcmOptions(payload, internalPayload);\r\n return payload;\r\n}\r\nfunction propagateNotificationPayload(payload, messagePayloadInternal) {\r\n if (!messagePayloadInternal.notification) {\r\n return;\r\n }\r\n payload.notification = {};\r\n const title = messagePayloadInternal.notification.title;\r\n if (!!title) {\r\n payload.notification.title = title;\r\n }\r\n const body = messagePayloadInternal.notification.body;\r\n if (!!body) {\r\n payload.notification.body = body;\r\n }\r\n const image = messagePayloadInternal.notification.image;\r\n if (!!image) {\r\n payload.notification.image = image;\r\n }\r\n const icon = messagePayloadInternal.notification.icon;\r\n if (!!icon) {\r\n payload.notification.icon = icon;\r\n }\r\n}\r\nfunction propagateDataPayload(payload, messagePayloadInternal) {\r\n if (!messagePayloadInternal.data) {\r\n return;\r\n }\r\n payload.data = messagePayloadInternal.data;\r\n}\r\nfunction propagateFcmOptions(payload, messagePayloadInternal) {\r\n var _a, _b, _c, _d, _e;\r\n // fcmOptions.link value is written into notification.click_action. see more in b/232072111\r\n if (!messagePayloadInternal.fcmOptions &&\r\n !((_a = messagePayloadInternal.notification) === null || _a === void 0 ? void 0 : _a.click_action)) {\r\n return;\r\n }\r\n payload.fcmOptions = {};\r\n const link = (_c = (_b = messagePayloadInternal.fcmOptions) === null || _b === void 0 ? void 0 : _b.link) !== null && _c !== void 0 ? _c : (_d = messagePayloadInternal.notification) === null || _d === void 0 ? void 0 : _d.click_action;\r\n if (!!link) {\r\n payload.fcmOptions.link = link;\r\n }\r\n // eslint-disable-next-line camelcase\r\n const analyticsLabel = (_e = messagePayloadInternal.fcmOptions) === null || _e === void 0 ? void 0 : _e.analytics_label;\r\n if (!!analyticsLabel) {\r\n payload.fcmOptions.analyticsLabel = analyticsLabel;\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction isConsoleMessage(data) {\r\n // This message has a campaign ID, meaning it was sent using the Firebase Console.\r\n return typeof data === 'object' && !!data && CONSOLE_CAMPAIGN_ID in data;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n_mergeStrings('hts/frbslgigp.ogepscmv/ieo/eaylg', 'tp:/ieaeogn-agolai.o/1frlglgc/o');\r\n_mergeStrings('AzSCbw63g1R0nCw85jG8', 'Iaya3yLKwmgvh7cF0q4');\r\nfunction _mergeStrings(s1, s2) {\r\n const resultArray = [];\r\n for (let i = 0; i < s1.length; i++) {\r\n resultArray.push(s1.charAt(i));\r\n if (i < s2.length) {\r\n resultArray.push(s2.charAt(i));\r\n }\r\n }\r\n return resultArray.join('');\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction extractAppConfig(app) {\r\n if (!app || !app.options) {\r\n throw getMissingValueError('App Configuration Object');\r\n }\r\n if (!app.name) {\r\n throw getMissingValueError('App Name');\r\n }\r\n // Required app config keys\r\n const configKeys = [\r\n 'projectId',\r\n 'apiKey',\r\n 'appId',\r\n 'messagingSenderId'\r\n ];\r\n const { options } = app;\r\n for (const keyName of configKeys) {\r\n if (!options[keyName]) {\r\n throw getMissingValueError(keyName);\r\n }\r\n }\r\n return {\r\n appName: app.name,\r\n projectId: options.projectId,\r\n apiKey: options.apiKey,\r\n appId: options.appId,\r\n senderId: options.messagingSenderId\r\n };\r\n}\r\nfunction getMissingValueError(valueName) {\r\n return ERROR_FACTORY.create(\"missing-app-config-values\" /* ErrorCode.MISSING_APP_CONFIG_VALUES */, {\r\n valueName\r\n });\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nclass MessagingService {\r\n constructor(app, installations, analyticsProvider) {\r\n // logging is only done with end user consent. Default to false.\r\n this.deliveryMetricsExportedToBigQueryEnabled = false;\r\n this.onBackgroundMessageHandler = null;\r\n this.onMessageHandler = null;\r\n this.logEvents = [];\r\n this.isLogServiceStarted = false;\r\n const appConfig = extractAppConfig(app);\r\n this.firebaseDependencies = {\r\n app,\r\n appConfig,\r\n installations,\r\n analyticsProvider\r\n };\r\n }\r\n _delete() {\r\n return Promise.resolve();\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nasync function registerDefaultSw(messaging) {\r\n try {\r\n messaging.swRegistration = await navigator.serviceWorker.register(DEFAULT_SW_PATH, {\r\n scope: DEFAULT_SW_SCOPE\r\n });\r\n // The timing when browser updates sw when sw has an update is unreliable from experiment. It\r\n // leads to version conflict when the SDK upgrades to a newer version in the main page, but sw\r\n // is stuck with the old version. For example,\r\n // https://github.com/firebase/firebase-js-sdk/issues/2590 The following line reliably updates\r\n // sw if there was an update.\r\n messaging.swRegistration.update().catch(() => {\r\n /* it is non blocking and we don't care if it failed */\r\n });\r\n }\r\n catch (e) {\r\n throw ERROR_FACTORY.create(\"failed-service-worker-registration\" /* ErrorCode.FAILED_DEFAULT_REGISTRATION */, {\r\n browserErrorMessage: e === null || e === void 0 ? void 0 : e.message\r\n });\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nasync function updateSwReg(messaging, swRegistration) {\r\n if (!swRegistration && !messaging.swRegistration) {\r\n await registerDefaultSw(messaging);\r\n }\r\n if (!swRegistration && !!messaging.swRegistration) {\r\n return;\r\n }\r\n if (!(swRegistration instanceof ServiceWorkerRegistration)) {\r\n throw ERROR_FACTORY.create(\"invalid-sw-registration\" /* ErrorCode.INVALID_SW_REGISTRATION */);\r\n }\r\n messaging.swRegistration = swRegistration;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nasync function updateVapidKey(messaging, vapidKey) {\r\n if (!!vapidKey) {\r\n messaging.vapidKey = vapidKey;\r\n }\r\n else if (!messaging.vapidKey) {\r\n messaging.vapidKey = DEFAULT_VAPID_KEY;\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nasync function getToken$1(messaging, options) {\r\n if (!navigator) {\r\n throw ERROR_FACTORY.create(\"only-available-in-window\" /* ErrorCode.AVAILABLE_IN_WINDOW */);\r\n }\r\n if (Notification.permission === 'default') {\r\n await Notification.requestPermission();\r\n }\r\n if (Notification.permission !== 'granted') {\r\n throw ERROR_FACTORY.create(\"permission-blocked\" /* ErrorCode.PERMISSION_BLOCKED */);\r\n }\r\n await updateVapidKey(messaging, options === null || options === void 0 ? void 0 : options.vapidKey);\r\n await updateSwReg(messaging, options === null || options === void 0 ? void 0 : options.serviceWorkerRegistration);\r\n return getTokenInternal(messaging);\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nasync function logToScion(messaging, messageType, data) {\r\n const eventType = getEventType(messageType);\r\n const analytics = await messaging.firebaseDependencies.analyticsProvider.get();\r\n analytics.logEvent(eventType, {\r\n /* eslint-disable camelcase */\r\n message_id: data[CONSOLE_CAMPAIGN_ID],\r\n message_name: data[CONSOLE_CAMPAIGN_NAME],\r\n message_time: data[CONSOLE_CAMPAIGN_TIME],\r\n message_device_time: Math.floor(Date.now() / 1000)\r\n /* eslint-enable camelcase */\r\n });\r\n}\r\nfunction getEventType(messageType) {\r\n switch (messageType) {\r\n case MessageType.NOTIFICATION_CLICKED:\r\n return 'notification_open';\r\n case MessageType.PUSH_RECEIVED:\r\n return 'notification_foreground';\r\n default:\r\n throw new Error();\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nasync function messageEventListener(messaging, event) {\r\n const internalPayload = event.data;\r\n if (!internalPayload.isFirebaseMessaging) {\r\n return;\r\n }\r\n if (messaging.onMessageHandler &&\r\n internalPayload.messageType === MessageType.PUSH_RECEIVED) {\r\n if (typeof messaging.onMessageHandler === 'function') {\r\n messaging.onMessageHandler(externalizePayload(internalPayload));\r\n }\r\n else {\r\n messaging.onMessageHandler.next(externalizePayload(internalPayload));\r\n }\r\n }\r\n // Log to Scion if applicable\r\n const dataPayload = internalPayload.data;\r\n if (isConsoleMessage(dataPayload) &&\r\n dataPayload[CONSOLE_CAMPAIGN_ANALYTICS_ENABLED] === '1') {\r\n await logToScion(messaging, internalPayload.messageType, dataPayload);\r\n }\r\n}\n\nconst name = \"@firebase/messaging\";\nconst version = \"0.12.1\";\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst WindowMessagingFactory = (container) => {\r\n const messaging = new MessagingService(container.getProvider('app').getImmediate(), container.getProvider('installations-internal').getImmediate(), container.getProvider('analytics-internal'));\r\n navigator.serviceWorker.addEventListener('message', e => messageEventListener(messaging, e));\r\n return messaging;\r\n};\r\nconst WindowMessagingInternalFactory = (container) => {\r\n const messaging = container\r\n .getProvider('messaging')\r\n .getImmediate();\r\n const messagingInternal = {\r\n getToken: (options) => getToken$1(messaging, options)\r\n };\r\n return messagingInternal;\r\n};\r\nfunction registerMessagingInWindow() {\r\n _registerComponent(new Component('messaging', WindowMessagingFactory, \"PUBLIC\" /* ComponentType.PUBLIC */));\r\n _registerComponent(new Component('messaging-internal', WindowMessagingInternalFactory, \"PRIVATE\" /* ComponentType.PRIVATE */));\r\n registerVersion(name, version);\r\n // BUILD_TARGET will be replaced by values like esm5, esm2017, cjs5, etc during the compilation\r\n registerVersion(name, version, 'esm2017');\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Checks if all required APIs exist in the browser.\r\n * @returns a Promise that resolves to a boolean.\r\n *\r\n * @public\r\n */\r\nasync function isWindowSupported() {\r\n try {\r\n // This throws if open() is unsupported, so adding it to the conditional\r\n // statement below can cause an uncaught error.\r\n await validateIndexedDBOpenable();\r\n }\r\n catch (e) {\r\n return false;\r\n }\r\n // firebase-js-sdk/issues/2393 reveals that idb#open in Safari iframe and Firefox private browsing\r\n // might be prohibited to run. In these contexts, an error would be thrown during the messaging\r\n // instantiating phase, informing the developers to import/call isSupported for special handling.\r\n return (typeof window !== 'undefined' &&\r\n isIndexedDBAvailable() &&\r\n areCookiesEnabled() &&\r\n 'serviceWorker' in navigator &&\r\n 'PushManager' in window &&\r\n 'Notification' in window &&\r\n 'fetch' in window &&\r\n ServiceWorkerRegistration.prototype.hasOwnProperty('showNotification') &&\r\n PushSubscription.prototype.hasOwnProperty('getKey'));\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nasync function deleteToken$1(messaging) {\r\n if (!navigator) {\r\n throw ERROR_FACTORY.create(\"only-available-in-window\" /* ErrorCode.AVAILABLE_IN_WINDOW */);\r\n }\r\n if (!messaging.swRegistration) {\r\n await registerDefaultSw(messaging);\r\n }\r\n return deleteTokenInternal(messaging);\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction onMessage$1(messaging, nextOrObserver) {\r\n if (!navigator) {\r\n throw ERROR_FACTORY.create(\"only-available-in-window\" /* ErrorCode.AVAILABLE_IN_WINDOW */);\r\n }\r\n messaging.onMessageHandler = nextOrObserver;\r\n return () => {\r\n messaging.onMessageHandler = null;\r\n };\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Retrieves a Firebase Cloud Messaging instance.\r\n *\r\n * @returns The Firebase Cloud Messaging instance associated with the provided firebase app.\r\n *\r\n * @public\r\n */\r\nfunction getMessagingInWindow(app = getApp()) {\r\n // Conscious decision to make this async check non-blocking during the messaging instance\r\n // initialization phase for performance consideration. An error would be thrown latter for\r\n // developer's information. Developers can then choose to import and call `isSupported` for\r\n // special handling.\r\n isWindowSupported().then(isSupported => {\r\n // If `isWindowSupported()` resolved, but returned false.\r\n if (!isSupported) {\r\n throw ERROR_FACTORY.create(\"unsupported-browser\" /* ErrorCode.UNSUPPORTED_BROWSER */);\r\n }\r\n }, _ => {\r\n // If `isWindowSupported()` rejected.\r\n throw ERROR_FACTORY.create(\"indexed-db-unsupported\" /* ErrorCode.INDEXED_DB_UNSUPPORTED */);\r\n });\r\n return _getProvider(getModularInstance(app), 'messaging').getImmediate();\r\n}\r\n/**\r\n * Subscribes the {@link Messaging} instance to push notifications. Returns an Firebase Cloud\r\n * Messaging registration token that can be used to send push messages to that {@link Messaging}\r\n * instance.\r\n *\r\n * If a notification permission isn't already granted, this method asks the user for permission. The\r\n * returned promise rejects if the user does not allow the app to show notifications.\r\n *\r\n * @param messaging - The {@link Messaging} instance.\r\n * @param options - Provides an optional vapid key and an optinoal service worker registration\r\n *\r\n * @returns The promise resolves with an FCM registration token.\r\n *\r\n * @public\r\n */\r\nasync function getToken(messaging, options) {\r\n messaging = getModularInstance(messaging);\r\n return getToken$1(messaging, options);\r\n}\r\n/**\r\n * Deletes the registration token associated with this {@link Messaging} instance and unsubscribes\r\n * the {@link Messaging} instance from the push subscription.\r\n *\r\n * @param messaging - The {@link Messaging} instance.\r\n *\r\n * @returns The promise resolves when the token has been successfully deleted.\r\n *\r\n * @public\r\n */\r\nfunction deleteToken(messaging) {\r\n messaging = getModularInstance(messaging);\r\n return deleteToken$1(messaging);\r\n}\r\n/**\r\n * When a push message is received and the user is currently on a page for your origin, the\r\n * message is passed to the page and an `onMessage()` event is dispatched with the payload of\r\n * the push message.\r\n *\r\n *\r\n * @param messaging - The {@link Messaging} instance.\r\n * @param nextOrObserver - This function, or observer object with `next` defined,\r\n * is called when a message is received and the user is currently viewing your page.\r\n * @returns To stop listening for messages execute this returned function.\r\n *\r\n * @public\r\n */\r\nfunction onMessage(messaging, nextOrObserver) {\r\n messaging = getModularInstance(messaging);\r\n return onMessage$1(messaging, nextOrObserver);\r\n}\n\n/**\r\n * Firebase Cloud Messaging\r\n *\r\n * @packageDocumentation\r\n */\r\nregisterMessagingInWindow();\n\nexport { deleteToken, getMessagingInWindow as getMessaging, getToken, isWindowSupported as isSupported, onMessage };\n//# sourceMappingURL=index.esm2017.js.map\n","const __WEBPACK_NAMESPACE_OBJECT__ = Tinode;","import React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nexport default class Alert extends React.PureComponent {\n render() {\n return (
\n
\n
{this.props.title}
\n
{this.props.content}
\n
\n {this.props.onReject ?\n \n {this.props.reject || }\n \n :\n null\n }\n {this.props.onConfirm ?\n \n {this.props.confirm || }\n \n :\n null\n }\n
\n
\n
);\n }\n};\n","// Context Menu: popup/dropdown menu.\nimport React from 'react';\nimport { injectIntl, defineMessages } from 'react-intl';\n\nimport { REM_SIZE } from '../config.js';\n\nconst messages = defineMessages({\n info: {\n id: 'menu_item_info',\n defaultMessage: 'Info',\n description: 'Show extended topic information'\n },\n clear_messages: {\n id: 'menu_item_clear_messages',\n defaultMessage: 'Clear messages',\n description: 'Delete all messages'\n },\n clear_for_all: {\n id: 'menu_item_clear_messages_for_all',\n defaultMessage: 'Clear for All',\n description: 'Delete all message(s) for all members'\n },\n delete: {\n id: 'menu_item_delete',\n defaultMessage: 'Delete',\n description: 'Delete selected messages'\n },\n delete_for_all: {\n id: 'menu_item_delete_for_all',\n defaultMessage: 'Delete for All',\n description: 'Delete selected message(s) for all members'\n },\n send_retry: {\n id: 'menu_item_send_retry',\n defaultMessage: 'Retry',\n description: 'Retry sending message'\n },\n mute: {\n id: 'menu_item_mute',\n defaultMessage: 'Mute',\n description: 'Turn off notifications'\n },\n unmute: {\n id: 'menu_item_unmute',\n defaultMessage: 'Unmute',\n description: 'Turn notifications on'\n },\n reply: {\n id: 'menu_item_reply',\n defaultMessage: 'Reply',\n description: 'Reply to message'\n },\n forward: {\n id: 'menu_item_forward',\n defaultMessage: 'Forward',\n description: 'Forward message'\n },\n edit: {\n id: 'menu_item_edit',\n defaultMessage: 'Edit',\n description: 'Edit message'\n },\n topic_delete: {\n id: 'menu_item_delete_topic',\n defaultMessage: 'Delete',\n description: 'Delete entire topic'\n },\n topic_delete_warning: {\n id: 'topic_delete_warning',\n defaultMessage: 'Are you sure you want to delete this conversation? It cannot be undone.',\n description: 'Alert warning when deleting entire topic'\n },\n delete_messages_warning: {\n id: 'delete_messages_warning',\n defaultMessage: 'Are you sure you want to delete all messages for everyone? It cannot be undone.',\n description: 'Alert dialog warning when hard-deleting all messages.'\n },\n unblock: {\n id: 'menu_item_unblock',\n defaultMessage: 'Unblock',\n description: 'Unblock topic or user'\n },\n // Generic string suitable for either topic or user.\n block: {\n id: 'menu_item_block',\n defaultMessage: 'Block',\n description: 'Block topic or user'\n },\n topic_block_warning: {\n id: 'topic_block_warning',\n defaultMessage: 'Are you sure you want to block this conversation?',\n description: 'Alert warning when blocking a topic.'\n },\n member_delete: {\n id: 'menu_item_member_delete',\n defaultMessage: 'Remove',\n description: 'Remove user from topic'\n },\n archive: {\n id: 'menu_item_archive_topic',\n defaultMessage: 'Archive',\n description: 'Move topic from the list of active chats to archive'\n },\n unarchive: {\n id: 'menu_item_restore_topic',\n defaultMessage: 'Restore',\n description: 'Restore topic from archive'\n },\n edit_permissions: {\n id: 'menu_item_edit_permissions',\n defaultMessage: 'Edit permissions',\n description: 'Menu item [Edit permissions]'\n },\n clear_messages_warning: {\n id: 'clear_messages_warning',\n defaultMessage: 'Are you sure you want to clear all messages? It cannot be undone.',\n description: 'Alert dialog warning when deleting all messages.'\n },\n});\n\nclass ContextMenu extends React.Component {\n constructor(props) {\n super(props);\n\n this.selfRef = React.createRef();\n\n const {formatMessage} = props.intl;\n\n this.handlePageClick = this.handlePageClick.bind(this);\n this.handleEscapeKey = this.handleEscapeKey.bind(this);\n this.handleClick = this.handleClick.bind(this);\n\n // Preconfigured menu items.\n this.MenuItems = {\n 'topic_info': {\n id: 'topic_info',\n title: formatMessage(messages.info),\n handler: null\n },\n 'messages_clear': {\n id: 'messages_clear',\n title: formatMessage(messages.clear_messages),\n handler: (params, errorHandler) => {\n return props.onShowAlert(\n formatMessage(messages.clear_messages), // title\n formatMessage(messages.clear_messages_warning), // content\n (_ => { this.deleteMessages(true, false, params, errorHandler); }), // onConfirm\n null, // \"OK\"\n true, // Show Reject button\n null // \"Cancel\"\n );\n }\n },\n 'messages_clear_hard': {\n id: 'messages_clear_hard',\n title: formatMessage(messages.clear_for_all),\n handler: (params, errorHandler) => {\n return props.onShowAlert(\n formatMessage(messages.clear_for_all), // title\n formatMessage(messages.delete_messages_warning), // content\n (_ => { return this.deleteMessages(true, true, params, errorHandler); }),\n null, // \"OK\"\n true, // Show Reject button\n null // \"Cancel\"\n );\n }\n },\n 'message_delete': {\n id: 'message_delete',\n title: formatMessage(messages.delete),\n handler: (params, errorHandler) => {\n return this.deleteMessages(false, false, params, errorHandler);\n }\n },\n 'message_delete_hard': {\n id: 'message_delete_hard',\n title: formatMessage(messages.delete_for_all),\n handler: (params, errorHandler) => {\n return this.deleteMessages(false, true, params, errorHandler);\n }\n },\n 'menu_item_send_retry': {\n id: 'menu_item_send_retry',\n title: formatMessage(messages.send_retry),\n handler: (params, errorHandler) => {\n return this.retryMessage(params, errorHandler);\n }\n },\n 'menu_item_reply': {\n id: 'menu_item_reply',\n title: formatMessage(messages.reply),\n handler: (params, errorHandler) => {\n return this.replyToMessage(params, errorHandler);\n }\n },\n 'menu_item_forward': {\n id: 'menu_item_forward',\n title: formatMessage(messages.forward),\n handler: _ => {} /* the action is taken directly in tinode-web */\n },\n 'menu_item_edit': {\n id: 'menu_item_edit',\n title: formatMessage(messages.edit),\n handler: (params, errorHandler) => {\n return this.editMessage(params, errorHandler);\n }\n },\n 'topic_unmute': {\n id: 'topic_unmute',\n title: formatMessage(messages.unmute),\n handler: this.topicPermissionSetter.bind(this, '+P')\n },\n 'topic_mute': {\n id: 'topic_mute',\n title: formatMessage(messages.mute),\n handler: this.topicPermissionSetter.bind(this, '-P')\n },\n 'topic_unblock': {\n id: 'topic_unblock',\n title: formatMessage(messages.unblock),\n handler: this.topicPermissionSetter.bind(this, '+JP')\n },\n 'topic_block': {\n id: 'topic_block',\n title: formatMessage(messages.block),\n handler: (params, errorHandler) => {\n return props.onShowAlert(\n formatMessage(messages.block), // title\n formatMessage(messages.topic_block_warning), // content\n (_ => this.topicPermissionSetter('-JP', params, errorHandler).then(ctrl => {\n this.props.onTopicRemoved(params.topicName);\n return ctrl;\n })),\n null, // \"OK\"\n true, // Show Reject button\n null // \"Cancel\"\n );\n }\n },\n 'topic_delete': {\n id: 'topic_delete',\n title: formatMessage(messages.topic_delete),\n handler: (params, errorHandler) => {\n return props.onShowAlert(\n formatMessage(messages.topic_delete), // title\n formatMessage(messages.topic_delete_warning), // content\n (_ => {\n const topic = this.props.tinode.getTopic(params.topicName);\n if (!topic) {\n console.warn(\"Topic not found: \", params.topicName);\n return;\n }\n return topic.delTopic(true).catch(err => {\n if (errorHandler) {\n errorHandler(err.message, 'err');\n }\n });\n }),\n null, // \"OK\"\n true, // Show Reject button\n null // \"Cancel\"\n );\n }\n },\n 'topic_archive': {\n id: 'topic_archive',\n title: formatMessage(messages.archive),\n handler: (params, errorHandler) => {\n const topic = this.props.tinode.getTopic(params.topicName);\n if (!topic) {\n console.warn(\"Topic not found: \", params.topicName);\n return;\n }\n return topic.archive(true).catch(err => {\n if (errorHandler) {\n errorHandler(err.message, 'err');\n }\n });\n }\n },\n 'topic_restore': {\n id: 'topic_restore',\n title: formatMessage(messages.unarchive),\n handler: (params, errorHandler) => {\n const topic = this.props.tinode.getTopic(params.topicName);\n if (!topic) {\n console.warn(\"Topic not found: \", params.topicName);\n return;\n }\n return topic.archive(false).catch(err => {\n if (errorHandler) {\n errorHandler(err.message, 'err');\n }\n });\n }\n },\n // menu_item_edit_permissions is defined elsewhere.\n 'permissions': {\n id: 'permissions',\n title: formatMessage(messages.edit_permissions),\n handler: null\n },\n 'member_delete': {\n id: 'member_delete',\n title: formatMessage(messages.member_delete),\n handler: (params, errorHandler) => {\n const topic = this.props.tinode.getTopic(params.topicName);\n if (!topic || !params.user) {\n console.warn(\"Topic or user not found: '\" + params.topicName + \"', '\" + params.user + \"'\");\n return;\n }\n return topic.delSubscription(params.user).catch(err => {\n if (errorHandler) {\n errorHandler(err.message, 'err');\n }\n });\n }\n },\n 'member_mute': {\n id: 'member_mute',\n title: formatMessage(messages.mute),\n handler: this.topicPermissionSetter.bind(this, '-P')\n },\n 'member_unmute': {\n id: 'member_unmute',\n title: formatMessage(messages.unmute),\n handler: this.topicPermissionSetter.bind(this, '+P')\n },\n 'member_block': {\n id: 'member_block',\n title: formatMessage(messages.block),\n handler: this.topicPermissionSetter.bind(this, '-JP')\n },\n 'member_unblock': {\n id: 'member_unblock',\n title: formatMessage(messages.unblock),\n handler: this.topicPermissionSetter.bind(this, '+JP')\n },\n };\n }\n\n componentDidMount() {\n document.addEventListener('mousedown', this.handlePageClick, false);\n document.addEventListener('keyup', this.handleEscapeKey, false);\n }\n\n componentWillUnmount() {\n document.removeEventListener('mousedown', this.handlePageClick, false);\n document.removeEventListener('keyup', this.handleEscapeKey, false);\n }\n\n handlePageClick(e) {\n if (this.selfRef.current.contains(e.target)) {\n return;\n }\n e.preventDefault();\n e.stopPropagation();\n this.props.hide();\n }\n\n handleEscapeKey(e) {\n if (e.keyCode === 27) {\n this.props.hide();\n }\n }\n\n handleClick(e) {\n e.preventDefault();\n e.stopPropagation();\n this.props.hide();\n let item = this.props.items[e.currentTarget.dataset.id];\n if (typeof item == 'string') {\n item = this.MenuItems[item];\n }\n\n if (!item) {\n console.error(\"Invalid menu item ID\", e.currentTarget.dataset.id);\n } else {\n this.props.onAction(\n item.id,\n item.handler(this.props.params, this.props.onError),\n this.props.params);\n }\n }\n\n // Menu Actions\n\n deleteMessages(all, hard, params, errorHandler) {\n const topic = this.props.tinode.getTopic(params.topicName);\n if (!topic) {\n console.warn(\"Topic not found: \", params.topicName);\n return;\n }\n\n // We don't know if the message is still pending (e.g. attachment is being uploaded),\n // so try cancelling first. No harm if we can't cancel.\n // The message can be cancelled if transmission to the server has not\n // started yet or if the message send has failed.\n if (!all && topic.cancelSend(params.seq)) {\n return;\n }\n\n const promise = all ?\n topic.delMessagesAll(hard) :\n params.replace > 0 ?\n topic.delMessagesEdits(params.replace, hard) :\n topic.delMessagesList([params.seq], hard);\n\n return promise.catch(err => {\n if (errorHandler) {\n errorHandler(err.message, 'err');\n }\n });\n }\n\n // Retries sending failed message.\n retryMessage(params, errorHandler) {\n const topic = this.props.tinode.getTopic(params.topicName);\n // Remove the existing message entry.\n if (!topic || !topic.flushMessage(params.seq)) {\n return;\n }\n const msg = topic.createMessage(params.content, false);\n return topic.publishDraft(msg).catch(err => {\n if (errorHandler) {\n errorHandler(err.message, 'err');\n }\n });\n }\n\n // Function is used by context menu to set permissions.\n topicPermissionSetter(mode, params, errorHandler) {\n const topic = this.props.tinode.getTopic(params.topicName);\n if (!topic) {\n console.warn(\"Topic not found\", params.topicName);\n return;\n }\n\n let result = topic.updateMode(params.user, mode);\n if (errorHandler) {\n result = result.catch(err => errorHandler(err.message, 'err'));\n }\n return result;\n }\n\n replyToMessage(params, errorHandler) {\n params.pickReply(params.seq, params.content, params.userFrom, params.userName, errorHandler);\n }\n\n editMessage(params, errorHandler) {\n params.editMessage(params.replace || params.seq, params.content, errorHandler);\n }\n\n render() {\n const menu = [];\n let count = 0;\n this.props.items.map((item) => {\n if (typeof item == 'string') {\n item = this.MenuItems[item];\n }\n if (item && item.title) {\n menu.push(\n item.title == '-' ?\n \n :\n {item.title} \n );\n }\n count++;\n });\n\n // Ensure that menu is inside the app-container.\n const hSize = 12 * REM_SIZE;\n const vSize = REM_SIZE * (0.7 + menu.length * 2.5);\n const left = (this.props.bounds.right - this.props.clickAt.x < hSize) ?\n (this.props.clickAt.x - this.props.bounds.left - hSize) :\n (this.props.clickAt.x - this.props.bounds.left);\n const top = (this.props.bounds.bottom - this.props.clickAt.y < vSize) ?\n (this.props.clickAt.y - this.props.bounds.top - vSize) :\n (this.props.clickAt.y - this.props.bounds.top);\n\n const position = {\n left: left + 'px',\n top: top + 'px'\n };\n\n return (\n \n );\n }\n}\n\nexport default injectIntl(ContextMenu);\n","import React from 'react';\n\nconst icon_mapping = {'muted': 'notifications_off', 'banned': 'block', 'staff': 'verified_user'};\n\n/* Contact's labels: [you], or icons [muted], [blocked] */\nexport default class ContactBadges extends React.PureComponent {\n render() {\n let badges = null;\n if (this.props.badges && this.props.badges.length > 0) {\n badges = [];\n this.props.badges.map((b) => {\n const color = (b.color ? ' ' + b.color : '');\n if (b.icon) {\n badges.push({icon_mapping[b.icon] || b.icon} );\n } else {\n badges.push({b.name} );\n }\n });\n return <>{badges}>;\n }\n return null;\n }\n};\n","// Odds and ends\n\nimport { Tinode } from 'tinode-sdk';\n\n// Make shortcut icon appear with a green dot + show unread count in title.\nexport function updateFavicon(count) {\n const oldIcon = document.getElementById('shortcut-icon');\n const head = document.head || document.getElementsByTagName('head')[0];\n const newIcon = document.createElement('link');\n newIcon.type = 'image/png';\n newIcon.id = 'shortcut-icon';\n newIcon.rel = 'shortcut icon';\n newIcon.href = 'img/logo32x32' + (count > 0 ? 'a' : '') + '.png';\n if (oldIcon) {\n head.removeChild(oldIcon);\n }\n head.appendChild(newIcon);\n\n document.title = (count > 0 ? '('+count+') ' : '') + 'Tinode';\n}\n\n// Create theCard which represents user's or topic's \"public\" info.\nexport function theCard(fn, imageUrl, imageMimeType, note) {\n let card = null;\n fn = fn && fn.trim();\n note = note && note.trim();\n\n if (fn) {\n card = {\n fn: fn\n };\n }\n\n if (typeof note == 'string') {\n card = card || {};\n card.note = note ? note : Tinode.DEL_CHAR;\n }\n\n if (imageUrl) {\n card = card || {};\n let mimeType = imageMimeType;\n // Is this a data URL \"data:[][;base64],\"?\n const matches = /^data:(image\\/[-a-z0-9+.]+)?(;base64)?,/i.exec(imageUrl);\n if (matches) {\n mimeType = matches[1];\n card.photo = {\n data: imageUrl.substring(imageUrl.indexOf(',') + 1),\n ref: Tinode.DEL_CHAR\n };\n } else {\n card.photo = {\n data: Tinode.DEL_CHAR,\n ref: imageUrl\n };\n }\n card.photo.type = (mimeType || 'image/jpeg').substring('image/'.length);\n }\n\n return card;\n}\n\n// Deep-shallow compare two arrays: shallow compare each element.\nexport function arrayEqual(a, b) {\n if (a === b) {\n return true;\n }\n\n if (!Array.isArray(a) || !Array.isArray(b)) {\n return false;\n }\n\n // Compare lengths first.\n if (a.length != b.length) {\n return false;\n }\n // Order of elements is ignored.\n a.sort();\n b.sort();\n for (let i = 0, l = a.length; i < l; i++) {\n if (a[i] !== b[i]) {\n return false;\n }\n }\n return true;\n}\n\n// Checks (loosely) if the given string is a phone. If so, returns the phone number in a format\n// as close to E.164 as possible.\nexport function asPhone(val) {\n val = val.trim();\n if (/^(?:\\+?(\\d{1,3}))?[- (.]*(\\d{3})[- ).]*(\\d{3})[- .]*(\\d{2})[- .]*(\\d{2})?$/.test(val)) {\n return val.replace(/[- ().]*/, '');\n }\n return null;\n}\n\n// Checks (loosely) if the given string is an email. If so returns the email.\nexport function asEmail(val) {\n val = val.trim();\n if (/^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\\.[a-zA-Z0-9-.]+$/.test(val)) {\n return val;\n }\n return null;\n}\n\n// Checks if URL is a relative url, i.e. has no 'scheme://', including the case of missing scheme '//'.\n// The scheme is expected to be RFC-compliant, e.g. [a-z][a-z0-9+.-]*\n// example.html - ok\n// https:example.com - not ok.\n// http:/example.com - not ok.\n// ' ↲ https://example.com' - not ok. (↲ means carriage return)\nexport function isUrlRelative(url) {\n return url && !/^\\s*([a-z][a-z0-9+.-]*:|\\/\\/)/im.test(url);\n}\n\n// Ensure URL does not present an XSS risk. Optional allowedSchemes may contain an array of\n// strings with permitted URL schemes, such as ['ftp', 'ftps']; otherwise accept http and https only.\nexport function sanitizeUrl(url, allowedSchemes) {\n if (typeof url != 'string') {\n return url;\n }\n\n // Strip control characters and whitespace. They are not valid URL characters anyway.\n url = url.replace(/[^\\x20-\\x7E]/gmi, '').trim();\n\n // Relative URLs are safe.\n // Relative URL does not start with ':', abcd123: or '//'.\n if (!/^([a-z][a-z0-9+.-]*:|\\/\\/)/i.test(url)) {\n return url;\n }\n\n // Blob URLs are safe.\n if (/^blob:http/.test(url)) {\n return url;\n }\n\n // Absolute URL. Accept only safe schemes, or no scheme.\n const schemes = Array.isArray(allowedSchemes) ? allowedSchemes.join('|') : 'http|https';\n const re = new RegExp('^((' + schemes + '):|//)', 'i');\n if (!re.test(url)) {\n return null;\n }\n\n return url;\n}\n\n// Ensure URL is suitable as a source like field: the URL must be a relative URL or\n// have http:, https:, blob: or data: scheme.\n// In case of data: scheme, the URL must must be of the right MIME type such as 'data:{mimeMajor}/XXXX;base64,'.\nexport function sanitizeUrlForMime(url, mimeMajor) {\n if (!url) {\n return null;\n }\n\n const sanitizedUrl = sanitizeUrl(url);\n if (sanitizedUrl) {\n return sanitizedUrl;\n }\n\n // Is this a data: URL of the appropriate mime type?\n const re = new RegExp(`data:${mimeMajor}\\/[a-z0-9.-]+;base64,`, 'i');\n if (re.test(url.trim())) {\n return url;\n }\n\n return null;\n}\n\n// Given message's received status, return name and color of a delivery indicator icon.\nexport function deliveryMarker(received) {\n switch (received) {\n case Tinode.MESSAGE_STATUS_SENDING:\n return { name: 'access_time' }; // watch face\n case Tinode.MESSAGE_STATUS_FAILED:\n return { name: 'warning', color: 'danger-color' }; // yellow icon /!\\\n case Tinode.MESSAGE_STATUS_SENT:\n return { name: 'done' }; // checkmark\n case Tinode.MESSAGE_STATUS_RECEIVED:\n return { name: 'done_all' }; // double checkmark\n case Tinode.MESSAGE_STATUS_READ:\n return { name: 'done_all', color: 'blue' }; // blue double checkmark\n }\n return null;\n}\n\n// Wraps a promise to make it cancelable.\n// The parameter can be either a promise or an error. If it's an error, the wrapped promise is\n// created in a rejected state.\nexport function cancelablePromise(promise) {\n let hasCanceled = false;\n\n const wrappedPromise = promise instanceof Error ?\n Promise.reject(promise) :\n new Promise((resolve, reject) => {\n promise.then(\n result => hasCanceled ? reject({isCanceled: true}) : resolve(result),\n error => hasCanceled ? reject({isCanceled: true}) : reject(error)\n );\n });\n\n return {\n promise: wrappedPromise,\n cancel() {\n hasCanceled = true;\n },\n };\n};\n\n// Clips string to the specified length.\nexport function clipStr(str, length) {\n return str && str.substring(0, length);\n}\n","import React from 'react';\n\nimport { Tinode } from 'tinode-sdk';\n\nimport { idToColorClass } from '../lib/strformat.js';\nimport { sanitizeUrlForMime } from '../lib/utils.js';\n\nexport default class LetterTile extends React.PureComponent {\n render() {\n let avatar;\n if (this.props.avatar === true) {\n const isGroup = Tinode.isGroupTopicName(this.props.topic);\n const iconColor = idToColorClass(this.props.topic, isGroup);\n if (this.props.topic && this.props.title && this.props.title.trim()) {\n const letter = this.props.title.trim().charAt(0);\n const className = 'lettertile ' + iconColor + (this.props.deleted ? ' disabled' : '');\n avatar = ()\n } else {\n const className = 'material-icons ' + iconColor + (this.props.deleted ? ' disabled' : '');\n avatar = isGroup ? group : person ;\n }\n } else if (this.props.avatar) {\n const url = this.props.tinode.authorizeURL(sanitizeUrlForMime(this.props.avatar, 'image'));\n // If avatar image is invalid, show a placeholder.\n const className = 'avatar' + (this.props.deleted ? ' deleted' : '');\n avatar = {e.target.onerror = null; e.target.src=\"../img/broken_image.png\"}} />;\n } else {\n avatar = null;\n }\n return avatar;\n }\n}\n","// The counter of unread messages in the topic.\nimport React from 'react';\n\nexport default class UnreadBadge extends React.PureComponent {\n render() {\n return (this.props.count > 0 ?\n {this.props.count > 9 ? \"9+\" : this.props.count} \n : null);\n }\n};\n","// Chat message describing a video or voice call.\n\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport { secondsToTime } from '../lib/strformat.js';\n\nexport default class CallMessage extends React.PureComponent {\n render() {\n const isCallDropped = ['declined', 'disconnected', 'missed'].includes(this.props.callState);\n const successClass = 'material-icons medium ' + (isCallDropped ? 'red' : 'green');\n const callIcon = this.props.incoming ?\n (isCallDropped ? 'call_missed' : 'call_received') :\n (isCallDropped ? 'call_missed_outgoing' : 'call_made');\n let duration;\n if (isCallDropped) {\n switch (this.props.callState) {\n case 'declined':\n duration = ;\n break;\n case 'missed':\n duration = this.props.incoming ?\n :\n ;\n break;\n default:\n duration = ;\n break;\n }\n } else {\n duration = {secondsToTime(this.props.duration / 1000)} ;\n }\n return \n
call
\n
\n
{this.props.incoming ?\n :\n \n }
\n
{callIcon} {duration}
\n
\n
;\n }\n}\n","// The counter of unread messages in the topic.\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport { secondsToTime } from '../lib/strformat.js';\n\n// Props:\n// incoming: true | false.\n// success: true | false.\nexport default class CallStatus extends React.PureComponent {\n render() {\n const isCallDropped = ['declined', 'disconnected', 'missed'].includes(this.props.callState);\n const icon2 = this.props.incoming ?\n (isCallDropped ? 'call_missed' : 'call_received') :\n (isCallDropped ? 'call_missed_outgoing' : 'call_made');\n let duration;\n if (isCallDropped) {\n switch (this.props.callState) {\n case 'declined':\n duration = ;\n break;\n case 'missed':\n duration = this.props.incoming ?\n :\n ;\n break;\n default:\n duration = ;\n break;\n }\n } else if (['accepted', 'started'].includes(this.props.callState) && !this.props.duration) {\n duration = \n } else {\n duration = {secondsToTime(this.props.duration / 1000)} ;\n }\n return (\n <>\n \n call {icon2} \n
{duration}\n >\n );\n }\n};\n","// Element which shows static video preview:\n// an image with duration and a play button in the middle.\n\nimport React from 'react';\n\nimport { secondsToTime } from '../lib/strformat.js'\n\nexport default class InlineVideo extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.videoRef = React.createRef();\n\n this.handleClick = this.handleClick.bind(this);\n }\n\n handleClick(e) {\n if (this.props.onClick) {\n // the click target has to be the image element.\n this.props.onClick(e);\n }\n }\n\n render() {\n const duration = secondsToTime(this.props['data-duration'] / 1000);\n const className = 'inline-video' + (this.props.onClick ? ' image-clickable' : '');\n return (\n \n {React.createElement('img', this.props)}\n {this.props.onClick ?\n
\n play_arrow \n
\n : null}\n {duration ?
{duration}
: null}\n
\n );\n }\n};\n","// Image with a placeholder which is replaced when the promise is resolved.\nimport React from 'react';\n\nexport default class LazyImage extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.state = {\n src: this.props.isvideo ? 'img/blankvid.png' : 'img/blankimg.png',\n style: Object.assign({padding: '4px'}, this.props.style),\n className: this.props.className,\n alt: this.props.alt,\n onClick: this.props.onClick,\n };\n }\n\n componentDidMount() {\n // whenDone is a wrapper around an actual promise to be able to cancel it.\n this.props.whenDone\n .promise\n .then(data => this.setState({src: data.src, style: {...this.state.style, padding: 0}}))\n .catch(_ => this.setState({src: this.props.isvideo ? 'img/broken_video.png' : 'img/broken_image.png'}));\n }\n\n componentWillUnmount() {\n this.props.whenDone.cancel();\n }\n\n componentDidUpdate(prevProps) {\n if (prevProps.whenDone != this.props.whenDone) {\n this.setState({src: this.props.isvideo ? 'img/blankvid.png' : 'img/blankimg.png', style: {...this.state.style, padding: '4px'}});\n this.props.whenDone\n .promise\n .then(data => this.setState({src: data.src, style: {...this.state.style, padding: 0}}))\n .catch(_ => this.setState({src: this.props.isvideo ? 'img/broken_video.png' : 'img/broken_image.png'}));\n }\n }\n\n render() {\n return React.createElement('img', this.state);\n }\n};\n","// File uload/download progress indicator with a cancel inside.\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nexport default class FileProgress extends React.PureComponent {\n render() {\n return (\n \n );\n }\n}\n","// Image view with progress bar and a cancel button.\nimport React from 'react';\n\nimport FileProgress from './file-progress.jsx';\n\nexport default class UploadingImage extends React.PureComponent {\n constructor(props) {\n super(props);\n }\n\n render() {\n return (\n \n {React.createElement('img', this.props)}\n
\n \n
\n
\n );\n }\n};\n","import React from 'react';\nimport { defineMessages } from 'react-intl';\n\nimport { Drafty } from 'tinode-sdk';\n\nimport AudioPlayer from '../widgets/audio-player.jsx'\nimport CallMessage from '../widgets/call-message.jsx'\nimport CallStatus from '../widgets/call-status.jsx';\nimport InlineVideo from '../widgets/inline-video.jsx';\nimport LazyImage from '../widgets/lazy-image.jsx'\nimport UploadingImage from '../widgets/uploading-image.jsx'\n\nimport { BROKEN_IMAGE_SIZE, IMAGE_THUMBNAIL_DIM, NO_DIMENSIONS_VIDEO, REM_SIZE, VIDEO_THUMBNAIL_WIDTH } from '../config.js';\nimport { base64ToBlob, blobToBase64, fitImageSize, imageScaled } from './blob-helpers.js';\nimport { idToColorClass, secondsToTime, shortenFileName } from './strformat.js';\nimport { cancelablePromise, sanitizeUrlForMime } from './utils.js';\n\nconst messages = defineMessages({\n drafty_form: {\n id: 'drafty_form',\n defaultMessage: 'Form: ',\n description: 'Comment for form in Drafty'\n },\n drafty_attachment: {\n id: 'drafty_attachment',\n defaultMessage: 'Attachment',\n description: 'Comment for attachment in Drafty'\n },\n drafty_image: {\n id: 'drafty_image',\n defaultMessage: 'Picture',\n description: 'Comment for embedded images in Drafty'\n },\n drafty_video: {\n id: 'drafty_video',\n defaultMessage: 'Video recording',\n description: 'Comment for videos embedded in Drafty'\n },\n drafty_unknown: {\n id: 'drafty_unknown',\n defaultMessage: 'Unsupported',\n description: 'Unsupported entity in drafty'\n }\n});\n\n// The main Drafty formatter: converts Drafty elements into React classes. 'this' is set by the caller.\n// 'this' must contain:\n// viewportWidth:\n// authorizeURL:\n// onImagePreview:\n// onVideoPreview:\n// onFormButtonClick:\n// onQuoteClick:\nexport function fullFormatter(style, data, values, key, stack) {\n if (stack.includes('QQ')) {\n return quoteFormatter.call(this, style, data, values, key);\n }\n\n if (!style) {\n // Unformatted.\n return values;\n }\n\n let el = Drafty.tagName(style);\n let attr = Drafty.attrValue(style, data) || {};\n attr.key = key;\n switch (style) {\n case 'AU':\n // Show audio player.\n if (attr.src) {\n attr.src = this.authorizeURL(sanitizeUrlForMime(attr.src, 'audio'));\n attr.duration = data.duration > 0 ? (data.duration | 0) : undefined;\n attr.preview = data.preview;\n attr.loading = 'lazy';\n }\n el = AudioPlayer;\n // Audio element cannot have content.\n values = null;\n break;\n case 'BR':\n values = null;\n break;\n case 'EX':\n // Ignore.\n break;\n case 'HL':\n // Highlighted text. Assign class name.\n attr.className = 'highlight';\n break;\n case 'HD':\n el = null;\n values = null;\n break;\n case 'IM':\n // Additional processing for images\n el = handleImageData.call(this, el, data, attr);\n // Image element cannot have content.\n values = null;\n break;\n case 'BN':\n // Button\n attr.onClick = this.onFormButtonClick;\n let inner = React.Children.map(values, (child) => {\n return typeof child == 'string' ? child : undefined;\n });\n if (!inner || inner.length == 0) {\n inner = [attr.name]\n }\n // Get text which will be sent back when the button is clicked.\n attr['data-title'] = inner.join('');\n break;\n case 'MN':\n // Mention\n attr.className = 'mention'\n if (data) {\n attr.className += ' ' + idToColorClass(data.val, false, true);\n }\n break;\n case 'FM':\n // Form\n attr.className = 'bot-form';\n break;\n case 'RW':\n // Form element formatting is dependent on element content.\n break;\n case 'QQ':\n // Quote/citation.\n attr.className = 'reply-quote'\n attr.onClick = this.onQuoteClick;\n break;\n case 'VC':\n el = CallMessage;\n // Video call messages do not have content.\n values = null;\n if (data) {\n attr.callState = data.state;\n attr.incoming = data.incoming;\n attr.duration = data.duration;\n }\n break;\n case 'VD':\n // Additional processing for videos.\n el = handleVideoData.call(this, el, data, attr);\n // Video element cannot have content.\n values = null;\n break;\n default:\n if (!el) {\n // Unknown element.\n el = React.Fragment;\n attr = {key: key};\n // Generate comment for unknown element.\n let body = values;\n if (!Array.isArray(values) || !values.join('').trim()) {\n body = [{this.formatMessage(messages.drafty_unknown)} ];\n }\n values = [extension , ' '].concat(body);\n }\n break;\n }\n if (!el) {\n return values;\n }\n return React.createElement(el, attr, values);\n}\n\n// Additional processing of image data.\nfunction handleImageData(el, data, attr) {\n if (!data) {\n attr.src = 'img/broken_image.png';\n attr.style = {\n width: IMAGE_THUMBNAIL_DIM + 'px',\n height: IMAGE_THUMBNAIL_DIM + 'px',\n };\n return el;\n }\n\n attr.className = 'inline-image';\n const dim = fitImageSize(data.width, data.height,\n this.viewportWidth > 0 ? Math.min(this.viewportWidth - REM_SIZE * 6.5, REM_SIZE * 34.5) :\n REM_SIZE * 34.5, REM_SIZE * 24, false) ||\n {dstWidth: BROKEN_IMAGE_SIZE, dstHeight: BROKEN_IMAGE_SIZE};\n attr.style = {\n width: dim.dstWidth + 'px',\n height: dim.dstHeight + 'px',\n // Looks like a Chrome bug: broken image does not respect 'width' and 'height'.\n minWidth: dim.dstWidth + 'px',\n minHeight: dim.dstHeight + 'px'\n };\n if (!Drafty.isProcessing(data)) {\n attr.src = this.authorizeURL(sanitizeUrlForMime(attr.src, 'image'));\n attr.alt = data.name;\n if (attr.src) {\n if (Math.max(data.width || 0, data.height || 0) > IMAGE_THUMBNAIL_DIM) {\n // Allow previews for large enough images.\n attr.onClick = this.onImagePreview;\n attr.className += ' image-clickable';\n }\n attr.loading = 'lazy';\n } else {\n attr.src = null;\n }\n } else {\n // Use custom element instead of .\n el = UploadingImage;\n }\n\n return el;\n}\n\n// Additional processing of image data.\nfunction handleVideoData(el, data, attr) {\n if (!data) {\n attr.src = 'img/broken_video.png';\n attr.style = {\n width: IMAGE_THUMBNAIL_DIM + 'px',\n height: IMAGE_THUMBNAIL_DIM + 'px',\n };\n return el;\n }\n attr.className = 'inline-image';\n const dim = fitImageSize(data.width, data.height,\n this.viewportWidth > 0 ? Math.min(this.viewportWidth - REM_SIZE * 6.5, REM_SIZE * 34.5) :\n REM_SIZE * 34.5, REM_SIZE * 24, false) ||\n {dstWidth: NO_DIMENSIONS_VIDEO, dstHeight: NO_DIMENSIONS_VIDEO};\n attr.style = {\n width: dim.dstWidth + 'px',\n height: dim.dstHeight + 'px',\n // Looks like a Chrome bug: broken image does not respect 'width' and 'height'.\n minWidth: dim.dstWidth + 'px',\n minHeight: dim.dstHeight + 'px'\n };\n if (!Drafty.isProcessing(data)) {\n attr.src = this.authorizeURL(sanitizeUrlForMime(attr.src, 'image'));\n attr.alt = data.name;\n if (data.ref || data.val) {\n attr.onClick = this.onVideoPreview;\n attr.loading = 'lazy';\n } else {\n attr.src = null;\n }\n el = InlineVideo;\n } else {\n // Use custom element instead of .\n el = UploadingImage;\n }\n\n return el;\n}\n\n// Converts Drafty object into a one-line preview. 'this' is set by the caller.\n// 'this' must contain:\n// formatMessage: this.props.intl.formatMessage\n// messages: formatjs messages defined with defineMessages.\nexport function previewFormatter(style, data, values, key) {\n if (!style) {\n // Unformatted.\n return values;\n }\n\n let el = Drafty.tagName(style);\n const attr = { key: key };\n switch (style) {\n case 'AU':\n // Voicemail as '[mic] 0:00'.\n el = React.Fragment;\n values = [mic , ' ', secondsToTime(data.duration/1000)];\n break;\n case 'BR':\n // Replace new line with a space.\n el = React.Fragment;\n values = [' '];\n break;\n case 'HL':\n // Make highlight less prominent in preview.\n attr.className = 'highlight preview';\n break;\n case 'LN':\n case 'MN':\n // Disable links in previews.\n el = 'span';\n break;\n case 'IM':\n // Replace image with '[icon] Image'.\n el = React.Fragment;\n values = [photo , ' ', this.formatMessage(messages.drafty_image)];\n break;\n case 'BN':\n el = 'span';\n attr.className = 'flat-button faux';\n break;\n case 'FM':\n el = React.Fragment;\n values = [dashboard ,\n this.formatMessage(messages.drafty_form)].concat(' ', values || []);\n break;\n case 'RW':\n el = React.Fragment;\n break;\n case 'EX':\n if (data) {\n if (data.mime == 'application/json') {\n // Ignore JSON attachments: they are form response payloads.\n return null;\n }\n // Clear payload.\n delete data.val;\n delete data.ref;\n }\n el = React.Fragment;\n values = [attachment , ' ', this.formatMessage(messages.drafty_attachment)];\n break;\n case 'VC':\n el = CallStatus;\n if (data) {\n attr.callState = data.state;\n attr.incoming = data.incoming;\n attr.duration = data.duration;\n }\n values = null;\n break;\n case 'QQ':\n case 'HD':\n el = null;\n values = null;\n break;\n case 'VD':\n // Replace image with '[icon] Video'.\n el = React.Fragment;\n values = [play_circle_outline , ' ', this.formatMessage(messages.drafty_video)];\n break;\n default:\n if (!el) {\n // Unknown element.\n el = React.Fragment;\n values = [extension , ' ', this.formatMessage(messages.drafty_unknown)];\n }\n break;\n }\n if (!el) {\n return values;\n }\n return React.createElement(el, attr, values);\n};\n\n// Converts Drafty object into a quoted reply; 'this' is set by the caller.\nfunction inlineImageAttr(attr, data) {\n attr.style = {\n width: IMAGE_THUMBNAIL_DIM + 'px',\n height: IMAGE_THUMBNAIL_DIM + 'px',\n maxWidth: IMAGE_THUMBNAIL_DIM + 'px',\n maxHeight: IMAGE_THUMBNAIL_DIM + 'px',\n }\n attr.className = 'inline-image';\n attr.alt = this.formatMessage(messages.drafty_image);\n if (!data) {\n attr.src = 'img/broken_image.png';\n } else {\n attr.src = attr.src || 'img/broken_image.png';\n }\n attr.title = attr.alt;\n return attr;\n}\n\n// Converts Drafty object into a quoted reply; 'this' is set by the caller.\nfunction inlineVideoAttr(attr, data) {\n const dim = fitImageSize(data.width, data.height, VIDEO_THUMBNAIL_WIDTH, IMAGE_THUMBNAIL_DIM);\n attr.style = {\n width: dim.width + 'px',\n height: dim.height + 'px',\n maxWidth: VIDEO_THUMBNAIL_WIDTH + 'px',\n maxHeight: IMAGE_THUMBNAIL_DIM + 'px',\n }\n attr.className = 'inline-image';\n attr.alt = this.formatMessage(messages.drafty_video);\n attr.title = attr.alt;\n if (!data) {\n attr.src = 'img/broken_video.png';\n } else {\n attr.src = attr.src || 'img/broken_video.png';\n }\n return attr;\n}\n\n// Displays a portion of Drafty within 'QQ' quotes. 'this' is set by the caller.\n// 'this' must contain:\n// formatMessage: this.props.intl.formatMessage\n// messages: formatjs messages defined with defineMessages.\n// authorizeURL: this.props.tinode.authorizeURL\n// onQuoteClick: this.handleQuoteClick (optional)\nfunction quoteFormatter(style, data, values, key) {\n if (['BR', 'EX', 'IM', 'MN', 'VD'].includes(style)) {\n let el = Drafty.tagName(style);\n let attr = Drafty.attrValue(style, data) || {};\n attr.key = key;\n switch(style) {\n case 'BR':\n values = null;\n break;\n case 'IM':\n attr = inlineImageAttr.call(this, attr, data);\n values = [React.createElement('img', attr, null), ' ', attr.alt];\n el = React.Fragment;\n // Fragment attributes.\n attr = {key: key};\n break;\n case 'VD':\n attr = inlineVideoAttr.call(this, attr, data);\n values = [React.createElement('img', attr, null), ' ', attr.alt];\n el = React.Fragment;\n // Fragment attributes.\n attr = {key: key};\n break;\n case 'MN':\n el = 'span';\n attr.className = 'mention'\n if (data) {\n attr.className += ' ' + idToColorClass(data.val, false, true);\n }\n break;\n case 'EX':\n let fname;\n if (data) {\n if (data.mime == 'application/json') {\n // Ignore JSON attachments: they are form response payloads.\n return null;\n }\n fname = data.name;\n // Clear payload.\n delete data.val;\n delete data.ref;\n }\n el = React.Fragment;\n values = [attachment ,\n shortenFileName(fname, 16) || this.formatMessage(messages.drafty_attachment)];\n break;\n }\n return React.createElement(el, attr, values);\n }\n return previewFormatter.call(this, style, data, values, key);\n}\n\n// Create image thumbnail suitable for inclusion in a quote.\nfunction quoteImageOrVideo(data, isVideo) {\n let promise;\n let bits, ref, mime;\n if (isVideo) {\n bits = data.preview;\n mime = data.premime || 'image/jpeg';\n ref = data.preref;\n } else {\n bits = data.val;\n mime = data.mime;\n ref = data.ref;\n }\n // Get the blob from the image data.\n if (bits) {\n const blob = base64ToBlob(bits, mime);\n if (!blob) {\n throw new Error(\"Invalid image\");\n }\n promise = Promise.resolve(blob);\n } else if (ref) {\n promise = fetch(this.authorizeURL(sanitizeUrlForMime(ref, 'image')))\n .then(evt => {\n if (evt.ok) {\n return evt.blob();\n } else {\n throw new Error(`Image fetch unsuccessful: ${evt.status} ${evt.statusText}`);\n }\n });\n } else {\n throw new Error(\"Missing image data\");\n }\n\n // Scale the blob.\n return promise\n .then(blob => {\n // If it's an image, cut the square from the center of the image and shrink it.\n // If it's a video, allow it to be rectantular.\n return imageScaled(blob, isVideo ? VIDEO_THUMBNAIL_WIDTH : IMAGE_THUMBNAIL_DIM, IMAGE_THUMBNAIL_DIM, -1, !isVideo)\n }).then(scaled => {\n if (isVideo) {\n data.premime = scaled.mime;\n } else {\n data.mime = scaled.mime;\n }\n data.size = scaled.blob.size;\n data.width = scaled.width;\n data.height = scaled.height;\n delete data.ref;\n delete data.preref;\n // Keeping the original file name, if provided: ex.data.name;\n\n data.src = URL.createObjectURL(scaled.blob);\n return blobToBase64(scaled.blob);\n }).then(b64 => {\n if (isVideo) {\n data.preview = b64.bits;\n } else {\n data.val = b64.bits;\n }\n return data;\n }).catch(err => {\n delete data.val;\n delete data.preview;\n delete data.src;\n data.width = IMAGE_THUMBNAIL_DIM;\n data.height = IMAGE_THUMBNAIL_DIM;\n // Rethrow.\n throw err;\n });\n}\n\n// Create a preview of a reply.\nexport function replyFormatter(style, data, values, key, stack) {\n if (style == 'IM' || style == 'VD') {\n const isImage = style == 'IM';\n const attr = isImage ? inlineImageAttr.call(this, {key: key}, data) :\n inlineVideoAttr.call(this, {key: key}, data);\n\n let loadedPromise;\n try {\n loadedPromise = cancelablePromise(quoteImageOrVideo.call(this, data, style == 'VD'));\n } catch (error) {\n console.warn(\"Failed to quote image:\", error.message);\n loadedPromise = cancelablePromise(error);\n }\n attr.whenDone = loadedPromise;\n values = [React.createElement(LazyImage, attr, null), ' ', attr.alt];\n return React.createElement(React.Fragment, {key: key}, values);\n } else if (style == 'QQ') {\n if (stack.includes('QQ')) {\n // Quote inside quote when forwarding a message.\n return React.createElement('span', {key: key},\n [format_quote , ' ']);\n }\n\n const attr = Drafty.attrValue('QQ', data) || {};\n attr.key = key;\n attr.className = 'reply-quote'\n return React.createElement(Drafty.tagName('QQ'), attr, values);\n }\n return quoteFormatter.call(this, style, data, values, key);\n}\n","// A single topic or user.\nimport React from 'react';\nimport { FormattedMessage, injectIntl } from 'react-intl';\n\nimport ContactBadges from './contact-badges.jsx';\nimport LetterTile from './letter-tile.jsx';\nimport UnreadBadge from './unread-badge.jsx';\n\nimport { Drafty } from 'tinode-sdk';\n\nimport { previewFormatter } from '../lib/formatters.js';\nimport { deliveryMarker } from '../lib/utils.js';\n\nclass Contact extends React.Component {\n constructor(props) {\n super(props);\n\n this.handleClick = this.handleClick.bind(this);\n this.handleContextClick = this.handleContextClick.bind(this);\n }\n\n handleClick(e) {\n e.preventDefault();\n e.stopPropagation();\n if (this.props.onSelected) {\n // Index this.props.index is used by GroupManager.\n this.props.onSelected(this.props.item, this.props.index);\n }\n }\n\n handleContextClick(e) {\n e.preventDefault();\n e.stopPropagation();\n this.props.showContextMenu({ topicName: this.props.item, y: e.pageY, x: e.pageX });\n }\n\n render() {\n let title = this.props.title;\n if (!title) {\n title = ;\n } else if (title.length > 30) {\n // FIXME: this is probably wrong for RTL languages.\n title = title.substring(0, 28) + '…';\n }\n const online = this.props.now ? 'online' : 'offline';\n const avatar = this.props.avatar ? this.props.avatar : true;\n const badges = this.props.badges ? this.props.badges.slice() : [];\n const icon_badges = [];\n if (this.props.isVerified) {\n icon_badges.push({icon: 'verified', color: 'verified-color'});\n }\n if (this.props.isStaff) {\n icon_badges.push({icon: 'staff', color: 'staff-color'});\n }\n if (this.props.isDangerous) {\n icon_badges.push({icon: 'dangerous', color: 'danger-color'});\n }\n if (this.props.acs) {\n if (this.props.showMode) {\n badges.push({name: this.props.acs.getMode(), key: 'mode'});\n }\n if (this.props.acs.isMuted()) {\n icon_badges.push({icon: 'muted'});\n }\n if (!this.props.acs.isJoiner()) {\n icon_badges.push({icon: 'banned'});\n }\n }\n\n // The this.props.preview contains alreay shortened Drafty or string.\n let preview;\n if (typeof this.props.preview == 'string') {\n preview = this.props.preview;\n } else if (Drafty.isValid(this.props.preview)) {\n preview = React.createElement(React.Fragment, null, Drafty.format(this.props.preview, previewFormatter,\n {formatMessage: this.props.intl.formatMessage, previewIsResponse: this.props.previewIsResponse}));\n } else if (this.props.preview) {\n preview =\n <>warning_amber \n \n >;\n }\n\n const icon = deliveryMarker(this.props.received);\n const marker = icon ? {icon.name} : null;\n const titleClass = 'contact-title' + (this.props.deleted ? ' deleted' : '');\n\n return (\n \n \n \n {this.props.deleted ? cancel :\n this.props.showOnline ? :\n (this.props.showCheckmark && this.props.selected) ?\n check_circle \n : null}\n
\n \n
{title} \n {this.props.isGroup ?
group : null}\n {this.props.isChannel ?
: null}\n
\n {!this.props.deleted ?
: null}\n
\n {this.props.showMode ?\n
:\n this.props.small ? null :
{marker}{preview || this.props.comment || '\\u00A0'}
}\n
\n {this.props.showContextMenu ?\n \n \n expand_more \n \n : null}\n \n );\n }\n};\n\nexport default injectIntl(Contact);\n","// A panel included into a list of contacts with an action text.\nimport React from 'react';\nimport { injectIntl } from 'react-intl';\n\nclass ContactAction extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.handleClick = this.handleClick.bind(this);\n }\n\n handleClick(e) {\n e.preventDefault();\n e.stopPropagation();\n this.props.onAction(this.props.action);\n }\n\n render() {\n const {formatMessage} = this.props.intl;\n return (\n \n {formatMessage(this.props.title, this.props.values)}
\n \n );\n }\n};\n\nexport default injectIntl(ContactAction);\n","// ContactList: component for showing a list of contacts,\n// such as a list of group members in a group chat.\nimport React from 'react';\nimport { defineMessages, injectIntl } from 'react-intl';\n\nimport { Drafty, Tinode } from 'tinode-sdk';\n\nimport Contact from './contact.jsx';\nimport ContactAction from './contact-action.jsx';\n\nimport { makeImageUrl } from '../lib/blob-helpers.js';\n\nimport { MESSAGE_PREVIEW_LENGTH } from '../config.js';\n\nconst messages = defineMessages({\n badge_you: {\n id: 'badge_you',\n defaultMessage: 'you',\n description: 'Badge for indicating the current user'\n },\n badge_owner: {\n id: 'badge_owner',\n defaultMessage: 'owner',\n description: 'Badge for indicating the owner'\n }\n});\n\nclass ContactList extends React.Component {\n render() {\n const { formatMessage } = this.props.intl;\n const showCheckmark = Array.isArray(this.props.topicSelected);\n const contactNodes = [];\n let contactsCount = 0;\n if (this.props.contacts && this.props.contacts.length > 0) {\n this.props.contacts.map((c) => {\n if (c.action) {\n // Action item\n contactNodes.push(\n );\n } else {\n // Normal contact\n const key = this.props.showMode ? c.user : (c.topic || c.user);\n // If filter function is provided, filter out the items\n // which don't satisfy the condition.\n if (this.props.filterFunc && this.props.filter) {\n const filterOn = [key];\n if (c.private && c.private.comment) {\n filterOn.push(('' + c.private.comment).toLowerCase());\n }\n if (c.public && c.public.fn) {\n filterOn.push(('' + c.public.fn).toLowerCase());\n }\n if (!this.props.filterFunc(this.props.filter, filterOn)) {\n return;\n }\n }\n\n const isChannel = Tinode.isChannelTopicName(key);\n const isGroup = !isChannel && Tinode.isGroupTopicName(key);\n const selected = showCheckmark ?\n (this.props.topicSelected.indexOf(key) > -1) :\n (this.props.topicSelected === key);\n const badges = [];\n if (this.props.showMode) {\n if (key == this.props.myUserId) {\n badges.push({name: formatMessage(messages.badge_you), color: 'green'});\n }\n if (c.acs && c.acs.isOwner()) {\n badges.push({name: formatMessage(messages.badge_owner), color: 'blue'});\n }\n }\n\n const comment = Array.isArray(c.private) ?\n c.private.join(',') : (c.private ? c.private.comment : null);\n let preview;\n let forwarded;\n let previewIsResponse;\n let deliveryStatus;\n if (!this.props.showMode && c.latestMessage) {\n const msg = c.latestMessage();\n if (msg) {\n forwarded = msg.head ? msg.head.forwarded : null;\n deliveryStatus = msg._status || c.msgStatus(msg, true);\n previewIsResponse = msg.from != this.props.myUserId;\n if (msg.content) {\n preview = typeof msg.content == 'string' ?\n msg.content.substr(0, MESSAGE_PREVIEW_LENGTH) :\n Drafty.preview(msg.content, MESSAGE_PREVIEW_LENGTH);\n }\n }\n }\n\n contactNodes.push(\n \n );\n contactsCount ++;\n }\n }, this);\n }\n\n return (\n \n {contactsCount == 0 ?\n
\n :\n null\n }\n {contactNodes.length > 0 ?\n
\n :\n null\n }\n
\n );\n }\n};\n\nexport default injectIntl(ContactList);\n","import React from 'react';\n\nimport { Tinode } from 'tinode-sdk';\n\nexport default class SearchContacts extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.state = {\n edited: false,\n search: ''\n };\n\n this.handleSearchChange = this.handleSearchChange.bind(this);\n this.handleSearch = this.handleSearch.bind(this);\n this.handleClear = this.handleClear.bind(this);\n this.handleKeyDown = this.handleKeyDown.bind(this);\n }\n\n componentWillUnmount() {\n if (this.state.edited) {\n this.setState({search: '', edited: false});\n this.props.onSearchContacts(Tinode.DEL_CHAR);\n }\n }\n\n handleSearchChange(e) {\n this.setState({search: e.target.value});\n }\n\n handleSearch(e) {\n e.preventDefault();\n const query = this.state.search.trim();\n this.setState({edited: (query.length > 0)});\n this.props.onSearchContacts(query.length > 0 ? query : Tinode.DEL_CHAR);\n }\n\n handleClear(e) {\n e.preventDefault();\n if (this.state.edited) {\n this.props.onSearchContacts(Tinode.DEL_CHAR);\n }\n this.setState({search: '', edited: false});\n }\n\n handleKeyDown(e) {\n if (e.key === 'Enter') {\n this.handleSearch(e);\n } else if (e.key === 'Escape') {\n this.handleClear();\n }\n }\n\n render() {\n return (\n \n );\n }\n};\n","// Forward Menu: message forwarding popup/dropdown menu.\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport { Tinode } from 'tinode-sdk';\n\nimport ContactList from './contact-list.jsx';\nimport SearchContacts from './search-contacts.jsx';\n\nexport default class ForwardDialog extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = {\n query: null\n };\n\n this.handleEscapeKey = this.handleEscapeKey.bind(this);\n this.handleClose = this.handleClose.bind(this);\n\n this.handleSearchContacts = this.handleSearchContacts.bind(this);\n this.handleContactSelected = this.handleContactSelected.bind(this);\n }\n\n componentDidMount() {\n this.props.onInitFind();\n }\n\n handleEscapeKey(e) {\n if (e.keyCode === 27) {\n // Not forwarding the message.\n this.props.hide(false);\n }\n }\n\n handleClose(e) {\n e.preventDefault();\n this.props.hide(false);\n }\n\n handleSearchContacts(query) {\n this.setState({ query: Tinode.isNullValue(query) ? null : query });\n this.props.onSearchContacts(query);\n }\n\n handleContactSelected(uid) {\n this.props.onTopicSelected(uid);\n this.props.hide(true);\n }\n\n render() {\n let contacts = this.state.query != null ? this.props.searchResults : this.props.contacts;\n // Filter out contacts without a 'W' or 'J' permissions as well as the current topic.\n contacts = contacts.filter((c) => {\n return (c.name != this.props.topicSelected) && c.acs.isJoiner() && c.acs.isWriter();\n });\n\n return (\n \n
\n
\n
{\n (search_placeholder) => \n } \n
{\n (not_found_placeholder) => \n } \n
\n
\n );\n }\n}\n","import React from 'react';\nimport { defineMessages, injectIntl } from 'react-intl';\n\nconst icon_mapping = {'staff': 'verified_user'};\n\nconst messages = defineMessages({\n badge_verified: {\n id: 'badge_verified',\n defaultMessage: 'Verified/official',\n description: 'Explanation of a verified account or topic badge'\n },\n badge_staff: {\n id: 'badge_staff',\n defaultMessage: 'Staff-managed',\n description: 'Explanation of a staff-managed account or topic badge'\n },\n badge_danger: {\n id: 'badge_danger',\n defaultMessage: 'Untrustworthy',\n description: 'Suspicious or untrustworthy account or topic badge'\n },\n});\n\n\n/* Trusted badges with labels: verified, staff, danger */\nclass BadgeList extends React.PureComponent {\n render() {\n const {formatMessage} = this.props.intl;\n let badges = null;\n if (this.props.trustedBadges && this.props.trustedBadges.length > 0) {\n badges = [];\n this.props.trustedBadges.map((b) => {\n const comment = this.props.short ? null : formatMessage(messages['badge_' + b]);\n const style = 'material-icons ' + b + '-color';\n badges.push({icon_mapping[b] || b} {comment}
);\n });\n return <>{badges}>;\n }\n return null;\n }\n};\n\nexport default injectIntl(BadgeList);\n","// Video call states.\nexport const CALL_STATE_NONE = 0;\nexport const CALL_STATE_OUTGOING_INITATED = 1;\nexport const CALL_STATE_INCOMING_RECEIVED = 2;\nexport const CALL_STATE_IN_PROGRESS = 3;\n\n// Video call message headers representing call state.\nexport const CALL_HEAD_STARTED = 'started';\n","// IncomingCall: displays Accept & Reject buttons for incoming calls.\nimport React from 'react';\n\nimport BadgeList from './badge-list.jsx';\nimport LetterTile from './letter-tile.jsx';\n\nimport { MAX_TITLE_LENGTH, MAX_PEER_TITLE_LENGTH } from '../config.js';\nimport { CALL_STATE_INCOMING_RECEIVED } from '../constants.js';\n\nimport { makeImageUrl } from '../lib/blob-helpers.js';\nimport { clipStr } from '../lib/utils.js'\n\nconst RING_SOUND = new Audio('audio/call-in.m4a');\n\nexport default class CallIncoming extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = {\n topic: null,\n fullName: undefined,\n avatar: null,\n trustedBadges: [],\n previousMetaDesc: undefined,\n };\n\n this.resetDesc = this.resetDesc.bind(this);\n this.onMetaDesc = this.onMetaDesc.bind(this);\n this.handleRejectCall = this.handleRejectCall.bind(this);\n this.handleAcceptCall = this.handleAcceptCall.bind(this);\n this.ringTimer = null;\n }\n\n componentDidMount() {\n const topic = this.props.tinode.getTopic(this.props.topic);\n if (!topic) {\n return;\n }\n\n this.resetDesc(topic);\n if (this.props.callState == CALL_STATE_INCOMING_RECEIVED) {\n // play() throws if the user did not click the app first: https://goo.gl/xX8pDD.\n RING_SOUND.play().catch(_ => {});\n this.ringTimer = setInterval(_ => {RING_SOUND.play().catch(_ => {})}, 2000);\n this.props.onRinging(this.props.topic, this.props.seq);\n }\n }\n\n // No need to separately handle component mount.\n componentDidUpdate(props) {\n const topic = this.props.tinode.getTopic(props.topic);\n if (!topic) {\n return;\n }\n\n if (this.onMetaDesc != topic.onMetaDesc) {\n this.previousMetaDesc = topic.onMetaDesc;\n topic.onMetaDesc = this.onMetaDesc;\n }\n\n if (this.state.topic != props.topic) {\n this.setState({topic: props.topic});\n this.resetDesc(topic, props);\n }\n }\n\n componentWillUnmount() {\n if (this.ringTimer != null) {\n clearInterval(this.ringTimer);\n RING_SOUND.pause();\n }\n const topic = this.props.tinode.getTopic(this.props.topic);\n if (!topic) {\n return;\n }\n this.setState({topic: null});\n topic.onMetaDesc = this.previousMetaDesc;\n }\n\n resetDesc(topic) {\n const badges = [];\n if (topic.trusted) {\n for (const [key, val] of Object.entries(topic.trusted)) {\n if (val) {\n badges.push(key);\n }\n }\n }\n\n this.setState({\n fullName: clipStr(topic.public ? topic.public.fn : undefined, MAX_TITLE_LENGTH),\n avatar: makeImageUrl(topic.public ? topic.public.photo : null),\n trustedBadges: badges,\n });\n }\n\n onMetaDesc(desc) {\n const topic = this.props.tinode.getTopic(this.props.topic);\n if (!topic) {\n return;\n }\n this.resetDesc(topic);\n\n if (this.previousMetaDesc && this.previousMetaDesc != this.onMetaDesc) {\n this.previousMetaDesc(desc);\n }\n }\n\n handleAcceptCall() {\n this.props.onAcceptCall(this.props.topic);\n }\n\n handleRejectCall() {\n this.props.onReject(this.props.topic, this.props.seq);\n this.props.onClose();\n }\n\n render() {\n return (\n \n
\n
\n
\n \n
\n
{clipStr(this.state.fullName, MAX_PEER_TITLE_LENGTH)}\n
\n
\n
\n {this.props.callState == CALL_STATE_INCOMING_RECEIVED ?\n <>\n \n call_end \n \n \n call \n \n >\n :\n null\n }\n
\n
\n
\n );\n }\n};\n","import React from 'react';\n\nexport default class LoadSpinner extends React.PureComponent {\n render() {\n const className = 'load-spinner-box' + (this.props.large ? ' large' : '')\n + (this.props.clear ? ' clear' : '') + (this.props.centered ? ' centered' : '');\n return (this.props.show ?\n : null);\n }\n}\n","import React from 'react';\n\nimport LetterTile from './letter-tile.jsx';\nimport LoadSpinner from './load-spinner.jsx';\n\nimport { sanitizeUrlForMime } from '../lib/utils.js';\n\nimport { AVATAR_SIZE } from '../config.js';\n\nexport default class AvatarUpload extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = {\n source: props.avatar\n };\n\n this.handleFileReceived = this.handleFileReceived.bind(this);\n }\n\n componentDidUpdate(prevProps) {\n if (this.props.avatar != prevProps.avatar) {\n this.setState({source: this.props.avatar});\n }\n }\n\n handleFileReceived(e) {\n const image = e.target.files[0];\n this.props.onImageUpdated(image.type, URL.createObjectURL(image), image.name);\n // Clear the value so the same file can be uploaded again.\n e.target.value = '';\n }\n\n render() {\n // Randomize id value in case more than one AvatarUpload is shown\n // at the same time.\n const randId = 'file-input-avatar-' + ('' + Math.random()).substring(0, 4);\n const className = 'avatar-upload' + (this.props.readOnly ? ' read-only' : '');\n return (\n \n {this.props.readOnly || !this.state.source ?\n null :\n
{e.preventDefault(); this.props.onImageUpdated();}}>\n clear \n }\n {this.state.source ?\n
:\n this.props.readOnly && this.props.uid ?\n
\n \n
\n :\n
{AVATAR_SIZE}×{AVATAR_SIZE}
}\n {this.props.readOnly ? null :\n
}\n {this.props.readOnly ? null :\n
\n file_upload \n }\n
\n
\n );\n }\n};\n","import React from 'react';\n\n/* CheckBox: styled three-state checkbox, either clickable or static */\nexport default class CheckBox extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.handleChange = this.handleChange.bind(this);\n }\n\n handleChange() {\n this.props.onChange(this.props.name, !this.props.checked);\n }\n\n render() {\n let classList = ['material-icons'];\n let iconName;\n if (Array.isArray(this.props.className)) {\n classList.push(...this.props.className);\n } else if (this.props.className) {\n classList.push(this.props.className);\n }\n if (this.props.onChange) {\n if (this.props.checked) {\n classList.push('blue', 'clickable');\n iconName = 'check_box';\n } else if (this.props.checked === false) {\n classList.push('blue', 'clickable');\n iconName = 'check_box_outline_blank';\n } else {\n classList.push('lt-blue');\n iconName = 'indeterminate_check_box';\n }\n } else {\n if (this.props.checked) {\n iconName = 'check_box';\n } else {\n iconName = 'check_box_outline_blank';\n }\n }\n let attrs = {\n className: classList.join(' '),\n id: this.props.id,\n };\n if (this.props.onChange) {\n attrs.onClick = this.handleChange;\n }\n return React.createElement('i', attrs, iconName);\n }\n}\n","// The X menu to be displayed in title bars.\nimport React from 'react';\n\nexport default class MenuCancel extends React.PureComponent {\n render() {\n return (\n {e.preventDefault(); this.props.onCancel();}}>\n close \n \n );\n }\n}\n","import React from 'react';\n\nimport MenuCancel from './menu-cancel.jsx';\n\nexport default class ErrorPanel extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.state = {\n show: false,\n };\n\n this.hide = this.hide.bind(this);\n }\n\n componentDidUpdate(prevProps) {\n if (prevProps.level !== this.props.level) {\n this.setState({\n show: !(!this.props.level)\n });\n }\n }\n\n hide() {\n this.setState({show: false});\n if (this.props.onClearError) {\n this.props.onClearError();\n }\n }\n\n render() {\n const icons = {err: 'error', warn: 'warning', info: 'info'}\n const level = icons[this.props.level] || '';\n const className = 'info-box ' + level;\n return (\n \n );\n }\n};\n","import React from 'react';\n\nimport LetterTile from './letter-tile.jsx';\n\nexport default class Chip extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.handleCancel = this.handleCancel.bind(this);\n }\n\n handleCancel(e) {\n e.preventDefault();\n this.props.onCancel(this.props.topic, this.props.index);\n }\n\n render() {\n const title = this.props.title || this.props.topic;\n const className = this.props.invalid ? 'chip invalid' : 'chip';\n return (\n \n {this.props.noAvatar ?\n
:\n
\n \n
\n }\n
{title} \n {this.props.onCancel && !this.props.required ?\n
× \n :
}\n
\n );\n }\n};\n","import React from 'react';\n\nimport Chip from './chip.jsx';\n\nimport { makeImageUrl } from '../lib/blob-helpers.js';\n\n/* BEGIN ChipInput: group membership widget */\nexport default class ChipInput extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = ChipInput.deriveStateFromProps(props);\n this.state.input = '';\n this.state.focused = false;\n\n this.handleTextInput = this.handleTextInput.bind(this);\n this.removeChipAt = this.removeChipAt.bind(this);\n this.handleChipCancel = this.handleChipCancel.bind(this);\n this.handleFocusGained = this.handleFocusGained.bind(this);\n this.handleFocusLost = this.handleFocusLost.bind(this);\n this.handleKeyDown = this.handleKeyDown.bind(this);\n }\n\n static deriveStateFromProps(props) {\n return {\n placeholder: props.chips ? '' : props.prompt,\n sortedChips: ChipInput.sortChips(props.chips, props.staticMembers),\n chipIndex: ChipInput.indexChips(props.chips)\n };\n }\n\n componentDidUpdate(prevProps, prevState) {\n if (prevProps.chips != this.props.chips ||\n prevProps.staticMembers != this.props.staticMembers ||\n prevProps.prompt != this.props.prompt) {\n this.setState(ChipInput.deriveStateFromProps(this.props));\n }\n if (!prevState || this.props.chips.length > prevState.sortedChips.length) {\n this.setState({input: ''});\n }\n }\n\n // Map chip index to user name\n static indexChips(chips) {\n const index = {};\n let count = 0;\n chips.map((item) => {\n index[item.user] = count;\n count ++;\n });\n return index;\n }\n\n // Have non-removable chips appear before all other chips.\n static sortChips(chips, keep) {\n const required = [];\n const normal = [];\n chips.map((item) => {\n if (keep && keep.includes(item.user)) {\n required.push(item);\n } else {\n normal.push(item);\n }\n });\n return required.concat(normal);\n }\n\n handleTextInput(e) {\n this.setState({input: e.target.value});\n if (this.props.filterFunc) {\n this.props.filterFunc(e.target.value);\n }\n }\n\n removeChipAt(idx) {\n const removed = this.state.sortedChips[idx];\n this.props.onChipRemoved(removed.user, this.state.chipIndex[removed.user]);\n }\n\n handleChipCancel(item, idx) {\n this.removeChipAt(idx);\n }\n\n handleFocusGained() {\n this.setState({focused: true});\n }\n\n handleFocusLost() {\n this.setState({focused: false});\n if (this.props.onFocusLost) {\n this.props.onFocusLost(this.state.input);\n }\n }\n\n handleKeyDown(e) {\n if (e.key === 'Backspace') {\n if (this.state.input.length == 0 && this.state.sortedChips.length > 0) {\n const at = this.state.sortedChips.length - 1;\n if (this.state.sortedChips[at].user !== this.props.staticMembers) {\n this.removeChipAt(at);\n }\n }\n } else if (e.key === 'Enter') {\n if (this.props.onEnter) {\n this.props.onEnter(this.state.input);\n }\n } else if (e.key === 'Escape') {\n if (this.props.onCancel) {\n this.props.onCancel();\n }\n }\n }\n\n render() {\n const chips = [];\n let count = 0;\n const staticMembers = this.props.staticMembers || [];\n this.state.sortedChips.map((item) => {\n chips.push(\n \n );\n count++;\n });\n const className = \"chip-input\" + (this.state.focused ? ' focused' : '');\n const autoFocus = !(this.props.tabIndex > 0);\n return (\n \n {chips}\n \n
\n );\n }\n};\n","// GroupMembers: control for managing a list of group members.\nimport React from 'react';\nimport { FormattedMessage, defineMessages, injectIntl } from 'react-intl';\n\nimport ChipInput from './chip-input.jsx';\nimport ContactList from './contact-list.jsx';\n\nconst messages = defineMessages({\n no_contacts: {\n id: 'no_contacts',\n defaultMessage: 'You have no contacts :-(',\n description: 'Shown in ContactsView when the user has no contacts'\n },\n contacts_not_found_short: {\n id: 'contacts_not_found_short',\n defaultMessage: \"No contacts match ''{query}''\",\n description: 'Shown in ContactsView when search returned no results'\n }\n});\n\nclass GroupManager extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = {\n // Array of topic members\n members: props.members,\n index: GroupManager.indexMembers(props.members),\n staticMembers: GroupManager.staticMembers(props.members, props.keepInitialMembers, props.requiredMember),\n contactFilter: '',\n noContactsMessage: props.intl.formatMessage(messages.no_contacts),\n selectedContacts: GroupManager.selectedContacts(props.members)\n };\n\n this.handleContactSelected = this.handleContactSelected.bind(this);\n this.handleMemberRemoved = this.handleMemberRemoved.bind(this);\n this.handleContactFilter = this.handleContactFilter.bind(this);\n this.handleSubmit = this.handleSubmit.bind(this);\n this.handleCancel = this.handleCancel.bind(this);\n }\n\n static indexMembers(members) {\n let index = {};\n members.map((m) => {\n index[m.user] = {delta: 0, present: true}; // Delta: 0 unchanged, +1 added, -1 removed\n });\n return index;\n }\n\n static staticMembers(members, keepInitial, requiredMember) {\n let stat = [];\n members.map((m) => {\n if (keepInitial || m.user == requiredMember) {\n stat.push(m.user);\n }\n });\n return stat;\n }\n\n static selectedContacts(members) {\n let sel = [];\n members.map((m) => {\n sel.push(m.user);\n });\n return sel;\n }\n\n handleContactSelected(userId, index) {\n let status = this.state.index[userId];\n if (status) {\n if (status.present) {\n // Prevent duplicate members\n return;\n }\n status.delta += 1;\n status.present = true;\n } else {\n status = {delta: 1, present: true};\n }\n\n let m = this.state.members.slice();\n m.push(this.props.contacts[index]);\n\n const sel = GroupManager.selectedContacts(m);\n\n const i = this.state.index;\n i[userId] = status;\n\n this.setState({members: m, index: i, selectedContacts: sel});\n }\n\n handleMemberRemoved(userId, index) {\n const status = this.state.index[userId];\n if (!status || !status.present) {\n return;\n }\n status.present = false;\n status.delta -= 1;\n\n let m = this.state.members.slice();\n m.splice(index, 1);\n\n const sel = GroupManager.selectedContacts(m);\n\n const i = this.state.index;\n i[userId] = status;\n\n this.setState({members: m, index: i, selectedContacts: sel});\n }\n\n handleContactFilter(val) {\n const {formatMessage} = this.props.intl;\n const msg = !val ?\n formatMessage(messages.no_contacts) :\n formatMessage(messages.contacts_not_found_short, {query: val});\n\n this.setState({contactFilter: val, noContactsMessage: msg});\n }\n\n static doContactFiltering(filter, values) {\n if (filter) {\n for (let i=0; i= 0) {\n return true;\n }\n }\n return false;\n }\n return true;\n }\n\n handleSubmit() {\n var instance = this;\n var members = [];\n var added = [];\n var removed = [];\n\n var keys = Object.keys(this.state.index);\n keys.map(function(k) {\n if (instance.state.index[k].present) {\n members.push(k);\n }\n\n if (instance.state.index[k].delta > 0) {\n added.push(k);\n } else if (instance.state.index[k].delta < 0) {\n removed.push(k);\n }\n });\n this.props.onSubmit(members, added, removed);\n }\n\n handleCancel() {\n this.props.onCancel();\n }\n\n render() {\n const {formatMessage} = this.props.intl;\n return (\n \n
\n \n \n \n
\n
\n \n
\n
\n \n \n \n
\n
\n
\n \n \n \n \n \n \n
\n
\n );\n }\n};\n\nexport default injectIntl(GroupManager);\n","// PermissionsEditor: Component for editing permissions\n// \nimport React from 'react';\nimport { FormattedMessage, defineMessages, injectIntl } from 'react-intl';\n\nimport CheckBox from './checkbox.jsx';\nimport Contact from './contact.jsx';\n\nimport { makeImageUrl } from '../lib/blob-helpers.js';\n\n// Translatable permission names.\nconst messages = defineMessages({\n joiner: {\n id: 'permission_join',\n defaultMessage: \"Join ({val})\",\n description: 'Name of J permission'\n },\n reader: {\n id: 'permission_read',\n defaultMessage: \"Read ({val})\",\n description: 'Name of R permission'\n },\n writer: {\n id: 'permission_write',\n defaultMessage: \"Write ({val})\",\n description: 'Name of W permission'\n },\n preser: {\n id: 'permission_pres',\n defaultMessage: \"Get notified ({val})\",\n description: 'Name of P permission'\n },\n approver: {\n id: 'permission_admin',\n defaultMessage: \"Approve ({val})\",\n description: 'Name of A permission'\n },\n sharer: {\n id: 'permission_share',\n defaultMessage: \"Share ({val})\",\n description: 'Name of S permission'\n },\n deleter: {\n id: 'permission_delete',\n defaultMessage: \"Delete ({val})\",\n description: 'Name of D permission'\n },\n owner: {\n id: 'permission_owner',\n defaultMessage: \"Owner ({val})\",\n description: 'Name of O permission'\n }\n});\n\nclass PermissionsEditor extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = {\n mode: (props.mode || '').replace('N', '')\n };\n\n this.handleChange = this.handleChange.bind(this);\n this.handleSubmit = this.handleSubmit.bind(this);\n this.handleCancel = this.handleCancel.bind(this);\n }\n\n handleChange(val) {\n let mode = this.state.mode;\n const idx = mode.indexOf(val);\n if (idx == -1) {\n mode += val;\n } else {\n mode = mode.replace(val, '');\n }\n this.setState({mode: mode});\n }\n\n handleSubmit() {\n // Normalize string, otherwise cannot check if mode has changed.\n const mode = (this.state.mode || 'N').split('').sort().join('');\n const before = (this.props.mode || 'N').split('').sort().join('')\n if (mode !== before) {\n this.props.onSubmit(mode);\n } else {\n this.props.onCancel();\n }\n }\n\n handleCancel() {\n this.props.onCancel();\n }\n\n render() {\n const {formatMessage} = this.props.intl;\n const all = 'JRWPASDO';\n const names = {\n 'J': formatMessage(messages.joiner, {val: 'J'}),\n 'R': formatMessage(messages.reader, {val: 'R'}),\n 'W': formatMessage(messages.writer, {val: 'W'}),\n 'P': formatMessage(messages.preser, {val: 'P'}),\n 'A': formatMessage(messages.approver, {val: 'A'}),\n 'S': formatMessage(messages.sharer, {val: 'S'}),\n 'D': formatMessage(messages.deleter, {val: 'D'}),\n 'O': formatMessage(messages.owner, {val: 'O'})\n };\n\n let skip = this.props.skip || '';\n let mode = this.state.mode;\n let compare = (this.props.compare || '').replace('N', '');\n let items = [];\n for (let i=0; i= 0 && mode.indexOf(c) < 0) {\n // Permission is marked as inactive: hide unchecked permissions, disable checked permissions\n continue;\n }\n items.push(\n \n {names[c]} \n {skip.indexOf(c) < 0 ?\n = 0)} onChange={this.handleChange}/>\n :\n = 0)} />\n } {this.props.compare ? \n = 0)}/>\n : null}\n \n );\n }\n\n return (\n \n {this.props.userTitle ?\n
: null}\n
\n
\n {this.props.compare ?\n \n {this.props.modeTitle} \n {this.props.compareTitle} \n :\n null}\n \n {items}\n
\n
\n
\n \n \n \n \n \n \n
\n
\n );\n }\n};\n\nexport default injectIntl(PermissionsEditor);\n","// Image zoom and crop widget.\n\nimport React from 'react';\n\nconst DEFAULT_MAX_ZOOM = 2.5;\n\nexport default class Cropper extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = {\n // Coordinates of the top left corner of the image in container coordinates.\n panX: 0,\n panY: 0,\n // Origin of the zoom in image coordinates.\n originX: 0,\n originY: 0,\n // Zoom scale.\n zoom: 1,\n // Zoom min and max.\n minZoom: 0,\n maxZoom: DEFAULT_MAX_ZOOM,\n };\n\n // References to DOM elements for hooking up events and getting screen dimensions.\n // The transparent element which captures mouse moves (moves with the image).\n this.overlay = React.createRef();\n // The image cutout window or view port (static).\n this.cutout = React.createRef();\n // Scaled and translated image preview.\n this.preview = React.createRef();\n // The main container (static).\n this.boundingBox = React.createRef();\n\n // The original image width and height before any scaling.\n this.imageWidth = 0;\n this.imageHeight = 0;\n\n // Mouse position when dragging.\n this.mouseX = 0\n this.mouseY = 0;\n // Length of the previous mouse move when dragging.\n this.prevDistance = 0;\n\n // Bounding rectangles of static elements.\n this.cutoutRect = {};\n this.bBoxRect = {};\n // Center of the bounding box.\n this.originX = 0;\n this.originY = 0;\n\n this.initScaling = this.initScaling.bind(this);\n this.onZoom = this.onZoom.bind(this);\n this.handleZoom = this.handleZoom.bind(this);\n this.mouseDown = this.mouseDown.bind(this);\n this.mouseUp = this.mouseUp.bind(this);\n this.mouseMove = this.mouseMove.bind(this);\n this.mouseTouch = this.mouseTouch.bind(this);\n this.positionAll = this.positionAll.bind(this);\n this.translate = this.translate.bind(this);\n }\n\n componentDidMount() {\n this.overlay.current.addEventListener('mousedown', this.mouseDown, { passive: true });\n this.overlay.current.addEventListener('touchstart', this.mouseDown, { passive: true });\n\n // The rectangle position is in viewport coordinates.\n this.bBoxRect = this.boundingBox.current.getBoundingClientRect();\n // Center of the bounding box in container coordinates.\n this.originX = this.bBoxRect.width / 2;\n this.originY = this.bBoxRect.height / 2;\n\n // The rectangle position is in viewport coordinates.\n this.cutoutRect = this.cutout.current.getBoundingClientRect();\n }\n\n componentWillUnmount() {\n this.overlay.current.removeEventListener('mousedown', this.mouseDown);\n this.overlay.current.removeEventListener('touchstart', this.mouseDown);\n }\n\n // Position all elements.\n positionAll(panX, panY, zoom) {\n // Zoom origin in image preview coordinates.\n this.setState({\n panX: panX,\n panY: panY,\n zoom: zoom,\n originX: this.originX - panX,\n originY: this.originY - panY,\n });\n\n // Pass cut out coordinates to caller.\n const left = (this.originX - panX) * zoom - this.originX;\n const top = (this.originY - panY) * zoom - this.originY;\n this.props.onChange(\n (left + this.cutoutRect.left - this.bBoxRect.left) / zoom,\n (top + this.cutoutRect.top - this.bBoxRect.top) / zoom,\n this.cutoutRect.width / zoom,\n this.cutoutRect.height / zoom,\n zoom);\n }\n\n // Check if new location is within the limits.\n static checkBound(currPan, img, cutout, delta) {\n let nextDiff = Math.min(0, cutout[0] - img[0] - delta, img[1] - cutout[1] + delta);\n if (nextDiff == 0) {\n // Cutout is completely within the image.\n currPan += delta;\n } else if (Math.min(0, cutout[0] - img[0], img[1] - cutout[1]) < nextDiff) {\n // Cutout is outside of the range but closer to the bound.\n currPan += delta;\n }\n return currPan;\n }\n\n initScaling() {\n // Initialize components.\n const imgRect = this.preview.current.getBoundingClientRect();\n\n this.imageWidth = imgRect.width;\n this.imageHeight = imgRect.height;\n\n // Set zoom slider's min and max values. Make sure the scaled image cannot be smaller than the cutout.\n const minZoom = Math.max(this.cutoutRect.width / imgRect.width, this.cutoutRect.height / imgRect.height);\n this.setState({\n minZoom: minZoom,\n maxZoom: Math.max(DEFAULT_MAX_ZOOM, minZoom + 1)\n });\n\n // Initial zoom level fills the bounding box at the smallest image dimension and overflows the largest, i.e. \"fill\" not \"fit\".\n const zoom = Math.max(this.bBoxRect.width / imgRect.width, this.bBoxRect.height / imgRect.height);\n // Converting from viewport coordinates to container, then panning.\n const panX = this.cutoutRect.left - this.bBoxRect.left -\n (imgRect.width - this.cutoutRect.width) / 2;\n const panY = this.cutoutRect.top - this.bBoxRect.top -\n (imgRect.height - this.cutoutRect.height) / 2;\n\n this.positionAll(panX, panY, zoom);\n }\n\n onZoom(e) {\n this.handleZoom(e.target.value);\n }\n\n handleZoom(zoom) {\n let panX = this.state.panX;\n let panY = this.state.panY;\n\n // Ensure that the image at the new zoom is not outside of the cutout boundaries.\n // Calculate image coordinates at the new zoom.\n const imgLeft = this.originX - (this.originX - panX) * zoom;\n const imgRight = imgLeft + this.imageWidth * zoom;\n // Cutout in the same coordinates as the image.\n const coLeft = this.cutoutRect.left - this.bBoxRect.left;\n const coRight = coLeft + this.cutoutRect.width;\n if (coLeft < imgLeft) {\n panX -= imgLeft - coLeft;\n } else if (coRight > imgRight) {\n panX += coRight - imgRight;\n }\n const imgTop = this.originY - (this.originY - panY) * zoom;\n const imgBottom = imgTop + this.imageHeight * zoom;\n const coTop = this.cutoutRect.top - this.bBoxRect.top;\n const coBottom = coTop + this.cutoutRect.height;\n if (coTop < imgTop) {\n panY -= imgTop - coTop;\n } else if (coBottom > imgBottom) {\n panY += coBottom - imgBottom;\n }\n\n this.positionAll(panX, panY, zoom);\n }\n\n mouseDown(e) {\n if (e.touches) {\n this.mouseX = e.touches[0].pageX;\n this.mouseY = e.touches[0].pageY;\n } else {\n this.mouseX = e.pageX;\n this.mouseY = e.pageY;\n }\n\n window.addEventListener('mousemove', this.mouseMove, { passive: false });\n window.addEventListener('touchmove', this.mouseTouch, { passive: false });\n window.addEventListener('mouseup', this.mouseUp, { passive: true });\n window.addEventListener('touchend', this.mouseUp, { passive: true });\n // Disable text selection in the entire document.\n document.body.style['userSelect'] = 'none';\n }\n\n // Perform image panning.\n translate(pageX, pageY) {\n const dX = pageX - this.mouseX;\n const dY = pageY - this.mouseY;\n\n this.mouseX = pageX;\n this.mouseY = pageY;\n\n // Make sure the image is within the cutout window.\n const imgRect = this.preview.current.getBoundingClientRect();\n\n // Check if the new position is within the boundaries, and if not if it's closer to them.\n let panX = Cropper.checkBound(this.state.panX, [imgRect.left, imgRect.right],\n [this.cutoutRect.left, this.cutoutRect.right], dX);\n let panY = Cropper.checkBound(this.state.panY, [imgRect.top, imgRect.bottom],\n [this.cutoutRect.top, this.cutoutRect.bottom], dY);\n\n this.positionAll(panX, panY, this.state.zoom);\n }\n\n // Image panning.\n mouseMove(e) {\n e.preventDefault();\n this.translate(e.pageX, e.pageY);\n }\n\n mouseTouch(e) {\n e.preventDefault();\n\n if (e.touches.length == 1) {\n this.translate(e.touches[0].pageX, e.touches[0].pageY);\n return;\n }\n\n // Image zooming by pinching.\n const [touch0, touch1] = e.touches;\n const distance = Math.sqrt((touch0.pageX - touch1.pageX) * (touch0.pageX - touch1.pageX) +\n (touch0.pageY - touch1.pageY) * (touch0.pageY - touch1.pageY));\n\n if (!this.prevDistance) {\n this.prevDistance = distance / this.state.zoom;\n }\n\n let scale = (distance / this.prevDistance);\n this.handleZoom(Math.max(this.minZoom, Math.min(this.maxZoom, scale)));\n }\n\n mouseUp(e) {\n window.removeEventListener('mousemove', this.mouseMove);\n window.removeEventListener('touchmove', this.mouseTouch);\n window.removeEventListener('mouseup', this.mouseUp);\n window.removeEventListener('touchend', this.mouseUp);\n // Re-enable text selection.\n document.body.style['userSelect'] = '';\n\n this.positionAll(this.state.panX, this.state.panY, this.state.zoom);\n }\n\n render() {\n // transform3d: position and scale.\n const t3d = `translate3d(${this.state.panX}px, ${this.state.panY}px, 0) scale(${this.state.zoom})`;\n // transformOrigin: zoom origin.\n const orig = `${this.state.originX}px ${this.state.originY}px`;\n\n // Overlay position and size are exactly equal to the position and size of the transformed image\n // except it uses different coordinates.\n const overlay = {\n top: `${this.originY - this.state.originY * this.state.zoom}px`,\n left: `${this.originX - this.state.originX * this.state.zoom}px`,\n width: `${this.imageWidth * this.state.zoom}px`,\n height: `${this.imageHeight * this.state.zoom}px`\n };\n return (\n \n
\n
\n
\n
\n
\n
\n \n
\n
\n );\n }\n}\n","// Edit account parameters.\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport Cropper from './cropper.jsx';\nimport { imageCrop } from '../lib/blob-helpers.js';\n\nexport default class AvatarCrop extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.state = {\n top: 0,\n left: 0,\n width: 0,\n height: 0,\n scale: 1\n };\n\n this.handleSubmit = this.handleSubmit.bind(this);\n this.handleChange = this.handleChange.bind(this);\n }\n\n // Cut out in image coordinates and desired scale factor.\n handleChange(left, top, width, height, scale) {\n this.setState({\n left: left,\n top: top,\n width: width,\n height: height,\n scale: scale\n });\n }\n\n handleSubmit() {\n imageCrop(this.props.mime, this.props.avatar,\n this.state.left, this.state.top, this.state.width, this.state.height,\n this.state.scale)\n .then(img => {\n this.props.onSubmit(img.mime, img.blob, img.width, img.height);\n })\n .catch(err => {\n this.props.onError(err);\n });\n }\n\n render() {\n return (\n \n
\n \n
\n
\n {this.props.onCancel ?\n \n \n \n : null}\n \n \n \n
\n
\n );\n }\n};\n","// Password with a visiblity toggle.\nimport React from 'react';\n\nexport default class VisiblePassword extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.inputRef = React.createRef();\n\n this.state = {\n value: this.props.value,\n visible: false\n };\n\n this.handleVisibility = this.handleVisibility.bind(this);\n this.handeTextChange = this.handeTextChange.bind(this);\n this.handleKeyDown = this.handleKeyDown.bind(this);\n this.handleEditingFinished = this.handleEditingFinished.bind(this);\n }\n\n componentDidMount() {\n if (this.props.autoFocus) {\n this.inputRef.current.focus();\n }\n }\n\n handeTextChange(e) {\n this.setState({value: e.target.value});\n if (this.props.onChange) {\n this.props.onChange(e);\n }\n }\n\n handleVisibility(e) {\n e.preventDefault();\n this.setState({visible: !this.state.visible});\n }\n\n handleKeyDown(e) {\n if (e.keyCode == 27) {\n // Escape pressed\n this.setState({value: this.props.value, visible: false});\n if (this.props.onFinished) {\n this.props.onFinished();\n }\n } else if (e.keyCode == 13) {\n // Enter pressed\n this.handleEditingFinished();\n }\n }\n\n handleEditingFinished(e) {\n if (e) {\n let currentTarget = e.currentTarget;\n setTimeout(_ => {\n if (!currentTarget.contains(document.activeElement)) {\n if (this.props.onFinished) {\n this.props.onFinished(this.state.value);\n }\n }\n }, 0);\n } else if (this.props.onFinished) {\n this.props.onFinished(this.state.value.trim());\n }\n }\n\n render() {\n return (\n \n \n \n \n {this.state.visible ? 'visibility' : 'visibility_off'}\n \n \n
\n );\n }\n}\n","// In-place text editor. Shows text with an icon which toggles it into an input field.\nimport React from 'react';\n\nimport VisiblePassword from './visible-password.jsx';\n\nexport default class InPlaceEdit extends React.Component {\n constructor(props) {\n super(props);\n\n this.selfRef = React.createRef();\n\n this.state = {\n active: props.active,\n initialValue: props.value || '',\n value: props.value || ''\n };\n\n this.handeTextChange = this.handeTextChange.bind(this);\n this.handleKeyDown = this.handleKeyDown.bind(this);\n this.handleStartEditing = this.handleStartEditing.bind(this);\n this.handleEditingFinished = this.handleEditingFinished.bind(this);\n this.handlePasswordFinished = this.handlePasswordFinished.bind(this);\n }\n\n componentDidUpdate(prevProps, prevState) {\n // If text has changed while in read mode, update text and discard changes.\n // Ignore update if in edit mode.\n const newValue = this.props.value || '';\n if (prevState.initialValue != newValue && !prevState.active) {\n this.setState({\n initialValue: newValue,\n value: newValue\n });\n }\n }\n\n handeTextChange(e) {\n this.setState({value: e.target.value || ''});\n }\n\n handleKeyDown(e) {\n if (e.keyCode === 27) {\n // Escape pressed\n this.setState({value: this.props.value, active: false});\n } else if (e.keyCode === 13) {\n // Enter pressed\n this.handleEditingFinished(e);\n }\n }\n\n handleStartEditing() {\n if (!this.props.readOnly) {\n this.setState({active: true}, _ => {\n if (this.selfRef.current) {\n this.selfRef.current.focus();\n }\n });\n }\n }\n\n handleEditingFinished(event) {\n const value = this.state.value.trim();\n if (this.props.required && (!event.target.checkValidity() || !value)) {\n // Empty input\n this.setState({value: this.props.value, active: false});\n return;\n }\n this.setState({active: false});\n if ((value || this.props.value) && (value !== this.props.value)) {\n this.props.onFinished(value);\n }\n }\n\n handlePasswordFinished(value) {\n this.setState({active: false});\n if (value && (value !== this.props.value)) {\n this.props.onFinished(value);\n }\n }\n\n render() {\n if (!this.state.active) {\n let spanText = this.props.type == 'password' ? '••••••••' : this.state.value;\n let spanClass = 'in-place-edit' + (this.props.readOnly ? ' disabled' : '');\n if (!spanText) {\n spanText = this.props.placeholder;\n spanClass += ' placeholder';\n }\n if (!this.props.multiline || this.props.multiline == 1) {\n spanClass += ' short';\n }\n\n return (\n {spanText} \n );\n }\n\n let element;\n const attr = {};\n if (this.props.type == 'password') {\n element = VisiblePassword;\n attr.onFinished = this.handlePasswordFinished;\n } else {\n if (this.props.multiline > 1) {\n element = 'textarea';\n attr.rows = this.props.multiline;\n attr.className = 'inplace-edit';\n } else {\n element = 'input';\n attr.type = this.props.type || 'text';\n }\n attr.value = this.state.value;\n attr.ref = this.selfRef;\n attr.onChange = this.handeTextChange;\n attr.onKeyDown = this.handleKeyDown;\n attr.onBlur = this.handleEditingFinished;\n }\n attr.placeholder = this.props.placeholder;\n attr.required = this.props.required ? 'required' : '';\n attr.autoComplete = this.props.autoComplete;\n attr.autoFocus = true;\n\n return React.createElement(element, attr, null);\n }\n};\n","// TagManager: edit topic or user tags.\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport ChipInput from './chip-input.jsx';\n\nimport { MAX_TAG_COUNT, MAX_TAG_LENGTH, MIN_TAG_LENGTH } from '../config.js';\nimport { arrayEqual } from '../lib/utils.js';\n\nexport default class TagManager extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = {\n tags: this.props.tags || [],\n tagInput: '',\n activated: this.props.activated\n };\n\n this.handleTagInput = this.handleTagInput.bind(this);\n this.handleAddTag = this.handleAddTag.bind(this);\n this.handleRemoveTag = this.handleRemoveTag.bind(this);\n this.handleSubmit = this.handleSubmit.bind(this);\n this.handleCancel = this.handleCancel.bind(this);\n }\n\n static getDerivedStateFromProps(nextProps, prevState) {\n const tags = nextProps.tags || [];\n if (!arrayEqual(tags, prevState.tags) && !prevState.activated) {\n return {tags: tags};\n }\n return null;\n }\n\n handleTagInput(text) {\n this.setState({tagInput: text});\n if (text.length > 0) {\n const last = text[text.length-1];\n if (text[0] == '\"') {\n // This is a quoted string.\n if (text.length > 1 && last == '\"') {\n this.handleAddTag(text.substring(1, text.length-1));\n }\n } else if (last == ',' || last == ' ' || last == ';' || last == '\"') {\n // User entered ',', ' ' or ';'\n this.handleAddTag(text.substring(0, text.length-1).trim());\n }\n }\n }\n\n handleAddTag(tag) {\n const maxTagCount = this.props.tinode.getServerParam('maxTagCount', MAX_TAG_COUNT);\n\n if (tag.length > 0 && this.state.tags.length < maxTagCount) {\n const tags = this.state.tags.slice(0);\n tags.push(tag);\n\n this.setState({tags: tags, tagInput: ''});\n if (this.props.onTagsChanged) {\n this.props.onTagsChanged(tags);\n }\n return tags;\n }\n return this.state.tags;\n }\n\n handleRemoveTag(tag, index) {\n const tags = this.state.tags.slice(0);\n tags.splice(index, 1);\n this.setState({tags: tags});\n if (this.props.onTagsChanged) {\n this.props.onTagsChanged(tags);\n }\n }\n\n handleSubmit() {\n // Add unprocessed input to tags, submit the list.\n this.props.onSubmit(this.handleAddTag(this.state.tagInput.trim()));\n this.setState({activated: false, tags: this.props.tags || []});\n }\n\n handleCancel() {\n this.setState({activated: false, tagInput: '', tags: this.props.tags || []});\n if (this.props.onCancel) {\n this.props.onCancel();\n }\n }\n\n render() {\n const minTagLength = this.props.tinode.getServerParam('minTagLength', MIN_TAG_LENGTH);\n const maxTagLength = this.props.tinode.getServerParam('maxTagLength', MAX_TAG_LENGTH);\n\n let tags = [];\n if (this.state.activated) {\n this.state.tags.map((tag) => {\n tags.push({user: tag, invalid: (tag.length < minTagLength || tag.length > maxTagLength)});\n });\n } else {\n this.state.tags.map((tag) => {\n tags.push({tag} );\n });\n if (tags.length == 0) {\n tags = (\n \n \n \n );\n }\n }\n return (\n \n
\n {this.props.title} \n
\n {this.state.activated ?\n
\n
{\n (add_tags_prompt) => \n } \n {this.props.onSubmit || this.props.onCancel ?\n
\n \n \n \n \n \n \n
\n : null}\n
\n :\n
\n }\n
\n );\n }\n};\n","// Widget for editing topic description.\n\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport { Tinode } from 'tinode-sdk';\n\nimport AvatarCrop from './avatar-crop.jsx';\nimport AvatarUpload from './avatar-upload.jsx';\nimport InPlaceEdit from './in-place-edit.jsx';\nimport TagManager from './tag-manager.jsx';\n\nimport { AVATAR_SIZE, MAX_AVATAR_BYTES, MAX_EXTERN_ATTACHMENT_SIZE, MAX_TITLE_LENGTH,\n MAX_TOPIC_DESCRIPTION_LENGTH } from '../config.js';\nimport { imageScaled, blobToBase64, makeImageUrl } from '../lib/blob-helpers.js';\nimport { arrayEqual, theCard } from '../lib/utils.js';\n\nexport default class TopicDescEdit extends React.Component {\n constructor(props) {\n super(props);\n\n const topic = this.props.tinode.getTopic(this.props.topic);\n const acs = topic.getAccessMode();\n this.state = {\n isMe: Tinode.isMeTopicName(this.props.topic),\n owner: acs && acs.isOwner(),\n fullName: topic.public ? topic.public.fn : undefined,\n private: topic.private ? topic.private.comment : null,\n description: topic.public ? topic.public.note : undefined,\n avatar: makeImageUrl(topic.public ? topic.public.photo : null),\n tags: topic.tags() || [],\n newAvatar: null,\n newAvatarMime: null\n };\n\n this.previousOnTags = null;\n\n this.tnNewTags = this.tnNewTags.bind(this);\n this.handleFullNameUpdate = this.handleFullNameUpdate.bind(this);\n this.handleImageUpdated = this.handleImageUpdated.bind(this);\n this.handleAvatarCropped = this.handleAvatarCropped.bind(this);\n this.handleAvatarCropCancel = this.handleAvatarCropCancel.bind(this);\n this.uploadAvatar = this.uploadAvatar.bind(this);\n this.handlePrivateUpdate = this.handlePrivateUpdate.bind(this);\n this.handleDescriptionUpdate = this.handleDescriptionUpdate.bind(this);\n this.handleTagsUpdated = this.handleTagsUpdated.bind(this);\n }\n\n componentDidMount() {\n const topic = this.props.tinode.getTopic(this.props.topic);\n this.previousOnTags = topic.onTagsUpdated;\n topic.onTagsUpdated = this.tnNewTags;\n }\n\n componentWillUnmount() {\n const topic = this.props.tinode.getTopic(this.props.topic);\n topic.onTagsUpdated = this.previousOnTags;\n }\n\n tnNewTags(tags) {\n this.setState({tags: tags});\n }\n\n handleFullNameUpdate(fn) {\n fn = fn.trim().substring(0, MAX_TITLE_LENGTH);\n if (fn && this.state.fullName !== fn) {\n this.setState({fullName: fn});\n this.props.onUpdateTopicDesc(this.props.topic, theCard(fn, null));\n }\n }\n\n handlePrivateUpdate(comment) {\n comment = comment.trim().substring(0, MAX_TITLE_LENGTH);\n if (this.state.private !== comment) {\n this.setState({private: comment});\n this.props.onUpdateTopicDesc(this.props.topic, null, comment || Tinode.DEL_CHAR);\n }\n }\n\n handleDescriptionUpdate(desc) {\n desc = desc.trim().substring(0, MAX_TOPIC_DESCRIPTION_LENGTH);\n if (desc) {\n this.setState({description: desc});\n this.props.onUpdateTopicDesc(this.props.topic, theCard(null, null, null, desc));\n }\n }\n\n // AvatarUpload widget has changed the avatar: received a new file or deleted the avatar.\n handleImageUpdated(mime, img) {\n // This will show the AvatarCropView is img is not null.\n this.setState({newAvatar: img, newAvatarMime: mime});\n if (!img) {\n // Deleting the avatar.\n this.setState({avatar: null});\n this.props.onUpdateTopicDesc(this.props.topic, theCard(null, Tinode.DEL_CHAR));\n }\n }\n\n // AvatarCropView calls this method when the user has cropped the image.\n handleAvatarCropped(mime, blob, width, height) {\n const url = blob ? URL.createObjectURL(blob) : null;\n this.setState({avatar: url, newAvatar: null, newAvatarMime: null});\n if (blob) {\n this.uploadAvatar(mime, blob, width, height);\n }\n }\n\n // Utility method for converting cropped avatar blob to bytes for sending inband or\n // for uploading it to the server out of band.\n uploadAvatar(mime, blob, width, height) {\n const readyToUpload = image => {\n let {mime, blob} = image;\n if (blob.size > MAX_AVATAR_BYTES) {\n // Too large to send inband - uploading out of band and sending as a link.\n const uploader = this.props.tinode.getLargeFileHelper();\n uploader.upload(blob)\n .then(url => this.props.onUpdateTopicDesc(this.props.topic, theCard(null, url)))\n .catch(err => this.props.onError(err.message, 'err'));\n } else {\n // Convert blob to base64-encoded bits.\n blobToBase64(blob)\n .then(b64 => {\n const du = makeImageUrl({data: b64.bits, type: mime});\n this.setState({source: du});\n this.props.onUpdateTopicDesc(this.props.topic, theCard(null, du));\n });\n }\n };\n\n if (width > AVATAR_SIZE || height > AVATAR_SIZE || width != height) {\n // Avatar is not square or too large even after cropping. Shrink it and make square.\n imageScaled(blob, AVATAR_SIZE, AVATAR_SIZE, MAX_EXTERN_ATTACHMENT_SIZE, true)\n .then(scaled => readyToUpload(scaled))\n .catch(err => this.props.onError(err.message, 'err'));\n } else {\n readyToUpload({mime: mime, blob: blob, width: width, height: height});\n }\n }\n\n handleAvatarCropCancel() {\n this.setState({newAvatar: null, newAvatarMime: null});\n }\n\n handleTagsUpdated(tags) {\n // Check if tags have actually changed.\n if (arrayEqual(this.state.tags.slice(0), tags.slice(0))) {\n return;\n }\n this.props.onUpdateTags(tags);\n }\n\n render() {\n if (this.state.newAvatar) {\n return (\n \n );\n }\n\n const editable = this.state.isMe || this.state.owner;\n\n return (\n <>\n \n
\n \n \n {this.state.isMe ?\n
\n
\n \n \n
\n {\n (full_name_placeholder) => \n } \n
\n
\n :\n <>\n
\n
\n \n
\n
\n {\n (group_name_placeholder) => \n } \n
\n
\n
\n
\n \n \n \n
\n
\n {\n (private_placeholder) => \n } \n
\n
\n >\n }\n {editable || this.state.description ?\n
\n
\n \n
\n
\n {\n (private_placeholder) => \n } \n
\n
\n : null\n }\n
\n {editable ?\n <>\n
\n {\n (title_tag_manager) => \n } \n >\n : null\n }\n >\n );\n }\n};\n","// View for editing topic (including 'me' topic) parameters.\n\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport TopicDescEdit from '../widgets/topic-desc-edit.jsx';\n\nimport { arrayEqual, asEmail, asPhone } from '../lib/utils.js';\n\nexport default class TopicCommon extends React.Component {\n constructor(props) {\n super(props);\n\n const topic = this.props.tinode.getTopic(this.props.topic);\n const acs = topic.getAccessMode();\n this.state = {\n isMe: this.props.topic == 'me',\n owner: acs && acs.isOwner(),\n credentials: (topic.getCredentials ? topic.getCredentials() : null) || [],\n addCredActive: false,\n addCredInvalid: false,\n newCred: '',\n tags: []\n };\n\n this.previousTagsUpdated = undefined;\n\n this.onTagsUpdated = this.onTagsUpdated.bind(this);\n this.handleTagsUpdated = this.handleTagsUpdated.bind(this);\n this.tnCredsUpdated = this.tnCredsUpdated.bind(this);\n this.handleCredChange = this.handleCredChange.bind(this);\n this.handleCredKeyDown = this.handleCredKeyDown.bind(this);\n this.handleCredEntered = this.handleCredEntered.bind(this);\n }\n\n // No need to separately handle component mount.\n componentDidUpdate(props) {\n const topic = this.props.tinode.getTopic(props.topic);\n if (!topic) {\n return;\n }\n\n topic.onCredsUpdated = this.tnCredsUpdated;\n\n if (topic.onTagsUpdated != this.onTagsUpdated) {\n if (topic.getType() == 'grp') {\n this.previousTagsUpdated = topic.onTagsUpdated;\n topic.onTagsUpdated = this.onTagsUpdated;\n } else {\n this.previousTagsUpdated = undefined;\n }\n }\n\n if (this.state.topic != props.topic) {\n this.setState({topic: props.topic});\n }\n }\n\n componentWillUnmount() {\n const topic = this.props.tinode.getTopic(this.props.topic);\n topic.onCredsUpdated = undefined;\n topic.onTagsUpdated = this.previousTagsUpdated;\n }\n\n tnCredsUpdated(creds) {\n this.setState({credentials: creds || []});\n }\n\n handleCredChange(e) {\n this.setState({newCred: e.target.value, addCredInvalid: false});\n }\n\n handleCredKeyDown(e) {\n if (e.keyCode === 27) {\n // Escape pressed\n this.setState({newCred: '', addCredActive: false});\n } else if (e.keyCode === 13) {\n // Enter pressed\n this.handleCredEntered(e);\n }\n }\n\n handleCredEntered(e) {\n const value = this.state.newCred.trim();\n if (!value) {\n this.setState({addCredActive: false, addCredInvalid: false});\n return;\n }\n\n let val = asPhone(value);\n let method;\n if (val) {\n method = 'tel';\n } else {\n val = asEmail(value);\n if (val) {\n method = 'email';\n }\n }\n if (method) {\n this.props.onCredAdd(method, val);\n this.setState({addCredActive: false, newCred: ''});\n } else {\n this.setState({addCredInvalid: true});\n }\n }\n\n // Server informs that the tags have been updated.\n onTagsUpdated(tags) {\n this.setState({tags: tags});\n\n if (this.previousTagsUpdated && this.previousTagsUpdated != this.onTagsUpdated) {\n this.previousTagsUpdated(tags);\n }\n }\n\n // Request server to change tags.\n handleTagsUpdated(tags) {\n if (!arrayEqual(this.state.tags.slice(0), tags.slice(0))) {\n this.props.onUpdateTagsRequest(this.props.topic, tags);\n }\n }\n\n render() {\n const credentials = [];\n if (this.state.isMe) {\n this.state.credentials.map((cred) => {\n credentials.push(\n \n );\n });\n }\n\n return (\n \n
\n {this.state.isMe ?\n <>\n
\n
\n
\n \n \n
\n {credentials}\n {this.state.addCredActive ?\n
{(phone_or_email_prompt) =>\n \n } \n : null}\n
\n
\n
\n >\n : null\n }\n
\n );\n }\n};\n","// Edit account parameters.\nimport React from 'react';\nimport { FormattedMessage, defineMessages, injectIntl } from 'react-intl';\n\nconst messages = defineMessages({\n clear_messages: {\n id: 'action_clear_messages',\n defaultMessage: 'Clear Messages',\n description: 'Flat button [Clear Messages] (soft-delete messages)'\n },\n clear_messages_warning: {\n id: 'clear_messages_warning',\n defaultMessage: 'Are you sure you want to clear all messages? It cannot be undone.',\n description: 'Alert dialog warning when deleting all messages.'\n },\n delete_messages: {\n id: 'action_delete_messages',\n defaultMessage: 'Clear Messages for All',\n description: 'Flat button [Clear for All] (hard-delete all messages)'\n },\n delete_messages_warning: {\n id: 'delete_messages_warning',\n defaultMessage: 'Are you sure you want to delete all messages for everyone? It cannot be undone.',\n description: 'Alert dialog warning when hard-deleting all messages.'\n },\n topic_delete: {\n id: 'topic_delete',\n defaultMessage: 'Delete Conversation',\n description: 'Alert title when deleting the topic.'\n },\n topic_delete_warning: {\n id: 'topic_delete_warning',\n defaultMessage: 'Are you sure you want to delete this conversation? It cannot be undone.',\n description: 'Alert warning when deleting entire topic'\n },\n leave_chat: {\n id: 'action_leave_chat',\n defaultMessage: 'Leave Conversation',\n description: 'Flat button [Leave Conversation]'\n },\n leave_chat_warning: {\n id: 'leave_chat_warning',\n defaultMessage: 'Are you sure you want to leave this conversation?',\n description: 'Alert dialog warning when unsubscribing from a chat.'\n },\n block_contact: {\n id: 'action_block_contact',\n defaultMessage: \"Block Contact\",\n description: \"Flat button [Block Contact]\"\n },\n block_contact_warning: {\n id: 'block_contact_warning',\n defaultMessage: 'Are you sure you want to block this contact?',\n description: 'Alert dialog warning when blocking a contact.'\n },\n report_chat: {\n id: 'action_report_chat',\n defaultMessage: 'Report Conversation',\n description: 'Flat button [Report Group]'\n },\n report_chat_warning: {\n id: 'report_chat_warning',\n defaultMessage: 'Are you sure you want to block and report this conversation?',\n description: 'Alert dialog warning when reporting a conversation for abuse'\n },\n other_user: {\n id: 'label_other_user',\n defaultMessage: 'Other',\n description: 'Label for the other user when the user is unnamed'\n },\n});\n\nclass TopicSecurity extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.handleDeleteTopic = this.handleDeleteTopic.bind(this);\n this.handleDeleteMessages = this.handleDeleteMessages.bind(this);\n this.handleLeave = this.handleLeave.bind(this);\n this.handleBlock = this.handleBlock.bind(this);\n this.handleReport = this.handleReport.bind(this);\n }\n\n handleDeleteTopic(e) {\n e.preventDefault();\n const {formatMessage} = this.props.intl;\n this.props.onShowAlert(\n formatMessage(messages.topic_delete), // title\n formatMessage(messages.topic_delete_warning), // content\n _ => this.props.onDeleteTopic(this.props.topic), // onConfirm\n null, // \"OK\"\n true, // Show Reject button\n null // \"Cancel\"\n );\n }\n\n handleDeleteMessages(e) {\n e.preventDefault();\n const {formatMessage} = this.props.intl;\n this.props.onShowAlert(\n formatMessage(this.props.deleter ? messages.delete_messages : messages.clear_messages), // title\n formatMessage(this.props.deleter ? messages.delete_messages_warning : messages.clear_messages_warning), // content\n _ => this.props.onDeleteMessages(this.props.topic), // onConfirm\n null, // \"OK\"\n true, // Show Reject button\n null // \"Cancel\"\n );\n }\n\n handleLeave(e) {\n e.preventDefault();\n const {formatMessage} = this.props.intl;\n this.props.onShowAlert(\n formatMessage(messages.leave_chat), // title\n formatMessage(messages.leave_chat_warning), // content\n _ => this.props.onLeaveTopic(this.props.topic), // onConfirm\n null, // \"OK\"\n true, // Show Reject button\n null // \"Cancel\"\n );\n }\n\n handleBlock(e) {\n e.preventDefault();\n const {formatMessage} = this.props.intl;\n this.props.onShowAlert(\n formatMessage(messages.block_contact), // title\n formatMessage(messages.block_contact_warning), // content\n _ => this.props.onBlockTopic(this.props.topic), // onConfirm\n null, // \"OK\"\n true, // Show Reject button\n null // \"Cancel\"\n );\n }\n\n handleReport(e) {\n e.preventDefault();\n const {formatMessage} = this.props.intl;\n this.props.onShowAlert(\n formatMessage(messages.report_chat), // title\n formatMessage(messages.report_chat_warning), // content\n (_ => { this.props.onReportTopic(this.props.topic); }), // onConfirm\n null, // \"OK\"\n true, // Show Reject button\n null // \"Cancel\"\n );\n }\n\n render() {\n const {formatMessage} = this.props.intl;\n return (\n \n
\n
\n
\n {this.props.groupTopic ?\n <>\n
\n \n \n {e.preventDefault(); this.props.onLaunchPermissionsEditor('want')}}>\n {this.props.access}\n \n
\n {!this.props.channel ?\n
\n
\n \n \n \n
\n
\n
Auth: {\n e.preventDefault();\n if (this.props.owner) {\n this.props.onLaunchPermissionsEditor('auth');\n }\n }}>{this.props.auth} \n
\n
Anon: {\n e.preventDefault();\n if (this.props.owner) {\n this.props.onLaunchPermissionsEditor('anon');\n }\n }}>{this.props.anon} \n
\n
\n
\n :\n null\n }\n >\n :\n
\n
\n \n \n \n
\n
\n
\n {e.preventDefault(); this.props.onLaunchPermissionsEditor('want')}}>\n {this.props.access}\n \n
\n
{this.props.fullName ? this.props.fullName : formatMessage(messages.other_user)}:\n {e.preventDefault(); this.props.onLaunchPermissionsEditor('given')}}>\n {this.props.modeGiven2}\n \n
\n
\n
\n }\n
\n
\n );\n }\n};\n\nexport default injectIntl(TopicSecurity);\n","// InfoView: panel with topic/user info.\nimport React from 'react';\nimport { FormattedMessage, defineMessages, injectIntl } from 'react-intl';\n\nimport { AccessMode, Tinode } from 'tinode-sdk';\n\nimport AvatarUpload from '../widgets/avatar-upload.jsx';\nimport BadgeList from '../widgets/badge-list.jsx';\nimport CheckBox from '../widgets/checkbox.jsx';\nimport ContactList from '../widgets/contact-list.jsx';\nimport ErrorPanel from '../widgets/error-panel.jsx';\nimport GroupManager from '../widgets/group-manager.jsx';\nimport MenuCancel from '../widgets/menu-cancel.jsx';\nimport PermissionsEditor from '../widgets/permissions-editor.jsx';\nimport TopicCommon from '../widgets/topic-common.jsx';\nimport TopicSecurity from '../widgets/topic-security.jsx';\n\nimport { MAX_TITLE_LENGTH, MAX_TOPIC_DESCRIPTION_LENGTH, NO_ACCESS_MODE } from '../config.js';\n\nimport { makeImageUrl } from '../lib/blob-helpers.js';\nimport { theCard, clipStr } from '../lib/utils.js';\n\nconst messages = defineMessages({\n info: {\n id: 'panel_title_info',\n description: 'Title for InfoView',\n defaultMessage: 'Info'\n },\n general: {\n id: 'panel_title_general',\n description: 'Title for TopicCommon.',\n defaultMessage: 'General'\n },\n security: {\n id: 'panel_title_security',\n description: 'Title for TopicSecirity and AccSecurity.',\n defaultMessage: 'Security'\n },\n members: {\n id: 'panel_title_members',\n description: 'Title for managing group members view.',\n defaultMessage: 'Members'\n },\n crop: {\n id: 'panel_title_crop',\n description: 'Title for AvatarCropView.',\n defaultMessage: 'Drag to Adjust'\n },\n perm_want: {\n id: 'requested_permissions',\n defaultMessage: 'Requested',\n description: 'Title for permissions'\n },\n perm_given: {\n id: 'granted_permissions',\n defaultMessage: 'Granted',\n description: 'Title for permissions'\n },\n perm_auth: {\n id: 'permissions_authenticated',\n defaultMessage: 'Authenticated',\n description: 'Title for editing default authenticated permissions'\n },\n perm_anon: {\n id: 'permissions_anonymous',\n defaultMessage: 'Anonymous',\n description: 'Title for editing default anonymous permissions'\n },\n perm_user: {\n id: 'permissions_user',\n defaultMessage: 'User\\'s Permissions',\n description: 'Title for editing user\\'s permissions'\n },\n edit_permissions: {\n id: 'menu_item_edit_permissions',\n defaultMessage: 'Edit permissions',\n description: 'Menu item [Edit permissions]'\n },\n});\n\nclass InfoView extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = {\n topic: null,\n owner: false,\n admin: false,\n sharer: false,\n deleter: false,\n muted: false,\n address: null,\n groupTopic: undefined,\n channel: undefined,\n fullName: undefined,\n description: undefined,\n avatar: null,\n private: null,\n selectedContact: null,\n access: null,\n modeGiven: null,\n modeWant: null,\n modeGiven2: null, // P2P topic, the other user mode given\n modeWant2: null, // P2P topic, the other user mode want\n auth: null,\n anon: null,\n contactList: [],\n trustedBadges: [],\n previousMetaDesc: undefined,\n previousSubsUpdated: undefined,\n };\n\n this.resetSubs = this.resetSubs.bind(this);\n this.resetDesc = this.resetDesc.bind(this);\n this.resetTags = this.resetTags.bind(this);\n this.onMetaDesc = this.onMetaDesc.bind(this);\n this.onSubsUpdated = this.onSubsUpdated.bind(this);\n this.handleImageChanged = this.handleImageChanged.bind(this);\n this.handleMuted = this.handleMuted.bind(this);\n this.handleUnarchive = this.handleUnarchive.bind(this);\n this.handlePermissionsChanged = this.handlePermissionsChanged.bind(this);\n this.handleLaunchPermissionsEditor = this.handleLaunchPermissionsEditor.bind(this);\n this.handleShowAddMembers = this.handleShowAddMembers.bind(this);\n this.handleMemberUpdateRequest = this.handleMemberUpdateRequest.bind(this);\n this.handleMemberSelected = this.handleMemberSelected.bind(this);\n this.handleContextMenu = this.handleContextMenu.bind(this);\n this.handleBackNavigate = this.handleBackNavigate.bind(this);\n }\n\n // No need to separately handle component mount.\n componentDidUpdate(props) {\n const topic = this.props.tinode.getTopic(props.topic);\n if (!topic) {\n return;\n }\n\n if (this.onMetaDesc != topic.onMetaDesc) {\n this.previousMetaDesc = topic.onMetaDesc;\n topic.onMetaDesc = this.onMetaDesc;\n\n this.previousSubsUpdated = topic.onSubsUpdated;\n topic.onSubsUpdated = this.onSubsUpdated;\n }\n\n if (this.state.topic != props.topic) {\n this.setState({topic: props.topic});\n this.resetDesc(topic, props);\n this.resetSubs(topic, props);\n this.resetTags(topic);\n }\n }\n\n componentWillUnmount() {\n const topic = this.props.tinode.getTopic(this.props.topic);\n if (!topic) {\n return;\n }\n this.setState({topic: null});\n topic.onMetaDesc = this.previousMetaDesc;\n topic.onSubsUpdated = this.previousSubsUpdated;\n }\n\n resetSubs(topic, props) {\n const newState = {contactList: []};\n if (topic.getType() == 'p2p') {\n // Fetch the other party in the p2p conversation.\n // Topic may not be ready yet, so check if user is found.\n const user2 = topic.subscriber(props.topic);\n if (user2) {\n newState.modeGiven2 = user2.acs.getGiven();\n newState.modeWant2 = user2.acs.getWant();\n } else {\n newState.modeGiven2 = NO_ACCESS_MODE;\n newState.modeWant2 = NO_ACCESS_MODE;\n }\n } else {\n topic.subscribers((sub) => {\n newState.contactList.push(sub);\n }, this);\n }\n\n this.setState(newState);\n }\n\n resetDesc(topic, props) {\n const defacs = topic.getDefaultAccess() || {};\n const acs = topic.getAccessMode();\n\n const badges = [];\n if (topic.trusted) {\n for (const [key, val] of Object.entries(topic.trusted)) {\n if (val) {\n badges.push(key);\n }\n }\n }\n\n this.setState({\n owner: acs && acs.isOwner(),\n admin: acs && acs.isAdmin(),\n sharer: acs && acs.isSharer(),\n deleter: acs && acs.isDeleter(),\n muted: acs && acs.isMuted(),\n\n fullName: clipStr(topic.public && topic.public.fn, MAX_TITLE_LENGTH),\n description: clipStr(topic.public && topic.public.note, MAX_TOPIC_DESCRIPTION_LENGTH),\n avatar: makeImageUrl(topic.public ? topic.public.photo : null),\n trustedBadges: badges,\n private: clipStr(topic.private && topic.private.comment, MAX_TITLE_LENGTH),\n archived: topic.isArchived(),\n address: topic.name,\n groupTopic: topic.isGroupType(),\n channel: topic.isChannelType() || topic.chan,\n access: acs ? acs.getMode() : undefined,\n modeGiven: acs ? acs.getGiven() : undefined,\n modeWant: acs ? acs.getWant() : undefined,\n auth: defacs.auth,\n anon: defacs.anon\n });\n }\n\n resetTags(topic) {\n if (topic.getType() != 'grp') {\n return;\n }\n\n const acs = topic.getAccessMode();\n if (acs && acs.isOwner()) {\n // Requesting tags: owner is editing the topic.\n topic.getMeta(topic.startMetaQuery().withTags().build());\n }\n }\n\n onMetaDesc(desc) {\n const topic = this.props.tinode.getTopic(this.props.topic);\n if (!topic) {\n return;\n }\n this.resetDesc(topic, this.props);\n\n if (this.previousMetaDesc && this.previousMetaDesc != this.onMetaDesc) {\n this.previousMetaDesc(desc);\n }\n }\n\n onSubsUpdated(subs) {\n const topic = this.props.tinode.getTopic(this.props.topic);\n if (!topic) {\n return;\n }\n this.resetSubs(topic, this.props);\n\n if (this.previousSubsUpdated && this.previousSubsUpdated != this.onSubsUpdated) {\n this.previousSubsUpdated(subs);\n }\n }\n\n handleImageChanged(mime, img) {\n this.setState({avatar: img});\n this.props.onTopicDescUpdate(this.props.topic, theCard(null, img || Tinode.DEL_CHAR), null);\n }\n\n handleMuted(ignored, checked) {\n this.setState({muted: checked});\n this.props.onChangePermissions(this.props.topic, checked ? '-P' : '+P');\n }\n\n handleUnarchive(ignored, ignored2) {\n this.props.onTopicUnArchive(this.props.topic);\n }\n\n handlePermissionsChanged(which, perm) {\n switch (which) {\n case 'auth':\n this.props.onTopicDescUpdateRequest(this.props.topic, null, null, {auth: perm});\n break;\n case 'anon':\n this.props.onTopicDescUpdateRequest(this.props.topic, null, null, {anon: perm});\n break;\n case 'mode':\n case 'want':\n this.props.onChangePermissions(this.props.topic, perm);\n break;\n case 'given':\n this.props.onChangePermissions(this.props.topic, perm, this.props.topic);\n break;\n case 'user':\n this.props.onChangePermissions(this.props.topic, perm, this.state.userPermissionsEdited);\n break;\n }\n\n this.handleBackNavigate();\n }\n\n handleLaunchPermissionsEditor(which, uid) {\n const {formatMessage} = this.props.intl;\n let toEdit, toCompare, toSkip, titleEdit, titleCompare, userTitle, userAvatar;\n switch (which) {\n case 'mode':\n toEdit = this.state.access;\n break;\n case 'want':\n toEdit = this.state.modeWant;\n toCompare = this.state.modeGiven;\n if (this.state.owner) {\n // Don't allow owner to unset 'O' permission. All other permissions are OK.\n toSkip = 'O';\n } else {\n // Allow accepting any of 'ASDO' permissions but don't allow asking for them.\n toSkip = AccessMode.encode(AccessMode.diff('ASDO', this.state.modeGiven));\n if (this.state.channel) {\n // Channels are read-only.\n toSkip += 'W';\n }\n }\n titleEdit = formatMessage(messages.perm_want);\n titleCompare = formatMessage(messages.perm_given);\n break;\n case 'given':\n toEdit = this.state.modeGiven2;\n toCompare = this.state.modeWant2;\n toSkip = this.state.groupTopic ? (this.state.owner ? '' : 'O') : 'ASDO';\n titleEdit = formatMessage(messages.perm_given);\n titleCompare = formatMessage(messages.perm_want);\n break;\n case 'auth':\n toEdit = this.state.auth;\n toSkip = 'O';\n break;\n case 'anon':\n toEdit = this.state.anon;\n toSkip = 'O';\n break;\n case 'user': {\n const topic = this.props.tinode.getTopic(this.props.topic);\n if (!topic) {\n return;\n }\n const user = topic.subscriber(uid);\n if (!user || !user.acs) {\n return;\n }\n toEdit = user.acs.getGiven();\n toCompare = user.acs.getWant();\n toSkip = this.state.owner ? '' : 'O';\n titleEdit = formatMessage(messages.perm_given);\n titleCompare = formatMessage(messages.perm_want);\n if (user.public) {\n userTitle = user.public.fn;\n userAvatar = user.public.photo;\n }\n break;\n }\n default:\n console.error(\"Unknown permission editing mode '\" + which + \"'\");\n return;\n }\n this.setState({\n userPermissionsEdited: uid,\n userPermissionsTitle: userTitle,\n userPermissionsAvatar: userAvatar,\n editedPermissions: toEdit,\n immutablePermissions: toCompare,\n editedPermissionsTitle: titleEdit,\n immutablePermissionsTitle: titleCompare,\n editedPermissionsSkipped: toSkip,\n });\n this.props.onNavigate(`perm/${which}`);\n }\n\n handleShowAddMembers(e) {\n e.preventDefault();\n this.props.onInitFind();\n this.props.onNavigate('members');\n }\n\n handleMemberUpdateRequest(members, added, removed) {\n this.props.onMemberUpdateRequest(this.props.topic, added, removed);\n this.props.onNavigate('info');\n }\n\n handleMemberSelected(uid) {\n this.setState({selectedContact: uid});\n }\n\n handleBackNavigate() {\n const args = (this.props.panel || 'info').split('/');\n if (args[0] == 'info') {\n this.props.onNavigate(null);\n } else if (args[0] == 'perm') {\n if (args[1] == 'user') {\n this.props.onNavigate('info');\n } else {\n this.props.onNavigate('security');\n }\n } else {\n this.props.onNavigate('info');\n }\n }\n\n handleContextMenu(params) {\n const {formatMessage} = this.props.intl;\n const topic = this.props.tinode.getTopic(this.props.topic);\n if (!topic) {\n return;\n }\n const user = topic.subscriber(params.topicName);\n if (!user || !user.acs) {\n return;\n }\n\n const isMe = this.props.tinode.isMe(params.topicName);\n const menuItems = [{\n title: formatMessage(messages.edit_permissions),\n handler: _ => this.handleLaunchPermissionsEditor(isMe ? 'want' : 'user', params.topicName)\n }];\n if (!isMe) {\n menuItems.push('member_delete');\n }\n menuItems.push(user.acs.isMuted() ? 'member_unmute' : 'member_mute');\n if (!isMe) {\n menuItems.push(user.acs.isJoiner() ? 'member_block' : 'member_unblock');\n }\n this.props.showContextMenu({\n topicName: this.props.topic,\n x: params.x,\n y: params.y,\n user: params.topicName}, menuItems);\n }\n\n render() {\n const args = (this.props.panel || 'info').split('/');\n const view = args[0];\n args.shift();\n\n const {formatMessage} = this.props.intl;\n const panelTitle = formatMessage((view == 'perm' ? messages['perm_' + args[0]] : messages[view])\n || messages['info']);\n\n return (\n \n
\n
{panelTitle}
\n
\n \n
\n
\n {this.props.displayMobile ?\n
: null}\n {view == 'members' ?\n
\n :\n view == 'perm' && args.length > 0 ?\n
this.handlePermissionsChanged(args[0], mode)}\n onCancel={this.handleBackNavigate} />\n :\n view == 'general' ?\n \n :\n view == 'security' ?\n \n :\n \n
\n
\n
\n \n \n \n \n
\n {this.state.archived ?\n
\n \n \n \n \n
\n :\n null\n }\n
\n
\n {this.state.groupTopic && this.state.sharer ?\n <>\n
\n
\n \n \n \n
\n
\n
{\n (no_members) => \n } \n >\n :\n null\n }\n
\n }\n \n );\n }\n};\n\nexport default injectIntl(InfoView);\n","// CallPanel displays call in progress: local and remote viewports and controls.\nimport React from 'react';\nimport { FormattedMessage, defineMessages, injectIntl } from 'react-intl';\n\nimport LetterTile from './letter-tile.jsx';\n\nimport { MAX_PEER_TITLE_LENGTH } from '../config.js';\nimport { CALL_STATE_OUTGOING_INITATED, CALL_STATE_IN_PROGRESS } from '../constants.js';\n\nimport { clipStr } from '../lib/utils.js'\n\nconst RING_SOUND = new Audio('audio/call-out.m4a');\nRING_SOUND.loop = true;\nconst CALL_ENDED_SOUND = new Audio('audio/call-end.m4a');\nCALL_ENDED_SOUND.loop = true;\nconst DIALING_SOUND = new Audio('audio/dialing.m4a');\n\nconst VIDEO_MUTED_EVENT = 'video:muted';\nconst VIDEO_UNMUTED_EVENT = 'video:unmuted';\n\nconst messages = defineMessages({\n already_in_call: {\n id: 'already_in_call',\n defaultMessage: 'You already in an ongoing call!',\n description: 'Error message when the user tried to accept a new call without finishing pervious one',\n }\n});\n\nclass CallPanel extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.state = {\n localStream: undefined,\n remoteStream: undefined,\n pc: undefined,\n dataChannel: undefined,\n\n previousOnInfo: undefined,\n waitingForPeer: false,\n // If true, the client has received a remote SDP from the peer and has sent a local SDP to the peer.\n callInitialSetupComplete: false,\n audioOnly: props.callAudioOnly,\n // Video mute/unmute in progress.\n videoToggleInProgress: false,\n // Indicates if the remote peer has informed us that their camera is on.\n remoteVideoLive: false,\n };\n\n this.localStreamConstraints = {\n audio: true,\n video: !props.callAudioOnly\n };\n this.isOutgoingCall = props.callState == CALL_STATE_OUTGOING_INITATED;\n\n this.localRef = React.createRef();\n this.remoteRef = React.createRef();\n // Cache for remote ice candidates until initial setup gets completed.\n this.remoteIceCandidatesCache = [];\n\n this.onInfo = this.onInfo.bind(this);\n this.start = this.start.bind(this);\n this.stop = this.stop.bind(this);\n\n this.createPeerConnection = this.createPeerConnection.bind(this);\n this.canSendOffer = this.canSendOffer.bind(this);\n this.drainRemoteIceCandidatesCache = this.drainRemoteIceCandidatesCache.bind(this);\n\n this.handleNegotiationNeededEvent = this.handleNegotiationNeededEvent.bind(this);\n this.handleICECandidateEvent = this.handleICECandidateEvent.bind(this);\n this.handleNewICECandidateMsg = this.handleNewICECandidateMsg.bind(this);\n this.handleICEConnectionStateChangeEvent = this.handleICEConnectionStateChangeEvent.bind(this);\n this.handleSignalingStateChangeEvent = this.handleSignalingStateChangeEvent.bind(this);\n this.handleICEGatheringStateChangeEvent = this.handleICEGatheringStateChangeEvent.bind(this);\n this.handleIceCandidateErrorEvent = this.handleIceCandidateErrorEvent.bind(this);\n this.handleTrackEvent = this.handleTrackEvent.bind(this);\n\n this.handleVideoOfferMsg = this.handleVideoOfferMsg.bind(this);\n this.handleVideoAnswerMsg = this.handleVideoAnswerMsg.bind(this);\n this.handleNewICECandidateMsg = this.handleNewICECandidateMsg.bind(this);\n\n this.reportError = this.reportError.bind(this);\n this.handleGetUserMediaError = this.handleGetUserMediaError.bind(this);\n\n this.stopTracks = this.stopTracks.bind(this);\n this.disconnectMedia = this.disconnectMedia.bind(this);\n\n this.handleCloseClick = this.handleCloseClick.bind(this);\n this.handleToggleCameraClick = this.handleToggleCameraClick.bind(this);\n this.handleToggleMicClick = this.handleToggleMicClick.bind(this);\n\n this.handleRemoteHangup = this.handleRemoteHangup.bind(this);\n this.handleVideoCallAccepted = this.handleVideoCallAccepted.bind(this);\n\n this.muteVideo = this.muteVideo.bind(this);\n this.unmuteVideo = this.unmuteVideo.bind(this);\n this.emptyVideoTrack = this.emptyVideoTrack.bind(this);\n\n this.handleDataChannelEvent = this.handleDataChannelEvent.bind(this);\n this.handleDataChannelError = this.handleDataChannelError.bind(this);\n this.handleDataChannelMessage = this.handleDataChannelMessage.bind(this);\n this.handleDataChannelOpen = this.handleDataChannelOpen.bind(this);\n this.handleDataChannelClose = this.handleDataChannelClose.bind(this);\n }\n\n componentDidMount() {\n const topic = this.props.tinode.getTopic(this.props.topic);\n this.previousOnInfo = topic.onInfo;\n topic.onInfo = this.onInfo;\n if ((this.props.callState == CALL_STATE_OUTGOING_INITATED ||\n this.props.callState == CALL_STATE_IN_PROGRESS) && this.localRef.current) {\n this.start();\n }\n }\n\n componentWillUnmount() {\n const topic = this.props.tinode.getTopic(this.props.topic);\n topic.onInfo = this.previousOnInfo;\n this.stop();\n }\n\n handleVideoCallAccepted(info) {\n RING_SOUND.pause();\n const pc = this.createPeerConnection();\n const stream = this.state.localStream;\n stream.getTracks().forEach(track => {\n pc.addTrack(track, stream);\n\n if (track.kind == 'video' && this.state.audioOnly) {\n // This is an audio-only call.\n // Remove dummy video track (placeholder remains).\n track.enabled = false;\n track.stop();\n stream.removeTrack(track);\n }\n });\n }\n\n onInfo(info) {\n if (info.what != 'call') {\n return;\n }\n switch (info.event) {\n case 'accept':\n this.handleVideoCallAccepted(info);\n break;\n case 'answer':\n this.handleVideoAnswerMsg(info);\n break;\n case 'ice-candidate':\n this.handleNewICECandidateMsg(info);\n break;\n case 'hang-up':\n this.handleRemoteHangup(info);\n break;\n case 'offer':\n this.handleVideoOfferMsg(info);\n break;\n case 'ringing':\n // play() throws if the user did not click the app first: https://goo.gl/xX8pDD.\n RING_SOUND.play().catch(_ => {});\n break;\n default:\n console.warn(\"Unknown call event\", info.event);\n break;\n }\n }\n\n // Creates an empty video track placeholder.\n emptyVideoTrack() {\n const width = 640;\n const height = 480;\n const canvas = Object.assign(document.createElement(\"canvas\"), {width, height});\n canvas.getContext('2d').fillRect(0, 0, width, height);\n const stream = canvas.captureStream(0);\n return Object.assign(stream.getVideoTracks()[0], {enabled: false});\n }\n\n start() {\n if (this.state.localStream) {\n this.props.onError(this.props.intl.formatMessage(messages.already_in_call), 'info');\n return;\n }\n\n if (this.props.callState == CALL_STATE_IN_PROGRESS) {\n // We apparently just accepted the call.\n this.props.onInvite(this.props.topic, this.props.seq, CALL_STATE_IN_PROGRESS, this.props.callAudioOnly);\n return;\n }\n\n // This is an outgoing call waiting for the other side to pick up.\n // Start local video.\n navigator.mediaDevices.getUserMedia(this.localStreamConstraints)\n .then(stream => {\n if (!this.localStreamConstraints.video) {\n // Starting an audio-only call. Create a dummy video track\n // (so video can be enabled during the call if the user desires).\n stream.addTrack(this.emptyVideoTrack());\n }\n this.setState({localStream: stream, waitingForPeer: true});\n this.localRef.current.srcObject = stream;\n\n DIALING_SOUND.play();\n\n // Send call invitation.\n this.props.onInvite(this.props.topic, this.props.seq, this.props.callState, this.props.callAudioOnly);\n })\n .catch(this.handleGetUserMediaError);\n }\n\n stop() {\n CALL_ENDED_SOUND.pause();\n CALL_ENDED_SOUND.currentTime = 0;\n RING_SOUND.pause();\n RING_SOUND.currentTime = 0;\n\n this.stopTracks(this.state.localStream);\n this.stopTracks(this.state.remoteStream);\n this.disconnectMedia(this.localRef.current);\n this.disconnectMedia(this.remoteRef.current);\n if (this.state.pc) {\n this.state.pc.ontrack = null;\n this.state.pc.onremovetrack = null;\n this.state.pc.onremovestream = null;\n this.state.pc.onicecandidate = null;\n this.state.pc.oniceconnectionstatechange = null;\n this.state.pc.onsignalingstatechange = null;\n this.state.pc.onicegatheringstatechange = null;\n this.state.pc.onnegotiationneeded = null;\n this.state.pc.onicecandidateerror = null;\n this.state.pc.ondatachannel = null;\n\n if (this.state.dataChannel) {\n this.state.dataChannel.close();\n }\n this.state.pc.close();\n }\n this.setState({pc: null, waitingForPeer: false});\n }\n\n disconnectMedia(el) {\n if (!el) {\n return;\n }\n\n el.srcObject = null;\n el.src = '';\n }\n\n stopTracks(stream) {\n if (!stream) {\n return;\n }\n\n let tracks = stream.getTracks();\n if (tracks) {\n tracks.forEach(track => {\n track.stop();\n track.enabled = false;\n });\n }\n }\n\n handleDataChannelError(error) {\n console.error('data channel error', error);\n }\n\n handleDataChannelMessage(event) {\n switch (event.data) {\n case VIDEO_MUTED_EVENT:\n this.setState({remoteVideoLive: false}, _ => { this.remoteRef.current.srcObject = this.state.remoteStream; });\n break;\n case VIDEO_UNMUTED_EVENT:\n this.setState({remoteVideoLive: true}, _ => { this.remoteRef.current.srcObject = this.state.remoteStream; });\n break;\n default:\n break;\n }\n }\n\n handleDataChannelOpen(event) {\n if (!this.state.audioOnly) {\n event.target.send(VIDEO_UNMUTED_EVENT);\n }\n }\n\n handleDataChannelClose() {\n /* no action */\n }\n\n handleDataChannelEvent(event) {\n const channel = event.channel;\n channel.onerror = this.handleDataChannelError;\n channel.onmessage = this.handleDataChannelMessage;\n channel.onopen = this.handleDataChannelOpen;\n channel.onclose = this.handleDataChannelClose;\n this.setState({dataChannel: channel});\n }\n\n createPeerConnection() {\n const iceServers = this.props.tinode.getServerParam('iceServers', null);\n const pc = iceServers ? new RTCPeerConnection({iceServers: iceServers}) : new RTCPeerConnection();\n\n pc.onicecandidate = this.handleICECandidateEvent;\n pc.oniceconnectionstatechange = this.handleICEConnectionStateChangeEvent;\n pc.onicegatheringstatechange = this.handleICEGatheringStateChangeEvent;\n pc.onsignalingstatechange = this.handleSignalingStateChangeEvent;\n pc.onnegotiationneeded = this.handleNegotiationNeededEvent;\n pc.onicecandidateerror = this.handleIceCandidateErrorEvent;\n pc.ontrack = this.handleTrackEvent;\n pc.ondatachannel = this.handleDataChannelEvent;\n\n // creating data channel events\n const channel = pc.createDataChannel(\"events\", {ordered: true});\n channel.onerror = this.handleDataChannelError;\n channel.onmessage = this.handleDataChannelMessage;\n channel.onopen = this.handleDataChannelOpen;\n channel.onclose = this.handleDataChannelClose;\n\n this.setState({pc: pc, dataChannel: channel, waitingForPeer: false});\n\n return pc;\n }\n\n handleVideoAnswerMsg(info) {\n // Configure the remote description, which is the SDP payload\n // in 'info' message.\n const desc = new RTCSessionDescription(info.payload);\n this.state.pc.setRemoteDescription(desc)\n .then(_ => {\n this.setState({ callInitialSetupComplete: true }, _ => this.drainRemoteIceCandidatesCache());\n })\n .catch(err => this.reportError(err));\n }\n\n reportError(err) {\n this.props.onError(err.message, 'err');\n }\n\n canSendOffer() {\n return this.isOutgoingCall || this.state.callInitialSetupComplete;\n }\n\n handleNegotiationNeededEvent(event) {\n const pc = event.target;\n if (!this.canSendOffer()) {\n return;\n }\n pc.createOffer().then(offer => {\n return pc.setLocalDescription(offer);\n })\n .then(_ => {\n this.props.onSendOffer(this.props.topic, this.props.seq, pc.localDescription.toJSON());\n })\n .catch(err => this.reportError(err));\n }\n\n handleIceCandidateErrorEvent(event) {\n console.warn(\"ICE candidate error:\", event);\n }\n\n handleICECandidateEvent(event) {\n if (event.candidate) {\n this.props.onIceCandidate(this.props.topic, this.props.seq, event.candidate.toJSON());\n }\n }\n\n handleNewICECandidateMsg(info) {\n const candidate = new RTCIceCandidate(info.payload);\n if (this.state.callInitialSetupComplete) {\n this.state.pc.addIceCandidate(candidate)\n .catch(err => {\n if (candidate.candidate) {\n this.reportError(err);\n }\n console.warn(\"Error adding new ice candidate\", candidate, err);\n });\n } else {\n this.remoteIceCandidatesCache.push(candidate);\n }\n }\n\n drainRemoteIceCandidatesCache() {\n this.remoteIceCandidatesCache.forEach(candidate => {\n this.state.pc.addIceCandidate(candidate)\n .catch(err => {\n if (candidate.candidate) {\n this.reportError(err);\n }\n console.warn(\"Error adding cached ice candidate\", candidate, err);\n });\n });\n this.remoteIceCandidatesCache = [];\n }\n\n handleICEConnectionStateChangeEvent(event) {\n switch (event.target.iceConnectionState) {\n case 'closed':\n case 'failed':\n this.handleCloseClick();\n break;\n }\n }\n\n handleSignalingStateChangeEvent(event) {\n if (event.target.signalingState == 'closed') {\n this.handleCloseClick();\n }\n }\n\n handleICEGatheringStateChangeEvent(event) {\n // ICE gathering change state\n }\n\n handleTrackEvent(event) {\n // Remote video becomes available.\n this.remoteRef.current.srcObject = event.streams[0];\n this.setState({remoteStream: event.streams[0]});\n }\n\n handleGetUserMediaError(e) {\n console.error(\"Error opening camera and/or microphone\", e);\n switch(e.name) {\n case 'NotFoundError':\n // Cannot start the call b/c no camera and/or microphone found.\n this.reportError(e);\n break;\n case 'SecurityError':\n case 'PermissionDeniedError':\n // Do nothing; this is the same as the user canceling the call.\n break;\n default:\n this.reportError(e);\n break;\n }\n\n // Make sure we shut down our end of the RTCPeerConnection so we're\n // ready to try again.\n this.handleCloseClick();\n }\n\n handleVideoOfferMsg(info) {\n let localStream = null;\n const pc = this.state.pc ? this.state.pc : this.createPeerConnection();\n const desc = new RTCSessionDescription(info.payload);\n\n pc.setRemoteDescription(desc).then(_ => {\n return navigator.mediaDevices.getUserMedia(this.localStreamConstraints);\n })\n .then(stream => {\n let dummyVideo;\n if (!this.localStreamConstraints.video) {\n // Starting an audio-only call. Create an empty video track so\n // so the user can enable the video during the call.\n dummyVideo = this.emptyVideoTrack();\n stream.addTrack(dummyVideo);\n }\n localStream = stream;\n this.localRef.current.srcObject = stream;\n this.setState({localStream: stream});\n\n localStream.getTracks().forEach(track => {\n pc.addTrack(track, localStream);\n });\n\n if (dummyVideo) {\n dummyVideo.enabled = false;\n dummyVideo.stop();\n stream.removeTrack(dummyVideo);\n }\n })\n .then(_ => {\n return pc.createAnswer();\n })\n .then(answer => {\n return pc.setLocalDescription(answer);\n })\n .then(_ => {\n this.props.onSendAnswer(this.props.topic, this.props.seq, pc.localDescription.toJSON());\n this.setState({ callInitialSetupComplete: true }, _ => this.drainRemoteIceCandidatesCache());\n })\n .catch(this.handleGetUserMediaError);\n }\n\n // Call disconnected by remote.\n handleRemoteHangup() {\n if (!this.state.waitingForPeer) {\n // This is live call, just hang up.\n this.handleCloseClick();\n } else {\n // This is a call which is not yet connected.\n // Stop pulse animation.\n this.setState({waitingForPeer: false});\n // Change sound and wait a bit before ending it.\n RING_SOUND.pause();\n RING_SOUND.currentTime = 0;\n CALL_ENDED_SOUND.loop = true;\n CALL_ENDED_SOUND.play().catch(_ => {});\n setTimeout(_ => {\n this.handleCloseClick();\n }, 2000);\n }\n }\n\n handleCloseClick() {\n this.stop();\n this.props.onHangup(this.props.topic, this.props.seq);\n }\n\n // Ends video track and turns off the camera.\n muteVideo() {\n if (!this.state.pc || !this.state.dataChannel) {\n return;\n }\n\n const stream = this.state.localStream;\n const t = stream.getVideoTracks()[0];\n t.enabled = false;\n t.stop();\n\n stream.removeTrack(t);\n this.state.dataChannel.send(VIDEO_MUTED_EVENT);\n this.setState({videoToggleInProgress: false});\n }\n\n unmuteVideo() {\n if (!this.state.pc || !this.state.dataChannel) {\n return;\n }\n navigator.mediaDevices.getUserMedia({ video: true })\n .then(stream => {\n // Will extract video track from stream and throw stream away,\n // and replace video track in the media sender.\n this.localRef.current.srcObject = null;\n const sender = this.state.pc.getSenders().find(s => s.track.kind == 'video');\n const track = stream.getVideoTracks()[0];\n // Remote track from new stream.\n stream.removeTrack(track);\n // Add this track to the existing local stream.\n this.state.localStream.addTrack(track);\n return sender.replaceTrack(track);\n })\n .then(_ => {\n this.localRef.current.srcObject = this.state.localStream;\n this.state.dataChannel.send(VIDEO_UNMUTED_EVENT);\n })\n .catch(err => this.handleGetUserMediaError(err))\n .finally(_ => { this.setState({videoToggleInProgress: false}); }); // Make sure we redraw the mute/unmute icons (e.g. camera -> camera_off).\n }\n\n handleToggleCameraClick() {\n if (this.state.videoToggleInProgress) {\n // Toggle currently in progress.\n return;\n }\n const tracks = this.state.localStream.getVideoTracks();\n this.setState({videoToggleInProgress: true}, _ => {\n if (tracks && tracks.length > 0 && tracks[0].enabled && tracks[0].readyState == 'live') {\n this.muteVideo();\n } else {\n this.unmuteVideo();\n }\n this.setState({audioOnly: !this.state.audioOnly});\n });\n }\n\n handleToggleMicClick() {\n const stream = this.state.localStream;\n const t = stream.getAudioTracks()[0];\n t.enabled = !t.enabled;\n // Make sure we redraw the mute/unmute icons (e.g. mic -> mic_off).\n this.forceUpdate();\n }\n\n render() {\n const audioTracks = this.state.localStream && this.state.localStream.getAudioTracks();\n const videoTracks = !this.state.audioOnly && this.state.localStream && this.state.localStream.getVideoTracks();\n const disabled = !this.state.pc || !this.state.dataChannel || !(audioTracks && audioTracks[0]);\n const audioIcon = audioTracks && audioTracks[0] && audioTracks[0].enabled ? 'mic' : 'mic_off';\n const videoIcon = videoTracks && videoTracks[0] && videoTracks[0].enabled && videoTracks[0].readyState == 'live' ? 'videocam' : 'videocam_off';\n const peerTitle = clipStr(this.props.title, MAX_PEER_TITLE_LENGTH);\n const pulseAnimation = this.state.waitingForPeer ? ' pulse' : '';\n\n let remoteActive = false;\n if (this.remoteRef.current && this.remoteRef.current.srcObject && this.state.remoteVideoLive) {\n const rstream = this.remoteRef.current.srcObject;\n if (rstream.getVideoTracks().length > 0) {\n const t = rstream.getVideoTracks()[0];\n remoteActive = t.enabled && t.readyState == 'live';\n }\n }\n\n return (\n <>\n \n
\n
\n
\n {remoteActive ?\n <>\n
\n
{peerTitle}
\n > :\n <>\n
\n
\n
\n \n
\n
{peerTitle}
\n
\n >\n }\n
\n
\n
\n \n call_end \n \n \n {videoIcon} \n \n \n {audioIcon} \n \n
\n
\n >\n );\n }\n};\n\nexport default injectIntl(CallPanel);\n","import React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport FileProgress from './file-progress.jsx';\nimport { bytesToHumanSize } from '../lib/strformat.js';\nimport { isUrlRelative, sanitizeUrl } from '../lib/utils.js';\n\nexport default class Attachment extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = {\n downloader: null,\n progress: 0\n };\n\n this.downloadFile = this.downloadFile.bind(this);\n this.handleCancel = this.handleCancel.bind(this);\n }\n\n downloadFile(url, filename, mimetype) {\n if (!url) {\n this.props.onError(\"Invalid download URL '\" + url + \"'\");\n return;\n }\n\n const downloader = this.props.tinode.getLargeFileHelper();\n this.setState({downloader: downloader});\n downloader.download(url, filename, mimetype,\n loaded => this.setState({progress: loaded / this.props.size}),\n err => this.props.onError(err, 'err')\n )\n .then(_ => this.setState({downloader: null, progress: 0}))\n .catch(err => {\n if (err) {\n this.props.onError(\"Error downloading file: \" + err.message, 'err');\n }\n this.setState({downloader: null, progress: 0});\n });\n }\n\n handleCancel() {\n if (this.props.uploading) {\n this.props.onCancelUpload();\n } else if (this.state.downloader) {\n this.state.downloader.cancel();\n }\n }\n\n render() {\n let filename = this.props.filename || 'file_attachment';\n if (filename.length > 36) {\n filename = filename.substr(0, 16) + '...' + filename.substr(-16);\n }\n let size = this.props.size > 0 ?\n ({bytesToHumanSize(this.props.size)}) :\n null;\n\n // Detect if the download URL is relative or absolute.\n // If the URL is relative use LargeFileHelper to attach authentication\n // credentials to the request.\n let url, helperFunc;\n if (!this.props.uploading && !this.state.downloader && isUrlRelative(this.props.downloadUrl)) {\n // Relative URL. Use download helper.\n url = '#';\n helperFunc = (e) => {\n e.preventDefault();\n this.downloadFile(this.props.downloadUrl, this.props.filename, this.props.mimetype);\n };\n } else {\n url = sanitizeUrl(this.props.downloadUrl);\n helperFunc = null;\n }\n const downloadWidget = <>file_download >;\n return (\n \n
insert_drive_file
\n
\n
{filename} {size}
\n {this.props.uploading || this.state.downloader ?\n
\n :\n
\n }\n
\n
\n );\n }\n};\n","// Received/read indicator.\nimport React from 'react';\nimport { defineMessages, injectIntl } from 'react-intl';\n\nimport { Tinode } from 'tinode-sdk';\n\nimport { deliveryMarker } from '../lib/utils.js';\n\nconst messages = defineMessages({\n message_sending: {\n id: 'message_sending',\n defaultMessage: 'sending...',\n description: 'Message being sent, in place of time stamp'\n },\n message_sending_failed: {\n id: 'message_sending_failed',\n defaultMessage: 'failed',\n description: 'Failed to send message, in place of time stamp'\n },\n message_edited_marker: {\n id: 'message_edited_marker',\n defaultMessage: ', edited',\n description: 'Marker indicating that the message was edited'\n }\n});\n\nclass ReceivedMarker extends React.PureComponent {\n render() {\n const {formatMessage} = this.props.intl;\n let timestamp;\n if (this.props.received <= Tinode.MESSAGE_STATUS_SENDING) {\n timestamp = formatMessage(messages.message_sending);\n } else if (this.props.received == Tinode.MESSAGE_STATUS_FAILED) {\n timestamp = formatMessage(messages.message_sending_failed);\n } else {\n timestamp = this.props.timestamp.toLocaleTimeString(this.props.intl.locale, { timeStyle: 'short' });\n }\n\n const icon = deliveryMarker(this.props.received);\n const marker = icon ? {icon.name} : null;\n const edited = this.props.edited ? formatMessage(messages.message_edited_marker) : null;\n\n return (\n \n {timestamp}{edited}{'\\u00a0'}{marker}\n \n );\n }\n};\n\nexport default injectIntl(ReceivedMarker);\n","// Single chat message bubble, sent or received.\n\nimport React from 'react';\nimport { FormattedMessage, injectIntl } from 'react-intl';\nimport { Drafty, Tinode } from 'tinode-sdk';\n\nimport Attachment from './attachment.jsx';\nimport LetterTile from './letter-tile.jsx';\nimport ReceivedMarker from './received-marker.jsx'\n\nimport { fullFormatter } from '../lib/formatters.js';\nimport { sanitizeUrl } from '../lib/utils.js';\n\nclass BaseChatMessage extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.state = {\n progress: 0\n };\n\n if (props.uploader) {\n props.uploader.onProgress = this.handleProgress.bind(this);\n }\n\n this.handleExpandImage = this.handleExpandImage.bind(this);\n this.handlePlayVideo = this.handlePlayVideo.bind(this);\n this.handleFormButtonClick = this.handleFormButtonClick.bind(this);\n this.handleContextClick = this.handleContextClick.bind(this);\n this.handleCancelUpload = this.handleCancelUpload.bind(this);\n this.handleQuoteClick = this.handleQuoteClick.bind(this);\n\n this.formatterContext = {\n formatMessage: props.intl.formatMessage.bind(props.intl),\n viewportWidth: props.viewportWidth,\n authorizeURL: props.tinode.authorizeURL.bind(props.tinode),\n\n onImagePreview: this.handleExpandImage,\n onVideoPreview: this.handlePlayVideo,\n onFormButtonClick: this.handleFormButtonClick,\n onQuoteClick: this.handleQuoteClick\n };\n }\n\n handleExpandImage(e) {\n e.preventDefault();\n this.props.onExpandMedia({\n url: e.target.src,\n filename: e.target.dataset.name,\n width: e.target.dataset.width,\n height: e.target.dataset.height,\n size: e.target.dataset.size,\n type: e.target.dataset.mime\n });\n }\n\n handlePlayVideo(e) {\n e.preventDefault();\n this.props.onExpandMedia({\n video: true,\n url: e.target.dataset.src,\n preview: e.target.src,\n filename: e.target.dataset.name,\n width: e.target.dataset.width,\n height: e.target.dataset.height,\n duration: e.target.dataset.duration,\n size: e.target.dataset.size,\n type: e.target.dataset.mime\n });\n }\n\n handleFormButtonClick(e) {\n e.preventDefault();\n const data = {\n seq: this.props.seq\n };\n data.resp = {};\n if (e.target.dataset.name) {\n data.resp[e.target.dataset.name] = e.target.dataset.val ? e.target.dataset.val :\n e.target.dataset.val === undefined ? 1 : '' + e.target.dataset.val;\n }\n if (e.target.dataset.act == 'url') {\n data.ref = sanitizeUrl(e.target.dataset.ref) || 'about:blank';\n }\n const text = e.target.dataset.title || 'unknown';\n this.props.onFormResponse(e.target.dataset.act, text, data);\n }\n\n handleContextClick(e) {\n e.preventDefault();\n e.stopPropagation();\n const menuItems = [];\n if (this.props.received == Tinode.MESSAGE_STATUS_FAILED) {\n menuItems.push('menu_item_send_retry');\n }\n if (this.props.userIsWriter && this.props.received > Tinode.MESSAGE_STATUS_FAILED) {\n menuItems.push('menu_item_reply');\n if (!this.props.response) {\n let immutable = false;\n Drafty.entities(this.props.content, (_0, _1, tp) => {\n immutable = ['AU', 'EX', 'FM', 'IM', 'VC', 'VD'].includes(tp);\n return immutable;\n });\n if (!immutable) {\n Drafty.styles(this.props.content, tp => {\n immutable = ['QQ'].includes(tp);\n return immutable;\n });\n }\n if (!immutable) {\n menuItems.push('menu_item_edit');\n }\n }\n }\n menuItems.push('menu_item_forward');\n\n this.props.showContextMenu({\n seq: this.props.seq,\n replace: this.props.edited ? parseInt(this.props.edited.split(':')[1]) : 0,\n content: this.props.content,\n userFrom: this.props.userFrom,\n userName: this.props.userName,\n y: e.pageY,\n x: e.pageX,\n pickReply: this.props.pickReply,\n editMessage: this.props.editMessage,\n }, menuItems);\n }\n\n handleProgress(ratio) {\n this.setState({progress: ratio});\n }\n\n handleCancelUpload() {\n this.props.onCancelUpload(this.props.seq, this.props.uploader);\n }\n\n handleQuoteClick(e) {\n e.preventDefault();\n e.stopPropagation();\n const replyToSeq = this.props.replyToSeq;\n if (replyToSeq) {\n this.props.onQuoteClick(replyToSeq);\n }\n }\n\n render() {\n const sideClass = this.props.sequence + ' ' + (this.props.response ? 'left' : 'right');\n const bubbleClass = (this.props.sequence == 'single' || this.props.sequence == 'last') ? 'bubble tip' : 'bubble';\n const avatar = this.props.userAvatar || true;\n const fullDisplay = (this.props.isGroup && this.props.response &&\n (this.props.sequence == 'single' || this.props.sequence == 'last'));\n\n let content = this.props.content;\n const attachments = [];\n if (this.props.mimeType == Drafty.getContentType() && Drafty.isValid(content)) {\n Drafty.attachments(content, (att, i) => {\n if (att.mime == 'application/json') {\n // Don't show json objects as attachments.\n // They are not meant for users.\n return;\n }\n attachments.push( );\n }, this);\n const tree = Drafty.format(content, fullFormatter, this.formatterContext);\n content = React.createElement(React.Fragment, null, tree);\n } else if (typeof content != 'string') {\n content = <>warning_amber \n >\n }\n\n return (\n \n {this.props.isGroup && this.props.response ?\n \n {fullDisplay ?\n :\n null}\n
:\n null}\n \n
\n
\n
\n {content}\n {attachments}\n
\n {this.props.timestamp ?\n
\n : null}\n
\n {this.props.showContextMenu ?\n
\n \n expand_more \n \n : null\n }\n
\n {fullDisplay ?\n
\n {this.props.userName ||\n \n }\n
\n : null\n }\n
\n \n );\n }\n};\n\nconst IntlChatMessage = injectIntl(BaseChatMessage);\nconst ChatMessage = React.forwardRef((props, ref) => );\n\nexport default ChatMessage;\n","// Send message form.\nimport React, { Suspense } from 'react';\nimport { FormattedMessage, defineMessages, injectIntl } from 'react-intl';\nimport { Drafty } from 'tinode-sdk';\n\n// Lazy-loading AudioRecorder because it's quite large due to\n// a dependency on webm-duration-fix.\nconst AudioRecorder = React.lazy(_ => import('./audio-recorder.jsx'));\n\nimport { KEYPRESS_DELAY } from '../config.js';\nimport { filePasted } from '../lib/blob-helpers.js';\nimport { replyFormatter } from '../lib/formatters.js';\n\nconst messages = defineMessages({\n messaging_disabled: {\n id: 'messaging_disabled_prompt',\n defaultMessage: 'Messaging disabled',\n description: 'Prompt in SendMessage in read-only topic'\n },\n type_new_message: {\n id: 'new_message_prompt',\n defaultMessage: 'New message',\n description: 'Prompt in send message field'\n },\n add_image_caption: {\n id: 'image_caption_prompt',\n defaultMessage: 'Image caption',\n description: 'Prompt in SendMessage for attached image'\n },\n file_attachment_too_large: {\n id: 'file_attachment_too_large',\n defaultMessage: 'The file size {size} exceeds the {limit} limit.',\n description: 'Error message when attachment is too large'\n },\n cannot_initiate_upload: {\n id: 'cannot_initiate_file_upload',\n defaultMessage: 'Cannot initiate file upload.',\n description: 'Generic error messagewhen attachment fails'\n },\n icon_title_record_voice: {\n id: 'icon_title_record_voice',\n defaultMessage: 'Record voice message',\n description: 'Icon tool tip for recording a voice message'\n },\n icon_title_attach_file: {\n id: 'icon_title_attach_file',\n defaultMessage: 'Attach file',\n description: 'Icon tool tip for attaching a file'\n },\n icon_title_add_image: {\n id: 'icon_title_add_image',\n defaultMessage: 'Add image',\n description: 'Icon tool tip for attaching an image'\n },\n icon_title_send: {\n id: 'icon_title_send',\n defaultMessage: 'Send message',\n description: 'Icon tool tip for sending a message'\n },\n});\n\nclass SendMessage extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.state = {\n quote: null,\n message: '',\n audioRec: false,\n audioAvailable: !!(navigator.mediaDevices && navigator.mediaDevices.getUserMedia),\n };\n\n // Timestamp when the previous key press was sent to the server.\n this.keypressTimestamp = 0;\n\n this.handlePasteEvent = this.handlePasteEvent.bind(this);\n this.handleAttachImage = this.handleAttachImage.bind(this);\n this.handleAttachFile = this.handleAttachFile.bind(this);\n this.handleAttachAudio = this.handleAttachAudio.bind(this);\n this.handleSend = this.handleSend.bind(this);\n this.handleKeyPress = this.handleKeyPress.bind(this);\n this.handleMessageTyping = this.handleMessageTyping.bind(this);\n this.handleDropAttach = this.handleDropAttach.bind(this);\n\n this.handleQuoteClick = this.handleQuoteClick.bind(this);\n\n this.formatReply = this.formatReply.bind(this);\n }\n\n componentDidMount() {\n if (this.messageEditArea) {\n this.messageEditArea.addEventListener('paste', this.handlePasteEvent, false);\n if (window.getComputedStyle(this.messageEditArea).getPropertyValue('transition-property') == 'all') {\n // Set focus on desktop, but not on mobile: focus causes soft keyboard to pop up.\n this.messageEditArea.focus();\n }\n }\n\n this.setState({quote: this.formatReply()});\n }\n\n componentWillUnmount() {\n if (this.messageEditArea) {\n this.messageEditArea.removeEventListener('paste', this.handlePasteEvent, false);\n }\n }\n\n componentDidUpdate(prevProps) {\n if (this.messageEditArea) {\n if (window.getComputedStyle(this.messageEditArea).getPropertyValue('transition-property') == 'all') {\n // Set focus on desktop, but not on mobile: focus causes soft keyboard to pop up.\n this.messageEditArea.focus();\n }\n }\n\n if (prevProps.topicName != this.props.topicName) {\n this.setState({message: this.props.initMessage || '', audioRec: false, quote: null});\n } else if (prevProps.initMessage != this.props.initMessage) {\n const msg = this.props.initMessage || '';\n this.setState({message: msg}, _ => {\n // If there is text, scroll to bottom and set caret to the end.\n this.messageEditArea.scrollTop = this.messageEditArea.scrollHeight;\n this.messageEditArea.setSelectionRange(msg.length, msg.length);\n });\n }\n if (prevProps.reply != this.props.reply) {\n this.setState({quote: this.formatReply()});\n }\n }\n\n formatReply() {\n return this.props.reply ?\n Drafty.format(this.props.reply.content, replyFormatter, {\n formatMessage: this.props.intl.formatMessage.bind(this.props.intl),\n authorizeURL: this.props.tinode.authorizeURL.bind(this.props.tinode)\n }) : null;\n }\n\n handlePasteEvent(e) {\n if (this.props.disabled) {\n return;\n }\n // FIXME: handle large files too.\n if (filePasted(e,\n file => { this.props.onAttachImage(file); },\n file => { this.props.onAttachFile(file); },\n this.props.onError)) {\n\n // If a file was pasted, don't paste base64 data into input field.\n e.preventDefault();\n }\n }\n\n handleAttachImage(e) {\n if (e.target.files && e.target.files.length > 0) {\n this.props.onAttachImage(e.target.files[0]);\n }\n // Clear the value so the same file can be uploaded again.\n e.target.value = '';\n }\n\n handleAttachFile(e) {\n if (e.target.files && e.target.files.length > 0) {\n this.props.onAttachFile(e.target.files[0]);\n }\n // Clear the value so the same file can be uploaded again.\n e.target.value = '';\n }\n\n handleDropAttach(files) {\n if (files && files.length > 0) {\n this.props.onAttachFile(files[0]);\n }\n }\n\n handleAttachAudio(url, preview, duration) {\n this.setState({audioRec: false});\n this.props.onAttachAudio(url, preview, duration);\n }\n\n handleSend(e) {\n e.preventDefault();\n const message = this.state.message.trim();\n if (message || this.props.acceptBlank || this.props.noInput) {\n this.props.onSendMessage(message);\n this.setState({message: ''});\n }\n }\n\n /* Send on Enter key */\n handleKeyPress(e) {\n if (this.state.audioRec) {\n // Ignore key presses while audio is being recorded.\n e.preventDefault();\n e.stopPropagation();\n return;\n }\n\n // Remove this if you don't want Enter to trigger send\n if (e.key === 'Enter') {\n // Have Shift-Enter insert a line break instead\n if (!e.shiftKey) {\n e.preventDefault();\n e.stopPropagation();\n\n this.handleSend(e);\n }\n }\n }\n\n handleMessageTyping(e) {\n this.setState({message: e.target.value});\n if (this.props.onKeyPress) {\n const now = new Date().getTime();\n if (now - this.keypressTimestamp > KEYPRESS_DELAY) {\n this.props.onKeyPress();\n this.keypressTimestamp = now;\n }\n }\n }\n\n handleQuoteClick(e) {\n e.preventDefault();\n e.stopPropagation();\n if (this.props.reply && this.props.onQuoteClick) {\n const replyToSeq = this.props.reply.seq;\n this.props.onQuoteClick(replyToSeq);\n }\n }\n\n render() {\n const { formatMessage } = this.props.intl;\n const prompt = this.props.disabled ?\n formatMessage(messages.messaging_disabled) :\n (this.props.messagePrompt ?\n formatMessage(messages[this.props.messagePrompt]) :\n formatMessage(messages.type_new_message));\n\n const sendIcon = (this.props.reply && this.props.reply.editing) ?\n 'check_circle' : 'send';\n\n const quote = this.state.quote ?\n (\n
\n {this.state.quote}\n
) : null;\n const audioEnabled = this.state.audioAvailable && this.props.onAttachAudio;\n return (\n \n {!this.props.noInput ? quote : null}\n
}>\n
this.props.onKeyPress(true)}\n onDeleted={_ => this.setState({audioRec: false})}\n onFinished={this.handleAttachAudio}/>\n ) :\n \n \n );\n }\n};\n\nexport default injectIntl(SendMessage);\n","import React from 'react';\nimport { FormattedMessage } from 'react-intl';\nimport SendMessage from '../widgets/send-message.jsx';\n\nimport { bytesToHumanSize, shortenFileName } from '../lib/strformat.js';\n\n// Get material icon name from mime type.\nfunction iconFromMime(mime) {\n // If more icons become available in material icons, add them to this mime-to-icon mapping.\n const mimeToIcon = {default: 'insert_drive_file', image: 'image', text: 'description', video: 'theaters'};\n\n return mimeToIcon[mime] || mimeToIcon[(mime || '').split('/')[0]] || mimeToIcon['default'];\n}\n\nexport default class DocPreview extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.handleSendDoc = this.handleSendDoc.bind(this);\n }\n\n handleSendDoc(caption) {\n this.props.onClose();\n this.props.onSendMessage(this.props.content.file);\n }\n\n render() {\n if (!this.props.content) {\n return null;\n }\n return (\n \n
\n
\n
\n
{iconFromMime(this.props.content.type)} \n
{shortenFileName(this.props.content.name, 24) || '-'}
\n
{this.props.content.type || 'application/octet-stream'}
\n
{bytesToHumanSize(this.props.content.size)}
\n
\n
\n
\n
\n );\n }\n};\n","// GroupSubs: a list of group subscribers currently online.\n// Show in the topic title bar\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport { MAX_ONLINE_IN_TOPIC } from '../config.js'\n\nimport LetterTile from './letter-tile.jsx';\nimport { makeImageUrl } from '../lib/blob-helpers.js';\n\nexport default class GroupSubs extends React.Component {\n constructor(props) {\n super(props);\n }\n\n render() {\n const usersOnline = [];\n const totalCount = (this.props.subscribers || []).length;\n const countToShow = Math.min(MAX_ONLINE_IN_TOPIC, totalCount);\n\n (this.props.subscribers || []).some((sub) => {\n usersOnline.push(\n \n \n
\n );\n return usersOnline.length == countToShow;\n });\n\n return (\n {usersOnline} {totalCount > countToShow ?\n \n \n : null}\n
\n );\n }\n};\n","import React from 'react';\nimport { FormattedMessage } from 'react-intl';\nimport SendMessage from './send-message.jsx';\n\nimport { REM_SIZE } from '../config.js';\nimport { fitImageSize } from '../lib/blob-helpers.js';\nimport { bytesToHumanSize, shortenFileName } from '../lib/strformat.js';\n\nexport default class ImagePreview extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.state = {\n width: 0,\n height: 0\n };\n\n this.handleSendImage = this.handleSendImage.bind(this);\n }\n\n assignWidth(node) {\n if (node && !this.state.width) {\n const bounds = node.getBoundingClientRect();\n this.setState({\n width: bounds.width | 0,\n height: bounds.height | 0\n });\n }\n }\n\n handleSendImage(caption) {\n this.props.onClose();\n this.props.onSendMessage(caption, this.props.content.blob);\n }\n\n render() {\n if (!this.props.content) {\n return null;\n }\n\n const dim = fitImageSize(this.props.content.width, this.props.content.height,\n this.state.width, this.state.height, false);\n const size = dim ? { width: dim.dstWidth + 'px', height: dim.dstHeight + 'px' } :\n ((this.props.content.width > this.props.content.height) ? {width: '100%'} : {height: '100%'});\n size.maxWidth = '100%';\n size.maxHeight = '100%';\n\n // Average font aspect ratio is ~0.5; File name takes 1/3 of the viewport width.\n const maxlength = Math.max(((this.state.width / REM_SIZE / 1.5) | 0) - 2, 12);\n const fname = shortenFileName(this.props.content.filename, maxlength) || '-';\n\n const width = this.props.content.width || '-';\n const height = this.props.content.height || '-';\n return (\n \n
\n
this.assignWidth(node)}>\n
\n
\n {this.props.onSendMessage ?\n
\n :\n }\n
\n );\n }\n};\n","// A single topic or user.\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nexport default class Invitation extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.handleButtonAction = this.handleButtonAction.bind(this);\n }\n\n handleButtonAction(evt, data) {\n evt.preventDefault();\n this.props.onAction(data);\n }\n\n render() {\n return (\n \n
\n \n
\n
\n { this.handleButtonAction(event, \"accept\"); }}>\n \n \n { this.handleButtonAction(event, \"delete\"); }}>\n \n \n { this.handleButtonAction(event, \"block\"); }}>\n \n \n
\n
\n );\n }\n};\n","/* This is just a static page to display when no conversation is selected. */\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport { Tinode } from 'tinode-sdk';\n\nimport { APP_NAME } from '../config.js';\n\nexport default class LogoView extends React.PureComponent {\n render() {\n const version = APP_NAME + ' (' + Tinode.getLibrary() + ')';\n return (\n \n
\n
\n \n Tinode Web \n \n
{version}
\n
{this.props.serverVersion} ({this.props.serverAddress})
\n
\n
\n );\n }\n};\n","// Message bubble with non-payload content, such as an indicator of deleted content or a date stamp.\n\nimport React from 'react';\n\nexport default class MetaMessage extends React.PureComponent {\n constructor(props) {\n super(props);\n }\n\n render() {\n let content = null;\n let bubbleClass = 'bubble';\n if (this.props.date) {\n // A date badge.\n content = <>{this.props.date}>\n bubbleClass += ' date';\n }\n\n if (!content) {\n return <>{null}>\n }\n\n return (\n \n \n \n );\n }\n};\n","import React from 'react';\nimport { FormattedMessage, defineMessages, injectIntl } from 'react-intl';\nimport SendMessage from './send-message.jsx';\n\nimport { bytesToHumanSize } from '../lib/strformat.js';\n\nconst messages = defineMessages({\n unrecognized_video_format: {\n id: 'unrecognized_video_format',\n defaultMessage: 'Format of this video is not recognized',\n description: 'Error message when uploaded video is invalid',\n }\n});\n\nclass VideoPreview extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.videoRef = React.createRef();\n\n this.handleSendVideo = this.handleSendVideo.bind(this);\n }\n\n handleSendVideo(caption) {\n this.props.onClose();\n const params = {\n width: this.videoRef.current.videoWidth,\n height: this.videoRef.current.videoHeight,\n duration: (this.videoRef.current.duration * 1000) | 0,\n mime: this.props.content.mime,\n name: this.props.content.filename\n }\n\n if (params.width == 0 || params.height == 0) {\n this.props.onError(this.props.intl.formatMessage(messages.unrecognized_video_format), 'err');\n return;\n }\n\n // Capture screen from a video.\n const canvas = document.createElement('canvas');\n canvas.width = params.width;\n canvas.height = params.height;\n const ctx = canvas.getContext('2d');\n ctx.drawImage(this.videoRef.current, 0, 0, canvas.width, canvas.height);\n ctx.canvas.toBlob(\n preview => this.props.onSendMessage(caption, this.props.content.blob, preview, params),\n 'image/jpeg', 0.75\n );\n }\n\n render() {\n if (!this.props.content) {\n return null;\n }\n\n const width = this.props.content.width || '-';\n const height = this.props.content.height || '-';\n\n const controlist = this.props.onSendMessage ? 'nodownload' : '';\n const autoPlay = !this.props.onSendMessage;\n\n return (\n \n
\n
\n \n
\n {this.props.onSendMessage ?\n
\n :\n }\n
\n );\n }\n};\n\nexport default injectIntl(VideoPreview);\n","// Utility class for hash navigation.\n\nexport default class HashNavigation {\n // Parse hash as in http://www.example.com/path#hash as if it were\n // path and arguments.\n static parseUrlHash(hash) {\n // Split path from args, path -> parts[0], args->path[1]\n const parts = hash.split('?', 2);\n const params = {};\n let path = [];\n if (parts[0]) {\n path = parts[0].replace('#', '').split('/');\n }\n if (parts[1]) {\n parts[1].split('&').forEach((arg) => {\n // Can't use split() because the value may contain '='.\n const eq = arg.indexOf('=');\n if (eq > 0) {\n params[arg.slice(0, eq)] = decodeURIComponent(arg.slice(eq + 1));\n }\n });\n }\n return {path: path, params: params};\n }\n\n static navigateTo(url) {\n window.location.hash = url;\n }\n\n static composeUrlHash(path, params) {\n let url = path.join('/');\n const args = [];\n for (const key in params) {\n if (params.hasOwnProperty(key)) {\n args.push(key + '=' + encodeURIComponent(params[key]));\n }\n }\n if (args.length > 0) {\n url += '?' + args.join('&');\n }\n return url;\n }\n\n static addUrlParam(hash, key, value) {\n const parsed = HashNavigation.parseUrlHash(hash);\n parsed.params[key] = value;\n return HashNavigation.composeUrlHash(parsed.path, parsed.params);\n }\n\n static removeUrlParam(hash, key) {\n const parsed = HashNavigation.parseUrlHash(hash);\n delete parsed.params[key];\n return HashNavigation.composeUrlHash(parsed.path, parsed.params);\n }\n\n static setUrlSidePanel(hash, sidepanel) {\n const parsed = HashNavigation.parseUrlHash(hash);\n parsed.path[0] = sidepanel;\n return HashNavigation.composeUrlHash(parsed.path, parsed.params);\n }\n\n static setUrlInfoPanel(hash, infopanel) {\n const parsed = HashNavigation.parseUrlHash(hash);\n if (infopanel) {\n parsed.params.info = infopanel;\n } else {\n delete parsed.params.info;\n }\n return HashNavigation.composeUrlHash(parsed.path, parsed.params);\n }\n\n static setUrlTopic(hash, topic) {\n const parsed = HashNavigation.parseUrlHash(hash);\n parsed.path[1] = topic;\n // Close InfoView on topic change.\n delete parsed.params.info;\n return HashNavigation.composeUrlHash(parsed.path, parsed.params);\n }\n}\n","// Panel with a chat.\n\nimport React from 'react';\nimport { FormattedMessage, defineMessages, injectIntl } from 'react-intl';\n\nimport { Drafty, Tinode } from 'tinode-sdk';\n\nimport CallPanel from '../widgets/call-panel.jsx';\nimport ChatMessage from '../widgets/chat-message.jsx';\nimport ContactBadges from '../widgets/contact-badges.jsx';\nimport DocPreview from '../widgets/doc-preview.jsx';\nimport ErrorPanel from '../widgets/error-panel.jsx';\nimport GroupSubs from '../widgets/group-subs.jsx';\nimport ImagePreview from '../widgets/image-preview.jsx';\nimport Invitation from '../widgets/invitation.jsx';\nimport LetterTile from '../widgets/letter-tile.jsx';\nimport LoadSpinner from '../widgets/load-spinner.jsx';\nimport LogoView from './logo-view.jsx';\nimport MetaMessage from '../widgets/meta-message.jsx';\nimport SendMessage from '../widgets/send-message.jsx';\nimport VideoPreview from '../widgets/video-preview.jsx';\n\nimport { DEFAULT_P2P_ACCESS_MODE, EDIT_PREVIEW_LENGTH, IMAGE_PREVIEW_DIM, KEYPRESS_DELAY,\n MESSAGES_PAGE, MAX_EXTERN_ATTACHMENT_SIZE, MAX_IMAGE_DIM, MAX_INBAND_ATTACHMENT_SIZE,\n READ_DELAY, QUOTED_REPLY_LENGTH, VIDEO_PREVIEW_DIM } from '../config.js';\nimport { CALL_STATE_OUTGOING_INITATED, CALL_STATE_IN_PROGRESS } from '../constants.js';\nimport { blobToBase64, fileToBase64, imageScaled, makeImageUrl } from '../lib/blob-helpers.js';\nimport HashNavigation from '../lib/navigation.js';\nimport { bytesToHumanSize, relativeDateFormat, shortDateFormat } from '../lib/strformat.js';\n\n// Run timer with this frequency (ms) for checking notification queue.\nconst NOTIFICATION_EXEC_INTERVAL = 300;\n// Scroll distance before [go to latest message] button is shown.\nconst SHOW_GO_TO_LAST_DIST = 100;\n\nconst messages = defineMessages({\n online_now: {\n id: 'online_now',\n defaultMessage: 'online now',\n description: 'Indicator that the user or topic is currently online',\n },\n last_seen: {\n id: 'last_seen_timestamp',\n defaultMessage: 'Last seen',\n description: 'Label for the timestamp of when the user or topic was last online'\n },\n not_found: {\n id: 'title_not_found',\n defaultMessage: 'Not found',\n description: 'Title shown when topic is not found'\n },\n channel: {\n id: 'channel',\n defaultMessage: 'channel',\n description: 'Subtitle shown for channels in MessagesView instead of last seen'\n },\n file_attachment_too_large: {\n id: 'file_attachment_too_large',\n defaultMessage: 'The file size {size} exceeds the {limit} limit.',\n description: 'Error message when attachment is too large'\n },\n invalid_content: {\n id: 'invalid_content',\n defaultMessage: 'invalid content',\n description: 'Shown when the message is unreadable'\n },\n editing_message: {\n id: 'editing_message',\n defaultMessage: 'Editing',\n description: 'Title over message editing preview'\n },\n drag_file: {\n id: 'drag_file',\n defaultMessage: 'Drag file here',\n description: 'Prompt on the file drag-n-drop overlay banner'\n }\n});\n\n// Checks if the access permissions are granted but not yet accepted.\nfunction isUnconfirmed(acs) {\n if (acs) {\n const ex = acs.getExcessive() || '';\n return acs.isJoiner('given') && (ex.includes('R') || ex.includes('W'));\n }\n return false;\n}\n\nfunction isPeerRestricted(acs) {\n if (acs) {\n const ms = acs.getMissing() || '';\n return acs.isJoiner('want') && (ms.includes('R') || ms.includes('W'));\n }\n return false;\n}\n\nfunction shouldPresentCallPanel(callState) {\n // Show call panel if either:\n // - call is outgoing (and the client is waiting for the other side to pick up) or,\n // - call is already in progress.\n return callState == CALL_STATE_OUTGOING_INITATED || callState == CALL_STATE_IN_PROGRESS;\n}\n\nclass MessagesView extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = MessagesView.getDerivedStateFromProps(props, {});\n\n this.leave = this.leave.bind(this);\n this.sendMessage = this.sendMessage.bind(this);\n this.retrySend = this.retrySend.bind(this);\n this.sendImageAttachment = this.sendImageAttachment.bind(this);\n this.sendVideoAttachment = this.sendVideoAttachment.bind(this);\n this.sendFileAttachment = this.sendFileAttachment.bind(this);\n this.sendAudioAttachment = this.sendAudioAttachment.bind(this);\n this.sendKeyPress = this.sendKeyPress.bind(this);\n this.subscribe = this.subscribe.bind(this);\n this.handleScrollReference = this.handleScrollReference.bind(this);\n this.mountDnDEvents = this.mountDnDEvents.bind(this);\n this.handleScrollEvent = this.handleScrollEvent.bind(this);\n this.handleDescChange = this.handleDescChange.bind(this);\n this.handleSubsUpdated = this.handleSubsUpdated.bind(this);\n this.handleMessageUpdate = this.handleMessageUpdate.bind(this);\n this.handleAllMessagesReceived = this.handleAllMessagesReceived.bind(this);\n this.handleInfoReceipt = this.handleInfoReceipt.bind(this);\n this.handleExpandMedia = this.handleExpandMedia.bind(this);\n this.handleClosePreview = this.handleClosePreview.bind(this);\n this.handleFormResponse = this.handleFormResponse.bind(this);\n this.handleContextClick = this.handleContextClick.bind(this);\n this.handleShowMessageContextMenu = this.handleShowMessageContextMenu.bind(this);\n this.handleNewChatAcceptance = this.handleNewChatAcceptance.bind(this);\n this.handleEnablePeer = this.handleEnablePeer.bind(this);\n this.handleAttachFile = this.handleAttachFile.bind(this);\n this.handleAttachImageOrVideo = this.handleAttachImageOrVideo.bind(this);\n this.handleCancelUpload = this.handleCancelUpload.bind(this);\n this.postReadNotification = this.postReadNotification.bind(this);\n this.clearNotificationQueue = this.clearNotificationQueue.bind(this);\n this.goToLatestMessage = this.goToLatestMessage.bind(this);\n this.handleFileDrop = this.handleFileDrop.bind(this);\n\n this.handlePickReply = this.handlePickReply.bind(this);\n this.handleEditMessage = this.handleEditMessage.bind(this);\n this.handleCancelReply = this.handleCancelReply.bind(this);\n this.handleQuoteClick = this.handleQuoteClick.bind(this);\n this.handleCallHangup = this.handleCallHangup.bind(this);\n\n this.isDragEnabled = this.isDragEnabled.bind(this);\n this.handleDragIn = this.handleDragIn.bind(this);\n this.handleDragOut = this.handleDragOut.bind(this);\n this.handleDrag = this.handleDrag.bind(this);\n this.handleDrop = this.handleDrop.bind(this);\n\n this.chatMessageRefs = {};\n this.getOrCreateMessageRef = this.getOrCreateMessageRef.bind(this);\n\n // Keeps track of the drag event.\n // Need a counter b/c the browser's 'drag' events may fire multiple times\n // when the user takes the mouse pointer over the container:\n // for the component itself and for all nested/child elements.\n this.dragCounter = 0;\n this.dndRef = null;\n\n this.readNotificationQueue = [];\n this.readNotificationTimer = null;\n\n this.keyPressTimer = null;\n }\n\n getOrCreateMessageRef(seqId) {\n if (this.chatMessageRefs.hasOwnProperty(seqId)) {\n return this.chatMessageRefs[seqId];\n }\n const ref = React.createRef();\n this.chatMessageRefs[seqId] = ref;\n return ref;\n }\n\n componentDidMount() {\n if (this.messagesScroller) {\n this.messagesScroller.addEventListener('scroll', this.handleScrollEvent);\n }\n\n // Drag and drop events\n if (this.dndRef) {\n this.dndRef.addEventListener('dragenter', this.handleDragIn);\n this.dndRef.addEventListener('dragleave', this.handleDragOut);\n this.dndRef.addEventListener('dragover', this.handleDrag);\n this.dndRef.addEventListener('drop', this.handleDrop);\n }\n }\n\n componentWillUnmount() {\n if (this.messagesScroller) {\n this.messagesScroller.removeEventListener('scroll', this.handleScrollEvent);\n }\n\n // Flush all notifications.\n this.clearNotificationQueue();\n\n // Drag and drop events\n if (this.dndRef) {\n this.dndRef.removeEventListener('dragenter', this.handleDragIn);\n this.dndRef.removeEventListener('dragleave', this.handleDragOut);\n this.dndRef.removeEventListener('dragover', this.handleDrag);\n this.dndRef.removeEventListener('drop', this.handleDrop);\n }\n }\n\n // Scroll last message into view on component update e.g. on message received\n // or vertical shrinking.\n componentDidUpdate(prevProps, prevState) {\n if (this.messagesScroller &&\n (prevState.topic != this.state.topic || prevState.messageCount != this.state.messageCount)) {\n // New message.\n if (this.state.scrollPosition < SHOW_GO_TO_LAST_DIST) {\n this.messagesScroller.scrollTop = this.messagesScroller.scrollHeight -\n this.state.scrollPosition -\n this.messagesScroller.offsetHeight;\n }\n }\n\n const topic = this.props.tinode ? this.props.tinode.getTopic(this.state.topic) : undefined;\n if (this.state.topic != prevState.topic) {\n if (prevState.topic && !Tinode.isNewGroupTopicName(prevState.topic)) {\n this.leave(prevState.topic);\n if (prevState.rtcPanel) {\n this.handleCallHangup(prevState.topic, prevProps.callSeq);\n }\n }\n\n if (topic) {\n topic.onData = this.handleMessageUpdate;\n topic.onAllMessagesReceived = this.handleAllMessagesReceived;\n topic.onInfo = this.handleInfoReceipt;\n topic.onMetaDesc = this.handleDescChange;\n topic.onSubsUpdated = this.handleSubsUpdated;\n topic.onPres = this.handleSubsUpdated;\n }\n }\n\n if (!this.props.applicationVisible) {\n // If application is not visible, flush all unsent 'read' notifications.\n this.clearNotificationQueue();\n } else {\n // Otherwise assume there are unread messages.\n this.postReadNotification(0);\n }\n\n if (topic && ((this.state.topic != prevState.topic) || !prevProps.ready)) {\n // Don't immediately subscribe to a new p2p topic, wait for the first message.\n if (topic._new && topic.isP2PType()) {\n topic.getMeta(topic.startMetaQuery().withDesc().build());\n } else {\n this.subscribe(topic);\n }\n }\n }\n\n static getDerivedStateFromProps(nextProps, prevState) {\n let nextState = {};\n if (!nextProps.topic) {\n // Default state: no topic.\n nextState = {\n messageCount: 0,\n latestClearId: -1,\n onlineSubs: [],\n topic: null,\n title: '',\n avatar: null,\n isVerified: false,\n isStaff: false,\n isDangerous: false,\n deleted: false,\n docPreview: null,\n imagePreview: null,\n imagePostview: null,\n videoPreview: null,\n videoPostview: null,\n rtcPanel: null,\n typingIndicator: false,\n scrollPosition: 0,\n fetchingMessages: false,\n peerMessagingDisabled: false,\n channel: false,\n reply: null,\n contentToEdit: null,\n showGoToLastButton: false,\n dragging: false\n };\n } else if (nextProps.topic != prevState.topic) {\n const topic = nextProps.tinode.getTopic(nextProps.topic);\n\n nextState = {\n topic: nextProps.topic,\n deleted: topic._deleted,\n docPreview: null,\n imagePreview: null,\n imagePostview: null,\n videoPreview: null,\n videoPostview: null,\n rtcPanel: null,\n typingIndicator: false,\n scrollPosition: 0,\n fetchingMessages: false,\n showGoToLastButton: false,\n contentToEdit: null,\n dragging: false\n };\n\n if (nextProps.forwardMessage) {\n // We are forwarding a message. Show preview.\n nextState.reply = {\n content: nextProps.forwardMessage.preview,\n seq: null\n };\n } else {\n nextState.reply = null;\n }\n\n if (topic) {\n // Topic exists.\n const subs = [];\n\n if (nextProps.connected) {\n topic.subscribers((sub) => {\n if (sub.online && sub.user != nextProps.myUserId) {\n subs.push(sub);\n }\n });\n }\n\n Object.assign(nextState, {\n onlineSubs: subs\n });\n\n if (topic.public) {\n Object.assign(nextState, {\n title: topic.public.fn,\n avatar: makeImageUrl(topic.public.photo)\n });\n } else {\n Object.assign(nextState, {\n title: '',\n avatar: null\n });\n }\n\n const peer = topic.p2pPeerDesc();\n if (peer) {\n Object.assign(nextState, {\n peerMessagingDisabled: isPeerRestricted(peer.acs)\n });\n } else if (prevState.peerMessagingDisabled) {\n Object.assign(nextState, {\n peerMessagingDisabled: false\n });\n }\n Object.assign(nextState, {\n messageCount: topic.messageCount(),\n latestClearId: topic.maxClearId(),\n channel: topic.isChannelType()\n });\n\n if (nextProps.callTopic == topic.name && shouldPresentCallPanel(nextProps.callState)) {\n nextState.rtcPanel = nextProps.callTopic;\n }\n } else {\n // Invalid topic.\n Object.assign(nextState, {\n messageCount: 0,\n latestClearId: -1,\n onlineSubs: [],\n title: '',\n avatar: null,\n peerMessagingDisabled: false,\n channel: false\n });\n }\n } else {\n // We are still in same topic. Show the call panel if necessary.\n if (nextProps.callTopic == prevState.topic && !prevState.rtcPanel &&\n shouldPresentCallPanel(nextProps.callState)) {\n nextState.rtcPanel = nextProps.callTopic;\n }\n }\n\n if (nextProps.acs) {\n if (nextProps.acs.isWriter() != prevState.isWriter) {\n nextState.isWriter = !prevState.isWriter;\n }\n if (nextProps.acs.isReader() != prevState.isReader) {\n nextState.isReader = !prevState.isReader;\n }\n if (!nextProps.acs.isReader('given') != prevState.readingBlocked) {\n nextState.readingBlocked = !prevState.readingBlocked;\n }\n if (nextProps.acs.isSharer() != prevState.isSharer) {\n nextState.isSharer = !prevState.isSharer;\n }\n } else {\n if (prevState.isWriter) {\n nextState.isWriter = false;\n }\n if (prevState.isReader) {\n nextState.isReader = false;\n }\n if (!prevState.readingBlocked) {\n prevState.readingBlocked = true;\n }\n if (prevState.isSharer) {\n nextState.isSharer = false;\n }\n }\n\n if (isUnconfirmed(nextProps.acs) == !prevState.unconformed) {\n nextState.unconfirmed = !prevState.unconformed;\n }\n\n // Clear subscribers online when there is no connection.\n if (!nextProps.connected && prevState.onlineSubs && prevState.onlineSubs.length > 0) {\n nextState.onlineSubs = [];\n }\n\n return nextState;\n }\n\n subscribe(topic) {\n if (topic.isSubscribed() || !this.props.ready) {\n return;\n }\n\n // Is this a new topic?\n const newTopic = (this.props.newTopicParams && this.props.newTopicParams._topicName == this.props.topic);\n\n // Don't request the tags. They are useless unless the user\n // is the owner and is editing the topic.\n let getQuery = topic.startMetaQuery().withLaterDesc().withLaterSub();\n if (this.state.isReader || newTopic) {\n // Reading is either permitted or we don't know because it's a new topic. Ask for messages.\n getQuery = getQuery.withLaterData(MESSAGES_PAGE);\n if (this.state.isReader) {\n getQuery = getQuery.withLaterDel();\n }\n // And show \"loading\" spinner.\n this.setState({ fetchingMessages: true });\n }\n\n const setQuery = newTopic ? this.props.newTopicParams : undefined;\n topic.subscribe(getQuery.build(), setQuery)\n .then(ctrl => {\n if (ctrl.code == 303) {\n // Redirect to another topic requested.\n HashNavigation.navigateTo(HashNavigation.setUrlTopic('', ctrl.params.topic));\n return;\n }\n if (this.state.topic != ctrl.topic) {\n this.setState({topic: ctrl.topic});\n }\n this.props.onNewTopicCreated(this.props.topic, ctrl.topic);\n // If there are unsent messages (except video call messages),\n // try sending them now. Unsent video call messages will be dropped.\n let calls = [];\n topic.queuedMessages((pub) => {\n if (pub._sending) {\n return;\n }\n if (pub.head && pub.head.webrtc) {\n // Filter out unsent video call messages.\n calls.push(pub.seq);\n return;\n }\n if (topic.isSubscribed()) {\n this.retrySend(pub);\n }\n });\n if (calls.length > 0) {\n topic.delMessagesList(calls, true);\n }\n })\n .catch(err => {\n console.error(\"Failed subscription to\", this.state.topic, err);\n this.props.onError(err.message, 'err');\n const blankState = MessagesView.getDerivedStateFromProps({}, {});\n blankState.title = this.props.intl.formatMessage(messages.not_found);\n this.setState(blankState);\n });\n }\n\n leave(oldTopicName) {\n if (!oldTopicName || !this.props.tinode.isTopicCached(oldTopicName)) {\n return;\n }\n\n const oldTopic = this.props.tinode.getTopic(oldTopicName);\n if (oldTopic && oldTopic.isSubscribed()) {\n oldTopic.leave(false)\n .catch(_ => { /* do nothing here */ })\n .finally(_ => {\n // We don't care if the request succeeded or failed.\n // The topic is dead regardless.\n this.setState({fetchingMessages: false});\n oldTopic.onData = undefined;\n oldTopic.onAllMessagesReceived = undefined;\n oldTopic.onInfo = undefined;\n oldTopic.onMetaDesc = undefined;\n oldTopic.onSubsUpdated = undefined;\n oldTopic.onPres = undefined;\n });\n }\n }\n\n // Don't use React.createRef as the ref.current is not available in componentDidMount in this component.\n handleScrollReference(node) {\n if (node) {\n node.addEventListener('scroll', this.handleScrollEvent);\n this.messagesScroller = node;\n this.messagesScroller.scrollTop = this.messagesScroller.scrollHeight - this.state.scrollPosition;\n }\n }\n\n // Get older messages and show/hide [go to latest message] button.\n handleScrollEvent(event) {\n const pos = event.target.scrollHeight - event.target.scrollTop - event.target.offsetHeight;\n this.setState({\n scrollPosition: pos,\n // Show [go to latest message] if far enough from bottom and scrolling down.\n showGoToLastButton: (pos > SHOW_GO_TO_LAST_DIST) && (pos < this.state.scrollPosition),\n });\n\n if (this.state.fetchingMessages) {\n return;\n }\n\n if (event.target.scrollTop <= 0) {\n const topic = this.props.tinode.getTopic(this.state.topic);\n if (topic && topic.isSubscribed() && topic.msgHasMoreMessages()) {\n this.setState({fetchingMessages: true}, _ => {\n topic.getMessagesPage(MESSAGES_PAGE)\n .catch(err => this.props.onError(err.message, 'err'))\n .finally(_ => this.setState({fetchingMessages: false}));\n });\n }\n }\n }\n\n /* Mound draf and drop events */\n mountDnDEvents(dnd) {\n if (dnd) {\n dnd.addEventListener('dragenter', this.handleDragIn);\n dnd.addEventListener('dragleave', this.handleDragOut);\n dnd.addEventListener('dragover', this.handleDrag);\n dnd.addEventListener('drop', this.handleDrop);\n this.dndRef = dnd;\n }\n }\n\n goToLatestMessage() {\n this.setState({scrollPosition: 0});\n if (this.messagesScroller) {\n this.messagesScroller.scrollTop = this.messagesScroller.scrollHeight;\n }\n }\n\n handleDescChange(desc) {\n if (desc.public) {\n this.setState({\n title: desc.public.fn,\n avatar: makeImageUrl(desc.public.photo)\n });\n } else {\n this.setState({\n title: '',\n avatar: null\n });\n }\n\n if (desc.acs) {\n this.setState({\n isWriter: desc.acs.isWriter(),\n isReader: desc.acs.isReader(),\n readingBlocked: !desc.acs.isReader('given'),\n unconfirmed: isUnconfirmed(desc.acs),\n });\n }\n }\n\n postReadNotification(seq) {\n // Ignore notifications if the app is invisible.\n if (!this.props.applicationVisible) {\n return;\n }\n\n // Set up the timer if it's not running already.\n if (!this.readNotificationTimer) {\n this.readNotificationTimer = setInterval(_ => {\n if (this.readNotificationQueue.length == 0) {\n // Shut down the timer if the queue is empty.\n clearInterval(this.readNotificationTimer);\n this.readNotificationTimer = null;\n return;\n }\n\n let seq = -1;\n while (this.readNotificationQueue.length > 0) {\n const n = this.readNotificationQueue[0];\n if (n.topicName != this.state.topic) {\n // Topic has changed. Drop the notification.\n this.readNotificationQueue.shift();\n continue;\n }\n\n const now = new Date();\n if (n.sendAt <= now) {\n // Remove expired notification from queue.\n this.readNotificationQueue.shift();\n seq = Math.max(seq, n.seq);\n } else {\n break;\n }\n }\n\n // Send only one notification for the whole batch of messages.\n if (seq >= 0) {\n const topic = this.props.tinode.getTopic(this.state.topic);\n if (topic) {\n topic.noteRead(seq);\n }\n }\n }, NOTIFICATION_EXEC_INTERVAL);\n }\n\n const now = new Date();\n this.readNotificationQueue.push({\n topicName: this.state.topic,\n seq: seq,\n sendAt: now.setMilliseconds(now.getMilliseconds() + READ_DELAY)\n });\n }\n\n // Clear notification queue and timer.\n clearNotificationQueue() {\n this.readNotificationQueue = [];\n if (this.readNotificationTimer) {\n clearInterval(this.readNotificationTimer);\n this.readNotificationTimer = null;\n }\n }\n\n handleSubsUpdated() {\n if (this.state.topic) {\n const subs = [];\n const topic = this.props.tinode.getTopic(this.state.topic);\n topic.subscribers((sub) => {\n if (sub.online && sub.user != this.props.myUserId) {\n subs.push(sub);\n }\n });\n const newState = {onlineSubs: subs};\n const peer = topic.p2pPeerDesc();\n if (peer) {\n Object.assign(newState, {\n peerMessagingDisabled: isPeerRestricted(peer.acs)\n });\n } else if (this.state.peerMessagingDisabled) {\n Object.assign(newState, {\n peerMessagingDisabled: false\n });\n }\n this.setState(newState);\n }\n }\n\n // The 'msg' could be false-ish if some message ranges were deleted.\n handleMessageUpdate(msg) {\n const topic = this.props.tinode.getTopic(this.state.topic);\n if (!msg) {\n // msg could be null if one or more messages were deleted.\n // Updating state to force redraw.\n this.setState({latestClearId: topic.maxClearId()});\n return;\n }\n\n clearTimeout(this.keyPressTimer)\n this.setState({messageCount: topic.messageCount(), typingIndicator: false}, _ => {\n // Scroll to the bottom if the message is added to the end of the message\n // list if already at the bottom, otherwise show [go to latest] button.\n // Implemented as a callback to be sure the scroll height has been updated.\n if (topic.isNewMessage(msg.seq)) {\n if (this.state.scrollPosition > SHOW_GO_TO_LAST_DIST) {\n this.setState({showGoToLastButton: true});\n } else {\n this.goToLatestMessage();\n }\n }\n });\n\n // Aknowledge messages except own messages. They are\n // automatically assumed to be read and recived.\n const status = topic.msgStatus(msg, true);\n if (status >= Tinode.MESSAGE_STATUS_SENT && msg.from != this.props.myUserId) {\n this.postReadNotification(msg.seq);\n }\n }\n\n handleAllMessagesReceived(count) {\n this.setState({fetchingMessages: false});\n if (count > 0) {\n // 0 means \"latest\".\n this.postReadNotification(0);\n }\n }\n\n handleInfoReceipt(info) {\n switch (info.what) {\n case 'kp': {\n clearTimeout(this.keyPressTimer);\n this.keyPressTimer = setTimeout(_ => this.setState({typingIndicator: false}), KEYPRESS_DELAY + 1000);\n if (!this.state.typingIndicator) {\n this.setState({typingIndicator: true});\n }\n break;\n }\n case 'read':\n case 'recv':\n // Redraw due to changed recv/read status.\n this.forceUpdate();\n break;\n default:\n console.info(\"Other change in topic: \", info.what);\n }\n }\n\n handleExpandMedia(content) {\n if (!content) {\n return;\n }\n\n if (content.video) {\n this.setState({ videoPostview: content });\n } else {\n this.setState({ imagePostview: content });\n }\n }\n\n handleClosePreview() {\n if (this.state.imagePreview && this.state.imagePreview.url) {\n URL.revokeObjectURL(this.state.imagePreview.url);\n }\n if (this.state.videoPreview && this.state.videoPreview.url) {\n URL.revokeObjectURL(this.state.videoPreview.url);\n }\n this.setState({ imagePostview: null, imagePreview: null, docPreview: null, videoPreview: null, videoPostview: null});\n }\n\n handleFormResponse(action, text, data) {\n if (action == 'pub') {\n this.sendMessage(Drafty.attachJSON(Drafty.parse(text), data));\n } else if (action == 'url') {\n const url = new URL(data.ref);\n const params = url.searchParams;\n for (let key in data.resp) {\n if (data.resp.hasOwnProperty(key)) {\n params.set(key, data.resp[key]);\n }\n }\n ['name', 'seq'].map((key) => {\n if (data[key]) {\n params.set(key, data[key]);\n }\n });\n params.set('uid', this.props.myUserId);\n params.set('topic', this.state.topic);\n url.search = params;\n window.open(url, '_blank');\n } else {\n console.info(\"Unknown action in form\", action);\n }\n }\n\n handleContextClick(e) {\n e.preventDefault();\n e.stopPropagation();\n this.props.showContextMenu({ topicName: this.state.topic, y: e.pageY, x: e.pageX });\n }\n\n handleShowMessageContextMenu(params, messageSpecificMenuItems) {\n if (params.userFrom == 'chan') {\n params.userFrom = this.state.topic;\n params.userName = this.state.title;\n }\n params.topicName = this.state.topic;\n const menuItems = messageSpecificMenuItems || [];\n const topic = this.props.tinode.getTopic(params.topicName);\n if (topic) {\n if (!topic.isChannelType()) {\n menuItems.push('message_delete');\n }\n const acs = topic.getAccessMode();\n if (acs && acs.isDeleter()) {\n menuItems.push('message_delete_hard');\n }\n }\n this.props.showContextMenu(params, menuItems);\n }\n\n handleNewChatAcceptance(action) {\n this.props.onNewChat(this.state.topic, action);\n }\n\n handleEnablePeer(e) {\n e.preventDefault();\n this.props.onChangePermissions(this.state.topic, DEFAULT_P2P_ACCESS_MODE, this.state.topic);\n }\n\n sendKeyPress(audio) {\n const topic = this.props.tinode.getTopic(this.state.topic);\n if (topic.isSubscribed()) {\n if (audio) {\n topic.noteRecording(true);\n } else {\n topic.noteKeyPress();\n }\n }\n }\n\n // sendMessage sends the message with an optional subscription to topic first.\n sendMessage(msg, uploadCompletionPromise, uploader) {\n let head;\n if (this.props.forwardMessage) {\n // We are forwarding a message.\n msg = this.props.forwardMessage.msg;\n head = this.props.forwardMessage.head;\n this.handleCancelReply();\n } else if (this.state.reply) {\n if (this.state.reply.editing) {\n if (msg == this.state.contentToEdit) {\n // Message unchanged.\n this.handleCancelReply();\n return;\n }\n // Editing an existing message.\n head = {replace: ':' + this.state.reply.seq};\n } else if (this.state.reply.content) {\n // Replying to a message in this topic.\n // Turn it into Drafty so we can make a quoted Drafty object later.\n head = {reply: '' + this.state.reply.seq};\n if (typeof msg == 'string') {\n msg = Drafty.parse(msg);\n }\n msg = Drafty.append(Drafty.sanitizeEntities(this.state.reply.content), msg);\n }\n this.handleCancelReply();\n }\n this.props.sendMessage(msg, uploadCompletionPromise, uploader, head);\n }\n\n // Retry sending a message.\n retrySend(pub) {\n this.props.sendMessage(pub.content, undefined, undefined, pub.head)\n .then(_ => {\n // All good. Remove the original message draft from the cache.\n const topic = this.props.tinode.getTopic(this.state.topic);\n topic.delMessagesList([pub.seq], true);\n });\n }\n\n // Send attachment as Drafty message:\n // - if file is too large, upload it and send a s link.\n // - if file is small enough, just send it in-band.\n sendFileAttachment(file) {\n // Server-provided limit reduced for base64 encoding and overhead.\n const maxInbandAttachmentSize = (this.props.tinode.getServerParam('maxMessageSize',\n MAX_INBAND_ATTACHMENT_SIZE) * 0.75 - 1024) | 0;\n\n if (file.size > maxInbandAttachmentSize) {\n // Too large to send inband - uploading out of band and sending as a link.\n const uploader = this.props.tinode.getLargeFileHelper();\n if (!uploader) {\n this.props.onError(this.props.intl.formatMessage(messages.cannot_initiate_upload));\n return;\n }\n const uploadCompletionPromise = uploader.upload(file);\n const msg = Drafty.attachFile(null, {\n mime: file.type,\n filename: file.name,\n size: file.size,\n urlPromise: uploadCompletionPromise\n });\n // Pass data and the uploader to the TinodeWeb.\n this.sendMessage(msg, uploadCompletionPromise, uploader);\n } else {\n // Small enough to send inband.\n fileToBase64(file)\n .then(b64 => this.sendMessage(Drafty.attachFile(null, {\n mime: b64.mime,\n data: b64.bits,\n filename: b64.name,\n size: file.size\n })))\n .catch(err => this.props.onError(err.message, 'err'));\n }\n }\n\n // handleAttachFile method is called when [Attach file] button is clicked: launch attachment preview.\n handleAttachFile(file) {\n const maxExternAttachmentSize = this.props.tinode.getServerParam('maxFileUploadSize', MAX_EXTERN_ATTACHMENT_SIZE);\n\n if (file.size > maxExternAttachmentSize) {\n // Too large.\n this.props.onError(this.props.intl.formatMessage(messages.file_attachment_too_large,\n {size: bytesToHumanSize(file.size), limit: bytesToHumanSize(maxExternAttachmentSize)}), 'err');\n } else {\n this.setState({\n docPreview: {\n file: file,\n name: file.name,\n size: file.size,\n type: file.type\n }\n });\n }\n }\n\n handleCallHangup(topic, seq) {\n this.props.onVideoCallClosed();\n this.setState({\n rtcPanel: null\n });\n this.props.onCallHangup(topic, seq);\n }\n\n // sendImageAttachment sends the image bits as Drafty message.\n sendImageAttachment(caption, blob) {\n const mime = this.state.imagePreview.mime;\n const width = this.state.imagePreview.width;\n const height = this.state.imagePreview.height;\n const fname = this.state.imagePreview.filename;\n\n // Server-provided limit reduced for base64 encoding and overhead.\n const maxInbandAttachmentSize = (this.props.tinode.getServerParam('maxMessageSize',\n MAX_INBAND_ATTACHMENT_SIZE) * 0.75 - 1024) | 0;\n\n if (blob.size > maxInbandAttachmentSize) {\n // Too large to send inband - uploading out of band and sending as a link.\n const uploader = this.props.tinode.getLargeFileHelper();\n if (!uploader) {\n this.props.onError(this.props.intl.formatMessage(messages.cannot_initiate_upload));\n return;\n }\n const uploadCompletionPromise = uploader.upload(blob);\n\n // Make small preview to show while uploading.\n imageScaled(blob, IMAGE_PREVIEW_DIM, IMAGE_PREVIEW_DIM, -1, false)\n // Convert tiny image into base64 for serialization and previewing.\n .then(scaled => blobToBase64(scaled.blob))\n .then(b64 => {\n let msg = Drafty.insertImage(null, 0, {\n mime: mime,\n _tempPreview: b64.bits, // This preview will not be serialized.\n bits: b64.bits, // Image thumbnail.\n width: width,\n height: height,\n filename: fname,\n size: blob.size,\n urlPromise: uploadCompletionPromise\n });\n if (caption) {\n msg = Drafty.appendLineBreak(msg);\n msg = Drafty.append(msg, Drafty.parse(caption));\n }\n // Pass data and the uploader to the TinodeWeb.\n this.sendMessage(msg, uploadCompletionPromise, uploader);\n })\n .catch(err => this.props.onError(err, 'err'));\n return;\n }\n\n // Send the image inband if it's not too big. The image has been scaled already\n // in image preview.\n blobToBase64(blob)\n .then(b64 => {\n let msg = Drafty.insertImage(null, 0, {\n mime: b64.mime,\n bits: b64.bits,\n width: width,\n height: height,\n filename: fname,\n size: blob.size\n });\n if (caption) {\n msg = Drafty.appendLineBreak(msg);\n msg = Drafty.append(msg, Drafty.parse(caption));\n }\n this.sendMessage(msg);\n });\n }\n\n // sendVideoAttachment sends the video bits as Drafty message.\n sendVideoAttachment(caption, videoBlob, previewBlob, params) {\n const width = params.width;\n const height = params.height;\n\n // Server-provided limit reduced for base64 encoding and overhead.\n const maxInbandAttachmentSize = (this.props.tinode.getServerParam('maxMessageSize',\n MAX_INBAND_ATTACHMENT_SIZE) * 0.75 - 1024) | 0;\n\n const uploads = [];\n let uploader;\n if ((videoBlob.size + previewBlob.size) > maxInbandAttachmentSize) {\n // One or both are too large to send inband. Uploading out of band and sending as a link.\n uploader = this.props.tinode.getLargeFileHelper();\n if (!uploader) {\n this.props.onError(this.props.intl.formatMessage(messages.cannot_initiate_upload));\n return;\n }\n\n uploads[0] = videoBlob.size > maxInbandAttachmentSize * 0.675 ? uploader.upload(videoBlob) : null;\n uploads[1] = previewBlob.size > maxInbandAttachmentSize * 0.275 ? uploader.upload(previewBlob) : null;\n }\n\n if (uploads.length == 0) {\n // Both video and preview are small enough to send inband.\n Promise.all([blobToBase64(videoBlob), blobToBase64(previewBlob)])\n .then(b64s => {\n const [v64, i64] = b64s;\n let msg = Drafty.insertVideo(null, 0, {\n mime: v64.mime,\n bits: v64.bits,\n preview: i64.bits,\n premime: i64.mime,\n width: width,\n height: height,\n duration: params.duration,\n filename: params.name,\n size: videoBlob.size\n });\n if (caption) {\n msg = Drafty.appendLineBreak(msg);\n msg = Drafty.append(msg, Drafty.parse(caption));\n }\n this.sendMessage(msg);\n });\n return;\n }\n\n const uploadCompletionPromise = Promise.all(uploads);\n\n const b64conv = [];\n // Small video converted to base64.\n b64conv[0] = uploads[0] ? null : blobToBase64(videoBlob);\n // Full-size preview fits inline.\n b64conv[1] = uploads[1] ? null : imageScaled(previewBlob, MAX_IMAGE_DIM, MAX_IMAGE_DIM, -1, false)\n .then(scaled => blobToBase64(scaled.blob));\n // Small preview to show while uploading.\n b64conv[2] = imageScaled(previewBlob, VIDEO_PREVIEW_DIM, VIDEO_PREVIEW_DIM, -1, false)\n .then(scaled => blobToBase64(scaled.blob));\n Promise.all(b64conv)\n // Convert tiny image into base64 for serialization and previewing.\n .then(b64s => {\n const [video, img, preview] = b64s;\n let msg = Drafty.insertVideo(null, 0, {\n mime: params.mime,\n bits: video ? video.bits : null,\n _tempPreview: preview.bits,\n preview: img ? img.bits : preview.bits,\n premime: img ? img.mime : preview.mime,\n width: width,\n height: height,\n duration: params.duration,\n filename: params.name,\n size: videoBlob.size,\n urlPromise: uploadCompletionPromise\n });\n if (caption) {\n msg = Drafty.appendLineBreak(msg);\n msg = Drafty.append(msg, Drafty.parse(caption));\n }\n // Pass data and the uploader to the TinodeWeb.\n this.sendMessage(msg, uploadCompletionPromise, uploader);\n })\n .catch(err => this.props.onError(err.message, 'err'));\n }\n\n // handleAttachImageOrVideo method is called when [Attach image or video] button is clicked: launch image or video preview.\n handleAttachImageOrVideo(file) {\n const maxExternAttachmentSize = this.props.tinode.getServerParam('maxFileUploadSize', MAX_EXTERN_ATTACHMENT_SIZE);\n\n if (file.type.startsWith('video/')) {\n this.setState({videoPreview: {\n url: URL.createObjectURL(file),\n blob: file,\n filename: file.name,\n size: file.size,\n mime: file.type\n }});\n return;\n }\n\n // Get image dimensions and size, optionally scale it down.\n imageScaled(file, MAX_IMAGE_DIM, MAX_IMAGE_DIM, maxExternAttachmentSize, false)\n .then(scaled => {\n this.setState({imagePreview: {\n url: URL.createObjectURL(scaled.blob),\n blob: scaled.blob,\n filename: scaled.name,\n width: scaled.width,\n height: scaled.height,\n size: scaled.blob.size,\n mime: scaled.mime\n }});\n }).catch(err => {\n this.props.onError(err.message, 'err');\n });\n }\n\n // handleFileDrop is called when the user drags & drops a file upon the message view.\n handleFileDrop(files) {\n if (!files || files.length == 0) {\n return;\n }\n const file = files[0];\n if (file.type && file.type.startsWith('image/')) {\n this.handleAttachImageOrVideo(file);\n } else {\n this.handleAttachFile(file);\n }\n }\n\n // sendAudioAttachment sends audio bits inband as Drafty message (no preview).\n sendAudioAttachment(url, preview, duration) {\n fetch(url)\n .then(result => result.blob())\n .then(blob => {\n // Server-provided limit reduced for base64 encoding and overhead.\n const maxInbandAttachmentSize = this.props.tinode.getServerParam('maxMessageSize', MAX_INBAND_ATTACHMENT_SIZE) * 0.75 - 1024;\n if (blob.size > maxInbandAttachmentSize) {\n // Too large to send inband - uploading out of band and sending as a link.\n const uploader = this.props.tinode.getLargeFileHelper();\n if (!uploader) {\n this.props.onError(this.props.intl.formatMessage(messages.cannot_initiate_upload));\n return;\n }\n const uploadCompletionPromise = uploader.upload(blob);\n const msg = Drafty.appendAudio(null, {\n mime: blob.type,\n size: blob.size,\n duration: duration,\n preview: preview,\n urlPromise: uploadCompletionPromise\n });\n // Pass data and the uploader to the TinodeWeb.\n this.sendMessage(msg, uploadCompletionPromise, uploader);\n } else {\n // Small enough to send inband.\n blobToBase64(blob)\n .then(b64 => {\n this.sendMessage(Drafty.appendAudio(null, {\n mime: b64.mime,\n bits: b64.bits,\n size: blob.size,\n duration: duration,\n preview: preview,\n }))\n })\n }\n })\n .catch(err => {this.props.onError(err.message, 'err')});;\n }\n\n handleCancelUpload(seq, uploader) {\n const topic = this.props.tinode.getTopic(this.state.topic);\n const found = topic.findMessage(seq);\n if (found) {\n found._cancelled = true;\n }\n uploader.cancel();\n }\n\n // seq: seq ID of the source message\n // context: message content.\n // senderId: UID of the sender of the source message.\n // senderName: full name of the sender of the original message.\n handlePickReply(seq, content, senderId, senderName) {\n if (!seq || !content) {\n this.setState({reply: null});\n return;\n }\n\n content = typeof content == 'string' ? Drafty.init(content) : content;\n if (Drafty.isValid(content)) {\n content = Drafty.replyContent(content, QUOTED_REPLY_LENGTH);\n } else {\n // /!\\ invalid content.\n content = Drafty.append(Drafty.init('\\u26A0 '),\n Drafty.wrapInto(this.props.intl.formatMessage(messages.invalid_content), 'EM'));\n }\n\n this.setState({\n reply: {\n content: Drafty.quote(senderName, senderId, content),\n seq: seq\n }\n });\n this.props.onCancelForwardMessage();\n }\n\n // seq: seq ID of the message to edit.\n // context: message content.\n handleEditMessage(seq, content) {\n if (!seq || !content) {\n this.setState({reply: null});\n return;\n }\n\n content = typeof content == 'string' ? Drafty.init(content) : content;\n const editable = Drafty.toMarkdown(content);\n if (Drafty.isValid(content)) {\n content = Drafty.replyContent(content, EDIT_PREVIEW_LENGTH);\n } else {\n // /!\\ invalid content.\n content = Drafty.append(Drafty.init('\\u26A0 '),\n Drafty.wrapInto(this.props.intl.formatMessage(messages.invalid_content), 'EM'));\n }\n\n this.setState({\n reply: {\n content: Drafty.quote(this.props.intl.formatMessage(messages.editing_message), null, content),\n seq: seq,\n editing: true\n },\n contentToEdit: editable\n });\n this.props.onCancelForwardMessage();\n }\n\n\n handleCancelReply() {\n this.setState({reply: null, contentToEdit: null});\n this.props.onCancelForwardMessage();\n }\n\n handleQuoteClick(replyToSeq) {\n const ref = this.getOrCreateMessageRef(replyToSeq);\n if (ref && ref.current) {\n ref.current.scrollIntoView({block: \"center\", behavior: \"smooth\"});\n ref.current.classList.add('flash');\n setTimeout(_ => {ref.current.classList.remove('flash')} , 1000);\n } else {\n console.error(\"Unresolved message ref\", replyToSeq);\n }\n }\n\n isDragEnabled() {\n return this.state.isWriter && !this.state.unconfirmed && !this.props.forwardMessage && !this.state.peerMessagingDisabled;\n }\n\n handleDrag(e) {\n e.preventDefault();\n e.stopPropagation();\n }\n\n handleDragIn(e) {\n e.preventDefault();\n e.stopPropagation();\n this.dragCounter++;\n if (e.dataTransfer.items && e.dataTransfer.items.length > 0) {\n this.setState({dragging: true});\n }\n }\n\n handleDragOut(e) {\n e.preventDefault();\n e.stopPropagation();\n this.dragCounter--;\n if (this.dragCounter <= 0) {\n this.setState({dragging: false});\n }\n }\n\n handleDrop(e) {\n e.preventDefault();\n e.stopPropagation();\n this.setState({dragging: false});\n if (this.isDragEnabled() && e.dataTransfer.files && e.dataTransfer.files.length > 0) {\n this.handleFileDrop(e.dataTransfer.files);\n e.dataTransfer.clearData();\n this.dragCounter = 0;\n }\n }\n\n render() {\n const {formatMessage} = this.props.intl;\n\n let component;\n if (this.props.hideSelf) {\n component = null;\n } else if (!this.state.topic) {\n component = (\n \n );\n } else {\n let component2;\n if (this.state.imagePreview) {\n // Preview image before sending.\n component2 = (\n \n );\n } else if (this.state.videoPreview) {\n // Preview video.\n component2 = (\n \n );\n } else if (this.state.imagePostview) {\n // Expand received image.\n component2 = (\n \n );\n } else if (this.state.videoPostview) {\n // Play received video.\n component2 = (\n \n );\n } else if (this.state.docPreview) {\n // Preview attachment before sending.\n component2 = (\n \n );\n } else if (this.state.rtcPanel) {\n component2 = (\n \n );\n } else {\n const topic = this.props.tinode.getTopic(this.state.topic);\n const isChannel = topic.isChannelType();\n const groupTopic = topic.isGroupType() && !isChannel;\n const icon_badges = [];\n if (topic.trusted) {\n if (topic.trusted.verified) {\n icon_badges.push({icon: 'verified', color: 'badge-inv'});\n }\n if (topic.trusted.staff) {\n icon_badges.push({icon: 'staff', color: 'badge-inv'});\n }\n if (topic.trusted.danger) {\n icon_badges.push({icon: 'dangerous', color: 'badge-inv'});\n }\n }\n\n const messageNodes = [];\n let previousFrom = null;\n let prevDate = null;\n let chatBoxClass = null;\n topic.messages((msg, prev, next, i) => {\n let nextFrom = next ? (next.from || 'chan') : null;\n\n let sequence = 'single';\n let thisFrom = msg.from || 'chan';\n if (thisFrom == previousFrom) {\n if (thisFrom == nextFrom) {\n sequence = 'middle';\n } else {\n sequence = 'last';\n }\n } else if (thisFrom == nextFrom) {\n sequence = 'first';\n }\n previousFrom = thisFrom;\n\n const isReply = !(thisFrom == this.props.myUserId);\n const deliveryStatus = topic.msgStatus(msg, true);\n\n let userFrom = thisFrom, userName, userAvatar;\n const user = topic.userDesc(thisFrom);\n if (user && user.public) {\n userName = user.public.fn;\n userAvatar = makeImageUrl(user.public.photo);\n }\n chatBoxClass = groupTopic ? 'chat-box group' : 'chat-box';\n\n // Ref for this chat message.\n const ref = this.getOrCreateMessageRef(msg.seq);\n let replyToSeq = msg.head ? parseInt(msg.head.reply) : null;\n if (!replyToSeq || isNaN(replyToSeq)) {\n replyToSeq = null;\n }\n\n if (msg.hi) {\n // Deleted message.\n messageNodes.push(\n \n );\n } else {\n const thisDate = new Date(msg.ts);\n // This message was sent on a different date than the previous.\n if (!prevDate || prevDate.toDateString() != thisDate.toDateString()) {\n messageNodes.push(\n \n );\n prevDate = thisDate;\n }\n messageNodes.push(\n \n );\n }\n });\n\n let lastSeen = null;\n if (isChannel) {\n lastSeen = formatMessage(messages.channel);\n } else {\n const cont = this.props.tinode.getMeTopic().getContact(this.state.topic);\n if (cont && Tinode.isP2PTopicName(cont.topic)) {\n if (cont.online) {\n lastSeen = formatMessage(messages.online_now);\n } else if (cont.seen) {\n lastSeen = formatMessage(messages.last_seen) + \": \" +\n shortDateFormat(cont.seen.when, this.props.intl.locale);\n // TODO: also handle user agent in c.seen.ua\n }\n }\n }\n const avatar = this.state.avatar || true;\n const online = this.state.deleted ? null :\n this.props.online ? 'online' + (this.state.typingIndicator ? ' typing' : '') : 'offline';\n\n const titleClass = 'panel-title' + (this.state.deleted ? ' deleted' : '');\n\n let messagesComponent = (\n <>\n \n
\n arrow_downward \n \n
\n {!this.state.isReader ?\n
\n {this.state.readingBlocked ?\n
\n \n
\n : null }\n
\n : null }\n
\n {this.state.peerMessagingDisabled && !this.state.unconfirmed ?\n : null}\n {this.state.unconfirmed ?\n \n :\n }\n >\n );\n\n component2 = (\n <>\n \n {this.props.displayMobile ?\n \n : null}\n \n {messagesComponent}\n {this.state.dragging && this.isDragEnabled() ?\n {formatMessage(messages.drag_file)}
\n : null}\n >\n );\n }\n component = {component2}
\n }\n return component;\n }\n};\n\nexport default injectIntl(MessagesView);\n","// The <- button to be displayed in title bars.\nimport React from 'react';\n\nexport default class ButtonBack extends React.PureComponent {\n render() {\n return (\n {e.preventDefault(); this.props.onBack();}}>\n arrow_back \n \n );\n }\n}\n","import React from 'react';\n\nexport default class MenuContacts extends React.PureComponent {\n render() {\n return (\n \n );\n }\n};\n","import React from 'react';\n\nexport default class MenuStart extends React.PureComponent {\n render() {\n return (\n \n );\n }\n};\n","import React from 'react';\n\nimport LetterTile from './letter-tile.jsx';\nimport ButtonBack from './button-back.jsx';\nimport ContactBadges from './contact-badges.jsx';\nimport MenuContacts from './menu-contacts.jsx';\nimport MenuStart from './menu-start.jsx';\n\nimport { sanitizeUrlForMime } from '../lib/utils.js';\n\nexport default class SideNavbar extends React.PureComponent {\n render() {\n const icon_badges = [];\n if (this.props.trustedBadges) {\n this.props.trustedBadges.map((b) => {\n icon_badges.push({icon: b, color: 'badge-inv'});\n });\n }\n let avatar = null;\n if (this.props.tinode) {\n avatar = this.props.tinode.authorizeURL(sanitizeUrlForMime(this.props.avatar, 'image'));\n }\n return (\n \n {this.props.onCancel ?
: null}\n {avatar ?\n
\n \n
\n :\n null}\n
{this.props.title}
\n {this.props.state === 'login' ?\n
:\n this.props.state === 'contacts' ?\n
:\n null}\n
\n );\n }\n};\n","// Edit account parameters.\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport AvatarUpload from '../widgets/avatar-upload.jsx';\nimport BadgeList from '../widgets/badge-list.jsx';\n\nimport { makeImageUrl } from '../lib/blob-helpers.js';\nimport { MAX_TITLE_LENGTH, MAX_TOPIC_DESCRIPTION_LENGTH } from '../config.js';\n\nfunction _clip(str, length) {\n return str && str.substring(0, length);\n}\n\nexport default class AccountSettingsView extends React.Component {\n constructor(props) {\n super(props);\n\n const me = this.props.tinode.getMeTopic();\n this.state = {\n fullName: _clip(me.public ? me.public.fn : undefined, MAX_TITLE_LENGTH),\n description: _clip(me.public ? me.public.note : undefined, MAX_TOPIC_DESCRIPTION_LENGTH),\n avatar: makeImageUrl(me.public ? me.public.photo : null)\n };\n }\n\n render() {\n return (\n \n );\n }\n};\n","/* ContactsView holds all contacts-related stuff */\nimport React from 'react';\nimport { FormattedMessage, defineMessages } from 'react-intl';\n\nimport ContactList from '../widgets/contact-list.jsx';\n\nimport { updateFavicon } from '../lib/utils.js';\n\nconst messages = defineMessages({\n archived_contacts_title: {\n id: \"archived_contacts\",\n defaultMessage: \"Archived contacts ({count})\",\n description: \"Label for archived chats\"\n }\n});\n\nexport default class ContactsView extends React.Component {\n constructor(props) {\n super(props);\n\n this.handleAction = this.handleAction.bind(this);\n\n this.state = ContactsView.deriveStateFromProps(props);\n }\n\n static deriveStateFromProps(props) {\n const contacts = [];\n let unreadThreads = 0;\n let archivedCount = 0;\n props.chatList.map((c) => {\n const blocked = c.acs && !c.acs.isJoiner();\n // Show only blocked contacts only when props.blocked == true.\n if (blocked && props.blocked) {\n contacts.push(c);\n }\n if (blocked || props.blocked) {\n return;\n }\n\n if (c.private && c.private.arch) {\n if (props.archive) {\n contacts.push(c);\n } else {\n archivedCount ++;\n }\n } else if (!props.archive) {\n contacts.push(c);\n unreadThreads += c.unread > 0 ? 1 : 0;\n }\n });\n\n contacts.sort((a, b) => {\n return (b.touched || 0) - (a.touched || 0);\n });\n\n if (archivedCount > 0) {\n contacts.push({\n action: 'archive',\n title: messages.archived_contacts_title,\n values: {count: archivedCount}\n });\n }\n\n return {\n contactList: contacts,\n unreadThreads: unreadThreads\n };\n }\n\n componentDidUpdate(prevProps, prevState) {\n if (prevProps.chatList != this.props.chatList ||\n prevProps.archive != this.props.archive ||\n prevProps.blocked != this.props.blocked) {\n const newState = ContactsView.deriveStateFromProps(this.props);\n this.setState(newState);\n if (newState.unreadThreads != prevState.unreadThreads) {\n updateFavicon(newState.unreadThreads);\n }\n }\n }\n\n handleAction(action_ignored) {\n this.props.onShowArchive();\n }\n\n render() {\n return (\n ¯∖_(ツ)_/¯\"\n description=\"HTML message shown in ContactList when no contacts are found\">{\n (no_contacts) => \n } \n );\n }\n};\n","// Helper functions for storing values in localStorage.\n// By default localStorage can store only strings, not objects or other types.\n\nexport default class LocalStorageUtil {\n // Replace old object with the new one.\n static setObject(key, value) {\n localStorage.setItem(key, JSON.stringify(value));\n }\n\n // Get stored object.\n static getObject(key) {\n const value = localStorage.getItem(key);\n return value && JSON.parse(value);\n }\n\n // Partially or wholly update stored object.\n static updateObject(key, value) {\n const oldVal = this.getObject(key);\n this.setObject(key, Object.assign(oldVal || {}, value));\n }\n\n // Just a wrapper.\n static removeItem(key) {\n localStorage.removeItem(key);\n }\n}\n","// Account registration.\nimport React, { Suspense } from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport AvatarCrop from '../widgets/avatar-crop.jsx';\nimport AvatarUpload from '../widgets/avatar-upload.jsx';\nimport CheckBox from '../widgets/checkbox.jsx';\nconst PhoneEdit = React.lazy(_ => import('../widgets/phone-edit.jsx'));\nimport VisiblePassword from '../widgets/visible-password.jsx';\n\nimport LocalStorageUtil from '../lib/local-storage.js';\nimport { imageScaled, blobToBase64, makeImageUrl } from '../lib/blob-helpers.js';\nimport { theCard } from '../lib/utils.js';\n\nimport { AVATAR_SIZE, MAX_AVATAR_BYTES, MAX_EXTERN_ATTACHMENT_SIZE,\n MAX_TITLE_LENGTH } from '../config.js';\n\nexport default class CreateAccountView extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.state = {\n login: '',\n password: '',\n meth: '',\n email: '',\n tel: '',\n fn: '', // full/formatted name\n imageUrl: null,\n uploadUrl: null,\n newAvatar: null,\n newAvatarMime: null,\n errorCleared: false,\n buttonDisabled: false,\n saveToken: LocalStorageUtil.getObject('keep-logged-in')\n };\n\n this.handleLoginChange = this.handleLoginChange.bind(this);\n this.handlePasswordChange = this.handlePasswordChange.bind(this);\n this.handleEmailChange = this.handleEmailChange.bind(this);\n this.handlePhoneChange = this.handlePhoneChange.bind(this);\n this.handleFnChange = this.handleFnChange.bind(this);\n this.handleImageChanged = this.handleImageChanged.bind(this);\n this.handleToggleSaveToken = this.handleToggleSaveToken.bind(this);\n this.handleAvatarCropped = this.handleAvatarCropped.bind(this);\n this.handleAvatarCropCancel = this.handleAvatarCropCancel.bind(this);\n this.uploadAvatar = this.uploadAvatar.bind(this);\n this.handleSubmit = this.handleSubmit.bind(this);\n\n // Connection will trigger change by changing the this.props.serverVersion.\n props.tinode.connect()\n .catch(err => {\n this.props.onError(err.message, 'err');\n });\n }\n\n handleLoginChange(e) {\n this.setState({login: e.target.value});\n }\n\n handlePasswordChange(password) {\n this.setState({password: password});\n }\n\n handleEmailChange(e) {\n this.setState({meth: 'email', email: e.target.value});\n }\n\n handlePhoneChange(number) {\n this.setState({meth: 'tel', tel: number});\n }\n\n handleFnChange(e) {\n this.setState({fn: e.target.value});\n }\n\n handleImageChanged(mime, img) {\n this.setState({newAvatar: img, newAvatarMime: mime});\n }\n\n handleToggleSaveToken() {\n LocalStorageUtil.setObject('keep-logged-in', !this.state.saveToken);\n this.setState({saveToken: !this.state.saveToken});\n }\n\n handleSubmit(e) {\n e.preventDefault();\n this.setState({errorCleared: false});\n this.props.onCreateAccount(\n this.state.login.trim(),\n this.state.password.trim(),\n theCard(this.state.fn.trim().substring(0, MAX_TITLE_LENGTH), this.state.uploadUrl),\n {\n 'meth': this.state.meth,\n 'val': this.state.meth == 'email' ?\n this.state.email :\n this.state.meth == 'tel' ? this.state.tel : null\n }\n );\n }\n\n // AvatarCropView calls this method when the user has cropped the image.\n handleAvatarCropped(mime, blob, width, height) {\n const url = blob ? URL.createObjectURL(blob) : null;\n this.setState({avatar: url, newAvatar: null, newAvatarMime: null});\n if (blob) {\n this.uploadAvatar(mime, blob, width, height);\n }\n }\n\n handleAvatarCropCancel() {\n this.setState({newAvatar: null, newAvatarMime: null});\n }\n\n // Utility method for converting cropped avatar blob to bytes for sending inband or\n // for uploading it to the server out of band.\n uploadAvatar(mime, blob, width, height) {\n const readyToUpload = image => {\n let {mime, blob} = image;\n this.setState({imageUrl: URL.createObjectURL(blob), buttonDisabled: true});\n if (blob.size > MAX_AVATAR_BYTES) {\n // Too large to send inband - uploading out of band and sending as a link.\n const uploader = this.props.tinode.getLargeFileHelper();\n uploader.upload(blob, 'newacc')\n .then(url => this.setState({uploadUrl: url}))\n .catch(err => this.props.onError(err.message, 'err'))\n .finally(_ => this.setState({buttonDisabled: false}));\n } else {\n // Convert blob to base64-encoded bits.\n blobToBase64(blob)\n .then(b64 => this.setState({uploadUrl: makeImageUrl({data: b64.bits, type: mime})}))\n .finally(_ => this.setState({buttonDisabled: false}));\n }\n };\n\n if (width > AVATAR_SIZE || height > AVATAR_SIZE || width != height) {\n // Avatar is not square or too large even after cropping. Shrink it and make square.\n imageScaled(blob, AVATAR_SIZE, AVATAR_SIZE, MAX_EXTERN_ATTACHMENT_SIZE, true)\n .then(scaled => readyToUpload(scaled))\n .catch(err => this.props.onError(err.message, 'err'));\n } else {\n readyToUpload({mime: mime, blob: blob, width: width, height: height});\n }\n }\n\n render() {\n // \"reqCred\":{\"auth\":[\"email\"]}\n const method = (this.props.tinode.getServerParam('reqCred', {}).auth || [])[0] || 'email';\n\n if (this.state.newAvatar) {\n return (\n \n );\n }\n\n let submitClasses = 'primary';\n if (this.props.disabled) {\n submitClasses += ' disabled';\n }\n\n return (\n \n );\n }\n};\n","// Edit account parameters.\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport CheckBox from '../widgets/checkbox.jsx';\n\nexport default class EditAccountView extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.handleCheckboxClick = this.handleCheckboxClick.bind(this);\n }\n\n handleCheckboxClick(what, checked) {\n if (what == 'sound') {\n this.props.onToggleMessageSounds(checked);\n } else if (what == 'alert') {\n this.props.onTogglePushNotifications(checked);\n } else if (what == 'incognito') {\n this.props.onToggleIncognitoMode(checked);\n }\n }\n\n render() {\n return (\n \n
\n \n \n \n \n
\n
\n \n {this.props.desktopAlertsEnabled ?\n \n :\n \n }\n \n \n
\n
\n \n \n \n \n
\n
\n );\n }\n};\n","// Edit account parameters.\nimport React from 'react';\nimport { FormattedMessage, defineMessages, injectIntl } from 'react-intl';\n\nimport InPlaceEdit from '../widgets/in-place-edit.jsx';\nimport PermissionsEditor from '../widgets/permissions-editor.jsx';\n\nconst messages = defineMessages({\n delete_account: {\n id: 'delete_account',\n defaultMessage: 'Delete account',\n description: 'Title for delete account warning'\n },\n delete_account_warning: {\n id: 'delete_account_warning',\n defaultMessage: 'Are you sure you want to delete your account? It cannot be undone.',\n description: 'Warning message when deleting an account'\n }\n});\n\nclass AccSecurityView extends React.Component {\n constructor(props) {\n super(props);\n\n const me = this.props.tinode.getMeTopic();\n let blockedCount = 0;\n me.contacts((c) => {\n if (c.acs && !c.acs.isJoiner()) {\n blockedCount ++;\n }\n });\n const defacs = me.getDefaultAccess();\n this.state = {\n auth: defacs ? defacs.auth : null,\n anon: defacs ? defacs.anon : null,\n showPermissionEditorFor: undefined,\n blockedCount: blockedCount,\n };\n\n this.handlePasswordUpdate = this.handlePasswordUpdate.bind(this);\n this.handleLaunchPermissionsEditor = this.handleLaunchPermissionsEditor.bind(this);\n this.handleHidePermissionsEditor = this.handleHidePermissionsEditor.bind(this);\n this.handlePermissionsChanged = this.handlePermissionsChanged.bind(this);\n this.handleDeleteAccount = this.handleDeleteAccount.bind(this);\n }\n\n handlePasswordUpdate(pwd) {\n this.setState({password: pwd});\n this.props.onUpdatePassword(pwd);\n }\n\n handleLaunchPermissionsEditor(which) {\n this.setState({\n showPermissionEditorFor: which,\n editedPermissions: this.state[which]\n });\n }\n\n handleHidePermissionsEditor() {\n this.setState({showPermissionEditorFor: undefined});\n }\n\n handlePermissionsChanged(perm) {\n let defacs = {};\n defacs[this.state.showPermissionEditorFor] = perm;\n this.props.onUpdateAccountDesc('me', undefined, undefined, defacs);\n\n let newState = {showPermissionEditorFor: undefined};\n newState[this.state.showPermissionEditorFor] = perm;\n this.setState(newState);\n }\n\n handleDeleteAccount(e) {\n e.preventDefault();\n const {formatMessage} = this.props.intl;\n this.props.onShowAlert(\n formatMessage(messages.delete_account), // title\n formatMessage(messages.delete_account_warning), // content\n (_ => this.props.onDeleteAccount()), // onConfirm\n null, // use default text \"OK\"\n true, // Show Reject button\n null // use default text \"Cancel\"\n );\n }\n\n render() {\n return (\n <>{this.state.showPermissionEditorFor ?\n \n :\n \n
\n
\n \n \n
\n {\n (password_unchanged) => \n } \n
\n
\n
\n
\n
\n
\n
\n \n \n \n
\n
\n
Auth: {this.state.auth}
\n
Anon: {this.state.anon}
\n
\n
\n {this.state.blockedCount > 0 ?\n <>\n
\n
\n >\n : null }\n
\n }>\n );\n }\n};\n\nexport default injectIntl(AccSecurityView);\n","// Edit account parameters.\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport { Tinode } from 'tinode-sdk';\n\nimport { APP_NAME, LINK_CONTACT_US, LINK_PRIVACY_POLICY, LINK_TERMS_OF_SERVICE } from '../config.js';\n\nexport default class AccSupportView extends React.PureComponent {\n render() {\n return (\n \n
\n
\n
\n
\n \n {APP_NAME}\n
\n
\n \n {Tinode.getLibrary()}\n
\n
\n \n {this.props.serverVersion}\n
\n
\n \n {this.props.serverAddress}\n
\n
\n
\n );\n }\n};\n","// Login form.\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport CheckBox from '../widgets/checkbox.jsx';\nimport VisiblePassword from '../widgets/visible-password.jsx';\n\nexport default class LoginView extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = {\n login: props.login,\n password: '',\n hostName: props.serverAddress,\n saveToken: props.persist\n };\n this.handleLoginChange = this.handleLoginChange.bind(this);\n this.handlePasswordChange = this.handlePasswordChange.bind(this);\n this.handleToggleSaveToken = this.handleToggleSaveToken.bind(this);\n this.handleSubmit = this.handleSubmit.bind(this);\n }\n\n handleLoginChange(e) {\n this.setState({login: e.target.value});\n }\n\n handlePasswordChange(e) {\n this.setState({password: e.target.value});\n }\n\n handleToggleSaveToken() {\n this.props.onPersistenceChange(!this.state.saveToken);\n this.setState({saveToken: !this.state.saveToken});\n }\n\n handleSubmit(e) {\n e.preventDefault();\n this.props.onLogin(this.state.login.trim(), this.state.password.trim());\n }\n\n render() {\n let submitClasses = 'primary';\n if (this.props.disabled) {\n submitClasses += ' disabled';\n }\n\n return (\n \n );\n }\n};\n","import React from 'react';\nimport { FormattedMessage, defineMessages, injectIntl } from 'react-intl';\n\nconst messages = defineMessages({\n invalid_id: {\n id: 'error_invalid_id',\n defaultMessage: 'Invalid ID',\n description: 'Error message'\n }\n});\n\nclass NewTopicById extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.state = {\n groupId: '',\n };\n\n this.handleChange = this.handleChange.bind(this);\n this.handleKeyPress = this.handleKeyPress.bind(this);\n this.handleSubmit = this.handleSubmit.bind(this);\n }\n\n handleChange(e) {\n this.setState({groupId: e.target.value});\n }\n\n handleKeyPress(e) {\n if (e.key === 'Enter') {\n this.handleSubmit(e);\n }\n }\n\n handleSubmit(e) {\n e.preventDefault();\n if (this.state.groupId) {\n const name = this.state.groupId.trim();\n const prefix = name.substr(0, 3);\n if (name.length > 3 && ['usr', 'grp', 'chn'].includes(prefix)) {\n this.props.onSubmit(name);\n } else {\n this.props.onError(this.props.intl.formatMessage(messages.invalid_id), 'err');\n }\n }\n }\n\n render() {\n return (\n \n
\n {\n (prompt) => \n } \n
\n
\n \n \n \n
\n
\n );\n }\n};\n\nexport default injectIntl(NewTopicById);\n","import React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport AvatarCrop from './avatar-crop.jsx';\nimport AvatarUpload from './avatar-upload.jsx';\nimport CheckBox from './checkbox.jsx';\nimport TagManager from './tag-manager.jsx';\n\nimport { AVATAR_SIZE, MAX_AVATAR_BYTES, MAX_EXTERN_ATTACHMENT_SIZE, MAX_TITLE_LENGTH,\n MAX_TOPIC_DESCRIPTION_LENGTH } from '../config.js';\nimport { imageScaled, blobToBase64, makeImageUrl } from '../lib/blob-helpers.js';\n\nexport default class NewTopicGroup extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.fullName = React.createRef();\n\n this.state = {\n fullName: '', // full/formatted name\n private: '',\n description: '',\n imageUrl: null,\n tags: [],\n isChannel: false,\n newAvatar: null,\n newAvatarMime: null\n };\n\n this.handleFieldEdit = this.handleFieldEdit.bind(this);\n this.handleImageChanged = this.handleImageChanged.bind(this);\n this.handleAvatarCropped = this.handleAvatarCropped.bind(this);\n this.handleAvatarCropCancel = this.handleAvatarCropCancel.bind(this);\n this.uploadAvatar = this.uploadAvatar.bind(this);\n this.handleTagsChanged = this.handleTagsChanged.bind(this);\n this.handleChannelToggle = this.handleChannelToggle.bind(this);\n this.handleSubmit = this.handleSubmit.bind(this);\n }\n\n componentDidMount() {\n // this.fullName.current.focus();\n }\n\n handleFieldEdit(name, e) {\n this.setState({[name]: e.target.value || ''});\n }\n\n handleImageChanged(mime, img) {\n this.setState({newAvatar: img, newAvatarMime: mime});\n }\n\n handleAvatarCropped(mime, blob, width, height) {\n const url = blob ? URL.createObjectURL(blob) : null;\n this.setState({imageUrl: url, newAvatar: null, newAvatarMime: null});\n if (blob) {\n this.uploadAvatar(mime, blob, width, height);\n }\n }\n\n handleAvatarCropCancel() {\n this.setState({newAvatar: null, newAvatarMime: null});\n }\n\n // Utility method for converting cropped avatar blob to bytes for sending inband or\n // for uploading it to the server out of band.\n uploadAvatar(mime, blob, width, height) {\n const readyToUpload = image => {\n let {mime, blob} = image;\n if (blob.size > MAX_AVATAR_BYTES) {\n // Too large to send inband - uploading out of band and sending as a link.\n const uploader = this.props.tinode.getLargeFileHelper();\n uploader.upload(blob)\n .then(url => this.setState({imageUrl: url}))\n .catch(err => this.props.onError(err.message, 'err'));\n } else {\n // Convert blob to base64-encoded bits.\n blobToBase64(blob)\n .then(b64 => this.setState({imageUrl: makeImageUrl({data: b64.bits, type: mime})}));\n }\n };\n\n if (width > AVATAR_SIZE || height > AVATAR_SIZE || width != height) {\n // Avatar is not square or too large even after cropping. Shrink it and make square.\n imageScaled(blob, AVATAR_SIZE, AVATAR_SIZE, MAX_EXTERN_ATTACHMENT_SIZE, true)\n .then(scaled => readyToUpload(scaled))\n .catch(err => this.props.onError(err.message, 'err'));\n } else {\n readyToUpload({mime: mime, blob: blob, width: width, height: height});\n }\n }\n\n handleTagsChanged(tags) {\n this.setState({tags: tags});\n }\n\n handleChannelToggle() {\n this.setState({isChannel: !this.state.isChannel});\n }\n\n handleSubmit(e) {\n e.preventDefault();\n\n const fn = this.state.fullName.trim().substring(0, MAX_TITLE_LENGTH);\n const comment = this.state.private.trim().substring(0, MAX_TITLE_LENGTH);\n const description = this.state.description.trim().substring(0, MAX_TOPIC_DESCRIPTION_LENGTH);\n if (fn) {\n this.props.onSubmit(fn, description, this.state.imageUrl, comment, this.state.tags, this.state.isChannel);\n }\n }\n\n render() {\n if (this.state.newAvatar) {\n return (\n \n );\n }\n\n let submitClasses = 'primary';\n if (this.props.disabled) {\n submitClasses += ' disabled';\n }\n return (\n \n );\n }\n};\n","// Create new topic and invite users or send an invite.\nimport React from 'react';\nimport { FormattedMessage, defineMessages, injectIntl } from 'react-intl';\n\nimport { Tinode } from 'tinode-sdk';\n\nimport ContactList from '../widgets/contact-list.jsx';\nimport NewTopicById from '../widgets/new-topic-by-id.jsx';\nimport NewTopicGroup from '../widgets/new-topic-group.jsx';\nimport SearchContacts from '../widgets/search-contacts.jsx';\n\nimport HashNavigation from '../lib/navigation.js';\nimport { theCard } from '../lib/utils.js';\n\nconst messages = defineMessages({\n search_for_contacts: {\n id: \"search_for_contacts\",\n defaultMessage: \"Use search to find contacts\",\n description: \"Text shown in contacts view when user entered no search query.\"\n },\n search_no_results: {\n id: \"search_no_results\",\n defaultMessage: \"Search returned no results\",\n description: \"Text shown in contacts view when query returned no results.\"\n },\n search_placeholder: {\n id: \"search_placeholder\",\n defaultMessage: \"List like email:alice@example.com, tel:17025550003...\",\n description: \"Placeholder in contacts search field\"\n },\n});\n\nclass NewTopicView extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = {\n tabSelected: 'find',\n searchQuery: null\n };\n\n this.handleTabClick = this.handleTabClick.bind(this);\n this.handleSearchContacts = this.handleSearchContacts.bind(this);\n this.handleSearchResultSelected = this.handleSearchResultSelected.bind(this);\n this.handleNewGroupSubmit = this.handleNewGroupSubmit.bind(this);\n this.handleGroupByID = this.handleGroupByID.bind(this);\n }\n\n componentDidMount() {\n this.props.onInitFind();\n }\n\n handleTabClick(e) {\n e.preventDefault();\n HashNavigation.navigateTo(HashNavigation.addUrlParam(window.location.hash, 'tab', e.currentTarget.dataset.id));\n this.setState({tabSelected: e.currentTarget.dataset.id});\n }\n\n handleSearchContacts(query) {\n this.props.onSearchContacts(query);\n this.setState({searchQuery: Tinode.isNullValue(query) ? null : query});\n }\n\n handleSearchResultSelected(name) {\n if (this.state.tabSelected == 'find') {\n HashNavigation.navigateTo(HashNavigation.removeUrlParam(window.location.hash, 'tab'));\n this.props.onCreateTopic(name);\n }\n }\n\n handleNewGroupSubmit(name, description, dataUrl, priv, tags, isChannel) {\n HashNavigation.navigateTo(HashNavigation.removeUrlParam(window.location.hash, 'tab'));\n this.props.onCreateTopic(undefined,\n {public: theCard(name, dataUrl, null, description), private: priv, tags: tags}, isChannel);\n }\n\n handleGroupByID(topicName) {\n HashNavigation.navigateTo(HashNavigation.removeUrlParam(window.location.hash, 'tab'));\n this.props.onCreateTopic(topicName);\n }\n\n render() {\n const {formatMessage} = this.props.intl;\n const no_contacts_placeholder = formatMessage(this.state.searchQuery ?\n messages.search_no_results : messages.search_for_contacts);\n const search_placeholder = formatMessage(messages.search_placeholder);\n return (\n \n
\n {this.state.tabSelected === 'grp' ?\n
:\n this.state.tabSelected === 'byid' ?\n
:\n
\n \n \n
}\n
\n );\n }\n};\n\nexport default injectIntl(NewTopicView);\n","// A password reset form.\nimport React, { Suspense } from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nconst PhoneEdit = React.lazy(_ => import('../widgets/phone-edit.jsx'));\nimport VisiblePassword from '../widgets/visible-password.jsx';\n\nimport HashNavigation from '../lib/navigation.js';\n\nexport default class PasswordResetView extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.state = {\n tel: '',\n email: '',\n password: '',\n sent: false,\n haveCode: false,\n code: ''\n };\n\n this.handleSubmit = this.handleSubmit.bind(this);\n this.handleEmailChange = this.handleEmailChange.bind(this);\n this.handlePasswordChange = this.handlePasswordChange.bind(this);\n this.handleCodeChange = this.handleCodeChange.bind(this);\n this.handleShowCodeField = this.handleShowCodeField.bind(this);\n\n // Connection will trigger change by changing the this.props.serverVersion.\n props.tinode.connect()\n .catch(err => {\n this.props.onError(err.message, 'err');\n });\n }\n\n componentDidMount() {\n const parsed = HashNavigation.parseUrlHash(window.location.hash);\n this.setState({token: parsed.params.token, scheme: parsed.params.scheme});\n }\n\n handleSubmit(e) {\n e.preventDefault();\n if (this.state.token) {\n // Reset using token.\n this.props.onReset(this.state.password.trim(), {\n scheme: 'token',\n token: this.state.token\n });\n } else if (this.state.code && this.method) {\n // Reset using security code.\n // The secret is structured as ::, \"123456:email:alice@example.com\".\n const cred = this.state.email.trim() || this.state.tel.trim();\n this.props.onReset(this.state.password.trim(), {\n scheme: 'code',\n secret: `${this.state.code}:${this.method}:${cred}`\n });\n } else {\n const email = this.state.email.trim();\n const tel = this.state.tel.trim();\n this.setState({email: email, tel: tel});\n this.props.onRequest(this.method, email || tel).then(_ => this.setState({sent: true}));\n }\n }\n\n handleEmailChange(e) {\n this.setState({email: e.target.value});\n }\n\n handlePasswordChange(e) {\n this.setState({password: e.target.value});\n }\n\n handleCodeChange(e) {\n this.setState({code: e.target.value.replace(/[^\\d]/g, '')});\n }\n\n handleShowCodeField(e) {\n e.preventDefault();\n this.setState({haveCode: true});\n }\n\n render() {\n // \"reqCred\":{\"auth\":[\"email\"]}\n this.method = (this.props.tinode.getServerParam('reqCred', {}).auth || [])[0] || 'email';\n\n const showCredentialInput = !(this.state.token && this.state.scheme);\n const showPasswordInput = !showCredentialInput || this.state.haveCode || this.state.sent;\n\n const passwordInput = (<>\n \n \n \n {\n (placeholder) => \n } \n >);\n\n const emailInput = (<>\n {this.state.haveCode ?\n null :\n \n \n \n }\n {\n (placeholder) => \n } \n >);\n\n const phoneInput = (<>\n {this.state.haveCode ?\n null :\n \n \n
\n }\n \n \n \n \n
\n \n
}>\n this.setState({tel: number})} />\n \n \n >);\n\n const sentNotification = (<>{\n this.method == 'email' ?\n {this.state.email}}}\n description=\"Notification that the email with password reset instructions has been sent\" />\n : this.method == 'tel' ?\n {this.state.tel}}}\n description=\"Notification that the SMS with password reset instructions has been sent\" />\n :\n null\n }>);\n\n const codeInput = (<>\n \n \n \n \n
\n \n {\n (numbers_only) => \n } \n
\n >);\n\n const credentialInput = this.method == 'email' ? emailInput : this.method == 'tel' ? phoneInput : null;\n\n return (\n \n );\n }\n}\n","import React from 'react';\n\nimport { KNOWN_HOSTS } from '../config.js';\n\n/* Combobox for selecting host name */\n\nexport default class HostSelector extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.state = {\n hostName: props.serverAddress,\n changed: false\n };\n\n this.handleHostNameChange = this.handleHostNameChange.bind(this);\n this.handleEditingFinished = this.handleEditingFinished.bind(this);\n this.handleKeyDown = this.handleKeyDown.bind(this);\n }\n\n handleHostNameChange(e) {\n this.setState({hostName: e.target.value, changed: true});\n }\n\n handleEditingFinished() {\n if (this.state.changed) {\n this.setState({changed: false});\n this.props.onServerAddressChange(this.state.hostName.trim());\n }\n }\n\n handleKeyDown(e) {\n if (e.key == 'Enter') {\n this.handleEditingFinished();\n }\n }\n\n render() {\n var hostOptions = [];\n for (let key in KNOWN_HOSTS) {\n let item = KNOWN_HOSTS[key];\n hostOptions.push(\n \n );\n }\n return (\n \n \n \n {hostOptions}\n \n
\n );\n }\n}\n","// Tinode config panel.\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport CheckBox from '../widgets/checkbox.jsx';\n\nimport HostSelector from '../widgets/host-selector.jsx';\n\nexport default class SettingsView extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.state = {\n transport: props.transport || 'def',\n serverAddress: props.serverAddress,\n secureConnection: props.secureConnection,\n };\n\n this.handleSubmit = this.handleSubmit.bind(this);\n this.handleTransportSelected = this.handleTransportSelected.bind(this);\n this.handleServerAddressChange = this.handleServerAddressChange.bind(this);\n this.handleToggleSecure = this.handleToggleSecure.bind(this);\n }\n\n handleSubmit(e) {\n e.preventDefault();\n this.props.onUpdate({\n transport: this.state.transport,\n serverAddress: this.state.serverAddress,\n secureConnection: this.state.secureConnection,\n });\n }\n\n handleTransportSelected(e) {\n this.setState({transport: e.currentTarget.value});\n }\n\n handleServerAddressChange(name) {\n this.setState({serverAddress: name});\n }\n\n handleToggleSecure(e) {\n this.setState({secureConnection: !this.state.secureConnection});\n }\n\n render() {\n const names = {def: \"default\", ws: \"websocket\", lp: \"long polling\"};\n const transportOptions = [];\n ['def', 'ws', 'lp'].map((item) => {\n const id = 'transport-' + item;\n const name = names[item];\n transportOptions.push(\n \n \n {name} \n \n );\n });\n\n return (\n \n );\n }\n};\n","// ValidationView: panel for confirming credentials, like email or phone.\nimport React from 'react';\nimport { FormattedMessage, defineMessages, injectIntl } from 'react-intl';\n\nconst messages = defineMessages({\n phone: {\n id: 'phone_dative',\n defaultMessage: 'phone',\n description: \"Dative case of 'phone', i.e. 'phone' in 'by phone'\",\n },\n email: {\n id: 'email_dative',\n defaultMessage: 'email',\n description: \"Dative case of 'email', i.e. 'email' in 'by email'\",\n }\n});\n\nclass ValidationView extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.state = {\n code: props.credCode || '',\n codeReceived: props.credCode\n };\n\n this.handleChange = this.handleChange.bind(this);\n this.handleKeyPress = this.handleKeyPress.bind(this);\n this.handleSubmit = this.handleSubmit.bind(this);\n this.handleCancel = this.handleCancel.bind(this);\n }\n\n static getDerivedStateFromProps(nextProps, prevState) {\n if (nextProps.credCode != prevState.codeReceived) {\n return {\n code: nextProps.credCode || '',\n codeReceived: nextProps.credCode\n };\n }\n\n return prevState;\n }\n\n componentDidMount() {\n // Submit code automatically if it's received from the parent.\n if (this.props.credCode) {\n this.props.onSubmit(this.props.credMethod, this.props.credCode, this.props.credToken);\n }\n }\n\n componentDidUpdate(prevProps, prevState) {\n // Submit code automatically if it's received from the parent.\n if (this.state.codeReceived && this.state.code && this.state.code != prevState.code) {\n this.props.onSubmit(this.props.credMethod, this.state.code, this.props.credToken);\n }\n }\n\n\n handleChange(e) {\n this.setState({code: e.target.value.trim()});\n }\n\n handleKeyPress(e) {\n if (e.key === 'Enter') {\n this.handleSubmit(e);\n } else if (e.key == 'Escape') {\n this.handleCancel(e);\n }\n }\n\n handleSubmit(e) {\n e.preventDefault();\n if (this.state.code && this.state.code.trim()) {\n this.props.onSubmit(this.props.credMethod, this.state.code.trim(), this.props.credToken);\n }\n }\n\n handleCancel(e) {\n e.preventDefault();\n this.props.onCancel();\n }\n\n render() {\n const { formatMessage } = this.props.intl;\n const methods = {'email': formatMessage(messages.email), 'tel': formatMessage(messages.phone)};\n const method = methods[this.props.credMethod] || this.props.credMethod;\n return (\n \n
\n \n \n \n
\n
\n {\n (numbers_only) => \n } \n
\n
\n \n \n \n \n \n \n
\n
\n );\n }\n};\n\nexport default injectIntl(ValidationView);\n","import React from 'react';\nimport { defineMessages, injectIntl } from 'react-intl';\n\nimport ErrorPanel from '../widgets/error-panel.jsx';\nimport LoadSpinner from '../widgets/load-spinner.jsx';\nimport SideNavbar from '../widgets/side-navbar.jsx';\nimport TopicCommon from '../widgets/topic-common.jsx';\n\nimport AccountSettingsView from './account-settings-view.jsx';\nimport ContactsView from './contacts-view.jsx';\nimport CreateAccountView from './create-account-view.jsx';\nimport AccNotificationsView from './acc-notifications-view.jsx';\nimport AccSecurityView from './acc-security-view.jsx';\nimport AccSupportView from './acc-support-view.jsx';\nimport LoginView from './login-view.jsx';\nimport NewTopicView from './new-topic-view.jsx';\nimport PasswordResetView from './password-reset-view.jsx';\nimport SettingsView from './settings-view.jsx';\nimport ValidationView from './validation-view.jsx';\n\n// Panel titles for translation.\nconst messages = defineMessages({\n login: {\n id: 'sidepanel_title_login',\n description: 'Sidepanel title for LoginView.',\n defaultMessage: 'Sign In'\n },\n register: {\n id: 'sidepanel_title_register',\n description: 'Sidepanel title for CreateAccountView.',\n defaultMessage: 'Create Account'\n },\n settings: {\n id: 'sidepanel_title_settings',\n description: 'Sidepanel title for SettingsView.',\n defaultMessage: 'Settings'\n },\n edit: {\n id: 'sidepanel_title_account_settings',\n description: 'Sidepanel title for AccountSettingsView.',\n defaultMessage: 'Account Settings'\n },\n general: {\n id: 'panel_title_general',\n description: 'Title for TopicCommon.',\n defaultMessage: 'General'\n },\n security: {\n id: 'panel_title_security',\n description: 'Title for TopicSecirity and AccSecurity.',\n defaultMessage: 'Security'\n },\n crop: {\n id: 'panel_title_crop',\n description: 'Title for AvatarCropView.',\n defaultMessage: 'Drag to Adjust'\n },\n notif: {\n id: 'sidepanel_title_acc_notifications',\n description: 'Sidepanel title for AccNotificationsView.',\n defaultMessage: 'Notifications'\n },\n support: {\n id: 'sidepanel_title_acc_support',\n description: 'Sidepanel title for AccSupportView.',\n defaultMessage: 'Support'\n },\n newtpk: {\n id: 'sidepanel_title_newtpk',\n description: 'Sidepanel title for NewTopicView.',\n defaultMessage: 'Start New Chat'\n },\n cred: {\n id: 'sidepanel_title_cred',\n description: 'Sidepanel title for ValidationView.',\n defaultMessage: 'Confirm Credentials'\n },\n reset: {\n id: 'sidepanel_title_reset',\n description: 'Sidepanel title for PasswordResetView.',\n defaultMessage: 'Reset Password'\n },\n archive: {\n id: 'sidepanel_title_archive',\n description: 'Sidepanel title for ContactsView-Archive.',\n defaultMessage: 'Archived Chats'\n },\n blocked: {\n id: 'sidepanel_title_blocked',\n description: 'Sidepanel title for ContactsView-Blocked.',\n defaultMessage: 'Blocked Chats'\n }\n});\n\nclass SidepanelView extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.handleNewTopic = this.handleNewTopic.bind(this);\n }\n\n handleNewTopic() {\n this.props.onNavigate('newtpk');\n }\n\n render() {\n const {formatMessage} = this.props.intl;\n const view = this.props.state || (this.props.myUserId ? 'contacts' : 'login');\n\n let title, avatar, badges;\n if (view == 'contacts') {\n title = this.props.title;\n avatar = this.props.avatar ? this.props.avatar : true;\n badges = this.props.trustedBadges;\n } else {\n title = formatMessage(messages[view]);\n avatar = false;\n badges = null;\n }\n\n let onCancel;\n if (['login', 'contacts'].indexOf(view) == -1) {\n onCancel = this.props.onCancel;\n }\n\n return (\n \n
\n\n
\n\n
\n\n {view === 'login' ?\n
:\n\n view === 'register' ?\n
:\n\n view === 'settings' ?\n
:\n\n view === 'edit' ?\n
:\n\n (view === 'general' || view === 'crop') ?\n
:\n\n view === 'notif' ?\n
:\n\n view === 'security' ?\n
:\n\n view === 'support' ?\n
:\n\n (view === 'contacts' || view == 'archive' || view == 'blocked') ?\n
:\n\n view === 'newtpk' ?\n
:\n\n view === 'cred' ?\n
:\n\n view === 'reset' ?\n
:\n null}\n
\n );\n }\n};\n\nexport default injectIntl(SidepanelView);\n","import { KNOWN_HOSTS, DEFAULT_HOST } from '../config.js';\n\n// Detect server address from the URL\nexport function detectServerAddress() {\n let host = DEFAULT_HOST;\n if (typeof window.location == 'object') {\n if (window.location.protocol == 'file:' || window.location.hostname == 'localhost') {\n host = KNOWN_HOSTS.local;\n } else if (window.location.hostname) {\n host = window.location.hostname + (window.location.port ? ':' + window.location.port : '');\n }\n }\n return host;\n}\n\n// Detect if the page is served over HTTPS.\nexport function isSecureConnection() {\n if (typeof window.location == 'object') {\n return window.location.protocol == 'https:';\n }\n return false;\n}\n\nexport function isLocalHost() {\n if (typeof window.location == 'object') {\n return window.location.hostname == 'localhost';\n }\n return false;\n}\n","// The top-level class to hold all functionality together.\nimport React, { Suspense } from 'react';\nimport { FormattedMessage, defineMessages, injectIntl } from 'react-intl';\n\nimport { initializeApp as firebaseInitApp } from 'firebase/app';\nimport { getMessaging as firebaseGetMessaging, getToken as firebaseGetToken,\n deleteToken as firebaseDelToken, onMessage as firebaseOnMessage } from 'firebase/messaging';\n\nimport { Drafty, Tinode } from 'tinode-sdk';\n\nimport Alert from '../widgets/alert.jsx';\nimport ContextMenu from '../widgets/context-menu.jsx';\nimport ForwardDialog from '../widgets/forward-dialog.jsx';\nimport CallIncoming from '../widgets/call-incoming.jsx';\nconst PhoneCountrySelector = React.lazy(_ => import('../widgets/phone-country-selector.jsx'));\n\nimport InfoView from './info-view.jsx';\nimport MessagesView from './messages-view.jsx';\nimport SidepanelView from './sidepanel-view.jsx';\n\nimport { API_KEY, APP_NAME, DEFAULT_P2P_ACCESS_MODE, FORWARDED_PREVIEW_LENGTH, LOGGING_ENABLED,\n MEDIA_BREAKPOINT } from '../config.js';\nimport { CALL_STATE_NONE, CALL_STATE_OUTGOING_INITATED,\n CALL_STATE_INCOMING_RECEIVED, CALL_STATE_IN_PROGRESS,\n CALL_HEAD_STARTED } from '../constants.js';\nimport { PACKAGE_VERSION } from '../version.js';\nimport { base64ReEncode, makeImageUrl } from '../lib/blob-helpers.js';\nimport { detectServerAddress, isLocalHost, isSecureConnection } from '../lib/host-name.js';\nimport LocalStorageUtil from '../lib/local-storage.js';\nimport HashNavigation from '../lib/navigation.js';\nimport { secondsToTime } from '../lib/strformat.js'\nimport { updateFavicon } from '../lib/utils.js';\n\n// Sound to play on message received.\nconst POP_SOUND = new Audio('audio/msg.m4a');\n\nconst messages = defineMessages({\n reconnect_countdown: {\n id: 'reconnect_countdown',\n defaultMessage: 'Disconnected. Reconnecting in {seconds}…',\n description: 'Message shown when an app update is available.'\n },\n reconnect_now: {\n id: 'reconnect_now',\n defaultMessage: 'Try now',\n description: 'Prompt for reconnecting now'\n },\n push_init_failed: {\n id: 'push_init_failed',\n defaultMessage: 'Failed to initialize push notifications',\n description: 'Error message when push notifications have failed to initialize.'\n },\n invalid_security_token: {\n id: 'invalid_security_token',\n defaultMessage: 'Invalid security token',\n description: 'Error message when resetting password.'\n },\n no_connection: {\n id: 'no_connection',\n defaultMessage: 'No connection',\n description: 'Warning that the user is offline.'\n },\n code_doesnot_match: {\n id: 'code_doesnot_match',\n defaultMessage: 'Code does not match',\n description: 'Error message when the credential validation code is incorrect.'\n },\n menu_item_info: {\n id: 'menu_item_info',\n defaultMessage: 'Info',\n description: 'Show extended topic information'\n },\n menu_item_audio_call: {\n id: 'menu_item_audio_call',\n defaultMessage: 'Call',\n description: 'Start audio call'\n },\n menu_item_video_call: {\n id: 'menu_item_video_call',\n defaultMessage: 'Video call',\n description: 'Start video call'\n },\n cred_confirmed_successfully: {\n id: 'cred_confirmed_successfully',\n defaultMessage: 'Confirmed successfully',\n description: 'Message explaining that the credential was successfully validated.'\n }\n});\n\nclass TinodeWeb extends React.Component {\n constructor(props) {\n super(props);\n\n this.selfRef = React.createRef();\n\n this.state = this.getBlankState();\n\n this.handleResize = this.handleResize.bind(this);\n this.handleHashRoute = this.handleHashRoute.bind(this);\n this.handleOnline = this.handleOnline.bind(this);\n this.checkForAppUpdate = this.checkForAppUpdate.bind(this);\n this.handleVisibilityEvent = this.handleVisibilityEvent.bind(this);\n this.handleError = this.handleError.bind(this);\n this.handleLoginRequest = this.handleLoginRequest.bind(this);\n this.handlePersistenceChange = this.handlePersistenceChange.bind(this);\n this.handleConnected = this.handleConnected.bind(this);\n this.handleAutoreconnectIteration = this.handleAutoreconnectIteration.bind(this);\n this.doLogin = this.doLogin.bind(this);\n this.handleLoginSuccessful = this.handleLoginSuccessful.bind(this);\n this.handleDisconnect = this.handleDisconnect.bind(this);\n this.tnMeMetaDesc = this.tnMeMetaDesc.bind(this);\n this.tnMeContactUpdate = this.tnMeContactUpdate.bind(this);\n this.tnMeSubsUpdated = this.tnMeSubsUpdated.bind(this);\n this.resetContactList = this.resetContactList.bind(this);\n this.tnInitFind = this.tnInitFind.bind(this);\n this.tnFndSubsUpdated = this.tnFndSubsUpdated.bind(this);\n this.handleSearchContacts = this.handleSearchContacts.bind(this);\n this.handleTopicSelected = this.handleTopicSelected.bind(this);\n this.handleHideMessagesView = this.handleHideMessagesView.bind(this);\n this.handleSendMessage = this.handleSendMessage.bind(this);\n this.handleNewChatInvitation = this.handleNewChatInvitation.bind(this);\n this.handleNewAccount = this.handleNewAccount.bind(this);\n this.handleNewAccountRequest = this.handleNewAccountRequest.bind(this);\n this.handleUpdatePasswordRequest = this.handleUpdatePasswordRequest.bind(this);\n this.handleUpdateAccountTagsRequest = this.handleUpdateAccountTagsRequest.bind(this);\n this.handleToggleIncognitoMode = this.handleToggleIncognitoMode.bind(this);\n this.handleSettings = this.handleSettings.bind(this);\n this.handleGlobalSettings = this.handleGlobalSettings.bind(this);\n this.handleShowArchive = this.handleShowArchive.bind(this);\n this.handleShowBlocked = this.handleShowBlocked.bind(this);\n this.handleToggleMessageSounds = this.handleToggleMessageSounds.bind(this);\n this.handleCredAdd = this.handleCredAdd.bind(this);\n this.handleCredDelete = this.handleCredDelete.bind(this);\n this.handleCredConfirm = this.handleCredConfirm.bind(this);\n this.initFCMessaging = this.initFCMessaging.bind(this);\n this.toggleFCMToken = this.toggleFCMToken.bind(this);\n this.handlePushMessage = this.handlePushMessage.bind(this);\n this.handleSidepanelCancel = this.handleSidepanelCancel.bind(this);\n this.handleStartTopicRequest = this.handleStartTopicRequest.bind(this);\n this.handleNewTopicCreated = this.handleNewTopicCreated.bind(this);\n this.handleTopicUpdateRequest = this.handleTopicUpdateRequest.bind(this);\n this.handleUnarchive = this.handleUnarchive.bind(this);\n this.handleChangePermissions = this.handleChangePermissions.bind(this);\n this.handleTagsUpdateRequest = this.handleTagsUpdateRequest.bind(this);\n this.handleLogout = this.handleLogout.bind(this);\n this.handleDeleteAccount = this.handleDeleteAccount.bind(this);\n this.handleDeleteTopicRequest = this.handleDeleteTopicRequest.bind(this);\n this.handleDeleteMessagesRequest = this.handleDeleteMessagesRequest.bind(this);\n this.handleLeaveUnsubRequest = this.handleLeaveUnsubRequest.bind(this);\n this.handleBlockTopicRequest = this.handleBlockTopicRequest.bind(this);\n this.handleReportTopic = this.handleReportTopic.bind(this);\n this.handleShowContextMenu = this.handleShowContextMenu.bind(this);\n this.defaultTopicContextMenu = this.defaultTopicContextMenu.bind(this);\n this.handleHideContextMenu = this.handleHideContextMenu.bind(this);\n this.handleShowAlert = this.handleShowAlert.bind(this);\n this.handleShowInfoView = this.handleShowInfoView.bind(this);\n this.handleMemberUpdateRequest = this.handleMemberUpdateRequest.bind(this);\n this.handleValidateCredentialsRequest = this.handleValidateCredentialsRequest.bind(this);\n this.handlePasswordResetRequest = this.handlePasswordResetRequest.bind(this);\n this.handleResetPassword = this.handleResetPassword.bind(this);\n this.handleContextMenuAction = this.handleContextMenuAction.bind(this);\n this.handleShowCountrySelector = this.handleShowCountrySelector.bind(this);\n\n this.handleShowForwardDialog = this.handleShowForwardDialog.bind(this);\n this.handleHideForwardDialog = this.handleHideForwardDialog.bind(this);\n\n this.handleStartVideoCall = this.handleStartVideoCall.bind(this);\n this.handleStartAudioCall = this.handleStartAudioCall.bind(this);\n this.handleInfoMessage = this.handleInfoMessage.bind(this);\n this.handleDataMessage = this.handleDataMessage.bind(this);\n this.handleCallClose = this.handleCallClose.bind(this);\n\n this.handleCallInvite = this.handleCallInvite.bind(this);\n this.handleCallRinging = this.handleCallRinging.bind(this);\n this.handleCallHangup = this.handleCallHangup.bind(this);\n this.handleCallSendOffer = this.handleCallSendOffer.bind(this);\n this.handleCallIceCandidate = this.handleCallIceCandidate.bind(this);\n this.handleCallSendAnswer = this.handleCallSendAnswer.bind(this);\n\n this.handleCallAccept = this.handleCallAccept.bind(this);\n\n this.sendMessageToTopic = this.sendMessageToTopic.bind(this);\n\n // FIXME: this is unused.\n this.callTimeoutTimer = null;\n }\n\n getBlankState() {\n const settings = LocalStorageUtil.getObject('settings') || {};\n const persist = !!LocalStorageUtil.getObject('keep-logged-in');\n\n return {\n connected: false,\n // Connected and subscribed to 'me'\n ready: false,\n // Try to re-login on new connection.\n autoLogin: false,\n transport: settings.transport || null,\n serverAddress: settings.serverAddress || detectServerAddress(),\n secureConnection: settings.secureConnection === undefined ?\n isSecureConnection() : settings.secureConnection,\n serverVersion: \"no connection\",\n // \"On\" is the default, so saving the \"off\" state.\n messageSounds: !settings.messageSoundsOff,\n incognitoMode: false,\n // Persistent request to enable alerts.\n desktopAlerts: persist && !!settings.desktopAlerts,\n // Enable / disable checkbox.\n desktopAlertsEnabled: (isSecureConnection() || isLocalHost()) &&\n (typeof firebaseInitApp != 'undefined') && (typeof navigator != 'undefined') &&\n (typeof FIREBASE_INIT != 'undefined'),\n firebaseToken: persist ? LocalStorageUtil.getObject('firebase-token') : null,\n\n applicationVisible: !document.hidden,\n\n errorText: '',\n errorLevel: null,\n errorAction: undefined,\n errorActionText: null,\n\n sidePanelSelected: 'login',\n sidePanelTitle: null,\n sidePanelAvatar: null,\n myTrustedBadges: [],\n loadSpinnerVisible: false,\n\n login: '',\n password: '',\n persist: persist,\n myUserId: null,\n liveConnection: navigator.onLine,\n topicSelected: '',\n topicSelectedOnline: false,\n topicSelectedAcs: null,\n newTopicParams: null,\n loginDisabled: false,\n displayMobile: (window.innerWidth <= MEDIA_BREAKPOINT),\n infoPanel: undefined,\n mobilePanel: 'sidepanel',\n\n // Video calls.\n callTopic: undefined,\n callState: CALL_STATE_NONE,\n callAudioOnly: undefined,\n // If true, call state should be transitioned to CALL_STATE_IN_PROGRESS upon\n // switching to the call topic.\n callShouldStart: false,\n\n contextMenuVisible: false,\n contextMenuBounds: null,\n contextMenuClickAt: null,\n contextMenuParams: null,\n contextMenuItems: [],\n\n forwardDialogVisible: false,\n forwardMessage: null,\n\n // Modal alert dialog.\n alertVisible: false,\n alertParams: {},\n\n // Chats as shown in the ContactsView\n chatList: [],\n // Contacts returned by a search query.\n searchResults: [],\n // Merged results of a search query and p2p chats.\n searchableContacts: [],\n // Credential validation.\n credMethod: undefined,\n credCode: undefined,\n credToken: undefined,\n // Topic to go to after login.\n requestedTopic: undefined\n };\n }\n\n componentDidMount() {\n window.addEventListener('resize', this.handleResize);\n window.addEventListener('online', (e) => { this.handleOnline(true); });\n window.addEventListener('offline', (e) => { this.handleOnline(false); });\n window.addEventListener('hashchange', this.handleHashRoute);\n\n // Process background notifications from the service worker.\n if (typeof BroadcastChannel == 'function') {\n const serviceWorkerChannel = new BroadcastChannel('tinode-sw');\n serviceWorkerChannel.addEventListener('message', this.handlePushMessage);\n } else {\n // Safari is broken by design.\n console.warn(\"Your browser does not support BroadcastChannel. Some features will not be available\");\n }\n\n // Window/tab visible or invisible for pausing timers.\n document.addEventListener('visibilitychange', this.handleVisibilityEvent);\n\n this.setState({\n viewportWidth: document.documentElement.clientWidth,\n viewportHeight: document.documentElement.clientHeight\n });\n\n new Promise((resolve, reject) => {\n this.tinode = TinodeWeb.tnSetup(this.state.serverAddress, isSecureConnection(), this.state.transport,\n this.props.intl.locale, this.state.persist, resolve);\n this.tinode.onConnect = this.handleConnected;\n this.tinode.onDisconnect = this.handleDisconnect;\n this.tinode.onAutoreconnectIteration = this.handleAutoreconnectIteration;\n this.tinode.onInfoMessage = this.handleInfoMessage;\n this.tinode.onDataMessage = this.handleDataMessage;\n }).then(_ => {\n // Initialize desktop alerts.\n if (this.state.desktopAlertsEnabled) {\n this.initFCMessaging().catch(_ => {\n // do nothing: handled earlier.\n // catch needed to pervent unnecessary logging of error.\n });\n }\n\n // Parse and save the hash navigation params.\n const parsedNav = HashNavigation.parseUrlHash(window.location.hash);\n\n // Read contacts from cache.\n this.resetContactList();\n\n const token = this.state.persist ? LocalStorageUtil.getObject('auth-token') : undefined;\n if (token) {\n this.setState({autoLogin: true});\n\n // When reading from storage, date is returned as string.\n token.expires = new Date(token.expires);\n this.tinode.setAuthToken(token);\n this.tinode.connect().catch(err => {\n // Socket error\n this.handleError(err.message, 'err');\n });\n }\n\n this.readTimer = null;\n this.readTimerCallback = null;\n\n // Maybe navigate to home screen.\n if (!['cred', 'reset', 'register'].includes(parsedNav.path[0])) {\n // Save possible topic name.\n this.setState({requestedTopic: parsedNav.path[1]});\n const path = parsedNav.params && parsedNav.params.cred_done ?\n HashNavigation.addUrlParam('', 'cred_done', parsedNav.params.cred_done):\n '';\n HashNavigation.navigateTo(path);\n } else {\n this.handleHashRoute();\n }\n });\n }\n\n componentWillUnmount() {\n window.removeEventListener('resize', this.handleResize);\n window.removeEventListener('hashchange', this.handleHashRoute);\n document.removeEventListener('visibilitychange', this.handleVisibilityEvent);\n }\n\n // Setup transport (usually websocket) and server address. This will terminate connection with the server.\n static tnSetup(serverAddress, secureConnection, transport, locale, persistentCache, onSetupCompleted) {\n const tinode = new Tinode({appName: APP_NAME, host: serverAddress, apiKey: API_KEY, transport: transport,\n secure: secureConnection, persist: persistentCache}, onSetupCompleted);\n tinode.setHumanLanguage(locale);\n tinode.enableLogging(LOGGING_ENABLED, true);\n return tinode;\n }\n\n // Tinode received a push notification from the server.\n handlePushMessage(payload) {\n this.tinode.oobNotification(payload.data || {});\n }\n\n initFCMessaging() {\n const {formatMessage, locale} = this.props.intl;\n const onError = (msg, err) => {\n console.error(msg, err);\n this.handleError(formatMessage(messages.push_init_failed), 'err');\n this.setState({firebaseToken: null});\n LocalStorageUtil.updateObject('settings', {desktopAlerts: false});\n }\n\n try {\n this.fcm = firebaseGetMessaging(firebaseInitApp(FIREBASE_INIT, APP_NAME));\n return navigator.serviceWorker.getRegistration('/service-worker.js').then(reg => {\n return reg || navigator.serviceWorker.register('/service-worker.js').then(reg => {\n this.checkForAppUpdate(reg);\n return reg;\n });\n }).then(reg => {\n // Pass locale and version config to the service worker.\n (reg.active || reg.installing).postMessage(JSON.stringify({locale: locale, version: PACKAGE_VERSION}));\n // Request token.\n return TinodeWeb.requestFCMToken(this.fcm, reg);\n }).then(token => {\n const persist = LocalStorageUtil.getObject('keep-logged-in');\n if (token != this.state.firebaseToken) {\n this.tinode.setDeviceToken(token);\n if (persist) {\n LocalStorageUtil.setObject('firebase-token', token);\n }\n }\n this.setState({firebaseToken: token, desktopAlerts: true});\n if (persist) {\n LocalStorageUtil.updateObject('settings', {desktopAlerts: true});\n }\n\n // Handhe FCM pushes\n // (a) for channels always,\n // (b) pushes when the app is in foreground but has no focus.\n firebaseOnMessage(this.fcm, payload => { this.handlePushMessage(payload); });\n }).catch(err => {\n // SW registration or FCM has failed :(\n onError(err);\n throw err;\n });\n } catch (err) {\n onError(err);\n return Promise.reject(err);\n }\n }\n\n // Google's FCM API is idiotic.\n static requestFCMToken(fcm, sw) {\n return firebaseGetToken(fcm, {\n serviceWorkerRegistration: sw,\n vapidKey: FIREBASE_INIT.messagingVapidKey\n }).then(token => {\n if (token) {\n return token;\n } else {\n // Try to request permissions.\n return Notification.requestPermission().then(permission => {\n if (permission === 'granted') {\n return firebaseGetToken(fcm, {\n serviceWorkerRegistration: reg,\n vapidKey: FIREBASE_INIT.messagingVapidKey\n }).then(token => {\n if (token) {\n return token;\n } else {\n throw new Error(\"Failed to initialize notifications\");\n }\n });\n } else {\n throw new Error(\"No permission to send notifications: \" + permission);\n }\n });\n }\n });\n }\n\n handleResize() {\n const mobile = document.documentElement.clientWidth <= MEDIA_BREAKPOINT;\n this.setState({\n viewportWidth: document.documentElement.clientWidth,\n viewportHeight: document.documentElement.clientHeight\n });\n if (this.state.displayMobile != mobile) {\n this.setState({displayMobile: mobile});\n }\n }\n\n // Check if a newer version of TinodeWeb app is available at the server.\n checkForAppUpdate(reg) {\n reg.onupdatefound = _ => {\n const installingWorker = reg.installing;\n installingWorker.onstatechange = _ => {\n if (installingWorker.state == 'installed' && navigator.serviceWorker.controller) {\n const msg = <>\n \n \n .>;\n this.handleError(msg, 'info');\n }\n }\n }\n }\n\n // Handle for hash navigation (hashchange) event: update state.\n handleHashRoute() {\n const hash = HashNavigation.parseUrlHash(window.location.hash);\n // Start with panel parameters.\n const newState = {\n infoPanel: hash.params.info,\n newTopicTabSelected: hash.params.tab\n };\n\n if (hash.path && hash.path.length > 0) {\n // Left-side panel selector.\n if (['register','settings','edit','notif','security','support','general','crop',\n 'cred','reset','newtpk','archive','blocked','contacts',''].includes(hash.path[0])) {\n newState.sidePanelSelected = hash.path[0];\n } else {\n console.warn(\"Unknown sidepanel view\", hash.path[0]);\n }\n\n // Topic for MessagesView selector.\n let topicName = hash.path[1] || null;\n if (topicName != this.state.topicSelected) {\n if (!Tinode.topicType(topicName)) {\n // Clear invalid topic name.\n topicName = null;\n }\n Object.assign(newState, {\n topicSelected: topicName,\n topicSelectedAcs: this.tinode.getTopicAccessMode(topicName)\n });\n }\n } else {\n // Empty hashpath\n Object.assign(newState, {sidePanelSelected: '', topicSelected: null});\n }\n\n // Save credential validation parameters, if available.\n if (hash.params.method) {\n newState.credMethod = hash.params.method;\n }\n if (hash.params.code) {\n newState.credCode = hash.params.code;\n }\n if (hash.params.token) {\n newState.credToken = hash.params.token;\n }\n\n // Show a message if validation was successful.\n if (hash.params.cred_done) {\n Object.assign(newState,\n TinodeWeb.stateForError(this.props.intl.formatMessage(messages.cred_confirmed_successfully), 'info'));\n }\n\n this.setState(newState);\n }\n\n handleOnline(online) {\n if (online) {\n this.handleError();\n clearInterval(this.reconnectCountdown);\n this.tinode.reconnect();\n } else {\n this.handleError(this.props.intl.formatMessage(messages.no_connection), 'warn');\n }\n this.setState({liveConnection: online});\n }\n\n handleVisibilityEvent() {\n this.setState({applicationVisible: !document.hidden});\n }\n\n static stateForError(err, level, action, actionText) {\n return {\n errorText: err,\n errorLevel: level,\n errorAction: action,\n errorActionText: actionText,\n callShouldStart: false,\n };\n }\n\n handleError(err, level, action, actionText) {\n this.setState(TinodeWeb.stateForError(err, level, action, actionText));\n }\n\n // User clicked Login button in the side panel.\n handleLoginRequest(login, password) {\n this.setState({\n loginDisabled: true,\n login: login,\n password: password,\n loadSpinnerVisible: true,\n autoLogin: true\n });\n this.handleError('', null);\n\n if (this.tinode.isConnected()) {\n this.doLogin(login, password, null, {meth: this.state.credMethod, resp: this.state.credCode});\n } else {\n this.tinode.connect().catch(err => {\n // Socket error\n this.setState({loginDisabled: false, autoLogin: false, loadSpinnerVisible: false});\n this.handleError(err.message, 'err');\n });\n }\n\n if (this.state.desktopAlertsEnabled && !this.state.firebaseToken) {\n // Firefox and Safari: \"The Notification permission may only be requested from inside a\n // short running user-generated event handler\".\n this.initFCMessaging();\n }\n }\n\n // Enable or disable saving the password and IndexedDB.\n handlePersistenceChange(persist) {\n if (persist) {\n this.tinode.initStorage().then(_ => {\n LocalStorageUtil.setObject('keep-logged-in', true);\n this.setState({persist: true});\n });\n } else {\n this.tinode.clearStorage().then(_ => {\n LocalStorageUtil.setObject('keep-logged-in', false);\n this.setState({persist: false});\n });\n }\n }\n\n // Connection succeeded.\n handleConnected() {\n // Just to be sure.\n clearInterval(this.reconnectCountdown);\n this.handleError();\n\n const params = this.tinode.getServerInfo();\n this.setState({\n serverVersion: params.ver + ' ' + (params.build ? params.build : 'none')\n });\n\n if (this.state.autoLogin) {\n this.doLogin(this.state.login, this.state.password, null,\n {meth: this.state.credMethod, resp: this.state.credCode});\n }\n }\n\n // Called for each auto-reconnect iteration.\n handleAutoreconnectIteration(sec, prom) {\n clearInterval(this.reconnectCountdown);\n\n if (sec < 0) {\n // Clear error\n this.handleError();\n return;\n }\n\n if (prom) {\n // Reconnecting now\n prom.then(_ => {\n // Reconnected: clear error\n this.handleError();\n }).catch(err => {\n this.handleError(err.message, 'err');\n });\n return;\n }\n\n const {formatMessage} = this.props.intl;\n let count = sec / 1000;\n count = count | count;\n this.reconnectCountdown = setInterval(_ => {\n if (count < -10) {\n // Count could go to negative if computer woke up from sleep.\n clearInterval(this.reconnectCountdown);\n this.tinode.reconnect();\n return;\n }\n\n const fmtTime = (count > 99) ? secondsToTime(count) : count;\n this.handleError(\n formatMessage(messages.reconnect_countdown, {seconds: fmtTime}),\n 'warn',\n _ => {\n clearInterval(this.reconnectCountdown);\n this.tinode.reconnect();\n },\n formatMessage(messages.reconnect_now)\n );\n count -= 1;\n }, 1000);\n }\n\n // Connection lost\n handleDisconnect(err) {\n this.setState({\n connected: false,\n ready: false,\n topicSelectedOnline: false,\n errorText: err && err.message ? err.message : \"Disconnected\",\n errorLevel: err && err.message ? 'err' : 'warn',\n loginDisabled: false,\n contextMenuVisible: false,\n forwardDialogVisible: false,\n serverVersion: \"no connection\"\n });\n }\n\n doLogin(login, password, tmpToken, cred) {\n if (this.tinode.isAuthenticated()) {\n // Already logged in. Go to default screen.\n HashNavigation.navigateTo('');\n return;\n }\n\n let token = tmpToken || (this.tinode.getAuthToken() || {}).token;\n if (!(login && password) && !token) {\n // No login credentials provided.\n // Make sure we are on the login page.\n HashNavigation.navigateTo('');\n this.setState({loginDisabled: false});\n return;\n }\n\n // Sanitize and package credentail.\n cred = Tinode.credential(cred);\n // May be disconnected.\n let connectionPromise = this.tinode.isConnected() ? Promise.resolve() : this.tinode.connect();\n // Try to login with login/password. If they are not available, try token; if no token, ask for login/password.\n let loginPromise;\n if (login && password) {\n token = null;\n this.setState({password: null});\n loginPromise = connectionPromise.then(_ => this.tinode.loginBasic(login, password, cred));\n } else {\n loginPromise = connectionPromise.then(_ => this.tinode.loginToken(token, cred));\n }\n\n loginPromise.then(ctrl => {\n if (ctrl.code >= 300 && ctrl.text === 'validate credentials') {\n this.setState({loadSpinnerVisible: false});\n if (cred) {\n this.handleError(this.props.intl.formatMessage(messages.code_doesnot_match), 'warn');\n }\n TinodeWeb.navigateToCredentialsView(ctrl.params);\n } else {\n this.handleLoginSuccessful();\n }\n }).catch(err => {\n const autoLogin = err.code >= 500;\n // Connection or login failed, report error.\n this.setState({\n loginDisabled: false,\n credMethod: undefined,\n credCode: undefined,\n loadSpinnerVisible: false,\n autoLogin: autoLogin\n });\n this.handleError(err.message, 'err');\n console.warn(\"Login failed\", err);\n if (!autoLogin) {\n if (token) {\n this.handleLogout();\n }\n HashNavigation.navigateTo('');\n }\n });\n }\n\n static navigateToCredentialsView(params) {\n const parsed = HashNavigation.parseUrlHash(window.location.hash);\n parsed.path[0] = 'cred';\n parsed.params['method'] = params.cred[0];\n parsed.params['token'] = params.token;\n HashNavigation.navigateTo(HashNavigation.composeUrlHash(parsed.path, parsed.params));\n }\n\n handleLoginSuccessful() {\n this.handleError();\n\n // Refresh authentication token.\n if (LocalStorageUtil.getObject('keep-logged-in')) {\n LocalStorageUtil.setObject('auth-token', this.tinode.getAuthToken());\n }\n\n const goToTopic = this.state.requestedTopic;\n // Logged in fine, subscribe to 'me' attaching callbacks from the contacts view.\n const me = this.tinode.getMeTopic();\n me.onMetaDesc = this.tnMeMetaDesc;\n me.onContactUpdate = this.tnMeContactUpdate;\n me.onSubsUpdated = this.tnMeSubsUpdated;\n this.setState({\n connected: true,\n credMethod: undefined,\n credCode: undefined,\n credToken: undefined,\n myUserId: this.tinode.getCurrentUserID(),\n autoLogin: true,\n requestedTopic: undefined,\n });\n // Subscribe, fetch topic desc, the list of subscriptions. Messages are not fetched.\n me.subscribe(\n me.startMetaQuery().\n withLaterSub().\n withDesc().\n withTags().\n withCred().\n build()\n ).catch(err => {\n this.tinode.disconnect();\n localStorage.removeItem('auth-token');\n this.handleError(err.message, 'err');\n HashNavigation.navigateTo('');\n }).finally(_ => {\n this.setState({loadSpinnerVisible: false});\n });\n let urlHash = HashNavigation.setUrlSidePanel(window.location.hash, 'contacts');\n if (goToTopic) {\n urlHash = HashNavigation.setUrlTopic(urlHash, goToTopic);\n }\n HashNavigation.navigateTo(urlHash);\n }\n\n tnMeMetaDesc(desc) {\n if (desc) {\n if (desc.public) {\n this.setState({\n sidePanelTitle: desc.public.fn,\n sidePanelAvatar: makeImageUrl(desc.public.photo)\n });\n }\n if (desc.trusted) {\n const badges = [];\n for (const [key, val] of Object.entries(desc.trusted)) {\n if (val) {\n badges.push(key);\n }\n }\n this.setState({\n myTrustedBadges: badges,\n });\n }\n if (desc.acs) {\n this.setState({\n incognitoMode: !desc.acs.isPresencer()\n });\n }\n }\n }\n\n // Reactions to updates to the contact list.\n tnMeContactUpdate(what, cont) {\n if (what == 'on' || what == 'off') {\n this.resetContactList();\n if (this.state.topicSelected == cont.topic) {\n this.setState({topicSelectedOnline: (what == 'on')});\n }\n } else if (what == 'read') {\n this.resetContactList();\n } else if (what == 'msg') {\n // Check if the topic is archived. If so, don't play a sound.\n const topic = this.tinode.getTopic(cont.topic);\n const archived = topic && topic.isArchived();\n\n // New message received. Maybe the message is from the current user, then unread is 0.\n if (cont.unread > 0 && this.state.messageSounds && !archived) {\n // Skip update if the topic is currently open, otherwise the badge will annoyingly flash.\n if (document.hidden || this.state.topicSelected != cont.topic) {\n POP_SOUND.play().catch(_ => {\n // play() throws if the user did not click the app first: https://goo.gl/xX8pDD.\n });\n }\n }\n // Reorder contact list to use possibly updated 'touched'.\n this.resetContactList();\n } else if (what == 'recv') {\n // Explicitly ignoring \"recv\" -- it causes no visible updates to contact list.\n } else if (what == 'gone' || what == 'unsub') {\n // Topic deleted or user unsubscribed. Remove topic from view.\n // If the currently selected topic is gone, clear the selection.\n if (this.state.topicSelected == cont.topic) {\n this.handleTopicSelected(null);\n }\n // Redraw without the deleted topic.\n this.resetContactList();\n } else if (what == 'acs') {\n // Permissions changed. If it's for the currently selected topic,\n // update the views.\n if (this.state.topicSelected == cont.topic) {\n this.setState({topicSelectedAcs: cont.acs});\n }\n } else if (what == 'del') {\n // TODO: messages deleted (hard or soft) -- update pill counter.\n } else if (what == 'upd' || what == 'call') {\n // upd, call - handled by the SDK. Explicitly ignoring here.\n } else {\n // TODO(gene): handle other types of notifications:\n // * ua -- user agent changes (maybe display a pictogram for mobile/desktop).\n console.info(\"Unsupported (yet) presence update:\", what, \"in\", cont.topic);\n }\n }\n\n tnMeSubsUpdated(unused) {\n this.resetContactList();\n }\n\n // Merge search results and contact list to create a single flat\n // list of known contacts for GroupManager to use.\n static prepareSearchableContacts(chatList, foundContacts) {\n const merged = {};\n\n // For chatList topics merge only p2p topics and convert them to the\n // same format as foundContacts.\n for (const c of chatList) {\n if (Tinode.isP2PTopicName(c.topic)) {\n merged[c.topic] = {\n user: c.topic,\n updated: c.updated,\n public: c.public,\n private: c.private,\n acs: c.acs\n };\n }\n }\n\n // Add all foundCountacts if they have not been added already.\n for (const c of foundContacts) {\n if (!merged[c.user]) {\n merged[c.user] = c;\n }\n }\n\n return Object.values(merged);\n }\n\n resetContactList() {\n const newState = {\n chatList: []\n };\n\n if (!this.state.ready) {\n newState.ready = true;\n }\n\n this.tinode.getMeTopic().contacts((c) => {\n if (!c.topic && !c.user) {\n // Contacts expect c.topic to be set.\n c.topic = c.name;\n }\n\n newState.chatList.push(c);\n if (this.state.topicSelected == c.topic) {\n newState.topicSelectedOnline = c.online;\n newState.topicSelectedAcs = c.acs;\n }\n });\n\n const past = new Date(0);\n newState.chatList.sort((a, b) => {\n return (a.touched || past).getTime() - (b.touched || past).getTime();\n });\n\n // Merge search results and chat list.\n newState.searchableContacts = TinodeWeb.prepareSearchableContacts(newState.chatList, this.state.searchResults);\n this.setState(newState);\n }\n\n /* Fnd topic: find contacts by tokens */\n tnInitFind() {\n const fnd = this.tinode.getFndTopic();\n fnd.onSubsUpdated = this.tnFndSubsUpdated;\n if (fnd.isSubscribed()) {\n this.tnFndSubsUpdated();\n } else {\n fnd.subscribe(fnd.startMetaQuery().withSub().build()).catch(err => {\n this.handleError(err.message, 'err');\n });\n }\n }\n\n tnFndSubsUpdated() {\n const foundContacts = [];\n // Don't attempt to create P2P topics which already exist. Server will reject the duplicates.\n this.tinode.getFndTopic().contacts((s) => {\n foundContacts.push(s);\n });\n this.setState({\n searchResults: foundContacts,\n searchableContacts: TinodeWeb.prepareSearchableContacts(this.state.chatList, foundContacts)\n });\n }\n\n /** Called when the user enters a contact into the contact search field in the NewAccount panel\n @param query {Array} is an array of contacts to search for\n */\n handleSearchContacts(query) {\n const fnd = this.tinode.getFndTopic();\n fnd.setMeta({desc: {public: query}})\n .then(_ => fnd.getMeta(fnd.startMetaQuery().withSub().build()))\n .catch(err => this.handleError(err.message, 'err'));\n }\n\n // User clicked on a topic in the side panel or deleted a topic.\n handleTopicSelected(topicName) {\n // Clear newTopicParams after use.\n if (this.state.newTopicParams && this.state.newTopicParams._topicName != topicName) {\n this.setState({\n newTopicParams: null\n });\n }\n\n if (topicName) {\n this.setState({\n errorText: '',\n errorLevel: null,\n mobilePanel: 'topic-view',\n infoPanel: undefined\n });\n // Different topic selected.\n if (this.state.topicSelected != topicName) {\n this.setState({\n topicSelectedOnline: this.tinode.isTopicOnline(topicName),\n topicSelectedAcs: this.tinode.getTopicAccessMode(topicName),\n forwardMessage: null\n });\n HashNavigation.navigateTo(HashNavigation.setUrlTopic('', topicName));\n }\n } else {\n // Currently selected contact deleted\n this.setState({\n errorText: '',\n errorLevel: null,\n mobilePanel: 'sidepanel',\n topicSelectedOnline: false,\n topicSelectedAcs: null,\n infoPanel: undefined,\n forwardMessage: null\n });\n\n HashNavigation.navigateTo(HashNavigation.setUrlTopic('', null));\n }\n }\n\n // In mobile view user requested to show sidepanel\n handleHideMessagesView() {\n this.setState({\n mobilePanel: 'sidepanel'\n });\n HashNavigation.navigateTo(HashNavigation.setUrlTopic(window.location.hash, null));\n }\n\n // User is sending a message, either plain text or a drafty object, possibly\n // with attachments.\n // - msg - Drafty message with content\n // - promise - Promise to be resolved when the upload is completed\n // - uploadCompletionPromise - for tracking progress\n // - head - head dictionary to be attached to the message\n handleSendMessage(msg, uploadCompletionPromise, uploader, head) {\n const topic = this.tinode.getTopic(this.state.topicSelected);\n /* TODO: check if return is required */\n return this.sendMessageToTopic(topic, msg, uploadCompletionPromise, uploader, head);\n }\n\n sendMessageToTopic(topic, msg, uploadCompletionPromise, uploader, head) {\n msg = topic.createMessage(msg, false);\n // The uploader is used to show progress.\n msg._uploader = uploader;\n\n if (head) {\n msg.head = Object.assign(msg.head || {}, head);\n }\n\n const completion = [];\n if (uploadCompletionPromise) {\n completion.push(uploadCompletionPromise);\n }\n\n if (!topic.isSubscribed()) {\n // Topic is not subscribed yet. Subscribe.\n const subscribePromise =\n topic.subscribe()\n .then(_ => {\n // If there are unsent messages (except video call messages),\n // try sending them now. Unsent video call messages will be dropped.\n let calls = [];\n topic.queuedMessages(pub => {\n if (pub._sending || pub.seq == msg.seq) {\n return;\n }\n if (pub.head && pub.head.webrtc) {\n // Filter out unsent video call messages.\n calls.push(pub.seq);\n return;\n }\n if (topic.isSubscribed()) {\n topic.publishMessage(pub);\n }\n });\n if (calls.length > 0) {\n topic.delMessagesList(calls, true);\n }\n });\n completion.push(subscribePromise);\n }\n\n // TODO: check if return is required.\n return topic.publishDraft(msg, Promise.all(completion))\n .then(ctrl => {\n if (topic.isArchived()) {\n topic.archive(false);\n }\n return ctrl;\n })\n .catch(err => this.handleError(err.message, 'err'));\n }\n\n handleNewChatInvitation(topicName, action) {\n const topic = this.tinode.getTopic(topicName);\n let response = null;\n switch (action) {\n case 'accept':\n // Accept given permissions.\n const mode = topic.getAccessMode().getGiven();\n response = topic.setMeta({sub: {mode: mode}});\n if (topic.isP2PType()) {\n // For P2P topics change 'given' permission of the peer too.\n // In p2p topics the other user has the same name as the topic.\n response = response.then(_ => topic.setMeta({sub: {user: topicName, mode: mode}}));\n }\n break;\n case 'delete':\n // Ignore invitation by deleting it.\n response = topic.delTopic(true);\n break;\n case 'block':\n // Ban the topic making futher invites impossible.\n // Just self-ban.\n const am = topic.getAccessMode().updateWant('-JP').getWant();\n response = topic.setMeta({sub: {mode: am}}).then(_ => this.handleTopicSelected(null));\n break;\n default:\n console.warn(\"Unknown invitation action\", '\"' + action + '\"\"');\n }\n\n if (response != null) {\n response.catch(err => this.handleError(err.message, 'err'));\n }\n }\n\n // User chose a Sign Up menu item.\n handleNewAccount() {\n this.handleError();\n\n HashNavigation.navigateTo(HashNavigation.setUrlSidePanel(window.location.hash, 'register'));\n }\n\n // Actual registration of a new account.\n handleNewAccountRequest(login_, password_, public_, cred_, tags_) {\n // Clear old error, if any.\n this.handleError();\n\n this.tinode.connect(this.state.serverAddress)\n .then(_ => {\n let attachments;\n if (public_ && public_.photo && public_.photo.ref) {\n attachments = [public_.photo.ref];\n }\n return this.tinode.createAccountBasic(login_, password_,\n {public: public_, tags: tags_, cred: Tinode.credential(cred_), attachments: attachments});\n }).then(ctrl => {\n if (ctrl.code >= 300 && ctrl.text == 'validate credentials') {\n TinodeWeb.navigateToCredentialsView(ctrl.params);\n } else {\n this.handleLoginSuccessful(this);\n }\n }).catch(err => {\n this.handleError(err.message, 'err');\n });\n }\n\n handleToggleIncognitoMode(on) {\n // Make state undefined.\n this.setState({incognitoMode: null});\n\n const me = this.tinode.getMeTopic();\n const am = me.getAccessMode().updateWant(on ? '-P' : '+P').getWant();\n me.setMeta({sub: {mode: am}}).catch(err => {\n // Request failed, keep existing state.\n this.setState({incognitoMode: !on});\n this.handleError(err.message, 'err');\n });\n }\n\n handleUpdateAccountTagsRequest(_, tags) {\n this.tinode.getMeTopic().setMeta({tags: tags})\n .catch(err => this.handleError(err.message, 'err'));\n }\n\n // User chose Settings menu item.\n handleSettings() {\n this.handleError();\n\n HashNavigation.navigateTo(HashNavigation.setUrlSidePanel(window.location.hash,\n this.state.myUserId ? 'edit' : 'settings'));\n }\n\n // User updated global parameters.\n handleGlobalSettings(settings) {\n const serverAddress = settings.serverAddress || this.state.serverAddress;\n const transport = settings.transport || this.state.transport;\n const secureConnection = settings.secureConnection === undefined ?\n this.state.secureConnection : settings.secureConnection;\n if (this.tinode) {\n this.tinode.clearStorage();\n this.tinode.onDisconnect = undefined;\n this.tinode.disconnect();\n }\n this.tinode = TinodeWeb.tnSetup(serverAddress, secureConnection, transport,\n this.props.intl.locale, LocalStorageUtil.getObject('keep-logged-in'));\n this.tinode.onConnect = this.handleConnected;\n this.tinode.onDisconnect = this.handleDisconnect;\n this.tinode.onAutoreconnectIteration = this.handleAutoreconnectIteration;\n this.tinode.onInfoMessage = this.handleInfoMessage;\n this.tinode.onDataMessage = this.handleDataMessage;\n\n this.setState({\n serverAddress: serverAddress,\n transport: transport,\n secureConnection: secureConnection,\n });\n LocalStorageUtil.setObject('settings', {\n serverAddress: serverAddress,\n transport: transport,\n secureConnection: secureConnection,\n });\n\n HashNavigation.navigateTo(HashNavigation.setUrlSidePanel(window.location.hash, ''));\n }\n\n // User chose 'Archived chats'.\n handleShowArchive() {\n HashNavigation.navigateTo(HashNavigation.setUrlSidePanel(window.location.hash,\n this.state.myUserId ? 'archive' : ''));\n }\n\n // User viewes 'Blocked chats'.\n handleShowBlocked() {\n HashNavigation.navigateTo(HashNavigation.setUrlSidePanel(window.location.hash,\n this.state.myUserId ? 'blocked' : ''));\n }\n\n toggleFCMToken(enabled) {\n if (enabled) {\n this.setState({desktopAlerts: null});\n if (!this.state.firebaseToken) {\n this.initFCMessaging();\n } else {\n this.setState({desktopAlerts: true});\n if (LocalStorageUtil.getObject('keep-logged-in')) {\n LocalStorageUtil.updateObject('settings', {desktopAlerts: true});\n }\n }\n } else if (this.state.firebaseToken && this.fcm) {\n firebaseDelToken(this.fcm).catch(err => {\n console.error(\"Unable to delete token.\", err);\n }).finally(_ => {\n LocalStorageUtil.updateObject('settings', {desktopAlerts: false});\n localStorage.removeItem('firebase-token');\n this.setState({desktopAlerts: false, firebaseToken: null});\n // Inform the server that the token was deleted.\n this.tinode.setDeviceToken(null);\n });\n } else {\n this.setState({desktopAlerts: false, firebaseToken: null});\n LocalStorageUtil.updateObject('settings', {desktopAlerts: false});\n }\n }\n\n handleToggleMessageSounds(enabled) {\n this.setState({messageSounds: enabled});\n LocalStorageUtil.updateObject('settings', {\n messageSoundsOff: !enabled\n });\n }\n\n handleCredAdd(method, value) {\n const me = this.tinode.getMeTopic();\n me.setMeta({cred: {meth: method, val: value}})\n .catch(err => this.handleError(err.message, 'err'));\n }\n\n handleCredDelete(method, value) {\n const me = this.tinode.getMeTopic();\n me.delCredential(method, value)\n .catch(err => this.handleError(err.message, 'err'));\n }\n\n handleCredConfirm(method, response) {\n TinodeWeb.navigateToCredentialsView({cred: [method]});\n }\n\n // User clicked Cancel button in Setting or Sign Up panel.\n handleSidepanelCancel() {\n const parsed = HashNavigation.parseUrlHash(window.location.hash);\n let path = '';\n if (['security','support','general','notif'].includes(parsed.path[0])) {\n path = 'edit';\n } else if ('crop' == parsed.path[0]) {\n path = 'general';\n } else if ('blocked' == parsed.path[0]) {\n path = 'security';\n } else if (this.state.myUserId) {\n path = 'contacts';\n }\n parsed.path[0] = path;\n if (parsed.params) {\n delete parsed.params.code;\n delete parsed.params.method;\n delete parsed.params.tab;\n delete parsed.params.scheme;\n delete parsed.params.token;\n }\n HashNavigation.navigateTo(HashNavigation.composeUrlHash(parsed.path, parsed.params));\n this.setState({errorText: '', errorLevel: null});\n }\n\n // Sidepanel navigator. No need to bind to 'this'.\n basicNavigator(hash) {\n HashNavigation.navigateTo(HashNavigation.setUrlSidePanel(window.location.hash, hash));\n }\n\n // Topic info navigator. No need to bind to 'this'.\n infoNavigator(hash) {\n HashNavigation.navigateTo(HashNavigation.setUrlInfoPanel(window.location.hash, hash));\n }\n\n // Request to start a topic, new or selected from search results, or \"by ID\".\n handleStartTopicRequest(topicName, newTopicParams, isChannel) {\n // Check if topic is indeed new. If not, launch it.\n if (topicName && this.tinode.isTopicCached(topicName)) {\n this.handleTopicSelected(topicName);\n return;\n }\n\n const params = {};\n if (Tinode.isP2PTopicName(topicName)) {\n // Because we are initialing the subscription, set 'want' to all permissions.\n params.sub = {mode: DEFAULT_P2P_ACCESS_MODE};\n // Give the other user all permissions too.\n params.desc = {defacs: {auth: DEFAULT_P2P_ACCESS_MODE}};\n } else {\n topicName = topicName || this.tinode.newGroupTopicName(isChannel);\n if (newTopicParams) {\n params.desc = {public: newTopicParams.public, private: {comment: newTopicParams.private}};\n params.tags = newTopicParams.tags;\n }\n }\n params._topicName = topicName;\n this.setState({newTopicParams: params}, _ => {this.handleTopicSelected(topicName)});\n }\n\n // New topic was created, here is the new topic name.\n handleNewTopicCreated(oldName, newName) {\n let nextState = {};\n if (this.state.callShouldStart) {\n nextState = {callState: CALL_STATE_IN_PROGRESS, callShouldStart: false};\n }\n if (this.state.topicSelected == oldName && oldName != newName) {\n // If the current URl contains the old topic name, replace it with new.\n // Update the name of the selected topic first so the navigator doen't clear\n // the state.\n nextState.topicSelected = newName;\n }\n this.setState(nextState, _ => {\n HashNavigation.navigateTo(HashNavigation.setUrlTopic('', newName));\n });\n }\n\n handleTopicUpdateRequest(topicName, pub, priv, defacs) {\n this.handleError();\n\n const topic = this.tinode.getTopic(topicName);\n if (topic) {\n const params = {};\n let attachments;\n if (pub) {\n if (pub.photo) {\n if (pub.photo.ref && pub.photo.ref != Tinode.DEL_CHAR) {\n attachments = [pub.photo.ref];\n } else if (!pub.photo.data || pub.photo.data == Tinode.DEL_CHAR) {\n pub.photo = Tinode.DEL_CHAR;\n }\n }\n params.public = pub;\n }\n\n if (typeof priv == 'string') {\n params.private = (priv === Tinode.DEL_CHAR) ?\n Tinode.DEL_CHAR : {comment: priv};\n }\n if (defacs) {\n params.defacs = defacs;\n }\n topic.setMeta({desc: params, attachments: attachments})\n .catch(err => this.handleError(err.message, 'err'));\n }\n }\n\n handleUnarchive(topicName) {\n const topic = this.tinode.getTopic(topicName);\n if (topic) {\n topic.archive(false).catch(err => this.handleError(err.message, 'err'));\n }\n }\n\n handleUpdatePasswordRequest(password) {\n this.handleError();\n\n if (password) {\n this.tinode.updateAccountBasic(null, this.tinode.getCurrentLogin(), password)\n .catch(err => this.handleError(err.message, 'err'));\n }\n }\n\n handleChangePermissions(topicName, mode, uid) {\n const topic = this.tinode.getTopic(topicName);\n if (topic) {\n const am = topic.getAccessMode();\n if (uid) {\n am.updateGiven(mode);\n mode = am.getGiven();\n } else {\n am.updateWant(mode);\n mode = am.getWant();\n }\n topic.setMeta({sub: {user: uid, mode: mode}})\n .catch(err => this.handleError(err.message, 'err'));\n }\n }\n\n handleTagsUpdateRequest(topicName, tags) {\n const topic = this.tinode.getTopic(topicName);\n if (topic) {\n topic.setMeta({tags: tags})\n .catch(err => this.handleError(err.message, 'err'));\n }\n }\n\n handleLogout() {\n updateFavicon(0);\n\n // Remove stored data.\n localStorage.removeItem('auth-token');\n localStorage.removeItem('firebase-token');\n localStorage.removeItem('settings');\n if (this.state.firebaseToken) {\n firebaseDelToken(this.fcm);\n }\n\n clearInterval(this.reconnectCountdown);\n\n let cleared;\n if (this.tinode) {\n cleared = this.tinode.clearStorage();\n this.tinode.onDisconnect = undefined;\n this.tinode.disconnect();\n } else {\n cleared = Promose.resolve();\n }\n this.setState(this.getBlankState());\n\n cleared.then(_ => {\n this.tinode = TinodeWeb.tnSetup(this.state.serverAddress, isSecureConnection(),\n this.state.transport, this.props.intl.locale, LocalStorageUtil.getObject('keep-logged-in'), _ => {\n this.tinode.onConnect = this.handleConnected;\n this.tinode.onDisconnect = this.handleDisconnect;\n this.tinode.onAutoreconnectIteration = this.handleAutoreconnectIteration;\n this.tinode.onInfoMessage = this.handleInfoMessage;\n this.tinode.onDataMessage = this.handleDataMessage;\n HashNavigation.navigateTo('');\n })\n });\n }\n\n handleDeleteAccount() {\n this.tinode.delCurrentUser(true).then(_ => {\n this.handleLogout();\n });\n }\n\n handleDeleteTopicRequest(topicName) {\n const topic = this.tinode.getTopic(topicName);\n if (!topic) {\n return;\n }\n\n // Request to hard-delete topic.\n topic.delTopic(true).then(_ => {\n // Hide MessagesView and InfoView panels.\n HashNavigation.navigateTo(HashNavigation.setUrlTopic(window.location.hash, ''));\n }).catch(err => {\n this.handleError(err.message, 'err');\n });\n }\n\n handleDeleteMessagesRequest(topicName) {\n const topic = this.tinode.getTopic(topicName);\n if (!topic) {\n return;\n }\n\n // Request hard-delete all messages.\n topic.delMessagesAll(true)\n .catch(err => this.handleError(err.message, 'err'));\n }\n\n handleLeaveUnsubRequest(topicName) {\n const topic = this.tinode.getTopic(topicName);\n if (!topic) {\n return;\n }\n\n topic.leave(true).then(_ => {\n // Hide MessagesView and InfoView panels.\n HashNavigation.navigateTo(HashNavigation.setUrlTopic(window.location.hash, ''));\n }).catch(err => {\n this.handleError(err.message, 'err');\n });\n }\n\n handleBlockTopicRequest(topicName) {\n const topic = this.tinode.getTopic(topicName);\n if (!topic) {\n return;\n }\n\n topic.updateMode(null, '-JP')\n .then(_ => {\n // Hide MessagesView and InfoView panels.\n HashNavigation.navigateTo(HashNavigation.setUrlTopic(window.location.hash, ''));\n })\n .catch(err => this.handleError(err.message, 'err'));\n }\n\n handleReportTopic(topicName) {\n const topic = this.tinode.getTopic(topicName);\n if (!topic) {\n return;\n }\n\n // Publish spam report.\n this.tinode.report('report', topicName);\n\n // Remove J and P permissions.\n topic.updateMode(null, '-JP')\n .then(_ => {\n // Hide MessagesView and InfoView panels.\n HashNavigation.navigateTo(HashNavigation.setUrlTopic(window.location.hash, ''));\n })\n .catch(err => this.handleError(err.message, 'err'));\n }\n\n handleShowContextMenu(params, menuItems) {\n this.setState({\n contextMenuVisible: true,\n contextMenuClickAt: {x: params.x, y: params.y},\n contextMenuParams: params,\n contextMenuItems: menuItems || this.defaultTopicContextMenu(params.topicName),\n contextMenuBounds: this.selfRef.current.getBoundingClientRect()\n });\n }\n\n //\n handleShowForwardDialog(params) {\n if (this.state.sidePanelSelected == 'newtpk') {\n // If the Find panel is active, close it.\n this.handleSidepanelCancel();\n }\n const header = '➦ ' + params.userName;\n const content = typeof params.content == 'string' ? Drafty.init(params.content) : Drafty.forwardedContent(params.content);\n const preview = Drafty.preview(content, FORWARDED_PREVIEW_LENGTH, true);\n const msg = Drafty.append(Drafty.appendLineBreak(Drafty.mention(header, params.userFrom)), content);\n const msgPreview = Drafty.quote(header, params.userFrom, preview);\n\n const head = {\n forwarded: params.topicName + ':' + params.seq\n };\n this.setState({\n forwardDialogVisible: true,\n forwardMessage: { head: head, msg: msg, preview: msgPreview }\n });\n }\n\n defaultTopicContextMenu(topicName) {\n const topic = this.tinode.getTopic(topicName);\n\n if (topic._deleted) {\n return [\n 'topic_delete'\n ];\n }\n\n let muted = false, blocked = false, self_blocked = false, subscribed = false, deleter = false,\n archived = false, webrtc = false;\n if (topic) {\n subscribed = topic.isSubscribed();\n archived = topic.isArchived();\n\n const acs = topic.getAccessMode();\n if (acs) {\n muted = acs.isMuted();\n blocked = !acs.isJoiner();\n self_blocked = !acs.isJoiner('want');\n deleter = acs.isDeleter();\n }\n }\n\n webrtc = !!this.tinode.getServerParam('iceServers');\n\n return [\n subscribed ? {\n title: this.props.intl.formatMessage(messages.menu_item_info),\n handler: this.handleShowInfoView\n } : null,\n subscribed && Tinode.isP2PTopicName(topicName) && webrtc ? {\n title: this.props.intl.formatMessage(messages.menu_item_audio_call),\n handler: this.handleStartAudioCall\n } : null,\n subscribed && Tinode.isP2PTopicName(topicName) && webrtc ? {\n title: this.props.intl.formatMessage(messages.menu_item_video_call),\n handler: this.handleStartVideoCall\n } : null,\n subscribed ? 'messages_clear' : null,\n subscribed && deleter ? 'messages_clear_hard' : null,\n muted ? (blocked ? null : 'topic_unmute') : 'topic_mute',\n self_blocked ? 'topic_unblock' : 'topic_block',\n archived ? 'topic_restore' : 'topic_archive',\n 'topic_delete'\n ];\n }\n\n handleHideContextMenu() {\n this.setState({\n contextMenuVisible: false,\n contextMenuClickAt: null,\n contextMenuParams: null,\n contextMenuBounds: null\n });\n }\n\n handleHideForwardDialog(keepForwardedMessage) {\n this.setState({\n forwardDialogVisible: false,\n forwardMessage: keepForwardedMessage ? this.state.forwardMessage : null\n });\n }\n\n handleContextMenuAction(action, promise, params) {\n if (action == 'topic_archive') {\n if (promise && params.topicName && params.topicName == this.state.topicSelected) {\n promise.then(_ => {\n this.handleTopicSelected(null);\n });\n }\n } else if (action == 'menu_item_forward') {\n this.handleShowForwardDialog(params);\n }\n }\n\n handleShowAlert(title, content, onConfirm, confirmText, onReject, rejectText) {\n this.setState({\n alertVisible: true,\n alertParams: {\n title: title,\n content: content,\n onConfirm: onConfirm,\n confirm: confirmText,\n onReject: onReject,\n reject: rejectText\n }\n });\n }\n\n handleShowInfoView() {\n HashNavigation.navigateTo(HashNavigation.addUrlParam(window.location.hash, 'info', 'info'));\n this.setState({infoPanel: 'info'});\n }\n\n handleMemberUpdateRequest(topicName, added, removed) {\n if (!topicName) {\n return;\n }\n\n const topic = this.tinode.getTopic(topicName);\n if (!topic) {\n return;\n }\n\n if (added && added.length > 0) {\n added.map((uid) => {\n topic.invite(uid, null)\n .catch(err => this.handleError(err.message, 'err'));\n });\n }\n\n if (removed && removed.length > 0) {\n removed.map((uid) => {\n topic.delSubscription(uid)\n .catch(err => this.handleError(err.message, 'err'));\n });\n }\n }\n\n handleValidateCredentialsRequest(cred, code, token) {\n if (this.tinode.isAuthenticated()) {\n // Adding new email or phone number in account setting.\n this.tinode.getMeTopic().setMeta({cred: {meth: cred, resp: code}})\n .catch(err => this.handleError(err.message, 'err'));\n } else {\n // Credential validation on signup.\n this.setState({credMethod: cred, credCode: code, credToken: token});\n this.doLogin(null, null, token, {meth: cred, resp: code});\n }\n }\n\n handlePasswordResetRequest(method, value) {\n // If already connected, connnect() will return a resolved promise.\n return this.tinode.connect()\n .then(_ => this.tinode.requestResetAuthSecret('basic', method, value))\n .catch(err => {\n // Socket error\n this.handleError(err.message, 'err');\n });\n }\n\n handleResetPassword(newPassword, tempAuth) {\n const secret = base64ReEncode(tempAuth.secret);\n if (!secret || !tempAuth.scheme) {\n this.handleError(this.props.intl.formatMessage(messages.invalid_security_token), 'err');\n } else {\n this.tinode.connect()\n .then(_ => this.tinode.updateAccountBasic(null, null, newPassword, {scheme: tempAuth.scheme, secret: secret}))\n .then(_ => HashNavigation.navigateTo(''))\n .catch(err => {\n // Socket error\n this.handleError(err.message, 'err');\n });\n }\n }\n\n handleShowCountrySelector(code, dial, selectedCallback) {\n this.handleShowAlert(\"Select country\",\n }>\n {\n this.setState({alertVisible: false});\n selectedCallback(c, d);\n }} />\n ,\n null, null, _ => {}, \"Cancel\");\n }\n\n handleStartVideoCall() {\n this.setState({\n callTopic: this.state.topicSelected,\n callState: CALL_STATE_OUTGOING_INITATED,\n callAudioOnly: false\n });\n }\n\n handleStartAudioCall() {\n this.setState({\n callTopic: this.state.topicSelected,\n callState: CALL_STATE_OUTGOING_INITATED,\n callAudioOnly: true\n });\n }\n\n handleCallInvite(callTopic, callSeq, callState, audioOnly) {\n switch (callState) {\n case CALL_STATE_OUTGOING_INITATED:\n const head = { webrtc: CALL_HEAD_STARTED, aonly: !!audioOnly };\n this.handleSendMessage(Drafty.videoCall(audioOnly), undefined, undefined, head)\n .then(ctrl => {\n if (ctrl.code < 200 || ctrl.code >= 300 || !ctrl.params || !ctrl.params.seq) {\n this.handleCallClose();\n return;\n }\n this.setState({callSeq: ctrl.params['seq']});\n });\n break;\n case CALL_STATE_IN_PROGRESS:\n const topic = this.tinode.getTopic(callTopic);\n if (!topic) {\n return;\n }\n // We've accepted the call. Let the other side know.\n topic.videoCall('accept', callSeq);\n break;\n }\n }\n\n handleCallRinging(callTopic, callSeq) {\n const topic = this.tinode.getTopic(callTopic);\n if (!topic) {\n return;\n }\n\n topic.videoCall('ringing', callSeq);\n }\n\n handleCallHangup(callTopic, callSeq) {\n const topic = this.tinode.getTopic(callTopic);\n if (!topic) {\n return;\n }\n\n topic.videoCall('hang-up', callSeq);\n }\n\n handleCallSendOffer(callTopic, callSeq, sdp) {\n const topic = this.tinode.getTopic(callTopic);\n if (!topic) {\n return;\n }\n\n topic.videoCall('offer', callSeq, sdp);\n }\n\n handleCallIceCandidate(callTopic, callSeq, candidate) {\n const topic = this.tinode.getTopic(callTopic);\n if (!topic) {\n return;\n }\n\n topic.videoCall('ice-candidate', callSeq, candidate);\n }\n handleCallSendAnswer(callTopic, callSeq, sdp) {\n const topic = this.tinode.getTopic(callTopic);\n if (!topic) {\n return;\n }\n\n topic.videoCall('answer', callSeq, sdp);\n }\n\n handleCallClose() {\n if (this.callTimeoutTimer) {\n clearTimeout(this.callTimeoutTimer);\n }\n this.setState({\n callTopic: undefined,\n callState: CALL_STATE_NONE,\n callAudioOnly: undefined\n });\n }\n\n handleCallAccept(topicName) {\n const topic = this.tinode.getTopic(topicName);\n if (!topic) {\n return;\n }\n if (topic.isSubscribed()) {\n this.handleTopicSelected(this.state.callTopic);\n this.setState({\n callState: CALL_STATE_IN_PROGRESS\n });\n } else {\n // We need to switch and subscribe to callTopic first.\n this.setState({\n callShouldStart: true,\n }, _ => this.handleTopicSelected(this.state.callTopic));\n }\n }\n\n handleInfoMessage(info) {\n if (info.what != 'call') {\n return;\n }\n switch (info.event) {\n case 'accept':\n // If another my session has accepted the call.\n if (Tinode.isMeTopicName(info.topic) && this.tinode.isMe(info.from)) {\n this.setState({\n callTopic: null,\n callState: CALL_STATE_NONE,\n callSeq: null,\n callAudioOnly: undefined\n });\n return;\n }\n if (info.topic == this.state.callTopic) {\n // Update state.\n this.setState({callState: CALL_STATE_IN_PROGRESS});\n }\n break;\n case 'hang-up':\n // Remote hangup.\n this.handleCallClose();\n break;\n }\n }\n\n handleDataMessage(data) {\n if (data.head && data.head.webrtc && data.head.webrtc == CALL_HEAD_STARTED) {\n // If it's a video call invite message.\n // See if we need to display incoming call UI.\n const topic = this.tinode.getTopic(data.topic);\n if (topic) {\n // Check if a later version of the message exists (which means the call\n // has been either accepted or finished already).\n const msg = topic.latestMsgVersion(data.seq) || data;\n if (msg.head && msg.head.webrtc && msg.head.webrtc == CALL_HEAD_STARTED) {\n // This is a legit new call.\n if (data.from != this.state.myUserId) {\n if (this.state.callState == CALL_STATE_NONE) {\n // Incoming call.\n this.setState({\n callTopic: data.topic,\n callState: CALL_STATE_INCOMING_RECEIVED,\n callSeq: data.seq,\n callAudioOnly: !!msg.head.aonly\n });\n } else {\n // Another call is either in progress or being established.\n // Reject the incoming call.\n this.handleCallHangup(data.topic, data.seq);\n }\n }\n }\n } else {\n console.warn(\"Received vc data message from unknown topic\", data.topic);\n }\n }\n }\n\n render() {\n return (\n \n {this.state.contextMenuVisible ?\n
{\n if (topicName == this.state.topicSelected) {\n this.handleTopicSelected(null);\n }\n }}\n onError={this.handleError} />\n :\n null\n }\n {this.state.forwardDialogVisible ?\n \n :\n null\n }\n {this.state.callTopic && this.state.callState == CALL_STATE_INCOMING_RECEIVED ?\n \n :\n null\n }\n {this.state.alertVisible ?\n this.setState({alertVisible: false})) : null}\n reject={this.state.alertParams.reject}\n onConfirm={this.state.alertParams.onConfirm ?\n (_ => {this.setState({alertVisible: false}); this.state.alertParams.onConfirm();}) : null}\n confirm={this.state.alertParams.confirm}\n /> : null}\n \n\n \n\n {this.state.infoPanel ?\n \n :\n null\n }\n \n );\n }\n};\n\nexport default injectIntl(TinodeWeb);\n","// Put all packages together.\n// Used to generate umd/index.prod.js\n\nimport React from 'react';\nimport { createRoot } from 'react-dom/client';\n\nimport { IntlProvider } from 'react-intl';\n\nimport TinodeWeb from './views/tinode-web.jsx';\nimport HashNavigation from './lib/navigation.js';\n\n// Insert google analytics script and tag if configured.\nif (FIREBASE_INIT && FIREBASE_INIT.measurementId) {\n const head = document.getElementsByTagName('head')[0];\n let script = document.createElement('script');\n script.src = 'https://www.googletagmanager.com/gtag/js?id=' + FIREBASE_INIT.measurementId;\n script.async = true;\n head.prepend(script);\n window.dataLayer = window.dataLayer || [];\n function gtag(){dataLayer.push(arguments);}\n gtag('js', new Date());\n gtag('config', FIREBASE_INIT.measurementId);\n}\n\n// Allow loading translation strings for just one language.\nconst messageLoader = {\n 'de': _ => import('./i18n.min/de.json'),\n 'en': _ => import('./i18n.min/en.json'),\n 'es': _ => import('./i18n.min/es.json'),\n 'fr': _ => import('./i18n.min/fr.json'),\n 'ko': _ => import('./i18n.min/ko.json'),\n 'ro': _ => import('./i18n.min/ro.json'),\n 'ru': _ => import('./i18n.min/ru.json'),\n 'zh': _ => import('./i18n.min/zh.json'),\n 'zh-TW': _ => import('./i18n.min/zh-TW.json')\n};\n\n// Detect human language to use in the UI:\n// Check parameters from URL hash #?hl=ru, then browser, then use 'en' as a fallback.\nconst { params } = HashNavigation.parseUrlHash(window.location.hash);\nconst language = (params && params.hl) ||\n (navigator.languages && navigator.languages[0]) ||\n navigator.language ||\n navigator.userLanguage ||\n 'en';\n\n// Make sure names like 'en_GB' and 'en-GB' consistently use '-'.\nconst normalized = language.replace('_', '-');\n// Get the base language 'en' from a more specific 'en-US' as a partial fallback.\nconst baseLanguage = normalized.split('-')[0].toLowerCase();\n\n// Try the full locale first, then the locale without the region code, fallback to 'en'.\nconst htmlLang = messageLoader[normalized] ? language : messageLoader[baseLanguage] ? baseLanguage : 'en';\n\n// Set lang attribute of the HTML element: \ndocument.getElementsByTagName('html')[0].setAttribute('lang', htmlLang);\n\n// Render the app.\nconst root = createRoot(document.getElementById('mountPoint'));\nmessageLoader[htmlLang]().then(messages =>\n root.render(\n \n \n \n));\n"],"names":["leafPrototypes","getProto","inProgress","dataWebpackPrefix","APP_NAME","PACKAGE_VERSION","API_KEY","KNOWN_HOSTS","hosted","local","DEFAULT_HOST","LOGGING_ENABLED","KEYPRESS_DELAY","READ_DELAY","MIN_TAG_LENGTH","MAX_TAG_LENGTH","MAX_TAG_COUNT","DEFAULT_P2P_ACCESS_MODE","NO_ACCESS_MODE","MEDIA_BREAKPOINT","REM_SIZE","AVATAR_SIZE","MAX_AVATAR_BYTES","BROKEN_IMAGE_SIZE","NO_DIMENSIONS_VIDEO","MESSAGES_PAGE","MAX_INBAND_ATTACHMENT_SIZE","MAX_EXTERN_ATTACHMENT_SIZE","MAX_IMAGE_DIM","IMAGE_PREVIEW_DIM","VIDEO_PREVIEW_DIM","IMAGE_THUMBNAIL_DIM","VIDEO_THUMBNAIL_WIDTH","MAX_ONLINE_IN_TOPIC","MAX_TITLE_LENGTH","MAX_TOPIC_DESCRIPTION_LENGTH","MAX_PEER_TITLE_LENGTH","MESSAGE_PREVIEW_LENGTH","QUOTED_REPLY_LENGTH","FORWARDED_PREVIEW_LENGTH","EDIT_PREVIEW_LENGTH","MIN_DURATION","MAX_DURATION","LINK_CONTACT_US","LINK_PRIVACY_POLICY","LINK_TERMS_OF_SERVICE","SUPPORTED_IMAGE_FORMATS","MIME_EXTENSIONS","makeImageUrl","photo","ref","data","type","startsWith","fitImageSize","width","height","maxWidth","maxHeight","forceSquare","Math","min","scale","size","dstWidth","dstHeight","srcWidth","srcHeight","xoffset","yoffset","fileNameForMime","fname","mime","idx","indexOf","ext","at","lastIndexOf","substring","imageScaled","fileOrBlob","maxSize","Promise","resolve","reject","img","Image","crossOrigin","onerror","err","Error","onload","async","URL","revokeObjectURL","src","dim","canvas","document","createElement","ctx","getContext","imageSmoothingEnabled","drawImage","includes","blob","toBlob","length","clearRect","name","createObjectURL","imageCrop","objURL","left","top","_","fileToBase64","file","reader","FileReader","error","bits","result","split","readAsDataURL","blobToBase64","filePasted","event","onImageSuccess","onAttachmentSuccess","onError","items","clipboardData","originalEvent","i","item","kind","getAsFile","console","base64ReEncode","str","replace","btoa","atob","base64ToBlob","bin","buf","ArrayBuffer","arr","Uint8Array","charCodeAt","Blob","intArrayToBase64","Array","isArray","forEach","b","String","fromCharCode","window","base64ToIntArray","b64","c","push","shortDateFormat","then","locale","navigator","userLanguage","language","now","Date","getFullYear","getMonth","getDate","toLocaleTimeString","hour12","hour","minute","toLocaleDateString","month","day","year","relativeDateFormat","diff","floor","getTime","getTimezoneOffset","abs","Intl","RelativeTimeFormat","numeric","format","DateTimeFormat","secondsToTime","seconds","fixedMin","hours","sec","bytesToHumanSize","bytes","sizes","bucket","log2","count","pow","round","toFixed","shortenFileName","filename","maxLength","slice","idToColorClass","id","light","fg","userId","value","hash","stringToColorHash","flagEmoji","countryCode","codePoints","toUpperCase","map","char","fromCodePoint","BAR_COLOR_DARK","messages","defineMessages","icon_title_play","defaultMessage","AudioPlayer","React","constructor","props","super","preview","this","state","canPlay","playing","currentTime","duration","longMin","initAudio","bind","initCanvas","resampleBars","visualize","handlePlay","handleSeek","handleError","audioPlayer","viewBuffer","canvasRef","componentDidMount","componentWillUnmount","oncanplay","ontimeupdate","onended","pause","componentDidUpdate","prevProps","setState","Audio","current","offsetWidth","offsetHeight","canvasContext","lineCap","effectiveWidth","lineWidth","drawFrame","requestAnimationFrame","thumbAt","max","LINE_WIDTH","beginPath","strokeStyle","x","y","color","stroke","moveTo","lineTo","arc","PI","fillStyle","fill","original","dstCount","apply","factor","amps","maxAmp","lo","hi","amp","j","a","e","preventDefault","play","target","rect","getBoundingClientRect","offset","clientX","render","playClass","short","href","onClick","title","intl","formatMessage","className","injectIntl","m","exports","createRoot","hydrateRoot","module","ReactDOM","ReactIntl","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","__webpack_modules__","call","n","getter","__esModule","d","Object","getPrototypeOf","obj","t","mode","ns","create","r","def","getOwnPropertyNames","key","definition","o","defineProperty","enumerable","get","f","chunkId","all","keys","reduce","promises","u","g","globalThis","Function","prop","prototype","hasOwnProperty","l","url","done","script","needAttach","scripts","getElementsByTagName","s","getAttribute","charset","timeout","nc","setAttribute","onScriptComplete","prev","clearTimeout","doneFns","parentNode","removeChild","fn","setTimeout","head","appendChild","Symbol","toStringTag","p","installedChunks","installedChunkData","promise","errorType","realSrc","message","request","webpackJsonpCallback","parentChunkLoadingFunction","chunkIds","moreModules","runtime","some","chunkLoadingGlobal","stringToByteArray$1","out","base64","byteToCharMap_","charToByteMap_","byteToCharMapWebSafe_","charToByteMapWebSafe_","ENCODED_VALS_BASE","ENCODED_VALS","ENCODED_VALS_WEBSAFE","HAS_NATIVE_SUPPORT","encodeByteArray","input","webSafe","init_","byteToCharMap","output","byte1","haveByte2","byte2","haveByte3","byte3","outByte1","outByte2","outByte3","outByte4","join","encodeString","decodeString","pos","c1","c2","c3","byteArrayToString","decodeStringToByteArray","charToByteMap","charAt","byte4","base64urlEncodeWithoutPadding","utf8Bytes","base64Encode","base64Decode","getDefaultsFromGlobal","self","getGlobal","__FIREBASE_DEFAULTS__","getDefaults","process","env","defaultsJsonString","JSON","parse","getDefaultsFromEnvVariable","match","cookie","decoded","getDefaultsFromCookie","info","Deferred","wrapCallback","callback","catch","isIndexedDBAvailable","indexedDB","validateIndexedDBOpenable","preExist","DB_CHECK_NAME","open","onsuccess","close","deleteDatabase","onupgradeneeded","_a","FirebaseError","code","customData","setPrototypeOf","captureStackTrace","ErrorFactory","service","serviceName","errors","fullCode","template","PATTERN","replaceTemplate","fullMessage","deepEqual","aKeys","bKeys","k","aProp","bProp","isObject","thing","getModularInstance","_delegate","Component","instanceFactory","multipleInstances","serviceProps","instantiationMode","onInstanceCreated","setInstantiationMode","setMultipleInstances","setServiceProps","setInstanceCreatedCallback","DEFAULT_ENTRY_NAME","Provider","container","component","instances","Map","instancesDeferred","instancesOptions","onInitCallbacks","identifier","normalizedIdentifier","normalizeInstanceIdentifier","has","deferred","set","isInitialized","shouldAutoInitialize","instance","getOrInitializeService","instanceIdentifier","getImmediate","options","optional","getComponent","setComponent","isComponentEager","instanceDeferred","entries","clearInstance","delete","services","from","values","filter","INTERNAL","_delete","isComponentSet","getOptions","initialize","opts","onInit","existingCallbacks","Set","add","existingInstance","invokeOnInitCallbacks","callbacks","ComponentContainer","providers","addComponent","provider","getProvider","addOrOverwriteComponent","getProviders","LogLevel","levelStringToEnum","DEBUG","VERBOSE","INFO","WARN","ERROR","SILENT","defaultLogLevel","ConsoleMethod","defaultLogHandler","logType","args","logLevel","toISOString","method","idbProxyableTypes","cursorAdvanceMethods","cursorRequestMap","WeakMap","transactionDoneMap","transactionStoreNamesMap","transformCache","reverseTransformCache","idbProxyTraps","receiver","IDBTransaction","objectStoreNames","objectStore","wrap","wrapFunction","func","IDBDatabase","transaction","IDBCursor","advance","continue","continuePrimaryKey","unwrap","storeNames","tx","sort","transformCachableValue","unlisten","removeEventListener","complete","DOMException","addEventListener","cacheDonePromiseForTransaction","object","IDBObjectStore","IDBIndex","Proxy","IDBRequest","success","promisifyRequest","newValue","openDB","version","blocked","upgrade","blocking","terminated","openPromise","oldVersion","newVersion","db","deleteDB","readMethods","writeMethods","cachedMethods","getMethod","targetFuncName","useIndex","isWrite","storeName","store","index","shift","oldTraps","PlatformLoggerServiceImpl","getPlatformInfoString","isVersionServiceProvider","library","logString","name$o","version$1","logger","_logLevel","_logHandler","_userLogHandler","val","TypeError","setLogLevel","logHandler","userLogHandler","debug","log","warn","PLATFORM_LOG_STRING","_apps","_components","_addComponent","app","_registerComponent","componentName","heartbeatController","triggerHeartbeat","ERROR_FACTORY","FirebaseAppImpl","config","_isDeleted","_options","assign","_config","_name","_automaticDataCollectionEnabled","automaticDataCollectionEnabled","_container","checkDestroyed","isDeleted","appName","initializeApp","rawConfig","existingApp","newApp","registerVersion","libraryKeyOrName","variant","libraryMismatch","versionMismatch","warning","STORE_NAME","dbPromise","getDbPromise","createObjectStore","originalErrorMessage","writeHeartbeatsToIndexedDB","heartbeatObject","put","computeKey","idbGetError","appId","HeartbeatServiceImpl","_heartbeatsCache","_storage","HeartbeatStorageImpl","_heartbeatsCachePromise","read","agent","date","getUTCDateString","lastSentHeartbeatDate","heartbeats","singleDateHeartbeat","hbTimestamp","valueOf","overwrite","heartbeatsToSend","unsentEntries","heartbeatsCache","heartbeatEntry","find","hb","dates","countBytes","pop","extractHeartbeatsForHeader","headerString","stringify","_canUseIndexedDBPromise","runIndexedDBEnvironmentCheck","readHeartbeatsFromIndexedDB","heartbeatsObject","existingHeartbeatsObject","PENDING_TIMEOUT_MS","INTERNAL_AUTH_VERSION","TOKEN_EXPIRATION_BUFFER","isServerError","getInstallationsEndpoint","projectId","extractAuthTokenInfoFromResponse","response","token","requestStatus","expiresIn","responseExpiresIn","Number","creationTime","getErrorFromResponse","requestName","errorData","json","serverCode","serverMessage","serverStatus","status","getHeaders","apiKey","Headers","Accept","getHeadersWithAuth","appConfig","refreshToken","headers","append","getAuthorizationHeader","retryIfServerError","sleep","ms","VALID_FID_PATTERN","generateFid","fidByteArray","crypto","msCrypto","getRandomValues","fid","b64String","array","substr","encode","test","getKey","fidChangeCallbacks","fidChanged","callFidChangeCallbacks","channel","getBroadcastChannel","postMessage","closeBroadcastChannel","broadcastFidChange","broadcastChannel","BroadcastChannel","onmessage","OBJECT_STORE_NAME","oldValue","remove","update","updateFn","getInstallationEntry","installations","registrationPromise","installationEntry","oldEntry","entry","registrationStatus","clearTimedOutRequest","updateOrCreateInstallationEntry","entryWithPromise","onLine","inProgressEntry","registrationTime","registeredInstallationEntry","heartbeatServiceProvider","endpoint","heartbeatService","heartbeatsHeader","getHeartbeatsHeader","body","authVersion","sdkVersion","fetch","ok","responseValue","authToken","createInstallationRequest","registerInstallation","waitUntilFidRegistration","triggerRegistrationIfNecessary","updateInstallationRequest","generateAuthTokenRequest","getGenerateAuthTokenEndpoint","installation","refreshAuthToken","forceRefresh","tokenPromise","isEntryRegistered","oldAuthToken","isAuthTokenExpired","isAuthTokenValid","updateAuthTokenRequest","waitUntilAuthTokenRequest","inProgressAuthToken","requestTime","makeAuthTokenRequestInProgressEntry","updatedInstallationEntry","fetchAuthTokenFromServer","getToken","installationsImpl","completeInstallationRegistration","getMissingValueError","valueName","INSTALLATIONS_NAME","internalFactory","getId","configKeys","keyName","extractAppConfig","DEFAULT_VAPID_KEY","CONSOLE_CAMPAIGN_ID","MessageType$1","MessageType","arrayToBase64","uint8Array","base64ToArray","base64String","repeat","rawData","outputArray","OLD_DB_NAME","OLD_OBJECT_STORE_NAME","upgradeDb","dbGet","firebaseDependencies","tokenDetails","oldTokenDetails","senderId","dbNames","databases","upgradeTransaction","contains","clear","oldDetails","auth","p256dh","fcmToken","createTime","subscriptionOptions","swScope","vapidKey","checkTokenDetails","migrateOldDatabase","dbSet","requestDeleteToken","unsubscribeOptions","getEndpoint","responseData","errorInfo","toString","getBody","web","applicationPubKey","getTokenInternal","messaging","pushSubscription","swRegistration","subscription","pushManager","getSubscription","subscribe","userVisibleOnly","applicationServerKey","getPushSubscription","scope","dbOptions","currentOptions","isVapidKeyEqual","isEndpointEqual","isAuthEqual","isP256dhEqual","isTokenValid","updatedToken","updateOptions","requestUpdateToken","updatedTokenDetails","deleteTokenInternal","updateToken","getNewToken","dbRemove","unsubscribe","subscribeOptions","requestGetToken","externalizePayload","internalPayload","payload","collapseKey","collapse_key","messageId","fcmMessageId","messagePayloadInternal","notification","image","icon","propagateNotificationPayload","propagateDataPayload","_b","_c","_d","_e","fcmOptions","click_action","link","analyticsLabel","analytics_label","propagateFcmOptions","_mergeStrings","s1","s2","resultArray","MessagingService","analyticsProvider","deliveryMetricsExportedToBigQueryEnabled","onBackgroundMessageHandler","onMessageHandler","logEvents","isLogServiceStarted","messagingSenderId","registerDefaultSw","serviceWorker","register","browserErrorMessage","getToken$1","Notification","permission","requestPermission","updateVapidKey","ServiceWorkerRegistration","updateSwReg","serviceWorkerRegistration","logToScion","messageType","eventType","NOTIFICATION_CLICKED","PUSH_RECEIVED","getEventType","logEvent","message_id","message_name","message_time","message_device_time","messageEventListener","isFirebaseMessaging","next","dataPayload","WindowMessagingInternalFactory","isWindowSupported","cookieEnabled","PushSubscription","getMessagingInWindow","isSupported","deleteToken","deleteToken$1","onMessage","nextOrObserver","onMessage$1","Tinode","Alert","content","onReject","FormattedMessage","onConfirm","confirm","clear_messages","clear_for_all","delete_for_all","send_retry","mute","unmute","reply","forward","edit","topic_delete","topic_delete_warning","delete_messages_warning","unblock","block","topic_block_warning","member_delete","archive","unarchive","edit_permissions","clear_messages_warning","ContextMenu","selfRef","handlePageClick","handleEscapeKey","handleClick","MenuItems","handler","params","errorHandler","onShowAlert","deleteMessages","retryMessage","replyToMessage","editMessage","topicPermissionSetter","ctrl","onTopicRemoved","topicName","topic","tinode","getTopic","delTopic","user","delSubscription","stopPropagation","hide","keyCode","currentTarget","dataset","onAction","hard","cancelSend","seq","delMessagesAll","delMessagesEdits","delMessagesList","flushMessage","msg","createMessage","publishDraft","updateMode","pickReply","userFrom","userName","menu","hSize","vSize","position","bounds","right","clickAt","bottom","style","icon_mapping","ContactBadges","badges","updateFavicon","oldIcon","getElementById","newIcon","rel","theCard","imageUrl","imageMimeType","note","card","trim","mimeType","matches","exec","arrayEqual","sanitizeUrl","allowedSchemes","schemes","RegExp","sanitizeUrlForMime","mimeMajor","sanitizedUrl","deliveryMarker","received","cancelablePromise","hasCanceled","isCanceled","cancel","clipStr","LetterTile","avatar","isGroup","iconColor","letter","deleted","authorizeURL","alt","UnreadBadge","CallMessage","isCallDropped","callState","successClass","callIcon","incoming","CallStatus","icon2","InlineVideo","videoRef","LazyImage","isvideo","padding","whenDone","FileProgress","progress","onCancel","UploadingImage","onCancelUpload","drafty_form","drafty_attachment","drafty_image","drafty_video","drafty_unknown","fullFormatter","stack","quoteFormatter","el","Drafty","attr","loading","handleImageData","onFormButtonClick","inner","child","onQuoteClick","handleVideoData","concat","viewportWidth","minWidth","minHeight","onImagePreview","onVideoPreview","previewFormatter","inlineImageAttr","inlineVideoAttr","quoteImageOrVideo","isVideo","premime","preref","evt","statusText","scaled","replyFormatter","loadedPromise","Contact","handleContextClick","onSelected","showContextMenu","pageY","pageX","online","icon_badges","isVerified","isStaff","isDangerous","acs","showMode","getMode","isMuted","isJoiner","previewIsResponse","marker","titleClass","showCheckmark","selected","showOnline","isChannel","unread","small","comment","ContactAction","action","badge_you","badge_owner","ContactList","topicSelected","contactNodes","contactsCount","contacts","filterFunc","filterOn","private","toLowerCase","public","myUserId","isOwner","forwarded","deliveryStatus","latestMessage","_status","msgStatus","showUnread","connected","trusted","verified","staff","danger","_deleted","onTopicSelected","noScroll","dangerouslySetInnerHTML","__html","emptyListMessage","SearchContacts","edited","search","handleSearchChange","handleSearch","handleClear","handleKeyDown","onSearchContacts","query","placeholder","onChange","onKeyDown","required","autoFocus","ForwardDialog","handleClose","handleSearchContacts","handleContactSelected","onInitFind","uid","searchResults","isWriter","desription","search_placeholder","not_found_placeholder","badge_verified","badge_staff","badge_danger","BadgeList","trustedBadges","CALL_HEAD_STARTED","RING_SOUND","CallIncoming","fullName","previousMetaDesc","resetDesc","onMetaDesc","handleRejectCall","handleAcceptCall","ringTimer","setInterval","onRinging","clearInterval","desc","onAcceptCall","onClose","LoadSpinner","large","centered","show","AvatarUpload","source","handleFileReceived","files","onImageUpdated","randId","random","readOnly","accept","htmlFor","uploading","CheckBox","handleChange","checked","iconName","classList","attrs","MenuCancel","ErrorPanel","level","onClearError","text","whiteSpace","actionText","Chip","handleCancel","invalid","noAvatar","ChipInput","deriveStateFromProps","focused","handleTextInput","removeChipAt","handleChipCancel","handleFocusGained","handleFocusLost","static","chips","prompt","sortedChips","sortChips","staticMembers","chipIndex","indexChips","prevState","keep","normal","removed","onChipRemoved","onFocusLost","onEnter","avatarDisabled","tabIndex","onFocus","onBlur","no_contacts","contacts_not_found_short","GroupManager","members","indexMembers","keepInitialMembers","requiredMember","contactFilter","noContactsMessage","selectedContacts","handleMemberRemoved","handleContactFilter","handleSubmit","delta","present","keepInitial","stat","sel","splice","added","onSubmit","doContactFiltering","joiner","writer","preser","approver","sharer","deleter","owner","PermissionsEditor","names","skip","compare","userTitle","userAvatar","modeTitle","compareTitle","Cropper","panX","panY","originX","originY","zoom","minZoom","maxZoom","overlay","cutout","boundingBox","imageWidth","imageHeight","mouseX","mouseY","prevDistance","cutoutRect","bBoxRect","initScaling","onZoom","handleZoom","mouseDown","mouseUp","mouseMove","mouseTouch","positionAll","translate","passive","currPan","nextDiff","imgRect","imgLeft","imgRight","coLeft","coRight","imgTop","imgBottom","coTop","coBottom","touches","dX","dY","checkBound","touch0","touch1","distance","sqrt","t3d","orig","transform","transformOrigin","onLoad","step","AvatarCrop","VisiblePassword","inputRef","visible","handleVisibility","handeTextChange","handleEditingFinished","focus","onFinished","activeElement","autoComplete","InPlaceEdit","active","initialValue","handleStartEditing","handlePasswordFinished","checkValidity","spanText","spanClass","multiline","element","rows","TagManager","tags","tagInput","activated","handleTagInput","handleAddTag","handleRemoveTag","nextProps","last","tag","maxTagCount","getServerParam","onTagsChanged","minTagLength","maxTagLength","add_tags_prompt","TopicDescEdit","getAccessMode","isMe","description","newAvatar","newAvatarMime","previousOnTags","tnNewTags","handleFullNameUpdate","handleImageUpdated","handleAvatarCropped","handleAvatarCropCancel","uploadAvatar","handlePrivateUpdate","handleDescriptionUpdate","handleTagsUpdated","onTagsUpdated","onUpdateTopicDesc","readyToUpload","getLargeFileHelper","upload","du","onUpdateTags","editable","full_name_placeholder","group_name_placeholder","private_placeholder","title_tag_manager","TopicCommon","credentials","getCredentials","addCredActive","addCredInvalid","newCred","previousTagsUpdated","tnCredsUpdated","handleCredChange","handleCredKeyDown","handleCredEntered","onCredsUpdated","getType","creds","asPhone","asEmail","onCredAdd","onUpdateTagsRequest","cred","meth","onCredConfirm","onCredDelete","phone_or_email_prompt","delete_messages","leave_chat","leave_chat_warning","block_contact","block_contact_warning","report_chat","report_chat_warning","other_user","TopicSecurity","handleDeleteTopic","handleDeleteMessages","handleLeave","handleBlock","handleReport","onDeleteTopic","onDeleteMessages","onLeaveTopic","onBlockTopic","onReportTopic","groupTopic","onLaunchPermissionsEditor","access","anon","modeGiven2","general","security","crop","perm_want","perm_given","perm_auth","perm_anon","perm_user","InfoView","admin","muted","address","selectedContact","modeGiven","modeWant","modeWant2","contactList","previousSubsUpdated","resetSubs","resetTags","onSubsUpdated","handleImageChanged","handleMuted","handleUnarchive","handlePermissionsChanged","handleLaunchPermissionsEditor","handleShowAddMembers","handleMemberUpdateRequest","handleMemberSelected","handleContextMenu","handleBackNavigate","newState","user2","subscriber","getGiven","getWant","subscribers","sub","defacs","getDefaultAccess","isAdmin","isSharer","isDeleter","archived","isArchived","isGroupType","isChannelType","chan","getMeta","startMetaQuery","withTags","build","subs","onTopicDescUpdate","ignored","onChangePermissions","ignored2","onTopicUnArchive","which","perm","onTopicDescUpdateRequest","userPermissionsEdited","toEdit","toCompare","toSkip","titleEdit","titleCompare","AccessMode","userPermissionsTitle","userPermissionsAvatar","editedPermissions","immutablePermissions","editedPermissionsTitle","immutablePermissionsTitle","editedPermissionsSkipped","onNavigate","onMemberUpdateRequest","panel","menuItems","view","panelTitle","displayMobile","errorLevel","errorText","searchableContacts","onTopicTagsUpdateRequest","no_members","loop","CALL_ENDED_SOUND","DIALING_SOUND","VIDEO_MUTED_EVENT","VIDEO_UNMUTED_EVENT","already_in_call","CallPanel","localStream","remoteStream","pc","dataChannel","previousOnInfo","waitingForPeer","callInitialSetupComplete","audioOnly","callAudioOnly","videoToggleInProgress","remoteVideoLive","localStreamConstraints","audio","video","isOutgoingCall","localRef","remoteRef","remoteIceCandidatesCache","onInfo","start","stop","createPeerConnection","canSendOffer","drainRemoteIceCandidatesCache","handleNegotiationNeededEvent","handleICECandidateEvent","handleNewICECandidateMsg","handleICEConnectionStateChangeEvent","handleSignalingStateChangeEvent","handleICEGatheringStateChangeEvent","handleIceCandidateErrorEvent","handleTrackEvent","handleVideoOfferMsg","handleVideoAnswerMsg","reportError","handleGetUserMediaError","stopTracks","disconnectMedia","handleCloseClick","handleToggleCameraClick","handleToggleMicClick","handleRemoteHangup","handleVideoCallAccepted","muteVideo","unmuteVideo","emptyVideoTrack","handleDataChannelEvent","handleDataChannelError","handleDataChannelMessage","handleDataChannelOpen","handleDataChannelClose","stream","getTracks","track","addTrack","enabled","removeTrack","what","fillRect","captureStream","getVideoTracks","mediaDevices","getUserMedia","srcObject","onInvite","ontrack","onremovetrack","onremovestream","onicecandidate","oniceconnectionstatechange","onsignalingstatechange","onicegatheringstatechange","onnegotiationneeded","onicecandidateerror","ondatachannel","tracks","send","onopen","onclose","iceServers","RTCPeerConnection","createDataChannel","ordered","RTCSessionDescription","setRemoteDescription","createOffer","offer","setLocalDescription","onSendOffer","localDescription","toJSON","candidate","onIceCandidate","RTCIceCandidate","addIceCandidate","iceConnectionState","signalingState","streams","dummyVideo","createAnswer","answer","onSendAnswer","onHangup","sender","getSenders","replaceTrack","finally","readyState","getAudioTracks","forceUpdate","audioTracks","videoTracks","disabled","audioIcon","videoIcon","peerTitle","pulseAnimation","remoteActive","rstream","autoPlay","playsInline","Attachment","downloader","downloadFile","mimetype","download","loaded","helperFunc","isUrlRelative","downloadUrl","downloadWidget","message_sending","message_sending_failed","message_edited_marker","ReceivedMarker","timestamp","timeStyle","BaseChatMessage","uploader","onProgress","handleProgress","handleExpandImage","handlePlayVideo","handleFormButtonClick","handleCancelUpload","handleQuoteClick","formatterContext","onExpandMedia","resp","act","onFormResponse","userIsWriter","immutable","_0","_1","tp","parseInt","ratio","replyToSeq","sideClass","sequence","bubbleClass","fullDisplay","attachments","att","tree","innerRef","IntlChatMessage","AudioRecorder","messaging_disabled","type_new_message","add_image_caption","file_attachment_too_large","cannot_initiate_upload","icon_title_record_voice","icon_title_attach_file","icon_title_add_image","icon_title_send","SendMessage","quote","audioRec","audioAvailable","keypressTimestamp","handlePasteEvent","handleAttachImage","handleAttachFile","handleAttachAudio","handleSend","handleKeyPress","handleMessageTyping","handleDropAttach","formatReply","messageEditArea","getComputedStyle","getPropertyValue","initMessage","scrollTop","scrollHeight","setSelectionRange","onAttachImage","onAttachFile","onAttachAudio","acceptBlank","noInput","onSendMessage","shiftKey","onKeyPress","messagePrompt","sendIcon","editing","onCancelReply","audioEnabled","attachImage","click","attachFile","Suspense","fallback","onRecordingProgress","onDeleted","display","DocPreview","handleSendDoc","caption","mimeToIcon","default","iconFromMime","GroupSubs","usersOnline","totalCount","countToShow","overflow","ImagePreview","handleSendImage","assignWidth","node","maxlength","Invitation","handleButtonAction","LogoView","serverVersion","serverAddress","MetaMessage","unrecognized_video_format","VideoPreview","handleSendVideo","videoWidth","videoHeight","controlist","controls","controlsList","disablePictureInPicture","poster","HashNavigation","parts","path","arg","eq","decodeURIComponent","location","encodeURIComponent","parsed","parseUrlHash","composeUrlHash","sidepanel","infopanel","online_now","last_seen","not_found","invalid_content","editing_message","drag_file","isUnconfirmed","ex","getExcessive","isPeerRestricted","getMissing","shouldPresentCallPanel","MessagesView","getDerivedStateFromProps","leave","sendMessage","retrySend","sendImageAttachment","sendVideoAttachment","sendFileAttachment","sendAudioAttachment","sendKeyPress","handleScrollReference","mountDnDEvents","handleScrollEvent","handleDescChange","handleSubsUpdated","handleMessageUpdate","handleAllMessagesReceived","handleInfoReceipt","handleExpandMedia","handleClosePreview","handleFormResponse","handleShowMessageContextMenu","handleNewChatAcceptance","handleEnablePeer","handleAttachImageOrVideo","postReadNotification","clearNotificationQueue","goToLatestMessage","handleFileDrop","handlePickReply","handleEditMessage","handleCancelReply","handleCallHangup","isDragEnabled","handleDragIn","handleDragOut","handleDrag","handleDrop","chatMessageRefs","getOrCreateMessageRef","dragCounter","dndRef","readNotificationQueue","readNotificationTimer","keyPressTimer","seqId","messagesScroller","messageCount","scrollPosition","rtcPanel","callSeq","onData","onAllMessagesReceived","onPres","applicationVisible","ready","_new","isP2PType","withDesc","nextState","docPreview","imagePreview","imagePostview","videoPreview","videoPostview","typingIndicator","fetchingMessages","showGoToLastButton","contentToEdit","dragging","forwardMessage","onlineSubs","peer","p2pPeerDesc","peerMessagingDisabled","latestClearId","maxClearId","callTopic","isReader","readingBlocked","unconformed","unconfirmed","isSubscribed","newTopic","newTopicParams","_topicName","getQuery","withLaterDesc","withLaterSub","withLaterData","withLaterDel","setQuery","navigateTo","setUrlTopic","onNewTopicCreated","calls","queuedMessages","pub","_sending","webrtc","blankState","oldTopicName","isTopicCached","oldTopic","msgHasMoreMessages","getMessagesPage","dnd","sendAt","noteRead","setMilliseconds","getMilliseconds","isNewMessage","searchParams","messageSpecificMenuItems","onNewChat","noteRecording","noteKeyPress","uploadCompletionPromise","maxInbandAttachmentSize","urlPromise","maxExternAttachmentSize","limit","onVideoCallClosed","onCallHangup","_tempPreview","videoBlob","previewBlob","uploads","b64s","v64","i64","b64conv","found","findMessage","_cancelled","senderName","onCancelForwardMessage","scrollIntoView","behavior","dataTransfer","clearData","hideSelf","component2","onCallInvite","onCallSendOffer","onCallIceCandidate","onCallSendAnswer","messageNodes","previousFrom","prevDate","chatBoxClass","nextFrom","thisFrom","isReply","userDesc","isNaN","thisDate","ts","toDateString","isChan","_uploader","lastSeen","cont","getMeTopic","getContact","seen","when","messagesComponent","onHideMessagesView","ButtonBack","onBack","MenuContacts","onNewTopic","onSettings","MenuStart","onSignUp","SideNavbar","_clip","AccountSettingsView","me","archived_contacts_title","ContactsView","handleAction","unreadThreads","archivedCount","chatList","arch","touched","action_ignored","onShowArchive","LocalStorageUtil","localStorage","setItem","getItem","oldVal","getObject","setObject","removeItem","PhoneEdit","CreateAccountView","login","password","email","tel","uploadUrl","errorCleared","buttonDisabled","saveToken","handleLoginChange","handlePasswordChange","handleEmailChange","handlePhoneChange","handleFnChange","handleToggleSaveToken","connect","number","onCreateAccount","submitClasses","login_prompt","password_prompt","full_name_prompt","email_prompt","onShowCountrySelector","stay_logged_in","EditAccountView","handleCheckboxClick","onToggleMessageSounds","onTogglePushNotifications","onToggleIncognitoMode","messageSounds","desktopAlertsEnabled","desktopAlerts","incognitoMode","delete_account","delete_account_warning","AccSecurityView","blockedCount","showPermissionEditorFor","handlePasswordUpdate","handleHidePermissionsEditor","handleDeleteAccount","pwd","onUpdatePassword","onUpdateAccountDesc","onDeleteAccount","password_unchanged","onLogout","onShowBlocked","AccSupportView","LoginView","hostName","persist","onPersistenceChange","onLogin","autoCorrect","autoCapitalize","invalid_id","NewTopicById","groupId","prefix","NewTopicGroup","handleFieldEdit","handleTagsChanged","handleChannelToggle","search_for_contacts","search_no_results","NewTopicView","tabSelected","searchQuery","handleTabClick","handleSearchResultSelected","handleNewGroupSubmit","handleGroupByID","addUrlParam","removeUrlParam","onCreateTopic","dataUrl","priv","no_contacts_placeholder","PasswordResetView","sent","haveCode","handleCodeChange","handleShowCodeField","scheme","onReset","secret","onRequest","showCredentialInput","showPasswordInput","passwordInput","emailInput","phoneInput","sentNotification","phone","codeInput","numbers_only","credentialInput","marginRight","HostSelector","changed","handleHostNameChange","onServerAddressChange","hostOptions","list","SettingsView","transport","secureConnection","handleTransportSelected","handleServerAddressChange","handleToggleSecure","onUpdate","ws","lp","transportOptions","ValidationView","credCode","codeReceived","credMethod","credToken","settings","notif","support","newtpk","reset","SidepanelView","handleNewTopic","errorAction","errorActionText","loadSpinnerVisible","loginDisabled","onLoginRequest","onGlobalSettings","onUpdateAccountTags","onValidateCredentials","onPasswordResetRequest","onResetPassword","detectServerAddress","host","protocol","hostname","port","isSecureConnection","PhoneCountrySelector","POP_SOUND","reconnect_countdown","reconnect_now","push_init_failed","invalid_security_token","no_connection","code_doesnot_match","menu_item_info","menu_item_audio_call","menu_item_video_call","cred_confirmed_successfully","TinodeWeb","getBlankState","handleResize","handleHashRoute","handleOnline","checkForAppUpdate","handleVisibilityEvent","handleLoginRequest","handlePersistenceChange","handleConnected","handleAutoreconnectIteration","doLogin","handleLoginSuccessful","handleDisconnect","tnMeMetaDesc","tnMeContactUpdate","tnMeSubsUpdated","resetContactList","tnInitFind","tnFndSubsUpdated","handleTopicSelected","handleHideMessagesView","handleSendMessage","handleNewChatInvitation","handleNewAccount","handleNewAccountRequest","handleUpdatePasswordRequest","handleUpdateAccountTagsRequest","handleToggleIncognitoMode","handleSettings","handleGlobalSettings","handleShowArchive","handleShowBlocked","handleToggleMessageSounds","handleCredAdd","handleCredDelete","handleCredConfirm","initFCMessaging","toggleFCMToken","handlePushMessage","handleSidepanelCancel","handleStartTopicRequest","handleNewTopicCreated","handleTopicUpdateRequest","handleChangePermissions","handleTagsUpdateRequest","handleLogout","handleDeleteTopicRequest","handleDeleteMessagesRequest","handleLeaveUnsubRequest","handleBlockTopicRequest","handleReportTopic","handleShowContextMenu","defaultTopicContextMenu","handleHideContextMenu","handleShowAlert","handleShowInfoView","handleValidateCredentialsRequest","handlePasswordResetRequest","handleResetPassword","handleContextMenuAction","handleShowCountrySelector","handleShowForwardDialog","handleHideForwardDialog","handleStartVideoCall","handleStartAudioCall","handleInfoMessage","handleDataMessage","handleCallClose","handleCallInvite","handleCallRinging","handleCallSendOffer","handleCallIceCandidate","handleCallSendAnswer","handleCallAccept","sendMessageToTopic","callTimeoutTimer","autoLogin","messageSoundsOff","firebaseInitApp","FIREBASE_INIT","firebaseToken","hidden","sidePanelSelected","sidePanelTitle","sidePanelAvatar","myTrustedBadges","liveConnection","topicSelectedOnline","topicSelectedAcs","innerWidth","infoPanel","mobilePanel","callShouldStart","contextMenuVisible","contextMenuBounds","contextMenuClickAt","contextMenuParams","contextMenuItems","forwardDialogVisible","alertVisible","alertParams","requestedTopic","documentElement","clientWidth","viewportHeight","clientHeight","tnSetup","onConnect","onDisconnect","onAutoreconnectIteration","onInfoMessage","onDataMessage","parsedNav","expires","setAuthToken","readTimer","readTimerCallback","cred_done","persistentCache","onSetupCompleted","secure","setHumanLanguage","enableLogging","oobNotification","updateObject","fcm","firebaseGetMessaging","getRegistration","reg","installing","requestFCMToken","setDeviceToken","firebaseOnMessage","sw","firebaseGetToken","messagingVapidKey","mobile","onupdatefound","installingWorker","onstatechange","controller","newTopicTabSelected","tab","getTopicAccessMode","stateForError","reconnectCountdown","reconnect","isConnected","initStorage","clearStorage","getServerInfo","ver","prom","fmtTime","tmpToken","isAuthenticated","getAuthToken","loginPromise","connectionPromise","loginBasic","loginToken","navigateToCredentialsView","goToTopic","onContactUpdate","getCurrentUserID","withCred","disconnect","urlHash","setUrlSidePanel","isPresencer","unused","foundContacts","merged","updated","past","prepareSearchableContacts","fnd","getFndTopic","withSub","setMeta","isTopicOnline","completion","subscribePromise","publishMessage","am","updateWant","login_","password_","public_","cred_","tags_","createAccountBasic","on","firebaseDelToken","delCredential","basicNavigator","infoNavigator","setUrlInfoPanel","newGroupTopicName","oldName","newName","updateAccountBasic","getCurrentLogin","updateGiven","cleared","Promose","delCurrentUser","report","header","msgPreview","self_blocked","subscribed","keepForwardedMessage","confirmText","rejectText","invite","requestResetAuthSecret","newPassword","tempAuth","dial","selectedCallback","aonly","videoCall","sdp","latestMsgVersion","myUserName","onAddMember","handleManageGroupMembers","measurementId","gtag","dataLayer","arguments","prepend","messageLoader","hl","languages","normalized","baseLanguage","htmlLang","root","IntlProvider","textComponent"],"sourceRoot":""}
\ No newline at end of file
+{"version":3,"file":"index.prod.js","mappings":"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AAK,UAAU,GAAK,YAAY,GAAK,YAAY,GAAK,YAAY,GAAK,aAAa,GAAK,WAAW,GAAK,aAAa,GAAK,YAAY,GAAK,UAAU,GAAK,WAAW,GAAK,WAAW,GAAK,YAAY,GAAK,WAAW,GAAK,YAAY,GAAK,YAAY,GAAK,YAAY,GAAK,YAAY,GAAK,aAAa,GAAK,aAAa,GAAK,UAAU,GAAK,aAAa,GAAK,aAAa,GAAK,UAAU,GAAK,aAAa,GAAK,aAAa,GAAK,aAAa,GAAK,YAAY,GAAK,aAAa,GAAK,YAAY,GAAK,YAAY,GAAK,WAAW,GAAK,WAAW,GAAK,UAAU,GAAK,aAAa,GAAK,aAAa,GAAK,aAAa,GAAK,WAAW,GAAK,aAAa,GAAK,aAAa,GAAK,aAAa,GAAK,WAAW,GAAK,aAAa,GAAK,YAAY,GAAK,YAAY,GAAK,YAAY,GAAK,WAAW,GAAK,WAAW,GAAK,YAAY,GAAK,WAAW,GAAK,YAAY,GAAK,YAAY,GAAK,YAAY,GAAK,WAAW,GAAK,WAAW,GAAK,YAAY,GAAK,YAAY,GAAK,UAAU,GAAK,WAAW,GAAK,WAAW,GAAK,WAAW,GAAK,WAAW,GAAK,WAAW,GAAK,aAAa,GAAK,YAAY,GAAK,WAAW,GAAK,aAAa,GAAK,WAAW,GAAK,WAAW,GAAK,UAAU,GAAK,YAAY,GAAK,cAAc,GAAK,YAAY,GAAK,YAAY,GAAK,YAAY,GAAK,SAAS,GAAK,WAAW,GAAK,SAAS,GAAK,aAAa,GAAK,WAAW,GAAK,YAAY,GAAK,WAAW,GAAK,aAAa,GAAK,UAAU,GAAK,UAAU,GAAK,YAAY,GAAK,WAAW,GAAK,WAAW,GAAK,YAAY,GAAK,WAAW,GAAK,WAAW,GAAK,aAAa,GAAK,aAAa,GAAK,YAAY,GAAK,SAAS,GAAK,aAAa,GAAK,YAAY,GAAK,YAAY,GAAK,UAAU,GAAK,YAAY,GAAK,WAAW,GAAK,YAAY,GAAK,YAAY,GAAK,YAAY,GAAK,aAAa,GAAK,YAAY,GAAK,YAAY,GAAK,UAAU,GAAK,UAAU,GAAK,YAAY,GAAK,YAAY,GAAK,WAAW,GAAK,QAAQ,GAAK,WAAW,GAAK,WAAW,GAAK,YAAY,GAAK,WAAW,GAAK,WAAW,GAAK,YAAY,GAAK,WAAW,GAAK,UAAU,G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,MAAM,GAAK,CAAC,MAAM,GAAK,CAAC,MAAM,GAAK,CAAC,MAAM,GAAK,CAAC,MAAM,GAAK,CAAC,MAAM,GAAK,CAAC,MAAM,GAAK,CAAC,MAAM,GAAK,CAAC,MAAM,GAAK,CAAC,MAAM,GAAK,CAAC,KAAK,KAAK,MAAM,GAAK,CAAC,MAAM,GAAK,CAAC,MAAM,GAAK,CAAC,MAAM,GAAK,CAAC,MAAM,GAAK,CAAC,MAAM,GAAK,CAAC,MAAM,GAAK,CAAC,MAAM,GAAK,CAAC,MAAM,GAAK,CAAC,MAAM,GAAK,CAAC,MAAM,GAAK,CAAC,MAAM,GAAK,CAAC,MAAM,GAAK,CAAC,MAAM,GAAK,CAAC,MAAM,GAAK,CAAC,MAAM,GAAK,CAAC,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,KAAK,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,KAAK,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,KAAK,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,KAAK,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,KAAK,KAAK,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,KAAK,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC,MAAM,IAAM,CAAC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","sources":["webpack://tinode-webapp/webpack/runtime/create fake namespace object","webpack://tinode-webapp/webpack/runtime/load script","webpack://tinode-webapp/./src/config.js","webpack://tinode-webapp/./src/lib/blob-helpers.js","webpack://tinode-webapp/./src/lib/strformat.js","webpack://tinode-webapp/./src/version.js","webpack://tinode-webapp/./src/widgets/audio-player.jsx","webpack://tinode-webapp/./node_modules/libphonenumber-js/es6/getExampleNumber.js","webpack://tinode-webapp/./node_modules/libphonenumber-js/examples.mobile.json.js","webpack://tinode-webapp/./src/widgets/phone-edit.jsx","webpack://tinode-webapp/./node_modules/libphonenumber-js/mobile/exports/getExampleNumber.js","webpack://tinode-webapp/./node_modules/react-dom/client.js","webpack://tinode-webapp/external var \"React\"","webpack://tinode-webapp/external var \"ReactDOM\"","webpack://tinode-webapp/external var \"ReactIntl\"","webpack://tinode-webapp/./node_modules/libphonenumber-js/es6/helpers/getPossibleCountriesForNumber.js","webpack://tinode-webapp/./node_modules/libphonenumber-js/es6/helpers/formatNationalNumberUsingFormat.js","webpack://tinode-webapp/./node_modules/libphonenumber-js/es6/helpers/applyInternationalSeparatorStyle.js","webpack://tinode-webapp/./node_modules/libphonenumber-js/es6/helpers/getIddPrefix.js","webpack://tinode-webapp/./node_modules/libphonenumber-js/es6/format_.js","webpack://tinode-webapp/./node_modules/libphonenumber-js/es6/PhoneNumber.js","webpack://tinode-webapp/./node_modules/libphonenumber-js/es6/validate_.js","webpack://tinode-webapp/./node_modules/libphonenumber-js/es6/constants.js","webpack://tinode-webapp/./node_modules/libphonenumber-js/es6/helpers/RFC3966.js","webpack://tinode-webapp/./node_modules/libphonenumber-js/es6/helpers/mergeArrays.js","webpack://tinode-webapp/./node_modules/libphonenumber-js/es6/helpers/checkNumberLength.js","webpack://tinode-webapp/./node_modules/libphonenumber-js/es6/helpers/extension/createExtensionPattern.js","webpack://tinode-webapp/./node_modules/libphonenumber-js/es6/helpers/getNumberType.js","webpack://tinode-webapp/./node_modules/libphonenumber-js/es6/helpers/isViablePhoneNumber.js","webpack://tinode-webapp/./node_modules/libphonenumber-js/es6/helpers/matchesEntirely.js","webpack://tinode-webapp/./node_modules/libphonenumber-js/es6/isPossibleNumber_.js","webpack://tinode-webapp/./node_modules/libphonenumber-js/es6/tools/semver-compare.js","webpack://tinode-webapp/./node_modules/libphonenumber-js/es6/metadata.js","webpack://tinode-webapp/./node_modules/libphonenumber-js/es6/ParseError.js","webpack://tinode-webapp/./node_modules/libphonenumber-js/es6/helpers/extension/extractExtension.js","webpack://tinode-webapp/./node_modules/libphonenumber-js/es6/helpers/parseDigits.js","webpack://tinode-webapp/./node_modules/libphonenumber-js/es6/parseIncompletePhoneNumber.js","webpack://tinode-webapp/./node_modules/libphonenumber-js/es6/helpers/stripIddPrefix.js","webpack://tinode-webapp/./node_modules/libphonenumber-js/es6/helpers/extractNationalNumber.js","webpack://tinode-webapp/./node_modules/libphonenumber-js/es6/helpers/extractNationalNumberFromPossiblyIncompleteNumber.js","webpack://tinode-webapp/./node_modules/libphonenumber-js/es6/helpers/extractCountryCallingCode.js","webpack://tinode-webapp/./node_modules/libphonenumber-js/es6/helpers/extractCountryCallingCodeFromInternationalNumberWithoutPlusSign.js","webpack://tinode-webapp/./node_modules/libphonenumber-js/es6/helpers/getCountryByNationalNumber.js","webpack://tinode-webapp/./node_modules/libphonenumber-js/es6/helpers/getCountryByCallingCode.js","webpack://tinode-webapp/./node_modules/libphonenumber-js/es6/parse_.js","webpack://tinode-webapp/./node_modules/libphonenumber-js/es6/parsePhoneNumber_.js","webpack://tinode-webapp/./node_modules/libphonenumber-js/es6/parsePhoneNumber.js","webpack://tinode-webapp/./node_modules/libphonenumber-js/mobile/exports/parsePhoneNumberWithError.js","webpack://tinode-webapp/./node_modules/libphonenumber-js/metadata.mobile.json.js","webpack://tinode-webapp/./node_modules/libphonenumber-js/mobile/exports/withMetadataArgument.js","webpack://tinode-webapp/webpack/bootstrap","webpack://tinode-webapp/webpack/runtime/compat get default export","webpack://tinode-webapp/webpack/runtime/define property getters","webpack://tinode-webapp/webpack/runtime/ensure chunk","webpack://tinode-webapp/webpack/runtime/get javascript chunk filename","webpack://tinode-webapp/webpack/runtime/global","webpack://tinode-webapp/webpack/runtime/hasOwnProperty shorthand","webpack://tinode-webapp/webpack/runtime/make namespace object","webpack://tinode-webapp/webpack/runtime/publicPath","webpack://tinode-webapp/webpack/runtime/jsonp chunk loading","webpack://tinode-webapp/./node_modules/@firebase/util/dist/index.esm2017.js","webpack://tinode-webapp/./node_modules/@firebase/component/dist/esm/index.esm2017.js","webpack://tinode-webapp/./node_modules/@firebase/logger/dist/esm/index.esm2017.js","webpack://tinode-webapp/./node_modules/idb/build/wrap-idb-value.js","webpack://tinode-webapp/./node_modules/idb/build/index.js","webpack://tinode-webapp/./node_modules/@firebase/app/dist/esm/index.esm2017.js","webpack://tinode-webapp/./node_modules/firebase/app/dist/esm/index.esm.js","webpack://tinode-webapp/./node_modules/@firebase/installations/dist/esm/index.esm2017.js","webpack://tinode-webapp/./node_modules/@firebase/messaging/dist/esm/index.esm2017.js","webpack://tinode-webapp/external var \"Tinode\"","webpack://tinode-webapp/./src/widgets/alert.jsx","webpack://tinode-webapp/./src/widgets/context-menu.jsx","webpack://tinode-webapp/./src/widgets/contact-badges.jsx","webpack://tinode-webapp/./src/lib/utils.js","webpack://tinode-webapp/./src/widgets/letter-tile.jsx","webpack://tinode-webapp/./src/widgets/unread-badge.jsx","webpack://tinode-webapp/./src/widgets/call-message.jsx","webpack://tinode-webapp/./src/widgets/call-status.jsx","webpack://tinode-webapp/./src/widgets/inline-video.jsx","webpack://tinode-webapp/./src/widgets/lazy-image.jsx","webpack://tinode-webapp/./src/widgets/file-progress.jsx","webpack://tinode-webapp/./src/widgets/uploading-image.jsx","webpack://tinode-webapp/./src/lib/formatters.js","webpack://tinode-webapp/./src/widgets/contact.jsx","webpack://tinode-webapp/./src/widgets/contact-action.jsx","webpack://tinode-webapp/./src/widgets/contact-list.jsx","webpack://tinode-webapp/./src/widgets/search-contacts.jsx","webpack://tinode-webapp/./src/widgets/forward-dialog.jsx","webpack://tinode-webapp/./src/widgets/badge-list.jsx","webpack://tinode-webapp/./src/constants.js","webpack://tinode-webapp/./src/widgets/call-incoming.jsx","webpack://tinode-webapp/./src/widgets/load-spinner.jsx","webpack://tinode-webapp/./src/widgets/avatar-upload.jsx","webpack://tinode-webapp/./src/widgets/checkbox.jsx","webpack://tinode-webapp/./src/widgets/menu-cancel.jsx","webpack://tinode-webapp/./src/widgets/error-panel.jsx","webpack://tinode-webapp/./src/widgets/chip.jsx","webpack://tinode-webapp/./src/widgets/chip-input.jsx","webpack://tinode-webapp/./src/widgets/group-manager.jsx","webpack://tinode-webapp/./src/widgets/permissions-editor.jsx","webpack://tinode-webapp/./src/widgets/cropper.jsx","webpack://tinode-webapp/./src/widgets/avatar-crop.jsx","webpack://tinode-webapp/./src/widgets/visible-password.jsx","webpack://tinode-webapp/./src/widgets/in-place-edit.jsx","webpack://tinode-webapp/./src/widgets/tag-manager.jsx","webpack://tinode-webapp/./src/widgets/topic-desc-edit.jsx","webpack://tinode-webapp/./src/views/topic-common-view.jsx","webpack://tinode-webapp/./src/widgets/topic-security.jsx","webpack://tinode-webapp/./src/views/info-view.jsx","webpack://tinode-webapp/./src/widgets/call-panel.jsx","webpack://tinode-webapp/./src/widgets/attachment.jsx","webpack://tinode-webapp/./src/widgets/received-marker.jsx","webpack://tinode-webapp/./src/widgets/chat-message.jsx","webpack://tinode-webapp/./src/widgets/send-message.jsx","webpack://tinode-webapp/./src/widgets/doc-preview.jsx","webpack://tinode-webapp/./src/widgets/group-subs.jsx","webpack://tinode-webapp/./src/widgets/image-preview.jsx","webpack://tinode-webapp/./src/widgets/invitation.jsx","webpack://tinode-webapp/./src/views/logo-view.jsx","webpack://tinode-webapp/./src/widgets/meta-message.jsx","webpack://tinode-webapp/./src/widgets/video-preview.jsx","webpack://tinode-webapp/./src/lib/navigation.js","webpack://tinode-webapp/./src/views/messages-view.jsx","webpack://tinode-webapp/./src/widgets/button-back.jsx","webpack://tinode-webapp/./src/widgets/menu-contacts.jsx","webpack://tinode-webapp/./src/widgets/menu-start.jsx","webpack://tinode-webapp/./src/widgets/side-navbar.jsx","webpack://tinode-webapp/./src/widgets/credential-edit.jsx","webpack://tinode-webapp/./src/views/account-settings-view.jsx","webpack://tinode-webapp/./src/views/contacts-view.jsx","webpack://tinode-webapp/./src/lib/local-storage.js","webpack://tinode-webapp/./src/views/create-account-view.jsx","webpack://tinode-webapp/./src/views/acc-notifications-view.jsx","webpack://tinode-webapp/./src/views/acc-security-view.jsx","webpack://tinode-webapp/./src/views/acc-support-view.jsx","webpack://tinode-webapp/./src/views/login-view.jsx","webpack://tinode-webapp/./src/widgets/new-topic-by-id.jsx","webpack://tinode-webapp/./src/widgets/new-topic-group.jsx","webpack://tinode-webapp/./src/views/new-topic-view.jsx","webpack://tinode-webapp/./src/views/password-reset-view.jsx","webpack://tinode-webapp/./src/widgets/host-selector.jsx","webpack://tinode-webapp/./src/views/settings-view.jsx","webpack://tinode-webapp/./src/views/validation-view.jsx","webpack://tinode-webapp/./src/views/sidepanel-view.jsx","webpack://tinode-webapp/./src/lib/host-name.js","webpack://tinode-webapp/./src/views/tinode-web.jsx","webpack://tinode-webapp/./src/index.js"],"sourcesContent":["var getProto = Object.getPrototypeOf ? (obj) => (Object.getPrototypeOf(obj)) : (obj) => (obj.__proto__);\nvar leafPrototypes;\n// create a fake namespace object\n// mode & 1: value is a module id, require it\n// mode & 2: merge all properties of value into the ns\n// mode & 4: return value when already ns object\n// mode & 16: return value when it's Promise-like\n// mode & 8|1: behave like require\n__webpack_require__.t = function(value, mode) {\n\tif(mode & 1) value = this(value);\n\tif(mode & 8) return value;\n\tif(typeof value === 'object' && value) {\n\t\tif((mode & 4) && value.__esModule) return value;\n\t\tif((mode & 16) && typeof value.then === 'function') return value;\n\t}\n\tvar ns = Object.create(null);\n\t__webpack_require__.r(ns);\n\tvar def = {};\n\tleafPrototypes = leafPrototypes || [null, getProto({}), getProto([]), getProto(getProto)];\n\tfor(var current = mode & 2 && value; typeof current == 'object' && !~leafPrototypes.indexOf(current); current = getProto(current)) {\n\t\tObject.getOwnPropertyNames(current).forEach((key) => (def[key] = () => (value[key])));\n\t}\n\tdef['default'] = () => (value);\n\t__webpack_require__.d(ns, def);\n\treturn ns;\n};","var inProgress = {};\nvar dataWebpackPrefix = \"tinode-webapp:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = (url, done, key, chunkId) => {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tscript.timeout = 120;\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = (prev, event) => {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach((fn) => (fn(event)));\n\t\tif(prev) return prev(event);\n\t};\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","import { PACKAGE_VERSION } from './version.js';\n\n// Name of this application, used in the User-Agent.\nexport const APP_NAME = 'TinodeWeb/' + (PACKAGE_VERSION || '0.21');\n\n// API key. Use https://github.com/tinode/chat/tree/master/keygen to generate your own\nexport const API_KEY = 'AQEAAAABAAD_rAp4DJh05a1HAwFT3A6K';\n\n// The array of possible hosts to connect to.\nexport const KNOWN_HOSTS = {hosted: 'web.tinode.co', local: 'localhost:6060'};\n\n// Default host name and port to connect to.\nexport const DEFAULT_HOST = KNOWN_HOSTS.hosted;\n\n// Enable console logging.\nexport const LOGGING_ENABLED = true;\n\n// Minimum time between two keypress notifications, milliseconds.\nexport const KEYPRESS_DELAY = 3_000;\n// Delay before sending a read notification, milliseconds.\nexport const READ_DELAY = 1_500;\n\n// The default shortest allowed tag length. Matches the value on the server.\nexport const MIN_TAG_LENGTH = 2;\n// The default greatest allowed tag length. Matches the value on the server.\nexport const MAX_TAG_LENGTH = 96;\n// The default maximum number of tags allowed. Matches the value on the server.\nexport const MAX_TAG_COUNT = 16;\n\n// Access mode for P2P subscriptions initiated by the current user.\nexport const DEFAULT_P2P_ACCESS_MODE = 'JRWPS';\n// Access mode for new group topics created by the current user.\nexport const NEW_GRP_ACCESS_MODE = 'JRWPSAO';\n// Access mode for a channel.\nexport const CHANNEL_ACCESS_MODE = 'JR';\n\n// Access mode for no access.\nexport const NO_ACCESS_MODE = 'N';\n\n// Mediaquery breakpoint between desktop and mobile, in px. Should match the value\n// in @media (max-size: 640px) in base.css\nexport const MEDIA_BREAKPOINT = 640;\n// Size of css 'rem' unit in pixels. Default 1rem = 10pt = 13px.\nexport const REM_SIZE = 13;\n\n// Size of the avatar image: when image dimensions are greater or the image is not square, it's resized to\n// a square of this size or less.\nexport const AVATAR_SIZE = 384;\n\n// Maximum size of an avatar in bytes for sending in-band. Bigger avatars will be sent out of band (as uploads).\nexport const MAX_AVATAR_BYTES = 4096;\n\n// Size of the broken_image shown in MessagesView\nexport const BROKEN_IMAGE_SIZE = 32;\n\n// Size of video preview when dimensions are missing.\nexport const NO_DIMENSIONS_VIDEO = 128;\n\n// Number of chat messages to fetch in one call.\nexport const MESSAGES_PAGE = 24;\n\n// Default maximum in-band (included directly into the message) attachment size which fits into\n// a message of 256K in size. Used when the server-provided value is unavailable. The actual\n// binary size of the attachment should be smaller due to base64 encoding expansion and some overhead,\n// for instance 1024 bytes.\n// Increase this limit to a greater value in production, if desired. Also increase\n// max_message_size in the server config.\nexport const MAX_INBAND_ATTACHMENT_SIZE = 262_144;\n\n// Default absolute maximum attachment size to be used with the server = 8MB.\n// Used when the server-provided value is unavailable. Increase to something like 100MB in production.\nexport const MAX_EXTERN_ATTACHMENT_SIZE = 1 << 23;\n\n// Maximum allowed linear dimension (pixels) of an image sent inline. Larger images will be shrunk\n// to make the larger dimension fit under this size. You may want to adjust it to 1600 or\n// 2400 for production.\nexport const MAX_IMAGE_DIM = 1024;\n\n// Linear dimensions of image preview: shrink image under this size for previews.\nexport const IMAGE_PREVIEW_DIM = 64;\n\n// Linear dimensions of video screencapture: shrink image under this size for previews.\nexport const VIDEO_PREVIEW_DIM = 96;\n\n// Linear dimensions of image thumbnail: shrink image under this size for thumbnails in reply quote previews.\nexport const IMAGE_THUMBNAIL_DIM = 36;\n// Width of video thumbnail: allow it to be wider, but not taller. Use IMAGE_THUMBNAIL_DIM for height.\nexport const VIDEO_THUMBNAIL_WIDTH = 48;\n\n// Maximum number of online users to be shown in a topic title bar. Others will be\n// hidden under \"+X more\"\nexport const MAX_ONLINE_IN_TOPIC = 4;\n\n// Maximum length of user name, topic title, and private comment.\nexport const MAX_TITLE_LENGTH = 60;\n// Maximum length of topic description.\nexport const MAX_TOPIC_DESCRIPTION_LENGTH = 360;\n// Maximum length of user name when displaying a video call.\nexport const MAX_PEER_TITLE_LENGTH = 20;\n\n// Length of message previews in chat list, in characters.\nexport const MESSAGE_PREVIEW_LENGTH = 80;\n\n// Length of a quote in quoted reply (for outgoing messages).\nexport const QUOTED_REPLY_LENGTH = 30;\n// Length of a preview of a forwarded message.\nexport const FORWARDED_PREVIEW_LENGTH = 84;\n// Length of preview for a message being edited.\nexport const EDIT_PREVIEW_LENGTH = 48;\n\n// Minimum duration of an audio recording in milliseconds (2 sec).\nexport const MIN_DURATION = 2_000;\n// Maximum duration of an audio recording in milliseconds (10 min).\nexport const MAX_DURATION = 600_000;\n\n// Link for \"Contact Us\".\nexport const LINK_CONTACT_US = 'mailto:support@tinode.co';\n\n// Link to Privacy Policy.\nexport const LINK_PRIVACY_POLICY = 'https://tinode.co/privacy.html';\n\n// Link to Terms of Service.\nexport const LINK_TERMS_OF_SERVICE = 'https://tinode.co/terms.html';\n\n","// File and image helper functions.\n\n// Supported image MIME types and corresponding file extensions.\nexport const SUPPORTED_IMAGE_FORMATS = ['image/jpeg', 'image/gif', 'image/png', 'image/svg', 'image/svg+xml'];\nexport const MIME_EXTENSIONS = ['jpg', 'gif', 'png', 'svg', 'svg'];\n\n// Get an URL from a theCard photo: either create a data: URL or return reference URL.\nexport function makeImageUrl(photo) {\n if (photo && typeof photo == 'object') {\n if (photo.ref) {\n return photo.ref\n }\n if (photo.data && photo.type) {\n const mime = photo.type.startsWith('image/') ? photo.type : ('image/' + photo.type);\n return 'data:' + mime + ';base64,' + photo.data;\n }\n }\n return null;\n}\n\n// Calculate linear dimensions for scaling image down to fit under a certain size.\n// Returns an object which contains destination sizes, source sizes, and offsets\n// into source (when making square images).\nexport function fitImageSize(width, height, maxWidth, maxHeight, forceSquare) {\n // Sanitize input\n width = width | 0;\n height = height | 0;\n maxWidth = maxWidth | 0;\n maxHeight = maxHeight | 0;\n\n if (width <= 0 || height <= 0 || maxWidth <= 0 || maxHeight <= 0) {\n return null;\n }\n\n if (forceSquare) {\n maxWidth = maxHeight = Math.min(maxWidth, maxHeight);\n }\n\n const scale = Math.min(\n Math.min(width, maxWidth) / width,\n Math.min(height, maxHeight) / height\n );\n\n const size = {\n dstWidth: (width * scale) | 0,\n dstHeight: (height * scale) | 0,\n };\n\n if (forceSquare) {\n // Also calculate parameters for making the image square.\n size.dstWidth = size.dstHeight = Math.min(size.dstWidth, size.dstHeight);\n size.srcWidth = size.srcHeight = Math.min(width, height);\n size.xoffset = ((width - size.srcWidth) / 2) | 0;\n size.yoffset = ((height - size.srcWidth) / 2) | 0;\n } else {\n size.xoffset = size.yoffset = 0;\n size.srcWidth = width;\n size.srcHeight = height;\n }\n return size;\n}\n\n// Ensure file's extension matches mime content type\nexport function fileNameForMime(fname, mime) {\n const idx = SUPPORTED_IMAGE_FORMATS.indexOf(mime);\n if (idx < 0 || !fname) {\n // Unknown mime or empty name.\n return fname;\n }\n const ext = MIME_EXTENSIONS[idx];\n\n const at = fname.lastIndexOf('.');\n if (at >= 0) {\n fname = fname.substring(0, at);\n }\n return fname + '.' + ext;\n}\n\n// Scale uploaded image to fit under certain dimensions and byte size, optionally constraining to a square.\n// Returns a promise which is resolven on success or rejected on failure.\nexport function imageScaled(fileOrBlob, maxWidth, maxHeight, maxSize, forceSquare) {\n return new Promise((resolve, reject) => {\n const img = new Image();\n img.crossOrigin = 'Anonymous';\n img.onerror = function(err) {\n reject(new Error(\"Image format unrecognized\"));\n }\n img.onload = async function() {\n // Once the image is loaded, the URL is no longer needed.\n URL.revokeObjectURL(img.src);\n\n // Calculate the desired image dimensions.\n const dim = fitImageSize(img.width, img.height, maxWidth, maxHeight, forceSquare);\n if (!dim) {\n reject(new Error(\"Invalid image\"));\n return;\n }\n let canvas = document.createElement('canvas');\n canvas.width = dim.dstWidth;\n canvas.height = dim.dstHeight;\n let ctx = canvas.getContext('2d');\n ctx.imageSmoothingEnabled = true;\n ctx.drawImage(img, dim.xoffset, dim.yoffset, dim.srcWidth, dim.srcHeight,\n 0, 0, dim.dstWidth, dim.dstHeight);\n\n const mime = SUPPORTED_IMAGE_FORMATS.includes(fileOrBlob.type) ? fileOrBlob.type : 'image/jpeg';\n // Generate blob to check size of the image.\n let blob = await new Promise(resolve => canvas.toBlob(resolve, mime));\n if (!blob) {\n reject(new Error(\"Unsupported image format\"));\n return;\n }\n // Ensure the image is not too large. Shrink the image keeping the aspect ratio.\n // Do nothing if maxsize is <= 0.\n while (maxSize > 0 && blob.length > maxSize) {\n dim.dstWidth = (dim.dstWidth * 0.70710678118) | 0;\n dim.dstHeight = (dim.dstHeight * 0.70710678118) | 0;\n canvas.width = dim.dstWidth;\n canvas.height = dim.dstHeight;\n ctx = canvas.getContext('2d');\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n ctx.drawImage(img, dim.xoffset, dim.yoffset, dim.srcWidth, dim.srcHeight,\n 0, 0, dim.dstWidth, dim.dstHeight);\n blob = await new Promise(resolve => canvas.toBlob(resolve, mime));\n }\n\n canvas = null;\n resolve({mime: mime, blob: blob, width: dim.dstWidth, height: dim.dstHeight, name: fileNameForMime(fileOrBlob.name, mime)});\n };\n img.src = URL.createObjectURL(fileOrBlob);\n });\n}\n\n// Scale and crop image according to specified dimensions.\n// The coordinates are in unscaled image pixels, i.e. cut the rectangle first then scale it.\n// returns a promise.\nexport function imageCrop(mime, objURL, left, top, width, height, scale) {\n return new Promise((resolve, reject) => {\n const img = new Image();\n img.crossOrigin = 'Anonymous';\n img.onerror = _ => {\n reject(new Error(\"Image format unrecognized\"));\n };\n img.onload = _ => {\n // Once the image is loaded, the URL is no longer needed.\n URL.revokeObjectURL(img.src);\n\n let canvas = document.createElement('canvas');\n canvas.width = width * scale;\n canvas.height = height * scale;\n let ctx = canvas.getContext('2d');\n ctx.imageSmoothingEnabled = true;\n ctx.drawImage(img, left, top, width, height, 0, 0, canvas.width, canvas.height);\n\n mime = SUPPORTED_IMAGE_FORMATS.includes(mime) ? mime : 'image/jpeg';\n // Generate blob to check size of the image.\n canvas.toBlob((blob) => {\n // Allow GC.\n canvas = null;\n if (blob) {\n resolve({mime: mime, blob: blob, width: width, height: height});\n } else {\n reject(new Error(\"Unsupported image format\"));\n }\n }, mime);\n };\n img.src = objURL;\n });\n}\n\n// Convert file to base64 string.\nexport function fileToBase64(file) {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onerror = _ => {\n reject(reader.error);\n };\n reader.onload = _ => {\n resolve({mime: file.type, bits: reader.result.split(',')[1], name: file.name});\n };\n reader.readAsDataURL(file);\n });\n}\n\n// Convert Blob to base64 string. Returns a promise resolved with the base64 string and mime.\nexport function blobToBase64(blob) {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onerror = _ => {\n reject(reader.error);\n };\n reader.onload = _ => {\n resolve({mime: blob.type, bits: reader.result.split(',')[1]});\n };\n reader.readAsDataURL(blob);\n });\n}\n\n// File pasted from the clipboard. It's either an inline image or a file attachment.\nexport function filePasted(event, onImageSuccess, onAttachmentSuccess, onError) {\n const items = (event.clipboardData || event.originalEvent.clipboardData || {}).items;\n if (!items || !items.length) {\n return false;\n }\n\n for (let i in items) {\n const item = items[i];\n if (item.kind === 'file') {\n const file = item.getAsFile();\n if (!file) {\n console.error(\"Failed to get file object from pasted file item\", item.kind, item.type);\n onError(\"Failed to get file object from pasted file item\");\n continue;\n }\n if (file.type && file.type.split('/')[0] == 'image') {\n onImageSuccess(file);\n } else {\n onAttachmentSuccess(file);\n }\n // Indicate that the pasted data contains a file.\n return true;\n }\n }\n // No file found.\n return false;\n}\n\n// Get mime type from data URL header.\nexport function getMimeType(header) {\n var mime = /^data:(image\\/[-+a-z0-9.]+);base64/.exec(header);\n return (mime && mime.length > 1) ? mime[1] : null;\n}\n\n// Given length of a binary object in bytes, calculate the length after\n// base64 encoding.\nexport function base64EncodedLen(n) {\n return Math.floor((n + 2) / 3) * 4;\n}\n\n// Given length of a base64-encoded object, calculate decoded size of the\n// pbject in bytes.\nexport function base64DecodedLen(n) {\n return Math.floor(n / 4) * 3;\n}\n\n// Re-encode string to standard base64 encoding with padding.\n// The string may be base64-URL encoded without the padding.\nexport function base64ReEncode(str) {\n if (str) {\n str = str.replace(/-/g, '+').replace(/_/g, '/');\n try {\n str = btoa(atob(str));\n } catch(err) {\n console.error(\"Failed to base64 re-encode string.\", err);\n str = null;\n }\n }\n return str;\n}\n\n// Convert a base64 encoded string with the provided mime type into a Blob.\nexport function base64ToBlob(str, mime) {\n if (!str) {\n return null;\n }\n\n try {\n // Make blob.\n const bin = atob(str);\n const length = bin.length;\n const buf = new ArrayBuffer(length);\n const arr = new Uint8Array(buf);\n for (let i = 0; i < length; i++) {\n arr[i] = bin.charCodeAt(i);\n }\n\n return new Blob([buf], { type: mime });\n } catch(err) {\n console.error(\"Failed to convert base64 to blob: \", err);\n }\n\n return null;\n}\n\nexport function intArrayToBase64(arr) {\n if (!Array.isArray(arr)) {\n return null;\n }\n try {\n let bin = '';\n new Uint8Array(arr).forEach(b => bin += String.fromCharCode(b));\n return window.btoa(bin);\n } catch (err) {}\n return null;\n}\n\nexport function base64ToIntArray(b64) {\n const arr = [];\n try {\n const bin = window.atob(b64);\n [...bin].forEach(c => {\n arr.push(c.charCodeAt(0));\n });\n return arr;\n } catch (err) {}\n return null;\n}\n","// Short representation of time in the past.\nexport function shortDateFormat(then, locale) {\n locale = locale || window.navigator.userLanguage || window.navigator.language;\n const now = new Date();\n if (then.getFullYear() == now.getFullYear()) {\n // Same year.\n if (then.getMonth() == now.getMonth() && then.getDate() == now.getDate()) {\n // Same month and day, show time only.\n return then.toLocaleTimeString(locale, {hour12: false, hour: '2-digit', minute: '2-digit'});\n }\n // Different month and/or day, show month day, time.\n return then.toLocaleDateString(locale,\n {hour12: false, month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit'});\n }\n // Different year: just show the date.\n return then.toLocaleDateString(locale, {year: 'numeric', month: 'short', day: 'numeric'});\n}\n\n// Representation a date relative to now.\nexport function relativeDateFormat(then, locale) {\n locale = locale || window.navigator.userLanguage || window.navigator.language;\n const now = new Date();\n const thenDays = Math.floor((then.getTime() - then.getTimezoneOffset() * 60_000) / 86_400_000);\n const nowDays = Math.floor((now.getTime() - now.getTimezoneOffset() * 60_000) / 86_400_000);\n const diff = thenDays - nowDays;\n if (Math.abs(diff) < 2) {\n // Today or yesterday.\n return new Intl.RelativeTimeFormat(locale, { numeric: 'auto' }).format(diff, 'day')\n }\n // More than two days: just show the date.\n return new Intl.DateTimeFormat(locale).format(then);\n}\n\n// Convert seconds to [hours:]minutes:seconds, i.e. 156 sec -> 2:36, 3756 sec -> 1:02:36.\n// If fixedMins is true, then minutes are represented by at least two digits.\nexport function secondsToTime(seconds, fixedMin) {\n if (typeof seconds != 'number') {\n return '';\n }\n\n let min = (Math.floor(seconds / 60) | 0) % 60;\n let hours = Math.floor(seconds / 36000) | 0;\n\n if (fixedMin || hours > 0) {\n min = min < 10 ? `0${min}` : min;\n }\n let sec = (seconds | 0) % 60;\n sec = sec < 10 ? `0${sec}` : sec;\n if (hours == 0) {\n return `${min}:${sec}`;\n }\n return `${hours}:${min}:${sec}`;\n}\n\n// Convert a number of bytes to human-readable format.\nexport function bytesToHumanSize(bytes) {\n if (!bytes || bytes == 0) {\n return '0 Bytes';\n }\n\n const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB'];\n const bucket = Math.min(Math.floor(Math.log2(bytes) / 10) | 0, sizes.length-1);\n const count = bytes / Math.pow(1024, bucket);\n const round = bucket > 0 ? (count < 3 ? 2 : (count < 30 ? 1 : 0)) : 0;\n return count.toFixed(round) + ' ' + sizes[bucket];\n}\n\n// Shorten a file name to be under maxLength by clipping out the middle.\nexport function shortenFileName(filename, maxLength) {\n if (typeof filename != 'string') {\n return filename;\n }\n return filename.length > maxLength ?\n filename.slice(0, maxLength/2 - 1) + '…' + filename.slice(1 - maxLength/2) : filename;\n}\n\n// Get 32 bit integer hash value for a string. Ideally it should produce the same value\n// as Java's String#hash().\nfunction stringToColorHash(value) {\n let hash = 0;\n value = '' + value;\n for (let i = 0; i < value.length; i++) {\n hash = ((hash << 5) - hash) + value.charCodeAt(i);\n hash = hash & hash; // Convert to 32bit integer\n }\n return hash;\n}\n\n// User avatar letter color id.\nexport function letterTileColorId(userId) {\n return Math.abs(stringToColorHash(userId)) % 16;\n}\n\n// Converts user or topic ID to a CSS color class. Ideally it should produce the same color value as Java version.\n// params:\n// - {string} id: user or topic ID\n// - {boolean} light: light or dark version of the color.\n// - {boolean} fg: foreground (text) or background color.\nexport function idToColorClass(id, light, fg) {\n return (light ? 'lt-' : 'dk-') + (fg ? 'fg-' : 'bg-') + letterTileColorId(id);\n}\n\n// Takes ISO Alpha-2 country code, like 'US' and converts it to a flag emoji.\nexport function flagEmoji(countryCode) {\n const codePoints = countryCode\n .toUpperCase()\n .split('')\n .map(char => 0x1F1A5 + char.charCodeAt());\n return String.fromCodePoint(...codePoints);\n}\n","// This is a generated file. Don't edit.\n\nexport const PACKAGE_VERSION = \"0.21.0-rc2\";\n","// Audio recorder widget.\n\nimport React from 'react';\nimport { defineMessages, injectIntl } from 'react-intl';\n\nimport { secondsToTime } from '../lib/strformat';\nimport { base64ToIntArray } from '../lib/blob-helpers';\n\n// Make canvas bigger than the element size to reduce blurring.\nconst CANVAS_UPSCALING = 2.0;\n// Thickness of a visualization bar.\nconst LINE_WIDTH = 3 * CANVAS_UPSCALING;\n// Spacing between two visualization bars.\nconst SPACING = 2 * CANVAS_UPSCALING;\n// Color of histogram bars.\nconst BAR_COLOR = '#888A';\nconst BAR_COLOR_DARK = '#666C';\nconst THUMB_COLOR = '#444E';\n// Minimum number of amplitude bars to draw.\nconst MIN_PREVIEW_LENGTH = 16;\n\nconst messages = defineMessages({\n icon_title_play: {\n id: 'icon_title_play',\n defaultMessage: 'Play recording',\n description: 'Icon tool tip for starting audio playback'\n }\n});\n\nclass AudioPlayer extends React.PureComponent {\n constructor(props) {\n super(props);\n\n let preview = base64ToIntArray(this.props.preview);\n if (!Array.isArray(preview) || preview.length < MIN_PREVIEW_LENGTH) {\n preview = null;\n }\n\n this.state = {\n canPlay: false,\n playing: false,\n currentTime: '0:00',\n duration: this.props.duration > 0 ? secondsToTime(this.props.duration / 1000) : '-:--',\n longMin: this.props.duration >= 600000,\n preview: preview\n };\n\n this.initAudio = this.initAudio.bind(this);\n this.initCanvas = this.initCanvas.bind(this);\n this.resampleBars = this.resampleBars.bind(this);\n this.visualize = this.visualize.bind(this);\n\n this.handlePlay = this.handlePlay.bind(this);\n this.handleSeek = this.handleSeek.bind(this);\n this.handleError = this.handleError.bind(this);\n\n this.audioPlayer = null;\n\n this.viewBuffer = [];\n this.canvasRef = React.createRef();\n }\n\n componentDidMount() {\n if (this.props.src) {\n this.initAudio();\n }\n\n this.initCanvas();\n }\n\n componentWillUnmount() {\n if (this.audioPlayer) {\n this.audioPlayer.oncanplay = null;\n this.audioPlayer.ontimeupdate = null;\n this.audioPlayer.onended = null;\n this.audioPlayer.pause();\n this.audioPlayer = null;\n }\n }\n\n componentDidUpdate(prevProps) {\n if (this.props.src != prevProps.src) {\n this.initAudio();\n }\n\n if (this.props.preview != prevProps.preview) {\n let preview = base64ToIntArray(this.props.preview);\n if (!Array.isArray(preview) || preview.length < MIN_PREVIEW_LENGTH) {\n preview = null;\n }\n this.setState({preview: preview}, this.initCanvas);\n }\n }\n\n initAudio() {\n this.audioPlayer = new Audio(this.props.src);\n this.audioPlayer.oncanplay = _ => this.setState({canPlay: true});\n this.audioPlayer.ontimeupdate = _ => this.setState({\n currentTime: secondsToTime(this.audioPlayer.currentTime, this.state.longMin)\n });\n this.audioPlayer.onended = _ => {\n this.audioPlayer.currentTime = 0;\n this.setState({playing: false, currentTime: secondsToTime(0, this.state.longMin)})\n }\n }\n\n initCanvas() {\n // Force canvas aspect ratio to match one of the element + upscale canvas to reduce blurring.\n this.canvasRef.current.width = this.canvasRef.current.offsetWidth * CANVAS_UPSCALING;\n this.canvasRef.current.height = this.canvasRef.current.offsetHeight * CANVAS_UPSCALING;\n\n this.canvasContext = this.canvasRef.current.getContext('2d');\n this.canvasContext.lineCap = 'round';\n\n this.viewBuffer = this.resampleBars(this.state.preview);\n this.visualize();\n }\n\n // Draw amplitude of sound.\n visualize() {\n if (!this.canvasRef.current) {\n return;\n }\n\n const width = this.effectiveWidth;\n const height = this.canvasRef.current.height;\n\n this.canvasContext.lineWidth = LINE_WIDTH;\n\n const drawFrame = _ => {\n if (!this.canvasRef.current || !this.audioPlayer) {\n // The component is unmounted.\n return;\n }\n\n this.canvasContext.clearRect(0, 0, this.canvasRef.current.width, height);\n\n if (this.viewBuffer) {\n if (this.state.playing) {\n window.requestAnimationFrame(drawFrame);\n }\n\n // Current playback position.\n const thumbAt = this.props.duration ?\n Math.max(0, Math.min(this.audioPlayer.currentTime * 1000 / this.props.duration, 1)) * (width - LINE_WIDTH * 2) : -1;\n\n // Draw amplitude bars.\n this.canvasContext.beginPath();\n this.canvasContext.strokeStyle = BAR_COLOR_DARK;\n for (let i = 0; i < this.viewBuffer.length; i++) {\n let x = 1 + i * (LINE_WIDTH + SPACING) + LINE_WIDTH * 0.5;\n let y = this.viewBuffer[i] * height * 0.9;\n\n const color = x < thumbAt ? BAR_COLOR_DARK : BAR_COLOR;\n if (this.canvasContext.strokeStyle != color) {\n this.canvasContext.stroke();\n this.canvasContext.beginPath();\n this.canvasContext.strokeStyle = color;\n }\n\n this.canvasContext.moveTo(x, (height - y) * 0.5);\n this.canvasContext.lineTo(x, height * 0.5 + y * 0.5);\n }\n // Actually draw the bars on canvas.\n this.canvasContext.stroke();\n\n // Draw thumb.\n if (this.props.duration) {\n this.canvasContext.beginPath();\n this.canvasContext.arc(thumbAt + LINE_WIDTH * 2, height * 0.5, LINE_WIDTH * 2, 0, 2 * Math.PI);\n this.canvasContext.fillStyle = THUMB_COLOR;\n this.canvasContext.fill();\n }\n }\n }\n\n drawFrame();\n }\n\n // Quick and dirty downsampling of the original preview bars into a smaller (or equal) number of bars we can display here.\n resampleBars(original) {\n const dstCount = ((this.canvasRef.current.width - SPACING) / (LINE_WIDTH + SPACING)) | 0;\n // Remove extra padding on the right due to fractional bar which is not drawn.\n this.effectiveWidth = dstCount * (LINE_WIDTH + SPACING) + SPACING;\n\n if (!Array.isArray(original) || original.length == 0) {\n return Array.apply(null, Array(dstCount)).map(_ => 0.01);\n }\n\n const factor = original.length / dstCount;\n let amps = [];\n let maxAmp = -1;\n for (let i=0; i 0) {\n return amps.map(a => a / maxAmp);\n }\n return Array.apply(null, Array(dstCount)).map(_ => 0.01);\n }\n\n handlePlay(e) {\n e.preventDefault();\n if (!this.state.canPlay) {\n return;\n }\n if (this.state.playing) {\n this.audioPlayer.pause();\n this.setState({playing: false});\n } else {\n this.audioPlayer.play();\n this.setState({playing: true}, this.visualize);\n }\n }\n\n handleError(err) {\n console.error(err);\n }\n\n handleSeek(e) {\n e.preventDefault();\n if (e.target && this.props.duration) {\n const rect = e.target.getBoundingClientRect();\n const offset = (e.clientX - rect.left) / this.effectiveWidth * CANVAS_UPSCALING;\n this.audioPlayer.currentTime = this.props.duration * offset / 1000;\n this.setState({currentTime: secondsToTime(this.audioPlayer.currentTime, this.state.longMin)});\n if (!this.state.playing) {\n this.visualize();\n }\n }\n }\n\n render() {\n const playClass = 'material-icons' +\n (this.props.short ? '' : ' large') +\n (this.state.canPlay ? '' : ' disabled');\n const play = (\n {this.state.playing ? 'pause_circle' :\n (this.state.canPlay ? 'play_circle' : 'not_interested')} \n );\n return ({this.props.short ?\n <>\n
\n {play}\n >\n :\n <>\n {play}\n
\n
\n
{this.state.currentTime}/{this.state.duration}
\n
\n >\n }\n
);\n }\n}\n\nexport default injectIntl(AudioPlayer);\n","import PhoneNumber from './PhoneNumber.js';\nexport default function getExampleNumber(country, examples, metadata) {\n if (examples[country]) {\n return new PhoneNumber(country, examples[country], metadata);\n }\n}\n//# sourceMappingURL=getExampleNumber.js.map","// This file is a workaround for a bug in web browsers' \"native\"\n// ES6 importing system which is uncapable of importing \"*.json\" files.\n// https://github.com/catamphetamine/libphonenumber-js/issues/239\nexport default {\"AC\":\"40123\",\"AD\":\"312345\",\"AE\":\"501234567\",\"AF\":\"701234567\",\"AG\":\"2684641234\",\"AI\":\"2642351234\",\"AL\":\"672123456\",\"AM\":\"77123456\",\"AO\":\"923123456\",\"AR\":\"91123456789\",\"AS\":\"6847331234\",\"AT\":\"664123456\",\"AU\":\"412345678\",\"AW\":\"5601234\",\"AX\":\"412345678\",\"AZ\":\"401234567\",\"BA\":\"61123456\",\"BB\":\"2462501234\",\"BD\":\"1812345678\",\"BE\":\"470123456\",\"BF\":\"70123456\",\"BG\":\"43012345\",\"BH\":\"36001234\",\"BI\":\"79561234\",\"BJ\":\"90011234\",\"BL\":\"690001234\",\"BM\":\"4413701234\",\"BN\":\"7123456\",\"BO\":\"71234567\",\"BQ\":\"3181234\",\"BR\":\"11961234567\",\"BS\":\"2423591234\",\"BT\":\"17123456\",\"BW\":\"71123456\",\"BY\":\"294911911\",\"BZ\":\"6221234\",\"CA\":\"5062345678\",\"CC\":\"412345678\",\"CD\":\"991234567\",\"CF\":\"70012345\",\"CG\":\"061234567\",\"CH\":\"781234567\",\"CI\":\"0123456789\",\"CK\":\"71234\",\"CL\":\"221234567\",\"CM\":\"671234567\",\"CN\":\"13123456789\",\"CO\":\"3211234567\",\"CR\":\"83123456\",\"CU\":\"51234567\",\"CV\":\"9911234\",\"CW\":\"95181234\",\"CX\":\"412345678\",\"CY\":\"96123456\",\"CZ\":\"601123456\",\"DE\":\"15123456789\",\"DJ\":\"77831001\",\"DK\":\"32123456\",\"DM\":\"7672251234\",\"DO\":\"8092345678\",\"DZ\":\"551234567\",\"EC\":\"991234567\",\"EE\":\"51234567\",\"EG\":\"1001234567\",\"EH\":\"650123456\",\"ER\":\"7123456\",\"ES\":\"612345678\",\"ET\":\"911234567\",\"FI\":\"412345678\",\"FJ\":\"7012345\",\"FK\":\"51234\",\"FM\":\"3501234\",\"FO\":\"211234\",\"FR\":\"612345678\",\"GA\":\"06031234\",\"GB\":\"7400123456\",\"GD\":\"4734031234\",\"GE\":\"555123456\",\"GF\":\"694201234\",\"GG\":\"7781123456\",\"GH\":\"231234567\",\"GI\":\"57123456\",\"GL\":\"221234\",\"GM\":\"3012345\",\"GN\":\"601123456\",\"GP\":\"690001234\",\"GQ\":\"222123456\",\"GR\":\"6912345678\",\"GT\":\"51234567\",\"GU\":\"6713001234\",\"GW\":\"955012345\",\"GY\":\"6091234\",\"HK\":\"51234567\",\"HN\":\"91234567\",\"HR\":\"921234567\",\"HT\":\"34101234\",\"HU\":\"201234567\",\"ID\":\"812345678\",\"IE\":\"850123456\",\"IL\":\"502345678\",\"IM\":\"7924123456\",\"IN\":\"8123456789\",\"IO\":\"3801234\",\"IQ\":\"7912345678\",\"IR\":\"9123456789\",\"IS\":\"6111234\",\"IT\":\"3123456789\",\"JE\":\"7797712345\",\"JM\":\"8762101234\",\"JO\":\"790123456\",\"JP\":\"9012345678\",\"KE\":\"712123456\",\"KG\":\"700123456\",\"KH\":\"91234567\",\"KI\":\"72001234\",\"KM\":\"3212345\",\"KN\":\"8697652917\",\"KP\":\"1921234567\",\"KR\":\"1020000000\",\"KW\":\"50012345\",\"KY\":\"3453231234\",\"KZ\":\"7710009998\",\"LA\":\"2023123456\",\"LB\":\"71123456\",\"LC\":\"7582845678\",\"LI\":\"660234567\",\"LK\":\"712345678\",\"LR\":\"770123456\",\"LS\":\"50123456\",\"LT\":\"61234567\",\"LU\":\"628123456\",\"LV\":\"21234567\",\"LY\":\"912345678\",\"MA\":\"650123456\",\"MC\":\"612345678\",\"MD\":\"62112345\",\"ME\":\"67622901\",\"MF\":\"690001234\",\"MG\":\"321234567\",\"MH\":\"2351234\",\"MK\":\"72345678\",\"ML\":\"65012345\",\"MM\":\"92123456\",\"MN\":\"88123456\",\"MO\":\"66123456\",\"MP\":\"6702345678\",\"MQ\":\"696201234\",\"MR\":\"22123456\",\"MS\":\"6644923456\",\"MT\":\"96961234\",\"MU\":\"52512345\",\"MV\":\"7712345\",\"MW\":\"991234567\",\"MX\":\"12221234567\",\"MY\":\"123456789\",\"MZ\":\"821234567\",\"NA\":\"811234567\",\"NC\":\"751234\",\"NE\":\"93123456\",\"NF\":\"381234\",\"NG\":\"8021234567\",\"NI\":\"81234567\",\"NL\":\"612345678\",\"NO\":\"40612345\",\"NP\":\"9841234567\",\"NR\":\"5551234\",\"NU\":\"8884012\",\"NZ\":\"211234567\",\"OM\":\"92123456\",\"PA\":\"61234567\",\"PE\":\"912345678\",\"PF\":\"87123456\",\"PG\":\"70123456\",\"PH\":\"9051234567\",\"PK\":\"3012345678\",\"PL\":\"512345678\",\"PM\":\"551234\",\"PR\":\"7872345678\",\"PS\":\"599123456\",\"PT\":\"912345678\",\"PW\":\"6201234\",\"PY\":\"961456789\",\"QA\":\"33123456\",\"RE\":\"692123456\",\"RO\":\"712034567\",\"RS\":\"601234567\",\"RU\":\"9123456789\",\"RW\":\"720123456\",\"SA\":\"512345678\",\"SB\":\"7421234\",\"SC\":\"2510123\",\"SD\":\"911231234\",\"SE\":\"701234567\",\"SG\":\"81234567\",\"SH\":\"51234\",\"SI\":\"31234567\",\"SJ\":\"41234567\",\"SK\":\"912123456\",\"SL\":\"25123456\",\"SM\":\"66661212\",\"SN\":\"701234567\",\"SO\":\"71123456\",\"SR\":\"7412345\",\"SS\":\"977123456\",\"ST\":\"9812345\",\"SV\":\"70123456\",\"SX\":\"7215205678\",\"SY\":\"944567890\",\"SZ\":\"76123456\",\"TA\":\"8999\",\"TC\":\"6492311234\",\"TD\":\"63012345\",\"TG\":\"90112345\",\"TH\":\"812345678\",\"TJ\":\"917123456\",\"TK\":\"7290\",\"TL\":\"77212345\",\"TM\":\"66123456\",\"TN\":\"20123456\",\"TO\":\"7715123\",\"TR\":\"5012345678\",\"TT\":\"8682911234\",\"TV\":\"901234\",\"TW\":\"912345678\",\"TZ\":\"621234567\",\"UA\":\"501234567\",\"UG\":\"712345678\",\"US\":\"2015550123\",\"UY\":\"94231234\",\"UZ\":\"912345678\",\"VA\":\"3123456789\",\"VC\":\"7844301234\",\"VE\":\"4121234567\",\"VG\":\"2843001234\",\"VI\":\"3406421234\",\"VN\":\"912345678\",\"VU\":\"5912345\",\"WF\":\"821234\",\"WS\":\"7212345\",\"XK\":\"43201234\",\"YE\":\"712345678\",\"YT\":\"639012345\",\"ZA\":\"711234567\",\"ZM\":\"955123456\",\"ZW\":\"712345678\"}","// Editor for a phone number.\n\nimport React from 'react';\nimport { defineMessages, injectIntl } from 'react-intl';\nimport { getExampleNumber, parsePhoneNumber } from 'libphonenumber-js/mobile';\nimport examples from 'libphonenumber-js/mobile/examples'\n\nimport * as dcodes from '../dcodes.json';\nimport { flagEmoji } from '../lib/strformat';\n\nconst messages = defineMessages({\n mobile_number_required: {\n id: 'mobile_number_required',\n defaultMessage: 'Mobile phone number required',\n description: 'Error message'\n }\n});\n\nclass PhoneEdit extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.codeMap = {};\n dcodes.default.forEach(dc => { this.codeMap[dc.code] = dc.dial; });\n\n const code = props.countryCode || 'US';\n const dial = this.codeMap[code];\n\n this.state = {\n countryCode: code,\n dialCode: dial,\n localNumber: '',\n placeholderNumber: this.placeholderNumber(code, dial)\n };\n\n this.handleChange = this.handleChange.bind(this);\n this.handleFinished = this.handleFinished.bind(this);\n this.handleKeyDown = this.handleKeyDown.bind(this);\n this.showCountrySelector = this.showCountrySelector.bind(this);\n }\n\n handleChange(e) {\n this.setState({localNumber: this.filterNumber(e.target.value)});\n }\n\n handleFinished(e) {\n e.preventDefault();\n const raw = `${this.state.dialCode}${this.state.localNumber.trim()}`.replace(/[^\\d]/g, '');\n let number = null;\n try {\n number = parsePhoneNumber(`+${raw}`);\n } catch (err) {}\n\n if (!number || !number.isValid()) {\n this.inputField.setCustomValidity(this.props.intl.formatMessage(messages.mobile_number_required));\n return;\n }\n this.props.onSubmit(number.format('E.164'));\n }\n\n\n handleKeyDown(e) {\n if (e.key === 'Enter') {\n this.handleFinished(e);\n }\n }\n\n showCountrySelector() {\n this.props.onShowCountrySelector(this.state.countryCode, this.state.dialCode,\n (code, dial) => {\n this.setState({\n countryCode: code,\n dialCode: dial,\n placeholderNumber: this.placeholderNumber(code, dial)\n })\n });\n }\n\n // Filter out characters not permitted in a phone number.\n filterNumber(number) {\n if (!number) {\n return number;\n }\n // Leave numbers, space, (, ), -, and .\n // The + is not allowed: it's handled by the country code portion.\n return number.replace(/[^-\\s().\\d]/g, '');\n }\n\n placeholderNumber(code, dial) {\n const sample = getExampleNumber(code, examples);\n return sample ? sample.formatInternational().substring(dial.length + 1).trim() : '123 0123';\n }\n\n render() {\n return (\n <>\n \n {flagEmoji(this.state.countryCode)} \n +{this.state.dialCode} \n {this.inputField = ref}} placeholder={this.state.placeholderNumber}\n value={this.state.localNumber} onChange={this.handleChange}\n maxLength={17} onKeyDown={this.handleKeyDown} onBlur={this.handleFinished}\n required autoFocus={this.props.autoFocus} />\n >\n );\n }\n}\n\nexport default injectIntl(PhoneEdit);\n","import withMetadataArgument from './withMetadataArgument.js'\r\nimport { getExampleNumber as _getExampleNumber } from '../../core/index.js'\r\n\r\nexport function getExampleNumber() {\r\n\treturn withMetadataArgument(_getExampleNumber, arguments)\r\n}","'use strict';\n\nvar m = require('react-dom');\nif (process.env.NODE_ENV === 'production') {\n exports.createRoot = m.createRoot;\n exports.hydrateRoot = m.hydrateRoot;\n} else {\n var i = m.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;\n exports.createRoot = function(c, o) {\n i.usingClientEntryPoint = true;\n try {\n return m.createRoot(c, o);\n } finally {\n i.usingClientEntryPoint = false;\n }\n };\n exports.hydrateRoot = function(c, h, o) {\n i.usingClientEntryPoint = true;\n try {\n return m.hydrateRoot(c, h, o);\n } finally {\n i.usingClientEntryPoint = false;\n }\n };\n}\n","module.exports = React;","module.exports = ReactDOM;","module.exports = ReactIntl;","import Metadata from '../metadata.js';\n/**\r\n * Returns a list of countries that the phone number could potentially belong to.\r\n * @param {string} callingCode — Calling code.\r\n * @param {string} nationalNumber — National (significant) number.\r\n * @param {object} metadata — Metadata.\r\n * @return {string[]} A list of possible countries.\r\n */\n\nexport default function getPossibleCountriesForNumber(callingCode, nationalNumber, metadata) {\n var _metadata = new Metadata(metadata);\n\n var possibleCountries = _metadata.getCountryCodesForCallingCode(callingCode);\n\n if (!possibleCountries) {\n return [];\n }\n\n return possibleCountries.filter(function (country) {\n return couldNationalNumberBelongToCountry(nationalNumber, country, metadata);\n });\n}\n\nfunction couldNationalNumberBelongToCountry(nationalNumber, country, metadata) {\n var _metadata = new Metadata(metadata);\n\n _metadata.selectNumberingPlan(country);\n\n if (_metadata.numberingPlan.possibleLengths().indexOf(nationalNumber.length) >= 0) {\n return true;\n }\n\n return false;\n}\n//# sourceMappingURL=getPossibleCountriesForNumber.js.map","import applyInternationalSeparatorStyle from './applyInternationalSeparatorStyle.js'; // This was originally set to $1 but there are some countries for which the\n// first group is not used in the national pattern (e.g. Argentina) so the $1\n// group does not match correctly. Therefore, we use `\\d`, so that the first\n// group actually used in the pattern will be matched.\n\nexport var FIRST_GROUP_PATTERN = /(\\$\\d)/;\nexport default function formatNationalNumberUsingFormat(number, format, _ref) {\n var useInternationalFormat = _ref.useInternationalFormat,\n withNationalPrefix = _ref.withNationalPrefix,\n carrierCode = _ref.carrierCode,\n metadata = _ref.metadata;\n var formattedNumber = number.replace(new RegExp(format.pattern()), useInternationalFormat ? format.internationalFormat() : // This library doesn't use `domestic_carrier_code_formatting_rule`,\n // because that one is only used when formatting phone numbers\n // for dialing from a mobile phone, and this is not a dialing library.\n // carrierCode && format.domesticCarrierCodeFormattingRule()\n // \t// First, replace the $CC in the formatting rule with the desired carrier code.\n // \t// Then, replace the $FG in the formatting rule with the first group\n // \t// and the carrier code combined in the appropriate way.\n // \t? format.format().replace(FIRST_GROUP_PATTERN, format.domesticCarrierCodeFormattingRule().replace('$CC', carrierCode))\n // \t: (\n // \t\twithNationalPrefix && format.nationalPrefixFormattingRule()\n // \t\t\t? format.format().replace(FIRST_GROUP_PATTERN, format.nationalPrefixFormattingRule())\n // \t\t\t: format.format()\n // \t)\n withNationalPrefix && format.nationalPrefixFormattingRule() ? format.format().replace(FIRST_GROUP_PATTERN, format.nationalPrefixFormattingRule()) : format.format());\n\n if (useInternationalFormat) {\n return applyInternationalSeparatorStyle(formattedNumber);\n }\n\n return formattedNumber;\n}\n//# sourceMappingURL=formatNationalNumberUsingFormat.js.map","import { VALID_PUNCTUATION } from '../constants.js'; // Removes brackets and replaces dashes with spaces.\n//\n// E.g. \"(999) 111-22-33\" -> \"999 111 22 33\"\n//\n// For some reason Google's metadata contains ` `s with brackets and dashes.\n// Meanwhile, there's no single opinion about using punctuation in international phone numbers.\n//\n// For example, Google's ` ` for USA is `+1 213-373-4253`.\n// And here's a quote from WikiPedia's \"North American Numbering Plan\" page:\n// https://en.wikipedia.org/wiki/North_American_Numbering_Plan\n//\n// \"The country calling code for all countries participating in the NANP is 1.\n// In international format, an NANP number should be listed as +1 301 555 01 00,\n// where 301 is an area code (Maryland).\"\n//\n// I personally prefer the international format without any punctuation.\n// For example, brackets are remnants of the old age, meaning that the\n// phone number part in brackets (so called \"area code\") can be omitted\n// if dialing within the same \"area\".\n// And hyphens were clearly introduced for splitting local numbers into memorizable groups.\n// For example, remembering \"5553535\" is difficult but \"555-35-35\" is much simpler.\n// Imagine a man taking a bus from home to work and seeing an ad with a phone number.\n// He has a couple of seconds to memorize that number until it passes by.\n// If it were spaces instead of hyphens the man wouldn't necessarily get it,\n// but with hyphens instead of spaces the grouping is more explicit.\n// I personally think that hyphens introduce visual clutter,\n// so I prefer replacing them with spaces in international numbers.\n// In the modern age all output is done on displays where spaces are clearly distinguishable\n// so hyphens can be safely replaced with spaces without losing any legibility.\n//\n\nexport default function applyInternationalSeparatorStyle(formattedNumber) {\n return formattedNumber.replace(new RegExp(\"[\".concat(VALID_PUNCTUATION, \"]+\"), 'g'), ' ').trim();\n}\n//# sourceMappingURL=applyInternationalSeparatorStyle.js.map","import Metadata from '../metadata.js';\n/**\r\n * Pattern that makes it easy to distinguish whether a region has a single\r\n * international dialing prefix or not. If a region has a single international\r\n * prefix (e.g. 011 in USA), it will be represented as a string that contains\r\n * a sequence of ASCII digits, and possibly a tilde, which signals waiting for\r\n * the tone. If there are multiple available international prefixes in a\r\n * region, they will be represented as a regex string that always contains one\r\n * or more characters that are not ASCII digits or a tilde.\r\n */\n\nvar SINGLE_IDD_PREFIX_REG_EXP = /^[\\d]+(?:[~\\u2053\\u223C\\uFF5E][\\d]+)?$/; // For regions that have multiple IDD prefixes\n// a preferred IDD prefix is returned.\n\nexport default function getIddPrefix(country, callingCode, metadata) {\n var countryMetadata = new Metadata(metadata);\n countryMetadata.selectNumberingPlan(country, callingCode);\n\n if (countryMetadata.defaultIDDPrefix()) {\n return countryMetadata.defaultIDDPrefix();\n }\n\n if (SINGLE_IDD_PREFIX_REG_EXP.test(countryMetadata.IDDPrefix())) {\n return countryMetadata.IDDPrefix();\n }\n}\n//# sourceMappingURL=getIddPrefix.js.map","function _createForOfIteratorHelperLoose(o, allowArrayLike) { var it = typeof Symbol !== \"undefined\" && o[Symbol.iterator] || o[\"@@iterator\"]; if (it) return (it = it.call(o)).next.bind(it); if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") { if (it) o = it; var i = 0; return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\n\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\n\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n// This is a port of Google Android `libphonenumber`'s\n// `phonenumberutil.js` of December 31th, 2018.\n//\n// https://github.com/googlei18n/libphonenumber/commits/master/javascript/i18n/phonenumbers/phonenumberutil.js\nimport matchesEntirely from './helpers/matchesEntirely.js';\nimport formatNationalNumberUsingFormat from './helpers/formatNationalNumberUsingFormat.js';\nimport Metadata, { getCountryCallingCode } from './metadata.js';\nimport getIddPrefix from './helpers/getIddPrefix.js';\nimport { formatRFC3966 } from './helpers/RFC3966.js';\nvar DEFAULT_OPTIONS = {\n formatExtension: function formatExtension(formattedNumber, extension, metadata) {\n return \"\".concat(formattedNumber).concat(metadata.ext()).concat(extension);\n }\n}; // Formats a phone number\n//\n// Example use cases:\n//\n// ```js\n// formatNumber('8005553535', 'RU', 'INTERNATIONAL')\n// formatNumber('8005553535', 'RU', 'INTERNATIONAL', metadata)\n// formatNumber({ phone: '8005553535', country: 'RU' }, 'INTERNATIONAL')\n// formatNumber({ phone: '8005553535', country: 'RU' }, 'INTERNATIONAL', metadata)\n// formatNumber('+78005553535', 'NATIONAL')\n// formatNumber('+78005553535', 'NATIONAL', metadata)\n// ```\n//\n\nexport default function formatNumber(input, format, options, metadata) {\n // Apply default options.\n if (options) {\n options = _objectSpread(_objectSpread({}, DEFAULT_OPTIONS), options);\n } else {\n options = DEFAULT_OPTIONS;\n }\n\n metadata = new Metadata(metadata);\n\n if (input.country && input.country !== '001') {\n // Validate `input.country`.\n if (!metadata.hasCountry(input.country)) {\n throw new Error(\"Unknown country: \".concat(input.country));\n }\n\n metadata.country(input.country);\n } else if (input.countryCallingCode) {\n metadata.selectNumberingPlan(input.countryCallingCode);\n } else return input.phone || '';\n\n var countryCallingCode = metadata.countryCallingCode();\n var nationalNumber = options.v2 ? input.nationalNumber : input.phone; // This variable should have been declared inside `case`s\n // but Babel has a bug and it says \"duplicate variable declaration\".\n\n var number;\n\n switch (format) {\n case 'NATIONAL':\n // Legacy argument support.\n // (`{ country: ..., phone: '' }`)\n if (!nationalNumber) {\n return '';\n }\n\n number = formatNationalNumber(nationalNumber, input.carrierCode, 'NATIONAL', metadata, options);\n return addExtension(number, input.ext, metadata, options.formatExtension);\n\n case 'INTERNATIONAL':\n // Legacy argument support.\n // (`{ country: ..., phone: '' }`)\n if (!nationalNumber) {\n return \"+\".concat(countryCallingCode);\n }\n\n number = formatNationalNumber(nationalNumber, null, 'INTERNATIONAL', metadata, options);\n number = \"+\".concat(countryCallingCode, \" \").concat(number);\n return addExtension(number, input.ext, metadata, options.formatExtension);\n\n case 'E.164':\n // `E.164` doesn't define \"phone number extensions\".\n return \"+\".concat(countryCallingCode).concat(nationalNumber);\n\n case 'RFC3966':\n return formatRFC3966({\n number: \"+\".concat(countryCallingCode).concat(nationalNumber),\n ext: input.ext\n });\n // For reference, here's Google's IDD formatter:\n // https://github.com/google/libphonenumber/blob/32719cf74e68796788d1ca45abc85dcdc63ba5b9/java/libphonenumber/src/com/google/i18n/phonenumbers/PhoneNumberUtil.java#L1546\n // Not saying that this IDD formatter replicates it 1:1, but it seems to work.\n // Who would even need to format phone numbers in IDD format anyway?\n\n case 'IDD':\n if (!options.fromCountry) {\n return; // throw new Error('`fromCountry` option not passed for IDD-prefixed formatting.')\n }\n\n var formattedNumber = formatIDD(nationalNumber, input.carrierCode, countryCallingCode, options.fromCountry, metadata);\n return addExtension(formattedNumber, input.ext, metadata, options.formatExtension);\n\n default:\n throw new Error(\"Unknown \\\"format\\\" argument passed to \\\"formatNumber()\\\": \\\"\".concat(format, \"\\\"\"));\n }\n}\n\nfunction formatNationalNumber(number, carrierCode, formatAs, metadata, options) {\n var format = chooseFormatForNumber(metadata.formats(), number);\n\n if (!format) {\n return number;\n }\n\n return formatNationalNumberUsingFormat(number, format, {\n useInternationalFormat: formatAs === 'INTERNATIONAL',\n withNationalPrefix: format.nationalPrefixIsOptionalWhenFormattingInNationalFormat() && options && options.nationalPrefix === false ? false : true,\n carrierCode: carrierCode,\n metadata: metadata\n });\n}\n\nfunction chooseFormatForNumber(availableFormats, nationalNnumber) {\n for (var _iterator = _createForOfIteratorHelperLoose(availableFormats), _step; !(_step = _iterator()).done;) {\n var format = _step.value;\n\n // Validate leading digits.\n // The test case for \"else path\" could be found by searching for\n // \"format.leadingDigitsPatterns().length === 0\".\n if (format.leadingDigitsPatterns().length > 0) {\n // The last leading_digits_pattern is used here, as it is the most detailed\n var lastLeadingDigitsPattern = format.leadingDigitsPatterns()[format.leadingDigitsPatterns().length - 1]; // If leading digits don't match then move on to the next phone number format\n\n if (nationalNnumber.search(lastLeadingDigitsPattern) !== 0) {\n continue;\n }\n } // Check that the national number matches the phone number format regular expression\n\n\n if (matchesEntirely(nationalNnumber, format.pattern())) {\n return format;\n }\n }\n}\n\nfunction addExtension(formattedNumber, ext, metadata, formatExtension) {\n return ext ? formatExtension(formattedNumber, ext, metadata) : formattedNumber;\n}\n\nfunction formatIDD(nationalNumber, carrierCode, countryCallingCode, fromCountry, metadata) {\n var fromCountryCallingCode = getCountryCallingCode(fromCountry, metadata.metadata); // When calling within the same country calling code.\n\n if (fromCountryCallingCode === countryCallingCode) {\n var formattedNumber = formatNationalNumber(nationalNumber, carrierCode, 'NATIONAL', metadata); // For NANPA regions, return the national format for these regions\n // but prefix it with the country calling code.\n\n if (countryCallingCode === '1') {\n return countryCallingCode + ' ' + formattedNumber;\n } // If regions share a country calling code, the country calling code need\n // not be dialled. This also applies when dialling within a region, so this\n // if clause covers both these cases. Technically this is the case for\n // dialling from La Reunion to other overseas departments of France (French\n // Guiana, Martinique, Guadeloupe), but not vice versa - so we don't cover\n // this edge case for now and for those cases return the version including\n // country calling code. Details here:\n // http://www.petitfute.com/voyage/225-info-pratiques-reunion\n //\n\n\n return formattedNumber;\n }\n\n var iddPrefix = getIddPrefix(fromCountry, undefined, metadata.metadata);\n\n if (iddPrefix) {\n return \"\".concat(iddPrefix, \" \").concat(countryCallingCode, \" \").concat(formatNationalNumber(nationalNumber, null, 'INTERNATIONAL', metadata));\n }\n}\n//# sourceMappingURL=format_.js.map","function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\nimport Metadata from './metadata.js';\nimport isPossibleNumber from './isPossibleNumber_.js';\nimport isValidNumber from './validate_.js';\nimport isValidNumberForRegion from './isValidNumberForRegion_.js';\nimport getNumberType from './helpers/getNumberType.js';\nimport getPossibleCountriesForNumber from './helpers/getPossibleCountriesForNumber.js';\nimport formatNumber from './format_.js';\nvar USE_NON_GEOGRAPHIC_COUNTRY_CODE = false;\n\nvar PhoneNumber = /*#__PURE__*/function () {\n function PhoneNumber(countryCallingCode, nationalNumber, metadata) {\n _classCallCheck(this, PhoneNumber);\n\n if (!countryCallingCode) {\n throw new TypeError('`country` or `countryCallingCode` not passed');\n }\n\n if (!nationalNumber) {\n throw new TypeError('`nationalNumber` not passed');\n }\n\n if (!metadata) {\n throw new TypeError('`metadata` not passed');\n }\n\n var _metadata = new Metadata(metadata); // If country code is passed then derive `countryCallingCode` from it.\n // Also store the country code as `.country`.\n\n\n if (isCountryCode(countryCallingCode)) {\n this.country = countryCallingCode;\n\n _metadata.country(countryCallingCode);\n\n countryCallingCode = _metadata.countryCallingCode();\n } else {\n /* istanbul ignore if */\n if (USE_NON_GEOGRAPHIC_COUNTRY_CODE) {\n if (_metadata.isNonGeographicCallingCode(countryCallingCode)) {\n this.country = '001';\n }\n }\n }\n\n this.countryCallingCode = countryCallingCode;\n this.nationalNumber = nationalNumber;\n this.number = '+' + this.countryCallingCode + this.nationalNumber;\n this.metadata = metadata;\n }\n\n _createClass(PhoneNumber, [{\n key: \"setExt\",\n value: function setExt(ext) {\n this.ext = ext;\n }\n }, {\n key: \"getPossibleCountries\",\n value: function getPossibleCountries() {\n if (this.country) {\n return [this.country];\n }\n\n return getPossibleCountriesForNumber(this.countryCallingCode, this.nationalNumber, this.metadata);\n }\n }, {\n key: \"isPossible\",\n value: function isPossible() {\n return isPossibleNumber(this, {\n v2: true\n }, this.metadata);\n }\n }, {\n key: \"isValid\",\n value: function isValid() {\n return isValidNumber(this, {\n v2: true\n }, this.metadata);\n }\n }, {\n key: \"isNonGeographic\",\n value: function isNonGeographic() {\n var metadata = new Metadata(this.metadata);\n return metadata.isNonGeographicCallingCode(this.countryCallingCode);\n }\n }, {\n key: \"isEqual\",\n value: function isEqual(phoneNumber) {\n return this.number === phoneNumber.number && this.ext === phoneNumber.ext;\n } // // Is just an alias for `this.isValid() && this.country === country`.\n // // https://github.com/googlei18n/libphonenumber/blob/master/FAQ.md#when-should-i-use-isvalidnumberforregion\n // isValidForRegion(country) {\n // \treturn isValidNumberForRegion(this, country, { v2: true }, this.metadata)\n // }\n\n }, {\n key: \"getType\",\n value: function getType() {\n return getNumberType(this, {\n v2: true\n }, this.metadata);\n }\n }, {\n key: \"format\",\n value: function format(_format, options) {\n return formatNumber(this, _format, options ? _objectSpread(_objectSpread({}, options), {}, {\n v2: true\n }) : {\n v2: true\n }, this.metadata);\n }\n }, {\n key: \"formatNational\",\n value: function formatNational(options) {\n return this.format('NATIONAL', options);\n }\n }, {\n key: \"formatInternational\",\n value: function formatInternational(options) {\n return this.format('INTERNATIONAL', options);\n }\n }, {\n key: \"getURI\",\n value: function getURI(options) {\n return this.format('RFC3966', options);\n }\n }]);\n\n return PhoneNumber;\n}();\n\nexport { PhoneNumber as default };\n\nvar isCountryCode = function isCountryCode(value) {\n return /^[A-Z]{2}$/.test(value);\n};\n//# sourceMappingURL=PhoneNumber.js.map","import Metadata from './metadata.js';\nimport matchesEntirely from './helpers/matchesEntirely.js';\nimport getNumberType from './helpers/getNumberType.js';\n/**\r\n * Checks if a given phone number is valid.\r\n *\r\n * If the `number` is a string, it will be parsed to an object,\r\n * but only if it contains only valid phone number characters (including punctuation).\r\n * If the `number` is an object, it is used as is.\r\n *\r\n * The optional `defaultCountry` argument is the default country.\r\n * I.e. it does not restrict to just that country,\r\n * e.g. in those cases where several countries share\r\n * the same phone numbering rules (NANPA, Britain, etc).\r\n * For example, even though the number `07624 369230`\r\n * belongs to the Isle of Man (\"IM\" country code)\r\n * calling `isValidNumber('07624369230', 'GB', metadata)`\r\n * still returns `true` because the country is not restricted to `GB`,\r\n * it's just that `GB` is the default one for the phone numbering rules.\r\n * For restricting the country see `isValidNumberForRegion()`\r\n * though restricting a country might not be a good idea.\r\n * https://github.com/googlei18n/libphonenumber/blob/master/FAQ.md#when-should-i-use-isvalidnumberforregion\r\n *\r\n * Examples:\r\n *\r\n * ```js\r\n * isValidNumber('+78005553535', metadata)\r\n * isValidNumber('8005553535', 'RU', metadata)\r\n * isValidNumber('88005553535', 'RU', metadata)\r\n * isValidNumber({ phone: '8005553535', country: 'RU' }, metadata)\r\n * ```\r\n */\n\nexport default function isValidNumber(input, options, metadata) {\n // If assigning the `{}` default value is moved to the arguments above,\n // code coverage would decrease for some weird reason.\n options = options || {};\n metadata = new Metadata(metadata); // This is just to support `isValidNumber({})`\n // for cases when `parseNumber()` returns `{}`.\n\n if (!input.country) {\n return false;\n }\n\n metadata.selectNumberingPlan(input.country, input.countryCallingCode); // By default, countries only have type regexps when it's required for\n // distinguishing different countries having the same `countryCallingCode`.\n\n if (metadata.hasTypes()) {\n return getNumberType(input, options, metadata.metadata) !== undefined;\n } // If there are no type regexps for this country in metadata then use\n // `nationalNumberPattern` as a \"better than nothing\" replacement.\n\n\n var national_number = options.v2 ? input.nationalNumber : input.phone;\n return matchesEntirely(national_number, metadata.nationalNumberPattern());\n}\n//# sourceMappingURL=validate_.js.map","// The minimum length of the national significant number.\nexport var MIN_LENGTH_FOR_NSN = 2; // The ITU says the maximum length should be 15,\n// but one can find longer numbers in Germany.\n\nexport var MAX_LENGTH_FOR_NSN = 17; // The maximum length of the country calling code.\n\nexport var MAX_LENGTH_COUNTRY_CODE = 3; // Digits accepted in phone numbers\n// (ascii, fullwidth, arabic-indic, and eastern arabic digits).\n\nexport var VALID_DIGITS = \"0-9\\uFF10-\\uFF19\\u0660-\\u0669\\u06F0-\\u06F9\"; // `DASHES` will be right after the opening square bracket of the \"character class\"\n\nvar DASHES = \"-\\u2010-\\u2015\\u2212\\u30FC\\uFF0D\";\nvar SLASHES = \"\\uFF0F/\";\nvar DOTS = \"\\uFF0E.\";\nexport var WHITESPACE = \" \\xA0\\xAD\\u200B\\u2060\\u3000\";\nvar BRACKETS = \"()\\uFF08\\uFF09\\uFF3B\\uFF3D\\\\[\\\\]\"; // export const OPENING_BRACKETS = '(\\uFF08\\uFF3B\\\\\\['\n\nvar TILDES = \"~\\u2053\\u223C\\uFF5E\"; // Regular expression of acceptable punctuation found in phone numbers. This\n// excludes punctuation found as a leading character only. This consists of dash\n// characters, white space characters, full stops, slashes, square brackets,\n// parentheses and tildes. Full-width variants are also present.\n\nexport var VALID_PUNCTUATION = \"\".concat(DASHES).concat(SLASHES).concat(DOTS).concat(WHITESPACE).concat(BRACKETS).concat(TILDES);\nexport var PLUS_CHARS = \"+\\uFF0B\"; // const LEADING_PLUS_CHARS_PATTERN = new RegExp('^[' + PLUS_CHARS + ']+')\n//# sourceMappingURL=constants.js.map","function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }\n\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\n\nfunction _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== \"undefined\" && arr[Symbol.iterator] || arr[\"@@iterator\"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"] != null) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; }\n\nfunction _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }\n\nfunction _createForOfIteratorHelperLoose(o, allowArrayLike) { var it = typeof Symbol !== \"undefined\" && o[Symbol.iterator] || o[\"@@iterator\"]; if (it) return (it = it.call(o)).next.bind(it); if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") { if (it) o = it; var i = 0; return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\n\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\n\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n\nimport isViablePhoneNumber from './isViablePhoneNumber.js'; // https://www.ietf.org/rfc/rfc3966.txt\n\n/**\r\n * @param {string} text - Phone URI (RFC 3966).\r\n * @return {object} `{ ?number, ?ext }`.\r\n */\n\nexport function parseRFC3966(text) {\n var number;\n var ext; // Replace \"tel:\" with \"tel=\" for parsing convenience.\n\n text = text.replace(/^tel:/, 'tel=');\n\n for (var _iterator = _createForOfIteratorHelperLoose(text.split(';')), _step; !(_step = _iterator()).done;) {\n var part = _step.value;\n\n var _part$split = part.split('='),\n _part$split2 = _slicedToArray(_part$split, 2),\n name = _part$split2[0],\n value = _part$split2[1];\n\n switch (name) {\n case 'tel':\n number = value;\n break;\n\n case 'ext':\n ext = value;\n break;\n\n case 'phone-context':\n // Only \"country contexts\" are supported.\n // \"Domain contexts\" are ignored.\n if (value[0] === '+') {\n number = value + number;\n }\n\n break;\n }\n } // If the phone number is not viable, then abort.\n\n\n if (!isViablePhoneNumber(number)) {\n return {};\n }\n\n var result = {\n number: number\n };\n\n if (ext) {\n result.ext = ext;\n }\n\n return result;\n}\n/**\r\n * @param {object} - `{ ?number, ?extension }`.\r\n * @return {string} Phone URI (RFC 3966).\r\n */\n\nexport function formatRFC3966(_ref) {\n var number = _ref.number,\n ext = _ref.ext;\n\n if (!number) {\n return '';\n }\n\n if (number[0] !== '+') {\n throw new Error(\"\\\"formatRFC3966()\\\" expects \\\"number\\\" to be in E.164 format.\");\n }\n\n return \"tel:\".concat(number).concat(ext ? ';ext=' + ext : '');\n}\n//# sourceMappingURL=RFC3966.js.map","function _createForOfIteratorHelperLoose(o, allowArrayLike) { var it = typeof Symbol !== \"undefined\" && o[Symbol.iterator] || o[\"@@iterator\"]; if (it) return (it = it.call(o)).next.bind(it); if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") { if (it) o = it; var i = 0; return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\n\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\n\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n\n/**\r\n * Merges two arrays.\r\n * @param {*} a\r\n * @param {*} b\r\n * @return {*}\r\n */\nexport default function mergeArrays(a, b) {\n var merged = a.slice();\n\n for (var _iterator = _createForOfIteratorHelperLoose(b), _step; !(_step = _iterator()).done;) {\n var element = _step.value;\n\n if (a.indexOf(element) < 0) {\n merged.push(element);\n }\n }\n\n return merged.sort(function (a, b) {\n return a - b;\n }); // ES6 version, requires Set polyfill.\n // let merged = new Set(a)\n // for (const element of b) {\n // \tmerged.add(i)\n // }\n // return Array.from(merged).sort((a, b) => a - b)\n}\n//# sourceMappingURL=mergeArrays.js.map","import mergeArrays from './mergeArrays.js';\nexport default function checkNumberLength(nationalNumber, metadata) {\n return checkNumberLengthForType(nationalNumber, undefined, metadata);\n} // Checks whether a number is possible for the country based on its length.\n// Should only be called for the \"new\" metadata which has \"possible lengths\".\n\nexport function checkNumberLengthForType(nationalNumber, type, metadata) {\n var type_info = metadata.type(type); // There should always be \" \" set for every type element.\n // This is declared in the XML schema.\n // For size efficiency, where a sub-description (e.g. fixed-line)\n // has the same \" \" as the \"general description\", this is missing,\n // so we fall back to the \"general description\". Where no numbers of the type\n // exist at all, there is one possible length (-1) which is guaranteed\n // not to match the length of any real phone number.\n\n var possible_lengths = type_info && type_info.possibleLengths() || metadata.possibleLengths(); // let local_lengths = type_info && type.possibleLengthsLocal() || metadata.possibleLengthsLocal()\n // Metadata before version `1.0.18` didn't contain `possible_lengths`.\n\n if (!possible_lengths) {\n return 'IS_POSSIBLE';\n }\n\n if (type === 'FIXED_LINE_OR_MOBILE') {\n // No such country in metadata.\n\n /* istanbul ignore next */\n if (!metadata.type('FIXED_LINE')) {\n // The rare case has been encountered where no fixedLine data is available\n // (true for some non-geographic entities), so we just check mobile.\n return checkNumberLengthForType(nationalNumber, 'MOBILE', metadata);\n }\n\n var mobile_type = metadata.type('MOBILE');\n\n if (mobile_type) {\n // Merge the mobile data in if there was any. \"Concat\" creates a new\n // array, it doesn't edit possible_lengths in place, so we don't need a copy.\n // Note that when adding the possible lengths from mobile, we have\n // to again check they aren't empty since if they are this indicates\n // they are the same as the general desc and should be obtained from there.\n possible_lengths = mergeArrays(possible_lengths, mobile_type.possibleLengths()); // The current list is sorted; we need to merge in the new list and\n // re-sort (duplicates are okay). Sorting isn't so expensive because\n // the lists are very small.\n // if (local_lengths) {\n // \tlocal_lengths = mergeArrays(local_lengths, mobile_type.possibleLengthsLocal())\n // } else {\n // \tlocal_lengths = mobile_type.possibleLengthsLocal()\n // }\n }\n } // If the type doesn't exist then return 'INVALID_LENGTH'.\n else if (type && !type_info) {\n return 'INVALID_LENGTH';\n }\n\n var actual_length = nationalNumber.length; // In `libphonenumber-js` all \"local-only\" formats are dropped for simplicity.\n // // This is safe because there is never an overlap beween the possible lengths\n // // and the local-only lengths; this is checked at build time.\n // if (local_lengths && local_lengths.indexOf(nationalNumber.length) >= 0)\n // {\n // \treturn 'IS_POSSIBLE_LOCAL_ONLY'\n // }\n\n var minimum_length = possible_lengths[0];\n\n if (minimum_length === actual_length) {\n return 'IS_POSSIBLE';\n }\n\n if (minimum_length > actual_length) {\n return 'TOO_SHORT';\n }\n\n if (possible_lengths[possible_lengths.length - 1] < actual_length) {\n return 'TOO_LONG';\n } // We skip the first element since we've already checked it.\n\n\n return possible_lengths.indexOf(actual_length, 1) >= 0 ? 'IS_POSSIBLE' : 'INVALID_LENGTH';\n}\n//# sourceMappingURL=checkNumberLength.js.map","import { VALID_DIGITS } from '../../constants.js'; // The RFC 3966 format for extensions.\n\nvar RFC3966_EXTN_PREFIX = ';ext=';\n/**\r\n * Helper method for constructing regular expressions for parsing. Creates\r\n * an expression that captures up to max_length digits.\r\n * @return {string} RegEx pattern to capture extension digits.\r\n */\n\nvar getExtensionDigitsPattern = function getExtensionDigitsPattern(maxLength) {\n return \"([\".concat(VALID_DIGITS, \"]{1,\").concat(maxLength, \"})\");\n};\n/**\r\n * Helper initialiser method to create the regular-expression pattern to match\r\n * extensions.\r\n * Copy-pasted from Google's `libphonenumber`:\r\n * https://github.com/google/libphonenumber/blob/55b2646ec9393f4d3d6661b9c82ef9e258e8b829/javascript/i18n/phonenumbers/phonenumberutil.js#L759-L766\r\n * @return {string} RegEx pattern to capture extensions.\r\n */\n\n\nexport default function createExtensionPattern(purpose) {\n // We cap the maximum length of an extension based on the ambiguity of the way\n // the extension is prefixed. As per ITU, the officially allowed length for\n // extensions is actually 40, but we don't support this since we haven't seen real\n // examples and this introduces many false interpretations as the extension labels\n // are not standardized.\n\n /** @type {string} */\n var extLimitAfterExplicitLabel = '20';\n /** @type {string} */\n\n var extLimitAfterLikelyLabel = '15';\n /** @type {string} */\n\n var extLimitAfterAmbiguousChar = '9';\n /** @type {string} */\n\n var extLimitWhenNotSure = '6';\n /** @type {string} */\n\n var possibleSeparatorsBetweenNumberAndExtLabel = \"[ \\xA0\\\\t,]*\"; // Optional full stop (.) or colon, followed by zero or more spaces/tabs/commas.\n\n /** @type {string} */\n\n var possibleCharsAfterExtLabel = \"[:\\\\.\\uFF0E]?[ \\xA0\\\\t,-]*\";\n /** @type {string} */\n\n var optionalExtnSuffix = \"#?\"; // Here the extension is called out in more explicit way, i.e mentioning it obvious\n // patterns like \"ext.\".\n\n /** @type {string} */\n\n var explicitExtLabels = \"(?:e?xt(?:ensi(?:o\\u0301?|\\xF3))?n?|\\uFF45?\\uFF58\\uFF54\\uFF4E?|\\u0434\\u043E\\u0431|anexo)\"; // One-character symbols that can be used to indicate an extension, and less\n // commonly used or more ambiguous extension labels.\n\n /** @type {string} */\n\n var ambiguousExtLabels = \"(?:[x\\uFF58#\\uFF03~\\uFF5E]|int|\\uFF49\\uFF4E\\uFF54)\"; // When extension is not separated clearly.\n\n /** @type {string} */\n\n var ambiguousSeparator = \"[- ]+\"; // This is the same as possibleSeparatorsBetweenNumberAndExtLabel, but not matching\n // comma as extension label may have it.\n\n /** @type {string} */\n\n var possibleSeparatorsNumberExtLabelNoComma = \"[ \\xA0\\\\t]*\"; // \",,\" is commonly used for auto dialling the extension when connected. First\n // comma is matched through possibleSeparatorsBetweenNumberAndExtLabel, so we do\n // not repeat it here. Semi-colon works in Iphone and Android also to pop up a\n // button with the extension number following.\n\n /** @type {string} */\n\n var autoDiallingAndExtLabelsFound = \"(?:,{2}|;)\";\n /** @type {string} */\n\n var rfcExtn = RFC3966_EXTN_PREFIX + getExtensionDigitsPattern(extLimitAfterExplicitLabel);\n /** @type {string} */\n\n var explicitExtn = possibleSeparatorsBetweenNumberAndExtLabel + explicitExtLabels + possibleCharsAfterExtLabel + getExtensionDigitsPattern(extLimitAfterExplicitLabel) + optionalExtnSuffix;\n /** @type {string} */\n\n var ambiguousExtn = possibleSeparatorsBetweenNumberAndExtLabel + ambiguousExtLabels + possibleCharsAfterExtLabel + getExtensionDigitsPattern(extLimitAfterAmbiguousChar) + optionalExtnSuffix;\n /** @type {string} */\n\n var americanStyleExtnWithSuffix = ambiguousSeparator + getExtensionDigitsPattern(extLimitWhenNotSure) + \"#\";\n /** @type {string} */\n\n var autoDiallingExtn = possibleSeparatorsNumberExtLabelNoComma + autoDiallingAndExtLabelsFound + possibleCharsAfterExtLabel + getExtensionDigitsPattern(extLimitAfterLikelyLabel) + optionalExtnSuffix;\n /** @type {string} */\n\n var onlyCommasExtn = possibleSeparatorsNumberExtLabelNoComma + \"(?:,)+\" + possibleCharsAfterExtLabel + getExtensionDigitsPattern(extLimitAfterAmbiguousChar) + optionalExtnSuffix; // The first regular expression covers RFC 3966 format, where the extension is added\n // using \";ext=\". The second more generic where extension is mentioned with explicit\n // labels like \"ext:\". In both the above cases we allow more numbers in extension than\n // any other extension labels. The third one captures when single character extension\n // labels or less commonly used labels are used. In such cases we capture fewer\n // extension digits in order to reduce the chance of falsely interpreting two\n // numbers beside each other as a number + extension. The fourth one covers the\n // special case of American numbers where the extension is written with a hash\n // at the end, such as \"- 503#\". The fifth one is exclusively for extension\n // autodialling formats which are used when dialling and in this case we accept longer\n // extensions. The last one is more liberal on the number of commas that acts as\n // extension labels, so we have a strict cap on the number of digits in such extensions.\n\n return rfcExtn + \"|\" + explicitExtn + \"|\" + ambiguousExtn + \"|\" + americanStyleExtnWithSuffix + \"|\" + autoDiallingExtn + \"|\" + onlyCommasExtn;\n}\n//# sourceMappingURL=createExtensionPattern.js.map","function _createForOfIteratorHelperLoose(o, allowArrayLike) { var it = typeof Symbol !== \"undefined\" && o[Symbol.iterator] || o[\"@@iterator\"]; if (it) return (it = it.call(o)).next.bind(it); if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") { if (it) o = it; var i = 0; return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\n\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\n\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n\nimport Metadata from '../metadata.js';\nimport matchesEntirely from './matchesEntirely.js';\nvar NON_FIXED_LINE_PHONE_TYPES = ['MOBILE', 'PREMIUM_RATE', 'TOLL_FREE', 'SHARED_COST', 'VOIP', 'PERSONAL_NUMBER', 'PAGER', 'UAN', 'VOICEMAIL']; // Finds out national phone number type (fixed line, mobile, etc)\n\nexport default function getNumberType(input, options, metadata) {\n // If assigning the `{}` default value is moved to the arguments above,\n // code coverage would decrease for some weird reason.\n options = options || {}; // When `parse()` returned `{}`\n // meaning that the phone number is not a valid one.\n\n if (!input.country) {\n return;\n }\n\n metadata = new Metadata(metadata);\n metadata.selectNumberingPlan(input.country, input.countryCallingCode);\n var nationalNumber = options.v2 ? input.nationalNumber : input.phone; // The following is copy-pasted from the original function:\n // https://github.com/googlei18n/libphonenumber/blob/3ea547d4fbaa2d0b67588904dfa5d3f2557c27ff/javascript/i18n/phonenumbers/phonenumberutil.js#L2835\n // Is this national number even valid for this country\n\n if (!matchesEntirely(nationalNumber, metadata.nationalNumberPattern())) {\n return;\n } // Is it fixed line number\n\n\n if (isNumberTypeEqualTo(nationalNumber, 'FIXED_LINE', metadata)) {\n // Because duplicate regular expressions are removed\n // to reduce metadata size, if \"mobile\" pattern is \"\"\n // then it means it was removed due to being a duplicate of the fixed-line pattern.\n //\n if (metadata.type('MOBILE') && metadata.type('MOBILE').pattern() === '') {\n return 'FIXED_LINE_OR_MOBILE';\n } // `MOBILE` type pattern isn't included if it matched `FIXED_LINE` one.\n // For example, for \"US\" country.\n // Old metadata (< `1.0.18`) had a specific \"types\" data structure\n // that happened to be `undefined` for `MOBILE` in that case.\n // Newer metadata (>= `1.0.18`) has another data structure that is\n // not `undefined` for `MOBILE` in that case (it's just an empty array).\n // So this `if` is just for backwards compatibility with old metadata.\n\n\n if (!metadata.type('MOBILE')) {\n return 'FIXED_LINE_OR_MOBILE';\n } // Check if the number happens to qualify as both fixed line and mobile.\n // (no such country in the minimal metadata set)\n\n /* istanbul ignore if */\n\n\n if (isNumberTypeEqualTo(nationalNumber, 'MOBILE', metadata)) {\n return 'FIXED_LINE_OR_MOBILE';\n }\n\n return 'FIXED_LINE';\n }\n\n for (var _iterator = _createForOfIteratorHelperLoose(NON_FIXED_LINE_PHONE_TYPES), _step; !(_step = _iterator()).done;) {\n var type = _step.value;\n\n if (isNumberTypeEqualTo(nationalNumber, type, metadata)) {\n return type;\n }\n }\n}\nexport function isNumberTypeEqualTo(nationalNumber, type, metadata) {\n type = metadata.type(type);\n\n if (!type || !type.pattern()) {\n return false;\n } // Check if any possible number lengths are present;\n // if so, we use them to avoid checking\n // the validation pattern if they don't match.\n // If they are absent, this means they match\n // the general description, which we have\n // already checked before a specific number type.\n\n\n if (type.possibleLengths() && type.possibleLengths().indexOf(nationalNumber.length) < 0) {\n return false;\n }\n\n return matchesEntirely(nationalNumber, type.pattern());\n}\n//# sourceMappingURL=getNumberType.js.map","import { MIN_LENGTH_FOR_NSN, VALID_DIGITS, VALID_PUNCTUATION, PLUS_CHARS } from '../constants.js';\nimport createExtensionPattern from './extension/createExtensionPattern.js'; // Regular expression of viable phone numbers. This is location independent.\n// Checks we have at least three leading digits, and only valid punctuation,\n// alpha characters and digits in the phone number. Does not include extension\n// data. The symbol 'x' is allowed here as valid punctuation since it is often\n// used as a placeholder for carrier codes, for example in Brazilian phone\n// numbers. We also allow multiple '+' characters at the start.\n//\n// Corresponds to the following:\n// [digits]{minLengthNsn}|\n// plus_sign*\n// (([punctuation]|[star])*[digits]){3,}([punctuation]|[star]|[digits]|[alpha])*\n//\n// The first reg-ex is to allow short numbers (two digits long) to be parsed if\n// they are entered as \"15\" etc, but only if there is no punctuation in them.\n// The second expression restricts the number of digits to three or more, but\n// then allows them to be in international form, and to have alpha-characters\n// and punctuation. We split up the two reg-exes here and combine them when\n// creating the reg-ex VALID_PHONE_NUMBER_PATTERN itself so we can prefix it\n// with ^ and append $ to each branch.\n//\n// \"Note VALID_PUNCTUATION starts with a -,\n// so must be the first in the range\" (c) Google devs.\n// (wtf did they mean by saying that; probably nothing)\n//\n\nvar MIN_LENGTH_PHONE_NUMBER_PATTERN = '[' + VALID_DIGITS + ']{' + MIN_LENGTH_FOR_NSN + '}'; //\n// And this is the second reg-exp:\n// (see MIN_LENGTH_PHONE_NUMBER_PATTERN for a full description of this reg-exp)\n//\n\nexport var VALID_PHONE_NUMBER = '[' + PLUS_CHARS + ']{0,1}' + '(?:' + '[' + VALID_PUNCTUATION + ']*' + '[' + VALID_DIGITS + ']' + '){3,}' + '[' + VALID_PUNCTUATION + VALID_DIGITS + ']*'; // This regular expression isn't present in Google's `libphonenumber`\n// and is only used to determine whether the phone number being input\n// is too short for it to even consider it a \"valid\" number.\n// This is just a way to differentiate between a really invalid phone\n// number like \"abcde\" and a valid phone number that a user has just\n// started inputting, like \"+1\" or \"1\": both these cases would be\n// considered `NOT_A_NUMBER` by Google's `libphonenumber`, but this\n// library can provide a more detailed error message — whether it's\n// really \"not a number\", or is it just a start of a valid phone number.\n\nvar VALID_PHONE_NUMBER_START_REG_EXP = new RegExp('^' + '[' + PLUS_CHARS + ']{0,1}' + '(?:' + '[' + VALID_PUNCTUATION + ']*' + '[' + VALID_DIGITS + ']' + '){1,2}' + '$', 'i');\nexport var VALID_PHONE_NUMBER_WITH_EXTENSION = VALID_PHONE_NUMBER + // Phone number extensions\n'(?:' + createExtensionPattern() + ')?'; // The combined regular expression for valid phone numbers:\n//\n\nvar VALID_PHONE_NUMBER_PATTERN = new RegExp( // Either a short two-digit-only phone number\n'^' + MIN_LENGTH_PHONE_NUMBER_PATTERN + '$' + '|' + // Or a longer fully parsed phone number (min 3 characters)\n'^' + VALID_PHONE_NUMBER_WITH_EXTENSION + '$', 'i'); // Checks to see if the string of characters could possibly be a phone number at\n// all. At the moment, checks to see that the string begins with at least 2\n// digits, ignoring any punctuation commonly found in phone numbers. This method\n// does not require the number to be normalized in advance - but does assume\n// that leading non-number symbols have been removed, such as by the method\n// `extract_possible_number`.\n//\n\nexport default function isViablePhoneNumber(number) {\n return number.length >= MIN_LENGTH_FOR_NSN && VALID_PHONE_NUMBER_PATTERN.test(number);\n} // This is just a way to differentiate between a really invalid phone\n// number like \"abcde\" and a valid phone number that a user has just\n// started inputting, like \"+1\" or \"1\": both these cases would be\n// considered `NOT_A_NUMBER` by Google's `libphonenumber`, but this\n// library can provide a more detailed error message — whether it's\n// really \"not a number\", or is it just a start of a valid phone number.\n\nexport function isViablePhoneNumberStart(number) {\n return VALID_PHONE_NUMBER_START_REG_EXP.test(number);\n}\n//# sourceMappingURL=isViablePhoneNumber.js.map","/**\r\n * Checks whether the entire input sequence can be matched\r\n * against the regular expression.\r\n * @return {boolean}\r\n */\nexport default function matchesEntirely(text, regular_expression) {\n // If assigning the `''` default value is moved to the arguments above,\n // code coverage would decrease for some weird reason.\n text = text || '';\n return new RegExp('^(?:' + regular_expression + ')$').test(text);\n}\n//# sourceMappingURL=matchesEntirely.js.map","import Metadata from './metadata.js';\nimport checkNumberLength from './helpers/checkNumberLength.js';\nexport default function isPossiblePhoneNumber(input, options, metadata) {\n /* istanbul ignore if */\n if (options === undefined) {\n options = {};\n }\n\n metadata = new Metadata(metadata);\n\n if (options.v2) {\n if (!input.countryCallingCode) {\n throw new Error('Invalid phone number object passed');\n }\n\n metadata.selectNumberingPlan(input.countryCallingCode);\n } else {\n if (!input.phone) {\n return false;\n }\n\n if (input.country) {\n if (!metadata.hasCountry(input.country)) {\n throw new Error(\"Unknown country: \".concat(input.country));\n }\n\n metadata.country(input.country);\n } else {\n if (!input.countryCallingCode) {\n throw new Error('Invalid phone number object passed');\n }\n\n metadata.selectNumberingPlan(input.countryCallingCode);\n }\n } // Old metadata (< 1.0.18) had no \"possible length\" data.\n\n\n if (metadata.possibleLengths()) {\n return isPossibleNumber(input.phone || input.nationalNumber, metadata);\n } else {\n // There was a bug between `1.7.35` and `1.7.37` where \"possible_lengths\"\n // were missing for \"non-geographical\" numbering plans.\n // Just assume the number is possible in such cases:\n // it's unlikely that anyone generated their custom metadata\n // in that short period of time (one day).\n // This code can be removed in some future major version update.\n if (input.countryCallingCode && metadata.isNonGeographicCallingCode(input.countryCallingCode)) {\n // \"Non-geographic entities\" did't have `possibleLengths`\n // due to a bug in metadata generation process.\n return true;\n } else {\n throw new Error('Missing \"possibleLengths\" in metadata. Perhaps the metadata has been generated before v1.0.18.');\n }\n }\n}\nexport function isPossibleNumber(nationalNumber, metadata) {\n //, isInternational) {\n switch (checkNumberLength(nationalNumber, metadata)) {\n case 'IS_POSSIBLE':\n return true;\n // This library ignores \"local-only\" phone numbers (for simplicity).\n // See the readme for more info on what are \"local-only\" phone numbers.\n // case 'IS_POSSIBLE_LOCAL_ONLY':\n // \treturn !isInternational\n\n default:\n return false;\n }\n}\n//# sourceMappingURL=isPossibleNumber_.js.map","// Copy-pasted from:\n// https://github.com/substack/semver-compare/blob/master/index.js\n//\n// Inlining this function because some users reported issues with\n// importing from `semver-compare` in a browser with ES6 \"native\" modules.\n//\n// Fixes `semver-compare` not being able to compare versions with alpha/beta/etc \"tags\".\n// https://github.com/catamphetamine/libphonenumber-js/issues/381\nexport default function (a, b) {\n a = a.split('-');\n b = b.split('-');\n var pa = a[0].split('.');\n var pb = b[0].split('.');\n\n for (var i = 0; i < 3; i++) {\n var na = Number(pa[i]);\n var nb = Number(pb[i]);\n if (na > nb) return 1;\n if (nb > na) return -1;\n if (!isNaN(na) && isNaN(nb)) return 1;\n if (isNaN(na) && !isNaN(nb)) return -1;\n }\n\n if (a[1] && b[1]) {\n return a[1] > b[1] ? 1 : a[1] < b[1] ? -1 : 0;\n }\n\n return !a[1] && b[1] ? 1 : a[1] && !b[1] ? -1 : 0;\n}\n//# sourceMappingURL=semver-compare.js.map","function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\nimport compare from './tools/semver-compare.js'; // Added \"possibleLengths\" and renamed\n// \"country_phone_code_to_countries\" to \"country_calling_codes\".\n\nvar V2 = '1.0.18'; // Added \"idd_prefix\" and \"default_idd_prefix\".\n\nvar V3 = '1.2.0'; // Moved `001` country code to \"nonGeographic\" section of metadata.\n\nvar V4 = '1.7.35';\nvar DEFAULT_EXT_PREFIX = ' ext. ';\nvar CALLING_CODE_REG_EXP = /^\\d+$/;\n/**\r\n * See: https://gitlab.com/catamphetamine/libphonenumber-js/blob/master/METADATA.md\r\n */\n\nvar Metadata = /*#__PURE__*/function () {\n function Metadata(metadata) {\n _classCallCheck(this, Metadata);\n\n validateMetadata(metadata);\n this.metadata = metadata;\n setVersion.call(this, metadata);\n }\n\n _createClass(Metadata, [{\n key: \"getCountries\",\n value: function getCountries() {\n return Object.keys(this.metadata.countries).filter(function (_) {\n return _ !== '001';\n });\n }\n }, {\n key: \"getCountryMetadata\",\n value: function getCountryMetadata(countryCode) {\n return this.metadata.countries[countryCode];\n }\n }, {\n key: \"nonGeographic\",\n value: function nonGeographic() {\n if (this.v1 || this.v2 || this.v3) return; // `nonGeographical` was a typo.\n // It's present in metadata generated from `1.7.35` to `1.7.37`.\n // The test case could be found by searching for \"nonGeographical\".\n\n return this.metadata.nonGeographic || this.metadata.nonGeographical;\n }\n }, {\n key: \"hasCountry\",\n value: function hasCountry(country) {\n return this.getCountryMetadata(country) !== undefined;\n }\n }, {\n key: \"hasCallingCode\",\n value: function hasCallingCode(callingCode) {\n if (this.getCountryCodesForCallingCode(callingCode)) {\n return true;\n }\n\n if (this.nonGeographic()) {\n if (this.nonGeographic()[callingCode]) {\n return true;\n }\n } else {\n // A hacky workaround for old custom metadata (generated before V4).\n var countryCodes = this.countryCallingCodes()[callingCode];\n\n if (countryCodes && countryCodes.length === 1 && countryCodes[0] === '001') {\n return true;\n }\n }\n }\n }, {\n key: \"isNonGeographicCallingCode\",\n value: function isNonGeographicCallingCode(callingCode) {\n if (this.nonGeographic()) {\n return this.nonGeographic()[callingCode] ? true : false;\n } else {\n return this.getCountryCodesForCallingCode(callingCode) ? false : true;\n }\n } // Deprecated.\n\n }, {\n key: \"country\",\n value: function country(countryCode) {\n return this.selectNumberingPlan(countryCode);\n }\n }, {\n key: \"selectNumberingPlan\",\n value: function selectNumberingPlan(countryCode, callingCode) {\n // Supports just passing `callingCode` as the first argument.\n if (countryCode && CALLING_CODE_REG_EXP.test(countryCode)) {\n callingCode = countryCode;\n countryCode = null;\n }\n\n if (countryCode && countryCode !== '001') {\n if (!this.hasCountry(countryCode)) {\n throw new Error(\"Unknown country: \".concat(countryCode));\n }\n\n this.numberingPlan = new NumberingPlan(this.getCountryMetadata(countryCode), this);\n } else if (callingCode) {\n if (!this.hasCallingCode(callingCode)) {\n throw new Error(\"Unknown calling code: \".concat(callingCode));\n }\n\n this.numberingPlan = new NumberingPlan(this.getNumberingPlanMetadata(callingCode), this);\n } else {\n this.numberingPlan = undefined;\n }\n\n return this;\n }\n }, {\n key: \"getCountryCodesForCallingCode\",\n value: function getCountryCodesForCallingCode(callingCode) {\n var countryCodes = this.countryCallingCodes()[callingCode];\n\n if (countryCodes) {\n // Metadata before V4 included \"non-geographic entity\" calling codes\n // inside `country_calling_codes` (for example, `\"881\":[\"001\"]`).\n // Now the semantics of `country_calling_codes` has changed:\n // it's specifically for \"countries\" now.\n // Older versions of custom metadata will simply skip parsing\n // \"non-geographic entity\" phone numbers with new versions\n // of this library: it's not considered a bug,\n // because such numbers are extremely rare,\n // and developers extremely rarely use custom metadata.\n if (countryCodes.length === 1 && countryCodes[0].length === 3) {\n return;\n }\n\n return countryCodes;\n }\n }\n }, {\n key: \"getCountryCodeForCallingCode\",\n value: function getCountryCodeForCallingCode(callingCode) {\n var countryCodes = this.getCountryCodesForCallingCode(callingCode);\n\n if (countryCodes) {\n return countryCodes[0];\n }\n }\n }, {\n key: \"getNumberingPlanMetadata\",\n value: function getNumberingPlanMetadata(callingCode) {\n var countryCode = this.getCountryCodeForCallingCode(callingCode);\n\n if (countryCode) {\n return this.getCountryMetadata(countryCode);\n }\n\n if (this.nonGeographic()) {\n var metadata = this.nonGeographic()[callingCode];\n\n if (metadata) {\n return metadata;\n }\n } else {\n // A hacky workaround for old custom metadata (generated before V4).\n // In that metadata, there was no concept of \"non-geographic\" metadata\n // so metadata for `001` country code was stored along with other countries.\n // The test case can be found by searching for:\n // \"should work around `nonGeographic` metadata not existing\".\n var countryCodes = this.countryCallingCodes()[callingCode];\n\n if (countryCodes && countryCodes.length === 1 && countryCodes[0] === '001') {\n return this.metadata.countries['001'];\n }\n }\n } // Deprecated.\n\n }, {\n key: \"countryCallingCode\",\n value: function countryCallingCode() {\n return this.numberingPlan.callingCode();\n } // Deprecated.\n\n }, {\n key: \"IDDPrefix\",\n value: function IDDPrefix() {\n return this.numberingPlan.IDDPrefix();\n } // Deprecated.\n\n }, {\n key: \"defaultIDDPrefix\",\n value: function defaultIDDPrefix() {\n return this.numberingPlan.defaultIDDPrefix();\n } // Deprecated.\n\n }, {\n key: \"nationalNumberPattern\",\n value: function nationalNumberPattern() {\n return this.numberingPlan.nationalNumberPattern();\n } // Deprecated.\n\n }, {\n key: \"possibleLengths\",\n value: function possibleLengths() {\n return this.numberingPlan.possibleLengths();\n } // Deprecated.\n\n }, {\n key: \"formats\",\n value: function formats() {\n return this.numberingPlan.formats();\n } // Deprecated.\n\n }, {\n key: \"nationalPrefixForParsing\",\n value: function nationalPrefixForParsing() {\n return this.numberingPlan.nationalPrefixForParsing();\n } // Deprecated.\n\n }, {\n key: \"nationalPrefixTransformRule\",\n value: function nationalPrefixTransformRule() {\n return this.numberingPlan.nationalPrefixTransformRule();\n } // Deprecated.\n\n }, {\n key: \"leadingDigits\",\n value: function leadingDigits() {\n return this.numberingPlan.leadingDigits();\n } // Deprecated.\n\n }, {\n key: \"hasTypes\",\n value: function hasTypes() {\n return this.numberingPlan.hasTypes();\n } // Deprecated.\n\n }, {\n key: \"type\",\n value: function type(_type) {\n return this.numberingPlan.type(_type);\n } // Deprecated.\n\n }, {\n key: \"ext\",\n value: function ext() {\n return this.numberingPlan.ext();\n }\n }, {\n key: \"countryCallingCodes\",\n value: function countryCallingCodes() {\n if (this.v1) return this.metadata.country_phone_code_to_countries;\n return this.metadata.country_calling_codes;\n } // Deprecated.\n\n }, {\n key: \"chooseCountryByCountryCallingCode\",\n value: function chooseCountryByCountryCallingCode(callingCode) {\n return this.selectNumberingPlan(callingCode);\n }\n }, {\n key: \"hasSelectedNumberingPlan\",\n value: function hasSelectedNumberingPlan() {\n return this.numberingPlan !== undefined;\n }\n }]);\n\n return Metadata;\n}();\n\nexport { Metadata as default };\n\nvar NumberingPlan = /*#__PURE__*/function () {\n function NumberingPlan(metadata, globalMetadataObject) {\n _classCallCheck(this, NumberingPlan);\n\n this.globalMetadataObject = globalMetadataObject;\n this.metadata = metadata;\n setVersion.call(this, globalMetadataObject.metadata);\n }\n\n _createClass(NumberingPlan, [{\n key: \"callingCode\",\n value: function callingCode() {\n return this.metadata[0];\n } // Formatting information for regions which share\n // a country calling code is contained by only one region\n // for performance reasons. For example, for NANPA region\n // (\"North American Numbering Plan Administration\",\n // which includes USA, Canada, Cayman Islands, Bahamas, etc)\n // it will be contained in the metadata for `US`.\n\n }, {\n key: \"getDefaultCountryMetadataForRegion\",\n value: function getDefaultCountryMetadataForRegion() {\n return this.globalMetadataObject.getNumberingPlanMetadata(this.callingCode());\n } // Is always present.\n\n }, {\n key: \"IDDPrefix\",\n value: function IDDPrefix() {\n if (this.v1 || this.v2) return;\n return this.metadata[1];\n } // Is only present when a country supports multiple IDD prefixes.\n\n }, {\n key: \"defaultIDDPrefix\",\n value: function defaultIDDPrefix() {\n if (this.v1 || this.v2) return;\n return this.metadata[12];\n }\n }, {\n key: \"nationalNumberPattern\",\n value: function nationalNumberPattern() {\n if (this.v1 || this.v2) return this.metadata[1];\n return this.metadata[2];\n } // \"possible length\" data is always present in Google's metadata.\n\n }, {\n key: \"possibleLengths\",\n value: function possibleLengths() {\n if (this.v1) return;\n return this.metadata[this.v2 ? 2 : 3];\n }\n }, {\n key: \"_getFormats\",\n value: function _getFormats(metadata) {\n return metadata[this.v1 ? 2 : this.v2 ? 3 : 4];\n } // For countries of the same region (e.g. NANPA)\n // formats are all stored in the \"main\" country for that region.\n // E.g. \"RU\" and \"KZ\", \"US\" and \"CA\".\n\n }, {\n key: \"formats\",\n value: function formats() {\n var _this = this;\n\n var formats = this._getFormats(this.metadata) || this._getFormats(this.getDefaultCountryMetadataForRegion()) || [];\n return formats.map(function (_) {\n return new Format(_, _this);\n });\n }\n }, {\n key: \"nationalPrefix\",\n value: function nationalPrefix() {\n return this.metadata[this.v1 ? 3 : this.v2 ? 4 : 5];\n }\n }, {\n key: \"_getNationalPrefixFormattingRule\",\n value: function _getNationalPrefixFormattingRule(metadata) {\n return metadata[this.v1 ? 4 : this.v2 ? 5 : 6];\n } // For countries of the same region (e.g. NANPA)\n // national prefix formatting rule is stored in the \"main\" country for that region.\n // E.g. \"RU\" and \"KZ\", \"US\" and \"CA\".\n\n }, {\n key: \"nationalPrefixFormattingRule\",\n value: function nationalPrefixFormattingRule() {\n return this._getNationalPrefixFormattingRule(this.metadata) || this._getNationalPrefixFormattingRule(this.getDefaultCountryMetadataForRegion());\n }\n }, {\n key: \"_nationalPrefixForParsing\",\n value: function _nationalPrefixForParsing() {\n return this.metadata[this.v1 ? 5 : this.v2 ? 6 : 7];\n }\n }, {\n key: \"nationalPrefixForParsing\",\n value: function nationalPrefixForParsing() {\n // If `national_prefix_for_parsing` is not set explicitly,\n // then infer it from `national_prefix` (if any)\n return this._nationalPrefixForParsing() || this.nationalPrefix();\n }\n }, {\n key: \"nationalPrefixTransformRule\",\n value: function nationalPrefixTransformRule() {\n return this.metadata[this.v1 ? 6 : this.v2 ? 7 : 8];\n }\n }, {\n key: \"_getNationalPrefixIsOptionalWhenFormatting\",\n value: function _getNationalPrefixIsOptionalWhenFormatting() {\n return !!this.metadata[this.v1 ? 7 : this.v2 ? 8 : 9];\n } // For countries of the same region (e.g. NANPA)\n // \"national prefix is optional when formatting\" flag is\n // stored in the \"main\" country for that region.\n // E.g. \"RU\" and \"KZ\", \"US\" and \"CA\".\n\n }, {\n key: \"nationalPrefixIsOptionalWhenFormattingInNationalFormat\",\n value: function nationalPrefixIsOptionalWhenFormattingInNationalFormat() {\n return this._getNationalPrefixIsOptionalWhenFormatting(this.metadata) || this._getNationalPrefixIsOptionalWhenFormatting(this.getDefaultCountryMetadataForRegion());\n }\n }, {\n key: \"leadingDigits\",\n value: function leadingDigits() {\n return this.metadata[this.v1 ? 8 : this.v2 ? 9 : 10];\n }\n }, {\n key: \"types\",\n value: function types() {\n return this.metadata[this.v1 ? 9 : this.v2 ? 10 : 11];\n }\n }, {\n key: \"hasTypes\",\n value: function hasTypes() {\n // Versions 1.2.0 - 1.2.4: can be `[]`.\n\n /* istanbul ignore next */\n if (this.types() && this.types().length === 0) {\n return false;\n } // Versions <= 1.2.4: can be `undefined`.\n // Version >= 1.2.5: can be `0`.\n\n\n return !!this.types();\n }\n }, {\n key: \"type\",\n value: function type(_type2) {\n if (this.hasTypes() && getType(this.types(), _type2)) {\n return new Type(getType(this.types(), _type2), this);\n }\n }\n }, {\n key: \"ext\",\n value: function ext() {\n if (this.v1 || this.v2) return DEFAULT_EXT_PREFIX;\n return this.metadata[13] || DEFAULT_EXT_PREFIX;\n }\n }]);\n\n return NumberingPlan;\n}();\n\nvar Format = /*#__PURE__*/function () {\n function Format(format, metadata) {\n _classCallCheck(this, Format);\n\n this._format = format;\n this.metadata = metadata;\n }\n\n _createClass(Format, [{\n key: \"pattern\",\n value: function pattern() {\n return this._format[0];\n }\n }, {\n key: \"format\",\n value: function format() {\n return this._format[1];\n }\n }, {\n key: \"leadingDigitsPatterns\",\n value: function leadingDigitsPatterns() {\n return this._format[2] || [];\n }\n }, {\n key: \"nationalPrefixFormattingRule\",\n value: function nationalPrefixFormattingRule() {\n return this._format[3] || this.metadata.nationalPrefixFormattingRule();\n }\n }, {\n key: \"nationalPrefixIsOptionalWhenFormattingInNationalFormat\",\n value: function nationalPrefixIsOptionalWhenFormattingInNationalFormat() {\n return !!this._format[4] || this.metadata.nationalPrefixIsOptionalWhenFormattingInNationalFormat();\n }\n }, {\n key: \"nationalPrefixIsMandatoryWhenFormattingInNationalFormat\",\n value: function nationalPrefixIsMandatoryWhenFormattingInNationalFormat() {\n // National prefix is omitted if there's no national prefix formatting rule\n // set for this country, or when the national prefix formatting rule\n // contains no national prefix itself, or when this rule is set but\n // national prefix is optional for this phone number format\n // (and it is not enforced explicitly)\n return this.usesNationalPrefix() && !this.nationalPrefixIsOptionalWhenFormattingInNationalFormat();\n } // Checks whether national prefix formatting rule contains national prefix.\n\n }, {\n key: \"usesNationalPrefix\",\n value: function usesNationalPrefix() {\n return this.nationalPrefixFormattingRule() && // Check that national prefix formatting rule is not a \"dummy\" one.\n !FIRST_GROUP_ONLY_PREFIX_PATTERN.test(this.nationalPrefixFormattingRule()) // In compressed metadata, `this.nationalPrefixFormattingRule()` is `0`\n // when `national_prefix_formatting_rule` is not present.\n // So, `true` or `false` are returned explicitly here, so that\n // `0` number isn't returned.\n ? true : false;\n }\n }, {\n key: \"internationalFormat\",\n value: function internationalFormat() {\n return this._format[5] || this.format();\n }\n }]);\n\n return Format;\n}();\n/**\r\n * A pattern that is used to determine if the national prefix formatting rule\r\n * has the first group only, i.e., does not start with the national prefix.\r\n * Note that the pattern explicitly allows for unbalanced parentheses.\r\n */\n\n\nvar FIRST_GROUP_ONLY_PREFIX_PATTERN = /^\\(?\\$1\\)?$/;\n\nvar Type = /*#__PURE__*/function () {\n function Type(type, metadata) {\n _classCallCheck(this, Type);\n\n this.type = type;\n this.metadata = metadata;\n }\n\n _createClass(Type, [{\n key: \"pattern\",\n value: function pattern() {\n if (this.metadata.v1) return this.type;\n return this.type[0];\n }\n }, {\n key: \"possibleLengths\",\n value: function possibleLengths() {\n if (this.metadata.v1) return;\n return this.type[1] || this.metadata.possibleLengths();\n }\n }]);\n\n return Type;\n}();\n\nfunction getType(types, type) {\n switch (type) {\n case 'FIXED_LINE':\n return types[0];\n\n case 'MOBILE':\n return types[1];\n\n case 'TOLL_FREE':\n return types[2];\n\n case 'PREMIUM_RATE':\n return types[3];\n\n case 'PERSONAL_NUMBER':\n return types[4];\n\n case 'VOICEMAIL':\n return types[5];\n\n case 'UAN':\n return types[6];\n\n case 'PAGER':\n return types[7];\n\n case 'VOIP':\n return types[8];\n\n case 'SHARED_COST':\n return types[9];\n }\n}\n\nexport function validateMetadata(metadata) {\n if (!metadata) {\n throw new Error('[libphonenumber-js] `metadata` argument not passed. Check your arguments.');\n } // `country_phone_code_to_countries` was renamed to\n // `country_calling_codes` in `1.0.18`.\n\n\n if (!is_object(metadata) || !is_object(metadata.countries)) {\n throw new Error(\"[libphonenumber-js] `metadata` argument was passed but it's not a valid metadata. Must be an object having `.countries` child object property. Got \".concat(is_object(metadata) ? 'an object of shape: { ' + Object.keys(metadata).join(', ') + ' }' : 'a ' + type_of(metadata) + ': ' + metadata, \".\"));\n }\n} // Babel transforms `typeof` into some \"branches\"\n// so istanbul will show this as \"branch not covered\".\n\n/* istanbul ignore next */\n\nvar is_object = function is_object(_) {\n return _typeof(_) === 'object';\n}; // Babel transforms `typeof` into some \"branches\"\n// so istanbul will show this as \"branch not covered\".\n\n/* istanbul ignore next */\n\n\nvar type_of = function type_of(_) {\n return _typeof(_);\n};\n/**\r\n * Returns extension prefix for a country.\r\n * @param {string} country\r\n * @param {object} metadata\r\n * @return {string?}\r\n * @example\r\n * // Returns \" ext. \"\r\n * getExtPrefix(\"US\")\r\n */\n\n\nexport function getExtPrefix(country, metadata) {\n metadata = new Metadata(metadata);\n\n if (metadata.hasCountry(country)) {\n return metadata.country(country).ext();\n }\n\n return DEFAULT_EXT_PREFIX;\n}\n/**\r\n * Returns \"country calling code\" for a country.\r\n * Throws an error if the country doesn't exist or isn't supported by this library.\r\n * @param {string} country\r\n * @param {object} metadata\r\n * @return {string}\r\n * @example\r\n * // Returns \"44\"\r\n * getCountryCallingCode(\"GB\")\r\n */\n\nexport function getCountryCallingCode(country, metadata) {\n metadata = new Metadata(metadata);\n\n if (metadata.hasCountry(country)) {\n return metadata.country(country).countryCallingCode();\n }\n\n throw new Error(\"Unknown country: \".concat(country));\n}\nexport function isSupportedCountry(country, metadata) {\n // metadata = new Metadata(metadata)\n // return metadata.hasCountry(country)\n return metadata.countries[country] !== undefined;\n}\n\nfunction setVersion(metadata) {\n var version = metadata.version;\n\n if (typeof version === 'number') {\n this.v1 = version === 1;\n this.v2 = version === 2;\n this.v3 = version === 3;\n this.v4 = version === 4;\n } else {\n if (!version) {\n this.v1 = true;\n } else if (compare(version, V3) === -1) {\n this.v2 = true;\n } else if (compare(version, V4) === -1) {\n this.v3 = true;\n } else {\n this.v4 = true;\n }\n }\n} // const ISO_COUNTRY_CODE = /^[A-Z]{2}$/\n// function isCountryCode(countryCode) {\n// \treturn ISO_COUNTRY_CODE.test(countryCodeOrCountryCallingCode)\n// }\n//# sourceMappingURL=metadata.js.map","function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, \"prototype\", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } else if (call !== void 0) { throw new TypeError(\"Derived constructors may only return object or undefined\"); } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _wrapNativeSuper(Class) { var _cache = typeof Map === \"function\" ? new Map() : undefined; _wrapNativeSuper = function _wrapNativeSuper(Class) { if (Class === null || !_isNativeFunction(Class)) return Class; if (typeof Class !== \"function\") { throw new TypeError(\"Super expression must either be null or a function\"); } if (typeof _cache !== \"undefined\") { if (_cache.has(Class)) return _cache.get(Class); _cache.set(Class, Wrapper); } function Wrapper() { return _construct(Class, arguments, _getPrototypeOf(this).constructor); } Wrapper.prototype = Object.create(Class.prototype, { constructor: { value: Wrapper, enumerable: false, writable: true, configurable: true } }); return _setPrototypeOf(Wrapper, Class); }; return _wrapNativeSuper(Class); }\n\nfunction _construct(Parent, args, Class) { if (_isNativeReflectConstruct()) { _construct = Reflect.construct; } else { _construct = function _construct(Parent, args, Class) { var a = [null]; a.push.apply(a, args); var Constructor = Function.bind.apply(Parent, a); var instance = new Constructor(); if (Class) _setPrototypeOf(instance, Class.prototype); return instance; }; } return _construct.apply(null, arguments); }\n\nfunction _isNativeReflectConstruct() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }\n\nfunction _isNativeFunction(fn) { return Function.toString.call(fn).indexOf(\"[native code]\") !== -1; }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\n// https://stackoverflow.com/a/46971044/970769\n// \"Breaking changes in Typescript 2.1\"\n// \"Extending built-ins like Error, Array, and Map may no longer work.\"\n// \"As a recommendation, you can manually adjust the prototype immediately after any super(...) calls.\"\n// https://github.com/Microsoft/TypeScript-wiki/blob/main/Breaking-Changes.md#extending-built-ins-like-error-array-and-map-may-no-longer-work\nvar ParseError = /*#__PURE__*/function (_Error) {\n _inherits(ParseError, _Error);\n\n var _super = _createSuper(ParseError);\n\n function ParseError(code) {\n var _this;\n\n _classCallCheck(this, ParseError);\n\n _this = _super.call(this, code); // Set the prototype explicitly.\n // Any subclass of FooError will have to manually set the prototype as well.\n\n Object.setPrototypeOf(_assertThisInitialized(_this), ParseError.prototype);\n _this.name = _this.constructor.name;\n return _this;\n }\n\n return _createClass(ParseError);\n}( /*#__PURE__*/_wrapNativeSuper(Error));\n\nexport { ParseError as default };\n//# sourceMappingURL=ParseError.js.map","import createExtensionPattern from './createExtensionPattern.js'; // Regexp of all known extension prefixes used by different regions followed by\n// 1 or more valid digits, for use when parsing.\n\nvar EXTN_PATTERN = new RegExp('(?:' + createExtensionPattern() + ')$', 'i'); // Strips any extension (as in, the part of the number dialled after the call is\n// connected, usually indicated with extn, ext, x or similar) from the end of\n// the number, and returns it.\n\nexport default function extractExtension(number) {\n var start = number.search(EXTN_PATTERN);\n\n if (start < 0) {\n return {};\n } // If we find a potential extension, and the number preceding this is a viable\n // number, we assume it is an extension.\n\n\n var numberWithoutExtension = number.slice(0, start);\n var matches = number.match(EXTN_PATTERN);\n var i = 1;\n\n while (i < matches.length) {\n if (matches[i]) {\n return {\n number: numberWithoutExtension,\n ext: matches[i]\n };\n }\n\n i++;\n }\n}\n//# sourceMappingURL=extractExtension.js.map","function _createForOfIteratorHelperLoose(o, allowArrayLike) { var it = typeof Symbol !== \"undefined\" && o[Symbol.iterator] || o[\"@@iterator\"]; if (it) return (it = it.call(o)).next.bind(it); if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") { if (it) o = it; var i = 0; return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\n\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\n\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n\n// These mappings map a character (key) to a specific digit that should\n// replace it for normalization purposes. Non-European digits that\n// may be used in phone numbers are mapped to a European equivalent.\n//\n// E.g. in Iraq they don't write `+442323234` but rather `+٤٤٢٣٢٣٢٣٤`.\n//\nexport var DIGITS = {\n '0': '0',\n '1': '1',\n '2': '2',\n '3': '3',\n '4': '4',\n '5': '5',\n '6': '6',\n '7': '7',\n '8': '8',\n '9': '9',\n \"\\uFF10\": '0',\n // Fullwidth digit 0\n \"\\uFF11\": '1',\n // Fullwidth digit 1\n \"\\uFF12\": '2',\n // Fullwidth digit 2\n \"\\uFF13\": '3',\n // Fullwidth digit 3\n \"\\uFF14\": '4',\n // Fullwidth digit 4\n \"\\uFF15\": '5',\n // Fullwidth digit 5\n \"\\uFF16\": '6',\n // Fullwidth digit 6\n \"\\uFF17\": '7',\n // Fullwidth digit 7\n \"\\uFF18\": '8',\n // Fullwidth digit 8\n \"\\uFF19\": '9',\n // Fullwidth digit 9\n \"\\u0660\": '0',\n // Arabic-indic digit 0\n \"\\u0661\": '1',\n // Arabic-indic digit 1\n \"\\u0662\": '2',\n // Arabic-indic digit 2\n \"\\u0663\": '3',\n // Arabic-indic digit 3\n \"\\u0664\": '4',\n // Arabic-indic digit 4\n \"\\u0665\": '5',\n // Arabic-indic digit 5\n \"\\u0666\": '6',\n // Arabic-indic digit 6\n \"\\u0667\": '7',\n // Arabic-indic digit 7\n \"\\u0668\": '8',\n // Arabic-indic digit 8\n \"\\u0669\": '9',\n // Arabic-indic digit 9\n \"\\u06F0\": '0',\n // Eastern-Arabic digit 0\n \"\\u06F1\": '1',\n // Eastern-Arabic digit 1\n \"\\u06F2\": '2',\n // Eastern-Arabic digit 2\n \"\\u06F3\": '3',\n // Eastern-Arabic digit 3\n \"\\u06F4\": '4',\n // Eastern-Arabic digit 4\n \"\\u06F5\": '5',\n // Eastern-Arabic digit 5\n \"\\u06F6\": '6',\n // Eastern-Arabic digit 6\n \"\\u06F7\": '7',\n // Eastern-Arabic digit 7\n \"\\u06F8\": '8',\n // Eastern-Arabic digit 8\n \"\\u06F9\": '9' // Eastern-Arabic digit 9\n\n};\nexport function parseDigit(character) {\n return DIGITS[character];\n}\n/**\r\n * Parses phone number digits from a string.\r\n * Drops all punctuation leaving only digits.\r\n * Also converts wide-ascii and arabic-indic numerals to conventional numerals.\r\n * E.g. in Iraq they don't write `+442323234` but rather `+٤٤٢٣٢٣٢٣٤`.\r\n * @param {string} string\r\n * @return {string}\r\n * @example\r\n * ```js\r\n * parseDigits('8 (800) 555')\r\n * // Outputs '8800555'.\r\n * ```\r\n */\n\nexport default function parseDigits(string) {\n var result = ''; // Using `.split('')` here instead of normal `for ... of`\n // because the importing application doesn't neccessarily include an ES6 polyfill.\n // The `.split('')` approach discards \"exotic\" UTF-8 characters\n // (the ones consisting of four bytes) but digits\n // (including non-European ones) don't fall into that range\n // so such \"exotic\" characters would be discarded anyway.\n\n for (var _iterator = _createForOfIteratorHelperLoose(string.split('')), _step; !(_step = _iterator()).done;) {\n var character = _step.value;\n var digit = parseDigit(character);\n\n if (digit) {\n result += digit;\n }\n }\n\n return result;\n}\n//# sourceMappingURL=parseDigits.js.map","function _createForOfIteratorHelperLoose(o, allowArrayLike) { var it = typeof Symbol !== \"undefined\" && o[Symbol.iterator] || o[\"@@iterator\"]; if (it) return (it = it.call(o)).next.bind(it); if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") { if (it) o = it; var i = 0; return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\n\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\n\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n\nimport { parseDigit } from './helpers/parseDigits.js';\n/**\r\n * Parses phone number characters from a string.\r\n * Drops all punctuation leaving only digits and the leading `+` sign (if any).\r\n * Also converts wide-ascii and arabic-indic numerals to conventional numerals.\r\n * E.g. in Iraq they don't write `+442323234` but rather `+٤٤٢٣٢٣٢٣٤`.\r\n * @param {string} string\r\n * @return {string}\r\n * @example\r\n * ```js\r\n * // Outputs '8800555'.\r\n * parseIncompletePhoneNumber('8 (800) 555')\r\n * // Outputs '+7800555'.\r\n * parseIncompletePhoneNumber('+7 800 555')\r\n * ```\r\n */\n\nexport default function parseIncompletePhoneNumber(string) {\n var result = ''; // Using `.split('')` here instead of normal `for ... of`\n // because the importing application doesn't neccessarily include an ES6 polyfill.\n // The `.split('')` approach discards \"exotic\" UTF-8 characters\n // (the ones consisting of four bytes) but digits\n // (including non-European ones) don't fall into that range\n // so such \"exotic\" characters would be discarded anyway.\n\n for (var _iterator = _createForOfIteratorHelperLoose(string.split('')), _step; !(_step = _iterator()).done;) {\n var character = _step.value;\n result += parsePhoneNumberCharacter(character, result) || '';\n }\n\n return result;\n}\n/**\r\n * Parses next character while parsing phone number digits (including a `+`)\r\n * from text: discards everything except `+` and digits, and `+` is only allowed\r\n * at the start of a phone number.\r\n * For example, is used in `react-phone-number-input` where it uses\r\n * [`input-format`](https://gitlab.com/catamphetamine/input-format).\r\n * @param {string} character - Yet another character from raw input string.\r\n * @param {string?} prevParsedCharacters - Previous parsed characters.\r\n * @param {object} meta - Optional custom use-case-specific metadata.\r\n * @return {string?} The parsed character.\r\n */\n\nexport function parsePhoneNumberCharacter(character, prevParsedCharacters) {\n // Only allow a leading `+`.\n if (character === '+') {\n // If this `+` is not the first parsed character\n // then discard it.\n if (prevParsedCharacters) {\n return;\n }\n\n return '+';\n } // Allow digits.\n\n\n return parseDigit(character);\n}\n//# sourceMappingURL=parseIncompletePhoneNumber.js.map","import Metadata from '../metadata.js';\nimport { VALID_DIGITS } from '../constants.js';\nvar CAPTURING_DIGIT_PATTERN = new RegExp('([' + VALID_DIGITS + '])');\nexport default function stripIddPrefix(number, country, callingCode, metadata) {\n if (!country) {\n return;\n } // Check if the number is IDD-prefixed.\n\n\n var countryMetadata = new Metadata(metadata);\n countryMetadata.selectNumberingPlan(country, callingCode);\n var IDDPrefixPattern = new RegExp(countryMetadata.IDDPrefix());\n\n if (number.search(IDDPrefixPattern) !== 0) {\n return;\n } // Strip IDD prefix.\n\n\n number = number.slice(number.match(IDDPrefixPattern)[0].length); // If there're any digits after an IDD prefix,\n // then those digits are a country calling code.\n // Since no country code starts with a `0`,\n // the code below validates that the next digit (if present) is not `0`.\n\n var matchedGroups = number.match(CAPTURING_DIGIT_PATTERN);\n\n if (matchedGroups && matchedGroups[1] != null && matchedGroups[1].length > 0) {\n if (matchedGroups[1] === '0') {\n return;\n }\n }\n\n return number;\n}\n//# sourceMappingURL=stripIddPrefix.js.map","import extractNationalNumberFromPossiblyIncompleteNumber from './extractNationalNumberFromPossiblyIncompleteNumber.js';\nimport matchesEntirely from './matchesEntirely.js';\nimport checkNumberLength from './checkNumberLength.js';\n/**\r\n * Strips national prefix and carrier code from a complete phone number.\r\n * The difference from the non-\"FromCompleteNumber\" function is that\r\n * it won't extract national prefix if the resultant number is too short\r\n * to be a complete number for the selected phone numbering plan.\r\n * @param {string} number — Complete phone number digits.\r\n * @param {Metadata} metadata — Metadata with a phone numbering plan selected.\r\n * @return {object} `{ nationalNumber: string, carrierCode: string? }`.\r\n */\n\nexport default function extractNationalNumber(number, metadata) {\n // Parsing national prefixes and carrier codes\n // is only required for local phone numbers\n // but some people don't understand that\n // and sometimes write international phone numbers\n // with national prefixes (or maybe even carrier codes).\n // http://ucken.blogspot.ru/2016/03/trunk-prefixes-in-skype4b.html\n // Google's original library forgives such mistakes\n // and so does this library, because it has been requested:\n // https://github.com/catamphetamine/libphonenumber-js/issues/127\n var _extractNationalNumbe = extractNationalNumberFromPossiblyIncompleteNumber(number, metadata),\n carrierCode = _extractNationalNumbe.carrierCode,\n nationalNumber = _extractNationalNumbe.nationalNumber;\n\n if (nationalNumber !== number) {\n if (!shouldHaveExtractedNationalPrefix(number, nationalNumber, metadata)) {\n // Don't strip the national prefix.\n return {\n nationalNumber: number\n };\n } // Check the national (significant) number length after extracting national prefix and carrier code.\n // Legacy generated metadata (before `1.0.18`) didn't support the \"possible lengths\" feature.\n\n\n if (metadata.possibleLengths()) {\n // The number remaining after stripping the national prefix and carrier code\n // should be long enough to have a possible length for the country.\n // Otherwise, don't strip the national prefix and carrier code,\n // since the original number could be a valid number.\n // This check has been copy-pasted \"as is\" from Google's original library:\n // https://github.com/google/libphonenumber/blob/876268eb1ad6cdc1b7b5bef17fc5e43052702d57/java/libphonenumber/src/com/google/i18n/phonenumbers/PhoneNumberUtil.java#L3236-L3250\n // It doesn't check for the \"possibility\" of the original `number`.\n // I guess it's fine not checking that one. It works as is anyway.\n if (!isPossibleIncompleteNationalNumber(nationalNumber, metadata)) {\n // Don't strip the national prefix.\n return {\n nationalNumber: number\n };\n }\n }\n }\n\n return {\n nationalNumber: nationalNumber,\n carrierCode: carrierCode\n };\n} // In some countries, the same digit could be a national prefix\n// or a leading digit of a valid phone number.\n// For example, in Russia, national prefix is `8`,\n// and also `800 555 35 35` is a valid number\n// in which `8` is not a national prefix, but the first digit\n// of a national (significant) number.\n// Same's with Belarus:\n// `82004910060` is a valid national (significant) number,\n// but `2004910060` is not.\n// To support such cases (to prevent the code from always stripping\n// national prefix), a condition is imposed: a national prefix\n// is not extracted when the original number is \"viable\" and the\n// resultant number is not, a \"viable\" national number being the one\n// that matches `national_number_pattern`.\n\nfunction shouldHaveExtractedNationalPrefix(nationalNumberBefore, nationalNumberAfter, metadata) {\n // The equivalent in Google's code is:\n // https://github.com/google/libphonenumber/blob/e326fa1fc4283bb05eb35cb3c15c18f98a31af33/java/libphonenumber/src/com/google/i18n/phonenumbers/PhoneNumberUtil.java#L2969-L3004\n if (matchesEntirely(nationalNumberBefore, metadata.nationalNumberPattern()) && !matchesEntirely(nationalNumberAfter, metadata.nationalNumberPattern())) {\n return false;\n } // This \"is possible\" national number (length) check has been commented out\n // because it's superceded by the (effectively) same check done in the\n // `extractNationalNumber()` function after it calls `shouldHaveExtractedNationalPrefix()`.\n // In other words, why run the same check twice if it could only be run once.\n // // Check the national (significant) number length after extracting national prefix and carrier code.\n // // Fixes a minor \"weird behavior\" bug: https://gitlab.com/catamphetamine/libphonenumber-js/-/issues/57\n // // (Legacy generated metadata (before `1.0.18`) didn't support the \"possible lengths\" feature).\n // if (metadata.possibleLengths()) {\n // \tif (isPossibleIncompleteNationalNumber(nationalNumberBefore, metadata) &&\n // \t\t!isPossibleIncompleteNationalNumber(nationalNumberAfter, metadata)) {\n // \t\treturn false\n // \t}\n // }\n\n\n return true;\n}\n\nfunction isPossibleIncompleteNationalNumber(nationalNumber, metadata) {\n switch (checkNumberLength(nationalNumber, metadata)) {\n case 'TOO_SHORT':\n case 'INVALID_LENGTH':\n // This library ignores \"local-only\" phone numbers (for simplicity).\n // See the readme for more info on what are \"local-only\" phone numbers.\n // case 'IS_POSSIBLE_LOCAL_ONLY':\n return false;\n\n default:\n return true;\n }\n}\n//# sourceMappingURL=extractNationalNumber.js.map","/**\r\n * Strips any national prefix (such as 0, 1) present in a\r\n * (possibly incomplete) number provided.\r\n * \"Carrier codes\" are only used in Colombia and Brazil,\r\n * and only when dialing within those countries from a mobile phone to a fixed line number.\r\n * Sometimes it won't actually strip national prefix\r\n * and will instead prepend some digits to the `number`:\r\n * for example, when number `2345678` is passed with `VI` country selected,\r\n * it will return `{ number: \"3402345678\" }`, because `340` area code is prepended.\r\n * @param {string} number — National number digits.\r\n * @param {object} metadata — Metadata with country selected.\r\n * @return {object} `{ nationalNumber: string, nationalPrefix: string? carrierCode: string? }`. Even if a national prefix was extracted, it's not necessarily present in the returned object, so don't rely on its presence in the returned object in order to find out whether a national prefix has been extracted or not.\r\n */\nexport default function extractNationalNumberFromPossiblyIncompleteNumber(number, metadata) {\n if (number && metadata.numberingPlan.nationalPrefixForParsing()) {\n // See METADATA.md for the description of\n // `national_prefix_for_parsing` and `national_prefix_transform_rule`.\n // Attempt to parse the first digits as a national prefix.\n var prefixPattern = new RegExp('^(?:' + metadata.numberingPlan.nationalPrefixForParsing() + ')');\n var prefixMatch = prefixPattern.exec(number);\n\n if (prefixMatch) {\n var nationalNumber;\n var carrierCode; // https://gitlab.com/catamphetamine/libphonenumber-js/-/blob/master/METADATA.md#national_prefix_for_parsing--national_prefix_transform_rule\n // If a `national_prefix_for_parsing` has any \"capturing groups\"\n // then it means that the national (significant) number is equal to\n // those \"capturing groups\" transformed via `national_prefix_transform_rule`,\n // and nothing could be said about the actual national prefix:\n // what is it and was it even there.\n // If a `national_prefix_for_parsing` doesn't have any \"capturing groups\",\n // then everything it matches is a national prefix.\n // To determine whether `national_prefix_for_parsing` matched any\n // \"capturing groups\", the value of the result of calling `.exec()`\n // is looked at, and if it has non-undefined values where there're\n // \"capturing groups\" in the regular expression, then it means\n // that \"capturing groups\" have been matched.\n // It's not possible to tell whether there'll be any \"capturing gropus\"\n // before the matching process, because a `national_prefix_for_parsing`\n // could exhibit both behaviors.\n\n var capturedGroupsCount = prefixMatch.length - 1;\n var hasCapturedGroups = capturedGroupsCount > 0 && prefixMatch[capturedGroupsCount];\n\n if (metadata.nationalPrefixTransformRule() && hasCapturedGroups) {\n nationalNumber = number.replace(prefixPattern, metadata.nationalPrefixTransformRule()); // If there's more than one captured group,\n // then carrier code is the second one.\n\n if (capturedGroupsCount > 1) {\n carrierCode = prefixMatch[1];\n }\n } // If there're no \"capturing groups\",\n // or if there're \"capturing groups\" but no\n // `national_prefix_transform_rule`,\n // then just strip the national prefix from the number,\n // and possibly a carrier code.\n // Seems like there could be more.\n else {\n // `prefixBeforeNationalNumber` is the whole substring matched by\n // the `national_prefix_for_parsing` regular expression.\n // There seem to be no guarantees that it's just a national prefix.\n // For example, if there's a carrier code, it's gonna be a\n // part of `prefixBeforeNationalNumber` too.\n var prefixBeforeNationalNumber = prefixMatch[0];\n nationalNumber = number.slice(prefixBeforeNationalNumber.length); // If there's at least one captured group,\n // then carrier code is the first one.\n\n if (hasCapturedGroups) {\n carrierCode = prefixMatch[1];\n }\n } // Tries to guess whether a national prefix was present in the input.\n // This is not something copy-pasted from Google's library:\n // they don't seem to have an equivalent for that.\n // So this isn't an \"officially approved\" way of doing something like that.\n // But since there seems no other existing method, this library uses it.\n\n\n var nationalPrefix;\n\n if (hasCapturedGroups) {\n var possiblePositionOfTheFirstCapturedGroup = number.indexOf(prefixMatch[1]);\n var possibleNationalPrefix = number.slice(0, possiblePositionOfTheFirstCapturedGroup); // Example: an Argentinian (AR) phone number `0111523456789`.\n // `prefixMatch[0]` is `01115`, and `$1` is `11`,\n // and the rest of the phone number is `23456789`.\n // The national number is transformed via `9$1` to `91123456789`.\n // National prefix `0` is detected being present at the start.\n // if (possibleNationalPrefix.indexOf(metadata.numberingPlan.nationalPrefix()) === 0) {\n\n if (possibleNationalPrefix === metadata.numberingPlan.nationalPrefix()) {\n nationalPrefix = metadata.numberingPlan.nationalPrefix();\n }\n } else {\n nationalPrefix = prefixMatch[0];\n }\n\n return {\n nationalNumber: nationalNumber,\n nationalPrefix: nationalPrefix,\n carrierCode: carrierCode\n };\n }\n }\n\n return {\n nationalNumber: number\n };\n}\n//# sourceMappingURL=extractNationalNumberFromPossiblyIncompleteNumber.js.map","import stripIddPrefix from './stripIddPrefix.js';\nimport extractCountryCallingCodeFromInternationalNumberWithoutPlusSign from './extractCountryCallingCodeFromInternationalNumberWithoutPlusSign.js';\nimport Metadata from '../metadata.js';\nimport { MAX_LENGTH_COUNTRY_CODE } from '../constants.js';\n/**\r\n * Converts a phone number digits (possibly with a `+`)\r\n * into a calling code and the rest phone number digits.\r\n * The \"rest phone number digits\" could include\r\n * a national prefix, carrier code, and national\r\n * (significant) number.\r\n * @param {string} number — Phone number digits (possibly with a `+`).\r\n * @param {string} [country] — Default country.\r\n * @param {string} [callingCode] — Default calling code (some phone numbering plans are non-geographic).\r\n * @param {object} metadata\r\n * @return {object} `{ countryCallingCode: string?, number: string }`\r\n * @example\r\n * // Returns `{ countryCallingCode: \"1\", number: \"2133734253\" }`.\r\n * extractCountryCallingCode('2133734253', 'US', null, metadata)\r\n * extractCountryCallingCode('2133734253', null, '1', metadata)\r\n * extractCountryCallingCode('+12133734253', null, null, metadata)\r\n * extractCountryCallingCode('+12133734253', 'RU', null, metadata)\r\n */\n\nexport default function extractCountryCallingCode(number, country, callingCode, metadata) {\n if (!number) {\n return {};\n } // If this is not an international phone number,\n // then either extract an \"IDD\" prefix, or extract a\n // country calling code from a number by autocorrecting it\n // by prepending a leading `+` in cases when it starts\n // with the country calling code.\n // https://wikitravel.org/en/International_dialling_prefix\n // https://github.com/catamphetamine/libphonenumber-js/issues/376\n\n\n if (number[0] !== '+') {\n // Convert an \"out-of-country\" dialing phone number\n // to a proper international phone number.\n var numberWithoutIDD = stripIddPrefix(number, country, callingCode, metadata); // If an IDD prefix was stripped then\n // convert the number to international one\n // for subsequent parsing.\n\n if (numberWithoutIDD && numberWithoutIDD !== number) {\n number = '+' + numberWithoutIDD;\n } else {\n // Check to see if the number starts with the country calling code\n // for the default country. If so, we remove the country calling code,\n // and do some checks on the validity of the number before and after.\n // https://github.com/catamphetamine/libphonenumber-js/issues/376\n if (country || callingCode) {\n var _extractCountryCallin = extractCountryCallingCodeFromInternationalNumberWithoutPlusSign(number, country, callingCode, metadata),\n countryCallingCode = _extractCountryCallin.countryCallingCode,\n shorterNumber = _extractCountryCallin.number;\n\n if (countryCallingCode) {\n return {\n countryCallingCode: countryCallingCode,\n number: shorterNumber\n };\n }\n }\n\n return {\n number: number\n };\n }\n } // Fast abortion: country codes do not begin with a '0'\n\n\n if (number[1] === '0') {\n return {};\n }\n\n metadata = new Metadata(metadata); // The thing with country phone codes\n // is that they are orthogonal to each other\n // i.e. there's no such country phone code A\n // for which country phone code B exists\n // where B starts with A.\n // Therefore, while scanning digits,\n // if a valid country code is found,\n // that means that it is the country code.\n //\n\n var i = 2;\n\n while (i - 1 <= MAX_LENGTH_COUNTRY_CODE && i <= number.length) {\n var _countryCallingCode = number.slice(1, i);\n\n if (metadata.hasCallingCode(_countryCallingCode)) {\n metadata.selectNumberingPlan(_countryCallingCode);\n return {\n countryCallingCode: _countryCallingCode,\n number: number.slice(i)\n };\n }\n\n i++;\n }\n\n return {};\n}\n//# sourceMappingURL=extractCountryCallingCode.js.map","import Metadata from '../metadata.js';\nimport matchesEntirely from './matchesEntirely.js';\nimport extractNationalNumber from './extractNationalNumber.js';\nimport checkNumberLength from './checkNumberLength.js';\nimport getCountryCallingCode from '../getCountryCallingCode.js';\n/**\r\n * Sometimes some people incorrectly input international phone numbers\r\n * without the leading `+`. This function corrects such input.\r\n * @param {string} number — Phone number digits.\r\n * @param {string?} country\r\n * @param {string?} callingCode\r\n * @param {object} metadata\r\n * @return {object} `{ countryCallingCode: string?, number: string }`.\r\n */\n\nexport default function extractCountryCallingCodeFromInternationalNumberWithoutPlusSign(number, country, callingCode, metadata) {\n var countryCallingCode = country ? getCountryCallingCode(country, metadata) : callingCode;\n\n if (number.indexOf(countryCallingCode) === 0) {\n metadata = new Metadata(metadata);\n metadata.selectNumberingPlan(country, callingCode);\n var possibleShorterNumber = number.slice(countryCallingCode.length);\n\n var _extractNationalNumbe = extractNationalNumber(possibleShorterNumber, metadata),\n possibleShorterNationalNumber = _extractNationalNumbe.nationalNumber;\n\n var _extractNationalNumbe2 = extractNationalNumber(number, metadata),\n nationalNumber = _extractNationalNumbe2.nationalNumber; // If the number was not valid before but is valid now,\n // or if it was too long before, we consider the number\n // with the country calling code stripped to be a better result\n // and keep that instead.\n // For example, in Germany (+49), `49` is a valid area code,\n // so if a number starts with `49`, it could be both a valid\n // national German number or an international number without\n // a leading `+`.\n\n\n if (!matchesEntirely(nationalNumber, metadata.nationalNumberPattern()) && matchesEntirely(possibleShorterNationalNumber, metadata.nationalNumberPattern()) || checkNumberLength(nationalNumber, metadata) === 'TOO_LONG') {\n return {\n countryCallingCode: countryCallingCode,\n number: possibleShorterNumber\n };\n }\n }\n\n return {\n number: number\n };\n}\n//# sourceMappingURL=extractCountryCallingCodeFromInternationalNumberWithoutPlusSign.js.map","function _createForOfIteratorHelperLoose(o, allowArrayLike) { var it = typeof Symbol !== \"undefined\" && o[Symbol.iterator] || o[\"@@iterator\"]; if (it) return (it = it.call(o)).next.bind(it); if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") { if (it) o = it; var i = 0; return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\n\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\n\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n\nimport Metadata from '../metadata.js';\nimport getNumberType from './getNumberType.js';\nexport default function getCountryByNationalNumber(possibleCountries, nationalPhoneNumber, metadata) {\n // Re-create `metadata` because it will be selecting a `country`.\n metadata = new Metadata(metadata);\n\n for (var _iterator = _createForOfIteratorHelperLoose(possibleCountries), _step; !(_step = _iterator()).done;) {\n var country = _step.value;\n metadata.country(country); // \"Leading digits\" patterns are only defined for about 20% of all countries.\n // By definition, matching \"leading digits\" is a sufficient but not a necessary\n // condition for a phone number to belong to a country.\n // The point of \"leading digits\" check is that it's the fastest one to get a match.\n // https://gitlab.com/catamphetamine/libphonenumber-js/blob/master/METADATA.md#leading_digits\n\n if (metadata.leadingDigits()) {\n if (nationalPhoneNumber && nationalPhoneNumber.search(metadata.leadingDigits()) === 0) {\n return country;\n }\n } // Else perform full validation with all of those\n // fixed-line/mobile/etc regular expressions.\n else if (getNumberType({\n phone: nationalPhoneNumber,\n country: country\n }, undefined, metadata.metadata)) {\n return country;\n }\n }\n}\n//# sourceMappingURL=getCountryByNationalNumber.js.map","import getCountryByNationalNumber from './getCountryByNationalNumber.js';\nvar USE_NON_GEOGRAPHIC_COUNTRY_CODE = false;\nexport default function getCountryByCallingCode(callingCode, nationalPhoneNumber, metadata) {\n /* istanbul ignore if */\n if (USE_NON_GEOGRAPHIC_COUNTRY_CODE) {\n if (metadata.isNonGeographicCallingCode(callingCode)) {\n return '001';\n }\n }\n\n var possibleCountries = metadata.getCountryCodesForCallingCode(callingCode);\n\n if (!possibleCountries) {\n return;\n } // If there's just one country corresponding to the country code,\n // then just return it, without further phone number digits validation.\n\n\n if (possibleCountries.length === 1) {\n return possibleCountries[0];\n }\n\n return getCountryByNationalNumber(possibleCountries, nationalPhoneNumber, metadata.metadata);\n}\n//# sourceMappingURL=getCountryByCallingCode.js.map","// This is a port of Google Android `libphonenumber`'s\n// `phonenumberutil.js` of December 31th, 2018.\n//\n// https://github.com/googlei18n/libphonenumber/commits/master/javascript/i18n/phonenumbers/phonenumberutil.js\nimport { VALID_DIGITS, PLUS_CHARS, MIN_LENGTH_FOR_NSN, MAX_LENGTH_FOR_NSN } from './constants.js';\nimport ParseError from './ParseError.js';\nimport Metadata from './metadata.js';\nimport isViablePhoneNumber, { isViablePhoneNumberStart } from './helpers/isViablePhoneNumber.js';\nimport extractExtension from './helpers/extension/extractExtension.js';\nimport parseIncompletePhoneNumber from './parseIncompletePhoneNumber.js';\nimport getCountryCallingCode from './getCountryCallingCode.js';\nimport { isPossibleNumber } from './isPossibleNumber_.js';\nimport { parseRFC3966 } from './helpers/RFC3966.js';\nimport PhoneNumber from './PhoneNumber.js';\nimport matchesEntirely from './helpers/matchesEntirely.js';\nimport extractCountryCallingCode from './helpers/extractCountryCallingCode.js';\nimport extractCountryCallingCodeFromInternationalNumberWithoutPlusSign from './helpers/extractCountryCallingCodeFromInternationalNumberWithoutPlusSign.js';\nimport extractNationalNumber from './helpers/extractNationalNumber.js';\nimport stripIddPrefix from './helpers/stripIddPrefix.js';\nimport getCountryByCallingCode from './helpers/getCountryByCallingCode.js'; // We don't allow input strings for parsing to be longer than 250 chars.\n// This prevents malicious input from consuming CPU.\n\nvar MAX_INPUT_STRING_LENGTH = 250; // This consists of the plus symbol, digits, and arabic-indic digits.\n\nvar PHONE_NUMBER_START_PATTERN = new RegExp('[' + PLUS_CHARS + VALID_DIGITS + ']'); // Regular expression of trailing characters that we want to remove.\n// A trailing `#` is sometimes used when writing phone numbers with extensions in US.\n// Example: \"+1 (645) 123 1234-910#\" number has extension \"910\".\n\nvar AFTER_PHONE_NUMBER_END_PATTERN = new RegExp('[^' + VALID_DIGITS + '#' + ']+$');\nvar USE_NON_GEOGRAPHIC_COUNTRY_CODE = false; // Examples:\n//\n// ```js\n// parse('8 (800) 555-35-35', 'RU')\n// parse('8 (800) 555-35-35', 'RU', metadata)\n// parse('8 (800) 555-35-35', { country: { default: 'RU' } })\n// parse('8 (800) 555-35-35', { country: { default: 'RU' } }, metadata)\n// parse('+7 800 555 35 35')\n// parse('+7 800 555 35 35', metadata)\n// ```\n//\n\nexport default function parse(text, options, metadata) {\n // If assigning the `{}` default value is moved to the arguments above,\n // code coverage would decrease for some weird reason.\n options = options || {};\n metadata = new Metadata(metadata); // Validate `defaultCountry`.\n\n if (options.defaultCountry && !metadata.hasCountry(options.defaultCountry)) {\n if (options.v2) {\n throw new ParseError('INVALID_COUNTRY');\n }\n\n throw new Error(\"Unknown country: \".concat(options.defaultCountry));\n } // Parse the phone number.\n\n\n var _parseInput = parseInput(text, options.v2, options.extract),\n formattedPhoneNumber = _parseInput.number,\n ext = _parseInput.ext,\n error = _parseInput.error; // If the phone number is not viable then return nothing.\n\n\n if (!formattedPhoneNumber) {\n if (options.v2) {\n if (error === 'TOO_SHORT') {\n throw new ParseError('TOO_SHORT');\n }\n\n throw new ParseError('NOT_A_NUMBER');\n }\n\n return {};\n }\n\n var _parsePhoneNumber = parsePhoneNumber(formattedPhoneNumber, options.defaultCountry, options.defaultCallingCode, metadata),\n country = _parsePhoneNumber.country,\n nationalNumber = _parsePhoneNumber.nationalNumber,\n countryCallingCode = _parsePhoneNumber.countryCallingCode,\n carrierCode = _parsePhoneNumber.carrierCode;\n\n if (!metadata.hasSelectedNumberingPlan()) {\n if (options.v2) {\n throw new ParseError('INVALID_COUNTRY');\n }\n\n return {};\n } // Validate national (significant) number length.\n\n\n if (!nationalNumber || nationalNumber.length < MIN_LENGTH_FOR_NSN) {\n // Won't throw here because the regexp already demands length > 1.\n\n /* istanbul ignore if */\n if (options.v2) {\n throw new ParseError('TOO_SHORT');\n } // Google's demo just throws an error in this case.\n\n\n return {};\n } // Validate national (significant) number length.\n //\n // A sidenote:\n //\n // They say that sometimes national (significant) numbers\n // can be longer than `MAX_LENGTH_FOR_NSN` (e.g. in Germany).\n // https://github.com/googlei18n/libphonenumber/blob/7e1748645552da39c4e1ba731e47969d97bdb539/resources/phonenumber.proto#L36\n // Such numbers will just be discarded.\n //\n\n\n if (nationalNumber.length > MAX_LENGTH_FOR_NSN) {\n if (options.v2) {\n throw new ParseError('TOO_LONG');\n } // Google's demo just throws an error in this case.\n\n\n return {};\n }\n\n if (options.v2) {\n var phoneNumber = new PhoneNumber(countryCallingCode, nationalNumber, metadata.metadata);\n\n if (country) {\n phoneNumber.country = country;\n }\n\n if (carrierCode) {\n phoneNumber.carrierCode = carrierCode;\n }\n\n if (ext) {\n phoneNumber.ext = ext;\n }\n\n return phoneNumber;\n } // Check if national phone number pattern matches the number.\n // National number pattern is different for each country,\n // even for those ones which are part of the \"NANPA\" group.\n\n\n var valid = (options.extended ? metadata.hasSelectedNumberingPlan() : country) ? matchesEntirely(nationalNumber, metadata.nationalNumberPattern()) : false;\n\n if (!options.extended) {\n return valid ? result(country, nationalNumber, ext) : {};\n } // isInternational: countryCallingCode !== undefined\n\n\n return {\n country: country,\n countryCallingCode: countryCallingCode,\n carrierCode: carrierCode,\n valid: valid,\n possible: valid ? true : options.extended === true && metadata.possibleLengths() && isPossibleNumber(nationalNumber, metadata) ? true : false,\n phone: nationalNumber,\n ext: ext\n };\n}\n/**\r\n * Extracts a formatted phone number from text.\r\n * Doesn't guarantee that the extracted phone number\r\n * is a valid phone number (for example, doesn't validate its length).\r\n * @param {string} text\r\n * @param {boolean} [extract] — If `false`, then will parse the entire `text` as a phone number.\r\n * @param {boolean} [throwOnError] — By default, it won't throw if the text is too long.\r\n * @return {string}\r\n * @example\r\n * // Returns \"(213) 373-4253\".\r\n * extractFormattedPhoneNumber(\"Call (213) 373-4253 for assistance.\")\r\n */\n\nfunction extractFormattedPhoneNumber(text, extract, throwOnError) {\n if (!text) {\n return;\n }\n\n if (text.length > MAX_INPUT_STRING_LENGTH) {\n if (throwOnError) {\n throw new ParseError('TOO_LONG');\n }\n\n return;\n }\n\n if (extract === false) {\n return text;\n } // Attempt to extract a possible number from the string passed in\n\n\n var startsAt = text.search(PHONE_NUMBER_START_PATTERN);\n\n if (startsAt < 0) {\n return;\n }\n\n return text // Trim everything to the left of the phone number\n .slice(startsAt) // Remove trailing non-numerical characters\n .replace(AFTER_PHONE_NUMBER_END_PATTERN, '');\n}\n/**\r\n * @param {string} text - Input.\r\n * @param {boolean} v2 - Legacy API functions don't pass `v2: true` flag.\r\n * @param {boolean} [extract] - Whether to extract a phone number from `text`, or attempt to parse the entire text as a phone number.\r\n * @return {object} `{ ?number, ?ext }`.\r\n */\n\n\nfunction parseInput(text, v2, extract) {\n // Parse RFC 3966 phone number URI.\n if (text && text.indexOf('tel:') === 0) {\n return parseRFC3966(text);\n }\n\n var number = extractFormattedPhoneNumber(text, extract, v2); // If the phone number is not viable, then abort.\n\n if (!number) {\n return {};\n }\n\n if (!isViablePhoneNumber(number)) {\n if (isViablePhoneNumberStart(number)) {\n return {\n error: 'TOO_SHORT'\n };\n }\n\n return {};\n } // Attempt to parse extension first, since it doesn't require region-specific\n // data and we want to have the non-normalised number here.\n\n\n var withExtensionStripped = extractExtension(number);\n\n if (withExtensionStripped.ext) {\n return withExtensionStripped;\n }\n\n return {\n number: number\n };\n}\n/**\r\n * Creates `parse()` result object.\r\n */\n\n\nfunction result(country, nationalNumber, ext) {\n var result = {\n country: country,\n phone: nationalNumber\n };\n\n if (ext) {\n result.ext = ext;\n }\n\n return result;\n}\n/**\r\n * Parses a viable phone number.\r\n * @param {string} formattedPhoneNumber — Example: \"(213) 373-4253\".\r\n * @param {string} [defaultCountry]\r\n * @param {string} [defaultCallingCode]\r\n * @param {Metadata} metadata\r\n * @return {object} Returns `{ country: string?, countryCallingCode: string?, nationalNumber: string? }`.\r\n */\n\n\nfunction parsePhoneNumber(formattedPhoneNumber, defaultCountry, defaultCallingCode, metadata) {\n // Extract calling code from phone number.\n var _extractCountryCallin = extractCountryCallingCode(parseIncompletePhoneNumber(formattedPhoneNumber), defaultCountry, defaultCallingCode, metadata.metadata),\n countryCallingCode = _extractCountryCallin.countryCallingCode,\n number = _extractCountryCallin.number; // Choose a country by `countryCallingCode`.\n\n\n var country;\n\n if (countryCallingCode) {\n metadata.selectNumberingPlan(countryCallingCode);\n } // If `formattedPhoneNumber` is in \"national\" format\n // then `number` is defined and `countryCallingCode` isn't.\n else if (number && (defaultCountry || defaultCallingCode)) {\n metadata.selectNumberingPlan(defaultCountry, defaultCallingCode);\n\n if (defaultCountry) {\n country = defaultCountry;\n } else {\n /* istanbul ignore if */\n if (USE_NON_GEOGRAPHIC_COUNTRY_CODE) {\n if (metadata.isNonGeographicCallingCode(defaultCallingCode)) {\n country = '001';\n }\n }\n }\n\n countryCallingCode = defaultCallingCode || getCountryCallingCode(defaultCountry, metadata.metadata);\n } else return {};\n\n if (!number) {\n return {\n countryCallingCode: countryCallingCode\n };\n }\n\n var _extractNationalNumbe = extractNationalNumber(parseIncompletePhoneNumber(number), metadata),\n nationalNumber = _extractNationalNumbe.nationalNumber,\n carrierCode = _extractNationalNumbe.carrierCode; // Sometimes there are several countries\n // corresponding to the same country phone code\n // (e.g. NANPA countries all having `1` country phone code).\n // Therefore, to reliably determine the exact country,\n // national (significant) number should have been parsed first.\n //\n // When `metadata.json` is generated, all \"ambiguous\" country phone codes\n // get their countries populated with the full set of\n // \"phone number type\" regular expressions.\n //\n\n\n var exactCountry = getCountryByCallingCode(countryCallingCode, nationalNumber, metadata);\n\n if (exactCountry) {\n country = exactCountry;\n /* istanbul ignore if */\n\n if (exactCountry === '001') {// Can't happen with `USE_NON_GEOGRAPHIC_COUNTRY_CODE` being `false`.\n // If `USE_NON_GEOGRAPHIC_COUNTRY_CODE` is set to `true` for some reason,\n // then remove the \"istanbul ignore if\".\n } else {\n metadata.country(country);\n }\n }\n\n return {\n country: country,\n countryCallingCode: countryCallingCode,\n nationalNumber: nationalNumber,\n carrierCode: carrierCode\n };\n}\n//# sourceMappingURL=parse_.js.map","function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nimport parseNumber from './parse_.js';\nexport default function parsePhoneNumber(text, options, metadata) {\n return parseNumber(text, _objectSpread(_objectSpread({}, options), {}, {\n v2: true\n }), metadata);\n}\n//# sourceMappingURL=parsePhoneNumber_.js.map","function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }\n\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\n\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\n\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n\nfunction _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== \"undefined\" && arr[Symbol.iterator] || arr[\"@@iterator\"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"] != null) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; }\n\nfunction _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }\n\nimport parsePhoneNumber_ from './parsePhoneNumber_.js';\nexport default function parsePhoneNumber() {\n var _normalizeArguments = normalizeArguments(arguments),\n text = _normalizeArguments.text,\n options = _normalizeArguments.options,\n metadata = _normalizeArguments.metadata;\n\n return parsePhoneNumber_(text, options, metadata);\n}\nexport function normalizeArguments(args) {\n var _Array$prototype$slic = Array.prototype.slice.call(args),\n _Array$prototype$slic2 = _slicedToArray(_Array$prototype$slic, 4),\n arg_1 = _Array$prototype$slic2[0],\n arg_2 = _Array$prototype$slic2[1],\n arg_3 = _Array$prototype$slic2[2],\n arg_4 = _Array$prototype$slic2[3];\n\n var text;\n var options;\n var metadata; // If the phone number is passed as a string.\n // `parsePhoneNumber('88005553535', ...)`.\n\n if (typeof arg_1 === 'string') {\n text = arg_1;\n } else throw new TypeError('A text for parsing must be a string.'); // If \"default country\" argument is being passed then move it to `options`.\n // `parsePhoneNumber('88005553535', 'RU', [options], metadata)`.\n\n\n if (!arg_2 || typeof arg_2 === 'string') {\n if (arg_4) {\n options = arg_3;\n metadata = arg_4;\n } else {\n options = undefined;\n metadata = arg_3;\n }\n\n if (arg_2) {\n options = _objectSpread({\n defaultCountry: arg_2\n }, options);\n }\n } // `defaultCountry` is not passed.\n // Example: `parsePhoneNumber('+78005553535', [options], metadata)`.\n else if (isObject(arg_2)) {\n if (arg_3) {\n options = arg_2;\n metadata = arg_3;\n } else {\n metadata = arg_2;\n }\n } else throw new Error(\"Invalid second argument: \".concat(arg_2));\n\n return {\n text: text,\n options: options,\n metadata: metadata\n };\n} // Otherwise istanbul would show this as \"branch not covered\".\n\n/* istanbul ignore next */\n\nvar isObject = function isObject(_) {\n return _typeof(_) === 'object';\n};\n//# sourceMappingURL=parsePhoneNumber.js.map","import withMetadataArgument from './withMetadataArgument.js'\r\nimport { parsePhoneNumberWithError as _parsePhoneNumberWithError } from '../../core/index.js'\r\n\r\nexport function parsePhoneNumberWithError() {\r\n\treturn withMetadataArgument(_parsePhoneNumberWithError, arguments)\r\n}\r\n","// This file is a workaround for a bug in web browsers' \"native\"\n// ES6 importing system which is uncapable of importing \"*.json\" files.\n// https://github.com/catamphetamine/libphonenumber-js/issues/239\nexport default {\"version\":4,\"country_calling_codes\":{\"1\":[\"US\",\"AG\",\"AI\",\"AS\",\"BB\",\"BM\",\"BS\",\"CA\",\"DM\",\"DO\",\"GD\",\"GU\",\"JM\",\"KN\",\"KY\",\"LC\",\"MP\",\"MS\",\"PR\",\"SX\",\"TC\",\"TT\",\"VC\",\"VG\",\"VI\"],\"7\":[\"RU\",\"KZ\"],\"20\":[\"EG\"],\"27\":[\"ZA\"],\"30\":[\"GR\"],\"31\":[\"NL\"],\"32\":[\"BE\"],\"33\":[\"FR\"],\"34\":[\"ES\"],\"36\":[\"HU\"],\"39\":[\"IT\",\"VA\"],\"40\":[\"RO\"],\"41\":[\"CH\"],\"43\":[\"AT\"],\"44\":[\"GB\",\"GG\",\"IM\",\"JE\"],\"45\":[\"DK\"],\"46\":[\"SE\"],\"47\":[\"NO\",\"SJ\"],\"48\":[\"PL\"],\"49\":[\"DE\"],\"51\":[\"PE\"],\"52\":[\"MX\"],\"53\":[\"CU\"],\"54\":[\"AR\"],\"55\":[\"BR\"],\"56\":[\"CL\"],\"57\":[\"CO\"],\"58\":[\"VE\"],\"60\":[\"MY\"],\"61\":[\"AU\",\"CC\",\"CX\"],\"62\":[\"ID\"],\"63\":[\"PH\"],\"64\":[\"NZ\"],\"65\":[\"SG\"],\"66\":[\"TH\"],\"81\":[\"JP\"],\"82\":[\"KR\"],\"84\":[\"VN\"],\"86\":[\"CN\"],\"90\":[\"TR\"],\"91\":[\"IN\"],\"92\":[\"PK\"],\"93\":[\"AF\"],\"94\":[\"LK\"],\"95\":[\"MM\"],\"98\":[\"IR\"],\"211\":[\"SS\"],\"212\":[\"MA\",\"EH\"],\"213\":[\"DZ\"],\"216\":[\"TN\"],\"218\":[\"LY\"],\"220\":[\"GM\"],\"221\":[\"SN\"],\"222\":[\"MR\"],\"223\":[\"ML\"],\"224\":[\"GN\"],\"225\":[\"CI\"],\"226\":[\"BF\"],\"227\":[\"NE\"],\"228\":[\"TG\"],\"229\":[\"BJ\"],\"230\":[\"MU\"],\"231\":[\"LR\"],\"232\":[\"SL\"],\"233\":[\"GH\"],\"234\":[\"NG\"],\"235\":[\"TD\"],\"236\":[\"CF\"],\"237\":[\"CM\"],\"238\":[\"CV\"],\"239\":[\"ST\"],\"240\":[\"GQ\"],\"241\":[\"GA\"],\"242\":[\"CG\"],\"243\":[\"CD\"],\"244\":[\"AO\"],\"245\":[\"GW\"],\"246\":[\"IO\"],\"247\":[\"AC\"],\"248\":[\"SC\"],\"249\":[\"SD\"],\"250\":[\"RW\"],\"251\":[\"ET\"],\"252\":[\"SO\"],\"253\":[\"DJ\"],\"254\":[\"KE\"],\"255\":[\"TZ\"],\"256\":[\"UG\"],\"257\":[\"BI\"],\"258\":[\"MZ\"],\"260\":[\"ZM\"],\"261\":[\"MG\"],\"262\":[\"RE\",\"YT\"],\"263\":[\"ZW\"],\"264\":[\"NA\"],\"265\":[\"MW\"],\"266\":[\"LS\"],\"267\":[\"BW\"],\"268\":[\"SZ\"],\"269\":[\"KM\"],\"290\":[\"SH\",\"TA\"],\"291\":[\"ER\"],\"297\":[\"AW\"],\"298\":[\"FO\"],\"299\":[\"GL\"],\"350\":[\"GI\"],\"351\":[\"PT\"],\"352\":[\"LU\"],\"353\":[\"IE\"],\"354\":[\"IS\"],\"355\":[\"AL\"],\"356\":[\"MT\"],\"357\":[\"CY\"],\"358\":[\"FI\",\"AX\"],\"359\":[\"BG\"],\"370\":[\"LT\"],\"371\":[\"LV\"],\"372\":[\"EE\"],\"373\":[\"MD\"],\"374\":[\"AM\"],\"375\":[\"BY\"],\"376\":[\"AD\"],\"377\":[\"MC\"],\"378\":[\"SM\"],\"380\":[\"UA\"],\"381\":[\"RS\"],\"382\":[\"ME\"],\"383\":[\"XK\"],\"385\":[\"HR\"],\"386\":[\"SI\"],\"387\":[\"BA\"],\"389\":[\"MK\"],\"420\":[\"CZ\"],\"421\":[\"SK\"],\"423\":[\"LI\"],\"500\":[\"FK\"],\"501\":[\"BZ\"],\"502\":[\"GT\"],\"503\":[\"SV\"],\"504\":[\"HN\"],\"505\":[\"NI\"],\"506\":[\"CR\"],\"507\":[\"PA\"],\"508\":[\"PM\"],\"509\":[\"HT\"],\"590\":[\"GP\",\"BL\",\"MF\"],\"591\":[\"BO\"],\"592\":[\"GY\"],\"593\":[\"EC\"],\"594\":[\"GF\"],\"595\":[\"PY\"],\"596\":[\"MQ\"],\"597\":[\"SR\"],\"598\":[\"UY\"],\"599\":[\"CW\",\"BQ\"],\"670\":[\"TL\"],\"672\":[\"NF\"],\"673\":[\"BN\"],\"674\":[\"NR\"],\"675\":[\"PG\"],\"676\":[\"TO\"],\"677\":[\"SB\"],\"678\":[\"VU\"],\"679\":[\"FJ\"],\"680\":[\"PW\"],\"681\":[\"WF\"],\"682\":[\"CK\"],\"683\":[\"NU\"],\"685\":[\"WS\"],\"686\":[\"KI\"],\"687\":[\"NC\"],\"688\":[\"TV\"],\"689\":[\"PF\"],\"690\":[\"TK\"],\"691\":[\"FM\"],\"692\":[\"MH\"],\"850\":[\"KP\"],\"852\":[\"HK\"],\"853\":[\"MO\"],\"855\":[\"KH\"],\"856\":[\"LA\"],\"880\":[\"BD\"],\"886\":[\"TW\"],\"960\":[\"MV\"],\"961\":[\"LB\"],\"962\":[\"JO\"],\"963\":[\"SY\"],\"964\":[\"IQ\"],\"965\":[\"KW\"],\"966\":[\"SA\"],\"967\":[\"YE\"],\"968\":[\"OM\"],\"970\":[\"PS\"],\"971\":[\"AE\"],\"972\":[\"IL\"],\"973\":[\"BH\"],\"974\":[\"QA\"],\"975\":[\"BT\"],\"976\":[\"MN\"],\"977\":[\"NP\"],\"992\":[\"TJ\"],\"993\":[\"TM\"],\"994\":[\"AZ\"],\"995\":[\"GE\"],\"996\":[\"KG\"],\"998\":[\"UZ\"]},\"countries\":{\"AC\":[\"247\",\"00\",\"(?:[01589]\\\\d|[46])\\\\d{4}\",[5,6],0,0,0,0,0,0,0,[0,[\"4\\\\d{4}\",[5]]]],\"AD\":[\"376\",\"00\",\"(?:1|6\\\\d)\\\\d{7}|[135-9]\\\\d{5}\",[6,8,9],[[\"(\\\\d{3})(\\\\d{3})\",\"$1 $2\",[\"[135-9]\"]],[\"(\\\\d{4})(\\\\d{4})\",\"$1 $2\",[\"1\"]],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"6\"]]],0,0,0,0,0,0,[0,[\"690\\\\d{6}|[356]\\\\d{5}\",[6,9]]]],\"AE\":[\"971\",\"00\",\"(?:[4-7]\\\\d|9[0-689])\\\\d{7}|800\\\\d{2,9}|[2-4679]\\\\d{7}\",[5,6,7,8,9,10,11,12],[[\"(\\\\d{3})(\\\\d{2,9})\",\"$1 $2\",[\"60|8\"]],[\"(\\\\d)(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"[236]|[479][2-8]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d)(\\\\d{5})\",\"$1 $2 $3\",[\"[479]\"]],[\"(\\\\d{2})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"5\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"5[024-68]\\\\d{7}\",[9]]]],\"AF\":[\"93\",\"00\",\"[2-7]\\\\d{8}\",[9],[[\"(\\\\d{2})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"[2-7]\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"7\\\\d{8}\"]]],\"AG\":[\"1\",\"011\",\"(?:268|[58]\\\\d\\\\d|900)\\\\d{7}\",[10],0,\"1\",0,\"1|([457]\\\\d{6})$\",\"268$1\",0,\"268\",[0,[\"268(?:464|7(?:1[3-9]|[28]\\\\d|3[0246]|64|7[0-689]))\\\\d{4}\"]]],\"AI\":[\"1\",\"011\",\"(?:264|[58]\\\\d\\\\d|900)\\\\d{7}\",[10],0,\"1\",0,\"1|([2457]\\\\d{6})$\",\"264$1\",0,\"264\",[0,[\"264(?:235|4(?:69|76)|5(?:3[6-9]|8[1-4])|7(?:29|72))\\\\d{4}\"]]],\"AL\":[\"355\",\"00\",\"(?:700\\\\d\\\\d|900)\\\\d{3}|8\\\\d{5,7}|(?:[2-5]|6\\\\d)\\\\d{7}\",[6,7,8,9],[[\"(\\\\d{3})(\\\\d{3,4})\",\"$1 $2\",[\"80|9\"],\"0$1\"],[\"(\\\\d)(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"4[2-6]\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"[2358][2-5]|4\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{5})\",\"$1 $2\",[\"[23578]\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"6\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"6(?:[78][2-9]|9\\\\d)\\\\d{6}\",[9]]]],\"AM\":[\"374\",\"00\",\"(?:[1-489]\\\\d|55|60|77)\\\\d{6}\",[8],[[\"(\\\\d{3})(\\\\d{2})(\\\\d{3})\",\"$1 $2 $3\",[\"[89]0\"],\"0 $1\"],[\"(\\\\d{3})(\\\\d{5})\",\"$1 $2\",[\"2|3[12]\"],\"(0$1)\"],[\"(\\\\d{2})(\\\\d{6})\",\"$1 $2\",[\"1|47\"],\"(0$1)\"],[\"(\\\\d{2})(\\\\d{6})\",\"$1 $2\",[\"[3-9]\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"(?:33|4[1349]|55|77|88|9[13-9])\\\\d{6}\"]]],\"AO\":[\"244\",\"00\",\"[29]\\\\d{8}\",[9],[[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"[29]\"]]],0,0,0,0,0,0,[0,[\"9[1-59]\\\\d{7}\"]]],\"AR\":[\"54\",\"00\",\"(?:11|[89]\\\\d\\\\d)\\\\d{8}|[2368]\\\\d{9}\",[10,11],[[\"(\\\\d{4})(\\\\d{2})(\\\\d{4})\",\"$1 $2-$3\",[\"2(?:2[024-9]|3[0-59]|47|6[245]|9[02-8])|3(?:3[28]|4[03-9]|5[2-46-8]|7[1-578]|8[2-9])\",\"2(?:[23]02|6(?:[25]|4[6-8])|9(?:[02356]|4[02568]|72|8[23]))|3(?:3[28]|4(?:[04679]|3[5-8]|5[4-68]|8[2379])|5(?:[2467]|3[237]|8[2-5])|7[1-578]|8(?:[2469]|3[2578]|5[4-8]|7[36-8]|8[5-8]))|2(?:2[24-9]|3[1-59]|47)\",\"2(?:[23]02|6(?:[25]|4(?:64|[78]))|9(?:[02356]|4(?:[0268]|5[2-6])|72|8[23]))|3(?:3[28]|4(?:[04679]|3[78]|5(?:4[46]|8)|8[2379])|5(?:[2467]|3[237]|8[23])|7[1-578]|8(?:[2469]|3[278]|5[56][46]|86[3-6]))|2(?:2[24-9]|3[1-59]|47)|38(?:[58][78]|7[378])|3(?:4[35][56]|58[45]|8(?:[38]5|54|76))[4-6]\",\"2(?:[23]02|6(?:[25]|4(?:64|[78]))|9(?:[02356]|4(?:[0268]|5[2-6])|72|8[23]))|3(?:3[28]|4(?:[04679]|3(?:5(?:4[0-25689]|[56])|[78])|58|8[2379])|5(?:[2467]|3[237]|8(?:[23]|4(?:[45]|60)|5(?:4[0-39]|5|64)))|7[1-578]|8(?:[2469]|3[278]|54(?:4|5[13-7]|6[89])|86[3-6]))|2(?:2[24-9]|3[1-59]|47)|38(?:[58][78]|7[378])|3(?:454|85[56])[46]|3(?:4(?:36|5[56])|8(?:[38]5|76))[4-6]\"],\"0$1\",1],[\"(\\\\d{2})(\\\\d{4})(\\\\d{4})\",\"$1 $2-$3\",[\"1\"],\"0$1\",1],[\"(\\\\d{3})(\\\\d{3})(\\\\d{4})\",\"$1-$2-$3\",[\"[68]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{4})\",\"$1 $2-$3\",[\"[23]\"],\"0$1\",1],[\"(\\\\d)(\\\\d{4})(\\\\d{2})(\\\\d{4})\",\"$2 15-$3-$4\",[\"9(?:2[2-469]|3[3-578])\",\"9(?:2(?:2[024-9]|3[0-59]|47|6[245]|9[02-8])|3(?:3[28]|4[03-9]|5[2-46-8]|7[1-578]|8[2-9]))\",\"9(?:2(?:[23]02|6(?:[25]|4[6-8])|9(?:[02356]|4[02568]|72|8[23]))|3(?:3[28]|4(?:[04679]|3[5-8]|5[4-68]|8[2379])|5(?:[2467]|3[237]|8[2-5])|7[1-578]|8(?:[2469]|3[2578]|5[4-8]|7[36-8]|8[5-8])))|92(?:2[24-9]|3[1-59]|47)\",\"9(?:2(?:[23]02|6(?:[25]|4(?:64|[78]))|9(?:[02356]|4(?:[0268]|5[2-6])|72|8[23]))|3(?:3[28]|4(?:[04679]|3[78]|5(?:4[46]|8)|8[2379])|5(?:[2467]|3[237]|8[23])|7[1-578]|8(?:[2469]|3[278]|5(?:[56][46]|[78])|7[378]|8(?:6[3-6]|[78]))))|92(?:2[24-9]|3[1-59]|47)|93(?:4[35][56]|58[45]|8(?:[38]5|54|76))[4-6]\",\"9(?:2(?:[23]02|6(?:[25]|4(?:64|[78]))|9(?:[02356]|4(?:[0268]|5[2-6])|72|8[23]))|3(?:3[28]|4(?:[04679]|3(?:5(?:4[0-25689]|[56])|[78])|5(?:4[46]|8)|8[2379])|5(?:[2467]|3[237]|8(?:[23]|4(?:[45]|60)|5(?:4[0-39]|5|64)))|7[1-578]|8(?:[2469]|3[278]|5(?:4(?:4|5[13-7]|6[89])|[56][46]|[78])|7[378]|8(?:6[3-6]|[78]))))|92(?:2[24-9]|3[1-59]|47)|93(?:4(?:36|5[56])|8(?:[38]5|76))[4-6]\"],\"0$1\",0,\"$1 $2 $3-$4\"],[\"(\\\\d)(\\\\d{2})(\\\\d{4})(\\\\d{4})\",\"$2 15-$3-$4\",[\"91\"],\"0$1\",0,\"$1 $2 $3-$4\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{5})\",\"$1-$2-$3\",[\"8\"],\"0$1\"],[\"(\\\\d)(\\\\d{3})(\\\\d{3})(\\\\d{4})\",\"$2 15-$3-$4\",[\"9\"],\"0$1\",0,\"$1 $2 $3-$4\"]],\"0\",0,\"0?(?:(11|2(?:2(?:02?|[13]|2[13-79]|4[1-6]|5[2457]|6[124-8]|7[1-4]|8[13-6]|9[1267])|3(?:02?|1[467]|2[03-6]|3[13-8]|[49][2-6]|5[2-8]|[67])|4(?:7[3-578]|9)|6(?:[0136]|2[24-6]|4[6-8]?|5[15-8])|80|9(?:0[1-3]|[19]|2\\\\d|3[1-6]|4[02568]?|5[2-4]|6[2-46]|72?|8[23]?))|3(?:3(?:2[79]|6|8[2578])|4(?:0[0-24-9]|[12]|3[5-8]?|4[24-7]|5[4-68]?|6[02-9]|7[126]|8[2379]?|9[1-36-8])|5(?:1|2[1245]|3[237]?|4[1-46-9]|6[2-4]|7[1-6]|8[2-5]?)|6[24]|7(?:[069]|1[1568]|2[15]|3[145]|4[13]|5[14-8]|7[2-57]|8[126])|8(?:[01]|2[15-7]|3[2578]?|4[13-6]|5[4-8]?|6[1-357-9]|7[36-8]?|8[5-8]?|9[124])))15)?\",\"9$1\",0,0,[0,[\"93(?:7(?:1[15]|81)[46]|8(?:(?:21|4[16]|69|9[12])[46]|88[013-9]))\\\\d{5}|9(?:29(?:54|66)|3(?:7(?:55|77)|865))[2-8]\\\\d{5}|9(?:2(?:2(?:2[59]|44|52)|3(?:26|44)|473|9(?:[07]2|2[26]|34|46))|3327)[45]\\\\d{5}|9(?:2(?:284|3(?:02|23)|657|920)|3(?:4(?:8[27]|92)|541|878))[2-7]\\\\d{5}|9(?:2(?:(?:26|62)2|320|477|9(?:42|83))|3(?:329|4(?:[47]6|62|89)|564))[2-6]\\\\d{5}|(?:675\\\\d|9(?:11[1-8]\\\\d|2(?:2(?:0[45]|1[2-6]|3[3-6])|3(?:[06]4|7[45])|494|6(?:04|1[2-8]|[36][45]|4[3-6])|80[45]|9(?:[17][4-6]|[48][45]|9[3-6]))|3(?:364|4(?:1[2-7]|[235][4-6]|84)|5(?:1[2-9]|[38][4-6])|6(?:2[45]|44)|7[069][45]|8(?:0[45]|[17][2-6]|3[4-6]|[58][3-6]))))\\\\d{6}|92(?:2(?:21|4[23]|6[145]|7[1-4]|8[356]|9[267])|3(?:16|3[13-8]|43|5[346-8]|9[3-5])|475|6(?:2[46]|4[78]|5[1568])|9(?:03|2[1457-9]|3[1356]|4[08]|[56][23]|82))4\\\\d{5}|9(?:2(?:2(?:57|81)|3(?:24|46|92)|9(?:01|23|64))|3(?:4(?:42|71)|5(?:25|37|4[347]|71)|7(?:18|5[17])))[3-6]\\\\d{5}|9(?:2(?:2(?:02|2[3467]|4[156]|5[45]|6[6-8]|91)|3(?:1[47]|25|[45][25]|96)|47[48]|625|932)|3(?:38[2578]|4(?:0[0-24-9]|3[78]|4[457]|58|6[03-9]|72|83|9[136-8])|5(?:2[124]|[368][23]|4[2689]|7[2-6])|7(?:16|2[15]|3[145]|4[13]|5[468]|7[2-5]|8[26])|8(?:2[5-7]|3[278]|4[3-5]|5[78]|6[1-378]|[78]7|94)))[4-6]\\\\d{5}\"]]],\"AS\":[\"1\",\"011\",\"(?:[58]\\\\d\\\\d|684|900)\\\\d{7}\",[10],0,\"1\",0,\"1|([267]\\\\d{6})$\",\"684$1\",0,\"684\",[0,[\"684(?:2(?:48|5[2468]|7[26])|7(?:3[13]|70|82))\\\\d{4}\"]]],\"AT\":[\"43\",\"00\",\"1\\\\d{3,12}|2\\\\d{6,12}|43(?:(?:0\\\\d|5[02-9])\\\\d{3,9}|2\\\\d{4,5}|[3467]\\\\d{4}|8\\\\d{4,6}|9\\\\d{4,7})|5\\\\d{4,12}|8\\\\d{7,12}|9\\\\d{8,12}|(?:[367]\\\\d|4[0-24-9])\\\\d{4,11}\",[4,5,6,7,8,9,10,11,12,13],[[\"(\\\\d)(\\\\d{3,12})\",\"$1 $2\",[\"1(?:11|[2-9])\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{2})\",\"$1 $2\",[\"517\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3,5})\",\"$1 $2\",[\"5[079]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3,10})\",\"$1 $2\",[\"(?:31|4)6|51|6(?:5[0-3579]|[6-9])|7(?:20|32|8)|[89]\"],\"0$1\"],[\"(\\\\d{4})(\\\\d{3,9})\",\"$1 $2\",[\"[2-467]|5[2-6]\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{3,4})\",\"$1 $2 $3\",[\"5\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{4})(\\\\d{4,7})\",\"$1 $2 $3\",[\"5\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"6(?:5[0-3579]|6[013-9]|[7-9]\\\\d)\\\\d{4,10}\",[7,8,9,10,11,12,13]]]],\"AU\":[\"61\",\"001[14-689]|14(?:1[14]|34|4[17]|[56]6|7[47]|88)0011\",\"1(?:[0-79]\\\\d{7}(?:\\\\d(?:\\\\d{2})?)?|8[0-24-9]\\\\d{7})|[2-478]\\\\d{8}|1\\\\d{4,7}\",[5,6,7,8,9,10,12],[[\"(\\\\d{2})(\\\\d{3,4})\",\"$1 $2\",[\"16\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{2,4})\",\"$1 $2 $3\",[\"16\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"14|4\"],\"0$1\"],[\"(\\\\d)(\\\\d{4})(\\\\d{4})\",\"$1 $2 $3\",[\"[2378]\"],\"(0$1)\"],[\"(\\\\d{4})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"1(?:30|[89])\"]]],\"0\",0,\"0|(183[12])\",0,0,0,[0,[\"4(?:83[0-389]|93[0-6])\\\\d{5}|4(?:[0-3]\\\\d|4[047-9]|5[0-25-9]|6[016-9]|7[02-9]|8[0-24-9]|9[0-27-9])\\\\d{6}\",[9]]],\"0011\"],\"AW\":[\"297\",\"00\",\"(?:[25-79]\\\\d\\\\d|800)\\\\d{4}\",[7],[[\"(\\\\d{3})(\\\\d{4})\",\"$1 $2\",[\"[25-9]\"]]],0,0,0,0,0,0,[0,[\"(?:290|5[69]\\\\d|6(?:[03]0|22|4[0-2]|[69]\\\\d)|7(?:[34]\\\\d|7[07])|9(?:6[45]|9[4-8]))\\\\d{4}\"]]],\"AX\":[\"358\",\"00|99(?:[01469]|5(?:[14]1|3[23]|5[59]|77|88|9[09]))\",\"2\\\\d{4,9}|35\\\\d{4,5}|(?:60\\\\d\\\\d|800)\\\\d{4,6}|7\\\\d{5,11}|(?:[14]\\\\d|3[0-46-9]|50)\\\\d{4,8}\",[5,6,7,8,9,10,11,12],0,\"0\",0,0,0,0,\"18\",[0,[\"4946\\\\d{2,6}|(?:4[0-8]|50)\\\\d{4,8}\",[6,7,8,9,10]]],\"00\"],\"AZ\":[\"994\",\"00\",\"365\\\\d{6}|(?:[124579]\\\\d|60|88)\\\\d{7}\",[9],[[\"(\\\\d{3})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"90\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"1[28]|2|365|46\",\"1[28]|2|365[45]|46\",\"1[28]|2|365(?:4|5[02])|46\"],\"(0$1)\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"[13-9]\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"36554\\\\d{4}|(?:[16]0|4[04]|5[015]|7[07]|99)\\\\d{7}\"]]],\"BA\":[\"387\",\"00\",\"6\\\\d{8}|(?:[35689]\\\\d|49|70)\\\\d{6}\",[8,9],[[\"(\\\\d{2})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"6[1-3]|[7-9]\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{3})\",\"$1 $2-$3\",[\"[3-5]|6[56]\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{2})(\\\\d{2})(\\\\d{3})\",\"$1 $2 $3 $4\",[\"6\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"6040\\\\d{5}|6(?:03|[1-356]|44|7\\\\d)\\\\d{6}\"]]],\"BB\":[\"1\",\"011\",\"(?:246|[58]\\\\d\\\\d|900)\\\\d{7}\",[10],0,\"1\",0,\"1|([2-9]\\\\d{6})$\",\"246$1\",0,\"246\",[0,[\"246(?:(?:2(?:[3568]\\\\d|4[0-57-9])|3(?:5[2-9]|6[0-6])|4(?:46|5\\\\d)|69[5-7]|8(?:[2-5]\\\\d|83))\\\\d|52(?:1[147]|20))\\\\d{3}\"]]],\"BD\":[\"880\",\"00\",\"[1-469]\\\\d{9}|8[0-79]\\\\d{7,8}|[2-79]\\\\d{8}|[2-9]\\\\d{7}|[3-9]\\\\d{6}|[57-9]\\\\d{5}\",[6,7,8,9,10],[[\"(\\\\d{2})(\\\\d{4,6})\",\"$1-$2\",[\"31[5-8]|[459]1\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3,7})\",\"$1-$2\",[\"3(?:[67]|8[013-9])|4(?:6[168]|7|[89][18])|5(?:6[128]|9)|6(?:28|4[14]|5)|7[2-589]|8(?:0[014-9]|[12])|9[358]|(?:3[2-5]|4[235]|5[2-578]|6[0389]|76|8[3-7]|9[24])1|(?:44|66)[01346-9]\"],\"0$1\"],[\"(\\\\d{4})(\\\\d{3,6})\",\"$1-$2\",[\"[13-9]|22\"],\"0$1\"],[\"(\\\\d)(\\\\d{7,8})\",\"$1-$2\",[\"2\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"(?:1[13-9]\\\\d|644)\\\\d{7}|(?:3[78]|44|66)[02-9]\\\\d{7}\",[10]]]],\"BE\":[\"32\",\"00\",\"4\\\\d{8}|[1-9]\\\\d{7}\",[8,9],[[\"(\\\\d{3})(\\\\d{2})(\\\\d{3})\",\"$1 $2 $3\",[\"(?:80|9)0\"],\"0$1\"],[\"(\\\\d)(\\\\d{3})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"[239]|4[23]\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"[15-8]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"4\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"4[5-9]\\\\d{7}\",[9]]]],\"BF\":[\"226\",\"00\",\"[025-7]\\\\d{7}\",[8],[[\"(\\\\d{2})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"[025-7]\"]]],0,0,0,0,0,0,[0,[\"(?:0[1-35-7]|5[1-8]|[67]\\\\d)\\\\d{6}\"]]],\"BG\":[\"359\",\"00\",\"00800\\\\d{7}|[2-7]\\\\d{6,7}|[89]\\\\d{6,8}|2\\\\d{5}\",[6,7,8,9,12],[[\"(\\\\d)(\\\\d)(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"2\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{4})\",\"$1 $2\",[\"43[1-6]|70[1-9]\"],\"0$1\"],[\"(\\\\d)(\\\\d{3})(\\\\d{3,4})\",\"$1 $2 $3\",[\"2\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{2,3})\",\"$1 $2 $3\",[\"[356]|4[124-7]|7[1-9]|8[1-6]|9[1-7]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{2})(\\\\d{3})\",\"$1 $2 $3\",[\"(?:70|8)0\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{2})\",\"$1 $2 $3\",[\"43[1-7]|7\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{3,4})\",\"$1 $2 $3\",[\"[48]|9[08]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"9\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"(?:43[07-9]|99[69]\\\\d)\\\\d{5}|(?:8[7-9]|98)\\\\d{7}\",[8,9]]]],\"BH\":[\"973\",\"00\",\"[136-9]\\\\d{7}\",[8],[[\"(\\\\d{4})(\\\\d{4})\",\"$1 $2\",[\"[13679]|8[047]\"]]],0,0,0,0,0,0,[0,[\"(?:3(?:[1-79]\\\\d|8[0-47-9])\\\\d|6(?:3(?:00|33|6[16])|6(?:3[03-9]|[69]\\\\d|7[0-6])))\\\\d{4}\"]]],\"BI\":[\"257\",\"00\",\"(?:[267]\\\\d|31)\\\\d{6}\",[8],[[\"(\\\\d{2})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"[2367]\"]]],0,0,0,0,0,0,[0,[\"(?:29|[67][125-9])\\\\d{6}\"]]],\"BJ\":[\"229\",\"00\",\"[24-689]\\\\d{7}\",[8],[[\"(\\\\d{2})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"[24-689]\"]]],0,0,0,0,0,0,[0,[\"(?:4[01]|5[1-9]|6\\\\d|9[013-9])\\\\d{6}\"]]],\"BL\":[\"590\",\"00\",\"(?:590|(?:69|80)\\\\d|976)\\\\d{6}\",[9],0,\"0\",0,0,0,0,0,[0,[\"69(?:0\\\\d\\\\d|1(?:2[2-9]|3[0-5]))\\\\d{4}\"]]],\"BM\":[\"1\",\"011\",\"(?:441|[58]\\\\d\\\\d|900)\\\\d{7}\",[10],0,\"1\",0,\"1|([2-9]\\\\d{6})$\",\"441$1\",0,\"441\",[0,[\"441(?:[2378]\\\\d|5[0-39]|92)\\\\d{5}\"]]],\"BN\":[\"673\",\"00\",\"[2-578]\\\\d{6}\",[7],[[\"(\\\\d{3})(\\\\d{4})\",\"$1 $2\",[\"[2-578]\"]]],0,0,0,0,0,0,[0,[\"(?:22[89]|[78]\\\\d\\\\d)\\\\d{4}\"]]],\"BO\":[\"591\",\"00(?:1\\\\d)?\",\"(?:[2-467]\\\\d\\\\d|8001)\\\\d{5}\",[8,9],[[\"(\\\\d)(\\\\d{7})\",\"$1 $2\",[\"[23]|4[46]\"]],[\"(\\\\d{8})\",\"$1\",[\"[67]\"]],[\"(\\\\d{3})(\\\\d{2})(\\\\d{4})\",\"$1 $2 $3\",[\"8\"]]],\"0\",0,\"0(1\\\\d)?\",0,0,0,[0,[\"[67]\\\\d{7}\",[8]]]],\"BQ\":[\"599\",\"00\",\"(?:[34]1|7\\\\d)\\\\d{5}\",[7],0,0,0,0,0,0,\"[347]\",[0,[\"(?:31(?:8[14-8]|9[14578])|416[14-9]|7(?:0[01]|7[07]|8\\\\d|9[056])\\\\d)\\\\d{3}\"]]],\"BR\":[\"55\",\"00(?:1[245]|2[1-35]|31|4[13]|[56]5|99)\",\"(?:[1-46-9]\\\\d\\\\d|5(?:[0-46-9]\\\\d|5[0-46-9]))\\\\d{8}|[1-9]\\\\d{9}|[3589]\\\\d{8}|[34]\\\\d{7}\",[8,9,10,11],[[\"(\\\\d{4})(\\\\d{4})\",\"$1-$2\",[\"300|4(?:0[02]|37)\",\"4(?:02|37)0|[34]00\"]],[\"(\\\\d{3})(\\\\d{2,3})(\\\\d{4})\",\"$1 $2 $3\",[\"(?:[358]|90)0\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{4})(\\\\d{4})\",\"$1 $2-$3\",[\"(?:[14689][1-9]|2[12478]|3[1-578]|5[13-5]|7[13-579])[2-57]\"],\"($1)\"],[\"(\\\\d{2})(\\\\d{5})(\\\\d{4})\",\"$1 $2-$3\",[\"[16][1-9]|[2-57-9]\"],\"($1)\"]],\"0\",0,\"(?:0|90)(?:(1[245]|2[1-35]|31|4[13]|[56]5|99)(\\\\d{10,11}))?\",\"$2\",0,0,[0,[\"(?:[14689][1-9]|2[12478]|3[1-578]|5[13-5]|7[13-579])(?:7|9\\\\d)\\\\d{7}\",[10,11]]]],\"BS\":[\"1\",\"011\",\"(?:242|[58]\\\\d\\\\d|900)\\\\d{7}\",[10],0,\"1\",0,\"1|([3-8]\\\\d{6})$\",\"242$1\",0,\"242\",[0,[\"242(?:3(?:5[79]|7[56]|95)|4(?:[23][1-9]|4[1-35-9]|5[1-8]|6[2-8]|7\\\\d|81)|5(?:2[45]|3[35]|44|5[1-46-9]|65|77)|6[34]6|7(?:27|38)|8(?:0[1-9]|1[02-9]|2\\\\d|[89]9))\\\\d{4}\"]]],\"BT\":[\"975\",\"00\",\"[17]\\\\d{7}|[2-8]\\\\d{6}\",[7,8],[[\"(\\\\d)(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"[2-68]|7[246]\"]],[\"(\\\\d{2})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"1[67]|7\"]]],0,0,0,0,0,0,[0,[\"(?:1[67]|77)\\\\d{6}\",[8]]]],\"BW\":[\"267\",\"00\",\"(?:0800|(?:[37]|800)\\\\d)\\\\d{6}|(?:[2-6]\\\\d|90)\\\\d{5}\",[7,8,10],[[\"(\\\\d{2})(\\\\d{5})\",\"$1 $2\",[\"90\"]],[\"(\\\\d{3})(\\\\d{4})\",\"$1 $2\",[\"[24-6]|3[15-79]\"]],[\"(\\\\d{2})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"[37]\"]],[\"(\\\\d{4})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"0\"]],[\"(\\\\d{3})(\\\\d{4})(\\\\d{3})\",\"$1 $2 $3\",[\"8\"]]],0,0,0,0,0,0,[0,[\"(?:321|7(?:[1-7]\\\\d|8[0-4]))\\\\d{5}\",[8]]]],\"BY\":[\"375\",\"810\",\"(?:[12]\\\\d|33|44|902)\\\\d{7}|8(?:0[0-79]\\\\d{5,7}|[1-7]\\\\d{9})|8(?:1[0-489]|[5-79]\\\\d)\\\\d{7}|8[1-79]\\\\d{6,7}|8[0-79]\\\\d{5}|8\\\\d{5}\",[6,7,8,9,10,11],[[\"(\\\\d{3})(\\\\d{3})\",\"$1 $2\",[\"800\"],\"8 $1\"],[\"(\\\\d{3})(\\\\d{2})(\\\\d{2,4})\",\"$1 $2 $3\",[\"800\"],\"8 $1\"],[\"(\\\\d{4})(\\\\d{2})(\\\\d{3})\",\"$1 $2-$3\",[\"1(?:5[169]|6[3-5]|7[179])|2(?:1[35]|2[34]|3[3-5])\",\"1(?:5[169]|6(?:3[1-3]|4|5[125])|7(?:1[3-9]|7[0-24-6]|9[2-7]))|2(?:1[35]|2[34]|3[3-5])\"],\"8 0$1\"],[\"(\\\\d{3})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2-$3-$4\",[\"1(?:[56]|7[467])|2[1-3]\"],\"8 0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{2})(\\\\d{2})\",\"$1 $2-$3-$4\",[\"[1-4]\"],\"8 0$1\"],[\"(\\\\d{3})(\\\\d{3,4})(\\\\d{4})\",\"$1 $2 $3\",[\"[89]\"],\"8 $1\"]],\"8\",0,\"0|80?\",0,0,0,[0,[\"(?:2(?:5[5-79]|9[1-9])|(?:33|44)\\\\d)\\\\d{6}\",[9]]],\"8~10\"],\"BZ\":[\"501\",\"00\",\"(?:0800\\\\d|[2-8])\\\\d{6}\",[7,11],[[\"(\\\\d{3})(\\\\d{4})\",\"$1-$2\",[\"[2-8]\"]],[\"(\\\\d)(\\\\d{3})(\\\\d{4})(\\\\d{3})\",\"$1-$2-$3-$4\",[\"0\"]]],0,0,0,0,0,0,[0,[\"6[0-35-7]\\\\d{5}\",[7]]]],\"CA\":[\"1\",\"011\",\"(?:[2-8]\\\\d|90)\\\\d{8}|3\\\\d{6}\",[7,10],0,\"1\",0,0,0,0,0,[0,[\"(?:2(?:04|[23]6|[48]9|50|63)|3(?:06|43|54|6[578]|82)|4(?:03|1[68]|3[178]|50|68|74)|5(?:06|1[49]|48|79|8[147])|6(?:04|[18]3|39|47|72)|7(?:0[59]|42|53|78|8[02])|8(?:[06]7|19|25|73)|90[25])[2-9]\\\\d{6}\",[10]]]],\"CC\":[\"61\",\"001[14-689]|14(?:1[14]|34|4[17]|[56]6|7[47]|88)0011\",\"1(?:[0-79]\\\\d{8}(?:\\\\d{2})?|8[0-24-9]\\\\d{7})|[148]\\\\d{8}|1\\\\d{5,7}\",[6,7,8,9,10,12],0,\"0\",0,\"0|([59]\\\\d{7})$\",\"8$1\",0,0,[0,[\"4(?:83[0-389]|93[0-6])\\\\d{5}|4(?:[0-3]\\\\d|4[047-9]|5[0-25-9]|6[016-9]|7[02-9]|8[0-24-9]|9[0-27-9])\\\\d{6}\",[9]]],\"0011\"],\"CD\":[\"243\",\"00\",\"[189]\\\\d{8}|[1-68]\\\\d{6}\",[7,9],[[\"(\\\\d{2})(\\\\d{2})(\\\\d{3})\",\"$1 $2 $3\",[\"88\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{5})\",\"$1 $2\",[\"[1-6]\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"1\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"[89]\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"88\\\\d{5}|(?:8[0-59]|9[017-9])\\\\d{7}\"]]],\"CF\":[\"236\",\"00\",\"(?:[27]\\\\d{3}|8776)\\\\d{4}\",[8],[[\"(\\\\d{2})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"[278]\"]]],0,0,0,0,0,0,[0,[\"7[02457]\\\\d{6}\"]]],\"CG\":[\"242\",\"00\",\"222\\\\d{6}|(?:0\\\\d|80)\\\\d{7}\",[9],[[\"(\\\\d)(\\\\d{4})(\\\\d{4})\",\"$1 $2 $3\",[\"8\"]],[\"(\\\\d{2})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"[02]\"]]],0,0,0,0,0,0,[0,[\"026(?:1[0-5]|6[6-9])\\\\d{4}|0(?:[14-6]\\\\d\\\\d|2(?:40|5[5-8]|6[07-9]))\\\\d{5}\"]]],\"CH\":[\"41\",\"00\",\"8\\\\d{11}|[2-9]\\\\d{8}\",[9],[[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"8[047]|90\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"[2-79]|81\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{2})(\\\\d{3})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4 $5\",[\"8\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"7[35-9]\\\\d{7}\"]]],\"CI\":[\"225\",\"00\",\"[02]\\\\d{9}\",[10],[[\"(\\\\d{2})(\\\\d{2})(\\\\d)(\\\\d{5})\",\"$1 $2 $3 $4\",[\"2\"]],[\"(\\\\d{2})(\\\\d{2})(\\\\d{2})(\\\\d{4})\",\"$1 $2 $3 $4\",[\"0\"]]],0,0,0,0,0,0,[0,[\"0[157]\\\\d{8}\"]]],\"CK\":[\"682\",\"00\",\"[2-578]\\\\d{4}\",[5],[[\"(\\\\d{2})(\\\\d{3})\",\"$1 $2\",[\"[2-578]\"]]],0,0,0,0,0,0,[0,[\"[578]\\\\d{4}\"]]],\"CL\":[\"56\",\"(?:0|1(?:1[0-69]|2[02-5]|5[13-58]|69|7[0167]|8[018]))0\",\"12300\\\\d{6}|6\\\\d{9,10}|[2-9]\\\\d{8}\",[9,10,11],[[\"(\\\\d{5})(\\\\d{4})\",\"$1 $2\",[\"219\",\"2196\"],\"($1)\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"44\"]],[\"(\\\\d)(\\\\d{4})(\\\\d{4})\",\"$1 $2 $3\",[\"2[1-36]\"],\"($1)\"],[\"(\\\\d)(\\\\d{4})(\\\\d{4})\",\"$1 $2 $3\",[\"9[2-9]\"]],[\"(\\\\d{2})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"3[2-5]|[47]|5[1-3578]|6[13-57]|8(?:0[1-9]|[1-9])\"],\"($1)\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3,4})\",\"$1 $2 $3\",[\"60|8\"]],[\"(\\\\d{4})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"1\"]],[\"(\\\\d{3})(\\\\d{3})(\\\\d{2})(\\\\d{3})\",\"$1 $2 $3 $4\",[\"60\"]]],0,0,0,0,0,0,[0,[\"2(?:1982[0-6]|3314[05-9])\\\\d{3}|(?:2(?:1(?:160|962)|3(?:2\\\\d\\\\d|3(?:[0346]\\\\d|1[0-35-9]|2[1-9]|5[0-24-9]|7[0-3])|600)|646[59])|80[1-9]\\\\d\\\\d|9(?:3(?:[0-57-9]\\\\d\\\\d|6(?:0[02-9]|[1-9]\\\\d))|6(?:[0-8]\\\\d\\\\d|9(?:[02-79]\\\\d|1[05-9]))|7[1-9]\\\\d\\\\d|9(?:[03-9]\\\\d\\\\d|1(?:[0235-9]\\\\d|4[0-24-9])|2(?:[0-79]\\\\d|8[0-46-9]))))\\\\d{4}|(?:22|3[2-5]|[47][1-35]|5[1-3578]|6[13-57]|8[1-9]|9[2458])\\\\d{7}\",[9]]]],\"CM\":[\"237\",\"00\",\"[26]\\\\d{8}|88\\\\d{6,7}\",[8,9],[[\"(\\\\d{2})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"88\"]],[\"(\\\\d)(\\\\d{2})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4 $5\",[\"[26]|88\"]]],0,0,0,0,0,0,[0,[\"(?:24[23]|6[25-9]\\\\d)\\\\d{6}\",[9]]]],\"CN\":[\"86\",\"00|1(?:[12]\\\\d|79)\\\\d\\\\d00\",\"1[127]\\\\d{8,9}|2\\\\d{9}(?:\\\\d{2})?|[12]\\\\d{6,7}|86\\\\d{6}|(?:1[03-689]\\\\d|6)\\\\d{7,9}|(?:[3-579]\\\\d|8[0-57-9])\\\\d{6,9}\",[7,8,9,10,11,12],[[\"(\\\\d{2})(\\\\d{5,6})\",\"$1 $2\",[\"(?:10|2[0-57-9])[19]\",\"(?:10|2[0-57-9])(?:10|9[56])\",\"10(?:10|9[56])|2[0-57-9](?:100|9[56])\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{5,6})\",\"$1 $2\",[\"3(?:[157]|35|49|9[1-68])|4(?:[17]|2[179]|6[47-9]|8[23])|5(?:[1357]|2[37]|4[36]|6[1-46]|80)|6(?:3[1-5]|6[0238]|9[12])|7(?:01|[1579]|2[248]|3[014-9]|4[3-6]|6[023689])|8(?:1[236-8]|2[5-7]|[37]|8[36-8]|9[1-8])|9(?:0[1-3689]|1[1-79]|[379]|4[13]|5[1-5])|(?:4[35]|59|85)[1-9]\",\"(?:3(?:[157]\\\\d|35|49|9[1-68])|4(?:[17]\\\\d|2[179]|[35][1-9]|6[47-9]|8[23])|5(?:[1357]\\\\d|2[37]|4[36]|6[1-46]|80|9[1-9])|6(?:3[1-5]|6[0238]|9[12])|7(?:01|[1579]\\\\d|2[248]|3[014-9]|4[3-6]|6[023689])|8(?:1[236-8]|2[5-7]|[37]\\\\d|5[1-9]|8[36-8]|9[1-8])|9(?:0[1-3689]|1[1-79]|[379]\\\\d|4[13]|5[1-5]))[19]\",\"85[23](?:10|95)|(?:3(?:[157]\\\\d|35|49|9[1-68])|4(?:[17]\\\\d|2[179]|[35][1-9]|6[47-9]|8[23])|5(?:[1357]\\\\d|2[37]|4[36]|6[1-46]|80|9[1-9])|6(?:3[1-5]|6[0238]|9[12])|7(?:01|[1579]\\\\d|2[248]|3[014-9]|4[3-6]|6[023689])|8(?:1[236-8]|2[5-7]|[37]\\\\d|5[14-9]|8[36-8]|9[1-8])|9(?:0[1-3689]|1[1-79]|[379]\\\\d|4[13]|5[1-5]))(?:10|9[56])\",\"85[23](?:100|95)|(?:3(?:[157]\\\\d|35|49|9[1-68])|4(?:[17]\\\\d|2[179]|[35][1-9]|6[47-9]|8[23])|5(?:[1357]\\\\d|2[37]|4[36]|6[1-46]|80|9[1-9])|6(?:3[1-5]|6[0238]|9[12])|7(?:01|[1579]\\\\d|2[248]|3[014-9]|4[3-6]|6[023689])|8(?:1[236-8]|2[5-7]|[37]\\\\d|5[14-9]|8[36-8]|9[1-8])|9(?:0[1-3689]|1[1-79]|[379]\\\\d|4[13]|5[1-5]))(?:100|9[56])\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"(?:4|80)0\"]],[\"(\\\\d{2})(\\\\d{4})(\\\\d{4})\",\"$1 $2 $3\",[\"10|2(?:[02-57-9]|1[1-9])\",\"10|2(?:[02-57-9]|1[1-9])\",\"10[0-79]|2(?:[02-57-9]|1[1-79])|(?:10|21)8(?:0[1-9]|[1-9])\"],\"0$1\",1],[\"(\\\\d{3})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"3(?:[3-59]|7[02-68])|4(?:[26-8]|3[3-9]|5[2-9])|5(?:3[03-9]|[468]|7[028]|9[2-46-9])|6|7(?:[0-247]|3[04-9]|5[0-4689]|6[2368])|8(?:[1-358]|9[1-7])|9(?:[013479]|5[1-5])|(?:[34]1|55|79|87)[02-9]\"],\"0$1\",1],[\"(\\\\d{3})(\\\\d{7,8})\",\"$1 $2\",[\"9\"]],[\"(\\\\d{4})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"80\"],\"0$1\",1],[\"(\\\\d{3})(\\\\d{4})(\\\\d{4})\",\"$1 $2 $3\",[\"[3-578]\"],\"0$1\",1],[\"(\\\\d{3})(\\\\d{4})(\\\\d{4})\",\"$1 $2 $3\",[\"1[3-9]\"]],[\"(\\\\d{2})(\\\\d{3})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3 $4\",[\"[12]\"],\"0$1\",1]],\"0\",0,\"0|(1(?:[12]\\\\d|79)\\\\d\\\\d)\",0,0,0,[0,[\"1740[0-5]\\\\d{6}|1(?:[38]\\\\d|4[57]|[59][0-35-9]|6[25-7]|7[0-35-8])\\\\d{8}\",[11]]],\"00\"],\"CO\":[\"57\",\"00(?:4(?:[14]4|56)|[579])\",\"(?:60\\\\d\\\\d|9101)\\\\d{6}|(?:1\\\\d|3)\\\\d{9}\",[10,11],[[\"(\\\\d{3})(\\\\d{7})\",\"$1 $2\",[\"6\"],\"($1)\"],[\"(\\\\d{3})(\\\\d{7})\",\"$1 $2\",[\"3[0-357]|91\"]],[\"(\\\\d)(\\\\d{3})(\\\\d{7})\",\"$1-$2-$3\",[\"1\"],\"0$1\",0,\"$1 $2 $3\"]],\"0\",0,\"0(4(?:[14]4|56)|[579])?\",0,0,0,[0,[\"3333(?:0(?:0\\\\d|1[0-5])|[4-9]\\\\d\\\\d)\\\\d{3}|(?:3(?:24[1-9]|3(?:00|3[0-24-9]))|9101)\\\\d{6}|3(?:0[0-5]|1\\\\d|2[0-3]|5[01]|70)\\\\d{7}\",[10]]]],\"CR\":[\"506\",\"00\",\"(?:8\\\\d|90)\\\\d{8}|(?:[24-8]\\\\d{3}|3005)\\\\d{4}\",[8,10],[[\"(\\\\d{4})(\\\\d{4})\",\"$1 $2\",[\"[2-7]|8[3-9]\"]],[\"(\\\\d{3})(\\\\d{3})(\\\\d{4})\",\"$1-$2-$3\",[\"[89]\"]]],0,0,\"(19(?:0[0-2468]|1[09]|20|66|77|99))\",0,0,0,[0,[\"(?:3005\\\\d|6500[01])\\\\d{3}|(?:5[07]|6[0-4]|7[0-3]|8[3-9])\\\\d{6}\",[8]]]],\"CU\":[\"53\",\"119\",\"[27]\\\\d{6,7}|[34]\\\\d{5,7}|(?:5|8\\\\d\\\\d)\\\\d{7}\",[6,7,8,10],[[\"(\\\\d{2})(\\\\d{4,6})\",\"$1 $2\",[\"2[1-4]|[34]\"],\"(0$1)\"],[\"(\\\\d)(\\\\d{6,7})\",\"$1 $2\",[\"7\"],\"(0$1)\"],[\"(\\\\d)(\\\\d{7})\",\"$1 $2\",[\"5\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{7})\",\"$1 $2\",[\"8\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"5\\\\d{7}\",[8]]]],\"CV\":[\"238\",\"0\",\"(?:[2-59]\\\\d\\\\d|800)\\\\d{4}\",[7],[[\"(\\\\d{3})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3\",[\"[2-589]\"]]],0,0,0,0,0,0,[0,[\"(?:36|5[1-389]|9\\\\d)\\\\d{5}\"]]],\"CW\":[\"599\",\"00\",\"(?:[34]1|60|(?:7|9\\\\d)\\\\d)\\\\d{5}\",[7,8],[[\"(\\\\d{3})(\\\\d{4})\",\"$1 $2\",[\"[3467]\"]],[\"(\\\\d)(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"9[4-8]\"]]],0,0,0,0,0,\"[69]\",[0,[\"953[01]\\\\d{4}|9(?:5[12467]|6[5-9])\\\\d{5}\"]]],\"CX\":[\"61\",\"001[14-689]|14(?:1[14]|34|4[17]|[56]6|7[47]|88)0011\",\"1(?:[0-79]\\\\d{8}(?:\\\\d{2})?|8[0-24-9]\\\\d{7})|[148]\\\\d{8}|1\\\\d{5,7}\",[6,7,8,9,10,12],0,\"0\",0,\"0|([59]\\\\d{7})$\",\"8$1\",0,0,[0,[\"4(?:83[0-389]|93[0-6])\\\\d{5}|4(?:[0-3]\\\\d|4[047-9]|5[0-25-9]|6[016-9]|7[02-9]|8[0-24-9]|9[0-27-9])\\\\d{6}\",[9]]],\"0011\"],\"CY\":[\"357\",\"00\",\"(?:[279]\\\\d|[58]0)\\\\d{6}\",[8],[[\"(\\\\d{2})(\\\\d{6})\",\"$1 $2\",[\"[257-9]\"]]],0,0,0,0,0,0,[0,[\"9(?:10|[4-79]\\\\d)\\\\d{5}\"]]],\"CZ\":[\"420\",\"00\",\"(?:[2-578]\\\\d|60)\\\\d{7}|9\\\\d{8,11}\",[9],[[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"[2-8]|9[015-7]\"]],[\"(\\\\d{2})(\\\\d{3})(\\\\d{3})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"96\"]],[\"(\\\\d{2})(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3 $4\",[\"9\"]],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3 $4\",[\"9\"]]],0,0,0,0,0,0,[0,[\"(?:60[1-8]|7(?:0[2-5]|[2379]\\\\d))\\\\d{6}\"]]],\"DE\":[\"49\",\"00\",\"[2579]\\\\d{5,14}|49(?:[34]0|69|8\\\\d)\\\\d\\\\d?|49(?:37|49|60|7[089]|9\\\\d)\\\\d{1,3}|49(?:2[024-9]|3[2-689]|7[1-7])\\\\d{1,8}|(?:1|[368]\\\\d|4[0-8])\\\\d{3,13}|49(?:[015]\\\\d|2[13]|31|[46][1-8])\\\\d{1,9}\",[4,5,6,7,8,9,10,11,12,13,14,15],[[\"(\\\\d{2})(\\\\d{3,13})\",\"$1 $2\",[\"3[02]|40|[68]9\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3,12})\",\"$1 $2\",[\"2(?:0[1-389]|1[124]|2[18]|3[14])|3(?:[35-9][15]|4[015])|906|(?:2[4-9]|4[2-9]|[579][1-9]|[68][1-8])1\",\"2(?:0[1-389]|12[0-8])|3(?:[35-9][15]|4[015])|906|2(?:[13][14]|2[18])|(?:2[4-9]|4[2-9]|[579][1-9]|[68][1-8])1\"],\"0$1\"],[\"(\\\\d{4})(\\\\d{2,11})\",\"$1 $2\",[\"[24-6]|3(?:[3569][02-46-9]|4[2-4679]|7[2-467]|8[2-46-8])|70[2-8]|8(?:0[2-9]|[1-8])|90[7-9]|[79][1-9]\",\"[24-6]|3(?:3(?:0[1-467]|2[127-9]|3[124578]|7[1257-9]|8[1256]|9[145])|4(?:2[135]|4[13578]|9[1346])|5(?:0[14]|2[1-3589]|6[1-4]|7[13468]|8[13568])|6(?:2[1-489]|3[124-6]|6[13]|7[12579]|8[1-356]|9[135])|7(?:2[1-7]|4[145]|6[1-5]|7[1-4])|8(?:21|3[1468]|6|7[1467]|8[136])|9(?:0[12479]|2[1358]|4[134679]|6[1-9]|7[136]|8[147]|9[1468]))|70[2-8]|8(?:0[2-9]|[1-8])|90[7-9]|[79][1-9]|3[68]4[1347]|3(?:47|60)[1356]|3(?:3[46]|46|5[49])[1246]|3[4579]3[1357]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{4})\",\"$1 $2\",[\"138\"],\"0$1\"],[\"(\\\\d{5})(\\\\d{2,10})\",\"$1 $2\",[\"3\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{5,11})\",\"$1 $2\",[\"181\"],\"0$1\"],[\"(\\\\d{3})(\\\\d)(\\\\d{4,10})\",\"$1 $2 $3\",[\"1(?:3|80)|9\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{7,8})\",\"$1 $2\",[\"1[67]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{7,12})\",\"$1 $2\",[\"8\"],\"0$1\"],[\"(\\\\d{5})(\\\\d{6})\",\"$1 $2\",[\"185\",\"1850\",\"18500\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{4})(\\\\d{4})\",\"$1 $2 $3\",[\"7\"],\"0$1\"],[\"(\\\\d{4})(\\\\d{7})\",\"$1 $2\",[\"18[68]\"],\"0$1\"],[\"(\\\\d{5})(\\\\d{6})\",\"$1 $2\",[\"15[0568]\"],\"0$1\"],[\"(\\\\d{4})(\\\\d{7})\",\"$1 $2\",[\"15[1279]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{8})\",\"$1 $2\",[\"18\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{2})(\\\\d{7,8})\",\"$1 $2 $3\",[\"1(?:6[023]|7)\"],\"0$1\"],[\"(\\\\d{4})(\\\\d{2})(\\\\d{7})\",\"$1 $2 $3\",[\"15[279]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{2})(\\\\d{8})\",\"$1 $2 $3\",[\"15\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"15[0-25-9]\\\\d{8}|1(?:6[023]|7\\\\d)\\\\d{7,8}\",[10,11]]]],\"DJ\":[\"253\",\"00\",\"(?:2\\\\d|77)\\\\d{6}\",[8],[[\"(\\\\d{2})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"[27]\"]]],0,0,0,0,0,0,[0,[\"77\\\\d{6}\"]]],\"DK\":[\"45\",\"00\",\"[2-9]\\\\d{7}\",[8],[[\"(\\\\d{2})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"[2-9]\"]]],0,0,0,0,0,0,[0,[\"(?:[2-7]\\\\d|8[126-9]|9[1-46-9])\\\\d{6}\"]]],\"DM\":[\"1\",\"011\",\"(?:[58]\\\\d\\\\d|767|900)\\\\d{7}\",[10],0,\"1\",0,\"1|([2-7]\\\\d{6})$\",\"767$1\",0,\"767\",[0,[\"767(?:2(?:[2-4689]5|7[5-7])|31[5-7]|61[1-8]|70[1-6])\\\\d{4}\"]]],\"DO\":[\"1\",\"011\",\"(?:[58]\\\\d\\\\d|900)\\\\d{7}\",[10],0,\"1\",0,0,0,0,\"8001|8[024]9\",[0,[\"8[024]9[2-9]\\\\d{6}\"]]],\"DZ\":[\"213\",\"00\",\"(?:[1-4]|[5-79]\\\\d|80)\\\\d{7}\",[8,9],[[\"(\\\\d{2})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"[1-4]\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"9\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"[5-8]\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"(?:5(?:4[0-29]|5\\\\d|6[0-2])|6(?:[569]\\\\d|7[0-6])|7[7-9]\\\\d)\\\\d{6}\",[9]]]],\"EC\":[\"593\",\"00\",\"1\\\\d{9,10}|(?:[2-7]|9\\\\d)\\\\d{7}\",[8,9,10,11],[[\"(\\\\d)(\\\\d{3})(\\\\d{4})\",\"$1 $2-$3\",[\"[2-7]\"],\"(0$1)\",0,\"$1-$2-$3\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"9\"],\"0$1\"],[\"(\\\\d{4})(\\\\d{3})(\\\\d{3,4})\",\"$1 $2 $3\",[\"1\"]]],\"0\",0,0,0,0,0,[0,[\"964[0-2]\\\\d{5}|9(?:39|[57][89]|6[0-36-9]|[89]\\\\d)\\\\d{6}\",[9]]]],\"EE\":[\"372\",\"00\",\"8\\\\d{9}|[4578]\\\\d{7}|(?:[3-8]\\\\d|90)\\\\d{5}\",[7,8,10],[[\"(\\\\d{3})(\\\\d{4})\",\"$1 $2\",[\"[369]|4[3-8]|5(?:[0-2]|5[0-478]|6[45])|7[1-9]|88\",\"[369]|4[3-8]|5(?:[02]|1(?:[0-8]|95)|5[0-478]|6(?:4[0-4]|5[1-589]))|7[1-9]|88\"]],[\"(\\\\d{4})(\\\\d{3,4})\",\"$1 $2\",[\"[45]|8(?:00|[1-49])\",\"[45]|8(?:00[1-9]|[1-49])\"]],[\"(\\\\d{2})(\\\\d{2})(\\\\d{4})\",\"$1 $2 $3\",[\"7\"]],[\"(\\\\d{4})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"8\"]]],0,0,0,0,0,0,[0,[\"(?:5\\\\d{5}|8(?:1(?:0(?:000|[3-9]\\\\d\\\\d)|(?:1(?:0[236]|1\\\\d)|(?:23|[3-79]\\\\d)\\\\d)\\\\d)|2(?:0(?:000|(?:19|[2-7]\\\\d)\\\\d)|(?:(?:[124-6]\\\\d|3[5-9])\\\\d|7(?:[3679]\\\\d|8[13-9])|8(?:[2-6]\\\\d|7[01]))\\\\d)|[349]\\\\d{4}))\\\\d\\\\d|5(?:(?:[02]\\\\d|5[0-478])\\\\d|1(?:[0-8]\\\\d|95)|6(?:4[0-4]|5[1-589]))\\\\d{3}\",[7,8]]]],\"EG\":[\"20\",\"00\",\"[189]\\\\d{8,9}|[24-6]\\\\d{8}|[135]\\\\d{7}\",[8,9,10],[[\"(\\\\d)(\\\\d{7,8})\",\"$1 $2\",[\"[23]\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{6,7})\",\"$1 $2\",[\"1[35]|[4-6]|8[2468]|9[235-7]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"[189]\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"1[0-25]\\\\d{8}\",[10]]]],\"EH\":[\"212\",\"00\",\"[5-8]\\\\d{8}\",[9],0,\"0\",0,0,0,0,\"528[89]\",[0,[\"(?:6(?:[0-79]\\\\d|8[0-247-9])|7(?:[017]\\\\d|2[0-2]|6[0-8]|8[0-3]))\\\\d{6}\"]]],\"ER\":[\"291\",\"00\",\"[178]\\\\d{6}\",[7],[[\"(\\\\d)(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"[178]\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"(?:17[1-3]|7\\\\d\\\\d)\\\\d{4}\"]]],\"ES\":[\"34\",\"00\",\"[5-9]\\\\d{8}\",[9],[[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"[89]00\"]],[\"(\\\\d{3})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"[5-9]\"]]],0,0,0,0,0,0,[0,[\"(?:590[16]00\\\\d|9(?:6906(?:09|10)|7390\\\\d\\\\d))\\\\d\\\\d|(?:6\\\\d|7[1-48])\\\\d{7}\"]]],\"ET\":[\"251\",\"00\",\"(?:11|[2-579]\\\\d)\\\\d{7}\",[9],[[\"(\\\\d{2})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"[1-579]\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"7001\\\\d{5}|(?:7(?:0[1-9]|1[01]|77|86|99)|9\\\\d\\\\d)\\\\d{6}\"]]],\"FI\":[\"358\",\"00|99(?:[01469]|5(?:[14]1|3[23]|5[59]|77|88|9[09]))\",\"[1-35689]\\\\d{4}|7\\\\d{10,11}|(?:[124-7]\\\\d|3[0-46-9])\\\\d{8}|[1-9]\\\\d{5,8}\",[5,6,7,8,9,10,11,12],[[\"(\\\\d)(\\\\d{4,9})\",\"$1 $2\",[\"[2568][1-8]|3(?:0[1-9]|[1-9])|9\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3,7})\",\"$1 $2\",[\"[12]00|[368]|70[07-9]\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{4,8})\",\"$1 $2\",[\"[1245]|7[135]\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{6,10})\",\"$1 $2\",[\"7\"],\"0$1\"]],\"0\",0,0,0,0,\"1[03-79]|[2-9]\",[0,[\"4946\\\\d{2,6}|(?:4[0-8]|50)\\\\d{4,8}\",[6,7,8,9,10]]],\"00\"],\"FJ\":[\"679\",\"0(?:0|52)\",\"45\\\\d{5}|(?:0800\\\\d|[235-9])\\\\d{6}\",[7,11],[[\"(\\\\d{3})(\\\\d{4})\",\"$1 $2\",[\"[235-9]|45\"]],[\"(\\\\d{4})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"0\"]]],0,0,0,0,0,0,[0,[\"(?:[279]\\\\d|45|5[01568]|8[034679])\\\\d{5}\",[7]]],\"00\"],\"FK\":[\"500\",\"00\",\"[2-7]\\\\d{4}\",[5],0,0,0,0,0,0,0,[0,[\"[56]\\\\d{4}\"]]],\"FM\":[\"691\",\"00\",\"(?:[39]\\\\d\\\\d|820)\\\\d{4}\",[7],[[\"(\\\\d{3})(\\\\d{4})\",\"$1 $2\",[\"[389]\"]]],0,0,0,0,0,0,[0,[\"31(?:00[67]|208|309)\\\\d\\\\d|(?:3(?:[2357]0[1-9]|602|804|905)|(?:820|9[2-7]\\\\d)\\\\d)\\\\d{3}\"]]],\"FO\":[\"298\",\"00\",\"[2-9]\\\\d{5}\",[6],[[\"(\\\\d{6})\",\"$1\",[\"[2-9]\"]]],0,0,\"(10(?:01|[12]0|88))\",0,0,0,[0,[\"(?:[27][1-9]|5\\\\d|9[16])\\\\d{4}\"]]],\"FR\":[\"33\",\"00\",\"[1-9]\\\\d{8}\",[9],[[\"(\\\\d{3})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"8\"],\"0 $1\"],[\"(\\\\d)(\\\\d{2})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4 $5\",[\"[1-79]\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"(?:6(?:[0-24-8]\\\\d|3[0-8]|9[589])|7(?:00|[3-9]\\\\d))\\\\d{6}\"]]],\"GA\":[\"241\",\"00\",\"(?:[067]\\\\d|11)\\\\d{6}|[2-7]\\\\d{6}\",[7,8],[[\"(\\\\d)(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"[2-7]\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"0\"]],[\"(\\\\d{2})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"11|[67]\"],\"0$1\"]],0,0,\"0(11\\\\d{6}|60\\\\d{6}|61\\\\d{6}|6[256]\\\\d{6}|7[467]\\\\d{6})\",\"$1\",0,0,[0,[\"(?:(?:0[2-7]|7[467])\\\\d|6(?:0[0-4]|10|[256]\\\\d))\\\\d{5}|[2-7]\\\\d{6}\"]]],\"GB\":[\"44\",\"00\",\"[1-357-9]\\\\d{9}|[18]\\\\d{8}|8\\\\d{6}\",[7,9,10],[[\"(\\\\d{3})(\\\\d{4})\",\"$1 $2\",[\"800\",\"8001\",\"80011\",\"800111\",\"8001111\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3\",[\"845\",\"8454\",\"84546\",\"845464\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{6})\",\"$1 $2\",[\"800\"],\"0$1\"],[\"(\\\\d{5})(\\\\d{4,5})\",\"$1 $2\",[\"1(?:38|5[23]|69|76|94)\",\"1(?:(?:38|69)7|5(?:24|39)|768|946)\",\"1(?:3873|5(?:242|39[4-6])|(?:697|768)[347]|9467)\"],\"0$1\"],[\"(\\\\d{4})(\\\\d{5,6})\",\"$1 $2\",[\"1(?:[2-69][02-9]|[78])\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{4})(\\\\d{4})\",\"$1 $2 $3\",[\"[25]|7(?:0|6[02-9])\",\"[25]|7(?:0|6(?:[03-9]|2[356]))\"],\"0$1\"],[\"(\\\\d{4})(\\\\d{6})\",\"$1 $2\",[\"7\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"[1389]\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"7(?:457[0-57-9]|700[01]|911[028])\\\\d{5}|7(?:[1-3]\\\\d\\\\d|4(?:[0-46-9]\\\\d|5[0-689])|5(?:0[0-8]|[13-9]\\\\d|2[0-35-9])|7(?:0[1-9]|[1-7]\\\\d|8[02-9]|9[0-689])|8(?:[014-9]\\\\d|[23][0-8])|9(?:[024-9]\\\\d|1[02-9]|3[0-689]))\\\\d{6}\",[10]]],0,\" x\"],\"GD\":[\"1\",\"011\",\"(?:473|[58]\\\\d\\\\d|900)\\\\d{7}\",[10],0,\"1\",0,\"1|([2-9]\\\\d{6})$\",\"473$1\",0,\"473\",[0,[\"473(?:4(?:0[2-79]|1[04-9]|2[0-5]|58)|5(?:2[01]|3[3-8])|901)\\\\d{4}\"]]],\"GE\":[\"995\",\"00\",\"(?:[3-57]\\\\d\\\\d|800)\\\\d{6}\",[9],[[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"70\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"32\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"[57]\"]],[\"(\\\\d{3})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"[348]\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"5(?:(?:0555|1(?:[17]77|555))[5-9]|757(?:7[7-9]|8[01]))\\\\d{3}|5(?:0070|11(?:33|51)|[25]222|3333)[0-4]\\\\d{3}|5(?:00(?:0\\\\d|5[05])|11(?:00|[124]\\\\d|3[01])|5200|75(?:00|[57]5)|8(?:0(?:[01]\\\\d|2[0-4])|58[89]|8(?:55|88)))\\\\d{4}|(?:5(?:[14]4|5[0157-9]|68|7[0147-9]|9[1-35-9])|790)\\\\d{6}\"]]],\"GF\":[\"594\",\"00\",\"(?:[56]94|80\\\\d|976)\\\\d{6}\",[9],[[\"(\\\\d{3})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"[569]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"8\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"694(?:[0-249]\\\\d|3[0-8])\\\\d{4}\"]]],\"GG\":[\"44\",\"00\",\"(?:1481|[357-9]\\\\d{3})\\\\d{6}|8\\\\d{6}(?:\\\\d{2})?\",[7,9,10],0,\"0\",0,\"0|([25-9]\\\\d{5})$\",\"1481$1\",0,0,[0,[\"7(?:(?:781|839)\\\\d|911[17])\\\\d{5}\",[10]]]],\"GH\":[\"233\",\"00\",\"(?:[235]\\\\d{3}|800)\\\\d{5}\",[8,9],[[\"(\\\\d{3})(\\\\d{5})\",\"$1 $2\",[\"8\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"[235]\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"(?:2(?:[0346-9]\\\\d|5[67])|5(?:[03-7]\\\\d|9[1-9]))\\\\d{6}\",[9]]]],\"GI\":[\"350\",\"00\",\"(?:[25]\\\\d\\\\d|606)\\\\d{5}\",[8],[[\"(\\\\d{3})(\\\\d{5})\",\"$1 $2\",[\"2\"]]],0,0,0,0,0,0,[0,[\"525(?:0\\\\d|1[0-4])\\\\d{3}|(?:5[146-8]\\\\d|606)\\\\d{5}\"]]],\"GL\":[\"299\",\"00\",\"(?:19|[2-689]\\\\d|70)\\\\d{4}\",[6],[[\"(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3\",[\"19|[2-9]\"]]],0,0,0,0,0,0,[0,[\"[245]\\\\d{5}\"]]],\"GM\":[\"220\",\"00\",\"[2-9]\\\\d{6}\",[7],[[\"(\\\\d{3})(\\\\d{4})\",\"$1 $2\",[\"[2-9]\"]]],0,0,0,0,0,0,[0,[\"(?:[23679]\\\\d|5[0-389])\\\\d{5}\"]]],\"GN\":[\"224\",\"00\",\"722\\\\d{6}|(?:3|6\\\\d)\\\\d{7}\",[8,9],[[\"(\\\\d{2})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"3\"]],[\"(\\\\d{3})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"[67]\"]]],0,0,0,0,0,0,[0,[\"6[0-356]\\\\d{7}\",[9]]]],\"GP\":[\"590\",\"00\",\"(?:590|(?:69|80)\\\\d|976)\\\\d{6}\",[9],[[\"(\\\\d{3})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"[569]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"8\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"69(?:0\\\\d\\\\d|1(?:2[2-9]|3[0-5]))\\\\d{4}\"]]],\"GQ\":[\"240\",\"00\",\"222\\\\d{6}|(?:3\\\\d|55|[89]0)\\\\d{7}\",[9],[[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"[235]\"]],[\"(\\\\d{3})(\\\\d{6})\",\"$1 $2\",[\"[89]\"]]],0,0,0,0,0,0,[0,[\"(?:222|55\\\\d)\\\\d{6}\"]]],\"GR\":[\"30\",\"00\",\"5005000\\\\d{3}|8\\\\d{9,11}|(?:[269]\\\\d|70)\\\\d{8}\",[10,11,12],[[\"(\\\\d{2})(\\\\d{4})(\\\\d{4})\",\"$1 $2 $3\",[\"21|7\"]],[\"(\\\\d{4})(\\\\d{6})\",\"$1 $2\",[\"2(?:2|3[2-57-9]|4[2-469]|5[2-59]|6[2-9]|7[2-69]|8[2-49])|5\"]],[\"(\\\\d{3})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"[2689]\"]],[\"(\\\\d{3})(\\\\d{3,4})(\\\\d{5})\",\"$1 $2 $3\",[\"8\"]]],0,0,0,0,0,0,[0,[\"68[57-9]\\\\d{7}|(?:69|94)\\\\d{8}\",[10]]]],\"GT\":[\"502\",\"00\",\"(?:1\\\\d{3}|[2-7])\\\\d{7}\",[8,11],[[\"(\\\\d{4})(\\\\d{4})\",\"$1 $2\",[\"[2-7]\"]],[\"(\\\\d{4})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"1\"]]],0,0,0,0,0,0,[0,[\"[3-5]\\\\d{7}\",[8]]]],\"GU\":[\"1\",\"011\",\"(?:[58]\\\\d\\\\d|671|900)\\\\d{7}\",[10],0,\"1\",0,\"1|([3-9]\\\\d{6})$\",\"671$1\",0,\"671\",[0,[\"671(?:3(?:00|3[39]|4[349]|55|6[26])|4(?:00|56|7[1-9]|8[02-46-9])|5(?:55|6[2-5]|88)|6(?:3[2-578]|4[24-9]|5[34]|78|8[235-9])|7(?:[0479]7|2[0167]|3[45]|8[7-9])|8(?:[2-57-9]8|6[48])|9(?:2[29]|6[79]|7[1279]|8[7-9]|9[78]))\\\\d{4}\"]]],\"GW\":[\"245\",\"00\",\"[49]\\\\d{8}|4\\\\d{6}\",[7,9],[[\"(\\\\d{3})(\\\\d{4})\",\"$1 $2\",[\"40\"]],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"[49]\"]]],0,0,0,0,0,0,[0,[\"9(?:5\\\\d|6[569]|77)\\\\d{6}\",[9]]]],\"GY\":[\"592\",\"001\",\"9008\\\\d{3}|(?:[2-467]\\\\d\\\\d|862)\\\\d{4}\",[7],[[\"(\\\\d{3})(\\\\d{4})\",\"$1 $2\",[\"[2-46-9]\"]]],0,0,0,0,0,0,[0,[\"(?:6\\\\d\\\\d|70[0-35-7])\\\\d{4}\"]]],\"HK\":[\"852\",\"00(?:30|5[09]|[126-9]?)\",\"8[0-46-9]\\\\d{6,7}|9\\\\d{4,7}|(?:[2-7]|9\\\\d{3})\\\\d{7}\",[5,6,7,8,9,11],[[\"(\\\\d{3})(\\\\d{2,5})\",\"$1 $2\",[\"900\",\"9003\"]],[\"(\\\\d{4})(\\\\d{4})\",\"$1 $2\",[\"[2-7]|8[1-4]|9(?:0[1-9]|[1-8])\"]],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"8\"]],[\"(\\\\d{3})(\\\\d{2})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3 $4\",[\"9\"]]],0,0,0,0,0,0,[0,[\"(?:4(?:44[5-9]|6(?:0[0-7]|1[0-6]|4[0-57-9]|6[0-4]|7[0-8]))|573[0-6]|6(?:26[013-8]|66[0-3])|70(?:7[1-5]|8[0-4])|848[015-9]|9(?:29[013-9]|59[0-4]))\\\\d{4}|(?:4(?:4[01]|6[2358])|5(?:[1-59][0-46-9]|6[0-4689]|7[0-246-9])|6(?:0[1-9]|[13-59]\\\\d|[268][0-57-9]|7[0-79])|84[09]|9(?:0[1-9]|1[02-9]|[2358][0-8]|[467]\\\\d))\\\\d{5}\",[8]]],\"00\"],\"HN\":[\"504\",\"00\",\"8\\\\d{10}|[237-9]\\\\d{7}\",[8,11],[[\"(\\\\d{4})(\\\\d{4})\",\"$1-$2\",[\"[237-9]\"]]],0,0,0,0,0,0,[0,[\"[37-9]\\\\d{7}\",[8]]]],\"HR\":[\"385\",\"00\",\"(?:[24-69]\\\\d|3[0-79])\\\\d{7}|80\\\\d{5,7}|[1-79]\\\\d{7}|6\\\\d{5,6}\",[6,7,8,9],[[\"(\\\\d{2})(\\\\d{2})(\\\\d{2,3})\",\"$1 $2 $3\",[\"6[01]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{2})(\\\\d{2,3})\",\"$1 $2 $3\",[\"8\"],\"0$1\"],[\"(\\\\d)(\\\\d{4})(\\\\d{3})\",\"$1 $2 $3\",[\"1\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{3,4})\",\"$1 $2 $3\",[\"[67]\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{3,4})\",\"$1 $2 $3\",[\"9\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{3,4})\",\"$1 $2 $3\",[\"[2-5]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"8\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"98\\\\d{6,7}|975(?:1\\\\d|77|9[67])\\\\d{4}|9(?:0[1-9]|[1259]\\\\d|7[0679])\\\\d{6}\",[8,9]]]],\"HT\":[\"509\",\"00\",\"(?:[2-489]\\\\d|55)\\\\d{6}\",[8],[[\"(\\\\d{2})(\\\\d{2})(\\\\d{4})\",\"$1 $2 $3\",[\"[2-589]\"]]],0,0,0,0,0,0,[0,[\"(?:[34]\\\\d|55)\\\\d{6}\"]]],\"HU\":[\"36\",\"00\",\"[235-7]\\\\d{8}|[1-9]\\\\d{7}\",[8,9],[[\"(\\\\d)(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"1\"],\"(06 $1)\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"[27][2-9]|3[2-7]|4[24-9]|5[2-79]|6|8[2-57-9]|9[2-69]\"],\"(06 $1)\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{3,4})\",\"$1 $2 $3\",[\"[2-9]\"],\"06 $1\"]],\"06\",0,0,0,0,0,[0,[\"(?:[257]0|3[01])\\\\d{7}\",[9]]]],\"ID\":[\"62\",\"00[89]\",\"(?:(?:00[1-9]|8\\\\d)\\\\d{4}|[1-36])\\\\d{6}|00\\\\d{10}|[1-9]\\\\d{8,10}|[2-9]\\\\d{7}\",[7,8,9,10,11,12,13],[[\"(\\\\d)(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"15\"]],[\"(\\\\d{2})(\\\\d{5,9})\",\"$1 $2\",[\"2[124]|[36]1\"],\"(0$1)\"],[\"(\\\\d{3})(\\\\d{5,7})\",\"$1 $2\",[\"800\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{5,8})\",\"$1 $2\",[\"[2-79]\"],\"(0$1)\"],[\"(\\\\d{3})(\\\\d{3,4})(\\\\d{3})\",\"$1-$2-$3\",[\"8[1-35-9]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{6,8})\",\"$1 $2\",[\"1\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"804\"],\"0$1\"],[\"(\\\\d{3})(\\\\d)(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3 $4\",[\"80\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{4})(\\\\d{4,5})\",\"$1-$2-$3\",[\"8\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"8[1-35-9]\\\\d{7,10}\",[9,10,11,12]]]],\"IE\":[\"353\",\"00\",\"(?:1\\\\d|[2569])\\\\d{6,8}|4\\\\d{6,9}|7\\\\d{8}|8\\\\d{8,9}\",[7,8,9,10],[[\"(\\\\d{2})(\\\\d{5})\",\"$1 $2\",[\"2[24-9]|47|58|6[237-9]|9[35-9]\"],\"(0$1)\"],[\"(\\\\d{3})(\\\\d{5})\",\"$1 $2\",[\"[45]0\"],\"(0$1)\"],[\"(\\\\d)(\\\\d{3,4})(\\\\d{4})\",\"$1 $2 $3\",[\"1\"],\"(0$1)\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{3,4})\",\"$1 $2 $3\",[\"[2569]|4[1-69]|7[14]\"],\"(0$1)\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"70\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"81\"],\"(0$1)\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"[78]\"],\"0$1\"],[\"(\\\\d{4})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"1\"]],[\"(\\\\d{2})(\\\\d{4})(\\\\d{4})\",\"$1 $2 $3\",[\"4\"],\"(0$1)\"],[\"(\\\\d{2})(\\\\d)(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3 $4\",[\"8\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"8(?:22|[35-9]\\\\d)\\\\d{6}\",[9]]]],\"IL\":[\"972\",\"0(?:0|1[2-9])\",\"1\\\\d{6}(?:\\\\d{3,5})?|[57]\\\\d{8}|[1-489]\\\\d{7}\",[7,8,9,10,11,12],[[\"(\\\\d{4})(\\\\d{3})\",\"$1-$2\",[\"125\"]],[\"(\\\\d{4})(\\\\d{2})(\\\\d{2})\",\"$1-$2-$3\",[\"121\"]],[\"(\\\\d)(\\\\d{3})(\\\\d{4})\",\"$1-$2-$3\",[\"[2-489]\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{4})\",\"$1-$2-$3\",[\"[57]\"],\"0$1\"],[\"(\\\\d{4})(\\\\d{3})(\\\\d{3})\",\"$1-$2-$3\",[\"12\"]],[\"(\\\\d{4})(\\\\d{6})\",\"$1-$2\",[\"159\"]],[\"(\\\\d)(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1-$2-$3-$4\",[\"1[7-9]\"]],[\"(\\\\d{3})(\\\\d{1,2})(\\\\d{3})(\\\\d{4})\",\"$1-$2 $3-$4\",[\"15\"]]],\"0\",0,0,0,0,0,[0,[\"5(?:(?:[02368]\\\\d|[19][2-9]|4[1-9])\\\\d|5(?:01|1[79]|2[2-9]|3[0-3]|4[34]|5[015689]|6[6-8]|7[0-267]|8[7-9]|9[1-9]))\\\\d{5}\",[9]]]],\"IM\":[\"44\",\"00\",\"1624\\\\d{6}|(?:[3578]\\\\d|90)\\\\d{8}\",[10],0,\"0\",0,\"0|([25-8]\\\\d{5})$\",\"1624$1\",0,\"74576|(?:16|7[56])24\",[0,[\"76245[06]\\\\d{4}|7(?:4576|[59]24\\\\d|624[0-4689])\\\\d{5}\"]]],\"IN\":[\"91\",\"00\",\"(?:000800|[2-9]\\\\d\\\\d)\\\\d{7}|1\\\\d{7,12}\",[8,9,10,11,12,13],[[\"(\\\\d{8})\",\"$1\",[\"5(?:0|2[23]|3[03]|[67]1|88)\",\"5(?:0|2(?:21|3)|3(?:0|3[23])|616|717|888)\",\"5(?:0|2(?:21|3)|3(?:0|3[23])|616|717|8888)\"],0,1],[\"(\\\\d{4})(\\\\d{4,5})\",\"$1 $2\",[\"180\",\"1800\"],0,1],[\"(\\\\d{3})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"140\"],0,1],[\"(\\\\d{2})(\\\\d{4})(\\\\d{4})\",\"$1 $2 $3\",[\"11|2[02]|33|4[04]|79[1-7]|80[2-46]\",\"11|2[02]|33|4[04]|79(?:[1-6]|7[19])|80(?:[2-4]|6[0-589])\",\"11|2[02]|33|4[04]|79(?:[124-6]|3(?:[02-9]|1[0-24-9])|7(?:1|9[1-6]))|80(?:[2-4]|6[0-589])\"],\"0$1\",1],[\"(\\\\d{3})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"1(?:2[0-249]|3[0-25]|4[145]|[68]|7[1257])|2(?:1[257]|3[013]|4[01]|5[0137]|6[0158]|78|8[1568])|3(?:26|4[1-3]|5[34]|6[01489]|7[02-46]|8[159])|4(?:1[36]|2[1-47]|5[12]|6[0-26-9]|7[0-24-9]|8[013-57]|9[014-7])|5(?:1[025]|22|[36][25]|4[28]|5[12]|[78]1)|6(?:12|[2-4]1|5[17]|6[13]|80)|7(?:12|3[134]|4[47]|61|88)|8(?:16|2[014]|3[126]|6[136]|7[078]|8[34]|91)|(?:43|59|75)[15]|(?:1[59]|29|67|72)[14]\",\"1(?:2[0-24]|3[0-25]|4[145]|[59][14]|6[1-9]|7[1257]|8[1-57-9])|2(?:1[257]|3[013]|4[01]|5[0137]|6[058]|78|8[1568]|9[14])|3(?:26|4[1-3]|5[34]|6[01489]|7[02-46]|8[159])|4(?:1[36]|2[1-47]|3[15]|5[12]|6[0-26-9]|7[0-24-9]|8[013-57]|9[014-7])|5(?:1[025]|22|[36][25]|4[28]|[578]1|9[15])|674|7(?:(?:2[14]|3[34]|5[15])[2-6]|61[346]|88[0-8])|8(?:70[2-6]|84[235-7]|91[3-7])|(?:1(?:29|60|8[06])|261|552|6(?:12|[2-47]1|5[17]|6[13]|80)|7(?:12|31|4[47])|8(?:16|2[014]|3[126]|6[136]|7[78]|83))[2-7]\",\"1(?:2[0-24]|3[0-25]|4[145]|[59][14]|6[1-9]|7[1257]|8[1-57-9])|2(?:1[257]|3[013]|4[01]|5[0137]|6[058]|78|8[1568]|9[14])|3(?:26|4[1-3]|5[34]|6[01489]|7[02-46]|8[159])|4(?:1[36]|2[1-47]|3[15]|5[12]|6[0-26-9]|7[0-24-9]|8[013-57]|9[014-7])|5(?:1[025]|22|[36][25]|4[28]|[578]1|9[15])|6(?:12(?:[2-6]|7[0-8])|74[2-7])|7(?:(?:2[14]|5[15])[2-6]|3171|61[346]|88(?:[2-7]|82))|8(?:70[2-6]|84(?:[2356]|7[19])|91(?:[3-6]|7[19]))|73[134][2-6]|(?:74[47]|8(?:16|2[014]|3[126]|6[136]|7[78]|83))(?:[2-6]|7[19])|(?:1(?:29|60|8[06])|261|552|6(?:[2-4]1|5[17]|6[13]|7(?:1|4[0189])|80)|7(?:12|88[01]))[2-7]\"],\"0$1\",1],[\"(\\\\d{4})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"1(?:[2-479]|5[0235-9])|[2-5]|6(?:1[1358]|2[2457-9]|3[2-5]|4[235-7]|5[2-689]|6[24578]|7[235689]|8[1-6])|7(?:1[013-9]|28|3[129]|4[1-35689]|5[29]|6[02-5]|70)|807\",\"1(?:[2-479]|5[0235-9])|[2-5]|6(?:1[1358]|2(?:[2457]|84|95)|3(?:[2-4]|55)|4[235-7]|5[2-689]|6[24578]|7[235689]|8[1-6])|7(?:1(?:[013-8]|9[6-9])|28[6-8]|3(?:17|2[0-49]|9[2-57])|4(?:1[2-4]|[29][0-7]|3[0-8]|[56]|8[0-24-7])|5(?:2[1-3]|9[0-6])|6(?:0[5689]|2[5-9]|3[02-8]|4|5[0-367])|70[13-7])|807[19]\",\"1(?:[2-479]|5(?:[0236-9]|5[013-9]))|[2-5]|6(?:2(?:84|95)|355|83)|73179|807(?:1|9[1-3])|(?:1552|6(?:1[1358]|2[2457]|3[2-4]|4[235-7]|5[2-689]|6[24578]|7[235689]|8[124-6])\\\\d|7(?:1(?:[013-8]\\\\d|9[6-9])|28[6-8]|3(?:2[0-49]|9[2-57])|4(?:1[2-4]|[29][0-7]|3[0-8]|[56]\\\\d|8[0-24-7])|5(?:2[1-3]|9[0-6])|6(?:0[5689]|2[5-9]|3[02-8]|4\\\\d|5[0-367])|70[13-7]))[2-7]\"],\"0$1\",1],[\"(\\\\d{5})(\\\\d{5})\",\"$1 $2\",[\"[6-9]\"],\"0$1\",1],[\"(\\\\d{4})(\\\\d{2,4})(\\\\d{4})\",\"$1 $2 $3\",[\"1(?:6|8[06])\",\"1(?:6|8[06]0)\"],0,1],[\"(\\\\d{4})(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3 $4\",[\"18\"],0,1]],\"0\",0,0,0,0,0,[0,[\"(?:61279|7(?:887[02-9]|9(?:313|79[07-9]))|8(?:079[04-9]|(?:84|91)7[02-8]))\\\\d{5}|(?:6(?:12|[2-47]1|5[17]|6[13]|80)[0189]|7(?:1(?:2[0189]|9[0-5])|2(?:[14][017-9]|8[0-59])|3(?:2[5-8]|[34][017-9]|9[016-9])|4(?:1[015-9]|[29][89]|39|8[389])|5(?:[15][017-9]|2[04-9]|9[7-9])|6(?:0[0-47]|1[0-257-9]|2[0-4]|3[19]|5[4589])|70[0289]|88[089]|97[02-8])|8(?:0(?:6[67]|7[02-8])|70[017-9]|84[01489]|91[0-289]))\\\\d{6}|(?:7(?:31|4[47])|8(?:16|2[014]|3[126]|6[136]|7[78]|83))(?:[0189]\\\\d|7[02-8])\\\\d{5}|(?:6(?:[09]\\\\d|1[04679]|2[03689]|3[05-9]|4[0489]|50|6[069]|7[07]|8[7-9])|7(?:0\\\\d|2[0235-79]|3[05-8]|40|5[0346-8]|6[6-9]|7[1-9]|8[0-79]|9[089])|8(?:0[01589]|1[0-57-9]|2[235-9]|3[03-57-9]|[45]\\\\d|6[02457-9]|7[1-69]|8[0-25-9]|9[02-9])|9\\\\d\\\\d)\\\\d{7}|(?:6(?:(?:1[1358]|2[2457]|3[2-4]|4[235-7]|5[2-689]|6[24578]|8[124-6])\\\\d|7(?:[235689]\\\\d|4[0189]))|7(?:1(?:[013-8]\\\\d|9[6-9])|28[6-8]|3(?:2[0-49]|9[2-5])|4(?:1[2-4]|[29][0-7]|3[0-8]|[56]\\\\d|8[0-24-7])|5(?:2[1-3]|9[0-6])|6(?:0[5689]|2[5-9]|3[02-8]|4\\\\d|5[0-367])|70[13-7]|881))[0189]\\\\d{5}\",[10]]]],\"IO\":[\"246\",\"00\",\"3\\\\d{6}\",[7],[[\"(\\\\d{3})(\\\\d{4})\",\"$1 $2\",[\"3\"]]],0,0,0,0,0,0,[0,[\"38\\\\d{5}\"]]],\"IQ\":[\"964\",\"00\",\"(?:1|7\\\\d\\\\d)\\\\d{7}|[2-6]\\\\d{7,8}\",[8,9,10],[[\"(\\\\d)(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"1\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{3,4})\",\"$1 $2 $3\",[\"[2-6]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"7\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"7[3-9]\\\\d{8}\",[10]]]],\"IR\":[\"98\",\"00\",\"[1-9]\\\\d{9}|(?:[1-8]\\\\d\\\\d|9)\\\\d{3,4}\",[4,5,6,7,10],[[\"(\\\\d{4,5})\",\"$1\",[\"96\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{4,5})\",\"$1 $2\",[\"(?:1[137]|2[13-68]|3[1458]|4[145]|5[1468]|6[16]|7[1467]|8[13467])[12689]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3,4})\",\"$1 $2 $3\",[\"9\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{4})(\\\\d{4})\",\"$1 $2 $3\",[\"[1-8]\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"9(?:(?:0(?:[0-35]\\\\d|4[4-6])|(?:[13]\\\\d|2[0-3])\\\\d)\\\\d|9(?:[0-46]\\\\d\\\\d|5[15]0|8(?:1\\\\d|88)|9(?:0[0-3]|[19]\\\\d|21|77|8[7-9])))\\\\d{5}\",[10]]]],\"IS\":[\"354\",\"00|1(?:0(?:01|[12]0)|100)\",\"(?:38\\\\d|[4-9])\\\\d{6}\",[7,9],[[\"(\\\\d{3})(\\\\d{4})\",\"$1 $2\",[\"[4-9]\"]],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"3\"]]],0,0,0,0,0,0,[0,[\"(?:38[589]\\\\d\\\\d|6(?:1[1-8]|2[0-6]|3[026-9]|4[014679]|5[0159]|6[0-69]|70|8[06-8]|9\\\\d)|7(?:5[057]|[6-9]\\\\d)|8(?:2[0-59]|[3-69]\\\\d|8[238]))\\\\d{4}\"]],\"00\"],\"IT\":[\"39\",\"00\",\"0\\\\d{5,10}|1\\\\d{8,10}|3(?:[0-8]\\\\d{7,10}|9\\\\d{7,8})|(?:55|70)\\\\d{8}|8\\\\d{5}(?:\\\\d{2,4})?\",[6,7,8,9,10,11],[[\"(\\\\d{2})(\\\\d{4,6})\",\"$1 $2\",[\"0[26]\"]],[\"(\\\\d{3})(\\\\d{3,6})\",\"$1 $2\",[\"0[13-57-9][0159]|8(?:03|4[17]|9[2-5])\",\"0[13-57-9][0159]|8(?:03|4[17]|9(?:2|3[04]|[45][0-4]))\"]],[\"(\\\\d{4})(\\\\d{2,6})\",\"$1 $2\",[\"0(?:[13-579][2-46-8]|8[236-8])\"]],[\"(\\\\d{4})(\\\\d{4})\",\"$1 $2\",[\"894\"]],[\"(\\\\d{2})(\\\\d{3,4})(\\\\d{4})\",\"$1 $2 $3\",[\"0[26]|5\"]],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3,4})\",\"$1 $2 $3\",[\"1(?:44|[679])|[378]\"]],[\"(\\\\d{3})(\\\\d{3,4})(\\\\d{4})\",\"$1 $2 $3\",[\"0[13-57-9][0159]|14\"]],[\"(\\\\d{2})(\\\\d{4})(\\\\d{5})\",\"$1 $2 $3\",[\"0[26]\"]],[\"(\\\\d{4})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"0\"]],[\"(\\\\d{3})(\\\\d{4})(\\\\d{4,5})\",\"$1 $2 $3\",[\"3\"]]],0,0,0,0,0,0,[0,[\"3[1-9]\\\\d{8}|3[2-9]\\\\d{7}\",[9,10]]]],\"JE\":[\"44\",\"00\",\"1534\\\\d{6}|(?:[3578]\\\\d|90)\\\\d{8}\",[10],0,\"0\",0,\"0|([0-24-8]\\\\d{5})$\",\"1534$1\",0,0,[0,[\"7(?:(?:(?:50|82)9|937)\\\\d|7(?:00[378]|97[7-9]))\\\\d{5}\"]]],\"JM\":[\"1\",\"011\",\"(?:[58]\\\\d\\\\d|658|900)\\\\d{7}\",[10],0,\"1\",0,0,0,0,\"658|876\",[0,[\"(?:658295|876(?:2(?:0[1-9]|[13-9]\\\\d|2[013-9])|[348]\\\\d\\\\d|5(?:0[1-9]|[1-9]\\\\d)|6(?:4[89]|6[67])|7(?:0[07]|7\\\\d|8[1-47-9]|9[0-36-9])|9(?:[01]9|9[0579])))\\\\d{4}\"]]],\"JO\":[\"962\",\"00\",\"(?:(?:[2689]|7\\\\d)\\\\d|32|53)\\\\d{6}\",[8,9],[[\"(\\\\d)(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"[2356]|87\"],\"(0$1)\"],[\"(\\\\d{3})(\\\\d{5,6})\",\"$1 $2\",[\"[89]\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{7})\",\"$1 $2\",[\"70\"],\"0$1\"],[\"(\\\\d)(\\\\d{4})(\\\\d{4})\",\"$1 $2 $3\",[\"7\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"7(?:[78][0-25-9]|9\\\\d)\\\\d{6}\",[9]]]],\"JP\":[\"81\",\"010\",\"00[1-9]\\\\d{6,14}|[257-9]\\\\d{9}|(?:00|[1-9]\\\\d\\\\d)\\\\d{6}\",[8,9,10,11,12,13,14,15,16,17],[[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1-$2-$3\",[\"(?:12|57|99)0\"],\"0$1\"],[\"(\\\\d{4})(\\\\d)(\\\\d{4})\",\"$1-$2-$3\",[\"1(?:26|3[79]|4[56]|5[4-68]|6[3-5])|499|5(?:76|97)|746|8(?:3[89]|47|51|63)|9(?:80|9[16])\",\"1(?:267|3(?:7[247]|9[278])|466|5(?:47|58|64)|6(?:3[245]|48|5[4-68]))|499[2468]|5(?:76|97)9|7468|8(?:3(?:8[7-9]|96)|477|51[2-9]|636)|9(?:802|9(?:1[23]|69))|1(?:45|58)[67]\",\"1(?:267|3(?:7[247]|9[278])|466|5(?:47|58|64)|6(?:3[245]|48|5[4-68]))|499[2468]|5(?:769|979[2-69])|7468|8(?:3(?:8[7-9]|96[2457-9])|477|51[2-9]|636[457-9])|9(?:802|9(?:1[23]|69))|1(?:45|58)[67]\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{4})\",\"$1-$2-$3\",[\"60\"],\"0$1\"],[\"(\\\\d)(\\\\d{4})(\\\\d{4})\",\"$1-$2-$3\",[\"[36]|4(?:2[09]|7[01])\",\"[36]|4(?:2(?:0|9[02-69])|7(?:0[019]|1))\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{4})\",\"$1-$2-$3\",[\"1(?:1|5[45]|77|88|9[69])|2(?:2[1-37]|3[0-269]|4[59]|5|6[24]|7[1-358]|8[1369]|9[0-38])|4(?:[28][1-9]|3[0-57]|[45]|6[248]|7[2-579]|9[29])|5(?:2|3[045]|4[0-369]|5[29]|8[02389]|9[0-389])|7(?:2[02-46-9]|34|[58]|6[0249]|7[57]|9[2-6])|8(?:2[124589]|3[27-9]|49|51|6|7[0-468]|8[68]|9[019])|9(?:[23][1-9]|4[15]|5[138]|6[1-3]|7[156]|8[189]|9[1-489])\",\"1(?:1|5(?:4[018]|5[017])|77|88|9[69])|2(?:2(?:[127]|3[014-9])|3[0-269]|4[59]|5(?:[1-3]|5[0-69]|9[19])|62|7(?:[1-35]|8[0189])|8(?:[16]|3[0134]|9[0-5])|9(?:[028]|17))|4(?:2(?:[13-79]|8[014-6])|3[0-57]|[45]|6[248]|7[2-47]|8[1-9])|5(?:2|3[045]|4[0-369]|8[02389]|9[0-3])|7(?:2[02-46-9]|34|[58]|6[0249]|7[57]|9(?:[23]|4[0-59]|5[01569]|6[0167]))|8(?:2(?:[1258]|4[0-39]|9[0-2469])|49|51|6(?:[0-24]|36|5[0-3589]|72|9[01459])|7[0-468]|8[68])|9(?:[23][1-9]|4[15]|5[138]|6[1-3]|7[156]|8[189]|9(?:[1289]|3[34]|4[0178]))|(?:49|55|83)[29]|(?:264|837)[016-9]|2(?:57|93)[015-9]|(?:25[0468]|422|838)[01]|(?:47[59]|59[89]|8(?:6[68]|9))[019]\",\"1(?:1|5(?:4[018]|5[017])|77|88|9[69])|2(?:2[127]|3[0-269]|4[59]|5(?:[1-3]|5[0-69]|9(?:17|99))|6(?:2|4[016-9])|7(?:[1-35]|8[0189])|8(?:[16]|3[0134]|9[0-5])|9(?:[028]|17))|4(?:2(?:[13-79]|8[014-6])|3[0-57]|[45]|6[248]|7[2-47]|9[29])|5(?:2|3[045]|4[0-369]|5[29]|8[02389]|9[0-3])|7(?:2[02-46-9]|34|[58]|6[0249]|7[57]|9(?:[23]|4[0-59]|5[01569]|6[0167]))|8(?:2(?:[1258]|4[0-39]|9[0169])|3(?:[29]|7(?:[017-9]|6[6-8]))|49|51|6(?:[0-24]|36[23]|5(?:[0-389]|5[23])|6(?:[01]|9[178])|72|9[0145])|7[0-468]|8[68])|9(?:4[15]|5[138]|7[156]|8[189]|9(?:[1289]|3(?:31|4[357])|4[0178]))|(?:8294|96)[1-3]|2(?:57|93)[015-9]|(?:223|8699)[014-9]|(?:25[0468]|422|838)[01]|(?:48|8292|9[23])[1-9]|(?:47[59]|59[89]|8(?:68|9))[019]\",\"1(?:1|5(?:4[018]|5[017])|77|88|9[69])|2(?:2[127]|3[0-269]|4[59]|5(?:[1-3]|5[0-69]|7[015-9]|9(?:17|99))|6(?:2|4[016-9])|7(?:[1-35]|8[0189])|8(?:[16]|3[0134]|9[0-5])|9(?:[028]|17|3[015-9]))|4(?:2(?:[13-79]|8[014-6])|3[0-57]|[45]|6[248]|7[2-47]|9[29])|5(?:2|3[045]|4[0-369]|5[29]|8[02389]|9[0-3])|7(?:2[02-46-9]|34|[58]|6[0249]|7[57]|9(?:[23]|4[0-59]|5[01569]|6[0167]))|8(?:2(?:[1258]|4[0-39]|9(?:[019]|4[1-3]|6(?:[0-47-9]|5[01346-9])))|3(?:[29]|7(?:[017-9]|6[6-8]))|49|51|6(?:[0-24]|36[23]|5(?:[0-389]|5[23])|6(?:[01]|9[178])|72|9[0145])|7[0-468]|8[68])|9(?:4[15]|5[138]|6[1-3]|7[156]|8[189]|9(?:[1289]|3(?:31|4[357])|4[0178]))|(?:223|8699)[014-9]|(?:25[0468]|422|838)[01]|(?:48|829(?:2|66)|9[23])[1-9]|(?:47[59]|59[89]|8(?:68|9))[019]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{2})(\\\\d{4})\",\"$1-$2-$3\",[\"[14]|[289][2-9]|5[3-9]|7[2-4679]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{4})\",\"$1-$2-$3\",[\"800\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{4})(\\\\d{4})\",\"$1-$2-$3\",[\"[257-9]\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"[7-9]0[1-9]\\\\d{7}\",[10]]]],\"KE\":[\"254\",\"000\",\"(?:[17]\\\\d\\\\d|900)\\\\d{6}|(?:2|80)0\\\\d{6,7}|[4-6]\\\\d{6,8}\",[7,8,9,10],[[\"(\\\\d{2})(\\\\d{5,7})\",\"$1 $2\",[\"[24-6]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{6})\",\"$1 $2\",[\"[17]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3,4})\",\"$1 $2 $3\",[\"[89]\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"(?:1(?:0[0-6]|1[0-5]|2[014]|30)|7\\\\d\\\\d)\\\\d{6}\",[9]]]],\"KG\":[\"996\",\"00\",\"8\\\\d{9}|(?:[235-8]\\\\d|99)\\\\d{7}\",[9,10],[[\"(\\\\d{4})(\\\\d{5})\",\"$1 $2\",[\"3(?:1[346]|[24-79])\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"[235-79]|88\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d)(\\\\d{2,3})\",\"$1 $2 $3 $4\",[\"8\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"312(?:58\\\\d|973)\\\\d{3}|(?:2(?:0[0-35]|2\\\\d)|5[0-24-7]\\\\d|600|7(?:[07]\\\\d|55)|88[08]|99[05-9])\\\\d{6}\",[9]]]],\"KH\":[\"855\",\"00[14-9]\",\"1\\\\d{9}|[1-9]\\\\d{7,8}\",[8,9,10],[[\"(\\\\d{2})(\\\\d{3})(\\\\d{3,4})\",\"$1 $2 $3\",[\"[1-9]\"],\"0$1\"],[\"(\\\\d{4})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"1\"]]],\"0\",0,0,0,0,0,[0,[\"(?:(?:1[28]|3[18]|9[67])\\\\d|6[016-9]|7(?:[07-9]|[16]\\\\d)|8(?:[013-79]|8\\\\d))\\\\d{6}|(?:1\\\\d|9[0-57-9])\\\\d{6}|(?:2[3-6]|3[2-6]|4[2-4]|[5-7][2-5])48\\\\d{5}\",[8,9]]]],\"KI\":[\"686\",\"00\",\"(?:[37]\\\\d|6[0-79])\\\\d{6}|(?:[2-48]\\\\d|50)\\\\d{3}\",[5,8],0,\"0\",0,0,0,0,0,[0,[\"(?:63\\\\d{3}|73(?:0[0-5]\\\\d|140))\\\\d{3}|[67]200[01]\\\\d{3}\",[8]]]],\"KM\":[\"269\",\"00\",\"[3478]\\\\d{6}\",[7],[[\"(\\\\d{3})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3\",[\"[3478]\"]]],0,0,0,0,0,0,[0,[\"[34]\\\\d{6}\"]]],\"KN\":[\"1\",\"011\",\"(?:[58]\\\\d\\\\d|900)\\\\d{7}\",[10],0,\"1\",0,\"1|([2-7]\\\\d{6})$\",\"869$1\",0,\"869\",[0,[\"869(?:48[89]|55[6-8]|66\\\\d|76[02-7])\\\\d{4}\"]]],\"KP\":[\"850\",\"00|99\",\"85\\\\d{6}|(?:19\\\\d|[2-7])\\\\d{7}\",[8,10],[[\"(\\\\d{2})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"8\"],\"0$1\"],[\"(\\\\d)(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"[2-7]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"1\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"19[1-3]\\\\d{7}\",[10]]]],\"KR\":[\"82\",\"00(?:[125689]|3(?:[46]5|91)|7(?:00|27|3|55|6[126]))\",\"00[1-9]\\\\d{8,11}|(?:[12]|5\\\\d{3})\\\\d{7}|[13-6]\\\\d{9}|(?:[1-6]\\\\d|80)\\\\d{7}|[3-6]\\\\d{4,5}|(?:00|7)0\\\\d{8}\",[5,6,8,9,10,11,12,13,14],[[\"(\\\\d{2})(\\\\d{3,4})\",\"$1-$2\",[\"(?:3[1-3]|[46][1-4]|5[1-5])1\"],\"0$1\"],[\"(\\\\d{4})(\\\\d{4})\",\"$1-$2\",[\"1\"]],[\"(\\\\d)(\\\\d{3,4})(\\\\d{4})\",\"$1-$2-$3\",[\"2\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{4})\",\"$1-$2-$3\",[\"60|8\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3,4})(\\\\d{4})\",\"$1-$2-$3\",[\"[1346]|5[1-5]\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{4})(\\\\d{4})\",\"$1-$2-$3\",[\"[57]\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{5})(\\\\d{4})\",\"$1-$2-$3\",[\"5\"],\"0$1\"]],\"0\",0,\"0(8(?:[1-46-8]|5\\\\d\\\\d))?\",0,0,0,[0,[\"1(?:05(?:[0-8]\\\\d|9[0-6])|22[13]\\\\d)\\\\d{4,5}|1(?:0[1-46-9]|[16-9]\\\\d|2[013-9])\\\\d{6,7}\",[9,10]]]],\"KW\":[\"965\",\"00\",\"18\\\\d{5}|(?:[2569]\\\\d|41)\\\\d{6}\",[7,8],[[\"(\\\\d{4})(\\\\d{3,4})\",\"$1 $2\",[\"[169]|2(?:[235]|4[1-35-9])|52\"]],[\"(\\\\d{3})(\\\\d{5})\",\"$1 $2\",[\"[245]\"]]],0,0,0,0,0,0,[0,[\"(?:41\\\\d\\\\d|5(?:(?:[05]\\\\d|1[0-7]|6[56])\\\\d|2(?:22|5[25])|7(?:55|77)|88[58])|6(?:(?:0[034679]|5[015-9]|6\\\\d)\\\\d|1(?:00|11|66)|222|3[36]3|444|7(?:0[013-9]|[67]\\\\d)|888|9(?:[069]\\\\d|3[039]))|9(?:(?:0[09]|22|[4679]\\\\d|8[057-9])\\\\d|1(?:1[01]|99)|3(?:00|33)|5(?:00|5\\\\d)))\\\\d{4}\",[8]]]],\"KY\":[\"1\",\"011\",\"(?:345|[58]\\\\d\\\\d|900)\\\\d{7}\",[10],0,\"1\",0,\"1|([2-9]\\\\d{6})$\",\"345$1\",0,\"345\",[0,[\"345(?:32[1-9]|42[0-4]|5(?:1[67]|2[5-79]|4[6-9]|50|76)|649|82[56]|9(?:1[679]|2[2-9]|3[06-9]|90))\\\\d{4}\"]]],\"KZ\":[\"7\",\"810\",\"(?:33622|8\\\\d{8})\\\\d{5}|[78]\\\\d{9}\",[10,14],0,\"8\",0,0,0,0,\"33|7\",[0,[\"7(?:0[0-25-8]|47|6[0-4]|7[15-8]|85)\\\\d{7}\",[10]]],\"8~10\"],\"LA\":[\"856\",\"00\",\"[23]\\\\d{9}|3\\\\d{8}|(?:[235-8]\\\\d|41)\\\\d{6}\",[8,9,10],[[\"(\\\\d{2})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"2[13]|3[14]|[4-8]\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{2})(\\\\d{2})(\\\\d{3})\",\"$1 $2 $3 $4\",[\"30[013-9]\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{2})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3 $4\",[\"[23]\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"(?:20(?:[239]\\\\d|5[24-9]|7[6-8]|88)|302\\\\d)\\\\d{6}\",[10]]]],\"LB\":[\"961\",\"00\",\"[27-9]\\\\d{7}|[13-9]\\\\d{6}\",[7,8],[[\"(\\\\d)(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"[13-69]|7(?:[2-57]|62|8[0-7]|9[04-9])|8[02-9]\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"[27-9]\"]]],\"0\",0,0,0,0,0,[0,[\"793(?:[01]\\\\d|2[0-4])\\\\d{3}|(?:(?:3|81)\\\\d|7(?:[01]\\\\d|6[013-9]|8[89]|9[12]))\\\\d{5}\"]]],\"LC\":[\"1\",\"011\",\"(?:[58]\\\\d\\\\d|758|900)\\\\d{7}\",[10],0,\"1\",0,\"1|([2-8]\\\\d{6})$\",\"758$1\",0,\"758\",[0,[\"758(?:28[4-7]|384|4(?:6[01]|8[4-9])|5(?:1[89]|20|84)|7(?:1[2-9]|2\\\\d|3[0-3])|812)\\\\d{4}\"]]],\"LI\":[\"423\",\"00\",\"[68]\\\\d{8}|(?:[2378]\\\\d|90)\\\\d{5}\",[7,9],[[\"(\\\\d{3})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3\",[\"[2379]|8(?:0[09]|7)\",\"[2379]|8(?:0(?:02|9)|7)\"]],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"8\"]],[\"(\\\\d{2})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"69\"]],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"6\"]]],\"0\",0,\"0|(1001)\",0,0,0,[0,[\"(?:6(?:(?:4[5-9]|5[0-4])\\\\d|6(?:[0245]\\\\d|[17]0|3[7-9]))\\\\d|7(?:[37-9]\\\\d|42|56))\\\\d{4}\"]]],\"LK\":[\"94\",\"00\",\"[1-9]\\\\d{8}\",[9],[[\"(\\\\d{2})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"7\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"[1-689]\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"7(?:[0-25-8]\\\\d|4[0-4])\\\\d{6}\"]]],\"LR\":[\"231\",\"00\",\"(?:[25]\\\\d|33|77|88)\\\\d{7}|(?:2\\\\d|[4-6])\\\\d{6}\",[7,8,9],[[\"(\\\\d)(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"[4-6]\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"2\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"[23578]\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"(?:(?:(?:22|33)0|555|(?:77|88)\\\\d)\\\\d|4[67])\\\\d{5}|[56]\\\\d{6}\",[7,9]]]],\"LS\":[\"266\",\"00\",\"(?:[256]\\\\d\\\\d|800)\\\\d{5}\",[8],[[\"(\\\\d{4})(\\\\d{4})\",\"$1 $2\",[\"[2568]\"]]],0,0,0,0,0,0,[0,[\"[56]\\\\d{7}\"]]],\"LT\":[\"370\",\"00\",\"(?:[3469]\\\\d|52|[78]0)\\\\d{6}\",[8],[[\"(\\\\d)(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"52[0-7]\"],\"(8-$1)\",1],[\"(\\\\d{3})(\\\\d{2})(\\\\d{3})\",\"$1 $2 $3\",[\"[7-9]\"],\"8 $1\",1],[\"(\\\\d{2})(\\\\d{6})\",\"$1 $2\",[\"37|4(?:[15]|6[1-8])\"],\"(8-$1)\",1],[\"(\\\\d{3})(\\\\d{5})\",\"$1 $2\",[\"[3-6]\"],\"(8-$1)\",1]],\"8\",0,\"[08]\",0,0,0,[0,[\"6\\\\d{7}\"]]],\"LU\":[\"352\",\"00\",\"35[013-9]\\\\d{4,8}|6\\\\d{8}|35\\\\d{2,4}|(?:[2457-9]\\\\d|3[0-46-9])\\\\d{2,9}\",[4,5,6,7,8,9,10,11],[[\"(\\\\d{2})(\\\\d{3})\",\"$1 $2\",[\"2(?:0[2-689]|[2-9])|[3-57]|8(?:0[2-9]|[13-9])|9(?:0[89]|[2-579])\"]],[\"(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3\",[\"2(?:0[2-689]|[2-9])|[3-57]|8(?:0[2-9]|[13-9])|9(?:0[89]|[2-579])\"]],[\"(\\\\d{2})(\\\\d{2})(\\\\d{3})\",\"$1 $2 $3\",[\"20[2-689]\"]],[\"(\\\\d{2})(\\\\d{2})(\\\\d{2})(\\\\d{1,2})\",\"$1 $2 $3 $4\",[\"2(?:[0367]|4[3-8])\"]],[\"(\\\\d{3})(\\\\d{2})(\\\\d{3})\",\"$1 $2 $3\",[\"80[01]|90[015]\"]],[\"(\\\\d{2})(\\\\d{2})(\\\\d{2})(\\\\d{3})\",\"$1 $2 $3 $4\",[\"20\"]],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"6\"]],[\"(\\\\d{2})(\\\\d{2})(\\\\d{2})(\\\\d{2})(\\\\d{1,2})\",\"$1 $2 $3 $4 $5\",[\"2(?:[0367]|4[3-8])\"]],[\"(\\\\d{2})(\\\\d{2})(\\\\d{2})(\\\\d{1,5})\",\"$1 $2 $3 $4\",[\"[3-57]|8[13-9]|9(?:0[89]|[2-579])|(?:2|80)[2-9]\"]]],0,0,\"(15(?:0[06]|1[12]|[35]5|4[04]|6[26]|77|88|99)\\\\d)\",0,0,0,[0,[\"6(?:[269][18]|5[1568]|7[189]|81)\\\\d{6}\",[9]]]],\"LV\":[\"371\",\"00\",\"(?:[268]\\\\d|90)\\\\d{6}\",[8],[[\"(\\\\d{2})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"[269]|8[01]\"]]],0,0,0,0,0,0,[0,[\"23(?:23[0-57-9]|33[0238])\\\\d{3}|2(?:[0-24-9]\\\\d\\\\d|3(?:0[07]|[14-9]\\\\d|2[024-9]|3[0-24-9]))\\\\d{4}\"]]],\"LY\":[\"218\",\"00\",\"[2-9]\\\\d{8}\",[9],[[\"(\\\\d{2})(\\\\d{7})\",\"$1-$2\",[\"[2-9]\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"9[1-6]\\\\d{7}\"]]],\"MA\":[\"212\",\"00\",\"[5-8]\\\\d{8}\",[9],[[\"(\\\\d{5})(\\\\d{4})\",\"$1-$2\",[\"5(?:29|38)\",\"5(?:29[1289]|389)\",\"529(?:1[1-46-9]|2[013-8]|90)|5(?:298|389)[0-46-9]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"5[45]\"],\"0$1\"],[\"(\\\\d{4})(\\\\d{5})\",\"$1-$2\",[\"5(?:2[2-489]|3[5-9]|9)|892\",\"5(?:2(?:[2-49]|8[235-9])|3[5-9]|9)|892\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{7})\",\"$1-$2\",[\"8\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{6})\",\"$1-$2\",[\"[5-7]\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"(?:6(?:[0-79]\\\\d|8[0-247-9])|7(?:[017]\\\\d|2[0-2]|6[0-8]|8[0-3]))\\\\d{6}\"]]],\"MC\":[\"377\",\"00\",\"(?:[3489]|6\\\\d)\\\\d{7}\",[8,9],[[\"(\\\\d{2})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"4\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"[389]\"]],[\"(\\\\d)(\\\\d{2})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4 $5\",[\"6\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"4(?:[46]\\\\d|5[1-9])\\\\d{5}|(?:3|6\\\\d)\\\\d{7}\"]]],\"MD\":[\"373\",\"00\",\"(?:[235-7]\\\\d|[89]0)\\\\d{6}\",[8],[[\"(\\\\d{3})(\\\\d{5})\",\"$1 $2\",[\"[89]\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"22|3\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{2})(\\\\d{3})\",\"$1 $2 $3\",[\"[25-7]\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"562\\\\d{5}|(?:6\\\\d|7[16-9])\\\\d{6}\"]]],\"ME\":[\"382\",\"00\",\"(?:20|[3-79]\\\\d)\\\\d{6}|80\\\\d{6,7}\",[8,9],[[\"(\\\\d{2})(\\\\d{3})(\\\\d{3,4})\",\"$1 $2 $3\",[\"[2-9]\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"6(?:[07-9]\\\\d|3[024]|6[0-25])\\\\d{5}\",[8]]]],\"MF\":[\"590\",\"00\",\"(?:590|(?:69|80)\\\\d|976)\\\\d{6}\",[9],0,\"0\",0,0,0,0,0,[0,[\"69(?:0\\\\d\\\\d|1(?:2[2-9]|3[0-5]))\\\\d{4}\"]]],\"MG\":[\"261\",\"00\",\"[23]\\\\d{8}\",[9],[[\"(\\\\d{2})(\\\\d{2})(\\\\d{3})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"[23]\"],\"0$1\"]],\"0\",0,\"0|([24-9]\\\\d{6})$\",\"20$1\",0,0,[0,[\"3[2-47-9]\\\\d{7}\"]]],\"MH\":[\"692\",\"011\",\"329\\\\d{4}|(?:[256]\\\\d|45)\\\\d{5}\",[7],[[\"(\\\\d{3})(\\\\d{4})\",\"$1-$2\",[\"[2-6]\"]]],\"1\",0,0,0,0,0,[0,[\"(?:(?:23|54)5|329|45[356])\\\\d{4}\"]]],\"MK\":[\"389\",\"00\",\"[2-578]\\\\d{7}\",[8],[[\"(\\\\d)(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"2|34[47]|4(?:[37]7|5[47]|64)\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"[347]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d)(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"[58]\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"7(?:3555|(?:474|9[019]7)7)\\\\d{3}|7(?:[0-25-8]\\\\d\\\\d|3(?:[1-48]\\\\d|7[01578])|4(?:2\\\\d|60|7[01578])|9(?:[2-4]\\\\d|7[015]))\\\\d{4}\"]]],\"ML\":[\"223\",\"00\",\"[24-9]\\\\d{7}\",[8],[[\"(\\\\d{2})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"[24-9]\"]]],0,0,0,0,0,0,[0,[\"2(?:0(?:01|79)|17\\\\d)\\\\d{4}|(?:5[01]|[679]\\\\d|8[2-49])\\\\d{6}\"]]],\"MM\":[\"95\",\"00\",\"1\\\\d{5,7}|95\\\\d{6}|(?:[4-7]|9[0-46-9])\\\\d{6,8}|(?:2|8\\\\d)\\\\d{5,8}\",[6,7,8,9,10],[[\"(\\\\d)(\\\\d{2})(\\\\d{3})\",\"$1 $2 $3\",[\"16|2\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{2})(\\\\d{3})\",\"$1 $2 $3\",[\"[45]|6(?:0[23]|[1-689]|7[235-7])|7(?:[0-4]|5[2-7])|8[1-6]\"],\"0$1\"],[\"(\\\\d)(\\\\d{3})(\\\\d{3,4})\",\"$1 $2 $3\",[\"[12]\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{3,4})\",\"$1 $2 $3\",[\"[4-7]|8[1-35]\"],\"0$1\"],[\"(\\\\d)(\\\\d{3})(\\\\d{4,6})\",\"$1 $2 $3\",[\"9(?:2[0-4]|[35-9]|4[137-9])\"],\"0$1\"],[\"(\\\\d)(\\\\d{4})(\\\\d{4})\",\"$1 $2 $3\",[\"2\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"8\"],\"0$1\"],[\"(\\\\d)(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3 $4\",[\"92\"],\"0$1\"],[\"(\\\\d)(\\\\d{5})(\\\\d{4})\",\"$1 $2 $3\",[\"9\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"(?:17[01]|9(?:2(?:[0-4]|[56]\\\\d\\\\d)|(?:3(?:[0-36]|4\\\\d)|(?:6\\\\d|9[4-8])\\\\d|7(?:3|40|[5-9]\\\\d)|8(?:78|[89]\\\\d))\\\\d|4(?:(?:[0245]\\\\d|[1379])\\\\d|88)|5[0-6])\\\\d)\\\\d{4}|9[69]1\\\\d{6}|9(?:[68]\\\\d|9[089])\\\\d{5}\",[7,8,9,10]]]],\"MN\":[\"976\",\"001\",\"[12]\\\\d{7,9}|[5-9]\\\\d{7}\",[8,9,10],[[\"(\\\\d{2})(\\\\d{2})(\\\\d{4})\",\"$1 $2 $3\",[\"[12]1\"],\"0$1\"],[\"(\\\\d{4})(\\\\d{4})\",\"$1 $2\",[\"[5-9]\"]],[\"(\\\\d{3})(\\\\d{5,6})\",\"$1 $2\",[\"[12]2[1-3]\"],\"0$1\"],[\"(\\\\d{4})(\\\\d{5,6})\",\"$1 $2\",[\"[12](?:27|3[2-8]|4[2-68]|5[1-4689])\",\"[12](?:27|3[2-8]|4[2-68]|5[1-4689])[0-3]\"],\"0$1\"],[\"(\\\\d{5})(\\\\d{4,5})\",\"$1 $2\",[\"[12]\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"(?:83[01]|920)\\\\d{5}|(?:5[05]|6[06]|8[015689]|9[013-9])\\\\d{6}\",[8]]]],\"MO\":[\"853\",\"00\",\"0800\\\\d{3}|(?:28|[68]\\\\d)\\\\d{6}\",[7,8],[[\"(\\\\d{4})(\\\\d{3})\",\"$1 $2\",[\"0\"]],[\"(\\\\d{4})(\\\\d{4})\",\"$1 $2\",[\"[268]\"]]],0,0,0,0,0,0,[0,[\"6800[0-79]\\\\d{3}|6(?:[235]\\\\d\\\\d|6(?:0[0-5]|[1-9]\\\\d)|8(?:0[1-9]|[14-8]\\\\d|2[5-9]|[39][0-4]))\\\\d{4}\",[8]]]],\"MP\":[\"1\",\"011\",\"[58]\\\\d{9}|(?:67|90)0\\\\d{7}\",[10],0,\"1\",0,\"1|([2-9]\\\\d{6})$\",\"670$1\",0,\"670\",[0,[\"670(?:2(?:3[3-7]|56|8[4-8])|32[1-38]|4(?:33|8[348])|5(?:32|55|88)|6(?:64|70|82)|78[3589]|8[3-9]8|989)\\\\d{4}\"]]],\"MQ\":[\"596\",\"00\",\"(?:69|80)\\\\d{7}|(?:59|97)6\\\\d{6}\",[9],[[\"(\\\\d{3})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"[569]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"8\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"69(?:6(?:[0-46-9]\\\\d|5[0-6])|727)\\\\d{4}\"]]],\"MR\":[\"222\",\"00\",\"(?:[2-4]\\\\d\\\\d|800)\\\\d{5}\",[8],[[\"(\\\\d{2})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"[2-48]\"]]],0,0,0,0,0,0,[0,[\"[2-4][0-46-9]\\\\d{6}\"]]],\"MS\":[\"1\",\"011\",\"(?:[58]\\\\d\\\\d|664|900)\\\\d{7}\",[10],0,\"1\",0,\"1|([34]\\\\d{6})$\",\"664$1\",0,\"664\",[0,[\"664(?:3(?:49|9[1-6])|49[2-6])\\\\d{4}\"]]],\"MT\":[\"356\",\"00\",\"3550\\\\d{4}|(?:[2579]\\\\d\\\\d|800)\\\\d{5}\",[8],[[\"(\\\\d{4})(\\\\d{4})\",\"$1 $2\",[\"[2357-9]\"]]],0,0,0,0,0,0,[0,[\"(?:7(?:210|[79]\\\\d\\\\d)|9(?:[29]\\\\d\\\\d|69[67]|8(?:1[1-3]|89|97)))\\\\d{4}\"]]],\"MU\":[\"230\",\"0(?:0|[24-7]0|3[03])\",\"(?:[57]|8\\\\d\\\\d)\\\\d{7}|[2-468]\\\\d{6}\",[7,8,10],[[\"(\\\\d{3})(\\\\d{4})\",\"$1 $2\",[\"[2-46]|8[013]\"]],[\"(\\\\d{4})(\\\\d{4})\",\"$1 $2\",[\"[57]\"]],[\"(\\\\d{5})(\\\\d{5})\",\"$1 $2\",[\"8\"]]],0,0,0,0,0,0,[0,[\"5(?:4(?:2[1-389]|7[1-9])|87[15-8])\\\\d{4}|(?:5(?:2[5-9]|4[3-689]|[57]\\\\d|8[0-689]|9[0-8])|7(?:01|30))\\\\d{5}\",[8]]],\"020\"],\"MV\":[\"960\",\"0(?:0|19)\",\"(?:800|9[0-57-9]\\\\d)\\\\d{7}|[34679]\\\\d{6}\",[7,10],[[\"(\\\\d{3})(\\\\d{4})\",\"$1-$2\",[\"[3467]|9[1-9]\"]],[\"(\\\\d{3})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"[89]\"]]],0,0,0,0,0,0,[0,[\"46[46]\\\\d{4}|(?:7\\\\d|9[1-9])\\\\d{5}\",[7]]],\"00\"],\"MW\":[\"265\",\"00\",\"(?:[1289]\\\\d|31|77)\\\\d{7}|1\\\\d{6}\",[7,9],[[\"(\\\\d)(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"1[2-9]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"2\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"[137-9]\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"111\\\\d{6}|(?:31|77|[89][89])\\\\d{7}\",[9]]]],\"MX\":[\"52\",\"0[09]\",\"1(?:(?:[27]2|44|99)[1-9]|65[0-689])\\\\d{7}|(?:1(?:[01]\\\\d|2[13-9]|[35][1-9]|4[0-35-9]|6[0-46-9]|7[013-9]|8[1-79]|9[1-8])|[2-9]\\\\d)\\\\d{8}\",[10,11],[[\"(\\\\d{2})(\\\\d{4})(\\\\d{4})\",\"$1 $2 $3\",[\"33|5[56]|81\"],0,1],[\"(\\\\d{3})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"[2-9]\"],0,1],[\"(\\\\d)(\\\\d{2})(\\\\d{4})(\\\\d{4})\",\"$2 $3 $4\",[\"1(?:33|5[56]|81)\"],0,1],[\"(\\\\d)(\\\\d{3})(\\\\d{3})(\\\\d{4})\",\"$2 $3 $4\",[\"1\"],0,1]],\"01\",0,\"0(?:[12]|4[45])|1\",0,0,0,[0,[\"657[12]\\\\d{6}|(?:1(?:2(?:2[1-9]|3[1-35-8]|4[13-9]|7[1-689]|8[1-578]|9[467])|3(?:1[1-79]|[2458][1-9]|3\\\\d|7[1-8]|9[1-5])|4(?:1[1-57-9]|[24-7][1-9]|3[1-8]|8[1-35-9]|9[2-689])|5(?:[56]\\\\d|88|9[1-79])|6(?:1[2-68]|[2-4][1-9]|5[1-3689]|6[1-57-9]|7[1-7]|8[67]|9[4-8])|7(?:[1-467][1-9]|5[13-9]|8[1-69]|9[17])|8(?:1\\\\d|2[13-689]|3[1-6]|4[124-6]|6[1246-9]|7[1-378]|9[12479])|9(?:1[346-9]|2[1-4]|3[2-46-8]|5[1348]|[69][1-9]|7[12]|8[1-8]))|2(?:2\\\\d|3[1-35-8]|4[13-9]|7[1-689]|8[1-578]|9[467])|3(?:1[1-79]|[2458][1-9]|3\\\\d|7[1-8]|9[1-5])|4(?:1[1-57-9]|[25-7][1-9]|3[1-8]|4\\\\d|8[1-35-9]|9[2-689])|5(?:[56]\\\\d|88|9[1-79])|6(?:1[2-68]|[2-4][1-9]|5[1-3689]|6[1-57-9]|7[1-7]|8[67]|9[4-8])|7(?:[13467][1-9]|2\\\\d|5[13-9]|8[1-69]|9[17])|8(?:1\\\\d|2[13-689]|3[1-6]|4[124-6]|6[1246-9]|7[1-378]|9[12479])|9(?:1[346-9]|2[1-4]|3[2-46-8]|5[1348]|6[1-9]|7[12]|8[1-8]|9\\\\d))\\\\d{7}\"]],\"00\"],\"MY\":[\"60\",\"00\",\"1\\\\d{8,9}|(?:3\\\\d|[4-9])\\\\d{7}\",[8,9,10],[[\"(\\\\d)(\\\\d{3})(\\\\d{4})\",\"$1-$2 $3\",[\"[4-79]\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{3,4})\",\"$1-$2 $3\",[\"1(?:[02469]|[378][1-9]|53)|8\",\"1(?:[02469]|[37][1-9]|53|8(?:[1-46-9]|5[7-9]))|8\"],\"0$1\"],[\"(\\\\d)(\\\\d{4})(\\\\d{4})\",\"$1-$2 $3\",[\"3\"],\"0$1\"],[\"(\\\\d)(\\\\d{3})(\\\\d{2})(\\\\d{4})\",\"$1-$2-$3-$4\",[\"1(?:[367]|80)\"]],[\"(\\\\d{3})(\\\\d{3})(\\\\d{4})\",\"$1-$2 $3\",[\"15\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{4})(\\\\d{4})\",\"$1-$2 $3\",[\"1\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"1(?:1888[689]|4400|8(?:47|8[27])[0-4])\\\\d{4}|1(?:0(?:[23568]\\\\d|4[0-6]|7[016-9]|9[0-8])|1(?:[1-5]\\\\d\\\\d|6(?:0[5-9]|[1-9]\\\\d)|7(?:[0134]\\\\d|2[1-9]|5[0-6]))|(?:[269]\\\\d|[37][1-9]|4[235-9])\\\\d|5(?:31|9\\\\d\\\\d)|8(?:1[23]|[236]\\\\d|4[06]|5(?:46|[7-9])|7[016-9]|8[01]|9[0-8]))\\\\d{5}\",[9,10]]]],\"MZ\":[\"258\",\"00\",\"(?:2|8\\\\d)\\\\d{7}\",[8,9],[[\"(\\\\d{2})(\\\\d{3})(\\\\d{3,4})\",\"$1 $2 $3\",[\"2|8[2-79]\"]],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"8\"]]],0,0,0,0,0,0,[0,[\"8[2-79]\\\\d{7}\",[9]]]],\"NA\":[\"264\",\"00\",\"[68]\\\\d{7,8}\",[8,9],[[\"(\\\\d{2})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"88\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{3,4})\",\"$1 $2 $3\",[\"6\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"87\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"8\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"(?:60|8[1245])\\\\d{7}\",[9]]]],\"NC\":[\"687\",\"00\",\"(?:050|[2-57-9]\\\\d\\\\d)\\\\d{3}\",[6],[[\"(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1.$2.$3\",[\"[02-57-9]\"]]],0,0,0,0,0,0,[0,[\"(?:5[0-4]|[79]\\\\d|8[0-79])\\\\d{4}\"]]],\"NE\":[\"227\",\"00\",\"[027-9]\\\\d{7}\",[8],[[\"(\\\\d{2})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"08\"]],[\"(\\\\d{2})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"[089]|2[013]|7[04]\"]]],0,0,0,0,0,0,[0,[\"(?:23|7[04]|[89]\\\\d)\\\\d{6}\"]]],\"NF\":[\"672\",\"00\",\"[13]\\\\d{5}\",[6],[[\"(\\\\d{2})(\\\\d{4})\",\"$1 $2\",[\"1[0-3]\"]],[\"(\\\\d)(\\\\d{5})\",\"$1 $2\",[\"[13]\"]]],0,0,\"([0-258]\\\\d{4})$\",\"3$1\",0,0,[0,[\"(?:14|3[58])\\\\d{4}\"]]],\"NG\":[\"234\",\"009\",\"(?:[124-7]|9\\\\d{3})\\\\d{6}|[1-9]\\\\d{7}|[78]\\\\d{9,13}\",[7,8,10,11,12,13,14],[[\"(\\\\d{2})(\\\\d{2})(\\\\d{3})\",\"$1 $2 $3\",[\"78\"],\"0$1\"],[\"(\\\\d)(\\\\d{3})(\\\\d{3,4})\",\"$1 $2 $3\",[\"[12]|9(?:0[3-9]|[1-9])\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{2,3})\",\"$1 $2 $3\",[\"[3-7]|8[2-9]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3,4})\",\"$1 $2 $3\",[\"[7-9]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{4})(\\\\d{4,5})\",\"$1 $2 $3\",[\"[78]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{5})(\\\\d{5,6})\",\"$1 $2 $3\",[\"[78]\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"(?:702[0-24-9]|819[01])\\\\d{6}|(?:70[13-689]|8(?:0[1-9]|1[0-8])|9(?:0[1-9]|1[1-356]))\\\\d{7}\",[10]]]],\"NI\":[\"505\",\"00\",\"(?:1800|[25-8]\\\\d{3})\\\\d{4}\",[8],[[\"(\\\\d{4})(\\\\d{4})\",\"$1 $2\",[\"[125-8]\"]]],0,0,0,0,0,0,[0,[\"(?:5(?:5[0-7]|[78]\\\\d)|6(?:20|3[035]|4[045]|5[05]|77|8[1-9]|9[059])|(?:7[5-8]|8\\\\d)\\\\d)\\\\d{5}\"]]],\"NL\":[\"31\",\"00\",\"(?:[124-7]\\\\d\\\\d|3(?:[02-9]\\\\d|1[0-8]))\\\\d{6}|8\\\\d{6,9}|9\\\\d{6,10}|1\\\\d{4,5}\",[5,6,7,8,9,10,11],[[\"(\\\\d{3})(\\\\d{4,7})\",\"$1 $2\",[\"[89]0\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{7})\",\"$1 $2\",[\"66\"],\"0$1\"],[\"(\\\\d)(\\\\d{8})\",\"$1 $2\",[\"6\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"1[16-8]|2[259]|3[124]|4[17-9]|5[124679]\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"[1-578]|91\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{5})\",\"$1 $2 $3\",[\"9\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"(?:6[1-58]|970\\\\d)\\\\d{7}\",[9,11]]]],\"NO\":[\"47\",\"00\",\"(?:0|[2-9]\\\\d{3})\\\\d{4}\",[5,8],[[\"(\\\\d{3})(\\\\d{2})(\\\\d{3})\",\"$1 $2 $3\",[\"[489]|59\"]],[\"(\\\\d{2})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"[235-7]\"]]],0,0,0,0,0,\"[02-689]|7[0-8]\",[0,[\"(?:4[015-8]|59|9\\\\d)\\\\d{6}\",[8]]]],\"NP\":[\"977\",\"00\",\"(?:1\\\\d|9)\\\\d{9}|[1-9]\\\\d{7}\",[8,10,11],[[\"(\\\\d)(\\\\d{7})\",\"$1-$2\",[\"1[2-6]\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{6})\",\"$1-$2\",[\"1[01]|[2-8]|9(?:[1-59]|[67][2-6])\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{7})\",\"$1-$2\",[\"9\"]]],\"0\",0,0,0,0,0,[0,[\"9(?:6[0-3]|7[024-6]|8[0-24-68])\\\\d{7}\",[10]]]],\"NR\":[\"674\",\"00\",\"(?:444|(?:55|8\\\\d)\\\\d|666)\\\\d{4}\",[7],[[\"(\\\\d{3})(\\\\d{4})\",\"$1 $2\",[\"[4-68]\"]]],0,0,0,0,0,0,[0,[\"(?:55[3-9]|666|8\\\\d\\\\d)\\\\d{4}\"]]],\"NU\":[\"683\",\"00\",\"(?:[47]|888\\\\d)\\\\d{3}\",[4,7],[[\"(\\\\d{3})(\\\\d{4})\",\"$1 $2\",[\"8\"]]],0,0,0,0,0,0,[0,[\"888[4-9]\\\\d{3}\",[7]]]],\"NZ\":[\"64\",\"0(?:0|161)\",\"[29]\\\\d{7,9}|50\\\\d{5}(?:\\\\d{2,3})?|6[0-35-9]\\\\d{6}|7\\\\d{7,8}|8\\\\d{4,9}|(?:11\\\\d|[34])\\\\d{7}\",[5,6,7,8,9,10],[[\"(\\\\d{2})(\\\\d{3,8})\",\"$1 $2\",[\"8[1-579]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{2})(\\\\d{2,3})\",\"$1 $2 $3\",[\"50[036-8]|[89]0\",\"50(?:[0367]|88)|[89]0\"],\"0$1\"],[\"(\\\\d)(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"24|[346]|7[2-57-9]|9[2-9]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3,4})\",\"$1 $2 $3\",[\"2(?:10|74)|[59]|80\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3,4})(\\\\d{4})\",\"$1 $2 $3\",[\"1|2[028]\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{3,5})\",\"$1 $2 $3\",[\"2(?:[169]|7[0-35-9])|7|86\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"2[0-27-9]\\\\d{7,8}|21\\\\d{6}\",[8,9,10]]],\"00\"],\"OM\":[\"968\",\"00\",\"(?:1505|[279]\\\\d{3}|500)\\\\d{4}|800\\\\d{5,6}\",[7,8,9],[[\"(\\\\d{3})(\\\\d{4,6})\",\"$1 $2\",[\"[58]\"]],[\"(\\\\d{2})(\\\\d{6})\",\"$1 $2\",[\"2\"]],[\"(\\\\d{4})(\\\\d{4})\",\"$1 $2\",[\"[179]\"]]],0,0,0,0,0,0,[0,[\"1505\\\\d{4}|(?:7(?:[1289]\\\\d|7[0-5])|9(?:0[1-9]|[1-9]\\\\d))\\\\d{5}\",[8]]]],\"PA\":[\"507\",\"00\",\"(?:00800|8\\\\d{3})\\\\d{6}|[68]\\\\d{7}|[1-57-9]\\\\d{6}\",[7,8,10,11],[[\"(\\\\d{3})(\\\\d{4})\",\"$1-$2\",[\"[1-57-9]\"]],[\"(\\\\d{4})(\\\\d{4})\",\"$1-$2\",[\"[68]\"]],[\"(\\\\d{3})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"8\"]]],0,0,0,0,0,0,[0,[\"(?:1[16]1|21[89]|6\\\\d{3}|8(?:1[01]|7[23]))\\\\d{4}\",[7,8]]]],\"PE\":[\"51\",\"00|19(?:1[124]|77|90)00\",\"(?:[14-8]|9\\\\d)\\\\d{7}\",[8,9],[[\"(\\\\d{3})(\\\\d{5})\",\"$1 $2\",[\"80\"],\"(0$1)\"],[\"(\\\\d)(\\\\d{7})\",\"$1 $2\",[\"1\"],\"(0$1)\"],[\"(\\\\d{2})(\\\\d{6})\",\"$1 $2\",[\"[4-8]\"],\"(0$1)\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"9\"]]],\"0\",0,0,0,0,0,[0,[\"9\\\\d{8}\",[9]]],\"00\",\" Anexo \"],\"PF\":[\"689\",\"00\",\"4\\\\d{5}(?:\\\\d{2})?|8\\\\d{7,8}\",[6,8,9],[[\"(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3\",[\"44\"]],[\"(\\\\d{2})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"4|8[7-9]\"]],[\"(\\\\d{3})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"8\"]]],0,0,0,0,0,0,[0,[\"8[7-9]\\\\d{6}\",[8]]]],\"PG\":[\"675\",\"00|140[1-3]\",\"(?:180|[78]\\\\d{3})\\\\d{4}|(?:[2-589]\\\\d|64)\\\\d{5}\",[7,8],[[\"(\\\\d{3})(\\\\d{4})\",\"$1 $2\",[\"18|[2-69]|85\"]],[\"(\\\\d{4})(\\\\d{4})\",\"$1 $2\",[\"[78]\"]]],0,0,0,0,0,0,[0,[\"(?:7\\\\d|8[128])\\\\d{6}\",[8]]],\"00\"],\"PH\":[\"63\",\"00\",\"(?:[2-7]|9\\\\d)\\\\d{8}|2\\\\d{5}|(?:1800|8)\\\\d{7,9}\",[6,8,9,10,11,12,13],[[\"(\\\\d)(\\\\d{5})\",\"$1 $2\",[\"2\"],\"(0$1)\"],[\"(\\\\d{4})(\\\\d{4,6})\",\"$1 $2\",[\"3(?:23|39|46)|4(?:2[3-6]|[35]9|4[26]|76)|544|88[245]|(?:52|64|86)2\",\"3(?:230|397|461)|4(?:2(?:35|[46]4|51)|396|4(?:22|63)|59[347]|76[15])|5(?:221|446)|642[23]|8(?:622|8(?:[24]2|5[13]))\"],\"(0$1)\"],[\"(\\\\d{5})(\\\\d{4})\",\"$1 $2\",[\"346|4(?:27|9[35])|883\",\"3469|4(?:279|9(?:30|56))|8834\"],\"(0$1)\"],[\"(\\\\d)(\\\\d{4})(\\\\d{4})\",\"$1 $2 $3\",[\"2\"],\"(0$1)\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"[3-7]|8[2-8]\"],\"(0$1)\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"[89]\"],\"0$1\"],[\"(\\\\d{4})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"1\"]],[\"(\\\\d{4})(\\\\d{1,2})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3 $4\",[\"1\"]]],\"0\",0,0,0,0,0,[0,[\"(?:8(?:1[37]|9[5-8])|9(?:0[5-9]|1[0-24-9]|[235-7]\\\\d|4[2-9]|8[135-9]|9[1-9]))\\\\d{7}\",[10]]]],\"PK\":[\"92\",\"00\",\"122\\\\d{6}|[24-8]\\\\d{10,11}|9(?:[013-9]\\\\d{8,10}|2(?:[01]\\\\d\\\\d|2(?:[06-8]\\\\d|1[01]))\\\\d{7})|(?:[2-8]\\\\d{3}|92(?:[0-7]\\\\d|8[1-9]))\\\\d{6}|[24-9]\\\\d{8}|[89]\\\\d{7}\",[8,9,10,11,12],[[\"(\\\\d{3})(\\\\d{3})(\\\\d{2,7})\",\"$1 $2 $3\",[\"[89]0\"],\"0$1\"],[\"(\\\\d{4})(\\\\d{5})\",\"$1 $2\",[\"1\"]],[\"(\\\\d{3})(\\\\d{6,7})\",\"$1 $2\",[\"2(?:3[2358]|4[2-4]|9[2-8])|45[3479]|54[2-467]|60[468]|72[236]|8(?:2[2-689]|3[23578]|4[3478]|5[2356])|9(?:2[2-8]|3[27-9]|4[2-6]|6[3569]|9[25-8])\",\"9(?:2[3-8]|98)|(?:2(?:3[2358]|4[2-4]|9[2-8])|45[3479]|54[2-467]|60[468]|72[236]|8(?:2[2-689]|3[23578]|4[3478]|5[2356])|9(?:22|3[27-9]|4[2-6]|6[3569]|9[25-7]))[2-9]\"],\"(0$1)\"],[\"(\\\\d{2})(\\\\d{7,8})\",\"$1 $2\",[\"(?:2[125]|4[0-246-9]|5[1-35-7]|6[1-8]|7[14]|8[16]|91)[2-9]\"],\"(0$1)\"],[\"(\\\\d{5})(\\\\d{5})\",\"$1 $2\",[\"58\"],\"(0$1)\"],[\"(\\\\d{3})(\\\\d{7})\",\"$1 $2\",[\"3\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3 $4\",[\"2[125]|4[0-246-9]|5[1-35-7]|6[1-8]|7[14]|8[16]|91\"],\"(0$1)\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3 $4\",[\"[24-9]\"],\"(0$1)\"]],\"0\",0,0,0,0,0,[0,[\"3(?:[0-24]\\\\d|3[0-7]|55|64)\\\\d{7}\",[10]]]],\"PL\":[\"48\",\"00\",\"(?:6|8\\\\d\\\\d)\\\\d{7}|[1-9]\\\\d{6}(?:\\\\d{2})?|[26]\\\\d{5}\",[6,7,8,9,10],[[\"(\\\\d{5})\",\"$1\",[\"19\"]],[\"(\\\\d{3})(\\\\d{3})\",\"$1 $2\",[\"11|20|64\"]],[\"(\\\\d{2})(\\\\d{2})(\\\\d{3})\",\"$1 $2 $3\",[\"(?:1[2-8]|2[2-69]|3[2-4]|4[1-468]|5[24-689]|6[1-3578]|7[14-7]|8[1-79]|9[145])1\",\"(?:1[2-8]|2[2-69]|3[2-4]|4[1-468]|5[24-689]|6[1-3578]|7[14-7]|8[1-79]|9[145])19\"]],[\"(\\\\d{3})(\\\\d{2})(\\\\d{2,3})\",\"$1 $2 $3\",[\"64\"]],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"21|39|45|5[0137]|6[0469]|7[02389]|8(?:0[14]|8)\"]],[\"(\\\\d{2})(\\\\d{3})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"1[2-8]|[2-7]|8[1-79]|9[145]\"]],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3,4})\",\"$1 $2 $3\",[\"8\"]]],0,0,0,0,0,0,[0,[\"21(?:1(?:[145]\\\\d|3[1-5])|2[0-4]\\\\d)\\\\d{4}|(?:45|5[0137]|6[069]|7[2389]|88)\\\\d{7}\",[9]]]],\"PM\":[\"508\",\"00\",\"(?:[45]|80\\\\d\\\\d)\\\\d{5}\",[6,9],[[\"(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3\",[\"[45]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"8\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"(?:4[02-4]|5[056])\\\\d{4}\",[6]]]],\"PR\":[\"1\",\"011\",\"(?:[589]\\\\d\\\\d|787)\\\\d{7}\",[10],0,\"1\",0,0,0,0,\"787|939\",[0,[\"(?:787|939)[2-9]\\\\d{6}\"]]],\"PS\":[\"970\",\"00\",\"[2489]2\\\\d{6}|(?:1\\\\d|5)\\\\d{8}\",[8,9,10],[[\"(\\\\d)(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"[2489]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"5\"],\"0$1\"],[\"(\\\\d{4})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"1\"]]],\"0\",0,0,0,0,0,[0,[\"5[69]\\\\d{7}\",[9]]]],\"PT\":[\"351\",\"00\",\"1693\\\\d{5}|(?:[26-9]\\\\d|30)\\\\d{7}\",[9],[[\"(\\\\d{2})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"2[12]\"]],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"16|[236-9]\"]]],0,0,0,0,0,0,[0,[\"6(?:[06]92(?:30|9\\\\d)|[35]92(?:3[03]|9\\\\d))\\\\d{3}|(?:(?:16|6[0356])93|9(?:[1-36]\\\\d\\\\d|480))\\\\d{5}\"]]],\"PW\":[\"680\",\"01[12]\",\"(?:[24-8]\\\\d\\\\d|345|900)\\\\d{4}\",[7],[[\"(\\\\d{3})(\\\\d{4})\",\"$1 $2\",[\"[2-9]\"]]],0,0,0,0,0,0,[0,[\"(?:(?:46|83)[0-5]|6[2-4689]0)\\\\d{4}|(?:45|77|88)\\\\d{5}\"]]],\"PY\":[\"595\",\"00\",\"59\\\\d{4,6}|9\\\\d{5,10}|(?:[2-46-8]\\\\d|5[0-8])\\\\d{4,7}\",[6,7,8,9,10,11],[[\"(\\\\d{3})(\\\\d{3,6})\",\"$1 $2\",[\"[2-9]0\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{5})\",\"$1 $2\",[\"[26]1|3[289]|4[1246-8]|7[1-3]|8[1-36]\"],\"(0$1)\"],[\"(\\\\d{3})(\\\\d{4,5})\",\"$1 $2\",[\"2[279]|3[13-5]|4[359]|5|6(?:[34]|7[1-46-8])|7[46-8]|85\"],\"(0$1)\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{3,4})\",\"$1 $2 $3\",[\"2[14-68]|3[26-9]|4[1246-8]|6(?:1|75)|7[1-35]|8[1-36]\"],\"(0$1)\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"87\"]],[\"(\\\\d{3})(\\\\d{6})\",\"$1 $2\",[\"9(?:[5-79]|8[1-6])\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"[2-8]\"],\"0$1\"],[\"(\\\\d{4})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"9\"]]],\"0\",0,0,0,0,0,[0,[\"9(?:51|6[129]|[78][1-6]|9[1-5])\\\\d{6}\",[9]]]],\"QA\":[\"974\",\"00\",\"800\\\\d{4}|(?:2|800)\\\\d{6}|(?:0080|[3-7])\\\\d{7}\",[7,8,9,11],[[\"(\\\\d{3})(\\\\d{4})\",\"$1 $2\",[\"2[16]|8\"]],[\"(\\\\d{4})(\\\\d{4})\",\"$1 $2\",[\"[3-7]\"]]],0,0,0,0,0,0,[0,[\"[35-7]\\\\d{7}\",[8]]]],\"RE\":[\"262\",\"00\",\"976\\\\d{6}|(?:26|[68]\\\\d)\\\\d{7}\",[9],[[\"(\\\\d{3})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"[2689]\"],\"0$1\"]],\"0\",0,0,0,0,\"26[23]|69|[89]\",[0,[\"(?:69(?:2\\\\d\\\\d|3(?:0[0-46]|1[013]|2[0-2]|3[0-39]|4\\\\d|5[0-5]|6[0-6]|7[0-27]|8[0-8]|9[0-479]))|976(?:2[27]|3[0-37]|9\\\\d))\\\\d{4}\"]]],\"RO\":[\"40\",\"00\",\"(?:[2378]\\\\d|90)\\\\d{7}|[23]\\\\d{5}\",[6,9],[[\"(\\\\d{3})(\\\\d{3})\",\"$1 $2\",[\"2[3-6]\",\"2[3-6]\\\\d9\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{4})\",\"$1 $2\",[\"219|31\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"[23]1\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"[237-9]\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"7020\\\\d{5}|7(?:0[013-9]|1[0-3]|[2-7]\\\\d|8[03-8]|9[019])\\\\d{6}\",[9]]],0,\" int \"],\"RS\":[\"381\",\"00\",\"38[02-9]\\\\d{6,9}|6\\\\d{7,9}|90\\\\d{4,8}|38\\\\d{5,6}|(?:7\\\\d\\\\d|800)\\\\d{3,9}|(?:[12]\\\\d|3[0-79])\\\\d{5,10}\",[6,7,8,9,10,11,12],[[\"(\\\\d{3})(\\\\d{3,9})\",\"$1 $2\",[\"(?:2[389]|39)0|[7-9]\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{5,10})\",\"$1 $2\",[\"[1-36]\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"6(?:[0-689]|7\\\\d)\\\\d{6,7}\",[8,9,10]]]],\"RU\":[\"7\",\"810\",\"8\\\\d{13}|[347-9]\\\\d{9}\",[10,14],[[\"(\\\\d{4})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"7(?:1[0-8]|2[1-9])\",\"7(?:1(?:[0-356]2|4[29]|7|8[27])|2(?:1[23]|[2-9]2))\",\"7(?:1(?:[0-356]2|4[29]|7|8[27])|2(?:13[03-69]|62[013-9]))|72[1-57-9]2\"],\"8 ($1)\",1],[\"(\\\\d{5})(\\\\d)(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"7(?:1[0-68]|2[1-9])\",\"7(?:1(?:[06][3-6]|[18]|2[35]|[3-5][3-5])|2(?:[13][3-5]|[24-689]|7[457]))\",\"7(?:1(?:0(?:[356]|4[023])|[18]|2(?:3[013-9]|5)|3[45]|43[013-79]|5(?:3[1-8]|4[1-7]|5)|6(?:3[0-35-9]|[4-6]))|2(?:1(?:3[178]|[45])|[24-689]|3[35]|7[457]))|7(?:14|23)4[0-8]|71(?:33|45)[1-79]\"],\"8 ($1)\",1],[\"(\\\\d{3})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"7\"],\"8 ($1)\",1],[\"(\\\\d{3})(\\\\d{3})(\\\\d{2})(\\\\d{2})\",\"$1 $2-$3-$4\",[\"[349]|8(?:[02-7]|1[1-8])\"],\"8 ($1)\",1],[\"(\\\\d{4})(\\\\d{4})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3 $4\",[\"8\"],\"8 ($1)\"]],\"8\",0,0,0,0,\"3[04-689]|[489]\",[0,[\"9\\\\d{9}\",[10]]],\"8~10\"],\"RW\":[\"250\",\"00\",\"(?:06|[27]\\\\d\\\\d|[89]00)\\\\d{6}\",[8,9],[[\"(\\\\d{2})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"0\"]],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"[7-9]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"2\"]]],\"0\",0,0,0,0,0,[0,[\"7[2389]\\\\d{7}\",[9]]]],\"SA\":[\"966\",\"00\",\"92\\\\d{7}|(?:[15]|8\\\\d)\\\\d{8}\",[9,10],[[\"(\\\\d{4})(\\\\d{5})\",\"$1 $2\",[\"9\"]],[\"(\\\\d{2})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"1\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"5\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3,4})\",\"$1 $2 $3\",[\"81\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"8\"]]],\"0\",0,0,0,0,0,[0,[\"579[01]\\\\d{5}|5(?:[013-689]\\\\d|7[0-35-8])\\\\d{6}\",[9]]]],\"SB\":[\"677\",\"0[01]\",\"(?:[1-6]|[7-9]\\\\d\\\\d)\\\\d{4}\",[5,7],[[\"(\\\\d{2})(\\\\d{5})\",\"$1 $2\",[\"7|8[4-9]|9(?:[1-8]|9[0-8])\"]]],0,0,0,0,0,0,[0,[\"48\\\\d{3}|(?:(?:7[1-9]|8[4-9])\\\\d|9(?:1[2-9]|2[013-9]|3[0-2]|[46]\\\\d|5[0-46-9]|7[0-689]|8[0-79]|9[0-8]))\\\\d{4}\"]]],\"SC\":[\"248\",\"010|0[0-2]\",\"800\\\\d{4}|(?:[249]\\\\d|64)\\\\d{5}\",[7],[[\"(\\\\d)(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"[246]|9[57]\"]]],0,0,0,0,0,0,[0,[\"2[125-8]\\\\d{5}\"]],\"00\"],\"SD\":[\"249\",\"00\",\"[19]\\\\d{8}\",[9],[[\"(\\\\d{2})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"[19]\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"(?:1[0-2]|9[0-3569])\\\\d{7}\"]]],\"SE\":[\"46\",\"00\",\"(?:[26]\\\\d\\\\d|9)\\\\d{9}|[1-9]\\\\d{8}|[1-689]\\\\d{7}|[1-4689]\\\\d{6}|2\\\\d{5}\",[6,7,8,9,10],[[\"(\\\\d{2})(\\\\d{2,3})(\\\\d{2})\",\"$1-$2 $3\",[\"20\"],\"0$1\",0,\"$1 $2 $3\"],[\"(\\\\d{3})(\\\\d{4})\",\"$1-$2\",[\"9(?:00|39|44|9)\"],\"0$1\",0,\"$1 $2\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{2})\",\"$1-$2 $3\",[\"[12][136]|3[356]|4[0246]|6[03]|90[1-9]\"],\"0$1\",0,\"$1 $2 $3\"],[\"(\\\\d)(\\\\d{2,3})(\\\\d{2})(\\\\d{2})\",\"$1-$2 $3 $4\",[\"8\"],\"0$1\",0,\"$1 $2 $3 $4\"],[\"(\\\\d{3})(\\\\d{2,3})(\\\\d{2})\",\"$1-$2 $3\",[\"1[2457]|2(?:[247-9]|5[0138])|3[0247-9]|4[1357-9]|5[0-35-9]|6(?:[125689]|4[02-57]|7[0-2])|9(?:[125-8]|3[02-5]|4[0-3])\"],\"0$1\",0,\"$1 $2 $3\"],[\"(\\\\d{3})(\\\\d{2,3})(\\\\d{3})\",\"$1-$2 $3\",[\"9(?:00|39|44)\"],\"0$1\",0,\"$1 $2 $3\"],[\"(\\\\d{2})(\\\\d{2,3})(\\\\d{2})(\\\\d{2})\",\"$1-$2 $3 $4\",[\"1[13689]|2[0136]|3[1356]|4[0246]|54|6[03]|90[1-9]\"],\"0$1\",0,\"$1 $2 $3 $4\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{2})(\\\\d{2})\",\"$1-$2 $3 $4\",[\"10|7\"],\"0$1\",0,\"$1 $2 $3 $4\"],[\"(\\\\d)(\\\\d{3})(\\\\d{3})(\\\\d{2})\",\"$1-$2 $3 $4\",[\"8\"],\"0$1\",0,\"$1 $2 $3 $4\"],[\"(\\\\d{3})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1-$2 $3 $4\",[\"[13-5]|2(?:[247-9]|5[0138])|6(?:[124-689]|7[0-2])|9(?:[125-8]|3[02-5]|4[0-3])\"],\"0$1\",0,\"$1 $2 $3 $4\"],[\"(\\\\d{3})(\\\\d{2})(\\\\d{2})(\\\\d{3})\",\"$1-$2 $3 $4\",[\"9\"],\"0$1\",0,\"$1 $2 $3 $4\"],[\"(\\\\d{3})(\\\\d{2})(\\\\d{3})(\\\\d{2})(\\\\d{2})\",\"$1-$2 $3 $4 $5\",[\"[26]\"],\"0$1\",0,\"$1 $2 $3 $4 $5\"]],\"0\",0,0,0,0,0,[0,[\"7[02369]\\\\d{7}\",[9]]]],\"SG\":[\"65\",\"0[0-3]\\\\d\",\"(?:(?:1\\\\d|8)\\\\d\\\\d|7000)\\\\d{7}|[3689]\\\\d{7}\",[8,10,11],[[\"(\\\\d{4})(\\\\d{4})\",\"$1 $2\",[\"[369]|8(?:0[1-6]|[1-9])\"]],[\"(\\\\d{3})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"8\"]],[\"(\\\\d{4})(\\\\d{4})(\\\\d{3})\",\"$1 $2 $3\",[\"7\"]],[\"(\\\\d{4})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"1\"]]],0,0,0,0,0,0,[0,[\"8(?:06[0-6]|95[0-2])\\\\d{4}|(?:8(?:0[1-5]|[1-8]\\\\d|9[0-4])|9[0-8]\\\\d)\\\\d{5}\",[8]]]],\"SH\":[\"290\",\"00\",\"(?:[256]\\\\d|8)\\\\d{3}\",[4,5],0,0,0,0,0,0,\"[256]\",[0,[\"[56]\\\\d{4}\",[5]]]],\"SI\":[\"386\",\"00|10(?:22|66|88|99)\",\"[1-7]\\\\d{7}|8\\\\d{4,7}|90\\\\d{4,6}\",[5,6,7,8],[[\"(\\\\d{2})(\\\\d{3,6})\",\"$1 $2\",[\"8[09]|9\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{5})\",\"$1 $2\",[\"59|8\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"[37][01]|4[0139]|51|6\"],\"0$1\"],[\"(\\\\d)(\\\\d{3})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"[1-57]\"],\"(0$1)\"]],\"0\",0,0,0,0,0,[0,[\"65(?:1\\\\d|5[56]|6[01]|70)\\\\d{4}|(?:[37][01]|4[0139]|51|6[489])\\\\d{6}\",[8]]],\"00\"],\"SJ\":[\"47\",\"00\",\"0\\\\d{4}|(?:[489]\\\\d|[57]9)\\\\d{6}\",[5,8],0,0,0,0,0,0,\"79\",[0,[\"(?:4[015-8]|59|9\\\\d)\\\\d{6}\",[8]]]],\"SK\":[\"421\",\"00\",\"[2-689]\\\\d{8}|[2-59]\\\\d{6}|[2-5]\\\\d{5}\",[6,7,9],[[\"(\\\\d)(\\\\d{2})(\\\\d{3,4})\",\"$1 $2 $3\",[\"21\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{2})(\\\\d{2,3})\",\"$1 $2 $3\",[\"[3-5][1-8]1\",\"[3-5][1-8]1[67]\"],\"0$1\"],[\"(\\\\d)(\\\\d{3})(\\\\d{3})(\\\\d{2})\",\"$1/$2 $3 $4\",[\"2\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"[689]\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{2})(\\\\d{2})\",\"$1/$2 $3 $4\",[\"[3-5]\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"909[1-9]\\\\d{5}|9(?:0[1-8]|1[0-24-9]|4[03-57-9]|5\\\\d)\\\\d{6}\",[9]]]],\"SL\":[\"232\",\"00\",\"(?:[237-9]\\\\d|66)\\\\d{6}\",[8],[[\"(\\\\d{2})(\\\\d{6})\",\"$1 $2\",[\"[236-9]\"],\"(0$1)\"]],\"0\",0,0,0,0,0,[0,[\"(?:25|3[0-5]|66|7[2-9]|8[08]|9[09])\\\\d{6}\"]]],\"SM\":[\"378\",\"00\",\"(?:0549|[5-7]\\\\d)\\\\d{6}\",[8,10],[[\"(\\\\d{2})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"[5-7]\"]],[\"(\\\\d{4})(\\\\d{6})\",\"$1 $2\",[\"0\"]]],0,0,\"([89]\\\\d{5})$\",\"0549$1\",0,0,[0,[\"6[16]\\\\d{6}\",[8]]]],\"SN\":[\"221\",\"00\",\"(?:[378]\\\\d|93)\\\\d{7}\",[9],[[\"(\\\\d{3})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"8\"]],[\"(\\\\d{2})(\\\\d{3})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"[379]\"]]],0,0,0,0,0,0,[0,[\"7(?:(?:[06-8]\\\\d|21|90)\\\\d|5(?:01|[19]0|25|[38]3|[4-7]\\\\d))\\\\d{5}\"]]],\"SO\":[\"252\",\"00\",\"[346-9]\\\\d{8}|[12679]\\\\d{7}|[1-5]\\\\d{6}|[1348]\\\\d{5}\",[6,7,8,9],[[\"(\\\\d{2})(\\\\d{4})\",\"$1 $2\",[\"8[125]\"]],[\"(\\\\d{6})\",\"$1\",[\"[134]\"]],[\"(\\\\d)(\\\\d{6})\",\"$1 $2\",[\"[15]|2[0-79]|3[0-46-8]|4[0-7]\"]],[\"(\\\\d)(\\\\d{7})\",\"$1 $2\",[\"(?:2|90)4|[67]\"]],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"[3478]|64|90\"]],[\"(\\\\d{2})(\\\\d{5,7})\",\"$1 $2\",[\"1|28|6(?:0[5-7]|[1-35-9])|9[2-9]\"]]],\"0\",0,0,0,0,0,[0,[\"(?:(?:15|(?:3[59]|4[89]|79|8[08])\\\\d|6(?:0[5-7]|[1-9]\\\\d)|9(?:0\\\\d|[2-9]))\\\\d|2(?:4\\\\d|8))\\\\d{5}|(?:[67]\\\\d\\\\d|904)\\\\d{5}\",[7,8,9]]]],\"SR\":[\"597\",\"00\",\"(?:[2-5]|68|[78]\\\\d)\\\\d{5}\",[6,7],[[\"(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1-$2-$3\",[\"56\"]],[\"(\\\\d{3})(\\\\d{3})\",\"$1-$2\",[\"[2-5]\"]],[\"(\\\\d{3})(\\\\d{4})\",\"$1-$2\",[\"[6-8]\"]]],0,0,0,0,0,0,[0,[\"(?:7[124-7]|8[124-9])\\\\d{5}\",[7]]]],\"SS\":[\"211\",\"00\",\"[19]\\\\d{8}\",[9],[[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"[19]\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"(?:12|9[1257-9])\\\\d{7}\"]]],\"ST\":[\"239\",\"00\",\"(?:22|9\\\\d)\\\\d{5}\",[7],[[\"(\\\\d{3})(\\\\d{4})\",\"$1 $2\",[\"[29]\"]]],0,0,0,0,0,0,[0,[\"900[5-9]\\\\d{3}|9(?:0[1-9]|[89]\\\\d)\\\\d{4}\"]]],\"SV\":[\"503\",\"00\",\"[267]\\\\d{7}|[89]00\\\\d{4}(?:\\\\d{4})?\",[7,8,11],[[\"(\\\\d{3})(\\\\d{4})\",\"$1 $2\",[\"[89]\"]],[\"(\\\\d{4})(\\\\d{4})\",\"$1 $2\",[\"[267]\"]],[\"(\\\\d{3})(\\\\d{4})(\\\\d{4})\",\"$1 $2 $3\",[\"[89]\"]]],0,0,0,0,0,0,[0,[\"66(?:[02-9]\\\\d\\\\d|1(?:[02-9]\\\\d|16))\\\\d{3}|(?:6[0-57-9]|7\\\\d)\\\\d{6}\",[8]]]],\"SX\":[\"1\",\"011\",\"7215\\\\d{6}|(?:[58]\\\\d\\\\d|900)\\\\d{7}\",[10],0,\"1\",0,\"1|(5\\\\d{6})$\",\"721$1\",0,\"721\",[0,[\"7215(?:1[02]|2\\\\d|5[034679]|8[014-8])\\\\d{4}\"]]],\"SY\":[\"963\",\"00\",\"[1-39]\\\\d{8}|[1-5]\\\\d{7}\",[8,9],[[\"(\\\\d{2})(\\\\d{3})(\\\\d{3,4})\",\"$1 $2 $3\",[\"[1-5]\"],\"0$1\",1],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"9\"],\"0$1\",1]],\"0\",0,0,0,0,0,[0,[\"9[1-689]\\\\d{7}\",[9]]]],\"SZ\":[\"268\",\"00\",\"0800\\\\d{4}|(?:[237]\\\\d|900)\\\\d{6}\",[8,9],[[\"(\\\\d{4})(\\\\d{4})\",\"$1 $2\",[\"[0237]\"]],[\"(\\\\d{5})(\\\\d{4})\",\"$1 $2\",[\"9\"]]],0,0,0,0,0,0,[0,[\"7[6-9]\\\\d{6}\",[8]]]],\"TA\":[\"290\",\"00\",\"8\\\\d{3}\",[4],0,0,0,0,0,0,\"8\"],\"TC\":[\"1\",\"011\",\"(?:[58]\\\\d\\\\d|649|900)\\\\d{7}\",[10],0,\"1\",0,\"1|([2-479]\\\\d{6})$\",\"649$1\",0,\"649\",[0,[\"649(?:2(?:3[129]|4[1-79])|3\\\\d\\\\d|4[34][1-3])\\\\d{4}\"]]],\"TD\":[\"235\",\"00|16\",\"(?:22|[69]\\\\d|77)\\\\d{6}\",[8],[[\"(\\\\d{2})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"[2679]\"]]],0,0,0,0,0,0,[0,[\"(?:6[023568]|77|9\\\\d)\\\\d{6}\"]],\"00\"],\"TG\":[\"228\",\"00\",\"[279]\\\\d{7}\",[8],[[\"(\\\\d{2})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"[279]\"]]],0,0,0,0,0,0,[0,[\"(?:7[09]|9[0-36-9])\\\\d{6}\"]]],\"TH\":[\"66\",\"00[1-9]\",\"(?:001800|[2-57]|[689]\\\\d)\\\\d{7}|1\\\\d{7,9}\",[8,9,10,13],[[\"(\\\\d)(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"2\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{3,4})\",\"$1 $2 $3\",[\"[13-9]\"],\"0$1\"],[\"(\\\\d{4})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"1\"]]],\"0\",0,0,0,0,0,[0,[\"671[0-8]\\\\d{5}|(?:14|6[1-6]|[89]\\\\d)\\\\d{7}\",[9]]]],\"TJ\":[\"992\",\"810\",\"(?:00|[1-57-9]\\\\d)\\\\d{7}\",[9],[[\"(\\\\d{6})(\\\\d)(\\\\d{2})\",\"$1 $2 $3\",[\"331\",\"3317\"]],[\"(\\\\d{3})(\\\\d{2})(\\\\d{4})\",\"$1 $2 $3\",[\"[34]7|91[78]\"]],[\"(\\\\d{4})(\\\\d)(\\\\d{4})\",\"$1 $2 $3\",[\"3[1-5]\"]],[\"(\\\\d{2})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"[0-57-9]\"]]],0,0,0,0,0,0,[0,[\"41[18]\\\\d{6}|(?:[034]0|1[017]|2[02]|5[05]|7[0178]|8[078]|9\\\\d)\\\\d{7}\"]],\"8~10\"],\"TK\":[\"690\",\"00\",\"[2-47]\\\\d{3,6}\",[4,5,6,7],0,0,0,0,0,0,0,[0,[\"7[2-4]\\\\d{2,5}\"]]],\"TL\":[\"670\",\"00\",\"7\\\\d{7}|(?:[2-47]\\\\d|[89]0)\\\\d{5}\",[7,8],[[\"(\\\\d{3})(\\\\d{4})\",\"$1 $2\",[\"[2-489]|70\"]],[\"(\\\\d{4})(\\\\d{4})\",\"$1 $2\",[\"7\"]]],0,0,0,0,0,0,[0,[\"7[2-8]\\\\d{6}\",[8]]]],\"TM\":[\"993\",\"810\",\"[1-6]\\\\d{7}\",[8],[[\"(\\\\d{2})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2-$3-$4\",[\"12\"],\"(8 $1)\"],[\"(\\\\d{3})(\\\\d)(\\\\d{2})(\\\\d{2})\",\"$1 $2-$3-$4\",[\"[1-5]\"],\"(8 $1)\"],[\"(\\\\d{2})(\\\\d{6})\",\"$1 $2\",[\"6\"],\"8 $1\"]],\"8\",0,0,0,0,0,[0,[\"6\\\\d{7}\"]],\"8~10\"],\"TN\":[\"216\",\"00\",\"[2-57-9]\\\\d{7}\",[8],[[\"(\\\\d{2})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"[2-57-9]\"]]],0,0,0,0,0,0,[0,[\"3(?:001|[12]40)\\\\d{4}|(?:(?:[259]\\\\d|4[0-7])\\\\d|3(?:1[1-35]|6[0-4]|91))\\\\d{5}\"]]],\"TO\":[\"676\",\"00\",\"(?:0800|(?:[5-8]\\\\d\\\\d|999)\\\\d)\\\\d{3}|[2-8]\\\\d{4}\",[5,7],[[\"(\\\\d{2})(\\\\d{3})\",\"$1-$2\",[\"[2-4]|50|6[09]|7[0-24-69]|8[05]\"]],[\"(\\\\d{4})(\\\\d{3})\",\"$1 $2\",[\"0\"]],[\"(\\\\d{3})(\\\\d{4})\",\"$1 $2\",[\"[5-9]\"]]],0,0,0,0,0,0,[0,[\"(?:55[4-6]|6(?:[09]\\\\d|3[02]|8[15-9])|(?:7\\\\d|8[46-9])\\\\d|999)\\\\d{4}\",[7]]]],\"TR\":[\"90\",\"00\",\"4\\\\d{6}|8\\\\d{11,12}|(?:[2-58]\\\\d\\\\d|900)\\\\d{7}\",[7,10,12,13],[[\"(\\\\d{3})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"512|8[01589]|90\"],\"0$1\",1],[\"(\\\\d{3})(\\\\d{3})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"5(?:[0-59]|61)\",\"5(?:[0-59]|616)\",\"5(?:[0-59]|6161)\"],\"0$1\",1],[\"(\\\\d{3})(\\\\d{3})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"[24][1-8]|3[1-9]\"],\"(0$1)\",1],[\"(\\\\d{3})(\\\\d{3})(\\\\d{6,7})\",\"$1 $2 $3\",[\"80\"],\"0$1\",1]],\"0\",0,0,0,0,0,[0,[\"56161\\\\d{5}|5(?:0[15-7]|1[06]|24|[34]\\\\d|5[1-59]|9[46])\\\\d{7}\",[10]]]],\"TT\":[\"1\",\"011\",\"(?:[58]\\\\d\\\\d|900)\\\\d{7}\",[10],0,\"1\",0,\"1|([2-46-8]\\\\d{6})$\",\"868$1\",0,\"868\",[0,[\"868(?:(?:2[5-9]|3\\\\d)\\\\d|4(?:3[0-6]|[6-9]\\\\d)|6(?:20|78|8\\\\d)|7(?:0[1-9]|1[02-9]|[2-9]\\\\d))\\\\d{4}\"]]],\"TV\":[\"688\",\"00\",\"(?:2|7\\\\d\\\\d|90)\\\\d{4}\",[5,6,7],[[\"(\\\\d{2})(\\\\d{3})\",\"$1 $2\",[\"2\"]],[\"(\\\\d{2})(\\\\d{4})\",\"$1 $2\",[\"90\"]],[\"(\\\\d{2})(\\\\d{5})\",\"$1 $2\",[\"7\"]]],0,0,0,0,0,0,[0,[\"(?:7[01]\\\\d|90)\\\\d{4}\",[6,7]]]],\"TW\":[\"886\",\"0(?:0[25-79]|19)\",\"[2-689]\\\\d{8}|7\\\\d{9,10}|[2-8]\\\\d{7}|2\\\\d{6}\",[7,8,9,10,11],[[\"(\\\\d{2})(\\\\d)(\\\\d{4})\",\"$1 $2 $3\",[\"202\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{3,4})\",\"$1 $2 $3\",[\"[258]0\"],\"0$1\"],[\"(\\\\d)(\\\\d{3,4})(\\\\d{4})\",\"$1 $2 $3\",[\"[23568]|4(?:0[02-48]|[1-47-9])|7[1-9]\",\"[23568]|4(?:0[2-48]|[1-47-9])|(?:400|7)[1-9]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"[49]\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{4})(\\\\d{4,5})\",\"$1 $2 $3\",[\"7\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"(?:40001[0-2]|9[0-8]\\\\d{4})\\\\d{3}\",[9]]],0,\"#\"],\"TZ\":[\"255\",\"00[056]\",\"(?:[25-8]\\\\d|41|90)\\\\d{7}\",[9],[[\"(\\\\d{3})(\\\\d{2})(\\\\d{4})\",\"$1 $2 $3\",[\"[89]\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"[24]\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{7})\",\"$1 $2\",[\"5\"]],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"[67]\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"77[2-9]\\\\d{6}|(?:6[125-9]|7[13-689])\\\\d{7}\"]]],\"UA\":[\"380\",\"00\",\"[89]\\\\d{9}|[3-9]\\\\d{8}\",[9,10],[[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"6[12][29]|(?:3[1-8]|4[136-8]|5[12457]|6[49])2|(?:56|65)[24]\",\"6[12][29]|(?:35|4[1378]|5[12457]|6[49])2|(?:56|65)[24]|(?:3[1-46-8]|46)2[013-9]\"],\"0$1\"],[\"(\\\\d{4})(\\\\d{5})\",\"$1 $2\",[\"3[1-8]|4(?:[1367]|[45][6-9]|8[4-6])|5(?:[1-5]|6[0135689]|7[4-6])|6(?:[12][3-7]|[459])\",\"3[1-8]|4(?:[1367]|[45][6-9]|8[4-6])|5(?:[1-5]|6(?:[015689]|3[02389])|7[4-6])|6(?:[12][3-7]|[459])\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"[3-7]|89|9[1-9]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3,4})\",\"$1 $2 $3\",[\"[89]\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"(?:39|50|6[36-8]|7[1-3]|9[1-9])\\\\d{7}\",[9]]],\"0~0\"],\"UG\":[\"256\",\"00[057]\",\"800\\\\d{6}|(?:[29]0|[347]\\\\d)\\\\d{7}\",[9],[[\"(\\\\d{4})(\\\\d{5})\",\"$1 $2\",[\"202\",\"2024\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{6})\",\"$1 $2\",[\"[27-9]|4(?:6[45]|[7-9])\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{7})\",\"$1 $2\",[\"[34]\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"726[01]\\\\d{5}|7(?:[01578]\\\\d|20|36|[46][0-4]|9[89])\\\\d{6}\"]]],\"US\":[\"1\",\"011\",\"[2-9]\\\\d{9}|3\\\\d{6}\",[10],[[\"(\\\\d{3})(\\\\d{4})\",\"$1-$2\",[\"310\"],0,1],[\"(\\\\d{3})(\\\\d{3})(\\\\d{4})\",\"($1) $2-$3\",[\"[2-9]\"],0,1,\"$1-$2-$3\"]],\"1\",0,0,0,0,0,[0,[\"505(?:[2-57-9]\\\\d\\\\d|6(?:[0-35-9]\\\\d|4[46]))\\\\d{4}|(?:2(?:0[1-35-9]|1[02-9]|2[03-589]|3[149]|4[08]|5[1-46]|6[0279]|7[0269]|8[13])|3(?:0[1-57-9]|1[02-9]|2[01356]|3[0-24679]|4[167]|5[0-2]|6[014]|8[056])|4(?:0[124-9]|1[02-579]|2[3-5]|3[0245]|4[023578]|58|6[349]|7[0589]|8[04])|5(?:0[1-47-9]|1[0235-8]|20|3[0149]|4[01]|5[19]|6[1-47]|7[0-5]|8[0256])|6(?:0[1-35-9]|1[024-9]|2[03689]|[34][016]|5[01679]|6[0-279]|78|8[0-29])|7(?:0[1-46-8]|1[2-9]|2[04-7]|3[1247]|4[037]|5[47]|6[02359]|7[0-59]|8[156])|8(?:0[1-68]|1[02-8]|2[068]|3[0-2589]|4[03578]|5[046-9]|6[02-5]|7[028])|9(?:0[1346-9]|1[02-9]|2[0589]|3[0146-8]|4[01357-9]|5[12469]|7[0-389]|8[04-69]))[2-9]\\\\d{6}\"]]],\"UY\":[\"598\",\"0(?:0|1[3-9]\\\\d)\",\"(?:0004|4)\\\\d{9}|[1249]\\\\d{7}|(?:[49]\\\\d|80)\\\\d{5}\",[7,8,10,13],[[\"(\\\\d{3})(\\\\d{4})\",\"$1 $2\",[\"405|8|90\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"9\"],\"0$1\"],[\"(\\\\d{4})(\\\\d{4})\",\"$1 $2\",[\"[124]\"]],[\"(\\\\d{3})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"4\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3 $4\",[\"0\"]]],\"0\",0,0,0,0,0,[0,[\"9[1-9]\\\\d{6}\",[8]]],\"00\",\" int. \"],\"UZ\":[\"998\",\"810\",\"(?:33|[5-79]\\\\d|88)\\\\d{7}\",[9],[[\"(\\\\d{2})(\\\\d{3})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"[35-9]\"],\"8 $1\"]],\"8\",0,0,0,0,0,[0,[\"(?:(?:33|88|9[0-57-9])\\\\d{3}|5(?:0\\\\d{3}|5(?:50[013]|90\\\\d))|6(?:1(?:2(?:2[01]|98)|35[0-4]|50\\\\d|61[23]|7(?:[01][017]|4\\\\d|55|9[5-9]))|2(?:(?:11|7\\\\d)\\\\d|2(?:[12]1|9[01379])|5(?:[126]\\\\d|3[0-4]))|5(?:19[01]|2(?:27|9[26])|(?:30|59|7\\\\d)\\\\d)|6(?:2(?:1[5-9]|2[0367]|38|41|52|60)|(?:3[79]|9[0-3])\\\\d|4(?:56|83)|7(?:[07]\\\\d|1[017]|3[07]|4[047]|5[057]|67|8[0178]|9[79]))|7(?:2(?:24|3[237]|4[5-9]|7[15-8])|5(?:7[12]|8[0589])|7(?:0\\\\d|[39][07])|9(?:0\\\\d|7[079]))|9(?:2(?:1[1267]|3[01]|5\\\\d|7[0-4])|(?:5[67]|7\\\\d)\\\\d|6(?:2[0-26]|8\\\\d)))|7(?:[07]\\\\d{3}|1(?:13[01]|6(?:0[47]|1[67]|66)|71[3-69]|98\\\\d)|2(?:2(?:2[79]|95)|3(?:2[5-9]|6[0-6])|57\\\\d|7(?:0\\\\d|1[17]|2[27]|3[37]|44|5[057]|66|88))|3(?:2(?:1[0-6]|21|3[469]|7[159])|(?:33|9[4-6])\\\\d|5(?:0[0-4]|5[579]|9\\\\d)|7(?:[0-3579]\\\\d|4[0467]|6[67]|8[078]))|4(?:2(?:29|5[0257]|6[0-7]|7[1-57])|5(?:1[0-4]|8\\\\d|9[5-9])|7(?:0\\\\d|1[024589]|2[0-27]|3[0137]|[46][07]|5[01]|7[5-9]|9[079])|9(?:7[015-9]|[89]\\\\d))|5(?:112|2(?:0\\\\d|2[29]|[49]4)|3[1568]\\\\d|52[6-9]|7(?:0[01578]|1[017]|[23]7|4[047]|[5-7]\\\\d|8[78]|9[079]))|6(?:2(?:2[1245]|4[2-4])|39\\\\d|41[179]|5(?:[349]\\\\d|5[0-2])|7(?:0[017]|[13]\\\\d|22|44|55|67|88))|9(?:22[128]|3(?:2[0-4]|7\\\\d)|57[02569]|7(?:2[05-9]|3[37]|4\\\\d|60|7[2579]|87|9[07]))))\\\\d{4}\"]],\"8~10\"],\"VA\":[\"39\",\"00\",\"0\\\\d{5,10}|3[0-8]\\\\d{7,10}|55\\\\d{8}|8\\\\d{5}(?:\\\\d{2,4})?|(?:1\\\\d|39)\\\\d{7,8}\",[6,7,8,9,10,11],0,0,0,0,0,0,\"06698\",[0,[\"3[1-9]\\\\d{8}|3[2-9]\\\\d{7}\",[9,10]]]],\"VC\":[\"1\",\"011\",\"(?:[58]\\\\d\\\\d|784|900)\\\\d{7}\",[10],0,\"1\",0,\"1|([2-7]\\\\d{6})$\",\"784$1\",0,\"784\",[0,[\"784(?:4(?:3[0-5]|5[45]|89|9[0-8])|5(?:2[6-9]|3[0-4])|720)\\\\d{4}\"]]],\"VE\":[\"58\",\"00\",\"[68]00\\\\d{7}|(?:[24]\\\\d|[59]0)\\\\d{8}\",[10],[[\"(\\\\d{3})(\\\\d{7})\",\"$1-$2\",[\"[24-689]\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"4(?:1[24-8]|2[46])\\\\d{7}\"]]],\"VG\":[\"1\",\"011\",\"(?:284|[58]\\\\d\\\\d|900)\\\\d{7}\",[10],0,\"1\",0,\"1|([2-578]\\\\d{6})$\",\"284$1\",0,\"284\",[0,[\"284496[6-9]\\\\d{3}|284(?:245|3(?:0[0-3]|4[0-7]|68|9[34])|4(?:4[0-6]|68|99)|5(?:4[0-7]|68|9[69]))\\\\d{4}\"]]],\"VI\":[\"1\",\"011\",\"[58]\\\\d{9}|(?:34|90)0\\\\d{7}\",[10],0,\"1\",0,\"1|([2-9]\\\\d{6})$\",\"340$1\",0,\"340\",[0,[\"340(?:2(?:0[0-368]|2[06-8]|4[49]|77)|3(?:32|44)|4(?:2[23]|44|7[34]|89)|5(?:1[34]|55)|6(?:2[56]|4[23]|77|9[023])|7(?:1[2-57-9]|2[57]|7\\\\d)|884|998)\\\\d{4}\"]]],\"VN\":[\"84\",\"00\",\"[12]\\\\d{9}|[135-9]\\\\d{8}|[16]\\\\d{7}|[16-8]\\\\d{6}\",[7,8,9,10],[[\"(\\\\d{2})(\\\\d{5})\",\"$1 $2\",[\"80\"],\"0$1\",1],[\"(\\\\d{4})(\\\\d{4,6})\",\"$1 $2\",[\"1\"],0,1],[\"(\\\\d{2})(\\\\d{3})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"[69]\"],\"0$1\",1],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"[3578]\"],\"0$1\",1],[\"(\\\\d{2})(\\\\d{4})(\\\\d{4})\",\"$1 $2 $3\",[\"2[48]\"],\"0$1\",1],[\"(\\\\d{3})(\\\\d{4})(\\\\d{3})\",\"$1 $2 $3\",[\"2\"],\"0$1\",1]],\"0\",0,0,0,0,0,[0,[\"(?:5(?:2[238]|59)|89[6-9]|99[013-9])\\\\d{6}|(?:3\\\\d|5[689]|7[06-9]|8[1-8]|9[0-8])\\\\d{7}\",[9]]]],\"VU\":[\"678\",\"00\",\"[57-9]\\\\d{6}|(?:[238]\\\\d|48)\\\\d{3}\",[5,7],[[\"(\\\\d{3})(\\\\d{4})\",\"$1 $2\",[\"[57-9]\"]]],0,0,0,0,0,0,[0,[\"(?:[58]\\\\d|7[013-7])\\\\d{5}\",[7]]]],\"WF\":[\"681\",\"00\",\"(?:40|72)\\\\d{4}|8\\\\d{5}(?:\\\\d{3})?\",[6,9],[[\"(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3\",[\"[478]\"]],[\"(\\\\d{3})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"8\"]]],0,0,0,0,0,0,[0,[\"(?:72|8[23])\\\\d{4}\",[6]]]],\"WS\":[\"685\",\"0\",\"(?:[2-6]|8\\\\d{5})\\\\d{4}|[78]\\\\d{6}|[68]\\\\d{5}\",[5,6,7,10],[[\"(\\\\d{5})\",\"$1\",[\"[2-5]|6[1-9]\"]],[\"(\\\\d{3})(\\\\d{3,7})\",\"$1 $2\",[\"[68]\"]],[\"(\\\\d{2})(\\\\d{5})\",\"$1 $2\",[\"7\"]]],0,0,0,0,0,0,[0,[\"(?:7[1-35-7]|8(?:[3-7]|9\\\\d{3}))\\\\d{5}\",[7,10]]]],\"XK\":[\"383\",\"00\",\"[23]\\\\d{7,8}|(?:4\\\\d\\\\d|[89]00)\\\\d{5}\",[8,9],[[\"(\\\\d{3})(\\\\d{5})\",\"$1 $2\",[\"[89]\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"[2-4]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"[23]\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"4[3-9]\\\\d{6}\",[8]]]],\"YE\":[\"967\",\"00\",\"(?:1|7\\\\d)\\\\d{7}|[1-7]\\\\d{6}\",[7,8,9],[[\"(\\\\d)(\\\\d{3})(\\\\d{3,4})\",\"$1 $2 $3\",[\"[1-6]|7(?:[24-6]|8[0-7])\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"7\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"7[01378]\\\\d{7}\",[9]]]],\"YT\":[\"262\",\"00\",\"80\\\\d{7}|(?:26|63)9\\\\d{6}\",[9],0,\"0\",0,0,0,0,\"269|63\",[0,[\"639(?:0[0-79]|1[019]|[267]\\\\d|3[09]|40|5[05-9]|9[04-79])\\\\d{4}\"]]],\"ZA\":[\"27\",\"00\",\"[1-79]\\\\d{8}|8\\\\d{4,9}\",[5,6,7,8,9,10],[[\"(\\\\d{2})(\\\\d{3,4})\",\"$1 $2\",[\"8[1-4]\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{2,3})\",\"$1 $2 $3\",[\"8[1-4]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"860\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"[1-9]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"8\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"(?:1(?:3492[0-25]|4495[0235]|549(?:20|5[01]))|4[34]492[01])\\\\d{3}|8[1-4]\\\\d{3,7}|(?:2[27]|47|54)4950\\\\d{3}|(?:1(?:049[2-4]|9[12]\\\\d\\\\d)|(?:6\\\\d|7[0-46-9])\\\\d{3}|8(?:5\\\\d{3}|7(?:08[67]|158|28[5-9]|310)))\\\\d{4}|(?:1[6-8]|28|3[2-69]|4[025689]|5[36-8])4920\\\\d{3}|(?:12|[2-5]1)492\\\\d{4}\",[5,6,7,8,9]]]],\"ZM\":[\"260\",\"00\",\"800\\\\d{6}|(?:21|63|[79]\\\\d)\\\\d{7}\",[9],[[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"[28]\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{7})\",\"$1 $2\",[\"[79]\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"(?:7[5-79]|9[5-8])\\\\d{7}\"]]],\"ZW\":[\"263\",\"00\",\"2(?:[0-57-9]\\\\d{6,8}|6[0-24-9]\\\\d{6,7})|[38]\\\\d{9}|[35-8]\\\\d{8}|[3-6]\\\\d{7}|[1-689]\\\\d{6}|[1-3569]\\\\d{5}|[1356]\\\\d{4}\",[5,6,7,8,9,10],[[\"(\\\\d{3})(\\\\d{3,5})\",\"$1 $2\",[\"2(?:0[45]|2[278]|[49]8)|3(?:[09]8|17)|6(?:[29]8|37|75)|[23][78]|(?:33|5[15]|6[68])[78]\"],\"0$1\"],[\"(\\\\d)(\\\\d{3})(\\\\d{2,4})\",\"$1 $2 $3\",[\"[49]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{4})\",\"$1 $2\",[\"80\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{7})\",\"$1 $2\",[\"24|8[13-59]|(?:2[05-79]|39|5[45]|6[15-8])2\",\"2(?:02[014]|4|[56]20|[79]2)|392|5(?:42|525)|6(?:[16-8]21|52[013])|8[13-59]\"],\"(0$1)\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"7\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3,4})\",\"$1 $2 $3\",[\"2(?:1[39]|2[0157]|[378]|[56][14])|3(?:12|29)\",\"2(?:1[39]|2[0157]|[378]|[56][14])|3(?:123|29)\"],\"0$1\"],[\"(\\\\d{4})(\\\\d{6})\",\"$1 $2\",[\"8\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3,5})\",\"$1 $2\",[\"1|2(?:0[0-36-9]|12|29|[56])|3(?:1[0-689]|[24-6])|5(?:[0236-9]|1[2-4])|6(?:[013-59]|7[0-46-9])|(?:33|55|6[68])[0-69]|(?:29|3[09]|62)[0-79]\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{3,4})\",\"$1 $2 $3\",[\"29[013-9]|39|54\"],\"0$1\"],[\"(\\\\d{4})(\\\\d{3,5})\",\"$1 $2\",[\"(?:25|54)8\",\"258|5483\"],\"0$1\"]],\"0\",0,0,0,0,0,[0,[\"7(?:[178]\\\\d|3[1-9])\\\\d{6}\",[9]]]]},\"nonGeographic\":{\"800\":[\"800\",0,\"(?:00|[1-9]\\\\d)\\\\d{6}\",[8],[[\"(\\\\d{4})(\\\\d{4})\",\"$1 $2\",[\"\\\\d\"]]],0,0,0,0,0,0,[0,0,[\"(?:00|[1-9]\\\\d)\\\\d{6}\"]]],\"808\":[\"808\",0,\"[1-9]\\\\d{7}\",[8],[[\"(\\\\d{4})(\\\\d{4})\",\"$1 $2\",[\"[1-9]\"]]],0,0,0,0,0,0,[0,0,0,0,0,0,0,0,0,[\"[1-9]\\\\d{7}\"]]],\"870\":[\"870\",0,\"7\\\\d{11}|[35-7]\\\\d{8}\",[9,12],[[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"[35-7]\"]]],0,0,0,0,0,0,[0,[\"(?:[356]|774[45])\\\\d{8}|7[6-8]\\\\d{7}\"]]],\"878\":[\"878\",0,\"10\\\\d{10}\",[12],[[\"(\\\\d{2})(\\\\d{5})(\\\\d{5})\",\"$1 $2 $3\",[\"1\"]]],0,0,0,0,0,0,[0,0,0,0,0,0,0,0,[\"10\\\\d{10}\"]]],\"881\":[\"881\",0,\"[0-36-9]\\\\d{8}\",[9],[[\"(\\\\d)(\\\\d{3})(\\\\d{5})\",\"$1 $2 $3\",[\"[0-36-9]\"]]],0,0,0,0,0,0,[0,[\"[0-36-9]\\\\d{8}\"]]],\"882\":[\"882\",0,\"[13]\\\\d{6}(?:\\\\d{2,5})?|[19]\\\\d{7}|(?:[25]\\\\d\\\\d|4)\\\\d{7}(?:\\\\d{2})?\",[7,8,9,10,11,12],[[\"(\\\\d{2})(\\\\d{5})\",\"$1 $2\",[\"16|342\"]],[\"(\\\\d{2})(\\\\d{6})\",\"$1 $2\",[\"49\"]],[\"(\\\\d{2})(\\\\d{2})(\\\\d{4})\",\"$1 $2 $3\",[\"1[36]|9\"]],[\"(\\\\d{2})(\\\\d{4})(\\\\d{3})\",\"$1 $2 $3\",[\"3[23]\"]],[\"(\\\\d{2})(\\\\d{3,4})(\\\\d{4})\",\"$1 $2 $3\",[\"16\"]],[\"(\\\\d{2})(\\\\d{4})(\\\\d{4})\",\"$1 $2 $3\",[\"10|23|3(?:[15]|4[57])|4|51\"]],[\"(\\\\d{3})(\\\\d{4})(\\\\d{4})\",\"$1 $2 $3\",[\"34\"]],[\"(\\\\d{2})(\\\\d{4,5})(\\\\d{5})\",\"$1 $2 $3\",[\"[1-35]\"]]],0,0,0,0,0,0,[0,[\"342\\\\d{4}|(?:337|49)\\\\d{6}|(?:3(?:2|47|7\\\\d{3})|50\\\\d{3})\\\\d{7}\",[7,8,9,10,12]],0,0,0,0,0,0,[\"1(?:3(?:0[0347]|[13][0139]|2[035]|4[013568]|6[0459]|7[06]|8[15-8]|9[0689])\\\\d{4}|6\\\\d{5,10})|(?:345\\\\d|9[89])\\\\d{6}|(?:10|2(?:3|85\\\\d)|3(?:[15]|[69]\\\\d\\\\d)|4[15-8]|51)\\\\d{8}\"]]],\"883\":[\"883\",0,\"(?:[1-4]\\\\d|51)\\\\d{6,10}\",[8,9,10,11,12],[[\"(\\\\d{3})(\\\\d{3})(\\\\d{2,8})\",\"$1 $2 $3\",[\"[14]|2[24-689]|3[02-689]|51[24-9]\"]],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"510\"]],[\"(\\\\d{3})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"21\"]],[\"(\\\\d{4})(\\\\d{4})(\\\\d{4})\",\"$1 $2 $3\",[\"51[13]\"]],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3 $4\",[\"[235]\"]]],0,0,0,0,0,0,[0,0,0,0,0,0,0,0,[\"(?:2(?:00\\\\d\\\\d|10)|(?:370[1-9]|51\\\\d0)\\\\d)\\\\d{7}|51(?:00\\\\d{5}|[24-9]0\\\\d{4,7})|(?:1[013-79]|2[24-689]|3[02-689]|4[0-4])0\\\\d{5,9}\"]]],\"888\":[\"888\",0,\"\\\\d{11}\",[11],[[\"(\\\\d{3})(\\\\d{3})(\\\\d{5})\",\"$1 $2 $3\"]],0,0,0,0,0,0,[0,0,0,0,0,0,[\"\\\\d{11}\"]]],\"979\":[\"979\",0,\"[1359]\\\\d{8}\",[9],[[\"(\\\\d)(\\\\d{4})(\\\\d{4})\",\"$1 $2 $3\",[\"[1359]\"]]],0,0,0,0,0,0,[0,0,0,[\"[1359]\\\\d{8}\"]]]}}","// Importing from a \".js\" file is a workaround for Node.js \"ES Modules\"\r\n// importing system which is even uncapable of importing \"*.json\" files.\r\nimport metadata from '../../metadata.mobile.json.js'\r\n\r\nexport default function withMetadataArgument(func, _arguments) {\r\n\tvar args = Array.prototype.slice.call(_arguments)\r\n\targs.push(metadata)\r\n\treturn func.apply(this, args)\r\n}","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"\" + chunkId + \".prod.js\";\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.p = \"/umd/\";","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t826: 0\n};\n\n__webpack_require__.f.j = (chunkId, promises) => {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\n\t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n\t\t\t// a Promise means \"currently loading\".\n\t\t\tif(installedChunkData) {\n\t\t\t\tpromises.push(installedChunkData[2]);\n\t\t\t} else {\n\t\t\t\tif(true) { // all chunks have JS\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise((resolve, reject) => (installedChunkData = installedChunks[chunkId] = [resolve, reject]));\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = (event) => {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t} else installedChunks[chunkId] = 0;\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n// no on chunks loaded\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\n}\n\nvar chunkLoadingGlobal = globalThis[\"webpackChunktinode_webapp\"] = globalThis[\"webpackChunktinode_webapp\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * @fileoverview Firebase constants. Some of these (@defines) can be overridden at compile-time.\r\n */\r\nconst CONSTANTS = {\r\n /**\r\n * @define {boolean} Whether this is the client Node.js SDK.\r\n */\r\n NODE_CLIENT: false,\r\n /**\r\n * @define {boolean} Whether this is the Admin Node.js SDK.\r\n */\r\n NODE_ADMIN: false,\r\n /**\r\n * Firebase SDK Version\r\n */\r\n SDK_VERSION: '${JSCORE_VERSION}'\r\n};\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Throws an error if the provided assertion is falsy\r\n */\r\nconst assert = function (assertion, message) {\r\n if (!assertion) {\r\n throw assertionError(message);\r\n }\r\n};\r\n/**\r\n * Returns an Error object suitable for throwing.\r\n */\r\nconst assertionError = function (message) {\r\n return new Error('Firebase Database (' +\r\n CONSTANTS.SDK_VERSION +\r\n ') INTERNAL ASSERT FAILED: ' +\r\n message);\r\n};\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst stringToByteArray$1 = function (str) {\r\n // TODO(user): Use native implementations if/when available\r\n const out = [];\r\n let p = 0;\r\n for (let i = 0; i < str.length; i++) {\r\n let c = str.charCodeAt(i);\r\n if (c < 128) {\r\n out[p++] = c;\r\n }\r\n else if (c < 2048) {\r\n out[p++] = (c >> 6) | 192;\r\n out[p++] = (c & 63) | 128;\r\n }\r\n else if ((c & 0xfc00) === 0xd800 &&\r\n i + 1 < str.length &&\r\n (str.charCodeAt(i + 1) & 0xfc00) === 0xdc00) {\r\n // Surrogate Pair\r\n c = 0x10000 + ((c & 0x03ff) << 10) + (str.charCodeAt(++i) & 0x03ff);\r\n out[p++] = (c >> 18) | 240;\r\n out[p++] = ((c >> 12) & 63) | 128;\r\n out[p++] = ((c >> 6) & 63) | 128;\r\n out[p++] = (c & 63) | 128;\r\n }\r\n else {\r\n out[p++] = (c >> 12) | 224;\r\n out[p++] = ((c >> 6) & 63) | 128;\r\n out[p++] = (c & 63) | 128;\r\n }\r\n }\r\n return out;\r\n};\r\n/**\r\n * Turns an array of numbers into the string given by the concatenation of the\r\n * characters to which the numbers correspond.\r\n * @param bytes Array of numbers representing characters.\r\n * @return Stringification of the array.\r\n */\r\nconst byteArrayToString = function (bytes) {\r\n // TODO(user): Use native implementations if/when available\r\n const out = [];\r\n let pos = 0, c = 0;\r\n while (pos < bytes.length) {\r\n const c1 = bytes[pos++];\r\n if (c1 < 128) {\r\n out[c++] = String.fromCharCode(c1);\r\n }\r\n else if (c1 > 191 && c1 < 224) {\r\n const c2 = bytes[pos++];\r\n out[c++] = String.fromCharCode(((c1 & 31) << 6) | (c2 & 63));\r\n }\r\n else if (c1 > 239 && c1 < 365) {\r\n // Surrogate Pair\r\n const c2 = bytes[pos++];\r\n const c3 = bytes[pos++];\r\n const c4 = bytes[pos++];\r\n const u = (((c1 & 7) << 18) | ((c2 & 63) << 12) | ((c3 & 63) << 6) | (c4 & 63)) -\r\n 0x10000;\r\n out[c++] = String.fromCharCode(0xd800 + (u >> 10));\r\n out[c++] = String.fromCharCode(0xdc00 + (u & 1023));\r\n }\r\n else {\r\n const c2 = bytes[pos++];\r\n const c3 = bytes[pos++];\r\n out[c++] = String.fromCharCode(((c1 & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));\r\n }\r\n }\r\n return out.join('');\r\n};\r\n// We define it as an object literal instead of a class because a class compiled down to es5 can't\r\n// be treeshaked. https://github.com/rollup/rollup/issues/1691\r\n// Static lookup maps, lazily populated by init_()\r\nconst base64 = {\r\n /**\r\n * Maps bytes to characters.\r\n */\r\n byteToCharMap_: null,\r\n /**\r\n * Maps characters to bytes.\r\n */\r\n charToByteMap_: null,\r\n /**\r\n * Maps bytes to websafe characters.\r\n * @private\r\n */\r\n byteToCharMapWebSafe_: null,\r\n /**\r\n * Maps websafe characters to bytes.\r\n * @private\r\n */\r\n charToByteMapWebSafe_: null,\r\n /**\r\n * Our default alphabet, shared between\r\n * ENCODED_VALS and ENCODED_VALS_WEBSAFE\r\n */\r\n ENCODED_VALS_BASE: 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' + 'abcdefghijklmnopqrstuvwxyz' + '0123456789',\r\n /**\r\n * Our default alphabet. Value 64 (=) is special; it means \"nothing.\"\r\n */\r\n get ENCODED_VALS() {\r\n return this.ENCODED_VALS_BASE + '+/=';\r\n },\r\n /**\r\n * Our websafe alphabet.\r\n */\r\n get ENCODED_VALS_WEBSAFE() {\r\n return this.ENCODED_VALS_BASE + '-_.';\r\n },\r\n /**\r\n * Whether this browser supports the atob and btoa functions. This extension\r\n * started at Mozilla but is now implemented by many browsers. We use the\r\n * ASSUME_* variables to avoid pulling in the full useragent detection library\r\n * but still allowing the standard per-browser compilations.\r\n *\r\n */\r\n HAS_NATIVE_SUPPORT: typeof atob === 'function',\r\n /**\r\n * Base64-encode an array of bytes.\r\n *\r\n * @param input An array of bytes (numbers with\r\n * value in [0, 255]) to encode.\r\n * @param webSafe Boolean indicating we should use the\r\n * alternative alphabet.\r\n * @return The base64 encoded string.\r\n */\r\n encodeByteArray(input, webSafe) {\r\n if (!Array.isArray(input)) {\r\n throw Error('encodeByteArray takes an array as a parameter');\r\n }\r\n this.init_();\r\n const byteToCharMap = webSafe\r\n ? this.byteToCharMapWebSafe_\r\n : this.byteToCharMap_;\r\n const output = [];\r\n for (let i = 0; i < input.length; i += 3) {\r\n const byte1 = input[i];\r\n const haveByte2 = i + 1 < input.length;\r\n const byte2 = haveByte2 ? input[i + 1] : 0;\r\n const haveByte3 = i + 2 < input.length;\r\n const byte3 = haveByte3 ? input[i + 2] : 0;\r\n const outByte1 = byte1 >> 2;\r\n const outByte2 = ((byte1 & 0x03) << 4) | (byte2 >> 4);\r\n let outByte3 = ((byte2 & 0x0f) << 2) | (byte3 >> 6);\r\n let outByte4 = byte3 & 0x3f;\r\n if (!haveByte3) {\r\n outByte4 = 64;\r\n if (!haveByte2) {\r\n outByte3 = 64;\r\n }\r\n }\r\n output.push(byteToCharMap[outByte1], byteToCharMap[outByte2], byteToCharMap[outByte3], byteToCharMap[outByte4]);\r\n }\r\n return output.join('');\r\n },\r\n /**\r\n * Base64-encode a string.\r\n *\r\n * @param input A string to encode.\r\n * @param webSafe If true, we should use the\r\n * alternative alphabet.\r\n * @return The base64 encoded string.\r\n */\r\n encodeString(input, webSafe) {\r\n // Shortcut for Mozilla browsers that implement\r\n // a native base64 encoder in the form of \"btoa/atob\"\r\n if (this.HAS_NATIVE_SUPPORT && !webSafe) {\r\n return btoa(input);\r\n }\r\n return this.encodeByteArray(stringToByteArray$1(input), webSafe);\r\n },\r\n /**\r\n * Base64-decode a string.\r\n *\r\n * @param input to decode.\r\n * @param webSafe True if we should use the\r\n * alternative alphabet.\r\n * @return string representing the decoded value.\r\n */\r\n decodeString(input, webSafe) {\r\n // Shortcut for Mozilla browsers that implement\r\n // a native base64 encoder in the form of \"btoa/atob\"\r\n if (this.HAS_NATIVE_SUPPORT && !webSafe) {\r\n return atob(input);\r\n }\r\n return byteArrayToString(this.decodeStringToByteArray(input, webSafe));\r\n },\r\n /**\r\n * Base64-decode a string.\r\n *\r\n * In base-64 decoding, groups of four characters are converted into three\r\n * bytes. If the encoder did not apply padding, the input length may not\r\n * be a multiple of 4.\r\n *\r\n * In this case, the last group will have fewer than 4 characters, and\r\n * padding will be inferred. If the group has one or two characters, it decodes\r\n * to one byte. If the group has three characters, it decodes to two bytes.\r\n *\r\n * @param input Input to decode.\r\n * @param webSafe True if we should use the web-safe alphabet.\r\n * @return bytes representing the decoded value.\r\n */\r\n decodeStringToByteArray(input, webSafe) {\r\n this.init_();\r\n const charToByteMap = webSafe\r\n ? this.charToByteMapWebSafe_\r\n : this.charToByteMap_;\r\n const output = [];\r\n for (let i = 0; i < input.length;) {\r\n const byte1 = charToByteMap[input.charAt(i++)];\r\n const haveByte2 = i < input.length;\r\n const byte2 = haveByte2 ? charToByteMap[input.charAt(i)] : 0;\r\n ++i;\r\n const haveByte3 = i < input.length;\r\n const byte3 = haveByte3 ? charToByteMap[input.charAt(i)] : 64;\r\n ++i;\r\n const haveByte4 = i < input.length;\r\n const byte4 = haveByte4 ? charToByteMap[input.charAt(i)] : 64;\r\n ++i;\r\n if (byte1 == null || byte2 == null || byte3 == null || byte4 == null) {\r\n throw Error();\r\n }\r\n const outByte1 = (byte1 << 2) | (byte2 >> 4);\r\n output.push(outByte1);\r\n if (byte3 !== 64) {\r\n const outByte2 = ((byte2 << 4) & 0xf0) | (byte3 >> 2);\r\n output.push(outByte2);\r\n if (byte4 !== 64) {\r\n const outByte3 = ((byte3 << 6) & 0xc0) | byte4;\r\n output.push(outByte3);\r\n }\r\n }\r\n }\r\n return output;\r\n },\r\n /**\r\n * Lazy static initialization function. Called before\r\n * accessing any of the static map variables.\r\n * @private\r\n */\r\n init_() {\r\n if (!this.byteToCharMap_) {\r\n this.byteToCharMap_ = {};\r\n this.charToByteMap_ = {};\r\n this.byteToCharMapWebSafe_ = {};\r\n this.charToByteMapWebSafe_ = {};\r\n // We want quick mappings back and forth, so we precompute two maps.\r\n for (let i = 0; i < this.ENCODED_VALS.length; i++) {\r\n this.byteToCharMap_[i] = this.ENCODED_VALS.charAt(i);\r\n this.charToByteMap_[this.byteToCharMap_[i]] = i;\r\n this.byteToCharMapWebSafe_[i] = this.ENCODED_VALS_WEBSAFE.charAt(i);\r\n this.charToByteMapWebSafe_[this.byteToCharMapWebSafe_[i]] = i;\r\n // Be forgiving when decoding and correctly decode both encodings.\r\n if (i >= this.ENCODED_VALS_BASE.length) {\r\n this.charToByteMap_[this.ENCODED_VALS_WEBSAFE.charAt(i)] = i;\r\n this.charToByteMapWebSafe_[this.ENCODED_VALS.charAt(i)] = i;\r\n }\r\n }\r\n }\r\n }\r\n};\r\n/**\r\n * URL-safe base64 encoding\r\n */\r\nconst base64Encode = function (str) {\r\n const utf8Bytes = stringToByteArray$1(str);\r\n return base64.encodeByteArray(utf8Bytes, true);\r\n};\r\n/**\r\n * URL-safe base64 encoding (without \".\" padding in the end).\r\n * e.g. Used in JSON Web Token (JWT) parts.\r\n */\r\nconst base64urlEncodeWithoutPadding = function (str) {\r\n // Use base64url encoding and remove padding in the end (dot characters).\r\n return base64Encode(str).replace(/\\./g, '');\r\n};\r\n/**\r\n * URL-safe base64 decoding\r\n *\r\n * NOTE: DO NOT use the global atob() function - it does NOT support the\r\n * base64Url variant encoding.\r\n *\r\n * @param str To be decoded\r\n * @return Decoded result, if possible\r\n */\r\nconst base64Decode = function (str) {\r\n try {\r\n return base64.decodeString(str, true);\r\n }\r\n catch (e) {\r\n console.error('base64Decode failed: ', e);\r\n }\r\n return null;\r\n};\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Do a deep-copy of basic JavaScript Objects or Arrays.\r\n */\r\nfunction deepCopy(value) {\r\n return deepExtend(undefined, value);\r\n}\r\n/**\r\n * Copy properties from source to target (recursively allows extension\r\n * of Objects and Arrays). Scalar values in the target are over-written.\r\n * If target is undefined, an object of the appropriate type will be created\r\n * (and returned).\r\n *\r\n * We recursively copy all child properties of plain Objects in the source- so\r\n * that namespace- like dictionaries are merged.\r\n *\r\n * Note that the target can be a function, in which case the properties in\r\n * the source Object are copied onto it as static properties of the Function.\r\n *\r\n * Note: we don't merge __proto__ to prevent prototype pollution\r\n */\r\nfunction deepExtend(target, source) {\r\n if (!(source instanceof Object)) {\r\n return source;\r\n }\r\n switch (source.constructor) {\r\n case Date:\r\n // Treat Dates like scalars; if the target date object had any child\r\n // properties - they will be lost!\r\n const dateValue = source;\r\n return new Date(dateValue.getTime());\r\n case Object:\r\n if (target === undefined) {\r\n target = {};\r\n }\r\n break;\r\n case Array:\r\n // Always copy the array source and overwrite the target.\r\n target = [];\r\n break;\r\n default:\r\n // Not a plain Object - treat it as a scalar.\r\n return source;\r\n }\r\n for (const prop in source) {\r\n // use isValidKey to guard against prototype pollution. See https://snyk.io/vuln/SNYK-JS-LODASH-450202\r\n if (!source.hasOwnProperty(prop) || !isValidKey(prop)) {\r\n continue;\r\n }\r\n target[prop] = deepExtend(target[prop], source[prop]);\r\n }\r\n return target;\r\n}\r\nfunction isValidKey(key) {\r\n return key !== '__proto__';\r\n}\n\n/**\r\n * @license\r\n * Copyright 2022 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Polyfill for `globalThis` object.\r\n * @returns the `globalThis` object for the given environment.\r\n * @public\r\n */\r\nfunction getGlobal() {\r\n if (typeof self !== 'undefined') {\r\n return self;\r\n }\r\n if (typeof window !== 'undefined') {\r\n return window;\r\n }\r\n if (typeof global !== 'undefined') {\r\n return global;\r\n }\r\n throw new Error('Unable to locate global object.');\r\n}\n\n/**\r\n * @license\r\n * Copyright 2022 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst getDefaultsFromGlobal = () => getGlobal().__FIREBASE_DEFAULTS__;\r\n/**\r\n * Attempt to read defaults from a JSON string provided to\r\n * process(.)env(.)__FIREBASE_DEFAULTS__ or a JSON file whose path is in\r\n * process(.)env(.)__FIREBASE_DEFAULTS_PATH__\r\n * The dots are in parens because certain compilers (Vite?) cannot\r\n * handle seeing that variable in comments.\r\n * See https://github.com/firebase/firebase-js-sdk/issues/6838\r\n */\r\nconst getDefaultsFromEnvVariable = () => {\r\n if (typeof process === 'undefined' || typeof process.env === 'undefined') {\r\n return;\r\n }\r\n const defaultsJsonString = process.env.__FIREBASE_DEFAULTS__;\r\n if (defaultsJsonString) {\r\n return JSON.parse(defaultsJsonString);\r\n }\r\n};\r\nconst getDefaultsFromCookie = () => {\r\n if (typeof document === 'undefined') {\r\n return;\r\n }\r\n let match;\r\n try {\r\n match = document.cookie.match(/__FIREBASE_DEFAULTS__=([^;]+)/);\r\n }\r\n catch (e) {\r\n // Some environments such as Angular Universal SSR have a\r\n // `document` object but error on accessing `document.cookie`.\r\n return;\r\n }\r\n const decoded = match && base64Decode(match[1]);\r\n return decoded && JSON.parse(decoded);\r\n};\r\n/**\r\n * Get the __FIREBASE_DEFAULTS__ object. It checks in order:\r\n * (1) if such an object exists as a property of `globalThis`\r\n * (2) if such an object was provided on a shell environment variable\r\n * (3) if such an object exists in a cookie\r\n * @public\r\n */\r\nconst getDefaults = () => {\r\n try {\r\n return (getDefaultsFromGlobal() ||\r\n getDefaultsFromEnvVariable() ||\r\n getDefaultsFromCookie());\r\n }\r\n catch (e) {\r\n /**\r\n * Catch-all for being unable to get __FIREBASE_DEFAULTS__ due\r\n * to any environment case we have not accounted for. Log to\r\n * info instead of swallowing so we can find these unknown cases\r\n * and add paths for them if needed.\r\n */\r\n console.info(`Unable to get __FIREBASE_DEFAULTS__ due to: ${e}`);\r\n return;\r\n }\r\n};\r\n/**\r\n * Returns emulator host stored in the __FIREBASE_DEFAULTS__ object\r\n * for the given product.\r\n * @returns a URL host formatted like `127.0.0.1:9999` or `[::1]:4000` if available\r\n * @public\r\n */\r\nconst getDefaultEmulatorHost = (productName) => { var _a, _b; return (_b = (_a = getDefaults()) === null || _a === void 0 ? void 0 : _a.emulatorHosts) === null || _b === void 0 ? void 0 : _b[productName]; };\r\n/**\r\n * Returns emulator hostname and port stored in the __FIREBASE_DEFAULTS__ object\r\n * for the given product.\r\n * @returns a pair of hostname and port like `[\"::1\", 4000]` if available\r\n * @public\r\n */\r\nconst getDefaultEmulatorHostnameAndPort = (productName) => {\r\n const host = getDefaultEmulatorHost(productName);\r\n if (!host) {\r\n return undefined;\r\n }\r\n const separatorIndex = host.lastIndexOf(':'); // Finding the last since IPv6 addr also has colons.\r\n if (separatorIndex <= 0 || separatorIndex + 1 === host.length) {\r\n throw new Error(`Invalid host ${host} with no separate hostname and port!`);\r\n }\r\n // eslint-disable-next-line no-restricted-globals\r\n const port = parseInt(host.substring(separatorIndex + 1), 10);\r\n if (host[0] === '[') {\r\n // Bracket-quoted `[ipv6addr]:port` => return \"ipv6addr\" (without brackets).\r\n return [host.substring(1, separatorIndex - 1), port];\r\n }\r\n else {\r\n return [host.substring(0, separatorIndex), port];\r\n }\r\n};\r\n/**\r\n * Returns Firebase app config stored in the __FIREBASE_DEFAULTS__ object.\r\n * @public\r\n */\r\nconst getDefaultAppConfig = () => { var _a; return (_a = getDefaults()) === null || _a === void 0 ? void 0 : _a.config; };\r\n/**\r\n * Returns an experimental setting on the __FIREBASE_DEFAULTS__ object (properties\r\n * prefixed by \"_\")\r\n * @public\r\n */\r\nconst getExperimentalSetting = (name) => { var _a; return (_a = getDefaults()) === null || _a === void 0 ? void 0 : _a[`_${name}`]; };\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nclass Deferred {\r\n constructor() {\r\n this.reject = () => { };\r\n this.resolve = () => { };\r\n this.promise = new Promise((resolve, reject) => {\r\n this.resolve = resolve;\r\n this.reject = reject;\r\n });\r\n }\r\n /**\r\n * Our API internals are not promiseified and cannot because our callback APIs have subtle expectations around\r\n * invoking promises inline, which Promises are forbidden to do. This method accepts an optional node-style callback\r\n * and returns a node-style callback which will resolve or reject the Deferred's promise.\r\n */\r\n wrapCallback(callback) {\r\n return (error, value) => {\r\n if (error) {\r\n this.reject(error);\r\n }\r\n else {\r\n this.resolve(value);\r\n }\r\n if (typeof callback === 'function') {\r\n // Attaching noop handler just in case developer wasn't expecting\r\n // promises\r\n this.promise.catch(() => { });\r\n // Some of our callbacks don't expect a value and our own tests\r\n // assert that the parameter length is 1\r\n if (callback.length === 1) {\r\n callback(error);\r\n }\r\n else {\r\n callback(error, value);\r\n }\r\n }\r\n };\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2021 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction createMockUserToken(token, projectId) {\r\n if (token.uid) {\r\n throw new Error('The \"uid\" field is no longer supported by mockUserToken. Please use \"sub\" instead for Firebase Auth User ID.');\r\n }\r\n // Unsecured JWTs use \"none\" as the algorithm.\r\n const header = {\r\n alg: 'none',\r\n type: 'JWT'\r\n };\r\n const project = projectId || 'demo-project';\r\n const iat = token.iat || 0;\r\n const sub = token.sub || token.user_id;\r\n if (!sub) {\r\n throw new Error(\"mockUserToken must contain 'sub' or 'user_id' field!\");\r\n }\r\n const payload = Object.assign({ \r\n // Set all required fields to decent defaults\r\n iss: `https://securetoken.google.com/${project}`, aud: project, iat, exp: iat + 3600, auth_time: iat, sub, user_id: sub, firebase: {\r\n sign_in_provider: 'custom',\r\n identities: {}\r\n } }, token);\r\n // Unsecured JWTs use the empty string as a signature.\r\n const signature = '';\r\n return [\r\n base64urlEncodeWithoutPadding(JSON.stringify(header)),\r\n base64urlEncodeWithoutPadding(JSON.stringify(payload)),\r\n signature\r\n ].join('.');\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Returns navigator.userAgent string or '' if it's not defined.\r\n * @return user agent string\r\n */\r\nfunction getUA() {\r\n if (typeof navigator !== 'undefined' &&\r\n typeof navigator['userAgent'] === 'string') {\r\n return navigator['userAgent'];\r\n }\r\n else {\r\n return '';\r\n }\r\n}\r\n/**\r\n * Detect Cordova / PhoneGap / Ionic frameworks on a mobile device.\r\n *\r\n * Deliberately does not rely on checking `file://` URLs (as this fails PhoneGap\r\n * in the Ripple emulator) nor Cordova `onDeviceReady`, which would normally\r\n * wait for a callback.\r\n */\r\nfunction isMobileCordova() {\r\n return (typeof window !== 'undefined' &&\r\n // @ts-ignore Setting up an broadly applicable index signature for Window\r\n // just to deal with this case would probably be a bad idea.\r\n !!(window['cordova'] || window['phonegap'] || window['PhoneGap']) &&\r\n /ios|iphone|ipod|ipad|android|blackberry|iemobile/i.test(getUA()));\r\n}\r\n/**\r\n * Detect Node.js.\r\n *\r\n * @return true if Node.js environment is detected or specified.\r\n */\r\n// Node detection logic from: https://github.com/iliakan/detect-node/\r\nfunction isNode() {\r\n var _a;\r\n const forceEnvironment = (_a = getDefaults()) === null || _a === void 0 ? void 0 : _a.forceEnvironment;\r\n if (forceEnvironment === 'node') {\r\n return true;\r\n }\r\n else if (forceEnvironment === 'browser') {\r\n return false;\r\n }\r\n try {\r\n return (Object.prototype.toString.call(global.process) === '[object process]');\r\n }\r\n catch (e) {\r\n return false;\r\n }\r\n}\r\n/**\r\n * Detect Browser Environment\r\n */\r\nfunction isBrowser() {\r\n return typeof self === 'object' && self.self === self;\r\n}\r\nfunction isBrowserExtension() {\r\n const runtime = typeof chrome === 'object'\r\n ? chrome.runtime\r\n : typeof browser === 'object'\r\n ? browser.runtime\r\n : undefined;\r\n return typeof runtime === 'object' && runtime.id !== undefined;\r\n}\r\n/**\r\n * Detect React Native.\r\n *\r\n * @return true if ReactNative environment is detected.\r\n */\r\nfunction isReactNative() {\r\n return (typeof navigator === 'object' && navigator['product'] === 'ReactNative');\r\n}\r\n/** Detects Electron apps. */\r\nfunction isElectron() {\r\n return getUA().indexOf('Electron/') >= 0;\r\n}\r\n/** Detects Internet Explorer. */\r\nfunction isIE() {\r\n const ua = getUA();\r\n return ua.indexOf('MSIE ') >= 0 || ua.indexOf('Trident/') >= 0;\r\n}\r\n/** Detects Universal Windows Platform apps. */\r\nfunction isUWP() {\r\n return getUA().indexOf('MSAppHost/') >= 0;\r\n}\r\n/**\r\n * Detect whether the current SDK build is the Node version.\r\n *\r\n * @return true if it's the Node SDK build.\r\n */\r\nfunction isNodeSdk() {\r\n return CONSTANTS.NODE_CLIENT === true || CONSTANTS.NODE_ADMIN === true;\r\n}\r\n/** Returns true if we are running in Safari. */\r\nfunction isSafari() {\r\n return (!isNode() &&\r\n navigator.userAgent.includes('Safari') &&\r\n !navigator.userAgent.includes('Chrome'));\r\n}\r\n/**\r\n * This method checks if indexedDB is supported by current browser/service worker context\r\n * @return true if indexedDB is supported by current browser/service worker context\r\n */\r\nfunction isIndexedDBAvailable() {\r\n try {\r\n return typeof indexedDB === 'object';\r\n }\r\n catch (e) {\r\n return false;\r\n }\r\n}\r\n/**\r\n * This method validates browser/sw context for indexedDB by opening a dummy indexedDB database and reject\r\n * if errors occur during the database open operation.\r\n *\r\n * @throws exception if current browser/sw context can't run idb.open (ex: Safari iframe, Firefox\r\n * private browsing)\r\n */\r\nfunction validateIndexedDBOpenable() {\r\n return new Promise((resolve, reject) => {\r\n try {\r\n let preExist = true;\r\n const DB_CHECK_NAME = 'validate-browser-context-for-indexeddb-analytics-module';\r\n const request = self.indexedDB.open(DB_CHECK_NAME);\r\n request.onsuccess = () => {\r\n request.result.close();\r\n // delete database only when it doesn't pre-exist\r\n if (!preExist) {\r\n self.indexedDB.deleteDatabase(DB_CHECK_NAME);\r\n }\r\n resolve(true);\r\n };\r\n request.onupgradeneeded = () => {\r\n preExist = false;\r\n };\r\n request.onerror = () => {\r\n var _a;\r\n reject(((_a = request.error) === null || _a === void 0 ? void 0 : _a.message) || '');\r\n };\r\n }\r\n catch (error) {\r\n reject(error);\r\n }\r\n });\r\n}\r\n/**\r\n *\r\n * This method checks whether cookie is enabled within current browser\r\n * @return true if cookie is enabled within current browser\r\n */\r\nfunction areCookiesEnabled() {\r\n if (typeof navigator === 'undefined' || !navigator.cookieEnabled) {\r\n return false;\r\n }\r\n return true;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * @fileoverview Standardized Firebase Error.\r\n *\r\n * Usage:\r\n *\r\n * // Typescript string literals for type-safe codes\r\n * type Err =\r\n * 'unknown' |\r\n * 'object-not-found'\r\n * ;\r\n *\r\n * // Closure enum for type-safe error codes\r\n * // at-enum {string}\r\n * var Err = {\r\n * UNKNOWN: 'unknown',\r\n * OBJECT_NOT_FOUND: 'object-not-found',\r\n * }\r\n *\r\n * let errors: Map = {\r\n * 'generic-error': \"Unknown error\",\r\n * 'file-not-found': \"Could not find file: {$file}\",\r\n * };\r\n *\r\n * // Type-safe function - must pass a valid error code as param.\r\n * let error = new ErrorFactory('service', 'Service', errors);\r\n *\r\n * ...\r\n * throw error.create(Err.GENERIC);\r\n * ...\r\n * throw error.create(Err.FILE_NOT_FOUND, {'file': fileName});\r\n * ...\r\n * // Service: Could not file file: foo.txt (service/file-not-found).\r\n *\r\n * catch (e) {\r\n * assert(e.message === \"Could not find file: foo.txt.\");\r\n * if ((e as FirebaseError)?.code === 'service/file-not-found') {\r\n * console.log(\"Could not read file: \" + e['file']);\r\n * }\r\n * }\r\n */\r\nconst ERROR_NAME = 'FirebaseError';\r\n// Based on code from:\r\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error#Custom_Error_Types\r\nclass FirebaseError extends Error {\r\n constructor(\r\n /** The error code for this error. */\r\n code, message, \r\n /** Custom data for this error. */\r\n customData) {\r\n super(message);\r\n this.code = code;\r\n this.customData = customData;\r\n /** The custom name for all FirebaseErrors. */\r\n this.name = ERROR_NAME;\r\n // Fix For ES5\r\n // https://github.com/Microsoft/TypeScript-wiki/blob/master/Breaking-Changes.md#extending-built-ins-like-error-array-and-map-may-no-longer-work\r\n Object.setPrototypeOf(this, FirebaseError.prototype);\r\n // Maintains proper stack trace for where our error was thrown.\r\n // Only available on V8.\r\n if (Error.captureStackTrace) {\r\n Error.captureStackTrace(this, ErrorFactory.prototype.create);\r\n }\r\n }\r\n}\r\nclass ErrorFactory {\r\n constructor(service, serviceName, errors) {\r\n this.service = service;\r\n this.serviceName = serviceName;\r\n this.errors = errors;\r\n }\r\n create(code, ...data) {\r\n const customData = data[0] || {};\r\n const fullCode = `${this.service}/${code}`;\r\n const template = this.errors[code];\r\n const message = template ? replaceTemplate(template, customData) : 'Error';\r\n // Service Name: Error message (service/code).\r\n const fullMessage = `${this.serviceName}: ${message} (${fullCode}).`;\r\n const error = new FirebaseError(fullCode, fullMessage, customData);\r\n return error;\r\n }\r\n}\r\nfunction replaceTemplate(template, data) {\r\n return template.replace(PATTERN, (_, key) => {\r\n const value = data[key];\r\n return value != null ? String(value) : `<${key}?>`;\r\n });\r\n}\r\nconst PATTERN = /\\{\\$([^}]+)}/g;\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Evaluates a JSON string into a javascript object.\r\n *\r\n * @param {string} str A string containing JSON.\r\n * @return {*} The javascript object representing the specified JSON.\r\n */\r\nfunction jsonEval(str) {\r\n return JSON.parse(str);\r\n}\r\n/**\r\n * Returns JSON representing a javascript object.\r\n * @param {*} data Javascript object to be stringified.\r\n * @return {string} The JSON contents of the object.\r\n */\r\nfunction stringify(data) {\r\n return JSON.stringify(data);\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Decodes a Firebase auth. token into constituent parts.\r\n *\r\n * Notes:\r\n * - May return with invalid / incomplete claims if there's no native base64 decoding support.\r\n * - Doesn't check if the token is actually valid.\r\n */\r\nconst decode = function (token) {\r\n let header = {}, claims = {}, data = {}, signature = '';\r\n try {\r\n const parts = token.split('.');\r\n header = jsonEval(base64Decode(parts[0]) || '');\r\n claims = jsonEval(base64Decode(parts[1]) || '');\r\n signature = parts[2];\r\n data = claims['d'] || {};\r\n delete claims['d'];\r\n }\r\n catch (e) { }\r\n return {\r\n header,\r\n claims,\r\n data,\r\n signature\r\n };\r\n};\r\n/**\r\n * Decodes a Firebase auth. token and checks the validity of its time-based claims. Will return true if the\r\n * token is within the time window authorized by the 'nbf' (not-before) and 'iat' (issued-at) claims.\r\n *\r\n * Notes:\r\n * - May return a false negative if there's no native base64 decoding support.\r\n * - Doesn't check if the token is actually valid.\r\n */\r\nconst isValidTimestamp = function (token) {\r\n const claims = decode(token).claims;\r\n const now = Math.floor(new Date().getTime() / 1000);\r\n let validSince = 0, validUntil = 0;\r\n if (typeof claims === 'object') {\r\n if (claims.hasOwnProperty('nbf')) {\r\n validSince = claims['nbf'];\r\n }\r\n else if (claims.hasOwnProperty('iat')) {\r\n validSince = claims['iat'];\r\n }\r\n if (claims.hasOwnProperty('exp')) {\r\n validUntil = claims['exp'];\r\n }\r\n else {\r\n // token will expire after 24h by default\r\n validUntil = validSince + 86400;\r\n }\r\n }\r\n return (!!now &&\r\n !!validSince &&\r\n !!validUntil &&\r\n now >= validSince &&\r\n now <= validUntil);\r\n};\r\n/**\r\n * Decodes a Firebase auth. token and returns its issued at time if valid, null otherwise.\r\n *\r\n * Notes:\r\n * - May return null if there's no native base64 decoding support.\r\n * - Doesn't check if the token is actually valid.\r\n */\r\nconst issuedAtTime = function (token) {\r\n const claims = decode(token).claims;\r\n if (typeof claims === 'object' && claims.hasOwnProperty('iat')) {\r\n return claims['iat'];\r\n }\r\n return null;\r\n};\r\n/**\r\n * Decodes a Firebase auth. token and checks the validity of its format. Expects a valid issued-at time.\r\n *\r\n * Notes:\r\n * - May return a false negative if there's no native base64 decoding support.\r\n * - Doesn't check if the token is actually valid.\r\n */\r\nconst isValidFormat = function (token) {\r\n const decoded = decode(token), claims = decoded.claims;\r\n return !!claims && typeof claims === 'object' && claims.hasOwnProperty('iat');\r\n};\r\n/**\r\n * Attempts to peer into an auth token and determine if it's an admin auth token by looking at the claims portion.\r\n *\r\n * Notes:\r\n * - May return a false negative if there's no native base64 decoding support.\r\n * - Doesn't check if the token is actually valid.\r\n */\r\nconst isAdmin = function (token) {\r\n const claims = decode(token).claims;\r\n return typeof claims === 'object' && claims['admin'] === true;\r\n};\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction contains(obj, key) {\r\n return Object.prototype.hasOwnProperty.call(obj, key);\r\n}\r\nfunction safeGet(obj, key) {\r\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\r\n return obj[key];\r\n }\r\n else {\r\n return undefined;\r\n }\r\n}\r\nfunction isEmpty(obj) {\r\n for (const key in obj) {\r\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n}\r\nfunction map(obj, fn, contextObj) {\r\n const res = {};\r\n for (const key in obj) {\r\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\r\n res[key] = fn.call(contextObj, obj[key], key, obj);\r\n }\r\n }\r\n return res;\r\n}\r\n/**\r\n * Deep equal two objects. Support Arrays and Objects.\r\n */\r\nfunction deepEqual(a, b) {\r\n if (a === b) {\r\n return true;\r\n }\r\n const aKeys = Object.keys(a);\r\n const bKeys = Object.keys(b);\r\n for (const k of aKeys) {\r\n if (!bKeys.includes(k)) {\r\n return false;\r\n }\r\n const aProp = a[k];\r\n const bProp = b[k];\r\n if (isObject(aProp) && isObject(bProp)) {\r\n if (!deepEqual(aProp, bProp)) {\r\n return false;\r\n }\r\n }\r\n else if (aProp !== bProp) {\r\n return false;\r\n }\r\n }\r\n for (const k of bKeys) {\r\n if (!aKeys.includes(k)) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n}\r\nfunction isObject(thing) {\r\n return thing !== null && typeof thing === 'object';\r\n}\n\n/**\r\n * @license\r\n * Copyright 2022 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Rejects if the given promise doesn't resolve in timeInMS milliseconds.\r\n * @internal\r\n */\r\nfunction promiseWithTimeout(promise, timeInMS = 2000) {\r\n const deferredPromise = new Deferred();\r\n setTimeout(() => deferredPromise.reject('timeout!'), timeInMS);\r\n promise.then(deferredPromise.resolve, deferredPromise.reject);\r\n return deferredPromise.promise;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Returns a querystring-formatted string (e.g. &arg=val&arg2=val2) from a\r\n * params object (e.g. {arg: 'val', arg2: 'val2'})\r\n * Note: You must prepend it with ? when adding it to a URL.\r\n */\r\nfunction querystring(querystringParams) {\r\n const params = [];\r\n for (const [key, value] of Object.entries(querystringParams)) {\r\n if (Array.isArray(value)) {\r\n value.forEach(arrayVal => {\r\n params.push(encodeURIComponent(key) + '=' + encodeURIComponent(arrayVal));\r\n });\r\n }\r\n else {\r\n params.push(encodeURIComponent(key) + '=' + encodeURIComponent(value));\r\n }\r\n }\r\n return params.length ? '&' + params.join('&') : '';\r\n}\r\n/**\r\n * Decodes a querystring (e.g. ?arg=val&arg2=val2) into a params object\r\n * (e.g. {arg: 'val', arg2: 'val2'})\r\n */\r\nfunction querystringDecode(querystring) {\r\n const obj = {};\r\n const tokens = querystring.replace(/^\\?/, '').split('&');\r\n tokens.forEach(token => {\r\n if (token) {\r\n const [key, value] = token.split('=');\r\n obj[decodeURIComponent(key)] = decodeURIComponent(value);\r\n }\r\n });\r\n return obj;\r\n}\r\n/**\r\n * Extract the query string part of a URL, including the leading question mark (if present).\r\n */\r\nfunction extractQuerystring(url) {\r\n const queryStart = url.indexOf('?');\r\n if (!queryStart) {\r\n return '';\r\n }\r\n const fragmentStart = url.indexOf('#', queryStart);\r\n return url.substring(queryStart, fragmentStart > 0 ? fragmentStart : undefined);\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * @fileoverview SHA-1 cryptographic hash.\r\n * Variable names follow the notation in FIPS PUB 180-3:\r\n * http://csrc.nist.gov/publications/fips/fips180-3/fips180-3_final.pdf.\r\n *\r\n * Usage:\r\n * var sha1 = new sha1();\r\n * sha1.update(bytes);\r\n * var hash = sha1.digest();\r\n *\r\n * Performance:\r\n * Chrome 23: ~400 Mbit/s\r\n * Firefox 16: ~250 Mbit/s\r\n *\r\n */\r\n/**\r\n * SHA-1 cryptographic hash constructor.\r\n *\r\n * The properties declared here are discussed in the above algorithm document.\r\n * @constructor\r\n * @final\r\n * @struct\r\n */\r\nclass Sha1 {\r\n constructor() {\r\n /**\r\n * Holds the previous values of accumulated variables a-e in the compress_\r\n * function.\r\n * @private\r\n */\r\n this.chain_ = [];\r\n /**\r\n * A buffer holding the partially computed hash result.\r\n * @private\r\n */\r\n this.buf_ = [];\r\n /**\r\n * An array of 80 bytes, each a part of the message to be hashed. Referred to\r\n * as the message schedule in the docs.\r\n * @private\r\n */\r\n this.W_ = [];\r\n /**\r\n * Contains data needed to pad messages less than 64 bytes.\r\n * @private\r\n */\r\n this.pad_ = [];\r\n /**\r\n * @private {number}\r\n */\r\n this.inbuf_ = 0;\r\n /**\r\n * @private {number}\r\n */\r\n this.total_ = 0;\r\n this.blockSize = 512 / 8;\r\n this.pad_[0] = 128;\r\n for (let i = 1; i < this.blockSize; ++i) {\r\n this.pad_[i] = 0;\r\n }\r\n this.reset();\r\n }\r\n reset() {\r\n this.chain_[0] = 0x67452301;\r\n this.chain_[1] = 0xefcdab89;\r\n this.chain_[2] = 0x98badcfe;\r\n this.chain_[3] = 0x10325476;\r\n this.chain_[4] = 0xc3d2e1f0;\r\n this.inbuf_ = 0;\r\n this.total_ = 0;\r\n }\r\n /**\r\n * Internal compress helper function.\r\n * @param buf Block to compress.\r\n * @param offset Offset of the block in the buffer.\r\n * @private\r\n */\r\n compress_(buf, offset) {\r\n if (!offset) {\r\n offset = 0;\r\n }\r\n const W = this.W_;\r\n // get 16 big endian words\r\n if (typeof buf === 'string') {\r\n for (let i = 0; i < 16; i++) {\r\n // TODO(user): [bug 8140122] Recent versions of Safari for Mac OS and iOS\r\n // have a bug that turns the post-increment ++ operator into pre-increment\r\n // during JIT compilation. We have code that depends heavily on SHA-1 for\r\n // correctness and which is affected by this bug, so I've removed all uses\r\n // of post-increment ++ in which the result value is used. We can revert\r\n // this change once the Safari bug\r\n // (https://bugs.webkit.org/show_bug.cgi?id=109036) has been fixed and\r\n // most clients have been updated.\r\n W[i] =\r\n (buf.charCodeAt(offset) << 24) |\r\n (buf.charCodeAt(offset + 1) << 16) |\r\n (buf.charCodeAt(offset + 2) << 8) |\r\n buf.charCodeAt(offset + 3);\r\n offset += 4;\r\n }\r\n }\r\n else {\r\n for (let i = 0; i < 16; i++) {\r\n W[i] =\r\n (buf[offset] << 24) |\r\n (buf[offset + 1] << 16) |\r\n (buf[offset + 2] << 8) |\r\n buf[offset + 3];\r\n offset += 4;\r\n }\r\n }\r\n // expand to 80 words\r\n for (let i = 16; i < 80; i++) {\r\n const t = W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16];\r\n W[i] = ((t << 1) | (t >>> 31)) & 0xffffffff;\r\n }\r\n let a = this.chain_[0];\r\n let b = this.chain_[1];\r\n let c = this.chain_[2];\r\n let d = this.chain_[3];\r\n let e = this.chain_[4];\r\n let f, k;\r\n // TODO(user): Try to unroll this loop to speed up the computation.\r\n for (let i = 0; i < 80; i++) {\r\n if (i < 40) {\r\n if (i < 20) {\r\n f = d ^ (b & (c ^ d));\r\n k = 0x5a827999;\r\n }\r\n else {\r\n f = b ^ c ^ d;\r\n k = 0x6ed9eba1;\r\n }\r\n }\r\n else {\r\n if (i < 60) {\r\n f = (b & c) | (d & (b | c));\r\n k = 0x8f1bbcdc;\r\n }\r\n else {\r\n f = b ^ c ^ d;\r\n k = 0xca62c1d6;\r\n }\r\n }\r\n const t = (((a << 5) | (a >>> 27)) + f + e + k + W[i]) & 0xffffffff;\r\n e = d;\r\n d = c;\r\n c = ((b << 30) | (b >>> 2)) & 0xffffffff;\r\n b = a;\r\n a = t;\r\n }\r\n this.chain_[0] = (this.chain_[0] + a) & 0xffffffff;\r\n this.chain_[1] = (this.chain_[1] + b) & 0xffffffff;\r\n this.chain_[2] = (this.chain_[2] + c) & 0xffffffff;\r\n this.chain_[3] = (this.chain_[3] + d) & 0xffffffff;\r\n this.chain_[4] = (this.chain_[4] + e) & 0xffffffff;\r\n }\r\n update(bytes, length) {\r\n // TODO(johnlenz): tighten the function signature and remove this check\r\n if (bytes == null) {\r\n return;\r\n }\r\n if (length === undefined) {\r\n length = bytes.length;\r\n }\r\n const lengthMinusBlock = length - this.blockSize;\r\n let n = 0;\r\n // Using local instead of member variables gives ~5% speedup on Firefox 16.\r\n const buf = this.buf_;\r\n let inbuf = this.inbuf_;\r\n // The outer while loop should execute at most twice.\r\n while (n < length) {\r\n // When we have no data in the block to top up, we can directly process the\r\n // input buffer (assuming it contains sufficient data). This gives ~25%\r\n // speedup on Chrome 23 and ~15% speedup on Firefox 16, but requires that\r\n // the data is provided in large chunks (or in multiples of 64 bytes).\r\n if (inbuf === 0) {\r\n while (n <= lengthMinusBlock) {\r\n this.compress_(bytes, n);\r\n n += this.blockSize;\r\n }\r\n }\r\n if (typeof bytes === 'string') {\r\n while (n < length) {\r\n buf[inbuf] = bytes.charCodeAt(n);\r\n ++inbuf;\r\n ++n;\r\n if (inbuf === this.blockSize) {\r\n this.compress_(buf);\r\n inbuf = 0;\r\n // Jump to the outer loop so we use the full-block optimization.\r\n break;\r\n }\r\n }\r\n }\r\n else {\r\n while (n < length) {\r\n buf[inbuf] = bytes[n];\r\n ++inbuf;\r\n ++n;\r\n if (inbuf === this.blockSize) {\r\n this.compress_(buf);\r\n inbuf = 0;\r\n // Jump to the outer loop so we use the full-block optimization.\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n this.inbuf_ = inbuf;\r\n this.total_ += length;\r\n }\r\n /** @override */\r\n digest() {\r\n const digest = [];\r\n let totalBits = this.total_ * 8;\r\n // Add pad 0x80 0x00*.\r\n if (this.inbuf_ < 56) {\r\n this.update(this.pad_, 56 - this.inbuf_);\r\n }\r\n else {\r\n this.update(this.pad_, this.blockSize - (this.inbuf_ - 56));\r\n }\r\n // Add # bits.\r\n for (let i = this.blockSize - 1; i >= 56; i--) {\r\n this.buf_[i] = totalBits & 255;\r\n totalBits /= 256; // Don't use bit-shifting here!\r\n }\r\n this.compress_(this.buf_);\r\n let n = 0;\r\n for (let i = 0; i < 5; i++) {\r\n for (let j = 24; j >= 0; j -= 8) {\r\n digest[n] = (this.chain_[i] >> j) & 255;\r\n ++n;\r\n }\r\n }\r\n return digest;\r\n }\r\n}\n\n/**\r\n * Helper to make a Subscribe function (just like Promise helps make a\r\n * Thenable).\r\n *\r\n * @param executor Function which can make calls to a single Observer\r\n * as a proxy.\r\n * @param onNoObservers Callback when count of Observers goes to zero.\r\n */\r\nfunction createSubscribe(executor, onNoObservers) {\r\n const proxy = new ObserverProxy(executor, onNoObservers);\r\n return proxy.subscribe.bind(proxy);\r\n}\r\n/**\r\n * Implement fan-out for any number of Observers attached via a subscribe\r\n * function.\r\n */\r\nclass ObserverProxy {\r\n /**\r\n * @param executor Function which can make calls to a single Observer\r\n * as a proxy.\r\n * @param onNoObservers Callback when count of Observers goes to zero.\r\n */\r\n constructor(executor, onNoObservers) {\r\n this.observers = [];\r\n this.unsubscribes = [];\r\n this.observerCount = 0;\r\n // Micro-task scheduling by calling task.then().\r\n this.task = Promise.resolve();\r\n this.finalized = false;\r\n this.onNoObservers = onNoObservers;\r\n // Call the executor asynchronously so subscribers that are called\r\n // synchronously after the creation of the subscribe function\r\n // can still receive the very first value generated in the executor.\r\n this.task\r\n .then(() => {\r\n executor(this);\r\n })\r\n .catch(e => {\r\n this.error(e);\r\n });\r\n }\r\n next(value) {\r\n this.forEachObserver((observer) => {\r\n observer.next(value);\r\n });\r\n }\r\n error(error) {\r\n this.forEachObserver((observer) => {\r\n observer.error(error);\r\n });\r\n this.close(error);\r\n }\r\n complete() {\r\n this.forEachObserver((observer) => {\r\n observer.complete();\r\n });\r\n this.close();\r\n }\r\n /**\r\n * Subscribe function that can be used to add an Observer to the fan-out list.\r\n *\r\n * - We require that no event is sent to a subscriber sychronously to their\r\n * call to subscribe().\r\n */\r\n subscribe(nextOrObserver, error, complete) {\r\n let observer;\r\n if (nextOrObserver === undefined &&\r\n error === undefined &&\r\n complete === undefined) {\r\n throw new Error('Missing Observer.');\r\n }\r\n // Assemble an Observer object when passed as callback functions.\r\n if (implementsAnyMethods(nextOrObserver, [\r\n 'next',\r\n 'error',\r\n 'complete'\r\n ])) {\r\n observer = nextOrObserver;\r\n }\r\n else {\r\n observer = {\r\n next: nextOrObserver,\r\n error,\r\n complete\r\n };\r\n }\r\n if (observer.next === undefined) {\r\n observer.next = noop;\r\n }\r\n if (observer.error === undefined) {\r\n observer.error = noop;\r\n }\r\n if (observer.complete === undefined) {\r\n observer.complete = noop;\r\n }\r\n const unsub = this.unsubscribeOne.bind(this, this.observers.length);\r\n // Attempt to subscribe to a terminated Observable - we\r\n // just respond to the Observer with the final error or complete\r\n // event.\r\n if (this.finalized) {\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\r\n this.task.then(() => {\r\n try {\r\n if (this.finalError) {\r\n observer.error(this.finalError);\r\n }\r\n else {\r\n observer.complete();\r\n }\r\n }\r\n catch (e) {\r\n // nothing\r\n }\r\n return;\r\n });\r\n }\r\n this.observers.push(observer);\r\n return unsub;\r\n }\r\n // Unsubscribe is synchronous - we guarantee that no events are sent to\r\n // any unsubscribed Observer.\r\n unsubscribeOne(i) {\r\n if (this.observers === undefined || this.observers[i] === undefined) {\r\n return;\r\n }\r\n delete this.observers[i];\r\n this.observerCount -= 1;\r\n if (this.observerCount === 0 && this.onNoObservers !== undefined) {\r\n this.onNoObservers(this);\r\n }\r\n }\r\n forEachObserver(fn) {\r\n if (this.finalized) {\r\n // Already closed by previous event....just eat the additional values.\r\n return;\r\n }\r\n // Since sendOne calls asynchronously - there is no chance that\r\n // this.observers will become undefined.\r\n for (let i = 0; i < this.observers.length; i++) {\r\n this.sendOne(i, fn);\r\n }\r\n }\r\n // Call the Observer via one of it's callback function. We are careful to\r\n // confirm that the observe has not been unsubscribed since this asynchronous\r\n // function had been queued.\r\n sendOne(i, fn) {\r\n // Execute the callback asynchronously\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\r\n this.task.then(() => {\r\n if (this.observers !== undefined && this.observers[i] !== undefined) {\r\n try {\r\n fn(this.observers[i]);\r\n }\r\n catch (e) {\r\n // Ignore exceptions raised in Observers or missing methods of an\r\n // Observer.\r\n // Log error to console. b/31404806\r\n if (typeof console !== 'undefined' && console.error) {\r\n console.error(e);\r\n }\r\n }\r\n }\r\n });\r\n }\r\n close(err) {\r\n if (this.finalized) {\r\n return;\r\n }\r\n this.finalized = true;\r\n if (err !== undefined) {\r\n this.finalError = err;\r\n }\r\n // Proxy is no longer needed - garbage collect references\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\r\n this.task.then(() => {\r\n this.observers = undefined;\r\n this.onNoObservers = undefined;\r\n });\r\n }\r\n}\r\n/** Turn synchronous function into one called asynchronously. */\r\n// eslint-disable-next-line @typescript-eslint/ban-types\r\nfunction async(fn, onError) {\r\n return (...args) => {\r\n Promise.resolve(true)\r\n .then(() => {\r\n fn(...args);\r\n })\r\n .catch((error) => {\r\n if (onError) {\r\n onError(error);\r\n }\r\n });\r\n };\r\n}\r\n/**\r\n * Return true if the object passed in implements any of the named methods.\r\n */\r\nfunction implementsAnyMethods(obj, methods) {\r\n if (typeof obj !== 'object' || obj === null) {\r\n return false;\r\n }\r\n for (const method of methods) {\r\n if (method in obj && typeof obj[method] === 'function') {\r\n return true;\r\n }\r\n }\r\n return false;\r\n}\r\nfunction noop() {\r\n // do nothing\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Check to make sure the appropriate number of arguments are provided for a public function.\r\n * Throws an error if it fails.\r\n *\r\n * @param fnName The function name\r\n * @param minCount The minimum number of arguments to allow for the function call\r\n * @param maxCount The maximum number of argument to allow for the function call\r\n * @param argCount The actual number of arguments provided.\r\n */\r\nconst validateArgCount = function (fnName, minCount, maxCount, argCount) {\r\n let argError;\r\n if (argCount < minCount) {\r\n argError = 'at least ' + minCount;\r\n }\r\n else if (argCount > maxCount) {\r\n argError = maxCount === 0 ? 'none' : 'no more than ' + maxCount;\r\n }\r\n if (argError) {\r\n const error = fnName +\r\n ' failed: Was called with ' +\r\n argCount +\r\n (argCount === 1 ? ' argument.' : ' arguments.') +\r\n ' Expects ' +\r\n argError +\r\n '.';\r\n throw new Error(error);\r\n }\r\n};\r\n/**\r\n * Generates a string to prefix an error message about failed argument validation\r\n *\r\n * @param fnName The function name\r\n * @param argName The name of the argument\r\n * @return The prefix to add to the error thrown for validation.\r\n */\r\nfunction errorPrefix(fnName, argName) {\r\n return `${fnName} failed: ${argName} argument `;\r\n}\r\n/**\r\n * @param fnName\r\n * @param argumentNumber\r\n * @param namespace\r\n * @param optional\r\n */\r\nfunction validateNamespace(fnName, namespace, optional) {\r\n if (optional && !namespace) {\r\n return;\r\n }\r\n if (typeof namespace !== 'string') {\r\n //TODO: I should do more validation here. We only allow certain chars in namespaces.\r\n throw new Error(errorPrefix(fnName, 'namespace') + 'must be a valid firebase namespace.');\r\n }\r\n}\r\nfunction validateCallback(fnName, argumentName, \r\n// eslint-disable-next-line @typescript-eslint/ban-types\r\ncallback, optional) {\r\n if (optional && !callback) {\r\n return;\r\n }\r\n if (typeof callback !== 'function') {\r\n throw new Error(errorPrefix(fnName, argumentName) + 'must be a valid function.');\r\n }\r\n}\r\nfunction validateContextObject(fnName, argumentName, context, optional) {\r\n if (optional && !context) {\r\n return;\r\n }\r\n if (typeof context !== 'object' || context === null) {\r\n throw new Error(errorPrefix(fnName, argumentName) + 'must be a valid context object.');\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n// Code originally came from goog.crypt.stringToUtf8ByteArray, but for some reason they\r\n// automatically replaced '\\r\\n' with '\\n', and they didn't handle surrogate pairs,\r\n// so it's been modified.\r\n// Note that not all Unicode characters appear as single characters in JavaScript strings.\r\n// fromCharCode returns the UTF-16 encoding of a character - so some Unicode characters\r\n// use 2 characters in Javascript. All 4-byte UTF-8 characters begin with a first\r\n// character in the range 0xD800 - 0xDBFF (the first character of a so-called surrogate\r\n// pair).\r\n// See http://www.ecma-international.org/ecma-262/5.1/#sec-15.1.3\r\n/**\r\n * @param {string} str\r\n * @return {Array}\r\n */\r\nconst stringToByteArray = function (str) {\r\n const out = [];\r\n let p = 0;\r\n for (let i = 0; i < str.length; i++) {\r\n let c = str.charCodeAt(i);\r\n // Is this the lead surrogate in a surrogate pair?\r\n if (c >= 0xd800 && c <= 0xdbff) {\r\n const high = c - 0xd800; // the high 10 bits.\r\n i++;\r\n assert(i < str.length, 'Surrogate pair missing trail surrogate.');\r\n const low = str.charCodeAt(i) - 0xdc00; // the low 10 bits.\r\n c = 0x10000 + (high << 10) + low;\r\n }\r\n if (c < 128) {\r\n out[p++] = c;\r\n }\r\n else if (c < 2048) {\r\n out[p++] = (c >> 6) | 192;\r\n out[p++] = (c & 63) | 128;\r\n }\r\n else if (c < 65536) {\r\n out[p++] = (c >> 12) | 224;\r\n out[p++] = ((c >> 6) & 63) | 128;\r\n out[p++] = (c & 63) | 128;\r\n }\r\n else {\r\n out[p++] = (c >> 18) | 240;\r\n out[p++] = ((c >> 12) & 63) | 128;\r\n out[p++] = ((c >> 6) & 63) | 128;\r\n out[p++] = (c & 63) | 128;\r\n }\r\n }\r\n return out;\r\n};\r\n/**\r\n * Calculate length without actually converting; useful for doing cheaper validation.\r\n * @param {string} str\r\n * @return {number}\r\n */\r\nconst stringLength = function (str) {\r\n let p = 0;\r\n for (let i = 0; i < str.length; i++) {\r\n const c = str.charCodeAt(i);\r\n if (c < 128) {\r\n p++;\r\n }\r\n else if (c < 2048) {\r\n p += 2;\r\n }\r\n else if (c >= 0xd800 && c <= 0xdbff) {\r\n // Lead surrogate of a surrogate pair. The pair together will take 4 bytes to represent.\r\n p += 4;\r\n i++; // skip trail surrogate.\r\n }\r\n else {\r\n p += 3;\r\n }\r\n }\r\n return p;\r\n};\n\n/**\r\n * @license\r\n * Copyright 2022 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Copied from https://stackoverflow.com/a/2117523\r\n * Generates a new uuid.\r\n * @public\r\n */\r\nconst uuidv4 = function () {\r\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, c => {\r\n const r = (Math.random() * 16) | 0, v = c === 'x' ? r : (r & 0x3) | 0x8;\r\n return v.toString(16);\r\n });\r\n};\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * The amount of milliseconds to exponentially increase.\r\n */\r\nconst DEFAULT_INTERVAL_MILLIS = 1000;\r\n/**\r\n * The factor to backoff by.\r\n * Should be a number greater than 1.\r\n */\r\nconst DEFAULT_BACKOFF_FACTOR = 2;\r\n/**\r\n * The maximum milliseconds to increase to.\r\n *\r\n * Visible for testing\r\n */\r\nconst MAX_VALUE_MILLIS = 4 * 60 * 60 * 1000; // Four hours, like iOS and Android.\r\n/**\r\n * The percentage of backoff time to randomize by.\r\n * See\r\n * http://go/safe-client-behavior#step-1-determine-the-appropriate-retry-interval-to-handle-spike-traffic\r\n * for context.\r\n *\r\n *
Visible for testing\r\n */\r\nconst RANDOM_FACTOR = 0.5;\r\n/**\r\n * Based on the backoff method from\r\n * https://github.com/google/closure-library/blob/master/closure/goog/math/exponentialbackoff.js.\r\n * Extracted here so we don't need to pass metadata and a stateful ExponentialBackoff object around.\r\n */\r\nfunction calculateBackoffMillis(backoffCount, intervalMillis = DEFAULT_INTERVAL_MILLIS, backoffFactor = DEFAULT_BACKOFF_FACTOR) {\r\n // Calculates an exponentially increasing value.\r\n // Deviation: calculates value from count and a constant interval, so we only need to save value\r\n // and count to restore state.\r\n const currBaseValue = intervalMillis * Math.pow(backoffFactor, backoffCount);\r\n // A random \"fuzz\" to avoid waves of retries.\r\n // Deviation: randomFactor is required.\r\n const randomWait = Math.round(\r\n // A fraction of the backoff value to add/subtract.\r\n // Deviation: changes multiplication order to improve readability.\r\n RANDOM_FACTOR *\r\n currBaseValue *\r\n // A random float (rounded to int by Math.round above) in the range [-1, 1]. Determines\r\n // if we add or subtract.\r\n (Math.random() - 0.5) *\r\n 2);\r\n // Limits backoff to max to avoid effectively permanent backoff.\r\n return Math.min(MAX_VALUE_MILLIS, currBaseValue + randomWait);\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Provide English ordinal letters after a number\r\n */\r\nfunction ordinal(i) {\r\n if (!Number.isFinite(i)) {\r\n return `${i}`;\r\n }\r\n return i + indicator(i);\r\n}\r\nfunction indicator(i) {\r\n i = Math.abs(i);\r\n const cent = i % 100;\r\n if (cent >= 10 && cent <= 20) {\r\n return 'th';\r\n }\r\n const dec = i % 10;\r\n if (dec === 1) {\r\n return 'st';\r\n }\r\n if (dec === 2) {\r\n return 'nd';\r\n }\r\n if (dec === 3) {\r\n return 'rd';\r\n }\r\n return 'th';\r\n}\n\n/**\r\n * @license\r\n * Copyright 2021 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction getModularInstance(service) {\r\n if (service && service._delegate) {\r\n return service._delegate;\r\n }\r\n else {\r\n return service;\r\n }\r\n}\n\nexport { CONSTANTS, Deferred, ErrorFactory, FirebaseError, MAX_VALUE_MILLIS, RANDOM_FACTOR, Sha1, areCookiesEnabled, assert, assertionError, async, base64, base64Decode, base64Encode, base64urlEncodeWithoutPadding, calculateBackoffMillis, contains, createMockUserToken, createSubscribe, decode, deepCopy, deepEqual, deepExtend, errorPrefix, extractQuerystring, getDefaultAppConfig, getDefaultEmulatorHost, getDefaultEmulatorHostnameAndPort, getDefaults, getExperimentalSetting, getGlobal, getModularInstance, getUA, isAdmin, isBrowser, isBrowserExtension, isElectron, isEmpty, isIE, isIndexedDBAvailable, isMobileCordova, isNode, isNodeSdk, isReactNative, isSafari, isUWP, isValidFormat, isValidTimestamp, issuedAtTime, jsonEval, map, ordinal, promiseWithTimeout, querystring, querystringDecode, safeGet, stringLength, stringToByteArray, stringify, uuidv4, validateArgCount, validateCallback, validateContextObject, validateIndexedDBOpenable, validateNamespace };\n//# sourceMappingURL=index.esm2017.js.map\n","import { Deferred } from '@firebase/util';\n\n/**\r\n * Component for service name T, e.g. `auth`, `auth-internal`\r\n */\r\nclass Component {\r\n /**\r\n *\r\n * @param name The public service name, e.g. app, auth, firestore, database\r\n * @param instanceFactory Service factory responsible for creating the public interface\r\n * @param type whether the service provided by the component is public or private\r\n */\r\n constructor(name, instanceFactory, type) {\r\n this.name = name;\r\n this.instanceFactory = instanceFactory;\r\n this.type = type;\r\n this.multipleInstances = false;\r\n /**\r\n * Properties to be added to the service namespace\r\n */\r\n this.serviceProps = {};\r\n this.instantiationMode = \"LAZY\" /* InstantiationMode.LAZY */;\r\n this.onInstanceCreated = null;\r\n }\r\n setInstantiationMode(mode) {\r\n this.instantiationMode = mode;\r\n return this;\r\n }\r\n setMultipleInstances(multipleInstances) {\r\n this.multipleInstances = multipleInstances;\r\n return this;\r\n }\r\n setServiceProps(props) {\r\n this.serviceProps = props;\r\n return this;\r\n }\r\n setInstanceCreatedCallback(callback) {\r\n this.onInstanceCreated = callback;\r\n return this;\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst DEFAULT_ENTRY_NAME = '[DEFAULT]';\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Provider for instance for service name T, e.g. 'auth', 'auth-internal'\r\n * NameServiceMapping[T] is an alias for the type of the instance\r\n */\r\nclass Provider {\r\n constructor(name, container) {\r\n this.name = name;\r\n this.container = container;\r\n this.component = null;\r\n this.instances = new Map();\r\n this.instancesDeferred = new Map();\r\n this.instancesOptions = new Map();\r\n this.onInitCallbacks = new Map();\r\n }\r\n /**\r\n * @param identifier A provider can provide mulitple instances of a service\r\n * if this.component.multipleInstances is true.\r\n */\r\n get(identifier) {\r\n // if multipleInstances is not supported, use the default name\r\n const normalizedIdentifier = this.normalizeInstanceIdentifier(identifier);\r\n if (!this.instancesDeferred.has(normalizedIdentifier)) {\r\n const deferred = new Deferred();\r\n this.instancesDeferred.set(normalizedIdentifier, deferred);\r\n if (this.isInitialized(normalizedIdentifier) ||\r\n this.shouldAutoInitialize()) {\r\n // initialize the service if it can be auto-initialized\r\n try {\r\n const instance = this.getOrInitializeService({\r\n instanceIdentifier: normalizedIdentifier\r\n });\r\n if (instance) {\r\n deferred.resolve(instance);\r\n }\r\n }\r\n catch (e) {\r\n // when the instance factory throws an exception during get(), it should not cause\r\n // a fatal error. We just return the unresolved promise in this case.\r\n }\r\n }\r\n }\r\n return this.instancesDeferred.get(normalizedIdentifier).promise;\r\n }\r\n getImmediate(options) {\r\n var _a;\r\n // if multipleInstances is not supported, use the default name\r\n const normalizedIdentifier = this.normalizeInstanceIdentifier(options === null || options === void 0 ? void 0 : options.identifier);\r\n const optional = (_a = options === null || options === void 0 ? void 0 : options.optional) !== null && _a !== void 0 ? _a : false;\r\n if (this.isInitialized(normalizedIdentifier) ||\r\n this.shouldAutoInitialize()) {\r\n try {\r\n return this.getOrInitializeService({\r\n instanceIdentifier: normalizedIdentifier\r\n });\r\n }\r\n catch (e) {\r\n if (optional) {\r\n return null;\r\n }\r\n else {\r\n throw e;\r\n }\r\n }\r\n }\r\n else {\r\n // In case a component is not initialized and should/can not be auto-initialized at the moment, return null if the optional flag is set, or throw\r\n if (optional) {\r\n return null;\r\n }\r\n else {\r\n throw Error(`Service ${this.name} is not available`);\r\n }\r\n }\r\n }\r\n getComponent() {\r\n return this.component;\r\n }\r\n setComponent(component) {\r\n if (component.name !== this.name) {\r\n throw Error(`Mismatching Component ${component.name} for Provider ${this.name}.`);\r\n }\r\n if (this.component) {\r\n throw Error(`Component for ${this.name} has already been provided`);\r\n }\r\n this.component = component;\r\n // return early without attempting to initialize the component if the component requires explicit initialization (calling `Provider.initialize()`)\r\n if (!this.shouldAutoInitialize()) {\r\n return;\r\n }\r\n // if the service is eager, initialize the default instance\r\n if (isComponentEager(component)) {\r\n try {\r\n this.getOrInitializeService({ instanceIdentifier: DEFAULT_ENTRY_NAME });\r\n }\r\n catch (e) {\r\n // when the instance factory for an eager Component throws an exception during the eager\r\n // initialization, it should not cause a fatal error.\r\n // TODO: Investigate if we need to make it configurable, because some component may want to cause\r\n // a fatal error in this case?\r\n }\r\n }\r\n // Create service instances for the pending promises and resolve them\r\n // NOTE: if this.multipleInstances is false, only the default instance will be created\r\n // and all promises with resolve with it regardless of the identifier.\r\n for (const [instanceIdentifier, instanceDeferred] of this.instancesDeferred.entries()) {\r\n const normalizedIdentifier = this.normalizeInstanceIdentifier(instanceIdentifier);\r\n try {\r\n // `getOrInitializeService()` should always return a valid instance since a component is guaranteed. use ! to make typescript happy.\r\n const instance = this.getOrInitializeService({\r\n instanceIdentifier: normalizedIdentifier\r\n });\r\n instanceDeferred.resolve(instance);\r\n }\r\n catch (e) {\r\n // when the instance factory throws an exception, it should not cause\r\n // a fatal error. We just leave the promise unresolved.\r\n }\r\n }\r\n }\r\n clearInstance(identifier = DEFAULT_ENTRY_NAME) {\r\n this.instancesDeferred.delete(identifier);\r\n this.instancesOptions.delete(identifier);\r\n this.instances.delete(identifier);\r\n }\r\n // app.delete() will call this method on every provider to delete the services\r\n // TODO: should we mark the provider as deleted?\r\n async delete() {\r\n const services = Array.from(this.instances.values());\r\n await Promise.all([\r\n ...services\r\n .filter(service => 'INTERNAL' in service) // legacy services\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n .map(service => service.INTERNAL.delete()),\r\n ...services\r\n .filter(service => '_delete' in service) // modularized services\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n .map(service => service._delete())\r\n ]);\r\n }\r\n isComponentSet() {\r\n return this.component != null;\r\n }\r\n isInitialized(identifier = DEFAULT_ENTRY_NAME) {\r\n return this.instances.has(identifier);\r\n }\r\n getOptions(identifier = DEFAULT_ENTRY_NAME) {\r\n return this.instancesOptions.get(identifier) || {};\r\n }\r\n initialize(opts = {}) {\r\n const { options = {} } = opts;\r\n const normalizedIdentifier = this.normalizeInstanceIdentifier(opts.instanceIdentifier);\r\n if (this.isInitialized(normalizedIdentifier)) {\r\n throw Error(`${this.name}(${normalizedIdentifier}) has already been initialized`);\r\n }\r\n if (!this.isComponentSet()) {\r\n throw Error(`Component ${this.name} has not been registered yet`);\r\n }\r\n const instance = this.getOrInitializeService({\r\n instanceIdentifier: normalizedIdentifier,\r\n options\r\n });\r\n // resolve any pending promise waiting for the service instance\r\n for (const [instanceIdentifier, instanceDeferred] of this.instancesDeferred.entries()) {\r\n const normalizedDeferredIdentifier = this.normalizeInstanceIdentifier(instanceIdentifier);\r\n if (normalizedIdentifier === normalizedDeferredIdentifier) {\r\n instanceDeferred.resolve(instance);\r\n }\r\n }\r\n return instance;\r\n }\r\n /**\r\n *\r\n * @param callback - a function that will be invoked after the provider has been initialized by calling provider.initialize().\r\n * The function is invoked SYNCHRONOUSLY, so it should not execute any longrunning tasks in order to not block the program.\r\n *\r\n * @param identifier An optional instance identifier\r\n * @returns a function to unregister the callback\r\n */\r\n onInit(callback, identifier) {\r\n var _a;\r\n const normalizedIdentifier = this.normalizeInstanceIdentifier(identifier);\r\n const existingCallbacks = (_a = this.onInitCallbacks.get(normalizedIdentifier)) !== null && _a !== void 0 ? _a : new Set();\r\n existingCallbacks.add(callback);\r\n this.onInitCallbacks.set(normalizedIdentifier, existingCallbacks);\r\n const existingInstance = this.instances.get(normalizedIdentifier);\r\n if (existingInstance) {\r\n callback(existingInstance, normalizedIdentifier);\r\n }\r\n return () => {\r\n existingCallbacks.delete(callback);\r\n };\r\n }\r\n /**\r\n * Invoke onInit callbacks synchronously\r\n * @param instance the service instance`\r\n */\r\n invokeOnInitCallbacks(instance, identifier) {\r\n const callbacks = this.onInitCallbacks.get(identifier);\r\n if (!callbacks) {\r\n return;\r\n }\r\n for (const callback of callbacks) {\r\n try {\r\n callback(instance, identifier);\r\n }\r\n catch (_a) {\r\n // ignore errors in the onInit callback\r\n }\r\n }\r\n }\r\n getOrInitializeService({ instanceIdentifier, options = {} }) {\r\n let instance = this.instances.get(instanceIdentifier);\r\n if (!instance && this.component) {\r\n instance = this.component.instanceFactory(this.container, {\r\n instanceIdentifier: normalizeIdentifierForFactory(instanceIdentifier),\r\n options\r\n });\r\n this.instances.set(instanceIdentifier, instance);\r\n this.instancesOptions.set(instanceIdentifier, options);\r\n /**\r\n * Invoke onInit listeners.\r\n * Note this.component.onInstanceCreated is different, which is used by the component creator,\r\n * while onInit listeners are registered by consumers of the provider.\r\n */\r\n this.invokeOnInitCallbacks(instance, instanceIdentifier);\r\n /**\r\n * Order is important\r\n * onInstanceCreated() should be called after this.instances.set(instanceIdentifier, instance); which\r\n * makes `isInitialized()` return true.\r\n */\r\n if (this.component.onInstanceCreated) {\r\n try {\r\n this.component.onInstanceCreated(this.container, instanceIdentifier, instance);\r\n }\r\n catch (_a) {\r\n // ignore errors in the onInstanceCreatedCallback\r\n }\r\n }\r\n }\r\n return instance || null;\r\n }\r\n normalizeInstanceIdentifier(identifier = DEFAULT_ENTRY_NAME) {\r\n if (this.component) {\r\n return this.component.multipleInstances ? identifier : DEFAULT_ENTRY_NAME;\r\n }\r\n else {\r\n return identifier; // assume multiple instances are supported before the component is provided.\r\n }\r\n }\r\n shouldAutoInitialize() {\r\n return (!!this.component &&\r\n this.component.instantiationMode !== \"EXPLICIT\" /* InstantiationMode.EXPLICIT */);\r\n }\r\n}\r\n// undefined should be passed to the service factory for the default instance\r\nfunction normalizeIdentifierForFactory(identifier) {\r\n return identifier === DEFAULT_ENTRY_NAME ? undefined : identifier;\r\n}\r\nfunction isComponentEager(component) {\r\n return component.instantiationMode === \"EAGER\" /* InstantiationMode.EAGER */;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * ComponentContainer that provides Providers for service name T, e.g. `auth`, `auth-internal`\r\n */\r\nclass ComponentContainer {\r\n constructor(name) {\r\n this.name = name;\r\n this.providers = new Map();\r\n }\r\n /**\r\n *\r\n * @param component Component being added\r\n * @param overwrite When a component with the same name has already been registered,\r\n * if overwrite is true: overwrite the existing component with the new component and create a new\r\n * provider with the new component. It can be useful in tests where you want to use different mocks\r\n * for different tests.\r\n * if overwrite is false: throw an exception\r\n */\r\n addComponent(component) {\r\n const provider = this.getProvider(component.name);\r\n if (provider.isComponentSet()) {\r\n throw new Error(`Component ${component.name} has already been registered with ${this.name}`);\r\n }\r\n provider.setComponent(component);\r\n }\r\n addOrOverwriteComponent(component) {\r\n const provider = this.getProvider(component.name);\r\n if (provider.isComponentSet()) {\r\n // delete the existing provider from the container, so we can register the new component\r\n this.providers.delete(component.name);\r\n }\r\n this.addComponent(component);\r\n }\r\n /**\r\n * getProvider provides a type safe interface where it can only be called with a field name\r\n * present in NameServiceMapping interface.\r\n *\r\n * Firebase SDKs providing services should extend NameServiceMapping interface to register\r\n * themselves.\r\n */\r\n getProvider(name) {\r\n if (this.providers.has(name)) {\r\n return this.providers.get(name);\r\n }\r\n // create a Provider for a service that hasn't registered with Firebase\r\n const provider = new Provider(name, this);\r\n this.providers.set(name, provider);\r\n return provider;\r\n }\r\n getProviders() {\r\n return Array.from(this.providers.values());\r\n }\r\n}\n\nexport { Component, ComponentContainer, Provider };\n//# sourceMappingURL=index.esm2017.js.map\n","/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * A container for all of the Logger instances\r\n */\r\nconst instances = [];\r\n/**\r\n * The JS SDK supports 5 log levels and also allows a user the ability to\r\n * silence the logs altogether.\r\n *\r\n * The order is a follows:\r\n * DEBUG < VERBOSE < INFO < WARN < ERROR\r\n *\r\n * All of the log types above the current log level will be captured (i.e. if\r\n * you set the log level to `INFO`, errors will still be logged, but `DEBUG` and\r\n * `VERBOSE` logs will not)\r\n */\r\nvar LogLevel;\r\n(function (LogLevel) {\r\n LogLevel[LogLevel[\"DEBUG\"] = 0] = \"DEBUG\";\r\n LogLevel[LogLevel[\"VERBOSE\"] = 1] = \"VERBOSE\";\r\n LogLevel[LogLevel[\"INFO\"] = 2] = \"INFO\";\r\n LogLevel[LogLevel[\"WARN\"] = 3] = \"WARN\";\r\n LogLevel[LogLevel[\"ERROR\"] = 4] = \"ERROR\";\r\n LogLevel[LogLevel[\"SILENT\"] = 5] = \"SILENT\";\r\n})(LogLevel || (LogLevel = {}));\r\nconst levelStringToEnum = {\r\n 'debug': LogLevel.DEBUG,\r\n 'verbose': LogLevel.VERBOSE,\r\n 'info': LogLevel.INFO,\r\n 'warn': LogLevel.WARN,\r\n 'error': LogLevel.ERROR,\r\n 'silent': LogLevel.SILENT\r\n};\r\n/**\r\n * The default log level\r\n */\r\nconst defaultLogLevel = LogLevel.INFO;\r\n/**\r\n * By default, `console.debug` is not displayed in the developer console (in\r\n * chrome). To avoid forcing users to have to opt-in to these logs twice\r\n * (i.e. once for firebase, and once in the console), we are sending `DEBUG`\r\n * logs to the `console.log` function.\r\n */\r\nconst ConsoleMethod = {\r\n [LogLevel.DEBUG]: 'log',\r\n [LogLevel.VERBOSE]: 'log',\r\n [LogLevel.INFO]: 'info',\r\n [LogLevel.WARN]: 'warn',\r\n [LogLevel.ERROR]: 'error'\r\n};\r\n/**\r\n * The default log handler will forward DEBUG, VERBOSE, INFO, WARN, and ERROR\r\n * messages on to their corresponding console counterparts (if the log method\r\n * is supported by the current log level)\r\n */\r\nconst defaultLogHandler = (instance, logType, ...args) => {\r\n if (logType < instance.logLevel) {\r\n return;\r\n }\r\n const now = new Date().toISOString();\r\n const method = ConsoleMethod[logType];\r\n if (method) {\r\n console[method](`[${now}] ${instance.name}:`, ...args);\r\n }\r\n else {\r\n throw new Error(`Attempted to log a message with an invalid logType (value: ${logType})`);\r\n }\r\n};\r\nclass Logger {\r\n /**\r\n * Gives you an instance of a Logger to capture messages according to\r\n * Firebase's logging scheme.\r\n *\r\n * @param name The name that the logs will be associated with\r\n */\r\n constructor(name) {\r\n this.name = name;\r\n /**\r\n * The log level of the given Logger instance.\r\n */\r\n this._logLevel = defaultLogLevel;\r\n /**\r\n * The main (internal) log handler for the Logger instance.\r\n * Can be set to a new function in internal package code but not by user.\r\n */\r\n this._logHandler = defaultLogHandler;\r\n /**\r\n * The optional, additional, user-defined log handler for the Logger instance.\r\n */\r\n this._userLogHandler = null;\r\n /**\r\n * Capture the current instance for later use\r\n */\r\n instances.push(this);\r\n }\r\n get logLevel() {\r\n return this._logLevel;\r\n }\r\n set logLevel(val) {\r\n if (!(val in LogLevel)) {\r\n throw new TypeError(`Invalid value \"${val}\" assigned to \\`logLevel\\``);\r\n }\r\n this._logLevel = val;\r\n }\r\n // Workaround for setter/getter having to be the same type.\r\n setLogLevel(val) {\r\n this._logLevel = typeof val === 'string' ? levelStringToEnum[val] : val;\r\n }\r\n get logHandler() {\r\n return this._logHandler;\r\n }\r\n set logHandler(val) {\r\n if (typeof val !== 'function') {\r\n throw new TypeError('Value assigned to `logHandler` must be a function');\r\n }\r\n this._logHandler = val;\r\n }\r\n get userLogHandler() {\r\n return this._userLogHandler;\r\n }\r\n set userLogHandler(val) {\r\n this._userLogHandler = val;\r\n }\r\n /**\r\n * The functions below are all based on the `console` interface\r\n */\r\n debug(...args) {\r\n this._userLogHandler && this._userLogHandler(this, LogLevel.DEBUG, ...args);\r\n this._logHandler(this, LogLevel.DEBUG, ...args);\r\n }\r\n log(...args) {\r\n this._userLogHandler &&\r\n this._userLogHandler(this, LogLevel.VERBOSE, ...args);\r\n this._logHandler(this, LogLevel.VERBOSE, ...args);\r\n }\r\n info(...args) {\r\n this._userLogHandler && this._userLogHandler(this, LogLevel.INFO, ...args);\r\n this._logHandler(this, LogLevel.INFO, ...args);\r\n }\r\n warn(...args) {\r\n this._userLogHandler && this._userLogHandler(this, LogLevel.WARN, ...args);\r\n this._logHandler(this, LogLevel.WARN, ...args);\r\n }\r\n error(...args) {\r\n this._userLogHandler && this._userLogHandler(this, LogLevel.ERROR, ...args);\r\n this._logHandler(this, LogLevel.ERROR, ...args);\r\n }\r\n}\r\nfunction setLogLevel(level) {\r\n instances.forEach(inst => {\r\n inst.setLogLevel(level);\r\n });\r\n}\r\nfunction setUserLogHandler(logCallback, options) {\r\n for (const instance of instances) {\r\n let customLogLevel = null;\r\n if (options && options.level) {\r\n customLogLevel = levelStringToEnum[options.level];\r\n }\r\n if (logCallback === null) {\r\n instance.userLogHandler = null;\r\n }\r\n else {\r\n instance.userLogHandler = (instance, level, ...args) => {\r\n const message = args\r\n .map(arg => {\r\n if (arg == null) {\r\n return null;\r\n }\r\n else if (typeof arg === 'string') {\r\n return arg;\r\n }\r\n else if (typeof arg === 'number' || typeof arg === 'boolean') {\r\n return arg.toString();\r\n }\r\n else if (arg instanceof Error) {\r\n return arg.message;\r\n }\r\n else {\r\n try {\r\n return JSON.stringify(arg);\r\n }\r\n catch (ignored) {\r\n return null;\r\n }\r\n }\r\n })\r\n .filter(arg => arg)\r\n .join(' ');\r\n if (level >= (customLogLevel !== null && customLogLevel !== void 0 ? customLogLevel : instance.logLevel)) {\r\n logCallback({\r\n level: LogLevel[level].toLowerCase(),\r\n message,\r\n args,\r\n type: instance.name\r\n });\r\n }\r\n };\r\n }\r\n }\r\n}\n\nexport { LogLevel, Logger, setLogLevel, setUserLogHandler };\n//# sourceMappingURL=index.esm2017.js.map\n","const instanceOfAny = (object, constructors) => constructors.some((c) => object instanceof c);\n\nlet idbProxyableTypes;\nlet cursorAdvanceMethods;\n// This is a function to prevent it throwing up in node environments.\nfunction getIdbProxyableTypes() {\n return (idbProxyableTypes ||\n (idbProxyableTypes = [\n IDBDatabase,\n IDBObjectStore,\n IDBIndex,\n IDBCursor,\n IDBTransaction,\n ]));\n}\n// This is a function to prevent it throwing up in node environments.\nfunction getCursorAdvanceMethods() {\n return (cursorAdvanceMethods ||\n (cursorAdvanceMethods = [\n IDBCursor.prototype.advance,\n IDBCursor.prototype.continue,\n IDBCursor.prototype.continuePrimaryKey,\n ]));\n}\nconst cursorRequestMap = new WeakMap();\nconst transactionDoneMap = new WeakMap();\nconst transactionStoreNamesMap = new WeakMap();\nconst transformCache = new WeakMap();\nconst reverseTransformCache = new WeakMap();\nfunction promisifyRequest(request) {\n const promise = new Promise((resolve, reject) => {\n const unlisten = () => {\n request.removeEventListener('success', success);\n request.removeEventListener('error', error);\n };\n const success = () => {\n resolve(wrap(request.result));\n unlisten();\n };\n const error = () => {\n reject(request.error);\n unlisten();\n };\n request.addEventListener('success', success);\n request.addEventListener('error', error);\n });\n promise\n .then((value) => {\n // Since cursoring reuses the IDBRequest (*sigh*), we cache it for later retrieval\n // (see wrapFunction).\n if (value instanceof IDBCursor) {\n cursorRequestMap.set(value, request);\n }\n // Catching to avoid \"Uncaught Promise exceptions\"\n })\n .catch(() => { });\n // This mapping exists in reverseTransformCache but doesn't doesn't exist in transformCache. This\n // is because we create many promises from a single IDBRequest.\n reverseTransformCache.set(promise, request);\n return promise;\n}\nfunction cacheDonePromiseForTransaction(tx) {\n // Early bail if we've already created a done promise for this transaction.\n if (transactionDoneMap.has(tx))\n return;\n const done = new Promise((resolve, reject) => {\n const unlisten = () => {\n tx.removeEventListener('complete', complete);\n tx.removeEventListener('error', error);\n tx.removeEventListener('abort', error);\n };\n const complete = () => {\n resolve();\n unlisten();\n };\n const error = () => {\n reject(tx.error || new DOMException('AbortError', 'AbortError'));\n unlisten();\n };\n tx.addEventListener('complete', complete);\n tx.addEventListener('error', error);\n tx.addEventListener('abort', error);\n });\n // Cache it for later retrieval.\n transactionDoneMap.set(tx, done);\n}\nlet idbProxyTraps = {\n get(target, prop, receiver) {\n if (target instanceof IDBTransaction) {\n // Special handling for transaction.done.\n if (prop === 'done')\n return transactionDoneMap.get(target);\n // Polyfill for objectStoreNames because of Edge.\n if (prop === 'objectStoreNames') {\n return target.objectStoreNames || transactionStoreNamesMap.get(target);\n }\n // Make tx.store return the only store in the transaction, or undefined if there are many.\n if (prop === 'store') {\n return receiver.objectStoreNames[1]\n ? undefined\n : receiver.objectStore(receiver.objectStoreNames[0]);\n }\n }\n // Else transform whatever we get back.\n return wrap(target[prop]);\n },\n set(target, prop, value) {\n target[prop] = value;\n return true;\n },\n has(target, prop) {\n if (target instanceof IDBTransaction &&\n (prop === 'done' || prop === 'store')) {\n return true;\n }\n return prop in target;\n },\n};\nfunction replaceTraps(callback) {\n idbProxyTraps = callback(idbProxyTraps);\n}\nfunction wrapFunction(func) {\n // Due to expected object equality (which is enforced by the caching in `wrap`), we\n // only create one new func per func.\n // Edge doesn't support objectStoreNames (booo), so we polyfill it here.\n if (func === IDBDatabase.prototype.transaction &&\n !('objectStoreNames' in IDBTransaction.prototype)) {\n return function (storeNames, ...args) {\n const tx = func.call(unwrap(this), storeNames, ...args);\n transactionStoreNamesMap.set(tx, storeNames.sort ? storeNames.sort() : [storeNames]);\n return wrap(tx);\n };\n }\n // Cursor methods are special, as the behaviour is a little more different to standard IDB. In\n // IDB, you advance the cursor and wait for a new 'success' on the IDBRequest that gave you the\n // cursor. It's kinda like a promise that can resolve with many values. That doesn't make sense\n // with real promises, so each advance methods returns a new promise for the cursor object, or\n // undefined if the end of the cursor has been reached.\n if (getCursorAdvanceMethods().includes(func)) {\n return function (...args) {\n // Calling the original function with the proxy as 'this' causes ILLEGAL INVOCATION, so we use\n // the original object.\n func.apply(unwrap(this), args);\n return wrap(cursorRequestMap.get(this));\n };\n }\n return function (...args) {\n // Calling the original function with the proxy as 'this' causes ILLEGAL INVOCATION, so we use\n // the original object.\n return wrap(func.apply(unwrap(this), args));\n };\n}\nfunction transformCachableValue(value) {\n if (typeof value === 'function')\n return wrapFunction(value);\n // This doesn't return, it just creates a 'done' promise for the transaction,\n // which is later returned for transaction.done (see idbObjectHandler).\n if (value instanceof IDBTransaction)\n cacheDonePromiseForTransaction(value);\n if (instanceOfAny(value, getIdbProxyableTypes()))\n return new Proxy(value, idbProxyTraps);\n // Return the same value back if we're not going to transform it.\n return value;\n}\nfunction wrap(value) {\n // We sometimes generate multiple promises from a single IDBRequest (eg when cursoring), because\n // IDB is weird and a single IDBRequest can yield many responses, so these can't be cached.\n if (value instanceof IDBRequest)\n return promisifyRequest(value);\n // If we've already transformed this value before, reuse the transformed value.\n // This is faster, but it also provides object equality.\n if (transformCache.has(value))\n return transformCache.get(value);\n const newValue = transformCachableValue(value);\n // Not all types are transformed.\n // These may be primitive types, so they can't be WeakMap keys.\n if (newValue !== value) {\n transformCache.set(value, newValue);\n reverseTransformCache.set(newValue, value);\n }\n return newValue;\n}\nconst unwrap = (value) => reverseTransformCache.get(value);\n\nexport { reverseTransformCache as a, instanceOfAny as i, replaceTraps as r, unwrap as u, wrap as w };\n","import { w as wrap, r as replaceTraps } from './wrap-idb-value.js';\nexport { u as unwrap, w as wrap } from './wrap-idb-value.js';\n\n/**\n * Open a database.\n *\n * @param name Name of the database.\n * @param version Schema version.\n * @param callbacks Additional callbacks.\n */\nfunction openDB(name, version, { blocked, upgrade, blocking, terminated } = {}) {\n const request = indexedDB.open(name, version);\n const openPromise = wrap(request);\n if (upgrade) {\n request.addEventListener('upgradeneeded', (event) => {\n upgrade(wrap(request.result), event.oldVersion, event.newVersion, wrap(request.transaction));\n });\n }\n if (blocked)\n request.addEventListener('blocked', () => blocked());\n openPromise\n .then((db) => {\n if (terminated)\n db.addEventListener('close', () => terminated());\n if (blocking)\n db.addEventListener('versionchange', () => blocking());\n })\n .catch(() => { });\n return openPromise;\n}\n/**\n * Delete a database.\n *\n * @param name Name of the database.\n */\nfunction deleteDB(name, { blocked } = {}) {\n const request = indexedDB.deleteDatabase(name);\n if (blocked)\n request.addEventListener('blocked', () => blocked());\n return wrap(request).then(() => undefined);\n}\n\nconst readMethods = ['get', 'getKey', 'getAll', 'getAllKeys', 'count'];\nconst writeMethods = ['put', 'add', 'delete', 'clear'];\nconst cachedMethods = new Map();\nfunction getMethod(target, prop) {\n if (!(target instanceof IDBDatabase &&\n !(prop in target) &&\n typeof prop === 'string')) {\n return;\n }\n if (cachedMethods.get(prop))\n return cachedMethods.get(prop);\n const targetFuncName = prop.replace(/FromIndex$/, '');\n const useIndex = prop !== targetFuncName;\n const isWrite = writeMethods.includes(targetFuncName);\n if (\n // Bail if the target doesn't exist on the target. Eg, getAll isn't in Edge.\n !(targetFuncName in (useIndex ? IDBIndex : IDBObjectStore).prototype) ||\n !(isWrite || readMethods.includes(targetFuncName))) {\n return;\n }\n const method = async function (storeName, ...args) {\n // isWrite ? 'readwrite' : undefined gzipps better, but fails in Edge :(\n const tx = this.transaction(storeName, isWrite ? 'readwrite' : 'readonly');\n let target = tx.store;\n if (useIndex)\n target = target.index(args.shift());\n // Must reject if op rejects.\n // If it's a write operation, must reject if tx.done rejects.\n // Must reject with op rejection first.\n // Must resolve with op value.\n // Must handle both promises (no unhandled rejections)\n return (await Promise.all([\n target[targetFuncName](...args),\n isWrite && tx.done,\n ]))[0];\n };\n cachedMethods.set(prop, method);\n return method;\n}\nreplaceTraps((oldTraps) => ({\n ...oldTraps,\n get: (target, prop, receiver) => getMethod(target, prop) || oldTraps.get(target, prop, receiver),\n has: (target, prop) => !!getMethod(target, prop) || oldTraps.has(target, prop),\n}));\n\nexport { deleteDB, openDB };\n","import { Component, ComponentContainer } from '@firebase/component';\nimport { Logger, setUserLogHandler, setLogLevel as setLogLevel$1 } from '@firebase/logger';\nimport { ErrorFactory, getDefaultAppConfig, deepEqual, FirebaseError, base64urlEncodeWithoutPadding, isIndexedDBAvailable, validateIndexedDBOpenable } from '@firebase/util';\nexport { FirebaseError } from '@firebase/util';\nimport { openDB } from 'idb';\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nclass PlatformLoggerServiceImpl {\r\n constructor(container) {\r\n this.container = container;\r\n }\r\n // In initial implementation, this will be called by installations on\r\n // auth token refresh, and installations will send this string.\r\n getPlatformInfoString() {\r\n const providers = this.container.getProviders();\r\n // Loop through providers and get library/version pairs from any that are\r\n // version components.\r\n return providers\r\n .map(provider => {\r\n if (isVersionServiceProvider(provider)) {\r\n const service = provider.getImmediate();\r\n return `${service.library}/${service.version}`;\r\n }\r\n else {\r\n return null;\r\n }\r\n })\r\n .filter(logString => logString)\r\n .join(' ');\r\n }\r\n}\r\n/**\r\n *\r\n * @param provider check if this provider provides a VersionService\r\n *\r\n * NOTE: Using Provider<'app-version'> is a hack to indicate that the provider\r\n * provides VersionService. The provider is not necessarily a 'app-version'\r\n * provider.\r\n */\r\nfunction isVersionServiceProvider(provider) {\r\n const component = provider.getComponent();\r\n return (component === null || component === void 0 ? void 0 : component.type) === \"VERSION\" /* ComponentType.VERSION */;\r\n}\n\nconst name$o = \"@firebase/app\";\nconst version$1 = \"0.9.1\";\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst logger = new Logger('@firebase/app');\n\nconst name$n = \"@firebase/app-compat\";\n\nconst name$m = \"@firebase/analytics-compat\";\n\nconst name$l = \"@firebase/analytics\";\n\nconst name$k = \"@firebase/app-check-compat\";\n\nconst name$j = \"@firebase/app-check\";\n\nconst name$i = \"@firebase/auth\";\n\nconst name$h = \"@firebase/auth-compat\";\n\nconst name$g = \"@firebase/database\";\n\nconst name$f = \"@firebase/database-compat\";\n\nconst name$e = \"@firebase/functions\";\n\nconst name$d = \"@firebase/functions-compat\";\n\nconst name$c = \"@firebase/installations\";\n\nconst name$b = \"@firebase/installations-compat\";\n\nconst name$a = \"@firebase/messaging\";\n\nconst name$9 = \"@firebase/messaging-compat\";\n\nconst name$8 = \"@firebase/performance\";\n\nconst name$7 = \"@firebase/performance-compat\";\n\nconst name$6 = \"@firebase/remote-config\";\n\nconst name$5 = \"@firebase/remote-config-compat\";\n\nconst name$4 = \"@firebase/storage\";\n\nconst name$3 = \"@firebase/storage-compat\";\n\nconst name$2 = \"@firebase/firestore\";\n\nconst name$1 = \"@firebase/firestore-compat\";\n\nconst name = \"firebase\";\nconst version = \"9.16.0\";\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * The default app name\r\n *\r\n * @internal\r\n */\r\nconst DEFAULT_ENTRY_NAME = '[DEFAULT]';\r\nconst PLATFORM_LOG_STRING = {\r\n [name$o]: 'fire-core',\r\n [name$n]: 'fire-core-compat',\r\n [name$l]: 'fire-analytics',\r\n [name$m]: 'fire-analytics-compat',\r\n [name$j]: 'fire-app-check',\r\n [name$k]: 'fire-app-check-compat',\r\n [name$i]: 'fire-auth',\r\n [name$h]: 'fire-auth-compat',\r\n [name$g]: 'fire-rtdb',\r\n [name$f]: 'fire-rtdb-compat',\r\n [name$e]: 'fire-fn',\r\n [name$d]: 'fire-fn-compat',\r\n [name$c]: 'fire-iid',\r\n [name$b]: 'fire-iid-compat',\r\n [name$a]: 'fire-fcm',\r\n [name$9]: 'fire-fcm-compat',\r\n [name$8]: 'fire-perf',\r\n [name$7]: 'fire-perf-compat',\r\n [name$6]: 'fire-rc',\r\n [name$5]: 'fire-rc-compat',\r\n [name$4]: 'fire-gcs',\r\n [name$3]: 'fire-gcs-compat',\r\n [name$2]: 'fire-fst',\r\n [name$1]: 'fire-fst-compat',\r\n 'fire-js': 'fire-js',\r\n [name]: 'fire-js-all'\r\n};\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * @internal\r\n */\r\nconst _apps = new Map();\r\n/**\r\n * Registered components.\r\n *\r\n * @internal\r\n */\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\nconst _components = new Map();\r\n/**\r\n * @param component - the component being added to this app's container\r\n *\r\n * @internal\r\n */\r\nfunction _addComponent(app, component) {\r\n try {\r\n app.container.addComponent(component);\r\n }\r\n catch (e) {\r\n logger.debug(`Component ${component.name} failed to register with FirebaseApp ${app.name}`, e);\r\n }\r\n}\r\n/**\r\n *\r\n * @internal\r\n */\r\nfunction _addOrOverwriteComponent(app, component) {\r\n app.container.addOrOverwriteComponent(component);\r\n}\r\n/**\r\n *\r\n * @param component - the component to register\r\n * @returns whether or not the component is registered successfully\r\n *\r\n * @internal\r\n */\r\nfunction _registerComponent(component) {\r\n const componentName = component.name;\r\n if (_components.has(componentName)) {\r\n logger.debug(`There were multiple attempts to register component ${componentName}.`);\r\n return false;\r\n }\r\n _components.set(componentName, component);\r\n // add the component to existing app instances\r\n for (const app of _apps.values()) {\r\n _addComponent(app, component);\r\n }\r\n return true;\r\n}\r\n/**\r\n *\r\n * @param app - FirebaseApp instance\r\n * @param name - service name\r\n *\r\n * @returns the provider for the service with the matching name\r\n *\r\n * @internal\r\n */\r\nfunction _getProvider(app, name) {\r\n const heartbeatController = app.container\r\n .getProvider('heartbeat')\r\n .getImmediate({ optional: true });\r\n if (heartbeatController) {\r\n void heartbeatController.triggerHeartbeat();\r\n }\r\n return app.container.getProvider(name);\r\n}\r\n/**\r\n *\r\n * @param app - FirebaseApp instance\r\n * @param name - service name\r\n * @param instanceIdentifier - service instance identifier in case the service supports multiple instances\r\n *\r\n * @internal\r\n */\r\nfunction _removeServiceInstance(app, name, instanceIdentifier = DEFAULT_ENTRY_NAME) {\r\n _getProvider(app, name).clearInstance(instanceIdentifier);\r\n}\r\n/**\r\n * Test only\r\n *\r\n * @internal\r\n */\r\nfunction _clearComponents() {\r\n _components.clear();\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst ERRORS = {\r\n [\"no-app\" /* AppError.NO_APP */]: \"No Firebase App '{$appName}' has been created - \" +\r\n 'call Firebase App.initializeApp()',\r\n [\"bad-app-name\" /* AppError.BAD_APP_NAME */]: \"Illegal App name: '{$appName}\",\r\n [\"duplicate-app\" /* AppError.DUPLICATE_APP */]: \"Firebase App named '{$appName}' already exists with different options or config\",\r\n [\"app-deleted\" /* AppError.APP_DELETED */]: \"Firebase App named '{$appName}' already deleted\",\r\n [\"no-options\" /* AppError.NO_OPTIONS */]: 'Need to provide options, when not being deployed to hosting via source.',\r\n [\"invalid-app-argument\" /* AppError.INVALID_APP_ARGUMENT */]: 'firebase.{$appName}() takes either no argument or a ' +\r\n 'Firebase App instance.',\r\n [\"invalid-log-argument\" /* AppError.INVALID_LOG_ARGUMENT */]: 'First argument to `onLog` must be null or a function.',\r\n [\"idb-open\" /* AppError.IDB_OPEN */]: 'Error thrown when opening IndexedDB. Original error: {$originalErrorMessage}.',\r\n [\"idb-get\" /* AppError.IDB_GET */]: 'Error thrown when reading from IndexedDB. Original error: {$originalErrorMessage}.',\r\n [\"idb-set\" /* AppError.IDB_WRITE */]: 'Error thrown when writing to IndexedDB. Original error: {$originalErrorMessage}.',\r\n [\"idb-delete\" /* AppError.IDB_DELETE */]: 'Error thrown when deleting from IndexedDB. Original error: {$originalErrorMessage}.'\r\n};\r\nconst ERROR_FACTORY = new ErrorFactory('app', 'Firebase', ERRORS);\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nclass FirebaseAppImpl {\r\n constructor(options, config, container) {\r\n this._isDeleted = false;\r\n this._options = Object.assign({}, options);\r\n this._config = Object.assign({}, config);\r\n this._name = config.name;\r\n this._automaticDataCollectionEnabled =\r\n config.automaticDataCollectionEnabled;\r\n this._container = container;\r\n this.container.addComponent(new Component('app', () => this, \"PUBLIC\" /* ComponentType.PUBLIC */));\r\n }\r\n get automaticDataCollectionEnabled() {\r\n this.checkDestroyed();\r\n return this._automaticDataCollectionEnabled;\r\n }\r\n set automaticDataCollectionEnabled(val) {\r\n this.checkDestroyed();\r\n this._automaticDataCollectionEnabled = val;\r\n }\r\n get name() {\r\n this.checkDestroyed();\r\n return this._name;\r\n }\r\n get options() {\r\n this.checkDestroyed();\r\n return this._options;\r\n }\r\n get config() {\r\n this.checkDestroyed();\r\n return this._config;\r\n }\r\n get container() {\r\n return this._container;\r\n }\r\n get isDeleted() {\r\n return this._isDeleted;\r\n }\r\n set isDeleted(val) {\r\n this._isDeleted = val;\r\n }\r\n /**\r\n * This function will throw an Error if the App has already been deleted -\r\n * use before performing API actions on the App.\r\n */\r\n checkDestroyed() {\r\n if (this.isDeleted) {\r\n throw ERROR_FACTORY.create(\"app-deleted\" /* AppError.APP_DELETED */, { appName: this._name });\r\n }\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * The current SDK version.\r\n *\r\n * @public\r\n */\r\nconst SDK_VERSION = version;\r\nfunction initializeApp(_options, rawConfig = {}) {\r\n let options = _options;\r\n if (typeof rawConfig !== 'object') {\r\n const name = rawConfig;\r\n rawConfig = { name };\r\n }\r\n const config = Object.assign({ name: DEFAULT_ENTRY_NAME, automaticDataCollectionEnabled: false }, rawConfig);\r\n const name = config.name;\r\n if (typeof name !== 'string' || !name) {\r\n throw ERROR_FACTORY.create(\"bad-app-name\" /* AppError.BAD_APP_NAME */, {\r\n appName: String(name)\r\n });\r\n }\r\n options || (options = getDefaultAppConfig());\r\n if (!options) {\r\n throw ERROR_FACTORY.create(\"no-options\" /* AppError.NO_OPTIONS */);\r\n }\r\n const existingApp = _apps.get(name);\r\n if (existingApp) {\r\n // return the existing app if options and config deep equal the ones in the existing app.\r\n if (deepEqual(options, existingApp.options) &&\r\n deepEqual(config, existingApp.config)) {\r\n return existingApp;\r\n }\r\n else {\r\n throw ERROR_FACTORY.create(\"duplicate-app\" /* AppError.DUPLICATE_APP */, { appName: name });\r\n }\r\n }\r\n const container = new ComponentContainer(name);\r\n for (const component of _components.values()) {\r\n container.addComponent(component);\r\n }\r\n const newApp = new FirebaseAppImpl(options, config, container);\r\n _apps.set(name, newApp);\r\n return newApp;\r\n}\r\n/**\r\n * Retrieves a {@link @firebase/app#FirebaseApp} instance.\r\n *\r\n * When called with no arguments, the default app is returned. When an app name\r\n * is provided, the app corresponding to that name is returned.\r\n *\r\n * An exception is thrown if the app being retrieved has not yet been\r\n * initialized.\r\n *\r\n * @example\r\n * ```javascript\r\n * // Return the default app\r\n * const app = getApp();\r\n * ```\r\n *\r\n * @example\r\n * ```javascript\r\n * // Return a named app\r\n * const otherApp = getApp(\"otherApp\");\r\n * ```\r\n *\r\n * @param name - Optional name of the app to return. If no name is\r\n * provided, the default is `\"[DEFAULT]\"`.\r\n *\r\n * @returns The app corresponding to the provided app name.\r\n * If no app name is provided, the default app is returned.\r\n *\r\n * @public\r\n */\r\nfunction getApp(name = DEFAULT_ENTRY_NAME) {\r\n const app = _apps.get(name);\r\n if (!app && name === DEFAULT_ENTRY_NAME) {\r\n return initializeApp();\r\n }\r\n if (!app) {\r\n throw ERROR_FACTORY.create(\"no-app\" /* AppError.NO_APP */, { appName: name });\r\n }\r\n return app;\r\n}\r\n/**\r\n * A (read-only) array of all initialized apps.\r\n * @public\r\n */\r\nfunction getApps() {\r\n return Array.from(_apps.values());\r\n}\r\n/**\r\n * Renders this app unusable and frees the resources of all associated\r\n * services.\r\n *\r\n * @example\r\n * ```javascript\r\n * deleteApp(app)\r\n * .then(function() {\r\n * console.log(\"App deleted successfully\");\r\n * })\r\n * .catch(function(error) {\r\n * console.log(\"Error deleting app:\", error);\r\n * });\r\n * ```\r\n *\r\n * @public\r\n */\r\nasync function deleteApp(app) {\r\n const name = app.name;\r\n if (_apps.has(name)) {\r\n _apps.delete(name);\r\n await Promise.all(app.container\r\n .getProviders()\r\n .map(provider => provider.delete()));\r\n app.isDeleted = true;\r\n }\r\n}\r\n/**\r\n * Registers a library's name and version for platform logging purposes.\r\n * @param library - Name of 1p or 3p library (e.g. firestore, angularfire)\r\n * @param version - Current version of that library.\r\n * @param variant - Bundle variant, e.g., node, rn, etc.\r\n *\r\n * @public\r\n */\r\nfunction registerVersion(libraryKeyOrName, version, variant) {\r\n var _a;\r\n // TODO: We can use this check to whitelist strings when/if we set up\r\n // a good whitelist system.\r\n let library = (_a = PLATFORM_LOG_STRING[libraryKeyOrName]) !== null && _a !== void 0 ? _a : libraryKeyOrName;\r\n if (variant) {\r\n library += `-${variant}`;\r\n }\r\n const libraryMismatch = library.match(/\\s|\\//);\r\n const versionMismatch = version.match(/\\s|\\//);\r\n if (libraryMismatch || versionMismatch) {\r\n const warning = [\r\n `Unable to register library \"${library}\" with version \"${version}\":`\r\n ];\r\n if (libraryMismatch) {\r\n warning.push(`library name \"${library}\" contains illegal characters (whitespace or \"/\")`);\r\n }\r\n if (libraryMismatch && versionMismatch) {\r\n warning.push('and');\r\n }\r\n if (versionMismatch) {\r\n warning.push(`version name \"${version}\" contains illegal characters (whitespace or \"/\")`);\r\n }\r\n logger.warn(warning.join(' '));\r\n return;\r\n }\r\n _registerComponent(new Component(`${library}-version`, () => ({ library, version }), \"VERSION\" /* ComponentType.VERSION */));\r\n}\r\n/**\r\n * Sets log handler for all Firebase SDKs.\r\n * @param logCallback - An optional custom log handler that executes user code whenever\r\n * the Firebase SDK makes a logging call.\r\n *\r\n * @public\r\n */\r\nfunction onLog(logCallback, options) {\r\n if (logCallback !== null && typeof logCallback !== 'function') {\r\n throw ERROR_FACTORY.create(\"invalid-log-argument\" /* AppError.INVALID_LOG_ARGUMENT */);\r\n }\r\n setUserLogHandler(logCallback, options);\r\n}\r\n/**\r\n * Sets log level for all Firebase SDKs.\r\n *\r\n * All of the log types above the current log level are captured (i.e. if\r\n * you set the log level to `info`, errors are logged, but `debug` and\r\n * `verbose` logs are not).\r\n *\r\n * @public\r\n */\r\nfunction setLogLevel(logLevel) {\r\n setLogLevel$1(logLevel);\r\n}\n\n/**\r\n * @license\r\n * Copyright 2021 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst DB_NAME = 'firebase-heartbeat-database';\r\nconst DB_VERSION = 1;\r\nconst STORE_NAME = 'firebase-heartbeat-store';\r\nlet dbPromise = null;\r\nfunction getDbPromise() {\r\n if (!dbPromise) {\r\n dbPromise = openDB(DB_NAME, DB_VERSION, {\r\n upgrade: (db, oldVersion) => {\r\n // We don't use 'break' in this switch statement, the fall-through\r\n // behavior is what we want, because if there are multiple versions between\r\n // the old version and the current version, we want ALL the migrations\r\n // that correspond to those versions to run, not only the last one.\r\n // eslint-disable-next-line default-case\r\n switch (oldVersion) {\r\n case 0:\r\n db.createObjectStore(STORE_NAME);\r\n }\r\n }\r\n }).catch(e => {\r\n throw ERROR_FACTORY.create(\"idb-open\" /* AppError.IDB_OPEN */, {\r\n originalErrorMessage: e.message\r\n });\r\n });\r\n }\r\n return dbPromise;\r\n}\r\nasync function readHeartbeatsFromIndexedDB(app) {\r\n try {\r\n const db = await getDbPromise();\r\n return db\r\n .transaction(STORE_NAME)\r\n .objectStore(STORE_NAME)\r\n .get(computeKey(app));\r\n }\r\n catch (e) {\r\n if (e instanceof FirebaseError) {\r\n logger.warn(e.message);\r\n }\r\n else {\r\n const idbGetError = ERROR_FACTORY.create(\"idb-get\" /* AppError.IDB_GET */, {\r\n originalErrorMessage: e === null || e === void 0 ? void 0 : e.message\r\n });\r\n logger.warn(idbGetError.message);\r\n }\r\n }\r\n}\r\nasync function writeHeartbeatsToIndexedDB(app, heartbeatObject) {\r\n try {\r\n const db = await getDbPromise();\r\n const tx = db.transaction(STORE_NAME, 'readwrite');\r\n const objectStore = tx.objectStore(STORE_NAME);\r\n await objectStore.put(heartbeatObject, computeKey(app));\r\n return tx.done;\r\n }\r\n catch (e) {\r\n if (e instanceof FirebaseError) {\r\n logger.warn(e.message);\r\n }\r\n else {\r\n const idbGetError = ERROR_FACTORY.create(\"idb-set\" /* AppError.IDB_WRITE */, {\r\n originalErrorMessage: e === null || e === void 0 ? void 0 : e.message\r\n });\r\n logger.warn(idbGetError.message);\r\n }\r\n }\r\n}\r\nfunction computeKey(app) {\r\n return `${app.name}!${app.options.appId}`;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2021 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst MAX_HEADER_BYTES = 1024;\r\n// 30 days\r\nconst STORED_HEARTBEAT_RETENTION_MAX_MILLIS = 30 * 24 * 60 * 60 * 1000;\r\nclass HeartbeatServiceImpl {\r\n constructor(container) {\r\n this.container = container;\r\n /**\r\n * In-memory cache for heartbeats, used by getHeartbeatsHeader() to generate\r\n * the header string.\r\n * Stores one record per date. This will be consolidated into the standard\r\n * format of one record per user agent string before being sent as a header.\r\n * Populated from indexedDB when the controller is instantiated and should\r\n * be kept in sync with indexedDB.\r\n * Leave public for easier testing.\r\n */\r\n this._heartbeatsCache = null;\r\n const app = this.container.getProvider('app').getImmediate();\r\n this._storage = new HeartbeatStorageImpl(app);\r\n this._heartbeatsCachePromise = this._storage.read().then(result => {\r\n this._heartbeatsCache = result;\r\n return result;\r\n });\r\n }\r\n /**\r\n * Called to report a heartbeat. The function will generate\r\n * a HeartbeatsByUserAgent object, update heartbeatsCache, and persist it\r\n * to IndexedDB.\r\n * Note that we only store one heartbeat per day. So if a heartbeat for today is\r\n * already logged, subsequent calls to this function in the same day will be ignored.\r\n */\r\n async triggerHeartbeat() {\r\n const platformLogger = this.container\r\n .getProvider('platform-logger')\r\n .getImmediate();\r\n // This is the \"Firebase user agent\" string from the platform logger\r\n // service, not the browser user agent.\r\n const agent = platformLogger.getPlatformInfoString();\r\n const date = getUTCDateString();\r\n if (this._heartbeatsCache === null) {\r\n this._heartbeatsCache = await this._heartbeatsCachePromise;\r\n }\r\n // Do not store a heartbeat if one is already stored for this day\r\n // or if a header has already been sent today.\r\n if (this._heartbeatsCache.lastSentHeartbeatDate === date ||\r\n this._heartbeatsCache.heartbeats.some(singleDateHeartbeat => singleDateHeartbeat.date === date)) {\r\n return;\r\n }\r\n else {\r\n // There is no entry for this date. Create one.\r\n this._heartbeatsCache.heartbeats.push({ date, agent });\r\n }\r\n // Remove entries older than 30 days.\r\n this._heartbeatsCache.heartbeats = this._heartbeatsCache.heartbeats.filter(singleDateHeartbeat => {\r\n const hbTimestamp = new Date(singleDateHeartbeat.date).valueOf();\r\n const now = Date.now();\r\n return now - hbTimestamp <= STORED_HEARTBEAT_RETENTION_MAX_MILLIS;\r\n });\r\n return this._storage.overwrite(this._heartbeatsCache);\r\n }\r\n /**\r\n * Returns a base64 encoded string which can be attached to the heartbeat-specific header directly.\r\n * It also clears all heartbeats from memory as well as in IndexedDB.\r\n *\r\n * NOTE: Consuming product SDKs should not send the header if this method\r\n * returns an empty string.\r\n */\r\n async getHeartbeatsHeader() {\r\n if (this._heartbeatsCache === null) {\r\n await this._heartbeatsCachePromise;\r\n }\r\n // If it's still null or the array is empty, there is no data to send.\r\n if (this._heartbeatsCache === null ||\r\n this._heartbeatsCache.heartbeats.length === 0) {\r\n return '';\r\n }\r\n const date = getUTCDateString();\r\n // Extract as many heartbeats from the cache as will fit under the size limit.\r\n const { heartbeatsToSend, unsentEntries } = extractHeartbeatsForHeader(this._heartbeatsCache.heartbeats);\r\n const headerString = base64urlEncodeWithoutPadding(JSON.stringify({ version: 2, heartbeats: heartbeatsToSend }));\r\n // Store last sent date to prevent another being logged/sent for the same day.\r\n this._heartbeatsCache.lastSentHeartbeatDate = date;\r\n if (unsentEntries.length > 0) {\r\n // Store any unsent entries if they exist.\r\n this._heartbeatsCache.heartbeats = unsentEntries;\r\n // This seems more likely than emptying the array (below) to lead to some odd state\r\n // since the cache isn't empty and this will be called again on the next request,\r\n // and is probably safest if we await it.\r\n await this._storage.overwrite(this._heartbeatsCache);\r\n }\r\n else {\r\n this._heartbeatsCache.heartbeats = [];\r\n // Do not wait for this, to reduce latency.\r\n void this._storage.overwrite(this._heartbeatsCache);\r\n }\r\n return headerString;\r\n }\r\n}\r\nfunction getUTCDateString() {\r\n const today = new Date();\r\n // Returns date format 'YYYY-MM-DD'\r\n return today.toISOString().substring(0, 10);\r\n}\r\nfunction extractHeartbeatsForHeader(heartbeatsCache, maxSize = MAX_HEADER_BYTES) {\r\n // Heartbeats grouped by user agent in the standard format to be sent in\r\n // the header.\r\n const heartbeatsToSend = [];\r\n // Single date format heartbeats that are not sent.\r\n let unsentEntries = heartbeatsCache.slice();\r\n for (const singleDateHeartbeat of heartbeatsCache) {\r\n // Look for an existing entry with the same user agent.\r\n const heartbeatEntry = heartbeatsToSend.find(hb => hb.agent === singleDateHeartbeat.agent);\r\n if (!heartbeatEntry) {\r\n // If no entry for this user agent exists, create one.\r\n heartbeatsToSend.push({\r\n agent: singleDateHeartbeat.agent,\r\n dates: [singleDateHeartbeat.date]\r\n });\r\n if (countBytes(heartbeatsToSend) > maxSize) {\r\n // If the header would exceed max size, remove the added heartbeat\r\n // entry and stop adding to the header.\r\n heartbeatsToSend.pop();\r\n break;\r\n }\r\n }\r\n else {\r\n heartbeatEntry.dates.push(singleDateHeartbeat.date);\r\n // If the header would exceed max size, remove the added date\r\n // and stop adding to the header.\r\n if (countBytes(heartbeatsToSend) > maxSize) {\r\n heartbeatEntry.dates.pop();\r\n break;\r\n }\r\n }\r\n // Pop unsent entry from queue. (Skipped if adding the entry exceeded\r\n // quota and the loop breaks early.)\r\n unsentEntries = unsentEntries.slice(1);\r\n }\r\n return {\r\n heartbeatsToSend,\r\n unsentEntries\r\n };\r\n}\r\nclass HeartbeatStorageImpl {\r\n constructor(app) {\r\n this.app = app;\r\n this._canUseIndexedDBPromise = this.runIndexedDBEnvironmentCheck();\r\n }\r\n async runIndexedDBEnvironmentCheck() {\r\n if (!isIndexedDBAvailable()) {\r\n return false;\r\n }\r\n else {\r\n return validateIndexedDBOpenable()\r\n .then(() => true)\r\n .catch(() => false);\r\n }\r\n }\r\n /**\r\n * Read all heartbeats.\r\n */\r\n async read() {\r\n const canUseIndexedDB = await this._canUseIndexedDBPromise;\r\n if (!canUseIndexedDB) {\r\n return { heartbeats: [] };\r\n }\r\n else {\r\n const idbHeartbeatObject = await readHeartbeatsFromIndexedDB(this.app);\r\n return idbHeartbeatObject || { heartbeats: [] };\r\n }\r\n }\r\n // overwrite the storage with the provided heartbeats\r\n async overwrite(heartbeatsObject) {\r\n var _a;\r\n const canUseIndexedDB = await this._canUseIndexedDBPromise;\r\n if (!canUseIndexedDB) {\r\n return;\r\n }\r\n else {\r\n const existingHeartbeatsObject = await this.read();\r\n return writeHeartbeatsToIndexedDB(this.app, {\r\n lastSentHeartbeatDate: (_a = heartbeatsObject.lastSentHeartbeatDate) !== null && _a !== void 0 ? _a : existingHeartbeatsObject.lastSentHeartbeatDate,\r\n heartbeats: heartbeatsObject.heartbeats\r\n });\r\n }\r\n }\r\n // add heartbeats\r\n async add(heartbeatsObject) {\r\n var _a;\r\n const canUseIndexedDB = await this._canUseIndexedDBPromise;\r\n if (!canUseIndexedDB) {\r\n return;\r\n }\r\n else {\r\n const existingHeartbeatsObject = await this.read();\r\n return writeHeartbeatsToIndexedDB(this.app, {\r\n lastSentHeartbeatDate: (_a = heartbeatsObject.lastSentHeartbeatDate) !== null && _a !== void 0 ? _a : existingHeartbeatsObject.lastSentHeartbeatDate,\r\n heartbeats: [\r\n ...existingHeartbeatsObject.heartbeats,\r\n ...heartbeatsObject.heartbeats\r\n ]\r\n });\r\n }\r\n }\r\n}\r\n/**\r\n * Calculate bytes of a HeartbeatsByUserAgent array after being wrapped\r\n * in a platform logging header JSON object, stringified, and converted\r\n * to base 64.\r\n */\r\nfunction countBytes(heartbeatsCache) {\r\n // base64 has a restricted set of characters, all of which should be 1 byte.\r\n return base64urlEncodeWithoutPadding(\r\n // heartbeatsCache wrapper properties\r\n JSON.stringify({ version: 2, heartbeats: heartbeatsCache })).length;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction registerCoreComponents(variant) {\r\n _registerComponent(new Component('platform-logger', container => new PlatformLoggerServiceImpl(container), \"PRIVATE\" /* ComponentType.PRIVATE */));\r\n _registerComponent(new Component('heartbeat', container => new HeartbeatServiceImpl(container), \"PRIVATE\" /* ComponentType.PRIVATE */));\r\n // Register `app` package.\r\n registerVersion(name$o, version$1, variant);\r\n // BUILD_TARGET will be replaced by values like esm5, esm2017, cjs5, etc during the compilation\r\n registerVersion(name$o, version$1, 'esm2017');\r\n // Register platform SDK identifier (no version).\r\n registerVersion('fire-js', '');\r\n}\n\n/**\r\n * Firebase App\r\n *\r\n * @remarks This package coordinates the communication between the different Firebase components\r\n * @packageDocumentation\r\n */\r\nregisterCoreComponents('');\n\nexport { SDK_VERSION, DEFAULT_ENTRY_NAME as _DEFAULT_ENTRY_NAME, _addComponent, _addOrOverwriteComponent, _apps, _clearComponents, _components, _getProvider, _registerComponent, _removeServiceInstance, deleteApp, getApp, getApps, initializeApp, onLog, registerVersion, setLogLevel };\n//# sourceMappingURL=index.esm2017.js.map\n","import { registerVersion } from '@firebase/app';\nexport * from '@firebase/app';\n\nvar name = \"firebase\";\nvar version = \"9.16.0\";\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nregisterVersion(name, version, 'app');\n//# sourceMappingURL=index.esm.js.map\n","import { _getProvider, getApp, _registerComponent, registerVersion } from '@firebase/app';\nimport { Component } from '@firebase/component';\nimport { ErrorFactory, FirebaseError } from '@firebase/util';\nimport { openDB } from 'idb';\n\nconst name = \"@firebase/installations\";\nconst version = \"0.6.1\";\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst PENDING_TIMEOUT_MS = 10000;\r\nconst PACKAGE_VERSION = `w:${version}`;\r\nconst INTERNAL_AUTH_VERSION = 'FIS_v2';\r\nconst INSTALLATIONS_API_URL = 'https://firebaseinstallations.googleapis.com/v1';\r\nconst TOKEN_EXPIRATION_BUFFER = 60 * 60 * 1000; // One hour\r\nconst SERVICE = 'installations';\r\nconst SERVICE_NAME = 'Installations';\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst ERROR_DESCRIPTION_MAP = {\r\n [\"missing-app-config-values\" /* ErrorCode.MISSING_APP_CONFIG_VALUES */]: 'Missing App configuration value: \"{$valueName}\"',\r\n [\"not-registered\" /* ErrorCode.NOT_REGISTERED */]: 'Firebase Installation is not registered.',\r\n [\"installation-not-found\" /* ErrorCode.INSTALLATION_NOT_FOUND */]: 'Firebase Installation not found.',\r\n [\"request-failed\" /* ErrorCode.REQUEST_FAILED */]: '{$requestName} request failed with error \"{$serverCode} {$serverStatus}: {$serverMessage}\"',\r\n [\"app-offline\" /* ErrorCode.APP_OFFLINE */]: 'Could not process request. Application offline.',\r\n [\"delete-pending-registration\" /* ErrorCode.DELETE_PENDING_REGISTRATION */]: \"Can't delete installation while there is a pending registration request.\"\r\n};\r\nconst ERROR_FACTORY = new ErrorFactory(SERVICE, SERVICE_NAME, ERROR_DESCRIPTION_MAP);\r\n/** Returns true if error is a FirebaseError that is based on an error from the server. */\r\nfunction isServerError(error) {\r\n return (error instanceof FirebaseError &&\r\n error.code.includes(\"request-failed\" /* ErrorCode.REQUEST_FAILED */));\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction getInstallationsEndpoint({ projectId }) {\r\n return `${INSTALLATIONS_API_URL}/projects/${projectId}/installations`;\r\n}\r\nfunction extractAuthTokenInfoFromResponse(response) {\r\n return {\r\n token: response.token,\r\n requestStatus: 2 /* RequestStatus.COMPLETED */,\r\n expiresIn: getExpiresInFromResponseExpiresIn(response.expiresIn),\r\n creationTime: Date.now()\r\n };\r\n}\r\nasync function getErrorFromResponse(requestName, response) {\r\n const responseJson = await response.json();\r\n const errorData = responseJson.error;\r\n return ERROR_FACTORY.create(\"request-failed\" /* ErrorCode.REQUEST_FAILED */, {\r\n requestName,\r\n serverCode: errorData.code,\r\n serverMessage: errorData.message,\r\n serverStatus: errorData.status\r\n });\r\n}\r\nfunction getHeaders({ apiKey }) {\r\n return new Headers({\r\n 'Content-Type': 'application/json',\r\n Accept: 'application/json',\r\n 'x-goog-api-key': apiKey\r\n });\r\n}\r\nfunction getHeadersWithAuth(appConfig, { refreshToken }) {\r\n const headers = getHeaders(appConfig);\r\n headers.append('Authorization', getAuthorizationHeader(refreshToken));\r\n return headers;\r\n}\r\n/**\r\n * Calls the passed in fetch wrapper and returns the response.\r\n * If the returned response has a status of 5xx, re-runs the function once and\r\n * returns the response.\r\n */\r\nasync function retryIfServerError(fn) {\r\n const result = await fn();\r\n if (result.status >= 500 && result.status < 600) {\r\n // Internal Server Error. Retry request.\r\n return fn();\r\n }\r\n return result;\r\n}\r\nfunction getExpiresInFromResponseExpiresIn(responseExpiresIn) {\r\n // This works because the server will never respond with fractions of a second.\r\n return Number(responseExpiresIn.replace('s', '000'));\r\n}\r\nfunction getAuthorizationHeader(refreshToken) {\r\n return `${INTERNAL_AUTH_VERSION} ${refreshToken}`;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nasync function createInstallationRequest({ appConfig, heartbeatServiceProvider }, { fid }) {\r\n const endpoint = getInstallationsEndpoint(appConfig);\r\n const headers = getHeaders(appConfig);\r\n // If heartbeat service exists, add the heartbeat string to the header.\r\n const heartbeatService = heartbeatServiceProvider.getImmediate({\r\n optional: true\r\n });\r\n if (heartbeatService) {\r\n const heartbeatsHeader = await heartbeatService.getHeartbeatsHeader();\r\n if (heartbeatsHeader) {\r\n headers.append('x-firebase-client', heartbeatsHeader);\r\n }\r\n }\r\n const body = {\r\n fid,\r\n authVersion: INTERNAL_AUTH_VERSION,\r\n appId: appConfig.appId,\r\n sdkVersion: PACKAGE_VERSION\r\n };\r\n const request = {\r\n method: 'POST',\r\n headers,\r\n body: JSON.stringify(body)\r\n };\r\n const response = await retryIfServerError(() => fetch(endpoint, request));\r\n if (response.ok) {\r\n const responseValue = await response.json();\r\n const registeredInstallationEntry = {\r\n fid: responseValue.fid || fid,\r\n registrationStatus: 2 /* RequestStatus.COMPLETED */,\r\n refreshToken: responseValue.refreshToken,\r\n authToken: extractAuthTokenInfoFromResponse(responseValue.authToken)\r\n };\r\n return registeredInstallationEntry;\r\n }\r\n else {\r\n throw await getErrorFromResponse('Create Installation', response);\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/** Returns a promise that resolves after given time passes. */\r\nfunction sleep(ms) {\r\n return new Promise(resolve => {\r\n setTimeout(resolve, ms);\r\n });\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction bufferToBase64UrlSafe(array) {\r\n const b64 = btoa(String.fromCharCode(...array));\r\n return b64.replace(/\\+/g, '-').replace(/\\//g, '_');\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst VALID_FID_PATTERN = /^[cdef][\\w-]{21}$/;\r\nconst INVALID_FID = '';\r\n/**\r\n * Generates a new FID using random values from Web Crypto API.\r\n * Returns an empty string if FID generation fails for any reason.\r\n */\r\nfunction generateFid() {\r\n try {\r\n // A valid FID has exactly 22 base64 characters, which is 132 bits, or 16.5\r\n // bytes. our implementation generates a 17 byte array instead.\r\n const fidByteArray = new Uint8Array(17);\r\n const crypto = self.crypto || self.msCrypto;\r\n crypto.getRandomValues(fidByteArray);\r\n // Replace the first 4 random bits with the constant FID header of 0b0111.\r\n fidByteArray[0] = 0b01110000 + (fidByteArray[0] % 0b00010000);\r\n const fid = encode(fidByteArray);\r\n return VALID_FID_PATTERN.test(fid) ? fid : INVALID_FID;\r\n }\r\n catch (_a) {\r\n // FID generation errored\r\n return INVALID_FID;\r\n }\r\n}\r\n/** Converts a FID Uint8Array to a base64 string representation. */\r\nfunction encode(fidByteArray) {\r\n const b64String = bufferToBase64UrlSafe(fidByteArray);\r\n // Remove the 23rd character that was added because of the extra 4 bits at the\r\n // end of our 17 byte array, and the '=' padding.\r\n return b64String.substr(0, 22);\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/** Returns a string key that can be used to identify the app. */\r\nfunction getKey(appConfig) {\r\n return `${appConfig.appName}!${appConfig.appId}`;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst fidChangeCallbacks = new Map();\r\n/**\r\n * Calls the onIdChange callbacks with the new FID value, and broadcasts the\r\n * change to other tabs.\r\n */\r\nfunction fidChanged(appConfig, fid) {\r\n const key = getKey(appConfig);\r\n callFidChangeCallbacks(key, fid);\r\n broadcastFidChange(key, fid);\r\n}\r\nfunction addCallback(appConfig, callback) {\r\n // Open the broadcast channel if it's not already open,\r\n // to be able to listen to change events from other tabs.\r\n getBroadcastChannel();\r\n const key = getKey(appConfig);\r\n let callbackSet = fidChangeCallbacks.get(key);\r\n if (!callbackSet) {\r\n callbackSet = new Set();\r\n fidChangeCallbacks.set(key, callbackSet);\r\n }\r\n callbackSet.add(callback);\r\n}\r\nfunction removeCallback(appConfig, callback) {\r\n const key = getKey(appConfig);\r\n const callbackSet = fidChangeCallbacks.get(key);\r\n if (!callbackSet) {\r\n return;\r\n }\r\n callbackSet.delete(callback);\r\n if (callbackSet.size === 0) {\r\n fidChangeCallbacks.delete(key);\r\n }\r\n // Close broadcast channel if there are no more callbacks.\r\n closeBroadcastChannel();\r\n}\r\nfunction callFidChangeCallbacks(key, fid) {\r\n const callbacks = fidChangeCallbacks.get(key);\r\n if (!callbacks) {\r\n return;\r\n }\r\n for (const callback of callbacks) {\r\n callback(fid);\r\n }\r\n}\r\nfunction broadcastFidChange(key, fid) {\r\n const channel = getBroadcastChannel();\r\n if (channel) {\r\n channel.postMessage({ key, fid });\r\n }\r\n closeBroadcastChannel();\r\n}\r\nlet broadcastChannel = null;\r\n/** Opens and returns a BroadcastChannel if it is supported by the browser. */\r\nfunction getBroadcastChannel() {\r\n if (!broadcastChannel && 'BroadcastChannel' in self) {\r\n broadcastChannel = new BroadcastChannel('[Firebase] FID Change');\r\n broadcastChannel.onmessage = e => {\r\n callFidChangeCallbacks(e.data.key, e.data.fid);\r\n };\r\n }\r\n return broadcastChannel;\r\n}\r\nfunction closeBroadcastChannel() {\r\n if (fidChangeCallbacks.size === 0 && broadcastChannel) {\r\n broadcastChannel.close();\r\n broadcastChannel = null;\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst DATABASE_NAME = 'firebase-installations-database';\r\nconst DATABASE_VERSION = 1;\r\nconst OBJECT_STORE_NAME = 'firebase-installations-store';\r\nlet dbPromise = null;\r\nfunction getDbPromise() {\r\n if (!dbPromise) {\r\n dbPromise = openDB(DATABASE_NAME, DATABASE_VERSION, {\r\n upgrade: (db, oldVersion) => {\r\n // We don't use 'break' in this switch statement, the fall-through\r\n // behavior is what we want, because if there are multiple versions between\r\n // the old version and the current version, we want ALL the migrations\r\n // that correspond to those versions to run, not only the last one.\r\n // eslint-disable-next-line default-case\r\n switch (oldVersion) {\r\n case 0:\r\n db.createObjectStore(OBJECT_STORE_NAME);\r\n }\r\n }\r\n });\r\n }\r\n return dbPromise;\r\n}\r\n/** Assigns or overwrites the record for the given key with the given value. */\r\nasync function set(appConfig, value) {\r\n const key = getKey(appConfig);\r\n const db = await getDbPromise();\r\n const tx = db.transaction(OBJECT_STORE_NAME, 'readwrite');\r\n const objectStore = tx.objectStore(OBJECT_STORE_NAME);\r\n const oldValue = (await objectStore.get(key));\r\n await objectStore.put(value, key);\r\n await tx.done;\r\n if (!oldValue || oldValue.fid !== value.fid) {\r\n fidChanged(appConfig, value.fid);\r\n }\r\n return value;\r\n}\r\n/** Removes record(s) from the objectStore that match the given key. */\r\nasync function remove(appConfig) {\r\n const key = getKey(appConfig);\r\n const db = await getDbPromise();\r\n const tx = db.transaction(OBJECT_STORE_NAME, 'readwrite');\r\n await tx.objectStore(OBJECT_STORE_NAME).delete(key);\r\n await tx.done;\r\n}\r\n/**\r\n * Atomically updates a record with the result of updateFn, which gets\r\n * called with the current value. If newValue is undefined, the record is\r\n * deleted instead.\r\n * @return Updated value\r\n */\r\nasync function update(appConfig, updateFn) {\r\n const key = getKey(appConfig);\r\n const db = await getDbPromise();\r\n const tx = db.transaction(OBJECT_STORE_NAME, 'readwrite');\r\n const store = tx.objectStore(OBJECT_STORE_NAME);\r\n const oldValue = (await store.get(key));\r\n const newValue = updateFn(oldValue);\r\n if (newValue === undefined) {\r\n await store.delete(key);\r\n }\r\n else {\r\n await store.put(newValue, key);\r\n }\r\n await tx.done;\r\n if (newValue && (!oldValue || oldValue.fid !== newValue.fid)) {\r\n fidChanged(appConfig, newValue.fid);\r\n }\r\n return newValue;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Updates and returns the InstallationEntry from the database.\r\n * Also triggers a registration request if it is necessary and possible.\r\n */\r\nasync function getInstallationEntry(installations) {\r\n let registrationPromise;\r\n const installationEntry = await update(installations.appConfig, oldEntry => {\r\n const installationEntry = updateOrCreateInstallationEntry(oldEntry);\r\n const entryWithPromise = triggerRegistrationIfNecessary(installations, installationEntry);\r\n registrationPromise = entryWithPromise.registrationPromise;\r\n return entryWithPromise.installationEntry;\r\n });\r\n if (installationEntry.fid === INVALID_FID) {\r\n // FID generation failed. Waiting for the FID from the server.\r\n return { installationEntry: await registrationPromise };\r\n }\r\n return {\r\n installationEntry,\r\n registrationPromise\r\n };\r\n}\r\n/**\r\n * Creates a new Installation Entry if one does not exist.\r\n * Also clears timed out pending requests.\r\n */\r\nfunction updateOrCreateInstallationEntry(oldEntry) {\r\n const entry = oldEntry || {\r\n fid: generateFid(),\r\n registrationStatus: 0 /* RequestStatus.NOT_STARTED */\r\n };\r\n return clearTimedOutRequest(entry);\r\n}\r\n/**\r\n * If the Firebase Installation is not registered yet, this will trigger the\r\n * registration and return an InProgressInstallationEntry.\r\n *\r\n * If registrationPromise does not exist, the installationEntry is guaranteed\r\n * to be registered.\r\n */\r\nfunction triggerRegistrationIfNecessary(installations, installationEntry) {\r\n if (installationEntry.registrationStatus === 0 /* RequestStatus.NOT_STARTED */) {\r\n if (!navigator.onLine) {\r\n // Registration required but app is offline.\r\n const registrationPromiseWithError = Promise.reject(ERROR_FACTORY.create(\"app-offline\" /* ErrorCode.APP_OFFLINE */));\r\n return {\r\n installationEntry,\r\n registrationPromise: registrationPromiseWithError\r\n };\r\n }\r\n // Try registering. Change status to IN_PROGRESS.\r\n const inProgressEntry = {\r\n fid: installationEntry.fid,\r\n registrationStatus: 1 /* RequestStatus.IN_PROGRESS */,\r\n registrationTime: Date.now()\r\n };\r\n const registrationPromise = registerInstallation(installations, inProgressEntry);\r\n return { installationEntry: inProgressEntry, registrationPromise };\r\n }\r\n else if (installationEntry.registrationStatus === 1 /* RequestStatus.IN_PROGRESS */) {\r\n return {\r\n installationEntry,\r\n registrationPromise: waitUntilFidRegistration(installations)\r\n };\r\n }\r\n else {\r\n return { installationEntry };\r\n }\r\n}\r\n/** This will be executed only once for each new Firebase Installation. */\r\nasync function registerInstallation(installations, installationEntry) {\r\n try {\r\n const registeredInstallationEntry = await createInstallationRequest(installations, installationEntry);\r\n return set(installations.appConfig, registeredInstallationEntry);\r\n }\r\n catch (e) {\r\n if (isServerError(e) && e.customData.serverCode === 409) {\r\n // Server returned a \"FID can not be used\" error.\r\n // Generate a new ID next time.\r\n await remove(installations.appConfig);\r\n }\r\n else {\r\n // Registration failed. Set FID as not registered.\r\n await set(installations.appConfig, {\r\n fid: installationEntry.fid,\r\n registrationStatus: 0 /* RequestStatus.NOT_STARTED */\r\n });\r\n }\r\n throw e;\r\n }\r\n}\r\n/** Call if FID registration is pending in another request. */\r\nasync function waitUntilFidRegistration(installations) {\r\n // Unfortunately, there is no way of reliably observing when a value in\r\n // IndexedDB changes (yet, see https://github.com/WICG/indexed-db-observers),\r\n // so we need to poll.\r\n let entry = await updateInstallationRequest(installations.appConfig);\r\n while (entry.registrationStatus === 1 /* RequestStatus.IN_PROGRESS */) {\r\n // createInstallation request still in progress.\r\n await sleep(100);\r\n entry = await updateInstallationRequest(installations.appConfig);\r\n }\r\n if (entry.registrationStatus === 0 /* RequestStatus.NOT_STARTED */) {\r\n // The request timed out or failed in a different call. Try again.\r\n const { installationEntry, registrationPromise } = await getInstallationEntry(installations);\r\n if (registrationPromise) {\r\n return registrationPromise;\r\n }\r\n else {\r\n // if there is no registrationPromise, entry is registered.\r\n return installationEntry;\r\n }\r\n }\r\n return entry;\r\n}\r\n/**\r\n * Called only if there is a CreateInstallation request in progress.\r\n *\r\n * Updates the InstallationEntry in the DB based on the status of the\r\n * CreateInstallation request.\r\n *\r\n * Returns the updated InstallationEntry.\r\n */\r\nfunction updateInstallationRequest(appConfig) {\r\n return update(appConfig, oldEntry => {\r\n if (!oldEntry) {\r\n throw ERROR_FACTORY.create(\"installation-not-found\" /* ErrorCode.INSTALLATION_NOT_FOUND */);\r\n }\r\n return clearTimedOutRequest(oldEntry);\r\n });\r\n}\r\nfunction clearTimedOutRequest(entry) {\r\n if (hasInstallationRequestTimedOut(entry)) {\r\n return {\r\n fid: entry.fid,\r\n registrationStatus: 0 /* RequestStatus.NOT_STARTED */\r\n };\r\n }\r\n return entry;\r\n}\r\nfunction hasInstallationRequestTimedOut(installationEntry) {\r\n return (installationEntry.registrationStatus === 1 /* RequestStatus.IN_PROGRESS */ &&\r\n installationEntry.registrationTime + PENDING_TIMEOUT_MS < Date.now());\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nasync function generateAuthTokenRequest({ appConfig, heartbeatServiceProvider }, installationEntry) {\r\n const endpoint = getGenerateAuthTokenEndpoint(appConfig, installationEntry);\r\n const headers = getHeadersWithAuth(appConfig, installationEntry);\r\n // If heartbeat service exists, add the heartbeat string to the header.\r\n const heartbeatService = heartbeatServiceProvider.getImmediate({\r\n optional: true\r\n });\r\n if (heartbeatService) {\r\n const heartbeatsHeader = await heartbeatService.getHeartbeatsHeader();\r\n if (heartbeatsHeader) {\r\n headers.append('x-firebase-client', heartbeatsHeader);\r\n }\r\n }\r\n const body = {\r\n installation: {\r\n sdkVersion: PACKAGE_VERSION,\r\n appId: appConfig.appId\r\n }\r\n };\r\n const request = {\r\n method: 'POST',\r\n headers,\r\n body: JSON.stringify(body)\r\n };\r\n const response = await retryIfServerError(() => fetch(endpoint, request));\r\n if (response.ok) {\r\n const responseValue = await response.json();\r\n const completedAuthToken = extractAuthTokenInfoFromResponse(responseValue);\r\n return completedAuthToken;\r\n }\r\n else {\r\n throw await getErrorFromResponse('Generate Auth Token', response);\r\n }\r\n}\r\nfunction getGenerateAuthTokenEndpoint(appConfig, { fid }) {\r\n return `${getInstallationsEndpoint(appConfig)}/${fid}/authTokens:generate`;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Returns a valid authentication token for the installation. Generates a new\r\n * token if one doesn't exist, is expired or about to expire.\r\n *\r\n * Should only be called if the Firebase Installation is registered.\r\n */\r\nasync function refreshAuthToken(installations, forceRefresh = false) {\r\n let tokenPromise;\r\n const entry = await update(installations.appConfig, oldEntry => {\r\n if (!isEntryRegistered(oldEntry)) {\r\n throw ERROR_FACTORY.create(\"not-registered\" /* ErrorCode.NOT_REGISTERED */);\r\n }\r\n const oldAuthToken = oldEntry.authToken;\r\n if (!forceRefresh && isAuthTokenValid(oldAuthToken)) {\r\n // There is a valid token in the DB.\r\n return oldEntry;\r\n }\r\n else if (oldAuthToken.requestStatus === 1 /* RequestStatus.IN_PROGRESS */) {\r\n // There already is a token request in progress.\r\n tokenPromise = waitUntilAuthTokenRequest(installations, forceRefresh);\r\n return oldEntry;\r\n }\r\n else {\r\n // No token or token expired.\r\n if (!navigator.onLine) {\r\n throw ERROR_FACTORY.create(\"app-offline\" /* ErrorCode.APP_OFFLINE */);\r\n }\r\n const inProgressEntry = makeAuthTokenRequestInProgressEntry(oldEntry);\r\n tokenPromise = fetchAuthTokenFromServer(installations, inProgressEntry);\r\n return inProgressEntry;\r\n }\r\n });\r\n const authToken = tokenPromise\r\n ? await tokenPromise\r\n : entry.authToken;\r\n return authToken;\r\n}\r\n/**\r\n * Call only if FID is registered and Auth Token request is in progress.\r\n *\r\n * Waits until the current pending request finishes. If the request times out,\r\n * tries once in this thread as well.\r\n */\r\nasync function waitUntilAuthTokenRequest(installations, forceRefresh) {\r\n // Unfortunately, there is no way of reliably observing when a value in\r\n // IndexedDB changes (yet, see https://github.com/WICG/indexed-db-observers),\r\n // so we need to poll.\r\n let entry = await updateAuthTokenRequest(installations.appConfig);\r\n while (entry.authToken.requestStatus === 1 /* RequestStatus.IN_PROGRESS */) {\r\n // generateAuthToken still in progress.\r\n await sleep(100);\r\n entry = await updateAuthTokenRequest(installations.appConfig);\r\n }\r\n const authToken = entry.authToken;\r\n if (authToken.requestStatus === 0 /* RequestStatus.NOT_STARTED */) {\r\n // The request timed out or failed in a different call. Try again.\r\n return refreshAuthToken(installations, forceRefresh);\r\n }\r\n else {\r\n return authToken;\r\n }\r\n}\r\n/**\r\n * Called only if there is a GenerateAuthToken request in progress.\r\n *\r\n * Updates the InstallationEntry in the DB based on the status of the\r\n * GenerateAuthToken request.\r\n *\r\n * Returns the updated InstallationEntry.\r\n */\r\nfunction updateAuthTokenRequest(appConfig) {\r\n return update(appConfig, oldEntry => {\r\n if (!isEntryRegistered(oldEntry)) {\r\n throw ERROR_FACTORY.create(\"not-registered\" /* ErrorCode.NOT_REGISTERED */);\r\n }\r\n const oldAuthToken = oldEntry.authToken;\r\n if (hasAuthTokenRequestTimedOut(oldAuthToken)) {\r\n return Object.assign(Object.assign({}, oldEntry), { authToken: { requestStatus: 0 /* RequestStatus.NOT_STARTED */ } });\r\n }\r\n return oldEntry;\r\n });\r\n}\r\nasync function fetchAuthTokenFromServer(installations, installationEntry) {\r\n try {\r\n const authToken = await generateAuthTokenRequest(installations, installationEntry);\r\n const updatedInstallationEntry = Object.assign(Object.assign({}, installationEntry), { authToken });\r\n await set(installations.appConfig, updatedInstallationEntry);\r\n return authToken;\r\n }\r\n catch (e) {\r\n if (isServerError(e) &&\r\n (e.customData.serverCode === 401 || e.customData.serverCode === 404)) {\r\n // Server returned a \"FID not found\" or a \"Invalid authentication\" error.\r\n // Generate a new ID next time.\r\n await remove(installations.appConfig);\r\n }\r\n else {\r\n const updatedInstallationEntry = Object.assign(Object.assign({}, installationEntry), { authToken: { requestStatus: 0 /* RequestStatus.NOT_STARTED */ } });\r\n await set(installations.appConfig, updatedInstallationEntry);\r\n }\r\n throw e;\r\n }\r\n}\r\nfunction isEntryRegistered(installationEntry) {\r\n return (installationEntry !== undefined &&\r\n installationEntry.registrationStatus === 2 /* RequestStatus.COMPLETED */);\r\n}\r\nfunction isAuthTokenValid(authToken) {\r\n return (authToken.requestStatus === 2 /* RequestStatus.COMPLETED */ &&\r\n !isAuthTokenExpired(authToken));\r\n}\r\nfunction isAuthTokenExpired(authToken) {\r\n const now = Date.now();\r\n return (now < authToken.creationTime ||\r\n authToken.creationTime + authToken.expiresIn < now + TOKEN_EXPIRATION_BUFFER);\r\n}\r\n/** Returns an updated InstallationEntry with an InProgressAuthToken. */\r\nfunction makeAuthTokenRequestInProgressEntry(oldEntry) {\r\n const inProgressAuthToken = {\r\n requestStatus: 1 /* RequestStatus.IN_PROGRESS */,\r\n requestTime: Date.now()\r\n };\r\n return Object.assign(Object.assign({}, oldEntry), { authToken: inProgressAuthToken });\r\n}\r\nfunction hasAuthTokenRequestTimedOut(authToken) {\r\n return (authToken.requestStatus === 1 /* RequestStatus.IN_PROGRESS */ &&\r\n authToken.requestTime + PENDING_TIMEOUT_MS < Date.now());\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Creates a Firebase Installation if there isn't one for the app and\r\n * returns the Installation ID.\r\n * @param installations - The `Installations` instance.\r\n *\r\n * @public\r\n */\r\nasync function getId(installations) {\r\n const installationsImpl = installations;\r\n const { installationEntry, registrationPromise } = await getInstallationEntry(installationsImpl);\r\n if (registrationPromise) {\r\n registrationPromise.catch(console.error);\r\n }\r\n else {\r\n // If the installation is already registered, update the authentication\r\n // token if needed.\r\n refreshAuthToken(installationsImpl).catch(console.error);\r\n }\r\n return installationEntry.fid;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Returns a Firebase Installations auth token, identifying the current\r\n * Firebase Installation.\r\n * @param installations - The `Installations` instance.\r\n * @param forceRefresh - Force refresh regardless of token expiration.\r\n *\r\n * @public\r\n */\r\nasync function getToken(installations, forceRefresh = false) {\r\n const installationsImpl = installations;\r\n await completeInstallationRegistration(installationsImpl);\r\n // At this point we either have a Registered Installation in the DB, or we've\r\n // already thrown an error.\r\n const authToken = await refreshAuthToken(installationsImpl, forceRefresh);\r\n return authToken.token;\r\n}\r\nasync function completeInstallationRegistration(installations) {\r\n const { registrationPromise } = await getInstallationEntry(installations);\r\n if (registrationPromise) {\r\n // A createInstallation request is in progress. Wait until it finishes.\r\n await registrationPromise;\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nasync function deleteInstallationRequest(appConfig, installationEntry) {\r\n const endpoint = getDeleteEndpoint(appConfig, installationEntry);\r\n const headers = getHeadersWithAuth(appConfig, installationEntry);\r\n const request = {\r\n method: 'DELETE',\r\n headers\r\n };\r\n const response = await retryIfServerError(() => fetch(endpoint, request));\r\n if (!response.ok) {\r\n throw await getErrorFromResponse('Delete Installation', response);\r\n }\r\n}\r\nfunction getDeleteEndpoint(appConfig, { fid }) {\r\n return `${getInstallationsEndpoint(appConfig)}/${fid}`;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Deletes the Firebase Installation and all associated data.\r\n * @param installations - The `Installations` instance.\r\n *\r\n * @public\r\n */\r\nasync function deleteInstallations(installations) {\r\n const { appConfig } = installations;\r\n const entry = await update(appConfig, oldEntry => {\r\n if (oldEntry && oldEntry.registrationStatus === 0 /* RequestStatus.NOT_STARTED */) {\r\n // Delete the unregistered entry without sending a deleteInstallation request.\r\n return undefined;\r\n }\r\n return oldEntry;\r\n });\r\n if (entry) {\r\n if (entry.registrationStatus === 1 /* RequestStatus.IN_PROGRESS */) {\r\n // Can't delete while trying to register.\r\n throw ERROR_FACTORY.create(\"delete-pending-registration\" /* ErrorCode.DELETE_PENDING_REGISTRATION */);\r\n }\r\n else if (entry.registrationStatus === 2 /* RequestStatus.COMPLETED */) {\r\n if (!navigator.onLine) {\r\n throw ERROR_FACTORY.create(\"app-offline\" /* ErrorCode.APP_OFFLINE */);\r\n }\r\n else {\r\n await deleteInstallationRequest(appConfig, entry);\r\n await remove(appConfig);\r\n }\r\n }\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Sets a new callback that will get called when Installation ID changes.\r\n * Returns an unsubscribe function that will remove the callback when called.\r\n * @param installations - The `Installations` instance.\r\n * @param callback - The callback function that is invoked when FID changes.\r\n * @returns A function that can be called to unsubscribe.\r\n *\r\n * @public\r\n */\r\nfunction onIdChange(installations, callback) {\r\n const { appConfig } = installations;\r\n addCallback(appConfig, callback);\r\n return () => {\r\n removeCallback(appConfig, callback);\r\n };\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Returns an instance of {@link Installations} associated with the given\r\n * {@link @firebase/app#FirebaseApp} instance.\r\n * @param app - The {@link @firebase/app#FirebaseApp} instance.\r\n *\r\n * @public\r\n */\r\nfunction getInstallations(app = getApp()) {\r\n const installationsImpl = _getProvider(app, 'installations').getImmediate();\r\n return installationsImpl;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction extractAppConfig(app) {\r\n if (!app || !app.options) {\r\n throw getMissingValueError('App Configuration');\r\n }\r\n if (!app.name) {\r\n throw getMissingValueError('App Name');\r\n }\r\n // Required app config keys\r\n const configKeys = [\r\n 'projectId',\r\n 'apiKey',\r\n 'appId'\r\n ];\r\n for (const keyName of configKeys) {\r\n if (!app.options[keyName]) {\r\n throw getMissingValueError(keyName);\r\n }\r\n }\r\n return {\r\n appName: app.name,\r\n projectId: app.options.projectId,\r\n apiKey: app.options.apiKey,\r\n appId: app.options.appId\r\n };\r\n}\r\nfunction getMissingValueError(valueName) {\r\n return ERROR_FACTORY.create(\"missing-app-config-values\" /* ErrorCode.MISSING_APP_CONFIG_VALUES */, {\r\n valueName\r\n });\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst INSTALLATIONS_NAME = 'installations';\r\nconst INSTALLATIONS_NAME_INTERNAL = 'installations-internal';\r\nconst publicFactory = (container) => {\r\n const app = container.getProvider('app').getImmediate();\r\n // Throws if app isn't configured properly.\r\n const appConfig = extractAppConfig(app);\r\n const heartbeatServiceProvider = _getProvider(app, 'heartbeat');\r\n const installationsImpl = {\r\n app,\r\n appConfig,\r\n heartbeatServiceProvider,\r\n _delete: () => Promise.resolve()\r\n };\r\n return installationsImpl;\r\n};\r\nconst internalFactory = (container) => {\r\n const app = container.getProvider('app').getImmediate();\r\n // Internal FIS instance relies on public FIS instance.\r\n const installations = _getProvider(app, INSTALLATIONS_NAME).getImmediate();\r\n const installationsInternal = {\r\n getId: () => getId(installations),\r\n getToken: (forceRefresh) => getToken(installations, forceRefresh)\r\n };\r\n return installationsInternal;\r\n};\r\nfunction registerInstallations() {\r\n _registerComponent(new Component(INSTALLATIONS_NAME, publicFactory, \"PUBLIC\" /* ComponentType.PUBLIC */));\r\n _registerComponent(new Component(INSTALLATIONS_NAME_INTERNAL, internalFactory, \"PRIVATE\" /* ComponentType.PRIVATE */));\r\n}\n\n/**\r\n * Firebase Installations\r\n *\r\n * @packageDocumentation\r\n */\r\nregisterInstallations();\r\nregisterVersion(name, version);\r\n// BUILD_TARGET will be replaced by values like esm5, esm2017, cjs5, etc during the compilation\r\nregisterVersion(name, version, 'esm2017');\n\nexport { deleteInstallations, getId, getInstallations, getToken, onIdChange };\n//# sourceMappingURL=index.esm2017.js.map\n","import '@firebase/installations';\nimport { Component } from '@firebase/component';\nimport { openDB, deleteDB } from 'idb';\nimport { ErrorFactory, validateIndexedDBOpenable, isIndexedDBAvailable, areCookiesEnabled, getModularInstance } from '@firebase/util';\nimport { _registerComponent, registerVersion, _getProvider, getApp } from '@firebase/app';\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst DEFAULT_SW_PATH = '/firebase-messaging-sw.js';\r\nconst DEFAULT_SW_SCOPE = '/firebase-cloud-messaging-push-scope';\r\nconst DEFAULT_VAPID_KEY = 'BDOU99-h67HcA6JeFXHbSNMu7e2yNNu3RzoMj8TM4W88jITfq7ZmPvIM1Iv-4_l2LxQcYwhqby2xGpWwzjfAnG4';\r\nconst ENDPOINT = 'https://fcmregistrations.googleapis.com/v1';\r\nconst CONSOLE_CAMPAIGN_ID = 'google.c.a.c_id';\r\nconst CONSOLE_CAMPAIGN_NAME = 'google.c.a.c_l';\r\nconst CONSOLE_CAMPAIGN_TIME = 'google.c.a.ts';\r\n/** Set to '1' if Analytics is enabled for the campaign */\r\nconst CONSOLE_CAMPAIGN_ANALYTICS_ENABLED = 'google.c.a.e';\r\nvar MessageType$1;\r\n(function (MessageType) {\r\n MessageType[MessageType[\"DATA_MESSAGE\"] = 1] = \"DATA_MESSAGE\";\r\n MessageType[MessageType[\"DISPLAY_NOTIFICATION\"] = 3] = \"DISPLAY_NOTIFICATION\";\r\n})(MessageType$1 || (MessageType$1 = {}));\n\n/**\r\n * @license\r\n * Copyright 2018 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this file except\r\n * in compliance with the License. You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software distributed under the License\r\n * is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express\r\n * or implied. See the License for the specific language governing permissions and limitations under\r\n * the License.\r\n */\r\nvar MessageType;\r\n(function (MessageType) {\r\n MessageType[\"PUSH_RECEIVED\"] = \"push-received\";\r\n MessageType[\"NOTIFICATION_CLICKED\"] = \"notification-clicked\";\r\n})(MessageType || (MessageType = {}));\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction arrayToBase64(array) {\r\n const uint8Array = new Uint8Array(array);\r\n const base64String = btoa(String.fromCharCode(...uint8Array));\r\n return base64String.replace(/=/g, '').replace(/\\+/g, '-').replace(/\\//g, '_');\r\n}\r\nfunction base64ToArray(base64String) {\r\n const padding = '='.repeat((4 - (base64String.length % 4)) % 4);\r\n const base64 = (base64String + padding)\r\n .replace(/\\-/g, '+')\r\n .replace(/_/g, '/');\r\n const rawData = atob(base64);\r\n const outputArray = new Uint8Array(rawData.length);\r\n for (let i = 0; i < rawData.length; ++i) {\r\n outputArray[i] = rawData.charCodeAt(i);\r\n }\r\n return outputArray;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst OLD_DB_NAME = 'fcm_token_details_db';\r\n/**\r\n * The last DB version of 'fcm_token_details_db' was 4. This is one higher, so that the upgrade\r\n * callback is called for all versions of the old DB.\r\n */\r\nconst OLD_DB_VERSION = 5;\r\nconst OLD_OBJECT_STORE_NAME = 'fcm_token_object_Store';\r\nasync function migrateOldDatabase(senderId) {\r\n if ('databases' in indexedDB) {\r\n // indexedDb.databases() is an IndexedDB v3 API and does not exist in all browsers. TODO: Remove\r\n // typecast when it lands in TS types.\r\n const databases = await indexedDB.databases();\r\n const dbNames = databases.map(db => db.name);\r\n if (!dbNames.includes(OLD_DB_NAME)) {\r\n // old DB didn't exist, no need to open.\r\n return null;\r\n }\r\n }\r\n let tokenDetails = null;\r\n const db = await openDB(OLD_DB_NAME, OLD_DB_VERSION, {\r\n upgrade: async (db, oldVersion, newVersion, upgradeTransaction) => {\r\n var _a;\r\n if (oldVersion < 2) {\r\n // Database too old, skip migration.\r\n return;\r\n }\r\n if (!db.objectStoreNames.contains(OLD_OBJECT_STORE_NAME)) {\r\n // Database did not exist. Nothing to do.\r\n return;\r\n }\r\n const objectStore = upgradeTransaction.objectStore(OLD_OBJECT_STORE_NAME);\r\n const value = await objectStore.index('fcmSenderId').get(senderId);\r\n await objectStore.clear();\r\n if (!value) {\r\n // No entry in the database, nothing to migrate.\r\n return;\r\n }\r\n if (oldVersion === 2) {\r\n const oldDetails = value;\r\n if (!oldDetails.auth || !oldDetails.p256dh || !oldDetails.endpoint) {\r\n return;\r\n }\r\n tokenDetails = {\r\n token: oldDetails.fcmToken,\r\n createTime: (_a = oldDetails.createTime) !== null && _a !== void 0 ? _a : Date.now(),\r\n subscriptionOptions: {\r\n auth: oldDetails.auth,\r\n p256dh: oldDetails.p256dh,\r\n endpoint: oldDetails.endpoint,\r\n swScope: oldDetails.swScope,\r\n vapidKey: typeof oldDetails.vapidKey === 'string'\r\n ? oldDetails.vapidKey\r\n : arrayToBase64(oldDetails.vapidKey)\r\n }\r\n };\r\n }\r\n else if (oldVersion === 3) {\r\n const oldDetails = value;\r\n tokenDetails = {\r\n token: oldDetails.fcmToken,\r\n createTime: oldDetails.createTime,\r\n subscriptionOptions: {\r\n auth: arrayToBase64(oldDetails.auth),\r\n p256dh: arrayToBase64(oldDetails.p256dh),\r\n endpoint: oldDetails.endpoint,\r\n swScope: oldDetails.swScope,\r\n vapidKey: arrayToBase64(oldDetails.vapidKey)\r\n }\r\n };\r\n }\r\n else if (oldVersion === 4) {\r\n const oldDetails = value;\r\n tokenDetails = {\r\n token: oldDetails.fcmToken,\r\n createTime: oldDetails.createTime,\r\n subscriptionOptions: {\r\n auth: arrayToBase64(oldDetails.auth),\r\n p256dh: arrayToBase64(oldDetails.p256dh),\r\n endpoint: oldDetails.endpoint,\r\n swScope: oldDetails.swScope,\r\n vapidKey: arrayToBase64(oldDetails.vapidKey)\r\n }\r\n };\r\n }\r\n }\r\n });\r\n db.close();\r\n // Delete all old databases.\r\n await deleteDB(OLD_DB_NAME);\r\n await deleteDB('fcm_vapid_details_db');\r\n await deleteDB('undefined');\r\n return checkTokenDetails(tokenDetails) ? tokenDetails : null;\r\n}\r\nfunction checkTokenDetails(tokenDetails) {\r\n if (!tokenDetails || !tokenDetails.subscriptionOptions) {\r\n return false;\r\n }\r\n const { subscriptionOptions } = tokenDetails;\r\n return (typeof tokenDetails.createTime === 'number' &&\r\n tokenDetails.createTime > 0 &&\r\n typeof tokenDetails.token === 'string' &&\r\n tokenDetails.token.length > 0 &&\r\n typeof subscriptionOptions.auth === 'string' &&\r\n subscriptionOptions.auth.length > 0 &&\r\n typeof subscriptionOptions.p256dh === 'string' &&\r\n subscriptionOptions.p256dh.length > 0 &&\r\n typeof subscriptionOptions.endpoint === 'string' &&\r\n subscriptionOptions.endpoint.length > 0 &&\r\n typeof subscriptionOptions.swScope === 'string' &&\r\n subscriptionOptions.swScope.length > 0 &&\r\n typeof subscriptionOptions.vapidKey === 'string' &&\r\n subscriptionOptions.vapidKey.length > 0);\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n// Exported for tests.\r\nconst DATABASE_NAME = 'firebase-messaging-database';\r\nconst DATABASE_VERSION = 1;\r\nconst OBJECT_STORE_NAME = 'firebase-messaging-store';\r\nlet dbPromise = null;\r\nfunction getDbPromise() {\r\n if (!dbPromise) {\r\n dbPromise = openDB(DATABASE_NAME, DATABASE_VERSION, {\r\n upgrade: (upgradeDb, oldVersion) => {\r\n // We don't use 'break' in this switch statement, the fall-through behavior is what we want,\r\n // because if there are multiple versions between the old version and the current version, we\r\n // want ALL the migrations that correspond to those versions to run, not only the last one.\r\n // eslint-disable-next-line default-case\r\n switch (oldVersion) {\r\n case 0:\r\n upgradeDb.createObjectStore(OBJECT_STORE_NAME);\r\n }\r\n }\r\n });\r\n }\r\n return dbPromise;\r\n}\r\n/** Gets record(s) from the objectStore that match the given key. */\r\nasync function dbGet(firebaseDependencies) {\r\n const key = getKey(firebaseDependencies);\r\n const db = await getDbPromise();\r\n const tokenDetails = (await db\r\n .transaction(OBJECT_STORE_NAME)\r\n .objectStore(OBJECT_STORE_NAME)\r\n .get(key));\r\n if (tokenDetails) {\r\n return tokenDetails;\r\n }\r\n else {\r\n // Check if there is a tokenDetails object in the old DB.\r\n const oldTokenDetails = await migrateOldDatabase(firebaseDependencies.appConfig.senderId);\r\n if (oldTokenDetails) {\r\n await dbSet(firebaseDependencies, oldTokenDetails);\r\n return oldTokenDetails;\r\n }\r\n }\r\n}\r\n/** Assigns or overwrites the record for the given key with the given value. */\r\nasync function dbSet(firebaseDependencies, tokenDetails) {\r\n const key = getKey(firebaseDependencies);\r\n const db = await getDbPromise();\r\n const tx = db.transaction(OBJECT_STORE_NAME, 'readwrite');\r\n await tx.objectStore(OBJECT_STORE_NAME).put(tokenDetails, key);\r\n await tx.done;\r\n return tokenDetails;\r\n}\r\n/** Removes record(s) from the objectStore that match the given key. */\r\nasync function dbRemove(firebaseDependencies) {\r\n const key = getKey(firebaseDependencies);\r\n const db = await getDbPromise();\r\n const tx = db.transaction(OBJECT_STORE_NAME, 'readwrite');\r\n await tx.objectStore(OBJECT_STORE_NAME).delete(key);\r\n await tx.done;\r\n}\r\nfunction getKey({ appConfig }) {\r\n return appConfig.appId;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst ERROR_MAP = {\r\n [\"missing-app-config-values\" /* ErrorCode.MISSING_APP_CONFIG_VALUES */]: 'Missing App configuration value: \"{$valueName}\"',\r\n [\"only-available-in-window\" /* ErrorCode.AVAILABLE_IN_WINDOW */]: 'This method is available in a Window context.',\r\n [\"only-available-in-sw\" /* ErrorCode.AVAILABLE_IN_SW */]: 'This method is available in a service worker context.',\r\n [\"permission-default\" /* ErrorCode.PERMISSION_DEFAULT */]: 'The notification permission was not granted and dismissed instead.',\r\n [\"permission-blocked\" /* ErrorCode.PERMISSION_BLOCKED */]: 'The notification permission was not granted and blocked instead.',\r\n [\"unsupported-browser\" /* ErrorCode.UNSUPPORTED_BROWSER */]: \"This browser doesn't support the API's required to use the Firebase SDK.\",\r\n [\"indexed-db-unsupported\" /* ErrorCode.INDEXED_DB_UNSUPPORTED */]: \"This browser doesn't support indexedDb.open() (ex. Safari iFrame, Firefox Private Browsing, etc)\",\r\n [\"failed-service-worker-registration\" /* ErrorCode.FAILED_DEFAULT_REGISTRATION */]: 'We are unable to register the default service worker. {$browserErrorMessage}',\r\n [\"token-subscribe-failed\" /* ErrorCode.TOKEN_SUBSCRIBE_FAILED */]: 'A problem occurred while subscribing the user to FCM: {$errorInfo}',\r\n [\"token-subscribe-no-token\" /* ErrorCode.TOKEN_SUBSCRIBE_NO_TOKEN */]: 'FCM returned no token when subscribing the user to push.',\r\n [\"token-unsubscribe-failed\" /* ErrorCode.TOKEN_UNSUBSCRIBE_FAILED */]: 'A problem occurred while unsubscribing the ' +\r\n 'user from FCM: {$errorInfo}',\r\n [\"token-update-failed\" /* ErrorCode.TOKEN_UPDATE_FAILED */]: 'A problem occurred while updating the user from FCM: {$errorInfo}',\r\n [\"token-update-no-token\" /* ErrorCode.TOKEN_UPDATE_NO_TOKEN */]: 'FCM returned no token when updating the user to push.',\r\n [\"use-sw-after-get-token\" /* ErrorCode.USE_SW_AFTER_GET_TOKEN */]: 'The useServiceWorker() method may only be called once and must be ' +\r\n 'called before calling getToken() to ensure your service worker is used.',\r\n [\"invalid-sw-registration\" /* ErrorCode.INVALID_SW_REGISTRATION */]: 'The input to useServiceWorker() must be a ServiceWorkerRegistration.',\r\n [\"invalid-bg-handler\" /* ErrorCode.INVALID_BG_HANDLER */]: 'The input to setBackgroundMessageHandler() must be a function.',\r\n [\"invalid-vapid-key\" /* ErrorCode.INVALID_VAPID_KEY */]: 'The public VAPID key must be a string.',\r\n [\"use-vapid-key-after-get-token\" /* ErrorCode.USE_VAPID_KEY_AFTER_GET_TOKEN */]: 'The usePublicVapidKey() method may only be called once and must be ' +\r\n 'called before calling getToken() to ensure your VAPID key is used.'\r\n};\r\nconst ERROR_FACTORY = new ErrorFactory('messaging', 'Messaging', ERROR_MAP);\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nasync function requestGetToken(firebaseDependencies, subscriptionOptions) {\r\n const headers = await getHeaders(firebaseDependencies);\r\n const body = getBody(subscriptionOptions);\r\n const subscribeOptions = {\r\n method: 'POST',\r\n headers,\r\n body: JSON.stringify(body)\r\n };\r\n let responseData;\r\n try {\r\n const response = await fetch(getEndpoint(firebaseDependencies.appConfig), subscribeOptions);\r\n responseData = await response.json();\r\n }\r\n catch (err) {\r\n throw ERROR_FACTORY.create(\"token-subscribe-failed\" /* ErrorCode.TOKEN_SUBSCRIBE_FAILED */, {\r\n errorInfo: err === null || err === void 0 ? void 0 : err.toString()\r\n });\r\n }\r\n if (responseData.error) {\r\n const message = responseData.error.message;\r\n throw ERROR_FACTORY.create(\"token-subscribe-failed\" /* ErrorCode.TOKEN_SUBSCRIBE_FAILED */, {\r\n errorInfo: message\r\n });\r\n }\r\n if (!responseData.token) {\r\n throw ERROR_FACTORY.create(\"token-subscribe-no-token\" /* ErrorCode.TOKEN_SUBSCRIBE_NO_TOKEN */);\r\n }\r\n return responseData.token;\r\n}\r\nasync function requestUpdateToken(firebaseDependencies, tokenDetails) {\r\n const headers = await getHeaders(firebaseDependencies);\r\n const body = getBody(tokenDetails.subscriptionOptions);\r\n const updateOptions = {\r\n method: 'PATCH',\r\n headers,\r\n body: JSON.stringify(body)\r\n };\r\n let responseData;\r\n try {\r\n const response = await fetch(`${getEndpoint(firebaseDependencies.appConfig)}/${tokenDetails.token}`, updateOptions);\r\n responseData = await response.json();\r\n }\r\n catch (err) {\r\n throw ERROR_FACTORY.create(\"token-update-failed\" /* ErrorCode.TOKEN_UPDATE_FAILED */, {\r\n errorInfo: err === null || err === void 0 ? void 0 : err.toString()\r\n });\r\n }\r\n if (responseData.error) {\r\n const message = responseData.error.message;\r\n throw ERROR_FACTORY.create(\"token-update-failed\" /* ErrorCode.TOKEN_UPDATE_FAILED */, {\r\n errorInfo: message\r\n });\r\n }\r\n if (!responseData.token) {\r\n throw ERROR_FACTORY.create(\"token-update-no-token\" /* ErrorCode.TOKEN_UPDATE_NO_TOKEN */);\r\n }\r\n return responseData.token;\r\n}\r\nasync function requestDeleteToken(firebaseDependencies, token) {\r\n const headers = await getHeaders(firebaseDependencies);\r\n const unsubscribeOptions = {\r\n method: 'DELETE',\r\n headers\r\n };\r\n try {\r\n const response = await fetch(`${getEndpoint(firebaseDependencies.appConfig)}/${token}`, unsubscribeOptions);\r\n const responseData = await response.json();\r\n if (responseData.error) {\r\n const message = responseData.error.message;\r\n throw ERROR_FACTORY.create(\"token-unsubscribe-failed\" /* ErrorCode.TOKEN_UNSUBSCRIBE_FAILED */, {\r\n errorInfo: message\r\n });\r\n }\r\n }\r\n catch (err) {\r\n throw ERROR_FACTORY.create(\"token-unsubscribe-failed\" /* ErrorCode.TOKEN_UNSUBSCRIBE_FAILED */, {\r\n errorInfo: err === null || err === void 0 ? void 0 : err.toString()\r\n });\r\n }\r\n}\r\nfunction getEndpoint({ projectId }) {\r\n return `${ENDPOINT}/projects/${projectId}/registrations`;\r\n}\r\nasync function getHeaders({ appConfig, installations }) {\r\n const authToken = await installations.getToken();\r\n return new Headers({\r\n 'Content-Type': 'application/json',\r\n Accept: 'application/json',\r\n 'x-goog-api-key': appConfig.apiKey,\r\n 'x-goog-firebase-installations-auth': `FIS ${authToken}`\r\n });\r\n}\r\nfunction getBody({ p256dh, auth, endpoint, vapidKey }) {\r\n const body = {\r\n web: {\r\n endpoint,\r\n auth,\r\n p256dh\r\n }\r\n };\r\n if (vapidKey !== DEFAULT_VAPID_KEY) {\r\n body.web.applicationPubKey = vapidKey;\r\n }\r\n return body;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n// UpdateRegistration will be called once every week.\r\nconst TOKEN_EXPIRATION_MS = 7 * 24 * 60 * 60 * 1000; // 7 days\r\nasync function getTokenInternal(messaging) {\r\n const pushSubscription = await getPushSubscription(messaging.swRegistration, messaging.vapidKey);\r\n const subscriptionOptions = {\r\n vapidKey: messaging.vapidKey,\r\n swScope: messaging.swRegistration.scope,\r\n endpoint: pushSubscription.endpoint,\r\n auth: arrayToBase64(pushSubscription.getKey('auth')),\r\n p256dh: arrayToBase64(pushSubscription.getKey('p256dh'))\r\n };\r\n const tokenDetails = await dbGet(messaging.firebaseDependencies);\r\n if (!tokenDetails) {\r\n // No token, get a new one.\r\n return getNewToken(messaging.firebaseDependencies, subscriptionOptions);\r\n }\r\n else if (!isTokenValid(tokenDetails.subscriptionOptions, subscriptionOptions)) {\r\n // Invalid token, get a new one.\r\n try {\r\n await requestDeleteToken(messaging.firebaseDependencies, tokenDetails.token);\r\n }\r\n catch (e) {\r\n // Suppress errors because of #2364\r\n console.warn(e);\r\n }\r\n return getNewToken(messaging.firebaseDependencies, subscriptionOptions);\r\n }\r\n else if (Date.now() >= tokenDetails.createTime + TOKEN_EXPIRATION_MS) {\r\n // Weekly token refresh\r\n return updateToken(messaging, {\r\n token: tokenDetails.token,\r\n createTime: Date.now(),\r\n subscriptionOptions\r\n });\r\n }\r\n else {\r\n // Valid token, nothing to do.\r\n return tokenDetails.token;\r\n }\r\n}\r\n/**\r\n * This method deletes the token from the database, unsubscribes the token from FCM, and unregisters\r\n * the push subscription if it exists.\r\n */\r\nasync function deleteTokenInternal(messaging) {\r\n const tokenDetails = await dbGet(messaging.firebaseDependencies);\r\n if (tokenDetails) {\r\n await requestDeleteToken(messaging.firebaseDependencies, tokenDetails.token);\r\n await dbRemove(messaging.firebaseDependencies);\r\n }\r\n // Unsubscribe from the push subscription.\r\n const pushSubscription = await messaging.swRegistration.pushManager.getSubscription();\r\n if (pushSubscription) {\r\n return pushSubscription.unsubscribe();\r\n }\r\n // If there's no SW, consider it a success.\r\n return true;\r\n}\r\nasync function updateToken(messaging, tokenDetails) {\r\n try {\r\n const updatedToken = await requestUpdateToken(messaging.firebaseDependencies, tokenDetails);\r\n const updatedTokenDetails = Object.assign(Object.assign({}, tokenDetails), { token: updatedToken, createTime: Date.now() });\r\n await dbSet(messaging.firebaseDependencies, updatedTokenDetails);\r\n return updatedToken;\r\n }\r\n catch (e) {\r\n await deleteTokenInternal(messaging);\r\n throw e;\r\n }\r\n}\r\nasync function getNewToken(firebaseDependencies, subscriptionOptions) {\r\n const token = await requestGetToken(firebaseDependencies, subscriptionOptions);\r\n const tokenDetails = {\r\n token,\r\n createTime: Date.now(),\r\n subscriptionOptions\r\n };\r\n await dbSet(firebaseDependencies, tokenDetails);\r\n return tokenDetails.token;\r\n}\r\n/**\r\n * Gets a PushSubscription for the current user.\r\n */\r\nasync function getPushSubscription(swRegistration, vapidKey) {\r\n const subscription = await swRegistration.pushManager.getSubscription();\r\n if (subscription) {\r\n return subscription;\r\n }\r\n return swRegistration.pushManager.subscribe({\r\n userVisibleOnly: true,\r\n // Chrome <= 75 doesn't support base64-encoded VAPID key. For backward compatibility, VAPID key\r\n // submitted to pushManager#subscribe must be of type Uint8Array.\r\n applicationServerKey: base64ToArray(vapidKey)\r\n });\r\n}\r\n/**\r\n * Checks if the saved tokenDetails object matches the configuration provided.\r\n */\r\nfunction isTokenValid(dbOptions, currentOptions) {\r\n const isVapidKeyEqual = currentOptions.vapidKey === dbOptions.vapidKey;\r\n const isEndpointEqual = currentOptions.endpoint === dbOptions.endpoint;\r\n const isAuthEqual = currentOptions.auth === dbOptions.auth;\r\n const isP256dhEqual = currentOptions.p256dh === dbOptions.p256dh;\r\n return isVapidKeyEqual && isEndpointEqual && isAuthEqual && isP256dhEqual;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction externalizePayload(internalPayload) {\r\n const payload = {\r\n from: internalPayload.from,\r\n // eslint-disable-next-line camelcase\r\n collapseKey: internalPayload.collapse_key,\r\n // eslint-disable-next-line camelcase\r\n messageId: internalPayload.fcmMessageId\r\n };\r\n propagateNotificationPayload(payload, internalPayload);\r\n propagateDataPayload(payload, internalPayload);\r\n propagateFcmOptions(payload, internalPayload);\r\n return payload;\r\n}\r\nfunction propagateNotificationPayload(payload, messagePayloadInternal) {\r\n if (!messagePayloadInternal.notification) {\r\n return;\r\n }\r\n payload.notification = {};\r\n const title = messagePayloadInternal.notification.title;\r\n if (!!title) {\r\n payload.notification.title = title;\r\n }\r\n const body = messagePayloadInternal.notification.body;\r\n if (!!body) {\r\n payload.notification.body = body;\r\n }\r\n const image = messagePayloadInternal.notification.image;\r\n if (!!image) {\r\n payload.notification.image = image;\r\n }\r\n const icon = messagePayloadInternal.notification.icon;\r\n if (!!icon) {\r\n payload.notification.icon = icon;\r\n }\r\n}\r\nfunction propagateDataPayload(payload, messagePayloadInternal) {\r\n if (!messagePayloadInternal.data) {\r\n return;\r\n }\r\n payload.data = messagePayloadInternal.data;\r\n}\r\nfunction propagateFcmOptions(payload, messagePayloadInternal) {\r\n var _a, _b, _c, _d, _e;\r\n // fcmOptions.link value is written into notification.click_action. see more in b/232072111\r\n if (!messagePayloadInternal.fcmOptions &&\r\n !((_a = messagePayloadInternal.notification) === null || _a === void 0 ? void 0 : _a.click_action)) {\r\n return;\r\n }\r\n payload.fcmOptions = {};\r\n const link = (_c = (_b = messagePayloadInternal.fcmOptions) === null || _b === void 0 ? void 0 : _b.link) !== null && _c !== void 0 ? _c : (_d = messagePayloadInternal.notification) === null || _d === void 0 ? void 0 : _d.click_action;\r\n if (!!link) {\r\n payload.fcmOptions.link = link;\r\n }\r\n // eslint-disable-next-line camelcase\r\n const analyticsLabel = (_e = messagePayloadInternal.fcmOptions) === null || _e === void 0 ? void 0 : _e.analytics_label;\r\n if (!!analyticsLabel) {\r\n payload.fcmOptions.analyticsLabel = analyticsLabel;\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction isConsoleMessage(data) {\r\n // This message has a campaign ID, meaning it was sent using the Firebase Console.\r\n return typeof data === 'object' && !!data && CONSOLE_CAMPAIGN_ID in data;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n_mergeStrings('hts/frbslgigp.ogepscmv/ieo/eaylg', 'tp:/ieaeogn-agolai.o/1frlglgc/o');\r\n_mergeStrings('AzSCbw63g1R0nCw85jG8', 'Iaya3yLKwmgvh7cF0q4');\r\nfunction _mergeStrings(s1, s2) {\r\n const resultArray = [];\r\n for (let i = 0; i < s1.length; i++) {\r\n resultArray.push(s1.charAt(i));\r\n if (i < s2.length) {\r\n resultArray.push(s2.charAt(i));\r\n }\r\n }\r\n return resultArray.join('');\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction extractAppConfig(app) {\r\n if (!app || !app.options) {\r\n throw getMissingValueError('App Configuration Object');\r\n }\r\n if (!app.name) {\r\n throw getMissingValueError('App Name');\r\n }\r\n // Required app config keys\r\n const configKeys = [\r\n 'projectId',\r\n 'apiKey',\r\n 'appId',\r\n 'messagingSenderId'\r\n ];\r\n const { options } = app;\r\n for (const keyName of configKeys) {\r\n if (!options[keyName]) {\r\n throw getMissingValueError(keyName);\r\n }\r\n }\r\n return {\r\n appName: app.name,\r\n projectId: options.projectId,\r\n apiKey: options.apiKey,\r\n appId: options.appId,\r\n senderId: options.messagingSenderId\r\n };\r\n}\r\nfunction getMissingValueError(valueName) {\r\n return ERROR_FACTORY.create(\"missing-app-config-values\" /* ErrorCode.MISSING_APP_CONFIG_VALUES */, {\r\n valueName\r\n });\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nclass MessagingService {\r\n constructor(app, installations, analyticsProvider) {\r\n // logging is only done with end user consent. Default to false.\r\n this.deliveryMetricsExportedToBigQueryEnabled = false;\r\n this.onBackgroundMessageHandler = null;\r\n this.onMessageHandler = null;\r\n this.logEvents = [];\r\n this.isLogServiceStarted = false;\r\n const appConfig = extractAppConfig(app);\r\n this.firebaseDependencies = {\r\n app,\r\n appConfig,\r\n installations,\r\n analyticsProvider\r\n };\r\n }\r\n _delete() {\r\n return Promise.resolve();\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nasync function registerDefaultSw(messaging) {\r\n try {\r\n messaging.swRegistration = await navigator.serviceWorker.register(DEFAULT_SW_PATH, {\r\n scope: DEFAULT_SW_SCOPE\r\n });\r\n // The timing when browser updates sw when sw has an update is unreliable from experiment. It\r\n // leads to version conflict when the SDK upgrades to a newer version in the main page, but sw\r\n // is stuck with the old version. For example,\r\n // https://github.com/firebase/firebase-js-sdk/issues/2590 The following line reliably updates\r\n // sw if there was an update.\r\n messaging.swRegistration.update().catch(() => {\r\n /* it is non blocking and we don't care if it failed */\r\n });\r\n }\r\n catch (e) {\r\n throw ERROR_FACTORY.create(\"failed-service-worker-registration\" /* ErrorCode.FAILED_DEFAULT_REGISTRATION */, {\r\n browserErrorMessage: e === null || e === void 0 ? void 0 : e.message\r\n });\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nasync function updateSwReg(messaging, swRegistration) {\r\n if (!swRegistration && !messaging.swRegistration) {\r\n await registerDefaultSw(messaging);\r\n }\r\n if (!swRegistration && !!messaging.swRegistration) {\r\n return;\r\n }\r\n if (!(swRegistration instanceof ServiceWorkerRegistration)) {\r\n throw ERROR_FACTORY.create(\"invalid-sw-registration\" /* ErrorCode.INVALID_SW_REGISTRATION */);\r\n }\r\n messaging.swRegistration = swRegistration;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nasync function updateVapidKey(messaging, vapidKey) {\r\n if (!!vapidKey) {\r\n messaging.vapidKey = vapidKey;\r\n }\r\n else if (!messaging.vapidKey) {\r\n messaging.vapidKey = DEFAULT_VAPID_KEY;\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nasync function getToken$1(messaging, options) {\r\n if (!navigator) {\r\n throw ERROR_FACTORY.create(\"only-available-in-window\" /* ErrorCode.AVAILABLE_IN_WINDOW */);\r\n }\r\n if (Notification.permission === 'default') {\r\n await Notification.requestPermission();\r\n }\r\n if (Notification.permission !== 'granted') {\r\n throw ERROR_FACTORY.create(\"permission-blocked\" /* ErrorCode.PERMISSION_BLOCKED */);\r\n }\r\n await updateVapidKey(messaging, options === null || options === void 0 ? void 0 : options.vapidKey);\r\n await updateSwReg(messaging, options === null || options === void 0 ? void 0 : options.serviceWorkerRegistration);\r\n return getTokenInternal(messaging);\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nasync function logToScion(messaging, messageType, data) {\r\n const eventType = getEventType(messageType);\r\n const analytics = await messaging.firebaseDependencies.analyticsProvider.get();\r\n analytics.logEvent(eventType, {\r\n /* eslint-disable camelcase */\r\n message_id: data[CONSOLE_CAMPAIGN_ID],\r\n message_name: data[CONSOLE_CAMPAIGN_NAME],\r\n message_time: data[CONSOLE_CAMPAIGN_TIME],\r\n message_device_time: Math.floor(Date.now() / 1000)\r\n /* eslint-enable camelcase */\r\n });\r\n}\r\nfunction getEventType(messageType) {\r\n switch (messageType) {\r\n case MessageType.NOTIFICATION_CLICKED:\r\n return 'notification_open';\r\n case MessageType.PUSH_RECEIVED:\r\n return 'notification_foreground';\r\n default:\r\n throw new Error();\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nasync function messageEventListener(messaging, event) {\r\n const internalPayload = event.data;\r\n if (!internalPayload.isFirebaseMessaging) {\r\n return;\r\n }\r\n if (messaging.onMessageHandler &&\r\n internalPayload.messageType === MessageType.PUSH_RECEIVED) {\r\n if (typeof messaging.onMessageHandler === 'function') {\r\n messaging.onMessageHandler(externalizePayload(internalPayload));\r\n }\r\n else {\r\n messaging.onMessageHandler.next(externalizePayload(internalPayload));\r\n }\r\n }\r\n // Log to Scion if applicable\r\n const dataPayload = internalPayload.data;\r\n if (isConsoleMessage(dataPayload) &&\r\n dataPayload[CONSOLE_CAMPAIGN_ANALYTICS_ENABLED] === '1') {\r\n await logToScion(messaging, internalPayload.messageType, dataPayload);\r\n }\r\n}\n\nconst name = \"@firebase/messaging\";\nconst version = \"0.12.1\";\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst WindowMessagingFactory = (container) => {\r\n const messaging = new MessagingService(container.getProvider('app').getImmediate(), container.getProvider('installations-internal').getImmediate(), container.getProvider('analytics-internal'));\r\n navigator.serviceWorker.addEventListener('message', e => messageEventListener(messaging, e));\r\n return messaging;\r\n};\r\nconst WindowMessagingInternalFactory = (container) => {\r\n const messaging = container\r\n .getProvider('messaging')\r\n .getImmediate();\r\n const messagingInternal = {\r\n getToken: (options) => getToken$1(messaging, options)\r\n };\r\n return messagingInternal;\r\n};\r\nfunction registerMessagingInWindow() {\r\n _registerComponent(new Component('messaging', WindowMessagingFactory, \"PUBLIC\" /* ComponentType.PUBLIC */));\r\n _registerComponent(new Component('messaging-internal', WindowMessagingInternalFactory, \"PRIVATE\" /* ComponentType.PRIVATE */));\r\n registerVersion(name, version);\r\n // BUILD_TARGET will be replaced by values like esm5, esm2017, cjs5, etc during the compilation\r\n registerVersion(name, version, 'esm2017');\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Checks if all required APIs exist in the browser.\r\n * @returns a Promise that resolves to a boolean.\r\n *\r\n * @public\r\n */\r\nasync function isWindowSupported() {\r\n try {\r\n // This throws if open() is unsupported, so adding it to the conditional\r\n // statement below can cause an uncaught error.\r\n await validateIndexedDBOpenable();\r\n }\r\n catch (e) {\r\n return false;\r\n }\r\n // firebase-js-sdk/issues/2393 reveals that idb#open in Safari iframe and Firefox private browsing\r\n // might be prohibited to run. In these contexts, an error would be thrown during the messaging\r\n // instantiating phase, informing the developers to import/call isSupported for special handling.\r\n return (typeof window !== 'undefined' &&\r\n isIndexedDBAvailable() &&\r\n areCookiesEnabled() &&\r\n 'serviceWorker' in navigator &&\r\n 'PushManager' in window &&\r\n 'Notification' in window &&\r\n 'fetch' in window &&\r\n ServiceWorkerRegistration.prototype.hasOwnProperty('showNotification') &&\r\n PushSubscription.prototype.hasOwnProperty('getKey'));\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nasync function deleteToken$1(messaging) {\r\n if (!navigator) {\r\n throw ERROR_FACTORY.create(\"only-available-in-window\" /* ErrorCode.AVAILABLE_IN_WINDOW */);\r\n }\r\n if (!messaging.swRegistration) {\r\n await registerDefaultSw(messaging);\r\n }\r\n return deleteTokenInternal(messaging);\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction onMessage$1(messaging, nextOrObserver) {\r\n if (!navigator) {\r\n throw ERROR_FACTORY.create(\"only-available-in-window\" /* ErrorCode.AVAILABLE_IN_WINDOW */);\r\n }\r\n messaging.onMessageHandler = nextOrObserver;\r\n return () => {\r\n messaging.onMessageHandler = null;\r\n };\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Retrieves a Firebase Cloud Messaging instance.\r\n *\r\n * @returns The Firebase Cloud Messaging instance associated with the provided firebase app.\r\n *\r\n * @public\r\n */\r\nfunction getMessagingInWindow(app = getApp()) {\r\n // Conscious decision to make this async check non-blocking during the messaging instance\r\n // initialization phase for performance consideration. An error would be thrown latter for\r\n // developer's information. Developers can then choose to import and call `isSupported` for\r\n // special handling.\r\n isWindowSupported().then(isSupported => {\r\n // If `isWindowSupported()` resolved, but returned false.\r\n if (!isSupported) {\r\n throw ERROR_FACTORY.create(\"unsupported-browser\" /* ErrorCode.UNSUPPORTED_BROWSER */);\r\n }\r\n }, _ => {\r\n // If `isWindowSupported()` rejected.\r\n throw ERROR_FACTORY.create(\"indexed-db-unsupported\" /* ErrorCode.INDEXED_DB_UNSUPPORTED */);\r\n });\r\n return _getProvider(getModularInstance(app), 'messaging').getImmediate();\r\n}\r\n/**\r\n * Subscribes the {@link Messaging} instance to push notifications. Returns an Firebase Cloud\r\n * Messaging registration token that can be used to send push messages to that {@link Messaging}\r\n * instance.\r\n *\r\n * If a notification permission isn't already granted, this method asks the user for permission. The\r\n * returned promise rejects if the user does not allow the app to show notifications.\r\n *\r\n * @param messaging - The {@link Messaging} instance.\r\n * @param options - Provides an optional vapid key and an optinoal service worker registration\r\n *\r\n * @returns The promise resolves with an FCM registration token.\r\n *\r\n * @public\r\n */\r\nasync function getToken(messaging, options) {\r\n messaging = getModularInstance(messaging);\r\n return getToken$1(messaging, options);\r\n}\r\n/**\r\n * Deletes the registration token associated with this {@link Messaging} instance and unsubscribes\r\n * the {@link Messaging} instance from the push subscription.\r\n *\r\n * @param messaging - The {@link Messaging} instance.\r\n *\r\n * @returns The promise resolves when the token has been successfully deleted.\r\n *\r\n * @public\r\n */\r\nfunction deleteToken(messaging) {\r\n messaging = getModularInstance(messaging);\r\n return deleteToken$1(messaging);\r\n}\r\n/**\r\n * When a push message is received and the user is currently on a page for your origin, the\r\n * message is passed to the page and an `onMessage()` event is dispatched with the payload of\r\n * the push message.\r\n *\r\n *\r\n * @param messaging - The {@link Messaging} instance.\r\n * @param nextOrObserver - This function, or observer object with `next` defined,\r\n * is called when a message is received and the user is currently viewing your page.\r\n * @returns To stop listening for messages execute this returned function.\r\n *\r\n * @public\r\n */\r\nfunction onMessage(messaging, nextOrObserver) {\r\n messaging = getModularInstance(messaging);\r\n return onMessage$1(messaging, nextOrObserver);\r\n}\n\n/**\r\n * Firebase Cloud Messaging\r\n *\r\n * @packageDocumentation\r\n */\r\nregisterMessagingInWindow();\n\nexport { deleteToken, getMessagingInWindow as getMessaging, getToken, isWindowSupported as isSupported, onMessage };\n//# sourceMappingURL=index.esm2017.js.map\n","const __WEBPACK_NAMESPACE_OBJECT__ = Tinode;","import React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nexport default class Alert extends React.PureComponent {\n render() {\n return (
\n
\n
{this.props.title}
\n
{this.props.content}
\n
\n {this.props.onReject ?\n \n {this.props.reject || }\n \n :\n null\n }\n {this.props.onConfirm ?\n \n {this.props.confirm || }\n \n :\n null\n }\n
\n
\n
);\n }\n};\n","// Context Menu: popup/dropdown menu.\nimport React from 'react';\nimport { injectIntl, defineMessages } from 'react-intl';\n\nimport { REM_SIZE } from '../config.js';\n\nconst messages = defineMessages({\n info: {\n id: 'menu_item_info',\n defaultMessage: 'Info',\n description: 'Show extended topic information'\n },\n clear_messages: {\n id: 'menu_item_clear_messages',\n defaultMessage: 'Clear messages',\n description: 'Delete all messages'\n },\n clear_for_all: {\n id: 'menu_item_clear_messages_for_all',\n defaultMessage: 'Clear for All',\n description: 'Delete all message(s) for all members'\n },\n delete: {\n id: 'menu_item_delete',\n defaultMessage: 'Delete',\n description: 'Delete selected messages'\n },\n delete_for_all: {\n id: 'menu_item_delete_for_all',\n defaultMessage: 'Delete for All',\n description: 'Delete selected message(s) for all members'\n },\n send_retry: {\n id: 'menu_item_send_retry',\n defaultMessage: 'Retry',\n description: 'Retry sending message'\n },\n mute: {\n id: 'menu_item_mute',\n defaultMessage: 'Mute',\n description: 'Turn off notifications'\n },\n unmute: {\n id: 'menu_item_unmute',\n defaultMessage: 'Unmute',\n description: 'Turn notifications on'\n },\n reply: {\n id: 'menu_item_reply',\n defaultMessage: 'Reply',\n description: 'Reply to message'\n },\n forward: {\n id: 'menu_item_forward',\n defaultMessage: 'Forward',\n description: 'Forward message'\n },\n edit: {\n id: 'menu_item_edit',\n defaultMessage: 'Edit',\n description: 'Edit message'\n },\n topic_delete: {\n id: 'menu_item_delete_topic',\n defaultMessage: 'Delete',\n description: 'Delete entire topic'\n },\n topic_delete_warning: {\n id: 'topic_delete_warning',\n defaultMessage: 'Are you sure you want to delete this conversation? It cannot be undone.',\n description: 'Alert warning when deleting entire topic'\n },\n delete_messages_warning: {\n id: 'delete_messages_warning',\n defaultMessage: 'Are you sure you want to delete all messages for everyone? It cannot be undone.',\n description: 'Alert dialog warning when hard-deleting all messages.'\n },\n unblock: {\n id: 'menu_item_unblock',\n defaultMessage: 'Unblock',\n description: 'Unblock topic or user'\n },\n // Generic string suitable for either topic or user.\n block: {\n id: 'menu_item_block',\n defaultMessage: 'Block',\n description: 'Block topic or user'\n },\n topic_block_warning: {\n id: 'topic_block_warning',\n defaultMessage: 'Are you sure you want to block this conversation?',\n description: 'Alert warning when blocking a topic.'\n },\n member_delete: {\n id: 'menu_item_member_delete',\n defaultMessage: 'Remove',\n description: 'Remove user from topic'\n },\n archive: {\n id: 'menu_item_archive_topic',\n defaultMessage: 'Archive',\n description: 'Move topic from the list of active chats to archive'\n },\n unarchive: {\n id: 'menu_item_restore_topic',\n defaultMessage: 'Restore',\n description: 'Restore topic from archive'\n },\n edit_permissions: {\n id: 'menu_item_edit_permissions',\n defaultMessage: 'Edit permissions',\n description: 'Menu item [Edit permissions]'\n },\n clear_messages_warning: {\n id: 'clear_messages_warning',\n defaultMessage: 'Are you sure you want to clear all messages? It cannot be undone.',\n description: 'Alert dialog warning when deleting all messages.'\n },\n});\n\nclass ContextMenu extends React.Component {\n constructor(props) {\n super(props);\n\n this.selfRef = React.createRef();\n\n const {formatMessage} = props.intl;\n\n this.handlePageClick = this.handlePageClick.bind(this);\n this.handleEscapeKey = this.handleEscapeKey.bind(this);\n this.handleClick = this.handleClick.bind(this);\n\n // Preconfigured menu items.\n this.MenuItems = {\n 'topic_info': {\n id: 'topic_info',\n title: formatMessage(messages.info),\n handler: null\n },\n 'messages_clear': {\n id: 'messages_clear',\n title: formatMessage(messages.clear_messages),\n handler: (params, errorHandler) => {\n return props.onShowAlert(\n formatMessage(messages.clear_messages), // title\n formatMessage(messages.clear_messages_warning), // content\n (_ => { this.deleteMessages(true, false, params, errorHandler); }), // onConfirm\n null, // \"OK\"\n true, // Show Reject button\n null // \"Cancel\"\n );\n }\n },\n 'messages_clear_hard': {\n id: 'messages_clear_hard',\n title: formatMessage(messages.clear_for_all),\n handler: (params, errorHandler) => {\n return props.onShowAlert(\n formatMessage(messages.clear_for_all), // title\n formatMessage(messages.delete_messages_warning), // content\n (_ => { return this.deleteMessages(true, true, params, errorHandler); }),\n null, // \"OK\"\n true, // Show Reject button\n null // \"Cancel\"\n );\n }\n },\n 'message_delete': {\n id: 'message_delete',\n title: formatMessage(messages.delete),\n handler: (params, errorHandler) => {\n return this.deleteMessages(false, false, params, errorHandler);\n }\n },\n 'message_delete_hard': {\n id: 'message_delete_hard',\n title: formatMessage(messages.delete_for_all),\n handler: (params, errorHandler) => {\n return this.deleteMessages(false, true, params, errorHandler);\n }\n },\n 'menu_item_send_retry': {\n id: 'menu_item_send_retry',\n title: formatMessage(messages.send_retry),\n handler: (params, errorHandler) => {\n return this.retryMessage(params, errorHandler);\n }\n },\n 'menu_item_reply': {\n id: 'menu_item_reply',\n title: formatMessage(messages.reply),\n handler: (params, errorHandler) => {\n return this.replyToMessage(params, errorHandler);\n }\n },\n 'menu_item_forward': {\n id: 'menu_item_forward',\n title: formatMessage(messages.forward),\n handler: _ => {} /* the action is taken directly in tinode-web */\n },\n 'menu_item_edit': {\n id: 'menu_item_edit',\n title: formatMessage(messages.edit),\n handler: (params, errorHandler) => {\n return this.editMessage(params, errorHandler);\n }\n },\n 'topic_unmute': {\n id: 'topic_unmute',\n title: formatMessage(messages.unmute),\n handler: this.topicPermissionSetter.bind(this, '+P')\n },\n 'topic_mute': {\n id: 'topic_mute',\n title: formatMessage(messages.mute),\n handler: this.topicPermissionSetter.bind(this, '-P')\n },\n 'topic_unblock': {\n id: 'topic_unblock',\n title: formatMessage(messages.unblock),\n handler: this.topicPermissionSetter.bind(this, '+JP')\n },\n 'topic_block': {\n id: 'topic_block',\n title: formatMessage(messages.block),\n handler: (params, errorHandler) => {\n return props.onShowAlert(\n formatMessage(messages.block), // title\n formatMessage(messages.topic_block_warning), // content\n (_ => this.topicPermissionSetter('-JP', params, errorHandler).then(ctrl => {\n this.props.onTopicRemoved(params.topicName);\n return ctrl;\n })),\n null, // \"OK\"\n true, // Show Reject button\n null // \"Cancel\"\n );\n }\n },\n 'topic_delete': {\n id: 'topic_delete',\n title: formatMessage(messages.topic_delete),\n handler: (params, errorHandler) => {\n return props.onShowAlert(\n formatMessage(messages.topic_delete), // title\n formatMessage(messages.topic_delete_warning), // content\n (_ => {\n const topic = this.props.tinode.getTopic(params.topicName);\n if (!topic) {\n console.warn(\"Topic not found: \", params.topicName);\n return;\n }\n return topic.delTopic(true).catch(err => {\n if (errorHandler) {\n errorHandler(err.message, 'err');\n }\n });\n }),\n null, // \"OK\"\n true, // Show Reject button\n null // \"Cancel\"\n );\n }\n },\n 'topic_archive': {\n id: 'topic_archive',\n title: formatMessage(messages.archive),\n handler: (params, errorHandler) => {\n const topic = this.props.tinode.getTopic(params.topicName);\n if (!topic) {\n console.warn(\"Topic not found: \", params.topicName);\n return;\n }\n return topic.archive(true).catch(err => {\n if (errorHandler) {\n errorHandler(err.message, 'err');\n }\n });\n }\n },\n 'topic_restore': {\n id: 'topic_restore',\n title: formatMessage(messages.unarchive),\n handler: (params, errorHandler) => {\n const topic = this.props.tinode.getTopic(params.topicName);\n if (!topic) {\n console.warn(\"Topic not found: \", params.topicName);\n return;\n }\n return topic.archive(false).catch(err => {\n if (errorHandler) {\n errorHandler(err.message, 'err');\n }\n });\n }\n },\n // menu_item_edit_permissions is defined elsewhere.\n 'permissions': {\n id: 'permissions',\n title: formatMessage(messages.edit_permissions),\n handler: null\n },\n 'member_delete': {\n id: 'member_delete',\n title: formatMessage(messages.member_delete),\n handler: (params, errorHandler) => {\n const topic = this.props.tinode.getTopic(params.topicName);\n if (!topic || !params.user) {\n console.warn(\"Topic or user not found: '\" + params.topicName + \"', '\" + params.user + \"'\");\n return;\n }\n return topic.delSubscription(params.user).catch(err => {\n if (errorHandler) {\n errorHandler(err.message, 'err');\n }\n });\n }\n },\n 'member_mute': {\n id: 'member_mute',\n title: formatMessage(messages.mute),\n handler: this.topicPermissionSetter.bind(this, '-P')\n },\n 'member_unmute': {\n id: 'member_unmute',\n title: formatMessage(messages.unmute),\n handler: this.topicPermissionSetter.bind(this, '+P')\n },\n 'member_block': {\n id: 'member_block',\n title: formatMessage(messages.block),\n handler: this.topicPermissionSetter.bind(this, '-JP')\n },\n 'member_unblock': {\n id: 'member_unblock',\n title: formatMessage(messages.unblock),\n handler: this.topicPermissionSetter.bind(this, '+JP')\n },\n };\n }\n\n componentDidMount() {\n document.addEventListener('mousedown', this.handlePageClick, false);\n document.addEventListener('keyup', this.handleEscapeKey, false);\n }\n\n componentWillUnmount() {\n document.removeEventListener('mousedown', this.handlePageClick, false);\n document.removeEventListener('keyup', this.handleEscapeKey, false);\n }\n\n handlePageClick(e) {\n if (this.selfRef.current.contains(e.target)) {\n return;\n }\n e.preventDefault();\n e.stopPropagation();\n this.props.hide();\n }\n\n handleEscapeKey(e) {\n if (e.keyCode === 27) {\n this.props.hide();\n }\n }\n\n handleClick(e) {\n e.preventDefault();\n e.stopPropagation();\n this.props.hide();\n let item = this.props.items[e.currentTarget.dataset.id];\n if (typeof item == 'string') {\n item = this.MenuItems[item];\n }\n\n if (!item) {\n console.error(\"Invalid menu item ID\", e.currentTarget.dataset.id);\n } else {\n this.props.onAction(\n item.id,\n item.handler(this.props.params, this.props.onError),\n this.props.params);\n }\n }\n\n // Menu Actions\n\n deleteMessages(all, hard, params, errorHandler) {\n const topic = this.props.tinode.getTopic(params.topicName);\n if (!topic) {\n console.warn(\"Topic not found: \", params.topicName);\n return;\n }\n\n // We don't know if the message is still pending (e.g. attachment is being uploaded),\n // so try cancelling first. No harm if we can't cancel.\n // The message can be cancelled if transmission to the server has not\n // started yet or if the message send has failed.\n if (!all && topic.cancelSend(params.seq)) {\n return;\n }\n\n const promise = all ?\n topic.delMessagesAll(hard) :\n params.replace > 0 ?\n topic.delMessagesEdits(params.replace, hard) :\n topic.delMessagesList([params.seq], hard);\n\n return promise.catch(err => {\n if (errorHandler) {\n errorHandler(err.message, 'err');\n }\n });\n }\n\n // Retries sending failed message.\n retryMessage(params, errorHandler) {\n const topic = this.props.tinode.getTopic(params.topicName);\n // Remove the existing message entry.\n if (!topic || !topic.flushMessage(params.seq)) {\n return;\n }\n const msg = topic.createMessage(params.content, false);\n return topic.publishDraft(msg).catch(err => {\n if (errorHandler) {\n errorHandler(err.message, 'err');\n }\n });\n }\n\n // Function is used by context menu to set permissions.\n topicPermissionSetter(mode, params, errorHandler) {\n const topic = this.props.tinode.getTopic(params.topicName);\n if (!topic) {\n console.warn(\"Topic not found\", params.topicName);\n return;\n }\n\n let result = topic.updateMode(params.user, mode);\n if (errorHandler) {\n result = result.catch(err => errorHandler(err.message, 'err'));\n }\n return result;\n }\n\n replyToMessage(params, errorHandler) {\n params.pickReply(params.seq, params.content, params.userFrom, params.userName, errorHandler);\n }\n\n editMessage(params, errorHandler) {\n params.editMessage(params.replace || params.seq, params.content, errorHandler);\n }\n\n render() {\n const menu = [];\n let count = 0;\n this.props.items.map((item) => {\n if (typeof item == 'string') {\n item = this.MenuItems[item];\n }\n if (item && item.title) {\n menu.push(\n item.title == '-' ?\n \n :\n {item.title} \n );\n }\n count++;\n });\n\n // Ensure that menu is inside the app-container.\n const hSize = 12 * REM_SIZE;\n const vSize = REM_SIZE * (0.7 + menu.length * 2.5);\n const left = (this.props.bounds.right - this.props.clickAt.x < hSize) ?\n (this.props.clickAt.x - this.props.bounds.left - hSize) :\n (this.props.clickAt.x - this.props.bounds.left);\n const top = (this.props.bounds.bottom - this.props.clickAt.y < vSize) ?\n (this.props.clickAt.y - this.props.bounds.top - vSize) :\n (this.props.clickAt.y - this.props.bounds.top);\n\n const position = {\n left: left + 'px',\n top: top + 'px'\n };\n\n return (\n \n );\n }\n}\n\nexport default injectIntl(ContextMenu);\n","import React from 'react';\n\nconst icon_mapping = {'muted': 'notifications_off', 'banned': 'block', 'staff': 'verified_user'};\n\n/* Contact's labels: [you], or icons [muted], [blocked] */\nexport default class ContactBadges extends React.PureComponent {\n render() {\n let badges = null;\n if (this.props.badges && this.props.badges.length > 0) {\n badges = [];\n this.props.badges.map((b) => {\n const color = (b.color ? ' ' + b.color : '');\n if (b.icon) {\n badges.push({icon_mapping[b.icon] || b.icon} );\n } else {\n badges.push({b.name} );\n }\n });\n return <>{badges}>;\n }\n return null;\n }\n};\n","// Odds and ends\n\nimport { Tinode } from 'tinode-sdk';\n\n// Make shortcut icon appear with a green dot + show unread count in title.\nexport function updateFavicon(count) {\n const oldIcon = document.getElementById('shortcut-icon');\n const head = document.head || document.getElementsByTagName('head')[0];\n const newIcon = document.createElement('link');\n newIcon.type = 'image/png';\n newIcon.id = 'shortcut-icon';\n newIcon.rel = 'shortcut icon';\n newIcon.href = 'img/logo32x32' + (count > 0 ? 'a' : '') + '.png';\n if (oldIcon) {\n head.removeChild(oldIcon);\n }\n head.appendChild(newIcon);\n\n document.title = (count > 0 ? '('+count+') ' : '') + 'Tinode';\n}\n\n// Create theCard which represents user's or topic's \"public\" info.\nexport function theCard(fn, imageUrl, imageMimeType, note) {\n let card = null;\n fn = fn && fn.trim();\n note = note && note.trim();\n\n if (fn) {\n card = {\n fn: fn\n };\n }\n\n if (typeof note == 'string') {\n card = card || {};\n card.note = note ? note : Tinode.DEL_CHAR;\n }\n\n if (imageUrl) {\n card = card || {};\n let mimeType = imageMimeType;\n // Is this a data URL \"data:[][;base64],\"?\n const matches = /^data:(image\\/[-a-z0-9+.]+)?(;base64)?,/i.exec(imageUrl);\n if (matches) {\n mimeType = matches[1];\n card.photo = {\n data: imageUrl.substring(imageUrl.indexOf(',') + 1),\n ref: Tinode.DEL_CHAR\n };\n } else {\n card.photo = {\n data: Tinode.DEL_CHAR,\n ref: imageUrl\n };\n }\n card.photo.type = (mimeType || 'image/jpeg').substring('image/'.length);\n }\n\n return card;\n}\n\n// Deep-shallow compare two arrays: shallow compare each element.\nexport function arrayEqual(a, b) {\n if (a === b) {\n return true;\n }\n\n if (!Array.isArray(a) || !Array.isArray(b)) {\n return false;\n }\n\n // Compare lengths first.\n if (a.length != b.length) {\n return false;\n }\n // Order of elements is ignored.\n a.sort();\n b.sort();\n for (let i = 0, l = a.length; i < l; i++) {\n if (a[i] !== b[i]) {\n return false;\n }\n }\n return true;\n}\n\n// Checks (loosely) if the given string is a phone. If so, returns the phone number in a format\n// as close to E.164 as possible.\nexport function asPhone(val) {\n val = val.trim();\n if (/^(?:\\+?(\\d{1,3}))?[- (.]*(\\d{3})[- ).]*(\\d{3})[- .]*(\\d{2})[- .]*(\\d{2})?$/.test(val)) {\n return val.replace(/[- ().]*/, '');\n }\n return null;\n}\n\n// Checks (loosely) if the given string is an email. If so returns the email.\nexport function asEmail(val) {\n val = val.trim();\n if (/^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\\.[a-zA-Z0-9-.]+$/.test(val)) {\n return val;\n }\n return null;\n}\n\n// Checks if URL is a relative url, i.e. has no 'scheme://', including the case of missing scheme '//'.\n// The scheme is expected to be RFC-compliant, e.g. [a-z][a-z0-9+.-]*\n// example.html - ok\n// https:example.com - not ok.\n// http:/example.com - not ok.\n// ' ↲ https://example.com' - not ok. (↲ means carriage return)\nexport function isUrlRelative(url) {\n return url && !/^\\s*([a-z][a-z0-9+.-]*:|\\/\\/)/im.test(url);\n}\n\n// Ensure URL does not present an XSS risk. Optional allowedSchemes may contain an array of\n// strings with permitted URL schemes, such as ['ftp', 'ftps']; otherwise accept http and https only.\nexport function sanitizeUrl(url, allowedSchemes) {\n if (typeof url != 'string') {\n return url;\n }\n\n // Strip control characters and whitespace. They are not valid URL characters anyway.\n url = url.replace(/[^\\x20-\\x7E]/gmi, '').trim();\n\n // Relative URLs are safe.\n // Relative URL does not start with ':', abcd123: or '//'.\n if (!/^([a-z][a-z0-9+.-]*:|\\/\\/)/i.test(url)) {\n return url;\n }\n\n // Blob URLs are safe.\n if (/^blob:http/.test(url)) {\n return url;\n }\n\n // Absolute URL. Accept only safe schemes, or no scheme.\n const schemes = Array.isArray(allowedSchemes) ? allowedSchemes.join('|') : 'http|https';\n const re = new RegExp('^((' + schemes + '):|//)', 'i');\n if (!re.test(url)) {\n return null;\n }\n\n return url;\n}\n\n// Ensure URL is suitable as a source like field: the URL must be a relative URL or\n// have http:, https:, blob: or data: scheme.\n// In case of data: scheme, the URL must must be of the right MIME type such as 'data:{mimeMajor}/XXXX;base64,'.\nexport function sanitizeUrlForMime(url, mimeMajor) {\n if (!url) {\n return null;\n }\n\n const sanitizedUrl = sanitizeUrl(url);\n if (sanitizedUrl) {\n return sanitizedUrl;\n }\n\n // Is this a data: URL of the appropriate mime type?\n const re = new RegExp(`data:${mimeMajor}\\/[a-z0-9.-]+;base64,`, 'i');\n if (re.test(url.trim())) {\n return url;\n }\n\n return null;\n}\n\n// Given message's received status, return name and color of a delivery indicator icon.\nexport function deliveryMarker(received) {\n switch (received) {\n case Tinode.MESSAGE_STATUS_SENDING:\n return { name: 'access_time' }; // watch face\n case Tinode.MESSAGE_STATUS_FAILED:\n return { name: 'warning', color: 'danger-color' }; // yellow icon /!\\\n case Tinode.MESSAGE_STATUS_SENT:\n return { name: 'done' }; // checkmark\n case Tinode.MESSAGE_STATUS_RECEIVED:\n return { name: 'done_all' }; // double checkmark\n case Tinode.MESSAGE_STATUS_READ:\n return { name: 'done_all', color: 'blue' }; // blue double checkmark\n }\n return null;\n}\n\n// Wraps a promise to make it cancelable.\n// The parameter can be either a promise or an error. If it's an error, the wrapped promise is\n// created in a rejected state.\nexport function cancelablePromise(promise) {\n let hasCanceled = false;\n\n const wrappedPromise = promise instanceof Error ?\n Promise.reject(promise) :\n new Promise((resolve, reject) => {\n promise.then(\n result => hasCanceled ? reject({isCanceled: true}) : resolve(result),\n error => hasCanceled ? reject({isCanceled: true}) : reject(error)\n );\n });\n\n return {\n promise: wrappedPromise,\n cancel() {\n hasCanceled = true;\n },\n };\n};\n\n// Clips string to the specified length.\nexport function clipStr(str, length) {\n return str && str.substring(0, length);\n}\n","import React from 'react';\n\nimport { Tinode } from 'tinode-sdk';\n\nimport { idToColorClass } from '../lib/strformat.js';\nimport { sanitizeUrlForMime } from '../lib/utils.js';\n\nexport default class LetterTile extends React.PureComponent {\n render() {\n let avatar;\n if (this.props.avatar === true) {\n const isGroup = Tinode.isGroupTopicName(this.props.topic);\n const iconColor = idToColorClass(this.props.topic, isGroup);\n if (this.props.topic && this.props.title && this.props.title.trim()) {\n const letter = this.props.title.trim().charAt(0);\n const className = 'lettertile ' + iconColor + (this.props.deleted ? ' disabled' : '');\n avatar = ()\n } else {\n const className = 'material-icons ' + iconColor + (this.props.deleted ? ' disabled' : '');\n avatar = isGroup ? group : person ;\n }\n } else if (this.props.avatar) {\n const url = this.props.tinode.authorizeURL(sanitizeUrlForMime(this.props.avatar, 'image'));\n // If avatar image is invalid, show a placeholder.\n const className = 'avatar' + (this.props.deleted ? ' deleted' : '');\n avatar = {e.target.onerror = null; e.target.src=\"../img/broken_image.png\"}} />;\n } else {\n avatar = null;\n }\n return avatar;\n }\n}\n","// The counter of unread messages in the topic.\nimport React from 'react';\n\nexport default class UnreadBadge extends React.PureComponent {\n render() {\n return (this.props.count > 0 ?\n {this.props.count > 9 ? \"9+\" : this.props.count} \n : null);\n }\n};\n","// Chat message describing a video or voice call.\n\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport { secondsToTime } from '../lib/strformat.js';\n\nexport default class CallMessage extends React.PureComponent {\n render() {\n const isCallDropped = ['declined', 'disconnected', 'missed'].includes(this.props.callState);\n const successClass = 'material-icons medium ' + (isCallDropped ? 'red' : 'green');\n const callIcon = this.props.incoming ?\n (isCallDropped ? 'call_missed' : 'call_received') :\n (isCallDropped ? 'call_missed_outgoing' : 'call_made');\n let duration;\n if (isCallDropped) {\n switch (this.props.callState) {\n case 'declined':\n duration = ;\n break;\n case 'missed':\n duration = this.props.incoming ?\n :\n ;\n break;\n default:\n duration = ;\n break;\n }\n } else {\n duration = {secondsToTime(this.props.duration / 1000)} ;\n }\n return \n
call
\n
\n
{this.props.incoming ?\n :\n \n }
\n
{callIcon} {duration}
\n
\n
;\n }\n}\n","// The counter of unread messages in the topic.\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport { secondsToTime } from '../lib/strformat.js';\n\n// Props:\n// incoming: true | false.\n// success: true | false.\nexport default class CallStatus extends React.PureComponent {\n render() {\n const isCallDropped = ['declined', 'disconnected', 'missed'].includes(this.props.callState);\n const icon2 = this.props.incoming ?\n (isCallDropped ? 'call_missed' : 'call_received') :\n (isCallDropped ? 'call_missed_outgoing' : 'call_made');\n let duration;\n if (isCallDropped) {\n switch (this.props.callState) {\n case 'declined':\n duration = ;\n break;\n case 'missed':\n duration = this.props.incoming ?\n :\n ;\n break;\n default:\n duration = ;\n break;\n }\n } else if (['accepted', 'started'].includes(this.props.callState) && !this.props.duration) {\n duration = \n } else {\n duration = {secondsToTime(this.props.duration / 1000)} ;\n }\n return (\n <>\n \n call {icon2} \n
{duration}\n >\n );\n }\n};\n","// Element which shows static video preview:\n// an image with duration and a play button in the middle.\n\nimport React from 'react';\n\nimport { secondsToTime } from '../lib/strformat.js'\n\nexport default class InlineVideo extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.videoRef = React.createRef();\n\n this.handleClick = this.handleClick.bind(this);\n }\n\n handleClick(e) {\n if (this.props.onClick) {\n // the click target has to be the image element.\n this.props.onClick(e);\n }\n }\n\n render() {\n const duration = secondsToTime(this.props['data-duration'] / 1000);\n const className = 'inline-video' + (this.props.onClick ? ' image-clickable' : '');\n return (\n \n {React.createElement('img', this.props)}\n {this.props.onClick ?\n
\n play_arrow \n
\n : null}\n {duration ?
{duration}
: null}\n
\n );\n }\n};\n","// Image with a placeholder which is replaced when the promise is resolved.\nimport React from 'react';\n\nexport default class LazyImage extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.state = {\n src: this.props.isvideo ? 'img/blankvid.png' : 'img/blankimg.png',\n style: Object.assign({padding: '4px'}, this.props.style),\n className: this.props.className,\n alt: this.props.alt,\n onClick: this.props.onClick,\n };\n }\n\n componentDidMount() {\n // whenDone is a wrapper around an actual promise to be able to cancel it.\n this.props.whenDone\n .promise\n .then(data => this.setState({src: data.src, style: {...this.state.style, padding: 0}}))\n .catch(_ => this.setState({src: this.props.isvideo ? 'img/broken_video.png' : 'img/broken_image.png'}));\n }\n\n componentWillUnmount() {\n this.props.whenDone.cancel();\n }\n\n componentDidUpdate(prevProps) {\n if (prevProps.whenDone != this.props.whenDone) {\n this.setState({src: this.props.isvideo ? 'img/blankvid.png' : 'img/blankimg.png', style: {...this.state.style, padding: '4px'}});\n this.props.whenDone\n .promise\n .then(data => this.setState({src: data.src, style: {...this.state.style, padding: 0}}))\n .catch(_ => this.setState({src: this.props.isvideo ? 'img/broken_video.png' : 'img/broken_image.png'}));\n }\n }\n\n render() {\n return React.createElement('img', this.state);\n }\n};\n","// File uload/download progress indicator with a cancel inside.\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nexport default class FileProgress extends React.PureComponent {\n render() {\n return (\n \n );\n }\n}\n","// Image view with progress bar and a cancel button.\nimport React from 'react';\n\nimport FileProgress from './file-progress.jsx';\n\nexport default class UploadingImage extends React.PureComponent {\n constructor(props) {\n super(props);\n }\n\n render() {\n return (\n \n {React.createElement('img', this.props)}\n
\n \n
\n
\n );\n }\n};\n","import React from 'react';\nimport { defineMessages } from 'react-intl';\n\nimport { Drafty } from 'tinode-sdk';\n\nimport AudioPlayer from '../widgets/audio-player.jsx'\nimport CallMessage from '../widgets/call-message.jsx'\nimport CallStatus from '../widgets/call-status.jsx';\nimport InlineVideo from '../widgets/inline-video.jsx';\nimport LazyImage from '../widgets/lazy-image.jsx'\nimport UploadingImage from '../widgets/uploading-image.jsx'\n\nimport { BROKEN_IMAGE_SIZE, IMAGE_THUMBNAIL_DIM, NO_DIMENSIONS_VIDEO, REM_SIZE, VIDEO_THUMBNAIL_WIDTH } from '../config.js';\nimport { base64ToBlob, blobToBase64, fitImageSize, imageScaled } from './blob-helpers.js';\nimport { idToColorClass, secondsToTime, shortenFileName } from './strformat.js';\nimport { cancelablePromise, sanitizeUrlForMime } from './utils.js';\n\nconst messages = defineMessages({\n drafty_form: {\n id: 'drafty_form',\n defaultMessage: 'Form: ',\n description: 'Comment for form in Drafty'\n },\n drafty_attachment: {\n id: 'drafty_attachment',\n defaultMessage: 'Attachment',\n description: 'Comment for attachment in Drafty'\n },\n drafty_image: {\n id: 'drafty_image',\n defaultMessage: 'Picture',\n description: 'Comment for embedded images in Drafty'\n },\n drafty_video: {\n id: 'drafty_video',\n defaultMessage: 'Video recording',\n description: 'Comment for videos embedded in Drafty'\n },\n drafty_unknown: {\n id: 'drafty_unknown',\n defaultMessage: 'Unsupported',\n description: 'Unsupported entity in drafty'\n }\n});\n\n// The main Drafty formatter: converts Drafty elements into React classes. 'this' is set by the caller.\n// 'this' must contain:\n// viewportWidth:\n// authorizeURL:\n// onImagePreview:\n// onVideoPreview:\n// onFormButtonClick:\n// onQuoteClick:\nexport function fullFormatter(style, data, values, key, stack) {\n if (stack.includes('QQ')) {\n return quoteFormatter.call(this, style, data, values, key);\n }\n\n if (!style) {\n // Unformatted.\n return values;\n }\n\n let el = Drafty.tagName(style);\n let attr = Drafty.attrValue(style, data) || {};\n attr.key = key;\n switch (style) {\n case 'AU':\n // Show audio player.\n if (attr.src) {\n attr.src = this.authorizeURL(sanitizeUrlForMime(attr.src, 'audio'));\n attr.duration = data.duration > 0 ? (data.duration | 0) : undefined;\n attr.preview = data.preview;\n attr.loading = 'lazy';\n }\n el = AudioPlayer;\n // Audio element cannot have content.\n values = null;\n break;\n case 'BR':\n values = null;\n break;\n case 'EX':\n // Ignore.\n break;\n case 'HL':\n // Highlighted text. Assign class name.\n attr.className = 'highlight';\n break;\n case 'HD':\n el = null;\n values = null;\n break;\n case 'IM':\n // Additional processing for images\n el = handleImageData.call(this, el, data, attr);\n // Image element cannot have content.\n values = null;\n break;\n case 'BN':\n // Button\n attr.onClick = this.onFormButtonClick;\n let inner = React.Children.map(values, (child) => {\n return typeof child == 'string' ? child : undefined;\n });\n if (!inner || inner.length == 0) {\n inner = [attr.name]\n }\n // Get text which will be sent back when the button is clicked.\n attr['data-title'] = inner.join('');\n break;\n case 'MN':\n // Mention\n attr.className = 'mention'\n if (data) {\n attr.className += ' ' + idToColorClass(data.val, false, true);\n }\n break;\n case 'FM':\n // Form\n attr.className = 'bot-form';\n break;\n case 'RW':\n // Form element formatting is dependent on element content.\n break;\n case 'QQ':\n // Quote/citation.\n attr.className = 'reply-quote'\n attr.onClick = this.onQuoteClick;\n break;\n case 'VC':\n el = CallMessage;\n // Video call messages do not have content.\n values = null;\n if (data) {\n attr.callState = data.state;\n attr.incoming = data.incoming;\n attr.duration = data.duration;\n }\n break;\n case 'VD':\n // Additional processing for videos.\n el = handleVideoData.call(this, el, data, attr);\n // Video element cannot have content.\n values = null;\n break;\n default:\n if (!el) {\n // Unknown element.\n el = React.Fragment;\n attr = {key: key};\n // Generate comment for unknown element.\n let body = values;\n if (!Array.isArray(values) || !values.join('').trim()) {\n body = [{this.formatMessage(messages.drafty_unknown)} ];\n }\n values = [extension , ' '].concat(body);\n }\n break;\n }\n if (!el) {\n return values;\n }\n return React.createElement(el, attr, values);\n}\n\n// Additional processing of image data.\nfunction handleImageData(el, data, attr) {\n if (!data) {\n attr.src = 'img/broken_image.png';\n attr.style = {\n width: IMAGE_THUMBNAIL_DIM + 'px',\n height: IMAGE_THUMBNAIL_DIM + 'px',\n };\n return el;\n }\n\n attr.className = 'inline-image';\n const dim = fitImageSize(data.width, data.height,\n this.viewportWidth > 0 ? Math.min(this.viewportWidth - REM_SIZE * 6.5, REM_SIZE * 34.5) :\n REM_SIZE * 34.5, REM_SIZE * 24, false) ||\n {dstWidth: BROKEN_IMAGE_SIZE, dstHeight: BROKEN_IMAGE_SIZE};\n attr.style = {\n width: dim.dstWidth + 'px',\n height: dim.dstHeight + 'px',\n // Looks like a Chrome bug: broken image does not respect 'width' and 'height'.\n minWidth: dim.dstWidth + 'px',\n minHeight: dim.dstHeight + 'px'\n };\n if (!Drafty.isProcessing(data)) {\n attr.src = this.authorizeURL(sanitizeUrlForMime(attr.src, 'image'));\n attr.alt = data.name;\n if (attr.src) {\n if (Math.max(data.width || 0, data.height || 0) > IMAGE_THUMBNAIL_DIM) {\n // Allow previews for large enough images.\n attr.onClick = this.onImagePreview;\n attr.className += ' image-clickable';\n }\n attr.loading = 'lazy';\n } else {\n attr.src = null;\n }\n } else {\n // Use custom element instead of .\n el = UploadingImage;\n }\n\n return el;\n}\n\n// Additional processing of image data.\nfunction handleVideoData(el, data, attr) {\n if (!data) {\n attr.src = 'img/broken_video.png';\n attr.style = {\n width: IMAGE_THUMBNAIL_DIM + 'px',\n height: IMAGE_THUMBNAIL_DIM + 'px',\n };\n return el;\n }\n attr.className = 'inline-image';\n const dim = fitImageSize(data.width, data.height,\n this.viewportWidth > 0 ? Math.min(this.viewportWidth - REM_SIZE * 6.5, REM_SIZE * 34.5) :\n REM_SIZE * 34.5, REM_SIZE * 24, false) ||\n {dstWidth: NO_DIMENSIONS_VIDEO, dstHeight: NO_DIMENSIONS_VIDEO};\n attr.style = {\n width: dim.dstWidth + 'px',\n height: dim.dstHeight + 'px',\n // Looks like a Chrome bug: broken image does not respect 'width' and 'height'.\n minWidth: dim.dstWidth + 'px',\n minHeight: dim.dstHeight + 'px'\n };\n if (!Drafty.isProcessing(data)) {\n attr.src = this.authorizeURL(sanitizeUrlForMime(attr.src, 'image'));\n attr.alt = data.name;\n if (data.ref || data.val) {\n attr.onClick = this.onVideoPreview;\n attr.loading = 'lazy';\n } else {\n attr.src = null;\n }\n el = InlineVideo;\n } else {\n // Use custom element instead of .\n el = UploadingImage;\n }\n\n return el;\n}\n\n// Converts Drafty object into a one-line preview. 'this' is set by the caller.\n// 'this' must contain:\n// formatMessage: this.props.intl.formatMessage\n// messages: formatjs messages defined with defineMessages.\nexport function previewFormatter(style, data, values, key) {\n if (!style) {\n // Unformatted.\n return values;\n }\n\n let el = Drafty.tagName(style);\n const attr = { key: key };\n switch (style) {\n case 'AU':\n // Voicemail as '[mic] 0:00'.\n el = React.Fragment;\n values = [mic , ' ', secondsToTime(data.duration/1000)];\n break;\n case 'BR':\n // Replace new line with a space.\n el = React.Fragment;\n values = [' '];\n break;\n case 'HL':\n // Make highlight less prominent in preview.\n attr.className = 'highlight preview';\n break;\n case 'LN':\n case 'MN':\n // Disable links in previews.\n el = 'span';\n break;\n case 'IM':\n // Replace image with '[icon] Image'.\n el = React.Fragment;\n values = [photo , ' ', this.formatMessage(messages.drafty_image)];\n break;\n case 'BN':\n el = 'span';\n attr.className = 'flat-button faux';\n break;\n case 'FM':\n el = React.Fragment;\n values = [dashboard ,\n this.formatMessage(messages.drafty_form)].concat(' ', values || []);\n break;\n case 'RW':\n el = React.Fragment;\n break;\n case 'EX':\n if (data) {\n if (data.mime == 'application/json') {\n // Ignore JSON attachments: they are form response payloads.\n return null;\n }\n // Clear payload.\n delete data.val;\n delete data.ref;\n }\n el = React.Fragment;\n values = [attachment , ' ', this.formatMessage(messages.drafty_attachment)];\n break;\n case 'VC':\n el = CallStatus;\n if (data) {\n attr.callState = data.state;\n attr.incoming = data.incoming;\n attr.duration = data.duration;\n }\n values = null;\n break;\n case 'QQ':\n case 'HD':\n el = null;\n values = null;\n break;\n case 'VD':\n // Replace image with '[icon] Video'.\n el = React.Fragment;\n values = [play_circle_outline , ' ', this.formatMessage(messages.drafty_video)];\n break;\n default:\n if (!el) {\n // Unknown element.\n el = React.Fragment;\n values = [extension , ' ', this.formatMessage(messages.drafty_unknown)];\n }\n break;\n }\n if (!el) {\n return values;\n }\n return React.createElement(el, attr, values);\n};\n\n// Converts Drafty object into a quoted reply; 'this' is set by the caller.\nfunction inlineImageAttr(attr, data) {\n attr.style = {\n width: IMAGE_THUMBNAIL_DIM + 'px',\n height: IMAGE_THUMBNAIL_DIM + 'px',\n maxWidth: IMAGE_THUMBNAIL_DIM + 'px',\n maxHeight: IMAGE_THUMBNAIL_DIM + 'px',\n }\n attr.className = 'inline-image';\n attr.alt = this.formatMessage(messages.drafty_image);\n if (!data) {\n attr.src = 'img/broken_image.png';\n } else {\n attr.src = attr.src || 'img/broken_image.png';\n }\n attr.title = attr.alt;\n return attr;\n}\n\n// Converts Drafty object into a quoted reply; 'this' is set by the caller.\nfunction inlineVideoAttr(attr, data) {\n const dim = fitImageSize(data.width, data.height, VIDEO_THUMBNAIL_WIDTH, IMAGE_THUMBNAIL_DIM);\n attr.style = {\n width: dim.width + 'px',\n height: dim.height + 'px',\n maxWidth: VIDEO_THUMBNAIL_WIDTH + 'px',\n maxHeight: IMAGE_THUMBNAIL_DIM + 'px',\n }\n attr.className = 'inline-image';\n attr.alt = this.formatMessage(messages.drafty_video);\n attr.title = attr.alt;\n if (!data) {\n attr.src = 'img/broken_video.png';\n } else {\n attr.src = attr.src || 'img/broken_video.png';\n }\n return attr;\n}\n\n// Displays a portion of Drafty within 'QQ' quotes. 'this' is set by the caller.\n// 'this' must contain:\n// formatMessage: this.props.intl.formatMessage\n// messages: formatjs messages defined with defineMessages.\n// authorizeURL: this.props.tinode.authorizeURL\n// onQuoteClick: this.handleQuoteClick (optional)\nfunction quoteFormatter(style, data, values, key) {\n if (['BR', 'EX', 'IM', 'MN', 'VD'].includes(style)) {\n let el = Drafty.tagName(style);\n let attr = Drafty.attrValue(style, data) || {};\n attr.key = key;\n switch(style) {\n case 'BR':\n values = null;\n break;\n case 'IM':\n attr = inlineImageAttr.call(this, attr, data);\n values = [React.createElement('img', attr, null), ' ', attr.alt];\n el = React.Fragment;\n // Fragment attributes.\n attr = {key: key};\n break;\n case 'VD':\n attr = inlineVideoAttr.call(this, attr, data);\n values = [React.createElement('img', attr, null), ' ', attr.alt];\n el = React.Fragment;\n // Fragment attributes.\n attr = {key: key};\n break;\n case 'MN':\n el = 'span';\n attr.className = 'mention'\n if (data) {\n attr.className += ' ' + idToColorClass(data.val, false, true);\n }\n break;\n case 'EX':\n let fname;\n if (data) {\n if (data.mime == 'application/json') {\n // Ignore JSON attachments: they are form response payloads.\n return null;\n }\n fname = data.name;\n // Clear payload.\n delete data.val;\n delete data.ref;\n }\n el = React.Fragment;\n values = [attachment ,\n shortenFileName(fname, 16) || this.formatMessage(messages.drafty_attachment)];\n break;\n }\n return React.createElement(el, attr, values);\n }\n return previewFormatter.call(this, style, data, values, key);\n}\n\n// Create image thumbnail suitable for inclusion in a quote.\nfunction quoteImageOrVideo(data, isVideo) {\n let promise;\n let bits, ref, mime;\n if (isVideo) {\n bits = data.preview;\n mime = data.premime || 'image/jpeg';\n ref = data.preref;\n } else {\n bits = data.val;\n mime = data.mime;\n ref = data.ref;\n }\n // Get the blob from the image data.\n if (bits) {\n const blob = base64ToBlob(bits, mime);\n if (!blob) {\n throw new Error(\"Invalid image\");\n }\n promise = Promise.resolve(blob);\n } else if (ref) {\n promise = fetch(this.authorizeURL(sanitizeUrlForMime(ref, 'image')))\n .then(evt => {\n if (evt.ok) {\n return evt.blob();\n } else {\n throw new Error(`Image fetch unsuccessful: ${evt.status} ${evt.statusText}`);\n }\n });\n } else {\n throw new Error(\"Missing image data\");\n }\n\n // Scale the blob.\n return promise\n .then(blob => {\n // If it's an image, cut the square from the center of the image and shrink it.\n // If it's a video, allow it to be rectantular.\n return imageScaled(blob, isVideo ? VIDEO_THUMBNAIL_WIDTH : IMAGE_THUMBNAIL_DIM, IMAGE_THUMBNAIL_DIM, -1, !isVideo)\n }).then(scaled => {\n if (isVideo) {\n data.premime = scaled.mime;\n } else {\n data.mime = scaled.mime;\n }\n data.size = scaled.blob.size;\n data.width = scaled.width;\n data.height = scaled.height;\n delete data.ref;\n delete data.preref;\n // Keeping the original file name, if provided: ex.data.name;\n\n data.src = URL.createObjectURL(scaled.blob);\n return blobToBase64(scaled.blob);\n }).then(b64 => {\n if (isVideo) {\n data.preview = b64.bits;\n } else {\n data.val = b64.bits;\n }\n return data;\n }).catch(err => {\n delete data.val;\n delete data.preview;\n delete data.src;\n data.width = IMAGE_THUMBNAIL_DIM;\n data.height = IMAGE_THUMBNAIL_DIM;\n // Rethrow.\n throw err;\n });\n}\n\n// Create a preview of a reply.\nexport function replyFormatter(style, data, values, key, stack) {\n if (style == 'IM' || style == 'VD') {\n const isImage = style == 'IM';\n const attr = isImage ? inlineImageAttr.call(this, {key: key}, data) :\n inlineVideoAttr.call(this, {key: key}, data);\n\n let loadedPromise;\n try {\n loadedPromise = cancelablePromise(quoteImageOrVideo.call(this, data, style == 'VD'));\n } catch (error) {\n console.warn(\"Failed to quote image:\", error.message);\n loadedPromise = cancelablePromise(error);\n }\n attr.whenDone = loadedPromise;\n values = [React.createElement(LazyImage, attr, null), ' ', attr.alt];\n return React.createElement(React.Fragment, {key: key}, values);\n } else if (style == 'QQ') {\n if (stack.includes('QQ')) {\n // Quote inside quote when forwarding a message.\n return React.createElement('span', {key: key},\n [format_quote , ' ']);\n }\n\n const attr = Drafty.attrValue('QQ', data) || {};\n attr.key = key;\n attr.className = 'reply-quote'\n return React.createElement(Drafty.tagName('QQ'), attr, values);\n }\n return quoteFormatter.call(this, style, data, values, key);\n}\n","// A single topic or user.\nimport React from 'react';\nimport { FormattedMessage, injectIntl } from 'react-intl';\n\nimport ContactBadges from './contact-badges.jsx';\nimport LetterTile from './letter-tile.jsx';\nimport UnreadBadge from './unread-badge.jsx';\n\nimport { Drafty } from 'tinode-sdk';\n\nimport { previewFormatter } from '../lib/formatters.js';\nimport { deliveryMarker } from '../lib/utils.js';\n\nclass Contact extends React.Component {\n constructor(props) {\n super(props);\n\n this.handleClick = this.handleClick.bind(this);\n this.handleContextClick = this.handleContextClick.bind(this);\n }\n\n handleClick(e) {\n e.preventDefault();\n e.stopPropagation();\n if (this.props.onSelected) {\n // Index this.props.index is used by GroupManager.\n this.props.onSelected(this.props.item, this.props.index);\n }\n }\n\n handleContextClick(e) {\n e.preventDefault();\n e.stopPropagation();\n this.props.showContextMenu({ topicName: this.props.item, y: e.pageY, x: e.pageX });\n }\n\n render() {\n let title = this.props.title;\n if (!title) {\n title = ;\n } else if (title.length > 30) {\n // FIXME: this is probably wrong for RTL languages.\n title = title.substring(0, 28) + '…';\n }\n const online = this.props.now ? 'online' : 'offline';\n const avatar = this.props.avatar ? this.props.avatar : true;\n const badges = this.props.badges ? this.props.badges.slice() : [];\n const icon_badges = [];\n if (this.props.isVerified) {\n icon_badges.push({icon: 'verified', color: 'verified-color'});\n }\n if (this.props.isStaff) {\n icon_badges.push({icon: 'staff', color: 'staff-color'});\n }\n if (this.props.isDangerous) {\n icon_badges.push({icon: 'dangerous', color: 'danger-color'});\n }\n if (this.props.acs) {\n if (this.props.showMode) {\n badges.push({name: this.props.acs.getMode(), key: 'mode'});\n }\n if (this.props.acs.isMuted()) {\n icon_badges.push({icon: 'muted'});\n }\n if (!this.props.acs.isJoiner()) {\n icon_badges.push({icon: 'banned'});\n }\n }\n\n // The this.props.preview contains alreay shortened Drafty or string.\n let preview;\n if (typeof this.props.preview == 'string') {\n preview = this.props.preview;\n } else if (Drafty.isValid(this.props.preview)) {\n preview = React.createElement(React.Fragment, null, Drafty.format(this.props.preview, previewFormatter,\n {formatMessage: this.props.intl.formatMessage, previewIsResponse: this.props.previewIsResponse}));\n } else if (this.props.preview) {\n preview =\n <>warning_amber \n \n >;\n }\n\n const icon = deliveryMarker(this.props.received);\n const marker = icon ? {icon.name} : null;\n const titleClass = 'contact-title' + (this.props.deleted ? ' deleted' : '');\n\n return (\n \n \n \n {this.props.deleted ? cancel :\n this.props.showOnline ? :\n (this.props.showCheckmark && this.props.selected) ?\n check_circle \n : null}\n
\n \n
{title} \n {this.props.isGroup ?
group : null}\n {this.props.isChannel ?
: null}\n
\n {!this.props.deleted ?
: null}\n
\n {this.props.showMode ?\n
:\n this.props.small ? null :
{marker}{preview || this.props.comment || '\\u00A0'}
}\n
\n {this.props.showContextMenu ?\n \n \n expand_more \n \n : null}\n \n );\n }\n};\n\nexport default injectIntl(Contact);\n","// A panel included into a list of contacts with an action text.\nimport React from 'react';\nimport { injectIntl } from 'react-intl';\n\nclass ContactAction extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.handleClick = this.handleClick.bind(this);\n }\n\n handleClick(e) {\n e.preventDefault();\n e.stopPropagation();\n this.props.onAction(this.props.action);\n }\n\n render() {\n const {formatMessage} = this.props.intl;\n return (\n \n {formatMessage(this.props.title, this.props.values)}
\n \n );\n }\n};\n\nexport default injectIntl(ContactAction);\n","// ContactList: component for showing a list of contacts,\n// such as a list of group members in a group chat.\nimport React from 'react';\nimport { defineMessages, injectIntl } from 'react-intl';\n\nimport { Drafty, Tinode } from 'tinode-sdk';\n\nimport Contact from './contact.jsx';\nimport ContactAction from './contact-action.jsx';\n\nimport { makeImageUrl } from '../lib/blob-helpers.js';\n\nimport { MESSAGE_PREVIEW_LENGTH } from '../config.js';\n\nconst messages = defineMessages({\n badge_you: {\n id: 'badge_you',\n defaultMessage: 'you',\n description: 'Badge for indicating the current user'\n },\n badge_owner: {\n id: 'badge_owner',\n defaultMessage: 'owner',\n description: 'Badge for indicating the owner'\n }\n});\n\nclass ContactList extends React.Component {\n render() {\n const { formatMessage } = this.props.intl;\n const showCheckmark = Array.isArray(this.props.topicSelected);\n const contactNodes = [];\n let contactsCount = 0;\n if (this.props.contacts && this.props.contacts.length > 0) {\n this.props.contacts.map((c) => {\n if (c.action) {\n // Action item\n contactNodes.push(\n );\n } else {\n // Normal contact\n const key = this.props.showMode ? c.user : (c.topic || c.user);\n // If filter function is provided, filter out the items\n // which don't satisfy the condition.\n if (this.props.filterFunc && this.props.filter) {\n const filterOn = [key];\n if (c.private && c.private.comment) {\n filterOn.push(('' + c.private.comment).toLowerCase());\n }\n if (c.public && c.public.fn) {\n filterOn.push(('' + c.public.fn).toLowerCase());\n }\n if (!this.props.filterFunc(this.props.filter, filterOn)) {\n return;\n }\n }\n\n const isChannel = Tinode.isChannelTopicName(key);\n const isGroup = !isChannel && Tinode.isGroupTopicName(key);\n const selected = showCheckmark ?\n (this.props.topicSelected.indexOf(key) > -1) :\n (this.props.topicSelected === key);\n const badges = [];\n if (this.props.showMode) {\n if (key == this.props.myUserId) {\n badges.push({name: formatMessage(messages.badge_you), color: 'green'});\n }\n if (c.acs && c.acs.isOwner()) {\n badges.push({name: formatMessage(messages.badge_owner), color: 'blue'});\n }\n }\n\n const comment = Array.isArray(c.private) ?\n c.private.join(',') : (c.private ? c.private.comment : null);\n let preview;\n let forwarded;\n let previewIsResponse;\n let deliveryStatus;\n if (!this.props.showMode && c.latestMessage) {\n const msg = c.latestMessage();\n if (msg) {\n forwarded = msg.head ? msg.head.forwarded : null;\n deliveryStatus = msg._status || c.msgStatus(msg, true);\n previewIsResponse = msg.from != this.props.myUserId;\n if (msg.content) {\n preview = typeof msg.content == 'string' ?\n msg.content.substr(0, MESSAGE_PREVIEW_LENGTH) :\n Drafty.preview(msg.content, MESSAGE_PREVIEW_LENGTH);\n }\n }\n }\n\n contactNodes.push(\n \n );\n contactsCount ++;\n }\n }, this);\n }\n\n return (\n \n {contactsCount == 0 ?\n
\n :\n null\n }\n {contactNodes.length > 0 ?\n
\n :\n null\n }\n
\n );\n }\n};\n\nexport default injectIntl(ContactList);\n","import React from 'react';\n\nimport { Tinode } from 'tinode-sdk';\n\nexport default class SearchContacts extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.state = {\n edited: false,\n search: ''\n };\n\n this.handleSearchChange = this.handleSearchChange.bind(this);\n this.handleSearch = this.handleSearch.bind(this);\n this.handleClear = this.handleClear.bind(this);\n this.handleKeyDown = this.handleKeyDown.bind(this);\n }\n\n componentWillUnmount() {\n if (this.state.edited) {\n this.setState({search: '', edited: false});\n this.props.onSearchContacts(Tinode.DEL_CHAR);\n }\n }\n\n handleSearchChange(e) {\n this.setState({search: e.target.value});\n }\n\n handleSearch(e) {\n e.preventDefault();\n const query = this.state.search.trim();\n this.setState({edited: (query.length > 0)});\n this.props.onSearchContacts(query.length > 0 ? query : Tinode.DEL_CHAR);\n }\n\n handleClear(e) {\n e.preventDefault();\n if (this.state.edited) {\n this.props.onSearchContacts(Tinode.DEL_CHAR);\n }\n this.setState({search: '', edited: false});\n }\n\n handleKeyDown(e) {\n if (e.key === 'Enter') {\n this.handleSearch(e);\n } else if (e.key === 'Escape') {\n this.handleClear();\n }\n }\n\n render() {\n return (\n \n );\n }\n};\n","// Forward Menu: message forwarding popup/dropdown menu.\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport { Tinode } from 'tinode-sdk';\n\nimport ContactList from './contact-list.jsx';\nimport SearchContacts from './search-contacts.jsx';\n\nexport default class ForwardDialog extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = {\n query: null\n };\n\n this.handleEscapeKey = this.handleEscapeKey.bind(this);\n this.handleClose = this.handleClose.bind(this);\n\n this.handleSearchContacts = this.handleSearchContacts.bind(this);\n this.handleContactSelected = this.handleContactSelected.bind(this);\n }\n\n componentDidMount() {\n this.props.onInitFind();\n }\n\n handleEscapeKey(e) {\n if (e.keyCode === 27) {\n // Not forwarding the message.\n this.props.hide(false);\n }\n }\n\n handleClose(e) {\n e.preventDefault();\n this.props.hide(false);\n }\n\n handleSearchContacts(query) {\n this.setState({ query: Tinode.isNullValue(query) ? null : query });\n this.props.onSearchContacts(query);\n }\n\n handleContactSelected(uid) {\n this.props.onTopicSelected(uid);\n this.props.hide(true);\n }\n\n render() {\n let contacts = this.state.query != null ? this.props.searchResults : this.props.contacts;\n // Filter out contacts without a 'W' or 'J' permissions as well as the current topic.\n contacts = contacts.filter((c) => {\n return (c.name != this.props.topicSelected) && c.acs.isJoiner() && c.acs.isWriter();\n });\n\n return (\n \n
\n
\n
{\n (search_placeholder) => \n } \n
{\n (not_found_placeholder) => \n } \n
\n
\n );\n }\n}\n","import React from 'react';\nimport { defineMessages, injectIntl } from 'react-intl';\n\nconst icon_mapping = {'staff': 'verified_user'};\n\nconst messages = defineMessages({\n badge_verified: {\n id: 'badge_verified',\n defaultMessage: 'Verified/official',\n description: 'Explanation of a verified account or topic badge'\n },\n badge_staff: {\n id: 'badge_staff',\n defaultMessage: 'Staff-managed',\n description: 'Explanation of a staff-managed account or topic badge'\n },\n badge_danger: {\n id: 'badge_danger',\n defaultMessage: 'Untrustworthy',\n description: 'Suspicious or untrustworthy account or topic badge'\n },\n});\n\n\n/* Trusted badges with labels: verified, staff, danger */\nclass BadgeList extends React.PureComponent {\n render() {\n const {formatMessage} = this.props.intl;\n let badges = null;\n if (this.props.trustedBadges && this.props.trustedBadges.length > 0) {\n badges = [];\n this.props.trustedBadges.map((b) => {\n const comment = this.props.short ? null : formatMessage(messages['badge_' + b]);\n const style = 'material-icons ' + b + '-color';\n badges.push({icon_mapping[b] || b} {comment}
);\n });\n return <>{badges}>;\n }\n return null;\n }\n};\n\nexport default injectIntl(BadgeList);\n","// Video call states.\nexport const CALL_STATE_NONE = 0;\nexport const CALL_STATE_OUTGOING_INITATED = 1;\nexport const CALL_STATE_INCOMING_RECEIVED = 2;\nexport const CALL_STATE_IN_PROGRESS = 3;\n\n// Video call message headers representing call state.\nexport const CALL_HEAD_STARTED = 'started';\n","// IncomingCall: displays Accept & Reject buttons for incoming calls.\nimport React from 'react';\n\nimport BadgeList from './badge-list.jsx';\nimport LetterTile from './letter-tile.jsx';\n\nimport { MAX_TITLE_LENGTH, MAX_PEER_TITLE_LENGTH } from '../config.js';\nimport { CALL_STATE_INCOMING_RECEIVED } from '../constants.js';\n\nimport { makeImageUrl } from '../lib/blob-helpers.js';\nimport { clipStr } from '../lib/utils.js'\n\nconst RING_SOUND = new Audio('audio/call-in.m4a');\n\nexport default class CallIncoming extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = {\n topic: null,\n fullName: undefined,\n avatar: null,\n trustedBadges: [],\n previousMetaDesc: undefined,\n };\n\n this.resetDesc = this.resetDesc.bind(this);\n this.onMetaDesc = this.onMetaDesc.bind(this);\n this.handleRejectCall = this.handleRejectCall.bind(this);\n this.handleAcceptCall = this.handleAcceptCall.bind(this);\n this.ringTimer = null;\n }\n\n componentDidMount() {\n const topic = this.props.tinode.getTopic(this.props.topic);\n if (!topic) {\n return;\n }\n\n this.resetDesc(topic);\n if (this.props.callState == CALL_STATE_INCOMING_RECEIVED) {\n // play() throws if the user did not click the app first: https://goo.gl/xX8pDD.\n RING_SOUND.play().catch(_ => {});\n this.ringTimer = setInterval(_ => {RING_SOUND.play().catch(_ => {})}, 2000);\n this.props.onRinging(this.props.topic, this.props.seq);\n }\n }\n\n // No need to separately handle component mount.\n componentDidUpdate(props) {\n const topic = this.props.tinode.getTopic(props.topic);\n if (!topic) {\n return;\n }\n\n if (this.onMetaDesc != topic.onMetaDesc) {\n this.previousMetaDesc = topic.onMetaDesc;\n topic.onMetaDesc = this.onMetaDesc;\n }\n\n if (this.state.topic != props.topic) {\n this.setState({topic: props.topic});\n this.resetDesc(topic, props);\n }\n }\n\n componentWillUnmount() {\n if (this.ringTimer != null) {\n clearInterval(this.ringTimer);\n RING_SOUND.pause();\n }\n const topic = this.props.tinode.getTopic(this.props.topic);\n if (!topic) {\n return;\n }\n this.setState({topic: null});\n topic.onMetaDesc = this.previousMetaDesc;\n }\n\n resetDesc(topic) {\n const badges = [];\n if (topic.trusted) {\n for (const [key, val] of Object.entries(topic.trusted)) {\n if (val) {\n badges.push(key);\n }\n }\n }\n\n this.setState({\n fullName: clipStr(topic.public ? topic.public.fn : undefined, MAX_TITLE_LENGTH),\n avatar: makeImageUrl(topic.public ? topic.public.photo : null),\n trustedBadges: badges,\n });\n }\n\n onMetaDesc(desc) {\n const topic = this.props.tinode.getTopic(this.props.topic);\n if (!topic) {\n return;\n }\n this.resetDesc(topic);\n\n if (this.previousMetaDesc && this.previousMetaDesc != this.onMetaDesc) {\n this.previousMetaDesc(desc);\n }\n }\n\n handleAcceptCall() {\n this.props.onAcceptCall(this.props.topic);\n }\n\n handleRejectCall() {\n this.props.onReject(this.props.topic, this.props.seq);\n this.props.onClose();\n }\n\n render() {\n return (\n \n
\n
\n
\n \n
\n
{clipStr(this.state.fullName, MAX_PEER_TITLE_LENGTH)}\n
\n
\n
\n {this.props.callState == CALL_STATE_INCOMING_RECEIVED ?\n <>\n \n call_end \n \n \n call \n \n >\n :\n null\n }\n
\n
\n
\n );\n }\n};\n","import React from 'react';\n\nexport default class LoadSpinner extends React.PureComponent {\n render() {\n const className = 'load-spinner-box' + (this.props.large ? ' large' : '')\n + (this.props.clear ? ' clear' : '') + (this.props.centered ? ' centered' : '');\n return (this.props.show ?\n : null);\n }\n}\n","import React from 'react';\n\nimport LetterTile from './letter-tile.jsx';\nimport LoadSpinner from './load-spinner.jsx';\n\nimport { sanitizeUrlForMime } from '../lib/utils.js';\n\nimport { AVATAR_SIZE } from '../config.js';\n\nexport default class AvatarUpload extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = {\n source: props.avatar\n };\n\n this.handleFileReceived = this.handleFileReceived.bind(this);\n }\n\n componentDidUpdate(prevProps) {\n if (this.props.avatar != prevProps.avatar) {\n this.setState({source: this.props.avatar});\n }\n }\n\n handleFileReceived(e) {\n const image = e.target.files[0];\n this.props.onImageUpdated(image.type, URL.createObjectURL(image), image.name);\n // Clear the value so the same file can be uploaded again.\n e.target.value = '';\n }\n\n render() {\n // Randomize id value in case more than one AvatarUpload is shown\n // at the same time.\n const randId = 'file-input-avatar-' + ('' + Math.random()).substring(0, 4);\n const className = 'avatar-upload' + (this.props.readOnly ? ' read-only' : '');\n return (\n \n {this.props.readOnly || !this.state.source ?\n null :\n
{e.preventDefault(); this.props.onImageUpdated();}}>\n clear \n }\n {this.state.source ?\n
:\n this.props.readOnly && this.props.uid ?\n
\n \n
\n :\n
{AVATAR_SIZE}×{AVATAR_SIZE}
}\n {this.props.readOnly ? null :\n
}\n {this.props.readOnly ? null :\n
\n file_upload \n }\n
\n
\n );\n }\n};\n","import React from 'react';\n\n/* CheckBox: styled three-state checkbox, either clickable or static */\nexport default class CheckBox extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.handleChange = this.handleChange.bind(this);\n }\n\n handleChange() {\n this.props.onChange(this.props.name, !this.props.checked);\n }\n\n render() {\n let classList = ['material-icons'];\n let iconName;\n if (Array.isArray(this.props.className)) {\n classList.push(...this.props.className);\n } else if (this.props.className) {\n classList.push(this.props.className);\n }\n if (this.props.onChange) {\n if (this.props.checked) {\n classList.push('blue', 'clickable');\n iconName = 'check_box';\n } else if (this.props.checked === false) {\n classList.push('blue', 'clickable');\n iconName = 'check_box_outline_blank';\n } else {\n classList.push('lt-blue');\n iconName = 'indeterminate_check_box';\n }\n } else {\n if (this.props.checked) {\n iconName = 'check_box';\n } else {\n iconName = 'check_box_outline_blank';\n }\n }\n let attrs = {\n className: classList.join(' '),\n id: this.props.id,\n };\n if (this.props.onChange) {\n attrs.onClick = this.handleChange;\n }\n return React.createElement('i', attrs, iconName);\n }\n}\n","// The X menu to be displayed in title bars.\nimport React from 'react';\n\nexport default class MenuCancel extends React.PureComponent {\n render() {\n return (\n {e.preventDefault(); this.props.onCancel();}}>\n close \n \n );\n }\n}\n","import React from 'react';\n\nimport MenuCancel from './menu-cancel.jsx';\n\nexport default class ErrorPanel extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.state = {\n show: false,\n };\n\n this.hide = this.hide.bind(this);\n }\n\n componentDidUpdate(prevProps) {\n if (prevProps.level !== this.props.level) {\n this.setState({\n show: !(!this.props.level)\n });\n }\n }\n\n hide() {\n this.setState({show: false});\n if (this.props.onClearError) {\n this.props.onClearError();\n }\n }\n\n render() {\n const icons = {err: 'error', warn: 'warning', info: 'info'}\n const level = icons[this.props.level] || '';\n const className = 'info-box ' + level;\n return (\n \n );\n }\n};\n","import React from 'react';\n\nimport LetterTile from './letter-tile.jsx';\n\nexport default class Chip extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.handleCancel = this.handleCancel.bind(this);\n }\n\n handleCancel(e) {\n e.preventDefault();\n this.props.onCancel(this.props.topic, this.props.index);\n }\n\n render() {\n const title = this.props.title || this.props.topic;\n const className = this.props.invalid ? 'chip invalid' : 'chip';\n return (\n \n {this.props.noAvatar ?\n
:\n
\n \n
\n }\n
{title} \n {this.props.onCancel && !this.props.required ?\n
× \n :
}\n
\n );\n }\n};\n","import React from 'react';\n\nimport Chip from './chip.jsx';\n\nimport { makeImageUrl } from '../lib/blob-helpers.js';\n\n/* BEGIN ChipInput: group membership widget */\nexport default class ChipInput extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = ChipInput.deriveStateFromProps(props);\n this.state.input = '';\n this.state.focused = false;\n\n this.handleTextInput = this.handleTextInput.bind(this);\n this.removeChipAt = this.removeChipAt.bind(this);\n this.handleChipCancel = this.handleChipCancel.bind(this);\n this.handleFocusGained = this.handleFocusGained.bind(this);\n this.handleFocusLost = this.handleFocusLost.bind(this);\n this.handleKeyDown = this.handleKeyDown.bind(this);\n }\n\n static deriveStateFromProps(props) {\n return {\n placeholder: props.chips ? '' : props.prompt,\n sortedChips: ChipInput.sortChips(props.chips, props.staticMembers),\n chipIndex: ChipInput.indexChips(props.chips)\n };\n }\n\n componentDidUpdate(prevProps, prevState) {\n if (prevProps.chips != this.props.chips ||\n prevProps.staticMembers != this.props.staticMembers ||\n prevProps.prompt != this.props.prompt) {\n this.setState(ChipInput.deriveStateFromProps(this.props));\n }\n if (!prevState || this.props.chips.length > prevState.sortedChips.length) {\n this.setState({input: ''});\n }\n }\n\n // Map chip index to user name\n static indexChips(chips) {\n const index = {};\n let count = 0;\n chips.map((item) => {\n index[item.user] = count;\n count ++;\n });\n return index;\n }\n\n // Have non-removable chips appear before all other chips.\n static sortChips(chips, keep) {\n const required = [];\n const normal = [];\n chips.map((item) => {\n if (keep && keep.includes(item.user)) {\n required.push(item);\n } else {\n normal.push(item);\n }\n });\n return required.concat(normal);\n }\n\n handleTextInput(e) {\n this.setState({input: e.target.value});\n if (this.props.filterFunc) {\n this.props.filterFunc(e.target.value);\n }\n }\n\n removeChipAt(idx) {\n const removed = this.state.sortedChips[idx];\n this.props.onChipRemoved(removed.user, this.state.chipIndex[removed.user]);\n }\n\n handleChipCancel(item, idx) {\n this.removeChipAt(idx);\n }\n\n handleFocusGained() {\n this.setState({focused: true});\n }\n\n handleFocusLost() {\n this.setState({focused: false});\n if (this.props.onFocusLost) {\n this.props.onFocusLost(this.state.input);\n }\n }\n\n handleKeyDown(e) {\n if (e.key === 'Backspace') {\n if (this.state.input.length == 0 && this.state.sortedChips.length > 0) {\n const at = this.state.sortedChips.length - 1;\n if (this.state.sortedChips[at].user !== this.props.staticMembers) {\n this.removeChipAt(at);\n }\n }\n } else if (e.key === 'Enter') {\n if (this.props.onEnter) {\n this.props.onEnter(this.state.input);\n }\n } else if (e.key === 'Escape') {\n if (this.props.onCancel) {\n this.props.onCancel();\n }\n }\n }\n\n render() {\n const chips = [];\n let count = 0;\n const staticMembers = this.props.staticMembers || [];\n this.state.sortedChips.map((item) => {\n chips.push(\n \n );\n count++;\n });\n const className = \"chip-input\" + (this.state.focused ? ' focused' : '');\n const autoFocus = !(this.props.tabIndex > 0);\n return (\n \n {chips}\n \n
\n );\n }\n};\n","// GroupMembers: control for managing a list of group members.\nimport React from 'react';\nimport { FormattedMessage, defineMessages, injectIntl } from 'react-intl';\n\nimport ChipInput from './chip-input.jsx';\nimport ContactList from './contact-list.jsx';\n\nconst messages = defineMessages({\n no_contacts: {\n id: 'no_contacts',\n defaultMessage: 'You have no contacts :-(',\n description: 'Shown in ContactsView when the user has no contacts'\n },\n contacts_not_found_short: {\n id: 'contacts_not_found_short',\n defaultMessage: \"No contacts match ''{query}''\",\n description: 'Shown in ContactsView when search returned no results'\n }\n});\n\nclass GroupManager extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = {\n // Array of topic members\n members: props.members,\n index: GroupManager.indexMembers(props.members),\n staticMembers: GroupManager.staticMembers(props.members, props.keepInitialMembers, props.requiredMember),\n contactFilter: '',\n noContactsMessage: props.intl.formatMessage(messages.no_contacts),\n selectedContacts: GroupManager.selectedContacts(props.members)\n };\n\n this.handleContactSelected = this.handleContactSelected.bind(this);\n this.handleMemberRemoved = this.handleMemberRemoved.bind(this);\n this.handleContactFilter = this.handleContactFilter.bind(this);\n this.handleSubmit = this.handleSubmit.bind(this);\n this.handleCancel = this.handleCancel.bind(this);\n }\n\n static indexMembers(members) {\n let index = {};\n members.map((m) => {\n index[m.user] = {delta: 0, present: true}; // Delta: 0 unchanged, +1 added, -1 removed\n });\n return index;\n }\n\n static staticMembers(members, keepInitial, requiredMember) {\n let stat = [];\n members.map((m) => {\n if (keepInitial || m.user == requiredMember) {\n stat.push(m.user);\n }\n });\n return stat;\n }\n\n static selectedContacts(members) {\n let sel = [];\n members.map((m) => {\n sel.push(m.user);\n });\n return sel;\n }\n\n handleContactSelected(userId, index) {\n let status = this.state.index[userId];\n if (status) {\n if (status.present) {\n // Prevent duplicate members\n return;\n }\n status.delta += 1;\n status.present = true;\n } else {\n status = {delta: 1, present: true};\n }\n\n let m = this.state.members.slice();\n m.push(this.props.contacts[index]);\n\n const sel = GroupManager.selectedContacts(m);\n\n const i = this.state.index;\n i[userId] = status;\n\n this.setState({members: m, index: i, selectedContacts: sel});\n }\n\n handleMemberRemoved(userId, index) {\n const status = this.state.index[userId];\n if (!status || !status.present) {\n return;\n }\n status.present = false;\n status.delta -= 1;\n\n let m = this.state.members.slice();\n m.splice(index, 1);\n\n const sel = GroupManager.selectedContacts(m);\n\n const i = this.state.index;\n i[userId] = status;\n\n this.setState({members: m, index: i, selectedContacts: sel});\n }\n\n handleContactFilter(val) {\n const {formatMessage} = this.props.intl;\n const msg = !val ?\n formatMessage(messages.no_contacts) :\n formatMessage(messages.contacts_not_found_short, {query: val});\n\n this.setState({contactFilter: val, noContactsMessage: msg});\n }\n\n static doContactFiltering(filter, values) {\n if (filter) {\n for (let i=0; i= 0) {\n return true;\n }\n }\n return false;\n }\n return true;\n }\n\n handleSubmit() {\n var instance = this;\n var members = [];\n var added = [];\n var removed = [];\n\n var keys = Object.keys(this.state.index);\n keys.map(function(k) {\n if (instance.state.index[k].present) {\n members.push(k);\n }\n\n if (instance.state.index[k].delta > 0) {\n added.push(k);\n } else if (instance.state.index[k].delta < 0) {\n removed.push(k);\n }\n });\n this.props.onSubmit(members, added, removed);\n }\n\n handleCancel() {\n this.props.onCancel();\n }\n\n render() {\n const {formatMessage} = this.props.intl;\n return (\n \n
\n \n \n \n
\n
\n \n
\n
\n \n \n \n
\n
\n
\n \n \n \n \n \n \n
\n
\n );\n }\n};\n\nexport default injectIntl(GroupManager);\n","// PermissionsEditor: Component for editing permissions\n// \nimport React from 'react';\nimport { FormattedMessage, defineMessages, injectIntl } from 'react-intl';\n\nimport CheckBox from './checkbox.jsx';\nimport Contact from './contact.jsx';\n\nimport { makeImageUrl } from '../lib/blob-helpers.js';\n\n// Translatable permission names.\nconst messages = defineMessages({\n joiner: {\n id: 'permission_join',\n defaultMessage: \"Join ({val})\",\n description: 'Name of J permission'\n },\n reader: {\n id: 'permission_read',\n defaultMessage: \"Read ({val})\",\n description: 'Name of R permission'\n },\n writer: {\n id: 'permission_write',\n defaultMessage: \"Write ({val})\",\n description: 'Name of W permission'\n },\n preser: {\n id: 'permission_pres',\n defaultMessage: \"Get notified ({val})\",\n description: 'Name of P permission'\n },\n approver: {\n id: 'permission_admin',\n defaultMessage: \"Approve ({val})\",\n description: 'Name of A permission'\n },\n sharer: {\n id: 'permission_share',\n defaultMessage: \"Share ({val})\",\n description: 'Name of S permission'\n },\n deleter: {\n id: 'permission_delete',\n defaultMessage: \"Delete ({val})\",\n description: 'Name of D permission'\n },\n owner: {\n id: 'permission_owner',\n defaultMessage: \"Owner ({val})\",\n description: 'Name of O permission'\n }\n});\n\nclass PermissionsEditor extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = {\n mode: (props.mode || '').replace('N', '')\n };\n\n this.handleChange = this.handleChange.bind(this);\n this.handleSubmit = this.handleSubmit.bind(this);\n this.handleCancel = this.handleCancel.bind(this);\n }\n\n handleChange(val) {\n let mode = this.state.mode;\n const idx = mode.indexOf(val);\n if (idx == -1) {\n mode += val;\n } else {\n mode = mode.replace(val, '');\n }\n this.setState({mode: mode});\n }\n\n handleSubmit() {\n // Normalize string, otherwise cannot check if mode has changed.\n const mode = (this.state.mode || 'N').split('').sort().join('');\n const before = (this.props.mode || 'N').split('').sort().join('')\n if (mode !== before) {\n this.props.onSubmit(mode);\n } else {\n this.props.onCancel();\n }\n }\n\n handleCancel() {\n this.props.onCancel();\n }\n\n render() {\n const {formatMessage} = this.props.intl;\n const all = 'JRWPASDO';\n const names = {\n 'J': formatMessage(messages.joiner, {val: 'J'}),\n 'R': formatMessage(messages.reader, {val: 'R'}),\n 'W': formatMessage(messages.writer, {val: 'W'}),\n 'P': formatMessage(messages.preser, {val: 'P'}),\n 'A': formatMessage(messages.approver, {val: 'A'}),\n 'S': formatMessage(messages.sharer, {val: 'S'}),\n 'D': formatMessage(messages.deleter, {val: 'D'}),\n 'O': formatMessage(messages.owner, {val: 'O'})\n };\n\n let skip = this.props.skip || '';\n let mode = this.state.mode;\n let compare = (this.props.compare || '').replace('N', '');\n let items = [];\n for (let i=0; i= 0 && mode.indexOf(c) < 0) {\n // Permission is marked as inactive: hide unchecked permissions, disable checked permissions\n continue;\n }\n items.push(\n \n {names[c]} \n {skip.indexOf(c) < 0 ?\n = 0)} onChange={this.handleChange}/>\n :\n = 0)} />\n } {this.props.compare ? \n = 0)}/>\n : null}\n \n );\n }\n\n return (\n \n {this.props.userTitle ?\n
: null}\n
\n
\n {this.props.compare ?\n \n {this.props.modeTitle} \n {this.props.compareTitle} \n :\n null}\n \n {items}\n
\n
\n
\n \n \n \n \n \n \n
\n
\n );\n }\n};\n\nexport default injectIntl(PermissionsEditor);\n","// Image zoom and crop widget.\n\nimport React from 'react';\n\nconst DEFAULT_MAX_ZOOM = 2.5;\n\nexport default class Cropper extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = {\n // Coordinates of the top left corner of the image in container coordinates.\n panX: 0,\n panY: 0,\n // Origin of the zoom in image coordinates.\n originX: 0,\n originY: 0,\n // Zoom scale.\n zoom: 1,\n // Zoom min and max.\n minZoom: 0,\n maxZoom: DEFAULT_MAX_ZOOM,\n };\n\n // References to DOM elements for hooking up events and getting screen dimensions.\n // The transparent element which captures mouse moves (moves with the image).\n this.overlay = React.createRef();\n // The image cutout window or view port (static).\n this.cutout = React.createRef();\n // Scaled and translated image preview.\n this.preview = React.createRef();\n // The main container (static).\n this.boundingBox = React.createRef();\n\n // The original image width and height before any scaling.\n this.imageWidth = 0;\n this.imageHeight = 0;\n\n // Mouse position when dragging.\n this.mouseX = 0\n this.mouseY = 0;\n // Length of the previous mouse move when dragging.\n this.prevDistance = 0;\n\n // Bounding rectangles of static elements.\n this.cutoutRect = {};\n this.bBoxRect = {};\n // Center of the bounding box.\n this.originX = 0;\n this.originY = 0;\n\n this.initScaling = this.initScaling.bind(this);\n this.onZoom = this.onZoom.bind(this);\n this.handleZoom = this.handleZoom.bind(this);\n this.mouseDown = this.mouseDown.bind(this);\n this.mouseUp = this.mouseUp.bind(this);\n this.mouseMove = this.mouseMove.bind(this);\n this.mouseTouch = this.mouseTouch.bind(this);\n this.positionAll = this.positionAll.bind(this);\n this.translate = this.translate.bind(this);\n }\n\n componentDidMount() {\n this.overlay.current.addEventListener('mousedown', this.mouseDown, { passive: true });\n this.overlay.current.addEventListener('touchstart', this.mouseDown, { passive: true });\n\n // The rectangle position is in viewport coordinates.\n this.bBoxRect = this.boundingBox.current.getBoundingClientRect();\n // Center of the bounding box in container coordinates.\n this.originX = this.bBoxRect.width / 2;\n this.originY = this.bBoxRect.height / 2;\n\n // The rectangle position is in viewport coordinates.\n this.cutoutRect = this.cutout.current.getBoundingClientRect();\n }\n\n componentWillUnmount() {\n this.overlay.current.removeEventListener('mousedown', this.mouseDown);\n this.overlay.current.removeEventListener('touchstart', this.mouseDown);\n }\n\n // Position all elements.\n positionAll(panX, panY, zoom) {\n // Zoom origin in image preview coordinates.\n this.setState({\n panX: panX,\n panY: panY,\n zoom: zoom,\n originX: this.originX - panX,\n originY: this.originY - panY,\n });\n\n // Pass cut out coordinates to caller.\n const left = (this.originX - panX) * zoom - this.originX;\n const top = (this.originY - panY) * zoom - this.originY;\n this.props.onChange(\n (left + this.cutoutRect.left - this.bBoxRect.left) / zoom,\n (top + this.cutoutRect.top - this.bBoxRect.top) / zoom,\n this.cutoutRect.width / zoom,\n this.cutoutRect.height / zoom,\n zoom);\n }\n\n // Check if new location is within the limits.\n static checkBound(currPan, img, cutout, delta) {\n let nextDiff = Math.min(0, cutout[0] - img[0] - delta, img[1] - cutout[1] + delta);\n if (nextDiff == 0) {\n // Cutout is completely within the image.\n currPan += delta;\n } else if (Math.min(0, cutout[0] - img[0], img[1] - cutout[1]) < nextDiff) {\n // Cutout is outside of the range but closer to the bound.\n currPan += delta;\n }\n return currPan;\n }\n\n initScaling() {\n // Initialize components.\n const imgRect = this.preview.current.getBoundingClientRect();\n\n this.imageWidth = imgRect.width;\n this.imageHeight = imgRect.height;\n\n // Set zoom slider's min and max values. Make sure the scaled image cannot be smaller than the cutout.\n const minZoom = Math.max(this.cutoutRect.width / imgRect.width, this.cutoutRect.height / imgRect.height);\n this.setState({\n minZoom: minZoom,\n maxZoom: Math.max(DEFAULT_MAX_ZOOM, minZoom + 1)\n });\n\n // Initial zoom level fills the bounding box at the smallest image dimension and overflows the largest, i.e. \"fill\" not \"fit\".\n const zoom = Math.max(this.bBoxRect.width / imgRect.width, this.bBoxRect.height / imgRect.height);\n // Converting from viewport coordinates to container, then panning.\n const panX = this.cutoutRect.left - this.bBoxRect.left -\n (imgRect.width - this.cutoutRect.width) / 2;\n const panY = this.cutoutRect.top - this.bBoxRect.top -\n (imgRect.height - this.cutoutRect.height) / 2;\n\n this.positionAll(panX, panY, zoom);\n }\n\n onZoom(e) {\n this.handleZoom(e.target.value);\n }\n\n handleZoom(zoom) {\n let panX = this.state.panX;\n let panY = this.state.panY;\n\n // Ensure that the image at the new zoom is not outside of the cutout boundaries.\n // Calculate image coordinates at the new zoom.\n const imgLeft = this.originX - (this.originX - panX) * zoom;\n const imgRight = imgLeft + this.imageWidth * zoom;\n // Cutout in the same coordinates as the image.\n const coLeft = this.cutoutRect.left - this.bBoxRect.left;\n const coRight = coLeft + this.cutoutRect.width;\n if (coLeft < imgLeft) {\n panX -= imgLeft - coLeft;\n } else if (coRight > imgRight) {\n panX += coRight - imgRight;\n }\n const imgTop = this.originY - (this.originY - panY) * zoom;\n const imgBottom = imgTop + this.imageHeight * zoom;\n const coTop = this.cutoutRect.top - this.bBoxRect.top;\n const coBottom = coTop + this.cutoutRect.height;\n if (coTop < imgTop) {\n panY -= imgTop - coTop;\n } else if (coBottom > imgBottom) {\n panY += coBottom - imgBottom;\n }\n\n this.positionAll(panX, panY, zoom);\n }\n\n mouseDown(e) {\n if (e.touches) {\n this.mouseX = e.touches[0].pageX;\n this.mouseY = e.touches[0].pageY;\n } else {\n this.mouseX = e.pageX;\n this.mouseY = e.pageY;\n }\n\n window.addEventListener('mousemove', this.mouseMove, { passive: false });\n window.addEventListener('touchmove', this.mouseTouch, { passive: false });\n window.addEventListener('mouseup', this.mouseUp, { passive: true });\n window.addEventListener('touchend', this.mouseUp, { passive: true });\n // Disable text selection in the entire document.\n document.body.style['userSelect'] = 'none';\n }\n\n // Perform image panning.\n translate(pageX, pageY) {\n const dX = pageX - this.mouseX;\n const dY = pageY - this.mouseY;\n\n this.mouseX = pageX;\n this.mouseY = pageY;\n\n // Make sure the image is within the cutout window.\n const imgRect = this.preview.current.getBoundingClientRect();\n\n // Check if the new position is within the boundaries, and if not if it's closer to them.\n let panX = Cropper.checkBound(this.state.panX, [imgRect.left, imgRect.right],\n [this.cutoutRect.left, this.cutoutRect.right], dX);\n let panY = Cropper.checkBound(this.state.panY, [imgRect.top, imgRect.bottom],\n [this.cutoutRect.top, this.cutoutRect.bottom], dY);\n\n this.positionAll(panX, panY, this.state.zoom);\n }\n\n // Image panning.\n mouseMove(e) {\n e.preventDefault();\n this.translate(e.pageX, e.pageY);\n }\n\n mouseTouch(e) {\n e.preventDefault();\n\n if (e.touches.length == 1) {\n this.translate(e.touches[0].pageX, e.touches[0].pageY);\n return;\n }\n\n // Image zooming by pinching.\n const [touch0, touch1] = e.touches;\n const distance = Math.sqrt((touch0.pageX - touch1.pageX) * (touch0.pageX - touch1.pageX) +\n (touch0.pageY - touch1.pageY) * (touch0.pageY - touch1.pageY));\n\n if (!this.prevDistance) {\n this.prevDistance = distance / this.state.zoom;\n }\n\n let scale = (distance / this.prevDistance);\n this.handleZoom(Math.max(this.minZoom, Math.min(this.maxZoom, scale)));\n }\n\n mouseUp(e) {\n window.removeEventListener('mousemove', this.mouseMove);\n window.removeEventListener('touchmove', this.mouseTouch);\n window.removeEventListener('mouseup', this.mouseUp);\n window.removeEventListener('touchend', this.mouseUp);\n // Re-enable text selection.\n document.body.style['userSelect'] = '';\n\n this.positionAll(this.state.panX, this.state.panY, this.state.zoom);\n }\n\n render() {\n // transform3d: position and scale.\n const t3d = `translate3d(${this.state.panX}px, ${this.state.panY}px, 0) scale(${this.state.zoom})`;\n // transformOrigin: zoom origin.\n const orig = `${this.state.originX}px ${this.state.originY}px`;\n\n // Overlay position and size are exactly equal to the position and size of the transformed image\n // except it uses different coordinates.\n const overlay = {\n top: `${this.originY - this.state.originY * this.state.zoom}px`,\n left: `${this.originX - this.state.originX * this.state.zoom}px`,\n width: `${this.imageWidth * this.state.zoom}px`,\n height: `${this.imageHeight * this.state.zoom}px`\n };\n return (\n \n
\n
\n
\n
\n
\n
\n \n
\n
\n );\n }\n}\n","// Edit account parameters.\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport Cropper from './cropper.jsx';\nimport { imageCrop } from '../lib/blob-helpers.js';\n\nexport default class AvatarCrop extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.state = {\n top: 0,\n left: 0,\n width: 0,\n height: 0,\n scale: 1\n };\n\n this.handleSubmit = this.handleSubmit.bind(this);\n this.handleChange = this.handleChange.bind(this);\n }\n\n // Cut out in image coordinates and desired scale factor.\n handleChange(left, top, width, height, scale) {\n this.setState({\n left: left,\n top: top,\n width: width,\n height: height,\n scale: scale\n });\n }\n\n handleSubmit() {\n imageCrop(this.props.mime, this.props.avatar,\n this.state.left, this.state.top, this.state.width, this.state.height,\n this.state.scale)\n .then(img => {\n this.props.onSubmit(img.mime, img.blob, img.width, img.height);\n })\n .catch(err => {\n this.props.onError(err);\n });\n }\n\n render() {\n return (\n \n
\n \n
\n
\n {this.props.onCancel ?\n \n \n \n : null}\n \n \n \n
\n
\n );\n }\n};\n","// Password with a visiblity toggle.\nimport React from 'react';\n\nexport default class VisiblePassword extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.inputRef = React.createRef();\n\n this.state = {\n value: this.props.value,\n visible: false\n };\n\n this.handleVisibility = this.handleVisibility.bind(this);\n this.handeTextChange = this.handeTextChange.bind(this);\n this.handleKeyDown = this.handleKeyDown.bind(this);\n this.handleEditingFinished = this.handleEditingFinished.bind(this);\n }\n\n componentDidMount() {\n if (this.props.autoFocus) {\n this.inputRef.current.focus();\n }\n }\n\n handeTextChange(e) {\n this.setState({value: e.target.value});\n if (this.props.onChange) {\n this.props.onChange(e);\n }\n }\n\n handleVisibility(e) {\n e.preventDefault();\n this.setState({visible: !this.state.visible});\n }\n\n handleKeyDown(e) {\n if (e.keyCode == 27) {\n // Escape pressed\n this.setState({value: this.props.value, visible: false});\n if (this.props.onFinished) {\n this.props.onFinished();\n }\n } else if (e.keyCode == 13) {\n // Enter pressed\n this.handleEditingFinished();\n }\n }\n\n handleEditingFinished(e) {\n if (e) {\n let currentTarget = e.currentTarget;\n setTimeout(_ => {\n if (!currentTarget.contains(document.activeElement)) {\n if (this.props.onFinished) {\n this.props.onFinished(this.state.value);\n }\n }\n }, 0);\n } else if (this.props.onFinished) {\n this.props.onFinished(this.state.value.trim());\n }\n }\n\n render() {\n return (\n \n \n \n \n {this.state.visible ? 'visibility' : 'visibility_off'}\n \n \n
\n );\n }\n}\n","// In-place text editor. Shows text with an icon which toggles it into an input field.\nimport React from 'react';\n\nimport VisiblePassword from './visible-password.jsx';\n\nexport default class InPlaceEdit extends React.Component {\n constructor(props) {\n super(props);\n\n this.selfRef = React.createRef();\n\n this.state = {\n active: props.active,\n initialValue: props.value || '',\n value: props.value || ''\n };\n\n this.handeTextChange = this.handeTextChange.bind(this);\n this.handleKeyDown = this.handleKeyDown.bind(this);\n this.handleStartEditing = this.handleStartEditing.bind(this);\n this.handleEditingFinished = this.handleEditingFinished.bind(this);\n this.handlePasswordFinished = this.handlePasswordFinished.bind(this);\n }\n\n componentDidUpdate(prevProps, prevState) {\n // If text has changed while in read mode, update text and discard changes.\n // Ignore update if in edit mode.\n const newValue = this.props.value || '';\n if (prevState.initialValue != newValue && !prevState.active) {\n this.setState({\n initialValue: newValue,\n value: newValue\n });\n }\n }\n\n handeTextChange(e) {\n this.setState({value: e.target.value || ''});\n }\n\n handleKeyDown(e) {\n if (e.keyCode === 27) {\n // Escape pressed\n this.setState({value: this.props.value, active: false});\n } else if (e.keyCode === 13) {\n // Enter pressed\n this.handleEditingFinished(e);\n }\n }\n\n handleStartEditing() {\n if (!this.props.readOnly) {\n this.setState({active: true}, _ => {\n if (this.selfRef.current) {\n this.selfRef.current.focus();\n }\n });\n }\n }\n\n handleEditingFinished(event) {\n const value = this.state.value.trim();\n if (this.props.required && (!event.target.checkValidity() || !value)) {\n // Empty input\n this.setState({value: this.props.value, active: false});\n return;\n }\n this.setState({active: false});\n if ((value || this.props.value) && (value !== this.props.value)) {\n this.props.onFinished(value);\n }\n }\n\n handlePasswordFinished(value) {\n this.setState({active: false});\n if (value && (value !== this.props.value)) {\n this.props.onFinished(value);\n }\n }\n\n render() {\n if (!this.state.active) {\n let spanText = this.props.type == 'password' ? '••••••••' : this.state.value;\n let spanClass = 'in-place-edit' + (this.props.readOnly ? ' disabled' : '');\n if (!spanText) {\n spanText = this.props.placeholder;\n spanClass += ' placeholder';\n }\n if (!this.props.multiline || this.props.multiline == 1) {\n spanClass += ' short';\n }\n\n return (\n {spanText} \n );\n }\n\n let element;\n const attr = {};\n if (this.props.type == 'password') {\n element = VisiblePassword;\n attr.onFinished = this.handlePasswordFinished;\n } else {\n if (this.props.multiline > 1) {\n element = 'textarea';\n attr.rows = this.props.multiline;\n attr.className = 'inplace-edit';\n } else {\n element = 'input';\n attr.type = this.props.type || 'text';\n }\n attr.value = this.state.value;\n attr.ref = this.selfRef;\n attr.onChange = this.handeTextChange;\n attr.onKeyDown = this.handleKeyDown;\n attr.onBlur = this.handleEditingFinished;\n }\n attr.placeholder = this.props.placeholder;\n attr.required = this.props.required ? 'required' : '';\n attr.autoComplete = this.props.autoComplete;\n attr.autoFocus = true;\n\n return React.createElement(element, attr, null);\n }\n};\n","// TagManager: edit topic or user tags.\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport ChipInput from './chip-input.jsx';\n\nimport { MAX_TAG_COUNT, MAX_TAG_LENGTH, MIN_TAG_LENGTH } from '../config.js';\nimport { arrayEqual } from '../lib/utils.js';\n\nexport default class TagManager extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = {\n tags: this.props.tags || [],\n tagInput: '',\n activated: this.props.activated\n };\n\n this.handleTagInput = this.handleTagInput.bind(this);\n this.handleAddTag = this.handleAddTag.bind(this);\n this.handleRemoveTag = this.handleRemoveTag.bind(this);\n this.handleSubmit = this.handleSubmit.bind(this);\n this.handleCancel = this.handleCancel.bind(this);\n }\n\n static getDerivedStateFromProps(nextProps, prevState) {\n const tags = nextProps.tags || [];\n if (!arrayEqual(tags, prevState.tags) && !prevState.activated) {\n return {tags: tags};\n }\n return null;\n }\n\n handleTagInput(text) {\n this.setState({tagInput: text});\n if (text.length > 0) {\n const last = text[text.length-1];\n if (text[0] == '\"') {\n // This is a quoted string.\n if (text.length > 1 && last == '\"') {\n this.handleAddTag(text.substring(1, text.length-1));\n }\n } else if (last == ',' || last == ' ' || last == ';' || last == '\"') {\n // User entered ',', ' ' or ';'\n this.handleAddTag(text.substring(0, text.length-1).trim());\n }\n }\n }\n\n handleAddTag(tag) {\n const maxTagCount = this.props.tinode.getServerParam('maxTagCount', MAX_TAG_COUNT);\n\n if (tag.length > 0 && this.state.tags.length < maxTagCount) {\n const tags = this.state.tags.slice(0);\n tags.push(tag);\n\n this.setState({tags: tags, tagInput: ''});\n if (this.props.onTagsChanged) {\n this.props.onTagsChanged(tags);\n }\n return tags;\n }\n return this.state.tags;\n }\n\n handleRemoveTag(tag, index) {\n const tags = this.state.tags.slice(0);\n tags.splice(index, 1);\n this.setState({tags: tags});\n if (this.props.onTagsChanged) {\n this.props.onTagsChanged(tags);\n }\n }\n\n handleSubmit() {\n // Add unprocessed input to tags, submit the list.\n this.props.onSubmit(this.handleAddTag(this.state.tagInput.trim()));\n this.setState({activated: false, tags: this.props.tags || []});\n }\n\n handleCancel() {\n this.setState({activated: false, tagInput: '', tags: this.props.tags || []});\n if (this.props.onCancel) {\n this.props.onCancel();\n }\n }\n\n render() {\n const minTagLength = this.props.tinode.getServerParam('minTagLength', MIN_TAG_LENGTH);\n const maxTagLength = this.props.tinode.getServerParam('maxTagLength', MAX_TAG_LENGTH);\n\n let tags = [];\n if (this.state.activated) {\n this.state.tags.map((tag) => {\n tags.push({user: tag, invalid: (tag.length < minTagLength || tag.length > maxTagLength)});\n });\n } else {\n this.state.tags.map((tag) => {\n tags.push({tag} );\n });\n if (tags.length == 0) {\n tags = (\n \n \n \n );\n }\n }\n return (\n \n
\n {this.props.title} \n
\n {this.state.activated ?\n
\n
{\n (add_tags_prompt) => \n } \n {this.props.onSubmit || this.props.onCancel ?\n
\n \n \n \n \n \n \n
\n : null}\n
\n :\n
\n }\n
\n );\n }\n};\n","// Widget for editing topic description.\n\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport { Tinode } from 'tinode-sdk';\n\nimport AvatarCrop from './avatar-crop.jsx';\nimport AvatarUpload from './avatar-upload.jsx';\nimport InPlaceEdit from './in-place-edit.jsx';\nimport TagManager from './tag-manager.jsx';\n\nimport { AVATAR_SIZE, MAX_AVATAR_BYTES, MAX_EXTERN_ATTACHMENT_SIZE, MAX_TITLE_LENGTH,\n MAX_TOPIC_DESCRIPTION_LENGTH } from '../config.js';\nimport { imageScaled, blobToBase64, makeImageUrl } from '../lib/blob-helpers.js';\nimport { arrayEqual, theCard } from '../lib/utils.js';\n\nexport default class TopicDescEdit extends React.Component {\n constructor(props) {\n super(props);\n\n const topic = this.props.tinode.getTopic(this.props.topic);\n const acs = topic.getAccessMode();\n this.state = {\n isMe: Tinode.isMeTopicName(this.props.topic),\n owner: acs && acs.isOwner(),\n fullName: topic.public ? topic.public.fn : undefined,\n private: topic.private ? topic.private.comment : null,\n description: topic.public ? topic.public.note : undefined,\n avatar: makeImageUrl(topic.public ? topic.public.photo : null),\n tags: topic.tags() || [],\n newAvatar: null,\n newAvatarMime: null\n };\n\n this.previousOnTags = null;\n\n this.tnNewTags = this.tnNewTags.bind(this);\n this.handleFullNameUpdate = this.handleFullNameUpdate.bind(this);\n this.handleImageUpdated = this.handleImageUpdated.bind(this);\n this.handleAvatarCropped = this.handleAvatarCropped.bind(this);\n this.handleAvatarCropCancel = this.handleAvatarCropCancel.bind(this);\n this.uploadAvatar = this.uploadAvatar.bind(this);\n this.handlePrivateUpdate = this.handlePrivateUpdate.bind(this);\n this.handleDescriptionUpdate = this.handleDescriptionUpdate.bind(this);\n this.handleTagsUpdated = this.handleTagsUpdated.bind(this);\n }\n\n componentDidMount() {\n const topic = this.props.tinode.getTopic(this.props.topic);\n this.previousOnTags = topic.onTagsUpdated;\n topic.onTagsUpdated = this.tnNewTags;\n }\n\n componentWillUnmount() {\n const topic = this.props.tinode.getTopic(this.props.topic);\n topic.onTagsUpdated = this.previousOnTags;\n }\n\n tnNewTags(tags) {\n this.setState({tags: tags});\n }\n\n handleFullNameUpdate(fn) {\n fn = fn.trim().substring(0, MAX_TITLE_LENGTH);\n if (fn && this.state.fullName !== fn) {\n this.setState({fullName: fn});\n this.props.onUpdateTopicDesc(this.props.topic, theCard(fn, null));\n }\n }\n\n handlePrivateUpdate(comment) {\n comment = comment.trim().substring(0, MAX_TITLE_LENGTH);\n if (this.state.private !== comment) {\n this.setState({private: comment});\n this.props.onUpdateTopicDesc(this.props.topic, null, comment || Tinode.DEL_CHAR);\n }\n }\n\n handleDescriptionUpdate(desc) {\n desc = desc.trim().substring(0, MAX_TOPIC_DESCRIPTION_LENGTH);\n if (desc) {\n this.setState({description: desc});\n this.props.onUpdateTopicDesc(this.props.topic, theCard(null, null, null, desc));\n }\n }\n\n // AvatarUpload widget has changed the avatar: received a new file or deleted the avatar.\n handleImageUpdated(mime, img) {\n // This will show the AvatarCropView is img is not null.\n this.setState({newAvatar: img, newAvatarMime: mime});\n if (!img) {\n // Deleting the avatar.\n this.setState({avatar: null});\n this.props.onUpdateTopicDesc(this.props.topic, theCard(null, Tinode.DEL_CHAR));\n }\n }\n\n // AvatarCropView calls this method when the user has cropped the image.\n handleAvatarCropped(mime, blob, width, height) {\n const url = blob ? URL.createObjectURL(blob) : null;\n this.setState({avatar: url, newAvatar: null, newAvatarMime: null});\n if (blob) {\n this.uploadAvatar(mime, blob, width, height);\n }\n }\n\n // Utility method for converting cropped avatar blob to bytes for sending inband or\n // for uploading it to the server out of band.\n uploadAvatar(mime, blob, width, height) {\n const readyToUpload = image => {\n let {mime, blob} = image;\n if (blob.size > MAX_AVATAR_BYTES) {\n // Too large to send inband - uploading out of band and sending as a link.\n const uploader = this.props.tinode.getLargeFileHelper();\n uploader.upload(blob)\n .then(url => this.props.onUpdateTopicDesc(this.props.topic, theCard(null, url)))\n .catch(err => this.props.onError(err.message, 'err'));\n } else {\n // Convert blob to base64-encoded bits.\n blobToBase64(blob)\n .then(b64 => {\n const du = makeImageUrl({data: b64.bits, type: mime});\n this.setState({source: du});\n this.props.onUpdateTopicDesc(this.props.topic, theCard(null, du));\n });\n }\n };\n\n if (width > AVATAR_SIZE || height > AVATAR_SIZE || width != height) {\n // Avatar is not square or too large even after cropping. Shrink it and make square.\n imageScaled(blob, AVATAR_SIZE, AVATAR_SIZE, MAX_EXTERN_ATTACHMENT_SIZE, true)\n .then(scaled => readyToUpload(scaled))\n .catch(err => this.props.onError(err.message, 'err'));\n } else {\n readyToUpload({mime: mime, blob: blob, width: width, height: height});\n }\n }\n\n handleAvatarCropCancel() {\n this.setState({newAvatar: null, newAvatarMime: null});\n }\n\n handleTagsUpdated(tags) {\n // Check if tags have actually changed.\n if (arrayEqual(this.state.tags.slice(0), tags.slice(0))) {\n return;\n }\n this.props.onUpdateTags(tags);\n }\n\n render() {\n if (this.state.newAvatar) {\n return (\n \n );\n }\n\n const editable = this.state.isMe || this.state.owner;\n\n return (\n <>\n \n
\n \n \n {this.state.isMe ?\n
\n
\n \n \n
\n {\n (full_name_placeholder) => \n } \n
\n
\n :\n <>\n
\n
\n \n
\n
\n {\n (group_name_placeholder) => \n } \n
\n
\n
\n
\n \n \n \n
\n
\n {\n (private_placeholder) => \n } \n
\n
\n >\n }\n {editable || this.state.description ?\n
\n
\n \n
\n
\n {\n (private_placeholder) => \n } \n
\n
\n : null\n }\n
\n {editable ?\n <>\n
\n {\n (title_tag_manager) => \n } \n >\n : null\n }\n >\n );\n }\n};\n","// View for editing topic parameters (including 'me' topic).\n\nimport React from 'react';\n\nimport TopicDescEdit from '../widgets/topic-desc-edit.jsx';\n\nimport { arrayEqual } from '../lib/utils.js';\n\nexport default class TopicCommonView extends React.Component {\n constructor(props) {\n super(props);\n\n const topic = this.props.tinode.getTopic(this.props.topic);\n const acs = topic.getAccessMode();\n this.state = {\n tags: []\n };\n\n this.previousTagsUpdated = undefined;\n\n this.onTagsUpdated = this.onTagsUpdated.bind(this);\n this.handleTagsUpdated = this.handleTagsUpdated.bind(this);\n }\n\n // No need to separately handle component mount.\n componentDidUpdate(props) {\n const topic = this.props.tinode.getTopic(props.topic);\n if (!topic) {\n return;\n }\n\n if (topic.onTagsUpdated != this.onTagsUpdated) {\n if (topic.getType() == 'grp') {\n this.previousTagsUpdated = topic.onTagsUpdated;\n topic.onTagsUpdated = this.onTagsUpdated;\n } else {\n this.previousTagsUpdated = undefined;\n }\n }\n\n if (this.state.topic != props.topic) {\n this.setState({topic: props.topic});\n }\n }\n\n componentWillUnmount() {\n const topic = this.props.tinode.getTopic(this.props.topic);\n topic.onTagsUpdated = this.previousTagsUpdated;\n }\n\n // Server informs that the tags have been updated.\n onTagsUpdated(tags) {\n this.setState({tags: tags});\n\n if (this.previousTagsUpdated && this.previousTagsUpdated != this.onTagsUpdated) {\n this.previousTagsUpdated(tags);\n }\n }\n\n // Request server to change tags.\n handleTagsUpdated(tags) {\n if (!arrayEqual(this.state.tags.slice(0), tags.slice(0))) {\n this.props.onUpdateTagsRequest(this.props.topic, tags);\n }\n }\n\n render() {\n return (\n \n \n
\n );\n }\n};\n","// Edit account parameters.\nimport React from 'react';\nimport { FormattedMessage, defineMessages, injectIntl } from 'react-intl';\n\nconst messages = defineMessages({\n clear_messages: {\n id: 'action_clear_messages',\n defaultMessage: 'Clear Messages',\n description: 'Flat button [Clear Messages] (soft-delete messages)'\n },\n clear_messages_warning: {\n id: 'clear_messages_warning',\n defaultMessage: 'Are you sure you want to clear all messages? It cannot be undone.',\n description: 'Alert dialog warning when deleting all messages.'\n },\n delete_messages: {\n id: 'action_delete_messages',\n defaultMessage: 'Clear Messages for All',\n description: 'Flat button [Clear for All] (hard-delete all messages)'\n },\n delete_messages_warning: {\n id: 'delete_messages_warning',\n defaultMessage: 'Are you sure you want to delete all messages for everyone? It cannot be undone.',\n description: 'Alert dialog warning when hard-deleting all messages.'\n },\n topic_delete: {\n id: 'topic_delete',\n defaultMessage: 'Delete Conversation',\n description: 'Alert title when deleting the topic.'\n },\n topic_delete_warning: {\n id: 'topic_delete_warning',\n defaultMessage: 'Are you sure you want to delete this conversation? It cannot be undone.',\n description: 'Alert warning when deleting entire topic'\n },\n leave_chat: {\n id: 'action_leave_chat',\n defaultMessage: 'Leave Conversation',\n description: 'Flat button [Leave Conversation]'\n },\n leave_chat_warning: {\n id: 'leave_chat_warning',\n defaultMessage: 'Are you sure you want to leave this conversation?',\n description: 'Alert dialog warning when unsubscribing from a chat.'\n },\n block_contact: {\n id: 'action_block_contact',\n defaultMessage: \"Block Contact\",\n description: \"Flat button [Block Contact]\"\n },\n block_contact_warning: {\n id: 'block_contact_warning',\n defaultMessage: 'Are you sure you want to block this contact?',\n description: 'Alert dialog warning when blocking a contact.'\n },\n report_chat: {\n id: 'action_report_chat',\n defaultMessage: 'Report Conversation',\n description: 'Flat button [Report Group]'\n },\n report_chat_warning: {\n id: 'report_chat_warning',\n defaultMessage: 'Are you sure you want to block and report this conversation?',\n description: 'Alert dialog warning when reporting a conversation for abuse'\n },\n other_user: {\n id: 'label_other_user',\n defaultMessage: 'Other',\n description: 'Label for the other user when the user is unnamed'\n },\n});\n\nclass TopicSecurity extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.handleDeleteTopic = this.handleDeleteTopic.bind(this);\n this.handleDeleteMessages = this.handleDeleteMessages.bind(this);\n this.handleLeave = this.handleLeave.bind(this);\n this.handleBlock = this.handleBlock.bind(this);\n this.handleReport = this.handleReport.bind(this);\n }\n\n handleDeleteTopic(e) {\n e.preventDefault();\n const {formatMessage} = this.props.intl;\n this.props.onShowAlert(\n formatMessage(messages.topic_delete), // title\n formatMessage(messages.topic_delete_warning), // content\n _ => this.props.onDeleteTopic(this.props.topic), // onConfirm\n null, // \"OK\"\n true, // Show Reject button\n null // \"Cancel\"\n );\n }\n\n handleDeleteMessages(e) {\n e.preventDefault();\n const {formatMessage} = this.props.intl;\n this.props.onShowAlert(\n formatMessage(this.props.deleter ? messages.delete_messages : messages.clear_messages), // title\n formatMessage(this.props.deleter ? messages.delete_messages_warning : messages.clear_messages_warning), // content\n _ => this.props.onDeleteMessages(this.props.topic), // onConfirm\n null, // \"OK\"\n true, // Show Reject button\n null // \"Cancel\"\n );\n }\n\n handleLeave(e) {\n e.preventDefault();\n const {formatMessage} = this.props.intl;\n this.props.onShowAlert(\n formatMessage(messages.leave_chat), // title\n formatMessage(messages.leave_chat_warning), // content\n _ => this.props.onLeaveTopic(this.props.topic), // onConfirm\n null, // \"OK\"\n true, // Show Reject button\n null // \"Cancel\"\n );\n }\n\n handleBlock(e) {\n e.preventDefault();\n const {formatMessage} = this.props.intl;\n this.props.onShowAlert(\n formatMessage(messages.block_contact), // title\n formatMessage(messages.block_contact_warning), // content\n _ => this.props.onBlockTopic(this.props.topic), // onConfirm\n null, // \"OK\"\n true, // Show Reject button\n null // \"Cancel\"\n );\n }\n\n handleReport(e) {\n e.preventDefault();\n const {formatMessage} = this.props.intl;\n this.props.onShowAlert(\n formatMessage(messages.report_chat), // title\n formatMessage(messages.report_chat_warning), // content\n (_ => { this.props.onReportTopic(this.props.topic); }), // onConfirm\n null, // \"OK\"\n true, // Show Reject button\n null // \"Cancel\"\n );\n }\n\n render() {\n const {formatMessage} = this.props.intl;\n return (\n \n
\n
\n
\n {this.props.groupTopic ?\n <>\n
\n \n \n {e.preventDefault(); this.props.onLaunchPermissionsEditor('want')}}>\n {this.props.access}\n \n
\n {!this.props.channel ?\n
\n
\n \n \n \n
\n
\n
Auth: {\n e.preventDefault();\n if (this.props.owner) {\n this.props.onLaunchPermissionsEditor('auth');\n }\n }}>{this.props.auth} \n
\n
Anon: {\n e.preventDefault();\n if (this.props.owner) {\n this.props.onLaunchPermissionsEditor('anon');\n }\n }}>{this.props.anon} \n
\n
\n
\n :\n null\n }\n >\n :\n
\n
\n \n \n \n
\n
\n
\n {e.preventDefault(); this.props.onLaunchPermissionsEditor('want')}}>\n {this.props.access}\n \n
\n
{this.props.fullName ? this.props.fullName : formatMessage(messages.other_user)}:\n {e.preventDefault(); this.props.onLaunchPermissionsEditor('given')}}>\n {this.props.modeGiven2}\n \n
\n
\n
\n }\n
\n
\n );\n }\n};\n\nexport default injectIntl(TopicSecurity);\n","// InfoView: panel with topic/user info.\nimport React from 'react';\nimport { FormattedMessage, defineMessages, injectIntl } from 'react-intl';\n\nimport { AccessMode, Tinode } from 'tinode-sdk';\n\nimport AvatarUpload from '../widgets/avatar-upload.jsx';\nimport BadgeList from '../widgets/badge-list.jsx';\nimport CheckBox from '../widgets/checkbox.jsx';\nimport ContactList from '../widgets/contact-list.jsx';\nimport ErrorPanel from '../widgets/error-panel.jsx';\nimport GroupManager from '../widgets/group-manager.jsx';\nimport MenuCancel from '../widgets/menu-cancel.jsx';\nimport PermissionsEditor from '../widgets/permissions-editor.jsx';\nimport TopicCommonView from './topic-common-view.jsx';\nimport TopicSecurity from '../widgets/topic-security.jsx';\n\nimport { MAX_TITLE_LENGTH, MAX_TOPIC_DESCRIPTION_LENGTH, NO_ACCESS_MODE } from '../config.js';\n\nimport { makeImageUrl } from '../lib/blob-helpers.js';\nimport { theCard, clipStr } from '../lib/utils.js';\n\nconst messages = defineMessages({\n info: {\n id: 'panel_title_info',\n description: 'Title for InfoView',\n defaultMessage: 'Info'\n },\n general: {\n id: 'panel_title_general',\n description: 'Title for TopicCommon.',\n defaultMessage: 'General'\n },\n security: {\n id: 'panel_title_security',\n description: 'Title for TopicSecirity and AccSecurity.',\n defaultMessage: 'Security'\n },\n members: {\n id: 'panel_title_members',\n description: 'Title for managing group members view.',\n defaultMessage: 'Members'\n },\n crop: {\n id: 'panel_title_crop',\n description: 'Title for AvatarCropView.',\n defaultMessage: 'Drag to Adjust'\n },\n perm_want: {\n id: 'requested_permissions',\n defaultMessage: 'Requested',\n description: 'Title for permissions'\n },\n perm_given: {\n id: 'granted_permissions',\n defaultMessage: 'Granted',\n description: 'Title for permissions'\n },\n perm_auth: {\n id: 'permissions_authenticated',\n defaultMessage: 'Authenticated',\n description: 'Title for editing default authenticated permissions'\n },\n perm_anon: {\n id: 'permissions_anonymous',\n defaultMessage: 'Anonymous',\n description: 'Title for editing default anonymous permissions'\n },\n perm_user: {\n id: 'permissions_user',\n defaultMessage: 'User\\'s Permissions',\n description: 'Title for editing user\\'s permissions'\n },\n edit_permissions: {\n id: 'menu_item_edit_permissions',\n defaultMessage: 'Edit permissions',\n description: 'Menu item [Edit permissions]'\n },\n});\n\nclass InfoView extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = {\n topic: null,\n owner: false,\n admin: false,\n sharer: false,\n deleter: false,\n muted: false,\n address: null,\n groupTopic: undefined,\n channel: undefined,\n fullName: undefined,\n description: undefined,\n avatar: null,\n private: null,\n selectedContact: null,\n access: null,\n modeGiven: null,\n modeWant: null,\n modeGiven2: null, // P2P topic, the other user mode given\n modeWant2: null, // P2P topic, the other user mode want\n auth: null,\n anon: null,\n contactList: [],\n trustedBadges: [],\n previousMetaDesc: undefined,\n previousSubsUpdated: undefined,\n };\n\n this.resetSubs = this.resetSubs.bind(this);\n this.resetDesc = this.resetDesc.bind(this);\n this.resetTags = this.resetTags.bind(this);\n this.onMetaDesc = this.onMetaDesc.bind(this);\n this.onSubsUpdated = this.onSubsUpdated.bind(this);\n this.handleImageChanged = this.handleImageChanged.bind(this);\n this.handleMuted = this.handleMuted.bind(this);\n this.handleUnarchive = this.handleUnarchive.bind(this);\n this.handlePermissionsChanged = this.handlePermissionsChanged.bind(this);\n this.handleLaunchPermissionsEditor = this.handleLaunchPermissionsEditor.bind(this);\n this.handleShowAddMembers = this.handleShowAddMembers.bind(this);\n this.handleMemberUpdateRequest = this.handleMemberUpdateRequest.bind(this);\n this.handleMemberSelected = this.handleMemberSelected.bind(this);\n this.handleContextMenu = this.handleContextMenu.bind(this);\n this.handleBackNavigate = this.handleBackNavigate.bind(this);\n }\n\n // No need to separately handle component mount.\n componentDidUpdate(props) {\n const topic = this.props.tinode.getTopic(props.topic);\n if (!topic) {\n return;\n }\n\n if (this.onMetaDesc != topic.onMetaDesc) {\n this.previousMetaDesc = topic.onMetaDesc;\n topic.onMetaDesc = this.onMetaDesc;\n\n this.previousSubsUpdated = topic.onSubsUpdated;\n topic.onSubsUpdated = this.onSubsUpdated;\n }\n\n if (this.state.topic != props.topic) {\n this.setState({topic: props.topic});\n this.resetDesc(topic, props);\n this.resetSubs(topic, props);\n this.resetTags(topic);\n }\n }\n\n componentWillUnmount() {\n const topic = this.props.tinode.getTopic(this.props.topic);\n if (!topic) {\n return;\n }\n this.setState({topic: null});\n topic.onMetaDesc = this.previousMetaDesc;\n topic.onSubsUpdated = this.previousSubsUpdated;\n }\n\n resetSubs(topic, props) {\n const newState = {contactList: []};\n if (topic.getType() == 'p2p') {\n // Fetch the other party in the p2p conversation.\n // Topic may not be ready yet, so check if user is found.\n const user2 = topic.subscriber(props.topic);\n if (user2) {\n newState.modeGiven2 = user2.acs.getGiven();\n newState.modeWant2 = user2.acs.getWant();\n } else {\n newState.modeGiven2 = NO_ACCESS_MODE;\n newState.modeWant2 = NO_ACCESS_MODE;\n }\n } else {\n topic.subscribers((sub) => {\n newState.contactList.push(sub);\n }, this);\n }\n\n this.setState(newState);\n }\n\n resetDesc(topic, props) {\n const defacs = topic.getDefaultAccess() || {};\n const acs = topic.getAccessMode();\n\n const badges = [];\n if (topic.trusted) {\n for (const [key, val] of Object.entries(topic.trusted)) {\n if (val) {\n badges.push(key);\n }\n }\n }\n\n this.setState({\n owner: acs && acs.isOwner(),\n admin: acs && acs.isAdmin(),\n sharer: acs && acs.isSharer(),\n deleter: acs && acs.isDeleter(),\n muted: acs && acs.isMuted(),\n\n fullName: clipStr(topic.public && topic.public.fn, MAX_TITLE_LENGTH),\n description: clipStr(topic.public && topic.public.note, MAX_TOPIC_DESCRIPTION_LENGTH),\n avatar: makeImageUrl(topic.public ? topic.public.photo : null),\n trustedBadges: badges,\n private: clipStr(topic.private && topic.private.comment, MAX_TITLE_LENGTH),\n archived: topic.isArchived(),\n address: topic.name,\n groupTopic: topic.isGroupType(),\n channel: topic.isChannelType() || topic.chan,\n access: acs ? acs.getMode() : undefined,\n modeGiven: acs ? acs.getGiven() : undefined,\n modeWant: acs ? acs.getWant() : undefined,\n auth: defacs.auth,\n anon: defacs.anon\n });\n }\n\n resetTags(topic) {\n if (topic.getType() != 'grp') {\n return;\n }\n\n const acs = topic.getAccessMode();\n if (acs && acs.isOwner()) {\n // Requesting tags: owner is editing the topic.\n topic.getMeta(topic.startMetaQuery().withTags().build());\n }\n }\n\n onMetaDesc(desc) {\n const topic = this.props.tinode.getTopic(this.props.topic);\n if (!topic) {\n return;\n }\n this.resetDesc(topic, this.props);\n\n if (this.previousMetaDesc && this.previousMetaDesc != this.onMetaDesc) {\n this.previousMetaDesc(desc);\n }\n }\n\n onSubsUpdated(subs) {\n const topic = this.props.tinode.getTopic(this.props.topic);\n if (!topic) {\n return;\n }\n this.resetSubs(topic, this.props);\n\n if (this.previousSubsUpdated && this.previousSubsUpdated != this.onSubsUpdated) {\n this.previousSubsUpdated(subs);\n }\n }\n\n handleImageChanged(mime, img) {\n this.setState({avatar: img});\n this.props.onTopicDescUpdate(this.props.topic, theCard(null, img || Tinode.DEL_CHAR), null);\n }\n\n handleMuted(ignored, checked) {\n this.setState({muted: checked});\n this.props.onChangePermissions(this.props.topic, checked ? '-P' : '+P');\n }\n\n handleUnarchive(ignored, ignored2) {\n this.props.onTopicUnArchive(this.props.topic);\n }\n\n handlePermissionsChanged(which, perm) {\n switch (which) {\n case 'auth':\n this.props.onTopicDescUpdateRequest(this.props.topic, null, null, {auth: perm});\n break;\n case 'anon':\n this.props.onTopicDescUpdateRequest(this.props.topic, null, null, {anon: perm});\n break;\n case 'mode':\n case 'want':\n this.props.onChangePermissions(this.props.topic, perm);\n break;\n case 'given':\n this.props.onChangePermissions(this.props.topic, perm, this.props.topic);\n break;\n case 'user':\n this.props.onChangePermissions(this.props.topic, perm, this.state.userPermissionsEdited);\n break;\n }\n\n this.handleBackNavigate();\n }\n\n handleLaunchPermissionsEditor(which, uid) {\n const {formatMessage} = this.props.intl;\n let toEdit, toCompare, toSkip, titleEdit, titleCompare, userTitle, userAvatar;\n switch (which) {\n case 'mode':\n toEdit = this.state.access;\n break;\n case 'want':\n toEdit = this.state.modeWant;\n toCompare = this.state.modeGiven;\n if (this.state.owner) {\n // Don't allow owner to unset 'O' permission. All other permissions are OK.\n toSkip = 'O';\n } else {\n // Allow accepting any of 'ASDO' permissions but don't allow asking for them.\n toSkip = AccessMode.encode(AccessMode.diff('ASDO', this.state.modeGiven));\n if (this.state.channel) {\n // Channels are read-only.\n toSkip += 'W';\n }\n }\n titleEdit = formatMessage(messages.perm_want);\n titleCompare = formatMessage(messages.perm_given);\n break;\n case 'given':\n toEdit = this.state.modeGiven2;\n toCompare = this.state.modeWant2;\n toSkip = this.state.groupTopic ? (this.state.owner ? '' : 'O') : 'ASDO';\n titleEdit = formatMessage(messages.perm_given);\n titleCompare = formatMessage(messages.perm_want);\n break;\n case 'auth':\n toEdit = this.state.auth;\n toSkip = 'O';\n break;\n case 'anon':\n toEdit = this.state.anon;\n toSkip = 'O';\n break;\n case 'user': {\n const topic = this.props.tinode.getTopic(this.props.topic);\n if (!topic) {\n return;\n }\n const user = topic.subscriber(uid);\n if (!user || !user.acs) {\n return;\n }\n toEdit = user.acs.getGiven();\n toCompare = user.acs.getWant();\n toSkip = this.state.owner ? '' : 'O';\n titleEdit = formatMessage(messages.perm_given);\n titleCompare = formatMessage(messages.perm_want);\n if (user.public) {\n userTitle = user.public.fn;\n userAvatar = user.public.photo;\n }\n break;\n }\n default:\n console.error(\"Unknown permission editing mode '\" + which + \"'\");\n return;\n }\n this.setState({\n userPermissionsEdited: uid,\n userPermissionsTitle: userTitle,\n userPermissionsAvatar: userAvatar,\n editedPermissions: toEdit,\n immutablePermissions: toCompare,\n editedPermissionsTitle: titleEdit,\n immutablePermissionsTitle: titleCompare,\n editedPermissionsSkipped: toSkip,\n });\n this.props.onNavigate(`perm/${which}`);\n }\n\n handleShowAddMembers(e) {\n e.preventDefault();\n this.props.onInitFind();\n this.props.onNavigate('members');\n }\n\n handleMemberUpdateRequest(members, added, removed) {\n this.props.onMemberUpdateRequest(this.props.topic, added, removed);\n this.props.onNavigate('info');\n }\n\n handleMemberSelected(uid) {\n this.setState({selectedContact: uid});\n }\n\n handleBackNavigate() {\n const args = (this.props.panel || 'info').split('/');\n if (args[0] == 'info') {\n this.props.onNavigate(null);\n } else if (args[0] == 'perm') {\n if (args[1] == 'user') {\n this.props.onNavigate('info');\n } else {\n this.props.onNavigate('security');\n }\n } else {\n this.props.onNavigate('info');\n }\n }\n\n handleContextMenu(params) {\n const {formatMessage} = this.props.intl;\n const topic = this.props.tinode.getTopic(this.props.topic);\n if (!topic) {\n return;\n }\n const user = topic.subscriber(params.topicName);\n if (!user || !user.acs) {\n return;\n }\n\n const isMe = this.props.tinode.isMe(params.topicName);\n const menuItems = [{\n title: formatMessage(messages.edit_permissions),\n handler: _ => this.handleLaunchPermissionsEditor(isMe ? 'want' : 'user', params.topicName)\n }];\n if (!isMe) {\n menuItems.push('member_delete');\n }\n menuItems.push(user.acs.isMuted() ? 'member_unmute' : 'member_mute');\n if (!isMe) {\n menuItems.push(user.acs.isJoiner() ? 'member_block' : 'member_unblock');\n }\n this.props.showContextMenu({\n topicName: this.props.topic,\n x: params.x,\n y: params.y,\n user: params.topicName}, menuItems);\n }\n\n render() {\n const args = (this.props.panel || 'info').split('/');\n const view = args[0];\n args.shift();\n\n const {formatMessage} = this.props.intl;\n const panelTitle = formatMessage((view == 'perm' ? messages['perm_' + args[0]] : messages[view])\n || messages['info']);\n\n return (\n \n
\n
{panelTitle}
\n
\n \n
\n
\n {this.props.displayMobile ?\n
: null}\n {view == 'members' ?\n
\n :\n view == 'perm' && args.length > 0 ?\n
this.handlePermissionsChanged(args[0], mode)}\n onCancel={this.handleBackNavigate} />\n :\n view == 'general' ?\n \n :\n view == 'security' ?\n \n :\n \n
\n
\n
\n \n \n \n \n
\n {this.state.archived ?\n
\n \n \n \n \n
\n :\n null\n }\n
\n
\n {this.state.groupTopic && this.state.sharer ?\n <>\n
\n
\n \n \n \n
\n
\n
{\n (no_members) => \n } \n >\n :\n null\n }\n
\n }\n \n );\n }\n};\n\nexport default injectIntl(InfoView);\n","// CallPanel displays call in progress: local and remote viewports and controls.\nimport React from 'react';\nimport { FormattedMessage, defineMessages, injectIntl } from 'react-intl';\n\nimport LetterTile from './letter-tile.jsx';\n\nimport { MAX_PEER_TITLE_LENGTH } from '../config.js';\nimport { CALL_STATE_OUTGOING_INITATED, CALL_STATE_IN_PROGRESS } from '../constants.js';\n\nimport { clipStr } from '../lib/utils.js'\n\nconst RING_SOUND = new Audio('audio/call-out.m4a');\nRING_SOUND.loop = true;\nconst CALL_ENDED_SOUND = new Audio('audio/call-end.m4a');\nCALL_ENDED_SOUND.loop = true;\nconst DIALING_SOUND = new Audio('audio/dialing.m4a');\n\nconst VIDEO_MUTED_EVENT = 'video:muted';\nconst VIDEO_UNMUTED_EVENT = 'video:unmuted';\n\nconst messages = defineMessages({\n already_in_call: {\n id: 'already_in_call',\n defaultMessage: 'You already in an ongoing call!',\n description: 'Error message when the user tried to accept a new call without finishing pervious one',\n }\n});\n\nclass CallPanel extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.state = {\n localStream: undefined,\n remoteStream: undefined,\n pc: undefined,\n dataChannel: undefined,\n\n previousOnInfo: undefined,\n waitingForPeer: false,\n // If true, the client has received a remote SDP from the peer and has sent a local SDP to the peer.\n callInitialSetupComplete: false,\n audioOnly: props.callAudioOnly,\n // Video mute/unmute in progress.\n videoToggleInProgress: false,\n // Indicates if the remote peer has informed us that their camera is on.\n remoteVideoLive: false,\n };\n\n this.localStreamConstraints = {\n audio: true,\n video: !props.callAudioOnly\n };\n this.isOutgoingCall = props.callState == CALL_STATE_OUTGOING_INITATED;\n\n this.localRef = React.createRef();\n this.remoteRef = React.createRef();\n // Cache for remote ice candidates until initial setup gets completed.\n this.remoteIceCandidatesCache = [];\n\n this.onInfo = this.onInfo.bind(this);\n this.start = this.start.bind(this);\n this.stop = this.stop.bind(this);\n\n this.createPeerConnection = this.createPeerConnection.bind(this);\n this.canSendOffer = this.canSendOffer.bind(this);\n this.drainRemoteIceCandidatesCache = this.drainRemoteIceCandidatesCache.bind(this);\n\n this.handleNegotiationNeededEvent = this.handleNegotiationNeededEvent.bind(this);\n this.handleICECandidateEvent = this.handleICECandidateEvent.bind(this);\n this.handleNewICECandidateMsg = this.handleNewICECandidateMsg.bind(this);\n this.handleICEConnectionStateChangeEvent = this.handleICEConnectionStateChangeEvent.bind(this);\n this.handleSignalingStateChangeEvent = this.handleSignalingStateChangeEvent.bind(this);\n this.handleICEGatheringStateChangeEvent = this.handleICEGatheringStateChangeEvent.bind(this);\n this.handleIceCandidateErrorEvent = this.handleIceCandidateErrorEvent.bind(this);\n this.handleTrackEvent = this.handleTrackEvent.bind(this);\n\n this.handleVideoOfferMsg = this.handleVideoOfferMsg.bind(this);\n this.handleVideoAnswerMsg = this.handleVideoAnswerMsg.bind(this);\n this.handleNewICECandidateMsg = this.handleNewICECandidateMsg.bind(this);\n\n this.reportError = this.reportError.bind(this);\n this.handleGetUserMediaError = this.handleGetUserMediaError.bind(this);\n\n this.stopTracks = this.stopTracks.bind(this);\n this.disconnectMedia = this.disconnectMedia.bind(this);\n\n this.handleCloseClick = this.handleCloseClick.bind(this);\n this.handleToggleCameraClick = this.handleToggleCameraClick.bind(this);\n this.handleToggleMicClick = this.handleToggleMicClick.bind(this);\n\n this.handleRemoteHangup = this.handleRemoteHangup.bind(this);\n this.handleVideoCallAccepted = this.handleVideoCallAccepted.bind(this);\n\n this.muteVideo = this.muteVideo.bind(this);\n this.unmuteVideo = this.unmuteVideo.bind(this);\n this.emptyVideoTrack = this.emptyVideoTrack.bind(this);\n\n this.handleDataChannelEvent = this.handleDataChannelEvent.bind(this);\n this.handleDataChannelError = this.handleDataChannelError.bind(this);\n this.handleDataChannelMessage = this.handleDataChannelMessage.bind(this);\n this.handleDataChannelOpen = this.handleDataChannelOpen.bind(this);\n this.handleDataChannelClose = this.handleDataChannelClose.bind(this);\n }\n\n componentDidMount() {\n const topic = this.props.tinode.getTopic(this.props.topic);\n this.previousOnInfo = topic.onInfo;\n topic.onInfo = this.onInfo;\n if ((this.props.callState == CALL_STATE_OUTGOING_INITATED ||\n this.props.callState == CALL_STATE_IN_PROGRESS) && this.localRef.current) {\n this.start();\n }\n }\n\n componentWillUnmount() {\n const topic = this.props.tinode.getTopic(this.props.topic);\n topic.onInfo = this.previousOnInfo;\n this.stop();\n }\n\n handleVideoCallAccepted(info) {\n RING_SOUND.pause();\n const pc = this.createPeerConnection();\n const stream = this.state.localStream;\n stream.getTracks().forEach(track => {\n pc.addTrack(track, stream);\n\n if (track.kind == 'video' && this.state.audioOnly) {\n // This is an audio-only call.\n // Remove dummy video track (placeholder remains).\n track.enabled = false;\n track.stop();\n stream.removeTrack(track);\n }\n });\n }\n\n onInfo(info) {\n if (info.what != 'call') {\n return;\n }\n switch (info.event) {\n case 'accept':\n this.handleVideoCallAccepted(info);\n break;\n case 'answer':\n this.handleVideoAnswerMsg(info);\n break;\n case 'ice-candidate':\n this.handleNewICECandidateMsg(info);\n break;\n case 'hang-up':\n this.handleRemoteHangup(info);\n break;\n case 'offer':\n this.handleVideoOfferMsg(info);\n break;\n case 'ringing':\n // play() throws if the user did not click the app first: https://goo.gl/xX8pDD.\n RING_SOUND.play().catch(_ => {});\n break;\n default:\n console.warn(\"Unknown call event\", info.event);\n break;\n }\n }\n\n // Creates an empty video track placeholder.\n emptyVideoTrack() {\n const width = 640;\n const height = 480;\n const canvas = Object.assign(document.createElement(\"canvas\"), {width, height});\n canvas.getContext('2d').fillRect(0, 0, width, height);\n const stream = canvas.captureStream(0);\n return Object.assign(stream.getVideoTracks()[0], {enabled: false});\n }\n\n start() {\n if (this.state.localStream) {\n this.props.onError(this.props.intl.formatMessage(messages.already_in_call), 'info');\n return;\n }\n\n if (this.props.callState == CALL_STATE_IN_PROGRESS) {\n // We apparently just accepted the call.\n this.props.onInvite(this.props.topic, this.props.seq, CALL_STATE_IN_PROGRESS, this.props.callAudioOnly);\n return;\n }\n\n // This is an outgoing call waiting for the other side to pick up.\n // Start local video.\n navigator.mediaDevices.getUserMedia(this.localStreamConstraints)\n .then(stream => {\n if (!this.localStreamConstraints.video) {\n // Starting an audio-only call. Create a dummy video track\n // (so video can be enabled during the call if the user desires).\n stream.addTrack(this.emptyVideoTrack());\n }\n this.setState({localStream: stream, waitingForPeer: true});\n this.localRef.current.srcObject = stream;\n\n DIALING_SOUND.play();\n\n // Send call invitation.\n this.props.onInvite(this.props.topic, this.props.seq, this.props.callState, this.props.callAudioOnly);\n })\n .catch(this.handleGetUserMediaError);\n }\n\n stop() {\n CALL_ENDED_SOUND.pause();\n CALL_ENDED_SOUND.currentTime = 0;\n RING_SOUND.pause();\n RING_SOUND.currentTime = 0;\n\n this.stopTracks(this.state.localStream);\n this.stopTracks(this.state.remoteStream);\n this.disconnectMedia(this.localRef.current);\n this.disconnectMedia(this.remoteRef.current);\n if (this.state.pc) {\n this.state.pc.ontrack = null;\n this.state.pc.onremovetrack = null;\n this.state.pc.onremovestream = null;\n this.state.pc.onicecandidate = null;\n this.state.pc.oniceconnectionstatechange = null;\n this.state.pc.onsignalingstatechange = null;\n this.state.pc.onicegatheringstatechange = null;\n this.state.pc.onnegotiationneeded = null;\n this.state.pc.onicecandidateerror = null;\n this.state.pc.ondatachannel = null;\n\n if (this.state.dataChannel) {\n this.state.dataChannel.close();\n }\n this.state.pc.close();\n }\n this.setState({pc: null, waitingForPeer: false});\n }\n\n disconnectMedia(el) {\n if (!el) {\n return;\n }\n\n el.srcObject = null;\n el.src = '';\n }\n\n stopTracks(stream) {\n if (!stream) {\n return;\n }\n\n let tracks = stream.getTracks();\n if (tracks) {\n tracks.forEach(track => {\n track.stop();\n track.enabled = false;\n });\n }\n }\n\n handleDataChannelError(error) {\n console.error('data channel error', error);\n }\n\n handleDataChannelMessage(event) {\n switch (event.data) {\n case VIDEO_MUTED_EVENT:\n this.setState({remoteVideoLive: false}, _ => { this.remoteRef.current.srcObject = this.state.remoteStream; });\n break;\n case VIDEO_UNMUTED_EVENT:\n this.setState({remoteVideoLive: true}, _ => { this.remoteRef.current.srcObject = this.state.remoteStream; });\n break;\n default:\n break;\n }\n }\n\n handleDataChannelOpen(event) {\n if (!this.state.audioOnly) {\n event.target.send(VIDEO_UNMUTED_EVENT);\n }\n }\n\n handleDataChannelClose() {\n /* no action */\n }\n\n handleDataChannelEvent(event) {\n const channel = event.channel;\n channel.onerror = this.handleDataChannelError;\n channel.onmessage = this.handleDataChannelMessage;\n channel.onopen = this.handleDataChannelOpen;\n channel.onclose = this.handleDataChannelClose;\n this.setState({dataChannel: channel});\n }\n\n createPeerConnection() {\n const iceServers = this.props.tinode.getServerParam('iceServers', null);\n const pc = iceServers ? new RTCPeerConnection({iceServers: iceServers}) : new RTCPeerConnection();\n\n pc.onicecandidate = this.handleICECandidateEvent;\n pc.oniceconnectionstatechange = this.handleICEConnectionStateChangeEvent;\n pc.onicegatheringstatechange = this.handleICEGatheringStateChangeEvent;\n pc.onsignalingstatechange = this.handleSignalingStateChangeEvent;\n pc.onnegotiationneeded = this.handleNegotiationNeededEvent;\n pc.onicecandidateerror = this.handleIceCandidateErrorEvent;\n pc.ontrack = this.handleTrackEvent;\n pc.ondatachannel = this.handleDataChannelEvent;\n\n // creating data channel events\n const channel = pc.createDataChannel(\"events\", {ordered: true});\n channel.onerror = this.handleDataChannelError;\n channel.onmessage = this.handleDataChannelMessage;\n channel.onopen = this.handleDataChannelOpen;\n channel.onclose = this.handleDataChannelClose;\n\n this.setState({pc: pc, dataChannel: channel, waitingForPeer: false});\n\n return pc;\n }\n\n handleVideoAnswerMsg(info) {\n // Configure the remote description, which is the SDP payload\n // in 'info' message.\n const desc = new RTCSessionDescription(info.payload);\n this.state.pc.setRemoteDescription(desc)\n .then(_ => {\n this.setState({ callInitialSetupComplete: true }, _ => this.drainRemoteIceCandidatesCache());\n })\n .catch(err => this.reportError(err));\n }\n\n reportError(err) {\n this.props.onError(err.message, 'err');\n }\n\n canSendOffer() {\n return this.isOutgoingCall || this.state.callInitialSetupComplete;\n }\n\n handleNegotiationNeededEvent(event) {\n const pc = event.target;\n if (!this.canSendOffer()) {\n return;\n }\n pc.createOffer().then(offer => {\n return pc.setLocalDescription(offer);\n })\n .then(_ => {\n this.props.onSendOffer(this.props.topic, this.props.seq, pc.localDescription.toJSON());\n })\n .catch(err => this.reportError(err));\n }\n\n handleIceCandidateErrorEvent(event) {\n console.warn(\"ICE candidate error:\", event);\n }\n\n handleICECandidateEvent(event) {\n if (event.candidate) {\n this.props.onIceCandidate(this.props.topic, this.props.seq, event.candidate.toJSON());\n }\n }\n\n handleNewICECandidateMsg(info) {\n const candidate = new RTCIceCandidate(info.payload);\n if (this.state.callInitialSetupComplete) {\n this.state.pc.addIceCandidate(candidate)\n .catch(err => {\n if (candidate.candidate) {\n this.reportError(err);\n }\n console.warn(\"Error adding new ice candidate\", candidate, err);\n });\n } else {\n this.remoteIceCandidatesCache.push(candidate);\n }\n }\n\n drainRemoteIceCandidatesCache() {\n this.remoteIceCandidatesCache.forEach(candidate => {\n this.state.pc.addIceCandidate(candidate)\n .catch(err => {\n if (candidate.candidate) {\n this.reportError(err);\n }\n console.warn(\"Error adding cached ice candidate\", candidate, err);\n });\n });\n this.remoteIceCandidatesCache = [];\n }\n\n handleICEConnectionStateChangeEvent(event) {\n switch (event.target.iceConnectionState) {\n case 'closed':\n case 'failed':\n this.handleCloseClick();\n break;\n }\n }\n\n handleSignalingStateChangeEvent(event) {\n if (event.target.signalingState == 'closed') {\n this.handleCloseClick();\n }\n }\n\n handleICEGatheringStateChangeEvent(event) {\n // ICE gathering change state\n }\n\n handleTrackEvent(event) {\n // Remote video becomes available.\n this.remoteRef.current.srcObject = event.streams[0];\n this.setState({remoteStream: event.streams[0]});\n }\n\n handleGetUserMediaError(e) {\n console.error(\"Error opening camera and/or microphone\", e);\n switch(e.name) {\n case 'NotFoundError':\n // Cannot start the call b/c no camera and/or microphone found.\n this.reportError(e);\n break;\n case 'SecurityError':\n case 'PermissionDeniedError':\n // Do nothing; this is the same as the user canceling the call.\n break;\n default:\n this.reportError(e);\n break;\n }\n\n // Make sure we shut down our end of the RTCPeerConnection so we're\n // ready to try again.\n this.handleCloseClick();\n }\n\n handleVideoOfferMsg(info) {\n let localStream = null;\n const pc = this.state.pc ? this.state.pc : this.createPeerConnection();\n const desc = new RTCSessionDescription(info.payload);\n\n pc.setRemoteDescription(desc).then(_ => {\n return navigator.mediaDevices.getUserMedia(this.localStreamConstraints);\n })\n .then(stream => {\n let dummyVideo;\n if (!this.localStreamConstraints.video) {\n // Starting an audio-only call. Create an empty video track so\n // so the user can enable the video during the call.\n dummyVideo = this.emptyVideoTrack();\n stream.addTrack(dummyVideo);\n }\n localStream = stream;\n this.localRef.current.srcObject = stream;\n this.setState({localStream: stream});\n\n localStream.getTracks().forEach(track => {\n pc.addTrack(track, localStream);\n });\n\n if (dummyVideo) {\n dummyVideo.enabled = false;\n dummyVideo.stop();\n stream.removeTrack(dummyVideo);\n }\n })\n .then(_ => {\n return pc.createAnswer();\n })\n .then(answer => {\n return pc.setLocalDescription(answer);\n })\n .then(_ => {\n this.props.onSendAnswer(this.props.topic, this.props.seq, pc.localDescription.toJSON());\n this.setState({ callInitialSetupComplete: true }, _ => this.drainRemoteIceCandidatesCache());\n })\n .catch(this.handleGetUserMediaError);\n }\n\n // Call disconnected by remote.\n handleRemoteHangup() {\n if (!this.state.waitingForPeer) {\n // This is live call, just hang up.\n this.handleCloseClick();\n } else {\n // This is a call which is not yet connected.\n // Stop pulse animation.\n this.setState({waitingForPeer: false});\n // Change sound and wait a bit before ending it.\n RING_SOUND.pause();\n RING_SOUND.currentTime = 0;\n CALL_ENDED_SOUND.loop = true;\n CALL_ENDED_SOUND.play().catch(_ => {});\n setTimeout(_ => {\n this.handleCloseClick();\n }, 2000);\n }\n }\n\n handleCloseClick() {\n this.stop();\n this.props.onHangup(this.props.topic, this.props.seq);\n }\n\n // Ends video track and turns off the camera.\n muteVideo() {\n if (!this.state.pc || !this.state.dataChannel) {\n return;\n }\n\n const stream = this.state.localStream;\n const t = stream.getVideoTracks()[0];\n t.enabled = false;\n t.stop();\n\n stream.removeTrack(t);\n this.state.dataChannel.send(VIDEO_MUTED_EVENT);\n this.setState({videoToggleInProgress: false});\n }\n\n unmuteVideo() {\n if (!this.state.pc || !this.state.dataChannel) {\n return;\n }\n navigator.mediaDevices.getUserMedia({ video: true })\n .then(stream => {\n // Will extract video track from stream and throw stream away,\n // and replace video track in the media sender.\n this.localRef.current.srcObject = null;\n const sender = this.state.pc.getSenders().find(s => s.track.kind == 'video');\n const track = stream.getVideoTracks()[0];\n // Remote track from new stream.\n stream.removeTrack(track);\n // Add this track to the existing local stream.\n this.state.localStream.addTrack(track);\n return sender.replaceTrack(track);\n })\n .then(_ => {\n this.localRef.current.srcObject = this.state.localStream;\n this.state.dataChannel.send(VIDEO_UNMUTED_EVENT);\n })\n .catch(err => this.handleGetUserMediaError(err))\n .finally(_ => { this.setState({videoToggleInProgress: false}); }); // Make sure we redraw the mute/unmute icons (e.g. camera -> camera_off).\n }\n\n handleToggleCameraClick() {\n if (this.state.videoToggleInProgress) {\n // Toggle currently in progress.\n return;\n }\n const tracks = this.state.localStream.getVideoTracks();\n this.setState({videoToggleInProgress: true}, _ => {\n if (tracks && tracks.length > 0 && tracks[0].enabled && tracks[0].readyState == 'live') {\n this.muteVideo();\n } else {\n this.unmuteVideo();\n }\n this.setState({audioOnly: !this.state.audioOnly});\n });\n }\n\n handleToggleMicClick() {\n const stream = this.state.localStream;\n const t = stream.getAudioTracks()[0];\n t.enabled = !t.enabled;\n // Make sure we redraw the mute/unmute icons (e.g. mic -> mic_off).\n this.forceUpdate();\n }\n\n render() {\n const audioTracks = this.state.localStream && this.state.localStream.getAudioTracks();\n const videoTracks = !this.state.audioOnly && this.state.localStream && this.state.localStream.getVideoTracks();\n const disabled = !this.state.pc || !this.state.dataChannel || !(audioTracks && audioTracks[0]);\n const audioIcon = audioTracks && audioTracks[0] && audioTracks[0].enabled ? 'mic' : 'mic_off';\n const videoIcon = videoTracks && videoTracks[0] && videoTracks[0].enabled && videoTracks[0].readyState == 'live' ? 'videocam' : 'videocam_off';\n const peerTitle = clipStr(this.props.title, MAX_PEER_TITLE_LENGTH);\n const pulseAnimation = this.state.waitingForPeer ? ' pulse' : '';\n\n let remoteActive = false;\n if (this.remoteRef.current && this.remoteRef.current.srcObject && this.state.remoteVideoLive) {\n const rstream = this.remoteRef.current.srcObject;\n if (rstream.getVideoTracks().length > 0) {\n const t = rstream.getVideoTracks()[0];\n remoteActive = t.enabled && t.readyState == 'live';\n }\n }\n\n return (\n <>\n \n
\n
\n
\n {remoteActive ?\n <>\n
\n
{peerTitle}
\n > :\n <>\n
\n
\n
\n \n
\n
{peerTitle}
\n
\n >\n }\n
\n
\n
\n \n call_end \n \n \n {videoIcon} \n \n \n {audioIcon} \n \n
\n
\n >\n );\n }\n};\n\nexport default injectIntl(CallPanel);\n","import React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport FileProgress from './file-progress.jsx';\nimport { bytesToHumanSize } from '../lib/strformat.js';\nimport { isUrlRelative, sanitizeUrl } from '../lib/utils.js';\n\nexport default class Attachment extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = {\n downloader: null,\n progress: 0\n };\n\n this.downloadFile = this.downloadFile.bind(this);\n this.handleCancel = this.handleCancel.bind(this);\n }\n\n downloadFile(url, filename, mimetype) {\n if (!url) {\n this.props.onError(\"Invalid download URL '\" + url + \"'\");\n return;\n }\n\n const downloader = this.props.tinode.getLargeFileHelper();\n this.setState({downloader: downloader});\n downloader.download(url, filename, mimetype,\n loaded => this.setState({progress: loaded / this.props.size}),\n err => this.props.onError(err, 'err')\n )\n .then(_ => this.setState({downloader: null, progress: 0}))\n .catch(err => {\n if (err) {\n this.props.onError(\"Error downloading file: \" + err.message, 'err');\n }\n this.setState({downloader: null, progress: 0});\n });\n }\n\n handleCancel() {\n if (this.props.uploading) {\n this.props.onCancelUpload();\n } else if (this.state.downloader) {\n this.state.downloader.cancel();\n }\n }\n\n render() {\n let filename = this.props.filename || 'file_attachment';\n if (filename.length > 36) {\n filename = filename.substr(0, 16) + '...' + filename.substr(-16);\n }\n let size = this.props.size > 0 ?\n ({bytesToHumanSize(this.props.size)}) :\n null;\n\n // Detect if the download URL is relative or absolute.\n // If the URL is relative use LargeFileHelper to attach authentication\n // credentials to the request.\n let url, helperFunc;\n if (!this.props.uploading && !this.state.downloader && isUrlRelative(this.props.downloadUrl)) {\n // Relative URL. Use download helper.\n url = '#';\n helperFunc = (e) => {\n e.preventDefault();\n this.downloadFile(this.props.downloadUrl, this.props.filename, this.props.mimetype);\n };\n } else {\n url = sanitizeUrl(this.props.downloadUrl);\n helperFunc = null;\n }\n const downloadWidget = <>file_download >;\n return (\n \n
insert_drive_file
\n
\n
{filename} {size}
\n {this.props.uploading || this.state.downloader ?\n
\n :\n
\n }\n
\n
\n );\n }\n};\n","// Received/read indicator.\nimport React from 'react';\nimport { defineMessages, injectIntl } from 'react-intl';\n\nimport { Tinode } from 'tinode-sdk';\n\nimport { deliveryMarker } from '../lib/utils.js';\n\nconst messages = defineMessages({\n message_sending: {\n id: 'message_sending',\n defaultMessage: 'sending...',\n description: 'Message being sent, in place of time stamp'\n },\n message_sending_failed: {\n id: 'message_sending_failed',\n defaultMessage: 'failed',\n description: 'Failed to send message, in place of time stamp'\n },\n message_edited_marker: {\n id: 'message_edited_marker',\n defaultMessage: ', edited',\n description: 'Marker indicating that the message was edited'\n }\n});\n\nclass ReceivedMarker extends React.PureComponent {\n render() {\n const {formatMessage} = this.props.intl;\n let timestamp;\n if (this.props.received <= Tinode.MESSAGE_STATUS_SENDING) {\n timestamp = formatMessage(messages.message_sending);\n } else if (this.props.received == Tinode.MESSAGE_STATUS_FAILED) {\n timestamp = formatMessage(messages.message_sending_failed);\n } else {\n timestamp = this.props.timestamp.toLocaleTimeString(this.props.intl.locale, { timeStyle: 'short' });\n }\n\n const icon = deliveryMarker(this.props.received);\n const marker = icon ? {icon.name} : null;\n const edited = this.props.edited ? formatMessage(messages.message_edited_marker) : null;\n\n return (\n \n {timestamp}{edited}{'\\u00a0'}{marker}\n \n );\n }\n};\n\nexport default injectIntl(ReceivedMarker);\n","// Single chat message bubble, sent or received.\n\nimport React from 'react';\nimport { FormattedMessage, injectIntl } from 'react-intl';\nimport { Drafty, Tinode } from 'tinode-sdk';\n\nimport Attachment from './attachment.jsx';\nimport LetterTile from './letter-tile.jsx';\nimport ReceivedMarker from './received-marker.jsx'\n\nimport { fullFormatter } from '../lib/formatters.js';\nimport { sanitizeUrl } from '../lib/utils.js';\n\nclass BaseChatMessage extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.state = {\n progress: 0\n };\n\n if (props.uploader) {\n props.uploader.onProgress = this.handleProgress.bind(this);\n }\n\n this.handleExpandImage = this.handleExpandImage.bind(this);\n this.handlePlayVideo = this.handlePlayVideo.bind(this);\n this.handleFormButtonClick = this.handleFormButtonClick.bind(this);\n this.handleContextClick = this.handleContextClick.bind(this);\n this.handleCancelUpload = this.handleCancelUpload.bind(this);\n this.handleQuoteClick = this.handleQuoteClick.bind(this);\n\n this.formatterContext = {\n formatMessage: props.intl.formatMessage.bind(props.intl),\n viewportWidth: props.viewportWidth,\n authorizeURL: props.tinode.authorizeURL.bind(props.tinode),\n\n onImagePreview: this.handleExpandImage,\n onVideoPreview: this.handlePlayVideo,\n onFormButtonClick: this.handleFormButtonClick,\n onQuoteClick: this.handleQuoteClick\n };\n }\n\n handleExpandImage(e) {\n e.preventDefault();\n this.props.onExpandMedia({\n url: e.target.src,\n filename: e.target.dataset.name,\n width: e.target.dataset.width,\n height: e.target.dataset.height,\n size: e.target.dataset.size,\n type: e.target.dataset.mime\n });\n }\n\n handlePlayVideo(e) {\n e.preventDefault();\n this.props.onExpandMedia({\n video: true,\n url: e.target.dataset.src,\n preview: e.target.src,\n filename: e.target.dataset.name,\n width: e.target.dataset.width,\n height: e.target.dataset.height,\n duration: e.target.dataset.duration,\n size: e.target.dataset.size,\n type: e.target.dataset.mime\n });\n }\n\n handleFormButtonClick(e) {\n e.preventDefault();\n const data = {\n seq: this.props.seq\n };\n data.resp = {};\n if (e.target.dataset.name) {\n data.resp[e.target.dataset.name] = e.target.dataset.val ? e.target.dataset.val :\n e.target.dataset.val === undefined ? 1 : '' + e.target.dataset.val;\n }\n if (e.target.dataset.act == 'url') {\n data.ref = sanitizeUrl(e.target.dataset.ref) || 'about:blank';\n }\n const text = e.target.dataset.title || 'unknown';\n this.props.onFormResponse(e.target.dataset.act, text, data);\n }\n\n handleContextClick(e) {\n e.preventDefault();\n e.stopPropagation();\n const menuItems = [];\n if (this.props.received == Tinode.MESSAGE_STATUS_FAILED) {\n menuItems.push('menu_item_send_retry');\n }\n if (this.props.userIsWriter && this.props.received > Tinode.MESSAGE_STATUS_FAILED) {\n menuItems.push('menu_item_reply');\n if (!this.props.response) {\n let immutable = false;\n Drafty.entities(this.props.content, (_0, _1, tp) => {\n immutable = ['AU', 'EX', 'FM', 'IM', 'VC', 'VD'].includes(tp);\n return immutable;\n });\n if (!immutable) {\n Drafty.styles(this.props.content, tp => {\n immutable = ['QQ'].includes(tp);\n return immutable;\n });\n }\n if (!immutable) {\n menuItems.push('menu_item_edit');\n }\n }\n }\n menuItems.push('menu_item_forward');\n\n this.props.showContextMenu({\n seq: this.props.seq,\n replace: this.props.edited ? parseInt(this.props.edited.split(':')[1]) : 0,\n content: this.props.content,\n userFrom: this.props.userFrom,\n userName: this.props.userName,\n y: e.pageY,\n x: e.pageX,\n pickReply: this.props.pickReply,\n editMessage: this.props.editMessage,\n }, menuItems);\n }\n\n handleProgress(ratio) {\n this.setState({progress: ratio});\n }\n\n handleCancelUpload() {\n this.props.onCancelUpload(this.props.seq, this.props.uploader);\n }\n\n handleQuoteClick(e) {\n e.preventDefault();\n e.stopPropagation();\n const replyToSeq = this.props.replyToSeq;\n if (replyToSeq) {\n this.props.onQuoteClick(replyToSeq);\n }\n }\n\n render() {\n const sideClass = this.props.sequence + ' ' + (this.props.response ? 'left' : 'right');\n const bubbleClass = (this.props.sequence == 'single' || this.props.sequence == 'last') ? 'bubble tip' : 'bubble';\n const avatar = this.props.userAvatar || true;\n const fullDisplay = (this.props.isGroup && this.props.response &&\n (this.props.sequence == 'single' || this.props.sequence == 'last'));\n\n let content = this.props.content;\n const attachments = [];\n if (this.props.mimeType == Drafty.getContentType() && Drafty.isValid(content)) {\n Drafty.attachments(content, (att, i) => {\n if (att.mime == 'application/json') {\n // Don't show json objects as attachments.\n // They are not meant for users.\n return;\n }\n attachments.push( );\n }, this);\n const tree = Drafty.format(content, fullFormatter, this.formatterContext);\n content = React.createElement(React.Fragment, null, tree);\n } else if (typeof content != 'string') {\n content = <>warning_amber \n >\n }\n\n return (\n \n {this.props.isGroup && this.props.response ?\n \n {fullDisplay ?\n :\n null}\n
:\n null}\n \n
\n
\n
\n {content}\n {attachments}\n
\n {this.props.timestamp ?\n
\n : null}\n
\n {this.props.showContextMenu ?\n
\n \n expand_more \n \n : null\n }\n
\n {fullDisplay ?\n
\n {this.props.userName ||\n \n }\n
\n : null\n }\n
\n \n );\n }\n};\n\nconst IntlChatMessage = injectIntl(BaseChatMessage);\nconst ChatMessage = React.forwardRef((props, ref) => );\n\nexport default ChatMessage;\n","// Send message form.\nimport React, { Suspense } from 'react';\nimport { FormattedMessage, defineMessages, injectIntl } from 'react-intl';\nimport { Drafty } from 'tinode-sdk';\n\n// Lazy-loading AudioRecorder because it's quite large due to\n// a dependency on webm-duration-fix.\nconst AudioRecorder = React.lazy(_ => import('./audio-recorder.jsx'));\n\nimport { KEYPRESS_DELAY } from '../config.js';\nimport { filePasted } from '../lib/blob-helpers.js';\nimport { replyFormatter } from '../lib/formatters.js';\n\nconst messages = defineMessages({\n messaging_disabled: {\n id: 'messaging_disabled_prompt',\n defaultMessage: 'Messaging disabled',\n description: 'Prompt in SendMessage in read-only topic'\n },\n type_new_message: {\n id: 'new_message_prompt',\n defaultMessage: 'New message',\n description: 'Prompt in send message field'\n },\n add_image_caption: {\n id: 'image_caption_prompt',\n defaultMessage: 'Image caption',\n description: 'Prompt in SendMessage for attached image'\n },\n file_attachment_too_large: {\n id: 'file_attachment_too_large',\n defaultMessage: 'The file size {size} exceeds the {limit} limit.',\n description: 'Error message when attachment is too large'\n },\n cannot_initiate_upload: {\n id: 'cannot_initiate_file_upload',\n defaultMessage: 'Cannot initiate file upload.',\n description: 'Generic error messagewhen attachment fails'\n },\n icon_title_record_voice: {\n id: 'icon_title_record_voice',\n defaultMessage: 'Record voice message',\n description: 'Icon tool tip for recording a voice message'\n },\n icon_title_attach_file: {\n id: 'icon_title_attach_file',\n defaultMessage: 'Attach file',\n description: 'Icon tool tip for attaching a file'\n },\n icon_title_add_image: {\n id: 'icon_title_add_image',\n defaultMessage: 'Add image',\n description: 'Icon tool tip for attaching an image'\n },\n icon_title_send: {\n id: 'icon_title_send',\n defaultMessage: 'Send message',\n description: 'Icon tool tip for sending a message'\n },\n});\n\nclass SendMessage extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.state = {\n quote: null,\n message: '',\n audioRec: false,\n audioAvailable: !!(navigator.mediaDevices && navigator.mediaDevices.getUserMedia),\n };\n\n // Timestamp when the previous key press was sent to the server.\n this.keypressTimestamp = 0;\n\n this.handlePasteEvent = this.handlePasteEvent.bind(this);\n this.handleAttachImage = this.handleAttachImage.bind(this);\n this.handleAttachFile = this.handleAttachFile.bind(this);\n this.handleAttachAudio = this.handleAttachAudio.bind(this);\n this.handleSend = this.handleSend.bind(this);\n this.handleKeyPress = this.handleKeyPress.bind(this);\n this.handleMessageTyping = this.handleMessageTyping.bind(this);\n this.handleDropAttach = this.handleDropAttach.bind(this);\n\n this.handleQuoteClick = this.handleQuoteClick.bind(this);\n\n this.formatReply = this.formatReply.bind(this);\n }\n\n componentDidMount() {\n if (this.messageEditArea) {\n this.messageEditArea.addEventListener('paste', this.handlePasteEvent, false);\n if (window.getComputedStyle(this.messageEditArea).getPropertyValue('transition-property') == 'all') {\n // Set focus on desktop, but not on mobile: focus causes soft keyboard to pop up.\n this.messageEditArea.focus();\n }\n }\n\n this.setState({quote: this.formatReply()});\n }\n\n componentWillUnmount() {\n if (this.messageEditArea) {\n this.messageEditArea.removeEventListener('paste', this.handlePasteEvent, false);\n }\n }\n\n componentDidUpdate(prevProps) {\n if (this.messageEditArea) {\n if (window.getComputedStyle(this.messageEditArea).getPropertyValue('transition-property') == 'all') {\n // Set focus on desktop, but not on mobile: focus causes soft keyboard to pop up.\n this.messageEditArea.focus();\n }\n }\n\n if (prevProps.topicName != this.props.topicName) {\n this.setState({message: this.props.initMessage || '', audioRec: false, quote: null});\n } else if (prevProps.initMessage != this.props.initMessage) {\n const msg = this.props.initMessage || '';\n this.setState({message: msg}, _ => {\n // If there is text, scroll to bottom and set caret to the end.\n this.messageEditArea.scrollTop = this.messageEditArea.scrollHeight;\n this.messageEditArea.setSelectionRange(msg.length, msg.length);\n });\n }\n if (prevProps.reply != this.props.reply) {\n this.setState({quote: this.formatReply()});\n }\n }\n\n formatReply() {\n return this.props.reply ?\n Drafty.format(this.props.reply.content, replyFormatter, {\n formatMessage: this.props.intl.formatMessage.bind(this.props.intl),\n authorizeURL: this.props.tinode.authorizeURL.bind(this.props.tinode)\n }) : null;\n }\n\n handlePasteEvent(e) {\n if (this.props.disabled) {\n return;\n }\n // FIXME: handle large files too.\n if (filePasted(e,\n file => { this.props.onAttachImage(file); },\n file => { this.props.onAttachFile(file); },\n this.props.onError)) {\n\n // If a file was pasted, don't paste base64 data into input field.\n e.preventDefault();\n }\n }\n\n handleAttachImage(e) {\n if (e.target.files && e.target.files.length > 0) {\n this.props.onAttachImage(e.target.files[0]);\n }\n // Clear the value so the same file can be uploaded again.\n e.target.value = '';\n }\n\n handleAttachFile(e) {\n if (e.target.files && e.target.files.length > 0) {\n this.props.onAttachFile(e.target.files[0]);\n }\n // Clear the value so the same file can be uploaded again.\n e.target.value = '';\n }\n\n handleDropAttach(files) {\n if (files && files.length > 0) {\n this.props.onAttachFile(files[0]);\n }\n }\n\n handleAttachAudio(url, preview, duration) {\n this.setState({audioRec: false});\n this.props.onAttachAudio(url, preview, duration);\n }\n\n handleSend(e) {\n e.preventDefault();\n const message = this.state.message.trim();\n if (message || this.props.acceptBlank || this.props.noInput) {\n this.props.onSendMessage(message);\n this.setState({message: ''});\n }\n }\n\n /* Send on Enter key */\n handleKeyPress(e) {\n if (this.state.audioRec) {\n // Ignore key presses while audio is being recorded.\n e.preventDefault();\n e.stopPropagation();\n return;\n }\n\n // Remove this if you don't want Enter to trigger send\n if (e.key === 'Enter') {\n // Have Shift-Enter insert a line break instead\n if (!e.shiftKey) {\n e.preventDefault();\n e.stopPropagation();\n\n this.handleSend(e);\n }\n }\n }\n\n handleMessageTyping(e) {\n this.setState({message: e.target.value});\n if (this.props.onKeyPress) {\n const now = new Date().getTime();\n if (now - this.keypressTimestamp > KEYPRESS_DELAY) {\n this.props.onKeyPress();\n this.keypressTimestamp = now;\n }\n }\n }\n\n handleQuoteClick(e) {\n e.preventDefault();\n e.stopPropagation();\n if (this.props.reply && this.props.onQuoteClick) {\n const replyToSeq = this.props.reply.seq;\n this.props.onQuoteClick(replyToSeq);\n }\n }\n\n render() {\n const { formatMessage } = this.props.intl;\n const prompt = this.props.disabled ?\n formatMessage(messages.messaging_disabled) :\n (this.props.messagePrompt ?\n formatMessage(messages[this.props.messagePrompt]) :\n formatMessage(messages.type_new_message));\n\n const sendIcon = (this.props.reply && this.props.reply.editing) ?\n 'check_circle' : 'send';\n\n const quote = this.state.quote ?\n (\n
\n {this.state.quote}\n
) : null;\n const audioEnabled = this.state.audioAvailable && this.props.onAttachAudio;\n return (\n \n {!this.props.noInput ? quote : null}\n
}>\n
this.props.onKeyPress(true)}\n onDeleted={_ => this.setState({audioRec: false})}\n onFinished={this.handleAttachAudio}/>\n ) :\n \n \n );\n }\n};\n\nexport default injectIntl(SendMessage);\n","import React from 'react';\nimport { FormattedMessage } from 'react-intl';\nimport SendMessage from '../widgets/send-message.jsx';\n\nimport { bytesToHumanSize, shortenFileName } from '../lib/strformat.js';\n\n// Get material icon name from mime type.\nfunction iconFromMime(mime) {\n // If more icons become available in material icons, add them to this mime-to-icon mapping.\n const mimeToIcon = {default: 'insert_drive_file', image: 'image', text: 'description', video: 'theaters'};\n\n return mimeToIcon[mime] || mimeToIcon[(mime || '').split('/')[0]] || mimeToIcon['default'];\n}\n\nexport default class DocPreview extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.handleSendDoc = this.handleSendDoc.bind(this);\n }\n\n handleSendDoc(caption) {\n this.props.onClose();\n this.props.onSendMessage(this.props.content.file);\n }\n\n render() {\n if (!this.props.content) {\n return null;\n }\n return (\n \n
\n
\n
\n
{iconFromMime(this.props.content.type)} \n
{shortenFileName(this.props.content.name, 24) || '-'}
\n
{this.props.content.type || 'application/octet-stream'}
\n
{bytesToHumanSize(this.props.content.size)}
\n
\n
\n
\n
\n );\n }\n};\n","// GroupSubs: a list of group subscribers currently online.\n// Show in the topic title bar\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport { MAX_ONLINE_IN_TOPIC } from '../config.js'\n\nimport LetterTile from './letter-tile.jsx';\nimport { makeImageUrl } from '../lib/blob-helpers.js';\n\nexport default class GroupSubs extends React.Component {\n constructor(props) {\n super(props);\n }\n\n render() {\n const usersOnline = [];\n const totalCount = (this.props.subscribers || []).length;\n const countToShow = Math.min(MAX_ONLINE_IN_TOPIC, totalCount);\n\n (this.props.subscribers || []).some((sub) => {\n usersOnline.push(\n \n \n
\n );\n return usersOnline.length == countToShow;\n });\n\n return (\n {usersOnline} {totalCount > countToShow ?\n \n \n : null}\n
\n );\n }\n};\n","import React from 'react';\nimport { FormattedMessage } from 'react-intl';\nimport SendMessage from './send-message.jsx';\n\nimport { REM_SIZE } from '../config.js';\nimport { fitImageSize } from '../lib/blob-helpers.js';\nimport { bytesToHumanSize, shortenFileName } from '../lib/strformat.js';\n\nexport default class ImagePreview extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.state = {\n width: 0,\n height: 0\n };\n\n this.handleSendImage = this.handleSendImage.bind(this);\n }\n\n assignWidth(node) {\n if (node && !this.state.width) {\n const bounds = node.getBoundingClientRect();\n this.setState({\n width: bounds.width | 0,\n height: bounds.height | 0\n });\n }\n }\n\n handleSendImage(caption) {\n this.props.onClose();\n this.props.onSendMessage(caption, this.props.content.blob);\n }\n\n render() {\n if (!this.props.content) {\n return null;\n }\n\n const dim = fitImageSize(this.props.content.width, this.props.content.height,\n this.state.width, this.state.height, false);\n const size = dim ? { width: dim.dstWidth + 'px', height: dim.dstHeight + 'px' } :\n ((this.props.content.width > this.props.content.height) ? {width: '100%'} : {height: '100%'});\n size.maxWidth = '100%';\n size.maxHeight = '100%';\n\n // Average font aspect ratio is ~0.5; File name takes 1/3 of the viewport width.\n const maxlength = Math.max(((this.state.width / REM_SIZE / 1.5) | 0) - 2, 12);\n const fname = shortenFileName(this.props.content.filename, maxlength) || '-';\n\n const width = this.props.content.width || '-';\n const height = this.props.content.height || '-';\n return (\n \n
\n
this.assignWidth(node)}>\n
\n
\n {this.props.onSendMessage ?\n
\n :\n }\n
\n );\n }\n};\n","// A single topic or user.\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nexport default class Invitation extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.handleButtonAction = this.handleButtonAction.bind(this);\n }\n\n handleButtonAction(evt, data) {\n evt.preventDefault();\n this.props.onAction(data);\n }\n\n render() {\n return (\n \n
\n \n
\n
\n { this.handleButtonAction(event, \"accept\"); }}>\n \n \n { this.handleButtonAction(event, \"delete\"); }}>\n \n \n { this.handleButtonAction(event, \"block\"); }}>\n \n \n
\n
\n );\n }\n};\n","/* This is just a static page to display when no conversation is selected. */\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport { Tinode } from 'tinode-sdk';\n\nimport { APP_NAME } from '../config.js';\n\nexport default class LogoView extends React.PureComponent {\n render() {\n const version = APP_NAME + ' (' + Tinode.getLibrary() + ')';\n return (\n \n
\n
\n \n Tinode Web \n \n
{version}
\n
{this.props.serverVersion} ({this.props.serverAddress})
\n
\n
\n );\n }\n};\n","// Message bubble with non-payload content, such as an indicator of deleted content or a date stamp.\n\nimport React from 'react';\n\nexport default class MetaMessage extends React.PureComponent {\n constructor(props) {\n super(props);\n }\n\n render() {\n let content = null;\n let bubbleClass = 'bubble';\n if (this.props.date) {\n // A date badge.\n content = <>{this.props.date}>\n bubbleClass += ' date';\n }\n\n if (!content) {\n return <>{null}>\n }\n\n return (\n \n \n \n );\n }\n};\n","import React from 'react';\nimport { FormattedMessage, defineMessages, injectIntl } from 'react-intl';\nimport SendMessage from './send-message.jsx';\n\nimport { bytesToHumanSize } from '../lib/strformat.js';\n\nconst messages = defineMessages({\n unrecognized_video_format: {\n id: 'unrecognized_video_format',\n defaultMessage: 'Format of this video is not recognized',\n description: 'Error message when uploaded video is invalid',\n }\n});\n\nclass VideoPreview extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.videoRef = React.createRef();\n\n this.handleSendVideo = this.handleSendVideo.bind(this);\n }\n\n handleSendVideo(caption) {\n this.props.onClose();\n const params = {\n width: this.videoRef.current.videoWidth,\n height: this.videoRef.current.videoHeight,\n duration: (this.videoRef.current.duration * 1000) | 0,\n mime: this.props.content.mime,\n name: this.props.content.filename\n }\n\n if (params.width == 0 || params.height == 0) {\n this.props.onError(this.props.intl.formatMessage(messages.unrecognized_video_format), 'err');\n return;\n }\n\n // Capture screen from a video.\n const canvas = document.createElement('canvas');\n canvas.width = params.width;\n canvas.height = params.height;\n const ctx = canvas.getContext('2d');\n ctx.drawImage(this.videoRef.current, 0, 0, canvas.width, canvas.height);\n ctx.canvas.toBlob(\n preview => this.props.onSendMessage(caption, this.props.content.blob, preview, params),\n 'image/jpeg', 0.75\n );\n }\n\n render() {\n if (!this.props.content) {\n return null;\n }\n\n const width = this.props.content.width || '-';\n const height = this.props.content.height || '-';\n\n const controlist = this.props.onSendMessage ? 'nodownload' : '';\n const autoPlay = !this.props.onSendMessage;\n\n return (\n \n
\n
\n \n
\n {this.props.onSendMessage ?\n
\n :\n }\n
\n );\n }\n};\n\nexport default injectIntl(VideoPreview);\n","// Utility class for hash navigation.\n\nexport default class HashNavigation {\n // Parse hash as in http://www.example.com/path#hash as if it were\n // path and arguments.\n static parseUrlHash(hash) {\n // Split path from args, path -> parts[0], args->path[1]\n const parts = hash.split('?', 2);\n const params = {};\n let path = [];\n if (parts[0]) {\n path = parts[0].replace('#', '').split('/');\n }\n if (parts[1]) {\n parts[1].split('&').forEach((arg) => {\n // Can't use split() because the value may contain '='.\n const eq = arg.indexOf('=');\n if (eq > 0) {\n params[arg.slice(0, eq)] = decodeURIComponent(arg.slice(eq + 1));\n }\n });\n }\n return {path: path, params: params};\n }\n\n static navigateTo(url) {\n window.location.hash = url;\n }\n\n static composeUrlHash(path, params) {\n let url = path.join('/');\n const args = [];\n for (const key in params) {\n if (params.hasOwnProperty(key)) {\n args.push(key + '=' + encodeURIComponent(params[key]));\n }\n }\n if (args.length > 0) {\n url += '?' + args.join('&');\n }\n return url;\n }\n\n static addUrlParam(hash, key, value) {\n const parsed = HashNavigation.parseUrlHash(hash);\n parsed.params[key] = value;\n return HashNavigation.composeUrlHash(parsed.path, parsed.params);\n }\n\n static removeUrlParam(hash, key) {\n const parsed = HashNavigation.parseUrlHash(hash);\n delete parsed.params[key];\n return HashNavigation.composeUrlHash(parsed.path, parsed.params);\n }\n\n static setUrlSidePanel(hash, sidepanel) {\n const parsed = HashNavigation.parseUrlHash(hash);\n parsed.path[0] = sidepanel;\n return HashNavigation.composeUrlHash(parsed.path, parsed.params);\n }\n\n static setUrlInfoPanel(hash, infopanel) {\n const parsed = HashNavigation.parseUrlHash(hash);\n if (infopanel) {\n parsed.params.info = infopanel;\n } else {\n delete parsed.params.info;\n }\n return HashNavigation.composeUrlHash(parsed.path, parsed.params);\n }\n\n static setUrlTopic(hash, topic) {\n const parsed = HashNavigation.parseUrlHash(hash);\n parsed.path[1] = topic;\n // Close InfoView on topic change.\n delete parsed.params.info;\n return HashNavigation.composeUrlHash(parsed.path, parsed.params);\n }\n}\n","// Panel with a chat.\n\nimport React from 'react';\nimport { FormattedMessage, defineMessages, injectIntl } from 'react-intl';\n\nimport { Drafty, Tinode } from 'tinode-sdk';\n\nimport CallPanel from '../widgets/call-panel.jsx';\nimport ChatMessage from '../widgets/chat-message.jsx';\nimport ContactBadges from '../widgets/contact-badges.jsx';\nimport DocPreview from '../widgets/doc-preview.jsx';\nimport ErrorPanel from '../widgets/error-panel.jsx';\nimport GroupSubs from '../widgets/group-subs.jsx';\nimport ImagePreview from '../widgets/image-preview.jsx';\nimport Invitation from '../widgets/invitation.jsx';\nimport LetterTile from '../widgets/letter-tile.jsx';\nimport LoadSpinner from '../widgets/load-spinner.jsx';\nimport LogoView from './logo-view.jsx';\nimport MetaMessage from '../widgets/meta-message.jsx';\nimport SendMessage from '../widgets/send-message.jsx';\nimport VideoPreview from '../widgets/video-preview.jsx';\n\nimport { DEFAULT_P2P_ACCESS_MODE, EDIT_PREVIEW_LENGTH, IMAGE_PREVIEW_DIM, KEYPRESS_DELAY,\n MESSAGES_PAGE, MAX_EXTERN_ATTACHMENT_SIZE, MAX_IMAGE_DIM, MAX_INBAND_ATTACHMENT_SIZE,\n READ_DELAY, QUOTED_REPLY_LENGTH, VIDEO_PREVIEW_DIM } from '../config.js';\nimport { CALL_STATE_OUTGOING_INITATED, CALL_STATE_IN_PROGRESS } from '../constants.js';\nimport { blobToBase64, fileToBase64, imageScaled, makeImageUrl } from '../lib/blob-helpers.js';\nimport HashNavigation from '../lib/navigation.js';\nimport { bytesToHumanSize, relativeDateFormat, shortDateFormat } from '../lib/strformat.js';\n\n// Run timer with this frequency (ms) for checking notification queue.\nconst NOTIFICATION_EXEC_INTERVAL = 300;\n// Scroll distance before [go to latest message] button is shown.\nconst SHOW_GO_TO_LAST_DIST = 100;\n\nconst messages = defineMessages({\n online_now: {\n id: 'online_now',\n defaultMessage: 'online now',\n description: 'Indicator that the user or topic is currently online',\n },\n last_seen: {\n id: 'last_seen_timestamp',\n defaultMessage: 'Last seen',\n description: 'Label for the timestamp of when the user or topic was last online'\n },\n not_found: {\n id: 'title_not_found',\n defaultMessage: 'Not found',\n description: 'Title shown when topic is not found'\n },\n channel: {\n id: 'channel',\n defaultMessage: 'channel',\n description: 'Subtitle shown for channels in MessagesView instead of last seen'\n },\n file_attachment_too_large: {\n id: 'file_attachment_too_large',\n defaultMessage: 'The file size {size} exceeds the {limit} limit.',\n description: 'Error message when attachment is too large'\n },\n invalid_content: {\n id: 'invalid_content',\n defaultMessage: 'invalid content',\n description: 'Shown when the message is unreadable'\n },\n editing_message: {\n id: 'editing_message',\n defaultMessage: 'Editing',\n description: 'Title over message editing preview'\n },\n drag_file: {\n id: 'drag_file',\n defaultMessage: 'Drag file here',\n description: 'Prompt on the file drag-n-drop overlay banner'\n }\n});\n\n// Checks if the access permissions are granted but not yet accepted.\nfunction isUnconfirmed(acs) {\n if (acs) {\n const ex = acs.getExcessive() || '';\n return acs.isJoiner('given') && (ex.includes('R') || ex.includes('W'));\n }\n return false;\n}\n\nfunction isPeerRestricted(acs) {\n if (acs) {\n const ms = acs.getMissing() || '';\n return acs.isJoiner('want') && (ms.includes('R') || ms.includes('W'));\n }\n return false;\n}\n\nfunction shouldPresentCallPanel(callState) {\n // Show call panel if either:\n // - call is outgoing (and the client is waiting for the other side to pick up) or,\n // - call is already in progress.\n return callState == CALL_STATE_OUTGOING_INITATED || callState == CALL_STATE_IN_PROGRESS;\n}\n\nclass MessagesView extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = MessagesView.getDerivedStateFromProps(props, {});\n\n this.leave = this.leave.bind(this);\n this.sendMessage = this.sendMessage.bind(this);\n this.retrySend = this.retrySend.bind(this);\n this.sendImageAttachment = this.sendImageAttachment.bind(this);\n this.sendVideoAttachment = this.sendVideoAttachment.bind(this);\n this.sendFileAttachment = this.sendFileAttachment.bind(this);\n this.sendAudioAttachment = this.sendAudioAttachment.bind(this);\n this.sendKeyPress = this.sendKeyPress.bind(this);\n this.subscribe = this.subscribe.bind(this);\n this.handleScrollReference = this.handleScrollReference.bind(this);\n this.mountDnDEvents = this.mountDnDEvents.bind(this);\n this.handleScrollEvent = this.handleScrollEvent.bind(this);\n this.handleDescChange = this.handleDescChange.bind(this);\n this.handleSubsUpdated = this.handleSubsUpdated.bind(this);\n this.handleMessageUpdate = this.handleMessageUpdate.bind(this);\n this.handleAllMessagesReceived = this.handleAllMessagesReceived.bind(this);\n this.handleInfoReceipt = this.handleInfoReceipt.bind(this);\n this.handleExpandMedia = this.handleExpandMedia.bind(this);\n this.handleClosePreview = this.handleClosePreview.bind(this);\n this.handleFormResponse = this.handleFormResponse.bind(this);\n this.handleContextClick = this.handleContextClick.bind(this);\n this.handleShowMessageContextMenu = this.handleShowMessageContextMenu.bind(this);\n this.handleNewChatAcceptance = this.handleNewChatAcceptance.bind(this);\n this.handleEnablePeer = this.handleEnablePeer.bind(this);\n this.handleAttachFile = this.handleAttachFile.bind(this);\n this.handleAttachImageOrVideo = this.handleAttachImageOrVideo.bind(this);\n this.handleCancelUpload = this.handleCancelUpload.bind(this);\n this.postReadNotification = this.postReadNotification.bind(this);\n this.clearNotificationQueue = this.clearNotificationQueue.bind(this);\n this.goToLatestMessage = this.goToLatestMessage.bind(this);\n this.handleFileDrop = this.handleFileDrop.bind(this);\n\n this.handlePickReply = this.handlePickReply.bind(this);\n this.handleEditMessage = this.handleEditMessage.bind(this);\n this.handleCancelReply = this.handleCancelReply.bind(this);\n this.handleQuoteClick = this.handleQuoteClick.bind(this);\n this.handleCallHangup = this.handleCallHangup.bind(this);\n\n this.isDragEnabled = this.isDragEnabled.bind(this);\n this.handleDragIn = this.handleDragIn.bind(this);\n this.handleDragOut = this.handleDragOut.bind(this);\n this.handleDrag = this.handleDrag.bind(this);\n this.handleDrop = this.handleDrop.bind(this);\n\n this.chatMessageRefs = {};\n this.getOrCreateMessageRef = this.getOrCreateMessageRef.bind(this);\n\n // Keeps track of the drag event.\n // Need a counter b/c the browser's 'drag' events may fire multiple times\n // when the user takes the mouse pointer over the container:\n // for the component itself and for all nested/child elements.\n this.dragCounter = 0;\n this.dndRef = null;\n\n this.readNotificationQueue = [];\n this.readNotificationTimer = null;\n\n this.keyPressTimer = null;\n }\n\n getOrCreateMessageRef(seqId) {\n if (this.chatMessageRefs.hasOwnProperty(seqId)) {\n return this.chatMessageRefs[seqId];\n }\n const ref = React.createRef();\n this.chatMessageRefs[seqId] = ref;\n return ref;\n }\n\n componentDidMount() {\n if (this.messagesScroller) {\n this.messagesScroller.addEventListener('scroll', this.handleScrollEvent);\n }\n\n // Drag and drop events\n if (this.dndRef) {\n this.dndRef.addEventListener('dragenter', this.handleDragIn);\n this.dndRef.addEventListener('dragleave', this.handleDragOut);\n this.dndRef.addEventListener('dragover', this.handleDrag);\n this.dndRef.addEventListener('drop', this.handleDrop);\n }\n }\n\n componentWillUnmount() {\n if (this.messagesScroller) {\n this.messagesScroller.removeEventListener('scroll', this.handleScrollEvent);\n }\n\n // Flush all notifications.\n this.clearNotificationQueue();\n\n // Drag and drop events\n if (this.dndRef) {\n this.dndRef.removeEventListener('dragenter', this.handleDragIn);\n this.dndRef.removeEventListener('dragleave', this.handleDragOut);\n this.dndRef.removeEventListener('dragover', this.handleDrag);\n this.dndRef.removeEventListener('drop', this.handleDrop);\n }\n }\n\n // Scroll last message into view on component update e.g. on message received\n // or vertical shrinking.\n componentDidUpdate(prevProps, prevState) {\n if (this.messagesScroller &&\n (prevState.topic != this.state.topic || prevState.messageCount != this.state.messageCount)) {\n // New message.\n if (this.state.scrollPosition < SHOW_GO_TO_LAST_DIST) {\n this.messagesScroller.scrollTop = this.messagesScroller.scrollHeight -\n this.state.scrollPosition -\n this.messagesScroller.offsetHeight;\n }\n }\n\n const topic = this.props.tinode ? this.props.tinode.getTopic(this.state.topic) : undefined;\n if (this.state.topic != prevState.topic) {\n if (prevState.topic && !Tinode.isNewGroupTopicName(prevState.topic)) {\n this.leave(prevState.topic);\n if (prevState.rtcPanel) {\n this.handleCallHangup(prevState.topic, prevProps.callSeq);\n }\n }\n\n if (topic) {\n topic.onData = this.handleMessageUpdate;\n topic.onAllMessagesReceived = this.handleAllMessagesReceived;\n topic.onInfo = this.handleInfoReceipt;\n topic.onMetaDesc = this.handleDescChange;\n topic.onSubsUpdated = this.handleSubsUpdated;\n topic.onPres = this.handleSubsUpdated;\n }\n }\n\n if (!this.props.applicationVisible) {\n // If application is not visible, flush all unsent 'read' notifications.\n this.clearNotificationQueue();\n } else {\n // Otherwise assume there are unread messages.\n this.postReadNotification(0);\n }\n\n if (topic && ((this.state.topic != prevState.topic) || !prevProps.ready)) {\n // Don't immediately subscribe to a new p2p topic, wait for the first message.\n if (topic._new && topic.isP2PType()) {\n topic.getMeta(topic.startMetaQuery().withDesc().build());\n } else {\n this.subscribe(topic);\n }\n }\n }\n\n static getDerivedStateFromProps(nextProps, prevState) {\n let nextState = {};\n if (!nextProps.topic) {\n // Default state: no topic.\n nextState = {\n messageCount: 0,\n latestClearId: -1,\n onlineSubs: [],\n topic: null,\n title: '',\n avatar: null,\n isVerified: false,\n isStaff: false,\n isDangerous: false,\n deleted: false,\n docPreview: null,\n imagePreview: null,\n imagePostview: null,\n videoPreview: null,\n videoPostview: null,\n rtcPanel: null,\n typingIndicator: false,\n scrollPosition: 0,\n fetchingMessages: false,\n peerMessagingDisabled: false,\n channel: false,\n reply: null,\n contentToEdit: null,\n showGoToLastButton: false,\n dragging: false\n };\n } else if (nextProps.topic != prevState.topic) {\n const topic = nextProps.tinode.getTopic(nextProps.topic);\n\n nextState = {\n topic: nextProps.topic,\n deleted: topic._deleted,\n docPreview: null,\n imagePreview: null,\n imagePostview: null,\n videoPreview: null,\n videoPostview: null,\n rtcPanel: null,\n typingIndicator: false,\n scrollPosition: 0,\n fetchingMessages: false,\n showGoToLastButton: false,\n contentToEdit: null,\n dragging: false\n };\n\n if (nextProps.forwardMessage) {\n // We are forwarding a message. Show preview.\n nextState.reply = {\n content: nextProps.forwardMessage.preview,\n seq: null\n };\n } else {\n nextState.reply = null;\n }\n\n if (topic) {\n // Topic exists.\n const subs = [];\n\n if (nextProps.connected) {\n topic.subscribers((sub) => {\n if (sub.online && sub.user != nextProps.myUserId) {\n subs.push(sub);\n }\n });\n }\n\n Object.assign(nextState, {\n onlineSubs: subs\n });\n\n if (topic.public) {\n Object.assign(nextState, {\n title: topic.public.fn,\n avatar: makeImageUrl(topic.public.photo)\n });\n } else {\n Object.assign(nextState, {\n title: '',\n avatar: null\n });\n }\n\n const peer = topic.p2pPeerDesc();\n if (peer) {\n Object.assign(nextState, {\n peerMessagingDisabled: isPeerRestricted(peer.acs)\n });\n } else if (prevState.peerMessagingDisabled) {\n Object.assign(nextState, {\n peerMessagingDisabled: false\n });\n }\n Object.assign(nextState, {\n messageCount: topic.messageCount(),\n latestClearId: topic.maxClearId(),\n channel: topic.isChannelType()\n });\n\n if (nextProps.callTopic == topic.name && shouldPresentCallPanel(nextProps.callState)) {\n nextState.rtcPanel = nextProps.callTopic;\n }\n } else {\n // Invalid topic.\n Object.assign(nextState, {\n messageCount: 0,\n latestClearId: -1,\n onlineSubs: [],\n title: '',\n avatar: null,\n peerMessagingDisabled: false,\n channel: false\n });\n }\n } else {\n // We are still in same topic. Show the call panel if necessary.\n if (nextProps.callTopic == prevState.topic && !prevState.rtcPanel &&\n shouldPresentCallPanel(nextProps.callState)) {\n nextState.rtcPanel = nextProps.callTopic;\n }\n }\n\n if (nextProps.acs) {\n if (nextProps.acs.isWriter() != prevState.isWriter) {\n nextState.isWriter = !prevState.isWriter;\n }\n if (nextProps.acs.isReader() != prevState.isReader) {\n nextState.isReader = !prevState.isReader;\n }\n if (!nextProps.acs.isReader('given') != prevState.readingBlocked) {\n nextState.readingBlocked = !prevState.readingBlocked;\n }\n if (nextProps.acs.isSharer() != prevState.isSharer) {\n nextState.isSharer = !prevState.isSharer;\n }\n } else {\n if (prevState.isWriter) {\n nextState.isWriter = false;\n }\n if (prevState.isReader) {\n nextState.isReader = false;\n }\n if (!prevState.readingBlocked) {\n prevState.readingBlocked = true;\n }\n if (prevState.isSharer) {\n nextState.isSharer = false;\n }\n }\n\n if (isUnconfirmed(nextProps.acs) == !prevState.unconformed) {\n nextState.unconfirmed = !prevState.unconformed;\n }\n\n // Clear subscribers online when there is no connection.\n if (!nextProps.connected && prevState.onlineSubs && prevState.onlineSubs.length > 0) {\n nextState.onlineSubs = [];\n }\n\n return nextState;\n }\n\n subscribe(topic) {\n if (topic.isSubscribed() || !this.props.ready) {\n return;\n }\n\n // Is this a new topic?\n const newTopic = (this.props.newTopicParams && this.props.newTopicParams._topicName == this.props.topic);\n\n // Don't request the tags. They are useless unless the user\n // is the owner and is editing the topic.\n let getQuery = topic.startMetaQuery().withLaterDesc().withLaterSub();\n if (this.state.isReader || newTopic) {\n // Reading is either permitted or we don't know because it's a new topic. Ask for messages.\n getQuery = getQuery.withLaterData(MESSAGES_PAGE);\n if (this.state.isReader) {\n getQuery = getQuery.withLaterDel();\n }\n // And show \"loading\" spinner.\n this.setState({ fetchingMessages: true });\n }\n\n const setQuery = newTopic ? this.props.newTopicParams : undefined;\n topic.subscribe(getQuery.build(), setQuery)\n .then(ctrl => {\n if (ctrl.code == 303) {\n // Redirect to another topic requested.\n HashNavigation.navigateTo(HashNavigation.setUrlTopic('', ctrl.params.topic));\n return;\n }\n if (this.state.topic != ctrl.topic) {\n this.setState({topic: ctrl.topic});\n }\n this.props.onNewTopicCreated(this.props.topic, ctrl.topic);\n // If there are unsent messages (except video call messages),\n // try sending them now. Unsent video call messages will be dropped.\n let calls = [];\n topic.queuedMessages((pub) => {\n if (pub._sending) {\n return;\n }\n if (pub.head && pub.head.webrtc) {\n // Filter out unsent video call messages.\n calls.push(pub.seq);\n return;\n }\n if (topic.isSubscribed()) {\n this.retrySend(pub);\n }\n });\n if (calls.length > 0) {\n topic.delMessagesList(calls, true);\n }\n })\n .catch(err => {\n console.error(\"Failed subscription to\", this.state.topic, err);\n this.props.onError(err.message, 'err');\n const blankState = MessagesView.getDerivedStateFromProps({}, {});\n blankState.title = this.props.intl.formatMessage(messages.not_found);\n this.setState(blankState);\n });\n }\n\n leave(oldTopicName) {\n if (!oldTopicName || !this.props.tinode.isTopicCached(oldTopicName)) {\n return;\n }\n\n const oldTopic = this.props.tinode.getTopic(oldTopicName);\n if (oldTopic && oldTopic.isSubscribed()) {\n oldTopic.leave(false)\n .catch(_ => { /* do nothing here */ })\n .finally(_ => {\n // We don't care if the request succeeded or failed.\n // The topic is dead regardless.\n this.setState({fetchingMessages: false});\n oldTopic.onData = undefined;\n oldTopic.onAllMessagesReceived = undefined;\n oldTopic.onInfo = undefined;\n oldTopic.onMetaDesc = undefined;\n oldTopic.onSubsUpdated = undefined;\n oldTopic.onPres = undefined;\n });\n }\n }\n\n // Don't use React.createRef as the ref.current is not available in componentDidMount in this component.\n handleScrollReference(node) {\n if (node) {\n node.addEventListener('scroll', this.handleScrollEvent);\n this.messagesScroller = node;\n this.messagesScroller.scrollTop = this.messagesScroller.scrollHeight - this.state.scrollPosition;\n }\n }\n\n // Get older messages and show/hide [go to latest message] button.\n handleScrollEvent(event) {\n const pos = event.target.scrollHeight - event.target.scrollTop - event.target.offsetHeight;\n this.setState({\n scrollPosition: pos,\n // Show [go to latest message] if far enough from bottom and scrolling down.\n showGoToLastButton: (pos > SHOW_GO_TO_LAST_DIST) && (pos < this.state.scrollPosition),\n });\n\n if (this.state.fetchingMessages) {\n return;\n }\n\n if (event.target.scrollTop <= 0) {\n const topic = this.props.tinode.getTopic(this.state.topic);\n if (topic && topic.isSubscribed() && topic.msgHasMoreMessages()) {\n this.setState({fetchingMessages: true}, _ => {\n topic.getMessagesPage(MESSAGES_PAGE)\n .catch(err => this.props.onError(err.message, 'err'))\n .finally(_ => this.setState({fetchingMessages: false}));\n });\n }\n }\n }\n\n /* Mound draf and drop events */\n mountDnDEvents(dnd) {\n if (dnd) {\n dnd.addEventListener('dragenter', this.handleDragIn);\n dnd.addEventListener('dragleave', this.handleDragOut);\n dnd.addEventListener('dragover', this.handleDrag);\n dnd.addEventListener('drop', this.handleDrop);\n this.dndRef = dnd;\n }\n }\n\n goToLatestMessage() {\n this.setState({scrollPosition: 0});\n if (this.messagesScroller) {\n this.messagesScroller.scrollTop = this.messagesScroller.scrollHeight;\n }\n }\n\n handleDescChange(desc) {\n if (desc.public) {\n this.setState({\n title: desc.public.fn,\n avatar: makeImageUrl(desc.public.photo)\n });\n } else {\n this.setState({\n title: '',\n avatar: null\n });\n }\n\n if (desc.acs) {\n this.setState({\n isWriter: desc.acs.isWriter(),\n isReader: desc.acs.isReader(),\n readingBlocked: !desc.acs.isReader('given'),\n unconfirmed: isUnconfirmed(desc.acs),\n });\n }\n }\n\n postReadNotification(seq) {\n // Ignore notifications if the app is invisible.\n if (!this.props.applicationVisible) {\n return;\n }\n\n // Set up the timer if it's not running already.\n if (!this.readNotificationTimer) {\n this.readNotificationTimer = setInterval(_ => {\n if (this.readNotificationQueue.length == 0) {\n // Shut down the timer if the queue is empty.\n clearInterval(this.readNotificationTimer);\n this.readNotificationTimer = null;\n return;\n }\n\n let seq = -1;\n while (this.readNotificationQueue.length > 0) {\n const n = this.readNotificationQueue[0];\n if (n.topicName != this.state.topic) {\n // Topic has changed. Drop the notification.\n this.readNotificationQueue.shift();\n continue;\n }\n\n const now = new Date();\n if (n.sendAt <= now) {\n // Remove expired notification from queue.\n this.readNotificationQueue.shift();\n seq = Math.max(seq, n.seq);\n } else {\n break;\n }\n }\n\n // Send only one notification for the whole batch of messages.\n if (seq >= 0) {\n const topic = this.props.tinode.getTopic(this.state.topic);\n if (topic) {\n topic.noteRead(seq);\n }\n }\n }, NOTIFICATION_EXEC_INTERVAL);\n }\n\n const now = new Date();\n this.readNotificationQueue.push({\n topicName: this.state.topic,\n seq: seq,\n sendAt: now.setMilliseconds(now.getMilliseconds() + READ_DELAY)\n });\n }\n\n // Clear notification queue and timer.\n clearNotificationQueue() {\n this.readNotificationQueue = [];\n if (this.readNotificationTimer) {\n clearInterval(this.readNotificationTimer);\n this.readNotificationTimer = null;\n }\n }\n\n handleSubsUpdated() {\n if (this.state.topic) {\n const subs = [];\n const topic = this.props.tinode.getTopic(this.state.topic);\n topic.subscribers((sub) => {\n if (sub.online && sub.user != this.props.myUserId) {\n subs.push(sub);\n }\n });\n const newState = {onlineSubs: subs};\n const peer = topic.p2pPeerDesc();\n if (peer) {\n Object.assign(newState, {\n peerMessagingDisabled: isPeerRestricted(peer.acs)\n });\n } else if (this.state.peerMessagingDisabled) {\n Object.assign(newState, {\n peerMessagingDisabled: false\n });\n }\n this.setState(newState);\n }\n }\n\n // The 'msg' could be false-ish if some message ranges were deleted.\n handleMessageUpdate(msg) {\n const topic = this.props.tinode.getTopic(this.state.topic);\n if (!msg) {\n // msg could be null if one or more messages were deleted.\n // Updating state to force redraw.\n this.setState({latestClearId: topic.maxClearId()});\n return;\n }\n\n clearTimeout(this.keyPressTimer)\n this.setState({messageCount: topic.messageCount(), typingIndicator: false}, _ => {\n // Scroll to the bottom if the message is added to the end of the message\n // list if already at the bottom, otherwise show [go to latest] button.\n // Implemented as a callback to be sure the scroll height has been updated.\n if (topic.isNewMessage(msg.seq)) {\n if (this.state.scrollPosition > SHOW_GO_TO_LAST_DIST) {\n this.setState({showGoToLastButton: true});\n } else {\n this.goToLatestMessage();\n }\n }\n });\n\n // Aknowledge messages except own messages. They are\n // automatically assumed to be read and recived.\n const status = topic.msgStatus(msg, true);\n if (status >= Tinode.MESSAGE_STATUS_SENT && msg.from != this.props.myUserId) {\n this.postReadNotification(msg.seq);\n }\n }\n\n handleAllMessagesReceived(count) {\n this.setState({fetchingMessages: false});\n if (count > 0) {\n // 0 means \"latest\".\n this.postReadNotification(0);\n }\n }\n\n handleInfoReceipt(info) {\n switch (info.what) {\n case 'kp': {\n clearTimeout(this.keyPressTimer);\n this.keyPressTimer = setTimeout(_ => this.setState({typingIndicator: false}), KEYPRESS_DELAY + 1000);\n if (!this.state.typingIndicator) {\n this.setState({typingIndicator: true});\n }\n break;\n }\n case 'read':\n case 'recv':\n // Redraw due to changed recv/read status.\n this.forceUpdate();\n break;\n default:\n console.info(\"Other change in topic: \", info.what);\n }\n }\n\n handleExpandMedia(content) {\n if (!content) {\n return;\n }\n\n if (content.video) {\n this.setState({ videoPostview: content });\n } else {\n this.setState({ imagePostview: content });\n }\n }\n\n handleClosePreview() {\n if (this.state.imagePreview && this.state.imagePreview.url) {\n URL.revokeObjectURL(this.state.imagePreview.url);\n }\n if (this.state.videoPreview && this.state.videoPreview.url) {\n URL.revokeObjectURL(this.state.videoPreview.url);\n }\n this.setState({ imagePostview: null, imagePreview: null, docPreview: null, videoPreview: null, videoPostview: null});\n }\n\n handleFormResponse(action, text, data) {\n if (action == 'pub') {\n this.sendMessage(Drafty.attachJSON(Drafty.parse(text), data));\n } else if (action == 'url') {\n const url = new URL(data.ref);\n const params = url.searchParams;\n for (let key in data.resp) {\n if (data.resp.hasOwnProperty(key)) {\n params.set(key, data.resp[key]);\n }\n }\n ['name', 'seq'].map((key) => {\n if (data[key]) {\n params.set(key, data[key]);\n }\n });\n params.set('uid', this.props.myUserId);\n params.set('topic', this.state.topic);\n url.search = params;\n window.open(url, '_blank');\n } else {\n console.info(\"Unknown action in form\", action);\n }\n }\n\n handleContextClick(e) {\n e.preventDefault();\n e.stopPropagation();\n this.props.showContextMenu({ topicName: this.state.topic, y: e.pageY, x: e.pageX });\n }\n\n handleShowMessageContextMenu(params, messageSpecificMenuItems) {\n if (params.userFrom == 'chan') {\n params.userFrom = this.state.topic;\n params.userName = this.state.title;\n }\n params.topicName = this.state.topic;\n const menuItems = messageSpecificMenuItems || [];\n const topic = this.props.tinode.getTopic(params.topicName);\n if (topic) {\n if (!topic.isChannelType()) {\n menuItems.push('message_delete');\n }\n const acs = topic.getAccessMode();\n if (acs && acs.isDeleter()) {\n menuItems.push('message_delete_hard');\n }\n }\n this.props.showContextMenu(params, menuItems);\n }\n\n handleNewChatAcceptance(action) {\n this.props.onNewChat(this.state.topic, action);\n }\n\n handleEnablePeer(e) {\n e.preventDefault();\n this.props.onChangePermissions(this.state.topic, DEFAULT_P2P_ACCESS_MODE, this.state.topic);\n }\n\n sendKeyPress(audio) {\n const topic = this.props.tinode.getTopic(this.state.topic);\n if (topic.isSubscribed()) {\n if (audio) {\n topic.noteRecording(true);\n } else {\n topic.noteKeyPress();\n }\n }\n }\n\n // sendMessage sends the message with an optional subscription to topic first.\n sendMessage(msg, uploadCompletionPromise, uploader) {\n let head;\n if (this.props.forwardMessage) {\n // We are forwarding a message.\n msg = this.props.forwardMessage.msg;\n head = this.props.forwardMessage.head;\n this.handleCancelReply();\n } else if (this.state.reply) {\n if (this.state.reply.editing) {\n if (msg == this.state.contentToEdit) {\n // Message unchanged.\n this.handleCancelReply();\n return;\n }\n // Editing an existing message.\n head = {replace: ':' + this.state.reply.seq};\n } else if (this.state.reply.content) {\n // Replying to a message in this topic.\n // Turn it into Drafty so we can make a quoted Drafty object later.\n head = {reply: '' + this.state.reply.seq};\n if (typeof msg == 'string') {\n msg = Drafty.parse(msg);\n }\n msg = Drafty.append(Drafty.sanitizeEntities(this.state.reply.content), msg);\n }\n this.handleCancelReply();\n }\n this.props.sendMessage(msg, uploadCompletionPromise, uploader, head);\n }\n\n // Retry sending a message.\n retrySend(pub) {\n this.props.sendMessage(pub.content, undefined, undefined, pub.head)\n .then(_ => {\n // All good. Remove the original message draft from the cache.\n const topic = this.props.tinode.getTopic(this.state.topic);\n topic.delMessagesList([pub.seq], true);\n });\n }\n\n // Send attachment as Drafty message:\n // - if file is too large, upload it and send a s link.\n // - if file is small enough, just send it in-band.\n sendFileAttachment(file) {\n // Server-provided limit reduced for base64 encoding and overhead.\n const maxInbandAttachmentSize = (this.props.tinode.getServerParam('maxMessageSize',\n MAX_INBAND_ATTACHMENT_SIZE) * 0.75 - 1024) | 0;\n\n if (file.size > maxInbandAttachmentSize) {\n // Too large to send inband - uploading out of band and sending as a link.\n const uploader = this.props.tinode.getLargeFileHelper();\n if (!uploader) {\n this.props.onError(this.props.intl.formatMessage(messages.cannot_initiate_upload));\n return;\n }\n const uploadCompletionPromise = uploader.upload(file);\n const msg = Drafty.attachFile(null, {\n mime: file.type,\n filename: file.name,\n size: file.size,\n urlPromise: uploadCompletionPromise\n });\n // Pass data and the uploader to the TinodeWeb.\n this.sendMessage(msg, uploadCompletionPromise, uploader);\n } else {\n // Small enough to send inband.\n fileToBase64(file)\n .then(b64 => this.sendMessage(Drafty.attachFile(null, {\n mime: b64.mime,\n data: b64.bits,\n filename: b64.name,\n size: file.size\n })))\n .catch(err => this.props.onError(err.message, 'err'));\n }\n }\n\n // handleAttachFile method is called when [Attach file] button is clicked: launch attachment preview.\n handleAttachFile(file) {\n const maxExternAttachmentSize = this.props.tinode.getServerParam('maxFileUploadSize', MAX_EXTERN_ATTACHMENT_SIZE);\n\n if (file.size > maxExternAttachmentSize) {\n // Too large.\n this.props.onError(this.props.intl.formatMessage(messages.file_attachment_too_large,\n {size: bytesToHumanSize(file.size), limit: bytesToHumanSize(maxExternAttachmentSize)}), 'err');\n } else {\n this.setState({\n docPreview: {\n file: file,\n name: file.name,\n size: file.size,\n type: file.type\n }\n });\n }\n }\n\n handleCallHangup(topic, seq) {\n this.props.onVideoCallClosed();\n this.setState({\n rtcPanel: null\n });\n this.props.onCallHangup(topic, seq);\n }\n\n // sendImageAttachment sends the image bits as Drafty message.\n sendImageAttachment(caption, blob) {\n const mime = this.state.imagePreview.mime;\n const width = this.state.imagePreview.width;\n const height = this.state.imagePreview.height;\n const fname = this.state.imagePreview.filename;\n\n // Server-provided limit reduced for base64 encoding and overhead.\n const maxInbandAttachmentSize = (this.props.tinode.getServerParam('maxMessageSize',\n MAX_INBAND_ATTACHMENT_SIZE) * 0.75 - 1024) | 0;\n\n if (blob.size > maxInbandAttachmentSize) {\n // Too large to send inband - uploading out of band and sending as a link.\n const uploader = this.props.tinode.getLargeFileHelper();\n if (!uploader) {\n this.props.onError(this.props.intl.formatMessage(messages.cannot_initiate_upload));\n return;\n }\n const uploadCompletionPromise = uploader.upload(blob);\n\n // Make small preview to show while uploading.\n imageScaled(blob, IMAGE_PREVIEW_DIM, IMAGE_PREVIEW_DIM, -1, false)\n // Convert tiny image into base64 for serialization and previewing.\n .then(scaled => blobToBase64(scaled.blob))\n .then(b64 => {\n let msg = Drafty.insertImage(null, 0, {\n mime: mime,\n _tempPreview: b64.bits, // This preview will not be serialized.\n bits: b64.bits, // Image thumbnail.\n width: width,\n height: height,\n filename: fname,\n size: blob.size,\n urlPromise: uploadCompletionPromise\n });\n if (caption) {\n msg = Drafty.appendLineBreak(msg);\n msg = Drafty.append(msg, Drafty.parse(caption));\n }\n // Pass data and the uploader to the TinodeWeb.\n this.sendMessage(msg, uploadCompletionPromise, uploader);\n })\n .catch(err => this.props.onError(err, 'err'));\n return;\n }\n\n // Send the image inband if it's not too big. The image has been scaled already\n // in image preview.\n blobToBase64(blob)\n .then(b64 => {\n let msg = Drafty.insertImage(null, 0, {\n mime: b64.mime,\n bits: b64.bits,\n width: width,\n height: height,\n filename: fname,\n size: blob.size\n });\n if (caption) {\n msg = Drafty.appendLineBreak(msg);\n msg = Drafty.append(msg, Drafty.parse(caption));\n }\n this.sendMessage(msg);\n });\n }\n\n // sendVideoAttachment sends the video bits as Drafty message.\n sendVideoAttachment(caption, videoBlob, previewBlob, params) {\n const width = params.width;\n const height = params.height;\n\n // Server-provided limit reduced for base64 encoding and overhead.\n const maxInbandAttachmentSize = (this.props.tinode.getServerParam('maxMessageSize',\n MAX_INBAND_ATTACHMENT_SIZE) * 0.75 - 1024) | 0;\n\n const uploads = [];\n let uploader;\n if ((videoBlob.size + previewBlob.size) > maxInbandAttachmentSize) {\n // One or both are too large to send inband. Uploading out of band and sending as a link.\n uploader = this.props.tinode.getLargeFileHelper();\n if (!uploader) {\n this.props.onError(this.props.intl.formatMessage(messages.cannot_initiate_upload));\n return;\n }\n\n uploads[0] = videoBlob.size > maxInbandAttachmentSize * 0.675 ? uploader.upload(videoBlob) : null;\n uploads[1] = previewBlob.size > maxInbandAttachmentSize * 0.275 ? uploader.upload(previewBlob) : null;\n }\n\n if (uploads.length == 0) {\n // Both video and preview are small enough to send inband.\n Promise.all([blobToBase64(videoBlob), blobToBase64(previewBlob)])\n .then(b64s => {\n const [v64, i64] = b64s;\n let msg = Drafty.insertVideo(null, 0, {\n mime: v64.mime,\n bits: v64.bits,\n preview: i64.bits,\n premime: i64.mime,\n width: width,\n height: height,\n duration: params.duration,\n filename: params.name,\n size: videoBlob.size\n });\n if (caption) {\n msg = Drafty.appendLineBreak(msg);\n msg = Drafty.append(msg, Drafty.parse(caption));\n }\n this.sendMessage(msg);\n });\n return;\n }\n\n const uploadCompletionPromise = Promise.all(uploads);\n\n const b64conv = [];\n // Small video converted to base64.\n b64conv[0] = uploads[0] ? null : blobToBase64(videoBlob);\n // Full-size preview fits inline.\n b64conv[1] = uploads[1] ? null : imageScaled(previewBlob, MAX_IMAGE_DIM, MAX_IMAGE_DIM, -1, false)\n .then(scaled => blobToBase64(scaled.blob));\n // Small preview to show while uploading.\n b64conv[2] = imageScaled(previewBlob, VIDEO_PREVIEW_DIM, VIDEO_PREVIEW_DIM, -1, false)\n .then(scaled => blobToBase64(scaled.blob));\n Promise.all(b64conv)\n // Convert tiny image into base64 for serialization and previewing.\n .then(b64s => {\n const [video, img, preview] = b64s;\n let msg = Drafty.insertVideo(null, 0, {\n mime: params.mime,\n bits: video ? video.bits : null,\n _tempPreview: preview.bits,\n preview: img ? img.bits : preview.bits,\n premime: img ? img.mime : preview.mime,\n width: width,\n height: height,\n duration: params.duration,\n filename: params.name,\n size: videoBlob.size,\n urlPromise: uploadCompletionPromise\n });\n if (caption) {\n msg = Drafty.appendLineBreak(msg);\n msg = Drafty.append(msg, Drafty.parse(caption));\n }\n // Pass data and the uploader to the TinodeWeb.\n this.sendMessage(msg, uploadCompletionPromise, uploader);\n })\n .catch(err => this.props.onError(err.message, 'err'));\n }\n\n // handleAttachImageOrVideo method is called when [Attach image or video] button is clicked: launch image or video preview.\n handleAttachImageOrVideo(file) {\n const maxExternAttachmentSize = this.props.tinode.getServerParam('maxFileUploadSize', MAX_EXTERN_ATTACHMENT_SIZE);\n\n if (file.type.startsWith('video/')) {\n this.setState({videoPreview: {\n url: URL.createObjectURL(file),\n blob: file,\n filename: file.name,\n size: file.size,\n mime: file.type\n }});\n return;\n }\n\n // Get image dimensions and size, optionally scale it down.\n imageScaled(file, MAX_IMAGE_DIM, MAX_IMAGE_DIM, maxExternAttachmentSize, false)\n .then(scaled => {\n this.setState({imagePreview: {\n url: URL.createObjectURL(scaled.blob),\n blob: scaled.blob,\n filename: scaled.name,\n width: scaled.width,\n height: scaled.height,\n size: scaled.blob.size,\n mime: scaled.mime\n }});\n }).catch(err => {\n this.props.onError(err.message, 'err');\n });\n }\n\n // handleFileDrop is called when the user drags & drops a file upon the message view.\n handleFileDrop(files) {\n if (!files || files.length == 0) {\n return;\n }\n const file = files[0];\n if (file.type && file.type.startsWith('image/')) {\n this.handleAttachImageOrVideo(file);\n } else {\n this.handleAttachFile(file);\n }\n }\n\n // sendAudioAttachment sends audio bits inband as Drafty message (no preview).\n sendAudioAttachment(url, preview, duration) {\n fetch(url)\n .then(result => result.blob())\n .then(blob => {\n // Server-provided limit reduced for base64 encoding and overhead.\n const maxInbandAttachmentSize = this.props.tinode.getServerParam('maxMessageSize', MAX_INBAND_ATTACHMENT_SIZE) * 0.75 - 1024;\n if (blob.size > maxInbandAttachmentSize) {\n // Too large to send inband - uploading out of band and sending as a link.\n const uploader = this.props.tinode.getLargeFileHelper();\n if (!uploader) {\n this.props.onError(this.props.intl.formatMessage(messages.cannot_initiate_upload));\n return;\n }\n const uploadCompletionPromise = uploader.upload(blob);\n const msg = Drafty.appendAudio(null, {\n mime: blob.type,\n size: blob.size,\n duration: duration,\n preview: preview,\n urlPromise: uploadCompletionPromise\n });\n // Pass data and the uploader to the TinodeWeb.\n this.sendMessage(msg, uploadCompletionPromise, uploader);\n } else {\n // Small enough to send inband.\n blobToBase64(blob)\n .then(b64 => {\n this.sendMessage(Drafty.appendAudio(null, {\n mime: b64.mime,\n bits: b64.bits,\n size: blob.size,\n duration: duration,\n preview: preview,\n }))\n })\n }\n })\n .catch(err => {this.props.onError(err.message, 'err')});;\n }\n\n handleCancelUpload(seq, uploader) {\n const topic = this.props.tinode.getTopic(this.state.topic);\n const found = topic.findMessage(seq);\n if (found) {\n found._cancelled = true;\n }\n uploader.cancel();\n }\n\n // seq: seq ID of the source message\n // context: message content.\n // senderId: UID of the sender of the source message.\n // senderName: full name of the sender of the original message.\n handlePickReply(seq, content, senderId, senderName) {\n if (!seq || !content) {\n this.setState({reply: null});\n return;\n }\n\n content = typeof content == 'string' ? Drafty.init(content) : content;\n if (Drafty.isValid(content)) {\n content = Drafty.replyContent(content, QUOTED_REPLY_LENGTH);\n } else {\n // /!\\ invalid content.\n content = Drafty.append(Drafty.init('\\u26A0 '),\n Drafty.wrapInto(this.props.intl.formatMessage(messages.invalid_content), 'EM'));\n }\n\n this.setState({\n reply: {\n content: Drafty.quote(senderName, senderId, content),\n seq: seq\n }\n });\n this.props.onCancelForwardMessage();\n }\n\n // seq: seq ID of the message to edit.\n // context: message content.\n handleEditMessage(seq, content) {\n if (!seq || !content) {\n this.setState({reply: null});\n return;\n }\n\n content = typeof content == 'string' ? Drafty.init(content) : content;\n const editable = Drafty.toMarkdown(content);\n if (Drafty.isValid(content)) {\n content = Drafty.replyContent(content, EDIT_PREVIEW_LENGTH);\n } else {\n // /!\\ invalid content.\n content = Drafty.append(Drafty.init('\\u26A0 '),\n Drafty.wrapInto(this.props.intl.formatMessage(messages.invalid_content), 'EM'));\n }\n\n this.setState({\n reply: {\n content: Drafty.quote(this.props.intl.formatMessage(messages.editing_message), null, content),\n seq: seq,\n editing: true\n },\n contentToEdit: editable\n });\n this.props.onCancelForwardMessage();\n }\n\n\n handleCancelReply() {\n this.setState({reply: null, contentToEdit: null});\n this.props.onCancelForwardMessage();\n }\n\n handleQuoteClick(replyToSeq) {\n const ref = this.getOrCreateMessageRef(replyToSeq);\n if (ref && ref.current) {\n ref.current.scrollIntoView({block: \"center\", behavior: \"smooth\"});\n ref.current.classList.add('flash');\n setTimeout(_ => {ref.current.classList.remove('flash')} , 1000);\n } else {\n console.error(\"Unresolved message ref\", replyToSeq);\n }\n }\n\n isDragEnabled() {\n return this.state.isWriter && !this.state.unconfirmed && !this.props.forwardMessage && !this.state.peerMessagingDisabled;\n }\n\n handleDrag(e) {\n e.preventDefault();\n e.stopPropagation();\n }\n\n handleDragIn(e) {\n e.preventDefault();\n e.stopPropagation();\n this.dragCounter++;\n if (e.dataTransfer.items && e.dataTransfer.items.length > 0) {\n this.setState({dragging: true});\n }\n }\n\n handleDragOut(e) {\n e.preventDefault();\n e.stopPropagation();\n this.dragCounter--;\n if (this.dragCounter <= 0) {\n this.setState({dragging: false});\n }\n }\n\n handleDrop(e) {\n e.preventDefault();\n e.stopPropagation();\n this.setState({dragging: false});\n if (this.isDragEnabled() && e.dataTransfer.files && e.dataTransfer.files.length > 0) {\n this.handleFileDrop(e.dataTransfer.files);\n e.dataTransfer.clearData();\n this.dragCounter = 0;\n }\n }\n\n render() {\n const {formatMessage} = this.props.intl;\n\n let component;\n if (this.props.hideSelf) {\n component = null;\n } else if (!this.state.topic) {\n component = (\n \n );\n } else {\n let component2;\n if (this.state.imagePreview) {\n // Preview image before sending.\n component2 = (\n \n );\n } else if (this.state.videoPreview) {\n // Preview video.\n component2 = (\n \n );\n } else if (this.state.imagePostview) {\n // Expand received image.\n component2 = (\n \n );\n } else if (this.state.videoPostview) {\n // Play received video.\n component2 = (\n \n );\n } else if (this.state.docPreview) {\n // Preview attachment before sending.\n component2 = (\n \n );\n } else if (this.state.rtcPanel) {\n component2 = (\n \n );\n } else {\n const topic = this.props.tinode.getTopic(this.state.topic);\n const isChannel = topic.isChannelType();\n const groupTopic = topic.isGroupType() && !isChannel;\n const icon_badges = [];\n if (topic.trusted) {\n if (topic.trusted.verified) {\n icon_badges.push({icon: 'verified', color: 'badge-inv'});\n }\n if (topic.trusted.staff) {\n icon_badges.push({icon: 'staff', color: 'badge-inv'});\n }\n if (topic.trusted.danger) {\n icon_badges.push({icon: 'dangerous', color: 'badge-inv'});\n }\n }\n\n const messageNodes = [];\n let previousFrom = null;\n let prevDate = null;\n let chatBoxClass = null;\n topic.messages((msg, prev, next, i) => {\n let nextFrom = next ? (next.from || 'chan') : null;\n\n let sequence = 'single';\n let thisFrom = msg.from || 'chan';\n if (thisFrom == previousFrom) {\n if (thisFrom == nextFrom) {\n sequence = 'middle';\n } else {\n sequence = 'last';\n }\n } else if (thisFrom == nextFrom) {\n sequence = 'first';\n }\n previousFrom = thisFrom;\n\n const isReply = !(thisFrom == this.props.myUserId);\n const deliveryStatus = topic.msgStatus(msg, true);\n\n let userFrom = thisFrom, userName, userAvatar;\n const user = topic.userDesc(thisFrom);\n if (user && user.public) {\n userName = user.public.fn;\n userAvatar = makeImageUrl(user.public.photo);\n }\n chatBoxClass = groupTopic ? 'chat-box group' : 'chat-box';\n\n // Ref for this chat message.\n const ref = this.getOrCreateMessageRef(msg.seq);\n let replyToSeq = msg.head ? parseInt(msg.head.reply) : null;\n if (!replyToSeq || isNaN(replyToSeq)) {\n replyToSeq = null;\n }\n\n if (msg.hi) {\n // Deleted message.\n messageNodes.push(\n \n );\n } else {\n const thisDate = new Date(msg.ts);\n // This message was sent on a different date than the previous.\n if (!prevDate || prevDate.toDateString() != thisDate.toDateString()) {\n messageNodes.push(\n \n );\n prevDate = thisDate;\n }\n messageNodes.push(\n \n );\n }\n });\n\n let lastSeen = null;\n if (isChannel) {\n lastSeen = formatMessage(messages.channel);\n } else {\n const cont = this.props.tinode.getMeTopic().getContact(this.state.topic);\n if (cont && Tinode.isP2PTopicName(cont.topic)) {\n if (cont.online) {\n lastSeen = formatMessage(messages.online_now);\n } else if (cont.seen) {\n lastSeen = formatMessage(messages.last_seen) + \": \" +\n shortDateFormat(cont.seen.when, this.props.intl.locale);\n // TODO: also handle user agent in c.seen.ua\n }\n }\n }\n const avatar = this.state.avatar || true;\n const online = this.state.deleted ? null :\n this.props.online ? 'online' + (this.state.typingIndicator ? ' typing' : '') : 'offline';\n\n const titleClass = 'panel-title' + (this.state.deleted ? ' deleted' : '');\n\n let messagesComponent = (\n <>\n \n
\n arrow_downward \n \n
\n {!this.state.isReader ?\n
\n {this.state.readingBlocked ?\n
\n \n
\n : null }\n
\n : null }\n
\n {this.state.peerMessagingDisabled && !this.state.unconfirmed ?\n : null}\n {this.state.unconfirmed ?\n \n :\n }\n >\n );\n\n component2 = (\n <>\n \n {this.props.displayMobile ?\n \n : null}\n \n {messagesComponent}\n {this.state.dragging && this.isDragEnabled() ?\n {formatMessage(messages.drag_file)}
\n : null}\n >\n );\n }\n component = {component2}
\n }\n return component;\n }\n};\n\nexport default injectIntl(MessagesView);\n","// The <- button to be displayed in title bars.\nimport React from 'react';\n\nexport default class ButtonBack extends React.PureComponent {\n render() {\n return (\n {e.preventDefault(); this.props.onBack();}}>\n arrow_back \n \n );\n }\n}\n","import React from 'react';\n\nexport default class MenuContacts extends React.PureComponent {\n render() {\n return (\n \n );\n }\n};\n","import React from 'react';\n\nexport default class MenuStart extends React.PureComponent {\n render() {\n return (\n \n );\n }\n};\n","import React from 'react';\n\nimport LetterTile from './letter-tile.jsx';\nimport ButtonBack from './button-back.jsx';\nimport ContactBadges from './contact-badges.jsx';\nimport MenuContacts from './menu-contacts.jsx';\nimport MenuStart from './menu-start.jsx';\n\nimport { sanitizeUrlForMime } from '../lib/utils.js';\n\nexport default class SideNavbar extends React.PureComponent {\n render() {\n const icon_badges = [];\n if (this.props.trustedBadges) {\n this.props.trustedBadges.map((b) => {\n icon_badges.push({icon: b, color: 'badge-inv'});\n });\n }\n let avatar = null;\n if (this.props.tinode) {\n avatar = this.props.tinode.authorizeURL(sanitizeUrlForMime(this.props.avatar, 'image'));\n }\n return (\n \n {this.props.onCancel ?
: null}\n {avatar ?\n
\n \n
\n :\n null}\n
{this.props.title}
\n {this.props.state === 'login' ?\n
:\n this.props.state === 'contacts' ?\n
:\n null}\n
\n );\n }\n};\n","// Enter one credential at a time.\n\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\nimport PhoneEdit from './phone-edit.jsx';\nimport { parsePhoneNumber } from 'libphonenumber-js/mobile';\n\nexport default class CredentialEdit extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.state = {\n tel: '',\n email: ''\n };\n\n this.handleSubmit = this.handleSubmit.bind(this);\n this.handleEmailChange = this.handleEmailChange.bind(this);\n this.handlePhoneChange = this.handlePhoneChange.bind(this);\n }\n\n formatPhoneNumber(raw) {\n const number = parsePhoneNumber(raw);\n return number ? number.formatInternational() : raw;\n }\n\n handleEmailChange(e) {\n this.setState({email: e.target.value});\n }\n\n handlePhoneChange(number) {\n console.log(\"handlePhoneChange\", number);\n this.setState({tel: number});\n }\n\n handleSubmit(e) {\n e.preventDefault();\n const value = this.props.method == 'email' ? this.state.email : this.state.tel;\n console.log(\"handleSubmit\", value);\n if (value) {\n this.props.onSubmit(value);\n }\n }\n\n render() {\n return ();\n }\n}\n","// Edit account parameters.\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\nimport { parsePhoneNumber } from 'libphonenumber-js/mobile';\n\nimport AvatarUpload from '../widgets/avatar-upload.jsx';\nimport BadgeList from '../widgets/badge-list.jsx';\n\nimport { makeImageUrl } from '../lib/blob-helpers.js';\nimport { MAX_TITLE_LENGTH, MAX_TOPIC_DESCRIPTION_LENGTH } from '../config.js';\nimport CredentialEdit from '../widgets/credential-edit.jsx';\n\nfunction _clip(str, length) {\n return str && str.substring(0, length);\n}\n\nexport default class AccountSettingsView extends React.Component {\n constructor(props) {\n super(props);\n\n const me = this.props.tinode.getMeTopic();\n this.state = {\n fullName: _clip(me.public ? me.public.fn : undefined, MAX_TITLE_LENGTH),\n description: _clip(me.public ? me.public.note : undefined, MAX_TOPIC_DESCRIPTION_LENGTH),\n avatar: makeImageUrl(me.public ? me.public.photo : null),\n credentials: me.getCredentials() || [],\n credEdit: undefined\n };\n\n this.handleEditCred = this.handleEditCred.bind(this);\n }\n\n handleEditCred(cred) {\n console.log(\"Start editing cred\", cred);\n this.setState({credEdit: cred});\n }\n\n render() {\n if (this.state.credEdit) {\n return (\n {this.setState({credEdit: undefined}); console.log(\"Credential editing done\", cred)}}\n onCancel={_ => this.setState({credEdit: undefined})} />\n );\n }\n\n const credentials = [];\n this.state.credentials.forEach((cred, idx) => {\n if (!['email', 'tel'].includes(cred.meth)) {\n // Skip unknown methods.\n return ;\n }\n\n let val = cred.val\n if (cred.meth == 'tel') {\n const number = parsePhoneNumber(cred.val);\n val = number ? number.formatInternational() : cred.val;\n }\n\n credentials.push(\n \n {e.preventDefault(); this.handleEditCred(cred)}}>{val} \n {cred.done ? null : pending } \n
);\n });\n if (credentials.length > 0) {\n // Add title as the first element.\n credentials.unshift(\n \n \n );\n }\n\n return (\n \n );\n }\n};\n","/* ContactsView holds all contacts-related stuff */\nimport React from 'react';\nimport { FormattedMessage, defineMessages } from 'react-intl';\n\nimport ContactList from '../widgets/contact-list.jsx';\n\nimport { updateFavicon } from '../lib/utils.js';\n\nconst messages = defineMessages({\n archived_contacts_title: {\n id: \"archived_contacts\",\n defaultMessage: \"Archived contacts ({count})\",\n description: \"Label for archived chats\"\n }\n});\n\nexport default class ContactsView extends React.Component {\n constructor(props) {\n super(props);\n\n this.handleAction = this.handleAction.bind(this);\n\n this.state = ContactsView.deriveStateFromProps(props);\n }\n\n static deriveStateFromProps(props) {\n const contacts = [];\n let unreadThreads = 0;\n let archivedCount = 0;\n props.chatList.map((c) => {\n const blocked = c.acs && !c.acs.isJoiner();\n // Show only blocked contacts only when props.blocked == true.\n if (blocked && props.blocked) {\n contacts.push(c);\n }\n if (blocked || props.blocked) {\n return;\n }\n\n if (c.private && c.private.arch) {\n if (props.archive) {\n contacts.push(c);\n } else {\n archivedCount ++;\n }\n } else if (!props.archive) {\n contacts.push(c);\n unreadThreads += c.unread > 0 ? 1 : 0;\n }\n });\n\n contacts.sort((a, b) => {\n return (b.touched || 0) - (a.touched || 0);\n });\n\n if (archivedCount > 0) {\n contacts.push({\n action: 'archive',\n title: messages.archived_contacts_title,\n values: {count: archivedCount}\n });\n }\n\n return {\n contactList: contacts,\n unreadThreads: unreadThreads\n };\n }\n\n componentDidUpdate(prevProps, prevState) {\n if (prevProps.chatList != this.props.chatList ||\n prevProps.archive != this.props.archive ||\n prevProps.blocked != this.props.blocked) {\n const newState = ContactsView.deriveStateFromProps(this.props);\n this.setState(newState);\n if (newState.unreadThreads != prevState.unreadThreads) {\n updateFavicon(newState.unreadThreads);\n }\n }\n }\n\n handleAction(action_ignored) {\n this.props.onShowArchive();\n }\n\n render() {\n return (\n ¯∖_(ツ)_/¯\"\n description=\"HTML message shown in ContactList when no contacts are found\">{\n (no_contacts) => \n } \n );\n }\n};\n","// Helper functions for storing values in localStorage.\n// By default localStorage can store only strings, not objects or other types.\n\nexport default class LocalStorageUtil {\n // Replace old object with the new one.\n static setObject(key, value) {\n localStorage.setItem(key, JSON.stringify(value));\n }\n\n // Get stored object.\n static getObject(key) {\n const value = localStorage.getItem(key);\n return value && JSON.parse(value);\n }\n\n // Partially or wholly update stored object.\n static updateObject(key, value) {\n const oldVal = this.getObject(key);\n this.setObject(key, Object.assign(oldVal || {}, value));\n }\n\n // Just a wrapper.\n static removeItem(key) {\n localStorage.removeItem(key);\n }\n}\n","// Account registration.\nimport React, { Suspense } from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport AvatarCrop from '../widgets/avatar-crop.jsx';\nimport AvatarUpload from '../widgets/avatar-upload.jsx';\nimport CheckBox from '../widgets/checkbox.jsx';\nconst PhoneEdit = React.lazy(_ => import('../widgets/phone-edit.jsx'));\nimport VisiblePassword from '../widgets/visible-password.jsx';\n\nimport LocalStorageUtil from '../lib/local-storage.js';\nimport { imageScaled, blobToBase64, makeImageUrl } from '../lib/blob-helpers.js';\nimport { theCard } from '../lib/utils.js';\n\nimport { AVATAR_SIZE, MAX_AVATAR_BYTES, MAX_EXTERN_ATTACHMENT_SIZE,\n MAX_TITLE_LENGTH } from '../config.js';\n\nexport default class CreateAccountView extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.state = {\n login: '',\n password: '',\n meth: '',\n email: '',\n tel: '',\n fn: '', // full/formatted name\n imageUrl: null,\n uploadUrl: null,\n newAvatar: null,\n newAvatarMime: null,\n buttonDisabled: false,\n saveToken: LocalStorageUtil.getObject('keep-logged-in')\n };\n\n this.handleLoginChange = this.handleLoginChange.bind(this);\n this.handlePasswordChange = this.handlePasswordChange.bind(this);\n this.handleEmailChange = this.handleEmailChange.bind(this);\n this.handlePhoneChange = this.handlePhoneChange.bind(this);\n this.handleFnChange = this.handleFnChange.bind(this);\n this.handleImageChanged = this.handleImageChanged.bind(this);\n this.handleToggleSaveToken = this.handleToggleSaveToken.bind(this);\n this.handleAvatarCropped = this.handleAvatarCropped.bind(this);\n this.handleAvatarCropCancel = this.handleAvatarCropCancel.bind(this);\n this.uploadAvatar = this.uploadAvatar.bind(this);\n this.handleSubmit = this.handleSubmit.bind(this);\n\n // Connection will trigger change by changing the this.props.serverVersion.\n props.tinode.connect()\n .catch(err => {\n this.props.onError(err.message, 'err');\n });\n }\n\n handleLoginChange(e) {\n this.setState({login: e.target.value});\n }\n\n handlePasswordChange(password) {\n this.setState({password: password});\n }\n\n handleEmailChange(e) {\n this.setState({meth: 'email', email: e.target.value});\n }\n\n handlePhoneChange(number) {\n this.setState({meth: 'tel', tel: number});\n }\n\n handleFnChange(e) {\n this.setState({fn: e.target.value});\n }\n\n handleImageChanged(mime, img) {\n this.setState({newAvatar: img, newAvatarMime: mime});\n }\n\n handleToggleSaveToken() {\n LocalStorageUtil.setObject('keep-logged-in', !this.state.saveToken);\n this.setState({saveToken: !this.state.saveToken});\n }\n\n handleSubmit(e) {\n e.preventDefault();\n this.props.onCreateAccount(\n this.state.login.trim(),\n this.state.password.trim(),\n theCard(this.state.fn.trim().substring(0, MAX_TITLE_LENGTH), this.state.uploadUrl),\n {\n 'meth': this.state.meth,\n 'val': this.state.meth == 'email' ?\n this.state.email :\n this.state.meth == 'tel' ? this.state.tel : null\n }\n );\n }\n\n // AvatarCropView calls this method when the user has cropped the image.\n handleAvatarCropped(mime, blob, width, height) {\n const url = blob ? URL.createObjectURL(blob) : null;\n this.setState({avatar: url, newAvatar: null, newAvatarMime: null});\n if (blob) {\n this.uploadAvatar(mime, blob, width, height);\n }\n }\n\n handleAvatarCropCancel() {\n this.setState({newAvatar: null, newAvatarMime: null});\n }\n\n // Utility method for converting cropped avatar blob to bytes for sending inband or\n // for uploading it to the server out of band.\n uploadAvatar(mime, blob, width, height) {\n const readyToUpload = image => {\n let {mime, blob} = image;\n this.setState({imageUrl: URL.createObjectURL(blob), buttonDisabled: true});\n if (blob.size > MAX_AVATAR_BYTES) {\n // Too large to send inband - uploading out of band and sending as a link.\n const uploader = this.props.tinode.getLargeFileHelper();\n uploader.upload(blob, 'newacc')\n .then(url => this.setState({uploadUrl: url}))\n .catch(err => this.props.onError(err.message, 'err'))\n .finally(_ => this.setState({buttonDisabled: false}));\n } else {\n // Convert blob to base64-encoded bits.\n blobToBase64(blob)\n .then(b64 => this.setState({uploadUrl: makeImageUrl({data: b64.bits, type: mime})}))\n .finally(_ => this.setState({buttonDisabled: false}));\n }\n };\n\n if (width > AVATAR_SIZE || height > AVATAR_SIZE || width != height) {\n // Avatar is not square or too large even after cropping. Shrink it and make square.\n imageScaled(blob, AVATAR_SIZE, AVATAR_SIZE, MAX_EXTERN_ATTACHMENT_SIZE, true)\n .then(scaled => readyToUpload(scaled))\n .catch(err => this.props.onError(err.message, 'err'));\n } else {\n readyToUpload({mime: mime, blob: blob, width: width, height: height});\n }\n }\n\n render() {\n if (this.state.newAvatar) {\n return (\n \n );\n }\n\n let submitClasses = 'primary';\n if (this.props.disabled) {\n submitClasses += ' disabled';\n }\n\n return (\n \n );\n }\n};\n","// Edit account parameters.\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport CheckBox from '../widgets/checkbox.jsx';\n\nexport default class EditAccountView extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.handleCheckboxClick = this.handleCheckboxClick.bind(this);\n }\n\n handleCheckboxClick(what, checked) {\n if (what == 'sound') {\n this.props.onToggleMessageSounds(checked);\n } else if (what == 'alert') {\n this.props.onTogglePushNotifications(checked);\n } else if (what == 'incognito') {\n this.props.onToggleIncognitoMode(checked);\n }\n }\n\n render() {\n return (\n \n
\n \n \n \n \n
\n
\n \n {this.props.desktopAlertsEnabled ?\n \n :\n \n }\n \n \n
\n
\n \n \n \n \n
\n
\n );\n }\n};\n","// Edit account parameters.\nimport React from 'react';\nimport { FormattedMessage, defineMessages, injectIntl } from 'react-intl';\n\nimport InPlaceEdit from '../widgets/in-place-edit.jsx';\nimport PermissionsEditor from '../widgets/permissions-editor.jsx';\n\nconst messages = defineMessages({\n delete_account: {\n id: 'delete_account',\n defaultMessage: 'Delete account',\n description: 'Title for delete account warning'\n },\n delete_account_warning: {\n id: 'delete_account_warning',\n defaultMessage: 'Are you sure you want to delete your account? It cannot be undone.',\n description: 'Warning message when deleting an account'\n }\n});\n\nclass AccSecurityView extends React.Component {\n constructor(props) {\n super(props);\n\n const me = this.props.tinode.getMeTopic();\n let blockedCount = 0;\n me.contacts((c) => {\n if (c.acs && !c.acs.isJoiner()) {\n blockedCount ++;\n }\n });\n const defacs = me.getDefaultAccess();\n this.state = {\n auth: defacs ? defacs.auth : null,\n anon: defacs ? defacs.anon : null,\n showPermissionEditorFor: undefined,\n blockedCount: blockedCount,\n };\n\n this.handlePasswordUpdate = this.handlePasswordUpdate.bind(this);\n this.handleLaunchPermissionsEditor = this.handleLaunchPermissionsEditor.bind(this);\n this.handleHidePermissionsEditor = this.handleHidePermissionsEditor.bind(this);\n this.handlePermissionsChanged = this.handlePermissionsChanged.bind(this);\n this.handleDeleteAccount = this.handleDeleteAccount.bind(this);\n }\n\n handlePasswordUpdate(pwd) {\n this.setState({password: pwd});\n this.props.onUpdatePassword(pwd);\n }\n\n handleLaunchPermissionsEditor(which) {\n this.setState({\n showPermissionEditorFor: which,\n editedPermissions: this.state[which]\n });\n }\n\n handleHidePermissionsEditor() {\n this.setState({showPermissionEditorFor: undefined});\n }\n\n handlePermissionsChanged(perm) {\n let defacs = {};\n defacs[this.state.showPermissionEditorFor] = perm;\n this.props.onUpdateAccountDesc('me', undefined, undefined, defacs);\n\n let newState = {showPermissionEditorFor: undefined};\n newState[this.state.showPermissionEditorFor] = perm;\n this.setState(newState);\n }\n\n handleDeleteAccount(e) {\n e.preventDefault();\n const {formatMessage} = this.props.intl;\n this.props.onShowAlert(\n formatMessage(messages.delete_account), // title\n formatMessage(messages.delete_account_warning), // content\n (_ => this.props.onDeleteAccount()), // onConfirm\n null, // use default text \"OK\"\n true, // Show Reject button\n null // use default text \"Cancel\"\n );\n }\n\n render() {\n return (\n <>{this.state.showPermissionEditorFor ?\n \n :\n \n
\n
\n \n \n
\n {\n (password_unchanged) => \n } \n
\n
\n
\n
\n
\n
\n
\n \n \n \n
\n
\n
Auth: {this.state.auth}
\n
Anon: {this.state.anon}
\n
\n
\n {this.state.blockedCount > 0 ?\n <>\n
\n
\n >\n : null }\n
\n }>\n );\n }\n};\n\nexport default injectIntl(AccSecurityView);\n","// Edit account parameters.\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport { Tinode } from 'tinode-sdk';\n\nimport { APP_NAME, LINK_CONTACT_US, LINK_PRIVACY_POLICY, LINK_TERMS_OF_SERVICE } from '../config.js';\n\nexport default class AccSupportView extends React.PureComponent {\n render() {\n return (\n \n
\n
\n
\n
\n \n {APP_NAME}\n
\n
\n \n {Tinode.getLibrary()}\n
\n
\n \n {this.props.serverVersion}\n
\n
\n \n {this.props.serverAddress}\n
\n
\n
\n );\n }\n};\n","// Login form.\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport CheckBox from '../widgets/checkbox.jsx';\nimport VisiblePassword from '../widgets/visible-password.jsx';\n\nexport default class LoginView extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = {\n login: props.login,\n password: '',\n hostName: props.serverAddress,\n saveToken: props.persist\n };\n this.handleLoginChange = this.handleLoginChange.bind(this);\n this.handlePasswordChange = this.handlePasswordChange.bind(this);\n this.handleToggleSaveToken = this.handleToggleSaveToken.bind(this);\n this.handleSubmit = this.handleSubmit.bind(this);\n }\n\n handleLoginChange(e) {\n this.setState({login: e.target.value});\n }\n\n handlePasswordChange(e) {\n this.setState({password: e.target.value});\n }\n\n handleToggleSaveToken() {\n this.props.onPersistenceChange(!this.state.saveToken);\n this.setState({saveToken: !this.state.saveToken});\n }\n\n handleSubmit(e) {\n e.preventDefault();\n this.props.onLogin(this.state.login.trim(), this.state.password.trim());\n }\n\n render() {\n let submitClasses = 'primary';\n if (this.props.disabled) {\n submitClasses += ' disabled';\n }\n\n return (\n \n );\n }\n};\n","import React from 'react';\nimport { FormattedMessage, defineMessages, injectIntl } from 'react-intl';\n\nconst messages = defineMessages({\n invalid_id: {\n id: 'error_invalid_id',\n defaultMessage: 'Invalid ID',\n description: 'Error message'\n }\n});\n\nclass NewTopicById extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.state = {\n groupId: '',\n };\n\n this.handleChange = this.handleChange.bind(this);\n this.handleKeyPress = this.handleKeyPress.bind(this);\n this.handleSubmit = this.handleSubmit.bind(this);\n }\n\n handleChange(e) {\n this.setState({groupId: e.target.value});\n }\n\n handleKeyPress(e) {\n if (e.key === 'Enter') {\n this.handleSubmit(e);\n }\n }\n\n handleSubmit(e) {\n e.preventDefault();\n if (this.state.groupId) {\n const name = this.state.groupId.trim();\n const prefix = name.substr(0, 3);\n if (name.length > 3 && ['usr', 'grp', 'chn'].includes(prefix)) {\n this.props.onSubmit(name);\n } else {\n this.props.onError(this.props.intl.formatMessage(messages.invalid_id), 'err');\n }\n }\n }\n\n render() {\n return (\n \n
\n {\n (prompt) => \n } \n
\n
\n \n \n \n
\n
\n );\n }\n};\n\nexport default injectIntl(NewTopicById);\n","import React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport AvatarCrop from './avatar-crop.jsx';\nimport AvatarUpload from './avatar-upload.jsx';\nimport CheckBox from './checkbox.jsx';\nimport TagManager from './tag-manager.jsx';\n\nimport { AVATAR_SIZE, MAX_AVATAR_BYTES, MAX_EXTERN_ATTACHMENT_SIZE, MAX_TITLE_LENGTH,\n MAX_TOPIC_DESCRIPTION_LENGTH } from '../config.js';\nimport { imageScaled, blobToBase64, makeImageUrl } from '../lib/blob-helpers.js';\n\nexport default class NewTopicGroup extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.fullName = React.createRef();\n\n this.state = {\n fullName: '', // full/formatted name\n private: '',\n description: '',\n imageUrl: null,\n tags: [],\n isChannel: false,\n newAvatar: null,\n newAvatarMime: null\n };\n\n this.handleFieldEdit = this.handleFieldEdit.bind(this);\n this.handleImageChanged = this.handleImageChanged.bind(this);\n this.handleAvatarCropped = this.handleAvatarCropped.bind(this);\n this.handleAvatarCropCancel = this.handleAvatarCropCancel.bind(this);\n this.uploadAvatar = this.uploadAvatar.bind(this);\n this.handleTagsChanged = this.handleTagsChanged.bind(this);\n this.handleChannelToggle = this.handleChannelToggle.bind(this);\n this.handleSubmit = this.handleSubmit.bind(this);\n }\n\n componentDidMount() {\n // this.fullName.current.focus();\n }\n\n handleFieldEdit(name, e) {\n this.setState({[name]: e.target.value || ''});\n }\n\n handleImageChanged(mime, img) {\n this.setState({newAvatar: img, newAvatarMime: mime});\n }\n\n handleAvatarCropped(mime, blob, width, height) {\n const url = blob ? URL.createObjectURL(blob) : null;\n this.setState({imageUrl: url, newAvatar: null, newAvatarMime: null});\n if (blob) {\n this.uploadAvatar(mime, blob, width, height);\n }\n }\n\n handleAvatarCropCancel() {\n this.setState({newAvatar: null, newAvatarMime: null});\n }\n\n // Utility method for converting cropped avatar blob to bytes for sending inband or\n // for uploading it to the server out of band.\n uploadAvatar(mime, blob, width, height) {\n const readyToUpload = image => {\n let {mime, blob} = image;\n if (blob.size > MAX_AVATAR_BYTES) {\n // Too large to send inband - uploading out of band and sending as a link.\n const uploader = this.props.tinode.getLargeFileHelper();\n uploader.upload(blob)\n .then(url => this.setState({imageUrl: url}))\n .catch(err => this.props.onError(err.message, 'err'));\n } else {\n // Convert blob to base64-encoded bits.\n blobToBase64(blob)\n .then(b64 => this.setState({imageUrl: makeImageUrl({data: b64.bits, type: mime})}));\n }\n };\n\n if (width > AVATAR_SIZE || height > AVATAR_SIZE || width != height) {\n // Avatar is not square or too large even after cropping. Shrink it and make square.\n imageScaled(blob, AVATAR_SIZE, AVATAR_SIZE, MAX_EXTERN_ATTACHMENT_SIZE, true)\n .then(scaled => readyToUpload(scaled))\n .catch(err => this.props.onError(err.message, 'err'));\n } else {\n readyToUpload({mime: mime, blob: blob, width: width, height: height});\n }\n }\n\n handleTagsChanged(tags) {\n this.setState({tags: tags});\n }\n\n handleChannelToggle() {\n this.setState({isChannel: !this.state.isChannel});\n }\n\n handleSubmit(e) {\n e.preventDefault();\n\n const fn = this.state.fullName.trim().substring(0, MAX_TITLE_LENGTH);\n const comment = this.state.private.trim().substring(0, MAX_TITLE_LENGTH);\n const description = this.state.description.trim().substring(0, MAX_TOPIC_DESCRIPTION_LENGTH);\n if (fn) {\n this.props.onSubmit(fn, description, this.state.imageUrl, comment, this.state.tags, this.state.isChannel);\n }\n }\n\n render() {\n if (this.state.newAvatar) {\n return (\n \n );\n }\n\n let submitClasses = 'primary';\n if (this.props.disabled) {\n submitClasses += ' disabled';\n }\n return (\n \n );\n }\n};\n","// Create new topic and invite users or send an invite.\nimport React from 'react';\nimport { FormattedMessage, defineMessages, injectIntl } from 'react-intl';\n\nimport { Tinode } from 'tinode-sdk';\n\nimport ContactList from '../widgets/contact-list.jsx';\nimport NewTopicById from '../widgets/new-topic-by-id.jsx';\nimport NewTopicGroup from '../widgets/new-topic-group.jsx';\nimport SearchContacts from '../widgets/search-contacts.jsx';\n\nimport HashNavigation from '../lib/navigation.js';\nimport { theCard } from '../lib/utils.js';\n\nconst messages = defineMessages({\n search_for_contacts: {\n id: \"search_for_contacts\",\n defaultMessage: \"Use search to find contacts\",\n description: \"Text shown in contacts view when user entered no search query.\"\n },\n search_no_results: {\n id: \"search_no_results\",\n defaultMessage: \"Search returned no results\",\n description: \"Text shown in contacts view when query returned no results.\"\n },\n search_placeholder: {\n id: \"search_placeholder\",\n defaultMessage: \"List like email:alice@example.com, tel:17025550003...\",\n description: \"Placeholder in contacts search field\"\n },\n});\n\nclass NewTopicView extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = {\n tabSelected: 'find',\n searchQuery: null\n };\n\n this.handleTabClick = this.handleTabClick.bind(this);\n this.handleSearchContacts = this.handleSearchContacts.bind(this);\n this.handleSearchResultSelected = this.handleSearchResultSelected.bind(this);\n this.handleNewGroupSubmit = this.handleNewGroupSubmit.bind(this);\n this.handleGroupByID = this.handleGroupByID.bind(this);\n }\n\n componentDidMount() {\n this.props.onInitFind();\n }\n\n handleTabClick(e) {\n e.preventDefault();\n HashNavigation.navigateTo(HashNavigation.addUrlParam(window.location.hash, 'tab', e.currentTarget.dataset.id));\n this.setState({tabSelected: e.currentTarget.dataset.id});\n }\n\n handleSearchContacts(query) {\n this.props.onSearchContacts(query);\n this.setState({searchQuery: Tinode.isNullValue(query) ? null : query});\n }\n\n handleSearchResultSelected(name) {\n if (this.state.tabSelected == 'find') {\n HashNavigation.navigateTo(HashNavigation.removeUrlParam(window.location.hash, 'tab'));\n this.props.onCreateTopic(name);\n }\n }\n\n handleNewGroupSubmit(name, description, dataUrl, priv, tags, isChannel) {\n HashNavigation.navigateTo(HashNavigation.removeUrlParam(window.location.hash, 'tab'));\n this.props.onCreateTopic(undefined,\n {public: theCard(name, dataUrl, null, description), private: priv, tags: tags}, isChannel);\n }\n\n handleGroupByID(topicName) {\n HashNavigation.navigateTo(HashNavigation.removeUrlParam(window.location.hash, 'tab'));\n this.props.onCreateTopic(topicName);\n }\n\n render() {\n const {formatMessage} = this.props.intl;\n const no_contacts_placeholder = formatMessage(this.state.searchQuery ?\n messages.search_no_results : messages.search_for_contacts);\n const search_placeholder = formatMessage(messages.search_placeholder);\n return (\n \n
\n {this.state.tabSelected === 'grp' ?\n
:\n this.state.tabSelected === 'byid' ?\n
:\n
\n \n \n
}\n
\n );\n }\n};\n\nexport default injectIntl(NewTopicView);\n","// A password reset form.\nimport React, { Suspense } from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nconst PhoneEdit = React.lazy(_ => import('../widgets/phone-edit.jsx'));\nimport VisiblePassword from '../widgets/visible-password.jsx';\n\nimport HashNavigation from '../lib/navigation.js';\n\nexport default class PasswordResetView extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.state = {\n tel: '',\n email: '',\n password: '',\n sent: false,\n haveCode: false,\n code: ''\n };\n\n this.handleSubmit = this.handleSubmit.bind(this);\n this.handleEmailChange = this.handleEmailChange.bind(this);\n this.handlePasswordChange = this.handlePasswordChange.bind(this);\n this.handleCodeChange = this.handleCodeChange.bind(this);\n this.handleShowCodeField = this.handleShowCodeField.bind(this);\n\n // Connection will trigger change by changing the this.props.serverVersion.\n props.tinode.connect()\n .catch(err => {\n this.props.onError(err.message, 'err');\n });\n }\n\n componentDidMount() {\n const parsed = HashNavigation.parseUrlHash(window.location.hash);\n this.setState({token: parsed.params.token, scheme: parsed.params.scheme});\n }\n\n handleSubmit(e) {\n e.preventDefault();\n if (this.state.token) {\n // Reset using token.\n this.props.onReset(this.state.password.trim(), {\n scheme: 'token',\n token: this.state.token\n });\n } else if (this.state.code && this.props.reqCredMethod) {\n // Reset using security code.\n // The secret is structured as ::, \"123456:email:alice@example.com\".\n const cred = this.state.email.trim() || this.state.tel.trim();\n this.props.onReset(this.state.password.trim(), {\n scheme: 'code',\n secret: `${this.state.code}:${this.props.reqCredMethod}:${cred}`\n });\n } else {\n const email = this.state.email.trim();\n const tel = this.state.tel.trim();\n this.setState({email: email, tel: tel});\n this.props.onRequest(this.props.reqCredMethod, email || tel).then(_ => this.setState({sent: true}));\n }\n }\n\n handleEmailChange(e) {\n this.setState({email: e.target.value});\n }\n\n handlePasswordChange(e) {\n this.setState({password: e.target.value});\n }\n\n handleCodeChange(e) {\n this.setState({code: e.target.value.replace(/[^\\d]/g, '')});\n }\n\n handleShowCodeField(e) {\n e.preventDefault();\n this.setState({haveCode: true});\n }\n\n render() {\n const showCredentialInput = !(this.state.token && this.state.scheme);\n const showPasswordInput = !showCredentialInput || this.state.haveCode || this.state.sent;\n\n const passwordInput = (<>\n \n \n \n {\n (placeholder) => \n } \n >);\n\n const emailInput = (<>\n {this.state.haveCode ?\n null :\n \n \n \n }\n {\n (placeholder) => \n } \n >);\n\n const phoneInput = (<>\n {this.state.haveCode ?\n null :\n \n \n
\n }\n \n \n \n \n
\n \n
}>\n this.setState({tel: number})} />\n \n \n >);\n\n const sentNotification = (<>{\n this.props.reqCredMethod == 'email' ?\n {this.state.email}}}\n description=\"Notification that the email with password reset instructions has been sent\" />\n : this.props.reqCredMethod == 'tel' ?\n {this.state.tel}}}\n description=\"Notification that the SMS with password reset instructions has been sent\" />\n :\n null\n }>);\n\n const codeInput = (<>\n \n \n \n \n
\n \n {\n (numbers_only) => \n } \n
\n >);\n\n const credentialInput = this.props.reqCredMethod == 'email' ?\n emailInput : this.props.reqCredMethod == 'tel' ? phoneInput : null;\n\n return (\n \n );\n }\n}\n","import React from 'react';\n\nimport { KNOWN_HOSTS } from '../config.js';\n\n/* Combobox for selecting host name */\n\nexport default class HostSelector extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.state = {\n hostName: props.serverAddress,\n changed: false\n };\n\n this.handleHostNameChange = this.handleHostNameChange.bind(this);\n this.handleEditingFinished = this.handleEditingFinished.bind(this);\n this.handleKeyDown = this.handleKeyDown.bind(this);\n }\n\n handleHostNameChange(e) {\n this.setState({hostName: e.target.value, changed: true});\n }\n\n handleEditingFinished() {\n if (this.state.changed) {\n this.setState({changed: false});\n this.props.onServerAddressChange(this.state.hostName.trim());\n }\n }\n\n handleKeyDown(e) {\n if (e.key == 'Enter') {\n this.handleEditingFinished();\n }\n }\n\n render() {\n var hostOptions = [];\n for (let key in KNOWN_HOSTS) {\n let item = KNOWN_HOSTS[key];\n hostOptions.push(\n \n );\n }\n return (\n \n \n \n {hostOptions}\n \n
\n );\n }\n}\n","// Tinode config panel.\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport CheckBox from '../widgets/checkbox.jsx';\n\nimport HostSelector from '../widgets/host-selector.jsx';\n\nexport default class SettingsView extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.state = {\n transport: props.transport || 'def',\n serverAddress: props.serverAddress,\n secureConnection: props.secureConnection,\n };\n\n this.handleSubmit = this.handleSubmit.bind(this);\n this.handleTransportSelected = this.handleTransportSelected.bind(this);\n this.handleServerAddressChange = this.handleServerAddressChange.bind(this);\n this.handleToggleSecure = this.handleToggleSecure.bind(this);\n }\n\n handleSubmit(e) {\n e.preventDefault();\n this.props.onUpdate({\n transport: this.state.transport,\n serverAddress: this.state.serverAddress,\n secureConnection: this.state.secureConnection,\n });\n }\n\n handleTransportSelected(e) {\n this.setState({transport: e.currentTarget.value});\n }\n\n handleServerAddressChange(name) {\n this.setState({serverAddress: name});\n }\n\n handleToggleSecure(e) {\n this.setState({secureConnection: !this.state.secureConnection});\n }\n\n render() {\n const names = {def: \"default\", ws: \"websocket\", lp: \"long polling\"};\n const transportOptions = [];\n ['def', 'ws', 'lp'].map((item) => {\n const id = 'transport-' + item;\n const name = names[item];\n transportOptions.push(\n \n \n {name} \n \n );\n });\n\n return (\n \n );\n }\n};\n","// ValidationView: panel for confirming credentials, like email or phone.\nimport React from 'react';\nimport { FormattedMessage, defineMessages, injectIntl } from 'react-intl';\n\nconst messages = defineMessages({\n phone: {\n id: 'phone_dative',\n defaultMessage: 'phone',\n description: \"Dative case of 'phone', i.e. 'phone' in 'by phone'\",\n },\n email: {\n id: 'email_dative',\n defaultMessage: 'email',\n description: \"Dative case of 'email', i.e. 'email' in 'by email'\",\n }\n});\n\nclass ValidationView extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.state = {\n code: props.credCode || '',\n codeReceived: props.credCode\n };\n\n this.handleChange = this.handleChange.bind(this);\n this.handleKeyPress = this.handleKeyPress.bind(this);\n this.handleSubmit = this.handleSubmit.bind(this);\n this.handleCancel = this.handleCancel.bind(this);\n }\n\n static getDerivedStateFromProps(nextProps, prevState) {\n if (nextProps.credCode != prevState.codeReceived) {\n return {\n code: nextProps.credCode || '',\n codeReceived: nextProps.credCode\n };\n }\n\n return prevState;\n }\n\n componentDidMount() {\n // Submit code automatically if it's received from the parent.\n if (this.props.credCode) {\n this.props.onSubmit(this.props.credMethod, this.props.credCode, this.props.credToken);\n }\n }\n\n componentDidUpdate(prevProps, prevState) {\n // Submit code automatically if it's received from the parent.\n if (this.state.codeReceived && this.state.code && this.state.code != prevState.code) {\n this.props.onSubmit(this.props.credMethod, this.state.code, this.props.credToken);\n }\n }\n\n\n handleChange(e) {\n this.setState({code: e.target.value.trim()});\n }\n\n handleKeyPress(e) {\n if (e.key === 'Enter') {\n this.handleSubmit(e);\n } else if (e.key == 'Escape') {\n this.handleCancel(e);\n }\n }\n\n handleSubmit(e) {\n e.preventDefault();\n if (this.state.code && this.state.code.trim()) {\n this.props.onSubmit(this.props.credMethod, this.state.code.trim(), this.props.credToken);\n }\n }\n\n handleCancel(e) {\n e.preventDefault();\n this.props.onCancel();\n }\n\n render() {\n const { formatMessage } = this.props.intl;\n const methods = {'email': formatMessage(messages.email), 'tel': formatMessage(messages.phone)};\n const method = methods[this.props.credMethod] || this.props.credMethod;\n return (\n \n
\n \n \n \n
\n
\n {\n (numbers_only) => \n } \n
\n
\n \n \n \n \n \n \n
\n
\n );\n }\n};\n\nexport default injectIntl(ValidationView);\n","import React from 'react';\nimport { defineMessages, injectIntl } from 'react-intl';\n\nimport ErrorPanel from '../widgets/error-panel.jsx';\nimport LoadSpinner from '../widgets/load-spinner.jsx';\nimport SideNavbar from '../widgets/side-navbar.jsx';\nimport TopicCommonView from './topic-common-view.jsx';\n\nimport AccountSettingsView from './account-settings-view.jsx';\nimport ContactsView from './contacts-view.jsx';\nimport CreateAccountView from './create-account-view.jsx';\nimport AccNotificationsView from './acc-notifications-view.jsx';\nimport AccSecurityView from './acc-security-view.jsx';\nimport AccSupportView from './acc-support-view.jsx';\nimport LoginView from './login-view.jsx';\nimport NewTopicView from './new-topic-view.jsx';\nimport PasswordResetView from './password-reset-view.jsx';\nimport SettingsView from './settings-view.jsx';\nimport ValidationView from './validation-view.jsx';\n\n// Panel titles for translation.\nconst messages = defineMessages({\n login: {\n id: 'sidepanel_title_login',\n description: 'Sidepanel title for LoginView.',\n defaultMessage: 'Sign In'\n },\n register: {\n id: 'sidepanel_title_register',\n description: 'Sidepanel title for CreateAccountView.',\n defaultMessage: 'Create Account'\n },\n settings: {\n id: 'sidepanel_title_settings',\n description: 'Sidepanel title for SettingsView.',\n defaultMessage: 'Settings'\n },\n edit: {\n id: 'sidepanel_title_account_settings',\n description: 'Sidepanel title for AccountSettingsView.',\n defaultMessage: 'Account Settings'\n },\n general: {\n id: 'panel_title_general',\n description: 'Title for TopicCommon.',\n defaultMessage: 'General'\n },\n security: {\n id: 'panel_title_security',\n description: 'Title for TopicSecirity and AccSecurity.',\n defaultMessage: 'Security'\n },\n crop: {\n id: 'panel_title_crop',\n description: 'Title for AvatarCropView.',\n defaultMessage: 'Drag to Adjust'\n },\n notif: {\n id: 'sidepanel_title_acc_notifications',\n description: 'Sidepanel title for AccNotificationsView.',\n defaultMessage: 'Notifications'\n },\n support: {\n id: 'sidepanel_title_acc_support',\n description: 'Sidepanel title for AccSupportView.',\n defaultMessage: 'Support'\n },\n newtpk: {\n id: 'sidepanel_title_newtpk',\n description: 'Sidepanel title for NewTopicView.',\n defaultMessage: 'Start New Chat'\n },\n cred: {\n id: 'sidepanel_title_cred',\n description: 'Sidepanel title for ValidationView.',\n defaultMessage: 'Confirm Credentials'\n },\n reset: {\n id: 'sidepanel_title_reset',\n description: 'Sidepanel title for PasswordResetView.',\n defaultMessage: 'Reset Password'\n },\n archive: {\n id: 'sidepanel_title_archive',\n description: 'Sidepanel title for ContactsView-Archive.',\n defaultMessage: 'Archived Chats'\n },\n blocked: {\n id: 'sidepanel_title_blocked',\n description: 'Sidepanel title for ContactsView-Blocked.',\n defaultMessage: 'Blocked Chats'\n }\n});\n\nclass SidepanelView extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.handleNewTopic = this.handleNewTopic.bind(this);\n }\n\n handleNewTopic() {\n this.props.onNavigate('newtpk');\n }\n\n render() {\n const {formatMessage} = this.props.intl;\n const view = this.props.state || (this.props.myUserId ? 'contacts' : 'login');\n\n let title, avatar, badges;\n if (view == 'contacts') {\n title = this.props.title;\n avatar = this.props.avatar ? this.props.avatar : true;\n badges = this.props.trustedBadges;\n } else {\n title = formatMessage(messages[view]);\n avatar = false;\n badges = null;\n }\n\n let onCancel;\n if (['login', 'contacts'].indexOf(view) == -1) {\n onCancel = this.props.onCancel;\n }\n\n return (\n \n
\n\n
\n\n
\n\n {view === 'login' ?\n
:\n\n view === 'register' ?\n
:\n\n view === 'settings' ?\n
:\n\n view === 'edit' ?\n
:\n\n (view === 'general' || view === 'crop') ?\n
:\n\n view === 'notif' ?\n
:\n\n view === 'security' ?\n
:\n\n view === 'support' ?\n
:\n\n (view === 'contacts' || view == 'archive' || view == 'blocked') ?\n
:\n\n view === 'newtpk' ?\n
:\n\n view === 'cred' ?\n
:\n\n view === 'reset' ?\n
:\n null}\n
\n );\n }\n};\n\nexport default injectIntl(SidepanelView);\n","import { KNOWN_HOSTS, DEFAULT_HOST } from '../config.js';\n\n// Detect server address from the URL\nexport function detectServerAddress() {\n let host = DEFAULT_HOST;\n if (typeof window.location == 'object') {\n if (window.location.protocol == 'file:' || window.location.hostname == 'localhost') {\n host = KNOWN_HOSTS.local;\n } else if (window.location.hostname) {\n host = window.location.hostname + (window.location.port ? ':' + window.location.port : '');\n }\n }\n return host;\n}\n\n// Detect if the page is served over HTTPS.\nexport function isSecureConnection() {\n if (typeof window.location == 'object') {\n return window.location.protocol == 'https:';\n }\n return false;\n}\n\nexport function isLocalHost() {\n if (typeof window.location == 'object') {\n return window.location.hostname == 'localhost';\n }\n return false;\n}\n","// The top-level class to hold all functionality together.\nimport React, { Suspense } from 'react';\nimport { FormattedMessage, defineMessages, injectIntl } from 'react-intl';\n\nimport { initializeApp as firebaseInitApp } from 'firebase/app';\nimport { getMessaging as firebaseGetMessaging, getToken as firebaseGetToken,\n deleteToken as firebaseDelToken, onMessage as firebaseOnMessage } from 'firebase/messaging';\n\nimport { Drafty, Tinode } from 'tinode-sdk';\n\nimport Alert from '../widgets/alert.jsx';\nimport ContextMenu from '../widgets/context-menu.jsx';\nimport ForwardDialog from '../widgets/forward-dialog.jsx';\nimport CallIncoming from '../widgets/call-incoming.jsx';\nconst PhoneCountrySelector = React.lazy(_ => import('../widgets/phone-country-selector.jsx'));\n\nimport InfoView from './info-view.jsx';\nimport MessagesView from './messages-view.jsx';\nimport SidepanelView from './sidepanel-view.jsx';\n\nimport { API_KEY, APP_NAME, DEFAULT_P2P_ACCESS_MODE, FORWARDED_PREVIEW_LENGTH, LOGGING_ENABLED,\n MEDIA_BREAKPOINT } from '../config.js';\nimport { CALL_STATE_NONE, CALL_STATE_OUTGOING_INITATED,\n CALL_STATE_INCOMING_RECEIVED, CALL_STATE_IN_PROGRESS,\n CALL_HEAD_STARTED } from '../constants.js';\nimport { PACKAGE_VERSION } from '../version.js';\nimport { base64ReEncode, makeImageUrl } from '../lib/blob-helpers.js';\nimport { detectServerAddress, isLocalHost, isSecureConnection } from '../lib/host-name.js';\nimport LocalStorageUtil from '../lib/local-storage.js';\nimport HashNavigation from '../lib/navigation.js';\nimport { secondsToTime } from '../lib/strformat.js'\nimport { updateFavicon } from '../lib/utils.js';\n\n// Sound to play on message received.\nconst POP_SOUND = new Audio('audio/msg.m4a');\n\nconst messages = defineMessages({\n reconnect_countdown: {\n id: 'reconnect_countdown',\n defaultMessage: 'Disconnected. Reconnecting in {seconds}…',\n description: 'Message shown when an app update is available.'\n },\n reconnect_now: {\n id: 'reconnect_now',\n defaultMessage: 'Try now',\n description: 'Prompt for reconnecting now'\n },\n push_init_failed: {\n id: 'push_init_failed',\n defaultMessage: 'Failed to initialize push notifications',\n description: 'Error message when push notifications have failed to initialize.'\n },\n invalid_security_token: {\n id: 'invalid_security_token',\n defaultMessage: 'Invalid security token',\n description: 'Error message when resetting password.'\n },\n no_connection: {\n id: 'no_connection',\n defaultMessage: 'No connection',\n description: 'Warning that the user is offline.'\n },\n code_doesnot_match: {\n id: 'code_doesnot_match',\n defaultMessage: 'Code does not match',\n description: 'Error message when the credential validation code is incorrect.'\n },\n menu_item_info: {\n id: 'menu_item_info',\n defaultMessage: 'Info',\n description: 'Show extended topic information'\n },\n menu_item_audio_call: {\n id: 'menu_item_audio_call',\n defaultMessage: 'Call',\n description: 'Start audio call'\n },\n menu_item_video_call: {\n id: 'menu_item_video_call',\n defaultMessage: 'Video call',\n description: 'Start video call'\n },\n cred_confirmed_successfully: {\n id: 'cred_confirmed_successfully',\n defaultMessage: 'Confirmed successfully',\n description: 'Message explaining that the credential was successfully validated.'\n }\n});\n\nclass TinodeWeb extends React.Component {\n constructor(props) {\n super(props);\n\n this.selfRef = React.createRef();\n\n this.state = this.getBlankState();\n\n this.handleResize = this.handleResize.bind(this);\n this.handleHashRoute = this.handleHashRoute.bind(this);\n this.handleOnline = this.handleOnline.bind(this);\n this.checkForAppUpdate = this.checkForAppUpdate.bind(this);\n this.handleVisibilityEvent = this.handleVisibilityEvent.bind(this);\n this.handleError = this.handleError.bind(this);\n this.handleLoginRequest = this.handleLoginRequest.bind(this);\n this.handlePersistenceChange = this.handlePersistenceChange.bind(this);\n this.handleConnected = this.handleConnected.bind(this);\n this.handleAutoreconnectIteration = this.handleAutoreconnectIteration.bind(this);\n this.doLogin = this.doLogin.bind(this);\n this.handleLoginSuccessful = this.handleLoginSuccessful.bind(this);\n this.handleDisconnect = this.handleDisconnect.bind(this);\n this.tnMeMetaDesc = this.tnMeMetaDesc.bind(this);\n this.tnMeContactUpdate = this.tnMeContactUpdate.bind(this);\n this.tnMeSubsUpdated = this.tnMeSubsUpdated.bind(this);\n this.resetContactList = this.resetContactList.bind(this);\n this.tnInitFind = this.tnInitFind.bind(this);\n this.tnFndSubsUpdated = this.tnFndSubsUpdated.bind(this);\n this.handleSearchContacts = this.handleSearchContacts.bind(this);\n this.handleTopicSelected = this.handleTopicSelected.bind(this);\n this.handleHideMessagesView = this.handleHideMessagesView.bind(this);\n this.handleSendMessage = this.handleSendMessage.bind(this);\n this.handleNewChatInvitation = this.handleNewChatInvitation.bind(this);\n this.handleNewAccount = this.handleNewAccount.bind(this);\n this.handleNewAccountRequest = this.handleNewAccountRequest.bind(this);\n this.handleUpdatePasswordRequest = this.handleUpdatePasswordRequest.bind(this);\n this.handleUpdateAccountTagsRequest = this.handleUpdateAccountTagsRequest.bind(this);\n this.handleToggleIncognitoMode = this.handleToggleIncognitoMode.bind(this);\n this.handleSettings = this.handleSettings.bind(this);\n this.handleGlobalSettings = this.handleGlobalSettings.bind(this);\n this.handleShowArchive = this.handleShowArchive.bind(this);\n this.handleShowBlocked = this.handleShowBlocked.bind(this);\n this.handleToggleMessageSounds = this.handleToggleMessageSounds.bind(this);\n this.handleCredAdd = this.handleCredAdd.bind(this);\n this.handleCredDelete = this.handleCredDelete.bind(this);\n this.handleCredConfirm = this.handleCredConfirm.bind(this);\n this.initFCMessaging = this.initFCMessaging.bind(this);\n this.toggleFCMToken = this.toggleFCMToken.bind(this);\n this.handlePushMessage = this.handlePushMessage.bind(this);\n this.handleSidepanelCancel = this.handleSidepanelCancel.bind(this);\n this.handleStartTopicRequest = this.handleStartTopicRequest.bind(this);\n this.handleNewTopicCreated = this.handleNewTopicCreated.bind(this);\n this.handleTopicUpdateRequest = this.handleTopicUpdateRequest.bind(this);\n this.handleUnarchive = this.handleUnarchive.bind(this);\n this.handleChangePermissions = this.handleChangePermissions.bind(this);\n this.handleTagsUpdateRequest = this.handleTagsUpdateRequest.bind(this);\n this.handleLogout = this.handleLogout.bind(this);\n this.handleDeleteAccount = this.handleDeleteAccount.bind(this);\n this.handleDeleteTopicRequest = this.handleDeleteTopicRequest.bind(this);\n this.handleDeleteMessagesRequest = this.handleDeleteMessagesRequest.bind(this);\n this.handleLeaveUnsubRequest = this.handleLeaveUnsubRequest.bind(this);\n this.handleBlockTopicRequest = this.handleBlockTopicRequest.bind(this);\n this.handleReportTopic = this.handleReportTopic.bind(this);\n this.handleShowContextMenu = this.handleShowContextMenu.bind(this);\n this.defaultTopicContextMenu = this.defaultTopicContextMenu.bind(this);\n this.handleHideContextMenu = this.handleHideContextMenu.bind(this);\n this.handleShowAlert = this.handleShowAlert.bind(this);\n this.handleShowInfoView = this.handleShowInfoView.bind(this);\n this.handleMemberUpdateRequest = this.handleMemberUpdateRequest.bind(this);\n this.handleValidateCredentialsRequest = this.handleValidateCredentialsRequest.bind(this);\n this.handlePasswordResetRequest = this.handlePasswordResetRequest.bind(this);\n this.handleResetPassword = this.handleResetPassword.bind(this);\n this.handleContextMenuAction = this.handleContextMenuAction.bind(this);\n this.handleShowCountrySelector = this.handleShowCountrySelector.bind(this);\n\n this.handleShowForwardDialog = this.handleShowForwardDialog.bind(this);\n this.handleHideForwardDialog = this.handleHideForwardDialog.bind(this);\n\n this.handleStartVideoCall = this.handleStartVideoCall.bind(this);\n this.handleStartAudioCall = this.handleStartAudioCall.bind(this);\n this.handleInfoMessage = this.handleInfoMessage.bind(this);\n this.handleDataMessage = this.handleDataMessage.bind(this);\n this.handleCallClose = this.handleCallClose.bind(this);\n\n this.handleCallInvite = this.handleCallInvite.bind(this);\n this.handleCallRinging = this.handleCallRinging.bind(this);\n this.handleCallHangup = this.handleCallHangup.bind(this);\n this.handleCallSendOffer = this.handleCallSendOffer.bind(this);\n this.handleCallIceCandidate = this.handleCallIceCandidate.bind(this);\n this.handleCallSendAnswer = this.handleCallSendAnswer.bind(this);\n\n this.handleCallAccept = this.handleCallAccept.bind(this);\n\n this.sendMessageToTopic = this.sendMessageToTopic.bind(this);\n\n // FIXME: this is unused.\n this.callTimeoutTimer = null;\n }\n\n getBlankState() {\n const settings = LocalStorageUtil.getObject('settings') || {};\n const persist = !!LocalStorageUtil.getObject('keep-logged-in');\n\n return {\n connected: false,\n // Connected and subscribed to 'me'\n ready: false,\n // Try to re-login on new connection.\n autoLogin: false,\n transport: settings.transport || null,\n serverAddress: settings.serverAddress || detectServerAddress(),\n secureConnection: settings.secureConnection === undefined ?\n isSecureConnection() : settings.secureConnection,\n serverVersion: \"no connection\",\n // \"On\" is the default, so saving the \"off\" state.\n messageSounds: !settings.messageSoundsOff,\n incognitoMode: false,\n // Persistent request to enable alerts.\n desktopAlerts: persist && !!settings.desktopAlerts,\n // Enable / disable checkbox.\n desktopAlertsEnabled: (isSecureConnection() || isLocalHost()) &&\n (typeof firebaseInitApp != 'undefined') && (typeof navigator != 'undefined') &&\n (typeof FIREBASE_INIT != 'undefined'),\n firebaseToken: persist ? LocalStorageUtil.getObject('firebase-token') : null,\n\n applicationVisible: !document.hidden,\n\n errorText: '',\n errorLevel: null,\n errorAction: undefined,\n errorActionText: null,\n\n sidePanelSelected: 'login',\n sidePanelTitle: null,\n sidePanelAvatar: null,\n myTrustedBadges: [],\n loadSpinnerVisible: false,\n\n login: '',\n password: '',\n persist: persist,\n myUserId: null,\n liveConnection: navigator.onLine,\n topicSelected: '',\n topicSelectedOnline: false,\n topicSelectedAcs: null,\n newTopicParams: null,\n loginDisabled: false,\n displayMobile: (window.innerWidth <= MEDIA_BREAKPOINT),\n infoPanel: undefined,\n mobilePanel: 'sidepanel',\n\n // Video calls.\n callTopic: undefined,\n callState: CALL_STATE_NONE,\n callAudioOnly: undefined,\n // If true, call state should be transitioned to CALL_STATE_IN_PROGRESS upon\n // switching to the call topic.\n callShouldStart: false,\n\n contextMenuVisible: false,\n contextMenuBounds: null,\n contextMenuClickAt: null,\n contextMenuParams: null,\n contextMenuItems: [],\n\n forwardDialogVisible: false,\n forwardMessage: null,\n\n // Modal alert dialog.\n alertVisible: false,\n alertParams: {},\n\n // Chats as shown in the ContactsView\n chatList: [],\n // Contacts returned by a search query.\n searchResults: [],\n // Merged results of a search query and p2p chats.\n searchableContacts: [],\n // Credential validation.\n reqCredMethod: undefined,\n credMethod: undefined,\n credCode: undefined,\n credToken: undefined,\n // Topic to go to after login.\n requestedTopic: undefined\n };\n }\n\n componentDidMount() {\n window.addEventListener('resize', this.handleResize);\n window.addEventListener('online', (e) => { this.handleOnline(true); });\n window.addEventListener('offline', (e) => { this.handleOnline(false); });\n window.addEventListener('hashchange', this.handleHashRoute);\n\n // Process background notifications from the service worker.\n if (typeof BroadcastChannel == 'function') {\n const serviceWorkerChannel = new BroadcastChannel('tinode-sw');\n serviceWorkerChannel.addEventListener('message', this.handlePushMessage);\n } else {\n // Safari is broken by design.\n console.warn(\"Your browser does not support BroadcastChannel. Some features will not be available\");\n }\n\n // Window/tab visible or invisible for pausing timers.\n document.addEventListener('visibilitychange', this.handleVisibilityEvent);\n\n this.setState({\n viewportWidth: document.documentElement.clientWidth,\n viewportHeight: document.documentElement.clientHeight\n });\n\n new Promise((resolve, reject) => {\n this.tinode = TinodeWeb.tnSetup(this.state.serverAddress, isSecureConnection(), this.state.transport,\n this.props.intl.locale, this.state.persist, resolve);\n this.tinode.onConnect = this.handleConnected;\n this.tinode.onDisconnect = this.handleDisconnect;\n this.tinode.onAutoreconnectIteration = this.handleAutoreconnectIteration;\n this.tinode.onInfoMessage = this.handleInfoMessage;\n this.tinode.onDataMessage = this.handleDataMessage;\n }).then(_ => {\n // Initialize desktop alerts.\n if (this.state.desktopAlertsEnabled) {\n this.initFCMessaging().catch(_ => {\n // do nothing: handled earlier.\n // catch needed to pervent unnecessary logging of error.\n });\n }\n\n // Parse and save the hash navigation params.\n const parsedNav = HashNavigation.parseUrlHash(window.location.hash);\n\n // Read contacts from cache.\n this.resetContactList();\n\n const token = this.state.persist ? LocalStorageUtil.getObject('auth-token') : undefined;\n if (token) {\n this.setState({autoLogin: true});\n\n // When reading from storage, date is returned as string.\n token.expires = new Date(token.expires);\n this.tinode.setAuthToken(token);\n this.tinode.connect().catch(err => {\n // Socket error\n this.handleError(err.message, 'err');\n });\n }\n\n this.readTimer = null;\n this.readTimerCallback = null;\n\n // Maybe navigate to home screen.\n if (!['cred', 'reset', 'register'].includes(parsedNav.path[0])) {\n // Save possible topic name.\n this.setState({requestedTopic: parsedNav.path[1]});\n const path = parsedNav.params && parsedNav.params.cred_done ?\n HashNavigation.addUrlParam('', 'cred_done', parsedNav.params.cred_done):\n '';\n HashNavigation.navigateTo(path);\n } else {\n this.handleHashRoute();\n }\n });\n }\n\n componentWillUnmount() {\n window.removeEventListener('resize', this.handleResize);\n window.removeEventListener('hashchange', this.handleHashRoute);\n document.removeEventListener('visibilitychange', this.handleVisibilityEvent);\n }\n\n // Setup transport (usually websocket) and server address. This will terminate connection with the server.\n static tnSetup(serverAddress, secureConnection, transport, locale, persistentCache, onSetupCompleted) {\n const tinode = new Tinode({appName: APP_NAME, host: serverAddress, apiKey: API_KEY, transport: transport,\n secure: secureConnection, persist: persistentCache}, onSetupCompleted);\n tinode.setHumanLanguage(locale);\n tinode.enableLogging(LOGGING_ENABLED, true);\n return tinode;\n }\n\n // Tinode received a push notification from the server.\n handlePushMessage(payload) {\n this.tinode.oobNotification(payload.data || {});\n }\n\n initFCMessaging() {\n const {formatMessage, locale} = this.props.intl;\n const onError = (msg, err) => {\n console.error(msg, err);\n this.handleError(formatMessage(messages.push_init_failed), 'err');\n this.setState({firebaseToken: null});\n LocalStorageUtil.updateObject('settings', {desktopAlerts: false});\n }\n\n try {\n this.fcm = firebaseGetMessaging(firebaseInitApp(FIREBASE_INIT, APP_NAME));\n return navigator.serviceWorker.getRegistration('/service-worker.js').then(reg => {\n return reg || navigator.serviceWorker.register('/service-worker.js').then(reg => {\n this.checkForAppUpdate(reg);\n return reg;\n });\n }).then(reg => {\n // Pass locale and version config to the service worker.\n (reg.active || reg.installing).postMessage(JSON.stringify({locale: locale, version: PACKAGE_VERSION}));\n // Request token.\n return TinodeWeb.requestFCMToken(this.fcm, reg);\n }).then(token => {\n const persist = LocalStorageUtil.getObject('keep-logged-in');\n if (token != this.state.firebaseToken) {\n this.tinode.setDeviceToken(token);\n if (persist) {\n LocalStorageUtil.setObject('firebase-token', token);\n }\n }\n this.setState({firebaseToken: token, desktopAlerts: true});\n if (persist) {\n LocalStorageUtil.updateObject('settings', {desktopAlerts: true});\n }\n\n // Handhe FCM pushes\n // (a) for channels always,\n // (b) pushes when the app is in foreground but has no focus.\n firebaseOnMessage(this.fcm, payload => { this.handlePushMessage(payload); });\n }).catch(err => {\n // SW registration or FCM has failed :(\n onError(err);\n throw err;\n });\n } catch (err) {\n onError(err);\n return Promise.reject(err);\n }\n }\n\n // Google's FCM API is idiotic.\n static requestFCMToken(fcm, sw) {\n return firebaseGetToken(fcm, {\n serviceWorkerRegistration: sw,\n vapidKey: FIREBASE_INIT.messagingVapidKey\n }).then(token => {\n if (token) {\n return token;\n } else {\n // Try to request permissions.\n return Notification.requestPermission().then(permission => {\n if (permission === 'granted') {\n return firebaseGetToken(fcm, {\n serviceWorkerRegistration: reg,\n vapidKey: FIREBASE_INIT.messagingVapidKey\n }).then(token => {\n if (token) {\n return token;\n } else {\n throw new Error(\"Failed to initialize notifications\");\n }\n });\n } else {\n throw new Error(\"No permission to send notifications: \" + permission);\n }\n });\n }\n });\n }\n\n handleResize() {\n const mobile = document.documentElement.clientWidth <= MEDIA_BREAKPOINT;\n this.setState({\n viewportWidth: document.documentElement.clientWidth,\n viewportHeight: document.documentElement.clientHeight\n });\n if (this.state.displayMobile != mobile) {\n this.setState({displayMobile: mobile});\n }\n }\n\n // Check if a newer version of TinodeWeb app is available at the server.\n checkForAppUpdate(reg) {\n reg.onupdatefound = _ => {\n const installingWorker = reg.installing;\n installingWorker.onstatechange = _ => {\n if (installingWorker.state == 'installed' && navigator.serviceWorker.controller) {\n const msg = <>\n \n \n .>;\n this.handleError(msg, 'info');\n }\n }\n }\n }\n\n // Handle for hash navigation (hashchange) event: update state.\n handleHashRoute() {\n const hash = HashNavigation.parseUrlHash(window.location.hash);\n // Start with panel parameters.\n const newState = {\n infoPanel: hash.params.info,\n newTopicTabSelected: hash.params.tab\n };\n\n if (hash.path && hash.path.length > 0) {\n // Left-side panel selector.\n if (['register','settings','edit','notif','security','support','general','crop',\n 'cred','reset','newtpk','archive','blocked','contacts',''].includes(hash.path[0])) {\n newState.sidePanelSelected = hash.path[0];\n } else {\n console.warn(\"Unknown sidepanel view\", hash.path[0]);\n }\n\n // Topic for MessagesView selector.\n let topicName = hash.path[1] || null;\n if (topicName != this.state.topicSelected) {\n if (!Tinode.topicType(topicName)) {\n // Clear invalid topic name.\n topicName = null;\n }\n Object.assign(newState, {\n topicSelected: topicName,\n topicSelectedAcs: this.tinode.getTopicAccessMode(topicName)\n });\n }\n } else {\n // Empty hashpath\n Object.assign(newState, {sidePanelSelected: '', topicSelected: null});\n }\n\n // Save credential validation parameters, if available.\n if (hash.params.method) {\n newState.credMethod = hash.params.method;\n }\n if (hash.params.code) {\n newState.credCode = hash.params.code;\n }\n if (hash.params.token) {\n newState.credToken = hash.params.token;\n }\n\n // Show a message if validation was successful.\n if (hash.params.cred_done) {\n Object.assign(newState,\n TinodeWeb.stateForError(this.props.intl.formatMessage(messages.cred_confirmed_successfully), 'info'));\n }\n\n this.setState(newState);\n }\n\n handleOnline(online) {\n if (online) {\n this.handleError();\n clearInterval(this.reconnectCountdown);\n this.tinode.reconnect();\n } else {\n this.handleError(this.props.intl.formatMessage(messages.no_connection), 'warn');\n }\n this.setState({liveConnection: online});\n }\n\n handleVisibilityEvent() {\n this.setState({applicationVisible: !document.hidden});\n }\n\n static stateForError(err, level, action, actionText) {\n return {\n errorText: err,\n errorLevel: level,\n errorAction: action,\n errorActionText: actionText,\n callShouldStart: false,\n };\n }\n\n handleError(err, level, action, actionText) {\n this.setState(TinodeWeb.stateForError(err, level, action, actionText));\n }\n\n // User clicked Login button in the side panel.\n handleLoginRequest(login, password) {\n this.setState({\n loginDisabled: true,\n login: login,\n password: password,\n loadSpinnerVisible: true,\n autoLogin: true\n });\n this.handleError('', null);\n\n if (this.tinode.isConnected()) {\n this.doLogin(login, password, null, {meth: this.state.credMethod, resp: this.state.credCode});\n } else {\n this.tinode.connect().catch(err => {\n // Socket error\n this.setState({loginDisabled: false, autoLogin: false, loadSpinnerVisible: false});\n this.handleError(err.message, 'err');\n });\n }\n\n if (this.state.desktopAlertsEnabled && !this.state.firebaseToken) {\n // Firefox and Safari: \"The Notification permission may only be requested from inside a\n // short running user-generated event handler\".\n this.initFCMessaging();\n }\n }\n\n // Enable or disable saving the password and IndexedDB.\n handlePersistenceChange(persist) {\n if (persist) {\n this.tinode.initStorage().then(_ => {\n LocalStorageUtil.setObject('keep-logged-in', true);\n this.setState({persist: true});\n });\n } else {\n this.tinode.clearStorage().then(_ => {\n LocalStorageUtil.setObject('keep-logged-in', false);\n this.setState({persist: false});\n });\n }\n }\n\n // Connection succeeded.\n handleConnected() {\n // Just to be sure.\n clearInterval(this.reconnectCountdown);\n this.handleError();\n\n const params = this.tinode.getServerInfo();\n this.setState({\n serverVersion: params.ver + ' ' + (params.build ? params.build : 'none'),\n // \"reqCred\":{\"auth\":[\"email\"]}\n reqCredMethod: ((params.reqCred || {}).auth || [])[0] || 'email'\n });\n\n if (this.state.autoLogin) {\n this.doLogin(this.state.login, this.state.password, null,\n {meth: this.state.credMethod, resp: this.state.credCode});\n }\n }\n\n // Called for each auto-reconnect iteration.\n handleAutoreconnectIteration(sec, prom) {\n clearInterval(this.reconnectCountdown);\n\n if (sec < 0) {\n // Clear error\n this.handleError();\n return;\n }\n\n if (prom) {\n // Reconnecting now\n prom.then(_ => {\n // Reconnected: clear error\n this.handleError();\n }).catch(err => {\n this.handleError(err.message, 'err');\n });\n return;\n }\n\n const {formatMessage} = this.props.intl;\n let count = sec / 1000;\n count = count | count;\n this.reconnectCountdown = setInterval(_ => {\n if (count < -10) {\n // Count could go to negative if computer woke up from sleep.\n clearInterval(this.reconnectCountdown);\n this.tinode.reconnect();\n return;\n }\n\n const fmtTime = (count > 99) ? secondsToTime(count) : count;\n this.handleError(\n formatMessage(messages.reconnect_countdown, {seconds: fmtTime}),\n 'warn',\n _ => {\n clearInterval(this.reconnectCountdown);\n this.tinode.reconnect();\n },\n formatMessage(messages.reconnect_now)\n );\n count -= 1;\n }, 1000);\n }\n\n // Connection lost\n handleDisconnect(err) {\n this.setState({\n connected: false,\n ready: false,\n topicSelectedOnline: false,\n errorText: err && err.message ? err.message : \"Disconnected\",\n errorLevel: err && err.message ? 'err' : 'warn',\n loginDisabled: false,\n contextMenuVisible: false,\n forwardDialogVisible: false,\n serverVersion: \"no connection\"\n });\n }\n\n doLogin(login, password, tmpToken, cred) {\n if (this.tinode.isAuthenticated()) {\n // Already logged in. Go to default screen.\n HashNavigation.navigateTo('');\n return;\n }\n\n let token = tmpToken || (this.tinode.getAuthToken() || {}).token;\n if (!(login && password) && !token) {\n // No login credentials provided.\n // Make sure we are on the login page.\n HashNavigation.navigateTo('');\n this.setState({loginDisabled: false});\n return;\n }\n\n // Sanitize and package credentail.\n cred = Tinode.credential(cred);\n // May be disconnected.\n let connectionPromise = this.tinode.isConnected() ? Promise.resolve() : this.tinode.connect();\n // Try to login with login/password. If they are not available, try token; if no token, ask for login/password.\n let loginPromise;\n if (login && password) {\n token = null;\n this.setState({password: null});\n loginPromise = connectionPromise.then(_ => this.tinode.loginBasic(login, password, cred));\n } else {\n loginPromise = connectionPromise.then(_ => this.tinode.loginToken(token, cred));\n }\n\n loginPromise.then(ctrl => {\n if (ctrl.code >= 300 && ctrl.text === 'validate credentials') {\n this.setState({loadSpinnerVisible: false});\n if (cred) {\n this.handleError(this.props.intl.formatMessage(messages.code_doesnot_match), 'warn');\n }\n TinodeWeb.navigateToCredentialsView(ctrl.params);\n } else {\n this.handleLoginSuccessful();\n }\n }).catch(err => {\n const autoLogin = err.code >= 500;\n // Connection or login failed, report error.\n this.setState({\n loginDisabled: false,\n credMethod: undefined,\n credCode: undefined,\n loadSpinnerVisible: false,\n autoLogin: autoLogin\n });\n this.handleError(err.message, 'err');\n console.warn(\"Login failed\", err);\n if (!autoLogin) {\n if (token) {\n this.handleLogout();\n }\n HashNavigation.navigateTo('');\n }\n });\n }\n\n static navigateToCredentialsView(params) {\n const parsed = HashNavigation.parseUrlHash(window.location.hash);\n parsed.path[0] = 'cred';\n parsed.params['method'] = params.cred[0];\n parsed.params['token'] = params.token;\n HashNavigation.navigateTo(HashNavigation.composeUrlHash(parsed.path, parsed.params));\n }\n\n handleLoginSuccessful() {\n this.handleError();\n\n // Refresh authentication token.\n if (LocalStorageUtil.getObject('keep-logged-in')) {\n LocalStorageUtil.setObject('auth-token', this.tinode.getAuthToken());\n }\n\n const goToTopic = this.state.requestedTopic;\n // Logged in fine, subscribe to 'me' attaching callbacks from the contacts view.\n const me = this.tinode.getMeTopic();\n me.onMetaDesc = this.tnMeMetaDesc;\n me.onContactUpdate = this.tnMeContactUpdate;\n me.onSubsUpdated = this.tnMeSubsUpdated;\n this.setState({\n connected: true,\n credMethod: undefined,\n credCode: undefined,\n credToken: undefined,\n myUserId: this.tinode.getCurrentUserID(),\n autoLogin: true,\n requestedTopic: undefined,\n });\n // Subscribe, fetch topic desc, the list of subscriptions. Messages are not fetched.\n me.subscribe(\n me.startMetaQuery().\n withLaterSub().\n withDesc().\n withTags().\n withCred().\n build()\n ).catch(err => {\n this.tinode.disconnect();\n localStorage.removeItem('auth-token');\n this.handleError(err.message, 'err');\n HashNavigation.navigateTo('');\n }).finally(_ => {\n this.setState({loadSpinnerVisible: false});\n });\n let urlHash = HashNavigation.setUrlSidePanel(window.location.hash, 'contacts');\n if (goToTopic) {\n urlHash = HashNavigation.setUrlTopic(urlHash, goToTopic);\n }\n HashNavigation.navigateTo(urlHash);\n }\n\n tnMeMetaDesc(desc) {\n if (desc) {\n if (desc.public) {\n this.setState({\n sidePanelTitle: desc.public.fn,\n sidePanelAvatar: makeImageUrl(desc.public.photo)\n });\n }\n if (desc.trusted) {\n const badges = [];\n for (const [key, val] of Object.entries(desc.trusted)) {\n if (val) {\n badges.push(key);\n }\n }\n this.setState({\n myTrustedBadges: badges,\n });\n }\n if (desc.acs) {\n this.setState({\n incognitoMode: !desc.acs.isPresencer()\n });\n }\n }\n }\n\n // Reactions to updates to the contact list.\n tnMeContactUpdate(what, cont) {\n if (what == 'on' || what == 'off') {\n this.resetContactList();\n if (this.state.topicSelected == cont.topic) {\n this.setState({topicSelectedOnline: (what == 'on')});\n }\n } else if (what == 'read') {\n this.resetContactList();\n } else if (what == 'msg') {\n // Check if the topic is archived. If so, don't play a sound.\n const topic = this.tinode.getTopic(cont.topic);\n const archived = topic && topic.isArchived();\n\n // New message received. Maybe the message is from the current user, then unread is 0.\n if (cont.unread > 0 && this.state.messageSounds && !archived) {\n // Skip update if the topic is currently open, otherwise the badge will annoyingly flash.\n if (document.hidden || this.state.topicSelected != cont.topic) {\n POP_SOUND.play().catch(_ => {\n // play() throws if the user did not click the app first: https://goo.gl/xX8pDD.\n });\n }\n }\n // Reorder contact list to use possibly updated 'touched'.\n this.resetContactList();\n } else if (what == 'recv') {\n // Explicitly ignoring \"recv\" -- it causes no visible updates to contact list.\n } else if (what == 'gone' || what == 'unsub') {\n // Topic deleted or user unsubscribed. Remove topic from view.\n // If the currently selected topic is gone, clear the selection.\n if (this.state.topicSelected == cont.topic) {\n this.handleTopicSelected(null);\n }\n // Redraw without the deleted topic.\n this.resetContactList();\n } else if (what == 'acs') {\n // Permissions changed. If it's for the currently selected topic,\n // update the views.\n if (this.state.topicSelected == cont.topic) {\n this.setState({topicSelectedAcs: cont.acs});\n }\n } else if (what == 'del') {\n // TODO: messages deleted (hard or soft) -- update pill counter.\n } else if (what == 'upd' || what == 'call') {\n // upd, call - handled by the SDK. Explicitly ignoring here.\n } else {\n // TODO(gene): handle other types of notifications:\n // * ua -- user agent changes (maybe display a pictogram for mobile/desktop).\n console.info(\"Unsupported (yet) presence update:\", what, \"in\", cont.topic);\n }\n }\n\n tnMeSubsUpdated(unused) {\n this.resetContactList();\n }\n\n // Merge search results and contact list to create a single flat\n // list of known contacts for GroupManager to use.\n static prepareSearchableContacts(chatList, foundContacts) {\n const merged = {};\n\n // For chatList topics merge only p2p topics and convert them to the\n // same format as foundContacts.\n for (const c of chatList) {\n if (Tinode.isP2PTopicName(c.topic)) {\n merged[c.topic] = {\n user: c.topic,\n updated: c.updated,\n public: c.public,\n private: c.private,\n acs: c.acs\n };\n }\n }\n\n // Add all foundCountacts if they have not been added already.\n for (const c of foundContacts) {\n if (!merged[c.user]) {\n merged[c.user] = c;\n }\n }\n\n return Object.values(merged);\n }\n\n resetContactList() {\n const newState = {\n chatList: []\n };\n\n if (!this.state.ready) {\n newState.ready = true;\n }\n\n this.tinode.getMeTopic().contacts((c) => {\n if (!c.topic && !c.user) {\n // Contacts expect c.topic to be set.\n c.topic = c.name;\n }\n\n newState.chatList.push(c);\n if (this.state.topicSelected == c.topic) {\n newState.topicSelectedOnline = c.online;\n newState.topicSelectedAcs = c.acs;\n }\n });\n\n const past = new Date(0);\n newState.chatList.sort((a, b) => {\n return (a.touched || past).getTime() - (b.touched || past).getTime();\n });\n\n // Merge search results and chat list.\n newState.searchableContacts = TinodeWeb.prepareSearchableContacts(newState.chatList, this.state.searchResults);\n this.setState(newState);\n }\n\n /* Fnd topic: find contacts by tokens */\n tnInitFind() {\n const fnd = this.tinode.getFndTopic();\n fnd.onSubsUpdated = this.tnFndSubsUpdated;\n if (fnd.isSubscribed()) {\n this.tnFndSubsUpdated();\n } else {\n fnd.subscribe(fnd.startMetaQuery().withSub().build()).catch(err => {\n this.handleError(err.message, 'err');\n });\n }\n }\n\n tnFndSubsUpdated() {\n const foundContacts = [];\n // Don't attempt to create P2P topics which already exist. Server will reject the duplicates.\n this.tinode.getFndTopic().contacts((s) => {\n foundContacts.push(s);\n });\n this.setState({\n searchResults: foundContacts,\n searchableContacts: TinodeWeb.prepareSearchableContacts(this.state.chatList, foundContacts)\n });\n }\n\n /** Called when the user enters a contact into the contact search field in the NewAccount panel\n @param query {Array} is an array of contacts to search for\n */\n handleSearchContacts(query) {\n const fnd = this.tinode.getFndTopic();\n fnd.setMeta({desc: {public: query}})\n .then(_ => fnd.getMeta(fnd.startMetaQuery().withSub().build()))\n .catch(err => this.handleError(err.message, 'err'));\n }\n\n // User clicked on a topic in the side panel or deleted a topic.\n handleTopicSelected(topicName) {\n // Clear newTopicParams after use.\n if (this.state.newTopicParams && this.state.newTopicParams._topicName != topicName) {\n this.setState({\n newTopicParams: null\n });\n }\n\n if (topicName) {\n this.setState({\n errorText: '',\n errorLevel: null,\n mobilePanel: 'topic-view',\n infoPanel: undefined\n });\n // Different topic selected.\n if (this.state.topicSelected != topicName) {\n this.setState({\n topicSelectedOnline: this.tinode.isTopicOnline(topicName),\n topicSelectedAcs: this.tinode.getTopicAccessMode(topicName),\n forwardMessage: null\n });\n HashNavigation.navigateTo(HashNavigation.setUrlTopic('', topicName));\n }\n } else {\n // Currently selected contact deleted\n this.setState({\n errorText: '',\n errorLevel: null,\n mobilePanel: 'sidepanel',\n topicSelectedOnline: false,\n topicSelectedAcs: null,\n infoPanel: undefined,\n forwardMessage: null\n });\n\n HashNavigation.navigateTo(HashNavigation.setUrlTopic('', null));\n }\n }\n\n // In mobile view user requested to show sidepanel\n handleHideMessagesView() {\n this.setState({\n mobilePanel: 'sidepanel'\n });\n HashNavigation.navigateTo(HashNavigation.setUrlTopic(window.location.hash, null));\n }\n\n // User is sending a message, either plain text or a drafty object, possibly\n // with attachments.\n // - msg - Drafty message with content\n // - promise - Promise to be resolved when the upload is completed\n // - uploadCompletionPromise - for tracking progress\n // - head - head dictionary to be attached to the message\n handleSendMessage(msg, uploadCompletionPromise, uploader, head) {\n const topic = this.tinode.getTopic(this.state.topicSelected);\n /* TODO: check if return is required */\n return this.sendMessageToTopic(topic, msg, uploadCompletionPromise, uploader, head);\n }\n\n sendMessageToTopic(topic, msg, uploadCompletionPromise, uploader, head) {\n msg = topic.createMessage(msg, false);\n // The uploader is used to show progress.\n msg._uploader = uploader;\n\n if (head) {\n msg.head = Object.assign(msg.head || {}, head);\n }\n\n const completion = [];\n if (uploadCompletionPromise) {\n completion.push(uploadCompletionPromise);\n }\n\n if (!topic.isSubscribed()) {\n // Topic is not subscribed yet. Subscribe.\n const subscribePromise =\n topic.subscribe()\n .then(_ => {\n // If there are unsent messages (except video call messages),\n // try sending them now. Unsent video call messages will be dropped.\n let calls = [];\n topic.queuedMessages(pub => {\n if (pub._sending || pub.seq == msg.seq) {\n return;\n }\n if (pub.head && pub.head.webrtc) {\n // Filter out unsent video call messages.\n calls.push(pub.seq);\n return;\n }\n if (topic.isSubscribed()) {\n topic.publishMessage(pub);\n }\n });\n if (calls.length > 0) {\n topic.delMessagesList(calls, true);\n }\n });\n completion.push(subscribePromise);\n }\n\n // TODO: check if return is required.\n return topic.publishDraft(msg, Promise.all(completion))\n .then(ctrl => {\n if (topic.isArchived()) {\n topic.archive(false);\n }\n return ctrl;\n })\n .catch(err => this.handleError(err.message, 'err'));\n }\n\n handleNewChatInvitation(topicName, action) {\n const topic = this.tinode.getTopic(topicName);\n let response = null;\n switch (action) {\n case 'accept':\n // Accept given permissions.\n const mode = topic.getAccessMode().getGiven();\n response = topic.setMeta({sub: {mode: mode}});\n if (topic.isP2PType()) {\n // For P2P topics change 'given' permission of the peer too.\n // In p2p topics the other user has the same name as the topic.\n response = response.then(_ => topic.setMeta({sub: {user: topicName, mode: mode}}));\n }\n break;\n case 'delete':\n // Ignore invitation by deleting it.\n response = topic.delTopic(true);\n break;\n case 'block':\n // Ban the topic making futher invites impossible.\n // Just self-ban.\n const am = topic.getAccessMode().updateWant('-JP').getWant();\n response = topic.setMeta({sub: {mode: am}}).then(_ => this.handleTopicSelected(null));\n break;\n default:\n console.warn(\"Unknown invitation action\", '\"' + action + '\"\"');\n }\n\n if (response != null) {\n response.catch(err => this.handleError(err.message, 'err'));\n }\n }\n\n // User chose a Sign Up menu item.\n handleNewAccount() {\n this.handleError();\n\n HashNavigation.navigateTo(HashNavigation.setUrlSidePanel(window.location.hash, 'register'));\n }\n\n // Actual registration of a new account.\n handleNewAccountRequest(login_, password_, public_, cred_, tags_) {\n // Clear old error, if any.\n this.handleError();\n\n this.tinode.connect(this.state.serverAddress)\n .then(_ => {\n let attachments;\n if (public_ && public_.photo && public_.photo.ref) {\n attachments = [public_.photo.ref];\n }\n return this.tinode.createAccountBasic(login_, password_,\n {public: public_, tags: tags_, cred: Tinode.credential(cred_), attachments: attachments});\n }).then(ctrl => {\n if (ctrl.code >= 300 && ctrl.text == 'validate credentials') {\n TinodeWeb.navigateToCredentialsView(ctrl.params);\n } else {\n this.handleLoginSuccessful(this);\n }\n }).catch(err => {\n this.handleError(err.message, 'err');\n });\n }\n\n handleToggleIncognitoMode(on) {\n // Make state undefined.\n this.setState({incognitoMode: null});\n\n const me = this.tinode.getMeTopic();\n const am = me.getAccessMode().updateWant(on ? '-P' : '+P').getWant();\n me.setMeta({sub: {mode: am}}).catch(err => {\n // Request failed, keep existing state.\n this.setState({incognitoMode: !on});\n this.handleError(err.message, 'err');\n });\n }\n\n handleUpdateAccountTagsRequest(_, tags) {\n this.tinode.getMeTopic().setMeta({tags: tags})\n .catch(err => this.handleError(err.message, 'err'));\n }\n\n // User chose Settings menu item.\n handleSettings() {\n this.handleError();\n\n HashNavigation.navigateTo(HashNavigation.setUrlSidePanel(window.location.hash,\n this.state.myUserId ? 'edit' : 'settings'));\n }\n\n // User updated global parameters.\n handleGlobalSettings(settings) {\n const serverAddress = settings.serverAddress || this.state.serverAddress;\n const transport = settings.transport || this.state.transport;\n const secureConnection = settings.secureConnection === undefined ?\n this.state.secureConnection : settings.secureConnection;\n if (this.tinode) {\n this.tinode.clearStorage();\n this.tinode.onDisconnect = undefined;\n this.tinode.disconnect();\n }\n this.tinode = TinodeWeb.tnSetup(serverAddress, secureConnection, transport,\n this.props.intl.locale, LocalStorageUtil.getObject('keep-logged-in'));\n this.tinode.onConnect = this.handleConnected;\n this.tinode.onDisconnect = this.handleDisconnect;\n this.tinode.onAutoreconnectIteration = this.handleAutoreconnectIteration;\n this.tinode.onInfoMessage = this.handleInfoMessage;\n this.tinode.onDataMessage = this.handleDataMessage;\n\n this.setState({\n serverAddress: serverAddress,\n transport: transport,\n secureConnection: secureConnection,\n });\n LocalStorageUtil.setObject('settings', {\n serverAddress: serverAddress,\n transport: transport,\n secureConnection: secureConnection,\n });\n\n HashNavigation.navigateTo(HashNavigation.setUrlSidePanel(window.location.hash, ''));\n }\n\n // User chose 'Archived chats'.\n handleShowArchive() {\n HashNavigation.navigateTo(HashNavigation.setUrlSidePanel(window.location.hash,\n this.state.myUserId ? 'archive' : ''));\n }\n\n // User viewes 'Blocked chats'.\n handleShowBlocked() {\n HashNavigation.navigateTo(HashNavigation.setUrlSidePanel(window.location.hash,\n this.state.myUserId ? 'blocked' : ''));\n }\n\n toggleFCMToken(enabled) {\n if (enabled) {\n this.setState({desktopAlerts: null});\n if (!this.state.firebaseToken) {\n this.initFCMessaging();\n } else {\n this.setState({desktopAlerts: true});\n if (LocalStorageUtil.getObject('keep-logged-in')) {\n LocalStorageUtil.updateObject('settings', {desktopAlerts: true});\n }\n }\n } else if (this.state.firebaseToken && this.fcm) {\n firebaseDelToken(this.fcm).catch(err => {\n console.error(\"Unable to delete token.\", err);\n }).finally(_ => {\n LocalStorageUtil.updateObject('settings', {desktopAlerts: false});\n localStorage.removeItem('firebase-token');\n this.setState({desktopAlerts: false, firebaseToken: null});\n // Inform the server that the token was deleted.\n this.tinode.setDeviceToken(null);\n });\n } else {\n this.setState({desktopAlerts: false, firebaseToken: null});\n LocalStorageUtil.updateObject('settings', {desktopAlerts: false});\n }\n }\n\n handleToggleMessageSounds(enabled) {\n this.setState({messageSounds: enabled});\n LocalStorageUtil.updateObject('settings', {\n messageSoundsOff: !enabled\n });\n }\n\n handleCredAdd(method, value) {\n const me = this.tinode.getMeTopic();\n me.setMeta({cred: {meth: method, val: value}})\n .catch(err => this.handleError(err.message, 'err'));\n }\n\n handleCredDelete(method, value) {\n const me = this.tinode.getMeTopic();\n me.delCredential(method, value)\n .catch(err => this.handleError(err.message, 'err'));\n }\n\n handleCredConfirm(method, response) {\n TinodeWeb.navigateToCredentialsView({cred: [method]});\n }\n\n // User clicked Cancel button in Setting or Sign Up panel.\n handleSidepanelCancel() {\n const parsed = HashNavigation.parseUrlHash(window.location.hash);\n let path = '';\n if (['security','support','general','notif'].includes(parsed.path[0])) {\n path = 'edit';\n } else if ('crop' == parsed.path[0]) {\n path = 'general';\n } else if ('blocked' == parsed.path[0]) {\n path = 'security';\n } else if (this.state.myUserId) {\n path = 'contacts';\n }\n parsed.path[0] = path;\n if (parsed.params) {\n delete parsed.params.code;\n delete parsed.params.method;\n delete parsed.params.tab;\n delete parsed.params.scheme;\n delete parsed.params.token;\n }\n HashNavigation.navigateTo(HashNavigation.composeUrlHash(parsed.path, parsed.params));\n this.setState({errorText: '', errorLevel: null});\n }\n\n // Sidepanel navigator. No need to bind to 'this'.\n basicNavigator(hash) {\n HashNavigation.navigateTo(HashNavigation.setUrlSidePanel(window.location.hash, hash));\n }\n\n // Topic info navigator. No need to bind to 'this'.\n infoNavigator(hash) {\n HashNavigation.navigateTo(HashNavigation.setUrlInfoPanel(window.location.hash, hash));\n }\n\n // Request to start a topic, new or selected from search results, or \"by ID\".\n handleStartTopicRequest(topicName, newTopicParams, isChannel) {\n // Check if topic is indeed new. If not, launch it.\n if (topicName && this.tinode.isTopicCached(topicName)) {\n this.handleTopicSelected(topicName);\n return;\n }\n\n const params = {};\n if (Tinode.isP2PTopicName(topicName)) {\n // Because we are initialing the subscription, set 'want' to all permissions.\n params.sub = {mode: DEFAULT_P2P_ACCESS_MODE};\n // Give the other user all permissions too.\n params.desc = {defacs: {auth: DEFAULT_P2P_ACCESS_MODE}};\n } else {\n topicName = topicName || this.tinode.newGroupTopicName(isChannel);\n if (newTopicParams) {\n params.desc = {public: newTopicParams.public, private: {comment: newTopicParams.private}};\n params.tags = newTopicParams.tags;\n }\n }\n params._topicName = topicName;\n this.setState({newTopicParams: params}, _ => {this.handleTopicSelected(topicName)});\n }\n\n // New topic was created, here is the new topic name.\n handleNewTopicCreated(oldName, newName) {\n let nextState = {};\n if (this.state.callShouldStart) {\n nextState = {callState: CALL_STATE_IN_PROGRESS, callShouldStart: false};\n }\n if (this.state.topicSelected == oldName && oldName != newName) {\n // If the current URl contains the old topic name, replace it with new.\n // Update the name of the selected topic first so the navigator doen't clear\n // the state.\n nextState.topicSelected = newName;\n }\n this.setState(nextState, _ => {\n HashNavigation.navigateTo(HashNavigation.setUrlTopic('', newName));\n });\n }\n\n handleTopicUpdateRequest(topicName, pub, priv, defacs) {\n this.handleError();\n\n const topic = this.tinode.getTopic(topicName);\n if (topic) {\n const params = {};\n let attachments;\n if (pub) {\n if (pub.photo) {\n if (pub.photo.ref && pub.photo.ref != Tinode.DEL_CHAR) {\n attachments = [pub.photo.ref];\n } else if (!pub.photo.data || pub.photo.data == Tinode.DEL_CHAR) {\n pub.photo = Tinode.DEL_CHAR;\n }\n }\n params.public = pub;\n }\n\n if (typeof priv == 'string') {\n params.private = (priv === Tinode.DEL_CHAR) ?\n Tinode.DEL_CHAR : {comment: priv};\n }\n if (defacs) {\n params.defacs = defacs;\n }\n topic.setMeta({desc: params, attachments: attachments})\n .catch(err => this.handleError(err.message, 'err'));\n }\n }\n\n handleUnarchive(topicName) {\n const topic = this.tinode.getTopic(topicName);\n if (topic) {\n topic.archive(false).catch(err => this.handleError(err.message, 'err'));\n }\n }\n\n handleUpdatePasswordRequest(password) {\n this.handleError();\n\n if (password) {\n this.tinode.updateAccountBasic(null, this.tinode.getCurrentLogin(), password)\n .catch(err => this.handleError(err.message, 'err'));\n }\n }\n\n handleChangePermissions(topicName, mode, uid) {\n const topic = this.tinode.getTopic(topicName);\n if (topic) {\n const am = topic.getAccessMode();\n if (uid) {\n am.updateGiven(mode);\n mode = am.getGiven();\n } else {\n am.updateWant(mode);\n mode = am.getWant();\n }\n topic.setMeta({sub: {user: uid, mode: mode}})\n .catch(err => this.handleError(err.message, 'err'));\n }\n }\n\n handleTagsUpdateRequest(topicName, tags) {\n const topic = this.tinode.getTopic(topicName);\n if (topic) {\n topic.setMeta({tags: tags})\n .catch(err => this.handleError(err.message, 'err'));\n }\n }\n\n handleLogout() {\n updateFavicon(0);\n\n // Remove stored data.\n localStorage.removeItem('auth-token');\n localStorage.removeItem('firebase-token');\n localStorage.removeItem('settings');\n if (this.state.firebaseToken) {\n firebaseDelToken(this.fcm);\n }\n\n clearInterval(this.reconnectCountdown);\n\n let cleared;\n if (this.tinode) {\n cleared = this.tinode.clearStorage();\n this.tinode.onDisconnect = undefined;\n this.tinode.disconnect();\n } else {\n cleared = Promose.resolve();\n }\n this.setState(this.getBlankState());\n\n cleared.then(_ => {\n this.tinode = TinodeWeb.tnSetup(this.state.serverAddress, isSecureConnection(),\n this.state.transport, this.props.intl.locale, LocalStorageUtil.getObject('keep-logged-in'), _ => {\n this.tinode.onConnect = this.handleConnected;\n this.tinode.onDisconnect = this.handleDisconnect;\n this.tinode.onAutoreconnectIteration = this.handleAutoreconnectIteration;\n this.tinode.onInfoMessage = this.handleInfoMessage;\n this.tinode.onDataMessage = this.handleDataMessage;\n HashNavigation.navigateTo('');\n })\n });\n }\n\n handleDeleteAccount() {\n this.tinode.delCurrentUser(true).then(_ => {\n this.handleLogout();\n });\n }\n\n handleDeleteTopicRequest(topicName) {\n const topic = this.tinode.getTopic(topicName);\n if (!topic) {\n return;\n }\n\n // Request to hard-delete topic.\n topic.delTopic(true).then(_ => {\n // Hide MessagesView and InfoView panels.\n HashNavigation.navigateTo(HashNavigation.setUrlTopic(window.location.hash, ''));\n }).catch(err => {\n this.handleError(err.message, 'err');\n });\n }\n\n handleDeleteMessagesRequest(topicName) {\n const topic = this.tinode.getTopic(topicName);\n if (!topic) {\n return;\n }\n\n // Request hard-delete all messages.\n topic.delMessagesAll(true)\n .catch(err => this.handleError(err.message, 'err'));\n }\n\n handleLeaveUnsubRequest(topicName) {\n const topic = this.tinode.getTopic(topicName);\n if (!topic) {\n return;\n }\n\n topic.leave(true).then(_ => {\n // Hide MessagesView and InfoView panels.\n HashNavigation.navigateTo(HashNavigation.setUrlTopic(window.location.hash, ''));\n }).catch(err => {\n this.handleError(err.message, 'err');\n });\n }\n\n handleBlockTopicRequest(topicName) {\n const topic = this.tinode.getTopic(topicName);\n if (!topic) {\n return;\n }\n\n topic.updateMode(null, '-JP')\n .then(_ => {\n // Hide MessagesView and InfoView panels.\n HashNavigation.navigateTo(HashNavigation.setUrlTopic(window.location.hash, ''));\n })\n .catch(err => this.handleError(err.message, 'err'));\n }\n\n handleReportTopic(topicName) {\n const topic = this.tinode.getTopic(topicName);\n if (!topic) {\n return;\n }\n\n // Publish spam report.\n this.tinode.report('report', topicName);\n\n // Remove J and P permissions.\n topic.updateMode(null, '-JP')\n .then(_ => {\n // Hide MessagesView and InfoView panels.\n HashNavigation.navigateTo(HashNavigation.setUrlTopic(window.location.hash, ''));\n })\n .catch(err => this.handleError(err.message, 'err'));\n }\n\n handleShowContextMenu(params, menuItems) {\n this.setState({\n contextMenuVisible: true,\n contextMenuClickAt: {x: params.x, y: params.y},\n contextMenuParams: params,\n contextMenuItems: menuItems || this.defaultTopicContextMenu(params.topicName),\n contextMenuBounds: this.selfRef.current.getBoundingClientRect()\n });\n }\n\n //\n handleShowForwardDialog(params) {\n if (this.state.sidePanelSelected == 'newtpk') {\n // If the Find panel is active, close it.\n this.handleSidepanelCancel();\n }\n const header = '➦ ' + params.userName;\n const content = typeof params.content == 'string' ? Drafty.init(params.content) : Drafty.forwardedContent(params.content);\n const preview = Drafty.preview(content, FORWARDED_PREVIEW_LENGTH, true);\n const msg = Drafty.append(Drafty.appendLineBreak(Drafty.mention(header, params.userFrom)), content);\n const msgPreview = Drafty.quote(header, params.userFrom, preview);\n\n const head = {\n forwarded: params.topicName + ':' + params.seq\n };\n this.setState({\n forwardDialogVisible: true,\n forwardMessage: { head: head, msg: msg, preview: msgPreview }\n });\n }\n\n defaultTopicContextMenu(topicName) {\n const topic = this.tinode.getTopic(topicName);\n\n if (topic._deleted) {\n return [\n 'topic_delete'\n ];\n }\n\n let muted = false, blocked = false, self_blocked = false, subscribed = false, deleter = false,\n archived = false, webrtc = false;\n if (topic) {\n subscribed = topic.isSubscribed();\n archived = topic.isArchived();\n\n const acs = topic.getAccessMode();\n if (acs) {\n muted = acs.isMuted();\n blocked = !acs.isJoiner();\n self_blocked = !acs.isJoiner('want');\n deleter = acs.isDeleter();\n }\n }\n\n webrtc = !!this.tinode.getServerParam('iceServers');\n\n return [\n subscribed ? {\n title: this.props.intl.formatMessage(messages.menu_item_info),\n handler: this.handleShowInfoView\n } : null,\n subscribed && Tinode.isP2PTopicName(topicName) && webrtc ? {\n title: this.props.intl.formatMessage(messages.menu_item_audio_call),\n handler: this.handleStartAudioCall\n } : null,\n subscribed && Tinode.isP2PTopicName(topicName) && webrtc ? {\n title: this.props.intl.formatMessage(messages.menu_item_video_call),\n handler: this.handleStartVideoCall\n } : null,\n subscribed ? 'messages_clear' : null,\n subscribed && deleter ? 'messages_clear_hard' : null,\n muted ? (blocked ? null : 'topic_unmute') : 'topic_mute',\n self_blocked ? 'topic_unblock' : 'topic_block',\n archived ? 'topic_restore' : 'topic_archive',\n 'topic_delete'\n ];\n }\n\n handleHideContextMenu() {\n this.setState({\n contextMenuVisible: false,\n contextMenuClickAt: null,\n contextMenuParams: null,\n contextMenuBounds: null\n });\n }\n\n handleHideForwardDialog(keepForwardedMessage) {\n this.setState({\n forwardDialogVisible: false,\n forwardMessage: keepForwardedMessage ? this.state.forwardMessage : null\n });\n }\n\n handleContextMenuAction(action, promise, params) {\n if (action == 'topic_archive') {\n if (promise && params.topicName && params.topicName == this.state.topicSelected) {\n promise.then(_ => {\n this.handleTopicSelected(null);\n });\n }\n } else if (action == 'menu_item_forward') {\n this.handleShowForwardDialog(params);\n }\n }\n\n handleShowAlert(title, content, onConfirm, confirmText, onReject, rejectText) {\n this.setState({\n alertVisible: true,\n alertParams: {\n title: title,\n content: content,\n onConfirm: onConfirm,\n confirm: confirmText,\n onReject: onReject,\n reject: rejectText\n }\n });\n }\n\n handleShowInfoView() {\n HashNavigation.navigateTo(HashNavigation.addUrlParam(window.location.hash, 'info', 'info'));\n this.setState({infoPanel: 'info'});\n }\n\n handleMemberUpdateRequest(topicName, added, removed) {\n if (!topicName) {\n return;\n }\n\n const topic = this.tinode.getTopic(topicName);\n if (!topic) {\n return;\n }\n\n if (added && added.length > 0) {\n added.map((uid) => {\n topic.invite(uid, null)\n .catch(err => this.handleError(err.message, 'err'));\n });\n }\n\n if (removed && removed.length > 0) {\n removed.map((uid) => {\n topic.delSubscription(uid)\n .catch(err => this.handleError(err.message, 'err'));\n });\n }\n }\n\n handleValidateCredentialsRequest(cred, code, token) {\n if (this.tinode.isAuthenticated()) {\n // Adding new email or phone number in account setting.\n this.tinode.getMeTopic().setMeta({cred: {meth: cred, resp: code}})\n .catch(err => this.handleError(err.message, 'err'));\n } else {\n // Credential validation on signup.\n this.setState({credMethod: cred, credCode: code, credToken: token});\n this.doLogin(null, null, token, {meth: cred, resp: code});\n }\n }\n\n handlePasswordResetRequest(method, value) {\n // If already connected, connnect() will return a resolved promise.\n return this.tinode.connect()\n .then(_ => this.tinode.requestResetAuthSecret('basic', method, value))\n .catch(err => {\n // Socket error\n this.handleError(err.message, 'err');\n });\n }\n\n handleResetPassword(newPassword, tempAuth) {\n const secret = base64ReEncode(tempAuth.secret);\n if (!secret || !tempAuth.scheme) {\n this.handleError(this.props.intl.formatMessage(messages.invalid_security_token), 'err');\n } else {\n this.tinode.connect()\n .then(_ => this.tinode.updateAccountBasic(null, null, newPassword, {scheme: tempAuth.scheme, secret: secret}))\n .then(_ => HashNavigation.navigateTo(''))\n .catch(err => {\n // Socket error\n this.handleError(err.message, 'err');\n });\n }\n }\n\n handleShowCountrySelector(code, dial, selectedCallback) {\n this.handleShowAlert(\"Select country\",\n }>\n {\n this.setState({alertVisible: false});\n selectedCallback(c, d);\n }} />\n ,\n null, null, _ => {}, \"Cancel\");\n }\n\n handleStartVideoCall() {\n this.setState({\n callTopic: this.state.topicSelected,\n callState: CALL_STATE_OUTGOING_INITATED,\n callAudioOnly: false\n });\n }\n\n handleStartAudioCall() {\n this.setState({\n callTopic: this.state.topicSelected,\n callState: CALL_STATE_OUTGOING_INITATED,\n callAudioOnly: true\n });\n }\n\n handleCallInvite(callTopic, callSeq, callState, audioOnly) {\n switch (callState) {\n case CALL_STATE_OUTGOING_INITATED:\n const head = { webrtc: CALL_HEAD_STARTED, aonly: !!audioOnly };\n this.handleSendMessage(Drafty.videoCall(audioOnly), undefined, undefined, head)\n .then(ctrl => {\n if (ctrl.code < 200 || ctrl.code >= 300 || !ctrl.params || !ctrl.params.seq) {\n this.handleCallClose();\n return;\n }\n this.setState({callSeq: ctrl.params['seq']});\n });\n break;\n case CALL_STATE_IN_PROGRESS:\n const topic = this.tinode.getTopic(callTopic);\n if (!topic) {\n return;\n }\n // We've accepted the call. Let the other side know.\n topic.videoCall('accept', callSeq);\n break;\n }\n }\n\n handleCallRinging(callTopic, callSeq) {\n const topic = this.tinode.getTopic(callTopic);\n if (!topic) {\n return;\n }\n\n topic.videoCall('ringing', callSeq);\n }\n\n handleCallHangup(callTopic, callSeq) {\n const topic = this.tinode.getTopic(callTopic);\n if (!topic) {\n return;\n }\n\n topic.videoCall('hang-up', callSeq);\n }\n\n handleCallSendOffer(callTopic, callSeq, sdp) {\n const topic = this.tinode.getTopic(callTopic);\n if (!topic) {\n return;\n }\n\n topic.videoCall('offer', callSeq, sdp);\n }\n\n handleCallIceCandidate(callTopic, callSeq, candidate) {\n const topic = this.tinode.getTopic(callTopic);\n if (!topic) {\n return;\n }\n\n topic.videoCall('ice-candidate', callSeq, candidate);\n }\n handleCallSendAnswer(callTopic, callSeq, sdp) {\n const topic = this.tinode.getTopic(callTopic);\n if (!topic) {\n return;\n }\n\n topic.videoCall('answer', callSeq, sdp);\n }\n\n handleCallClose() {\n if (this.callTimeoutTimer) {\n clearTimeout(this.callTimeoutTimer);\n }\n this.setState({\n callTopic: undefined,\n callState: CALL_STATE_NONE,\n callAudioOnly: undefined\n });\n }\n\n handleCallAccept(topicName) {\n const topic = this.tinode.getTopic(topicName);\n if (!topic) {\n return;\n }\n if (topic.isSubscribed()) {\n this.handleTopicSelected(this.state.callTopic);\n this.setState({\n callState: CALL_STATE_IN_PROGRESS\n });\n } else {\n // We need to switch and subscribe to callTopic first.\n this.setState({\n callShouldStart: true,\n }, _ => this.handleTopicSelected(this.state.callTopic));\n }\n }\n\n handleInfoMessage(info) {\n if (info.what != 'call') {\n return;\n }\n switch (info.event) {\n case 'accept':\n // If another my session has accepted the call.\n if (Tinode.isMeTopicName(info.topic) && this.tinode.isMe(info.from)) {\n this.setState({\n callTopic: null,\n callState: CALL_STATE_NONE,\n callSeq: null,\n callAudioOnly: undefined\n });\n return;\n }\n if (info.topic == this.state.callTopic) {\n // Update state.\n this.setState({callState: CALL_STATE_IN_PROGRESS});\n }\n break;\n case 'hang-up':\n // Remote hangup.\n this.handleCallClose();\n break;\n }\n }\n\n handleDataMessage(data) {\n if (data.head && data.head.webrtc && data.head.webrtc == CALL_HEAD_STARTED) {\n // If it's a video call invite message.\n // See if we need to display incoming call UI.\n const topic = this.tinode.getTopic(data.topic);\n if (topic) {\n // Check if a later version of the message exists (which means the call\n // has been either accepted or finished already).\n const msg = topic.latestMsgVersion(data.seq) || data;\n if (msg.head && msg.head.webrtc && msg.head.webrtc == CALL_HEAD_STARTED) {\n // This is a legit new call.\n if (data.from != this.state.myUserId) {\n if (this.state.callState == CALL_STATE_NONE) {\n // Incoming call.\n this.setState({\n callTopic: data.topic,\n callState: CALL_STATE_INCOMING_RECEIVED,\n callSeq: data.seq,\n callAudioOnly: !!msg.head.aonly\n });\n } else {\n // Another call is either in progress or being established.\n // Reject the incoming call.\n this.handleCallHangup(data.topic, data.seq);\n }\n }\n }\n } else {\n console.warn(\"Received vc data message from unknown topic\", data.topic);\n }\n }\n }\n\n render() {\n return (\n \n {this.state.contextMenuVisible ?\n
{\n if (topicName == this.state.topicSelected) {\n this.handleTopicSelected(null);\n }\n }}\n onError={this.handleError} />\n :\n null\n }\n {this.state.forwardDialogVisible ?\n \n :\n null\n }\n {this.state.callTopic && this.state.callState == CALL_STATE_INCOMING_RECEIVED ?\n \n :\n null\n }\n {this.state.alertVisible ?\n this.setState({alertVisible: false})) : null}\n reject={this.state.alertParams.reject}\n onConfirm={this.state.alertParams.onConfirm ?\n (_ => {this.setState({alertVisible: false}); this.state.alertParams.onConfirm();}) : null}\n confirm={this.state.alertParams.confirm}\n /> : null}\n \n\n \n\n {this.state.infoPanel ?\n \n :\n null\n }\n \n );\n }\n};\n\nexport default injectIntl(TinodeWeb);\n","// Put all packages together.\n// Used to generate umd/index.prod.js\n\nimport React from 'react';\nimport { createRoot } from 'react-dom/client';\n\nimport { IntlProvider } from 'react-intl';\n\nimport TinodeWeb from './views/tinode-web.jsx';\nimport HashNavigation from './lib/navigation.js';\n\n// Insert google analytics script and tag if configured.\nif (FIREBASE_INIT && FIREBASE_INIT.measurementId) {\n const head = document.getElementsByTagName('head')[0];\n let script = document.createElement('script');\n script.src = 'https://www.googletagmanager.com/gtag/js?id=' + FIREBASE_INIT.measurementId;\n script.async = true;\n head.prepend(script);\n window.dataLayer = window.dataLayer || [];\n function gtag(){dataLayer.push(arguments);}\n gtag('js', new Date());\n gtag('config', FIREBASE_INIT.measurementId);\n}\n\n// Allow loading translation strings for just one language.\nconst messageLoader = {\n 'de': _ => import('./i18n.min/de.json'),\n 'en': _ => import('./i18n.min/en.json'),\n 'es': _ => import('./i18n.min/es.json'),\n 'fr': _ => import('./i18n.min/fr.json'),\n 'ko': _ => import('./i18n.min/ko.json'),\n 'ro': _ => import('./i18n.min/ro.json'),\n 'ru': _ => import('./i18n.min/ru.json'),\n 'zh': _ => import('./i18n.min/zh.json'),\n 'zh-TW': _ => import('./i18n.min/zh-TW.json')\n};\n\n// Detect human language to use in the UI:\n// Check parameters from URL hash #?hl=ru, then browser, then use 'en' as a fallback.\nconst { params } = HashNavigation.parseUrlHash(window.location.hash);\nconst language = (params && params.hl) ||\n (navigator.languages && navigator.languages[0]) ||\n navigator.language ||\n navigator.userLanguage ||\n 'en';\n\n// Make sure names like 'en_GB' and 'en-GB' consistently use '-'.\nconst normalized = language.replace('_', '-');\n// Get the base language 'en' from a more specific 'en-US' as a partial fallback.\nconst baseLanguage = normalized.split('-')[0].toLowerCase();\n\n// Try the full locale first, then the locale without the region code, fallback to 'en'.\nconst htmlLang = messageLoader[normalized] ? language : messageLoader[baseLanguage] ? baseLanguage : 'en';\n\n// Set lang attribute of the HTML element: \ndocument.getElementsByTagName('html')[0].setAttribute('lang', htmlLang);\n\n// Render the app.\nconst root = createRoot(document.getElementById('mountPoint'));\nmessageLoader[htmlLang]().then(messages =>\n root.render(\n \n \n \n));\n"],"names":["leafPrototypes","getProto","inProgress","dataWebpackPrefix","APP_NAME","PACKAGE_VERSION","API_KEY","KNOWN_HOSTS","hosted","local","DEFAULT_HOST","LOGGING_ENABLED","KEYPRESS_DELAY","READ_DELAY","MIN_TAG_LENGTH","MAX_TAG_LENGTH","MAX_TAG_COUNT","DEFAULT_P2P_ACCESS_MODE","NO_ACCESS_MODE","MEDIA_BREAKPOINT","REM_SIZE","AVATAR_SIZE","MAX_AVATAR_BYTES","BROKEN_IMAGE_SIZE","NO_DIMENSIONS_VIDEO","MESSAGES_PAGE","MAX_INBAND_ATTACHMENT_SIZE","MAX_EXTERN_ATTACHMENT_SIZE","MAX_IMAGE_DIM","IMAGE_PREVIEW_DIM","VIDEO_PREVIEW_DIM","IMAGE_THUMBNAIL_DIM","VIDEO_THUMBNAIL_WIDTH","MAX_ONLINE_IN_TOPIC","MAX_TITLE_LENGTH","MAX_TOPIC_DESCRIPTION_LENGTH","MAX_PEER_TITLE_LENGTH","MESSAGE_PREVIEW_LENGTH","QUOTED_REPLY_LENGTH","FORWARDED_PREVIEW_LENGTH","EDIT_PREVIEW_LENGTH","MIN_DURATION","MAX_DURATION","LINK_CONTACT_US","LINK_PRIVACY_POLICY","LINK_TERMS_OF_SERVICE","SUPPORTED_IMAGE_FORMATS","MIME_EXTENSIONS","makeImageUrl","photo","ref","data","type","startsWith","fitImageSize","width","height","maxWidth","maxHeight","forceSquare","Math","min","scale","size","dstWidth","dstHeight","srcWidth","srcHeight","xoffset","yoffset","fileNameForMime","fname","mime","idx","indexOf","ext","at","lastIndexOf","substring","imageScaled","fileOrBlob","maxSize","Promise","resolve","reject","img","Image","crossOrigin","onerror","err","Error","onload","async","URL","revokeObjectURL","src","dim","canvas","document","createElement","ctx","getContext","imageSmoothingEnabled","drawImage","includes","blob","toBlob","length","clearRect","name","createObjectURL","imageCrop","objURL","left","top","_","fileToBase64","file","reader","FileReader","error","bits","result","split","readAsDataURL","blobToBase64","filePasted","event","onImageSuccess","onAttachmentSuccess","onError","items","clipboardData","originalEvent","i","item","kind","getAsFile","console","base64ReEncode","str","replace","btoa","atob","base64ToBlob","bin","buf","ArrayBuffer","arr","Uint8Array","charCodeAt","Blob","intArrayToBase64","Array","isArray","forEach","b","String","fromCharCode","window","base64ToIntArray","b64","c","push","shortDateFormat","then","locale","navigator","userLanguage","language","now","Date","getFullYear","getMonth","getDate","toLocaleTimeString","hour12","hour","minute","toLocaleDateString","month","day","year","relativeDateFormat","diff","floor","getTime","getTimezoneOffset","abs","Intl","RelativeTimeFormat","numeric","format","DateTimeFormat","secondsToTime","seconds","fixedMin","hours","sec","bytesToHumanSize","bytes","sizes","bucket","log2","count","pow","round","toFixed","shortenFileName","filename","maxLength","slice","idToColorClass","id","light","fg","userId","value","hash","stringToColorHash","flagEmoji","countryCode","codePoints","toUpperCase","map","char","fromCodePoint","BAR_COLOR_DARK","messages","defineMessages","icon_title_play","defaultMessage","AudioPlayer","React","constructor","props","super","preview","this","state","canPlay","playing","currentTime","duration","longMin","initAudio","bind","initCanvas","resampleBars","visualize","handlePlay","handleSeek","handleError","audioPlayer","viewBuffer","canvasRef","componentDidMount","componentWillUnmount","oncanplay","ontimeupdate","onended","pause","componentDidUpdate","prevProps","setState","Audio","current","offsetWidth","offsetHeight","canvasContext","lineCap","effectiveWidth","lineWidth","drawFrame","requestAnimationFrame","thumbAt","max","LINE_WIDTH","beginPath","strokeStyle","x","y","color","stroke","moveTo","lineTo","arc","PI","fillStyle","fill","original","dstCount","apply","factor","amps","maxAmp","lo","hi","amp","j","a","e","preventDefault","play","target","rect","getBoundingClientRect","offset","clientX","render","playClass","short","href","onClick","title","intl","formatMessage","className","injectIntl","getExampleNumber","country","examples","metadata","PhoneNumber","mobile_number_required","PhoneEdit","codeMap","dcodes","dc","code","dial","dialCode","localNumber","placeholderNumber","handleChange","handleFinished","handleKeyDown","showCountrySelector","filterNumber","raw","trim","number","parsePhoneNumber","isValid","onSubmit","inputField","setCustomValidity","key","onShowCountrySelector","sample","withMetadataArgument","arguments","formatInternational","placeholder","onChange","onKeyDown","onBlur","required","autoFocus","m","exports","createRoot","hydrateRoot","module","ReactDOM","ReactIntl","getPossibleCountriesForNumber","callingCode","nationalNumber","possibleCountries","getCountryCodesForCallingCode","filter","_metadata","selectNumberingPlan","numberingPlan","possibleLengths","couldNationalNumberBelongToCountry","FIRST_GROUP_PATTERN","formatNationalNumberUsingFormat","_ref","useInternationalFormat","withNationalPrefix","formattedNumber","carrierCode","RegExp","pattern","internationalFormat","nationalPrefixFormattingRule","concat","applyInternationalSeparatorStyle","SINGLE_IDD_PREFIX_REG_EXP","_createForOfIteratorHelperLoose","o","allowArrayLike","it","Symbol","iterator","call","next","minLen","_arrayLikeToArray","n","Object","prototype","toString","from","test","_unsupportedIterableToArray","done","TypeError","len","arr2","ownKeys","object","enumerableOnly","keys","getOwnPropertySymbols","symbols","sym","getOwnPropertyDescriptor","enumerable","_objectSpread","source","_defineProperty","getOwnPropertyDescriptors","defineProperties","defineProperty","obj","configurable","writable","DEFAULT_OPTIONS","formatExtension","extension","formatNumber","input","options","hasCountry","countryCallingCode","phone","v2","addExtension","formatNationalNumber","fromCountry","fromCountryCallingCode","iddPrefix","countryMetadata","defaultIDDPrefix","IDDPrefix","getIddPrefix","undefined","formatIDD","formatAs","availableFormats","nationalNnumber","_step","_iterator","leadingDigitsPatterns","lastLeadingDigitsPattern","search","matchesEntirely","chooseFormatForNumber","formats","nationalPrefixIsOptionalWhenFormattingInNationalFormat","nationalPrefix","_defineProperties","descriptor","instance","Constructor","_classCallCheck","isCountryCode","protoProps","staticProps","hasTypes","getNumberType","national_number","nationalNumberPattern","isValidNumber","isNonGeographicCallingCode","phoneNumber","_format","MIN_LENGTH_FOR_NSN","MAX_LENGTH_FOR_NSN","MAX_LENGTH_COUNTRY_CODE","VALID_DIGITS","VALID_PUNCTUATION","PLUS_CHARS","_slicedToArray","_arrayWithHoles","_i","_s","_e","_arr","_n","_d","_iterableToArrayLimit","_nonIterableRest","parseRFC3966","text","_part$split2","formatRFC3966","checkNumberLength","checkNumberLengthForType","type_info","possible_lengths","mobile_type","merged","element","sort","mergeArrays","actual_length","minimum_length","getExtensionDigitsPattern","createExtensionPattern","purpose","possibleSeparatorsBetweenNumberAndExtLabel","possibleCharsAfterExtLabel","optionalExtnSuffix","possibleSeparatorsNumberExtLabelNoComma","NON_FIXED_LINE_PHONE_TYPES","isNumberTypeEqualTo","MIN_LENGTH_PHONE_NUMBER_PATTERN","VALID_PHONE_NUMBER","VALID_PHONE_NUMBER_START_REG_EXP","VALID_PHONE_NUMBER_WITH_EXTENSION","VALID_PHONE_NUMBER_PATTERN","isViablePhoneNumber","isViablePhoneNumberStart","regular_expression","isPossiblePhoneNumber","isPossibleNumber","pa","pb","na","Number","nb","isNaN","_typeof","_createClass","DEFAULT_EXT_PREFIX","CALLING_CODE_REG_EXP","Metadata","is_object","countries","join","type_of","validateMetadata","setVersion","v1","v3","nonGeographic","nonGeographical","getCountryMetadata","countryCodes","countryCallingCodes","NumberingPlan","hasCallingCode","getNumberingPlanMetadata","getCountryCodeForCallingCode","nationalPrefixForParsing","nationalPrefixTransformRule","leadingDigits","_type","country_phone_code_to_countries","country_calling_codes","globalMetadataObject","_this","_getFormats","getDefaultCountryMetadataForRegion","Format","_getNationalPrefixFormattingRule","_nationalPrefixForParsing","_getNationalPrefixIsOptionalWhenFormatting","types","_type2","getType","Type","usesNationalPrefix","FIRST_GROUP_ONLY_PREFIX_PATTERN","getCountryCallingCode","version","v4","_possibleConstructorReturn","self","_assertThisInitialized","ReferenceError","_wrapNativeSuper","Class","_cache","Map","fn","Function","has","get","set","Wrapper","_construct","_getPrototypeOf","create","_setPrototypeOf","Parent","args","_isNativeReflectConstruct","Reflect","construct","sham","Proxy","Boolean","valueOf","p","setPrototypeOf","__proto__","getPrototypeOf","ParseError","_Error","subClass","superClass","_inherits","Derived","hasNativeReflectConstruct","_super","Super","NewTarget","EXTN_PATTERN","DIGITS","parseDigit","character","parseIncompletePhoneNumber","string","parsePhoneNumberCharacter","prevParsedCharacters","CAPTURING_DIGIT_PATTERN","extractNationalNumber","_extractNationalNumbe","prefixPattern","prefixMatch","exec","capturedGroupsCount","hasCapturedGroups","prefixBeforeNationalNumber","possiblePositionOfTheFirstCapturedGroup","extractNationalNumberFromPossiblyIncompleteNumber","nationalNumberBefore","nationalNumberAfter","shouldHaveExtractedNationalPrefix","isPossibleIncompleteNationalNumber","extractCountryCallingCode","numberWithoutIDD","IDDPrefixPattern","matchedGroups","match","stripIddPrefix","_extractCountryCallin","possibleShorterNumber","possibleShorterNationalNumber","extractCountryCallingCodeFromInternationalNumberWithoutPlusSign","shorterNumber","_countryCallingCode","getCountryByCallingCode","nationalPhoneNumber","getCountryByNationalNumber","PHONE_NUMBER_START_PATTERN","AFTER_PHONE_NUMBER_END_PATTERN","parse","defaultCountry","_parseInput","extract","throwOnError","startsAt","extractFormattedPhoneNumber","withExtensionStripped","start","numberWithoutExtension","matches","extractExtension","parseInput","formattedPhoneNumber","_parsePhoneNumber","defaultCallingCode","exactCountry","hasSelectedNumberingPlan","valid","extended","possible","_normalizeArguments","normalizeArguments","_Array$prototype$slic2","arg_1","arg_2","arg_3","arg_4","isObject","parsePhoneNumberWithError","func","_arguments","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","getter","__esModule","d","t","mode","ns","r","def","getOwnPropertyNames","definition","f","chunkId","all","reduce","promises","u","g","globalThis","prop","hasOwnProperty","l","url","script","needAttach","scripts","getElementsByTagName","s","getAttribute","charset","timeout","nc","setAttribute","onScriptComplete","prev","clearTimeout","doneFns","parentNode","removeChild","setTimeout","head","appendChild","toStringTag","installedChunks","installedChunkData","promise","errorType","realSrc","message","request","webpackJsonpCallback","parentChunkLoadingFunction","chunkIds","moreModules","runtime","some","chunkLoadingGlobal","stringToByteArray$1","out","base64","byteToCharMap_","charToByteMap_","byteToCharMapWebSafe_","charToByteMapWebSafe_","ENCODED_VALS_BASE","ENCODED_VALS","ENCODED_VALS_WEBSAFE","HAS_NATIVE_SUPPORT","encodeByteArray","webSafe","init_","byteToCharMap","output","byte1","haveByte2","byte2","haveByte3","byte3","outByte1","outByte2","outByte3","outByte4","encodeString","decodeString","pos","c1","c2","c3","byteArrayToString","decodeStringToByteArray","charToByteMap","charAt","byte4","base64urlEncodeWithoutPadding","utf8Bytes","base64Encode","base64Decode","getDefaultsFromGlobal","getGlobal","__FIREBASE_DEFAULTS__","getDefaults","process","env","defaultsJsonString","JSON","getDefaultsFromEnvVariable","cookie","decoded","getDefaultsFromCookie","info","Deferred","wrapCallback","callback","catch","isIndexedDBAvailable","indexedDB","validateIndexedDBOpenable","preExist","DB_CHECK_NAME","open","onsuccess","close","deleteDatabase","onupgradeneeded","_a","FirebaseError","customData","captureStackTrace","ErrorFactory","service","serviceName","errors","fullCode","template","PATTERN","replaceTemplate","fullMessage","deepEqual","aKeys","bKeys","k","aProp","bProp","thing","getModularInstance","_delegate","Component","instanceFactory","multipleInstances","serviceProps","instantiationMode","onInstanceCreated","setInstantiationMode","setMultipleInstances","setServiceProps","setInstanceCreatedCallback","DEFAULT_ENTRY_NAME","Provider","container","component","instances","instancesDeferred","instancesOptions","onInitCallbacks","identifier","normalizedIdentifier","normalizeInstanceIdentifier","deferred","isInitialized","shouldAutoInitialize","getOrInitializeService","instanceIdentifier","getImmediate","optional","getComponent","setComponent","isComponentEager","instanceDeferred","entries","clearInstance","delete","services","values","INTERNAL","_delete","isComponentSet","getOptions","initialize","opts","onInit","existingCallbacks","Set","add","existingInstance","invokeOnInitCallbacks","callbacks","ComponentContainer","providers","addComponent","provider","getProvider","addOrOverwriteComponent","getProviders","LogLevel","levelStringToEnum","DEBUG","VERBOSE","INFO","WARN","ERROR","SILENT","defaultLogLevel","ConsoleMethod","defaultLogHandler","logType","logLevel","toISOString","method","idbProxyableTypes","cursorAdvanceMethods","cursorRequestMap","WeakMap","transactionDoneMap","transactionStoreNamesMap","transformCache","reverseTransformCache","idbProxyTraps","receiver","IDBTransaction","objectStoreNames","objectStore","wrap","wrapFunction","IDBDatabase","transaction","IDBCursor","advance","continue","continuePrimaryKey","unwrap","storeNames","tx","transformCachableValue","unlisten","removeEventListener","complete","DOMException","addEventListener","cacheDonePromiseForTransaction","IDBObjectStore","IDBIndex","IDBRequest","success","promisifyRequest","newValue","openDB","blocked","upgrade","blocking","terminated","openPromise","oldVersion","newVersion","db","deleteDB","readMethods","writeMethods","cachedMethods","getMethod","targetFuncName","useIndex","isWrite","storeName","store","index","shift","oldTraps","PlatformLoggerServiceImpl","getPlatformInfoString","isVersionServiceProvider","library","logString","name$o","version$1","logger","_logLevel","_logHandler","_userLogHandler","val","setLogLevel","logHandler","userLogHandler","debug","log","warn","PLATFORM_LOG_STRING","_apps","_components","_addComponent","app","_registerComponent","componentName","heartbeatController","triggerHeartbeat","ERROR_FACTORY","FirebaseAppImpl","config","_isDeleted","_options","assign","_config","_name","_automaticDataCollectionEnabled","automaticDataCollectionEnabled","_container","checkDestroyed","isDeleted","appName","initializeApp","rawConfig","existingApp","newApp","registerVersion","libraryKeyOrName","variant","libraryMismatch","versionMismatch","warning","STORE_NAME","dbPromise","getDbPromise","createObjectStore","originalErrorMessage","writeHeartbeatsToIndexedDB","heartbeatObject","put","computeKey","idbGetError","appId","HeartbeatServiceImpl","_heartbeatsCache","_storage","HeartbeatStorageImpl","_heartbeatsCachePromise","read","agent","date","getUTCDateString","lastSentHeartbeatDate","heartbeats","singleDateHeartbeat","hbTimestamp","overwrite","heartbeatsToSend","unsentEntries","heartbeatsCache","heartbeatEntry","find","hb","dates","countBytes","pop","extractHeartbeatsForHeader","headerString","stringify","_canUseIndexedDBPromise","runIndexedDBEnvironmentCheck","readHeartbeatsFromIndexedDB","heartbeatsObject","existingHeartbeatsObject","PENDING_TIMEOUT_MS","INTERNAL_AUTH_VERSION","TOKEN_EXPIRATION_BUFFER","isServerError","getInstallationsEndpoint","projectId","extractAuthTokenInfoFromResponse","response","token","requestStatus","expiresIn","responseExpiresIn","creationTime","getErrorFromResponse","requestName","errorData","json","serverCode","serverMessage","serverStatus","status","getHeaders","apiKey","Headers","Accept","getHeadersWithAuth","appConfig","refreshToken","headers","append","getAuthorizationHeader","retryIfServerError","sleep","ms","VALID_FID_PATTERN","generateFid","fidByteArray","crypto","msCrypto","getRandomValues","fid","b64String","array","substr","encode","getKey","fidChangeCallbacks","fidChanged","callFidChangeCallbacks","channel","getBroadcastChannel","postMessage","closeBroadcastChannel","broadcastFidChange","broadcastChannel","BroadcastChannel","onmessage","OBJECT_STORE_NAME","oldValue","remove","update","updateFn","getInstallationEntry","installations","registrationPromise","installationEntry","oldEntry","entry","registrationStatus","clearTimedOutRequest","updateOrCreateInstallationEntry","entryWithPromise","onLine","inProgressEntry","registrationTime","registeredInstallationEntry","heartbeatServiceProvider","endpoint","heartbeatService","heartbeatsHeader","getHeartbeatsHeader","body","authVersion","sdkVersion","fetch","ok","responseValue","authToken","createInstallationRequest","registerInstallation","waitUntilFidRegistration","triggerRegistrationIfNecessary","updateInstallationRequest","generateAuthTokenRequest","getGenerateAuthTokenEndpoint","installation","refreshAuthToken","forceRefresh","tokenPromise","isEntryRegistered","oldAuthToken","isAuthTokenExpired","isAuthTokenValid","updateAuthTokenRequest","waitUntilAuthTokenRequest","inProgressAuthToken","requestTime","makeAuthTokenRequestInProgressEntry","updatedInstallationEntry","fetchAuthTokenFromServer","getToken","installationsImpl","completeInstallationRegistration","getMissingValueError","valueName","INSTALLATIONS_NAME","internalFactory","getId","configKeys","keyName","extractAppConfig","DEFAULT_VAPID_KEY","CONSOLE_CAMPAIGN_ID","MessageType$1","MessageType","arrayToBase64","uint8Array","base64ToArray","base64String","repeat","rawData","outputArray","OLD_DB_NAME","OLD_OBJECT_STORE_NAME","upgradeDb","dbGet","firebaseDependencies","tokenDetails","oldTokenDetails","senderId","dbNames","databases","upgradeTransaction","contains","clear","oldDetails","auth","p256dh","fcmToken","createTime","subscriptionOptions","swScope","vapidKey","checkTokenDetails","migrateOldDatabase","dbSet","requestDeleteToken","unsubscribeOptions","getEndpoint","responseData","errorInfo","getBody","web","applicationPubKey","getTokenInternal","messaging","pushSubscription","swRegistration","subscription","pushManager","getSubscription","subscribe","userVisibleOnly","applicationServerKey","getPushSubscription","scope","dbOptions","currentOptions","isVapidKeyEqual","isEndpointEqual","isAuthEqual","isP256dhEqual","isTokenValid","updatedToken","updateOptions","requestUpdateToken","updatedTokenDetails","deleteTokenInternal","updateToken","getNewToken","dbRemove","unsubscribe","subscribeOptions","requestGetToken","externalizePayload","internalPayload","payload","collapseKey","collapse_key","messageId","fcmMessageId","messagePayloadInternal","notification","image","icon","propagateNotificationPayload","propagateDataPayload","_b","_c","fcmOptions","click_action","link","analyticsLabel","analytics_label","propagateFcmOptions","_mergeStrings","s1","s2","resultArray","MessagingService","analyticsProvider","deliveryMetricsExportedToBigQueryEnabled","onBackgroundMessageHandler","onMessageHandler","logEvents","isLogServiceStarted","messagingSenderId","registerDefaultSw","serviceWorker","register","browserErrorMessage","getToken$1","Notification","permission","requestPermission","updateVapidKey","ServiceWorkerRegistration","updateSwReg","serviceWorkerRegistration","logToScion","messageType","eventType","NOTIFICATION_CLICKED","PUSH_RECEIVED","getEventType","logEvent","message_id","message_name","message_time","message_device_time","messageEventListener","isFirebaseMessaging","dataPayload","WindowMessagingInternalFactory","isWindowSupported","cookieEnabled","PushSubscription","getMessagingInWindow","isSupported","deleteToken","deleteToken$1","onMessage","nextOrObserver","onMessage$1","Tinode","Alert","content","onReject","FormattedMessage","onConfirm","confirm","clear_messages","clear_for_all","delete_for_all","send_retry","mute","unmute","reply","forward","edit","topic_delete","topic_delete_warning","delete_messages_warning","unblock","block","topic_block_warning","member_delete","archive","unarchive","edit_permissions","clear_messages_warning","ContextMenu","selfRef","handlePageClick","handleEscapeKey","handleClick","MenuItems","handler","params","errorHandler","onShowAlert","deleteMessages","retryMessage","replyToMessage","editMessage","topicPermissionSetter","ctrl","onTopicRemoved","topicName","topic","tinode","getTopic","delTopic","user","delSubscription","stopPropagation","hide","keyCode","currentTarget","dataset","onAction","hard","cancelSend","seq","delMessagesAll","delMessagesEdits","delMessagesList","flushMessage","msg","createMessage","publishDraft","updateMode","pickReply","userFrom","userName","menu","hSize","vSize","position","bounds","right","clickAt","bottom","style","icon_mapping","ContactBadges","badges","updateFavicon","oldIcon","getElementById","newIcon","rel","theCard","imageUrl","imageMimeType","note","card","mimeType","arrayEqual","sanitizeUrl","allowedSchemes","schemes","sanitizeUrlForMime","mimeMajor","sanitizedUrl","deliveryMarker","received","cancelablePromise","hasCanceled","isCanceled","cancel","clipStr","LetterTile","avatar","isGroup","iconColor","letter","deleted","authorizeURL","alt","UnreadBadge","CallMessage","isCallDropped","callState","successClass","callIcon","incoming","CallStatus","icon2","InlineVideo","videoRef","LazyImage","isvideo","padding","whenDone","FileProgress","progress","onCancel","UploadingImage","onCancelUpload","drafty_form","drafty_attachment","drafty_image","drafty_video","drafty_unknown","fullFormatter","stack","quoteFormatter","el","Drafty","attr","loading","handleImageData","onFormButtonClick","inner","child","onQuoteClick","handleVideoData","viewportWidth","minWidth","minHeight","onImagePreview","onVideoPreview","previewFormatter","inlineImageAttr","inlineVideoAttr","quoteImageOrVideo","isVideo","premime","preref","evt","statusText","scaled","replyFormatter","loadedPromise","Contact","handleContextClick","onSelected","showContextMenu","pageY","pageX","online","icon_badges","isVerified","isStaff","isDangerous","acs","showMode","getMode","isMuted","isJoiner","previewIsResponse","marker","titleClass","showCheckmark","selected","showOnline","isChannel","unread","small","comment","ContactAction","action","badge_you","badge_owner","ContactList","topicSelected","contactNodes","contactsCount","contacts","filterFunc","filterOn","private","toLowerCase","public","myUserId","isOwner","forwarded","deliveryStatus","latestMessage","_status","msgStatus","showUnread","connected","trusted","verified","staff","danger","_deleted","onTopicSelected","noScroll","dangerouslySetInnerHTML","__html","emptyListMessage","SearchContacts","edited","handleSearchChange","handleSearch","handleClear","onSearchContacts","query","ForwardDialog","handleClose","handleSearchContacts","handleContactSelected","onInitFind","uid","searchResults","isWriter","desription","search_placeholder","not_found_placeholder","badge_verified","badge_staff","badge_danger","BadgeList","trustedBadges","CALL_HEAD_STARTED","RING_SOUND","CallIncoming","fullName","previousMetaDesc","resetDesc","onMetaDesc","handleRejectCall","handleAcceptCall","ringTimer","setInterval","onRinging","clearInterval","desc","onAcceptCall","onClose","LoadSpinner","large","centered","show","AvatarUpload","handleFileReceived","files","onImageUpdated","randId","random","readOnly","accept","htmlFor","uploading","CheckBox","checked","iconName","classList","attrs","MenuCancel","ErrorPanel","level","onClearError","whiteSpace","actionText","Chip","handleCancel","invalid","noAvatar","ChipInput","deriveStateFromProps","focused","handleTextInput","removeChipAt","handleChipCancel","handleFocusGained","handleFocusLost","static","chips","prompt","sortedChips","sortChips","staticMembers","chipIndex","indexChips","prevState","keep","normal","removed","onChipRemoved","onFocusLost","onEnter","avatarDisabled","tabIndex","onFocus","no_contacts","contacts_not_found_short","GroupManager","members","indexMembers","keepInitialMembers","requiredMember","contactFilter","noContactsMessage","selectedContacts","handleMemberRemoved","handleContactFilter","handleSubmit","delta","present","keepInitial","stat","sel","splice","added","doContactFiltering","joiner","writer","preser","approver","sharer","deleter","owner","PermissionsEditor","names","skip","compare","userTitle","userAvatar","modeTitle","compareTitle","Cropper","panX","panY","originX","originY","zoom","minZoom","maxZoom","overlay","cutout","boundingBox","imageWidth","imageHeight","mouseX","mouseY","prevDistance","cutoutRect","bBoxRect","initScaling","onZoom","handleZoom","mouseDown","mouseUp","mouseMove","mouseTouch","positionAll","translate","passive","currPan","nextDiff","imgRect","imgLeft","imgRight","coLeft","coRight","imgTop","imgBottom","coTop","coBottom","touches","dX","dY","checkBound","touch0","touch1","distance","sqrt","t3d","orig","transform","transformOrigin","onLoad","step","AvatarCrop","VisiblePassword","inputRef","visible","handleVisibility","handeTextChange","handleEditingFinished","focus","onFinished","activeElement","autoComplete","InPlaceEdit","active","initialValue","handleStartEditing","handlePasswordFinished","checkValidity","spanText","spanClass","multiline","rows","TagManager","tags","tagInput","activated","handleTagInput","handleAddTag","handleRemoveTag","nextProps","last","tag","maxTagCount","getServerParam","onTagsChanged","minTagLength","maxTagLength","add_tags_prompt","TopicDescEdit","getAccessMode","isMe","description","newAvatar","newAvatarMime","previousOnTags","tnNewTags","handleFullNameUpdate","handleImageUpdated","handleAvatarCropped","handleAvatarCropCancel","uploadAvatar","handlePrivateUpdate","handleDescriptionUpdate","handleTagsUpdated","onTagsUpdated","onUpdateTopicDesc","readyToUpload","getLargeFileHelper","upload","du","onUpdateTags","editable","full_name_placeholder","group_name_placeholder","private_placeholder","title_tag_manager","TopicCommonView","previousTagsUpdated","onUpdateTagsRequest","delete_messages","leave_chat","leave_chat_warning","block_contact","block_contact_warning","report_chat","report_chat_warning","other_user","TopicSecurity","handleDeleteTopic","handleDeleteMessages","handleLeave","handleBlock","handleReport","onDeleteTopic","onDeleteMessages","onLeaveTopic","onBlockTopic","onReportTopic","groupTopic","onLaunchPermissionsEditor","access","anon","modeGiven2","general","security","crop","perm_want","perm_given","perm_auth","perm_anon","perm_user","InfoView","admin","muted","address","selectedContact","modeGiven","modeWant","modeWant2","contactList","previousSubsUpdated","resetSubs","resetTags","onSubsUpdated","handleImageChanged","handleMuted","handleUnarchive","handlePermissionsChanged","handleLaunchPermissionsEditor","handleShowAddMembers","handleMemberUpdateRequest","handleMemberSelected","handleContextMenu","handleBackNavigate","newState","user2","subscriber","getGiven","getWant","subscribers","sub","defacs","getDefaultAccess","isAdmin","isSharer","isDeleter","archived","isArchived","isGroupType","isChannelType","chan","getMeta","startMetaQuery","withTags","build","subs","onTopicDescUpdate","ignored","onChangePermissions","ignored2","onTopicUnArchive","which","perm","onTopicDescUpdateRequest","userPermissionsEdited","toEdit","toCompare","toSkip","titleEdit","titleCompare","AccessMode","userPermissionsTitle","userPermissionsAvatar","editedPermissions","immutablePermissions","editedPermissionsTitle","immutablePermissionsTitle","editedPermissionsSkipped","onNavigate","onMemberUpdateRequest","panel","menuItems","view","panelTitle","displayMobile","errorLevel","errorText","searchableContacts","reqCredMethod","onCredAdd","onTopicTagsUpdateRequest","onCredConfirm","onCredDelete","no_members","loop","CALL_ENDED_SOUND","DIALING_SOUND","VIDEO_MUTED_EVENT","VIDEO_UNMUTED_EVENT","already_in_call","CallPanel","localStream","remoteStream","pc","dataChannel","previousOnInfo","waitingForPeer","callInitialSetupComplete","audioOnly","callAudioOnly","videoToggleInProgress","remoteVideoLive","localStreamConstraints","audio","video","isOutgoingCall","localRef","remoteRef","remoteIceCandidatesCache","onInfo","stop","createPeerConnection","canSendOffer","drainRemoteIceCandidatesCache","handleNegotiationNeededEvent","handleICECandidateEvent","handleNewICECandidateMsg","handleICEConnectionStateChangeEvent","handleSignalingStateChangeEvent","handleICEGatheringStateChangeEvent","handleIceCandidateErrorEvent","handleTrackEvent","handleVideoOfferMsg","handleVideoAnswerMsg","reportError","handleGetUserMediaError","stopTracks","disconnectMedia","handleCloseClick","handleToggleCameraClick","handleToggleMicClick","handleRemoteHangup","handleVideoCallAccepted","muteVideo","unmuteVideo","emptyVideoTrack","handleDataChannelEvent","handleDataChannelError","handleDataChannelMessage","handleDataChannelOpen","handleDataChannelClose","stream","getTracks","track","addTrack","enabled","removeTrack","what","fillRect","captureStream","getVideoTracks","mediaDevices","getUserMedia","srcObject","onInvite","ontrack","onremovetrack","onremovestream","onicecandidate","oniceconnectionstatechange","onsignalingstatechange","onicegatheringstatechange","onnegotiationneeded","onicecandidateerror","ondatachannel","tracks","send","onopen","onclose","iceServers","RTCPeerConnection","createDataChannel","ordered","RTCSessionDescription","setRemoteDescription","createOffer","offer","setLocalDescription","onSendOffer","localDescription","toJSON","candidate","onIceCandidate","RTCIceCandidate","addIceCandidate","iceConnectionState","signalingState","streams","dummyVideo","createAnswer","answer","onSendAnswer","onHangup","sender","getSenders","replaceTrack","finally","readyState","getAudioTracks","forceUpdate","audioTracks","videoTracks","disabled","audioIcon","videoIcon","peerTitle","pulseAnimation","remoteActive","rstream","autoPlay","playsInline","Attachment","downloader","downloadFile","mimetype","download","loaded","helperFunc","isUrlRelative","downloadUrl","downloadWidget","message_sending","message_sending_failed","message_edited_marker","ReceivedMarker","timestamp","timeStyle","BaseChatMessage","uploader","onProgress","handleProgress","handleExpandImage","handlePlayVideo","handleFormButtonClick","handleCancelUpload","handleQuoteClick","formatterContext","onExpandMedia","resp","act","onFormResponse","userIsWriter","immutable","_0","_1","tp","parseInt","ratio","replyToSeq","sideClass","sequence","bubbleClass","fullDisplay","attachments","att","tree","innerRef","IntlChatMessage","AudioRecorder","messaging_disabled","type_new_message","add_image_caption","file_attachment_too_large","cannot_initiate_upload","icon_title_record_voice","icon_title_attach_file","icon_title_add_image","icon_title_send","SendMessage","quote","audioRec","audioAvailable","keypressTimestamp","handlePasteEvent","handleAttachImage","handleAttachFile","handleAttachAudio","handleSend","handleKeyPress","handleMessageTyping","handleDropAttach","formatReply","messageEditArea","getComputedStyle","getPropertyValue","initMessage","scrollTop","scrollHeight","setSelectionRange","onAttachImage","onAttachFile","onAttachAudio","acceptBlank","noInput","onSendMessage","shiftKey","onKeyPress","messagePrompt","sendIcon","editing","onCancelReply","audioEnabled","attachImage","click","attachFile","Suspense","fallback","onRecordingProgress","onDeleted","display","DocPreview","handleSendDoc","caption","mimeToIcon","default","iconFromMime","GroupSubs","usersOnline","totalCount","countToShow","overflow","ImagePreview","handleSendImage","assignWidth","node","maxlength","Invitation","handleButtonAction","LogoView","serverVersion","serverAddress","MetaMessage","unrecognized_video_format","VideoPreview","handleSendVideo","videoWidth","videoHeight","controlist","controls","controlsList","disablePictureInPicture","poster","HashNavigation","parts","path","arg","eq","decodeURIComponent","location","encodeURIComponent","parsed","parseUrlHash","composeUrlHash","sidepanel","infopanel","online_now","last_seen","not_found","invalid_content","editing_message","drag_file","isUnconfirmed","ex","getExcessive","isPeerRestricted","getMissing","shouldPresentCallPanel","MessagesView","getDerivedStateFromProps","leave","sendMessage","retrySend","sendImageAttachment","sendVideoAttachment","sendFileAttachment","sendAudioAttachment","sendKeyPress","handleScrollReference","mountDnDEvents","handleScrollEvent","handleDescChange","handleSubsUpdated","handleMessageUpdate","handleAllMessagesReceived","handleInfoReceipt","handleExpandMedia","handleClosePreview","handleFormResponse","handleShowMessageContextMenu","handleNewChatAcceptance","handleEnablePeer","handleAttachImageOrVideo","postReadNotification","clearNotificationQueue","goToLatestMessage","handleFileDrop","handlePickReply","handleEditMessage","handleCancelReply","handleCallHangup","isDragEnabled","handleDragIn","handleDragOut","handleDrag","handleDrop","chatMessageRefs","getOrCreateMessageRef","dragCounter","dndRef","readNotificationQueue","readNotificationTimer","keyPressTimer","seqId","messagesScroller","messageCount","scrollPosition","rtcPanel","callSeq","onData","onAllMessagesReceived","onPres","applicationVisible","ready","_new","isP2PType","withDesc","nextState","docPreview","imagePreview","imagePostview","videoPreview","videoPostview","typingIndicator","fetchingMessages","showGoToLastButton","contentToEdit","dragging","forwardMessage","onlineSubs","peer","p2pPeerDesc","peerMessagingDisabled","latestClearId","maxClearId","callTopic","isReader","readingBlocked","unconformed","unconfirmed","isSubscribed","newTopic","newTopicParams","_topicName","getQuery","withLaterDesc","withLaterSub","withLaterData","withLaterDel","setQuery","navigateTo","setUrlTopic","onNewTopicCreated","calls","queuedMessages","pub","_sending","webrtc","blankState","oldTopicName","isTopicCached","oldTopic","msgHasMoreMessages","getMessagesPage","dnd","sendAt","noteRead","setMilliseconds","getMilliseconds","isNewMessage","searchParams","messageSpecificMenuItems","onNewChat","noteRecording","noteKeyPress","uploadCompletionPromise","maxInbandAttachmentSize","urlPromise","maxExternAttachmentSize","limit","onVideoCallClosed","onCallHangup","_tempPreview","videoBlob","previewBlob","uploads","b64s","v64","i64","b64conv","found","findMessage","_cancelled","senderName","onCancelForwardMessage","scrollIntoView","behavior","dataTransfer","clearData","hideSelf","component2","onCallInvite","onCallSendOffer","onCallIceCandidate","onCallSendAnswer","messageNodes","previousFrom","prevDate","chatBoxClass","nextFrom","thisFrom","isReply","userDesc","thisDate","ts","toDateString","isChan","_uploader","lastSeen","cont","getMeTopic","getContact","seen","when","messagesComponent","onHideMessagesView","ButtonBack","onBack","MenuContacts","onNewTopic","onSettings","MenuStart","onSignUp","SideNavbar","CredentialEdit","tel","email","handleEmailChange","handlePhoneChange","formatPhoneNumber","email_prompt","_clip","AccountSettingsView","me","credentials","getCredentials","credEdit","handleEditCred","cred","meth","unshift","archived_contacts_title","ContactsView","handleAction","unreadThreads","archivedCount","chatList","arch","touched","action_ignored","onShowArchive","LocalStorageUtil","localStorage","setItem","getItem","oldVal","getObject","setObject","removeItem","CreateAccountView","login","password","uploadUrl","buttonDisabled","saveToken","handleLoginChange","handlePasswordChange","handleFnChange","handleToggleSaveToken","connect","onCreateAccount","submitClasses","login_prompt","password_prompt","full_name_prompt","stay_logged_in","EditAccountView","handleCheckboxClick","onToggleMessageSounds","onTogglePushNotifications","onToggleIncognitoMode","messageSounds","desktopAlertsEnabled","desktopAlerts","incognitoMode","delete_account","delete_account_warning","AccSecurityView","blockedCount","showPermissionEditorFor","handlePasswordUpdate","handleHidePermissionsEditor","handleDeleteAccount","pwd","onUpdatePassword","onUpdateAccountDesc","onDeleteAccount","password_unchanged","onLogout","onShowBlocked","AccSupportView","LoginView","hostName","persist","onPersistenceChange","onLogin","autoCorrect","autoCapitalize","invalid_id","NewTopicById","groupId","prefix","NewTopicGroup","handleFieldEdit","handleTagsChanged","handleChannelToggle","search_for_contacts","search_no_results","NewTopicView","tabSelected","searchQuery","handleTabClick","handleSearchResultSelected","handleNewGroupSubmit","handleGroupByID","addUrlParam","removeUrlParam","onCreateTopic","dataUrl","priv","no_contacts_placeholder","PasswordResetView","sent","haveCode","handleCodeChange","handleShowCodeField","scheme","onReset","secret","onRequest","showCredentialInput","showPasswordInput","passwordInput","emailInput","phoneInput","sentNotification","codeInput","numbers_only","credentialInput","marginRight","HostSelector","changed","handleHostNameChange","onServerAddressChange","hostOptions","list","SettingsView","transport","secureConnection","handleTransportSelected","handleServerAddressChange","handleToggleSecure","onUpdate","ws","lp","transportOptions","ValidationView","credCode","codeReceived","credMethod","credToken","settings","notif","support","newtpk","reset","SidepanelView","handleNewTopic","errorAction","errorActionText","loadSpinnerVisible","loginDisabled","onLoginRequest","onGlobalSettings","onUpdateAccountTags","onValidateCredentials","onPasswordResetRequest","onResetPassword","detectServerAddress","host","protocol","hostname","port","isSecureConnection","PhoneCountrySelector","POP_SOUND","reconnect_countdown","reconnect_now","push_init_failed","invalid_security_token","no_connection","code_doesnot_match","menu_item_info","menu_item_audio_call","menu_item_video_call","cred_confirmed_successfully","TinodeWeb","getBlankState","handleResize","handleHashRoute","handleOnline","checkForAppUpdate","handleVisibilityEvent","handleLoginRequest","handlePersistenceChange","handleConnected","handleAutoreconnectIteration","doLogin","handleLoginSuccessful","handleDisconnect","tnMeMetaDesc","tnMeContactUpdate","tnMeSubsUpdated","resetContactList","tnInitFind","tnFndSubsUpdated","handleTopicSelected","handleHideMessagesView","handleSendMessage","handleNewChatInvitation","handleNewAccount","handleNewAccountRequest","handleUpdatePasswordRequest","handleUpdateAccountTagsRequest","handleToggleIncognitoMode","handleSettings","handleGlobalSettings","handleShowArchive","handleShowBlocked","handleToggleMessageSounds","handleCredAdd","handleCredDelete","handleCredConfirm","initFCMessaging","toggleFCMToken","handlePushMessage","handleSidepanelCancel","handleStartTopicRequest","handleNewTopicCreated","handleTopicUpdateRequest","handleChangePermissions","handleTagsUpdateRequest","handleLogout","handleDeleteTopicRequest","handleDeleteMessagesRequest","handleLeaveUnsubRequest","handleBlockTopicRequest","handleReportTopic","handleShowContextMenu","defaultTopicContextMenu","handleHideContextMenu","handleShowAlert","handleShowInfoView","handleValidateCredentialsRequest","handlePasswordResetRequest","handleResetPassword","handleContextMenuAction","handleShowCountrySelector","handleShowForwardDialog","handleHideForwardDialog","handleStartVideoCall","handleStartAudioCall","handleInfoMessage","handleDataMessage","handleCallClose","handleCallInvite","handleCallRinging","handleCallSendOffer","handleCallIceCandidate","handleCallSendAnswer","handleCallAccept","sendMessageToTopic","callTimeoutTimer","autoLogin","messageSoundsOff","firebaseInitApp","FIREBASE_INIT","firebaseToken","hidden","sidePanelSelected","sidePanelTitle","sidePanelAvatar","myTrustedBadges","liveConnection","topicSelectedOnline","topicSelectedAcs","innerWidth","infoPanel","mobilePanel","callShouldStart","contextMenuVisible","contextMenuBounds","contextMenuClickAt","contextMenuParams","contextMenuItems","forwardDialogVisible","alertVisible","alertParams","requestedTopic","documentElement","clientWidth","viewportHeight","clientHeight","tnSetup","onConnect","onDisconnect","onAutoreconnectIteration","onInfoMessage","onDataMessage","parsedNav","expires","setAuthToken","readTimer","readTimerCallback","cred_done","persistentCache","onSetupCompleted","secure","setHumanLanguage","enableLogging","oobNotification","updateObject","fcm","firebaseGetMessaging","getRegistration","reg","installing","requestFCMToken","setDeviceToken","firebaseOnMessage","sw","firebaseGetToken","messagingVapidKey","mobile","onupdatefound","installingWorker","onstatechange","controller","newTopicTabSelected","tab","getTopicAccessMode","stateForError","reconnectCountdown","reconnect","isConnected","initStorage","clearStorage","getServerInfo","ver","reqCred","prom","fmtTime","tmpToken","isAuthenticated","getAuthToken","loginPromise","connectionPromise","loginBasic","loginToken","navigateToCredentialsView","goToTopic","onContactUpdate","getCurrentUserID","withCred","disconnect","urlHash","setUrlSidePanel","isPresencer","unused","foundContacts","updated","past","prepareSearchableContacts","fnd","getFndTopic","withSub","setMeta","isTopicOnline","completion","subscribePromise","publishMessage","am","updateWant","login_","password_","public_","cred_","tags_","createAccountBasic","on","firebaseDelToken","delCredential","basicNavigator","infoNavigator","setUrlInfoPanel","newGroupTopicName","oldName","newName","updateAccountBasic","getCurrentLogin","updateGiven","cleared","Promose","delCurrentUser","report","header","msgPreview","self_blocked","subscribed","keepForwardedMessage","confirmText","rejectText","invite","requestResetAuthSecret","newPassword","tempAuth","selectedCallback","aonly","videoCall","sdp","latestMsgVersion","myUserName","onAddMember","handleManageGroupMembers","measurementId","gtag","dataLayer","prepend","messageLoader","hl","languages","normalized","baseLanguage","htmlLang","root","IntlProvider","textComponent"],"sourceRoot":""}
\ No newline at end of file
diff --git a/umd/src_i18n_min_de_json.dev.js b/umd/src_i18n_min_de_json.dev.js
index 00670299..c843b040 100644
--- a/umd/src_i18n_min_de_json.dev.js
+++ b/umd/src_i18n_min_de_json.dev.js
@@ -7,7 +7,7 @@
\******************************/
/***/ ((module) => {
-module.exports = JSON.parse('{"action_block_contact":"Kontakt blockieren","action_cancel":"Abbrechen","action_clear_messages":"Nachrichten leeren","action_delete_messages":"Nachrichten für alle löschen","action_leave_chat":"Unterhaltung verlassen","action_report_chat":"Unterhaltung melden","archived_contacts":"Archivierte Kontakte ({count})","badge_danger":"Verdächtig","badge_owner":"Besitzer","badge_staff":"Verwaltung","badge_verified":"Verifiziert","badge_you":"Sie","block_contact_warning":"Möchten Sie diesen Kontakt wirklich blockieren?","blocked_contacts_link":"Blockierte Kontakte ({count})","button_add_another":"Hinzufügen","button_add_members":"Mitglieder hinzufügen","button_cancel":"Abbrechen","button_confirm":"Bestätigen","button_create":"Erstellen","button_delete_account":"Konto löschen","button_edit":"Bearbeiten","button_logout":"Abmelden","button_ok":"OK","button_reset":"Zurücksetzen","button_send_request":"Anfrage senden","button_sign_in":"Anmelden","button_sign_up":"Anmelden","button_subscribe":"Abbonieren","button_update":"Aktualisieren","cannot_initiate_file_upload":"Datei kann nicht hochgeladen werden.","channel":"Sender","channel_prompt":"Dies ist ein Sender","chat_invitation":"Sie sind eingeladen, an einem neuen Chat teilzunehmen. Was möchten Sie tun?","chat_invitation_accept":"Akzeptieren","chat_invitation_block":"Blockieren","chat_invitation_ignore":"Ignorieren","clear_messages_warning":"Sind Sie sicher, dass Sie diese Unterhaltung für alle leeren wollen? Das kann nicht rückgängig gemacht werden.","code_doesnot_match":"Code stimmt nicht überein","contacts_not_found":"Sie haben keine Unterhaltungen ¯∖_(ツ)_/¯","contacts_not_found_short":"Keine Kontakte für \'\'{query}\'\'","credential_email_prompt":"E-Mail Adresse für Registrierung","delete_account":"Konto löschen","delete_account_warning":"Möchten Sie das Konto wirklich löschen? Das kann nicht rückgängig gemacht werden","delete_messages_warning":"Sind Sie sicher, dass Sie diese Unterhaltung für alle löschen wollen? Das kann nicht rückgängig gemacht werden.","download_action":"herunterladen","drafty_attachment":"Dateianhang","drafty_form":"Formular:","drafty_image":"Bild","email_dative":"E-Mail","email_prompt":"E-Mail, z.B. lisam@beispiel.de","enable_peers_messaging":"Aktivieren","enter_confirmation_code_prompt":"Geben Sie den Bestätigungscode ein, der per {method} geschickt wurde:","error_invalid_id":"ungültige ID","file_attachment_too_large":"Die Dateigröße {size} überschreitet das Limit von {limit}.","forgot_password_link":"Passwort vergessen?","full_name_prompt":"Vollständiger Name, z.B. Lisa Musterfrau","granted_permissions":"Erteilt","group_has_no_members":"Keine Mitglieder","group_user_id_prompt":"Gruppe oder Benutzer ID","image_caption_prompt":"Bildunterschrift","invalid_content":"ungültiger Inhalt","invalid_security_token":"Ungültiger Sicherheitsschlüssel","label_client":"Client:","label_content_type":"Inhaltsart:","label_default_access_mode":"Standard Zugriffsmodus:","label_file_name":"Dateiname:","label_group_members":"Gruppenmitglieder:","label_incognito_mode":"inkognito-Modus:","label_message_sound":"Benachrichtigungston:","label_muting_topic":"Stumm geschaltet:","label_other_user":"Andere","label_password":"Passwort","label_permissions":"Berechtigungen:","label_private":"Privater Kommentar","label_push_notifications":"Benachrichtigungsmeldungen:","label_push_notifications_disabled":"Benachrichtigungsmeldungen (erfordert HTTPS):","label_reset_password":"Passwort per E-Mail wiederherstellen:","label_sdk":"SDK:","label_server":"Server:","label_server_address":"Server Adresse:","label_server_to_use":"Server verwenden:","label_size":"Größe:","label_topic_name":"Name","label_user_contacts":"Kontakte:","label_user_id":"ID:","label_wire_transport":"Übertragung per Kabel:","label_you":"Sie:","label_your_name":"Ihr Name","label_your_permissions":"Ihre Berechtigungen:","last_seen_timestamp":"Zuletzt gesehen","leave_chat_warning":"Möchten Sie diese Unterhaltung wirklich verlassen?","link_contact_us":"Kontakt","link_privacy_policy":"Datenschutzerklärung","link_terms_of_service":"Nutzungsbedingungen","login_prompt":"Anmelden","menu_item_archive_topic":"Archivieren","menu_item_block":"Blockieren","menu_item_clear_messages":"Nachrichten leeren","menu_item_clear_messages_for_all":"Für alle leeren","menu_item_delete":"Löschen","menu_item_delete_for_all":"Für alle löschen","menu_item_delete_topic":"Entfernen","menu_item_edit_permissions":"Berechtigungen ändern","menu_item_info":"Info","menu_item_member_delete":"Entfernen","menu_item_mute":"Unterhaltung stumm schalten","menu_item_restore_topic":"Wiederherstellen","menu_item_send_retry":"Wiederholen","menu_item_unblock":"Blockierung aufheben","menu_item_unmute":"Stumm schalten beenden","message_sending":"wird gesendet...","message_sending_failed":"fehlgeschlagen","messages_not_readable":"Neue Nachrichten können nicht gelesen werden","messaging_disabled_prompt":"Nachrichtenübermittlung deaktiviert","more_online_members":"+{overflow} mehr","new_message_prompt":"Neue Nachricht","new_password_placeholder":"Geben Sie ein neues Passwort ein","no_connection":"Keine Verbindung","no_contacts":"Sie haben keine Kontakte :-(","numeric_confirmation_code_prompt":"Nur zahlen","online_now":"jetzt online","password_prompt":"Passwort","password_unchanged_prompt":"unverändert","peers_messaging_disabled":"Gruppennachrichten sind deaktiviert","permission_admin":"Bestätigen ({val})","permission_delete":"Entfernen ({val})","permission_join":"Beitreten ({val})","permission_owner":"Besitzer ({val})","permission_pres":"Benachrichtigt werden ({val})","permission_read":"Lesen ({val})","permission_share":"Teilen ({val})","permission_write":"Schreiben ({val})","phone_dative":"Telefon","private_editing_placeholder":"Nur für Sie sichtbar","push_init_failed":"Initialisierung von Push-Benachrichtigungen fehlgeschlagen","reconnect_countdown":"Getrennt. Wiederverbinden in {seconds}…","reconnect_now":"Jetzt probieren","reload_update":"Neu laden","report_chat_warning":"Möchten Sie diese Unterhaltung wirklich blockieren und melden?","requested_permissions":"Angefordert","save_attachment":"Speichern","search_for_contacts":"Nutzen Sie die Suche um Kontakte zu finden","search_no_results":"Die Suche hatte keine Ergebnisse","search_placeholder":"Liste: email:lisa@beispiel.de, tel:17025550003...","sidepanel_title_acc_notifications":"Benachrichtigungen","sidepanel_title_acc_support":"Unterstützung","sidepanel_title_account_settings":"Konto-Einstellungen","sidepanel_title_archive":"Archivierte Unterhaltungen","sidepanel_title_blocked":"Blockierte Unterhaltungen","sidepanel_title_cred":"Anmeldeinformationen bestätigen","sidepanel_title_login":"Anmelden","sidepanel_title_newtpk":"Neue Unterhaltung starten","sidepanel_title_register":"Konto erstellen","sidepanel_title_reset":"Passwort zurücksetzen","sidepanel_title_settings":"Einstellungen","stay_logged_in":"Angemeldet bleiben","tabtitle_find_user":"Suchen","tabtitle_group_by_id":"nach ID","tabtitle_new_group":"Neue Gruppe","tags_editor_no_tags":"Schlagworte hinzufügen","tags_not_found":"Keine Schlagworte definiert. Erstellen Sie welche.","title_all_contacts":"Alle Kontakte","title_group_members":"Gruppenmitglieder","panel_title_info":"Info","title_manage_tags":"Verwalten","title_not_found":"Nicht gefunden","title_permissions":"Berechtigungen","title_tag_manager":"Schlagworte (Nutzer entdecken)","topic_block_warning":"Möchten Sie diese Unterhaltung wirklich blockieren?","topic_delete_warning":"Möchten Sie diese Unterhaltung wirklich löschen?","topic_name_editing_placeholder":"Freiform Name der Gruppe","unnamed_topic":"Unbenannt","update_available":"Aktualisierung verfügbar.","upload_finishing":"wird abgeschlossen...","user_not_found":"Nicht gefunden","validate_credential_action":"bestätigen","description_editing_placeholder":"Beschreibung (optional)","label_description":"Beschreibung","button_security":"Sicherheit","panel_title_general":"Allgemein","panel_title_security":"Sicherheit","panel_title_crop":"Zum Anpassen ziehen","panel_title_members":"Mitglieder","permissions_anonymous":"Anonym","permissions_authenticated":"Authentifiziert","topic_delete":"Chat löschen","permissions_user":"Benutzerberechtigungen","password_reset_email_sent":"Eine E-Mail wurde an {email} gesendet. Folgen Sie den Anweisungen in der E-Mail, um Ihr Passwort zurückzusetzen.","label_unarchive_topic":"Archiviert:","menu_item_reply":"Antwort","menu_item_forward":"Nach vorne","forward_to":"Weiterleiten","forward_to_search_placeholder":"Kontakte durchsuchen","label_new_password":"Neues Kennwort","drafty_unknown":"Nicht unterstützt","calls_incoming":"Eingehender Anruf","calls_outgoing":"Ausgehender Anruf","calls_you_label":"Du","menu_item_video_call":"Videoanruf","already_in_call":"Du redest schon!","call_cancelled":"abgebrochen","call_missed":"verpasster","call_declined":"abgelehnt","call_disconnected":"getrennt","label_use_secure_connection":"Verwenden Sie eine sichere Verbindung","phone_or_email_prompt":"Telefonnummer oder E-Mail","cred_confirmed_successfully":"Erfolgreich bestätigt","menu_item_edit":"Bearbeiten","editing_message":"Bearbeitung","message_edited_marker":", bearbeitet","icon_title_add_image":"Bild hinzufügen","icon_title_attach_file":"Datei anhängen","icon_title_delete":"Aufnahme löschen","icon_title_pause":"Wiedergabe pausieren","icon_title_play":"Aufnahme abspielen","icon_title_record_voice":"Sprachnachricht aufnehmen","icon_title_resume":"Wiedergabe fortsetzen","icon_title_send":"Nachricht senden","drag_file":"Datei hierher ziehen","drafty_video":"Videoaufnahme","call_in_progress":"in Arbeit","menu_item_audio_call":"Anruf","unrecognized_video_format":"Das Format dieses Videos wird nicht erkannt","loading_note":"Laden...","password_i_have_code":"Ich habe Code","label_reset_password_tel":"SMS zum Zurücksetzen des Passworts senden","mobile_phone_number":"Mobiltelefonnummer","password_reset_sms_sent":"Eine Textnachricht mit Sicherheitscode wurde an {phone} gesendet. Geben Sie den Code unten ein.","mobile_number_required":"Handynummer erforderlich"}');
+module.exports = JSON.parse('{"action_block_contact":"Kontakt blockieren","action_cancel":"Abbrechen","action_clear_messages":"Nachrichten leeren","action_delete_messages":"Nachrichten für alle löschen","action_leave_chat":"Unterhaltung verlassen","action_report_chat":"Unterhaltung melden","archived_contacts":"Archivierte Kontakte ({count})","badge_danger":"Verdächtig","badge_owner":"Besitzer","badge_staff":"Verwaltung","badge_verified":"Verifiziert","badge_you":"Sie","block_contact_warning":"Möchten Sie diesen Kontakt wirklich blockieren?","blocked_contacts_link":"Blockierte Kontakte ({count})","button_add_members":"Mitglieder hinzufügen","button_cancel":"Abbrechen","button_confirm":"Bestätigen","button_create":"Erstellen","button_delete_account":"Konto löschen","button_edit":"Bearbeiten","button_logout":"Abmelden","button_ok":"OK","button_reset":"Zurücksetzen","button_send_request":"Anfrage senden","button_sign_in":"Anmelden","button_sign_up":"Anmelden","button_subscribe":"Abbonieren","button_update":"Aktualisieren","cannot_initiate_file_upload":"Datei kann nicht hochgeladen werden.","channel":"Sender","channel_prompt":"Dies ist ein Sender","chat_invitation":"Sie sind eingeladen, an einem neuen Chat teilzunehmen. Was möchten Sie tun?","chat_invitation_accept":"Akzeptieren","chat_invitation_block":"Blockieren","chat_invitation_ignore":"Ignorieren","clear_messages_warning":"Sind Sie sicher, dass Sie diese Unterhaltung für alle leeren wollen? Das kann nicht rückgängig gemacht werden.","code_doesnot_match":"Code stimmt nicht überein","contacts_not_found":"Sie haben keine Unterhaltungen ¯∖_(ツ)_/¯","contacts_not_found_short":"Keine Kontakte für \'\'{query}\'\'","credential_email_prompt":"E-Mail Adresse für Registrierung","delete_account":"Konto löschen","delete_account_warning":"Möchten Sie das Konto wirklich löschen? Das kann nicht rückgängig gemacht werden","delete_messages_warning":"Sind Sie sicher, dass Sie diese Unterhaltung für alle löschen wollen? Das kann nicht rückgängig gemacht werden.","download_action":"herunterladen","drafty_attachment":"Dateianhang","drafty_form":"Formular:","drafty_image":"Bild","email_dative":"E-Mail","email_prompt":"E-Mail, z.B. lisam@beispiel.de","enable_peers_messaging":"Aktivieren","enter_confirmation_code_prompt":"Geben Sie den Bestätigungscode ein, der per {method} geschickt wurde:","error_invalid_id":"ungültige ID","file_attachment_too_large":"Die Dateigröße {size} überschreitet das Limit von {limit}.","forgot_password_link":"Passwort vergessen?","full_name_prompt":"Vollständiger Name, z.B. Lisa Musterfrau","granted_permissions":"Erteilt","group_has_no_members":"Keine Mitglieder","group_user_id_prompt":"Gruppe oder Benutzer ID","image_caption_prompt":"Bildunterschrift","invalid_content":"ungültiger Inhalt","invalid_security_token":"Ungültiger Sicherheitsschlüssel","label_client":"Client:","label_content_type":"Inhaltsart:","label_default_access_mode":"Standard Zugriffsmodus:","label_file_name":"Dateiname:","label_group_members":"Gruppenmitglieder:","label_incognito_mode":"inkognito-Modus:","label_message_sound":"Benachrichtigungston:","label_muting_topic":"Stumm geschaltet:","label_other_user":"Andere","label_password":"Passwort","label_permissions":"Berechtigungen:","label_private":"Privater Kommentar","label_push_notifications":"Benachrichtigungsmeldungen:","label_push_notifications_disabled":"Benachrichtigungsmeldungen (erfordert HTTPS):","label_reset_password":"Passwort per E-Mail wiederherstellen:","label_sdk":"SDK:","label_server":"Server:","label_server_address":"Server Adresse:","label_server_to_use":"Server verwenden:","label_size":"Größe:","label_topic_name":"Name","label_user_contacts":"Kontakte","label_user_id":"ID:","label_wire_transport":"Übertragung per Kabel:","label_you":"Sie:","label_your_name":"Ihr Name","label_your_permissions":"Ihre Berechtigungen:","last_seen_timestamp":"Zuletzt gesehen","leave_chat_warning":"Möchten Sie diese Unterhaltung wirklich verlassen?","link_contact_us":"Kontakt","link_privacy_policy":"Datenschutzerklärung","link_terms_of_service":"Nutzungsbedingungen","login_prompt":"Anmelden","menu_item_archive_topic":"Archivieren","menu_item_block":"Blockieren","menu_item_clear_messages":"Nachrichten leeren","menu_item_clear_messages_for_all":"Für alle leeren","menu_item_delete":"Löschen","menu_item_delete_for_all":"Für alle löschen","menu_item_delete_topic":"Entfernen","menu_item_edit_permissions":"Berechtigungen ändern","menu_item_info":"Info","menu_item_member_delete":"Entfernen","menu_item_mute":"Unterhaltung stumm schalten","menu_item_restore_topic":"Wiederherstellen","menu_item_send_retry":"Wiederholen","menu_item_unblock":"Blockierung aufheben","menu_item_unmute":"Stumm schalten beenden","message_sending":"wird gesendet...","message_sending_failed":"fehlgeschlagen","messages_not_readable":"Neue Nachrichten können nicht gelesen werden","messaging_disabled_prompt":"Nachrichtenübermittlung deaktiviert","more_online_members":"+{overflow} mehr","new_message_prompt":"Neue Nachricht","new_password_placeholder":"Geben Sie ein neues Passwort ein","no_connection":"Keine Verbindung","no_contacts":"Sie haben keine Kontakte :-(","numeric_confirmation_code_prompt":"Nur zahlen","online_now":"jetzt online","password_prompt":"Passwort","password_unchanged_prompt":"unverändert","peers_messaging_disabled":"Gruppennachrichten sind deaktiviert","permission_admin":"Bestätigen ({val})","permission_delete":"Entfernen ({val})","permission_join":"Beitreten ({val})","permission_owner":"Besitzer ({val})","permission_pres":"Benachrichtigt werden ({val})","permission_read":"Lesen ({val})","permission_share":"Teilen ({val})","permission_write":"Schreiben ({val})","phone_dative":"Telefon","private_editing_placeholder":"Nur für Sie sichtbar","push_init_failed":"Initialisierung von Push-Benachrichtigungen fehlgeschlagen","reconnect_countdown":"Getrennt. Wiederverbinden in {seconds}…","reconnect_now":"Jetzt probieren","reload_update":"Neu laden","report_chat_warning":"Möchten Sie diese Unterhaltung wirklich blockieren und melden?","requested_permissions":"Angefordert","save_attachment":"Speichern","search_for_contacts":"Nutzen Sie die Suche um Kontakte zu finden","search_no_results":"Die Suche hatte keine Ergebnisse","search_placeholder":"Liste: email:lisa@beispiel.de, tel:17025550003...","sidepanel_title_acc_notifications":"Benachrichtigungen","sidepanel_title_acc_support":"Unterstützung","sidepanel_title_account_settings":"Konto-Einstellungen","sidepanel_title_archive":"Archivierte Unterhaltungen","sidepanel_title_blocked":"Blockierte Unterhaltungen","sidepanel_title_cred":"Anmeldeinformationen bestätigen","sidepanel_title_login":"Anmelden","sidepanel_title_newtpk":"Neue Unterhaltung starten","sidepanel_title_register":"Konto erstellen","sidepanel_title_reset":"Passwort zurücksetzen","sidepanel_title_settings":"Einstellungen","stay_logged_in":"Angemeldet bleiben","tabtitle_find_user":"Suchen","tabtitle_group_by_id":"nach ID","tabtitle_new_group":"Neue Gruppe","tags_editor_no_tags":"Schlagworte hinzufügen","tags_not_found":"Keine Schlagworte definiert. Erstellen Sie welche.","title_all_contacts":"Alle Kontakte","title_group_members":"Gruppenmitglieder","panel_title_info":"Info","title_manage_tags":"Verwalten","title_not_found":"Nicht gefunden","title_permissions":"Berechtigungen","title_tag_manager":"Schlagworte (Nutzer entdecken)","topic_block_warning":"Möchten Sie diese Unterhaltung wirklich blockieren?","topic_delete_warning":"Möchten Sie diese Unterhaltung wirklich löschen?","topic_name_editing_placeholder":"Freiform Name der Gruppe","unnamed_topic":"Unbenannt","update_available":"Aktualisierung verfügbar.","upload_finishing":"wird abgeschlossen...","user_not_found":"Nicht gefunden","description_editing_placeholder":"Beschreibung (optional)","label_description":"Beschreibung","button_security":"Sicherheit","panel_title_general":"Allgemein","panel_title_security":"Sicherheit","panel_title_crop":"Zum Anpassen ziehen","panel_title_members":"Mitglieder","permissions_anonymous":"Anonym","permissions_authenticated":"Authentifiziert","topic_delete":"Chat löschen","permissions_user":"Benutzerberechtigungen","password_reset_email_sent":"Eine E-Mail wurde an {email} gesendet. Folgen Sie den Anweisungen in der E-Mail, um Ihr Passwort zurückzusetzen.","label_unarchive_topic":"Archiviert:","menu_item_reply":"Antwort","menu_item_forward":"Nach vorne","forward_to":"Weiterleiten","forward_to_search_placeholder":"Kontakte durchsuchen","label_new_password":"Neues Kennwort","drafty_unknown":"Nicht unterstützt","calls_incoming":"Eingehender Anruf","calls_outgoing":"Ausgehender Anruf","calls_you_label":"Du","menu_item_video_call":"Videoanruf","already_in_call":"Du redest schon!","call_cancelled":"abgebrochen","call_missed":"verpasster","call_declined":"abgelehnt","call_disconnected":"getrennt","label_use_secure_connection":"Verwenden Sie eine sichere Verbindung","cred_confirmed_successfully":"Erfolgreich bestätigt","menu_item_edit":"Bearbeiten","editing_message":"Bearbeitung","message_edited_marker":", bearbeitet","icon_title_add_image":"Bild hinzufügen","icon_title_attach_file":"Datei anhängen","icon_title_delete":"Aufnahme löschen","icon_title_pause":"Wiedergabe pausieren","icon_title_play":"Aufnahme abspielen","icon_title_record_voice":"Sprachnachricht aufnehmen","icon_title_resume":"Wiedergabe fortsetzen","icon_title_send":"Nachricht senden","drag_file":"Datei hierher ziehen","drafty_video":"Videoaufnahme","call_in_progress":"in Arbeit","menu_item_audio_call":"Anruf","unrecognized_video_format":"Das Format dieses Videos wird nicht erkannt","loading_note":"Laden...","password_i_have_code":"Ich habe Code","label_reset_password_tel":"SMS zum Zurücksetzen des Passworts senden","mobile_phone_number":"Mobiltelefonnummer","password_reset_sms_sent":"Eine Textnachricht mit Sicherheitscode wurde an {phone} gesendet. Geben Sie den Code unten ein.","mobile_number_required":"Handynummer erforderlich"}');
/***/ })
diff --git a/umd/src_i18n_min_en_json.dev.js b/umd/src_i18n_min_en_json.dev.js
index 8a1cd43d..75b755fd 100644
--- a/umd/src_i18n_min_en_json.dev.js
+++ b/umd/src_i18n_min_en_json.dev.js
@@ -7,7 +7,7 @@
\******************************/
/***/ ((module) => {
-module.exports = JSON.parse('{"action_block_contact":"Block Contact","action_cancel":"cancel","action_clear_messages":"Clear Messages","action_delete_messages":"Clear Messages for All","action_leave_chat":"Leave Conversation","action_report_chat":"Report Conversation","archived_contacts":"Archived contacts ({count})","badge_danger":"Untrustworthy","badge_owner":"owner","badge_staff":"Staff-managed","badge_verified":"Verified/official","badge_you":"you","block_contact_warning":"Are you sure you want to block this contact?","blocked_contacts_link":"Blocked contacts ({count})","button_add_another":"Add another","button_add_members":"Add members","button_cancel":"Cancel","button_confirm":"Confirm","button_create":"Create","button_delete_account":"Delete account","button_edit":"Edit","button_logout":"Logout","button_ok":"OK","button_reset":"Reset","button_send_request":"Send request","button_sign_in":"Sign in","button_sign_up":"Sign up","button_subscribe":"Subscribe","button_update":"Update","cannot_initiate_file_upload":"Cannot initiate file upload.","channel":"channel","channel_prompt":"This is a channel","chat_invitation":"You are invited to start a new chat. What would you like to do?","chat_invitation_accept":"Accept","chat_invitation_block":"Block","chat_invitation_ignore":"Ignore","clear_messages_warning":"Are you sure you want to clear all messages? It cannot be undone.","code_doesnot_match":"Code does not match","contacts_not_found":"You have no chats ¯∖_(ツ)_/¯","contacts_not_found_short":"No contacts match \'\'{query}\'\'","credential_email_prompt":"Your registration email","delete_account":"Delete account","delete_account_warning":"Are you sure you want to delete your account? It cannot be undone.","delete_messages_warning":"Are you sure you want to delete all messages for everyone? It cannot be undone.","download_action":"download","drafty_attachment":"Attachment","drafty_form":"Form:","drafty_image":"Picture","email_dative":"email","email_prompt":"Email, e.g. jdoe@example.com","enable_peers_messaging":"Enable","enter_confirmation_code_prompt":"Confirmation code","error_invalid_id":"Invalid ID","file_attachment_too_large":"The file size {size} exceeds the {limit} limit.","forgot_password_link":"Forgot password?","full_name_prompt":"Full name, e.g. John Doe","granted_permissions":"Granted","group_has_no_members":"No members","group_user_id_prompt":"Group or User ID","image_caption_prompt":"Image caption","invalid_content":"invalid content","invalid_security_token":"Invalid security token","label_client":"Client:","label_content_type":"Content type:","label_default_access_mode":"Default access mode:","label_file_name":"File name:","label_group_members":"Group members:","label_incognito_mode":"Incognito mode:","label_message_sound":"Message sound:","label_muting_topic":"Muted:","label_other_user":"Other","label_password":"Password","label_permissions":"Permissions:","label_private":"Private comment","label_push_notifications":"Notification alerts:","label_push_notifications_disabled":"Notification alerts (requires HTTPS):","label_reset_password":"Send a password reset email:","label_sdk":"SDK:","label_server":"Server:","label_server_address":"Server address:","label_server_to_use":"Server to use:","label_size":"Size:","label_topic_name":"Name","label_user_contacts":"Contacts:","label_user_id":"ID:","label_wire_transport":"Wire transport:","label_you":"You:","label_your_name":"Your name","label_your_permissions":"Your permissions:","last_seen_timestamp":"Last seen","leave_chat_warning":"Are you sure you want to leave this conversation?","link_contact_us":"Contact Us","link_privacy_policy":"Privacy Policy","link_terms_of_service":"Terms of Service","login_prompt":"Login","menu_item_archive_topic":"Archive","menu_item_block":"Block","menu_item_clear_messages":"Clear messages","menu_item_clear_messages_for_all":"Clear for All","menu_item_delete":"Delete","menu_item_delete_for_all":"Delete for All","menu_item_delete_topic":"Delete","menu_item_edit_permissions":"Edit permissions","menu_item_info":"Info","menu_item_member_delete":"Remove","menu_item_mute":"Mute","menu_item_reply":"Reply","menu_item_restore_topic":"Restore","menu_item_send_retry":"Retry","menu_item_unblock":"Unblock","menu_item_unmute":"Unmute","message_sending":"sending...","message_sending_failed":"failed","messages_not_readable":"no access to messages","messaging_disabled_prompt":"Messaging disabled","more_online_members":"+{overflow} more","new_message_prompt":"New message","new_password_placeholder":"Enter new password","no_connection":"No connection","no_contacts":"You have no contacts :-(","numeric_confirmation_code_prompt":"Numbers only","online_now":"online now","password_prompt":"Password","password_unchanged_prompt":"Unchanged","peers_messaging_disabled":"Peer\'s messaging is disabled.","permission_admin":"Approve ({val})","permission_delete":"Delete ({val})","permission_join":"Join ({val})","permission_owner":"Owner ({val})","permission_pres":"Get notified ({val})","permission_read":"Read ({val})","permission_share":"Share ({val})","permission_write":"Write ({val})","phone_dative":"phone","private_editing_placeholder":"Visible to you only","push_init_failed":"Failed to initialize push notifications","reconnect_countdown":"Disconnected. Reconnecting in {seconds}…","reconnect_now":"Try now","reload_update":"Reload","report_chat_warning":"Are you sure you want to block and report this conversation?","requested_permissions":"Requested","save_attachment":"save","search_for_contacts":"Use search to find contacts","search_no_results":"Search returned no results","search_placeholder":"List like email:alice@example.com, tel:17025550003...","sidepanel_title_acc_notifications":"Notifications","sidepanel_title_acc_support":"Support","sidepanel_title_account_settings":"Account Settings","sidepanel_title_archive":"Archived Chats","sidepanel_title_blocked":"Blocked Chats","sidepanel_title_cred":"Confirm Credentials","sidepanel_title_login":"Sign In","sidepanel_title_newtpk":"Start New Chat","sidepanel_title_register":"Create Account","sidepanel_title_reset":"Reset Password","sidepanel_title_settings":"Settings","stay_logged_in":"Stay logged in","tabtitle_find_user":"find","tabtitle_group_by_id":"by id","tabtitle_new_group":"new group","tags_editor_no_tags":"Add some tags","tags_not_found":"No tags defined. Add some.","title_all_contacts":"All Contacts","title_group_members":"Group Members","title_manage_tags":"Manage","title_not_found":"Not found","title_permissions":"Permissions","title_tag_manager":"Tags (search & discovery)","topic_block_warning":"Are you sure you want to block this conversation?","topic_delete_warning":"Are you sure you want to delete this conversation?","topic_name_editing_placeholder":"Freeform name of the group","unnamed_topic":"Unnamed","update_available":"Update available.","upload_finishing":"finishing...","user_not_found":"Not found","validate_credential_action":"confirm","description_editing_placeholder":"Optional description","label_description":"Description","button_security":"Security","panel_title_crop":"Drag to Adjust","panel_title_general":"General","panel_title_members":"Members","panel_title_security":"Security","panel_title_info":"Info","permissions_anonymous":"Anonymous","permissions_authenticated":"Authenticated","topic_delete":"Delete Conversation","permissions_user":"User\'s Permissions","password_reset_email_sent":"An email has been sent to {email}. Follow the directions in the email to reset your password.","label_unarchive_topic":"Archived:","menu_item_forward":"Forward","forward_to":"Forward to","forward_to_search_placeholder":"Search contacts","label_new_password":"New password","drafty_unknown":"Unsupported","calls_incoming":"Incoming call","calls_outgoing":"Outgoing call","calls_you_label":"You","menu_item_video_call":"Video call","already_in_call":"You already in an ongoing call!","call_cancelled":"cancelled","call_missed":"missed","call_declined":"declined","call_disconnected":"disconnected","label_use_secure_connection":"Use secure connection","phone_or_email_prompt":"Phone number or email","cred_confirmed_successfully":"Confirmed successfully","menu_item_edit":"Edit","editing_message":"Editing","message_edited_marker":", edited","icon_title_add_image":"Add image","icon_title_attach_file":"Attach file","icon_title_delete":"Delete","icon_title_pause":"Pause","icon_title_play":"Play","icon_title_record_voice":"Record voice message","icon_title_resume":"Resume","icon_title_send":"Send message","drag_file":"Drag file here","drafty_video":"Video recording","call_in_progress":"in progress","menu_item_audio_call":"Call","unrecognized_video_format":"Format of this video is not recognized","loading_note":"Loading...","password_i_have_code":"I have code","label_reset_password_tel":"Send a password reset SMS:","mobile_phone_number":"Mobile phone number","password_reset_sms_sent":"A text message with security code has been sent to {phone}. Enter the code below.","mobile_number_required":"Mobile phone number required"}');
+module.exports = JSON.parse('{"action_block_contact":"Block Contact","action_cancel":"cancel","action_clear_messages":"Clear Messages","action_delete_messages":"Clear Messages for All","action_leave_chat":"Leave Conversation","action_report_chat":"Report Conversation","archived_contacts":"Archived contacts ({count})","badge_danger":"Untrustworthy","badge_owner":"owner","badge_staff":"Staff-managed","badge_verified":"Verified/official","badge_you":"you","block_contact_warning":"Are you sure you want to block this contact?","blocked_contacts_link":"Blocked contacts ({count})","button_add_members":"Add members","button_cancel":"Cancel","button_confirm":"Confirm","button_create":"Create","button_delete_account":"Delete account","button_edit":"Edit","button_logout":"Logout","button_ok":"OK","button_reset":"Reset","button_send_request":"Send request","button_sign_in":"Sign in","button_sign_up":"Sign up","button_subscribe":"Subscribe","button_update":"Update","cannot_initiate_file_upload":"Cannot initiate file upload.","channel":"channel","channel_prompt":"This is a channel","chat_invitation":"You are invited to start a new chat. What would you like to do?","chat_invitation_accept":"Accept","chat_invitation_block":"Block","chat_invitation_ignore":"Ignore","clear_messages_warning":"Are you sure you want to clear all messages? It cannot be undone.","code_doesnot_match":"Code does not match","contacts_not_found":"You have no chats ¯∖_(ツ)_/¯","contacts_not_found_short":"No contacts match \'\'{query}\'\'","credential_email_prompt":"Your registration email","delete_account":"Delete account","delete_account_warning":"Are you sure you want to delete your account? It cannot be undone.","delete_messages_warning":"Are you sure you want to delete all messages for everyone? It cannot be undone.","download_action":"download","drafty_attachment":"Attachment","drafty_form":"Form:","drafty_image":"Picture","email_dative":"email","email_prompt":"Email, e.g. jdoe@example.com","enable_peers_messaging":"Enable","enter_confirmation_code_prompt":"Confirmation code","error_invalid_id":"Invalid ID","file_attachment_too_large":"The file size {size} exceeds the {limit} limit.","forgot_password_link":"Forgot password?","full_name_prompt":"Full name, e.g. John Doe","granted_permissions":"Granted","group_has_no_members":"No members","group_user_id_prompt":"Group or User ID","image_caption_prompt":"Image caption","invalid_content":"invalid content","invalid_security_token":"Invalid security token","label_client":"Client:","label_content_type":"Content type:","label_default_access_mode":"Default access mode:","label_file_name":"File name:","label_group_members":"Group members:","label_incognito_mode":"Incognito mode:","label_message_sound":"Message sound:","label_muting_topic":"Muted:","label_other_user":"Other","label_password":"Password","label_permissions":"Permissions:","label_private":"Private comment","label_push_notifications":"Notification alerts:","label_push_notifications_disabled":"Notification alerts (requires HTTPS):","label_reset_password":"Send a password reset email:","label_sdk":"SDK:","label_server":"Server:","label_server_address":"Server address:","label_server_to_use":"Server to use:","label_size":"Size:","label_topic_name":"Name","label_user_contacts":"Contacts","label_user_id":"ID:","label_wire_transport":"Wire transport:","label_you":"You:","label_your_name":"Your name","label_your_permissions":"Your permissions:","last_seen_timestamp":"Last seen","leave_chat_warning":"Are you sure you want to leave this conversation?","link_contact_us":"Contact Us","link_privacy_policy":"Privacy Policy","link_terms_of_service":"Terms of Service","login_prompt":"Login","menu_item_archive_topic":"Archive","menu_item_block":"Block","menu_item_clear_messages":"Clear messages","menu_item_clear_messages_for_all":"Clear for All","menu_item_delete":"Delete","menu_item_delete_for_all":"Delete for All","menu_item_delete_topic":"Delete","menu_item_edit_permissions":"Edit permissions","menu_item_info":"Info","menu_item_member_delete":"Remove","menu_item_mute":"Mute","menu_item_reply":"Reply","menu_item_restore_topic":"Restore","menu_item_send_retry":"Retry","menu_item_unblock":"Unblock","menu_item_unmute":"Unmute","message_sending":"sending...","message_sending_failed":"failed","messages_not_readable":"no access to messages","messaging_disabled_prompt":"Messaging disabled","more_online_members":"+{overflow} more","new_message_prompt":"New message","new_password_placeholder":"Enter new password","no_connection":"No connection","no_contacts":"You have no contacts :-(","numeric_confirmation_code_prompt":"Numbers only","online_now":"online now","password_prompt":"Password","password_unchanged_prompt":"Unchanged","peers_messaging_disabled":"Peer\'s messaging is disabled.","permission_admin":"Approve ({val})","permission_delete":"Delete ({val})","permission_join":"Join ({val})","permission_owner":"Owner ({val})","permission_pres":"Get notified ({val})","permission_read":"Read ({val})","permission_share":"Share ({val})","permission_write":"Write ({val})","phone_dative":"phone","private_editing_placeholder":"Visible to you only","push_init_failed":"Failed to initialize push notifications","reconnect_countdown":"Disconnected. Reconnecting in {seconds}…","reconnect_now":"Try now","reload_update":"Reload","report_chat_warning":"Are you sure you want to block and report this conversation?","requested_permissions":"Requested","save_attachment":"save","search_for_contacts":"Use search to find contacts","search_no_results":"Search returned no results","search_placeholder":"List like email:alice@example.com, tel:17025550003...","sidepanel_title_acc_notifications":"Notifications","sidepanel_title_acc_support":"Support","sidepanel_title_account_settings":"Account Settings","sidepanel_title_archive":"Archived Chats","sidepanel_title_blocked":"Blocked Chats","sidepanel_title_cred":"Confirm Credentials","sidepanel_title_login":"Sign In","sidepanel_title_newtpk":"Start New Chat","sidepanel_title_register":"Create Account","sidepanel_title_reset":"Reset Password","sidepanel_title_settings":"Settings","stay_logged_in":"Stay logged in","tabtitle_find_user":"find","tabtitle_group_by_id":"by id","tabtitle_new_group":"new group","tags_editor_no_tags":"Add some tags","tags_not_found":"No tags defined. Add some.","title_all_contacts":"All Contacts","title_group_members":"Group Members","title_manage_tags":"Manage","title_not_found":"Not found","title_permissions":"Permissions","title_tag_manager":"Tags (search & discovery)","topic_block_warning":"Are you sure you want to block this conversation?","topic_delete_warning":"Are you sure you want to delete this conversation?","topic_name_editing_placeholder":"Freeform name of the group","unnamed_topic":"Unnamed","update_available":"Update available.","upload_finishing":"finishing...","user_not_found":"Not found","description_editing_placeholder":"Optional description","label_description":"Description","button_security":"Security","panel_title_crop":"Drag to Adjust","panel_title_general":"General","panel_title_members":"Members","panel_title_security":"Security","panel_title_info":"Info","permissions_anonymous":"Anonymous","permissions_authenticated":"Authenticated","topic_delete":"Delete Conversation","permissions_user":"User\'s Permissions","password_reset_email_sent":"An email has been sent to {email}. Follow the directions in the email to reset your password.","label_unarchive_topic":"Archived:","menu_item_forward":"Forward","forward_to":"Forward to","forward_to_search_placeholder":"Search contacts","label_new_password":"New password","drafty_unknown":"Unsupported","calls_incoming":"Incoming call","calls_outgoing":"Outgoing call","calls_you_label":"You","menu_item_video_call":"Video call","already_in_call":"You already in an ongoing call!","call_cancelled":"cancelled","call_missed":"missed","call_declined":"declined","call_disconnected":"disconnected","label_use_secure_connection":"Use secure connection","cred_confirmed_successfully":"Confirmed successfully","menu_item_edit":"Edit","editing_message":"Editing","message_edited_marker":", edited","icon_title_add_image":"Add image","icon_title_attach_file":"Attach file","icon_title_delete":"Delete","icon_title_pause":"Pause","icon_title_play":"Play","icon_title_record_voice":"Record voice message","icon_title_resume":"Resume","icon_title_send":"Send message","drag_file":"Drag file here","drafty_video":"Video recording","call_in_progress":"in progress","menu_item_audio_call":"Call","unrecognized_video_format":"Format of this video is not recognized","loading_note":"Loading...","password_i_have_code":"I have code","label_reset_password_tel":"Send a password reset SMS:","mobile_phone_number":"Mobile phone number","password_reset_sms_sent":"A text message with security code has been sent to {phone}. Enter the code below.","mobile_number_required":"Mobile phone number required","current_email":"Current email","current_phone":"Current phone number","new_email":"New email","new_phone_number":"New phone number","change_email":"Change email","change_phonel":"Change phone number"}');
/***/ })
diff --git a/umd/src_i18n_min_es_json.dev.js b/umd/src_i18n_min_es_json.dev.js
index 96bb143d..c2c9ce65 100644
--- a/umd/src_i18n_min_es_json.dev.js
+++ b/umd/src_i18n_min_es_json.dev.js
@@ -7,7 +7,7 @@
\******************************/
/***/ ((module) => {
-module.exports = JSON.parse('{"action_block_contact":"Bloquear contacto","action_cancel":"cancelar","action_clear_messages":"Borrar mensajes","action_delete_messages":"Borrar mensajes para todos","action_leave_chat":"Dejar conversación","action_report_chat":"Reportar conversación","archived_contacts":"Contactos archivados ({count})","badge_danger":"Suspicaz","badge_owner":"propietario","badge_staff":"Administración","badge_verified":"Verificado","badge_you":"tú","block_contact_warning":"¿Estás seguro de que quieres bloquear a este contacto?","blocked_contacts_link":"Contactos bloqueados ({count})","button_add_another":"Añadir contacto","button_add_members":"Añadir miembros","button_cancel":"Cancelar","button_confirm":"Confirmar","button_create":"Crear","button_delete_account":"Eliminar cuenta","button_edit":"Editar","button_logout":"Cerrar sesión","button_ok":"OK","button_reset":"Restablecer","button_send_request":"Enviar petición","button_sign_in":"Entrar","button_sign_up":"Regístrate","button_subscribe":"Suscribirse","button_update":"Actualizar","cannot_initiate_file_upload":"No se pudo iniciar la carga del archivo.","channel":"canal","channel_prompt":"Este es un canal","chat_invitation":"Estás invitado a participar en un nuevo chat. ¿Qué te gustaría hacer?","chat_invitation_accept":"Aceptar","chat_invitation_block":"Bloquear","chat_invitation_ignore":"Ignorar","clear_messages_warning":"¿Estás seguro de que quieres eliminar todos los mensajes? Esta acción es irreversible.","code_doesnot_match":"El código no coincide","contacts_not_found":"No tienes chats ¯∖_(ツ)_/¯","contacts_not_found_short":"Ningún contacto coincide con \'\'{query}\'\'","credential_email_prompt":"Tu correo electrónico de registro","delete_account":"Eliminar cuenta","delete_account_warning":"¿Estás seguro de que deseas eliminar permanentemente tu cuenta? Esta acción es irreversible.","delete_messages_warning":"¿Estás seguro de que quieres eliminar todos los mensajes para todos? Esta acción es irreversible.","download_action":"descargar","drafty_attachment":"Archivo","drafty_form":"Formulario:","drafty_image":"Imagen","email_dative":"correo electrónico","email_prompt":"Correo electrónico, p.ej. juan@example.com","enable_peers_messaging":"Habilitar","enter_confirmation_code_prompt":"Introduzca el código de confirmación enviado a tu {method}:","error_invalid_id":"ID inválido","file_attachment_too_large":"El tamaño del archivo {size} excede el límite de {limit}.","forgot_password_link":"¿Olvidaste tu contraseña?","full_name_prompt":"Nombre completo, p.ej. Juan González Hernández","granted_permissions":"Otorgados","group_has_no_members":"No hay miembros","group_user_id_prompt":"ID del grupo o usuario","image_caption_prompt":"Añade un comentario","invalid_content":"contenido inválido","invalid_security_token":"Token de seguridad inválido","label_client":"Cliente:","label_content_type":"Tipo de contenido:","label_default_access_mode":"Modo de acceso predeterminado:","label_file_name":"Nombre del archivo:","label_group_members":"Miembros del grupo:","label_incognito_mode":"Modo incógnito:","label_message_sound":"Sonido de mensaje:","label_muting_topic":"Silenciado:","label_other_user":"Otros","label_password":"Contraseña","label_permissions":"Permisos:","label_private":"Comentario privado","label_push_notifications":"Alertas de notificaciones:","label_push_notifications_disabled":"Alertas de notificaciones (requiere HTTPS):","label_reset_password":"Enviar un correo electrónico de restablecimiento de contraseña:","label_sdk":"SDK:","label_server":"Servidor:","label_server_address":"Dirección del servidor:","label_server_to_use":"Servidor para usar:","label_size":"Tamaño:","label_topic_name":"Nombre del tema","label_user_contacts":"Contactos:","label_user_id":"ID:","label_wire_transport":"Transporte de alambre:","label_you":"Tú:","label_your_name":"Tu nombre","label_your_permissions":"Tus permisos:","last_seen_timestamp":"Últ. vez","leave_chat_warning":"¿Estás seguro de que quieres dejar esta conversación?","link_contact_us":"Contáctanos","link_privacy_policy":"Política de privacidad","link_terms_of_service":"Términos de uso","login_prompt":"Nombre de usuario","menu_item_archive_topic":"Archivar","menu_item_block":"Bloquear","menu_item_clear_messages":"Borrar mensajes","menu_item_clear_messages_for_all":"Borrar para todos","menu_item_delete":"Eliminar","menu_item_delete_for_all":"Eliminar para todos","menu_item_delete_topic":"Eliminar","menu_item_edit_permissions":"Editar permisos","menu_item_info":"Información","menu_item_member_delete":"Eliminar","menu_item_mute":"Silenciar","menu_item_restore_topic":"Restaurar","menu_item_send_retry":"Inténtalo de nuevo","menu_item_unblock":"Desbloquear","menu_item_unmute":"Anular el silencio","message_sending":"enviando...","message_sending_failed":"no se pudo enviar el mensaje","messages_not_readable":"sin acceso a mensajes","messaging_disabled_prompt":"El envío de mensajes está deshabilitado","more_online_members":"+{overflow} más","new_message_prompt":"Nuevo mensaje","new_password_placeholder":"Introduzca una nueva contraseña","no_connection":"Sin conexión","no_contacts":"No tienes contactos :-(","numeric_confirmation_code_prompt":"Sólo números","online_now":"en línea","password_prompt":"Contraseña","password_unchanged_prompt":"Sin cambios","peers_messaging_disabled":"La mensajería Peer está deshabilitada.","permission_admin":"Approbar ({val})","permission_delete":"Eliminar ({val})","permission_join":"Unirse ({val})","permission_owner":"Propietario ({val})","permission_pres":"Ser notificado ({val})","permission_read":"Leer ({val})","permission_share":"Compartir ({val})","permission_write":"Escribir ({val})","phone_dative":"teléfono","private_editing_placeholder":"Sólo visible para tí","push_init_failed":"Error al inicializar las notificaciones push","reconnect_countdown":"Desconectado. Reconectando en {seconds}…","reconnect_now":"Reintentar","reload_update":"Recargar","report_chat_warning":"¿Estás seguro de que quieres bloquear y reportar a esta conversación?","requested_permissions":"Solicitados","save_attachment":"guardar","search_for_contacts":"Usa la búsqueda para encontrar contactos","search_no_results":"La búsqueda no arrojó resultados","search_placeholder":"Ej. email:alice@example.com, tel:17025550003...","sidepanel_title_acc_notifications":"Notificaciones","sidepanel_title_acc_support":"Soporte","sidepanel_title_account_settings":"Ajustes de la cuenta","sidepanel_title_archive":"Chats archivados","sidepanel_title_blocked":"Chats bloqueados","sidepanel_title_cred":"Confirmar credenciales","sidepanel_title_login":"Iniciar sesión","sidepanel_title_newtpk":"Iniciar un nuevo chat","sidepanel_title_register":"Crear cuenta","sidepanel_title_reset":"Restablecer contraseña","sidepanel_title_settings":"Ajustes","stay_logged_in":"Permanecer conectado","tabtitle_find_user":"encontrar","tabtitle_group_by_id":"por ID","tabtitle_new_group":"nuevo grupo","tags_editor_no_tags":"Añadir etiquetas","tags_not_found":"No hay etiquetas definidas. Añade unas.","title_all_contacts":"Todos los contactos","title_group_members":"Miembros del grupo","title_manage_tags":"Gestionar","title_not_found":"No encontrado","title_permissions":"Permisos","title_tag_manager":"Etiquetas (descubrimiento de usuarios)","topic_block_warning":"¿Estás seguro de que quieres bloquear esta conversación","topic_delete_warning":"¿Estás seguro de que quieres eliminar esta conversación?","topic_name_editing_placeholder":"Nombre del grupo","unnamed_topic":"Sin nombre","update_available":"Actualización disponible.","upload_finishing":"terminando...","user_not_found":"Usuario no encontrado","validate_credential_action":"confirmar","description_editing_placeholder":"Descripción (opcional)","label_description":"Descripción","button_security":"Seguridad","panel_title_crop":"Arrastra para ajustar","panel_title_general":"General","panel_title_members":"Miembros","panel_title_security":"Seguridad","panel_title_info":"Información","permissions_anonymous":"Anónimo","permissions_authenticated":"Autenticado","topic_delete":"Eliminar chat","permissions_user":"Permisos del usuario","password_reset_email_sent":"Se ha enviado un correo electrónico a {email}. Siga las instrucciones del correo electrónico para restablecer su contraseña.","label_unarchive_topic":"Archivado:","menu_item_reply":"Respuesta","menu_item_forward":"Reenviar","forward_to":"Reenviar a","forward_to_search_placeholder":"Buscar contactos","label_new_password":"Nueva contraseña","drafty_unknown":"No soportado","calls_incoming":"Llamada entrante","calls_outgoing":"Llamada saliente","calls_you_label":"Tú","menu_item_video_call":"Videollamada","already_in_call":"¡Ya estás hablando!","call_cancelled":"cancelada","call_missed":"perdida","call_declined":"rechazada","call_disconnected":"desconectada","label_use_secure_connection":"Usar conexión segura","phone_or_email_prompt":"Número de teléfono o correo electrónico","cred_confirmed_successfully":"Confirmado con éxito","menu_item_edit":"Editar","editing_message":"Edición","message_edited_marker":", editado","icon_title_add_image":"Añadir imagen","icon_title_attach_file":"Adjuntar archivo","icon_title_delete":"Eliminar grabación","icon_title_pause":"Pausar reproducción","icon_title_play":"Reproducir grabación","icon_title_record_voice":"Grabar mensaje de voz","icon_title_resume":"Reanudar la reproducción","icon_title_send":"Enviar mensaje","drag_file":"Arrastra el archivo aquí","drafty_video":"Grabación de vídeo","call_in_progress":"en progreso","menu_item_audio_call":"Llamada","unrecognized_video_format":"No se reconoce el formato de este video","loading_note":"Cargando...","password_i_have_code":"Tengo código","label_reset_password_tel":"Enviar SMS para restablecer la contraseña","mobile_phone_number":"Número de teléfono móvil","password_reset_sms_sent":"Se ha enviado un mensaje de texto con un código de seguridad a {phone}. Ingresa el código a continuación.","mobile_number_required":"Número de teléfono móvil requerido"}');
+module.exports = JSON.parse('{"action_block_contact":"Bloquear contacto","action_cancel":"cancelar","action_clear_messages":"Borrar mensajes","action_delete_messages":"Borrar mensajes para todos","action_leave_chat":"Dejar conversación","action_report_chat":"Reportar conversación","archived_contacts":"Contactos archivados ({count})","badge_danger":"Suspicaz","badge_owner":"propietario","badge_staff":"Administración","badge_verified":"Verificado","badge_you":"tú","block_contact_warning":"¿Estás seguro de que quieres bloquear a este contacto?","blocked_contacts_link":"Contactos bloqueados ({count})","button_add_members":"Añadir miembros","button_cancel":"Cancelar","button_confirm":"Confirmar","button_create":"Crear","button_delete_account":"Eliminar cuenta","button_edit":"Editar","button_logout":"Cerrar sesión","button_ok":"OK","button_reset":"Restablecer","button_send_request":"Enviar petición","button_sign_in":"Entrar","button_sign_up":"Regístrate","button_subscribe":"Suscribirse","button_update":"Actualizar","cannot_initiate_file_upload":"No se pudo iniciar la carga del archivo.","channel":"canal","channel_prompt":"Este es un canal","chat_invitation":"Estás invitado a participar en un nuevo chat. ¿Qué te gustaría hacer?","chat_invitation_accept":"Aceptar","chat_invitation_block":"Bloquear","chat_invitation_ignore":"Ignorar","clear_messages_warning":"¿Estás seguro de que quieres eliminar todos los mensajes? Esta acción es irreversible.","code_doesnot_match":"El código no coincide","contacts_not_found":"No tienes chats ¯∖_(ツ)_/¯","contacts_not_found_short":"Ningún contacto coincide con \'\'{query}\'\'","credential_email_prompt":"Tu correo electrónico de registro","delete_account":"Eliminar cuenta","delete_account_warning":"¿Estás seguro de que deseas eliminar permanentemente tu cuenta? Esta acción es irreversible.","delete_messages_warning":"¿Estás seguro de que quieres eliminar todos los mensajes para todos? Esta acción es irreversible.","download_action":"descargar","drafty_attachment":"Archivo","drafty_form":"Formulario:","drafty_image":"Imagen","email_dative":"correo electrónico","email_prompt":"Correo electrónico, p.ej. juan@example.com","enable_peers_messaging":"Habilitar","enter_confirmation_code_prompt":"Introduzca el código de confirmación enviado a tu {method}:","error_invalid_id":"ID inválido","file_attachment_too_large":"El tamaño del archivo {size} excede el límite de {limit}.","forgot_password_link":"¿Olvidaste tu contraseña?","full_name_prompt":"Nombre completo, p.ej. Juan González Hernández","granted_permissions":"Otorgados","group_has_no_members":"No hay miembros","group_user_id_prompt":"ID del grupo o usuario","image_caption_prompt":"Añade un comentario","invalid_content":"contenido inválido","invalid_security_token":"Token de seguridad inválido","label_client":"Cliente:","label_content_type":"Tipo de contenido:","label_default_access_mode":"Modo de acceso predeterminado:","label_file_name":"Nombre del archivo:","label_group_members":"Miembros del grupo:","label_incognito_mode":"Modo incógnito:","label_message_sound":"Sonido de mensaje:","label_muting_topic":"Silenciado:","label_other_user":"Otros","label_password":"Contraseña","label_permissions":"Permisos:","label_private":"Comentario privado","label_push_notifications":"Alertas de notificaciones:","label_push_notifications_disabled":"Alertas de notificaciones (requiere HTTPS):","label_reset_password":"Enviar un correo electrónico de restablecimiento de contraseña:","label_sdk":"SDK:","label_server":"Servidor:","label_server_address":"Dirección del servidor:","label_server_to_use":"Servidor para usar:","label_size":"Tamaño:","label_topic_name":"Nombre del tema","label_user_contacts":"Contactos","label_user_id":"ID:","label_wire_transport":"Transporte de alambre:","label_you":"Tú:","label_your_name":"Tu nombre","label_your_permissions":"Tus permisos:","last_seen_timestamp":"Últ. vez","leave_chat_warning":"¿Estás seguro de que quieres dejar esta conversación?","link_contact_us":"Contáctanos","link_privacy_policy":"Política de privacidad","link_terms_of_service":"Términos de uso","login_prompt":"Nombre de usuario","menu_item_archive_topic":"Archivar","menu_item_block":"Bloquear","menu_item_clear_messages":"Borrar mensajes","menu_item_clear_messages_for_all":"Borrar para todos","menu_item_delete":"Eliminar","menu_item_delete_for_all":"Eliminar para todos","menu_item_delete_topic":"Eliminar","menu_item_edit_permissions":"Editar permisos","menu_item_info":"Información","menu_item_member_delete":"Eliminar","menu_item_mute":"Silenciar","menu_item_restore_topic":"Restaurar","menu_item_send_retry":"Inténtalo de nuevo","menu_item_unblock":"Desbloquear","menu_item_unmute":"Anular el silencio","message_sending":"enviando...","message_sending_failed":"no se pudo enviar el mensaje","messages_not_readable":"sin acceso a mensajes","messaging_disabled_prompt":"El envío de mensajes está deshabilitado","more_online_members":"+{overflow} más","new_message_prompt":"Nuevo mensaje","new_password_placeholder":"Introduzca una nueva contraseña","no_connection":"Sin conexión","no_contacts":"No tienes contactos :-(","numeric_confirmation_code_prompt":"Sólo números","online_now":"en línea","password_prompt":"Contraseña","password_unchanged_prompt":"Sin cambios","peers_messaging_disabled":"La mensajería Peer está deshabilitada.","permission_admin":"Approbar ({val})","permission_delete":"Eliminar ({val})","permission_join":"Unirse ({val})","permission_owner":"Propietario ({val})","permission_pres":"Ser notificado ({val})","permission_read":"Leer ({val})","permission_share":"Compartir ({val})","permission_write":"Escribir ({val})","phone_dative":"teléfono","private_editing_placeholder":"Sólo visible para tí","push_init_failed":"Error al inicializar las notificaciones push","reconnect_countdown":"Desconectado. Reconectando en {seconds}…","reconnect_now":"Reintentar","reload_update":"Recargar","report_chat_warning":"¿Estás seguro de que quieres bloquear y reportar a esta conversación?","requested_permissions":"Solicitados","save_attachment":"guardar","search_for_contacts":"Usa la búsqueda para encontrar contactos","search_no_results":"La búsqueda no arrojó resultados","search_placeholder":"Ej. email:alice@example.com, tel:17025550003...","sidepanel_title_acc_notifications":"Notificaciones","sidepanel_title_acc_support":"Soporte","sidepanel_title_account_settings":"Ajustes de la cuenta","sidepanel_title_archive":"Chats archivados","sidepanel_title_blocked":"Chats bloqueados","sidepanel_title_cred":"Confirmar credenciales","sidepanel_title_login":"Iniciar sesión","sidepanel_title_newtpk":"Iniciar un nuevo chat","sidepanel_title_register":"Crear cuenta","sidepanel_title_reset":"Restablecer contraseña","sidepanel_title_settings":"Ajustes","stay_logged_in":"Permanecer conectado","tabtitle_find_user":"encontrar","tabtitle_group_by_id":"por ID","tabtitle_new_group":"nuevo grupo","tags_editor_no_tags":"Añadir etiquetas","tags_not_found":"No hay etiquetas definidas. Añade unas.","title_all_contacts":"Todos los contactos","title_group_members":"Miembros del grupo","title_manage_tags":"Gestionar","title_not_found":"No encontrado","title_permissions":"Permisos","title_tag_manager":"Etiquetas (descubrimiento de usuarios)","topic_block_warning":"¿Estás seguro de que quieres bloquear esta conversación","topic_delete_warning":"¿Estás seguro de que quieres eliminar esta conversación?","topic_name_editing_placeholder":"Nombre del grupo","unnamed_topic":"Sin nombre","update_available":"Actualización disponible.","upload_finishing":"terminando...","user_not_found":"Usuario no encontrado","description_editing_placeholder":"Descripción (opcional)","label_description":"Descripción","button_security":"Seguridad","panel_title_crop":"Arrastra para ajustar","panel_title_general":"General","panel_title_members":"Miembros","panel_title_security":"Seguridad","panel_title_info":"Información","permissions_anonymous":"Anónimo","permissions_authenticated":"Autenticado","topic_delete":"Eliminar chat","permissions_user":"Permisos del usuario","password_reset_email_sent":"Se ha enviado un correo electrónico a {email}. Siga las instrucciones del correo electrónico para restablecer su contraseña.","label_unarchive_topic":"Archivado:","menu_item_reply":"Respuesta","menu_item_forward":"Reenviar","forward_to":"Reenviar a","forward_to_search_placeholder":"Buscar contactos","label_new_password":"Nueva contraseña","drafty_unknown":"No soportado","calls_incoming":"Llamada entrante","calls_outgoing":"Llamada saliente","calls_you_label":"Tú","menu_item_video_call":"Videollamada","already_in_call":"¡Ya estás hablando!","call_cancelled":"cancelada","call_missed":"perdida","call_declined":"rechazada","call_disconnected":"desconectada","label_use_secure_connection":"Usar conexión segura","cred_confirmed_successfully":"Confirmado con éxito","menu_item_edit":"Editar","editing_message":"Edición","message_edited_marker":", editado","icon_title_add_image":"Añadir imagen","icon_title_attach_file":"Adjuntar archivo","icon_title_delete":"Eliminar grabación","icon_title_pause":"Pausar reproducción","icon_title_play":"Reproducir grabación","icon_title_record_voice":"Grabar mensaje de voz","icon_title_resume":"Reanudar la reproducción","icon_title_send":"Enviar mensaje","drag_file":"Arrastra el archivo aquí","drafty_video":"Grabación de vídeo","call_in_progress":"en progreso","menu_item_audio_call":"Llamada","unrecognized_video_format":"No se reconoce el formato de este video","loading_note":"Cargando...","password_i_have_code":"Tengo código","label_reset_password_tel":"Enviar SMS para restablecer la contraseña","mobile_phone_number":"Número de teléfono móvil","password_reset_sms_sent":"Se ha enviado un mensaje de texto con un código de seguridad a {phone}. Ingresa el código a continuación.","mobile_number_required":"Número de teléfono móvil requerido"}');
/***/ })
diff --git a/umd/src_i18n_min_fr_json.dev.js b/umd/src_i18n_min_fr_json.dev.js
index 3b338998..ee31b8f9 100644
--- a/umd/src_i18n_min_fr_json.dev.js
+++ b/umd/src_i18n_min_fr_json.dev.js
@@ -7,7 +7,7 @@
\******************************/
/***/ ((module) => {
-module.exports = JSON.parse('{"action_block_contact":"Bloquer le Contact","action_cancel":"annuler","action_clear_messages":"Effacer les Messages","action_delete_messages":"Effacer les Messages pour Tous","action_leave_chat":"Quitter la Conversation","action_report_chat":"Signaler la Conversation","archived_contacts":"Contacts archivés ({count})","badge_danger":"Non fiable","badge_owner":"propriétaire","badge_staff":"Géré par le Staff","badge_verified":"Vérifié / Officiel","badge_you":"vous","block_contact_warning":"Êtes-vous sûr de bloquer le contact ?","blocked_contacts_link":"Contacts bloqués ({count})","button_add_another":"Ajouter un autre","button_add_members":"Ajouter des membres","button_cancel":"Annuler","button_confirm":"Confirmer","button_create":"Créer","button_delete_account":"Supprimer le compte","button_edit":"Modifier","button_logout":"Déconnexion","button_ok":"OK","button_reset":"Remettre à Zéro","button_send_request":"Envoyer une demande","button_sign_in":"Connexion","button_sign_up":"Créer un compte","button_subscribe":"S\'abonner","button_update":"Mettre à jour","cannot_initiate_file_upload":"Impossible de démarrer l\'envoi.","channel":"canal","channel_prompt":"C\'est un canal","chat_invitation":"Vous êtes invité à démarrer une conversation. Que voulez vous faire ?","chat_invitation_accept":"Accepter","chat_invitation_block":"Bloquer","chat_invitation_ignore":"Ignorer","clear_messages_warning":"Êtes-vous sûr de vouloir effacer tous les messages ? Aucun retour possible.","code_doesnot_match":"Le code ne correspond pas","contacts_not_found":"Vous n\'avez aucune conversation ¯∖_(ツ)_/¯","contacts_not_found_short":"Aucun contact ne correspond à \'\'{query}\'\'","credential_email_prompt":"Votre email d\'enregistrement","delete_account":"Supprimer le compte","delete_account_warning":"Êtes-vous sûr de vouloir supprimer votre compte ? Aucun retour possible.","delete_messages_warning":"Êtes-vous sûr de vouloir supprimer tous les messages pour tous ? Aucun retour possible.","download_action":"télécharger","drafty_attachment":"Pièce(s) jointe(s)","drafty_form":"Formulaire:","drafty_image":"Image","email_dative":"email","email_prompt":"Email, par exemple jdoe@exemple.com","enable_peers_messaging":"Activer","enter_confirmation_code_prompt":"Entrez le code de confirmation envoyé par {method}:","error_invalid_id":"Identifiant invalide","file_attachment_too_large":"Le fichier de taille {size} dépasse la limite de {limit}.","forgot_password_link":"Mot de passe oublié ?","full_name_prompt":"Nom complet, par exemple John Doe","granted_permissions":"Accordé","group_has_no_members":"Aucun membre","group_user_id_prompt":"Identifiant d\'utilisateur ou de groupe","image_caption_prompt":"Description de l\'image","invalid_content":"contenu invalide","invalid_security_token":"Token de sécurité invalide","label_client":"Client :","label_content_type":"Type de contenu :","label_default_access_mode":"Mode d\'accès par défaut :","label_file_name":"Nom du fichier :","label_group_members":"Membres du groupe :","label_incognito_mode":"Mode incognito :","label_message_sound":"Son du message :","label_muting_topic":"Mué :","label_other_user":"Autre","label_password":"Mot de passe","label_permissions":"Permissions :","label_private":"Commentaire privé","label_push_notifications":"Notifications :","label_push_notifications_disabled":"Notifications (requière HTTPS):","label_reset_password":"Envoyer un mail de remise à zéro de mot de passe :","label_sdk":"SDK :","label_server":"Serveur :","label_server_address":"Adresse du serveur :","label_server_to_use":"Serveur à utiliser :","label_size":"Taille :","label_topic_name":"Nom","label_user_contacts":"Contacts :","label_user_id":"ID :","label_wire_transport":"Transport par cable :","label_you":"Vous :","label_your_name":"Votre nom","label_your_permissions":"Vos permissions :","last_seen_timestamp":"Vu pour la dernière fois","leave_chat_warning":"Êtes-vous sûr de vouloir quitter cette conversation ?","link_contact_us":"Contactez Nous","link_privacy_policy":"Politique de confidentialité","link_terms_of_service":"Conditions d\'utilisation","login_prompt":"Connexion","menu_item_archive_topic":"Archiver","menu_item_block":"Bloquer","menu_item_clear_messages":"Effacer les messages","menu_item_clear_messages_for_all":"Effacer pour Tous","menu_item_delete":"Supprimer","menu_item_delete_for_all":"Supprimer pour Tous","menu_item_delete_topic":"Supprimer","menu_item_edit_permissions":"Modifier les permissions","menu_item_info":"Informations","menu_item_member_delete":"Supprimer","menu_item_mute":"Rendre muer","menu_item_reply":"Répondre","menu_item_restore_topic":"Restorer","menu_item_send_retry":"Réessayer","menu_item_unblock":"Débloquer","menu_item_unmute":"Recevoir à nouveau","message_sending":"envoi en cours...","message_sending_failed":"échoué","messages_not_readable":"aucun accès aux messages","messaging_disabled_prompt":"Discussion désactivée","more_online_members":"+{overflow} de plus","new_message_prompt":"Nouveau message","new_password_placeholder":"Entrez un nouveau mot de passe","no_connection":"Aucune connexion","no_contacts":"Vous n\'avez pas de contacts :-(","numeric_confirmation_code_prompt":"Nombres seulement","online_now":"en ligne","password_prompt":"Mot de passe","password_unchanged_prompt":"Non changé","peers_messaging_disabled":"La messagerie point à point est désactivée.","permission_admin":"Approver ({val})","permission_delete":"Supprimer ({val})","permission_join":"Rejoindre ({val})","permission_owner":"Propriétaire ({val})","permission_pres":"Recevoir une notification ({val})","permission_read":"Lire ({val})","permission_share":"Partager ({val})","permission_write":"Ecrire ({val})","phone_dative":"téléphone","private_editing_placeholder":"Visible par vous seulement","push_init_failed":"Impossible d\'initialiser les notifications push","reconnect_countdown":"Déconnecté. Reconnexion dans {seconds}…","reconnect_now":"Essayer maintenant","reload_update":"Recharger","report_chat_warning":"Êtes-vous sûr de vouloir bloquer et signaler cette conversation ?","requested_permissions":"Demandé","save_attachment":"sauvegarder","search_for_contacts":"Utilisez la recherche pour trouver des contacts","search_no_results":"La recherche n\'a donné aucun résultat","search_placeholder":"Liste comme email:alice@exemple.com, tel:17025550003...","sidepanel_title_acc_notifications":"Notifications","sidepanel_title_acc_support":"Support","sidepanel_title_account_settings":"Paramètres du compte","sidepanel_title_archive":"Conversations Archivées","sidepanel_title_blocked":"Conversations Bloquées","sidepanel_title_cred":"Confirmer les identifiants","sidepanel_title_login":"Se Connecter","sidepanel_title_newtpk":"Démarrer une nouvelle Conversation","sidepanel_title_register":"Créer un compte","sidepanel_title_reset":"Remettre à Zéro le Mot de Passe","sidepanel_title_settings":"Paramètres","stay_logged_in":"Rester connecté","tabtitle_find_user":"trouver","tabtitle_group_by_id":"par identifiant","tabtitle_new_group":"nouveau groupe","tags_editor_no_tags":"Ajouter des étiquettes","tags_not_found":"Aucune étiquette définie. Ajoutez en.","title_all_contacts":"Tous les Contacts","title_group_members":"Membres du Groupe","title_manage_tags":"Gérer","title_not_found":"Pas trouvé","title_permissions":"Permissions","title_tag_manager":"Etiquettes (recherche & découverte)","topic_block_warning":"Êtes-vous sûr de vouloir bloquer cette conversation ?","topic_delete_warning":"Êtes-vous sûr de vouloir supprimer cette conversation ?","topic_name_editing_placeholder":"Nom libre du groupe","unnamed_topic":"Non nommé","update_available":"Mise à jour disponible.","upload_finishing":"fin...","user_not_found":"Pas trouvé","validate_credential_action":"confirmer","description_editing_placeholder":"Description facultative","label_description":"Description","button_security":"Sécurité","panel_title_crop":"Déplacez pour ajuster","panel_title_general":"Général","panel_title_members":"Membres","panel_title_security":"Sécurité","panel_title_info":"Informations","permissions_anonymous":"Anonyme","permissions_authenticated":"Authentifié","topic_delete":"Supprimer la Conversation","permissions_user":"Permissions d\'Utilisateur","password_reset_email_sent":"Un email a été envoyé à {email}. Suivez les instructions du mail pour remettre à zéro votre mot de passe.","label_unarchive_topic":"Archivé:","menu_item_forward":"Transférer","forward_to":"Transférer à","forward_to_search_placeholder":"Rechercher des contacts","label_new_password":"Nouveau mot de passe","drafty_unknown":"Non supporté","already_in_call":"Vous êtes déjà dans un appel en cours!","call_cancelled":"annulé","call_declined":"refusé","call_missed":"manqué","calls_incoming":"Appel entrant","calls_outgoing":"Appel sortant","calls_you_label":"Tu","menu_item_video_call":"Appel vidéo","call_disconnected":"débranché","label_use_secure_connection":"Utiliser une connexion sécurisée","phone_or_email_prompt":"Numéro de téléphone ou email","cred_confirmed_successfully":"Confirmé avec succès","menu_item_edit":"Modifier","editing_message":"Édition","message_edited_marker":", édité","icon_title_add_image":"Ajouter une image","icon_title_attach_file":"Pièce jointe","icon_title_delete":"Supprimer l\'enregistrement","icon_title_pause":"Interrompre la lecture","icon_title_play":"Lire l\'enregistrement","icon_title_record_voice":"Enregistrer un message vocal","icon_title_resume":"Reprendre la lecture","icon_title_send":"Envoyer le message","drag_file":"Faites glisser le fichier ici","drafty_video":"Enregistrement video","call_in_progress":"en cours","menu_item_audio_call":"Appel","unrecognized_video_format":"Le format de cette vidéo n\'est pas reconnu","loading_note":"Chargement...","password_i_have_code":"J\'ai du code","label_reset_password_tel":"Envoyer un SMS pour réinitialiser le mot de passe","mobile_phone_number":"Numéro de téléphone mobile","password_reset_sms_sent":"Un SMS avec un code de sécurité a été envoyé à {phone}. Saisissez le code ci-dessous.","mobile_number_required":"Numéro de téléphone portable requis"}');
+module.exports = JSON.parse('{"action_block_contact":"Bloquer le Contact","action_cancel":"annuler","action_clear_messages":"Effacer les Messages","action_delete_messages":"Effacer les Messages pour Tous","action_leave_chat":"Quitter la Conversation","action_report_chat":"Signaler la Conversation","archived_contacts":"Contacts archivés ({count})","badge_danger":"Non fiable","badge_owner":"propriétaire","badge_staff":"Géré par le Staff","badge_verified":"Vérifié / Officiel","badge_you":"vous","block_contact_warning":"Êtes-vous sûr de bloquer le contact ?","blocked_contacts_link":"Contacts bloqués ({count})","button_add_members":"Ajouter des membres","button_cancel":"Annuler","button_confirm":"Confirmer","button_create":"Créer","button_delete_account":"Supprimer le compte","button_edit":"Modifier","button_logout":"Déconnexion","button_ok":"OK","button_reset":"Remettre à Zéro","button_send_request":"Envoyer une demande","button_sign_in":"Connexion","button_sign_up":"Créer un compte","button_subscribe":"S\'abonner","button_update":"Mettre à jour","cannot_initiate_file_upload":"Impossible de démarrer l\'envoi.","channel":"canal","channel_prompt":"C\'est un canal","chat_invitation":"Vous êtes invité à démarrer une conversation. Que voulez vous faire ?","chat_invitation_accept":"Accepter","chat_invitation_block":"Bloquer","chat_invitation_ignore":"Ignorer","clear_messages_warning":"Êtes-vous sûr de vouloir effacer tous les messages ? Aucun retour possible.","code_doesnot_match":"Le code ne correspond pas","contacts_not_found":"Vous n\'avez aucune conversation ¯∖_(ツ)_/¯","contacts_not_found_short":"Aucun contact ne correspond à \'\'{query}\'\'","credential_email_prompt":"Votre email d\'enregistrement","delete_account":"Supprimer le compte","delete_account_warning":"Êtes-vous sûr de vouloir supprimer votre compte ? Aucun retour possible.","delete_messages_warning":"Êtes-vous sûr de vouloir supprimer tous les messages pour tous ? Aucun retour possible.","download_action":"télécharger","drafty_attachment":"Pièce(s) jointe(s)","drafty_form":"Formulaire:","drafty_image":"Image","email_dative":"email","email_prompt":"Email, par exemple jdoe@exemple.com","enable_peers_messaging":"Activer","enter_confirmation_code_prompt":"Entrez le code de confirmation envoyé par {method}:","error_invalid_id":"Identifiant invalide","file_attachment_too_large":"Le fichier de taille {size} dépasse la limite de {limit}.","forgot_password_link":"Mot de passe oublié ?","full_name_prompt":"Nom complet, par exemple John Doe","granted_permissions":"Accordé","group_has_no_members":"Aucun membre","group_user_id_prompt":"Identifiant d\'utilisateur ou de groupe","image_caption_prompt":"Description de l\'image","invalid_content":"contenu invalide","invalid_security_token":"Token de sécurité invalide","label_client":"Client :","label_content_type":"Type de contenu :","label_default_access_mode":"Mode d\'accès par défaut :","label_file_name":"Nom du fichier :","label_group_members":"Membres du groupe :","label_incognito_mode":"Mode incognito :","label_message_sound":"Son du message :","label_muting_topic":"Mué :","label_other_user":"Autre","label_password":"Mot de passe","label_permissions":"Permissions :","label_private":"Commentaire privé","label_push_notifications":"Notifications :","label_push_notifications_disabled":"Notifications (requière HTTPS):","label_reset_password":"Envoyer un mail de remise à zéro de mot de passe :","label_sdk":"SDK :","label_server":"Serveur :","label_server_address":"Adresse du serveur :","label_server_to_use":"Serveur à utiliser :","label_size":"Taille :","label_topic_name":"Nom","label_user_contacts":"Contacts","label_user_id":"ID :","label_wire_transport":"Transport par cable :","label_you":"Vous :","label_your_name":"Votre nom","label_your_permissions":"Vos permissions :","last_seen_timestamp":"Vu pour la dernière fois","leave_chat_warning":"Êtes-vous sûr de vouloir quitter cette conversation ?","link_contact_us":"Contactez Nous","link_privacy_policy":"Politique de confidentialité","link_terms_of_service":"Conditions d\'utilisation","login_prompt":"Connexion","menu_item_archive_topic":"Archiver","menu_item_block":"Bloquer","menu_item_clear_messages":"Effacer les messages","menu_item_clear_messages_for_all":"Effacer pour Tous","menu_item_delete":"Supprimer","menu_item_delete_for_all":"Supprimer pour Tous","menu_item_delete_topic":"Supprimer","menu_item_edit_permissions":"Modifier les permissions","menu_item_info":"Informations","menu_item_member_delete":"Supprimer","menu_item_mute":"Rendre muer","menu_item_reply":"Répondre","menu_item_restore_topic":"Restorer","menu_item_send_retry":"Réessayer","menu_item_unblock":"Débloquer","menu_item_unmute":"Recevoir à nouveau","message_sending":"envoi en cours...","message_sending_failed":"échoué","messages_not_readable":"aucun accès aux messages","messaging_disabled_prompt":"Discussion désactivée","more_online_members":"+{overflow} de plus","new_message_prompt":"Nouveau message","new_password_placeholder":"Entrez un nouveau mot de passe","no_connection":"Aucune connexion","no_contacts":"Vous n\'avez pas de contacts :-(","numeric_confirmation_code_prompt":"Nombres seulement","online_now":"en ligne","password_prompt":"Mot de passe","password_unchanged_prompt":"Non changé","peers_messaging_disabled":"La messagerie point à point est désactivée.","permission_admin":"Approver ({val})","permission_delete":"Supprimer ({val})","permission_join":"Rejoindre ({val})","permission_owner":"Propriétaire ({val})","permission_pres":"Recevoir une notification ({val})","permission_read":"Lire ({val})","permission_share":"Partager ({val})","permission_write":"Ecrire ({val})","phone_dative":"téléphone","private_editing_placeholder":"Visible par vous seulement","push_init_failed":"Impossible d\'initialiser les notifications push","reconnect_countdown":"Déconnecté. Reconnexion dans {seconds}…","reconnect_now":"Essayer maintenant","reload_update":"Recharger","report_chat_warning":"Êtes-vous sûr de vouloir bloquer et signaler cette conversation ?","requested_permissions":"Demandé","save_attachment":"sauvegarder","search_for_contacts":"Utilisez la recherche pour trouver des contacts","search_no_results":"La recherche n\'a donné aucun résultat","search_placeholder":"Liste comme email:alice@exemple.com, tel:17025550003...","sidepanel_title_acc_notifications":"Notifications","sidepanel_title_acc_support":"Support","sidepanel_title_account_settings":"Paramètres du compte","sidepanel_title_archive":"Conversations Archivées","sidepanel_title_blocked":"Conversations Bloquées","sidepanel_title_cred":"Confirmer les identifiants","sidepanel_title_login":"Se Connecter","sidepanel_title_newtpk":"Démarrer une nouvelle Conversation","sidepanel_title_register":"Créer un compte","sidepanel_title_reset":"Remettre à Zéro le Mot de Passe","sidepanel_title_settings":"Paramètres","stay_logged_in":"Rester connecté","tabtitle_find_user":"trouver","tabtitle_group_by_id":"par identifiant","tabtitle_new_group":"nouveau groupe","tags_editor_no_tags":"Ajouter des étiquettes","tags_not_found":"Aucune étiquette définie. Ajoutez en.","title_all_contacts":"Tous les Contacts","title_group_members":"Membres du Groupe","title_manage_tags":"Gérer","title_not_found":"Pas trouvé","title_permissions":"Permissions","title_tag_manager":"Etiquettes (recherche & découverte)","topic_block_warning":"Êtes-vous sûr de vouloir bloquer cette conversation ?","topic_delete_warning":"Êtes-vous sûr de vouloir supprimer cette conversation ?","topic_name_editing_placeholder":"Nom libre du groupe","unnamed_topic":"Non nommé","update_available":"Mise à jour disponible.","upload_finishing":"fin...","user_not_found":"Pas trouvé","description_editing_placeholder":"Description facultative","label_description":"Description","button_security":"Sécurité","panel_title_crop":"Déplacez pour ajuster","panel_title_general":"Général","panel_title_members":"Membres","panel_title_security":"Sécurité","panel_title_info":"Informations","permissions_anonymous":"Anonyme","permissions_authenticated":"Authentifié","topic_delete":"Supprimer la Conversation","permissions_user":"Permissions d\'Utilisateur","password_reset_email_sent":"Un email a été envoyé à {email}. Suivez les instructions du mail pour remettre à zéro votre mot de passe.","label_unarchive_topic":"Archivé:","menu_item_forward":"Transférer","forward_to":"Transférer à","forward_to_search_placeholder":"Rechercher des contacts","label_new_password":"Nouveau mot de passe","drafty_unknown":"Non supporté","already_in_call":"Vous êtes déjà dans un appel en cours!","call_cancelled":"annulé","call_declined":"refusé","call_missed":"manqué","calls_incoming":"Appel entrant","calls_outgoing":"Appel sortant","calls_you_label":"Tu","menu_item_video_call":"Appel vidéo","call_disconnected":"débranché","label_use_secure_connection":"Utiliser une connexion sécurisée","cred_confirmed_successfully":"Confirmé avec succès","menu_item_edit":"Modifier","editing_message":"Édition","message_edited_marker":", édité","icon_title_add_image":"Ajouter une image","icon_title_attach_file":"Pièce jointe","icon_title_delete":"Supprimer l\'enregistrement","icon_title_pause":"Interrompre la lecture","icon_title_play":"Lire l\'enregistrement","icon_title_record_voice":"Enregistrer un message vocal","icon_title_resume":"Reprendre la lecture","icon_title_send":"Envoyer le message","drag_file":"Faites glisser le fichier ici","drafty_video":"Enregistrement video","call_in_progress":"en cours","menu_item_audio_call":"Appel","unrecognized_video_format":"Le format de cette vidéo n\'est pas reconnu","loading_note":"Chargement...","password_i_have_code":"J\'ai du code","label_reset_password_tel":"Envoyer un SMS pour réinitialiser le mot de passe","mobile_phone_number":"Numéro de téléphone mobile","password_reset_sms_sent":"Un SMS avec un code de sécurité a été envoyé à {phone}. Saisissez le code ci-dessous.","mobile_number_required":"Numéro de téléphone portable requis"}');
/***/ })
diff --git a/umd/src_i18n_min_ko_json.dev.js b/umd/src_i18n_min_ko_json.dev.js
index 6aec6700..d70c848c 100644
--- a/umd/src_i18n_min_ko_json.dev.js
+++ b/umd/src_i18n_min_ko_json.dev.js
@@ -7,7 +7,7 @@
\******************************/
/***/ ((module) => {
-module.exports = JSON.parse('{"action_block_contact":"연락차단","action_cancel":"취소","action_clear_messages":"메시지지우기","action_delete_messages":"모든메시지지우기","action_leave_chat":"대화나누기","action_report_chat":"대화기록","archived_contacts":"보관된연락처({수})","badge_danger":"의심 많은","badge_owner":"소유자","badge_staff":"직원 관리하에","badge_verified":"확인 됨","badge_you":"당신","block_contact_warning":"이연락처를차단하시겠습니까?","blocked_contacts_link":"차단된연락처({수})","button_add_another":"다른항목추가","button_add_members":"회원추가","button_cancel":"취소","button_confirm":"확인","button_create":"작성","button_delete_account":"계정삭제","button_edit":"편집","button_logout":"로그아웃","button_ok":"OK","button_reset":"재설정","button_send_request":"요청보내기","button_sign_in":"로그인","button_sign_up":"가입","button_subscribe":"구독","button_update":"업데이트","cannot_initiate_file_upload":"파일업로드를시작할수없습니다.","channel":"채널","channel_prompt":"이 채널입니다","chat_invitation":"새로운대화를시작하도록초대되었습니다.무엇을하시겠습니까?","chat_invitation_accept":"수락","chat_invitation_block":"차단","chat_invitation_ignore":"무시","clear_messages_warning":"모든메시지를지우시겠습니까?실행취소할수없습니다.","code_doesnot_match":"코드가일치하지않습니다","contacts_not_found":"채팅이없습니다 ¯∖_(ツ)_/¯","contacts_not_found_short":"\'{문의}\'와일치하는연락처가없습니다.","credential_email_prompt":"등록이메일","delete_account":"계정삭제","delete_account_warning":"계정을삭제하시겠습니까?실행취소할수없습니다.","delete_messages_warning":"모든사람의모든메시지를삭제하시겠습니까?실행취소할수없습니다.","download_action":"다운로드","drafty_attachment":"부착","drafty_form":"형태:","drafty_image":"이미지","email_dative":"이메일","email_prompt":"이메일(예:hong@example.com)","enable_peers_messaging":"활성화","enter_confirmation_code_prompt":"{방법}으로보낸확인코드를입력하십시오:","error_invalid_id":"잘못된ID","file_attachment_too_large":"파일크기{크기}이(가){제한}제한을초과합니다.","forgot_password_link":"비밀번호를잊으셨습니까?","full_name_prompt":"전체이름(예:홍길동)","granted_permissions":"승낙하다","group_has_no_members":"회원없음","group_user_id_prompt":"그룹또는사용자ID","image_caption_prompt":"이미지설명","invalid_content":"잘못된내용","invalid_security_token":"유효하지않은보안토큰","label_client":"클라이언트: ","label_content_type":"컨텐츠유형: ","label_default_access_mode":"기본액세스모드: ","label_file_name":"파일이름: ","label_group_members":"그룹회원: ","label_incognito_mode":"시크릿모드: ","label_message_sound":"메시지소리: ","label_muting_topic":"음소거: ","label_other_user":"기타","label_password":"비밀번호","label_permissions":"권한: ","label_private":"개인코멘트","label_push_notifications":"통지경보: ","label_push_notifications_disabled":"통지경보(HTTPS필요): ","label_reset_password":"비밀번호재설정이메일보내기: ","label_sdk":"SDK:","label_server":"서버: ","label_server_address":"서버주소: ","label_server_to_use":"사용할서버:","label_size":"크기: ","label_topic_name":"이름","label_user_contacts":"연락처: ","label_user_id":"ID:","label_wire_transport":"와이어수송:","label_you":"당신: ","label_your_name":"이름","label_your_permissions":"권한: ","last_seen_timestamp":"마지막으로본","leave_chat_warning":"이대화를나가시겠습니까?","link_contact_us":"문의처","link_privacy_policy":"개인정보보호정책","link_terms_of_service":"서비스약관","login_prompt":"로그인","menu_item_archive_topic":"보관","menu_item_block":"차단","menu_item_clear_messages":"메시지지우기","menu_item_clear_messages_for_all":"모두지우기","menu_item_delete":"삭제","menu_item_delete_for_all":"모두삭제","menu_item_delete_topic":"삭제","menu_item_edit_permissions":"편집권한","menu_item_info":"정보","menu_item_member_delete":"제거","menu_item_mute":"음소거","menu_item_restore_topic":"복원","menu_item_send_retry":"다시시도","menu_item_unblock":"차단해제","menu_item_unmute":"음소거해제","message_sending":"보내기...","message_sending_failed":"실패","messages_not_readable":"메시지에 액세스 할 수 없습니다","messaging_disabled_prompt":"메시지비활성화","more_online_members":"+{넘침}더보기","new_message_prompt":"새메시지","new_password_placeholder":"새비밀번호입력","no_connection":"연결없음","no_contacts":"연락처가없습니다 (._.)","numeric_confirmation_code_prompt":"숫자만","online_now":"현재접속중","password_prompt":"비밀번호","password_unchanged_prompt":"변경되지않음","peers_messaging_disabled":"동료의메시지가비활성화되었습니다.","permission_admin":"승인({val})","permission_delete":"삭제({val})","permission_join":"참여({val})","permission_owner":"소유자({val})","permission_pres":"알림받기({val})","permission_read":"읽기({val})","permission_share":"공유({val})","permission_write":"쓰기({val})","phone_dative":"전화","private_editing_placeholder":"나만볼수있습니다","push_init_failed":"푸시알림을초기화하지못했습니다","reconnect_countdown":"연결이끊어졌습니다.다시연결하는중{초}…","reconnect_now":"지금시도","reload_update":"재로드","report_chat_warning":"이대화를차단하고기록하시겠습니까?","requested_permissions":"요청","save_attachment":"저장","search_for_contacts":"검색을사용하여연락처찾기","search_no_results":"검색결과가없습니다","search_placeholder":"email:alice@example.com,tel:17025550003...와같은목록","sidepanel_title_acc_notifications":"알림","sidepanel_title_acc_support":"지원","sidepanel_title_account_settings":"계정설정","sidepanel_title_archive":"보관된채팅","sidepanel_title_blocked":"차단된채팅","sidepanel_title_cred":"자격증명확인","sidepanel_title_login":"로그인","sidepanel_title_newtpk":"새채팅시작","sidepanel_title_register":"계정만들기","sidepanel_title_reset":"비밀번호재설정","sidepanel_title_settings":"설정","stay_logged_in":"로그인상태유지","tabtitle_find_user":"찾기","tabtitle_group_by_id":"id로","tabtitle_new_group":"새그룹","tags_editor_no_tags":"일부태그추가","tags_not_found":"태그가정의되지않았습니다.일부를추가하십시오.","title_all_contacts":"모든연락처","title_group_members":"그룹구성원","title_manage_tags":"관리","title_not_found":"찾을수없음","title_permissions":"권한","title_tag_manager":"태그(사용자검색)","topic_block_warning":"이대화를차단하시겠습니까?","topic_delete_warning":"이대화를삭제하시겠습니까?","topic_name_editing_placeholder":"그룹의자유형이름","unnamed_topic":"이름없는","update_available":"업데이트가능.","upload_finishing":"마무리...","user_not_found":"찾을수없음","validate_credential_action":"확인","description_editing_placeholder":"설명(선택 사항)","label_description":"설명","button_security":"보안","panel_title_crop":"드래그하여 조정","panel_title_general":"일반","panel_title_members":"구성원","panel_title_security":"보안","panel_title_info":"정보","permissions_anonymous":"익명","permissions_authenticated":"인증됨","topic_delete":"채팅 삭제","permissions_user":"사용자 권한","password_reset_email_sent":"이메일이 {email}(으)로 전송되었습니다. 이메일의 지침에 따라 비밀번호를 재설정하세요.","label_unarchive_topic":"보관됨:","menu_item_reply":"회신하다","menu_item_forward":"리디렉션","forward_to":"메시지를 리디렉션","forward_to_search_placeholder":"연락처 검색","label_new_password":"새 비밀번호","drafty_unknown":"지원되지 않음","calls_incoming":"수신 전화","calls_outgoing":"발신 전화","calls_you_label":"너","menu_item_video_call":"영상 통화","already_in_call":"당신은 이미 말하고 있습니다!","call_cancelled":"취소 된","call_missed":"부재중","call_declined":"통화 거부","call_disconnected":"연결 끊김","label_use_secure_connection":"보안 연결 사용","phone_or_email_prompt":"전화번호 또는 이메일","cred_confirmed_successfully":"성공적으로 확인됨","menu_item_edit":"편집","editing_message":"교정하다","message_edited_marker":" 수정됨","icon_title_add_image":"이미지 추가","icon_title_attach_file":"파일을 첨부","icon_title_delete":"녹음 삭제","icon_title_pause":"재생 일시 중지","icon_title_play":"녹음 재생","icon_title_record_voice":"음성 메시지 녹음","icon_title_resume":"재생 재개","icon_title_send":"문자 보내","drag_file":"여기로 파일 드래그","drafty_video":"녹화","call_in_progress":"통화 중","menu_item_audio_call":"부르다","unrecognized_video_format":"이 동영상의 형식을 인식할 수 없습니다.","loading_note":"로드 중...","password_i_have_code":"코드가 있습니다","label_reset_password_tel":"비밀번호 재설정을 위해 SMS 보내기","mobile_phone_number":"휴대전화 번호","password_reset_sms_sent":"보안 코드가 포함된 문자 메시지가 {phone}로 전송되었습니다. 아래 코드를 입력하세요.","mobile_number_required":"휴대전화 번호 필요"}');
+module.exports = JSON.parse('{"action_block_contact":"연락차단","action_cancel":"취소","action_clear_messages":"메시지지우기","action_delete_messages":"모든메시지지우기","action_leave_chat":"대화나누기","action_report_chat":"대화기록","archived_contacts":"보관된연락처({수})","badge_danger":"의심 많은","badge_owner":"소유자","badge_staff":"직원 관리하에","badge_verified":"확인 됨","badge_you":"당신","block_contact_warning":"이연락처를차단하시겠습니까?","blocked_contacts_link":"차단된연락처({수})","button_add_members":"회원추가","button_cancel":"취소","button_confirm":"확인","button_create":"작성","button_delete_account":"계정삭제","button_edit":"편집","button_logout":"로그아웃","button_ok":"OK","button_reset":"재설정","button_send_request":"요청보내기","button_sign_in":"로그인","button_sign_up":"가입","button_subscribe":"구독","button_update":"업데이트","cannot_initiate_file_upload":"파일업로드를시작할수없습니다.","channel":"채널","channel_prompt":"이 채널입니다","chat_invitation":"새로운대화를시작하도록초대되었습니다.무엇을하시겠습니까?","chat_invitation_accept":"수락","chat_invitation_block":"차단","chat_invitation_ignore":"무시","clear_messages_warning":"모든메시지를지우시겠습니까?실행취소할수없습니다.","code_doesnot_match":"코드가일치하지않습니다","contacts_not_found":"채팅이없습니다 ¯∖_(ツ)_/¯","contacts_not_found_short":"\'{문의}\'와일치하는연락처가없습니다.","credential_email_prompt":"등록이메일","delete_account":"계정삭제","delete_account_warning":"계정을삭제하시겠습니까?실행취소할수없습니다.","delete_messages_warning":"모든사람의모든메시지를삭제하시겠습니까?실행취소할수없습니다.","download_action":"다운로드","drafty_attachment":"부착","drafty_form":"형태:","drafty_image":"이미지","email_dative":"이메일","email_prompt":"이메일(예:hong@example.com)","enable_peers_messaging":"활성화","enter_confirmation_code_prompt":"{방법}으로보낸확인코드를입력하십시오:","error_invalid_id":"잘못된ID","file_attachment_too_large":"파일크기{크기}이(가){제한}제한을초과합니다.","forgot_password_link":"비밀번호를잊으셨습니까?","full_name_prompt":"전체이름(예:홍길동)","granted_permissions":"승낙하다","group_has_no_members":"회원없음","group_user_id_prompt":"그룹또는사용자ID","image_caption_prompt":"이미지설명","invalid_content":"잘못된내용","invalid_security_token":"유효하지않은보안토큰","label_client":"클라이언트: ","label_content_type":"컨텐츠유형: ","label_default_access_mode":"기본액세스모드: ","label_file_name":"파일이름: ","label_group_members":"그룹회원: ","label_incognito_mode":"시크릿모드: ","label_message_sound":"메시지소리: ","label_muting_topic":"음소거: ","label_other_user":"기타","label_password":"비밀번호","label_permissions":"권한: ","label_private":"개인코멘트","label_push_notifications":"통지경보: ","label_push_notifications_disabled":"통지경보(HTTPS필요): ","label_reset_password":"비밀번호재설정이메일보내기: ","label_sdk":"SDK:","label_server":"서버: ","label_server_address":"서버주소: ","label_server_to_use":"사용할서버:","label_size":"크기: ","label_topic_name":"이름","label_user_contacts":"연락처","label_user_id":"ID:","label_wire_transport":"와이어수송:","label_you":"당신: ","label_your_name":"이름","label_your_permissions":"권한: ","last_seen_timestamp":"마지막으로본","leave_chat_warning":"이대화를나가시겠습니까?","link_contact_us":"문의처","link_privacy_policy":"개인정보보호정책","link_terms_of_service":"서비스약관","login_prompt":"로그인","menu_item_archive_topic":"보관","menu_item_block":"차단","menu_item_clear_messages":"메시지지우기","menu_item_clear_messages_for_all":"모두지우기","menu_item_delete":"삭제","menu_item_delete_for_all":"모두삭제","menu_item_delete_topic":"삭제","menu_item_edit_permissions":"편집권한","menu_item_info":"정보","menu_item_member_delete":"제거","menu_item_mute":"음소거","menu_item_restore_topic":"복원","menu_item_send_retry":"다시시도","menu_item_unblock":"차단해제","menu_item_unmute":"음소거해제","message_sending":"보내기...","message_sending_failed":"실패","messages_not_readable":"메시지에 액세스 할 수 없습니다","messaging_disabled_prompt":"메시지비활성화","more_online_members":"+{넘침}더보기","new_message_prompt":"새메시지","new_password_placeholder":"새비밀번호입력","no_connection":"연결없음","no_contacts":"연락처가없습니다 (._.)","numeric_confirmation_code_prompt":"숫자만","online_now":"현재접속중","password_prompt":"비밀번호","password_unchanged_prompt":"변경되지않음","peers_messaging_disabled":"동료의메시지가비활성화되었습니다.","permission_admin":"승인({val})","permission_delete":"삭제({val})","permission_join":"참여({val})","permission_owner":"소유자({val})","permission_pres":"알림받기({val})","permission_read":"읽기({val})","permission_share":"공유({val})","permission_write":"쓰기({val})","phone_dative":"전화","private_editing_placeholder":"나만볼수있습니다","push_init_failed":"푸시알림을초기화하지못했습니다","reconnect_countdown":"연결이끊어졌습니다.다시연결하는중{초}…","reconnect_now":"지금시도","reload_update":"재로드","report_chat_warning":"이대화를차단하고기록하시겠습니까?","requested_permissions":"요청","save_attachment":"저장","search_for_contacts":"검색을사용하여연락처찾기","search_no_results":"검색결과가없습니다","search_placeholder":"email:alice@example.com,tel:17025550003...와같은목록","sidepanel_title_acc_notifications":"알림","sidepanel_title_acc_support":"지원","sidepanel_title_account_settings":"계정설정","sidepanel_title_archive":"보관된채팅","sidepanel_title_blocked":"차단된채팅","sidepanel_title_cred":"자격증명확인","sidepanel_title_login":"로그인","sidepanel_title_newtpk":"새채팅시작","sidepanel_title_register":"계정만들기","sidepanel_title_reset":"비밀번호재설정","sidepanel_title_settings":"설정","stay_logged_in":"로그인상태유지","tabtitle_find_user":"찾기","tabtitle_group_by_id":"id로","tabtitle_new_group":"새그룹","tags_editor_no_tags":"일부태그추가","tags_not_found":"태그가정의되지않았습니다.일부를추가하십시오.","title_all_contacts":"모든연락처","title_group_members":"그룹구성원","title_manage_tags":"관리","title_not_found":"찾을수없음","title_permissions":"권한","title_tag_manager":"태그(사용자검색)","topic_block_warning":"이대화를차단하시겠습니까?","topic_delete_warning":"이대화를삭제하시겠습니까?","topic_name_editing_placeholder":"그룹의자유형이름","unnamed_topic":"이름없는","update_available":"업데이트가능.","upload_finishing":"마무리...","user_not_found":"찾을수없음","description_editing_placeholder":"설명(선택 사항)","label_description":"설명","button_security":"보안","panel_title_crop":"드래그하여 조정","panel_title_general":"일반","panel_title_members":"구성원","panel_title_security":"보안","panel_title_info":"정보","permissions_anonymous":"익명","permissions_authenticated":"인증됨","topic_delete":"채팅 삭제","permissions_user":"사용자 권한","password_reset_email_sent":"이메일이 {email}(으)로 전송되었습니다. 이메일의 지침에 따라 비밀번호를 재설정하세요.","label_unarchive_topic":"보관됨:","menu_item_reply":"회신하다","menu_item_forward":"리디렉션","forward_to":"메시지를 리디렉션","forward_to_search_placeholder":"연락처 검색","label_new_password":"새 비밀번호","drafty_unknown":"지원되지 않음","calls_incoming":"수신 전화","calls_outgoing":"발신 전화","calls_you_label":"너","menu_item_video_call":"영상 통화","already_in_call":"당신은 이미 말하고 있습니다!","call_cancelled":"취소 된","call_missed":"부재중","call_declined":"통화 거부","call_disconnected":"연결 끊김","label_use_secure_connection":"보안 연결 사용","cred_confirmed_successfully":"성공적으로 확인됨","menu_item_edit":"편집","editing_message":"교정하다","message_edited_marker":" 수정됨","icon_title_add_image":"이미지 추가","icon_title_attach_file":"파일을 첨부","icon_title_delete":"녹음 삭제","icon_title_pause":"재생 일시 중지","icon_title_play":"녹음 재생","icon_title_record_voice":"음성 메시지 녹음","icon_title_resume":"재생 재개","icon_title_send":"문자 보내","drag_file":"여기로 파일 드래그","drafty_video":"녹화","call_in_progress":"통화 중","menu_item_audio_call":"부르다","unrecognized_video_format":"이 동영상의 형식을 인식할 수 없습니다.","loading_note":"로드 중...","password_i_have_code":"코드가 있습니다","label_reset_password_tel":"비밀번호 재설정을 위해 SMS 보내기","mobile_phone_number":"휴대전화 번호","password_reset_sms_sent":"보안 코드가 포함된 문자 메시지가 {phone}로 전송되었습니다. 아래 코드를 입력하세요.","mobile_number_required":"휴대전화 번호 필요"}');
/***/ })
diff --git a/umd/src_i18n_min_ro_json.dev.js b/umd/src_i18n_min_ro_json.dev.js
index 973e7ddf..85904e34 100644
--- a/umd/src_i18n_min_ro_json.dev.js
+++ b/umd/src_i18n_min_ro_json.dev.js
@@ -7,7 +7,7 @@
\******************************/
/***/ ((module) => {
-module.exports = JSON.parse('{"action_block_contact":"Blochează contact","action_cancel":"anulează","action_clear_messages":"Șterge mesajele","action_delete_messages":"Șterge toate mesajele","action_leave_chat":"Ieși din conversație","action_report_chat":"Raportează conversația","archived_contacts":"Contacte arhivate ({count})","badge_danger":"Suspicios","badge_owner":"owner","badge_staff":"Administrare","badge_verified":"Verificat","badge_you":"tu","block_contact_warning":"Ești sigur că dorești să blochezi acest contact?","blocked_contacts_link":"Contact blocate ({count})","button_add_another":"Adaugă","button_add_members":"Adaugă persoane","button_cancel":"Anulează","button_confirm":"Confirmă","button_create":"Creează","button_delete_account":"Șterge cont","button_edit":"Editează","button_logout":"Deconectare","button_ok":"OK","button_reset":"Resetează","button_send_request":"Trimite cerere","button_sign_in":"Conectează-te","button_sign_up":"Creează cont","button_subscribe":"Subscribe","button_update":"Actualizează","cannot_initiate_file_upload":"Nu se poate face încărcarea.","channel":"canal","channel_prompt":"Acesta este un canal","chat_invitation":"Ai primit invitație într-o conversație. Accepți?","chat_invitation_accept":"Da, accept","chat_invitation_block":"Blochează","chat_invitation_ignore":"Ignoră","clear_messages_warning":"Ești sigur că dorești să ștergi mesajele? Acestea nu pot fi recuperate.","code_doesnot_match":"Codul furnizat nu este valid","contacts_not_found":"Nu ai contacte salvate ¯∖_(ツ)_/¯","contacts_not_found_short":"Niciun contact găsit după criteriile \'\'{query}\'\'","credential_email_prompt":"Adresa de e-mail","delete_account":"Șterge contul","delete_account_warning":"Ești sigur că dorești să ștergi contul? Acesta nu va putea fi recuperat.","delete_messages_warning":"Ești sigur că dorești să șterge mesajele din toate conversațiile? Acestea nu pot fi recuperate.","download_action":"download","drafty_attachment":"Atasament","drafty_form":"Formă:","drafty_image":"Imagine","email_dative":"email","email_prompt":"Adresa de e-mail","enable_peers_messaging":"Activează","enter_confirmation_code_prompt":"Introu codul de confirmare trimis pe {method}:","error_invalid_id":"ID Invalid","file_attachment_too_large":"Dimensiunea fișiterului {size} depășește limita de {limit}.","forgot_password_link":"Ți-ai uitat parola?","full_name_prompt":"Numele tău","granted_permissions":"Oferite","group_has_no_members":"În acest grup nu se află persoane","group_user_id_prompt":"Grup sau user ID","image_caption_prompt":"Titlul imaginii","invalid_content":"conținut invalid","invalid_security_token":"Codul de securitate este invalid","label_client":"Client:","label_content_type":"Tip conținut:","label_default_access_mode":"Default access mode:","label_file_name":"Nume fișier:","label_group_members":"Membrii grupului:","label_incognito_mode":"Mod incognito:","label_message_sound":"Sunet de mesaj:","label_muting_topic":"Mod silențios (muted):","label_other_user":"Altele","label_password":"Parola","label_permissions":"Permisiuni:","label_private":"Comentariu privat","label_push_notifications":"Alerte de notificare:","label_push_notifications_disabled":"Alerte de notificare (necesită HTTPS):","label_reset_password":"Resetează parola:","label_sdk":"SDK:","label_server":"Server:","label_server_address":"Adresa serverului:","label_server_to_use":"Server de utilizat:","label_size":"Size:","label_topic_name":"Nume","label_user_contacts":"Contacte:","label_user_id":"ID:","label_wire_transport":"Transportul legat:","label_you":"Tu:","label_your_name":"Numele tău","label_your_permissions":"Permisiuniile tale:","last_seen_timestamp":"Văzut ultima dată","leave_chat_warning":"Ești sigur că dorești să ieși din conersație?","link_contact_us":"Contactează-ne","link_privacy_policy":"Politica de Confidențialitate","link_terms_of_service":"Termenii Serviciului","login_prompt":"Conectează-te","menu_item_archive_topic":"Arhivează","menu_item_block":"Blochează","menu_item_clear_messages":"Șterge mesajele","menu_item_clear_messages_for_all":"Ștergele pe toate","menu_item_delete":"Șterge","menu_item_delete_for_all":"Ștergele pe toate","menu_item_delete_topic":"Șterge","menu_item_edit_permissions":"Editează permisiuni","menu_item_info":"Info","menu_item_member_delete":"Șterge persoană","menu_item_mute":"Mute","menu_item_restore_topic":"Restabili","menu_item_send_retry":"Reîncearcă","menu_item_unblock":"Deblochează","menu_item_unmute":"Unmute","message_sending":"se trimite...","message_sending_failed":"eroare","messages_not_readable":"Mesajele nu pot fi citite","messaging_disabled_prompt":"Mesageria este dezactivată","more_online_members":"+{overflow} mai mult","new_message_prompt":"Mesaj nou","new_password_placeholder":"Introdu parolă","no_connection":"Nu există conexiune","no_contacts":"Nu ai contacte adăugate :-(","numeric_confirmation_code_prompt":"Doar cifre","online_now":"online acum","password_prompt":"Parola","password_unchanged_prompt":"Neschimbată","peers_messaging_disabled":"Mesageria de tip Peer este dezactivată.","permission_admin":"Aprobare ({val})","permission_delete":"Ștergere ({val})","permission_join":"Participare ({val})","permission_owner":"Deținător ({val})","permission_pres":"Notificare ({val})","permission_read":"Citire ({val})","permission_share":"Distribuire ({val})","permission_write":"Scriere ({val})","phone_dative":"telefon","private_editing_placeholder":"Vizibil doar ție","push_init_failed":"Nu s-a reușit inițializarea tip push notifications","reconnect_countdown":"Deconectat. Se încearcă conectarea în {seconds}…","reconnect_now":"Încearcă din nou","reload_update":"Reîncarcă","report_chat_warning":"Ești sigur că dorești să blochezi și să raportezi această conversație?","requested_permissions":"Necesare","save_attachment":"salvează","search_for_contacts":"Caută în contacte","search_no_results":"Nu s-au găsit rezultate","search_placeholder":"Caută după e-mail sau număr telefon...","sidepanel_title_acc_notifications":"Notificări","sidepanel_title_acc_support":"Ajutor","sidepanel_title_account_settings":"Setările Contului","sidepanel_title_archive":"Conversații Arhivate","sidepanel_title_blocked":"Conversații Blocate","sidepanel_title_cred":"Confirmă credențiale","sidepanel_title_login":"Conectează-te","sidepanel_title_newtpk":"Creeză un nou Chat","sidepanel_title_register":"Creează Cont","sidepanel_title_reset":"Resetează Parola","sidepanel_title_settings":"Setări","stay_logged_in":"Rămâi conectat","tabtitle_find_user":"caută","tabtitle_group_by_id":"după id","tabtitle_new_group":"grup nou","tags_editor_no_tags":"Adaugă tag-uri","tags_not_found":"Niciun tag definit. Adaugă.","title_all_contacts":"Toate Contactele","title_group_members":"Persoanele din grup","title_manage_tags":"Administrează","title_not_found":"Nu a fost găsit","title_permissions":"Permisiuni","title_tag_manager":"Tag-uri (user discovery)","topic_block_warning":"Ești sigur că dorești să blochezi această conversație?","topic_delete_warning":"Ești sigur că dorești să șterge această conversație?","topic_name_editing_placeholder":"Numele grupului","unnamed_topic":"Nedenumit","update_available":"Actualizare disponibilă.","upload_finishing":"se încarcă...","user_not_found":"Utilizatorul nu a fost găsit","validate_credential_action":"confirmă","description_editing_placeholder":"Descriere (opțional)","label_description":"Descriere","button_security":"Securitate","panel_title_crop":"Trageți pentru a ajusta","panel_title_general":"Generale","panel_title_members":"Membri","panel_title_security":"Securitate","panel_title_info":"Info","permissions_anonymous":"Anonim","permissions_authenticated":"Autentificat","topic_delete":"Ștergeți Chat","permissions_user":"Permisiunile utilizatorului","password_reset_email_sent":"Un e-mail a fost trimis către {email}. Urmați instrucțiunile din e-mail pentru a vă reseta parola.","label_unarchive_topic":"Arhivat:","menu_item_reply":"A raspunde","menu_item_forward":"Redirecţiona","forward_to":"Redirecționați către","forward_to_search_placeholder":"Căutați contacte","label_new_password":"Parolă Nouă","drafty_unknown":"Neacceptat","calls_incoming":"Apel primit","calls_outgoing":"Apel efectuat","calls_you_label":"Tu","menu_item_video_call":"Apel video","already_in_call":"Deja vorbesti!","call_cancelled":"anulat","call_missed":"pierdut","call_declined":"refuzat","call_disconnected":"deconectat","label_use_secure_connection":"Utilizați conexiune securizată","phone_or_email_prompt":"Număr de telefon sau e-mail","cred_confirmed_successfully":"Confirmat cu succes","menu_item_edit":"Editează","editing_message":"Editare","message_edited_marker":", editat","icon_title_add_image":"Adauga imagine","icon_title_attach_file":"Ataseaza fisier","icon_title_delete":"Ștergeți înregistrarea","icon_title_pause":"Întrerupeți redarea","icon_title_play":"Redați înregistrarea","icon_title_record_voice":"Înregistrați mesajul vocal","icon_title_resume":"Reluați redarea","icon_title_send":"Trimite mesaj","drag_file":"Trageți fișierul aici","drafty_video":"Înregistrare video","call_in_progress":"în curs","menu_item_audio_call":"Apel","unrecognized_video_format":"Formatul acestui videoclip nu este recunoscut","loading_note":"Se încarcă...","password_i_have_code":"Am cod","label_reset_password_tel":"Trimite SMS pentru a reseta parola","mobile_phone_number":"Număr de telefon mobil","password_reset_sms_sent":"Un mesaj text cu cod de securitate a fost trimis la {phone}. Introduceți codul de mai jos.","mobile_number_required":"Este necesar un număr de telefon mobil"}');
+module.exports = JSON.parse('{"action_block_contact":"Blochează contact","action_cancel":"anulează","action_clear_messages":"Șterge mesajele","action_delete_messages":"Șterge toate mesajele","action_leave_chat":"Ieși din conversație","action_report_chat":"Raportează conversația","archived_contacts":"Contacte arhivate ({count})","badge_danger":"Suspicios","badge_owner":"owner","badge_staff":"Administrare","badge_verified":"Verificat","badge_you":"tu","block_contact_warning":"Ești sigur că dorești să blochezi acest contact?","blocked_contacts_link":"Contact blocate ({count})","button_add_members":"Adaugă persoane","button_cancel":"Anulează","button_confirm":"Confirmă","button_create":"Creează","button_delete_account":"Șterge cont","button_edit":"Editează","button_logout":"Deconectare","button_ok":"OK","button_reset":"Resetează","button_send_request":"Trimite cerere","button_sign_in":"Conectează-te","button_sign_up":"Creează cont","button_subscribe":"Subscribe","button_update":"Actualizează","cannot_initiate_file_upload":"Nu se poate face încărcarea.","channel":"canal","channel_prompt":"Acesta este un canal","chat_invitation":"Ai primit invitație într-o conversație. Accepți?","chat_invitation_accept":"Da, accept","chat_invitation_block":"Blochează","chat_invitation_ignore":"Ignoră","clear_messages_warning":"Ești sigur că dorești să ștergi mesajele? Acestea nu pot fi recuperate.","code_doesnot_match":"Codul furnizat nu este valid","contacts_not_found":"Nu ai contacte salvate ¯∖_(ツ)_/¯","contacts_not_found_short":"Niciun contact găsit după criteriile \'\'{query}\'\'","credential_email_prompt":"Adresa de e-mail","delete_account":"Șterge contul","delete_account_warning":"Ești sigur că dorești să ștergi contul? Acesta nu va putea fi recuperat.","delete_messages_warning":"Ești sigur că dorești să șterge mesajele din toate conversațiile? Acestea nu pot fi recuperate.","download_action":"download","drafty_attachment":"Atasament","drafty_form":"Formă:","drafty_image":"Imagine","email_dative":"email","email_prompt":"Adresa de e-mail","enable_peers_messaging":"Activează","enter_confirmation_code_prompt":"Introu codul de confirmare trimis pe {method}:","error_invalid_id":"ID Invalid","file_attachment_too_large":"Dimensiunea fișiterului {size} depășește limita de {limit}.","forgot_password_link":"Ți-ai uitat parola?","full_name_prompt":"Numele tău","granted_permissions":"Oferite","group_has_no_members":"În acest grup nu se află persoane","group_user_id_prompt":"Grup sau user ID","image_caption_prompt":"Titlul imaginii","invalid_content":"conținut invalid","invalid_security_token":"Codul de securitate este invalid","label_client":"Client:","label_content_type":"Tip conținut:","label_default_access_mode":"Default access mode:","label_file_name":"Nume fișier:","label_group_members":"Membrii grupului:","label_incognito_mode":"Mod incognito:","label_message_sound":"Sunet de mesaj:","label_muting_topic":"Mod silențios (muted):","label_other_user":"Altele","label_password":"Parola","label_permissions":"Permisiuni:","label_private":"Comentariu privat","label_push_notifications":"Alerte de notificare:","label_push_notifications_disabled":"Alerte de notificare (necesită HTTPS):","label_reset_password":"Resetează parola:","label_sdk":"SDK:","label_server":"Server:","label_server_address":"Adresa serverului:","label_server_to_use":"Server de utilizat:","label_size":"Size:","label_topic_name":"Nume","label_user_contacts":"Contacte","label_user_id":"ID:","label_wire_transport":"Transportul legat:","label_you":"Tu:","label_your_name":"Numele tău","label_your_permissions":"Permisiuniile tale:","last_seen_timestamp":"Văzut ultima dată","leave_chat_warning":"Ești sigur că dorești să ieși din conersație?","link_contact_us":"Contactează-ne","link_privacy_policy":"Politica de Confidențialitate","link_terms_of_service":"Termenii Serviciului","login_prompt":"Conectează-te","menu_item_archive_topic":"Arhivează","menu_item_block":"Blochează","menu_item_clear_messages":"Șterge mesajele","menu_item_clear_messages_for_all":"Ștergele pe toate","menu_item_delete":"Șterge","menu_item_delete_for_all":"Ștergele pe toate","menu_item_delete_topic":"Șterge","menu_item_edit_permissions":"Editează permisiuni","menu_item_info":"Info","menu_item_member_delete":"Șterge persoană","menu_item_mute":"Mute","menu_item_restore_topic":"Restabili","menu_item_send_retry":"Reîncearcă","menu_item_unblock":"Deblochează","menu_item_unmute":"Unmute","message_sending":"se trimite...","message_sending_failed":"eroare","messages_not_readable":"Mesajele nu pot fi citite","messaging_disabled_prompt":"Mesageria este dezactivată","more_online_members":"+{overflow} mai mult","new_message_prompt":"Mesaj nou","new_password_placeholder":"Introdu parolă","no_connection":"Nu există conexiune","no_contacts":"Nu ai contacte adăugate :-(","numeric_confirmation_code_prompt":"Doar cifre","online_now":"online acum","password_prompt":"Parola","password_unchanged_prompt":"Neschimbată","peers_messaging_disabled":"Mesageria de tip Peer este dezactivată.","permission_admin":"Aprobare ({val})","permission_delete":"Ștergere ({val})","permission_join":"Participare ({val})","permission_owner":"Deținător ({val})","permission_pres":"Notificare ({val})","permission_read":"Citire ({val})","permission_share":"Distribuire ({val})","permission_write":"Scriere ({val})","phone_dative":"telefon","private_editing_placeholder":"Vizibil doar ție","push_init_failed":"Nu s-a reușit inițializarea tip push notifications","reconnect_countdown":"Deconectat. Se încearcă conectarea în {seconds}…","reconnect_now":"Încearcă din nou","reload_update":"Reîncarcă","report_chat_warning":"Ești sigur că dorești să blochezi și să raportezi această conversație?","requested_permissions":"Necesare","save_attachment":"salvează","search_for_contacts":"Caută în contacte","search_no_results":"Nu s-au găsit rezultate","search_placeholder":"Caută după e-mail sau număr telefon...","sidepanel_title_acc_notifications":"Notificări","sidepanel_title_acc_support":"Ajutor","sidepanel_title_account_settings":"Setările Contului","sidepanel_title_archive":"Conversații Arhivate","sidepanel_title_blocked":"Conversații Blocate","sidepanel_title_cred":"Confirmă credențiale","sidepanel_title_login":"Conectează-te","sidepanel_title_newtpk":"Creeză un nou Chat","sidepanel_title_register":"Creează Cont","sidepanel_title_reset":"Resetează Parola","sidepanel_title_settings":"Setări","stay_logged_in":"Rămâi conectat","tabtitle_find_user":"caută","tabtitle_group_by_id":"după id","tabtitle_new_group":"grup nou","tags_editor_no_tags":"Adaugă tag-uri","tags_not_found":"Niciun tag definit. Adaugă.","title_all_contacts":"Toate Contactele","title_group_members":"Persoanele din grup","title_manage_tags":"Administrează","title_not_found":"Nu a fost găsit","title_permissions":"Permisiuni","title_tag_manager":"Tag-uri (user discovery)","topic_block_warning":"Ești sigur că dorești să blochezi această conversație?","topic_delete_warning":"Ești sigur că dorești să șterge această conversație?","topic_name_editing_placeholder":"Numele grupului","unnamed_topic":"Nedenumit","update_available":"Actualizare disponibilă.","upload_finishing":"se încarcă...","user_not_found":"Utilizatorul nu a fost găsit","description_editing_placeholder":"Descriere (opțional)","label_description":"Descriere","button_security":"Securitate","panel_title_crop":"Trageți pentru a ajusta","panel_title_general":"Generale","panel_title_members":"Membri","panel_title_security":"Securitate","panel_title_info":"Info","permissions_anonymous":"Anonim","permissions_authenticated":"Autentificat","topic_delete":"Ștergeți Chat","permissions_user":"Permisiunile utilizatorului","password_reset_email_sent":"Un e-mail a fost trimis către {email}. Urmați instrucțiunile din e-mail pentru a vă reseta parola.","label_unarchive_topic":"Arhivat:","menu_item_reply":"A raspunde","menu_item_forward":"Redirecţiona","forward_to":"Redirecționați către","forward_to_search_placeholder":"Căutați contacte","label_new_password":"Parolă Nouă","drafty_unknown":"Neacceptat","calls_incoming":"Apel primit","calls_outgoing":"Apel efectuat","calls_you_label":"Tu","menu_item_video_call":"Apel video","already_in_call":"Deja vorbesti!","call_cancelled":"anulat","call_missed":"pierdut","call_declined":"refuzat","call_disconnected":"deconectat","label_use_secure_connection":"Utilizați conexiune securizată","cred_confirmed_successfully":"Confirmat cu succes","menu_item_edit":"Editează","editing_message":"Editare","message_edited_marker":", editat","icon_title_add_image":"Adauga imagine","icon_title_attach_file":"Ataseaza fisier","icon_title_delete":"Ștergeți înregistrarea","icon_title_pause":"Întrerupeți redarea","icon_title_play":"Redați înregistrarea","icon_title_record_voice":"Înregistrați mesajul vocal","icon_title_resume":"Reluați redarea","icon_title_send":"Trimite mesaj","drag_file":"Trageți fișierul aici","drafty_video":"Înregistrare video","call_in_progress":"în curs","menu_item_audio_call":"Apel","unrecognized_video_format":"Formatul acestui videoclip nu este recunoscut","loading_note":"Se încarcă...","password_i_have_code":"Am cod","label_reset_password_tel":"Trimite SMS pentru a reseta parola","mobile_phone_number":"Număr de telefon mobil","password_reset_sms_sent":"Un mesaj text cu cod de securitate a fost trimis la {phone}. Introduceți codul de mai jos.","mobile_number_required":"Este necesar un număr de telefon mobil"}');
/***/ })
diff --git a/umd/src_i18n_min_ru_json.dev.js b/umd/src_i18n_min_ru_json.dev.js
index 2455d334..9019f5ca 100644
--- a/umd/src_i18n_min_ru_json.dev.js
+++ b/umd/src_i18n_min_ru_json.dev.js
@@ -7,7 +7,7 @@
\******************************/
/***/ ((module) => {
-module.exports = JSON.parse('{"action_block_contact":"Заблокировать контакт","action_cancel":"отменить","action_clear_messages":"Удалить сообщения","action_delete_messages":"Удалить сообщения","action_leave_chat":"Уйти из чата","action_report_chat":"Сообщить о нарушении","archived_contacts":"Чаты в архиве ({count})","badge_danger":"Подозрительный","badge_owner":"влад.","badge_staff":"Администрация","badge_verified":"Верифицированный","badge_you":"вы","block_contact_warning":"Вы действительно заблокировать этот контакт?","blocked_contacts_link":"Заблокированные ({count})","button_add_another":"Добавить","button_add_members":"Добавить","button_cancel":"Отменить","button_confirm":"Подтвердить","button_create":"Создать","button_delete_account":"Удалить аккаунт","button_edit":"Изменить","button_logout":"Выйти","button_ok":"OK","button_reset":"Изменить","button_send_request":"Отправить","button_sign_in":"Войти","button_sign_up":"Создать аккаунт","button_subscribe":"Подписаться","button_update":"Применить","cannot_initiate_file_upload":"Ошибка загрузки файла.","channel":"канал","channel_prompt":"Создать канал","chat_invitation":"Вас пригласили начать новый чат. Как вы хотите поступить?","chat_invitation_accept":"Принять","chat_invitation_block":"Заблокировать","chat_invitation_ignore":"Игнорировать","clear_messages_warning":"Вы действительно хотите удалить все сообщения в чате? Их будет невозможно восстановить.","code_doesnot_match":"Код не совпадает","contacts_not_found":"Чатов нет ¯∖_(ツ)_/¯","contacts_not_found_short":"Нет контактов для запроса \'\'{query}\'\'","credential_email_prompt":"Регистрационный емейл","delete_account":"Удалить аккаунт","delete_account_warning":"Вы уверены, что ходите удалить свой аккаунт? Его невозможно будет восстановить.","delete_messages_warning":"Вы действительно хотите удалить все сообщения?","download_action":"скачать","drafty_attachment":"Аттачмент","drafty_form":"Форма:","drafty_image":"Картинка","email_dative":"емейлу","email_prompt":"Email, напр. ivan@example.com","enable_peers_messaging":"Разблокировать.","enter_confirmation_code_prompt":"Код подтверждения, полученный по {method}:","error_invalid_id":"Неверный ID","file_attachment_too_large":"Размер файла {size} превышает {limit} лимит.","forgot_password_link":"Напомнить пароль","full_name_prompt":"Полное имя, напр. Иван Петров","granted_permissions":"Получены","group_has_no_members":"Нет участников","group_user_id_prompt":"ID чата или пользователя","image_caption_prompt":"Подпись к фото","invalid_content":"сообщение не читается","invalid_security_token":"Токен некорректен","label_client":"Клиент:","label_content_type":"Тип:","label_default_access_mode":"Доступ по умолчанию:","label_file_name":"Имя файла:","label_group_members":"Участники чата:","label_incognito_mode":"Режим инкогнито:","label_message_sound":"Звук нового сообщения:","label_muting_topic":"Без уведомлений","label_other_user":"Второй","label_password":"Пароль","label_permissions":"Права доступа:","label_private":"Комментарий","label_push_notifications":"Уведомления:","label_push_notifications_disabled":"Уведомления (требуют HTTPS):","label_reset_password":"Отправить емейл для смены пароля:","label_sdk":"SDK:","label_server":"Сервер:","label_server_address":"Адрес сервера:","label_server_to_use":"Использовать сервер:","label_size":"Размер:","label_topic_name":"Название","label_user_contacts":"Конакты:","label_user_id":"ID:","label_wire_transport":"Соединение:","label_you":"Вы:","label_your_name":"Ваше имя","label_your_permissions":"Ваши права доступа:","last_seen_timestamp":"Был активен","leave_chat_warning":"Вы действительно хотите покинуть этот чат?","link_contact_us":"Связаться с нами","link_privacy_policy":"Политика конфиденциальности","link_terms_of_service":"Условия сервиса","login_prompt":"Логин","menu_item_archive_topic":"В архив","menu_item_block":"Заблокировать","menu_item_clear_messages":"Удалить сообщения","menu_item_clear_messages_for_all":"Удалить для всех","menu_item_delete":"Удалить","menu_item_delete_for_all":"Удалить для всех","menu_item_delete_topic":"Удалить чат","menu_item_edit_permissions":"Права доступа","menu_item_info":"Информация","menu_item_member_delete":"Отписать","menu_item_mute":"Не уведомлять","menu_item_restore_topic":"Разархивировать","menu_item_send_retry":"Отправить заново","menu_item_unblock":"Разблокировать","menu_item_unmute":"Уведомлять","message_sending":"в пути...","message_sending_failed":"ошибка","messages_not_readable":"нет доступа к сообщениям","messaging_disabled_prompt":"Отправка недоступна","more_online_members":"+еще {overflow}","new_message_prompt":"Новое сообщение","new_password_placeholder":"Введите новый пароль","no_connection":"Нет связи","no_contacts":"Ничего нет :-(","numeric_confirmation_code_prompt":"Только цифры","online_now":"онлайн","password_prompt":"Пароль","password_unchanged_prompt":"Не изменен","peers_messaging_disabled":"Чат заблокирован у корреспондента.","permission_admin":"Подтверждать ({val})","permission_delete":"Удалять ({val})","permission_join":"Подписываться ({val})","permission_owner":"Владелец ({val})","permission_pres":"Уведомлять ({val})","permission_read":"Читать ({val})","permission_share":"Приглашать ({val})","permission_write":"Писать ({val})","phone_dative":"телефону","private_editing_placeholder":"Виден только вам","push_init_failed":"Ошибка инициализации пуш уведомлений","reconnect_countdown":"Нет связи. Подключение через {seconds}…","reconnect_now":"Подключить сейчас.","reload_update":"Обновить","report_chat_warning":"Вы действительно хотите сообщить о нарушении и заблокировать этот чат?","requested_permissions":"Требуются","save_attachment":"сохранить","search_for_contacts":"Поиск контактов","search_no_results":"Ничего не найдено","search_placeholder":"Список, напр. email:alice@example.com, tel:+17025550003...","sidepanel_title_acc_notifications":"Уведомления","sidepanel_title_acc_support":"Поддержка","sidepanel_title_account_settings":"Настройки аккаунта","sidepanel_title_archive":"Архив чатов","sidepanel_title_blocked":"Заблокированные чаты","sidepanel_title_cred":"Подтвердить","sidepanel_title_login":"Авторизация","sidepanel_title_newtpk":"Новый чат","sidepanel_title_register":"Зарегистрироваться","sidepanel_title_reset":"Сменить пароль","sidepanel_title_settings":"Настройки","stay_logged_in":"Запомнить","tabtitle_find_user":"найти","tabtitle_group_by_id":"по id","tabtitle_new_group":"создать","tags_editor_no_tags":"Добавьте теги","tags_not_found":"Тегов нет. Добавьте.","title_all_contacts":"Все контакты","title_group_members":"Участники","title_manage_tags":"Редактировать","title_not_found":"Не найден","title_permissions":"Права доступа","title_tag_manager":"Теги для поиска","topic_block_warning":"Вы действительно хотите заблокировать этот чат?","topic_delete_warning":"Вы действительно хотите удалить этот чат?","topic_name_editing_placeholder":"Название чата","unnamed_topic":"Без названия","update_available":"Есть новая версия приложения.","upload_finishing":"завершение...","user_not_found":"Не найден","validate_credential_action":"подтвердить","description_editing_placeholder":"Описание (не обязательно)","label_description":"Описание","button_security":"Безопасность","panel_title_crop":"Обрезать картинку","panel_title_general":"Общие настройки","panel_title_members":"Участники","panel_title_security":"Безопасность","panel_title_info":"Подробности","permissions_anonymous":"Анонимный","permissions_authenticated":"Авторизованный","topic_delete":"Удалить чат","permissions_user":"Права доступа","password_reset_email_sent":"Сообщение было отправлено на адрес {email}. Следуйте инструкциям в сообщении, чтобы изменить пароль.","label_unarchive_topic":"Архивирован:","menu_item_reply":"Ответить","menu_item_forward":"Переслать","forward_to":"Переслать","forward_to_search_placeholder":"Поиск контактов","label_new_password":"Новый пароль","drafty_unknown":"Не поддерживается","calls_incoming":"Входящий звонок","calls_outgoing":"Исходящий звонок","calls_you_label":"Вы","menu_item_video_call":"Видеозвонок","already_in_call":"Вы уже звоните кому-то!","call_cancelled":"отменен","call_missed":"пропущен","call_declined":"отклонен","call_disconnected":"разъединен","label_use_secure_connection":"Безопасное соединение","phone_or_email_prompt":"Телефон или емейл","cred_confirmed_successfully":"Подтверждено успешно","menu_item_edit":"Изменить","editing_message":"Редактирование","message_edited_marker":", изменено","icon_title_add_image":"Добавить изображение","icon_title_attach_file":"Прикрепить файл","icon_title_delete":"Удалить запись","icon_title_pause":"Пауза воспроизведения","icon_title_play":"Воспроизвести запись","icon_title_record_voice":"Записать голосовое сообщение","icon_title_resume":"Продолжить","icon_title_send":"Отправить сообщение","drag_file":"Перетащите файл сюда","drafty_video":"Видеозапись","call_in_progress":"в процессе","menu_item_audio_call":"Позвонить","unrecognized_video_format":"Неизвестный формат видео файла","loading_note":"Загружается...","password_i_have_code":"У меня есть код","label_reset_password_tel":"Отправить SMS для сброса пароля","mobile_phone_number":"Номер мобильного телефона","password_reset_sms_sent":"SMS с защитным кодом отправлено на {phone}. Введите код ниже.","mobile_number_required":"Номер мобильного телефона"}');
+module.exports = JSON.parse('{"action_block_contact":"Заблокировать контакт","action_cancel":"отменить","action_clear_messages":"Удалить сообщения","action_delete_messages":"Удалить сообщения","action_leave_chat":"Уйти из чата","action_report_chat":"Сообщить о нарушении","archived_contacts":"Чаты в архиве ({count})","badge_danger":"Подозрительный","badge_owner":"влад.","badge_staff":"Администрация","badge_verified":"Верифицированный","badge_you":"вы","block_contact_warning":"Вы действительно заблокировать этот контакт?","blocked_contacts_link":"Заблокированные ({count})","button_add_members":"Добавить","button_cancel":"Отменить","button_confirm":"Подтвердить","button_create":"Создать","button_delete_account":"Удалить аккаунт","button_edit":"Изменить","button_logout":"Выйти","button_ok":"OK","button_reset":"Изменить","button_send_request":"Отправить","button_sign_in":"Войти","button_sign_up":"Создать аккаунт","button_subscribe":"Подписаться","button_update":"Применить","cannot_initiate_file_upload":"Ошибка загрузки файла.","channel":"канал","channel_prompt":"Создать канал","chat_invitation":"Вас пригласили начать новый чат. Как вы хотите поступить?","chat_invitation_accept":"Принять","chat_invitation_block":"Заблокировать","chat_invitation_ignore":"Игнорировать","clear_messages_warning":"Вы действительно хотите удалить все сообщения в чате? Их будет невозможно восстановить.","code_doesnot_match":"Код не совпадает","contacts_not_found":"Чатов нет ¯∖_(ツ)_/¯","contacts_not_found_short":"Нет контактов для запроса \'\'{query}\'\'","credential_email_prompt":"Регистрационный емейл","delete_account":"Удалить аккаунт","delete_account_warning":"Вы уверены, что ходите удалить свой аккаунт? Его невозможно будет восстановить.","delete_messages_warning":"Вы действительно хотите удалить все сообщения?","download_action":"скачать","drafty_attachment":"Аттачмент","drafty_form":"Форма:","drafty_image":"Картинка","email_dative":"емейлу","email_prompt":"Email, напр. ivan@example.com","enable_peers_messaging":"Разблокировать.","enter_confirmation_code_prompt":"Код подтверждения, полученный по {method}:","error_invalid_id":"Неверный ID","file_attachment_too_large":"Размер файла {size} превышает {limit} лимит.","forgot_password_link":"Напомнить пароль","full_name_prompt":"Полное имя, напр. Иван Петров","granted_permissions":"Получены","group_has_no_members":"Нет участников","group_user_id_prompt":"ID чата или пользователя","image_caption_prompt":"Подпись к фото","invalid_content":"сообщение не читается","invalid_security_token":"Токен некорректен","label_client":"Клиент:","label_content_type":"Тип:","label_default_access_mode":"Доступ по умолчанию:","label_file_name":"Имя файла:","label_group_members":"Участники чата:","label_incognito_mode":"Режим инкогнито:","label_message_sound":"Звук нового сообщения:","label_muting_topic":"Без уведомлений","label_other_user":"Второй","label_password":"Пароль","label_permissions":"Права доступа:","label_private":"Комментарий","label_push_notifications":"Уведомления:","label_push_notifications_disabled":"Уведомления (требуют HTTPS):","label_reset_password":"Отправить емейл для смены пароля:","label_sdk":"SDK:","label_server":"Сервер:","label_server_address":"Адрес сервера:","label_server_to_use":"Использовать сервер:","label_size":"Размер:","label_topic_name":"Название","label_user_contacts":"Конакты","label_user_id":"ID:","label_wire_transport":"Соединение:","label_you":"Вы:","label_your_name":"Ваше имя","label_your_permissions":"Ваши права доступа:","last_seen_timestamp":"Был активен","leave_chat_warning":"Вы действительно хотите покинуть этот чат?","link_contact_us":"Связаться с нами","link_privacy_policy":"Политика конфиденциальности","link_terms_of_service":"Условия сервиса","login_prompt":"Логин","menu_item_archive_topic":"В архив","menu_item_block":"Заблокировать","menu_item_clear_messages":"Удалить сообщения","menu_item_clear_messages_for_all":"Удалить для всех","menu_item_delete":"Удалить","menu_item_delete_for_all":"Удалить для всех","menu_item_delete_topic":"Удалить чат","menu_item_edit_permissions":"Права доступа","menu_item_info":"Информация","menu_item_member_delete":"Отписать","menu_item_mute":"Не уведомлять","menu_item_restore_topic":"Разархивировать","menu_item_send_retry":"Отправить заново","menu_item_unblock":"Разблокировать","menu_item_unmute":"Уведомлять","message_sending":"в пути...","message_sending_failed":"ошибка","messages_not_readable":"нет доступа к сообщениям","messaging_disabled_prompt":"Отправка недоступна","more_online_members":"+еще {overflow}","new_message_prompt":"Новое сообщение","new_password_placeholder":"Введите новый пароль","no_connection":"Нет связи","no_contacts":"Ничего нет :-(","numeric_confirmation_code_prompt":"Только цифры","online_now":"онлайн","password_prompt":"Пароль","password_unchanged_prompt":"Не изменен","peers_messaging_disabled":"Чат заблокирован у корреспондента.","permission_admin":"Подтверждать ({val})","permission_delete":"Удалять ({val})","permission_join":"Подписываться ({val})","permission_owner":"Владелец ({val})","permission_pres":"Уведомлять ({val})","permission_read":"Читать ({val})","permission_share":"Приглашать ({val})","permission_write":"Писать ({val})","phone_dative":"телефону","private_editing_placeholder":"Виден только вам","push_init_failed":"Ошибка инициализации пуш уведомлений","reconnect_countdown":"Нет связи. Подключение через {seconds}…","reconnect_now":"Подключить сейчас.","reload_update":"Обновить","report_chat_warning":"Вы действительно хотите сообщить о нарушении и заблокировать этот чат?","requested_permissions":"Требуются","save_attachment":"сохранить","search_for_contacts":"Поиск контактов","search_no_results":"Ничего не найдено","search_placeholder":"Список, напр. email:alice@example.com, tel:+17025550003...","sidepanel_title_acc_notifications":"Уведомления","sidepanel_title_acc_support":"Поддержка","sidepanel_title_account_settings":"Настройки аккаунта","sidepanel_title_archive":"Архив чатов","sidepanel_title_blocked":"Заблокированные чаты","sidepanel_title_cred":"Подтвердить","sidepanel_title_login":"Авторизация","sidepanel_title_newtpk":"Новый чат","sidepanel_title_register":"Зарегистрироваться","sidepanel_title_reset":"Сменить пароль","sidepanel_title_settings":"Настройки","stay_logged_in":"Запомнить","tabtitle_find_user":"найти","tabtitle_group_by_id":"по id","tabtitle_new_group":"создать","tags_editor_no_tags":"Добавьте теги","tags_not_found":"Тегов нет. Добавьте.","title_all_contacts":"Все контакты","title_group_members":"Участники","title_manage_tags":"Редактировать","title_not_found":"Не найден","title_permissions":"Права доступа","title_tag_manager":"Теги для поиска","topic_block_warning":"Вы действительно хотите заблокировать этот чат?","topic_delete_warning":"Вы действительно хотите удалить этот чат?","topic_name_editing_placeholder":"Название чата","unnamed_topic":"Без названия","update_available":"Есть новая версия приложения.","upload_finishing":"завершение...","user_not_found":"Не найден","description_editing_placeholder":"Описание (не обязательно)","label_description":"Описание","button_security":"Безопасность","panel_title_crop":"Обрезать картинку","panel_title_general":"Общие настройки","panel_title_members":"Участники","panel_title_security":"Безопасность","panel_title_info":"Подробности","permissions_anonymous":"Анонимный","permissions_authenticated":"Авторизованный","topic_delete":"Удалить чат","permissions_user":"Права доступа","password_reset_email_sent":"Сообщение было отправлено на адрес {email}. Следуйте инструкциям в сообщении, чтобы изменить пароль.","label_unarchive_topic":"Архивирован:","menu_item_reply":"Ответить","menu_item_forward":"Переслать","forward_to":"Переслать","forward_to_search_placeholder":"Поиск контактов","label_new_password":"Новый пароль","drafty_unknown":"Не поддерживается","calls_incoming":"Входящий звонок","calls_outgoing":"Исходящий звонок","calls_you_label":"Вы","menu_item_video_call":"Видеозвонок","already_in_call":"Вы уже звоните кому-то!","call_cancelled":"отменен","call_missed":"пропущен","call_declined":"отклонен","call_disconnected":"разъединен","label_use_secure_connection":"Безопасное соединение","cred_confirmed_successfully":"Подтверждено успешно","menu_item_edit":"Изменить","editing_message":"Редактирование","message_edited_marker":", изменено","icon_title_add_image":"Добавить изображение","icon_title_attach_file":"Прикрепить файл","icon_title_delete":"Удалить запись","icon_title_pause":"Пауза воспроизведения","icon_title_play":"Воспроизвести запись","icon_title_record_voice":"Записать голосовое сообщение","icon_title_resume":"Продолжить","icon_title_send":"Отправить сообщение","drag_file":"Перетащите файл сюда","drafty_video":"Видеозапись","call_in_progress":"в процессе","menu_item_audio_call":"Позвонить","unrecognized_video_format":"Неизвестный формат видео файла","loading_note":"Загружается...","password_i_have_code":"У меня есть код","label_reset_password_tel":"Отправить SMS для сброса пароля","mobile_phone_number":"Номер мобильного телефона","password_reset_sms_sent":"SMS с защитным кодом отправлено на {phone}. Введите код ниже.","mobile_number_required":"Номер мобильного телефона"}');
/***/ })
diff --git a/umd/src_i18n_min_zh-TW_json.dev.js b/umd/src_i18n_min_zh-TW_json.dev.js
index b5b38301..88d11ed5 100644
--- a/umd/src_i18n_min_zh-TW_json.dev.js
+++ b/umd/src_i18n_min_zh-TW_json.dev.js
@@ -7,7 +7,7 @@
\*********************************/
/***/ ((module) => {
-module.exports = JSON.parse('{"action_block_contact":"封鎖聯絡人","action_cancel":"取消","action_clear_messages":"清除訊息","action_delete_messages":"為所有人清除訊息","action_leave_chat":"離開對話","action_report_chat":"檢舉對話","archived_contacts":"已封存的聯絡人 ({count})","badge_danger":"不可信","badge_owner":"擁有者","badge_staff":"員工管理","badge_verified":"已驗證/官方","badge_you":"您","block_contact_warning":"您確定要封鎖此聯絡人嗎?","blocked_contacts_link":"已封鎖的聯絡人 ({count})","button_add_another":"新增其他人","button_add_members":"新增成員","button_cancel":"取消","button_confirm":"確認","button_create":"建立","button_delete_account":"刪除帳號","button_edit":"編輯","button_logout":"登出","button_ok":"OK","button_reset":"重設","button_send_request":"傳送要求","button_sign_in":"登入","button_sign_up":"註冊","button_subscribe":"訂閱","button_update":"更新","cannot_initiate_file_upload":"無法為檔案上傳初始化。","channel":"頻道","channel_prompt":"這是頻道","chat_invitation":"您已被邀請開始新對話。您接下來要做什麼呢?","chat_invitation_accept":"接受","chat_invitation_block":"封鎖","chat_invitation_ignore":"忽略","clear_messages_warning":"您確定要清除所有訊息嗎?此操作無法復原。","code_doesnot_match":"代碼不相符","contacts_not_found":"您沒有任何對話 ¯∖_(ツ)_/¯","contacts_not_found_short":"沒有符合 \'\'{query}\'\' 的聯絡人","credential_email_prompt":"您的註冊電子郵件地址","delete_account":"刪除帳號","delete_account_warning":"您確定要刪除您的帳戶嗎?此操作無法撤消。","delete_messages_warning":"您確定要為所有人刪除所有訊息嗎?此操作無法復原。","download_action":"下載","drafty_attachment":"附加檔案","drafty_form":"表單:","drafty_image":"圖片","email_dative":"電子郵件地址","email_prompt":"電子郵件地址,例如:jdoe@example.com","enable_peers_messaging":"啟用","enter_confirmation_code_prompt":"輸入透過 {method} 傳送給您的確認碼:","error_invalid_id":"ID 無效","file_attachment_too_large":"檔案大小 {size} 超出 {limit} 限制。","forgot_password_link":"忘記密碼?","full_name_prompt":"全名,例如:王小明","granted_permissions":"已授權","group_has_no_members":"無成員","group_user_id_prompt":"群組或使用者 ID","image_caption_prompt":"圖片說明","invalid_content":"內容無效","invalid_security_token":"安全權杖無效","label_client":"客戶端:","label_content_type":"類型:","label_default_access_mode":"預設存取模式:","label_file_name":"檔名:","label_group_members":"群組成員:","label_incognito_mode":"無痕模式:","label_message_sound":"訊息提示聲:","label_muting_topic":"靜音:","label_other_user":"其他","label_password":"密碼","label_permissions":"權限:","label_private":"私人留言","label_push_notifications":"通知:","label_push_notifications_disabled":"通知 (需要 HTTPS):","label_reset_password":"傳送重設密碼郵件:","label_sdk":"SDK:","label_server":"伺服器:","label_server_address":"伺服器位址:","label_server_to_use":"使用的伺服器:","label_size":"大小:","label_topic_name":"名稱","label_user_contacts":"聯絡人:","label_user_id":"ID:","label_wire_transport":"Wire transport:","label_you":"您:","label_your_name":"您的名字","label_your_permissions":"您的權限:","last_seen_timestamp":"最後上線","leave_chat_warning":"您確定要離開此對話嗎?","link_contact_us":"聯絡我們","link_privacy_policy":"隱私權政策","link_terms_of_service":"服務條款","login_prompt":"登入","menu_item_archive_topic":"封存","menu_item_block":"封鎖","menu_item_clear_messages":"清除訊息","menu_item_clear_messages_for_all":"為所有人清除訊息","menu_item_delete":"刪除","menu_item_delete_for_all":"為所有人刪除","menu_item_delete_topic":"刪除","menu_item_edit_permissions":"編輯權限","menu_item_info":"Info","menu_item_member_delete":"移除","menu_item_mute":"靜音","menu_item_restore_topic":"恢復","menu_item_send_retry":"重試","menu_item_unblock":"解除封鎖","menu_item_unmute":"解除靜音","message_sending":"正在傳送...","message_sending_failed":"失敗","messages_not_readable":"沒有存取訊息的權限","messaging_disabled_prompt":"停用訊息","more_online_members":"+{overflow}","new_message_prompt":"新訊息","new_password_placeholder":"輸入新的密碼","no_connection":"無連線","no_contacts":"您沒有任何聯絡人 :-(","numeric_confirmation_code_prompt":"僅數字","online_now":"上線中","password_prompt":"密碼","password_unchanged_prompt":"未修改","peers_messaging_disabled":"Peer 已停用訊息。","permission_admin":"核可 ({val})","permission_delete":"刪除 ({val})","permission_join":"加入 ({val})","permission_owner":"擁有者 ({val})","permission_pres":"收到通知 ({val})","permission_read":"讀取 ({val})","permission_share":"分享 ({val})","permission_write":"撰寫 ({val})","phone_dative":"phone","private_editing_placeholder":"僅您可見","push_init_failed":"初始化通知失敗。","reconnect_countdown":"已斷線。將在 {seconds} 秒後重新連線…","reconnect_now":"現在重試","reload_update":"重新載入","report_chat_warning":"您確定要封鎖並檢舉此對話嗎?","requested_permissions":"重新請求","save_attachment":"儲存","search_for_contacts":"使用搜尋來尋找聯絡人","search_no_results":"搜尋無結果","search_placeholder":"例如 email:alice@example.com, tel:17025550003... 的清單","sidepanel_title_acc_notifications":"通知","sidepanel_title_acc_support":"支援","sidepanel_title_account_settings":"帳號設定","sidepanel_title_archive":"已封存的對話","sidepanel_title_blocked":"已封鎖的對話","sidepanel_title_cred":"確認認證","sidepanel_title_login":"登入","sidepanel_title_newtpk":"開始新對話","sidepanel_title_register":"建立帳號","sidepanel_title_reset":"重設密碼","sidepanel_title_settings":"設定","stay_logged_in":"保持登入","tabtitle_find_user":"尋找","tabtitle_group_by_id":"以 id","tabtitle_new_group":"新群組","tags_editor_no_tags":"新增一些標籤","tags_not_found":"未定義任何標籤。請新增一些標籤。","title_all_contacts":"所有聯絡人","title_group_members":"群組成員","title_manage_tags":"管理","title_not_found":"找不到","title_permissions":"權限","title_tag_manager":"標籤 (使用者探索)","topic_block_warning":"您確定要封鎖此對話嗎?","topic_delete_warning":"您確定要刪除此對話嗎?","topic_name_editing_placeholder":"群組的任意名稱","unnamed_topic":"未命名","update_available":"有可用的更新。","upload_finishing":"正在完成...","user_not_found":"找不到","validate_credential_action":"確認","description_editing_placeholder":"說明(可選)","label_description":"說明","button_security":"安全性","panel_title_crop":"拖動調整","panel_title_general":"一般","panel_title_members":"成員","panel_title_security":"安全性","panel_title_info":"資訊","permissions_anonymous":"匿名","permissions_authenticated":"已認證","topic_delete":"刪除聊天","permissions_user":"用戶權限","password_reset_email_sent":"一封電子郵件已發送至 {email}。按照電子郵件中的說明重置密碼。","label_unarchive_topic":"存檔聊天:","menu_item_reply":"回答","menu_item_forward":"重定向","forward_to":"重定向消息","forward_to_search_placeholder":"搜索聯繫人","label_new_password":"新密碼","drafty_unknown":"不支持","calls_incoming":"來電","calls_outgoing":"撥出電話","calls_you_label":"你","menu_item_video_call":"視頻電話","already_in_call":"你已經在說話了!","call_cancelled":"取消","call_missed":"未接","call_declined":"被拒","call_disconnected":"斷開連接","label_use_secure_connection":"使用安全連接","phone_or_email_prompt":"電話號碼或電子郵件","cred_confirmed_successfully":"確認成功","menu_item_edit":"編輯","editing_message":"編輯","message_edited_marker":",編輯","icon_title_add_image":"添加圖片","icon_title_attach_file":"附加文件","icon_title_delete":"刪除錄音","icon_title_pause":"暫停播放","icon_title_play":"播放錄音","icon_title_record_voice":"錄製語音消息","icon_title_resume":"恢復播放","icon_title_send":"發信息","drag_file":"將文件拖到這裡","drafty_video":"視頻錄製","call_in_progress":"通話中","menu_item_audio_call":"稱呼","unrecognized_video_format":"無法識別此視頻的格式","loading_note":"加載中...","password_i_have_code":"我有代碼","label_reset_password_tel":"發送短信重置密碼","mobile_phone_number":"手機號碼","password_reset_sms_sent":"帶有安全碼的短信已發送至{phone}。請在下方輸入密碼。","mobile_number_required":"需要手機號"}');
+module.exports = JSON.parse('{"action_block_contact":"封鎖聯絡人","action_cancel":"取消","action_clear_messages":"清除訊息","action_delete_messages":"為所有人清除訊息","action_leave_chat":"離開對話","action_report_chat":"檢舉對話","archived_contacts":"已封存的聯絡人 ({count})","badge_danger":"不可信","badge_owner":"擁有者","badge_staff":"員工管理","badge_verified":"已驗證/官方","badge_you":"您","block_contact_warning":"您確定要封鎖此聯絡人嗎?","blocked_contacts_link":"已封鎖的聯絡人 ({count})","button_add_members":"新增成員","button_cancel":"取消","button_confirm":"確認","button_create":"建立","button_delete_account":"刪除帳號","button_edit":"編輯","button_logout":"登出","button_ok":"OK","button_reset":"重設","button_send_request":"傳送要求","button_sign_in":"登入","button_sign_up":"註冊","button_subscribe":"訂閱","button_update":"更新","cannot_initiate_file_upload":"無法為檔案上傳初始化。","channel":"頻道","channel_prompt":"這是頻道","chat_invitation":"您已被邀請開始新對話。您接下來要做什麼呢?","chat_invitation_accept":"接受","chat_invitation_block":"封鎖","chat_invitation_ignore":"忽略","clear_messages_warning":"您確定要清除所有訊息嗎?此操作無法復原。","code_doesnot_match":"代碼不相符","contacts_not_found":"您沒有任何對話 ¯∖_(ツ)_/¯","contacts_not_found_short":"沒有符合 \'\'{query}\'\' 的聯絡人","credential_email_prompt":"您的註冊電子郵件地址","delete_account":"刪除帳號","delete_account_warning":"您確定要刪除您的帳戶嗎?此操作無法撤消。","delete_messages_warning":"您確定要為所有人刪除所有訊息嗎?此操作無法復原。","download_action":"下載","drafty_attachment":"附加檔案","drafty_form":"表單:","drafty_image":"圖片","email_dative":"電子郵件地址","email_prompt":"電子郵件地址,例如:jdoe@example.com","enable_peers_messaging":"啟用","enter_confirmation_code_prompt":"輸入透過 {method} 傳送給您的確認碼:","error_invalid_id":"ID 無效","file_attachment_too_large":"檔案大小 {size} 超出 {limit} 限制。","forgot_password_link":"忘記密碼?","full_name_prompt":"全名,例如:王小明","granted_permissions":"已授權","group_has_no_members":"無成員","group_user_id_prompt":"群組或使用者 ID","image_caption_prompt":"圖片說明","invalid_content":"內容無效","invalid_security_token":"安全權杖無效","label_client":"客戶端:","label_content_type":"類型:","label_default_access_mode":"預設存取模式:","label_file_name":"檔名:","label_group_members":"群組成員:","label_incognito_mode":"無痕模式:","label_message_sound":"訊息提示聲:","label_muting_topic":"靜音:","label_other_user":"其他","label_password":"密碼","label_permissions":"權限:","label_private":"私人留言","label_push_notifications":"通知:","label_push_notifications_disabled":"通知 (需要 HTTPS):","label_reset_password":"傳送重設密碼郵件:","label_sdk":"SDK:","label_server":"伺服器:","label_server_address":"伺服器位址:","label_server_to_use":"使用的伺服器:","label_size":"大小:","label_topic_name":"名稱","label_user_contacts":"聯絡人","label_user_id":"ID:","label_you":"您:","label_your_name":"您的名字","label_your_permissions":"您的權限:","last_seen_timestamp":"最後上線","leave_chat_warning":"您確定要離開此對話嗎?","link_contact_us":"聯絡我們","link_privacy_policy":"隱私權政策","link_terms_of_service":"服務條款","login_prompt":"登入","menu_item_archive_topic":"封存","menu_item_block":"封鎖","menu_item_clear_messages":"清除訊息","menu_item_clear_messages_for_all":"為所有人清除訊息","menu_item_delete":"刪除","menu_item_delete_for_all":"為所有人刪除","menu_item_delete_topic":"刪除","menu_item_edit_permissions":"編輯權限","menu_item_info":"Info","menu_item_member_delete":"移除","menu_item_mute":"靜音","menu_item_restore_topic":"恢復","menu_item_send_retry":"重試","menu_item_unblock":"解除封鎖","menu_item_unmute":"解除靜音","message_sending":"正在傳送...","message_sending_failed":"失敗","messages_not_readable":"沒有存取訊息的權限","messaging_disabled_prompt":"停用訊息","more_online_members":"+{overflow}","new_message_prompt":"新訊息","new_password_placeholder":"輸入新的密碼","no_connection":"無連線","no_contacts":"您沒有任何聯絡人 :-(","numeric_confirmation_code_prompt":"僅數字","online_now":"上線中","password_prompt":"密碼","password_unchanged_prompt":"未修改","peers_messaging_disabled":"Peer 已停用訊息。","permission_admin":"核可 ({val})","permission_delete":"刪除 ({val})","permission_join":"加入 ({val})","permission_owner":"擁有者 ({val})","permission_pres":"收到通知 ({val})","permission_read":"讀取 ({val})","permission_share":"分享 ({val})","permission_write":"撰寫 ({val})","phone_dative":"phone","private_editing_placeholder":"僅您可見","push_init_failed":"初始化通知失敗。","reconnect_countdown":"已斷線。將在 {seconds} 秒後重新連線…","reconnect_now":"現在重試","reload_update":"重新載入","report_chat_warning":"您確定要封鎖並檢舉此對話嗎?","requested_permissions":"重新請求","save_attachment":"儲存","search_for_contacts":"使用搜尋來尋找聯絡人","search_no_results":"搜尋無結果","search_placeholder":"例如 email:alice@example.com, tel:17025550003... 的清單","sidepanel_title_acc_notifications":"通知","sidepanel_title_acc_support":"支援","sidepanel_title_account_settings":"帳號設定","sidepanel_title_archive":"已封存的對話","sidepanel_title_blocked":"已封鎖的對話","sidepanel_title_cred":"確認認證","sidepanel_title_login":"登入","sidepanel_title_newtpk":"開始新對話","sidepanel_title_register":"建立帳號","sidepanel_title_reset":"重設密碼","sidepanel_title_settings":"設定","stay_logged_in":"保持登入","tabtitle_find_user":"尋找","tabtitle_group_by_id":"以 id","tabtitle_new_group":"新群組","tags_editor_no_tags":"新增一些標籤","tags_not_found":"未定義任何標籤。請新增一些標籤。","title_all_contacts":"所有聯絡人","title_group_members":"群組成員","title_manage_tags":"管理","title_not_found":"找不到","title_permissions":"權限","title_tag_manager":"標籤 (使用者探索)","topic_block_warning":"您確定要封鎖此對話嗎?","topic_delete_warning":"您確定要刪除此對話嗎?","topic_name_editing_placeholder":"群組的任意名稱","unnamed_topic":"未命名","update_available":"有可用的更新。","upload_finishing":"正在完成...","user_not_found":"找不到","description_editing_placeholder":"說明(可選)","label_description":"說明","button_security":"安全性","panel_title_crop":"拖動調整","panel_title_general":"一般","panel_title_members":"成員","panel_title_security":"安全性","panel_title_info":"資訊","permissions_anonymous":"匿名","permissions_authenticated":"已認證","topic_delete":"刪除聊天","permissions_user":"用戶權限","password_reset_email_sent":"一封電子郵件已發送至 {email}。按照電子郵件中的說明重置密碼。","label_unarchive_topic":"存檔聊天:","menu_item_reply":"回答","menu_item_forward":"重定向","forward_to":"重定向消息","forward_to_search_placeholder":"搜索聯繫人","label_new_password":"新密碼","drafty_unknown":"不支持","calls_incoming":"來電","calls_outgoing":"撥出電話","calls_you_label":"你","menu_item_video_call":"視頻電話","already_in_call":"你已經在說話了!","call_cancelled":"取消","call_missed":"未接","call_declined":"被拒","call_disconnected":"斷開連接","label_use_secure_connection":"使用安全連接","cred_confirmed_successfully":"確認成功","menu_item_edit":"編輯","editing_message":"編輯","message_edited_marker":",編輯","icon_title_add_image":"添加圖片","icon_title_attach_file":"附加文件","icon_title_delete":"刪除錄音","icon_title_pause":"暫停播放","icon_title_play":"播放錄音","icon_title_record_voice":"錄製語音消息","icon_title_resume":"恢復播放","icon_title_send":"發信息","drag_file":"將文件拖到這裡","drafty_video":"視頻錄製","call_in_progress":"通話中","menu_item_audio_call":"稱呼","unrecognized_video_format":"無法識別此視頻的格式","loading_note":"加載中...","password_i_have_code":"我有代碼","label_reset_password_tel":"發送短信重置密碼","mobile_phone_number":"手機號碼","password_reset_sms_sent":"帶有安全碼的短信已發送至{phone}。請在下方輸入密碼。","mobile_number_required":"需要手機號"}');
/***/ })
diff --git a/umd/src_i18n_min_zh_json.dev.js b/umd/src_i18n_min_zh_json.dev.js
index aa90354f..744b1551 100644
--- a/umd/src_i18n_min_zh_json.dev.js
+++ b/umd/src_i18n_min_zh_json.dev.js
@@ -7,7 +7,7 @@
\******************************/
/***/ ((module) => {
-module.exports = JSON.parse('{"action_block_contact":"屏蔽联系人","action_cancel":"取消","action_clear_messages":"删除讯息","action_delete_messages":"删除所有帖子","action_leave_chat":"离开","action_report_chat":"检举垃圾邮件","archived_contacts":"已归档联系人 ({count})","badge_danger":"可疑的","badge_owner":"所有者","badge_staff":"在员工管理下","badge_verified":"值得信赖","badge_you":"你","block_contact_warning":"您确定要阻止此联系人吗?","blocked_contacts_link":"封锁的联络人 ({count})","button_add_another":"加上另一个","button_add_members":"添加成员","button_cancel":"取消","button_confirm":"确认","button_create":"创建","button_delete_account":"删除帐户","button_edit":"编辑","button_logout":"登出","button_ok":"好","button_reset":"重置","button_send_request":"发送请求","button_sign_in":"登录","button_sign_up":"注册","button_subscribe":"订阅","button_update":"更新","cannot_initiate_file_upload":"无法初始化文件上传。","channel":"频道","channel_prompt":"这是一个频道","chat_invitation":"你受邀开始新会话。你想怎么做?","chat_invitation_accept":"接受","chat_invitation_block":"屏蔽","chat_invitation_ignore":"忽略","clear_messages_warning":"您确定要清除所有消息吗?无法撤消。","code_doesnot_match":"代码不匹配","contacts_not_found":"你尚无会话 ¯∖_(ツ)_/¯","contacts_not_found_short":"无联系人匹配\'\'{query}\'\'","credential_email_prompt":"你的注册邮箱","delete_account":"删除帐户","delete_account_warning":"您确定要删除您的帐户吗?无法撤消。","delete_messages_warning":"您确定要删除所有消息吗?无法撤消。","download_action":"下载","drafty_attachment":"附件","drafty_form":"形式:","drafty_image":"图像","email_dative":"电子邮件","email_prompt":"电子邮件,例如 zhang@example.com","enable_peers_messaging":"启用","enter_confirmation_code_prompt":"输入通过{method}发送的验证码:","error_invalid_id":"无效 ID","file_attachment_too_large":"文件大小 {size} 超过 {limit} 限制。","forgot_password_link":"忘记密码?","full_name_prompt":"全名,例如张伟","granted_permissions":"已授予","group_has_no_members":"无成员","group_user_id_prompt":"群组或用户 ID","image_caption_prompt":"图片标题","invalid_content":"无效内容","invalid_security_token":"无效的安全令牌","label_client":"客户端:","label_content_type":"内容类型:","label_default_access_mode":"蓦然访问模式:","label_file_name":"文件名:","label_group_members":"群组成员:","label_incognito_mode":"无痕模式:","label_message_sound":"消息提示音:","label_muting_topic":"已静音:","label_other_user":"其他","label_password":"密码","label_permissions":"权限:","label_private":"私人评论","label_push_notifications":"通知提醒:","label_push_notifications_disabled":"通知提醒(需要 HTTPS):","label_reset_password":"发送密码重置邮件:","label_sdk":"开发包:","label_server":"服务器:","label_server_address":"服务器地址:","label_server_to_use":"使用的服务器:","label_size":"大小:","label_topic_name":"名称","label_user_contacts":"往来:","label_user_id":"地址:","label_wire_transport":"线路传输:","label_you":"你:","label_your_name":"你的姓名","label_your_permissions":"你的权限:","last_seen_timestamp":"最后可见","leave_chat_warning":"您确定要退出此对话吗?","link_contact_us":"联系我们","link_privacy_policy":"隐私政策","link_terms_of_service":"条款和条件","login_prompt":"登录","menu_item_archive_topic":"归档","menu_item_block":"屏蔽","menu_item_clear_messages":"清空消息","menu_item_clear_messages_for_all":"全部清除","menu_item_delete":"删除","menu_item_delete_for_all":"全部删除","menu_item_delete_topic":"删除","menu_item_edit_permissions":"编辑权限","menu_item_info":"信息","menu_item_member_delete":"移除","menu_item_mute":"静音","menu_item_restore_topic":"从存档中恢复","menu_item_send_retry":"重试","menu_item_unblock":"取消屏蔽","menu_item_unmute":"取消静音","message_sending":"正在发送...","message_sending_failed":"发送失败","messages_not_readable":"无消息访问权限","messaging_disabled_prompt":"消息已禁用","more_online_members":"还有{overflow}个","new_message_prompt":"新消息","new_password_placeholder":"输入新密码","no_connection":"无连接","no_contacts":"你尚无联系人 (._.)","numeric_confirmation_code_prompt":"仅数字","online_now":"在线","password_prompt":"密码","password_unchanged_prompt":"未改变","peers_messaging_disabled":"成员间消息已禁用。","permission_admin":"批准 ({val})","permission_delete":"删除 ({val})","permission_join":"加入 ({val})","permission_owner":"所有者 ({val})","permission_pres":"获取通知 ({val})","permission_read":"读取 ({val})","permission_share":"分享 ({val})","permission_write":"写入 ({val})","phone_dative":"电话","private_editing_placeholder":"仅自己可见","push_init_failed":"初始化推送通知失败","reconnect_countdown":"连接已断开。{seconds} 秒后重新连接…","reconnect_now":"立即尝试","reload_update":"重新载入","report_chat_warning":"您确定要停止并报告此对话吗?","requested_permissions":"已请求","save_attachment":"保存","search_for_contacts":"使用搜索寻找联系人","search_no_results":"搜索返回任何结果","search_placeholder":"列表如 email:alice@example.com, tel:+17025550003...","sidepanel_title_acc_notifications":"通知","sidepanel_title_acc_support":"支持","sidepanel_title_account_settings":"帐号设定","sidepanel_title_archive":"已存档会话","sidepanel_title_blocked":"被阻止的聊天","sidepanel_title_cred":"确认凭据","sidepanel_title_login":"登录","sidepanel_title_newtpk":"开始新会话","sidepanel_title_register":"创建账户","sidepanel_title_reset":"重置密码","sidepanel_title_settings":"设置","stay_logged_in":"保持登录","tabtitle_find_user":"搜索","tabtitle_group_by_id":"通过 id","tabtitle_new_group":"新群组","tags_editor_no_tags":"添加一些标签","tags_not_found":"尚未定义标签。添加一些。","title_all_contacts":"全部联系人","title_group_members":"群组成员","title_manage_tags":"管理标签","title_not_found":"无法找到","title_permissions":"权限","title_tag_manager":"标签(用户发现)","topic_block_warning":"您确定要阻止此对话吗?","topic_delete_warning":"您确定要删除此对话吗?","topic_name_editing_placeholder":"群组自由格式名称","unnamed_topic":"未命名","update_available":"更新可用。","upload_finishing":"正在结束...","user_not_found":"未找到","validate_credential_action":"确认","description_editing_placeholder":"说明(可选)","label_description":"说明","button_security":"安全","panel_title_crop":"拖动调整","panel_title_general":"常用设定","panel_title_members":"成员","panel_title_security":"安全","panel_title_info":"信息","permissions_anonymous":"匿名","permissions_authenticated":"已认证","topic_delete":"删除聊天","permissions_user":"用户权限","password_reset_email_sent":"一封电子邮件已发送至 {email}。按照电子邮件中的说明重置密码。","label_unarchive_topic":"存档:","menu_item_reply":"回复","menu_item_forward":"重定向","forward_to":"重定向消息","forward_to_search_placeholder":"搜索联系人","label_new_password":"新密码","drafty_unknown":"不支持","calls_incoming":"来电","calls_outgoing":"拨出电话","calls_you_label":"你","menu_item_video_call":"视频电话","already_in_call":"你已经在说话了!","call_cancelled":"取消","call_missed":"未接","call_declined":"被拒","call_disconnected":"断开连接","label_use_secure_connection":"使用安全连接","phone_or_email_prompt":"电话号码或电子邮件","cred_confirmed_successfully":"确认成功","menu_item_edit":"编辑","editing_message":"编辑","message_edited_marker":",编辑","icon_title_add_image":"添加图片","icon_title_attach_file":"附加文件","icon_title_delete":"删除录音","icon_title_pause":"暂停播放","icon_title_play":"播放录音","icon_title_record_voice":"录制语音信息","icon_title_resume":"恢复播放","icon_title_send":"发信息","drag_file":"将文件拖到这里","drafty_video":"视频录制","call_in_progress":"通话中","menu_item_audio_call":"称呼","unrecognized_video_format":"无法识别此视频的格式","loading_note":"加载中...","password_i_have_code":"我有代码","label_reset_password_tel":"发送短信重置密码","mobile_phone_number":"手机号","password_reset_sms_sent":"带有安全码的短信已发送至{phone}。请在下方输入密码。","mobile_number_required":"需要手机号"}');
+module.exports = JSON.parse('{"action_block_contact":"屏蔽联系人","action_cancel":"取消","action_clear_messages":"删除讯息","action_delete_messages":"删除所有帖子","action_leave_chat":"离开","action_report_chat":"检举垃圾邮件","archived_contacts":"已归档联系人 ({count})","badge_danger":"可疑的","badge_owner":"所有者","badge_staff":"在员工管理下","badge_verified":"值得信赖","badge_you":"你","block_contact_warning":"您确定要阻止此联系人吗?","blocked_contacts_link":"封锁的联络人 ({count})","button_add_members":"添加成员","button_cancel":"取消","button_confirm":"确认","button_create":"创建","button_delete_account":"删除帐户","button_edit":"编辑","button_logout":"登出","button_ok":"好","button_reset":"重置","button_send_request":"发送请求","button_sign_in":"登录","button_sign_up":"注册","button_subscribe":"订阅","button_update":"更新","cannot_initiate_file_upload":"无法初始化文件上传。","channel":"频道","channel_prompt":"这是一个频道","chat_invitation":"你受邀开始新会话。你想怎么做?","chat_invitation_accept":"接受","chat_invitation_block":"屏蔽","chat_invitation_ignore":"忽略","clear_messages_warning":"您确定要清除所有消息吗?无法撤消。","code_doesnot_match":"代码不匹配","contacts_not_found":"你尚无会话 ¯∖_(ツ)_/¯","contacts_not_found_short":"无联系人匹配\'\'{query}\'\'","credential_email_prompt":"你的注册邮箱","delete_account":"删除帐户","delete_account_warning":"您确定要删除您的帐户吗?无法撤消。","delete_messages_warning":"您确定要删除所有消息吗?无法撤消。","download_action":"下载","drafty_attachment":"附件","drafty_form":"形式:","drafty_image":"图像","email_dative":"电子邮件","email_prompt":"电子邮件,例如 zhang@example.com","enable_peers_messaging":"启用","enter_confirmation_code_prompt":"输入通过{method}发送的验证码:","error_invalid_id":"无效 ID","file_attachment_too_large":"文件大小 {size} 超过 {limit} 限制。","forgot_password_link":"忘记密码?","full_name_prompt":"全名,例如张伟","granted_permissions":"已授予","group_has_no_members":"无成员","group_user_id_prompt":"群组或用户 ID","image_caption_prompt":"图片标题","invalid_content":"无效内容","invalid_security_token":"无效的安全令牌","label_client":"客户端:","label_content_type":"内容类型:","label_default_access_mode":"蓦然访问模式:","label_file_name":"文件名:","label_group_members":"群组成员:","label_incognito_mode":"无痕模式:","label_message_sound":"消息提示音:","label_muting_topic":"已静音:","label_other_user":"其他","label_password":"密码","label_permissions":"权限:","label_private":"私人评论","label_push_notifications":"通知提醒:","label_push_notifications_disabled":"通知提醒(需要 HTTPS):","label_reset_password":"发送密码重置邮件:","label_sdk":"开发包:","label_server":"服务器:","label_server_address":"服务器地址:","label_server_to_use":"使用的服务器:","label_size":"大小:","label_topic_name":"名称","label_user_contacts":"往来","label_user_id":"地址:","label_wire_transport":"线路传输:","label_you":"你:","label_your_name":"你的姓名","label_your_permissions":"你的权限:","last_seen_timestamp":"最后可见","leave_chat_warning":"您确定要退出此对话吗?","link_contact_us":"联系我们","link_privacy_policy":"隐私政策","link_terms_of_service":"条款和条件","login_prompt":"登录","menu_item_archive_topic":"归档","menu_item_block":"屏蔽","menu_item_clear_messages":"清空消息","menu_item_clear_messages_for_all":"全部清除","menu_item_delete":"删除","menu_item_delete_for_all":"全部删除","menu_item_delete_topic":"删除","menu_item_edit_permissions":"编辑权限","menu_item_info":"信息","menu_item_member_delete":"移除","menu_item_mute":"静音","menu_item_restore_topic":"从存档中恢复","menu_item_send_retry":"重试","menu_item_unblock":"取消屏蔽","menu_item_unmute":"取消静音","message_sending":"正在发送...","message_sending_failed":"发送失败","messages_not_readable":"无消息访问权限","messaging_disabled_prompt":"消息已禁用","more_online_members":"还有{overflow}个","new_message_prompt":"新消息","new_password_placeholder":"输入新密码","no_connection":"无连接","no_contacts":"你尚无联系人 (._.)","numeric_confirmation_code_prompt":"仅数字","online_now":"在线","password_prompt":"密码","password_unchanged_prompt":"未改变","peers_messaging_disabled":"成员间消息已禁用。","permission_admin":"批准 ({val})","permission_delete":"删除 ({val})","permission_join":"加入 ({val})","permission_owner":"所有者 ({val})","permission_pres":"获取通知 ({val})","permission_read":"读取 ({val})","permission_share":"分享 ({val})","permission_write":"写入 ({val})","phone_dative":"电话","private_editing_placeholder":"仅自己可见","push_init_failed":"初始化推送通知失败","reconnect_countdown":"连接已断开。{seconds} 秒后重新连接…","reconnect_now":"立即尝试","reload_update":"重新载入","report_chat_warning":"您确定要停止并报告此对话吗?","requested_permissions":"已请求","save_attachment":"保存","search_for_contacts":"使用搜索寻找联系人","search_no_results":"搜索返回任何结果","search_placeholder":"列表如 email:alice@example.com, tel:+17025550003...","sidepanel_title_acc_notifications":"通知","sidepanel_title_acc_support":"支持","sidepanel_title_account_settings":"帐号设定","sidepanel_title_archive":"已存档会话","sidepanel_title_blocked":"被阻止的聊天","sidepanel_title_cred":"确认凭据","sidepanel_title_login":"登录","sidepanel_title_newtpk":"开始新会话","sidepanel_title_register":"创建账户","sidepanel_title_reset":"重置密码","sidepanel_title_settings":"设置","stay_logged_in":"保持登录","tabtitle_find_user":"搜索","tabtitle_group_by_id":"通过 id","tabtitle_new_group":"新群组","tags_editor_no_tags":"添加一些标签","tags_not_found":"尚未定义标签。添加一些。","title_all_contacts":"全部联系人","title_group_members":"群组成员","title_manage_tags":"管理标签","title_not_found":"无法找到","title_permissions":"权限","title_tag_manager":"标签(用户发现)","topic_block_warning":"您确定要阻止此对话吗?","topic_delete_warning":"您确定要删除此对话吗?","topic_name_editing_placeholder":"群组自由格式名称","unnamed_topic":"未命名","update_available":"更新可用。","upload_finishing":"正在结束...","user_not_found":"未找到","description_editing_placeholder":"说明(可选)","label_description":"说明","button_security":"安全","panel_title_crop":"拖动调整","panel_title_general":"常用设定","panel_title_members":"成员","panel_title_security":"安全","panel_title_info":"信息","permissions_anonymous":"匿名","permissions_authenticated":"已认证","topic_delete":"删除聊天","permissions_user":"用户权限","password_reset_email_sent":"一封电子邮件已发送至 {email}。按照电子邮件中的说明重置密码。","label_unarchive_topic":"存档:","menu_item_reply":"回复","menu_item_forward":"重定向","forward_to":"重定向消息","forward_to_search_placeholder":"搜索联系人","label_new_password":"新密码","drafty_unknown":"不支持","calls_incoming":"来电","calls_outgoing":"拨出电话","calls_you_label":"你","menu_item_video_call":"视频电话","already_in_call":"你已经在说话了!","call_cancelled":"取消","call_missed":"未接","call_declined":"被拒","call_disconnected":"断开连接","label_use_secure_connection":"使用安全连接","cred_confirmed_successfully":"确认成功","menu_item_edit":"编辑","editing_message":"编辑","message_edited_marker":",编辑","icon_title_add_image":"添加图片","icon_title_attach_file":"附加文件","icon_title_delete":"删除录音","icon_title_pause":"暂停播放","icon_title_play":"播放录音","icon_title_record_voice":"录制语音信息","icon_title_resume":"恢复播放","icon_title_send":"发信息","drag_file":"将文件拖到这里","drafty_video":"视频录制","call_in_progress":"通话中","menu_item_audio_call":"称呼","unrecognized_video_format":"无法识别此视频的格式","loading_note":"加载中...","password_i_have_code":"我有代码","label_reset_password_tel":"发送短信重置密码","mobile_phone_number":"手机号","password_reset_sms_sent":"带有安全码的短信已发送至{phone}。请在下方输入密码。","mobile_number_required":"需要手机号"}');
/***/ })
diff --git a/umd/src_widgets_phone-country-selector_jsx.dev.js b/umd/src_widgets_phone-country-selector_jsx.dev.js
index 117af991..71275e58 100644
--- a/umd/src_widgets_phone-country-selector_jsx.dev.js
+++ b/umd/src_widgets_phone-country-selector_jsx.dev.js
@@ -85,16 +85,6 @@ class PhoneCountrySelector extends (react__WEBPACK_IMPORTED_MODULE_0___default()
}
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ((0,react_intl__WEBPACK_IMPORTED_MODULE_1__.injectIntl)(PhoneCountrySelector));
-/***/ }),
-
-/***/ "./src/dcodes.json":
-/*!*************************!*\
- !*** ./src/dcodes.json ***!
- \*************************/
-/***/ ((module) => {
-
-module.exports = JSON.parse('[{"dial":"93","code":"AF"},{"dial":"355","code":"AL"},{"dial":"213","code":"DZ"},{"dial":"1-684","code":"AS"},{"dial":"376","code":"AD"},{"dial":"244","code":"AO"},{"dial":"1-264","code":"AI"},{"dial":"672","code":"AQ"},{"dial":"1-268","code":"AG"},{"dial":"54","code":"AR"},{"dial":"374","code":"AM"},{"dial":"297","code":"AW"},{"dial":"61","code":"AU"},{"dial":"43","code":"AT"},{"dial":"994","code":"AZ"},{"dial":"1-242","code":"BS"},{"dial":"973","code":"BH"},{"dial":"880","code":"BD"},{"dial":"1-246","code":"BB"},{"dial":"375","code":"BY"},{"dial":"32","code":"BE"},{"dial":"501","code":"BZ"},{"dial":"229","code":"BJ"},{"dial":"1-441","code":"BM"},{"dial":"975","code":"BT"},{"dial":"591","code":"BO"},{"dial":"387","code":"BA"},{"dial":"267","code":"BW"},{"dial":"55","code":"BR"},{"dial":"246","code":"IO"},{"dial":"1-284","code":"VG"},{"dial":"673","code":"BN"},{"dial":"359","code":"BG"},{"dial":"226","code":"BF"},{"dial":"257","code":"BI"},{"dial":"855","code":"KH"},{"dial":"237","code":"CM"},{"dial":"1","code":"CA"},{"dial":"238","code":"CV"},{"dial":"1-345","code":"KY"},{"dial":"236","code":"CF"},{"dial":"235","code":"TD"},{"dial":"56","code":"CL"},{"dial":"86","code":"CN"},{"dial":"61","code":"CX"},{"dial":"61","code":"CC"},{"dial":"57","code":"CO"},{"dial":"269","code":"KM"},{"dial":"682","code":"CK"},{"dial":"506","code":"CR"},{"dial":"385","code":"HR"},{"dial":"53","code":"CU"},{"dial":"599","code":"CW"},{"dial":"357","code":"CY"},{"dial":"420","code":"CZ"},{"dial":"243","code":"CD"},{"dial":"45","code":"DK"},{"dial":"253","code":"DJ"},{"dial":"1-767","code":"DM"},{"dial":"1-809, 1-829, 1-849","code":"DO"},{"dial":"670","code":"TL"},{"dial":"593","code":"EC"},{"dial":"20","code":"EG"},{"dial":"503","code":"SV"},{"dial":"240","code":"GQ"},{"dial":"291","code":"ER"},{"dial":"372","code":"EE"},{"dial":"251","code":"ET"},{"dial":"500","code":"FK"},{"dial":"298","code":"FO"},{"dial":"679","code":"FJ"},{"dial":"358","code":"FI"},{"dial":"33","code":"FR"},{"dial":"689","code":"PF"},{"dial":"241","code":"GA"},{"dial":"220","code":"GM"},{"dial":"995","code":"GE"},{"dial":"49","code":"DE"},{"dial":"233","code":"GH"},{"dial":"350","code":"GI"},{"dial":"30","code":"GR"},{"dial":"299","code":"GL"},{"dial":"1-473","code":"GD"},{"dial":"1-671","code":"GU"},{"dial":"502","code":"GT"},{"dial":"44-1481","code":"GG"},{"dial":"224","code":"GN"},{"dial":"245","code":"GW"},{"dial":"592","code":"GY"},{"dial":"509","code":"HT"},{"dial":"504","code":"HN"},{"dial":"852","code":"HK"},{"dial":"36","code":"HU"},{"dial":"354","code":"IS"},{"dial":"91","code":"IN"},{"dial":"62","code":"ID"},{"dial":"98","code":"IR"},{"dial":"964","code":"IQ"},{"dial":"353","code":"IE"},{"dial":"44-1624","code":"IM"},{"dial":"972","code":"IL"},{"dial":"39","code":"IT"},{"dial":"225","code":"CI"},{"dial":"1-876","code":"JM"},{"dial":"81","code":"JP"},{"dial":"44-1534","code":"JE"},{"dial":"962","code":"JO"},{"dial":"7, 997","code":"KZ"},{"dial":"254","code":"KE"},{"dial":"686","code":"KI"},{"dial":"383","code":"XK"},{"dial":"965","code":"KW"},{"dial":"996","code":"KG"},{"dial":"856","code":"LA"},{"dial":"371","code":"LV"},{"dial":"961","code":"LB"},{"dial":"266","code":"LS"},{"dial":"231","code":"LR"},{"dial":"218","code":"LY"},{"dial":"423","code":"LI"},{"dial":"370","code":"LT"},{"dial":"352","code":"LU"},{"dial":"853","code":"MO"},{"dial":"389","code":"MK"},{"dial":"261","code":"MG"},{"dial":"265","code":"MW"},{"dial":"60","code":"MY"},{"dial":"960","code":"MV"},{"dial":"223","code":"ML"},{"dial":"356","code":"MT"},{"dial":"692","code":"MH"},{"dial":"222","code":"MR"},{"dial":"230","code":"MU"},{"dial":"262","code":"YT"},{"dial":"52","code":"MX"},{"dial":"691","code":"FM"},{"dial":"373","code":"MD"},{"dial":"377","code":"MC"},{"dial":"976","code":"MN"},{"dial":"382","code":"ME"},{"dial":"1-664","code":"MS"},{"dial":"212","code":"MA"},{"dial":"258","code":"MZ"},{"dial":"95","code":"MM"},{"dial":"264","code":"NA"},{"dial":"674","code":"NR"},{"dial":"977","code":"NP"},{"dial":"31","code":"NL"},{"dial":"599","code":"CW"},{"dial":"687","code":"NC"},{"dial":"64","code":"NZ"},{"dial":"505","code":"NI"},{"dial":"227","code":"NE"},{"dial":"234","code":"NG"},{"dial":"683","code":"NU"},{"dial":"850","code":"KP"},{"dial":"1-670","code":"MP"},{"dial":"47","code":"NO"},{"dial":"968","code":"OM"},{"dial":"92","code":"PK"},{"dial":"680","code":"PW"},{"dial":"970","code":"PS"},{"dial":"507","code":"PA"},{"dial":"675","code":"PG"},{"dial":"595","code":"PY"},{"dial":"51","code":"PE"},{"dial":"63","code":"PH"},{"dial":"64","code":"PN"},{"dial":"48","code":"PL"},{"dial":"351","code":"PT"},{"dial":"1-787, 1-939","code":"PR"},{"dial":"974","code":"QA"},{"dial":"242","code":"CG"},{"dial":"262","code":"RE"},{"dial":"40","code":"RO"},{"dial":"7","code":"RU"},{"dial":"250","code":"RW"},{"dial":"590","code":"BL"},{"dial":"290","code":"SH"},{"dial":"1-869","code":"KN"},{"dial":"1-758","code":"LC"},{"dial":"590","code":"MF"},{"dial":"508","code":"PM"},{"dial":"1-784","code":"VC"},{"dial":"685","code":"WS"},{"dial":"378","code":"SM"},{"dial":"239","code":"ST"},{"dial":"966","code":"SA"},{"dial":"221","code":"SN"},{"dial":"381","code":"RS"},{"dial":"248","code":"SC"},{"dial":"232","code":"SL"},{"dial":"65","code":"SG"},{"dial":"1-721","code":"SX"},{"dial":"421","code":"SK"},{"dial":"386","code":"SI"},{"dial":"677","code":"SB"},{"dial":"252","code":"SO"},{"dial":"27","code":"ZA"},{"dial":"82","code":"KR"},{"dial":"211","code":"SS"},{"dial":"34","code":"ES"},{"dial":"94","code":"LK"},{"dial":"249","code":"SD"},{"dial":"597","code":"SR"},{"dial":"47","code":"SJ"},{"dial":"268","code":"SZ"},{"dial":"46","code":"SE"},{"dial":"41","code":"CH"},{"dial":"963","code":"SY"},{"dial":"886","code":"TW"},{"dial":"992","code":"TJ"},{"dial":"255","code":"TZ"},{"dial":"66","code":"TH"},{"dial":"228","code":"TG"},{"dial":"690","code":"TK"},{"dial":"676","code":"TO"},{"dial":"1-868","code":"TT"},{"dial":"216","code":"TN"},{"dial":"90","code":"TR"},{"dial":"993","code":"TM"},{"dial":"1-649","code":"TC"},{"dial":"688","code":"TV"},{"dial":"1-340","code":"VI"},{"dial":"256","code":"UG"},{"dial":"380","code":"UA"},{"dial":"971","code":"AE"},{"dial":"44","code":"GB"},{"dial":"1","code":"US"},{"dial":"598","code":"UY"},{"dial":"998","code":"UZ"},{"dial":"678","code":"VU"},{"dial":"379","code":"VA"},{"dial":"58","code":"VE"},{"dial":"84","code":"VN"},{"dial":"681","code":"WF"},{"dial":"212","code":"EH"},{"dial":"967","code":"YE"},{"dial":"260","code":"ZM"},{"dial":"263","code":"ZW"}]');
-
/***/ })
}]);
diff --git a/umd/src_widgets_phone-edit_jsx.dev.js b/umd/src_widgets_phone-edit_jsx.dev.js
index fad3348d..959a5964 100644
--- a/umd/src_widgets_phone-edit_jsx.dev.js
+++ b/umd/src_widgets_phone-edit_jsx.dev.js
@@ -123,6 +123,65 @@ class PhoneEdit extends (react__WEBPACK_IMPORTED_MODULE_0___default().PureCompon
/***/ }),
+/***/ "./node_modules/libphonenumber-js/es6/getExampleNumber.js":
+/*!****************************************************************!*\
+ !*** ./node_modules/libphonenumber-js/es6/getExampleNumber.js ***!
+ \****************************************************************/
+/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
+
+__webpack_require__.r(__webpack_exports__);
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
+/* harmony export */ "default": () => (/* binding */ getExampleNumber)
+/* harmony export */ });
+/* harmony import */ var _PhoneNumber_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./PhoneNumber.js */ "./node_modules/libphonenumber-js/es6/PhoneNumber.js");
+
+function getExampleNumber(country, examples, metadata) {
+ if (examples[country]) {
+ return new _PhoneNumber_js__WEBPACK_IMPORTED_MODULE_0__["default"](country, examples[country], metadata);
+ }
+}
+//# sourceMappingURL=getExampleNumber.js.map
+
+/***/ }),
+
+/***/ "./node_modules/libphonenumber-js/examples.mobile.json.js":
+/*!****************************************************************!*\
+ !*** ./node_modules/libphonenumber-js/examples.mobile.json.js ***!
+ \****************************************************************/
+/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
+
+__webpack_require__.r(__webpack_exports__);
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
+/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
+/* harmony export */ });
+// This file is a workaround for a bug in web browsers' "native"
+// ES6 importing system which is uncapable of importing "*.json" files.
+// https://github.com/catamphetamine/libphonenumber-js/issues/239
+/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"AC":"40123","AD":"312345","AE":"501234567","AF":"701234567","AG":"2684641234","AI":"2642351234","AL":"672123456","AM":"77123456","AO":"923123456","AR":"91123456789","AS":"6847331234","AT":"664123456","AU":"412345678","AW":"5601234","AX":"412345678","AZ":"401234567","BA":"61123456","BB":"2462501234","BD":"1812345678","BE":"470123456","BF":"70123456","BG":"43012345","BH":"36001234","BI":"79561234","BJ":"90011234","BL":"690001234","BM":"4413701234","BN":"7123456","BO":"71234567","BQ":"3181234","BR":"11961234567","BS":"2423591234","BT":"17123456","BW":"71123456","BY":"294911911","BZ":"6221234","CA":"5062345678","CC":"412345678","CD":"991234567","CF":"70012345","CG":"061234567","CH":"781234567","CI":"0123456789","CK":"71234","CL":"221234567","CM":"671234567","CN":"13123456789","CO":"3211234567","CR":"83123456","CU":"51234567","CV":"9911234","CW":"95181234","CX":"412345678","CY":"96123456","CZ":"601123456","DE":"15123456789","DJ":"77831001","DK":"32123456","DM":"7672251234","DO":"8092345678","DZ":"551234567","EC":"991234567","EE":"51234567","EG":"1001234567","EH":"650123456","ER":"7123456","ES":"612345678","ET":"911234567","FI":"412345678","FJ":"7012345","FK":"51234","FM":"3501234","FO":"211234","FR":"612345678","GA":"06031234","GB":"7400123456","GD":"4734031234","GE":"555123456","GF":"694201234","GG":"7781123456","GH":"231234567","GI":"57123456","GL":"221234","GM":"3012345","GN":"601123456","GP":"690001234","GQ":"222123456","GR":"6912345678","GT":"51234567","GU":"6713001234","GW":"955012345","GY":"6091234","HK":"51234567","HN":"91234567","HR":"921234567","HT":"34101234","HU":"201234567","ID":"812345678","IE":"850123456","IL":"502345678","IM":"7924123456","IN":"8123456789","IO":"3801234","IQ":"7912345678","IR":"9123456789","IS":"6111234","IT":"3123456789","JE":"7797712345","JM":"8762101234","JO":"790123456","JP":"9012345678","KE":"712123456","KG":"700123456","KH":"91234567","KI":"72001234","KM":"3212345","KN":"8697652917","KP":"1921234567","KR":"1020000000","KW":"50012345","KY":"3453231234","KZ":"7710009998","LA":"2023123456","LB":"71123456","LC":"7582845678","LI":"660234567","LK":"712345678","LR":"770123456","LS":"50123456","LT":"61234567","LU":"628123456","LV":"21234567","LY":"912345678","MA":"650123456","MC":"612345678","MD":"62112345","ME":"67622901","MF":"690001234","MG":"321234567","MH":"2351234","MK":"72345678","ML":"65012345","MM":"92123456","MN":"88123456","MO":"66123456","MP":"6702345678","MQ":"696201234","MR":"22123456","MS":"6644923456","MT":"96961234","MU":"52512345","MV":"7712345","MW":"991234567","MX":"12221234567","MY":"123456789","MZ":"821234567","NA":"811234567","NC":"751234","NE":"93123456","NF":"381234","NG":"8021234567","NI":"81234567","NL":"612345678","NO":"40612345","NP":"9841234567","NR":"5551234","NU":"8884012","NZ":"211234567","OM":"92123456","PA":"61234567","PE":"912345678","PF":"87123456","PG":"70123456","PH":"9051234567","PK":"3012345678","PL":"512345678","PM":"551234","PR":"7872345678","PS":"599123456","PT":"912345678","PW":"6201234","PY":"961456789","QA":"33123456","RE":"692123456","RO":"712034567","RS":"601234567","RU":"9123456789","RW":"720123456","SA":"512345678","SB":"7421234","SC":"2510123","SD":"911231234","SE":"701234567","SG":"81234567","SH":"51234","SI":"31234567","SJ":"41234567","SK":"912123456","SL":"25123456","SM":"66661212","SN":"701234567","SO":"71123456","SR":"7412345","SS":"977123456","ST":"9812345","SV":"70123456","SX":"7215205678","SY":"944567890","SZ":"76123456","TA":"8999","TC":"6492311234","TD":"63012345","TG":"90112345","TH":"812345678","TJ":"917123456","TK":"7290","TL":"77212345","TM":"66123456","TN":"20123456","TO":"7715123","TR":"5012345678","TT":"8682911234","TV":"901234","TW":"912345678","TZ":"621234567","UA":"501234567","UG":"712345678","US":"2015550123","UY":"94231234","UZ":"912345678","VA":"3123456789","VC":"7844301234","VE":"4121234567","VG":"2843001234","VI":"3406421234","VN":"912345678","VU":"5912345","WF":"821234","WS":"7212345","XK":"43201234","YE":"712345678","YT":"639012345","ZA":"711234567","ZM":"955123456","ZW":"712345678"});
+
+/***/ }),
+
+/***/ "./node_modules/libphonenumber-js/mobile/exports/getExampleNumber.js":
+/*!***************************************************************************!*\
+ !*** ./node_modules/libphonenumber-js/mobile/exports/getExampleNumber.js ***!
+ \***************************************************************************/
+/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
+
+__webpack_require__.r(__webpack_exports__);
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
+/* harmony export */ "getExampleNumber": () => (/* binding */ getExampleNumber)
+/* harmony export */ });
+/* harmony import */ var _withMetadataArgument_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./withMetadataArgument.js */ "./node_modules/libphonenumber-js/mobile/exports/withMetadataArgument.js");
+/* harmony import */ var _core_index_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../core/index.js */ "./node_modules/libphonenumber-js/es6/getExampleNumber.js");
+
+
+
+function getExampleNumber() {
+ return (0,_withMetadataArgument_js__WEBPACK_IMPORTED_MODULE_0__["default"])(_core_index_js__WEBPACK_IMPORTED_MODULE_1__["default"], arguments)
+}
+
+/***/ }),
+
/***/ "./src/dcodes.json":
/*!*************************!*\
!*** ./src/dcodes.json ***!
diff --git a/umd/src_widgets_phone-edit_jsx.dev.js.map b/umd/src_widgets_phone-edit_jsx.dev.js.map
index e3b3dd93..6244b1cf 100644
--- a/umd/src_widgets_phone-edit_jsx.dev.js.map
+++ b/umd/src_widgets_phone-edit_jsx.dev.js.map
@@ -1 +1 @@
-{"version":3,"file":"src_widgets_phone-edit_jsx.dev.js","mappings":"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","sources":["webpack://tinode-webapp/./src/widgets/phone-edit.jsx"],"sourcesContent":["// Editor for a phone number.\n\nimport React from 'react';\nimport { defineMessages, injectIntl } from 'react-intl';\nimport { getExampleNumber, parsePhoneNumber } from 'libphonenumber-js/mobile';\nimport examples from 'libphonenumber-js/mobile/examples'\n\nimport * as dcodes from '../dcodes.json';\nimport { flagEmoji } from '../lib/strformat';\n\nconst messages = defineMessages({\n mobile_number_required: {\n id: 'mobile_number_required',\n defaultMessage: 'Mobile phone number required',\n description: 'Error message'\n }\n});\n\nclass PhoneEdit extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.codeMap = {};\n dcodes.default.forEach(dc => { this.codeMap[dc.code] = dc.dial; });\n\n const code = props.countryCode || 'US';\n const dial = this.codeMap[code];\n\n this.state = {\n countryCode: code,\n dialCode: dial,\n localNumber: '',\n placeholderNumber: this.placeholderNumber(code, dial)\n };\n\n this.handleChange = this.handleChange.bind(this);\n this.handleFinished = this.handleFinished.bind(this);\n this.handleKeyDown = this.handleKeyDown.bind(this);\n this.showCountrySelector = this.showCountrySelector.bind(this);\n }\n\n handleChange(e) {\n this.setState({localNumber: this.filterNumber(e.target.value)});\n }\n\n handleFinished(e) {\n e.preventDefault();\n const raw = `${this.state.dialCode}${this.state.localNumber.trim()}`.replace(/[^\\d]/g, '');\n let number = null;\n try {\n number = parsePhoneNumber(`+${raw}`);\n } catch (err) {}\n\n if (!number || !number.isValid()) {\n this.inputField.setCustomValidity(this.props.intl.formatMessage(messages.mobile_number_required));\n return;\n }\n this.props.onSubmit(number.format('E.164'));\n }\n\n\n handleKeyDown(e) {\n if (e.key === 'Enter') {\n this.handleFinished(e);\n }\n }\n\n showCountrySelector() {\n this.props.onShowCountrySelector(this.state.countryCode, this.state.dialCode,\n (code, dial) => {\n this.setState({\n countryCode: code,\n dialCode: dial,\n placeholderNumber: this.placeholderNumber(code, dial)\n })\n });\n }\n\n // Filter out characters not permitted in a phone number.\n filterNumber(number) {\n if (!number) {\n return number;\n }\n // Leave numbers, space, (, ), -, and .\n // The + is not allowed: it's handled by the country code portion.\n return number.replace(/[^-\\s().\\d]/g, '');\n }\n\n placeholderNumber(code, dial) {\n const sample = getExampleNumber(code, examples);\n return sample ? sample.formatInternational().substring(dial.length + 1).trim() : '123 0123';\n }\n\n render() {\n return (\n <>\n \n {flagEmoji(this.state.countryCode)} \n +{this.state.dialCode} \n {this.inputField = ref}} placeholder={this.state.placeholderNumber}\n value={this.state.localNumber} onChange={this.handleChange}\n maxLength={17} onKeyDown={this.handleKeyDown} onBlur={this.handleFinished}\n required autoFocus={this.props.autoFocus} />\n >\n );\n }\n}\n\nexport default injectIntl(PhoneEdit);\n"],"names":["React","defineMessages","injectIntl","getExampleNumber","parsePhoneNumber","examples","dcodes","flagEmoji","messages","mobile_number_required","id","defaultMessage","PhoneEdit","PureComponent","constructor","props","codeMap","default","forEach","dc","code","dial","countryCode","state","dialCode","localNumber","placeholderNumber","handleChange","bind","handleFinished","handleKeyDown","showCountrySelector","e","setState","filterNumber","target","value","preventDefault","raw","trim","replace","number","err","isValid","inputField","setCustomValidity","intl","formatMessage","onSubmit","format","key","onShowCountrySelector","sample","formatInternational","substring","length","render","ref","autoFocus"],"sourceRoot":""}
\ No newline at end of file
+{"version":3,"file":"src_widgets_phone-edit_jsx.dev.js","mappings":"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","sources":["webpack://tinode-webapp/./src/widgets/phone-edit.jsx","webpack://tinode-webapp/./node_modules/libphonenumber-js/es6/getExampleNumber.js","webpack://tinode-webapp/./node_modules/libphonenumber-js/examples.mobile.json.js","webpack://tinode-webapp/./node_modules/libphonenumber-js/mobile/exports/getExampleNumber.js"],"sourcesContent":["// Editor for a phone number.\n\nimport React from 'react';\nimport { defineMessages, injectIntl } from 'react-intl';\nimport { getExampleNumber, parsePhoneNumber } from 'libphonenumber-js/mobile';\nimport examples from 'libphonenumber-js/mobile/examples'\n\nimport * as dcodes from '../dcodes.json';\nimport { flagEmoji } from '../lib/strformat';\n\nconst messages = defineMessages({\n mobile_number_required: {\n id: 'mobile_number_required',\n defaultMessage: 'Mobile phone number required',\n description: 'Error message'\n }\n});\n\nclass PhoneEdit extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.codeMap = {};\n dcodes.default.forEach(dc => { this.codeMap[dc.code] = dc.dial; });\n\n const code = props.countryCode || 'US';\n const dial = this.codeMap[code];\n\n this.state = {\n countryCode: code,\n dialCode: dial,\n localNumber: '',\n placeholderNumber: this.placeholderNumber(code, dial)\n };\n\n this.handleChange = this.handleChange.bind(this);\n this.handleFinished = this.handleFinished.bind(this);\n this.handleKeyDown = this.handleKeyDown.bind(this);\n this.showCountrySelector = this.showCountrySelector.bind(this);\n }\n\n handleChange(e) {\n this.setState({localNumber: this.filterNumber(e.target.value)});\n }\n\n handleFinished(e) {\n e.preventDefault();\n const raw = `${this.state.dialCode}${this.state.localNumber.trim()}`.replace(/[^\\d]/g, '');\n let number = null;\n try {\n number = parsePhoneNumber(`+${raw}`);\n } catch (err) {}\n\n if (!number || !number.isValid()) {\n this.inputField.setCustomValidity(this.props.intl.formatMessage(messages.mobile_number_required));\n return;\n }\n this.props.onSubmit(number.format('E.164'));\n }\n\n\n handleKeyDown(e) {\n if (e.key === 'Enter') {\n this.handleFinished(e);\n }\n }\n\n showCountrySelector() {\n this.props.onShowCountrySelector(this.state.countryCode, this.state.dialCode,\n (code, dial) => {\n this.setState({\n countryCode: code,\n dialCode: dial,\n placeholderNumber: this.placeholderNumber(code, dial)\n })\n });\n }\n\n // Filter out characters not permitted in a phone number.\n filterNumber(number) {\n if (!number) {\n return number;\n }\n // Leave numbers, space, (, ), -, and .\n // The + is not allowed: it's handled by the country code portion.\n return number.replace(/[^-\\s().\\d]/g, '');\n }\n\n placeholderNumber(code, dial) {\n const sample = getExampleNumber(code, examples);\n return sample ? sample.formatInternational().substring(dial.length + 1).trim() : '123 0123';\n }\n\n render() {\n return (\n <>\n \n {flagEmoji(this.state.countryCode)} \n +{this.state.dialCode} \n {this.inputField = ref}} placeholder={this.state.placeholderNumber}\n value={this.state.localNumber} onChange={this.handleChange}\n maxLength={17} onKeyDown={this.handleKeyDown} onBlur={this.handleFinished}\n required autoFocus={this.props.autoFocus} />\n >\n );\n }\n}\n\nexport default injectIntl(PhoneEdit);\n","import PhoneNumber from './PhoneNumber.js';\nexport default function getExampleNumber(country, examples, metadata) {\n if (examples[country]) {\n return new PhoneNumber(country, examples[country], metadata);\n }\n}\n//# sourceMappingURL=getExampleNumber.js.map","// This file is a workaround for a bug in web browsers' \"native\"\n// ES6 importing system which is uncapable of importing \"*.json\" files.\n// https://github.com/catamphetamine/libphonenumber-js/issues/239\nexport default {\"AC\":\"40123\",\"AD\":\"312345\",\"AE\":\"501234567\",\"AF\":\"701234567\",\"AG\":\"2684641234\",\"AI\":\"2642351234\",\"AL\":\"672123456\",\"AM\":\"77123456\",\"AO\":\"923123456\",\"AR\":\"91123456789\",\"AS\":\"6847331234\",\"AT\":\"664123456\",\"AU\":\"412345678\",\"AW\":\"5601234\",\"AX\":\"412345678\",\"AZ\":\"401234567\",\"BA\":\"61123456\",\"BB\":\"2462501234\",\"BD\":\"1812345678\",\"BE\":\"470123456\",\"BF\":\"70123456\",\"BG\":\"43012345\",\"BH\":\"36001234\",\"BI\":\"79561234\",\"BJ\":\"90011234\",\"BL\":\"690001234\",\"BM\":\"4413701234\",\"BN\":\"7123456\",\"BO\":\"71234567\",\"BQ\":\"3181234\",\"BR\":\"11961234567\",\"BS\":\"2423591234\",\"BT\":\"17123456\",\"BW\":\"71123456\",\"BY\":\"294911911\",\"BZ\":\"6221234\",\"CA\":\"5062345678\",\"CC\":\"412345678\",\"CD\":\"991234567\",\"CF\":\"70012345\",\"CG\":\"061234567\",\"CH\":\"781234567\",\"CI\":\"0123456789\",\"CK\":\"71234\",\"CL\":\"221234567\",\"CM\":\"671234567\",\"CN\":\"13123456789\",\"CO\":\"3211234567\",\"CR\":\"83123456\",\"CU\":\"51234567\",\"CV\":\"9911234\",\"CW\":\"95181234\",\"CX\":\"412345678\",\"CY\":\"96123456\",\"CZ\":\"601123456\",\"DE\":\"15123456789\",\"DJ\":\"77831001\",\"DK\":\"32123456\",\"DM\":\"7672251234\",\"DO\":\"8092345678\",\"DZ\":\"551234567\",\"EC\":\"991234567\",\"EE\":\"51234567\",\"EG\":\"1001234567\",\"EH\":\"650123456\",\"ER\":\"7123456\",\"ES\":\"612345678\",\"ET\":\"911234567\",\"FI\":\"412345678\",\"FJ\":\"7012345\",\"FK\":\"51234\",\"FM\":\"3501234\",\"FO\":\"211234\",\"FR\":\"612345678\",\"GA\":\"06031234\",\"GB\":\"7400123456\",\"GD\":\"4734031234\",\"GE\":\"555123456\",\"GF\":\"694201234\",\"GG\":\"7781123456\",\"GH\":\"231234567\",\"GI\":\"57123456\",\"GL\":\"221234\",\"GM\":\"3012345\",\"GN\":\"601123456\",\"GP\":\"690001234\",\"GQ\":\"222123456\",\"GR\":\"6912345678\",\"GT\":\"51234567\",\"GU\":\"6713001234\",\"GW\":\"955012345\",\"GY\":\"6091234\",\"HK\":\"51234567\",\"HN\":\"91234567\",\"HR\":\"921234567\",\"HT\":\"34101234\",\"HU\":\"201234567\",\"ID\":\"812345678\",\"IE\":\"850123456\",\"IL\":\"502345678\",\"IM\":\"7924123456\",\"IN\":\"8123456789\",\"IO\":\"3801234\",\"IQ\":\"7912345678\",\"IR\":\"9123456789\",\"IS\":\"6111234\",\"IT\":\"3123456789\",\"JE\":\"7797712345\",\"JM\":\"8762101234\",\"JO\":\"790123456\",\"JP\":\"9012345678\",\"KE\":\"712123456\",\"KG\":\"700123456\",\"KH\":\"91234567\",\"KI\":\"72001234\",\"KM\":\"3212345\",\"KN\":\"8697652917\",\"KP\":\"1921234567\",\"KR\":\"1020000000\",\"KW\":\"50012345\",\"KY\":\"3453231234\",\"KZ\":\"7710009998\",\"LA\":\"2023123456\",\"LB\":\"71123456\",\"LC\":\"7582845678\",\"LI\":\"660234567\",\"LK\":\"712345678\",\"LR\":\"770123456\",\"LS\":\"50123456\",\"LT\":\"61234567\",\"LU\":\"628123456\",\"LV\":\"21234567\",\"LY\":\"912345678\",\"MA\":\"650123456\",\"MC\":\"612345678\",\"MD\":\"62112345\",\"ME\":\"67622901\",\"MF\":\"690001234\",\"MG\":\"321234567\",\"MH\":\"2351234\",\"MK\":\"72345678\",\"ML\":\"65012345\",\"MM\":\"92123456\",\"MN\":\"88123456\",\"MO\":\"66123456\",\"MP\":\"6702345678\",\"MQ\":\"696201234\",\"MR\":\"22123456\",\"MS\":\"6644923456\",\"MT\":\"96961234\",\"MU\":\"52512345\",\"MV\":\"7712345\",\"MW\":\"991234567\",\"MX\":\"12221234567\",\"MY\":\"123456789\",\"MZ\":\"821234567\",\"NA\":\"811234567\",\"NC\":\"751234\",\"NE\":\"93123456\",\"NF\":\"381234\",\"NG\":\"8021234567\",\"NI\":\"81234567\",\"NL\":\"612345678\",\"NO\":\"40612345\",\"NP\":\"9841234567\",\"NR\":\"5551234\",\"NU\":\"8884012\",\"NZ\":\"211234567\",\"OM\":\"92123456\",\"PA\":\"61234567\",\"PE\":\"912345678\",\"PF\":\"87123456\",\"PG\":\"70123456\",\"PH\":\"9051234567\",\"PK\":\"3012345678\",\"PL\":\"512345678\",\"PM\":\"551234\",\"PR\":\"7872345678\",\"PS\":\"599123456\",\"PT\":\"912345678\",\"PW\":\"6201234\",\"PY\":\"961456789\",\"QA\":\"33123456\",\"RE\":\"692123456\",\"RO\":\"712034567\",\"RS\":\"601234567\",\"RU\":\"9123456789\",\"RW\":\"720123456\",\"SA\":\"512345678\",\"SB\":\"7421234\",\"SC\":\"2510123\",\"SD\":\"911231234\",\"SE\":\"701234567\",\"SG\":\"81234567\",\"SH\":\"51234\",\"SI\":\"31234567\",\"SJ\":\"41234567\",\"SK\":\"912123456\",\"SL\":\"25123456\",\"SM\":\"66661212\",\"SN\":\"701234567\",\"SO\":\"71123456\",\"SR\":\"7412345\",\"SS\":\"977123456\",\"ST\":\"9812345\",\"SV\":\"70123456\",\"SX\":\"7215205678\",\"SY\":\"944567890\",\"SZ\":\"76123456\",\"TA\":\"8999\",\"TC\":\"6492311234\",\"TD\":\"63012345\",\"TG\":\"90112345\",\"TH\":\"812345678\",\"TJ\":\"917123456\",\"TK\":\"7290\",\"TL\":\"77212345\",\"TM\":\"66123456\",\"TN\":\"20123456\",\"TO\":\"7715123\",\"TR\":\"5012345678\",\"TT\":\"8682911234\",\"TV\":\"901234\",\"TW\":\"912345678\",\"TZ\":\"621234567\",\"UA\":\"501234567\",\"UG\":\"712345678\",\"US\":\"2015550123\",\"UY\":\"94231234\",\"UZ\":\"912345678\",\"VA\":\"3123456789\",\"VC\":\"7844301234\",\"VE\":\"4121234567\",\"VG\":\"2843001234\",\"VI\":\"3406421234\",\"VN\":\"912345678\",\"VU\":\"5912345\",\"WF\":\"821234\",\"WS\":\"7212345\",\"XK\":\"43201234\",\"YE\":\"712345678\",\"YT\":\"639012345\",\"ZA\":\"711234567\",\"ZM\":\"955123456\",\"ZW\":\"712345678\"}","import withMetadataArgument from './withMetadataArgument.js'\r\nimport { getExampleNumber as _getExampleNumber } from '../../core/index.js'\r\n\r\nexport function getExampleNumber() {\r\n\treturn withMetadataArgument(_getExampleNumber, arguments)\r\n}"],"names":["React","defineMessages","injectIntl","getExampleNumber","parsePhoneNumber","examples","dcodes","flagEmoji","messages","mobile_number_required","id","defaultMessage","PhoneEdit","PureComponent","constructor","props","codeMap","default","forEach","dc","code","dial","countryCode","state","dialCode","localNumber","placeholderNumber","handleChange","bind","handleFinished","handleKeyDown","showCountrySelector","e","setState","filterNumber","target","value","preventDefault","raw","trim","replace","number","err","isValid","inputField","setCustomValidity","intl","formatMessage","onSubmit","format","key","onShowCountrySelector","sample","formatInternational","substring","length","render","ref","autoFocus"],"sourceRoot":""}
\ No newline at end of file