[
  {
    "path": ".editorconfig",
    "content": "root = true\n\n[*]\nindent_style = space\nindent_size = 4\ncharset = utf-8\ntrim_trailing_whitespace = true\ninsert_final_newline = true\nend_of_line = lf\n\n[*.md]\ntrim_trailing_whitespace = false"
  },
  {
    "path": ".eslintignore",
    "content": "node_modules\ndist\ncoverage\ndocs\n*.min.js\n.wa-version\n.wwebjs_auth\n.wwebjs_cache\n"
  },
  {
    "path": ".eslintrc.json",
    "content": "{\n    \"env\": {\n        \"browser\": true,\n        \"commonjs\": true,\n        \"es6\": true,\n        \"node\": true\n    },\n    \"extends\": [\n        \"eslint:recommended\",\n        \"plugin:mocha/recommended\",\n        \"plugin:prettier/recommended\"\n    ],\n    \"globals\": {\n        \"Atomics\": \"readonly\",\n        \"SharedArrayBuffer\": \"readonly\"\n    },\n    \"parserOptions\": {\n        \"ecmaVersion\": 2022\n    },\n    \"plugins\": [\"mocha\"]\n}\n"
  },
  {
    "path": ".gitattributes",
    "content": "* text=auto eol=lf\n\npackage-lock.json linguist-generated=true text=auto eol=lf\ndocs/* linguist-generated=true text=auto eol=lf\n"
  },
  {
    "path": ".github/CODE_OF_CONDUCT.md",
    "content": "# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nWe as members, contributors, and leaders pledge to make participation in our\ncommunity a harassment-free experience for everyone, regardless of age, body\nsize, visible or invisible disability, ethnicity, sex characteristics, gender\nidentity and expression, level of experience, education, socio-economic status,\nnationality, personal appearance, race, religion, or sexual identity\nand orientation.\n\nWe pledge to act and interact in ways that contribute to an open, welcoming,\ndiverse, inclusive, and healthy community.\n\n## Our Standards\n\nExamples of behavior that contributes to a positive environment for our\ncommunity include:\n\n- Demonstrating empathy and kindness toward other people\n- Being respectful of differing opinions, viewpoints, and experiences\n- Giving and gracefully accepting constructive feedback\n- Accepting responsibility and apologizing to those affected by our mistakes,\n  and learning from the experience\n- Focusing on what is best not just for us as individuals, but for the\n  overall community\n\nExamples of unacceptable behavior include:\n\n- The use of sexualized language or imagery, and sexual attention or\n  advances of any kind\n- Trolling, insulting or derogatory comments, and personal or political attacks\n- Public or private harassment\n- Publishing others' private information, such as a physical or email\n  address, without their explicit permission\n- Other conduct which could reasonably be considered inappropriate in a\n  professional setting\n\n## Enforcement Responsibilities\n\nCommunity leaders are responsible for clarifying and enforcing our standards of\nacceptable behavior and will take appropriate and fair corrective action in\nresponse to any behavior that they deem inappropriate, threatening, offensive,\nor harmful.\n\nCommunity leaders have the right and responsibility to remove, edit, or reject\ncomments, commits, code, wiki edits, issues, and other contributions that are\nnot aligned to this Code of Conduct, and will communicate reasons for moderation\ndecisions when appropriate.\n\n## Scope\n\nThis Code of Conduct applies within all community spaces, and also applies when\nan individual is officially representing the community in public spaces.\nExamples of representing our community include using an official e-mail address,\nposting via an official social media account, or acting as an appointed\nrepresentative at an online or offline event.\n\n## Enforcement\n\nInstances of abusive, harassing, or otherwise unacceptable behavior may be\nreported to the community leaders responsible for enforcement at\n[pedroslopez@me.com][email].\nAll complaints will be reviewed and investigated promptly and fairly.\n\nAll community leaders are obligated to respect the privacy and security of the\nreporter of any incident.\n\n## Enforcement Guidelines\n\nCommunity leaders will follow these Community Impact Guidelines in determining\nthe consequences for any action they deem in violation of this Code of Conduct:\n\n### 1. Correction\n\n**Community Impact**: Use of inappropriate language or other behavior deemed\nunprofessional or unwelcome in the community.\n\n**Consequence**: A private, written warning from community leaders, providing\nclarity around the nature of the violation and an explanation of why the\nbehavior was inappropriate. A public apology may be requested.\n\n### 2. Warning\n\n**Community Impact**: A violation through a single incident or series\nof actions.\n\n**Consequence**: A warning with consequences for continued behavior. No\ninteraction with the people involved, including unsolicited interaction with\nthose enforcing the Code of Conduct, for a specified period of time. This\nincludes avoiding interactions in community spaces as well as external channels\nlike social media. Violating these terms may lead to a temporary or\npermanent ban.\n\n### 3. Temporary Ban\n\n**Community Impact**: A serious violation of community standards, including\nsustained inappropriate behavior.\n\n**Consequence**: A temporary ban from any sort of interaction or public\ncommunication with the community for a specified period of time. No public or\nprivate interaction with the people involved, including unsolicited interaction\nwith those enforcing the Code of Conduct, is allowed during this period.\nViolating these terms may lead to a permanent ban.\n\n### 4. Permanent Ban\n\n**Community Impact**: Demonstrating a pattern of violation of community\nstandards, including sustained inappropriate behavior, harassment of an\nindividual, or aggression toward or disparagement of classes of individuals.\n\n**Consequence**: A permanent ban from any sort of public interaction within\nthe community.\n\n## Attribution\n\nThis Code of Conduct is adapted from the [Contributor Covenant][homepage],\nversion 2.0, available at\n[https://www.contributor-covenant.org/version/2/0/code_of_conduct.html][v2.0].\n\nCommunity Impact Guidelines were inspired by\n[Mozilla's code of conduct enforcement ladder][Mozilla CoC].\n\nFor answers to common questions about this code of conduct, see the FAQ at\n[https://www.contributor-covenant.org/faq][FAQ]. Translations are available\nat [https://www.contributor-covenant.org/translations][translations].\n\n[email]: mailto:pedroslopez@me.com\n[homepage]: https://www.contributor-covenant.org\n[v2.0]: https://www.contributor-covenant.org/version/2/0/code_of_conduct.html\n[Mozilla CoC]: https://github.com/mozilla/diversity\n[FAQ]: https://www.contributor-covenant.org/faq\n[translations]: https://www.contributor-covenant.org/translations\n"
  },
  {
    "path": ".github/COMMIT_CONVENTION.md",
    "content": "# Git Commit Message Convention\n\n> This is adapted from [Angular's commit convention][angular-commit-convention].\n\nMessages must be matched by the following regex (case-insensitive):\n\n```ts\n/^(revert: )?(feat|fix|docs|style|refactor|perf|test|build|ci|chore|types|infra)(\\(.+\\))?!?: .{1,72}/i;\n```\n\nThe commit type is **case-insensitive** — `feat`, `Feat`, and `FEAT` are all valid.\n\n## Examples\n\n### Features\n\nAppears under \"Features\" header, message subheader:\n\n```txt\nfeat(message): add 'downloadMedia' option\n```\n\nAdditional examples:\n\n```txt\nfeat(chat): add ability to pin messages\n```\n\n```txt\nfeat(contact): add getProfilePicUrl method\n```\n\n### Bug Fixes\n\nAppears under \"Bug Fixes\" header, client subheader, with a link to issue #28:\n\n```txt\nfix(client): stop client breaking when QR code expires\n\nCloses #28\n```\n\nAdditional examples:\n\n```txt\nfix(message): handle media messages without caption correctly\n```\n\n```txt\nfix(auth): resolve authentication timeout on slow connections\n```\n\n### Performance Improvements\n\nAppears under \"Performance Improvements\" header, and under \"Breaking Changes\" with the breaking change explanation:\n\n```txt\nperf(message): remove legacyMode option\n\nBREAKING CHANGE: The legacyMode option has been removed. The new message handling is always used for performance reasons.\n```\n\nAdditional example:\n\n```txt\nperf(client): optimize event listener registration\n```\n\n### Documentation\n\n```txt\ndocs(readme): update installation instructions\n```\n\n```txt\ndocs(api): add examples for message reactions\n```\n\n### Code Refactoring\n\n```txt\nrefactor(client): simplify authentication flow\n```\n\n```txt\nrefactor(structures): extract common message properties\n```\n\n### Tests\n\n```txt\ntest(message): add unit tests for media download\n```\n\n```txt\ntest(client): add integration tests for reconnection\n```\n\n### Build System\n\n```txt\nbuild(deps): update puppeteer to v21.0.0\n```\n\n```txt\nbuild(webpack): optimize bundle size\n```\n\n### Continuous Integration\n\n```txt\nci(actions): add automated release workflow\n```\n\n```txt\nci(tests): run tests on multiple node versions\n```\n\n### Chores\n\n```txt\nchore(gitignore): ignore .vscode directory\n```\n\n```txt\nchore(deps): bump dependencies to latest versions\n```\n\n### Type Definitions\n\n```txt\ntypes(message): add missing type for MessageMedia\n```\n\n```txt\ntypes(client): improve ClientOptions interface\n```\n\n### Code Style\n\n```txt\nstyle(client): fix indentation and spacing\n```\n\n### Reverts\n\nThe following commit and commit `667ecc1` do not appear in the changelog if they are under the same release. If not, the revert commit appears under the \"Reverts\" header:\n\n```txt\nrevert: feat(message): add 'downloadMedia' option\n\nThis reverts commit 667ecc1654a317a13331b17617d973392f415f02.\n```\n\nA commit message consists of a **header**, **body** and **footer**. The header has a **type**, **scope** and **subject**:\n\n```txt\n<type>(<scope>): <subject>\n<BLANK LINE>\n<body>\n<BLANK LINE>\n<footer>\n```\n\nThe **header** is mandatory and the **scope** of the header is optional.\n\n## Revert\n\nIf the commit reverts a previous commit, it should begin with `revert:`, followed by the header of the reverted commit. In the body, it should say: `This reverts commit <hash>.`, where the hash is the SHA of the commit being reverted.\n\n## Type\n\nIf the prefix is `feat`, `fix` or `perf`, it will appear in the changelog. However if there is any [BREAKING CHANGE](#footer), the commit will always appear in the changelog.\n\nOther prefixes are up to your discretion. Suggested prefixes are `build`, `ci`, `docs`, `style`, `refactor`, and `test` for non-changelog related tasks.\n\n## Scope\n\nThe scope could be anything specifying place of the commit change. For example `client`, `message`, `chat`, `contact`, `media`, `auth`, etc...\n\n## Subject\n\nThe subject contains succinct description of the change:\n\n- use the imperative, present tense: \"change\" not \"changed\" nor \"changes\"\n- don't capitalize first letter\n- no dot (.) at the end\n\n## Body\n\nJust as in the **subject**, use the imperative, present tense: \"change\" not \"changed\" nor \"changes\".\nThe body should include the motivation for the change and contrast this with previous behavior.\n\n## Footer\n\nThe footer should contain any information about **Breaking Changes** and is also the place to\nreference GitHub issues that this commit **Closes**.\n\n**Breaking Changes** should start with the word `BREAKING CHANGE:` with a space or two newlines. The rest of the commit message is then used for this.\n\nA detailed explanation can be found in this [document][commit-message-format].\n\n[angular-commit-convention]: https://github.com/conventional-changelog/conventional-changelog/tree/master/packages/conventional-changelog-angular\n[commit-message-format]: https://docs.google.com/document/d/1QrDFcIiPjSLDn3EL15IJygNPiHORgU1_OOAqWjiDU5Y/edit#\n"
  },
  {
    "path": ".github/CONTRIBUTING.md",
    "content": "# Contributing\n\nIf you want to contribute to whatsapp-web.js, start by forking the repository and opening a pull request with your changes. The project uses ESLint and Prettier to enforce a consistent coding style, so setting them up in your development environment is recommended to ensure your contributions meet the formatting standards.\n\n## Questions\n\nDo not open issues for general questions or support requests. For help, please join the [Discord Server][discord] instead. Installation instructions and general guidance are available in the documentation. Issues opened for questions will be closed.\n\n### Issue Tracker\n\nBefore creating a new issue, review the existing [issue tracker][issue-tracker] to avoid duplicates.\n\n## Issues and Pull Requests\n\n- **Bug reports** must include a minimal reproduction and clear steps to reproduce the problem.\n- **Feature requests** should clearly describe the use case and explain why the feature belongs in the library.\n- **Pull requests and commit messages** must follow the conventional commit format for both commit messages and the PR title (e.g. `feat(client): add sendMessage option`). The commit type is case-insensitive (`feat`, `Feat`, and `FEAT` are all valid).\n- All pull requests should target the `main` branch unless discussed otherwise.\n- Ensure that linting and tests pass before submitting your pull request.\n\n## Setup\n\nTo prepare your development environment:\n\n1. Fork and clone the repository, and ensure you are on the `main` branch.\n2. Run `npm install` to install all dependencies.\n3. Implement your changes or improvements.\n4. Run `npm run check` to execute ESLint and Prettier checks.\n5. Run `npm test` to ensure the test suite passes.\n6. Submit a pull request (make sure it follows the conventional commit format).\n\n## Testing Locally\n\nTo test your changes within your own project:\n\n1. Clone the repository and apply your modifications.\n2. Run `npm install` inside the cloned directory.\n3. In your project, run `npm link <path-to-your-clone>` to create a symlink to your local version.\n4. Import the package and verify your changes.\n5. If everything works as expected, you’ve successfully implemented your changes without breaking the library.\n\n[discord]: https://discord.wwebjs.dev/\n[issue-tracker]: https://github.com/pedroslopez/whatsapp-web.js/issues\n"
  },
  {
    "path": ".github/DISCLAIMER.md",
    "content": "# Disclaimer\n\nThis project is an unofficial library and is not affiliated with, endorsed by, maintained, authorized, or sponsored by WhatsApp Inc., Meta Platforms, or any of their subsidiaries or affiliates. Use of this library and any related components is entirely at your own risk. WhatsApp prohibits the use of unofficial clients, reverse-engineered integrations, automated bots, or other non-official methods of access to its platform, and using this library may violate WhatsApp’s Terms of Service, potentially resulting in temporary or permanent suspension of your WhatsApp account or other enforcement actions. We assume no responsibility or liability if your account is restricted, suspended, or permanently banned, and you are solely responsible for any consequences arising from the use or misuse of this project.\n\nThe maintainers and contributors provide this library without any guarantees or warranties, express or implied, regarding its reliability, functionality, or long-term viability. Compatibility with WhatsApp’s private or internal APIs may change at any time without notice, which could cause the library to stop functioning or behave unpredictably. This project has been developed strictly for educational, research, experimental, and hobby purposes and should not be used in commercial, production, or business-critical environments without fully understanding and accepting the associated risks.\n\nFor official, secure, and policy-compliant integrations, individuals and businesses are strongly encouraged to use the WhatsApp Business Platform or other authorized APIs provided directly by WhatsApp or Meta. The official WhatsApp website is available at [https://www.whatsapp.com][whatsapp]. \"WhatsApp\" and all related names, marks, logos, and images are registered trademarks of their respective owners. By using this project, you acknowledge that you understand and accept all of the above terms, limitations, and potential risks, including the possibility of account suspension or banning.\n\n[whatsapp]: https://www.whatsapp.com\n"
  },
  {
    "path": ".github/FUNDING.yml",
    "content": "github: [pedroslopez, PurpShell]\nko_fi: pedroslopez\ncustom: ['paypal.me/psla', 'buymeacoff.ee/pedroslopez']\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/01-bug_report.yml",
    "content": "name: Bug Report\ndescription: Report a bug in the library or another package\nlabels: [bug]\nbody:\n    - type: markdown\n      attributes:\n          value: |\n              Thanks for taking the time to report a bug! Please check the [issue tracker](https://github.com/wwebjs/wwebjs/issues) before submitting.\n\n              > [!CAUTION]\n              > - **Report only issues related to the `whatsapp-web.js` library!**\n              > - **Any issue without a clear reproduction will be closed!**\n              > - **Any issue opened as a question will be closed!**\n              > - **Duplicate issues will be closed.**\n\n    - type: dropdown\n      id: priority\n      attributes:\n          label: Issue Priority\n          description: Be realistic. Elaborate in the description if needed.\n          options:\n              - Low (slightly annoying)\n              - Medium (should be fixed soon)\n              - High (immediate attention needed)\n          default: 0\n      validations:\n          required: true\n\n    - type: textarea\n      id: description\n      attributes:\n          label: Issue Description\n          description: Provide a clear and concise description of the problem.\n          placeholder: |\n              When I try to send a message, the client disconnects unexpectedly...\n      validations:\n          required: true\n\n    - type: textarea\n      id: reproduction_steps\n      attributes:\n          label: Steps To Reproduce\n          description: How can we reproduce this issue?\n          placeholder: |\n              1. Do this\n              2. Do that\n              ...\n\n              9. See error\n      validations:\n          required: true\n\n    - type: textarea\n      id: code_sample\n      attributes:\n          label: Code Sample\n          description: |\n              Provide code that reproduces the bug. Ensure it is:\n              - **Minimal** - Only essential code to show the issue\n              - **Complete** - Include all dependencies and setup\n              - **Tested** - Verify it actually triggers the problem\n\n              Will be auto-formatted - no backticks needed.\n          render: typescript\n      validations:\n          required: false\n\n    - type: dropdown\n      id: whatsapp_type\n      attributes:\n          label: WhatsApp Account Type\n          description: What type of WhatsApp account are you using?\n          options:\n              - Standard\n              - WhatsApp Business\n      validations:\n          required: true\n\n    - type: dropdown\n      id: auth_type\n      attributes:\n          label: Authentication Strategy\n          description: What authenctication strategy are you using?\n          options:\n              - LocalAuth\n              - RemoteAuth\n              - NoAuth\n      validations:\n          required: true\n\n    - type: input\n      id: lib_version\n      attributes:\n          label: whatsapp-web.js Version\n          description: What library version are you using? Check it in `package.json` file.\n          placeholder: 1.31.0\n      validations:\n          required: true\n\n    - type: input\n      id: wweb_version\n      attributes:\n          label: WhatsApp Web Version\n          description: 'What WhatsApp Web version are you using? Use: `await client.getWWebVersion()`'\n          placeholder: 2.3000.1017054665\n      validations:\n          required: true\n\n    - type: input\n      id: browser_type\n      attributes:\n          label: Browser Type\n          description: What web browser are you using?\n          placeholder: Chromium / Google Chrome / Edge / ...\n      validations:\n          required: true\n\n    - type: input\n      id: browser_version\n      attributes:\n          label: Browser Version\n          description: What version of the browser are you using?\n          placeholder: 120.0.6099.71\n      validations:\n          required: true\n\n    - type: input\n      id: computer_os\n      attributes:\n          label: Computer OS Version\n          description: What OS are you using?\n          placeholder: MacOS 15 / Windows 11 / Ubuntu 24 / ...\n      validations:\n          required: true\n\n    - type: input\n      id: phone_os\n      attributes:\n          label: Phone OS Version\n          description: What OS version are you using on your phone?\n          placeholder: Android 12 / iOS 15.4 / ...\n      validations:\n          required: true\n\n    - type: input\n      id: node_version\n      attributes:\n          label: Node.js Version\n          description: What Node.js version are you using? Run `node -v` in your terminal.\n          placeholder: 18.16.0\n      validations:\n          required: true\n\n    - type: checkboxes\n      id: checklist\n      attributes:\n          label: Checklist\n          options:\n              - label: '**I use the latest released version of whatsapp-web.js.**'\n                required: true\n              - label: I have searched existing issues and confirmed this is not a duplicate.\n                required: true\n              - label: I have verified this is a library issue, not a problem with my code.\n                required: true\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/02-feature_request.yml",
    "content": "name: Feature Request\ndescription: Request a new feature for our applications or packages\nlabels: [feature request]\nbody:\n    - type: markdown\n      attributes:\n          value: |\n              Thanks for taking the time to suggest a feature! Please search the [issue tracker](https://github.com/wwebjs/wwebjs/issues) first to avoid duplicates.\n\n              > [!CAUTION]\n              > - **Please submit only feature requests that related to the `whatsapp-web.js` library.**\n              > - **Any feature request opened as a question will be closed!**\n              > - **Duplicate issues will be closed.**\n\n    - type: textarea\n      id: description\n      attributes:\n          label: Feature summary\n          description: Briefly describe the problem/use case and desired capability.\n          placeholder: |\n              Problem: ...\n              Benefit: ...\n              Outcome: ...\n      validations:\n          required: true\n\n    - type: textarea\n      id: solution\n      attributes:\n          label: Ideal solution or implementation\n          description: How should this feature work? Include examples like API shape, UX sketches.\n          placeholder: |\n              API: client.xyz(...)\n              Event: client.on('xyz', ...)\n              Example: const r = await client.xyz()\n              Compatibility: Breaking changes?\n          render: markdown\n      validations:\n          required: true\n\n    - type: textarea\n      id: alternatives\n      attributes:\n          label: Alternatives / Additional context\n          description: Alternatives or workarounds? / More notes/links/screenshots.\n\n    - type: checkboxes\n      id: checklist\n      attributes:\n          label: Checklist\n          options:\n              - label: I have searched existing issues and confirmed this is not a duplicate.\n                required: true\n              - label: This request is within the scope of WhatsApp Web capabilities.\n                required: false\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/config.yml",
    "content": "blank_issues_enabled: false\ncontact_links:\n    - name: Discord Server\n      url: https://discord.wwebjs.dev\n      about: Please ask and answer questions here.\n"
  },
  {
    "path": ".github/SUPPORT.md",
    "content": "# Need Help?\n\nThis issue tracker is **only** for bug reports and feature requests.\n\nFor questions and general help, please join our **Discord server**: [https://discord.wwebjs.dev][discord].  \nInstallation instructions and guidance can be found in the documentation.\n\nIssues that are not bug reports, feature requests or questions will be closed.\n\n[discord]: https://discord.wwebjs.dev\n"
  },
  {
    "path": ".github/dependabot.yml",
    "content": "version: 2\nupdates:\n    - package-ecosystem: 'npm'\n      directory: '/'\n      open-pull-requests-limit: 10\n      schedule:\n          interval: 'monthly'\n      labels:\n          - 'dependencies'\n          - 'dependabot'\n      target-branch: 'main'\n"
  },
  {
    "path": ".github/issue-labeler.yml",
    "content": "documentation:\n    - \"\\\\b(doc|docs|readme|documentation|typo|example|guide)s?\\\\b\"\nsecurity:\n    - \"\\\\b(vulnerability|xss|csrf|security|exploit|attack|inject)s?\\\\b\"\nperformance:\n    - \"\\\\b(performance|slow|memory|cpu|optimize|optimization|lag|leak)s?\\\\b\"\nbreaking change:\n    - \"\\\\bbreaking.?changes?\\\\b\"\ndependencies:\n    - \"\\\\b(depend(enc)?y|dependencies|deps?|package|upgrade|bump)s?\\\\b\"\ntypings:\n    - \"\\\\b(type|types|typing|typings|typescript|\\\\.d\\\\.ts)s?\\\\b\"\ntests:\n    - \"\\\\b(test|tests|testing|spec|mocha|assert|coverage)s?\\\\b\"\nci:\n    - \"\\\\b(ci|workflow|pipeline|action|github.?action|continuous.?integration)s?\\\\b\"\nbuild:\n    - \"\\\\b(build|builds|build.?system|webpack|rollup|esbuild|gulp|grunt)s?\\\\b\"\ninfra:\n    - \"\\\\b(infra|infrastructure|devops|docker|kubernetes|cloud|aws|azure|gcp)s?\\\\b\"\nstyles:\n    - \"\\\\b(style|styles|format|lint|prettier|eslint)s?\\\\b\"\nui:\n    - \"\\\\b(ui|ux|interface|design|layout|responsive)s?\\\\b\"\n"
  },
  {
    "path": ".github/labels.yml",
    "content": "# Issue Labels\n- name: 'bug'\n  color: '#d73a4a'\n  description: 'Something is broken'\n- name: 'feature request'\n  color: '#a2eeef'\n  description: 'Request for a new feature'\n\n# Status Labels\n- name: 'in progress'\n  color: '#fbca04'\n  description: 'Work in progress'\n- name: 'in review'\n  color: '#0e8a16'\n  description: 'Awaiting review'\n- name: 'merge ready'\n  color: '#0e8a16'\n  description: 'Ready to merge'\n- name: 'blocked'\n  color: '#d13917'\n  description: 'Blocked by another issue'\n- name: 'discussion'\n  color: '#d876e3'\n  description: 'Needs discussion'\n- name: 'approved'\n  color: '#11EA91'\n  description: 'Confirmed by maintainers'\n- name: 'stale'\n  color: '#bfd4f2'\n  description: 'Inactive for a while'\n- name: 'waiting for a response'\n  color: '#BE4422'\n  description: 'Waiting for author response'\n- name: 'waiting for testers'\n  color: '#7d006a'\n  description: 'Needs testing'\n\n# Priority & Help\n- name: 'good first issue'\n  color: '#7057ff'\n  description: 'Beginner-friendly issue'\n- name: 'help wanted'\n  color: '#008672'\n  description: 'Community help needed'\n- name: 'high priority'\n  color: '#00DFA8'\n  description: 'Important issue'\n\n# Bug Issues\n- name: 'issued low'\n  color: '#d4c5f9'\n  description: 'Low impact issue'\n- name: 'issued medium'\n  color: '#d4c5f9'\n  description: 'Medium impact issue'\n- name: 'issued high'\n  color: '#d4c5f9'\n  description: 'High impact issue'\n\n# Resolution\n- name: 'duplicate'\n  color: '#cfd3d7'\n  description: 'Already reported'\n- name: 'invalid'\n  color: '#e4e669'\n  description: 'Not a valid issue'\n- name: 'wontfix'\n  color: '#ffffff'\n  description: 'Will not be fixed'\n\n# Type of Change\n- name: 'api changes'\n  color: '#5319e7'\n  description: 'API modifications'\n- name: 'dependencies'\n  color: '#0366d6'\n  description: 'Dependency updates'\n- name: 'security'\n  color: '#ee0701'\n  description: 'Security related'\n- name: 'performance'\n  color: '#ff6b6b'\n  description: 'Performance improvements'\n- name: 'error handling'\n  color: '#f9d0c4'\n  description: 'Error handling updates'\n- name: 'typings'\n  color: '#1d76db'\n  description: 'Type definitions'\n- name: 'interactions'\n  color: '#c5def5'\n  description: 'Interaction changes'\n- name: 'breaking change'\n  color: '#E9314A'\n  description: 'Breaks existing behavior'\n\n# Bots & Automation\n- name: 'dependabot'\n  color: '#0366d6'\n  description: 'Dependabot PR'\n- name: 'depfu'\n  color: '#0000ff'\n  description: 'Depfu PR'\n\n# Code & Build\n- name: 'tests'\n  color: '#bfd4f2'\n  description: 'Test related'\n- name: 'build'\n  color: '#0075ca'\n  description: 'Build system'\n- name: 'ci'\n  color: '#0075ca'\n  description: 'CI pipeline'\n- name: 'infra'\n  color: '#d4c5f9'\n  description: 'Infrastructure'\n- name: 'styles'\n  color: '#ffc0cb'\n  description: 'Code style'\n- name: 'ui'\n  color: '#ffaad4'\n  description: 'UI changes'\n- name: 'utility'\n  color: '#ededed'\n  description: 'Utility code'\n- name: 'chore'\n  color: '#fef2c0'\n  description: 'Maintenance task'\n\n# Quality & Review\n- name: 'AI pr'\n  color: '#b60205'\n  description: 'AI-assisted PR; Review very carefully!'\n- name: 'bad pr'\n  color: '#B60205'\n  description: 'Below project standards'\n\n# Project Specific\n- name: 'docs'\n  color: '#0075ca'\n  description: 'Documentation changes'\n- name: 'whatsapp bug'\n  color: '#1d76db'\n  description: 'WhatsApp Web bug'\n- name: 'whatsapp change'\n  color: '#25D366'\n  description: 'WhatsApp Web change'\n"
  },
  {
    "path": ".github/pr-labeler.yml",
    "content": "api changes:\n    - changed-files:\n          - any-glob-to-any-file:\n                - src/*\n                - src/**/*\ndependencies:\n    - changed-files:\n          - any-glob-to-any-file:\n                - package.json\n                - package-lock.json\ntests:\n    - changed-files:\n          - any-glob-to-any-file:\n                - tests/*\n                - tests/**/*\ndocs:\n    - changed-files:\n          - any-glob-to-any-file:\n                - docs/*\n                - docs/**/*\n                - '**/*.md'\n                - .jsdoc.json\ninfra:\n    - changed-files:\n          - any-glob-to-any-file:\n                - .github/*\n                - .github/**/*\nci:\n    - changed-files:\n          - any-glob-to-any-file:\n                - .github/workflows/*\n                - .github/workflows/**/*\ntypings:\n    - changed-files:\n          - any-glob-to-any-file:\n                - index.d.ts\n                - '**/*.d.ts'\nutility:\n    - changed-files:\n          - any-glob-to-any-file:\n                - src/util/*\n                - src/util/**/*\nbuild:\n    - changed-files:\n          - any-glob-to-any-file:\n                - tools/*\n                - tools/**/*\n                - .eslintrc.json\n                - .eslintignore\n                - .prettierrc.json\n                - .prettierignore\n                - .editorconfig\n                - .gitignore\n                - .gitattributes\n                - .commitlint.config.js\nchore:\n    - changed-files:\n          - any-glob-to-any-file:\n                - .env.example\n                - .npmignore\n                - LICENSE\n                - .github/FUNDING.yml\n                - .github/CODE_OF_CONDUCT.md\n                - .github/ISSUE_TEMPLATE/*\n                - .github/pull_request_template.md\n"
  },
  {
    "path": ".github/pull_request_template.md",
    "content": "## Description\n\n<!-- What does this PR change and why? -->\n\n## Related Issue(s)\n\n<!--\nIf this pull request relates to one or more GitHub issues, link them using GitHub's closing keywords to automatically close the issues upon merging.\n\nExamples:\n  closes #123\n  fixes #456\n  resolves #789\n\nFor more details, see:\nhttps://docs.github.com/en/issues/tracking-your-work-with-issues/linking-a-pull-request-to-an-issue\n-->\n\n## Testing Summary\n\n### Test Details\n\n<!-- Describe in detail how you tested your changes. -->\n\n### Environment\n\n<!-- Provide detailed information about the environment used to test this pull request. Simply fill out the blanks with your setup. -->\n\n<!-- Operating system of the machine used for testing -->\n<!-- Example: (macOS 15 / Windows 11 / Ubuntu 24 / ...) -->\n\n- Machine OS:\n\n<!-- Operating system of the mobile device used to verify functionality -->\n<!-- Example: (Android 12 / iOS 16 / ...) -->\n\n- Phone OS:\n\n<!-- Version of whatsapp-web.js used during testing -->\n<!-- Check your `package.json` file -->\n<!-- Example: (1.31.0) -->\n\n- Library Version:\n\n<!-- WhatsApp Web version used for testing -->\n<!-- Run `await client.getWWebVersion()` to retrieve it -->\n<!-- Example: (2.3000.1017054665) -->\n\n- WhatsApp Web Version:\n\n<!-- Browser and version used for testing -->\n<!-- Example: (Chromium 120 / Google Chrome 118 / ...) -->\n\n- Browser Type and Version:\n\n<!-- Node.js version used during testing -->\n<!-- Run `node -v` to check -->\n<!-- Example: (18.16.0) -->\n\n- Node Version:\n\n## Type of Change\n\n<!-- Select all that apply: -->\n\n- [ ] **Dependency change** _(package changes such as removals, upgrades, or additions)_\n- [ ] **Bug fix** _(non-breaking change that fixes an issue)_\n- [ ] **New feature** _(non-breaking change that adds functionality)_\n- [ ] **Breaking change** _(fix or feature that would cause existing functionality to change)_\n- [ ] **Non-code change** _(documentation, README, etc.)_\n\n## Checklist\n\n<!-- Please confirm that all relevant items below have been completed. -->\n\n- [ ] My code follows the style guidelines of this project.\n- [ ] All new and existing tests pass (`npm test`).\n- [ ] Typings (e.g. `index.d.ts`) have been updated if necessary.\n- [ ] Usage examples (e.g. `example.js`) / documentation have been updated if applicable.\n"
  },
  {
    "path": ".github/workflows/format-issue-bug.yml",
    "content": "name: Format Issue Body\n\non:\n    issues:\n        types: [opened]\n\npermissions:\n    contents: read\n    issues: write\n\nconcurrency:\n    group: issue-format-${{ github.event.issue.number }}\n    cancel-in-progress: true\n\njobs:\n    format:\n        runs-on: ubuntu-latest\n        if: github.event_name == 'issues' && contains(github.event.issue.labels.*.name, 'bug')\n        permissions:\n            contents: read\n            issues: write\n        steps:\n            - name: Checkout repository\n              uses: actions/checkout@v4\n\n            - name: Parse issue form body\n              uses: stefanbuck/github-issue-parser@v3\n              id: parse\n              with:\n                  template-path: .github/ISSUE_TEMPLATE/01-bug_report.yml\n\n            - name: Build formatted issue body\n              id: summary\n              env:\n                  DESCRIPTION: ${{ steps.parse.outputs.issueparser_description }}\n                  REPRODUCTION_STEPS: ${{ steps.parse.outputs.issueparser_reproduction_steps }}\n                  CODE_SAMPLE: ${{ steps.parse.outputs.issueparser_code_sample }}\n                  WHATSAPP_TYPE: ${{ steps.parse.outputs.issueparser_whatsapp_type }}\n                  AUTH_TYPE: ${{ steps.parse.outputs.issueparser_auth_type }}\n                  LIB_VERSION: ${{ steps.parse.outputs.issueparser_lib_version }}\n                  WWEB_VERSION: ${{ steps.parse.outputs.issueparser_wweb_version }}\n                  BROWSER_TYPE: ${{ steps.parse.outputs.issueparser_browser_type }}\n                  BROWSER_VERSION: ${{ steps.parse.outputs.issueparser_browser_version }}\n                  COMPUTER_OS: ${{ steps.parse.outputs.issueparser_computer_os }}\n                  PHONE_OS: ${{ steps.parse.outputs.issueparser_phone_os }}\n                  NODE_VERSION: ${{ steps.parse.outputs.issueparser_node_version }}\n                  CHECKLIST: ${{ steps.parse.outputs.issueparser_checklist }}\n              run: |\n                  {\n                    echo 'body<<BODY_DELIMITER'\n                    echo '## Issue Description'\n                    echo \"$DESCRIPTION\"\n                    echo ''\n                    echo '## Reproduction Steps'\n                    echo \"$REPRODUCTION_STEPS\"\n                    echo ''\n                    if [ -n \"$CODE_SAMPLE\" ]; then\n                      echo '## Code Sample'\n                      echo \"$CODE_SAMPLE\"\n                      echo ''\n                    fi\n                    echo '## User Setup'\n                    echo ''\n                    echo '| WhatsApp | Type |'\n                    echo '|---|---|'\n                    [ -n \"$WHATSAPP_TYPE\" ]   && echo \"| **Account Type** | $WHATSAPP_TYPE |\"\n                    [ -n \"$AUTH_TYPE\" ]       && echo \"| **Authentication Strategy** | $AUTH_TYPE |\"\n                    [ -n \"$WWEB_VERSION\" ]    && echo \"| **WhatsApp Web Version** | $WWEB_VERSION |\"\n                    [ -n \"$LIB_VERSION\" ]     && echo \"| **whatsapp-web.js Version** | $LIB_VERSION |\"\n                    echo ''\n                    echo '| Environment | Version |'\n                    echo '|---|---|'\n                    [ -n \"$BROWSER_TYPE\" ]    && echo \"| **Browser Type** | $BROWSER_TYPE |\"\n                    [ -n \"$BROWSER_VERSION\" ] && echo \"| **Browser Version** | $BROWSER_VERSION |\"\n                    [ -n \"$PHONE_OS\" ]        && echo \"| **Phone OS Version** | $PHONE_OS |\"\n                    [ -n \"$COMPUTER_OS\" ]     && echo \"| **Running OS Version** | $COMPUTER_OS |\"\n                    [ -n \"$NODE_VERSION\" ]    && echo \"| **Node.js Version** | $NODE_VERSION |\"\n                    echo ''\n                    if [ -n \"$CHECKLIST\" ]; then\n                      echo '## Checklist'\n                      echo '- [x] **I use the latest released version of whatsapp-web.js.**'\n                      echo '- [x] I have searched existing issues and confirmed this is not a duplicate.'\n                      echo '- [x] I have verified this is a library issue, not a problem with my code.'\n                    fi\n                    echo 'BODY_DELIMITER'\n                  } >> \"$GITHUB_OUTPUT\"\n\n            - name: Update issue body\n              uses: julien-deramond/update-issue-body@v1\n              with:\n                  issue-number: ${{ github.event.issue.number }}\n                  body: ${{ steps.summary.outputs.body }}\n                  edit-mode: replace\n\n            - name: Determine priority label\n              id: priority_label\n              env:\n                  PRIORITY: ${{ steps.parse.outputs.issueparser_priority }}\n              run: |\n                  if [[ \"$PRIORITY\" == \"Low\"* ]]; then\n                    echo \"label=issued low\" >> \"$GITHUB_OUTPUT\"\n                  elif [[ \"$PRIORITY\" == \"Medium\"* ]]; then\n                    echo \"label=issued medium\" >> \"$GITHUB_OUTPUT\"\n                  elif [[ \"$PRIORITY\" == \"High\"* ]]; then\n                    echo \"label=issued high\" >> \"$GITHUB_OUTPUT\"\n                  fi\n\n            - name: Add priority label\n              if: steps.priority_label.outputs.label != ''\n              uses: actions-ecosystem/action-add-labels@v1\n              with:\n                  labels: ${{ steps.priority_label.outputs.label }}\n"
  },
  {
    "path": ".github/workflows/issue-triage.yml",
    "content": "name: Issue Triage\n\non:\n    issues:\n        types: [opened, edited, reopened]\n\npermissions:\n    contents: read\n    issues: write\n\nconcurrency:\n    group: issue-${{ github.event.issue.number }}\n    cancel-in-progress: true\n\njobs:\n    label:\n        runs-on: ubuntu-latest\n        steps:\n            - name: Label issue\n              uses: github/issue-labeler@v3.4\n              with:\n                  repo-token: ${{ secrets.GITHUB_TOKEN }}\n                  configuration-path: .github/issue-labeler.yml\n                  enable-versioned-regex: 0\n"
  },
  {
    "path": ".github/workflows/labels-sync.yml",
    "content": "name: Sync Labels\n\non:\n    schedule:\n        - cron: '0 0 */3 * *'\n    workflow_dispatch:\n    push:\n        branches:\n            - main\n        paths:\n            - '.github/labels.yml'\n\npermissions:\n    contents: read\n    issues: write\n\nconcurrency:\n    group: label-sync\n    cancel-in-progress: false\n\njobs:\n    label-sync:\n        runs-on: ubuntu-latest\n        if: github.repository_owner == 'pedroslopez'\n        steps:\n            - uses: actions/checkout@v6\n            - uses: crazy-max/ghaction-github-labeler@v5\n              with:\n                  github-token: ${{ secrets.GITHUB_TOKEN }}\n"
  },
  {
    "path": ".github/workflows/lint.yml",
    "content": "name: Lint\n\non:\n    push:\n    pull_request:\n\njobs:\n    eslint:\n        name: ESLint\n        runs-on: ubuntu-latest\n        steps:\n            - uses: actions/checkout@v2\n            - name: Install node v14\n              uses: actions/setup-node@v2\n              with:\n                  node-version: '14'\n            - name: Install dependencies\n              run: npm install\n            - name: Run ESLint\n              run: ./node_modules/.bin/eslint .\n"
  },
  {
    "path": ".github/workflows/pr-triage.yml",
    "content": "name: PR Triage\n\non:\n    pull_request_target:\n        types:\n            - opened\n            - edited\n            - reopened\n            - synchronize\n\npermissions:\n    contents: read\n    pull-requests: write\n\nconcurrency:\n    group: pr-${{ github.event.pull_request.number }}\n    cancel-in-progress: true\n\njobs:\n    label:\n        name: Label PR\n        if: github.event.action != 'edited'\n        runs-on: ubuntu-latest\n        steps:\n            - name: Label pull request\n              uses: actions/labeler@v5\n              with:\n                  repo-token: ${{ secrets.GITHUB_TOKEN }}\n                  configuration-path: .github/pr-labeler.yml\n                  dot: true\n                  sync-labels: true\n\n    validate-title:\n        name: Validate title\n        runs-on: ubuntu-latest\n        steps:\n            - name: Validate pull request title\n              env:\n                  TITLE: ${{ github.event.pull_request.title }}\n              run: |\n                  REGEX=\"^(revert: )?(feat|fix|docs|style|refactor|perf|test|build|ci|chore|types|infra)(\\\\(.+\\\\))?!?: .{1,72}$\"\n\n                  echo \"Title: \\\"$TITLE\\\"\"\n\n                  shopt -s nocasematch\n                  if [[ ! \"$TITLE\" =~ $REGEX ]]; then\n                    echo \"❌ PR title does not match the required format!\"\n                    exit 1\n                  fi\n"
  },
  {
    "path": ".github/workflows/release.yml",
    "content": "name: Release a New Version\n\non:\n    workflow_dispatch:\n        inputs:\n            release_type:\n                description: 'Release type'\n                required: true\n                default: 'alpha'\n                type: choice\n                options:\n                    - alpha\n                    - alpha-minor\n                    - alpha-major\n                    - release-minor\n                    - release-patch\n\nconcurrency:\n    group: release-${{ github.ref }}\n    cancel-in-progress: false\n\njobs:\n    release:\n        runs-on: ubuntu-latest\n        if: github.repository == 'pedroslopez/whatsapp-web.js'\n        permissions:\n            contents: write\n            id-token: write\n        steps:\n            - name: Checkout\n              uses: actions/checkout@v4\n              with:\n                  token: ${{ secrets.RELEASE_GITHUB_TOKEN }}\n\n            - name: Setup Node.js\n              uses: actions/setup-node@v4\n              with:\n                  node-version: '24'\n                  registry-url: 'https://registry.npmjs.org'\n\n            - name: Configure Git\n              run: |\n                  git config --global user.email \"hello@wwebjs.dev\"\n                  git config --global user.name \"WWebJS Bot\"\n\n            - name: Bump version and publish to NPM\n              id: publish\n              run: ./tools/publish ${{ inputs.release_type }}\n\n            - name: Create GitHub Release\n              uses: ncipollo/release-action@v1\n              with:\n                  prerelease: ${{ steps.publish.outputs.PRERELEASE }}\n                  generateReleaseNotes: true\n                  tag: v${{ steps.publish.outputs.NEW_VERSION }}\n"
  },
  {
    "path": ".github/workflows/stale.yml",
    "content": "name: Mark Stale Issues and PRs\n\non:\n    schedule:\n        - cron: '0 0 * * *'\n    workflow_dispatch:\n\npermissions:\n    issues: write\n    pull-requests: write\n\nconcurrency:\n    group: stale\n    cancel-in-progress: false\n\njobs:\n    stale:\n        if: github.repository_owner == 'pedroslopez'\n        runs-on: ubuntu-latest\n        steps:\n            - name: Mark stale issues and PRs\n              uses: actions/stale@v9\n              with:\n                  repo-token: ${{ secrets.GITHUB_TOKEN }}\n                  days-before-stale: 35\n                  days-before-close: 7\n                  stale-issue-label: 'stale'\n                  stale-pr-label: 'stale'\n                  start-date: '2026-03-03T00:00:00Z'\n                  remove-stale-when-updated: true\n                  exempt-issue-labels: 'pinned,security,feature request,issued high'\n                  exempt-pr-labels: 'pinned,security,whatsapp change,approved,waiting for testers'\n                  stale-issue-message: >\n                      Marking this issue as stale due to inactivity. Comment or update the issue to\n                      keep it open. It will be closed in 7 days otherwise. Thank you for your contributions.\n                  stale-pr-message: >\n                      Marking this pull request as stale due to inactivity. Push changes or comment\n                      to keep it open. It will be closed in 7 days otherwise. Thank you for your contributions.\n                  close-issue-message: >\n                      Closing this issue due to inactivity. Feel free to reopen if it is still relevant.\n                  close-pr-message: >\n                      Closing this pull request due to inactivity. You can reopen it anytime to continue.\n"
  },
  {
    "path": ".github/workflows/tests.yml",
    "content": "name: Tests\n\non:\n    push:\n    pull_request:\n\nconcurrency:\n    group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}\n    cancel-in-progress: true\n\njobs:\n    tests:\n        name: Tests\n        runs-on: ubuntu-latest\n        steps:\n            - name: Checkout repository\n              uses: actions/checkout@v4\n\n            - name: Install Node.js v20\n              uses: actions/setup-node@v4\n              with:\n                  node-version: 20\n\n            - name: Install dependencies\n              run: npm install\n\n            - name: Run Eslint\n              run: npm run lint\n"
  },
  {
    "path": ".github/workflows/update.yml",
    "content": "name: Update\n\non:\n    schedule:\n        - cron: '0 12 * * 0'\n    workflow_dispatch:\n\npermissions:\n    contents: write\n    pull-requests: write\n\nconcurrency:\n    group: wa-update\n    cancel-in-progress: false\n\njobs:\n    update:\n        if: github.repository_owner == 'pedroslopez'\n        runs-on: ubuntu-latest\n        defaults:\n            run:\n                working-directory: ./tools/version-checker\n\n        steps:\n            - name: Checkout\n              uses: actions/checkout@v4\n\n            - name: Setup Node.js\n              uses: actions/setup-node@v4\n              with:\n                  node-version: '20'\n\n            - name: Install dependencies\n              run: npm install\n\n            - name: Run Updater\n              run: ./update-version\n\n            - name: Store WA Version\n              run: echo \"WA_VERSION=$(cat ./.version)\" >> $GITHUB_ENV\n\n            - name: Create Pull Request\n              uses: peter-evans/create-pull-request@v7\n              with:\n                  branch: auto-wa-web-update/patch\n                  delete-branch: true\n                  commit-message: 'chore: update supported WhatsApp Web version to v${{ env.WA_VERSION }}'\n                  title: 'chore: update WhatsApp Web version (${{ env.WA_VERSION }})'\n                  body: |\n                      A new version of WhatsApp Web has been detected!\n\n                      Tests should be run against this new version before merging.\n                  labels: whatsapp change\n                  reviewers: pedroslopez\n"
  },
  {
    "path": ".gitignore",
    "content": "# Logs\nlogs\n*.log\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\n\n# Runtime data\npids\n*.pid\n*.seed\n*.pid.lock\n\n# Directory for instrumented libs generated by jscoverage/JSCover\nlib-cov\n\n# Coverage directory used by tools like istanbul\ncoverage\n\n# nyc test coverage\n.nyc_output\n\n# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)\n.grunt\n\n# Bower dependency directory (https://bower.io/)\nbower_components\n\n# node-waf configuration\n.lock-wscript\n\n# Compiled binary addons (https://nodejs.org/api/addons.html)\nbuild/Release\n\n# Dependency directories\nnode_modules/\njspm_packages/\n\n# Lock files\npackage-lock.json\nyarn.lock\n\n# TypeScript v1 declaration files\ntypings/\n\n# Optional npm cache directory\n.npm\n\n# Optional eslint cache\n.eslintcache\n\n# Optional REPL history\n.node_repl_history\n\n# Output of 'npm pack'\n*.tgz\n\n# Yarn Integrity file\n.yarn-integrity\n\n# dotenv environment variables file\n.env\n\n# next.js build output\n.next\n\n# macOS\n._*\n.DS_Store\n\n# Test sessions\n*session.json\n.wwebjs_auth/\n\n# local version cache\n.wwebjs_cache/\n\n# IDE's\n.idea\n.vscode"
  },
  {
    "path": ".husky/commit-msg",
    "content": "# Normalize commit type to lowercase\nsed -E 's/^[A-Za-z]+/\\L&/' \"$1\" > \"$1.tmp\" && mv \"$1.tmp\" \"$1\"\n\nnpx --no-install commitlint --edit \"$1\"\n"
  },
  {
    "path": ".husky/pre-commit",
    "content": "npx lint-staged\n"
  },
  {
    "path": ".jsdoc.json",
    "content": "{\n    \"tags\": {\n        \"allowUnknownTags\": true,\n        \"dictionaries\": [\"jsdoc\"]\n    },\n    \"source\": {\n        \"include\": [\"src\", \"package.json\", \"README.md\"],\n        \"includePattern\": \".js$\",\n        \"excludePattern\": \"(node_modules/|docs)\"\n    },\n    \"plugins\": [\"plugins/markdown\"],\n    \"templates\": {\n        \"cleverLinks\": false,\n        \"monospaceLinks\": true,\n        \"useLongnameInNav\": false,\n        \"showInheritedInNav\": true\n    },\n    \"opts\": {\n        \"destination\": \"./docs/\",\n        \"encoding\": \"utf8\",\n        \"recurse\": true,\n        \"template\": \"./node_modules/jsdoc-baseline\"\n    }\n}\n"
  },
  {
    "path": ".lintstagedrc.json",
    "content": "{\n    \"*\": \"prettier --ignore-unknown --write\",\n    \"*.{js,ts}\": \"eslint --fix\",\n    \"src/**/*.{js,ts}\": \"eslint --fix\",\n    \"tests/**/*.{js,ts}\": \"eslint --fix\"\n}\n"
  },
  {
    "path": ".npmignore",
    "content": "docs/*\n.github/*\n\n.eslintrc.json\n.jsdoc.json\n.editorconfig\n\nlogs\n*.log\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\n\n*session.json\n.wwebjs_auth/\n.wwebjs_cache/\n\n.env\ntools/\ntests/\n"
  },
  {
    "path": ".prettierignore",
    "content": "node_modules\ndist\ncoverage\n*.min.js\n.wa-version\n.wwebjs_auth\n.wwebjs_cache\ndocs\n"
  },
  {
    "path": ".prettierrc.json",
    "content": "{\n    \"semi\": true,\n    \"trailingComma\": \"all\",\n    \"singleQuote\": true,\n    \"printWidth\": 80,\n    \"tabWidth\": 4,\n    \"useTabs\": false,\n    \"arrowParens\": \"always\",\n    \"endOfLine\": \"lf\"\n}\n"
  },
  {
    "path": "LICENSE",
    "content": "                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright 2019 Pedro S Lopez\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n"
  },
  {
    "path": "README.md",
    "content": "<div align=\"center\">\n    <p>\n        <a href=\"https://wwebjs.dev\">\n            <img src=\"https://github.com/wwebjs/Assets/blob/main/Collection/GitHub/whatsapp-web.js.png?raw=true\"\n                title=\"whatsapp-web.js\" alt=\"WWebJS Website\" />\n        </a>\n    </p>\n    <p>\n        <a href=\"https://www.npmjs.com/package/whatsapp-web.js\"><img\n                src=\"https://img.shields.io/npm/v/whatsapp-web.js.svg\" alt=\"npm\" /></a>\n        <a href=\"https://www.npmjs.com/package/whatsapp-web.js\"><img alt=\"NPM Downloads\"\n                src=\"https://img.shields.io/npm/d18m/whatsapp-web.js\" /></a>\n        <a href=\"https://github.com/pedroslopez/whatsapp-web.js/graphs/contributors\"><img alt=\"GitHub contributors\"\n                src=\"https://img.shields.io/github/contributors-anon/pedroslopez/whatsapp-web.js\" /></a>\n        <a href=\"https://depfu.com/github/pedroslopez/whatsapp-web.js?project_id=9765\"><img\n                src=\"https://badges.depfu.com/badges/4a65a0de96ece65fdf39e294e0c8dcba/overview.svg\" alt=\"Depfu\" /></a>\n        <a href=\"https://discord.wwebjs.dev\"><img\n                src=\"https://img.shields.io/discord/698610475432411196.svg?logo=discord\" alt=\"Discord server\" /></a>\n    </p>\n</div>\n\n## About\n\nwhatsapp‑web.js is a powerful [Node.js][nodejs] library that lets you interact with WhatsApp Web, making it easy to build a dynamic WhatsApp API with nearly all features of the web client. It uses [Puppeteer][puppeteer] to access WhatsApp Web’s internal functions and runs them in a managed browser instance to reduce the risk of being blocked.\n\n## Links\n\n- [GitHub][gitHub]\n- [Guide][guide] ([source][guide-source])\n- [Documentation][documentation] ([source][documentation-source])\n- [Discord Server][discord]\n- [npm][npm]\n\n## Installation\n\n**Node.js `v18.0.0` or higher, is required.**\n\n```sh\nnpm install whatsapp-web.js\nyarn add whatsapp-web.js\npnpm add whatsapp-web.js\n```\n\nHaving trouble installing? Take a peak at the [Guide][guide] for more detailed instructions.\n\n## Example usage\n\n```js\nconst { Client } = require('whatsapp-web.js');\nconst qrcode = require('qrcode-terminal');\n\nconst client = new Client();\n\nclient.on('qr', (qr) => {\n    qrcode.generate(qr, { small: true });\n});\n\nclient.on('ready', () => {\n    console.log('Client is ready!');\n});\n\nclient.on('message', (msg) => {\n    if (msg.body == '!ping') {\n        msg.reply('pong');\n    }\n});\n\nclient.initialize();\n```\n\nTake a look at [example.js][examples] for additional examples and use cases.  \nFor more details on saving and restoring sessions, check out the [Authentication Strategies][auth-strategies].\n\n## Supported features\n\n| Feature                                          | Status                                       |\n| ------------------------------------------------ | -------------------------------------------- |\n| Multi Device                                     | ✅                                           |\n| Send messages                                    | ✅                                           |\n| Receive messages                                 | ✅                                           |\n| Send media (images/audio/documents)              | ✅                                           |\n| Send media (video)                               | ✅ [(requires Google Chrome)][google-chrome] |\n| Send stickers                                    | ✅                                           |\n| Receive media (images/audio/video/documents)     | ✅                                           |\n| Send contact cards                               | ✅                                           |\n| Send location                                    | ✅                                           |\n| Send buttons                                     | ❌ [(DEPRECATED)][deprecated-video]          |\n| Send lists                                       | ❌ [(DEPRECATED)][deprecated-video]          |\n| Receive location                                 | ✅                                           |\n| Message replies                                  | ✅                                           |\n| Join groups by invite                            | ✅                                           |\n| Get invite for group                             | ✅                                           |\n| Modify group info (subject, description)         | ✅                                           |\n| Modify group settings (send messages, edit info) | ✅                                           |\n| Add group participants                           | ✅                                           |\n| Kick group participants                          | ✅                                           |\n| Promote/demote group participants                | ✅                                           |\n| Mention users                                    | ✅                                           |\n| Mention groups                                   | ✅                                           |\n| Mute/unmute chats                                | ✅                                           |\n| Block/unblock contacts                           | ✅                                           |\n| Get contact info                                 | ✅                                           |\n| Get profile pictures                             | ✅                                           |\n| Set user status message                          | ✅                                           |\n| React to messages                                | ✅                                           |\n| Create polls                                     | ✅                                           |\n| Channels                                         | ✅                                           |\n| Vote in polls                                    | ✅                                           |\n| Communities                                      | 🔜                                           |\n\nSomething missing? Make an issue and let us know!\n\n## Supporting the project\n\nYou can support the maintainer of this project through the links below:\n\n- [Support via GitHub Sponsors][gitHub-sponsors]\n- [Support via PayPal][support-payPal]\n\n## Contributing\n\nFeel free to open pull requests; we welcome contributions! However, for significant changes, it's best to open an issue beforehand. Make sure to review our [contribution guidelines][contributing] before creating a pull request. Before creating your own issue or pull request, always check to see if one already exists!\n\n## Disclaimer\n\nThis project is not affiliated, associated, authorized, endorsed by, or in any way officially connected with WhatsApp or any of its subsidiaries or its affiliates. The official WhatsApp website can be found at [whatsapp.com][whatsapp]. \"WhatsApp\" as well as related names, marks, emblems and images are registered trademarks of their respective owners. Also it is not guaranteed you will not be blocked by using this method. WhatsApp does not allow bots or unofficial clients on their platform, so this shouldn't be considered totally safe.\n\n## License\n\nCopyright 2019 Pedro S Lopez\n\nLicensed under the Apache License, Version 2.0 (the \"License\");  \nyou may not use this project except in compliance with the License.  \nYou may obtain a copy of the License at <https://www.apache.org/licenses/LICENSE-2.0>.\n\nUnless required by applicable law or agreed to in writing, software  \ndistributed under the License is distributed on an \"AS IS\" BASIS,  \nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  \nSee the License for the specific language governing permissions and  \nlimitations under the License.\n\n[guide]: https://guide.wwebjs.dev/guide\n[guide-source]: https://github.com/wwebjs/wwebjs.dev/tree/main\n[documentation]: https://docs.wwebjs.dev/\n[documentation-source]: https://github.com/pedroslopez/whatsapp-web.js/tree/main/docs\n[discord]: https://discord.wwebjs.dev\n[gitHub]: https://github.com/pedroslopez/whatsapp-web.js\n[npm]: https://npmjs.org/package/whatsapp-web.js\n[nodejs]: https://nodejs.org/en/download/\n[examples]: https://github.com/pedroslopez/whatsapp-web.js/blob/main/example.js\n[auth-strategies]: https://wwebjs.dev/guide/creating-your-bot/authentication.html\n[google-chrome]: https://wwebjs.dev/guide/creating-your-bot/handling-attachments.html#caveat-for-sending-videos-and-gifs\n[deprecated-video]: https://www.youtube.com/watch?v=hv1R1rLeVVE\n[gitHub-sponsors]: https://github.com/sponsors/pedroslopez\n[support-payPal]: https://www.paypal.me/psla/\n[contributing]: .github/CONTRIBUTING.md\n[whatsapp]: https://whatsapp.com\n[puppeteer]: https://pptr.dev/\n"
  },
  {
    "path": "commitlint.config.js",
    "content": "module.exports = {\n    extends: ['@commitlint/config-conventional'],\n    rules: {\n        'header-max-length': [2, 'always', 72],\n        'type-enum': [\n            2,\n            'always',\n            [\n                'feat',\n                'fix',\n                'docs',\n                'style',\n                'refactor',\n                'perf',\n                'test',\n                'build',\n                'ci',\n                'chore',\n                'types',\n                'revert',\n                'infra',\n            ],\n        ],\n        'type-case': [0],\n        'scope-case': [0],\n        'subject-case': [0],\n        'subject-exclamation-mark': [0],\n    },\n};\n"
  },
  {
    "path": "docs/Base.html",
    "content": "<!doctype html>\n<html>\n\n<head>\n  <meta name=\"generator\" content=\"JSDoc 3.6.11\">\n  <meta charset=\"utf-8\">\n  <title>whatsapp-web.js 1.34.6 &raquo; Class: Base</title>\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Karla:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Noto+Serif:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Inconsolata:500\" type=\"text/css\">\n  <link href=\"css/baseline.css\" rel=\"stylesheet\">\n</head>\n\n<body onload=\"prettyPrint()\">\n  <nav id=\"jsdoc-navbar\" role=\"navigation\" class=\"jsdoc-navbar\">\n    <div id=\"jsdoc-navbar-container\">\n      <div id=\"jsdoc-navbar-content\">\n        <a href=\"index.html\" class=\"jsdoc-navbar-package-name\">whatsapp-web.<wbr>js 1.<wbr>34.<wbr>6</a>\n      </div>\n    </div>\n  </nav>\n  <div id=\"jsdoc-body-container\">\n    <div id=\"jsdoc-content\">\n      <div id=\"jsdoc-content-container\">\n        <div id=\"jsdoc-main\" role=\"main\">\n          <header class=\"page-header\">\n            <div class=\"symbol-detail-labels\"><span class=\"label label-kind\">class</span></div>\n            <h1><small></small><span class=\"symbol-name\">Base</span></h1>\n            <p class=\"source-link\">Source: <a href=\"structures_Base.js.html#source-line-6\">structures/<wbr>Base.<wbr>js:6</a></p>\n            <div class=\"symbol-classdesc\">\n              <p>Represents a WhatsApp data structure</p>\n            </div>\n            <dl class=\"dl-compact\">\n            </dl>\n          </header>\n          <section id=\"summary\">\n          </section>\n          <section>\n            <h2 id=\"Base\">new&nbsp;<span class=\"symbol-name\">Base</span><span class=\"signature\"><span class=\"signature-params\">()</span></span></h2>\n            <dl class=\"dl-compact\">\n            </dl>\n          </section>\n          <section>\n          </section>\n        </div>\n      </div>\n      <nav id=\"jsdoc-toc-nav\" role=\"navigation\"></nav>\n    </div>\n  </div>\n  <footer id=\"jsdoc-footer\" class=\"jsdoc-footer\">\n    <div id=\"jsdoc-footer-container\">\n      <p>\n        Generated by <a href=\"https://github.com/jsdoc3/jsdoc\">JSDoc</a> 3.6.11 on January 30, 2026.\n      </p>\n    </div>\n  </footer>\n  <script src=\"scripts/jquery.min.js\"></script>\n  <script src=\"scripts/tree.jquery.js\"></script>\n  <script src=\"scripts/prettify.js\"></script>\n  <script src=\"scripts/jsdoc-toc.js\"></script>\n  <script src=\"scripts/linenumber.js\"></script>\n  <script src=\"scripts/scrollanchor.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "docs/BaseAuthStrategy.html",
    "content": "<!doctype html>\n<html>\n\n<head>\n  <meta name=\"generator\" content=\"JSDoc 3.6.11\">\n  <meta charset=\"utf-8\">\n  <title>whatsapp-web.js 1.34.6 &raquo; Class: BaseAuthStrategy</title>\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Karla:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Noto+Serif:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Inconsolata:500\" type=\"text/css\">\n  <link href=\"css/baseline.css\" rel=\"stylesheet\">\n</head>\n\n<body onload=\"prettyPrint()\">\n  <nav id=\"jsdoc-navbar\" role=\"navigation\" class=\"jsdoc-navbar\">\n    <div id=\"jsdoc-navbar-container\">\n      <div id=\"jsdoc-navbar-content\">\n        <a href=\"index.html\" class=\"jsdoc-navbar-package-name\">whatsapp-web.<wbr>js 1.<wbr>34.<wbr>6</a>\n      </div>\n    </div>\n  </nav>\n  <div id=\"jsdoc-body-container\">\n    <div id=\"jsdoc-content\">\n      <div id=\"jsdoc-content-container\">\n        <div id=\"jsdoc-main\" role=\"main\">\n          <header class=\"page-header\">\n            <div class=\"symbol-detail-labels\"><span class=\"label label-kind\">class</span></div>\n            <h1><small></small><span class=\"symbol-name\">BaseAuthStrategy</span></h1>\n            <p class=\"source-link\">Source: <a href=\"authStrategies_BaseAuthStrategy.js.html#source-line-6\">authStrategies/<wbr>BaseAuthStrategy.<wbr>js:6</a></p>\n            <div class=\"symbol-classdesc\">\n              <p>Base class which all authentication strategies extend</p>\n            </div>\n            <dl class=\"dl-compact\">\n            </dl>\n          </header>\n          <section id=\"summary\">\n          </section>\n          <section>\n            <h2 id=\"BaseAuthStrategy\">new&nbsp;<span class=\"symbol-name\">BaseAuthStrategy</span><span class=\"signature\"><span class=\"signature-params\">()</span></span></h2>\n            <dl class=\"dl-compact\">\n            </dl>\n          </section>\n          <section>\n          </section>\n        </div>\n      </div>\n      <nav id=\"jsdoc-toc-nav\" role=\"navigation\"></nav>\n    </div>\n  </div>\n  <footer id=\"jsdoc-footer\" class=\"jsdoc-footer\">\n    <div id=\"jsdoc-footer-container\">\n      <p>\n        Generated by <a href=\"https://github.com/jsdoc3/jsdoc\">JSDoc</a> 3.6.11 on January 30, 2026.\n      </p>\n    </div>\n  </footer>\n  <script src=\"scripts/jquery.min.js\"></script>\n  <script src=\"scripts/tree.jquery.js\"></script>\n  <script src=\"scripts/prettify.js\"></script>\n  <script src=\"scripts/jsdoc-toc.js\"></script>\n  <script src=\"scripts/linenumber.js\"></script>\n  <script src=\"scripts/scrollanchor.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "docs/Broadcast.html",
    "content": "<!doctype html>\n<html>\n\n<head>\n  <meta name=\"generator\" content=\"JSDoc 3.6.11\">\n  <meta charset=\"utf-8\">\n  <title>whatsapp-web.js 1.34.6 &raquo; Class: Broadcast</title>\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Karla:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Noto+Serif:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Inconsolata:500\" type=\"text/css\">\n  <link href=\"css/baseline.css\" rel=\"stylesheet\">\n</head>\n\n<body onload=\"prettyPrint()\">\n  <nav id=\"jsdoc-navbar\" role=\"navigation\" class=\"jsdoc-navbar\">\n    <div id=\"jsdoc-navbar-container\">\n      <div id=\"jsdoc-navbar-content\">\n        <a href=\"index.html\" class=\"jsdoc-navbar-package-name\">whatsapp-web.<wbr>js 1.<wbr>34.<wbr>6</a>\n      </div>\n    </div>\n  </nav>\n  <div id=\"jsdoc-body-container\">\n    <div id=\"jsdoc-content\">\n      <div id=\"jsdoc-content-container\">\n        <div id=\"jsdoc-main\" role=\"main\">\n          <header class=\"page-header\">\n            <div class=\"symbol-detail-labels\"><span class=\"label label-kind\">class</span></div>\n            <h1><small></small><span class=\"symbol-name\">Broadcast</span></h1>\n            <p class=\"source-link\">Source: <a href=\"structures_Broadcast.js.html#source-line-10\">structures/<wbr>Broadcast.<wbr>js:10</a></p>\n            <div class=\"symbol-classdesc\">\n              <p>Represents a Status/Story on WhatsApp</p>\n            </div>\n            <dl class=\"dl-compact\">\n            </dl>\n          </header>\n          <section id=\"summary\">\n            <div class=\"summary-callout\">\n              <h2 class=\"summary-callout-heading\">Properties</h2>\n              <div class=\"summary-content\">\n                <div class=\"summary-column\">\n                  <dl class=\"dl-summary-callout\">\n                    <dt><a href=\"Broadcast.html#id\">id</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Broadcast.html#msgs\">msgs</a></dt>\n                    <dd>\n                    </dd>\n                  </dl>\n                </div>\n                <div class=\"summary-column\">\n                  <dl class=\"dl-summary-callout\">\n                    <dt><a href=\"Broadcast.html#timestamp\">timestamp</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Broadcast.html#totalCount\">totalCount</a></dt>\n                    <dd>\n                    </dd>\n                  </dl>\n                </div>\n                <div class=\"summary-column\">\n                  <dl class=\"dl-summary-callout\">\n                    <dt><a href=\"Broadcast.html#unreadCount\">unreadCount</a></dt>\n                    <dd>\n                    </dd>\n                  </dl>\n                </div>\n              </div>\n            </div>\n            <div class=\"summary-callout\">\n              <h2 class=\"summary-callout-heading\">Methods</h2>\n              <div class=\"summary-content\">\n                <div class=\"summary-column\">\n                  <dl class=\"dl-summary-callout\">\n                    <dt><a href=\"Broadcast.html#getChat\">getChat()</a></dt>\n                    <dd>\n                    </dd>\n                  </dl>\n                </div>\n                <div class=\"summary-column\">\n                  <dl class=\"dl-summary-callout\">\n                    <dt><a href=\"Broadcast.html#getContact\">getContact()</a></dt>\n                    <dd>\n                    </dd>\n                  </dl>\n                </div>\n                <div class=\"summary-column\">\n                </div>\n              </div>\n            </div>\n          </section>\n          <section>\n            <h2 id=\"Broadcast\">new&nbsp;<span class=\"symbol-name\">Broadcast</span><span class=\"signature\"><span class=\"signature-params\">()</span></span></h2>\n            <dl class=\"dl-compact\">\n              <dt>Extends</dt>\n              <dd><a href=\"Base.html\">Base</a></dd>\n            </dl>\n          </section>\n          <section>\n            <h2>Properties</h2>\n            <section>\n              <h3 id=\"id\"><span class=\"symbol-name\">id</span><small class=\"property-type\">\n                  &nbsp;object</small></h3>\n              <p>ID that represents the chat</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"msgs\"><span class=\"symbol-name\">msgs</span><small class=\"property-type\">\n                  &nbsp;Array of <a href=\"Message.html\">Message</a></small></h3>\n              <p>Messages statuses</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"timestamp\"><span class=\"symbol-name\">timestamp</span><small class=\"property-type\">\n                  &nbsp;number</small></h3>\n              <p>Unix timestamp of last status</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"totalCount\"><span class=\"symbol-name\">totalCount</span><small class=\"property-type\">\n                  &nbsp;number</small></h3>\n              <p>Number of available statuses</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"unreadCount\"><span class=\"symbol-name\">unreadCount</span><small class=\"property-type\">\n                  &nbsp;number</small></h3>\n              <p>Number of not viewed</p>\n              <dl class=\"dl-compact\">\n              </dl>\n            </section>\n            <h2>Methods</h2>\n            <section>\n              <h3 id=\"getChat\"><span class=\"symbol-name\">getChat</span><span class=\"signature\"><span class=\"signature-params\">()</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing <a href=\"Chat.html\">Chat</a></span></span></h3>\n              <p>Returns the Chat this message was sent in</p>\n              <dl class=\"dl-compact\">\n                <dt>Returns</dt>\n                <dd>\n                  <p><code>Promise containing <a href=\"Chat.html\">Chat</a></code> </p>\n                </dd>\n              </dl>\n              <h3 id=\"getContact\"><span class=\"symbol-name\">getContact</span><span class=\"signature\"><span class=\"signature-params\">()</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing <a href=\"Contact.html\">Contact</a></span></span></h3>\n              <p>Returns the Contact this message was sent from</p>\n              <dl class=\"dl-compact\">\n                <dt>Returns</dt>\n                <dd>\n                  <p><code>Promise containing <a href=\"Contact.html\">Contact</a></code> </p>\n                </dd>\n              </dl>\n            </section>\n          </section>\n        </div>\n      </div>\n      <nav id=\"jsdoc-toc-nav\" role=\"navigation\"></nav>\n    </div>\n  </div>\n  <footer id=\"jsdoc-footer\" class=\"jsdoc-footer\">\n    <div id=\"jsdoc-footer-container\">\n      <p>\n        Generated by <a href=\"https://github.com/jsdoc3/jsdoc\">JSDoc</a> 3.6.11 on January 30, 2026.\n      </p>\n    </div>\n  </footer>\n  <script src=\"scripts/jquery.min.js\"></script>\n  <script src=\"scripts/tree.jquery.js\"></script>\n  <script src=\"scripts/prettify.js\"></script>\n  <script src=\"scripts/jsdoc-toc.js\"></script>\n  <script src=\"scripts/linenumber.js\"></script>\n  <script src=\"scripts/scrollanchor.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "docs/BusinessContact.html",
    "content": "<!doctype html>\n<html>\n\n<head>\n  <meta name=\"generator\" content=\"JSDoc 3.6.11\">\n  <meta charset=\"utf-8\">\n  <title>whatsapp-web.js 1.34.6 &raquo; Class: BusinessContact</title>\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Karla:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Noto+Serif:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Inconsolata:500\" type=\"text/css\">\n  <link href=\"css/baseline.css\" rel=\"stylesheet\">\n</head>\n\n<body onload=\"prettyPrint()\">\n  <nav id=\"jsdoc-navbar\" role=\"navigation\" class=\"jsdoc-navbar\">\n    <div id=\"jsdoc-navbar-container\">\n      <div id=\"jsdoc-navbar-content\">\n        <a href=\"index.html\" class=\"jsdoc-navbar-package-name\">whatsapp-web.<wbr>js 1.<wbr>34.<wbr>6</a>\n      </div>\n    </div>\n  </nav>\n  <div id=\"jsdoc-body-container\">\n    <div id=\"jsdoc-content\">\n      <div id=\"jsdoc-content-container\">\n        <div id=\"jsdoc-main\" role=\"main\">\n          <header class=\"page-header\">\n            <div class=\"symbol-detail-labels\"><span class=\"label label-kind\">class</span></div>\n            <h1><small></small><span class=\"symbol-name\">BusinessContact</span></h1>\n            <p class=\"source-link\">Source: <a href=\"structures_BusinessContact.js.html#source-line-9\">structures/<wbr>BusinessContact.<wbr>js:9</a></p>\n            <div class=\"symbol-classdesc\">\n              <p>Represents a Business Contact on WhatsApp</p>\n            </div>\n            <dl class=\"dl-compact\">\n            </dl>\n          </header>\n          <section id=\"summary\">\n            <div class=\"summary-callout\">\n              <h2 class=\"summary-callout-heading\">Properties</h2>\n              <div class=\"summary-content\">\n                <div class=\"summary-column\">\n                  <dl class=\"dl-summary-callout\">\n                    <dt><a href=\"BusinessContact.html#businessProfile\">businessProfile</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"BusinessContact.html#id\">id</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"BusinessContact.html#isBlocked\">isBlocked</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"BusinessContact.html#isBusiness\">isBusiness</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"BusinessContact.html#isEnterprise\">isEnterprise</a></dt>\n                    <dd>\n                    </dd>\n                  </dl>\n                </div>\n                <div class=\"summary-column\">\n                  <dl class=\"dl-summary-callout\">\n                    <dt><a href=\"BusinessContact.html#isGroup\">isGroup</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"BusinessContact.html#isMe\">isMe</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"BusinessContact.html#isMyContact\">isMyContact</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"BusinessContact.html#isUser\">isUser</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"BusinessContact.html#isWAContact\">isWAContact</a></dt>\n                    <dd>\n                    </dd>\n                  </dl>\n                </div>\n                <div class=\"summary-column\">\n                  <dl class=\"dl-summary-callout\">\n                    <dt><a href=\"BusinessContact.html#name\">name</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"BusinessContact.html#number\">number</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"BusinessContact.html#pushname\">pushname</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"BusinessContact.html#shortName\">shortName</a></dt>\n                    <dd>\n                    </dd>\n                  </dl>\n                </div>\n              </div>\n            </div>\n            <div class=\"summary-callout\">\n              <h2 class=\"summary-callout-heading\">Methods</h2>\n              <div class=\"summary-content\">\n                <div class=\"summary-column\">\n                  <dl class=\"dl-summary-callout\">\n                    <dt><a href=\"BusinessContact.html#block\">block()</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"BusinessContact.html#getAbout\">getAbout()</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"BusinessContact.html#getBroadcast\">getBroadcast()</a></dt>\n                    <dd>\n                    </dd>\n                  </dl>\n                </div>\n                <div class=\"summary-column\">\n                  <dl class=\"dl-summary-callout\">\n                    <dt><a href=\"BusinessContact.html#getChat\">getChat()</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"BusinessContact.html#getCommonGroups\">getCommonGroups()</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"BusinessContact.html#getCountryCode\">getCountryCode()</a></dt>\n                    <dd>\n                    </dd>\n                  </dl>\n                </div>\n                <div class=\"summary-column\">\n                  <dl class=\"dl-summary-callout\">\n                    <dt><a href=\"BusinessContact.html#getFormattedNumber\">getFormattedNumber()</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"BusinessContact.html#getProfilePicUrl\">getProfilePicUrl()</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"BusinessContact.html#unblock\">unblock()</a></dt>\n                    <dd>\n                    </dd>\n                  </dl>\n                </div>\n              </div>\n            </div>\n          </section>\n          <section>\n            <h2 id=\"BusinessContact\">new&nbsp;<span class=\"symbol-name\">BusinessContact</span><span class=\"signature\"><span class=\"signature-params\">()</span></span></h2>\n            <dl class=\"dl-compact\">\n              <dt>Extends</dt>\n              <dd><a href=\"Contact.html\">Contact</a></dd>\n            </dl>\n          </section>\n          <section>\n            <h2>Properties</h2>\n            <section>\n              <h3 id=\"businessProfile\"><span class=\"symbol-name\">businessProfile</span></h3>\n              <p>The contact's business profile</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"id\"><span class=\"symbol-name\">id</span><small class=\"property-type\">\n                  &nbsp;unknown</small></h3>\n              <p>ID that represents the contact</p>\n              <dl class=\"dl-compact\">\n                <dt>Inherited from</dt>\n                <dd><a href=\"Contact.html#id\">Contact#id</a></dd>\n              </dl>\n              <h3 id=\"isBlocked\"><span class=\"symbol-name\">isBlocked</span><small class=\"property-type\">\n                  &nbsp;unknown</small></h3>\n              <p>Indicates if you have blocked this contact</p>\n              <dl class=\"dl-compact\">\n                <dt>Inherited from</dt>\n                <dd><a href=\"Contact.html#isBlocked\">Contact#isBlocked</a></dd>\n              </dl>\n              <h3 id=\"isBusiness\"><span class=\"symbol-name\">isBusiness</span><small class=\"property-type\">\n                  &nbsp;unknown</small></h3>\n              <p>Indicates if the contact is a business contact</p>\n              <dl class=\"dl-compact\">\n                <dt>Inherited from</dt>\n                <dd><a href=\"Contact.html#isBusiness\">Contact#isBusiness</a></dd>\n              </dl>\n              <h3 id=\"isEnterprise\"><span class=\"symbol-name\">isEnterprise</span><small class=\"property-type\">\n                  &nbsp;unknown</small></h3>\n              <p>Indicates if the contact is an enterprise contact</p>\n              <dl class=\"dl-compact\">\n                <dt>Inherited from</dt>\n                <dd><a href=\"Contact.html#isEnterprise\">Contact#isEnterprise</a></dd>\n              </dl>\n              <h3 id=\"isGroup\"><span class=\"symbol-name\">isGroup</span><small class=\"property-type\">\n                  &nbsp;unknown</small></h3>\n              <p>Indicates if the contact is a group contact</p>\n              <dl class=\"dl-compact\">\n                <dt>Inherited from</dt>\n                <dd><a href=\"Contact.html#isGroup\">Contact#isGroup</a></dd>\n              </dl>\n              <h3 id=\"isMe\"><span class=\"symbol-name\">isMe</span><small class=\"property-type\">\n                  &nbsp;unknown</small></h3>\n              <p>Indicates if the contact is the current user's contact</p>\n              <dl class=\"dl-compact\">\n                <dt>Inherited from</dt>\n                <dd><a href=\"Contact.html#isMe\">Contact#isMe</a></dd>\n              </dl>\n              <h3 id=\"isMyContact\"><span class=\"symbol-name\">isMyContact</span><small class=\"property-type\">\n                  &nbsp;unknown</small></h3>\n              <p>Indicates if the number is saved in the current phone's contacts</p>\n              <dl class=\"dl-compact\">\n                <dt>Inherited from</dt>\n                <dd><a href=\"Contact.html#isMyContact\">Contact#isMyContact</a></dd>\n              </dl>\n              <h3 id=\"isUser\"><span class=\"symbol-name\">isUser</span><small class=\"property-type\">\n                  &nbsp;unknown</small></h3>\n              <p>Indicates if the contact is a user contact</p>\n              <dl class=\"dl-compact\">\n                <dt>Inherited from</dt>\n                <dd><a href=\"Contact.html#isUser\">Contact#isUser</a></dd>\n              </dl>\n              <h3 id=\"isWAContact\"><span class=\"symbol-name\">isWAContact</span><small class=\"property-type\">\n                  &nbsp;unknown</small></h3>\n              <p>Indicates if the number is registered on WhatsApp</p>\n              <dl class=\"dl-compact\">\n                <dt>Inherited from</dt>\n                <dd><a href=\"Contact.html#isWAContact\">Contact#isWAContact</a></dd>\n              </dl>\n              <h3 id=\"name\"><span class=\"symbol-name\">name</span><small class=\"property-type\">\n                  &nbsp;unknown</small></h3>\n              <p>The contact's name, as saved by the current user</p>\n              <dl class=\"dl-compact\">\n                <dt>Inherited from</dt>\n                <dd><a href=\"Contact.html#name\">Contact#name</a></dd>\n              </dl>\n              <h3 id=\"number\"><span class=\"symbol-name\">number</span><small class=\"property-type\">\n                  &nbsp;unknown</small></h3>\n              <p>Contact's phone number</p>\n              <dl class=\"dl-compact\">\n                <dt>Inherited from</dt>\n                <dd><a href=\"Contact.html#number\">Contact#number</a></dd>\n              </dl>\n              <h3 id=\"pushname\"><span class=\"symbol-name\">pushname</span><small class=\"property-type\">\n                  &nbsp;unknown</small></h3>\n              <p>The name that the contact has configured to be shown publically</p>\n              <dl class=\"dl-compact\">\n                <dt>Inherited from</dt>\n                <dd><a href=\"Contact.html#pushname\">Contact#pushname</a></dd>\n              </dl>\n              <h3 id=\"shortName\"><span class=\"symbol-name\">shortName</span><small class=\"property-type\">\n                  &nbsp;unknown</small></h3>\n              <p>A shortened version of name</p>\n              <dl class=\"dl-compact\">\n                <dt>Inherited from</dt>\n                <dd><a href=\"Contact.html#shortName\">Contact#shortName</a></dd>\n              </dl>\n            </section>\n            <h2>Methods</h2>\n            <section>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"block\"><span class=\"symbol-name\">block</span><span class=\"signature\"><span class=\"signature-params\">()</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing boolean</span></span></h3>\n              <p>Blocks this contact from WhatsApp</p>\n              <dl class=\"dl-compact\">\n                <dt>Inherited from</dt>\n                <dd><a href=\"Contact.html#block\">Contact#block</a></dd>\n                <dt>Returns</dt>\n                <dd></dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"getAbout\"><span class=\"symbol-name\">getAbout</span><span class=\"signature\"><span class=\"signature-params\">()</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing nullable string</span></span></h3>\n              <p>Gets the Contact's current &quot;about&quot; info. Returns null if you don't have permission to read their status.</p>\n              <dl class=\"dl-compact\">\n                <dt>Inherited from</dt>\n                <dd><a href=\"Contact.html#getAbout\">Contact#getAbout</a></dd>\n                <dt>Returns</dt>\n                <dd></dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"getBroadcast\"><span class=\"symbol-name\">getBroadcast</span><span class=\"signature\"><span class=\"signature-params\">()</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing <a href=\"Broadcast.html\">Broadcast</a></span></span></h3>\n              <p>Gets the Contact's current status broadcast.</p>\n              <dl class=\"dl-compact\">\n                <dt>Inherited from</dt>\n                <dd><a href=\"Contact.html#getBroadcast\">Contact#getBroadcast</a></dd>\n                <dt>Returns</dt>\n                <dd></dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"getChat\"><span class=\"symbol-name\">getChat</span><span class=\"signature\"><span class=\"signature-params\">()</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing <a href=\"Chat.html\">Chat</a></span></span></h3>\n              <p>Returns the Chat that corresponds to this Contact.\n                Will return null when getting chat for currently logged in user.</p>\n              <dl class=\"dl-compact\">\n                <dt>Inherited from</dt>\n                <dd><a href=\"Contact.html#getChat\">Contact#getChat</a></dd>\n                <dt>Returns</dt>\n                <dd></dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"getCommonGroups\"><span class=\"symbol-name\">getCommonGroups</span><span class=\"signature\"><span class=\"signature-params\">()</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing Array of WAWebJS.ChatId</span></span></h3>\n              <p>Gets the Contact's common groups with you. Returns empty array if you don't have any common group.</p>\n              <dl class=\"dl-compact\">\n                <dt>Inherited from</dt>\n                <dd><a href=\"Contact.html#getCommonGroups\">Contact#getCommonGroups</a></dd>\n                <dt>Returns</dt>\n                <dd></dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"getCountryCode\"><span class=\"symbol-name\">getCountryCode</span><span class=\"signature\"><span class=\"signature-params\">()</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing string</span></span></h3>\n              <p>Returns the contact's countrycode, (1541859685@c.us) =&gt; (1)</p>\n              <dl class=\"dl-compact\">\n                <dt>Inherited from</dt>\n                <dd><a href=\"Contact.html#getCountryCode\">Contact#getCountryCode</a></dd>\n                <dt>Returns</dt>\n                <dd></dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"getFormattedNumber\"><span class=\"symbol-name\">getFormattedNumber</span><span class=\"signature\"><span class=\"signature-params\">()</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing string</span></span></h3>\n              <p>Returns the contact's formatted phone number, (12345678901@c.us) =&gt; (+1 (234) 5678-901)</p>\n              <dl class=\"dl-compact\">\n                <dt>Inherited from</dt>\n                <dd><a href=\"Contact.html#getFormattedNumber\">Contact#getFormattedNumber</a></dd>\n                <dt>Returns</dt>\n                <dd></dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"getProfilePicUrl\"><span class=\"symbol-name\">getProfilePicUrl</span><span class=\"signature\"><span class=\"signature-params\">()</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing string</span></span></h3>\n              <p>Returns the contact's profile picture URL, if privacy settings allow it</p>\n              <dl class=\"dl-compact\">\n                <dt>Inherited from</dt>\n                <dd><a href=\"Contact.html#getProfilePicUrl\">Contact#getProfilePicUrl</a></dd>\n                <dt>Returns</dt>\n                <dd></dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"unblock\"><span class=\"symbol-name\">unblock</span><span class=\"signature\"><span class=\"signature-params\">()</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing boolean</span></span></h3>\n              <p>Unblocks this contact from WhatsApp</p>\n              <dl class=\"dl-compact\">\n                <dt>Inherited from</dt>\n                <dd><a href=\"Contact.html#unblock\">Contact#unblock</a></dd>\n                <dt>Returns</dt>\n                <dd></dd>\n              </dl>\n            </section>\n          </section>\n        </div>\n      </div>\n      <nav id=\"jsdoc-toc-nav\" role=\"navigation\"></nav>\n    </div>\n  </div>\n  <footer id=\"jsdoc-footer\" class=\"jsdoc-footer\">\n    <div id=\"jsdoc-footer-container\">\n      <p>\n        Generated by <a href=\"https://github.com/jsdoc3/jsdoc\">JSDoc</a> 3.6.11 on January 30, 2026.\n      </p>\n    </div>\n  </footer>\n  <script src=\"scripts/jquery.min.js\"></script>\n  <script src=\"scripts/tree.jquery.js\"></script>\n  <script src=\"scripts/prettify.js\"></script>\n  <script src=\"scripts/jsdoc-toc.js\"></script>\n  <script src=\"scripts/linenumber.js\"></script>\n  <script src=\"scripts/scrollanchor.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "docs/Buttons.html",
    "content": "<!doctype html>\n<html>\n\n<head>\n  <meta name=\"generator\" content=\"JSDoc 3.6.11\">\n  <meta charset=\"utf-8\">\n  <title>whatsapp-web.js 1.34.6 &raquo; Class: Buttons</title>\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Karla:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Noto+Serif:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Inconsolata:500\" type=\"text/css\">\n  <link href=\"css/baseline.css\" rel=\"stylesheet\">\n</head>\n\n<body onload=\"prettyPrint()\">\n  <nav id=\"jsdoc-navbar\" role=\"navigation\" class=\"jsdoc-navbar\">\n    <div id=\"jsdoc-navbar-container\">\n      <div id=\"jsdoc-navbar-content\">\n        <a href=\"index.html\" class=\"jsdoc-navbar-package-name\">whatsapp-web.<wbr>js 1.<wbr>34.<wbr>6</a>\n      </div>\n    </div>\n  </nav>\n  <div id=\"jsdoc-body-container\">\n    <div id=\"jsdoc-content\">\n      <div id=\"jsdoc-content-container\">\n        <div id=\"jsdoc-main\" role=\"main\">\n          <header class=\"page-header\">\n            <div class=\"symbol-detail-labels\"><span class=\"label label-kind\">class</span></div>\n            <h1><small></small><span class=\"symbol-name\">Buttons</span></h1>\n            <p class=\"source-link\">Source: <a href=\"structures_Buttons.js.html#source-line-23\">structures/<wbr>Buttons.<wbr>js:23</a></p>\n            <div class=\"symbol-classdesc\">\n              <p>Message type buttons</p>\n            </div>\n            <dl class=\"dl-compact\">\n            </dl>\n          </header>\n          <section id=\"summary\">\n            <div class=\"summary-callout\">\n              <h2 class=\"summary-callout-heading\">Properties</h2>\n              <div class=\"summary-content\">\n                <div class=\"summary-column\">\n                  <dl class=\"dl-summary-callout\">\n                    <dt><a href=\"Buttons.html#body\">body</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Buttons.html#buttons\">buttons</a></dt>\n                    <dd>\n                    </dd>\n                  </dl>\n                </div>\n                <div class=\"summary-column\">\n                  <dl class=\"dl-summary-callout\">\n                    <dt><a href=\"Buttons.html#footer\">footer</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Buttons.html#title\">title</a></dt>\n                    <dd>\n                    </dd>\n                  </dl>\n                </div>\n                <div class=\"summary-column\">\n                </div>\n              </div>\n            </div>\n            <div class=\"summary-callout\">\n              <h2 class=\"summary-callout-heading\">Method</h2>\n              <div class=\"summary-content\">\n                <div class=\"summary-column\">\n                  <dl class=\"dl-summary-callout\">\n                    <dt><a href=\"Buttons.html#_format\">_format(buttons)</a></dt>\n                    <dd>\n                    </dd>\n                  </dl>\n                </div>\n                <div class=\"summary-column\">\n                </div>\n                <div class=\"summary-column\">\n                </div>\n              </div>\n            </div>\n          </section>\n          <section>\n            <h2 id=\"Buttons\">new&nbsp;<span class=\"symbol-name\">Buttons</span><span class=\"signature\"><span class=\"signature-params\">(body, buttons, title, footer)</span></span></h2>\n            <section>\n              <h3>Parameters</h3>\n              <table class=\"jsdoc-details-table\">\n                <thead>\n                  <tr>\n                    <th>Name</th>\n                    <th>Type</th>\n                    <th>Optional</th>\n                    <th>Description</th>\n                  </tr>\n                </thead>\n                <tbody>\n                  <tr>\n                    <td>\n                      <p>body</p>\n                    </td>\n                    <td>\n                      <p>&nbsp;</p>\n                    </td>\n                    <td>\n                      <p>&nbsp;</p>\n                    </td>\n                    <td>\n                    </td>\n                  </tr>\n                  <tr>\n                    <td>\n                      <p>buttons</p>\n                    </td>\n                    <td>\n                      <p>&nbsp;</p>\n                    </td>\n                    <td>\n                      <p>&nbsp;</p>\n                    </td>\n                    <td>\n                      <p>See <a href=\"global.html#ButtonSpec\"><code>ButtonSpec</code></a></p>\n                    </td>\n                  </tr>\n                  <tr>\n                    <td>\n                      <p>title</p>\n                    </td>\n                    <td>\n                      <p>&nbsp;</p>\n                    </td>\n                    <td>\n                      <p>&nbsp;</p>\n                    </td>\n                    <td>\n                      <p>Value can be null.</p>\n                    </td>\n                  </tr>\n                  <tr>\n                    <td>\n                      <p>footer</p>\n                    </td>\n                    <td>\n                      <p>&nbsp;</p>\n                    </td>\n                    <td>\n                      <p>&nbsp;</p>\n                    </td>\n                    <td>\n                      <p>Value can be null.</p>\n                    </td>\n                  </tr>\n                </tbody>\n              </table>\n            </section>\n            <dl class=\"dl-compact\">\n            </dl>\n          </section>\n          <section>\n            <h2>Properties</h2>\n            <section>\n              <h3 id=\"body\"><span class=\"symbol-name\">body</span><small class=\"property-type\">\n                  &nbsp;(string or <a href=\"MessageMedia.html\">MessageMedia</a>)</small></h3>\n              <p>Message body</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"buttons\"><span class=\"symbol-name\">buttons</span><small class=\"property-type\">\n                  &nbsp;Array of <a href=\"global.html#FormattedButtonSpec\">FormattedButtonSpec</a></small></h3>\n              <p>buttons of message</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"footer\"><span class=\"symbol-name\">footer</span><small class=\"property-type\">\n                  &nbsp;string</small></h3>\n              <p>footer of message</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"title\"><span class=\"symbol-name\">title</span><small class=\"property-type\">\n                  &nbsp;string</small></h3>\n              <p>title of message</p>\n              <dl class=\"dl-compact\">\n              </dl>\n            </section>\n            <h2>Method</h2>\n            <section>\n              <h3 id=\"_format\"><span class=\"symbol-name\">_format</span><span class=\"signature\"><span class=\"signature-params\">(buttons)</span>&nbsp;&rarr; <span class=\"signature-returns\"> Array of <a href=\"global.html#FormattedButtonSpec\">FormattedButtonSpec</a></span></span></h3>\n              <p>Creates button array from simple array</p>\n              <section>\n                <h4>\n                  Example\n                </h4>\n                <div>\n                  <pre class=\"prettyprint\"><code>Input: [{id:&#x27;customId&#x27;,body:&#x27;button1&#x27;},{body:&#x27;button2&#x27;},{body:&#x27;button3&#x27;},{body:&#x27;button4&#x27;}]\nReturns: [{ buttonId:&#x27;customId&#x27;,buttonText:{&#x27;displayText&#x27;:&#x27;button1&#x27;},type: 1 },{buttonId:&#x27;n3XKsL&#x27;,buttonText:{&#x27;displayText&#x27;:&#x27;button2&#x27;},type:1},{buttonId:&#x27;NDJk0a&#x27;,buttonText:{&#x27;displayText&#x27;:&#x27;button3&#x27;},type:1}]</code></pre>\n                </div>\n              </section>\n              <section>\n                <h4>Parameter</h4>\n                <table class=\"jsdoc-details-table\">\n                  <thead>\n                    <tr>\n                      <th>Name</th>\n                      <th>Type</th>\n                      <th>Optional</th>\n                      <th>Description</th>\n                    </tr>\n                  </thead>\n                  <tbody>\n                    <tr>\n                      <td>\n                        <p>buttons</p>\n                      </td>\n                      <td>\n                        <p>Array of <a href=\"global.html#ButtonSpec\">ButtonSpec</a></p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                  </tbody>\n                </table>\n              </section>\n              <dl class=\"dl-compact\">\n                <dt>Returns</dt>\n                <dd>\n                  <p><code>Array of <a href=\"global.html#FormattedButtonSpec\">FormattedButtonSpec</a></code> </p>\n                </dd>\n              </dl>\n            </section>\n          </section>\n        </div>\n      </div>\n      <nav id=\"jsdoc-toc-nav\" role=\"navigation\"></nav>\n    </div>\n  </div>\n  <footer id=\"jsdoc-footer\" class=\"jsdoc-footer\">\n    <div id=\"jsdoc-footer-container\">\n      <p>\n        Generated by <a href=\"https://github.com/jsdoc3/jsdoc\">JSDoc</a> 3.6.11 on January 30, 2026.\n      </p>\n    </div>\n  </footer>\n  <script src=\"scripts/jquery.min.js\"></script>\n  <script src=\"scripts/tree.jquery.js\"></script>\n  <script src=\"scripts/prettify.js\"></script>\n  <script src=\"scripts/jsdoc-toc.js\"></script>\n  <script src=\"scripts/linenumber.js\"></script>\n  <script src=\"scripts/scrollanchor.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "docs/CNAME",
    "content": "docs.wwebjs.dev"
  },
  {
    "path": "docs/Call.html",
    "content": "<!doctype html>\n<html>\n\n<head>\n  <meta name=\"generator\" content=\"JSDoc 3.6.11\">\n  <meta charset=\"utf-8\">\n  <title>whatsapp-web.js 1.34.6 &raquo; Class: Call</title>\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Karla:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Noto+Serif:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Inconsolata:500\" type=\"text/css\">\n  <link href=\"css/baseline.css\" rel=\"stylesheet\">\n</head>\n\n<body onload=\"prettyPrint()\">\n  <nav id=\"jsdoc-navbar\" role=\"navigation\" class=\"jsdoc-navbar\">\n    <div id=\"jsdoc-navbar-container\">\n      <div id=\"jsdoc-navbar-content\">\n        <a href=\"index.html\" class=\"jsdoc-navbar-package-name\">whatsapp-web.<wbr>js 1.<wbr>34.<wbr>6</a>\n      </div>\n    </div>\n  </nav>\n  <div id=\"jsdoc-body-container\">\n    <div id=\"jsdoc-content\">\n      <div id=\"jsdoc-content-container\">\n        <div id=\"jsdoc-main\" role=\"main\">\n          <header class=\"page-header\">\n            <div class=\"symbol-detail-labels\"><span class=\"label label-kind\">class</span></div>\n            <h1><small></small><span class=\"symbol-name\">Call</span></h1>\n            <p class=\"source-link\">Source: <a href=\"structures_Call.js.html#source-line-9\">structures/<wbr>Call.<wbr>js:9</a></p>\n            <div class=\"symbol-classdesc\">\n              <p>Represents a Call on WhatsApp</p>\n            </div>\n            <dl class=\"dl-compact\">\n            </dl>\n          </header>\n          <section id=\"summary\">\n            <div class=\"summary-callout\">\n              <h2 class=\"summary-callout-heading\">Properties</h2>\n              <div class=\"summary-content\">\n                <div class=\"summary-column\">\n                  <dl class=\"dl-summary-callout\">\n                    <dt><a href=\"Call.html#canHandleLocally\">canHandleLocally</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Call.html#from\">from</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Call.html#fromMe\">fromMe</a></dt>\n                    <dd>\n                    </dd>\n                  </dl>\n                </div>\n                <div class=\"summary-column\">\n                  <dl class=\"dl-summary-callout\">\n                    <dt><a href=\"Call.html#id\">id</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Call.html#isGroup\">isGroup</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Call.html#isVideo\">isVideo</a></dt>\n                    <dd>\n                    </dd>\n                  </dl>\n                </div>\n                <div class=\"summary-column\">\n                  <dl class=\"dl-summary-callout\">\n                    <dt><a href=\"Call.html#participants\">participants</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Call.html#timestamp\">timestamp</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Call.html#webClientShouldHandle\">webClientShouldHandle</a></dt>\n                    <dd>\n                    </dd>\n                  </dl>\n                </div>\n              </div>\n            </div>\n            <div class=\"summary-callout\">\n              <h2 class=\"summary-callout-heading\">Method</h2>\n              <div class=\"summary-content\">\n                <div class=\"summary-column\">\n                  <dl class=\"dl-summary-callout\">\n                    <dt><a href=\"Call.html#reject\">reject()</a></dt>\n                    <dd>\n                    </dd>\n                  </dl>\n                </div>\n                <div class=\"summary-column\">\n                </div>\n                <div class=\"summary-column\">\n                </div>\n              </div>\n            </div>\n          </section>\n          <section>\n            <h2 id=\"Call\">new&nbsp;<span class=\"symbol-name\">Call</span><span class=\"signature\"><span class=\"signature-params\">()</span></span></h2>\n            <dl class=\"dl-compact\">\n              <dt>Extends</dt>\n              <dd><a href=\"Base.html\">Base</a></dd>\n            </dl>\n          </section>\n          <section>\n            <h2>Properties</h2>\n            <section>\n              <h3 id=\"canHandleLocally\"><span class=\"symbol-name\">canHandleLocally</span><small class=\"property-type\">\n                  &nbsp;boolean</small></h3>\n              <p>Indicates if the call can be handled in waweb</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"from\"><span class=\"symbol-name\">from</span><small class=\"property-type\">\n                  &nbsp;string</small></h3>\n              <p>From</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"fromMe\"><span class=\"symbol-name\">fromMe</span><small class=\"property-type\">\n                  &nbsp;boolean</small></h3>\n              <p>Indicates if the call was sent by the current user</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"id\"><span class=\"symbol-name\">id</span><small class=\"property-type\">\n                  &nbsp;string</small></h3>\n              <p>Call ID</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"isGroup\"><span class=\"symbol-name\">isGroup</span><small class=\"property-type\">\n                  &nbsp;boolean</small></h3>\n              <p>Is Group</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"isVideo\"><span class=\"symbol-name\">isVideo</span><small class=\"property-type\">\n                  &nbsp;boolean</small></h3>\n              <p>Is video</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"participants\"><span class=\"symbol-name\">participants</span><small class=\"property-type\">\n                  &nbsp;object</small></h3>\n              <p>Object with participants</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"timestamp\"><span class=\"symbol-name\">timestamp</span><small class=\"property-type\">\n                  &nbsp;number</small></h3>\n              <p>Unix timestamp for when the call was created</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"webClientShouldHandle\"><span class=\"symbol-name\">webClientShouldHandle</span><small class=\"property-type\">\n                  &nbsp;boolean</small></h3>\n              <p>Indicates if the call Should be handled in waweb</p>\n              <dl class=\"dl-compact\">\n              </dl>\n            </section>\n            <h2>Method</h2>\n            <section>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"reject\"><span class=\"symbol-name\">reject</span><span class=\"signature\"><span class=\"signature-params\">()</span></span></h3>\n              <p>Reject the call</p>\n              <dl class=\"dl-compact\">\n              </dl>\n            </section>\n          </section>\n        </div>\n      </div>\n      <nav id=\"jsdoc-toc-nav\" role=\"navigation\"></nav>\n    </div>\n  </div>\n  <footer id=\"jsdoc-footer\" class=\"jsdoc-footer\">\n    <div id=\"jsdoc-footer-container\">\n      <p>\n        Generated by <a href=\"https://github.com/jsdoc3/jsdoc\">JSDoc</a> 3.6.11 on January 30, 2026.\n      </p>\n    </div>\n  </footer>\n  <script src=\"scripts/jquery.min.js\"></script>\n  <script src=\"scripts/tree.jquery.js\"></script>\n  <script src=\"scripts/prettify.js\"></script>\n  <script src=\"scripts/jsdoc-toc.js\"></script>\n  <script src=\"scripts/linenumber.js\"></script>\n  <script src=\"scripts/scrollanchor.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "docs/Channel.html",
    "content": "<!doctype html>\n<html>\n\n<head>\n  <meta name=\"generator\" content=\"JSDoc 3.6.11\">\n  <meta charset=\"utf-8\">\n  <title>whatsapp-web.js 1.34.6 &raquo; Class: Channel</title>\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Karla:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Noto+Serif:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Inconsolata:500\" type=\"text/css\">\n  <link href=\"css/baseline.css\" rel=\"stylesheet\">\n</head>\n\n<body onload=\"prettyPrint()\">\n  <nav id=\"jsdoc-navbar\" role=\"navigation\" class=\"jsdoc-navbar\">\n    <div id=\"jsdoc-navbar-container\">\n      <div id=\"jsdoc-navbar-content\">\n        <a href=\"index.html\" class=\"jsdoc-navbar-package-name\">whatsapp-web.<wbr>js 1.<wbr>34.<wbr>6</a>\n      </div>\n    </div>\n  </nav>\n  <div id=\"jsdoc-body-container\">\n    <div id=\"jsdoc-content\">\n      <div id=\"jsdoc-content-container\">\n        <div id=\"jsdoc-main\" role=\"main\">\n          <header class=\"page-header\">\n            <div class=\"symbol-detail-labels\"><span class=\"label label-kind\">class</span></div>\n            <h1><small></small><span class=\"symbol-name\">Channel</span></h1>\n            <p class=\"source-link\">Source: <a href=\"structures_Channel.js.html#source-line-18\">structures/<wbr>Channel.<wbr>js:18</a></p>\n            <div class=\"symbol-classdesc\">\n              <p>Represents a Channel on WhatsApp</p>\n            </div>\n            <dl class=\"dl-compact\">\n            </dl>\n          </header>\n          <section id=\"summary\">\n            <div class=\"summary-callout\">\n              <h2 class=\"summary-callout-heading\">Properties</h2>\n              <div class=\"summary-content\">\n                <div class=\"summary-column\">\n                  <dl class=\"dl-summary-callout\">\n                    <dt><a href=\"Channel.html#description\">description</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Channel.html#id\">id</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Channel.html#isChannel\">isChannel</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Channel.html#isGroup\">isGroup</a></dt>\n                    <dd>\n                    </dd>\n                  </dl>\n                </div>\n                <div class=\"summary-column\">\n                  <dl class=\"dl-summary-callout\">\n                    <dt><a href=\"Channel.html#isMuted\">isMuted</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Channel.html#isReadOnly\">isReadOnly</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Channel.html#lastMessage\">lastMessage</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Channel.html#muteExpiration\">muteExpiration</a></dt>\n                    <dd>\n                    </dd>\n                  </dl>\n                </div>\n                <div class=\"summary-column\">\n                  <dl class=\"dl-summary-callout\">\n                    <dt><a href=\"Channel.html#name\">name</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Channel.html#timestamp\">timestamp</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Channel.html#unreadCount\">unreadCount</a></dt>\n                    <dd>\n                    </dd>\n                  </dl>\n                </div>\n              </div>\n            </div>\n            <div class=\"summary-callout\">\n              <h2 class=\"summary-callout-heading\">Methods</h2>\n              <div class=\"summary-content\">\n                <div class=\"summary-column\">\n                  <dl class=\"dl-summary-callout\">\n                    <dt><a href=\"Channel.html#_muteUnmuteChannel\">_muteUnmuteChannel(action)</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Channel.html#_setChannelMetadata\">_setChannelMetadata(value, property)</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Channel.html#acceptChannelAdminInvite\">acceptChannelAdminInvite()</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Channel.html#deleteChannel\">deleteChannel()</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Channel.html#demoteChannelAdmin\">demoteChannelAdmin(userId)</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Channel.html#fetchMessages\">fetchMessages(searchOptions)</a></dt>\n                    <dd>\n                    </dd>\n                  </dl>\n                </div>\n                <div class=\"summary-column\">\n                  <dl class=\"dl-summary-callout\">\n                    <dt><a href=\"Channel.html#getSubscribers\">getSubscribers(limit)</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Channel.html#mute\">mute()</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Channel.html#revokeChannelAdminInvite\">revokeChannelAdminInvite(userId)</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Channel.html#sendChannelAdminInvite\">sendChannelAdminInvite(chatId, options)</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Channel.html#sendMessage\">sendMessage(content, options)</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Channel.html#sendSeen\">sendSeen()</a></dt>\n                    <dd>\n                    </dd>\n                  </dl>\n                </div>\n                <div class=\"summary-column\">\n                  <dl class=\"dl-summary-callout\">\n                    <dt><a href=\"Channel.html#setDescription\">setDescription(newDescription)</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Channel.html#setProfilePicture\">setProfilePicture(newProfilePicture)</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Channel.html#setReactionSetting\">setReactionSetting(reactionCode)</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Channel.html#setSubject\">setSubject(newSubject)</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Channel.html#transferChannelOwnership\">transferChannelOwnership(newOwnerId, options)</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Channel.html#unmute\">unmute()</a></dt>\n                    <dd>\n                    </dd>\n                  </dl>\n                </div>\n              </div>\n            </div>\n          </section>\n          <section>\n            <h2 id=\"Channel\">new&nbsp;<span class=\"symbol-name\">Channel</span><span class=\"signature\"><span class=\"signature-params\">()</span></span></h2>\n            <dl class=\"dl-compact\">\n              <dt>Extends</dt>\n              <dd><a href=\"Base.html\">Base</a></dd>\n            </dl>\n          </section>\n          <section>\n            <h2>Properties</h2>\n            <section>\n              <h3 id=\"description\"><span class=\"symbol-name\">description</span><small class=\"property-type\">\n                  &nbsp;string</small></h3>\n              <p>The channel description</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"id\"><span class=\"symbol-name\">id</span><small class=\"property-type\">\n                  &nbsp;<a href=\"global.html#ChannelId\">ChannelId</a></small></h3>\n              <p>ID that represents the channel</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"isChannel\"><span class=\"symbol-name\">isChannel</span><small class=\"property-type\">\n                  &nbsp;boolean</small></h3>\n              <p>Indicates if it is a Channel</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"isGroup\"><span class=\"symbol-name\">isGroup</span><small class=\"property-type\">\n                  &nbsp;boolean</small></h3>\n              <p>Indicates if it is a Group</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"isMuted\"><span class=\"symbol-name\">isMuted</span><small class=\"property-type\">\n                  &nbsp;boolean</small></h3>\n              <p>Indicates if the channel is muted or not</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"isReadOnly\"><span class=\"symbol-name\">isReadOnly</span><small class=\"property-type\">\n                  &nbsp;boolean</small></h3>\n              <p>Indicates if the channel is readonly</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"lastMessage\"><span class=\"symbol-name\">lastMessage</span><small class=\"property-type\">\n                  &nbsp;<a href=\"Message.html\">Message</a></small></h3>\n              <p>Last message in the channel</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"muteExpiration\"><span class=\"symbol-name\">muteExpiration</span><small class=\"property-type\">\n                  &nbsp;number</small></h3>\n              <p>Unix timestamp for when the mute expires</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"name\"><span class=\"symbol-name\">name</span><small class=\"property-type\">\n                  &nbsp;string</small></h3>\n              <p>Title of the channel</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"timestamp\"><span class=\"symbol-name\">timestamp</span><small class=\"property-type\">\n                  &nbsp;number</small></h3>\n              <p>Unix timestamp for when the last activity occurred</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"unreadCount\"><span class=\"symbol-name\">unreadCount</span><small class=\"property-type\">\n                  &nbsp;number</small></h3>\n              <p>Amount of messages unread</p>\n              <dl class=\"dl-compact\">\n              </dl>\n            </section>\n            <h2>Methods</h2>\n            <section>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"_muteUnmuteChannel\"><span class=\"symbol-name\">_muteUnmuteChannel</span><span class=\"signature\"><span class=\"signature-params\">(action)</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing boolean</span></span></h3>\n              <p>Internal method to mute or unmute the channel</p>\n              <section>\n                <h4>Parameter</h4>\n                <table class=\"jsdoc-details-table\">\n                  <thead>\n                    <tr>\n                      <th>Name</th>\n                      <th>Type</th>\n                      <th>Optional</th>\n                      <th>Description</th>\n                    </tr>\n                  </thead>\n                  <tbody>\n                    <tr>\n                      <td>\n                        <p>action</p>\n                      </td>\n                      <td>\n                        <p>string</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>The action: 'MUTE' or 'UNMUTE'</p>\n                      </td>\n                    </tr>\n                  </tbody>\n                </table>\n              </section>\n              <dl class=\"dl-compact\">\n                <dt>Returns</dt>\n                <dd>\n                  <p><code>Promise containing boolean</code> \n                  <p>Returns true if the operation completed successfully, false otherwise</p>\n                  </p>\n                </dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"_setChannelMetadata\"><span class=\"symbol-name\">_setChannelMetadata</span><span class=\"signature\"><span class=\"signature-params\">(value, property)</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing boolean</span></span></h3>\n              <p>Internal method to change the channel metadata</p>\n              <section>\n                <h4>Parameters</h4>\n                <table class=\"jsdoc-details-table\">\n                  <thead>\n                    <tr>\n                      <th>Name</th>\n                      <th>Type</th>\n                      <th>Optional</th>\n                      <th>Description</th>\n                    </tr>\n                  </thead>\n                  <tbody>\n                    <tr>\n                      <td>\n                        <p>value</p>\n                      </td>\n                      <td>\n                        <p>(string, number, or <a href=\"MessageMedia.html\">MessageMedia</a>)</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>The new value to set</p>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>property</p>\n                      </td>\n                      <td>\n                        <p>string</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>The property of a channel metadata to change</p>\n                      </td>\n                    </tr>\n                  </tbody>\n                </table>\n              </section>\n              <dl class=\"dl-compact\">\n                <dt>Returns</dt>\n                <dd>\n                  <p><code>Promise containing boolean</code> \n                  <p>Returns true if the operation completed successfully, false otherwise</p>\n                  </p>\n                </dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"acceptChannelAdminInvite\"><span class=\"symbol-name\">acceptChannelAdminInvite</span><span class=\"signature\"><span class=\"signature-params\">()</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing boolean</span></span></h3>\n              <p>Accepts a channel admin invitation and promotes the current user to a channel admin</p>\n              <dl class=\"dl-compact\">\n                <dt>Returns</dt>\n                <dd>\n                  <p><code>Promise containing boolean</code> \n                  <p>Returns true if the operation completed successfully, false otherwise</p>\n                  </p>\n                </dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"deleteChannel\"><span class=\"symbol-name\">deleteChannel</span><span class=\"signature\"><span class=\"signature-params\">()</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing boolean</span></span></h3>\n              <p>Deletes the channel you created</p>\n              <dl class=\"dl-compact\">\n                <dt>Returns</dt>\n                <dd>\n                  <p><code>Promise containing boolean</code> \n                  <p>Returns true if the operation completed successfully, false otherwise</p>\n                  </p>\n                </dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"demoteChannelAdmin\"><span class=\"symbol-name\">demoteChannelAdmin</span><span class=\"signature\"><span class=\"signature-params\">(userId)</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing boolean</span></span></h3>\n              <p>Demotes a channel admin to a regular subscriber (can be used also for self-demotion)</p>\n              <section>\n                <h4>Parameter</h4>\n                <table class=\"jsdoc-details-table\">\n                  <thead>\n                    <tr>\n                      <th>Name</th>\n                      <th>Type</th>\n                      <th>Optional</th>\n                      <th>Description</th>\n                    </tr>\n                  </thead>\n                  <tbody>\n                    <tr>\n                      <td>\n                        <p>userId</p>\n                      </td>\n                      <td>\n                        <p>string</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>The user ID to demote</p>\n                      </td>\n                    </tr>\n                  </tbody>\n                </table>\n              </section>\n              <dl class=\"dl-compact\">\n                <dt>Returns</dt>\n                <dd>\n                  <p><code>Promise containing boolean</code> \n                  <p>Returns true if the operation completed successfully, false otherwise</p>\n                  </p>\n                </dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"fetchMessages\"><span class=\"symbol-name\">fetchMessages</span><span class=\"signature\"><span class=\"signature-params\">(searchOptions)</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing Array of <a href=\"Message.html\">Message</a></span></span></h3>\n              <p>Loads channel messages, sorted from earliest to latest</p>\n              <section>\n                <h4>Parameters</h4>\n                <table class=\"jsdoc-details-table\">\n                  <thead>\n                    <tr>\n                      <th>Name</th>\n                      <th>Type</th>\n                      <th>Optional</th>\n                      <th>Description</th>\n                    </tr>\n                  </thead>\n                  <tbody>\n                    <tr>\n                      <td>\n                        <p>searchOptions</p>\n                      </td>\n                      <td>\n                        <p>Object</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>Options for searching messages. Right now only limit and fromMe is supported</p>\n                        <p>Values in <code>searchOptions</code> have the following properties:</p>\n                        <table class=\"jsdoc-details-table\">\n                          <thead>\n                            <tr>\n                              <th>Name</th>\n                              <th>Type</th>\n                              <th>Optional</th>\n                              <th>Description</th>\n                            </tr>\n                          </thead>\n                          <tbody>\n                            <tr>\n                              <td>\n                                <p>limit</p>\n                              </td>\n                              <td>\n                                <p>Number</p>\n                              </td>\n                              <td>\n                                <p>Yes</p>\n                              </td>\n                              <td>\n                                <p>The amount of messages to return. If no limit is specified, the available messages will be returned. Note that the actual number of returned messages may be smaller if there aren't enough messages in the conversation. Set this to Infinity to load all messages</p>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <p>fromMe</p>\n                              </td>\n                              <td>\n                                <p>Boolean</p>\n                              </td>\n                              <td>\n                                <p>Yes</p>\n                              </td>\n                              <td>\n                                <p>Return only messages from the bot number or vise versa. To get all messages, leave the option undefined</p>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </td>\n                    </tr>\n                  </tbody>\n                </table>\n              </section>\n              <dl class=\"dl-compact\">\n                <dt>Returns</dt>\n                <dd>\n                  <p><code>Promise containing Array of <a href=\"Message.html\">Message</a></code> </p>\n                </dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"getSubscribers\"><span class=\"symbol-name\">getSubscribers</span><span class=\"signature\"><span class=\"signature-params\">(limit)</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing Array of {contact: <a href=\"Contact.html\">Contact</a>, role: string}</span></span></h3>\n              <p>Gets the subscribers of the channel (only those who are in your contact list)</p>\n              <section>\n                <h4>Parameter</h4>\n                <table class=\"jsdoc-details-table\">\n                  <thead>\n                    <tr>\n                      <th>Name</th>\n                      <th>Type</th>\n                      <th>Optional</th>\n                      <th>Description</th>\n                    </tr>\n                  </thead>\n                  <tbody>\n                    <tr>\n                      <td>\n                        <p>limit</p>\n                      </td>\n                      <td>\n                        <p>number</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>Optional parameter to specify the limit of subscribers to retrieve</p>\n                        <p>Value can be null.</p>\n                      </td>\n                    </tr>\n                  </tbody>\n                </table>\n              </section>\n              <dl class=\"dl-compact\">\n                <dt>Returns</dt>\n                <dd>\n                  <p><code>Promise containing Array of {contact: <a href=\"Contact.html\">Contact</a>, role: string}</code> \n                  <p>Returns an array of objects that handle the subscribed contacts and their roles in the channel</p>\n                  </p>\n                </dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"mute\"><span class=\"symbol-name\">mute</span><span class=\"signature\"><span class=\"signature-params\">()</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing boolean</span></span></h3>\n              <p>Mutes the channel</p>\n              <dl class=\"dl-compact\">\n                <dt>Returns</dt>\n                <dd>\n                  <p><code>Promise containing boolean</code> \n                  <p>Returns true if the operation completed successfully, false otherwise</p>\n                  </p>\n                </dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"revokeChannelAdminInvite\"><span class=\"symbol-name\">revokeChannelAdminInvite</span><span class=\"signature\"><span class=\"signature-params\">(userId)</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing boolean</span></span></h3>\n              <p>Revokes a channel admin invitation sent to a user by a channel owner</p>\n              <section>\n                <h4>Parameter</h4>\n                <table class=\"jsdoc-details-table\">\n                  <thead>\n                    <tr>\n                      <th>Name</th>\n                      <th>Type</th>\n                      <th>Optional</th>\n                      <th>Description</th>\n                    </tr>\n                  </thead>\n                  <tbody>\n                    <tr>\n                      <td>\n                        <p>userId</p>\n                      </td>\n                      <td>\n                        <p>string</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>The user ID the invitation was sent to</p>\n                      </td>\n                    </tr>\n                  </tbody>\n                </table>\n              </section>\n              <dl class=\"dl-compact\">\n                <dt>Returns</dt>\n                <dd>\n                  <p><code>Promise containing boolean</code> \n                  <p>Returns true if the operation completed successfully, false otherwise</p>\n                  </p>\n                </dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"sendChannelAdminInvite\"><span class=\"symbol-name\">sendChannelAdminInvite</span><span class=\"signature\"><span class=\"signature-params\">(chatId, options)</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing boolean</span></span></h3>\n              <p>Sends a channel admin invitation to a user, allowing them to become an admin of the channel</p>\n              <section>\n                <h4>Parameters</h4>\n                <table class=\"jsdoc-details-table\">\n                  <thead>\n                    <tr>\n                      <th>Name</th>\n                      <th>Type</th>\n                      <th>Optional</th>\n                      <th>Description</th>\n                    </tr>\n                  </thead>\n                  <tbody>\n                    <tr>\n                      <td>\n                        <p>chatId</p>\n                      </td>\n                      <td>\n                        <p>string</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>The ID of a user to send the channel admin invitation to</p>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>options</p>\n                      </td>\n                      <td>\n                        <p><a href=\"global.html#SendChannelAdminInviteOptions\">SendChannelAdminInviteOptions</a></p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                  </tbody>\n                </table>\n              </section>\n              <dl class=\"dl-compact\">\n                <dt>Returns</dt>\n                <dd>\n                  <p><code>Promise containing boolean</code> \n                  <p>Returns true if an invitation was sent successfully, false otherwise</p>\n                  </p>\n                </dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"sendMessage\"><span class=\"symbol-name\">sendMessage</span><span class=\"signature\"><span class=\"signature-params\">(content, options)</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing <a href=\"Message.html\">Message</a></span></span></h3>\n              <p>Sends a message to this channel</p>\n              <section>\n                <h4>Parameters</h4>\n                <table class=\"jsdoc-details-table\">\n                  <thead>\n                    <tr>\n                      <th>Name</th>\n                      <th>Type</th>\n                      <th>Optional</th>\n                      <th>Description</th>\n                    </tr>\n                  </thead>\n                  <tbody>\n                    <tr>\n                      <td>\n                        <p>content</p>\n                      </td>\n                      <td>\n                        <p>(string or <a href=\"MessageMedia.html\">MessageMedia</a>)</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>options</p>\n                      </td>\n                      <td>\n                        <p><a href=\"global.html#MessageSendOptions\">MessageSendOptions</a></p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>Value can be null.</p>\n                      </td>\n                    </tr>\n                  </tbody>\n                </table>\n              </section>\n              <dl class=\"dl-compact\">\n                <dt>Returns</dt>\n                <dd>\n                  <p><code>Promise containing <a href=\"Message.html\">Message</a></code> \n                  <p>Message that was just sent</p>\n                  </p>\n                </dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"sendSeen\"><span class=\"symbol-name\">sendSeen</span><span class=\"signature\"><span class=\"signature-params\">()</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing boolean</span></span></h3>\n              <p>Sets the channel as seen</p>\n              <dl class=\"dl-compact\">\n                <dt>Returns</dt>\n                <dd>\n                  <p><code>Promise containing boolean</code> </p>\n                </dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"setDescription\"><span class=\"symbol-name\">setDescription</span><span class=\"signature\"><span class=\"signature-params\">(newDescription)</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing boolean</span></span></h3>\n              <p>Updates the channel description</p>\n              <section>\n                <h4>Parameter</h4>\n                <table class=\"jsdoc-details-table\">\n                  <thead>\n                    <tr>\n                      <th>Name</th>\n                      <th>Type</th>\n                      <th>Optional</th>\n                      <th>Description</th>\n                    </tr>\n                  </thead>\n                  <tbody>\n                    <tr>\n                      <td>\n                        <p>newDescription</p>\n                      </td>\n                      <td>\n                        <p>string</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                  </tbody>\n                </table>\n              </section>\n              <dl class=\"dl-compact\">\n                <dt>Returns</dt>\n                <dd>\n                  <p><code>Promise containing boolean</code> \n                  <p>Returns true if the operation completed successfully, false otherwise</p>\n                  </p>\n                </dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"setProfilePicture\"><span class=\"symbol-name\">setProfilePicture</span><span class=\"signature\"><span class=\"signature-params\">(newProfilePicture)</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing boolean</span></span></h3>\n              <p>Updates the channel profile picture</p>\n              <section>\n                <h4>Parameter</h4>\n                <table class=\"jsdoc-details-table\">\n                  <thead>\n                    <tr>\n                      <th>Name</th>\n                      <th>Type</th>\n                      <th>Optional</th>\n                      <th>Description</th>\n                    </tr>\n                  </thead>\n                  <tbody>\n                    <tr>\n                      <td>\n                        <p>newProfilePicture</p>\n                      </td>\n                      <td>\n                        <p><a href=\"MessageMedia.html\">MessageMedia</a></p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                  </tbody>\n                </table>\n              </section>\n              <dl class=\"dl-compact\">\n                <dt>Returns</dt>\n                <dd>\n                  <p><code>Promise containing boolean</code> \n                  <p>Returns true if the operation completed successfully, false otherwise</p>\n                  </p>\n                </dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"setReactionSetting\"><span class=\"symbol-name\">setReactionSetting</span><span class=\"signature\"><span class=\"signature-params\">(reactionCode)</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing boolean</span></span></h3>\n              <p>Updates available reactions to use in the channel</p>\n              <p>Valid values for passing to the method are:\n                0 for NONE reactions to be avaliable\n                1 for BASIC reactions to be available: 👍, ❤️, 😂, 😮, 😢, 🙏\n                2 for ALL reactions to be available</p>\n              <section>\n                <h4>Parameter</h4>\n                <table class=\"jsdoc-details-table\">\n                  <thead>\n                    <tr>\n                      <th>Name</th>\n                      <th>Type</th>\n                      <th>Optional</th>\n                      <th>Description</th>\n                    </tr>\n                  </thead>\n                  <tbody>\n                    <tr>\n                      <td>\n                        <p>reactionCode</p>\n                      </td>\n                      <td>\n                        <p>number</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                  </tbody>\n                </table>\n              </section>\n              <dl class=\"dl-compact\">\n                <dt>Returns</dt>\n                <dd>\n                  <p><code>Promise containing boolean</code> \n                  <p>Returns true if the operation completed successfully, false otherwise</p>\n                  </p>\n                </dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"setSubject\"><span class=\"symbol-name\">setSubject</span><span class=\"signature\"><span class=\"signature-params\">(newSubject)</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing boolean</span></span></h3>\n              <p>Updates the channel subject</p>\n              <section>\n                <h4>Parameter</h4>\n                <table class=\"jsdoc-details-table\">\n                  <thead>\n                    <tr>\n                      <th>Name</th>\n                      <th>Type</th>\n                      <th>Optional</th>\n                      <th>Description</th>\n                    </tr>\n                  </thead>\n                  <tbody>\n                    <tr>\n                      <td>\n                        <p>newSubject</p>\n                      </td>\n                      <td>\n                        <p>string</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                  </tbody>\n                </table>\n              </section>\n              <dl class=\"dl-compact\">\n                <dt>Returns</dt>\n                <dd>\n                  <p><code>Promise containing boolean</code> \n                  <p>Returns true if the subject was properly updated. This can return false if the user does not have the necessary permissions.</p>\n                  </p>\n                </dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"transferChannelOwnership\"><span class=\"symbol-name\">transferChannelOwnership</span><span class=\"signature\"><span class=\"signature-params\">(newOwnerId, options)</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing boolean</span></span></h3>\n              <p>Transfers a channel ownership to another user.\n                Note: the user you are transferring the channel ownership to must be a channel admin.</p>\n              <section>\n                <h4>Parameters</h4>\n                <table class=\"jsdoc-details-table\">\n                  <thead>\n                    <tr>\n                      <th>Name</th>\n                      <th>Type</th>\n                      <th>Optional</th>\n                      <th>Description</th>\n                    </tr>\n                  </thead>\n                  <tbody>\n                    <tr>\n                      <td>\n                        <p>newOwnerId</p>\n                      </td>\n                      <td>\n                        <p>string</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>options</p>\n                      </td>\n                      <td>\n                        <p><a href=\"global.html#TransferChannelOwnershipOptions\">TransferChannelOwnershipOptions</a></p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                  </tbody>\n                </table>\n              </section>\n              <dl class=\"dl-compact\">\n                <dt>Returns</dt>\n                <dd>\n                  <p><code>Promise containing boolean</code> \n                  <p>Returns true if the operation completed successfully, false otherwise</p>\n                  </p>\n                </dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"unmute\"><span class=\"symbol-name\">unmute</span><span class=\"signature\"><span class=\"signature-params\">()</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing boolean</span></span></h3>\n              <p>Unmutes the channel</p>\n              <dl class=\"dl-compact\">\n                <dt>Returns</dt>\n                <dd>\n                  <p><code>Promise containing boolean</code> \n                  <p>Returns true if the operation completed successfully, false otherwise</p>\n                  </p>\n                </dd>\n              </dl>\n            </section>\n          </section>\n        </div>\n      </div>\n      <nav id=\"jsdoc-toc-nav\" role=\"navigation\"></nav>\n    </div>\n  </div>\n  <footer id=\"jsdoc-footer\" class=\"jsdoc-footer\">\n    <div id=\"jsdoc-footer-container\">\n      <p>\n        Generated by <a href=\"https://github.com/jsdoc3/jsdoc\">JSDoc</a> 3.6.11 on January 30, 2026.\n      </p>\n    </div>\n  </footer>\n  <script src=\"scripts/jquery.min.js\"></script>\n  <script src=\"scripts/tree.jquery.js\"></script>\n  <script src=\"scripts/prettify.js\"></script>\n  <script src=\"scripts/jsdoc-toc.js\"></script>\n  <script src=\"scripts/linenumber.js\"></script>\n  <script src=\"scripts/scrollanchor.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "docs/Chat.html",
    "content": "<!doctype html>\n<html>\n\n<head>\n  <meta name=\"generator\" content=\"JSDoc 3.6.11\">\n  <meta charset=\"utf-8\">\n  <title>whatsapp-web.js 1.34.6 &raquo; Class: Chat</title>\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Karla:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Noto+Serif:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Inconsolata:500\" type=\"text/css\">\n  <link href=\"css/baseline.css\" rel=\"stylesheet\">\n</head>\n\n<body onload=\"prettyPrint()\">\n  <nav id=\"jsdoc-navbar\" role=\"navigation\" class=\"jsdoc-navbar\">\n    <div id=\"jsdoc-navbar-container\">\n      <div id=\"jsdoc-navbar-content\">\n        <a href=\"index.html\" class=\"jsdoc-navbar-package-name\">whatsapp-web.<wbr>js 1.<wbr>34.<wbr>6</a>\n      </div>\n    </div>\n  </nav>\n  <div id=\"jsdoc-body-container\">\n    <div id=\"jsdoc-content\">\n      <div id=\"jsdoc-content-container\">\n        <div id=\"jsdoc-main\" role=\"main\">\n          <header class=\"page-header\">\n            <div class=\"symbol-detail-labels\"><span class=\"label label-kind\">class</span></div>\n            <h1><small></small><span class=\"symbol-name\">Chat</span></h1>\n            <p class=\"source-link\">Source: <a href=\"structures_Chat.js.html#source-line-10\">structures/<wbr>Chat.<wbr>js:10</a></p>\n            <div class=\"symbol-classdesc\">\n              <p>Represents a Chat on WhatsApp</p>\n            </div>\n            <dl class=\"dl-compact\">\n            </dl>\n          </header>\n          <section id=\"summary\">\n            <div class=\"summary-callout\">\n              <h2 class=\"summary-callout-heading\">Properties</h2>\n              <div class=\"summary-content\">\n                <div class=\"summary-column\">\n                  <dl class=\"dl-summary-callout\">\n                    <dt><a href=\"Chat.html#archived\">archived</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Chat.html#id\">id</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Chat.html#isGroup\">isGroup</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Chat.html#isMuted\">isMuted</a></dt>\n                    <dd>\n                    </dd>\n                  </dl>\n                </div>\n                <div class=\"summary-column\">\n                  <dl class=\"dl-summary-callout\">\n                    <dt><a href=\"Chat.html#isReadOnly\">isReadOnly</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Chat.html#lastMessage\">lastMessage</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Chat.html#muteExpiration\">muteExpiration</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Chat.html#name\">name</a></dt>\n                    <dd>\n                    </dd>\n                  </dl>\n                </div>\n                <div class=\"summary-column\">\n                  <dl class=\"dl-summary-callout\">\n                    <dt><a href=\"Chat.html#pinned\">pinned</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Chat.html#timestamp\">timestamp</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Chat.html#unreadCount\">unreadCount</a></dt>\n                    <dd>\n                    </dd>\n                  </dl>\n                </div>\n              </div>\n            </div>\n            <div class=\"summary-callout\">\n              <h2 class=\"summary-callout-heading\">Methods</h2>\n              <div class=\"summary-content\">\n                <div class=\"summary-column\">\n                  <dl class=\"dl-summary-callout\">\n                    <dt><a href=\"Chat.html#addOrEditCustomerNote\">addOrEditCustomerNote(note)</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Chat.html#archive\">archive()</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Chat.html#changeLabels\">changeLabels(labelIds)</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Chat.html#clearMessages\">clearMessages()</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Chat.html#clearState\">clearState()</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Chat.html#delete\">delete()</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Chat.html#fetchMessages\">fetchMessages(searchOptions)</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Chat.html#getContact\">getContact()</a></dt>\n                    <dd>\n                    </dd>\n                  </dl>\n                </div>\n                <div class=\"summary-column\">\n                  <dl class=\"dl-summary-callout\">\n                    <dt><a href=\"Chat.html#getCustomerNote\">getCustomerNote()</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Chat.html#getLabels\">getLabels()</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Chat.html#getPinnedMessages\">getPinnedMessages()</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Chat.html#markUnread\">markUnread()</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Chat.html#mute\">mute(unmuteDate)</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Chat.html#pin\">pin()</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Chat.html#sendMessage\">sendMessage(content[, options])</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Chat.html#sendSeen\">sendSeen()</a></dt>\n                    <dd>\n                    </dd>\n                  </dl>\n                </div>\n                <div class=\"summary-column\">\n                  <dl class=\"dl-summary-callout\">\n                    <dt><a href=\"Chat.html#sendStateRecording\">sendStateRecording()</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Chat.html#sendStateTyping\">sendStateTyping()</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Chat.html#syncHistory\">syncHistory()</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Chat.html#unarchive\">unarchive()</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Chat.html#unmute\">unmute()</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Chat.html#unpin\">unpin()</a></dt>\n                    <dd>\n                    </dd>\n                  </dl>\n                </div>\n              </div>\n            </div>\n          </section>\n          <section>\n            <h2 id=\"Chat\">new&nbsp;<span class=\"symbol-name\">Chat</span><span class=\"signature\"><span class=\"signature-params\">()</span></span></h2>\n            <dl class=\"dl-compact\">\n              <dt>Extends</dt>\n              <dd><a href=\"Base.html\">Base</a></dd>\n            </dl>\n          </section>\n          <section>\n            <h2>Properties</h2>\n            <section>\n              <h3 id=\"archived\"><span class=\"symbol-name\">archived</span><small class=\"property-type\">\n                  &nbsp;boolean</small></h3>\n              <p>Indicates if the Chat is archived</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"id\"><span class=\"symbol-name\">id</span><small class=\"property-type\">\n                  &nbsp;object</small></h3>\n              <p>ID that represents the chat</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"isGroup\"><span class=\"symbol-name\">isGroup</span><small class=\"property-type\">\n                  &nbsp;boolean</small></h3>\n              <p>Indicates if the Chat is a Group Chat</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"isMuted\"><span class=\"symbol-name\">isMuted</span><small class=\"property-type\">\n                  &nbsp;boolean</small></h3>\n              <p>Indicates if the chat is muted or not</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"isReadOnly\"><span class=\"symbol-name\">isReadOnly</span><small class=\"property-type\">\n                  &nbsp;boolean</small></h3>\n              <p>Indicates if the Chat is readonly</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"lastMessage\"><span class=\"symbol-name\">lastMessage</span><small class=\"property-type\">\n                  &nbsp;<a href=\"Message.html\">Message</a></small></h3>\n              <p>Last message fo chat</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"muteExpiration\"><span class=\"symbol-name\">muteExpiration</span><small class=\"property-type\">\n                  &nbsp;number</small></h3>\n              <p>Unix timestamp for when the mute expires</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"name\"><span class=\"symbol-name\">name</span><small class=\"property-type\">\n                  &nbsp;string</small></h3>\n              <p>Title of the chat</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"pinned\"><span class=\"symbol-name\">pinned</span><small class=\"property-type\">\n                  &nbsp;boolean</small></h3>\n              <p>Indicates if the Chat is pinned</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"timestamp\"><span class=\"symbol-name\">timestamp</span><small class=\"property-type\">\n                  &nbsp;number</small></h3>\n              <p>Unix timestamp for when the last activity occurred</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"unreadCount\"><span class=\"symbol-name\">unreadCount</span><small class=\"property-type\">\n                  &nbsp;number</small></h3>\n              <p>Amount of messages unread</p>\n              <dl class=\"dl-compact\">\n              </dl>\n            </section>\n            <h2>Methods</h2>\n            <section>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"addOrEditCustomerNote\"><span class=\"symbol-name\">addOrEditCustomerNote</span><span class=\"signature\"><span class=\"signature-params\">(note)</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing void</span></span></h3>\n              <p>Add or edit a customer note</p>\n              <section>\n                <h4>Parameter</h4>\n                <table class=\"jsdoc-details-table\">\n                  <thead>\n                    <tr>\n                      <th>Name</th>\n                      <th>Type</th>\n                      <th>Optional</th>\n                      <th>Description</th>\n                    </tr>\n                  </thead>\n                  <tbody>\n                    <tr>\n                      <td>\n                        <p>note</p>\n                      </td>\n                      <td>\n                        <p>string</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>The note to add</p>\n                      </td>\n                    </tr>\n                  </tbody>\n                </table>\n              </section>\n              <dl class=\"dl-compact\">\n                <dt>See also</dt>\n                <dd><a href=\"https://faq.whatsapp.com/1433099287594476\">https://faq.whatsapp.com/1433099287594476</a></dd>\n                <dt>Returns</dt>\n                <dd>\n                  <p><code>Promise containing void</code> </p>\n                </dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"archive\"><span class=\"symbol-name\">archive</span><span class=\"signature\"><span class=\"signature-params\">()</span></span></h3>\n              <p>Archives this chat</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"changeLabels\"><span class=\"symbol-name\">changeLabels</span><span class=\"signature\"><span class=\"signature-params\">(labelIds)</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing void</span></span></h3>\n              <p>Add or remove labels to this Chat</p>\n              <section>\n                <h4>Parameter</h4>\n                <table class=\"jsdoc-details-table\">\n                  <thead>\n                    <tr>\n                      <th>Name</th>\n                      <th>Type</th>\n                      <th>Optional</th>\n                      <th>Description</th>\n                    </tr>\n                  </thead>\n                  <tbody>\n                    <tr>\n                      <td>\n                        <p>labelIds</p>\n                      </td>\n                      <td>\n                        <p>Array of (number or string)</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                  </tbody>\n                </table>\n              </section>\n              <dl class=\"dl-compact\">\n                <dt>Returns</dt>\n                <dd>\n                  <p><code>Promise containing void</code> </p>\n                </dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"clearMessages\"><span class=\"symbol-name\">clearMessages</span><span class=\"signature\"><span class=\"signature-params\">()</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing boolean</span></span></h3>\n              <p>Clears all messages from the chat</p>\n              <dl class=\"dl-compact\">\n                <dt>Returns</dt>\n                <dd>\n                  <p><code>Promise containing boolean</code> \n                  <p>result</p>\n                  </p>\n                </dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"clearState\"><span class=\"symbol-name\">clearState</span><span class=\"signature\"><span class=\"signature-params\">()</span></span></h3>\n              <p>Stops typing or recording in chat immediately.</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"delete\"><span class=\"symbol-name\">delete</span><span class=\"signature\"><span class=\"signature-params\">()</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing Boolean</span></span></h3>\n              <p>Deletes the chat</p>\n              <dl class=\"dl-compact\">\n                <dt>Returns</dt>\n                <dd>\n                  <p><code>Promise containing Boolean</code> \n                  <p>result</p>\n                  </p>\n                </dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"fetchMessages\"><span class=\"symbol-name\">fetchMessages</span><span class=\"signature\"><span class=\"signature-params\">(searchOptions)</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing Array of <a href=\"Message.html\">Message</a></span></span></h3>\n              <p>Loads chat messages, sorted from earliest to latest.</p>\n              <section>\n                <h4>Parameters</h4>\n                <table class=\"jsdoc-details-table\">\n                  <thead>\n                    <tr>\n                      <th>Name</th>\n                      <th>Type</th>\n                      <th>Optional</th>\n                      <th>Description</th>\n                    </tr>\n                  </thead>\n                  <tbody>\n                    <tr>\n                      <td>\n                        <p>searchOptions</p>\n                      </td>\n                      <td>\n                        <p>Object</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>Options for searching messages. Right now only limit and fromMe is supported.</p>\n                        <p>Values in <code>searchOptions</code> have the following properties:</p>\n                        <table class=\"jsdoc-details-table\">\n                          <thead>\n                            <tr>\n                              <th>Name</th>\n                              <th>Type</th>\n                              <th>Optional</th>\n                              <th>Description</th>\n                            </tr>\n                          </thead>\n                          <tbody>\n                            <tr>\n                              <td>\n                                <p>limit</p>\n                              </td>\n                              <td>\n                                <p>Number</p>\n                              </td>\n                              <td>\n                                <p>Yes</p>\n                              </td>\n                              <td>\n                                <p>The amount of messages to return. If no limit is specified, the available messages will be returned. Note that the actual number of returned messages may be smaller if there aren't enough messages in the conversation. Set this to Infinity to load all messages.</p>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <p>fromMe</p>\n                              </td>\n                              <td>\n                                <p>Boolean</p>\n                              </td>\n                              <td>\n                                <p>Yes</p>\n                              </td>\n                              <td>\n                                <p>Return only messages from the bot number or vise versa. To get all messages, leave the option undefined.</p>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </td>\n                    </tr>\n                  </tbody>\n                </table>\n              </section>\n              <dl class=\"dl-compact\">\n                <dt>Returns</dt>\n                <dd>\n                  <p><code>Promise containing Array of <a href=\"Message.html\">Message</a></code> </p>\n                </dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"getContact\"><span class=\"symbol-name\">getContact</span><span class=\"signature\"><span class=\"signature-params\">()</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing <a href=\"Contact.html\">Contact</a></span></span></h3>\n              <p>Returns the Contact that corresponds to this Chat.</p>\n              <dl class=\"dl-compact\">\n                <dt>Returns</dt>\n                <dd>\n                  <p><code>Promise containing <a href=\"Contact.html\">Contact</a></code> </p>\n                </dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"getCustomerNote\"><span class=\"symbol-name\">getCustomerNote</span><span class=\"signature\"><span class=\"signature-params\">()</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing {chatId: string, content: string, createdAt: number, id: string, modifiedAt: number, type: string}</span></span></h3>\n              <p>Get a customer note</p>\n              <dl class=\"dl-compact\">\n                <dt>See also</dt>\n                <dd><a href=\"https://faq.whatsapp.com/1433099287594476\">https://faq.whatsapp.com/1433099287594476</a></dd>\n                <dt>Returns</dt>\n                <dd>\n                  <p><code>Promise containing {chatId: string, content: string, createdAt: number, id: string, modifiedAt: number, type: string}</code> </p>\n                </dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"getLabels\"><span class=\"symbol-name\">getLabels</span><span class=\"signature\"><span class=\"signature-params\">()</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing Array of <a href=\"Label.html\">Label</a></span></span></h3>\n              <p>Returns array of all Labels assigned to this Chat</p>\n              <dl class=\"dl-compact\">\n                <dt>Returns</dt>\n                <dd>\n                  <p><code>Promise containing Array of <a href=\"Label.html\">Label</a></code> </p>\n                </dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"getPinnedMessages\"><span class=\"symbol-name\">getPinnedMessages</span><span class=\"signature\"><span class=\"signature-params\">()</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing Array of <a href=\"Message.html\">Message</a></span></span></h3>\n              <p>Gets instances of all pinned messages in a chat</p>\n              <dl class=\"dl-compact\">\n                <dt>Returns</dt>\n                <dd>\n                  <p><code>Promise containing Array of <a href=\"Message.html\">Message</a></code> </p>\n                </dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"markUnread\"><span class=\"symbol-name\">markUnread</span><span class=\"signature\"><span class=\"signature-params\">()</span></span></h3>\n              <p>Mark this chat as unread</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"mute\"><span class=\"symbol-name\">mute</span><span class=\"signature\"><span class=\"signature-params\">(unmuteDate)</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing {isMuted: boolean, muteExpiration: number}</span></span></h3>\n              <p>Mutes this chat forever, unless a date is specified</p>\n              <section>\n                <h4>Parameter</h4>\n                <table class=\"jsdoc-details-table\">\n                  <thead>\n                    <tr>\n                      <th>Name</th>\n                      <th>Type</th>\n                      <th>Optional</th>\n                      <th>Description</th>\n                    </tr>\n                  </thead>\n                  <tbody>\n                    <tr>\n                      <td>\n                        <p>unmuteDate</p>\n                      </td>\n                      <td>\n                        <p>Date</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>Date when the chat will be unmuted, don't provide a value to mute forever</p>\n                        <p>Value can be null.</p>\n                      </td>\n                    </tr>\n                  </tbody>\n                </table>\n              </section>\n              <dl class=\"dl-compact\">\n                <dt>Returns</dt>\n                <dd>\n                  <p><code>Promise containing {isMuted: boolean, muteExpiration: number}</code> </p>\n                </dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"pin\"><span class=\"symbol-name\">pin</span><span class=\"signature\"><span class=\"signature-params\">()</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing boolean</span></span></h3>\n              <p>Pins this chat</p>\n              <dl class=\"dl-compact\">\n                <dt>Returns</dt>\n                <dd>\n                  <p><code>Promise containing boolean</code> \n                  <p>New pin state. Could be false if the max number of pinned chats was reached.</p>\n                  </p>\n                </dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"sendMessage\"><span class=\"symbol-name\">sendMessage</span><span class=\"signature\"><span class=\"signature-params\">(content[, options])</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing <a href=\"Message.html\">Message</a></span></span></h3>\n              <p>Send a message to this chat</p>\n              <section>\n                <h4>Parameters</h4>\n                <table class=\"jsdoc-details-table\">\n                  <thead>\n                    <tr>\n                      <th>Name</th>\n                      <th>Type</th>\n                      <th>Optional</th>\n                      <th>Description</th>\n                    </tr>\n                  </thead>\n                  <tbody>\n                    <tr>\n                      <td>\n                        <p>content</p>\n                      </td>\n                      <td>\n                        <p>(string, <a href=\"MessageMedia.html\">MessageMedia</a>, or <a href=\"Location.html\">Location</a>)</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>options</p>\n                      </td>\n                      <td>\n                        <p><a href=\"global.html#MessageSendOptions\">MessageSendOptions</a></p>\n                      </td>\n                      <td>\n                        <p>Yes</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                  </tbody>\n                </table>\n              </section>\n              <dl class=\"dl-compact\">\n                <dt>Returns</dt>\n                <dd>\n                  <p><code>Promise containing <a href=\"Message.html\">Message</a></code> \n                  <p>Message that was just sent</p>\n                  </p>\n                </dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"sendSeen\"><span class=\"symbol-name\">sendSeen</span><span class=\"signature\"><span class=\"signature-params\">()</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing Boolean</span></span></h3>\n              <p>Sets the chat as seen</p>\n              <dl class=\"dl-compact\">\n                <dt>Returns</dt>\n                <dd>\n                  <p><code>Promise containing Boolean</code> \n                  <p>result</p>\n                  </p>\n                </dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"sendStateRecording\"><span class=\"symbol-name\">sendStateRecording</span><span class=\"signature\"><span class=\"signature-params\">()</span></span></h3>\n              <p>Simulate recording audio in chat. This will last for 25 seconds.</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"sendStateTyping\"><span class=\"symbol-name\">sendStateTyping</span><span class=\"signature\"><span class=\"signature-params\">()</span></span></h3>\n              <p>Simulate typing in chat. This will last for 25 seconds.</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"syncHistory\"><span class=\"symbol-name\">syncHistory</span><span class=\"signature\"><span class=\"signature-params\">()</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing boolean</span></span></h3>\n              <p>Sync chat history conversation</p>\n              <dl class=\"dl-compact\">\n                <dt>Returns</dt>\n                <dd>\n                  <p><code>Promise containing boolean</code> \n                  <p>True if operation completed successfully, false otherwise.</p>\n                  </p>\n                </dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"unarchive\"><span class=\"symbol-name\">unarchive</span><span class=\"signature\"><span class=\"signature-params\">()</span></span></h3>\n              <p>un-archives this chat</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"unmute\"><span class=\"symbol-name\">unmute</span><span class=\"signature\"><span class=\"signature-params\">()</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing {isMuted: boolean, muteExpiration: number}</span></span></h3>\n              <p>Unmutes this chat</p>\n              <dl class=\"dl-compact\">\n                <dt>Returns</dt>\n                <dd>\n                  <p><code>Promise containing {isMuted: boolean, muteExpiration: number}</code> </p>\n                </dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"unpin\"><span class=\"symbol-name\">unpin</span><span class=\"signature\"><span class=\"signature-params\">()</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing boolean</span></span></h3>\n              <p>Unpins this chat</p>\n              <dl class=\"dl-compact\">\n                <dt>Returns</dt>\n                <dd>\n                  <p><code>Promise containing boolean</code> \n                  <p>New pin state</p>\n                  </p>\n                </dd>\n              </dl>\n            </section>\n          </section>\n        </div>\n      </div>\n      <nav id=\"jsdoc-toc-nav\" role=\"navigation\"></nav>\n    </div>\n  </div>\n  <footer id=\"jsdoc-footer\" class=\"jsdoc-footer\">\n    <div id=\"jsdoc-footer-container\">\n      <p>\n        Generated by <a href=\"https://github.com/jsdoc3/jsdoc\">JSDoc</a> 3.6.11 on January 30, 2026.\n      </p>\n    </div>\n  </footer>\n  <script src=\"scripts/jquery.min.js\"></script>\n  <script src=\"scripts/tree.jquery.js\"></script>\n  <script src=\"scripts/prettify.js\"></script>\n  <script src=\"scripts/jsdoc-toc.js\"></script>\n  <script src=\"scripts/linenumber.js\"></script>\n  <script src=\"scripts/scrollanchor.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "docs/Client.html",
    "content": "<!doctype html>\n<html>\n        <head>\n                <meta name=\"generator\" content=\"JSDoc 3.6.11\">\n                <meta charset=\"utf-8\">\n                <title>whatsapp-web.js 1.34.6 &raquo; Class: Client</title>\n                <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Karla:400,400i,700,700i\" type=\"text/css\">\n                <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Noto+Serif:400,400i,700,700i\" type=\"text/css\">\n                <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Inconsolata:500\" type=\"text/css\">\n                <link href=\"css/baseline.css\" rel=\"stylesheet\">\n        </head>\n        <body onload=\"prettyPrint()\">\n                <nav id=\"jsdoc-navbar\" role=\"navigation\" class=\"jsdoc-navbar\">\n    <div id=\"jsdoc-navbar-container\">\n        <div id=\"jsdoc-navbar-content\">\n            <a href=\"index.html\" class=\"jsdoc-navbar-package-name\">whatsapp-web.<wbr>js 1.<wbr>34.<wbr>6</a>\n        </div>\n    </div>\n</nav>\n\n                <div id=\"jsdoc-body-container\">\n                        <div id=\"jsdoc-content\">\n                                <div id=\"jsdoc-content-container\">\n                                        <div id=\"jsdoc-main\" role=\"main\">\n                    <header class=\"page-header\">\n<div class=\"symbol-detail-labels\"><span class=\"label label-kind\">class</span></div><h1><small></small><span class=\"symbol-name\">Client</span></h1>        <p class=\"source-link\">Source: <a href=\"Client.js.html#source-line-66\">Client.<wbr>js:66</a></p>\n            <div class=\"symbol-classdesc\">\n                <p>Starting point for interacting with the WhatsApp Web API</p>\n            </div>\n        <dl class=\"dl-compact\">\n            \n            \n            \n        </dl>\n</header>\n\n\n    <section id=\"summary\">\n                \n\n                \n\n                \n\n                \n\n                    <div class=\"summary-callout\">\n            <h2 class=\"summary-callout-heading\">Properties</h2>\n        <div class=\"summary-content\">\n                    <div class=\"summary-column\">\n        <dl class=\"dl-summary-callout\">\n                <dt><a href=\"Client.html#info\">info</a></dt>\n                <dd>\n                </dd>\n        </dl>\n</div>\n\n                    <div class=\"summary-column\">\n        <dl class=\"dl-summary-callout\">\n                <dt><a href=\"Client.html#pupBrowser\">pupBrowser</a></dt>\n                <dd>\n                </dd>\n        </dl>\n</div>\n\n                    <div class=\"summary-column\">\n        <dl class=\"dl-summary-callout\">\n                <dt><a href=\"Client.html#pupPage\">pupPage</a></dt>\n                <dd>\n                </dd>\n        </dl>\n</div>\n\n        </div>\n    </div>\n\n\n                    <div class=\"summary-callout\">\n            <h2 class=\"summary-callout-heading\">Methods</h2>\n        <div class=\"summary-content\">\n                    <div class=\"summary-column\">\n        <dl class=\"dl-summary-callout\">\n                <dt><a href=\"Client.html#_muteUnmuteChat\">_muteUnmuteChat(chatId, action, unmuteDateTs)</a></dt>\n                <dd>\n                </dd>\n                <dt><a href=\"Client.html#acceptChannelAdminInvite\">acceptChannelAdminInvite(channelId)</a></dt>\n                <dd>\n                </dd>\n                <dt><a href=\"Client.html#acceptGroupV4Invite\">acceptGroupV4Invite(inviteInfo)</a></dt>\n                <dd>\n                </dd>\n                <dt><a href=\"Client.html#acceptInvite\">acceptInvite(inviteCode)</a></dt>\n                <dd>\n                </dd>\n                <dt><a href=\"Client.html#addOrEditCustomerNote\">addOrEditCustomerNote(userId, note)</a></dt>\n                <dd>\n                </dd>\n                <dt><a href=\"Client.html#addOrRemoveLabels\">addOrRemoveLabels(labelIds, chatIds)</a></dt>\n                <dd>\n                </dd>\n                <dt><a href=\"Client.html#approveGroupMembershipRequests\">approveGroupMembershipRequests(groupId, options)</a></dt>\n                <dd>\n                </dd>\n                <dt><a href=\"Client.html#archiveChat\">archiveChat()</a></dt>\n                <dd>\n                </dd>\n                <dt><a href=\"Client.html#attachEventListeners\">attachEventListeners()</a></dt>\n                <dd>\n                </dd>\n                <dt><a href=\"Client.html#createCallLink\">createCallLink(startTime, callType)</a></dt>\n                <dd>\n                </dd>\n                <dt><a href=\"Client.html#createChannel\">createChannel(title, options)</a></dt>\n                <dd>\n                </dd>\n                <dt><a href=\"Client.html#createGroup\">createGroup(title, participants, options)</a></dt>\n                <dd>\n                </dd>\n                <dt><a href=\"Client.html#deleteAddressbookContact\">deleteAddressbookContact(phoneNumber)</a></dt>\n                <dd>\n                </dd>\n                <dt><a href=\"Client.html#deleteChannel\">deleteChannel(channelId)</a></dt>\n                <dd>\n                </dd>\n                <dt><a href=\"Client.html#deleteProfilePicture\">deleteProfilePicture()</a></dt>\n                <dd>\n                </dd>\n                <dt><a href=\"Client.html#demoteChannelAdmin\">demoteChannelAdmin(channelId, userId)</a></dt>\n                <dd>\n                </dd>\n                <dt><a href=\"Client.html#destroy\">destroy()</a></dt>\n                <dd>\n                </dd>\n                <dt><a href=\"Client.html#getBlockedContacts\">getBlockedContacts()</a></dt>\n                <dd>\n                </dd>\n                <dt><a href=\"Client.html#getBroadcastById\">getBroadcastById(contactId)</a></dt>\n                <dd>\n                </dd>\n                <dt><a href=\"Client.html#getBroadcasts\">getBroadcasts()</a></dt>\n                <dd>\n                </dd>\n                <dt><a href=\"Client.html#getChannelByInviteCode\">getChannelByInviteCode(inviteCode)</a></dt>\n                <dd>\n                </dd>\n                <dt><a href=\"Client.html#getChannels\">getChannels()</a></dt>\n                <dd>\n                </dd>\n                <dt><a href=\"Client.html#getChatById\">getChatById(chatId)</a></dt>\n                <dd>\n                </dd>\n                <dt><a href=\"Client.html#getChatLabels\">getChatLabels(chatId)</a></dt>\n                <dd>\n                </dd>\n                <dt><a href=\"Client.html#getChats\">getChats()</a></dt>\n                <dd>\n                </dd>\n                <dt><a href=\"Client.html#getChatsByLabelId\">getChatsByLabelId(labelId)</a></dt>\n                <dd>\n                </dd>\n                <dt><a href=\"Client.html#getCommonGroups\">getCommonGroups(contactId)</a></dt>\n                <dd>\n                </dd>\n        </dl>\n</div>\n\n                    <div class=\"summary-column\">\n        <dl class=\"dl-summary-callout\">\n                <dt><a href=\"Client.html#getContactById\">getContactById(contactId)</a></dt>\n                <dd>\n                </dd>\n                <dt><a href=\"Client.html#getContactDeviceCount\">getContactDeviceCount(userId)</a></dt>\n                <dd>\n                </dd>\n                <dt><a href=\"Client.html#getContactLidAndPhone\">getContactLidAndPhone(userIds)</a></dt>\n                <dd>\n                </dd>\n                <dt><a href=\"Client.html#getContacts\">getContacts()</a></dt>\n                <dd>\n                </dd>\n                <dt><a href=\"Client.html#getCountryCode\">getCountryCode(number)</a></dt>\n                <dd>\n                </dd>\n                <dt><a href=\"Client.html#getCustomerNote\">getCustomerNote(userId)</a></dt>\n                <dd>\n                </dd>\n                <dt><a href=\"Client.html#getFormattedNumber\">getFormattedNumber(number)</a></dt>\n                <dd>\n                </dd>\n                <dt><a href=\"Client.html#getGroupMembershipRequests\">getGroupMembershipRequests(groupId)</a></dt>\n                <dd>\n                </dd>\n                <dt><a href=\"Client.html#getInviteInfo\">getInviteInfo(inviteCode)</a></dt>\n                <dd>\n                </dd>\n                <dt><a href=\"Client.html#getLabelById\">getLabelById(labelId)</a></dt>\n                <dd>\n                </dd>\n                <dt><a href=\"Client.html#getLabels\">getLabels()</a></dt>\n                <dd>\n                </dd>\n                <dt><a href=\"Client.html#getMessageById\">getMessageById(messageId)</a></dt>\n                <dd>\n                </dd>\n                <dt><a href=\"Client.html#getNumberId\">getNumberId(number)</a></dt>\n                <dd>\n                </dd>\n                <dt><a href=\"Client.html#getPinnedMessages\">getPinnedMessages(chatId)</a></dt>\n                <dd>\n                </dd>\n                <dt><a href=\"Client.html#getPollVotes\">getPollVotes(messageId)</a></dt>\n                <dd>\n                </dd>\n                <dt><a href=\"Client.html#getProfilePicUrl\">getProfilePicUrl(contactId)</a></dt>\n                <dd>\n                </dd>\n                <dt><a href=\"Client.html#getState\">getState()</a></dt>\n                <dd>\n                </dd>\n                <dt><a href=\"Client.html#getWWebVersion\">getWWebVersion()</a></dt>\n                <dd>\n                </dd>\n                <dt><a href=\"Client.html#initialize\">initialize()</a></dt>\n                <dd>\n                </dd>\n                <dt><a href=\"Client.html#inject\">inject()</a></dt>\n                <dd>\n                </dd>\n                <dt><a href=\"Client.html#isRegisteredUser\">isRegisteredUser(id)</a></dt>\n                <dd>\n                </dd>\n                <dt><a href=\"Client.html#logout\">logout()</a></dt>\n                <dd>\n                </dd>\n                <dt><a href=\"Client.html#markChatUnread\">markChatUnread(chatId)</a></dt>\n                <dd>\n                </dd>\n                <dt><a href=\"Client.html#muteChat\">muteChat(chatId, unmuteDate)</a></dt>\n                <dd>\n                </dd>\n                <dt><a href=\"Client.html#pinChat\">pinChat()</a></dt>\n                <dd>\n                </dd>\n                <dt><a href=\"Client.html#rejectGroupMembershipRequests\">rejectGroupMembershipRequests(groupId, options)</a></dt>\n                <dd>\n                </dd>\n                <dt><a href=\"Client.html#requestPairingCode\">requestPairingCode(phoneNumber[, showNotification][, intervalMs])</a></dt>\n                <dd>\n                </dd>\n        </dl>\n</div>\n\n                    <div class=\"summary-column\">\n        <dl class=\"dl-summary-callout\">\n                <dt><a href=\"Client.html#resetState\">resetState()</a></dt>\n                <dd>\n                </dd>\n                <dt><a href=\"Client.html#revokeChannelAdminInvite\">revokeChannelAdminInvite(channelId, userId)</a></dt>\n                <dd>\n                </dd>\n                <dt><a href=\"Client.html#revokeStatusMessage\">revokeStatusMessage(messageId)</a></dt>\n                <dd>\n                </dd>\n                <dt><a href=\"Client.html#saveOrEditAddressbookContact\">saveOrEditAddressbookContact(phoneNumber, firstName, lastName[, syncToAddressbook])</a></dt>\n                <dd>\n                </dd>\n                <dt><a href=\"Client.html#searchChannels\">searchChannels(searchOptions)</a></dt>\n                <dd>\n                </dd>\n                <dt><a href=\"Client.html#searchMessages\">searchMessages(query[, options])</a></dt>\n                <dd>\n                </dd>\n                <dt><a href=\"Client.html#sendChannelAdminInvite\">sendChannelAdminInvite(chatId, channelId, options)</a></dt>\n                <dd>\n                </dd>\n                <dt><a href=\"Client.html#sendMessage\">sendMessage(chatId, content[, options])</a></dt>\n                <dd>\n                </dd>\n                <dt><a href=\"Client.html#sendPresenceAvailable\">sendPresenceAvailable()</a></dt>\n                <dd>\n                </dd>\n                <dt><a href=\"Client.html#sendPresenceUnavailable\">sendPresenceUnavailable()</a></dt>\n                <dd>\n                </dd>\n                <dt><a href=\"Client.html#sendResponseToScheduledEvent\">sendResponseToScheduledEvent(response, eventMessageId)</a></dt>\n                <dd>\n                </dd>\n                <dt><a href=\"Client.html#sendSeen\">sendSeen(chatId)</a></dt>\n                <dd>\n                </dd>\n                <dt><a href=\"Client.html#setAutoDownloadAudio\">setAutoDownloadAudio(flag)</a></dt>\n                <dd>\n                </dd>\n                <dt><a href=\"Client.html#setAutoDownloadDocuments\">setAutoDownloadDocuments(flag)</a></dt>\n                <dd>\n                </dd>\n                <dt><a href=\"Client.html#setAutoDownloadPhotos\">setAutoDownloadPhotos(flag)</a></dt>\n                <dd>\n                </dd>\n                <dt><a href=\"Client.html#setAutoDownloadVideos\">setAutoDownloadVideos(flag)</a></dt>\n                <dd>\n                </dd>\n                <dt><a href=\"Client.html#setBackgroundSync\">setBackgroundSync(flag)</a></dt>\n                <dd>\n                </dd>\n                <dt><a href=\"Client.html#setDisplayName\">setDisplayName(displayName)</a></dt>\n                <dd>\n                </dd>\n                <dt><a href=\"Client.html#setProfilePicture\">setProfilePicture(media)</a></dt>\n                <dd>\n                </dd>\n                <dt><a href=\"Client.html#setStatus\">setStatus(status)</a></dt>\n                <dd>\n                </dd>\n                <dt><a href=\"Client.html#subscribeToChannel\">subscribeToChannel(channelId)</a></dt>\n                <dd>\n                </dd>\n                <dt><a href=\"Client.html#syncHistory\">syncHistory(chatId)</a></dt>\n                <dd>\n                </dd>\n                <dt><a href=\"Client.html#transferChannelOwnership\">transferChannelOwnership(channelId, newOwnerId, options)</a></dt>\n                <dd>\n                </dd>\n                <dt><a href=\"Client.html#unarchiveChat\">unarchiveChat()</a></dt>\n                <dd>\n                </dd>\n                <dt><a href=\"Client.html#unmuteChat\">unmuteChat(chatId)</a></dt>\n                <dd>\n                </dd>\n                <dt><a href=\"Client.html#unpinChat\">unpinChat()</a></dt>\n                <dd>\n                </dd>\n                <dt><a href=\"Client.html#unsubscribeFromChannel\">unsubscribeFromChannel(channelId, options)</a></dt>\n                <dd>\n                </dd>\n        </dl>\n</div>\n\n        </div>\n    </div>\n\n\n                \n\n                    <div class=\"summary-callout\">\n            <h2 class=\"summary-callout-heading\">Events</h2>\n        <div class=\"summary-content\">\n                    <div class=\"summary-column\">\n        <dl class=\"dl-summary-callout\">\n                <dt><a href=\"Client.html#event:auth_failure\">auth_failure</a></dt>\n                <dd>\n                </dd>\n                <dt><a href=\"Client.html#event:authenticated\">authenticated</a></dt>\n                <dd>\n                </dd>\n                <dt><a href=\"Client.html#event:change_battery\">change_battery</a></dt>\n                <dd>\n                </dd>\n                <dt><a href=\"Client.html#event:change_state\">change_state</a></dt>\n                <dd>\n                </dd>\n                <dt><a href=\"Client.html#event:chat_archived\">chat_archived</a></dt>\n                <dd>\n                </dd>\n                <dt><a href=\"Client.html#event:chat_removed\">chat_removed</a></dt>\n                <dd>\n                </dd>\n                <dt><a href=\"Client.html#event:code\">code</a></dt>\n                <dd>\n                </dd>\n                <dt><a href=\"Client.html#event:contact_changed\">contact_changed</a></dt>\n                <dd>\n                </dd>\n                <dt><a href=\"Client.html#event:disconnected\">disconnected</a></dt>\n                <dd>\n                </dd>\n        </dl>\n</div>\n\n                    <div class=\"summary-column\">\n        <dl class=\"dl-summary-callout\">\n                <dt><a href=\"Client.html#event:group_admin_changed\">group_admin_changed</a></dt>\n                <dd>\n                </dd>\n                <dt><a href=\"Client.html#event:group_join\">group_join</a></dt>\n                <dd>\n                </dd>\n                <dt><a href=\"Client.html#event:group_leave\">group_leave</a></dt>\n                <dd>\n                </dd>\n                <dt><a href=\"Client.html#event:group_membership_request\">group_membership_request</a></dt>\n                <dd>\n                </dd>\n                <dt><a href=\"Client.html#event:group_update\">group_update</a></dt>\n                <dd>\n                </dd>\n                <dt><a href=\"Client.html#event:incoming_call\">incoming_call</a></dt>\n                <dd>\n                </dd>\n                <dt><a href=\"Client.html#event:media_uploaded\">media_uploaded</a></dt>\n                <dd>\n                </dd>\n                <dt><a href=\"Client.html#event:message\">message</a></dt>\n                <dd>\n                </dd>\n                <dt><a href=\"Client.html#event:message_ack\">message_ack</a></dt>\n                <dd>\n                </dd>\n        </dl>\n</div>\n\n                    <div class=\"summary-column\">\n        <dl class=\"dl-summary-callout\">\n                <dt><a href=\"Client.html#event:message_ciphertext\">message_ciphertext</a></dt>\n                <dd>\n                </dd>\n                <dt><a href=\"Client.html#event:message_create\">message_create</a></dt>\n                <dd>\n                </dd>\n                <dt><a href=\"Client.html#event:message_edit\">message_edit</a></dt>\n                <dd>\n                </dd>\n                <dt><a href=\"Client.html#event:message_reaction\">message_reaction</a></dt>\n                <dd>\n                </dd>\n                <dt><a href=\"Client.html#event:message_revoke_everyone\">message_revoke_everyone</a></dt>\n                <dd>\n                </dd>\n                <dt><a href=\"Client.html#event:message_revoke_me\">message_revoke_me</a></dt>\n                <dd>\n                </dd>\n                <dt><a href=\"Client.html#event:qr\">qr</a></dt>\n                <dd>\n                </dd>\n                <dt><a href=\"Client.html#event:ready\">ready</a></dt>\n                <dd>\n                </dd>\n                <dt><a href=\"Client.html#event:vote_update\">vote_update</a></dt>\n                <dd>\n                </dd>\n        </dl>\n</div>\n\n        </div>\n    </div>\n\n    </section>\n\n\n\n        <section>\n                <h2 id=\"Client\">new&nbsp;<span class=\"symbol-name\">Client</span><span class=\"signature\"><span class=\"signature-params\">(options)</span></span></h2>        \n        \n            <section>\n        <h3>Parameters</h3>\n            <table class=\"jsdoc-details-table\">\n        <thead>\n            <tr>\n                <th>Name</th>\n                <th>Type</th>\n                <th>Optional</th>\n                <th>Description</th>\n            </tr>\n        </thead>\n        <tbody>\n                <tr>\n        <td>\n            <p>options</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>Client options</p>\n                <p>Values in <code>options</code> have the following properties:</p>\n                    <table class=\"jsdoc-details-table\">\n        <thead>\n            <tr>\n                <th>Name</th>\n                <th>Type</th>\n                <th>Optional</th>\n                <th>Description</th>\n            </tr>\n        </thead>\n        <tbody>\n                <tr>\n        <td>\n            <p>authStrategy</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>Determines how to save and restore sessions. Will use LegacySessionAuth if options.session is set. Otherwise, NoAuth will be used.</p>\n        </td>\n</tr>\n\n                <tr>\n        <td>\n            <p>webVersion</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>The version of WhatsApp Web to use. Use options.webVersionCache to configure how the version is retrieved.</p>\n        </td>\n</tr>\n\n                <tr>\n        <td>\n            <p>webVersionCache</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>Determines how to retrieve the WhatsApp Web version. Defaults to a local cache (LocalWebCache) that falls back to latest if the requested version is not found.</p>\n        </td>\n</tr>\n\n                <tr>\n        <td>\n            <p>authTimeoutMs</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>Timeout for authentication selector in puppeteer</p>\n        </td>\n</tr>\n\n                <tr>\n        <td>\n            <p>evalOnNewDoc</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>function to eval on new doc</p>\n        </td>\n</tr>\n\n                <tr>\n        <td>\n            <p>puppeteer</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>Puppeteer launch options. View docs here: https://github.com/puppeteer/puppeteer/</p>\n        </td>\n</tr>\n\n                <tr>\n        <td>\n            <p>qrMaxRetries</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>How many times should the qrcode be refreshed before giving up</p>\n        </td>\n</tr>\n\n                <tr>\n        <td>\n            <p>restartOnAuthFail</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>@deprecated This option should be set directly on the LegacySessionAuth.</p>\n        </td>\n</tr>\n\n                <tr>\n        <td>\n            <p>session</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>@deprecated Only here for backwards-compatibility. You should move to using LocalAuth, or set the authStrategy to LegacySessionAuth explicitly.</p>\n        </td>\n</tr>\n\n                <tr>\n        <td>\n            <p>takeoverOnConflict</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>If another whatsapp web session is detected (another browser), take over the session in the current browser</p>\n        </td>\n</tr>\n\n                <tr>\n        <td>\n            <p>takeoverTimeoutMs</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>How much time to wait before taking over the session</p>\n        </td>\n</tr>\n\n                <tr>\n        <td>\n            <p>userAgent</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>User agent to use in puppeteer</p>\n        </td>\n</tr>\n\n                <tr>\n        <td>\n            <p>ffmpegPath</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>Ffmpeg path to use when formatting videos to webp while sending stickers</p>\n        </td>\n</tr>\n\n                <tr>\n        <td>\n            <p>bypassCSP</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>Sets bypassing of page's Content-Security-Policy.</p>\n        </td>\n</tr>\n\n                <tr>\n        <td>\n            <p>deviceName</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>Sets the device name of a current linked device., i.e.: 'TEST'.</p>\n        </td>\n</tr>\n\n                <tr>\n        <td>\n            <p>browserName</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>Sets the browser name of a current linked device, i.e.: 'Firefox'.</p>\n        </td>\n</tr>\n\n                <tr>\n        <td>\n            <p>proxyAuthentication</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>Proxy Authentication object.</p>\n        </td>\n</tr>\n\n        </tbody>\n</table>\n\n        </td>\n</tr>\n\n        </tbody>\n</table>\n\n    </section>\n\n        \n\n        <dl class=\"dl-compact\">\n                <dt>Extends</dt>\n        <dd>EventEmitter</dd>\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <dt>Fires</dt>\n        <dd><a href=\"Client.html#event:qr\">Client#event:qr</a></dd>\n        <dd><a href=\"Client.html#event:authenticated\">Client#event:authenticated</a></dd>\n        <dd><a href=\"Client.html#event:auth_failure\">Client#event:auth_failure</a></dd>\n        <dd><a href=\"Client.html#event:ready\">Client#event:ready</a></dd>\n        <dd><a href=\"Client.html#event:message\">Client#event:message</a></dd>\n        <dd><a href=\"Client.html#event:message_ack\">Client#event:message_ack</a></dd>\n        <dd><a href=\"Client.html#event:message_create\">Client#event:message_create</a></dd>\n        <dd><a href=\"Client.html#event:message_revoke_me\">Client#event:message_revoke_me</a></dd>\n        <dd><a href=\"Client.html#event:message_revoke_everyone\">Client#event:message_revoke_everyone</a></dd>\n        <dd><a href=\"Client.html#event:message_ciphertext\">Client#event:message_ciphertext</a></dd>\n        <dd><a href=\"Client.html#event:message_edit\">Client#event:message_edit</a></dd>\n        <dd><a href=\"Client.html#event:media_uploaded\">Client#event:media_uploaded</a></dd>\n        <dd><a href=\"Client.html#event:group_join\">Client#event:group_join</a></dd>\n        <dd><a href=\"Client.html#event:group_leave\">Client#event:group_leave</a></dd>\n        <dd><a href=\"Client.html#event:group_update\">Client#event:group_update</a></dd>\n        <dd><a href=\"Client.html#event:disconnected\">Client#event:disconnected</a></dd>\n        <dd><a href=\"Client.html#event:change_state\">Client#event:change_state</a></dd>\n        <dd><a href=\"Client.html#event:contact_changed\">Client#event:contact_changed</a></dd>\n        <dd><a href=\"Client.html#event:group_admin_changed\">Client#event:group_admin_changed</a></dd>\n        <dd><a href=\"Client.html#event:group_membership_request\">Client#event:group_membership_request</a></dd>\n        <dd><a href=\"Client.html#event:vote_update\">Client#event:vote_update</a></dd>\n\n\n\n\n\n\n\n        </dl>\n\n        </section>\n\n\n            <section>\n            \n\n            \n\n            \n\n                <h2>Properties</h2>\n    <section>\n                <h3 id=\"info\"><span class=\"symbol-name\">info</span><small class=\"property-type\">\n            &nbsp;<a href=\"ClientInfo.html\">ClientInfo</a></small></h3>            <p>Current connection information</p>\n\n        \n        \n        \n\n        <dl class=\"dl-compact\">\n            \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n        </dl>\n\n                <h3 id=\"pupBrowser\"><span class=\"symbol-name\">pupBrowser</span><small class=\"property-type\">\n            &nbsp;puppeteer.Browser</small></h3>        \n        \n        \n        \n\n        <dl class=\"dl-compact\">\n            \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n        </dl>\n\n                <h3 id=\"pupPage\"><span class=\"symbol-name\">pupPage</span><small class=\"property-type\">\n            &nbsp;puppeteer.Page</small></h3>        \n        \n        \n        \n\n        <dl class=\"dl-compact\">\n            \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n        </dl>\n\n    </section>\n\n\n                <h2>Methods</h2>\n    <section>\n                <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div><h3 id=\"_muteUnmuteChat\"><span class=\"symbol-name\">_muteUnmuteChat</span><span class=\"signature\"><span class=\"signature-params\">(chatId, action, unmuteDateTs)</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing {isMuted: boolean, muteExpiration: number}</span></span></h3>            <p>Internal method to mute or unmute the chat</p>\n\n        \n            <section>\n        <h4>Parameters</h4>\n            <table class=\"jsdoc-details-table\">\n        <thead>\n            <tr>\n                <th>Name</th>\n                <th>Type</th>\n                <th>Optional</th>\n                <th>Description</th>\n            </tr>\n        </thead>\n        <tbody>\n                <tr>\n        <td>\n            <p>chatId</p>\n        </td>\n        <td>\n                <p>string</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>ID of the chat that will be muted/unmuted</p>\n        </td>\n</tr>\n\n                <tr>\n        <td>\n            <p>action</p>\n        </td>\n        <td>\n                <p>string</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>The action: 'MUTE' or 'UNMUTE'</p>\n        </td>\n</tr>\n\n                <tr>\n        <td>\n            <p>unmuteDateTs</p>\n        </td>\n        <td>\n                <p>number</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>Timestamp at which the chat will be unmuted</p>\n        </td>\n</tr>\n\n        </tbody>\n</table>\n\n    </section>\n\n        \n\n        <dl class=\"dl-compact\">\n            \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <dt>Returns</dt>\n        <dd><p><code>Promise containing {isMuted: boolean, muteExpiration: number}</code> </p></dd>\n\n\n\n        </dl>\n\n                <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div><h3 id=\"acceptChannelAdminInvite\"><span class=\"symbol-name\">acceptChannelAdminInvite</span><span class=\"signature\"><span class=\"signature-params\">(channelId)</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing boolean</span></span></h3>            <p>Accepts a channel admin invitation and promotes the current user to a channel admin</p>\n\n        \n            <section>\n        <h4>Parameter</h4>\n            <table class=\"jsdoc-details-table\">\n        <thead>\n            <tr>\n                <th>Name</th>\n                <th>Type</th>\n                <th>Optional</th>\n                <th>Description</th>\n            </tr>\n        </thead>\n        <tbody>\n                <tr>\n        <td>\n            <p>channelId</p>\n        </td>\n        <td>\n                <p>string</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>The channel ID to accept the admin invitation from</p>\n        </td>\n</tr>\n\n        </tbody>\n</table>\n\n    </section>\n\n        \n\n        <dl class=\"dl-compact\">\n            \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <dt>Returns</dt>\n        <dd><p><code>Promise containing boolean</code> <p>Returns true if the operation completed successfully, false otherwise</p></p></dd>\n\n\n\n        </dl>\n\n                <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div><h3 id=\"acceptGroupV4Invite\"><span class=\"symbol-name\">acceptGroupV4Invite</span><span class=\"signature\"><span class=\"signature-params\">(inviteInfo)</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing Object</span></span></h3>            <p>Accepts a private invitation to join a group</p>\n\n        \n            <section>\n        <h4>Parameter</h4>\n            <table class=\"jsdoc-details-table\">\n        <thead>\n            <tr>\n                <th>Name</th>\n                <th>Type</th>\n                <th>Optional</th>\n                <th>Description</th>\n            </tr>\n        </thead>\n        <tbody>\n                <tr>\n        <td>\n            <p>inviteInfo</p>\n        </td>\n        <td>\n                <p>object</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>Invite V4 Info</p>\n        </td>\n</tr>\n\n        </tbody>\n</table>\n\n    </section>\n\n        \n\n        <dl class=\"dl-compact\">\n            \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <dt>Returns</dt>\n        <dd><p><code>Promise containing Object</code> </p></dd>\n\n\n\n        </dl>\n\n                <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div><h3 id=\"acceptInvite\"><span class=\"symbol-name\">acceptInvite</span><span class=\"signature\"><span class=\"signature-params\">(inviteCode)</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing string</span></span></h3>            <p>Accepts an invitation to join a group</p>\n\n        \n            <section>\n        <h4>Parameter</h4>\n            <table class=\"jsdoc-details-table\">\n        <thead>\n            <tr>\n                <th>Name</th>\n                <th>Type</th>\n                <th>Optional</th>\n                <th>Description</th>\n            </tr>\n        </thead>\n        <tbody>\n                <tr>\n        <td>\n            <p>inviteCode</p>\n        </td>\n        <td>\n                <p>string</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>Invitation code</p>\n        </td>\n</tr>\n\n        </tbody>\n</table>\n\n    </section>\n\n        \n\n        <dl class=\"dl-compact\">\n            \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <dt>Returns</dt>\n        <dd><p><code>Promise containing string</code> <p>Id of the joined Chat</p></p></dd>\n\n\n\n        </dl>\n\n                <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div><h3 id=\"addOrEditCustomerNote\"><span class=\"symbol-name\">addOrEditCustomerNote</span><span class=\"signature\"><span class=\"signature-params\">(userId, note)</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing void</span></span></h3>            <p>Add or edit a customer note</p>\n\n        \n            <section>\n        <h4>Parameters</h4>\n            <table class=\"jsdoc-details-table\">\n        <thead>\n            <tr>\n                <th>Name</th>\n                <th>Type</th>\n                <th>Optional</th>\n                <th>Description</th>\n            </tr>\n        </thead>\n        <tbody>\n                <tr>\n        <td>\n            <p>userId</p>\n        </td>\n        <td>\n                <p>string</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>The ID of a customer to add a note to</p>\n        </td>\n</tr>\n\n                <tr>\n        <td>\n            <p>note</p>\n        </td>\n        <td>\n                <p>string</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>The note to add</p>\n        </td>\n</tr>\n\n        </tbody>\n</table>\n\n    </section>\n\n        \n\n        <dl class=\"dl-compact\">\n            \n\n\n\n\n\n\n\n\n\n\n\n\n    <dt>See also</dt>\n        <dd><a href=\"https://faq.whatsapp.com/1433099287594476\">https://faq.whatsapp.com/1433099287594476</a></dd>\n\n\n\n\n\n\n\n    <dt>Returns</dt>\n        <dd><p><code>Promise containing void</code> </p></dd>\n\n\n\n        </dl>\n\n                <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div><h3 id=\"addOrRemoveLabels\"><span class=\"symbol-name\">addOrRemoveLabels</span><span class=\"signature\"><span class=\"signature-params\">(labelIds, chatIds)</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing void</span></span></h3>            <p>Change labels in chats</p>\n\n        \n            <section>\n        <h4>Parameters</h4>\n            <table class=\"jsdoc-details-table\">\n        <thead>\n            <tr>\n                <th>Name</th>\n                <th>Type</th>\n                <th>Optional</th>\n                <th>Description</th>\n            </tr>\n        </thead>\n        <tbody>\n                <tr>\n        <td>\n            <p>labelIds</p>\n        </td>\n        <td>\n                <p>Array of (number or string)</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n        </td>\n</tr>\n\n                <tr>\n        <td>\n            <p>chatIds</p>\n        </td>\n        <td>\n                <p>Array of string</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n        </td>\n</tr>\n\n        </tbody>\n</table>\n\n    </section>\n\n        \n\n        <dl class=\"dl-compact\">\n            \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <dt>Returns</dt>\n        <dd><p><code>Promise containing void</code> </p></dd>\n\n\n\n        </dl>\n\n                <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div><h3 id=\"approveGroupMembershipRequests\"><span class=\"symbol-name\">approveGroupMembershipRequests</span><span class=\"signature\"><span class=\"signature-params\">(groupId, options)</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing Array of <a href=\"global.html#MembershipRequestActionResult\">MembershipRequestActionResult</a></span></span></h3>            <p>Approves membership requests if any</p>\n\n        \n            <section>\n        <h4>Parameters</h4>\n            <table class=\"jsdoc-details-table\">\n        <thead>\n            <tr>\n                <th>Name</th>\n                <th>Type</th>\n                <th>Optional</th>\n                <th>Description</th>\n            </tr>\n        </thead>\n        <tbody>\n                <tr>\n        <td>\n            <p>groupId</p>\n        </td>\n        <td>\n                <p>string</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>The group ID to get the membership request for</p>\n        </td>\n</tr>\n\n                <tr>\n        <td>\n            <p>options</p>\n        </td>\n        <td>\n                <p><a href=\"global.html#MembershipRequestActionOptions\">MembershipRequestActionOptions</a></p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>Options for performing a membership request action</p>\n        </td>\n</tr>\n\n        </tbody>\n</table>\n\n    </section>\n\n        \n\n        <dl class=\"dl-compact\">\n            \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <dt>Returns</dt>\n        <dd><p><code>Promise containing Array of <a href=\"global.html#MembershipRequestActionResult\">MembershipRequestActionResult</a></code> <p>Returns an array of requester IDs whose membership requests were approved and an error for each requester, if any occurred during the operation. If there are no requests, an empty array will be returned</p></p></dd>\n\n\n\n        </dl>\n\n                <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div><h3 id=\"archiveChat\"><span class=\"symbol-name\">archiveChat</span><span class=\"signature\"><span class=\"signature-params\">()</span>&nbsp;&rarr; <span class=\"signature-returns\"> boolean</span></span></h3>            <p>Enables and returns the archive state of the Chat</p>\n\n        \n        \n        \n\n        <dl class=\"dl-compact\">\n            \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <dt>Returns</dt>\n        <dd><p><code>boolean</code> </p></dd>\n\n\n\n        </dl>\n\n                <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div><h3 id=\"attachEventListeners\"><span class=\"symbol-name\">attachEventListeners</span><span class=\"signature\"><span class=\"signature-params\">()</span></span></h3>            <p>Attach event listeners to WA Web\nPrivate function</p>\n\n        \n        \n            <section>\n        <h4>Property</h4>\n            <table class=\"jsdoc-details-table\">\n        <thead>\n            <tr>\n                <th>Name</th>\n                <th>Type</th>\n                <th>Optional</th>\n                <th>Description</th>\n            </tr>\n        </thead>\n        <tbody>\n                <tr>\n        <td>\n            <p>reinject</p>\n        </td>\n        <td>\n                <p>boolean</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>is this a reinject?</p>\n        </td>\n</tr>\n\n        </tbody>\n</table>\n\n    </section>\n\n\n        <dl class=\"dl-compact\">\n            \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n        </dl>\n\n                <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div><h3 id=\"createCallLink\"><span class=\"symbol-name\">createCallLink</span><span class=\"signature\"><span class=\"signature-params\">(startTime, callType)</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing string</span></span></h3>            <p>Generates a WhatsApp call link (video call or voice call)</p>\n\n        \n            <section>\n        <h4>Parameters</h4>\n            <table class=\"jsdoc-details-table\">\n        <thead>\n            <tr>\n                <th>Name</th>\n                <th>Type</th>\n                <th>Optional</th>\n                <th>Description</th>\n            </tr>\n        </thead>\n        <tbody>\n                <tr>\n        <td>\n            <p>startTime</p>\n        </td>\n        <td>\n                <p>Date</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>The start time of the call</p>\n        </td>\n</tr>\n\n                <tr>\n        <td>\n            <p>callType</p>\n        </td>\n        <td>\n                <p>string</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>The type of a WhatsApp call link to generate, valid values are: <code>video</code> | <code>voice</code></p>\n        </td>\n</tr>\n\n        </tbody>\n</table>\n\n    </section>\n\n        \n\n        <dl class=\"dl-compact\">\n            \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <dt>Returns</dt>\n        <dd><p><code>Promise containing string</code> <p>The WhatsApp call link (https://call.whatsapp.com/video/XxXxXxXxXxXxXx) or an empty string if a generation failed.</p></p></dd>\n\n\n\n        </dl>\n\n                <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div><h3 id=\"createChannel\"><span class=\"symbol-name\">createChannel</span><span class=\"signature\"><span class=\"signature-params\">(title, options)</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing (<a href=\"global.html#CreateChannelResult\">CreateChannelResult</a> or string)</span></span></h3>            <p>Creates a new channel</p>\n\n        \n            <section>\n        <h4>Parameters</h4>\n            <table class=\"jsdoc-details-table\">\n        <thead>\n            <tr>\n                <th>Name</th>\n                <th>Type</th>\n                <th>Optional</th>\n                <th>Description</th>\n            </tr>\n        </thead>\n        <tbody>\n                <tr>\n        <td>\n            <p>title</p>\n        </td>\n        <td>\n                <p>string</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>The channel name</p>\n        </td>\n</tr>\n\n                <tr>\n        <td>\n            <p>options</p>\n        </td>\n        <td>\n                <p><a href=\"global.html#CreateChannelOptions\">CreateChannelOptions</a></p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n        </td>\n</tr>\n\n        </tbody>\n</table>\n\n    </section>\n\n        \n\n        <dl class=\"dl-compact\">\n            \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <dt>Returns</dt>\n        <dd><p><code>Promise containing (<a href=\"global.html#CreateChannelResult\">CreateChannelResult</a> or string)</code> <p>Returns an object that handles the result for the channel creation or an error message as a string</p></p></dd>\n\n\n\n        </dl>\n\n                <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div><h3 id=\"createGroup\"><span class=\"symbol-name\">createGroup</span><span class=\"signature\"><span class=\"signature-params\">(title, participants, options)</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing (<a href=\"global.html#CreateGroupResult\">CreateGroupResult</a> or string)</span></span></h3>            <p>Creates a new group</p>\n\n        \n            <section>\n        <h4>Parameters</h4>\n            <table class=\"jsdoc-details-table\">\n        <thead>\n            <tr>\n                <th>Name</th>\n                <th>Type</th>\n                <th>Optional</th>\n                <th>Description</th>\n            </tr>\n        </thead>\n        <tbody>\n                <tr>\n        <td>\n            <p>title</p>\n        </td>\n        <td>\n                <p>string</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>Group title</p>\n        </td>\n</tr>\n\n                <tr>\n        <td>\n            <p>participants</p>\n        </td>\n        <td>\n                <p>(string, <a href=\"Contact.html\">Contact</a>, Array of (<a href=\"Contact.html\">Contact</a> or string), or undefined)</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>A single Contact object or an ID as a string or an array of Contact objects or contact IDs to add to the group</p>\n        </td>\n</tr>\n\n                <tr>\n        <td>\n            <p>options</p>\n        </td>\n        <td>\n                <p><a href=\"global.html#CreateGroupOptions\">CreateGroupOptions</a></p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>An object that handles options for group creation</p>\n        </td>\n</tr>\n\n        </tbody>\n</table>\n\n    </section>\n\n        \n\n        <dl class=\"dl-compact\">\n            \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <dt>Returns</dt>\n        <dd><p><code>Promise containing (<a href=\"global.html#CreateGroupResult\">CreateGroupResult</a> or string)</code> <p>Object with resulting data or an error message as a string</p></p></dd>\n\n\n\n        </dl>\n\n                <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div><h3 id=\"deleteAddressbookContact\"><span class=\"symbol-name\">deleteAddressbookContact</span><span class=\"signature\"><span class=\"signature-params\">(phoneNumber)</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing void</span></span></h3>            <p>Deletes the contact from user's addressbook</p>\n\n        \n            <section>\n        <h4>Parameter</h4>\n            <table class=\"jsdoc-details-table\">\n        <thead>\n            <tr>\n                <th>Name</th>\n                <th>Type</th>\n                <th>Optional</th>\n                <th>Description</th>\n            </tr>\n        </thead>\n        <tbody>\n                <tr>\n        <td>\n            <p>phoneNumber</p>\n        </td>\n        <td>\n                <p>string</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>The contact's phone number in a format &quot;17182222222&quot;, where &quot;1&quot; is a country code</p>\n        </td>\n</tr>\n\n        </tbody>\n</table>\n\n    </section>\n\n        \n\n        <dl class=\"dl-compact\">\n            \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <dt>Returns</dt>\n        <dd><p><code>Promise containing void</code> </p></dd>\n\n\n\n        </dl>\n\n                <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div><h3 id=\"deleteChannel\"><span class=\"symbol-name\">deleteChannel</span><span class=\"signature\"><span class=\"signature-params\">(channelId)</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing boolean</span></span></h3>            <p>Deletes the channel you created</p>\n\n        \n            <section>\n        <h4>Parameter</h4>\n            <table class=\"jsdoc-details-table\">\n        <thead>\n            <tr>\n                <th>Name</th>\n                <th>Type</th>\n                <th>Optional</th>\n                <th>Description</th>\n            </tr>\n        </thead>\n        <tbody>\n                <tr>\n        <td>\n            <p>channelId</p>\n        </td>\n        <td>\n                <p>string</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>The ID of a channel to delete</p>\n        </td>\n</tr>\n\n        </tbody>\n</table>\n\n    </section>\n\n        \n\n        <dl class=\"dl-compact\">\n            \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <dt>Returns</dt>\n        <dd><p><code>Promise containing boolean</code> <p>Returns true if the operation completed successfully, false otherwise</p></p></dd>\n\n\n\n        </dl>\n\n                <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div><h3 id=\"deleteProfilePicture\"><span class=\"symbol-name\">deleteProfilePicture</span><span class=\"signature\"><span class=\"signature-params\">()</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing boolean</span></span></h3>            <p>Deletes the current user's profile picture.</p>\n\n        \n        \n        \n\n        <dl class=\"dl-compact\">\n            \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <dt>Returns</dt>\n        <dd><p><code>Promise containing boolean</code> <p>Returns true if the picture was properly deleted.</p></p></dd>\n\n\n\n        </dl>\n\n                <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div><h3 id=\"demoteChannelAdmin\"><span class=\"symbol-name\">demoteChannelAdmin</span><span class=\"signature\"><span class=\"signature-params\">(channelId, userId)</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing boolean</span></span></h3>            <p>Demotes a channel admin to a regular subscriber (can be used also for self-demotion)</p>\n\n        \n            <section>\n        <h4>Parameters</h4>\n            <table class=\"jsdoc-details-table\">\n        <thead>\n            <tr>\n                <th>Name</th>\n                <th>Type</th>\n                <th>Optional</th>\n                <th>Description</th>\n            </tr>\n        </thead>\n        <tbody>\n                <tr>\n        <td>\n            <p>channelId</p>\n        </td>\n        <td>\n                <p>string</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>The channel ID to demote an admin in</p>\n        </td>\n</tr>\n\n                <tr>\n        <td>\n            <p>userId</p>\n        </td>\n        <td>\n                <p>string</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>The user ID to demote</p>\n        </td>\n</tr>\n\n        </tbody>\n</table>\n\n    </section>\n\n        \n\n        <dl class=\"dl-compact\">\n            \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <dt>Returns</dt>\n        <dd><p><code>Promise containing boolean</code> <p>Returns true if the operation completed successfully, false otherwise</p></p></dd>\n\n\n\n        </dl>\n\n                <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div><h3 id=\"destroy\"><span class=\"symbol-name\">destroy</span><span class=\"signature\"><span class=\"signature-params\">()</span></span></h3>            <p>Closes the client</p>\n\n        \n        \n        \n\n        <dl class=\"dl-compact\">\n            \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n        </dl>\n\n                <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div><h3 id=\"getBlockedContacts\"><span class=\"symbol-name\">getBlockedContacts</span><span class=\"signature\"><span class=\"signature-params\">()</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing Array of <a href=\"Contact.html\">Contact</a></span></span></h3>            <p>Gets all blocked contacts by host account</p>\n\n        \n        \n        \n\n        <dl class=\"dl-compact\">\n            \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <dt>Returns</dt>\n        <dd><p><code>Promise containing Array of <a href=\"Contact.html\">Contact</a></code> </p></dd>\n\n\n\n        </dl>\n\n                <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div><h3 id=\"getBroadcastById\"><span class=\"symbol-name\">getBroadcastById</span><span class=\"signature\"><span class=\"signature-params\">(contactId)</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing <a href=\"Broadcast.html\">Broadcast</a></span></span></h3>            <p>Get broadcast instance by current user ID</p>\n\n        \n            <section>\n        <h4>Parameter</h4>\n            <table class=\"jsdoc-details-table\">\n        <thead>\n            <tr>\n                <th>Name</th>\n                <th>Type</th>\n                <th>Optional</th>\n                <th>Description</th>\n            </tr>\n        </thead>\n        <tbody>\n                <tr>\n        <td>\n            <p>contactId</p>\n        </td>\n        <td>\n                <p>string</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n        </td>\n</tr>\n\n        </tbody>\n</table>\n\n    </section>\n\n        \n\n        <dl class=\"dl-compact\">\n            \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <dt>Returns</dt>\n        <dd><p><code>Promise containing <a href=\"Broadcast.html\">Broadcast</a></code> </p></dd>\n\n\n\n        </dl>\n\n                <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div><h3 id=\"getBroadcasts\"><span class=\"symbol-name\">getBroadcasts</span><span class=\"signature\"><span class=\"signature-params\">()</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing Array of <a href=\"Broadcast.html\">Broadcast</a></span></span></h3>            <p>Get all current Broadcast</p>\n\n        \n        \n        \n\n        <dl class=\"dl-compact\">\n            \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <dt>Returns</dt>\n        <dd><p><code>Promise containing Array of <a href=\"Broadcast.html\">Broadcast</a></code> </p></dd>\n\n\n\n        </dl>\n\n                <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div><h3 id=\"getChannelByInviteCode\"><span class=\"symbol-name\">getChannelByInviteCode</span><span class=\"signature\"><span class=\"signature-params\">(inviteCode)</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing <a href=\"Channel.html\">Channel</a></span></span></h3>            <p>Gets a <a href=\"Channel.html\"><code>Channel</code></a> instance by invite code</p>\n\n        \n            <section>\n        <h4>Parameter</h4>\n            <table class=\"jsdoc-details-table\">\n        <thead>\n            <tr>\n                <th>Name</th>\n                <th>Type</th>\n                <th>Optional</th>\n                <th>Description</th>\n            </tr>\n        </thead>\n        <tbody>\n                <tr>\n        <td>\n            <p>inviteCode</p>\n        </td>\n        <td>\n                <p>string</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>The code that comes after the 'https://whatsapp.com/channel/'</p>\n        </td>\n</tr>\n\n        </tbody>\n</table>\n\n    </section>\n\n        \n\n        <dl class=\"dl-compact\">\n            \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <dt>Returns</dt>\n        <dd><p><code>Promise containing <a href=\"Channel.html\">Channel</a></code> </p></dd>\n\n\n\n        </dl>\n\n                <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div><h3 id=\"getChannels\"><span class=\"symbol-name\">getChannels</span><span class=\"signature\"><span class=\"signature-params\">()</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing Array of <a href=\"Channel.html\">Channel</a></span></span></h3>            <p>Gets all cached <a href=\"Channel.html\"><code>Channel</code></a> instance</p>\n\n        \n        \n        \n\n        <dl class=\"dl-compact\">\n            \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <dt>Returns</dt>\n        <dd><p><code>Promise containing Array of <a href=\"Channel.html\">Channel</a></code> </p></dd>\n\n\n\n        </dl>\n\n                <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div><h3 id=\"getChatById\"><span class=\"symbol-name\">getChatById</span><span class=\"signature\"><span class=\"signature-params\">(chatId)</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing (<a href=\"Chat.html\">Chat</a> or <a href=\"Channel.html\">Channel</a>)</span></span></h3>            <p>Gets chat or channel instance by ID</p>\n\n        \n            <section>\n        <h4>Parameter</h4>\n            <table class=\"jsdoc-details-table\">\n        <thead>\n            <tr>\n                <th>Name</th>\n                <th>Type</th>\n                <th>Optional</th>\n                <th>Description</th>\n            </tr>\n        </thead>\n        <tbody>\n                <tr>\n        <td>\n            <p>chatId</p>\n        </td>\n        <td>\n                <p>string</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n        </td>\n</tr>\n\n        </tbody>\n</table>\n\n    </section>\n\n        \n\n        <dl class=\"dl-compact\">\n            \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <dt>Returns</dt>\n        <dd><p><code>Promise containing (<a href=\"Chat.html\">Chat</a> or <a href=\"Channel.html\">Channel</a>)</code> </p></dd>\n\n\n\n        </dl>\n\n                <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div><h3 id=\"getChatLabels\"><span class=\"symbol-name\">getChatLabels</span><span class=\"signature\"><span class=\"signature-params\">(chatId)</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing Array of <a href=\"Label.html\">Label</a></span></span></h3>            <p>Get all Labels assigned to a chat</p>\n\n        \n            <section>\n        <h4>Parameter</h4>\n            <table class=\"jsdoc-details-table\">\n        <thead>\n            <tr>\n                <th>Name</th>\n                <th>Type</th>\n                <th>Optional</th>\n                <th>Description</th>\n            </tr>\n        </thead>\n        <tbody>\n                <tr>\n        <td>\n            <p>chatId</p>\n        </td>\n        <td>\n                <p>string</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n        </td>\n</tr>\n\n        </tbody>\n</table>\n\n    </section>\n\n        \n\n        <dl class=\"dl-compact\">\n            \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <dt>Returns</dt>\n        <dd><p><code>Promise containing Array of <a href=\"Label.html\">Label</a></code> </p></dd>\n\n\n\n        </dl>\n\n                <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div><h3 id=\"getChats\"><span class=\"symbol-name\">getChats</span><span class=\"signature\"><span class=\"signature-params\">()</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing Array of <a href=\"Chat.html\">Chat</a></span></span></h3>            <p>Get all current chat instances</p>\n\n        \n        \n        \n\n        <dl class=\"dl-compact\">\n            \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <dt>Returns</dt>\n        <dd><p><code>Promise containing Array of <a href=\"Chat.html\">Chat</a></code> </p></dd>\n\n\n\n        </dl>\n\n                <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div><h3 id=\"getChatsByLabelId\"><span class=\"symbol-name\">getChatsByLabelId</span><span class=\"signature\"><span class=\"signature-params\">(labelId)</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing Array of <a href=\"Chat.html\">Chat</a></span></span></h3>            <p>Get all Chats for a specific Label</p>\n\n        \n            <section>\n        <h4>Parameter</h4>\n            <table class=\"jsdoc-details-table\">\n        <thead>\n            <tr>\n                <th>Name</th>\n                <th>Type</th>\n                <th>Optional</th>\n                <th>Description</th>\n            </tr>\n        </thead>\n        <tbody>\n                <tr>\n        <td>\n            <p>labelId</p>\n        </td>\n        <td>\n                <p>string</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n        </td>\n</tr>\n\n        </tbody>\n</table>\n\n    </section>\n\n        \n\n        <dl class=\"dl-compact\">\n            \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <dt>Returns</dt>\n        <dd><p><code>Promise containing Array of <a href=\"Chat.html\">Chat</a></code> </p></dd>\n\n\n\n        </dl>\n\n                <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div><h3 id=\"getCommonGroups\"><span class=\"symbol-name\">getCommonGroups</span><span class=\"signature\"><span class=\"signature-params\">(contactId)</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing Array of WAWebJS.ChatId</span></span></h3>            <p>Gets the Contact's common groups with you. Returns empty array if you don't have any common group.</p>\n\n        \n            <section>\n        <h4>Parameter</h4>\n            <table class=\"jsdoc-details-table\">\n        <thead>\n            <tr>\n                <th>Name</th>\n                <th>Type</th>\n                <th>Optional</th>\n                <th>Description</th>\n            </tr>\n        </thead>\n        <tbody>\n                <tr>\n        <td>\n            <p>contactId</p>\n        </td>\n        <td>\n                <p>string</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>the whatsapp user's ID (_serialized format)</p>\n        </td>\n</tr>\n\n        </tbody>\n</table>\n\n    </section>\n\n        \n\n        <dl class=\"dl-compact\">\n            \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <dt>Returns</dt>\n        <dd><p><code>Promise containing Array of WAWebJS.ChatId</code> </p></dd>\n\n\n\n        </dl>\n\n                <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div><h3 id=\"getContactById\"><span class=\"symbol-name\">getContactById</span><span class=\"signature\"><span class=\"signature-params\">(contactId)</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing <a href=\"Contact.html\">Contact</a></span></span></h3>            <p>Get contact instance by ID</p>\n\n        \n            <section>\n        <h4>Parameter</h4>\n            <table class=\"jsdoc-details-table\">\n        <thead>\n            <tr>\n                <th>Name</th>\n                <th>Type</th>\n                <th>Optional</th>\n                <th>Description</th>\n            </tr>\n        </thead>\n        <tbody>\n                <tr>\n        <td>\n            <p>contactId</p>\n        </td>\n        <td>\n                <p>string</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n        </td>\n</tr>\n\n        </tbody>\n</table>\n\n    </section>\n\n        \n\n        <dl class=\"dl-compact\">\n            \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <dt>Returns</dt>\n        <dd><p><code>Promise containing <a href=\"Contact.html\">Contact</a></code> </p></dd>\n\n\n\n        </dl>\n\n                <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div><h3 id=\"getContactDeviceCount\"><span class=\"symbol-name\">getContactDeviceCount</span><span class=\"signature\"><span class=\"signature-params\">(userId)</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing number</span></span></h3>            <p>Get user device count by ID\nEach WaWeb Connection counts as one device, and the phone (if exists) counts as one\nSo for a non-enterprise user with one WaWeb connection it should return &quot;2&quot;</p>\n\n        \n            <section>\n        <h4>Parameter</h4>\n            <table class=\"jsdoc-details-table\">\n        <thead>\n            <tr>\n                <th>Name</th>\n                <th>Type</th>\n                <th>Optional</th>\n                <th>Description</th>\n            </tr>\n        </thead>\n        <tbody>\n                <tr>\n        <td>\n            <p>userId</p>\n        </td>\n        <td>\n                <p>string</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n        </td>\n</tr>\n\n        </tbody>\n</table>\n\n    </section>\n\n        \n\n        <dl class=\"dl-compact\">\n            \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <dt>Returns</dt>\n        <dd><p><code>Promise containing number</code> </p></dd>\n\n\n\n        </dl>\n\n                <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div><h3 id=\"getContactLidAndPhone\"><span class=\"symbol-name\">getContactLidAndPhone</span><span class=\"signature\"><span class=\"signature-params\">(userIds)</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing Array of {lid: string, pn: string}</span></span></h3>            <p>Get lid and phone number for multiple users</p>\n\n        \n            <section>\n        <h4>Parameter</h4>\n            <table class=\"jsdoc-details-table\">\n        <thead>\n            <tr>\n                <th>Name</th>\n                <th>Type</th>\n                <th>Optional</th>\n                <th>Description</th>\n            </tr>\n        </thead>\n        <tbody>\n                <tr>\n        <td>\n            <p>userIds</p>\n        </td>\n        <td>\n                <p>Array of string</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>Array of user IDs</p>\n        </td>\n</tr>\n\n        </tbody>\n</table>\n\n    </section>\n\n        \n\n        <dl class=\"dl-compact\">\n            \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <dt>Returns</dt>\n        <dd><p><code>Promise containing Array of {lid: string, pn: string}</code> </p></dd>\n\n\n\n        </dl>\n\n                <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div><h3 id=\"getContacts\"><span class=\"symbol-name\">getContacts</span><span class=\"signature\"><span class=\"signature-params\">()</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing Array of <a href=\"Contact.html\">Contact</a></span></span></h3>            <p>Get all current contact instances</p>\n\n        \n        \n        \n\n        <dl class=\"dl-compact\">\n            \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <dt>Returns</dt>\n        <dd><p><code>Promise containing Array of <a href=\"Contact.html\">Contact</a></code> </p></dd>\n\n\n\n        </dl>\n\n                <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div><h3 id=\"getCountryCode\"><span class=\"symbol-name\">getCountryCode</span><span class=\"signature\"><span class=\"signature-params\">(number)</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing string</span></span></h3>            <p>Get the country code of a WhatsApp ID.</p>\n\n        \n            <section>\n        <h4>Parameter</h4>\n            <table class=\"jsdoc-details-table\">\n        <thead>\n            <tr>\n                <th>Name</th>\n                <th>Type</th>\n                <th>Optional</th>\n                <th>Description</th>\n            </tr>\n        </thead>\n        <tbody>\n                <tr>\n        <td>\n            <p>number</p>\n        </td>\n        <td>\n                <p>string</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>Number or ID</p>\n        </td>\n</tr>\n\n        </tbody>\n</table>\n\n    </section>\n\n        \n\n        <dl class=\"dl-compact\">\n            \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <dt>Returns</dt>\n        <dd><p><code>Promise containing string</code> </p></dd>\n\n\n\n        </dl>\n\n                <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div><h3 id=\"getCustomerNote\"><span class=\"symbol-name\">getCustomerNote</span><span class=\"signature\"><span class=\"signature-params\">(userId)</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing {chatId: string, content: string, createdAt: number, id: string, modifiedAt: number, type: string}</span></span></h3>            <p>Get a customer note</p>\n\n        \n            <section>\n        <h4>Parameter</h4>\n            <table class=\"jsdoc-details-table\">\n        <thead>\n            <tr>\n                <th>Name</th>\n                <th>Type</th>\n                <th>Optional</th>\n                <th>Description</th>\n            </tr>\n        </thead>\n        <tbody>\n                <tr>\n        <td>\n            <p>userId</p>\n        </td>\n        <td>\n                <p>string</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>The ID of a customer to get a note from</p>\n        </td>\n</tr>\n\n        </tbody>\n</table>\n\n    </section>\n\n        \n\n        <dl class=\"dl-compact\">\n            \n\n\n\n\n\n\n\n\n\n\n\n\n    <dt>See also</dt>\n        <dd><a href=\"https://faq.whatsapp.com/1433099287594476\">https://faq.whatsapp.com/1433099287594476</a></dd>\n\n\n\n\n\n\n\n    <dt>Returns</dt>\n        <dd><p><code>Promise containing {chatId: string, content: string, createdAt: number, id: string, modifiedAt: number, type: string}</code> </p></dd>\n\n\n\n        </dl>\n\n                <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div><h3 id=\"getFormattedNumber\"><span class=\"symbol-name\">getFormattedNumber</span><span class=\"signature\"><span class=\"signature-params\">(number)</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing string</span></span></h3>            <p>Get the formatted number of a WhatsApp ID.</p>\n\n        \n            <section>\n        <h4>Parameter</h4>\n            <table class=\"jsdoc-details-table\">\n        <thead>\n            <tr>\n                <th>Name</th>\n                <th>Type</th>\n                <th>Optional</th>\n                <th>Description</th>\n            </tr>\n        </thead>\n        <tbody>\n                <tr>\n        <td>\n            <p>number</p>\n        </td>\n        <td>\n                <p>string</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>Number or ID</p>\n        </td>\n</tr>\n\n        </tbody>\n</table>\n\n    </section>\n\n        \n\n        <dl class=\"dl-compact\">\n            \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <dt>Returns</dt>\n        <dd><p><code>Promise containing string</code> </p></dd>\n\n\n\n        </dl>\n\n                <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div><h3 id=\"getGroupMembershipRequests\"><span class=\"symbol-name\">getGroupMembershipRequests</span><span class=\"signature\"><span class=\"signature-params\">(groupId)</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing Array of <a href=\"global.html#GroupMembershipRequest\">GroupMembershipRequest</a></span></span></h3>            <p>Gets an array of membership requests</p>\n\n        \n            <section>\n        <h4>Parameter</h4>\n            <table class=\"jsdoc-details-table\">\n        <thead>\n            <tr>\n                <th>Name</th>\n                <th>Type</th>\n                <th>Optional</th>\n                <th>Description</th>\n            </tr>\n        </thead>\n        <tbody>\n                <tr>\n        <td>\n            <p>groupId</p>\n        </td>\n        <td>\n                <p>string</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>The ID of a group to get membership requests for</p>\n        </td>\n</tr>\n\n        </tbody>\n</table>\n\n    </section>\n\n        \n\n        <dl class=\"dl-compact\">\n            \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <dt>Returns</dt>\n        <dd><p><code>Promise containing Array of <a href=\"global.html#GroupMembershipRequest\">GroupMembershipRequest</a></code> <p>An array of membership requests</p></p></dd>\n\n\n\n        </dl>\n\n                <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div><h3 id=\"getInviteInfo\"><span class=\"symbol-name\">getInviteInfo</span><span class=\"signature\"><span class=\"signature-params\">(inviteCode)</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing object</span></span></h3>            <p>Returns an object with information about the invite code's group</p>\n\n        \n            <section>\n        <h4>Parameter</h4>\n            <table class=\"jsdoc-details-table\">\n        <thead>\n            <tr>\n                <th>Name</th>\n                <th>Type</th>\n                <th>Optional</th>\n                <th>Description</th>\n            </tr>\n        </thead>\n        <tbody>\n                <tr>\n        <td>\n            <p>inviteCode</p>\n        </td>\n        <td>\n                <p>string</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n        </td>\n</tr>\n\n        </tbody>\n</table>\n\n    </section>\n\n        \n\n        <dl class=\"dl-compact\">\n            \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <dt>Returns</dt>\n        <dd><p><code>Promise containing object</code> <p>Invite information</p></p></dd>\n\n\n\n        </dl>\n\n                <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div><h3 id=\"getLabelById\"><span class=\"symbol-name\">getLabelById</span><span class=\"signature\"><span class=\"signature-params\">(labelId)</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing <a href=\"Label.html\">Label</a></span></span></h3>            <p>Get Label instance by ID</p>\n\n        \n            <section>\n        <h4>Parameter</h4>\n            <table class=\"jsdoc-details-table\">\n        <thead>\n            <tr>\n                <th>Name</th>\n                <th>Type</th>\n                <th>Optional</th>\n                <th>Description</th>\n            </tr>\n        </thead>\n        <tbody>\n                <tr>\n        <td>\n            <p>labelId</p>\n        </td>\n        <td>\n                <p>string</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n        </td>\n</tr>\n\n        </tbody>\n</table>\n\n    </section>\n\n        \n\n        <dl class=\"dl-compact\">\n            \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <dt>Returns</dt>\n        <dd><p><code>Promise containing <a href=\"Label.html\">Label</a></code> </p></dd>\n\n\n\n        </dl>\n\n                <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div><h3 id=\"getLabels\"><span class=\"symbol-name\">getLabels</span><span class=\"signature\"><span class=\"signature-params\">()</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing Array of <a href=\"Label.html\">Label</a></span></span></h3>            <p>Get all current Labels</p>\n\n        \n        \n        \n\n        <dl class=\"dl-compact\">\n            \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <dt>Returns</dt>\n        <dd><p><code>Promise containing Array of <a href=\"Label.html\">Label</a></code> </p></dd>\n\n\n\n        </dl>\n\n                <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div><h3 id=\"getMessageById\"><span class=\"symbol-name\">getMessageById</span><span class=\"signature\"><span class=\"signature-params\">(messageId)</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing <a href=\"Message.html\">Message</a></span></span></h3>            <p>Get message by ID</p>\n\n        \n            <section>\n        <h4>Parameter</h4>\n            <table class=\"jsdoc-details-table\">\n        <thead>\n            <tr>\n                <th>Name</th>\n                <th>Type</th>\n                <th>Optional</th>\n                <th>Description</th>\n            </tr>\n        </thead>\n        <tbody>\n                <tr>\n        <td>\n            <p>messageId</p>\n        </td>\n        <td>\n                <p>string</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n        </td>\n</tr>\n\n        </tbody>\n</table>\n\n    </section>\n\n        \n\n        <dl class=\"dl-compact\">\n            \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <dt>Returns</dt>\n        <dd><p><code>Promise containing <a href=\"Message.html\">Message</a></code> </p></dd>\n\n\n\n        </dl>\n\n                <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div><h3 id=\"getNumberId\"><span class=\"symbol-name\">getNumberId</span><span class=\"signature\"><span class=\"signature-params\">(number)</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing (Object or null)</span></span></h3>            <p>Get the registered WhatsApp ID for a number.\nWill return null if the number is not registered on WhatsApp.</p>\n\n        \n            <section>\n        <h4>Parameter</h4>\n            <table class=\"jsdoc-details-table\">\n        <thead>\n            <tr>\n                <th>Name</th>\n                <th>Type</th>\n                <th>Optional</th>\n                <th>Description</th>\n            </tr>\n        </thead>\n        <tbody>\n                <tr>\n        <td>\n            <p>number</p>\n        </td>\n        <td>\n                <p>string</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>Number or ID (&quot;@c.us&quot; will be automatically appended if not specified)</p>\n        </td>\n</tr>\n\n        </tbody>\n</table>\n\n    </section>\n\n        \n\n        <dl class=\"dl-compact\">\n            \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <dt>Returns</dt>\n        <dd><p><code>Promise containing (Object or null)</code> </p></dd>\n\n\n\n        </dl>\n\n                <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div><h3 id=\"getPinnedMessages\"><span class=\"symbol-name\">getPinnedMessages</span><span class=\"signature\"><span class=\"signature-params\">(chatId)</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing Array of <a href=\"Message.html\">Message</a></span></span></h3>            <p>Gets instances of all pinned messages in a chat</p>\n\n        \n            <section>\n        <h4>Parameter</h4>\n            <table class=\"jsdoc-details-table\">\n        <thead>\n            <tr>\n                <th>Name</th>\n                <th>Type</th>\n                <th>Optional</th>\n                <th>Description</th>\n            </tr>\n        </thead>\n        <tbody>\n                <tr>\n        <td>\n            <p>chatId</p>\n        </td>\n        <td>\n                <p>string</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>The chat ID</p>\n        </td>\n</tr>\n\n        </tbody>\n</table>\n\n    </section>\n\n        \n\n        <dl class=\"dl-compact\">\n            \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <dt>Returns</dt>\n        <dd><p><code>Promise containing Array of <a href=\"Message.html\">Message</a></code> </p></dd>\n\n\n\n        </dl>\n\n                <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div><h3 id=\"getPollVotes\"><span class=\"symbol-name\">getPollVotes</span><span class=\"signature\"><span class=\"signature-params\">(messageId)</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing Array of <a href=\"PollVote.html\">PollVote</a></span></span></h3>            <p>Get Poll Votes</p>\n\n        \n            <section>\n        <h4>Parameter</h4>\n            <table class=\"jsdoc-details-table\">\n        <thead>\n            <tr>\n                <th>Name</th>\n                <th>Type</th>\n                <th>Optional</th>\n                <th>Description</th>\n            </tr>\n        </thead>\n        <tbody>\n                <tr>\n        <td>\n            <p>messageId</p>\n        </td>\n        <td>\n                <p>string</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n        </td>\n</tr>\n\n        </tbody>\n</table>\n\n    </section>\n\n        \n\n        <dl class=\"dl-compact\">\n            \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <dt>Returns</dt>\n        <dd><p><code>Promise containing Array of <a href=\"PollVote.html\">PollVote</a></code> </p></dd>\n\n\n\n        </dl>\n\n                <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div><h3 id=\"getProfilePicUrl\"><span class=\"symbol-name\">getProfilePicUrl</span><span class=\"signature\"><span class=\"signature-params\">(contactId)</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing string</span></span></h3>            <p>Returns the contact ID's profile picture URL, if privacy settings allow it</p>\n\n        \n            <section>\n        <h4>Parameter</h4>\n            <table class=\"jsdoc-details-table\">\n        <thead>\n            <tr>\n                <th>Name</th>\n                <th>Type</th>\n                <th>Optional</th>\n                <th>Description</th>\n            </tr>\n        </thead>\n        <tbody>\n                <tr>\n        <td>\n            <p>contactId</p>\n        </td>\n        <td>\n                <p>string</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>the whatsapp user's ID</p>\n        </td>\n</tr>\n\n        </tbody>\n</table>\n\n    </section>\n\n        \n\n        <dl class=\"dl-compact\">\n            \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <dt>Returns</dt>\n        <dd><p><code>Promise containing string</code> </p></dd>\n\n\n\n        </dl>\n\n                <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div><h3 id=\"getState\"><span class=\"symbol-name\">getState</span><span class=\"signature\"><span class=\"signature-params\">()</span>&nbsp;&rarr; <span class=\"signature-returns\"> <a href=\"global.html#WAState\">WAState</a></span></span></h3>            <p>Gets the current connection state for the client</p>\n\n        \n        \n        \n\n        <dl class=\"dl-compact\">\n            \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <dt>Returns</dt>\n        <dd><p><code><a href=\"global.html#WAState\">WAState</a></code> </p></dd>\n\n\n\n        </dl>\n\n                <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div><h3 id=\"getWWebVersion\"><span class=\"symbol-name\">getWWebVersion</span><span class=\"signature\"><span class=\"signature-params\">()</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing string</span></span></h3>            <p>Returns the version of WhatsApp Web currently being run</p>\n\n        \n        \n        \n\n        <dl class=\"dl-compact\">\n            \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <dt>Returns</dt>\n        <dd><p><code>Promise containing string</code> </p></dd>\n\n\n\n        </dl>\n\n                <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div><h3 id=\"initialize\"><span class=\"symbol-name\">initialize</span><span class=\"signature\"><span class=\"signature-params\">()</span></span></h3>            <p>Sets up events and requirements, kicks off authentication request</p>\n\n        \n        \n        \n\n        <dl class=\"dl-compact\">\n            \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n        </dl>\n\n                <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div><h3 id=\"inject\"><span class=\"symbol-name\">inject</span><span class=\"signature\"><span class=\"signature-params\">()</span></span></h3>            <p>Injection logic\nPrivate function</p>\n\n        \n        \n        \n\n        <dl class=\"dl-compact\">\n            \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n        </dl>\n\n                <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div><h3 id=\"isRegisteredUser\"><span class=\"symbol-name\">isRegisteredUser</span><span class=\"signature\"><span class=\"signature-params\">(id)</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing Boolean</span></span></h3>            <p>Check if a given ID is registered in whatsapp</p>\n\n        \n            <section>\n        <h4>Parameter</h4>\n            <table class=\"jsdoc-details-table\">\n        <thead>\n            <tr>\n                <th>Name</th>\n                <th>Type</th>\n                <th>Optional</th>\n                <th>Description</th>\n            </tr>\n        </thead>\n        <tbody>\n                <tr>\n        <td>\n            <p>id</p>\n        </td>\n        <td>\n                <p>string</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>the whatsapp user's ID</p>\n        </td>\n</tr>\n\n        </tbody>\n</table>\n\n    </section>\n\n        \n\n        <dl class=\"dl-compact\">\n            \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <dt>Returns</dt>\n        <dd><p><code>Promise containing Boolean</code> </p></dd>\n\n\n\n        </dl>\n\n                <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div><h3 id=\"logout\"><span class=\"symbol-name\">logout</span><span class=\"signature\"><span class=\"signature-params\">()</span></span></h3>            <p>Logs out the client, closing the current session</p>\n\n        \n        \n        \n\n        <dl class=\"dl-compact\">\n            \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n        </dl>\n\n                <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div><h3 id=\"markChatUnread\"><span class=\"symbol-name\">markChatUnread</span><span class=\"signature\"><span class=\"signature-params\">(chatId)</span></span></h3>            <p>Mark the Chat as unread</p>\n\n        \n            <section>\n        <h4>Parameter</h4>\n            <table class=\"jsdoc-details-table\">\n        <thead>\n            <tr>\n                <th>Name</th>\n                <th>Type</th>\n                <th>Optional</th>\n                <th>Description</th>\n            </tr>\n        </thead>\n        <tbody>\n                <tr>\n        <td>\n            <p>chatId</p>\n        </td>\n        <td>\n                <p>string</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>ID of the chat that will be marked as unread</p>\n        </td>\n</tr>\n\n        </tbody>\n</table>\n\n    </section>\n\n        \n\n        <dl class=\"dl-compact\">\n            \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n        </dl>\n\n                <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div><h3 id=\"muteChat\"><span class=\"symbol-name\">muteChat</span><span class=\"signature\"><span class=\"signature-params\">(chatId, unmuteDate)</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing {isMuted: boolean, muteExpiration: number}</span></span></h3>            <p>Mutes this chat forever, unless a date is specified</p>\n\n        \n            <section>\n        <h4>Parameters</h4>\n            <table class=\"jsdoc-details-table\">\n        <thead>\n            <tr>\n                <th>Name</th>\n                <th>Type</th>\n                <th>Optional</th>\n                <th>Description</th>\n            </tr>\n        </thead>\n        <tbody>\n                <tr>\n        <td>\n            <p>chatId</p>\n        </td>\n        <td>\n                <p>string</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>ID of the chat that will be muted</p>\n        </td>\n</tr>\n\n                <tr>\n        <td>\n            <p>unmuteDate</p>\n        </td>\n        <td>\n                <p>Date</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>Date when the chat will be unmuted, don't provide a value to mute forever</p>\n                <p>Value can be null.</p>\n        </td>\n</tr>\n\n        </tbody>\n</table>\n\n    </section>\n\n        \n\n        <dl class=\"dl-compact\">\n            \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <dt>Returns</dt>\n        <dd><p><code>Promise containing {isMuted: boolean, muteExpiration: number}</code> </p></dd>\n\n\n\n        </dl>\n\n                <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div><h3 id=\"pinChat\"><span class=\"symbol-name\">pinChat</span><span class=\"signature\"><span class=\"signature-params\">()</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing boolean</span></span></h3>            <p>Pins the Chat</p>\n\n        \n        \n        \n\n        <dl class=\"dl-compact\">\n            \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <dt>Returns</dt>\n        <dd><p><code>Promise containing boolean</code> <p>New pin state. Could be false if the max number of pinned chats was reached.</p></p></dd>\n\n\n\n        </dl>\n\n                <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div><h3 id=\"rejectGroupMembershipRequests\"><span class=\"symbol-name\">rejectGroupMembershipRequests</span><span class=\"signature\"><span class=\"signature-params\">(groupId, options)</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing Array of <a href=\"global.html#MembershipRequestActionResult\">MembershipRequestActionResult</a></span></span></h3>            <p>Rejects membership requests if any</p>\n\n        \n            <section>\n        <h4>Parameters</h4>\n            <table class=\"jsdoc-details-table\">\n        <thead>\n            <tr>\n                <th>Name</th>\n                <th>Type</th>\n                <th>Optional</th>\n                <th>Description</th>\n            </tr>\n        </thead>\n        <tbody>\n                <tr>\n        <td>\n            <p>groupId</p>\n        </td>\n        <td>\n                <p>string</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>The group ID to get the membership request for</p>\n        </td>\n</tr>\n\n                <tr>\n        <td>\n            <p>options</p>\n        </td>\n        <td>\n                <p><a href=\"global.html#MembershipRequestActionOptions\">MembershipRequestActionOptions</a></p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>Options for performing a membership request action</p>\n        </td>\n</tr>\n\n        </tbody>\n</table>\n\n    </section>\n\n        \n\n        <dl class=\"dl-compact\">\n            \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <dt>Returns</dt>\n        <dd><p><code>Promise containing Array of <a href=\"global.html#MembershipRequestActionResult\">MembershipRequestActionResult</a></code> <p>Returns an array of requester IDs whose membership requests were rejected and an error for each requester, if any occurred during the operation. If there are no requests, an empty array will be returned</p></p></dd>\n\n\n\n        </dl>\n\n                <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div><h3 id=\"requestPairingCode\"><span class=\"symbol-name\">requestPairingCode</span><span class=\"signature\"><span class=\"signature-params\">(phoneNumber[, showNotification][, intervalMs])</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing string</span></span></h3>            <p>Request authentication via pairing code instead of QR code</p>\n\n        \n            <section>\n        <h4>Parameters</h4>\n            <table class=\"jsdoc-details-table\">\n        <thead>\n            <tr>\n                <th>Name</th>\n                <th>Type</th>\n                <th>Optional</th>\n                <th>Description</th>\n            </tr>\n        </thead>\n        <tbody>\n                <tr>\n        <td>\n            <p>phoneNumber</p>\n        </td>\n        <td>\n                <p>string</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>Phone number in international, symbol-free format (e.g. 12025550108 for US, 551155501234 for Brazil)</p>\n        </td>\n</tr>\n\n                <tr>\n        <td>\n            <p>showNotification</p>\n        </td>\n        <td>\n                <p>boolean</p>\n        </td>\n        <td>\n                <p>Yes</p>\n        </td>\n        <td>\n                <p>Show notification to pair on phone number</p>\n                <p>Defaults to <code>true</code>.</p>\n        </td>\n</tr>\n\n                <tr>\n        <td>\n            <p>intervalMs</p>\n        </td>\n        <td>\n                <p>number</p>\n        </td>\n        <td>\n                <p>Yes</p>\n        </td>\n        <td>\n                <p>The interval in milliseconds on how frequent to generate pairing code (WhatsApp default to 3 minutes)</p>\n                <p>Defaults to <code>180000</code>.</p>\n        </td>\n</tr>\n\n        </tbody>\n</table>\n\n    </section>\n\n        \n\n        <dl class=\"dl-compact\">\n            \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <dt>Returns</dt>\n        <dd><p><code>Promise containing string</code> <ul></p>\n<li>Returns a pairing code in format &quot;ABCDEFGH&quot;</li>\n</ul></dd>\n\n\n\n        </dl>\n\n                <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div><h3 id=\"resetState\"><span class=\"symbol-name\">resetState</span><span class=\"signature\"><span class=\"signature-params\">()</span></span></h3>            <p>Force reset of connection state for the client</p>\n\n        \n        \n        \n\n        <dl class=\"dl-compact\">\n            \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n        </dl>\n\n                <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div><h3 id=\"revokeChannelAdminInvite\"><span class=\"symbol-name\">revokeChannelAdminInvite</span><span class=\"signature\"><span class=\"signature-params\">(channelId, userId)</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing boolean</span></span></h3>            <p>Revokes a channel admin invitation sent to a user by a channel owner</p>\n\n        \n            <section>\n        <h4>Parameters</h4>\n            <table class=\"jsdoc-details-table\">\n        <thead>\n            <tr>\n                <th>Name</th>\n                <th>Type</th>\n                <th>Optional</th>\n                <th>Description</th>\n            </tr>\n        </thead>\n        <tbody>\n                <tr>\n        <td>\n            <p>channelId</p>\n        </td>\n        <td>\n                <p>string</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>The channel ID an invitation belongs to</p>\n        </td>\n</tr>\n\n                <tr>\n        <td>\n            <p>userId</p>\n        </td>\n        <td>\n                <p>string</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>The user ID the invitation was sent to</p>\n        </td>\n</tr>\n\n        </tbody>\n</table>\n\n    </section>\n\n        \n\n        <dl class=\"dl-compact\">\n            \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <dt>Returns</dt>\n        <dd><p><code>Promise containing boolean</code> <p>Returns true if the operation completed successfully, false otherwise</p></p></dd>\n\n\n\n        </dl>\n\n                <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div><h3 id=\"revokeStatusMessage\"><span class=\"symbol-name\">revokeStatusMessage</span><span class=\"signature\"><span class=\"signature-params\">(messageId)</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing void</span></span></h3>            <p>Revoke current own status messages</p>\n\n        \n            <section>\n        <h4>Parameter</h4>\n            <table class=\"jsdoc-details-table\">\n        <thead>\n            <tr>\n                <th>Name</th>\n                <th>Type</th>\n                <th>Optional</th>\n                <th>Description</th>\n            </tr>\n        </thead>\n        <tbody>\n                <tr>\n        <td>\n            <p>messageId</p>\n        </td>\n        <td>\n                <p>string</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n        </td>\n</tr>\n\n        </tbody>\n</table>\n\n    </section>\n\n        \n\n        <dl class=\"dl-compact\">\n            \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <dt>Returns</dt>\n        <dd><p><code>Promise containing void</code> </p></dd>\n\n\n\n        </dl>\n\n                <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div><h3 id=\"saveOrEditAddressbookContact\"><span class=\"symbol-name\">saveOrEditAddressbookContact</span><span class=\"signature\"><span class=\"signature-params\">(phoneNumber, firstName, lastName[, syncToAddressbook])</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing void</span></span></h3>            <p>Save new contact to user's addressbook or edit the existing one</p>\n\n        \n            <section>\n        <h4>Parameters</h4>\n            <table class=\"jsdoc-details-table\">\n        <thead>\n            <tr>\n                <th>Name</th>\n                <th>Type</th>\n                <th>Optional</th>\n                <th>Description</th>\n            </tr>\n        </thead>\n        <tbody>\n                <tr>\n        <td>\n            <p>phoneNumber</p>\n        </td>\n        <td>\n                <p>string</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>The contact's phone number in a format &quot;17182222222&quot;, where &quot;1&quot; is a country code</p>\n        </td>\n</tr>\n\n                <tr>\n        <td>\n            <p>firstName</p>\n        </td>\n        <td>\n                <p>string</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n        </td>\n</tr>\n\n                <tr>\n        <td>\n            <p>lastName</p>\n        </td>\n        <td>\n                <p>string</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n        </td>\n</tr>\n\n                <tr>\n        <td>\n            <p>syncToAddressbook</p>\n        </td>\n        <td>\n                <p>boolean</p>\n        </td>\n        <td>\n                <p>Yes</p>\n        </td>\n        <td>\n                <p>If set to true, the contact will also be saved to the user's address book on their phone. False by default</p>\n                <p>Defaults to <code>false</code>.</p>\n        </td>\n</tr>\n\n        </tbody>\n</table>\n\n    </section>\n\n        \n\n        <dl class=\"dl-compact\">\n            \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <dt>Returns</dt>\n        <dd><p><code>Promise containing void</code> </p></dd>\n\n\n\n        </dl>\n\n                <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div><h3 id=\"searchChannels\"><span class=\"symbol-name\">searchChannels</span><span class=\"signature\"><span class=\"signature-params\">(searchOptions)</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing Array of <a href=\"Channel.html\">Channel</a></span></span></h3>            <p>Searches for channels based on search criteria, there are some notes:</p>\n<ol>\n<li>The method finds only channels you are not subscribed to currently</li>\n<li>If you have never been subscribed to a found channel\nor you have unsubscribed from it with <code>UnsubscribeOptions.deleteLocalModels</code> set to 'true',\nthe lastMessage property of a found channel will be 'null'</li>\n</ol>\n\n        \n            <section>\n        <h4>Parameters</h4>\n            <table class=\"jsdoc-details-table\">\n        <thead>\n            <tr>\n                <th>Name</th>\n                <th>Type</th>\n                <th>Optional</th>\n                <th>Description</th>\n            </tr>\n        </thead>\n        <tbody>\n                <tr>\n        <td>\n            <p>searchOptions</p>\n        </td>\n        <td>\n                <p>Object</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>Search options</p>\n                <p>Values in <code>searchOptions</code> have the following properties:</p>\n                    <table class=\"jsdoc-details-table\">\n        <thead>\n            <tr>\n                <th>Name</th>\n                <th>Type</th>\n                <th>Optional</th>\n                <th>Description</th>\n            </tr>\n        </thead>\n        <tbody>\n                <tr>\n        <td>\n            <p>searchText</p>\n        </td>\n        <td>\n                <p>string</p>\n        </td>\n        <td>\n                <p>Yes</p>\n        </td>\n        <td>\n                <p>Text to search</p>\n                <p>Defaults to <code>''</code>.</p>\n        </td>\n</tr>\n\n                <tr>\n        <td>\n            <p>countryCodes</p>\n        </td>\n        <td>\n                <p>Array of string</p>\n        </td>\n        <td>\n                <p>Yes</p>\n        </td>\n        <td>\n                <p>Array of country codes in 'ISO 3166-1 alpha-2' standart (@see https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) to search for channels created in these countries</p>\n                <p>Defaults to <code>[your local region]</code>.</p>\n        </td>\n</tr>\n\n                <tr>\n        <td>\n            <p>skipSubscribedNewsletters</p>\n        </td>\n        <td>\n                <p>boolean</p>\n        </td>\n        <td>\n                <p>Yes</p>\n        </td>\n        <td>\n                <p>If true, channels that user is subscribed to won't appear in found channels</p>\n                <p>Defaults to <code>false</code>.</p>\n        </td>\n</tr>\n\n                <tr>\n        <td>\n            <p>view</p>\n        </td>\n        <td>\n                <p>number</p>\n        </td>\n        <td>\n                <p>Yes</p>\n        </td>\n        <td>\n                <p>View type, makes sense only when the searchText is empty. Valid values to provide are:\n0 for RECOMMENDED channels\n1 for TRENDING channels\n2 for POPULAR channels\n3 for NEW channels</p>\n                <p>Defaults to <code>0</code>.</p>\n        </td>\n</tr>\n\n                <tr>\n        <td>\n            <p>limit</p>\n        </td>\n        <td>\n                <p>number</p>\n        </td>\n        <td>\n                <p>Yes</p>\n        </td>\n        <td>\n                <p>The limit of found channels to be appear in the returnig result</p>\n                <p>Defaults to <code>50</code>.</p>\n        </td>\n</tr>\n\n        </tbody>\n</table>\n\n        </td>\n</tr>\n\n        </tbody>\n</table>\n\n    </section>\n\n        \n\n        <dl class=\"dl-compact\">\n            \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <dt>Returns</dt>\n        <dd><p><code>Promise containing Array of <a href=\"Channel.html\">Channel</a></code> <p>Returns an array of Channel objects or an empty array if no channels were found</p></p></dd>\n\n\n\n        </dl>\n\n                <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div><h3 id=\"searchMessages\"><span class=\"symbol-name\">searchMessages</span><span class=\"signature\"><span class=\"signature-params\">(query[, options])</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing Array of <a href=\"Message.html\">Message</a></span></span></h3>            <p>Searches for messages</p>\n\n        \n            <section>\n        <h4>Parameters</h4>\n            <table class=\"jsdoc-details-table\">\n        <thead>\n            <tr>\n                <th>Name</th>\n                <th>Type</th>\n                <th>Optional</th>\n                <th>Description</th>\n            </tr>\n        </thead>\n        <tbody>\n                <tr>\n        <td>\n            <p>query</p>\n        </td>\n        <td>\n                <p>string</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n        </td>\n</tr>\n\n                <tr>\n        <td>\n            <p>options</p>\n        </td>\n        <td>\n                <p>Object</p>\n        </td>\n        <td>\n                <p>Yes</p>\n        </td>\n        <td>\n                <p>Values in <code>options</code> have the following properties:</p>\n                    <table class=\"jsdoc-details-table\">\n        <thead>\n            <tr>\n                <th>Name</th>\n                <th>Type</th>\n                <th>Optional</th>\n                <th>Description</th>\n            </tr>\n        </thead>\n        <tbody>\n                <tr>\n        <td>\n            <p>page</p>\n        </td>\n        <td>\n                <p>number</p>\n        </td>\n        <td>\n                <p>Yes</p>\n        </td>\n        <td>\n        </td>\n</tr>\n\n                <tr>\n        <td>\n            <p>limit</p>\n        </td>\n        <td>\n                <p>number</p>\n        </td>\n        <td>\n                <p>Yes</p>\n        </td>\n        <td>\n        </td>\n</tr>\n\n                <tr>\n        <td>\n            <p>chatId</p>\n        </td>\n        <td>\n                <p>string</p>\n        </td>\n        <td>\n                <p>Yes</p>\n        </td>\n        <td>\n        </td>\n</tr>\n\n        </tbody>\n</table>\n\n        </td>\n</tr>\n\n        </tbody>\n</table>\n\n    </section>\n\n        \n\n        <dl class=\"dl-compact\">\n            \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <dt>Returns</dt>\n        <dd><p><code>Promise containing Array of <a href=\"Message.html\">Message</a></code> </p></dd>\n\n\n\n        </dl>\n\n                <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div><h3 id=\"sendChannelAdminInvite\"><span class=\"symbol-name\">sendChannelAdminInvite</span><span class=\"signature\"><span class=\"signature-params\">(chatId, channelId, options)</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing boolean</span></span></h3>            <p>Sends a channel admin invitation to a user, allowing them to become an admin of the channel</p>\n\n        \n            <section>\n        <h4>Parameters</h4>\n            <table class=\"jsdoc-details-table\">\n        <thead>\n            <tr>\n                <th>Name</th>\n                <th>Type</th>\n                <th>Optional</th>\n                <th>Description</th>\n            </tr>\n        </thead>\n        <tbody>\n                <tr>\n        <td>\n            <p>chatId</p>\n        </td>\n        <td>\n                <p>string</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>The ID of a user to send the channel admin invitation to</p>\n        </td>\n</tr>\n\n                <tr>\n        <td>\n            <p>channelId</p>\n        </td>\n        <td>\n                <p>string</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>The ID of a channel for which the invitation is being sent</p>\n        </td>\n</tr>\n\n                <tr>\n        <td>\n            <p>options</p>\n        </td>\n        <td>\n                <p><a href=\"global.html#SendChannelAdminInviteOptions\">SendChannelAdminInviteOptions</a></p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n        </td>\n</tr>\n\n        </tbody>\n</table>\n\n    </section>\n\n        \n\n        <dl class=\"dl-compact\">\n            \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <dt>Returns</dt>\n        <dd><p><code>Promise containing boolean</code> <p>Returns true if an invitation was sent successfully, false otherwise</p></p></dd>\n\n\n\n        </dl>\n\n                <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div><h3 id=\"sendMessage\"><span class=\"symbol-name\">sendMessage</span><span class=\"signature\"><span class=\"signature-params\">(chatId, content[, options])</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing <a href=\"Message.html\">Message</a></span></span></h3>            <p>Send a message to a specific chatId</p>\n\n        \n            <section>\n        <h4>Parameters</h4>\n            <table class=\"jsdoc-details-table\">\n        <thead>\n            <tr>\n                <th>Name</th>\n                <th>Type</th>\n                <th>Optional</th>\n                <th>Description</th>\n            </tr>\n        </thead>\n        <tbody>\n                <tr>\n        <td>\n            <p>chatId</p>\n        </td>\n        <td>\n                <p>string</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n        </td>\n</tr>\n\n                <tr>\n        <td>\n            <p>content</p>\n        </td>\n        <td>\n                <p>(string, <a href=\"MessageMedia.html\">MessageMedia</a>, <a href=\"Location.html\">Location</a>, <a href=\"Poll.html\">Poll</a>, <a href=\"Contact.html\">Contact</a>, Array of <a href=\"Contact.html\">Contact</a>, <a href=\"Buttons.html\">Buttons</a>, or <a href=\"List.html\">List</a>)</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n        </td>\n</tr>\n\n                <tr>\n        <td>\n            <p>options</p>\n        </td>\n        <td>\n                <p><a href=\"global.html#MessageSendOptions\">MessageSendOptions</a></p>\n        </td>\n        <td>\n                <p>Yes</p>\n        </td>\n        <td>\n                <p>Options used when sending the message</p>\n        </td>\n</tr>\n\n        </tbody>\n</table>\n\n    </section>\n\n        \n\n        <dl class=\"dl-compact\">\n            \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <dt>Returns</dt>\n        <dd><p><code>Promise containing <a href=\"Message.html\">Message</a></code> <p>Message that was just sent</p></p></dd>\n\n\n\n        </dl>\n\n                <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div><h3 id=\"sendPresenceAvailable\"><span class=\"symbol-name\">sendPresenceAvailable</span><span class=\"signature\"><span class=\"signature-params\">()</span></span></h3>            <p>Marks the client as online</p>\n\n        \n        \n        \n\n        <dl class=\"dl-compact\">\n            \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n        </dl>\n\n                <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div><h3 id=\"sendPresenceUnavailable\"><span class=\"symbol-name\">sendPresenceUnavailable</span><span class=\"signature\"><span class=\"signature-params\">()</span></span></h3>            <p>Marks the client as unavailable</p>\n\n        \n        \n        \n\n        <dl class=\"dl-compact\">\n            \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n        </dl>\n\n                <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div><h3 id=\"sendResponseToScheduledEvent\"><span class=\"symbol-name\">sendResponseToScheduledEvent</span><span class=\"signature\"><span class=\"signature-params\">(response, eventMessageId)</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing boolean</span></span></h3>            <p>Sends a response to the scheduled event message, indicating whether a user is going to attend the event or not</p>\n\n        \n            <section>\n        <h4>Parameters</h4>\n            <table class=\"jsdoc-details-table\">\n        <thead>\n            <tr>\n                <th>Name</th>\n                <th>Type</th>\n                <th>Optional</th>\n                <th>Description</th>\n            </tr>\n        </thead>\n        <tbody>\n                <tr>\n        <td>\n            <p>response</p>\n        </td>\n        <td>\n                <p>number</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>The response code to the scheduled event message. Valid values are: <code>0</code> for NONE response (removes a previous response) | <code>1</code> for GOING | <code>2</code> for NOT GOING | <code>3</code> for MAYBE going</p>\n        </td>\n</tr>\n\n                <tr>\n        <td>\n            <p>eventMessageId</p>\n        </td>\n        <td>\n                <p>string</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>The scheduled event message ID</p>\n        </td>\n</tr>\n\n        </tbody>\n</table>\n\n    </section>\n\n        \n\n        <dl class=\"dl-compact\">\n            \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <dt>Returns</dt>\n        <dd><p><code>Promise containing boolean</code> </p></dd>\n\n\n\n        </dl>\n\n                <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div><h3 id=\"sendSeen\"><span class=\"symbol-name\">sendSeen</span><span class=\"signature\"><span class=\"signature-params\">(chatId)</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing boolean</span></span></h3>            <p>Mark as seen for the Chat</p>\n\n        \n            <section>\n        <h4>Parameter</h4>\n            <table class=\"jsdoc-details-table\">\n        <thead>\n            <tr>\n                <th>Name</th>\n                <th>Type</th>\n                <th>Optional</th>\n                <th>Description</th>\n            </tr>\n        </thead>\n        <tbody>\n                <tr>\n        <td>\n            <p>chatId</p>\n        </td>\n        <td>\n                <p>string</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n        </td>\n</tr>\n\n        </tbody>\n</table>\n\n    </section>\n\n        \n\n        <dl class=\"dl-compact\">\n            \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <dt>Returns</dt>\n        <dd><p><code>Promise containing boolean</code> <p>result</p></p></dd>\n\n\n\n        </dl>\n\n                <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div><h3 id=\"setAutoDownloadAudio\"><span class=\"symbol-name\">setAutoDownloadAudio</span><span class=\"signature\"><span class=\"signature-params\">(flag)</span></span></h3>            <p>Setting  autoload download audio</p>\n\n        \n            <section>\n        <h4>Parameter</h4>\n            <table class=\"jsdoc-details-table\">\n        <thead>\n            <tr>\n                <th>Name</th>\n                <th>Type</th>\n                <th>Optional</th>\n                <th>Description</th>\n            </tr>\n        </thead>\n        <tbody>\n                <tr>\n        <td>\n            <p>flag</p>\n        </td>\n        <td>\n                <p>boolean</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>true/false</p>\n        </td>\n</tr>\n\n        </tbody>\n</table>\n\n    </section>\n\n        \n\n        <dl class=\"dl-compact\">\n            \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n        </dl>\n\n                <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div><h3 id=\"setAutoDownloadDocuments\"><span class=\"symbol-name\">setAutoDownloadDocuments</span><span class=\"signature\"><span class=\"signature-params\">(flag)</span></span></h3>            <p>Setting  autoload download documents</p>\n\n        \n            <section>\n        <h4>Parameter</h4>\n            <table class=\"jsdoc-details-table\">\n        <thead>\n            <tr>\n                <th>Name</th>\n                <th>Type</th>\n                <th>Optional</th>\n                <th>Description</th>\n            </tr>\n        </thead>\n        <tbody>\n                <tr>\n        <td>\n            <p>flag</p>\n        </td>\n        <td>\n                <p>boolean</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>true/false</p>\n        </td>\n</tr>\n\n        </tbody>\n</table>\n\n    </section>\n\n        \n\n        <dl class=\"dl-compact\">\n            \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n        </dl>\n\n                <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div><h3 id=\"setAutoDownloadPhotos\"><span class=\"symbol-name\">setAutoDownloadPhotos</span><span class=\"signature\"><span class=\"signature-params\">(flag)</span></span></h3>            <p>Setting  autoload download photos</p>\n\n        \n            <section>\n        <h4>Parameter</h4>\n            <table class=\"jsdoc-details-table\">\n        <thead>\n            <tr>\n                <th>Name</th>\n                <th>Type</th>\n                <th>Optional</th>\n                <th>Description</th>\n            </tr>\n        </thead>\n        <tbody>\n                <tr>\n        <td>\n            <p>flag</p>\n        </td>\n        <td>\n                <p>boolean</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>true/false</p>\n        </td>\n</tr>\n\n        </tbody>\n</table>\n\n    </section>\n\n        \n\n        <dl class=\"dl-compact\">\n            \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n        </dl>\n\n                <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div><h3 id=\"setAutoDownloadVideos\"><span class=\"symbol-name\">setAutoDownloadVideos</span><span class=\"signature\"><span class=\"signature-params\">(flag)</span></span></h3>            <p>Setting  autoload download videos</p>\n\n        \n            <section>\n        <h4>Parameter</h4>\n            <table class=\"jsdoc-details-table\">\n        <thead>\n            <tr>\n                <th>Name</th>\n                <th>Type</th>\n                <th>Optional</th>\n                <th>Description</th>\n            </tr>\n        </thead>\n        <tbody>\n                <tr>\n        <td>\n            <p>flag</p>\n        </td>\n        <td>\n                <p>boolean</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>true/false</p>\n        </td>\n</tr>\n\n        </tbody>\n</table>\n\n    </section>\n\n        \n\n        <dl class=\"dl-compact\">\n            \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n        </dl>\n\n                <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div><h3 id=\"setBackgroundSync\"><span class=\"symbol-name\">setBackgroundSync</span><span class=\"signature\"><span class=\"signature-params\">(flag)</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing boolean</span></span></h3>            <p>Setting background synchronization.\nNOTE: this action will take effect after you restart the client.</p>\n\n        \n            <section>\n        <h4>Parameter</h4>\n            <table class=\"jsdoc-details-table\">\n        <thead>\n            <tr>\n                <th>Name</th>\n                <th>Type</th>\n                <th>Optional</th>\n                <th>Description</th>\n            </tr>\n        </thead>\n        <tbody>\n                <tr>\n        <td>\n            <p>flag</p>\n        </td>\n        <td>\n                <p>boolean</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>true/false</p>\n        </td>\n</tr>\n\n        </tbody>\n</table>\n\n    </section>\n\n        \n\n        <dl class=\"dl-compact\">\n            \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <dt>Returns</dt>\n        <dd><p><code>Promise containing boolean</code> </p></dd>\n\n\n\n        </dl>\n\n                <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div><h3 id=\"setDisplayName\"><span class=\"symbol-name\">setDisplayName</span><span class=\"signature\"><span class=\"signature-params\">(displayName)</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing Boolean</span></span></h3>            <p>Sets the current user's display name.\nThis is the name shown to WhatsApp users that have not added you as a contact beside your number in groups and in your profile.</p>\n\n        \n            <section>\n        <h4>Parameter</h4>\n            <table class=\"jsdoc-details-table\">\n        <thead>\n            <tr>\n                <th>Name</th>\n                <th>Type</th>\n                <th>Optional</th>\n                <th>Description</th>\n            </tr>\n        </thead>\n        <tbody>\n                <tr>\n        <td>\n            <p>displayName</p>\n        </td>\n        <td>\n                <p>string</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>New display name</p>\n        </td>\n</tr>\n\n        </tbody>\n</table>\n\n    </section>\n\n        \n\n        <dl class=\"dl-compact\">\n            \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <dt>Returns</dt>\n        <dd><p><code>Promise containing Boolean</code> </p></dd>\n\n\n\n        </dl>\n\n                <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div><h3 id=\"setProfilePicture\"><span class=\"symbol-name\">setProfilePicture</span><span class=\"signature\"><span class=\"signature-params\">(media)</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing boolean</span></span></h3>            <p>Sets the current user's profile picture.</p>\n\n        \n            <section>\n        <h4>Parameter</h4>\n            <table class=\"jsdoc-details-table\">\n        <thead>\n            <tr>\n                <th>Name</th>\n                <th>Type</th>\n                <th>Optional</th>\n                <th>Description</th>\n            </tr>\n        </thead>\n        <tbody>\n                <tr>\n        <td>\n            <p>media</p>\n        </td>\n        <td>\n                <p><a href=\"MessageMedia.html\">MessageMedia</a></p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n        </td>\n</tr>\n\n        </tbody>\n</table>\n\n    </section>\n\n        \n\n        <dl class=\"dl-compact\">\n            \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <dt>Returns</dt>\n        <dd><p><code>Promise containing boolean</code> <p>Returns true if the picture was properly updated.</p></p></dd>\n\n\n\n        </dl>\n\n                <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div><h3 id=\"setStatus\"><span class=\"symbol-name\">setStatus</span><span class=\"signature\"><span class=\"signature-params\">(status)</span></span></h3>            <p>Sets the current user's status message</p>\n\n        \n            <section>\n        <h4>Parameter</h4>\n            <table class=\"jsdoc-details-table\">\n        <thead>\n            <tr>\n                <th>Name</th>\n                <th>Type</th>\n                <th>Optional</th>\n                <th>Description</th>\n            </tr>\n        </thead>\n        <tbody>\n                <tr>\n        <td>\n            <p>status</p>\n        </td>\n        <td>\n                <p>string</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>New status message</p>\n        </td>\n</tr>\n\n        </tbody>\n</table>\n\n    </section>\n\n        \n\n        <dl class=\"dl-compact\">\n            \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n        </dl>\n\n                <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div><h3 id=\"subscribeToChannel\"><span class=\"symbol-name\">subscribeToChannel</span><span class=\"signature\"><span class=\"signature-params\">(channelId)</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing boolean</span></span></h3>            <p>Subscribe to channel</p>\n\n        \n            <section>\n        <h4>Parameter</h4>\n            <table class=\"jsdoc-details-table\">\n        <thead>\n            <tr>\n                <th>Name</th>\n                <th>Type</th>\n                <th>Optional</th>\n                <th>Description</th>\n            </tr>\n        </thead>\n        <tbody>\n                <tr>\n        <td>\n            <p>channelId</p>\n        </td>\n        <td>\n                <p>string</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>The channel ID</p>\n        </td>\n</tr>\n\n        </tbody>\n</table>\n\n    </section>\n\n        \n\n        <dl class=\"dl-compact\">\n            \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <dt>Returns</dt>\n        <dd><p><code>Promise containing boolean</code> <p>Returns true if the operation completed successfully, false otherwise</p></p></dd>\n\n\n\n        </dl>\n\n                <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div><h3 id=\"syncHistory\"><span class=\"symbol-name\">syncHistory</span><span class=\"signature\"><span class=\"signature-params\">(chatId)</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing boolean</span></span></h3>            <p>Sync chat history conversation</p>\n\n        \n            <section>\n        <h4>Parameter</h4>\n            <table class=\"jsdoc-details-table\">\n        <thead>\n            <tr>\n                <th>Name</th>\n                <th>Type</th>\n                <th>Optional</th>\n                <th>Description</th>\n            </tr>\n        </thead>\n        <tbody>\n                <tr>\n        <td>\n            <p>chatId</p>\n        </td>\n        <td>\n                <p>string</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n        </td>\n</tr>\n\n        </tbody>\n</table>\n\n    </section>\n\n        \n\n        <dl class=\"dl-compact\">\n            \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <dt>Returns</dt>\n        <dd><p><code>Promise containing boolean</code> <p>True if operation completed successfully, false otherwise.</p></p></dd>\n\n\n\n        </dl>\n\n                <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div><h3 id=\"transferChannelOwnership\"><span class=\"symbol-name\">transferChannelOwnership</span><span class=\"signature\"><span class=\"signature-params\">(channelId, newOwnerId, options)</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing boolean</span></span></h3>            <p>Transfers a channel ownership to another user.\nNote: the user you are transferring the channel ownership to must be a channel admin.</p>\n\n        \n            <section>\n        <h4>Parameters</h4>\n            <table class=\"jsdoc-details-table\">\n        <thead>\n            <tr>\n                <th>Name</th>\n                <th>Type</th>\n                <th>Optional</th>\n                <th>Description</th>\n            </tr>\n        </thead>\n        <tbody>\n                <tr>\n        <td>\n            <p>channelId</p>\n        </td>\n        <td>\n                <p>string</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n        </td>\n</tr>\n\n                <tr>\n        <td>\n            <p>newOwnerId</p>\n        </td>\n        <td>\n                <p>string</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n        </td>\n</tr>\n\n                <tr>\n        <td>\n            <p>options</p>\n        </td>\n        <td>\n                <p><a href=\"global.html#TransferChannelOwnershipOptions\">TransferChannelOwnershipOptions</a></p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n        </td>\n</tr>\n\n        </tbody>\n</table>\n\n    </section>\n\n        \n\n        <dl class=\"dl-compact\">\n            \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <dt>Returns</dt>\n        <dd><p><code>Promise containing boolean</code> <p>Returns true if the operation completed successfully, false otherwise</p></p></dd>\n\n\n\n        </dl>\n\n                <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div><h3 id=\"unarchiveChat\"><span class=\"symbol-name\">unarchiveChat</span><span class=\"signature\"><span class=\"signature-params\">()</span>&nbsp;&rarr; <span class=\"signature-returns\"> boolean</span></span></h3>            <p>Changes and returns the archive state of the Chat</p>\n\n        \n        \n        \n\n        <dl class=\"dl-compact\">\n            \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <dt>Returns</dt>\n        <dd><p><code>boolean</code> </p></dd>\n\n\n\n        </dl>\n\n                <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div><h3 id=\"unmuteChat\"><span class=\"symbol-name\">unmuteChat</span><span class=\"signature\"><span class=\"signature-params\">(chatId)</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing {isMuted: boolean, muteExpiration: number}</span></span></h3>            <p>Unmutes the Chat</p>\n\n        \n            <section>\n        <h4>Parameter</h4>\n            <table class=\"jsdoc-details-table\">\n        <thead>\n            <tr>\n                <th>Name</th>\n                <th>Type</th>\n                <th>Optional</th>\n                <th>Description</th>\n            </tr>\n        </thead>\n        <tbody>\n                <tr>\n        <td>\n            <p>chatId</p>\n        </td>\n        <td>\n                <p>string</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>ID of the chat that will be unmuted</p>\n        </td>\n</tr>\n\n        </tbody>\n</table>\n\n    </section>\n\n        \n\n        <dl class=\"dl-compact\">\n            \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <dt>Returns</dt>\n        <dd><p><code>Promise containing {isMuted: boolean, muteExpiration: number}</code> </p></dd>\n\n\n\n        </dl>\n\n                <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div><h3 id=\"unpinChat\"><span class=\"symbol-name\">unpinChat</span><span class=\"signature\"><span class=\"signature-params\">()</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing boolean</span></span></h3>            <p>Unpins the Chat</p>\n\n        \n        \n        \n\n        <dl class=\"dl-compact\">\n            \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <dt>Returns</dt>\n        <dd><p><code>Promise containing boolean</code> <p>New pin state</p></p></dd>\n\n\n\n        </dl>\n\n                <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div><h3 id=\"unsubscribeFromChannel\"><span class=\"symbol-name\">unsubscribeFromChannel</span><span class=\"signature\"><span class=\"signature-params\">(channelId, options)</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing boolean</span></span></h3>            <p>Unsubscribe from channel</p>\n\n        \n            <section>\n        <h4>Parameters</h4>\n            <table class=\"jsdoc-details-table\">\n        <thead>\n            <tr>\n                <th>Name</th>\n                <th>Type</th>\n                <th>Optional</th>\n                <th>Description</th>\n            </tr>\n        </thead>\n        <tbody>\n                <tr>\n        <td>\n            <p>channelId</p>\n        </td>\n        <td>\n                <p>string</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>The channel ID</p>\n        </td>\n</tr>\n\n                <tr>\n        <td>\n            <p>options</p>\n        </td>\n        <td>\n                <p><a href=\"global.html#UnsubscribeOptions\">UnsubscribeOptions</a></p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n        </td>\n</tr>\n\n        </tbody>\n</table>\n\n    </section>\n\n        \n\n        <dl class=\"dl-compact\">\n            \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <dt>Returns</dt>\n        <dd><p><code>Promise containing boolean</code> <p>Returns true if the operation completed successfully, false otherwise</p></p></dd>\n\n\n\n        </dl>\n\n    </section>\n\n\n            \n\n                <h2>Events</h2>\n    <section>\n                <h3 id=\"event:auth_failure\"><span class=\"symbol-name\">auth_failure</span></h3>            <p>Emitted when there has been an error while trying to restore an existing session</p>\n\n        \n            <section>\n        <h4>Parameter</h4>\n            <table class=\"jsdoc-details-table\">\n        <thead>\n            <tr>\n                <th>Name</th>\n                <th>Type</th>\n                <th>Optional</th>\n                <th>Description</th>\n            </tr>\n        </thead>\n        <tbody>\n                <tr>\n        <td>\n            <p>message</p>\n        </td>\n        <td>\n                <p>string</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n        </td>\n</tr>\n\n        </tbody>\n</table>\n\n    </section>\n\n        \n\n        <dl class=\"dl-compact\">\n            \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n        </dl>\n\n                <h3 id=\"event:authenticated\"><span class=\"symbol-name\">authenticated</span></h3>            <p>Emitted when authentication is successful</p>\n\n        \n        \n        \n\n        <dl class=\"dl-compact\">\n            \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n        </dl>\n\n                <h3 id=\"event:change_battery\"><span class=\"symbol-name\">change_battery</span></h3>            <p>Emitted when the battery percentage for the attached device changes. Will not be sent if using multi-device.</p>\n\n        \n            <section>\n        <h4>Parameters</h4>\n            <table class=\"jsdoc-details-table\">\n        <thead>\n            <tr>\n                <th>Name</th>\n                <th>Type</th>\n                <th>Optional</th>\n                <th>Description</th>\n            </tr>\n        </thead>\n        <tbody>\n                <tr>\n        <td>\n            <p>batteryInfo</p>\n        </td>\n        <td>\n                <p>object</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>Values in <code>batteryInfo</code> have the following properties:</p>\n                    <table class=\"jsdoc-details-table\">\n        <thead>\n            <tr>\n                <th>Name</th>\n                <th>Type</th>\n                <th>Optional</th>\n                <th>Description</th>\n            </tr>\n        </thead>\n        <tbody>\n                <tr>\n        <td>\n            <p>battery</p>\n        </td>\n        <td>\n                <p>number</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>The current battery percentage</p>\n        </td>\n</tr>\n\n                <tr>\n        <td>\n            <p>plugged</p>\n        </td>\n        <td>\n                <p>boolean</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>Indicates if the phone is plugged in (true) or not (false)</p>\n        </td>\n</tr>\n\n        </tbody>\n</table>\n\n        </td>\n</tr>\n\n        </tbody>\n</table>\n\n    </section>\n\n        \n\n        <dl class=\"dl-compact\">\n            \n\n\n\n\n\n\n    <dt>Deprecated</dt>\n    <dd></dd>\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n        </dl>\n\n                <h3 id=\"event:change_state\"><span class=\"symbol-name\">change_state</span></h3>            <p>Emitted when the connection state changes</p>\n\n        \n            <section>\n        <h4>Parameter</h4>\n            <table class=\"jsdoc-details-table\">\n        <thead>\n            <tr>\n                <th>Name</th>\n                <th>Type</th>\n                <th>Optional</th>\n                <th>Description</th>\n            </tr>\n        </thead>\n        <tbody>\n                <tr>\n        <td>\n            <p>state</p>\n        </td>\n        <td>\n                <p><a href=\"global.html#WAState\">WAState</a></p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>the new connection state</p>\n        </td>\n</tr>\n\n        </tbody>\n</table>\n\n    </section>\n\n        \n\n        <dl class=\"dl-compact\">\n            \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n        </dl>\n\n                <h3 id=\"event:chat_archived\"><span class=\"symbol-name\">chat_archived</span></h3>            <p>Emitted when a chat is archived/unarchived</p>\n\n        \n            <section>\n        <h4>Parameters</h4>\n            <table class=\"jsdoc-details-table\">\n        <thead>\n            <tr>\n                <th>Name</th>\n                <th>Type</th>\n                <th>Optional</th>\n                <th>Description</th>\n            </tr>\n        </thead>\n        <tbody>\n                <tr>\n        <td>\n            <p>chat</p>\n        </td>\n        <td>\n                <p><a href=\"Chat.html\">Chat</a></p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n        </td>\n</tr>\n\n                <tr>\n        <td>\n            <p>currState</p>\n        </td>\n        <td>\n                <p>boolean</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n        </td>\n</tr>\n\n                <tr>\n        <td>\n            <p>prevState</p>\n        </td>\n        <td>\n                <p>boolean</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n        </td>\n</tr>\n\n        </tbody>\n</table>\n\n    </section>\n\n        \n\n        <dl class=\"dl-compact\">\n            \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n        </dl>\n\n                <h3 id=\"event:chat_removed\"><span class=\"symbol-name\">chat_removed</span></h3>            <p>Emitted when a chat is removed</p>\n\n        \n            <section>\n        <h4>Parameter</h4>\n            <table class=\"jsdoc-details-table\">\n        <thead>\n            <tr>\n                <th>Name</th>\n                <th>Type</th>\n                <th>Optional</th>\n                <th>Description</th>\n            </tr>\n        </thead>\n        <tbody>\n                <tr>\n        <td>\n            <p>chat</p>\n        </td>\n        <td>\n                <p><a href=\"Chat.html\">Chat</a></p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n        </td>\n</tr>\n\n        </tbody>\n</table>\n\n    </section>\n\n        \n\n        <dl class=\"dl-compact\">\n            \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n        </dl>\n\n                <h3 id=\"event:code\"><span class=\"symbol-name\">code</span></h3>            <p>Emitted when a pairing code is received</p>\n\n        \n            <section>\n        <h4>Parameter</h4>\n            <table class=\"jsdoc-details-table\">\n        <thead>\n            <tr>\n                <th>Name</th>\n                <th>Type</th>\n                <th>Optional</th>\n                <th>Description</th>\n            </tr>\n        </thead>\n        <tbody>\n                <tr>\n        <td>\n            <p>code</p>\n        </td>\n        <td>\n                <p>string</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>Code</p>\n        </td>\n</tr>\n\n        </tbody>\n</table>\n\n    </section>\n\n        \n\n        <dl class=\"dl-compact\">\n            \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <dt>Returns</dt>\n        <dd><p><code>string</code> <p>Code that was just received</p></p></dd>\n\n\n\n        </dl>\n\n                <h3 id=\"event:contact_changed\"><span class=\"symbol-name\">contact_changed</span></h3>            <p>Emitted when a contact or a group participant changes their phone number.</p>\n\n        \n            <section>\n        <h4>Parameters</h4>\n            <table class=\"jsdoc-details-table\">\n        <thead>\n            <tr>\n                <th>Name</th>\n                <th>Type</th>\n                <th>Optional</th>\n                <th>Description</th>\n            </tr>\n        </thead>\n        <tbody>\n                <tr>\n        <td>\n            <p>message</p>\n        </td>\n        <td>\n                <p><a href=\"Message.html\">Message</a></p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>Message with more information about the event.</p>\n        </td>\n</tr>\n\n                <tr>\n        <td>\n            <p>oldId</p>\n        </td>\n        <td>\n                <p>String</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>The user's id (an old one) who changed their phone number\nand who triggered the notification.</p>\n        </td>\n</tr>\n\n                <tr>\n        <td>\n            <p>newId</p>\n        </td>\n        <td>\n                <p>String</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>The user's new id after the change.</p>\n        </td>\n</tr>\n\n                <tr>\n        <td>\n            <p>isContact</p>\n        </td>\n        <td>\n                <p>Boolean</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>Indicates if a contact or a group participant changed their phone number.</p>\n        </td>\n</tr>\n\n        </tbody>\n</table>\n\n    </section>\n\n        \n\n        <dl class=\"dl-compact\">\n            \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n        </dl>\n\n                <h3 id=\"event:disconnected\"><span class=\"symbol-name\">disconnected</span></h3>            <p>Emitted when the client has been disconnected</p>\n\n        \n            <section>\n        <h4>Parameter</h4>\n            <table class=\"jsdoc-details-table\">\n        <thead>\n            <tr>\n                <th>Name</th>\n                <th>Type</th>\n                <th>Optional</th>\n                <th>Description</th>\n            </tr>\n        </thead>\n        <tbody>\n                <tr>\n        <td>\n            <p>reason</p>\n        </td>\n        <td>\n                <p>(<a href=\"global.html#WAState\">WAState</a> or \"LOGOUT\")</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>reason that caused the disconnect</p>\n        </td>\n</tr>\n\n        </tbody>\n</table>\n\n    </section>\n\n        \n\n        <dl class=\"dl-compact\">\n            \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n        </dl>\n\n                <h3 id=\"event:group_admin_changed\"><span class=\"symbol-name\">group_admin_changed</span></h3>            <p>Emitted when a current user is promoted to an admin or demoted to a regular user.</p>\n\n        \n            <section>\n        <h4>Parameter</h4>\n            <table class=\"jsdoc-details-table\">\n        <thead>\n            <tr>\n                <th>Name</th>\n                <th>Type</th>\n                <th>Optional</th>\n                <th>Description</th>\n            </tr>\n        </thead>\n        <tbody>\n                <tr>\n        <td>\n            <p>notification</p>\n        </td>\n        <td>\n                <p><a href=\"GroupNotification.html\">GroupNotification</a></p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>GroupNotification with more information about the action</p>\n        </td>\n</tr>\n\n        </tbody>\n</table>\n\n    </section>\n\n        \n\n        <dl class=\"dl-compact\">\n            \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n        </dl>\n\n                <h3 id=\"event:group_join\"><span class=\"symbol-name\">group_join</span></h3>            <p>Emitted when a user joins the chat via invite link or is added by an admin.</p>\n\n        \n            <section>\n        <h4>Parameter</h4>\n            <table class=\"jsdoc-details-table\">\n        <thead>\n            <tr>\n                <th>Name</th>\n                <th>Type</th>\n                <th>Optional</th>\n                <th>Description</th>\n            </tr>\n        </thead>\n        <tbody>\n                <tr>\n        <td>\n            <p>notification</p>\n        </td>\n        <td>\n                <p><a href=\"GroupNotification.html\">GroupNotification</a></p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>GroupNotification with more information about the action</p>\n        </td>\n</tr>\n\n        </tbody>\n</table>\n\n    </section>\n\n        \n\n        <dl class=\"dl-compact\">\n            \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n        </dl>\n\n                <h3 id=\"event:group_leave\"><span class=\"symbol-name\">group_leave</span></h3>            <p>Emitted when a user leaves the chat or is removed by an admin.</p>\n\n        \n            <section>\n        <h4>Parameter</h4>\n            <table class=\"jsdoc-details-table\">\n        <thead>\n            <tr>\n                <th>Name</th>\n                <th>Type</th>\n                <th>Optional</th>\n                <th>Description</th>\n            </tr>\n        </thead>\n        <tbody>\n                <tr>\n        <td>\n            <p>notification</p>\n        </td>\n        <td>\n                <p><a href=\"GroupNotification.html\">GroupNotification</a></p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>GroupNotification with more information about the action</p>\n        </td>\n</tr>\n\n        </tbody>\n</table>\n\n    </section>\n\n        \n\n        <dl class=\"dl-compact\">\n            \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n        </dl>\n\n                <h3 id=\"event:group_membership_request\"><span class=\"symbol-name\">group_membership_request</span></h3>            <p>Emitted when some user requested to join the group\nthat has the membership approval mode turned on</p>\n\n        \n            <section>\n        <h4>Parameters</h4>\n            <table class=\"jsdoc-details-table\">\n        <thead>\n            <tr>\n                <th>Name</th>\n                <th>Type</th>\n                <th>Optional</th>\n                <th>Description</th>\n            </tr>\n        </thead>\n        <tbody>\n                <tr>\n        <td>\n            <p>notification</p>\n        </td>\n        <td>\n                <p><a href=\"GroupNotification.html\">GroupNotification</a></p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>GroupNotification with more information about the action</p>\n                <p>Values in <code>notification</code> have the following properties:</p>\n                    <table class=\"jsdoc-details-table\">\n        <thead>\n            <tr>\n                <th>Name</th>\n                <th>Type</th>\n                <th>Optional</th>\n                <th>Description</th>\n            </tr>\n        </thead>\n        <tbody>\n                <tr>\n        <td>\n            <p>chatId</p>\n        </td>\n        <td>\n                <p>string</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>The group ID the request was made for</p>\n        </td>\n</tr>\n\n                <tr>\n        <td>\n            <p>author</p>\n        </td>\n        <td>\n                <p>string</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>The user ID that made a request</p>\n        </td>\n</tr>\n\n                <tr>\n        <td>\n            <p>timestamp</p>\n        </td>\n        <td>\n                <p>number</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>The timestamp the request was made at</p>\n        </td>\n</tr>\n\n        </tbody>\n</table>\n\n        </td>\n</tr>\n\n        </tbody>\n</table>\n\n    </section>\n\n        \n\n        <dl class=\"dl-compact\">\n            \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n        </dl>\n\n                <h3 id=\"event:group_update\"><span class=\"symbol-name\">group_update</span></h3>            <p>Emitted when group settings are updated, such as subject, description or picture.</p>\n\n        \n            <section>\n        <h4>Parameter</h4>\n            <table class=\"jsdoc-details-table\">\n        <thead>\n            <tr>\n                <th>Name</th>\n                <th>Type</th>\n                <th>Optional</th>\n                <th>Description</th>\n            </tr>\n        </thead>\n        <tbody>\n                <tr>\n        <td>\n            <p>notification</p>\n        </td>\n        <td>\n                <p><a href=\"GroupNotification.html\">GroupNotification</a></p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>GroupNotification with more information about the action</p>\n        </td>\n</tr>\n\n        </tbody>\n</table>\n\n    </section>\n\n        \n\n        <dl class=\"dl-compact\">\n            \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n        </dl>\n\n                <h3 id=\"event:incoming_call\"><span class=\"symbol-name\">incoming_call</span></h3>            <p>Emitted when a call is received</p>\n\n        \n            <section>\n        <h4>Parameters</h4>\n            <table class=\"jsdoc-details-table\">\n        <thead>\n            <tr>\n                <th>Name</th>\n                <th>Type</th>\n                <th>Optional</th>\n                <th>Description</th>\n            </tr>\n        </thead>\n        <tbody>\n                <tr>\n        <td>\n            <p>call</p>\n        </td>\n        <td>\n                <p>object</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>Values in <code>call</code> have the following properties:</p>\n                    <table class=\"jsdoc-details-table\">\n        <thead>\n            <tr>\n                <th>Name</th>\n                <th>Type</th>\n                <th>Optional</th>\n                <th>Description</th>\n            </tr>\n        </thead>\n        <tbody>\n                <tr>\n        <td>\n            <p>id</p>\n        </td>\n        <td>\n                <p>number</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>Call id</p>\n        </td>\n</tr>\n\n                <tr>\n        <td>\n            <p>peerJid</p>\n        </td>\n        <td>\n                <p>string</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>Who called</p>\n        </td>\n</tr>\n\n                <tr>\n        <td>\n            <p>isVideo</p>\n        </td>\n        <td>\n                <p>boolean</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>if is video</p>\n        </td>\n</tr>\n\n                <tr>\n        <td>\n            <p>isGroup</p>\n        </td>\n        <td>\n                <p>boolean</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>if is group</p>\n        </td>\n</tr>\n\n                <tr>\n        <td>\n            <p>canHandleLocally</p>\n        </td>\n        <td>\n                <p>boolean</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>if we can handle in waweb</p>\n        </td>\n</tr>\n\n                <tr>\n        <td>\n            <p>outgoing</p>\n        </td>\n        <td>\n                <p>boolean</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>if is outgoing</p>\n        </td>\n</tr>\n\n                <tr>\n        <td>\n            <p>webClientShouldHandle</p>\n        </td>\n        <td>\n                <p>boolean</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>If Waweb should handle</p>\n        </td>\n</tr>\n\n                <tr>\n        <td>\n            <p>participants</p>\n        </td>\n        <td>\n                <p>object</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>Participants</p>\n        </td>\n</tr>\n\n        </tbody>\n</table>\n\n        </td>\n</tr>\n\n        </tbody>\n</table>\n\n    </section>\n\n        \n\n        <dl class=\"dl-compact\">\n            \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n        </dl>\n\n                <h3 id=\"event:media_uploaded\"><span class=\"symbol-name\">media_uploaded</span></h3>            <p>Emitted when media has been uploaded for a message sent by the client.</p>\n\n        \n            <section>\n        <h4>Parameter</h4>\n            <table class=\"jsdoc-details-table\">\n        <thead>\n            <tr>\n                <th>Name</th>\n                <th>Type</th>\n                <th>Optional</th>\n                <th>Description</th>\n            </tr>\n        </thead>\n        <tbody>\n                <tr>\n        <td>\n            <p>message</p>\n        </td>\n        <td>\n                <p><a href=\"Message.html\">Message</a></p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>The message with media that was uploaded</p>\n        </td>\n</tr>\n\n        </tbody>\n</table>\n\n    </section>\n\n        \n\n        <dl class=\"dl-compact\">\n            \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n        </dl>\n\n                <h3 id=\"event:message\"><span class=\"symbol-name\">message</span></h3>            <p>Emitted when a new message is received.</p>\n\n        \n            <section>\n        <h4>Parameter</h4>\n            <table class=\"jsdoc-details-table\">\n        <thead>\n            <tr>\n                <th>Name</th>\n                <th>Type</th>\n                <th>Optional</th>\n                <th>Description</th>\n            </tr>\n        </thead>\n        <tbody>\n                <tr>\n        <td>\n            <p>message</p>\n        </td>\n        <td>\n                <p><a href=\"Message.html\">Message</a></p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>The message that was received</p>\n        </td>\n</tr>\n\n        </tbody>\n</table>\n\n    </section>\n\n        \n\n        <dl class=\"dl-compact\">\n            \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n        </dl>\n\n                <h3 id=\"event:message_ack\"><span class=\"symbol-name\">message_ack</span></h3>            <p>Emitted when an ack event occurrs on message type.</p>\n\n        \n            <section>\n        <h4>Parameters</h4>\n            <table class=\"jsdoc-details-table\">\n        <thead>\n            <tr>\n                <th>Name</th>\n                <th>Type</th>\n                <th>Optional</th>\n                <th>Description</th>\n            </tr>\n        </thead>\n        <tbody>\n                <tr>\n        <td>\n            <p>message</p>\n        </td>\n        <td>\n                <p><a href=\"Message.html\">Message</a></p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>The message that was affected</p>\n        </td>\n</tr>\n\n                <tr>\n        <td>\n            <p>ack</p>\n        </td>\n        <td>\n                <p><a href=\"global.html#MessageAck\">MessageAck</a></p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>The new ACK value</p>\n        </td>\n</tr>\n\n        </tbody>\n</table>\n\n    </section>\n\n        \n\n        <dl class=\"dl-compact\">\n            \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n        </dl>\n\n                <h3 id=\"event:message_ciphertext\"><span class=\"symbol-name\">message_ciphertext</span></h3>            <p>Emitted when messages are edited</p>\n\n        \n            <section>\n        <h4>Parameter</h4>\n            <table class=\"jsdoc-details-table\">\n        <thead>\n            <tr>\n                <th>Name</th>\n                <th>Type</th>\n                <th>Optional</th>\n                <th>Description</th>\n            </tr>\n        </thead>\n        <tbody>\n                <tr>\n        <td>\n            <p>message</p>\n        </td>\n        <td>\n                <p><a href=\"Message.html\">Message</a></p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n        </td>\n</tr>\n\n        </tbody>\n</table>\n\n    </section>\n\n        \n\n        <dl class=\"dl-compact\">\n            \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n        </dl>\n\n                <h3 id=\"event:message_create\"><span class=\"symbol-name\">message_create</span></h3>            <p>Emitted when a new message is created, which may include the current user's own messages.</p>\n\n        \n            <section>\n        <h4>Parameter</h4>\n            <table class=\"jsdoc-details-table\">\n        <thead>\n            <tr>\n                <th>Name</th>\n                <th>Type</th>\n                <th>Optional</th>\n                <th>Description</th>\n            </tr>\n        </thead>\n        <tbody>\n                <tr>\n        <td>\n            <p>message</p>\n        </td>\n        <td>\n                <p><a href=\"Message.html\">Message</a></p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>The message that was created</p>\n        </td>\n</tr>\n\n        </tbody>\n</table>\n\n    </section>\n\n        \n\n        <dl class=\"dl-compact\">\n            \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n        </dl>\n\n                <h3 id=\"event:message_edit\"><span class=\"symbol-name\">message_edit</span></h3>            <p>Emitted when messages are edited</p>\n\n        \n            <section>\n        <h4>Parameters</h4>\n            <table class=\"jsdoc-details-table\">\n        <thead>\n            <tr>\n                <th>Name</th>\n                <th>Type</th>\n                <th>Optional</th>\n                <th>Description</th>\n            </tr>\n        </thead>\n        <tbody>\n                <tr>\n        <td>\n            <p>message</p>\n        </td>\n        <td>\n                <p><a href=\"Message.html\">Message</a></p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n        </td>\n</tr>\n\n                <tr>\n        <td>\n            <p>newBody</p>\n        </td>\n        <td>\n                <p>string</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n        </td>\n</tr>\n\n                <tr>\n        <td>\n            <p>prevBody</p>\n        </td>\n        <td>\n                <p>string</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n        </td>\n</tr>\n\n        </tbody>\n</table>\n\n    </section>\n\n        \n\n        <dl class=\"dl-compact\">\n            \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n        </dl>\n\n                <h3 id=\"event:message_reaction\"><span class=\"symbol-name\">message_reaction</span></h3>            <p>Emitted when a reaction is sent, received, updated or removed</p>\n\n        \n            <section>\n        <h4>Parameters</h4>\n            <table class=\"jsdoc-details-table\">\n        <thead>\n            <tr>\n                <th>Name</th>\n                <th>Type</th>\n                <th>Optional</th>\n                <th>Description</th>\n            </tr>\n        </thead>\n        <tbody>\n                <tr>\n        <td>\n            <p>reaction</p>\n        </td>\n        <td>\n                <p>object</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>Values in <code>reaction</code> have the following properties:</p>\n                    <table class=\"jsdoc-details-table\">\n        <thead>\n            <tr>\n                <th>Name</th>\n                <th>Type</th>\n                <th>Optional</th>\n                <th>Description</th>\n            </tr>\n        </thead>\n        <tbody>\n                <tr>\n        <td>\n            <p>id</p>\n        </td>\n        <td>\n                <p>object</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>Reaction id</p>\n        </td>\n</tr>\n\n                <tr>\n        <td>\n            <p>orphan</p>\n        </td>\n        <td>\n                <p>number</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>Orphan</p>\n        </td>\n</tr>\n\n                <tr>\n        <td>\n            <p>orphanReason</p>\n        </td>\n        <td>\n                <p>string</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>Orphan reason</p>\n                <p>Value can be null.</p>\n        </td>\n</tr>\n\n                <tr>\n        <td>\n            <p>timestamp</p>\n        </td>\n        <td>\n                <p>number</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>Timestamp</p>\n        </td>\n</tr>\n\n                <tr>\n        <td>\n            <p>reaction</p>\n        </td>\n        <td>\n                <p>string</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>Reaction</p>\n        </td>\n</tr>\n\n                <tr>\n        <td>\n            <p>read</p>\n        </td>\n        <td>\n                <p>boolean</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>Read</p>\n        </td>\n</tr>\n\n                <tr>\n        <td>\n            <p>msgId</p>\n        </td>\n        <td>\n                <p>object</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>Parent message id</p>\n        </td>\n</tr>\n\n                <tr>\n        <td>\n            <p>senderId</p>\n        </td>\n        <td>\n                <p>string</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>Sender id</p>\n        </td>\n</tr>\n\n                <tr>\n        <td>\n            <p>ack</p>\n        </td>\n        <td>\n                <p>number</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>Ack</p>\n                <p>Value can be null.</p>\n        </td>\n</tr>\n\n        </tbody>\n</table>\n\n        </td>\n</tr>\n\n        </tbody>\n</table>\n\n    </section>\n\n        \n\n        <dl class=\"dl-compact\">\n            \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n        </dl>\n\n                <h3 id=\"event:message_revoke_everyone\"><span class=\"symbol-name\">message_revoke_everyone</span></h3>            <p>Emitted when a message is deleted for everyone in the chat.</p>\n\n        \n            <section>\n        <h4>Parameters</h4>\n            <table class=\"jsdoc-details-table\">\n        <thead>\n            <tr>\n                <th>Name</th>\n                <th>Type</th>\n                <th>Optional</th>\n                <th>Description</th>\n            </tr>\n        </thead>\n        <tbody>\n                <tr>\n        <td>\n            <p>message</p>\n        </td>\n        <td>\n                <p><a href=\"Message.html\">Message</a></p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>The message that was revoked, in its current state. It will not contain the original message's data.</p>\n        </td>\n</tr>\n\n                <tr>\n        <td>\n            <p>revoked_msg</p>\n        </td>\n        <td>\n                <p><a href=\"Message.html\">Message</a></p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>The message that was revoked, before it was revoked. It will contain the message's original data.\nNote that due to the way this data is captured, it may be possible that this param will be undefined.</p>\n                <p>Value can be null.</p>\n        </td>\n</tr>\n\n        </tbody>\n</table>\n\n    </section>\n\n        \n\n        <dl class=\"dl-compact\">\n            \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n        </dl>\n\n                <h3 id=\"event:message_revoke_me\"><span class=\"symbol-name\">message_revoke_me</span></h3>            <p>Emitted when a message is deleted by the current user.</p>\n\n        \n            <section>\n        <h4>Parameter</h4>\n            <table class=\"jsdoc-details-table\">\n        <thead>\n            <tr>\n                <th>Name</th>\n                <th>Type</th>\n                <th>Optional</th>\n                <th>Description</th>\n            </tr>\n        </thead>\n        <tbody>\n                <tr>\n        <td>\n            <p>message</p>\n        </td>\n        <td>\n                <p><a href=\"Message.html\">Message</a></p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>The message that was revoked</p>\n        </td>\n</tr>\n\n        </tbody>\n</table>\n\n    </section>\n\n        \n\n        <dl class=\"dl-compact\">\n            \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n        </dl>\n\n                <h3 id=\"event:qr\"><span class=\"symbol-name\">qr</span></h3>            <p>Emitted when a QR code is received</p>\n\n        \n            <section>\n        <h4>Parameter</h4>\n            <table class=\"jsdoc-details-table\">\n        <thead>\n            <tr>\n                <th>Name</th>\n                <th>Type</th>\n                <th>Optional</th>\n                <th>Description</th>\n            </tr>\n        </thead>\n        <tbody>\n                <tr>\n        <td>\n            <p>qr</p>\n        </td>\n        <td>\n                <p>string</p>\n        </td>\n        <td>\n                <p>&nbsp;</p>\n        </td>\n        <td>\n                <p>QR Code</p>\n        </td>\n</tr>\n\n        </tbody>\n</table>\n\n    </section>\n\n        \n\n        <dl class=\"dl-compact\">\n            \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n        </dl>\n\n                <h3 id=\"event:ready\"><span class=\"symbol-name\">ready</span></h3>            <p>Emitted when the client has initialized and is ready to receive messages.</p>\n\n        \n        \n        \n\n        <dl class=\"dl-compact\">\n            \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n        </dl>\n\n                <h3 id=\"event:vote_update\"><span class=\"symbol-name\">vote_update</span></h3>            <p>Emitted when some poll option is selected or deselected,\nshows a user's current selected option(s) on the poll</p>\n\n        \n        \n        \n\n        <dl class=\"dl-compact\">\n            \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n        </dl>\n\n    </section>\n\n</section>\n\n                                        </div>\n                                </div>\n                                <nav id=\"jsdoc-toc-nav\" role=\"navigation\"></nav>\n                        </div>\n                </div>\n                    <footer id=\"jsdoc-footer\" class=\"jsdoc-footer\">\n                            <div id=\"jsdoc-footer-container\">\n                                    <p>\n                                      Generated by <a href=\"https://github.com/jsdoc3/jsdoc\">JSDoc</a> 3.6.11 on January 30, 2026.\n                                    </p>\n                            </div>\n                    </footer>\n                <script src=\"scripts/jquery.min.js\"></script>\n                <script src=\"scripts/tree.jquery.js\"></script>\n                <script src=\"scripts/prettify.js\"></script>\n                <script src=\"scripts/jsdoc-toc.js\"></script>\n                <script src=\"scripts/linenumber.js\"></script>\n                <script src=\"scripts/scrollanchor.js\"></script>\n        </body>\n</html>\n"
  },
  {
    "path": "docs/Client.js.html",
    "content": "<!doctype html>\n<html>\n\n<head>\n  <meta name=\"generator\" content=\"JSDoc 3.6.11\">\n  <meta charset=\"utf-8\">\n  <title>whatsapp-web.js 1.34.6 &raquo; Source: Client.js</title>\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Karla:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Noto+Serif:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Inconsolata:500\" type=\"text/css\">\n  <link href=\"css/baseline.css\" rel=\"stylesheet\">\n</head>\n\n<body onload=\"prettyPrint()\">\n  <nav id=\"jsdoc-navbar\" role=\"navigation\" class=\"jsdoc-navbar\">\n    <div id=\"jsdoc-navbar-container\">\n      <div id=\"jsdoc-navbar-content\">\n        <a href=\"index.html\" class=\"jsdoc-navbar-package-name\">whatsapp-web.<wbr>js 1.<wbr>34.<wbr>6</a>\n      </div>\n    </div>\n  </nav>\n  <div id=\"jsdoc-body-container\">\n    <div id=\"jsdoc-content\">\n      <div id=\"jsdoc-content-container\">\n        <div id=\"jsdoc-banner\" role=\"banner\">\n        </div>\n        <div id=\"jsdoc-main\" role=\"main\">\n          <header class=\"page-header\">\n            <h1>Source: Client.js</h1>\n          </header>\n          <article>\n            <pre class=\"prettyprint linenums\"><code>&#x27;use strict&#x27;;\n\nconst EventEmitter &#x3D; require(&#x27;events&#x27;);\nconst puppeteer &#x3D; require(&#x27;puppeteer&#x27;);\nconst moduleRaid &#x3D; require(&#x27;@pedroslopez/moduleraid/moduleraid&#x27;);\n\nconst Util &#x3D; require(&#x27;./util/Util&#x27;);\nconst InterfaceController &#x3D; require(&#x27;./util/InterfaceController&#x27;);\nconst { WhatsWebURL, DefaultOptions, Events, WAState, MessageTypes } &#x3D; require(&#x27;./util/Constants&#x27;);\nconst { ExposeAuthStore } &#x3D; require(&#x27;./util/Injected/AuthStore/AuthStore&#x27;);\nconst { ExposeStore } &#x3D; require(&#x27;./util/Injected/Store&#x27;);\nconst { ExposeLegacyAuthStore } &#x3D; require(&#x27;./util/Injected/AuthStore/LegacyAuthStore&#x27;);\nconst { ExposeLegacyStore } &#x3D; require(&#x27;./util/Injected/LegacyStore&#x27;);\nconst { LoadUtils } &#x3D; require(&#x27;./util/Injected/Utils&#x27;);\nconst ChatFactory &#x3D; require(&#x27;./factories/ChatFactory&#x27;);\nconst ContactFactory &#x3D; require(&#x27;./factories/ContactFactory&#x27;);\nconst WebCacheFactory &#x3D; require(&#x27;./webCache/WebCacheFactory&#x27;);\nconst { ClientInfo, Message, MessageMedia, Contact, Location, Poll, PollVote, GroupNotification, Label, Call, Buttons, List, Reaction, Broadcast, ScheduledEvent } &#x3D; require(&#x27;./structures&#x27;);\nconst NoAuth &#x3D; require(&#x27;./authStrategies/NoAuth&#x27;);\nconst {exposeFunctionIfAbsent} &#x3D; require(&#x27;./util/Puppeteer&#x27;);\n\n/**\n * Starting point for interacting with the WhatsApp Web API\n * @extends {EventEmitter}\n * @param {object} options - Client options\n * @param {AuthStrategy} options.authStrategy - Determines how to save and restore sessions. Will use LegacySessionAuth if options.session is set. Otherwise, NoAuth will be used.\n * @param {string} options.webVersion - The version of WhatsApp Web to use. Use options.webVersionCache to configure how the version is retrieved.\n * @param {object} options.webVersionCache - Determines how to retrieve the WhatsApp Web version. Defaults to a local cache (LocalWebCache) that falls back to latest if the requested version is not found.\n * @param {number} options.authTimeoutMs - Timeout for authentication selector in puppeteer\n * @param {function} options.evalOnNewDoc - function to eval on new doc\n * @param {object} options.puppeteer - Puppeteer launch options. View docs here: https://github.com/puppeteer/puppeteer/\n * @param {number} options.qrMaxRetries - How many times should the qrcode be refreshed before giving up\n * @param {string} options.restartOnAuthFail  - @deprecated This option should be set directly on the LegacySessionAuth.\n * @param {object} options.session - @deprecated Only here for backwards-compatibility. You should move to using LocalAuth, or set the authStrategy to LegacySessionAuth explicitly. \n * @param {number} options.takeoverOnConflict - If another whatsapp web session is detected (another browser), take over the session in the current browser\n * @param {number} options.takeoverTimeoutMs - How much time to wait before taking over the session\n * @param {string} options.userAgent - User agent to use in puppeteer\n * @param {string} options.ffmpegPath - Ffmpeg path to use when formatting videos to webp while sending stickers \n * @param {boolean} options.bypassCSP - Sets bypassing of page&#x27;s Content-Security-Policy.\n * @param {string} options.deviceName - Sets the device name of a current linked device., i.e.: &#x27;TEST&#x27;.\n * @param {string} options.browserName - Sets the browser name of a current linked device, i.e.: &#x27;Firefox&#x27;.\n * @param {object} options.proxyAuthentication - Proxy Authentication object.\n * \n * @fires Client#qr\n * @fires Client#authenticated\n * @fires Client#auth_failure\n * @fires Client#ready\n * @fires Client#message\n * @fires Client#message_ack\n * @fires Client#message_create\n * @fires Client#message_revoke_me\n * @fires Client#message_revoke_everyone\n * @fires Client#message_ciphertext\n * @fires Client#message_edit\n * @fires Client#media_uploaded\n * @fires Client#group_join\n * @fires Client#group_leave\n * @fires Client#group_update\n * @fires Client#disconnected\n * @fires Client#change_state\n * @fires Client#contact_changed\n * @fires Client#group_admin_changed\n * @fires Client#group_membership_request\n * @fires Client#vote_update\n */\nclass Client extends EventEmitter {\n    constructor(options &#x3D; {}) {\n        super();\n\n        this.options &#x3D; Util.mergeDefault(DefaultOptions, options);\n        \n        if(!this.options.authStrategy) {\n            this.authStrategy &#x3D; new NoAuth();\n        } else {\n            this.authStrategy &#x3D; this.options.authStrategy;\n        }\n\n        this.authStrategy.setup(this);\n\n        /**\n         * @type {puppeteer.Browser}\n         */\n        this.pupBrowser &#x3D; null;\n        /**\n         * @type {puppeteer.Page}\n         */\n        this.pupPage &#x3D; null;\n\n        this.currentIndexHtml &#x3D; null;\n        this.lastLoggedOut &#x3D; false;\n\n        Util.setFfmpegPath(this.options.ffmpegPath);\n    }\n    /**\n     * Injection logic\n     * Private function\n     */\n    async inject() {\n        if(this.options.authTimeoutMs &#x3D;&#x3D;&#x3D; undefined || this.options.authTimeoutMs&#x3D;&#x3D;0){\n            this.options.authTimeoutMs &#x3D; 30000;\n        }\n        let start &#x3D; Date.now();\n        let timeout &#x3D; this.options.authTimeoutMs;\n        let res &#x3D; false;\n        while(start &gt; (Date.now() - timeout)){\n            res &#x3D; await this.pupPage.evaluate(&#x27;window.Debug?.VERSION !&#x3D; undefined&#x27;);\n            if(res){break;}\n            await new Promise(r &#x3D;&gt; setTimeout(r, 200));\n        }\n        if(!res){ \n            throw &#x27;auth timeout&#x27;;\n        }       \n        await this.setDeviceName(this.options.deviceName, this.options.browserName);\n        const pairWithPhoneNumber &#x3D; this.options.pairWithPhoneNumber;\n        const version &#x3D; await this.getWWebVersion();\n        const isCometOrAbove &#x3D; parseInt(version.split(&#x27;.&#x27;)?.[1]) &gt;&#x3D; 3000;\n\n        if (isCometOrAbove) {\n            await this.pupPage.evaluate(ExposeAuthStore);\n        } else {\n            await this.pupPage.evaluate(ExposeLegacyAuthStore, moduleRaid.toString());\n        }\n\n        const needAuthentication &#x3D; await this.pupPage.evaluate(async () &#x3D;&gt; {\n            let state &#x3D; window.AuthStore.AppState.state;\n\n            if (state &#x3D;&#x3D;&#x3D; &#x27;OPENING&#x27; || state &#x3D;&#x3D;&#x3D; &#x27;UNLAUNCHED&#x27; || state &#x3D;&#x3D;&#x3D; &#x27;PAIRING&#x27;) {\n                // wait till state changes\n                await new Promise(r &#x3D;&gt; {\n                    window.AuthStore.AppState.on(&#x27;change:state&#x27;, function waitTillInit(_AppState, state) {\n                        if (state !&#x3D;&#x3D; &#x27;OPENING&#x27; &amp;amp;&amp;amp; state !&#x3D;&#x3D; &#x27;UNLAUNCHED&#x27; &amp;amp;&amp;amp; state !&#x3D;&#x3D; &#x27;PAIRING&#x27;) {\n                            window.AuthStore.AppState.off(&#x27;change:state&#x27;, waitTillInit);\n                            r();\n                        } \n                    });\n                }); \n            }\n            state &#x3D; window.AuthStore.AppState.state;\n            return state &#x3D;&#x3D; &#x27;UNPAIRED&#x27; || state &#x3D;&#x3D; &#x27;UNPAIRED_IDLE&#x27;;\n        });\n\n        if (needAuthentication) {\n            const { failed, failureEventPayload, restart } &#x3D; await this.authStrategy.onAuthenticationNeeded();\n\n            if(failed) {\n                /**\n                 * Emitted when there has been an error while trying to restore an existing session\n                 * @event Client#auth_failure\n                 * @param {string} message\n                 */\n                this.emit(Events.AUTHENTICATION_FAILURE, failureEventPayload);\n                await this.destroy();\n                if (restart) {\n                    // session restore failed so try again but without session to force new authentication\n                    return this.initialize();\n                }\n                return;\n            }\n\n            // Register qr/code events\n            if (pairWithPhoneNumber.phoneNumber) {\n                await exposeFunctionIfAbsent(this.pupPage, &#x27;onCodeReceivedEvent&#x27;, async (code) &#x3D;&gt; {\n                    /**\n                    * Emitted when a pairing code is received\n                    * @event Client#code\n                    * @param {string} code Code\n                    * @returns {string} Code that was just received\n                    */\n                    this.emit(Events.CODE_RECEIVED, code);\n                    return code;\n                });\n                this.requestPairingCode(pairWithPhoneNumber.phoneNumber, pairWithPhoneNumber.showNotification, pairWithPhoneNumber.intervalMs);\n            } else {\n                let qrRetries &#x3D; 0;\n                await exposeFunctionIfAbsent(this.pupPage, &#x27;onQRChangedEvent&#x27;, async (qr) &#x3D;&gt; {\n                    /**\n                    * Emitted when a QR code is received\n                    * @event Client#qr\n                    * @param {string} qr QR Code\n                    */\n                    this.emit(Events.QR_RECEIVED, qr);\n                    if (this.options.qrMaxRetries &gt; 0) {\n                        qrRetries++;\n                        if (qrRetries &gt; this.options.qrMaxRetries) {\n                            this.emit(Events.DISCONNECTED, &#x27;Max qrcode retries reached&#x27;);\n                            await this.destroy();\n                        }\n                    }\n                });\n\n\n                await this.pupPage.evaluate(async () &#x3D;&gt; {\n                    const registrationInfo &#x3D; await window.AuthStore.RegistrationUtils.waSignalStore.getRegistrationInfo();\n                    const noiseKeyPair &#x3D; await window.AuthStore.RegistrationUtils.waNoiseInfo.get();\n                    const staticKeyB64 &#x3D; window.AuthStore.Base64Tools.encodeB64(noiseKeyPair.staticKeyPair.pubKey);\n                    const identityKeyB64 &#x3D; window.AuthStore.Base64Tools.encodeB64(registrationInfo.identityKeyPair.pubKey);\n                    const advSecretKey &#x3D; await window.AuthStore.RegistrationUtils.getADVSecretKey();\n                    const platform &#x3D; window.AuthStore.RegistrationUtils.DEVICE_PLATFORM;\n                    const getQR &#x3D; (ref) &#x3D;&gt; ref + &#x27;,&#x27; + staticKeyB64 + &#x27;,&#x27; + identityKeyB64 + &#x27;,&#x27; + advSecretKey + &#x27;,&#x27; + platform;\n\n                    window.onQRChangedEvent(getQR(window.AuthStore.Conn.ref)); // initial qr\n                    window.AuthStore.Conn.on(&#x27;change:ref&#x27;, (_, ref) &#x3D;&gt; { window.onQRChangedEvent(getQR(ref)); }); // future QR changes\n                });\n            }\n        }\n\n        await exposeFunctionIfAbsent(this.pupPage, &#x27;onAuthAppStateChangedEvent&#x27;, async (state) &#x3D;&gt; {\n            if (state &#x3D;&#x3D; &#x27;UNPAIRED_IDLE&#x27; &amp;amp;&amp;amp; !pairWithPhoneNumber.phoneNumber) {\n                // refresh qr code\n                window.Store.Cmd.refreshQR();\n            }\n        });\n\n        await exposeFunctionIfAbsent(this.pupPage, &#x27;onAppStateHasSyncedEvent&#x27;, async () &#x3D;&gt; {\n            const authEventPayload &#x3D; await this.authStrategy.getAuthEventPayload();\n            /**\n                 * Emitted when authentication is successful\n                 * @event Client#authenticated\n                 */\n            this.emit(Events.AUTHENTICATED, authEventPayload);\n\n            const injected &#x3D; await this.pupPage.evaluate(async () &#x3D;&gt; {\n                return typeof window.Store !&#x3D;&#x3D; &#x27;undefined&#x27; &amp;amp;&amp;amp; typeof window.WWebJS !&#x3D;&#x3D; &#x27;undefined&#x27;;\n            });\n\n            if (!injected) {\n                if (this.options.webVersionCache.type &#x3D;&#x3D;&#x3D; &#x27;local&#x27; &amp;amp;&amp;amp; this.currentIndexHtml) {\n                    const { type: webCacheType, ...webCacheOptions } &#x3D; this.options.webVersionCache;\n                    const webCache &#x3D; WebCacheFactory.createWebCache(webCacheType, webCacheOptions);\n            \n                    await webCache.persist(this.currentIndexHtml, version);\n                }\n\n                if (isCometOrAbove) {\n                    await this.pupPage.evaluate(ExposeStore);\n                } else {\n                    // make sure all modules are ready before injection\n                    // 2 second delay after authentication makes sense and does not need to be made dyanmic or removed\n                    await new Promise(r &#x3D;&gt; setTimeout(r, 2000)); \n                    await this.pupPage.evaluate(ExposeLegacyStore);\n                }\n                let start &#x3D; Date.now();\n                let res &#x3D; false;\n                while(start &gt; (Date.now() - 30000)){\n                    // Check window.Store Injection\n                    res &#x3D; await this.pupPage.evaluate(&#x27;window.Store !&#x3D; undefined&#x27;);\n                    if(res){break;}\n                    await new Promise(r &#x3D;&gt; setTimeout(r, 200));\n                }\n                if(!res){\n                    throw &#x27;ready timeout&#x27;;\n                }\n            \n                /**\n                     * Current connection information\n                     * @type {ClientInfo}\n                     */\n                this.info &#x3D; new ClientInfo(this, await this.pupPage.evaluate(() &#x3D;&gt; {\n                    return { ...window.Store.Conn.serialize(), wid: window.Store.User.getMaybeMePnUser() || window.Store.User.getMaybeMeLidUser() };\n                }));\n\n                this.interface &#x3D; new InterfaceController(this);\n\n                //Load util functions (serializers, helper functions)\n                await this.pupPage.evaluate(LoadUtils);\n\n                await this.attachEventListeners();\n            }\n            /**\n                 * Emitted when the client has initialized and is ready to receive messages.\n                 * @event Client#ready\n                 */\n            this.emit(Events.READY);\n            this.authStrategy.afterAuthReady();\n        });\n        let lastPercent &#x3D; null;\n        await exposeFunctionIfAbsent(this.pupPage, &#x27;onOfflineProgressUpdateEvent&#x27;, async (percent) &#x3D;&gt; {\n            if (lastPercent !&#x3D;&#x3D; percent) {\n                lastPercent &#x3D; percent;\n                this.emit(Events.LOADING_SCREEN, percent, &#x27;WhatsApp&#x27;); // Message is hardcoded as &quot;WhatsApp&quot; for now\n            }\n        });\n        await exposeFunctionIfAbsent(this.pupPage, &#x27;onLogoutEvent&#x27;, async () &#x3D;&gt; {\n            this.lastLoggedOut &#x3D; true;\n            await this.pupPage.waitForNavigation({waitUntil: &#x27;load&#x27;, timeout: 5000}).catch((_) &#x3D;&gt; _);\n        });\n        await this.pupPage.evaluate(() &#x3D;&gt; {\n            window.AuthStore.AppState.on(&#x27;change:state&#x27;, (_AppState, state) &#x3D;&gt; { window.onAuthAppStateChangedEvent(state); });\n            window.AuthStore.AppState.on(&#x27;change:hasSynced&#x27;, () &#x3D;&gt; { window.onAppStateHasSyncedEvent(); });\n            window.AuthStore.Cmd.on(&#x27;offline_progress_update&#x27;, () &#x3D;&gt; {\n                window.onOfflineProgressUpdateEvent(window.AuthStore.OfflineMessageHandler.getOfflineDeliveryProgress()); \n            });\n            window.AuthStore.Cmd.on(&#x27;logout&#x27;, async () &#x3D;&gt; {\n                await window.onLogoutEvent();\n            });\n        });\n    }\n\n    /**\n     * Sets up events and requirements, kicks off authentication request\n     */\n    async initialize() {\n\n        let \n            /**\n             * @type {puppeteer.Browser}\n             */\n            browser, \n            /**\n             * @type {puppeteer.Page}\n             */\n            page;\n\n        browser &#x3D; null;\n        page &#x3D; null;\n\n        await this.authStrategy.beforeBrowserInitialized();\n\n        const puppeteerOpts &#x3D; this.options.puppeteer;\n        if (puppeteerOpts &amp;amp;&amp;amp; (puppeteerOpts.browserWSEndpoint || puppeteerOpts.browserURL)) {\n            browser &#x3D; await puppeteer.connect(puppeteerOpts);\n            page &#x3D; await browser.newPage();\n        } else {\n            const browserArgs &#x3D; [...(puppeteerOpts.args || [])];\n            if(this.options.userAgent !&#x3D;&#x3D; false &amp;amp;&amp;amp; !browserArgs.find(arg &#x3D;&gt; arg.includes(&#x27;--user-agent&#x27;))) {\n                browserArgs.push(&#x60;--user-agent&#x3D;${this.options.userAgent}&#x60;);\n            }\n            // navigator.webdriver fix\n            browserArgs.push(&#x27;--disable-blink-features&#x3D;AutomationControlled&#x27;);\n\n            browser &#x3D; await puppeteer.launch({...puppeteerOpts, args: browserArgs});\n            page &#x3D; (await browser.pages())[0];\n        }\n\n        if (this.options.proxyAuthentication !&#x3D;&#x3D; undefined) {\n            await page.authenticate(this.options.proxyAuthentication);\n        }\n        if(this.options.userAgent !&#x3D;&#x3D; false) {\n            await page.setUserAgent(this.options.userAgent);\n        }\n        if (this.options.bypassCSP) await page.setBypassCSP(true);\n\n        this.pupBrowser &#x3D; browser;\n        this.pupPage &#x3D; page;\n\n        await this.authStrategy.afterBrowserInitialized();\n        await this.initWebVersionCache();\n        \n        if (this.options.evalOnNewDoc !&#x3D;&#x3D; undefined) {\n            await page.evaluateOnNewDocument(this.options.evalOnNewDoc);\n        }\n        \n        // ocVersion (isOfficialClient patch)\n        // remove after 2.3000.x hard release\n        await page.evaluateOnNewDocument(() &#x3D;&gt; {\n            const originalError &#x3D; Error;\n            window.originalError &#x3D; originalError;\n            //eslint-disable-next-line no-global-assign\n            Error &#x3D; function (message) {\n                const error &#x3D; new originalError(message);\n                const originalStack &#x3D; error.stack;\n                if (error.stack.includes(&#x27;moduleRaid&#x27;)) error.stack &#x3D; originalStack + &#x27;\\n    at https://web.whatsapp.com/vendors~lazy_loaded_low_priority_components.05e98054dbd60f980427.js:2:44&#x27;;\n                return error;\n            };\n        });\n        \n        await page.goto(WhatsWebURL, {\n            waitUntil: &#x27;load&#x27;,\n            timeout: 0,\n            referer: &#x27;https://whatsapp.com/&#x27;\n        });\n\n        await this.inject();\n\n        this.pupPage.on(&#x27;framenavigated&#x27;, async (frame) &#x3D;&gt; {\n            if(frame.url().includes(&#x27;post_logout&#x3D;1&#x27;) || this.lastLoggedOut) {\n                this.emit(Events.DISCONNECTED, &#x27;LOGOUT&#x27;);\n                await this.authStrategy.logout();\n                await this.authStrategy.beforeBrowserInitialized();\n                await this.authStrategy.afterBrowserInitialized();\n                this.lastLoggedOut &#x3D; false;\n            }\n            await this.inject();\n        });\n    }\n\n    /**\n     * Request authentication via pairing code instead of QR code\n     * @param {string} phoneNumber - Phone number in international, symbol-free format (e.g. 12025550108 for US, 551155501234 for Brazil)\n     * @param {boolean} [showNotification &#x3D; true] - Show notification to pair on phone number\n     * @param {number} [intervalMs &#x3D; 180000] - The interval in milliseconds on how frequent to generate pairing code (WhatsApp default to 3 minutes)\n     * @returns {Promise&amp;lt;string&gt;} - Returns a pairing code in format &quot;ABCDEFGH&quot;\n     */\n    async requestPairingCode(phoneNumber, showNotification &#x3D; true, intervalMs &#x3D; 180000) {\n        return await this.pupPage.evaluate(async (phoneNumber, showNotification, intervalMs) &#x3D;&gt; {\n            const getCode &#x3D; async () &#x3D;&gt; {\n                while (!window.AuthStore.PairingCodeLinkUtils) {\n                    await new Promise(resolve &#x3D;&gt; setTimeout(resolve, 250));\n                }\n                window.AuthStore.PairingCodeLinkUtils.setPairingType(&#x27;ALT_DEVICE_LINKING&#x27;);\n                await window.AuthStore.PairingCodeLinkUtils.initializeAltDeviceLinking();\n                return window.AuthStore.PairingCodeLinkUtils.startAltLinkingFlow(phoneNumber, showNotification);\n            };\n            if (window.codeInterval) {\n                clearInterval(window.codeInterval); // remove existing interval\n            }\n            window.codeInterval &#x3D; setInterval(async () &#x3D;&gt; {\n                if (window.AuthStore.AppState.state !&#x3D; &#x27;UNPAIRED&#x27; &amp;amp;&amp;amp; window.AuthStore.AppState.state !&#x3D; &#x27;UNPAIRED_IDLE&#x27;) {\n                    clearInterval(window.codeInterval);\n                    return;\n                }\n                window.onCodeReceivedEvent(await getCode());\n            }, intervalMs);\n            return window.onCodeReceivedEvent(await getCode());\n        }, phoneNumber, showNotification, intervalMs);\n    }\n\n    /**\n     * Attach event listeners to WA Web\n     * Private function\n     * @property {boolean} reinject is this a reinject?\n     */\n    async attachEventListeners() {\n        await exposeFunctionIfAbsent(this.pupPage, &#x27;onAddMessageEvent&#x27;, msg &#x3D;&gt; {\n            if (msg.type &#x3D;&#x3D;&#x3D; &#x27;gp2&#x27;) {\n                const notification &#x3D; new GroupNotification(this, msg);\n                if ([&#x27;add&#x27;, &#x27;invite&#x27;, &#x27;linked_group_join&#x27;].includes(msg.subtype)) {\n                    /**\n                         * Emitted when a user joins the chat via invite link or is added by an admin.\n                         * @event Client#group_join\n                         * @param {GroupNotification} notification GroupNotification with more information about the action\n                         */\n                    this.emit(Events.GROUP_JOIN, notification);\n                } else if (msg.subtype &#x3D;&#x3D;&#x3D; &#x27;remove&#x27; || msg.subtype &#x3D;&#x3D;&#x3D; &#x27;leave&#x27;) {\n                    /**\n                         * Emitted when a user leaves the chat or is removed by an admin.\n                         * @event Client#group_leave\n                         * @param {GroupNotification} notification GroupNotification with more information about the action\n                         */\n                    this.emit(Events.GROUP_LEAVE, notification);\n                } else if (msg.subtype &#x3D;&#x3D;&#x3D; &#x27;promote&#x27; || msg.subtype &#x3D;&#x3D;&#x3D; &#x27;demote&#x27;) {\n                    /**\n                         * Emitted when a current user is promoted to an admin or demoted to a regular user.\n                         * @event Client#group_admin_changed\n                         * @param {GroupNotification} notification GroupNotification with more information about the action\n                         */\n                    this.emit(Events.GROUP_ADMIN_CHANGED, notification);\n                } else if (msg.subtype &#x3D;&#x3D;&#x3D; &#x27;membership_approval_request&#x27;) {\n                    /**\n                         * Emitted when some user requested to join the group\n                         * that has the membership approval mode turned on\n                         * @event Client#group_membership_request\n                         * @param {GroupNotification} notification GroupNotification with more information about the action\n                         * @param {string} notification.chatId The group ID the request was made for\n                         * @param {string} notification.author The user ID that made a request\n                         * @param {number} notification.timestamp The timestamp the request was made at\n                         */\n                    this.emit(Events.GROUP_MEMBERSHIP_REQUEST, notification);\n                } else {\n                    /**\n                         * Emitted when group settings are updated, such as subject, description or picture.\n                         * @event Client#group_update\n                         * @param {GroupNotification} notification GroupNotification with more information about the action\n                         */\n                    this.emit(Events.GROUP_UPDATE, notification);\n                }\n                return;\n            }\n\n            const message &#x3D; new Message(this, msg);\n\n            /**\n                 * Emitted when a new message is created, which may include the current user&#x27;s own messages.\n                 * @event Client#message_create\n                 * @param {Message} message The message that was created\n                 */\n            this.emit(Events.MESSAGE_CREATE, message);\n\n            if (msg.id.fromMe) return;\n\n            /**\n                 * Emitted when a new message is received.\n                 * @event Client#message\n                 * @param {Message} message The message that was received\n                 */\n            this.emit(Events.MESSAGE_RECEIVED, message);\n        });\n\n        let last_message;\n\n        await exposeFunctionIfAbsent(this.pupPage, &#x27;onChangeMessageTypeEvent&#x27;, (msg) &#x3D;&gt; {\n\n            if (msg.type &#x3D;&#x3D;&#x3D; &#x27;revoked&#x27;) {\n                const message &#x3D; new Message(this, msg);\n                let revoked_msg;\n                if (last_message &amp;amp;&amp;amp; msg.id.id &#x3D;&#x3D;&#x3D; last_message.id.id) {\n                    revoked_msg &#x3D; new Message(this, last_message);\n\n                    if (message.protocolMessageKey)\n                        revoked_msg.id &#x3D; { ...message.protocolMessageKey };                    \n                }\n\n                /**\n                     * Emitted when a message is deleted for everyone in the chat.\n                     * @event Client#message_revoke_everyone\n                     * @param {Message} message The message that was revoked, in its current state. It will not contain the original message&#x27;s data.\n                     * @param {?Message} revoked_msg The message that was revoked, before it was revoked. It will contain the message&#x27;s original data. \n                     * Note that due to the way this data is captured, it may be possible that this param will be undefined.\n                     */\n                this.emit(Events.MESSAGE_REVOKED_EVERYONE, message, revoked_msg);\n            }\n\n        });\n\n        await exposeFunctionIfAbsent(this.pupPage, &#x27;onChangeMessageEvent&#x27;, (msg) &#x3D;&gt; {\n\n            if (msg.type !&#x3D;&#x3D; &#x27;revoked&#x27;) {\n                last_message &#x3D; msg;\n            }\n\n            /**\n                 * The event notification that is received when one of\n                 * the group participants changes their phone number.\n                 */\n            const isParticipant &#x3D; msg.type &#x3D;&#x3D;&#x3D; &#x27;gp2&#x27; &amp;amp;&amp;amp; msg.subtype &#x3D;&#x3D;&#x3D; &#x27;modify&#x27;;\n\n            /**\n                 * The event notification that is received when one of\n                 * the contacts changes their phone number.\n                 */\n            const isContact &#x3D; msg.type &#x3D;&#x3D;&#x3D; &#x27;notification_template&#x27; &amp;amp;&amp;amp; msg.subtype &#x3D;&#x3D;&#x3D; &#x27;change_number&#x27;;\n\n            if (isParticipant || isContact) {\n                /** @type {GroupNotification} object does not provide enough information about this event, so a @type {Message} object is used. */\n                const message &#x3D; new Message(this, msg);\n\n                const newId &#x3D; isParticipant ? msg.recipients[0] : msg.to;\n                const oldId &#x3D; isParticipant ? msg.author : msg.templateParams.find(id &#x3D;&gt; id !&#x3D;&#x3D; newId);\n\n                /**\n                     * Emitted when a contact or a group participant changes their phone number.\n                     * @event Client#contact_changed\n                     * @param {Message} message Message with more information about the event.\n                     * @param {String} oldId The user&#x27;s id (an old one) who changed their phone number\n                     * and who triggered the notification.\n                     * @param {String} newId The user&#x27;s new id after the change.\n                     * @param {Boolean} isContact Indicates if a contact or a group participant changed their phone number.\n                     */\n                this.emit(Events.CONTACT_CHANGED, message, oldId, newId, isContact);\n            }\n        });\n\n        await exposeFunctionIfAbsent(this.pupPage, &#x27;onRemoveMessageEvent&#x27;, (msg) &#x3D;&gt; {\n\n            if (!msg.isNewMsg) return;\n\n            const message &#x3D; new Message(this, msg);\n\n            /**\n                 * Emitted when a message is deleted by the current user.\n                 * @event Client#message_revoke_me\n                 * @param {Message} message The message that was revoked\n                 */\n            this.emit(Events.MESSAGE_REVOKED_ME, message);\n\n        });\n\n        await exposeFunctionIfAbsent(this.pupPage, &#x27;onMessageAckEvent&#x27;, (msg, ack) &#x3D;&gt; {\n\n            const message &#x3D; new Message(this, msg);\n\n            /**\n                 * Emitted when an ack event occurrs on message type.\n                 * @event Client#message_ack\n                 * @param {Message} message The message that was affected\n                 * @param {MessageAck} ack The new ACK value\n                 */\n            this.emit(Events.MESSAGE_ACK, message, ack);\n\n        });\n\n        await exposeFunctionIfAbsent(this.pupPage, &#x27;onChatUnreadCountEvent&#x27;, async (data) &#x3D;&gt;{\n            const chat &#x3D; await this.getChatById(data.id);\n                \n            /**\n                 * Emitted when the chat unread count changes\n                 */\n            this.emit(Events.UNREAD_COUNT, chat);\n        });\n\n        await exposeFunctionIfAbsent(this.pupPage, &#x27;onMessageMediaUploadedEvent&#x27;, (msg) &#x3D;&gt; {\n\n            const message &#x3D; new Message(this, msg);\n\n            /**\n                 * Emitted when media has been uploaded for a message sent by the client.\n                 * @event Client#media_uploaded\n                 * @param {Message} message The message with media that was uploaded\n                 */\n            this.emit(Events.MEDIA_UPLOADED, message);\n        });\n\n        await exposeFunctionIfAbsent(this.pupPage, &#x27;onAppStateChangedEvent&#x27;, async (state) &#x3D;&gt; {\n            /**\n                 * Emitted when the connection state changes\n                 * @event Client#change_state\n                 * @param {WAState} state the new connection state\n                 */\n            this.emit(Events.STATE_CHANGED, state);\n\n            const ACCEPTED_STATES &#x3D; [WAState.CONNECTED, WAState.OPENING, WAState.PAIRING, WAState.TIMEOUT];\n\n            if (this.options.takeoverOnConflict) {\n                ACCEPTED_STATES.push(WAState.CONFLICT);\n\n                if (state &#x3D;&#x3D;&#x3D; WAState.CONFLICT) {\n                    setTimeout(() &#x3D;&gt; {\n                        this.pupPage.evaluate(() &#x3D;&gt; window.Store.AppState.takeover());\n                    }, this.options.takeoverTimeoutMs);\n                }\n            }\n\n            if (!ACCEPTED_STATES.includes(state)) {\n                /**\n                     * Emitted when the client has been disconnected\n                     * @event Client#disconnected\n                     * @param {WAState|&quot;LOGOUT&quot;} reason reason that caused the disconnect\n                     */\n                await this.authStrategy.disconnect();\n                this.emit(Events.DISCONNECTED, state);\n                this.destroy();\n            }\n        });\n\n        await exposeFunctionIfAbsent(this.pupPage, &#x27;onBatteryStateChangedEvent&#x27;, (state) &#x3D;&gt; {\n            const { battery, plugged } &#x3D; state;\n\n            if (battery &#x3D;&#x3D;&#x3D; undefined) return;\n\n            /**\n                 * Emitted when the battery percentage for the attached device changes. Will not be sent if using multi-device.\n                 * @event Client#change_battery\n                 * @param {object} batteryInfo\n                 * @param {number} batteryInfo.battery - The current battery percentage\n                 * @param {boolean} batteryInfo.plugged - Indicates if the phone is plugged in (true) or not (false)\n                 * @deprecated\n                 */\n            this.emit(Events.BATTERY_CHANGED, { battery, plugged });\n        });\n\n        await exposeFunctionIfAbsent(this.pupPage, &#x27;onIncomingCall&#x27;, (call) &#x3D;&gt; {\n            /**\n                 * Emitted when a call is received\n                 * @event Client#incoming_call\n                 * @param {object} call\n                 * @param {number} call.id - Call id\n                 * @param {string} call.peerJid - Who called\n                 * @param {boolean} call.isVideo - if is video\n                 * @param {boolean} call.isGroup - if is group\n                 * @param {boolean} call.canHandleLocally - if we can handle in waweb\n                 * @param {boolean} call.outgoing - if is outgoing\n                 * @param {boolean} call.webClientShouldHandle - If Waweb should handle\n                 * @param {object} call.participants - Participants\n                 */\n            const cll &#x3D; new Call(this, call);\n            this.emit(Events.INCOMING_CALL, cll);\n        });\n\n        await exposeFunctionIfAbsent(this.pupPage, &#x27;onReaction&#x27;, (reactions) &#x3D;&gt; {\n            for (const reaction of reactions) {\n                /**\n                     * Emitted when a reaction is sent, received, updated or removed\n                     * @event Client#message_reaction\n                     * @param {object} reaction\n                     * @param {object} reaction.id - Reaction id\n                     * @param {number} reaction.orphan - Orphan\n                     * @param {?string} reaction.orphanReason - Orphan reason\n                     * @param {number} reaction.timestamp - Timestamp\n                     * @param {string} reaction.reaction - Reaction\n                     * @param {boolean} reaction.read - Read\n                     * @param {object} reaction.msgId - Parent message id\n                     * @param {string} reaction.senderId - Sender id\n                     * @param {?number} reaction.ack - Ack\n                     */\n\n                this.emit(Events.MESSAGE_REACTION, new Reaction(this, reaction));\n            }\n        });\n\n        await exposeFunctionIfAbsent(this.pupPage, &#x27;onRemoveChatEvent&#x27;, async (chat) &#x3D;&gt; {\n            const _chat &#x3D; await this.getChatById(chat.id);\n\n            /**\n                 * Emitted when a chat is removed\n                 * @event Client#chat_removed\n                 * @param {Chat} chat\n                 */\n            this.emit(Events.CHAT_REMOVED, _chat);\n        });\n            \n        await exposeFunctionIfAbsent(this.pupPage, &#x27;onArchiveChatEvent&#x27;, async (chat, currState, prevState) &#x3D;&gt; {\n            const _chat &#x3D; await this.getChatById(chat.id);\n                \n            /**\n                 * Emitted when a chat is archived/unarchived\n                 * @event Client#chat_archived\n                 * @param {Chat} chat\n                 * @param {boolean} currState\n                 * @param {boolean} prevState\n                 */\n            this.emit(Events.CHAT_ARCHIVED, _chat, currState, prevState);\n        });\n\n        await exposeFunctionIfAbsent(this.pupPage, &#x27;onEditMessageEvent&#x27;, (msg, newBody, prevBody) &#x3D;&gt; {\n                \n            if(msg.type &#x3D;&#x3D;&#x3D; &#x27;revoked&#x27;){\n                return;\n            }\n            /**\n                 * Emitted when messages are edited\n                 * @event Client#message_edit\n                 * @param {Message} message\n                 * @param {string} newBody\n                 * @param {string} prevBody\n                 */\n            this.emit(Events.MESSAGE_EDIT, new Message(this, msg), newBody, prevBody);\n        });\n            \n        await exposeFunctionIfAbsent(this.pupPage, &#x27;onAddMessageCiphertextEvent&#x27;, msg &#x3D;&gt; {\n                \n            /**\n                 * Emitted when messages are edited\n                 * @event Client#message_ciphertext\n                 * @param {Message} message\n                 */\n            this.emit(Events.MESSAGE_CIPHERTEXT, new Message(this, msg));\n        });\n\n        await exposeFunctionIfAbsent(this.pupPage, &#x27;onPollVoteEvent&#x27;, (votes) &#x3D;&gt; {\n            for (const vote of votes) {\n                /**\n                 * Emitted when some poll option is selected or deselected,\n                 * shows a user&#x27;s current selected option(s) on the poll\n                 * @event Client#vote_update\n                 */\n                this.emit(Events.VOTE_UPDATE, new PollVote(this, vote));\n            }\n        });\n\n        await this.pupPage.evaluate(() &#x3D;&gt; {\n            window.Store.Msg.on(&#x27;change&#x27;, (msg) &#x3D;&gt; { window.onChangeMessageEvent(window.WWebJS.getMessageModel(msg)); });\n            window.Store.Msg.on(&#x27;change:type&#x27;, (msg) &#x3D;&gt; { window.onChangeMessageTypeEvent(window.WWebJS.getMessageModel(msg)); });\n            window.Store.Msg.on(&#x27;change:ack&#x27;, (msg, ack) &#x3D;&gt; { window.onMessageAckEvent(window.WWebJS.getMessageModel(msg), ack); });\n            window.Store.Msg.on(&#x27;change:isUnsentMedia&#x27;, (msg, unsent) &#x3D;&gt; { if (msg.id.fromMe &amp;amp;&amp;amp; !unsent) window.onMessageMediaUploadedEvent(window.WWebJS.getMessageModel(msg)); });\n            window.Store.Msg.on(&#x27;remove&#x27;, (msg) &#x3D;&gt; { if (msg.isNewMsg) window.onRemoveMessageEvent(window.WWebJS.getMessageModel(msg)); });\n            window.Store.Msg.on(&#x27;change:body change:caption&#x27;, (msg, newBody, prevBody) &#x3D;&gt; { window.onEditMessageEvent(window.WWebJS.getMessageModel(msg), newBody, prevBody); });\n            window.Store.AppState.on(&#x27;change:state&#x27;, (_AppState, state) &#x3D;&gt; { window.onAppStateChangedEvent(state); });\n            window.Store.Conn.on(&#x27;change:battery&#x27;, (state) &#x3D;&gt; { window.onBatteryStateChangedEvent(state); });\n            const callCollection &#x3D; (window.Store &amp;amp;&amp;amp; window.Store.Call) || (window.Store &amp;amp;&amp;amp; window.Store.WAWebCallCollection);\n            if (callCollection &amp;amp;&amp;amp; typeof callCollection.on &#x3D;&#x3D;&#x3D; &#x27;function&#x27;) {\n                callCollection.on(&#x27;add&#x27;, (call) &#x3D;&gt; { window.onIncomingCall(call); });\n            }\n            window.Store.Chat.on(&#x27;remove&#x27;, async (chat) &#x3D;&gt; { window.onRemoveChatEvent(await window.WWebJS.getChatModel(chat)); });\n            window.Store.Chat.on(&#x27;change:archive&#x27;, async (chat, currState, prevState) &#x3D;&gt; { window.onArchiveChatEvent(await window.WWebJS.getChatModel(chat), currState, prevState); });\n            window.Store.Msg.on(&#x27;add&#x27;, (msg) &#x3D;&gt; { \n                if (msg.isNewMsg) {\n                    if(msg.type &#x3D;&#x3D;&#x3D; &#x27;ciphertext&#x27;) {\n                        // defer message event until ciphertext is resolved (type changed)\n                        msg.once(&#x27;change:type&#x27;, (_msg) &#x3D;&gt; window.onAddMessageEvent(window.WWebJS.getMessageModel(_msg)));\n                        window.onAddMessageCiphertextEvent(window.WWebJS.getMessageModel(msg));\n                    } else {\n                        window.onAddMessageEvent(window.WWebJS.getMessageModel(msg)); \n                    }\n                }\n            });\n            window.Store.Chat.on(&#x27;change:unreadCount&#x27;, (chat) &#x3D;&gt; {window.onChatUnreadCountEvent(chat);});\n\n            if (window.compareWwebVersions(window.Debug.VERSION, &#x27;&gt;&#x3D;&#x27;, &#x27;2.3000.1014111620&#x27;)) {\n                const module &#x3D; window.Store.AddonReactionTable;\n                const ogMethod &#x3D; module.bulkUpsert;\n                module.bulkUpsert &#x3D; ((...args) &#x3D;&gt; {\n                    window.onReaction(args[0].map(reaction &#x3D;&gt; {\n                        const msgKey &#x3D; reaction.id;\n                        const parentMsgKey &#x3D; reaction.reactionParentKey;\n                        const timestamp &#x3D; reaction.reactionTimestamp / 1000;\n                        const sender &#x3D; reaction.author ?? reaction.from;\n                        const senderUserJid &#x3D; sender._serialized;\n\n                        return {...reaction, msgKey, parentMsgKey, senderUserJid, timestamp };\n                    }));\n\n                    return ogMethod(...args);\n                }).bind(module);\n\n                const pollVoteModule &#x3D; window.Store.AddonPollVoteTable;\n                const ogPollVoteMethod &#x3D; pollVoteModule.bulkUpsert;\n\n                pollVoteModule.bulkUpsert &#x3D; (async (...args) &#x3D;&gt; {\n                    const votes &#x3D; await Promise.all(args[0].map(async vote &#x3D;&gt; {\n                        const msgKey &#x3D; vote.id;\n                        const parentMsgKey &#x3D; vote.pollUpdateParentKey;\n                        const timestamp &#x3D; vote.t / 1000;\n                        const sender &#x3D; vote.author ?? vote.from;\n                        const senderUserJid &#x3D; sender._serialized;\n\n                        let parentMessage &#x3D; window.Store.Msg.get(parentMsgKey._serialized);\n                        if (!parentMessage) {\n                            const fetched &#x3D; await window.Store.Msg.getMessagesById([parentMsgKey._serialized]);\n                            parentMessage &#x3D; fetched?.messages?.[0] || null;\n                        }\n\n                        return {\n                            ...vote,\n                            msgKey,\n                            sender,\n                            parentMsgKey,\n                            senderUserJid,\n                            timestamp,\n                            parentMessage\n                        };\n                    }));\n\n                    window.onPollVoteEvent(votes);\n\n                    return ogPollVoteMethod.apply(pollVoteModule, args);\n                }).bind(pollVoteModule);\n            } else {\n                const module &#x3D; window.Store.createOrUpdateReactionsModule;\n                const ogMethod &#x3D; module.createOrUpdateReactions;\n                module.createOrUpdateReactions &#x3D; ((...args) &#x3D;&gt; {\n                    window.onReaction(args[0].map(reaction &#x3D;&gt; {\n                        const msgKey &#x3D; window.Store.MsgKey.fromString(reaction.msgKey);\n                        const parentMsgKey &#x3D; window.Store.MsgKey.fromString(reaction.parentMsgKey);\n                        const timestamp &#x3D; reaction.timestamp / 1000;\n\n                        return {...reaction, msgKey, parentMsgKey, timestamp };\n                    }));\n\n                    return ogMethod(...args);\n                }).bind(module);\n            }\n        });\n    }    \n\n    async initWebVersionCache() {\n        const { type: webCacheType, ...webCacheOptions } &#x3D; this.options.webVersionCache;\n        const webCache &#x3D; WebCacheFactory.createWebCache(webCacheType, webCacheOptions);\n\n        const requestedVersion &#x3D; this.options.webVersion;\n        const versionContent &#x3D; await webCache.resolve(requestedVersion);\n\n        if(versionContent) {\n            await this.pupPage.setRequestInterception(true);\n            this.pupPage.on(&#x27;request&#x27;, async (req) &#x3D;&gt; {\n                if(req.url() &#x3D;&#x3D;&#x3D; WhatsWebURL) {\n                    req.respond({\n                        status: 200,\n                        contentType: &#x27;text/html&#x27;,\n                        body: versionContent\n                    }); \n                } else {\n                    req.continue();\n                }\n            });\n        } else {\n            this.pupPage.on(&#x27;response&#x27;, async (res) &#x3D;&gt; {\n                if(res.ok() &amp;amp;&amp;amp; res.url() &#x3D;&#x3D;&#x3D; WhatsWebURL) {\n                    const indexHtml &#x3D; await res.text();\n                    this.currentIndexHtml &#x3D; indexHtml;\n                }\n            });\n        }\n    }\n\n    /**\n     * Closes the client\n     */\n    async destroy() {\n        const browser &#x3D; this.pupBrowser;\n        const isConnected &#x3D; browser?.isConnected?.();\n        if (isConnected) {\n            await browser.close();\n        }\n        await this.authStrategy.destroy();\n    }\n\n    /**\n     * Logs out the client, closing the current session\n     */\n    async logout() {\n        await this.pupPage.evaluate(() &#x3D;&gt; {\n            if (window.Store &amp;amp;&amp;amp; window.Store.AppState &amp;amp;&amp;amp; typeof window.Store.AppState.logout &#x3D;&#x3D;&#x3D; &#x27;function&#x27;) {\n                return window.Store.AppState.logout();\n            }\n        });\n        await this.pupBrowser.close();\n        \n        let maxDelay &#x3D; 0;\n        while (this.pupBrowser.isConnected() &amp;amp;&amp;amp; (maxDelay &amp;lt; 10)) { // waits a maximum of 1 second before calling the AuthStrategy\n            await new Promise(resolve &#x3D;&gt; setTimeout(resolve, 100));\n            maxDelay++; \n        }\n        \n        await this.authStrategy.logout();\n    }\n\n    /**\n     * Returns the version of WhatsApp Web currently being run\n     * @returns {Promise&amp;lt;string&gt;}\n     */\n    async getWWebVersion() {\n        return await this.pupPage.evaluate(() &#x3D;&gt; {\n            return window.Debug.VERSION;\n        });\n    }\n\n    async setDeviceName(deviceName, browserName) {\n        (deviceName || browserName) &amp;amp;&amp;amp; await this.pupPage.evaluate((deviceName, browserName) &#x3D;&gt; {\n            const func &#x3D; window.require(&#x27;WAWebMiscBrowserUtils&#x27;).info;\n            window.require(&#x27;WAWebMiscBrowserUtils&#x27;).info &#x3D; () &#x3D;&gt; {\n                return {\n                    ...func(),\n                    ...(deviceName ? { os: deviceName } : {}),\n                    ...(browserName ? { name: browserName } : {})\n                };\n            };\n        }, deviceName, browserName);\n    }\n\n    /**\n     * Mark as seen for the Chat\n     *  @param {string} chatId\n     *  @returns {Promise&amp;lt;boolean&gt;} result\n     * \n     */\n    async sendSeen(chatId) {\n        return await this.pupPage.evaluate(async (chatId) &#x3D;&gt; {\n            return window.WWebJS.sendSeen(chatId);\n        }, chatId);\n    }\n\n    /**\n     * An object representing mentions of groups\n     * @typedef {Object} GroupMention\n     * @property {string} subject - The name of a group to mention (can be custom)\n     * @property {string} id - The group ID, e.g.: &#x27;XXXXXXXXXX@g.us&#x27;\n     */\n\n    /**\n     * Message options.\n     * @typedef {Object} MessageSendOptions\n     * @property {boolean} [linkPreview&#x3D;true] - Show links preview. Has no effect on multi-device accounts.\n     * @property {boolean} [sendAudioAsVoice&#x3D;false] - Send audio as voice message with a generated waveform\n     * @property {boolean} [sendVideoAsGif&#x3D;false] - Send video as gif\n     * @property {boolean} [sendMediaAsSticker&#x3D;false] - Send media as a sticker\n     * @property {boolean} [sendMediaAsDocument&#x3D;false] - Send media as a document\n     * @property {boolean} [sendMediaAsHd&#x3D;false] - Send image as quality HD\n     * @property {boolean} [isViewOnce&#x3D;false] - Send photo/video as a view once message\n     * @property {boolean} [parseVCards&#x3D;true] - Automatically parse vCards and send them as contacts\n     * @property {string} [caption] - Image or video caption\n     * @property {string} [quotedMessageId] - Id of the message that is being quoted (or replied to)\n     * @property {GroupMention[]} [groupMentions] - An array of object that handle group mentions\n     * @property {string[]} [mentions] - User IDs to mention in the message\n     * @property {boolean} [sendSeen&#x3D;true] - Mark the conversation as seen after sending the message\n     * @property {string} [invokedBotWid&#x3D;undefined] - Bot Wid when doing a bot mention like @Meta AI\n     * @property {string} [stickerAuthor&#x3D;undefined] - Sets the author of the sticker, (if sendMediaAsSticker is true).\n     * @property {string} [stickerName&#x3D;undefined] - Sets the name of the sticker, (if sendMediaAsSticker is true).\n     * @property {string[]} [stickerCategories&#x3D;undefined] - Sets the categories of the sticker, (if sendMediaAsSticker is true). Provide emoji char array, can be null.\n     * @property {boolean} [ignoreQuoteErrors &#x3D; true] - Should the bot send a quoted message without the quoted message if it fails to get the quote?\n     * @property {boolean} [waitUntilMsgSent &#x3D; false] - Should the bot wait for the message send result?\n     * @property {MessageMedia} [media] - Media to be sent\n     * @property {any} [extra] - Extra options\n     */\n    \n    /**\n     * Send a message to a specific chatId\n     * @param {string} chatId\n     * @param {string|MessageMedia|Location|Poll|Contact|Array&amp;lt;Contact&gt;|Buttons|List} content\n     * @param {MessageSendOptions} [options] - Options used when sending the message\n     * \n     * @returns {Promise&amp;lt;Message&gt;} Message that was just sent\n     */\n    async sendMessage(chatId, content, options &#x3D; {}) {\n        const isChannel &#x3D; /@\\w*newsletter\\b/.test(chatId);\n        const isStatus &#x3D; /@\\w*broadcast\\b/.test(chatId);\n\n        if (isChannel &amp;amp;&amp;amp; [\n            options.sendMediaAsDocument, options.quotedMessageId,\n            options.parseVCards, options.isViewOnce,\n            content instanceof Location, content instanceof Contact,\n            content instanceof Buttons, content instanceof List,\n            Array.isArray(content) &amp;amp;&amp;amp; content.length &gt; 0 &amp;amp;&amp;amp; content[0] instanceof Contact\n        ].includes(true)) {\n            console.warn(&#x27;The message type is currently not supported for sending in channels,\\nthe supported message types are: text, image, sticker, gif, video, voice and poll.&#x27;);\n            return null;\n\n        } else if (isStatus &amp;amp;&amp;amp; [\n            options.sendMediaAsDocument, options.quotedMessageId,\n            options.parseVCards, options.isViewOnce, options.sendMediaAsSticker,\n            content instanceof Location, content instanceof Contact,\n            content instanceof Poll, content instanceof Buttons, content instanceof List,\n            Array.isArray(content) &amp;amp;&amp;amp; content.length &gt; 0 &amp;amp;&amp;amp; content[0] instanceof Contact\n        ].includes(true)) {\n            console.warn(&#x27;The message type is currently not supported for sending in status broadcast,\\nthe supported message types are: text, image, gif, audio and video.&#x27;);\n            return null;\n        }\n    \n        if (options.mentions) {\n            !Array.isArray(options.mentions) &amp;amp;&amp;amp; (options.mentions &#x3D; [options.mentions]);\n            if (options.mentions.some((possiblyContact) &#x3D;&gt; possiblyContact instanceof Contact)) {\n                console.warn(&#x27;Mentions with an array of Contact are now deprecated. See more at https://github.com/pedroslopez/whatsapp-web.js/pull/2166.&#x27;);\n                options.mentions &#x3D; options.mentions.map((a) &#x3D;&gt; a.id._serialized);\n            }\n        }\n\n        options.groupMentions &amp;amp;&amp;amp; !Array.isArray(options.groupMentions) &amp;amp;&amp;amp; (options.groupMentions &#x3D; [options.groupMentions]);\n        \n        let internalOptions &#x3D; {\n            linkPreview: options.linkPreview &#x3D;&#x3D;&#x3D; false ? undefined : true,\n            sendAudioAsVoice: options.sendAudioAsVoice,\n            sendVideoAsGif: options.sendVideoAsGif,\n            sendMediaAsSticker: options.sendMediaAsSticker,\n            sendMediaAsDocument: options.sendMediaAsDocument,\n            sendMediaAsHd: options.sendMediaAsHd,\n            caption: options.caption,\n            quotedMessageId: options.quotedMessageId,\n            parseVCards: options.parseVCards !&#x3D;&#x3D; false,\n            mentionedJidList: options.mentions || [],\n            groupMentions: options.groupMentions,\n            invokedBotWid: options.invokedBotWid,\n            ignoreQuoteErrors: options.ignoreQuoteErrors !&#x3D;&#x3D; false,\n            waitUntilMsgSent: options.waitUntilMsgSent || false,\n            extraOptions: options.extra\n        };\n\n        const sendSeen &#x3D; options.sendSeen !&#x3D;&#x3D; false;\n\n        if (content instanceof MessageMedia) {\n            internalOptions.media &#x3D; content;\n            internalOptions.isViewOnce &#x3D; options.isViewOnce,\n            content &#x3D; &#x27;&#x27;;\n        } else if (options.media instanceof MessageMedia) {\n            internalOptions.media &#x3D; options.media;\n            internalOptions.caption &#x3D; content;\n            internalOptions.isViewOnce &#x3D; options.isViewOnce,\n            content &#x3D; &#x27;&#x27;;\n        } else if (content instanceof Location) {\n            internalOptions.location &#x3D; content;\n            content &#x3D; &#x27;&#x27;;\n        } else if (content instanceof Poll) {\n            internalOptions.poll &#x3D; content;\n            content &#x3D; &#x27;&#x27;;\n        } else if (content instanceof ScheduledEvent) {\n            internalOptions.event &#x3D; content;\n            content &#x3D; &#x27;&#x27;;\n        } else if (content instanceof Contact) {\n            internalOptions.contactCard &#x3D; content.id._serialized;\n            content &#x3D; &#x27;&#x27;;\n        } else if (Array.isArray(content) &amp;amp;&amp;amp; content.length &gt; 0 &amp;amp;&amp;amp; content[0] instanceof Contact) {\n            internalOptions.contactCardList &#x3D; content.map(contact &#x3D;&gt; contact.id._serialized);\n            content &#x3D; &#x27;&#x27;;\n        } else if (content instanceof Buttons) {\n            console.warn(&#x27;Buttons are now deprecated. See more at https://www.youtube.com/watch?v&#x3D;hv1R1rLeVVE.&#x27;);\n            if (content.type !&#x3D;&#x3D; &#x27;chat&#x27;) { internalOptions.attachment &#x3D; content.body; }\n            internalOptions.buttons &#x3D; content;\n            content &#x3D; &#x27;&#x27;;\n        } else if (content instanceof List) {\n            console.warn(&#x27;Lists are now deprecated. See more at https://www.youtube.com/watch?v&#x3D;hv1R1rLeVVE.&#x27;);\n            internalOptions.list &#x3D; content;\n            content &#x3D; &#x27;&#x27;;\n        }\n\n        if (internalOptions.sendMediaAsSticker &amp;amp;&amp;amp; internalOptions.media) {\n            internalOptions.media &#x3D; await Util.formatToWebpSticker(\n                internalOptions.media, {\n                    name: options.stickerName,\n                    author: options.stickerAuthor,\n                    categories: options.stickerCategories\n                }, this.pupPage\n            );\n        }\n\n        const sentMsg &#x3D; await this.pupPage.evaluate(async (chatId, content, options, sendSeen) &#x3D;&gt; {\n            const chat &#x3D; await window.WWebJS.getChat(chatId, { getAsModel: false });\n\n            if (!chat) return null;\n\n            if (sendSeen) {\n                await window.WWebJS.sendSeen(chatId);\n            }\n\n            const msg &#x3D; await window.WWebJS.sendMessage(chat, content, options);\n            return msg\n                ? window.WWebJS.getMessageModel(msg)\n                : undefined;\n        }, chatId, content, internalOptions, sendSeen);\n\n        return sentMsg\n            ? new Message(this, sentMsg)\n            : undefined;\n    }\n\n    /**\n     * @typedef {Object} SendChannelAdminInviteOptions\n     * @property {?string} comment The comment to be added to an invitation\n     */\n\n    /**\n     * Sends a channel admin invitation to a user, allowing them to become an admin of the channel\n     * @param {string} chatId The ID of a user to send the channel admin invitation to\n     * @param {string} channelId The ID of a channel for which the invitation is being sent\n     * @param {SendChannelAdminInviteOptions} options \n     * @returns {Promise&amp;lt;boolean&gt;} Returns true if an invitation was sent successfully, false otherwise\n     */\n    async sendChannelAdminInvite(chatId, channelId, options &#x3D; {}) {\n        const response &#x3D; await this.pupPage.evaluate(async (chatId, channelId, options) &#x3D;&gt; {\n            const channelWid &#x3D; window.Store.WidFactory.createWid(channelId);\n            const chatWid &#x3D; window.Store.WidFactory.createWid(chatId);\n            const chat &#x3D; window.Store.Chat.get(chatWid) || (await window.Store.Chat.find(chatWid));\n\n            if (!chatWid.isUser()) {\n                return false;\n            }\n            \n            return await window.Store.SendChannelMessage.sendNewsletterAdminInviteMessage(\n                chat,\n                {\n                    newsletterWid: channelWid,\n                    invitee: chatWid,\n                    inviteMessage: options.comment,\n                    base64Thumb: await window.WWebJS.getProfilePicThumbToBase64(channelWid)\n                }\n            );\n        }, chatId, channelId, options);\n\n        return response.messageSendResult &#x3D;&#x3D;&#x3D; &#x27;OK&#x27;;\n    }\n    \n    /**\n     * Searches for messages\n     * @param {string} query\n     * @param {Object} [options]\n     * @param {number} [options.page]\n     * @param {number} [options.limit]\n     * @param {string} [options.chatId]\n     * @returns {Promise&amp;lt;Message[]&gt;}\n     */\n    async searchMessages(query, options &#x3D; {}) {\n        const messages &#x3D; await this.pupPage.evaluate(async (query, page, count, remote) &#x3D;&gt; {\n            const { messages } &#x3D; await window.Store.Msg.search(query, page, count, remote);\n            return messages.map(msg &#x3D;&gt; window.WWebJS.getMessageModel(msg));\n        }, query, options.page, options.limit, options.chatId);\n\n        return messages.map(msg &#x3D;&gt; new Message(this, msg));\n    }\n\n    /**\n     * Get all current chat instances\n     * @returns {Promise&amp;lt;Array&amp;lt;Chat&gt;&gt;}\n     */\n    async getChats() {\n        const chats &#x3D; await this.pupPage.evaluate(async () &#x3D;&gt; {\n            return await window.WWebJS.getChats();\n        });\n\n        return chats.map(chat &#x3D;&gt; ChatFactory.create(this, chat));\n    }\n\n    /**\n     * Gets all cached {@link Channel} instance\n     * @returns {Promise&amp;lt;Array&amp;lt;Channel&gt;&gt;}\n     */\n    async getChannels() {\n        const channels &#x3D; await this.pupPage.evaluate(async () &#x3D;&gt; {\n            return await window.WWebJS.getChannels();\n        });\n\n        return channels.map((channel) &#x3D;&gt; ChatFactory.create(this, channel));\n    }\n\n    /**\n     * Gets chat or channel instance by ID\n     * @param {string} chatId \n     * @returns {Promise&amp;lt;Chat|Channel&gt;}\n     */\n    async getChatById(chatId) {\n        const chat &#x3D; await this.pupPage.evaluate(async chatId &#x3D;&gt; {\n            return await window.WWebJS.getChat(chatId);\n        }, chatId);\n        return chat\n            ? ChatFactory.create(this, chat)\n            : undefined;\n    }\n\n    /**\n     * Gets a {@link Channel} instance by invite code\n     * @param {string} inviteCode The code that comes after the &#x27;https://whatsapp.com/channel/&#x27;\n     * @returns {Promise&amp;lt;Channel&gt;}\n     */\n    async getChannelByInviteCode(inviteCode) {\n        const channel &#x3D; await this.pupPage.evaluate(async (inviteCode) &#x3D;&gt; {\n            let channelMetadata;\n            try {\n                channelMetadata &#x3D; await window.WWebJS.getChannelMetadata(inviteCode);\n            } catch (err) {\n                if (err.name &#x3D;&#x3D;&#x3D; &#x27;ServerStatusCodeError&#x27;) return null;\n                throw err;\n            }\n            return await window.WWebJS.getChat(channelMetadata.id);\n        }, inviteCode);\n\n        return channel\n            ? ChatFactory.create(this, channel)\n            : undefined;\n    }\n\n    /**\n     * Get all current contact instances\n     * @returns {Promise&amp;lt;Array&amp;lt;Contact&gt;&gt;}\n     */\n    async getContacts() {\n        let contacts &#x3D; await this.pupPage.evaluate(() &#x3D;&gt; {\n            return window.WWebJS.getContacts();\n        });\n\n        return contacts.map(contact &#x3D;&gt; ContactFactory.create(this, contact));\n    }\n\n    /**\n     * Get contact instance by ID\n     * @param {string} contactId\n     * @returns {Promise&amp;lt;Contact&gt;}\n     */\n    async getContactById(contactId) {\n        let contact &#x3D; await this.pupPage.evaluate(contactId &#x3D;&gt; {\n            return window.WWebJS.getContact(contactId);\n        }, contactId);\n\n        return ContactFactory.create(this, contact);\n    }\n\n    /**\n     * Get message by ID\n     * @param {string} messageId\n     * @returns {Promise&amp;lt;Message&gt;}\n     */\n    async getMessageById(messageId) {\n        const msg &#x3D; await this.pupPage.evaluate(async messageId &#x3D;&gt; {\n            let msg &#x3D; window.Store.Msg.get(messageId);\n            if(msg) return window.WWebJS.getMessageModel(msg);\n\n            const params &#x3D; messageId.split(&#x27;_&#x27;);\n            if (params.length !&#x3D;&#x3D; 3 &amp;amp;&amp;amp; params.length !&#x3D;&#x3D; 4) throw new Error(&#x27;Invalid serialized message id specified&#x27;);\n\n            let messagesObject &#x3D; await window.Store.Msg.getMessagesById([messageId]);\n            if (messagesObject &amp;amp;&amp;amp; messagesObject.messages.length) msg &#x3D; messagesObject.messages[0];\n            \n            if(msg) return window.WWebJS.getMessageModel(msg);\n        }, messageId);\n\n        if(msg) return new Message(this, msg);\n        return null;\n    }\n\n    /**\n     * Gets instances of all pinned messages in a chat\n     * @param {string} chatId The chat ID\n     * @returns {Promise&amp;lt;Array&amp;lt;Message&gt;&gt;}\n     */\n    async getPinnedMessages(chatId) {\n        const pinnedMsgs &#x3D; await this.pupPage.evaluate(async (chatId) &#x3D;&gt; {\n            const chatWid &#x3D; window.Store.WidFactory.createWid(chatId);\n            const chat &#x3D; window.Store.Chat.get(chatWid) ?? await window.Store.Chat.find(chatWid);\n            if (!chat) return [];\n            \n            const msgs &#x3D; await window.Store.PinnedMsgUtils.getTable().equals([&#x27;chatId&#x27;], chatWid.toString());\n\n            const pinnedMsgs &#x3D; (\n                await Promise.all(\n                    msgs.filter(msg &#x3D;&gt; msg.pinType &#x3D;&#x3D; 1).map(async (msg) &#x3D;&gt; {\n                        const res &#x3D; await window.Store.Msg.getMessagesById([msg.parentMsgKey]);\n                        return res?.messages?.[0];\n                    })\n                )\n            ).filter(Boolean);\n\n            return !pinnedMsgs.length\n                ? []\n                : await Promise.all(pinnedMsgs.map((msg) &#x3D;&gt; window.WWebJS.getMessageModel(msg)));\n        }, chatId);\n\n        return pinnedMsgs.map((msg) &#x3D;&gt; new Message(this, msg));\n    }\n\n    /**\n     * Returns an object with information about the invite code&#x27;s group\n     * @param {string} inviteCode \n     * @returns {Promise&amp;lt;object&gt;} Invite information\n     */\n    async getInviteInfo(inviteCode) {\n        return await this.pupPage.evaluate(inviteCode &#x3D;&gt; {\n            return window.Store.GroupInvite.queryGroupInvite(inviteCode);\n        }, inviteCode);\n    }\n\n    /**\n     * Accepts an invitation to join a group\n     * @param {string} inviteCode Invitation code\n     * @returns {Promise&amp;lt;string&gt;} Id of the joined Chat\n     */\n    async acceptInvite(inviteCode) {\n        const res &#x3D; await this.pupPage.evaluate(async inviteCode &#x3D;&gt; {\n            return await window.Store.GroupInvite.joinGroupViaInvite(inviteCode);\n        }, inviteCode);\n\n        return res.gid._serialized;\n    }\n\n    /**\n     * Accepts a channel admin invitation and promotes the current user to a channel admin\n     * @param {string} channelId The channel ID to accept the admin invitation from\n     * @returns {Promise&amp;lt;boolean&gt;} Returns true if the operation completed successfully, false otherwise\n     */\n    async acceptChannelAdminInvite(channelId) {\n        return await this.pupPage.evaluate(async (channelId) &#x3D;&gt; {\n            try {\n                await window.Store.ChannelUtils.acceptNewsletterAdminInvite(channelId);\n                return true;\n            } catch (err) {\n                if (err.name &#x3D;&#x3D;&#x3D; &#x27;ServerStatusCodeError&#x27;) return false;\n                throw err;\n            }\n        }, channelId);\n    }\n\n    /**\n     * Revokes a channel admin invitation sent to a user by a channel owner\n     * @param {string} channelId The channel ID an invitation belongs to\n     * @param {string} userId The user ID the invitation was sent to\n     * @returns {Promise&amp;lt;boolean&gt;} Returns true if the operation completed successfully, false otherwise\n     */\n    async revokeChannelAdminInvite(channelId, userId) {\n        return await this.pupPage.evaluate(async (channelId, userId) &#x3D;&gt; {\n            try {\n                const userWid &#x3D; window.Store.WidFactory.createWid(userId);\n                await window.Store.ChannelUtils.revokeNewsletterAdminInvite(channelId, userWid);\n                return true;\n            } catch (err) {\n                if (err.name &#x3D;&#x3D;&#x3D; &#x27;ServerStatusCodeError&#x27;) return false;\n                throw err;\n            }\n        }, channelId, userId);\n    }\n\n    /**\n     * Demotes a channel admin to a regular subscriber (can be used also for self-demotion)\n     * @param {string} channelId The channel ID to demote an admin in\n     * @param {string} userId The user ID to demote\n     * @returns {Promise&amp;lt;boolean&gt;} Returns true if the operation completed successfully, false otherwise\n     */\n    async demoteChannelAdmin(channelId, userId) {\n        return await this.pupPage.evaluate(async (channelId, userId) &#x3D;&gt; {\n            try {\n                const userWid &#x3D; window.Store.WidFactory.createWid(userId);\n                await window.Store.ChannelUtils.demoteNewsletterAdmin(channelId, userWid);\n                return true;\n            } catch (err) {\n                if (err.name &#x3D;&#x3D;&#x3D; &#x27;ServerStatusCodeError&#x27;) return false;\n                throw err;\n            }\n        }, channelId, userId);\n    }\n\n    /**\n     * Accepts a private invitation to join a group\n     * @param {object} inviteInfo Invite V4 Info\n     * @returns {Promise&amp;lt;Object&gt;}\n     */\n    async acceptGroupV4Invite(inviteInfo) {\n        if (!inviteInfo.inviteCode) throw &#x27;Invalid invite code, try passing the message.inviteV4 object&#x27;;\n        if (inviteInfo.inviteCodeExp &#x3D;&#x3D; 0) throw &#x27;Expired invite code&#x27;;\n        return this.pupPage.evaluate(async inviteInfo &#x3D;&gt; {\n            let { groupId, fromId, inviteCode, inviteCodeExp } &#x3D; inviteInfo;\n            let userWid &#x3D; window.Store.WidFactory.createWid(fromId);\n            return await window.Store.GroupInviteV4.joinGroupViaInviteV4(inviteCode, String(inviteCodeExp), groupId, userWid);\n        }, inviteInfo);\n    }\n\n    /**\n     * Sets the current user&#x27;s status message\n     * @param {string} status New status message\n     */\n    async setStatus(status) {\n        await this.pupPage.evaluate(async status &#x3D;&gt; {\n            return await window.Store.StatusUtils.setMyStatus(status);\n        }, status);\n    }\n\n    /**\n     * Sets the current user&#x27;s display name. \n     * This is the name shown to WhatsApp users that have not added you as a contact beside your number in groups and in your profile.\n     * @param {string} displayName New display name\n     * @returns {Promise&amp;lt;Boolean&gt;}\n     */\n    async setDisplayName(displayName) {\n        const couldSet &#x3D; await this.pupPage.evaluate(async displayName &#x3D;&gt; {\n            if(!window.Store.Conn.canSetMyPushname()) return false;\n            await window.Store.Settings.setPushname(displayName);\n            return true;\n        }, displayName);\n\n        return couldSet;\n    }\n    \n    /**\n     * Gets the current connection state for the client\n     * @returns {WAState} \n     */\n    async getState() {\n        return await this.pupPage.evaluate(() &#x3D;&gt; {\n            if(!window.Store) return null;\n            return window.Store.AppState.state;\n        });\n    }\n\n    /**\n     * Marks the client as online\n     */\n    async sendPresenceAvailable() {\n        return await this.pupPage.evaluate(() &#x3D;&gt; {\n            return window.Store.PresenceUtils.sendPresenceAvailable();\n        });\n    }\n\n    /**\n     * Marks the client as unavailable\n     */\n    async sendPresenceUnavailable() {\n        return await this.pupPage.evaluate(() &#x3D;&gt; {\n            return window.Store.PresenceUtils.sendPresenceUnavailable();\n        });\n    }\n\n    /**\n     * Enables and returns the archive state of the Chat\n     * @returns {boolean}\n     */\n    async archiveChat(chatId) {\n        return await this.pupPage.evaluate(async chatId &#x3D;&gt; {\n            let chat &#x3D; await window.WWebJS.getChat(chatId, { getAsModel: false });\n            await window.Store.Cmd.archiveChat(chat, true);\n            return true;\n        }, chatId);\n    }\n\n    /**\n     * Changes and returns the archive state of the Chat\n     * @returns {boolean}\n     */\n    async unarchiveChat(chatId) {\n        return await this.pupPage.evaluate(async chatId &#x3D;&gt; {\n            let chat &#x3D; await window.WWebJS.getChat(chatId, { getAsModel: false });\n            await window.Store.Cmd.archiveChat(chat, false);\n            return false;\n        }, chatId);\n    }\n\n    /**\n     * Pins the Chat\n     * @returns {Promise&amp;lt;boolean&gt;} New pin state. Could be false if the max number of pinned chats was reached.\n     */\n    async pinChat(chatId) {\n        return this.pupPage.evaluate(async chatId &#x3D;&gt; {\n            let chat &#x3D; await window.WWebJS.getChat(chatId, { getAsModel: false });\n            if (chat.pin) {\n                return true;\n            }\n            const MAX_PIN_COUNT &#x3D; 3;\n            const chatModels &#x3D; window.Store.Chat.getModelsArray();\n            if (chatModels.length &gt; MAX_PIN_COUNT) {\n                let maxPinned &#x3D; chatModels[MAX_PIN_COUNT - 1].pin;\n                if (maxPinned) {\n                    return false;\n                }\n            }\n            await window.Store.Cmd.pinChat(chat, true);\n            return true;\n        }, chatId);\n    }\n\n    /**\n     * Unpins the Chat\n     * @returns {Promise&amp;lt;boolean&gt;} New pin state\n     */\n    async unpinChat(chatId) {\n        return this.pupPage.evaluate(async chatId &#x3D;&gt; {\n            let chat &#x3D; await window.WWebJS.getChat(chatId, { getAsModel: false });\n            if (!chat.pin) {\n                return false;\n            }\n            await window.Store.Cmd.pinChat(chat, false);\n            return false;\n        }, chatId);\n    }\n\n    /**\n     * Mutes this chat forever, unless a date is specified\n     * @param {string} chatId ID of the chat that will be muted\n     * @param {?Date} unmuteDate Date when the chat will be unmuted, don&#x27;t provide a value to mute forever\n     * @returns {Promise&amp;lt;{isMuted: boolean, muteExpiration: number}&gt;}\n     */\n    async muteChat(chatId, unmuteDate) {\n        unmuteDate &#x3D; unmuteDate ? Math.floor(unmuteDate.getTime() / 1000) : -1;\n        return this._muteUnmuteChat(chatId, &#x27;MUTE&#x27;, unmuteDate);\n    }\n\n    /**\n     * Unmutes the Chat\n     * @param {string} chatId ID of the chat that will be unmuted\n     * @returns {Promise&amp;lt;{isMuted: boolean, muteExpiration: number}&gt;}\n     */\n    async unmuteChat(chatId) {\n        return this._muteUnmuteChat(chatId, &#x27;UNMUTE&#x27;);\n    }\n\n    /**\n     * Internal method to mute or unmute the chat\n     * @param {string} chatId ID of the chat that will be muted/unmuted\n     * @param {string} action The action: &#x27;MUTE&#x27; or &#x27;UNMUTE&#x27;\n     * @param {number} unmuteDateTs Timestamp at which the chat will be unmuted\n     * @returns {Promise&amp;lt;{isMuted: boolean, muteExpiration: number}&gt;}\n     */\n    async _muteUnmuteChat (chatId, action, unmuteDateTs) {\n        return this.pupPage.evaluate(async (chatId, action, unmuteDateTs) &#x3D;&gt; {\n            const chat &#x3D; window.Store.Chat.get(chatId) ?? await window.Store.Chat.find(chatId);\n            action &#x3D;&#x3D;&#x3D; &#x27;MUTE&#x27;\n                ? await chat.mute.mute({ expiration: unmuteDateTs, sendDevice: true })\n                : await chat.mute.unmute({ sendDevice: true });\n            return { isMuted: chat.mute.expiration !&#x3D;&#x3D; 0, muteExpiration: chat.mute.expiration };\n        }, chatId, action, unmuteDateTs || -1);\n    }\n\n    /**\n     * Mark the Chat as unread\n     * @param {string} chatId ID of the chat that will be marked as unread\n     */\n    async markChatUnread(chatId) {\n        await this.pupPage.evaluate(async chatId &#x3D;&gt; {\n            let chat &#x3D; await window.WWebJS.getChat(chatId, { getAsModel: false });\n            await window.Store.Cmd.markChatUnread(chat, true);\n        }, chatId);\n    }\n\n    /**\n     * Returns the contact ID&#x27;s profile picture URL, if privacy settings allow it\n     * @param {string} contactId the whatsapp user&#x27;s ID\n     * @returns {Promise&amp;lt;string&gt;}\n     */\n    async getProfilePicUrl(contactId) {\n        const profilePic &#x3D; await this.pupPage.evaluate(async contactId &#x3D;&gt; {\n            try {\n                const chatWid &#x3D; window.Store.WidFactory.createWid(contactId);\n                return window.compareWwebVersions(window.Debug.VERSION, &#x27;&amp;lt;&#x27;, &#x27;2.3000.0&#x27;)\n                    ? await window.Store.ProfilePic.profilePicFind(chatWid)\n                    : await window.Store.ProfilePic.requestProfilePicFromServer(chatWid);\n            } catch (err) {\n                if(err.name &#x3D;&#x3D;&#x3D; &#x27;ServerStatusCodeError&#x27;) return undefined;\n                throw err;\n            }\n        }, contactId);\n        \n        return profilePic ? profilePic.eurl : undefined;\n    }\n\n    /**\n     * Gets the Contact&#x27;s common groups with you. Returns empty array if you don&#x27;t have any common group.\n     * @param {string} contactId the whatsapp user&#x27;s ID (_serialized format)\n     * @returns {Promise&amp;lt;WAWebJS.ChatId[]&gt;}\n     */\n    async getCommonGroups(contactId) {\n        const commonGroups &#x3D; await this.pupPage.evaluate(async (contactId) &#x3D;&gt; {\n            let contact &#x3D; window.Store.Contact.get(contactId);\n            if (!contact) {\n                const wid &#x3D; window.Store.WidFactory.createWid(contactId);\n                const chatConstructor &#x3D; window.Store.Contact.getModelsArray().find(c&#x3D;&gt;!c.isGroup).constructor;\n                contact &#x3D; new chatConstructor({id: wid});\n            }\n\n            if (contact.commonGroups) {\n                return contact.commonGroups.serialize();\n            }\n            const status &#x3D; await window.Store.findCommonGroups(contact);\n            if (status) {\n                return contact.commonGroups.serialize();\n            }\n            return [];\n        }, contactId);\n        const chats &#x3D; [];\n        for (const group of commonGroups) {\n            chats.push(group.id);\n        }\n        return chats;\n    }\n\n    /**\n     * Force reset of connection state for the client\n    */\n    async resetState() {\n        await this.pupPage.evaluate(() &#x3D;&gt; {\n            window.Store.AppState.reconnect(); \n        });\n    }\n\n    /**\n     * Check if a given ID is registered in whatsapp\n     * @param {string} id the whatsapp user&#x27;s ID\n     * @returns {Promise&amp;lt;Boolean&gt;}\n     */\n    async isRegisteredUser(id) {\n        return Boolean(await this.getNumberId(id));\n    }\n\n    /**\n     * Get the registered WhatsApp ID for a number. \n     * Will return null if the number is not registered on WhatsApp.\n     * @param {string} number Number or ID (&quot;@c.us&quot; will be automatically appended if not specified)\n     * @returns {Promise&amp;lt;Object|null&gt;}\n     */\n    async getNumberId(number) {\n        if (!number.endsWith(&#x27;@c.us&#x27;)) {\n            number +&#x3D; &#x27;@c.us&#x27;;\n        }\n\n        return await this.pupPage.evaluate(async number &#x3D;&gt; {\n            const wid &#x3D; window.Store.WidFactory.createWid(number);\n            const result &#x3D; await window.Store.QueryExist(wid);\n            if (!result || result.wid &#x3D;&#x3D;&#x3D; undefined) return null;\n            return result.wid;\n        }, number);\n    }\n\n    /**\n     * Get the formatted number of a WhatsApp ID.\n     * @param {string} number Number or ID\n     * @returns {Promise&amp;lt;string&gt;}\n     */\n    async getFormattedNumber(number) {\n        if (!number.endsWith(&#x27;@s.whatsapp.net&#x27;)) number &#x3D; number.replace(&#x27;c.us&#x27;, &#x27;s.whatsapp.net&#x27;);\n        if (!number.includes(&#x27;@s.whatsapp.net&#x27;)) number &#x3D; &#x60;${number}@s.whatsapp.net&#x60;;\n\n        return await this.pupPage.evaluate(async numberId &#x3D;&gt; {\n            return window.Store.NumberInfo.formattedPhoneNumber(numberId);\n        }, number);\n    }\n\n    /**\n     * Get the country code of a WhatsApp ID.\n     * @param {string} number Number or ID\n     * @returns {Promise&amp;lt;string&gt;}\n     */\n    async getCountryCode(number) {\n        number &#x3D; number.replace(&#x27; &#x27;, &#x27;&#x27;).replace(&#x27;+&#x27;, &#x27;&#x27;).replace(&#x27;@c.us&#x27;, &#x27;&#x27;);\n\n        return await this.pupPage.evaluate(async numberId &#x3D;&gt; {\n            return window.Store.NumberInfo.findCC(numberId);\n        }, number);\n    }\n\n    /**\n     * An object that represents the result for a participant added to a group\n     * @typedef {Object} ParticipantResult\n     * @property {number} statusCode The status code of the result\n     * @property {string} message The result message\n     * @property {boolean} isGroupCreator Indicates if the participant is a group creator\n     * @property {boolean} isInviteV4Sent Indicates if the inviteV4 was sent to the participant\n     */\n\n    /**\n     * An object that handles the result for {@link createGroup} method\n     * @typedef {Object} CreateGroupResult\n     * @property {string} title A group title\n     * @property {Object} gid An object that handles the newly created group ID\n     * @property {string} gid.server\n     * @property {string} gid.user\n     * @property {string} gid._serialized\n     * @property {Object.&amp;lt;string, ParticipantResult&gt;} participants An object that handles the result value for each added to the group participant\n     */\n\n    /**\n     * An object that handles options for group creation\n     * @typedef {Object} CreateGroupOptions\n     * @property {number} [messageTimer &#x3D; 0] The number of seconds for the messages to disappear in the group (0 by default, won&#x27;t take an effect if the group is been creating with myself only)\n     * @property {string|undefined} parentGroupId The ID of a parent community group to link the newly created group with (won&#x27;t take an effect if the group is been creating with myself only)\n     * @property {boolean} [autoSendInviteV4 &#x3D; true] If true, the inviteV4 will be sent to those participants who have restricted others from being automatically added to groups, otherwise the inviteV4 won&#x27;t be sent (true by default)\n     * @property {string} [comment &#x3D; &#x27;&#x27;] The comment to be added to an inviteV4 (empty string by default)\n     * @property {boolean} [memberAddMode &#x3D; false] If true, only admins can add members to the group (false by default)\n     * @property {boolean} [membershipApprovalMode &#x3D; false] If true, group admins will be required to approve anyone who wishes to join the group (false by default)\n     * @property {boolean} [isRestrict &#x3D; true] If true, only admins can change group group info (true by default)\n     * @property {boolean} [isAnnounce &#x3D; false] If true, only admins can send messages (false by default)\n     */\n\n    /**\n     * Creates a new group\n     * @param {string} title Group title\n     * @param {string|Contact|Array&amp;lt;Contact|string&gt;|undefined} participants A single Contact object or an ID as a string or an array of Contact objects or contact IDs to add to the group\n     * @param {CreateGroupOptions} options An object that handles options for group creation\n     * @returns {Promise&amp;lt;CreateGroupResult|string&gt;} Object with resulting data or an error message as a string\n     */\n    async createGroup(title, participants &#x3D; [], options &#x3D; {}) {\n        !Array.isArray(participants) &amp;amp;&amp;amp; (participants &#x3D; [participants]);\n        participants.map(p &#x3D;&gt; (p instanceof Contact) ? p.id._serialized : p);\n\n        return await this.pupPage.evaluate(async (title, participants, options) &#x3D;&gt; {\n            const {\n                messageTimer &#x3D; 0,\n                parentGroupId,\n                autoSendInviteV4 &#x3D; true,\n                comment &#x3D; &#x27;&#x27;,\n            } &#x3D; options;\n            const participantData &#x3D; {}, participantWids &#x3D; [], failedParticipants &#x3D; [];\n            let createGroupResult, parentGroupWid;\n\n            const addParticipantResultCodes &#x3D; {\n                default: &#x27;An unknown error occupied while adding a participant&#x27;,\n                200: &#x27;The participant was added successfully&#x27;,\n                403: &#x27;The participant can be added by sending private invitation only&#x27;,\n                404: &#x27;The phone number is not registered on WhatsApp&#x27;\n            };\n\n            for (const participant of participants) {\n                const pWid &#x3D; window.Store.WidFactory.createWid(participant);\n                if ((await window.Store.QueryExist(pWid))?.wid) {\n                    participantWids.push({ phoneNumber: pWid });\n                }\n                else failedParticipants.push(participant);\n            }\n\n            parentGroupId &amp;amp;&amp;amp; (parentGroupWid &#x3D; window.Store.WidFactory.createWid(parentGroupId));\n\n            try {\n                createGroupResult &#x3D; await window.Store.GroupUtils.createGroup(\n                    {\n                        &#x27;addressingModeOverride&#x27;: &#x27;lid&#x27;,\n                        &#x27;memberAddMode&#x27;: options.memberAddMode ?? false,\n                        &#x27;membershipApprovalMode&#x27;: options.membershipApprovalMode ?? false,\n                        &#x27;announce&#x27;: options.announce ?? false,\n                        &#x27;restrict&#x27;: options.isRestrict !&#x3D;&#x3D; undefined ? !options.isRestrict : false,\n                        &#x27;ephemeralDuration&#x27;: messageTimer,\n                        &#x27;parentGroupId&#x27;: parentGroupWid,\n                        &#x27;title&#x27;: title,\n                    },\n                    participantWids\n                );\n            } catch (err) {\n                return &#x27;CreateGroupError: An unknown error occupied while creating a group&#x27;;\n            }\n\n            for (const participant of createGroupResult.participants) {\n                let isInviteV4Sent &#x3D; false;\n                participant.wid.server &#x3D;&#x3D; &#x27;lid&#x27; &amp;amp;&amp;amp; (participant.wid &#x3D; window.Store.LidUtils.getPhoneNumber(participant.wid));\n                const participantId &#x3D; participant.wid._serialized;\n                const statusCode &#x3D; participant.error || 200;\n\n                if (autoSendInviteV4 &amp;amp;&amp;amp; statusCode &#x3D;&#x3D;&#x3D; 403) {\n                    window.Store.Contact.gadd(participant.wid, { silent: true });\n                    const addParticipantResult &#x3D; await window.Store.GroupInviteV4.sendGroupInviteMessage(\n                        window.Store.Chat.get(participant.wid) || await window.Store.Chat.find(participant.wid),\n                        createGroupResult.wid._serialized,\n                        createGroupResult.subject,\n                        participant.invite_code,\n                        participant.invite_code_exp,\n                        comment,\n                        await window.WWebJS.getProfilePicThumbToBase64(createGroupResult.wid)\n                    );\n                    isInviteV4Sent &#x3D; addParticipantResult.messageSendResult &#x3D;&#x3D;&#x3D; &#x27;OK&#x27;;\n                }\n\n                participantData[participantId] &#x3D; {\n                    statusCode: statusCode,\n                    message: addParticipantResultCodes[statusCode] || addParticipantResultCodes.default,\n                    isGroupCreator: participant.type &#x3D;&#x3D;&#x3D; &#x27;superadmin&#x27;,\n                    isInviteV4Sent: isInviteV4Sent\n                };\n            }\n\n            for (const f of failedParticipants) {\n                participantData[f] &#x3D; {\n                    statusCode: 404,\n                    message: addParticipantResultCodes[404],\n                    isGroupCreator: false,\n                    isInviteV4Sent: false\n                };\n            }\n\n            return { title: title, gid: createGroupResult.wid, participants: participantData };\n        }, title, participants, options);\n    }\n\n    /**\n     * An object that handles the result for {@link createChannel} method\n     * @typedef {Object} CreateChannelResult\n     * @property {string} title A channel title\n     * @property {ChatId} nid An object that handels the newly created channel ID\n     * @property {string} nid.server &#x27;newsletter&#x27;\n     * @property {string} nid.user &#x27;XXXXXXXXXX&#x27;\n     * @property {string} nid._serialized &#x27;XXXXXXXXXX@newsletter&#x27;\n     * @property {string} inviteLink The channel invite link, starts with &#x27;https://whatsapp.com/channel/&#x27;\n     * @property {number} createdAtTs The timestamp the channel was created at\n     */\n\n    /**\n     * Options for the channel creation\n     * @typedef {Object} CreateChannelOptions\n     * @property {?string} description The channel description\n     * @property {?MessageMedia} picture The channel profile picture\n     */\n\n    /**\n     * Creates a new channel\n     * @param {string} title The channel name\n     * @param {CreateChannelOptions} options \n     * @returns {Promise&amp;lt;CreateChannelResult|string&gt;} Returns an object that handles the result for the channel creation or an error message as a string\n     */\n    async createChannel(title, options &#x3D; {}) {\n        return await this.pupPage.evaluate(async (title, options) &#x3D;&gt; {\n            let response, { description &#x3D; null, picture &#x3D; null } &#x3D; options;\n\n            if (!window.Store.ChannelUtils.isNewsletterCreationEnabled()) {\n                return &#x27;CreateChannelError: A channel creation is not enabled&#x27;;\n            }\n\n            if (picture) {\n                picture &#x3D; await window.WWebJS.cropAndResizeImage(picture, {\n                    asDataUrl: true,\n                    mimetype: &#x27;image/jpeg&#x27;,\n                    size: 640,\n                    quality: 1\n                });\n            }\n\n            try {\n                response &#x3D; await window.Store.ChannelUtils.createNewsletterQuery({\n                    name: title,\n                    description: description,\n                    picture: picture,\n                });\n            } catch (err) {\n                if (err.name &#x3D;&#x3D;&#x3D; &#x27;ServerStatusCodeError&#x27;) {\n                    return &#x27;CreateChannelError: An error occupied while creating a channel&#x27;;\n                }\n                throw err;\n            }\n\n            return {\n                title: title,\n                nid: window.Store.JidToWid.newsletterJidToWid(response.idJid),\n                inviteLink: &#x60;https://whatsapp.com/channel/${response.newsletterInviteLinkMetadataMixin.inviteCode}&#x60;,\n                createdAtTs: response.newsletterCreationTimeMetadataMixin.creationTimeValue\n            };\n        }, title, options);\n    }\n\n    /**\n     * Subscribe to channel\n     * @param {string} channelId The channel ID\n     * @returns {Promise&amp;lt;boolean&gt;} Returns true if the operation completed successfully, false otherwise\n     */\n    async subscribeToChannel(channelId) {\n        return await this.pupPage.evaluate(async (channelId) &#x3D;&gt; {\n            return await window.WWebJS.subscribeToUnsubscribeFromChannel(channelId, &#x27;Subscribe&#x27;);\n        }, channelId);\n    }\n\n    /**\n     * Options for unsubscribe from a channel\n     * @typedef {Object} UnsubscribeOptions\n     * @property {boolean} [deleteLocalModels &#x3D; false] If true, after an unsubscription, it will completely remove a channel from the channel collection making it seem like the current user have never interacted with it. Otherwise it will only remove a channel from the list of channels the current user is subscribed to and will set the membership type for that channel to GUEST\n     */\n\n    /**\n     * Unsubscribe from channel\n     * @param {string} channelId The channel ID\n     * @param {UnsubscribeOptions} options\n     * @returns {Promise&amp;lt;boolean&gt;} Returns true if the operation completed successfully, false otherwise\n     */\n    async unsubscribeFromChannel(channelId, options) {\n        return await this.pupPage.evaluate(async (channelId, options) &#x3D;&gt; {\n            return await window.WWebJS.subscribeToUnsubscribeFromChannel(channelId, &#x27;Unsubscribe&#x27;, options);\n        }, channelId, options);\n    }\n\n    /**\n     * Options for transferring a channel ownership to another user\n     * @typedef {Object} TransferChannelOwnershipOptions\n     * @property {boolean} [shouldDismissSelfAsAdmin &#x3D; false] If true, after the channel ownership is being transferred to another user, the current user will be dismissed as a channel admin and will become to a channel subscriber.\n     */\n\n    /**\n     * Transfers a channel ownership to another user.\n     * Note: the user you are transferring the channel ownership to must be a channel admin.\n     * @param {string} channelId\n     * @param {string} newOwnerId\n     * @param {TransferChannelOwnershipOptions} options\n     * @returns {Promise&amp;lt;boolean&gt;} Returns true if the operation completed successfully, false otherwise\n     */\n    async transferChannelOwnership(channelId, newOwnerId, options &#x3D; {}) {\n        return await this.pupPage.evaluate(async (channelId, newOwnerId, options) &#x3D;&gt; {\n            const channel &#x3D; await window.WWebJS.getChat(channelId, { getAsModel: false });\n            const newOwner &#x3D; window.Store.Contact.get(newOwnerId) || (await window.Store.Contact.find(newOwnerId));\n            if (!channel.newsletterMetadata) {\n                await window.Store.NewsletterMetadataCollection.update(channel.id);\n            }\n\n            try {\n                await window.Store.ChannelUtils.changeNewsletterOwnerAction(channel, newOwner);\n\n                if (options.shouldDismissSelfAsAdmin) {\n                    const meContact &#x3D; window.Store.ContactCollection.getMeContact();\n                    meContact &amp;amp;&amp;amp; (await window.Store.ChannelUtils.demoteNewsletterAdminAction(channel, meContact));\n                }\n            } catch (error) {\n                return false;\n            }\n\n            return true;\n        }, channelId, newOwnerId, options);\n    }\n\n    /**\n     * Searches for channels based on search criteria, there are some notes:\n     * 1. The method finds only channels you are not subscribed to currently\n     * 2. If you have never been subscribed to a found channel\n     * or you have unsubscribed from it with {@link UnsubscribeOptions.deleteLocalModels} set to &#x27;true&#x27;,\n     * the lastMessage property of a found channel will be &#x27;null&#x27;\n     *\n     * @param {Object} searchOptions Search options\n     * @param {string} [searchOptions.searchText &#x3D; &#x27;&#x27;] Text to search\n     * @param {Array&amp;lt;string&gt;} [searchOptions.countryCodes &#x3D; [your local region]] Array of country codes in &#x27;ISO 3166-1 alpha-2&#x27; standart (@see https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) to search for channels created in these countries\n     * @param {boolean} [searchOptions.skipSubscribedNewsletters &#x3D; false] If true, channels that user is subscribed to won&#x27;t appear in found channels\n     * @param {number} [searchOptions.view &#x3D; 0] View type, makes sense only when the searchText is empty. Valid values to provide are:\n     * 0 for RECOMMENDED channels\n     * 1 for TRENDING channels\n     * 2 for POPULAR channels\n     * 3 for NEW channels\n     * @param {number} [searchOptions.limit &#x3D; 50] The limit of found channels to be appear in the returnig result\n     * @returns {Promise&amp;lt;Array&amp;lt;Channel&gt;&gt;} Returns an array of Channel objects or an empty array if no channels were found\n     */\n    async searchChannels(searchOptions &#x3D; {}) {\n        return await this.pupPage.evaluate(async ({\n            searchText &#x3D; &#x27;&#x27;,\n            countryCodes &#x3D; [window.Store.ChannelUtils.currentRegion],\n            skipSubscribedNewsletters &#x3D; false,\n            view &#x3D; 0,\n            limit &#x3D; 50\n        }) &#x3D;&gt; {\n            searchText &#x3D; searchText.trim();\n            const currentRegion &#x3D; window.Store.ChannelUtils.currentRegion;\n            if (![0, 1, 2, 3].includes(view)) view &#x3D; 0;\n\n            countryCodes &#x3D; countryCodes.length &#x3D;&#x3D;&#x3D; 1 &amp;amp;&amp;amp; countryCodes[0] &#x3D;&#x3D;&#x3D; currentRegion\n                ? countryCodes\n                : countryCodes.filter((code) &#x3D;&gt; Object.keys(window.Store.ChannelUtils.countryCodesIso).includes(code));\n\n            const viewTypeMapping &#x3D; {\n                0: &#x27;RECOMMENDED&#x27;,\n                1: &#x27;TRENDING&#x27;,\n                2: &#x27;POPULAR&#x27;,\n                3: &#x27;NEW&#x27;\n            };\n\n            searchOptions &#x3D; {\n                searchText: searchText,\n                countryCodes: countryCodes,\n                skipSubscribedNewsletters: skipSubscribedNewsletters,\n                view: viewTypeMapping[view],\n                categories: [],\n                cursorToken: &#x27;&#x27;\n            };\n            \n            const originalFunction &#x3D; window.Store.ChannelUtils.getNewsletterDirectoryPageSize;\n            limit !&#x3D;&#x3D; 50 &amp;amp;&amp;amp; (window.Store.ChannelUtils.getNewsletterDirectoryPageSize &#x3D; () &#x3D;&gt; limit);\n\n            const channels &#x3D; (await window.Store.ChannelUtils.fetchNewsletterDirectories(searchOptions)).newsletters;\n\n            limit !&#x3D;&#x3D; 50 &amp;amp;&amp;amp; (window.Store.ChannelUtils.getNewsletterDirectoryPageSize &#x3D; originalFunction);\n\n            return channels\n                ? await Promise.all(channels.map((channel) &#x3D;&gt; window.WWebJS.getChatModel(channel, { isChannel: true })))\n                : [];\n        }, searchOptions);\n    }\n\n    /**\n     * Deletes the channel you created\n     * @param {string} channelId The ID of a channel to delete\n     * @returns {Promise&amp;lt;boolean&gt;} Returns true if the operation completed successfully, false otherwise\n     */\n    async deleteChannel(channelId) {\n        return await this.client.pupPage.evaluate(async (channelId) &#x3D;&gt; {\n            const channel &#x3D; await window.WWebJS.getChat(channelId, { getAsModel: false });\n            if (!channel) return false;\n            try {\n                await window.Store.ChannelUtils.deleteNewsletterAction(channel);\n                return true;\n            } catch (err) {\n                if (err.name &#x3D;&#x3D;&#x3D; &#x27;ServerStatusCodeError&#x27;) return false;\n                throw err;\n            }\n        }, channelId);\n    }\n\n    /**\n     * Get all current Labels\n     * @returns {Promise&amp;lt;Array&amp;lt;Label&gt;&gt;}\n     */\n    async getLabels() {\n        const labels &#x3D; await this.pupPage.evaluate(async () &#x3D;&gt; {\n            return window.WWebJS.getLabels();\n        });\n\n        return labels.map(data &#x3D;&gt; new Label(this, data));\n    }\n\n    /**\n     * Get all current Broadcast\n     * @returns {Promise&amp;lt;Array&amp;lt;Broadcast&gt;&gt;}\n     */\n    async getBroadcasts() {\n        const broadcasts &#x3D; await this.pupPage.evaluate(async () &#x3D;&gt; {\n            return window.WWebJS.getAllStatuses();\n        });\n        return broadcasts.map(data &#x3D;&gt; new Broadcast(this, data));\n    }\n\n    /**\n     * Get broadcast instance by current user ID\n     * @param {string} contactId\n     * @returns {Promise&amp;lt;Broadcast&gt;}\n     */\n    async getBroadcastById(contactId) {\n        const broadcast &#x3D; await this.pupPage.evaluate(async (userId) &#x3D;&gt; {\n            let status;\n            try {\n                status &#x3D; window.Store.Status.get(userId);\n                if (!status) {\n                    status &#x3D; await window.Store.Status.find(userId);\n                }\n            } catch {\n                status &#x3D; null;\n            }\n\n            if (status) return window.WWebJS.getStatusModel(status);\n        }, contactId);\n        return new Broadcast(this, broadcast);\n    }\n\n    /**\n     * Revoke current own status messages\n     * @param {string} messageId\n     * @returns {Promise&amp;lt;void&gt;}\n     */\n    async revokeStatusMessage(messageId) {\n        return await this.pupPage.evaluate(async (msgId) &#x3D;&gt; {\n            const status &#x3D; window.Store.Status.getMyStatus();\n            if (!status) return;\n\n            const msg &#x3D;\n                window.Store.Msg.get(msgId) || (await window.Store.Msg.getMessagesById([msgId]))?.messages?.[0];\n            if (!msg) return;\n\n            if (!msg.id.fromMe || !msg.id.remote.isStatus())\n                throw &#x27;Invalid usage! Can only revoke the message its from own status broadcast&#x27;;\n\n            return await window.Store.StatusUtils.sendStatusRevokeMsgAction(status, msg);\n        }, messageId);\n    }\n\n    /**\n     * Get Label instance by ID\n     * @param {string} labelId\n     * @returns {Promise&amp;lt;Label&gt;}\n     */\n    async getLabelById(labelId) {\n        const label &#x3D; await this.pupPage.evaluate(async (labelId) &#x3D;&gt; {\n            return window.WWebJS.getLabel(labelId);\n        }, labelId);\n\n        return new Label(this, label);\n    }\n\n    /**\n     * Get all Labels assigned to a chat \n     * @param {string} chatId\n     * @returns {Promise&amp;lt;Array&amp;lt;Label&gt;&gt;}\n     */\n    async getChatLabels(chatId) {\n        const labels &#x3D; await this.pupPage.evaluate(async (chatId) &#x3D;&gt; {\n            return window.WWebJS.getChatLabels(chatId);\n        }, chatId);\n\n        return labels.map(data &#x3D;&gt; new Label(this, data));\n    }\n\n    /**\n     * Get all Chats for a specific Label\n     * @param {string} labelId\n     * @returns {Promise&amp;lt;Array&amp;lt;Chat&gt;&gt;}\n     */\n    async getChatsByLabelId(labelId) {\n        const chatIds &#x3D; await this.pupPage.evaluate(async (labelId) &#x3D;&gt; {\n            const label &#x3D; window.Store.Label.get(labelId);\n            const labelItems &#x3D; label.labelItemCollection.getModelsArray();\n            return labelItems.reduce((result, item) &#x3D;&gt; {\n                if (item.parentType &#x3D;&#x3D;&#x3D; &#x27;Chat&#x27;) {\n                    result.push(item.parentId);\n                }\n                return result;\n            }, []);\n        }, labelId);\n\n        return Promise.all(chatIds.map(id &#x3D;&gt; this.getChatById(id)));\n    }\n\n    /**\n     * Gets all blocked contacts by host account\n     * @returns {Promise&amp;lt;Array&amp;lt;Contact&gt;&gt;}\n     */\n    async getBlockedContacts() {\n        const blockedContacts &#x3D; await this.pupPage.evaluate(() &#x3D;&gt; {\n            let chatIds &#x3D; window.Store.Blocklist.getModelsArray().map(a &#x3D;&gt; a.id._serialized);\n            return Promise.all(chatIds.map(id &#x3D;&gt; window.WWebJS.getContact(id)));\n        });\n\n        return blockedContacts.map(contact &#x3D;&gt; ContactFactory.create(this.client, contact));\n    }\n\n    /**\n     * Sets the current user&#x27;s profile picture.\n     * @param {MessageMedia} media\n     * @returns {Promise&amp;lt;boolean&gt;} Returns true if the picture was properly updated.\n     */\n    async setProfilePicture(media) {\n        const success &#x3D; await this.pupPage.evaluate((chatid, media) &#x3D;&gt; {\n            return window.WWebJS.setPicture(chatid, media);\n        }, this.info.wid._serialized, media);\n\n        return success;\n    }\n\n    /**\n     * Deletes the current user&#x27;s profile picture.\n     * @returns {Promise&amp;lt;boolean&gt;} Returns true if the picture was properly deleted.\n     */\n    async deleteProfilePicture() {\n        const success &#x3D; await this.pupPage.evaluate((chatid) &#x3D;&gt; {\n            return window.WWebJS.deletePicture(chatid);\n        }, this.info.wid._serialized);\n\n        return success;\n    }\n    \n    /**\n     * Change labels in chats\n     * @param {Array&amp;lt;number|string&gt;} labelIds\n     * @param {Array&amp;lt;string&gt;} chatIds\n     * @returns {Promise&amp;lt;void&gt;}\n     */\n    async addOrRemoveLabels(labelIds, chatIds) {\n\n        return this.pupPage.evaluate(async (labelIds, chatIds) &#x3D;&gt; {\n            if ([&#x27;smba&#x27;, &#x27;smbi&#x27;].indexOf(window.Store.Conn.platform) &#x3D;&#x3D;&#x3D; -1) {\n                throw &#x27;[LT01] Only Whatsapp business&#x27;;\n            }\n            const labels &#x3D; window.WWebJS.getLabels().filter(e &#x3D;&gt; labelIds.find(l &#x3D;&gt; l &#x3D;&#x3D; e.id) !&#x3D;&#x3D; undefined);\n            const chats &#x3D; window.Store.Chat.filter(e &#x3D;&gt; chatIds.includes(e.id._serialized));\n\n            let actions &#x3D; labels.map(label &#x3D;&gt; ({id: label.id, type: &#x27;add&#x27;}));\n\n            chats.forEach(chat &#x3D;&gt; {\n                (chat.labels || []).forEach(n &#x3D;&gt; {\n                    if (!actions.find(e &#x3D;&gt; e.id &#x3D;&#x3D; n)) {\n                        actions.push({id: n, type: &#x27;remove&#x27;});\n                    }\n                });\n            });\n\n            return await window.Store.Label.addOrRemoveLabels(actions, chats);\n        }, labelIds, chatIds);\n    }\n\n    /**\n     * An object that handles the information about the group membership request\n     * @typedef {Object} GroupMembershipRequest\n     * @property {Object} id The wid of a user who requests to enter the group\n     * @property {Object} addedBy The wid of a user who created that request\n     * @property {Object|null} parentGroupId The wid of a community parent group to which the current group is linked\n     * @property {string} requestMethod The method used to create the request: NonAdminAdd/InviteLink/LinkedGroupJoin\n     * @property {number} t The timestamp the request was created at\n     */\n\n    /**\n     * Gets an array of membership requests\n     * @param {string} groupId The ID of a group to get membership requests for\n     * @returns {Promise&amp;lt;Array&amp;lt;GroupMembershipRequest&gt;&gt;} An array of membership requests\n     */\n    async getGroupMembershipRequests(groupId) {\n        return await this.pupPage.evaluate(async (groupId) &#x3D;&gt; {\n            const groupWid &#x3D; window.Store.WidFactory.createWid(groupId);\n            return await window.Store.MembershipRequestUtils.getMembershipApprovalRequests(groupWid);\n        }, groupId);\n    }\n\n    /**\n     * An object that handles the result for membership request action\n     * @typedef {Object} MembershipRequestActionResult\n     * @property {string} requesterId User ID whos membership request was approved/rejected\n     * @property {number|undefined} error An error code that occurred during the operation for the participant\n     * @property {string} message A message with a result of membership request action\n     */\n\n    /**\n     * An object that handles options for {@link approveGroupMembershipRequests} and {@link rejectGroupMembershipRequests} methods\n     * @typedef {Object} MembershipRequestActionOptions\n     * @property {Array&amp;lt;string&gt;|string|null} requesterIds User ID/s who requested to join the group, if no value is provided, the method will search for all membership requests for that group\n     * @property {Array&amp;lt;number&gt;|number|null} sleep The number of milliseconds to wait before performing an operation for the next requester. If it is an array, a random sleep time between the sleep[0] and sleep[1] values will be added (the difference must be &gt;&#x3D;100 ms, otherwise, a random sleep time between sleep[1] and sleep[1] + 100 will be added). If sleep is a number, a sleep time equal to its value will be added. By default, sleep is an array with a value of [250, 500]\n     */\n\n    /**\n     * Approves membership requests if any\n     * @param {string} groupId The group ID to get the membership request for\n     * @param {MembershipRequestActionOptions} options Options for performing a membership request action\n     * @returns {Promise&amp;lt;Array&amp;lt;MembershipRequestActionResult&gt;&gt;} Returns an array of requester IDs whose membership requests were approved and an error for each requester, if any occurred during the operation. If there are no requests, an empty array will be returned\n     */\n    async approveGroupMembershipRequests(groupId, options &#x3D; {}) {\n        return await this.pupPage.evaluate(async (groupId, options) &#x3D;&gt; {\n            const { requesterIds &#x3D; null, sleep &#x3D; [250, 500] } &#x3D; options;\n            return await window.WWebJS.membershipRequestAction(groupId, &#x27;Approve&#x27;, requesterIds, sleep);\n        }, groupId, options);\n    }\n\n    /**\n     * Rejects membership requests if any\n     * @param {string} groupId The group ID to get the membership request for\n     * @param {MembershipRequestActionOptions} options Options for performing a membership request action\n     * @returns {Promise&amp;lt;Array&amp;lt;MembershipRequestActionResult&gt;&gt;} Returns an array of requester IDs whose membership requests were rejected and an error for each requester, if any occurred during the operation. If there are no requests, an empty array will be returned\n     */\n    async rejectGroupMembershipRequests(groupId, options &#x3D; {}) {\n        return await this.pupPage.evaluate(async (groupId, options) &#x3D;&gt; {\n            const { requesterIds &#x3D; null, sleep &#x3D; [250, 500] } &#x3D; options;\n            return await window.WWebJS.membershipRequestAction(groupId, &#x27;Reject&#x27;, requesterIds, sleep);\n        }, groupId, options);\n    }\n\n\n    /**\n     * Setting  autoload download audio\n     * @param {boolean} flag true/false\n     */\n    async setAutoDownloadAudio(flag) {\n        await this.pupPage.evaluate(async flag &#x3D;&gt; {\n            const autoDownload &#x3D; window.Store.Settings.getAutoDownloadAudio();\n            if (autoDownload &#x3D;&#x3D;&#x3D; flag) {\n                return flag;\n            }\n            await window.Store.Settings.setAutoDownloadAudio(flag);\n            return flag;\n        }, flag);\n    }\n\n    /**\n     * Setting  autoload download documents\n     * @param {boolean} flag true/false\n     */\n    async setAutoDownloadDocuments(flag) {\n        await this.pupPage.evaluate(async flag &#x3D;&gt; {\n            const autoDownload &#x3D; window.Store.Settings.getAutoDownloadDocuments();\n            if (autoDownload &#x3D;&#x3D;&#x3D; flag) {\n                return flag;\n            }\n            await window.Store.Settings.setAutoDownloadDocuments(flag);\n            return flag;\n        }, flag);\n    }\n\n    /**\n     * Setting  autoload download photos\n     * @param {boolean} flag true/false\n     */\n    async setAutoDownloadPhotos(flag) {\n        await this.pupPage.evaluate(async flag &#x3D;&gt; {\n            const autoDownload &#x3D; window.Store.Settings.getAutoDownloadPhotos();\n            if (autoDownload &#x3D;&#x3D;&#x3D; flag) {\n                return flag;\n            }\n            await window.Store.Settings.setAutoDownloadPhotos(flag);\n            return flag;\n        }, flag);\n    }\n\n    /**\n     * Setting  autoload download videos\n     * @param {boolean} flag true/false\n     */\n    async setAutoDownloadVideos(flag) {\n        await this.pupPage.evaluate(async flag &#x3D;&gt; {\n            const autoDownload &#x3D; window.Store.Settings.getAutoDownloadVideos();\n            if (autoDownload &#x3D;&#x3D;&#x3D; flag) {\n                return flag;\n            }\n            await window.Store.Settings.setAutoDownloadVideos(flag);\n            return flag;\n        }, flag);\n    }\n\n    /**\n     * Setting background synchronization.\n     * NOTE: this action will take effect after you restart the client.\n     * @param {boolean} flag true/false\n     * @returns {Promise&amp;lt;boolean&gt;}\n     */\n    async setBackgroundSync(flag) {\n        return await this.pupPage.evaluate(async flag &#x3D;&gt; {\n            const backSync &#x3D; window.Store.Settings.getGlobalOfflineNotifications();\n            if (backSync &#x3D;&#x3D;&#x3D; flag) {\n                return flag;\n            }\n            await window.Store.Settings.setGlobalOfflineNotifications(flag);\n            return flag;\n        }, flag);\n    }\n    \n    /**\n     * Get user device count by ID\n     * Each WaWeb Connection counts as one device, and the phone (if exists) counts as one\n     * So for a non-enterprise user with one WaWeb connection it should return &quot;2&quot;\n     * @param {string} userId\n     * @returns {Promise&amp;lt;number&gt;}\n     */\n    async getContactDeviceCount(userId) {\n        return await this.pupPage.evaluate(async (userId) &#x3D;&gt; {\n            const devices &#x3D; await window.Store.DeviceList.getDeviceIds([window.Store.WidFactory.createWid(userId)]);\n            if (devices &amp;amp;&amp;amp; devices.length &amp;amp;&amp;amp; devices[0] !&#x3D; null &amp;amp;&amp;amp; typeof devices[0].devices &#x3D;&#x3D; &#x27;object&#x27;) {\n                return devices[0].devices.length;\n            }\n            return 0;\n        }, userId);\n    }\n\n    /**\n     * Sync chat history conversation\n     * @param {string} chatId\n     * @return {Promise&amp;lt;boolean&gt;} True if operation completed successfully, false otherwise.\n     */\n    async syncHistory(chatId) {\n        return await this.pupPage.evaluate(async (chatId) &#x3D;&gt; {\n            const chatWid &#x3D; window.Store.WidFactory.createWid(chatId);\n            const chat &#x3D; window.Store.Chat.get(chatWid) ?? (await window.Store.Chat.find(chatWid));\n            if (chat?.endOfHistoryTransferType &#x3D;&#x3D;&#x3D; 0) {\n                await window.Store.HistorySync.sendPeerDataOperationRequest(3, {\n                    chatId: chat.id\n                });\n                return true;\n            }\n            return false;\n        }, chatId);\n    }\n  \n    /**\n     * Generates a WhatsApp call link (video call or voice call)\n     * @param {Date} startTime The start time of the call\n     * @param {string} callType The type of a WhatsApp call link to generate, valid values are: &#x60;video&#x60; | &#x60;voice&#x60;\n     * @returns {Promise&amp;lt;string&gt;} The WhatsApp call link (https://call.whatsapp.com/video/XxXxXxXxXxXxXx) or an empty string if a generation failed.\n     */\n    async createCallLink(startTime, callType) {\n        if (![&#x27;video&#x27;, &#x27;voice&#x27;].includes(callType)) {\n            throw new class CreateCallLinkError extends Error {\n                constructor(m) { super(m); }\n            }(&#x27;Invalid \\&#x27;callType\\&#x27; parameter value is provided. Valid values are: \\&#x27;voice\\&#x27; | \\&#x27;video\\&#x27;.&#x27;);\n        }\n\n        startTime &#x3D; Math.floor(startTime.getTime() / 1000);\n        \n        return await this.pupPage.evaluate(async (startTimeTs, callType) &#x3D;&gt; {\n            const response &#x3D; await window.Store.ScheduledEventMsgUtils.createEventCallLink(startTimeTs, callType);\n            return response ?? &#x27;&#x27;;\n        }, startTime, callType);\n    }\n\n    /**\n     * Sends a response to the scheduled event message, indicating whether a user is going to attend the event or not\n     * @param {number} response The response code to the scheduled event message. Valid values are: &#x60;0&#x60; for NONE response (removes a previous response) | &#x60;1&#x60; for GOING | &#x60;2&#x60; for NOT GOING | &#x60;3&#x60; for MAYBE going\n     * @param {string} eventMessageId The scheduled event message ID\n     * @returns {Promise&amp;lt;boolean&gt;}\n     */\n    async sendResponseToScheduledEvent(response, eventMessageId) {\n        if (![0, 1, 2, 3].includes(response)) return false;\n\n        return await this.pupPage.evaluate(async (response, msgId) &#x3D;&gt; {\n            const eventMsg &#x3D; window.Store.Msg.get(msgId) || (await window.Store.Msg.getMessagesById([msgId]))?.messages?.[0];\n            if (!eventMsg) return false;\n\n            await window.Store.ScheduledEventMsgUtils.sendEventResponseMsg(response, eventMsg);\n            return true;\n        }, response, eventMessageId);\n    }\n  \n    /**\n     * Save new contact to user&#x27;s addressbook or edit the existing one\n     * @param {string} phoneNumber The contact&#x27;s phone number in a format &quot;17182222222&quot;, where &quot;1&quot; is a country code\n     * @param {string} firstName \n     * @param {string} lastName \n     * @param {boolean} [syncToAddressbook &#x3D; false] If set to true, the contact will also be saved to the user&#x27;s address book on their phone. False by default\n     * @returns {Promise&amp;lt;void&gt;}\n     */\n    async saveOrEditAddressbookContact(phoneNumber, firstName, lastName, syncToAddressbook &#x3D; false)\n    {\n        return await this.pupPage.evaluate(async (phoneNumber, firstName, lastName, syncToAddressbook) &#x3D;&gt; {\n            return await window.Store.AddressbookContactUtils.saveContactAction({\n                &#x27;firstName&#x27; : firstName,\n                &#x27;lastName&#x27; : lastName,\n                &#x27;phoneNumber&#x27; : phoneNumber,\n                &#x27;prevPhoneNumber&#x27; : phoneNumber,\n                &#x27;syncToAddressbook&#x27;: syncToAddressbook,\n                &#x27;username&#x27; : undefined\n            });\n        }, phoneNumber, firstName, lastName, syncToAddressbook);\n    }\n\n    /**\n     * Deletes the contact from user&#x27;s addressbook\n     * @param {string} phoneNumber The contact&#x27;s phone number in a format &quot;17182222222&quot;, where &quot;1&quot; is a country code\n     * @returns {Promise&amp;lt;void&gt;}\n     */\n    async deleteAddressbookContact(phoneNumber)\n    {\n        return await this.pupPage.evaluate(async (phoneNumber) &#x3D;&gt; {\n            const wid &#x3D; window.Store.WidFactory.createWid(phoneNumber);\n            return await window.Store.AddressbookContactUtils.deleteContactAction({phoneNumber: wid});\n        }, phoneNumber);\n    }\n\n    /**\n     * Get lid and phone number for multiple users\n     * @param {string[]} userIds - Array of user IDs\n     * @returns {Promise&amp;lt;Array&amp;lt;{ lid: string, pn: string }&gt;&gt;}\n     */\n    async getContactLidAndPhone(userIds) {\n        return await this.pupPage.evaluate(async (userIds) &#x3D;&gt; {\n            if (!Array.isArray(userIds)) userIds &#x3D; [userIds];\n\n            return await Promise.all(userIds.map(async (userId) &#x3D;&gt; {\n                const { lid, phone } &#x3D; await window.WWebJS.enforceLidAndPnRetrieval(userId);\n\n                return {\n                    lid: lid?._serialized,\n                    pn: phone?._serialized\n                };\n            }));\n        }, userIds);\n    }\n\n    /**\n     * Add or edit a customer note\n     * @see https://faq.whatsapp.com/1433099287594476\n     * @param {string} userId The ID of a customer to add a note to\n     * @param {string} note The note to add\n     * @returns {Promise&amp;lt;void&gt;}\n     */\n    async addOrEditCustomerNote(userId, note) {\n        return await this.pupPage.evaluate(async (userId, note) &#x3D;&gt; {\n            if (!window.Store.BusinessGatingUtils.smbNotesV1Enabled()) return;\n\n            return window.Store.CustomerNoteUtils.noteAddAction(\n                &#x27;unstructured&#x27;,\n                window.Store.WidToJid.widToUserJid(window.Store.WidFactory.createWid(userId)),\n                note\n            );\n        }, userId, note);\n    }\n\n    /**\n     * Get a customer note\n     * @see https://faq.whatsapp.com/1433099287594476\n     * @param {string} userId The ID of a customer to get a note from\n     * @returns {Promise&amp;lt;{\n     *    chatId: string,\n     *    content: string,\n     *    createdAt: number,\n     *    id: string,\n     *    modifiedAt: number,\n     *    type: string\n     * }&gt;}\n     */\n    async getCustomerNote(userId) {\n        return await this.pupPage.evaluate(async (userId) &#x3D;&gt; {\n            if (!window.Store.BusinessGatingUtils.smbNotesV1Enabled()) return null;\n\n            const note &#x3D; await window.Store.CustomerNoteUtils.retrieveOnlyNoteForChatJid(\n                window.Store.WidToJid.widToUserJid(window.Store.WidFactory.createWid(userId))\n            );\n\n            let serialized &#x3D; note?.serialize();\n\n            if (!serialized) return null;\n\n            serialized.chatId &#x3D; window.Store.JidToWid.userJidToUserWid(serialized.chatJid)._serialized;\n            delete serialized.chatJid;\n\n            return serialized;\n        }, userId);\n    }\n    \n    /**\n     * Get Poll Votes\n     * @param {string} messageId\n     * @return {Promise&amp;lt;Array&amp;lt;PollVote&gt;&gt;} \n     */\n    async getPollVotes(messageId) {\n        const msg &#x3D; await this.getMessageById(messageId);\n        if (!msg) return [];\n        if (msg.type !&#x3D; MessageTypes.POLL_CREATION) throw &#x27;Invalid usage! Can only be used with a pollCreation message&#x27;;\n\n        const pollVotes &#x3D; await this.pupPage.evaluate( async (msg) &#x3D;&gt; {\n            const msgKey &#x3D; window.Store.MsgKey.fromString(msg.id._serialized);\n            let pollVotes &#x3D; await window.Store.PollsVotesSchema.getTable().equals([&#x27;parentMsgKey&#x27;], msgKey.toString());\n            \n            return pollVotes.map(item &#x3D;&gt; {\n                const typedArray &#x3D; new Uint8Array(item.selectedOptionLocalIds);\n                return {\n                    ...item,\n                    selectedOptionLocalIds: Array.from(typedArray)\n                };\n            });\n        }, msg);\n\n        return pollVotes.map((pollVote) &#x3D;&gt; new PollVote(this.client, {...pollVote, parentMessage: msg}));\n    }\n}\n\nmodule.exports &#x3D; Client;\n</code></pre>\n          </article>\n        </div>\n      </div>\n      <nav id=\"jsdoc-toc-nav\" role=\"navigation\"></nav>\n    </div>\n  </div>\n  <footer id=\"jsdoc-footer\" class=\"jsdoc-footer\">\n    <div id=\"jsdoc-footer-container\">\n      <p>\n        Generated by <a href=\"https://github.com/jsdoc3/jsdoc\">JSDoc</a> 3.6.11 on January 30, 2026.\n      </p>\n    </div>\n  </footer>\n  <script src=\"scripts/jquery.min.js\"></script>\n  <script src=\"scripts/tree.jquery.js\"></script>\n  <script src=\"scripts/prettify.js\"></script>\n  <script src=\"scripts/jsdoc-toc.js\"></script>\n  <script src=\"scripts/linenumber.js\"></script>\n  <script src=\"scripts/scrollanchor.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "docs/ClientInfo.html",
    "content": "<!doctype html>\n<html>\n\n<head>\n  <meta name=\"generator\" content=\"JSDoc 3.6.11\">\n  <meta charset=\"utf-8\">\n  <title>whatsapp-web.js 1.34.6 &raquo; Class: ClientInfo</title>\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Karla:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Noto+Serif:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Inconsolata:500\" type=\"text/css\">\n  <link href=\"css/baseline.css\" rel=\"stylesheet\">\n</head>\n\n<body onload=\"prettyPrint()\">\n  <nav id=\"jsdoc-navbar\" role=\"navigation\" class=\"jsdoc-navbar\">\n    <div id=\"jsdoc-navbar-container\">\n      <div id=\"jsdoc-navbar-content\">\n        <a href=\"index.html\" class=\"jsdoc-navbar-package-name\">whatsapp-web.<wbr>js 1.<wbr>34.<wbr>6</a>\n      </div>\n    </div>\n  </nav>\n  <div id=\"jsdoc-body-container\">\n    <div id=\"jsdoc-content\">\n      <div id=\"jsdoc-content-container\">\n        <div id=\"jsdoc-main\" role=\"main\">\n          <header class=\"page-header\">\n            <div class=\"symbol-detail-labels\"><span class=\"label label-kind\">class</span></div>\n            <h1><small></small><span class=\"symbol-name\">ClientInfo</span></h1>\n            <p class=\"source-link\">Source: <a href=\"structures_ClientInfo.js.html#source-line-9\">structures/<wbr>ClientInfo.<wbr>js:9</a></p>\n            <div class=\"symbol-classdesc\">\n              <p>Current connection information</p>\n            </div>\n            <dl class=\"dl-compact\">\n            </dl>\n          </header>\n          <section id=\"summary\">\n            <div class=\"summary-callout\">\n              <h2 class=\"summary-callout-heading\">Properties</h2>\n              <div class=\"summary-content\">\n                <div class=\"summary-column\">\n                  <dl class=\"dl-summary-callout\">\n                    <dt><a href=\"ClientInfo.html#me\">me</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"ClientInfo.html#phone\">phone</a></dt>\n                    <dd>\n                    </dd>\n                  </dl>\n                </div>\n                <div class=\"summary-column\">\n                  <dl class=\"dl-summary-callout\">\n                    <dt><a href=\"ClientInfo.html#platform\">platform</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"ClientInfo.html#pushname\">pushname</a></dt>\n                    <dd>\n                    </dd>\n                  </dl>\n                </div>\n                <div class=\"summary-column\">\n                  <dl class=\"dl-summary-callout\">\n                    <dt><a href=\"ClientInfo.html#wid\">wid</a></dt>\n                    <dd>\n                    </dd>\n                  </dl>\n                </div>\n              </div>\n            </div>\n            <div class=\"summary-callout\">\n              <h2 class=\"summary-callout-heading\">Method</h2>\n              <div class=\"summary-content\">\n                <div class=\"summary-column\">\n                  <dl class=\"dl-summary-callout\">\n                    <dt><a href=\"ClientInfo.html#getBatteryStatus\">getBatteryStatus()</a></dt>\n                    <dd>\n                    </dd>\n                  </dl>\n                </div>\n                <div class=\"summary-column\">\n                </div>\n                <div class=\"summary-column\">\n                </div>\n              </div>\n            </div>\n          </section>\n          <section>\n            <h2 id=\"ClientInfo\">new&nbsp;<span class=\"symbol-name\">ClientInfo</span><span class=\"signature\"><span class=\"signature-params\">()</span></span></h2>\n            <dl class=\"dl-compact\">\n              <dt>Extends</dt>\n              <dd><a href=\"Base.html\">Base</a></dd>\n            </dl>\n          </section>\n          <section>\n            <h2>Properties</h2>\n            <section>\n              <h3 id=\"me\"><span class=\"symbol-name\">me</span><small class=\"property-type\">\n                  &nbsp;object</small></h3>\n              <dl class=\"dl-compact\">\n                <dt>Deprecated</dt>\n                <dd>Use .wid instead</dd>\n              </dl>\n              <h3 id=\"phone\"><span class=\"symbol-name\">phone</span><small class=\"property-type\">\n                  &nbsp;object</small></h3>\n              <p>Information about the phone this client is connected to. Not available in multi-device.</p>\n              <section>\n                <h4>Properties</h4>\n                <table class=\"jsdoc-details-table\">\n                  <thead>\n                    <tr>\n                      <th>Name</th>\n                      <th>Type</th>\n                      <th>Optional</th>\n                      <th>Description</th>\n                    </tr>\n                  </thead>\n                  <tbody>\n                    <tr>\n                      <td>\n                        <p>wa_version</p>\n                      </td>\n                      <td>\n                        <p>string</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>WhatsApp Version running on the phone</p>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>os_version</p>\n                      </td>\n                      <td>\n                        <p>string</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>OS Version running on the phone (iOS or Android version)</p>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>device_manufacturer</p>\n                      </td>\n                      <td>\n                        <p>string</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>Device manufacturer</p>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>device_model</p>\n                      </td>\n                      <td>\n                        <p>string</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>Device model</p>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>os_build_number</p>\n                      </td>\n                      <td>\n                        <p>string</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>OS build number</p>\n                      </td>\n                    </tr>\n                  </tbody>\n                </table>\n              </section>\n              <dl class=\"dl-compact\">\n                <dt>Deprecated</dt>\n                <dd></dd>\n              </dl>\n              <h3 id=\"platform\"><span class=\"symbol-name\">platform</span><small class=\"property-type\">\n                  &nbsp;string</small></h3>\n              <p>Platform WhatsApp is running on</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"pushname\"><span class=\"symbol-name\">pushname</span><small class=\"property-type\">\n                  &nbsp;string</small></h3>\n              <p>Name configured to be shown in push notifications</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"wid\"><span class=\"symbol-name\">wid</span><small class=\"property-type\">\n                  &nbsp;object</small></h3>\n              <p>Current user ID</p>\n              <dl class=\"dl-compact\">\n              </dl>\n            </section>\n            <h2>Method</h2>\n            <section>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"getBatteryStatus\"><span class=\"symbol-name\">getBatteryStatus</span><span class=\"signature\"><span class=\"signature-params\">()</span>&nbsp;&rarr; <span class=\"signature-returns\"> (object, number, or boolean)</span></span></h3>\n              <p>Get current battery percentage and charging status for the attached device</p>\n              <dl class=\"dl-compact\">\n                <dt>Deprecated</dt>\n                <dd></dd>\n                <dt>Returns</dt>\n                <dd>\n                  <p><code>object</code> \n                  <p>batteryStatus</p>\n                  </p>\n                </dd>\n                <dd>\n                  <p><code>number</code> \n                  <p>batteryStatus.battery - The current battery percentage</p>\n                  </p>\n                </dd>\n                <dd>\n                  <p><code>boolean</code> \n                  <p>batteryStatus.plugged - Indicates if the phone is plugged in (true) or not (false)</p>\n                  </p>\n                </dd>\n              </dl>\n            </section>\n          </section>\n        </div>\n      </div>\n      <nav id=\"jsdoc-toc-nav\" role=\"navigation\"></nav>\n    </div>\n  </div>\n  <footer id=\"jsdoc-footer\" class=\"jsdoc-footer\">\n    <div id=\"jsdoc-footer-container\">\n      <p>\n        Generated by <a href=\"https://github.com/jsdoc3/jsdoc\">JSDoc</a> 3.6.11 on January 30, 2026.\n      </p>\n    </div>\n  </footer>\n  <script src=\"scripts/jquery.min.js\"></script>\n  <script src=\"scripts/tree.jquery.js\"></script>\n  <script src=\"scripts/prettify.js\"></script>\n  <script src=\"scripts/jsdoc-toc.js\"></script>\n  <script src=\"scripts/linenumber.js\"></script>\n  <script src=\"scripts/scrollanchor.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "docs/Contact.html",
    "content": "<!doctype html>\n<html>\n\n<head>\n  <meta name=\"generator\" content=\"JSDoc 3.6.11\">\n  <meta charset=\"utf-8\">\n  <title>whatsapp-web.js 1.34.6 &raquo; Class: Contact</title>\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Karla:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Noto+Serif:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Inconsolata:500\" type=\"text/css\">\n  <link href=\"css/baseline.css\" rel=\"stylesheet\">\n</head>\n\n<body onload=\"prettyPrint()\">\n  <nav id=\"jsdoc-navbar\" role=\"navigation\" class=\"jsdoc-navbar\">\n    <div id=\"jsdoc-navbar-container\">\n      <div id=\"jsdoc-navbar-content\">\n        <a href=\"index.html\" class=\"jsdoc-navbar-package-name\">whatsapp-web.<wbr>js 1.<wbr>34.<wbr>6</a>\n      </div>\n    </div>\n  </nav>\n  <div id=\"jsdoc-body-container\">\n    <div id=\"jsdoc-content\">\n      <div id=\"jsdoc-content-container\">\n        <div id=\"jsdoc-main\" role=\"main\">\n          <header class=\"page-header\">\n            <div class=\"symbol-detail-labels\"><span class=\"label label-kind\">class</span></div>\n            <h1><small></small><span class=\"symbol-name\">Contact</span></h1>\n            <p class=\"source-link\">Source: <a href=\"structures_Contact.js.html#source-line-17\">structures/<wbr>Contact.<wbr>js:17</a></p>\n            <div class=\"symbol-classdesc\">\n              <p>Represents a Contact on WhatsApp</p>\n            </div>\n            <dl class=\"dl-compact\">\n            </dl>\n          </header>\n          <section id=\"summary\">\n            <div class=\"summary-callout\">\n              <h2 class=\"summary-callout-heading\">Properties</h2>\n              <div class=\"summary-content\">\n                <div class=\"summary-column\">\n                  <dl class=\"dl-summary-callout\">\n                    <dt><a href=\"Contact.html#id\">id</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Contact.html#isBlocked\">isBlocked</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Contact.html#isBusiness\">isBusiness</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Contact.html#isEnterprise\">isEnterprise</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Contact.html#isGroup\">isGroup</a></dt>\n                    <dd>\n                    </dd>\n                  </dl>\n                </div>\n                <div class=\"summary-column\">\n                  <dl class=\"dl-summary-callout\">\n                    <dt><a href=\"Contact.html#isMe\">isMe</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Contact.html#isMyContact\">isMyContact</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Contact.html#isUser\">isUser</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Contact.html#isWAContact\">isWAContact</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Contact.html#name\">name</a></dt>\n                    <dd>\n                    </dd>\n                  </dl>\n                </div>\n                <div class=\"summary-column\">\n                  <dl class=\"dl-summary-callout\">\n                    <dt><a href=\"Contact.html#number\">number</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Contact.html#pushname\">pushname</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Contact.html#shortName\">shortName</a></dt>\n                    <dd>\n                    </dd>\n                  </dl>\n                </div>\n              </div>\n            </div>\n            <div class=\"summary-callout\">\n              <h2 class=\"summary-callout-heading\">Methods</h2>\n              <div class=\"summary-content\">\n                <div class=\"summary-column\">\n                  <dl class=\"dl-summary-callout\">\n                    <dt><a href=\"Contact.html#block\">block()</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Contact.html#getAbout\">getAbout()</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Contact.html#getBroadcast\">getBroadcast()</a></dt>\n                    <dd>\n                    </dd>\n                  </dl>\n                </div>\n                <div class=\"summary-column\">\n                  <dl class=\"dl-summary-callout\">\n                    <dt><a href=\"Contact.html#getChat\">getChat()</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Contact.html#getCommonGroups\">getCommonGroups()</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Contact.html#getCountryCode\">getCountryCode()</a></dt>\n                    <dd>\n                    </dd>\n                  </dl>\n                </div>\n                <div class=\"summary-column\">\n                  <dl class=\"dl-summary-callout\">\n                    <dt><a href=\"Contact.html#getFormattedNumber\">getFormattedNumber()</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Contact.html#getProfilePicUrl\">getProfilePicUrl()</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Contact.html#unblock\">unblock()</a></dt>\n                    <dd>\n                    </dd>\n                  </dl>\n                </div>\n              </div>\n            </div>\n          </section>\n          <section>\n            <h2 id=\"Contact\">new&nbsp;<span class=\"symbol-name\">Contact</span><span class=\"signature\"><span class=\"signature-params\">()</span></span></h2>\n            <dl class=\"dl-compact\">\n              <dt>Extends</dt>\n              <dd><a href=\"Base.html\">Base</a></dd>\n            </dl>\n          </section>\n          <section>\n            <h2>Properties</h2>\n            <section>\n              <h3 id=\"id\"><span class=\"symbol-name\">id</span><small class=\"property-type\">\n                  &nbsp;<a href=\"global.html#ContactId\">ContactId</a></small></h3>\n              <p>ID that represents the contact</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"isBlocked\"><span class=\"symbol-name\">isBlocked</span><small class=\"property-type\">\n                  &nbsp;boolean</small></h3>\n              <p>Indicates if you have blocked this contact</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"isBusiness\"><span class=\"symbol-name\">isBusiness</span><small class=\"property-type\">\n                  &nbsp;boolean</small></h3>\n              <p>Indicates if the contact is a business contact</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"isEnterprise\"><span class=\"symbol-name\">isEnterprise</span><small class=\"property-type\">\n                  &nbsp;boolean</small></h3>\n              <p>Indicates if the contact is an enterprise contact</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"isGroup\"><span class=\"symbol-name\">isGroup</span><small class=\"property-type\">\n                  &nbsp;boolean</small></h3>\n              <p>Indicates if the contact is a group contact</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"isMe\"><span class=\"symbol-name\">isMe</span><small class=\"property-type\">\n                  &nbsp;boolean</small></h3>\n              <p>Indicates if the contact is the current user's contact</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"isMyContact\"><span class=\"symbol-name\">isMyContact</span><small class=\"property-type\">\n                  &nbsp;boolean</small></h3>\n              <p>Indicates if the number is saved in the current phone's contacts</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"isUser\"><span class=\"symbol-name\">isUser</span><small class=\"property-type\">\n                  &nbsp;boolean</small></h3>\n              <p>Indicates if the contact is a user contact</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"isWAContact\"><span class=\"symbol-name\">isWAContact</span><small class=\"property-type\">\n                  &nbsp;boolean</small></h3>\n              <p>Indicates if the number is registered on WhatsApp</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"name\"><span class=\"symbol-name\">name</span><small class=\"property-type\">\n                  &nbsp;nullable string</small></h3>\n              <p>The contact's name, as saved by the current user</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"number\"><span class=\"symbol-name\">number</span><small class=\"property-type\">\n                  &nbsp;string</small></h3>\n              <p>Contact's phone number</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"pushname\"><span class=\"symbol-name\">pushname</span><small class=\"property-type\">\n                  &nbsp;string</small></h3>\n              <p>The name that the contact has configured to be shown publically</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"shortName\"><span class=\"symbol-name\">shortName</span><small class=\"property-type\">\n                  &nbsp;nullable string</small></h3>\n              <p>A shortened version of name</p>\n              <dl class=\"dl-compact\">\n              </dl>\n            </section>\n            <h2>Methods</h2>\n            <section>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"block\"><span class=\"symbol-name\">block</span><span class=\"signature\"><span class=\"signature-params\">()</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing boolean</span></span></h3>\n              <p>Blocks this contact from WhatsApp</p>\n              <dl class=\"dl-compact\">\n                <dt>Returns</dt>\n                <dd>\n                  <p><code>Promise containing boolean</code> </p>\n                </dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"getAbout\"><span class=\"symbol-name\">getAbout</span><span class=\"signature\"><span class=\"signature-params\">()</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing nullable string</span></span></h3>\n              <p>Gets the Contact's current &quot;about&quot; info. Returns null if you don't have permission to read their status.</p>\n              <dl class=\"dl-compact\">\n                <dt>Returns</dt>\n                <dd>\n                  <p><code>Promise containing nullable string</code> </p>\n                </dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"getBroadcast\"><span class=\"symbol-name\">getBroadcast</span><span class=\"signature\"><span class=\"signature-params\">()</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing <a href=\"Broadcast.html\">Broadcast</a></span></span></h3>\n              <p>Gets the Contact's current status broadcast.</p>\n              <dl class=\"dl-compact\">\n                <dt>Returns</dt>\n                <dd>\n                  <p><code>Promise containing <a href=\"Broadcast.html\">Broadcast</a></code> </p>\n                </dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"getChat\"><span class=\"symbol-name\">getChat</span><span class=\"signature\"><span class=\"signature-params\">()</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing <a href=\"Chat.html\">Chat</a></span></span></h3>\n              <p>Returns the Chat that corresponds to this Contact.\n                Will return null when getting chat for currently logged in user.</p>\n              <dl class=\"dl-compact\">\n                <dt>Returns</dt>\n                <dd>\n                  <p><code>Promise containing <a href=\"Chat.html\">Chat</a></code> </p>\n                </dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"getCommonGroups\"><span class=\"symbol-name\">getCommonGroups</span><span class=\"signature\"><span class=\"signature-params\">()</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing Array of WAWebJS.ChatId</span></span></h3>\n              <p>Gets the Contact's common groups with you. Returns empty array if you don't have any common group.</p>\n              <dl class=\"dl-compact\">\n                <dt>Returns</dt>\n                <dd>\n                  <p><code>Promise containing Array of WAWebJS.ChatId</code> </p>\n                </dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"getCountryCode\"><span class=\"symbol-name\">getCountryCode</span><span class=\"signature\"><span class=\"signature-params\">()</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing string</span></span></h3>\n              <p>Returns the contact's countrycode, (1541859685@c.us) =&gt; (1)</p>\n              <dl class=\"dl-compact\">\n                <dt>Returns</dt>\n                <dd>\n                  <p><code>Promise containing string</code> </p>\n                </dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"getFormattedNumber\"><span class=\"symbol-name\">getFormattedNumber</span><span class=\"signature\"><span class=\"signature-params\">()</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing string</span></span></h3>\n              <p>Returns the contact's formatted phone number, (12345678901@c.us) =&gt; (+1 (234) 5678-901)</p>\n              <dl class=\"dl-compact\">\n                <dt>Returns</dt>\n                <dd>\n                  <p><code>Promise containing string</code> </p>\n                </dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"getProfilePicUrl\"><span class=\"symbol-name\">getProfilePicUrl</span><span class=\"signature\"><span class=\"signature-params\">()</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing string</span></span></h3>\n              <p>Returns the contact's profile picture URL, if privacy settings allow it</p>\n              <dl class=\"dl-compact\">\n                <dt>Returns</dt>\n                <dd>\n                  <p><code>Promise containing string</code> </p>\n                </dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"unblock\"><span class=\"symbol-name\">unblock</span><span class=\"signature\"><span class=\"signature-params\">()</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing boolean</span></span></h3>\n              <p>Unblocks this contact from WhatsApp</p>\n              <dl class=\"dl-compact\">\n                <dt>Returns</dt>\n                <dd>\n                  <p><code>Promise containing boolean</code> </p>\n                </dd>\n              </dl>\n            </section>\n          </section>\n        </div>\n      </div>\n      <nav id=\"jsdoc-toc-nav\" role=\"navigation\"></nav>\n    </div>\n  </div>\n  <footer id=\"jsdoc-footer\" class=\"jsdoc-footer\">\n    <div id=\"jsdoc-footer-container\">\n      <p>\n        Generated by <a href=\"https://github.com/jsdoc3/jsdoc\">JSDoc</a> 3.6.11 on January 30, 2026.\n      </p>\n    </div>\n  </footer>\n  <script src=\"scripts/jquery.min.js\"></script>\n  <script src=\"scripts/tree.jquery.js\"></script>\n  <script src=\"scripts/prettify.js\"></script>\n  <script src=\"scripts/jsdoc-toc.js\"></script>\n  <script src=\"scripts/linenumber.js\"></script>\n  <script src=\"scripts/scrollanchor.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "docs/GroupChat.html",
    "content": "<!doctype html>\n<html>\n\n<head>\n  <meta name=\"generator\" content=\"JSDoc 3.6.11\">\n  <meta charset=\"utf-8\">\n  <title>whatsapp-web.js 1.34.6 &raquo; Class: GroupChat</title>\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Karla:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Noto+Serif:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Inconsolata:500\" type=\"text/css\">\n  <link href=\"css/baseline.css\" rel=\"stylesheet\">\n</head>\n\n<body onload=\"prettyPrint()\">\n  <nav id=\"jsdoc-navbar\" role=\"navigation\" class=\"jsdoc-navbar\">\n    <div id=\"jsdoc-navbar-container\">\n      <div id=\"jsdoc-navbar-content\">\n        <a href=\"index.html\" class=\"jsdoc-navbar-package-name\">whatsapp-web.<wbr>js 1.<wbr>34.<wbr>6</a>\n      </div>\n    </div>\n  </nav>\n  <div id=\"jsdoc-body-container\">\n    <div id=\"jsdoc-content\">\n      <div id=\"jsdoc-content-container\">\n        <div id=\"jsdoc-main\" role=\"main\">\n          <header class=\"page-header\">\n            <div class=\"symbol-detail-labels\"><span class=\"label label-kind\">class</span></div>\n            <h1><small></small><span class=\"symbol-name\">GroupChat</span></h1>\n            <p class=\"source-link\">Source: <a href=\"structures_GroupChat.js.html#source-line-17\">structures/<wbr>GroupChat.<wbr>js:17</a></p>\n            <div class=\"symbol-classdesc\">\n              <p>Represents a Group Chat on WhatsApp</p>\n            </div>\n            <dl class=\"dl-compact\">\n            </dl>\n          </header>\n          <section id=\"summary\">\n            <div class=\"summary-callout\">\n              <h2 class=\"summary-callout-heading\">Properties</h2>\n              <div class=\"summary-content\">\n                <div class=\"summary-column\">\n                  <dl class=\"dl-summary-callout\">\n                    <dt><a href=\"GroupChat.html#archived\">archived</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"GroupChat.html#createdAt\">createdAt</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"GroupChat.html#description\">description</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"GroupChat.html#id\">id</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"GroupChat.html#isGroup\">isGroup</a></dt>\n                    <dd>\n                    </dd>\n                  </dl>\n                </div>\n                <div class=\"summary-column\">\n                  <dl class=\"dl-summary-callout\">\n                    <dt><a href=\"GroupChat.html#isMuted\">isMuted</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"GroupChat.html#isReadOnly\">isReadOnly</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"GroupChat.html#lastMessage\">lastMessage</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"GroupChat.html#muteExpiration\">muteExpiration</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"GroupChat.html#name\">name</a></dt>\n                    <dd>\n                    </dd>\n                  </dl>\n                </div>\n                <div class=\"summary-column\">\n                  <dl class=\"dl-summary-callout\">\n                    <dt><a href=\"GroupChat.html#owner\">owner</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"GroupChat.html#participants\">participants</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"GroupChat.html#pinned\">pinned</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"GroupChat.html#timestamp\">timestamp</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"GroupChat.html#unreadCount\">unreadCount</a></dt>\n                    <dd>\n                    </dd>\n                  </dl>\n                </div>\n              </div>\n            </div>\n            <div class=\"summary-callout\">\n              <h2 class=\"summary-callout-heading\">Methods</h2>\n              <div class=\"summary-content\">\n                <div class=\"summary-column\">\n                  <dl class=\"dl-summary-callout\">\n                    <dt><a href=\"GroupChat.html#addOrEditCustomerNote\">addOrEditCustomerNote(note)</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"GroupChat.html#addParticipants\">addParticipants(participantIds, options)</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"GroupChat.html#approveGroupMembershipRequests\">approveGroupMembershipRequests(options)</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"GroupChat.html#archive\">archive()</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"GroupChat.html#changeLabels\">changeLabels(labelIds)</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"GroupChat.html#clearMessages\">clearMessages()</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"GroupChat.html#clearState\">clearState()</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"GroupChat.html#delete\">delete()</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"GroupChat.html#deletePicture\">deletePicture()</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"GroupChat.html#demoteParticipants\">demoteParticipants(participantIds)</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"GroupChat.html#fetchMessages\">fetchMessages(searchOptions)</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"GroupChat.html#getContact\">getContact()</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"GroupChat.html#getCustomerNote\">getCustomerNote()</a></dt>\n                    <dd>\n                    </dd>\n                  </dl>\n                </div>\n                <div class=\"summary-column\">\n                  <dl class=\"dl-summary-callout\">\n                    <dt><a href=\"GroupChat.html#getGroupMembershipRequests\">getGroupMembershipRequests()</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"GroupChat.html#getInviteCode\">getInviteCode()</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"GroupChat.html#getLabels\">getLabels()</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"GroupChat.html#getPinnedMessages\">getPinnedMessages()</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"GroupChat.html#leave\">leave()</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"GroupChat.html#markUnread\">markUnread()</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"GroupChat.html#mute\">mute(unmuteDate)</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"GroupChat.html#pin\">pin()</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"GroupChat.html#promoteParticipants\">promoteParticipants(participantIds)</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"GroupChat.html#rejectGroupMembershipRequests\">rejectGroupMembershipRequests(options)</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"GroupChat.html#removeParticipants\">removeParticipants(participantIds)</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"GroupChat.html#revokeInvite\">revokeInvite()</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"GroupChat.html#sendMessage\">sendMessage(content[, options])</a></dt>\n                    <dd>\n                    </dd>\n                  </dl>\n                </div>\n                <div class=\"summary-column\">\n                  <dl class=\"dl-summary-callout\">\n                    <dt><a href=\"GroupChat.html#sendSeen\">sendSeen()</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"GroupChat.html#sendStateRecording\">sendStateRecording()</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"GroupChat.html#sendStateTyping\">sendStateTyping()</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"GroupChat.html#setAddMembersAdminsOnly\">setAddMembersAdminsOnly([adminsOnly])</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"GroupChat.html#setDescription\">setDescription(description)</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"GroupChat.html#setInfoAdminsOnly\">setInfoAdminsOnly([adminsOnly])</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"GroupChat.html#setMessagesAdminsOnly\">setMessagesAdminsOnly([adminsOnly])</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"GroupChat.html#setPicture\">setPicture(media)</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"GroupChat.html#setSubject\">setSubject(subject)</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"GroupChat.html#syncHistory\">syncHistory()</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"GroupChat.html#unarchive\">unarchive()</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"GroupChat.html#unmute\">unmute()</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"GroupChat.html#unpin\">unpin()</a></dt>\n                    <dd>\n                    </dd>\n                  </dl>\n                </div>\n              </div>\n            </div>\n          </section>\n          <section>\n            <h2 id=\"GroupChat\">new&nbsp;<span class=\"symbol-name\">GroupChat</span><span class=\"signature\"><span class=\"signature-params\">()</span></span></h2>\n            <dl class=\"dl-compact\">\n              <dt>Extends</dt>\n              <dd><a href=\"Chat.html\">Chat</a></dd>\n            </dl>\n          </section>\n          <section>\n            <h2>Properties</h2>\n            <section>\n              <h3 id=\"archived\"><span class=\"symbol-name\">archived</span><small class=\"property-type\">\n                  &nbsp;unknown</small></h3>\n              <p>Indicates if the Chat is archived</p>\n              <dl class=\"dl-compact\">\n                <dt>Inherited from</dt>\n                <dd><a href=\"Chat.html#archived\">Chat#archived</a></dd>\n              </dl>\n              <h3 id=\"createdAt\"><span class=\"symbol-name\">createdAt</span><small class=\"property-type\">\n                  &nbsp;date</small></h3>\n              <p>Gets the date at which the group was created</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"description\"><span class=\"symbol-name\">description</span><small class=\"property-type\">\n                  &nbsp;string</small></h3>\n              <p>Gets the group description</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"id\"><span class=\"symbol-name\">id</span><small class=\"property-type\">\n                  &nbsp;unknown</small></h3>\n              <p>ID that represents the chat</p>\n              <dl class=\"dl-compact\">\n                <dt>Inherited from</dt>\n                <dd><a href=\"Chat.html#id\">Chat#id</a></dd>\n              </dl>\n              <h3 id=\"isGroup\"><span class=\"symbol-name\">isGroup</span><small class=\"property-type\">\n                  &nbsp;unknown</small></h3>\n              <p>Indicates if the Chat is a Group Chat</p>\n              <dl class=\"dl-compact\">\n                <dt>Inherited from</dt>\n                <dd><a href=\"Chat.html#isGroup\">Chat#isGroup</a></dd>\n              </dl>\n              <h3 id=\"isMuted\"><span class=\"symbol-name\">isMuted</span><small class=\"property-type\">\n                  &nbsp;unknown</small></h3>\n              <p>Indicates if the chat is muted or not</p>\n              <dl class=\"dl-compact\">\n                <dt>Inherited from</dt>\n                <dd><a href=\"Chat.html#isMuted\">Chat#isMuted</a></dd>\n              </dl>\n              <h3 id=\"isReadOnly\"><span class=\"symbol-name\">isReadOnly</span><small class=\"property-type\">\n                  &nbsp;unknown</small></h3>\n              <p>Indicates if the Chat is readonly</p>\n              <dl class=\"dl-compact\">\n                <dt>Inherited from</dt>\n                <dd><a href=\"Chat.html#isReadOnly\">Chat#isReadOnly</a></dd>\n              </dl>\n              <h3 id=\"lastMessage\"><span class=\"symbol-name\">lastMessage</span><small class=\"property-type\">\n                  &nbsp;unknown</small></h3>\n              <p>Last message fo chat</p>\n              <dl class=\"dl-compact\">\n                <dt>Inherited from</dt>\n                <dd><a href=\"Chat.html#lastMessage\">Chat#lastMessage</a></dd>\n              </dl>\n              <h3 id=\"muteExpiration\"><span class=\"symbol-name\">muteExpiration</span><small class=\"property-type\">\n                  &nbsp;unknown</small></h3>\n              <p>Unix timestamp for when the mute expires</p>\n              <dl class=\"dl-compact\">\n                <dt>Inherited from</dt>\n                <dd><a href=\"Chat.html#muteExpiration\">Chat#muteExpiration</a></dd>\n              </dl>\n              <h3 id=\"name\"><span class=\"symbol-name\">name</span><small class=\"property-type\">\n                  &nbsp;unknown</small></h3>\n              <p>Title of the chat</p>\n              <dl class=\"dl-compact\">\n                <dt>Inherited from</dt>\n                <dd><a href=\"Chat.html#name\">Chat#name</a></dd>\n              </dl>\n              <h3 id=\"owner\"><span class=\"symbol-name\">owner</span><small class=\"property-type\">\n                  &nbsp;<a href=\"global.html#ContactId\">ContactId</a></small></h3>\n              <p>Gets the group owner</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"participants\"><span class=\"symbol-name\">participants</span><small class=\"property-type\">\n                  &nbsp;Array of <a href=\"global.html#GroupParticipant\">GroupParticipant</a></small></h3>\n              <p>Gets the group participants</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"pinned\"><span class=\"symbol-name\">pinned</span><small class=\"property-type\">\n                  &nbsp;unknown</small></h3>\n              <p>Indicates if the Chat is pinned</p>\n              <dl class=\"dl-compact\">\n                <dt>Inherited from</dt>\n                <dd><a href=\"Chat.html#pinned\">Chat#pinned</a></dd>\n              </dl>\n              <h3 id=\"timestamp\"><span class=\"symbol-name\">timestamp</span><small class=\"property-type\">\n                  &nbsp;unknown</small></h3>\n              <p>Unix timestamp for when the last activity occurred</p>\n              <dl class=\"dl-compact\">\n                <dt>Inherited from</dt>\n                <dd><a href=\"Chat.html#timestamp\">Chat#timestamp</a></dd>\n              </dl>\n              <h3 id=\"unreadCount\"><span class=\"symbol-name\">unreadCount</span><small class=\"property-type\">\n                  &nbsp;unknown</small></h3>\n              <p>Amount of messages unread</p>\n              <dl class=\"dl-compact\">\n                <dt>Inherited from</dt>\n                <dd><a href=\"Chat.html#unreadCount\">Chat#unreadCount</a></dd>\n              </dl>\n            </section>\n            <h2>Methods</h2>\n            <section>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"addOrEditCustomerNote\"><span class=\"symbol-name\">addOrEditCustomerNote</span><span class=\"signature\"><span class=\"signature-params\">(note)</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing void</span></span></h3>\n              <p>Add or edit a customer note</p>\n              <section>\n                <h4>Parameter</h4>\n                <table class=\"jsdoc-details-table\">\n                  <thead>\n                    <tr>\n                      <th>Name</th>\n                      <th>Type</th>\n                      <th>Optional</th>\n                      <th>Description</th>\n                    </tr>\n                  </thead>\n                  <tbody>\n                    <tr>\n                      <td>\n                        <p>note</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>The note to add</p>\n                      </td>\n                    </tr>\n                  </tbody>\n                </table>\n              </section>\n              <dl class=\"dl-compact\">\n                <dt>Inherited from</dt>\n                <dd><a href=\"Chat.html#addOrEditCustomerNote\">Chat#addOrEditCustomerNote</a></dd>\n                <dt>See also</dt>\n                <dd><a href=\"https://faq.whatsapp.com/1433099287594476\">https://faq.whatsapp.com/1433099287594476</a></dd>\n                <dt>Returns</dt>\n                <dd></dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"addParticipants\"><span class=\"symbol-name\">addParticipants</span><span class=\"signature\"><span class=\"signature-params\">(participantIds, options)</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing (Object with <a href=\"global.html#AddParticipantsResult\">AddParticipantsResult</a> properties or string)</span></span></h3>\n              <p>Adds a list of participants by ID to the group</p>\n              <section>\n                <h4>Parameters</h4>\n                <table class=\"jsdoc-details-table\">\n                  <thead>\n                    <tr>\n                      <th>Name</th>\n                      <th>Type</th>\n                      <th>Optional</th>\n                      <th>Description</th>\n                    </tr>\n                  </thead>\n                  <tbody>\n                    <tr>\n                      <td>\n                        <p>participantIds</p>\n                      </td>\n                      <td>\n                        <p>(string or Array of string)</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>options</p>\n                      </td>\n                      <td>\n                        <p><a href=\"global.html#AddParticipnatsOptions\">AddParticipnatsOptions</a></p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>An object thay handles options for adding participants</p>\n                      </td>\n                    </tr>\n                  </tbody>\n                </table>\n              </section>\n              <dl class=\"dl-compact\">\n                <dt>Returns</dt>\n                <dd>\n                  <p><code>Promise containing (Object with <a href=\"global.html#AddParticipantsResult\">AddParticipantsResult</a> properties or string)</code> \n                  <p>Returns an object with the resulting data or an error message as a string</p>\n                  </p>\n                </dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"approveGroupMembershipRequests\"><span class=\"symbol-name\">approveGroupMembershipRequests</span><span class=\"signature\"><span class=\"signature-params\">(options)</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing Array of <a href=\"global.html#MembershipRequestActionResult\">MembershipRequestActionResult</a></span></span></h3>\n              <p>Approves membership requests if any</p>\n              <section>\n                <h4>Parameter</h4>\n                <table class=\"jsdoc-details-table\">\n                  <thead>\n                    <tr>\n                      <th>Name</th>\n                      <th>Type</th>\n                      <th>Optional</th>\n                      <th>Description</th>\n                    </tr>\n                  </thead>\n                  <tbody>\n                    <tr>\n                      <td>\n                        <p>options</p>\n                      </td>\n                      <td>\n                        <p><a href=\"global.html#MembershipRequestActionOptions\">MembershipRequestActionOptions</a></p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>Options for performing a membership request action</p>\n                      </td>\n                    </tr>\n                  </tbody>\n                </table>\n              </section>\n              <dl class=\"dl-compact\">\n                <dt>Returns</dt>\n                <dd>\n                  <p><code>Promise containing Array of <a href=\"global.html#MembershipRequestActionResult\">MembershipRequestActionResult</a></code> \n                  <p>Returns an array of requester IDs whose membership requests were approved and an error for each requester, if any occurred during the operation. If there are no requests, an empty array will be returned</p>\n                  </p>\n                </dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"archive\"><span class=\"symbol-name\">archive</span><span class=\"signature\"><span class=\"signature-params\">()</span></span></h3>\n              <p>Archives this chat</p>\n              <dl class=\"dl-compact\">\n                <dt>Inherited from</dt>\n                <dd><a href=\"Chat.html#archive\">Chat#archive</a></dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"changeLabels\"><span class=\"symbol-name\">changeLabels</span><span class=\"signature\"><span class=\"signature-params\">(labelIds)</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing void</span></span></h3>\n              <p>Add or remove labels to this Chat</p>\n              <section>\n                <h4>Parameter</h4>\n                <table class=\"jsdoc-details-table\">\n                  <thead>\n                    <tr>\n                      <th>Name</th>\n                      <th>Type</th>\n                      <th>Optional</th>\n                      <th>Description</th>\n                    </tr>\n                  </thead>\n                  <tbody>\n                    <tr>\n                      <td>\n                        <p>labelIds</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                  </tbody>\n                </table>\n              </section>\n              <dl class=\"dl-compact\">\n                <dt>Inherited from</dt>\n                <dd><a href=\"Chat.html#changeLabels\">Chat#changeLabels</a></dd>\n                <dt>Returns</dt>\n                <dd></dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"clearMessages\"><span class=\"symbol-name\">clearMessages</span><span class=\"signature\"><span class=\"signature-params\">()</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing boolean</span></span></h3>\n              <p>Clears all messages from the chat</p>\n              <dl class=\"dl-compact\">\n                <dt>Inherited from</dt>\n                <dd><a href=\"Chat.html#clearMessages\">Chat#clearMessages</a></dd>\n                <dt>Returns</dt>\n                <dd>\n                  <p>result</p>\n                </dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"clearState\"><span class=\"symbol-name\">clearState</span><span class=\"signature\"><span class=\"signature-params\">()</span></span></h3>\n              <p>Stops typing or recording in chat immediately.</p>\n              <dl class=\"dl-compact\">\n                <dt>Inherited from</dt>\n                <dd><a href=\"Chat.html#clearState\">Chat#clearState</a></dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"delete\"><span class=\"symbol-name\">delete</span><span class=\"signature\"><span class=\"signature-params\">()</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing Boolean</span></span></h3>\n              <p>Deletes the chat</p>\n              <dl class=\"dl-compact\">\n                <dt>Inherited from</dt>\n                <dd><a href=\"Chat.html#delete\">Chat#delete</a></dd>\n                <dt>Returns</dt>\n                <dd>\n                  <p>result</p>\n                </dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"deletePicture\"><span class=\"symbol-name\">deletePicture</span><span class=\"signature\"><span class=\"signature-params\">()</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing boolean</span></span></h3>\n              <p>Deletes the group's picture.</p>\n              <dl class=\"dl-compact\">\n                <dt>Returns</dt>\n                <dd>\n                  <p><code>Promise containing boolean</code> \n                  <p>Returns true if the picture was properly deleted. This can return false if the user does not have the necessary permissions.</p>\n                  </p>\n                </dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"demoteParticipants\"><span class=\"symbol-name\">demoteParticipants</span><span class=\"signature\"><span class=\"signature-params\">(participantIds)</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing {status: number}</span></span></h3>\n              <p>Demotes participants by IDs to regular users</p>\n              <section>\n                <h4>Parameter</h4>\n                <table class=\"jsdoc-details-table\">\n                  <thead>\n                    <tr>\n                      <th>Name</th>\n                      <th>Type</th>\n                      <th>Optional</th>\n                      <th>Description</th>\n                    </tr>\n                  </thead>\n                  <tbody>\n                    <tr>\n                      <td>\n                        <p>participantIds</p>\n                      </td>\n                      <td>\n                        <p>Array of string</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                  </tbody>\n                </table>\n              </section>\n              <dl class=\"dl-compact\">\n                <dt>Returns</dt>\n                <dd>\n                  <p><code>Promise containing {status: number}</code> \n                  <p>Object with status code indicating if the operation was successful</p>\n                  </p>\n                </dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"fetchMessages\"><span class=\"symbol-name\">fetchMessages</span><span class=\"signature\"><span class=\"signature-params\">(searchOptions)</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing Array of <a href=\"Message.html\">Message</a></span></span></h3>\n              <p>Loads chat messages, sorted from earliest to latest.</p>\n              <section>\n                <h4>Parameters</h4>\n                <table class=\"jsdoc-details-table\">\n                  <thead>\n                    <tr>\n                      <th>Name</th>\n                      <th>Type</th>\n                      <th>Optional</th>\n                      <th>Description</th>\n                    </tr>\n                  </thead>\n                  <tbody>\n                    <tr>\n                      <td>\n                        <p>searchOptions</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>Options for searching messages. Right now only limit and fromMe is supported.</p>\n                        <p>Values in <code>searchOptions</code> have the following properties:</p>\n                        <table class=\"jsdoc-details-table\">\n                          <thead>\n                            <tr>\n                              <th>Name</th>\n                              <th>Type</th>\n                              <th>Optional</th>\n                              <th>Description</th>\n                            </tr>\n                          </thead>\n                          <tbody>\n                            <tr>\n                              <td>\n                                <p>limit</p>\n                              </td>\n                              <td>\n                                <p>&nbsp;</p>\n                              </td>\n                              <td>\n                                <p>Yes</p>\n                              </td>\n                              <td>\n                                <p>The amount of messages to return. If no limit is specified, the available messages will be returned. Note that the actual number of returned messages may be smaller if there aren't enough messages in the conversation. Set this to Infinity to load all messages.</p>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <p>fromMe</p>\n                              </td>\n                              <td>\n                                <p>&nbsp;</p>\n                              </td>\n                              <td>\n                                <p>Yes</p>\n                              </td>\n                              <td>\n                                <p>Return only messages from the bot number or vise versa. To get all messages, leave the option undefined.</p>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </td>\n                    </tr>\n                  </tbody>\n                </table>\n              </section>\n              <dl class=\"dl-compact\">\n                <dt>Inherited from</dt>\n                <dd><a href=\"Chat.html#fetchMessages\">Chat#fetchMessages</a></dd>\n                <dt>Returns</dt>\n                <dd></dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"getContact\"><span class=\"symbol-name\">getContact</span><span class=\"signature\"><span class=\"signature-params\">()</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing <a href=\"Contact.html\">Contact</a></span></span></h3>\n              <p>Returns the Contact that corresponds to this Chat.</p>\n              <dl class=\"dl-compact\">\n                <dt>Inherited from</dt>\n                <dd><a href=\"Chat.html#getContact\">Chat#getContact</a></dd>\n                <dt>Returns</dt>\n                <dd></dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"getCustomerNote\"><span class=\"symbol-name\">getCustomerNote</span><span class=\"signature\"><span class=\"signature-params\">()</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing {chatId: string, content: string, createdAt: number, id: string, modifiedAt: number, type: string}</span></span></h3>\n              <p>Get a customer note</p>\n              <dl class=\"dl-compact\">\n                <dt>Inherited from</dt>\n                <dd><a href=\"Chat.html#getCustomerNote\">Chat#getCustomerNote</a></dd>\n                <dt>See also</dt>\n                <dd><a href=\"https://faq.whatsapp.com/1433099287594476\">https://faq.whatsapp.com/1433099287594476</a></dd>\n                <dt>Returns</dt>\n                <dd></dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"getGroupMembershipRequests\"><span class=\"symbol-name\">getGroupMembershipRequests</span><span class=\"signature\"><span class=\"signature-params\">()</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing Array of <a href=\"global.html#GroupMembershipRequest\">GroupMembershipRequest</a></span></span></h3>\n              <p>Gets an array of membership requests</p>\n              <dl class=\"dl-compact\">\n                <dt>Returns</dt>\n                <dd>\n                  <p><code>Promise containing Array of <a href=\"global.html#GroupMembershipRequest\">GroupMembershipRequest</a></code> \n                  <p>An array of membership requests</p>\n                  </p>\n                </dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"getInviteCode\"><span class=\"symbol-name\">getInviteCode</span><span class=\"signature\"><span class=\"signature-params\">()</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing string</span></span></h3>\n              <p>Gets the invite code for a specific group</p>\n              <dl class=\"dl-compact\">\n                <dt>Returns</dt>\n                <dd>\n                  <p><code>Promise containing string</code> \n                  <p>Group's invite code</p>\n                  </p>\n                </dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"getLabels\"><span class=\"symbol-name\">getLabels</span><span class=\"signature\"><span class=\"signature-params\">()</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing Array of <a href=\"Label.html\">Label</a></span></span></h3>\n              <p>Returns array of all Labels assigned to this Chat</p>\n              <dl class=\"dl-compact\">\n                <dt>Inherited from</dt>\n                <dd><a href=\"Chat.html#getLabels\">Chat#getLabels</a></dd>\n                <dt>Returns</dt>\n                <dd></dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"getPinnedMessages\"><span class=\"symbol-name\">getPinnedMessages</span><span class=\"signature\"><span class=\"signature-params\">()</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing Array of <a href=\"Message.html\">Message</a></span></span></h3>\n              <p>Gets instances of all pinned messages in a chat</p>\n              <dl class=\"dl-compact\">\n                <dt>Inherited from</dt>\n                <dd><a href=\"Chat.html#getPinnedMessages\">Chat#getPinnedMessages</a></dd>\n                <dt>Returns</dt>\n                <dd></dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"leave\"><span class=\"symbol-name\">leave</span><span class=\"signature\"><span class=\"signature-params\">()</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise</span></span></h3>\n              <p>Makes the bot leave the group</p>\n              <dl class=\"dl-compact\">\n                <dt>Returns</dt>\n                <dd>\n                  <p><code>Promise</code> </p>\n                </dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"markUnread\"><span class=\"symbol-name\">markUnread</span><span class=\"signature\"><span class=\"signature-params\">()</span></span></h3>\n              <p>Mark this chat as unread</p>\n              <dl class=\"dl-compact\">\n                <dt>Inherited from</dt>\n                <dd><a href=\"Chat.html#markUnread\">Chat#markUnread</a></dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"mute\"><span class=\"symbol-name\">mute</span><span class=\"signature\"><span class=\"signature-params\">(unmuteDate)</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing {isMuted: boolean, muteExpiration: number}</span></span></h3>\n              <p>Mutes this chat forever, unless a date is specified</p>\n              <section>\n                <h4>Parameter</h4>\n                <table class=\"jsdoc-details-table\">\n                  <thead>\n                    <tr>\n                      <th>Name</th>\n                      <th>Type</th>\n                      <th>Optional</th>\n                      <th>Description</th>\n                    </tr>\n                  </thead>\n                  <tbody>\n                    <tr>\n                      <td>\n                        <p>unmuteDate</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>Date when the chat will be unmuted, don't provide a value to mute forever</p>\n                        <p>Value can be null.</p>\n                      </td>\n                    </tr>\n                  </tbody>\n                </table>\n              </section>\n              <dl class=\"dl-compact\">\n                <dt>Inherited from</dt>\n                <dd><a href=\"Chat.html#mute\">Chat#mute</a></dd>\n                <dt>Returns</dt>\n                <dd></dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"pin\"><span class=\"symbol-name\">pin</span><span class=\"signature\"><span class=\"signature-params\">()</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing boolean</span></span></h3>\n              <p>Pins this chat</p>\n              <dl class=\"dl-compact\">\n                <dt>Inherited from</dt>\n                <dd><a href=\"Chat.html#pin\">Chat#pin</a></dd>\n                <dt>Returns</dt>\n                <dd>\n                  <p>New pin state. Could be false if the max number of pinned chats was reached.</p>\n                </dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"promoteParticipants\"><span class=\"symbol-name\">promoteParticipants</span><span class=\"signature\"><span class=\"signature-params\">(participantIds)</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing {status: number}</span></span></h3>\n              <p>Promotes participants by IDs to admins</p>\n              <section>\n                <h4>Parameter</h4>\n                <table class=\"jsdoc-details-table\">\n                  <thead>\n                    <tr>\n                      <th>Name</th>\n                      <th>Type</th>\n                      <th>Optional</th>\n                      <th>Description</th>\n                    </tr>\n                  </thead>\n                  <tbody>\n                    <tr>\n                      <td>\n                        <p>participantIds</p>\n                      </td>\n                      <td>\n                        <p>Array of string</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                  </tbody>\n                </table>\n              </section>\n              <dl class=\"dl-compact\">\n                <dt>Returns</dt>\n                <dd>\n                  <p><code>Promise containing {status: number}</code> \n                  <p>Object with status code indicating if the operation was successful</p>\n                  </p>\n                </dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"rejectGroupMembershipRequests\"><span class=\"symbol-name\">rejectGroupMembershipRequests</span><span class=\"signature\"><span class=\"signature-params\">(options)</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing Array of <a href=\"global.html#MembershipRequestActionResult\">MembershipRequestActionResult</a></span></span></h3>\n              <p>Rejects membership requests if any</p>\n              <section>\n                <h4>Parameter</h4>\n                <table class=\"jsdoc-details-table\">\n                  <thead>\n                    <tr>\n                      <th>Name</th>\n                      <th>Type</th>\n                      <th>Optional</th>\n                      <th>Description</th>\n                    </tr>\n                  </thead>\n                  <tbody>\n                    <tr>\n                      <td>\n                        <p>options</p>\n                      </td>\n                      <td>\n                        <p><a href=\"global.html#MembershipRequestActionOptions\">MembershipRequestActionOptions</a></p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>Options for performing a membership request action</p>\n                      </td>\n                    </tr>\n                  </tbody>\n                </table>\n              </section>\n              <dl class=\"dl-compact\">\n                <dt>Returns</dt>\n                <dd>\n                  <p><code>Promise containing Array of <a href=\"global.html#MembershipRequestActionResult\">MembershipRequestActionResult</a></code> \n                  <p>Returns an array of requester IDs whose membership requests were rejected and an error for each requester, if any occurred during the operation. If there are no requests, an empty array will be returned</p>\n                  </p>\n                </dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"removeParticipants\"><span class=\"symbol-name\">removeParticipants</span><span class=\"signature\"><span class=\"signature-params\">(participantIds)</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing {status: number}</span></span></h3>\n              <p>Removes a list of participants by ID to the group</p>\n              <section>\n                <h4>Parameter</h4>\n                <table class=\"jsdoc-details-table\">\n                  <thead>\n                    <tr>\n                      <th>Name</th>\n                      <th>Type</th>\n                      <th>Optional</th>\n                      <th>Description</th>\n                    </tr>\n                  </thead>\n                  <tbody>\n                    <tr>\n                      <td>\n                        <p>participantIds</p>\n                      </td>\n                      <td>\n                        <p>Array of string</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                  </tbody>\n                </table>\n              </section>\n              <dl class=\"dl-compact\">\n                <dt>Returns</dt>\n                <dd>\n                  <p><code>Promise containing {status: number}</code> </p>\n                </dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"revokeInvite\"><span class=\"symbol-name\">revokeInvite</span><span class=\"signature\"><span class=\"signature-params\">()</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing string</span></span></h3>\n              <p>Invalidates the current group invite code and generates a new one</p>\n              <dl class=\"dl-compact\">\n                <dt>Returns</dt>\n                <dd>\n                  <p><code>Promise containing string</code> \n                  <p>New invite code</p>\n                  </p>\n                </dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"sendMessage\"><span class=\"symbol-name\">sendMessage</span><span class=\"signature\"><span class=\"signature-params\">(content[, options])</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing <a href=\"Message.html\">Message</a></span></span></h3>\n              <p>Send a message to this chat</p>\n              <section>\n                <h4>Parameters</h4>\n                <table class=\"jsdoc-details-table\">\n                  <thead>\n                    <tr>\n                      <th>Name</th>\n                      <th>Type</th>\n                      <th>Optional</th>\n                      <th>Description</th>\n                    </tr>\n                  </thead>\n                  <tbody>\n                    <tr>\n                      <td>\n                        <p>content</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>options</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>Yes</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                  </tbody>\n                </table>\n              </section>\n              <dl class=\"dl-compact\">\n                <dt>Inherited from</dt>\n                <dd><a href=\"Chat.html#sendMessage\">Chat#sendMessage</a></dd>\n                <dt>Returns</dt>\n                <dd>\n                  <p>Message that was just sent</p>\n                </dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"sendSeen\"><span class=\"symbol-name\">sendSeen</span><span class=\"signature\"><span class=\"signature-params\">()</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing Boolean</span></span></h3>\n              <p>Sets the chat as seen</p>\n              <dl class=\"dl-compact\">\n                <dt>Inherited from</dt>\n                <dd><a href=\"Chat.html#sendSeen\">Chat#sendSeen</a></dd>\n                <dt>Returns</dt>\n                <dd>\n                  <p>result</p>\n                </dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"sendStateRecording\"><span class=\"symbol-name\">sendStateRecording</span><span class=\"signature\"><span class=\"signature-params\">()</span></span></h3>\n              <p>Simulate recording audio in chat. This will last for 25 seconds.</p>\n              <dl class=\"dl-compact\">\n                <dt>Inherited from</dt>\n                <dd><a href=\"Chat.html#sendStateRecording\">Chat#sendStateRecording</a></dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"sendStateTyping\"><span class=\"symbol-name\">sendStateTyping</span><span class=\"signature\"><span class=\"signature-params\">()</span></span></h3>\n              <p>Simulate typing in chat. This will last for 25 seconds.</p>\n              <dl class=\"dl-compact\">\n                <dt>Inherited from</dt>\n                <dd><a href=\"Chat.html#sendStateTyping\">Chat#sendStateTyping</a></dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"setAddMembersAdminsOnly\"><span class=\"symbol-name\">setAddMembersAdminsOnly</span><span class=\"signature\"><span class=\"signature-params\">([adminsOnly])</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing boolean</span></span></h3>\n              <p>Updates the group setting to allow only admins to add members to the group.</p>\n              <section>\n                <h4>Parameter</h4>\n                <table class=\"jsdoc-details-table\">\n                  <thead>\n                    <tr>\n                      <th>Name</th>\n                      <th>Type</th>\n                      <th>Optional</th>\n                      <th>Description</th>\n                    </tr>\n                  </thead>\n                  <tbody>\n                    <tr>\n                      <td>\n                        <p>adminsOnly</p>\n                      </td>\n                      <td>\n                        <p>boolean</p>\n                      </td>\n                      <td>\n                        <p>Yes</p>\n                      </td>\n                      <td>\n                        <p>Enable or disable this option</p>\n                        <p>Defaults to <code>true</code>.</p>\n                      </td>\n                    </tr>\n                  </tbody>\n                </table>\n              </section>\n              <dl class=\"dl-compact\">\n                <dt>Returns</dt>\n                <dd>\n                  <p><code>Promise containing boolean</code> \n                  <p>Returns true if the setting was properly updated. This can return false if the user does not have the necessary permissions.</p>\n                  </p>\n                </dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"setDescription\"><span class=\"symbol-name\">setDescription</span><span class=\"signature\"><span class=\"signature-params\">(description)</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing boolean</span></span></h3>\n              <p>Updates the group description</p>\n              <section>\n                <h4>Parameter</h4>\n                <table class=\"jsdoc-details-table\">\n                  <thead>\n                    <tr>\n                      <th>Name</th>\n                      <th>Type</th>\n                      <th>Optional</th>\n                      <th>Description</th>\n                    </tr>\n                  </thead>\n                  <tbody>\n                    <tr>\n                      <td>\n                        <p>description</p>\n                      </td>\n                      <td>\n                        <p>string</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                  </tbody>\n                </table>\n              </section>\n              <dl class=\"dl-compact\">\n                <dt>Returns</dt>\n                <dd>\n                  <p><code>Promise containing boolean</code> \n                  <p>Returns true if the description was properly updated. This can return false if the user does not have the necessary permissions.</p>\n                  </p>\n                </dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"setInfoAdminsOnly\"><span class=\"symbol-name\">setInfoAdminsOnly</span><span class=\"signature\"><span class=\"signature-params\">([adminsOnly])</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing boolean</span></span></h3>\n              <p>Updates the group settings to only allow admins to edit group info (title, description, photo).</p>\n              <section>\n                <h4>Parameter</h4>\n                <table class=\"jsdoc-details-table\">\n                  <thead>\n                    <tr>\n                      <th>Name</th>\n                      <th>Type</th>\n                      <th>Optional</th>\n                      <th>Description</th>\n                    </tr>\n                  </thead>\n                  <tbody>\n                    <tr>\n                      <td>\n                        <p>adminsOnly</p>\n                      </td>\n                      <td>\n                        <p>boolean</p>\n                      </td>\n                      <td>\n                        <p>Yes</p>\n                      </td>\n                      <td>\n                        <p>Enable or disable this option</p>\n                        <p>Defaults to <code>true</code>.</p>\n                      </td>\n                    </tr>\n                  </tbody>\n                </table>\n              </section>\n              <dl class=\"dl-compact\">\n                <dt>Returns</dt>\n                <dd>\n                  <p><code>Promise containing boolean</code> \n                  <p>Returns true if the setting was properly updated. This can return false if the user does not have the necessary permissions.</p>\n                  </p>\n                </dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"setMessagesAdminsOnly\"><span class=\"symbol-name\">setMessagesAdminsOnly</span><span class=\"signature\"><span class=\"signature-params\">([adminsOnly])</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing boolean</span></span></h3>\n              <p>Updates the group settings to only allow admins to send messages.</p>\n              <section>\n                <h4>Parameter</h4>\n                <table class=\"jsdoc-details-table\">\n                  <thead>\n                    <tr>\n                      <th>Name</th>\n                      <th>Type</th>\n                      <th>Optional</th>\n                      <th>Description</th>\n                    </tr>\n                  </thead>\n                  <tbody>\n                    <tr>\n                      <td>\n                        <p>adminsOnly</p>\n                      </td>\n                      <td>\n                        <p>boolean</p>\n                      </td>\n                      <td>\n                        <p>Yes</p>\n                      </td>\n                      <td>\n                        <p>Enable or disable this option</p>\n                        <p>Defaults to <code>true</code>.</p>\n                      </td>\n                    </tr>\n                  </tbody>\n                </table>\n              </section>\n              <dl class=\"dl-compact\">\n                <dt>Returns</dt>\n                <dd>\n                  <p><code>Promise containing boolean</code> \n                  <p>Returns true if the setting was properly updated. This can return false if the user does not have the necessary permissions.</p>\n                  </p>\n                </dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"setPicture\"><span class=\"symbol-name\">setPicture</span><span class=\"signature\"><span class=\"signature-params\">(media)</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing boolean</span></span></h3>\n              <p>Sets the group's picture.</p>\n              <section>\n                <h4>Parameter</h4>\n                <table class=\"jsdoc-details-table\">\n                  <thead>\n                    <tr>\n                      <th>Name</th>\n                      <th>Type</th>\n                      <th>Optional</th>\n                      <th>Description</th>\n                    </tr>\n                  </thead>\n                  <tbody>\n                    <tr>\n                      <td>\n                        <p>media</p>\n                      </td>\n                      <td>\n                        <p><a href=\"MessageMedia.html\">MessageMedia</a></p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                  </tbody>\n                </table>\n              </section>\n              <dl class=\"dl-compact\">\n                <dt>Returns</dt>\n                <dd>\n                  <p><code>Promise containing boolean</code> \n                  <p>Returns true if the picture was properly updated. This can return false if the user does not have the necessary permissions.</p>\n                  </p>\n                </dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"setSubject\"><span class=\"symbol-name\">setSubject</span><span class=\"signature\"><span class=\"signature-params\">(subject)</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing boolean</span></span></h3>\n              <p>Updates the group subject</p>\n              <section>\n                <h4>Parameter</h4>\n                <table class=\"jsdoc-details-table\">\n                  <thead>\n                    <tr>\n                      <th>Name</th>\n                      <th>Type</th>\n                      <th>Optional</th>\n                      <th>Description</th>\n                    </tr>\n                  </thead>\n                  <tbody>\n                    <tr>\n                      <td>\n                        <p>subject</p>\n                      </td>\n                      <td>\n                        <p>string</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                  </tbody>\n                </table>\n              </section>\n              <dl class=\"dl-compact\">\n                <dt>Returns</dt>\n                <dd>\n                  <p><code>Promise containing boolean</code> \n                  <p>Returns true if the subject was properly updated. This can return false if the user does not have the necessary permissions.</p>\n                  </p>\n                </dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"syncHistory\"><span class=\"symbol-name\">syncHistory</span><span class=\"signature\"><span class=\"signature-params\">()</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing boolean</span></span></h3>\n              <p>Sync chat history conversation</p>\n              <dl class=\"dl-compact\">\n                <dt>Inherited from</dt>\n                <dd><a href=\"Chat.html#syncHistory\">Chat#syncHistory</a></dd>\n                <dt>Returns</dt>\n                <dd>\n                  <p>True if operation completed successfully, false otherwise.</p>\n                </dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"unarchive\"><span class=\"symbol-name\">unarchive</span><span class=\"signature\"><span class=\"signature-params\">()</span></span></h3>\n              <p>un-archives this chat</p>\n              <dl class=\"dl-compact\">\n                <dt>Inherited from</dt>\n                <dd><a href=\"Chat.html#unarchive\">Chat#unarchive</a></dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"unmute\"><span class=\"symbol-name\">unmute</span><span class=\"signature\"><span class=\"signature-params\">()</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing {isMuted: boolean, muteExpiration: number}</span></span></h3>\n              <p>Unmutes this chat</p>\n              <dl class=\"dl-compact\">\n                <dt>Inherited from</dt>\n                <dd><a href=\"Chat.html#unmute\">Chat#unmute</a></dd>\n                <dt>Returns</dt>\n                <dd></dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"unpin\"><span class=\"symbol-name\">unpin</span><span class=\"signature\"><span class=\"signature-params\">()</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing boolean</span></span></h3>\n              <p>Unpins this chat</p>\n              <dl class=\"dl-compact\">\n                <dt>Inherited from</dt>\n                <dd><a href=\"Chat.html#unpin\">Chat#unpin</a></dd>\n                <dt>Returns</dt>\n                <dd>\n                  <p>New pin state</p>\n                </dd>\n              </dl>\n            </section>\n          </section>\n        </div>\n      </div>\n      <nav id=\"jsdoc-toc-nav\" role=\"navigation\"></nav>\n    </div>\n  </div>\n  <footer id=\"jsdoc-footer\" class=\"jsdoc-footer\">\n    <div id=\"jsdoc-footer-container\">\n      <p>\n        Generated by <a href=\"https://github.com/jsdoc3/jsdoc\">JSDoc</a> 3.6.11 on January 30, 2026.\n      </p>\n    </div>\n  </footer>\n  <script src=\"scripts/jquery.min.js\"></script>\n  <script src=\"scripts/tree.jquery.js\"></script>\n  <script src=\"scripts/prettify.js\"></script>\n  <script src=\"scripts/jsdoc-toc.js\"></script>\n  <script src=\"scripts/linenumber.js\"></script>\n  <script src=\"scripts/scrollanchor.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "docs/GroupNotification.html",
    "content": "<!doctype html>\n<html>\n\n<head>\n  <meta name=\"generator\" content=\"JSDoc 3.6.11\">\n  <meta charset=\"utf-8\">\n  <title>whatsapp-web.js 1.34.6 &raquo; Class: GroupNotification</title>\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Karla:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Noto+Serif:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Inconsolata:500\" type=\"text/css\">\n  <link href=\"css/baseline.css\" rel=\"stylesheet\">\n</head>\n\n<body onload=\"prettyPrint()\">\n  <nav id=\"jsdoc-navbar\" role=\"navigation\" class=\"jsdoc-navbar\">\n    <div id=\"jsdoc-navbar-container\">\n      <div id=\"jsdoc-navbar-content\">\n        <a href=\"index.html\" class=\"jsdoc-navbar-package-name\">whatsapp-web.<wbr>js 1.<wbr>34.<wbr>6</a>\n      </div>\n    </div>\n  </nav>\n  <div id=\"jsdoc-body-container\">\n    <div id=\"jsdoc-content\">\n      <div id=\"jsdoc-content-container\">\n        <div id=\"jsdoc-main\" role=\"main\">\n          <header class=\"page-header\">\n            <div class=\"symbol-detail-labels\"><span class=\"label label-kind\">class</span></div>\n            <h1><small></small><span class=\"symbol-name\">GroupNotification</span></h1>\n            <p class=\"source-link\">Source: <a href=\"structures_GroupNotification.js.html#source-line-9\">structures/<wbr>GroupNotification.<wbr>js:9</a></p>\n            <div class=\"symbol-classdesc\">\n              <p>Represents a GroupNotification on WhatsApp</p>\n            </div>\n            <dl class=\"dl-compact\">\n            </dl>\n          </header>\n          <section id=\"summary\">\n            <div class=\"summary-callout\">\n              <h2 class=\"summary-callout-heading\">Properties</h2>\n              <div class=\"summary-content\">\n                <div class=\"summary-column\">\n                  <dl class=\"dl-summary-callout\">\n                    <dt><a href=\"GroupNotification.html#author\">author</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"GroupNotification.html#body\">body</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"GroupNotification.html#chatId\">chatId</a></dt>\n                    <dd>\n                    </dd>\n                  </dl>\n                </div>\n                <div class=\"summary-column\">\n                  <dl class=\"dl-summary-callout\">\n                    <dt><a href=\"GroupNotification.html#id\">id</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"GroupNotification.html#recipientIds\">recipientIds</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"GroupNotification.html#timestamp\">timestamp</a></dt>\n                    <dd>\n                    </dd>\n                  </dl>\n                </div>\n                <div class=\"summary-column\">\n                  <dl class=\"dl-summary-callout\">\n                    <dt><a href=\"GroupNotification.html#type\">type</a></dt>\n                    <dd>\n                    </dd>\n                  </dl>\n                </div>\n              </div>\n            </div>\n            <div class=\"summary-callout\">\n              <h2 class=\"summary-callout-heading\">Methods</h2>\n              <div class=\"summary-content\">\n                <div class=\"summary-column\">\n                  <dl class=\"dl-summary-callout\">\n                    <dt><a href=\"GroupNotification.html#getChat\">getChat()</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"GroupNotification.html#getContact\">getContact()</a></dt>\n                    <dd>\n                    </dd>\n                  </dl>\n                </div>\n                <div class=\"summary-column\">\n                  <dl class=\"dl-summary-callout\">\n                    <dt><a href=\"GroupNotification.html#getRecipients\">getRecipients()</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"GroupNotification.html#reply\">reply(content, options)</a></dt>\n                    <dd>\n                    </dd>\n                  </dl>\n                </div>\n                <div class=\"summary-column\">\n                </div>\n              </div>\n            </div>\n          </section>\n          <section>\n            <h2 id=\"GroupNotification\">new&nbsp;<span class=\"symbol-name\">GroupNotification</span><span class=\"signature\"><span class=\"signature-params\">()</span></span></h2>\n            <dl class=\"dl-compact\">\n              <dt>Extends</dt>\n              <dd><a href=\"Base.html\">Base</a></dd>\n            </dl>\n          </section>\n          <section>\n            <h2>Properties</h2>\n            <section>\n              <h3 id=\"author\"><span class=\"symbol-name\">author</span><small class=\"property-type\">\n                  &nbsp;string</small></h3>\n              <p>ContactId for the user that produced the GroupNotification.</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"body\"><span class=\"symbol-name\">body</span><small class=\"property-type\">\n                  &nbsp;string</small></h3>\n              <p>Extra content</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"chatId\"><span class=\"symbol-name\">chatId</span><small class=\"property-type\">\n                  &nbsp;string</small></h3>\n              <p>ID for the Chat that this groupNotification was sent for.</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"id\"><span class=\"symbol-name\">id</span><small class=\"property-type\">\n                  &nbsp;object</small></h3>\n              <p>ID that represents the groupNotification</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"recipientIds\"><span class=\"symbol-name\">recipientIds</span><small class=\"property-type\">\n                  &nbsp;Array of string</small></h3>\n              <p>Contact IDs for the users that were affected by this GroupNotification.</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"timestamp\"><span class=\"symbol-name\">timestamp</span><small class=\"property-type\">\n                  &nbsp;number</small></h3>\n              <p>Unix timestamp for when the groupNotification was created</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"type\"><span class=\"symbol-name\">type</span><small class=\"property-type\">\n                  &nbsp;<a href=\"global.html#GroupNotificationTypes\">GroupNotificationTypes</a></small></h3>\n              <p>GroupNotification type</p>\n              <dl class=\"dl-compact\">\n              </dl>\n            </section>\n            <h2>Methods</h2>\n            <section>\n              <h3 id=\"getChat\"><span class=\"symbol-name\">getChat</span><span class=\"signature\"><span class=\"signature-params\">()</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing <a href=\"Chat.html\">Chat</a></span></span></h3>\n              <p>Returns the Chat this groupNotification was sent in</p>\n              <dl class=\"dl-compact\">\n                <dt>Returns</dt>\n                <dd>\n                  <p><code>Promise containing <a href=\"Chat.html\">Chat</a></code> </p>\n                </dd>\n              </dl>\n              <h3 id=\"getContact\"><span class=\"symbol-name\">getContact</span><span class=\"signature\"><span class=\"signature-params\">()</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing <a href=\"Contact.html\">Contact</a></span></span></h3>\n              <p>Returns the Contact this GroupNotification was produced by</p>\n              <dl class=\"dl-compact\">\n                <dt>Returns</dt>\n                <dd>\n                  <p><code>Promise containing <a href=\"Contact.html\">Contact</a></code> </p>\n                </dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"getRecipients\"><span class=\"symbol-name\">getRecipients</span><span class=\"signature\"><span class=\"signature-params\">()</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing Array of <a href=\"Contact.html\">Contact</a></span></span></h3>\n              <p>Returns the Contacts affected by this GroupNotification.</p>\n              <dl class=\"dl-compact\">\n                <dt>Returns</dt>\n                <dd>\n                  <p><code>Promise containing Array of <a href=\"Contact.html\">Contact</a></code> </p>\n                </dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"reply\"><span class=\"symbol-name\">reply</span><span class=\"signature\"><span class=\"signature-params\">(content, options)</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing <a href=\"Message.html\">Message</a></span></span></h3>\n              <p>Sends a message to the same chat this GroupNotification was produced in.</p>\n              <section>\n                <h4>Parameters</h4>\n                <table class=\"jsdoc-details-table\">\n                  <thead>\n                    <tr>\n                      <th>Name</th>\n                      <th>Type</th>\n                      <th>Optional</th>\n                      <th>Description</th>\n                    </tr>\n                  </thead>\n                  <tbody>\n                    <tr>\n                      <td>\n                        <p>content</p>\n                      </td>\n                      <td>\n                        <p>(string, <a href=\"MessageMedia.html\">MessageMedia</a>, or <a href=\"Location.html\">Location</a>)</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>options</p>\n                      </td>\n                      <td>\n                        <p>object</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                  </tbody>\n                </table>\n              </section>\n              <dl class=\"dl-compact\">\n                <dt>Returns</dt>\n                <dd>\n                  <p><code>Promise containing <a href=\"Message.html\">Message</a></code> </p>\n                </dd>\n              </dl>\n            </section>\n          </section>\n        </div>\n      </div>\n      <nav id=\"jsdoc-toc-nav\" role=\"navigation\"></nav>\n    </div>\n  </div>\n  <footer id=\"jsdoc-footer\" class=\"jsdoc-footer\">\n    <div id=\"jsdoc-footer-container\">\n      <p>\n        Generated by <a href=\"https://github.com/jsdoc3/jsdoc\">JSDoc</a> 3.6.11 on January 30, 2026.\n      </p>\n    </div>\n  </footer>\n  <script src=\"scripts/jquery.min.js\"></script>\n  <script src=\"scripts/tree.jquery.js\"></script>\n  <script src=\"scripts/prettify.js\"></script>\n  <script src=\"scripts/jsdoc-toc.js\"></script>\n  <script src=\"scripts/linenumber.js\"></script>\n  <script src=\"scripts/scrollanchor.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "docs/InterfaceController.html",
    "content": "<!doctype html>\n<html>\n\n<head>\n  <meta name=\"generator\" content=\"JSDoc 3.6.11\">\n  <meta charset=\"utf-8\">\n  <title>whatsapp-web.js 1.34.6 &raquo; Class: InterfaceController</title>\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Karla:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Noto+Serif:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Inconsolata:500\" type=\"text/css\">\n  <link href=\"css/baseline.css\" rel=\"stylesheet\">\n</head>\n\n<body onload=\"prettyPrint()\">\n  <nav id=\"jsdoc-navbar\" role=\"navigation\" class=\"jsdoc-navbar\">\n    <div id=\"jsdoc-navbar-container\">\n      <div id=\"jsdoc-navbar-content\">\n        <a href=\"index.html\" class=\"jsdoc-navbar-package-name\">whatsapp-web.<wbr>js 1.<wbr>34.<wbr>6</a>\n      </div>\n    </div>\n  </nav>\n  <div id=\"jsdoc-body-container\">\n    <div id=\"jsdoc-content\">\n      <div id=\"jsdoc-content-container\">\n        <div id=\"jsdoc-main\" role=\"main\">\n          <header class=\"page-header\">\n            <div class=\"symbol-detail-labels\"><span class=\"label label-kind\">class</span></div>\n            <h1><small></small><span class=\"symbol-name\">InterfaceController</span></h1>\n            <p class=\"source-link\">Source: <a href=\"util_InterfaceController.js.html#source-line-6\">util/<wbr>InterfaceController.<wbr>js:6</a></p>\n            <div class=\"symbol-classdesc\">\n              <p>Interface Controller</p>\n            </div>\n            <dl class=\"dl-compact\">\n            </dl>\n          </header>\n          <section id=\"summary\">\n            <div class=\"summary-callout\">\n              <h2 class=\"summary-callout-heading\">Methods</h2>\n              <div class=\"summary-content\">\n                <div class=\"summary-column\">\n                  <dl class=\"dl-summary-callout\">\n                    <dt><a href=\"InterfaceController.html#checkFeatureStatus\">checkFeatureStatus(feature)</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"InterfaceController.html#closeRightDrawer\">closeRightDrawer()</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"InterfaceController.html#disableFeatures\">disableFeatures(features)</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"InterfaceController.html#enableFeatures\">enableFeatures(features)</a></dt>\n                    <dd>\n                    </dd>\n                  </dl>\n                </div>\n                <div class=\"summary-column\">\n                  <dl class=\"dl-summary-callout\">\n                    <dt><a href=\"InterfaceController.html#getFeatures\">getFeatures()</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"InterfaceController.html#openChatDrawer\">openChatDrawer(chatId)</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"InterfaceController.html#openChatSearch\">openChatSearch(chatId)</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"InterfaceController.html#openChatWindow\">openChatWindow(chatId)</a></dt>\n                    <dd>\n                    </dd>\n                  </dl>\n                </div>\n                <div class=\"summary-column\">\n                  <dl class=\"dl-summary-callout\">\n                    <dt><a href=\"InterfaceController.html#openChatWindowAt\">openChatWindowAt(msgId)</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"InterfaceController.html#openMessageDrawer\">openMessageDrawer(msgId)</a></dt>\n                    <dd>\n                    </dd>\n                  </dl>\n                </div>\n              </div>\n            </div>\n          </section>\n          <section>\n            <h2 id=\"InterfaceController\">new&nbsp;<span class=\"symbol-name\">InterfaceController</span><span class=\"signature\"><span class=\"signature-params\">()</span></span></h2>\n            <dl class=\"dl-compact\">\n            </dl>\n          </section>\n          <section>\n            <h2>Methods</h2>\n            <section>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"checkFeatureStatus\"><span class=\"symbol-name\">checkFeatureStatus</span><span class=\"signature\"><span class=\"signature-params\">(feature)</span></span></h3>\n              <p>Check if Feature is enabled</p>\n              <section>\n                <h4>Parameter</h4>\n                <table class=\"jsdoc-details-table\">\n                  <thead>\n                    <tr>\n                      <th>Name</th>\n                      <th>Type</th>\n                      <th>Optional</th>\n                      <th>Description</th>\n                    </tr>\n                  </thead>\n                  <tbody>\n                    <tr>\n                      <td>\n                        <p>feature</p>\n                      </td>\n                      <td>\n                        <p>string</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>status to check</p>\n                      </td>\n                    </tr>\n                  </tbody>\n                </table>\n              </section>\n              <dl class=\"dl-compact\">\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"closeRightDrawer\"><span class=\"symbol-name\">closeRightDrawer</span><span class=\"signature\"><span class=\"signature-params\">()</span></span></h3>\n              <p>Closes the Right Drawer</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"disableFeatures\"><span class=\"symbol-name\">disableFeatures</span><span class=\"signature\"><span class=\"signature-params\">(features)</span></span></h3>\n              <p>Disable Features</p>\n              <section>\n                <h4>Parameter</h4>\n                <table class=\"jsdoc-details-table\">\n                  <thead>\n                    <tr>\n                      <th>Name</th>\n                      <th>Type</th>\n                      <th>Optional</th>\n                      <th>Description</th>\n                    </tr>\n                  </thead>\n                  <tbody>\n                    <tr>\n                      <td>\n                        <p>features</p>\n                      </td>\n                      <td>\n                        <p>Array of string</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>to be disabled</p>\n                      </td>\n                    </tr>\n                  </tbody>\n                </table>\n              </section>\n              <dl class=\"dl-compact\">\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"enableFeatures\"><span class=\"symbol-name\">enableFeatures</span><span class=\"signature\"><span class=\"signature-params\">(features)</span></span></h3>\n              <p>Enable Features</p>\n              <section>\n                <h4>Parameter</h4>\n                <table class=\"jsdoc-details-table\">\n                  <thead>\n                    <tr>\n                      <th>Name</th>\n                      <th>Type</th>\n                      <th>Optional</th>\n                      <th>Description</th>\n                    </tr>\n                  </thead>\n                  <tbody>\n                    <tr>\n                      <td>\n                        <p>features</p>\n                      </td>\n                      <td>\n                        <p>Array of string</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>to be enabled</p>\n                      </td>\n                    </tr>\n                  </tbody>\n                </table>\n              </section>\n              <dl class=\"dl-compact\">\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"getFeatures\"><span class=\"symbol-name\">getFeatures</span><span class=\"signature\"><span class=\"signature-params\">()</span></span></h3>\n              <p>Get all Features</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"openChatDrawer\"><span class=\"symbol-name\">openChatDrawer</span><span class=\"signature\"><span class=\"signature-params\">(chatId)</span></span></h3>\n              <p>Opens the Chat Drawer</p>\n              <section>\n                <h4>Parameter</h4>\n                <table class=\"jsdoc-details-table\">\n                  <thead>\n                    <tr>\n                      <th>Name</th>\n                      <th>Type</th>\n                      <th>Optional</th>\n                      <th>Description</th>\n                    </tr>\n                  </thead>\n                  <tbody>\n                    <tr>\n                      <td>\n                        <p>chatId</p>\n                      </td>\n                      <td>\n                        <p>string</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>ID of the chat drawer that will be opened</p>\n                      </td>\n                    </tr>\n                  </tbody>\n                </table>\n              </section>\n              <dl class=\"dl-compact\">\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"openChatSearch\"><span class=\"symbol-name\">openChatSearch</span><span class=\"signature\"><span class=\"signature-params\">(chatId)</span></span></h3>\n              <p>Opens the Chat Search</p>\n              <section>\n                <h4>Parameter</h4>\n                <table class=\"jsdoc-details-table\">\n                  <thead>\n                    <tr>\n                      <th>Name</th>\n                      <th>Type</th>\n                      <th>Optional</th>\n                      <th>Description</th>\n                    </tr>\n                  </thead>\n                  <tbody>\n                    <tr>\n                      <td>\n                        <p>chatId</p>\n                      </td>\n                      <td>\n                        <p>string</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>ID of the chat search that will be opened</p>\n                      </td>\n                    </tr>\n                  </tbody>\n                </table>\n              </section>\n              <dl class=\"dl-compact\">\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"openChatWindow\"><span class=\"symbol-name\">openChatWindow</span><span class=\"signature\"><span class=\"signature-params\">(chatId)</span></span></h3>\n              <p>Opens the Chat Window</p>\n              <section>\n                <h4>Parameter</h4>\n                <table class=\"jsdoc-details-table\">\n                  <thead>\n                    <tr>\n                      <th>Name</th>\n                      <th>Type</th>\n                      <th>Optional</th>\n                      <th>Description</th>\n                    </tr>\n                  </thead>\n                  <tbody>\n                    <tr>\n                      <td>\n                        <p>chatId</p>\n                      </td>\n                      <td>\n                        <p>string</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>ID of the chat window that will be opened</p>\n                      </td>\n                    </tr>\n                  </tbody>\n                </table>\n              </section>\n              <dl class=\"dl-compact\">\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"openChatWindowAt\"><span class=\"symbol-name\">openChatWindowAt</span><span class=\"signature\"><span class=\"signature-params\">(msgId)</span></span></h3>\n              <p>Opens or Scrolls the Chat Window to the position of the message</p>\n              <section>\n                <h4>Parameter</h4>\n                <table class=\"jsdoc-details-table\">\n                  <thead>\n                    <tr>\n                      <th>Name</th>\n                      <th>Type</th>\n                      <th>Optional</th>\n                      <th>Description</th>\n                    </tr>\n                  </thead>\n                  <tbody>\n                    <tr>\n                      <td>\n                        <p>msgId</p>\n                      </td>\n                      <td>\n                        <p>string</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>ID of the message that will be scrolled to</p>\n                      </td>\n                    </tr>\n                  </tbody>\n                </table>\n              </section>\n              <dl class=\"dl-compact\">\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"openMessageDrawer\"><span class=\"symbol-name\">openMessageDrawer</span><span class=\"signature\"><span class=\"signature-params\">(msgId)</span></span></h3>\n              <p>Opens the Message Drawer</p>\n              <section>\n                <h4>Parameter</h4>\n                <table class=\"jsdoc-details-table\">\n                  <thead>\n                    <tr>\n                      <th>Name</th>\n                      <th>Type</th>\n                      <th>Optional</th>\n                      <th>Description</th>\n                    </tr>\n                  </thead>\n                  <tbody>\n                    <tr>\n                      <td>\n                        <p>msgId</p>\n                      </td>\n                      <td>\n                        <p>string</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>ID of the message drawer that will be opened</p>\n                      </td>\n                    </tr>\n                  </tbody>\n                </table>\n              </section>\n              <dl class=\"dl-compact\">\n              </dl>\n            </section>\n          </section>\n        </div>\n      </div>\n      <nav id=\"jsdoc-toc-nav\" role=\"navigation\"></nav>\n    </div>\n  </div>\n  <footer id=\"jsdoc-footer\" class=\"jsdoc-footer\">\n    <div id=\"jsdoc-footer-container\">\n      <p>\n        Generated by <a href=\"https://github.com/jsdoc3/jsdoc\">JSDoc</a> 3.6.11 on January 30, 2026.\n      </p>\n    </div>\n  </footer>\n  <script src=\"scripts/jquery.min.js\"></script>\n  <script src=\"scripts/tree.jquery.js\"></script>\n  <script src=\"scripts/prettify.js\"></script>\n  <script src=\"scripts/jsdoc-toc.js\"></script>\n  <script src=\"scripts/linenumber.js\"></script>\n  <script src=\"scripts/scrollanchor.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "docs/Label.html",
    "content": "<!doctype html>\n<html>\n\n<head>\n  <meta name=\"generator\" content=\"JSDoc 3.6.11\">\n  <meta charset=\"utf-8\">\n  <title>whatsapp-web.js 1.34.6 &raquo; Class: Label</title>\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Karla:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Noto+Serif:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Inconsolata:500\" type=\"text/css\">\n  <link href=\"css/baseline.css\" rel=\"stylesheet\">\n</head>\n\n<body onload=\"prettyPrint()\">\n  <nav id=\"jsdoc-navbar\" role=\"navigation\" class=\"jsdoc-navbar\">\n    <div id=\"jsdoc-navbar-container\">\n      <div id=\"jsdoc-navbar-content\">\n        <a href=\"index.html\" class=\"jsdoc-navbar-package-name\">whatsapp-web.<wbr>js 1.<wbr>34.<wbr>6</a>\n      </div>\n    </div>\n  </nav>\n  <div id=\"jsdoc-body-container\">\n    <div id=\"jsdoc-content\">\n      <div id=\"jsdoc-content-container\">\n        <div id=\"jsdoc-main\" role=\"main\">\n          <header class=\"page-header\">\n            <div class=\"symbol-detail-labels\"><span class=\"label label-kind\">class</span></div>\n            <h1><small></small><span class=\"symbol-name\">Label</span></h1>\n            <p class=\"source-link\">Source: <a href=\"structures_Label.js.html#source-line-10\">structures/<wbr>Label.<wbr>js:10</a></p>\n            <div class=\"symbol-classdesc\">\n              <p>WhatsApp Business Label information</p>\n            </div>\n            <dl class=\"dl-compact\">\n            </dl>\n          </header>\n          <section id=\"summary\">\n            <div class=\"summary-callout\">\n              <h2 class=\"summary-callout-heading\">Properties</h2>\n              <div class=\"summary-content\">\n                <div class=\"summary-column\">\n                  <dl class=\"dl-summary-callout\">\n                    <dt><a href=\"Label.html#hexColor\">hexColor</a></dt>\n                    <dd>\n                    </dd>\n                  </dl>\n                </div>\n                <div class=\"summary-column\">\n                  <dl class=\"dl-summary-callout\">\n                    <dt><a href=\"Label.html#id\">id</a></dt>\n                    <dd>\n                    </dd>\n                  </dl>\n                </div>\n                <div class=\"summary-column\">\n                  <dl class=\"dl-summary-callout\">\n                    <dt><a href=\"Label.html#name\">name</a></dt>\n                    <dd>\n                    </dd>\n                  </dl>\n                </div>\n              </div>\n            </div>\n            <div class=\"summary-callout\">\n              <h2 class=\"summary-callout-heading\">Method</h2>\n              <div class=\"summary-content\">\n                <div class=\"summary-column\">\n                  <dl class=\"dl-summary-callout\">\n                    <dt><a href=\"Label.html#getChats\">getChats()</a></dt>\n                    <dd>\n                    </dd>\n                  </dl>\n                </div>\n                <div class=\"summary-column\">\n                </div>\n                <div class=\"summary-column\">\n                </div>\n              </div>\n            </div>\n          </section>\n          <section>\n            <h2 id=\"Label\">new&nbsp;<span class=\"symbol-name\">Label</span><span class=\"signature\"><span class=\"signature-params\">(client, labelData)</span></span></h2>\n            <section>\n              <h3>Parameters</h3>\n              <table class=\"jsdoc-details-table\">\n                <thead>\n                  <tr>\n                    <th>Name</th>\n                    <th>Type</th>\n                    <th>Optional</th>\n                    <th>Description</th>\n                  </tr>\n                </thead>\n                <tbody>\n                  <tr>\n                    <td>\n                      <p>client</p>\n                    </td>\n                    <td>\n                      <p>&nbsp;</p>\n                    </td>\n                    <td>\n                      <p>&nbsp;</p>\n                    </td>\n                    <td>\n                    </td>\n                  </tr>\n                  <tr>\n                    <td>\n                      <p>labelData</p>\n                    </td>\n                    <td>\n                      <p>&nbsp;</p>\n                    </td>\n                    <td>\n                      <p>&nbsp;</p>\n                    </td>\n                    <td>\n                    </td>\n                  </tr>\n                </tbody>\n              </table>\n            </section>\n            <dl class=\"dl-compact\">\n            </dl>\n          </section>\n          <section>\n            <h2>Properties</h2>\n            <section>\n              <h3 id=\"hexColor\"><span class=\"symbol-name\">hexColor</span><small class=\"property-type\">\n                  &nbsp;string</small></h3>\n              <p>Label hex color</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"id\"><span class=\"symbol-name\">id</span><small class=\"property-type\">\n                  &nbsp;string</small></h3>\n              <p>Label ID</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"name\"><span class=\"symbol-name\">name</span><small class=\"property-type\">\n                  &nbsp;string</small></h3>\n              <p>Label name</p>\n              <dl class=\"dl-compact\">\n              </dl>\n            </section>\n            <h2>Method</h2>\n            <section>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"getChats\"><span class=\"symbol-name\">getChats</span><span class=\"signature\"><span class=\"signature-params\">()</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing Array of <a href=\"Chat.html\">Chat</a></span></span></h3>\n              <p>Get all chats that have been assigned this Label</p>\n              <dl class=\"dl-compact\">\n                <dt>Returns</dt>\n                <dd>\n                  <p><code>Promise containing Array of <a href=\"Chat.html\">Chat</a></code> </p>\n                </dd>\n              </dl>\n            </section>\n          </section>\n        </div>\n      </div>\n      <nav id=\"jsdoc-toc-nav\" role=\"navigation\"></nav>\n    </div>\n  </div>\n  <footer id=\"jsdoc-footer\" class=\"jsdoc-footer\">\n    <div id=\"jsdoc-footer-container\">\n      <p>\n        Generated by <a href=\"https://github.com/jsdoc3/jsdoc\">JSDoc</a> 3.6.11 on January 30, 2026.\n      </p>\n    </div>\n  </footer>\n  <script src=\"scripts/jquery.min.js\"></script>\n  <script src=\"scripts/tree.jquery.js\"></script>\n  <script src=\"scripts/prettify.js\"></script>\n  <script src=\"scripts/jsdoc-toc.js\"></script>\n  <script src=\"scripts/linenumber.js\"></script>\n  <script src=\"scripts/scrollanchor.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "docs/LegacySessionAuth.html",
    "content": "<!doctype html>\n<html>\n\n<head>\n  <meta name=\"generator\" content=\"JSDoc 3.6.11\">\n  <meta charset=\"utf-8\">\n  <title>whatsapp-web.js 1.23.0 &raquo; Class: LegacySessionAuth</title>\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Karla:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Noto+Serif:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Inconsolata:500\" type=\"text/css\">\n  <link href=\"css/baseline.css\" rel=\"stylesheet\">\n</head>\n\n<body onload=\"prettyPrint()\">\n  <nav id=\"jsdoc-navbar\" role=\"navigation\" class=\"jsdoc-navbar\">\n    <div id=\"jsdoc-navbar-container\">\n      <div id=\"jsdoc-navbar-content\">\n        <a href=\"index.html\" class=\"jsdoc-navbar-package-name\">whatsapp-web.<wbr>js 1.<wbr>23.<wbr>0</a>\n      </div>\n    </div>\n  </nav>\n  <div id=\"jsdoc-body-container\">\n    <div id=\"jsdoc-content\">\n      <div id=\"jsdoc-content-container\">\n        <div id=\"jsdoc-main\" role=\"main\">\n          <header class=\"page-header\">\n            <div class=\"symbol-detail-labels\"><span class=\"label label-kind\">class</span></div>\n            <h1><small></small><span class=\"symbol-name\">LegacySessionAuth</span></h1>\n            <p class=\"source-link\">Source: <a href=\"authStrategies_LegacySessionAuth.js.html#source-line-16\">authStrategies/<wbr>LegacySessionAuth.<wbr>js:16</a></p>\n            <div class=\"symbol-classdesc\">\n              <p>Legacy session auth strategy\n                Not compatible with multi-device accounts.</p>\n            </div>\n            <dl class=\"dl-compact\">\n            </dl>\n          </header>\n          <section id=\"summary\">\n          </section>\n          <section>\n            <h2 id=\"LegacySessionAuth\">new&nbsp;<span class=\"symbol-name\">LegacySessionAuth</span><span class=\"signature\"><span class=\"signature-params\">(options)</span></span></h2>\n            <section>\n              <h3>Parameters</h3>\n              <table class=\"jsdoc-details-table\">\n                <thead>\n                  <tr>\n                    <th>Name</th>\n                    <th>Type</th>\n                    <th>Optional</th>\n                    <th>Description</th>\n                  </tr>\n                </thead>\n                <tbody>\n                  <tr>\n                    <td>\n                      <p>options</p>\n                    </td>\n                    <td>\n                      <p>&nbsp;</p>\n                    </td>\n                    <td>\n                      <p>&nbsp;</p>\n                    </td>\n                    <td>\n                      <p>options</p>\n                      <p>Values in <code>options</code> have the following properties:</p>\n                      <table class=\"jsdoc-details-table\">\n                        <thead>\n                          <tr>\n                            <th>Name</th>\n                            <th>Type</th>\n                            <th>Optional</th>\n                            <th>Description</th>\n                          </tr>\n                        </thead>\n                        <tbody>\n                          <tr>\n                            <td>\n                              <p>restartOnAuthFail</p>\n                            </td>\n                            <td>\n                              <p>&nbsp;</p>\n                            </td>\n                            <td>\n                              <p>&nbsp;</p>\n                            </td>\n                            <td>\n                              <p>Restart client with a new session (i.e. use null 'session' var) if authentication fails</p>\n                            </td>\n                          </tr>\n                          <tr>\n                            <td>\n                              <p>session</p>\n                            </td>\n                            <td>\n                              <p>&nbsp;</p>\n                            </td>\n                            <td>\n                              <p>&nbsp;</p>\n                            </td>\n                            <td>\n                              <p>Whatsapp session to restore. If not set, will start a new session</p>\n                            </td>\n                          </tr>\n                          <tr>\n                            <td>\n                              <p>session.WABrowserId</p>\n                            </td>\n                            <td>\n                              <p>&nbsp;</p>\n                            </td>\n                            <td>\n                              <p>&nbsp;</p>\n                            </td>\n                            <td>\n                            </td>\n                          </tr>\n                          <tr>\n                            <td>\n                              <p>session.WASecretBundle</p>\n                            </td>\n                            <td>\n                              <p>&nbsp;</p>\n                            </td>\n                            <td>\n                              <p>&nbsp;</p>\n                            </td>\n                            <td>\n                            </td>\n                          </tr>\n                          <tr>\n                            <td>\n                              <p>session.WAToken1</p>\n                            </td>\n                            <td>\n                              <p>&nbsp;</p>\n                            </td>\n                            <td>\n                              <p>&nbsp;</p>\n                            </td>\n                            <td>\n                            </td>\n                          </tr>\n                          <tr>\n                            <td>\n                              <p>session.WAToken2</p>\n                            </td>\n                            <td>\n                              <p>&nbsp;</p>\n                            </td>\n                            <td>\n                              <p>&nbsp;</p>\n                            </td>\n                            <td>\n                            </td>\n                          </tr>\n                        </tbody>\n                      </table>\n                    </td>\n                  </tr>\n                </tbody>\n              </table>\n            </section>\n            <dl class=\"dl-compact\">\n            </dl>\n          </section>\n          <section>\n          </section>\n        </div>\n      </div>\n      <nav id=\"jsdoc-toc-nav\" role=\"navigation\"></nav>\n    </div>\n  </div>\n  <footer id=\"jsdoc-footer\" class=\"jsdoc-footer\">\n    <div id=\"jsdoc-footer-container\">\n      <p>\n        Generated by <a href=\"https://github.com/jsdoc3/jsdoc\">JSDoc</a> 3.6.11 on October 21, 2023.\n      </p>\n    </div>\n  </footer>\n  <script src=\"scripts/jquery.min.js\"></script>\n  <script src=\"scripts/tree.jquery.js\"></script>\n  <script src=\"scripts/prettify.js\"></script>\n  <script src=\"scripts/jsdoc-toc.js\"></script>\n  <script src=\"scripts/linenumber.js\"></script>\n  <script src=\"scripts/scrollanchor.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "docs/List.html",
    "content": "<!doctype html>\n<html>\n\n<head>\n  <meta name=\"generator\" content=\"JSDoc 3.6.11\">\n  <meta charset=\"utf-8\">\n  <title>whatsapp-web.js 1.34.6 &raquo; Class: List</title>\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Karla:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Noto+Serif:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Inconsolata:500\" type=\"text/css\">\n  <link href=\"css/baseline.css\" rel=\"stylesheet\">\n</head>\n\n<body onload=\"prettyPrint()\">\n  <nav id=\"jsdoc-navbar\" role=\"navigation\" class=\"jsdoc-navbar\">\n    <div id=\"jsdoc-navbar-container\">\n      <div id=\"jsdoc-navbar-content\">\n        <a href=\"index.html\" class=\"jsdoc-navbar-package-name\">whatsapp-web.<wbr>js 1.<wbr>34.<wbr>6</a>\n      </div>\n    </div>\n  </nav>\n  <div id=\"jsdoc-body-container\">\n    <div id=\"jsdoc-content\">\n      <div id=\"jsdoc-content-container\">\n        <div id=\"jsdoc-main\" role=\"main\">\n          <header class=\"page-header\">\n            <div class=\"symbol-detail-labels\"><span class=\"label label-kind\">class</span></div>\n            <h1><small></small><span class=\"symbol-name\">List</span></h1>\n            <p class=\"source-link\">Source: <a href=\"structures_List.js.html#source-line-8\">structures/<wbr>List.<wbr>js:8</a></p>\n            <div class=\"symbol-classdesc\">\n              <p>Message type List</p>\n            </div>\n            <dl class=\"dl-compact\">\n            </dl>\n          </header>\n          <section id=\"summary\">\n            <div class=\"summary-callout\">\n              <h2 class=\"summary-callout-heading\">Properties</h2>\n              <div class=\"summary-content\">\n                <div class=\"summary-column\">\n                  <dl class=\"dl-summary-callout\">\n                    <dt><a href=\"List.html#buttonText\">buttonText</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"List.html#description\">description</a></dt>\n                    <dd>\n                    </dd>\n                  </dl>\n                </div>\n                <div class=\"summary-column\">\n                  <dl class=\"dl-summary-callout\">\n                    <dt><a href=\"List.html#footer\">footer</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"List.html#sections\">sections</a></dt>\n                    <dd>\n                    </dd>\n                  </dl>\n                </div>\n                <div class=\"summary-column\">\n                  <dl class=\"dl-summary-callout\">\n                    <dt><a href=\"List.html#title\">title</a></dt>\n                    <dd>\n                    </dd>\n                  </dl>\n                </div>\n              </div>\n            </div>\n            <div class=\"summary-callout\">\n              <h2 class=\"summary-callout-heading\">Method</h2>\n              <div class=\"summary-content\">\n                <div class=\"summary-column\">\n                  <dl class=\"dl-summary-callout\">\n                    <dt><a href=\"List.html#_format\">_format(sections)</a></dt>\n                    <dd>\n                    </dd>\n                  </dl>\n                </div>\n                <div class=\"summary-column\">\n                </div>\n                <div class=\"summary-column\">\n                </div>\n              </div>\n            </div>\n          </section>\n          <section>\n            <h2 id=\"List\">new&nbsp;<span class=\"symbol-name\">List</span><span class=\"signature\"><span class=\"signature-params\">(body, buttonText, sections, title, footer)</span></span></h2>\n            <section>\n              <h3>Parameters</h3>\n              <table class=\"jsdoc-details-table\">\n                <thead>\n                  <tr>\n                    <th>Name</th>\n                    <th>Type</th>\n                    <th>Optional</th>\n                    <th>Description</th>\n                  </tr>\n                </thead>\n                <tbody>\n                  <tr>\n                    <td>\n                      <p>body</p>\n                    </td>\n                    <td>\n                      <p>&nbsp;</p>\n                    </td>\n                    <td>\n                      <p>&nbsp;</p>\n                    </td>\n                    <td>\n                    </td>\n                  </tr>\n                  <tr>\n                    <td>\n                      <p>buttonText</p>\n                    </td>\n                    <td>\n                      <p>&nbsp;</p>\n                    </td>\n                    <td>\n                      <p>&nbsp;</p>\n                    </td>\n                    <td>\n                    </td>\n                  </tr>\n                  <tr>\n                    <td>\n                      <p>sections</p>\n                    </td>\n                    <td>\n                      <p>&nbsp;</p>\n                    </td>\n                    <td>\n                      <p>&nbsp;</p>\n                    </td>\n                    <td>\n                    </td>\n                  </tr>\n                  <tr>\n                    <td>\n                      <p>title</p>\n                    </td>\n                    <td>\n                      <p>&nbsp;</p>\n                    </td>\n                    <td>\n                      <p>&nbsp;</p>\n                    </td>\n                    <td>\n                      <p>Value can be null.</p>\n                    </td>\n                  </tr>\n                  <tr>\n                    <td>\n                      <p>footer</p>\n                    </td>\n                    <td>\n                      <p>&nbsp;</p>\n                    </td>\n                    <td>\n                      <p>&nbsp;</p>\n                    </td>\n                    <td>\n                      <p>Value can be null.</p>\n                    </td>\n                  </tr>\n                </tbody>\n              </table>\n            </section>\n            <dl class=\"dl-compact\">\n            </dl>\n          </section>\n          <section>\n            <h2>Properties</h2>\n            <section>\n              <h3 id=\"buttonText\"><span class=\"symbol-name\">buttonText</span><small class=\"property-type\">\n                  &nbsp;string</small></h3>\n              <p>List button text</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"description\"><span class=\"symbol-name\">description</span><small class=\"property-type\">\n                  &nbsp;string</small></h3>\n              <p>Message body</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"footer\"><span class=\"symbol-name\">footer</span><small class=\"property-type\">\n                  &nbsp;string</small></h3>\n              <p>footer of message</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"sections\"><span class=\"symbol-name\">sections</span><small class=\"property-type\">\n                  &nbsp;Array of any</small></h3>\n              <p>sections of message</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"title\"><span class=\"symbol-name\">title</span><small class=\"property-type\">\n                  &nbsp;string</small></h3>\n              <p>title of message</p>\n              <dl class=\"dl-compact\">\n              </dl>\n            </section>\n            <h2>Method</h2>\n            <section>\n              <h3 id=\"_format\"><span class=\"symbol-name\">_format</span><span class=\"signature\"><span class=\"signature-params\">(sections)</span>&nbsp;&rarr; <span class=\"signature-returns\"> Array of any</span></span></h3>\n              <p>Creates section array from simple array</p>\n              <section>\n                <h4>\n                  Example\n                </h4>\n                <div>\n                  <pre class=\"prettyprint\"><code>Input: [{title:&#x27;sectionTitle&#x27;,rows:[{id:&#x27;customId&#x27;, title:&#x27;ListItem2&#x27;, description: &#x27;desc&#x27;},{title:&#x27;ListItem2&#x27;}]}}]\nReturns: [{&#x27;title&#x27;:&#x27;sectionTitle&#x27;,&#x27;rows&#x27;:[{&#x27;rowId&#x27;:&#x27;customId&#x27;,&#x27;title&#x27;:&#x27;ListItem1&#x27;,&#x27;description&#x27;:&#x27;desc&#x27;},{&#x27;rowId&#x27;:&#x27;oGSRoD&#x27;,&#x27;title&#x27;:&#x27;ListItem2&#x27;,&#x27;description&#x27;:&#x27;&#x27;}]}]</code></pre>\n                </div>\n              </section>\n              <section>\n                <h4>Parameter</h4>\n                <table class=\"jsdoc-details-table\">\n                  <thead>\n                    <tr>\n                      <th>Name</th>\n                      <th>Type</th>\n                      <th>Optional</th>\n                      <th>Description</th>\n                    </tr>\n                  </thead>\n                  <tbody>\n                    <tr>\n                      <td>\n                        <p>sections</p>\n                      </td>\n                      <td>\n                        <p>Array of any</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                  </tbody>\n                </table>\n              </section>\n              <dl class=\"dl-compact\">\n                <dt>Returns</dt>\n                <dd>\n                  <p><code>Array of any</code> </p>\n                </dd>\n              </dl>\n            </section>\n          </section>\n        </div>\n      </div>\n      <nav id=\"jsdoc-toc-nav\" role=\"navigation\"></nav>\n    </div>\n  </div>\n  <footer id=\"jsdoc-footer\" class=\"jsdoc-footer\">\n    <div id=\"jsdoc-footer-container\">\n      <p>\n        Generated by <a href=\"https://github.com/jsdoc3/jsdoc\">JSDoc</a> 3.6.11 on January 30, 2026.\n      </p>\n    </div>\n  </footer>\n  <script src=\"scripts/jquery.min.js\"></script>\n  <script src=\"scripts/tree.jquery.js\"></script>\n  <script src=\"scripts/prettify.js\"></script>\n  <script src=\"scripts/jsdoc-toc.js\"></script>\n  <script src=\"scripts/linenumber.js\"></script>\n  <script src=\"scripts/scrollanchor.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "docs/LocalAuth.html",
    "content": "<!doctype html>\n<html>\n\n<head>\n  <meta name=\"generator\" content=\"JSDoc 3.6.11\">\n  <meta charset=\"utf-8\">\n  <title>whatsapp-web.js 1.34.6 &raquo; Class: LocalAuth</title>\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Karla:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Noto+Serif:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Inconsolata:500\" type=\"text/css\">\n  <link href=\"css/baseline.css\" rel=\"stylesheet\">\n</head>\n\n<body onload=\"prettyPrint()\">\n  <nav id=\"jsdoc-navbar\" role=\"navigation\" class=\"jsdoc-navbar\">\n    <div id=\"jsdoc-navbar-container\">\n      <div id=\"jsdoc-navbar-content\">\n        <a href=\"index.html\" class=\"jsdoc-navbar-package-name\">whatsapp-web.<wbr>js 1.<wbr>34.<wbr>6</a>\n      </div>\n    </div>\n  </nav>\n  <div id=\"jsdoc-body-container\">\n    <div id=\"jsdoc-content\">\n      <div id=\"jsdoc-content-container\">\n        <div id=\"jsdoc-main\" role=\"main\">\n          <header class=\"page-header\">\n            <div class=\"symbol-detail-labels\"><span class=\"label label-kind\">class</span></div>\n            <h1><small></small><span class=\"symbol-name\">LocalAuth</span></h1>\n            <p class=\"source-link\">Source: <a href=\"authStrategies_LocalAuth.js.html#source-line-14\">authStrategies/<wbr>LocalAuth.<wbr>js:14</a></p>\n            <div class=\"symbol-classdesc\">\n              <p>Local directory-based authentication</p>\n            </div>\n            <dl class=\"dl-compact\">\n            </dl>\n          </header>\n          <section id=\"summary\">\n          </section>\n          <section>\n            <h2 id=\"LocalAuth\">new&nbsp;<span class=\"symbol-name\">LocalAuth</span><span class=\"signature\"><span class=\"signature-params\">(options)</span></span></h2>\n            <section>\n              <h3>Parameters</h3>\n              <table class=\"jsdoc-details-table\">\n                <thead>\n                  <tr>\n                    <th>Name</th>\n                    <th>Type</th>\n                    <th>Optional</th>\n                    <th>Description</th>\n                  </tr>\n                </thead>\n                <tbody>\n                  <tr>\n                    <td>\n                      <p>options</p>\n                    </td>\n                    <td>\n                      <p>&nbsp;</p>\n                    </td>\n                    <td>\n                      <p>&nbsp;</p>\n                    </td>\n                    <td>\n                      <p>options</p>\n                      <p>Values in <code>options</code> have the following properties:</p>\n                      <table class=\"jsdoc-details-table\">\n                        <thead>\n                          <tr>\n                            <th>Name</th>\n                            <th>Type</th>\n                            <th>Optional</th>\n                            <th>Description</th>\n                          </tr>\n                        </thead>\n                        <tbody>\n                          <tr>\n                            <td>\n                              <p>clientId</p>\n                            </td>\n                            <td>\n                              <p>&nbsp;</p>\n                            </td>\n                            <td>\n                              <p>&nbsp;</p>\n                            </td>\n                            <td>\n                              <p>Client id to distinguish instances if you are using multiple, otherwise keep null if you are using only one instance</p>\n                            </td>\n                          </tr>\n                          <tr>\n                            <td>\n                              <p>dataPath</p>\n                            </td>\n                            <td>\n                              <p>&nbsp;</p>\n                            </td>\n                            <td>\n                              <p>&nbsp;</p>\n                            </td>\n                            <td>\n                              <p>Change the default path for saving session files, default is: &quot;./.wwebjs_auth/&quot;</p>\n                            </td>\n                          </tr>\n                          <tr>\n                            <td>\n                              <p>rmMaxRetries</p>\n                            </td>\n                            <td>\n                              <p>&nbsp;</p>\n                            </td>\n                            <td>\n                              <p>&nbsp;</p>\n                            </td>\n                            <td>\n                              <p>Sets the maximum number of retries for removing the session directory</p>\n                            </td>\n                          </tr>\n                        </tbody>\n                      </table>\n                    </td>\n                  </tr>\n                </tbody>\n              </table>\n            </section>\n            <dl class=\"dl-compact\">\n            </dl>\n          </section>\n          <section>\n          </section>\n        </div>\n      </div>\n      <nav id=\"jsdoc-toc-nav\" role=\"navigation\"></nav>\n    </div>\n  </div>\n  <footer id=\"jsdoc-footer\" class=\"jsdoc-footer\">\n    <div id=\"jsdoc-footer-container\">\n      <p>\n        Generated by <a href=\"https://github.com/jsdoc3/jsdoc\">JSDoc</a> 3.6.11 on January 30, 2026.\n      </p>\n    </div>\n  </footer>\n  <script src=\"scripts/jquery.min.js\"></script>\n  <script src=\"scripts/tree.jquery.js\"></script>\n  <script src=\"scripts/prettify.js\"></script>\n  <script src=\"scripts/jsdoc-toc.js\"></script>\n  <script src=\"scripts/linenumber.js\"></script>\n  <script src=\"scripts/scrollanchor.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "docs/LocalWebCache.html",
    "content": "<!doctype html>\n<html>\n\n<head>\n  <meta name=\"generator\" content=\"JSDoc 3.6.11\">\n  <meta charset=\"utf-8\">\n  <title>whatsapp-web.js 1.34.6 &raquo; Class: LocalWebCache</title>\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Karla:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Noto+Serif:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Inconsolata:500\" type=\"text/css\">\n  <link href=\"css/baseline.css\" rel=\"stylesheet\">\n</head>\n\n<body onload=\"prettyPrint()\">\n  <nav id=\"jsdoc-navbar\" role=\"navigation\" class=\"jsdoc-navbar\">\n    <div id=\"jsdoc-navbar-container\">\n      <div id=\"jsdoc-navbar-content\">\n        <a href=\"index.html\" class=\"jsdoc-navbar-package-name\">whatsapp-web.<wbr>js 1.<wbr>34.<wbr>6</a>\n      </div>\n    </div>\n  </nav>\n  <div id=\"jsdoc-body-container\">\n    <div id=\"jsdoc-content\">\n      <div id=\"jsdoc-content-container\">\n        <div id=\"jsdoc-main\" role=\"main\">\n          <header class=\"page-header\">\n            <div class=\"symbol-detail-labels\"><span class=\"label label-kind\">class</span></div>\n            <h1><small></small><span class=\"symbol-name\">LocalWebCache</span></h1>\n            <p class=\"source-link\">Source: <a href=\"webCache_LocalWebCache.js.html#source-line-12\">webCache/<wbr>LocalWebCache.<wbr>js:12</a></p>\n            <div class=\"symbol-classdesc\">\n              <p>LocalWebCache - Fetches a WhatsApp Web version from a local file store</p>\n            </div>\n            <dl class=\"dl-compact\">\n            </dl>\n          </header>\n          <section id=\"summary\">\n          </section>\n          <section>\n            <h2 id=\"LocalWebCache\">new&nbsp;<span class=\"symbol-name\">LocalWebCache</span><span class=\"signature\"><span class=\"signature-params\">(options)</span></span></h2>\n            <section>\n              <h3>Parameters</h3>\n              <table class=\"jsdoc-details-table\">\n                <thead>\n                  <tr>\n                    <th>Name</th>\n                    <th>Type</th>\n                    <th>Optional</th>\n                    <th>Description</th>\n                  </tr>\n                </thead>\n                <tbody>\n                  <tr>\n                    <td>\n                      <p>options</p>\n                    </td>\n                    <td>\n                      <p>&nbsp;</p>\n                    </td>\n                    <td>\n                      <p>&nbsp;</p>\n                    </td>\n                    <td>\n                      <p>options</p>\n                      <p>Values in <code>options</code> have the following properties:</p>\n                      <table class=\"jsdoc-details-table\">\n                        <thead>\n                          <tr>\n                            <th>Name</th>\n                            <th>Type</th>\n                            <th>Optional</th>\n                            <th>Description</th>\n                          </tr>\n                        </thead>\n                        <tbody>\n                          <tr>\n                            <td>\n                              <p>path</p>\n                            </td>\n                            <td>\n                              <p>&nbsp;</p>\n                            </td>\n                            <td>\n                              <p>&nbsp;</p>\n                            </td>\n                            <td>\n                              <p>Path to the directory where cached versions are saved, default is: &quot;./.wwebjs_cache/&quot;</p>\n                            </td>\n                          </tr>\n                          <tr>\n                            <td>\n                              <p>strict</p>\n                            </td>\n                            <td>\n                              <p>&nbsp;</p>\n                            </td>\n                            <td>\n                              <p>&nbsp;</p>\n                            </td>\n                            <td>\n                              <p>If true, will throw an error if the requested version can't be fetched. If false, will resolve to the latest version.</p>\n                            </td>\n                          </tr>\n                        </tbody>\n                      </table>\n                    </td>\n                  </tr>\n                </tbody>\n              </table>\n            </section>\n            <dl class=\"dl-compact\">\n            </dl>\n          </section>\n          <section>\n          </section>\n        </div>\n      </div>\n      <nav id=\"jsdoc-toc-nav\" role=\"navigation\"></nav>\n    </div>\n  </div>\n  <footer id=\"jsdoc-footer\" class=\"jsdoc-footer\">\n    <div id=\"jsdoc-footer-container\">\n      <p>\n        Generated by <a href=\"https://github.com/jsdoc3/jsdoc\">JSDoc</a> 3.6.11 on January 30, 2026.\n      </p>\n    </div>\n  </footer>\n  <script src=\"scripts/jquery.min.js\"></script>\n  <script src=\"scripts/tree.jquery.js\"></script>\n  <script src=\"scripts/prettify.js\"></script>\n  <script src=\"scripts/jsdoc-toc.js\"></script>\n  <script src=\"scripts/linenumber.js\"></script>\n  <script src=\"scripts/scrollanchor.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "docs/Location.html",
    "content": "<!doctype html>\n<html>\n\n<head>\n  <meta name=\"generator\" content=\"JSDoc 3.6.11\">\n  <meta charset=\"utf-8\">\n  <title>whatsapp-web.js 1.34.6 &raquo; Class: Location</title>\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Karla:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Noto+Serif:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Inconsolata:500\" type=\"text/css\">\n  <link href=\"css/baseline.css\" rel=\"stylesheet\">\n</head>\n\n<body onload=\"prettyPrint()\">\n  <nav id=\"jsdoc-navbar\" role=\"navigation\" class=\"jsdoc-navbar\">\n    <div id=\"jsdoc-navbar-container\">\n      <div id=\"jsdoc-navbar-content\">\n        <a href=\"index.html\" class=\"jsdoc-navbar-package-name\">whatsapp-web.<wbr>js 1.<wbr>34.<wbr>6</a>\n      </div>\n    </div>\n  </nav>\n  <div id=\"jsdoc-body-container\">\n    <div id=\"jsdoc-content\">\n      <div id=\"jsdoc-content-container\">\n        <div id=\"jsdoc-main\" role=\"main\">\n          <header class=\"page-header\">\n            <div class=\"symbol-detail-labels\"><span class=\"label label-kind\">class</span></div>\n            <h1><small></small><span class=\"symbol-name\">Location</span></h1>\n            <p class=\"source-link\">Source: <a href=\"structures_Location.js.html#source-line-15\">structures/<wbr>Location.<wbr>js:15</a></p>\n            <div class=\"symbol-classdesc\">\n              <p>Location information</p>\n            </div>\n            <dl class=\"dl-compact\">\n            </dl>\n          </header>\n          <section id=\"summary\">\n            <div class=\"summary-callout\">\n              <h2 class=\"summary-callout-heading\">Properties</h2>\n              <div class=\"summary-content\">\n                <div class=\"summary-column\">\n                  <dl class=\"dl-summary-callout\">\n                    <dt><a href=\"Location.html#address\">address</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Location.html#description\">description</a></dt>\n                    <dd>\n                    </dd>\n                  </dl>\n                </div>\n                <div class=\"summary-column\">\n                  <dl class=\"dl-summary-callout\">\n                    <dt><a href=\"Location.html#latitude\">latitude</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Location.html#longitude\">longitude</a></dt>\n                    <dd>\n                    </dd>\n                  </dl>\n                </div>\n                <div class=\"summary-column\">\n                  <dl class=\"dl-summary-callout\">\n                    <dt><a href=\"Location.html#name\">name</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Location.html#url\">url</a></dt>\n                    <dd>\n                    </dd>\n                  </dl>\n                </div>\n              </div>\n            </div>\n          </section>\n          <section>\n            <h2 id=\"Location\">new&nbsp;<span class=\"symbol-name\">Location</span><span class=\"signature\"><span class=\"signature-params\">(latitude, longitude[, options])</span></span></h2>\n            <section>\n              <h3>Parameters</h3>\n              <table class=\"jsdoc-details-table\">\n                <thead>\n                  <tr>\n                    <th>Name</th>\n                    <th>Type</th>\n                    <th>Optional</th>\n                    <th>Description</th>\n                  </tr>\n                </thead>\n                <tbody>\n                  <tr>\n                    <td>\n                      <p>latitude</p>\n                    </td>\n                    <td>\n                      <p>&nbsp;</p>\n                    </td>\n                    <td>\n                      <p>&nbsp;</p>\n                    </td>\n                    <td>\n                    </td>\n                  </tr>\n                  <tr>\n                    <td>\n                      <p>longitude</p>\n                    </td>\n                    <td>\n                      <p>&nbsp;</p>\n                    </td>\n                    <td>\n                      <p>&nbsp;</p>\n                    </td>\n                    <td>\n                    </td>\n                  </tr>\n                  <tr>\n                    <td>\n                      <p>options</p>\n                    </td>\n                    <td>\n                      <p>&nbsp;</p>\n                    </td>\n                    <td>\n                      <p>Yes</p>\n                    </td>\n                    <td>\n                      <p>Location send options</p>\n                    </td>\n                  </tr>\n                </tbody>\n              </table>\n            </section>\n            <dl class=\"dl-compact\">\n            </dl>\n          </section>\n          <section>\n            <h2>Properties</h2>\n            <section>\n              <h3 id=\"address\"><span class=\"symbol-name\">address</span><small class=\"property-type\">\n                  &nbsp;(string or undefined)</small></h3>\n              <p>Location address</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"description\"><span class=\"symbol-name\">description</span><small class=\"property-type\">\n                  &nbsp;(string or undefined)</small></h3>\n              <p>Location full description</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"latitude\"><span class=\"symbol-name\">latitude</span><small class=\"property-type\">\n                  &nbsp;number</small></h3>\n              <p>Location latitude</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"longitude\"><span class=\"symbol-name\">longitude</span><small class=\"property-type\">\n                  &nbsp;number</small></h3>\n              <p>Location longitude</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"name\"><span class=\"symbol-name\">name</span><small class=\"property-type\">\n                  &nbsp;(string or undefined)</small></h3>\n              <p>Name for the location</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"url\"><span class=\"symbol-name\">url</span><small class=\"property-type\">\n                  &nbsp;(string or undefined)</small></h3>\n              <p>URL address to be shown within a location message</p>\n              <dl class=\"dl-compact\">\n              </dl>\n            </section>\n          </section>\n        </div>\n      </div>\n      <nav id=\"jsdoc-toc-nav\" role=\"navigation\"></nav>\n    </div>\n  </div>\n  <footer id=\"jsdoc-footer\" class=\"jsdoc-footer\">\n    <div id=\"jsdoc-footer-container\">\n      <p>\n        Generated by <a href=\"https://github.com/jsdoc3/jsdoc\">JSDoc</a> 3.6.11 on January 30, 2026.\n      </p>\n    </div>\n  </footer>\n  <script src=\"scripts/jquery.min.js\"></script>\n  <script src=\"scripts/tree.jquery.js\"></script>\n  <script src=\"scripts/prettify.js\"></script>\n  <script src=\"scripts/jsdoc-toc.js\"></script>\n  <script src=\"scripts/linenumber.js\"></script>\n  <script src=\"scripts/scrollanchor.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "docs/Message.html",
    "content": "<!doctype html>\n<html>\n\n<head>\n  <meta name=\"generator\" content=\"JSDoc 3.6.11\">\n  <meta charset=\"utf-8\">\n  <title>whatsapp-web.js 1.34.6 &raquo; Class: Message</title>\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Karla:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Noto+Serif:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Inconsolata:500\" type=\"text/css\">\n  <link href=\"css/baseline.css\" rel=\"stylesheet\">\n</head>\n\n<body onload=\"prettyPrint()\">\n  <nav id=\"jsdoc-navbar\" role=\"navigation\" class=\"jsdoc-navbar\">\n    <div id=\"jsdoc-navbar-container\">\n      <div id=\"jsdoc-navbar-content\">\n        <a href=\"index.html\" class=\"jsdoc-navbar-package-name\">whatsapp-web.<wbr>js 1.<wbr>34.<wbr>6</a>\n      </div>\n    </div>\n  </nav>\n  <div id=\"jsdoc-body-container\">\n    <div id=\"jsdoc-content\">\n      <div id=\"jsdoc-content-container\">\n        <div id=\"jsdoc-main\" role=\"main\">\n          <header class=\"page-header\">\n            <div class=\"symbol-detail-labels\"><span class=\"label label-kind\">class</span></div>\n            <h1><small></small><span class=\"symbol-name\">Message</span></h1>\n            <p class=\"source-link\">Source: <a href=\"structures_Message.js.html#source-line-17\">structures/<wbr>Message.<wbr>js:17</a></p>\n            <div class=\"symbol-classdesc\">\n              <p>Represents a Message on WhatsApp</p>\n            </div>\n            <dl class=\"dl-compact\">\n            </dl>\n          </header>\n          <section id=\"summary\">\n            <div class=\"summary-callout\">\n              <h2 class=\"summary-callout-heading\">Properties</h2>\n              <div class=\"summary-content\">\n                <div class=\"summary-column\">\n                  <dl class=\"dl-summary-callout\">\n                    <dt><a href=\"Message.html#ack\">ack</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Message.html#author\">author</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Message.html#body\">body</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Message.html#broadcast\">broadcast</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Message.html#deviceType\">deviceType</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Message.html#duration\">duration</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Message.html#forwardingScore\">forwardingScore</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Message.html#from\">from</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Message.html#fromMe\">fromMe</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Message.html#groupMentions\">groupMentions</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Message.html#hasMedia\">hasMedia</a></dt>\n                    <dd>\n                    </dd>\n                  </dl>\n                </div>\n                <div class=\"summary-column\">\n                  <dl class=\"dl-summary-callout\">\n                    <dt><a href=\"Message.html#hasQuotedMsg\">hasQuotedMsg</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Message.html#hasReaction\">hasReaction</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Message.html#id\">id</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Message.html#inviteV4\">inviteV4</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Message.html#isEphemeral\">isEphemeral</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Message.html#isForwarded\">isForwarded</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Message.html#isGif\">isGif</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Message.html#isStarred\">isStarred</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Message.html#isStatus\">isStatus</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Message.html#links\">links</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Message.html#location\">location</a></dt>\n                    <dd>\n                    </dd>\n                  </dl>\n                </div>\n                <div class=\"summary-column\">\n                  <dl class=\"dl-summary-callout\">\n                    <dt><a href=\"Message.html#mediaKey\">mediaKey</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Message.html#mentionedIds\">mentionedIds</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Message.html#orderId\">orderId</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Message.html#rawData\">rawData</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Message.html#timestamp\">timestamp</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Message.html#to\">to</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Message.html#token\">token</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Message.html#type\">type</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Message.html#vCards\">vCards</a></dt>\n                    <dd>\n                    </dd>\n                  </dl>\n                </div>\n              </div>\n            </div>\n            <div class=\"summary-callout\">\n              <h2 class=\"summary-callout-heading\">Methods</h2>\n              <div class=\"summary-content\">\n                <div class=\"summary-column\">\n                  <dl class=\"dl-summary-callout\">\n                    <dt><a href=\"Message.html#acceptGroupV4Invite\">acceptGroupV4Invite()</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Message.html#delete\">delete(everyone[, clearMedia])</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Message.html#downloadMedia\">downloadMedia()</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Message.html#edit\">edit(content[, options])</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Message.html#editScheduledEvent\">editScheduledEvent(editedEventObject)</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Message.html#forward\">forward(chat)</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Message.html#getChat\">getChat()</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Message.html#getContact\">getContact()</a></dt>\n                    <dd>\n                    </dd>\n                  </dl>\n                </div>\n                <div class=\"summary-column\">\n                  <dl class=\"dl-summary-callout\">\n                    <dt><a href=\"Message.html#getGroupMentions\">getGroupMentions()</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Message.html#getInfo\">getInfo()</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Message.html#getMentions\">getMentions()</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Message.html#getOrder\">getOrder()</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Message.html#getPayment\">getPayment()</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Message.html#getPollVotes\">getPollVotes()</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Message.html#getQuotedMessage\">getQuotedMessage()</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Message.html#getReactions\">getReactions()</a></dt>\n                    <dd>\n                    </dd>\n                  </dl>\n                </div>\n                <div class=\"summary-column\">\n                  <dl class=\"dl-summary-callout\">\n                    <dt><a href=\"Message.html#pin\">pin(duration)</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Message.html#react\">react(reaction)</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Message.html#reload\">reload()</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Message.html#reply\">reply(content[, chatId][, options])</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Message.html#star\">star()</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Message.html#unpin\">unpin()</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Message.html#unstar\">unstar()</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Message.html#vote\">vote(selectedOptions)</a></dt>\n                    <dd>\n                    </dd>\n                  </dl>\n                </div>\n              </div>\n            </div>\n          </section>\n          <section>\n            <h2 id=\"Message\">new&nbsp;<span class=\"symbol-name\">Message</span><span class=\"signature\"><span class=\"signature-params\">()</span></span></h2>\n            <dl class=\"dl-compact\">\n              <dt>Extends</dt>\n              <dd><a href=\"Base.html\">Base</a></dd>\n            </dl>\n          </section>\n          <section>\n            <h2>Properties</h2>\n            <section>\n              <h3 id=\"ack\"><span class=\"symbol-name\">ack</span><small class=\"property-type\">\n                  &nbsp;<a href=\"global.html#MessageAck\">MessageAck</a></small></h3>\n              <p>ACK status for the message</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"author\"><span class=\"symbol-name\">author</span><small class=\"property-type\">\n                  &nbsp;string</small></h3>\n              <p>If the message was sent to a group, this field will contain the user that sent the message.</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"body\"><span class=\"symbol-name\">body</span><small class=\"property-type\">\n                  &nbsp;string</small></h3>\n              <p>Message content</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"broadcast\"><span class=\"symbol-name\">broadcast</span><small class=\"property-type\">\n                  &nbsp;boolean</small></h3>\n              <p>Indicates if the message was a broadcast</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"deviceType\"><span class=\"symbol-name\">deviceType</span><small class=\"property-type\">\n                  &nbsp;string</small></h3>\n              <p>String that represents from which device type the message was sent</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"duration\"><span class=\"symbol-name\">duration</span><small class=\"property-type\">\n                  &nbsp;string</small></h3>\n              <p>Indicates the duration of the message in seconds</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"forwardingScore\"><span class=\"symbol-name\">forwardingScore</span><small class=\"property-type\">\n                  &nbsp;number</small></h3>\n              <p>Indicates how many times the message was forwarded.</p>\n              <p>The maximum value is 127.</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"from\"><span class=\"symbol-name\">from</span><small class=\"property-type\">\n                  &nbsp;string</small></h3>\n              <p>ID for the Chat that this message was sent to, except if the message was sent by the current user.</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"fromMe\"><span class=\"symbol-name\">fromMe</span><small class=\"property-type\">\n                  &nbsp;boolean</small></h3>\n              <p>Indicates if the message was sent by the current user</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"groupMentions\"><span class=\"symbol-name\">groupMentions</span><small class=\"property-type\">\n                  &nbsp;Array of <a href=\"global.html#GroupMention\">GroupMention</a></small></h3>\n              <p>Indicates whether there are group mentions in the message body</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"hasMedia\"><span class=\"symbol-name\">hasMedia</span><small class=\"property-type\">\n                  &nbsp;boolean</small></h3>\n              <p>Indicates if the message has media available for download</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"hasQuotedMsg\"><span class=\"symbol-name\">hasQuotedMsg</span><small class=\"property-type\">\n                  &nbsp;boolean</small></h3>\n              <p>Indicates if the message was sent as a reply to another message.</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"hasReaction\"><span class=\"symbol-name\">hasReaction</span><small class=\"property-type\">\n                  &nbsp;boolean</small></h3>\n              <p>Indicates whether there are reactions to the message</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"id\"><span class=\"symbol-name\">id</span><small class=\"property-type\">\n                  &nbsp;object</small></h3>\n              <p>ID that represents the message</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"inviteV4\"><span class=\"symbol-name\">inviteV4</span><small class=\"property-type\">\n                  &nbsp;object</small></h3>\n              <p>Group Invite Data</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"isEphemeral\"><span class=\"symbol-name\">isEphemeral</span><small class=\"property-type\">\n                  &nbsp;boolean</small></h3>\n              <p>Indicates if the message will disappear after it expires</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"isForwarded\"><span class=\"symbol-name\">isForwarded</span><small class=\"property-type\">\n                  &nbsp;boolean</small></h3>\n              <p>Indicates if the message was forwarded</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"isGif\"><span class=\"symbol-name\">isGif</span><small class=\"property-type\">\n                  &nbsp;boolean</small></h3>\n              <p>Indicates whether the message is a Gif</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"isStarred\"><span class=\"symbol-name\">isStarred</span><small class=\"property-type\">\n                  &nbsp;boolean</small></h3>\n              <p>Indicates if the message was starred</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"isStatus\"><span class=\"symbol-name\">isStatus</span><small class=\"property-type\">\n                  &nbsp;boolean</small></h3>\n              <p>Indicates if the message is a status update</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"links\"><span class=\"symbol-name\">links</span><small class=\"property-type\">\n                  &nbsp;Array of {link: string, isSuspicious: boolean}</small></h3>\n              <p>Links included in the message.</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"location\"><span class=\"symbol-name\">location</span><small class=\"property-type\">\n                  &nbsp;<a href=\"Location.html\">Location</a></small></h3>\n              <p>Location information contained in the message, if the message is type &quot;location&quot;</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"mediaKey\"><span class=\"symbol-name\">mediaKey</span><small class=\"property-type\">\n                  &nbsp;string</small></h3>\n              <p>MediaKey that represents the sticker 'ID'</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"mentionedIds\"><span class=\"symbol-name\">mentionedIds</span><small class=\"property-type\">\n                  &nbsp;Array of string</small></h3>\n              <p>Indicates the mentions in the message body.</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"orderId\"><span class=\"symbol-name\">orderId</span><small class=\"property-type\">\n                  &nbsp;string</small></h3>\n              <p>Order ID for message type ORDER</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"rawData\"><span class=\"symbol-name\">rawData</span><small class=\"property-type\">\n                  &nbsp;Object</small></h3>\n              <p>Returns message in a raw format</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"timestamp\"><span class=\"symbol-name\">timestamp</span><small class=\"property-type\">\n                  &nbsp;number</small></h3>\n              <p>Unix timestamp for when the message was created</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"to\"><span class=\"symbol-name\">to</span><small class=\"property-type\">\n                  &nbsp;string</small></h3>\n              <p>ID for who this message is for.</p>\n              <p>If the message is sent by the current user, it will be the Chat to which the message is being sent.\n                If the message is sent by another user, it will be the ID for the current user.</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"token\"><span class=\"symbol-name\">token</span><small class=\"property-type\">\n                  &nbsp;string</small></h3>\n              <p>Order Token for message type ORDER</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"type\"><span class=\"symbol-name\">type</span><small class=\"property-type\">\n                  &nbsp;<a href=\"global.html#MessageTypes\">MessageTypes</a></small></h3>\n              <p>Message type</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"vCards\"><span class=\"symbol-name\">vCards</span><small class=\"property-type\">\n                  &nbsp;Array of string</small></h3>\n              <p>List of vCards contained in the message.</p>\n              <dl class=\"dl-compact\">\n              </dl>\n            </section>\n            <h2>Methods</h2>\n            <section>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"acceptGroupV4Invite\"><span class=\"symbol-name\">acceptGroupV4Invite</span><span class=\"signature\"><span class=\"signature-params\">()</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing Object</span></span></h3>\n              <p>Accept Group V4 Invite</p>\n              <dl class=\"dl-compact\">\n                <dt>Returns</dt>\n                <dd>\n                  <p><code>Promise containing Object</code> </p>\n                </dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"delete\"><span class=\"symbol-name\">delete</span><span class=\"signature\"><span class=\"signature-params\">(everyone[, clearMedia])</span></span></h3>\n              <p>Deletes a message from the chat</p>\n              <section>\n                <h4>Parameters</h4>\n                <table class=\"jsdoc-details-table\">\n                  <thead>\n                    <tr>\n                      <th>Name</th>\n                      <th>Type</th>\n                      <th>Optional</th>\n                      <th>Description</th>\n                    </tr>\n                  </thead>\n                  <tbody>\n                    <tr>\n                      <td>\n                        <p>everyone</p>\n                      </td>\n                      <td>\n                        <p>boolean</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>If true and the message is sent by the current user or the user is an admin, will delete it for everyone in the chat.</p>\n                        <p>Value can be null.</p>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>clearMedia</p>\n                      </td>\n                      <td>\n                        <p>boolean</p>\n                      </td>\n                      <td>\n                        <p>Yes</p>\n                      </td>\n                      <td>\n                        <p>If true, any associated media will also be deleted from a device.</p>\n                        <p>Value can be null. Defaults to <code>true</code>.</p>\n                      </td>\n                    </tr>\n                  </tbody>\n                </table>\n              </section>\n              <dl class=\"dl-compact\">\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"downloadMedia\"><span class=\"symbol-name\">downloadMedia</span><span class=\"signature\"><span class=\"signature-params\">()</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing <a href=\"MessageMedia.html\">MessageMedia</a></span></span></h3>\n              <p>Downloads and returns the attatched message media</p>\n              <dl class=\"dl-compact\">\n                <dt>Returns</dt>\n                <dd>\n                  <p><code>Promise containing <a href=\"MessageMedia.html\">MessageMedia</a></code> </p>\n                </dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"edit\"><span class=\"symbol-name\">edit</span><span class=\"signature\"><span class=\"signature-params\">(content[, options])</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing nullable <a href=\"Message.html\">Message</a></span></span></h3>\n              <p>Edits the current message.</p>\n              <section>\n                <h4>Parameters</h4>\n                <table class=\"jsdoc-details-table\">\n                  <thead>\n                    <tr>\n                      <th>Name</th>\n                      <th>Type</th>\n                      <th>Optional</th>\n                      <th>Description</th>\n                    </tr>\n                  </thead>\n                  <tbody>\n                    <tr>\n                      <td>\n                        <p>content</p>\n                      </td>\n                      <td>\n                        <p>string</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>options</p>\n                      </td>\n                      <td>\n                        <p>MessageEditOptions</p>\n                      </td>\n                      <td>\n                        <p>Yes</p>\n                      </td>\n                      <td>\n                        <p>Options used when editing the message</p>\n                      </td>\n                    </tr>\n                  </tbody>\n                </table>\n              </section>\n              <dl class=\"dl-compact\">\n                <dt>Returns</dt>\n                <dd>\n                  <p><code>Promise containing nullable <a href=\"Message.html\">Message</a></code> </p>\n                </dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"editScheduledEvent\"><span class=\"symbol-name\">editScheduledEvent</span><span class=\"signature\"><span class=\"signature-params\">(editedEventObject)</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing nullable <a href=\"Message.html\">Message</a></span></span></h3>\n              <p>Edits the current ScheduledEvent message.\n                Once the scheduled event is canceled, it can not be edited.</p>\n              <section>\n                <h4>Parameter</h4>\n                <table class=\"jsdoc-details-table\">\n                  <thead>\n                    <tr>\n                      <th>Name</th>\n                      <th>Type</th>\n                      <th>Optional</th>\n                      <th>Description</th>\n                    </tr>\n                  </thead>\n                  <tbody>\n                    <tr>\n                      <td>\n                        <p>editedEventObject</p>\n                      </td>\n                      <td>\n                        <p><a href=\"ScheduledEvent.html\">ScheduledEvent</a></p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                  </tbody>\n                </table>\n              </section>\n              <dl class=\"dl-compact\">\n                <dt>Returns</dt>\n                <dd>\n                  <p><code>Promise containing nullable <a href=\"Message.html\">Message</a></code> </p>\n                </dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"forward\"><span class=\"symbol-name\">forward</span><span class=\"signature\"><span class=\"signature-params\">(chat)</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise</span></span></h3>\n              <p>Forwards this message to another chat (that you chatted before, otherwise it will fail)</p>\n              <section>\n                <h4>Parameter</h4>\n                <table class=\"jsdoc-details-table\">\n                  <thead>\n                    <tr>\n                      <th>Name</th>\n                      <th>Type</th>\n                      <th>Optional</th>\n                      <th>Description</th>\n                    </tr>\n                  </thead>\n                  <tbody>\n                    <tr>\n                      <td>\n                        <p>chat</p>\n                      </td>\n                      <td>\n                        <p>(string or <a href=\"Chat.html\">Chat</a>)</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>Chat model or chat ID to which the message will be forwarded</p>\n                      </td>\n                    </tr>\n                  </tbody>\n                </table>\n              </section>\n              <dl class=\"dl-compact\">\n                <dt>Returns</dt>\n                <dd>\n                  <p><code>Promise</code> </p>\n                </dd>\n              </dl>\n              <h3 id=\"getChat\"><span class=\"symbol-name\">getChat</span><span class=\"signature\"><span class=\"signature-params\">()</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing <a href=\"Chat.html\">Chat</a></span></span></h3>\n              <p>Returns the Chat this message was sent in</p>\n              <dl class=\"dl-compact\">\n                <dt>Returns</dt>\n                <dd>\n                  <p><code>Promise containing <a href=\"Chat.html\">Chat</a></code> </p>\n                </dd>\n              </dl>\n              <h3 id=\"getContact\"><span class=\"symbol-name\">getContact</span><span class=\"signature\"><span class=\"signature-params\">()</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing <a href=\"Contact.html\">Contact</a></span></span></h3>\n              <p>Returns the Contact this message was sent from</p>\n              <dl class=\"dl-compact\">\n                <dt>Returns</dt>\n                <dd>\n                  <p><code>Promise containing <a href=\"Contact.html\">Contact</a></code> </p>\n                </dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"getGroupMentions\"><span class=\"symbol-name\">getGroupMentions</span><span class=\"signature\"><span class=\"signature-params\">()</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing Array of <a href=\"GroupChat.html\">GroupChat</a></span></span></h3>\n              <p>Returns groups mentioned in this message</p>\n              <dl class=\"dl-compact\">\n                <dt>Returns</dt>\n                <dd>\n                  <p><code>Promise containing Array of <a href=\"GroupChat.html\">GroupChat</a></code> </p>\n                </dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"getInfo\"><span class=\"symbol-name\">getInfo</span><span class=\"signature\"><span class=\"signature-params\">()</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing nullable <a href=\"global.html#MessageInfo\">MessageInfo</a></span></span></h3>\n              <p>Get information about message delivery status.\n                May return null if the message does not exist or is not sent by you.</p>\n              <dl class=\"dl-compact\">\n                <dt>Returns</dt>\n                <dd>\n                  <p><code>Promise containing nullable <a href=\"global.html#MessageInfo\">MessageInfo</a></code> </p>\n                </dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"getMentions\"><span class=\"symbol-name\">getMentions</span><span class=\"signature\"><span class=\"signature-params\">()</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing Array of <a href=\"Contact.html\">Contact</a></span></span></h3>\n              <p>Returns the Contacts mentioned in this message</p>\n              <dl class=\"dl-compact\">\n                <dt>Returns</dt>\n                <dd>\n                  <p><code>Promise containing Array of <a href=\"Contact.html\">Contact</a></code> </p>\n                </dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"getOrder\"><span class=\"symbol-name\">getOrder</span><span class=\"signature\"><span class=\"signature-params\">()</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing <a href=\"Order.html\">Order</a></span></span></h3>\n              <p>Gets the order associated with a given message</p>\n              <dl class=\"dl-compact\">\n                <dt>Returns</dt>\n                <dd>\n                  <p><code>Promise containing <a href=\"Order.html\">Order</a></code> </p>\n                </dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"getPayment\"><span class=\"symbol-name\">getPayment</span><span class=\"signature\"><span class=\"signature-params\">()</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing <a href=\"Payment.html\">Payment</a></span></span></h3>\n              <p>Gets the payment details associated with a given message</p>\n              <dl class=\"dl-compact\">\n                <dt>Returns</dt>\n                <dd>\n                  <p><code>Promise containing <a href=\"Payment.html\">Payment</a></code> </p>\n                </dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"getPollVotes\"><span class=\"symbol-name\">getPollVotes</span><span class=\"signature\"><span class=\"signature-params\">()</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing Array of <a href=\"PollVote.html\">PollVote</a></span></span></h3>\n              <p>Returns the PollVote this poll message</p>\n              <dl class=\"dl-compact\">\n                <dt>Returns</dt>\n                <dd>\n                  <p><code>Promise containing Array of <a href=\"PollVote.html\">PollVote</a></code> </p>\n                </dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"getQuotedMessage\"><span class=\"symbol-name\">getQuotedMessage</span><span class=\"signature\"><span class=\"signature-params\">()</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing <a href=\"Message.html\">Message</a></span></span></h3>\n              <p>Returns the quoted message, if any</p>\n              <dl class=\"dl-compact\">\n                <dt>Returns</dt>\n                <dd>\n                  <p><code>Promise containing <a href=\"Message.html\">Message</a></code> </p>\n                </dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"getReactions\"><span class=\"symbol-name\">getReactions</span><span class=\"signature\"><span class=\"signature-params\">()</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing Array of <a href=\"global.html#ReactionList\">ReactionList</a></span></span></h3>\n              <p>Gets the reactions associated with the given message</p>\n              <dl class=\"dl-compact\">\n                <dt>Returns</dt>\n                <dd>\n                  <p><code>Promise containing Array of <a href=\"global.html#ReactionList\">ReactionList</a></code> </p>\n                </dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"pin\"><span class=\"symbol-name\">pin</span><span class=\"signature\"><span class=\"signature-params\">(duration)</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing boolean</span></span></h3>\n              <p>Pins the message (group admins can pin messages of all group members)</p>\n              <section>\n                <h4>Parameter</h4>\n                <table class=\"jsdoc-details-table\">\n                  <thead>\n                    <tr>\n                      <th>Name</th>\n                      <th>Type</th>\n                      <th>Optional</th>\n                      <th>Description</th>\n                    </tr>\n                  </thead>\n                  <tbody>\n                    <tr>\n                      <td>\n                        <p>duration</p>\n                      </td>\n                      <td>\n                        <p>number</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>The duration in seconds the message will be pinned in a chat</p>\n                      </td>\n                    </tr>\n                  </tbody>\n                </table>\n              </section>\n              <dl class=\"dl-compact\">\n                <dt>Returns</dt>\n                <dd>\n                  <p><code>Promise containing boolean</code> \n                  <p>Returns true if the operation completed successfully, false otherwise</p>\n                  </p>\n                </dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"react\"><span class=\"symbol-name\">react</span><span class=\"signature\"><span class=\"signature-params\">(reaction)</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise</span></span></h3>\n              <p>React to this message with an emoji</p>\n              <section>\n                <h4>Parameter</h4>\n                <table class=\"jsdoc-details-table\">\n                  <thead>\n                    <tr>\n                      <th>Name</th>\n                      <th>Type</th>\n                      <th>Optional</th>\n                      <th>Description</th>\n                    </tr>\n                  </thead>\n                  <tbody>\n                    <tr>\n                      <td>\n                        <p>reaction</p>\n                      </td>\n                      <td>\n                        <p>string</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>Emoji to react with. Send an empty string to remove the reaction.</p>\n                      </td>\n                    </tr>\n                  </tbody>\n                </table>\n              </section>\n              <dl class=\"dl-compact\">\n                <dt>Returns</dt>\n                <dd>\n                  <p><code>Promise</code> </p>\n                </dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"reload\"><span class=\"symbol-name\">reload</span><span class=\"signature\"><span class=\"signature-params\">()</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing <a href=\"Message.html\">Message</a></span></span></h3>\n              <p>Reloads this Message object's data in-place with the latest values from WhatsApp Web.\n                Note that the Message must still be in the web app cache for this to work, otherwise will return null.</p>\n              <dl class=\"dl-compact\">\n                <dt>Returns</dt>\n                <dd>\n                  <p><code>Promise containing <a href=\"Message.html\">Message</a></code> </p>\n                </dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"reply\"><span class=\"symbol-name\">reply</span><span class=\"signature\"><span class=\"signature-params\">(content[, chatId][, options])</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing <a href=\"Message.html\">Message</a></span></span></h3>\n              <p>Sends a message as a reply to this message. If chatId is specified, it will be sent\n                through the specified Chat. If not, it will send the message\n                in the same Chat as the original message was sent.</p>\n              <section>\n                <h4>Parameters</h4>\n                <table class=\"jsdoc-details-table\">\n                  <thead>\n                    <tr>\n                      <th>Name</th>\n                      <th>Type</th>\n                      <th>Optional</th>\n                      <th>Description</th>\n                    </tr>\n                  </thead>\n                  <tbody>\n                    <tr>\n                      <td>\n                        <p>content</p>\n                      </td>\n                      <td>\n                        <p>(string, <a href=\"MessageMedia.html\">MessageMedia</a>, or <a href=\"Location.html\">Location</a>)</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>chatId</p>\n                      </td>\n                      <td>\n                        <p>string</p>\n                      </td>\n                      <td>\n                        <p>Yes</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>options</p>\n                      </td>\n                      <td>\n                        <p><a href=\"global.html#MessageSendOptions\">MessageSendOptions</a></p>\n                      </td>\n                      <td>\n                        <p>Yes</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                  </tbody>\n                </table>\n              </section>\n              <dl class=\"dl-compact\">\n                <dt>Returns</dt>\n                <dd>\n                  <p><code>Promise containing <a href=\"Message.html\">Message</a></code> </p>\n                </dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"star\"><span class=\"symbol-name\">star</span><span class=\"signature\"><span class=\"signature-params\">()</span></span></h3>\n              <p>Stars this message</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"unpin\"><span class=\"symbol-name\">unpin</span><span class=\"signature\"><span class=\"signature-params\">()</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing boolean</span></span></h3>\n              <p>Unpins the message (group admins can unpin messages of all group members)</p>\n              <dl class=\"dl-compact\">\n                <dt>Returns</dt>\n                <dd>\n                  <p><code>Promise containing boolean</code> \n                  <p>Returns true if the operation completed successfully, false otherwise</p>\n                  </p>\n                </dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"unstar\"><span class=\"symbol-name\">unstar</span><span class=\"signature\"><span class=\"signature-params\">()</span></span></h3>\n              <p>Unstars this message</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"vote\"><span class=\"symbol-name\">vote</span><span class=\"signature\"><span class=\"signature-params\">(selectedOptions)</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise</span></span></h3>\n              <p>Send votes to the poll message</p>\n              <section>\n                <h4>Parameter</h4>\n                <table class=\"jsdoc-details-table\">\n                  <thead>\n                    <tr>\n                      <th>Name</th>\n                      <th>Type</th>\n                      <th>Optional</th>\n                      <th>Description</th>\n                    </tr>\n                  </thead>\n                  <tbody>\n                    <tr>\n                      <td>\n                        <p>selectedOptions</p>\n                      </td>\n                      <td>\n                        <p>Array of string</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>Array of options selected.</p>\n                      </td>\n                    </tr>\n                  </tbody>\n                </table>\n              </section>\n              <dl class=\"dl-compact\">\n                <dt>Returns</dt>\n                <dd>\n                  <p><code>Promise</code> </p>\n                </dd>\n              </dl>\n            </section>\n          </section>\n        </div>\n      </div>\n      <nav id=\"jsdoc-toc-nav\" role=\"navigation\"></nav>\n    </div>\n  </div>\n  <footer id=\"jsdoc-footer\" class=\"jsdoc-footer\">\n    <div id=\"jsdoc-footer-container\">\n      <p>\n        Generated by <a href=\"https://github.com/jsdoc3/jsdoc\">JSDoc</a> 3.6.11 on January 30, 2026.\n      </p>\n    </div>\n  </footer>\n  <script src=\"scripts/jquery.min.js\"></script>\n  <script src=\"scripts/tree.jquery.js\"></script>\n  <script src=\"scripts/prettify.js\"></script>\n  <script src=\"scripts/jsdoc-toc.js\"></script>\n  <script src=\"scripts/linenumber.js\"></script>\n  <script src=\"scripts/scrollanchor.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "docs/MessageMedia.html",
    "content": "<!doctype html>\n<html>\n\n<head>\n  <meta name=\"generator\" content=\"JSDoc 3.6.11\">\n  <meta charset=\"utf-8\">\n  <title>whatsapp-web.js 1.34.6 &raquo; Class: MessageMedia</title>\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Karla:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Noto+Serif:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Inconsolata:500\" type=\"text/css\">\n  <link href=\"css/baseline.css\" rel=\"stylesheet\">\n</head>\n\n<body onload=\"prettyPrint()\">\n  <nav id=\"jsdoc-navbar\" role=\"navigation\" class=\"jsdoc-navbar\">\n    <div id=\"jsdoc-navbar-container\">\n      <div id=\"jsdoc-navbar-content\">\n        <a href=\"index.html\" class=\"jsdoc-navbar-package-name\">whatsapp-web.<wbr>js 1.<wbr>34.<wbr>6</a>\n      </div>\n    </div>\n  </nav>\n  <div id=\"jsdoc-body-container\">\n    <div id=\"jsdoc-content\">\n      <div id=\"jsdoc-content-container\">\n        <div id=\"jsdoc-main\" role=\"main\">\n          <header class=\"page-header\">\n            <div class=\"symbol-detail-labels\"><span class=\"label label-kind\">class</span></div>\n            <h1><small></small><span class=\"symbol-name\">MessageMedia</span></h1>\n            <p class=\"source-link\">Source: <a href=\"structures_MessageMedia.js.html#source-line-16\">structures/<wbr>MessageMedia.<wbr>js:16</a></p>\n            <div class=\"symbol-classdesc\">\n              <p>Media attached to a message</p>\n            </div>\n            <dl class=\"dl-compact\">\n            </dl>\n          </header>\n          <section id=\"summary\">\n            <div class=\"summary-callout\">\n              <h2 class=\"summary-callout-heading\">Properties</h2>\n              <div class=\"summary-content\">\n                <div class=\"summary-column\">\n                  <dl class=\"dl-summary-callout\">\n                    <dt><a href=\"MessageMedia.html#data\">data</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"MessageMedia.html#filename\">filename</a></dt>\n                    <dd>\n                    </dd>\n                  </dl>\n                </div>\n                <div class=\"summary-column\">\n                  <dl class=\"dl-summary-callout\">\n                    <dt><a href=\"MessageMedia.html#filesize\">filesize</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"MessageMedia.html#mimetype\">mimetype</a></dt>\n                    <dd>\n                    </dd>\n                  </dl>\n                </div>\n                <div class=\"summary-column\">\n                </div>\n              </div>\n            </div>\n            <div class=\"summary-callout\">\n              <h2 class=\"summary-callout-heading\">Methods</h2>\n              <div class=\"summary-content\">\n                <div class=\"summary-column\">\n                  <dl class=\"dl-summary-callout\">\n                    <dt><a href=\"MessageMedia.html#.fromFilePath\">fromFilePath(filePath)</a></dt>\n                    <dd>\n                    </dd>\n                  </dl>\n                </div>\n                <div class=\"summary-column\">\n                  <dl class=\"dl-summary-callout\">\n                    <dt><a href=\"MessageMedia.html#.fromUrl\">fromUrl(url[, options])</a></dt>\n                    <dd>\n                    </dd>\n                  </dl>\n                </div>\n                <div class=\"summary-column\">\n                </div>\n              </div>\n            </div>\n          </section>\n          <section>\n            <h2 id=\"MessageMedia\">new&nbsp;<span class=\"symbol-name\">MessageMedia</span><span class=\"signature\"><span class=\"signature-params\">(mimetype, data, filename, filesize)</span></span></h2>\n            <section>\n              <h3>Parameters</h3>\n              <table class=\"jsdoc-details-table\">\n                <thead>\n                  <tr>\n                    <th>Name</th>\n                    <th>Type</th>\n                    <th>Optional</th>\n                    <th>Description</th>\n                  </tr>\n                </thead>\n                <tbody>\n                  <tr>\n                    <td>\n                      <p>mimetype</p>\n                    </td>\n                    <td>\n                      <p>&nbsp;</p>\n                    </td>\n                    <td>\n                      <p>&nbsp;</p>\n                    </td>\n                    <td>\n                      <p>MIME type of the attachment</p>\n                    </td>\n                  </tr>\n                  <tr>\n                    <td>\n                      <p>data</p>\n                    </td>\n                    <td>\n                      <p>&nbsp;</p>\n                    </td>\n                    <td>\n                      <p>&nbsp;</p>\n                    </td>\n                    <td>\n                      <p>Base64-encoded data of the file</p>\n                    </td>\n                  </tr>\n                  <tr>\n                    <td>\n                      <p>filename</p>\n                    </td>\n                    <td>\n                      <p>&nbsp;</p>\n                    </td>\n                    <td>\n                      <p>&nbsp;</p>\n                    </td>\n                    <td>\n                      <p>Document file name. Value can be null</p>\n                      <p>Value can be null.</p>\n                    </td>\n                  </tr>\n                  <tr>\n                    <td>\n                      <p>filesize</p>\n                    </td>\n                    <td>\n                      <p>&nbsp;</p>\n                    </td>\n                    <td>\n                      <p>&nbsp;</p>\n                    </td>\n                    <td>\n                      <p>Document file size in bytes. Value can be null</p>\n                      <p>Value can be null.</p>\n                    </td>\n                  </tr>\n                </tbody>\n              </table>\n            </section>\n            <dl class=\"dl-compact\">\n            </dl>\n          </section>\n          <section>\n            <h2>Properties</h2>\n            <section>\n              <h3 id=\"data\"><span class=\"symbol-name\">data</span><small class=\"property-type\">\n                  &nbsp;string</small></h3>\n              <p>Base64 encoded data that represents the file</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"filename\"><span class=\"symbol-name\">filename</span><small class=\"property-type\">\n                  &nbsp;nullable string</small></h3>\n              <p>Document file name. Value can be null</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"filesize\"><span class=\"symbol-name\">filesize</span><small class=\"property-type\">\n                  &nbsp;nullable number</small></h3>\n              <p>Document file size in bytes. Value can be null</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"mimetype\"><span class=\"symbol-name\">mimetype</span><small class=\"property-type\">\n                  &nbsp;string</small></h3>\n              <p>MIME type of the attachment</p>\n              <dl class=\"dl-compact\">\n              </dl>\n            </section>\n            <h2>Methods</h2>\n            <section>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-static\">static</span></div>\n              <h3 id=\".fromFilePath\"><span class=\"symbol-name\">fromFilePath</span><span class=\"signature\"><span class=\"signature-params\">(filePath)</span>&nbsp;&rarr; <span class=\"signature-returns\"> <a href=\"MessageMedia.html\">MessageMedia</a></span></span></h3>\n              <p>Creates a MessageMedia instance from a local file path</p>\n              <section>\n                <h4>Parameter</h4>\n                <table class=\"jsdoc-details-table\">\n                  <thead>\n                    <tr>\n                      <th>Name</th>\n                      <th>Type</th>\n                      <th>Optional</th>\n                      <th>Description</th>\n                    </tr>\n                  </thead>\n                  <tbody>\n                    <tr>\n                      <td>\n                        <p>filePath</p>\n                      </td>\n                      <td>\n                        <p>string</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                  </tbody>\n                </table>\n              </section>\n              <dl class=\"dl-compact\">\n                <dt>Returns</dt>\n                <dd>\n                  <p><code><a href=\"MessageMedia.html\">MessageMedia</a></code> </p>\n                </dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span>&nbsp;<span class=\"label label-static\">static</span></div>\n              <h3 id=\".fromUrl\"><span class=\"symbol-name\">fromUrl</span><span class=\"signature\"><span class=\"signature-params\">(url[, options])</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing <a href=\"MessageMedia.html\">MessageMedia</a></span></span></h3>\n              <p>Creates a MessageMedia instance from a URL</p>\n              <section>\n                <h4>Parameters</h4>\n                <table class=\"jsdoc-details-table\">\n                  <thead>\n                    <tr>\n                      <th>Name</th>\n                      <th>Type</th>\n                      <th>Optional</th>\n                      <th>Description</th>\n                    </tr>\n                  </thead>\n                  <tbody>\n                    <tr>\n                      <td>\n                        <p>url</p>\n                      </td>\n                      <td>\n                        <p>string</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>options</p>\n                      </td>\n                      <td>\n                        <p>Object</p>\n                      </td>\n                      <td>\n                        <p>Yes</p>\n                      </td>\n                      <td>\n                        <p>Values in <code>options</code> have the following properties:</p>\n                        <table class=\"jsdoc-details-table\">\n                          <thead>\n                            <tr>\n                              <th>Name</th>\n                              <th>Type</th>\n                              <th>Optional</th>\n                              <th>Description</th>\n                            </tr>\n                          </thead>\n                          <tbody>\n                            <tr>\n                              <td>\n                                <p>unsafeMime</p>\n                              </td>\n                              <td>\n                                <p>boolean</p>\n                              </td>\n                              <td>\n                                <p>Yes</p>\n                              </td>\n                              <td>\n                                <p>Defaults to <code>false</code>.</p>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <p>filename</p>\n                              </td>\n                              <td>\n                                <p>string</p>\n                              </td>\n                              <td>\n                                <p>Yes</p>\n                              </td>\n                              <td>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <p>client</p>\n                              </td>\n                              <td>\n                                <p>object</p>\n                              </td>\n                              <td>\n                                <p>Yes</p>\n                              </td>\n                              <td>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <p>reqOptions</p>\n                              </td>\n                              <td>\n                                <p>object</p>\n                              </td>\n                              <td>\n                                <p>Yes</p>\n                              </td>\n                              <td>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <p>reqOptions.size</p>\n                              </td>\n                              <td>\n                                <p>number</p>\n                              </td>\n                              <td>\n                                <p>Yes</p>\n                              </td>\n                              <td>\n                                <p>Defaults to <code>0</code>.</p>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </td>\n                    </tr>\n                  </tbody>\n                </table>\n              </section>\n              <dl class=\"dl-compact\">\n                <dt>Returns</dt>\n                <dd>\n                  <p><code>Promise containing <a href=\"MessageMedia.html\">MessageMedia</a></code> </p>\n                </dd>\n              </dl>\n            </section>\n          </section>\n        </div>\n      </div>\n      <nav id=\"jsdoc-toc-nav\" role=\"navigation\"></nav>\n    </div>\n  </div>\n  <footer id=\"jsdoc-footer\" class=\"jsdoc-footer\">\n    <div id=\"jsdoc-footer-container\">\n      <p>\n        Generated by <a href=\"https://github.com/jsdoc3/jsdoc\">JSDoc</a> 3.6.11 on January 30, 2026.\n      </p>\n    </div>\n  </footer>\n  <script src=\"scripts/jquery.min.js\"></script>\n  <script src=\"scripts/tree.jquery.js\"></script>\n  <script src=\"scripts/prettify.js\"></script>\n  <script src=\"scripts/jsdoc-toc.js\"></script>\n  <script src=\"scripts/linenumber.js\"></script>\n  <script src=\"scripts/scrollanchor.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "docs/NoAuth.html",
    "content": "<!doctype html>\n<html>\n\n<head>\n  <meta name=\"generator\" content=\"JSDoc 3.6.11\">\n  <meta charset=\"utf-8\">\n  <title>whatsapp-web.js 1.34.6 &raquo; Class: NoAuth</title>\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Karla:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Noto+Serif:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Inconsolata:500\" type=\"text/css\">\n  <link href=\"css/baseline.css\" rel=\"stylesheet\">\n</head>\n\n<body onload=\"prettyPrint()\">\n  <nav id=\"jsdoc-navbar\" role=\"navigation\" class=\"jsdoc-navbar\">\n    <div id=\"jsdoc-navbar-container\">\n      <div id=\"jsdoc-navbar-content\">\n        <a href=\"index.html\" class=\"jsdoc-navbar-package-name\">whatsapp-web.<wbr>js 1.<wbr>34.<wbr>6</a>\n      </div>\n    </div>\n  </nav>\n  <div id=\"jsdoc-body-container\">\n    <div id=\"jsdoc-content\">\n      <div id=\"jsdoc-content-container\">\n        <div id=\"jsdoc-main\" role=\"main\">\n          <header class=\"page-header\">\n            <div class=\"symbol-detail-labels\"><span class=\"label label-kind\">class</span></div>\n            <h1><small></small><span class=\"symbol-name\">NoAuth</span></h1>\n            <p class=\"source-link\">Source: <a href=\"authStrategies_NoAuth.js.html#source-line-9\">authStrategies/<wbr>NoAuth.<wbr>js:9</a></p>\n            <div class=\"symbol-classdesc\">\n              <p>No session restoring functionality\n                Will need to authenticate via QR code every time</p>\n            </div>\n            <dl class=\"dl-compact\">\n            </dl>\n          </header>\n          <section id=\"summary\">\n          </section>\n          <section>\n            <h2 id=\"NoAuth\">new&nbsp;<span class=\"symbol-name\">NoAuth</span><span class=\"signature\"><span class=\"signature-params\">()</span></span></h2>\n            <dl class=\"dl-compact\">\n            </dl>\n          </section>\n          <section>\n          </section>\n        </div>\n      </div>\n      <nav id=\"jsdoc-toc-nav\" role=\"navigation\"></nav>\n    </div>\n  </div>\n  <footer id=\"jsdoc-footer\" class=\"jsdoc-footer\">\n    <div id=\"jsdoc-footer-container\">\n      <p>\n        Generated by <a href=\"https://github.com/jsdoc3/jsdoc\">JSDoc</a> 3.6.11 on January 30, 2026.\n      </p>\n    </div>\n  </footer>\n  <script src=\"scripts/jquery.min.js\"></script>\n  <script src=\"scripts/tree.jquery.js\"></script>\n  <script src=\"scripts/prettify.js\"></script>\n  <script src=\"scripts/jsdoc-toc.js\"></script>\n  <script src=\"scripts/linenumber.js\"></script>\n  <script src=\"scripts/scrollanchor.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "docs/Order.html",
    "content": "<!doctype html>\n<html>\n\n<head>\n  <meta name=\"generator\" content=\"JSDoc 3.6.11\">\n  <meta charset=\"utf-8\">\n  <title>whatsapp-web.js 1.34.6 &raquo; Class: Order</title>\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Karla:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Noto+Serif:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Inconsolata:500\" type=\"text/css\">\n  <link href=\"css/baseline.css\" rel=\"stylesheet\">\n</head>\n\n<body onload=\"prettyPrint()\">\n  <nav id=\"jsdoc-navbar\" role=\"navigation\" class=\"jsdoc-navbar\">\n    <div id=\"jsdoc-navbar-container\">\n      <div id=\"jsdoc-navbar-content\">\n        <a href=\"index.html\" class=\"jsdoc-navbar-package-name\">whatsapp-web.<wbr>js 1.<wbr>34.<wbr>6</a>\n      </div>\n    </div>\n  </nav>\n  <div id=\"jsdoc-body-container\">\n    <div id=\"jsdoc-content\">\n      <div id=\"jsdoc-content-container\">\n        <div id=\"jsdoc-main\" role=\"main\">\n          <header class=\"page-header\">\n            <div class=\"symbol-detail-labels\"><span class=\"label label-kind\">class</span></div>\n            <h1><small></small><span class=\"symbol-name\">Order</span></h1>\n            <p class=\"source-link\">Source: <a href=\"structures_Order.js.html#source-line-10\">structures/<wbr>Order.<wbr>js:10</a></p>\n            <div class=\"symbol-classdesc\">\n              <p>Represents a Order on WhatsApp</p>\n            </div>\n            <dl class=\"dl-compact\">\n            </dl>\n          </header>\n          <section id=\"summary\">\n            <div class=\"summary-callout\">\n              <h2 class=\"summary-callout-heading\">Properties</h2>\n              <div class=\"summary-content\">\n                <div class=\"summary-column\">\n                  <dl class=\"dl-summary-callout\">\n                    <dt><a href=\"Order.html#createdAt\">createdAt</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Order.html#currency\">currency</a></dt>\n                    <dd>\n                    </dd>\n                  </dl>\n                </div>\n                <div class=\"summary-column\">\n                  <dl class=\"dl-summary-callout\">\n                    <dt><a href=\"Order.html#subtotal\">subtotal</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Order.html#total\">total</a></dt>\n                    <dd>\n                    </dd>\n                  </dl>\n                </div>\n                <div class=\"summary-column\">\n                </div>\n              </div>\n            </div>\n          </section>\n          <section>\n            <h2 id=\"Order\">new&nbsp;<span class=\"symbol-name\">Order</span><span class=\"signature\"><span class=\"signature-params\">()</span></span></h2>\n            <dl class=\"dl-compact\">\n              <dt>Extends</dt>\n              <dd><a href=\"Base.html\">Base</a></dd>\n            </dl>\n          </section>\n          <section>\n            <h2>Properties</h2>\n            <section>\n              <h3 id=\"createdAt\"><span class=\"symbol-name\">createdAt</span><small class=\"property-type\">\n                  &nbsp;number</small></h3>\n              <p>Order Created At</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"currency\"><span class=\"symbol-name\">currency</span><small class=\"property-type\">\n                  &nbsp;string</small></h3>\n              <p>Order Currency</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"subtotal\"><span class=\"symbol-name\">subtotal</span><small class=\"property-type\">\n                  &nbsp;string</small></h3>\n              <p>Order Subtotal</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"total\"><span class=\"symbol-name\">total</span><small class=\"property-type\">\n                  &nbsp;string</small></h3>\n              <p>Order Total</p>\n              <dl class=\"dl-compact\">\n              </dl>\n            </section>\n          </section>\n        </div>\n      </div>\n      <nav id=\"jsdoc-toc-nav\" role=\"navigation\"></nav>\n    </div>\n  </div>\n  <footer id=\"jsdoc-footer\" class=\"jsdoc-footer\">\n    <div id=\"jsdoc-footer-container\">\n      <p>\n        Generated by <a href=\"https://github.com/jsdoc3/jsdoc\">JSDoc</a> 3.6.11 on January 30, 2026.\n      </p>\n    </div>\n  </footer>\n  <script src=\"scripts/jquery.min.js\"></script>\n  <script src=\"scripts/tree.jquery.js\"></script>\n  <script src=\"scripts/prettify.js\"></script>\n  <script src=\"scripts/jsdoc-toc.js\"></script>\n  <script src=\"scripts/linenumber.js\"></script>\n  <script src=\"scripts/scrollanchor.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "docs/Poll.html",
    "content": "<!doctype html>\n<html>\n\n<head>\n  <meta name=\"generator\" content=\"JSDoc 3.6.11\">\n  <meta charset=\"utf-8\">\n  <title>whatsapp-web.js 1.34.6 &raquo; Class: Poll</title>\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Karla:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Noto+Serif:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Inconsolata:500\" type=\"text/css\">\n  <link href=\"css/baseline.css\" rel=\"stylesheet\">\n</head>\n\n<body onload=\"prettyPrint()\">\n  <nav id=\"jsdoc-navbar\" role=\"navigation\" class=\"jsdoc-navbar\">\n    <div id=\"jsdoc-navbar-container\">\n      <div id=\"jsdoc-navbar-content\">\n        <a href=\"index.html\" class=\"jsdoc-navbar-package-name\">whatsapp-web.<wbr>js 1.<wbr>34.<wbr>6</a>\n      </div>\n    </div>\n  </nav>\n  <div id=\"jsdoc-body-container\">\n    <div id=\"jsdoc-content\">\n      <div id=\"jsdoc-content-container\">\n        <div id=\"jsdoc-main\" role=\"main\">\n          <header class=\"page-header\">\n            <div class=\"symbol-detail-labels\"><span class=\"label label-kind\">class</span></div>\n            <h1><small></small><span class=\"symbol-name\">Poll</span></h1>\n            <p class=\"source-link\">Source: <a href=\"structures_Poll.js.html#source-line-11\">structures/<wbr>Poll.<wbr>js:11</a></p>\n            <div class=\"symbol-classdesc\">\n              <p>Represents a Poll on WhatsApp</p>\n            </div>\n            <dl class=\"dl-compact\">\n            </dl>\n          </header>\n          <section id=\"summary\">\n            <div class=\"summary-callout\">\n              <h2 class=\"summary-callout-heading\">Properties</h2>\n              <div class=\"summary-content\">\n                <div class=\"summary-column\">\n                  <dl class=\"dl-summary-callout\">\n                    <dt><a href=\"Poll.html#options\">options</a></dt>\n                    <dd>\n                    </dd>\n                  </dl>\n                </div>\n                <div class=\"summary-column\">\n                  <dl class=\"dl-summary-callout\">\n                    <dt><a href=\"Poll.html#pollName\">pollName</a></dt>\n                    <dd>\n                    </dd>\n                  </dl>\n                </div>\n                <div class=\"summary-column\">\n                  <dl class=\"dl-summary-callout\">\n                    <dt><a href=\"Poll.html#pollOptions\">pollOptions</a></dt>\n                    <dd>\n                    </dd>\n                  </dl>\n                </div>\n              </div>\n            </div>\n          </section>\n          <section>\n            <h2 id=\"Poll\">new&nbsp;<span class=\"symbol-name\">Poll</span><span class=\"signature\"><span class=\"signature-params\">(pollName, pollOptions, options)</span></span></h2>\n            <section>\n              <h3>Parameters</h3>\n              <table class=\"jsdoc-details-table\">\n                <thead>\n                  <tr>\n                    <th>Name</th>\n                    <th>Type</th>\n                    <th>Optional</th>\n                    <th>Description</th>\n                  </tr>\n                </thead>\n                <tbody>\n                  <tr>\n                    <td>\n                      <p>pollName</p>\n                    </td>\n                    <td>\n                      <p>&nbsp;</p>\n                    </td>\n                    <td>\n                      <p>&nbsp;</p>\n                    </td>\n                    <td>\n                    </td>\n                  </tr>\n                  <tr>\n                    <td>\n                      <p>pollOptions</p>\n                    </td>\n                    <td>\n                      <p>&nbsp;</p>\n                    </td>\n                    <td>\n                      <p>&nbsp;</p>\n                    </td>\n                    <td>\n                    </td>\n                  </tr>\n                  <tr>\n                    <td>\n                      <p>options</p>\n                    </td>\n                    <td>\n                      <p>&nbsp;</p>\n                    </td>\n                    <td>\n                      <p>&nbsp;</p>\n                    </td>\n                    <td>\n                    </td>\n                  </tr>\n                </tbody>\n              </table>\n            </section>\n            <dl class=\"dl-compact\">\n            </dl>\n          </section>\n          <section>\n            <h2>Properties</h2>\n            <section>\n              <h3 id=\"options\"><span class=\"symbol-name\">options</span><small class=\"property-type\">\n                  &nbsp;<a href=\"global.html#PollSendOptions\">PollSendOptions</a></small></h3>\n              <p>The send options for the poll</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"pollName\"><span class=\"symbol-name\">pollName</span><small class=\"property-type\">\n                  &nbsp;string</small></h3>\n              <p>The name of the poll</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"pollOptions\"><span class=\"symbol-name\">pollOptions</span><small class=\"property-type\">\n                  &nbsp;Array of {name: string, localId: number}</small></h3>\n              <p>The array of poll options</p>\n              <dl class=\"dl-compact\">\n              </dl>\n            </section>\n          </section>\n        </div>\n      </div>\n      <nav id=\"jsdoc-toc-nav\" role=\"navigation\"></nav>\n    </div>\n  </div>\n  <footer id=\"jsdoc-footer\" class=\"jsdoc-footer\">\n    <div id=\"jsdoc-footer-container\">\n      <p>\n        Generated by <a href=\"https://github.com/jsdoc3/jsdoc\">JSDoc</a> 3.6.11 on January 30, 2026.\n      </p>\n    </div>\n  </footer>\n  <script src=\"scripts/jquery.min.js\"></script>\n  <script src=\"scripts/tree.jquery.js\"></script>\n  <script src=\"scripts/prettify.js\"></script>\n  <script src=\"scripts/jsdoc-toc.js\"></script>\n  <script src=\"scripts/linenumber.js\"></script>\n  <script src=\"scripts/scrollanchor.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "docs/PollVote.html",
    "content": "<!doctype html>\n<html>\n\n<head>\n  <meta name=\"generator\" content=\"JSDoc 3.6.11\">\n  <meta charset=\"utf-8\">\n  <title>whatsapp-web.js 1.34.6 &raquo; Class: PollVote</title>\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Karla:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Noto+Serif:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Inconsolata:500\" type=\"text/css\">\n  <link href=\"css/baseline.css\" rel=\"stylesheet\">\n</head>\n\n<body onload=\"prettyPrint()\">\n  <nav id=\"jsdoc-navbar\" role=\"navigation\" class=\"jsdoc-navbar\">\n    <div id=\"jsdoc-navbar-container\">\n      <div id=\"jsdoc-navbar-content\">\n        <a href=\"index.html\" class=\"jsdoc-navbar-package-name\">whatsapp-web.<wbr>js 1.<wbr>34.<wbr>6</a>\n      </div>\n    </div>\n  </nav>\n  <div id=\"jsdoc-body-container\">\n    <div id=\"jsdoc-content\">\n      <div id=\"jsdoc-content-container\">\n        <div id=\"jsdoc-main\" role=\"main\">\n          <header class=\"page-header\">\n            <div class=\"symbol-detail-labels\"><span class=\"label label-kind\">class</span></div>\n            <h1><small></small><span class=\"symbol-name\">PollVote</span></h1>\n            <p class=\"source-link\">Source: <a href=\"structures_PollVote.js.html#source-line-17\">structures/<wbr>PollVote.<wbr>js:17</a></p>\n            <div class=\"symbol-classdesc\">\n              <p>Represents a Poll Vote on WhatsApp</p>\n            </div>\n            <dl class=\"dl-compact\">\n            </dl>\n          </header>\n          <section id=\"summary\">\n            <div class=\"summary-callout\">\n              <h2 class=\"summary-callout-heading\">Properties</h2>\n              <div class=\"summary-content\">\n                <div class=\"summary-column\">\n                  <dl class=\"dl-summary-callout\">\n                    <dt><a href=\"PollVote.html#interractedAtTs\">interractedAtTs</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"PollVote.html#parentMessage\">parentMessage</a></dt>\n                    <dd>\n                    </dd>\n                  </dl>\n                </div>\n                <div class=\"summary-column\">\n                  <dl class=\"dl-summary-callout\">\n                    <dt><a href=\"PollVote.html#parentMsgKey\">parentMsgKey</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"PollVote.html#voter\">voter</a></dt>\n                    <dd>\n                    </dd>\n                  </dl>\n                </div>\n                <div class=\"summary-column\">\n                </div>\n              </div>\n            </div>\n          </section>\n          <section>\n            <h2 id=\"PollVote\">new&nbsp;<span class=\"symbol-name\">PollVote</span><span class=\"signature\"><span class=\"signature-params\">()</span></span></h2>\n            <dl class=\"dl-compact\">\n              <dt>Extends</dt>\n              <dd><a href=\"Base.html\">Base</a></dd>\n            </dl>\n          </section>\n          <section>\n            <h2>Properties</h2>\n            <section>\n              <h3 id=\"interractedAtTs\"><span class=\"symbol-name\">interractedAtTs</span><small class=\"property-type\">\n                  &nbsp;number</small></h3>\n              <p>Timestamp the option was selected or deselected at</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"parentMessage\"><span class=\"symbol-name\">parentMessage</span><small class=\"property-type\">\n                  &nbsp;<a href=\"Message.html\">Message</a></small></h3>\n              <p>The poll creation message associated with the poll vote</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"parentMsgKey\"><span class=\"symbol-name\">parentMsgKey</span><small class=\"property-type\">\n                  &nbsp;Object</small></h3>\n              <p>The poll creation message id</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"voter\"><span class=\"symbol-name\">voter</span><small class=\"property-type\">\n                  &nbsp;string</small></h3>\n              <p>The person who voted</p>\n              <dl class=\"dl-compact\">\n              </dl>\n            </section>\n          </section>\n        </div>\n      </div>\n      <nav id=\"jsdoc-toc-nav\" role=\"navigation\"></nav>\n    </div>\n  </div>\n  <footer id=\"jsdoc-footer\" class=\"jsdoc-footer\">\n    <div id=\"jsdoc-footer-container\">\n      <p>\n        Generated by <a href=\"https://github.com/jsdoc3/jsdoc\">JSDoc</a> 3.6.11 on January 30, 2026.\n      </p>\n    </div>\n  </footer>\n  <script src=\"scripts/jquery.min.js\"></script>\n  <script src=\"scripts/tree.jquery.js\"></script>\n  <script src=\"scripts/prettify.js\"></script>\n  <script src=\"scripts/jsdoc-toc.js\"></script>\n  <script src=\"scripts/linenumber.js\"></script>\n  <script src=\"scripts/scrollanchor.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "docs/PrivateChat.html",
    "content": "<!doctype html>\n<html>\n\n<head>\n  <meta name=\"generator\" content=\"JSDoc 3.6.11\">\n  <meta charset=\"utf-8\">\n  <title>whatsapp-web.js 1.34.6 &raquo; Class: PrivateChat</title>\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Karla:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Noto+Serif:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Inconsolata:500\" type=\"text/css\">\n  <link href=\"css/baseline.css\" rel=\"stylesheet\">\n</head>\n\n<body onload=\"prettyPrint()\">\n  <nav id=\"jsdoc-navbar\" role=\"navigation\" class=\"jsdoc-navbar\">\n    <div id=\"jsdoc-navbar-container\">\n      <div id=\"jsdoc-navbar-content\">\n        <a href=\"index.html\" class=\"jsdoc-navbar-package-name\">whatsapp-web.<wbr>js 1.<wbr>34.<wbr>6</a>\n      </div>\n    </div>\n  </nav>\n  <div id=\"jsdoc-body-container\">\n    <div id=\"jsdoc-content\">\n      <div id=\"jsdoc-content-container\">\n        <div id=\"jsdoc-main\" role=\"main\">\n          <header class=\"page-header\">\n            <div class=\"symbol-detail-labels\"><span class=\"label label-kind\">class</span></div>\n            <h1><small></small><span class=\"symbol-name\">PrivateChat</span></h1>\n            <p class=\"source-link\">Source: <a href=\"structures_PrivateChat.js.html#source-line-9\">structures/<wbr>PrivateChat.<wbr>js:9</a></p>\n            <div class=\"symbol-classdesc\">\n              <p>Represents a Private Chat on WhatsApp</p>\n            </div>\n            <dl class=\"dl-compact\">\n            </dl>\n          </header>\n          <section id=\"summary\">\n            <div class=\"summary-callout\">\n              <h2 class=\"summary-callout-heading\">Properties</h2>\n              <div class=\"summary-content\">\n                <div class=\"summary-column\">\n                  <dl class=\"dl-summary-callout\">\n                    <dt><a href=\"PrivateChat.html#archived\">archived</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"PrivateChat.html#id\">id</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"PrivateChat.html#isGroup\">isGroup</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"PrivateChat.html#isMuted\">isMuted</a></dt>\n                    <dd>\n                    </dd>\n                  </dl>\n                </div>\n                <div class=\"summary-column\">\n                  <dl class=\"dl-summary-callout\">\n                    <dt><a href=\"PrivateChat.html#isReadOnly\">isReadOnly</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"PrivateChat.html#lastMessage\">lastMessage</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"PrivateChat.html#muteExpiration\">muteExpiration</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"PrivateChat.html#name\">name</a></dt>\n                    <dd>\n                    </dd>\n                  </dl>\n                </div>\n                <div class=\"summary-column\">\n                  <dl class=\"dl-summary-callout\">\n                    <dt><a href=\"PrivateChat.html#pinned\">pinned</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"PrivateChat.html#timestamp\">timestamp</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"PrivateChat.html#unreadCount\">unreadCount</a></dt>\n                    <dd>\n                    </dd>\n                  </dl>\n                </div>\n              </div>\n            </div>\n            <div class=\"summary-callout\">\n              <h2 class=\"summary-callout-heading\">Methods</h2>\n              <div class=\"summary-content\">\n                <div class=\"summary-column\">\n                  <dl class=\"dl-summary-callout\">\n                    <dt><a href=\"PrivateChat.html#addOrEditCustomerNote\">addOrEditCustomerNote(note)</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"PrivateChat.html#archive\">archive()</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"PrivateChat.html#changeLabels\">changeLabels(labelIds)</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"PrivateChat.html#clearMessages\">clearMessages()</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"PrivateChat.html#clearState\">clearState()</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"PrivateChat.html#delete\">delete()</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"PrivateChat.html#fetchMessages\">fetchMessages(searchOptions)</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"PrivateChat.html#getContact\">getContact()</a></dt>\n                    <dd>\n                    </dd>\n                  </dl>\n                </div>\n                <div class=\"summary-column\">\n                  <dl class=\"dl-summary-callout\">\n                    <dt><a href=\"PrivateChat.html#getCustomerNote\">getCustomerNote()</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"PrivateChat.html#getLabels\">getLabels()</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"PrivateChat.html#getPinnedMessages\">getPinnedMessages()</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"PrivateChat.html#markUnread\">markUnread()</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"PrivateChat.html#mute\">mute(unmuteDate)</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"PrivateChat.html#pin\">pin()</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"PrivateChat.html#sendMessage\">sendMessage(content[, options])</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"PrivateChat.html#sendSeen\">sendSeen()</a></dt>\n                    <dd>\n                    </dd>\n                  </dl>\n                </div>\n                <div class=\"summary-column\">\n                  <dl class=\"dl-summary-callout\">\n                    <dt><a href=\"PrivateChat.html#sendStateRecording\">sendStateRecording()</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"PrivateChat.html#sendStateTyping\">sendStateTyping()</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"PrivateChat.html#syncHistory\">syncHistory()</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"PrivateChat.html#unarchive\">unarchive()</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"PrivateChat.html#unmute\">unmute()</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"PrivateChat.html#unpin\">unpin()</a></dt>\n                    <dd>\n                    </dd>\n                  </dl>\n                </div>\n              </div>\n            </div>\n          </section>\n          <section>\n            <h2 id=\"PrivateChat\">new&nbsp;<span class=\"symbol-name\">PrivateChat</span><span class=\"signature\"><span class=\"signature-params\">()</span></span></h2>\n            <dl class=\"dl-compact\">\n              <dt>Extends</dt>\n              <dd><a href=\"Chat.html\">Chat</a></dd>\n            </dl>\n          </section>\n          <section>\n            <h2>Properties</h2>\n            <section>\n              <h3 id=\"archived\"><span class=\"symbol-name\">archived</span><small class=\"property-type\">\n                  &nbsp;unknown</small></h3>\n              <p>Indicates if the Chat is archived</p>\n              <dl class=\"dl-compact\">\n                <dt>Inherited from</dt>\n                <dd><a href=\"Chat.html#archived\">Chat#archived</a></dd>\n              </dl>\n              <h3 id=\"id\"><span class=\"symbol-name\">id</span><small class=\"property-type\">\n                  &nbsp;unknown</small></h3>\n              <p>ID that represents the chat</p>\n              <dl class=\"dl-compact\">\n                <dt>Inherited from</dt>\n                <dd><a href=\"Chat.html#id\">Chat#id</a></dd>\n              </dl>\n              <h3 id=\"isGroup\"><span class=\"symbol-name\">isGroup</span><small class=\"property-type\">\n                  &nbsp;unknown</small></h3>\n              <p>Indicates if the Chat is a Group Chat</p>\n              <dl class=\"dl-compact\">\n                <dt>Inherited from</dt>\n                <dd><a href=\"Chat.html#isGroup\">Chat#isGroup</a></dd>\n              </dl>\n              <h3 id=\"isMuted\"><span class=\"symbol-name\">isMuted</span><small class=\"property-type\">\n                  &nbsp;unknown</small></h3>\n              <p>Indicates if the chat is muted or not</p>\n              <dl class=\"dl-compact\">\n                <dt>Inherited from</dt>\n                <dd><a href=\"Chat.html#isMuted\">Chat#isMuted</a></dd>\n              </dl>\n              <h3 id=\"isReadOnly\"><span class=\"symbol-name\">isReadOnly</span><small class=\"property-type\">\n                  &nbsp;unknown</small></h3>\n              <p>Indicates if the Chat is readonly</p>\n              <dl class=\"dl-compact\">\n                <dt>Inherited from</dt>\n                <dd><a href=\"Chat.html#isReadOnly\">Chat#isReadOnly</a></dd>\n              </dl>\n              <h3 id=\"lastMessage\"><span class=\"symbol-name\">lastMessage</span><small class=\"property-type\">\n                  &nbsp;unknown</small></h3>\n              <p>Last message fo chat</p>\n              <dl class=\"dl-compact\">\n                <dt>Inherited from</dt>\n                <dd><a href=\"Chat.html#lastMessage\">Chat#lastMessage</a></dd>\n              </dl>\n              <h3 id=\"muteExpiration\"><span class=\"symbol-name\">muteExpiration</span><small class=\"property-type\">\n                  &nbsp;unknown</small></h3>\n              <p>Unix timestamp for when the mute expires</p>\n              <dl class=\"dl-compact\">\n                <dt>Inherited from</dt>\n                <dd><a href=\"Chat.html#muteExpiration\">Chat#muteExpiration</a></dd>\n              </dl>\n              <h3 id=\"name\"><span class=\"symbol-name\">name</span><small class=\"property-type\">\n                  &nbsp;unknown</small></h3>\n              <p>Title of the chat</p>\n              <dl class=\"dl-compact\">\n                <dt>Inherited from</dt>\n                <dd><a href=\"Chat.html#name\">Chat#name</a></dd>\n              </dl>\n              <h3 id=\"pinned\"><span class=\"symbol-name\">pinned</span><small class=\"property-type\">\n                  &nbsp;unknown</small></h3>\n              <p>Indicates if the Chat is pinned</p>\n              <dl class=\"dl-compact\">\n                <dt>Inherited from</dt>\n                <dd><a href=\"Chat.html#pinned\">Chat#pinned</a></dd>\n              </dl>\n              <h3 id=\"timestamp\"><span class=\"symbol-name\">timestamp</span><small class=\"property-type\">\n                  &nbsp;unknown</small></h3>\n              <p>Unix timestamp for when the last activity occurred</p>\n              <dl class=\"dl-compact\">\n                <dt>Inherited from</dt>\n                <dd><a href=\"Chat.html#timestamp\">Chat#timestamp</a></dd>\n              </dl>\n              <h3 id=\"unreadCount\"><span class=\"symbol-name\">unreadCount</span><small class=\"property-type\">\n                  &nbsp;unknown</small></h3>\n              <p>Amount of messages unread</p>\n              <dl class=\"dl-compact\">\n                <dt>Inherited from</dt>\n                <dd><a href=\"Chat.html#unreadCount\">Chat#unreadCount</a></dd>\n              </dl>\n            </section>\n            <h2>Methods</h2>\n            <section>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"addOrEditCustomerNote\"><span class=\"symbol-name\">addOrEditCustomerNote</span><span class=\"signature\"><span class=\"signature-params\">(note)</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing void</span></span></h3>\n              <p>Add or edit a customer note</p>\n              <section>\n                <h4>Parameter</h4>\n                <table class=\"jsdoc-details-table\">\n                  <thead>\n                    <tr>\n                      <th>Name</th>\n                      <th>Type</th>\n                      <th>Optional</th>\n                      <th>Description</th>\n                    </tr>\n                  </thead>\n                  <tbody>\n                    <tr>\n                      <td>\n                        <p>note</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>The note to add</p>\n                      </td>\n                    </tr>\n                  </tbody>\n                </table>\n              </section>\n              <dl class=\"dl-compact\">\n                <dt>Inherited from</dt>\n                <dd><a href=\"Chat.html#addOrEditCustomerNote\">Chat#addOrEditCustomerNote</a></dd>\n                <dt>See also</dt>\n                <dd><a href=\"https://faq.whatsapp.com/1433099287594476\">https://faq.whatsapp.com/1433099287594476</a></dd>\n                <dt>Returns</dt>\n                <dd></dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"archive\"><span class=\"symbol-name\">archive</span><span class=\"signature\"><span class=\"signature-params\">()</span></span></h3>\n              <p>Archives this chat</p>\n              <dl class=\"dl-compact\">\n                <dt>Inherited from</dt>\n                <dd><a href=\"Chat.html#archive\">Chat#archive</a></dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"changeLabels\"><span class=\"symbol-name\">changeLabels</span><span class=\"signature\"><span class=\"signature-params\">(labelIds)</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing void</span></span></h3>\n              <p>Add or remove labels to this Chat</p>\n              <section>\n                <h4>Parameter</h4>\n                <table class=\"jsdoc-details-table\">\n                  <thead>\n                    <tr>\n                      <th>Name</th>\n                      <th>Type</th>\n                      <th>Optional</th>\n                      <th>Description</th>\n                    </tr>\n                  </thead>\n                  <tbody>\n                    <tr>\n                      <td>\n                        <p>labelIds</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                  </tbody>\n                </table>\n              </section>\n              <dl class=\"dl-compact\">\n                <dt>Inherited from</dt>\n                <dd><a href=\"Chat.html#changeLabels\">Chat#changeLabels</a></dd>\n                <dt>Returns</dt>\n                <dd></dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"clearMessages\"><span class=\"symbol-name\">clearMessages</span><span class=\"signature\"><span class=\"signature-params\">()</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing boolean</span></span></h3>\n              <p>Clears all messages from the chat</p>\n              <dl class=\"dl-compact\">\n                <dt>Inherited from</dt>\n                <dd><a href=\"Chat.html#clearMessages\">Chat#clearMessages</a></dd>\n                <dt>Returns</dt>\n                <dd>\n                  <p>result</p>\n                </dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"clearState\"><span class=\"symbol-name\">clearState</span><span class=\"signature\"><span class=\"signature-params\">()</span></span></h3>\n              <p>Stops typing or recording in chat immediately.</p>\n              <dl class=\"dl-compact\">\n                <dt>Inherited from</dt>\n                <dd><a href=\"Chat.html#clearState\">Chat#clearState</a></dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"delete\"><span class=\"symbol-name\">delete</span><span class=\"signature\"><span class=\"signature-params\">()</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing Boolean</span></span></h3>\n              <p>Deletes the chat</p>\n              <dl class=\"dl-compact\">\n                <dt>Inherited from</dt>\n                <dd><a href=\"Chat.html#delete\">Chat#delete</a></dd>\n                <dt>Returns</dt>\n                <dd>\n                  <p>result</p>\n                </dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"fetchMessages\"><span class=\"symbol-name\">fetchMessages</span><span class=\"signature\"><span class=\"signature-params\">(searchOptions)</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing Array of <a href=\"Message.html\">Message</a></span></span></h3>\n              <p>Loads chat messages, sorted from earliest to latest.</p>\n              <section>\n                <h4>Parameters</h4>\n                <table class=\"jsdoc-details-table\">\n                  <thead>\n                    <tr>\n                      <th>Name</th>\n                      <th>Type</th>\n                      <th>Optional</th>\n                      <th>Description</th>\n                    </tr>\n                  </thead>\n                  <tbody>\n                    <tr>\n                      <td>\n                        <p>searchOptions</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>Options for searching messages. Right now only limit and fromMe is supported.</p>\n                        <p>Values in <code>searchOptions</code> have the following properties:</p>\n                        <table class=\"jsdoc-details-table\">\n                          <thead>\n                            <tr>\n                              <th>Name</th>\n                              <th>Type</th>\n                              <th>Optional</th>\n                              <th>Description</th>\n                            </tr>\n                          </thead>\n                          <tbody>\n                            <tr>\n                              <td>\n                                <p>limit</p>\n                              </td>\n                              <td>\n                                <p>&nbsp;</p>\n                              </td>\n                              <td>\n                                <p>Yes</p>\n                              </td>\n                              <td>\n                                <p>The amount of messages to return. If no limit is specified, the available messages will be returned. Note that the actual number of returned messages may be smaller if there aren't enough messages in the conversation. Set this to Infinity to load all messages.</p>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <p>fromMe</p>\n                              </td>\n                              <td>\n                                <p>&nbsp;</p>\n                              </td>\n                              <td>\n                                <p>Yes</p>\n                              </td>\n                              <td>\n                                <p>Return only messages from the bot number or vise versa. To get all messages, leave the option undefined.</p>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </td>\n                    </tr>\n                  </tbody>\n                </table>\n              </section>\n              <dl class=\"dl-compact\">\n                <dt>Inherited from</dt>\n                <dd><a href=\"Chat.html#fetchMessages\">Chat#fetchMessages</a></dd>\n                <dt>Returns</dt>\n                <dd></dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"getContact\"><span class=\"symbol-name\">getContact</span><span class=\"signature\"><span class=\"signature-params\">()</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing <a href=\"Contact.html\">Contact</a></span></span></h3>\n              <p>Returns the Contact that corresponds to this Chat.</p>\n              <dl class=\"dl-compact\">\n                <dt>Inherited from</dt>\n                <dd><a href=\"Chat.html#getContact\">Chat#getContact</a></dd>\n                <dt>Returns</dt>\n                <dd></dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"getCustomerNote\"><span class=\"symbol-name\">getCustomerNote</span><span class=\"signature\"><span class=\"signature-params\">()</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing {chatId: string, content: string, createdAt: number, id: string, modifiedAt: number, type: string}</span></span></h3>\n              <p>Get a customer note</p>\n              <dl class=\"dl-compact\">\n                <dt>Inherited from</dt>\n                <dd><a href=\"Chat.html#getCustomerNote\">Chat#getCustomerNote</a></dd>\n                <dt>See also</dt>\n                <dd><a href=\"https://faq.whatsapp.com/1433099287594476\">https://faq.whatsapp.com/1433099287594476</a></dd>\n                <dt>Returns</dt>\n                <dd></dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"getLabels\"><span class=\"symbol-name\">getLabels</span><span class=\"signature\"><span class=\"signature-params\">()</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing Array of <a href=\"Label.html\">Label</a></span></span></h3>\n              <p>Returns array of all Labels assigned to this Chat</p>\n              <dl class=\"dl-compact\">\n                <dt>Inherited from</dt>\n                <dd><a href=\"Chat.html#getLabels\">Chat#getLabels</a></dd>\n                <dt>Returns</dt>\n                <dd></dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"getPinnedMessages\"><span class=\"symbol-name\">getPinnedMessages</span><span class=\"signature\"><span class=\"signature-params\">()</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing Array of <a href=\"Message.html\">Message</a></span></span></h3>\n              <p>Gets instances of all pinned messages in a chat</p>\n              <dl class=\"dl-compact\">\n                <dt>Inherited from</dt>\n                <dd><a href=\"Chat.html#getPinnedMessages\">Chat#getPinnedMessages</a></dd>\n                <dt>Returns</dt>\n                <dd></dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"markUnread\"><span class=\"symbol-name\">markUnread</span><span class=\"signature\"><span class=\"signature-params\">()</span></span></h3>\n              <p>Mark this chat as unread</p>\n              <dl class=\"dl-compact\">\n                <dt>Inherited from</dt>\n                <dd><a href=\"Chat.html#markUnread\">Chat#markUnread</a></dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"mute\"><span class=\"symbol-name\">mute</span><span class=\"signature\"><span class=\"signature-params\">(unmuteDate)</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing {isMuted: boolean, muteExpiration: number}</span></span></h3>\n              <p>Mutes this chat forever, unless a date is specified</p>\n              <section>\n                <h4>Parameter</h4>\n                <table class=\"jsdoc-details-table\">\n                  <thead>\n                    <tr>\n                      <th>Name</th>\n                      <th>Type</th>\n                      <th>Optional</th>\n                      <th>Description</th>\n                    </tr>\n                  </thead>\n                  <tbody>\n                    <tr>\n                      <td>\n                        <p>unmuteDate</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>Date when the chat will be unmuted, don't provide a value to mute forever</p>\n                        <p>Value can be null.</p>\n                      </td>\n                    </tr>\n                  </tbody>\n                </table>\n              </section>\n              <dl class=\"dl-compact\">\n                <dt>Inherited from</dt>\n                <dd><a href=\"Chat.html#mute\">Chat#mute</a></dd>\n                <dt>Returns</dt>\n                <dd></dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"pin\"><span class=\"symbol-name\">pin</span><span class=\"signature\"><span class=\"signature-params\">()</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing boolean</span></span></h3>\n              <p>Pins this chat</p>\n              <dl class=\"dl-compact\">\n                <dt>Inherited from</dt>\n                <dd><a href=\"Chat.html#pin\">Chat#pin</a></dd>\n                <dt>Returns</dt>\n                <dd>\n                  <p>New pin state. Could be false if the max number of pinned chats was reached.</p>\n                </dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"sendMessage\"><span class=\"symbol-name\">sendMessage</span><span class=\"signature\"><span class=\"signature-params\">(content[, options])</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing <a href=\"Message.html\">Message</a></span></span></h3>\n              <p>Send a message to this chat</p>\n              <section>\n                <h4>Parameters</h4>\n                <table class=\"jsdoc-details-table\">\n                  <thead>\n                    <tr>\n                      <th>Name</th>\n                      <th>Type</th>\n                      <th>Optional</th>\n                      <th>Description</th>\n                    </tr>\n                  </thead>\n                  <tbody>\n                    <tr>\n                      <td>\n                        <p>content</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>options</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>Yes</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                  </tbody>\n                </table>\n              </section>\n              <dl class=\"dl-compact\">\n                <dt>Inherited from</dt>\n                <dd><a href=\"Chat.html#sendMessage\">Chat#sendMessage</a></dd>\n                <dt>Returns</dt>\n                <dd>\n                  <p>Message that was just sent</p>\n                </dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"sendSeen\"><span class=\"symbol-name\">sendSeen</span><span class=\"signature\"><span class=\"signature-params\">()</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing Boolean</span></span></h3>\n              <p>Sets the chat as seen</p>\n              <dl class=\"dl-compact\">\n                <dt>Inherited from</dt>\n                <dd><a href=\"Chat.html#sendSeen\">Chat#sendSeen</a></dd>\n                <dt>Returns</dt>\n                <dd>\n                  <p>result</p>\n                </dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"sendStateRecording\"><span class=\"symbol-name\">sendStateRecording</span><span class=\"signature\"><span class=\"signature-params\">()</span></span></h3>\n              <p>Simulate recording audio in chat. This will last for 25 seconds.</p>\n              <dl class=\"dl-compact\">\n                <dt>Inherited from</dt>\n                <dd><a href=\"Chat.html#sendStateRecording\">Chat#sendStateRecording</a></dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"sendStateTyping\"><span class=\"symbol-name\">sendStateTyping</span><span class=\"signature\"><span class=\"signature-params\">()</span></span></h3>\n              <p>Simulate typing in chat. This will last for 25 seconds.</p>\n              <dl class=\"dl-compact\">\n                <dt>Inherited from</dt>\n                <dd><a href=\"Chat.html#sendStateTyping\">Chat#sendStateTyping</a></dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"syncHistory\"><span class=\"symbol-name\">syncHistory</span><span class=\"signature\"><span class=\"signature-params\">()</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing boolean</span></span></h3>\n              <p>Sync chat history conversation</p>\n              <dl class=\"dl-compact\">\n                <dt>Inherited from</dt>\n                <dd><a href=\"Chat.html#syncHistory\">Chat#syncHistory</a></dd>\n                <dt>Returns</dt>\n                <dd>\n                  <p>True if operation completed successfully, false otherwise.</p>\n                </dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"unarchive\"><span class=\"symbol-name\">unarchive</span><span class=\"signature\"><span class=\"signature-params\">()</span></span></h3>\n              <p>un-archives this chat</p>\n              <dl class=\"dl-compact\">\n                <dt>Inherited from</dt>\n                <dd><a href=\"Chat.html#unarchive\">Chat#unarchive</a></dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"unmute\"><span class=\"symbol-name\">unmute</span><span class=\"signature\"><span class=\"signature-params\">()</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing {isMuted: boolean, muteExpiration: number}</span></span></h3>\n              <p>Unmutes this chat</p>\n              <dl class=\"dl-compact\">\n                <dt>Inherited from</dt>\n                <dd><a href=\"Chat.html#unmute\">Chat#unmute</a></dd>\n                <dt>Returns</dt>\n                <dd></dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"unpin\"><span class=\"symbol-name\">unpin</span><span class=\"signature\"><span class=\"signature-params\">()</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing boolean</span></span></h3>\n              <p>Unpins this chat</p>\n              <dl class=\"dl-compact\">\n                <dt>Inherited from</dt>\n                <dd><a href=\"Chat.html#unpin\">Chat#unpin</a></dd>\n                <dt>Returns</dt>\n                <dd>\n                  <p>New pin state</p>\n                </dd>\n              </dl>\n            </section>\n          </section>\n        </div>\n      </div>\n      <nav id=\"jsdoc-toc-nav\" role=\"navigation\"></nav>\n    </div>\n  </div>\n  <footer id=\"jsdoc-footer\" class=\"jsdoc-footer\">\n    <div id=\"jsdoc-footer-container\">\n      <p>\n        Generated by <a href=\"https://github.com/jsdoc3/jsdoc\">JSDoc</a> 3.6.11 on January 30, 2026.\n      </p>\n    </div>\n  </footer>\n  <script src=\"scripts/jquery.min.js\"></script>\n  <script src=\"scripts/tree.jquery.js\"></script>\n  <script src=\"scripts/prettify.js\"></script>\n  <script src=\"scripts/jsdoc-toc.js\"></script>\n  <script src=\"scripts/linenumber.js\"></script>\n  <script src=\"scripts/scrollanchor.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "docs/PrivateContact.html",
    "content": "<!doctype html>\n<html>\n\n<head>\n  <meta name=\"generator\" content=\"JSDoc 3.6.11\">\n  <meta charset=\"utf-8\">\n  <title>whatsapp-web.js 1.34.6 &raquo; Class: PrivateContact</title>\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Karla:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Noto+Serif:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Inconsolata:500\" type=\"text/css\">\n  <link href=\"css/baseline.css\" rel=\"stylesheet\">\n</head>\n\n<body onload=\"prettyPrint()\">\n  <nav id=\"jsdoc-navbar\" role=\"navigation\" class=\"jsdoc-navbar\">\n    <div id=\"jsdoc-navbar-container\">\n      <div id=\"jsdoc-navbar-content\">\n        <a href=\"index.html\" class=\"jsdoc-navbar-package-name\">whatsapp-web.<wbr>js 1.<wbr>34.<wbr>6</a>\n      </div>\n    </div>\n  </nav>\n  <div id=\"jsdoc-body-container\">\n    <div id=\"jsdoc-content\">\n      <div id=\"jsdoc-content-container\">\n        <div id=\"jsdoc-main\" role=\"main\">\n          <header class=\"page-header\">\n            <div class=\"symbol-detail-labels\"><span class=\"label label-kind\">class</span></div>\n            <h1><small></small><span class=\"symbol-name\">PrivateContact</span></h1>\n            <p class=\"source-link\">Source: <a href=\"structures_PrivateContact.js.html#source-line-9\">structures/<wbr>PrivateContact.<wbr>js:9</a></p>\n            <div class=\"symbol-classdesc\">\n              <p>Represents a Private Contact on WhatsApp</p>\n            </div>\n            <dl class=\"dl-compact\">\n            </dl>\n          </header>\n          <section id=\"summary\">\n            <div class=\"summary-callout\">\n              <h2 class=\"summary-callout-heading\">Properties</h2>\n              <div class=\"summary-content\">\n                <div class=\"summary-column\">\n                  <dl class=\"dl-summary-callout\">\n                    <dt><a href=\"PrivateContact.html#id\">id</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"PrivateContact.html#isBlocked\">isBlocked</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"PrivateContact.html#isBusiness\">isBusiness</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"PrivateContact.html#isEnterprise\">isEnterprise</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"PrivateContact.html#isGroup\">isGroup</a></dt>\n                    <dd>\n                    </dd>\n                  </dl>\n                </div>\n                <div class=\"summary-column\">\n                  <dl class=\"dl-summary-callout\">\n                    <dt><a href=\"PrivateContact.html#isMe\">isMe</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"PrivateContact.html#isMyContact\">isMyContact</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"PrivateContact.html#isUser\">isUser</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"PrivateContact.html#isWAContact\">isWAContact</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"PrivateContact.html#name\">name</a></dt>\n                    <dd>\n                    </dd>\n                  </dl>\n                </div>\n                <div class=\"summary-column\">\n                  <dl class=\"dl-summary-callout\">\n                    <dt><a href=\"PrivateContact.html#number\">number</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"PrivateContact.html#pushname\">pushname</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"PrivateContact.html#shortName\">shortName</a></dt>\n                    <dd>\n                    </dd>\n                  </dl>\n                </div>\n              </div>\n            </div>\n            <div class=\"summary-callout\">\n              <h2 class=\"summary-callout-heading\">Methods</h2>\n              <div class=\"summary-content\">\n                <div class=\"summary-column\">\n                  <dl class=\"dl-summary-callout\">\n                    <dt><a href=\"PrivateContact.html#block\">block()</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"PrivateContact.html#getAbout\">getAbout()</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"PrivateContact.html#getBroadcast\">getBroadcast()</a></dt>\n                    <dd>\n                    </dd>\n                  </dl>\n                </div>\n                <div class=\"summary-column\">\n                  <dl class=\"dl-summary-callout\">\n                    <dt><a href=\"PrivateContact.html#getChat\">getChat()</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"PrivateContact.html#getCommonGroups\">getCommonGroups()</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"PrivateContact.html#getCountryCode\">getCountryCode()</a></dt>\n                    <dd>\n                    </dd>\n                  </dl>\n                </div>\n                <div class=\"summary-column\">\n                  <dl class=\"dl-summary-callout\">\n                    <dt><a href=\"PrivateContact.html#getFormattedNumber\">getFormattedNumber()</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"PrivateContact.html#getProfilePicUrl\">getProfilePicUrl()</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"PrivateContact.html#unblock\">unblock()</a></dt>\n                    <dd>\n                    </dd>\n                  </dl>\n                </div>\n              </div>\n            </div>\n          </section>\n          <section>\n            <h2 id=\"PrivateContact\">new&nbsp;<span class=\"symbol-name\">PrivateContact</span><span class=\"signature\"><span class=\"signature-params\">()</span></span></h2>\n            <dl class=\"dl-compact\">\n              <dt>Extends</dt>\n              <dd><a href=\"Contact.html\">Contact</a></dd>\n            </dl>\n          </section>\n          <section>\n            <h2>Properties</h2>\n            <section>\n              <h3 id=\"id\"><span class=\"symbol-name\">id</span><small class=\"property-type\">\n                  &nbsp;unknown</small></h3>\n              <p>ID that represents the contact</p>\n              <dl class=\"dl-compact\">\n                <dt>Inherited from</dt>\n                <dd><a href=\"Contact.html#id\">Contact#id</a></dd>\n              </dl>\n              <h3 id=\"isBlocked\"><span class=\"symbol-name\">isBlocked</span><small class=\"property-type\">\n                  &nbsp;unknown</small></h3>\n              <p>Indicates if you have blocked this contact</p>\n              <dl class=\"dl-compact\">\n                <dt>Inherited from</dt>\n                <dd><a href=\"Contact.html#isBlocked\">Contact#isBlocked</a></dd>\n              </dl>\n              <h3 id=\"isBusiness\"><span class=\"symbol-name\">isBusiness</span><small class=\"property-type\">\n                  &nbsp;unknown</small></h3>\n              <p>Indicates if the contact is a business contact</p>\n              <dl class=\"dl-compact\">\n                <dt>Inherited from</dt>\n                <dd><a href=\"Contact.html#isBusiness\">Contact#isBusiness</a></dd>\n              </dl>\n              <h3 id=\"isEnterprise\"><span class=\"symbol-name\">isEnterprise</span><small class=\"property-type\">\n                  &nbsp;unknown</small></h3>\n              <p>Indicates if the contact is an enterprise contact</p>\n              <dl class=\"dl-compact\">\n                <dt>Inherited from</dt>\n                <dd><a href=\"Contact.html#isEnterprise\">Contact#isEnterprise</a></dd>\n              </dl>\n              <h3 id=\"isGroup\"><span class=\"symbol-name\">isGroup</span><small class=\"property-type\">\n                  &nbsp;unknown</small></h3>\n              <p>Indicates if the contact is a group contact</p>\n              <dl class=\"dl-compact\">\n                <dt>Inherited from</dt>\n                <dd><a href=\"Contact.html#isGroup\">Contact#isGroup</a></dd>\n              </dl>\n              <h3 id=\"isMe\"><span class=\"symbol-name\">isMe</span><small class=\"property-type\">\n                  &nbsp;unknown</small></h3>\n              <p>Indicates if the contact is the current user's contact</p>\n              <dl class=\"dl-compact\">\n                <dt>Inherited from</dt>\n                <dd><a href=\"Contact.html#isMe\">Contact#isMe</a></dd>\n              </dl>\n              <h3 id=\"isMyContact\"><span class=\"symbol-name\">isMyContact</span><small class=\"property-type\">\n                  &nbsp;unknown</small></h3>\n              <p>Indicates if the number is saved in the current phone's contacts</p>\n              <dl class=\"dl-compact\">\n                <dt>Inherited from</dt>\n                <dd><a href=\"Contact.html#isMyContact\">Contact#isMyContact</a></dd>\n              </dl>\n              <h3 id=\"isUser\"><span class=\"symbol-name\">isUser</span><small class=\"property-type\">\n                  &nbsp;unknown</small></h3>\n              <p>Indicates if the contact is a user contact</p>\n              <dl class=\"dl-compact\">\n                <dt>Inherited from</dt>\n                <dd><a href=\"Contact.html#isUser\">Contact#isUser</a></dd>\n              </dl>\n              <h3 id=\"isWAContact\"><span class=\"symbol-name\">isWAContact</span><small class=\"property-type\">\n                  &nbsp;unknown</small></h3>\n              <p>Indicates if the number is registered on WhatsApp</p>\n              <dl class=\"dl-compact\">\n                <dt>Inherited from</dt>\n                <dd><a href=\"Contact.html#isWAContact\">Contact#isWAContact</a></dd>\n              </dl>\n              <h3 id=\"name\"><span class=\"symbol-name\">name</span><small class=\"property-type\">\n                  &nbsp;unknown</small></h3>\n              <p>The contact's name, as saved by the current user</p>\n              <dl class=\"dl-compact\">\n                <dt>Inherited from</dt>\n                <dd><a href=\"Contact.html#name\">Contact#name</a></dd>\n              </dl>\n              <h3 id=\"number\"><span class=\"symbol-name\">number</span><small class=\"property-type\">\n                  &nbsp;unknown</small></h3>\n              <p>Contact's phone number</p>\n              <dl class=\"dl-compact\">\n                <dt>Inherited from</dt>\n                <dd><a href=\"Contact.html#number\">Contact#number</a></dd>\n              </dl>\n              <h3 id=\"pushname\"><span class=\"symbol-name\">pushname</span><small class=\"property-type\">\n                  &nbsp;unknown</small></h3>\n              <p>The name that the contact has configured to be shown publically</p>\n              <dl class=\"dl-compact\">\n                <dt>Inherited from</dt>\n                <dd><a href=\"Contact.html#pushname\">Contact#pushname</a></dd>\n              </dl>\n              <h3 id=\"shortName\"><span class=\"symbol-name\">shortName</span><small class=\"property-type\">\n                  &nbsp;unknown</small></h3>\n              <p>A shortened version of name</p>\n              <dl class=\"dl-compact\">\n                <dt>Inherited from</dt>\n                <dd><a href=\"Contact.html#shortName\">Contact#shortName</a></dd>\n              </dl>\n            </section>\n            <h2>Methods</h2>\n            <section>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"block\"><span class=\"symbol-name\">block</span><span class=\"signature\"><span class=\"signature-params\">()</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing boolean</span></span></h3>\n              <p>Blocks this contact from WhatsApp</p>\n              <dl class=\"dl-compact\">\n                <dt>Inherited from</dt>\n                <dd><a href=\"Contact.html#block\">Contact#block</a></dd>\n                <dt>Returns</dt>\n                <dd></dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"getAbout\"><span class=\"symbol-name\">getAbout</span><span class=\"signature\"><span class=\"signature-params\">()</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing nullable string</span></span></h3>\n              <p>Gets the Contact's current &quot;about&quot; info. Returns null if you don't have permission to read their status.</p>\n              <dl class=\"dl-compact\">\n                <dt>Inherited from</dt>\n                <dd><a href=\"Contact.html#getAbout\">Contact#getAbout</a></dd>\n                <dt>Returns</dt>\n                <dd></dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"getBroadcast\"><span class=\"symbol-name\">getBroadcast</span><span class=\"signature\"><span class=\"signature-params\">()</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing <a href=\"Broadcast.html\">Broadcast</a></span></span></h3>\n              <p>Gets the Contact's current status broadcast.</p>\n              <dl class=\"dl-compact\">\n                <dt>Inherited from</dt>\n                <dd><a href=\"Contact.html#getBroadcast\">Contact#getBroadcast</a></dd>\n                <dt>Returns</dt>\n                <dd></dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"getChat\"><span class=\"symbol-name\">getChat</span><span class=\"signature\"><span class=\"signature-params\">()</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing <a href=\"Chat.html\">Chat</a></span></span></h3>\n              <p>Returns the Chat that corresponds to this Contact.\n                Will return null when getting chat for currently logged in user.</p>\n              <dl class=\"dl-compact\">\n                <dt>Inherited from</dt>\n                <dd><a href=\"Contact.html#getChat\">Contact#getChat</a></dd>\n                <dt>Returns</dt>\n                <dd></dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"getCommonGroups\"><span class=\"symbol-name\">getCommonGroups</span><span class=\"signature\"><span class=\"signature-params\">()</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing Array of WAWebJS.ChatId</span></span></h3>\n              <p>Gets the Contact's common groups with you. Returns empty array if you don't have any common group.</p>\n              <dl class=\"dl-compact\">\n                <dt>Inherited from</dt>\n                <dd><a href=\"Contact.html#getCommonGroups\">Contact#getCommonGroups</a></dd>\n                <dt>Returns</dt>\n                <dd></dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"getCountryCode\"><span class=\"symbol-name\">getCountryCode</span><span class=\"signature\"><span class=\"signature-params\">()</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing string</span></span></h3>\n              <p>Returns the contact's countrycode, (1541859685@c.us) =&gt; (1)</p>\n              <dl class=\"dl-compact\">\n                <dt>Inherited from</dt>\n                <dd><a href=\"Contact.html#getCountryCode\">Contact#getCountryCode</a></dd>\n                <dt>Returns</dt>\n                <dd></dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"getFormattedNumber\"><span class=\"symbol-name\">getFormattedNumber</span><span class=\"signature\"><span class=\"signature-params\">()</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing string</span></span></h3>\n              <p>Returns the contact's formatted phone number, (12345678901@c.us) =&gt; (+1 (234) 5678-901)</p>\n              <dl class=\"dl-compact\">\n                <dt>Inherited from</dt>\n                <dd><a href=\"Contact.html#getFormattedNumber\">Contact#getFormattedNumber</a></dd>\n                <dt>Returns</dt>\n                <dd></dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"getProfilePicUrl\"><span class=\"symbol-name\">getProfilePicUrl</span><span class=\"signature\"><span class=\"signature-params\">()</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing string</span></span></h3>\n              <p>Returns the contact's profile picture URL, if privacy settings allow it</p>\n              <dl class=\"dl-compact\">\n                <dt>Inherited from</dt>\n                <dd><a href=\"Contact.html#getProfilePicUrl\">Contact#getProfilePicUrl</a></dd>\n                <dt>Returns</dt>\n                <dd></dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"unblock\"><span class=\"symbol-name\">unblock</span><span class=\"signature\"><span class=\"signature-params\">()</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing boolean</span></span></h3>\n              <p>Unblocks this contact from WhatsApp</p>\n              <dl class=\"dl-compact\">\n                <dt>Inherited from</dt>\n                <dd><a href=\"Contact.html#unblock\">Contact#unblock</a></dd>\n                <dt>Returns</dt>\n                <dd></dd>\n              </dl>\n            </section>\n          </section>\n        </div>\n      </div>\n      <nav id=\"jsdoc-toc-nav\" role=\"navigation\"></nav>\n    </div>\n  </div>\n  <footer id=\"jsdoc-footer\" class=\"jsdoc-footer\">\n    <div id=\"jsdoc-footer-container\">\n      <p>\n        Generated by <a href=\"https://github.com/jsdoc3/jsdoc\">JSDoc</a> 3.6.11 on January 30, 2026.\n      </p>\n    </div>\n  </footer>\n  <script src=\"scripts/jquery.min.js\"></script>\n  <script src=\"scripts/tree.jquery.js\"></script>\n  <script src=\"scripts/prettify.js\"></script>\n  <script src=\"scripts/jsdoc-toc.js\"></script>\n  <script src=\"scripts/linenumber.js\"></script>\n  <script src=\"scripts/scrollanchor.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "docs/Product.html",
    "content": "<!doctype html>\n<html>\n\n<head>\n  <meta name=\"generator\" content=\"JSDoc 3.6.11\">\n  <meta charset=\"utf-8\">\n  <title>whatsapp-web.js 1.34.6 &raquo; Class: Product</title>\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Karla:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Noto+Serif:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Inconsolata:500\" type=\"text/css\">\n  <link href=\"css/baseline.css\" rel=\"stylesheet\">\n</head>\n\n<body onload=\"prettyPrint()\">\n  <nav id=\"jsdoc-navbar\" role=\"navigation\" class=\"jsdoc-navbar\">\n    <div id=\"jsdoc-navbar-container\">\n      <div id=\"jsdoc-navbar-content\">\n        <a href=\"index.html\" class=\"jsdoc-navbar-package-name\">whatsapp-web.<wbr>js 1.<wbr>34.<wbr>6</a>\n      </div>\n    </div>\n  </nav>\n  <div id=\"jsdoc-body-container\">\n    <div id=\"jsdoc-content\">\n      <div id=\"jsdoc-content-container\">\n        <div id=\"jsdoc-main\" role=\"main\">\n          <header class=\"page-header\">\n            <div class=\"symbol-detail-labels\"><span class=\"label label-kind\">class</span></div>\n            <h1><small></small><span class=\"symbol-name\">Product</span></h1>\n            <p class=\"source-link\">Source: <a href=\"structures_Product.js.html#source-line-10\">structures/<wbr>Product.<wbr>js:10</a></p>\n            <div class=\"symbol-classdesc\">\n              <p>Represents a Product on WhatsAppBusiness</p>\n            </div>\n            <dl class=\"dl-compact\">\n            </dl>\n          </header>\n          <section id=\"summary\">\n            <div class=\"summary-callout\">\n              <h2 class=\"summary-callout-heading\">Properties</h2>\n              <div class=\"summary-content\">\n                <div class=\"summary-column\">\n                  <dl class=\"dl-summary-callout\">\n                    <dt><a href=\"Product.html#currency\">currency</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Product.html#data\">data</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Product.html#id\">id</a></dt>\n                    <dd>\n                    </dd>\n                  </dl>\n                </div>\n                <div class=\"summary-column\">\n                  <dl class=\"dl-summary-callout\">\n                    <dt><a href=\"Product.html#name\">name</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Product.html#price\">price</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Product.html#quantity\">quantity</a></dt>\n                    <dd>\n                    </dd>\n                  </dl>\n                </div>\n                <div class=\"summary-column\">\n                  <dl class=\"dl-summary-callout\">\n                    <dt><a href=\"Product.html#thumbnailUrl\">thumbnailUrl</a></dt>\n                    <dd>\n                    </dd>\n                  </dl>\n                </div>\n              </div>\n            </div>\n          </section>\n          <section>\n            <h2 id=\"Product\">new&nbsp;<span class=\"symbol-name\">Product</span><span class=\"signature\"><span class=\"signature-params\">()</span></span></h2>\n            <dl class=\"dl-compact\">\n              <dt>Extends</dt>\n              <dd><a href=\"Base.html\">Base</a></dd>\n            </dl>\n          </section>\n          <section>\n            <h2>Properties</h2>\n            <section>\n              <h3 id=\"currency\"><span class=\"symbol-name\">currency</span><small class=\"property-type\">\n                  &nbsp;string</small></h3>\n              <p>Currency</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"data\"><span class=\"symbol-name\">data</span></h3>\n              <p>Product metadata</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"id\"><span class=\"symbol-name\">id</span><small class=\"property-type\">\n                  &nbsp;string</small></h3>\n              <p>Product ID</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"name\"><span class=\"symbol-name\">name</span><small class=\"property-type\">\n                  &nbsp;string</small></h3>\n              <p>Product Name</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"price\"><span class=\"symbol-name\">price</span><small class=\"property-type\">\n                  &nbsp;string</small></h3>\n              <p>Price</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"quantity\"><span class=\"symbol-name\">quantity</span><small class=\"property-type\">\n                  &nbsp;number</small></h3>\n              <p>Product Quantity</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"thumbnailUrl\"><span class=\"symbol-name\">thumbnailUrl</span><small class=\"property-type\">\n                  &nbsp;string</small></h3>\n              <p>Product Thumbnail</p>\n              <dl class=\"dl-compact\">\n              </dl>\n            </section>\n          </section>\n        </div>\n      </div>\n      <nav id=\"jsdoc-toc-nav\" role=\"navigation\"></nav>\n    </div>\n  </div>\n  <footer id=\"jsdoc-footer\" class=\"jsdoc-footer\">\n    <div id=\"jsdoc-footer-container\">\n      <p>\n        Generated by <a href=\"https://github.com/jsdoc3/jsdoc\">JSDoc</a> 3.6.11 on January 30, 2026.\n      </p>\n    </div>\n  </footer>\n  <script src=\"scripts/jquery.min.js\"></script>\n  <script src=\"scripts/tree.jquery.js\"></script>\n  <script src=\"scripts/prettify.js\"></script>\n  <script src=\"scripts/jsdoc-toc.js\"></script>\n  <script src=\"scripts/linenumber.js\"></script>\n  <script src=\"scripts/scrollanchor.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "docs/Reaction.html",
    "content": "<!doctype html>\n<html>\n\n<head>\n  <meta name=\"generator\" content=\"JSDoc 3.6.11\">\n  <meta charset=\"utf-8\">\n  <title>whatsapp-web.js 1.34.6 &raquo; Class: Reaction</title>\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Karla:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Noto+Serif:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Inconsolata:500\" type=\"text/css\">\n  <link href=\"css/baseline.css\" rel=\"stylesheet\">\n</head>\n\n<body onload=\"prettyPrint()\">\n  <nav id=\"jsdoc-navbar\" role=\"navigation\" class=\"jsdoc-navbar\">\n    <div id=\"jsdoc-navbar-container\">\n      <div id=\"jsdoc-navbar-content\">\n        <a href=\"index.html\" class=\"jsdoc-navbar-package-name\">whatsapp-web.<wbr>js 1.<wbr>34.<wbr>6</a>\n      </div>\n    </div>\n  </nav>\n  <div id=\"jsdoc-body-container\">\n    <div id=\"jsdoc-content\">\n      <div id=\"jsdoc-content-container\">\n        <div id=\"jsdoc-main\" role=\"main\">\n          <header class=\"page-header\">\n            <div class=\"symbol-detail-labels\"><span class=\"label label-kind\">class</span></div>\n            <h1><small></small><span class=\"symbol-name\">Reaction</span></h1>\n            <p class=\"source-link\">Source: <a href=\"structures_Reaction.js.html#source-line-9\">structures/<wbr>Reaction.<wbr>js:9</a></p>\n            <div class=\"symbol-classdesc\">\n              <p>Represents a Reaction on WhatsApp</p>\n            </div>\n            <dl class=\"dl-compact\">\n            </dl>\n          </header>\n          <section id=\"summary\">\n            <div class=\"summary-callout\">\n              <h2 class=\"summary-callout-heading\">Properties</h2>\n              <div class=\"summary-content\">\n                <div class=\"summary-column\">\n                  <dl class=\"dl-summary-callout\">\n                    <dt><a href=\"Reaction.html#ack\">ack</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Reaction.html#id\">id</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Reaction.html#msgId\">msgId</a></dt>\n                    <dd>\n                    </dd>\n                  </dl>\n                </div>\n                <div class=\"summary-column\">\n                  <dl class=\"dl-summary-callout\">\n                    <dt><a href=\"Reaction.html#orphan\">orphan</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Reaction.html#orphanReason\">orphanReason</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Reaction.html#reaction\">reaction</a></dt>\n                    <dd>\n                    </dd>\n                  </dl>\n                </div>\n                <div class=\"summary-column\">\n                  <dl class=\"dl-summary-callout\">\n                    <dt><a href=\"Reaction.html#read\">read</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Reaction.html#senderId\">senderId</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Reaction.html#timestamp\">timestamp</a></dt>\n                    <dd>\n                    </dd>\n                  </dl>\n                </div>\n              </div>\n            </div>\n          </section>\n          <section>\n            <h2 id=\"Reaction\">new&nbsp;<span class=\"symbol-name\">Reaction</span><span class=\"signature\"><span class=\"signature-params\">()</span></span></h2>\n            <dl class=\"dl-compact\">\n              <dt>Extends</dt>\n              <dd><a href=\"Base.html\">Base</a></dd>\n            </dl>\n          </section>\n          <section>\n            <h2>Properties</h2>\n            <section>\n              <h3 id=\"ack\"><span class=\"symbol-name\">ack</span><small class=\"property-type\">\n                  &nbsp;nullable number</small></h3>\n              <p>ACK</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"id\"><span class=\"symbol-name\">id</span><small class=\"property-type\">\n                  &nbsp;object</small></h3>\n              <p>Reaction ID</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"msgId\"><span class=\"symbol-name\">msgId</span><small class=\"property-type\">\n                  &nbsp;object</small></h3>\n              <p>Message ID</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"orphan\"><span class=\"symbol-name\">orphan</span><small class=\"property-type\">\n                  &nbsp;number</small></h3>\n              <p>Orphan</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"orphanReason\"><span class=\"symbol-name\">orphanReason</span><small class=\"property-type\">\n                  &nbsp;nullable string</small></h3>\n              <p>Orphan reason</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"reaction\"><span class=\"symbol-name\">reaction</span><small class=\"property-type\">\n                  &nbsp;string</small></h3>\n              <p>Reaction</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"read\"><span class=\"symbol-name\">read</span><small class=\"property-type\">\n                  &nbsp;boolean</small></h3>\n              <p>Read</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"senderId\"><span class=\"symbol-name\">senderId</span><small class=\"property-type\">\n                  &nbsp;string</small></h3>\n              <p>Sender ID</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"timestamp\"><span class=\"symbol-name\">timestamp</span><small class=\"property-type\">\n                  &nbsp;number</small></h3>\n              <p>Unix timestamp for when the reaction was created</p>\n              <dl class=\"dl-compact\">\n              </dl>\n            </section>\n          </section>\n        </div>\n      </div>\n      <nav id=\"jsdoc-toc-nav\" role=\"navigation\"></nav>\n    </div>\n  </div>\n  <footer id=\"jsdoc-footer\" class=\"jsdoc-footer\">\n    <div id=\"jsdoc-footer-container\">\n      <p>\n        Generated by <a href=\"https://github.com/jsdoc3/jsdoc\">JSDoc</a> 3.6.11 on January 30, 2026.\n      </p>\n    </div>\n  </footer>\n  <script src=\"scripts/jquery.min.js\"></script>\n  <script src=\"scripts/tree.jquery.js\"></script>\n  <script src=\"scripts/prettify.js\"></script>\n  <script src=\"scripts/jsdoc-toc.js\"></script>\n  <script src=\"scripts/linenumber.js\"></script>\n  <script src=\"scripts/scrollanchor.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "docs/RemoteAuth.html",
    "content": "<!doctype html>\n<html>\n\n<head>\n  <meta name=\"generator\" content=\"JSDoc 3.6.11\">\n  <meta charset=\"utf-8\">\n  <title>whatsapp-web.js 1.34.6 &raquo; Class: RemoteAuth</title>\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Karla:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Noto+Serif:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Inconsolata:500\" type=\"text/css\">\n  <link href=\"css/baseline.css\" rel=\"stylesheet\">\n</head>\n\n<body onload=\"prettyPrint()\">\n  <nav id=\"jsdoc-navbar\" role=\"navigation\" class=\"jsdoc-navbar\">\n    <div id=\"jsdoc-navbar-container\">\n      <div id=\"jsdoc-navbar-content\">\n        <a href=\"index.html\" class=\"jsdoc-navbar-package-name\">whatsapp-web.<wbr>js 1.<wbr>34.<wbr>6</a>\n      </div>\n    </div>\n  </nav>\n  <div id=\"jsdoc-body-container\">\n    <div id=\"jsdoc-content\">\n      <div id=\"jsdoc-content-container\">\n        <div id=\"jsdoc-main\" role=\"main\">\n          <header class=\"page-header\">\n            <div class=\"symbol-detail-labels\"><span class=\"label label-kind\">class</span></div>\n            <h1><small></small><span class=\"symbol-name\">RemoteAuth</span></h1>\n            <p class=\"source-link\">Source: <a href=\"authStrategies_RemoteAuth.js.html#source-line-27\">authStrategies/<wbr>RemoteAuth.<wbr>js:27</a></p>\n            <div class=\"symbol-classdesc\">\n              <p>Remote-based authentication</p>\n            </div>\n            <dl class=\"dl-compact\">\n            </dl>\n          </header>\n          <section id=\"summary\">\n          </section>\n          <section>\n            <h2 id=\"RemoteAuth\">new&nbsp;<span class=\"symbol-name\">RemoteAuth</span><span class=\"signature\"><span class=\"signature-params\">(options)</span></span></h2>\n            <section>\n              <h3>Parameters</h3>\n              <table class=\"jsdoc-details-table\">\n                <thead>\n                  <tr>\n                    <th>Name</th>\n                    <th>Type</th>\n                    <th>Optional</th>\n                    <th>Description</th>\n                  </tr>\n                </thead>\n                <tbody>\n                  <tr>\n                    <td>\n                      <p>options</p>\n                    </td>\n                    <td>\n                      <p>&nbsp;</p>\n                    </td>\n                    <td>\n                      <p>&nbsp;</p>\n                    </td>\n                    <td>\n                      <p>options</p>\n                      <p>Values in <code>options</code> have the following properties:</p>\n                      <table class=\"jsdoc-details-table\">\n                        <thead>\n                          <tr>\n                            <th>Name</th>\n                            <th>Type</th>\n                            <th>Optional</th>\n                            <th>Description</th>\n                          </tr>\n                        </thead>\n                        <tbody>\n                          <tr>\n                            <td>\n                              <p>store</p>\n                            </td>\n                            <td>\n                              <p>&nbsp;</p>\n                            </td>\n                            <td>\n                              <p>&nbsp;</p>\n                            </td>\n                            <td>\n                              <p>Remote database store instance</p>\n                            </td>\n                          </tr>\n                          <tr>\n                            <td>\n                              <p>clientId</p>\n                            </td>\n                            <td>\n                              <p>&nbsp;</p>\n                            </td>\n                            <td>\n                              <p>&nbsp;</p>\n                            </td>\n                            <td>\n                              <p>Client id to distinguish instances if you are using multiple, otherwise keep null if you are using only one instance</p>\n                            </td>\n                          </tr>\n                          <tr>\n                            <td>\n                              <p>dataPath</p>\n                            </td>\n                            <td>\n                              <p>&nbsp;</p>\n                            </td>\n                            <td>\n                              <p>&nbsp;</p>\n                            </td>\n                            <td>\n                              <p>Change the default path for saving session files, default is: &quot;./.wwebjs_auth/&quot;</p>\n                            </td>\n                          </tr>\n                          <tr>\n                            <td>\n                              <p>backupSyncIntervalMs</p>\n                            </td>\n                            <td>\n                              <p>&nbsp;</p>\n                            </td>\n                            <td>\n                              <p>&nbsp;</p>\n                            </td>\n                            <td>\n                              <p>Sets the time interval for periodic session backups. Accepts values starting from 60000ms {1 minute}</p>\n                            </td>\n                          </tr>\n                          <tr>\n                            <td>\n                              <p>rmMaxRetries</p>\n                            </td>\n                            <td>\n                              <p>&nbsp;</p>\n                            </td>\n                            <td>\n                              <p>&nbsp;</p>\n                            </td>\n                            <td>\n                              <p>Sets the maximum number of retries for removing the session directory</p>\n                            </td>\n                          </tr>\n                        </tbody>\n                      </table>\n                    </td>\n                  </tr>\n                </tbody>\n              </table>\n            </section>\n            <dl class=\"dl-compact\">\n            </dl>\n          </section>\n          <section>\n          </section>\n        </div>\n      </div>\n      <nav id=\"jsdoc-toc-nav\" role=\"navigation\"></nav>\n    </div>\n  </div>\n  <footer id=\"jsdoc-footer\" class=\"jsdoc-footer\">\n    <div id=\"jsdoc-footer-container\">\n      <p>\n        Generated by <a href=\"https://github.com/jsdoc3/jsdoc\">JSDoc</a> 3.6.11 on January 30, 2026.\n      </p>\n    </div>\n  </footer>\n  <script src=\"scripts/jquery.min.js\"></script>\n  <script src=\"scripts/tree.jquery.js\"></script>\n  <script src=\"scripts/prettify.js\"></script>\n  <script src=\"scripts/jsdoc-toc.js\"></script>\n  <script src=\"scripts/linenumber.js\"></script>\n  <script src=\"scripts/scrollanchor.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "docs/RemoteWebCache.html",
    "content": "<!doctype html>\n<html>\n\n<head>\n  <meta name=\"generator\" content=\"JSDoc 3.6.11\">\n  <meta charset=\"utf-8\">\n  <title>whatsapp-web.js 1.34.6 &raquo; Class: RemoteWebCache</title>\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Karla:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Noto+Serif:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Inconsolata:500\" type=\"text/css\">\n  <link href=\"css/baseline.css\" rel=\"stylesheet\">\n</head>\n\n<body onload=\"prettyPrint()\">\n  <nav id=\"jsdoc-navbar\" role=\"navigation\" class=\"jsdoc-navbar\">\n    <div id=\"jsdoc-navbar-container\">\n      <div id=\"jsdoc-navbar-content\">\n        <a href=\"index.html\" class=\"jsdoc-navbar-package-name\">whatsapp-web.<wbr>js 1.<wbr>34.<wbr>6</a>\n      </div>\n    </div>\n  </nav>\n  <div id=\"jsdoc-body-container\">\n    <div id=\"jsdoc-content\">\n      <div id=\"jsdoc-content-container\">\n        <div id=\"jsdoc-main\" role=\"main\">\n          <header class=\"page-header\">\n            <div class=\"symbol-detail-labels\"><span class=\"label label-kind\">class</span></div>\n            <h1><small></small><span class=\"symbol-name\">RemoteWebCache</span></h1>\n            <p class=\"source-link\">Source: <a href=\"webCache_RemoteWebCache.js.html#source-line-10\">webCache/<wbr>RemoteWebCache.<wbr>js:10</a></p>\n            <div class=\"symbol-classdesc\">\n              <p>RemoteWebCache - Fetches a WhatsApp Web version index from a remote server</p>\n            </div>\n            <dl class=\"dl-compact\">\n            </dl>\n          </header>\n          <section id=\"summary\">\n          </section>\n          <section>\n            <h2 id=\"RemoteWebCache\">new&nbsp;<span class=\"symbol-name\">RemoteWebCache</span><span class=\"signature\"><span class=\"signature-params\">(options)</span></span></h2>\n            <section>\n              <h3>Parameters</h3>\n              <table class=\"jsdoc-details-table\">\n                <thead>\n                  <tr>\n                    <th>Name</th>\n                    <th>Type</th>\n                    <th>Optional</th>\n                    <th>Description</th>\n                  </tr>\n                </thead>\n                <tbody>\n                  <tr>\n                    <td>\n                      <p>options</p>\n                    </td>\n                    <td>\n                      <p>&nbsp;</p>\n                    </td>\n                    <td>\n                      <p>&nbsp;</p>\n                    </td>\n                    <td>\n                      <p>options</p>\n                      <p>Values in <code>options</code> have the following properties:</p>\n                      <table class=\"jsdoc-details-table\">\n                        <thead>\n                          <tr>\n                            <th>Name</th>\n                            <th>Type</th>\n                            <th>Optional</th>\n                            <th>Description</th>\n                          </tr>\n                        </thead>\n                        <tbody>\n                          <tr>\n                            <td>\n                              <p>remotePath</p>\n                            </td>\n                            <td>\n                              <p>&nbsp;</p>\n                            </td>\n                            <td>\n                              <p>&nbsp;</p>\n                            </td>\n                            <td>\n                              <p>Endpoint that should be used to fetch the version index. Use {version} as a placeholder for the version number.</p>\n                            </td>\n                          </tr>\n                          <tr>\n                            <td>\n                              <p>strict</p>\n                            </td>\n                            <td>\n                              <p>&nbsp;</p>\n                            </td>\n                            <td>\n                              <p>&nbsp;</p>\n                            </td>\n                            <td>\n                              <p>If true, will throw an error if the requested version can't be fetched. If false, will resolve to the latest version. Defaults to false.</p>\n                            </td>\n                          </tr>\n                        </tbody>\n                      </table>\n                    </td>\n                  </tr>\n                </tbody>\n              </table>\n            </section>\n            <dl class=\"dl-compact\">\n            </dl>\n          </section>\n          <section>\n          </section>\n        </div>\n      </div>\n      <nav id=\"jsdoc-toc-nav\" role=\"navigation\"></nav>\n    </div>\n  </div>\n  <footer id=\"jsdoc-footer\" class=\"jsdoc-footer\">\n    <div id=\"jsdoc-footer-container\">\n      <p>\n        Generated by <a href=\"https://github.com/jsdoc3/jsdoc\">JSDoc</a> 3.6.11 on January 30, 2026.\n      </p>\n    </div>\n  </footer>\n  <script src=\"scripts/jquery.min.js\"></script>\n  <script src=\"scripts/tree.jquery.js\"></script>\n  <script src=\"scripts/prettify.js\"></script>\n  <script src=\"scripts/jsdoc-toc.js\"></script>\n  <script src=\"scripts/linenumber.js\"></script>\n  <script src=\"scripts/scrollanchor.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "docs/ScheduledEvent.html",
    "content": "<!doctype html>\n<html>\n\n<head>\n  <meta name=\"generator\" content=\"JSDoc 3.6.11\">\n  <meta charset=\"utf-8\">\n  <title>whatsapp-web.js 1.34.6 &raquo; Class: ScheduledEvent</title>\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Karla:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Noto+Serif:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Inconsolata:500\" type=\"text/css\">\n  <link href=\"css/baseline.css\" rel=\"stylesheet\">\n</head>\n\n<body onload=\"prettyPrint()\">\n  <nav id=\"jsdoc-navbar\" role=\"navigation\" class=\"jsdoc-navbar\">\n    <div id=\"jsdoc-navbar-container\">\n      <div id=\"jsdoc-navbar-content\">\n        <a href=\"index.html\" class=\"jsdoc-navbar-package-name\">whatsapp-web.<wbr>js 1.<wbr>34.<wbr>6</a>\n      </div>\n    </div>\n  </nav>\n  <div id=\"jsdoc-body-container\">\n    <div id=\"jsdoc-content\">\n      <div id=\"jsdoc-content-container\">\n        <div id=\"jsdoc-main\" role=\"main\">\n          <header class=\"page-header\">\n            <div class=\"symbol-detail-labels\"><span class=\"label label-kind\">class</span></div>\n            <h1><small></small><span class=\"symbol-name\">ScheduledEvent</span></h1>\n            <p class=\"source-link\">Source: <a href=\"structures_ScheduledEvent.js.html#source-line-15\">structures/<wbr>ScheduledEvent.<wbr>js:15</a></p>\n            <div class=\"symbol-classdesc\">\n              <p>Represents a ScheduledEvent on WhatsApp</p>\n            </div>\n            <dl class=\"dl-compact\">\n            </dl>\n          </header>\n          <section id=\"summary\">\n            <div class=\"summary-callout\">\n              <h2 class=\"summary-callout-heading\">Properties</h2>\n              <div class=\"summary-content\">\n                <div class=\"summary-column\">\n                  <dl class=\"dl-summary-callout\">\n                    <dt><a href=\"ScheduledEvent.html#eventSendOptions\">eventSendOptions</a></dt>\n                    <dd>\n                    </dd>\n                  </dl>\n                </div>\n                <div class=\"summary-column\">\n                  <dl class=\"dl-summary-callout\">\n                    <dt><a href=\"ScheduledEvent.html#name\">name</a></dt>\n                    <dd>\n                    </dd>\n                  </dl>\n                </div>\n                <div class=\"summary-column\">\n                  <dl class=\"dl-summary-callout\">\n                    <dt><a href=\"ScheduledEvent.html#startTimeTs\">startTimeTs</a></dt>\n                    <dd>\n                    </dd>\n                  </dl>\n                </div>\n              </div>\n            </div>\n            <div class=\"summary-callout\">\n              <h2 class=\"summary-callout-heading\">Method</h2>\n              <div class=\"summary-content\">\n                <div class=\"summary-column\">\n                  <dl class=\"dl-summary-callout\">\n                    <dt><a href=\"ScheduledEvent.html#_validateInputs\">_validateInputs(propName, propValue)</a></dt>\n                    <dd>\n                    </dd>\n                  </dl>\n                </div>\n                <div class=\"summary-column\">\n                </div>\n                <div class=\"summary-column\">\n                </div>\n              </div>\n            </div>\n          </section>\n          <section>\n            <h2 id=\"ScheduledEvent\">new&nbsp;<span class=\"symbol-name\">ScheduledEvent</span><span class=\"signature\"><span class=\"signature-params\">(name, startTime, options)</span></span></h2>\n            <section>\n              <h3>Parameters</h3>\n              <table class=\"jsdoc-details-table\">\n                <thead>\n                  <tr>\n                    <th>Name</th>\n                    <th>Type</th>\n                    <th>Optional</th>\n                    <th>Description</th>\n                  </tr>\n                </thead>\n                <tbody>\n                  <tr>\n                    <td>\n                      <p>name</p>\n                    </td>\n                    <td>\n                      <p>&nbsp;</p>\n                    </td>\n                    <td>\n                      <p>&nbsp;</p>\n                    </td>\n                    <td>\n                    </td>\n                  </tr>\n                  <tr>\n                    <td>\n                      <p>startTime</p>\n                    </td>\n                    <td>\n                      <p>&nbsp;</p>\n                    </td>\n                    <td>\n                      <p>&nbsp;</p>\n                    </td>\n                    <td>\n                    </td>\n                  </tr>\n                  <tr>\n                    <td>\n                      <p>options</p>\n                    </td>\n                    <td>\n                      <p>&nbsp;</p>\n                    </td>\n                    <td>\n                      <p>&nbsp;</p>\n                    </td>\n                    <td>\n                    </td>\n                  </tr>\n                </tbody>\n              </table>\n            </section>\n            <dl class=\"dl-compact\">\n            </dl>\n          </section>\n          <section>\n            <h2>Properties</h2>\n            <section>\n              <h3 id=\"eventSendOptions\"><span class=\"symbol-name\">eventSendOptions</span><small class=\"property-type\">\n                  &nbsp;Object</small></h3>\n              <p>The send options for the event</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"name\"><span class=\"symbol-name\">name</span><small class=\"property-type\">\n                  &nbsp;string</small></h3>\n              <p>The name of the event</p>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"startTimeTs\"><span class=\"symbol-name\">startTimeTs</span><small class=\"property-type\">\n                  &nbsp;number</small></h3>\n              <p>The start time of the event</p>\n              <dl class=\"dl-compact\">\n              </dl>\n            </section>\n            <h2>Method</h2>\n            <section>\n              <h3 id=\"_validateInputs\"><span class=\"symbol-name\">_validateInputs</span><span class=\"signature\"><span class=\"signature-params\">(propName, propValue)</span>&nbsp;&rarr; <span class=\"signature-returns\"> (string or number)</span></span></h3>\n              <p>Inner function to validate input values</p>\n              <section>\n                <h4>Parameters</h4>\n                <table class=\"jsdoc-details-table\">\n                  <thead>\n                    <tr>\n                      <th>Name</th>\n                      <th>Type</th>\n                      <th>Optional</th>\n                      <th>Description</th>\n                    </tr>\n                  </thead>\n                  <tbody>\n                    <tr>\n                      <td>\n                        <p>propName</p>\n                      </td>\n                      <td>\n                        <p>string</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>The property name to validate the value of</p>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>propValue</p>\n                      </td>\n                      <td>\n                        <p>(string or number)</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>The property value to validate</p>\n                      </td>\n                    </tr>\n                  </tbody>\n                </table>\n              </section>\n              <dl class=\"dl-compact\">\n                <dt>Returns</dt>\n                <dd>\n                  <p><code>(string or number)</code> \n                  <p>The property value if a validation succeeded</p>\n                  </p>\n                </dd>\n              </dl>\n            </section>\n          </section>\n        </div>\n      </div>\n      <nav id=\"jsdoc-toc-nav\" role=\"navigation\"></nav>\n    </div>\n  </div>\n  <footer id=\"jsdoc-footer\" class=\"jsdoc-footer\">\n    <div id=\"jsdoc-footer-container\">\n      <p>\n        Generated by <a href=\"https://github.com/jsdoc3/jsdoc\">JSDoc</a> 3.6.11 on January 30, 2026.\n      </p>\n    </div>\n  </footer>\n  <script src=\"scripts/jquery.min.js\"></script>\n  <script src=\"scripts/tree.jquery.js\"></script>\n  <script src=\"scripts/prettify.js\"></script>\n  <script src=\"scripts/jsdoc-toc.js\"></script>\n  <script src=\"scripts/linenumber.js\"></script>\n  <script src=\"scripts/scrollanchor.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "docs/Util.html",
    "content": "<!doctype html>\n<html>\n\n<head>\n  <meta name=\"generator\" content=\"JSDoc 3.6.11\">\n  <meta charset=\"utf-8\">\n  <title>whatsapp-web.js 1.34.6 &raquo; Class: Util</title>\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Karla:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Noto+Serif:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Inconsolata:500\" type=\"text/css\">\n  <link href=\"css/baseline.css\" rel=\"stylesheet\">\n</head>\n\n<body onload=\"prettyPrint()\">\n  <nav id=\"jsdoc-navbar\" role=\"navigation\" class=\"jsdoc-navbar\">\n    <div id=\"jsdoc-navbar-container\">\n      <div id=\"jsdoc-navbar-content\">\n        <a href=\"index.html\" class=\"jsdoc-navbar-package-name\">whatsapp-web.<wbr>js 1.<wbr>34.<wbr>6</a>\n      </div>\n    </div>\n  </nav>\n  <div id=\"jsdoc-body-container\">\n    <div id=\"jsdoc-content\">\n      <div id=\"jsdoc-content-container\">\n        <div id=\"jsdoc-main\" role=\"main\">\n          <header class=\"page-header\">\n            <div class=\"symbol-detail-labels\"><span class=\"label label-kind\">class</span></div>\n            <h1><small></small><span class=\"symbol-name\">Util</span></h1>\n            <p class=\"source-link\">Source: <a href=\"util_Util.js.html#source-line-14\">util/<wbr>Util.<wbr>js:14</a></p>\n            <div class=\"symbol-classdesc\">\n              <p>Utility methods</p>\n            </div>\n            <dl class=\"dl-compact\">\n            </dl>\n          </header>\n          <section id=\"summary\">\n            <div class=\"summary-callout\">\n              <h2 class=\"summary-callout-heading\">Methods</h2>\n              <div class=\"summary-content\">\n                <div class=\"summary-column\">\n                  <dl class=\"dl-summary-callout\">\n                    <dt><a href=\"Util.html#.formatImageToWebpSticker\">formatImageToWebpSticker(media)</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Util.html#.formatToWebpSticker\">formatToWebpSticker(media, metadata)</a></dt>\n                    <dd>\n                    </dd>\n                  </dl>\n                </div>\n                <div class=\"summary-column\">\n                  <dl class=\"dl-summary-callout\">\n                    <dt><a href=\"Util.html#.formatVideoToWebpSticker\">formatVideoToWebpSticker(media)</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"Util.html#.setFfmpegPath\">setFfmpegPath(path)</a></dt>\n                    <dd>\n                    </dd>\n                  </dl>\n                </div>\n                <div class=\"summary-column\">\n                </div>\n              </div>\n            </div>\n          </section>\n          <section>\n            <h2 id=\"Util\">new&nbsp;<span class=\"symbol-name\">Util</span><span class=\"signature\"><span class=\"signature-params\">()</span></span></h2>\n            <dl class=\"dl-compact\">\n            </dl>\n          </section>\n          <section>\n            <h2>Methods</h2>\n            <section>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span>&nbsp;<span class=\"label label-static\">static</span></div>\n              <h3 id=\".formatImageToWebpSticker\"><span class=\"symbol-name\">formatImageToWebpSticker</span><span class=\"signature\"><span class=\"signature-params\">(media)</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing <a href=\"MessageMedia.html\">MessageMedia</a></span></span></h3>\n              <p>Formats a image to webp</p>\n              <section>\n                <h4>Parameter</h4>\n                <table class=\"jsdoc-details-table\">\n                  <thead>\n                    <tr>\n                      <th>Name</th>\n                      <th>Type</th>\n                      <th>Optional</th>\n                      <th>Description</th>\n                    </tr>\n                  </thead>\n                  <tbody>\n                    <tr>\n                      <td>\n                        <p>media</p>\n                      </td>\n                      <td>\n                        <p><a href=\"MessageMedia.html\">MessageMedia</a></p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                  </tbody>\n                </table>\n              </section>\n              <dl class=\"dl-compact\">\n                <dt>Returns</dt>\n                <dd>\n                  <p><code>Promise containing <a href=\"MessageMedia.html\">MessageMedia</a></code> \n                  <p>media in webp format</p>\n                  </p>\n                </dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span>&nbsp;<span class=\"label label-static\">static</span></div>\n              <h3 id=\".formatToWebpSticker\"><span class=\"symbol-name\">formatToWebpSticker</span><span class=\"signature\"><span class=\"signature-params\">(media, metadata)</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing <a href=\"MessageMedia.html\">MessageMedia</a></span></span></h3>\n              <p>Formats a media to webp</p>\n              <section>\n                <h4>Parameters</h4>\n                <table class=\"jsdoc-details-table\">\n                  <thead>\n                    <tr>\n                      <th>Name</th>\n                      <th>Type</th>\n                      <th>Optional</th>\n                      <th>Description</th>\n                    </tr>\n                  </thead>\n                  <tbody>\n                    <tr>\n                      <td>\n                        <p>media</p>\n                      </td>\n                      <td>\n                        <p><a href=\"MessageMedia.html\">MessageMedia</a></p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>metadata</p>\n                      </td>\n                      <td>\n                        <p><a href=\"global.html#StickerMetadata\">StickerMetadata</a></p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                  </tbody>\n                </table>\n              </section>\n              <dl class=\"dl-compact\">\n                <dt>Returns</dt>\n                <dd>\n                  <p><code>Promise containing <a href=\"MessageMedia.html\">MessageMedia</a></code> \n                  <p>media in webp format</p>\n                  </p>\n                </dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span>&nbsp;<span class=\"label label-static\">static</span></div>\n              <h3 id=\".formatVideoToWebpSticker\"><span class=\"symbol-name\">formatVideoToWebpSticker</span><span class=\"signature\"><span class=\"signature-params\">(media)</span>&nbsp;&rarr; <span class=\"signature-returns\"> Promise containing <a href=\"MessageMedia.html\">MessageMedia</a></span></span></h3>\n              <p>Formats a video to webp</p>\n              <section>\n                <h4>Parameter</h4>\n                <table class=\"jsdoc-details-table\">\n                  <thead>\n                    <tr>\n                      <th>Name</th>\n                      <th>Type</th>\n                      <th>Optional</th>\n                      <th>Description</th>\n                    </tr>\n                  </thead>\n                  <tbody>\n                    <tr>\n                      <td>\n                        <p>media</p>\n                      </td>\n                      <td>\n                        <p><a href=\"MessageMedia.html\">MessageMedia</a></p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                  </tbody>\n                </table>\n              </section>\n              <dl class=\"dl-compact\">\n                <dt>Returns</dt>\n                <dd>\n                  <p><code>Promise containing <a href=\"MessageMedia.html\">MessageMedia</a></code> \n                  <p>media in webp format</p>\n                  </p>\n                </dd>\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-static\">static</span></div>\n              <h3 id=\".setFfmpegPath\"><span class=\"symbol-name\">setFfmpegPath</span><span class=\"signature\"><span class=\"signature-params\">(path)</span></span></h3>\n              <p>Configure ffmpeg path</p>\n              <section>\n                <h4>Parameter</h4>\n                <table class=\"jsdoc-details-table\">\n                  <thead>\n                    <tr>\n                      <th>Name</th>\n                      <th>Type</th>\n                      <th>Optional</th>\n                      <th>Description</th>\n                    </tr>\n                  </thead>\n                  <tbody>\n                    <tr>\n                      <td>\n                        <p>path</p>\n                      </td>\n                      <td>\n                        <p>string</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                  </tbody>\n                </table>\n              </section>\n              <dl class=\"dl-compact\">\n              </dl>\n            </section>\n          </section>\n        </div>\n      </div>\n      <nav id=\"jsdoc-toc-nav\" role=\"navigation\"></nav>\n    </div>\n  </div>\n  <footer id=\"jsdoc-footer\" class=\"jsdoc-footer\">\n    <div id=\"jsdoc-footer-container\">\n      <p>\n        Generated by <a href=\"https://github.com/jsdoc3/jsdoc\">JSDoc</a> 3.6.11 on January 30, 2026.\n      </p>\n    </div>\n  </footer>\n  <script src=\"scripts/jquery.min.js\"></script>\n  <script src=\"scripts/tree.jquery.js\"></script>\n  <script src=\"scripts/prettify.js\"></script>\n  <script src=\"scripts/jsdoc-toc.js\"></script>\n  <script src=\"scripts/linenumber.js\"></script>\n  <script src=\"scripts/scrollanchor.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "docs/WebCache.html",
    "content": "<!doctype html>\n<html>\n\n<head>\n  <meta name=\"generator\" content=\"JSDoc 3.6.11\">\n  <meta charset=\"utf-8\">\n  <title>whatsapp-web.js 1.34.6 &raquo; Class: WebCache</title>\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Karla:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Noto+Serif:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Inconsolata:500\" type=\"text/css\">\n  <link href=\"css/baseline.css\" rel=\"stylesheet\">\n</head>\n\n<body onload=\"prettyPrint()\">\n  <nav id=\"jsdoc-navbar\" role=\"navigation\" class=\"jsdoc-navbar\">\n    <div id=\"jsdoc-navbar-container\">\n      <div id=\"jsdoc-navbar-content\">\n        <a href=\"index.html\" class=\"jsdoc-navbar-package-name\">whatsapp-web.<wbr>js 1.<wbr>34.<wbr>6</a>\n      </div>\n    </div>\n  </nav>\n  <div id=\"jsdoc-body-container\">\n    <div id=\"jsdoc-content\">\n      <div id=\"jsdoc-content-container\">\n        <div id=\"jsdoc-main\" role=\"main\">\n          <header class=\"page-header\">\n            <div class=\"symbol-detail-labels\"><span class=\"label label-kind\">class</span></div>\n            <h1><small></small><span class=\"symbol-name\">WebCache</span></h1>\n            <p class=\"source-link\">Source: <a href=\"webCache_WebCache.js.html#source-line-4\">webCache/<wbr>WebCache.<wbr>js:4</a></p>\n            <div class=\"symbol-classdesc\">\n              <p>Default implementation of a web version cache that does nothing.</p>\n            </div>\n            <dl class=\"dl-compact\">\n            </dl>\n          </header>\n          <section id=\"summary\">\n          </section>\n          <section>\n            <h2 id=\"WebCache\">new&nbsp;<span class=\"symbol-name\">WebCache</span><span class=\"signature\"><span class=\"signature-params\">()</span></span></h2>\n            <dl class=\"dl-compact\">\n            </dl>\n          </section>\n          <section>\n          </section>\n        </div>\n      </div>\n      <nav id=\"jsdoc-toc-nav\" role=\"navigation\"></nav>\n    </div>\n  </div>\n  <footer id=\"jsdoc-footer\" class=\"jsdoc-footer\">\n    <div id=\"jsdoc-footer-container\">\n      <p>\n        Generated by <a href=\"https://github.com/jsdoc3/jsdoc\">JSDoc</a> 3.6.11 on January 30, 2026.\n      </p>\n    </div>\n  </footer>\n  <script src=\"scripts/jquery.min.js\"></script>\n  <script src=\"scripts/tree.jquery.js\"></script>\n  <script src=\"scripts/prettify.js\"></script>\n  <script src=\"scripts/jsdoc-toc.js\"></script>\n  <script src=\"scripts/linenumber.js\"></script>\n  <script src=\"scripts/scrollanchor.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "docs/authStrategies_BaseAuthStrategy.js.html",
    "content": "<!doctype html>\n<html>\n\n<head>\n  <meta name=\"generator\" content=\"JSDoc 3.6.11\">\n  <meta charset=\"utf-8\">\n  <title>whatsapp-web.js 1.34.6 &raquo; Source: authStrategies/BaseAuthStrategy.js</title>\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Karla:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Noto+Serif:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Inconsolata:500\" type=\"text/css\">\n  <link href=\"css/baseline.css\" rel=\"stylesheet\">\n</head>\n\n<body onload=\"prettyPrint()\">\n  <nav id=\"jsdoc-navbar\" role=\"navigation\" class=\"jsdoc-navbar\">\n    <div id=\"jsdoc-navbar-container\">\n      <div id=\"jsdoc-navbar-content\">\n        <a href=\"index.html\" class=\"jsdoc-navbar-package-name\">whatsapp-web.<wbr>js 1.<wbr>34.<wbr>6</a>\n      </div>\n    </div>\n  </nav>\n  <div id=\"jsdoc-body-container\">\n    <div id=\"jsdoc-content\">\n      <div id=\"jsdoc-content-container\">\n        <div id=\"jsdoc-banner\" role=\"banner\">\n        </div>\n        <div id=\"jsdoc-main\" role=\"main\">\n          <header class=\"page-header\">\n            <h1>Source: authStrategies/BaseAuthStrategy.js</h1>\n          </header>\n          <article>\n            <pre class=\"prettyprint linenums\"><code>&#x27;use strict&#x27;;\n\n/**\n * Base class which all authentication strategies extend\n */\nclass BaseAuthStrategy {\n    constructor() {}\n    setup(client) {\n        this.client &#x3D; client;\n    }\n    async beforeBrowserInitialized() {}\n    async afterBrowserInitialized() {}\n    async onAuthenticationNeeded() {\n        return {\n            failed: false,\n            restart: false,\n            failureEventPayload: undefined\n        };\n    }\n    async getAuthEventPayload() {}\n    async afterAuthReady() {}\n    async disconnect() {}\n    async destroy() {}\n    async logout() {}\n}\n\nmodule.exports &#x3D; BaseAuthStrategy;</code></pre>\n          </article>\n        </div>\n      </div>\n      <nav id=\"jsdoc-toc-nav\" role=\"navigation\"></nav>\n    </div>\n  </div>\n  <footer id=\"jsdoc-footer\" class=\"jsdoc-footer\">\n    <div id=\"jsdoc-footer-container\">\n      <p>\n        Generated by <a href=\"https://github.com/jsdoc3/jsdoc\">JSDoc</a> 3.6.11 on January 30, 2026.\n      </p>\n    </div>\n  </footer>\n  <script src=\"scripts/jquery.min.js\"></script>\n  <script src=\"scripts/tree.jquery.js\"></script>\n  <script src=\"scripts/prettify.js\"></script>\n  <script src=\"scripts/jsdoc-toc.js\"></script>\n  <script src=\"scripts/linenumber.js\"></script>\n  <script src=\"scripts/scrollanchor.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "docs/authStrategies_LegacySessionAuth.js.html",
    "content": "<!doctype html>\n<html>\n\n<head>\n  <meta name=\"generator\" content=\"JSDoc 3.6.11\">\n  <meta charset=\"utf-8\">\n  <title>whatsapp-web.js 1.23.0 &raquo; Source: authStrategies/LegacySessionAuth.js</title>\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Karla:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Noto+Serif:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Inconsolata:500\" type=\"text/css\">\n  <link href=\"css/baseline.css\" rel=\"stylesheet\">\n</head>\n\n<body onload=\"prettyPrint()\">\n  <nav id=\"jsdoc-navbar\" role=\"navigation\" class=\"jsdoc-navbar\">\n    <div id=\"jsdoc-navbar-container\">\n      <div id=\"jsdoc-navbar-content\">\n        <a href=\"index.html\" class=\"jsdoc-navbar-package-name\">whatsapp-web.<wbr>js 1.<wbr>23.<wbr>0</a>\n      </div>\n    </div>\n  </nav>\n  <div id=\"jsdoc-body-container\">\n    <div id=\"jsdoc-content\">\n      <div id=\"jsdoc-content-container\">\n        <div id=\"jsdoc-banner\" role=\"banner\">\n        </div>\n        <div id=\"jsdoc-main\" role=\"main\">\n          <header class=\"page-header\">\n            <h1>Source: authStrategies/LegacySessionAuth.js</h1>\n          </header>\n          <article>\n            <pre class=\"prettyprint linenums\"><code>&#x27;use strict&#x27;;\n\nconst BaseAuthStrategy &#x3D; require(&#x27;./BaseAuthStrategy&#x27;);\n\n/**\n * Legacy session auth strategy\n * Not compatible with multi-device accounts.\n * @param {object} options - options\n * @param {string} options.restartOnAuthFail - Restart client with a new session (i.e. use null &#x27;session&#x27; var) if authentication fails\n * @param {object} options.session - Whatsapp session to restore. If not set, will start a new session\n * @param {string} options.session.WABrowserId\n * @param {string} options.session.WASecretBundle\n * @param {string} options.session.WAToken1\n * @param {string} options.session.WAToken2\n */\nclass LegacySessionAuth extends BaseAuthStrategy {\n    constructor({ session, restartOnAuthFail }&#x3D;{}) {\n        super();\n        this.session &#x3D; session;\n        this.restartOnAuthFail &#x3D; restartOnAuthFail;\n    }\n\n    async afterBrowserInitialized() {\n        if(this.session) {\n            await this.client.pupPage.evaluateOnNewDocument(session &#x3D;&gt; {\n                if (document.referrer &#x3D;&#x3D;&#x3D; &#x27;https://whatsapp.com/&#x27;) {\n                    localStorage.clear();\n                    localStorage.setItem(&#x27;WABrowserId&#x27;, session.WABrowserId);\n                    localStorage.setItem(&#x27;WASecretBundle&#x27;, session.WASecretBundle);\n                    localStorage.setItem(&#x27;WAToken1&#x27;, session.WAToken1);\n                    localStorage.setItem(&#x27;WAToken2&#x27;, session.WAToken2);\n                }\n  \n                localStorage.setItem(&#x27;remember-me&#x27;, &#x27;true&#x27;);\n            }, this.session);\n        }\n    }\n\n    async onAuthenticationNeeded() {\n        if(this.session) {\n            this.session &#x3D; null;\n            return {\n                failed: true,\n                restart: this.restartOnAuthFail,\n                failureEventPayload: &#x27;Unable to log in. Are the session details valid?&#x27;\n            };\n        }\n\n        return { failed: false };\n    }\n\n    async getAuthEventPayload() {\n        const isMD &#x3D; await this.client.pupPage.evaluate(() &#x3D;&gt; {\n            return window.Store.MDBackend;\n        });\n\n        if(isMD) throw new Error(&#x27;Authenticating via JSON session is not supported for MultiDevice-enabled WhatsApp accounts.&#x27;);\n\n        const localStorage &#x3D; JSON.parse(await this.client.pupPage.evaluate(() &#x3D;&gt; {\n            return JSON.stringify(window.localStorage);\n        }));\n\n        return {\n            WABrowserId: localStorage.WABrowserId,\n            WASecretBundle: localStorage.WASecretBundle,\n            WAToken1: localStorage.WAToken1,\n            WAToken2: localStorage.WAToken2\n        };\n    }\n}\n\nmodule.exports &#x3D; LegacySessionAuth;\n</code></pre>\n          </article>\n        </div>\n      </div>\n      <nav id=\"jsdoc-toc-nav\" role=\"navigation\"></nav>\n    </div>\n  </div>\n  <footer id=\"jsdoc-footer\" class=\"jsdoc-footer\">\n    <div id=\"jsdoc-footer-container\">\n      <p>\n        Generated by <a href=\"https://github.com/jsdoc3/jsdoc\">JSDoc</a> 3.6.11 on October 21, 2023.\n      </p>\n    </div>\n  </footer>\n  <script src=\"scripts/jquery.min.js\"></script>\n  <script src=\"scripts/tree.jquery.js\"></script>\n  <script src=\"scripts/prettify.js\"></script>\n  <script src=\"scripts/jsdoc-toc.js\"></script>\n  <script src=\"scripts/linenumber.js\"></script>\n  <script src=\"scripts/scrollanchor.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "docs/authStrategies_LocalAuth.js.html",
    "content": "<!doctype html>\n<html>\n\n<head>\n  <meta name=\"generator\" content=\"JSDoc 3.6.11\">\n  <meta charset=\"utf-8\">\n  <title>whatsapp-web.js 1.34.6 &raquo; Source: authStrategies/LocalAuth.js</title>\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Karla:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Noto+Serif:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Inconsolata:500\" type=\"text/css\">\n  <link href=\"css/baseline.css\" rel=\"stylesheet\">\n</head>\n\n<body onload=\"prettyPrint()\">\n  <nav id=\"jsdoc-navbar\" role=\"navigation\" class=\"jsdoc-navbar\">\n    <div id=\"jsdoc-navbar-container\">\n      <div id=\"jsdoc-navbar-content\">\n        <a href=\"index.html\" class=\"jsdoc-navbar-package-name\">whatsapp-web.<wbr>js 1.<wbr>34.<wbr>6</a>\n      </div>\n    </div>\n  </nav>\n  <div id=\"jsdoc-body-container\">\n    <div id=\"jsdoc-content\">\n      <div id=\"jsdoc-content-container\">\n        <div id=\"jsdoc-banner\" role=\"banner\">\n        </div>\n        <div id=\"jsdoc-main\" role=\"main\">\n          <header class=\"page-header\">\n            <h1>Source: authStrategies/LocalAuth.js</h1>\n          </header>\n          <article>\n            <pre class=\"prettyprint linenums\"><code>&#x27;use strict&#x27;;\n\nconst path &#x3D; require(&#x27;path&#x27;);\nconst fs &#x3D; require(&#x27;fs&#x27;);\nconst BaseAuthStrategy &#x3D; require(&#x27;./BaseAuthStrategy&#x27;);\n\n/**\n * Local directory-based authentication\n * @param {object} options - options\n * @param {string} options.clientId - Client id to distinguish instances if you are using multiple, otherwise keep null if you are using only one instance\n * @param {string} options.dataPath - Change the default path for saving session files, default is: &quot;./.wwebjs_auth/&quot; \n * @param {number} options.rmMaxRetries - Sets the maximum number of retries for removing the session directory\n*/\nclass LocalAuth extends BaseAuthStrategy {\n    constructor({ clientId, dataPath, rmMaxRetries }&#x3D;{}) {\n        super();\n\n        const idRegex &#x3D; /^[-_\\w]+$/i;\n        if(clientId &amp;amp;&amp;amp; !idRegex.test(clientId)) {\n            throw new Error(&#x27;Invalid clientId. Only alphanumeric characters, underscores and hyphens are allowed.&#x27;);\n        }\n\n        this.dataPath &#x3D; path.resolve(dataPath || &#x27;./.wwebjs_auth/&#x27;);\n        this.clientId &#x3D; clientId;\n        this.rmMaxRetries &#x3D; rmMaxRetries ?? 4;\n    }\n\n    async beforeBrowserInitialized() {\n        const puppeteerOpts &#x3D; this.client.options.puppeteer;\n        const sessionDirName &#x3D; this.clientId ? &#x60;session-${this.clientId}&#x60; : &#x27;session&#x27;;\n        const dirPath &#x3D; path.join(this.dataPath, sessionDirName);\n\n        if(puppeteerOpts.userDataDir &amp;amp;&amp;amp; puppeteerOpts.userDataDir !&#x3D;&#x3D; dirPath) {\n            throw new Error(&#x27;LocalAuth is not compatible with a user-supplied userDataDir.&#x27;);\n        }\n\n        fs.mkdirSync(dirPath, { recursive: true });\n        \n        this.client.options.puppeteer &#x3D; {\n            ...puppeteerOpts,\n            userDataDir: dirPath\n        };\n\n        this.userDataDir &#x3D; dirPath;\n    }\n\n    async logout() {\n        if (this.userDataDir) {\n            await fs.promises.rm(this.userDataDir, { recursive: true, force: true, maxRetries: this.rmMaxRetries })\n                .catch((e) &#x3D;&gt; {\n                    throw new Error(e);\n                });\n        }\n    }\n\n}\n\nmodule.exports &#x3D; LocalAuth;\n</code></pre>\n          </article>\n        </div>\n      </div>\n      <nav id=\"jsdoc-toc-nav\" role=\"navigation\"></nav>\n    </div>\n  </div>\n  <footer id=\"jsdoc-footer\" class=\"jsdoc-footer\">\n    <div id=\"jsdoc-footer-container\">\n      <p>\n        Generated by <a href=\"https://github.com/jsdoc3/jsdoc\">JSDoc</a> 3.6.11 on January 30, 2026.\n      </p>\n    </div>\n  </footer>\n  <script src=\"scripts/jquery.min.js\"></script>\n  <script src=\"scripts/tree.jquery.js\"></script>\n  <script src=\"scripts/prettify.js\"></script>\n  <script src=\"scripts/jsdoc-toc.js\"></script>\n  <script src=\"scripts/linenumber.js\"></script>\n  <script src=\"scripts/scrollanchor.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "docs/authStrategies_NoAuth.js.html",
    "content": "<!doctype html>\n<html>\n\n<head>\n  <meta name=\"generator\" content=\"JSDoc 3.6.11\">\n  <meta charset=\"utf-8\">\n  <title>whatsapp-web.js 1.34.6 &raquo; Source: authStrategies/NoAuth.js</title>\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Karla:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Noto+Serif:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Inconsolata:500\" type=\"text/css\">\n  <link href=\"css/baseline.css\" rel=\"stylesheet\">\n</head>\n\n<body onload=\"prettyPrint()\">\n  <nav id=\"jsdoc-navbar\" role=\"navigation\" class=\"jsdoc-navbar\">\n    <div id=\"jsdoc-navbar-container\">\n      <div id=\"jsdoc-navbar-content\">\n        <a href=\"index.html\" class=\"jsdoc-navbar-package-name\">whatsapp-web.<wbr>js 1.<wbr>34.<wbr>6</a>\n      </div>\n    </div>\n  </nav>\n  <div id=\"jsdoc-body-container\">\n    <div id=\"jsdoc-content\">\n      <div id=\"jsdoc-content-container\">\n        <div id=\"jsdoc-banner\" role=\"banner\">\n        </div>\n        <div id=\"jsdoc-main\" role=\"main\">\n          <header class=\"page-header\">\n            <h1>Source: authStrategies/NoAuth.js</h1>\n          </header>\n          <article>\n            <pre class=\"prettyprint linenums\"><code>&#x27;use strict&#x27;;\n\nconst BaseAuthStrategy &#x3D; require(&#x27;./BaseAuthStrategy&#x27;);\n\n/**\n * No session restoring functionality\n * Will need to authenticate via QR code every time\n*/\nclass NoAuth extends BaseAuthStrategy { }\n\n\nmodule.exports &#x3D; NoAuth;</code></pre>\n          </article>\n        </div>\n      </div>\n      <nav id=\"jsdoc-toc-nav\" role=\"navigation\"></nav>\n    </div>\n  </div>\n  <footer id=\"jsdoc-footer\" class=\"jsdoc-footer\">\n    <div id=\"jsdoc-footer-container\">\n      <p>\n        Generated by <a href=\"https://github.com/jsdoc3/jsdoc\">JSDoc</a> 3.6.11 on January 30, 2026.\n      </p>\n    </div>\n  </footer>\n  <script src=\"scripts/jquery.min.js\"></script>\n  <script src=\"scripts/tree.jquery.js\"></script>\n  <script src=\"scripts/prettify.js\"></script>\n  <script src=\"scripts/jsdoc-toc.js\"></script>\n  <script src=\"scripts/linenumber.js\"></script>\n  <script src=\"scripts/scrollanchor.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "docs/authStrategies_RemoteAuth.js.html",
    "content": "<!doctype html>\n<html>\n\n<head>\n  <meta name=\"generator\" content=\"JSDoc 3.6.11\">\n  <meta charset=\"utf-8\">\n  <title>whatsapp-web.js 1.34.6 &raquo; Source: authStrategies/RemoteAuth.js</title>\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Karla:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Noto+Serif:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Inconsolata:500\" type=\"text/css\">\n  <link href=\"css/baseline.css\" rel=\"stylesheet\">\n</head>\n\n<body onload=\"prettyPrint()\">\n  <nav id=\"jsdoc-navbar\" role=\"navigation\" class=\"jsdoc-navbar\">\n    <div id=\"jsdoc-navbar-container\">\n      <div id=\"jsdoc-navbar-content\">\n        <a href=\"index.html\" class=\"jsdoc-navbar-package-name\">whatsapp-web.<wbr>js 1.<wbr>34.<wbr>6</a>\n      </div>\n    </div>\n  </nav>\n  <div id=\"jsdoc-body-container\">\n    <div id=\"jsdoc-content\">\n      <div id=\"jsdoc-content-container\">\n        <div id=\"jsdoc-banner\" role=\"banner\">\n        </div>\n        <div id=\"jsdoc-main\" role=\"main\">\n          <header class=\"page-header\">\n            <h1>Source: authStrategies/RemoteAuth.js</h1>\n          </header>\n          <article>\n            <pre class=\"prettyprint linenums\"><code>&#x27;use strict&#x27;;\n\n/* Require Optional Dependencies */\ntry {\n    var fs &#x3D; require(&#x27;fs-extra&#x27;);\n    var unzipper &#x3D; require(&#x27;unzipper&#x27;);\n    var archiver &#x3D; require(&#x27;archiver&#x27;);\n} catch {\n    fs &#x3D; undefined;\n    unzipper &#x3D; undefined;\n    archiver &#x3D; undefined;\n}\n\nconst path &#x3D; require(&#x27;path&#x27;);\nconst { Events } &#x3D; require(&#x27;./../util/Constants&#x27;);\nconst BaseAuthStrategy &#x3D; require(&#x27;./BaseAuthStrategy&#x27;);\n\n/**\n * Remote-based authentication\n * @param {object} options - options\n * @param {object} options.store - Remote database store instance\n * @param {string} options.clientId - Client id to distinguish instances if you are using multiple, otherwise keep null if you are using only one instance\n * @param {string} options.dataPath - Change the default path for saving session files, default is: &quot;./.wwebjs_auth/&quot; \n * @param {number} options.backupSyncIntervalMs - Sets the time interval for periodic session backups. Accepts values starting from 60000ms {1 minute}\n * @param {number} options.rmMaxRetries - Sets the maximum number of retries for removing the session directory\n */\nclass RemoteAuth extends BaseAuthStrategy {\n    constructor({ clientId, dataPath, store, backupSyncIntervalMs, rmMaxRetries } &#x3D; {}) {\n        if (!fs &amp;amp;&amp;amp; !unzipper &amp;amp;&amp;amp; !archiver) throw new Error(&#x27;Optional Dependencies [fs-extra, unzipper, archiver] are required to use RemoteAuth. Make sure to run npm install correctly and remove the --no-optional flag&#x27;);\n        super();\n\n        const idRegex &#x3D; /^[-_\\w]+$/i;\n        if (clientId &amp;amp;&amp;amp; !idRegex.test(clientId)) {\n            throw new Error(&#x27;Invalid clientId. Only alphanumeric characters, underscores and hyphens are allowed.&#x27;);\n        }\n        if (!backupSyncIntervalMs || backupSyncIntervalMs &amp;lt; 60000) {\n            throw new Error(&#x27;Invalid backupSyncIntervalMs. Accepts values starting from 60000ms {1 minute}.&#x27;);\n        }\n        if(!store) throw new Error(&#x27;Remote database store is required.&#x27;);\n\n        this.store &#x3D; store;\n        this.clientId &#x3D; clientId;\n        this.backupSyncIntervalMs &#x3D; backupSyncIntervalMs;\n        this.dataPath &#x3D; path.resolve(dataPath || &#x27;./.wwebjs_auth/&#x27;);\n        this.tempDir &#x3D; &#x60;${this.dataPath}/wwebjs_temp_session_${this.clientId}&#x60;;\n        this.requiredDirs &#x3D; [&#x27;Default&#x27;, &#x27;IndexedDB&#x27;, &#x27;Local Storage&#x27;]; /* &#x3D;&gt; Required Files &amp;amp; Dirs in WWebJS to restore session */\n        this.rmMaxRetries &#x3D; rmMaxRetries ?? 4;\n    }\n\n    async beforeBrowserInitialized() {\n        const puppeteerOpts &#x3D; this.client.options.puppeteer;\n        const sessionDirName &#x3D; this.clientId ? &#x60;RemoteAuth-${this.clientId}&#x60; : &#x27;RemoteAuth&#x27;;\n        const dirPath &#x3D; path.join(this.dataPath, sessionDirName);\n\n        if (puppeteerOpts.userDataDir &amp;amp;&amp;amp; puppeteerOpts.userDataDir !&#x3D;&#x3D; dirPath) {\n            throw new Error(&#x27;RemoteAuth is not compatible with a user-supplied userDataDir.&#x27;);\n        }\n\n        this.userDataDir &#x3D; dirPath;\n        this.sessionName &#x3D; sessionDirName;\n\n        await this.extractRemoteSession();\n\n        this.client.options.puppeteer &#x3D; {\n            ...puppeteerOpts,\n            userDataDir: dirPath\n        };\n    }\n\n    async logout() {\n        await this.disconnect();\n    }\n\n    async destroy() {\n        clearInterval(this.backupSync);\n    }\n\n    async disconnect() {\n        await this.deleteRemoteSession();\n\n        let pathExists &#x3D; await this.isValidPath(this.userDataDir);\n        if (pathExists) {\n            await fs.promises.rm(this.userDataDir, {\n                recursive: true,\n                force: true,\n                maxRetries: this.rmMaxRetries,\n            }).catch(() &#x3D;&gt; {});\n        }\n        clearInterval(this.backupSync);\n    }\n\n    async afterAuthReady() {\n        const sessionExists &#x3D; await this.store.sessionExists({session: this.sessionName});\n        if(!sessionExists) {\n            await this.delay(60000); /* Initial delay sync required for session to be stable enough to recover */\n            await this.storeRemoteSession({emit: true});\n        }\n        var self &#x3D; this;\n        this.backupSync &#x3D; setInterval(async function () {\n            await self.storeRemoteSession();\n        }, this.backupSyncIntervalMs);\n    }\n\n    async storeRemoteSession(options) {\n        /* Compress &amp;amp; Store Session */\n        const pathExists &#x3D; await this.isValidPath(this.userDataDir);\n        if (pathExists) {\n            await this.compressSession();\n            await this.store.save({session: path.join(this.dataPath, this.sessionName)});\n            await fs.promises.unlink(path.join(this.dataPath, &#x60;${this.sessionName}.zip&#x60;));\n            await fs.promises.rm(&#x60;${this.tempDir}&#x60;, {\n                recursive: true,\n                force: true,\n                maxRetries: this.rmMaxRetries,\n            }).catch(() &#x3D;&gt; {});\n            if(options &amp;amp;&amp;amp; options.emit) this.client.emit(Events.REMOTE_SESSION_SAVED);\n        }\n    }\n\n    async extractRemoteSession() {\n        const pathExists &#x3D; await this.isValidPath(this.userDataDir);\n        const compressedSessionPath &#x3D; path.join(this.dataPath, &#x60;${this.sessionName}.zip&#x60;);\n        const sessionExists &#x3D; await this.store.sessionExists({session: this.sessionName});\n        if (pathExists) {\n            await fs.promises.rm(this.userDataDir, {\n                recursive: true,\n                force: true,\n                maxRetries: this.rmMaxRetries,\n            }).catch(() &#x3D;&gt; {});\n        }\n        if (sessionExists) {\n            await this.store.extract({session: this.sessionName, path: compressedSessionPath});\n            await this.unCompressSession(compressedSessionPath);\n        } else {\n            fs.mkdirSync(this.userDataDir, { recursive: true });\n        }\n    }\n\n    async deleteRemoteSession() {\n        const sessionExists &#x3D; await this.store.sessionExists({session: this.sessionName});\n        if (sessionExists) await this.store.delete({session: this.sessionName});\n    }\n\n    async compressSession() {\n        const archive &#x3D; archiver(&#x27;zip&#x27;);\n        const stream &#x3D; fs.createWriteStream(path.join(this.dataPath, &#x60;${this.sessionName}.zip&#x60;));\n\n        await fs.copy(this.userDataDir, this.tempDir).catch(() &#x3D;&gt; {});\n        await this.deleteMetadata();\n        return new Promise((resolve, reject) &#x3D;&gt; {\n            archive\n                .directory(this.tempDir, false)\n                .on(&#x27;error&#x27;, err &#x3D;&gt; reject(err))\n                .pipe(stream);\n\n            stream.on(&#x27;close&#x27;, () &#x3D;&gt; resolve());\n            archive.finalize();\n        });\n    }\n\n    async unCompressSession(compressedSessionPath) {\n        var stream &#x3D; fs.createReadStream(compressedSessionPath);\n        await new Promise((resolve, reject) &#x3D;&gt; {\n            stream.pipe(unzipper.Extract({\n                path: this.userDataDir,\n                concurrency: 10\n            }))\n                .on(&#x27;error&#x27;, err &#x3D;&gt; reject(err))\n                .on(&#x27;finish&#x27;, () &#x3D;&gt; resolve());\n        });\n        await fs.promises.unlink(compressedSessionPath);\n    }\n\n    async deleteMetadata() {\n        const sessionDirs &#x3D; [this.tempDir, path.join(this.tempDir, &#x27;Default&#x27;)];\n        for (const dir of sessionDirs) {\n            const sessionFiles &#x3D; await fs.promises.readdir(dir);\n            for (const element of sessionFiles) {\n                if (!this.requiredDirs.includes(element)) {\n                    const dirElement &#x3D; path.join(dir, element);\n                    const stats &#x3D; await fs.promises.lstat(dirElement);\n    \n                    if (stats.isDirectory()) {\n                        await fs.promises.rm(dirElement, {\n                            recursive: true,\n                            force: true,\n                            maxRetries: this.rmMaxRetries,\n                        }).catch(() &#x3D;&gt; {});\n                    } else {\n                        await fs.promises.unlink(dirElement).catch(() &#x3D;&gt; {});\n                    }\n                }\n            }\n        }\n    }\n\n    async isValidPath(path) {\n        try {\n            await fs.promises.access(path);\n            return true;\n        } catch {\n            return false;\n        }\n    }\n\n    async delay(ms) {\n        return new Promise(resolve &#x3D;&gt; setTimeout(resolve, ms));\n    }\n}\n\nmodule.exports &#x3D; RemoteAuth;\n</code></pre>\n          </article>\n        </div>\n      </div>\n      <nav id=\"jsdoc-toc-nav\" role=\"navigation\"></nav>\n    </div>\n  </div>\n  <footer id=\"jsdoc-footer\" class=\"jsdoc-footer\">\n    <div id=\"jsdoc-footer-container\">\n      <p>\n        Generated by <a href=\"https://github.com/jsdoc3/jsdoc\">JSDoc</a> 3.6.11 on January 30, 2026.\n      </p>\n    </div>\n  </footer>\n  <script src=\"scripts/jquery.min.js\"></script>\n  <script src=\"scripts/tree.jquery.js\"></script>\n  <script src=\"scripts/prettify.js\"></script>\n  <script src=\"scripts/jsdoc-toc.js\"></script>\n  <script src=\"scripts/linenumber.js\"></script>\n  <script src=\"scripts/scrollanchor.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "docs/css/baseline.css",
    "content": "/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */\nhtml{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:none;text-decoration:underline dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{font-size:2em;margin:.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-appearance:textfield;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-collapse:collapse;border-spacing:0}legend,td,th{padding:0}\n/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n@media print{*,:after,:before{color:#000!important;text-shadow:none!important;background:0 0!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:\" (\" attr(href) \")\"}abbr[title]:after{content:\" (\" attr(title) \")\"}a[href^=\"#\"]:after,a[href^=\"javascript:\"]:after{content:\"\"}blockquote,pre{border:1px solid #999}thead{display:table-header-group}blockquote,img,pre,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.jsdoc-navbar,.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}*,:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:transparent;position:relative;min-height:100%}body{font-size:14px;line-height:1.42857143;color:#333;background-color:#fff;font-family:'Noto Serif',serif;margin-bottom:50px;padding-top:75px}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:focus,a:hover{color:#23527c;text-decoration:underline}a:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.img-responsive{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;max-width:100%;height:auto}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role=button]{cursor:pointer}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-weight:500;line-height:1.1;color:inherit}.summary-callout .h1,.summary-callout .h2,.summary-callout .h3,.summary-callout .h4,.summary-callout .h5,.summary-callout .h6,.summary-callout h1,.summary-callout h2,.summary-callout h3,.summary-callout h4,.summary-callout h5,.summary-callout h6,.symbol-index-section .h1,.symbol-index-section .h2,.symbol-index-section .h3,.symbol-index-section .h4,.symbol-index-section .h5,.symbol-index-section .h6,.symbol-index-section h1,.symbol-index-section h2,.symbol-index-section h3,.symbol-index-section h4,.symbol-index-section h5,.symbol-index-section h6{font-weight:500;line-height:1.1}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#777}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h1,.h2,.h3,.h4,.h5,.h6,.summary-callout .h1,.summary-callout .h2,.summary-callout .h3,.summary-callout .h4,.summary-callout .h5,.summary-callout .h6,.summary-callout h1,.summary-callout h2,.summary-callout h3,.summary-callout h4,.summary-callout h5,.summary-callout h6,.symbol-index-section .h1,.symbol-index-section .h2,.symbol-index-section .h3,.symbol-index-section .h4,.symbol-index-section .h5,.symbol-index-section .h6,.symbol-index-section h1,.symbol-index-section h2,.symbol-index-section h3,.symbol-index-section h4,.symbol-index-section h5,.symbol-index-section h6,h1,h2,h3,h4,h5,h6{margin-bottom:10px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h4,.summary-callout .h1,.summary-callout .h2,.summary-callout .h3,.summary-callout .h4,.summary-callout .h5,.summary-callout .h6,.summary-callout h1,.summary-callout h2,.summary-callout h3,.summary-callout h4,.summary-callout h5,.summary-callout h6,.symbol-index-section .h1,.symbol-index-section .h2,.symbol-index-section .h3,.symbol-index-section .h4,.symbol-index-section .h5,.symbol-index-section .h6,.symbol-index-section h1,.symbol-index-section h2,.symbol-index-section h3,.symbol-index-section h4,.symbol-index-section h5,.symbol-index-section h6,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}.small,small{font-size:85%}.mark,mark{padding:.2em;background-color:#fcf8e3}.text-left,th{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:focus,a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:focus,a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:focus,a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:focus,a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:focus,a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:focus,a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:focus,a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:focus,a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:focus,a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:focus,a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px}dl,ol,ul{margin-top:0;margin-bottom:10px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}.list-inline,.list-unstyled{padding-left:0;list-style:none}.list-inline{margin-left:-5px}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-bottom:20px}dd,dt{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-compact dt,.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-compact dd,.dl-horizontal dd{margin-left:180px}}abbr[data-original-title],abbr[title]{cursor:help}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child,td>p:last-child{margin-bottom:0}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote .small:before,blockquote footer:before,blockquote small:before{content:\"\\2014 \\00A0\"}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:\"\"}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:\"\\00A0 \\2014\"}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}kbd,pre,samp{font-family:Menlo,Monaco,Consolas,\"Courier New\",monospace}code,kbd,pre{padding:2px 4px;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{font-size:90%;color:#fff;background-color:#333;border-radius:3px;box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}#jsdoc-body-container,#jsdoc-footer-container,#jsdoc-navbar-container,.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{margin-right:-15px;margin-left:-15px}.row-no-gutters{margin-right:0;margin-left:0}.row-no-gutters [class*=col-]{padding-right:0;padding-left:0}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}pre code,table{background-color:transparent}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>thead>tr>th{padding:8px;line-height:1.42857143;border-top:1px solid #ddd}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th,.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.jsdoc-details-table>tbody+tbody,.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-bordered,.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.jsdoc-details-table>tbody>tr:hover,.table-hover>tbody>tr:hover,.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}.table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}fieldset,legend{padding:0;border:0}fieldset{min-width:0;margin:0}legend{display:block;width:100%;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-appearance:none;appearance:none}input[type=checkbox],input[type=radio]{margin:4px 0 0;margin-top:1px \\9;line-height:normal}fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}input[type=file]{display:block}input[type=range]{display:block;width:100%}.form-group-sm select[multiple].form-control,.form-group-sm textarea.form-control,select[multiple],select[multiple].input-sm,select[size],textarea.form-control,textarea.input-sm{height:auto}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.form-control,output{display:block;font-size:14px;line-height:1.42857143;color:#555}output{padding-top:7px}.form-control{width:100%;height:34px;padding:6px 12px;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control::-ms-expand{background-color:transparent;border:0}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1}.checkbox.disabled label,.form-control[disabled],.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .form-control,fieldset[disabled] .radio label{cursor:not-allowed}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date].form-control,input[type=datetime-local].form-control,input[type=month].form-control,input[type=time].form-control{line-height:34px}.input-group-sm input[type=date],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],.input-group-sm input[type=time],input[type=date].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm,input[type=time].input-sm{line-height:30px}.input-group-lg input[type=date],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],.input-group-lg input[type=time],input[type=date].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg,input[type=time].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox label,.checkbox-inline,.radio label,.radio-inline{padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox label,.radio label{min-height:20px}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-top:4px \\9;margin-left:-20px}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{position:relative;display:inline-block;vertical-align:middle}.checkbox-inline.disabled,.radio-inline.disabled,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio-inline{cursor:not-allowed}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}.form-control-static{min-height:34px;padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.form-group-sm .form-control,.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.form-group-sm select.form-control,select.input-sm{height:30px;line-height:30px}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.form-group-lg .form-control,.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.form-group-lg select[multiple].form-control,.form-group-lg textarea.form-control,select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg select.form-control,select.input-lg{height:46px;line-height:46px}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.form-group-lg .form-control+.form-control-feedback,.input-group-lg+.form-control-feedback,.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.form-group-sm .form-control+.form-control-feedback,.input-group-sm+.form-control-feedback,.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:11px;font-size:18px}.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{display:inline-block;margin-bottom:0;font-weight:400;text-align:center;white-space:nowrap;vertical-align:middle;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;padding:6px 12px;font-size:14px;line-height:1.42857143;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;filter:alpha(opacity=65);opacity:.65;-webkit-box-shadow:none;box-shadow:none}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default.focus,.btn-default:focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.btn-default:hover{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;background-image:none;border-color:#adadad}.btn-default.active.focus,.btn-default.active:focus,.btn-default.active:hover,.btn-default:active.focus,.btn-default:active:focus,.btn-default:active:hover,.open>.dropdown-toggle.btn-default.focus,.open>.dropdown-toggle.btn-default:focus,.open>.dropdown-toggle.btn-default:hover{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.btn-default.disabled.focus,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled].focus,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#286090;border-color:#122b40}.btn-primary:hover{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;background-image:none;border-color:#204d74}.btn-primary.active.focus,.btn-primary.active:focus,.btn-primary.active:hover,.btn-primary:active.focus,.btn-primary:active:focus,.btn-primary:active:hover,.open>.dropdown-toggle.btn-primary.focus,.open>.dropdown-toggle.btn-primary:focus,.open>.dropdown-toggle.btn-primary:hover{color:#fff;background-color:#204d74;border-color:#122b40}.btn-primary.disabled.focus,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled].focus,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#449d44;border-color:#255625}.btn-success:hover{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;background-image:none;border-color:#398439}.btn-success.active.focus,.btn-success.active:focus,.btn-success.active:hover,.btn-success:active.focus,.btn-success:active:focus,.btn-success:active:hover,.open>.dropdown-toggle.btn-success.focus,.open>.dropdown-toggle.btn-success:focus,.open>.dropdown-toggle.btn-success:hover{color:#fff;background-color:#398439;border-color:#255625}.btn-success.disabled.focus,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled].focus,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;background-image:none;border-color:#269abc}.btn-info.active.focus,.btn-info.active:focus,.btn-info.active:hover,.btn-info:active.focus,.btn-info:active:focus,.btn-info:active:hover,.open>.dropdown-toggle.btn-info.focus,.open>.dropdown-toggle.btn-info:focus,.open>.dropdown-toggle.btn-info:hover{color:#fff;background-color:#269abc;border-color:#1b6d85}.btn-info.disabled.focus,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled].focus,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning.focus,.btn-warning:focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;background-image:none;border-color:#d58512}.btn-warning.active.focus,.btn-warning.active:focus,.btn-warning.active:hover,.btn-warning:active.focus,.btn-warning:active:focus,.btn-warning:active:hover,.open>.dropdown-toggle.btn-warning.focus,.open>.dropdown-toggle.btn-warning:focus,.open>.dropdown-toggle.btn-warning:hover{color:#fff;background-color:#d58512;border-color:#985f0d}.btn-warning.disabled.focus,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled].focus,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#c9302c;border-color:#761c19}.btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;background-image:none;border-color:#ac2925}.btn-danger.active.focus,.btn-danger.active:focus,.btn-danger.active:hover,.btn-danger:active.focus,.btn-danger:active:focus,.btn-danger:active:hover,.open>.dropdown-toggle.btn-danger.focus,.open>.dropdown-toggle.btn-danger:focus,.open>.dropdown-toggle.btn-danger:hover{color:#fff;background-color:#ac2925;border-color:#761c19}.btn-danger.disabled.focus,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled].focus,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#337ab7;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none}.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-sm,.btn-xs{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-xs{padding:1px 5px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-property:height,visibility;transition-property:height,visibility;-webkit-transition-duration:.35s;transition-duration:.35s;-webkit-transition-timing-function:ease;transition-timing-function:ease}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li,.nav>li>a{position:relative;display:block}.nav>li>a{padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu,.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#337ab7}.nav-justified>li,.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li>a{margin-bottom:5px;text-align:center}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.tab-content>.tab-pane,li.jqtree-closed>ul{display:none}.navbar-brand>img,.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative}.jsdoc-navbar,.navbar{min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.jsdoc-navbar,.navbar{border-radius:4px}.navbar-header{float:left}}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;border-top:1px solid transparent;box-shadow:inset 0 1px 0 rgba(255,255,255,.1);-webkit-overflow-scrolling:touch}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-right:0;padding-left:0}}.jsdoc-navbar,.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}@media (min-width:768px){.jsdoc-navbar,.navbar-fixed-bottom,.navbar-fixed-top{border-radius:0}}.jsdoc-navbar,.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}#jsdoc-body-container>.navbar-collapse,#jsdoc-body-container>.navbar-header,#jsdoc-footer-container>.navbar-collapse,#jsdoc-footer-container>.navbar-header,#jsdoc-navbar-container>.navbar-collapse,#jsdoc-navbar-container>.navbar-header,.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.jsdoc-navbar-package-name,.navbar-brand{float:left;height:50px;padding:15px;font-size:18px;line-height:20px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-right:15px;margin-top:8px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{padding:10px 15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);margin:8px -15px}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .checkbox label,.navbar-form .radio label{padding-left:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.jsdoc-navbar,.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand,.navbar-default .navbar-nav>li>a,.navbar-default .navbar-text{color:#777}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .btn-link,.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover,a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand,.navbar-inverse .navbar-nav>li>a,.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .btn-link,.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff}.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:\"/\\00a0\"}.breadcrumb>.active{color:#777}.label{display:inline;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.badge:focus,a.badge:hover,a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:focus,.label-default[href]:hover{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:focus,.label-success[href]:hover{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-group-xs>.btn .badge,.btn-xs .badge{top:0;padding:1px 5px}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;background-color:#eee}.jumbotron,.jumbotron .h1,.jumbotron h1,a.list-group-item-danger .list-group-item-heading,a.list-group-item-info .list-group-item-heading,a.list-group-item-success .list-group-item-heading,a.list-group-item-warning .list-group-item-heading,button.list-group-item-danger .list-group-item-heading,button.list-group-item-info .list-group-item-heading,button.list-group-item-success .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{padding-right:15px;padding-left:15px;border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-right:60px;padding-left:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{color:#777;cursor:not-allowed;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#c7ddef}a.list-group-item,button.list-group-item{color:#555}a.list-group-item:focus,a.list-group-item:hover,button.list-group-item:focus,button.list-group-item:hover{color:#555;text-decoration:none;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#3c763d}a.list-group-item-success:focus,a.list-group-item-success:hover,button.list-group-item-success:focus,button.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover,button.list-group-item-success.active,button.list-group-item-success.active:focus,button.list-group-item-success.active:hover{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info,button.list-group-item-info{color:#31708f}a.list-group-item-info:focus,a.list-group-item-info:hover,button.list-group-item-info:focus,button.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover,button.list-group-item-info.active,button.list-group-item-info.active:focus,button.list-group-item-info.active:hover{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning,button.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning:focus,a.list-group-item-warning:hover,button.list-group-item-warning:focus,button.list-group-item-warning:hover{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover,button.list-group-item-warning.active,button.list-group-item-warning.active:focus,button.list-group-item-warning.active:hover{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger,button.list-group-item-danger{color:#a94442}a.list-group-item-danger:focus,a.list-group-item-danger:hover,button.list-group-item-danger:focus,button.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover,button.list-group-item-danger.active,button.list-group-item-danger.active:focus,button.list-group-item-danger.active:hover{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.jsdoc-panel,.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.jsdoc-panel-heading,.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-heading>.dropdown .dropdown-toggle,.panel-title,.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-left-radius:0;border-top-right-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.dl-compact dd pre,.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table,dd>p{margin-bottom:0}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-right:15px;padding-left:15px}.panel>.table-responsive:first-child>.table:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table-responsive:last-child>.table:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body,.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.jsdoc-panel,.panel-default,.well blockquote{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}#jsdoc-body-container:after,#jsdoc-body-container:before,#jsdoc-content:after,#jsdoc-content:before,#jsdoc-footer-container:after,#jsdoc-footer-container:before,#jsdoc-navbar-container:after,#jsdoc-navbar-container:before,.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-compact dd:after,.dl-compact dd:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.jsdoc-navbar:after,.jsdoc-navbar:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.panel-body:after,.panel-body:before,.row:after,.row:before,.summary-callout:after,.summary-callout:before,.summary-content:after,.summary-content:before,.symbol-index-content:after,.symbol-index-content:before,.symbol-index:after,.symbol-index:before{display:table;content:\" \"}#jsdoc-body-container:after,#jsdoc-content:after,#jsdoc-footer-container:after,#jsdoc-navbar-container:after,.clearfix:after,.container-fluid:after,.container:after,.dl-compact dd:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.jsdoc-navbar:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.panel-body:after,.row:after,.summary-callout:after,.summary-content:after,.symbol-index-content:after,.symbol-index:after,li.jqtree_common{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-lg,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}@media (max-width:767px){.visible-xs,.visible-xs-block{display:block!important}table.visible-xs{display:table!important}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}.visible-xs-inline{display:inline!important}.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm,.visible-sm-block{display:block!important}table.visible-sm{display:table!important}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}.visible-sm-inline{display:inline!important}.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md,.visible-md-block{display:block!important}table.visible-md{display:table!important}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}.visible-md-inline{display:inline!important}.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg,.visible-lg-block{display:block!important}table.visible-lg{display:table!important}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}.visible-lg-inline{display:inline!important}.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table!important}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}.hidden-print{display:none!important}}.pln{color:#4d4d4c}@media screen{.str{color:#718c00}.kwd{color:#8959a8}.com{color:#8e908c}.typ{color:#4271ae}.lit{color:#f5871f}.clo,.opn,.pun{color:#4d4d4c}.tag{color:#c82829}.atn{color:#f5871f}.atv{color:#3e999f}.dec{color:#f5871f}.var{color:#c82829}.fun{color:#4271ae}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:700}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:700}.lit{color:#044}.clo,.opn,.pun{color:#440}.tag{color:#006;font-weight:700}.atn{color:#404}.atv{color:#060}}ol.linenums{margin-top:0;margin-bottom:0}.jqtree_common{list-style:none}ul.jqtree_common{padding-left:1.5em}.jqtree-title{margin-left:1.5em}.jqtree-title.jqtree-title-folder{margin-left:0}.jqtree-toggler{margin-left:.2em;margin-right:.6em}.jqtree-toggler.jqtree-closed{margin-left:0;margin-right:.45em}.jqtree-toggler:hover{text-decoration:none}.h1,h1{font-family:'Karla',sans-serif;border-bottom:1px solid #eee;font-size:33px;margin-top:40px}.h1+section .h2:first-child,.h1+section h2:first-child,.h2+section .h3:first-child,.h2+section h3:first-child,h1+section .h2:first-child,h1+section h2:first-child,h2+section .h3:first-child,h2+section h3:first-child{margin-top:20px}.h2,h2{border-bottom:1px solid #eee;font-size:28px;margin-top:40px}.h2,.h3,.h4,.h5,.h6,h2,h3,h4,h5,h6{font-family:'Karla',sans-serif}.h3,h3{font-size:21px;margin-top:40px}.h4,.h5,.h6,h4,h5,h6{margin-top:20px}.summary-callout .h1,.summary-callout .h2,.summary-callout .h3,.summary-callout .h4,.summary-callout .h5,.summary-callout .h6,.summary-callout h1,.summary-callout h2,.summary-callout h3,.summary-callout h4,.summary-callout h5,.summary-callout h6,.symbol-index-section .h1,.symbol-index-section .h2,.symbol-index-section .h3,.symbol-index-section .h4,.symbol-index-section .h5,.symbol-index-section .h6,.symbol-index-section h1,.symbol-index-section h2,.symbol-index-section h3,.symbol-index-section h4,.symbol-index-section h5,.symbol-index-section h6{font-family:'Karla',sans-serif;color:#5bc0de;margin-top:20px}.prettyprint.linenums li,code,pre>code{font-family:'Inconsolata',monospace;font-size:100%}.label,dt,th{font-family:'Karla'}.dl-compact dt{text-align:left}.dl-summary-callout dd{margin-bottom:10px}.label{font-size:100%;font-weight:400;padding:.1em .5em;text-transform:uppercase}.label-async{background-color:#c5e1a5}.label-generator{background-color:#9fa8da}.label-package,.label-private,.label-protected,.label-public{background-color:#90caf9}.label-constant,.label-readonly{background-color:#ffab91}.label-kind{background-color:#ffcc80}.label-inner,.label-static{background-color:#a5d6a7}.label-virtual{background-color:#b39ddb}.page-header{border-bottom:0}.prettyprint.linenums li{color:#a8a9a6}.property-type{margin-left:14px}.signature-params,.signature-returns{color:#a8a9a6}.source-link{font-size:11.2px;margin-top:-.75em}.summary-callout,.symbol-index-section{font-size:12.6px}.summary-callout-heading,.symbol-index-section-heading{border-bottom:0}.symbol-classdesc p:first-child,.symbol-description p:first-child{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.symbol-classdesc p:first-child,.symbol-description p:first-child{font-size:21px}}.symbol-detail-labels{font-size:11.2px;margin-bottom:4px;margin-top:40px}.h2+section>.symbol-detail-labels:first-child,h2+section>.symbol-detail-labels:first-child{margin-top:0}.symbol-detail-labels+.h1,.symbol-detail-labels+.h2,.symbol-detail-labels+.h3,.symbol-detail-labels+.h4,.symbol-detail-labels+.h5,.symbol-detail-labels+.h6,.symbol-detail-labels+h1,.symbol-detail-labels+h2,.symbol-detail-labels+h3,.symbol-detail-labels+h4,.symbol-detail-labels+h5,.symbol-detail-labels+h6{margin-top:0}.symbol-index-list>dd{margin-bottom:.75em}.symbol-index-name{text-indent:-1em;margin-left:1em}.symbol-name{font-weight:700}@media (min-width:768px){#jsdoc-body-container>.navbar-collapse,#jsdoc-body-container>.navbar-header,#jsdoc-footer-container>.navbar-collapse,#jsdoc-footer-container>.navbar-header,#jsdoc-navbar-container>.navbar-collapse,#jsdoc-navbar-container>.navbar-header{margin-right:0;margin-left:0}}.jsdoc-footer{position:absolute;bottom:0;width:100%;height:50px;margin:auto;padding:15px;background-color:#f8f8f8;border:1px solid #e7e7e7}.jsdoc-footer p{margin:0;text-align:center}.symbol-index{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}#jsdoc-content,.summary-callout>.navbar-collapse,.summary-callout>.navbar-header,.summary-content,.symbol-index-content,.symbol-index>.navbar-collapse,.symbol-index>.navbar-header{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.summary-callout>.navbar-collapse,.summary-callout>.navbar-header,.symbol-index>.navbar-collapse,.symbol-index>.navbar-header{margin-right:0;margin-left:0}}#jsdoc-content-container,.summary-column,.symbol-index-column{position:relative;min-height:1px;padding-right:15px;padding-left:15px}@media (min-width:992px){.summary-column,.symbol-index-column{float:left;width:33.33333333%}}@media (min-width:992px){#jsdoc-content-container{float:left;width:75%;left:25%}}#jsdoc-toc-nav{position:relative;min-height:1px;padding-right:15px;padding-left:15px;font-family:'Karla',sans-serif;margin-top:50px}@media (min-width:992px){#jsdoc-toc-nav{float:left;width:25%;right:75%}}.jsdoc-details-table{width:100%;max-width:100%;margin-bottom:20px}.jsdoc-details-table>thead>tr>th{padding:8px;line-height:1.42857143;border-top:1px solid #ddd}.jsdoc-details-table>tbody>tr>td,.jsdoc-details-table>tbody>tr>th,.jsdoc-details-table>tfoot>tr>td,.jsdoc-details-table>tfoot>tr>th,.jsdoc-details-table>thead>tr>td{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.jsdoc-details-table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.jsdoc-details-table>caption+thead>tr:first-child>td,.jsdoc-details-table>caption+thead>tr:first-child>th,.jsdoc-details-table>colgroup+thead>tr:first-child>td,.jsdoc-details-table>colgroup+thead>tr:first-child>th,.jsdoc-details-table>thead:first-child>tr:first-child>td,.jsdoc-details-table>thead:first-child>tr:first-child>th{border-top:0}.jsdoc-details-table .table{background-color:#fff}article td,article th{padding:5px 8px 5px 0}.summary-callout{padding:0 1em;margin:1em 0;border:1px solid #eee;border-left-width:1em;border-left-color:#5bc0de;border-radius:3px}"
  },
  {
    "path": "docs/global.html",
    "content": "<!doctype html>\n<html>\n\n<head>\n  <meta name=\"generator\" content=\"JSDoc 3.6.11\">\n  <meta charset=\"utf-8\">\n  <title>whatsapp-web.js 1.34.6 &raquo; Globals</title>\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Karla:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Noto+Serif:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Inconsolata:500\" type=\"text/css\">\n  <link href=\"css/baseline.css\" rel=\"stylesheet\">\n</head>\n\n<body onload=\"prettyPrint()\">\n  <nav id=\"jsdoc-navbar\" role=\"navigation\" class=\"jsdoc-navbar\">\n    <div id=\"jsdoc-navbar-container\">\n      <div id=\"jsdoc-navbar-content\">\n        <a href=\"index.html\" class=\"jsdoc-navbar-package-name\">whatsapp-web.<wbr>js 1.<wbr>34.<wbr>6</a>\n      </div>\n    </div>\n  </nav>\n  <div id=\"jsdoc-body-container\">\n    <div id=\"jsdoc-content\">\n      <div id=\"jsdoc-content-container\">\n        <div id=\"jsdoc-main\" role=\"main\">\n          <h1>Globals</h1>\n          <section id=\"summary\">\n            <div class=\"summary-callout\">\n              <h2 class=\"summary-callout-heading\">Properties</h2>\n              <div class=\"summary-content\">\n                <div class=\"summary-column\">\n                  <dl class=\"dl-summary-callout\">\n                    <dt><a href=\"global.html#ChatTypes\">ChatTypes</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"global.html#Events\">Events</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"global.html#GroupNotificationTypes\">GroupNotificationTypes</a></dt>\n                    <dd>\n                    </dd>\n                  </dl>\n                </div>\n                <div class=\"summary-column\">\n                  <dl class=\"dl-summary-callout\">\n                    <dt><a href=\"global.html#MessageAck\">MessageAck</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"global.html#MessageTypes\">MessageTypes</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"global.html#Status\">Status</a></dt>\n                    <dd>\n                    </dd>\n                  </dl>\n                </div>\n                <div class=\"summary-column\">\n                  <dl class=\"dl-summary-callout\">\n                    <dt><a href=\"global.html#WAState\">WAState</a></dt>\n                    <dd>\n                    </dd>\n                  </dl>\n                </div>\n              </div>\n            </div>\n            <div class=\"summary-callout\">\n              <h2 class=\"summary-callout-heading\">Method</h2>\n              <div class=\"summary-content\">\n                <div class=\"summary-column\">\n                  <dl class=\"dl-summary-callout\">\n                    <dt><a href=\"global.html#exposeFunctionIfAbsent\">exposeFunctionIfAbsent(page, name, fn)</a></dt>\n                    <dd>\n                    </dd>\n                  </dl>\n                </div>\n                <div class=\"summary-column\">\n                </div>\n                <div class=\"summary-column\">\n                </div>\n              </div>\n            </div>\n            <div class=\"summary-callout\">\n              <h2 class=\"summary-callout-heading\">Abstract types</h2>\n              <div class=\"summary-content\">\n                <div class=\"summary-column\">\n                  <dl class=\"dl-summary-callout\">\n                    <dt><a href=\"global.html#AddParticipantsResult\">AddParticipantsResult</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"global.html#AddParticipnatsOptions\">AddParticipnatsOptions</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"global.html#ButtonSpec\">ButtonSpec</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"global.html#ChannelId\">ChannelId</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"global.html#ContactId\">ContactId</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"global.html#CreateChannelOptions\">CreateChannelOptions</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"global.html#CreateChannelResult\">CreateChannelResult</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"global.html#CreateGroupOptions\">CreateGroupOptions</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"global.html#CreateGroupResult\">CreateGroupResult</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"global.html#FormattedButtonSpec\">FormattedButtonSpec</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"global.html#GroupMembershipRequest\">GroupMembershipRequest</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"global.html#GroupMembershipRequest\">GroupMembershipRequest</a></dt>\n                    <dd>\n                    </dd>\n                  </dl>\n                </div>\n                <div class=\"summary-column\">\n                  <dl class=\"dl-summary-callout\">\n                    <dt><a href=\"global.html#GroupMention\">GroupMention</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"global.html#GroupMention\">GroupMention</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"global.html#GroupParticipant\">GroupParticipant</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"global.html#LocationSendOptions\">LocationSendOptions</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"global.html#MembershipRequestActionOptions\">MembershipRequestActionOptions</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"global.html#MembershipRequestActionOptions\">MembershipRequestActionOptions</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"global.html#MembershipRequestActionResult\">MembershipRequestActionResult</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"global.html#MembershipRequestActionResult\">MembershipRequestActionResult</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"global.html#MessageInfo\">MessageInfo</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"global.html#MessageSendOptions\">MessageSendOptions</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"global.html#MessageSendOptions\">MessageSendOptions</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"global.html#ParticipantResult\">ParticipantResult</a></dt>\n                    <dd>\n                    </dd>\n                  </dl>\n                </div>\n                <div class=\"summary-column\">\n                  <dl class=\"dl-summary-callout\">\n                    <dt><a href=\"global.html#PollSendOptions\">PollSendOptions</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"global.html#ReactionList\">ReactionList</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"global.html#ScheduledEventSendOptions\">ScheduledEventSendOptions</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"global.html#SelectedPollOption\">SelectedPollOption</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"global.html#SendChannelAdminInviteOptions\">SendChannelAdminInviteOptions</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"global.html#SendChannelAdminInviteOptions\">SendChannelAdminInviteOptions</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"global.html#StickerMetadata\">StickerMetadata</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"global.html#TargetOptions\">TargetOptions</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"global.html#TargetOptions\">TargetOptions</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"global.html#TransferChannelOwnershipOptions\">TransferChannelOwnershipOptions</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"global.html#TransferChannelOwnershipOptions\">TransferChannelOwnershipOptions</a></dt>\n                    <dd>\n                    </dd>\n                    <dt><a href=\"global.html#UnsubscribeOptions\">UnsubscribeOptions</a></dt>\n                    <dd>\n                    </dd>\n                  </dl>\n                </div>\n              </div>\n            </div>\n          </section>\n          <section>\n            <h2>Properties</h2>\n            <section>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-readonly\">read-only</span></div>\n              <h3 id=\"ChatTypes\"><span class=\"symbol-name\">ChatTypes</span><small class=\"property-type\">\n                  &nbsp;string</small></h3>\n              <p>Chat types</p>\n              <section>\n                <h4>Properties</h4>\n                <table class=\"jsdoc-details-table\">\n                  <thead>\n                    <tr>\n                      <th>Name</th>\n                      <th>Type</th>\n                      <th>Optional</th>\n                      <th>Description</th>\n                    </tr>\n                  </thead>\n                  <tbody>\n                    <tr>\n                      <td>\n                        <p>SOLO</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>GROUP</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>UNKNOWN</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                  </tbody>\n                </table>\n              </section>\n              <dl class=\"dl-compact\">\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-readonly\">read-only</span></div>\n              <h3 id=\"Events\"><span class=\"symbol-name\">Events</span><small class=\"property-type\">\n                  &nbsp;string</small></h3>\n              <p>Events that can be emitted by the client</p>\n              <section>\n                <h4>Properties</h4>\n                <table class=\"jsdoc-details-table\">\n                  <thead>\n                    <tr>\n                      <th>Name</th>\n                      <th>Type</th>\n                      <th>Optional</th>\n                      <th>Description</th>\n                    </tr>\n                  </thead>\n                  <tbody>\n                    <tr>\n                      <td>\n                        <p>AUTHENTICATED</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>AUTHENTICATION_FAILURE</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>READY</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>CHAT_REMOVED</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>CHAT_ARCHIVED</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>MESSAGE_RECEIVED</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>MESSAGE_CIPHERTEXT</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>MESSAGE_CREATE</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>MESSAGE_REVOKED_EVERYONE</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>MESSAGE_REVOKED_ME</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>MESSAGE_ACK</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>MESSAGE_EDIT</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>UNREAD_COUNT</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>MESSAGE_REACTION</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>MEDIA_UPLOADED</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>CONTACT_CHANGED</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>GROUP_JOIN</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>GROUP_LEAVE</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>GROUP_ADMIN_CHANGED</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>GROUP_MEMBERSHIP_REQUEST</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>GROUP_UPDATE</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>QR_RECEIVED</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>CODE_RECEIVED</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>LOADING_SCREEN</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>DISCONNECTED</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>STATE_CHANGED</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>BATTERY_CHANGED</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>INCOMING_CALL</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>REMOTE_SESSION_SAVED</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>VOTE_UPDATE</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                  </tbody>\n                </table>\n              </section>\n              <dl class=\"dl-compact\">\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-readonly\">read-only</span></div>\n              <h3 id=\"GroupNotificationTypes\"><span class=\"symbol-name\">GroupNotificationTypes</span><small class=\"property-type\">\n                  &nbsp;string</small></h3>\n              <p>Group notification types</p>\n              <section>\n                <h4>Properties</h4>\n                <table class=\"jsdoc-details-table\">\n                  <thead>\n                    <tr>\n                      <th>Name</th>\n                      <th>Type</th>\n                      <th>Optional</th>\n                      <th>Description</th>\n                    </tr>\n                  </thead>\n                  <tbody>\n                    <tr>\n                      <td>\n                        <p>ADD</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>INVITE</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>REMOVE</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>LEAVE</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>PROMOTE</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>DEMOTE</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>SUBJECT</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>DESCRIPTION</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>PICTURE</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>ANNOUNCE</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>RESTRICT</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                  </tbody>\n                </table>\n              </section>\n              <dl class=\"dl-compact\">\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-readonly\">read-only</span></div>\n              <h3 id=\"MessageAck\"><span class=\"symbol-name\">MessageAck</span><small class=\"property-type\">\n                  &nbsp;number</small></h3>\n              <p>Message ACK</p>\n              <section>\n                <h4>Properties</h4>\n                <table class=\"jsdoc-details-table\">\n                  <thead>\n                    <tr>\n                      <th>Name</th>\n                      <th>Type</th>\n                      <th>Optional</th>\n                      <th>Description</th>\n                    </tr>\n                  </thead>\n                  <tbody>\n                    <tr>\n                      <td>\n                        <p>ACK_ERROR</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>ACK_PENDING</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>ACK_SERVER</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>ACK_DEVICE</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>ACK_READ</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>ACK_PLAYED</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                  </tbody>\n                </table>\n              </section>\n              <dl class=\"dl-compact\">\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-readonly\">read-only</span></div>\n              <h3 id=\"MessageTypes\"><span class=\"symbol-name\">MessageTypes</span><small class=\"property-type\">\n                  &nbsp;string</small></h3>\n              <p>Message types</p>\n              <section>\n                <h4>Properties</h4>\n                <table class=\"jsdoc-details-table\">\n                  <thead>\n                    <tr>\n                      <th>Name</th>\n                      <th>Type</th>\n                      <th>Optional</th>\n                      <th>Description</th>\n                    </tr>\n                  </thead>\n                  <tbody>\n                    <tr>\n                      <td>\n                        <p>TEXT</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>AUDIO</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>VOICE</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>IMAGE</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>ALBUM</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>VIDEO</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>DOCUMENT</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>STICKER</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>LOCATION</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>CONTACT_CARD</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>CONTACT_CARD_MULTI</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>ORDER</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>REVOKED</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>PRODUCT</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>UNKNOWN</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>GROUP_INVITE</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>LIST</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>LIST_RESPONSE</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>BUTTONS_RESPONSE</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>PAYMENT</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>BROADCAST_NOTIFICATION</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>CALL_LOG</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>CIPHERTEXT</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>DEBUG</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>E2E_NOTIFICATION</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>GP2</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>GROUP_NOTIFICATION</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>HSM</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>INTERACTIVE</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>NATIVE_FLOW</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>NOTIFICATION</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>NOTIFICATION_TEMPLATE</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>OVERSIZED</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>PROTOCOL</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>REACTION</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>TEMPLATE_BUTTON_REPLY</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>POLL_CREATION</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>SCHEDULED_EVENT_CREATION</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                  </tbody>\n                </table>\n              </section>\n              <dl class=\"dl-compact\">\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-readonly\">read-only</span></div>\n              <h3 id=\"Status\"><span class=\"symbol-name\">Status</span><small class=\"property-type\">\n                  &nbsp;number</small></h3>\n              <p>Client status</p>\n              <section>\n                <h4>Properties</h4>\n                <table class=\"jsdoc-details-table\">\n                  <thead>\n                    <tr>\n                      <th>Name</th>\n                      <th>Type</th>\n                      <th>Optional</th>\n                      <th>Description</th>\n                    </tr>\n                  </thead>\n                  <tbody>\n                    <tr>\n                      <td>\n                        <p>INITIALIZING</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>AUTHENTICATING</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>READY</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                  </tbody>\n                </table>\n              </section>\n              <dl class=\"dl-compact\">\n              </dl>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-readonly\">read-only</span></div>\n              <h3 id=\"WAState\"><span class=\"symbol-name\">WAState</span><small class=\"property-type\">\n                  &nbsp;string</small></h3>\n              <p>WhatsApp state</p>\n              <section>\n                <h4>Properties</h4>\n                <table class=\"jsdoc-details-table\">\n                  <thead>\n                    <tr>\n                      <th>Name</th>\n                      <th>Type</th>\n                      <th>Optional</th>\n                      <th>Description</th>\n                    </tr>\n                  </thead>\n                  <tbody>\n                    <tr>\n                      <td>\n                        <p>CONFLICT</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>CONNECTED</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>DEPRECATED_VERSION</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>OPENING</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>PAIRING</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>PROXYBLOCK</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>SMB_TOS_BLOCK</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>TIMEOUT</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>TOS_BLOCK</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>UNLAUNCHED</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>UNPAIRED</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>UNPAIRED_IDLE</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                  </tbody>\n                </table>\n              </section>\n              <dl class=\"dl-compact\">\n              </dl>\n            </section>\n            <h2>Method</h2>\n            <section>\n              <div class=\"symbol-detail-labels\"><span class=\"label label-async\">async</span></div>\n              <h3 id=\"exposeFunctionIfAbsent\"><span class=\"symbol-name\">exposeFunctionIfAbsent</span><span class=\"signature\"><span class=\"signature-params\">(page, name, fn)</span></span></h3>\n              <p>Expose a function to the page if it does not exist</p>\n              <p>NOTE:\n                Rewrite it to 'upsertFunction' after updating Puppeteer to 20.6 or higher\n                using page.removeExposedFunction\n                https://pptr.dev/api/puppeteer.page.removeexposedfunction</p>\n              <section>\n                <h4>Parameters</h4>\n                <table class=\"jsdoc-details-table\">\n                  <thead>\n                    <tr>\n                      <th>Name</th>\n                      <th>Type</th>\n                      <th>Optional</th>\n                      <th>Description</th>\n                    </tr>\n                  </thead>\n                  <tbody>\n                    <tr>\n                      <td>\n                        <p>page</p>\n                      </td>\n                      <td>\n                        <p>object</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>Puppeteer Page instance</p>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>name</p>\n                      </td>\n                      <td>\n                        <p>string</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>fn</p>\n                      </td>\n                      <td>\n                        <p>function()</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                  </tbody>\n                </table>\n              </section>\n              <dl class=\"dl-compact\">\n              </dl>\n            </section>\n            <h2>Abstract types</h2>\n            <section>\n              <h3 id=\"AddParticipantsResult\"><span class=\"symbol-name\">AddParticipantsResult</span><small class=\"property-type\">\n                  &nbsp;Object</small></h3>\n              <p>An object that handles the result for <code>addParticipants</code> method</p>\n              <section>\n                <h4>Properties</h4>\n                <table class=\"jsdoc-details-table\">\n                  <thead>\n                    <tr>\n                      <th>Name</th>\n                      <th>Type</th>\n                      <th>Optional</th>\n                      <th>Description</th>\n                    </tr>\n                  </thead>\n                  <tbody>\n                    <tr>\n                      <td>\n                        <p>code</p>\n                      </td>\n                      <td>\n                        <p>number</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>The code of the result</p>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>message</p>\n                      </td>\n                      <td>\n                        <p>string</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>The result message</p>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>isInviteV4Sent</p>\n                      </td>\n                      <td>\n                        <p>boolean</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>Indicates if the inviteV4 was sent to the partitipant</p>\n                      </td>\n                    </tr>\n                  </tbody>\n                </table>\n              </section>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"AddParticipnatsOptions\"><span class=\"symbol-name\">AddParticipnatsOptions</span><small class=\"property-type\">\n                  &nbsp;Object</small></h3>\n              <p>An object that handles options for adding participants</p>\n              <section>\n                <h4>Properties</h4>\n                <table class=\"jsdoc-details-table\">\n                  <thead>\n                    <tr>\n                      <th>Name</th>\n                      <th>Type</th>\n                      <th>Optional</th>\n                      <th>Description</th>\n                    </tr>\n                  </thead>\n                  <tbody>\n                    <tr>\n                      <td>\n                        <p>sleep</p>\n                      </td>\n                      <td>\n                        <p>(Array of number or number)</p>\n                      </td>\n                      <td>\n                        <p>Yes</p>\n                      </td>\n                      <td>\n                        <p>The number of milliseconds to wait before adding the next participant. If it is an array, a random sleep time between the sleep[0] and sleep[1] values will be added (the difference must be &gt;=100 ms, otherwise, a random sleep time between sleep[1] and sleep[1] + 100 will be added). If sleep is a number, a sleep time equal to its value will be added. By default, sleep is an array with a value of [250, 500]</p>\n                        <p>Defaults to <code>[250, 500]</code>.</p>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>autoSendInviteV4</p>\n                      </td>\n                      <td>\n                        <p>boolean</p>\n                      </td>\n                      <td>\n                        <p>Yes</p>\n                      </td>\n                      <td>\n                        <p>If true, the inviteV4 will be sent to those participants who have restricted others from being automatically added to groups, otherwise the inviteV4 won't be sent (true by default)</p>\n                        <p>Defaults to <code>true</code>.</p>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>comment</p>\n                      </td>\n                      <td>\n                        <p>string</p>\n                      </td>\n                      <td>\n                        <p>Yes</p>\n                      </td>\n                      <td>\n                        <p>The comment to be added to an inviteV4 (empty string by default)</p>\n                        <p>Defaults to <code>''</code>.</p>\n                      </td>\n                    </tr>\n                  </tbody>\n                </table>\n              </section>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"ButtonSpec\"><span class=\"symbol-name\">ButtonSpec</span><small class=\"property-type\">\n                  &nbsp;Object</small></h3>\n              <p>Button spec used in Buttons constructor</p>\n              <section>\n                <h4>Properties</h4>\n                <table class=\"jsdoc-details-table\">\n                  <thead>\n                    <tr>\n                      <th>Name</th>\n                      <th>Type</th>\n                      <th>Optional</th>\n                      <th>Description</th>\n                    </tr>\n                  </thead>\n                  <tbody>\n                    <tr>\n                      <td>\n                        <p>id</p>\n                      </td>\n                      <td>\n                        <p>string</p>\n                      </td>\n                      <td>\n                        <p>Yes</p>\n                      </td>\n                      <td>\n                        <p>Custom ID to set on the button. A random one will be generated if one is not passed.</p>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>body</p>\n                      </td>\n                      <td>\n                        <p>string</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>The text to show on the button.</p>\n                      </td>\n                    </tr>\n                  </tbody>\n                </table>\n              </section>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"ChannelId\"><span class=\"symbol-name\">ChannelId</span><small class=\"property-type\">\n                  &nbsp;Object</small></h3>\n              <p>Channel ID structure</p>\n              <section>\n                <h4>Properties</h4>\n                <table class=\"jsdoc-details-table\">\n                  <thead>\n                    <tr>\n                      <th>Name</th>\n                      <th>Type</th>\n                      <th>Optional</th>\n                      <th>Description</th>\n                    </tr>\n                  </thead>\n                  <tbody>\n                    <tr>\n                      <td>\n                        <p>server</p>\n                      </td>\n                      <td>\n                        <p>string</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>user</p>\n                      </td>\n                      <td>\n                        <p>string</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>_serialized</p>\n                      </td>\n                      <td>\n                        <p>string</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                  </tbody>\n                </table>\n              </section>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"ContactId\"><span class=\"symbol-name\">ContactId</span><small class=\"property-type\">\n                  &nbsp;Object</small></h3>\n              <p>ID that represents a contact</p>\n              <section>\n                <h4>Properties</h4>\n                <table class=\"jsdoc-details-table\">\n                  <thead>\n                    <tr>\n                      <th>Name</th>\n                      <th>Type</th>\n                      <th>Optional</th>\n                      <th>Description</th>\n                    </tr>\n                  </thead>\n                  <tbody>\n                    <tr>\n                      <td>\n                        <p>server</p>\n                      </td>\n                      <td>\n                        <p>string</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>user</p>\n                      </td>\n                      <td>\n                        <p>string</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>_serialized</p>\n                      </td>\n                      <td>\n                        <p>string</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                  </tbody>\n                </table>\n              </section>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"CreateChannelOptions\"><span class=\"symbol-name\">CreateChannelOptions</span><small class=\"property-type\">\n                  &nbsp;Object</small></h3>\n              <p>Options for the channel creation</p>\n              <section>\n                <h4>Properties</h4>\n                <table class=\"jsdoc-details-table\">\n                  <thead>\n                    <tr>\n                      <th>Name</th>\n                      <th>Type</th>\n                      <th>Optional</th>\n                      <th>Description</th>\n                    </tr>\n                  </thead>\n                  <tbody>\n                    <tr>\n                      <td>\n                        <p>description</p>\n                      </td>\n                      <td>\n                        <p>string</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>The channel description</p>\n                        <p>Value can be null.</p>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>picture</p>\n                      </td>\n                      <td>\n                        <p><a href=\"MessageMedia.html\">MessageMedia</a></p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>The channel profile picture</p>\n                        <p>Value can be null.</p>\n                      </td>\n                    </tr>\n                  </tbody>\n                </table>\n              </section>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"CreateChannelResult\"><span class=\"symbol-name\">CreateChannelResult</span><small class=\"property-type\">\n                  &nbsp;Object</small></h3>\n              <p>An object that handles the result for <code>createChannel</code> method</p>\n              <section>\n                <h4>Properties</h4>\n                <table class=\"jsdoc-details-table\">\n                  <thead>\n                    <tr>\n                      <th>Name</th>\n                      <th>Type</th>\n                      <th>Optional</th>\n                      <th>Description</th>\n                    </tr>\n                  </thead>\n                  <tbody>\n                    <tr>\n                      <td>\n                        <p>title</p>\n                      </td>\n                      <td>\n                        <p>string</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>A channel title</p>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>nid</p>\n                      </td>\n                      <td>\n                        <p>ChatId</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>An object that handels the newly created channel ID</p>\n                        <p>Values in <code>nid</code> have the following properties:</p>\n                        <table class=\"jsdoc-details-table\">\n                          <thead>\n                            <tr>\n                              <th>Name</th>\n                              <th>Type</th>\n                              <th>Optional</th>\n                              <th>Description</th>\n                            </tr>\n                          </thead>\n                          <tbody>\n                            <tr>\n                              <td>\n                                <p>server</p>\n                              </td>\n                              <td>\n                                <p>string</p>\n                              </td>\n                              <td>\n                                <p>&nbsp;</p>\n                              </td>\n                              <td>\n                                <p>'newsletter'</p>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <p>user</p>\n                              </td>\n                              <td>\n                                <p>string</p>\n                              </td>\n                              <td>\n                                <p>&nbsp;</p>\n                              </td>\n                              <td>\n                                <p>'XXXXXXXXXX'</p>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <p>_serialized</p>\n                              </td>\n                              <td>\n                                <p>string</p>\n                              </td>\n                              <td>\n                                <p>&nbsp;</p>\n                              </td>\n                              <td>\n                                <p>'XXXXXXXXXX@newsletter'</p>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>inviteLink</p>\n                      </td>\n                      <td>\n                        <p>string</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>The channel invite link, starts with 'https://whatsapp.com/channel/'</p>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>createdAtTs</p>\n                      </td>\n                      <td>\n                        <p>number</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>The timestamp the channel was created at</p>\n                      </td>\n                    </tr>\n                  </tbody>\n                </table>\n              </section>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"CreateGroupOptions\"><span class=\"symbol-name\">CreateGroupOptions</span><small class=\"property-type\">\n                  &nbsp;Object</small></h3>\n              <p>An object that handles options for group creation</p>\n              <section>\n                <h4>Properties</h4>\n                <table class=\"jsdoc-details-table\">\n                  <thead>\n                    <tr>\n                      <th>Name</th>\n                      <th>Type</th>\n                      <th>Optional</th>\n                      <th>Description</th>\n                    </tr>\n                  </thead>\n                  <tbody>\n                    <tr>\n                      <td>\n                        <p>messageTimer</p>\n                      </td>\n                      <td>\n                        <p>number</p>\n                      </td>\n                      <td>\n                        <p>Yes</p>\n                      </td>\n                      <td>\n                        <p>The number of seconds for the messages to disappear in the group (0 by default, won't take an effect if the group is been creating with myself only)</p>\n                        <p>Defaults to <code>0</code>.</p>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>parentGroupId</p>\n                      </td>\n                      <td>\n                        <p>(string or undefined)</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>The ID of a parent community group to link the newly created group with (won't take an effect if the group is been creating with myself only)</p>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>autoSendInviteV4</p>\n                      </td>\n                      <td>\n                        <p>boolean</p>\n                      </td>\n                      <td>\n                        <p>Yes</p>\n                      </td>\n                      <td>\n                        <p>If true, the inviteV4 will be sent to those participants who have restricted others from being automatically added to groups, otherwise the inviteV4 won't be sent (true by default)</p>\n                        <p>Defaults to <code>true</code>.</p>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>comment</p>\n                      </td>\n                      <td>\n                        <p>string</p>\n                      </td>\n                      <td>\n                        <p>Yes</p>\n                      </td>\n                      <td>\n                        <p>The comment to be added to an inviteV4 (empty string by default)</p>\n                        <p>Defaults to <code>''</code>.</p>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>memberAddMode</p>\n                      </td>\n                      <td>\n                        <p>boolean</p>\n                      </td>\n                      <td>\n                        <p>Yes</p>\n                      </td>\n                      <td>\n                        <p>If true, only admins can add members to the group (false by default)</p>\n                        <p>Defaults to <code>false</code>.</p>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>membershipApprovalMode</p>\n                      </td>\n                      <td>\n                        <p>boolean</p>\n                      </td>\n                      <td>\n                        <p>Yes</p>\n                      </td>\n                      <td>\n                        <p>If true, group admins will be required to approve anyone who wishes to join the group (false by default)</p>\n                        <p>Defaults to <code>false</code>.</p>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>isRestrict</p>\n                      </td>\n                      <td>\n                        <p>boolean</p>\n                      </td>\n                      <td>\n                        <p>Yes</p>\n                      </td>\n                      <td>\n                        <p>If true, only admins can change group group info (true by default)</p>\n                        <p>Defaults to <code>true</code>.</p>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>isAnnounce</p>\n                      </td>\n                      <td>\n                        <p>boolean</p>\n                      </td>\n                      <td>\n                        <p>Yes</p>\n                      </td>\n                      <td>\n                        <p>If true, only admins can send messages (false by default)</p>\n                        <p>Defaults to <code>false</code>.</p>\n                      </td>\n                    </tr>\n                  </tbody>\n                </table>\n              </section>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"CreateGroupResult\"><span class=\"symbol-name\">CreateGroupResult</span><small class=\"property-type\">\n                  &nbsp;Object</small></h3>\n              <p>An object that handles the result for <code>createGroup</code> method</p>\n              <section>\n                <h4>Properties</h4>\n                <table class=\"jsdoc-details-table\">\n                  <thead>\n                    <tr>\n                      <th>Name</th>\n                      <th>Type</th>\n                      <th>Optional</th>\n                      <th>Description</th>\n                    </tr>\n                  </thead>\n                  <tbody>\n                    <tr>\n                      <td>\n                        <p>title</p>\n                      </td>\n                      <td>\n                        <p>string</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>A group title</p>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>gid</p>\n                      </td>\n                      <td>\n                        <p>Object</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>An object that handles the newly created group ID</p>\n                        <p>Values in <code>gid</code> have the following properties:</p>\n                        <table class=\"jsdoc-details-table\">\n                          <thead>\n                            <tr>\n                              <th>Name</th>\n                              <th>Type</th>\n                              <th>Optional</th>\n                              <th>Description</th>\n                            </tr>\n                          </thead>\n                          <tbody>\n                            <tr>\n                              <td>\n                                <p>server</p>\n                              </td>\n                              <td>\n                                <p>string</p>\n                              </td>\n                              <td>\n                                <p>&nbsp;</p>\n                              </td>\n                              <td>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <p>user</p>\n                              </td>\n                              <td>\n                                <p>string</p>\n                              </td>\n                              <td>\n                                <p>&nbsp;</p>\n                              </td>\n                              <td>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <p>_serialized</p>\n                              </td>\n                              <td>\n                                <p>string</p>\n                              </td>\n                              <td>\n                                <p>&nbsp;</p>\n                              </td>\n                              <td>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>participants</p>\n                      </td>\n                      <td>\n                        <p>Object with <a href=\"global.html#ParticipantResult\">ParticipantResult</a> properties</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>An object that handles the result value for each added to the group participant</p>\n                      </td>\n                    </tr>\n                  </tbody>\n                </table>\n              </section>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"FormattedButtonSpec\"><span class=\"symbol-name\">FormattedButtonSpec</span><small class=\"property-type\">\n                  &nbsp;Object</small></h3>\n              <section>\n                <h4>Properties</h4>\n                <table class=\"jsdoc-details-table\">\n                  <thead>\n                    <tr>\n                      <th>Name</th>\n                      <th>Type</th>\n                      <th>Optional</th>\n                      <th>Description</th>\n                    </tr>\n                  </thead>\n                  <tbody>\n                    <tr>\n                      <td>\n                        <p>buttonId</p>\n                      </td>\n                      <td>\n                        <p>string</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>type</p>\n                      </td>\n                      <td>\n                        <p>number</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>buttonText</p>\n                      </td>\n                      <td>\n                        <p>Object</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                  </tbody>\n                </table>\n              </section>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"GroupMembershipRequest\"><span class=\"symbol-name\">GroupMembershipRequest</span><small class=\"property-type\">\n                  &nbsp;Object</small></h3>\n              <p>An object that handles the information about the group membership request</p>\n              <section>\n                <h4>Properties</h4>\n                <table class=\"jsdoc-details-table\">\n                  <thead>\n                    <tr>\n                      <th>Name</th>\n                      <th>Type</th>\n                      <th>Optional</th>\n                      <th>Description</th>\n                    </tr>\n                  </thead>\n                  <tbody>\n                    <tr>\n                      <td>\n                        <p>id</p>\n                      </td>\n                      <td>\n                        <p>Object</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>The wid of a user who requests to enter the group</p>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>addedBy</p>\n                      </td>\n                      <td>\n                        <p>Object</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>The wid of a user who created that request</p>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>parentGroupId</p>\n                      </td>\n                      <td>\n                        <p>(Object or null)</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>The wid of a community parent group to which the current group is linked</p>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>requestMethod</p>\n                      </td>\n                      <td>\n                        <p>string</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>The method used to create the request: NonAdminAdd/InviteLink/LinkedGroupJoin</p>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>t</p>\n                      </td>\n                      <td>\n                        <p>number</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>The timestamp the request was created at</p>\n                      </td>\n                    </tr>\n                  </tbody>\n                </table>\n              </section>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"GroupMembershipRequest\"><span class=\"symbol-name\">GroupMembershipRequest</span><small class=\"property-type\">\n                  &nbsp;Object</small></h3>\n              <p>An object that handles the information about the group membership request</p>\n              <section>\n                <h4>Properties</h4>\n                <table class=\"jsdoc-details-table\">\n                  <thead>\n                    <tr>\n                      <th>Name</th>\n                      <th>Type</th>\n                      <th>Optional</th>\n                      <th>Description</th>\n                    </tr>\n                  </thead>\n                  <tbody>\n                    <tr>\n                      <td>\n                        <p>id</p>\n                      </td>\n                      <td>\n                        <p>Object</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>The wid of a user who requests to enter the group</p>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>addedBy</p>\n                      </td>\n                      <td>\n                        <p>Object</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>The wid of a user who created that request</p>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>parentGroupId</p>\n                      </td>\n                      <td>\n                        <p>(Object or null)</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>The wid of a community parent group to which the current group is linked</p>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>requestMethod</p>\n                      </td>\n                      <td>\n                        <p>string</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>The method used to create the request: NonAdminAdd/InviteLink/LinkedGroupJoin</p>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>t</p>\n                      </td>\n                      <td>\n                        <p>number</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>The timestamp the request was created at</p>\n                      </td>\n                    </tr>\n                  </tbody>\n                </table>\n              </section>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"GroupMention\"><span class=\"symbol-name\">GroupMention</span><small class=\"property-type\">\n                  &nbsp;Object</small></h3>\n              <p>An object representing mentions of groups</p>\n              <section>\n                <h4>Properties</h4>\n                <table class=\"jsdoc-details-table\">\n                  <thead>\n                    <tr>\n                      <th>Name</th>\n                      <th>Type</th>\n                      <th>Optional</th>\n                      <th>Description</th>\n                    </tr>\n                  </thead>\n                  <tbody>\n                    <tr>\n                      <td>\n                        <p>subject</p>\n                      </td>\n                      <td>\n                        <p>string</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>The name of a group to mention (can be custom)</p>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>id</p>\n                      </td>\n                      <td>\n                        <p>string</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>The group ID, e.g.: 'XXXXXXXXXX@g.us'</p>\n                      </td>\n                    </tr>\n                  </tbody>\n                </table>\n              </section>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"GroupMention\"><span class=\"symbol-name\">GroupMention</span><small class=\"property-type\">\n                  &nbsp;Object</small></h3>\n              <section>\n                <h4>Properties</h4>\n                <table class=\"jsdoc-details-table\">\n                  <thead>\n                    <tr>\n                      <th>Name</th>\n                      <th>Type</th>\n                      <th>Optional</th>\n                      <th>Description</th>\n                    </tr>\n                  </thead>\n                  <tbody>\n                    <tr>\n                      <td>\n                        <p>groupSubject</p>\n                      </td>\n                      <td>\n                        <p>string</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>The name of the group</p>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>groupJid</p>\n                      </td>\n                      <td>\n                        <p>string</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>The group ID</p>\n                      </td>\n                    </tr>\n                  </tbody>\n                </table>\n              </section>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"GroupParticipant\"><span class=\"symbol-name\">GroupParticipant</span><small class=\"property-type\">\n                  &nbsp;Object</small></h3>\n              <p>Group participant information</p>\n              <section>\n                <h4>Properties</h4>\n                <table class=\"jsdoc-details-table\">\n                  <thead>\n                    <tr>\n                      <th>Name</th>\n                      <th>Type</th>\n                      <th>Optional</th>\n                      <th>Description</th>\n                    </tr>\n                  </thead>\n                  <tbody>\n                    <tr>\n                      <td>\n                        <p>id</p>\n                      </td>\n                      <td>\n                        <p><a href=\"global.html#ContactId\">ContactId</a></p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>isAdmin</p>\n                      </td>\n                      <td>\n                        <p>boolean</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>isSuperAdmin</p>\n                      </td>\n                      <td>\n                        <p>boolean</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                  </tbody>\n                </table>\n              </section>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"LocationSendOptions\"><span class=\"symbol-name\">LocationSendOptions</span><small class=\"property-type\">\n                  &nbsp;Object</small></h3>\n              <p>Location send options</p>\n              <section>\n                <h4>Properties</h4>\n                <table class=\"jsdoc-details-table\">\n                  <thead>\n                    <tr>\n                      <th>Name</th>\n                      <th>Type</th>\n                      <th>Optional</th>\n                      <th>Description</th>\n                    </tr>\n                  </thead>\n                  <tbody>\n                    <tr>\n                      <td>\n                        <p>name</p>\n                      </td>\n                      <td>\n                        <p>string</p>\n                      </td>\n                      <td>\n                        <p>Yes</p>\n                      </td>\n                      <td>\n                        <p>Location name</p>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>address</p>\n                      </td>\n                      <td>\n                        <p>string</p>\n                      </td>\n                      <td>\n                        <p>Yes</p>\n                      </td>\n                      <td>\n                        <p>Location address</p>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>url</p>\n                      </td>\n                      <td>\n                        <p>string</p>\n                      </td>\n                      <td>\n                        <p>Yes</p>\n                      </td>\n                      <td>\n                        <p>URL address to be shown within a location message</p>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>description</p>\n                      </td>\n                      <td>\n                        <p>string</p>\n                      </td>\n                      <td>\n                        <p>Yes</p>\n                      </td>\n                      <td>\n                        <p>Location full description</p>\n                      </td>\n                    </tr>\n                  </tbody>\n                </table>\n              </section>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"MembershipRequestActionOptions\"><span class=\"symbol-name\">MembershipRequestActionOptions</span><small class=\"property-type\">\n                  &nbsp;Object</small></h3>\n              <p>An object that handles options for <code>approveGroupMembershipRequests</code> and <code>rejectGroupMembershipRequests</code> methods</p>\n              <section>\n                <h4>Properties</h4>\n                <table class=\"jsdoc-details-table\">\n                  <thead>\n                    <tr>\n                      <th>Name</th>\n                      <th>Type</th>\n                      <th>Optional</th>\n                      <th>Description</th>\n                    </tr>\n                  </thead>\n                  <tbody>\n                    <tr>\n                      <td>\n                        <p>requesterIds</p>\n                      </td>\n                      <td>\n                        <p>(Array of string, string, or null)</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>User ID/s who requested to join the group, if no value is provided, the method will search for all membership requests for that group</p>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>sleep</p>\n                      </td>\n                      <td>\n                        <p>(Array of number, number, or null)</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>The number of milliseconds to wait before performing an operation for the next requester. If it is an array, a random sleep time between the sleep[0] and sleep[1] values will be added (the difference must be &gt;=100 ms, otherwise, a random sleep time between sleep[1] and sleep[1] + 100 will be added). If sleep is a number, a sleep time equal to its value will be added. By default, sleep is an array with a value of [250, 500]</p>\n                      </td>\n                    </tr>\n                  </tbody>\n                </table>\n              </section>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"MembershipRequestActionOptions\"><span class=\"symbol-name\">MembershipRequestActionOptions</span><small class=\"property-type\">\n                  &nbsp;Object</small></h3>\n              <p>An object that handles options for <code>approveGroupMembershipRequests</code> and <code>rejectGroupMembershipRequests</code> methods</p>\n              <section>\n                <h4>Properties</h4>\n                <table class=\"jsdoc-details-table\">\n                  <thead>\n                    <tr>\n                      <th>Name</th>\n                      <th>Type</th>\n                      <th>Optional</th>\n                      <th>Description</th>\n                    </tr>\n                  </thead>\n                  <tbody>\n                    <tr>\n                      <td>\n                        <p>requesterIds</p>\n                      </td>\n                      <td>\n                        <p>(Array of string, string, or null)</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>User ID/s who requested to join the group, if no value is provided, the method will search for all membership requests for that group</p>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>sleep</p>\n                      </td>\n                      <td>\n                        <p>(Array of number, number, or null)</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>The number of milliseconds to wait before performing an operation for the next requester. If it is an array, a random sleep time between the sleep[0] and sleep[1] values will be added (the difference must be &gt;=100 ms, otherwise, a random sleep time between sleep[1] and sleep[1] + 100 will be added). If sleep is a number, a sleep time equal to its value will be added. By default, sleep is an array with a value of [250, 500]</p>\n                      </td>\n                    </tr>\n                  </tbody>\n                </table>\n              </section>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"MembershipRequestActionResult\"><span class=\"symbol-name\">MembershipRequestActionResult</span><small class=\"property-type\">\n                  &nbsp;Object</small></h3>\n              <p>An object that handles the result for membership request action</p>\n              <section>\n                <h4>Properties</h4>\n                <table class=\"jsdoc-details-table\">\n                  <thead>\n                    <tr>\n                      <th>Name</th>\n                      <th>Type</th>\n                      <th>Optional</th>\n                      <th>Description</th>\n                    </tr>\n                  </thead>\n                  <tbody>\n                    <tr>\n                      <td>\n                        <p>requesterId</p>\n                      </td>\n                      <td>\n                        <p>string</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>User ID whos membership request was approved/rejected</p>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>error</p>\n                      </td>\n                      <td>\n                        <p>(number or undefined)</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>An error code that occurred during the operation for the participant</p>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>message</p>\n                      </td>\n                      <td>\n                        <p>string</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>A message with a result of membership request action</p>\n                      </td>\n                    </tr>\n                  </tbody>\n                </table>\n              </section>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"MembershipRequestActionResult\"><span class=\"symbol-name\">MembershipRequestActionResult</span><small class=\"property-type\">\n                  &nbsp;Object</small></h3>\n              <p>An object that handles the result for membership request action</p>\n              <section>\n                <h4>Properties</h4>\n                <table class=\"jsdoc-details-table\">\n                  <thead>\n                    <tr>\n                      <th>Name</th>\n                      <th>Type</th>\n                      <th>Optional</th>\n                      <th>Description</th>\n                    </tr>\n                  </thead>\n                  <tbody>\n                    <tr>\n                      <td>\n                        <p>requesterId</p>\n                      </td>\n                      <td>\n                        <p>string</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>User ID whos membership request was approved/rejected</p>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>error</p>\n                      </td>\n                      <td>\n                        <p>number</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>An error code that occurred during the operation for the participant</p>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>message</p>\n                      </td>\n                      <td>\n                        <p>string</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>A message with a result of membership request action</p>\n                      </td>\n                    </tr>\n                  </tbody>\n                </table>\n              </section>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"MessageInfo\"><span class=\"symbol-name\">MessageInfo</span><small class=\"property-type\">\n                  &nbsp;Object</small></h3>\n              <p>Message Info</p>\n              <section>\n                <h4>Properties</h4>\n                <table class=\"jsdoc-details-table\">\n                  <thead>\n                    <tr>\n                      <th>Name</th>\n                      <th>Type</th>\n                      <th>Optional</th>\n                      <th>Description</th>\n                    </tr>\n                  </thead>\n                  <tbody>\n                    <tr>\n                      <td>\n                        <p>delivery</p>\n                      </td>\n                      <td>\n                        <p>Array of {id: <a href=\"global.html#ContactId\">ContactId</a>, t: number}</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>Contacts to which the message has been delivered to</p>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>deliveryRemaining</p>\n                      </td>\n                      <td>\n                        <p>number</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>Amount of people to whom the message has not been delivered to</p>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>played</p>\n                      </td>\n                      <td>\n                        <p>Array of {id: <a href=\"global.html#ContactId\">ContactId</a>, t: number}</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>Contacts who have listened to the voice message</p>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>playedRemaining</p>\n                      </td>\n                      <td>\n                        <p>number</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>Amount of people who have not listened to the message</p>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>read</p>\n                      </td>\n                      <td>\n                        <p>Array of {id: <a href=\"global.html#ContactId\">ContactId</a>, t: number}</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>Contacts who have read the message</p>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>readRemaining</p>\n                      </td>\n                      <td>\n                        <p>number</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>Amount of people who have not read the message</p>\n                      </td>\n                    </tr>\n                  </tbody>\n                </table>\n              </section>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"MessageSendOptions\"><span class=\"symbol-name\">MessageSendOptions</span><small class=\"property-type\">\n                  &nbsp;Object</small></h3>\n              <p>Message options.</p>\n              <section>\n                <h4>Properties</h4>\n                <table class=\"jsdoc-details-table\">\n                  <thead>\n                    <tr>\n                      <th>Name</th>\n                      <th>Type</th>\n                      <th>Optional</th>\n                      <th>Description</th>\n                    </tr>\n                  </thead>\n                  <tbody>\n                    <tr>\n                      <td>\n                        <p>linkPreview</p>\n                      </td>\n                      <td>\n                        <p>boolean</p>\n                      </td>\n                      <td>\n                        <p>Yes</p>\n                      </td>\n                      <td>\n                        <p>Show links preview. Has no effect on multi-device accounts.</p>\n                        <p>Defaults to <code>true</code>.</p>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>sendAudioAsVoice</p>\n                      </td>\n                      <td>\n                        <p>boolean</p>\n                      </td>\n                      <td>\n                        <p>Yes</p>\n                      </td>\n                      <td>\n                        <p>Send audio as voice message with a generated waveform</p>\n                        <p>Defaults to <code>false</code>.</p>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>sendVideoAsGif</p>\n                      </td>\n                      <td>\n                        <p>boolean</p>\n                      </td>\n                      <td>\n                        <p>Yes</p>\n                      </td>\n                      <td>\n                        <p>Send video as gif</p>\n                        <p>Defaults to <code>false</code>.</p>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>sendMediaAsSticker</p>\n                      </td>\n                      <td>\n                        <p>boolean</p>\n                      </td>\n                      <td>\n                        <p>Yes</p>\n                      </td>\n                      <td>\n                        <p>Send media as a sticker</p>\n                        <p>Defaults to <code>false</code>.</p>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>sendMediaAsDocument</p>\n                      </td>\n                      <td>\n                        <p>boolean</p>\n                      </td>\n                      <td>\n                        <p>Yes</p>\n                      </td>\n                      <td>\n                        <p>Send media as a document</p>\n                        <p>Defaults to <code>false</code>.</p>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>sendMediaAsHd</p>\n                      </td>\n                      <td>\n                        <p>boolean</p>\n                      </td>\n                      <td>\n                        <p>Yes</p>\n                      </td>\n                      <td>\n                        <p>Send image as quality HD</p>\n                        <p>Defaults to <code>false</code>.</p>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>isViewOnce</p>\n                      </td>\n                      <td>\n                        <p>boolean</p>\n                      </td>\n                      <td>\n                        <p>Yes</p>\n                      </td>\n                      <td>\n                        <p>Send photo/video as a view once message</p>\n                        <p>Defaults to <code>false</code>.</p>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>parseVCards</p>\n                      </td>\n                      <td>\n                        <p>boolean</p>\n                      </td>\n                      <td>\n                        <p>Yes</p>\n                      </td>\n                      <td>\n                        <p>Automatically parse vCards and send them as contacts</p>\n                        <p>Defaults to <code>true</code>.</p>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>caption</p>\n                      </td>\n                      <td>\n                        <p>string</p>\n                      </td>\n                      <td>\n                        <p>Yes</p>\n                      </td>\n                      <td>\n                        <p>Image or video caption</p>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>quotedMessageId</p>\n                      </td>\n                      <td>\n                        <p>string</p>\n                      </td>\n                      <td>\n                        <p>Yes</p>\n                      </td>\n                      <td>\n                        <p>Id of the message that is being quoted (or replied to)</p>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>groupMentions</p>\n                      </td>\n                      <td>\n                        <p>Array of <a href=\"global.html#GroupMention\">GroupMention</a></p>\n                      </td>\n                      <td>\n                        <p>Yes</p>\n                      </td>\n                      <td>\n                        <p>An array of object that handle group mentions</p>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>mentions</p>\n                      </td>\n                      <td>\n                        <p>Array of string</p>\n                      </td>\n                      <td>\n                        <p>Yes</p>\n                      </td>\n                      <td>\n                        <p>User IDs to mention in the message</p>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>sendSeen</p>\n                      </td>\n                      <td>\n                        <p>boolean</p>\n                      </td>\n                      <td>\n                        <p>Yes</p>\n                      </td>\n                      <td>\n                        <p>Mark the conversation as seen after sending the message</p>\n                        <p>Defaults to <code>true</code>.</p>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>invokedBotWid</p>\n                      </td>\n                      <td>\n                        <p>string</p>\n                      </td>\n                      <td>\n                        <p>Yes</p>\n                      </td>\n                      <td>\n                        <p>Bot Wid when doing a bot mention like @Meta AI</p>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>stickerAuthor</p>\n                      </td>\n                      <td>\n                        <p>string</p>\n                      </td>\n                      <td>\n                        <p>Yes</p>\n                      </td>\n                      <td>\n                        <p>Sets the author of the sticker, (if sendMediaAsSticker is true).</p>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>stickerName</p>\n                      </td>\n                      <td>\n                        <p>string</p>\n                      </td>\n                      <td>\n                        <p>Yes</p>\n                      </td>\n                      <td>\n                        <p>Sets the name of the sticker, (if sendMediaAsSticker is true).</p>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>stickerCategories</p>\n                      </td>\n                      <td>\n                        <p>Array of string</p>\n                      </td>\n                      <td>\n                        <p>Yes</p>\n                      </td>\n                      <td>\n                        <p>Sets the categories of the sticker, (if sendMediaAsSticker is true). Provide emoji char array, can be null.</p>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>ignoreQuoteErrors</p>\n                      </td>\n                      <td>\n                        <p>boolean</p>\n                      </td>\n                      <td>\n                        <p>Yes</p>\n                      </td>\n                      <td>\n                        <p>Should the bot send a quoted message without the quoted message if it fails to get the quote?</p>\n                        <p>Defaults to <code>true</code>.</p>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>waitUntilMsgSent</p>\n                      </td>\n                      <td>\n                        <p>boolean</p>\n                      </td>\n                      <td>\n                        <p>Yes</p>\n                      </td>\n                      <td>\n                        <p>Should the bot wait for the message send result?</p>\n                        <p>Defaults to <code>false</code>.</p>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>media</p>\n                      </td>\n                      <td>\n                        <p><a href=\"MessageMedia.html\">MessageMedia</a></p>\n                      </td>\n                      <td>\n                        <p>Yes</p>\n                      </td>\n                      <td>\n                        <p>Media to be sent</p>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>extra</p>\n                      </td>\n                      <td>\n                        <p>any</p>\n                      </td>\n                      <td>\n                        <p>Yes</p>\n                      </td>\n                      <td>\n                        <p>Extra options</p>\n                      </td>\n                    </tr>\n                  </tbody>\n                </table>\n              </section>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"MessageSendOptions\"><span class=\"symbol-name\">MessageSendOptions</span><small class=\"property-type\">\n                  &nbsp;Object</small></h3>\n              <p>Message options</p>\n              <section>\n                <h4>Properties</h4>\n                <table class=\"jsdoc-details-table\">\n                  <thead>\n                    <tr>\n                      <th>Name</th>\n                      <th>Type</th>\n                      <th>Optional</th>\n                      <th>Description</th>\n                    </tr>\n                  </thead>\n                  <tbody>\n                    <tr>\n                      <td>\n                        <p>caption</p>\n                      </td>\n                      <td>\n                        <p>string</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>Image or video caption</p>\n                        <p>Value can be null.</p>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>mentions</p>\n                      </td>\n                      <td>\n                        <p>Array of string</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>User IDs of user that will be mentioned in the message</p>\n                        <p>Value can be null.</p>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>media</p>\n                      </td>\n                      <td>\n                        <p><a href=\"MessageMedia.html\">MessageMedia</a></p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>Image or video to be sent</p>\n                        <p>Value can be null.</p>\n                      </td>\n                    </tr>\n                  </tbody>\n                </table>\n              </section>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"ParticipantResult\"><span class=\"symbol-name\">ParticipantResult</span><small class=\"property-type\">\n                  &nbsp;Object</small></h3>\n              <p>An object that represents the result for a participant added to a group</p>\n              <section>\n                <h4>Properties</h4>\n                <table class=\"jsdoc-details-table\">\n                  <thead>\n                    <tr>\n                      <th>Name</th>\n                      <th>Type</th>\n                      <th>Optional</th>\n                      <th>Description</th>\n                    </tr>\n                  </thead>\n                  <tbody>\n                    <tr>\n                      <td>\n                        <p>statusCode</p>\n                      </td>\n                      <td>\n                        <p>number</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>The status code of the result</p>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>message</p>\n                      </td>\n                      <td>\n                        <p>string</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>The result message</p>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>isGroupCreator</p>\n                      </td>\n                      <td>\n                        <p>boolean</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>Indicates if the participant is a group creator</p>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>isInviteV4Sent</p>\n                      </td>\n                      <td>\n                        <p>boolean</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>Indicates if the inviteV4 was sent to the participant</p>\n                      </td>\n                    </tr>\n                  </tbody>\n                </table>\n              </section>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"PollSendOptions\"><span class=\"symbol-name\">PollSendOptions</span><small class=\"property-type\">\n                  &nbsp;Object</small></h3>\n              <p>Poll send options</p>\n              <section>\n                <h4>Properties</h4>\n                <table class=\"jsdoc-details-table\">\n                  <thead>\n                    <tr>\n                      <th>Name</th>\n                      <th>Type</th>\n                      <th>Optional</th>\n                      <th>Description</th>\n                    </tr>\n                  </thead>\n                  <tbody>\n                    <tr>\n                      <td>\n                        <p>allowMultipleAnswers</p>\n                      </td>\n                      <td>\n                        <p>boolean</p>\n                      </td>\n                      <td>\n                        <p>Yes</p>\n                      </td>\n                      <td>\n                        <p>If false it is a single choice poll, otherwise it is a multiple choice poll (false by default)</p>\n                        <p>Defaults to <code>false</code>.</p>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>messageSecret</p>\n                      </td>\n                      <td>\n                        <p>Array of number</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>The custom message secret, can be used as a poll ID. NOTE: it has to be a unique vector with a length of 32</p>\n                        <p>Value can be null.</p>\n                      </td>\n                    </tr>\n                  </tbody>\n                </table>\n              </section>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"ReactionList\"><span class=\"symbol-name\">ReactionList</span><small class=\"property-type\">\n                  &nbsp;Object</small></h3>\n              <p>Reaction List</p>\n              <section>\n                <h4>Properties</h4>\n                <table class=\"jsdoc-details-table\">\n                  <thead>\n                    <tr>\n                      <th>Name</th>\n                      <th>Type</th>\n                      <th>Optional</th>\n                      <th>Description</th>\n                    </tr>\n                  </thead>\n                  <tbody>\n                    <tr>\n                      <td>\n                        <p>id</p>\n                      </td>\n                      <td>\n                        <p>string</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>Original emoji</p>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>aggregateEmoji</p>\n                      </td>\n                      <td>\n                        <p>string</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>aggregate emoji</p>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>hasReactionByMe</p>\n                      </td>\n                      <td>\n                        <p>boolean</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>Flag who sent the reaction</p>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>senders</p>\n                      </td>\n                      <td>\n                        <p>Array of <a href=\"Reaction.html\">Reaction</a></p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>Reaction senders, to this message</p>\n                      </td>\n                    </tr>\n                  </tbody>\n                </table>\n              </section>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"ScheduledEventSendOptions\"><span class=\"symbol-name\">ScheduledEventSendOptions</span><small class=\"property-type\">\n                  &nbsp;Object</small></h3>\n              <p>ScheduledEvent send options</p>\n              <section>\n                <h4>Properties</h4>\n                <table class=\"jsdoc-details-table\">\n                  <thead>\n                    <tr>\n                      <th>Name</th>\n                      <th>Type</th>\n                      <th>Optional</th>\n                      <th>Description</th>\n                    </tr>\n                  </thead>\n                  <tbody>\n                    <tr>\n                      <td>\n                        <p>description</p>\n                      </td>\n                      <td>\n                        <p>string</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>The scheduled event description</p>\n                        <p>Value can be null.</p>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>endTime</p>\n                      </td>\n                      <td>\n                        <p>Date</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>The end time of the event</p>\n                        <p>Value can be null.</p>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>location</p>\n                      </td>\n                      <td>\n                        <p>string</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>The location of the event</p>\n                        <p>Value can be null.</p>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>callType</p>\n                      </td>\n                      <td>\n                        <p>string</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>The type of a WhatsApp call link to generate, valid values are: <code>video</code> | <code>voice</code> | <code>none</code></p>\n                        <p>Value can be null.</p>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>isEventCanceled</p>\n                      </td>\n                      <td>\n                        <p>boolean</p>\n                      </td>\n                      <td>\n                        <p>Yes</p>\n                      </td>\n                      <td>\n                        <p>Indicates if a scheduled event should be sent as an already canceled</p>\n                        <p>Defaults to <code>false</code>.</p>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>messageSecret</p>\n                      </td>\n                      <td>\n                        <p>Array of number</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>The custom message secret, can be used as an event ID. NOTE: it has to be a unique vector with a length of 32</p>\n                        <p>Value can be null.</p>\n                      </td>\n                    </tr>\n                  </tbody>\n                </table>\n              </section>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"SelectedPollOption\"><span class=\"symbol-name\">SelectedPollOption</span><small class=\"property-type\">\n                  &nbsp;Object</small></h3>\n              <p>Selected poll option structure</p>\n              <section>\n                <h4>Properties</h4>\n                <table class=\"jsdoc-details-table\">\n                  <thead>\n                    <tr>\n                      <th>Name</th>\n                      <th>Type</th>\n                      <th>Optional</th>\n                      <th>Description</th>\n                    </tr>\n                  </thead>\n                  <tbody>\n                    <tr>\n                      <td>\n                        <p>id</p>\n                      </td>\n                      <td>\n                        <p>number</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>The local selected or deselected option ID</p>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>name</p>\n                      </td>\n                      <td>\n                        <p>string</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>The option name</p>\n                      </td>\n                    </tr>\n                  </tbody>\n                </table>\n              </section>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"SendChannelAdminInviteOptions\"><span class=\"symbol-name\">SendChannelAdminInviteOptions</span><small class=\"property-type\">\n                  &nbsp;Object</small></h3>\n              <section>\n                <h4>Property</h4>\n                <table class=\"jsdoc-details-table\">\n                  <thead>\n                    <tr>\n                      <th>Name</th>\n                      <th>Type</th>\n                      <th>Optional</th>\n                      <th>Description</th>\n                    </tr>\n                  </thead>\n                  <tbody>\n                    <tr>\n                      <td>\n                        <p>comment</p>\n                      </td>\n                      <td>\n                        <p>string</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>The comment to be added to an invitation</p>\n                        <p>Value can be null.</p>\n                      </td>\n                    </tr>\n                  </tbody>\n                </table>\n              </section>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"SendChannelAdminInviteOptions\"><span class=\"symbol-name\">SendChannelAdminInviteOptions</span><small class=\"property-type\">\n                  &nbsp;Object</small></h3>\n              <section>\n                <h4>Property</h4>\n                <table class=\"jsdoc-details-table\">\n                  <thead>\n                    <tr>\n                      <th>Name</th>\n                      <th>Type</th>\n                      <th>Optional</th>\n                      <th>Description</th>\n                    </tr>\n                  </thead>\n                  <tbody>\n                    <tr>\n                      <td>\n                        <p>comment</p>\n                      </td>\n                      <td>\n                        <p>string</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>The comment to be added to an invitation</p>\n                        <p>Value can be null.</p>\n                      </td>\n                    </tr>\n                  </tbody>\n                </table>\n              </section>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"StickerMetadata\"><span class=\"symbol-name\">StickerMetadata</span><small class=\"property-type\">\n                  &nbsp;Object</small></h3>\n              <p>Sticker metadata.</p>\n              <section>\n                <h4>Properties</h4>\n                <table class=\"jsdoc-details-table\">\n                  <thead>\n                    <tr>\n                      <th>Name</th>\n                      <th>Type</th>\n                      <th>Optional</th>\n                      <th>Description</th>\n                    </tr>\n                  </thead>\n                  <tbody>\n                    <tr>\n                      <td>\n                        <p>name</p>\n                      </td>\n                      <td>\n                        <p>string</p>\n                      </td>\n                      <td>\n                        <p>Yes</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>author</p>\n                      </td>\n                      <td>\n                        <p>string</p>\n                      </td>\n                      <td>\n                        <p>Yes</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>categories</p>\n                      </td>\n                      <td>\n                        <p>Array of string</p>\n                      </td>\n                      <td>\n                        <p>Yes</p>\n                      </td>\n                      <td>\n                      </td>\n                    </tr>\n                  </tbody>\n                </table>\n              </section>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"TargetOptions\"><span class=\"symbol-name\">TargetOptions</span><small class=\"property-type\">\n                  &nbsp;Object</small></h3>\n              <p>Target options object description</p>\n              <section>\n                <h4>Properties</h4>\n                <table class=\"jsdoc-details-table\">\n                  <thead>\n                    <tr>\n                      <th>Name</th>\n                      <th>Type</th>\n                      <th>Optional</th>\n                      <th>Description</th>\n                    </tr>\n                  </thead>\n                  <tbody>\n                    <tr>\n                      <td>\n                        <p>module</p>\n                      </td>\n                      <td>\n                        <p>(string or number)</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>The name or a key of the target module to search</p>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>index</p>\n                      </td>\n                      <td>\n                        <p>number</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>The index value of the target module</p>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>function</p>\n                      </td>\n                      <td>\n                        <p>string</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>The function name to get from a module</p>\n                      </td>\n                    </tr>\n                  </tbody>\n                </table>\n              </section>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"TargetOptions\"><span class=\"symbol-name\">TargetOptions</span><small class=\"property-type\">\n                  &nbsp;Object</small></h3>\n              <p>Target options object description</p>\n              <section>\n                <h4>Properties</h4>\n                <table class=\"jsdoc-details-table\">\n                  <thead>\n                    <tr>\n                      <th>Name</th>\n                      <th>Type</th>\n                      <th>Optional</th>\n                      <th>Description</th>\n                    </tr>\n                  </thead>\n                  <tbody>\n                    <tr>\n                      <td>\n                        <p>module</p>\n                      </td>\n                      <td>\n                        <p>(string or number)</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>The target module</p>\n                      </td>\n                    </tr>\n                    <tr>\n                      <td>\n                        <p>function</p>\n                      </td>\n                      <td>\n                        <p>string</p>\n                      </td>\n                      <td>\n                        <p>&nbsp;</p>\n                      </td>\n                      <td>\n                        <p>The function name to get from a module</p>\n                      </td>\n                    </tr>\n                  </tbody>\n                </table>\n              </section>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"TransferChannelOwnershipOptions\"><span class=\"symbol-name\">TransferChannelOwnershipOptions</span><small class=\"property-type\">\n                  &nbsp;Object</small></h3>\n              <p>Options for transferring a channel ownership to another user</p>\n              <section>\n                <h4>Property</h4>\n                <table class=\"jsdoc-details-table\">\n                  <thead>\n                    <tr>\n                      <th>Name</th>\n                      <th>Type</th>\n                      <th>Optional</th>\n                      <th>Description</th>\n                    </tr>\n                  </thead>\n                  <tbody>\n                    <tr>\n                      <td>\n                        <p>shouldDismissSelfAsAdmin</p>\n                      </td>\n                      <td>\n                        <p>boolean</p>\n                      </td>\n                      <td>\n                        <p>Yes</p>\n                      </td>\n                      <td>\n                        <p>If true, after the channel ownership is being transferred to another user, the current user will be dismissed as a channel admin and will become to a channel subscriber.</p>\n                        <p>Defaults to <code>false</code>.</p>\n                      </td>\n                    </tr>\n                  </tbody>\n                </table>\n              </section>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"TransferChannelOwnershipOptions\"><span class=\"symbol-name\">TransferChannelOwnershipOptions</span><small class=\"property-type\">\n                  &nbsp;Object</small></h3>\n              <p>Options for transferring a channel ownership to another user</p>\n              <section>\n                <h4>Property</h4>\n                <table class=\"jsdoc-details-table\">\n                  <thead>\n                    <tr>\n                      <th>Name</th>\n                      <th>Type</th>\n                      <th>Optional</th>\n                      <th>Description</th>\n                    </tr>\n                  </thead>\n                  <tbody>\n                    <tr>\n                      <td>\n                        <p>shouldDismissSelfAsAdmin</p>\n                      </td>\n                      <td>\n                        <p>boolean</p>\n                      </td>\n                      <td>\n                        <p>Yes</p>\n                      </td>\n                      <td>\n                        <p>If true, after the channel ownership is being transferred to another user, the current user will be dismissed as a channel admin and will become to a channel subscriber.</p>\n                        <p>Defaults to <code>false</code>.</p>\n                      </td>\n                    </tr>\n                  </tbody>\n                </table>\n              </section>\n              <dl class=\"dl-compact\">\n              </dl>\n              <h3 id=\"UnsubscribeOptions\"><span class=\"symbol-name\">UnsubscribeOptions</span><small class=\"property-type\">\n                  &nbsp;Object</small></h3>\n              <p>Options for unsubscribe from a channel</p>\n              <section>\n                <h4>Property</h4>\n                <table class=\"jsdoc-details-table\">\n                  <thead>\n                    <tr>\n                      <th>Name</th>\n                      <th>Type</th>\n                      <th>Optional</th>\n                      <th>Description</th>\n                    </tr>\n                  </thead>\n                  <tbody>\n                    <tr>\n                      <td>\n                        <p>deleteLocalModels</p>\n                      </td>\n                      <td>\n                        <p>boolean</p>\n                      </td>\n                      <td>\n                        <p>Yes</p>\n                      </td>\n                      <td>\n                        <p>If true, after an unsubscription, it will completely remove a channel from the channel collection making it seem like the current user have never interacted with it. Otherwise it will only remove a channel from the list of channels the current user is subscribed to and will set the membership type for that channel to GUEST</p>\n                        <p>Defaults to <code>false</code>.</p>\n                      </td>\n                    </tr>\n                  </tbody>\n                </table>\n              </section>\n              <dl class=\"dl-compact\">\n              </dl>\n            </section>\n          </section>\n        </div>\n      </div>\n      <nav id=\"jsdoc-toc-nav\" role=\"navigation\"></nav>\n    </div>\n  </div>\n  <footer id=\"jsdoc-footer\" class=\"jsdoc-footer\">\n    <div id=\"jsdoc-footer-container\">\n      <p>\n        Generated by <a href=\"https://github.com/jsdoc3/jsdoc\">JSDoc</a> 3.6.11 on January 30, 2026.\n      </p>\n    </div>\n  </footer>\n  <script src=\"scripts/jquery.min.js\"></script>\n  <script src=\"scripts/tree.jquery.js\"></script>\n  <script src=\"scripts/prettify.js\"></script>\n  <script src=\"scripts/jsdoc-toc.js\"></script>\n  <script src=\"scripts/linenumber.js\"></script>\n  <script src=\"scripts/scrollanchor.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "docs/index.html",
    "content": "<!doctype html>\n<html>\n        <head>\n                <meta name=\"generator\" content=\"JSDoc 3.6.11\">\n                <meta charset=\"utf-8\">\n        <title>whatsapp-web.js 1.34.6 &raquo; Home</title>\n                <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Karla:400,400i,700,700i\" type=\"text/css\">\n                <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Noto+Serif:400,400i,700,700i\" type=\"text/css\">\n                <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Inconsolata:500\" type=\"text/css\">\n                <link href=\"css/baseline.css\" rel=\"stylesheet\">\n        </head>\n        <body onload=\"prettyPrint()\">\n                <nav id=\"jsdoc-navbar\" role=\"navigation\" class=\"jsdoc-navbar\">\n    <div id=\"jsdoc-navbar-container\">\n        <div id=\"jsdoc-navbar-content\">\n            <a href=\"index.html\" class=\"jsdoc-navbar-package-name\">whatsapp-web.<wbr>js 1.<wbr>34.<wbr>6</a>\n        </div>\n    </div>\n</nav>\n\n                <div id=\"jsdoc-body-container\">\n                        <div id=\"jsdoc-content\">\n                                <div id=\"jsdoc-content-container\">\n                                        <div id=\"jsdoc-banner\" role=\"banner\">\n                                        </div>\n                                        <div id=\"jsdoc-main\" role=\"main\">\n                <header class=\"page-header\">\n        <h1>\n            whatsapp-web.js 1.34.6\n        </h1>\n    </header>\n\n                <article><div align=\"center\">\n    <br />\n    <p>\n        <a href=\"https://wwebjs.dev\"><img src=\"https://github.com/wwebjs/assets/blob/main/Collection/GitHub/wwebjs.png?raw=true\" title=\"whatsapp-web.js\" alt=\"WWebJS Website\" width=\"500\" /></a>\n    </p>\n    <br />\n    <p>\n\t\t<a href=\"https://www.npmjs.com/package/whatsapp-web.js\"><img src=\"https://img.shields.io/npm/v/whatsapp-web.js.svg\" alt=\"npm\" /></a>\n        <a href=\"https://depfu.com/github/pedroslopez/whatsapp-web.js?project_id=9765\"><img src=\"https://badges.depfu.com/badges/4a65a0de96ece65fdf39e294e0c8dcba/overview.svg\" alt=\"Depfu\" /></a>\n        <img src=\"https://img.shields.io/badge/WhatsApp_Web-2.3000.1017054665-brightgreen.svg\" alt=\"WhatsApp_Web 2.2346.52\" />\n        <a href=\"https://discord.gg/H7DqQs4\"><img src=\"https://img.shields.io/discord/698610475432411196.svg?logo=discord\" alt=\"Discord server\" /></a>\n\t</p>\n    <br />\n</div>\n<h2>About</h2>\n<p><strong>A WhatsApp API client that operates via the WhatsApp Web browser.</strong></p>\n<p>The library launches the WhatsApp Web browser app via Puppeteer, accessing its internal functions and creating a managed instance to reduce the risk of being blocked. This gives the API client nearly all WhatsApp Web features for dynamic use in a Node.js application.</p>\n<blockquote>\n<p>[!IMPORTANT]\n<strong>It is not guaranteed you will not be blocked by using this method. WhatsApp does not allow bots or unofficial clients on their platform, so this shouldn't be considered totally safe.</strong></p>\n</blockquote>\n<h2>Links</h2>\n<ul>\n<li><a href=\"https://github.com/pedroslopez/whatsapp-web.js\">GitHub</a></li>\n<li><a href=\"https://guide.wwebjs.dev/guide\">Guide</a> (<a href=\"https://github.com/wwebjs/wwebjs.dev/tree/main\">source</a>)</li>\n<li><a href=\"https://docs.wwebjs.dev/\">Documentation</a> (<a href=\"https://github.com/pedroslopez/whatsapp-web.js/tree/main/docs\">source</a>)</li>\n<li><a href=\"https://discord.gg/H7DqQs4\">Discord Server</a></li>\n<li><a href=\"https://npmjs.org/package/whatsapp-web.js\">npm</a></li>\n</ul>\n<h2>Installation</h2>\n<p>The module is available on <a href=\"https://npmjs.org/package/whatsapp-web.js\">npm</a> via <code>npm i whatsapp-web.js</code>!</p>\n<blockquote>\n<p>[!NOTE]\n<strong>Node <code>v18</code> or higher, is required.</strong><br>\nSee the <a href=\"https://guide.wwebjs.dev/guide\">Guide</a> for quick upgrade instructions.</p>\n</blockquote>\n<h2>Example usage</h2>\n<pre class=\"prettyprint source lang-js\"><code>const { Client } = require('whatsapp-web.js');\n\nconst client = new Client();\n\nclient.on('qr', (qr) => {\n    // Generate and scan this code with your phone\n    console.log('QR RECEIVED', qr);\n});\n\nclient.on('ready', () => {\n    console.log('Client is ready!');\n});\n\nclient.on('message', msg => {\n    if (msg.body == '!ping') {\n        msg.reply('pong');\n    }\n});\n\nclient.initialize();\n</code></pre>\n<p>Take a look at <a href=\"https://github.com/pedroslopez/whatsapp-web.js/blob/master/example.js\">example.js</a> for another examples with additional use cases.<br>\nFor further details on saving and restoring sessions, explore the provided <a href=\"https://wwebjs.dev/guide/creating-your-bot/authentication.html\">Authentication Strategies</a>.</p>\n<h2>Supported features</h2>\n<table>\n<thead>\n<tr>\n<th>Feature</th>\n<th>Status</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Multi Device</td>\n<td>✅</td>\n</tr>\n<tr>\n<td>Send messages</td>\n<td>✅</td>\n</tr>\n<tr>\n<td>Receive messages</td>\n<td>✅</td>\n</tr>\n<tr>\n<td>Send media (images/audio/documents)</td>\n<td>✅</td>\n</tr>\n<tr>\n<td>Send media (video)</td>\n<td>✅ <a href=\"https://wwebjs.dev/guide/creating-your-bot/handling-attachments.html#caveat-for-sending-videos-and-gifs\">(requires Google Chrome)</a></td>\n</tr>\n<tr>\n<td>Send stickers</td>\n<td>✅</td>\n</tr>\n<tr>\n<td>Receive media (images/audio/video/documents)</td>\n<td>✅</td>\n</tr>\n<tr>\n<td>Send contact cards</td>\n<td>✅</td>\n</tr>\n<tr>\n<td>Send location</td>\n<td>✅</td>\n</tr>\n<tr>\n<td>Send buttons</td>\n<td>❌  <a href=\"https://www.youtube.com/watch?v=hv1R1rLeVVE\">(DEPRECATED)</a></td>\n</tr>\n<tr>\n<td>Send lists</td>\n<td>❌  <a href=\"https://www.youtube.com/watch?v=hv1R1rLeVVE\">(DEPRECATED)</a></td>\n</tr>\n<tr>\n<td>Receive location</td>\n<td>✅</td>\n</tr>\n<tr>\n<td>Message replies</td>\n<td>✅</td>\n</tr>\n<tr>\n<td>Join groups by invite</td>\n<td>✅</td>\n</tr>\n<tr>\n<td>Get invite for group</td>\n<td>✅</td>\n</tr>\n<tr>\n<td>Modify group info (subject, description)</td>\n<td>✅</td>\n</tr>\n<tr>\n<td>Modify group settings (send messages, edit info)</td>\n<td>✅</td>\n</tr>\n<tr>\n<td>Add group participants</td>\n<td>✅</td>\n</tr>\n<tr>\n<td>Kick group participants</td>\n<td>✅</td>\n</tr>\n<tr>\n<td>Promote/demote group participants</td>\n<td>✅</td>\n</tr>\n<tr>\n<td>Mention users</td>\n<td>✅</td>\n</tr>\n<tr>\n<td>Mention groups</td>\n<td>✅</td>\n</tr>\n<tr>\n<td>Mute/unmute chats</td>\n<td>✅</td>\n</tr>\n<tr>\n<td>Block/unblock contacts</td>\n<td>✅</td>\n</tr>\n<tr>\n<td>Get contact info</td>\n<td>✅</td>\n</tr>\n<tr>\n<td>Get profile pictures</td>\n<td>✅</td>\n</tr>\n<tr>\n<td>Set user status message</td>\n<td>✅</td>\n</tr>\n<tr>\n<td>React to messages</td>\n<td>✅</td>\n</tr>\n<tr>\n<td>Create polls</td>\n<td>✅</td>\n</tr>\n<tr>\n<td>Channels</td>\n<td>✅</td>\n</tr>\n<tr>\n<td>Vote in polls</td>\n<td>🔜</td>\n</tr>\n<tr>\n<td>Communities</td>\n<td>🔜</td>\n</tr>\n</tbody>\n</table>\n<p>Something missing? Make an issue and let us know!</p>\n<h2>Contributing</h2>\n<p>Feel free to open pull requests; we welcome contributions! However, for significant changes, it's best to open an issue beforehand. Make sure to review our <a href=\"https://github.com/pedroslopez/whatsapp-web.js/blob/main/CODE_OF_CONDUCT.md\">contribution guidelines</a> before creating a pull request. Before creating your own issue or pull request, always check to see if one already exists!</p>\n<h2>Supporting the project</h2>\n<p>You can support the maintainer of this project through the links below</p>\n<ul>\n<li><a href=\"https://github.com/sponsors/pedroslopez\">Support via GitHub Sponsors</a></li>\n<li><a href=\"https://www.paypal.me/psla/\">Support via PayPal</a></li>\n<li><a href=\"https://m.do.co/c/73f906a36ed4\">Sign up for DigitalOcean</a> and get $200 in credit when you sign up (Referral)</li>\n</ul>\n<h2>Disclaimer</h2>\n<p>This project is not affiliated, associated, authorized, endorsed by, or in any way officially connected with WhatsApp or any of its subsidiaries or its affiliates. The official WhatsApp website can be found at <a href=\"https://whatsapp.com\">whatsapp.com</a>. &quot;WhatsApp&quot; as well as related names, marks, emblems and images are registered trademarks of their respective owners. Also it is not guaranteed you will not be blocked by using this method. WhatsApp does not allow bots or unofficial clients on their platform, so this shouldn't be considered totally safe.</p>\n<h2>License</h2>\n<p>Copyright 2019 Pedro S Lopez</p>\n<p>Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);<br>\nyou may not use this project except in compliance with the License.<br>\nYou may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0.</p>\n<p>Unless required by applicable law or agreed to in writing, software<br>\ndistributed under the License is distributed on an &quot;AS IS&quot; BASIS,<br>\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.<br>\nSee the License for the specific language governing permissions and<br>\nlimitations under the License.</p></article>\n\n            <div class=\"symbol-index\">\n        <section>\n            <div class=\"symbol-index-content\">\n                <h2 id=\"Base\">Base</h2>\n                <div class=\"symbol-index-section\">\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n            <dt class=\"symbol-index-name\">\n                <a href=\"Base.html\" class=\"!symbol-index-name\">Base()</a>\n            </dt>\n            <dd>\n            </dd>\n    </dl>\n</div>\n\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n    </dl>\n</div>\n\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n    </dl>\n</div>\n\n                </div>\n            </div>\n        </section>\n        <section>\n            <div class=\"symbol-index-content\">\n                <h2 id=\"BaseAuthStrategy\">BaseAuthStrategy</h2>\n                <div class=\"symbol-index-section\">\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n            <dt class=\"symbol-index-name\">\n                <a href=\"BaseAuthStrategy.html\" class=\"!symbol-index-name\">BaseAuthStrategy()</a>\n            </dt>\n            <dd>\n            </dd>\n    </dl>\n</div>\n\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n    </dl>\n</div>\n\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n    </dl>\n</div>\n\n                </div>\n            </div>\n        </section>\n        <section>\n            <div class=\"symbol-index-content\">\n                <h2 id=\"Broadcast\">Broadcast</h2>\n                <div class=\"symbol-index-section\">\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n            <dt class=\"symbol-index-name\">\n                <a href=\"Broadcast.html\" class=\"!symbol-index-name\">Broadcast()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Broadcast.html#getChat\" class=\"!symbol-index-name\">Broadcast#<wbr>getChat()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Broadcast.html#getContact\" class=\"!symbol-index-name\">Broadcast#<wbr>getContact()</a>\n            </dt>\n            <dd>\n            </dd>\n    </dl>\n</div>\n\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n            <dt class=\"symbol-index-name\">\n                <a href=\"Broadcast.html#id\" class=\"!symbol-index-name\">Broadcast#<wbr>id</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Broadcast.html#msgs\" class=\"!symbol-index-name\">Broadcast#<wbr>msgs</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Broadcast.html#timestamp\" class=\"!symbol-index-name\">Broadcast#<wbr>timestamp</a>\n            </dt>\n            <dd>\n            </dd>\n    </dl>\n</div>\n\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n            <dt class=\"symbol-index-name\">\n                <a href=\"Broadcast.html#totalCount\" class=\"!symbol-index-name\">Broadcast#<wbr>totalCount</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Broadcast.html#unreadCount\" class=\"!symbol-index-name\">Broadcast#<wbr>unreadCount</a>\n            </dt>\n            <dd>\n            </dd>\n    </dl>\n</div>\n\n                </div>\n            </div>\n        </section>\n        <section>\n            <div class=\"symbol-index-content\">\n                <h2 id=\"BusinessContact\">BusinessContact</h2>\n                <div class=\"symbol-index-section\">\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n            <dt class=\"symbol-index-name\">\n                <a href=\"BusinessContact.html\" class=\"!symbol-index-name\">BusinessContact()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"BusinessContact.html#block\" class=\"!symbol-index-name\">BusinessContact#<wbr>block()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"BusinessContact.html#businessProfile\" class=\"!symbol-index-name\">BusinessContact#<wbr>businessProfile</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"BusinessContact.html#getAbout\" class=\"!symbol-index-name\">BusinessContact#<wbr>getAbout()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"BusinessContact.html#getBroadcast\" class=\"!symbol-index-name\">BusinessContact#<wbr>getBroadcast()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"BusinessContact.html#getChat\" class=\"!symbol-index-name\">BusinessContact#<wbr>getChat()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"BusinessContact.html#getCommonGroups\" class=\"!symbol-index-name\">BusinessContact#<wbr>getCommonGroups()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"BusinessContact.html#getCountryCode\" class=\"!symbol-index-name\">BusinessContact#<wbr>getCountryCode()</a>\n            </dt>\n            <dd>\n            </dd>\n    </dl>\n</div>\n\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n            <dt class=\"symbol-index-name\">\n                <a href=\"BusinessContact.html#getFormattedNumber\" class=\"!symbol-index-name\">BusinessContact#<wbr>getFormattedNumber()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"BusinessContact.html#getProfilePicUrl\" class=\"!symbol-index-name\">BusinessContact#<wbr>getProfilePicUrl()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"BusinessContact.html#id\" class=\"!symbol-index-name\">BusinessContact#<wbr>id</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"BusinessContact.html#isBlocked\" class=\"!symbol-index-name\">BusinessContact#<wbr>isBlocked</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"BusinessContact.html#isBusiness\" class=\"!symbol-index-name\">BusinessContact#<wbr>isBusiness</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"BusinessContact.html#isEnterprise\" class=\"!symbol-index-name\">BusinessContact#<wbr>isEnterprise</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"BusinessContact.html#isGroup\" class=\"!symbol-index-name\">BusinessContact#<wbr>isGroup</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"BusinessContact.html#isMe\" class=\"!symbol-index-name\">BusinessContact#<wbr>isMe</a>\n            </dt>\n            <dd>\n            </dd>\n    </dl>\n</div>\n\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n            <dt class=\"symbol-index-name\">\n                <a href=\"BusinessContact.html#isMyContact\" class=\"!symbol-index-name\">BusinessContact#<wbr>isMyContact</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"BusinessContact.html#isUser\" class=\"!symbol-index-name\">BusinessContact#<wbr>isUser</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"BusinessContact.html#isWAContact\" class=\"!symbol-index-name\">BusinessContact#<wbr>isWAContact</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"BusinessContact.html#name\" class=\"!symbol-index-name\">BusinessContact#<wbr>name</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"BusinessContact.html#number\" class=\"!symbol-index-name\">BusinessContact#<wbr>number</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"BusinessContact.html#pushname\" class=\"!symbol-index-name\">BusinessContact#<wbr>pushname</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"BusinessContact.html#shortName\" class=\"!symbol-index-name\">BusinessContact#<wbr>shortName</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"BusinessContact.html#unblock\" class=\"!symbol-index-name\">BusinessContact#<wbr>unblock()</a>\n            </dt>\n            <dd>\n            </dd>\n    </dl>\n</div>\n\n                </div>\n            </div>\n        </section>\n        <section>\n            <div class=\"symbol-index-content\">\n                <h2 id=\"Buttons\">Buttons</h2>\n                <div class=\"symbol-index-section\">\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n            <dt class=\"symbol-index-name\">\n                <a href=\"Buttons.html\" class=\"!symbol-index-name\">Buttons(body, buttons, title, footer)</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Buttons.html#_format\" class=\"!symbol-index-name\">Buttons#<wbr>_format(buttons)</a>\n            </dt>\n            <dd>\n            </dd>\n    </dl>\n</div>\n\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n            <dt class=\"symbol-index-name\">\n                <a href=\"Buttons.html#body\" class=\"!symbol-index-name\">Buttons#<wbr>body</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Buttons.html#buttons\" class=\"!symbol-index-name\">Buttons#<wbr>buttons</a>\n            </dt>\n            <dd>\n            </dd>\n    </dl>\n</div>\n\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n            <dt class=\"symbol-index-name\">\n                <a href=\"Buttons.html#footer\" class=\"!symbol-index-name\">Buttons#<wbr>footer</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Buttons.html#title\" class=\"!symbol-index-name\">Buttons#<wbr>title</a>\n            </dt>\n            <dd>\n            </dd>\n    </dl>\n</div>\n\n                </div>\n            </div>\n        </section>\n        <section>\n            <div class=\"symbol-index-content\">\n                <h2 id=\"Call\">Call</h2>\n                <div class=\"symbol-index-section\">\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n            <dt class=\"symbol-index-name\">\n                <a href=\"Call.html\" class=\"!symbol-index-name\">Call()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Call.html#canHandleLocally\" class=\"!symbol-index-name\">Call#<wbr>canHandleLocally</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Call.html#from\" class=\"!symbol-index-name\">Call#<wbr>from</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Call.html#fromMe\" class=\"!symbol-index-name\">Call#<wbr>fromMe</a>\n            </dt>\n            <dd>\n            </dd>\n    </dl>\n</div>\n\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n            <dt class=\"symbol-index-name\">\n                <a href=\"Call.html#id\" class=\"!symbol-index-name\">Call#<wbr>id</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Call.html#isGroup\" class=\"!symbol-index-name\">Call#<wbr>isGroup</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Call.html#isVideo\" class=\"!symbol-index-name\">Call#<wbr>isVideo</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Call.html#participants\" class=\"!symbol-index-name\">Call#<wbr>participants</a>\n            </dt>\n            <dd>\n            </dd>\n    </dl>\n</div>\n\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n            <dt class=\"symbol-index-name\">\n                <a href=\"Call.html#reject\" class=\"!symbol-index-name\">Call#<wbr>reject()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Call.html#timestamp\" class=\"!symbol-index-name\">Call#<wbr>timestamp</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Call.html#webClientShouldHandle\" class=\"!symbol-index-name\">Call#<wbr>webClientShouldHandle</a>\n            </dt>\n            <dd>\n            </dd>\n    </dl>\n</div>\n\n                </div>\n            </div>\n        </section>\n        <section>\n            <div class=\"symbol-index-content\">\n                <h2 id=\"Channel\">Channel</h2>\n                <div class=\"symbol-index-section\">\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n            <dt class=\"symbol-index-name\">\n                <a href=\"Channel.html\" class=\"!symbol-index-name\">Channel()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Channel.html#_muteUnmuteChannel\" class=\"!symbol-index-name\">Channel#<wbr>_muteUnmuteChannel(action)</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Channel.html#_setChannelMetadata\" class=\"!symbol-index-name\">Channel#<wbr>_setChannelMetadata(value, property)</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Channel.html#acceptChannelAdminInvite\" class=\"!symbol-index-name\">Channel#<wbr>acceptChannelAdminInvite()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Channel.html#deleteChannel\" class=\"!symbol-index-name\">Channel#<wbr>deleteChannel()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Channel.html#demoteChannelAdmin\" class=\"!symbol-index-name\">Channel#<wbr>demoteChannelAdmin(userId)</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Channel.html#description\" class=\"!symbol-index-name\">Channel#<wbr>description</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Channel.html#fetchMessages\" class=\"!symbol-index-name\">Channel#<wbr>fetchMessages(searchOptions)</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Channel.html#getSubscribers\" class=\"!symbol-index-name\">Channel#<wbr>getSubscribers(limit)</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Channel.html#id\" class=\"!symbol-index-name\">Channel#<wbr>id</a>\n            </dt>\n            <dd>\n            </dd>\n    </dl>\n</div>\n\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n            <dt class=\"symbol-index-name\">\n                <a href=\"Channel.html#isChannel\" class=\"!symbol-index-name\">Channel#<wbr>isChannel</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Channel.html#isGroup\" class=\"!symbol-index-name\">Channel#<wbr>isGroup</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Channel.html#isMuted\" class=\"!symbol-index-name\">Channel#<wbr>isMuted</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Channel.html#isReadOnly\" class=\"!symbol-index-name\">Channel#<wbr>isReadOnly</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Channel.html#lastMessage\" class=\"!symbol-index-name\">Channel#<wbr>lastMessage</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Channel.html#mute\" class=\"!symbol-index-name\">Channel#<wbr>mute()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Channel.html#muteExpiration\" class=\"!symbol-index-name\">Channel#<wbr>muteExpiration</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Channel.html#name\" class=\"!symbol-index-name\">Channel#<wbr>name</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Channel.html#revokeChannelAdminInvite\" class=\"!symbol-index-name\">Channel#<wbr>revokeChannelAdminInvite(userId)</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Channel.html#sendChannelAdminInvite\" class=\"!symbol-index-name\">Channel#<wbr>sendChannelAdminInvite(chatId, options)</a>\n            </dt>\n            <dd>\n            </dd>\n    </dl>\n</div>\n\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n            <dt class=\"symbol-index-name\">\n                <a href=\"Channel.html#sendMessage\" class=\"!symbol-index-name\">Channel#<wbr>sendMessage(content, options)</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Channel.html#sendSeen\" class=\"!symbol-index-name\">Channel#<wbr>sendSeen()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Channel.html#setDescription\" class=\"!symbol-index-name\">Channel#<wbr>setDescription(newDescription)</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Channel.html#setProfilePicture\" class=\"!symbol-index-name\">Channel#<wbr>setProfilePicture(newProfilePicture)</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Channel.html#setReactionSetting\" class=\"!symbol-index-name\">Channel#<wbr>setReactionSetting(reactionCode)</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Channel.html#setSubject\" class=\"!symbol-index-name\">Channel#<wbr>setSubject(newSubject)</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Channel.html#timestamp\" class=\"!symbol-index-name\">Channel#<wbr>timestamp</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Channel.html#transferChannelOwnership\" class=\"!symbol-index-name\">Channel#<wbr>transferChannelOwnership(newOwnerId, options)</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Channel.html#unmute\" class=\"!symbol-index-name\">Channel#<wbr>unmute()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Channel.html#unreadCount\" class=\"!symbol-index-name\">Channel#<wbr>unreadCount</a>\n            </dt>\n            <dd>\n            </dd>\n    </dl>\n</div>\n\n                </div>\n            </div>\n        </section>\n        <section>\n            <div class=\"symbol-index-content\">\n                <h2 id=\"Chat\">Chat</h2>\n                <div class=\"symbol-index-section\">\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n            <dt class=\"symbol-index-name\">\n                <a href=\"Chat.html\" class=\"!symbol-index-name\">Chat()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Chat.html#addOrEditCustomerNote\" class=\"!symbol-index-name\">Chat#<wbr>addOrEditCustomerNote(note)</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Chat.html#archive\" class=\"!symbol-index-name\">Chat#<wbr>archive()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Chat.html#archived\" class=\"!symbol-index-name\">Chat#<wbr>archived</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Chat.html#changeLabels\" class=\"!symbol-index-name\">Chat#<wbr>changeLabels(labelIds)</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Chat.html#clearMessages\" class=\"!symbol-index-name\">Chat#<wbr>clearMessages()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Chat.html#clearState\" class=\"!symbol-index-name\">Chat#<wbr>clearState()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Chat.html#delete\" class=\"!symbol-index-name\">Chat#<wbr>delete()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Chat.html#fetchMessages\" class=\"!symbol-index-name\">Chat#<wbr>fetchMessages(searchOptions)</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Chat.html#getContact\" class=\"!symbol-index-name\">Chat#<wbr>getContact()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Chat.html#getCustomerNote\" class=\"!symbol-index-name\">Chat#<wbr>getCustomerNote()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Chat.html#getLabels\" class=\"!symbol-index-name\">Chat#<wbr>getLabels()</a>\n            </dt>\n            <dd>\n            </dd>\n    </dl>\n</div>\n\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n            <dt class=\"symbol-index-name\">\n                <a href=\"Chat.html#getPinnedMessages\" class=\"!symbol-index-name\">Chat#<wbr>getPinnedMessages()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Chat.html#id\" class=\"!symbol-index-name\">Chat#<wbr>id</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Chat.html#isGroup\" class=\"!symbol-index-name\">Chat#<wbr>isGroup</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Chat.html#isMuted\" class=\"!symbol-index-name\">Chat#<wbr>isMuted</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Chat.html#isReadOnly\" class=\"!symbol-index-name\">Chat#<wbr>isReadOnly</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Chat.html#lastMessage\" class=\"!symbol-index-name\">Chat#<wbr>lastMessage</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Chat.html#markUnread\" class=\"!symbol-index-name\">Chat#<wbr>markUnread()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Chat.html#mute\" class=\"!symbol-index-name\">Chat#<wbr>mute(unmuteDate)</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Chat.html#muteExpiration\" class=\"!symbol-index-name\">Chat#<wbr>muteExpiration</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Chat.html#name\" class=\"!symbol-index-name\">Chat#<wbr>name</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Chat.html#pin\" class=\"!symbol-index-name\">Chat#<wbr>pin()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Chat.html#pinned\" class=\"!symbol-index-name\">Chat#<wbr>pinned</a>\n            </dt>\n            <dd>\n            </dd>\n    </dl>\n</div>\n\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n            <dt class=\"symbol-index-name\">\n                <a href=\"Chat.html#sendMessage\" class=\"!symbol-index-name\">Chat#<wbr>sendMessage(content[, options])</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Chat.html#sendSeen\" class=\"!symbol-index-name\">Chat#<wbr>sendSeen()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Chat.html#sendStateRecording\" class=\"!symbol-index-name\">Chat#<wbr>sendStateRecording()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Chat.html#sendStateTyping\" class=\"!symbol-index-name\">Chat#<wbr>sendStateTyping()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Chat.html#syncHistory\" class=\"!symbol-index-name\">Chat#<wbr>syncHistory()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Chat.html#timestamp\" class=\"!symbol-index-name\">Chat#<wbr>timestamp</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Chat.html#unarchive\" class=\"!symbol-index-name\">Chat#<wbr>unarchive()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Chat.html#unmute\" class=\"!symbol-index-name\">Chat#<wbr>unmute()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Chat.html#unpin\" class=\"!symbol-index-name\">Chat#<wbr>unpin()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Chat.html#unreadCount\" class=\"!symbol-index-name\">Chat#<wbr>unreadCount</a>\n            </dt>\n            <dd>\n            </dd>\n    </dl>\n</div>\n\n                </div>\n            </div>\n        </section>\n        <section>\n            <div class=\"symbol-index-content\">\n                <h2 id=\"ChatTypes\">ChatTypes</h2>\n                <div class=\"symbol-index-section\">\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n            <dt class=\"symbol-index-name\">\n                <a href=\"global.html#ChatTypes#.GROUP\" class=\"!symbol-index-name\">ChatTypes.<wbr>GROUP</a>\n            </dt>\n            <dd>\n            </dd>\n    </dl>\n</div>\n\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n            <dt class=\"symbol-index-name\">\n                <a href=\"global.html#ChatTypes#.SOLO\" class=\"!symbol-index-name\">ChatTypes.<wbr>SOLO</a>\n            </dt>\n            <dd>\n            </dd>\n    </dl>\n</div>\n\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n            <dt class=\"symbol-index-name\">\n                <a href=\"global.html#ChatTypes#.UNKNOWN\" class=\"!symbol-index-name\">ChatTypes.<wbr>UNKNOWN</a>\n            </dt>\n            <dd>\n            </dd>\n    </dl>\n</div>\n\n                </div>\n            </div>\n        </section>\n        <section>\n            <div class=\"symbol-index-content\">\n                <h2 id=\"Client\">Client</h2>\n                <div class=\"symbol-index-section\">\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n            <dt class=\"symbol-index-name\">\n                <a href=\"Client.html\" class=\"!symbol-index-name\">Client(options)</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Client.html#_muteUnmuteChat\" class=\"!symbol-index-name\">Client#<wbr>_muteUnmuteChat(chatId, action, unmuteDateTs)</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Client.html#acceptChannelAdminInvite\" class=\"!symbol-index-name\">Client#<wbr>acceptChannelAdminInvite(channelId)</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Client.html#acceptGroupV4Invite\" class=\"!symbol-index-name\">Client#<wbr>acceptGroupV4Invite(inviteInfo)</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Client.html#acceptInvite\" class=\"!symbol-index-name\">Client#<wbr>acceptInvite(inviteCode)</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Client.html#addOrEditCustomerNote\" class=\"!symbol-index-name\">Client#<wbr>addOrEditCustomerNote(userId, note)</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Client.html#addOrRemoveLabels\" class=\"!symbol-index-name\">Client#<wbr>addOrRemoveLabels(labelIds, chatIds)</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Client.html#approveGroupMembershipRequests\" class=\"!symbol-index-name\">Client#<wbr>approveGroupMembershipRequests(groupId, options)</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Client.html#archiveChat\" class=\"!symbol-index-name\">Client#<wbr>archiveChat()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Client.html#attachEventListeners\" class=\"!symbol-index-name\">Client#<wbr>attachEventListeners()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Client.html#createCallLink\" class=\"!symbol-index-name\">Client#<wbr>createCallLink(startTime, callType)</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Client.html#createChannel\" class=\"!symbol-index-name\">Client#<wbr>createChannel(title, options)</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Client.html#createGroup\" class=\"!symbol-index-name\">Client#<wbr>createGroup(title, participants, options)</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Client.html#deleteAddressbookContact\" class=\"!symbol-index-name\">Client#<wbr>deleteAddressbookContact(phoneNumber)</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Client.html#deleteChannel\" class=\"!symbol-index-name\">Client#<wbr>deleteChannel(channelId)</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Client.html#deleteProfilePicture\" class=\"!symbol-index-name\">Client#<wbr>deleteProfilePicture()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Client.html#demoteChannelAdmin\" class=\"!symbol-index-name\">Client#<wbr>demoteChannelAdmin(channelId, userId)</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Client.html#destroy\" class=\"!symbol-index-name\">Client#<wbr>destroy()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Client.html#event:auth_failure\" class=\"!symbol-index-name\">Client#<wbr>event:auth_failure</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Client.html#event:authenticated\" class=\"!symbol-index-name\">Client#<wbr>event:authenticated</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Client.html#event:change_battery\" class=\"!symbol-index-name\">Client#<wbr>event:change_battery</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Client.html#event:change_state\" class=\"!symbol-index-name\">Client#<wbr>event:change_state</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Client.html#event:chat_archived\" class=\"!symbol-index-name\">Client#<wbr>event:chat_archived</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Client.html#event:chat_removed\" class=\"!symbol-index-name\">Client#<wbr>event:chat_removed</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Client.html#event:code\" class=\"!symbol-index-name\">Client#<wbr>event:code</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Client.html#event:contact_changed\" class=\"!symbol-index-name\">Client#<wbr>event:contact_changed</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Client.html#event:disconnected\" class=\"!symbol-index-name\">Client#<wbr>event:disconnected</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Client.html#event:group_admin_changed\" class=\"!symbol-index-name\">Client#<wbr>event:group_admin_changed</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Client.html#event:group_join\" class=\"!symbol-index-name\">Client#<wbr>event:group_join</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Client.html#event:group_leave\" class=\"!symbol-index-name\">Client#<wbr>event:group_leave</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Client.html#event:group_membership_request\" class=\"!symbol-index-name\">Client#<wbr>event:group_membership_request</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Client.html#event:group_update\" class=\"!symbol-index-name\">Client#<wbr>event:group_update</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Client.html#event:incoming_call\" class=\"!symbol-index-name\">Client#<wbr>event:incoming_call</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Client.html#event:media_uploaded\" class=\"!symbol-index-name\">Client#<wbr>event:media_uploaded</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Client.html#event:message\" class=\"!symbol-index-name\">Client#<wbr>event:message</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Client.html#event:message_ack\" class=\"!symbol-index-name\">Client#<wbr>event:message_ack</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Client.html#event:message_ciphertext\" class=\"!symbol-index-name\">Client#<wbr>event:message_ciphertext</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Client.html#event:message_create\" class=\"!symbol-index-name\">Client#<wbr>event:message_create</a>\n            </dt>\n            <dd>\n            </dd>\n    </dl>\n</div>\n\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n            <dt class=\"symbol-index-name\">\n                <a href=\"Client.html#event:message_edit\" class=\"!symbol-index-name\">Client#<wbr>event:message_edit</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Client.html#event:message_reaction\" class=\"!symbol-index-name\">Client#<wbr>event:message_reaction</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Client.html#event:message_revoke_everyone\" class=\"!symbol-index-name\">Client#<wbr>event:message_revoke_everyone</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Client.html#event:message_revoke_me\" class=\"!symbol-index-name\">Client#<wbr>event:message_revoke_me</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Client.html#event:qr\" class=\"!symbol-index-name\">Client#<wbr>event:qr</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Client.html#event:ready\" class=\"!symbol-index-name\">Client#<wbr>event:ready</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Client.html#event:vote_update\" class=\"!symbol-index-name\">Client#<wbr>event:vote_update</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Client.html#getBlockedContacts\" class=\"!symbol-index-name\">Client#<wbr>getBlockedContacts()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Client.html#getBroadcastById\" class=\"!symbol-index-name\">Client#<wbr>getBroadcastById(contactId)</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Client.html#getBroadcasts\" class=\"!symbol-index-name\">Client#<wbr>getBroadcasts()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Client.html#getChannelByInviteCode\" class=\"!symbol-index-name\">Client#<wbr>getChannelByInviteCode(inviteCode)</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Client.html#getChannels\" class=\"!symbol-index-name\">Client#<wbr>getChannels()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Client.html#getChatById\" class=\"!symbol-index-name\">Client#<wbr>getChatById(chatId)</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Client.html#getChatLabels\" class=\"!symbol-index-name\">Client#<wbr>getChatLabels(chatId)</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Client.html#getChats\" class=\"!symbol-index-name\">Client#<wbr>getChats()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Client.html#getChatsByLabelId\" class=\"!symbol-index-name\">Client#<wbr>getChatsByLabelId(labelId)</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Client.html#getCommonGroups\" class=\"!symbol-index-name\">Client#<wbr>getCommonGroups(contactId)</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Client.html#getContactById\" class=\"!symbol-index-name\">Client#<wbr>getContactById(contactId)</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Client.html#getContactDeviceCount\" class=\"!symbol-index-name\">Client#<wbr>getContactDeviceCount(userId)</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Client.html#getContactLidAndPhone\" class=\"!symbol-index-name\">Client#<wbr>getContactLidAndPhone(userIds)</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Client.html#getContacts\" class=\"!symbol-index-name\">Client#<wbr>getContacts()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Client.html#getCountryCode\" class=\"!symbol-index-name\">Client#<wbr>getCountryCode(number)</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Client.html#getCustomerNote\" class=\"!symbol-index-name\">Client#<wbr>getCustomerNote(userId)</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Client.html#getFormattedNumber\" class=\"!symbol-index-name\">Client#<wbr>getFormattedNumber(number)</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Client.html#getGroupMembershipRequests\" class=\"!symbol-index-name\">Client#<wbr>getGroupMembershipRequests(groupId)</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Client.html#getInviteInfo\" class=\"!symbol-index-name\">Client#<wbr>getInviteInfo(inviteCode)</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Client.html#getLabelById\" class=\"!symbol-index-name\">Client#<wbr>getLabelById(labelId)</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Client.html#getLabels\" class=\"!symbol-index-name\">Client#<wbr>getLabels()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Client.html#getMessageById\" class=\"!symbol-index-name\">Client#<wbr>getMessageById(messageId)</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Client.html#getNumberId\" class=\"!symbol-index-name\">Client#<wbr>getNumberId(number)</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Client.html#getPinnedMessages\" class=\"!symbol-index-name\">Client#<wbr>getPinnedMessages(chatId)</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Client.html#getPollVotes\" class=\"!symbol-index-name\">Client#<wbr>getPollVotes(messageId)</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Client.html#getProfilePicUrl\" class=\"!symbol-index-name\">Client#<wbr>getProfilePicUrl(contactId)</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Client.html#getState\" class=\"!symbol-index-name\">Client#<wbr>getState()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Client.html#getWWebVersion\" class=\"!symbol-index-name\">Client#<wbr>getWWebVersion()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Client.html#info\" class=\"!symbol-index-name\">Client#<wbr>info</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Client.html#initialize\" class=\"!symbol-index-name\">Client#<wbr>initialize()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Client.html#inject\" class=\"!symbol-index-name\">Client#<wbr>inject()</a>\n            </dt>\n            <dd>\n            </dd>\n    </dl>\n</div>\n\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n            <dt class=\"symbol-index-name\">\n                <a href=\"Client.html#isRegisteredUser\" class=\"!symbol-index-name\">Client#<wbr>isRegisteredUser(id)</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Client.html#logout\" class=\"!symbol-index-name\">Client#<wbr>logout()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Client.html#markChatUnread\" class=\"!symbol-index-name\">Client#<wbr>markChatUnread(chatId)</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Client.html#muteChat\" class=\"!symbol-index-name\">Client#<wbr>muteChat(chatId, unmuteDate)</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Client.html#pinChat\" class=\"!symbol-index-name\">Client#<wbr>pinChat()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Client.html#pupBrowser\" class=\"!symbol-index-name\">Client#<wbr>pupBrowser</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Client.html#pupPage\" class=\"!symbol-index-name\">Client#<wbr>pupPage</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Client.html#rejectGroupMembershipRequests\" class=\"!symbol-index-name\">Client#<wbr>rejectGroupMembershipRequests(groupId, options)</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Client.html#requestPairingCode\" class=\"!symbol-index-name\">Client#<wbr>requestPairingCode(phoneNumber[, showNotification][, intervalMs])</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Client.html#resetState\" class=\"!symbol-index-name\">Client#<wbr>resetState()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Client.html#revokeChannelAdminInvite\" class=\"!symbol-index-name\">Client#<wbr>revokeChannelAdminInvite(channelId, userId)</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Client.html#revokeStatusMessage\" class=\"!symbol-index-name\">Client#<wbr>revokeStatusMessage(messageId)</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Client.html#saveOrEditAddressbookContact\" class=\"!symbol-index-name\">Client#<wbr>saveOrEditAddressbookContact(phoneNumber, firstName, lastName[, syncToAddressbook])</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Client.html#searchChannels\" class=\"!symbol-index-name\">Client#<wbr>searchChannels(searchOptions)</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Client.html#searchMessages\" class=\"!symbol-index-name\">Client#<wbr>searchMessages(query[, options])</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Client.html#sendChannelAdminInvite\" class=\"!symbol-index-name\">Client#<wbr>sendChannelAdminInvite(chatId, channelId, options)</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Client.html#sendMessage\" class=\"!symbol-index-name\">Client#<wbr>sendMessage(chatId, content[, options])</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Client.html#sendPresenceAvailable\" class=\"!symbol-index-name\">Client#<wbr>sendPresenceAvailable()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Client.html#sendPresenceUnavailable\" class=\"!symbol-index-name\">Client#<wbr>sendPresenceUnavailable()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Client.html#sendResponseToScheduledEvent\" class=\"!symbol-index-name\">Client#<wbr>sendResponseToScheduledEvent(response, eventMessageId)</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Client.html#sendSeen\" class=\"!symbol-index-name\">Client#<wbr>sendSeen(chatId)</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Client.html#setAutoDownloadAudio\" class=\"!symbol-index-name\">Client#<wbr>setAutoDownloadAudio(flag)</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Client.html#setAutoDownloadDocuments\" class=\"!symbol-index-name\">Client#<wbr>setAutoDownloadDocuments(flag)</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Client.html#setAutoDownloadPhotos\" class=\"!symbol-index-name\">Client#<wbr>setAutoDownloadPhotos(flag)</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Client.html#setAutoDownloadVideos\" class=\"!symbol-index-name\">Client#<wbr>setAutoDownloadVideos(flag)</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Client.html#setBackgroundSync\" class=\"!symbol-index-name\">Client#<wbr>setBackgroundSync(flag)</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Client.html#setDisplayName\" class=\"!symbol-index-name\">Client#<wbr>setDisplayName(displayName)</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Client.html#setProfilePicture\" class=\"!symbol-index-name\">Client#<wbr>setProfilePicture(media)</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Client.html#setStatus\" class=\"!symbol-index-name\">Client#<wbr>setStatus(status)</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Client.html#subscribeToChannel\" class=\"!symbol-index-name\">Client#<wbr>subscribeToChannel(channelId)</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Client.html#syncHistory\" class=\"!symbol-index-name\">Client#<wbr>syncHistory(chatId)</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Client.html#transferChannelOwnership\" class=\"!symbol-index-name\">Client#<wbr>transferChannelOwnership(channelId, newOwnerId, options)</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Client.html#unarchiveChat\" class=\"!symbol-index-name\">Client#<wbr>unarchiveChat()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Client.html#unmuteChat\" class=\"!symbol-index-name\">Client#<wbr>unmuteChat(chatId)</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Client.html#unpinChat\" class=\"!symbol-index-name\">Client#<wbr>unpinChat()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Client.html#unsubscribeFromChannel\" class=\"!symbol-index-name\">Client#<wbr>unsubscribeFromChannel(channelId, options)</a>\n            </dt>\n            <dd>\n            </dd>\n    </dl>\n</div>\n\n                </div>\n            </div>\n        </section>\n        <section>\n            <div class=\"symbol-index-content\">\n                <h2 id=\"ClientInfo\">ClientInfo</h2>\n                <div class=\"symbol-index-section\">\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n            <dt class=\"symbol-index-name\">\n                <a href=\"ClientInfo.html\" class=\"!symbol-index-name\">ClientInfo()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"ClientInfo.html#getBatteryStatus\" class=\"!symbol-index-name\">ClientInfo#<wbr>getBatteryStatus()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"ClientInfo.html#me\" class=\"!symbol-index-name\">ClientInfo#<wbr>me</a>\n            </dt>\n            <dd>\n            </dd>\n    </dl>\n</div>\n\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n            <dt class=\"symbol-index-name\">\n                <a href=\"ClientInfo.html#phone\" class=\"!symbol-index-name\">ClientInfo#<wbr>phone</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"ClientInfo.html#platform\" class=\"!symbol-index-name\">ClientInfo#<wbr>platform</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"ClientInfo.html#pushname\" class=\"!symbol-index-name\">ClientInfo#<wbr>pushname</a>\n            </dt>\n            <dd>\n            </dd>\n    </dl>\n</div>\n\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n            <dt class=\"symbol-index-name\">\n                <a href=\"ClientInfo.html#wid\" class=\"!symbol-index-name\">ClientInfo#<wbr>wid</a>\n            </dt>\n            <dd>\n            </dd>\n    </dl>\n</div>\n\n                </div>\n            </div>\n        </section>\n        <section>\n            <div class=\"symbol-index-content\">\n                <h2 id=\"Contact\">Contact</h2>\n                <div class=\"symbol-index-section\">\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n            <dt class=\"symbol-index-name\">\n                <a href=\"Contact.html\" class=\"!symbol-index-name\">Contact()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Contact.html#block\" class=\"!symbol-index-name\">Contact#<wbr>block()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Contact.html#getAbout\" class=\"!symbol-index-name\">Contact#<wbr>getAbout()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Contact.html#getBroadcast\" class=\"!symbol-index-name\">Contact#<wbr>getBroadcast()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Contact.html#getChat\" class=\"!symbol-index-name\">Contact#<wbr>getChat()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Contact.html#getCommonGroups\" class=\"!symbol-index-name\">Contact#<wbr>getCommonGroups()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Contact.html#getCountryCode\" class=\"!symbol-index-name\">Contact#<wbr>getCountryCode()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Contact.html#getFormattedNumber\" class=\"!symbol-index-name\">Contact#<wbr>getFormattedNumber()</a>\n            </dt>\n            <dd>\n            </dd>\n    </dl>\n</div>\n\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n            <dt class=\"symbol-index-name\">\n                <a href=\"Contact.html#getProfilePicUrl\" class=\"!symbol-index-name\">Contact#<wbr>getProfilePicUrl()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Contact.html#id\" class=\"!symbol-index-name\">Contact#<wbr>id</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Contact.html#isBlocked\" class=\"!symbol-index-name\">Contact#<wbr>isBlocked</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Contact.html#isBusiness\" class=\"!symbol-index-name\">Contact#<wbr>isBusiness</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Contact.html#isEnterprise\" class=\"!symbol-index-name\">Contact#<wbr>isEnterprise</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Contact.html#isGroup\" class=\"!symbol-index-name\">Contact#<wbr>isGroup</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Contact.html#isMe\" class=\"!symbol-index-name\">Contact#<wbr>isMe</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Contact.html#isMyContact\" class=\"!symbol-index-name\">Contact#<wbr>isMyContact</a>\n            </dt>\n            <dd>\n            </dd>\n    </dl>\n</div>\n\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n            <dt class=\"symbol-index-name\">\n                <a href=\"Contact.html#isUser\" class=\"!symbol-index-name\">Contact#<wbr>isUser</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Contact.html#isWAContact\" class=\"!symbol-index-name\">Contact#<wbr>isWAContact</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Contact.html#name\" class=\"!symbol-index-name\">Contact#<wbr>name</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Contact.html#number\" class=\"!symbol-index-name\">Contact#<wbr>number</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Contact.html#pushname\" class=\"!symbol-index-name\">Contact#<wbr>pushname</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Contact.html#shortName\" class=\"!symbol-index-name\">Contact#<wbr>shortName</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Contact.html#unblock\" class=\"!symbol-index-name\">Contact#<wbr>unblock()</a>\n            </dt>\n            <dd>\n            </dd>\n    </dl>\n</div>\n\n                </div>\n            </div>\n        </section>\n        <section>\n            <div class=\"symbol-index-content\">\n                <h2 id=\"Events\">Events</h2>\n                <div class=\"symbol-index-section\">\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n            <dt class=\"symbol-index-name\">\n                <a href=\"global.html#Events#.AUTHENTICATED\" class=\"!symbol-index-name\">Events.<wbr>AUTHENTICATED</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"global.html#Events#.AUTHENTICATION_FAILURE\" class=\"!symbol-index-name\">Events.<wbr>AUTHENTICATION_FAILURE</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"global.html#Events#.BATTERY_CHANGED\" class=\"!symbol-index-name\">Events.<wbr>BATTERY_CHANGED</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"global.html#Events#.CHAT_ARCHIVED\" class=\"!symbol-index-name\">Events.<wbr>CHAT_ARCHIVED</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"global.html#Events#.CHAT_REMOVED\" class=\"!symbol-index-name\">Events.<wbr>CHAT_REMOVED</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"global.html#Events#.CODE_RECEIVED\" class=\"!symbol-index-name\">Events.<wbr>CODE_RECEIVED</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"global.html#Events#.CONTACT_CHANGED\" class=\"!symbol-index-name\">Events.<wbr>CONTACT_CHANGED</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"global.html#Events#.DISCONNECTED\" class=\"!symbol-index-name\">Events.<wbr>DISCONNECTED</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"global.html#Events#.GROUP_ADMIN_CHANGED\" class=\"!symbol-index-name\">Events.<wbr>GROUP_ADMIN_CHANGED</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"global.html#Events#.GROUP_JOIN\" class=\"!symbol-index-name\">Events.<wbr>GROUP_JOIN</a>\n            </dt>\n            <dd>\n            </dd>\n    </dl>\n</div>\n\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n            <dt class=\"symbol-index-name\">\n                <a href=\"global.html#Events#.GROUP_LEAVE\" class=\"!symbol-index-name\">Events.<wbr>GROUP_LEAVE</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"global.html#Events#.GROUP_MEMBERSHIP_REQUEST\" class=\"!symbol-index-name\">Events.<wbr>GROUP_MEMBERSHIP_REQUEST</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"global.html#Events#.GROUP_UPDATE\" class=\"!symbol-index-name\">Events.<wbr>GROUP_UPDATE</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"global.html#Events#.INCOMING_CALL\" class=\"!symbol-index-name\">Events.<wbr>INCOMING_CALL</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"global.html#Events#.LOADING_SCREEN\" class=\"!symbol-index-name\">Events.<wbr>LOADING_SCREEN</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"global.html#Events#.MEDIA_UPLOADED\" class=\"!symbol-index-name\">Events.<wbr>MEDIA_UPLOADED</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"global.html#Events#.MESSAGE_ACK\" class=\"!symbol-index-name\">Events.<wbr>MESSAGE_ACK</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"global.html#Events#.MESSAGE_CIPHERTEXT\" class=\"!symbol-index-name\">Events.<wbr>MESSAGE_CIPHERTEXT</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"global.html#Events#.MESSAGE_CREATE\" class=\"!symbol-index-name\">Events.<wbr>MESSAGE_CREATE</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"global.html#Events#.MESSAGE_EDIT\" class=\"!symbol-index-name\">Events.<wbr>MESSAGE_EDIT</a>\n            </dt>\n            <dd>\n            </dd>\n    </dl>\n</div>\n\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n            <dt class=\"symbol-index-name\">\n                <a href=\"global.html#Events#.MESSAGE_REACTION\" class=\"!symbol-index-name\">Events.<wbr>MESSAGE_REACTION</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"global.html#Events#.MESSAGE_RECEIVED\" class=\"!symbol-index-name\">Events.<wbr>MESSAGE_RECEIVED</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"global.html#Events#.MESSAGE_REVOKED_EVERYONE\" class=\"!symbol-index-name\">Events.<wbr>MESSAGE_REVOKED_EVERYONE</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"global.html#Events#.MESSAGE_REVOKED_ME\" class=\"!symbol-index-name\">Events.<wbr>MESSAGE_REVOKED_ME</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"global.html#Events#.QR_RECEIVED\" class=\"!symbol-index-name\">Events.<wbr>QR_RECEIVED</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"global.html#Events#.READY\" class=\"!symbol-index-name\">Events.<wbr>READY</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"global.html#Events#.REMOTE_SESSION_SAVED\" class=\"!symbol-index-name\">Events.<wbr>REMOTE_SESSION_SAVED</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"global.html#Events#.STATE_CHANGED\" class=\"!symbol-index-name\">Events.<wbr>STATE_CHANGED</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"global.html#Events#.UNREAD_COUNT\" class=\"!symbol-index-name\">Events.<wbr>UNREAD_COUNT</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"global.html#Events#.VOTE_UPDATE\" class=\"!symbol-index-name\">Events.<wbr>VOTE_UPDATE</a>\n            </dt>\n            <dd>\n            </dd>\n    </dl>\n</div>\n\n                </div>\n            </div>\n        </section>\n        <section>\n            <div class=\"symbol-index-content\">\n                <h2 id=\"GroupChat\">GroupChat</h2>\n                <div class=\"symbol-index-section\">\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n            <dt class=\"symbol-index-name\">\n                <a href=\"GroupChat.html\" class=\"!symbol-index-name\">GroupChat()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"GroupChat.html#addOrEditCustomerNote\" class=\"!symbol-index-name\">GroupChat#<wbr>addOrEditCustomerNote(note)</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"GroupChat.html#addParticipants\" class=\"!symbol-index-name\">GroupChat#<wbr>addParticipants(participantIds, options)</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"GroupChat.html#approveGroupMembershipRequests\" class=\"!symbol-index-name\">GroupChat#<wbr>approveGroupMembershipRequests(options)</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"GroupChat.html#archive\" class=\"!symbol-index-name\">GroupChat#<wbr>archive()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"GroupChat.html#archived\" class=\"!symbol-index-name\">GroupChat#<wbr>archived</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"GroupChat.html#changeLabels\" class=\"!symbol-index-name\">GroupChat#<wbr>changeLabels(labelIds)</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"GroupChat.html#clearMessages\" class=\"!symbol-index-name\">GroupChat#<wbr>clearMessages()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"GroupChat.html#clearState\" class=\"!symbol-index-name\">GroupChat#<wbr>clearState()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"GroupChat.html#createdAt\" class=\"!symbol-index-name\">GroupChat#<wbr>createdAt</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"GroupChat.html#delete\" class=\"!symbol-index-name\">GroupChat#<wbr>delete()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"GroupChat.html#deletePicture\" class=\"!symbol-index-name\">GroupChat#<wbr>deletePicture()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"GroupChat.html#demoteParticipants\" class=\"!symbol-index-name\">GroupChat#<wbr>demoteParticipants(participantIds)</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"GroupChat.html#description\" class=\"!symbol-index-name\">GroupChat#<wbr>description</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"GroupChat.html#fetchMessages\" class=\"!symbol-index-name\">GroupChat#<wbr>fetchMessages(searchOptions)</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"GroupChat.html#getContact\" class=\"!symbol-index-name\">GroupChat#<wbr>getContact()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"GroupChat.html#getCustomerNote\" class=\"!symbol-index-name\">GroupChat#<wbr>getCustomerNote()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"GroupChat.html#getGroupMembershipRequests\" class=\"!symbol-index-name\">GroupChat#<wbr>getGroupMembershipRequests()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"GroupChat.html#getInviteCode\" class=\"!symbol-index-name\">GroupChat#<wbr>getInviteCode()</a>\n            </dt>\n            <dd>\n            </dd>\n    </dl>\n</div>\n\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n            <dt class=\"symbol-index-name\">\n                <a href=\"GroupChat.html#getLabels\" class=\"!symbol-index-name\">GroupChat#<wbr>getLabels()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"GroupChat.html#getPinnedMessages\" class=\"!symbol-index-name\">GroupChat#<wbr>getPinnedMessages()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"GroupChat.html#id\" class=\"!symbol-index-name\">GroupChat#<wbr>id</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"GroupChat.html#isGroup\" class=\"!symbol-index-name\">GroupChat#<wbr>isGroup</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"GroupChat.html#isMuted\" class=\"!symbol-index-name\">GroupChat#<wbr>isMuted</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"GroupChat.html#isReadOnly\" class=\"!symbol-index-name\">GroupChat#<wbr>isReadOnly</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"GroupChat.html#lastMessage\" class=\"!symbol-index-name\">GroupChat#<wbr>lastMessage</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"GroupChat.html#leave\" class=\"!symbol-index-name\">GroupChat#<wbr>leave()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"GroupChat.html#markUnread\" class=\"!symbol-index-name\">GroupChat#<wbr>markUnread()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"GroupChat.html#mute\" class=\"!symbol-index-name\">GroupChat#<wbr>mute(unmuteDate)</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"GroupChat.html#muteExpiration\" class=\"!symbol-index-name\">GroupChat#<wbr>muteExpiration</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"GroupChat.html#name\" class=\"!symbol-index-name\">GroupChat#<wbr>name</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"GroupChat.html#owner\" class=\"!symbol-index-name\">GroupChat#<wbr>owner</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"GroupChat.html#participants\" class=\"!symbol-index-name\">GroupChat#<wbr>participants</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"GroupChat.html#pin\" class=\"!symbol-index-name\">GroupChat#<wbr>pin()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"GroupChat.html#pinned\" class=\"!symbol-index-name\">GroupChat#<wbr>pinned</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"GroupChat.html#promoteParticipants\" class=\"!symbol-index-name\">GroupChat#<wbr>promoteParticipants(participantIds)</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"GroupChat.html#rejectGroupMembershipRequests\" class=\"!symbol-index-name\">GroupChat#<wbr>rejectGroupMembershipRequests(options)</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"GroupChat.html#removeParticipants\" class=\"!symbol-index-name\">GroupChat#<wbr>removeParticipants(participantIds)</a>\n            </dt>\n            <dd>\n            </dd>\n    </dl>\n</div>\n\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n            <dt class=\"symbol-index-name\">\n                <a href=\"GroupChat.html#revokeInvite\" class=\"!symbol-index-name\">GroupChat#<wbr>revokeInvite()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"GroupChat.html#sendMessage\" class=\"!symbol-index-name\">GroupChat#<wbr>sendMessage(content[, options])</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"GroupChat.html#sendSeen\" class=\"!symbol-index-name\">GroupChat#<wbr>sendSeen()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"GroupChat.html#sendStateRecording\" class=\"!symbol-index-name\">GroupChat#<wbr>sendStateRecording()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"GroupChat.html#sendStateTyping\" class=\"!symbol-index-name\">GroupChat#<wbr>sendStateTyping()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"GroupChat.html#setAddMembersAdminsOnly\" class=\"!symbol-index-name\">GroupChat#<wbr>setAddMembersAdminsOnly([adminsOnly])</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"GroupChat.html#setDescription\" class=\"!symbol-index-name\">GroupChat#<wbr>setDescription(description)</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"GroupChat.html#setInfoAdminsOnly\" class=\"!symbol-index-name\">GroupChat#<wbr>setInfoAdminsOnly([adminsOnly])</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"GroupChat.html#setMessagesAdminsOnly\" class=\"!symbol-index-name\">GroupChat#<wbr>setMessagesAdminsOnly([adminsOnly])</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"GroupChat.html#setPicture\" class=\"!symbol-index-name\">GroupChat#<wbr>setPicture(media)</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"GroupChat.html#setSubject\" class=\"!symbol-index-name\">GroupChat#<wbr>setSubject(subject)</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"GroupChat.html#syncHistory\" class=\"!symbol-index-name\">GroupChat#<wbr>syncHistory()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"GroupChat.html#timestamp\" class=\"!symbol-index-name\">GroupChat#<wbr>timestamp</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"GroupChat.html#unarchive\" class=\"!symbol-index-name\">GroupChat#<wbr>unarchive()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"GroupChat.html#unmute\" class=\"!symbol-index-name\">GroupChat#<wbr>unmute()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"GroupChat.html#unpin\" class=\"!symbol-index-name\">GroupChat#<wbr>unpin()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"GroupChat.html#unreadCount\" class=\"!symbol-index-name\">GroupChat#<wbr>unreadCount</a>\n            </dt>\n            <dd>\n            </dd>\n    </dl>\n</div>\n\n                </div>\n            </div>\n        </section>\n        <section>\n            <div class=\"symbol-index-content\">\n                <h2 id=\"GroupNotification\">GroupNotification</h2>\n                <div class=\"symbol-index-section\">\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n            <dt class=\"symbol-index-name\">\n                <a href=\"GroupNotification.html\" class=\"!symbol-index-name\">GroupNotification()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"GroupNotification.html#author\" class=\"!symbol-index-name\">GroupNotification#<wbr>author</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"GroupNotification.html#body\" class=\"!symbol-index-name\">GroupNotification#<wbr>body</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"GroupNotification.html#chatId\" class=\"!symbol-index-name\">GroupNotification#<wbr>chatId</a>\n            </dt>\n            <dd>\n            </dd>\n    </dl>\n</div>\n\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n            <dt class=\"symbol-index-name\">\n                <a href=\"GroupNotification.html#getChat\" class=\"!symbol-index-name\">GroupNotification#<wbr>getChat()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"GroupNotification.html#getContact\" class=\"!symbol-index-name\">GroupNotification#<wbr>getContact()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"GroupNotification.html#getRecipients\" class=\"!symbol-index-name\">GroupNotification#<wbr>getRecipients()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"GroupNotification.html#id\" class=\"!symbol-index-name\">GroupNotification#<wbr>id</a>\n            </dt>\n            <dd>\n            </dd>\n    </dl>\n</div>\n\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n            <dt class=\"symbol-index-name\">\n                <a href=\"GroupNotification.html#recipientIds\" class=\"!symbol-index-name\">GroupNotification#<wbr>recipientIds</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"GroupNotification.html#reply\" class=\"!symbol-index-name\">GroupNotification#<wbr>reply(content, options)</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"GroupNotification.html#timestamp\" class=\"!symbol-index-name\">GroupNotification#<wbr>timestamp</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"GroupNotification.html#type\" class=\"!symbol-index-name\">GroupNotification#<wbr>type</a>\n            </dt>\n            <dd>\n            </dd>\n    </dl>\n</div>\n\n                </div>\n            </div>\n        </section>\n        <section>\n            <div class=\"symbol-index-content\">\n                <h2 id=\"GroupNotificationTypes\">GroupNotificationTypes</h2>\n                <div class=\"symbol-index-section\">\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n            <dt class=\"symbol-index-name\">\n                <a href=\"global.html#GroupNotificationTypes#.ADD\" class=\"!symbol-index-name\">GroupNotificationTypes.<wbr>ADD</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"global.html#GroupNotificationTypes#.ANNOUNCE\" class=\"!symbol-index-name\">GroupNotificationTypes.<wbr>ANNOUNCE</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"global.html#GroupNotificationTypes#.DEMOTE\" class=\"!symbol-index-name\">GroupNotificationTypes.<wbr>DEMOTE</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"global.html#GroupNotificationTypes#.DESCRIPTION\" class=\"!symbol-index-name\">GroupNotificationTypes.<wbr>DESCRIPTION</a>\n            </dt>\n            <dd>\n            </dd>\n    </dl>\n</div>\n\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n            <dt class=\"symbol-index-name\">\n                <a href=\"global.html#GroupNotificationTypes#.INVITE\" class=\"!symbol-index-name\">GroupNotificationTypes.<wbr>INVITE</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"global.html#GroupNotificationTypes#.LEAVE\" class=\"!symbol-index-name\">GroupNotificationTypes.<wbr>LEAVE</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"global.html#GroupNotificationTypes#.PICTURE\" class=\"!symbol-index-name\">GroupNotificationTypes.<wbr>PICTURE</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"global.html#GroupNotificationTypes#.PROMOTE\" class=\"!symbol-index-name\">GroupNotificationTypes.<wbr>PROMOTE</a>\n            </dt>\n            <dd>\n            </dd>\n    </dl>\n</div>\n\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n            <dt class=\"symbol-index-name\">\n                <a href=\"global.html#GroupNotificationTypes#.REMOVE\" class=\"!symbol-index-name\">GroupNotificationTypes.<wbr>REMOVE</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"global.html#GroupNotificationTypes#.RESTRICT\" class=\"!symbol-index-name\">GroupNotificationTypes.<wbr>RESTRICT</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"global.html#GroupNotificationTypes#.SUBJECT\" class=\"!symbol-index-name\">GroupNotificationTypes.<wbr>SUBJECT</a>\n            </dt>\n            <dd>\n            </dd>\n    </dl>\n</div>\n\n                </div>\n            </div>\n        </section>\n        <section>\n            <div class=\"symbol-index-content\">\n                <h2 id=\"InterfaceController\">InterfaceController</h2>\n                <div class=\"symbol-index-section\">\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n            <dt class=\"symbol-index-name\">\n                <a href=\"InterfaceController.html\" class=\"!symbol-index-name\">InterfaceController()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"InterfaceController.html#checkFeatureStatus\" class=\"!symbol-index-name\">InterfaceController#<wbr>checkFeatureStatus(feature)</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"InterfaceController.html#closeRightDrawer\" class=\"!symbol-index-name\">InterfaceController#<wbr>closeRightDrawer()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"InterfaceController.html#disableFeatures\" class=\"!symbol-index-name\">InterfaceController#<wbr>disableFeatures(features)</a>\n            </dt>\n            <dd>\n            </dd>\n    </dl>\n</div>\n\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n            <dt class=\"symbol-index-name\">\n                <a href=\"InterfaceController.html#enableFeatures\" class=\"!symbol-index-name\">InterfaceController#<wbr>enableFeatures(features)</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"InterfaceController.html#getFeatures\" class=\"!symbol-index-name\">InterfaceController#<wbr>getFeatures()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"InterfaceController.html#openChatDrawer\" class=\"!symbol-index-name\">InterfaceController#<wbr>openChatDrawer(chatId)</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"InterfaceController.html#openChatSearch\" class=\"!symbol-index-name\">InterfaceController#<wbr>openChatSearch(chatId)</a>\n            </dt>\n            <dd>\n            </dd>\n    </dl>\n</div>\n\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n            <dt class=\"symbol-index-name\">\n                <a href=\"InterfaceController.html#openChatWindow\" class=\"!symbol-index-name\">InterfaceController#<wbr>openChatWindow(chatId)</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"InterfaceController.html#openChatWindowAt\" class=\"!symbol-index-name\">InterfaceController#<wbr>openChatWindowAt(msgId)</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"InterfaceController.html#openMessageDrawer\" class=\"!symbol-index-name\">InterfaceController#<wbr>openMessageDrawer(msgId)</a>\n            </dt>\n            <dd>\n            </dd>\n    </dl>\n</div>\n\n                </div>\n            </div>\n        </section>\n        <section>\n            <div class=\"symbol-index-content\">\n                <h2 id=\"Label\">Label</h2>\n                <div class=\"symbol-index-section\">\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n            <dt class=\"symbol-index-name\">\n                <a href=\"Label.html\" class=\"!symbol-index-name\">Label(client, labelData)</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Label.html#getChats\" class=\"!symbol-index-name\">Label#<wbr>getChats()</a>\n            </dt>\n            <dd>\n            </dd>\n    </dl>\n</div>\n\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n            <dt class=\"symbol-index-name\">\n                <a href=\"Label.html#hexColor\" class=\"!symbol-index-name\">Label#<wbr>hexColor</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Label.html#id\" class=\"!symbol-index-name\">Label#<wbr>id</a>\n            </dt>\n            <dd>\n            </dd>\n    </dl>\n</div>\n\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n            <dt class=\"symbol-index-name\">\n                <a href=\"Label.html#name\" class=\"!symbol-index-name\">Label#<wbr>name</a>\n            </dt>\n            <dd>\n            </dd>\n    </dl>\n</div>\n\n                </div>\n            </div>\n        </section>\n        <section>\n            <div class=\"symbol-index-content\">\n                <h2 id=\"List\">List</h2>\n                <div class=\"symbol-index-section\">\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n            <dt class=\"symbol-index-name\">\n                <a href=\"List.html\" class=\"!symbol-index-name\">List(body, buttonText, sections, title, footer)</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"List.html#_format\" class=\"!symbol-index-name\">List#<wbr>_format(sections)</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"List.html#buttonText\" class=\"!symbol-index-name\">List#<wbr>buttonText</a>\n            </dt>\n            <dd>\n            </dd>\n    </dl>\n</div>\n\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n            <dt class=\"symbol-index-name\">\n                <a href=\"List.html#description\" class=\"!symbol-index-name\">List#<wbr>description</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"List.html#footer\" class=\"!symbol-index-name\">List#<wbr>footer</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"List.html#sections\" class=\"!symbol-index-name\">List#<wbr>sections</a>\n            </dt>\n            <dd>\n            </dd>\n    </dl>\n</div>\n\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n            <dt class=\"symbol-index-name\">\n                <a href=\"List.html#title\" class=\"!symbol-index-name\">List#<wbr>title</a>\n            </dt>\n            <dd>\n            </dd>\n    </dl>\n</div>\n\n                </div>\n            </div>\n        </section>\n        <section>\n            <div class=\"symbol-index-content\">\n                <h2 id=\"LocalAuth\">LocalAuth</h2>\n                <div class=\"symbol-index-section\">\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n            <dt class=\"symbol-index-name\">\n                <a href=\"LocalAuth.html\" class=\"!symbol-index-name\">LocalAuth(options)</a>\n            </dt>\n            <dd>\n            </dd>\n    </dl>\n</div>\n\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n    </dl>\n</div>\n\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n    </dl>\n</div>\n\n                </div>\n            </div>\n        </section>\n        <section>\n            <div class=\"symbol-index-content\">\n                <h2 id=\"LocalWebCache\">LocalWebCache</h2>\n                <div class=\"symbol-index-section\">\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n            <dt class=\"symbol-index-name\">\n                <a href=\"LocalWebCache.html\" class=\"!symbol-index-name\">LocalWebCache(options)</a>\n            </dt>\n            <dd>\n            </dd>\n    </dl>\n</div>\n\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n    </dl>\n</div>\n\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n    </dl>\n</div>\n\n                </div>\n            </div>\n        </section>\n        <section>\n            <div class=\"symbol-index-content\">\n                <h2 id=\"Location\">Location</h2>\n                <div class=\"symbol-index-section\">\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n            <dt class=\"symbol-index-name\">\n                <a href=\"Location.html\" class=\"!symbol-index-name\">Location(latitude, longitude[, options])</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Location.html#address\" class=\"!symbol-index-name\">Location#<wbr>address</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Location.html#description\" class=\"!symbol-index-name\">Location#<wbr>description</a>\n            </dt>\n            <dd>\n            </dd>\n    </dl>\n</div>\n\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n            <dt class=\"symbol-index-name\">\n                <a href=\"Location.html#latitude\" class=\"!symbol-index-name\">Location#<wbr>latitude</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Location.html#longitude\" class=\"!symbol-index-name\">Location#<wbr>longitude</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Location.html#name\" class=\"!symbol-index-name\">Location#<wbr>name</a>\n            </dt>\n            <dd>\n            </dd>\n    </dl>\n</div>\n\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n            <dt class=\"symbol-index-name\">\n                <a href=\"Location.html#url\" class=\"!symbol-index-name\">Location#<wbr>url</a>\n            </dt>\n            <dd>\n            </dd>\n    </dl>\n</div>\n\n                </div>\n            </div>\n        </section>\n        <section>\n            <div class=\"symbol-index-content\">\n                <h2 id=\"Message\">Message</h2>\n                <div class=\"symbol-index-section\">\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n            <dt class=\"symbol-index-name\">\n                <a href=\"Message.html\" class=\"!symbol-index-name\">Message()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Message.html#acceptGroupV4Invite\" class=\"!symbol-index-name\">Message#<wbr>acceptGroupV4Invite()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Message.html#ack\" class=\"!symbol-index-name\">Message#<wbr>ack</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Message.html#author\" class=\"!symbol-index-name\">Message#<wbr>author</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Message.html#body\" class=\"!symbol-index-name\">Message#<wbr>body</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Message.html#broadcast\" class=\"!symbol-index-name\">Message#<wbr>broadcast</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Message.html#delete\" class=\"!symbol-index-name\">Message#<wbr>delete(everyone[, clearMedia])</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Message.html#deviceType\" class=\"!symbol-index-name\">Message#<wbr>deviceType</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Message.html#downloadMedia\" class=\"!symbol-index-name\">Message#<wbr>downloadMedia()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Message.html#duration\" class=\"!symbol-index-name\">Message#<wbr>duration</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Message.html#edit\" class=\"!symbol-index-name\">Message#<wbr>edit(content[, options])</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Message.html#editScheduledEvent\" class=\"!symbol-index-name\">Message#<wbr>editScheduledEvent(editedEventObject)</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Message.html#forward\" class=\"!symbol-index-name\">Message#<wbr>forward(chat)</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Message.html#forwardingScore\" class=\"!symbol-index-name\">Message#<wbr>forwardingScore</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Message.html#from\" class=\"!symbol-index-name\">Message#<wbr>from</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Message.html#fromMe\" class=\"!symbol-index-name\">Message#<wbr>fromMe</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Message.html#getChat\" class=\"!symbol-index-name\">Message#<wbr>getChat()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Message.html#getContact\" class=\"!symbol-index-name\">Message#<wbr>getContact()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Message.html#getGroupMentions\" class=\"!symbol-index-name\">Message#<wbr>getGroupMentions()</a>\n            </dt>\n            <dd>\n            </dd>\n    </dl>\n</div>\n\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n            <dt class=\"symbol-index-name\">\n                <a href=\"Message.html#getInfo\" class=\"!symbol-index-name\">Message#<wbr>getInfo()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Message.html#getMentions\" class=\"!symbol-index-name\">Message#<wbr>getMentions()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Message.html#getOrder\" class=\"!symbol-index-name\">Message#<wbr>getOrder()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Message.html#getPayment\" class=\"!symbol-index-name\">Message#<wbr>getPayment()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Message.html#getPollVotes\" class=\"!symbol-index-name\">Message#<wbr>getPollVotes()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Message.html#getQuotedMessage\" class=\"!symbol-index-name\">Message#<wbr>getQuotedMessage()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Message.html#getReactions\" class=\"!symbol-index-name\">Message#<wbr>getReactions()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Message.html#groupMentions\" class=\"!symbol-index-name\">Message#<wbr>groupMentions</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Message.html#hasMedia\" class=\"!symbol-index-name\">Message#<wbr>hasMedia</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Message.html#hasQuotedMsg\" class=\"!symbol-index-name\">Message#<wbr>hasQuotedMsg</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Message.html#hasReaction\" class=\"!symbol-index-name\">Message#<wbr>hasReaction</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Message.html#id\" class=\"!symbol-index-name\">Message#<wbr>id</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Message.html#inviteV4\" class=\"!symbol-index-name\">Message#<wbr>inviteV4</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Message.html#isEphemeral\" class=\"!symbol-index-name\">Message#<wbr>isEphemeral</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Message.html#isForwarded\" class=\"!symbol-index-name\">Message#<wbr>isForwarded</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Message.html#isGif\" class=\"!symbol-index-name\">Message#<wbr>isGif</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Message.html#isStarred\" class=\"!symbol-index-name\">Message#<wbr>isStarred</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Message.html#isStatus\" class=\"!symbol-index-name\">Message#<wbr>isStatus</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Message.html#links\" class=\"!symbol-index-name\">Message#<wbr>links</a>\n            </dt>\n            <dd>\n            </dd>\n    </dl>\n</div>\n\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n            <dt class=\"symbol-index-name\">\n                <a href=\"Message.html#location\" class=\"!symbol-index-name\">Message#<wbr>location</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Message.html#mediaKey\" class=\"!symbol-index-name\">Message#<wbr>mediaKey</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Message.html#mentionedIds\" class=\"!symbol-index-name\">Message#<wbr>mentionedIds</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Message.html#orderId\" class=\"!symbol-index-name\">Message#<wbr>orderId</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Message.html#pin\" class=\"!symbol-index-name\">Message#<wbr>pin(duration)</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Message.html#rawData\" class=\"!symbol-index-name\">Message#<wbr>rawData</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Message.html#react\" class=\"!symbol-index-name\">Message#<wbr>react(reaction)</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Message.html#reload\" class=\"!symbol-index-name\">Message#<wbr>reload()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Message.html#reply\" class=\"!symbol-index-name\">Message#<wbr>reply(content[, chatId][, options])</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Message.html#star\" class=\"!symbol-index-name\">Message#<wbr>star()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Message.html#timestamp\" class=\"!symbol-index-name\">Message#<wbr>timestamp</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Message.html#to\" class=\"!symbol-index-name\">Message#<wbr>to</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Message.html#token\" class=\"!symbol-index-name\">Message#<wbr>token</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Message.html#type\" class=\"!symbol-index-name\">Message#<wbr>type</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Message.html#unpin\" class=\"!symbol-index-name\">Message#<wbr>unpin()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Message.html#unstar\" class=\"!symbol-index-name\">Message#<wbr>unstar()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Message.html#vCards\" class=\"!symbol-index-name\">Message#<wbr>vCards</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Message.html#vote\" class=\"!symbol-index-name\">Message#<wbr>vote(selectedOptions)</a>\n            </dt>\n            <dd>\n            </dd>\n    </dl>\n</div>\n\n                </div>\n            </div>\n        </section>\n        <section>\n            <div class=\"symbol-index-content\">\n                <h2 id=\"MessageAck\">MessageAck</h2>\n                <div class=\"symbol-index-section\">\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n            <dt class=\"symbol-index-name\">\n                <a href=\"global.html#MessageAck#.ACK_DEVICE\" class=\"!symbol-index-name\">MessageAck.<wbr>ACK_DEVICE</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"global.html#MessageAck#.ACK_ERROR\" class=\"!symbol-index-name\">MessageAck.<wbr>ACK_ERROR</a>\n            </dt>\n            <dd>\n            </dd>\n    </dl>\n</div>\n\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n            <dt class=\"symbol-index-name\">\n                <a href=\"global.html#MessageAck#.ACK_PENDING\" class=\"!symbol-index-name\">MessageAck.<wbr>ACK_PENDING</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"global.html#MessageAck#.ACK_PLAYED\" class=\"!symbol-index-name\">MessageAck.<wbr>ACK_PLAYED</a>\n            </dt>\n            <dd>\n            </dd>\n    </dl>\n</div>\n\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n            <dt class=\"symbol-index-name\">\n                <a href=\"global.html#MessageAck#.ACK_READ\" class=\"!symbol-index-name\">MessageAck.<wbr>ACK_READ</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"global.html#MessageAck#.ACK_SERVER\" class=\"!symbol-index-name\">MessageAck.<wbr>ACK_SERVER</a>\n            </dt>\n            <dd>\n            </dd>\n    </dl>\n</div>\n\n                </div>\n            </div>\n        </section>\n        <section>\n            <div class=\"symbol-index-content\">\n                <h2 id=\"MessageMedia\">MessageMedia</h2>\n                <div class=\"symbol-index-section\">\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n            <dt class=\"symbol-index-name\">\n                <a href=\"MessageMedia.html\" class=\"!symbol-index-name\">MessageMedia(mimetype, data, filename, filesize)</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"MessageMedia.html#.fromFilePath\" class=\"!symbol-index-name\">MessageMedia.<wbr>fromFilePath(filePath)</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"MessageMedia.html#.fromUrl\" class=\"!symbol-index-name\">MessageMedia.<wbr>fromUrl(url[, options])</a>\n            </dt>\n            <dd>\n            </dd>\n    </dl>\n</div>\n\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n            <dt class=\"symbol-index-name\">\n                <a href=\"MessageMedia.html#data\" class=\"!symbol-index-name\">MessageMedia#<wbr>data</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"MessageMedia.html#filename\" class=\"!symbol-index-name\">MessageMedia#<wbr>filename</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"MessageMedia.html#filesize\" class=\"!symbol-index-name\">MessageMedia#<wbr>filesize</a>\n            </dt>\n            <dd>\n            </dd>\n    </dl>\n</div>\n\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n            <dt class=\"symbol-index-name\">\n                <a href=\"MessageMedia.html#mimetype\" class=\"!symbol-index-name\">MessageMedia#<wbr>mimetype</a>\n            </dt>\n            <dd>\n            </dd>\n    </dl>\n</div>\n\n                </div>\n            </div>\n        </section>\n        <section>\n            <div class=\"symbol-index-content\">\n                <h2 id=\"MessageTypes\">MessageTypes</h2>\n                <div class=\"symbol-index-section\">\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n            <dt class=\"symbol-index-name\">\n                <a href=\"global.html#MessageTypes#.ALBUM\" class=\"!symbol-index-name\">MessageTypes.<wbr>ALBUM</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"global.html#MessageTypes#.AUDIO\" class=\"!symbol-index-name\">MessageTypes.<wbr>AUDIO</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"global.html#MessageTypes#.BROADCAST_NOTIFICATION\" class=\"!symbol-index-name\">MessageTypes.<wbr>BROADCAST_NOTIFICATION</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"global.html#MessageTypes#.BUTTONS_RESPONSE\" class=\"!symbol-index-name\">MessageTypes.<wbr>BUTTONS_RESPONSE</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"global.html#MessageTypes#.CALL_LOG\" class=\"!symbol-index-name\">MessageTypes.<wbr>CALL_LOG</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"global.html#MessageTypes#.CIPHERTEXT\" class=\"!symbol-index-name\">MessageTypes.<wbr>CIPHERTEXT</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"global.html#MessageTypes#.CONTACT_CARD\" class=\"!symbol-index-name\">MessageTypes.<wbr>CONTACT_CARD</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"global.html#MessageTypes#.CONTACT_CARD_MULTI\" class=\"!symbol-index-name\">MessageTypes.<wbr>CONTACT_CARD_MULTI</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"global.html#MessageTypes#.DEBUG\" class=\"!symbol-index-name\">MessageTypes.<wbr>DEBUG</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"global.html#MessageTypes#.DOCUMENT\" class=\"!symbol-index-name\">MessageTypes.<wbr>DOCUMENT</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"global.html#MessageTypes#.E2E_NOTIFICATION\" class=\"!symbol-index-name\">MessageTypes.<wbr>E2E_NOTIFICATION</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"global.html#MessageTypes#.GP2\" class=\"!symbol-index-name\">MessageTypes.<wbr>GP2</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"global.html#MessageTypes#.GROUP_INVITE\" class=\"!symbol-index-name\">MessageTypes.<wbr>GROUP_INVITE</a>\n            </dt>\n            <dd>\n            </dd>\n    </dl>\n</div>\n\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n            <dt class=\"symbol-index-name\">\n                <a href=\"global.html#MessageTypes#.GROUP_NOTIFICATION\" class=\"!symbol-index-name\">MessageTypes.<wbr>GROUP_NOTIFICATION</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"global.html#MessageTypes#.HSM\" class=\"!symbol-index-name\">MessageTypes.<wbr>HSM</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"global.html#MessageTypes#.IMAGE\" class=\"!symbol-index-name\">MessageTypes.<wbr>IMAGE</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"global.html#MessageTypes#.INTERACTIVE\" class=\"!symbol-index-name\">MessageTypes.<wbr>INTERACTIVE</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"global.html#MessageTypes#.LIST\" class=\"!symbol-index-name\">MessageTypes.<wbr>LIST</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"global.html#MessageTypes#.LIST_RESPONSE\" class=\"!symbol-index-name\">MessageTypes.<wbr>LIST_RESPONSE</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"global.html#MessageTypes#.LOCATION\" class=\"!symbol-index-name\">MessageTypes.<wbr>LOCATION</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"global.html#MessageTypes#.NATIVE_FLOW\" class=\"!symbol-index-name\">MessageTypes.<wbr>NATIVE_FLOW</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"global.html#MessageTypes#.NOTIFICATION\" class=\"!symbol-index-name\">MessageTypes.<wbr>NOTIFICATION</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"global.html#MessageTypes#.NOTIFICATION_TEMPLATE\" class=\"!symbol-index-name\">MessageTypes.<wbr>NOTIFICATION_TEMPLATE</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"global.html#MessageTypes#.ORDER\" class=\"!symbol-index-name\">MessageTypes.<wbr>ORDER</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"global.html#MessageTypes#.OVERSIZED\" class=\"!symbol-index-name\">MessageTypes.<wbr>OVERSIZED</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"global.html#MessageTypes#.PAYMENT\" class=\"!symbol-index-name\">MessageTypes.<wbr>PAYMENT</a>\n            </dt>\n            <dd>\n            </dd>\n    </dl>\n</div>\n\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n            <dt class=\"symbol-index-name\">\n                <a href=\"global.html#MessageTypes#.POLL_CREATION\" class=\"!symbol-index-name\">MessageTypes.<wbr>POLL_CREATION</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"global.html#MessageTypes#.PRODUCT\" class=\"!symbol-index-name\">MessageTypes.<wbr>PRODUCT</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"global.html#MessageTypes#.PROTOCOL\" class=\"!symbol-index-name\">MessageTypes.<wbr>PROTOCOL</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"global.html#MessageTypes#.REACTION\" class=\"!symbol-index-name\">MessageTypes.<wbr>REACTION</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"global.html#MessageTypes#.REVOKED\" class=\"!symbol-index-name\">MessageTypes.<wbr>REVOKED</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"global.html#MessageTypes#.SCHEDULED_EVENT_CREATION\" class=\"!symbol-index-name\">MessageTypes.<wbr>SCHEDULED_EVENT_CREATION</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"global.html#MessageTypes#.STICKER\" class=\"!symbol-index-name\">MessageTypes.<wbr>STICKER</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"global.html#MessageTypes#.TEMPLATE_BUTTON_REPLY\" class=\"!symbol-index-name\">MessageTypes.<wbr>TEMPLATE_BUTTON_REPLY</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"global.html#MessageTypes#.TEXT\" class=\"!symbol-index-name\">MessageTypes.<wbr>TEXT</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"global.html#MessageTypes#.UNKNOWN\" class=\"!symbol-index-name\">MessageTypes.<wbr>UNKNOWN</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"global.html#MessageTypes#.VIDEO\" class=\"!symbol-index-name\">MessageTypes.<wbr>VIDEO</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"global.html#MessageTypes#.VOICE\" class=\"!symbol-index-name\">MessageTypes.<wbr>VOICE</a>\n            </dt>\n            <dd>\n            </dd>\n    </dl>\n</div>\n\n                </div>\n            </div>\n        </section>\n        <section>\n            <div class=\"symbol-index-content\">\n                <h2 id=\"NoAuth\">NoAuth</h2>\n                <div class=\"symbol-index-section\">\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n            <dt class=\"symbol-index-name\">\n                <a href=\"NoAuth.html\" class=\"!symbol-index-name\">NoAuth()</a>\n            </dt>\n            <dd>\n            </dd>\n    </dl>\n</div>\n\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n    </dl>\n</div>\n\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n    </dl>\n</div>\n\n                </div>\n            </div>\n        </section>\n        <section>\n            <div class=\"symbol-index-content\">\n                <h2 id=\"Order\">Order</h2>\n                <div class=\"symbol-index-section\">\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n            <dt class=\"symbol-index-name\">\n                <a href=\"Order.html\" class=\"!symbol-index-name\">Order()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Order.html#createdAt\" class=\"!symbol-index-name\">Order#<wbr>createdAt</a>\n            </dt>\n            <dd>\n            </dd>\n    </dl>\n</div>\n\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n            <dt class=\"symbol-index-name\">\n                <a href=\"Order.html#currency\" class=\"!symbol-index-name\">Order#<wbr>currency</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Order.html#subtotal\" class=\"!symbol-index-name\">Order#<wbr>subtotal</a>\n            </dt>\n            <dd>\n            </dd>\n    </dl>\n</div>\n\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n            <dt class=\"symbol-index-name\">\n                <a href=\"Order.html#total\" class=\"!symbol-index-name\">Order#<wbr>total</a>\n            </dt>\n            <dd>\n            </dd>\n    </dl>\n</div>\n\n                </div>\n            </div>\n        </section>\n        <section>\n            <div class=\"symbol-index-content\">\n                <h2 id=\"Payment\">Payment</h2>\n                <div class=\"symbol-index-section\">\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n            <dt class=\"symbol-index-name\">\n                <a href=\"Payment.html#id\" class=\"!symbol-index-name\">Payment#<wbr>id</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Payment.html#paymentAmount1000\" class=\"!symbol-index-name\">Payment#<wbr>paymentAmount1000</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Payment.html#paymentCurrency\" class=\"!symbol-index-name\">Payment#<wbr>paymentCurrency</a>\n            </dt>\n            <dd>\n            </dd>\n    </dl>\n</div>\n\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n            <dt class=\"symbol-index-name\">\n                <a href=\"Payment.html#paymentMessageReceiverJid\" class=\"!symbol-index-name\">Payment#<wbr>paymentMessageReceiverJid</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Payment.html#paymentNote\" class=\"!symbol-index-name\">Payment#<wbr>paymentNote</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Payment.html#paymentStatus\" class=\"!symbol-index-name\">Payment#<wbr>paymentStatus</a>\n            </dt>\n            <dd>\n            </dd>\n    </dl>\n</div>\n\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n            <dt class=\"symbol-index-name\">\n                <a href=\"Payment.html#paymentTransactionTimestamp\" class=\"!symbol-index-name\">Payment#<wbr>paymentTransactionTimestamp</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Payment.html#paymentTxnStatus\" class=\"!symbol-index-name\">Payment#<wbr>paymentTxnStatus</a>\n            </dt>\n            <dd>\n            </dd>\n    </dl>\n</div>\n\n                </div>\n            </div>\n        </section>\n        <section>\n            <div class=\"symbol-index-content\">\n                <h2 id=\"Poll\">Poll</h2>\n                <div class=\"symbol-index-section\">\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n            <dt class=\"symbol-index-name\">\n                <a href=\"Poll.html\" class=\"!symbol-index-name\">Poll(pollName, pollOptions, options)</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Poll.html#options\" class=\"!symbol-index-name\">Poll#<wbr>options</a>\n            </dt>\n            <dd>\n            </dd>\n    </dl>\n</div>\n\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n            <dt class=\"symbol-index-name\">\n                <a href=\"Poll.html#pollName\" class=\"!symbol-index-name\">Poll#<wbr>pollName</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Poll.html#pollOptions\" class=\"!symbol-index-name\">Poll#<wbr>pollOptions</a>\n            </dt>\n            <dd>\n            </dd>\n    </dl>\n</div>\n\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n    </dl>\n</div>\n\n                </div>\n            </div>\n        </section>\n        <section>\n            <div class=\"symbol-index-content\">\n                <h2 id=\"PollVote\">PollVote</h2>\n                <div class=\"symbol-index-section\">\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n            <dt class=\"symbol-index-name\">\n                <a href=\"PollVote.html\" class=\"!symbol-index-name\">PollVote()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"PollVote.html#interractedAtTs\" class=\"!symbol-index-name\">PollVote#<wbr>interractedAtTs</a>\n            </dt>\n            <dd>\n            </dd>\n    </dl>\n</div>\n\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n            <dt class=\"symbol-index-name\">\n                <a href=\"PollVote.html#parentMessage\" class=\"!symbol-index-name\">PollVote#<wbr>parentMessage</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"PollVote.html#parentMsgKey\" class=\"!symbol-index-name\">PollVote#<wbr>parentMsgKey</a>\n            </dt>\n            <dd>\n            </dd>\n    </dl>\n</div>\n\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n            <dt class=\"symbol-index-name\">\n                <a href=\"PollVote.html#voter\" class=\"!symbol-index-name\">PollVote#<wbr>voter</a>\n            </dt>\n            <dd>\n            </dd>\n    </dl>\n</div>\n\n                </div>\n            </div>\n        </section>\n        <section>\n            <div class=\"symbol-index-content\">\n                <h2 id=\"PrivateChat\">PrivateChat</h2>\n                <div class=\"symbol-index-section\">\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n            <dt class=\"symbol-index-name\">\n                <a href=\"PrivateChat.html\" class=\"!symbol-index-name\">PrivateChat()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"PrivateChat.html#addOrEditCustomerNote\" class=\"!symbol-index-name\">PrivateChat#<wbr>addOrEditCustomerNote(note)</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"PrivateChat.html#archive\" class=\"!symbol-index-name\">PrivateChat#<wbr>archive()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"PrivateChat.html#archived\" class=\"!symbol-index-name\">PrivateChat#<wbr>archived</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"PrivateChat.html#changeLabels\" class=\"!symbol-index-name\">PrivateChat#<wbr>changeLabels(labelIds)</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"PrivateChat.html#clearMessages\" class=\"!symbol-index-name\">PrivateChat#<wbr>clearMessages()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"PrivateChat.html#clearState\" class=\"!symbol-index-name\">PrivateChat#<wbr>clearState()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"PrivateChat.html#delete\" class=\"!symbol-index-name\">PrivateChat#<wbr>delete()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"PrivateChat.html#fetchMessages\" class=\"!symbol-index-name\">PrivateChat#<wbr>fetchMessages(searchOptions)</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"PrivateChat.html#getContact\" class=\"!symbol-index-name\">PrivateChat#<wbr>getContact()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"PrivateChat.html#getCustomerNote\" class=\"!symbol-index-name\">PrivateChat#<wbr>getCustomerNote()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"PrivateChat.html#getLabels\" class=\"!symbol-index-name\">PrivateChat#<wbr>getLabels()</a>\n            </dt>\n            <dd>\n            </dd>\n    </dl>\n</div>\n\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n            <dt class=\"symbol-index-name\">\n                <a href=\"PrivateChat.html#getPinnedMessages\" class=\"!symbol-index-name\">PrivateChat#<wbr>getPinnedMessages()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"PrivateChat.html#id\" class=\"!symbol-index-name\">PrivateChat#<wbr>id</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"PrivateChat.html#isGroup\" class=\"!symbol-index-name\">PrivateChat#<wbr>isGroup</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"PrivateChat.html#isMuted\" class=\"!symbol-index-name\">PrivateChat#<wbr>isMuted</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"PrivateChat.html#isReadOnly\" class=\"!symbol-index-name\">PrivateChat#<wbr>isReadOnly</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"PrivateChat.html#lastMessage\" class=\"!symbol-index-name\">PrivateChat#<wbr>lastMessage</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"PrivateChat.html#markUnread\" class=\"!symbol-index-name\">PrivateChat#<wbr>markUnread()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"PrivateChat.html#mute\" class=\"!symbol-index-name\">PrivateChat#<wbr>mute(unmuteDate)</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"PrivateChat.html#muteExpiration\" class=\"!symbol-index-name\">PrivateChat#<wbr>muteExpiration</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"PrivateChat.html#name\" class=\"!symbol-index-name\">PrivateChat#<wbr>name</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"PrivateChat.html#pin\" class=\"!symbol-index-name\">PrivateChat#<wbr>pin()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"PrivateChat.html#pinned\" class=\"!symbol-index-name\">PrivateChat#<wbr>pinned</a>\n            </dt>\n            <dd>\n            </dd>\n    </dl>\n</div>\n\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n            <dt class=\"symbol-index-name\">\n                <a href=\"PrivateChat.html#sendMessage\" class=\"!symbol-index-name\">PrivateChat#<wbr>sendMessage(content[, options])</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"PrivateChat.html#sendSeen\" class=\"!symbol-index-name\">PrivateChat#<wbr>sendSeen()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"PrivateChat.html#sendStateRecording\" class=\"!symbol-index-name\">PrivateChat#<wbr>sendStateRecording()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"PrivateChat.html#sendStateTyping\" class=\"!symbol-index-name\">PrivateChat#<wbr>sendStateTyping()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"PrivateChat.html#syncHistory\" class=\"!symbol-index-name\">PrivateChat#<wbr>syncHistory()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"PrivateChat.html#timestamp\" class=\"!symbol-index-name\">PrivateChat#<wbr>timestamp</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"PrivateChat.html#unarchive\" class=\"!symbol-index-name\">PrivateChat#<wbr>unarchive()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"PrivateChat.html#unmute\" class=\"!symbol-index-name\">PrivateChat#<wbr>unmute()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"PrivateChat.html#unpin\" class=\"!symbol-index-name\">PrivateChat#<wbr>unpin()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"PrivateChat.html#unreadCount\" class=\"!symbol-index-name\">PrivateChat#<wbr>unreadCount</a>\n            </dt>\n            <dd>\n            </dd>\n    </dl>\n</div>\n\n                </div>\n            </div>\n        </section>\n        <section>\n            <div class=\"symbol-index-content\">\n                <h2 id=\"PrivateContact\">PrivateContact</h2>\n                <div class=\"symbol-index-section\">\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n            <dt class=\"symbol-index-name\">\n                <a href=\"PrivateContact.html\" class=\"!symbol-index-name\">PrivateContact()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"PrivateContact.html#block\" class=\"!symbol-index-name\">PrivateContact#<wbr>block()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"PrivateContact.html#getAbout\" class=\"!symbol-index-name\">PrivateContact#<wbr>getAbout()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"PrivateContact.html#getBroadcast\" class=\"!symbol-index-name\">PrivateContact#<wbr>getBroadcast()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"PrivateContact.html#getChat\" class=\"!symbol-index-name\">PrivateContact#<wbr>getChat()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"PrivateContact.html#getCommonGroups\" class=\"!symbol-index-name\">PrivateContact#<wbr>getCommonGroups()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"PrivateContact.html#getCountryCode\" class=\"!symbol-index-name\">PrivateContact#<wbr>getCountryCode()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"PrivateContact.html#getFormattedNumber\" class=\"!symbol-index-name\">PrivateContact#<wbr>getFormattedNumber()</a>\n            </dt>\n            <dd>\n            </dd>\n    </dl>\n</div>\n\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n            <dt class=\"symbol-index-name\">\n                <a href=\"PrivateContact.html#getProfilePicUrl\" class=\"!symbol-index-name\">PrivateContact#<wbr>getProfilePicUrl()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"PrivateContact.html#id\" class=\"!symbol-index-name\">PrivateContact#<wbr>id</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"PrivateContact.html#isBlocked\" class=\"!symbol-index-name\">PrivateContact#<wbr>isBlocked</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"PrivateContact.html#isBusiness\" class=\"!symbol-index-name\">PrivateContact#<wbr>isBusiness</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"PrivateContact.html#isEnterprise\" class=\"!symbol-index-name\">PrivateContact#<wbr>isEnterprise</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"PrivateContact.html#isGroup\" class=\"!symbol-index-name\">PrivateContact#<wbr>isGroup</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"PrivateContact.html#isMe\" class=\"!symbol-index-name\">PrivateContact#<wbr>isMe</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"PrivateContact.html#isMyContact\" class=\"!symbol-index-name\">PrivateContact#<wbr>isMyContact</a>\n            </dt>\n            <dd>\n            </dd>\n    </dl>\n</div>\n\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n            <dt class=\"symbol-index-name\">\n                <a href=\"PrivateContact.html#isUser\" class=\"!symbol-index-name\">PrivateContact#<wbr>isUser</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"PrivateContact.html#isWAContact\" class=\"!symbol-index-name\">PrivateContact#<wbr>isWAContact</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"PrivateContact.html#name\" class=\"!symbol-index-name\">PrivateContact#<wbr>name</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"PrivateContact.html#number\" class=\"!symbol-index-name\">PrivateContact#<wbr>number</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"PrivateContact.html#pushname\" class=\"!symbol-index-name\">PrivateContact#<wbr>pushname</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"PrivateContact.html#shortName\" class=\"!symbol-index-name\">PrivateContact#<wbr>shortName</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"PrivateContact.html#unblock\" class=\"!symbol-index-name\">PrivateContact#<wbr>unblock()</a>\n            </dt>\n            <dd>\n            </dd>\n    </dl>\n</div>\n\n                </div>\n            </div>\n        </section>\n        <section>\n            <div class=\"symbol-index-content\">\n                <h2 id=\"Product\">Product</h2>\n                <div class=\"symbol-index-section\">\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n            <dt class=\"symbol-index-name\">\n                <a href=\"Product.html\" class=\"!symbol-index-name\">Product()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Product.html#currency\" class=\"!symbol-index-name\">Product#<wbr>currency</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Product.html#data\" class=\"!symbol-index-name\">Product#<wbr>data</a>\n            </dt>\n            <dd>\n            </dd>\n    </dl>\n</div>\n\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n            <dt class=\"symbol-index-name\">\n                <a href=\"Product.html#id\" class=\"!symbol-index-name\">Product#<wbr>id</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Product.html#name\" class=\"!symbol-index-name\">Product#<wbr>name</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Product.html#price\" class=\"!symbol-index-name\">Product#<wbr>price</a>\n            </dt>\n            <dd>\n            </dd>\n    </dl>\n</div>\n\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n            <dt class=\"symbol-index-name\">\n                <a href=\"Product.html#quantity\" class=\"!symbol-index-name\">Product#<wbr>quantity</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Product.html#thumbnailUrl\" class=\"!symbol-index-name\">Product#<wbr>thumbnailUrl</a>\n            </dt>\n            <dd>\n            </dd>\n    </dl>\n</div>\n\n                </div>\n            </div>\n        </section>\n        <section>\n            <div class=\"symbol-index-content\">\n                <h2 id=\"ProductMetadata\">ProductMetadata</h2>\n                <div class=\"symbol-index-section\">\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n            <dt class=\"symbol-index-name\">\n                <a href=\"ProductMetadata.html#description\" class=\"!symbol-index-name\">ProductMetadata#<wbr>description</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"ProductMetadata.html#id\" class=\"!symbol-index-name\">ProductMetadata#<wbr>id</a>\n            </dt>\n            <dd>\n            </dd>\n    </dl>\n</div>\n\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n            <dt class=\"symbol-index-name\">\n                <a href=\"ProductMetadata.html#name\" class=\"!symbol-index-name\">ProductMetadata#<wbr>name</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"ProductMetadata.html#retailer_id\" class=\"!symbol-index-name\">ProductMetadata#<wbr>retailer_id</a>\n            </dt>\n            <dd>\n            </dd>\n    </dl>\n</div>\n\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n    </dl>\n</div>\n\n                </div>\n            </div>\n        </section>\n        <section>\n            <div class=\"symbol-index-content\">\n                <h2 id=\"Reaction\">Reaction</h2>\n                <div class=\"symbol-index-section\">\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n            <dt class=\"symbol-index-name\">\n                <a href=\"Reaction.html\" class=\"!symbol-index-name\">Reaction()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Reaction.html#ack\" class=\"!symbol-index-name\">Reaction#<wbr>ack</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Reaction.html#id\" class=\"!symbol-index-name\">Reaction#<wbr>id</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Reaction.html#msgId\" class=\"!symbol-index-name\">Reaction#<wbr>msgId</a>\n            </dt>\n            <dd>\n            </dd>\n    </dl>\n</div>\n\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n            <dt class=\"symbol-index-name\">\n                <a href=\"Reaction.html#orphan\" class=\"!symbol-index-name\">Reaction#<wbr>orphan</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Reaction.html#orphanReason\" class=\"!symbol-index-name\">Reaction#<wbr>orphanReason</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Reaction.html#reaction\" class=\"!symbol-index-name\">Reaction#<wbr>reaction</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Reaction.html#read\" class=\"!symbol-index-name\">Reaction#<wbr>read</a>\n            </dt>\n            <dd>\n            </dd>\n    </dl>\n</div>\n\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n            <dt class=\"symbol-index-name\">\n                <a href=\"Reaction.html#senderId\" class=\"!symbol-index-name\">Reaction#<wbr>senderId</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Reaction.html#timestamp\" class=\"!symbol-index-name\">Reaction#<wbr>timestamp</a>\n            </dt>\n            <dd>\n            </dd>\n    </dl>\n</div>\n\n                </div>\n            </div>\n        </section>\n        <section>\n            <div class=\"symbol-index-content\">\n                <h2 id=\"RemoteAuth\">RemoteAuth</h2>\n                <div class=\"symbol-index-section\">\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n            <dt class=\"symbol-index-name\">\n                <a href=\"RemoteAuth.html\" class=\"!symbol-index-name\">RemoteAuth(options)</a>\n            </dt>\n            <dd>\n            </dd>\n    </dl>\n</div>\n\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n    </dl>\n</div>\n\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n    </dl>\n</div>\n\n                </div>\n            </div>\n        </section>\n        <section>\n            <div class=\"symbol-index-content\">\n                <h2 id=\"RemoteWebCache\">RemoteWebCache</h2>\n                <div class=\"symbol-index-section\">\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n            <dt class=\"symbol-index-name\">\n                <a href=\"RemoteWebCache.html\" class=\"!symbol-index-name\">RemoteWebCache(options)</a>\n            </dt>\n            <dd>\n            </dd>\n    </dl>\n</div>\n\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n    </dl>\n</div>\n\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n    </dl>\n</div>\n\n                </div>\n            </div>\n        </section>\n        <section>\n            <div class=\"symbol-index-content\">\n                <h2 id=\"ScheduledEvent\">ScheduledEvent</h2>\n                <div class=\"symbol-index-section\">\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n            <dt class=\"symbol-index-name\">\n                <a href=\"ScheduledEvent.html\" class=\"!symbol-index-name\">ScheduledEvent(name, startTime, options)</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"ScheduledEvent.html#_validateInputs\" class=\"!symbol-index-name\">ScheduledEvent#<wbr>_validateInputs(propName, propValue)</a>\n            </dt>\n            <dd>\n            </dd>\n    </dl>\n</div>\n\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n            <dt class=\"symbol-index-name\">\n                <a href=\"ScheduledEvent.html#eventSendOptions\" class=\"!symbol-index-name\">ScheduledEvent#<wbr>eventSendOptions</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"ScheduledEvent.html#name\" class=\"!symbol-index-name\">ScheduledEvent#<wbr>name</a>\n            </dt>\n            <dd>\n            </dd>\n    </dl>\n</div>\n\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n            <dt class=\"symbol-index-name\">\n                <a href=\"ScheduledEvent.html#startTimeTs\" class=\"!symbol-index-name\">ScheduledEvent#<wbr>startTimeTs</a>\n            </dt>\n            <dd>\n            </dd>\n    </dl>\n</div>\n\n                </div>\n            </div>\n        </section>\n        <section>\n            <div class=\"symbol-index-content\">\n                <h2 id=\"Status\">Status</h2>\n                <div class=\"symbol-index-section\">\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n            <dt class=\"symbol-index-name\">\n                <a href=\"global.html#Status#.AUTHENTICATING\" class=\"!symbol-index-name\">Status.<wbr>AUTHENTICATING</a>\n            </dt>\n            <dd>\n            </dd>\n    </dl>\n</div>\n\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n            <dt class=\"symbol-index-name\">\n                <a href=\"global.html#Status#.INITIALIZING\" class=\"!symbol-index-name\">Status.<wbr>INITIALIZING</a>\n            </dt>\n            <dd>\n            </dd>\n    </dl>\n</div>\n\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n            <dt class=\"symbol-index-name\">\n                <a href=\"global.html#Status#.READY\" class=\"!symbol-index-name\">Status.<wbr>READY</a>\n            </dt>\n            <dd>\n            </dd>\n    </dl>\n</div>\n\n                </div>\n            </div>\n        </section>\n        <section>\n            <div class=\"symbol-index-content\">\n                <h2 id=\"Util\">Util</h2>\n                <div class=\"symbol-index-section\">\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n            <dt class=\"symbol-index-name\">\n                <a href=\"Util.html\" class=\"!symbol-index-name\">Util()</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Util.html#.formatImageToWebpSticker\" class=\"!symbol-index-name\">Util.<wbr>formatImageToWebpSticker(media)</a>\n            </dt>\n            <dd>\n            </dd>\n    </dl>\n</div>\n\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n            <dt class=\"symbol-index-name\">\n                <a href=\"Util.html#.formatToWebpSticker\" class=\"!symbol-index-name\">Util.<wbr>formatToWebpSticker(media, metadata)</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"Util.html#.formatVideoToWebpSticker\" class=\"!symbol-index-name\">Util.<wbr>formatVideoToWebpSticker(media)</a>\n            </dt>\n            <dd>\n            </dd>\n    </dl>\n</div>\n\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n            <dt class=\"symbol-index-name\">\n                <a href=\"Util.html#.setFfmpegPath\" class=\"!symbol-index-name\">Util.<wbr>setFfmpegPath(path)</a>\n            </dt>\n            <dd>\n            </dd>\n    </dl>\n</div>\n\n                </div>\n            </div>\n        </section>\n        <section>\n            <div class=\"symbol-index-content\">\n                <h2 id=\"WAState\">WAState</h2>\n                <div class=\"symbol-index-section\">\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n            <dt class=\"symbol-index-name\">\n                <a href=\"global.html#WAState#.CONFLICT\" class=\"!symbol-index-name\">WAState.<wbr>CONFLICT</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"global.html#WAState#.CONNECTED\" class=\"!symbol-index-name\">WAState.<wbr>CONNECTED</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"global.html#WAState#.DEPRECATED_VERSION\" class=\"!symbol-index-name\">WAState.<wbr>DEPRECATED_VERSION</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"global.html#WAState#.OPENING\" class=\"!symbol-index-name\">WAState.<wbr>OPENING</a>\n            </dt>\n            <dd>\n            </dd>\n    </dl>\n</div>\n\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n            <dt class=\"symbol-index-name\">\n                <a href=\"global.html#WAState#.PAIRING\" class=\"!symbol-index-name\">WAState.<wbr>PAIRING</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"global.html#WAState#.PROXYBLOCK\" class=\"!symbol-index-name\">WAState.<wbr>PROXYBLOCK</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"global.html#WAState#.SMB_TOS_BLOCK\" class=\"!symbol-index-name\">WAState.<wbr>SMB_TOS_BLOCK</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"global.html#WAState#.TIMEOUT\" class=\"!symbol-index-name\">WAState.<wbr>TIMEOUT</a>\n            </dt>\n            <dd>\n            </dd>\n    </dl>\n</div>\n\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n            <dt class=\"symbol-index-name\">\n                <a href=\"global.html#WAState#.TOS_BLOCK\" class=\"!symbol-index-name\">WAState.<wbr>TOS_BLOCK</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"global.html#WAState#.UNLAUNCHED\" class=\"!symbol-index-name\">WAState.<wbr>UNLAUNCHED</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"global.html#WAState#.UNPAIRED\" class=\"!symbol-index-name\">WAState.<wbr>UNPAIRED</a>\n            </dt>\n            <dd>\n            </dd>\n            <dt class=\"symbol-index-name\">\n                <a href=\"global.html#WAState#.UNPAIRED_IDLE\" class=\"!symbol-index-name\">WAState.<wbr>UNPAIRED_IDLE</a>\n            </dt>\n            <dd>\n            </dd>\n    </dl>\n</div>\n\n                </div>\n            </div>\n        </section>\n        <section>\n            <div class=\"symbol-index-content\">\n                <h2 id=\"WebCache\">WebCache</h2>\n                <div class=\"symbol-index-section\">\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n            <dt class=\"symbol-index-name\">\n                <a href=\"WebCache.html\" class=\"!symbol-index-name\">WebCache()</a>\n            </dt>\n            <dd>\n            </dd>\n    </dl>\n</div>\n\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n    </dl>\n</div>\n\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n    </dl>\n</div>\n\n                </div>\n            </div>\n        </section>\n        <section>\n            <div class=\"symbol-index-content\">\n                <h2 id=\"window\">window</h2>\n                <div class=\"symbol-index-section\">\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n            <dt class=\"symbol-index-name\">\n                <a href=\"window.html#.compareWwebVersions\" class=\"!symbol-index-name\">window.<wbr>compareWwebVersions(lOperand, operator, rOperand)</a>\n            </dt>\n            <dd>\n            </dd>\n    </dl>\n</div>\n\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n            <dt class=\"symbol-index-name\">\n                <a href=\"window.html#.injectToFunction\" class=\"!symbol-index-name\">window.<wbr>injectToFunction(target, callback)</a>\n            </dt>\n            <dd>\n            </dd>\n    </dl>\n</div>\n\n                            <div class=\"symbol-index-column\">\n    <dl class=\"symbol-index-list\">\n    </dl>\n</div>\n\n                </div>\n            </div>\n        </section>\n</div>\n\n                                        </div>\n                                </div>\n                                <nav id=\"jsdoc-toc-nav\" role=\"navigation\"></nav>\n                        </div>\n                </div>\n                    <footer id=\"jsdoc-footer\" class=\"jsdoc-footer\">\n                            <div id=\"jsdoc-footer-container\">\n                                    <p>\n                                      Generated by <a href=\"https://github.com/jsdoc3/jsdoc\">JSDoc</a> 3.6.11 on January 30, 2026.\n                                    </p>\n                            </div>\n                    </footer>\n                <script src=\"scripts/jquery.min.js\"></script>\n                <script src=\"scripts/tree.jquery.js\"></script>\n                <script src=\"scripts/prettify.js\"></script>\n                <script src=\"scripts/jsdoc-toc.js\"></script>\n                <script src=\"scripts/linenumber.js\"></script>\n                <script src=\"scripts/scrollanchor.js\"></script>\n        </body>\n</html>\n"
  },
  {
    "path": "docs/scripts/jsdoc-toc.js",
    "content": "(function($) {\n    // TODO: make the node ID configurable\n    var treeNode = $('#jsdoc-toc-nav');\n\n    // initialize the tree\n    treeNode.tree({\n        autoEscape: false,\n        closedIcon: '&#x21e2;',\n        data: [{\"label\":\"<a href=\\\"global.html\\\">Globals</a>\",\"id\":\"global\",\"children\":[]},{\"label\":\"<a href=\\\"Base.html\\\">Base</a>\",\"id\":\"Base\",\"children\":[]},{\"label\":\"<a href=\\\"BaseAuthStrategy.html\\\">BaseAuthStrategy</a>\",\"id\":\"BaseAuthStrategy\",\"children\":[]},{\"label\":\"<a href=\\\"Broadcast.html\\\">Broadcast</a>\",\"id\":\"Broadcast\",\"children\":[]},{\"label\":\"<a href=\\\"BusinessContact.html\\\">BusinessContact</a>\",\"id\":\"BusinessContact\",\"children\":[]},{\"label\":\"<a href=\\\"Buttons.html\\\">Buttons</a>\",\"id\":\"Buttons\",\"children\":[]},{\"label\":\"<a href=\\\"Call.html\\\">Call</a>\",\"id\":\"Call\",\"children\":[]},{\"label\":\"<a href=\\\"Channel.html\\\">Channel</a>\",\"id\":\"Channel\",\"children\":[]},{\"label\":\"<a href=\\\"Chat.html\\\">Chat</a>\",\"id\":\"Chat\",\"children\":[]},{\"label\":\"<a href=\\\"Client.html\\\">Client</a>\",\"id\":\"Client\",\"children\":[]},{\"label\":\"<a href=\\\"ClientInfo.html\\\">ClientInfo</a>\",\"id\":\"ClientInfo\",\"children\":[]},{\"label\":\"<a href=\\\"Contact.html\\\">Contact</a>\",\"id\":\"Contact\",\"children\":[]},{\"label\":\"<a href=\\\"GroupChat.html\\\">GroupChat</a>\",\"id\":\"GroupChat\",\"children\":[]},{\"label\":\"<a href=\\\"GroupNotification.html\\\">GroupNotification</a>\",\"id\":\"GroupNotification\",\"children\":[]},{\"label\":\"<a href=\\\"InterfaceController.html\\\">InterfaceController</a>\",\"id\":\"InterfaceController\",\"children\":[]},{\"label\":\"<a href=\\\"Label.html\\\">Label</a>\",\"id\":\"Label\",\"children\":[]},{\"label\":\"<a href=\\\"List.html\\\">List</a>\",\"id\":\"List\",\"children\":[]},{\"label\":\"<a href=\\\"LocalAuth.html\\\">LocalAuth</a>\",\"id\":\"LocalAuth\",\"children\":[]},{\"label\":\"<a href=\\\"LocalWebCache.html\\\">LocalWebCache</a>\",\"id\":\"LocalWebCache\",\"children\":[]},{\"label\":\"<a href=\\\"Location.html\\\">Location</a>\",\"id\":\"Location\",\"children\":[]},{\"label\":\"<a href=\\\"Message.html\\\">Message</a>\",\"id\":\"Message\",\"children\":[]},{\"label\":\"<a href=\\\"MessageMedia.html\\\">MessageMedia</a>\",\"id\":\"MessageMedia\",\"children\":[]},{\"label\":\"<a href=\\\"NoAuth.html\\\">NoAuth</a>\",\"id\":\"NoAuth\",\"children\":[]},{\"label\":\"<a href=\\\"Order.html\\\">Order</a>\",\"id\":\"Order\",\"children\":[]},{\"label\":\"<a href=\\\"Poll.html\\\">Poll</a>\",\"id\":\"Poll\",\"children\":[]},{\"label\":\"<a href=\\\"PollVote.html\\\">PollVote</a>\",\"id\":\"PollVote\",\"children\":[]},{\"label\":\"<a href=\\\"PrivateChat.html\\\">PrivateChat</a>\",\"id\":\"PrivateChat\",\"children\":[]},{\"label\":\"<a href=\\\"PrivateContact.html\\\">PrivateContact</a>\",\"id\":\"PrivateContact\",\"children\":[]},{\"label\":\"<a href=\\\"Product.html\\\">Product</a>\",\"id\":\"Product\",\"children\":[]},{\"label\":\"<a href=\\\"Reaction.html\\\">Reaction</a>\",\"id\":\"Reaction\",\"children\":[]},{\"label\":\"<a href=\\\"RemoteAuth.html\\\">RemoteAuth</a>\",\"id\":\"RemoteAuth\",\"children\":[]},{\"label\":\"<a href=\\\"RemoteWebCache.html\\\">RemoteWebCache</a>\",\"id\":\"RemoteWebCache\",\"children\":[]},{\"label\":\"<a href=\\\"ScheduledEvent.html\\\">ScheduledEvent</a>\",\"id\":\"ScheduledEvent\",\"children\":[]},{\"label\":\"<a href=\\\"Util.html\\\">Util</a>\",\"id\":\"Util\",\"children\":[]},{\"label\":\"<a href=\\\"WebCache.html\\\">WebCache</a>\",\"id\":\"WebCache\",\"children\":[]}],\n        openedIcon: ' &#x21e3;',\n        saveState: false,\n        useContextMenu: false\n    });\n\n    // add event handlers\n    // TODO\n})(jQuery);\n"
  },
  {
    "path": "docs/scripts/lang-css.js",
    "content": "PR.registerLangHandler(PR.createSimpleLexer([[PR.PR_PLAIN,/^[ \\t\\r\\n\\f]+/,null,\" \\t\\r\\n\\f\"]],[[PR.PR_STRING,/^\\\"(?:[^\\n\\r\\f\\\\\\\"]|\\\\(?:\\r\\n?|\\n|\\f)|\\\\[\\s\\S])*\\\"/,null],[PR.PR_STRING,/^\\'(?:[^\\n\\r\\f\\\\\\']|\\\\(?:\\r\\n?|\\n|\\f)|\\\\[\\s\\S])*\\'/,null],[\"lang-css-str\",/^url\\(([^\\)\\\"\\']+)\\)/i],[PR.PR_KEYWORD,/^(?:url|rgb|\\!important|@import|@page|@media|@charset|inherit)(?=[^\\-\\w]|$)/i,null],[\"lang-css-kw\",/^(-?(?:[_a-z]|(?:\\\\[0-9a-f]+ ?))(?:[_a-z0-9\\-]|\\\\(?:\\\\[0-9a-f]+ ?))*)\\s*:/i],[PR.PR_COMMENT,/^\\/\\*[^*]*\\*+(?:[^\\/*][^*]*\\*+)*\\//],[PR.PR_COMMENT,/^(?:<!--|-->)/],[PR.PR_LITERAL,/^(?:\\d+|\\d*\\.\\d+)(?:%|[a-z]+)?/i],[PR.PR_LITERAL,/^#(?:[0-9a-f]{3}){1,2}\\b/i],[PR.PR_PLAIN,/^-?(?:[_a-z]|(?:\\\\[\\da-f]+ ?))(?:[_a-z\\d\\-]|\\\\(?:\\\\[\\da-f]+ ?))*/i],[PR.PR_PUNCTUATION,/^[^\\s\\w\\'\\\"]+/]]),[\"css\"]),PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_KEYWORD,/^-?(?:[_a-z]|(?:\\\\[\\da-f]+ ?))(?:[_a-z\\d\\-]|\\\\(?:\\\\[\\da-f]+ ?))*/i]]),[\"css-kw\"]),PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_STRING,/^[^\\)\\\"\\']+/]]),[\"css-str\"]);"
  },
  {
    "path": "docs/scripts/linenumber.js",
    "content": "!function(){var n,e=0,t=document.getElementsByClassName(\"prettyprint\");t&&t[0]&&(n=(n=(t=t[0].getElementsByTagName(\"code\")[0]).innerHTML.split(\"\\n\")).map(function(n){return'<span id=\"source-line-'+ ++e+'\" class=\"line\"></span>'+n}),t.innerHTML=n.join(\"\\n\"))}();"
  },
  {
    "path": "docs/scripts/prettify.js",
    "content": "var DecorationsT,JobT,SourceSpansT,HACK_TO_FIX_JS_INCLUDE_PL,PR,prettyPrintOne,prettyPrint,IN_GLOBAL_SCOPE=!1;window.PR_SHOULD_USE_CONTINUATION=!0,function(){var T=window,e=[\"break,continue,do,else,for,if,return,while\"],n=[[e,\"auto,case,char,const,default,double,enum,extern,float,goto,inline,int,long,register,restrict,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile\"],\"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof\"],t=[n,\"alignas,alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,delegate,dynamic_cast,explicit,export,friend,generic,late_check,mutable,namespace,noexcept,noreturn,nullptr,property,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where\"],r=[n,\"abstract,assert,boolean,byte,extends,finally,final,implements,import,instanceof,interface,null,native,package,strictfp,super,synchronized,throws,transient\"],a=[n,\"abstract,add,alias,as,ascending,async,await,base,bool,by,byte,checked,decimal,delegate,descending,dynamic,event,finally,fixed,foreach,from,get,global,group,implicit,in,interface,internal,into,is,join,let,lock,null,object,out,override,orderby,params,partial,readonly,ref,remove,sbyte,sealed,select,set,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,value,var,virtual,where,yield\"],s=[n,\"abstract,async,await,constructor,debugger,enum,eval,export,function,get,implements,instanceof,interface,let,null,set,undefined,var,with,yield,Infinity,NaN\"],l=\"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END\",i=[e,\"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None\"],o=[e,\"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END\"],u=[e,\"case,done,elif,esac,eval,fi,function,in,local,set,then,until\"],c=/^(DIR|FILE|array|vector|(de|priority_)?queue|(forward_)?list|stack|(const_)?(reverse_)?iterator|(unordered_)?(multi)?(set|map)|bitset|u?(int|float)\\d*)\\b/,d=\"str\",p=\"com\",f=\"typ\",g=\"lit\",h=\"pun\",P=\"pln\",E=\"src\",m=\"atv\";function L(e,n,t,r,a){if(t){var s={sourceNode:e,pre:1,langExtension:null,numberLines:null,sourceCode:t,spans:null,basePos:n,decorations:null};r(s),a.push.apply(a,s.decorations)}}var v=/\\S/;function k(e){for(var n=void 0,t=e.firstChild;t;t=t.nextSibling){var r=t.nodeType;n=1===r?n?e:t:3===r&&v.test(t.nodeValue)?e:n}return n===e?void 0:n}function y(c,w){var S,C={};!function(){for(var e=c.concat(w),n=[],t={},r=0,a=e.length;r<a;++r){var s=e[r],l=s[3];if(l)for(var i=l.length;0<=--i;)C[l.charAt(i)]=s;var o=s[1],u=\"\"+o;t.hasOwnProperty(u)||(n.push(o),t[u]=null)}n.push(/[\\0-\\uffff]/),S=function(e){for(var u=0,c=!1,n=!1,t=0,r=e.length;t<r;++t)if((i=e[t]).ignoreCase)n=!0;else if(/[a-z]/i.test(i.source.replace(/\\\\u[0-9a-f]{4}|\\\\x[0-9a-f]{2}|\\\\[^ux]/gi,\"\"))){n=!(c=!0);break}var a={b:8,t:9,n:10,v:11,f:12,r:13};function f(e){var n=e.charCodeAt(0);if(92!==n)return n;var t=e.charAt(1);return(n=a[t])||(\"0\"<=t&&t<=\"7\"?parseInt(e.substring(1),8):\"u\"===t||\"x\"===t?parseInt(e.substring(2),16):e.charCodeAt(1))}function g(e){if(e<32)return(e<16?\"\\\\x0\":\"\\\\x\")+e.toString(16);var n=String.fromCharCode(e);return\"\\\\\"===n||\"-\"===n||\"]\"===n||\"^\"===n?\"\\\\\"+n:n}function d(e){var n=e.substring(1,e.length-1).match(new RegExp(\"\\\\\\\\u[0-9A-Fa-f]{4}|\\\\\\\\x[0-9A-Fa-f]{2}|\\\\\\\\[0-3][0-7]{0,2}|\\\\\\\\[0-7]{1,2}|\\\\\\\\[\\\\s\\\\S]|-|[^-\\\\\\\\]\",\"g\")),t=[],r=\"^\"===n[0],a=[\"[\"];r&&a.push(\"^\");for(var s=r?1:0,l=n.length;s<l;++s){var i=n[s];if(/\\\\[bdsw]/i.test(i))a.push(i);else{var o,u=f(i);s+2<l&&\"-\"===n[s+1]?(o=f(n[s+2]),s+=2):o=u,t.push([u,o]),o<65||122<u||(o<65||90<u||t.push([32|Math.max(65,u),32|Math.min(o,90)]),o<97||122<u||t.push([-33&Math.max(97,u),-33&Math.min(o,122)]))}}t.sort(function(e,n){return e[0]-n[0]||n[1]-e[1]});var c=[],d=[];for(s=0;s<t.length;++s)(p=t[s])[0]<=d[1]+1?d[1]=Math.max(d[1],p[1]):c.push(d=p);for(s=0;s<c.length;++s){var p=c[s];a.push(g(p[0])),p[1]>p[0]&&(p[1]+1>p[0]&&a.push(\"-\"),a.push(g(p[1])))}return a.push(\"]\"),a.join(\"\")}function s(e){for(var n=e.source.match(new RegExp(\"(?:\\\\[(?:[^\\\\x5C\\\\x5D]|\\\\\\\\[\\\\s\\\\S])*\\\\]|\\\\\\\\u[A-Fa-f0-9]{4}|\\\\\\\\x[A-Fa-f0-9]{2}|\\\\\\\\[0-9]+|\\\\\\\\[^ux0-9]|\\\\(\\\\?[:!=]|[\\\\(\\\\)\\\\^]|[^\\\\x5B\\\\x5C\\\\(\\\\)\\\\^]+)\",\"g\")),t=n.length,r=[],a=0,s=0;a<t;++a)\"(\"===(i=n[a])?++s:\"\\\\\"===i.charAt(0)&&(l=+i.substring(1))&&(l<=s?r[l]=-1:n[a]=g(l));for(a=1;a<r.length;++a)-1===r[a]&&(r[a]=++u);for(s=a=0;a<t;++a)if(\"(\"===(i=n[a]))r[++s]||(n[a]=\"(?:\");else if(\"\\\\\"===i.charAt(0)){var l;(l=+i.substring(1))&&l<=s&&(n[a]=\"\\\\\"+r[l])}for(a=0;a<t;++a)\"^\"===n[a]&&\"^\"!==n[a+1]&&(n[a]=\"\");if(e.ignoreCase&&c)for(a=0;a<t;++a){var i,o=(i=n[a]).charAt(0);2<=i.length&&\"[\"===o?n[a]=d(i):\"\\\\\"!==o&&(n[a]=i.replace(/[a-zA-Z]/g,function(e){var n=e.charCodeAt(0);return\"[\"+String.fromCharCode(-33&n,32|n)+\"]\"}))}return n.join(\"\")}var l=[];for(t=0,r=e.length;t<r;++t){var i;if((i=e[t]).global||i.multiline)throw new Error(\"\"+i);l.push(\"(?:\"+s(i)+\")\")}return new RegExp(l.join(\"|\"),n?\"gi\":\"g\")}(n)}();var N=w.length,_=function(e){for(var n=e.sourceCode,t=e.basePos,r=e.sourceNode,a=[t,P],s=0,l=n.match(S)||[],i={},o=0,u=l.length;o<u;++o){var c,d=l[o],p=i[d],f=void 0;if(\"string\"==typeof p)c=!1;else{var g=C[d.charAt(0)];if(g)f=d.match(g[1]),p=g[0];else{for(var h=0;h<N;++h)if(g=w[h],f=d.match(g[1])){p=g[0];break}f||(p=P)}!(c=5<=p.length&&\"lang-\"===p.substring(0,5))||f&&\"string\"==typeof f[1]||(c=!1,p=E),c||(i[d]=p)}var m=s;if(s+=d.length,c){var v=f[1],y=d.indexOf(v),b=y+v.length;f[2]&&(y=(b=d.length-f[2].length)-v.length);var x=p.substring(5);L(r,t+m,d.substring(0,y),_,a),L(r,t+m+y,v,A(x,v),a),L(r,t+m+b,d.substring(b),_,a)}else a.push(t+m,p)}e.decorations=a};return _}function b(e){var n=[],t=[];e.tripleQuotedStrings?n.push([d,/^(?:\\'\\'\\'(?:[^\\'\\\\]|\\\\[\\s\\S]|\\'{1,2}(?=[^\\']))*(?:\\'\\'\\'|$)|\\\"\\\"\\\"(?:[^\\\"\\\\]|\\\\[\\s\\S]|\\\"{1,2}(?=[^\\\"]))*(?:\\\"\\\"\\\"|$)|\\'(?:[^\\\\\\']|\\\\[\\s\\S])*(?:\\'|$)|\\\"(?:[^\\\\\\\"]|\\\\[\\s\\S])*(?:\\\"|$))/,null,\"'\\\"\"]):e.multiLineStrings?n.push([d,/^(?:\\'(?:[^\\\\\\']|\\\\[\\s\\S])*(?:\\'|$)|\\\"(?:[^\\\\\\\"]|\\\\[\\s\\S])*(?:\\\"|$)|\\`(?:[^\\\\\\`]|\\\\[\\s\\S])*(?:\\`|$))/,null,\"'\\\"`\"]):n.push([d,/^(?:\\'(?:[^\\\\\\'\\r\\n]|\\\\.)*(?:\\'|$)|\\\"(?:[^\\\\\\\"\\r\\n]|\\\\.)*(?:\\\"|$))/,null,\"\\\"'\"]),e.verbatimStrings&&t.push([d,/^@\\\"(?:[^\\\"]|\\\"\\\")*(?:\\\"|$)/,null]);var r=e.hashComments;r&&(e.cStyleComments?(1<r?n.push([p,/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,null,\"#\"]):n.push([p,/^#(?:(?:define|e(?:l|nd)if|else|error|ifn?def|include|line|pragma|undef|warning)\\b|[^\\r\\n]*)/,null,\"#\"]),t.push([d,/^<(?:(?:(?:\\.\\.\\/)*|\\/?)(?:[\\w-]+(?:\\/[\\w-]+)+)?[\\w-]+\\.h(?:h|pp|\\+\\+)?|[a-z]\\w*)>/,null])):n.push([p,/^#[^\\r\\n]*/,null,\"#\"])),e.cStyleComments&&(t.push([p,/^\\/\\/[^\\r\\n]*/,null]),t.push([p,/^\\/\\*[\\s\\S]*?(?:\\*\\/|$)/,null]));var a=e.regexLiterals;if(a){var s=1<a?\"\":\"\\n\\r\",l=s?\".\":\"[\\\\S\\\\s]\",i=\"/(?=[^/*\"+s+\"])(?:[^/\\\\x5B\\\\x5C\"+s+\"]|\\\\x5C\"+l+\"|\\\\x5B(?:[^\\\\x5C\\\\x5D\"+s+\"]|\\\\x5C\"+l+\")*(?:\\\\x5D|$))+/\";t.push([\"lang-regex\",RegExp(\"^(?:^^\\\\.?|[+-]|[!=]=?=?|\\\\#|%=?|&&?=?|\\\\(|\\\\*=?|[+\\\\-]=|->|\\\\/=?|::?|<<?=?|>>?>?=?|,|;|\\\\?|@|\\\\[|~|{|\\\\^\\\\^?=?|\\\\|\\\\|?=?|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\\\s*(\"+i+\")\")])}var o=e.types;o&&t.push([f,o]);var u=(\"\"+e.keywords).replace(/^ | $/g,\"\");u.length&&t.push([\"kwd\",new RegExp(\"^(?:\"+u.replace(/[\\s,]+/g,\"|\")+\")\\\\b\"),null]),n.push([P,/^\\s+/,null,\" \\r\\n\\t \"]);var c=\"^.[^\\\\s\\\\w.$@'\\\"`/\\\\\\\\]*\";return e.regexLiterals&&(c+=\"(?!s*/)\"),t.push([g,/^@[a-z_$][a-z_$@0-9]*/i,null],[f,/^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\\w+_t\\b)/,null],[P,/^[a-z_$][a-z_$@0-9]*/i,null],[g,new RegExp(\"^(?:0x[a-f0-9]+|(?:\\\\d(?:_\\\\d+)*\\\\d*(?:\\\\.\\\\d*)?|\\\\.\\\\d\\\\+)(?:e[+\\\\-]?\\\\d+)?)[a-z]*\",\"i\"),null,\"0123456789\"],[P,/^\\\\[\\s\\S]?/,null],[h,new RegExp(c),null]),y(n,t)}var x=b({keywords:[t,a,r,s,l,i,o,u],hashComments:!0,cStyleComments:!0,multiLineStrings:!0,regexLiterals:!0});function R(e,n,i){for(var o=/(?:^|\\s)nocode(?:\\s|$)/,u=/\\r\\n?|\\n/,c=e.ownerDocument,t=c.createElement(\"li\");e.firstChild;)t.appendChild(e.firstChild);var r=[t];function d(e){var n=e.nodeType;if(1!=n||o.test(e.className)){if((3==n||4==n)&&i){var t=e.nodeValue,r=t.match(u);if(r){var a=t.substring(0,r.index);e.nodeValue=a;var s=t.substring(r.index+r[0].length);if(s)e.parentNode.insertBefore(c.createTextNode(s),e.nextSibling);p(e),a||e.parentNode.removeChild(e)}}}else if(\"br\"===e.nodeName)p(e),e.parentNode&&e.parentNode.removeChild(e);else for(var l=e.firstChild;l;l=l.nextSibling)d(l)}function p(e){for(;!e.nextSibling;)if(!(e=e.parentNode))return;for(var n,t=function e(n,t){var r=t?n.cloneNode(!1):n,a=n.parentNode;if(a){var s=e(a,1),l=n.nextSibling;s.appendChild(r);for(var i=l;i;i=l)l=i.nextSibling,s.appendChild(i)}return r}(e.nextSibling,0);(n=t.parentNode)&&1===n.nodeType;)t=n;r.push(t)}for(var a=0;a<r.length;++a)d(r[a]);n===(0|n)&&r[0].setAttribute(\"value\",n);var s=c.createElement(\"ol\");s.className=\"linenums\";for(var l=Math.max(0,n-1|0)||0,f=(a=0,r.length);a<f;++a)(t=r[a]).className=\"L\"+(a+l)%10,t.firstChild||t.appendChild(c.createTextNode(\" \")),s.appendChild(t);e.appendChild(s)}var w={};function S(e,n){for(var t=n.length;0<=--t;){var r=n[t];w.hasOwnProperty(r)?T.console&&console.warn(\"cannot override language handler %s\",r):w[r]=e}}function A(e,n){return e&&w.hasOwnProperty(e)||(e=/^\\s*</.test(n)?\"default-markup\":\"default-code\"),w[e]}function $(e){var n=e.langExtension;try{var t=function(e,l){var i=/(?:^|\\s)nocode(?:\\s|$)/,o=[],u=0,c=[],d=0;return function e(n){var t=n.nodeType;if(1==t){if(i.test(n.className))return;for(var r=n.firstChild;r;r=r.nextSibling)e(r);var a=n.nodeName.toLowerCase();\"br\"!==a&&\"li\"!==a||(o[d]=\"\\n\",c[d<<1]=u++,c[d++<<1|1]=n)}else if(3==t||4==t){var s=n.nodeValue;s.length&&(s=l?s.replace(/\\r\\n?/g,\"\\n\"):s.replace(/[ \\t\\r\\n]+/g,\" \"),o[d]=s,c[d<<1]=u,u+=s.length,c[d++<<1|1]=n)}}(e),{sourceCode:o.join(\"\").replace(/\\n$/,\"\"),spans:c}}(e.sourceNode,e.pre),r=t.sourceCode;e.sourceCode=r,e.spans=t.spans,e.basePos=0,A(n,r)(e),function(e){var n=/\\bMSIE\\s(\\d+)/.exec(navigator.userAgent);n=n&&+n[1]<=8;var t,r,a=/\\n/g,s=e.sourceCode,l=s.length,i=0,o=e.spans,u=o.length,c=0,d=e.decorations,p=d.length,f=0;for(d[p]=l,r=t=0;r<p;)d[r]!==d[r+2]?(d[t++]=d[r++],d[t++]=d[r++]):r+=2;for(p=t,r=t=0;r<p;){for(var g=d[r],h=d[r+1],m=r+2;m+2<=p&&d[m+1]===h;)m+=2;d[t++]=g,d[t++]=h,r=m}p=d.length=t;var v=e.sourceNode,y=\"\";v&&(y=v.style.display,v.style.display=\"none\");try{for(;c<u;){o[c];var b,x=o[c+2]||l,w=d[f+2]||l,S=(m=Math.min(x,w),o[c+1]);if(1!==S.nodeType&&(b=s.substring(i,m))){n&&(b=b.replace(a,\"\\r\")),S.nodeValue=b;var C=S.ownerDocument,N=C.createElement(\"span\");N.className=d[f+1];var _=S.parentNode;_.replaceChild(N,S),N.appendChild(S),i<x&&(o[c+1]=S=C.createTextNode(s.substring(m,x)),_.insertBefore(S,N.nextSibling))}x<=(i=m)&&(c+=2),w<=i&&(f+=2)}}finally{v&&(v.style.display=y)}}(e)}catch(e){T.console&&console.log(e&&e.stack||e)}}function C(e,n,t){var r=t||!1,a=n||null,s=document.createElement(\"div\");return s.innerHTML=\"<pre>\"+e+\"</pre>\",s=s.firstChild,r&&R(s,r,!0),$({langExtension:a,numberLines:r,sourceNode:s,pre:1,sourceCode:null,basePos:null,spans:null,decorations:null}),s.innerHTML}function N(y,e){var n=e||document.body,b=n.ownerDocument||document;function t(e){return n.getElementsByTagName(e)}for(var r=[t(\"pre\"),t(\"code\"),t(\"xmp\")],x=[],a=0;a<r.length;++a)for(var s=0,l=r[a].length;s<l;++s)x.push(r[a][s]);r=null;var w=Date;w.now||(w={now:function(){return+new Date}});var S=0,C=/\\blang(?:uage)?-([\\w.]+)(?!\\S)/,N=/\\bprettyprint\\b/,_=/\\bprettyprinted\\b/,P=/pre|xmp/i,E=/^code$/i,L=/^(?:pre|code|xmp)$/i,A={};!function e(){for(var n=T.PR_SHOULD_USE_CONTINUATION?w.now()+250:1/0;S<x.length&&w.now()<n;S++){for(var t=x[S],r=A,a=t;a=a.previousSibling;){var s=a.nodeType,l=(7===s||8===s)&&a.nodeValue;if(l?!/^\\??prettify\\b/.test(l):3!==s||/\\S/.test(a.nodeValue))break;if(l){r={},l.replace(/\\b(\\w+)=([\\w:.%+-]+)/g,function(e,n,t){r[n]=t});break}}var i=t.className;if((r!==A||N.test(i))&&!_.test(i)){for(var o=!1,u=t.parentNode;u;u=u.parentNode){var c=u.tagName;if(L.test(c)&&u.className&&N.test(u.className)){o=!0;break}}if(!o){t.className+=\" prettyprinted\";var d,p,f=r.lang;if(f||(!(f=i.match(C))&&(d=k(t))&&E.test(d.tagName)&&(f=d.className.match(C)),f&&(f=f[1])),P.test(t.tagName))p=1;else{var g=t.currentStyle,h=b.defaultView,m=g?g.whiteSpace:h&&h.getComputedStyle?h.getComputedStyle(t,null).getPropertyValue(\"white-space\"):0;p=m&&\"pre\"===m.substring(0,3)}var v=r.linenums;(v=\"true\"===v||+v)||(v=!!(v=i.match(/\\blinenums\\b(?::(\\d+))?/))&&(!v[1]||!v[1].length||+v[1])),v&&R(t,v,p),$({langExtension:f,sourceNode:t,numberLines:v,pre:p,sourceCode:null,basePos:null,spans:null,decorations:null})}}}S<x.length?T.setTimeout(e,250):\"function\"==typeof y&&y()}()}S(x,[\"default-code\"]),S(y([],[[P,/^[^<?]+/],[\"dec\",/^<!\\w[^>]*(?:>|$)/],[p,/^<\\!--[\\s\\S]*?(?:-\\->|$)/],[\"lang-\",/^<\\?([\\s\\S]+?)(?:\\?>|$)/],[\"lang-\",/^<%([\\s\\S]+?)(?:%>|$)/],[h,/^(?:<[%?]|[%?]>)/],[\"lang-\",/^<xmp\\b[^>]*>([\\s\\S]+?)<\\/xmp\\b[^>]*>/i],[\"lang-js\",/^<script\\b[^>]*>([\\s\\S]*?)(<\\/script\\b[^>]*>)/i],[\"lang-css\",/^<style\\b[^>]*>([\\s\\S]*?)(<\\/style\\b[^>]*>)/i],[\"lang-in.tag\",/^(<\\/?[a-z][^<>]*>)/i]]),[\"default-markup\",\"htm\",\"html\",\"mxml\",\"xhtml\",\"xml\",\"xsl\"]),S(y([[P,/^[\\s]+/,null,\" \\t\\r\\n\"],[m,/^(?:\\\"[^\\\"]*\\\"?|\\'[^\\']*\\'?)/,null,\"\\\"'\"]],[[\"tag\",/^^<\\/?[a-z](?:[\\w.:-]*\\w)?|\\/?>$/i],[\"atn\",/^(?!style[\\s=]|on)[a-z](?:[\\w:-]*\\w)?/i],[\"lang-uq.val\",/^=\\s*([^>\\'\\\"\\s]*(?:[^>\\'\\\"\\s\\/]|\\/(?=\\s)))/],[h,/^[=<>\\/]+/],[\"lang-js\",/^on\\w+\\s*=\\s*\\\"([^\\\"]+)\\\"/i],[\"lang-js\",/^on\\w+\\s*=\\s*\\'([^\\']+)\\'/i],[\"lang-js\",/^on\\w+\\s*=\\s*([^\\\"\\'>\\s]+)/i],[\"lang-css\",/^style\\s*=\\s*\\\"([^\\\"]+)\\\"/i],[\"lang-css\",/^style\\s*=\\s*\\'([^\\']+)\\'/i],[\"lang-css\",/^style\\s*=\\s*([^\\\"\\'>\\s]+)/i]]),[\"in.tag\"]),S(y([],[[m,/^[\\s\\S]+/]]),[\"uq.val\"]),S(b({keywords:t,hashComments:!0,cStyleComments:!0,types:c}),[\"c\",\"cc\",\"cpp\",\"cxx\",\"cyc\",\"m\"]),S(b({keywords:\"null,true,false\"}),[\"json\"]),S(b({keywords:a,hashComments:!0,cStyleComments:!0,verbatimStrings:!0,types:c}),[\"cs\"]),S(b({keywords:r,cStyleComments:!0}),[\"java\"]),S(b({keywords:u,hashComments:!0,multiLineStrings:!0}),[\"bash\",\"bsh\",\"csh\",\"sh\"]),S(b({keywords:i,hashComments:!0,multiLineStrings:!0,tripleQuotedStrings:!0}),[\"cv\",\"py\",\"python\"]),S(b({keywords:l,hashComments:!0,multiLineStrings:!0,regexLiterals:2}),[\"perl\",\"pl\",\"pm\"]),S(b({keywords:o,hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),[\"rb\",\"ruby\"]),S(b({keywords:s,cStyleComments:!0,regexLiterals:!0}),[\"javascript\",\"js\",\"ts\",\"typescript\"]),S(b({keywords:\"all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,throw,true,try,unless,until,when,while,yes\",hashComments:3,cStyleComments:!0,multilineStrings:!0,tripleQuotedStrings:!0,regexLiterals:!0}),[\"coffee\"]),S(y([],[[d,/^[\\s\\S]+/]]),[\"regex\"]);var _=T.PR={createSimpleLexer:y,registerLangHandler:S,sourceDecorator:b,PR_ATTRIB_NAME:\"atn\",PR_ATTRIB_VALUE:m,PR_COMMENT:p,PR_DECLARATION:\"dec\",PR_KEYWORD:\"kwd\",PR_LITERAL:g,PR_NOCODE:\"nocode\",PR_PLAIN:P,PR_PUNCTUATION:h,PR_SOURCE:E,PR_STRING:d,PR_TAG:\"tag\",PR_TYPE:f,prettyPrintOne:IN_GLOBAL_SCOPE?T.prettyPrintOne=C:prettyPrintOne=C,prettyPrint:prettyPrint=IN_GLOBAL_SCOPE?T.prettyPrint=N:prettyPrint=N},O=T.define;\"function\"==typeof O&&O.amd&&O(\"google-code-prettify\",[],function(){return _})}();"
  },
  {
    "path": "docs/scripts/scrollanchor.js",
    "content": "!function(){function o(n){var o,t,e=document.getElementById(n.replace(/^#/,\"\"));e&&(t=e.getBoundingClientRect(),o=t.top+window.pageYOffset,setTimeout(function(){window.scrollTo(0,o-50)},5))}window.addEventListener(\"load\",function(){var n=window.location.hash;n&&\"#\"!==n&&o(n),window.addEventListener(\"hashchange\",function(){o(window.location.hash)})})}();"
  },
  {
    "path": "docs/scripts/tree.jquery.js",
    "content": "!function(o){var n={};function r(e){if(n[e])return n[e].exports;var t=n[e]={i:e,l:!1,exports:{}};return o[e].call(t.exports,t,t.exports,r),t.l=!0,t.exports}r.m=o,r.c=n,r.d=function(e,t,o){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:o})},r.r=function(e){\"undefined\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\"Module\"}),Object.defineProperty(e,\"__esModule\",{value:!0})},r.t=function(t,e){if(1&e&&(t=r(t)),8&e)return t;if(4&e&&\"object\"==typeof t&&t&&t.__esModule)return t;var o=Object.create(null);if(r.r(o),Object.defineProperty(o,\"default\",{enumerable:!0,value:t}),2&e&&\"string\"!=typeof t)for(var n in t)r.d(o,n,function(e){return t[e]}.bind(null,n));return o},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,\"a\",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p=\"\",r(r.s=16)}([function(e,t,o){\"use strict\";var r,n;t.__esModule=!0,(n=r=t.Position||(t.Position={}))[n.Before=1]=\"Before\",n[n.After=2]=\"After\",n[n.Inside=3]=\"Inside\",n[n.None=4]=\"None\";var i={before:r.Before,after:r.After,inside:r.Inside,none:r.None};t.getPositionName=function(e){for(var t in i)if(i.hasOwnProperty(t)&&i[t]===e)return t;return\"\"},t.getPosition=function(e){return i[e]};var s=function(){function n(e,t,o){void 0===t&&(t=!1),void 0===o&&(o=n),this.name=\"\",this.setData(e),this.children=[],this.parent=null,t&&(this.idMapping={},(this.tree=this).nodeClass=o)}return n.prototype.setData=function(e){function t(e){null!=e&&(o.name=e)}var o=this;if(e)if(\"object\"!=typeof e)t(e);else for(var n in e)if(e.hasOwnProperty(n)){var r=e[n];\"label\"===n?t(r):\"children\"!==n&&(this[n]=r)}},n.prototype.loadFromData=function(e){this.removeChildren();for(var t=0,o=e;t<o.length;t++){var n=o[t],r=new this.tree.nodeClass(n);this.addChild(r),\"object\"==typeof n&&n.children&&r.loadFromData(n.children)}},n.prototype.addChild=function(e){this.children.push(e),e._setParent(this)},n.prototype.addChildAtPosition=function(e,t){this.children.splice(t,0,e),e._setParent(this)},n.prototype.removeChild=function(e){e.removeChildren(),this._removeChild(e)},n.prototype.getChildIndex=function(e){return jQuery.inArray(e,this.children)},n.prototype.hasChildren=function(){return 0!==this.children.length},n.prototype.isFolder=function(){return this.hasChildren()||this.load_on_demand},n.prototype.iterate=function(i){var s=function(e,t){if(e.children)for(var o=0,n=e.children;o<n.length;o++){var r=n[o];i(r,t)&&r.hasChildren()&&s(r,t+1)}};s(this,0)},n.prototype.moveNode=function(e,t,o){e.parent&&!e.isParentOf(t)&&(e.parent._removeChild(e),o===r.After?t.parent&&t.parent.addChildAtPosition(e,t.parent.getChildIndex(t)+1):o===r.Before?t.parent&&t.parent.addChildAtPosition(e,t.parent.getChildIndex(t)):o===r.Inside&&t.addChildAtPosition(e,0))},n.prototype.getData=function(e){return void 0===e&&(e=!1),function r(e){return e.map(function(e){var t={};for(var o in e)if(-1===[\"parent\",\"children\",\"element\",\"tree\"].indexOf(o)&&Object.prototype.hasOwnProperty.call(e,o)){var n=e[o];t[o]=n}return e.hasChildren()&&(t.children=r(e.children)),t})}(e?[this]:this.children)},n.prototype.getNodeByName=function(t){return this.getNodeByCallback(function(e){return e.name===t})},n.prototype.getNodeByCallback=function(t){var o=null;return this.iterate(function(e){return!t(e)||(o=e,!1)}),o},n.prototype.addAfter=function(e){if(this.parent){var t=new this.tree.nodeClass(e),o=this.parent.getChildIndex(this);return this.parent.addChildAtPosition(t,o+1),\"object\"==typeof e&&e.children&&e.children.length&&t.loadFromData(e.children),t}return null},n.prototype.addBefore=function(e){if(this.parent){var t=new this.tree.nodeClass(e),o=this.parent.getChildIndex(this);return this.parent.addChildAtPosition(t,o),\"object\"==typeof e&&e.children&&e.children.length&&t.loadFromData(e.children),t}return null},n.prototype.addParent=function(e){if(this.parent){var t=new this.tree.nodeClass(e);t._setParent(this.tree);for(var o=this.parent,n=0,r=o.children;n<r.length;n++){var i=r[n];t.addChild(i)}return o.children=[],o.addChild(t),t}return null},n.prototype.remove=function(){this.parent&&(this.parent.removeChild(this),this.parent=null)},n.prototype.append=function(e){var t=new this.tree.nodeClass(e);return this.addChild(t),\"object\"==typeof e&&e.children&&e.children.length&&t.loadFromData(e.children),t},n.prototype.prepend=function(e){var t=new this.tree.nodeClass(e);return this.addChildAtPosition(t,0),\"object\"==typeof e&&e.children&&e.children.length&&t.loadFromData(e.children),t},n.prototype.isParentOf=function(e){for(var t=e.parent;t;){if(t===this)return!0;t=t.parent}return!1},n.prototype.getLevel=function(){for(var e=0,t=this;t.parent;)e+=1,t=t.parent;return e},n.prototype.getNodeById=function(e){return this.idMapping[e]},n.prototype.addNodeToIndex=function(e){null!=e.id&&(this.idMapping[e.id]=e)},n.prototype.removeNodeFromIndex=function(e){null!=e.id&&delete this.idMapping[e.id]},n.prototype.removeChildren=function(){var t=this;this.iterate(function(e){return t.tree.removeNodeFromIndex(e),!0}),this.children=[]},n.prototype.getPreviousSibling=function(){if(this.parent){var e=this.parent.getChildIndex(this)-1;return 0<=e?this.parent.children[e]:null}return null},n.prototype.getNextSibling=function(){if(this.parent){var e=this.parent.getChildIndex(this)+1;return e<this.parent.children.length?this.parent.children[e]:null}return null},n.prototype.getNodesByProperty=function(t,o){return this.filter(function(e){return e[t]===o})},n.prototype.filter=function(t){var o=[];return this.iterate(function(e){return t(e)&&o.push(e),!0}),o},n.prototype.getNextNode=function(e){return void 0===e&&(e=!0),e&&this.hasChildren()&&this.is_open?this.children[0]:this.parent?this.getNextSibling()||this.parent.getNextNode(!1):null},n.prototype.getPreviousNode=function(){if(this.parent){var e=this.getPreviousSibling();return e?e.hasChildren()&&e.is_open?e.getLastChild():e:this.getParent()}return null},n.prototype.getParent=function(){return this.parent&&this.parent.parent?this.parent:null},n.prototype.getLastChild=function(){if(this.hasChildren()){var e=this.children[this.children.length-1];return e.hasChildren()&&e.is_open?e.getLastChild():e}return null},n.prototype.initFromData=function(e){var t,i=this;t=e,i.setData(t),t.children&&function(e){for(var t=0,o=e;t<o.length;t++){var n=o[t],r=new i.tree.nodeClass(\"\");r.initFromData(n),i.addChild(r)}}(t.children)},n.prototype._setParent=function(e){this.parent=e,this.tree=e.tree,this.tree.addNodeToIndex(this)},n.prototype._removeChild=function(e){this.children.splice(this.getChildIndex(e),1),this.tree.removeNodeFromIndex(e)},n}();t.Node=s},function(e,t,o){\"use strict\";t.__esModule=!0,t.isInt=function(e){return\"number\"==typeof e&&e%1==0},t.isFunction=function(e){return\"function\"==typeof e},t.htmlEscape=function(e){return(\"\"+e).replace(/&/g,\"&amp;\").replace(/</g,\"&lt;\").replace(/>/g,\"&gt;\").replace(/\"/g,\"&quot;\").replace(/'/g,\"&#x27;\").replace(/\\//g,\"&#x2F;\")},t.getBoolString=function(e){return e?\"true\":\"false\"}},function(e,t){e.exports=jQuery},function(e,t,o){\"use strict\";t.__esModule=!0;var n=function(){function u(e,t){this.$el=jQuery(e);var o=this.constructor.defaults;this.options=jQuery.extend({},o,t)}return u.register=function(a,e){function d(){return\"simple_widget_\"+e}function l(e,t){var o=jQuery.data(e,t);return o&&o instanceof u?o:null}jQuery.fn[e]=function(e){for(var t=[],o=1;o<arguments.length;o++)t[o-1]=arguments[o];if(void 0===e||\"object\"==typeof e)return function(e,t){for(var o=d(),n=0,r=e.get();n<r.length;n++){var i=r[n];if(!l(i,o)){var s=new a(i,t);jQuery.data(i,o)||jQuery.data(i,o,s),s._init()}}return e}(this,e);if(\"string\"==typeof e&&\"_\"!==e[0]){var n=e;return\"destroy\"===n?function(e){for(var t=d(),o=0,n=e.get();o<n.length;o++){var r=n[o],i=l(r,t);i&&i.destroy(),jQuery.removeData(r,t)}}(this):\"get_widget_class\"===n?a:function(e,t,o){for(var n=null,r=0,i=e.get();r<i.length;r++){var s=i[r],a=jQuery.data(s,d());if(a&&a instanceof u){var l=a[t];l&&\"function\"==typeof l&&(n=l.apply(a,o))}}return n}(this,n,t)}}},u.prototype.destroy=function(){this._deinit()},u.prototype._init=function(){},u.prototype._deinit=function(){},u.defaults={},u}();t.default=n},function(e,t,o){\"use strict\";var n,r=this&&this.__extends||(n=function(e,t){return(n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var o in t)t.hasOwnProperty(o)&&(e[o]=t[o])})(e,t)},function(e,t){function o(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(o.prototype=t.prototype,new o)}),l=this&&this.__assign||function(){return(l=Object.assign||function(e){for(var t,o=1,n=arguments.length;o<n;o++)for(var r in t=arguments[o])Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r]);return e}).apply(this,arguments)};t.__esModule=!0;var i=o(5),s=o(2),a=o(6),d=o(7),u=o(8),h=o(9),p=o(10),c=o(11),f=o(12),g=o(13),m=o(3),v=o(0),y=o(1),_=o(14),N=\"Node parameter is empty\",S=function(e){function t(){var n=null!==e&&e.apply(this,arguments)||this;return n._handleClick=function(e){var t=n._getClickTarget(e.target);if(t)if(\"button\"===t.type)n.toggle(t.node,n.options.slide),e.preventDefault(),e.stopPropagation();else if(\"label\"===t.type){var o=t.node;n._triggerEvent(\"tree.click\",{node:o,click_event:e}).isDefaultPrevented()||n._selectNode(o)}},n._handleDblclick=function(e){var t=n._getClickTarget(e.target);t&&\"label\"===t.type&&n._triggerEvent(\"tree.dblclick\",{node:t.node,click_event:e})},n._handleContextmenu=function(e){var t=s(e.target).closest(\"ul.jqtree-tree .jqtree-element\");if(t.length){var o=n._getNode(t);if(o)return e.preventDefault(),e.stopPropagation(),n._triggerEvent(\"tree.contextmenu\",{node:o,click_event:e}),!1}return null},n}return r(t,e),t.prototype.toggle=function(e,t){if(!e)throw Error(N);var o=null==t?this.options.slide:t;return e.is_open?this.closeNode(e,o):this.openNode(e,o),this.element},t.prototype.getTree=function(){return this.tree},t.prototype.selectNode=function(e,t){return this._selectNode(e,t),this.element},t.prototype.getSelectedNode=function(){return!!this.selectNodeHandler&&this.selectNodeHandler.getSelectedNode()},t.prototype.toJson=function(){return JSON.stringify(this.tree.getData())},t.prototype.loadData=function(e,t){return this._loadData(e,t),this.element},t.prototype.loadDataFromUrl=function(e,t,o){return\"string\"==typeof e?this._loadDataFromUrl(e,t,o):this._loadDataFromUrl(null,e,t),this.element},t.prototype.reload=function(e){return this._loadDataFromUrl(null,null,e),this.element},t.prototype.getNodeById=function(e){return this.tree.getNodeById(e)},t.prototype.getNodeByName=function(e){return this.tree.getNodeByName(e)},t.prototype.getNodesByProperty=function(e,t){return this.tree.getNodesByProperty(e,t)},t.prototype.getNodeByHtmlElement=function(e){return this._getNode(s(e))},t.prototype.getNodeByCallback=function(e){return this.tree.getNodeByCallback(e)},t.prototype.openNode=function(e,t,o){var n=this;if(!e)throw Error(N);var r,i,s=(y.isFunction(t)?(r=t,i=null):(i=t,r=o),null==i&&(i=n.options.slide),[i,r]),a=s[0],l=s[1];return this._openNode(e,a,l),this.element},t.prototype.closeNode=function(e,t){if(!e)throw Error(N);var o=null==t?this.options.slide:t;return e.isFolder()&&(new _.FolderElement(e,this).close(o,this.options.animationSpeed),this._saveState()),this.element},t.prototype.isDragging=function(){return!!this.dndHandler&&this.dndHandler.isDragging},t.prototype.refreshHitAreas=function(){return this.dndHandler&&this.dndHandler.refresh(),this.element},t.prototype.addNodeAfter=function(e,t){var o=t.addAfter(e);return o&&this._refreshElements(t.parent),o},t.prototype.addNodeBefore=function(e,t){if(!t)throw Error(\"Parameter is empty: existingNode\");var o=t.addBefore(e);return o&&this._refreshElements(t.parent),o},t.prototype.addParentNode=function(e,t){if(!t)throw Error(\"Parameter is empty: existingNode\");var o=t.addParent(e);return o&&this._refreshElements(o.parent),o},t.prototype.removeNode=function(e){if(!e)throw Error(N);var t=e;return t.parent&&this.selectNodeHandler&&(this.selectNodeHandler.removeFromSelection(t,!0),t.remove(),this._refreshElements(t.parent)),this.element},t.prototype.appendNode=function(e,t){var o=t||this.tree,n=o.append(e);return this._refreshElements(o),n},t.prototype.prependNode=function(e,t){var o=t||this.tree,n=o.prepend(e);return this._refreshElements(o),n},t.prototype.updateNode=function(e,t){if(!e)throw Error(N);var o=t.id&&t.id!==e.id;return o&&this.tree.removeNodeFromIndex(e),e.setData(t),o&&this.tree.addNodeToIndex(e),\"object\"==typeof t&&t.children&&(e.removeChildren(),t.children.length&&e.loadFromData(t.children)),this._refreshElements(e),this._selectCurrentNode(),this.element},t.prototype.moveNode=function(e,t,o){if(!e)throw Error(N);if(!t)throw Error(\"Parameter is empty: targetNode\");var n=v.getPosition(o);return this.tree.moveNode(e,t,n),this._refreshElements(null),this.element},t.prototype.getStateFromStorage=function(){if(this.saveStateHandler)return this.saveStateHandler.getStateFromStorage()},t.prototype.addToSelection=function(e,t){if(!e)throw Error(N);var o=e;return this.selectNodeHandler&&(this.selectNodeHandler.addToSelection(o),this._getNodeElementForNode(o).select(void 0===t||t),this._saveState()),this.element},t.prototype.getSelectedNodes=function(){return this.selectNodeHandler?this.selectNodeHandler.getSelectedNodes():[]},t.prototype.isNodeSelected=function(e){if(!e)throw Error(N);return!!this.selectNodeHandler&&this.selectNodeHandler.isNodeSelected(e)},t.prototype.removeFromSelection=function(e){if(!e)throw Error(N);return this.selectNodeHandler&&(this.selectNodeHandler.removeFromSelection(e),this._getNodeElementForNode(e).deselect(),this._saveState()),this.element},t.prototype.scrollToNode=function(e){if(!e)throw Error(N);if(this.scrollHandler){var t=s(e.element).offset(),o=t?t.top:0,n=this.$el.offset(),r=o-(n?n.top:0);this.scrollHandler.scrollToY(r)}return this.element},t.prototype.getState=function(){if(this.saveStateHandler)return this.saveStateHandler.getState()},t.prototype.setState=function(e){return this.saveStateHandler&&(this.saveStateHandler.setInitialState(e),this._refreshElements(null)),this.element},t.prototype.setOption=function(e,t){return this.options[e]=t,this.element},t.prototype.moveDown=function(){return this.keyHandler&&this.keyHandler.moveDown(),this.element},t.prototype.moveUp=function(){return this.keyHandler&&this.keyHandler.moveUp(),this.element},t.prototype.getVersion=function(){return i.default},t.prototype.testGenerateHitAreas=function(e){return this.dndHandler?(this.dndHandler.currentItem=this._getNodeElementForNode(e),this.dndHandler.generateHitAreas(),this.dndHandler.hitAreas):[]},t.prototype._triggerEvent=function(e,t){var o=s.Event(e);return s.extend(o,t),this.element.trigger(o),o},t.prototype._openNode=function(e,t,o){var n=this;void 0===t&&(t=!0);function r(e,t,o){new _.FolderElement(e,n).open(o,t,n.options.animationSpeed)}if(e.isFolder())if(e.load_on_demand)this._loadFolderOnDemand(e,t,o);else{for(var i=e.parent;i;)i.parent&&r(i,!1,null),i=i.parent;r(e,t,o),this._saveState()}},t.prototype._refreshElements=function(e){this.renderer.render(e),this._triggerEvent(\"tree.refresh\")},t.prototype._getNodeElementForNode=function(e){return e.isFolder()?new _.FolderElement(e,this):new _.NodeElement(e,this)},t.prototype._getNodeElement=function(e){var t=this._getNode(e);return t?this._getNodeElementForNode(t):null},t.prototype._containsElement=function(e){var t=this._getNode(s(e));return null!=t&&t.tree===this.tree},t.prototype._getScrollLeft=function(){return this.scrollHandler&&this.scrollHandler.getScrollLeft()||0},t.prototype._init=function(){e.prototype._init.call(this),this.element=this.$el,this.mouseDelay=300,this.isInitialized=!1,this.options.rtl=this._getRtlOption(),null===this.options.closedIcon&&(this.options.closedIcon=this._getDefaultClosedIcon()),this.renderer=new d.default(this),this.dataLoader=new u.default(this),null!=c.default?this.saveStateHandler=new c.default(this):this.options.saveState=!1,null!=g.default&&(this.selectNodeHandler=new g.default(this)),null!=a.DragAndDropHandler?this.dndHandler=new a.DragAndDropHandler(this):this.options.dragAndDrop=!1,null!=f.default&&(this.scrollHandler=new f.default(this)),null!=h.default&&null!=g.default&&(this.keyHandler=new h.default(this)),this._initData(),this.element.click(this._handleClick),this.element.dblclick(this._handleDblclick),this.options.useContextMenu&&this.element.on(\"contextmenu\",this._handleContextmenu)},t.prototype._deinit=function(){this.element.empty(),this.element.off(),this.keyHandler&&this.keyHandler.deinit(),this.tree=new v.Node({},!0),e.prototype._deinit.call(this)},t.prototype._mouseCapture=function(e){return!(!this.options.dragAndDrop||!this.dndHandler)&&this.dndHandler.mouseCapture(e)},t.prototype._mouseStart=function(e){return!(!this.options.dragAndDrop||!this.dndHandler)&&this.dndHandler.mouseStart(e)},t.prototype._mouseDrag=function(e){if(this.options.dragAndDrop&&this.dndHandler){var t=this.dndHandler.mouseDrag(e);return this.scrollHandler&&this.scrollHandler.checkScrolling(),t}return!1},t.prototype._mouseStop=function(e){return!(!this.options.dragAndDrop||!this.dndHandler)&&this.dndHandler.mouseStop(e)},t.prototype._initData=function(){this.options.data?this._loadData(this.options.data,null):this._getDataUrlInfo(null)?this._loadDataFromUrl(null,null,null):this._loadData([],null)},t.prototype._getDataUrlInfo=function(n){function e(e){if(n&&n.id){var t={node:n.id};e.data=t}else{var o=r._getNodeIdToBeSelected();o&&(t={selected_node:o},e.data=t)}}var t,r=this,o=this.options.dataUrl||this.element.data(\"url\");return\"function\"==typeof o?o(n):\"string\"==typeof o?(e(t={url:o}),t):(\"object\"==typeof o&&e(o),o)},t.prototype._getNodeIdToBeSelected=function(){return this.options.saveState&&this.saveStateHandler?this.saveStateHandler.getNodeIdToBeSelected():null},t.prototype._initTree=function(e){function t(){o.isInitialized||(o.isInitialized=!0,o._triggerEvent(\"tree.init\"))}var o=this;this.tree=new this.options.nodeClass(null,!0,this.options.nodeClass),this.selectNodeHandler&&this.selectNodeHandler.clear(),this.tree.loadFromData(e);var n=this._setInitialState();this._refreshElements(null),n?this._setInitialStateOnDemand(t):t()},t.prototype._setInitialState=function(){var t=this,e=function(){if(t.options.saveState&&t.saveStateHandler){var e=t.saveStateHandler.getStateFromStorage();return e?[!0,t.saveStateHandler.setInitialState(e)]:[!1,!1]}return[!1,!1]}(),o=e[0],n=e[1];return o||(n=function(){if(!1===t.options.autoOpen)return!1;var o=t._getAutoOpenMaxLevel(),n=!1;return t.tree.iterate(function(e,t){return e.load_on_demand?!(n=!0):!!e.hasChildren()&&(e.is_open=!0,t!==o)}),n}()),n},t.prototype._setInitialStateOnDemand=function(t){var n,r,i,s=this;(function(){if(s.options.saveState&&s.saveStateHandler){var e=s.saveStateHandler.getStateFromStorage();return!!e&&(s.saveStateHandler.setInitialStateOnDemand(e,t),!0)}return!1})()||(n=s._getAutoOpenMaxLevel(),r=0,(i=function(){s.tree.iterate(function(e,t){return e.load_on_demand?(e.is_loading||(o=e,r+=1,s._openNode(o,!1,function(){r-=1,i()})),!1):(s._openNode(e,!1,null),t!==n);var o}),0===r&&t()})())},t.prototype._getAutoOpenMaxLevel=function(){return!0===this.options.autoOpen?-1:parseInt(this.options.autoOpen,10)},t.prototype._getClickTarget=function(e){var t=s(e),o=t.closest(\".jqtree-toggler\");if(o.length){if(n=this._getNode(o))return{type:\"button\",node:n}}else{var n,r=t.closest(\".jqtree-element\");if(r.length&&(n=this._getNode(r)))return{type:\"label\",node:n}}return null},t.prototype._getNode=function(e){var t=e.closest(\"li.jqtree_common\");return 0===t.length?null:t.data(\"node\")},t.prototype._saveState=function(){this.options.saveState&&this.saveStateHandler&&this.saveStateHandler.saveState()},t.prototype._selectCurrentNode=function(){var e=this.getSelectedNode();if(e){var t=this._getNodeElementForNode(e);t&&t.select(!0)}},t.prototype._deselectCurrentNode=function(){var e=this.getSelectedNode();e&&this.removeFromSelection(e)},t.prototype._getDefaultClosedIcon=function(){return this.options.rtl?\"&#x25c0;\":\"&#x25ba;\"},t.prototype._getRtlOption=function(){if(null!=this.options.rtl)return this.options.rtl;var e=this.element.data(\"rtl\");return null!=e&&!1!==e},t.prototype._selectNode=function(e,t){var o=this;if(this.selectNodeHandler){var n=l({},{mustSetFocus:!0,mustToggle:!0},t||{}),r=function(){o.options.saveState&&o.saveStateHandler&&o.saveStateHandler.saveState()};if(!e)return this._deselectCurrentNode(),void r();if(o.options.onCanSelectNode?o.options.selectable&&o.options.onCanSelectNode(e):o.options.selectable){var i,s=e;if(this.selectNodeHandler.isNodeSelected(s))n.mustToggle&&(this._deselectCurrentNode(),this._triggerEvent(\"tree.select\",{node:null,previous_node:s}));else{var a=this.getSelectedNode();this._deselectCurrentNode(),this.addToSelection(s,n.mustSetFocus),this._triggerEvent(\"tree.select\",{node:s,deselected_node:a}),(i=e.parent)&&i.parent&&!i.is_open&&o.openNode(i,!1)}r()}}},t.prototype._loadData=function(e,t){e&&(this._triggerEvent(\"tree.load_data\",{tree_data:e}),t?(this._deselectNodes(t),this._loadSubtree(e,t)):this._initTree(e),this.isDragging()&&this.dndHandler&&this.dndHandler.refresh())},t.prototype._deselectNodes=function(e){if(this.selectNodeHandler)for(var t=0,o=this.selectNodeHandler.getSelectedNodesUnder(e);t<o.length;t++){var n=o[t];this.selectNodeHandler.removeFromSelection(n)}},t.prototype._loadSubtree=function(e,t){t.loadFromData(e),t.load_on_demand=!1,t.is_loading=!1,this._refreshElements(t)},t.prototype._loadDataFromUrl=function(e,t,o){var n=e||this._getDataUrlInfo(t);this.dataLoader.loadFromUrl(n,t,o)},t.prototype._loadFolderOnDemand=function(e,t,o){var n=this;void 0===t&&(t=!0),e.is_loading=!0,this._loadDataFromUrl(null,e,function(){n._openNode(e,t,o)})},t.defaults={animationSpeed:\"fast\",autoOpen:!1,saveState:!1,dragAndDrop:!1,selectable:!0,useContextMenu:!0,onCanSelectNode:null,onSetStateFromStorage:null,onGetStateFromStorage:null,onCreateLi:null,onIsMoveHandle:null,onCanMove:null,onCanMoveTo:null,onLoadFailed:null,autoEscape:!0,dataUrl:null,closedIcon:null,openedIcon:\"&#x25bc;\",slide:!0,nodeClass:v.Node,dataFilter:null,keyboardSupport:!0,openFolderDelay:500,rtl:!1,onDragMove:null,onDragStop:null,buttonLeft:!0,onLoading:null,tabIndex:0},t}(p.default);m.default.register(S,\"tree\")},function(e,t,o){\"use strict\";t.__esModule=!0,t.default=\"1.4.11\"},function(e,t,o){\"use strict\";var n,i=this&&this.__extends||(n=function(e,t){return(n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var o in t)t.hasOwnProperty(o)&&(e[o]=t[o])})(e,t)},function(e,t){function o(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(o.prototype=t.prototype,new o)});t.__esModule=!0;var l=o(2),a=o(0),s=o(1),r=function(){function e(e){this.treeWidget=e,this.hoveredArea=null,this.hitAreas=[],this.isDragging=!1,this.currentItem=null,this.positionInfo=null}return e.prototype.mouseCapture=function(e){var t=l(e.target);if(!this.mustCaptureElement(t))return null;if(this.treeWidget.options.onIsMoveHandle&&!this.treeWidget.options.onIsMoveHandle(t))return null;var o=this.treeWidget._getNodeElement(t);return o&&this.treeWidget.options.onCanMove&&(this.treeWidget.options.onCanMove(o.node)||(o=null)),this.currentItem=o,null!=this.currentItem},e.prototype.generateHitAreas=function(){if(this.currentItem){var e=new d(this.treeWidget.tree,this.currentItem.node,this.getTreeDimensions().bottom);this.hitAreas=e.generate()}else this.hitAreas=[]},e.prototype.mouseStart=function(e){if(this.currentItem&&void 0!==e.pageX&&void 0!==e.pageY){this.refresh();var t=l(e.target).offset(),o=t?t.left:0,n=t?t.top:0,r=this.currentItem.node,i=this.treeWidget.options.autoEscape?s.htmlEscape(r.name):r.name;return this.dragElement=new u(i,e.pageX-o,e.pageY-n,this.treeWidget.element),this.isDragging=!0,this.positionInfo=e,this.currentItem.$element.addClass(\"jqtree-moving\"),!0}return!1},e.prototype.mouseDrag=function(e){if(this.currentItem&&this.dragElement&&void 0!==e.pageX&&void 0!==e.pageY){this.dragElement.move(e.pageX,e.pageY),this.positionInfo=e;var t=this.findHoveredArea(e.pageX,e.pageY);return this.canMoveToArea(t)&&t?(t.node.isFolder()||this.stopOpenFolderTimer(),this.hoveredArea!==t&&(this.hoveredArea=t,this.mustOpenFolderTimer(t)?this.startOpenFolderTimer(t.node):this.stopOpenFolderTimer(),this.updateDropHint())):(this.removeHover(),this.removeDropHint(),this.stopOpenFolderTimer()),t||this.treeWidget.options.onDragMove&&this.treeWidget.options.onDragMove(this.currentItem.node,e.originalEvent),!0}return!1},e.prototype.mouseStop=function(e){this.moveItem(e),this.clear(),this.removeHover(),this.removeDropHint(),this.removeHitAreas();var t=this.currentItem;return this.currentItem&&(this.currentItem.$element.removeClass(\"jqtree-moving\"),this.currentItem=null),this.isDragging=!1,this.positionInfo=null,!this.hoveredArea&&t&&this.treeWidget.options.onDragStop&&this.treeWidget.options.onDragStop(t.node,e.originalEvent),!1},e.prototype.refresh=function(){this.removeHitAreas(),this.currentItem&&(this.generateHitAreas(),this.currentItem=this.treeWidget._getNodeElementForNode(this.currentItem.node),this.isDragging&&this.currentItem.$element.addClass(\"jqtree-moving\"))},e.prototype.mustCaptureElement=function(e){return!e.is(\"input,select,textarea\")},e.prototype.canMoveToArea=function(e){if(e&&this.currentItem){if(this.treeWidget.options.onCanMoveTo){var t=a.getPositionName(e.position);return this.treeWidget.options.onCanMoveTo(this.currentItem.node,e.node,t)}return!0}return!1},e.prototype.removeHitAreas=function(){this.hitAreas=[]},e.prototype.clear=function(){this.dragElement&&(this.dragElement.remove(),this.dragElement=null)},e.prototype.removeDropHint=function(){this.previousGhost&&this.previousGhost.remove()},e.prototype.removeHover=function(){this.hoveredArea=null},e.prototype.findHoveredArea=function(e,t){var o=this.getTreeDimensions();if(e<o.left||t<o.top||e>o.right||t>o.bottom)return null;for(var n=0,r=this.hitAreas.length;n<r;){var i=n+r>>1,s=this.hitAreas[i];if(t<s.top)r=i;else{if(!(t>s.bottom))return s;n=1+i}}return null},e.prototype.mustOpenFolderTimer=function(e){var t=e.node;return t.isFolder()&&!t.is_open&&e.position===a.Position.Inside},e.prototype.updateDropHint=function(){if(this.hoveredArea){this.removeDropHint();var e=this.treeWidget._getNodeElementForNode(this.hoveredArea.node);this.previousGhost=e.addDropHint(this.hoveredArea.position)}},e.prototype.startOpenFolderTimer=function(e){var t=this;this.stopOpenFolderTimer(),this.openFolderTimer=window.setTimeout(function(){t.treeWidget._openNode(e,t.treeWidget.options.slide,function(){t.refresh(),t.updateDropHint()})},this.treeWidget.options.openFolderDelay)},e.prototype.stopOpenFolderTimer=function(){this.openFolderTimer&&(clearTimeout(this.openFolderTimer),this.openFolderTimer=null)},e.prototype.moveItem=function(e){var t=this;if(this.currentItem&&this.hoveredArea&&this.hoveredArea.position!==a.Position.None&&this.canMoveToArea(this.hoveredArea)){var o=this.currentItem.node,n=this.hoveredArea.node,r=this.hoveredArea.position,i=o.parent;r===a.Position.Inside&&(this.hoveredArea.node.is_open=!0);var s=function(){t.treeWidget.tree.moveNode(o,n,r),t.treeWidget.element.empty(),t.treeWidget._refreshElements(null)};this.treeWidget._triggerEvent(\"tree.move\",{move_info:{moved_node:o,target_node:n,position:a.getPositionName(r),previous_parent:i,do_move:s,original_event:e.originalEvent}}).isDefaultPrevented()||s()}},e.prototype.getTreeDimensions=function(){var e=this.treeWidget.element.offset();if(e){var t=this.treeWidget.element,o=t.width()||0,n=t.height()||0,r=e.left+this.treeWidget._getScrollLeft();return{left:r,top:e.top,right:r+o,bottom:e.top+n+16}}return{left:0,top:0,right:0,bottom:0}},e}();t.DragAndDropHandler=r;var d=function(r){function e(e,t,o){var n=r.call(this,e)||this;return n.currentNode=t,n.treeBottom=o,n}return i(e,r),e.prototype.generate=function(){return this.positions=[],this.lastTop=0,this.iterate(),this.generateHitAreas(this.positions)},e.prototype.generateHitAreas=function(e){for(var t=-1,o=[],n=[],r=0,i=e;r<i.length;r++){var s=i[r];s.top!==t&&o.length&&(o.length&&this.generateHitAreasForGroup(n,o,t,s.top),t=s.top,o=[]),o.push(s)}return this.generateHitAreasForGroup(n,o,t,this.treeBottom),n},e.prototype.handleOpenFolder=function(e,t){return e!==this.currentNode&&(e.children[0]!==this.currentNode&&this.addPosition(e,a.Position.Inside,this.getTop(t)),!0)},e.prototype.handleClosedFolder=function(e,t,o){var n=this.getTop(o);e===this.currentNode?this.addPosition(e,a.Position.None,n):(this.addPosition(e,a.Position.Inside,n),t!==this.currentNode&&this.addPosition(e,a.Position.After,n))},e.prototype.handleFirstNode=function(e){e!==this.currentNode&&this.addPosition(e,a.Position.Before,this.getTop(l(e.element)))},e.prototype.handleAfterOpenFolder=function(e,t){e===this.currentNode||t===this.currentNode?this.addPosition(e,a.Position.None,this.lastTop):this.addPosition(e,a.Position.After,this.lastTop)},e.prototype.handleNode=function(e,t,o){var n=this.getTop(o);e===this.currentNode?this.addPosition(e,a.Position.None,n):this.addPosition(e,a.Position.Inside,n),t===this.currentNode||e===this.currentNode?this.addPosition(e,a.Position.None,n):this.addPosition(e,a.Position.After,n)},e.prototype.getTop=function(e){var t=e.offset();return t?t.top:0},e.prototype.addPosition=function(e,t,o){var n={top:o,bottom:0,node:e,position:t};this.positions.push(n),this.lastTop=o},e.prototype.generateHitAreasForGroup=function(e,t,o,n){for(var r=Math.min(t.length,4),i=Math.round((n-o)/r),s=o,a=0;a<r;){var l=t[a];e.push({top:s,bottom:s+i,node:l.node,position:l.position}),s+=i,a+=1}},e}(function(){function e(e){this.tree=e}return e.prototype.iterate=function(){var i=this,s=!0,a=function(o,e){var t=(o.is_open||!o.element)&&o.hasChildren(),n=null;if(o.element){if(!(n=l(o.element)).is(\":visible\"))return;s&&(i.handleFirstNode(o),s=!1),o.hasChildren()?o.is_open?i.handleOpenFolder(o,n)||(t=!1):i.handleClosedFolder(o,e,n):i.handleNode(o,e,n)}if(t){var r=o.children.length;o.children.forEach(function(e,t){a(o.children[t],t===r-1?null:o.children[t+1])}),o.is_open&&n&&i.handleAfterOpenFolder(o,e)}};a(this.tree,null)},e}());t.HitAreasGenerator=d;var u=function(){function e(e,t,o,n){this.offsetX=t,this.offsetY=o,this.$element=l('<span class=\"jqtree-title jqtree-dragging\">'+e+\"</span>\"),this.$element.css(\"position\",\"absolute\"),n.append(this.$element)}return e.prototype.move=function(e,t){this.$element.offset({left:e-this.offsetX,top:t-this.offsetY})},e.prototype.remove=function(){this.$element.remove()},e}()},function(e,t,o){\"use strict\";t.__esModule=!0;var a=o(1),n=function(){function e(e){this.treeWidget=e,this.openedIconElement=this.createButtonElement(e.options.openedIcon),this.closedIconElement=this.createButtonElement(e.options.closedIcon)}return e.prototype.render=function(e){e&&e.parent?this.renderFromNode(e):this.renderFromRoot()},e.prototype.renderFromRoot=function(){var e=this.treeWidget.element;e.empty(),this.createDomElements(e[0],this.treeWidget.tree.children,!0,1)},e.prototype.renderFromNode=function(e){var t=jQuery(e.element),o=this.createLi(e,e.getLevel());this.attachNodeData(e,o),t.after(o),t.remove(),e.children&&this.createDomElements(o,e.children,!1,e.getLevel()+1)},e.prototype.createDomElements=function(e,t,o,n){var r=this.createUl(o);e.appendChild(r);for(var i=0,s=t;i<s.length;i++){var a=s[i],l=this.createLi(a,n);r.appendChild(l),this.attachNodeData(a,l),a.hasChildren()&&this.createDomElements(l,a.children,!1,n+1)}},e.prototype.attachNodeData=function(e,t){e.element=t,jQuery(t).data(\"node\",e)},e.prototype.createUl=function(e){var t,o;e?(t=\"jqtree-tree\",o=\"tree\",this.treeWidget.options.rtl&&(t+=\" jqtree-rtl\")):(t=\"\",o=\"group\");var n=document.createElement(\"ul\");return n.className=\"jqtree_common \"+t,n.setAttribute(\"role\",o),n},e.prototype.createLi=function(e,t){var o=Boolean(this.treeWidget.selectNodeHandler&&this.treeWidget.selectNodeHandler.isNodeSelected(e)),n=e.isFolder()?this.createFolderLi(e,t,o):this.createNodeLi(e,t,o);return this.treeWidget.options.onCreateLi&&this.treeWidget.options.onCreateLi(e,jQuery(n),o),n},e.prototype.createFolderLi=function(e,t,o){var n=this.getButtonClasses(e),r=this.getFolderClasses(e,o),i=e.is_open?this.openedIconElement:this.closedIconElement,s=document.createElement(\"li\");s.className=\"jqtree_common \"+r,s.setAttribute(\"role\",\"presentation\");var a=document.createElement(\"div\");a.className=\"jqtree-element jqtree_common\",a.setAttribute(\"role\",\"presentation\"),s.appendChild(a);var l=document.createElement(\"a\");return l.className=n,l.appendChild(i.cloneNode(!0)),l.setAttribute(\"role\",\"presentation\"),l.setAttribute(\"aria-hidden\",\"true\"),this.treeWidget.options.buttonLeft&&a.appendChild(l),a.appendChild(this.createTitleSpan(e.name,t,o,e.is_open,!0)),this.treeWidget.options.buttonLeft||a.appendChild(l),s},e.prototype.createNodeLi=function(e,t,o){var n=[\"jqtree_common\"];o&&n.push(\"jqtree-selected\");var r=n.join(\" \"),i=document.createElement(\"li\");i.className=r,i.setAttribute(\"role\",\"presentation\");var s=document.createElement(\"div\");return s.className=\"jqtree-element jqtree_common\",s.setAttribute(\"role\",\"presentation\"),i.appendChild(s),s.appendChild(this.createTitleSpan(e.name,t,o,e.is_open,!1)),i},e.prototype.createTitleSpan=function(e,t,o,n,r){var i=document.createElement(\"span\"),s=\"jqtree-title jqtree_common\";return r&&(s+=\" jqtree-title-folder\"),i.className=s,i.setAttribute(\"role\",\"treeitem\"),i.setAttribute(\"aria-level\",\"\"+t),i.setAttribute(\"aria-selected\",a.getBoolString(o)),i.setAttribute(\"aria-expanded\",a.getBoolString(n)),o&&i.setAttribute(\"tabindex\",this.treeWidget.options.tabIndex),i.innerHTML=this.escapeIfNecessary(e),i},e.prototype.getButtonClasses=function(e){var t=[\"jqtree-toggler\",\"jqtree_common\"];return e.is_open||t.push(\"jqtree-closed\"),this.treeWidget.options.buttonLeft?t.push(\"jqtree-toggler-left\"):t.push(\"jqtree-toggler-right\"),t.join(\" \")},e.prototype.getFolderClasses=function(e,t){var o=[\"jqtree-folder\"];return e.is_open||o.push(\"jqtree-closed\"),t&&o.push(\"jqtree-selected\"),e.is_loading&&o.push(\"jqtree-loading\"),o.join(\" \")},e.prototype.escapeIfNecessary=function(e){return this.treeWidget.options.autoEscape?a.htmlEscape(e):e},e.prototype.createButtonElement=function(e){if(\"string\"!=typeof e)return jQuery(e)[0];var t=document.createElement(\"div\");return t.innerHTML=e,document.createTextNode(t.innerHTML)},e}();t.default=n},function(e,t,o){\"use strict\";t.__esModule=!0;var n=function(){function e(e){this.treeWidget=e}return e.prototype.loadFromUrl=function(e,t,o){var n=this;if(e){var r=this.getDomElement(t);this.addLoadingClass(r),this.notifyLoading(!0,t,r);var i=function(){n.removeLoadingClass(r),n.notifyLoading(!1,t,r)};this.submitRequest(e,function(e){i(),n.treeWidget.loadData(n.parseData(e),t),o&&\"function\"==typeof o&&o()},function(e){i();var t=n.treeWidget.options.onLoadFailed;t&&t(e)})}},e.prototype.addLoadingClass=function(e){e&&e.addClass(\"jqtree-loading\")},e.prototype.removeLoadingClass=function(e){e&&e.removeClass(\"jqtree-loading\")},e.prototype.getDomElement=function(e){return e?jQuery(e.element):this.treeWidget.element},e.prototype.notifyLoading=function(e,t,o){var n=this.treeWidget.options.onLoading;n&&n(e,t,o),this.treeWidget._triggerEvent(\"tree.loading_data\",{isLoading:e,node:t,$el:o})},e.prototype.submitRequest=function(e,t,o){var n=jQuery.extend({method:\"GET\"},\"string\"==typeof e?{url:e}:e,{cache:!1,dataType:\"json\",success:t,error:o});n.method=n.method.toUpperCase(),jQuery.ajax(n)},e.prototype.parseData=function(e){var t=this.treeWidget.options.dataFilter,o=e instanceof Array||\"object\"==typeof e?e:null!=e?jQuery.parseJSON(e):[];return t?t(o):o},e}();t.default=n},function(e,t,o){\"use strict\";t.__esModule=!0;var n=function(){function o(e){var t=this;this.handleKeyDown=function(e){if(!t.canHandleKeyboard())return!0;switch(e.which){case o.DOWN:return t.moveDown();case o.UP:return t.moveUp();case o.RIGHT:return t.moveRight();case o.LEFT:return t.moveLeft();default:return!0}},(this.treeWidget=e).options.keyboardSupport&&jQuery(document).on(\"keydown.jqtree\",this.handleKeyDown)}return o.prototype.deinit=function(){jQuery(document).off(\"keydown.jqtree\")},o.prototype.moveDown=function(){var e=this.treeWidget.getSelectedNode();return!!e&&this.selectNode(e.getNextNode())},o.prototype.moveUp=function(){var e=this.treeWidget.getSelectedNode();return!!e&&this.selectNode(e.getPreviousNode())},o.prototype.moveRight=function(){var e=this.treeWidget.getSelectedNode();return!e||!e.isFolder()||(e.is_open?this.selectNode(e.getNextNode()):(this.treeWidget.openNode(e),!1))},o.prototype.moveLeft=function(){var e=this.treeWidget.getSelectedNode();return!e||(e.isFolder()&&e.is_open?(this.treeWidget.closeNode(e),!1):this.selectNode(e.getParent()))},o.prototype.selectNode=function(e){return!e||(this.treeWidget.selectNode(e),this.treeWidget.scrollHandler&&!this.treeWidget.scrollHandler.isScrolledIntoView(jQuery(e.element).find(\".jqtree-element\"))&&this.treeWidget.scrollToNode(e),!1)},o.prototype.canHandleKeyboard=function(){return this.treeWidget.options.keyboardSupport&&this.isFocusOnTree()&&null!=this.treeWidget.getSelectedNode()},o.prototype.isFocusOnTree=function(){var e=document.activeElement;return Boolean(e&&\"SPAN\"===e.tagName&&this.treeWidget._containsElement(e))},o.LEFT=37,o.UP=38,o.RIGHT=39,o.DOWN=40,o}();t.default=n},function(e,t,o){\"use strict\";var n,r=this&&this.__extends||(n=function(e,t){return(n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var o in t)t.hasOwnProperty(o)&&(e[o]=t[o])})(e,t)},function(e,t){function o(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(o.prototype=t.prototype,new o)});t.__esModule=!0;var i=function(e){function t(){var n=null!==e&&e.apply(this,arguments)||this;return n.mouseDown=function(e){if(1===e.which){var t=n._handleMouseDown(n._getPositionInfo(e));return t&&e.preventDefault(),t}},n.mouseMove=function(e){return n._handleMouseMove(e,n._getPositionInfo(e))},n.mouseUp=function(e){return n._handleMouseUp(n._getPositionInfo(e))},n.touchStart=function(e){var t=e.originalEvent;if(!(1<t.touches.length)){var o=t.changedTouches[0];return n._handleMouseDown(n._getPositionInfo(o))}},n.touchMove=function(e){var t=e.originalEvent;if(!(1<t.touches.length)){var o=t.changedTouches[0];return n._handleMouseMove(e,n._getPositionInfo(o))}},n.touchEnd=function(e){var t=e.originalEvent;if(!(1<t.touches.length)){var o=t.changedTouches[0];return n._handleMouseUp(n._getPositionInfo(o))}},n}return r(t,e),t.prototype.setMouseDelay=function(e){this.mouseDelay=e},t.prototype._init=function(){this.$el.on(\"mousedown.mousewidget\",this.mouseDown),this.$el.on(\"touchstart.mousewidget\",this.touchStart),this.isMouseStarted=!1,this.mouseDelay=0,this.mouseDelayTimer=null,this.isMouseDelayMet=!0,this.mouseDownInfo=null},t.prototype._deinit=function(){this.$el.off(\"mousedown.mousewidget\"),this.$el.off(\"touchstart.mousewidget\");var e=jQuery(document);e.off(\"mousemove.mousewidget\"),e.off(\"mouseup.mousewidget\")},t.prototype._handleMouseDown=function(e){if(this.isMouseStarted&&this._handleMouseUp(e),this.mouseDownInfo=e,this._mouseCapture(e))return this._handleStartMouse(),!0},t.prototype._handleStartMouse=function(){var e=jQuery(document);e.on(\"mousemove.mousewidget\",this.mouseMove),e.on(\"touchmove.mousewidget\",this.touchMove),e.on(\"mouseup.mousewidget\",this.mouseUp),e.on(\"touchend.mousewidget\",this.touchEnd),this.mouseDelay&&this._startMouseDelayTimer()},t.prototype._startMouseDelayTimer=function(){var e=this;this.mouseDelayTimer&&clearTimeout(this.mouseDelayTimer),this.mouseDelayTimer=window.setTimeout(function(){e.isMouseDelayMet=!0},this.mouseDelay),this.isMouseDelayMet=!1},t.prototype._handleMouseMove=function(e,t){return this.isMouseStarted?(this._mouseDrag(t),e.preventDefault()):!(!this.mouseDelay||this.isMouseDelayMet)||(this.mouseDownInfo&&(this.isMouseStarted=!1!==this._mouseStart(this.mouseDownInfo)),this.isMouseStarted?this._mouseDrag(t):this._handleMouseUp(t),!this.isMouseStarted)},t.prototype._getPositionInfo=function(e){return{pageX:e.pageX,pageY:e.pageY,target:e.target,originalEvent:e}},t.prototype._handleMouseUp=function(e){var t=jQuery(document);t.off(\"mousemove.mousewidget\"),t.off(\"touchmove.mousewidget\"),t.off(\"mouseup.mousewidget\"),t.off(\"touchend.mousewidget\"),this.isMouseStarted&&(this.isMouseStarted=!1,this._mouseStop(e))},t}(o(3).default);t.default=i},function(e,t,o){\"use strict\";t.__esModule=!0;var n=o(1),r=function(){function e(e){this.treeWidget=e}return e.prototype.saveState=function(){var e=JSON.stringify(this.getState());this.treeWidget.options.onSetStateFromStorage?this.treeWidget.options.onSetStateFromStorage(e):this.supportsLocalStorage()&&localStorage.setItem(this.getKeyName(),e)},e.prototype.getStateFromStorage=function(){var e=this._loadFromStorage();return e?this._parseState(e):null},e.prototype.getState=function(){var t;return{open_nodes:(t=[],this.treeWidget.tree.iterate(function(e){return e.is_open&&e.id&&e.hasChildren()&&t.push(e.id),!0}),t),selected_node:this.treeWidget.getSelectedNodes().map(function(e){return e.id})}},e.prototype.setInitialState=function(e){if(e){var t=!1;return e.open_nodes&&(t=this._openInitialNodes(e.open_nodes)),e.selected_node&&(this._resetSelection(),this._selectInitialNodes(e.selected_node)),t}return!1},e.prototype.setInitialStateOnDemand=function(e,t){e?this._setInitialStateOnDemand(e.open_nodes,e.selected_node,t):t()},e.prototype.getNodeIdToBeSelected=function(){var e=this.getStateFromStorage();return e&&e.selected_node?e.selected_node[0]:null},e.prototype._parseState=function(e){var t=jQuery.parseJSON(e);return t&&t.selected_node&&n.isInt(t.selected_node)&&(t.selected_node=[t.selected_node]),t},e.prototype._loadFromStorage=function(){return this.treeWidget.options.onGetStateFromStorage?this.treeWidget.options.onGetStateFromStorage():this.supportsLocalStorage()?localStorage.getItem(this.getKeyName()):void 0},e.prototype._openInitialNodes=function(e){for(var t=!1,o=0,n=e;o<n.length;o++){var r=n[o],i=this.treeWidget.getNodeById(r);i&&(i.load_on_demand?t=!0:i.is_open=!0)}return t},e.prototype._selectInitialNodes=function(e){for(var t=0,o=0,n=e;o<n.length;o++){var r=n[o],i=this.treeWidget.getNodeById(r);i&&(t+=1,this.treeWidget.selectNodeHandler&&this.treeWidget.selectNodeHandler.addToSelection(i))}return 0!==t},e.prototype._resetSelection=function(){var t=this.treeWidget.selectNodeHandler;t&&t.getSelectedNodes().forEach(function(e){t.removeFromSelection(e)})},e.prototype._setInitialStateOnDemand=function(e,i,s){function t(){for(var e=[],t=0,o=d;t<o.length;t++){var n=o[t],r=a.treeWidget.getNodeById(n);r?r.is_loading||(r.load_on_demand?u(r):a.treeWidget._openNode(r,!1,null)):e.push(n)}d=e,a._selectInitialNodes(i)&&a.treeWidget._refreshElements(null),0===l&&s()}var a=this,l=0,d=e,u=function(e){l+=1,a.treeWidget._openNode(e,!1,function(){l-=1,t()})};t()},e.prototype.getKeyName=function(){return\"string\"==typeof this.treeWidget.options.saveState?this.treeWidget.options.saveState:\"tree\"},e.prototype.supportsLocalStorage=function(){return null==this._supportsLocalStorage&&(this._supportsLocalStorage=function(){if(null==localStorage)return!1;try{var e=\"_storage_test\";sessionStorage.setItem(e,\"value\"),sessionStorage.removeItem(e)}catch(e){return!1}return!0}()),this._supportsLocalStorage},e}();t.default=r},function(e,t,o){\"use strict\";t.__esModule=!0;var n=function(){function e(e){this.treeWidget=e,this.previousTop=-1,this.isInitialized=!1}return e.prototype.checkScrolling=function(){this.ensureInit(),this.checkVerticalScrolling(),this.checkHorizontalScrolling()},e.prototype.scrollToY=function(e){if(this.ensureInit(),this.$scrollParent)this.$scrollParent[0].scrollTop=e;else{var t=this.treeWidget.$el.offset(),o=t?t.top:0;jQuery(document).scrollTop(e+o)}},e.prototype.isScrolledIntoView=function(e){var t,o,n;this.ensureInit();var r,i=e.height()||0;return(this.$scrollParent?(n=0,t=this.$scrollParent.height()||0,(o=((r=e.offset())?r.top:0)-this.scrollParentTop)+i):(t=(n=jQuery(window).scrollTop()||0)+(jQuery(window).height()||0),(o=(r=e.offset())?r.top:0)+i))<=t&&n<=o},e.prototype.getScrollLeft=function(){return this.$scrollParent&&this.$scrollParent.scrollLeft()||0},e.prototype.initScrollParent=function(){function e(){s.scrollParentTop=0,s.$scrollParent=null}var s=this;\"fixed\"===this.treeWidget.$el.css(\"position\")&&e();var t=function(){function e(e){for(var t=0,o=i;t<o.length;t++){var n=o[t],r=e.css(n);if(\"auto\"===r||\"scroll\"===r)return!0}return!1}var i=[\"overflow\",\"overflow-y\"];if(e(s.treeWidget.$el))return s.treeWidget.$el;for(var t=0,o=s.treeWidget.$el.parents().get();t<o.length;t++){var n=o[t],r=jQuery(n);if(e(r))return r}return null}();if(t&&t.length&&\"HTML\"!==t[0].tagName){this.$scrollParent=t;var o=this.$scrollParent.offset();this.scrollParentTop=o?o.top:0}else e();this.isInitialized=!0},e.prototype.ensureInit=function(){this.isInitialized||this.initScrollParent()},e.prototype.handleVerticalScrollingWithScrollParent=function(e){var t=this.$scrollParent&&this.$scrollParent[0];t&&(this.scrollParentTop+t.offsetHeight-e.bottom<20?(t.scrollTop+=20,this.treeWidget.refreshHitAreas(),this.previousTop=-1):e.top-this.scrollParentTop<20&&(t.scrollTop-=20,this.treeWidget.refreshHitAreas(),this.previousTop=-1))},e.prototype.handleVerticalScrollingWithDocument=function(e){var t=jQuery(document).scrollTop()||0;e.top-t<20?jQuery(document).scrollTop(t-20):(jQuery(window).height()||0)-(e.bottom-t)<20&&jQuery(document).scrollTop(t+20)},e.prototype.checkVerticalScrolling=function(){var e=this.treeWidget.dndHandler&&this.treeWidget.dndHandler.hoveredArea;e&&e.top!==this.previousTop&&(this.previousTop=e.top,this.$scrollParent?this.handleVerticalScrollingWithScrollParent(e):this.handleVerticalScrollingWithDocument(e))},e.prototype.checkHorizontalScrolling=function(){var e=this.treeWidget.dndHandler&&this.treeWidget.dndHandler.positionInfo;e&&(this.$scrollParent?this.handleHorizontalScrollingWithParent(e):this.handleHorizontalScrollingWithDocument(e))},e.prototype.handleHorizontalScrollingWithParent=function(e){if(void 0!==e.pageX&&void 0!==e.pageY){var t=this.$scrollParent,o=t&&t.offset();if(t&&o){var n=t[0],r=n.scrollLeft+n.clientWidth<n.scrollWidth,i=0<n.scrollLeft,s=o.left+n.clientWidth,a=o.left,l=e.pageX>s-20,d=e.pageX<a+20;l&&r?n.scrollLeft=Math.min(n.scrollLeft+20,n.scrollWidth):d&&i&&(n.scrollLeft=Math.max(n.scrollLeft-20,0))}}},e.prototype.handleHorizontalScrollingWithDocument=function(e){if(void 0!==e.pageX&&void 0!==e.pageY){var t=jQuery(document),o=t.scrollLeft()||0,n=jQuery(window).width()||0,r=0<o,i=e.pageX>n-20,s=e.pageX-o<20;i?t.scrollLeft(o+20):s&&r&&t.scrollLeft(Math.max(o-20,0))}},e}();t.default=n},function(e,t,o){\"use strict\";t.__esModule=!0;var n=function(){function e(e){this.treeWidget=e,this.clear()}return e.prototype.getSelectedNode=function(){var e=this.getSelectedNodes();return!!e.length&&e[0]},e.prototype.getSelectedNodes=function(){if(this.selectedSingleNode)return[this.selectedSingleNode];var e=[];for(var t in this.selectedNodes)if(this.selectedNodes.hasOwnProperty(t)){var o=this.treeWidget.getNodeById(t);o&&e.push(o)}return e},e.prototype.getSelectedNodesUnder=function(e){if(this.selectedSingleNode)return e.isParentOf(this.selectedSingleNode)?[this.selectedSingleNode]:[];var t=[];for(var o in this.selectedNodes)if(this.selectedNodes.hasOwnProperty(o)){var n=this.treeWidget.getNodeById(o);n&&e.isParentOf(n)&&t.push(n)}return t},e.prototype.isNodeSelected=function(e){return!!e&&(null!=e.id?!!this.selectedNodes[e.id]:!!this.selectedSingleNode&&this.selectedSingleNode.element===e.element)},e.prototype.clear=function(){this.selectedNodes={},this.selectedSingleNode=null},e.prototype.removeFromSelection=function(e,t){var o=this;void 0===t&&(t=!1),null==e.id?this.selectedSingleNode&&e.element===this.selectedSingleNode.element&&(this.selectedSingleNode=null):(delete this.selectedNodes[e.id],t&&e.iterate(function(){return delete o.selectedNodes[e.id],!0}))},e.prototype.addToSelection=function(e){null!=e.id?this.selectedNodes[e.id]=!0:this.selectedSingleNode=e},e}();t.default=n},function(e,t,o){\"use strict\";var n,r=this&&this.__extends||(n=function(e,t){return(n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var o in t)t.hasOwnProperty(o)&&(e[o]=t[o])})(e,t)},function(e,t){function o(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(o.prototype=t.prototype,new o)});t.__esModule=!0;var i=o(0),s=function(){function e(e,t){this.init(e,t)}return e.prototype.init=function(e,t){this.node=e,this.treeWidget=t,e.element||(e.element=this.treeWidget.element.get(0)),this.$element=jQuery(e.element)},e.prototype.addDropHint=function(e){return this.mustShowBorderDropHint(e)?new l(this.$element,this.treeWidget._getScrollLeft()):new d(this.node,this.$element,e)},e.prototype.select=function(e){var t=this.getLi();t.addClass(\"jqtree-selected\"),t.attr(\"aria-selected\",\"true\");var o=this.getSpan();o.attr(\"tabindex\",this.treeWidget.options.tabIndex),e&&o.focus()},e.prototype.deselect=function(){var e=this.getLi();e.removeClass(\"jqtree-selected\"),e.attr(\"aria-selected\",\"false\");var t=this.getSpan();t.removeAttr(\"tabindex\"),t.blur()},e.prototype.getUl=function(){return this.$element.children(\"ul:first\")},e.prototype.getSpan=function(){return this.$element.children(\".jqtree-element\").find(\"span.jqtree-title\")},e.prototype.getLi=function(){return this.$element},e.prototype.mustShowBorderDropHint=function(e){return e===i.Position.Inside},e}(),a=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return r(t,e),t.prototype.open=function(e,t,o){var n=this;if(void 0===t&&(t=!0),void 0===o&&(o=\"fast\"),!this.node.is_open){this.node.is_open=!0;var r=this.getButton();r.removeClass(\"jqtree-closed\"),r.html(\"\");var i=r.get(0);if(i){var s=this.treeWidget.renderer.openedIconElement.cloneNode(!0);i.appendChild(s)}var a=function(){n.getLi().removeClass(\"jqtree-closed\"),n.getSpan().attr(\"aria-expanded\",\"true\"),e&&e(n.node),n.treeWidget._triggerEvent(\"tree.open\",{node:n.node})};t?this.getUl().slideDown(o,a):(this.getUl().show(),a())}},t.prototype.close=function(e,t){var o=this;if(void 0===e&&(e=!0),void 0===t&&(t=\"fast\"),this.node.is_open){this.node.is_open=!1;var n=this.getButton();n.addClass(\"jqtree-closed\"),n.html(\"\");var r=n.get(0);if(r){var i=this.treeWidget.renderer.closedIconElement.cloneNode(!0);r.appendChild(i)}var s=function(){o.getLi().addClass(\"jqtree-closed\"),o.getSpan().attr(\"aria-expanded\",\"false\"),o.treeWidget._triggerEvent(\"tree.close\",{node:o.node})};e?this.getUl().slideUp(t,s):(this.getUl().hide(),s())}},t.prototype.mustShowBorderDropHint=function(e){return!this.node.is_open&&e===i.Position.Inside},t.prototype.getButton=function(){return this.$element.children(\".jqtree-element\").find(\"a.jqtree-toggler\")},t}(t.NodeElement=s);t.FolderElement=a;var l=function(){function e(e,t){var o=e.children(\".jqtree-element\"),n=e.width()||0,r=Math.max(n+t-4,0),i=o.outerHeight()||0,s=Math.max(i-4,0);this.$hint=jQuery('<span class=\"jqtree-border\"></span>'),o.append(this.$hint),this.$hint.css({width:r,height:s})}return e.prototype.remove=function(){this.$hint.remove()},e}();t.BorderDropHint=l;var d=function(){function e(e,t,o){this.$element=t,this.node=e,this.$ghost=jQuery('<li class=\"jqtree_common jqtree-ghost\"><span class=\"jqtree_common jqtree-circle\"></span>\\n            <span class=\"jqtree_common jqtree-line\"></span></li>'),o===i.Position.After?this.moveAfter():o===i.Position.Before?this.moveBefore():o===i.Position.Inside&&(e.isFolder()&&e.is_open?this.moveInsideOpenFolder():this.moveInside())}return e.prototype.remove=function(){this.$ghost.remove()},e.prototype.moveAfter=function(){this.$element.after(this.$ghost)},e.prototype.moveBefore=function(){this.$element.before(this.$ghost)},e.prototype.moveInsideOpenFolder=function(){jQuery(this.node.children[0].element).before(this.$ghost)},e.prototype.moveInside=function(){this.$element.after(this.$ghost),this.$ghost.addClass(\"jqtree-inside\")},e}()},,function(e,t,o){e.exports=o(4)}]);"
  },
  {
    "path": "docs/structures_Base.js.html",
    "content": "<!doctype html>\n<html>\n\n<head>\n  <meta name=\"generator\" content=\"JSDoc 3.6.11\">\n  <meta charset=\"utf-8\">\n  <title>whatsapp-web.js 1.34.6 &raquo; Source: structures/Base.js</title>\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Karla:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Noto+Serif:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Inconsolata:500\" type=\"text/css\">\n  <link href=\"css/baseline.css\" rel=\"stylesheet\">\n</head>\n\n<body onload=\"prettyPrint()\">\n  <nav id=\"jsdoc-navbar\" role=\"navigation\" class=\"jsdoc-navbar\">\n    <div id=\"jsdoc-navbar-container\">\n      <div id=\"jsdoc-navbar-content\">\n        <a href=\"index.html\" class=\"jsdoc-navbar-package-name\">whatsapp-web.<wbr>js 1.<wbr>34.<wbr>6</a>\n      </div>\n    </div>\n  </nav>\n  <div id=\"jsdoc-body-container\">\n    <div id=\"jsdoc-content\">\n      <div id=\"jsdoc-content-container\">\n        <div id=\"jsdoc-banner\" role=\"banner\">\n        </div>\n        <div id=\"jsdoc-main\" role=\"main\">\n          <header class=\"page-header\">\n            <h1>Source: structures/Base.js</h1>\n          </header>\n          <article>\n            <pre class=\"prettyprint linenums\"><code>&#x27;use strict&#x27;;\n\n/**\n * Represents a WhatsApp data structure\n */\nclass Base {\n    constructor(client) {\n        /**\n         * The client that instantiated this\n         * @readonly\n         */\n        Object.defineProperty(this, &#x27;client&#x27;, { value: client });\n    }\n\n    _clone() {\n        return Object.assign(Object.create(this), this);\n    }\n    \n    _patch(data) { return data; }\n}\n\nmodule.exports &#x3D; Base;</code></pre>\n          </article>\n        </div>\n      </div>\n      <nav id=\"jsdoc-toc-nav\" role=\"navigation\"></nav>\n    </div>\n  </div>\n  <footer id=\"jsdoc-footer\" class=\"jsdoc-footer\">\n    <div id=\"jsdoc-footer-container\">\n      <p>\n        Generated by <a href=\"https://github.com/jsdoc3/jsdoc\">JSDoc</a> 3.6.11 on January 30, 2026.\n      </p>\n    </div>\n  </footer>\n  <script src=\"scripts/jquery.min.js\"></script>\n  <script src=\"scripts/tree.jquery.js\"></script>\n  <script src=\"scripts/prettify.js\"></script>\n  <script src=\"scripts/jsdoc-toc.js\"></script>\n  <script src=\"scripts/linenumber.js\"></script>\n  <script src=\"scripts/scrollanchor.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "docs/structures_Broadcast.js.html",
    "content": "<!doctype html>\n<html>\n\n<head>\n  <meta name=\"generator\" content=\"JSDoc 3.6.11\">\n  <meta charset=\"utf-8\">\n  <title>whatsapp-web.js 1.34.6 &raquo; Source: structures/Broadcast.js</title>\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Karla:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Noto+Serif:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Inconsolata:500\" type=\"text/css\">\n  <link href=\"css/baseline.css\" rel=\"stylesheet\">\n</head>\n\n<body onload=\"prettyPrint()\">\n  <nav id=\"jsdoc-navbar\" role=\"navigation\" class=\"jsdoc-navbar\">\n    <div id=\"jsdoc-navbar-container\">\n      <div id=\"jsdoc-navbar-content\">\n        <a href=\"index.html\" class=\"jsdoc-navbar-package-name\">whatsapp-web.<wbr>js 1.<wbr>34.<wbr>6</a>\n      </div>\n    </div>\n  </nav>\n  <div id=\"jsdoc-body-container\">\n    <div id=\"jsdoc-content\">\n      <div id=\"jsdoc-content-container\">\n        <div id=\"jsdoc-banner\" role=\"banner\">\n        </div>\n        <div id=\"jsdoc-main\" role=\"main\">\n          <header class=\"page-header\">\n            <h1>Source: structures/Broadcast.js</h1>\n          </header>\n          <article>\n            <pre class=\"prettyprint linenums\"><code>&#x27;use strict&#x27;;\n\nconst Base &#x3D; require(&#x27;./Base&#x27;);\nconst Message &#x3D; require(&#x27;./Message&#x27;);\n\n/**\n * Represents a Status/Story on WhatsApp\n * @extends {Base}\n */\nclass Broadcast extends Base {\n    constructor(client, data) {\n        super(client);\n\n        if (data) this._patch(data);\n    }\n\n    _patch(data) {\n        /**\n         * ID that represents the chat\n         * @type {object}\n         */\n        this.id &#x3D; data.id;\n\n        /**\n         * Unix timestamp of last status\n         * @type {number}\n         */\n        this.timestamp &#x3D; data.t;\n\n        /**\n         * Number of available statuses\n         * @type {number}\n         */\n        this.totalCount &#x3D; data.totalCount;\n\n        /**\n         * Number of not viewed\n         * @type {number}\n         */\n        this.unreadCount &#x3D; data.unreadCount;\n\n        /**\n         * Messages statuses\n         * @type {Message[]}\n         */\n        this.msgs &#x3D; data.msgs?.map(msg &#x3D;&gt; new Message(this.client, msg));\n\n        return super._patch(data);\n    }\n\n    /**\n     * Returns the Chat this message was sent in\n     * @returns {Promise&amp;lt;Chat&gt;}\n     */\n    getChat() {\n        return this.client.getChatById(this.id._serialized);\n    }\n\n    /**\n     * Returns the Contact this message was sent from\n     * @returns {Promise&amp;lt;Contact&gt;}\n     */\n    getContact() {\n        return this.client.getContactById(this.id._serialized);\n    }\n\n}\n\nmodule.exports &#x3D; Broadcast;\n</code></pre>\n          </article>\n        </div>\n      </div>\n      <nav id=\"jsdoc-toc-nav\" role=\"navigation\"></nav>\n    </div>\n  </div>\n  <footer id=\"jsdoc-footer\" class=\"jsdoc-footer\">\n    <div id=\"jsdoc-footer-container\">\n      <p>\n        Generated by <a href=\"https://github.com/jsdoc3/jsdoc\">JSDoc</a> 3.6.11 on January 30, 2026.\n      </p>\n    </div>\n  </footer>\n  <script src=\"scripts/jquery.min.js\"></script>\n  <script src=\"scripts/tree.jquery.js\"></script>\n  <script src=\"scripts/prettify.js\"></script>\n  <script src=\"scripts/jsdoc-toc.js\"></script>\n  <script src=\"scripts/linenumber.js\"></script>\n  <script src=\"scripts/scrollanchor.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "docs/structures_BusinessContact.js.html",
    "content": "<!doctype html>\n<html>\n\n<head>\n  <meta name=\"generator\" content=\"JSDoc 3.6.11\">\n  <meta charset=\"utf-8\">\n  <title>whatsapp-web.js 1.34.6 &raquo; Source: structures/BusinessContact.js</title>\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Karla:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Noto+Serif:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Inconsolata:500\" type=\"text/css\">\n  <link href=\"css/baseline.css\" rel=\"stylesheet\">\n</head>\n\n<body onload=\"prettyPrint()\">\n  <nav id=\"jsdoc-navbar\" role=\"navigation\" class=\"jsdoc-navbar\">\n    <div id=\"jsdoc-navbar-container\">\n      <div id=\"jsdoc-navbar-content\">\n        <a href=\"index.html\" class=\"jsdoc-navbar-package-name\">whatsapp-web.<wbr>js 1.<wbr>34.<wbr>6</a>\n      </div>\n    </div>\n  </nav>\n  <div id=\"jsdoc-body-container\">\n    <div id=\"jsdoc-content\">\n      <div id=\"jsdoc-content-container\">\n        <div id=\"jsdoc-banner\" role=\"banner\">\n        </div>\n        <div id=\"jsdoc-main\" role=\"main\">\n          <header class=\"page-header\">\n            <h1>Source: structures/BusinessContact.js</h1>\n          </header>\n          <article>\n            <pre class=\"prettyprint linenums\"><code>&#x27;use strict&#x27;;\n\nconst Contact &#x3D; require(&#x27;./Contact&#x27;);\n\n/**\n * Represents a Business Contact on WhatsApp\n * @extends {Contact}\n */\nclass BusinessContact extends Contact {\n    _patch(data) {\n        /**\n         * The contact&#x27;s business profile\n         */\n        this.businessProfile &#x3D; data.businessProfile;\n\n        return super._patch(data);\n    }\n\n}\n\nmodule.exports &#x3D; BusinessContact;</code></pre>\n          </article>\n        </div>\n      </div>\n      <nav id=\"jsdoc-toc-nav\" role=\"navigation\"></nav>\n    </div>\n  </div>\n  <footer id=\"jsdoc-footer\" class=\"jsdoc-footer\">\n    <div id=\"jsdoc-footer-container\">\n      <p>\n        Generated by <a href=\"https://github.com/jsdoc3/jsdoc\">JSDoc</a> 3.6.11 on January 30, 2026.\n      </p>\n    </div>\n  </footer>\n  <script src=\"scripts/jquery.min.js\"></script>\n  <script src=\"scripts/tree.jquery.js\"></script>\n  <script src=\"scripts/prettify.js\"></script>\n  <script src=\"scripts/jsdoc-toc.js\"></script>\n  <script src=\"scripts/linenumber.js\"></script>\n  <script src=\"scripts/scrollanchor.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "docs/structures_Buttons.js.html",
    "content": "<!doctype html>\n<html>\n\n<head>\n  <meta name=\"generator\" content=\"JSDoc 3.6.11\">\n  <meta charset=\"utf-8\">\n  <title>whatsapp-web.js 1.34.6 &raquo; Source: structures/Buttons.js</title>\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Karla:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Noto+Serif:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Inconsolata:500\" type=\"text/css\">\n  <link href=\"css/baseline.css\" rel=\"stylesheet\">\n</head>\n\n<body onload=\"prettyPrint()\">\n  <nav id=\"jsdoc-navbar\" role=\"navigation\" class=\"jsdoc-navbar\">\n    <div id=\"jsdoc-navbar-container\">\n      <div id=\"jsdoc-navbar-content\">\n        <a href=\"index.html\" class=\"jsdoc-navbar-package-name\">whatsapp-web.<wbr>js 1.<wbr>34.<wbr>6</a>\n      </div>\n    </div>\n  </nav>\n  <div id=\"jsdoc-body-container\">\n    <div id=\"jsdoc-content\">\n      <div id=\"jsdoc-content-container\">\n        <div id=\"jsdoc-banner\" role=\"banner\">\n        </div>\n        <div id=\"jsdoc-main\" role=\"main\">\n          <header class=\"page-header\">\n            <h1>Source: structures/Buttons.js</h1>\n          </header>\n          <article>\n            <pre class=\"prettyprint linenums\"><code>&#x27;use strict&#x27;;\n\nconst MessageMedia &#x3D; require(&#x27;./MessageMedia&#x27;);\nconst Util &#x3D; require(&#x27;../util/Util&#x27;);\n\n/**\n * Button spec used in Buttons constructor\n * @typedef {Object} ButtonSpec\n * @property {string&#x3D;} id - Custom ID to set on the button. A random one will be generated if one is not passed.\n * @property {string} body - The text to show on the button.\n */\n\n/**\n * @typedef {Object} FormattedButtonSpec\n * @property {string} buttonId\n * @property {number} type\n * @property {Object} buttonText\n */\n\n/**\n * Message type buttons\n */\nclass Buttons {\n    /**\n     * @param {string|MessageMedia} body\n     * @param {ButtonSpec[]} buttons - See {@link ButtonSpec}\n     * @param {string?} title\n     * @param {string?} footer\n     */\n    constructor(body, buttons, title, footer) {\n        /**\n         * Message body\n         * @type {string|MessageMedia}\n         */\n        this.body &#x3D; body;\n\n        /**\n         * title of message\n         * @type {string}\n         */\n        this.title &#x3D; title;\n        \n        /**\n         * footer of message\n         * @type {string}\n         */\n        this.footer &#x3D; footer;\n\n        if (body instanceof MessageMedia) {\n            this.type &#x3D; &#x27;media&#x27;;\n            this.title &#x3D; &#x27;&#x27;;\n        }else{\n            this.type &#x3D; &#x27;chat&#x27;;\n        }\n\n        /**\n         * buttons of message\n         * @type {FormattedButtonSpec[]}\n         */\n        this.buttons &#x3D; this._format(buttons);\n        if(!this.buttons.length){ throw &#x27;[BT01] No buttons&#x27;;}\n                \n    }\n\n    /**\n     * Creates button array from simple array\n     * @param {ButtonSpec[]} buttons\n     * @returns {FormattedButtonSpec[]}\n     * @example \n     * Input: [{id:&#x27;customId&#x27;,body:&#x27;button1&#x27;},{body:&#x27;button2&#x27;},{body:&#x27;button3&#x27;},{body:&#x27;button4&#x27;}]\n     * Returns: [{ buttonId:&#x27;customId&#x27;,buttonText:{&#x27;displayText&#x27;:&#x27;button1&#x27;},type: 1 },{buttonId:&#x27;n3XKsL&#x27;,buttonText:{&#x27;displayText&#x27;:&#x27;button2&#x27;},type:1},{buttonId:&#x27;NDJk0a&#x27;,buttonText:{&#x27;displayText&#x27;:&#x27;button3&#x27;},type:1}]\n     */\n    _format(buttons){\n        buttons &#x3D; buttons.slice(0,3); // phone users can only see 3 buttons, so lets limit this\n        return buttons.map((btn) &#x3D;&gt; {\n            return {&#x27;buttonId&#x27;:btn.id ? String(btn.id) : Util.generateHash(6),&#x27;buttonText&#x27;:{&#x27;displayText&#x27;:btn.body},&#x27;type&#x27;:1};\n        });\n    }\n    \n}\n\nmodule.exports &#x3D; Buttons;</code></pre>\n          </article>\n        </div>\n      </div>\n      <nav id=\"jsdoc-toc-nav\" role=\"navigation\"></nav>\n    </div>\n  </div>\n  <footer id=\"jsdoc-footer\" class=\"jsdoc-footer\">\n    <div id=\"jsdoc-footer-container\">\n      <p>\n        Generated by <a href=\"https://github.com/jsdoc3/jsdoc\">JSDoc</a> 3.6.11 on January 30, 2026.\n      </p>\n    </div>\n  </footer>\n  <script src=\"scripts/jquery.min.js\"></script>\n  <script src=\"scripts/tree.jquery.js\"></script>\n  <script src=\"scripts/prettify.js\"></script>\n  <script src=\"scripts/jsdoc-toc.js\"></script>\n  <script src=\"scripts/linenumber.js\"></script>\n  <script src=\"scripts/scrollanchor.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "docs/structures_Call.js.html",
    "content": "<!doctype html>\n<html>\n\n<head>\n  <meta name=\"generator\" content=\"JSDoc 3.6.11\">\n  <meta charset=\"utf-8\">\n  <title>whatsapp-web.js 1.34.6 &raquo; Source: structures/Call.js</title>\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Karla:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Noto+Serif:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Inconsolata:500\" type=\"text/css\">\n  <link href=\"css/baseline.css\" rel=\"stylesheet\">\n</head>\n\n<body onload=\"prettyPrint()\">\n  <nav id=\"jsdoc-navbar\" role=\"navigation\" class=\"jsdoc-navbar\">\n    <div id=\"jsdoc-navbar-container\">\n      <div id=\"jsdoc-navbar-content\">\n        <a href=\"index.html\" class=\"jsdoc-navbar-package-name\">whatsapp-web.<wbr>js 1.<wbr>34.<wbr>6</a>\n      </div>\n    </div>\n  </nav>\n  <div id=\"jsdoc-body-container\">\n    <div id=\"jsdoc-content\">\n      <div id=\"jsdoc-content-container\">\n        <div id=\"jsdoc-banner\" role=\"banner\">\n        </div>\n        <div id=\"jsdoc-main\" role=\"main\">\n          <header class=\"page-header\">\n            <h1>Source: structures/Call.js</h1>\n          </header>\n          <article>\n            <pre class=\"prettyprint linenums\"><code>&#x27;use strict&#x27;;\n\nconst Base &#x3D; require(&#x27;./Base&#x27;);\n\n/**\n * Represents a Call on WhatsApp\n * @extends {Base}\n */\nclass Call extends Base {\n    constructor(client, data) {\n        super(client);\n\n        if (data) this._patch(data);\n    }\n\n    _patch(data) {\n        /**\n         * Call ID\n         * @type {string}\n         */\n        this.id &#x3D; data.id;\n        /**\n         * From\n         * @type {string}\n         */\n        this.from &#x3D; data.peerJid;\n        /**\n         * Unix timestamp for when the call was created\n         * @type {number}\n         */\n        this.timestamp &#x3D; data.offerTime;\n        /**\n         * Is video\n         * @type {boolean}\n         */\n        this.isVideo &#x3D; data.isVideo;\n        /**\n         * Is Group\n         * @type {boolean}\n         */\n        this.isGroup &#x3D; data.isGroup;\n        /**\n         * Indicates if the call was sent by the current user\n         * @type {boolean}\n         */\n        this.fromMe &#x3D; data.outgoing;\n        /**\n         * Indicates if the call can be handled in waweb\n         * @type {boolean}\n         */\n        this.canHandleLocally &#x3D; data.canHandleLocally;\n        /**\n         * Indicates if the call Should be handled in waweb\n         * @type {boolean}\n         */\n        this.webClientShouldHandle &#x3D; data.webClientShouldHandle;\n        /**\n         * Object with participants\n         * @type {object}\n         */\n        this.participants &#x3D; data.participants;\n        \n        return super._patch(data);\n    }\n\n    /**\n     * Reject the call\n    */\n    async reject() {\n        return this.client.pupPage.evaluate((peerJid, id) &#x3D;&gt; {\n            return window.WWebJS.rejectCall(peerJid, id);\n        }, this.from, this.id);\n    }\n}\n\nmodule.exports &#x3D; Call;</code></pre>\n          </article>\n        </div>\n      </div>\n      <nav id=\"jsdoc-toc-nav\" role=\"navigation\"></nav>\n    </div>\n  </div>\n  <footer id=\"jsdoc-footer\" class=\"jsdoc-footer\">\n    <div id=\"jsdoc-footer-container\">\n      <p>\n        Generated by <a href=\"https://github.com/jsdoc3/jsdoc\">JSDoc</a> 3.6.11 on January 30, 2026.\n      </p>\n    </div>\n  </footer>\n  <script src=\"scripts/jquery.min.js\"></script>\n  <script src=\"scripts/tree.jquery.js\"></script>\n  <script src=\"scripts/prettify.js\"></script>\n  <script src=\"scripts/jsdoc-toc.js\"></script>\n  <script src=\"scripts/linenumber.js\"></script>\n  <script src=\"scripts/scrollanchor.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "docs/structures_Channel.js.html",
    "content": "<!doctype html>\n<html>\n\n<head>\n  <meta name=\"generator\" content=\"JSDoc 3.6.11\">\n  <meta charset=\"utf-8\">\n  <title>whatsapp-web.js 1.34.6 &raquo; Source: structures/Channel.js</title>\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Karla:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Noto+Serif:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Inconsolata:500\" type=\"text/css\">\n  <link href=\"css/baseline.css\" rel=\"stylesheet\">\n</head>\n\n<body onload=\"prettyPrint()\">\n  <nav id=\"jsdoc-navbar\" role=\"navigation\" class=\"jsdoc-navbar\">\n    <div id=\"jsdoc-navbar-container\">\n      <div id=\"jsdoc-navbar-content\">\n        <a href=\"index.html\" class=\"jsdoc-navbar-package-name\">whatsapp-web.<wbr>js 1.<wbr>34.<wbr>6</a>\n      </div>\n    </div>\n  </nav>\n  <div id=\"jsdoc-body-container\">\n    <div id=\"jsdoc-content\">\n      <div id=\"jsdoc-content-container\">\n        <div id=\"jsdoc-banner\" role=\"banner\">\n        </div>\n        <div id=\"jsdoc-main\" role=\"main\">\n          <header class=\"page-header\">\n            <h1>Source: structures/Channel.js</h1>\n          </header>\n          <article>\n            <pre class=\"prettyprint linenums\"><code>&#x27;use strict&#x27;;\n\nconst Base &#x3D; require(&#x27;./Base&#x27;);\nconst Message &#x3D; require(&#x27;./Message&#x27;);\n\n/**\n * Channel ID structure\n * @typedef {Object} ChannelId\n * @property {string} server\n * @property {string} user\n * @property {string} _serialized\n */\n\n/**\n * Represents a Channel on WhatsApp\n * @extends {Base}\n */\nclass Channel extends Base {\n    constructor(client, data) {\n        super(client);\n\n        if (data) this._patch(data);\n    }\n\n    _patch(data) {\n        this.channelMetadata &#x3D; data.channelMetadata;\n\n        /**\n         * ID that represents the channel\n         * @type {ChannelId}\n         */\n        this.id &#x3D; data.id;\n\n        /**\n         * Title of the channel\n         * @type {string}\n         */\n        this.name &#x3D; data.name;\n\n        /** \n         * The channel description\n         * @type {string}\n         */\n        this.description &#x3D; data.channelMetadata.description;\n\n        /**\n         * Indicates if it is a Channel\n         * @type {boolean}\n         */\n        this.isChannel &#x3D; data.isChannel;\n\n        /**\n         * Indicates if it is a Group\n         * @type {boolean}\n         */\n        this.isGroup &#x3D; data.isGroup;\n\n        /**\n         * Indicates if the channel is readonly\n         * @type {boolean}\n         */\n        this.isReadOnly &#x3D; data.isReadOnly;\n\n        /**\n         * Amount of messages unread\n         * @type {number}\n         */\n        this.unreadCount &#x3D; data.unreadCount;\n\n        /**\n         * Unix timestamp for when the last activity occurred\n         * @type {number}\n         */\n        this.timestamp &#x3D; data.t;\n\n        /**\n         * Indicates if the channel is muted or not\n         * @type {boolean}\n         */\n        this.isMuted &#x3D; data.isMuted;\n\n        /**\n         * Unix timestamp for when the mute expires\n         * @type {number}\n         */\n        this.muteExpiration &#x3D; data.muteExpiration;\n\n        /**\n         * Last message in the channel\n         * @type {Message}\n         */\n        this.lastMessage &#x3D; data.lastMessage ? new Message(super.client, data.lastMessage) : undefined;\n\n        return super._patch(data);\n    }\n\n    /**\n     * Gets the subscribers of the channel (only those who are in your contact list)\n     * @param {?number} limit Optional parameter to specify the limit of subscribers to retrieve\n     * @returns {Promise&amp;lt;Array&amp;lt;{contact: Contact, role: string}&gt;&gt;} Returns an array of objects that handle the subscribed contacts and their roles in the channel\n     */\n    async getSubscribers(limit) {\n        return await this.client.pupPage.evaluate(async (channelId, limit) &#x3D;&gt; {\n            const channel &#x3D; await window.WWebJS.getChat(channelId, { getAsModel: false });\n            if (!channel) return [];\n            !limit &amp;amp;&amp;amp; (limit &#x3D; window.Store.ChannelUtils.getMaxSubscriberNumber());\n            const response &#x3D; await window.Store.ChannelSubscribers.mexFetchNewsletterSubscribers(channelId, limit);\n            const contacts &#x3D; window.Store.ChannelSubscribers.getSubscribersInContacts(response.subscribers);\n            return Promise.all(contacts.map((obj) &#x3D;&gt; ({\n                ...obj,\n                contact: window.WWebJS.getContactModel(obj.contact)\n            })));\n        }, this.id._serialized, limit);\n    }\n\n    /**\n     * Updates the channel subject\n     * @param {string} newSubject \n     * @returns {Promise&amp;lt;boolean&gt;} Returns true if the subject was properly updated. This can return false if the user does not have the necessary permissions.\n     */\n    async setSubject(newSubject) {\n        const success &#x3D; await this._setChannelMetadata({ name: newSubject }, { editName: true });\n        success &amp;amp;&amp;amp; (this.name &#x3D; newSubject);\n        return success;\n    }\n\n    /**\n     * Updates the channel description\n     * @param {string} newDescription \n     * @returns {Promise&amp;lt;boolean&gt;} Returns true if the operation completed successfully, false otherwise\n     */\n    async setDescription(newDescription) {\n        const success &#x3D; await this._setChannelMetadata({ description: newDescription }, { editDescription: true });\n        success &amp;amp;&amp;amp; (this.description &#x3D; newDescription);\n        return success;\n    }\n\n    /**\n     * Updates the channel profile picture\n     * @param {MessageMedia} newProfilePicture \n     * @returns {Promise&amp;lt;boolean&gt;} Returns true if the operation completed successfully, false otherwise\n     */\n    async setProfilePicture(newProfilePicture) {\n        return await this._setChannelMetadata({ picture: newProfilePicture }, { editPicture: true });\n    }\n\n    /**\n     * Updates available reactions to use in the channel\n     * \n     * Valid values for passing to the method are:\n     * 0 for NONE reactions to be avaliable\n     * 1 for BASIC reactions to be available: 👍, ❤️, 😂, 😮, 😢, 🙏\n     * 2 for ALL reactions to be available\n     * @param {number} reactionCode \n     * @returns {Promise&amp;lt;boolean&gt;} Returns true if the operation completed successfully, false otherwise\n     */\n    async setReactionSetting(reactionCode) {\n        if (![0, 1, 2].includes(reactionCode)) return false;\n        const reactionMapper &#x3D; {\n            0: 3,\n            1: 1,\n            2: 0\n        };\n        const success &#x3D; await this._setChannelMetadata(\n            { reactionCodesSetting: reactionMapper[reactionCode] },\n            { editReactionCodesSetting: true }\n        );\n        success &amp;amp;&amp;amp; (this.channelMetadata.reactionCodesSetting &#x3D; reactionCode);\n        return success;\n    }\n\n    /**\n     * Mutes the channel\n     * @returns {Promise&amp;lt;boolean&gt;} Returns true if the operation completed successfully, false otherwise\n     */\n    async mute() {\n        const success &#x3D; await this._muteUnmuteChannel(&#x27;MUTE&#x27;);\n        if (success) {\n            this.isMuted &#x3D; true;\n            this.muteExpiration &#x3D; -1;\n        }\n        return success;\n    }\n    \n    /**\n     * Unmutes the channel\n     * @returns {Promise&amp;lt;boolean&gt;} Returns true if the operation completed successfully, false otherwise\n     */\n    async unmute() {\n        const success &#x3D; await this._muteUnmuteChannel(&#x27;UNMUTE&#x27;);\n        if (success) {\n            this.isMuted &#x3D; false;\n            this.muteExpiration &#x3D; 0;\n        }\n        return success;\n    }\n\n    /**\n     * Message options\n     * @typedef {Object} MessageSendOptions\n     * @property {?string} caption Image or video caption\n     * @property {?string[]} mentions User IDs of user that will be mentioned in the message\n     * @property {?MessageMedia} media Image or video to be sent\n     */\n\n    /**\n     * Sends a message to this channel\n     * @param {string|MessageMedia} content\n     * @param {?MessageSendOptions} options\n     * @returns {Promise&amp;lt;Message&gt;} Message that was just sent\n     */\n    async sendMessage(content, options) {\n        return this.client.sendMessage(this.id._serialized, content, options);\n    }\n\n    /**\n     * Sets the channel as seen\n     * @returns {Promise&amp;lt;boolean&gt;}\n     */\n    async sendSeen() {\n        return this.client.sendSeen(this.id._serialized);\n    }\n\n    /**\n     * @typedef {Object} SendChannelAdminInviteOptions\n     * @property {?string} comment The comment to be added to an invitation\n     */\n\n    /**\n     * Sends a channel admin invitation to a user, allowing them to become an admin of the channel\n     * @param {string} chatId The ID of a user to send the channel admin invitation to\n     * @param {SendChannelAdminInviteOptions} options \n     * @returns {Promise&amp;lt;boolean&gt;} Returns true if an invitation was sent successfully, false otherwise\n     */\n    async sendChannelAdminInvite(chatId, options &#x3D; {}) {\n        return this.client.sendChannelAdminInvite(chatId, this.id._serialized, options);\n    }\n\n    /**\n     * Accepts a channel admin invitation and promotes the current user to a channel admin\n     * @returns {Promise&amp;lt;boolean&gt;} Returns true if the operation completed successfully, false otherwise\n     */\n    async acceptChannelAdminInvite() {\n        return this.client.acceptChannelAdminInvite(this.id._serialized);\n    }\n\n    /**\n     * Revokes a channel admin invitation sent to a user by a channel owner\n     * @param {string} userId The user ID the invitation was sent to\n     * @returns {Promise&amp;lt;boolean&gt;} Returns true if the operation completed successfully, false otherwise\n     */\n    async revokeChannelAdminInvite(userId) {\n        return this.client.revokeChannelAdminInvite(this.id._serialized, userId);\n    }\n\n    /**\n     * Demotes a channel admin to a regular subscriber (can be used also for self-demotion)\n     * @param {string} userId The user ID to demote\n     * @returns {Promise&amp;lt;boolean&gt;} Returns true if the operation completed successfully, false otherwise\n     */\n    async demoteChannelAdmin(userId) {\n        return this.client.demoteChannelAdmin(this.id._serialized, userId);\n    }\n\n    /**\n     * Options for transferring a channel ownership to another user\n     * @typedef {Object} TransferChannelOwnershipOptions\n     * @property {boolean} [shouldDismissSelfAsAdmin &#x3D; false] If true, after the channel ownership is being transferred to another user, the current user will be dismissed as a channel admin and will become to a channel subscriber.\n     */\n\n    /**\n     * Transfers a channel ownership to another user.\n     * Note: the user you are transferring the channel ownership to must be a channel admin.\n     * @param {string} newOwnerId\n     * @param {TransferChannelOwnershipOptions} options\n     * @returns {Promise&amp;lt;boolean&gt;} Returns true if the operation completed successfully, false otherwise\n     */\n    async transferChannelOwnership(newOwnerId, options &#x3D; {}) {\n        return this.client.transferChannelOwnership(this.id._serialized, newOwnerId, options);\n    }\n\n    /**\n     * Loads channel messages, sorted from earliest to latest\n     * @param {Object} searchOptions Options for searching messages. Right now only limit and fromMe is supported\n     * @param {Number} [searchOptions.limit] The amount of messages to return. If no limit is specified, the available messages will be returned. Note that the actual number of returned messages may be smaller if there aren&#x27;t enough messages in the conversation. Set this to Infinity to load all messages\n     * @param {Boolean} [searchOptions.fromMe] Return only messages from the bot number or vise versa. To get all messages, leave the option undefined\n     * @returns {Promise&amp;lt;Array&amp;lt;Message&gt;&gt;}\n     */\n    async fetchMessages(searchOptions) {\n        let messages &#x3D; await this.client.pupPage.evaluate(async (channelId, searchOptions) &#x3D;&gt; {\n            const msgFilter &#x3D; (m) &#x3D;&gt; {\n                if (m.isNotification || m.type &#x3D;&#x3D;&#x3D; &#x27;newsletter_notification&#x27;) {\n                    return false; // dont include notification messages\n                }\n                if (searchOptions &amp;amp;&amp;amp; searchOptions.fromMe !&#x3D;&#x3D; undefined &amp;amp;&amp;amp; m.id.fromMe !&#x3D;&#x3D; searchOptions.fromMe) {\n                    return false;\n                }\n                return true;\n            };\n\n            const channel &#x3D; await window.WWebJS.getChat(channelId, { getAsModel: false });\n            let msgs &#x3D; channel.msgs.getModelsArray().filter(msgFilter);\n\n            if (searchOptions &amp;amp;&amp;amp; searchOptions.limit &gt; 0) {\n                while (msgs.length &amp;lt; searchOptions.limit) {\n                    const loadedMessages &#x3D; await window.Store.ConversationMsgs.loadEarlierMsgs(channel);\n                    if (!loadedMessages || !loadedMessages.length) break;\n                    msgs &#x3D; [...loadedMessages.filter(msgFilter), ...msgs];\n                }\n                \n                if (msgs.length &gt; searchOptions.limit) {\n                    msgs.sort((a, b) &#x3D;&gt; (a.t &gt; b.t) ? 1 : -1);\n                    msgs &#x3D; msgs.splice(msgs.length - searchOptions.limit);\n                }\n            }\n\n            return msgs.map(m &#x3D;&gt; window.WWebJS.getMessageModel(m));\n\n        }, this.id._serialized, searchOptions);\n\n        return messages.map((msg) &#x3D;&gt; new Message(this.client, msg));\n    }\n\n    /**\n     * Deletes the channel you created\n     * @returns {Promise&amp;lt;boolean&gt;} Returns true if the operation completed successfully, false otherwise\n     */\n    async deleteChannel() {\n        return this.client.deleteChannel(this.id._serialized);\n    }\n\n    /**\n     * Internal method to change the channel metadata\n     * @param {string|number|MessageMedia} value The new value to set\n     * @param {string} property The property of a channel metadata to change\n     * @returns {Promise&amp;lt;boolean&gt;} Returns true if the operation completed successfully, false otherwise\n     */\n    async _setChannelMetadata(value, property) {\n        return await this.client.pupPage.evaluate(async (channelId, value, property) &#x3D;&gt; {\n            const channel &#x3D; await window.WWebJS.getChat(channelId, { getAsModel: false });\n            if (!channel) return false;\n            if (property.editPicture) {\n                value.picture &#x3D; value.picture\n                    ? await window.WWebJS.cropAndResizeImage(value.picture, {\n                        asDataUrl: true,\n                        mimetype: &#x27;image/jpeg&#x27;,\n                        size: 640,\n                        quality: 1\n                    })\n                    : null;\n            }\n            try {\n                await window.Store.ChannelUtils.editNewsletterMetadataAction(channel, property, value);\n                return true;\n            } catch (err) {\n                if (err.name &#x3D;&#x3D;&#x3D; &#x27;ServerStatusCodeError&#x27;) return false;\n                throw err;\n            }\n        }, this.id._serialized, value, property);\n    }\n\n    /**\n     * Internal method to mute or unmute the channel\n     * @param {string} action The action: &#x27;MUTE&#x27; or &#x27;UNMUTE&#x27;\n     * @returns {Promise&amp;lt;boolean&gt;} Returns true if the operation completed successfully, false otherwise\n     */\n    async _muteUnmuteChannel(action) {\n        return await this.client.pupPage.evaluate(async (channelId, action) &#x3D;&gt; {\n            try {\n                action &#x3D;&#x3D;&#x3D; &#x27;MUTE&#x27;\n                    ? await window.Store.ChannelUtils.muteNewsletter([channelId])\n                    : await window.Store.ChannelUtils.unmuteNewsletter([channelId]);\n                return true;\n            } catch (err) {\n                if (err.name &#x3D;&#x3D;&#x3D; &#x27;ServerStatusCodeError&#x27;) return false;\n                throw err;\n            }\n        }, this.id._serialized, action);\n    }\n}\n\nmodule.exports &#x3D; Channel;\n</code></pre>\n          </article>\n        </div>\n      </div>\n      <nav id=\"jsdoc-toc-nav\" role=\"navigation\"></nav>\n    </div>\n  </div>\n  <footer id=\"jsdoc-footer\" class=\"jsdoc-footer\">\n    <div id=\"jsdoc-footer-container\">\n      <p>\n        Generated by <a href=\"https://github.com/jsdoc3/jsdoc\">JSDoc</a> 3.6.11 on January 30, 2026.\n      </p>\n    </div>\n  </footer>\n  <script src=\"scripts/jquery.min.js\"></script>\n  <script src=\"scripts/tree.jquery.js\"></script>\n  <script src=\"scripts/prettify.js\"></script>\n  <script src=\"scripts/jsdoc-toc.js\"></script>\n  <script src=\"scripts/linenumber.js\"></script>\n  <script src=\"scripts/scrollanchor.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "docs/structures_Chat.js.html",
    "content": "<!doctype html>\n<html>\n\n<head>\n  <meta name=\"generator\" content=\"JSDoc 3.6.11\">\n  <meta charset=\"utf-8\">\n  <title>whatsapp-web.js 1.34.6 &raquo; Source: structures/Chat.js</title>\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Karla:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Noto+Serif:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Inconsolata:500\" type=\"text/css\">\n  <link href=\"css/baseline.css\" rel=\"stylesheet\">\n</head>\n\n<body onload=\"prettyPrint()\">\n  <nav id=\"jsdoc-navbar\" role=\"navigation\" class=\"jsdoc-navbar\">\n    <div id=\"jsdoc-navbar-container\">\n      <div id=\"jsdoc-navbar-content\">\n        <a href=\"index.html\" class=\"jsdoc-navbar-package-name\">whatsapp-web.<wbr>js 1.<wbr>34.<wbr>6</a>\n      </div>\n    </div>\n  </nav>\n  <div id=\"jsdoc-body-container\">\n    <div id=\"jsdoc-content\">\n      <div id=\"jsdoc-content-container\">\n        <div id=\"jsdoc-banner\" role=\"banner\">\n        </div>\n        <div id=\"jsdoc-main\" role=\"main\">\n          <header class=\"page-header\">\n            <h1>Source: structures/Chat.js</h1>\n          </header>\n          <article>\n            <pre class=\"prettyprint linenums\"><code>&#x27;use strict&#x27;;\n\nconst Base &#x3D; require(&#x27;./Base&#x27;);\nconst Message &#x3D; require(&#x27;./Message&#x27;);\n\n/**\n * Represents a Chat on WhatsApp\n * @extends {Base}\n */\nclass Chat extends Base {\n    constructor(client, data) {\n        super(client);\n\n        if (data) this._patch(data);\n    }\n\n    _patch(data) {\n        /**\n         * ID that represents the chat\n         * @type {object}\n         */\n        this.id &#x3D; data.id;\n\n        /**\n         * Title of the chat\n         * @type {string}\n         */\n        this.name &#x3D; data.formattedTitle;\n\n        /**\n         * Indicates if the Chat is a Group Chat\n         * @type {boolean}\n         */\n        this.isGroup &#x3D; data.isGroup;\n\n        /**\n         * Indicates if the Chat is readonly\n         * @type {boolean}\n         */\n        this.isReadOnly &#x3D; data.isReadOnly;\n\n        /**\n         * Amount of messages unread\n         * @type {number}\n         */\n        this.unreadCount &#x3D; data.unreadCount;\n\n        /**\n         * Unix timestamp for when the last activity occurred\n         * @type {number}\n         */\n        this.timestamp &#x3D; data.t;\n\n        /**\n         * Indicates if the Chat is archived\n         * @type {boolean}\n         */\n        this.archived &#x3D; data.archive;\n\n        /**\n         * Indicates if the Chat is pinned\n         * @type {boolean}\n         */\n        this.pinned &#x3D; !!data.pin;\n\n        /**\n         * Indicates if the chat is muted or not\n         * @type {boolean}\n         */\n        this.isMuted &#x3D; data.isMuted;\n\n        /**\n         * Unix timestamp for when the mute expires\n         * @type {number}\n         */\n        this.muteExpiration &#x3D; data.muteExpiration;\n\n        /**\n         * Last message fo chat\n         * @type {Message}\n         */\n        this.lastMessage &#x3D; data.lastMessage ? new Message(this.client, data.lastMessage) : undefined;\n        \n        return super._patch(data);\n    }\n\n    /**\n     * Send a message to this chat\n     * @param {string|MessageMedia|Location} content\n     * @param {MessageSendOptions} [options] \n     * @returns {Promise&amp;lt;Message&gt;} Message that was just sent\n     */\n    async sendMessage(content, options) {\n        return this.client.sendMessage(this.id._serialized, content, options);\n    }\n\n    /**\n     * Sets the chat as seen\n     * @returns {Promise&amp;lt;Boolean&gt;} result\n     */\n    async sendSeen() {\n        return this.client.sendSeen(this.id._serialized);\n    }\n\n    /**\n     * Clears all messages from the chat\n     * @returns {Promise&amp;lt;boolean&gt;} result\n     */\n    async clearMessages() {\n        return this.client.pupPage.evaluate(chatId &#x3D;&gt; {\n            return window.WWebJS.sendClearChat(chatId);\n        }, this.id._serialized);\n    }\n\n    /**\n     * Deletes the chat\n     * @returns {Promise&amp;lt;Boolean&gt;} result\n     */\n    async delete() {\n        return this.client.pupPage.evaluate(chatId &#x3D;&gt; {\n            return window.WWebJS.sendDeleteChat(chatId);\n        }, this.id._serialized);\n    }\n\n    /**\n     * Archives this chat\n     */\n    async archive() {\n        return this.client.archiveChat(this.id._serialized);\n    }\n\n    /**\n     * un-archives this chat\n     */\n    async unarchive() {\n        return this.client.unarchiveChat(this.id._serialized);\n    }\n\n    /**\n     * Pins this chat\n     * @returns {Promise&amp;lt;boolean&gt;} New pin state. Could be false if the max number of pinned chats was reached.\n     */\n    async pin() {\n        return this.client.pinChat(this.id._serialized);\n    }\n\n    /**\n     * Unpins this chat\n     * @returns {Promise&amp;lt;boolean&gt;} New pin state\n     */\n    async unpin() {\n        return this.client.unpinChat(this.id._serialized);\n    }\n\n    /**\n     * Mutes this chat forever, unless a date is specified\n     * @param {?Date} unmuteDate Date when the chat will be unmuted, don&#x27;t provide a value to mute forever\n     * @returns {Promise&amp;lt;{isMuted: boolean, muteExpiration: number}&gt;}\n     */\n    async mute(unmuteDate) {\n        const result &#x3D; await this.client.muteChat(this.id._serialized, unmuteDate);\n        this.isMuted &#x3D; result.isMuted;\n        this.muteExpiration &#x3D; result.muteExpiration;\n        return result;\n    }\n\n    /**\n     * Unmutes this chat\n     * @returns {Promise&amp;lt;{isMuted: boolean, muteExpiration: number}&gt;}\n     */\n    async unmute() {\n        const result &#x3D; await this.client.unmuteChat(this.id._serialized);\n        this.isMuted &#x3D; result.isMuted;\n        this.muteExpiration &#x3D; result.muteExpiration;\n        return result;\n    }\n\n    /**\n     * Mark this chat as unread\n     */\n    async markUnread(){\n        return this.client.markChatUnread(this.id._serialized);\n    }\n\n    /**\n     * Loads chat messages, sorted from earliest to latest.\n     * @param {Object} searchOptions Options for searching messages. Right now only limit and fromMe is supported.\n     * @param {Number} [searchOptions.limit] The amount of messages to return. If no limit is specified, the available messages will be returned. Note that the actual number of returned messages may be smaller if there aren&#x27;t enough messages in the conversation. Set this to Infinity to load all messages.\n     * @param {Boolean} [searchOptions.fromMe] Return only messages from the bot number or vise versa. To get all messages, leave the option undefined.\n     * @returns {Promise&amp;lt;Array&amp;lt;Message&gt;&gt;}\n     */\n    async fetchMessages(searchOptions) {\n        let messages &#x3D; await this.client.pupPage.evaluate(async (chatId, searchOptions) &#x3D;&gt; {\n            const msgFilter &#x3D; (m) &#x3D;&gt; {\n                if (m.isNotification) {\n                    return false; // dont include notification messages\n                }\n                if (searchOptions &amp;amp;&amp;amp; searchOptions.fromMe !&#x3D;&#x3D; undefined &amp;amp;&amp;amp; m.id.fromMe !&#x3D;&#x3D; searchOptions.fromMe) {\n                    return false;\n                }\n                return true;\n            };\n\n            const chat &#x3D; await window.WWebJS.getChat(chatId, { getAsModel: false });\n            let msgs &#x3D; chat.msgs.getModelsArray().filter(msgFilter);\n\n            if (searchOptions &amp;amp;&amp;amp; searchOptions.limit &gt; 0) {\n                while (msgs.length &amp;lt; searchOptions.limit) {\n                    const loadedMessages &#x3D; await window.Store.ConversationMsgs.loadEarlierMsgs(chat,chat.msgs);\n                    if (!loadedMessages || !loadedMessages.length) break;\n                    msgs &#x3D; [...loadedMessages.filter(msgFilter), ...msgs];\n                }\n                \n                if (msgs.length &gt; searchOptions.limit) {\n                    msgs.sort((a, b) &#x3D;&gt; (a.t &gt; b.t) ? 1 : -1);\n                    msgs &#x3D; msgs.splice(msgs.length - searchOptions.limit);\n                }\n            }\n\n            return msgs.map(m &#x3D;&gt; window.WWebJS.getMessageModel(m));\n\n        }, this.id._serialized, searchOptions);\n\n        return messages.map(m &#x3D;&gt; new Message(this.client, m));\n    }\n\n    /**\n     * Simulate typing in chat. This will last for 25 seconds.\n     */\n    async sendStateTyping() {\n        return this.client.pupPage.evaluate(chatId &#x3D;&gt; {\n            window.WWebJS.sendChatstate(&#x27;typing&#x27;, chatId);\n            return true;\n        }, this.id._serialized);\n    }\n\n    /**\n     * Simulate recording audio in chat. This will last for 25 seconds.\n     */\n    async sendStateRecording() {\n        return this.client.pupPage.evaluate(chatId &#x3D;&gt; {\n            window.WWebJS.sendChatstate(&#x27;recording&#x27;, chatId);\n            return true;\n        }, this.id._serialized);\n    }\n\n    /**\n     * Stops typing or recording in chat immediately.\n     */\n    async clearState() {\n        return this.client.pupPage.evaluate(chatId &#x3D;&gt; {\n            window.WWebJS.sendChatstate(&#x27;stop&#x27;, chatId);\n            return true;\n        }, this.id._serialized);\n    }\n\n    /**\n     * Returns the Contact that corresponds to this Chat.\n     * @returns {Promise&amp;lt;Contact&gt;}\n     */\n    async getContact() {\n        return await this.client.getContactById(this.id._serialized);\n    }\n\n    /**\n     * Returns array of all Labels assigned to this Chat\n     * @returns {Promise&amp;lt;Array&amp;lt;Label&gt;&gt;}\n     */\n    async getLabels() {\n        return this.client.getChatLabels(this.id._serialized);\n    }\n\n    /**\n     * Add or remove labels to this Chat\n     * @param {Array&amp;lt;number|string&gt;} labelIds\n     * @returns {Promise&amp;lt;void&gt;}\n     */\n    async changeLabels(labelIds) {\n        return this.client.addOrRemoveLabels(labelIds, [this.id._serialized]);\n    }\n\n    /**\n     * Gets instances of all pinned messages in a chat\n     * @returns {Promise&amp;lt;Array&amp;lt;Message&gt;&gt;}\n     */\n    async getPinnedMessages() {\n        return this.client.getPinnedMessages(this.id._serialized);\n    }\n    \n    /**\n     * Sync chat history conversation\n     * @return {Promise&amp;lt;boolean&gt;} True if operation completed successfully, false otherwise.\n     */\n    async syncHistory() {\n        return this.client.syncHistory(this.id._serialized);\n    }\n\n    /**\n     * Add or edit a customer note\n     * @see https://faq.whatsapp.com/1433099287594476\n     * @param {string} note The note to add\n     * @returns {Promise&amp;lt;void&gt;}\n     */\n    async addOrEditCustomerNote(note) {\n        if (this.isGroup || this.isChannel) return;\n\n        return this.client.addOrEditCustomerNote(this.id._serialized, note);\n    }\n\n    /**\n     * Get a customer note\n     * @see https://faq.whatsapp.com/1433099287594476\n     * @returns {Promise&amp;lt;{\n     *    chatId: string,\n     *    content: string,\n     *    createdAt: number,\n     *    id: string,\n     *    modifiedAt: number,\n     *    type: string\n     * }&gt;}\n     */\n    async getCustomerNote() {\n        if (this.isGroup || this.isChannel) return null;\n        \n        return this.client.getCustomerNote(this.id._serialized);\n    }\n}\n\nmodule.exports &#x3D; Chat;\n</code></pre>\n          </article>\n        </div>\n      </div>\n      <nav id=\"jsdoc-toc-nav\" role=\"navigation\"></nav>\n    </div>\n  </div>\n  <footer id=\"jsdoc-footer\" class=\"jsdoc-footer\">\n    <div id=\"jsdoc-footer-container\">\n      <p>\n        Generated by <a href=\"https://github.com/jsdoc3/jsdoc\">JSDoc</a> 3.6.11 on January 30, 2026.\n      </p>\n    </div>\n  </footer>\n  <script src=\"scripts/jquery.min.js\"></script>\n  <script src=\"scripts/tree.jquery.js\"></script>\n  <script src=\"scripts/prettify.js\"></script>\n  <script src=\"scripts/jsdoc-toc.js\"></script>\n  <script src=\"scripts/linenumber.js\"></script>\n  <script src=\"scripts/scrollanchor.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "docs/structures_ClientInfo.js.html",
    "content": "<!doctype html>\n<html>\n\n<head>\n  <meta name=\"generator\" content=\"JSDoc 3.6.11\">\n  <meta charset=\"utf-8\">\n  <title>whatsapp-web.js 1.34.6 &raquo; Source: structures/ClientInfo.js</title>\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Karla:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Noto+Serif:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Inconsolata:500\" type=\"text/css\">\n  <link href=\"css/baseline.css\" rel=\"stylesheet\">\n</head>\n\n<body onload=\"prettyPrint()\">\n  <nav id=\"jsdoc-navbar\" role=\"navigation\" class=\"jsdoc-navbar\">\n    <div id=\"jsdoc-navbar-container\">\n      <div id=\"jsdoc-navbar-content\">\n        <a href=\"index.html\" class=\"jsdoc-navbar-package-name\">whatsapp-web.<wbr>js 1.<wbr>34.<wbr>6</a>\n      </div>\n    </div>\n  </nav>\n  <div id=\"jsdoc-body-container\">\n    <div id=\"jsdoc-content\">\n      <div id=\"jsdoc-content-container\">\n        <div id=\"jsdoc-banner\" role=\"banner\">\n        </div>\n        <div id=\"jsdoc-main\" role=\"main\">\n          <header class=\"page-header\">\n            <h1>Source: structures/ClientInfo.js</h1>\n          </header>\n          <article>\n            <pre class=\"prettyprint linenums\"><code>&#x27;use strict&#x27;;\n\nconst Base &#x3D; require(&#x27;./Base&#x27;);\n\n/**\n * Current connection information\n * @extends {Base}\n */\nclass ClientInfo extends Base {\n    constructor(client, data) {\n        super(client);\n\n        if (data) this._patch(data);\n    }\n\n    _patch(data) {\n        /**\n         * Name configured to be shown in push notifications\n         * @type {string}\n         */\n        this.pushname &#x3D; data.pushname;\n\n        /**\n         * Current user ID\n         * @type {object}\n         */\n        this.wid &#x3D; data.wid;\n\n        /**\n         * @type {object}\n         * @deprecated Use .wid instead\n         */\n        this.me &#x3D; data.wid;\n\n        /**\n         * Information about the phone this client is connected to. Not available in multi-device.\n         * @type {object}\n         * @property {string} wa_version WhatsApp Version running on the phone\n         * @property {string} os_version OS Version running on the phone (iOS or Android version)\n         * @property {string} device_manufacturer Device manufacturer\n         * @property {string} device_model Device model\n         * @property {string} os_build_number OS build number\n         * @deprecated\n         */\n        this.phone &#x3D; data.phone;\n\n        /**\n         * Platform WhatsApp is running on\n         * @type {string}\n         */\n        this.platform &#x3D; data.platform;\n\n        return super._patch(data);\n    }\n\n    /**\n     * Get current battery percentage and charging status for the attached device\n     * @returns {object} batteryStatus\n     * @returns {number} batteryStatus.battery - The current battery percentage\n     * @returns {boolean} batteryStatus.plugged - Indicates if the phone is plugged in (true) or not (false)\n     * @deprecated\n     */\n    async getBatteryStatus() {\n        return await this.client.pupPage.evaluate(() &#x3D;&gt; {\n            const { battery, plugged } &#x3D; window.Store.Conn;\n            return { battery, plugged };\n        });\n    }\n}\n\nmodule.exports &#x3D; ClientInfo;</code></pre>\n          </article>\n        </div>\n      </div>\n      <nav id=\"jsdoc-toc-nav\" role=\"navigation\"></nav>\n    </div>\n  </div>\n  <footer id=\"jsdoc-footer\" class=\"jsdoc-footer\">\n    <div id=\"jsdoc-footer-container\">\n      <p>\n        Generated by <a href=\"https://github.com/jsdoc3/jsdoc\">JSDoc</a> 3.6.11 on January 30, 2026.\n      </p>\n    </div>\n  </footer>\n  <script src=\"scripts/jquery.min.js\"></script>\n  <script src=\"scripts/tree.jquery.js\"></script>\n  <script src=\"scripts/prettify.js\"></script>\n  <script src=\"scripts/jsdoc-toc.js\"></script>\n  <script src=\"scripts/linenumber.js\"></script>\n  <script src=\"scripts/scrollanchor.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "docs/structures_Contact.js.html",
    "content": "<!doctype html>\n<html>\n\n<head>\n  <meta name=\"generator\" content=\"JSDoc 3.6.11\">\n  <meta charset=\"utf-8\">\n  <title>whatsapp-web.js 1.34.6 &raquo; Source: structures/Contact.js</title>\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Karla:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Noto+Serif:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Inconsolata:500\" type=\"text/css\">\n  <link href=\"css/baseline.css\" rel=\"stylesheet\">\n</head>\n\n<body onload=\"prettyPrint()\">\n  <nav id=\"jsdoc-navbar\" role=\"navigation\" class=\"jsdoc-navbar\">\n    <div id=\"jsdoc-navbar-container\">\n      <div id=\"jsdoc-navbar-content\">\n        <a href=\"index.html\" class=\"jsdoc-navbar-package-name\">whatsapp-web.<wbr>js 1.<wbr>34.<wbr>6</a>\n      </div>\n    </div>\n  </nav>\n  <div id=\"jsdoc-body-container\">\n    <div id=\"jsdoc-content\">\n      <div id=\"jsdoc-content-container\">\n        <div id=\"jsdoc-banner\" role=\"banner\">\n        </div>\n        <div id=\"jsdoc-main\" role=\"main\">\n          <header class=\"page-header\">\n            <h1>Source: structures/Contact.js</h1>\n          </header>\n          <article>\n            <pre class=\"prettyprint linenums\"><code>&#x27;use strict&#x27;;\n\nconst Base &#x3D; require(&#x27;./Base&#x27;);\n\n/**\n * ID that represents a contact\n * @typedef {Object} ContactId\n * @property {string} server\n * @property {string} user\n * @property {string} _serialized\n */\n\n/**\n * Represents a Contact on WhatsApp\n * @extends {Base}\n */\nclass Contact extends Base {\n    constructor(client, data) {\n        super(client);\n\n        if(data) this._patch(data);\n    }\n\n    _patch(data) {\n        /**\n         * ID that represents the contact\n         * @type {ContactId}\n         */\n        this.id &#x3D; data.id;\n\n        /**\n         * Contact&#x27;s phone number\n         * @type {string}\n         */\n        this.number &#x3D; data.userid;\n\n        /**\n         * Indicates if the contact is a business contact\n         * @type {boolean}\n         */\n        this.isBusiness &#x3D; data.isBusiness;\n\n        /**\n         * Indicates if the contact is an enterprise contact\n         * @type {boolean}\n         */\n        this.isEnterprise &#x3D; data.isEnterprise;\n\n        this.labels &#x3D; data.labels;\n\n        /**\n         * The contact&#x27;s name, as saved by the current user\n         * @type {?string}\n         */\n        this.name &#x3D; data.name;\n\n        /**\n         * The name that the contact has configured to be shown publically\n         * @type {string}\n         */\n        this.pushname &#x3D; data.pushname;\n\n        this.sectionHeader &#x3D; data.sectionHeader;\n\n        /**\n         * A shortened version of name\n         * @type {?string}\n         */\n        this.shortName &#x3D; data.shortName;\n\n        this.statusMute &#x3D; data.statusMute;\n        this.type &#x3D; data.type;\n        this.verifiedLevel &#x3D; data.verifiedLevel;\n        this.verifiedName &#x3D; data.verifiedName;\n\n        /**\n         * Indicates if the contact is the current user&#x27;s contact\n         * @type {boolean}\n         */\n        this.isMe &#x3D; data.isMe;\n\n        /**\n         * Indicates if the contact is a user contact\n         * @type {boolean}\n         */\n        this.isUser &#x3D; data.isUser;\n\n        /**\n         * Indicates if the contact is a group contact\n         * @type {boolean}\n         */\n        this.isGroup &#x3D; data.isGroup;\n\n        /**\n         * Indicates if the number is registered on WhatsApp\n         * @type {boolean}\n         */\n        this.isWAContact &#x3D; data.isWAContact;\n\n        /**\n         * Indicates if the number is saved in the current phone&#x27;s contacts\n         * @type {boolean}\n         */\n        this.isMyContact &#x3D; data.isMyContact;\n\n        /**\n         * Indicates if you have blocked this contact\n         * @type {boolean}\n         */\n        this.isBlocked &#x3D; data.isBlocked;\n        \n        return super._patch(data);\n    }\n\n    /**\n     * Returns the contact&#x27;s profile picture URL, if privacy settings allow it\n     * @returns {Promise&amp;lt;string&gt;}\n     */\n    async getProfilePicUrl() {\n        return await this.client.getProfilePicUrl(this.id._serialized);\n    }\n\n    /**\n     * Returns the contact&#x27;s formatted phone number, (12345678901@c.us) &#x3D;&gt; (+1 (234) 5678-901)\n     * @returns {Promise&amp;lt;string&gt;}\n     */\n    async getFormattedNumber() {\n        return await this.client.getFormattedNumber(this.id._serialized);\n    }\n    \n    /**\n     * Returns the contact&#x27;s countrycode, (1541859685@c.us) &#x3D;&gt; (1)\n     * @returns {Promise&amp;lt;string&gt;}\n     */\n    async getCountryCode() {\n        return await this.client.getCountryCode(this.id._serialized);\n    }\n    \n    /**\n     * Returns the Chat that corresponds to this Contact. \n     * Will return null when getting chat for currently logged in user.\n     * @returns {Promise&amp;lt;Chat&gt;}\n     */\n    async getChat() {\n        if(this.isMe) return null;\n\n        return await this.client.getChatById(this.id._serialized);\n    }\n\n    /**\n     * Blocks this contact from WhatsApp\n     * @returns {Promise&amp;lt;boolean&gt;}\n     */\n    async block() {\n        if(this.isGroup) return false;\n\n        await this.client.pupPage.evaluate(async (contactId) &#x3D;&gt; {\n            const contact &#x3D; window.Store.Contact.get(contactId);\n            await window.Store.BlockContact.blockContact({contact});\n        }, this.id._serialized);\n\n        this.isBlocked &#x3D; true;\n        return true;\n    }\n\n    /**\n     * Unblocks this contact from WhatsApp\n     * @returns {Promise&amp;lt;boolean&gt;}\n     */\n    async unblock() {\n        if(this.isGroup) return false;\n\n        await this.client.pupPage.evaluate(async (contactId) &#x3D;&gt; {\n            const contact &#x3D; window.Store.Contact.get(contactId);\n            await window.Store.BlockContact.unblockContact(contact);\n        }, this.id._serialized);\n\n        this.isBlocked &#x3D; false;\n        return true;\n    }\n\n    /**\n     * Gets the Contact&#x27;s current &quot;about&quot; info. Returns null if you don&#x27;t have permission to read their status.\n     * @returns {Promise&amp;lt;?string&gt;}\n     */\n    async getAbout() {\n        const about &#x3D; await this.client.pupPage.evaluate(async (contactId) &#x3D;&gt; {\n            const wid &#x3D; window.Store.WidFactory.createWid(contactId);\n            return window.Store.StatusUtils.getStatus({&#x27;token&#x27;:&#x27;&#x27;, &#x27;wid&#x27;: wid});\n        }, this.id._serialized);\n\n        if (typeof about.status !&#x3D;&#x3D; &#x27;string&#x27;)\n            return null;\n\n        return about.status;\n    }\n\n    /**\n     * Gets the Contact&#x27;s common groups with you. Returns empty array if you don&#x27;t have any common group.\n     * @returns {Promise&amp;lt;WAWebJS.ChatId[]&gt;}\n     */\n    async getCommonGroups() {\n        return await this.client.getCommonGroups(this.id._serialized);\n    }\n\n    /**\n     * Gets the Contact&#x27;s current status broadcast.\n     * @returns {Promise&amp;lt;Broadcast&gt;}\n    */\n    async getBroadcast() {\n        return await this.client.getBroadcastById(this.id._serialized);\n    }\n}\n\nmodule.exports &#x3D; Contact;\n</code></pre>\n          </article>\n        </div>\n      </div>\n      <nav id=\"jsdoc-toc-nav\" role=\"navigation\"></nav>\n    </div>\n  </div>\n  <footer id=\"jsdoc-footer\" class=\"jsdoc-footer\">\n    <div id=\"jsdoc-footer-container\">\n      <p>\n        Generated by <a href=\"https://github.com/jsdoc3/jsdoc\">JSDoc</a> 3.6.11 on January 30, 2026.\n      </p>\n    </div>\n  </footer>\n  <script src=\"scripts/jquery.min.js\"></script>\n  <script src=\"scripts/tree.jquery.js\"></script>\n  <script src=\"scripts/prettify.js\"></script>\n  <script src=\"scripts/jsdoc-toc.js\"></script>\n  <script src=\"scripts/linenumber.js\"></script>\n  <script src=\"scripts/scrollanchor.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "docs/structures_GroupChat.js.html",
    "content": "<!doctype html>\n<html>\n\n<head>\n  <meta name=\"generator\" content=\"JSDoc 3.6.11\">\n  <meta charset=\"utf-8\">\n  <title>whatsapp-web.js 1.34.6 &raquo; Source: structures/GroupChat.js</title>\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Karla:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Noto+Serif:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Inconsolata:500\" type=\"text/css\">\n  <link href=\"css/baseline.css\" rel=\"stylesheet\">\n</head>\n\n<body onload=\"prettyPrint()\">\n  <nav id=\"jsdoc-navbar\" role=\"navigation\" class=\"jsdoc-navbar\">\n    <div id=\"jsdoc-navbar-container\">\n      <div id=\"jsdoc-navbar-content\">\n        <a href=\"index.html\" class=\"jsdoc-navbar-package-name\">whatsapp-web.<wbr>js 1.<wbr>34.<wbr>6</a>\n      </div>\n    </div>\n  </nav>\n  <div id=\"jsdoc-body-container\">\n    <div id=\"jsdoc-content\">\n      <div id=\"jsdoc-content-container\">\n        <div id=\"jsdoc-banner\" role=\"banner\">\n        </div>\n        <div id=\"jsdoc-main\" role=\"main\">\n          <header class=\"page-header\">\n            <h1>Source: structures/GroupChat.js</h1>\n          </header>\n          <article>\n            <pre class=\"prettyprint linenums\"><code>&#x27;use strict&#x27;;\n\nconst Chat &#x3D; require(&#x27;./Chat&#x27;);\n\n/**\n * Group participant information\n * @typedef {Object} GroupParticipant\n * @property {ContactId} id\n * @property {boolean} isAdmin\n * @property {boolean} isSuperAdmin\n */\n\n/**\n * Represents a Group Chat on WhatsApp\n * @extends {Chat}\n */\nclass GroupChat extends Chat {\n    _patch(data) {\n        this.groupMetadata &#x3D; data.groupMetadata;\n\n        return super._patch(data);\n    }\n\n    /**\n     * Gets the group owner\n     * @type {ContactId}\n     */\n    get owner() {\n        return this.groupMetadata.owner;\n    }\n    \n    /**\n     * Gets the date at which the group was created\n     * @type {date}\n     */\n    get createdAt() {\n        return new Date(this.groupMetadata.creation * 1000);\n    }\n\n    /** \n     * Gets the group description\n     * @type {string}\n     */\n    get description() {\n        return this.groupMetadata.desc;\n    }\n\n    /**\n     * Gets the group participants\n     * @type {Array&amp;lt;GroupParticipant&gt;}\n     */\n    get participants() {\n        return this.groupMetadata.participants;\n    }\n\n    /**\n     * An object that handles the result for {@link addParticipants} method\n     * @typedef {Object} AddParticipantsResult\n     * @property {number} code The code of the result\n     * @property {string} message The result message\n     * @property {boolean} isInviteV4Sent Indicates if the inviteV4 was sent to the partitipant\n     */\n\n    /**\n     * An object that handles options for adding participants\n     * @typedef {Object} AddParticipnatsOptions\n     * @property {Array&amp;lt;number&gt;|number} [sleep &#x3D; [250, 500]] The number of milliseconds to wait before adding the next participant. If it is an array, a random sleep time between the sleep[0] and sleep[1] values will be added (the difference must be &gt;&#x3D;100 ms, otherwise, a random sleep time between sleep[1] and sleep[1] + 100 will be added). If sleep is a number, a sleep time equal to its value will be added. By default, sleep is an array with a value of [250, 500]\n     * @property {boolean} [autoSendInviteV4 &#x3D; true] If true, the inviteV4 will be sent to those participants who have restricted others from being automatically added to groups, otherwise the inviteV4 won&#x27;t be sent (true by default)\n     * @property {string} [comment &#x3D; &#x27;&#x27;] The comment to be added to an inviteV4 (empty string by default)\n     */\n\n    /**\n     * Adds a list of participants by ID to the group\n     * @param {string|Array&amp;lt;string&gt;} participantIds \n     * @param {AddParticipnatsOptions} options An object thay handles options for adding participants\n     * @returns {Promise&amp;lt;Object.&amp;lt;string, AddParticipantsResult&gt;|string&gt;} Returns an object with the resulting data or an error message as a string\n     */\n    async addParticipants(participantIds, options &#x3D; {}) {\n        return await this.client.pupPage.evaluate(async (groupId, participantIds, options) &#x3D;&gt; {\n            const { sleep &#x3D; [250, 500], autoSendInviteV4 &#x3D; true, comment &#x3D; &#x27;&#x27; } &#x3D; options;\n            const participantData &#x3D; {};\n\n            !Array.isArray(participantIds) &amp;amp;&amp;amp; (participantIds &#x3D; [participantIds]);\n            const groupWid &#x3D; window.Store.WidFactory.createWid(groupId);\n            const group &#x3D; window.Store.Chat.get(groupWid) || (await window.Store.Chat.find(groupWid));\n            const participantWids &#x3D; participantIds.map((p) &#x3D;&gt; window.Store.WidFactory.createWid(p));\n\n            const errorCodes &#x3D; {\n                default: &#x27;An unknown error occupied while adding a participant&#x27;,\n                isGroupEmpty: &#x27;AddParticipantsError: The participant can\\&#x27;t be added to an empty group&#x27;,\n                iAmNotAdmin: &#x27;AddParticipantsError: You have no admin rights to add a participant to a group&#x27;,\n                200: &#x27;The participant was added successfully&#x27;,\n                403: &#x27;The participant can be added by sending private invitation only&#x27;,\n                404: &#x27;The phone number is not registered on WhatsApp&#x27;,\n                408: &#x27;You cannot add this participant because they recently left the group&#x27;,\n                409: &#x27;The participant is already a group member&#x27;,\n                417: &#x27;The participant can\\&#x27;t be added to the community. You can invite them privately to join this group through its invite link&#x27;,\n                419: &#x27;The participant can\\&#x27;t be added because the group is full&#x27;\n            };\n\n            await window.Store.GroupQueryAndUpdate({ id: groupId });\n\n            let groupParticipants &#x3D; group.groupMetadata?.participants.serialize();\n\n            if (!groupParticipants) {\n                return errorCodes.isGroupEmpty;\n            }\n\n            if (!group.iAmAdmin()) {\n                return errorCodes.iAmNotAdmin;\n            }\n\n            groupParticipants.map(({ id }) &#x3D;&gt; {\n                return id.server &#x3D;&#x3D;&#x3D; &#x27;lid&#x27; ? window.Store.LidUtils.getPhoneNumber(id) : id;\n            });\n\n            const _getSleepTime &#x3D; (sleep) &#x3D;&gt; {\n                if (!Array.isArray(sleep) || sleep.length &#x3D;&#x3D;&#x3D; 2 &amp;amp;&amp;amp; sleep[0] &#x3D;&#x3D;&#x3D; sleep[1]) {\n                    return sleep;\n                }\n                if (sleep.length &#x3D;&#x3D;&#x3D; 1) {\n                    return sleep[0];\n                }\n                (sleep[1] - sleep[0]) &amp;lt; 100 &amp;amp;&amp;amp; (sleep[0] &#x3D; sleep[1]) &amp;amp;&amp;amp; (sleep[1] +&#x3D; 100);\n                return Math.floor(Math.random() * (sleep[1] - sleep[0] + 1)) + sleep[0];\n            };\n\n            for (let pWid of participantWids) {\n                const pId &#x3D; pWid._serialized;\n                pWid &#x3D; pWid.server &#x3D;&#x3D;&#x3D; &#x27;lid&#x27; ? window.Store.LidUtils.getPhoneNumber(pWid) : pWid;\n                \n                participantData[pId] &#x3D; {\n                    code: undefined,\n                    message: undefined,\n                    isInviteV4Sent: false\n                };\n\n                if (groupParticipants.some(p &#x3D;&gt; p._serialized &#x3D;&#x3D;&#x3D; pId)) {\n                    participantData[pId].code &#x3D; 409;\n                    participantData[pId].message &#x3D; errorCodes[409];\n                    continue;\n                }\n\n                if (!(await window.Store.QueryExist(pWid))?.wid) {\n                    participantData[pId].code &#x3D; 404;\n                    participantData[pId].message &#x3D; errorCodes[404];\n                    continue;\n                }\n\n                const rpcResult &#x3D;\n                    await window.WWebJS.getAddParticipantsRpcResult(groupWid, pWid);\n                const { code: rpcResultCode } &#x3D; rpcResult;\n\n                participantData[pId].code &#x3D; rpcResultCode;\n                participantData[pId].message &#x3D;\n                    errorCodes[rpcResultCode] || errorCodes.default;\n\n                if (autoSendInviteV4 &amp;amp;&amp;amp; rpcResultCode &#x3D;&#x3D;&#x3D; 403) {\n                    let userChat, isInviteV4Sent &#x3D; false;\n                    window.Store.Contact.gadd(pWid, { silent: true });\n\n                    if (rpcResult.name &#x3D;&#x3D;&#x3D; &#x27;ParticipantRequestCodeCanBeSent&#x27; &amp;amp;&amp;amp;\n                        (userChat &#x3D; window.Store.Chat.get(pWid) || (await window.Store.Chat.find(pWid)))) {\n                        const groupName &#x3D; group.formattedTitle || group.name;\n                        const res &#x3D; await window.Store.GroupInviteV4.sendGroupInviteMessage(\n                            userChat,\n                            group.id._serialized,\n                            groupName,\n                            rpcResult.inviteV4Code,\n                            rpcResult.inviteV4CodeExp,\n                            comment,\n                            await window.WWebJS.getProfilePicThumbToBase64(groupWid)\n                        );\n                        isInviteV4Sent &#x3D; res.messageSendResult &#x3D;&#x3D;&#x3D; &#x27;OK&#x27;;\n                    }\n\n                    participantData[pId].isInviteV4Sent &#x3D; isInviteV4Sent;\n                }\n\n                sleep &amp;amp;&amp;amp;\n                    participantWids.length &gt; 1 &amp;amp;&amp;amp;\n                    participantWids.indexOf(pWid) !&#x3D;&#x3D; participantWids.length - 1 &amp;amp;&amp;amp;\n                    (await new Promise((resolve) &#x3D;&gt; setTimeout(resolve, _getSleepTime(sleep))));\n            }\n\n            return participantData;\n        }, this.id._serialized, participantIds, options);\n    }\n\n    /**\n     * Removes a list of participants by ID to the group\n     * @param {Array&amp;lt;string&gt;} participantIds \n     * @returns {Promise&amp;lt;{ status: number }&gt;}\n     */\n    async removeParticipants(participantIds) {\n        return await this.client.pupPage.evaluate(async (chatId, participantIds) &#x3D;&gt; {\n            const chat &#x3D; await window.WWebJS.getChat(chatId, { getAsModel: false });\n            const participants &#x3D; (await Promise.all(participantIds.map(async p &#x3D;&gt; {\n                const { lid, phone } &#x3D; await window.WWebJS.enforceLidAndPnRetrieval(p);\n\n                return chat.groupMetadata.participants.get(lid?._serialized) ||\n                    chat.groupMetadata.participants.get(phone?._serialized);\n            }))).filter(Boolean);\n            await window.Store.GroupParticipants.removeParticipants(chat, participants);\n            return { status: 200 };\n        }, this.id._serialized, participantIds);\n    }\n\n    /**\n     * Promotes participants by IDs to admins\n     * @param {Array&amp;lt;string&gt;} participantIds \n     * @returns {Promise&amp;lt;{ status: number }&gt;} Object with status code indicating if the operation was successful\n     */\n    async promoteParticipants(participantIds) {\n        return await this.client.pupPage.evaluate(async (chatId, participantIds) &#x3D;&gt; {\n            const chat &#x3D; await window.WWebJS.getChat(chatId, { getAsModel: false });\n            const participants &#x3D; (await Promise.all(participantIds.map(async p &#x3D;&gt; {\n                const { lid, phone } &#x3D; await window.WWebJS.enforceLidAndPnRetrieval(p);\n\n                return chat.groupMetadata.participants.get(lid?._serialized) ||\n                    chat.groupMetadata.participants.get(phone?._serialized);\n            }))).filter(Boolean);\n            await window.Store.GroupParticipants.promoteParticipants(chat, participants);\n            return { status: 200 };\n        }, this.id._serialized, participantIds);\n    }\n\n    /**\n     * Demotes participants by IDs to regular users\n     * @param {Array&amp;lt;string&gt;} participantIds \n     * @returns {Promise&amp;lt;{ status: number }&gt;} Object with status code indicating if the operation was successful\n     */\n    async demoteParticipants(participantIds) {\n        return await this.client.pupPage.evaluate(async (chatId, participantIds) &#x3D;&gt; {\n            const chat &#x3D; await window.WWebJS.getChat(chatId, { getAsModel: false });\n            const participants &#x3D; (await Promise.all(participantIds.map(async p &#x3D;&gt; {\n                const { lid, phone } &#x3D; await window.WWebJS.enforceLidAndPnRetrieval(p);\n\n                return chat.groupMetadata.participants.get(lid?._serialized) ||\n                    chat.groupMetadata.participants.get(phone?._serialized);\n            }))).filter(Boolean);\n            await window.Store.GroupParticipants.demoteParticipants(chat, participants);\n            return { status: 200 };\n        }, this.id._serialized, participantIds);\n    }\n\n    /**\n     * Updates the group subject\n     * @param {string} subject \n     * @returns {Promise&amp;lt;boolean&gt;} Returns true if the subject was properly updated. This can return false if the user does not have the necessary permissions.\n     */\n    async setSubject(subject) {\n        const success &#x3D; await this.client.pupPage.evaluate(async (chatId, subject) &#x3D;&gt; {\n            const chatWid &#x3D; window.Store.WidFactory.createWid(chatId);\n            try {\n                await window.Store.GroupUtils.setGroupSubject(chatWid, subject);\n                return true;\n            } catch (err) {\n                if(err.name &#x3D;&#x3D;&#x3D; &#x27;ServerStatusCodeError&#x27;) return false;\n                throw err;\n            }\n        }, this.id._serialized, subject);\n\n        if(!success) return false;\n        this.name &#x3D; subject;\n        return true;\n    }\n\n    /**\n     * Updates the group description\n     * @param {string} description \n     * @returns {Promise&amp;lt;boolean&gt;} Returns true if the description was properly updated. This can return false if the user does not have the necessary permissions.\n     */\n    async setDescription(description) {\n        const success &#x3D; await this.client.pupPage.evaluate(async (chatId, description) &#x3D;&gt; {\n            const chatWid &#x3D; window.Store.WidFactory.createWid(chatId);\n            let descId &#x3D; window.Store.GroupMetadata.get(chatWid).descId;\n            let newId &#x3D; await window.Store.MsgKey.newId();\n            try {\n                await window.Store.GroupUtils.setGroupDescription(chatWid, description, newId, descId);\n                return true;\n            } catch (err) {\n                if(err.name &#x3D;&#x3D;&#x3D; &#x27;ServerStatusCodeError&#x27;) return false;\n                throw err;\n            }\n        }, this.id._serialized, description);\n\n        if(!success) return false;\n        this.groupMetadata.desc &#x3D; description;\n        return true;\n    }\n    \n    /**\n     * Updates the group setting to allow only admins to add members to the group.\n     * @param {boolean} [adminsOnly&#x3D;true] Enable or disable this option \n     * @returns {Promise&amp;lt;boolean&gt;} Returns true if the setting was properly updated. This can return false if the user does not have the necessary permissions.\n     */\n    async setAddMembersAdminsOnly(adminsOnly&#x3D;true) {\n        const success &#x3D; await this.client.pupPage.evaluate(async (groupId, adminsOnly) &#x3D;&gt; {\n            const chat &#x3D; await window.WWebJS.getChat(groupId, { getAsModel: false });\n            try {\n                await window.Store.GroupUtils.setGroupProperty(chat, &#x27;member_add_mode&#x27;, adminsOnly ? 0 : 1);\n                return true;\n            } catch (err) {\n                if(err.name &#x3D;&#x3D;&#x3D; &#x27;ServerStatusCodeError&#x27;) return false;\n                throw err;\n            }\n        }, this.id._serialized, adminsOnly);\n\n        success &amp;amp;&amp;amp; (this.groupMetadata.memberAddMode &#x3D; adminsOnly ? &#x27;admin_add&#x27; : &#x27;all_member_add&#x27;);\n        return success;\n    }\n    \n    /**\n     * Updates the group settings to only allow admins to send messages.\n     * @param {boolean} [adminsOnly&#x3D;true] Enable or disable this option \n     * @returns {Promise&amp;lt;boolean&gt;} Returns true if the setting was properly updated. This can return false if the user does not have the necessary permissions.\n     */\n    async setMessagesAdminsOnly(adminsOnly&#x3D;true) {\n        const success &#x3D; await this.client.pupPage.evaluate(async (chatId, adminsOnly) &#x3D;&gt; {\n            const chat &#x3D; await window.WWebJS.getChat(chatId, { getAsModel: false });\n            try {\n                await window.Store.GroupUtils.setGroupProperty(chat, &#x27;announcement&#x27;, adminsOnly ? 1 : 0);\n                return true;\n            } catch (err) {\n                if(err.name &#x3D;&#x3D;&#x3D; &#x27;ServerStatusCodeError&#x27;) return false;\n                throw err;\n            }\n        }, this.id._serialized, adminsOnly);\n\n        if(!success) return false;\n\n        this.groupMetadata.announce &#x3D; adminsOnly;\n        return true;\n    }\n\n    /**\n     * Updates the group settings to only allow admins to edit group info (title, description, photo).\n     * @param {boolean} [adminsOnly&#x3D;true] Enable or disable this option \n     * @returns {Promise&amp;lt;boolean&gt;} Returns true if the setting was properly updated. This can return false if the user does not have the necessary permissions.\n     */\n    async setInfoAdminsOnly(adminsOnly&#x3D;true) {\n        const success &#x3D; await this.client.pupPage.evaluate(async (chatId, adminsOnly) &#x3D;&gt; {\n            const chat &#x3D; await window.WWebJS.getChat(chatId, { getAsModel: false });\n            try {\n                await window.Store.GroupUtils.setGroupProperty(chat, &#x27;restrict&#x27;, adminsOnly ? 1 : 0);\n                return true;\n            } catch (err) {\n                if(err.name &#x3D;&#x3D;&#x3D; &#x27;ServerStatusCodeError&#x27;) return false;\n                throw err;\n            }\n        }, this.id._serialized, adminsOnly);\n\n        if(!success) return false;\n        \n        this.groupMetadata.restrict &#x3D; adminsOnly;\n        return true;\n    }\n    \n    /**\n     * Deletes the group&#x27;s picture.\n     * @returns {Promise&amp;lt;boolean&gt;} Returns true if the picture was properly deleted. This can return false if the user does not have the necessary permissions.\n     */\n    async deletePicture() {\n        const success &#x3D; await this.client.pupPage.evaluate((chatid) &#x3D;&gt; {\n            return window.WWebJS.deletePicture(chatid);\n        }, this.id._serialized);\n\n        return success;\n    }\n\n    /**\n     * Sets the group&#x27;s picture.\n     * @param {MessageMedia} media\n     * @returns {Promise&amp;lt;boolean&gt;} Returns true if the picture was properly updated. This can return false if the user does not have the necessary permissions.\n     */\n    async setPicture(media) {\n        const success &#x3D; await this.client.pupPage.evaluate((chatid, media) &#x3D;&gt; {\n            return window.WWebJS.setPicture(chatid, media);\n        }, this.id._serialized, media);\n\n        return success;\n    }\n\n    /**\n     * Gets the invite code for a specific group\n     * @returns {Promise&amp;lt;string&gt;} Group&#x27;s invite code\n     */\n    async getInviteCode() {\n        const codeRes &#x3D; await this.client.pupPage.evaluate(async chatId &#x3D;&gt; {\n            const chatWid &#x3D; window.Store.WidFactory.createWid(chatId);\n            try {\n                return window.compareWwebVersions(window.Debug.VERSION, &#x27;&gt;&#x3D;&#x27;, &#x27;2.3000.1020730154&#x27;)\n                    ? await window.Store.GroupInvite.fetchMexGroupInviteCode(chatId)\n                    : await window.Store.GroupInvite.queryGroupInviteCode(chatWid, true);\n            }\n            catch (err) {\n                if(err.name &#x3D;&#x3D;&#x3D; &#x27;ServerStatusCodeError&#x27;) return undefined;\n                throw err;\n            }\n        }, this.id._serialized);\n\n        return codeRes?.code\n            ? codeRes?.code\n            : codeRes;\n    }\n    \n    /**\n     * Invalidates the current group invite code and generates a new one\n     * @returns {Promise&amp;lt;string&gt;} New invite code\n     */\n    async revokeInvite() {\n        const codeRes &#x3D; await this.client.pupPage.evaluate(chatId &#x3D;&gt; {\n            const chatWid &#x3D; window.Store.WidFactory.createWid(chatId);\n            return window.Store.GroupInvite.resetGroupInviteCode(chatWid);\n        }, this.id._serialized);\n\n        return codeRes.code;\n    }\n    \n    /**\n     * An object that handles the information about the group membership request\n     * @typedef {Object} GroupMembershipRequest\n     * @property {Object} id The wid of a user who requests to enter the group\n     * @property {Object} addedBy The wid of a user who created that request\n     * @property {Object|null} parentGroupId The wid of a community parent group to which the current group is linked\n     * @property {string} requestMethod The method used to create the request: NonAdminAdd/InviteLink/LinkedGroupJoin\n     * @property {number} t The timestamp the request was created at\n     */\n    \n    /**\n     * Gets an array of membership requests\n     * @returns {Promise&amp;lt;Array&amp;lt;GroupMembershipRequest&gt;&gt;} An array of membership requests\n     */\n    async getGroupMembershipRequests() {\n        return await this.client.getGroupMembershipRequests(this.id._serialized);\n    }\n\n    /**\n     * An object that handles the result for membership request action\n     * @typedef {Object} MembershipRequestActionResult\n     * @property {string} requesterId User ID whos membership request was approved/rejected\n     * @property {number} error An error code that occurred during the operation for the participant\n     * @property {string} message A message with a result of membership request action\n     */\n\n    /**\n     * An object that handles options for {@link approveGroupMembershipRequests} and {@link rejectGroupMembershipRequests} methods\n     * @typedef {Object} MembershipRequestActionOptions\n     * @property {Array&amp;lt;string&gt;|string|null} requesterIds User ID/s who requested to join the group, if no value is provided, the method will search for all membership requests for that group\n     * @property {Array&amp;lt;number&gt;|number|null} sleep The number of milliseconds to wait before performing an operation for the next requester. If it is an array, a random sleep time between the sleep[0] and sleep[1] values will be added (the difference must be &gt;&#x3D;100 ms, otherwise, a random sleep time between sleep[1] and sleep[1] + 100 will be added). If sleep is a number, a sleep time equal to its value will be added. By default, sleep is an array with a value of [250, 500]\n     */\n\n    /**\n     * Approves membership requests if any\n     * @param {MembershipRequestActionOptions} options Options for performing a membership request action\n     * @returns {Promise&amp;lt;Array&amp;lt;MembershipRequestActionResult&gt;&gt;} Returns an array of requester IDs whose membership requests were approved and an error for each requester, if any occurred during the operation. If there are no requests, an empty array will be returned\n     */\n    async approveGroupMembershipRequests(options &#x3D; {}) {\n        return await this.client.approveGroupMembershipRequests(this.id._serialized, options);\n    }\n\n    /**\n     * Rejects membership requests if any\n     * @param {MembershipRequestActionOptions} options Options for performing a membership request action\n     * @returns {Promise&amp;lt;Array&amp;lt;MembershipRequestActionResult&gt;&gt;} Returns an array of requester IDs whose membership requests were rejected and an error for each requester, if any occurred during the operation. If there are no requests, an empty array will be returned\n     */\n    async rejectGroupMembershipRequests(options &#x3D; {}) {\n        return await this.client.rejectGroupMembershipRequests(this.id._serialized, options);\n    }\n\n    /**\n     * Makes the bot leave the group\n     * @returns {Promise}\n     */\n    async leave() {\n        await this.client.pupPage.evaluate(async chatId &#x3D;&gt; {\n            const chat &#x3D; await window.WWebJS.getChat(chatId, { getAsModel: false });\n            return window.Store.GroupUtils.sendExitGroup(chat);\n        }, this.id._serialized);\n    }\n\n}\n\nmodule.exports &#x3D; GroupChat;\n</code></pre>\n          </article>\n        </div>\n      </div>\n      <nav id=\"jsdoc-toc-nav\" role=\"navigation\"></nav>\n    </div>\n  </div>\n  <footer id=\"jsdoc-footer\" class=\"jsdoc-footer\">\n    <div id=\"jsdoc-footer-container\">\n      <p>\n        Generated by <a href=\"https://github.com/jsdoc3/jsdoc\">JSDoc</a> 3.6.11 on January 30, 2026.\n      </p>\n    </div>\n  </footer>\n  <script src=\"scripts/jquery.min.js\"></script>\n  <script src=\"scripts/tree.jquery.js\"></script>\n  <script src=\"scripts/prettify.js\"></script>\n  <script src=\"scripts/jsdoc-toc.js\"></script>\n  <script src=\"scripts/linenumber.js\"></script>\n  <script src=\"scripts/scrollanchor.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "docs/structures_GroupNotification.js.html",
    "content": "<!doctype html>\n<html>\n\n<head>\n  <meta name=\"generator\" content=\"JSDoc 3.6.11\">\n  <meta charset=\"utf-8\">\n  <title>whatsapp-web.js 1.34.6 &raquo; Source: structures/GroupNotification.js</title>\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Karla:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Noto+Serif:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Inconsolata:500\" type=\"text/css\">\n  <link href=\"css/baseline.css\" rel=\"stylesheet\">\n</head>\n\n<body onload=\"prettyPrint()\">\n  <nav id=\"jsdoc-navbar\" role=\"navigation\" class=\"jsdoc-navbar\">\n    <div id=\"jsdoc-navbar-container\">\n      <div id=\"jsdoc-navbar-content\">\n        <a href=\"index.html\" class=\"jsdoc-navbar-package-name\">whatsapp-web.<wbr>js 1.<wbr>34.<wbr>6</a>\n      </div>\n    </div>\n  </nav>\n  <div id=\"jsdoc-body-container\">\n    <div id=\"jsdoc-content\">\n      <div id=\"jsdoc-content-container\">\n        <div id=\"jsdoc-banner\" role=\"banner\">\n        </div>\n        <div id=\"jsdoc-main\" role=\"main\">\n          <header class=\"page-header\">\n            <h1>Source: structures/GroupNotification.js</h1>\n          </header>\n          <article>\n            <pre class=\"prettyprint linenums\"><code>&#x27;use strict&#x27;;\n\nconst Base &#x3D; require(&#x27;./Base&#x27;);\n\n/**\n * Represents a GroupNotification on WhatsApp\n * @extends {Base}\n */\nclass GroupNotification extends Base {\n    constructor(client, data) {\n        super(client);\n\n        if(data) this._patch(data);\n    }\n\n    _patch(data) {\n        /**\n         * ID that represents the groupNotification\n         * @type {object}\n         */\n        this.id &#x3D; data.id;\n\n        /**\n         * Extra content\n         * @type {string}\n         */\n        this.body &#x3D; data.body || &#x27;&#x27;;\n\n        /** \n         * GroupNotification type\n         * @type {GroupNotificationTypes}\n         */\n        this.type &#x3D; data.subtype;\n        \n        /**\n         * Unix timestamp for when the groupNotification was created\n         * @type {number}\n         */\n        this.timestamp &#x3D; data.t;\n\n        /**\n         * ID for the Chat that this groupNotification was sent for.\n         * \n         * @type {string}\n         */\n        this.chatId &#x3D; typeof (data.id.remote) &#x3D;&#x3D;&#x3D; &#x27;object&#x27; ? data.id.remote._serialized : data.id.remote;\n\n        /**\n         * ContactId for the user that produced the GroupNotification.\n         * @type {string}\n         */\n        this.author &#x3D; typeof (data.author) &#x3D;&#x3D;&#x3D; &#x27;object&#x27; ? data.author._serialized : data.author;\n        \n        /**\n         * Contact IDs for the users that were affected by this GroupNotification.\n         * @type {Array&amp;lt;string&gt;}\n         */\n        this.recipientIds &#x3D; [];\n\n        if (data.recipients) {\n            this.recipientIds &#x3D; data.recipients;\n        }\n\n        return super._patch(data);\n    }\n\n    /**\n     * Returns the Chat this groupNotification was sent in\n     * @returns {Promise&amp;lt;Chat&gt;}\n     */\n    getChat() {\n        return this.client.getChatById(this.chatId);\n    }\n\n    /**\n     * Returns the Contact this GroupNotification was produced by\n     * @returns {Promise&amp;lt;Contact&gt;}\n     */\n    getContact() {\n        return this.client.getContactById(this.author);\n    }\n\n    /**\n     * Returns the Contacts affected by this GroupNotification.\n     * @returns {Promise&amp;lt;Array&amp;lt;Contact&gt;&gt;}\n     */\n    async getRecipients() {\n        return await Promise.all(this.recipientIds.map(async m &#x3D;&gt; await this.client.getContactById(m)));\n    }\n\n    /**\n     * Sends a message to the same chat this GroupNotification was produced in.\n     * \n     * @param {string|MessageMedia|Location} content \n     * @param {object} options\n     * @returns {Promise&amp;lt;Message&gt;}\n     */\n    async reply(content, options&#x3D;{}) {\n        return this.client.sendMessage(this.chatId, content, options);\n    }\n    \n}\n\nmodule.exports &#x3D; GroupNotification;\n</code></pre>\n          </article>\n        </div>\n      </div>\n      <nav id=\"jsdoc-toc-nav\" role=\"navigation\"></nav>\n    </div>\n  </div>\n  <footer id=\"jsdoc-footer\" class=\"jsdoc-footer\">\n    <div id=\"jsdoc-footer-container\">\n      <p>\n        Generated by <a href=\"https://github.com/jsdoc3/jsdoc\">JSDoc</a> 3.6.11 on January 30, 2026.\n      </p>\n    </div>\n  </footer>\n  <script src=\"scripts/jquery.min.js\"></script>\n  <script src=\"scripts/tree.jquery.js\"></script>\n  <script src=\"scripts/prettify.js\"></script>\n  <script src=\"scripts/jsdoc-toc.js\"></script>\n  <script src=\"scripts/linenumber.js\"></script>\n  <script src=\"scripts/scrollanchor.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "docs/structures_Label.js.html",
    "content": "<!doctype html>\n<html>\n\n<head>\n  <meta name=\"generator\" content=\"JSDoc 3.6.11\">\n  <meta charset=\"utf-8\">\n  <title>whatsapp-web.js 1.34.6 &raquo; Source: structures/Label.js</title>\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Karla:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Noto+Serif:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Inconsolata:500\" type=\"text/css\">\n  <link href=\"css/baseline.css\" rel=\"stylesheet\">\n</head>\n\n<body onload=\"prettyPrint()\">\n  <nav id=\"jsdoc-navbar\" role=\"navigation\" class=\"jsdoc-navbar\">\n    <div id=\"jsdoc-navbar-container\">\n      <div id=\"jsdoc-navbar-content\">\n        <a href=\"index.html\" class=\"jsdoc-navbar-package-name\">whatsapp-web.<wbr>js 1.<wbr>34.<wbr>6</a>\n      </div>\n    </div>\n  </nav>\n  <div id=\"jsdoc-body-container\">\n    <div id=\"jsdoc-content\">\n      <div id=\"jsdoc-content-container\">\n        <div id=\"jsdoc-banner\" role=\"banner\">\n        </div>\n        <div id=\"jsdoc-main\" role=\"main\">\n          <header class=\"page-header\">\n            <h1>Source: structures/Label.js</h1>\n          </header>\n          <article>\n            <pre class=\"prettyprint linenums\"><code>&#x27;use strict&#x27;;\n\nconst Base &#x3D; require(&#x27;./Base&#x27;);\n// eslint-disable-next-line no-unused-vars\nconst Chat &#x3D; require(&#x27;./Chat&#x27;);\n\n/**\n * WhatsApp Business Label information\n */\nclass Label extends Base {\n    /**\n     * @param {Base} client\n     * @param {object} labelData\n     */\n    constructor(client, labelData){\n        super(client);\n\n        if(labelData) this._patch(labelData);\n    }\n\n    _patch(labelData){\n        /**\n         * Label ID\n         * @type {string}\n         */\n        this.id &#x3D; labelData.id;\n\n        /**\n         * Label name\n         * @type {string}\n         */\n        this.name &#x3D; labelData.name;\n\n        /**\n         * Label hex color\n         * @type {string}\n         */\n        this.hexColor &#x3D; labelData.hexColor;\n    }\n    /**\n     * Get all chats that have been assigned this Label\n     * @returns {Promise&amp;lt;Array&amp;lt;Chat&gt;&gt;}\n     */\n    async getChats(){\n        return this.client.getChatsByLabelId(this.id);\n    }\n\n}\n\nmodule.exports &#x3D; Label;</code></pre>\n          </article>\n        </div>\n      </div>\n      <nav id=\"jsdoc-toc-nav\" role=\"navigation\"></nav>\n    </div>\n  </div>\n  <footer id=\"jsdoc-footer\" class=\"jsdoc-footer\">\n    <div id=\"jsdoc-footer-container\">\n      <p>\n        Generated by <a href=\"https://github.com/jsdoc3/jsdoc\">JSDoc</a> 3.6.11 on January 30, 2026.\n      </p>\n    </div>\n  </footer>\n  <script src=\"scripts/jquery.min.js\"></script>\n  <script src=\"scripts/tree.jquery.js\"></script>\n  <script src=\"scripts/prettify.js\"></script>\n  <script src=\"scripts/jsdoc-toc.js\"></script>\n  <script src=\"scripts/linenumber.js\"></script>\n  <script src=\"scripts/scrollanchor.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "docs/structures_List.js.html",
    "content": "<!doctype html>\n<html>\n\n<head>\n  <meta name=\"generator\" content=\"JSDoc 3.6.11\">\n  <meta charset=\"utf-8\">\n  <title>whatsapp-web.js 1.34.6 &raquo; Source: structures/List.js</title>\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Karla:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Noto+Serif:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Inconsolata:500\" type=\"text/css\">\n  <link href=\"css/baseline.css\" rel=\"stylesheet\">\n</head>\n\n<body onload=\"prettyPrint()\">\n  <nav id=\"jsdoc-navbar\" role=\"navigation\" class=\"jsdoc-navbar\">\n    <div id=\"jsdoc-navbar-container\">\n      <div id=\"jsdoc-navbar-content\">\n        <a href=\"index.html\" class=\"jsdoc-navbar-package-name\">whatsapp-web.<wbr>js 1.<wbr>34.<wbr>6</a>\n      </div>\n    </div>\n  </nav>\n  <div id=\"jsdoc-body-container\">\n    <div id=\"jsdoc-content\">\n      <div id=\"jsdoc-content-container\">\n        <div id=\"jsdoc-banner\" role=\"banner\">\n        </div>\n        <div id=\"jsdoc-main\" role=\"main\">\n          <header class=\"page-header\">\n            <h1>Source: structures/List.js</h1>\n          </header>\n          <article>\n            <pre class=\"prettyprint linenums\"><code>&#x27;use strict&#x27;;\n\nconst Util &#x3D; require(&#x27;../util/Util&#x27;);\n\n/**\n * Message type List\n */\nclass List {\n    /**\n     * @param {string} body\n     * @param {string} buttonText\n     * @param {Array&amp;lt;any&gt;} sections\n     * @param {string?} title\n     * @param {string?} footer\n     */\n    constructor(body, buttonText, sections, title, footer) {\n        /**\n         * Message body\n         * @type {string}\n         */\n        this.description &#x3D; body;\n\n        /**\n         * List button text\n         * @type {string}\n         */\n        this.buttonText &#x3D; buttonText;\n        \n        /**\n         * title of message\n         * @type {string}\n         */\n        this.title &#x3D; title;\n        \n\n        /**\n         * footer of message\n         * @type {string}\n         */\n        this.footer &#x3D; footer;\n\n        /**\n         * sections of message\n         * @type {Array&amp;lt;any&gt;}\n         */\n        this.sections &#x3D; this._format(sections);\n        \n    }\n    \n    /**\n     * Creates section array from simple array\n     * @param {Array&amp;lt;any&gt;} sections\n     * @returns {Array&amp;lt;any&gt;}\n     * @example\n     * Input: [{title:&#x27;sectionTitle&#x27;,rows:[{id:&#x27;customId&#x27;, title:&#x27;ListItem2&#x27;, description: &#x27;desc&#x27;},{title:&#x27;ListItem2&#x27;}]}}]\n     * Returns: [{&#x27;title&#x27;:&#x27;sectionTitle&#x27;,&#x27;rows&#x27;:[{&#x27;rowId&#x27;:&#x27;customId&#x27;,&#x27;title&#x27;:&#x27;ListItem1&#x27;,&#x27;description&#x27;:&#x27;desc&#x27;},{&#x27;rowId&#x27;:&#x27;oGSRoD&#x27;,&#x27;title&#x27;:&#x27;ListItem2&#x27;,&#x27;description&#x27;:&#x27;&#x27;}]}]\n     */\n    _format(sections){\n        if(!sections.length){throw &#x27;[LT02] List without sections&#x27;;}\n        if(sections.length &gt; 1 &amp;amp;&amp;amp; sections.filter(s &#x3D;&gt; typeof s.title &#x3D;&#x3D; &#x27;undefined&#x27;).length &gt; 1){throw &#x27;[LT05] You can\\&#x27;t have more than one empty title.&#x27;;}\n        return sections.map( (section) &#x3D;&gt;{\n            if(!section.rows.length){throw &#x27;[LT03] Section without rows&#x27;;}\n            return {\n                title: section.title ? section.title : undefined,\n                rows: section.rows.map( (row) &#x3D;&gt; {\n                    if(!row.title){throw &#x27;[LT04] Row without title&#x27;;}\n                    return {\n                        rowId: row.id ? row.id : Util.generateHash(6),\n                        title: row.title,\n                        description: row.description ? row.description : &#x27;&#x27;\n                    };\n                })\n            };\n        });\n    }\n    \n}\n\nmodule.exports &#x3D; List;\n</code></pre>\n          </article>\n        </div>\n      </div>\n      <nav id=\"jsdoc-toc-nav\" role=\"navigation\"></nav>\n    </div>\n  </div>\n  <footer id=\"jsdoc-footer\" class=\"jsdoc-footer\">\n    <div id=\"jsdoc-footer-container\">\n      <p>\n        Generated by <a href=\"https://github.com/jsdoc3/jsdoc\">JSDoc</a> 3.6.11 on January 30, 2026.\n      </p>\n    </div>\n  </footer>\n  <script src=\"scripts/jquery.min.js\"></script>\n  <script src=\"scripts/tree.jquery.js\"></script>\n  <script src=\"scripts/prettify.js\"></script>\n  <script src=\"scripts/jsdoc-toc.js\"></script>\n  <script src=\"scripts/linenumber.js\"></script>\n  <script src=\"scripts/scrollanchor.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "docs/structures_Location.js.html",
    "content": "<!doctype html>\n<html>\n\n<head>\n  <meta name=\"generator\" content=\"JSDoc 3.6.11\">\n  <meta charset=\"utf-8\">\n  <title>whatsapp-web.js 1.34.6 &raquo; Source: structures/Location.js</title>\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Karla:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Noto+Serif:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Inconsolata:500\" type=\"text/css\">\n  <link href=\"css/baseline.css\" rel=\"stylesheet\">\n</head>\n\n<body onload=\"prettyPrint()\">\n  <nav id=\"jsdoc-navbar\" role=\"navigation\" class=\"jsdoc-navbar\">\n    <div id=\"jsdoc-navbar-container\">\n      <div id=\"jsdoc-navbar-content\">\n        <a href=\"index.html\" class=\"jsdoc-navbar-package-name\">whatsapp-web.<wbr>js 1.<wbr>34.<wbr>6</a>\n      </div>\n    </div>\n  </nav>\n  <div id=\"jsdoc-body-container\">\n    <div id=\"jsdoc-content\">\n      <div id=\"jsdoc-content-container\">\n        <div id=\"jsdoc-banner\" role=\"banner\">\n        </div>\n        <div id=\"jsdoc-main\" role=\"main\">\n          <header class=\"page-header\">\n            <h1>Source: structures/Location.js</h1>\n          </header>\n          <article>\n            <pre class=\"prettyprint linenums\"><code>&#x27;use strict&#x27;;\n\n/**\n * Location send options\n * @typedef {Object} LocationSendOptions\n * @property {string} [name] Location name\n * @property {string} [address] Location address\n * @property {string} [url] URL address to be shown within a location message\n * @property {string} [description] Location full description\n */\n\n/**\n * Location information\n */\nclass Location {\n    /**\n     * @param {number} latitude\n     * @param {number} longitude\n     * @param {LocationSendOptions} [options] Location send options\n     */\n    constructor(latitude, longitude, options &#x3D; {}) {\n        /**\n         * Location latitude\n         * @type {number}\n         */\n        this.latitude &#x3D; latitude;\n\n        /**\n         * Location longitude\n         * @type {number}\n         */\n        this.longitude &#x3D; longitude;\n\n        /**\n         * Name for the location\n         * @type {string|undefined}\n         */\n        this.name &#x3D; options.name;\n\n        /**\n         * Location address\n         * @type {string|undefined}\n         */\n        this.address &#x3D; options.address;\n\n        /**\n         * URL address to be shown within a location message\n         * @type {string|undefined}\n         */\n        this.url &#x3D; options.url;\n\n        /**\n         * Location full description\n         * @type {string|undefined}\n         */\n        this.description &#x3D; this.name &amp;amp;&amp;amp; this.address\n            ? &#x60;${this.name}\\n${this.address}&#x60;\n            : this.name || this.address || &#x27;&#x27;;\n    }\n}\n\nmodule.exports &#x3D; Location;</code></pre>\n          </article>\n        </div>\n      </div>\n      <nav id=\"jsdoc-toc-nav\" role=\"navigation\"></nav>\n    </div>\n  </div>\n  <footer id=\"jsdoc-footer\" class=\"jsdoc-footer\">\n    <div id=\"jsdoc-footer-container\">\n      <p>\n        Generated by <a href=\"https://github.com/jsdoc3/jsdoc\">JSDoc</a> 3.6.11 on January 30, 2026.\n      </p>\n    </div>\n  </footer>\n  <script src=\"scripts/jquery.min.js\"></script>\n  <script src=\"scripts/tree.jquery.js\"></script>\n  <script src=\"scripts/prettify.js\"></script>\n  <script src=\"scripts/jsdoc-toc.js\"></script>\n  <script src=\"scripts/linenumber.js\"></script>\n  <script src=\"scripts/scrollanchor.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "docs/structures_Message.js.html",
    "content": "<!doctype html>\n<html>\n\n<head>\n  <meta name=\"generator\" content=\"JSDoc 3.6.11\">\n  <meta charset=\"utf-8\">\n  <title>whatsapp-web.js 1.34.6 &raquo; Source: structures/Message.js</title>\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Karla:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Noto+Serif:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Inconsolata:500\" type=\"text/css\">\n  <link href=\"css/baseline.css\" rel=\"stylesheet\">\n</head>\n\n<body onload=\"prettyPrint()\">\n  <nav id=\"jsdoc-navbar\" role=\"navigation\" class=\"jsdoc-navbar\">\n    <div id=\"jsdoc-navbar-container\">\n      <div id=\"jsdoc-navbar-content\">\n        <a href=\"index.html\" class=\"jsdoc-navbar-package-name\">whatsapp-web.<wbr>js 1.<wbr>34.<wbr>6</a>\n      </div>\n    </div>\n  </nav>\n  <div id=\"jsdoc-body-container\">\n    <div id=\"jsdoc-content\">\n      <div id=\"jsdoc-content-container\">\n        <div id=\"jsdoc-banner\" role=\"banner\">\n        </div>\n        <div id=\"jsdoc-main\" role=\"main\">\n          <header class=\"page-header\">\n            <h1>Source: structures/Message.js</h1>\n          </header>\n          <article>\n            <pre class=\"prettyprint linenums\"><code>&#x27;use strict&#x27;;\n\nconst Base &#x3D; require(&#x27;./Base&#x27;);\nconst MessageMedia &#x3D; require(&#x27;./MessageMedia&#x27;);\nconst Location &#x3D; require(&#x27;./Location&#x27;);\nconst Order &#x3D; require(&#x27;./Order&#x27;);\nconst Payment &#x3D; require(&#x27;./Payment&#x27;);\nconst Reaction &#x3D; require(&#x27;./Reaction&#x27;);\nconst Contact &#x3D; require(&#x27;./Contact&#x27;);\nconst ScheduledEvent &#x3D; require(&#x27;./ScheduledEvent&#x27;); // eslint-disable-line no-unused-vars\nconst { MessageTypes } &#x3D; require(&#x27;../util/Constants&#x27;);\n\n/**\n * Represents a Message on WhatsApp\n * @extends {Base}\n */\nclass Message extends Base {\n    constructor(client, data) {\n        super(client);\n\n        if (data) this._patch(data);\n    }\n\n    _patch(data) {\n        this._data &#x3D; data;\n        \n        /**\n         * MediaKey that represents the sticker &#x27;ID&#x27;\n         * @type {string}\n         */\n        this.mediaKey &#x3D; data.mediaKey;\n        \n        /**\n         * ID that represents the message\n         * @type {object}\n         */\n        this.id &#x3D; data.id;\n\n        /**\n         * ACK status for the message\n         * @type {MessageAck}\n         */\n        this.ack &#x3D; data.ack;\n\n        /**\n         * Indicates if the message has media available for download\n         * @type {boolean}\n         */\n        this.hasMedia &#x3D; Boolean(data.directPath);\n\n        /**\n         * Message content\n         * @type {string}\n         */\n        this.body &#x3D; this.hasMedia ? data.caption || &#x27;&#x27; : data.body || data.pollName || data.eventName || &#x27;&#x27;;\n\n        /**\n         * Message type\n         * @type {MessageTypes}\n         */\n        this.type &#x3D; data.type;\n\n        /**\n         * Unix timestamp for when the message was created\n         * @type {number}\n         */\n        this.timestamp &#x3D; data.t;\n\n        /**\n         * ID for the Chat that this message was sent to, except if the message was sent by the current user.\n         * @type {string}\n         */\n        this.from &#x3D; (typeof (data.from) &#x3D;&#x3D;&#x3D; &#x27;object&#x27; &amp;amp;&amp;amp; data.from !&#x3D;&#x3D; null) ? data.from._serialized : data.from;\n\n        /**\n         * ID for who this message is for.\n         *\n         * If the message is sent by the current user, it will be the Chat to which the message is being sent.\n         * If the message is sent by another user, it will be the ID for the current user.\n         * @type {string}\n         */\n        this.to &#x3D; (typeof (data.to) &#x3D;&#x3D;&#x3D; &#x27;object&#x27; &amp;amp;&amp;amp; data.to !&#x3D;&#x3D; null) ? data.to._serialized : data.to;\n\n        /**\n         * If the message was sent to a group, this field will contain the user that sent the message.\n         * @type {string}\n         */\n        this.author &#x3D; (typeof (data.author) &#x3D;&#x3D;&#x3D; &#x27;object&#x27; &amp;amp;&amp;amp; data.author !&#x3D;&#x3D; null) ? data.author._serialized : data.author;\n\n        /**\n         * String that represents from which device type the message was sent\n         * @type {string}\n         */\n        this.deviceType &#x3D; typeof data.id.id &#x3D;&#x3D;&#x3D; &#x27;string&#x27; &amp;amp;&amp;amp; data.id.id.length &gt; 21 ? &#x27;android&#x27; : typeof data.id.id &#x3D;&#x3D;&#x3D; &#x27;string&#x27; &amp;amp;&amp;amp; data.id.id.substring(0, 2) &#x3D;&#x3D;&#x3D; &#x27;3A&#x27; ? &#x27;ios&#x27; : &#x27;web&#x27;;\n        /**\n         * Indicates if the message was forwarded\n         * @type {boolean}\n         */\n        this.isForwarded &#x3D; data.isForwarded;\n\n        /**\n         * Indicates how many times the message was forwarded.\n         *\n         * The maximum value is 127.\n         * @type {number}\n         */\n        this.forwardingScore &#x3D; data.forwardingScore || 0;\n\n        /**\n         * Indicates if the message is a status update\n         * @type {boolean}\n         */\n        this.isStatus &#x3D; data.isStatusV3 || data.id.remote &#x3D;&#x3D;&#x3D; &#x27;status@broadcast&#x27;;\n\n        /**\n         * Indicates if the message was starred\n         * @type {boolean}\n         */\n        this.isStarred &#x3D; data.star;\n\n        /**\n         * Indicates if the message was a broadcast\n         * @type {boolean}\n         */\n        this.broadcast &#x3D; data.broadcast;\n\n        /**\n         * Indicates if the message was sent by the current user\n         * @type {boolean}\n         */\n        this.fromMe &#x3D; data.id.fromMe;\n\n        /**\n         * Indicates if the message was sent as a reply to another message.\n         * @type {boolean}\n         */\n        this.hasQuotedMsg &#x3D; data.quotedMsg ? true : false;\n\n        /**\n         * Indicates whether there are reactions to the message\n         * @type {boolean}\n         */\n        this.hasReaction &#x3D; data.hasReaction ? true : false;\n\n        /**\n         * Indicates the duration of the message in seconds\n         * @type {string}\n         */\n        this.duration &#x3D; data.duration ? data.duration : undefined;\n\n        /**\n         * Location information contained in the message, if the message is type &quot;location&quot;\n         * @type {Location}\n         */\n        this.location &#x3D; (() &#x3D;&gt; {\n            if (data.type !&#x3D;&#x3D; MessageTypes.LOCATION) {\n                return undefined;\n            }\n            let description;\n            if (data.loc &amp;amp;&amp;amp; typeof data.loc &#x3D;&#x3D;&#x3D; &#x27;string&#x27;) {\n                let splitted &#x3D; data.loc.split(&#x27;\\n&#x27;);\n                description &#x3D; {\n                    name: splitted[0],\n                    address: splitted[1],\n                    url: data.clientUrl\n                };\n            }\n            return new Location(data.lat, data.lng, description);\n        })();\n\n        /**\n         * List of vCards contained in the message.\n         * @type {Array&amp;lt;string&gt;}\n         */\n        this.vCards &#x3D; data.type &#x3D;&#x3D;&#x3D; MessageTypes.CONTACT_CARD_MULTI ? data.vcardList.map((c) &#x3D;&gt; c.vcard) : data.type &#x3D;&#x3D;&#x3D; MessageTypes.CONTACT_CARD ? [data.body] : [];\n\n        /**\n         * Group Invite Data\n         * @type {object}\n         */\n        this.inviteV4 &#x3D; data.type &#x3D;&#x3D;&#x3D; MessageTypes.GROUP_INVITE ? {\n            inviteCode: data.inviteCode,\n            inviteCodeExp: data.inviteCodeExp,\n            groupId: data.inviteGrp,\n            groupName: data.inviteGrpName,\n            fromId: typeof data.from &#x3D;&#x3D;&#x3D; &#x27;object&#x27; &amp;amp;&amp;amp; &#x27;_serialized&#x27; in data.from ? data.from._serialized : data.from,\n            toId: typeof data.to &#x3D;&#x3D;&#x3D; &#x27;object&#x27; &amp;amp;&amp;amp; &#x27;_serialized&#x27; in data.to ? data.to._serialized : data.to\n        } : undefined;\n\n        /**\n         * Indicates the mentions in the message body.\n         * @type {string[]}\n         */\n        this.mentionedIds &#x3D; data.mentionedJidList || [];\n\n        /**\n         * @typedef {Object} GroupMention\n         * @property {string} groupSubject The name  of the group\n         * @property {string} groupJid The group ID\n         */\n\n        /**\n         * Indicates whether there are group mentions in the message body\n         * @type {GroupMention[]}\n         */\n        this.groupMentions &#x3D; data.groupMentions || [];\n\n        /**\n         * Order ID for message type ORDER\n         * @type {string}\n         */\n        this.orderId &#x3D; data.orderId ? data.orderId : undefined;\n        /**\n         * Order Token for message type ORDER\n         * @type {string}\n         */\n        this.token &#x3D; data.token ? data.token : undefined;\n\n        /** \n         * Indicates whether the message is a Gif\n         * @type {boolean}\n         */\n        this.isGif &#x3D; Boolean(data.isGif);\n\n        /**\n         * Indicates if the message will disappear after it expires\n         * @type {boolean}\n         */\n        this.isEphemeral &#x3D; data.isEphemeral;\n\n        /** Title */\n        if (data.title) {\n            this.title &#x3D; data.title;\n        }\n\n        /** Description */\n        if (data.description) {\n            this.description &#x3D; data.description;\n        }\n\n        /** Business Owner JID */\n        if (data.businessOwnerJid) {\n            this.businessOwnerJid &#x3D; data.businessOwnerJid;\n        }\n\n        /** Product ID */\n        if (data.productId) {\n            this.productId &#x3D; data.productId;\n        }\n\n        /** Last edit time */\n        if (data.latestEditSenderTimestampMs) {\n            this.latestEditSenderTimestampMs &#x3D; data.latestEditSenderTimestampMs;\n        }\n\n        /** Last edit message author */\n        if (data.latestEditMsgKey) {\n            this.latestEditMsgKey &#x3D; data.latestEditMsgKey;\n        }\n        \n        /**\n         * Protocol message key.\n         * Can be used to retrieve the ID of an original message that was revoked.\n         */\n        if (data.protocolMessageKey) {\n            this.protocolMessageKey &#x3D; data.protocolMessageKey;\n        }\n\n        /**\n         * Links included in the message.\n         * @type {Array&amp;lt;{link: string, isSuspicious: boolean}&gt;}\n         *\n         */\n        this.links &#x3D; data.links;\n\n        /** Buttons */\n        if (data.dynamicReplyButtons) {\n            this.dynamicReplyButtons &#x3D; data.dynamicReplyButtons;\n        }\n\n        /** Selected Button Id **/\n        if (data.selectedButtonId) {\n            this.selectedButtonId &#x3D; data.selectedButtonId;\n        }\n\n        /** Selected List row Id **/\n        if (data.listResponse &amp;amp;&amp;amp; data.listResponse.singleSelectReply.selectedRowId) {\n            this.selectedRowId &#x3D; data.listResponse.singleSelectReply.selectedRowId;\n        }\n\n        if (this.type &#x3D;&#x3D;&#x3D; MessageTypes.POLL_CREATION) {\n            this.pollName &#x3D; data.pollName;\n            this.pollOptions &#x3D; data.pollOptions;\n            this.allowMultipleAnswers &#x3D; Boolean(!data.pollSelectableOptionsCount);\n            this.pollInvalidated &#x3D; data.pollInvalidated;\n            this.isSentCagPollCreation &#x3D; data.isSentCagPollCreation;\n            this.messageSecret &#x3D; data.messageSecret ? Object.keys(data.messageSecret).map((key) &#x3D;&gt; data.messageSecret[key]) : [];\n        }\n\n        return super._patch(data);\n    }\n\n    _getChatId() {\n        return this.fromMe ? this.to : this.from;\n    }\n\n    /**\n     * Reloads this Message object&#x27;s data in-place with the latest values from WhatsApp Web. \n     * Note that the Message must still be in the web app cache for this to work, otherwise will return null.\n     * @returns {Promise&amp;lt;Message&gt;}\n     */\n    async reload() {\n        const newData &#x3D; await this.client.pupPage.evaluate(async (msgId) &#x3D;&gt; {\n            const msg &#x3D; window.Store.Msg.get(msgId) || (await window.Store.Msg.getMessagesById([msgId]))?.messages?.[0];\n            if (!msg) return null;\n            return window.WWebJS.getMessageModel(msg);\n        }, this.id._serialized);\n\n        if(!newData) return null;\n        \n        this._patch(newData);\n        return this;\n    }\n\n    /**\n     * Returns message in a raw format\n     * @type {Object}\n     */\n    get rawData() {\n        return this._data;\n    }\n    \n    /**\n     * Returns the Chat this message was sent in\n     * @returns {Promise&amp;lt;Chat&gt;}\n     */\n    getChat() {\n        return this.client.getChatById(this._getChatId());\n    }\n\n    /**\n     * Returns the Contact this message was sent from\n     * @returns {Promise&amp;lt;Contact&gt;}\n     */\n    getContact() {\n        return this.client.getContactById(this.author || this.from);\n    }\n\n    /**\n     * Returns the Contacts mentioned in this message\n     * @returns {Promise&amp;lt;Array&amp;lt;Contact&gt;&gt;}\n     */\n    async getMentions() {\n        return await Promise.all(this.mentionedIds.map(async m &#x3D;&gt; await this.client.getContactById(m)));\n    }\n    \n    /**\n     * Returns groups mentioned in this message\n     * @returns {Promise&amp;lt;Array&amp;lt;GroupChat&gt;&gt;}\n     */\n    async getGroupMentions() {\n        return await Promise.all(this.groupMentions.map(async (m) &#x3D;&gt; await this.client.getChatById(m.groupJid._serialized)));\n    }\n\n    /**\n     * Returns the quoted message, if any\n     * @returns {Promise&amp;lt;Message&gt;}\n     */\n    async getQuotedMessage() {\n        if (!this.hasQuotedMsg) return undefined;\n\n        const quotedMsg &#x3D; await this.client.pupPage.evaluate(async (msgId) &#x3D;&gt; {\n            const msg &#x3D; window.Store.Msg.get(msgId) || (await window.Store.Msg.getMessagesById([msgId]))?.messages?.[0];\n            const quotedMsg &#x3D; window.Store.QuotedMsg.getQuotedMsgObj(msg);\n            return window.WWebJS.getMessageModel(quotedMsg);\n        }, this.id._serialized);\n\n        return new Message(this.client, quotedMsg);\n    }\n\n    /**\n     * Sends a message as a reply to this message. If chatId is specified, it will be sent\n     * through the specified Chat. If not, it will send the message\n     * in the same Chat as the original message was sent.\n     *\n     * @param {string|MessageMedia|Location} content\n     * @param {string} [chatId]\n     * @param {MessageSendOptions} [options]\n     * @returns {Promise&amp;lt;Message&gt;}\n     */\n    async reply(content, chatId, options &#x3D; {}) {\n        if (!chatId) {\n            chatId &#x3D; this._getChatId();\n        }\n\n        options &#x3D; {\n            ...options,\n            quotedMessageId: this.id._serialized\n        };\n\n        return this.client.sendMessage(chatId, content, options);\n    }\n\n    /**\n     * React to this message with an emoji\n     * @param {string} reaction - Emoji to react with. Send an empty string to remove the reaction.\n     * @return {Promise}\n     */\n    async react(reaction){\n        await this.client.pupPage.evaluate(async (messageId, reaction) &#x3D;&gt; {\n            if (!messageId) return null;\n            const msg &#x3D;\n                window.Store.Msg.get(messageId) || (await window.Store.Msg.getMessagesById([messageId]))?.messages?.[0];\n            if(!msg) return null;\n            await window.Store.sendReactionToMsg(msg, reaction);\n        }, this.id._serialized, reaction);\n    }\n\n    /**\n     * Accept Group V4 Invite\n     * @returns {Promise&amp;lt;Object&gt;}\n     */\n    async acceptGroupV4Invite() {\n        return await this.client.acceptGroupV4Invite(this.inviteV4);\n    }\n\n    /**\n     * Forwards this message to another chat (that you chatted before, otherwise it will fail)\n     *\n     * @param {string|Chat} chat Chat model or chat ID to which the message will be forwarded\n     * @returns {Promise}\n     */\n    async forward(chat) {\n        const chatId &#x3D; typeof chat &#x3D;&#x3D;&#x3D; &#x27;string&#x27; ? chat : chat.id._serialized;\n\n        await this.client.pupPage.evaluate(async (msgId, chatId) &#x3D;&gt; {\n            return window.WWebJS.forwardMessage(chatId, msgId);\n        }, this.id._serialized, chatId);\n    }\n\n    /**\n     * Downloads and returns the attatched message media\n     * @returns {Promise&amp;lt;MessageMedia&gt;}\n     */\n    async downloadMedia() {\n        if (!this.hasMedia) {\n            return undefined;\n        }\n\n        const result &#x3D; await this.client.pupPage.evaluate(async (msgId) &#x3D;&gt; {\n            const msg &#x3D; window.Store.Msg.get(msgId) || (await window.Store.Msg.getMessagesById([msgId]))?.messages?.[0];\n\n            // REUPLOADING mediaStage means the media is expired and the download button is spinning, cannot be downloaded now\n            if (!msg || !msg.mediaData || msg.mediaData.mediaStage &#x3D;&#x3D;&#x3D; &#x27;REUPLOADING&#x27;) {\n                return null;\n            }\n            if (msg.mediaData.mediaStage !&#x3D; &#x27;RESOLVED&#x27;) {\n                // try to resolve media\n                await msg.downloadMedia({\n                    downloadEvenIfExpensive: true,\n                    rmrReason: 1\n                });\n            }\n\n            if (msg.mediaData.mediaStage.includes(&#x27;ERROR&#x27;) || msg.mediaData.mediaStage &#x3D;&#x3D;&#x3D; &#x27;FETCHING&#x27;) {\n                // media could not be downloaded\n                return undefined;\n            }\n\n            try {\n                const mockQpl &#x3D; {\n                    addAnnotations: function() { return this; },\n                    addPoint: function() { return this; }\n                };\n                const decryptedMedia &#x3D; await window.Store.DownloadManager.downloadAndMaybeDecrypt({\n                    directPath: msg.directPath,\n                    encFilehash: msg.encFilehash,\n                    filehash: msg.filehash,\n                    mediaKey: msg.mediaKey,\n                    mediaKeyTimestamp: msg.mediaKeyTimestamp,\n                    type: msg.type,\n                    signal: (new AbortController).signal,\n                    downloadQpl: mockQpl\n                });\n\n                const data &#x3D; await window.WWebJS.arrayBufferToBase64Async(decryptedMedia);\n\n                return {\n                    data,\n                    mimetype: msg.mimetype,\n                    filename: msg.filename,\n                    filesize: msg.size\n                };\n            } catch (e) {\n                if(e.status &amp;amp;&amp;amp; e.status &#x3D;&#x3D;&#x3D; 404) return undefined;\n                throw e;\n            }\n        }, this.id._serialized);\n\n        if (!result) return undefined;\n        return new MessageMedia(result.mimetype, result.data, result.filename, result.filesize);\n    }\n\n    /**\n     * Deletes a message from the chat\n     * @param {?boolean} everyone If true and the message is sent by the current user or the user is an admin, will delete it for everyone in the chat.\n     * @param {?boolean} [clearMedia &#x3D; true] If true, any associated media will also be deleted from a device.\n     */\n    async delete(everyone, clearMedia &#x3D; true) {\n        await this.client.pupPage.evaluate(async (msgId, everyone, clearMedia) &#x3D;&gt; {\n            const msg &#x3D; window.Store.Msg.get(msgId) || (await window.Store.Msg.getMessagesById([msgId]))?.messages?.[0];\n            const chat &#x3D; window.Store.Chat.get(msg.id.remote) || (await window.Store.Chat.find(msg.id.remote));\n            \n            const canRevoke &#x3D;\n                window.Store.MsgActionChecks.canSenderRevokeMsg(msg) || window.Store.MsgActionChecks.canAdminRevokeMsg(msg);\n\n            if (everyone &amp;amp;&amp;amp; canRevoke) {\n                return window.compareWwebVersions(window.Debug.VERSION, &#x27;&gt;&#x3D;&#x27;, &#x27;2.3000.0&#x27;)\n                    ? window.Store.Cmd.sendRevokeMsgs(chat, { list: [msg], type: &#x27;message&#x27; }, { clearMedia: clearMedia })\n                    : window.Store.Cmd.sendRevokeMsgs(chat, [msg], { clearMedia: true, type: msg.id.fromMe ? &#x27;Sender&#x27; : &#x27;Admin&#x27; });\n            }\n\n            return window.compareWwebVersions(window.Debug.VERSION, &#x27;&gt;&#x3D;&#x27;, &#x27;2.3000.0&#x27;)\n                ? window.Store.Cmd.sendDeleteMsgs(chat, { list: [msg], type: &#x27;message&#x27; }, clearMedia)\n                : window.Store.Cmd.sendDeleteMsgs(chat, [msg], clearMedia);\n        }, this.id._serialized, everyone, clearMedia);\n    }\n\n    /**\n     * Stars this message\n     */\n    async star() {\n        await this.client.pupPage.evaluate(async (msgId) &#x3D;&gt; {\n            const msg &#x3D; window.Store.Msg.get(msgId) || (await window.Store.Msg.getMessagesById([msgId]))?.messages?.[0];\n            if (window.Store.MsgActionChecks.canStarMsg(msg)) {\n                let chat &#x3D; await window.Store.Chat.find(msg.id.remote);\n                return window.Store.Cmd.sendStarMsgs(chat, [msg], false);\n            }\n        }, this.id._serialized);\n    }\n\n    /**\n     * Unstars this message\n     */\n    async unstar() {\n        await this.client.pupPage.evaluate(async (msgId) &#x3D;&gt; {\n            const msg &#x3D; window.Store.Msg.get(msgId) || (await window.Store.Msg.getMessagesById([msgId]))?.messages?.[0];\n            if (window.Store.MsgActionChecks.canStarMsg(msg)) {\n                let chat &#x3D; await window.Store.Chat.find(msg.id.remote);\n                return window.Store.Cmd.sendUnstarMsgs(chat, [msg], false);\n            }\n        }, this.id._serialized);\n    }\n\n    /**\n     * Pins the message (group admins can pin messages of all group members)\n     * @param {number} duration The duration in seconds the message will be pinned in a chat\n     * @returns {Promise&amp;lt;boolean&gt;} Returns true if the operation completed successfully, false otherwise\n     */\n    async pin(duration) {\n        return await this.client.pupPage.evaluate(async (msgId, duration) &#x3D;&gt; {\n            return await window.WWebJS.pinUnpinMsgAction(msgId, 1, duration);\n        }, this.id._serialized, duration);\n    }\n\n    /**\n     * Unpins the message (group admins can unpin messages of all group members)\n     * @returns {Promise&amp;lt;boolean&gt;} Returns true if the operation completed successfully, false otherwise\n     */\n    async unpin() {\n        return await this.client.pupPage.evaluate(async (msgId) &#x3D;&gt; {\n            return await window.WWebJS.pinUnpinMsgAction(msgId, 2, 0);\n        }, this.id._serialized);\n    }\n\n    /**\n     * Message Info\n     * @typedef {Object} MessageInfo\n     * @property {Array&amp;lt;{id: ContactId, t: number}&gt;} delivery Contacts to which the message has been delivered to\n     * @property {number} deliveryRemaining Amount of people to whom the message has not been delivered to\n     * @property {Array&amp;lt;{id: ContactId, t: number}&gt;} played Contacts who have listened to the voice message\n     * @property {number} playedRemaining Amount of people who have not listened to the message\n     * @property {Array&amp;lt;{id: ContactId, t: number}&gt;} read Contacts who have read the message\n     * @property {number} readRemaining Amount of people who have not read the message\n     */\n\n    /**\n     * Get information about message delivery status.\n     * May return null if the message does not exist or is not sent by you.\n     * @returns {Promise&amp;lt;?MessageInfo&gt;}\n     */\n    async getInfo() {\n        const info &#x3D; await this.client.pupPage.evaluate(async (msgId) &#x3D;&gt; {\n            const msg &#x3D; window.Store.Msg.get(msgId) || (await window.Store.Msg.getMessagesById([msgId]))?.messages?.[0];\n            if (!msg || !msg.id.fromMe) return null;\n\n            return new Promise((resolve) &#x3D;&gt; {\n                setTimeout(async () &#x3D;&gt; {\n                    resolve(await window.Store.getMsgInfo(msg.id));\n                }, (Date.now() - msg.t * 1000 &amp;lt; 1250) &amp;amp;&amp;amp; Math.floor(Math.random() * (1200 - 1100 + 1)) + 1100 || 0);\n            });\n        }, this.id._serialized);\n\n        return info;\n    }\n\n    /**\n     * Gets the order associated with a given message\n     * @return {Promise&amp;lt;Order&gt;}\n     */\n    async getOrder() {\n        if (this.type &#x3D;&#x3D;&#x3D; MessageTypes.ORDER) {\n            const result &#x3D; await this.client.pupPage.evaluate((orderId, token, chatId) &#x3D;&gt; {\n                return window.WWebJS.getOrderDetail(orderId, token, chatId);\n            }, this.orderId, this.token, this._getChatId());\n            if (!result) return undefined;\n            return new Order(this.client, result);\n        }\n        return undefined;\n    }\n    /**\n     * Gets the payment details associated with a given message\n     * @return {Promise&amp;lt;Payment&gt;}\n     */\n    async getPayment() {\n        if (this.type &#x3D;&#x3D;&#x3D; MessageTypes.PAYMENT) {\n            const msg &#x3D; await this.client.pupPage.evaluate(async (msgId) &#x3D;&gt; {\n                const msg &#x3D; window.Store.Msg.get(msgId) || (await window.Store.Msg.getMessagesById([msgId]))?.messages?.[0];\n                if(!msg) return null;\n                return msg.serialize();\n            }, this.id._serialized);\n            return new Payment(this.client, msg);\n        }\n        return undefined;\n    }\n\n\n    /**\n     * Reaction List\n     * @typedef {Object} ReactionList\n     * @property {string} id Original emoji\n     * @property {string} aggregateEmoji aggregate emoji\n     * @property {boolean} hasReactionByMe Flag who sent the reaction\n     * @property {Array&amp;lt;Reaction&gt;} senders Reaction senders, to this message\n     */\n\n    /**\n     * Gets the reactions associated with the given message\n     * @return {Promise&amp;lt;ReactionList[]&gt;}\n     */\n    async getReactions() {\n        if (!this.hasReaction) {\n            return undefined;\n        }\n\n        const reactions &#x3D; await this.client.pupPage.evaluate(async (msgId) &#x3D;&gt; {\n            const msgReactions &#x3D; await window.Store.Reactions.find(msgId);\n            if (!msgReactions || !msgReactions.reactions.length) return null;\n            return msgReactions.reactions.serialize();\n        }, this.id._serialized);\n\n        if (!reactions) {\n            return undefined;\n        }\n\n        return reactions.map(reaction &#x3D;&gt; {\n            reaction.senders &#x3D; reaction.senders.map(sender &#x3D;&gt; {\n                sender.timestamp &#x3D; Math.round(sender.timestamp / 1000);\n                return new Reaction(this.client, sender);\n            });\n            return reaction;\n        });\n    }\n\n    /**\n     * Edits the current message.\n     * @param {string} content\n     * @param {MessageEditOptions} [options] - Options used when editing the message\n     * @returns {Promise&amp;lt;?Message&gt;}\n     */\n    async edit(content, options &#x3D; {}) {\n        if (options.mentions) {\n            !Array.isArray(options.mentions) &amp;amp;&amp;amp; (options.mentions &#x3D; [options.mentions]);\n            if (options.mentions.some((possiblyContact) &#x3D;&gt; possiblyContact instanceof Contact)) {\n                console.warn(&#x27;Mentions with an array of Contact are now deprecated. See more at https://github.com/pedroslopez/whatsapp-web.js/pull/2166.&#x27;);\n                options.mentions &#x3D; options.mentions.map((a) &#x3D;&gt; a.id._serialized);\n            }\n        }\n\n        options.groupMentions &amp;amp;&amp;amp; !Array.isArray(options.groupMentions) &amp;amp;&amp;amp; (options.groupMentions &#x3D; [options.groupMentions]);\n\n        let internalOptions &#x3D; {\n            linkPreview: options.linkPreview &#x3D;&#x3D;&#x3D; false ? undefined : true,\n            mentionedJidList: options.mentions || [],\n            groupMentions: options.groupMentions,\n            extraOptions: options.extra\n        };\n        \n        if (!this.fromMe) {\n            return null;\n        }\n        const messageEdit &#x3D; await this.client.pupPage.evaluate(async (msgId, message, options) &#x3D;&gt; {\n            const msg &#x3D; window.Store.Msg.get(msgId) || (await window.Store.Msg.getMessagesById([msgId]))?.messages?.[0];\n            if (!msg) return null;\n\n            let canEdit &#x3D; window.Store.MsgActionChecks.canEditText(msg) || window.Store.MsgActionChecks.canEditCaption(msg);\n            if (canEdit) {\n                const msgEdit &#x3D; await window.WWebJS.editMessage(msg, message, options);\n                return msgEdit.serialize();\n            }\n            return null;\n        }, this.id._serialized, content, internalOptions);\n        if (messageEdit) {\n            return new Message(this.client, messageEdit);\n        }\n        return null;\n    }\n\n    /**\n     * Edits the current ScheduledEvent message.\n     * Once the scheduled event is canceled, it can not be edited.\n     * @param {ScheduledEvent} editedEventObject\n     * @returns {Promise&amp;lt;?Message&gt;}\n     */\n    async editScheduledEvent(editedEventObject) {\n        if (!this.fromMe) {\n            return null;\n        }\n\n        const edittedEventMsg &#x3D; await this.client.pupPage.evaluate(async (msgId, editedEventObject) &#x3D;&gt; {\n            const msg &#x3D; window.Store.Msg.get(msgId) || (await window.Store.Msg.getMessagesById([msgId]))?.messages?.[0];\n            if (!msg) return null;\n\n            const { name, startTimeTs, eventSendOptions } &#x3D; editedEventObject;\n            const eventOptions &#x3D; {\n                name: name,\n                description: eventSendOptions.description,\n                startTime: startTimeTs,\n                endTime: eventSendOptions.endTimeTs,\n                location: eventSendOptions.location,\n                callType: eventSendOptions.callType,\n                isEventCanceled: eventSendOptions.isEventCanceled,\n            };\n\n            await window.Store.ScheduledEventMsgUtils.sendEventEditMessage(eventOptions, msg);\n            const editedMsg &#x3D; window.Store.Msg.get(msg.id._serialized);\n            return editedMsg?.serialize();\n        }, this.id._serialized, editedEventObject);\n\n        return edittedEventMsg &amp;amp;&amp;amp; new Message(this.client, edittedEventMsg);\n    }\n    /**\n     * Returns the PollVote this poll message\n     * @returns {Promise&amp;lt;PollVote[]&gt;}\n     */\n    async getPollVotes() {\n        return await this.client.getPollVotes(this.id._serialized);\n    }\n\n    /**\n     * Send votes to the poll message\n     * @param {Array&amp;lt;string&gt;} selectedOptions Array of options selected.\n     * @returns {Promise}\n     */\n    async vote(selectedOptions) {\n        if (this.type !&#x3D; MessageTypes.POLL_CREATION) throw &#x27;Invalid usage! Can only be used with a pollCreation message&#x27;;\n\n        await this.client.pupPage.evaluate(async (messageId, votes) &#x3D;&gt; {\n            if (!messageId) return null;\n            if (!Array.isArray(votes)) votes &#x3D; [votes];\n            let localIdSet &#x3D; new Set();\n            const msg &#x3D;\n                window.Store.Msg.get(messageId) || (await window.Store.Msg.getMessagesById([messageId]))?.messages?.[0];\n            if (!msg) return null;\n\n            msg.pollOptions.forEach(a &#x3D;&gt; {\n                for (const option of votes) {\n                    if (a.name &#x3D;&#x3D;&#x3D; option) localIdSet.add(a.localId);\n                }\n            });\n\n            await window.Store.PollsSendVote.sendVote(msg, localIdSet);\n        }, this.id._serialized, selectedOptions);\n    }\n}\n\nmodule.exports &#x3D; Message;\n</code></pre>\n          </article>\n        </div>\n      </div>\n      <nav id=\"jsdoc-toc-nav\" role=\"navigation\"></nav>\n    </div>\n  </div>\n  <footer id=\"jsdoc-footer\" class=\"jsdoc-footer\">\n    <div id=\"jsdoc-footer-container\">\n      <p>\n        Generated by <a href=\"https://github.com/jsdoc3/jsdoc\">JSDoc</a> 3.6.11 on January 30, 2026.\n      </p>\n    </div>\n  </footer>\n  <script src=\"scripts/jquery.min.js\"></script>\n  <script src=\"scripts/tree.jquery.js\"></script>\n  <script src=\"scripts/prettify.js\"></script>\n  <script src=\"scripts/jsdoc-toc.js\"></script>\n  <script src=\"scripts/linenumber.js\"></script>\n  <script src=\"scripts/scrollanchor.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "docs/structures_MessageMedia.js.html",
    "content": "<!doctype html>\n<html>\n\n<head>\n  <meta name=\"generator\" content=\"JSDoc 3.6.11\">\n  <meta charset=\"utf-8\">\n  <title>whatsapp-web.js 1.34.6 &raquo; Source: structures/MessageMedia.js</title>\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Karla:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Noto+Serif:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Inconsolata:500\" type=\"text/css\">\n  <link href=\"css/baseline.css\" rel=\"stylesheet\">\n</head>\n\n<body onload=\"prettyPrint()\">\n  <nav id=\"jsdoc-navbar\" role=\"navigation\" class=\"jsdoc-navbar\">\n    <div id=\"jsdoc-navbar-container\">\n      <div id=\"jsdoc-navbar-content\">\n        <a href=\"index.html\" class=\"jsdoc-navbar-package-name\">whatsapp-web.<wbr>js 1.<wbr>34.<wbr>6</a>\n      </div>\n    </div>\n  </nav>\n  <div id=\"jsdoc-body-container\">\n    <div id=\"jsdoc-content\">\n      <div id=\"jsdoc-content-container\">\n        <div id=\"jsdoc-banner\" role=\"banner\">\n        </div>\n        <div id=\"jsdoc-main\" role=\"main\">\n          <header class=\"page-header\">\n            <h1>Source: structures/MessageMedia.js</h1>\n          </header>\n          <article>\n            <pre class=\"prettyprint linenums\"><code>&#x27;use strict&#x27;;\n\nconst fs &#x3D; require(&#x27;fs&#x27;);\nconst path &#x3D; require(&#x27;path&#x27;);\nconst mime &#x3D; require(&#x27;mime&#x27;);\nconst fetch &#x3D; require(&#x27;node-fetch&#x27;);\nconst { URL } &#x3D; require(&#x27;url&#x27;);\n\n/**\n * Media attached to a message\n * @param {string} mimetype MIME type of the attachment\n * @param {string} data Base64-encoded data of the file\n * @param {?string} filename Document file name. Value can be null\n * @param {?number} filesize Document file size in bytes. Value can be null\n */\nclass MessageMedia {\n    constructor(mimetype, data, filename, filesize) {\n        /**\n         * MIME type of the attachment\n         * @type {string}\n         */\n        this.mimetype &#x3D; mimetype;\n\n        /**\n         * Base64 encoded data that represents the file\n         * @type {string}\n         */\n        this.data &#x3D; data;\n\n        /**\n         * Document file name. Value can be null\n         * @type {?string}\n         */\n        this.filename &#x3D; filename;\n        \n        /**\n         * Document file size in bytes. Value can be null\n         * @type {?number}\n         */\n        this.filesize &#x3D; filesize;\n    }\n\n    /**\n     * Creates a MessageMedia instance from a local file path\n     * @param {string} filePath \n     * @returns {MessageMedia}\n     */\n    static fromFilePath(filePath) {\n        const b64data &#x3D; fs.readFileSync(filePath, {encoding: &#x27;base64&#x27;});\n        const mimetype &#x3D; mime.getType(filePath); \n        const filename &#x3D; path.basename(filePath);\n\n        return new MessageMedia(mimetype, b64data, filename);\n    }\n\n    /**\n     * Creates a MessageMedia instance from a URL\n     * @param {string} url\n     * @param {Object} [options]\n     * @param {boolean} [options.unsafeMime&#x3D;false]\n     * @param {string} [options.filename]\n     * @param {object} [options.client]\n     * @param {object} [options.reqOptions]\n     * @param {number} [options.reqOptions.size&#x3D;0]\n     * @returns {Promise&amp;lt;MessageMedia&gt;}\n     */\n    static async fromUrl(url, options &#x3D; {}) {\n        const pUrl &#x3D; new URL(url);\n        let mimetype &#x3D; mime.getType(pUrl.pathname);\n\n        if (!mimetype &amp;amp;&amp;amp; !options.unsafeMime)\n            throw new Error(&#x27;Unable to determine MIME type using URL. Set unsafeMime to true to download it anyway.&#x27;);\n\n        async function fetchData (url, options) {\n            const reqOptions &#x3D; Object.assign({ headers: { accept: &#x27;image/* video/* text/* audio/*&#x27; } }, options);\n            const response &#x3D; await fetch(url, reqOptions);\n            const mime &#x3D; response.headers.get(&#x27;Content-Type&#x27;);\n            const size &#x3D; response.headers.get(&#x27;Content-Length&#x27;);\n\n            const contentDisposition &#x3D; response.headers.get(&#x27;Content-Disposition&#x27;);\n            const name &#x3D; contentDisposition ? contentDisposition.match(/((?&amp;lt;&#x3D;filename&#x3D;&quot;)(.*)(?&#x3D;&quot;))/) : null;\n\n            let data &#x3D; &#x27;&#x27;;\n            if (response.buffer) {\n                data &#x3D; (await response.buffer()).toString(&#x27;base64&#x27;);\n            } else {\n                const bArray &#x3D; new Uint8Array(await response.arrayBuffer());\n                bArray.forEach((b) &#x3D;&gt; {\n                    data +&#x3D; String.fromCharCode(b);\n                });\n                data &#x3D; btoa(data);\n            }\n            \n            return { data, mime, name, size };\n        }\n\n        const res &#x3D; options.client\n            ? (await options.client.pupPage.evaluate(fetchData, url, options.reqOptions))\n            : (await fetchData(url, options.reqOptions));\n\n        const filename &#x3D; options.filename ||\n            (res.name ? res.name[0] : (pUrl.pathname.split(&#x27;/&#x27;).pop() || &#x27;file&#x27;));\n        \n        if (!mimetype)\n            mimetype &#x3D; res.mime;\n\n        return new MessageMedia(mimetype, res.data, filename, res.size || null);\n    }\n}\n\nmodule.exports &#x3D; MessageMedia;\n</code></pre>\n          </article>\n        </div>\n      </div>\n      <nav id=\"jsdoc-toc-nav\" role=\"navigation\"></nav>\n    </div>\n  </div>\n  <footer id=\"jsdoc-footer\" class=\"jsdoc-footer\">\n    <div id=\"jsdoc-footer-container\">\n      <p>\n        Generated by <a href=\"https://github.com/jsdoc3/jsdoc\">JSDoc</a> 3.6.11 on January 30, 2026.\n      </p>\n    </div>\n  </footer>\n  <script src=\"scripts/jquery.min.js\"></script>\n  <script src=\"scripts/tree.jquery.js\"></script>\n  <script src=\"scripts/prettify.js\"></script>\n  <script src=\"scripts/jsdoc-toc.js\"></script>\n  <script src=\"scripts/linenumber.js\"></script>\n  <script src=\"scripts/scrollanchor.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "docs/structures_Order.js.html",
    "content": "<!doctype html>\n<html>\n\n<head>\n  <meta name=\"generator\" content=\"JSDoc 3.6.11\">\n  <meta charset=\"utf-8\">\n  <title>whatsapp-web.js 1.34.6 &raquo; Source: structures/Order.js</title>\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Karla:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Noto+Serif:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Inconsolata:500\" type=\"text/css\">\n  <link href=\"css/baseline.css\" rel=\"stylesheet\">\n</head>\n\n<body onload=\"prettyPrint()\">\n  <nav id=\"jsdoc-navbar\" role=\"navigation\" class=\"jsdoc-navbar\">\n    <div id=\"jsdoc-navbar-container\">\n      <div id=\"jsdoc-navbar-content\">\n        <a href=\"index.html\" class=\"jsdoc-navbar-package-name\">whatsapp-web.<wbr>js 1.<wbr>34.<wbr>6</a>\n      </div>\n    </div>\n  </nav>\n  <div id=\"jsdoc-body-container\">\n    <div id=\"jsdoc-content\">\n      <div id=\"jsdoc-content-container\">\n        <div id=\"jsdoc-banner\" role=\"banner\">\n        </div>\n        <div id=\"jsdoc-main\" role=\"main\">\n          <header class=\"page-header\">\n            <h1>Source: structures/Order.js</h1>\n          </header>\n          <article>\n            <pre class=\"prettyprint linenums\"><code>&#x27;use strict&#x27;;\n\nconst Base &#x3D; require(&#x27;./Base&#x27;);\nconst Product &#x3D; require(&#x27;./Product&#x27;);\n\n/**\n * Represents a Order on WhatsApp\n * @extends {Base}\n */\nclass Order extends Base {\n    constructor(client, data) {\n        super(client);\n\n        if (data) this._patch(data);\n    }\n\n    _patch(data) {\n        /**\n         * List of products\n         * @type {Array&amp;lt;Product&gt;}\n         */\n        if (data.products) {\n            this.products &#x3D; data.products.map(product &#x3D;&gt; new Product(this.client, product));\n        }\n        /**\n         * Order Subtotal\n         * @type {string}\n         */\n        this.subtotal &#x3D; data.subtotal;\n        /**\n         * Order Total\n         * @type {string}\n         */\n        this.total &#x3D; data.total;\n        /**\n         * Order Currency\n         * @type {string}\n         */\n        this.currency &#x3D; data.currency;\n        /**\n         * Order Created At\n         * @type {number}\n         */\n        this.createdAt &#x3D; data.createdAt;\n\n        return super._patch(data);\n    }\n\n\n}\n\nmodule.exports &#x3D; Order;</code></pre>\n          </article>\n        </div>\n      </div>\n      <nav id=\"jsdoc-toc-nav\" role=\"navigation\"></nav>\n    </div>\n  </div>\n  <footer id=\"jsdoc-footer\" class=\"jsdoc-footer\">\n    <div id=\"jsdoc-footer-container\">\n      <p>\n        Generated by <a href=\"https://github.com/jsdoc3/jsdoc\">JSDoc</a> 3.6.11 on January 30, 2026.\n      </p>\n    </div>\n  </footer>\n  <script src=\"scripts/jquery.min.js\"></script>\n  <script src=\"scripts/tree.jquery.js\"></script>\n  <script src=\"scripts/prettify.js\"></script>\n  <script src=\"scripts/jsdoc-toc.js\"></script>\n  <script src=\"scripts/linenumber.js\"></script>\n  <script src=\"scripts/scrollanchor.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "docs/structures_Payment.js.html",
    "content": "<!doctype html>\n<html>\n\n<head>\n  <meta name=\"generator\" content=\"JSDoc 3.6.11\">\n  <meta charset=\"utf-8\">\n  <title>whatsapp-web.js 1.34.6 &raquo; Source: structures/Payment.js</title>\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Karla:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Noto+Serif:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Inconsolata:500\" type=\"text/css\">\n  <link href=\"css/baseline.css\" rel=\"stylesheet\">\n</head>\n\n<body onload=\"prettyPrint()\">\n  <nav id=\"jsdoc-navbar\" role=\"navigation\" class=\"jsdoc-navbar\">\n    <div id=\"jsdoc-navbar-container\">\n      <div id=\"jsdoc-navbar-content\">\n        <a href=\"index.html\" class=\"jsdoc-navbar-package-name\">whatsapp-web.<wbr>js 1.<wbr>34.<wbr>6</a>\n      </div>\n    </div>\n  </nav>\n  <div id=\"jsdoc-body-container\">\n    <div id=\"jsdoc-content\">\n      <div id=\"jsdoc-content-container\">\n        <div id=\"jsdoc-banner\" role=\"banner\">\n        </div>\n        <div id=\"jsdoc-main\" role=\"main\">\n          <header class=\"page-header\">\n            <h1>Source: structures/Payment.js</h1>\n          </header>\n          <article>\n            <pre class=\"prettyprint linenums\"><code>const Base &#x3D; require(&#x27;./Base&#x27;);\n\nclass Payment extends Base {\n    constructor(client, data) {\n        super(client);\n\n        if (data) this._patch(data);\n    }\n\n    _patch(data) {\n        /**\n         * The payment Id\n         * @type {object}\n         */\n        this.id &#x3D; data.id;\n\n        /**\n         * The payment currency\n         * @type {string}\n         */\n        this.paymentCurrency &#x3D; data.paymentCurrency;\n\n        /**\n         * The payment ammount ( R$ 1.00 &#x3D; 1000 )\n         * @type {number}\n         */\n        this.paymentAmount1000 &#x3D; data.paymentAmount1000;\n\n        /**\n         * The payment receiver\n         * @type {object}\n         */\n        this.paymentMessageReceiverJid &#x3D; data.paymentMessageReceiverJid;\n\n        /**\n         * The payment transaction timestamp\n         * @type {number}\n         */\n        this.paymentTransactionTimestamp &#x3D; data.paymentTransactionTimestamp;\n\n        /**\n         * The paymentStatus\n         *\n         * Possible Status\n         * 0:UNKNOWN_STATUS\n         * 1:PROCESSING\n         * 2:SENT\n         * 3:NEED_TO_ACCEPT\n         * 4:COMPLETE\n         * 5:COULD_NOT_COMPLETE\n         * 6:REFUNDED\n         * 7:EXPIRED\n         * 8:REJECTED\n         * 9:CANCELLED\n         * 10:WAITING_FOR_PAYER\n         * 11:WAITING\n         * \n         * @type {number}\n         */\n        this.paymentStatus &#x3D; data.paymentStatus;\n\n        /**\n         * Integer that represents the payment Text\n         * @type {number}\n         */\n        this.paymentTxnStatus &#x3D; data.paymentTxnStatus;\n\n        /**\n         * The note sent with the payment\n         * @type {string}\n         */\n        this.paymentNote &#x3D; !data.paymentNoteMsg ? undefined : data.paymentNoteMsg.body ?  data.paymentNoteMsg.body : undefined ;\n\n        return super._patch(data);\n    }\n\n}\n\nmodule.exports &#x3D; Payment;\n</code></pre>\n          </article>\n        </div>\n      </div>\n      <nav id=\"jsdoc-toc-nav\" role=\"navigation\"></nav>\n    </div>\n  </div>\n  <footer id=\"jsdoc-footer\" class=\"jsdoc-footer\">\n    <div id=\"jsdoc-footer-container\">\n      <p>\n        Generated by <a href=\"https://github.com/jsdoc3/jsdoc\">JSDoc</a> 3.6.11 on January 30, 2026.\n      </p>\n    </div>\n  </footer>\n  <script src=\"scripts/jquery.min.js\"></script>\n  <script src=\"scripts/tree.jquery.js\"></script>\n  <script src=\"scripts/prettify.js\"></script>\n  <script src=\"scripts/jsdoc-toc.js\"></script>\n  <script src=\"scripts/linenumber.js\"></script>\n  <script src=\"scripts/scrollanchor.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "docs/structures_Poll.js.html",
    "content": "<!doctype html>\n<html>\n\n<head>\n  <meta name=\"generator\" content=\"JSDoc 3.6.11\">\n  <meta charset=\"utf-8\">\n  <title>whatsapp-web.js 1.34.6 &raquo; Source: structures/Poll.js</title>\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Karla:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Noto+Serif:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Inconsolata:500\" type=\"text/css\">\n  <link href=\"css/baseline.css\" rel=\"stylesheet\">\n</head>\n\n<body onload=\"prettyPrint()\">\n  <nav id=\"jsdoc-navbar\" role=\"navigation\" class=\"jsdoc-navbar\">\n    <div id=\"jsdoc-navbar-container\">\n      <div id=\"jsdoc-navbar-content\">\n        <a href=\"index.html\" class=\"jsdoc-navbar-package-name\">whatsapp-web.<wbr>js 1.<wbr>34.<wbr>6</a>\n      </div>\n    </div>\n  </nav>\n  <div id=\"jsdoc-body-container\">\n    <div id=\"jsdoc-content\">\n      <div id=\"jsdoc-content-container\">\n        <div id=\"jsdoc-banner\" role=\"banner\">\n        </div>\n        <div id=\"jsdoc-main\" role=\"main\">\n          <header class=\"page-header\">\n            <h1>Source: structures/Poll.js</h1>\n          </header>\n          <article>\n            <pre class=\"prettyprint linenums\"><code>&#x27;use strict&#x27;;\n\n/**\n * Poll send options\n * @typedef {Object} PollSendOptions\n * @property {boolean} [allowMultipleAnswers&#x3D;false] If false it is a single choice poll, otherwise it is a multiple choice poll (false by default)\n * @property {?Array&amp;lt;number&gt;} messageSecret The custom message secret, can be used as a poll ID. NOTE: it has to be a unique vector with a length of 32\n */\n\n/** Represents a Poll on WhatsApp */\nclass Poll {\n    /**\n     * @param {string} pollName\n     * @param {Array&amp;lt;string&gt;} pollOptions\n     * @param {PollSendOptions} options\n     */\n    constructor(pollName, pollOptions, options &#x3D; {}) {\n        /**\n         * The name of the poll\n         * @type {string}\n         */\n        this.pollName &#x3D; pollName.trim();\n\n        /**\n         * The array of poll options\n         * @type {Array.&amp;lt;{name: string, localId: number}&gt;}\n         */\n        this.pollOptions &#x3D; pollOptions.map((option, index) &#x3D;&gt; ({\n            name: option.trim(),\n            localId: index\n        }));\n\n        /**\n         * The send options for the poll\n         * @type {PollSendOptions}\n         */\n        this.options &#x3D; {\n            allowMultipleAnswers: options.allowMultipleAnswers &#x3D;&#x3D;&#x3D; true,\n            messageSecret: options.messageSecret\n        };\n    }\n}\n\nmodule.exports &#x3D; Poll;\n</code></pre>\n          </article>\n        </div>\n      </div>\n      <nav id=\"jsdoc-toc-nav\" role=\"navigation\"></nav>\n    </div>\n  </div>\n  <footer id=\"jsdoc-footer\" class=\"jsdoc-footer\">\n    <div id=\"jsdoc-footer-container\">\n      <p>\n        Generated by <a href=\"https://github.com/jsdoc3/jsdoc\">JSDoc</a> 3.6.11 on January 30, 2026.\n      </p>\n    </div>\n  </footer>\n  <script src=\"scripts/jquery.min.js\"></script>\n  <script src=\"scripts/tree.jquery.js\"></script>\n  <script src=\"scripts/prettify.js\"></script>\n  <script src=\"scripts/jsdoc-toc.js\"></script>\n  <script src=\"scripts/linenumber.js\"></script>\n  <script src=\"scripts/scrollanchor.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "docs/structures_PollVote.js.html",
    "content": "<!doctype html>\n<html>\n\n<head>\n  <meta name=\"generator\" content=\"JSDoc 3.6.11\">\n  <meta charset=\"utf-8\">\n  <title>whatsapp-web.js 1.34.6 &raquo; Source: structures/PollVote.js</title>\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Karla:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Noto+Serif:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Inconsolata:500\" type=\"text/css\">\n  <link href=\"css/baseline.css\" rel=\"stylesheet\">\n</head>\n\n<body onload=\"prettyPrint()\">\n  <nav id=\"jsdoc-navbar\" role=\"navigation\" class=\"jsdoc-navbar\">\n    <div id=\"jsdoc-navbar-container\">\n      <div id=\"jsdoc-navbar-content\">\n        <a href=\"index.html\" class=\"jsdoc-navbar-package-name\">whatsapp-web.<wbr>js 1.<wbr>34.<wbr>6</a>\n      </div>\n    </div>\n  </nav>\n  <div id=\"jsdoc-body-container\">\n    <div id=\"jsdoc-content\">\n      <div id=\"jsdoc-content-container\">\n        <div id=\"jsdoc-banner\" role=\"banner\">\n        </div>\n        <div id=\"jsdoc-main\" role=\"main\">\n          <header class=\"page-header\">\n            <h1>Source: structures/PollVote.js</h1>\n          </header>\n          <article>\n            <pre class=\"prettyprint linenums\"><code>&#x27;use strict&#x27;;\n\nconst Message &#x3D; require(&#x27;./Message&#x27;);\nconst Base &#x3D; require(&#x27;./Base&#x27;);\n\n/**\n * Selected poll option structure\n * @typedef {Object} SelectedPollOption\n * @property {number} id The local selected or deselected option ID\n * @property {string} name The option name\n */\n\n/**\n * Represents a Poll Vote on WhatsApp\n * @extends {Base}\n */\nclass PollVote extends Base {\n    constructor(client, data) {\n        super(client);\n\n        if (data) this._patch(data);\n    }\n\n    _patch(data) {\n        /**\n         * The person who voted\n         * @type {string}\n         */\n        this.voter &#x3D; data.sender;\n\n        /**\n         * The selected poll option(s)\n         * If it&#x27;s an empty array, the user hasn&#x27;t selected any options on the poll,\n         * may occur when they deselected all poll options\n         * @type {SelectedPollOption[]}\n         */\n        if (data.selectedOptionLocalIds.length &gt; 0) {\n            if(data.parentMessage) { // temporary failsafe\n                this.selectedOptions &#x3D; data.selectedOptionLocalIds.map((e) &#x3D;&gt; ({\n                    name: data.parentMessage.pollOptions.find((x) &#x3D;&gt; x.localId &#x3D;&#x3D;&#x3D; e).name,\n                    localId: e\n                }));\n            } else {\n                this.selectedOptions &#x3D; data.selectedOptionLocalIds.map((e) &#x3D;&gt; ({\n                    name: undefined,\n                    localId: e\n                }));\n            }\n        } else {\n            this.selectedOptions &#x3D; [];\n        }\n        \n        /**\n         * Timestamp the option was selected or deselected at\n         * @type {number}\n         */\n        this.interractedAtTs &#x3D; data.senderTimestampMs;\n\n        /**\n         * The poll creation message associated with the poll vote\n         * @type {Message}\n         */\n        this.parentMessage &#x3D; new Message(this.client, data.parentMessage);\n\n        /**\n         * The poll creation message id\n         * @type {Object}\n         */\n        this.parentMsgKey &#x3D;  data.parentMsgKey;\n\n        return super._patch(data);\n    }\n}\n\nmodule.exports &#x3D; PollVote;\n</code></pre>\n          </article>\n        </div>\n      </div>\n      <nav id=\"jsdoc-toc-nav\" role=\"navigation\"></nav>\n    </div>\n  </div>\n  <footer id=\"jsdoc-footer\" class=\"jsdoc-footer\">\n    <div id=\"jsdoc-footer-container\">\n      <p>\n        Generated by <a href=\"https://github.com/jsdoc3/jsdoc\">JSDoc</a> 3.6.11 on January 30, 2026.\n      </p>\n    </div>\n  </footer>\n  <script src=\"scripts/jquery.min.js\"></script>\n  <script src=\"scripts/tree.jquery.js\"></script>\n  <script src=\"scripts/prettify.js\"></script>\n  <script src=\"scripts/jsdoc-toc.js\"></script>\n  <script src=\"scripts/linenumber.js\"></script>\n  <script src=\"scripts/scrollanchor.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "docs/structures_PrivateChat.js.html",
    "content": "<!doctype html>\n<html>\n\n<head>\n  <meta name=\"generator\" content=\"JSDoc 3.6.11\">\n  <meta charset=\"utf-8\">\n  <title>whatsapp-web.js 1.34.6 &raquo; Source: structures/PrivateChat.js</title>\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Karla:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Noto+Serif:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Inconsolata:500\" type=\"text/css\">\n  <link href=\"css/baseline.css\" rel=\"stylesheet\">\n</head>\n\n<body onload=\"prettyPrint()\">\n  <nav id=\"jsdoc-navbar\" role=\"navigation\" class=\"jsdoc-navbar\">\n    <div id=\"jsdoc-navbar-container\">\n      <div id=\"jsdoc-navbar-content\">\n        <a href=\"index.html\" class=\"jsdoc-navbar-package-name\">whatsapp-web.<wbr>js 1.<wbr>34.<wbr>6</a>\n      </div>\n    </div>\n  </nav>\n  <div id=\"jsdoc-body-container\">\n    <div id=\"jsdoc-content\">\n      <div id=\"jsdoc-content-container\">\n        <div id=\"jsdoc-banner\" role=\"banner\">\n        </div>\n        <div id=\"jsdoc-main\" role=\"main\">\n          <header class=\"page-header\">\n            <h1>Source: structures/PrivateChat.js</h1>\n          </header>\n          <article>\n            <pre class=\"prettyprint linenums\"><code>&#x27;use strict&#x27;;\n\nconst Chat &#x3D; require(&#x27;./Chat&#x27;);\n\n/**\n * Represents a Private Chat on WhatsApp\n * @extends {Chat}\n */\nclass PrivateChat extends Chat {\n\n}\n\nmodule.exports &#x3D; PrivateChat;</code></pre>\n          </article>\n        </div>\n      </div>\n      <nav id=\"jsdoc-toc-nav\" role=\"navigation\"></nav>\n    </div>\n  </div>\n  <footer id=\"jsdoc-footer\" class=\"jsdoc-footer\">\n    <div id=\"jsdoc-footer-container\">\n      <p>\n        Generated by <a href=\"https://github.com/jsdoc3/jsdoc\">JSDoc</a> 3.6.11 on January 30, 2026.\n      </p>\n    </div>\n  </footer>\n  <script src=\"scripts/jquery.min.js\"></script>\n  <script src=\"scripts/tree.jquery.js\"></script>\n  <script src=\"scripts/prettify.js\"></script>\n  <script src=\"scripts/jsdoc-toc.js\"></script>\n  <script src=\"scripts/linenumber.js\"></script>\n  <script src=\"scripts/scrollanchor.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "docs/structures_PrivateContact.js.html",
    "content": "<!doctype html>\n<html>\n\n<head>\n  <meta name=\"generator\" content=\"JSDoc 3.6.11\">\n  <meta charset=\"utf-8\">\n  <title>whatsapp-web.js 1.34.6 &raquo; Source: structures/PrivateContact.js</title>\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Karla:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Noto+Serif:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Inconsolata:500\" type=\"text/css\">\n  <link href=\"css/baseline.css\" rel=\"stylesheet\">\n</head>\n\n<body onload=\"prettyPrint()\">\n  <nav id=\"jsdoc-navbar\" role=\"navigation\" class=\"jsdoc-navbar\">\n    <div id=\"jsdoc-navbar-container\">\n      <div id=\"jsdoc-navbar-content\">\n        <a href=\"index.html\" class=\"jsdoc-navbar-package-name\">whatsapp-web.<wbr>js 1.<wbr>34.<wbr>6</a>\n      </div>\n    </div>\n  </nav>\n  <div id=\"jsdoc-body-container\">\n    <div id=\"jsdoc-content\">\n      <div id=\"jsdoc-content-container\">\n        <div id=\"jsdoc-banner\" role=\"banner\">\n        </div>\n        <div id=\"jsdoc-main\" role=\"main\">\n          <header class=\"page-header\">\n            <h1>Source: structures/PrivateContact.js</h1>\n          </header>\n          <article>\n            <pre class=\"prettyprint linenums\"><code>&#x27;use strict&#x27;;\n\nconst Contact &#x3D; require(&#x27;./Contact&#x27;);\n\n/**\n * Represents a Private Contact on WhatsApp\n * @extends {Contact}\n */\nclass PrivateContact extends Contact {\n\n}\n\nmodule.exports &#x3D; PrivateContact;</code></pre>\n          </article>\n        </div>\n      </div>\n      <nav id=\"jsdoc-toc-nav\" role=\"navigation\"></nav>\n    </div>\n  </div>\n  <footer id=\"jsdoc-footer\" class=\"jsdoc-footer\">\n    <div id=\"jsdoc-footer-container\">\n      <p>\n        Generated by <a href=\"https://github.com/jsdoc3/jsdoc\">JSDoc</a> 3.6.11 on January 30, 2026.\n      </p>\n    </div>\n  </footer>\n  <script src=\"scripts/jquery.min.js\"></script>\n  <script src=\"scripts/tree.jquery.js\"></script>\n  <script src=\"scripts/prettify.js\"></script>\n  <script src=\"scripts/jsdoc-toc.js\"></script>\n  <script src=\"scripts/linenumber.js\"></script>\n  <script src=\"scripts/scrollanchor.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "docs/structures_Product.js.html",
    "content": "<!doctype html>\n<html>\n\n<head>\n  <meta name=\"generator\" content=\"JSDoc 3.6.11\">\n  <meta charset=\"utf-8\">\n  <title>whatsapp-web.js 1.34.6 &raquo; Source: structures/Product.js</title>\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Karla:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Noto+Serif:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Inconsolata:500\" type=\"text/css\">\n  <link href=\"css/baseline.css\" rel=\"stylesheet\">\n</head>\n\n<body onload=\"prettyPrint()\">\n  <nav id=\"jsdoc-navbar\" role=\"navigation\" class=\"jsdoc-navbar\">\n    <div id=\"jsdoc-navbar-container\">\n      <div id=\"jsdoc-navbar-content\">\n        <a href=\"index.html\" class=\"jsdoc-navbar-package-name\">whatsapp-web.<wbr>js 1.<wbr>34.<wbr>6</a>\n      </div>\n    </div>\n  </nav>\n  <div id=\"jsdoc-body-container\">\n    <div id=\"jsdoc-content\">\n      <div id=\"jsdoc-content-container\">\n        <div id=\"jsdoc-banner\" role=\"banner\">\n        </div>\n        <div id=\"jsdoc-main\" role=\"main\">\n          <header class=\"page-header\">\n            <h1>Source: structures/Product.js</h1>\n          </header>\n          <article>\n            <pre class=\"prettyprint linenums\"><code>&#x27;use strict&#x27;;\n\nconst Base &#x3D; require(&#x27;./Base&#x27;);\nconst ProductMetadata &#x3D; require(&#x27;./ProductMetadata&#x27;);\n\n/**\n * Represents a Product on WhatsAppBusiness\n * @extends {Base}\n */\nclass Product extends Base {\n    constructor(client, data) {\n        super(client);\n\n        if (data) this._patch(data);\n    }\n\n    _patch(data) {\n        /**\n         * Product ID\n         * @type {string}\n         */\n        this.id &#x3D; data.id;\n        /**\n         * Price\n         * @type {string}\n         */\n        this.price &#x3D; data.price ? data.price : &#x27;&#x27;;\n        /**\n         * Product Thumbnail\n         * @type {string}\n         */\n        this.thumbnailUrl &#x3D; data.thumbnailUrl;\n        /**\n         * Currency\n         * @type {string}\n         */\n        this.currency &#x3D; data.currency;\n        /**\n         * Product Name\n         * @type {string}\n         */\n        this.name &#x3D; data.name;\n        /**\n         * Product Quantity\n         * @type {number}\n         */\n        this.quantity &#x3D; data.quantity;\n        /** Product metadata */\n        this.data &#x3D; null;\n        return super._patch(data);\n    }\n\n    async getData() {\n        if (this.data &#x3D;&#x3D;&#x3D; null) {\n            let result &#x3D; await this.client.pupPage.evaluate((productId) &#x3D;&gt; {\n                return window.WWebJS.getProductMetadata(productId);\n            }, this.id);\n            if (!result) {\n                this.data &#x3D; undefined;\n            } else {\n                this.data &#x3D; new ProductMetadata(this.client, result);\n            }\n        }\n        return this.data;\n    }\n}\n\nmodule.exports &#x3D; Product;</code></pre>\n          </article>\n        </div>\n      </div>\n      <nav id=\"jsdoc-toc-nav\" role=\"navigation\"></nav>\n    </div>\n  </div>\n  <footer id=\"jsdoc-footer\" class=\"jsdoc-footer\">\n    <div id=\"jsdoc-footer-container\">\n      <p>\n        Generated by <a href=\"https://github.com/jsdoc3/jsdoc\">JSDoc</a> 3.6.11 on January 30, 2026.\n      </p>\n    </div>\n  </footer>\n  <script src=\"scripts/jquery.min.js\"></script>\n  <script src=\"scripts/tree.jquery.js\"></script>\n  <script src=\"scripts/prettify.js\"></script>\n  <script src=\"scripts/jsdoc-toc.js\"></script>\n  <script src=\"scripts/linenumber.js\"></script>\n  <script src=\"scripts/scrollanchor.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "docs/structures_ProductMetadata.js.html",
    "content": "<!doctype html>\n<html>\n\n<head>\n  <meta name=\"generator\" content=\"JSDoc 3.6.11\">\n  <meta charset=\"utf-8\">\n  <title>whatsapp-web.js 1.34.6 &raquo; Source: structures/ProductMetadata.js</title>\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Karla:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Noto+Serif:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Inconsolata:500\" type=\"text/css\">\n  <link href=\"css/baseline.css\" rel=\"stylesheet\">\n</head>\n\n<body onload=\"prettyPrint()\">\n  <nav id=\"jsdoc-navbar\" role=\"navigation\" class=\"jsdoc-navbar\">\n    <div id=\"jsdoc-navbar-container\">\n      <div id=\"jsdoc-navbar-content\">\n        <a href=\"index.html\" class=\"jsdoc-navbar-package-name\">whatsapp-web.<wbr>js 1.<wbr>34.<wbr>6</a>\n      </div>\n    </div>\n  </nav>\n  <div id=\"jsdoc-body-container\">\n    <div id=\"jsdoc-content\">\n      <div id=\"jsdoc-content-container\">\n        <div id=\"jsdoc-banner\" role=\"banner\">\n        </div>\n        <div id=\"jsdoc-main\" role=\"main\">\n          <header class=\"page-header\">\n            <h1>Source: structures/ProductMetadata.js</h1>\n          </header>\n          <article>\n            <pre class=\"prettyprint linenums\"><code>const Base &#x3D; require(&#x27;./Base&#x27;);\n\nclass ProductMetadata extends Base {\n    constructor(client, data) {\n        super(client);\n\n        if (data) this._patch(data);\n    }\n\n    _patch(data) {\n        /** Product ID */\n        this.id &#x3D; data.id;\n        /** Retailer ID */\n        this.retailer_id &#x3D; data.retailer_id;\n        /** Product Name  */\n        this.name &#x3D; data.name;\n        /** Product Description */\n        this.description &#x3D; data.description;\n\n        return super._patch(data);\n    }\n\n}\n\nmodule.exports &#x3D; ProductMetadata;</code></pre>\n          </article>\n        </div>\n      </div>\n      <nav id=\"jsdoc-toc-nav\" role=\"navigation\"></nav>\n    </div>\n  </div>\n  <footer id=\"jsdoc-footer\" class=\"jsdoc-footer\">\n    <div id=\"jsdoc-footer-container\">\n      <p>\n        Generated by <a href=\"https://github.com/jsdoc3/jsdoc\">JSDoc</a> 3.6.11 on January 30, 2026.\n      </p>\n    </div>\n  </footer>\n  <script src=\"scripts/jquery.min.js\"></script>\n  <script src=\"scripts/tree.jquery.js\"></script>\n  <script src=\"scripts/prettify.js\"></script>\n  <script src=\"scripts/jsdoc-toc.js\"></script>\n  <script src=\"scripts/linenumber.js\"></script>\n  <script src=\"scripts/scrollanchor.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "docs/structures_Reaction.js.html",
    "content": "<!doctype html>\n<html>\n\n<head>\n  <meta name=\"generator\" content=\"JSDoc 3.6.11\">\n  <meta charset=\"utf-8\">\n  <title>whatsapp-web.js 1.34.6 &raquo; Source: structures/Reaction.js</title>\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Karla:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Noto+Serif:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Inconsolata:500\" type=\"text/css\">\n  <link href=\"css/baseline.css\" rel=\"stylesheet\">\n</head>\n\n<body onload=\"prettyPrint()\">\n  <nav id=\"jsdoc-navbar\" role=\"navigation\" class=\"jsdoc-navbar\">\n    <div id=\"jsdoc-navbar-container\">\n      <div id=\"jsdoc-navbar-content\">\n        <a href=\"index.html\" class=\"jsdoc-navbar-package-name\">whatsapp-web.<wbr>js 1.<wbr>34.<wbr>6</a>\n      </div>\n    </div>\n  </nav>\n  <div id=\"jsdoc-body-container\">\n    <div id=\"jsdoc-content\">\n      <div id=\"jsdoc-content-container\">\n        <div id=\"jsdoc-banner\" role=\"banner\">\n        </div>\n        <div id=\"jsdoc-main\" role=\"main\">\n          <header class=\"page-header\">\n            <h1>Source: structures/Reaction.js</h1>\n          </header>\n          <article>\n            <pre class=\"prettyprint linenums\"><code>&#x27;use strict&#x27;;\n\nconst Base &#x3D; require(&#x27;./Base&#x27;);\n\n/**\n * Represents a Reaction on WhatsApp\n * @extends {Base}\n */\nclass Reaction extends Base {\n    constructor(client, data) {\n        super(client);\n\n        if (data) this._patch(data);\n    }\n\n    _patch(data) {\n        /**\n         * Reaction ID\n         * @type {object}\n         */\n        this.id &#x3D; data.msgKey;\n        /**\n         * Orphan\n         * @type {number}\n         */\n        this.orphan &#x3D; data.orphan;\n        /**\n         * Orphan reason\n         * @type {?string}\n         */\n        this.orphanReason &#x3D; data.orphanReason;\n        /**\n         * Unix timestamp for when the reaction was created\n         * @type {number}\n         */\n        this.timestamp &#x3D; data.timestamp;\n        /**\n         * Reaction\n         * @type {string}\n         */\n        this.reaction &#x3D; data.reactionText;\n        /**\n         * Read\n         * @type {boolean}\n         */\n        this.read &#x3D; data.read;\n        /**\n         * Message ID\n         * @type {object}\n         */\n        this.msgId &#x3D; data.parentMsgKey;\n        /**\n         * Sender ID\n         * @type {string}\n         */\n        this.senderId &#x3D; data.senderUserJid;\n        /**\n         * ACK\n         * @type {?number}\n         */\n        this.ack &#x3D; data.ack;\n        \n        \n        return super._patch(data);\n    }\n    \n}\n\nmodule.exports &#x3D; Reaction;</code></pre>\n          </article>\n        </div>\n      </div>\n      <nav id=\"jsdoc-toc-nav\" role=\"navigation\"></nav>\n    </div>\n  </div>\n  <footer id=\"jsdoc-footer\" class=\"jsdoc-footer\">\n    <div id=\"jsdoc-footer-container\">\n      <p>\n        Generated by <a href=\"https://github.com/jsdoc3/jsdoc\">JSDoc</a> 3.6.11 on January 30, 2026.\n      </p>\n    </div>\n  </footer>\n  <script src=\"scripts/jquery.min.js\"></script>\n  <script src=\"scripts/tree.jquery.js\"></script>\n  <script src=\"scripts/prettify.js\"></script>\n  <script src=\"scripts/jsdoc-toc.js\"></script>\n  <script src=\"scripts/linenumber.js\"></script>\n  <script src=\"scripts/scrollanchor.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "docs/structures_ScheduledEvent.js.html",
    "content": "<!doctype html>\n<html>\n\n<head>\n  <meta name=\"generator\" content=\"JSDoc 3.6.11\">\n  <meta charset=\"utf-8\">\n  <title>whatsapp-web.js 1.34.6 &raquo; Source: structures/ScheduledEvent.js</title>\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Karla:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Noto+Serif:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Inconsolata:500\" type=\"text/css\">\n  <link href=\"css/baseline.css\" rel=\"stylesheet\">\n</head>\n\n<body onload=\"prettyPrint()\">\n  <nav id=\"jsdoc-navbar\" role=\"navigation\" class=\"jsdoc-navbar\">\n    <div id=\"jsdoc-navbar-container\">\n      <div id=\"jsdoc-navbar-content\">\n        <a href=\"index.html\" class=\"jsdoc-navbar-package-name\">whatsapp-web.<wbr>js 1.<wbr>34.<wbr>6</a>\n      </div>\n    </div>\n  </nav>\n  <div id=\"jsdoc-body-container\">\n    <div id=\"jsdoc-content\">\n      <div id=\"jsdoc-content-container\">\n        <div id=\"jsdoc-banner\" role=\"banner\">\n        </div>\n        <div id=\"jsdoc-main\" role=\"main\">\n          <header class=\"page-header\">\n            <h1>Source: structures/ScheduledEvent.js</h1>\n          </header>\n          <article>\n            <pre class=\"prettyprint linenums\"><code>&#x27;use strict&#x27;;\n\n/**\n * ScheduledEvent send options\n * @typedef {Object} ScheduledEventSendOptions\n * @property {?string} description The scheduled event description\n * @property {?Date} endTime The end time of the event\n * @property {?string} location The location of the event\n * @property {?string} callType The type of a WhatsApp call link to generate, valid values are: &#x60;video&#x60; | &#x60;voice&#x60; | &#x60;none&#x60;\n * @property {boolean} [isEventCanceled &#x3D; false] Indicates if a scheduled event should be sent as an already canceled\n * @property {?Array&amp;lt;number&gt;} messageSecret The custom message secret, can be used as an event ID. NOTE: it has to be a unique vector with a length of 32\n */\n\n/** Represents a ScheduledEvent on WhatsApp */\nclass ScheduledEvent {\n    /**\n     * @param {string} name\n     * @param {Date} startTime\n     * @param {ScheduledEventSendOptions} options\n     */\n    constructor(name, startTime, options &#x3D; {}) {\n        /**\n         * The name of the event\n         * @type {string}\n         */\n        this.name &#x3D; this._validateInputs(&#x27;name&#x27;, name).trim();\n\n        /**\n         * The start time of the event\n         * @type {number}\n         */\n        this.startTimeTs &#x3D; Math.floor(startTime.getTime() / 1000);\n\n        /**\n         * The send options for the event\n         * @type {Object}\n         */\n        this.eventSendOptions &#x3D; {\n            description: options.description?.trim(),\n            endTimeTs: options.endTime ? Math.floor(options.endTime.getTime() / 1000) : null,\n            location: options.location?.trim(),\n            callType: this._validateInputs(&#x27;callType&#x27;, options.callType),\n            isEventCanceled: options.isEventCanceled ?? false,\n            messageSecret: options.messageSecret\n        };\n    }\n\n    /**\n     * Inner function to validate input values\n     * @param {string} propName The property name to validate the value of\n     * @param {string | number} propValue The property value to validate\n     * @returns {string | number} The property value if a validation succeeded\n     */\n    _validateInputs(propName, propValue) {\n        if (propName &#x3D;&#x3D;&#x3D; &#x27;name&#x27; &amp;amp;&amp;amp; !propValue) {\n            throw new class CreateScheduledEventError extends Error {\n                constructor(m) { super(m); }\n            }(&#x60;Empty &#x27;${propName}&#x27; parameter value is provided.&#x60;);\n        }\n\n        if (propName &#x3D;&#x3D;&#x3D; &#x27;callType&#x27; &amp;amp;&amp;amp; propValue &amp;amp;&amp;amp; ![&#x27;video&#x27;, &#x27;voice&#x27;, &#x27;none&#x27;].includes(propValue)) {\n            throw new class CreateScheduledEventError extends Error {\n                constructor(m) { super(m); }\n            }(&#x60;Invalid &#x27;${propName}&#x27; parameter value is provided. Valid values are: &#x27;voice&#x27; | &#x27;video&#x27; | &#x27;none&#x27;.&#x60;);\n        }\n        \n        return propValue;\n    }\n}\n\nmodule.exports &#x3D; ScheduledEvent;\n</code></pre>\n          </article>\n        </div>\n      </div>\n      <nav id=\"jsdoc-toc-nav\" role=\"navigation\"></nav>\n    </div>\n  </div>\n  <footer id=\"jsdoc-footer\" class=\"jsdoc-footer\">\n    <div id=\"jsdoc-footer-container\">\n      <p>\n        Generated by <a href=\"https://github.com/jsdoc3/jsdoc\">JSDoc</a> 3.6.11 on January 30, 2026.\n      </p>\n    </div>\n  </footer>\n  <script src=\"scripts/jquery.min.js\"></script>\n  <script src=\"scripts/tree.jquery.js\"></script>\n  <script src=\"scripts/prettify.js\"></script>\n  <script src=\"scripts/jsdoc-toc.js\"></script>\n  <script src=\"scripts/linenumber.js\"></script>\n  <script src=\"scripts/scrollanchor.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "docs/util_Constants.js.html",
    "content": "<!doctype html>\n<html>\n\n<head>\n  <meta name=\"generator\" content=\"JSDoc 3.6.11\">\n  <meta charset=\"utf-8\">\n  <title>whatsapp-web.js 1.34.6 &raquo; Source: util/Constants.js</title>\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Karla:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Noto+Serif:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Inconsolata:500\" type=\"text/css\">\n  <link href=\"css/baseline.css\" rel=\"stylesheet\">\n</head>\n\n<body onload=\"prettyPrint()\">\n  <nav id=\"jsdoc-navbar\" role=\"navigation\" class=\"jsdoc-navbar\">\n    <div id=\"jsdoc-navbar-container\">\n      <div id=\"jsdoc-navbar-content\">\n        <a href=\"index.html\" class=\"jsdoc-navbar-package-name\">whatsapp-web.<wbr>js 1.<wbr>34.<wbr>6</a>\n      </div>\n    </div>\n  </nav>\n  <div id=\"jsdoc-body-container\">\n    <div id=\"jsdoc-content\">\n      <div id=\"jsdoc-content-container\">\n        <div id=\"jsdoc-banner\" role=\"banner\">\n        </div>\n        <div id=\"jsdoc-main\" role=\"main\">\n          <header class=\"page-header\">\n            <h1>Source: util/Constants.js</h1>\n          </header>\n          <article>\n            <pre class=\"prettyprint linenums\"><code>&#x27;use strict&#x27;;\n\nexports.WhatsWebURL &#x3D; &#x27;https://web.whatsapp.com/&#x27;;\n\nexports.DefaultOptions &#x3D; {\n    puppeteer: {\n        headless: true,\n        defaultViewport: null\n    },\n    webVersion: &#x27;2.3000.1017054665&#x27;,\n    webVersionCache: {\n        type: &#x27;local&#x27;,\n    },\n    authTimeoutMs: 0,\n    qrMaxRetries: 0,\n    takeoverOnConflict: false,\n    takeoverTimeoutMs: 0,\n    userAgent: &#x27;Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.67 Safari/537.36&#x27;,\n    ffmpegPath: &#x27;ffmpeg&#x27;,\n    bypassCSP: false,\n    proxyAuthentication: undefined,\n    pairWithPhoneNumber: {\n        phoneNumber: &#x27;&#x27;,\n        showNotification: true,\n        intervalMs: 180000,\n    },\n};\n\n/**\n * Client status\n * @readonly\n * @enum {number}\n */\nexports.Status &#x3D; {\n    INITIALIZING: 0,\n    AUTHENTICATING: 1,\n    READY: 3\n};\n\n/**\n * Events that can be emitted by the client\n * @readonly\n * @enum {string}\n */\nexports.Events &#x3D; {\n    AUTHENTICATED: &#x27;authenticated&#x27;,\n    AUTHENTICATION_FAILURE: &#x27;auth_failure&#x27;,\n    READY: &#x27;ready&#x27;,\n    CHAT_REMOVED: &#x27;chat_removed&#x27;,\n    CHAT_ARCHIVED: &#x27;chat_archived&#x27;,\n    MESSAGE_RECEIVED: &#x27;message&#x27;,\n    MESSAGE_CIPHERTEXT: &#x27;message_ciphertext&#x27;,\n    MESSAGE_CREATE: &#x27;message_create&#x27;,\n    MESSAGE_REVOKED_EVERYONE: &#x27;message_revoke_everyone&#x27;,\n    MESSAGE_REVOKED_ME: &#x27;message_revoke_me&#x27;,\n    MESSAGE_ACK: &#x27;message_ack&#x27;,\n    MESSAGE_EDIT: &#x27;message_edit&#x27;,\n    UNREAD_COUNT: &#x27;unread_count&#x27;,\n    MESSAGE_REACTION: &#x27;message_reaction&#x27;,\n    MEDIA_UPLOADED: &#x27;media_uploaded&#x27;,\n    CONTACT_CHANGED: &#x27;contact_changed&#x27;,\n    GROUP_JOIN: &#x27;group_join&#x27;,\n    GROUP_LEAVE: &#x27;group_leave&#x27;,\n    GROUP_ADMIN_CHANGED: &#x27;group_admin_changed&#x27;,\n    GROUP_MEMBERSHIP_REQUEST: &#x27;group_membership_request&#x27;,\n    GROUP_UPDATE: &#x27;group_update&#x27;,\n    QR_RECEIVED: &#x27;qr&#x27;,\n    CODE_RECEIVED: &#x27;code&#x27;,\n    LOADING_SCREEN: &#x27;loading_screen&#x27;,\n    DISCONNECTED: &#x27;disconnected&#x27;,\n    STATE_CHANGED: &#x27;change_state&#x27;,\n    BATTERY_CHANGED: &#x27;change_battery&#x27;,\n    INCOMING_CALL: &#x27;call&#x27;,\n    REMOTE_SESSION_SAVED: &#x27;remote_session_saved&#x27;,\n    VOTE_UPDATE: &#x27;vote_update&#x27;\n};\n\n/**\n * Message types\n * @readonly\n * @enum {string}\n */\nexports.MessageTypes &#x3D; {\n    TEXT: &#x27;chat&#x27;,\n    AUDIO: &#x27;audio&#x27;,\n    VOICE: &#x27;ptt&#x27;,\n    IMAGE: &#x27;image&#x27;,\n    ALBUM: &#x27;album&#x27;,\n    VIDEO: &#x27;video&#x27;,\n    DOCUMENT: &#x27;document&#x27;,\n    STICKER: &#x27;sticker&#x27;,\n    LOCATION: &#x27;location&#x27;,\n    CONTACT_CARD: &#x27;vcard&#x27;,\n    CONTACT_CARD_MULTI: &#x27;multi_vcard&#x27;,\n    ORDER: &#x27;order&#x27;,\n    REVOKED: &#x27;revoked&#x27;,\n    PRODUCT: &#x27;product&#x27;,\n    UNKNOWN: &#x27;unknown&#x27;,\n    GROUP_INVITE: &#x27;groups_v4_invite&#x27;,\n    LIST: &#x27;list&#x27;,\n    LIST_RESPONSE: &#x27;list_response&#x27;,\n    BUTTONS_RESPONSE: &#x27;buttons_response&#x27;,\n    PAYMENT: &#x27;payment&#x27;,\n    BROADCAST_NOTIFICATION: &#x27;broadcast_notification&#x27;,\n    CALL_LOG: &#x27;call_log&#x27;,\n    CIPHERTEXT: &#x27;ciphertext&#x27;,\n    DEBUG: &#x27;debug&#x27;,\n    E2E_NOTIFICATION: &#x27;e2e_notification&#x27;,\n    GP2: &#x27;gp2&#x27;,\n    GROUP_NOTIFICATION: &#x27;group_notification&#x27;,\n    HSM: &#x27;hsm&#x27;,\n    INTERACTIVE: &#x27;interactive&#x27;,\n    NATIVE_FLOW: &#x27;native_flow&#x27;,\n    NOTIFICATION: &#x27;notification&#x27;,\n    NOTIFICATION_TEMPLATE: &#x27;notification_template&#x27;,\n    OVERSIZED: &#x27;oversized&#x27;,\n    PROTOCOL: &#x27;protocol&#x27;,\n    REACTION: &#x27;reaction&#x27;,\n    TEMPLATE_BUTTON_REPLY: &#x27;template_button_reply&#x27;,\n    POLL_CREATION: &#x27;poll_creation&#x27;,\n    SCHEDULED_EVENT_CREATION: &#x27;scheduled_event_creation&#x27;,\n};\n\n/**\n * Group notification types\n * @readonly\n * @enum {string}\n */\nexports.GroupNotificationTypes &#x3D; {\n    ADD: &#x27;add&#x27;,\n    INVITE: &#x27;invite&#x27;,\n    REMOVE: &#x27;remove&#x27;,\n    LEAVE: &#x27;leave&#x27;,\n    PROMOTE: &#x27;promote&#x27;,\n    DEMOTE: &#x27;demote&#x27;,\n    SUBJECT: &#x27;subject&#x27;,\n    DESCRIPTION: &#x27;description&#x27;,\n    PICTURE: &#x27;picture&#x27;,\n    ANNOUNCE: &#x27;announce&#x27;,\n    RESTRICT: &#x27;restrict&#x27;,\n};\n\n/**\n * Chat types\n * @readonly\n * @enum {string}\n */\nexports.ChatTypes &#x3D; {\n    SOLO: &#x27;solo&#x27;,\n    GROUP: &#x27;group&#x27;,\n    UNKNOWN: &#x27;unknown&#x27;\n};\n\n/**\n * WhatsApp state\n * @readonly\n * @enum {string}\n */\nexports.WAState &#x3D; {\n    CONFLICT: &#x27;CONFLICT&#x27;,\n    CONNECTED: &#x27;CONNECTED&#x27;,\n    DEPRECATED_VERSION: &#x27;DEPRECATED_VERSION&#x27;,\n    OPENING: &#x27;OPENING&#x27;,\n    PAIRING: &#x27;PAIRING&#x27;,\n    PROXYBLOCK: &#x27;PROXYBLOCK&#x27;,\n    SMB_TOS_BLOCK: &#x27;SMB_TOS_BLOCK&#x27;,\n    TIMEOUT: &#x27;TIMEOUT&#x27;,\n    TOS_BLOCK: &#x27;TOS_BLOCK&#x27;,\n    UNLAUNCHED: &#x27;UNLAUNCHED&#x27;,\n    UNPAIRED: &#x27;UNPAIRED&#x27;,\n    UNPAIRED_IDLE: &#x27;UNPAIRED_IDLE&#x27;\n};\n\n/**\n * Message ACK\n * @readonly\n * @enum {number}\n */\nexports.MessageAck &#x3D; {\n    ACK_ERROR: -1,\n    ACK_PENDING: 0,\n    ACK_SERVER: 1,\n    ACK_DEVICE: 2,\n    ACK_READ: 3,\n    ACK_PLAYED: 4,\n};\n</code></pre>\n          </article>\n        </div>\n      </div>\n      <nav id=\"jsdoc-toc-nav\" role=\"navigation\"></nav>\n    </div>\n  </div>\n  <footer id=\"jsdoc-footer\" class=\"jsdoc-footer\">\n    <div id=\"jsdoc-footer-container\">\n      <p>\n        Generated by <a href=\"https://github.com/jsdoc3/jsdoc\">JSDoc</a> 3.6.11 on January 30, 2026.\n      </p>\n    </div>\n  </footer>\n  <script src=\"scripts/jquery.min.js\"></script>\n  <script src=\"scripts/tree.jquery.js\"></script>\n  <script src=\"scripts/prettify.js\"></script>\n  <script src=\"scripts/jsdoc-toc.js\"></script>\n  <script src=\"scripts/linenumber.js\"></script>\n  <script src=\"scripts/scrollanchor.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "docs/util_Injected.js.html",
    "content": "<!doctype html>\n<html>\n\n<head>\n  <meta name=\"generator\" content=\"JSDoc 3.6.11\">\n  <meta charset=\"utf-8\">\n  <title>whatsapp-web.js 1.23.0 &raquo; Source: util/Injected.js</title>\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Karla:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Noto+Serif:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Inconsolata:500\" type=\"text/css\">\n  <link href=\"css/baseline.css\" rel=\"stylesheet\">\n</head>\n\n<body onload=\"prettyPrint()\">\n  <nav id=\"jsdoc-navbar\" role=\"navigation\" class=\"jsdoc-navbar\">\n    <div id=\"jsdoc-navbar-container\">\n      <div id=\"jsdoc-navbar-content\">\n        <a href=\"index.html\" class=\"jsdoc-navbar-package-name\">whatsapp-web.<wbr>js 1.<wbr>23.<wbr>0</a>\n      </div>\n    </div>\n  </nav>\n  <div id=\"jsdoc-body-container\">\n    <div id=\"jsdoc-content\">\n      <div id=\"jsdoc-content-container\">\n        <div id=\"jsdoc-banner\" role=\"banner\">\n        </div>\n        <div id=\"jsdoc-main\" role=\"main\">\n          <header class=\"page-header\">\n            <h1>Source: util/Injected.js</h1>\n          </header>\n          <article>\n            <pre class=\"prettyprint linenums\"><code>&#x27;use strict&#x27;;\n\n// Exposes the internal Store to the WhatsApp Web client\nexports.ExposeStore &#x3D; (moduleRaidStr) &#x3D;&gt; {\n    eval(&#x27;var moduleRaid &#x3D; &#x27; + moduleRaidStr);\n    // eslint-disable-next-line no-undef\n    window.mR &#x3D; moduleRaid();\n    window.Store &#x3D; Object.assign({}, window.mR.findModule(m &#x3D;&gt; m.default &amp;amp;&amp;amp; m.default.Chat)[0].default);\n    window.Store.AppState &#x3D; window.mR.findModule(&#x27;Socket&#x27;)[0].Socket;\n    window.Store.Conn &#x3D; window.mR.findModule(&#x27;Conn&#x27;)[0].Conn;\n    window.Store.BlockContact &#x3D; window.mR.findModule(&#x27;blockContact&#x27;)[0];\n    window.Store.Call &#x3D; window.mR.findModule((module) &#x3D;&gt; module.default &amp;amp;&amp;amp; module.default.Call)[0].default.Call;\n    window.Store.Cmd &#x3D; window.mR.findModule(&#x27;Cmd&#x27;)[0].Cmd;\n    window.Store.CryptoLib &#x3D; window.mR.findModule(&#x27;decryptE2EMedia&#x27;)[0];\n    window.Store.DownloadManager &#x3D; window.mR.findModule(&#x27;downloadManager&#x27;)[0].downloadManager;\n    window.Store.GroupMetadata &#x3D; window.mR.findModule(&#x27;GroupMetadata&#x27;)[0].default.GroupMetadata;\n    window.Store.GroupMetadata.queryAndUpdate &#x3D; window.mR.findModule(&#x27;queryAndUpdateGroupMetadataById&#x27;)[0].queryAndUpdateGroupMetadataById;\n    window.Store.Label &#x3D; window.mR.findModule(&#x27;LabelCollection&#x27;)[0].LabelCollection;\n    window.Store.ContactCollection &#x3D; window.mR.findModule(&#x27;ContactCollection&#x27;)[0].ContactCollection;\n    window.Store.MediaPrep &#x3D; window.mR.findModule(&#x27;prepRawMedia&#x27;)[0];\n    window.Store.MediaObject &#x3D; window.mR.findModule(&#x27;getOrCreateMediaObject&#x27;)[0];\n    window.Store.NumberInfo &#x3D; window.mR.findModule(&#x27;formattedPhoneNumber&#x27;)[0];\n    window.Store.MediaTypes &#x3D; window.mR.findModule(&#x27;msgToMediaType&#x27;)[0];\n    window.Store.MediaUpload &#x3D; window.mR.findModule(&#x27;uploadMedia&#x27;)[0];\n    window.Store.MsgKey &#x3D; window.mR.findModule((module) &#x3D;&gt; module.default &amp;amp;&amp;amp; module.default.fromString)[0].default;\n    window.Store.MessageInfo &#x3D; window.mR.findModule(&#x27;sendQueryMsgInfo&#x27;)[0];\n    window.Store.OpaqueData &#x3D; window.mR.findModule(module &#x3D;&gt; module.default &amp;amp;&amp;amp; module.default.createFromData)[0].default;\n    window.Store.QueryProduct &#x3D; window.mR.findModule(&#x27;queryProduct&#x27;)[0];\n    window.Store.QueryOrder &#x3D; window.mR.findModule(&#x27;queryOrder&#x27;)[0];\n    window.Store.SendClear &#x3D; window.mR.findModule(&#x27;sendClear&#x27;)[0];\n    window.Store.SendDelete &#x3D; window.mR.findModule(&#x27;sendDelete&#x27;)[0];\n    window.Store.SendMessage &#x3D; window.mR.findModule(&#x27;addAndSendMsgToChat&#x27;)[0];\n    window.Store.EditMessage &#x3D; window.mR.findModule(&#x27;addAndSendMessageEdit&#x27;)[0];\n    window.Store.SendSeen &#x3D; window.mR.findModule(&#x27;sendSeen&#x27;)[0];\n    window.Store.User &#x3D; window.mR.findModule(&#x27;getMaybeMeUser&#x27;)[0];\n    window.Store.ContactMethods &#x3D; window.mR.findModule(&#x27;getUserid&#x27;)[0];\n    window.Store.BusinessProfileCollection &#x3D; window.mR.findModule(&#x27;BusinessProfileCollection&#x27;)[0].BusinessProfileCollection;\n    window.Store.UploadUtils &#x3D; window.mR.findModule((module) &#x3D;&gt; (module.default &amp;amp;&amp;amp; module.default.encryptAndUpload) ? module.default : null)[0].default;\n    window.Store.UserConstructor &#x3D; window.mR.findModule((module) &#x3D;&gt; (module.default &amp;amp;&amp;amp; module.default.prototype &amp;amp;&amp;amp; module.default.prototype.isServer &amp;amp;&amp;amp; module.default.prototype.isUser) ? module.default : null)[0].default;\n    window.Store.Validators &#x3D; window.mR.findModule(&#x27;findLinks&#x27;)[0];\n    window.Store.VCard &#x3D; window.mR.findModule(&#x27;vcardFromContactModel&#x27;)[0];\n    window.Store.WidFactory &#x3D; window.mR.findModule(&#x27;createWid&#x27;)[0];\n    window.Store.ProfilePic &#x3D; window.mR.findModule(&#x27;profilePicResync&#x27;)[0];\n    window.Store.PresenceUtils &#x3D; window.mR.findModule(&#x27;sendPresenceAvailable&#x27;)[0];\n    window.Store.ChatState &#x3D; window.mR.findModule(&#x27;sendChatStateComposing&#x27;)[0];\n    window.Store.findCommonGroups &#x3D; window.mR.findModule(&#x27;findCommonGroups&#x27;)[0].findCommonGroups;\n    window.Store.StatusUtils &#x3D; window.mR.findModule(&#x27;setMyStatus&#x27;)[0];\n    window.Store.ConversationMsgs &#x3D; window.mR.findModule(&#x27;loadEarlierMsgs&#x27;)[0];\n    window.Store.sendReactionToMsg &#x3D; window.mR.findModule(&#x27;sendReactionToMsg&#x27;)[0].sendReactionToMsg;\n    window.Store.createOrUpdateReactionsModule &#x3D; window.mR.findModule(&#x27;createOrUpdateReactions&#x27;)[0];\n    window.Store.EphemeralFields &#x3D; window.mR.findModule(&#x27;getEphemeralFields&#x27;)[0];\n    window.Store.MsgActionChecks &#x3D; window.mR.findModule(&#x27;canSenderRevokeMsg&#x27;)[0];\n    window.Store.QuotedMsg &#x3D; window.mR.findModule(&#x27;getQuotedMsgObj&#x27;)[0];\n    window.Store.Socket &#x3D; window.mR.findModule(&#x27;deprecatedSendIq&#x27;)[0];\n    window.Store.SocketWap &#x3D; window.mR.findModule(&#x27;wap&#x27;)[0];\n    window.Store.SearchContext &#x3D; window.mR.findModule(&#x27;getSearchContext&#x27;)[0].getSearchContext;\n    window.Store.DrawerManager &#x3D; window.mR.findModule(&#x27;DrawerManager&#x27;)[0].DrawerManager;\n    window.Store.LidUtils &#x3D; window.mR.findModule(&#x27;getCurrentLid&#x27;)[0];\n    window.Store.WidToJid &#x3D; window.mR.findModule(&#x27;widToUserJid&#x27;)[0];\n    window.Store.JidToWid &#x3D; window.mR.findModule(&#x27;userJidToUserWid&#x27;)[0];\n    \n    /* eslint-disable no-undef, no-cond-assign */\n    window.Store.QueryExist &#x3D; ((m &#x3D; window.mR.findModule(&#x27;queryExists&#x27;)[0]) ? m.queryExists : window.mR.findModule(&#x27;queryExist&#x27;)[0].queryWidExists);\n    window.Store.ReplyUtils &#x3D; (m &#x3D; window.mR.findModule(&#x27;canReplyMsg&#x27;)).length &gt; 0 &amp;amp;&amp;amp; m[0];\n    /* eslint-enable no-undef, no-cond-assign */\n\n    window.Store.StickerTools &#x3D; {\n        ...window.mR.findModule(&#x27;toWebpSticker&#x27;)[0],\n        ...window.mR.findModule(&#x27;addWebpMetadata&#x27;)[0]\n    };\n    window.Store.GroupUtils &#x3D; {\n        ...window.mR.findModule(&#x27;createGroup&#x27;)[0],\n        ...window.mR.findModule(&#x27;setGroupDescription&#x27;)[0],\n        ...window.mR.findModule(&#x27;sendExitGroup&#x27;)[0],\n        ...window.mR.findModule(&#x27;sendSetPicture&#x27;)[0]\n    };\n    window.Store.GroupParticipants &#x3D; {\n        ...window.mR.findModule(&#x27;promoteParticipants&#x27;)[0],\n        ...window.mR.findModule(&#x27;sendAddParticipantsRPC&#x27;)[0]\n    };\n    window.Store.GroupInvite &#x3D; {\n        ...window.mR.findModule(&#x27;resetGroupInviteCode&#x27;)[0],\n        ...window.mR.findModule(&#x27;queryGroupInvite&#x27;)[0]\n    };\n    window.Store.GroupInviteV4 &#x3D; {\n        ...window.mR.findModule(&#x27;queryGroupInviteV4&#x27;)[0],\n        ...window.mR.findModule(&#x27;sendGroupInviteMessage&#x27;)[0]\n    };\n    window.Store.MembershipRequestUtils &#x3D; {\n        ...window.mR.findModule(&#x27;getMembershipApprovalRequests&#x27;)[0],\n        ...window.mR.findModule(&#x27;sendMembershipRequestsActionRPC&#x27;)[0]\n    };\n\n    if (!window.Store.Chat._find) {\n        window.Store.Chat._find &#x3D; e &#x3D;&gt; {\n            const target &#x3D; window.Store.Chat.get(e);\n            return target ? Promise.resolve(target) : Promise.resolve({\n                id: e\n            });\n        };\n    }\n    \n    // eslint-disable-next-line no-undef\n    if ((m &#x3D; window.mR.findModule(&#x27;ChatCollection&#x27;)[0]) &amp;amp;&amp;amp; m.ChatCollection &amp;amp;&amp;amp; typeof m.ChatCollection.findImpl &#x3D;&#x3D;&#x3D; &#x27;undefined&#x27; &amp;amp;&amp;amp; typeof m.ChatCollection._find !&#x3D;&#x3D; &#x27;undefined&#x27;) m.ChatCollection.findImpl &#x3D; m.ChatCollection._find;\n\n    // TODO remove these once everybody has been updated to WWebJS with legacy sessions removed\n    const _linkPreview &#x3D; window.mR.findModule(&#x27;queryLinkPreview&#x27;);\n    if (_linkPreview &amp;amp;&amp;amp; _linkPreview[0] &amp;amp;&amp;amp; _linkPreview[0].default) {\n        window.Store.Wap &#x3D; _linkPreview[0].default;\n    }\n\n    const _isMDBackend &#x3D; window.mR.findModule(&#x27;isMDBackend&#x27;);\n    if(_isMDBackend &amp;amp;&amp;amp; _isMDBackend[0] &amp;amp;&amp;amp; _isMDBackend[0].isMDBackend) {\n        window.Store.MDBackend &#x3D; _isMDBackend[0].isMDBackend();\n    } else {\n        window.Store.MDBackend &#x3D; true;\n    }\n\n    const _features &#x3D; window.mR.findModule(&#x27;FEATURE_CHANGE_EVENT&#x27;)[0];\n    if(_features) {\n        window.Store.Features &#x3D; _features.LegacyPhoneFeatures;\n    }\n\n    /**\n     * Target options object description\n     * @typedef {Object} TargetOptions\n     * @property {string|number} moduleId The name or a key of the target module to search\n     * @property {number} index The index value of the target module\n     * @property {string} property The function name to get from a module\n     */\n\n    /**\n     * Function to modify functions\n     * @param {TargetOptions} target Options specifying the target function to search for modifying\n     * @param {Function} callback Modified function\n     */\n    window.injectToFunction &#x3D; (target, callback) &#x3D;&gt; {\n        const module &#x3D; typeof target.moduleId &#x3D;&#x3D;&#x3D; &#x27;string&#x27;\n            ? window.mR.findModule(target.moduleId)\n            : window.mR.modules[target.moduleId];\n        const originalFunction &#x3D; module[target.index][target.property];\n        const modifiedFunction &#x3D; (...args) &#x3D;&gt; callback(originalFunction, ...args);\n        module[target.index][target.property] &#x3D; modifiedFunction;\n    };\n\n    window.injectToFunction({ moduleId: &#x27;mediaTypeFromProtobuf&#x27;, index: 0, property: &#x27;mediaTypeFromProtobuf&#x27; }, (func, ...args) &#x3D;&gt; { const [proto] &#x3D; args; return proto.locationMessage ? null : func(...args); });\n\n    window.injectToFunction({ moduleId: &#x27;typeAttributeFromProtobuf&#x27;, index: 0, property: &#x27;typeAttributeFromProtobuf&#x27; }, (func, ...args) &#x3D;&gt; { const [proto] &#x3D; args; return proto.locationMessage || proto.groupInviteMessage ? &#x27;text&#x27; : func(...args); });\n};\n\nexports.LoadUtils &#x3D; () &#x3D;&gt; {\n    window.WWebJS &#x3D; {};\n\n    window.WWebJS.sendSeen &#x3D; async (chatId) &#x3D;&gt; {\n        let chat &#x3D; window.Store.Chat.get(chatId);\n        if (chat !&#x3D;&#x3D; undefined) {\n            await window.Store.SendSeen.sendSeen(chat, false);\n            return true;\n        }\n        return false;\n\n    };\n\n    window.WWebJS.sendMessage &#x3D; async (chat, content, options &#x3D; {}) &#x3D;&gt; {\n        let attOptions &#x3D; {};\n        if (options.attachment) {\n            attOptions &#x3D; options.sendMediaAsSticker\n                ? await window.WWebJS.processStickerData(options.attachment)\n                : await window.WWebJS.processMediaData(options.attachment, {\n                    forceVoice: options.sendAudioAsVoice,\n                    forceDocument: options.sendMediaAsDocument,\n                    forceGif: options.sendVideoAsGif\n                });\n            \n            if (options.caption){\n                attOptions.caption &#x3D; options.caption; \n            }\n            content &#x3D; options.sendMediaAsSticker ? undefined : attOptions.preview;\n            attOptions.isViewOnce &#x3D; options.isViewOnce;\n\n            delete options.attachment;\n            delete options.sendMediaAsSticker;\n        }\n        let quotedMsgOptions &#x3D; {};\n        if (options.quotedMessageId) {\n            let quotedMessage &#x3D; window.Store.Msg.get(options.quotedMessageId);\n\n            // TODO remove .canReply() once all clients are updated to &gt;&#x3D; v2.2241.6\n            const canReply &#x3D; window.Store.ReplyUtils ? \n                window.Store.ReplyUtils.canReplyMsg(quotedMessage.unsafe()) : \n                quotedMessage.canReply();\n\n            if (canReply) {\n                quotedMsgOptions &#x3D; quotedMessage.msgContextInfo(chat);\n            }\n            delete options.quotedMessageId;\n        }\n\n        if (options.mentionedJidList) {\n            options.mentionedJidList &#x3D; options.mentionedJidList.map(cId &#x3D;&gt; window.Store.Contact.get(cId).id);\n        }\n\n        let locationOptions &#x3D; {};\n        if (options.location) {\n            let { latitude, longitude, description, url } &#x3D; options.location;\n            url &#x3D; window.Store.Validators.findLink(url)?.href;\n            url &amp;amp;&amp;amp; !description &amp;amp;&amp;amp; (description &#x3D; url);\n            locationOptions &#x3D; {\n                type: &#x27;location&#x27;,\n                loc: description,\n                lat: latitude,\n                lng: longitude,\n                clientUrl: url\n            };\n            delete options.location;\n        }\n\n        let _pollOptions &#x3D; {};\n        if (options.poll) {\n            const { pollName, pollOptions } &#x3D; options.poll;\n            const { allowMultipleAnswers, messageSecret } &#x3D; options.poll.options;\n            _pollOptions &#x3D; {\n                type: &#x27;poll_creation&#x27;,\n                pollName: pollName,\n                pollOptions: pollOptions,\n                pollSelectableOptionsCount: allowMultipleAnswers ? 0 : 1,\n                messageSecret:\n                Array.isArray(messageSecret) &amp;amp;&amp;amp; messageSecret.length &#x3D;&#x3D;&#x3D; 32\n                    ? new Uint8Array(messageSecret)\n                    : window.crypto.getRandomValues(new Uint8Array(32))\n            };\n            delete options.poll;\n        }\n\n        let vcardOptions &#x3D; {};\n        if (options.contactCard) {\n            let contact &#x3D; window.Store.Contact.get(options.contactCard);\n            vcardOptions &#x3D; {\n                body: window.Store.VCard.vcardFromContactModel(contact).vcard,\n                type: &#x27;vcard&#x27;,\n                vcardFormattedName: contact.formattedName\n            };\n            delete options.contactCard;\n        } else if (options.contactCardList) {\n            let contacts &#x3D; options.contactCardList.map(c &#x3D;&gt; window.Store.Contact.get(c));\n            let vcards &#x3D; contacts.map(c &#x3D;&gt; window.Store.VCard.vcardFromContactModel(c));\n            vcardOptions &#x3D; {\n                type: &#x27;multi_vcard&#x27;,\n                vcardList: vcards,\n                body: undefined\n            };\n            delete options.contactCardList;\n        } else if (options.parseVCards &amp;amp;&amp;amp; typeof (content) &#x3D;&#x3D;&#x3D; &#x27;string&#x27; &amp;amp;&amp;amp; content.startsWith(&#x27;BEGIN:VCARD&#x27;)) {\n            delete options.parseVCards;\n            try {\n                const parsed &#x3D; window.Store.VCard.parseVcard(content);\n                if (parsed) {\n                    vcardOptions &#x3D; {\n                        type: &#x27;vcard&#x27;,\n                        vcardFormattedName: window.Store.VCard.vcardGetNameFromParsed(parsed)\n                    };\n                }\n            } catch (_) {\n                // not a vcard\n            }\n        }\n\n        if (options.linkPreview) {\n            delete options.linkPreview;\n\n            // Not supported yet by WhatsApp Web on MD\n            if(!window.Store.MDBackend) {\n                const link &#x3D; window.Store.Validators.findLink(content);\n                if (link) {\n                    const preview &#x3D; await window.Store.Wap.queryLinkPreview(link.url);\n                    preview.preview &#x3D; true;\n                    preview.subtype &#x3D; &#x27;url&#x27;;\n                    options &#x3D; { ...options, ...preview };\n                }\n            }\n        }\n        \n        let buttonOptions &#x3D; {};\n        if(options.buttons){\n            let caption;\n            if (options.buttons.type &#x3D;&#x3D;&#x3D; &#x27;chat&#x27;) {\n                content &#x3D; options.buttons.body;\n                caption &#x3D; content;\n            } else {\n                caption &#x3D; options.caption ? options.caption : &#x27; &#x27;; //Caption can&#x27;t be empty\n            }\n            buttonOptions &#x3D; {\n                productHeaderImageRejected: false,\n                isFromTemplate: false,\n                isDynamicReplyButtonsMsg: true,\n                title: options.buttons.title ? options.buttons.title : undefined,\n                footer: options.buttons.footer ? options.buttons.footer : undefined,\n                dynamicReplyButtons: options.buttons.buttons,\n                replyButtons: options.buttons.buttons,\n                caption: caption\n            };\n            delete options.buttons;\n        }\n\n        let listOptions &#x3D; {};\n        if (options.list) {\n            if (window.Store.Conn.platform &#x3D;&#x3D;&#x3D; &#x27;smba&#x27; || window.Store.Conn.platform &#x3D;&#x3D;&#x3D; &#x27;smbi&#x27;) {\n                throw &#x27;[LT01] Whatsapp business can\\&#x27;t send this yet&#x27;;\n            }\n            listOptions &#x3D; {\n                type: &#x27;list&#x27;,\n                footer: options.list.footer,\n                list: {\n                    ...options.list,\n                    listType: 1\n                },\n                body: options.list.description\n            };\n            delete options.list;\n            delete listOptions.list.footer;\n        }\n\n        const meUser &#x3D; window.Store.User.getMaybeMeUser();\n        const isMD &#x3D; window.Store.MDBackend;\n        const newId &#x3D; await window.Store.MsgKey.newId();\n        \n        const newMsgId &#x3D; new window.Store.MsgKey({\n            from: meUser,\n            to: chat.id,\n            id: newId,\n            participant: isMD &amp;amp;&amp;amp; chat.id.isGroup() ? meUser : undefined,\n            selfDir: &#x27;out&#x27;,\n        });\n\n        const extraOptions &#x3D; options.extraOptions || {};\n        delete options.extraOptions;\n\n        const ephemeralFields &#x3D; window.Store.EphemeralFields.getEphemeralFields(chat);\n\n        const message &#x3D; {\n            ...options,\n            id: newMsgId,\n            ack: 0,\n            body: content,\n            from: meUser,\n            to: chat.id,\n            local: true,\n            self: &#x27;out&#x27;,\n            t: parseInt(new Date().getTime() / 1000),\n            isNewMsg: true,\n            type: &#x27;chat&#x27;,\n            ...ephemeralFields,\n            ...locationOptions,\n            ..._pollOptions,\n            ...attOptions,\n            ...(attOptions.toJSON ? attOptions.toJSON() : {}),\n            ...quotedMsgOptions,\n            ...vcardOptions,\n            ...buttonOptions,\n            ...listOptions,\n            ...extraOptions\n        };\n\n        await window.Store.SendMessage.addAndSendMsgToChat(chat, message);\n        return window.Store.Msg.get(newMsgId._serialized);\n    };\n\t\n    window.WWebJS.editMessage &#x3D; async (msg, content, options &#x3D; {}) &#x3D;&gt; {\n\n        const extraOptions &#x3D; options.extraOptions || {};\n        delete options.extraOptions;\n        \n        if (options.mentionedJidList) {\n            options.mentionedJidList &#x3D; options.mentionedJidList.map(cId &#x3D;&gt; window.Store.Contact.get(cId).id);\n        }\n\n        if (options.linkPreview) {\n            options.linkPreview &#x3D; null;\n\n            // Not supported yet by WhatsApp Web on MD\n            if(!window.Store.MDBackend) {\n                const link &#x3D; window.Store.Validators.findLink(content);\n                if (link) {\n                    const preview &#x3D; await window.Store.Wap.queryLinkPreview(link.url);\n                    preview.preview &#x3D; true;\n                    preview.subtype &#x3D; &#x27;url&#x27;;\n                    options &#x3D; { ...options, ...preview };\n                }\n            }\n        }\n\n\n        const internalOptions &#x3D; {\n            ...options,\n            ...extraOptions\n        };\n\n        await window.Store.EditMessage.sendMessageEdit(msg, content, internalOptions);\n        return window.Store.Msg.get(msg.id._serialized);\n    };\n\n    window.WWebJS.toStickerData &#x3D; async (mediaInfo) &#x3D;&gt; {\n        if (mediaInfo.mimetype &#x3D;&#x3D; &#x27;image/webp&#x27;) return mediaInfo;\n\n        const file &#x3D; window.WWebJS.mediaInfoToFile(mediaInfo);\n        const webpSticker &#x3D; await window.Store.StickerTools.toWebpSticker(file);\n        const webpBuffer &#x3D; await webpSticker.arrayBuffer();\n        const data &#x3D; window.WWebJS.arrayBufferToBase64(webpBuffer);\n\n        return {\n            mimetype: &#x27;image/webp&#x27;,\n            data\n        };\n    };\n\n    window.WWebJS.processStickerData &#x3D; async (mediaInfo) &#x3D;&gt; {\n        if (mediaInfo.mimetype !&#x3D;&#x3D; &#x27;image/webp&#x27;) throw new Error(&#x27;Invalid media type&#x27;);\n\n        const file &#x3D; window.WWebJS.mediaInfoToFile(mediaInfo);\n        let filehash &#x3D; await window.WWebJS.getFileHash(file);\n        let mediaKey &#x3D; await window.WWebJS.generateHash(32);\n\n        const controller &#x3D; new AbortController();\n        const uploadedInfo &#x3D; await window.Store.UploadUtils.encryptAndUpload({\n            blob: file,\n            type: &#x27;sticker&#x27;,\n            signal: controller.signal,\n            mediaKey\n        });\n\n        const stickerInfo &#x3D; {\n            ...uploadedInfo,\n            clientUrl: uploadedInfo.url,\n            deprecatedMms3Url: uploadedInfo.url,\n            uploadhash: uploadedInfo.encFilehash,\n            size: file.size,\n            type: &#x27;sticker&#x27;,\n            filehash\n        };\n\n        return stickerInfo;\n    };\n\n    window.WWebJS.processMediaData &#x3D; async (mediaInfo, { forceVoice, forceDocument, forceGif }) &#x3D;&gt; {\n        const file &#x3D; window.WWebJS.mediaInfoToFile(mediaInfo);\n        const mData &#x3D; await window.Store.OpaqueData.createFromData(file, file.type);\n        const mediaPrep &#x3D; window.Store.MediaPrep.prepRawMedia(mData, { asDocument: forceDocument });\n        const mediaData &#x3D; await mediaPrep.waitForPrep();\n        const mediaObject &#x3D; window.Store.MediaObject.getOrCreateMediaObject(mediaData.filehash);\n\n        const mediaType &#x3D; window.Store.MediaTypes.msgToMediaType({\n            type: mediaData.type,\n            isGif: mediaData.isGif\n        });\n\n        if (forceVoice &amp;amp;&amp;amp; mediaData.type &#x3D;&#x3D;&#x3D; &#x27;audio&#x27;) {\n            mediaData.type &#x3D; &#x27;ptt&#x27;;\n            const waveform &#x3D; mediaObject.contentInfo.waveform;\n            mediaData.waveform &#x3D;\n                waveform ?? await window.WWebJS.generateWaveform(file);\n        }\n\n        if (forceGif &amp;amp;&amp;amp; mediaData.type &#x3D;&#x3D;&#x3D; &#x27;video&#x27;) {\n            mediaData.isGif &#x3D; true;\n        }\n\n        if (forceDocument) {\n            mediaData.type &#x3D; &#x27;document&#x27;;\n        }\n\n        if (!(mediaData.mediaBlob instanceof window.Store.OpaqueData)) {\n            mediaData.mediaBlob &#x3D; await window.Store.OpaqueData.createFromData(mediaData.mediaBlob, mediaData.mediaBlob.type);\n        }\n\n        mediaData.renderableUrl &#x3D; mediaData.mediaBlob.url();\n        mediaObject.consolidate(mediaData.toJSON());\n        mediaData.mediaBlob.autorelease();\n\n        const uploadedMedia &#x3D; await window.Store.MediaUpload.uploadMedia({\n            mimetype: mediaData.mimetype,\n            mediaObject,\n            mediaType\n        });\n\n        const mediaEntry &#x3D; uploadedMedia.mediaEntry;\n        if (!mediaEntry) {\n            throw new Error(&#x27;upload failed: media entry was not created&#x27;);\n        }\n\n        mediaData.set({\n            clientUrl: mediaEntry.mmsUrl,\n            deprecatedMms3Url: mediaEntry.deprecatedMms3Url,\n            directPath: mediaEntry.directPath,\n            mediaKey: mediaEntry.mediaKey,\n            mediaKeyTimestamp: mediaEntry.mediaKeyTimestamp,\n            filehash: mediaObject.filehash,\n            encFilehash: mediaEntry.encFilehash,\n            uploadhash: mediaEntry.uploadHash,\n            size: mediaObject.size,\n            streamingSidecar: mediaEntry.sidecar,\n            firstFrameSidecar: mediaEntry.firstFrameSidecar\n        });\n\n        return mediaData;\n    };\n\n    window.WWebJS.getMessageModel &#x3D; message &#x3D;&gt; {\n        const msg &#x3D; message.serialize();\n\n        msg.isEphemeral &#x3D; message.isEphemeral;\n        msg.isStatusV3 &#x3D; message.isStatusV3;\n        msg.links &#x3D; (message.getRawLinks()).map(link &#x3D;&gt; ({\n            link: link.href,\n            isSuspicious: Boolean(link.suspiciousCharacters &amp;amp;&amp;amp; link.suspiciousCharacters.size)\n        }));\n\n        if (msg.buttons) {\n            msg.buttons &#x3D; msg.buttons.serialize();\n        }\n        if (msg.dynamicReplyButtons) {\n            msg.dynamicReplyButtons &#x3D; JSON.parse(JSON.stringify(msg.dynamicReplyButtons));\n        }\n        if (msg.replyButtons) {\n            msg.replyButtons &#x3D; JSON.parse(JSON.stringify(msg.replyButtons));\n        }\n\n        if (typeof msg.id.remote &#x3D;&#x3D;&#x3D; &#x27;object&#x27;) {\n            msg.id &#x3D; Object.assign({}, msg.id, { remote: msg.id.remote._serialized });\n        }\n\n        delete msg.pendingAckUpdate;\n\n        return msg;\n    };\n\n\n    window.WWebJS.getChatModel &#x3D; async chat &#x3D;&gt; {\n\n        let res &#x3D; chat.serialize();\n        res.isGroup &#x3D; chat.isGroup;\n        res.formattedTitle &#x3D; chat.formattedTitle;\n        res.isMuted &#x3D; chat.mute &amp;amp;&amp;amp; chat.mute.isMuted;\n\n        if (chat.groupMetadata) {\n            const chatWid &#x3D; window.Store.WidFactory.createWid((chat.id._serialized));\n            await window.Store.GroupMetadata.update(chatWid);\n            res.groupMetadata &#x3D; chat.groupMetadata.serialize();\n        }\n        \n        res.lastMessage &#x3D; null;\n        if (res.msgs &amp;amp;&amp;amp; res.msgs.length) {\n            const lastMessage &#x3D; chat.lastReceivedKey ? window.Store.Msg.get(chat.lastReceivedKey._serialized) : null;\n            if (lastMessage) {\n                res.lastMessage &#x3D; window.WWebJS.getMessageModel(lastMessage);\n            }\n        }\n        \n        delete res.msgs;\n        delete res.msgUnsyncedButtonReplyMsgs;\n        delete res.unsyncedButtonReplies;\n\n        return res;\n    };\n\n    window.WWebJS.getChat &#x3D; async chatId &#x3D;&gt; {\n        const chatWid &#x3D; window.Store.WidFactory.createWid(chatId);\n        const chat &#x3D; await window.Store.Chat.find(chatWid);\n        return await window.WWebJS.getChatModel(chat);\n    };\n\n    window.WWebJS.getChats &#x3D; async () &#x3D;&gt; {\n        const chats &#x3D; window.Store.Chat.getModelsArray();\n\n        const chatPromises &#x3D; chats.map(chat &#x3D;&gt; window.WWebJS.getChatModel(chat));\n        return await Promise.all(chatPromises);\n    };\n\n    window.WWebJS.getContactModel &#x3D; contact &#x3D;&gt; {\n        let res &#x3D; contact.serialize();\n        res.isBusiness &#x3D; contact.isBusiness &#x3D;&#x3D;&#x3D; undefined ? false : contact.isBusiness;\n\n        if (contact.businessProfile) {\n            res.businessProfile &#x3D; contact.businessProfile.serialize();\n        }\n\n        // TODO: remove useOldImplementation and its checks once all clients are updated to &gt;&#x3D; v2.2327.4\n        const useOldImplementation\n            &#x3D; window.compareWwebVersions(window.Debug.VERSION, &#x27;&amp;lt;&#x27;, &#x27;2.2327.4&#x27;);\n\n        res.isMe &#x3D; useOldImplementation\n            ? contact.isMe\n            : window.Store.ContactMethods.getIsMe(contact);\n        res.isUser &#x3D; useOldImplementation\n            ? contact.isUser\n            : window.Store.ContactMethods.getIsUser(contact);\n        res.isGroup &#x3D; useOldImplementation\n            ? contact.isGroup\n            : window.Store.ContactMethods.getIsGroup(contact);\n        res.isWAContact &#x3D; useOldImplementation\n            ? contact.isWAContact\n            : window.Store.ContactMethods.getIsWAContact(contact);\n        res.isMyContact &#x3D; useOldImplementation\n            ? contact.isMyContact\n            : window.Store.ContactMethods.getIsMyContact(contact);\n        res.isBlocked &#x3D; contact.isContactBlocked;\n        res.userid &#x3D; useOldImplementation\n            ? contact.userid\n            : window.Store.ContactMethods.getUserid(contact);\n        res.isEnterprise &#x3D; useOldImplementation\n            ? contact.isEnterprise\n            : window.Store.ContactMethods.getIsEnterprise(contact);\n        res.verifiedName &#x3D; useOldImplementation\n            ? contact.verifiedName\n            : window.Store.ContactMethods.getVerifiedName(contact);\n        res.verifiedLevel &#x3D; useOldImplementation\n            ? contact.verifiedLevel\n            : window.Store.ContactMethods.getVerifiedLevel(contact);\n        res.statusMute &#x3D; useOldImplementation\n            ? contact.statusMute\n            : window.Store.ContactMethods.getStatusMute(contact);\n        res.name &#x3D; useOldImplementation\n            ? contact.name\n            : window.Store.ContactMethods.getName(contact);\n        res.shortName &#x3D; useOldImplementation\n            ? contact.shortName\n            : window.Store.ContactMethods.getShortName(contact);\n        res.pushname &#x3D; useOldImplementation\n            ? contact.pushname\n            : window.Store.ContactMethods.getPushname(contact);\n\n        return res;\n    };\n\n    window.WWebJS.getContact &#x3D; async contactId &#x3D;&gt; {\n        const wid &#x3D; window.Store.WidFactory.createWid(contactId);\n        const contact &#x3D; await window.Store.Contact.find(wid);\n        const bizProfile &#x3D; await window.Store.BusinessProfileCollection.fetchBizProfile(wid);\n        bizProfile.profileOptions &amp;amp;&amp;amp; (contact.businessProfile &#x3D; bizProfile);\n        return window.WWebJS.getContactModel(contact);\n    };\n\n    window.WWebJS.getContacts &#x3D; () &#x3D;&gt; {\n        const contacts &#x3D; window.Store.Contact.getModelsArray();\n        return contacts.map(contact &#x3D;&gt; window.WWebJS.getContactModel(contact));\n    };\n\n    window.WWebJS.mediaInfoToFile &#x3D; ({ data, mimetype, filename }) &#x3D;&gt; {\n        const binaryData &#x3D; window.atob(data);\n\n        const buffer &#x3D; new ArrayBuffer(binaryData.length);\n        const view &#x3D; new Uint8Array(buffer);\n        for (let i &#x3D; 0; i &amp;lt; binaryData.length; i++) {\n            view[i] &#x3D; binaryData.charCodeAt(i);\n        }\n\n        const blob &#x3D; new Blob([buffer], { type: mimetype });\n        return new File([blob], filename, {\n            type: mimetype,\n            lastModified: Date.now()\n        });\n    };\n\n    window.WWebJS.arrayBufferToBase64 &#x3D; (arrayBuffer) &#x3D;&gt; {\n        let binary &#x3D; &#x27;&#x27;;\n        const bytes &#x3D; new Uint8Array(arrayBuffer);\n        const len &#x3D; bytes.byteLength;\n        for (let i &#x3D; 0; i &amp;lt; len; i++) {\n            binary +&#x3D; String.fromCharCode(bytes[i]);\n        }\n        return window.btoa(binary);\n    };\n\n    window.WWebJS.arrayBufferToBase64Async &#x3D; (arrayBuffer) &#x3D;&gt;\n        new Promise((resolve, reject) &#x3D;&gt; {\n            const blob &#x3D; new Blob([arrayBuffer], {\n                type: &#x27;application/octet-stream&#x27;,\n            });\n            const fileReader &#x3D; new FileReader();\n            fileReader.onload &#x3D; () &#x3D;&gt; {\n                const [, data] &#x3D; fileReader.result.split(&#x27;,&#x27;);\n                resolve(data);\n            };\n            fileReader.onerror &#x3D; (e) &#x3D;&gt; reject(e);\n            fileReader.readAsDataURL(blob);\n        });\n\n    window.WWebJS.getFileHash &#x3D; async (data) &#x3D;&gt; {\n        let buffer &#x3D; await data.arrayBuffer();\n        const hashBuffer &#x3D; await crypto.subtle.digest(&#x27;SHA-256&#x27;, buffer);\n        return btoa(String.fromCharCode(...new Uint8Array(hashBuffer)));\n    };\n\n    window.WWebJS.generateHash &#x3D; async (length) &#x3D;&gt; {\n        var result &#x3D; &#x27;&#x27;;\n        var characters &#x3D; &#x27;ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789&#x27;;\n        var charactersLength &#x3D; characters.length;\n        for (var i &#x3D; 0; i &amp;lt; length; i++) {\n            result +&#x3D; characters.charAt(Math.floor(Math.random() * charactersLength));\n        }\n        return result;\n    };\n\n    /**\n     * Referenced from and modified:\n     * @see https://github.com/wppconnect-team/wa-js/commit/290ebfefe6021b3d17f7fdfdda5545bb0473b26f\n     */\n    window.WWebJS.generateWaveform &#x3D; async (audioFile) &#x3D;&gt; {\n        try {\n            const audioData &#x3D; await audioFile.arrayBuffer();\n            const audioContext &#x3D; new AudioContext();\n            const audioBuffer &#x3D; await audioContext.decodeAudioData(audioData);\n\n            const rawData &#x3D; audioBuffer.getChannelData(0);\n            const samples &#x3D; 64;\n            const blockSize &#x3D; Math.floor(rawData.length / samples);\n            const filteredData &#x3D; [];\n            for (let i &#x3D; 0; i &amp;lt; samples; i++) {\n                const blockStart &#x3D; blockSize * i;\n                let sum &#x3D; 0;\n                for (let j &#x3D; 0; j &amp;lt; blockSize; j++) {\n                    sum &#x3D; sum + Math.abs(rawData[blockStart + j]);\n                }\n                filteredData.push(sum / blockSize);\n            }\n\n            const multiplier &#x3D; Math.pow(Math.max(...filteredData), -1);\n            const normalizedData &#x3D; filteredData.map((n) &#x3D;&gt; n * multiplier);\n\n            const waveform &#x3D; new Uint8Array(\n                normalizedData.map((n) &#x3D;&gt; Math.floor(100 * n))\n            );\n\n            return waveform;\n        } catch (e) {\n            return undefined;\n        }\n    };\n\n    window.WWebJS.sendClearChat &#x3D; async (chatId) &#x3D;&gt; {\n        let chat &#x3D; window.Store.Chat.get(chatId);\n        if (chat !&#x3D;&#x3D; undefined) {\n            await window.Store.SendClear.sendClear(chat, false);\n            return true;\n        }\n        return false;\n    };\n\n    window.WWebJS.sendDeleteChat &#x3D; async (chatId) &#x3D;&gt; {\n        let chat &#x3D; window.Store.Chat.get(chatId);\n        if (chat !&#x3D;&#x3D; undefined) {\n            await window.Store.SendDelete.sendDelete(chat);\n            return true;\n        }\n        return false;\n    };\n\n    window.WWebJS.sendChatstate &#x3D; async (state, chatId) &#x3D;&gt; {\n        if (window.Store.MDBackend) {\n            chatId &#x3D; window.Store.WidFactory.createWid(chatId);\n        }\n        switch (state) {\n        case &#x27;typing&#x27;:\n            await window.Store.ChatState.sendChatStateComposing(chatId);\n            break;\n        case &#x27;recording&#x27;:\n            await window.Store.ChatState.sendChatStateRecording(chatId);\n            break;\n        case &#x27;stop&#x27;:\n            await window.Store.ChatState.sendChatStatePaused(chatId);\n            break;\n        default:\n            throw &#x27;Invalid chatstate&#x27;;\n        }\n\n        return true;\n    };\n\n    window.WWebJS.getLabelModel &#x3D; label &#x3D;&gt; {\n        let res &#x3D; label.serialize();\n        res.hexColor &#x3D; label.hexColor;\n\n        return res;\n    };\n\n    window.WWebJS.getLabels &#x3D; () &#x3D;&gt; {\n        const labels &#x3D; window.Store.Label.getModelsArray();\n        return labels.map(label &#x3D;&gt; window.WWebJS.getLabelModel(label));\n    };\n\n    window.WWebJS.getLabel &#x3D; (labelId) &#x3D;&gt; {\n        const label &#x3D; window.Store.Label.get(labelId);\n        return window.WWebJS.getLabelModel(label);\n    };\n\n    window.WWebJS.getChatLabels &#x3D; async (chatId) &#x3D;&gt; {\n        const chat &#x3D; await window.WWebJS.getChat(chatId);\n        return (chat.labels || []).map(id &#x3D;&gt; window.WWebJS.getLabel(id));\n    };\n\n    window.WWebJS.getOrderDetail &#x3D; async (orderId, token, chatId) &#x3D;&gt; {\n        const chatWid &#x3D; window.Store.WidFactory.createWid(chatId);\n        return window.Store.QueryOrder.queryOrder(chatWid, orderId, 80, 80, token);\n    };\n\n    window.WWebJS.getProductMetadata &#x3D; async (productId) &#x3D;&gt; {\n        let sellerId &#x3D; window.Store.Conn.wid;\n        let product &#x3D; await window.Store.QueryProduct.queryProduct(sellerId, productId);\n        if (product &amp;amp;&amp;amp; product.data) {\n            return product.data;\n        }\n\n        return undefined;\n    };\n\n    window.WWebJS.rejectCall &#x3D; async (peerJid, id) &#x3D;&gt; {\n        peerJid &#x3D; peerJid.split(&#x27;@&#x27;)[0] + &#x27;@s.whatsapp.net&#x27;;\n        let userId &#x3D; window.Store.User.getMaybeMeUser().user + &#x27;@s.whatsapp.net&#x27;;\n        const stanza &#x3D; window.Store.SocketWap.wap(&#x27;call&#x27;, {\n            id: window.Store.SocketWap.generateId(),\n            from: window.Store.SocketWap.USER_JID(userId),\n            to: window.Store.SocketWap.USER_JID(peerJid),\n        }, [\n            window.Store.SocketWap.wap(&#x27;reject&#x27;, {\n                &#x27;call-id&#x27;: id,\n                &#x27;call-creator&#x27;: window.Store.SocketWap.USER_JID(peerJid),\n                count: &#x27;0&#x27;,\n            })\n        ]);\n        await window.Store.Socket.deprecatedCastStanza(stanza);\n    };\n\n    window.WWebJS.cropAndResizeImage &#x3D; async (media, options &#x3D; {}) &#x3D;&gt; {\n        if (!media.mimetype.includes(&#x27;image&#x27;))\n            throw new Error(&#x27;Media is not an image&#x27;);\n\n        if (options.mimetype &amp;amp;&amp;amp; !options.mimetype.includes(&#x27;image&#x27;))\n            delete options.mimetype;\n\n        options &#x3D; Object.assign({ size: 640, mimetype: media.mimetype, quality: .75, asDataUrl: false }, options);\n\n        const img &#x3D; await new Promise ((resolve, reject) &#x3D;&gt; {\n            const img &#x3D; new Image();\n            img.onload &#x3D; () &#x3D;&gt; resolve(img);\n            img.onerror &#x3D; reject;\n            img.src &#x3D; &#x60;data:${media.mimetype};base64,${media.data}&#x60;;\n        });\n\n        const sl &#x3D; Math.min(img.width, img.height);\n        const sx &#x3D; Math.floor((img.width - sl) / 2);\n        const sy &#x3D; Math.floor((img.height - sl) / 2);\n\n        const canvas &#x3D; document.createElement(&#x27;canvas&#x27;);\n        canvas.width &#x3D; options.size;\n        canvas.height &#x3D; options.size;\n\n        const ctx &#x3D; canvas.getContext(&#x27;2d&#x27;);\n        ctx.drawImage(img, sx, sy, sl, sl, 0, 0, options.size, options.size);\n\n        const dataUrl &#x3D; canvas.toDataURL(options.mimetype, options.quality);\n\n        if (options.asDataUrl)\n            return dataUrl;\n\n        return Object.assign(media, {\n            mimetype: options.mimeType,\n            data: dataUrl.replace(&#x60;data:${options.mimeType};base64,&#x60;, &#x27;&#x27;)\n        });\n    };\n\n    window.WWebJS.setPicture &#x3D; async (chatid, media) &#x3D;&gt; {\n        const thumbnail &#x3D; await window.WWebJS.cropAndResizeImage(media, { asDataUrl: true, mimetype: &#x27;image/jpeg&#x27;, size: 96 });\n        const profilePic &#x3D; await window.WWebJS.cropAndResizeImage(media, { asDataUrl: true, mimetype: &#x27;image/jpeg&#x27;, size: 640 });\n\n        const chatWid &#x3D; window.Store.WidFactory.createWid(chatid);\n        try {\n            const collection &#x3D; window.Store.ProfilePicThumb.get(chatid);\n            if (!collection.canSet()) return;\n\n            const res &#x3D; await window.Store.GroupUtils.sendSetPicture(chatWid, thumbnail, profilePic);\n            return res ? res.status &#x3D;&#x3D;&#x3D; 200 : false;\n        } catch (err) {\n            if(err.name &#x3D;&#x3D;&#x3D; &#x27;ServerStatusCodeError&#x27;) return false;\n            throw err;\n        }\n    };\n\n    window.WWebJS.deletePicture &#x3D; async (chatid) &#x3D;&gt; {\n        const chatWid &#x3D; window.Store.WidFactory.createWid(chatid);\n        try {\n            const collection &#x3D; window.Store.ProfilePicThumb.get(chatid);\n            if (!collection.canDelete()) return;\n\n            const res &#x3D; await window.Store.GroupUtils.requestDeletePicture(chatWid);\n            return res ? res.status &#x3D;&#x3D;&#x3D; 200 : false;\n        } catch (err) {\n            if(err.name &#x3D;&#x3D;&#x3D; &#x27;ServerStatusCodeError&#x27;) return false;\n            throw err;\n        }\n    };\n    \n    window.WWebJS.getProfilePicThumbToBase64 &#x3D; async (chatWid) &#x3D;&gt; {\n        const profilePicCollection &#x3D; await window.Store.ProfilePicThumb.find(chatWid);\n\n        const _readImageAsBase64 &#x3D; (imageBlob) &#x3D;&gt; {\n            return new Promise((resolve) &#x3D;&gt; {\n                const reader &#x3D; new FileReader();\n                reader.onloadend &#x3D; function () {\n                    const base64Image &#x3D; reader.result;\n                    if (base64Image &#x3D;&#x3D; null) {\n                        resolve(undefined);\n                    } else {\n                        const base64Data &#x3D; base64Image.toString().split(&#x27;,&#x27;)[1];\n                        resolve(base64Data);\n                    }\n                };\n                reader.readAsDataURL(imageBlob);\n            });\n        };\n\n        if (profilePicCollection?.img) {\n            try {\n                const response &#x3D; await fetch(profilePicCollection.img);\n                if (response.ok) {\n                    const imageBlob &#x3D; await response.blob();\n                    if (imageBlob) {\n                        const base64Image &#x3D; await _readImageAsBase64(imageBlob);\n                        return base64Image;\n                    }\n                }\n            } catch (error) { /* empty */ }\n        }\n        return undefined;\n    };\n\n    window.WWebJS.getAddParticipantsRpcResult &#x3D; async (groupMetadata, groupWid, participantWid) &#x3D;&gt; {\n        const participantLidArgs &#x3D; groupMetadata?.isLidAddressingMode\n            ? {\n                phoneNumber: participantWid,\n                lid: window.Store.LidUtils.getCurrentLid(participantWid)\n            }\n            : { phoneNumber: participantWid };\n\n        const iqTo &#x3D; window.Store.WidToJid.widToGroupJid(groupWid);\n\n        const participantArgs &#x3D;\n            participantLidArgs.lid\n                ? [{\n                    participantJid: window.Store.WidToJid.widToUserJid(participantLidArgs.lid),\n                    phoneNumberMixinArgs: {\n                        anyPhoneNumber: window.Store.WidToJid.widToUserJid(participantLidArgs.phoneNumber)\n                    }\n                }]\n                : [{\n                    participantJid: window.Store.WidToJid.widToUserJid(participantLidArgs.phoneNumber)\n                }];\n\n        let rpcResult, resultArgs;\n        const isOldImpl &#x3D; window.compareWwebVersions(window.Debug.VERSION, &#x27;&amp;lt;&#x3D;&#x27;, &#x27;2.2335.9&#x27;);\n        const data &#x3D; {\n            name: undefined,\n            code: undefined,\n            inviteV4Code: undefined,\n            inviteV4CodeExp: undefined\n        };\n\n        try {\n            rpcResult &#x3D; await window.Store.GroupParticipants.sendAddParticipantsRPC({ participantArgs, iqTo });\n            resultArgs &#x3D; isOldImpl\n                ? rpcResult.value.addParticipant[0].addParticipantsParticipantMixins\n                : rpcResult.value.addParticipant[0]\n                    .addParticipantsParticipantAddedOrNonRegisteredWaUserParticipantErrorLidResponseMixinGroup\n                    .value\n                    .addParticipantsParticipantMixins;\n        } catch (err) {\n            data.code &#x3D; 400;\n            return data;\n        }\n\n        if (rpcResult.name &#x3D;&#x3D;&#x3D; &#x27;AddParticipantsResponseSuccess&#x27;) {\n            const code &#x3D; resultArgs?.value.error ?? &#x27;200&#x27;;\n            data.name &#x3D; resultArgs?.name;\n            data.code &#x3D; +code;\n            data.inviteV4Code &#x3D; resultArgs?.value.addRequestCode;\n            data.inviteV4CodeExp &#x3D; resultArgs?.value.addRequestExpiration?.toString();\n        }\n\n        else if (rpcResult.name &#x3D;&#x3D;&#x3D; &#x27;AddParticipantsResponseClientError&#x27;) {\n            const { code: code } &#x3D; rpcResult.value.errorAddParticipantsClientErrors.value;\n            data.code &#x3D; +code;\n        }\n\n        else if (rpcResult.name &#x3D;&#x3D;&#x3D; &#x27;AddParticipantsResponseServerError&#x27;) {\n            const { code: code } &#x3D; rpcResult.value.errorServerErrors.value;\n            data.code &#x3D; +code;\n        }\n\n        return data;\n    };\n\n    window.WWebJS.membershipRequestAction &#x3D; async (groupId, action, requesterIds, sleep) &#x3D;&gt; {\n        const groupWid &#x3D; window.Store.WidFactory.createWid(groupId);\n        const group &#x3D; await window.Store.Chat.find(groupWid);\n        const toApprove &#x3D; action &#x3D;&#x3D;&#x3D; &#x27;Approve&#x27;;\n        let membershipRequests;\n        let response;\n        let result &#x3D; [];\n\n        await window.Store.GroupMetadata.queryAndUpdate(groupWid);\n\n        if (!requesterIds?.length) {\n            membershipRequests &#x3D; group.groupMetadata.membershipApprovalRequests._models.map(({ id }) &#x3D;&gt; id);\n        } else {\n            !Array.isArray(requesterIds) &amp;amp;&amp;amp; (requesterIds &#x3D; [requesterIds]);\n            membershipRequests &#x3D; requesterIds.map(r &#x3D;&gt; window.Store.WidFactory.createWid(r));\n        }\n\n        if (!membershipRequests.length) return [];\n\n        const participantArgs &#x3D; membershipRequests.map(m &#x3D;&gt; ({\n            participantArgs: [\n                {\n                    participantJid: window.Store.WidToJid.widToUserJid(m)\n                }\n            ]\n        }));\n\n        const groupJid &#x3D; window.Store.WidToJid.widToGroupJid(groupWid);\n        \n        const _getSleepTime &#x3D; (sleep) &#x3D;&gt; {\n            if (!Array.isArray(sleep) || (sleep.length &#x3D;&#x3D;&#x3D; 2 &amp;amp;&amp;amp; sleep[0] &#x3D;&#x3D;&#x3D; sleep[1])) {\n                return sleep;\n            }\n            if (sleep.length &#x3D;&#x3D;&#x3D; 1) {\n                return sleep[0];\n            }\n            sleep[1] - sleep[0] &amp;lt; 100 &amp;amp;&amp;amp; (sleep[0] &#x3D; sleep[1]) &amp;amp;&amp;amp; (sleep[1] +&#x3D; 100);\n            return Math.floor(Math.random() * (sleep[1] - sleep[0] + 1)) + sleep[0];\n        };\n\n        const membReqResCodes &#x3D; {\n            default: &#x60;An unknown error occupied while ${toApprove ? &#x27;approving&#x27; : &#x27;rejecting&#x27;} the participant membership request&#x60;,\n            400: &#x27;ParticipantNotFoundError&#x27;,\n            401: &#x27;ParticipantNotAuthorizedError&#x27;,\n            403: &#x27;ParticipantForbiddenError&#x27;,\n            404: &#x27;ParticipantRequestNotFoundError&#x27;,\n            408: &#x27;ParticipantTemporarilyBlockedError&#x27;,\n            409: &#x27;ParticipantConflictError&#x27;,\n            412: &#x27;ParticipantParentLinkedGroupsResourceConstraintError&#x27;,\n            500: &#x27;ParticipantResourceConstraintError&#x27;\n        };\n\n        try {\n            for (const participant of participantArgs) {\n                response &#x3D; await window.Store.MembershipRequestUtils.sendMembershipRequestsActionRPC({\n                    iqTo: groupJid,\n                    [toApprove ? &#x27;approveArgs&#x27; : &#x27;rejectArgs&#x27;]: participant\n                });\n\n                if (response.name &#x3D;&#x3D;&#x3D; &#x27;MembershipRequestsActionResponseSuccess&#x27;) {\n                    const value &#x3D; toApprove\n                        ? response.value.membershipRequestsActionApprove\n                        : response.value.membershipRequestsActionReject;\n                    if (value?.participant) {\n                        const [_] &#x3D; value.participant.map(p &#x3D;&gt; {\n                            const error &#x3D; toApprove\n                                ? value.participant[0].membershipRequestsActionAcceptParticipantMixins?.value.error\n                                : value.participant[0].membershipRequestsActionRejectParticipantMixins?.value.error;\n                            return {\n                                requesterId: window.Store.WidFactory.createWid(p.jid)._serialized,\n                                ...(error\n                                    ? { error: +error, message: membReqResCodes[error] || membReqResCodes.default }\n                                    : { message: &#x60;${toApprove ? &#x27;Approved&#x27; : &#x27;Rejected&#x27;} successfully&#x60; })\n                            };\n                        });\n                        _ &amp;amp;&amp;amp; result.push(_);\n                    }\n                } else {\n                    result.push({\n                        requesterId: window.Store.JidToWid.userJidToUserWid(participant.participantArgs[0].participantJid)._serialized,\n                        message: &#x27;ServerStatusCodeError&#x27;\n                    });\n                }\n\n                sleep &amp;amp;&amp;amp;\n                    participantArgs.length &gt; 1 &amp;amp;&amp;amp;\n                    participantArgs.indexOf(participant) !&#x3D;&#x3D; participantArgs.length - 1 &amp;amp;&amp;amp;\n                    (await new Promise((resolve) &#x3D;&gt; setTimeout(resolve, _getSleepTime(sleep))));\n            }\n            return result;\n        } catch (err) {\n            return [];\n        }\n    };\n};\n</code></pre>\n          </article>\n        </div>\n      </div>\n      <nav id=\"jsdoc-toc-nav\" role=\"navigation\"></nav>\n    </div>\n  </div>\n  <footer id=\"jsdoc-footer\" class=\"jsdoc-footer\">\n    <div id=\"jsdoc-footer-container\">\n      <p>\n        Generated by <a href=\"https://github.com/jsdoc3/jsdoc\">JSDoc</a> 3.6.11 on October 21, 2023.\n      </p>\n    </div>\n  </footer>\n  <script src=\"scripts/jquery.min.js\"></script>\n  <script src=\"scripts/tree.jquery.js\"></script>\n  <script src=\"scripts/prettify.js\"></script>\n  <script src=\"scripts/jsdoc-toc.js\"></script>\n  <script src=\"scripts/linenumber.js\"></script>\n  <script src=\"scripts/scrollanchor.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "docs/util_Injected_LegacyStore.js.html",
    "content": "<!doctype html>\n<html>\n\n<head>\n  <meta name=\"generator\" content=\"JSDoc 3.6.11\">\n  <meta charset=\"utf-8\">\n  <title>whatsapp-web.js 1.34.6 &raquo; Source: util/Injected/LegacyStore.js</title>\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Karla:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Noto+Serif:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Inconsolata:500\" type=\"text/css\">\n  <link href=\"css/baseline.css\" rel=\"stylesheet\">\n</head>\n\n<body onload=\"prettyPrint()\">\n  <nav id=\"jsdoc-navbar\" role=\"navigation\" class=\"jsdoc-navbar\">\n    <div id=\"jsdoc-navbar-container\">\n      <div id=\"jsdoc-navbar-content\">\n        <a href=\"index.html\" class=\"jsdoc-navbar-package-name\">whatsapp-web.<wbr>js 1.<wbr>34.<wbr>6</a>\n      </div>\n    </div>\n  </nav>\n  <div id=\"jsdoc-body-container\">\n    <div id=\"jsdoc-content\">\n      <div id=\"jsdoc-content-container\">\n        <div id=\"jsdoc-banner\" role=\"banner\">\n        </div>\n        <div id=\"jsdoc-main\" role=\"main\">\n          <header class=\"page-header\">\n            <h1>Source: util/Injected/LegacyStore.js</h1>\n          </header>\n          <article>\n            <pre class=\"prettyprint linenums\"><code>&#x27;use strict&#x27;;\n\n//TODO: To be removed by version 2.3000.x hard release\n\n// Exposes the internal Store to the WhatsApp Web client\nexports.ExposeLegacyStore &#x3D; () &#x3D;&gt; {\n    window.Store &#x3D; Object.assign({}, window.mR.findModule(m &#x3D;&gt; m.default &amp;amp;&amp;amp; m.default.Chat)[0].default);\n    window.Store.AppState &#x3D; window.mR.findModule(&#x27;Socket&#x27;)[0].Socket;\n    window.Store.Conn &#x3D; window.mR.findModule(&#x27;Conn&#x27;)[0].Conn;\n    window.Store.BlockContact &#x3D; window.mR.findModule(&#x27;blockContact&#x27;)[0];\n    window.Store.Call &#x3D; window.mR.findModule((module) &#x3D;&gt; module.default &amp;amp;&amp;amp; module.default.Call)[0].default.Call;\n    window.Store.Cmd &#x3D; window.mR.findModule(&#x27;Cmd&#x27;)[0].Cmd;\n    window.Store.CryptoLib &#x3D; window.mR.findModule(&#x27;decryptE2EMedia&#x27;)[0];\n    window.Store.DownloadManager &#x3D; window.mR.findModule(&#x27;downloadManager&#x27;)[0].downloadManager;\n    window.Store.GroupMetadata &#x3D; window.mR.findModule(&#x27;GroupMetadata&#x27;)[0].default.GroupMetadata;\n    window.Store.GroupQueryAndUpdate &#x3D; window.mR.findModule(&#x27;queryAndUpdateGroupMetadataById&#x27;)[0].queryAndUpdateGroupMetadataById;\n    window.Store.Label &#x3D; window.mR.findModule(&#x27;LabelCollection&#x27;)[0].LabelCollection;\n    window.Store.MediaPrep &#x3D; window.mR.findModule(&#x27;prepRawMedia&#x27;)[0];\n    window.Store.MediaObject &#x3D; window.mR.findModule(&#x27;getOrCreateMediaObject&#x27;)[0];\n    window.Store.NumberInfo &#x3D; window.mR.findModule(&#x27;formattedPhoneNumber&#x27;)[0];\n    window.Store.MediaTypes &#x3D; window.mR.findModule(&#x27;msgToMediaType&#x27;)[0];\n    window.Store.MediaUpload &#x3D; window.mR.findModule(&#x27;uploadMedia&#x27;)[0];\n    window.Store.MsgKey &#x3D; window.mR.findModule((module) &#x3D;&gt; module.default &amp;amp;&amp;amp; module.default.fromString)[0].default;\n    window.Store.OpaqueData &#x3D; window.mR.findModule(module &#x3D;&gt; module.default &amp;amp;&amp;amp; module.default.createFromData)[0].default;\n    window.Store.QueryProduct &#x3D; window.mR.findModule(&#x27;queryProduct&#x27;)[0];\n    window.Store.QueryOrder &#x3D; window.mR.findModule(&#x27;queryOrder&#x27;)[0];\n    window.Store.SendClear &#x3D; window.mR.findModule(&#x27;sendClear&#x27;)[0];\n    window.Store.SendDelete &#x3D; window.mR.findModule(&#x27;sendDelete&#x27;)[0];\n    window.Store.SendMessage &#x3D; window.mR.findModule(&#x27;addAndSendMsgToChat&#x27;)[0];\n    window.Store.EditMessage &#x3D; window.mR.findModule(&#x27;addAndSendMessageEdit&#x27;)[0];\n    window.Store.SendSeen &#x3D; window.mR.findModule(&#x27;sendSeen&#x27;)[0];\n    window.Store.User &#x3D; window.mR.findModule(&#x27;getMaybeMeUser&#x27;)[0];\n    window.Store.ContactMethods &#x3D; window.mR.findModule(&#x27;getUserid&#x27;)[0];\n    window.Store.UploadUtils &#x3D; window.mR.findModule((module) &#x3D;&gt; (module.default &amp;amp;&amp;amp; module.default.encryptAndUpload) ? module.default : null)[0].default;\n    window.Store.UserConstructor &#x3D; window.mR.findModule((module) &#x3D;&gt; (module.default &amp;amp;&amp;amp; module.default.prototype &amp;amp;&amp;amp; module.default.prototype.isServer &amp;amp;&amp;amp; module.default.prototype.isUser) ? module.default : null)[0].default;\n    window.Store.Validators &#x3D; window.mR.findModule(&#x27;findLinks&#x27;)[0];\n    window.Store.VCard &#x3D; window.mR.findModule(&#x27;vcardFromContactModel&#x27;)[0];\n    window.Store.WidFactory &#x3D; window.mR.findModule(&#x27;createWid&#x27;)[0];\n    window.Store.ProfilePic &#x3D; window.mR.findModule(&#x27;profilePicResync&#x27;)[0];\n    window.Store.PresenceUtils &#x3D; window.mR.findModule(&#x27;sendPresenceAvailable&#x27;)[0];\n    window.Store.ChatState &#x3D; window.mR.findModule(&#x27;sendChatStateComposing&#x27;)[0];\n    window.Store.findCommonGroups &#x3D; window.mR.findModule(&#x27;findCommonGroups&#x27;)[0].findCommonGroups;\n    window.Store.StatusUtils &#x3D; window.mR.findModule(&#x27;setMyStatus&#x27;)[0];\n    window.Store.ConversationMsgs &#x3D; window.mR.findModule(&#x27;loadEarlierMsgs&#x27;)[0];\n    window.Store.sendReactionToMsg &#x3D; window.mR.findModule(&#x27;sendReactionToMsg&#x27;)[0].sendReactionToMsg;\n    window.Store.createOrUpdateReactionsModule &#x3D; window.mR.findModule(&#x27;createOrUpdateReactions&#x27;)[0];\n    window.Store.EphemeralFields &#x3D; window.mR.findModule(&#x27;getEphemeralFields&#x27;)[0];\n    window.Store.MsgActionChecks &#x3D; window.mR.findModule(&#x27;canSenderRevokeMsg&#x27;)[0];\n    window.Store.QuotedMsg &#x3D; window.mR.findModule(&#x27;getQuotedMsgObj&#x27;)[0];\n    window.Store.LinkPreview &#x3D; window.mR.findModule(&#x27;getLinkPreview&#x27;)[0];\n    window.Store.Socket &#x3D; window.mR.findModule(&#x27;deprecatedSendIq&#x27;)[0];\n    window.Store.SocketWap &#x3D; window.mR.findModule(&#x27;wap&#x27;)[0];\n    window.Store.SearchContext &#x3D; window.mR.findModule(&#x27;getSearchContext&#x27;)[0].getSearchContext;\n    window.Store.DrawerManager &#x3D; window.mR.findModule(&#x27;DrawerManager&#x27;)[0].DrawerManager;\n    window.Store.LidUtils &#x3D; window.mR.findModule(&#x27;getCurrentLid&#x27;)[0];\n    window.Store.WidToJid &#x3D; window.mR.findModule(&#x27;widToUserJid&#x27;)[0];\n    window.Store.JidToWid &#x3D; window.mR.findModule(&#x27;userJidToUserWid&#x27;)[0];\n    window.Store.getMsgInfo &#x3D; (window.mR.findModule(&#x27;sendQueryMsgInfo&#x27;)[0] || {}).sendQueryMsgInfo || window.mR.findModule(&#x27;queryMsgInfo&#x27;)[0].queryMsgInfo;\n    window.Store.pinUnpinMsg &#x3D; window.mR.findModule(&#x27;sendPinInChatMsg&#x27;)[0].sendPinInChatMsg;\n    \n    /* eslint-disable no-undef, no-cond-assign */\n    window.Store.QueryExist &#x3D; ((m &#x3D; window.mR.findModule(&#x27;queryExists&#x27;)[0]) ? m.queryExists : window.mR.findModule(&#x27;queryExist&#x27;)[0].queryWidExists);\n    window.Store.ReplyUtils &#x3D; (m &#x3D; window.mR.findModule(&#x27;canReplyMsg&#x27;)).length &gt; 0 &amp;amp;&amp;amp; m[0];\n    /* eslint-enable no-undef, no-cond-assign */\n\n    window.Store.Settings &#x3D; {\n        ...window.mR.findModule(&#x27;ChatlistPanelState&#x27;)[0],\n        setPushname: window.mR.findModule((m) &#x3D;&gt; m.setPushname &amp;amp;&amp;amp; !m.ChatlistPanelState)[0].setPushname\n    };\n    window.Store.StickerTools &#x3D; {\n        ...window.mR.findModule(&#x27;toWebpSticker&#x27;)[0],\n        ...window.mR.findModule(&#x27;addWebpMetadata&#x27;)[0]\n    };\n    window.Store.GroupUtils &#x3D; {\n        ...window.mR.findModule(&#x27;createGroup&#x27;)[0],\n        ...window.mR.findModule(&#x27;setGroupDescription&#x27;)[0],\n        ...window.mR.findModule(&#x27;sendExitGroup&#x27;)[0],\n        ...window.mR.findModule(&#x27;sendSetPicture&#x27;)[0]\n    };\n    window.Store.GroupParticipants &#x3D; {\n        ...window.mR.findModule(&#x27;promoteParticipants&#x27;)[0],\n        ...window.mR.findModule(&#x27;sendAddParticipantsRPC&#x27;)[0]\n    };\n    window.Store.GroupInvite &#x3D; {\n        ...window.mR.findModule(&#x27;resetGroupInviteCode&#x27;)[0],\n        ...window.mR.findModule(&#x27;queryGroupInvite&#x27;)[0]\n    };\n    window.Store.GroupInviteV4 &#x3D; {\n        ...window.mR.findModule(&#x27;queryGroupInviteV4&#x27;)[0],\n        ...window.mR.findModule(&#x27;sendGroupInviteMessage&#x27;)[0]\n    };\n    window.Store.MembershipRequestUtils &#x3D; {\n        ...window.mR.findModule(&#x27;getMembershipApprovalRequests&#x27;)[0],\n        ...window.mR.findModule(&#x27;sendMembershipRequestsActionRPC&#x27;)[0]\n    };\n\n    if (!window.Store.Chat._find) {\n        window.Store.Chat._find &#x3D; e &#x3D;&gt; {\n            const target &#x3D; window.Store.Chat.get(e);\n            return target ? Promise.resolve(target) : Promise.resolve({\n                id: e\n            });\n        };\n    }\n    \n    // eslint-disable-next-line no-undef\n    if ((m &#x3D; window.mR.findModule(&#x27;ChatCollection&#x27;)[0]) &amp;amp;&amp;amp; m.ChatCollection &amp;amp;&amp;amp; typeof m.ChatCollection.findImpl &#x3D;&#x3D;&#x3D; &#x27;undefined&#x27; &amp;amp;&amp;amp; typeof m.ChatCollection._find !&#x3D;&#x3D; &#x27;undefined&#x27;) m.ChatCollection.findImpl &#x3D; m.ChatCollection._find;\n\n    const _isMDBackend &#x3D; window.mR.findModule(&#x27;isMDBackend&#x27;);\n    if(_isMDBackend &amp;amp;&amp;amp; _isMDBackend[0] &amp;amp;&amp;amp; _isMDBackend[0].isMDBackend) {\n        window.Store.MDBackend &#x3D; _isMDBackend[0].isMDBackend();\n    } else {\n        window.Store.MDBackend &#x3D; true;\n    }\n\n    const _features &#x3D; window.mR.findModule(&#x27;FEATURE_CHANGE_EVENT&#x27;)[0];\n    if(_features) {\n        window.Store.Features &#x3D; _features.LegacyPhoneFeatures;\n    }\n\n    /**\n     * Target options object description\n     * @typedef {Object} TargetOptions\n     * @property {string|number} module The name or a key of the target module to search\n     * @property {number} index The index value of the target module\n     * @property {string} function The function name to get from a module\n     */\n\n    /**\n     * Function to modify functions\n     * @param {TargetOptions} target Options specifying the target function to search for modifying\n     * @param {Function} callback Modified function\n     */\n    window.injectToFunction &#x3D; (target, callback) &#x3D;&gt; {\n        const module &#x3D; typeof target.module &#x3D;&#x3D;&#x3D; &#x27;string&#x27;\n            ? window.mR.findModule(target.module)\n            : window.mR.modules[target.module];\n        const originalFunction &#x3D; module[target.index][target.function];\n        const modifiedFunction &#x3D; (...args) &#x3D;&gt; callback(originalFunction, ...args);\n        module[target.index][target.function] &#x3D; modifiedFunction;\n    };\n\n    window.injectToFunction({ module: &#x27;mediaTypeFromProtobuf&#x27;, index: 0, function: &#x27;mediaTypeFromProtobuf&#x27; }, (func, ...args) &#x3D;&gt; { const [proto] &#x3D; args; return proto.locationMessage ? null : func(...args); });\n\n    window.injectToFunction({ module: &#x27;typeAttributeFromProtobuf&#x27;, index: 0, function: &#x27;typeAttributeFromProtobuf&#x27; }, (func, ...args) &#x3D;&gt; { const [proto] &#x3D; args; return proto.locationMessage || proto.groupInviteMessage ? &#x27;text&#x27; : func(...args); });\n};</code></pre>\n          </article>\n        </div>\n      </div>\n      <nav id=\"jsdoc-toc-nav\" role=\"navigation\"></nav>\n    </div>\n  </div>\n  <footer id=\"jsdoc-footer\" class=\"jsdoc-footer\">\n    <div id=\"jsdoc-footer-container\">\n      <p>\n        Generated by <a href=\"https://github.com/jsdoc3/jsdoc\">JSDoc</a> 3.6.11 on January 30, 2026.\n      </p>\n    </div>\n  </footer>\n  <script src=\"scripts/jquery.min.js\"></script>\n  <script src=\"scripts/tree.jquery.js\"></script>\n  <script src=\"scripts/prettify.js\"></script>\n  <script src=\"scripts/jsdoc-toc.js\"></script>\n  <script src=\"scripts/linenumber.js\"></script>\n  <script src=\"scripts/scrollanchor.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "docs/util_Injected_Store.js.html",
    "content": "<!doctype html>\n<html>\n\n<head>\n  <meta name=\"generator\" content=\"JSDoc 3.6.11\">\n  <meta charset=\"utf-8\">\n  <title>whatsapp-web.js 1.34.6 &raquo; Source: util/Injected/Store.js</title>\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Karla:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Noto+Serif:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Inconsolata:500\" type=\"text/css\">\n  <link href=\"css/baseline.css\" rel=\"stylesheet\">\n</head>\n\n<body onload=\"prettyPrint()\">\n  <nav id=\"jsdoc-navbar\" role=\"navigation\" class=\"jsdoc-navbar\">\n    <div id=\"jsdoc-navbar-container\">\n      <div id=\"jsdoc-navbar-content\">\n        <a href=\"index.html\" class=\"jsdoc-navbar-package-name\">whatsapp-web.<wbr>js 1.<wbr>34.<wbr>6</a>\n      </div>\n    </div>\n  </nav>\n  <div id=\"jsdoc-body-container\">\n    <div id=\"jsdoc-content\">\n      <div id=\"jsdoc-content-container\">\n        <div id=\"jsdoc-banner\" role=\"banner\">\n        </div>\n        <div id=\"jsdoc-main\" role=\"main\">\n          <header class=\"page-header\">\n            <h1>Source: util/Injected/Store.js</h1>\n          </header>\n          <article>\n            <pre class=\"prettyprint linenums\"><code>&#x27;use strict&#x27;;\n\nexports.ExposeStore &#x3D; () &#x3D;&gt; {\n    /**\n     * Helper function that compares between two WWeb versions. Its purpose is to help the developer to choose the correct code implementation depending on the comparison value and the WWeb version.\n     * @param {string} lOperand The left operand for the WWeb version string to compare with\n     * @param {string} operator The comparison operator\n     * @param {string} rOperand The right operand for the WWeb version string to compare with\n     * @returns {boolean} Boolean value that indicates the result of the comparison\n     */\n    window.compareWwebVersions &#x3D; (lOperand, operator, rOperand) &#x3D;&gt; {\n        if (![&#x27;&gt;&#x27;, &#x27;&gt;&#x3D;&#x27;, &#x27;&amp;lt;&#x27;, &#x27;&amp;lt;&#x3D;&#x27;, &#x27;&#x3D;&#x27;].includes(operator)) {\n            throw new class _ extends Error {\n                constructor(m) { super(m); this.name &#x3D; &#x27;CompareWwebVersionsError&#x27;; }\n            }(&#x27;Invalid comparison operator is provided&#x27;);\n\n        }\n        if (typeof lOperand !&#x3D;&#x3D; &#x27;string&#x27; || typeof rOperand !&#x3D;&#x3D; &#x27;string&#x27;) {\n            throw new class _ extends Error {\n                constructor(m) { super(m); this.name &#x3D; &#x27;CompareWwebVersionsError&#x27;; }\n            }(&#x27;A non-string WWeb version type is provided&#x27;);\n        }\n\n        lOperand &#x3D; lOperand.replace(/-beta$/, &#x27;&#x27;);\n        rOperand &#x3D; rOperand.replace(/-beta$/, &#x27;&#x27;);\n\n        while (lOperand.length !&#x3D;&#x3D; rOperand.length) {\n            lOperand.length &gt; rOperand.length\n                ? rOperand &#x3D; rOperand.concat(&#x27;0&#x27;)\n                : lOperand &#x3D; lOperand.concat(&#x27;0&#x27;);\n        }\n\n        lOperand &#x3D; Number(lOperand.replace(/\\./g, &#x27;&#x27;));\n        rOperand &#x3D; Number(rOperand.replace(/\\./g, &#x27;&#x27;));\n\n        return (\n            operator &#x3D;&#x3D;&#x3D; &#x27;&gt;&#x27; ? lOperand &gt; rOperand :\n                operator &#x3D;&#x3D;&#x3D; &#x27;&gt;&#x3D;&#x27; ? lOperand &gt;&#x3D; rOperand :\n                    operator &#x3D;&#x3D;&#x3D; &#x27;&amp;lt;&#x27; ? lOperand &amp;lt; rOperand :\n                        operator &#x3D;&#x3D;&#x3D; &#x27;&amp;lt;&#x3D;&#x27; ? lOperand &amp;lt;&#x3D; rOperand :\n                            operator &#x3D;&#x3D;&#x3D; &#x27;&#x3D;&#x27; ? lOperand &#x3D;&#x3D;&#x3D; rOperand :\n                                false\n        );\n    };\n\n    window.Store &#x3D; Object.assign({}, window.require(&#x27;WAWebCollections&#x27;));\n    window.Store.AppState &#x3D; window.require(&#x27;WAWebSocketModel&#x27;).Socket;\n    window.Store.BlockContact &#x3D; window.require(&#x27;WAWebBlockContactAction&#x27;);\n    window.Store.Conn &#x3D; window.require(&#x27;WAWebConnModel&#x27;).Conn;\n    window.Store.Cmd &#x3D; window.require(&#x27;WAWebCmd&#x27;).Cmd;\n    window.Store.DownloadManager &#x3D; window.require(&#x27;WAWebDownloadManager&#x27;).downloadManager;\n    window.Store.GroupQueryAndUpdate &#x3D; window.require(&#x27;WAWebGroupQueryJob&#x27;).queryAndUpdateGroupMetadataById;\n    window.Store.MediaPrep &#x3D; window.require(&#x27;WAWebPrepRawMedia&#x27;);\n    window.Store.MediaObject &#x3D; window.require(&#x27;WAWebMediaStorage&#x27;);\n    window.Store.MediaTypes &#x3D; window.require(&#x27;WAWebMmsMediaTypes&#x27;);\n    window.Store.MediaUpload &#x3D; {\n        ...window.require(&#x27;WAWebMediaMmsV4Upload&#x27;),\n        ...window.require(&#x27;WAWebStartMediaUploadQpl&#x27;)\n    };\n    window.Store.MediaUpdate &#x3D; window.require(&#x27;WAWebMediaUpdateMsg&#x27;);\n    window.Store.MsgKey &#x3D; window.require(&#x27;WAWebMsgKey&#x27;);\n    window.Store.OpaqueData &#x3D; window.require(&#x27;WAWebMediaOpaqueData&#x27;);\n    window.Store.QueryProduct &#x3D; window.require(&#x27;WAWebBizProductCatalogBridge&#x27;);\n    window.Store.QueryOrder &#x3D; window.require(&#x27;WAWebBizOrderBridge&#x27;);\n    window.Store.SendClear &#x3D; window.require(&#x27;WAWebChatClearBridge&#x27;);\n    window.Store.SendDelete &#x3D; window.require(&#x27;WAWebDeleteChatAction&#x27;);\n    window.Store.SendMessage &#x3D; window.require(&#x27;WAWebSendMsgChatAction&#x27;);\n    window.Store.EditMessage &#x3D; window.require(&#x27;WAWebSendMessageEditAction&#x27;);\n    window.Store.MediaDataUtils &#x3D; window.require(&#x27;WAWebMediaDataUtils&#x27;);\n    window.Store.BlobCache &#x3D; window.require(&#x27;WAWebMediaInMemoryBlobCache&#x27;);\n    window.Store.SendSeen &#x3D; window.require(&#x27;WAWebUpdateUnreadChatAction&#x27;);\n    window.Store.User &#x3D; window.require(&#x27;WAWebUserPrefsMeUser&#x27;);\n    window.Store.ContactMethods &#x3D; {\n        ...window.require(&#x27;WAWebContactGetters&#x27;),\n        ...window.require(&#x27;WAWebFrontendContactGetters&#x27;)\n    };\n    window.Store.UserConstructor &#x3D; window.require(&#x27;WAWebWid&#x27;);\n    window.Store.Validators &#x3D; window.require(&#x27;WALinkify&#x27;);\n    window.Store.WidFactory &#x3D; window.require(&#x27;WAWebWidFactory&#x27;);\n    window.Store.ProfilePic &#x3D; window.require(&#x27;WAWebContactProfilePicThumbBridge&#x27;);\n    window.Store.PresenceUtils &#x3D; window.require(&#x27;WAWebPresenceChatAction&#x27;);\n    window.Store.ChatState &#x3D; window.require(&#x27;WAWebChatStateBridge&#x27;);\n    window.Store.findCommonGroups &#x3D; window.require(&#x27;WAWebFindCommonGroupsContactAction&#x27;).findCommonGroups;\n    window.Store.ConversationMsgs &#x3D; window.require(&#x27;WAWebChatLoadMessages&#x27;);\n    window.Store.sendReactionToMsg &#x3D; window.require(&#x27;WAWebSendReactionMsgAction&#x27;).sendReactionToMsg;\n    window.Store.createOrUpdateReactionsModule &#x3D; window.require(&#x27;WAWebDBCreateOrUpdateReactions&#x27;);\n    window.Store.EphemeralFields &#x3D; window.require(&#x27;WAWebGetEphemeralFieldsMsgActionsUtils&#x27;);\n    window.Store.MsgActionChecks &#x3D; window.require(&#x27;WAWebMsgActionCapability&#x27;);\n    window.Store.QuotedMsg &#x3D; window.require(&#x27;WAWebQuotedMsgModelUtils&#x27;);\n    window.Store.LinkPreview &#x3D; window.require(&#x27;WAWebLinkPreviewChatAction&#x27;);\n    window.Store.Socket &#x3D; window.require(&#x27;WADeprecatedSendIq&#x27;);\n    window.Store.SocketWap &#x3D; window.require(&#x27;WAWap&#x27;);\n    window.Store.SearchContext &#x3D; window.require(&#x27;WAWebChatMessageSearch&#x27;);\n    window.Store.DrawerManager &#x3D; window.require(&#x27;WAWebDrawerManager&#x27;).DrawerManager;\n    window.Store.LidUtils &#x3D; window.require(&#x27;WAWebApiContact&#x27;);\n    window.Store.WidToJid &#x3D; window.require(&#x27;WAWebWidToJid&#x27;);\n    window.Store.JidToWid &#x3D; window.require(&#x27;WAWebJidToWid&#x27;);\n    window.Store.getMsgInfo &#x3D; window.require(&#x27;WAWebApiMessageInfoStore&#x27;).queryMsgInfo;\n    window.Store.QueryExist &#x3D; window.require(&#x27;WAWebQueryExistsJob&#x27;).queryWidExists;\n    window.Store.ReplyUtils &#x3D; window.require(&#x27;WAWebMsgReply&#x27;);\n    window.Store.BotSecret &#x3D; window.require(&#x27;WAWebBotMessageSecret&#x27;);\n    window.Store.BotProfiles &#x3D; window.require(&#x27;WAWebBotProfileCollection&#x27;);\n    window.Store.ContactCollection &#x3D; window.require(&#x27;WAWebContactCollection&#x27;).ContactCollection;\n    window.Store.DeviceList &#x3D; window.require(&#x27;WAWebApiDeviceList&#x27;);\n    window.Store.HistorySync &#x3D; window.require(&#x27;WAWebSendNonMessageDataRequest&#x27;);\n    window.Store.AddonReactionTable &#x3D; window.require(&#x27;WAWebAddonReactionTableMode&#x27;).reactionTableMode;\n    window.Store.AddonPollVoteTable &#x3D; window.require(&#x27;WAWebAddonPollVoteTableMode&#x27;).pollVoteTableMode;\n    window.Store.ChatGetters &#x3D; window.require(&#x27;WAWebChatGetters&#x27;);\n    window.Store.UploadUtils &#x3D; window.require(&#x27;WAWebUploadManager&#x27;);\n    window.Store.WAWebStreamModel &#x3D; window.require(&#x27;WAWebStreamModel&#x27;);\n    window.Store.FindOrCreateChat &#x3D; window.require(&#x27;WAWebFindChatAction&#x27;);\n    window.Store.CustomerNoteUtils &#x3D; window.require(&#x27;WAWebNoteAction&#x27;);\n    window.Store.BusinessGatingUtils &#x3D; window.require(&#x27;WAWebBizGatingUtils&#x27;);\n    window.Store.PollsVotesSchema &#x3D; window.require(&#x27;WAWebPollsVotesSchema&#x27;);\n    window.Store.PollsSendVote &#x3D; window.require(&#x27;WAWebPollsSendVoteMsgAction&#x27;);\n\n    window.Store.Settings &#x3D; {\n        ...window.require(&#x27;WAWebUserPrefsGeneral&#x27;),\n        ...window.require(&#x27;WAWebUserPrefsNotifications&#x27;),\n        setPushname: window.require(&#x27;WAWebSetPushnameConnAction&#x27;).setPushname\n    };\n    window.Store.NumberInfo &#x3D; {\n        ...window.require(&#x27;WAPhoneUtils&#x27;),\n        ...window.require(&#x27;WAPhoneFindCC&#x27;)\n    };\n    window.Store.ForwardUtils &#x3D; {\n        ...window.require(&#x27;WAWebChatForwardMessage&#x27;)\n    };\n    window.Store.PinnedMsgUtils &#x3D; {\n        ...window.require(&#x27;WAWebPinInChatSchema&#x27;),\n        ...window.require(&#x27;WAWebSendPinMessageAction&#x27;)\n    };\n    window.Store.ScheduledEventMsgUtils &#x3D; {\n        ...window.require(&#x27;WAWebGenerateEventCallLink&#x27;),\n        ...window.require(&#x27;WAWebSendEventEditMsgAction&#x27;),\n        ...window.require(&#x27;WAWebSendEventResponseMsgAction&#x27;)\n    };\n    window.Store.VCard &#x3D; {\n        ...window.require(&#x27;WAWebFrontendVcardUtils&#x27;),\n        ...window.require(&#x27;WAWebVcardParsingUtils&#x27;),\n        ...window.require(&#x27;WAWebVcardGetNameFromParsed&#x27;)\n    };\n    window.Store.StickerTools &#x3D; {\n        ...window.require(&#x27;WAWebImageUtils&#x27;),\n        ...window.require(&#x27;WAWebAddWebpMetadata&#x27;)\n    };\n    window.Store.GroupUtils &#x3D; {\n        ...window.require(&#x27;WAWebGroupCreateJob&#x27;),\n        ...window.require(&#x27;WAWebGroupModifyInfoJob&#x27;),\n        ...window.require(&#x27;WAWebExitGroupAction&#x27;),\n        ...window.require(&#x27;WAWebContactProfilePicThumbBridge&#x27;),\n        ...window.require(&#x27;WAWebSetPropertyGroupAction&#x27;)\n    };\n    window.Store.GroupParticipants &#x3D; {\n        ...window.require(&#x27;WAWebModifyParticipantsGroupAction&#x27;),\n        ...window.require(&#x27;WASmaxGroupsAddParticipantsRPC&#x27;)\n    };\n    window.Store.GroupInvite &#x3D; {\n        ...window.require(&#x27;WAWebGroupInviteJob&#x27;),\n        ...window.require(&#x27;WAWebGroupQueryJob&#x27;),\n        ...window.require(&#x27;WAWebMexFetchGroupInviteCodeJob&#x27;)\n    };\n    window.Store.GroupInviteV4 &#x3D; {\n        ...window.require(&#x27;WAWebGroupInviteV4Job&#x27;),\n        ...window.require(&#x27;WAWebChatSendMessages&#x27;)\n    };\n    window.Store.MembershipRequestUtils &#x3D; {\n        ...window.require(&#x27;WAWebApiMembershipApprovalRequestStore&#x27;),\n        ...window.require(&#x27;WASmaxGroupsMembershipRequestsActionRPC&#x27;)\n    };\n    window.Store.ChannelUtils &#x3D; {\n        ...window.require(&#x27;WAWebLoadNewsletterPreviewChatAction&#x27;),\n        ...window.require(&#x27;WAWebNewsletterMetadataQueryJob&#x27;),\n        ...window.require(&#x27;WAWebNewsletterCreateQueryJob&#x27;),\n        ...window.require(&#x27;WAWebEditNewsletterMetadataAction&#x27;),\n        ...window.require(&#x27;WAWebNewsletterDeleteAction&#x27;),\n        ...window.require(&#x27;WAWebNewsletterSubscribeAction&#x27;),\n        ...window.require(&#x27;WAWebNewsletterUnsubscribeAction&#x27;),\n        ...window.require(&#x27;WAWebNewsletterDirectorySearchAction&#x27;),\n        ...window.require(&#x27;WAWebNewsletterGatingUtils&#x27;),\n        ...window.require(&#x27;WAWebNewsletterModelUtils&#x27;),\n        ...window.require(&#x27;WAWebMexAcceptNewsletterAdminInviteJob&#x27;),\n        ...window.require(&#x27;WAWebMexRevokeNewsletterAdminInviteJob&#x27;),\n        ...window.require(&#x27;WAWebChangeNewsletterOwnerAction&#x27;),\n        ...window.require(&#x27;WAWebDemoteNewsletterAdminAction&#x27;),\n        ...window.require(&#x27;WAWebNewsletterDemoteAdminJob&#x27;),\n        countryCodesIso: window.require(&#x27;WAWebCountriesNativeCountryNames&#x27;),\n        currentRegion: window.require(&#x27;WAWebL10N&#x27;).getRegion(),\n    };\n    window.Store.SendChannelMessage &#x3D; {\n        ...window.require(&#x27;WAWebNewsletterUpdateMsgsRecordsJob&#x27;),\n        ...window.require(&#x27;WAWebMsgDataFromModel&#x27;),\n        ...window.require(&#x27;WAWebNewsletterSendMessageJob&#x27;),\n        ...window.require(&#x27;WAWebNewsletterSendMsgAction&#x27;),\n        ...window.require(&#x27;WAMediaCalculateFilehash&#x27;)\n    };\n    window.Store.ChannelSubscribers &#x3D; {\n        ...window.require(&#x27;WAWebMexFetchNewsletterSubscribersJob&#x27;),\n        ...window.require(&#x27;WAWebNewsletterSubscriberListAction&#x27;)\n    };\n    window.Store.AddressbookContactUtils &#x3D; {\n        ...window.require(&#x27;WAWebSaveContactAction&#x27;),\n        ...window.require(&#x27;WAWebDeleteContactAction&#x27;)\n    };\n    window.Store.StatusUtils &#x3D; {\n        ...window.require(&#x27;WAWebContactStatusBridge&#x27;),\n        ...window.require(&#x27;WAWebSendStatusMsgAction&#x27;),\n        ...window.require(&#x27;WAWebRevokeStatusAction&#x27;),\n        ...window.require(&#x27;WAWebStatusGatingUtils&#x27;)\n    };\n\n    if (!window.Store.Chat._find || !window.Store.Chat.findImpl) {\n        window.Store.Chat._find &#x3D; e &#x3D;&gt; {\n            const target &#x3D; window.Store.Chat.get(e);\n            return target ? Promise.resolve(target) : Promise.resolve({\n                id: e\n            });\n        };\n        window.Store.Chat.findImpl &#x3D; window.Store.Chat._find;\n    }\n\n    /**\n     * Target options object description\n     * @typedef {Object} TargetOptions\n     * @property {string|number} module The target module\n     * @property {string} function The function name to get from a module\n     */\n    /**\n     * Function to modify functions\n     * @param {TargetOptions} target Options specifying the target function to search for modifying\n     * @param {Function} callback Modified function\n     */\n    window.injectToFunction &#x3D; (target, callback) &#x3D;&gt; {\n        try {\n            let module &#x3D; window.require(target.module);\n            if (!module) return; \n\n            const path &#x3D; target.function.split(&#x27;.&#x27;);\n            const funcName &#x3D; path.pop();\n\n            for (const key of path) {\n                if (!module[key]) return;\n                module &#x3D; module[key];\n            }\n\n            const originalFunction &#x3D; module[funcName];\n            if (typeof originalFunction !&#x3D;&#x3D; &#x27;function&#x27;) return;\n\n            module[funcName] &#x3D; (...args) &#x3D;&gt; {\n                try {\n                    return callback(originalFunction, ...args);\n                } catch {\n                    return originalFunction(...args);\n                }\n            };\n\n        } catch {\n            return;\n        }\n    };\n\n    window.injectToFunction({ module: &#x27;WAWebBackendJobsCommon&#x27;, function: &#x27;mediaTypeFromProtobuf&#x27; }, (func, ...args) &#x3D;&gt; { const [proto] &#x3D; args; return proto.locationMessage ? null : func(...args); });\n\n    window.injectToFunction({ module: &#x27;WAWebE2EProtoUtils&#x27;, function: &#x27;typeAttributeFromProtobuf&#x27; }, (func, ...args) &#x3D;&gt; { const [proto] &#x3D; args; return proto.locationMessage || proto.groupInviteMessage ? &#x27;text&#x27; : func(...args); });\n};\n</code></pre>\n          </article>\n        </div>\n      </div>\n      <nav id=\"jsdoc-toc-nav\" role=\"navigation\"></nav>\n    </div>\n  </div>\n  <footer id=\"jsdoc-footer\" class=\"jsdoc-footer\">\n    <div id=\"jsdoc-footer-container\">\n      <p>\n        Generated by <a href=\"https://github.com/jsdoc3/jsdoc\">JSDoc</a> 3.6.11 on January 30, 2026.\n      </p>\n    </div>\n  </footer>\n  <script src=\"scripts/jquery.min.js\"></script>\n  <script src=\"scripts/tree.jquery.js\"></script>\n  <script src=\"scripts/prettify.js\"></script>\n  <script src=\"scripts/jsdoc-toc.js\"></script>\n  <script src=\"scripts/linenumber.js\"></script>\n  <script src=\"scripts/scrollanchor.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "docs/util_Injected_Utils.js.html",
    "content": "<!doctype html>\n<html>\n\n<head>\n  <meta name=\"generator\" content=\"JSDoc 3.6.11\">\n  <meta charset=\"utf-8\">\n  <title>whatsapp-web.js 1.28.1-alpha.0 &raquo; Source: util/Injected/Utils.js</title>\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Karla:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Noto+Serif:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Inconsolata:500\" type=\"text/css\">\n  <link href=\"css/baseline.css\" rel=\"stylesheet\">\n</head>\n\n<body onload=\"prettyPrint()\">\n  <nav id=\"jsdoc-navbar\" role=\"navigation\" class=\"jsdoc-navbar\">\n    <div id=\"jsdoc-navbar-container\">\n      <div id=\"jsdoc-navbar-content\">\n        <a href=\"index.html\" class=\"jsdoc-navbar-package-name\">whatsapp-web.<wbr>js 1.<wbr>28.<wbr>1-alpha.<wbr>0</a>\n      </div>\n    </div>\n  </nav>\n  <div id=\"jsdoc-body-container\">\n    <div id=\"jsdoc-content\">\n      <div id=\"jsdoc-content-container\">\n        <div id=\"jsdoc-banner\" role=\"banner\">\n        </div>\n        <div id=\"jsdoc-main\" role=\"main\">\n          <header class=\"page-header\">\n            <h1>Source: util/Injected/Utils.js</h1>\n          </header>\n          <article>\n            <pre class=\"prettyprint linenums\"><code>&#x27;use strict&#x27;;\n\nexports.LoadUtils &#x3D; () &#x3D;&gt; {\n    window.WWebJS &#x3D; {};\n\n    window.WWebJS.forwardMessage &#x3D; async (chatId, msgId) &#x3D;&gt; {\n        const msg &#x3D; window.Store.Msg.get(msgId) || (await window.Store.Msg.getMessagesById([msgId]))?.messages?.[0];\n        let chat &#x3D; window.Store.Chat.get(chatId);\n\n        if (window.compareWwebVersions(window.Debug.VERSION, &#x27;&gt;&#x27;, &#x27;2.3000.0&#x27;)) {\n            return window.Store.ForwardUtils.forwardMessagesToChats([msg], [chat], true);\n        } else {\n            return chat.forwardMessages([msg]);\n        }\n    };\n\n    window.WWebJS.sendSeen &#x3D; async (chatId) &#x3D;&gt; {\n        let chat &#x3D; window.Store.Chat.get(chatId);\n        if (chat !&#x3D;&#x3D; undefined) {\n            await window.Store.SendSeen.sendSeen(chat, false);\n            return true;\n        }\n        return false;\n\n    };\n\n    window.WWebJS.sendMessage &#x3D; async (chat, content, options &#x3D; {}) &#x3D;&gt; {\n        let attOptions &#x3D; {};\n        if (options.attachment) {\n            attOptions &#x3D; options.sendMediaAsSticker\n                ? await window.WWebJS.processStickerData(options.attachment)\n                : await window.WWebJS.processMediaData(options.attachment, {\n                    forceVoice: options.sendAudioAsVoice,\n                    forceDocument: options.sendMediaAsDocument,\n                    forceGif: options.sendVideoAsGif\n                });\n            \n            attOptions.caption &#x3D; options.caption;\n            content &#x3D; options.sendMediaAsSticker ? undefined : attOptions.preview;\n            attOptions.isViewOnce &#x3D; options.isViewOnce;\n\n            delete options.attachment;\n            delete options.sendMediaAsSticker;\n        }\n        let quotedMsgOptions &#x3D; {};\n        if (options.quotedMessageId) {\n            let quotedMessage &#x3D; await window.Store.Msg.getMessagesById([options.quotedMessageId]);\n\n            if (quotedMessage[&#x27;messages&#x27;].length &#x3D;&#x3D; 1) {\n                quotedMessage &#x3D; quotedMessage[&#x27;messages&#x27;][0];\n\n                // TODO remove .canReply() once all clients are updated to &gt;&#x3D; v2.2241.6\n                const canReply &#x3D; window.Store.ReplyUtils ?\n                    window.Store.ReplyUtils.canReplyMsg(quotedMessage.unsafe()) :\n                    quotedMessage.canReply();\n\n                if (canReply) {\n                    quotedMsgOptions &#x3D; quotedMessage.msgContextInfo(chat);\n                }\n            }else{\n                if(!options.ignoreQuoteErrors) {\n                    throw new Error(&#x27;Could not get the quoted message.&#x27;);\n                }\n            }\n            \n            delete options.ignoreQuoteErrors;\n            delete options.quotedMessageId;\n        }\n\n        if (options.mentionedJidList) {\n            options.mentionedJidList &#x3D; await Promise.all(\n                options.mentionedJidList.map(async (id) &#x3D;&gt; {\n                    const wid &#x3D; window.Store.WidFactory.createWid(id);\n                    if (await window.Store.QueryExist(wid)) {\n                        return wid;\n                    }\n                })\n            );\n            options.mentionedJidList &#x3D; options.mentionedJidList.filter(Boolean);\n        }\n\n        if (options.groupMentions) {\n            options.groupMentions &#x3D; options.groupMentions.map((e) &#x3D;&gt; ({\n                groupSubject: e.subject,\n                groupJid: window.Store.WidFactory.createWid(e.id)\n            }));\n        }\n\n        let locationOptions &#x3D; {};\n        if (options.location) {\n            let { latitude, longitude, description, url } &#x3D; options.location;\n            url &#x3D; window.Store.Validators.findLink(url)?.href;\n            url &amp;amp;&amp;amp; !description &amp;amp;&amp;amp; (description &#x3D; url);\n            locationOptions &#x3D; {\n                type: &#x27;location&#x27;,\n                loc: description,\n                lat: latitude,\n                lng: longitude,\n                clientUrl: url\n            };\n            delete options.location;\n        }\n\n        let _pollOptions &#x3D; {};\n        if (options.poll) {\n            const { pollName, pollOptions } &#x3D; options.poll;\n            const { allowMultipleAnswers, messageSecret } &#x3D; options.poll.options;\n            _pollOptions &#x3D; {\n                type: &#x27;poll_creation&#x27;,\n                pollName: pollName,\n                pollOptions: pollOptions,\n                pollSelectableOptionsCount: allowMultipleAnswers ? 0 : 1,\n                messageSecret:\n                Array.isArray(messageSecret) &amp;amp;&amp;amp; messageSecret.length &#x3D;&#x3D;&#x3D; 32\n                    ? new Uint8Array(messageSecret)\n                    : window.crypto.getRandomValues(new Uint8Array(32))\n            };\n            delete options.poll;\n        }\n\n        let vcardOptions &#x3D; {};\n        if (options.contactCard) {\n            let contact &#x3D; window.Store.Contact.get(options.contactCard);\n            vcardOptions &#x3D; {\n                body: window.Store.VCard.vcardFromContactModel(contact).vcard,\n                type: &#x27;vcard&#x27;,\n                vcardFormattedName: contact.formattedName\n            };\n            delete options.contactCard;\n        } else if (options.contactCardList) {\n            let contacts &#x3D; options.contactCardList.map(c &#x3D;&gt; window.Store.Contact.get(c));\n            let vcards &#x3D; contacts.map(c &#x3D;&gt; window.Store.VCard.vcardFromContactModel(c));\n            vcardOptions &#x3D; {\n                type: &#x27;multi_vcard&#x27;,\n                vcardList: vcards,\n                body: undefined\n            };\n            delete options.contactCardList;\n        } else if (options.parseVCards &amp;amp;&amp;amp; typeof (content) &#x3D;&#x3D;&#x3D; &#x27;string&#x27; &amp;amp;&amp;amp; content.startsWith(&#x27;BEGIN:VCARD&#x27;)) {\n            delete options.parseVCards;\n            try {\n                const parsed &#x3D; window.Store.VCard.parseVcard(content);\n                if (parsed) {\n                    vcardOptions &#x3D; {\n                        type: &#x27;vcard&#x27;,\n                        vcardFormattedName: window.Store.VCard.vcardGetNameFromParsed(parsed)\n                    };\n                }\n            } catch (_) {\n                // not a vcard\n            }\n        }\n\n        if (options.linkPreview) {\n            delete options.linkPreview;\n            const link &#x3D; window.Store.Validators.findLink(content);\n            if (link) {\n                let preview &#x3D; await window.Store.LinkPreview.getLinkPreview(link);\n                if (preview &amp;amp;&amp;amp; preview.data) {\n                    preview &#x3D; preview.data;\n                    preview.preview &#x3D; true;\n                    preview.subtype &#x3D; &#x27;url&#x27;;\n                    options &#x3D; {...options, ...preview};\n                }\n            }\n        }\n        \n        let buttonOptions &#x3D; {};\n        if(options.buttons){\n            let caption;\n            if (options.buttons.type &#x3D;&#x3D;&#x3D; &#x27;chat&#x27;) {\n                content &#x3D; options.buttons.body;\n                caption &#x3D; content;\n            } else {\n                caption &#x3D; options.caption ? options.caption : &#x27; &#x27;; //Caption can&#x27;t be empty\n            }\n            buttonOptions &#x3D; {\n                productHeaderImageRejected: false,\n                isFromTemplate: false,\n                isDynamicReplyButtonsMsg: true,\n                title: options.buttons.title ? options.buttons.title : undefined,\n                footer: options.buttons.footer ? options.buttons.footer : undefined,\n                dynamicReplyButtons: options.buttons.buttons,\n                replyButtons: options.buttons.buttons,\n                caption: caption\n            };\n            delete options.buttons;\n        }\n\n        let listOptions &#x3D; {};\n        if (options.list) {\n            if (window.Store.Conn.platform &#x3D;&#x3D;&#x3D; &#x27;smba&#x27; || window.Store.Conn.platform &#x3D;&#x3D;&#x3D; &#x27;smbi&#x27;) {\n                throw &#x27;[LT01] Whatsapp business can\\&#x27;t send this yet&#x27;;\n            }\n            listOptions &#x3D; {\n                type: &#x27;list&#x27;,\n                footer: options.list.footer,\n                list: {\n                    ...options.list,\n                    listType: 1\n                },\n                body: options.list.description\n            };\n            delete options.list;\n            delete listOptions.list.footer;\n        }\n\n        const botOptions &#x3D; {};\n        if (options.invokedBotWid) {\n            botOptions.messageSecret &#x3D; window.crypto.getRandomValues(new Uint8Array(32));\n            botOptions.botMessageSecret &#x3D; await window.Store.BotSecret.genBotMsgSecretFromMsgSecret(botOptions.messageSecret);\n            botOptions.invokedBotWid &#x3D; window.Store.WidFactory.createWid(options.invokedBotWid);\n            botOptions.botPersonaId &#x3D; window.Store.BotProfiles.BotProfileCollection.get(options.invokedBotWid).personaId;\n            delete options.invokedBotWid;\n        }\n\n        let meUser &#x3D; window.Store.User.getMaybeMeUser();\n        const newId &#x3D; await window.Store.MsgKey.newId();\n\n        if (chat.id.isGroup() &amp;amp;&amp;amp; chat.groupMetadata.isLidAddressingMode) {\n            meUser &#x3D; window.Store.User.getMaybeMeLidUser();\n        }\n        \n        const newMsgId &#x3D; new window.Store.MsgKey({\n            from: meUser,\n            to: chat.id,\n            id: newId,\n            participant: chat.id.isGroup() ? meUser : undefined,\n            selfDir: &#x27;out&#x27;,\n        });\n\n        const extraOptions &#x3D; options.extraOptions || {};\n        delete options.extraOptions;\n\n        const ephemeralFields &#x3D; window.Store.EphemeralFields.getEphemeralFields(chat);\n\n        const message &#x3D; {\n            ...options,\n            id: newMsgId,\n            ack: 0,\n            body: content,\n            from: meUser,\n            to: chat.id,\n            local: true,\n            self: &#x27;out&#x27;,\n            t: parseInt(new Date().getTime() / 1000),\n            isNewMsg: true,\n            type: &#x27;chat&#x27;,\n            ...ephemeralFields,\n            ...locationOptions,\n            ..._pollOptions,\n            ...attOptions,\n            ...(attOptions.toJSON ? attOptions.toJSON() : {}),\n            ...quotedMsgOptions,\n            ...vcardOptions,\n            ...buttonOptions,\n            ...listOptions,\n            ...botOptions,\n            ...extraOptions\n        };\n        \n        // Bot&#x27;s won&#x27;t reply if canonicalUrl is set (linking)\n        if (botOptions) {\n            delete message.canonicalUrl;\n        }\n\n        await window.Store.SendMessage.addAndSendMsgToChat(chat, message);\n        return window.Store.Msg.get(newMsgId._serialized);\n    };\n\t\n    window.WWebJS.editMessage &#x3D; async (msg, content, options &#x3D; {}) &#x3D;&gt; {\n\n        const extraOptions &#x3D; options.extraOptions || {};\n        delete options.extraOptions;\n        \n        if (options.mentionedJidList) {\n            options.mentionedJidList &#x3D; await Promise.all(\n                options.mentionedJidList.map(async (id) &#x3D;&gt; {\n                    const wid &#x3D; window.Store.WidFactory.createWid(id);\n                    if (await window.Store.QueryExist(wid)) {\n                        return wid;\n                    }\n                })\n            );\n            options.mentionedJidList &#x3D; options.mentionedJidList.filter(Boolean);\n        }\n\n        if (options.groupMentions) {\n            options.groupMentions &#x3D; options.groupMentions.map((e) &#x3D;&gt; ({\n                groupSubject: e.subject,\n                groupJid: window.Store.WidFactory.createWid(e.id)\n            }));\n        }\n\n        if (options.linkPreview) {\n            delete options.linkPreview;\n            const link &#x3D; window.Store.Validators.findLink(content);\n            if (link) {\n                const preview &#x3D; await window.Store.LinkPreview.getLinkPreview(link);\n                preview.preview &#x3D; true;\n                preview.subtype &#x3D; &#x27;url&#x27;;\n                options &#x3D; { ...options, ...preview };\n            }\n        }\n\n\n        const internalOptions &#x3D; {\n            ...options,\n            ...extraOptions\n        };\n\n        await window.Store.EditMessage.sendMessageEdit(msg, content, internalOptions);\n        return window.Store.Msg.get(msg.id._serialized);\n    };\n\n    window.WWebJS.toStickerData &#x3D; async (mediaInfo) &#x3D;&gt; {\n        if (mediaInfo.mimetype &#x3D;&#x3D; &#x27;image/webp&#x27;) return mediaInfo;\n\n        const file &#x3D; window.WWebJS.mediaInfoToFile(mediaInfo);\n        const webpSticker &#x3D; await window.Store.StickerTools.toWebpSticker(file);\n        const webpBuffer &#x3D; await webpSticker.arrayBuffer();\n        const data &#x3D; window.WWebJS.arrayBufferToBase64(webpBuffer);\n\n        return {\n            mimetype: &#x27;image/webp&#x27;,\n            data\n        };\n    };\n\n    window.WWebJS.processStickerData &#x3D; async (mediaInfo) &#x3D;&gt; {\n        if (mediaInfo.mimetype !&#x3D;&#x3D; &#x27;image/webp&#x27;) throw new Error(&#x27;Invalid media type&#x27;);\n\n        const file &#x3D; window.WWebJS.mediaInfoToFile(mediaInfo);\n        let filehash &#x3D; await window.WWebJS.getFileHash(file);\n        let mediaKey &#x3D; await window.WWebJS.generateHash(32);\n\n        const controller &#x3D; new AbortController();\n        const uploadedInfo &#x3D; await window.Store.UploadUtils.encryptAndUpload({\n            blob: file,\n            type: &#x27;sticker&#x27;,\n            signal: controller.signal,\n            mediaKey\n        });\n\n        const stickerInfo &#x3D; {\n            ...uploadedInfo,\n            clientUrl: uploadedInfo.url,\n            deprecatedMms3Url: uploadedInfo.url,\n            uploadhash: uploadedInfo.encFilehash,\n            size: file.size,\n            type: &#x27;sticker&#x27;,\n            filehash\n        };\n\n        return stickerInfo;\n    };\n\n    window.WWebJS.processMediaData &#x3D; async (mediaInfo, { forceVoice, forceDocument, forceGif }) &#x3D;&gt; {\n        const file &#x3D; window.WWebJS.mediaInfoToFile(mediaInfo);\n        const mData &#x3D; await window.Store.OpaqueData.createFromData(file, file.type);\n        const mediaPrep &#x3D; window.Store.MediaPrep.prepRawMedia(mData, { asDocument: forceDocument });\n        const mediaData &#x3D; await mediaPrep.waitForPrep();\n        const mediaObject &#x3D; window.Store.MediaObject.getOrCreateMediaObject(mediaData.filehash);\n\n        const mediaType &#x3D; window.Store.MediaTypes.msgToMediaType({\n            type: mediaData.type,\n            isGif: mediaData.isGif\n        });\n\n        if (forceVoice &amp;amp;&amp;amp; mediaData.type &#x3D;&#x3D;&#x3D; &#x27;audio&#x27;) {\n            mediaData.type &#x3D; &#x27;ptt&#x27;;\n            const waveform &#x3D; mediaObject.contentInfo.waveform;\n            mediaData.waveform &#x3D;\n                waveform ?? await window.WWebJS.generateWaveform(file);\n        }\n\n        if (forceGif &amp;amp;&amp;amp; mediaData.type &#x3D;&#x3D;&#x3D; &#x27;video&#x27;) {\n            mediaData.isGif &#x3D; true;\n        }\n\n        if (forceDocument) {\n            mediaData.type &#x3D; &#x27;document&#x27;;\n        }\n\n        if (!(mediaData.mediaBlob instanceof window.Store.OpaqueData)) {\n            mediaData.mediaBlob &#x3D; await window.Store.OpaqueData.createFromData(mediaData.mediaBlob, mediaData.mediaBlob.type);\n        }\n\n        mediaData.renderableUrl &#x3D; mediaData.mediaBlob.url();\n        mediaObject.consolidate(mediaData.toJSON());\n        mediaData.mediaBlob.autorelease();\n\n        const uploadedMedia &#x3D; await window.Store.MediaUpload.uploadMedia({\n            mimetype: mediaData.mimetype,\n            mediaObject,\n            mediaType\n        });\n\n        const mediaEntry &#x3D; uploadedMedia.mediaEntry;\n        if (!mediaEntry) {\n            throw new Error(&#x27;upload failed: media entry was not created&#x27;);\n        }\n\n        mediaData.set({\n            clientUrl: mediaEntry.mmsUrl,\n            deprecatedMms3Url: mediaEntry.deprecatedMms3Url,\n            directPath: mediaEntry.directPath,\n            mediaKey: mediaEntry.mediaKey,\n            mediaKeyTimestamp: mediaEntry.mediaKeyTimestamp,\n            filehash: mediaObject.filehash,\n            encFilehash: mediaEntry.encFilehash,\n            uploadhash: mediaEntry.uploadHash,\n            size: mediaObject.size,\n            streamingSidecar: mediaEntry.sidecar,\n            firstFrameSidecar: mediaEntry.firstFrameSidecar\n        });\n\n        return mediaData;\n    };\n\n    window.WWebJS.getMessageModel &#x3D; message &#x3D;&gt; {\n        const msg &#x3D; message.serialize();\n\n        msg.isEphemeral &#x3D; message.isEphemeral;\n        msg.isStatusV3 &#x3D; message.isStatusV3;\n        msg.links &#x3D; (window.Store.Validators.findLinks(message.mediaObject ? message.caption : message.body)).map((link) &#x3D;&gt; ({\n            link: link.href,\n            isSuspicious: Boolean(link.suspiciousCharacters &amp;amp;&amp;amp; link.suspiciousCharacters.size)\n        }));\n\n        if (msg.buttons) {\n            msg.buttons &#x3D; msg.buttons.serialize();\n        }\n        if (msg.dynamicReplyButtons) {\n            msg.dynamicReplyButtons &#x3D; JSON.parse(JSON.stringify(msg.dynamicReplyButtons));\n        }\n        if (msg.replyButtons) {\n            msg.replyButtons &#x3D; JSON.parse(JSON.stringify(msg.replyButtons));\n        }\n\n        if (typeof msg.id.remote &#x3D;&#x3D;&#x3D; &#x27;object&#x27;) {\n            msg.id &#x3D; Object.assign({}, msg.id, { remote: msg.id.remote._serialized });\n        }\n\n        delete msg.pendingAckUpdate;\n\n        return msg;\n    };\n\n    window.WWebJS.getPollVoteModel &#x3D; async (vote) &#x3D;&gt; {\n        const _vote &#x3D; vote.serialize();\n        if (!vote.parentMsgKey) return null;\n        const msg &#x3D;\n            window.Store.Msg.get(vote.parentMsgKey) || (await window.Store.Msg.getMessagesById([vote.parentMsgKey]))?.messages?.[0];\n        msg &amp;amp;&amp;amp; (_vote.parentMessage &#x3D; window.WWebJS.getMessageModel(msg));\n        return _vote;\n    };\n\n    window.WWebJS.getChatModel &#x3D; async chat &#x3D;&gt; {\n\n        let res &#x3D; chat.serialize();\n        res.isGroup &#x3D; false;\n        res.formattedTitle &#x3D; chat.formattedTitle;\n        res.isMuted &#x3D; chat.mute?.expiration !&#x3D;&#x3D; 0;\n\n        if (chat.groupMetadata) {\n            res.isGroup &#x3D; true;\n            const chatWid &#x3D; window.Store.WidFactory.createWid((chat.id._serialized));\n            await window.Store.GroupMetadata.update(chatWid);\n            res.groupMetadata &#x3D; chat.groupMetadata.serialize();\n            res.isReadOnly &#x3D; chat.groupMetadata.announce;\n        }\n        \n        res.lastMessage &#x3D; null;\n        if (res.msgs &amp;amp;&amp;amp; res.msgs.length) {\n            const lastMessage &#x3D; chat.lastReceivedKey\n                ? window.Store.Msg.get(chat.lastReceivedKey._serialized) || (await window.Store.Msg.getMessagesById([chat.lastReceivedKey._serialized]))?.messages?.[0]\n                : null;\n            if (lastMessage) {\n                res.lastMessage &#x3D; window.WWebJS.getMessageModel(lastMessage);\n            }\n        }\n        \n        delete res.msgs;\n        delete res.msgUnsyncedButtonReplyMsgs;\n        delete res.unsyncedButtonReplies;\n\n        return res;\n    };\n\n    window.WWebJS.getChat &#x3D; async chatId &#x3D;&gt; {\n        const chatWid &#x3D; window.Store.WidFactory.createWid(chatId);\n        const chat &#x3D; await window.Store.Chat.find(chatWid);\n        return await window.WWebJS.getChatModel(chat);\n    };\n\n    window.WWebJS.getChats &#x3D; async () &#x3D;&gt; {\n        const chats &#x3D; window.Store.Chat.getModelsArray();\n\n        const chatPromises &#x3D; chats.map(chat &#x3D;&gt; window.WWebJS.getChatModel(chat));\n        return await Promise.all(chatPromises);\n    };\n\n    window.WWebJS.getContactModel &#x3D; contact &#x3D;&gt; {\n        let res &#x3D; contact.serialize();\n        res.isBusiness &#x3D; contact.isBusiness &#x3D;&#x3D;&#x3D; undefined ? false : contact.isBusiness;\n\n        if (contact.businessProfile) {\n            res.businessProfile &#x3D; contact.businessProfile.serialize();\n        }\n\n        // TODO: remove useOldImplementation and its checks once all clients are updated to &gt;&#x3D; v2.2327.4\n        const useOldImplementation\n            &#x3D; window.compareWwebVersions(window.Debug.VERSION, &#x27;&amp;lt;&#x27;, &#x27;2.2327.4&#x27;);\n\n        res.isMe &#x3D; useOldImplementation\n            ? contact.isMe\n            : window.Store.ContactMethods.getIsMe(contact);\n        res.isUser &#x3D; useOldImplementation\n            ? contact.isUser\n            : window.Store.ContactMethods.getIsUser(contact);\n        res.isGroup &#x3D; useOldImplementation\n            ? contact.isGroup\n            : window.Store.ContactMethods.getIsGroup(contact);\n        res.isWAContact &#x3D; useOldImplementation\n            ? contact.isWAContact\n            : window.Store.ContactMethods.getIsWAContact(contact);\n        res.isMyContact &#x3D; useOldImplementation\n            ? contact.isMyContact\n            : window.Store.ContactMethods.getIsMyContact(contact);\n        res.isBlocked &#x3D; contact.isContactBlocked;\n        res.userid &#x3D; useOldImplementation\n            ? contact.userid\n            : window.Store.ContactMethods.getUserid(contact);\n        res.isEnterprise &#x3D; useOldImplementation\n            ? contact.isEnterprise\n            : window.Store.ContactMethods.getIsEnterprise(contact);\n        res.verifiedName &#x3D; useOldImplementation\n            ? contact.verifiedName\n            : window.Store.ContactMethods.getVerifiedName(contact);\n        res.verifiedLevel &#x3D; useOldImplementation\n            ? contact.verifiedLevel\n            : window.Store.ContactMethods.getVerifiedLevel(contact);\n        res.statusMute &#x3D; useOldImplementation\n            ? contact.statusMute\n            : window.Store.ContactMethods.getStatusMute(contact);\n        res.name &#x3D; useOldImplementation\n            ? contact.name\n            : window.Store.ContactMethods.getName(contact);\n        res.shortName &#x3D; useOldImplementation\n            ? contact.shortName\n            : window.Store.ContactMethods.getShortName(contact);\n        res.pushname &#x3D; useOldImplementation\n            ? contact.pushname\n            : window.Store.ContactMethods.getPushname(contact);\n\n        return res;\n    };\n\n    window.WWebJS.getContact &#x3D; async contactId &#x3D;&gt; {\n        const wid &#x3D; window.Store.WidFactory.createWid(contactId);\n        const contact &#x3D; await window.Store.Contact.find(wid);\n        const bizProfile &#x3D; await window.Store.BusinessProfile.fetchBizProfile(wid);\n        bizProfile.profileOptions &amp;amp;&amp;amp; (contact.businessProfile &#x3D; bizProfile);\n        return window.WWebJS.getContactModel(contact);\n    };\n\n    window.WWebJS.getContacts &#x3D; () &#x3D;&gt; {\n        const contacts &#x3D; window.Store.Contact.getModelsArray();\n        return contacts.map(contact &#x3D;&gt; window.WWebJS.getContactModel(contact));\n    };\n\n    window.WWebJS.mediaInfoToFile &#x3D; ({ data, mimetype, filename }) &#x3D;&gt; {\n        const binaryData &#x3D; window.atob(data);\n\n        const buffer &#x3D; new ArrayBuffer(binaryData.length);\n        const view &#x3D; new Uint8Array(buffer);\n        for (let i &#x3D; 0; i &amp;lt; binaryData.length; i++) {\n            view[i] &#x3D; binaryData.charCodeAt(i);\n        }\n\n        const blob &#x3D; new Blob([buffer], { type: mimetype });\n        return new File([blob], filename, {\n            type: mimetype,\n            lastModified: Date.now()\n        });\n    };\n\n    window.WWebJS.arrayBufferToBase64 &#x3D; (arrayBuffer) &#x3D;&gt; {\n        let binary &#x3D; &#x27;&#x27;;\n        const bytes &#x3D; new Uint8Array(arrayBuffer);\n        const len &#x3D; bytes.byteLength;\n        for (let i &#x3D; 0; i &amp;lt; len; i++) {\n            binary +&#x3D; String.fromCharCode(bytes[i]);\n        }\n        return window.btoa(binary);\n    };\n\n    window.WWebJS.arrayBufferToBase64Async &#x3D; (arrayBuffer) &#x3D;&gt;\n        new Promise((resolve, reject) &#x3D;&gt; {\n            const blob &#x3D; new Blob([arrayBuffer], {\n                type: &#x27;application/octet-stream&#x27;,\n            });\n            const fileReader &#x3D; new FileReader();\n            fileReader.onload &#x3D; () &#x3D;&gt; {\n                const [, data] &#x3D; fileReader.result.split(&#x27;,&#x27;);\n                resolve(data);\n            };\n            fileReader.onerror &#x3D; (e) &#x3D;&gt; reject(e);\n            fileReader.readAsDataURL(blob);\n        });\n\n    window.WWebJS.getFileHash &#x3D; async (data) &#x3D;&gt; {\n        let buffer &#x3D; await data.arrayBuffer();\n        const hashBuffer &#x3D; await crypto.subtle.digest(&#x27;SHA-256&#x27;, buffer);\n        return btoa(String.fromCharCode(...new Uint8Array(hashBuffer)));\n    };\n\n    window.WWebJS.generateHash &#x3D; async (length) &#x3D;&gt; {\n        var result &#x3D; &#x27;&#x27;;\n        var characters &#x3D; &#x27;ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789&#x27;;\n        var charactersLength &#x3D; characters.length;\n        for (var i &#x3D; 0; i &amp;lt; length; i++) {\n            result +&#x3D; characters.charAt(Math.floor(Math.random() * charactersLength));\n        }\n        return result;\n    };\n\n    /**\n     * Referenced from and modified:\n     * @see https://github.com/wppconnect-team/wa-js/commit/290ebfefe6021b3d17f7fdfdda5545bb0473b26f\n     */\n    window.WWebJS.generateWaveform &#x3D; async (audioFile) &#x3D;&gt; {\n        try {\n            const audioData &#x3D; await audioFile.arrayBuffer();\n            const audioContext &#x3D; new AudioContext();\n            const audioBuffer &#x3D; await audioContext.decodeAudioData(audioData);\n\n            const rawData &#x3D; audioBuffer.getChannelData(0);\n            const samples &#x3D; 64;\n            const blockSize &#x3D; Math.floor(rawData.length / samples);\n            const filteredData &#x3D; [];\n            for (let i &#x3D; 0; i &amp;lt; samples; i++) {\n                const blockStart &#x3D; blockSize * i;\n                let sum &#x3D; 0;\n                for (let j &#x3D; 0; j &amp;lt; blockSize; j++) {\n                    sum &#x3D; sum + Math.abs(rawData[blockStart + j]);\n                }\n                filteredData.push(sum / blockSize);\n            }\n\n            const multiplier &#x3D; Math.pow(Math.max(...filteredData), -1);\n            const normalizedData &#x3D; filteredData.map((n) &#x3D;&gt; n * multiplier);\n\n            const waveform &#x3D; new Uint8Array(\n                normalizedData.map((n) &#x3D;&gt; Math.floor(100 * n))\n            );\n\n            return waveform;\n        } catch (e) {\n            return undefined;\n        }\n    };\n\n    window.WWebJS.sendClearChat &#x3D; async (chatId) &#x3D;&gt; {\n        let chat &#x3D; window.Store.Chat.get(chatId);\n        if (chat !&#x3D;&#x3D; undefined) {\n            await window.Store.SendClear.sendClear(chat, false);\n            return true;\n        }\n        return false;\n    };\n\n    window.WWebJS.sendDeleteChat &#x3D; async (chatId) &#x3D;&gt; {\n        let chat &#x3D; window.Store.Chat.get(chatId);\n        if (chat !&#x3D;&#x3D; undefined) {\n            await window.Store.SendDelete.sendDelete(chat);\n            return true;\n        }\n        return false;\n    };\n\n    window.WWebJS.sendChatstate &#x3D; async (state, chatId) &#x3D;&gt; {\n        chatId &#x3D; window.Store.WidFactory.createWid(chatId);\n\n        switch (state) {\n        case &#x27;typing&#x27;:\n            await window.Store.ChatState.sendChatStateComposing(chatId);\n            break;\n        case &#x27;recording&#x27;:\n            await window.Store.ChatState.sendChatStateRecording(chatId);\n            break;\n        case &#x27;stop&#x27;:\n            await window.Store.ChatState.sendChatStatePaused(chatId);\n            break;\n        default:\n            throw &#x27;Invalid chatstate&#x27;;\n        }\n\n        return true;\n    };\n\n    window.WWebJS.getLabelModel &#x3D; label &#x3D;&gt; {\n        let res &#x3D; label.serialize();\n        res.hexColor &#x3D; label.hexColor;\n\n        return res;\n    };\n\n    window.WWebJS.getLabels &#x3D; () &#x3D;&gt; {\n        const labels &#x3D; window.Store.Label.getModelsArray();\n        return labels.map(label &#x3D;&gt; window.WWebJS.getLabelModel(label));\n    };\n\n    window.WWebJS.getLabel &#x3D; (labelId) &#x3D;&gt; {\n        const label &#x3D; window.Store.Label.get(labelId);\n        return window.WWebJS.getLabelModel(label);\n    };\n\n    window.WWebJS.getChatLabels &#x3D; async (chatId) &#x3D;&gt; {\n        const chat &#x3D; await window.WWebJS.getChat(chatId);\n        return (chat.labels || []).map(id &#x3D;&gt; window.WWebJS.getLabel(id));\n    };\n\n    window.WWebJS.getOrderDetail &#x3D; async (orderId, token, chatId) &#x3D;&gt; {\n        const chatWid &#x3D; window.Store.WidFactory.createWid(chatId);\n        return window.Store.QueryOrder.queryOrder(chatWid, orderId, 80, 80, token);\n    };\n\n    window.WWebJS.getProductMetadata &#x3D; async (productId) &#x3D;&gt; {\n        let sellerId &#x3D; window.Store.Conn.wid;\n        let product &#x3D; await window.Store.QueryProduct.queryProduct(sellerId, productId);\n        if (product &amp;amp;&amp;amp; product.data) {\n            return product.data;\n        }\n\n        return undefined;\n    };\n\n    window.WWebJS.rejectCall &#x3D; async (peerJid, id) &#x3D;&gt; {\n        peerJid &#x3D; peerJid.split(&#x27;@&#x27;)[0] + &#x27;@s.whatsapp.net&#x27;;\n        let userId &#x3D; window.Store.User.getMaybeMeUser().user + &#x27;@s.whatsapp.net&#x27;;\n        const stanza &#x3D; window.Store.SocketWap.wap(&#x27;call&#x27;, {\n            id: window.Store.SocketWap.generateId(),\n            from: window.Store.SocketWap.USER_JID(userId),\n            to: window.Store.SocketWap.USER_JID(peerJid),\n        }, [\n            window.Store.SocketWap.wap(&#x27;reject&#x27;, {\n                &#x27;call-id&#x27;: id,\n                &#x27;call-creator&#x27;: window.Store.SocketWap.USER_JID(peerJid),\n                count: &#x27;0&#x27;,\n            })\n        ]);\n        await window.Store.Socket.deprecatedCastStanza(stanza);\n    };\n\n    window.WWebJS.cropAndResizeImage &#x3D; async (media, options &#x3D; {}) &#x3D;&gt; {\n        if (!media.mimetype.includes(&#x27;image&#x27;))\n            throw new Error(&#x27;Media is not an image&#x27;);\n\n        if (options.mimetype &amp;amp;&amp;amp; !options.mimetype.includes(&#x27;image&#x27;))\n            delete options.mimetype;\n\n        options &#x3D; Object.assign({ size: 640, mimetype: media.mimetype, quality: .75, asDataUrl: false }, options);\n\n        const img &#x3D; await new Promise ((resolve, reject) &#x3D;&gt; {\n            const img &#x3D; new Image();\n            img.onload &#x3D; () &#x3D;&gt; resolve(img);\n            img.onerror &#x3D; reject;\n            img.src &#x3D; &#x60;data:${media.mimetype};base64,${media.data}&#x60;;\n        });\n\n        const sl &#x3D; Math.min(img.width, img.height);\n        const sx &#x3D; Math.floor((img.width - sl) / 2);\n        const sy &#x3D; Math.floor((img.height - sl) / 2);\n\n        const canvas &#x3D; document.createElement(&#x27;canvas&#x27;);\n        canvas.width &#x3D; options.size;\n        canvas.height &#x3D; options.size;\n\n        const ctx &#x3D; canvas.getContext(&#x27;2d&#x27;);\n        ctx.drawImage(img, sx, sy, sl, sl, 0, 0, options.size, options.size);\n\n        const dataUrl &#x3D; canvas.toDataURL(options.mimetype, options.quality);\n\n        if (options.asDataUrl)\n            return dataUrl;\n\n        return Object.assign(media, {\n            mimetype: options.mimeType,\n            data: dataUrl.replace(&#x60;data:${options.mimeType};base64,&#x60;, &#x27;&#x27;)\n        });\n    };\n\n    window.WWebJS.setPicture &#x3D; async (chatid, media) &#x3D;&gt; {\n        const thumbnail &#x3D; await window.WWebJS.cropAndResizeImage(media, { asDataUrl: true, mimetype: &#x27;image/jpeg&#x27;, size: 96 });\n        const profilePic &#x3D; await window.WWebJS.cropAndResizeImage(media, { asDataUrl: true, mimetype: &#x27;image/jpeg&#x27;, size: 640 });\n\n        const chatWid &#x3D; window.Store.WidFactory.createWid(chatid);\n        try {\n            const collection &#x3D; window.Store.ProfilePicThumb.get(chatid);\n            if (!collection.canSet()) return;\n\n            const res &#x3D; await window.Store.GroupUtils.sendSetPicture(chatWid, thumbnail, profilePic);\n            return res ? res.status &#x3D;&#x3D;&#x3D; 200 : false;\n        } catch (err) {\n            if(err.name &#x3D;&#x3D;&#x3D; &#x27;ServerStatusCodeError&#x27;) return false;\n            throw err;\n        }\n    };\n\n    window.WWebJS.deletePicture &#x3D; async (chatid) &#x3D;&gt; {\n        const chatWid &#x3D; window.Store.WidFactory.createWid(chatid);\n        try {\n            const collection &#x3D; window.Store.ProfilePicThumb.get(chatid);\n            if (!collection.canDelete()) return;\n\n            const res &#x3D; await window.Store.GroupUtils.requestDeletePicture(chatWid);\n            return res ? res.status &#x3D;&#x3D;&#x3D; 200 : false;\n        } catch (err) {\n            if(err.name &#x3D;&#x3D;&#x3D; &#x27;ServerStatusCodeError&#x27;) return false;\n            throw err;\n        }\n    };\n    \n    window.WWebJS.getProfilePicThumbToBase64 &#x3D; async (chatWid) &#x3D;&gt; {\n        const profilePicCollection &#x3D; await window.Store.ProfilePicThumb.find(chatWid);\n\n        const _readImageAsBase64 &#x3D; (imageBlob) &#x3D;&gt; {\n            return new Promise((resolve) &#x3D;&gt; {\n                const reader &#x3D; new FileReader();\n                reader.onloadend &#x3D; function () {\n                    const base64Image &#x3D; reader.result;\n                    if (base64Image &#x3D;&#x3D; null) {\n                        resolve(undefined);\n                    } else {\n                        const base64Data &#x3D; base64Image.toString().split(&#x27;,&#x27;)[1];\n                        resolve(base64Data);\n                    }\n                };\n                reader.readAsDataURL(imageBlob);\n            });\n        };\n\n        if (profilePicCollection?.img) {\n            try {\n                const response &#x3D; await fetch(profilePicCollection.img);\n                if (response.ok) {\n                    const imageBlob &#x3D; await response.blob();\n                    if (imageBlob) {\n                        const base64Image &#x3D; await _readImageAsBase64(imageBlob);\n                        return base64Image;\n                    }\n                }\n            } catch (error) { /* empty */ }\n        }\n        return undefined;\n    };\n\n    window.WWebJS.getAddParticipantsRpcResult &#x3D; async (groupMetadata, groupWid, participantWid) &#x3D;&gt; {\n        const participantLidArgs &#x3D; groupMetadata?.isLidAddressingMode\n            ? {\n                phoneNumber: participantWid,\n                lid: window.Store.LidUtils.getCurrentLid(participantWid)\n            }\n            : { phoneNumber: participantWid };\n\n        const iqTo &#x3D; window.Store.WidToJid.widToGroupJid(groupWid);\n\n        const participantArgs &#x3D;\n            participantLidArgs.lid\n                ? [{\n                    participantJid: window.Store.WidToJid.widToUserJid(participantLidArgs.lid),\n                    phoneNumberMixinArgs: {\n                        anyPhoneNumber: window.Store.WidToJid.widToUserJid(participantLidArgs.phoneNumber)\n                    }\n                }]\n                : [{\n                    participantJid: window.Store.WidToJid.widToUserJid(participantLidArgs.phoneNumber)\n                }];\n\n        let rpcResult, resultArgs;\n        const isOldImpl &#x3D; window.compareWwebVersions(window.Debug.VERSION, &#x27;&amp;lt;&#x3D;&#x27;, &#x27;2.2335.9&#x27;);\n        const data &#x3D; {\n            name: undefined,\n            code: undefined,\n            inviteV4Code: undefined,\n            inviteV4CodeExp: undefined\n        };\n\n        try {\n            rpcResult &#x3D; await window.Store.GroupParticipants.sendAddParticipantsRPC({ participantArgs, iqTo });\n            resultArgs &#x3D; isOldImpl\n                ? rpcResult.value.addParticipant[0].addParticipantsParticipantMixins\n                : rpcResult.value.addParticipant[0]\n                    .addParticipantsParticipantAddedOrNonRegisteredWaUserParticipantErrorLidResponseMixinGroup\n                    .value\n                    .addParticipantsParticipantMixins;\n        } catch (err) {\n            data.code &#x3D; 400;\n            return data;\n        }\n\n        if (rpcResult.name &#x3D;&#x3D;&#x3D; &#x27;AddParticipantsResponseSuccess&#x27;) {\n            const code &#x3D; resultArgs?.value.error ?? &#x27;200&#x27;;\n            data.name &#x3D; resultArgs?.name;\n            data.code &#x3D; +code;\n            data.inviteV4Code &#x3D; resultArgs?.value.addRequestCode;\n            data.inviteV4CodeExp &#x3D; resultArgs?.value.addRequestExpiration?.toString();\n        }\n\n        else if (rpcResult.name &#x3D;&#x3D;&#x3D; &#x27;AddParticipantsResponseClientError&#x27;) {\n            const { code: code } &#x3D; rpcResult.value.errorAddParticipantsClientErrors.value;\n            data.code &#x3D; +code;\n        }\n\n        else if (rpcResult.name &#x3D;&#x3D;&#x3D; &#x27;AddParticipantsResponseServerError&#x27;) {\n            const { code: code } &#x3D; rpcResult.value.errorServerErrors.value;\n            data.code &#x3D; +code;\n        }\n\n        return data;\n    };\n\n    window.WWebJS.membershipRequestAction &#x3D; async (groupId, action, requesterIds, sleep) &#x3D;&gt; {\n        const groupWid &#x3D; window.Store.WidFactory.createWid(groupId);\n        const group &#x3D; await window.Store.Chat.find(groupWid);\n        const toApprove &#x3D; action &#x3D;&#x3D;&#x3D; &#x27;Approve&#x27;;\n        let membershipRequests;\n        let response;\n        let result &#x3D; [];\n\n        await window.Store.GroupQueryAndUpdate({ id: groupId });\n\n        if (!requesterIds?.length) {\n            membershipRequests &#x3D; group.groupMetadata.membershipApprovalRequests._models.map(({ id }) &#x3D;&gt; id);\n        } else {\n            !Array.isArray(requesterIds) &amp;amp;&amp;amp; (requesterIds &#x3D; [requesterIds]);\n            membershipRequests &#x3D; requesterIds.map(r &#x3D;&gt; window.Store.WidFactory.createWid(r));\n        }\n\n        if (!membershipRequests.length) return [];\n\n        const participantArgs &#x3D; membershipRequests.map(m &#x3D;&gt; ({\n            participantArgs: [\n                {\n                    participantJid: window.Store.WidToJid.widToUserJid(m)\n                }\n            ]\n        }));\n\n        const groupJid &#x3D; window.Store.WidToJid.widToGroupJid(groupWid);\n        \n        const _getSleepTime &#x3D; (sleep) &#x3D;&gt; {\n            if (!Array.isArray(sleep) || (sleep.length &#x3D;&#x3D;&#x3D; 2 &amp;amp;&amp;amp; sleep[0] &#x3D;&#x3D;&#x3D; sleep[1])) {\n                return sleep;\n            }\n            if (sleep.length &#x3D;&#x3D;&#x3D; 1) {\n                return sleep[0];\n            }\n            sleep[1] - sleep[0] &amp;lt; 100 &amp;amp;&amp;amp; (sleep[0] &#x3D; sleep[1]) &amp;amp;&amp;amp; (sleep[1] +&#x3D; 100);\n            return Math.floor(Math.random() * (sleep[1] - sleep[0] + 1)) + sleep[0];\n        };\n\n        const membReqResCodes &#x3D; {\n            default: &#x60;An unknown error occupied while ${toApprove ? &#x27;approving&#x27; : &#x27;rejecting&#x27;} the participant membership request&#x60;,\n            400: &#x27;ParticipantNotFoundError&#x27;,\n            401: &#x27;ParticipantNotAuthorizedError&#x27;,\n            403: &#x27;ParticipantForbiddenError&#x27;,\n            404: &#x27;ParticipantRequestNotFoundError&#x27;,\n            408: &#x27;ParticipantTemporarilyBlockedError&#x27;,\n            409: &#x27;ParticipantConflictError&#x27;,\n            412: &#x27;ParticipantParentLinkedGroupsResourceConstraintError&#x27;,\n            500: &#x27;ParticipantResourceConstraintError&#x27;\n        };\n\n        try {\n            for (const participant of participantArgs) {\n                response &#x3D; await window.Store.MembershipRequestUtils.sendMembershipRequestsActionRPC({\n                    iqTo: groupJid,\n                    [toApprove ? &#x27;approveArgs&#x27; : &#x27;rejectArgs&#x27;]: participant\n                });\n\n                if (response.name &#x3D;&#x3D;&#x3D; &#x27;MembershipRequestsActionResponseSuccess&#x27;) {\n                    const value &#x3D; toApprove\n                        ? response.value.membershipRequestsActionApprove\n                        : response.value.membershipRequestsActionReject;\n                    if (value?.participant) {\n                        const [_] &#x3D; value.participant.map(p &#x3D;&gt; {\n                            const error &#x3D; toApprove\n                                ? value.participant[0].membershipRequestsActionAcceptParticipantMixins?.value.error\n                                : value.participant[0].membershipRequestsActionRejectParticipantMixins?.value.error;\n                            return {\n                                requesterId: window.Store.WidFactory.createWid(p.jid)._serialized,\n                                ...(error\n                                    ? { error: +error, message: membReqResCodes[error] || membReqResCodes.default }\n                                    : { message: &#x60;${toApprove ? &#x27;Approved&#x27; : &#x27;Rejected&#x27;} successfully&#x60; })\n                            };\n                        });\n                        _ &amp;amp;&amp;amp; result.push(_);\n                    }\n                } else {\n                    result.push({\n                        requesterId: window.Store.JidToWid.userJidToUserWid(participant.participantArgs[0].participantJid)._serialized,\n                        message: &#x27;ServerStatusCodeError&#x27;\n                    });\n                }\n\n                sleep &amp;amp;&amp;amp;\n                    participantArgs.length &gt; 1 &amp;amp;&amp;amp;\n                    participantArgs.indexOf(participant) !&#x3D;&#x3D; participantArgs.length - 1 &amp;amp;&amp;amp;\n                    (await new Promise((resolve) &#x3D;&gt; setTimeout(resolve, _getSleepTime(sleep))));\n            }\n            return result;\n        } catch (err) {\n            return [];\n        }\n    };\n\n    window.WWebJS.pinUnpinMsgAction &#x3D; async (msgId, action, duration) &#x3D;&gt; {\n        const message &#x3D; window.Store.Msg.get(msgId) || (await window.Store.Msg.getMessagesById([msgId]))?.messages?.[0];\n        if (!message) return false;\n        const response &#x3D; await window.Store.pinUnpinMsg(message, action, duration);\n        return response.messageSendResult &#x3D;&#x3D;&#x3D; &#x27;OK&#x27;;\n    };\n    \n    window.WWebJS.getStatusModel &#x3D; status &#x3D;&gt; {\n        const res &#x3D; status.serialize();\n        delete res._msgs;\n        return res;\n    };\n\n    window.WWebJS.getAllStatuses &#x3D; () &#x3D;&gt; {\n        const statuses &#x3D; window.Store.Status.getModelsArray();\n        return statuses.map(status &#x3D;&gt; window.WWebJS.getStatusModel(status));\n    };\n};\n</code></pre>\n          </article>\n        </div>\n      </div>\n      <nav id=\"jsdoc-toc-nav\" role=\"navigation\"></nav>\n    </div>\n  </div>\n  <footer id=\"jsdoc-footer\" class=\"jsdoc-footer\">\n    <div id=\"jsdoc-footer-container\">\n      <p>\n        Generated by <a href=\"https://github.com/jsdoc3/jsdoc\">JSDoc</a> 3.6.11 on May 30, 2025.\n      </p>\n    </div>\n  </footer>\n  <script src=\"scripts/jquery.min.js\"></script>\n  <script src=\"scripts/tree.jquery.js\"></script>\n  <script src=\"scripts/prettify.js\"></script>\n  <script src=\"scripts/jsdoc-toc.js\"></script>\n  <script src=\"scripts/linenumber.js\"></script>\n  <script src=\"scripts/scrollanchor.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "docs/util_InterfaceController.js.html",
    "content": "<!doctype html>\n<html>\n\n<head>\n  <meta name=\"generator\" content=\"JSDoc 3.6.11\">\n  <meta charset=\"utf-8\">\n  <title>whatsapp-web.js 1.34.6 &raquo; Source: util/InterfaceController.js</title>\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Karla:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Noto+Serif:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Inconsolata:500\" type=\"text/css\">\n  <link href=\"css/baseline.css\" rel=\"stylesheet\">\n</head>\n\n<body onload=\"prettyPrint()\">\n  <nav id=\"jsdoc-navbar\" role=\"navigation\" class=\"jsdoc-navbar\">\n    <div id=\"jsdoc-navbar-container\">\n      <div id=\"jsdoc-navbar-content\">\n        <a href=\"index.html\" class=\"jsdoc-navbar-package-name\">whatsapp-web.<wbr>js 1.<wbr>34.<wbr>6</a>\n      </div>\n    </div>\n  </nav>\n  <div id=\"jsdoc-body-container\">\n    <div id=\"jsdoc-content\">\n      <div id=\"jsdoc-content-container\">\n        <div id=\"jsdoc-banner\" role=\"banner\">\n        </div>\n        <div id=\"jsdoc-main\" role=\"main\">\n          <header class=\"page-header\">\n            <h1>Source: util/InterfaceController.js</h1>\n          </header>\n          <article>\n            <pre class=\"prettyprint linenums\"><code>&#x27;use strict&#x27;;\n\n/**\n * Interface Controller\n */\nclass InterfaceController {\n\n    constructor(props) {\n        this.pupPage &#x3D; props.pupPage;\n    }\n\n    /**\n     * Opens the Chat Window\n     * @param {string} chatId ID of the chat window that will be opened\n     */\n    async openChatWindow(chatId) {\n        return await this.pupPage.evaluate(async (chatId) &#x3D;&gt; {\n            const chat &#x3D; await window.WWebJS.getChat(chatId, { getAsModel: false });\n            return await window.Store.Cmd.openChatBottom({&#x27;chat&#x27;:chat});\n        }, chatId);\n    }\n\n    /**\n     * Opens the Chat Drawer\n     * @param {string} chatId ID of the chat drawer that will be opened\n     */\n    async openChatDrawer(chatId) {\n        await this.pupPage.evaluate(async chatId &#x3D;&gt; {\n            let chat &#x3D; await window.WWebJS.getChat(chatId, { getAsModel: false });\n            await window.Store.Cmd.openDrawerMid(chat);\n        }, chatId);\n    }\n\n    /**\n     * Opens the Chat Search\n     * @param {string} chatId ID of the chat search that will be opened\n     */\n    async openChatSearch(chatId) {\n        await this.pupPage.evaluate(async chatId &#x3D;&gt; {\n            let chat &#x3D; await window.WWebJS.getChat(chatId, { getAsModel: false });\n            await window.Store.Cmd.chatSearch(chat);\n        }, chatId);\n    }\n\n    /**\n     * Opens or Scrolls the Chat Window to the position of the message\n     * @param {string} msgId ID of the message that will be scrolled to\n     */\n    async openChatWindowAt(msgId) {\n        await this.pupPage.evaluate(async (msgId) &#x3D;&gt; {\n            const msg &#x3D; window.Store.Msg.get(msgId) || (await window.Store.Msg.getMessagesById([msgId]))?.messages?.[0];\n            const chat &#x3D; window.Store.Chat.get(msg.id.remote) ?? await window.Store.Chat.find(msg.id.remote);\n            const searchContext &#x3D; await window.Store.SearchContext.getSearchContext(chat, msg.id);\n            await window.Store.Cmd.openChatAt({ chat: chat, msgContext: searchContext });\n        }, msgId);\n    }\n\n    /**\n     * Opens the Message Drawer\n     * @param {string} msgId ID of the message drawer that will be opened\n     */\n    async openMessageDrawer(msgId) {\n        await this.pupPage.evaluate(async msgId &#x3D;&gt; {\n            const msg &#x3D; window.Store.Msg.get(msgId) || (await window.Store.Msg.getMessagesById([msgId]))?.messages?.[0];\n            await window.Store.Cmd.msgInfoDrawer(msg);\n        }, msgId);\n    }\n\n    /**\n     * Closes the Right Drawer\n     */\n    async closeRightDrawer() {\n        await this.pupPage.evaluate(async () &#x3D;&gt; {\n            await window.Store.DrawerManager.closeDrawerRight();\n        });\n    }\n\n    /**\n     * Get all Features\n     */\n    async getFeatures() {\n        return await this.pupPage.evaluate(() &#x3D;&gt; {\n            if(!window.Store.Features) throw new Error(&#x27;This version of Whatsapp Web does not support features&#x27;);\n            return window.Store.Features.F;\n        });\n    }\n\n    /**\n     * Check if Feature is enabled\n     * @param {string} feature status to check\n     */\n    async checkFeatureStatus(feature) {\n        return await this.pupPage.evaluate((feature) &#x3D;&gt; {\n            if(!window.Store.Features) throw new Error(&#x27;This version of Whatsapp Web does not support features&#x27;);\n            return window.Store.Features.supportsFeature(feature);\n        }, feature);\n    }\n\n    /**\n     * Enable Features\n     * @param {string[]} features to be enabled\n     */\n    async enableFeatures(features) {\n        await this.pupPage.evaluate((features) &#x3D;&gt; {\n            if(!window.Store.Features) throw new Error(&#x27;This version of Whatsapp Web does not support features&#x27;);\n            for (const feature in features) {\n                window.Store.Features.setFeature(features[feature], true);\n            }\n        }, features);\n    }\n\n    /**\n     * Disable Features\n     * @param {string[]} features to be disabled\n     */\n    async disableFeatures(features) {\n        await this.pupPage.evaluate((features) &#x3D;&gt; {\n            if(!window.Store.Features) throw new Error(&#x27;This version of Whatsapp Web does not support features&#x27;);\n            for (const feature in features) {\n                window.Store.Features.setFeature(features[feature], false);\n            }\n        }, features);\n    }\n}\n\nmodule.exports &#x3D; InterfaceController;\n</code></pre>\n          </article>\n        </div>\n      </div>\n      <nav id=\"jsdoc-toc-nav\" role=\"navigation\"></nav>\n    </div>\n  </div>\n  <footer id=\"jsdoc-footer\" class=\"jsdoc-footer\">\n    <div id=\"jsdoc-footer-container\">\n      <p>\n        Generated by <a href=\"https://github.com/jsdoc3/jsdoc\">JSDoc</a> 3.6.11 on January 30, 2026.\n      </p>\n    </div>\n  </footer>\n  <script src=\"scripts/jquery.min.js\"></script>\n  <script src=\"scripts/tree.jquery.js\"></script>\n  <script src=\"scripts/prettify.js\"></script>\n  <script src=\"scripts/jsdoc-toc.js\"></script>\n  <script src=\"scripts/linenumber.js\"></script>\n  <script src=\"scripts/scrollanchor.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "docs/util_Puppeteer.js.html",
    "content": "<!doctype html>\n<html>\n\n<head>\n  <meta name=\"generator\" content=\"JSDoc 3.6.11\">\n  <meta charset=\"utf-8\">\n  <title>whatsapp-web.js 1.34.6 &raquo; Source: util/Puppeteer.js</title>\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Karla:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Noto+Serif:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Inconsolata:500\" type=\"text/css\">\n  <link href=\"css/baseline.css\" rel=\"stylesheet\">\n</head>\n\n<body onload=\"prettyPrint()\">\n  <nav id=\"jsdoc-navbar\" role=\"navigation\" class=\"jsdoc-navbar\">\n    <div id=\"jsdoc-navbar-container\">\n      <div id=\"jsdoc-navbar-content\">\n        <a href=\"index.html\" class=\"jsdoc-navbar-package-name\">whatsapp-web.<wbr>js 1.<wbr>34.<wbr>6</a>\n      </div>\n    </div>\n  </nav>\n  <div id=\"jsdoc-body-container\">\n    <div id=\"jsdoc-content\">\n      <div id=\"jsdoc-content-container\">\n        <div id=\"jsdoc-banner\" role=\"banner\">\n        </div>\n        <div id=\"jsdoc-main\" role=\"main\">\n          <header class=\"page-header\">\n            <h1>Source: util/Puppeteer.js</h1>\n          </header>\n          <article>\n            <pre class=\"prettyprint linenums\"><code>/**\n * Expose a function to the page if it does not exist\n *\n * NOTE:\n * Rewrite it to &#x27;upsertFunction&#x27; after updating Puppeteer to 20.6 or higher\n * using page.removeExposedFunction\n * https://pptr.dev/api/puppeteer.page.removeexposedfunction\n *\n * @param {object} page - Puppeteer Page instance\n * @param {string} name\n * @param {Function} fn\n */\nasync function exposeFunctionIfAbsent(page, name, fn) {\n    const exist &#x3D; await page.evaluate((name) &#x3D;&gt; {\n        return !!window[name];\n    }, name);\n    if (exist) {\n        return;\n    }\n    await page.exposeFunction(name, fn);\n}\n\nmodule.exports &#x3D; {exposeFunctionIfAbsent};\n</code></pre>\n          </article>\n        </div>\n      </div>\n      <nav id=\"jsdoc-toc-nav\" role=\"navigation\"></nav>\n    </div>\n  </div>\n  <footer id=\"jsdoc-footer\" class=\"jsdoc-footer\">\n    <div id=\"jsdoc-footer-container\">\n      <p>\n        Generated by <a href=\"https://github.com/jsdoc3/jsdoc\">JSDoc</a> 3.6.11 on January 30, 2026.\n      </p>\n    </div>\n  </footer>\n  <script src=\"scripts/jquery.min.js\"></script>\n  <script src=\"scripts/tree.jquery.js\"></script>\n  <script src=\"scripts/prettify.js\"></script>\n  <script src=\"scripts/jsdoc-toc.js\"></script>\n  <script src=\"scripts/linenumber.js\"></script>\n  <script src=\"scripts/scrollanchor.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "docs/util_Util.js.html",
    "content": "<!doctype html>\n<html>\n\n<head>\n  <meta name=\"generator\" content=\"JSDoc 3.6.11\">\n  <meta charset=\"utf-8\">\n  <title>whatsapp-web.js 1.34.6 &raquo; Source: util/Util.js</title>\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Karla:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Noto+Serif:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Inconsolata:500\" type=\"text/css\">\n  <link href=\"css/baseline.css\" rel=\"stylesheet\">\n</head>\n\n<body onload=\"prettyPrint()\">\n  <nav id=\"jsdoc-navbar\" role=\"navigation\" class=\"jsdoc-navbar\">\n    <div id=\"jsdoc-navbar-container\">\n      <div id=\"jsdoc-navbar-content\">\n        <a href=\"index.html\" class=\"jsdoc-navbar-package-name\">whatsapp-web.<wbr>js 1.<wbr>34.<wbr>6</a>\n      </div>\n    </div>\n  </nav>\n  <div id=\"jsdoc-body-container\">\n    <div id=\"jsdoc-content\">\n      <div id=\"jsdoc-content-container\">\n        <div id=\"jsdoc-banner\" role=\"banner\">\n        </div>\n        <div id=\"jsdoc-main\" role=\"main\">\n          <header class=\"page-header\">\n            <h1>Source: util/Util.js</h1>\n          </header>\n          <article>\n            <pre class=\"prettyprint linenums\"><code>&#x27;use strict&#x27;;\n\nconst path &#x3D; require(&#x27;path&#x27;);\nconst Crypto &#x3D; require(&#x27;crypto&#x27;);\nconst { tmpdir } &#x3D; require(&#x27;os&#x27;);\nconst ffmpeg &#x3D; require(&#x27;fluent-ffmpeg&#x27;);\nconst webp &#x3D; require(&#x27;node-webpmux&#x27;);\nconst fs &#x3D; require(&#x27;fs&#x27;).promises;\nconst has &#x3D; (o, k) &#x3D;&gt; Object.prototype.hasOwnProperty.call(o, k);\n\n/**\n * Utility methods\n */\nclass Util {\n    constructor() {\n        throw new Error(&#x60;The ${this.constructor.name} class may not be instantiated.&#x60;);\n    }\n\n    static generateHash(length) {\n        var result &#x3D; &#x27;&#x27;;\n        var characters &#x3D; &#x27;ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789&#x27;;\n        var charactersLength &#x3D; characters.length;\n        for (var i &#x3D; 0; i &amp;lt; length; i++) {\n            result +&#x3D; characters.charAt(Math.floor(Math.random() * charactersLength));\n        }\n        return result;\n    }\n\n    /**\n     * Sets default properties on an object that aren&#x27;t already specified.\n     * @param {Object} def Default properties\n     * @param {Object} given Object to assign defaults to\n     * @returns {Object}\n     * @private\n     */\n    static mergeDefault(def, given) {\n        if (!given) return def;\n        for (const key in def) {\n            if (!has(given, key) || given[key] &#x3D;&#x3D;&#x3D; undefined) {\n                given[key] &#x3D; def[key];\n            } else if (given[key] &#x3D;&#x3D;&#x3D; Object(given[key])) {\n                given[key] &#x3D; Util.mergeDefault(def[key], given[key]);\n            }\n        }\n\n        return given;\n    }\n\n    /**\n     * Formats a image to webp\n     * @param {MessageMedia} media\n     * \n     * @returns {Promise&amp;lt;MessageMedia&gt;} media in webp format\n     */\n    static async formatImageToWebpSticker(media, pupPage) {\n        if (!media.mimetype.includes(&#x27;image&#x27;))\n            throw new Error(&#x27;media is not a image&#x27;);\n\n        if (media.mimetype.includes(&#x27;webp&#x27;)) {\n            return media;\n        }\n\n        return pupPage.evaluate((media) &#x3D;&gt; {\n            return window.WWebJS.toStickerData(media);\n        }, media);\n    }\n\n    /**\n     * Formats a video to webp\n     * @param {MessageMedia} media\n     * \n     * @returns {Promise&amp;lt;MessageMedia&gt;} media in webp format\n     */\n    static async formatVideoToWebpSticker(media) {\n        if (!media.mimetype.includes(&#x27;video&#x27;))\n            throw new Error(&#x27;media is not a video&#x27;);\n\n        const videoType &#x3D; media.mimetype.split(&#x27;/&#x27;)[1];\n\n        const tempFile &#x3D; path.join(\n            tmpdir(),\n            &#x60;${Crypto.randomBytes(6).readUIntLE(0, 6).toString(36)}.webp&#x60;\n        );\n\n        const stream &#x3D; new (require(&#x27;stream&#x27;).Readable)();\n        const buffer &#x3D; Buffer.from(\n            media.data.replace(&#x60;data:${media.mimetype};base64,&#x60;, &#x27;&#x27;),\n            &#x27;base64&#x27;\n        );\n        stream.push(buffer);\n        stream.push(null);\n\n        await new Promise((resolve, reject) &#x3D;&gt; {\n            ffmpeg(stream)\n                .inputFormat(videoType)\n                .on(&#x27;error&#x27;, reject)\n                .on(&#x27;end&#x27;, () &#x3D;&gt; resolve(true))\n                .addOutputOptions([\n                    &#x27;-vcodec&#x27;,\n                    &#x27;libwebp&#x27;,\n                    &#x27;-vf&#x27;,\n                    // eslint-disable-next-line no-useless-escape\n                    &#x27;scale&#x3D;\\&#x27;iw*min(300/iw\\,300/ih)\\&#x27;:\\&#x27;ih*min(300/iw\\,300/ih)\\&#x27;,format&#x3D;rgba,pad&#x3D;300:300:\\&#x27;(300-iw)/2\\&#x27;:\\&#x27;(300-ih)/2\\&#x27;:\\&#x27;#00000000\\&#x27;,setsar&#x3D;1,fps&#x3D;10&#x27;,\n                    &#x27;-loop&#x27;,\n                    &#x27;0&#x27;,\n                    &#x27;-ss&#x27;,\n                    &#x27;00:00:00.0&#x27;,\n                    &#x27;-t&#x27;,\n                    &#x27;00:00:05.0&#x27;,\n                    &#x27;-preset&#x27;,\n                    &#x27;default&#x27;,\n                    &#x27;-an&#x27;,\n                    &#x27;-vsync&#x27;,\n                    &#x27;0&#x27;,\n                    &#x27;-s&#x27;,\n                    &#x27;512:512&#x27;,\n                ])\n                .toFormat(&#x27;webp&#x27;)\n                .save(tempFile);\n        });\n\n        const data &#x3D; await fs.readFile(tempFile, &#x27;base64&#x27;);\n        await fs.unlink(tempFile);\n\n        return {\n            mimetype: &#x27;image/webp&#x27;,\n            data: data,\n            filename: media.filename,\n        };\n    }\n\n    /**\n     * Sticker metadata.\n     * @typedef {Object} StickerMetadata\n     * @property {string} [name] \n     * @property {string} [author] \n     * @property {string[]} [categories]\n     */\n\n    /**\n     * Formats a media to webp\n     * @param {MessageMedia} media\n     * @param {StickerMetadata} metadata\n     * \n     * @returns {Promise&amp;lt;MessageMedia&gt;} media in webp format\n     */\n    static async formatToWebpSticker(media, metadata, pupPage) {\n        let webpMedia;\n\n        if (media.mimetype.includes(&#x27;image&#x27;))\n            webpMedia &#x3D; await this.formatImageToWebpSticker(media, pupPage);\n        else if (media.mimetype.includes(&#x27;video&#x27;))\n            webpMedia &#x3D; await this.formatVideoToWebpSticker(media);\n        else\n            throw new Error(&#x27;Invalid media format&#x27;);\n\n        if (metadata.name || metadata.author) {\n            const img &#x3D; new webp.Image();\n            const hash &#x3D; this.generateHash(32);\n            const stickerPackId &#x3D; hash;\n            const packname &#x3D; metadata.name;\n            const author &#x3D; metadata.author;\n            const categories &#x3D; metadata.categories || [&#x27;&#x27;];\n            const json &#x3D; { &#x27;sticker-pack-id&#x27;: stickerPackId, &#x27;sticker-pack-name&#x27;: packname, &#x27;sticker-pack-publisher&#x27;: author, &#x27;emojis&#x27;: categories };\n            let exifAttr &#x3D; Buffer.from([0x49, 0x49, 0x2A, 0x00, 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x41, 0x57, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00]);\n            let jsonBuffer &#x3D; Buffer.from(JSON.stringify(json), &#x27;utf8&#x27;);\n            let exif &#x3D; Buffer.concat([exifAttr, jsonBuffer]);\n            exif.writeUIntLE(jsonBuffer.length, 14, 4);\n            await img.load(Buffer.from(webpMedia.data, &#x27;base64&#x27;));\n            img.exif &#x3D; exif;\n            webpMedia.data &#x3D; (await img.save(null)).toString(&#x27;base64&#x27;);\n        }\n\n        return webpMedia;\n    }\n\n    /**\n     * Configure ffmpeg path\n     * @param {string} path\n     */\n    static setFfmpegPath(path) {\n        ffmpeg.setFfmpegPath(path);\n    }\n}\n\nmodule.exports &#x3D; Util;\n</code></pre>\n          </article>\n        </div>\n      </div>\n      <nav id=\"jsdoc-toc-nav\" role=\"navigation\"></nav>\n    </div>\n  </div>\n  <footer id=\"jsdoc-footer\" class=\"jsdoc-footer\">\n    <div id=\"jsdoc-footer-container\">\n      <p>\n        Generated by <a href=\"https://github.com/jsdoc3/jsdoc\">JSDoc</a> 3.6.11 on January 30, 2026.\n      </p>\n    </div>\n  </footer>\n  <script src=\"scripts/jquery.min.js\"></script>\n  <script src=\"scripts/tree.jquery.js\"></script>\n  <script src=\"scripts/prettify.js\"></script>\n  <script src=\"scripts/jsdoc-toc.js\"></script>\n  <script src=\"scripts/linenumber.js\"></script>\n  <script src=\"scripts/scrollanchor.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "docs/webCache_LocalWebCache.js.html",
    "content": "<!doctype html>\n<html>\n\n<head>\n  <meta name=\"generator\" content=\"JSDoc 3.6.11\">\n  <meta charset=\"utf-8\">\n  <title>whatsapp-web.js 1.34.6 &raquo; Source: webCache/LocalWebCache.js</title>\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Karla:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Noto+Serif:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Inconsolata:500\" type=\"text/css\">\n  <link href=\"css/baseline.css\" rel=\"stylesheet\">\n</head>\n\n<body onload=\"prettyPrint()\">\n  <nav id=\"jsdoc-navbar\" role=\"navigation\" class=\"jsdoc-navbar\">\n    <div id=\"jsdoc-navbar-container\">\n      <div id=\"jsdoc-navbar-content\">\n        <a href=\"index.html\" class=\"jsdoc-navbar-package-name\">whatsapp-web.<wbr>js 1.<wbr>34.<wbr>6</a>\n      </div>\n    </div>\n  </nav>\n  <div id=\"jsdoc-body-container\">\n    <div id=\"jsdoc-content\">\n      <div id=\"jsdoc-content-container\">\n        <div id=\"jsdoc-banner\" role=\"banner\">\n        </div>\n        <div id=\"jsdoc-main\" role=\"main\">\n          <header class=\"page-header\">\n            <h1>Source: webCache/LocalWebCache.js</h1>\n          </header>\n          <article>\n            <pre class=\"prettyprint linenums\"><code>const path &#x3D; require(&#x27;path&#x27;);\nconst fs &#x3D; require(&#x27;fs&#x27;);\n\nconst { WebCache, VersionResolveError } &#x3D; require(&#x27;./WebCache&#x27;);\n\n/**\n * LocalWebCache - Fetches a WhatsApp Web version from a local file store\n * @param {object} options - options\n * @param {string} options.path - Path to the directory where cached versions are saved, default is: &quot;./.wwebjs_cache/&quot; \n * @param {boolean} options.strict - If true, will throw an error if the requested version can&#x27;t be fetched. If false, will resolve to the latest version.\n */\nclass LocalWebCache extends WebCache {\n    constructor(options &#x3D; {}) {\n        super();\n\n        this.path &#x3D; options.path || &#x27;./.wwebjs_cache/&#x27;;\n        this.strict &#x3D; options.strict || false;\n    }\n\n    async resolve(version) {\n        const filePath &#x3D; path.join(this.path, &#x60;${version}.html&#x60;);\n        \n        try {\n            return fs.readFileSync(filePath, &#x27;utf-8&#x27;);\n        }\n        catch (err) {\n            if (this.strict) throw new VersionResolveError(&#x60;Couldn&#x27;t load version ${version} from the cache&#x60;);\n            return null;\n        }\n    }\n\n    async persist(indexHtml, version) {\n        // version &#x3D; (version+&#x27;&#x27;).replace(/[^0-9.]/g,&#x27;&#x27;);\n        const filePath &#x3D; path.join(this.path, &#x60;${version}.html&#x60;);\n        fs.mkdirSync(this.path, { recursive: true });\n        fs.writeFileSync(filePath, indexHtml);\n    }\n}\n\nmodule.exports &#x3D; LocalWebCache;\n</code></pre>\n          </article>\n        </div>\n      </div>\n      <nav id=\"jsdoc-toc-nav\" role=\"navigation\"></nav>\n    </div>\n  </div>\n  <footer id=\"jsdoc-footer\" class=\"jsdoc-footer\">\n    <div id=\"jsdoc-footer-container\">\n      <p>\n        Generated by <a href=\"https://github.com/jsdoc3/jsdoc\">JSDoc</a> 3.6.11 on January 30, 2026.\n      </p>\n    </div>\n  </footer>\n  <script src=\"scripts/jquery.min.js\"></script>\n  <script src=\"scripts/tree.jquery.js\"></script>\n  <script src=\"scripts/prettify.js\"></script>\n  <script src=\"scripts/jsdoc-toc.js\"></script>\n  <script src=\"scripts/linenumber.js\"></script>\n  <script src=\"scripts/scrollanchor.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "docs/webCache_RemoteWebCache.js.html",
    "content": "<!doctype html>\n<html>\n\n<head>\n  <meta name=\"generator\" content=\"JSDoc 3.6.11\">\n  <meta charset=\"utf-8\">\n  <title>whatsapp-web.js 1.34.6 &raquo; Source: webCache/RemoteWebCache.js</title>\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Karla:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Noto+Serif:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Inconsolata:500\" type=\"text/css\">\n  <link href=\"css/baseline.css\" rel=\"stylesheet\">\n</head>\n\n<body onload=\"prettyPrint()\">\n  <nav id=\"jsdoc-navbar\" role=\"navigation\" class=\"jsdoc-navbar\">\n    <div id=\"jsdoc-navbar-container\">\n      <div id=\"jsdoc-navbar-content\">\n        <a href=\"index.html\" class=\"jsdoc-navbar-package-name\">whatsapp-web.<wbr>js 1.<wbr>34.<wbr>6</a>\n      </div>\n    </div>\n  </nav>\n  <div id=\"jsdoc-body-container\">\n    <div id=\"jsdoc-content\">\n      <div id=\"jsdoc-content-container\">\n        <div id=\"jsdoc-banner\" role=\"banner\">\n        </div>\n        <div id=\"jsdoc-main\" role=\"main\">\n          <header class=\"page-header\">\n            <h1>Source: webCache/RemoteWebCache.js</h1>\n          </header>\n          <article>\n            <pre class=\"prettyprint linenums\"><code>const fetch &#x3D; require(&#x27;node-fetch&#x27;);\nconst { WebCache, VersionResolveError } &#x3D; require(&#x27;./WebCache&#x27;);\n\n/**\n * RemoteWebCache - Fetches a WhatsApp Web version index from a remote server\n * @param {object} options - options\n * @param {string} options.remotePath - Endpoint that should be used to fetch the version index. Use {version} as a placeholder for the version number.\n * @param {boolean} options.strict - If true, will throw an error if the requested version can&#x27;t be fetched. If false, will resolve to the latest version. Defaults to false.\n */\nclass RemoteWebCache extends WebCache {\n    constructor(options &#x3D; {}) {\n        super();\n\n        if (!options.remotePath) throw new Error(&#x27;webVersionCache.remotePath is required when using the remote cache&#x27;);\n        this.remotePath &#x3D; options.remotePath;\n        this.strict &#x3D; options.strict || false;\n    }\n\n    async resolve(version) {\n        const remotePath &#x3D; this.remotePath.replace(&#x27;{version}&#x27;, version);\n\n        try {\n            const cachedRes &#x3D; await fetch(remotePath);\n            if (cachedRes.ok) {\n                return cachedRes.text();\n            }\n        } catch (err) {\n            console.error(&#x60;Error fetching version ${version} from remote&#x60;, err);\n        }\n\n        if (this.strict) throw new VersionResolveError(&#x60;Couldn&#x27;t load version ${version} from the archive&#x60;);\n        return null;         \n    }\n\n    async persist() {\n        // Nothing to do here\n    }\n}\n\nmodule.exports &#x3D; RemoteWebCache;</code></pre>\n          </article>\n        </div>\n      </div>\n      <nav id=\"jsdoc-toc-nav\" role=\"navigation\"></nav>\n    </div>\n  </div>\n  <footer id=\"jsdoc-footer\" class=\"jsdoc-footer\">\n    <div id=\"jsdoc-footer-container\">\n      <p>\n        Generated by <a href=\"https://github.com/jsdoc3/jsdoc\">JSDoc</a> 3.6.11 on January 30, 2026.\n      </p>\n    </div>\n  </footer>\n  <script src=\"scripts/jquery.min.js\"></script>\n  <script src=\"scripts/tree.jquery.js\"></script>\n  <script src=\"scripts/prettify.js\"></script>\n  <script src=\"scripts/jsdoc-toc.js\"></script>\n  <script src=\"scripts/linenumber.js\"></script>\n  <script src=\"scripts/scrollanchor.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "docs/webCache_WebCache.js.html",
    "content": "<!doctype html>\n<html>\n\n<head>\n  <meta name=\"generator\" content=\"JSDoc 3.6.11\">\n  <meta charset=\"utf-8\">\n  <title>whatsapp-web.js 1.34.6 &raquo; Source: webCache/WebCache.js</title>\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Karla:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Noto+Serif:400,400i,700,700i\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"https://brick.a.ssl.fastly.net/Inconsolata:500\" type=\"text/css\">\n  <link href=\"css/baseline.css\" rel=\"stylesheet\">\n</head>\n\n<body onload=\"prettyPrint()\">\n  <nav id=\"jsdoc-navbar\" role=\"navigation\" class=\"jsdoc-navbar\">\n    <div id=\"jsdoc-navbar-container\">\n      <div id=\"jsdoc-navbar-content\">\n        <a href=\"index.html\" class=\"jsdoc-navbar-package-name\">whatsapp-web.<wbr>js 1.<wbr>34.<wbr>6</a>\n      </div>\n    </div>\n  </nav>\n  <div id=\"jsdoc-body-container\">\n    <div id=\"jsdoc-content\">\n      <div id=\"jsdoc-content-container\">\n        <div id=\"jsdoc-banner\" role=\"banner\">\n        </div>\n        <div id=\"jsdoc-main\" role=\"main\">\n          <header class=\"page-header\">\n            <h1>Source: webCache/WebCache.js</h1>\n          </header>\n          <article>\n            <pre class=\"prettyprint linenums\"><code>/**\n * Default implementation of a web version cache that does nothing.\n */\nclass WebCache {\n    async resolve() { return null; }\n    async persist() { }\n}\n\nclass VersionResolveError extends Error { }\n\nmodule.exports &#x3D; {\n    WebCache,\n    VersionResolveError\n};</code></pre>\n          </article>\n        </div>\n      </div>\n      <nav id=\"jsdoc-toc-nav\" role=\"navigation\"></nav>\n    </div>\n  </div>\n  <footer id=\"jsdoc-footer\" class=\"jsdoc-footer\">\n    <div id=\"jsdoc-footer-container\">\n      <p>\n        Generated by <a href=\"https://github.com/jsdoc3/jsdoc\">JSDoc</a> 3.6.11 on January 30, 2026.\n      </p>\n    </div>\n  </footer>\n  <script src=\"scripts/jquery.min.js\"></script>\n  <script src=\"scripts/tree.jquery.js\"></script>\n  <script src=\"scripts/prettify.js\"></script>\n  <script src=\"scripts/jsdoc-toc.js\"></script>\n  <script src=\"scripts/linenumber.js\"></script>\n  <script src=\"scripts/scrollanchor.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "example.js",
    "content": "const { Client, Location, Poll, List, Buttons, LocalAuth } = require('./index');\n\nconst client = new Client({\n    authStrategy: new LocalAuth(),\n    // proxyAuthentication: { username: 'username', password: 'password' },\n    /**\n     * This option changes the browser name from defined in user agent to custom.\n     */\n    // deviceName: 'Your custom name',\n    /**\n     * This option changes browser type from defined in user agent to yours. It affects the browser icon\n     * that is displayed in 'linked devices' section.\n     * Valid value are: 'Chrome' | 'Firefox' | 'IE' | 'Opera' | 'Safari' | 'Edge'.\n     * If another value is provided, the browser icon in 'linked devices' section will be gray.\n     */\n    // browserName: 'Firefox',\n    puppeteer: {\n        // args: ['--proxy-server=proxy-server-that-requires-authentication.example.com'],\n        headless: false,\n    },\n    // pairWithPhoneNumber: {\n    //     phoneNumber: '96170100100' // Pair with phone number (format: <COUNTRY_CODE><PHONE_NUMBER>)\n    //     showNotification: true,\n    //     intervalMs: 180000 // Time to renew pairing code in milliseconds, defaults to 3 minutes\n    // }\n});\n\n// client initialize does not finish at ready now.\nclient.initialize();\n\nclient.on('loading_screen', (percent, message) => {\n    console.log('LOADING SCREEN', percent, message);\n});\n\nclient.on('qr', async (qr) => {\n    // NOTE: This event will not be fired if a session is specified.\n    console.log('QR RECEIVED', qr);\n});\n\nclient.on('code', (code) => {\n    console.log('Pairing code:', code);\n});\n\nclient.on('authenticated', () => {\n    console.log('AUTHENTICATED');\n});\n\nclient.on('auth_failure', (msg) => {\n    // Fired if session restore was unsuccessful\n    console.error('AUTHENTICATION FAILURE', msg);\n});\n\nclient.on('ready', async () => {\n    console.log('READY');\n    const debugWWebVersion = await client.getWWebVersion();\n    console.log(`WWebVersion = ${debugWWebVersion}`);\n\n    client.pupPage.on('pageerror', function (err) {\n        console.log('Page error: ' + err.toString());\n    });\n    client.pupPage.on('error', function (err) {\n        console.log('Page error: ' + err.toString());\n    });\n});\n\nclient.on('message', async (msg) => {\n    console.log('MESSAGE RECEIVED', msg);\n\n    if (msg.body === '!ping reply') {\n        // Send a new message as a reply to the current one\n        msg.reply('pong');\n    } else if (msg.body === '!ping') {\n        // Send a new message to the same chat\n        client.sendMessage(msg.from, 'pong');\n    } else if (msg.body.startsWith('!sendto ')) {\n        // Direct send a new message to specific id\n        let number = msg.body.split(' ')[1];\n        let messageIndex = msg.body.indexOf(number) + number.length;\n        let message = msg.body.slice(messageIndex, msg.body.length);\n        number = number.includes('@c.us') ? number : `${number}@c.us`;\n        let chat = await msg.getChat();\n        chat.sendSeen();\n        client.sendMessage(number, message);\n    } else if (msg.body.startsWith('!subject ')) {\n        // Change the group subject\n        let chat = await msg.getChat();\n        if (chat.isGroup) {\n            let newSubject = msg.body.slice(9);\n            chat.setSubject(newSubject);\n        } else {\n            msg.reply('This command can only be used in a group!');\n        }\n    } else if (msg.body.startsWith('!echo ')) {\n        // Replies with the same message\n        msg.reply(msg.body.slice(6));\n    } else if (msg.body.startsWith('!preview ')) {\n        const text = msg.body.slice(9);\n        msg.reply(text, null, { linkPreview: true });\n    } else if (msg.body.startsWith('!desc ')) {\n        // Change the group description\n        let chat = await msg.getChat();\n        if (chat.isGroup) {\n            let newDescription = msg.body.slice(6);\n            chat.setDescription(newDescription);\n        } else {\n            msg.reply('This command can only be used in a group!');\n        }\n    } else if (msg.body === '!leave') {\n        // Leave the group\n        let chat = await msg.getChat();\n        if (chat.isGroup) {\n            chat.leave();\n        } else {\n            msg.reply('This command can only be used in a group!');\n        }\n    } else if (msg.body.startsWith('!join ')) {\n        const inviteCode = msg.body.split(' ')[1];\n        try {\n            await client.acceptInvite(inviteCode);\n            msg.reply('Joined the group!');\n        } catch (e) {\n            msg.reply('That invite code seems to be invalid.');\n        }\n    } else if (msg.body.startsWith('!addmembers')) {\n        const group = await msg.getChat();\n        const result = await group.addParticipants([\n            'number1@c.us',\n            'number2@c.us',\n            'number3@c.us',\n        ]);\n        /**\n         * The example of the {@link result} output:\n         *\n         * {\n         *   'number1@c.us': {\n         *     code: 200,\n         *     message: 'The participant was added successfully',\n         *     isInviteV4Sent: false\n         *   },\n         *   'number2@c.us': {\n         *     code: 403,\n         *     message: 'The participant can be added by sending private invitation only',\n         *     isInviteV4Sent: true\n         *   },\n         *   'number3@c.us': {\n         *     code: 404,\n         *     message: 'The phone number is not registered on WhatsApp',\n         *     isInviteV4Sent: false\n         *   }\n         * }\n         *\n         * For more usage examples:\n         * @see https://github.com/pedroslopez/whatsapp-web.js/pull/2344#usage-example1\n         */\n        console.log(result);\n    } else if (msg.body === '!creategroup') {\n        const partitipantsToAdd = [\n            'number1@c.us',\n            'number2@c.us',\n            'number3@c.us',\n        ];\n        const result = await client.createGroup(\n            'Group Title',\n            partitipantsToAdd,\n        );\n        /**\n         * The example of the {@link result} output:\n         * {\n         *   title: 'Group Title',\n         *   gid: {\n         *     server: 'g.us',\n         *     user: '1111111111',\n         *     _serialized: '1111111111@g.us'\n         *   },\n         *   participants: {\n         *     'botNumber@c.us': {\n         *       statusCode: 200,\n         *       message: 'The participant was added successfully',\n         *       isGroupCreator: true,\n         *       isInviteV4Sent: false\n         *     },\n         *     'number1@c.us': {\n         *       statusCode: 200,\n         *       message: 'The participant was added successfully',\n         *       isGroupCreator: false,\n         *       isInviteV4Sent: false\n         *     },\n         *     'number2@c.us': {\n         *       statusCode: 403,\n         *       message: 'The participant can be added by sending private invitation only',\n         *       isGroupCreator: false,\n         *       isInviteV4Sent: true\n         *     },\n         *     'number3@c.us': {\n         *       statusCode: 404,\n         *       message: 'The phone number is not registered on WhatsApp',\n         *       isGroupCreator: false,\n         *       isInviteV4Sent: false\n         *     }\n         *   }\n         * }\n         *\n         * For more usage examples:\n         * @see https://github.com/pedroslopez/whatsapp-web.js/pull/2344#usage-example2\n         */\n        console.log(result);\n    } else if (msg.body === '!groupinfo') {\n        let chat = await msg.getChat();\n        if (chat.isGroup) {\n            msg.reply(`\n                *Group Details*\n                Name: ${chat.name}\n                Description: ${chat.description}\n                Created At: ${chat.createdAt.toString()}\n                Created By: ${chat.owner.user}\n                Participant count: ${chat.participants.length}\n            `);\n        } else {\n            msg.reply('This command can only be used in a group!');\n        }\n    } else if (msg.body === '!chats') {\n        const chats = await client.getChats();\n        client.sendMessage(msg.from, `The bot has ${chats.length} chats open.`);\n    } else if (msg.body === '!info') {\n        let info = client.info;\n        client.sendMessage(\n            msg.from,\n            `\n            *Connection info*\n            User name: ${info.pushname}\n            My number: ${info.wid.user}\n            Platform: ${info.platform}\n        `,\n        );\n    } else if (msg.body === '!mediainfo' && msg.hasMedia) {\n        const attachmentData = await msg.downloadMedia();\n        msg.reply(`\n            *Media info*\n            MimeType: ${attachmentData.mimetype}\n            Filename: ${attachmentData.filename}\n            Data (length): ${attachmentData.data.length}\n        `);\n    } else if (msg.body === '!quoteinfo' && msg.hasQuotedMsg) {\n        const quotedMsg = await msg.getQuotedMessage();\n\n        quotedMsg.reply(`\n            ID: ${quotedMsg.id._serialized}\n            Type: ${quotedMsg.type}\n            Author: ${quotedMsg.author || quotedMsg.from}\n            Timestamp: ${quotedMsg.timestamp}\n            Has Media? ${quotedMsg.hasMedia}\n        `);\n    } else if (msg.body === '!resendmedia' && msg.hasQuotedMsg) {\n        const quotedMsg = await msg.getQuotedMessage();\n        if (quotedMsg.hasMedia) {\n            const attachmentData = await quotedMsg.downloadMedia();\n            client.sendMessage(msg.from, attachmentData, {\n                caption: \"Here's your requested media.\",\n            });\n        }\n        if (quotedMsg.hasMedia && quotedMsg.type === 'audio') {\n            const audio = await quotedMsg.downloadMedia();\n            await client.sendMessage(msg.from, audio, {\n                sendAudioAsVoice: true,\n            });\n        }\n    } else if (msg.body === '!isviewonce' && msg.hasQuotedMsg) {\n        const quotedMsg = await msg.getQuotedMessage();\n        if (quotedMsg.hasMedia) {\n            const media = await quotedMsg.downloadMedia();\n            await client.sendMessage(msg.from, media, { isViewOnce: true });\n        }\n    } else if (msg.body === '!location') {\n        // only latitude and longitude\n        await msg.reply(new Location(37.422, -122.084));\n        // location with name only\n        await msg.reply(new Location(37.422, -122.084, { name: 'Googleplex' }));\n        // location with address only\n        await msg.reply(\n            new Location(37.422, -122.084, {\n                address: '1600 Amphitheatre Pkwy, Mountain View, CA 94043, USA',\n            }),\n        );\n        // location with name, address and url\n        await msg.reply(\n            new Location(37.422, -122.084, {\n                name: 'Googleplex',\n                address: '1600 Amphitheatre Pkwy, Mountain View, CA 94043, USA',\n                url: 'https://google.com',\n            }),\n        );\n    } else if (msg.location) {\n        msg.reply(msg.location);\n    } else if (msg.body.startsWith('!status ')) {\n        const newStatus = msg.body.split(' ')[1];\n        await client.setStatus(newStatus);\n        msg.reply(`Status was updated to *${newStatus}*`);\n    } else if (msg.body === '!mentionUsers') {\n        const chat = await msg.getChat();\n        const userNumber = 'XXXXXXXXXX';\n        /**\n         * To mention one user you can pass user's ID to 'mentions' property as is,\n         * without wrapping it in Array, and a user's phone number to the message body:\n         */\n        await chat.sendMessage(`Hi @${userNumber}`, {\n            mentions: userNumber + '@c.us',\n        });\n        // To mention a list of users:\n        await chat.sendMessage(`Hi @${userNumber}, @${userNumber}`, {\n            mentions: [userNumber + '@c.us', userNumber + '@c.us'],\n        });\n    } else if (msg.body === '!mentionGroups') {\n        const chat = await msg.getChat();\n        const groupId = 'YYYYYYYYYY@g.us';\n        /**\n         * Sends clickable group mentions, the same as user mentions.\n         * When the mentions are clicked, it opens a chat with the mentioned group.\n         * The 'groupMentions.subject' can be custom\n         *\n         * @note The user that does not participate in the mentioned group,\n         * will not be able to click on that mentioned group, the same if the group does not exist\n         *\n         * To mention one group:\n         */\n        await chat.sendMessage(`Check the last message here: @${groupId}`, {\n            groupMentions: { subject: 'GroupSubject', id: groupId },\n        });\n        // To mention a list of groups:\n        await chat.sendMessage(\n            `Check the last message in these groups: @${groupId}, @${groupId}`,\n            {\n                groupMentions: [\n                    { subject: 'FirstGroup', id: groupId },\n                    { subject: 'SecondGroup', id: groupId },\n                ],\n            },\n        );\n    } else if (msg.body === '!getGroupMentions') {\n        // To get group mentions from a message:\n        const groupId = 'ZZZZZZZZZZ@g.us';\n        const msg = await client.sendMessage(\n            'chatId',\n            `Check the last message here: @${groupId}`,\n            {\n                groupMentions: { subject: 'GroupSubject', id: groupId },\n            },\n        );\n        /** {@link groupMentions} is an array of `GroupChat` */\n        const groupMentions = await msg.getGroupMentions();\n        console.log(groupMentions);\n    } else if (msg.body === '!delete') {\n        if (msg.hasQuotedMsg) {\n            const quotedMsg = await msg.getQuotedMessage();\n            if (quotedMsg.fromMe) {\n                quotedMsg.delete(true);\n            } else {\n                msg.reply('I can only delete my own messages');\n            }\n        }\n    } else if (msg.body === '!pin') {\n        const chat = await msg.getChat();\n        await chat.pin();\n    } else if (msg.body === '!archive') {\n        const chat = await msg.getChat();\n        await chat.archive();\n    } else if (msg.body === '!mute') {\n        const chat = await msg.getChat();\n        // mute the chat for 20 seconds\n        const unmuteDate = new Date();\n        unmuteDate.setSeconds(unmuteDate.getSeconds() + 20);\n        await chat.mute(unmuteDate);\n    } else if (msg.body === '!typing') {\n        const chat = await msg.getChat();\n        // simulates typing in the chat\n        chat.sendStateTyping();\n    } else if (msg.body === '!recording') {\n        const chat = await msg.getChat();\n        // simulates recording audio in the chat\n        chat.sendStateRecording();\n    } else if (msg.body === '!clearstate') {\n        const chat = await msg.getChat();\n        // stops typing or recording in the chat\n        chat.clearState();\n    } else if (msg.body === '!jumpto') {\n        if (msg.hasQuotedMsg) {\n            const quotedMsg = await msg.getQuotedMessage();\n            client.interface.openChatWindowAt(quotedMsg.id._serialized);\n        }\n    } else if (msg.body === '!buttons') {\n        let button = new Buttons(\n            'Button body',\n            [{ body: 'bt1' }, { body: 'bt2' }, { body: 'bt3' }],\n            'title',\n            'footer',\n        );\n        client.sendMessage(msg.from, button);\n    } else if (msg.body === '!list') {\n        let sections = [\n            {\n                title: 'sectionTitle',\n                rows: [\n                    { title: 'ListItem1', description: 'desc' },\n                    { title: 'ListItem2' },\n                ],\n            },\n        ];\n        let list = new List(\n            'List body',\n            'btnText',\n            sections,\n            'Title',\n            'footer',\n        );\n        client.sendMessage(msg.from, list);\n    } else if (msg.body === '!reaction') {\n        await msg.react('👍');\n    } else if (msg.body === '!sendpoll') {\n        /** By default the poll is created as a single choice poll: */\n        await msg.reply(new Poll('Winter or Summer?', ['Winter', 'Summer']));\n        /** If you want to provide a multiple choice poll, add allowMultipleAnswers as true: */\n        await msg.reply(\n            new Poll('Cats or Dogs?', ['Cats', 'Dogs'], {\n                allowMultipleAnswers: true,\n            }),\n        );\n        /**\n         * You can provide a custom message secret, it can be used as a poll ID:\n         * @note It has to be a unique vector with a length of 32\n         */\n        await msg.reply(\n            new Poll('Cats or Dogs?', ['Cats', 'Dogs'], {\n                messageSecret: [\n                    1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n                    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n                ],\n            }),\n        );\n    } else if (msg.body === '!vote') {\n        if (msg.hasQuotedMsg) {\n            const quotedMsg = await msg.getQuotedMessage();\n            if (quotedMsg.type === 'poll_creation') {\n                await quotedMsg.vote(msg.body.replace('!vote', ''));\n            } else {\n                msg.reply('Can only be used on poll messages');\n            }\n        }\n    } else if (msg.body === '!edit') {\n        if (msg.hasQuotedMsg) {\n            const quotedMsg = await msg.getQuotedMessage();\n            if (quotedMsg.fromMe) {\n                await quotedMsg.edit(msg.body.replace('!edit', ''));\n            } else {\n                msg.reply('I can only edit my own messages');\n            }\n        }\n    } else if (msg.body === '!updatelabels') {\n        const chat = await msg.getChat();\n        await chat.changeLabels([0, 1]);\n    } else if (msg.body === '!addlabels') {\n        const chat = await msg.getChat();\n        let labels = (await chat.getLabels()).map((l) => l.id);\n        labels.push('0');\n        labels.push('1');\n        await chat.changeLabels(labels);\n    } else if (msg.body === '!removelabels') {\n        const chat = await msg.getChat();\n        await chat.changeLabels([]);\n    } else if (msg.body === '!approverequest') {\n        /**\n         * Presented an example for membership request approvals, the same examples are for the request rejections.\n         * To approve the membership request from a specific user:\n         */\n        await client.approveGroupMembershipRequests(msg.from, {\n            requesterIds: 'number@c.us',\n        });\n        /** The same for execution on group object (no need to provide the group ID): */\n        const group = await msg.getChat();\n        await group.approveGroupMembershipRequests({\n            requesterIds: 'number@c.us',\n        });\n        /** To approve several membership requests: */\n        const approval = await client.approveGroupMembershipRequests(msg.from, {\n            requesterIds: ['number1@c.us', 'number2@c.us'],\n        });\n        /**\n         * The example of the {@link approval} output:\n         * [\n         *   {\n         *     requesterId: 'number1@c.us',\n         *     message: 'Rejected successfully'\n         *   },\n         *   {\n         *     requesterId: 'number2@c.us',\n         *     error: 404,\n         *     message: 'ParticipantRequestNotFoundError'\n         *   }\n         * ]\n         *\n         */\n        console.log(approval);\n        /** To approve all the existing membership requests (simply don't provide any user IDs): */\n        await client.approveGroupMembershipRequests(msg.from);\n        /** To change the sleep value to 300 ms: */\n        await client.approveGroupMembershipRequests(msg.from, {\n            requesterIds: ['number1@c.us', 'number2@c.us'],\n            sleep: 300,\n        });\n        /** To change the sleep value to random value between 100 and 300 ms: */\n        await client.approveGroupMembershipRequests(msg.from, {\n            requesterIds: ['number1@c.us', 'number2@c.us'],\n            sleep: [100, 300],\n        });\n        /** To explicitly disable the sleep: */\n        await client.approveGroupMembershipRequests(msg.from, {\n            requesterIds: ['number1@c.us', 'number2@c.us'],\n            sleep: null,\n        });\n    } else if (msg.body === '!pinmsg') {\n        /**\n         * Pins a message in a chat, a method takes a number in seconds for the message to be pinned.\n         * WhatsApp default values for duration to pass to the method are:\n         * 1. 86400 for 24 hours\n         * 2. 604800 for 7 days\n         * 3. 2592000 for 30 days\n         * You can pass your own value:\n         */\n        const result = await msg.pin(60); // Will pin a message for 1 minute\n        console.log(result); // True if the operation completed successfully, false otherwise\n    } else if (msg.body === '!howManyConnections') {\n        /**\n         * Get user device count by ID\n         * Each WaWeb Connection counts as one device, and the phone (if exists) counts as one\n         * So for a non-enterprise user with one WaWeb connection it should return \"2\"\n         */\n        let deviceCount = await client.getContactDeviceCount(msg.from);\n        await msg.reply(`You have *${deviceCount}* devices connected`);\n    } else if (msg.body === '!syncHistory') {\n        const isSynced = await client.syncHistory(msg.from);\n        // Or through the Chat object:\n        // const chat = await client.getChatById(msg.from);\n        // const isSynced = await chat.syncHistory();\n\n        await msg.reply(\n            isSynced\n                ? 'Historical chat is syncing..'\n                : 'There is no historical chat to sync.',\n        );\n    } else if (msg.body === '!statuses') {\n        const statuses = await client.getBroadcasts();\n        console.log(statuses);\n        const chat = await statuses[0]?.getChat(); // Get user chat of a first status\n        console.log(chat);\n    } else if (msg.body === '!sendMediaHD' && msg.hasQuotedMsg) {\n        const quotedMsg = await msg.getQuotedMessage();\n        if (quotedMsg.hasMedia) {\n            const media = await quotedMsg.downloadMedia();\n            await client.sendMessage(msg.from, media, { sendMediaAsHd: true });\n        }\n    } else if (msg.body === '!parseVCard') {\n        const vCard =\n            'BEGIN:VCARD\\n' +\n            'VERSION:3.0\\n' +\n            'FN:John Doe\\n' +\n            'ORG:Microsoft;\\n' +\n            'EMAIL;type=INTERNET:john.doe@gmail.com\\n' +\n            'URL:www.johndoe.com\\n' +\n            'TEL;type=CELL;type=VOICE;waid=18006427676:+1 (800) 642 7676\\n' +\n            'END:VCARD';\n        const vCardExtended =\n            'BEGIN:VCARD\\n' +\n            'VERSION:3.0\\n' +\n            'FN:John Doe\\n' +\n            'ORG:Microsoft;\\n' +\n            'item1.TEL:+1 (800) 642 7676\\n' +\n            'item1.X-ABLabel:USA Customer Service\\n' +\n            'item2.TEL:+55 11 4706 0900\\n' +\n            'item2.X-ABLabel:Brazil Customer Service\\n' +\n            'PHOTO;BASE64:here you can paste a binary data of a contact photo in Base64 encoding\\n' +\n            'END:VCARD';\n        const userId = 'XXXXXXXXXX@c.us';\n        await client.sendMessage(userId, vCard);\n        await client.sendMessage(userId, vCardExtended);\n    } else if (msg.body === '!changeSync') {\n        // NOTE: this action will take effect after you restart the client.\n        const backgroundSync = await client.setBackgroundSync(true);\n        console.log(backgroundSync);\n    } else if (msg.body === '!postStatus') {\n        await client.sendMessage('status@broadcast', 'Hello there!');\n        // send with a different style\n        await client.sendMessage(\n            'status@broadcast',\n            'Hello again! Looks different?',\n            {\n                fontStyle: 1,\n                backgroundColor: '#0b3296',\n            },\n        );\n    }\n});\n\nclient.on('message_create', async (msg) => {\n    // Fired on all message creations, including your own\n    if (msg.fromMe) {\n        // do stuff here\n    }\n\n    // Unpins a message\n    if (msg.fromMe && msg.body.startsWith('!unpin')) {\n        const pinnedMsg = await msg.getQuotedMessage();\n        if (pinnedMsg) {\n            // Will unpin a message\n            const result = await pinnedMsg.unpin();\n            console.log(result); // True if the operation completed successfully, false otherwise\n        }\n    }\n});\n\nclient.on('message_ciphertext', (msg) => {\n    // Receiving new incoming messages that have been encrypted\n    // msg.type === 'ciphertext'\n    msg.body = 'Waiting for this message. Check your phone.';\n\n    // do stuff here\n});\n\nclient.on('message_revoke_everyone', async (after, before) => {\n    // Fired whenever a message is deleted by anyone (including you)\n    console.log(after); // message after it was deleted.\n    if (before) {\n        console.log(before); // message before it was deleted.\n    }\n});\n\nclient.on('message_revoke_me', async (msg) => {\n    // Fired whenever a message is only deleted in your own view.\n    console.log(msg.body); // message before it was deleted.\n});\n\nclient.on('message_ack', (msg, ack) => {\n    /*\n        == ACK VALUES ==\n        ACK_ERROR: -1\n        ACK_PENDING: 0\n        ACK_SERVER: 1\n        ACK_DEVICE: 2\n        ACK_READ: 3\n        ACK_PLAYED: 4\n    */\n\n    if (ack == 3) {\n        // The message was read\n    }\n});\n\nclient.on('group_join', (notification) => {\n    // User has joined or been added to the group.\n    console.log('join', notification);\n    notification.reply('User joined.');\n});\n\nclient.on('group_leave', (notification) => {\n    // User has left or been kicked from the group.\n    console.log('leave', notification);\n    notification.reply('User left.');\n});\n\nclient.on('group_update', (notification) => {\n    // Group picture, subject or description has been updated.\n    console.log('update', notification);\n});\n\nclient.on('change_state', (state) => {\n    console.log('CHANGE STATE', state);\n});\n\n// Change to false if you don't want to reject incoming calls\nlet rejectCalls = true;\n\nclient.on('call', async (call) => {\n    console.log('Call received, rejecting. GOTO Line 261 to disable', call);\n    if (rejectCalls) await call.reject();\n    await client.sendMessage(\n        call.from,\n        `[${call.fromMe ? 'Outgoing' : 'Incoming'}] Phone call from ${call.from}, type ${call.isGroup ? 'group' : ''} ${call.isVideo ? 'video' : 'audio'} call. ${rejectCalls ? 'This call was automatically rejected by the script.' : ''}`,\n    );\n});\n\nclient.on('disconnected', (reason) => {\n    console.log('Client was logged out', reason);\n});\n\nclient.on('contact_changed', async (message, oldId, newId, isContact) => {\n    /** The time the event occurred. */\n    const eventTime = new Date(message.timestamp * 1000).toLocaleString();\n\n    console.log(\n        `The contact ${oldId.slice(0, -5)}` +\n            `${\n                !isContact\n                    ? ' that participates in group ' +\n                      `${(await client.getChatById(message.to ?? message.from)).name} `\n                    : ' '\n            }` +\n            `changed their phone number\\nat ${eventTime}.\\n` +\n            `Their new phone number is ${newId.slice(0, -5)}.\\n`,\n    );\n\n    /**\n     * Information about the @param {message}:\n     *\n     * 1. If a notification was emitted due to a group participant changing their phone number:\n     * @param {message.author} is a participant's id before the change.\n     * @param {message.recipients[0]} is a participant's id after the change (a new one).\n     *\n     * 1.1 If the contact who changed their number WAS in the current user's contact list at the time of the change:\n     * @param {message.to} is a group chat id the event was emitted in.\n     * @param {message.from} is a current user's id that got an notification message in the group.\n     * Also the @param {message.fromMe} is TRUE.\n     *\n     * 1.2 Otherwise:\n     * @param {message.from} is a group chat id the event was emitted in.\n     * @param {message.to} is @type {undefined}.\n     * Also @param {message.fromMe} is FALSE.\n     *\n     * 2. If a notification was emitted due to a contact changing their phone number:\n     * @param {message.templateParams} is an array of two user's ids:\n     * the old (before the change) and a new one, stored in alphabetical order.\n     * @param {message.from} is a current user's id that has a chat with a user,\n     * whos phone number was changed.\n     * @param {message.to} is a user's id (after the change), the current user has a chat with.\n     */\n});\n\nclient.on('group_admin_changed', (notification) => {\n    if (notification.type === 'promote') {\n        /**\n         * Emitted when a current user is promoted to an admin.\n         * {@link notification.author} is a user who performs the action of promoting/demoting the current user.\n         */\n        console.log(`You were promoted by ${notification.author}`);\n    } else if (notification.type === 'demote')\n        /** Emitted when a current user is demoted to a regular user. */\n        console.log(`You were demoted by ${notification.author}`);\n});\n\nclient.on('group_membership_request', async (notification) => {\n    /**\n     * The example of the {@link notification} output:\n     * {\n     *     id: {\n     *         fromMe: false,\n     *         remote: 'groupId@g.us',\n     *         id: '123123123132132132',\n     *         participant: 'number@c.us',\n     *         _serialized: 'false_groupId@g.us_123123123132132132_number@c.us'\n     *     },\n     *     body: '',\n     *     type: 'created_membership_requests',\n     *     timestamp: 1694456538,\n     *     chatId: 'groupId@g.us',\n     *     author: 'number@c.us',\n     *     recipientIds: []\n     * }\n     *\n     */\n    console.log(notification);\n    /** You can approve or reject the newly appeared membership request: */\n    await client.approveGroupMembershipRequestss(\n        notification.chatId,\n        notification.author,\n    );\n    await client.rejectGroupMembershipRequests(\n        notification.chatId,\n        notification.author,\n    );\n});\n\nclient.on('message_reaction', async (reaction) => {\n    console.log('REACTION RECEIVED', reaction);\n});\n\nclient.on('vote_update', (vote) => {\n    /** The vote that was affected: */\n    console.log(vote);\n});\n"
  },
  {
    "path": "index.d.ts",
    "content": "import { EventEmitter } from 'events';\nimport { RequestInit } from 'node-fetch';\nimport * as puppeteer from 'puppeteer';\nimport InterfaceController from './src/util/InterfaceController';\n\ndeclare namespace WAWebJS {\n    export class Client extends EventEmitter {\n        constructor(options: ClientOptions);\n\n        /** Current connection information */\n        public info: ClientInfo;\n\n        /** Puppeteer page running WhatsApp Web */\n        pupPage?: puppeteer.Page;\n\n        /** Puppeteer browser running WhatsApp Web */\n        pupBrowser?: puppeteer.Browser;\n\n        /** Client interactivity interface */\n        interface?: InterfaceController;\n\n        /**Accepts an invitation to join a group */\n        acceptInvite(inviteCode: string): Promise<string>;\n\n        /** Accepts a channel admin invitation and promotes the current user to a channel admin */\n        acceptChannelAdminInvite(channelId: string): Promise<boolean>;\n\n        /** Revokes a channel admin invitation sent to a user by a channel owner */\n        revokeChannelAdminInvite(\n            channelId: string,\n            userId: string,\n        ): Promise<boolean>;\n\n        /** Demotes a channel admin to a regular subscriber (can be used also for self-demotion) */\n        demoteChannelAdmin(channelId: string, userId: string): Promise<boolean>;\n\n        /** Accepts a private invitation to join a group (v4 invite) */\n        acceptGroupV4Invite: (\n            inviteV4: InviteV4Data,\n        ) => Promise<{ status: number }>;\n\n        /**Returns an object with information about the invite code's group */\n        getInviteInfo(inviteCode: string): Promise<object>;\n\n        /** Enables and returns the archive state of the Chat */\n        archiveChat(chatId: string): Promise<boolean>;\n\n        /** Pins the Chat and returns its new Pin state */\n        pinChat(chatId: string): Promise<boolean>;\n\n        /** Unpins the Chat and returns its new Pin state */\n        unpinChat(chatId: string): Promise<boolean>;\n\n        /** Creates a new group */\n        createGroup(\n            title: string,\n            participants?: string | Contact | Contact[] | string[],\n            options?: CreateGroupOptions,\n        ): Promise<CreateGroupResult | string>;\n\n        /** Creates a new channel */\n        createChannel(\n            title: string,\n            options?: CreateChannelOptions,\n        ): Promise<CreateChannelResult | string>;\n\n        /** Deletes the channel you created */\n        deleteChannel(channelId: string): Promise<boolean>;\n\n        /** Subscribe to channel */\n        subscribeToChannel(channelId: string): Promise<boolean>;\n\n        /** Unsubscribe from channel */\n        unsubscribeFromChannel(\n            channelId: string,\n            options?: UnsubscribeOptions,\n        ): Promise<boolean>;\n\n        /**\n         * Searches for channels based on search criteria, there are some notes:\n         * 1. The method finds only channels you are not subscribed to currently\n         * 2. If you have never been subscribed to a found channel\n         * or you have unsubscribed from it with {@link UnsubscribeOptions.deleteLocalModels} set to 'true',\n         * the lastMessage property of a found channel will be 'null'\n         */\n        searchChannels(\n            searchOptions: SearchChannelsOptions,\n        ): Promise<Array<Channel> | []>;\n\n        /** Closes the client */\n        destroy(): Promise<void>;\n\n        /** Logs out the client, closing the current session */\n        logout(): Promise<void>;\n\n        /** Get all blocked contacts by host account */\n        getBlockedContacts(): Promise<Contact[]>;\n\n        /** Gets chat or channel instance by ID */\n        getChatById(chatId: string): Promise<Chat>;\n\n        /** Gets a {@link Channel} instance by invite code */\n        getChannelByInviteCode(inviteCode: string): Promise<Channel>;\n\n        /** Get all current chat instances */\n        getChats(): Promise<Chat[]>;\n\n        /** Gets all cached {@link Channel} instances */\n        getChannels(): Promise<Channel[]>;\n\n        /** Get contact instance by ID */\n        getContactById(contactId: string): Promise<Contact>;\n\n        /** Get message by ID */\n        getMessageById(messageId: string): Promise<Message>;\n\n        /** Gets instances of all pinned messages in a chat */\n        getPinnedMessages(chatId: string): Promise<[Message] | []>;\n\n        /** Get all current contact instances */\n        getContacts(): Promise<Contact[]>;\n\n        /** Get the country code of a WhatsApp ID. (154185968@c.us) => (1) */\n        getCountryCode(number: string): Promise<string>;\n\n        /** Get the formatted number of a WhatsApp ID. (12345678901@c.us) => (+1 (234) 5678-901) */\n        getFormattedNumber(number: string): Promise<string>;\n\n        /** Get all current Labels  */\n        getLabels(): Promise<Label[]>;\n\n        /** Get all current Broadcasts  */\n        getBroadcasts(): Promise<Broadcast[]>;\n\n        /** Get broadcast instance by current user ID */\n        getBroadcastById(contactId: string): Promise<Broadcast>;\n\n        /** Revoke current own status messages */\n        revokeStatusMessage(messageId: string): Promise<void>;\n\n        /** Change labels in chats  */\n        addOrRemoveLabels(\n            labelIds: Array<number | string>,\n            chatIds: Array<string>,\n        ): Promise<void>;\n\n        /** Get Label instance by ID */\n        getLabelById(labelId: string): Promise<Label>;\n\n        /** Get all Labels assigned to a Chat */\n        getChatLabels(chatId: string): Promise<Label[]>;\n\n        /** Get all Chats for a specific Label */\n        getChatsByLabelId(labelId: string): Promise<Chat[]>;\n\n        /** Returns the contact ID's profile picture URL, if privacy settings allow it */\n        getProfilePicUrl(contactId: string): Promise<string>;\n\n        /** Gets the Contact's common groups with you. Returns empty array if you don't have any common group. */\n        getCommonGroups(contactId: string): Promise<ChatId[]>;\n\n        /** Gets the current connection state for the client */\n        getState(): Promise<WAState>;\n\n        /** Returns the version of WhatsApp Web currently being run */\n        getWWebVersion(): Promise<string>;\n\n        /** Sets up events and requirements, kicks off authentication request */\n        initialize(): Promise<void>;\n\n        /** Check if a given ID is registered in whatsapp */\n        isRegisteredUser(contactId: string): Promise<boolean>;\n\n        /** Get the registered WhatsApp ID for a number. Returns null if the number is not registered on WhatsApp. */\n        getNumberId(number: string): Promise<ContactId | null>;\n\n        /**\n         * Mutes this chat forever, unless a date is specified\n         * @param chatId ID of the chat that will be muted\n         * @param unmuteDate Date when the chat will be unmuted, leave as is to mute forever\n         */\n        muteChat(\n            chatId: string,\n            unmuteDate?: Date,\n        ): Promise<{ isMuted: boolean; muteExpiration: number }>;\n\n        /**\n         * Request authentication via pairing code instead of QR code\n         * @param phoneNumber - Phone number in international, symbol-free format (e.g. 12025550108 for US, 551155501234 for Brazil)\n         * @param showNotification - Show notification to pair on phone number. Defaults to `true`\n         * @param intervalMs - The interval in milliseconds on how frequent to generate pairing code (WhatsApp default to 3 minutes). Defaults to `180000`\n         * @returns {Promise<string>} - Returns a pairing code in format \"ABCDEFGH\"\n         */\n        requestPairingCode(\n            phoneNumber: string,\n            showNotification?: boolean,\n            intervalMs?: number,\n        ): Promise<string>;\n\n        /** Force reset of connection state for the client */\n        resetState(): Promise<void>;\n\n        /** Send a message to a specific chatId */\n        sendMessage(\n            chatId: string,\n            content: MessageContent,\n            options?: MessageSendOptions,\n        ): Promise<Message>;\n\n        /** Sends a channel admin invitation to a user, allowing them to become an admin of the channel */\n        sendChannelAdminInvite(\n            chatId: string,\n            channelId: string,\n            options?: { comment?: string },\n        ): Promise<boolean>;\n\n        /** Searches for messages */\n        searchMessages(\n            query: string,\n            options?: { chatId?: string; page?: number; limit?: number },\n        ): Promise<Message[]>;\n\n        /** Marks the client as online */\n        sendPresenceAvailable(): Promise<void>;\n\n        /** Marks the client as offline */\n        sendPresenceUnavailable(): Promise<void>;\n\n        /** Mark as seen for the Chat */\n        sendSeen(chatId: string): Promise<boolean>;\n\n        /** Mark the Chat as unread */\n        markChatUnread(chatId: string): Promise<void>;\n\n        /**\n         * Sets the current user's status message\n         * @param status New status message\n         */\n        setStatus(status: string): Promise<void>;\n\n        /**\n         * Sets the current user's display name\n         * @param displayName New display name\n         */\n        setDisplayName(displayName: string): Promise<boolean>;\n\n        /**\n         * Changes the autoload Audio\n         * @param flag true/false on or off\n         */\n        setAutoDownloadAudio(flag: boolean): Promise<void>;\n        /**\n         * Changes the autoload Documents\n         * @param flag true/false on or off\n         */\n        setAutoDownloadDocuments(flag: boolean): Promise<void>;\n        /**\n         * Changes the autoload Photos\n         * @param flag true/false on or off\n         */\n        setAutoDownloadPhotos(flag: boolean): Promise<void>;\n        /**\n         * Changes the autoload Videos\n         * @param flag true/false on or off\n         */\n        setAutoDownloadVideos(flag: boolean): Promise<void>;\n\n        /**\n         * Changing the background synchronization setting.\n         * NOTE: this action will take effect after you restart the client.\n         * @param flag true/false on or off\n         */\n        setBackgroundSync(flag: boolean): Promise<void>;\n\n        /**\n         * Get user device count by ID\n         * Each WaWeb Connection counts as one device, and the phone (if exists) counts as one\n         * So for a non-enterprise user with one WaWeb connection it should return \"2\"\n         * @param {string} contactId\n         */\n        getContactDeviceCount(userId: string): Promise<number>;\n\n        /** Sync history conversation of the Chat */\n        syncHistory(chatId: string): Promise<boolean>;\n\n        /** Save new contact to user's addressbook or edit the existing one */\n        saveOrEditAddressbookContact(\n            phoneNumber: string,\n            firstName: string,\n            lastName: string,\n            syncToAddressbook?: boolean,\n        ): Promise<void>;\n\n        /**\n         * Add or edit a customer note\n         * @see https://faq.whatsapp.com/1433099287594476\n         */\n        addOrEditCustomerNote(userId: string, note: string): Promise<void>;\n\n        /**\n         * Get a customer note\n         * @see https://faq.whatsapp.com/1433099287594476\n         */\n        getCustomerNote(userId: string): Promise<{\n            chatId: string;\n            content: string;\n            createdAt: number;\n            id: string;\n            modifiedAt: number;\n            type: string;\n        }>;\n\n        /** Deletes the contact from user's addressbook */\n        deleteAddressbookContact(honeNumber: string): Promise<void>;\n\n        /** Get Contact lid and phone */\n        getContactLidAndPhone(\n            userIds: string[],\n        ): Promise<{ lid: string; pn: string }[]>;\n\n        /** Changes and returns the archive state of the Chat */\n        unarchiveChat(chatId: string): Promise<boolean>;\n\n        /** Unmutes the Chat */\n        unmuteChat(\n            chatId: string,\n        ): Promise<{ isMuted: boolean; muteExpiration: number }>;\n\n        /** Sets the current user's profile picture */\n        setProfilePicture(media: MessageMedia): Promise<boolean>;\n\n        /** Deletes the current user's profile picture */\n        deleteProfilePicture(): Promise<boolean>;\n\n        /** Generates a WhatsApp call link (video call or voice call) */\n        createCallLink(startTime: Date, callType: string): Promise<string>;\n\n        /**\n         * Sends a response to the scheduled event message, indicating whether a user is going to attend the event or not\n         * @param response The response code to the event message. Valid values are: `0` for NONE response (removes a previous response) | `1` for GOING | `2` for NOT GOING | `3` for MAYBE going\n         * @param eventMessageId The event message ID\n         */\n        sendResponseToScheduledEvent(\n            response: number,\n            eventMessageId: string,\n        ): Promise<boolean>;\n\n        /** Gets an array of membership requests */\n        getGroupMembershipRequests(\n            groupId: string,\n        ): Promise<Array<GroupMembershipRequest>>;\n\n        /** Approves membership requests if any */\n        approveGroupMembershipRequests(\n            groupId: string,\n            options: MembershipRequestActionOptions,\n        ): Promise<Array<MembershipRequestActionResult>>;\n\n        /** Rejects membership requests if any */\n        rejectGroupMembershipRequests(\n            groupId: string,\n            options: MembershipRequestActionOptions,\n        ): Promise<Array<MembershipRequestActionResult>>;\n\n        /**\n         * Transfers a channel ownership to another user.\n         * Note: the user you are transferring the channel ownership to must be a channel admin.\n         */\n        transferChannelOwnership(\n            channelId: string,\n            newOwnerId: string,\n            options?: TransferChannelOwnershipOptions,\n        ): Promise<boolean>;\n\n        /** Get Poll Votes */\n        getPollVotes(messageId: string): Promise<PollVote[]>;\n\n        /** Generic event */\n        on(event: string, listener: (...args: any) => void): this;\n\n        /** Emitted when there has been an error while trying to restore an existing session */\n        on(event: 'auth_failure', listener: (message: string) => void): this;\n\n        /** Emitted when authentication is successful */\n        on(event: 'authenticated', listener: () => void): this;\n\n        /**\n         * Emitted when the battery percentage for the attached device changes\n         * @deprecated\n         */\n        on(\n            event: 'change_battery',\n            listener: (batteryInfo: BatteryInfo) => void,\n        ): this;\n\n        /** Emitted when the connection state changes */\n        on(\n            event: 'change_state',\n            listener: (\n                /** the new connection state */\n                state: WAState,\n            ) => void,\n        ): this;\n\n        /** Emitted when the client has been disconnected */\n        on(\n            event: 'disconnected',\n            listener: (\n                /** reason that caused the disconnect */\n                reason: WAState | 'LOGOUT',\n            ) => void,\n        ): this;\n\n        /** Emitted when a user joins the chat via invite link or is added by an admin */\n        on(\n            event: 'group_join',\n            listener: (\n                /** GroupNotification with more information about the action */\n                notification: GroupNotification,\n            ) => void,\n        ): this;\n\n        /** Emitted when a user leaves the chat or is removed by an admin */\n        on(\n            event: 'group_leave',\n            listener: (\n                /** GroupNotification with more information about the action */\n                notification: GroupNotification,\n            ) => void,\n        ): this;\n\n        /** Emitted when a current user is promoted to an admin or demoted to a regular user */\n        on(\n            event: 'group_admin_changed',\n            listener: (\n                /** GroupNotification with more information about the action */\n                notification: GroupNotification,\n            ) => void,\n        ): this;\n\n        /**\n         * Emitted when some user requested to join the group\n         * that has the membership approval mode turned on\n         */\n        on(\n            event: 'group_membership_request',\n            listener: (\n                /** GroupNotification with more information about the action */\n                notification: GroupNotification,\n            ) => void,\n        ): this;\n\n        /** Emitted when group settings are updated, such as subject, description or picture */\n        on(\n            event: 'group_update',\n            listener: (\n                /** GroupNotification with more information about the action */\n                notification: GroupNotification,\n            ) => void,\n        ): this;\n\n        /** Emitted when a contact or a group participant changed their phone number. */\n        on(\n            event: 'contact_changed',\n            listener: (\n                /** Message with more information about the event. */\n                message: Message,\n                /** Old user's id. */\n                oldId: String,\n                /** New user's id. */\n                newId: String,\n                /** Indicates if a contact or a group participant changed their phone number. */\n                isContact: Boolean,\n            ) => void,\n        ): this;\n\n        /** Emitted when media has been uploaded for a message sent by the client */\n        on(\n            event: 'media_uploaded',\n            listener: (\n                /** The message with media that was uploaded */\n                message: Message,\n            ) => void,\n        ): this;\n\n        /** Emitted when a new message is received */\n        on(\n            event: 'message',\n            listener: (\n                /** The message that was received */\n                message: Message,\n            ) => void,\n        ): this;\n\n        /** Emitted when an ack event occurrs on message type */\n        on(\n            event: 'message_ack',\n            listener: (\n                /** The message that was affected */\n                message: Message,\n                /** The new ACK value */\n                ack: MessageAck,\n            ) => void,\n        ): this;\n\n        /** Emitted when an edit event occurrs on message type */\n        on(\n            event: 'message_edit',\n            listener: (\n                /** The message that was affected */\n                message: Message,\n                /** New text message */\n                newBody: String,\n                /** Prev text message */\n                prevBody: String,\n            ) => void,\n        ): this;\n\n        /** Emitted when a chat unread count changes */\n        on(\n            event: 'unread_count',\n            listener: (\n                /** The chat that was affected */\n                chat: Chat,\n            ) => void,\n        ): this;\n\n        /** Emitted when a new message is created, which may include the current user's own messages */\n        on(\n            event: 'message_create',\n            listener: (\n                /** The message that was created */\n                message: Message,\n            ) => void,\n        ): this;\n\n        /** Emitted when a new message ciphertext is received  */\n        on(\n            event: 'message_ciphertext',\n            listener: (\n                /** The message that was ciphertext */\n                message: Message,\n            ) => void,\n        ): this;\n\n        /** Emitted when a message is deleted for everyone in the chat */\n        on(\n            event: 'message_revoke_everyone',\n            listener: (\n                /** The message that was revoked, in its current state. It will not contain the original message's data */\n                message: Message,\n                /**The message that was revoked, before it was revoked.\n                 * It will contain the message's original data.\n                 * Note that due to the way this data is captured,\n                 * it may be possible that this param will be undefined. */\n                revoked_msg?: Message | null,\n            ) => void,\n        ): this;\n\n        /** Emitted when a message is deleted by the current user */\n        on(\n            event: 'message_revoke_me',\n            listener: (\n                /** The message that was revoked */\n                message: Message,\n            ) => void,\n        ): this;\n\n        /** Emitted when a reaction is sent, received, updated or removed */\n        on(\n            event: 'message_reaction',\n            listener: (\n                /** The reaction object */\n                reaction: Reaction,\n            ) => void,\n        ): this;\n\n        /** Emitted when a chat is removed */\n        on(\n            event: 'chat_removed',\n            listener: (\n                /** The chat that was removed */\n                chat: Chat,\n            ) => void,\n        ): this;\n\n        /** Emitted when a chat is archived/unarchived */\n        on(\n            event: 'chat_archived',\n            listener: (\n                /** The chat that was archived/unarchived */\n                chat: Chat,\n                /** State the chat is currently in */\n                currState: boolean,\n                /** State the chat was previously in */\n                prevState: boolean,\n            ) => void,\n        ): this;\n\n        /** Emitted when loading screen is appearing */\n        on(\n            event: 'loading_screen',\n            listener: (percent: string, message: string) => void,\n        ): this;\n\n        /** Emitted when the QR code is received */\n        on(\n            event: 'qr',\n            listener: (\n                /** qr code string\n                 *  @example ```1@9Q8tWf6bnezr8uVGwVCluyRuBOJ3tIglimzI5dHB0vQW2m4DQ0GMlCGf,f1/vGcW4Z3vBa1eDNl3tOjWqLL5DpYTI84DMVkYnQE8=,ZL7YnK2qdPN8vKo2ESxhOQ==``` */\n                qr: string,\n            ) => void,\n        ): this;\n\n        /** Emitted when the phone number pairing code is received */\n        on(\n            event: 'code',\n            listener: (\n                /** pairing code string\n                 *  @example `8W2WZ3TS` */\n                code: string,\n            ) => void,\n        ): this;\n\n        /** Emitted when a call is received */\n        on(\n            event: 'call',\n            listener: (\n                /** The call that started */\n                call: Call,\n            ) => void,\n        ): this;\n\n        /** Emitted when the client has initialized and is ready to receive messages */\n        on(event: 'ready', listener: () => void): this;\n\n        /** Emitted when the RemoteAuth session is saved successfully on the external Database */\n        on(event: 'remote_session_saved', listener: () => void): this;\n\n        /**\n         * Emitted when some poll option is selected or deselected,\n         * shows a user's current selected option(s) on the poll\n         */\n        on(event: 'vote_update', listener: (vote: PollVote) => void): this;\n    }\n\n    /** Current connection information */\n    export interface ClientInfo {\n        /**\n         * Current user ID\n         * @deprecated Use .wid instead\n         */\n        me: ContactId;\n        /** Current user ID */\n        wid: ContactId;\n        /**\n         * Information about the phone this client is connected to.  Not available in multi-device.\n         * @deprecated\n         */\n        phone: ClientInfoPhone;\n        /** Platform the phone is running on */\n        platform: string;\n        /** Name configured to be shown in push notifications */\n        pushname: string;\n\n        /** Get current battery percentage and charging status for the attached device */\n        getBatteryStatus: () => Promise<BatteryInfo>;\n    }\n\n    /**\n     * Information about the phone this client is connected to\n     * @deprecated\n     */\n    export interface ClientInfoPhone {\n        /** WhatsApp Version running on the phone */\n        wa_version: string;\n        /** OS Version running on the phone (iOS or Android version) */\n        os_version: string;\n        /** Device manufacturer */\n        device_manufacturer: string;\n        /** Device model */\n        device_model: string;\n        /** OS build number */\n        os_build_number: string;\n    }\n\n    /** Options for initializing the whatsapp client */\n    export interface ClientOptions {\n        /** Timeout for authentication selector in puppeteer\n         * @default 0 */\n        authTimeoutMs?: number;\n        /** function to be evaluated On New Document\n         * @default undefined */\n        evalOnNewDoc?: Function;\n        /** Puppeteer launch options. View docs here: https://github.com/puppeteer/puppeteer/ */\n        puppeteer?: puppeteer.PuppeteerNodeLaunchOptions &\n            puppeteer.ConnectOptions;\n        /** Determines how to save and restore sessions. Will use LegacySessionAuth if options.session is set. Otherwise, NoAuth will be used. */\n        authStrategy?: AuthStrategy;\n        /** The version of WhatsApp Web to use. Use options.webVersionCache to configure how the version is retrieved. */\n        webVersion?: string;\n        /**  Determines how to retrieve the WhatsApp Web version specified in options.webVersion. */\n        webVersionCache?: WebCacheOptions;\n        /** How many times should the qrcode be refreshed before giving up\n         * @default 0 (disabled) */\n        qrMaxRetries?: number;\n        /** If another whatsapp web session is detected (another browser), take over the session in the current browser\n         * @default false */\n        takeoverOnConflict?: boolean;\n        /** How much time to wait before taking over the session\n         * @default 0 */\n        takeoverTimeoutMs?: number;\n        /** User agent to use in puppeteer.\n         * @default 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.109 Safari/537.36' */\n        userAgent?: string;\n        /** Ffmpeg path to use when formatting videos to webp while sending stickers\n         * @default 'ffmpeg' */\n        ffmpegPath?: string;\n        /** Sets bypassing of page's Content-Security-Policy\n         * @default false */\n        bypassCSP?: boolean;\n        /** Sets the device name of a current linked device., i.e.: 'TEST' */\n        deviceName?: string;\n        /**\n         * Sets the browser name of a current linked device, i.e.: 'Firefox'.\n         * Valid value are: 'Chrome' | 'Firefox' | 'IE' | 'Opera' | 'Safari' | 'Edge'\n         */\n        browserName?: string;\n        /** Object with proxy autentication requirements @default: undefined */\n        proxyAuthentication?:\n            | { username: string; password: string }\n            | undefined;\n        /** Phone number pairing configuration. Refer the requestPairingCode function of Client.\n         * @default\n         * {\n         *   phoneNumber: \"\",\n         *   showNotification: true,\n         *   intervalMs: 180000,\n         * }\n         */\n        pairWithPhoneNumber?: {\n            phoneNumber: string;\n            showNotification?: boolean;\n            intervalMs?: number;\n        };\n    }\n\n    export interface LocalWebCacheOptions {\n        type: 'local';\n        path?: string;\n        strict?: boolean;\n    }\n\n    export interface RemoteWebCacheOptions {\n        type: 'remote';\n        remotePath: string;\n        strict?: boolean;\n    }\n\n    export interface NoWebCacheOptions {\n        type: 'none';\n    }\n\n    export type WebCacheOptions =\n        | NoWebCacheOptions\n        | LocalWebCacheOptions\n        | RemoteWebCacheOptions;\n\n    /**\n     * Base class which all authentication strategies extend\n     */\n    export abstract class AuthStrategy {\n        setup: (client: Client) => void;\n        beforeBrowserInitialized: () => Promise<void>;\n        afterBrowserInitialized: () => Promise<void>;\n        onAuthenticationNeeded: () => Promise<{\n            failed?: boolean;\n            restart?: boolean;\n            failureEventPayload?: any;\n        }>;\n        getAuthEventPayload: () => Promise<any>;\n        afterAuthReady: () => Promise<void>;\n        disconnect: () => Promise<void>;\n        destroy: () => Promise<void>;\n        logout: () => Promise<void>;\n    }\n\n    /**\n     * No session restoring functionality\n     * Will need to authenticate via QR code every time\n     */\n    export class NoAuth extends AuthStrategy {}\n\n    /**\n     * Local directory-based authentication\n     */\n    export class LocalAuth extends AuthStrategy {\n        public clientId?: string;\n        public dataPath?: string;\n        constructor(options?: {\n            clientId?: string;\n            dataPath?: string;\n            rmMaxRetries?: number;\n        });\n    }\n\n    /**\n     * Remote-based authentication\n     */\n    export class RemoteAuth extends AuthStrategy {\n        public clientId?: string;\n        public dataPath?: string;\n        constructor(options?: {\n            store: Store;\n            clientId?: string;\n            dataPath?: string;\n            backupSyncIntervalMs: number;\n            rmMaxRetries?: number;\n        });\n    }\n\n    /**\n     * Remote store interface\n     */\n    export interface Store {\n        sessionExists: (options: {\n            session: string;\n        }) => Promise<boolean> | boolean;\n        delete: (options: { session: string }) => Promise<any> | any;\n        save: (options: { session: string }) => Promise<any> | any;\n        extract: (options: {\n            session: string;\n            path: string;\n        }) => Promise<any> | any;\n    }\n\n    /**\n     * @deprecated\n     */\n    export interface BatteryInfo {\n        /** The current battery percentage */\n        battery: number;\n        /** Indicates if the phone is plugged in (true) or not (false) */\n        plugged: boolean;\n    }\n\n    /** An object that handles options for group creation */\n    export interface CreateGroupOptions {\n        /**\n         * The number of seconds for the messages to disappear in the group,\n         * won't take an effect if the group is been creating with myself only\n         * @default 0\n         */\n        messageTimer?: number;\n        /**\n         * The ID of a parent community group to link the newly created group with,\n         * won't take an effect if the group is been creating with myself only\n         */\n        parentGroupId?: string;\n        /** If true, the inviteV4 will be sent to those participants\n         * who have restricted others from being automatically added to groups,\n         * otherwise the inviteV4 won't be sent\n         * @default true\n         */\n        autoSendInviteV4?: boolean;\n        /**\n         * The comment to be added to an inviteV4 (empty string by default)\n         * @default ''\n         */\n        comment?: string;\n        /** If true, only admins can add members to the group (false by default)\n         * @default false\n         */\n        memberAddMode?: boolean;\n        /** If true, group admins will be required to approve anyone who wishes to join the group (false by default)\n         * @default false\n         */\n        membershipApprovalMode?: boolean;\n        /** If true, only admins can change group group info (true by default)\n         * @default true\n         */\n        isRestrict?: boolean;\n        /** If true, only admins can send messages (false by default)\n         * @default false\n         */\n        isAnnounce?: boolean;\n    }\n\n    /** An object that handles the result for createGroup method */\n    export interface CreateGroupResult {\n        /** A group title */\n        title: string;\n        /** An object that handles the newly created group ID */\n        gid: ChatId;\n        /** An object that handles the result value for each added to the group participant */\n        participants: {\n            [participantId: string]: {\n                statusCode: number;\n                message: string;\n                isGroupCreator: boolean;\n                isInviteV4Sent: boolean;\n            };\n        };\n    }\n\n    /** An object that handles options for channel creation */\n    export interface CreateChannelOptions {\n        /** The channel description */\n        description?: string;\n        /** The channel profile picture */\n        picture?: MessageMedia;\n    }\n\n    /** An object that handles the result for createGroup method */\n    export interface CreateChannelResult {\n        /** A channel title */\n        title: string;\n        /** An object that handles the newly created channel ID */\n        nid: ChatId;\n        /** The channel invite link, starts with 'https://whatsapp.com/channel/' */\n        inviteLink: string;\n        /** The timestamp the channel was created at */\n        createdAtTs: number;\n    }\n\n    /** Options for unsubscribe from a channel */\n    export interface UnsubscribeOptions {\n        /**\n         * If true, after an unsubscription, it will completely remove a channel from the channel collection\n         * making it seem like the current user have never interacted with it.\n         * Otherwise it will only remove a channel from the list of channels the current user is subscribed to\n         * and will set the membership type for that channel to GUEST\n         */\n        deleteLocalModels?: boolean;\n    }\n\n    /** Options for searching for channels */\n    export interface SearchChannelsOptions {\n        searchText?: string;\n        countryCodes?: string[];\n        skipSubscribedNewsletters?: boolean;\n        view?: number;\n        limit?: number;\n    }\n\n    export interface GroupNotification {\n        /** ContactId for the user that produced the GroupNotification */\n        author: string;\n        /** Extra content */\n        body: string;\n        /** ID for the Chat that this groupNotification was sent for */\n        chatId: string;\n        /** ID that represents the groupNotification\n         *  @todo create a more specific type for the id object */\n        id: object;\n        /** Contact IDs for the users that were affected by this GroupNotification */\n        recipientIds: string[];\n        /** Unix timestamp for when the groupNotification was created */\n        timestamp: number;\n        /** GroupNotification type */\n        type: GroupNotificationTypes;\n\n        /** Returns the Chat this GroupNotification was sent in */\n        getChat: () => Promise<Chat>;\n        /** Returns the Contact this GroupNotification was produced by */\n        getContact: () => Promise<Contact>;\n        /** Returns the Contacts affected by this GroupNotification */\n        getRecipients: () => Promise<Contact[]>;\n        /** Sends a message to the same chat this GroupNotification was produced in */\n        reply: (\n            content: MessageContent,\n            options?: MessageSendOptions,\n        ) => Promise<Message>;\n    }\n\n    /** whatsapp web url */\n    export const WhatsWebURL: string;\n\n    /** default client options */\n    export const DefaultOptions: ClientOptions;\n\n    /** Chat types */\n    export enum ChatTypes {\n        SOLO = 'solo',\n        GROUP = 'group',\n        UNKNOWN = 'unknown',\n    }\n\n    /** Events that can be emitted by the client */\n    export enum Events {\n        AUTHENTICATED = 'authenticated',\n        AUTHENTICATION_FAILURE = 'auth_failure',\n        READY = 'ready',\n        CHAT_REMOVED = 'chat_removed',\n        CHAT_ARCHIVED = 'chat_archived',\n        MESSAGE_RECEIVED = 'message',\n        MESSAGE_CIPHERTEXT = 'message_ciphertext',\n        MESSAGE_CREATE = 'message_create',\n        MESSAGE_REVOKED_EVERYONE = 'message_revoke_everyone',\n        MESSAGE_REVOKED_ME = 'message_revoke_me',\n        MESSAGE_ACK = 'message_ack',\n        MESSAGE_EDIT = 'message_edit',\n        UNREAD_COUNT = 'unread_count',\n        MESSAGE_REACTION = 'message_reaction',\n        MEDIA_UPLOADED = 'media_uploaded',\n        CONTACT_CHANGED = 'contact_changed',\n        GROUP_JOIN = 'group_join',\n        GROUP_LEAVE = 'group_leave',\n        GROUP_ADMIN_CHANGED = 'group_admin_changed',\n        GROUP_MEMBERSHIP_REQUEST = 'group_membership_request',\n        GROUP_UPDATE = 'group_update',\n        QR_RECEIVED = 'qr',\n        CODE_RECEIVED = 'code',\n        LOADING_SCREEN = 'loading_screen',\n        CALL = 'call',\n        DISCONNECTED = 'disconnected',\n        STATE_CHANGED = 'change_state',\n        BATTERY_CHANGED = 'change_battery',\n        REMOTE_SESSION_SAVED = 'remote_session_saved',\n        INCOMING_CALL = 'call',\n        VOTE_UPDATE = 'vote_update',\n    }\n\n    /** Group notification types */\n    export enum GroupNotificationTypes {\n        ADD = 'add',\n        INVITE = 'invite',\n        REMOVE = 'remove',\n        LEAVE = 'leave',\n        PROMOTE = 'promote',\n        DEMOTE = 'demote',\n        SUBJECT = 'subject',\n        DESCRIPTION = 'description',\n        PICTURE = 'picture',\n        ANNOUNCE = 'announce',\n        RESTRICT = 'restrict',\n    }\n\n    /** Message ACK */\n    export enum MessageAck {\n        ACK_ERROR = -1,\n        ACK_PENDING = 0,\n        ACK_SERVER = 1,\n        ACK_DEVICE = 2,\n        ACK_READ = 3,\n        ACK_PLAYED = 4,\n    }\n\n    /** Message types */\n    export enum MessageTypes {\n        TEXT = 'chat',\n        AUDIO = 'audio',\n        VOICE = 'ptt',\n        IMAGE = 'image',\n        ALBUM = 'album',\n        VIDEO = 'video',\n        DOCUMENT = 'document',\n        STICKER = 'sticker',\n        LOCATION = 'location',\n        CONTACT_CARD = 'vcard',\n        CONTACT_CARD_MULTI = 'multi_vcard',\n        REVOKED = 'revoked',\n        ORDER = 'order',\n        PRODUCT = 'product',\n        PAYMENT = 'payment',\n        UNKNOWN = 'unknown',\n        GROUP_INVITE = 'groups_v4_invite',\n        LIST = 'list',\n        LIST_RESPONSE = 'list_response',\n        BUTTONS_RESPONSE = 'buttons_response',\n        BROADCAST_NOTIFICATION = 'broadcast_notification',\n        CALL_LOG = 'call_log',\n        CIPHERTEXT = 'ciphertext',\n        DEBUG = 'debug',\n        E2E_NOTIFICATION = 'e2e_notification',\n        GP2 = 'gp2',\n        GROUP_NOTIFICATION = 'group_notification',\n        HSM = 'hsm',\n        INTERACTIVE = 'interactive',\n        NATIVE_FLOW = 'native_flow',\n        NOTIFICATION = 'notification',\n        NOTIFICATION_TEMPLATE = 'notification_template',\n        OVERSIZED = 'oversized',\n        PROTOCOL = 'protocol',\n        REACTION = 'reaction',\n        TEMPLATE_BUTTON_REPLY = 'template_button_reply',\n        POLL_CREATION = 'poll_creation',\n        SCHEDULED_EVENT_CREATION = 'scheduled_event_creation',\n    }\n\n    /** Client status */\n    export enum Status {\n        INITIALIZING = 0,\n        AUTHENTICATING = 1,\n        READY = 3,\n    }\n\n    /** WhatsApp state */\n    export enum WAState {\n        CONFLICT = 'CONFLICT',\n        CONNECTED = 'CONNECTED',\n        DEPRECATED_VERSION = 'DEPRECATED_VERSION',\n        OPENING = 'OPENING',\n        PAIRING = 'PAIRING',\n        PROXYBLOCK = 'PROXYBLOCK',\n        SMB_TOS_BLOCK = 'SMB_TOS_BLOCK',\n        TIMEOUT = 'TIMEOUT',\n        TOS_BLOCK = 'TOS_BLOCK',\n        UNLAUNCHED = 'UNLAUNCHED',\n        UNPAIRED = 'UNPAIRED',\n        UNPAIRED_IDLE = 'UNPAIRED_IDLE',\n    }\n\n    export type MessageInfo = {\n        delivery: Array<{ id: ContactId; t: number }>;\n        deliveryRemaining: number;\n        played: Array<{ id: ContactId; t: number }>;\n        playedRemaining: number;\n        read: Array<{ id: ContactId; t: number }>;\n        readRemaining: number;\n    };\n\n    export type InviteV4Data = {\n        inviteCode: string;\n        inviteCodeExp: number;\n        groupId: string;\n        groupName?: string;\n        fromId: string;\n        toId: string;\n    };\n\n    /**\n     * Represents a Message on WhatsApp\n     *\n     * @example\n     * {\n     *   mediaKey: undefined,\n     *   id: {\n     *     fromMe: false,\n     *     remote: `554199999999@c.us`,\n     *     id: '1234567890ABCDEFGHIJ',\n     *     _serialized: `false_554199999999@c.us_1234567890ABCDEFGHIJ`\n     *   },\n     *   ack: -1,\n     *   hasMedia: false,\n     *   body: 'Hello!',\n     *   type: 'chat',\n     *   timestamp: 1591482682,\n     *   from: `554199999999@c.us`,\n     *   to: `554188888888@c.us`,\n     *   author: undefined,\n     *   isForwarded: false,\n     *   broadcast: false,\n     *   fromMe: false,\n     *   hasQuotedMsg: false,\n     *   hasReaction: false,\n     *   location: undefined,\n     *   mentionedIds: []\n     * }\n     */\n    export interface Message {\n        /** ACK status for the message */\n        ack: MessageAck;\n        /** If the message was sent to a group, this field will contain the user that sent the message. */\n        author?: string;\n        /** String that represents from which device type the message was sent */\n        deviceType: string;\n        /** Message content */\n        body: string;\n        /** Indicates if the message was a broadcast */\n        broadcast: boolean;\n        /** Indicates if the message was a status update */\n        isStatus: boolean;\n        /** Indicates if the message is a Gif */\n        isGif: boolean;\n        /** Indicates if the message will disappear after it expires */\n        isEphemeral: boolean;\n        /** ID for the Chat that this message was sent to, except if the message was sent by the current user */\n        from: string;\n        /** Indicates if the message was sent by the current user */\n        fromMe: boolean;\n        /** Indicates if the message has media available for download */\n        hasMedia: boolean;\n        /** Indicates if the message was sent as a reply to another message */\n        hasQuotedMsg: boolean;\n        /** Indicates whether there are reactions to the message */\n        hasReaction: boolean;\n        /** Indicates the duration of the message in seconds */\n        duration: string;\n        /** ID that represents the message */\n        id: MessageId;\n        /** Indicates if the message was forwarded */\n        isForwarded: boolean;\n        /**\n         * Indicates how many times the message was forwarded.\n         * The maximum value is 127.\n         */\n        forwardingScore: number;\n        /** Indicates if the message was starred */\n        isStarred: boolean;\n        /** Location information contained in the message, if the message is type \"location\" */\n        location: Location;\n        /** List of vCards contained in the message */\n        vCards: string[];\n        /** Invite v4 info */\n        inviteV4?: InviteV4Data;\n        /** MediaKey that represents the sticker 'ID' */\n        mediaKey?: string;\n        /** Indicates the mentions in the message body. */\n        mentionedIds: string[];\n        /** Indicates whether there are group mentions in the message body */\n        groupMentions: {\n            groupSubject: string;\n            groupJid: string;\n        }[];\n        /** Unix timestamp for when the message was created */\n        timestamp: number;\n        /**\n         * ID for who this message is for.\n         * If the message is sent by the current user, it will be the Chat to which the message is being sent.\n         * If the message is sent by another user, it will be the ID for the current user.\n         */\n        to: string;\n        /** Message type */\n        type: MessageTypes;\n        /** Links included in the message. */\n        links: Array<{\n            link: string;\n            isSuspicious: boolean;\n        }>;\n        /** Order ID */\n        orderId: string;\n        /** title */\n        title?: string;\n        /** description*/\n        description?: string;\n        /** Business Owner JID */\n        businessOwnerJid?: string;\n        /** Product JID */\n        productId?: string;\n        /** Last edit time */\n        latestEditSenderTimestampMs?: number;\n        /** Last edit message author */\n        latestEditMsgKey?: MessageId;\n        /**\n         * Protocol message key.\n         * Can be used to retrieve the ID of an original message that was revoked.\n         */\n        protocolMessageKey?: MessageId;\n        /** Message buttons */\n        dynamicReplyButtons?: object;\n        /** Selected button ID */\n        selectedButtonId?: string;\n        /** Selected list row ID */\n        selectedRowId?: string;\n        /** Returns message in a raw format */\n        rawData: object;\n        pollName: string;\n        /** Avaiaible poll voting options */\n        pollOptions: string[];\n        /** False for a single choice poll, true for a multiple choice poll */\n        allowMultipleAnswers: boolean;\n        /** The start time of the event in timestamp (10 digits) */\n        eventStartTime: number;\n        /** The end time of the event in timestamp (10 digits) */\n        eventEndTime?: number;\n        /** The event description */\n        eventDescription?: string;\n        /** The location of the event */\n        eventLocation?: {\n            degreesLatitude: number;\n            degreesLongitude: number;\n            name: string;\n        };\n        /** WhatsApp call link (video call or voice call) */\n        eventJoinLink?: string;\n        /** Indicates if an event should be sent as an already canceled */\n        isEventCaneled: boolean;\n        /** The custom message secret, can be used as an event ID */\n        messageSecret?: Array<number>;\n        /*\n         * Reloads this Message object's data in-place with the latest values from WhatsApp Web.\n         * Note that the Message must still be in the web app cache for this to work, otherwise will return null.\n         */\n        reload: () => Promise<Message>;\n        /** Accept the Group V4 Invite in message */\n        acceptGroupV4Invite: () => Promise<{ status: number }>;\n        /** Deletes the message from the chat */\n        delete: (everyone?: boolean, clearMedia?: boolean) => Promise<void>;\n        /** Downloads and returns the attached message media */\n        downloadMedia: () => Promise<MessageMedia>;\n        /** Returns the Chat this message was sent in */\n        getChat: () => Promise<Chat>;\n        /** Returns the Contact this message was sent from */\n        getContact: () => Promise<Contact>;\n        /** Returns the Contacts mentioned in this message */\n        getMentions: () => Promise<Contact[]>;\n        /** Returns groups mentioned in this message */\n        getGroupMentions: () => Promise<GroupChat[] | []>;\n        /** Returns the quoted message, if any */\n        getQuotedMessage: () => Promise<Message>;\n        /**\n         * Sends a message as a reply to this message.\n         * If chatId is specified, it will be sent through the specified Chat.\n         * If not, it will send the message in the same Chat as the original message was sent.\n         */\n        reply: (\n            content: MessageContent,\n            chatId?: string,\n            options?: MessageSendOptions,\n        ) => Promise<Message>;\n        /** React to this message with an emoji*/\n        react: (reaction: string) => Promise<void>;\n        /**\n         * Forwards this message to another chat (that you chatted before, otherwise it will fail)\n         */\n        forward: (chat: Chat | string) => Promise<void>;\n        /** Star this message */\n        star: () => Promise<void>;\n        /** Unstar this message */\n        unstar: () => Promise<void>;\n        /** Pins the message (group admins can pin messages of all group members) */\n        pin: (duration: number) => Promise<boolean>;\n        /** Unpins the message (group admins can unpin messages of all group members) */\n        unpin: () => Promise<boolean>;\n        /** Get information about message delivery status */\n        getInfo: () => Promise<MessageInfo | null>;\n        /**\n         * Gets the order associated with a given message\n         */\n        getOrder: () => Promise<Order>;\n        /**\n         * Gets the payment details associated with a given message\n         */\n        getPayment: () => Promise<Payment>;\n        /**\n         * Get Poll Votes associated with the given message\n         */\n        getPollVotes: () => Promise<PollVote[]>;\n        /**\n         * Gets the reactions associated with the given message\n         */\n        getReactions: () => Promise<ReactionList[]>;\n        /** Edits the current message */\n        edit: (\n            content: MessageContent,\n            options?: MessageEditOptions,\n        ) => Promise<Message | null>;\n        /**\n         * Edits the current ScheduledEvent message.\n         * Once the event is canceled, it can not be edited.\n         */\n        editScheduledEvent: (\n            editedEventObject: Event,\n        ) => Promise<Message | null>;\n        /**\n         * Send votes to the poll message\n         */\n        vote: (selectedOptions: Array<string>) => Promise<void>;\n    }\n\n    /** ID that represents a message */\n    export interface MessageId {\n        fromMe: boolean;\n        remote: string;\n        id: string;\n        _serialized: string;\n    }\n\n    /** Options for sending a location */\n    export interface LocationSendOptions {\n        /** Location name */\n        name?: string;\n        /** Location address */\n        address?: string;\n        /** URL address to be shown within a location message */\n        url?: string;\n    }\n\n    /** Location information */\n    export class Location {\n        latitude: string;\n        longitude: string;\n        name?: string;\n        address?: string;\n        url?: string;\n        description?: string;\n\n        constructor(\n            latitude: number,\n            longitude: number,\n            options?: LocationSendOptions,\n        );\n    }\n\n    /** Poll send options */\n    export interface PollSendOptions {\n        /** False for a single choice poll, true for a multiple choice poll (false by default) */\n        allowMultipleAnswers?: boolean;\n        /**\n         * The custom message secret, can be used as a poll ID\n         * @note It has to be a unique vector with a length of 32\n         */\n        messageSecret: Array<number> | undefined;\n    }\n\n    /** Represents a Poll on WhatsApp */\n    export class Poll {\n        pollName: string;\n        pollOptions: Array<{\n            name: string;\n            localId: number;\n        }>;\n        options: PollSendOptions;\n\n        constructor(\n            pollName: string,\n            pollOptions: Array<string>,\n            options?: PollSendOptions,\n        );\n    }\n\n    /** ScheduledEvent send options */\n    export interface ScheduledEventSendOptions {\n        /** The scheduled event description */\n        description?: string;\n        /** The end time of the event */\n        endTime?: Date;\n        /** The location of the event */\n        location?: string;\n        /** The type of a WhatsApp call link to generate, valid values are: `video` | `voice` | `none` */\n        callType?: string;\n        /**\n         * Indicates if a scheduled event should be sent as an already canceled\n         * @default false\n         */\n        isEventCanceled?: boolean;\n        /**\n         * The custom message secret, can be used as an event ID\n         * @note It has to be a unique vector with a length of 32\n         */\n        messageSecret: Array<number> | undefined;\n    }\n\n    /** Represents a ScheduledEvent on WhatsApp */\n    export class ScheduledEvent {\n        name: string;\n        startTimeTs: number;\n        eventSendOptions: {\n            description?: string;\n            endTimeTs?: number;\n            location?: string;\n            callType?: string;\n            isEventCanceled?: boolean;\n            messageSecret?: string;\n        };\n\n        constructor(\n            name: string,\n            startTime: Date,\n            options?: ScheduledEventSendOptions,\n        );\n    }\n\n    /** Represents a Poll Vote on WhatsApp */\n    export interface PollVote {\n        /** The person who voted */\n        voter: string;\n\n        /**\n         * The selected poll option(s)\n         * If it's an empty array, the user hasn't selected any options on the poll,\n         * may occur when they deselected all poll options\n         */\n        selectedOptions: SelectedPollOption[];\n\n        /** Timestamp the option was selected or deselected at */\n        interractedAtTs: number;\n\n        /** The poll creation message associated with the poll vote */\n        parentMessage: Message;\n    }\n\n    /** Selected poll option structure */\n    export interface SelectedPollOption {\n        /** The local selected option ID */\n        id: number;\n\n        /** The option name */\n        name: string;\n    }\n\n    export interface Label {\n        /** Label name */\n        name: string;\n        /** Label ID */\n        id: string;\n        /** Color assigned to the label */\n        hexColor: string;\n\n        /** Get all chats that have been assigned this Label */\n        getChats: () => Promise<Chat[]>;\n    }\n\n    export interface Broadcast {\n        /** Chat Object ID */\n        id: {\n            server: string;\n            user: string;\n            _serialized: string;\n        };\n        /** Unix timestamp of last story */\n        timestamp: number;\n        /** Number of available statuses */\n        totalCount: number;\n        /** Number of not viewed */\n        unreadCount: number;\n        /** Unix timestamp of last story */\n        msgs: Message[];\n\n        /** Returns the Chat of the owner of the story */\n        getChat: () => Promise<Chat>;\n        /** Returns the Contact of the owner of the story */\n        getContact: () => Promise<Contact>;\n    }\n\n    /** Options for sending a message */\n    export interface MessageSendOptions {\n        /** Show links preview. Has no effect on multi-device accounts. */\n        linkPreview?: boolean;\n        /** Send audio as voice message with a generated waveform */\n        sendAudioAsVoice?: boolean;\n        /** Send video as gif */\n        sendVideoAsGif?: boolean;\n        /** Send media as sticker */\n        sendMediaAsSticker?: boolean;\n        /** Send media as document */\n        sendMediaAsDocument?: boolean;\n        /** Send media as quality HD */\n        sendMediaAsHd?: boolean;\n        /** Send photo/video as a view once message */\n        isViewOnce?: boolean;\n        /** Automatically parse vCards and send them as contacts */\n        parseVCards?: boolean;\n        /** Image or videos caption */\n        caption?: string;\n        /** Id of the message that is being quoted (or replied to) */\n        quotedMessageId?: string;\n        /** User IDs to mention in the message */\n        mentions?: string[];\n        /** An array of object that handle group mentions */\n        groupMentions?: {\n            /** The name of a group to mention (can be custom) */\n            subject: string;\n            /** The group ID, e.g.: 'XXXXXXXXXX@g.us' */\n            id: string;\n        }[];\n        /** Send 'seen' status */\n        sendSeen?: boolean;\n        /** Bot Wid when doing a bot mention like @Meta AI */\n        invokedBotWid?: string;\n        /** Media to be sent */\n        media?: MessageMedia;\n        /** Extra options */\n        extra?: any;\n        /** Sticker name, if sendMediaAsSticker is true */\n        stickerName?: string;\n        /** Sticker author, if sendMediaAsSticker is true */\n        stickerAuthor?: string;\n        /** Sticker categories, if sendMediaAsSticker is true */\n        stickerCategories?: string[];\n        /** Should the bot send a quoted message without the quoted message if it fails to get the quote?\n         * @default true (enabled) */\n        ignoreQuoteErrors?: boolean;\n        /**\n         * Should the bot wait for the message send result?\n         * @default false\n         */\n        waitUntilMsgSent?: boolean;\n    }\n\n    /** Options for editing a message */\n    export interface MessageEditOptions {\n        /** Show links preview. Has no effect on multi-device accounts. */\n        linkPreview?: boolean;\n        /** User IDs of users that being mentioned in the message */\n        mentions?: string[];\n        /** Extra options */\n        extra?: any;\n    }\n\n    export interface MediaFromURLOptions {\n        client?: Client;\n        filename?: string;\n        unsafeMime?: boolean;\n        reqOptions?: RequestInit;\n    }\n\n    /** Media attached to a message */\n    export class MessageMedia {\n        /** MIME type of the attachment */\n        mimetype: string;\n        /** Base64-encoded data of the file */\n        data: string;\n        /** Document file name. Value can be null */\n        filename?: string | null;\n        /** Document file size in bytes. Value can be null. */\n        filesize?: number | null;\n\n        /**\n         * @param {string} mimetype MIME type of the attachment\n         * @param {string} data Base64-encoded data of the file\n         * @param {?string} filename Document file name. Value can be null\n         * @param {?number} filesize Document file size in bytes. Value can be null.\n         */\n        constructor(\n            mimetype: string,\n            data: string,\n            filename?: string | null,\n            filesize?: number | null,\n        );\n\n        /** Creates a MessageMedia instance from a local file path */\n        static fromFilePath: (filePath: string) => MessageMedia;\n\n        /** Creates a MessageMedia instance from a URL */\n        static fromUrl: (\n            url: string,\n            options?: MediaFromURLOptions,\n        ) => Promise<MessageMedia>;\n    }\n\n    export type MessageContent =\n        | string\n        | MessageMedia\n        | Location\n        | Poll\n        | Contact\n        | Contact[]\n        | List\n        | Buttons\n        | ScheduledEvent;\n\n    /**\n     * Represents a Contact on WhatsApp\n     *\n     * @example\n     * {\n     *   id: {\n     *     server: 'c.us',\n     *     user: '554199999999',\n     *     _serialized: `554199999999@c.us`\n     *   },\n     *   number: '554199999999',\n     *   isBusiness: false,\n     *   isEnterprise: false,\n     *   labels: [],\n     *   name: undefined,\n     *   pushname: 'John',\n     *   sectionHeader: undefined,\n     *   shortName: undefined,\n     *   statusMute: false,\n     *   type: 'in',\n     *   verifiedLevel: undefined,\n     *   verifiedName: undefined,\n     *   isMe: false,\n     *   isUser: true,\n     *   isGroup: false,\n     *   isWAContact: true,\n     *   isMyContact: false\n     * }\n     */\n    export interface Contact {\n        /** Contact's phone number */\n        number: string;\n        /** Indicates if the contact is a business contact */\n        isBusiness: boolean;\n        /** ID that represents the contact */\n        id: ContactId;\n        /** Indicates if the contact is an enterprise contact */\n        isEnterprise: boolean;\n        /** Indicates if the contact is a group contact */\n        isGroup: boolean;\n        /** Indicates if the contact is the current user's contact */\n        isMe: boolean;\n        /** Indicates if the number is saved in the current phone's contacts */\n        isMyContact: boolean;\n        /** Indicates if the contact is a user contact */\n        isUser: boolean;\n        /** Indicates if the number is registered on WhatsApp */\n        isWAContact: boolean;\n        /** Indicates if you have blocked this contact */\n        isBlocked: boolean;\n        /** @todo verify labels type. didn't have any documentation */\n        labels?: string[];\n        /** The contact's name, as saved by the current user */\n        name?: string;\n        /** The name that the contact has configured to be shown publically */\n        pushname: string;\n        /** @todo missing documentation */\n        sectionHeader: string;\n        /** A shortened version of name */\n        shortName?: string;\n        /** Indicates if the status from the contact is muted */\n        statusMute: boolean;\n        /** @todo missing documentation */\n        type: string;\n        /** @todo missing documentation */\n        verifiedLevel?: undefined;\n        /** @todo missing documentation */\n        verifiedName?: undefined;\n\n        /** Returns the contact's profile picture URL, if privacy settings allow it */\n        getProfilePicUrl: () => Promise<string>;\n\n        /** Returns the Chat that corresponds to this Contact.\n         * Will return null when getting chat for currently logged in user.\n         */\n        getChat: () => Promise<Chat>;\n\n        /** Returns the contact's countrycode, (1541859685@c.us) => (1) */\n        getCountryCode(): Promise<string>;\n\n        /** Returns the contact's formatted phone number, (12345678901@c.us) => (+1 (234) 5678-901) */\n        getFormattedNumber(): Promise<string>;\n\n        /** Blocks this contact from WhatsApp */\n        block: () => Promise<boolean>;\n\n        /** Unlocks this contact from WhatsApp */\n        unblock: () => Promise<boolean>;\n\n        /** Gets the Contact's current \"about\" info. Returns null if you don't have permission to read their status.  */\n        getAbout: () => Promise<string | null>;\n\n        /** Gets the Contact's common groups with you. Returns empty array if you don't have any common group. */\n        getCommonGroups: () => Promise<ChatId[]>;\n\n        /** Gets the Contact's current status broadcast. */\n        getBroadcast: () => Promise<Broadcast>;\n    }\n\n    export interface ContactId {\n        server: string;\n        user: string;\n        _serialized: string;\n    }\n\n    export interface BusinessCategory {\n        id: string;\n        localized_display_name: string;\n    }\n\n    export interface BusinessHoursOfDay {\n        mode: string;\n        hours: number[];\n    }\n\n    export interface BusinessHours {\n        config: {\n            sun: BusinessHoursOfDay;\n            mon: BusinessHoursOfDay;\n            tue: BusinessHoursOfDay;\n            wed: BusinessHoursOfDay;\n            thu: BusinessHoursOfDay;\n            fri: BusinessHoursOfDay;\n        };\n        timezone: string;\n    }\n\n    export interface BusinessContact extends Contact {\n        /**\n         * The contact's business profile\n         */\n        businessProfile: {\n            /** The contact's business profile id */\n            id: ContactId;\n\n            /** The contact's business profile tag */\n            tag: string;\n\n            /** The contact's business profile description */\n            description: string;\n\n            /** The contact's business profile categories */\n            categories: BusinessCategory[];\n\n            /** The contact's business profile options */\n            profileOptions: {\n                /** The contact's business profile commerce experience*/\n                commerceExperience: string;\n\n                /** The contact's business profile cart options */\n                cartEnabled: boolean;\n            };\n\n            /** The contact's business profile email */\n            email: string;\n\n            /** The contact's business profile websites */\n            website: string[];\n\n            /** The contact's business profile latitude */\n            latitude: number;\n\n            /** The contact's business profile longitude */\n            longitude: number;\n\n            /** The contact's business profile work hours*/\n            businessHours: BusinessHours;\n\n            /** The contact's business profile address */\n            address: string;\n\n            /** The contact's business profile facebook page */\n            fbPage: object;\n\n            /** Indicate if the contact's business profile linked */\n            ifProfileLinked: boolean;\n\n            /** The contact's business profile coverPhoto */\n            coverPhoto: null | any;\n        };\n    }\n\n    export interface PrivateContact extends Contact {}\n\n    /**\n     * Represents a Chat on WhatsApp\n     *\n     * @example\n     * {\n     *   id: {\n     *     server: 'c.us',\n     *     user: '554199999999',\n     *     _serialized: `554199999999@c.us`\n     *   },\n     *   name: '+55 41 9999-9999',\n     *   isGroup: false,\n     *   isReadOnly: false,\n     *   unreadCount: 6,\n     *   timestamp: 1591484087,\n     *   archived: false\n     * }\n     */\n    export interface Chat {\n        /** Indicates if the Chat is archived */\n        archived: boolean;\n        /** ID that represents the chat */\n        id: ChatId;\n        /** Indicates if the Chat is a Group Chat */\n        isGroup: boolean;\n        /** Indicates if the Chat is readonly */\n        isReadOnly: boolean;\n        /** Indicates if the Chat is muted */\n        isMuted: boolean;\n        /** Unix timestamp for when the mute expires */\n        muteExpiration: number;\n        /** Title of the chat */\n        name: string;\n        /** Unix timestamp for when the last activity occurred */\n        timestamp: number;\n        /** Amount of messages unread */\n        unreadCount: number;\n        /** Last message of chat */\n        lastMessage: Message;\n        /** Indicates if the Chat is pinned */\n        pinned: boolean;\n        /** Indicates if the Chat is locked */\n        isLocked: boolean;\n\n        /** Archives this chat */\n        archive: () => Promise<void>;\n        /** Pins this chat and returns its new Pin state */\n        pin: () => Promise<boolean>;\n        /** Unpins this chat and returns its new Pin state */\n        unpin: () => Promise<boolean>;\n        /** Clears all messages from the chat */\n        clearMessages: () => Promise<boolean>;\n        /** Stops typing or recording in chat immediately. */\n        clearState: () => Promise<boolean>;\n        /** Deletes the chat */\n        delete: () => Promise<boolean>;\n        /** Loads chat messages, sorted from earliest to latest. */\n        fetchMessages: (\n            searchOptions: MessageSearchOptions,\n        ) => Promise<Message[]>;\n        /** Mutes this chat forever, unless a date is specified */\n        mute: (\n            unmuteDate?: Date,\n        ) => Promise<{ isMuted: boolean; muteExpiration: number }>;\n        /** Send a message to this chat */\n        sendMessage: (\n            content: MessageContent,\n            options?: MessageSendOptions,\n        ) => Promise<Message>;\n        /** Sets the chat as seen */\n        sendSeen: () => Promise<boolean>;\n        /** Simulate recording audio in chat. This will last for 25 seconds */\n        sendStateRecording: () => Promise<void>;\n        /** Simulate typing in chat. This will last for 25 seconds. */\n        sendStateTyping: () => Promise<void>;\n        /** un-archives this chat */\n        unarchive: () => Promise<void>;\n        /** Unmutes this chat */\n        unmute: () => Promise<{ isMuted: boolean; muteExpiration: number }>;\n        /** Returns the Contact that corresponds to this Chat. */\n        getContact: () => Promise<Contact>;\n        /** Marks this Chat as unread */\n        markUnread: () => Promise<void>;\n        /** Returns array of all Labels assigned to this Chat */\n        getLabels: () => Promise<Label[]>;\n        /** Add or remove labels to this Chat */\n        changeLabels: (labelIds: Array<string | number>) => Promise<void>;\n        /** Gets instances of all pinned messages in a chat */\n        getPinnedMessages: () => Promise<[Message] | []>;\n        /** Sync history conversation of the Chat */\n        syncHistory: () => Promise<boolean>;\n        /** Add or edit a customer note */\n        addOrEditCustomerNote: (note: string) => Promise<void>;\n        /** Get a customer note */\n        getCustomerNote: () => Promise<{\n            chatId: string;\n            content: string;\n            createdAt: number;\n            id: string;\n            modifiedAt: number;\n            type: string;\n        }>;\n    }\n\n    export interface Channel {\n        /** ID that represents the channel */\n        id: {\n            server: string;\n            user: string;\n            _serialized: string;\n        };\n        /** Title of the channel */\n        name: string;\n        /** The channel description */\n        description: string;\n        /** Indicates if it is a Channel */\n        isChannel: boolean;\n        /** Indicates if it is a Group */\n        isGroup: boolean;\n        /** Indicates if the channel is readonly */\n        isReadOnly: boolean;\n        /** Amount of messages unread */\n        unreadCount: number;\n        /** Unix timestamp for when the last activity occurred */\n        timestamp: number;\n        /** Indicates if the channel is muted or not */\n        isMuted: boolean;\n        /** Unix timestamp for when the mute expires */\n        muteExpiration: number;\n        /** Last message in the channel */\n        lastMessage: Message | undefined;\n\n        /** Gets the subscribers of the channel (only those who are in your contact list) */\n        getSubscribers(\n            limit?: number,\n        ): Promise<{ contact: Contact; role: string }[]>;\n        /** Updates the channel subject */\n        setSubject(newSubject: string): Promise<boolean>;\n        /** Updates the channel description */\n        setDescription(newDescription: string): Promise<boolean>;\n        /** Updates the channel profile picture */\n        setProfilePicture(newProfilePicture: MessageMedia): Promise<boolean>;\n        /**\n         * Updates available reactions to use in the channel\n         *\n         * Valid values for passing to the method are:\n         * 0 for NONE reactions to be avaliable\n         * 1 for BASIC reactions to be available: 👍, ❤️, 😂, 😮, 😢, 🙏\n         * 2 for ALL reactions to be available\n         */\n        setReactionSetting(reactionCode: number): Promise<boolean>;\n        /** Mutes the channel */\n        mute(): Promise<boolean>;\n        /** Unmutes the channel */\n        unmute(): Promise<boolean>;\n        /** Sends a message to this channel */\n        sendMessage(\n            content: string | MessageMedia,\n            options?: MessageSendChannelOptions,\n        ): Promise<Message>;\n        /** Sets the channel as seen */\n        sendSeen(): Promise<boolean>;\n        /** Sends a channel admin invitation to a user, allowing them to become an admin of the channel */\n        sendChannelAdminInvite(\n            chatId: string,\n            options?: { comment?: string },\n        ): Promise<boolean>;\n        /** Accepts a channel admin invitation and promotes the current user to a channel admin */\n        acceptChannelAdminInvite(): Promise<boolean>;\n        /** Revokes a channel admin invitation sent to a user by a channel owner */\n        revokeChannelAdminInvite(userId: string): Promise<boolean>;\n        /** Demotes a channel admin to a regular subscriber (can be used also for self-demotion) */\n        demoteChannelAdmin(userId: string): Promise<boolean>;\n        /** Loads channel messages, sorted from earliest to latest */\n        fetchMessages: (\n            searchOptions: MessageSearchOptions,\n        ) => Promise<Message[]>;\n        /**\n         * Transfers a channel ownership to another user.\n         * Note: the user you are transferring the channel ownership to must be a channel admin.\n         */\n        transferChannelOwnership(\n            newOwnerId: string,\n            options?: TransferChannelOwnershipOptions,\n        ): Promise<boolean>;\n        /** Deletes the channel you created */\n        deleteChannel(): Promise<boolean>;\n    }\n\n    /** Options for transferring a channel ownership to another user */\n    export interface TransferChannelOwnershipOptions {\n        /**\n         * If true, after the channel ownership is being transferred to another user,\n         * the current user will be dismissed as a channel admin and will become to a channel subscriber.\n         */\n        shouldDismissSelfAsAdmin?: boolean;\n    }\n\n    /** Options for sending a message */\n    export interface MessageSendChannelOptions {\n        /** Image or videos caption */\n        caption?: string;\n        /** User IDs of user that will be mentioned in the message */\n        mentions?: string[];\n        /** Image or video to be sent */\n        media?: MessageMedia;\n        /** Extra options */\n        extra?: any;\n    }\n\n    export interface MessageSearchOptions {\n        /**\n         * The amount of messages to return. If no limit is specified, the available messages will be returned.\n         * Note that the actual number of returned messages may be smaller if there aren't enough messages in the conversation.\n         * Set this to Infinity to load all messages.\n         */\n        limit?: number;\n        /**\n         * Return only messages from the bot number or vise versa. To get all messages, leave the option undefined.\n         */\n        fromMe?: boolean;\n    }\n\n    /**\n     * Id that represents the chat\n     *\n     * @example\n     * id: {\n     *   server: 'c.us',\n     *   user: '554199999999',\n     *   _serialized: `554199999999@c.us`\n     * },\n     */\n    export interface ChatId {\n        /**\n         * Whatsapp server domain\n         * @example `c.us`\n         */\n        server: string;\n        /**\n         * User whatsapp number\n         * @example `554199999999`\n         */\n        user: string;\n        /**\n         * Serialized id\n         * @example `554199999999@c.us`\n         */\n        _serialized: string;\n    }\n\n    export interface PrivateChat extends Chat {}\n\n    export type GroupParticipant = {\n        id: ContactId;\n        isAdmin: boolean;\n        isSuperAdmin: boolean;\n    };\n\n    /** Promotes or demotes participants by IDs to regular users or admins */\n    export type ChangeParticipantsPermissions = (\n        participantIds: Array<string>,\n    ) => Promise<{ status: number }>;\n\n    /** An object that handles the result for addParticipants method */\n    export interface AddParticipantsResult {\n        [participantId: string]: {\n            code: number;\n            message: string;\n            isInviteV4Sent: boolean;\n        };\n    }\n\n    /** An object that handles options for adding participants */\n    export interface AddParticipantsOptions {\n        /**\n         * The number of milliseconds to wait before adding the next participant.\n         * If it is an array, a random sleep time between the sleep[0] and sleep[1] values will be added\n         * (the difference must be >=100 ms, otherwise, a random sleep time between sleep[1] and sleep[1] + 100\n         * will be added). If sleep is a number, a sleep time equal to its value will be added\n         * @default [250,500]\n         */\n        sleep?: Array<number> | number;\n        /**\n         * If true, the inviteV4 will be sent to those participants\n         * who have restricted others from being automatically added to groups,\n         * otherwise the inviteV4 won't be sent\n         * @default true\n         */\n        autoSendInviteV4?: boolean;\n        /**\n         * The comment to be added to an inviteV4 (empty string by default)\n         * @default ''\n         */\n        comment?: string;\n    }\n\n    /** An object that handles the information about the group membership request */\n    export interface GroupMembershipRequest {\n        /** The wid of a user who requests to enter the group */\n        id: Object;\n        /** The wid of a user who created that request */\n        addedBy: Object;\n        /** The wid of a community parent group to which the current group is linked */\n        parentGroupId: Object | null;\n        /** The method used to create the request: NonAdminAdd/InviteLink/LinkedGroupJoin */\n        requestMethod: string;\n        /** The timestamp the request was created at */\n        t: number;\n    }\n\n    /** An object that handles the result for membership request action */\n    export interface MembershipRequestActionResult {\n        /** User ID whos membership request was approved/rejected */\n        requesterId: Array<string> | string | null;\n        /** An error code that occurred during the operation for the participant */\n        error?: number;\n        /** A message with a result of membership request action */\n        message: string;\n    }\n\n    /** Options for performing a membership request action  */\n    export interface MembershipRequestActionOptions {\n        /** User ID/s who requested to join the group, if no value is provided, the method will search for all membership requests for that group */\n        requesterIds: Array<string> | string | null;\n        /** The number of milliseconds to wait before performing an operation for the next requester. If it is an array, a random sleep time between the sleep[0] and sleep[1] values will be added (the difference must be >=100 ms, otherwise, a random sleep time between sleep[1] and sleep[1] + 100 will be added). If sleep is a number, a sleep time equal to its value will be added. By default, sleep is an array with a value of [250, 500] */\n        sleep: Array<number> | number | null;\n    }\n\n    export interface GroupChat extends Chat {\n        /** Group owner */\n        owner: ContactId;\n        /** Date at which the group was created */\n        createdAt: Date;\n        /** Group description */\n        description: string;\n        /** Group participants */\n        participants: Array<GroupParticipant>;\n        /** Adds a list of participants by ID to the group */\n        addParticipants: (\n            participantIds: string | string[],\n            options?: AddParticipantsOptions,\n        ) => Promise<{ [key: string]: AddParticipantsResult } | string>;\n        /** Removes a list of participants by ID to the group */\n        removeParticipants: (\n            participantIds: string[],\n        ) => Promise<{ status: number }>;\n        /** Promotes participants by IDs to admins */\n        promoteParticipants: ChangeParticipantsPermissions;\n        /** Demotes participants by IDs to regular users */\n        demoteParticipants: ChangeParticipantsPermissions;\n        /** Updates the group subject */\n        setSubject: (subject: string) => Promise<boolean>;\n        /** Updates the group description */\n        setDescription: (description: string) => Promise<boolean>;\n        /**\n         * Updates the group setting to allow only admins to add members to the group.\n         * @param {boolean} [adminsOnly=true] Enable or disable this option\n         * @returns {Promise<boolean>} Returns true if the setting was properly updated. This can return false if the user does not have the necessary permissions.\n         */\n        setAddMembersAdminsOnly: (adminsOnly?: boolean) => Promise<boolean>;\n        /** Updates the group settings to only allow admins to send messages\n         * @param {boolean} [adminsOnly=true] Enable or disable this option\n         * @returns {Promise<boolean>} Returns true if the setting was properly updated. This can return false if the user does not have the necessary permissions.\n         */\n        setMessagesAdminsOnly: (adminsOnly?: boolean) => Promise<boolean>;\n        /**\n         * Updates the group settings to only allow admins to edit group info (title, description, photo).\n         * @param {boolean} [adminsOnly=true] Enable or disable this option\n         * @returns {Promise<boolean>} Returns true if the setting was properly updated. This can return false if the user does not have the necessary permissions.\n         */\n        setInfoAdminsOnly: (adminsOnly?: boolean) => Promise<boolean>;\n        /**\n         * Gets an array of membership requests\n         * @returns {Promise<Array<GroupMembershipRequest>>} An array of membership requests\n         */\n        getGroupMembershipRequests: () => Promise<\n            Array<GroupMembershipRequest>\n        >;\n        /**\n         * Approves membership requests if any\n         * @param {MembershipRequestActionOptions} options Options for performing a membership request action\n         * @returns {Promise<Array<MembershipRequestActionResult>>} Returns an array of requester IDs whose membership requests were approved and an error for each requester, if any occurred during the operation. If there are no requests, an empty array will be returned\n         */\n        approveGroupMembershipRequests: (\n            options: MembershipRequestActionOptions,\n        ) => Promise<Array<MembershipRequestActionResult>>;\n        /**\n         * Rejects membership requests if any\n         * @param {MembershipRequestActionOptions} options Options for performing a membership request action\n         * @returns {Promise<Array<MembershipRequestActionResult>>} Returns an array of requester IDs whose membership requests were rejected and an error for each requester, if any occurred during the operation. If there are no requests, an empty array will be returned\n         */\n        rejectGroupMembershipRequests: (\n            options: MembershipRequestActionOptions,\n        ) => Promise<Array<MembershipRequestActionResult>>;\n        /** Gets the invite code for a specific group */\n        getInviteCode: () => Promise<string>;\n        /** Invalidates the current group invite code and generates a new one */\n        revokeInvite: () => Promise<void>;\n        /** Makes the bot leave the group */\n        leave: () => Promise<void>;\n        /** Sets the group's picture.*/\n        setPicture: (media: MessageMedia) => Promise<boolean>;\n        /** Deletes the group's picture */\n        deletePicture: () => Promise<boolean>;\n    }\n\n    /**\n     * Represents the metadata associated with a given product\n     *\n     */\n    export interface ProductMetadata {\n        /** Product Id */\n        id: string;\n        /** Product Name */\n        name: string;\n        /** Product Description */\n        description: string;\n        /** Retailer ID */\n        retailer_id?: string;\n    }\n\n    /**\n     * Represents a Product on Whatsapp\n     * @example\n     * {\n     * \"id\": \"123456789\",\n     * \"price\": \"150000\",\n     * \"thumbnailId\": \"123456789\",\n     * \"thumbnailUrl\": \"https://mmg.whatsapp.net\",\n     * \"currency\": \"GTQ\",\n     * \"name\": \"Store Name\",\n     * \"quantity\": 1\n     * }\n     */\n    export interface Product {\n        /** Product Id */\n        id: string;\n        /** Price */\n        price?: string;\n        /** Product Thumbnail*/\n        thumbnailUrl: string;\n        /** Currency */\n        currency: string;\n        /** Product Name */\n        name: string;\n        /** Product Quantity*/\n        quantity: number;\n        /** Gets the Product metadata */\n        getData: () => Promise<ProductMetadata>;\n    }\n\n    /**\n     * Represents a Order on WhatsApp\n     *\n     * @example\n     * {\n     * \"products\": [\n     * {\n     * \"id\": \"123456789\",\n     * \"price\": \"150000\",\n     * \"thumbnailId\": \"123456789\",\n     * \"thumbnailUrl\": \"https://mmg.whatsapp.net\",\n     * \"currency\": \"GTQ\",\n     * \"name\": \"Store Name\",\n     * \"quantity\": 1\n     * }\n     * ],\n     * \"subtotal\": \"150000\",\n     * \"total\": \"150000\",\n     * \"currency\": \"GTQ\",\n     * \"createdAt\": 1610136796,\n     * \"sellerJid\": \"55555555@s.whatsapp.net\"\n     * }\n     */\n    export interface Order {\n        /** List of products*/\n        products: Array<Product>;\n        /** Order Subtotal */\n        subtotal: string;\n        /** Order Total */\n        total: string;\n        /** Order Currency */\n        currency: string;\n        /** Order Created At*/\n        createdAt: number;\n    }\n\n    /**\n     * Represents a Payment on WhatsApp\n     *\n     * @example\n     * {\n     * id: {\n     * fromMe: true,\n     * remote: {\n     * server: 'c.us',\n     * user: '5511999999999',\n     * _serialized: '5511999999999@c.us'\n     * },\n     *  id: 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA',\n     * _serialized: 'true_5511999999999@c.us_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'\n     * },\n     * paymentCurrency: 'BRL',\n     * paymentAmount1000: 1000,\n     * paymentMessageReceiverJid: {\n     * server: 'c.us',\n     * user: '5511999999999',\n     * _serialized: '5511999999999@c.us'\n     * },\n     * paymentTransactionTimestamp: 1623463058,\n     * paymentStatus: 4,\n     * paymentTxnStatus: 4,\n     * paymentNote: 'note'\n     * }\n     */\n    export interface Payment {\n        /** Payment Id*/\n        id: object;\n        /** Payment currency */\n        paymentCurrency: string;\n        /** Payment ammount  */\n        paymentAmount1000: number;\n        /** Payment receiver */\n        paymentMessageReceiverJid: object;\n        /** Payment transaction timestamp */\n        paymentTransactionTimestamp: number;\n        /** Payment paymentStatus */\n        paymentStatus: number;\n        /** Integer that represents the payment Text */\n        paymentTxnStatus: number;\n        /** The note sent with the payment */\n        paymentNote: string;\n    }\n\n    /**\n     * Represents a Call on WhatsApp\n     *\n     * @example\n     * Call {\n     * id: 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA',\n     * from: '5511999999@c.us',\n     * timestamp: 1625003709,\n     * isVideo: false,\n     * isGroup: false,\n     * fromMe: false,\n     * canHandleLocally: false,\n     * webClientShouldHandle: false,\n     * participants: []\n     * }\n     */\n    export interface Call {\n        /** Call Id */\n        id: string;\n        /** from */\n        from?: string;\n        /** Unix timestamp for when the call was created*/\n        timestamp: number;\n        /** Is video */\n        isVideo: boolean;\n        /** Is Group */\n        isGroup: boolean;\n        /** Indicates if the call was sent by the current user */\n        fromMe: boolean;\n        /** indicates if the call can be handled in waweb */\n        canHandleLocally: boolean;\n        /** indicates if the call should be handled in waweb */\n        webClientShouldHandle: boolean;\n        /** Object with participants */\n        participants: object;\n\n        /** Reject the call */\n        reject: () => Promise<void>;\n    }\n\n    /** Message type List */\n    export class List {\n        body: string;\n        buttonText: string;\n        sections: Array<any>;\n        title?: string | null;\n        footer?: string | null;\n\n        constructor(\n            body: string,\n            buttonText: string,\n            sections: Array<any>,\n            title?: string | null,\n            footer?: string | null,\n        );\n    }\n\n    /** Message type Buttons */\n    export class Buttons {\n        body: string | MessageMedia;\n        buttons: Array<{\n            buttonId: string;\n            buttonText: { displayText: string };\n            type: number;\n        }>;\n        title?: string | null;\n        footer?: string | null;\n\n        constructor(\n            body: string,\n            buttons: Array<{ id?: string; body: string }>,\n            title?: string | null,\n            footer?: string | null,\n        );\n    }\n\n    /** Message type Reaction */\n    export class Reaction {\n        id: MessageId;\n        orphan: number;\n        orphanReason?: string;\n        timestamp: number;\n        reaction: string;\n        read: boolean;\n        msgId: MessageId;\n        senderId: string;\n        ack?: number;\n    }\n\n    export type ReactionList = {\n        id: string;\n        aggregateEmoji: string;\n        hasReactionByMe: boolean;\n        senders: Array<Reaction>;\n    };\n}\n\nexport = WAWebJS;\n"
  },
  {
    "path": "index.js",
    "content": "'use strict';\n\nconst Constants = require('./src/util/Constants');\n\nmodule.exports = {\n    Client: require('./src/Client'),\n\n    version: require('./package.json').version,\n\n    // Structures\n    Chat: require('./src/structures/Chat'),\n    PrivateChat: require('./src/structures/PrivateChat'),\n    GroupChat: require('./src/structures/GroupChat'),\n    Channel: require('./src/structures/Channel'),\n    Message: require('./src/structures/Message'),\n    MessageMedia: require('./src/structures/MessageMedia'),\n    Contact: require('./src/structures/Contact'),\n    PrivateContact: require('./src/structures/PrivateContact'),\n    BusinessContact: require('./src/structures/BusinessContact'),\n    ClientInfo: require('./src/structures/ClientInfo'),\n    Location: require('./src/structures/Location'),\n    Poll: require('./src/structures/Poll'),\n    ScheduledEvent: require('./src/structures/ScheduledEvent'),\n    ProductMetadata: require('./src/structures/ProductMetadata'),\n    List: require('./src/structures/List'),\n    Buttons: require('./src/structures/Buttons'),\n    Broadcast: require('./src/structures/Broadcast'),\n\n    // Auth Strategies\n    NoAuth: require('./src/authStrategies/NoAuth'),\n    LocalAuth: require('./src/authStrategies/LocalAuth'),\n    RemoteAuth: require('./src/authStrategies/RemoteAuth'),\n\n    ...Constants,\n};\n"
  },
  {
    "path": "package.json",
    "content": "{\n    \"name\": \"whatsapp-web.js\",\n    \"version\": \"1.34.6\",\n    \"description\": \"A Node.js library for interacting with WhatsApp Web\",\n    \"main\": \"./index.js\",\n    \"typings\": \"./index.d.ts\",\n    \"scripts\": {\n        \"test\": \"mocha tests --recursive --timeout 5000\",\n        \"test-single\": \"mocha\",\n        \"shell\": \"node --experimental-repl-await ./shell.js\",\n        \"generate-docs\": \"npx jsdoc --configure .jsdoc.json --verbose\",\n        \"lint\": \"eslint .\",\n        \"lint:fix\": \"eslint . --fix\",\n        \"format\": \"prettier --write .\",\n        \"format:check\": \"prettier --check .\",\n        \"check\": \"npm run lint && npm run format:check\",\n        \"prepare\": \"is-ci || husky\"\n    },\n    \"repository\": {\n        \"type\": \"git\",\n        \"url\": \"git+https://github.com/pedroslopez/whatsapp-web.js.git\"\n    },\n    \"keywords\": [\n        \"whatsapp\",\n        \"whatsapp-web\",\n        \"api\",\n        \"bot\",\n        \"client\",\n        \"node\"\n    ],\n    \"author\": \"Pedro Lopez\",\n    \"license\": \"Apache-2.0\",\n    \"bugs\": {\n        \"url\": \"https://github.com/pedroslopez/whatsapp-web.js/issues\"\n    },\n    \"homepage\": \"https://wwebjs.dev/\",\n    \"dependencies\": {\n        \"fluent-ffmpeg\": \"2.1.3\",\n        \"mime\": \"^3.0.0\",\n        \"node-fetch\": \"^2.6.9\",\n        \"node-webpmux\": \"3.1.7\",\n        \"puppeteer\": \"^24.31.0\"\n    },\n    \"devDependencies\": {\n        \"is-ci\": \"^4.1.0\",\n        \"@commitlint/cli\": \"^20.4.1\",\n        \"@commitlint/config-conventional\": \"^20.4.1\",\n        \"@types/node-fetch\": \"^2.5.12\",\n        \"chai\": \"^4.3.4\",\n        \"chai-as-promised\": \"^7.1.1\",\n        \"dotenv\": \"^16.0.0\",\n        \"eslint\": \"^8.4.1\",\n        \"eslint-config-prettier\": \"^10.1.8\",\n        \"eslint-plugin-mocha\": \"^10.0.3\",\n        \"eslint-plugin-prettier\": \"^5.5.5\",\n        \"husky\": \"^9.1.7\",\n        \"jsdoc\": \"^3.6.4\",\n        \"jsdoc-baseline\": \"^0.1.5\",\n        \"lint-staged\": \"^16.2.7\",\n        \"mocha\": \"^9.0.2\",\n        \"prettier\": \"^3.8.1\",\n        \"sinon\": \"^13.0.1\"\n    },\n    \"engines\": {\n        \"node\": \">=18.0.0\"\n    },\n    \"optionalDependencies\": {\n        \"archiver\": \"^5.3.1\",\n        \"fs-extra\": \"^10.1.0\",\n        \"unzipper\": \"^0.10.11\"\n    }\n}\n"
  },
  {
    "path": "shell.js",
    "content": "/**\n * ==== wwebjs-shell ====\n * Used for quickly testing library features\n *\n * Running `npm run shell` will start WhatsApp Web with headless=false\n * and then drop you into Node REPL with `client` in its context.\n */\n\nconst repl = require('repl');\n\nconst { Client, LocalAuth } = require('./index');\n\nconst client = new Client({\n    puppeteer: { headless: false },\n    authStrategy: new LocalAuth(),\n});\n\nconsole.log('Initializing...');\n\nclient.initialize();\n\nclient.on('qr', () => {\n    console.log('Please scan the QR code on the browser.');\n});\n\nclient.on('authenticated', (session) => {\n    console.log(JSON.stringify(session));\n});\n\nclient.on('ready', () => {\n    const shell = repl.start('wwebjs> ');\n    shell.context.client = client;\n    shell.on('exit', async () => {\n        await client.destroy();\n    });\n});\n"
  },
  {
    "path": "src/Client.js",
    "content": "'use strict';\n\nconst EventEmitter = require('events');\nconst puppeteer = require('puppeteer');\n\nconst Util = require('./util/Util');\nconst InterfaceController = require('./util/InterfaceController');\nconst {\n    WhatsWebURL,\n    DefaultOptions,\n    Events,\n    WAState,\n    MessageTypes,\n} = require('./util/Constants');\nconst { ExposeAuthStore } = require('./util/Injected/AuthStore/AuthStore');\nconst { LoadUtils } = require('./util/Injected/Utils');\nconst ChatFactory = require('./factories/ChatFactory');\nconst ContactFactory = require('./factories/ContactFactory');\nconst WebCacheFactory = require('./webCache/WebCacheFactory');\nconst {\n    ClientInfo,\n    Message,\n    MessageMedia,\n    Contact,\n    Location,\n    Poll,\n    PollVote,\n    GroupNotification,\n    Label,\n    Call,\n    Buttons,\n    List,\n    Reaction,\n    Broadcast,\n    ScheduledEvent,\n} = require('./structures');\nconst NoAuth = require('./authStrategies/NoAuth');\nconst { exposeFunctionIfAbsent } = require('./util/Puppeteer');\n\n/**\n * Starting point for interacting with the WhatsApp Web API\n * @extends {EventEmitter}\n * @param {object} options - Client options\n * @param {AuthStrategy} options.authStrategy - Determines how to save and restore sessions. If not set, NoAuth will be used.\n * @param {string} options.webVersion - The version of WhatsApp Web to use. Use options.webVersionCache to configure how the version is retrieved.\n * @param {object} options.webVersionCache - Determines how to retrieve the WhatsApp Web version. Defaults to a local cache (LocalWebCache) that falls back to latest if the requested version is not found.\n * @param {number} options.authTimeoutMs - Timeout for authentication selector in puppeteer\n * @param {function} options.evalOnNewDoc - function to eval on new doc\n * @param {object} options.puppeteer - Puppeteer launch options. View docs here: https://github.com/puppeteer/puppeteer/\n * @param {number} options.qrMaxRetries - How many times should the qrcode be refreshed before giving up\n * @param {number} options.takeoverOnConflict - If another whatsapp web session is detected (another browser), take over the session in the current browser\n * @param {number} options.takeoverTimeoutMs - How much time to wait before taking over the session\n * @param {string} options.userAgent - User agent to use in puppeteer\n * @param {string} options.ffmpegPath - Ffmpeg path to use when formatting videos to webp while sending stickers\n * @param {boolean} options.bypassCSP - Sets bypassing of page's Content-Security-Policy.\n * @param {string} options.deviceName - Sets the device name of a current linked device., i.e.: 'TEST'.\n * @param {string} options.browserName - Sets the browser name of a current linked device, i.e.: 'Firefox'.\n * @param {object} options.proxyAuthentication - Proxy Authentication object.\n *\n * @fires Client#qr\n * @fires Client#authenticated\n * @fires Client#auth_failure\n * @fires Client#ready\n * @fires Client#message\n * @fires Client#message_ack\n * @fires Client#message_create\n * @fires Client#message_revoke_me\n * @fires Client#message_revoke_everyone\n * @fires Client#message_ciphertext\n * @fires Client#message_edit\n * @fires Client#media_uploaded\n * @fires Client#group_join\n * @fires Client#group_leave\n * @fires Client#group_update\n * @fires Client#disconnected\n * @fires Client#change_state\n * @fires Client#contact_changed\n * @fires Client#group_admin_changed\n * @fires Client#group_membership_request\n * @fires Client#vote_update\n */\nclass Client extends EventEmitter {\n    constructor(options = {}) {\n        super();\n\n        this.options = Util.mergeDefault(DefaultOptions, options);\n\n        if (!this.options.authStrategy) {\n            this.authStrategy = new NoAuth();\n        } else {\n            this.authStrategy = this.options.authStrategy;\n        }\n\n        this.authStrategy.setup(this);\n\n        /**\n         * @type {puppeteer.Browser}\n         */\n        this.pupBrowser = null;\n        /**\n         * @type {puppeteer.Page}\n         */\n        this.pupPage = null;\n\n        this.currentIndexHtml = null;\n        this.lastLoggedOut = false;\n\n        Util.setFfmpegPath(this.options.ffmpegPath);\n    }\n    /**\n     * Injection logic\n     * Private function\n     */\n    async inject() {\n        if (\n            this.options.authTimeoutMs === undefined ||\n            this.options.authTimeoutMs == 0\n        ) {\n            this.options.authTimeoutMs = 30000;\n        }\n        let start = Date.now();\n        let timeout = this.options.authTimeoutMs;\n        let res = false;\n        while (start > Date.now() - timeout) {\n            res = await this.pupPage.evaluate(\n                'window.Debug?.VERSION != undefined',\n            );\n            if (res) {\n                break;\n            }\n            await new Promise((r) => setTimeout(r, 200));\n        }\n        if (!res) {\n            throw 'auth timeout';\n        }\n        await this.setDeviceName(\n            this.options.deviceName,\n            this.options.browserName,\n        );\n        const pairWithPhoneNumber = this.options.pairWithPhoneNumber;\n        const version = await this.getWWebVersion();\n\n        await this.pupPage.evaluate(ExposeAuthStore);\n\n        const needAuthentication = await this.pupPage.evaluate(async () => {\n            let state = window.require('WAWebSocketModel').Socket.state;\n\n            if (\n                state === 'OPENING' ||\n                state === 'UNLAUNCHED' ||\n                state === 'PAIRING'\n            ) {\n                // wait till state changes\n                await new Promise((r) => {\n                    window\n                        .require('WAWebSocketModel')\n                        .Socket.on(\n                            'change:state',\n                            function waitTillInit(_AppState, state) {\n                                if (\n                                    state !== 'OPENING' &&\n                                    state !== 'UNLAUNCHED' &&\n                                    state !== 'PAIRING'\n                                ) {\n                                    window\n                                        .require('WAWebSocketModel')\n                                        .Socket.off(\n                                            'change:state',\n                                            waitTillInit,\n                                        );\n                                    r();\n                                }\n                            },\n                        );\n                });\n            }\n            state = window.require('WAWebSocketModel').Socket.state;\n            return state == 'UNPAIRED' || state == 'UNPAIRED_IDLE';\n        });\n\n        if (needAuthentication) {\n            const { failed, failureEventPayload, restart } =\n                await this.authStrategy.onAuthenticationNeeded();\n\n            if (failed) {\n                /**\n                 * Emitted when there has been an error while trying to restore an existing session\n                 * @event Client#auth_failure\n                 * @param {string} message\n                 */\n                this.emit(Events.AUTHENTICATION_FAILURE, failureEventPayload);\n                await this.destroy();\n                if (restart) {\n                    // session restore failed so try again but without session to force new authentication\n                    return this.initialize();\n                }\n                return;\n            }\n\n            // Register qr/code events\n            if (pairWithPhoneNumber.phoneNumber) {\n                await exposeFunctionIfAbsent(\n                    this.pupPage,\n                    'onCodeReceivedEvent',\n                    async (code) => {\n                        /**\n                         * Emitted when a pairing code is received\n                         * @event Client#code\n                         * @param {string} code Code\n                         * @returns {string} Code that was just received\n                         */\n                        this.emit(Events.CODE_RECEIVED, code);\n                        return code;\n                    },\n                );\n                this.requestPairingCode(\n                    pairWithPhoneNumber.phoneNumber,\n                    pairWithPhoneNumber.showNotification,\n                    pairWithPhoneNumber.intervalMs,\n                );\n            } else {\n                let qrRetries = 0;\n                await exposeFunctionIfAbsent(\n                    this.pupPage,\n                    'onQRChangedEvent',\n                    async (qr) => {\n                        /**\n                         * Emitted when a QR code is received\n                         * @event Client#qr\n                         * @param {string} qr QR Code\n                         */\n                        this.emit(Events.QR_RECEIVED, qr);\n                        if (this.options.qrMaxRetries > 0) {\n                            qrRetries++;\n                            if (qrRetries > this.options.qrMaxRetries) {\n                                this.emit(\n                                    Events.DISCONNECTED,\n                                    'Max qrcode retries reached',\n                                );\n                                await this.destroy();\n                            }\n                        }\n                    },\n                );\n\n                await this.pupPage.evaluate(async () => {\n                    const registrationInfo =\n                        await window.AuthStore.RegistrationUtils.waSignalStore.getRegistrationInfo();\n                    const noiseKeyPair =\n                        await window.AuthStore.RegistrationUtils.waNoiseInfo.get();\n                    const staticKeyB64 = window.AuthStore.Base64Tools.encodeB64(\n                        noiseKeyPair.staticKeyPair.pubKey,\n                    );\n                    const identityKeyB64 =\n                        window.AuthStore.Base64Tools.encodeB64(\n                            registrationInfo.identityKeyPair.pubKey,\n                        );\n                    const advSecretKey =\n                        await window.AuthStore.RegistrationUtils.getADVSecretKey();\n                    const platform =\n                        window.AuthStore.RegistrationUtils.DEVICE_PLATFORM;\n                    const getQR = (ref) =>\n                        ref +\n                        ',' +\n                        staticKeyB64 +\n                        ',' +\n                        identityKeyB64 +\n                        ',' +\n                        advSecretKey +\n                        ',' +\n                        platform;\n\n                    window.onQRChangedEvent(getQR(window.AuthStore.Conn.ref)); // initial qr\n                    window.AuthStore.Conn.on('change:ref', (_, ref) => {\n                        window.onQRChangedEvent(getQR(ref));\n                    }); // future QR changes\n                });\n            }\n        }\n\n        await exposeFunctionIfAbsent(\n            this.pupPage,\n            'onAuthAppStateChangedEvent',\n            async (state) => {\n                if (\n                    state == 'UNPAIRED_IDLE' &&\n                    !pairWithPhoneNumber.phoneNumber\n                ) {\n                    // refresh qr code\n                    window.require('WAWebCmd').Cmd.refreshQR();\n                }\n            },\n        );\n\n        await exposeFunctionIfAbsent(\n            this.pupPage,\n            'onAppStateHasSyncedEvent',\n            async () => {\n                const authEventPayload =\n                    await this.authStrategy.getAuthEventPayload();\n                /**\n                 * Emitted when authentication is successful\n                 * @event Client#authenticated\n                 */\n                this.emit(Events.AUTHENTICATED, authEventPayload);\n\n                const injected = await this.pupPage.evaluate(async () => {\n                    return typeof window.WWebJS !== 'undefined';\n                });\n\n                if (!injected) {\n                    if (\n                        this.options.webVersionCache.type === 'local' &&\n                        this.currentIndexHtml\n                    ) {\n                        const { type: webCacheType, ...webCacheOptions } =\n                            this.options.webVersionCache;\n                        const webCache = WebCacheFactory.createWebCache(\n                            webCacheType,\n                            webCacheOptions,\n                        );\n\n                        await webCache.persist(this.currentIndexHtml, version);\n                    }\n\n                    //Load util functions (serializers, helper functions)\n                    await this.pupPage.evaluate(LoadUtils);\n\n                    let start = Date.now();\n                    let res = false;\n                    while (start > Date.now() - 30000) {\n                        // Check window.WWebJS Injection\n                        res = await this.pupPage.evaluate(\n                            'window.WWebJS != undefined',\n                        );\n                        if (res) {\n                            break;\n                        }\n                        await new Promise((r) => setTimeout(r, 200));\n                    }\n                    if (!res) {\n                        throw 'ready timeout';\n                    }\n\n                    /**\n                     * Current connection information\n                     * @type {ClientInfo}\n                     */\n                    this.info = new ClientInfo(\n                        this,\n                        await this.pupPage.evaluate(() => {\n                            return {\n                                ...window\n                                    .require('WAWebConnModel')\n                                    .Conn.serialize(),\n                                wid:\n                                    window\n                                        .require('WAWebUserPrefsMeUser')\n                                        .getMaybeMePnUser() ||\n                                    window\n                                        .require('WAWebUserPrefsMeUser')\n                                        .getMaybeMeLidUser(),\n                            };\n                        }),\n                    );\n\n                    this.interface = new InterfaceController(this);\n\n                    await this.attachEventListeners();\n                }\n                /**\n                 * Emitted when the client has initialized and is ready to receive messages.\n                 * @event Client#ready\n                 */\n                this.emit(Events.READY);\n                this.authStrategy.afterAuthReady();\n            },\n        );\n        let lastPercent = null;\n        await exposeFunctionIfAbsent(\n            this.pupPage,\n            'onOfflineProgressUpdateEvent',\n            async (percent) => {\n                if (lastPercent !== percent) {\n                    lastPercent = percent;\n                    this.emit(Events.LOADING_SCREEN, percent, 'WhatsApp'); // Message is hardcoded as \"WhatsApp\" for now\n                }\n            },\n        );\n        await exposeFunctionIfAbsent(\n            this.pupPage,\n            'onLogoutEvent',\n            async () => {\n                this.lastLoggedOut = true;\n                await this.pupPage\n                    .waitForNavigation({ waitUntil: 'load', timeout: 5000 })\n                    .catch((_) => _);\n            },\n        );\n        await this.pupPage.evaluate(() => {\n            window\n                .require('WAWebSocketModel')\n                .Socket.on('change:state', (_AppState, state) => {\n                    window.onAuthAppStateChangedEvent(state);\n                });\n            window\n                .require('WAWebSocketModel')\n                .Socket.on('change:hasSynced', () => {\n                    window.onAppStateHasSyncedEvent();\n                });\n            const Cmd = window.require('WAWebCmd').Cmd;\n            Cmd.on('offline_progress_update_from_bridge', () => {\n                window.onOfflineProgressUpdateEvent(\n                    window.AuthStore.OfflineMessageHandler.getOfflineDeliveryProgress(),\n                );\n            });\n            Cmd.on('logout', async () => {\n                await window.onLogoutEvent();\n            });\n            Cmd.on('logout_from_bridge', async () => {\n                await window.onLogoutEvent();\n            });\n        });\n    }\n\n    /**\n     * Sets up events and requirements, kicks off authentication request\n     */\n    async initialize() {\n        let /**\n             * @type {puppeteer.Browser}\n             */\n            browser,\n            /**\n             * @type {puppeteer.Page}\n             */\n            page;\n\n        browser = null;\n        page = null;\n\n        await this.authStrategy.beforeBrowserInitialized();\n\n        const puppeteerOpts = this.options.puppeteer;\n        if (\n            puppeteerOpts &&\n            (puppeteerOpts.browserWSEndpoint || puppeteerOpts.browserURL)\n        ) {\n            browser = await puppeteer.connect(puppeteerOpts);\n            page = await browser.newPage();\n        } else {\n            const browserArgs = [...(puppeteerOpts.args || [])];\n            if (\n                this.options.userAgent !== false &&\n                !browserArgs.find((arg) => arg.includes('--user-agent'))\n            ) {\n                browserArgs.push(`--user-agent=${this.options.userAgent}`);\n            }\n            // navigator.webdriver fix\n            browserArgs.push('--disable-blink-features=AutomationControlled');\n\n            browser = await puppeteer.launch({\n                ...puppeteerOpts,\n                args: browserArgs,\n            });\n            page = (await browser.pages())[0];\n        }\n\n        if (this.options.proxyAuthentication !== undefined) {\n            await page.authenticate(this.options.proxyAuthentication);\n        }\n        if (this.options.userAgent !== false) {\n            await page.setUserAgent(this.options.userAgent);\n        }\n        if (this.options.bypassCSP) await page.setBypassCSP(true);\n\n        this.pupBrowser = browser;\n        this.pupPage = page;\n\n        await this.authStrategy.afterBrowserInitialized();\n        await this.initWebVersionCache();\n\n        if (this.options.evalOnNewDoc !== undefined) {\n            await page.evaluateOnNewDocument(this.options.evalOnNewDoc);\n        }\n\n        await page.goto(WhatsWebURL, {\n            waitUntil: 'load',\n            timeout: 0,\n            referer: 'https://whatsapp.com/',\n        });\n\n        await this.inject();\n\n        this.pupPage.on('framenavigated', async (frame) => {\n            if (frame.url().includes('post_logout=1') || this.lastLoggedOut) {\n                this.emit(Events.DISCONNECTED, 'LOGOUT');\n                await this.authStrategy.logout();\n                await this.authStrategy.beforeBrowserInitialized();\n                await this.authStrategy.afterBrowserInitialized();\n                this.lastLoggedOut = false;\n            }\n            await this.inject();\n        });\n    }\n\n    /**\n     * Request authentication via pairing code instead of QR code\n     * @param {string} phoneNumber - Phone number in international, symbol-free format (e.g. 12025550108 for US, 551155501234 for Brazil)\n     * @param {boolean} [showNotification = true] - Show notification to pair on phone number\n     * @param {number} [intervalMs = 180000] - The interval in milliseconds on how frequent to generate pairing code (WhatsApp default to 3 minutes)\n     * @returns {Promise<string>} - Returns a pairing code in format \"ABCDEFGH\"\n     */\n    async requestPairingCode(\n        phoneNumber,\n        showNotification = true,\n        intervalMs = 180000,\n    ) {\n        return await this.pupPage.evaluate(\n            async (phoneNumber, showNotification, intervalMs) => {\n                const getCode = async () => {\n                    while (!window.AuthStore.PairingCodeLinkUtils) {\n                        await new Promise((resolve) =>\n                            setTimeout(resolve, 250),\n                        );\n                    }\n                    window.AuthStore.PairingCodeLinkUtils.setPairingType(\n                        'ALT_DEVICE_LINKING',\n                    );\n                    await window.AuthStore.PairingCodeLinkUtils.initializeAltDeviceLinking();\n                    return window.AuthStore.PairingCodeLinkUtils.startAltLinkingFlow(\n                        phoneNumber,\n                        showNotification,\n                    );\n                };\n                if (window.codeInterval) {\n                    clearInterval(window.codeInterval); // remove existing interval\n                }\n                window.codeInterval = setInterval(async () => {\n                    const state =\n                        window.require('WAWebSocketModel').Socket.state;\n                    if (state != 'UNPAIRED' && state != 'UNPAIRED_IDLE') {\n                        clearInterval(window.codeInterval);\n                        return;\n                    }\n                    window.onCodeReceivedEvent(await getCode());\n                }, intervalMs);\n                return window.onCodeReceivedEvent(await getCode());\n            },\n            phoneNumber,\n            showNotification,\n            intervalMs,\n        );\n    }\n\n    /**\n     * Attach event listeners to WA Web\n     * Private function\n     * @property {boolean} reinject is this a reinject?\n     */\n    async attachEventListeners() {\n        await exposeFunctionIfAbsent(\n            this.pupPage,\n            'onAddMessageEvent',\n            (msg) => {\n                if (msg.type === 'gp2') {\n                    const notification = new GroupNotification(this, msg);\n                    if (\n                        ['add', 'invite', 'linked_group_join'].includes(\n                            msg.subtype,\n                        )\n                    ) {\n                        /**\n                         * Emitted when a user joins the chat via invite link or is added by an admin.\n                         * @event Client#group_join\n                         * @param {GroupNotification} notification GroupNotification with more information about the action\n                         */\n                        this.emit(Events.GROUP_JOIN, notification);\n                    } else if (\n                        msg.subtype === 'remove' ||\n                        msg.subtype === 'leave'\n                    ) {\n                        /**\n                         * Emitted when a user leaves the chat or is removed by an admin.\n                         * @event Client#group_leave\n                         * @param {GroupNotification} notification GroupNotification with more information about the action\n                         */\n                        this.emit(Events.GROUP_LEAVE, notification);\n                    } else if (\n                        msg.subtype === 'promote' ||\n                        msg.subtype === 'demote'\n                    ) {\n                        /**\n                         * Emitted when a current user is promoted to an admin or demoted to a regular user.\n                         * @event Client#group_admin_changed\n                         * @param {GroupNotification} notification GroupNotification with more information about the action\n                         */\n                        this.emit(Events.GROUP_ADMIN_CHANGED, notification);\n                    } else if (msg.subtype === 'membership_approval_request') {\n                        /**\n                         * Emitted when some user requested to join the group\n                         * that has the membership approval mode turned on\n                         * @event Client#group_membership_request\n                         * @param {GroupNotification} notification GroupNotification with more information about the action\n                         * @param {string} notification.chatId The group ID the request was made for\n                         * @param {string} notification.author The user ID that made a request\n                         * @param {number} notification.timestamp The timestamp the request was made at\n                         */\n                        this.emit(\n                            Events.GROUP_MEMBERSHIP_REQUEST,\n                            notification,\n                        );\n                    } else {\n                        /**\n                         * Emitted when group settings are updated, such as subject, description or picture.\n                         * @event Client#group_update\n                         * @param {GroupNotification} notification GroupNotification with more information about the action\n                         */\n                        this.emit(Events.GROUP_UPDATE, notification);\n                    }\n                    return;\n                }\n\n                const message = new Message(this, msg);\n\n                /**\n                 * Emitted when a new message is created, which may include the current user's own messages.\n                 * @event Client#message_create\n                 * @param {Message} message The message that was created\n                 */\n                this.emit(Events.MESSAGE_CREATE, message);\n\n                if (msg.id.fromMe) return;\n\n                /**\n                 * Emitted when a new message is received.\n                 * @event Client#message\n                 * @param {Message} message The message that was received\n                 */\n                this.emit(Events.MESSAGE_RECEIVED, message);\n            },\n        );\n\n        let last_message;\n\n        await exposeFunctionIfAbsent(\n            this.pupPage,\n            'onChangeMessageTypeEvent',\n            (msg) => {\n                if (msg.type === 'revoked') {\n                    const message = new Message(this, msg);\n                    let revoked_msg;\n                    if (last_message && msg.id.id === last_message.id.id) {\n                        revoked_msg = new Message(this, last_message);\n\n                        if (message.protocolMessageKey)\n                            revoked_msg.id = { ...message.protocolMessageKey };\n                    }\n\n                    /**\n                     * Emitted when a message is deleted for everyone in the chat.\n                     * @event Client#message_revoke_everyone\n                     * @param {Message} message The message that was revoked, in its current state. It will not contain the original message's data.\n                     * @param {?Message} revoked_msg The message that was revoked, before it was revoked. It will contain the message's original data.\n                     * Note that due to the way this data is captured, it may be possible that this param will be undefined.\n                     */\n                    this.emit(\n                        Events.MESSAGE_REVOKED_EVERYONE,\n                        message,\n                        revoked_msg,\n                    );\n                }\n            },\n        );\n\n        await exposeFunctionIfAbsent(\n            this.pupPage,\n            'onChangeMessageEvent',\n            (msg) => {\n                if (msg.type !== 'revoked') {\n                    last_message = msg;\n                }\n\n                /**\n                 * The event notification that is received when one of\n                 * the group participants changes their phone number.\n                 */\n                const isParticipant =\n                    msg.type === 'gp2' && msg.subtype === 'modify';\n\n                /**\n                 * The event notification that is received when one of\n                 * the contacts changes their phone number.\n                 */\n                const isContact =\n                    msg.type === 'notification_template' &&\n                    msg.subtype === 'change_number';\n\n                if (isParticipant || isContact) {\n                    /** @type {GroupNotification} object does not provide enough information about this event, so a @type {Message} object is used. */\n                    const message = new Message(this, msg);\n\n                    const newId = isParticipant ? msg.recipients[0] : msg.to;\n                    const oldId = isParticipant\n                        ? msg.author\n                        : msg.templateParams.find((id) => id !== newId);\n\n                    /**\n                     * Emitted when a contact or a group participant changes their phone number.\n                     * @event Client#contact_changed\n                     * @param {Message} message Message with more information about the event.\n                     * @param {String} oldId The user's id (an old one) who changed their phone number\n                     * and who triggered the notification.\n                     * @param {String} newId The user's new id after the change.\n                     * @param {Boolean} isContact Indicates if a contact or a group participant changed their phone number.\n                     */\n                    this.emit(\n                        Events.CONTACT_CHANGED,\n                        message,\n                        oldId,\n                        newId,\n                        isContact,\n                    );\n                }\n            },\n        );\n\n        await exposeFunctionIfAbsent(\n            this.pupPage,\n            'onRemoveMessageEvent',\n            (msg) => {\n                if (!msg.isNewMsg) return;\n\n                const message = new Message(this, msg);\n\n                /**\n                 * Emitted when a message is deleted by the current user.\n                 * @event Client#message_revoke_me\n                 * @param {Message} message The message that was revoked\n                 */\n                this.emit(Events.MESSAGE_REVOKED_ME, message);\n            },\n        );\n\n        await exposeFunctionIfAbsent(\n            this.pupPage,\n            'onMessageAckEvent',\n            (msg, ack) => {\n                const message = new Message(this, msg);\n\n                /**\n                 * Emitted when an ack event occurrs on message type.\n                 * @event Client#message_ack\n                 * @param {Message} message The message that was affected\n                 * @param {MessageAck} ack The new ACK value\n                 */\n                this.emit(Events.MESSAGE_ACK, message, ack);\n            },\n        );\n\n        await exposeFunctionIfAbsent(\n            this.pupPage,\n            'onChatUnreadCountEvent',\n            async (data) => {\n                const chat = await this.getChatById(data.id);\n\n                /**\n                 * Emitted when the chat unread count changes\n                 */\n                this.emit(Events.UNREAD_COUNT, chat);\n            },\n        );\n\n        await exposeFunctionIfAbsent(\n            this.pupPage,\n            'onMessageMediaUploadedEvent',\n            (msg) => {\n                const message = new Message(this, msg);\n\n                /**\n                 * Emitted when media has been uploaded for a message sent by the client.\n                 * @event Client#media_uploaded\n                 * @param {Message} message The message with media that was uploaded\n                 */\n                this.emit(Events.MEDIA_UPLOADED, message);\n            },\n        );\n\n        await exposeFunctionIfAbsent(\n            this.pupPage,\n            'onAppStateChangedEvent',\n            async (state) => {\n                /**\n                 * Emitted when the connection state changes\n                 * @event Client#change_state\n                 * @param {WAState} state the new connection state\n                 */\n                this.emit(Events.STATE_CHANGED, state);\n\n                const ACCEPTED_STATES = [\n                    WAState.CONNECTED,\n                    WAState.OPENING,\n                    WAState.PAIRING,\n                    WAState.TIMEOUT,\n                ];\n\n                if (this.options.takeoverOnConflict) {\n                    ACCEPTED_STATES.push(WAState.CONFLICT);\n\n                    if (state === WAState.CONFLICT) {\n                        setTimeout(() => {\n                            this.pupPage.evaluate(() =>\n                                window\n                                    .require('WAWebSocketModel')\n                                    .Socket.takeover(),\n                            );\n                        }, this.options.takeoverTimeoutMs);\n                    }\n                }\n\n                if (!ACCEPTED_STATES.includes(state)) {\n                    /**\n                     * Emitted when the client has been disconnected\n                     * @event Client#disconnected\n                     * @param {WAState|\"LOGOUT\"} reason reason that caused the disconnect\n                     */\n                    await this.authStrategy.disconnect();\n                    this.emit(Events.DISCONNECTED, state);\n                    this.destroy();\n                }\n            },\n        );\n\n        await exposeFunctionIfAbsent(\n            this.pupPage,\n            'onBatteryStateChangedEvent',\n            (state) => {\n                const { battery, plugged } = state;\n\n                if (battery === undefined) return;\n\n                /**\n                 * Emitted when the battery percentage for the attached device changes. Will not be sent if using multi-device.\n                 * @event Client#change_battery\n                 * @param {object} batteryInfo\n                 * @param {number} batteryInfo.battery - The current battery percentage\n                 * @param {boolean} batteryInfo.plugged - Indicates if the phone is plugged in (true) or not (false)\n                 * @deprecated\n                 */\n                this.emit(Events.BATTERY_CHANGED, { battery, plugged });\n            },\n        );\n\n        await exposeFunctionIfAbsent(this.pupPage, 'onIncomingCall', (call) => {\n            /**\n             * Emitted when a call is received\n             * @event Client#incoming_call\n             * @param {object} call\n             * @param {number} call.id - Call id\n             * @param {string} call.peerJid - Who called\n             * @param {boolean} call.isVideo - if is video\n             * @param {boolean} call.isGroup - if is group\n             * @param {boolean} call.canHandleLocally - if we can handle in waweb\n             * @param {boolean} call.outgoing - if is outgoing\n             * @param {boolean} call.webClientShouldHandle - If Waweb should handle\n             * @param {object} call.participants - Participants\n             */\n            const cll = new Call(this, call);\n            this.emit(Events.INCOMING_CALL, cll);\n        });\n\n        await exposeFunctionIfAbsent(\n            this.pupPage,\n            'onReaction',\n            (reactions) => {\n                for (const reaction of reactions) {\n                    /**\n                     * Emitted when a reaction is sent, received, updated or removed\n                     * @event Client#message_reaction\n                     * @param {object} reaction\n                     * @param {object} reaction.id - Reaction id\n                     * @param {number} reaction.orphan - Orphan\n                     * @param {?string} reaction.orphanReason - Orphan reason\n                     * @param {number} reaction.timestamp - Timestamp\n                     * @param {string} reaction.reaction - Reaction\n                     * @param {boolean} reaction.read - Read\n                     * @param {object} reaction.msgId - Parent message id\n                     * @param {string} reaction.senderId - Sender id\n                     * @param {?number} reaction.ack - Ack\n                     */\n\n                    this.emit(\n                        Events.MESSAGE_REACTION,\n                        new Reaction(this, reaction),\n                    );\n                }\n            },\n        );\n\n        await exposeFunctionIfAbsent(\n            this.pupPage,\n            'onRemoveChatEvent',\n            async (chat) => {\n                const _chat = await this.getChatById(chat.id);\n\n                /**\n                 * Emitted when a chat is removed\n                 * @event Client#chat_removed\n                 * @param {Chat} chat\n                 */\n                this.emit(Events.CHAT_REMOVED, _chat);\n            },\n        );\n\n        await exposeFunctionIfAbsent(\n            this.pupPage,\n            'onArchiveChatEvent',\n            async (chat, currState, prevState) => {\n                const _chat = await this.getChatById(chat.id);\n\n                /**\n                 * Emitted when a chat is archived/unarchived\n                 * @event Client#chat_archived\n                 * @param {Chat} chat\n                 * @param {boolean} currState\n                 * @param {boolean} prevState\n                 */\n                this.emit(Events.CHAT_ARCHIVED, _chat, currState, prevState);\n            },\n        );\n\n        await exposeFunctionIfAbsent(\n            this.pupPage,\n            'onEditMessageEvent',\n            (msg, newBody, prevBody) => {\n                if (msg.type === 'revoked') {\n                    return;\n                }\n                /**\n                 * Emitted when messages are edited\n                 * @event Client#message_edit\n                 * @param {Message} message\n                 * @param {string} newBody\n                 * @param {string} prevBody\n                 */\n                this.emit(\n                    Events.MESSAGE_EDIT,\n                    new Message(this, msg),\n                    newBody,\n                    prevBody,\n                );\n            },\n        );\n\n        await exposeFunctionIfAbsent(\n            this.pupPage,\n            'onAddMessageCiphertextEvent',\n            (msg) => {\n                /**\n                 * Emitted when messages are edited\n                 * @event Client#message_ciphertext\n                 * @param {Message} message\n                 */\n                this.emit(Events.MESSAGE_CIPHERTEXT, new Message(this, msg));\n            },\n        );\n\n        await exposeFunctionIfAbsent(\n            this.pupPage,\n            'onPollVoteEvent',\n            (votes) => {\n                for (const vote of votes) {\n                    /**\n                     * Emitted when some poll option is selected or deselected,\n                     * shows a user's current selected option(s) on the poll\n                     * @event Client#vote_update\n                     */\n                    this.emit(Events.VOTE_UPDATE, new PollVote(this, vote));\n                }\n            },\n        );\n\n        await this.pupPage.evaluate(() => {\n            const { Msg, Chat, WAWebCallCollection } =\n                window.require('WAWebCollections');\n            const AppState = window.require('WAWebSocketModel').Socket;\n            Msg.on('change', (msg) => {\n                window.onChangeMessageEvent(window.WWebJS.getMessageModel(msg));\n            });\n            Msg.on('change:type', (msg) => {\n                window.onChangeMessageTypeEvent(\n                    window.WWebJS.getMessageModel(msg),\n                );\n            });\n            Msg.on('change:ack', (msg, ack) => {\n                window.onMessageAckEvent(\n                    window.WWebJS.getMessageModel(msg),\n                    ack,\n                );\n            });\n            Msg.on('change:isUnsentMedia', (msg, unsent) => {\n                if (msg.id.fromMe && !unsent)\n                    window.onMessageMediaUploadedEvent(\n                        window.WWebJS.getMessageModel(msg),\n                    );\n            });\n            Msg.on('remove', (msg) => {\n                if (msg.isNewMsg)\n                    window.onRemoveMessageEvent(\n                        window.WWebJS.getMessageModel(msg),\n                    );\n            });\n            Msg.on('change:body change:caption', (msg, newBody, prevBody) => {\n                window.onEditMessageEvent(\n                    window.WWebJS.getMessageModel(msg),\n                    newBody,\n                    prevBody,\n                );\n            });\n            AppState.on('change:state', (_AppState, state) => {\n                window.onAppStateChangedEvent(state);\n            });\n            window\n                .require('WAWebConnModel')\n                .Conn.on('change:battery', (state) => {\n                    window.onBatteryStateChangedEvent(state);\n                });\n            if (\n                WAWebCallCollection &&\n                typeof WAWebCallCollection.on === 'function'\n            ) {\n                WAWebCallCollection.on('add', (call) => {\n                    window.onIncomingCall(call);\n                });\n            }\n            Chat.on('remove', async (chat) => {\n                window.onRemoveChatEvent(\n                    await window.WWebJS.getChatModel(chat),\n                );\n            });\n            Chat.on('change:archive', async (chat, currState, prevState) => {\n                window.onArchiveChatEvent(\n                    await window.WWebJS.getChatModel(chat),\n                    currState,\n                    prevState,\n                );\n            });\n            Msg.on('add', (msg) => {\n                if (msg.isNewMsg) {\n                    if (msg.type === 'ciphertext') {\n                        // defer message event until ciphertext is resolved (type changed)\n                        msg.once('change:type', (_msg) =>\n                            window.onAddMessageEvent(\n                                window.WWebJS.getMessageModel(_msg),\n                            ),\n                        );\n                        window.onAddMessageCiphertextEvent(\n                            window.WWebJS.getMessageModel(msg),\n                        );\n                    } else {\n                        window.onAddMessageEvent(\n                            window.WWebJS.getMessageModel(msg),\n                        );\n                    }\n                }\n            });\n            Chat.on('change:unreadCount', (chat) => {\n                window.onChatUnreadCountEvent(chat);\n            });\n\n            window.WWebJS.injectToFunction(\n                {\n                    module: 'WAWebAddonReactionTableMode',\n                    function: 'reactionTableMode.bulkUpsert',\n                },\n                (module, origFunction, ...args) => {\n                    window.onReaction(\n                        args[0].map((reaction) => {\n                            const msgKey = reaction.id;\n                            const parentMsgKey = reaction.reactionParentKey;\n                            const timestamp = reaction.reactionTimestamp / 1000;\n                            const sender = reaction.author ?? reaction.from;\n                            const senderUserJid = sender._serialized;\n\n                            return {\n                                ...reaction,\n                                msgKey,\n                                parentMsgKey,\n                                senderUserJid,\n                                timestamp,\n                            };\n                        }),\n                    );\n\n                    return origFunction.apply(module, args);\n                },\n            );\n\n            window.WWebJS.injectToFunction(\n                {\n                    module: 'WAWebAddonPollVoteTableMode',\n                    function: 'pollVoteTableMode.bulkUpsert',\n                },\n                async (module, origFunction, ...args) => {\n                    const votes = await Promise.all(\n                        args[0].map(async (vote) => {\n                            const msgKey = vote.id;\n                            const parentMsgKey = vote.pollUpdateParentKey;\n                            const timestamp = vote.t / 1000;\n                            const sender = vote.author ?? vote.from;\n                            const senderUserJid = sender._serialized;\n\n                            let parentMessage = Msg.get(\n                                parentMsgKey._serialized,\n                            );\n                            if (!parentMessage) {\n                                const fetched = await Msg.getMessagesById([\n                                    parentMsgKey._serialized,\n                                ]);\n                                parentMessage = fetched?.messages?.[0] || null;\n                            }\n\n                            return {\n                                ...vote,\n                                msgKey,\n                                sender,\n                                parentMsgKey,\n                                senderUserJid,\n                                timestamp,\n                                parentMessage,\n                            };\n                        }),\n                    );\n\n                    window.onPollVoteEvent(votes);\n\n                    return origFunction.apply(module, args);\n                },\n            );\n        });\n    }\n\n    async initWebVersionCache() {\n        const { type: webCacheType, ...webCacheOptions } =\n            this.options.webVersionCache;\n        const webCache = WebCacheFactory.createWebCache(\n            webCacheType,\n            webCacheOptions,\n        );\n\n        const requestedVersion = this.options.webVersion;\n        const versionContent = await webCache.resolve(requestedVersion);\n\n        if (versionContent) {\n            await this.pupPage.setRequestInterception(true);\n            this.pupPage.on('request', async (req) => {\n                if (req.url() === WhatsWebURL) {\n                    req.respond({\n                        status: 200,\n                        contentType: 'text/html',\n                        body: versionContent,\n                    });\n                } else {\n                    req.continue();\n                }\n            });\n        } else {\n            this.pupPage.on('response', async (res) => {\n                if (res.ok() && res.url() === WhatsWebURL) {\n                    const indexHtml = await res.text();\n                    this.currentIndexHtml = indexHtml;\n                }\n            });\n        }\n    }\n\n    /**\n     * Closes the client\n     */\n    async destroy() {\n        const browser = this.pupBrowser;\n        const isConnected = browser?.isConnected?.();\n        if (isConnected) {\n            await browser.close();\n        }\n        await this.authStrategy.destroy();\n    }\n\n    /**\n     * Logs out the client, closing the current session\n     */\n    async logout() {\n        await this.pupPage.evaluate(() => {\n            return window.require('WAWebSocketModel').Socket.logout();\n        });\n        await this.pupBrowser.close();\n\n        let maxDelay = 0;\n        while (this.pupBrowser.isConnected() && maxDelay < 10) {\n            // waits a maximum of 1 second before calling the AuthStrategy\n            await new Promise((resolve) => setTimeout(resolve, 100));\n            maxDelay++;\n        }\n\n        await this.authStrategy.logout();\n    }\n\n    /**\n     * Returns the version of WhatsApp Web currently being run\n     * @returns {Promise<string>}\n     */\n    async getWWebVersion() {\n        return await this.pupPage.evaluate(() => {\n            return window.Debug.VERSION;\n        });\n    }\n\n    async setDeviceName(deviceName, browserName) {\n        (deviceName || browserName) &&\n            (await this.pupPage.evaluate(\n                (deviceName, browserName) => {\n                    const func = window.require('WAWebMiscBrowserUtils').info;\n                    window.require('WAWebMiscBrowserUtils').info = () => {\n                        return {\n                            ...func(),\n                            ...(deviceName ? { os: deviceName } : {}),\n                            ...(browserName ? { name: browserName } : {}),\n                        };\n                    };\n                },\n                deviceName,\n                browserName,\n            ));\n    }\n\n    /**\n     * Mark as seen for the Chat\n     *  @param {string} chatId\n     *  @returns {Promise<boolean>} result\n     *\n     */\n    async sendSeen(chatId) {\n        return await this.pupPage.evaluate(async (chatId) => {\n            return window.WWebJS.sendSeen(chatId);\n        }, chatId);\n    }\n\n    /**\n     * An object representing mentions of groups\n     * @typedef {Object} GroupMention\n     * @property {string} subject - The name of a group to mention (can be custom)\n     * @property {string} id - The group ID, e.g.: 'XXXXXXXXXX@g.us'\n     */\n\n    /**\n     * Message options.\n     * @typedef {Object} MessageSendOptions\n     * @property {boolean} [linkPreview=true] - Show links preview. Has no effect on multi-device accounts.\n     * @property {boolean} [sendAudioAsVoice=false] - Send audio as voice message with a generated waveform\n     * @property {boolean} [sendVideoAsGif=false] - Send video as gif\n     * @property {boolean} [sendMediaAsSticker=false] - Send media as a sticker\n     * @property {boolean} [sendMediaAsDocument=false] - Send media as a document\n     * @property {boolean} [sendMediaAsHd=false] - Send image as quality HD\n     * @property {boolean} [isViewOnce=false] - Send photo/video as a view once message\n     * @property {boolean} [parseVCards=true] - Automatically parse vCards and send them as contacts\n     * @property {string} [caption] - Image or video caption\n     * @property {string} [quotedMessageId] - Id of the message that is being quoted (or replied to)\n     * @property {GroupMention[]} [groupMentions] - An array of object that handle group mentions\n     * @property {string[]} [mentions] - User IDs to mention in the message\n     * @property {boolean} [sendSeen=true] - Mark the conversation as seen after sending the message\n     * @property {string} [invokedBotWid=undefined] - Bot Wid when doing a bot mention like @Meta AI\n     * @property {string} [stickerAuthor=undefined] - Sets the author of the sticker, (if sendMediaAsSticker is true).\n     * @property {string} [stickerName=undefined] - Sets the name of the sticker, (if sendMediaAsSticker is true).\n     * @property {string[]} [stickerCategories=undefined] - Sets the categories of the sticker, (if sendMediaAsSticker is true). Provide emoji char array, can be null.\n     * @property {boolean} [ignoreQuoteErrors = true] - Should the bot send a quoted message without the quoted message if it fails to get the quote?\n     * @property {boolean} [waitUntilMsgSent = false] - Should the bot wait for the message send result?\n     * @property {MessageMedia} [media] - Media to be sent\n     * @property {any} [extra] - Extra options\n     */\n\n    /**\n     * Send a message to a specific chatId\n     * @param {string} chatId\n     * @param {string|MessageMedia|Location|Poll|Contact|Array<Contact>|Buttons|List} content\n     * @param {MessageSendOptions} [options] - Options used when sending the message\n     *\n     * @returns {Promise<Message>} Message that was just sent\n     */\n    async sendMessage(chatId, content, options = {}) {\n        const isChannel = /@\\w*newsletter\\b/.test(chatId);\n        const isStatus = /@\\w*broadcast\\b/.test(chatId);\n\n        if (\n            isChannel &&\n            [\n                options.sendMediaAsDocument,\n                options.quotedMessageId,\n                options.parseVCards,\n                options.isViewOnce,\n                content instanceof Location,\n                content instanceof Contact,\n                content instanceof Buttons,\n                content instanceof List,\n                Array.isArray(content) &&\n                    content.length > 0 &&\n                    content[0] instanceof Contact,\n            ].includes(true)\n        ) {\n            console.warn(\n                'The message type is currently not supported for sending in channels,\\nthe supported message types are: text, image, sticker, gif, video, voice and poll.',\n            );\n            return null;\n        } else if (\n            isStatus &&\n            [\n                options.sendMediaAsDocument,\n                options.quotedMessageId,\n                options.parseVCards,\n                options.isViewOnce,\n                options.sendMediaAsSticker,\n                content instanceof Location,\n                content instanceof Contact,\n                content instanceof Poll,\n                content instanceof Buttons,\n                content instanceof List,\n                Array.isArray(content) &&\n                    content.length > 0 &&\n                    content[0] instanceof Contact,\n            ].includes(true)\n        ) {\n            console.warn(\n                'The message type is currently not supported for sending in status broadcast,\\nthe supported message types are: text, image, gif, audio and video.',\n            );\n            return null;\n        }\n\n        if (options.mentions) {\n            !Array.isArray(options.mentions) &&\n                (options.mentions = [options.mentions]);\n            if (\n                options.mentions.some(\n                    (possiblyContact) => possiblyContact instanceof Contact,\n                )\n            ) {\n                console.warn(\n                    'Mentions with an array of Contact are now deprecated. See more at https://github.com/pedroslopez/whatsapp-web.js/pull/2166.',\n                );\n                options.mentions = options.mentions.map(\n                    (a) => a.id._serialized,\n                );\n            }\n        }\n\n        options.groupMentions &&\n            !Array.isArray(options.groupMentions) &&\n            (options.groupMentions = [options.groupMentions]);\n\n        let internalOptions = {\n            linkPreview: options.linkPreview === false ? undefined : true,\n            sendAudioAsVoice: options.sendAudioAsVoice,\n            sendVideoAsGif: options.sendVideoAsGif,\n            sendMediaAsSticker: options.sendMediaAsSticker,\n            sendMediaAsDocument: options.sendMediaAsDocument,\n            sendMediaAsHd: options.sendMediaAsHd,\n            caption: options.caption,\n            isCaptionByUser: options.caption ? true : false,\n            quotedMessageId: options.quotedMessageId,\n            parseVCards: options.parseVCards !== false,\n            mentionedJidList: options.mentions || [],\n            groupMentions: options.groupMentions,\n            invokedBotWid: options.invokedBotWid,\n            ignoreQuoteErrors: options.ignoreQuoteErrors !== false,\n            waitUntilMsgSent: options.waitUntilMsgSent || false,\n            extraOptions: options.extra,\n        };\n\n        const sendSeen = options.sendSeen !== false;\n\n        if (content instanceof MessageMedia) {\n            internalOptions.media = content;\n            ((internalOptions.isViewOnce = options.isViewOnce), (content = ''));\n        } else if (options.media instanceof MessageMedia) {\n            internalOptions.media = options.media;\n            internalOptions.caption = content;\n            ((internalOptions.isViewOnce = options.isViewOnce), (content = ''));\n        } else if (content instanceof Location) {\n            internalOptions.location = content;\n            content = '';\n        } else if (content instanceof Poll) {\n            internalOptions.poll = content;\n            content = '';\n        } else if (content instanceof ScheduledEvent) {\n            internalOptions.event = content;\n            content = '';\n        } else if (content instanceof Contact) {\n            internalOptions.contactCard = content.id._serialized;\n            content = '';\n        } else if (\n            Array.isArray(content) &&\n            content.length > 0 &&\n            content[0] instanceof Contact\n        ) {\n            internalOptions.contactCardList = content.map(\n                (contact) => contact.id._serialized,\n            );\n            content = '';\n        } else if (content instanceof Buttons) {\n            console.warn(\n                'Buttons are now deprecated. See more at https://www.youtube.com/watch?v=hv1R1rLeVVE.',\n            );\n            if (content.type !== 'chat') {\n                internalOptions.attachment = content.body;\n            }\n            internalOptions.buttons = content;\n            content = '';\n        } else if (content instanceof List) {\n            console.warn(\n                'Lists are now deprecated. See more at https://www.youtube.com/watch?v=hv1R1rLeVVE.',\n            );\n            internalOptions.list = content;\n            content = '';\n        }\n\n        if (internalOptions.sendMediaAsSticker && internalOptions.media) {\n            internalOptions.media = await Util.formatToWebpSticker(\n                internalOptions.media,\n                {\n                    name: options.stickerName,\n                    author: options.stickerAuthor,\n                    categories: options.stickerCategories,\n                },\n                this.pupPage,\n            );\n        }\n\n        const sentMsg = await this.pupPage.evaluate(\n            async (chatId, content, options, sendSeen) => {\n                const chat = await window.WWebJS.getChat(chatId, {\n                    getAsModel: false,\n                });\n\n                if (!chat) return null;\n\n                if (sendSeen) {\n                    await window.WWebJS.sendSeen(chatId);\n                }\n\n                const msg = await window.WWebJS.sendMessage(\n                    chat,\n                    content,\n                    options,\n                );\n                return msg ? window.WWebJS.getMessageModel(msg) : undefined;\n            },\n            chatId,\n            content,\n            internalOptions,\n            sendSeen,\n        );\n\n        return sentMsg ? new Message(this, sentMsg) : undefined;\n    }\n\n    /**\n     * @typedef {Object} SendChannelAdminInviteOptions\n     * @property {?string} comment The comment to be added to an invitation\n     */\n\n    /**\n     * Sends a channel admin invitation to a user, allowing them to become an admin of the channel\n     * @param {string} chatId The ID of a user to send the channel admin invitation to\n     * @param {string} channelId The ID of a channel for which the invitation is being sent\n     * @param {SendChannelAdminInviteOptions} options\n     * @returns {Promise<boolean>} Returns true if an invitation was sent successfully, false otherwise\n     */\n    async sendChannelAdminInvite(chatId, channelId, options = {}) {\n        const response = await this.pupPage.evaluate(\n            async (chatId, channelId, options) => {\n                const { createWid } = window.require('WAWebWidFactory');\n                const channelWid = createWid(channelId);\n                const chatWid = createWid(chatId);\n                const chat =\n                    window.require('WAWebCollections').Chat.get(chatWid) ||\n                    (await window\n                        .require('WAWebCollections')\n                        .Chat.find(chatWid));\n\n                if (!chatWid.isUser()) {\n                    return false;\n                }\n\n                return await window\n                    .require('WAWebNewsletterSendMsgAction')\n                    .sendNewsletterAdminInviteMessage(chat, {\n                        newsletterWid: channelWid,\n                        invitee: chatWid,\n                        inviteMessage: options.comment,\n                        base64Thumb:\n                            await window.WWebJS.getProfilePicThumbToBase64(\n                                channelWid,\n                            ),\n                    });\n            },\n            chatId,\n            channelId,\n            options,\n        );\n\n        return response.messageSendResult === 'OK';\n    }\n\n    /**\n     * Searches for messages\n     * @param {string} query\n     * @param {Object} [options]\n     * @param {number} [options.page]\n     * @param {number} [options.limit]\n     * @param {string} [options.chatId]\n     * @returns {Promise<Message[]>}\n     */\n    async searchMessages(query, options = {}) {\n        const messages = await this.pupPage.evaluate(\n            async (query, page, count, remote) => {\n                const { messages } = await window\n                    .require('WAWebCollections')\n                    .Msg.search(query, page, count, remote);\n                return messages.map((msg) =>\n                    window.WWebJS.getMessageModel(msg),\n                );\n            },\n            query,\n            options.page,\n            options.limit,\n            options.chatId,\n        );\n\n        return messages.map((msg) => new Message(this, msg));\n    }\n\n    /**\n     * Get all current chat instances\n     * @returns {Promise<Array<Chat>>}\n     */\n    async getChats() {\n        const chats = await this.pupPage.evaluate(async () => {\n            return await window.WWebJS.getChats();\n        });\n\n        return chats.map((chat) => ChatFactory.create(this, chat));\n    }\n\n    /**\n     * Gets all cached {@link Channel} instance\n     * @returns {Promise<Array<Channel>>}\n     */\n    async getChannels() {\n        const channels = await this.pupPage.evaluate(async () => {\n            return await window.WWebJS.getChannels();\n        });\n\n        return channels.map((channel) => ChatFactory.create(this, channel));\n    }\n\n    /**\n     * Gets chat or channel instance by ID\n     * @param {string} chatId\n     * @returns {Promise<Chat|Channel>}\n     */\n    async getChatById(chatId) {\n        const chat = await this.pupPage.evaluate(async (chatId) => {\n            return await window.WWebJS.getChat(chatId);\n        }, chatId);\n        return chat ? ChatFactory.create(this, chat) : undefined;\n    }\n\n    /**\n     * Gets a {@link Channel} instance by invite code\n     * @param {string} inviteCode The code that comes after the 'https://whatsapp.com/channel/'\n     * @returns {Promise<Channel>}\n     */\n    async getChannelByInviteCode(inviteCode) {\n        const channel = await this.pupPage.evaluate(async (inviteCode) => {\n            let channelMetadata;\n            try {\n                channelMetadata =\n                    await window.WWebJS.getChannelMetadata(inviteCode);\n            } catch (err) {\n                if (err.name === 'ServerStatusCodeError') return null;\n                throw err;\n            }\n            return await window.WWebJS.getChat(channelMetadata.id);\n        }, inviteCode);\n\n        return channel ? ChatFactory.create(this, channel) : undefined;\n    }\n\n    /**\n     * Get all current contact instances\n     * @returns {Promise<Array<Contact>>}\n     */\n    async getContacts() {\n        let contacts = await this.pupPage.evaluate(() => {\n            return window.WWebJS.getContacts();\n        });\n\n        return contacts.map((contact) => ContactFactory.create(this, contact));\n    }\n\n    /**\n     * Get contact instance by ID\n     * @param {string} contactId\n     * @returns {Promise<Contact>}\n     */\n    async getContactById(contactId) {\n        let contact = await this.pupPage.evaluate((contactId) => {\n            return window.WWebJS.getContact(contactId);\n        }, contactId);\n\n        return ContactFactory.create(this, contact);\n    }\n\n    /**\n     * Get message by ID\n     * @param {string} messageId\n     * @returns {Promise<Message>}\n     */\n    async getMessageById(messageId) {\n        const msg = await this.pupPage.evaluate(async (messageId) => {\n            let msg = window.require('WAWebCollections').Msg.get(messageId);\n            if (msg) return window.WWebJS.getMessageModel(msg);\n\n            const params = messageId.split('_');\n            if (params.length !== 3 && params.length !== 4)\n                throw new Error('Invalid serialized message id specified');\n\n            let messagesObject = await window\n                .require('WAWebCollections')\n                .Msg.getMessagesById([messageId]);\n            if (messagesObject && messagesObject.messages.length)\n                msg = messagesObject.messages[0];\n\n            if (msg) return window.WWebJS.getMessageModel(msg);\n        }, messageId);\n\n        if (msg) return new Message(this, msg);\n        return null;\n    }\n\n    /**\n     * Gets instances of all pinned messages in a chat\n     * @param {string} chatId The chat ID\n     * @returns {Promise<Array<Message>>}\n     */\n    async getPinnedMessages(chatId) {\n        const pinnedMsgs = await this.pupPage.evaluate(async (chatId) => {\n            const chatWid = window.require('WAWebWidFactory').createWid(chatId);\n            const chat =\n                window.require('WAWebCollections').Chat.get(chatWid) ??\n                (await window.require('WAWebCollections').Chat.find(chatWid));\n            if (!chat) return [];\n\n            const msgs = await window\n                .require('WAWebPinInChatSchema')\n                .getTable()\n                .equals(['chatId'], chatWid.toString());\n\n            const pinnedMsgs = (\n                await Promise.all(\n                    msgs\n                        .filter((msg) => msg.pinType == 1)\n                        .map(async (msg) => {\n                            const res = await window\n                                .require('WAWebCollections')\n                                .Msg.getMessagesById([msg.parentMsgKey]);\n                            return res?.messages?.[0];\n                        }),\n                )\n            ).filter(Boolean);\n\n            return !pinnedMsgs.length\n                ? []\n                : await Promise.all(\n                      pinnedMsgs.map((msg) =>\n                          window.WWebJS.getMessageModel(msg),\n                      ),\n                  );\n        }, chatId);\n\n        return pinnedMsgs.map((msg) => new Message(this, msg));\n    }\n\n    /**\n     * Returns an object with information about the invite code's group\n     * @param {string} inviteCode\n     * @returns {Promise<object>} Invite information\n     */\n    async getInviteInfo(inviteCode) {\n        return await this.pupPage.evaluate((inviteCode) => {\n            return window\n                .require('WAWebGroupQueryJob')\n                .queryGroupInvite(inviteCode);\n        }, inviteCode);\n    }\n\n    /**\n     * Accepts an invitation to join a group\n     * @param {string} inviteCode Invitation code\n     * @returns {Promise<string>} Id of the joined Chat\n     */\n    async acceptInvite(inviteCode) {\n        const res = await this.pupPage.evaluate(async (inviteCode) => {\n            return await window\n                .require('WAWebGroupInviteJob')\n                .joinGroupViaInvite(inviteCode);\n        }, inviteCode);\n\n        return res.gid._serialized;\n    }\n\n    /**\n     * Accepts a channel admin invitation and promotes the current user to a channel admin\n     * @param {string} channelId The channel ID to accept the admin invitation from\n     * @returns {Promise<boolean>} Returns true if the operation completed successfully, false otherwise\n     */\n    async acceptChannelAdminInvite(channelId) {\n        return await this.pupPage.evaluate(async (channelId) => {\n            try {\n                await window\n                    .require('WAWebMexAcceptNewsletterAdminInviteJob')\n                    .acceptNewsletterAdminInvite(channelId);\n                return true;\n            } catch (err) {\n                if (err.name === 'ServerStatusCodeError') return false;\n                throw err;\n            }\n        }, channelId);\n    }\n\n    /**\n     * Revokes a channel admin invitation sent to a user by a channel owner\n     * @param {string} channelId The channel ID an invitation belongs to\n     * @param {string} userId The user ID the invitation was sent to\n     * @returns {Promise<boolean>} Returns true if the operation completed successfully, false otherwise\n     */\n    async revokeChannelAdminInvite(channelId, userId) {\n        return await this.pupPage.evaluate(\n            async (channelId, userId) => {\n                try {\n                    const userWid = window\n                        .require('WAWebWidFactory')\n                        .createWid(userId);\n                    await window\n                        .require('WAWebMexRevokeNewsletterAdminInviteJob')\n                        .revokeNewsletterAdminInvite(channelId, userWid);\n                    return true;\n                } catch (err) {\n                    if (err.name === 'ServerStatusCodeError') return false;\n                    throw err;\n                }\n            },\n            channelId,\n            userId,\n        );\n    }\n\n    /**\n     * Demotes a channel admin to a regular subscriber (can be used also for self-demotion)\n     * @param {string} channelId The channel ID to demote an admin in\n     * @param {string} userId The user ID to demote\n     * @returns {Promise<boolean>} Returns true if the operation completed successfully, false otherwise\n     */\n    async demoteChannelAdmin(channelId, userId) {\n        return await this.pupPage.evaluate(\n            async (channelId, userId) => {\n                try {\n                    const userWid = window\n                        .require('WAWebWidFactory')\n                        .createWid(userId);\n                    await window\n                        .require('WAWebDemoteNewsletterAdminAction')\n                        .demoteNewsletterAdmin(channelId, userWid);\n                    return true;\n                } catch (err) {\n                    if (err.name === 'ServerStatusCodeError') return false;\n                    throw err;\n                }\n            },\n            channelId,\n            userId,\n        );\n    }\n\n    /**\n     * Accepts a private invitation to join a group\n     * @param {object} inviteInfo Invite V4 Info\n     * @returns {Promise<Object>}\n     */\n    async acceptGroupV4Invite(inviteInfo) {\n        if (!inviteInfo.inviteCode)\n            throw 'Invalid invite code, try passing the message.inviteV4 object';\n        if (inviteInfo.inviteCodeExp == 0) throw 'Expired invite code';\n        return this.pupPage.evaluate(async (inviteInfo) => {\n            let { groupId, fromId, inviteCode, inviteCodeExp } = inviteInfo;\n            let userWid = window.require('WAWebWidFactory').createWid(fromId);\n            return await window\n                .require('WAWebGroupInviteV4Job')\n                .joinGroupViaInviteV4(\n                    inviteCode,\n                    String(inviteCodeExp),\n                    groupId,\n                    userWid,\n                );\n        }, inviteInfo);\n    }\n\n    /**\n     * Sets the current user's status message\n     * @param {string} status New status message\n     */\n    async setStatus(status) {\n        await this.pupPage.evaluate(async (status) => {\n            return await window\n                .require('WAWebContactStatusBridge')\n                .setMyStatus(status);\n        }, status);\n    }\n\n    /**\n     * Sets the current user's display name.\n     * This is the name shown to WhatsApp users that have not added you as a contact beside your number in groups and in your profile.\n     * @param {string} displayName New display name\n     * @returns {Promise<Boolean>}\n     */\n    async setDisplayName(displayName) {\n        const couldSet = await this.pupPage.evaluate(async (displayName) => {\n            if (!window.require('WAWebConnModel').Conn.canSetMyPushname())\n                return false;\n            await window\n                .require('WAWebSetPushnameConnAction')\n                .setPushname(displayName);\n            return true;\n        }, displayName);\n\n        return couldSet;\n    }\n\n    /**\n     * Gets the current connection state for the client\n     * @returns {WAState}\n     */\n    async getState() {\n        return await this.pupPage.evaluate(() => {\n            return window.require('WAWebSocketModel').Socket.state ?? null;\n        });\n    }\n\n    /**\n     * Marks the client as online\n     */\n    async sendPresenceAvailable() {\n        return await this.pupPage.evaluate(() => {\n            return window\n                .require('WAWebPresenceChatAction')\n                .sendPresenceAvailable();\n        });\n    }\n\n    /**\n     * Marks the client as unavailable\n     */\n    async sendPresenceUnavailable() {\n        return await this.pupPage.evaluate(() => {\n            return window\n                .require('WAWebPresenceChatAction')\n                .sendPresenceUnavailable();\n        });\n    }\n\n    /**\n     * Enables and returns the archive state of the Chat\n     * @returns {boolean}\n     */\n    async archiveChat(chatId) {\n        return await this.pupPage.evaluate(async (chatId) => {\n            let chat = await window.WWebJS.getChat(chatId, {\n                getAsModel: false,\n            });\n            await window.require('WAWebCmd').Cmd.archiveChat(chat, true);\n            return true;\n        }, chatId);\n    }\n\n    /**\n     * Changes and returns the archive state of the Chat\n     * @returns {boolean}\n     */\n    async unarchiveChat(chatId) {\n        return await this.pupPage.evaluate(async (chatId) => {\n            let chat = await window.WWebJS.getChat(chatId, {\n                getAsModel: false,\n            });\n            await window.require('WAWebCmd').Cmd.archiveChat(chat, false);\n            return false;\n        }, chatId);\n    }\n\n    /**\n     * Pins the Chat\n     * @returns {Promise<boolean>} New pin state. Could be false if the max number of pinned chats was reached.\n     */\n    async pinChat(chatId) {\n        return this.pupPage.evaluate(async (chatId) => {\n            let chat = await window.WWebJS.getChat(chatId, {\n                getAsModel: false,\n            });\n            if (chat.pin) {\n                return true;\n            }\n            const MAX_PIN_COUNT = 3;\n            const chatModels = window\n                .require('WAWebCollections')\n                .Chat.getModelsArray();\n            if (chatModels.length > MAX_PIN_COUNT) {\n                let maxPinned = chatModels[MAX_PIN_COUNT - 1].pin;\n                if (maxPinned) {\n                    return false;\n                }\n            }\n            await window.require('WAWebCmd').Cmd.pinChat(chat, true);\n            return true;\n        }, chatId);\n    }\n\n    /**\n     * Unpins the Chat\n     * @returns {Promise<boolean>} New pin state\n     */\n    async unpinChat(chatId) {\n        return this.pupPage.evaluate(async (chatId) => {\n            let chat = await window.WWebJS.getChat(chatId, {\n                getAsModel: false,\n            });\n            if (!chat.pin) {\n                return false;\n            }\n            await window.require('WAWebCmd').Cmd.pinChat(chat, false);\n            return false;\n        }, chatId);\n    }\n\n    /**\n     * Mutes this chat forever, unless a date is specified\n     * @param {string} chatId ID of the chat that will be muted\n     * @param {?Date} unmuteDate Date when the chat will be unmuted, don't provide a value to mute forever\n     * @returns {Promise<{isMuted: boolean, muteExpiration: number}>}\n     */\n    async muteChat(chatId, unmuteDate) {\n        unmuteDate = unmuteDate ? Math.floor(unmuteDate.getTime() / 1000) : -1;\n        return this._muteUnmuteChat(chatId, 'MUTE', unmuteDate);\n    }\n\n    /**\n     * Unmutes the Chat\n     * @param {string} chatId ID of the chat that will be unmuted\n     * @returns {Promise<{isMuted: boolean, muteExpiration: number}>}\n     */\n    async unmuteChat(chatId) {\n        return this._muteUnmuteChat(chatId, 'UNMUTE');\n    }\n\n    /**\n     * Internal method to mute or unmute the chat\n     * @param {string} chatId ID of the chat that will be muted/unmuted\n     * @param {string} action The action: 'MUTE' or 'UNMUTE'\n     * @param {number} unmuteDateTs Timestamp at which the chat will be unmuted\n     * @returns {Promise<{isMuted: boolean, muteExpiration: number}>}\n     */\n    async _muteUnmuteChat(chatId, action, unmuteDateTs) {\n        return this.pupPage.evaluate(\n            async (chatId, action, unmuteDateTs) => {\n                const chat =\n                    window.require('WAWebCollections').Chat.get(chatId) ??\n                    (await window\n                        .require('WAWebCollections')\n                        .Chat.find(chatId));\n                action === 'MUTE'\n                    ? await chat.mute.mute({\n                          expiration: unmuteDateTs,\n                          sendDevice: true,\n                      })\n                    : await chat.mute.unmute({ sendDevice: true });\n                return {\n                    isMuted: chat.mute.expiration !== 0,\n                    muteExpiration: chat.mute.expiration,\n                };\n            },\n            chatId,\n            action,\n            unmuteDateTs || -1,\n        );\n    }\n\n    /**\n     * Mark the Chat as unread\n     * @param {string} chatId ID of the chat that will be marked as unread\n     */\n    async markChatUnread(chatId) {\n        await this.pupPage.evaluate(async (chatId) => {\n            let chat = await window.WWebJS.getChat(chatId, {\n                getAsModel: false,\n            });\n            await window.require('WAWebCmd').Cmd.markChatUnread(chat, true);\n        }, chatId);\n    }\n\n    /**\n     * Returns the contact ID's profile picture URL, if privacy settings allow it\n     * @param {string} contactId the whatsapp user's ID\n     * @returns {Promise<string>}\n     */\n    async getProfilePicUrl(contactId) {\n        const profilePic = await this.pupPage.evaluate(async (contactId) => {\n            try {\n                const chat = await window.WWebJS.getChat(contactId);\n                return await window\n                    .require('WAWebContactProfilePicThumbBridge')\n                    .requestProfilePicFromServer(chat);\n            } catch (err) {\n                if (err.name === 'ServerStatusCodeError') return undefined;\n                throw err;\n            }\n        }, contactId);\n\n        return profilePic ? profilePic.eurl : undefined;\n    }\n\n    /**\n     * Gets the Contact's common groups with you. Returns empty array if you don't have any common group.\n     * @param {string} contactId the whatsapp user's ID (_serialized format)\n     * @returns {Promise<WAWebJS.ChatId[]>}\n     */\n    async getCommonGroups(contactId) {\n        const commonGroups = await this.pupPage.evaluate(async (contactId) => {\n            let contact = window\n                .require('WAWebCollections')\n                .Contact.get(contactId);\n            if (!contact) {\n                const wid = window\n                    .require('WAWebWidFactory')\n                    .createWid(contactId);\n                const chatConstructor = window\n                    .require('WAWebCollections')\n                    .Contact.getModelsArray()\n                    .find((c) => !c.isGroup).constructor;\n                contact = new chatConstructor({ id: wid });\n            }\n\n            if (contact.commonGroups) {\n                return contact.commonGroups.serialize();\n            }\n            const status = await window\n                .require('WAWebFindCommonGroupsContactAction')\n                .findCommonGroups(contact);\n            if (status) {\n                return contact.commonGroups.serialize();\n            }\n            return [];\n        }, contactId);\n        const chats = [];\n        for (const group of commonGroups) {\n            chats.push(group.id);\n        }\n        return chats;\n    }\n\n    /**\n     * Force reset of connection state for the client\n     */\n    async resetState() {\n        await this.pupPage.evaluate(() => {\n            window.require('WAWebSocketModel').Socket.reconnect();\n        });\n    }\n\n    /**\n     * Check if a given ID is registered in whatsapp\n     * @param {string} id the whatsapp user's ID\n     * @returns {Promise<Boolean>}\n     */\n    async isRegisteredUser(id) {\n        return Boolean(await this.getNumberId(id));\n    }\n\n    /**\n     * Get the registered WhatsApp ID for a number.\n     * Will return null if the number is not registered on WhatsApp.\n     * @param {string} number Number or ID (\"@c.us\" will be automatically appended if not specified)\n     * @returns {Promise<Object|null>}\n     */\n    async getNumberId(number) {\n        if (!number.endsWith('@c.us')) {\n            number += '@c.us';\n        }\n\n        return await this.pupPage.evaluate(async (number) => {\n            const wid = window.require('WAWebWidFactory').createWid(number);\n            const result = await window\n                .require('WAWebQueryExistsJob')\n                .queryWidExists(wid);\n            if (!result || result.wid === undefined) return null;\n            return result.wid;\n        }, number);\n    }\n\n    /**\n     * Get the formatted number of a WhatsApp ID.\n     * @param {string} number Number or ID\n     * @returns {Promise<string>}\n     */\n    async getFormattedNumber(number) {\n        if (!number.endsWith('@s.whatsapp.net'))\n            number = number.replace('c.us', 's.whatsapp.net');\n        if (!number.includes('@s.whatsapp.net'))\n            number = `${number}@s.whatsapp.net`;\n\n        return await this.pupPage.evaluate(async (numberId) => {\n            return window\n                .require('WAWebPhoneUtils')\n                .formattedPhoneNumber(numberId);\n        }, number);\n    }\n\n    /**\n     * Get the country code of a WhatsApp ID.\n     * @param {string} number Number or ID\n     * @returns {Promise<string>}\n     */\n    async getCountryCode(number) {\n        number = number.replace(' ', '').replace('+', '').replace('@c.us', '');\n\n        return await this.pupPage.evaluate(async (numberId) => {\n            return window.require('WAPhoneFindCC').findCC(numberId);\n        }, number);\n    }\n\n    /**\n     * An object that represents the result for a participant added to a group\n     * @typedef {Object} ParticipantResult\n     * @property {number} statusCode The status code of the result\n     * @property {string} message The result message\n     * @property {boolean} isGroupCreator Indicates if the participant is a group creator\n     * @property {boolean} isInviteV4Sent Indicates if the inviteV4 was sent to the participant\n     */\n\n    /**\n     * An object that handles the result for {@link createGroup} method\n     * @typedef {Object} CreateGroupResult\n     * @property {string} title A group title\n     * @property {Object} gid An object that handles the newly created group ID\n     * @property {string} gid.server\n     * @property {string} gid.user\n     * @property {string} gid._serialized\n     * @property {Object.<string, ParticipantResult>} participants An object that handles the result value for each added to the group participant\n     */\n\n    /**\n     * An object that handles options for group creation\n     * @typedef {Object} CreateGroupOptions\n     * @property {number} [messageTimer = 0] The number of seconds for the messages to disappear in the group (0 by default, won't take an effect if the group is been creating with myself only)\n     * @property {string|undefined} parentGroupId The ID of a parent community group to link the newly created group with (won't take an effect if the group is been creating with myself only)\n     * @property {boolean} [autoSendInviteV4 = true] If true, the inviteV4 will be sent to those participants who have restricted others from being automatically added to groups, otherwise the inviteV4 won't be sent (true by default)\n     * @property {string} [comment = ''] The comment to be added to an inviteV4 (empty string by default)\n     * @property {boolean} [memberAddMode = false] If true, only admins can add members to the group (false by default)\n     * @property {boolean} [membershipApprovalMode = false] If true, group admins will be required to approve anyone who wishes to join the group (false by default)\n     * @property {boolean} [isRestrict = true] If true, only admins can change group group info (true by default)\n     * @property {boolean} [isAnnounce = false] If true, only admins can send messages (false by default)\n     */\n\n    /**\n     * Creates a new group\n     * @param {string} title Group title\n     * @param {string|Contact|Array<Contact|string>|undefined} participants A single Contact object or an ID as a string or an array of Contact objects or contact IDs to add to the group\n     * @param {CreateGroupOptions} options An object that handles options for group creation\n     * @returns {Promise<CreateGroupResult|string>} Object with resulting data or an error message as a string\n     */\n    async createGroup(title, participants = [], options = {}) {\n        !Array.isArray(participants) && (participants = [participants]);\n        participants.map((p) => (p instanceof Contact ? p.id._serialized : p));\n\n        return await this.pupPage.evaluate(\n            async (title, participants, options) => {\n                const {\n                    messageTimer = 0,\n                    parentGroupId,\n                    autoSendInviteV4 = true,\n                    comment = '',\n                } = options;\n                const participantData = {},\n                    participantWids = [],\n                    failedParticipants = [];\n                let createGroupResult, parentGroupWid;\n\n                const addParticipantResultCodes = {\n                    default:\n                        'An unknown error occupied while adding a participant',\n                    200: 'The participant was added successfully',\n                    403: 'The participant can be added by sending private invitation only',\n                    404: 'The phone number is not registered on WhatsApp',\n                };\n\n                for (const participant of participants) {\n                    const pWid = window\n                        .require('WAWebWidFactory')\n                        .createWid(participant);\n                    if (\n                        (\n                            await window\n                                .require('WAWebQueryExistsJob')\n                                .queryWidExists(pWid)\n                        )?.wid\n                    ) {\n                        participantWids.push({ phoneNumber: pWid });\n                    } else failedParticipants.push(participant);\n                }\n\n                parentGroupId &&\n                    (parentGroupWid = window\n                        .require('WAWebWidFactory')\n                        .createWid(parentGroupId));\n\n                try {\n                    createGroupResult = await window\n                        .require('WAWebGroupCreateJob')\n                        .createGroup(\n                            {\n                                addressingModeOverride: 'lid',\n                                memberAddMode: options.memberAddMode ?? false,\n                                membershipApprovalMode:\n                                    options.membershipApprovalMode ?? false,\n                                announce: options.announce ?? false,\n                                restrict:\n                                    options.isRestrict !== undefined\n                                        ? !options.isRestrict\n                                        : false,\n                                ephemeralDuration: messageTimer,\n                                parentGroupId: parentGroupWid,\n                                title: title,\n                            },\n                            participantWids,\n                        );\n                } catch (err) {\n                    return 'CreateGroupError: An unknown error occupied while creating a group';\n                }\n\n                for (const participant of createGroupResult.participants) {\n                    let isInviteV4Sent = false;\n                    participant.wid.server == 'lid' &&\n                        (participant.wid = window\n                            .require('WAWebApiContact')\n                            .getPhoneNumber(participant.wid));\n                    const participantId = participant.wid._serialized;\n                    const statusCode = participant.error || 200;\n\n                    if (autoSendInviteV4 && statusCode === 403) {\n                        window\n                            .require('WAWebCollections')\n                            .Contact.gadd(participant.wid, { silent: true });\n                        const addParticipantResult = await window\n                            .require('WAWebChatSendMessages')\n                            .sendGroupInviteMessage(\n                                window\n                                    .require('WAWebCollections')\n                                    .Chat.get(participant.wid) ||\n                                    (await window\n                                        .require('WAWebCollections')\n                                        .Chat.find(participant.wid)),\n                                createGroupResult.wid._serialized,\n                                createGroupResult.subject,\n                                participant.invite_code,\n                                participant.invite_code_exp,\n                                comment,\n                                await window.WWebJS.getProfilePicThumbToBase64(\n                                    createGroupResult.wid,\n                                ),\n                            );\n                        isInviteV4Sent =\n                            addParticipantResult.messageSendResult === 'OK';\n                    }\n\n                    participantData[participantId] = {\n                        statusCode: statusCode,\n                        message:\n                            addParticipantResultCodes[statusCode] ||\n                            addParticipantResultCodes.default,\n                        isGroupCreator: participant.type === 'superadmin',\n                        isInviteV4Sent: isInviteV4Sent,\n                    };\n                }\n\n                for (const f of failedParticipants) {\n                    participantData[f] = {\n                        statusCode: 404,\n                        message: addParticipantResultCodes[404],\n                        isGroupCreator: false,\n                        isInviteV4Sent: false,\n                    };\n                }\n\n                return {\n                    title: title,\n                    gid: createGroupResult.wid,\n                    participants: participantData,\n                };\n            },\n            title,\n            participants,\n            options,\n        );\n    }\n\n    /**\n     * An object that handles the result for {@link createChannel} method\n     * @typedef {Object} CreateChannelResult\n     * @property {string} title A channel title\n     * @property {ChatId} nid An object that handels the newly created channel ID\n     * @property {string} nid.server 'newsletter'\n     * @property {string} nid.user 'XXXXXXXXXX'\n     * @property {string} nid._serialized 'XXXXXXXXXX@newsletter'\n     * @property {string} inviteLink The channel invite link, starts with 'https://whatsapp.com/channel/'\n     * @property {number} createdAtTs The timestamp the channel was created at\n     */\n\n    /**\n     * Options for the channel creation\n     * @typedef {Object} CreateChannelOptions\n     * @property {?string} description The channel description\n     * @property {?MessageMedia} picture The channel profile picture\n     */\n\n    /**\n     * Creates a new channel\n     * @param {string} title The channel name\n     * @param {CreateChannelOptions} options\n     * @returns {Promise<CreateChannelResult|string>} Returns an object that handles the result for the channel creation or an error message as a string\n     */\n    async createChannel(title, options = {}) {\n        return await this.pupPage.evaluate(\n            async (title, options) => {\n                let response,\n                    { description = null, picture = null } = options;\n\n                if (\n                    !window\n                        .require('WAWebNewsletterGatingUtils')\n                        .isNewsletterCreationEnabled()\n                ) {\n                    return 'CreateChannelError: A channel creation is not enabled';\n                }\n\n                if (picture) {\n                    picture = await window.WWebJS.cropAndResizeImage(picture, {\n                        asDataUrl: true,\n                        mimetype: 'image/jpeg',\n                        size: 640,\n                        quality: 1,\n                    });\n                }\n\n                try {\n                    response = await window\n                        .require('WAWebNewsletterCreateQueryJob')\n                        .createNewsletterQuery({\n                            name: title,\n                            description: description,\n                            picture: picture,\n                        });\n                } catch (err) {\n                    if (err.name === 'ServerStatusCodeError') {\n                        return 'CreateChannelError: An error occupied while creating a channel';\n                    }\n                    throw err;\n                }\n\n                return {\n                    title: title,\n                    nid: window\n                        .require('WAWebJidToWid')\n                        .newsletterJidToWid(response.idJid),\n                    inviteLink: `https://whatsapp.com/channel/${response.newsletterInviteLinkMetadataMixin.inviteCode}`,\n                    createdAtTs:\n                        response.newsletterCreationTimeMetadataMixin\n                            .creationTimeValue,\n                };\n            },\n            title,\n            options,\n        );\n    }\n\n    /**\n     * Subscribe to channel\n     * @param {string} channelId The channel ID\n     * @returns {Promise<boolean>} Returns true if the operation completed successfully, false otherwise\n     */\n    async subscribeToChannel(channelId) {\n        return await this.pupPage.evaluate(async (channelId) => {\n            return await window.WWebJS.subscribeToUnsubscribeFromChannel(\n                channelId,\n                'Subscribe',\n            );\n        }, channelId);\n    }\n\n    /**\n     * Options for unsubscribe from a channel\n     * @typedef {Object} UnsubscribeOptions\n     * @property {boolean} [deleteLocalModels = false] If true, after an unsubscription, it will completely remove a channel from the channel collection making it seem like the current user have never interacted with it. Otherwise it will only remove a channel from the list of channels the current user is subscribed to and will set the membership type for that channel to GUEST\n     */\n\n    /**\n     * Unsubscribe from channel\n     * @param {string} channelId The channel ID\n     * @param {UnsubscribeOptions} options\n     * @returns {Promise<boolean>} Returns true if the operation completed successfully, false otherwise\n     */\n    async unsubscribeFromChannel(channelId, options) {\n        return await this.pupPage.evaluate(\n            async (channelId, options) => {\n                return await window.WWebJS.subscribeToUnsubscribeFromChannel(\n                    channelId,\n                    'Unsubscribe',\n                    options,\n                );\n            },\n            channelId,\n            options,\n        );\n    }\n\n    /**\n     * Options for transferring a channel ownership to another user\n     * @typedef {Object} TransferChannelOwnershipOptions\n     * @property {boolean} [shouldDismissSelfAsAdmin = false] If true, after the channel ownership is being transferred to another user, the current user will be dismissed as a channel admin and will become to a channel subscriber.\n     */\n\n    /**\n     * Transfers a channel ownership to another user.\n     * Note: the user you are transferring the channel ownership to must be a channel admin.\n     * @param {string} channelId\n     * @param {string} newOwnerId\n     * @param {TransferChannelOwnershipOptions} options\n     * @returns {Promise<boolean>} Returns true if the operation completed successfully, false otherwise\n     */\n    async transferChannelOwnership(channelId, newOwnerId, options = {}) {\n        return await this.pupPage.evaluate(\n            async (channelId, newOwnerId, options) => {\n                const channel = await window.WWebJS.getChat(channelId, {\n                    getAsModel: false,\n                });\n                const newOwner =\n                    window\n                        .require('WAWebCollections')\n                        .Contact.get(newOwnerId) ||\n                    (await window\n                        .require('WAWebCollections')\n                        .Contact.find(newOwnerId));\n                if (!channel.newsletterMetadata) {\n                    await window\n                        .require('WAWebCollections')\n                        .NewsletterMetadataCollection.update(channel.id);\n                }\n\n                try {\n                    await window\n                        .require('WAWebChangeNewsletterOwnerAction')\n                        .changeNewsletterOwnerAction(channel, newOwner);\n\n                    if (options.shouldDismissSelfAsAdmin) {\n                        const meContact = window\n                            .require('WAWebContactCollection')\n                            .getMeContact();\n                        meContact &&\n                            (await window\n                                .require('WAWebNewsletterDemoteAdminJob')\n                                .demoteNewsletterAdminAction(\n                                    channel,\n                                    meContact,\n                                ));\n                    }\n                } catch (error) {\n                    return false;\n                }\n\n                return true;\n            },\n            channelId,\n            newOwnerId,\n            options,\n        );\n    }\n\n    /**\n     * Searches for channels based on search criteria, there are some notes:\n     * 1. The method finds only channels you are not subscribed to currently\n     * 2. If you have never been subscribed to a found channel\n     * or you have unsubscribed from it with {@link UnsubscribeOptions.deleteLocalModels} set to 'true',\n     * the lastMessage property of a found channel will be 'null'\n     *\n     * @param {Object} searchOptions Search options\n     * @param {string} [searchOptions.searchText = ''] Text to search\n     * @param {Array<string>} [searchOptions.countryCodes = [your local region]] Array of country codes in 'ISO 3166-1 alpha-2' standart (@see https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) to search for channels created in these countries\n     * @param {boolean} [searchOptions.skipSubscribedNewsletters = false] If true, channels that user is subscribed to won't appear in found channels\n     * @param {number} [searchOptions.view = 0] View type, makes sense only when the searchText is empty. Valid values to provide are:\n     * 0 for RECOMMENDED channels\n     * 1 for TRENDING channels\n     * 2 for POPULAR channels\n     * 3 for NEW channels\n     * @param {number} [searchOptions.limit = 50] The limit of found channels to be appear in the returnig result\n     * @returns {Promise<Array<Channel>>} Returns an array of Channel objects or an empty array if no channels were found\n     */\n    async searchChannels(searchOptions = {}) {\n        return await this.pupPage.evaluate(\n            async ({\n                searchText = '',\n                countryCodes = [],\n                skipSubscribedNewsletters = false,\n                view = 0,\n                limit = 50,\n            }) => {\n                searchText = searchText.trim();\n                const currentRegion = window.require('WAWebL10N').getRegion();\n                if (countryCodes.length === 0) countryCodes[0] = currentRegion;\n                if (![0, 1, 2, 3].includes(view)) view = 0;\n\n                const { countryCodesIso } = window.require(\n                    'WAWebCountriesNativeCountryNames',\n                );\n\n                countryCodes =\n                    countryCodes.length === 1 &&\n                    countryCodes[0] === currentRegion\n                        ? countryCodes\n                        : countryCodes.filter((code) =>\n                              Object.keys(countryCodesIso).includes(code),\n                          );\n\n                const viewTypeMapping = {\n                    0: 'RECOMMENDED',\n                    1: 'TRENDING',\n                    2: 'POPULAR',\n                    3: 'NEW',\n                };\n\n                searchOptions = {\n                    searchText: searchText,\n                    countryCodes: countryCodes,\n                    skipSubscribedNewsletters: skipSubscribedNewsletters,\n                    view: viewTypeMapping[view],\n                    categories: [],\n                    cursorToken: '',\n                };\n\n                const originalFunction = window.require(\n                    'WAWebNewsletterGatingUtils',\n                ).getNewsletterDirectoryPageSize;\n                limit !== 50 &&\n                    (window.require(\n                        'WAWebNewsletterGatingUtils',\n                    ).getNewsletterDirectoryPageSize = () => limit);\n\n                const channels = (\n                    await window\n                        .require('WAWebNewsletterDirectorySearchAction')\n                        .fetchNewsletterDirectories(searchOptions)\n                ).newsletters;\n\n                limit !== 50 &&\n                    (window.require(\n                        'WAWebNewsletterGatingUtils',\n                    ).getNewsletterDirectoryPageSize = originalFunction);\n\n                return channels\n                    ? await Promise.all(\n                          channels.map((channel) =>\n                              window.WWebJS.getChatModel(channel, {\n                                  isChannel: true,\n                              }),\n                          ),\n                      )\n                    : [];\n            },\n            searchOptions,\n        );\n    }\n\n    /**\n     * Deletes the channel you created\n     * @param {string} channelId The ID of a channel to delete\n     * @returns {Promise<boolean>} Returns true if the operation completed successfully, false otherwise\n     */\n    async deleteChannel(channelId) {\n        return await this.pupPage.evaluate(async (channelId) => {\n            const channel = await window.WWebJS.getChat(channelId, {\n                getAsModel: false,\n            });\n            if (!channel) return false;\n            try {\n                await window\n                    .require('WAWebNewsletterDeleteAction')\n                    .deleteNewsletterAction(channel);\n                return true;\n            } catch (err) {\n                if (err.name === 'ServerStatusCodeError') return false;\n                throw err;\n            }\n        }, channelId);\n    }\n\n    /**\n     * Get all current Labels\n     * @returns {Promise<Array<Label>>}\n     */\n    async getLabels() {\n        const labels = await this.pupPage.evaluate(async () => {\n            return window.WWebJS.getLabels();\n        });\n\n        return labels.map((data) => new Label(this, data));\n    }\n\n    /**\n     * Get all current Broadcast\n     * @returns {Promise<Array<Broadcast>>}\n     */\n    async getBroadcasts() {\n        const broadcasts = await this.pupPage.evaluate(async () => {\n            return window.WWebJS.getAllStatuses();\n        });\n        return broadcasts.map((data) => new Broadcast(this, data));\n    }\n\n    /**\n     * Get broadcast instance by current user ID\n     * @param {string} contactId\n     * @returns {Promise<Broadcast>}\n     */\n    async getBroadcastById(contactId) {\n        const broadcast = await this.pupPage.evaluate(async (userId) => {\n            let status;\n            try {\n                status = window.require('WAWebCollections').Status.get(userId);\n                if (!status) {\n                    status = await window\n                        .require('WAWebCollections')\n                        .Status.find(userId);\n                }\n            } catch {\n                status = null;\n            }\n\n            if (status) return window.WWebJS.getStatusModel(status);\n        }, contactId);\n        return new Broadcast(this, broadcast);\n    }\n\n    /**\n     * Revoke current own status messages\n     * @param {string} messageId\n     * @returns {Promise<void>}\n     */\n    async revokeStatusMessage(messageId) {\n        return await this.pupPage.evaluate(async (msgId) => {\n            const status = window\n                .require('WAWebCollections')\n                .Status.getMyStatus();\n            if (!status) return;\n\n            const msg =\n                window.require('WAWebCollections').Msg.get(msgId) ||\n                (\n                    await window\n                        .require('WAWebCollections')\n                        .Msg.getMessagesById([msgId])\n                )?.messages?.[0];\n            if (!msg) return;\n\n            if (!msg.id.fromMe || !msg.id.remote.isStatus())\n                throw 'Invalid usage! Can only revoke the message its from own status broadcast';\n\n            return await window\n                .require('WAWebRevokeStatusAction')\n                .sendStatusRevokeMsgAction(status, msg);\n        }, messageId);\n    }\n\n    /**\n     * Get Label instance by ID\n     * @param {string} labelId\n     * @returns {Promise<Label>}\n     */\n    async getLabelById(labelId) {\n        const label = await this.pupPage.evaluate(async (labelId) => {\n            return window.WWebJS.getLabel(labelId);\n        }, labelId);\n\n        return new Label(this, label);\n    }\n\n    /**\n     * Get all Labels assigned to a chat\n     * @param {string} chatId\n     * @returns {Promise<Array<Label>>}\n     */\n    async getChatLabels(chatId) {\n        const labels = await this.pupPage.evaluate(async (chatId) => {\n            return window.WWebJS.getChatLabels(chatId);\n        }, chatId);\n\n        return labels.map((data) => new Label(this, data));\n    }\n\n    /**\n     * Get all Chats for a specific Label\n     * @param {string} labelId\n     * @returns {Promise<Array<Chat>>}\n     */\n    async getChatsByLabelId(labelId) {\n        const chatIds = await this.pupPage.evaluate(async (labelId) => {\n            const label = window.require('WAWebCollections').Label.get(labelId);\n            const labelItems = label.labelItemCollection.getModelsArray();\n            return labelItems.reduce((result, item) => {\n                if (item.parentType === 'Chat') {\n                    result.push(item.parentId);\n                }\n                return result;\n            }, []);\n        }, labelId);\n\n        return Promise.all(chatIds.map((id) => this.getChatById(id)));\n    }\n\n    /**\n     * Gets all blocked contacts by host account\n     * @returns {Promise<Array<Contact>>}\n     */\n    async getBlockedContacts() {\n        const blockedContacts = await this.pupPage.evaluate(() => {\n            let chatIds = window\n                .require('WAWebCollections')\n                .Blocklist.getModelsArray()\n                .map((a) => a.id._serialized);\n            return Promise.all(\n                chatIds.map((id) => window.WWebJS.getContact(id)),\n            );\n        });\n\n        return blockedContacts.map((contact) =>\n            ContactFactory.create(this.client, contact),\n        );\n    }\n\n    /**\n     * Sets the current user's profile picture.\n     * @param {MessageMedia} media\n     * @returns {Promise<boolean>} Returns true if the picture was properly updated.\n     */\n    async setProfilePicture(media) {\n        const success = await this.pupPage.evaluate(\n            (chatid, media) => {\n                return window.WWebJS.setPicture(chatid, media);\n            },\n            this.info.wid._serialized,\n            media,\n        );\n\n        return success;\n    }\n\n    /**\n     * Deletes the current user's profile picture.\n     * @returns {Promise<boolean>} Returns true if the picture was properly deleted.\n     */\n    async deleteProfilePicture() {\n        const success = await this.pupPage.evaluate((chatid) => {\n            return window.WWebJS.deletePicture(chatid);\n        }, this.info.wid._serialized);\n\n        return success;\n    }\n\n    /**\n     * Change labels in chats\n     * @param {Array<number|string>} labelIds\n     * @param {Array<string>} chatIds\n     * @returns {Promise<void>}\n     */\n    async addOrRemoveLabels(labelIds, chatIds) {\n        return this.pupPage.evaluate(\n            async (labelIds, chatIds) => {\n                if (\n                    ['smba', 'smbi'].indexOf(\n                        window.require('WAWebConnModel').Conn.platform,\n                    ) === -1\n                ) {\n                    throw '[LT01] Only Whatsapp business';\n                }\n                const labels = window.WWebJS.getLabels().filter(\n                    (e) => labelIds.find((l) => l == e.id) !== undefined,\n                );\n                const chats = window\n                    .require('WAWebCollections')\n                    .Chat.filter((e) => chatIds.includes(e.id._serialized));\n\n                let actions = labels.map((label) => ({\n                    id: label.id,\n                    type: 'add',\n                }));\n\n                chats.forEach((chat) => {\n                    (chat.labels || []).forEach((n) => {\n                        if (!actions.find((e) => e.id == n)) {\n                            actions.push({ id: n, type: 'remove' });\n                        }\n                    });\n                });\n\n                return await window\n                    .require('WAWebCollections')\n                    .Label.addOrRemoveLabels(actions, chats);\n            },\n            labelIds,\n            chatIds,\n        );\n    }\n\n    /**\n     * An object that handles the information about the group membership request\n     * @typedef {Object} GroupMembershipRequest\n     * @property {Object} id The wid of a user who requests to enter the group\n     * @property {Object} addedBy The wid of a user who created that request\n     * @property {Object|null} parentGroupId The wid of a community parent group to which the current group is linked\n     * @property {string} requestMethod The method used to create the request: NonAdminAdd/InviteLink/LinkedGroupJoin\n     * @property {number} t The timestamp the request was created at\n     */\n\n    /**\n     * Gets an array of membership requests\n     * @param {string} groupId The ID of a group to get membership requests for\n     * @returns {Promise<Array<GroupMembershipRequest>>} An array of membership requests\n     */\n    async getGroupMembershipRequests(groupId) {\n        return await this.pupPage.evaluate(async (groupId) => {\n            const groupWid = window\n                .require('WAWebWidFactory')\n                .createWid(groupId);\n            return await window\n                .require('WAWebApiMembershipApprovalRequestStore')\n                .getMembershipApprovalRequests(groupWid);\n        }, groupId);\n    }\n\n    /**\n     * An object that handles the result for membership request action\n     * @typedef {Object} MembershipRequestActionResult\n     * @property {string} requesterId User ID whos membership request was approved/rejected\n     * @property {number|undefined} error An error code that occurred during the operation for the participant\n     * @property {string} message A message with a result of membership request action\n     */\n\n    /**\n     * An object that handles options for {@link approveGroupMembershipRequests} and {@link rejectGroupMembershipRequests} methods\n     * @typedef {Object} MembershipRequestActionOptions\n     * @property {Array<string>|string|null} requesterIds User ID/s who requested to join the group, if no value is provided, the method will search for all membership requests for that group\n     * @property {Array<number>|number|null} sleep The number of milliseconds to wait before performing an operation for the next requester. If it is an array, a random sleep time between the sleep[0] and sleep[1] values will be added (the difference must be >=100 ms, otherwise, a random sleep time between sleep[1] and sleep[1] + 100 will be added). If sleep is a number, a sleep time equal to its value will be added. By default, sleep is an array with a value of [250, 500]\n     */\n\n    /**\n     * Approves membership requests if any\n     * @param {string} groupId The group ID to get the membership request for\n     * @param {MembershipRequestActionOptions} options Options for performing a membership request action\n     * @returns {Promise<Array<MembershipRequestActionResult>>} Returns an array of requester IDs whose membership requests were approved and an error for each requester, if any occurred during the operation. If there are no requests, an empty array will be returned\n     */\n    async approveGroupMembershipRequests(groupId, options = {}) {\n        return await this.pupPage.evaluate(\n            async (groupId, options) => {\n                const { requesterIds = null, sleep = [250, 500] } = options;\n                return await window.WWebJS.membershipRequestAction(\n                    groupId,\n                    'Approve',\n                    requesterIds,\n                    sleep,\n                );\n            },\n            groupId,\n            options,\n        );\n    }\n\n    /**\n     * Rejects membership requests if any\n     * @param {string} groupId The group ID to get the membership request for\n     * @param {MembershipRequestActionOptions} options Options for performing a membership request action\n     * @returns {Promise<Array<MembershipRequestActionResult>>} Returns an array of requester IDs whose membership requests were rejected and an error for each requester, if any occurred during the operation. If there are no requests, an empty array will be returned\n     */\n    async rejectGroupMembershipRequests(groupId, options = {}) {\n        return await this.pupPage.evaluate(\n            async (groupId, options) => {\n                const { requesterIds = null, sleep = [250, 500] } = options;\n                return await window.WWebJS.membershipRequestAction(\n                    groupId,\n                    'Reject',\n                    requesterIds,\n                    sleep,\n                );\n            },\n            groupId,\n            options,\n        );\n    }\n\n    /**\n     * Setting  autoload download audio\n     * @param {boolean} flag true/false\n     */\n    async setAutoDownloadAudio(flag) {\n        await this.pupPage.evaluate(async (flag) => {\n            const autoDownload = window\n                .require('WAWebUserPrefsGeneral')\n                .getAutoDownloadAudio();\n            if (autoDownload === flag) {\n                return flag;\n            }\n            await window\n                .require('WAWebUserPrefsGeneral')\n                .setAutoDownloadAudio(flag);\n            return flag;\n        }, flag);\n    }\n\n    /**\n     * Setting  autoload download documents\n     * @param {boolean} flag true/false\n     */\n    async setAutoDownloadDocuments(flag) {\n        await this.pupPage.evaluate(async (flag) => {\n            const autoDownload = window\n                .require('WAWebUserPrefsGeneral')\n                .getAutoDownloadDocuments();\n            if (autoDownload === flag) {\n                return flag;\n            }\n            await window\n                .require('WAWebUserPrefsGeneral')\n                .setAutoDownloadDocuments(flag);\n            return flag;\n        }, flag);\n    }\n\n    /**\n     * Setting  autoload download photos\n     * @param {boolean} flag true/false\n     */\n    async setAutoDownloadPhotos(flag) {\n        await this.pupPage.evaluate(async (flag) => {\n            const autoDownload = window\n                .require('WAWebUserPrefsGeneral')\n                .getAutoDownloadPhotos();\n            if (autoDownload === flag) {\n                return flag;\n            }\n            await window\n                .require('WAWebUserPrefsGeneral')\n                .setAutoDownloadPhotos(flag);\n            return flag;\n        }, flag);\n    }\n\n    /**\n     * Setting  autoload download videos\n     * @param {boolean} flag true/false\n     */\n    async setAutoDownloadVideos(flag) {\n        await this.pupPage.evaluate(async (flag) => {\n            const autoDownload = window\n                .require('WAWebUserPrefsGeneral')\n                .getAutoDownloadVideos();\n            if (autoDownload === flag) {\n                return flag;\n            }\n            await window\n                .require('WAWebUserPrefsGeneral')\n                .setAutoDownloadVideos(flag);\n            return flag;\n        }, flag);\n    }\n\n    /**\n     * Setting background synchronization.\n     * NOTE: this action will take effect after you restart the client.\n     * @param {boolean} flag true/false\n     * @returns {Promise<boolean>}\n     */\n    async setBackgroundSync(flag) {\n        return await this.pupPage.evaluate(async (flag) => {\n            const backSync = window\n                .require('WAWebUserPrefsNotifications')\n                .getGlobalOfflineNotifications();\n            if (backSync === flag) {\n                return flag;\n            }\n            await window\n                .require('WAWebUserPrefsNotifications')\n                .setGlobalOfflineNotifications(flag);\n            return flag;\n        }, flag);\n    }\n\n    /**\n     * Get user device count by ID\n     * Each WaWeb Connection counts as one device, and the phone (if exists) counts as one\n     * So for a non-enterprise user with one WaWeb connection it should return \"2\"\n     * @param {string} userId\n     * @returns {Promise<number>}\n     */\n    async getContactDeviceCount(userId) {\n        return await this.pupPage.evaluate(async (userId) => {\n            const devices = await window\n                .require('WAWebApiDeviceList')\n                .getDeviceIds([\n                    window.require('WAWebWidFactory').createWid(userId),\n                ]);\n            if (\n                devices &&\n                devices.length &&\n                devices[0] != null &&\n                typeof devices[0].devices == 'object'\n            ) {\n                return devices[0].devices.length;\n            }\n            return 0;\n        }, userId);\n    }\n\n    /**\n     * Sync chat history conversation\n     * @param {string} chatId\n     * @return {Promise<boolean>} True if operation completed successfully, false otherwise.\n     */\n    async syncHistory(chatId) {\n        return await this.pupPage.evaluate(async (chatId) => {\n            const chatWid = window.require('WAWebWidFactory').createWid(chatId);\n            const chat =\n                window.require('WAWebCollections').Chat.get(chatWid) ??\n                (await window.require('WAWebCollections').Chat.find(chatWid));\n            if (chat?.endOfHistoryTransferType === 0) {\n                await window\n                    .require('WAWebSendNonMessageDataRequest')\n                    .sendPeerDataOperationRequest(3, {\n                        chatId: chat.id,\n                    });\n                return true;\n            }\n            return false;\n        }, chatId);\n    }\n\n    /**\n     * Generates a WhatsApp call link (video call or voice call)\n     * @param {Date} startTime The start time of the call\n     * @param {string} callType The type of a WhatsApp call link to generate, valid values are: `video` | `voice`\n     * @returns {Promise<string>} The WhatsApp call link (https://call.whatsapp.com/video/XxXxXxXxXxXxXx) or an empty string if a generation failed.\n     */\n    async createCallLink(startTime, callType) {\n        if (!['video', 'voice'].includes(callType)) {\n            throw new (class CreateCallLinkError extends Error {\n                constructor(m) {\n                    super(m);\n                }\n            })(\n                \"Invalid 'callType' parameter value is provided. Valid values are: 'voice' | 'video'.\",\n            );\n        }\n\n        startTime = Math.floor(startTime.getTime() / 1000);\n\n        return await this.pupPage.evaluate(\n            async (startTimeTs, callType) => {\n                const response = await window\n                    .require('WAWebGenerateEventCallLink')\n                    .createEventCallLink(startTimeTs, callType);\n                return response ?? '';\n            },\n            startTime,\n            callType,\n        );\n    }\n\n    /**\n     * Sends a response to the scheduled event message, indicating whether a user is going to attend the event or not\n     * @param {number} response The response code to the scheduled event message. Valid values are: `0` for NONE response (removes a previous response) | `1` for GOING | `2` for NOT GOING | `3` for MAYBE going\n     * @param {string} eventMessageId The scheduled event message ID\n     * @returns {Promise<boolean>}\n     */\n    async sendResponseToScheduledEvent(response, eventMessageId) {\n        if (![0, 1, 2, 3].includes(response)) return false;\n\n        return await this.pupPage.evaluate(\n            async (response, msgId) => {\n                const eventMsg =\n                    window.require('WAWebCollections').Msg.get(msgId) ||\n                    (\n                        await window\n                            .require('WAWebCollections')\n                            .Msg.getMessagesById([msgId])\n                    )?.messages?.[0];\n                if (!eventMsg) return false;\n\n                await window\n                    .require('WAWebSendEventResponseMsgAction')\n                    .sendEventResponseMsg(response, eventMsg);\n                return true;\n            },\n            response,\n            eventMessageId,\n        );\n    }\n\n    /**\n     * Save new contact to user's addressbook or edit the existing one\n     * @param {string} phoneNumber The contact's phone number in a format \"17182222222\", where \"1\" is a country code\n     * @param {string} firstName\n     * @param {string} lastName\n     * @param {boolean} [syncToAddressbook = false] If set to true, the contact will also be saved to the user's address book on their phone. False by default\n     * @returns {Promise<void>}\n     */\n    async saveOrEditAddressbookContact(\n        phoneNumber,\n        firstName,\n        lastName,\n        syncToAddressbook = false,\n    ) {\n        return await this.pupPage.evaluate(\n            async (phoneNumber, firstName, lastName, syncToAddressbook) => {\n                return await window\n                    .require('WAWebSaveContactAction')\n                    .saveContactAction({\n                        firstName: firstName,\n                        lastName: lastName,\n                        phoneNumber: phoneNumber,\n                        prevPhoneNumber: phoneNumber,\n                        syncToAddressbook: syncToAddressbook,\n                        username: undefined,\n                    });\n            },\n            phoneNumber,\n            firstName,\n            lastName,\n            syncToAddressbook,\n        );\n    }\n\n    /**\n     * Deletes the contact from user's addressbook\n     * @param {string} phoneNumber The contact's phone number in a format \"17182222222\", where \"1\" is a country code\n     * @returns {Promise<void>}\n     */\n    async deleteAddressbookContact(phoneNumber) {\n        return await this.pupPage.evaluate(async (phoneNumber) => {\n            const wid = window\n                .require('WAWebWidFactory')\n                .createWid(phoneNumber);\n            return await window\n                .require('WAWebDeleteContactAction')\n                .deleteContactAction({ phoneNumber: wid });\n        }, phoneNumber);\n    }\n\n    /**\n     * Get lid and phone number for multiple users\n     * @param {string[]} userIds - Array of user IDs\n     * @returns {Promise<Array<{ lid: string, pn: string }>>}\n     */\n    async getContactLidAndPhone(userIds) {\n        return await this.pupPage.evaluate(async (userIds) => {\n            if (!Array.isArray(userIds)) userIds = [userIds];\n\n            return await Promise.all(\n                userIds.map(async (userId) => {\n                    const { lid, phone } =\n                        await window.WWebJS.enforceLidAndPnRetrieval(userId);\n\n                    return {\n                        lid: lid?._serialized,\n                        pn: phone?._serialized,\n                    };\n                }),\n            );\n        }, userIds);\n    }\n\n    /**\n     * Add or edit a customer note\n     * @see https://faq.whatsapp.com/1433099287594476\n     * @param {string} userId The ID of a customer to add a note to\n     * @param {string} note The note to add\n     * @returns {Promise<void>}\n     */\n    async addOrEditCustomerNote(userId, note) {\n        return await this.pupPage.evaluate(\n            async (userId, note) => {\n                if (!window.require('WAWebBizGatingUtils').smbNotesV1Enabled())\n                    return;\n\n                return window\n                    .require('WAWebNoteAction')\n                    .noteAddAction(\n                        'unstructured',\n                        window\n                            .require('WAWebWidToJid')\n                            .widToUserJid(\n                                window\n                                    .require('WAWebWidFactory')\n                                    .createWid(userId),\n                            ),\n                        note,\n                    );\n            },\n            userId,\n            note,\n        );\n    }\n\n    /**\n     * Get a customer note\n     * @see https://faq.whatsapp.com/1433099287594476\n     * @param {string} userId The ID of a customer to get a note from\n     * @returns {Promise<{\n     *    chatId: string,\n     *    content: string,\n     *    createdAt: number,\n     *    id: string,\n     *    modifiedAt: number,\n     *    type: string\n     * }>}\n     */\n    async getCustomerNote(userId) {\n        return await this.pupPage.evaluate(async (userId) => {\n            if (!window.require('WAWebBizGatingUtils').smbNotesV1Enabled())\n                return null;\n\n            const note = await window\n                .require('WAWebNoteAction')\n                .retrieveOnlyNoteForChatJid(\n                    window\n                        .require('WAWebWidToJid')\n                        .widToUserJid(\n                            window.require('WAWebWidFactory').createWid(userId),\n                        ),\n                );\n\n            let serialized = note?.serialize();\n\n            if (!serialized) return null;\n\n            serialized.chatId = window\n                .require('WAWebJidToWid')\n                .userJidToUserWid(serialized.chatJid)._serialized;\n            delete serialized.chatJid;\n\n            return serialized;\n        }, userId);\n    }\n\n    /**\n     * Get Poll Votes\n     * @param {string} messageId\n     * @return {Promise<Array<PollVote>>}\n     */\n    async getPollVotes(messageId) {\n        const msg = await this.getMessageById(messageId);\n        if (!msg) return [];\n        if (msg.type != MessageTypes.POLL_CREATION)\n            throw 'Invalid usage! Can only be used with a pollCreation message';\n\n        const pollVotes = await this.pupPage.evaluate(async (msg) => {\n            const msgKey = window\n                .require('WAWebMsgKey')\n                .fromString(msg.id._serialized);\n            let pollVotes = await window\n                .require('WAWebPollsVotesSchema')\n                .getTable()\n                .equals(['parentMsgKey'], msgKey.toString());\n\n            return pollVotes.map((item) => {\n                const typedArray = new Uint8Array(item.selectedOptionLocalIds);\n                return {\n                    ...item,\n                    selectedOptionLocalIds: Array.from(typedArray),\n                };\n            });\n        }, msg);\n\n        return pollVotes.map(\n            (pollVote) =>\n                new PollVote(this.client, { ...pollVote, parentMessage: msg }),\n        );\n    }\n}\n\nmodule.exports = Client;\n"
  },
  {
    "path": "src/authStrategies/BaseAuthStrategy.js",
    "content": "'use strict';\n\n/**\n * Base class which all authentication strategies extend\n */\nclass BaseAuthStrategy {\n    constructor() {}\n    setup(client) {\n        this.client = client;\n    }\n    async beforeBrowserInitialized() {}\n    async afterBrowserInitialized() {}\n    async onAuthenticationNeeded() {\n        return {\n            failed: false,\n            restart: false,\n            failureEventPayload: undefined,\n        };\n    }\n    async getAuthEventPayload() {}\n    async afterAuthReady() {}\n    async disconnect() {}\n    async destroy() {}\n    async logout() {}\n}\n\nmodule.exports = BaseAuthStrategy;\n"
  },
  {
    "path": "src/authStrategies/LocalAuth.js",
    "content": "'use strict';\n\nconst path = require('path');\nconst fs = require('fs');\nconst BaseAuthStrategy = require('./BaseAuthStrategy');\n\n/**\n * Local directory-based authentication\n * @param {object} options - options\n * @param {string} options.clientId - Client id to distinguish instances if you are using multiple, otherwise keep null if you are using only one instance\n * @param {string} options.dataPath - Change the default path for saving session files, default is: \"./.wwebjs_auth/\"\n * @param {number} options.rmMaxRetries - Sets the maximum number of retries for removing the session directory\n */\nclass LocalAuth extends BaseAuthStrategy {\n    constructor({ clientId, dataPath, rmMaxRetries } = {}) {\n        super();\n\n        const idRegex = /^[-_\\w]+$/i;\n        if (clientId && !idRegex.test(clientId)) {\n            throw new Error(\n                'Invalid clientId. Only alphanumeric characters, underscores and hyphens are allowed.',\n            );\n        }\n\n        this.dataPath = path.resolve(dataPath || './.wwebjs_auth/');\n        this.clientId = clientId;\n        this.rmMaxRetries = rmMaxRetries ?? 4;\n    }\n\n    async beforeBrowserInitialized() {\n        const puppeteerOpts = this.client.options.puppeteer;\n        const sessionDirName = this.clientId\n            ? `session-${this.clientId}`\n            : 'session';\n        const dirPath = path.join(this.dataPath, sessionDirName);\n\n        if (\n            puppeteerOpts.userDataDir &&\n            puppeteerOpts.userDataDir !== dirPath\n        ) {\n            throw new Error(\n                'LocalAuth is not compatible with a user-supplied userDataDir.',\n            );\n        }\n\n        fs.mkdirSync(dirPath, { recursive: true });\n\n        this.client.options.puppeteer = {\n            ...puppeteerOpts,\n            userDataDir: dirPath,\n        };\n\n        this.userDataDir = dirPath;\n    }\n\n    async logout() {\n        if (this.userDataDir) {\n            await fs.promises\n                .rm(this.userDataDir, {\n                    recursive: true,\n                    force: true,\n                    maxRetries: this.rmMaxRetries,\n                })\n                .catch((e) => {\n                    throw new Error(e);\n                });\n        }\n    }\n}\n\nmodule.exports = LocalAuth;\n"
  },
  {
    "path": "src/authStrategies/NoAuth.js",
    "content": "'use strict';\n\nconst BaseAuthStrategy = require('./BaseAuthStrategy');\n\n/**\n * No session restoring functionality\n * Will need to authenticate via QR code every time\n */\nclass NoAuth extends BaseAuthStrategy {}\n\nmodule.exports = NoAuth;\n"
  },
  {
    "path": "src/authStrategies/RemoteAuth.js",
    "content": "'use strict';\n\n/* Require Optional Dependencies */\ntry {\n    var fs = require('fs-extra');\n    var unzipper = require('unzipper');\n    var archiver = require('archiver');\n} catch {\n    fs = undefined;\n    unzipper = undefined;\n    archiver = undefined;\n}\n\nconst path = require('path');\nconst { Events } = require('./../util/Constants');\nconst BaseAuthStrategy = require('./BaseAuthStrategy');\n\n/**\n * Remote-based authentication\n * @param {object} options - options\n * @param {object} options.store - Remote database store instance\n * @param {string} options.clientId - Client id to distinguish instances if you are using multiple, otherwise keep null if you are using only one instance\n * @param {string} options.dataPath - Change the default path for saving session files, default is: \"./.wwebjs_auth/\"\n * @param {number} options.backupSyncIntervalMs - Sets the time interval for periodic session backups. Accepts values starting from 60000ms {1 minute}\n * @param {number} options.rmMaxRetries - Sets the maximum number of retries for removing the session directory\n */\nclass RemoteAuth extends BaseAuthStrategy {\n    constructor({\n        clientId,\n        dataPath,\n        store,\n        backupSyncIntervalMs,\n        rmMaxRetries,\n    } = {}) {\n        if (!fs && !unzipper && !archiver)\n            throw new Error(\n                'Optional Dependencies [fs-extra, unzipper, archiver] are required to use RemoteAuth. Make sure to run npm install correctly and remove the --no-optional flag',\n            );\n        super();\n\n        const idRegex = /^[-_\\w]+$/i;\n        if (clientId && !idRegex.test(clientId)) {\n            throw new Error(\n                'Invalid clientId. Only alphanumeric characters, underscores and hyphens are allowed.',\n            );\n        }\n        if (!backupSyncIntervalMs || backupSyncIntervalMs < 60000) {\n            throw new Error(\n                'Invalid backupSyncIntervalMs. Accepts values starting from 60000ms {1 minute}.',\n            );\n        }\n        if (!store) throw new Error('Remote database store is required.');\n\n        this.store = store;\n        this.clientId = clientId;\n        this.backupSyncIntervalMs = backupSyncIntervalMs;\n        this.dataPath = path.resolve(dataPath || './.wwebjs_auth/');\n        this.tempDir = `${this.dataPath}/wwebjs_temp_session_${this.clientId}`;\n        this.requiredDirs = [\n            'Default',\n            'IndexedDB',\n            'Local Storage',\n        ]; /* => Required Files & Dirs in WWebJS to restore session */\n        this.rmMaxRetries = rmMaxRetries ?? 4;\n    }\n\n    async beforeBrowserInitialized() {\n        const puppeteerOpts = this.client.options.puppeteer;\n        const sessionDirName = this.clientId\n            ? `RemoteAuth-${this.clientId}`\n            : 'RemoteAuth';\n        const dirPath = path.join(this.dataPath, sessionDirName);\n\n        if (\n            puppeteerOpts.userDataDir &&\n            puppeteerOpts.userDataDir !== dirPath\n        ) {\n            throw new Error(\n                'RemoteAuth is not compatible with a user-supplied userDataDir.',\n            );\n        }\n\n        this.userDataDir = dirPath;\n        this.sessionName = sessionDirName;\n\n        await this.extractRemoteSession();\n\n        this.client.options.puppeteer = {\n            ...puppeteerOpts,\n            userDataDir: dirPath,\n        };\n    }\n\n    async logout() {\n        await this.disconnect();\n    }\n\n    async destroy() {\n        clearInterval(this.backupSync);\n    }\n\n    async disconnect() {\n        await this.deleteRemoteSession();\n\n        let pathExists = await this.isValidPath(this.userDataDir);\n        if (pathExists) {\n            await fs.promises\n                .rm(this.userDataDir, {\n                    recursive: true,\n                    force: true,\n                    maxRetries: this.rmMaxRetries,\n                })\n                .catch(() => {});\n        }\n        clearInterval(this.backupSync);\n    }\n\n    async afterAuthReady() {\n        const sessionExists = await this.store.sessionExists({\n            session: this.sessionName,\n        });\n        if (!sessionExists) {\n            await this.delay(\n                60000,\n            ); /* Initial delay sync required for session to be stable enough to recover */\n            await this.storeRemoteSession({ emit: true });\n        }\n        var self = this;\n        this.backupSync = setInterval(async function () {\n            await self.storeRemoteSession();\n        }, this.backupSyncIntervalMs);\n    }\n\n    async storeRemoteSession(options) {\n        const pathExists = await this.isValidPath(this.userDataDir);\n        if (!pathExists) return;\n\n        let compressedSessionPath;\n        try {\n            compressedSessionPath = await this.compressSession();\n            await this.store.save({\n                session: path.join(this.dataPath, this.sessionName),\n            });\n            if (options && options.emit)\n                this.client.emit(Events.REMOTE_SESSION_SAVED);\n        } finally {\n            const paths = [\n                this.tempDir,\n                ...(compressedSessionPath ? [compressedSessionPath] : []),\n            ];\n            await Promise.allSettled(\n                paths.map((p) =>\n                    fs.promises.rm(p, {\n                        recursive: true,\n                        force: true,\n                        maxRetries: this.rmMaxRetries,\n                    }),\n                ),\n            );\n        }\n    }\n\n    async extractRemoteSession() {\n        const pathExists = await this.isValidPath(this.userDataDir);\n        const compressedSessionPath = path.join(\n            this.dataPath,\n            `${this.sessionName}.zip`,\n        );\n        const sessionExists = await this.store.sessionExists({\n            session: this.sessionName,\n        });\n        if (pathExists) {\n            await fs.promises\n                .rm(this.userDataDir, {\n                    recursive: true,\n                    force: true,\n                    maxRetries: this.rmMaxRetries,\n                })\n                .catch(() => {});\n        }\n        if (sessionExists) {\n            await this.store.extract({\n                session: this.sessionName,\n                path: compressedSessionPath,\n            });\n            await this.unCompressSession(compressedSessionPath);\n        } else {\n            fs.mkdirSync(this.userDataDir, { recursive: true });\n        }\n    }\n\n    async deleteRemoteSession() {\n        const sessionExists = await this.store.sessionExists({\n            session: this.sessionName,\n        });\n        if (sessionExists)\n            await this.store.delete({ session: this.sessionName });\n    }\n\n    async compressSession() {\n        const stageDefaultPath = path.join(this.tempDir, 'Default');\n        const userDataDefaultPath = path.join(this.userDataDir, 'Default');\n\n        await fs.emptyDir(stageDefaultPath);\n        await this.copyByRequiredDirs(userDataDefaultPath, stageDefaultPath);\n\n        const archive = archiver('zip');\n        const outPath = path.join(this.dataPath, `${this.sessionName}.zip`);\n        const out = fs.createWriteStream(outPath);\n\n        await new Promise((resolve, reject) => {\n            out.once('close', resolve);\n            out.once('error', reject);\n            archive.once('error', reject);\n\n            archive.pipe(out);\n            archive.directory(this.tempDir, false);\n            archive.finalize();\n        });\n        return outPath;\n    }\n\n    async unCompressSession(compressedSessionPath) {\n        var stream = fs.createReadStream(compressedSessionPath);\n        await new Promise((resolve, reject) => {\n            stream\n                .pipe(\n                    unzipper.Extract({\n                        path: this.userDataDir,\n                        concurrency: 10,\n                    }),\n                )\n                .on('error', (err) => reject(err))\n                .on('finish', () => resolve());\n        });\n        await fs.promises.unlink(compressedSessionPath);\n    }\n\n    async copyByRequiredDirs(from, to) {\n        for (const d of this.requiredDirs) {\n            const src = path.join(from, d);\n            if (await this.isValidPath(src)) {\n                const dest = path.join(to, path.basename(src));\n                await fs.promises.cp(src, dest, {\n                    recursive: true,\n                    force: true,\n                    errorOnExist: false,\n                });\n            }\n        }\n    }\n\n    async isValidPath(path) {\n        try {\n            await fs.promises.access(path);\n            return true;\n        } catch {\n            return false;\n        }\n    }\n\n    async delay(ms) {\n        return new Promise((resolve) => setTimeout(resolve, ms));\n    }\n}\n\nmodule.exports = RemoteAuth;\n"
  },
  {
    "path": "src/factories/ChatFactory.js",
    "content": "'use strict';\n\nconst PrivateChat = require('../structures/PrivateChat');\nconst GroupChat = require('../structures/GroupChat');\nconst Channel = require('../structures/Channel');\n\nclass ChatFactory {\n    static create(client, data) {\n        if (data.isGroup) {\n            return new GroupChat(client, data);\n        }\n\n        if (data.isChannel) {\n            return new Channel(client, data);\n        }\n\n        return new PrivateChat(client, data);\n    }\n}\n\nmodule.exports = ChatFactory;\n"
  },
  {
    "path": "src/factories/ContactFactory.js",
    "content": "'use strict';\n\nconst PrivateContact = require('../structures/PrivateContact');\nconst BusinessContact = require('../structures/BusinessContact');\n\nclass ContactFactory {\n    static create(client, data) {\n        if (data.isBusiness) {\n            return new BusinessContact(client, data);\n        }\n\n        return new PrivateContact(client, data);\n    }\n}\n\nmodule.exports = ContactFactory;\n"
  },
  {
    "path": "src/structures/Base.js",
    "content": "'use strict';\n\n/**\n * Represents a WhatsApp data structure\n */\nclass Base {\n    constructor(client) {\n        /**\n         * The client that instantiated this\n         * @readonly\n         */\n        Object.defineProperty(this, 'client', { value: client });\n    }\n\n    _clone() {\n        return Object.assign(Object.create(this), this);\n    }\n\n    _patch(data) {\n        return data;\n    }\n}\n\nmodule.exports = Base;\n"
  },
  {
    "path": "src/structures/Broadcast.js",
    "content": "'use strict';\n\nconst Base = require('./Base');\nconst Message = require('./Message');\n\n/**\n * Represents a Status/Story on WhatsApp\n * @extends {Base}\n */\nclass Broadcast extends Base {\n    constructor(client, data) {\n        super(client);\n\n        if (data) this._patch(data);\n    }\n\n    _patch(data) {\n        /**\n         * ID that represents the chat\n         * @type {object}\n         */\n        this.id = data.id;\n\n        /**\n         * Unix timestamp of last status\n         * @type {number}\n         */\n        this.timestamp = data.t;\n\n        /**\n         * Number of available statuses\n         * @type {number}\n         */\n        this.totalCount = data.totalCount;\n\n        /**\n         * Number of not viewed\n         * @type {number}\n         */\n        this.unreadCount = data.unreadCount;\n\n        /**\n         * Messages statuses\n         * @type {Message[]}\n         */\n        this.msgs = data.msgs?.map((msg) => new Message(this.client, msg));\n\n        return super._patch(data);\n    }\n\n    /**\n     * Returns the Chat this message was sent in\n     * @returns {Promise<Chat>}\n     */\n    getChat() {\n        return this.client.getChatById(this.id._serialized);\n    }\n\n    /**\n     * Returns the Contact this message was sent from\n     * @returns {Promise<Contact>}\n     */\n    getContact() {\n        return this.client.getContactById(this.id._serialized);\n    }\n}\n\nmodule.exports = Broadcast;\n"
  },
  {
    "path": "src/structures/BusinessContact.js",
    "content": "'use strict';\n\nconst Contact = require('./Contact');\n\n/**\n * Represents a Business Contact on WhatsApp\n * @extends {Contact}\n */\nclass BusinessContact extends Contact {\n    _patch(data) {\n        /**\n         * The contact's business profile\n         */\n        this.businessProfile = data.businessProfile;\n\n        return super._patch(data);\n    }\n}\n\nmodule.exports = BusinessContact;\n"
  },
  {
    "path": "src/structures/Buttons.js",
    "content": "'use strict';\n\nconst MessageMedia = require('./MessageMedia');\nconst Util = require('../util/Util');\n\n/**\n * Button spec used in Buttons constructor\n * @typedef {Object} ButtonSpec\n * @property {string=} id - Custom ID to set on the button. A random one will be generated if one is not passed.\n * @property {string} body - The text to show on the button.\n */\n\n/**\n * @typedef {Object} FormattedButtonSpec\n * @property {string} buttonId\n * @property {number} type\n * @property {Object} buttonText\n */\n\n/**\n * Message type buttons\n */\nclass Buttons {\n    /**\n     * @param {string|MessageMedia} body\n     * @param {ButtonSpec[]} buttons - See {@link ButtonSpec}\n     * @param {string?} title\n     * @param {string?} footer\n     */\n    constructor(body, buttons, title, footer) {\n        /**\n         * Message body\n         * @type {string|MessageMedia}\n         */\n        this.body = body;\n\n        /**\n         * title of message\n         * @type {string}\n         */\n        this.title = title;\n\n        /**\n         * footer of message\n         * @type {string}\n         */\n        this.footer = footer;\n\n        if (body instanceof MessageMedia) {\n            this.type = 'media';\n            this.title = '';\n        } else {\n            this.type = 'chat';\n        }\n\n        /**\n         * buttons of message\n         * @type {FormattedButtonSpec[]}\n         */\n        this.buttons = this._format(buttons);\n        if (!this.buttons.length) {\n            throw '[BT01] No buttons';\n        }\n    }\n\n    /**\n     * Creates button array from simple array\n     * @param {ButtonSpec[]} buttons\n     * @returns {FormattedButtonSpec[]}\n     * @example\n     * Input: [{id:'customId',body:'button1'},{body:'button2'},{body:'button3'},{body:'button4'}]\n     * Returns: [{ buttonId:'customId',buttonText:{'displayText':'button1'},type: 1 },{buttonId:'n3XKsL',buttonText:{'displayText':'button2'},type:1},{buttonId:'NDJk0a',buttonText:{'displayText':'button3'},type:1}]\n     */\n    _format(buttons) {\n        buttons = buttons.slice(0, 3); // phone users can only see 3 buttons, so lets limit this\n        return buttons.map((btn) => {\n            return {\n                buttonId: btn.id ? String(btn.id) : Util.generateHash(6),\n                buttonText: { displayText: btn.body },\n                type: 1,\n            };\n        });\n    }\n}\n\nmodule.exports = Buttons;\n"
  },
  {
    "path": "src/structures/Call.js",
    "content": "'use strict';\n\nconst Base = require('./Base');\n\n/**\n * Represents a Call on WhatsApp\n * @extends {Base}\n */\nclass Call extends Base {\n    constructor(client, data) {\n        super(client);\n\n        if (data) this._patch(data);\n    }\n\n    _patch(data) {\n        /**\n         * Call ID\n         * @type {string}\n         */\n        this.id = data.id;\n        /**\n         * From\n         * @type {string}\n         */\n        this.from = data.peerJid;\n        /**\n         * Unix timestamp for when the call was created\n         * @type {number}\n         */\n        this.timestamp = data.offerTime;\n        /**\n         * Is video\n         * @type {boolean}\n         */\n        this.isVideo = data.isVideo;\n        /**\n         * Is Group\n         * @type {boolean}\n         */\n        this.isGroup = data.isGroup;\n        /**\n         * Indicates if the call was sent by the current user\n         * @type {boolean}\n         */\n        this.fromMe = data.outgoing;\n        /**\n         * Indicates if the call can be handled in waweb\n         * @type {boolean}\n         */\n        this.canHandleLocally = data.canHandleLocally;\n        /**\n         * Indicates if the call Should be handled in waweb\n         * @type {boolean}\n         */\n        this.webClientShouldHandle = data.webClientShouldHandle;\n        /**\n         * Object with participants\n         * @type {object}\n         */\n        this.participants = data.participants;\n\n        return super._patch(data);\n    }\n\n    /**\n     * Reject the call\n     */\n    async reject() {\n        return this.client.pupPage.evaluate(\n            (peerJid, id) => {\n                return window.WWebJS.rejectCall(peerJid, id);\n            },\n            this.from,\n            this.id,\n        );\n    }\n}\n\nmodule.exports = Call;\n"
  },
  {
    "path": "src/structures/Channel.js",
    "content": "'use strict';\n\nconst Base = require('./Base');\nconst Message = require('./Message');\n\n/**\n * Channel ID structure\n * @typedef {Object} ChannelId\n * @property {string} server\n * @property {string} user\n * @property {string} _serialized\n */\n\n/**\n * Represents a Channel on WhatsApp\n * @extends {Base}\n */\nclass Channel extends Base {\n    constructor(client, data) {\n        super(client);\n\n        if (data) this._patch(data);\n    }\n\n    _patch(data) {\n        this.channelMetadata = data.channelMetadata;\n\n        /**\n         * ID that represents the channel\n         * @type {ChannelId}\n         */\n        this.id = data.id;\n\n        /**\n         * Title of the channel\n         * @type {string}\n         */\n        this.name = data.name;\n\n        /**\n         * The channel description\n         * @type {string}\n         */\n        this.description = data.channelMetadata.description;\n\n        /**\n         * Indicates if it is a Channel\n         * @type {boolean}\n         */\n        this.isChannel = data.isChannel;\n\n        /**\n         * Indicates if it is a Group\n         * @type {boolean}\n         */\n        this.isGroup = data.isGroup;\n\n        /**\n         * Indicates if the channel is readonly\n         * @type {boolean}\n         */\n        this.isReadOnly = data.isReadOnly;\n\n        /**\n         * Amount of messages unread\n         * @type {number}\n         */\n        this.unreadCount = data.unreadCount;\n\n        /**\n         * Unix timestamp for when the last activity occurred\n         * @type {number}\n         */\n        this.timestamp = data.t;\n\n        /**\n         * Indicates if the channel is muted or not\n         * @type {boolean}\n         */\n        this.isMuted = data.isMuted;\n\n        /**\n         * Unix timestamp for when the mute expires\n         * @type {number}\n         */\n        this.muteExpiration = data.muteExpiration;\n\n        /**\n         * Last message in the channel\n         * @type {Message}\n         */\n        this.lastMessage = data.lastMessage\n            ? new Message(super.client, data.lastMessage)\n            : undefined;\n\n        return super._patch(data);\n    }\n\n    /**\n     * Gets the subscribers of the channel (only those who are in your contact list)\n     * @param {?number} limit Optional parameter to specify the limit of subscribers to retrieve\n     * @returns {Promise<Array<{contact: Contact, role: string}>>} Returns an array of objects that handle the subscribed contacts and their roles in the channel\n     */\n    async getSubscribers(limit) {\n        return await this.client.pupPage.evaluate(\n            async (channelId, limit) => {\n                const channel = await window.WWebJS.getChat(channelId, {\n                    getAsModel: false,\n                });\n                if (!channel) return [];\n                !limit &&\n                    (limit = window\n                        .require('WAWebNewsletterGatingUtils')\n                        .getMaxSubscriberNumber());\n                const response = await window\n                    .require('WAWebMexFetchNewsletterSubscribersJob')\n                    .mexFetchNewsletterSubscribers(channelId, limit);\n                const contacts = window\n                    .require('WAWebNewsletterSubscriberListAction')\n                    .getSubscribersInContacts(response.subscribers);\n                return Promise.all(\n                    contacts.map((obj) => ({\n                        ...obj,\n                        contact: window.WWebJS.getContactModel(obj.contact),\n                    })),\n                );\n            },\n            this.id._serialized,\n            limit,\n        );\n    }\n\n    /**\n     * Updates the channel subject\n     * @param {string} newSubject\n     * @returns {Promise<boolean>} Returns true if the subject was properly updated. This can return false if the user does not have the necessary permissions.\n     */\n    async setSubject(newSubject) {\n        const success = await this._setChannelMetadata(\n            { name: newSubject },\n            { editName: true },\n        );\n        success && (this.name = newSubject);\n        return success;\n    }\n\n    /**\n     * Updates the channel description\n     * @param {string} newDescription\n     * @returns {Promise<boolean>} Returns true if the operation completed successfully, false otherwise\n     */\n    async setDescription(newDescription) {\n        const success = await this._setChannelMetadata(\n            { description: newDescription },\n            { editDescription: true },\n        );\n        success && (this.description = newDescription);\n        return success;\n    }\n\n    /**\n     * Updates the channel profile picture\n     * @param {MessageMedia} newProfilePicture\n     * @returns {Promise<boolean>} Returns true if the operation completed successfully, false otherwise\n     */\n    async setProfilePicture(newProfilePicture) {\n        return await this._setChannelMetadata(\n            { picture: newProfilePicture },\n            { editPicture: true },\n        );\n    }\n\n    /**\n     * Updates available reactions to use in the channel\n     *\n     * Valid values for passing to the method are:\n     * 0 for NONE reactions to be avaliable\n     * 1 for BASIC reactions to be available: 👍, ❤️, 😂, 😮, 😢, 🙏\n     * 2 for ALL reactions to be available\n     * @param {number} reactionCode\n     * @returns {Promise<boolean>} Returns true if the operation completed successfully, false otherwise\n     */\n    async setReactionSetting(reactionCode) {\n        if (![0, 1, 2].includes(reactionCode)) return false;\n        const reactionMapper = {\n            0: 3,\n            1: 1,\n            2: 0,\n        };\n        const success = await this._setChannelMetadata(\n            { reactionCodesSetting: reactionMapper[reactionCode] },\n            { editReactionCodesSetting: true },\n        );\n        success && (this.channelMetadata.reactionCodesSetting = reactionCode);\n        return success;\n    }\n\n    /**\n     * Mutes the channel\n     * @returns {Promise<boolean>} Returns true if the operation completed successfully, false otherwise\n     */\n    async mute() {\n        const success = await this._muteUnmuteChannel('MUTE');\n        if (success) {\n            this.isMuted = true;\n            this.muteExpiration = -1;\n        }\n        return success;\n    }\n\n    /**\n     * Unmutes the channel\n     * @returns {Promise<boolean>} Returns true if the operation completed successfully, false otherwise\n     */\n    async unmute() {\n        const success = await this._muteUnmuteChannel('UNMUTE');\n        if (success) {\n            this.isMuted = false;\n            this.muteExpiration = 0;\n        }\n        return success;\n    }\n\n    /**\n     * Message options\n     * @typedef {Object} MessageSendOptions\n     * @property {?string} caption Image or video caption\n     * @property {?string[]} mentions User IDs of user that will be mentioned in the message\n     * @property {?MessageMedia} media Image or video to be sent\n     */\n\n    /**\n     * Sends a message to this channel\n     * @param {string|MessageMedia} content\n     * @param {?MessageSendOptions} options\n     * @returns {Promise<Message>} Message that was just sent\n     */\n    async sendMessage(content, options) {\n        return this.client.sendMessage(this.id._serialized, content, options);\n    }\n\n    /**\n     * Sets the channel as seen\n     * @returns {Promise<boolean>}\n     */\n    async sendSeen() {\n        return this.client.sendSeen(this.id._serialized);\n    }\n\n    /**\n     * @typedef {Object} SendChannelAdminInviteOptions\n     * @property {?string} comment The comment to be added to an invitation\n     */\n\n    /**\n     * Sends a channel admin invitation to a user, allowing them to become an admin of the channel\n     * @param {string} chatId The ID of a user to send the channel admin invitation to\n     * @param {SendChannelAdminInviteOptions} options\n     * @returns {Promise<boolean>} Returns true if an invitation was sent successfully, false otherwise\n     */\n    async sendChannelAdminInvite(chatId, options = {}) {\n        return this.client.sendChannelAdminInvite(\n            chatId,\n            this.id._serialized,\n            options,\n        );\n    }\n\n    /**\n     * Accepts a channel admin invitation and promotes the current user to a channel admin\n     * @returns {Promise<boolean>} Returns true if the operation completed successfully, false otherwise\n     */\n    async acceptChannelAdminInvite() {\n        return this.client.acceptChannelAdminInvite(this.id._serialized);\n    }\n\n    /**\n     * Revokes a channel admin invitation sent to a user by a channel owner\n     * @param {string} userId The user ID the invitation was sent to\n     * @returns {Promise<boolean>} Returns true if the operation completed successfully, false otherwise\n     */\n    async revokeChannelAdminInvite(userId) {\n        return this.client.revokeChannelAdminInvite(\n            this.id._serialized,\n            userId,\n        );\n    }\n\n    /**\n     * Demotes a channel admin to a regular subscriber (can be used also for self-demotion)\n     * @param {string} userId The user ID to demote\n     * @returns {Promise<boolean>} Returns true if the operation completed successfully, false otherwise\n     */\n    async demoteChannelAdmin(userId) {\n        return this.client.demoteChannelAdmin(this.id._serialized, userId);\n    }\n\n    /**\n     * Options for transferring a channel ownership to another user\n     * @typedef {Object} TransferChannelOwnershipOptions\n     * @property {boolean} [shouldDismissSelfAsAdmin = false] If true, after the channel ownership is being transferred to another user, the current user will be dismissed as a channel admin and will become to a channel subscriber.\n     */\n\n    /**\n     * Transfers a channel ownership to another user.\n     * Note: the user you are transferring the channel ownership to must be a channel admin.\n     * @param {string} newOwnerId\n     * @param {TransferChannelOwnershipOptions} options\n     * @returns {Promise<boolean>} Returns true if the operation completed successfully, false otherwise\n     */\n    async transferChannelOwnership(newOwnerId, options = {}) {\n        return this.client.transferChannelOwnership(\n            this.id._serialized,\n            newOwnerId,\n            options,\n        );\n    }\n\n    /**\n     * Loads channel messages, sorted from earliest to latest\n     * @param {Object} searchOptions Options for searching messages. Right now only limit and fromMe is supported\n     * @param {Number} [searchOptions.limit] The amount of messages to return. If no limit is specified, the available messages will be returned. Note that the actual number of returned messages may be smaller if there aren't enough messages in the conversation. Set this to Infinity to load all messages\n     * @param {Boolean} [searchOptions.fromMe] Return only messages from the bot number or vise versa. To get all messages, leave the option undefined\n     * @returns {Promise<Array<Message>>}\n     */\n    async fetchMessages(searchOptions) {\n        let messages = await this.client.pupPage.evaluate(\n            async (channelId, searchOptions) => {\n                const msgFilter = (m) => {\n                    if (\n                        m.isNotification ||\n                        m.type === 'newsletter_notification'\n                    ) {\n                        return false; // dont include notification messages\n                    }\n                    if (\n                        searchOptions &&\n                        searchOptions.fromMe !== undefined &&\n                        m.id.fromMe !== searchOptions.fromMe\n                    ) {\n                        return false;\n                    }\n                    return true;\n                };\n\n                const channel = await window.WWebJS.getChat(channelId, {\n                    getAsModel: false,\n                });\n                let msgs = channel.msgs.getModelsArray().filter(msgFilter);\n\n                if (searchOptions && searchOptions.limit > 0) {\n                    while (msgs.length < searchOptions.limit) {\n                        const loadedMessages = await window\n                            .require('WAWebChatLoadMessages')\n                            .loadEarlierMsgs(channel);\n                        if (!loadedMessages || !loadedMessages.length) break;\n                        msgs = [...loadedMessages.filter(msgFilter), ...msgs];\n                    }\n\n                    if (msgs.length > searchOptions.limit) {\n                        msgs.sort((a, b) => (a.t > b.t ? 1 : -1));\n                        msgs = msgs.splice(msgs.length - searchOptions.limit);\n                    }\n                }\n\n                return msgs.map((m) => window.WWebJS.getMessageModel(m));\n            },\n            this.id._serialized,\n            searchOptions,\n        );\n\n        return messages.map((msg) => new Message(this.client, msg));\n    }\n\n    /**\n     * Deletes the channel you created\n     * @returns {Promise<boolean>} Returns true if the operation completed successfully, false otherwise\n     */\n    async deleteChannel() {\n        return this.client.deleteChannel(this.id._serialized);\n    }\n\n    /**\n     * Internal method to change the channel metadata\n     * @param {string|number|MessageMedia} value The new value to set\n     * @param {string} property The property of a channel metadata to change\n     * @returns {Promise<boolean>} Returns true if the operation completed successfully, false otherwise\n     */\n    async _setChannelMetadata(value, property) {\n        return await this.client.pupPage.evaluate(\n            async (channelId, value, property) => {\n                const channel = await window.WWebJS.getChat(channelId, {\n                    getAsModel: false,\n                });\n                if (!channel) return false;\n                if (property.editPicture) {\n                    value.picture = value.picture\n                        ? await window.WWebJS.cropAndResizeImage(\n                              value.picture,\n                              {\n                                  asDataUrl: true,\n                                  mimetype: 'image/jpeg',\n                                  size: 640,\n                                  quality: 1,\n                              },\n                          )\n                        : null;\n                }\n                try {\n                    await window\n                        .require('WAWebEditNewsletterMetadataAction')\n                        .editNewsletterMetadataAction(channel, property, value);\n                    return true;\n                } catch (err) {\n                    if (err.name === 'ServerStatusCodeError') return false;\n                    throw err;\n                }\n            },\n            this.id._serialized,\n            value,\n            property,\n        );\n    }\n\n    /**\n     * Internal method to mute or unmute the channel\n     * @param {string} action The action: 'MUTE' or 'UNMUTE'\n     * @returns {Promise<boolean>} Returns true if the operation completed successfully, false otherwise\n     */\n    async _muteUnmuteChannel(action) {\n        return await this.client.pupPage.evaluate(\n            async (channelId, action) => {\n                try {\n                    await window\n                        .require('WAWebNewsletterUpdateUserSettingJob')\n                        .updateNewsletterUserSetting({\n                            newsletterJid: window\n                                .require('WAJids')\n                                .toNewsletterJid(channelId),\n                            type: window.require('WAWebNewsletterModelUtils')\n                                .ADMIN_NOTIFICATIONS,\n                            muteExpirationValue:\n                                action === 'MUTE'\n                                    ? window.require(\n                                          'WAWebNewsletterModelUtils',\n                                      ).MUTED_STATE\n                                    : window.require(\n                                          'WAWebNewsletterModelUtils',\n                                      ).UNMUTED_STATE,\n                        });\n                    return true;\n                } catch (err) {\n                    if (err.name === 'ServerStatusCodeError') return false;\n                    throw err;\n                }\n            },\n            this.id._serialized,\n            action,\n        );\n    }\n}\n\nmodule.exports = Channel;\n"
  },
  {
    "path": "src/structures/Chat.js",
    "content": "'use strict';\n\nconst Base = require('./Base');\nconst Message = require('./Message');\n\n/**\n * Represents a Chat on WhatsApp\n * @extends {Base}\n */\nclass Chat extends Base {\n    constructor(client, data) {\n        super(client);\n\n        if (data) this._patch(data);\n    }\n\n    _patch(data) {\n        /**\n         * ID that represents the chat\n         * @type {object}\n         */\n        this.id = data.id;\n\n        /**\n         * Title of the chat\n         * @type {string}\n         */\n        this.name = data.formattedTitle;\n\n        /**\n         * Indicates if the Chat is a Group Chat\n         * @type {boolean}\n         */\n        this.isGroup = data.isGroup;\n\n        /**\n         * Indicates if the Chat is readonly\n         * @type {boolean}\n         */\n        this.isReadOnly = data.isReadOnly;\n\n        /**\n         * Amount of messages unread\n         * @type {number}\n         */\n        this.unreadCount = data.unreadCount;\n\n        /**\n         * Unix timestamp for when the last activity occurred\n         * @type {number}\n         */\n        this.timestamp = data.t;\n\n        /**\n         * Indicates if the Chat is archived\n         * @type {boolean}\n         */\n        this.archived = data.archive;\n\n        /**\n         * Indicates if the Chat is pinned\n         * @type {boolean}\n         */\n        this.pinned = !!data.pin;\n\n        /**\n         * Indicates if the Chat is locked\n         * @type {boolean}\n         */\n        this.isLocked = data.isLocked;\n\n        /**\n         * Indicates if the chat is muted or not\n         * @type {boolean}\n         */\n        this.isMuted = data.isMuted;\n\n        /**\n         * Unix timestamp for when the mute expires\n         * @type {number}\n         */\n        this.muteExpiration = data.muteExpiration;\n\n        /**\n         * Last message fo chat\n         * @type {Message}\n         */\n        this.lastMessage = data.lastMessage\n            ? new Message(this.client, data.lastMessage)\n            : undefined;\n\n        return super._patch(data);\n    }\n\n    /**\n     * Send a message to this chat\n     * @param {string|MessageMedia|Location} content\n     * @param {MessageSendOptions} [options]\n     * @returns {Promise<Message>} Message that was just sent\n     */\n    async sendMessage(content, options) {\n        return this.client.sendMessage(this.id._serialized, content, options);\n    }\n\n    /**\n     * Sets the chat as seen\n     * @returns {Promise<Boolean>} result\n     */\n    async sendSeen() {\n        return this.client.sendSeen(this.id._serialized);\n    }\n\n    /**\n     * Clears all messages from the chat\n     * @returns {Promise<boolean>} result\n     */\n    async clearMessages() {\n        return this.client.pupPage.evaluate((chatId) => {\n            return window.WWebJS.sendClearChat(chatId);\n        }, this.id._serialized);\n    }\n\n    /**\n     * Deletes the chat\n     * @returns {Promise<Boolean>} result\n     */\n    async delete() {\n        return this.client.pupPage.evaluate((chatId) => {\n            return window.WWebJS.sendDeleteChat(chatId);\n        }, this.id._serialized);\n    }\n\n    /**\n     * Archives this chat\n     */\n    async archive() {\n        return this.client.archiveChat(this.id._serialized);\n    }\n\n    /**\n     * un-archives this chat\n     */\n    async unarchive() {\n        return this.client.unarchiveChat(this.id._serialized);\n    }\n\n    /**\n     * Pins this chat\n     * @returns {Promise<boolean>} New pin state. Could be false if the max number of pinned chats was reached.\n     */\n    async pin() {\n        return this.client.pinChat(this.id._serialized);\n    }\n\n    /**\n     * Unpins this chat\n     * @returns {Promise<boolean>} New pin state\n     */\n    async unpin() {\n        return this.client.unpinChat(this.id._serialized);\n    }\n\n    /**\n     * Mutes this chat forever, unless a date is specified\n     * @param {?Date} unmuteDate Date when the chat will be unmuted, don't provide a value to mute forever\n     * @returns {Promise<{isMuted: boolean, muteExpiration: number}>}\n     */\n    async mute(unmuteDate) {\n        const result = await this.client.muteChat(\n            this.id._serialized,\n            unmuteDate,\n        );\n        this.isMuted = result.isMuted;\n        this.muteExpiration = result.muteExpiration;\n        return result;\n    }\n\n    /**\n     * Unmutes this chat\n     * @returns {Promise<{isMuted: boolean, muteExpiration: number}>}\n     */\n    async unmute() {\n        const result = await this.client.unmuteChat(this.id._serialized);\n        this.isMuted = result.isMuted;\n        this.muteExpiration = result.muteExpiration;\n        return result;\n    }\n\n    /**\n     * Mark this chat as unread\n     */\n    async markUnread() {\n        return this.client.markChatUnread(this.id._serialized);\n    }\n\n    /**\n     * Loads chat messages, sorted from earliest to latest.\n     * @param {Object} searchOptions Options for searching messages. Right now only limit and fromMe is supported.\n     * @param {Number} [searchOptions.limit] The amount of messages to return. If no limit is specified, the available messages will be returned. Note that the actual number of returned messages may be smaller if there aren't enough messages in the conversation. Set this to Infinity to load all messages.\n     * @param {Boolean} [searchOptions.fromMe] Return only messages from the bot number or vise versa. To get all messages, leave the option undefined.\n     * @returns {Promise<Array<Message>>}\n     */\n    async fetchMessages(searchOptions) {\n        let messages = await this.client.pupPage.evaluate(\n            async (chatId, searchOptions) => {\n                const msgFilter = (m) => {\n                    if (m.isNotification) {\n                        return false; // dont include notification messages\n                    }\n                    if (\n                        searchOptions &&\n                        searchOptions.fromMe !== undefined &&\n                        m.id.fromMe !== searchOptions.fromMe\n                    ) {\n                        return false;\n                    }\n                    return true;\n                };\n\n                const chat = await window.WWebJS.getChat(chatId, {\n                    getAsModel: false,\n                });\n                let msgs = chat.msgs.getModelsArray().filter(msgFilter);\n\n                if (searchOptions && searchOptions.limit > 0) {\n                    while (msgs.length < searchOptions.limit) {\n                        const loadedMessages = await window\n                            .require('WAWebChatLoadMessages')\n                            .loadEarlierMsgs(chat, chat.msgs);\n                        if (!loadedMessages || !loadedMessages.length) break;\n                        msgs = [...loadedMessages.filter(msgFilter), ...msgs];\n                    }\n\n                    if (msgs.length > searchOptions.limit) {\n                        msgs.sort((a, b) => (a.t > b.t ? 1 : -1));\n                        msgs = msgs.splice(msgs.length - searchOptions.limit);\n                    }\n                }\n\n                return msgs.map((m) => window.WWebJS.getMessageModel(m));\n            },\n            this.id._serialized,\n            searchOptions,\n        );\n\n        return messages.map((m) => new Message(this.client, m));\n    }\n\n    /**\n     * Simulate typing in chat. This will last for 25 seconds.\n     */\n    async sendStateTyping() {\n        return this.client.pupPage.evaluate((chatId) => {\n            window.WWebJS.sendChatstate('typing', chatId);\n            return true;\n        }, this.id._serialized);\n    }\n\n    /**\n     * Simulate recording audio in chat. This will last for 25 seconds.\n     */\n    async sendStateRecording() {\n        return this.client.pupPage.evaluate((chatId) => {\n            window.WWebJS.sendChatstate('recording', chatId);\n            return true;\n        }, this.id._serialized);\n    }\n\n    /**\n     * Stops typing or recording in chat immediately.\n     */\n    async clearState() {\n        return this.client.pupPage.evaluate((chatId) => {\n            window.WWebJS.sendChatstate('stop', chatId);\n            return true;\n        }, this.id._serialized);\n    }\n\n    /**\n     * Returns the Contact that corresponds to this Chat.\n     * @returns {Promise<Contact>}\n     */\n    async getContact() {\n        return await this.client.getContactById(this.id._serialized);\n    }\n\n    /**\n     * Returns array of all Labels assigned to this Chat\n     * @returns {Promise<Array<Label>>}\n     */\n    async getLabels() {\n        return this.client.getChatLabels(this.id._serialized);\n    }\n\n    /**\n     * Add or remove labels to this Chat\n     * @param {Array<number|string>} labelIds\n     * @returns {Promise<void>}\n     */\n    async changeLabels(labelIds) {\n        return this.client.addOrRemoveLabels(labelIds, [this.id._serialized]);\n    }\n\n    /**\n     * Gets instances of all pinned messages in a chat\n     * @returns {Promise<Array<Message>>}\n     */\n    async getPinnedMessages() {\n        return this.client.getPinnedMessages(this.id._serialized);\n    }\n\n    /**\n     * Sync chat history conversation\n     * @return {Promise<boolean>} True if operation completed successfully, false otherwise.\n     */\n    async syncHistory() {\n        return this.client.syncHistory(this.id._serialized);\n    }\n\n    /**\n     * Add or edit a customer note\n     * @see https://faq.whatsapp.com/1433099287594476\n     * @param {string} note The note to add\n     * @returns {Promise<void>}\n     */\n    async addOrEditCustomerNote(note) {\n        if (this.isGroup || this.isChannel) return;\n\n        return this.client.addOrEditCustomerNote(this.id._serialized, note);\n    }\n\n    /**\n     * Get a customer note\n     * @see https://faq.whatsapp.com/1433099287594476\n     * @returns {Promise<{\n     *    chatId: string,\n     *    content: string,\n     *    createdAt: number,\n     *    id: string,\n     *    modifiedAt: number,\n     *    type: string\n     * }>}\n     */\n    async getCustomerNote() {\n        if (this.isGroup || this.isChannel) return null;\n\n        return this.client.getCustomerNote(this.id._serialized);\n    }\n}\n\nmodule.exports = Chat;\n"
  },
  {
    "path": "src/structures/ClientInfo.js",
    "content": "'use strict';\n\nconst Base = require('./Base');\n\n/**\n * Current connection information\n * @extends {Base}\n */\nclass ClientInfo extends Base {\n    constructor(client, data) {\n        super(client);\n\n        if (data) this._patch(data);\n    }\n\n    _patch(data) {\n        /**\n         * Name configured to be shown in push notifications\n         * @type {string}\n         */\n        this.pushname = data.pushname;\n\n        /**\n         * Current user ID\n         * @type {object}\n         */\n        this.wid = data.wid;\n\n        /**\n         * @type {object}\n         * @deprecated Use .wid instead\n         */\n        this.me = data.wid;\n\n        /**\n         * Information about the phone this client is connected to. Not available in multi-device.\n         * @type {object}\n         * @property {string} wa_version WhatsApp Version running on the phone\n         * @property {string} os_version OS Version running on the phone (iOS or Android version)\n         * @property {string} device_manufacturer Device manufacturer\n         * @property {string} device_model Device model\n         * @property {string} os_build_number OS build number\n         * @deprecated\n         */\n        this.phone = data.phone;\n\n        /**\n         * Platform WhatsApp is running on\n         * @type {string}\n         */\n        this.platform = data.platform;\n\n        return super._patch(data);\n    }\n\n    /**\n     * Get current battery percentage and charging status for the attached device\n     * @returns {object} batteryStatus\n     * @returns {number} batteryStatus.battery - The current battery percentage\n     * @returns {boolean} batteryStatus.plugged - Indicates if the phone is plugged in (true) or not (false)\n     * @deprecated\n     */\n    async getBatteryStatus() {\n        return await this.client.pupPage.evaluate(() => {\n            const { battery, plugged } = window.require('WAWebConnModel').Conn;\n            return { battery, plugged };\n        });\n    }\n}\n\nmodule.exports = ClientInfo;\n"
  },
  {
    "path": "src/structures/Contact.js",
    "content": "'use strict';\n\nconst Base = require('./Base');\n\n/**\n * ID that represents a contact\n * @typedef {Object} ContactId\n * @property {string} server\n * @property {string} user\n * @property {string} _serialized\n */\n\n/**\n * Represents a Contact on WhatsApp\n * @extends {Base}\n */\nclass Contact extends Base {\n    constructor(client, data) {\n        super(client);\n\n        if (data) this._patch(data);\n    }\n\n    _patch(data) {\n        /**\n         * ID that represents the contact\n         * @type {ContactId}\n         */\n        this.id = data.id;\n\n        /**\n         * Contact's phone number\n         * @type {string}\n         */\n        this.number = data.userid;\n\n        /**\n         * Indicates if the contact is a business contact\n         * @type {boolean}\n         */\n        this.isBusiness = data.isBusiness;\n\n        /**\n         * Indicates if the contact is an enterprise contact\n         * @type {boolean}\n         */\n        this.isEnterprise = data.isEnterprise;\n\n        this.labels = data.labels;\n\n        /**\n         * The contact's name, as saved by the current user\n         * @type {?string}\n         */\n        this.name = data.name;\n\n        /**\n         * The name that the contact has configured to be shown publically\n         * @type {string}\n         */\n        this.pushname = data.pushname;\n\n        this.sectionHeader = data.sectionHeader;\n\n        /**\n         * A shortened version of name\n         * @type {?string}\n         */\n        this.shortName = data.shortName;\n\n        this.statusMute = data.statusMute;\n        this.type = data.type;\n        this.verifiedLevel = data.verifiedLevel;\n        this.verifiedName = data.verifiedName;\n\n        /**\n         * Indicates if the contact is the current user's contact\n         * @type {boolean}\n         */\n        this.isMe = data.isMe;\n\n        /**\n         * Indicates if the contact is a user contact\n         * @type {boolean}\n         */\n        this.isUser = data.isUser;\n\n        /**\n         * Indicates if the contact is a group contact\n         * @type {boolean}\n         */\n        this.isGroup = data.isGroup;\n\n        /**\n         * Indicates if the number is registered on WhatsApp\n         * @type {boolean}\n         */\n        this.isWAContact = data.isWAContact;\n\n        /**\n         * Indicates if the number is saved in the current phone's contacts\n         * @type {boolean}\n         */\n        this.isMyContact = data.isMyContact;\n\n        /**\n         * Indicates if you have blocked this contact\n         * @type {boolean}\n         */\n        this.isBlocked = data.isBlocked;\n\n        return super._patch(data);\n    }\n\n    /**\n     * Returns the contact's profile picture URL, if privacy settings allow it\n     * @returns {Promise<string>}\n     */\n    async getProfilePicUrl() {\n        return await this.client.getProfilePicUrl(this.id._serialized);\n    }\n\n    /**\n     * Returns the contact's formatted phone number, (12345678901@c.us) => (+1 (234) 5678-901)\n     * @returns {Promise<string>}\n     */\n    async getFormattedNumber() {\n        return await this.client.getFormattedNumber(this.id._serialized);\n    }\n\n    /**\n     * Returns the contact's countrycode, (1541859685@c.us) => (1)\n     * @returns {Promise<string>}\n     */\n    async getCountryCode() {\n        return await this.client.getCountryCode(this.id._serialized);\n    }\n\n    /**\n     * Returns the Chat that corresponds to this Contact.\n     * Will return null when getting chat for currently logged in user.\n     * @returns {Promise<Chat>}\n     */\n    async getChat() {\n        if (this.isMe) return null;\n\n        return await this.client.getChatById(this.id._serialized);\n    }\n\n    /**\n     * Blocks this contact from WhatsApp\n     * @returns {Promise<boolean>}\n     */\n    async block() {\n        if (this.isGroup) return false;\n\n        await this.client.pupPage.evaluate(async (contactId) => {\n            const chat = await window.WWebJS.getChat(contactId);\n            await window\n                .require('WAWebBlockContactAction')\n                .blockContact({ contact: chat });\n        }, this.id._serialized);\n\n        this.isBlocked = true;\n        return true;\n    }\n\n    /**\n     * Unblocks this contact from WhatsApp\n     * @returns {Promise<boolean>}\n     */\n    async unblock() {\n        if (this.isGroup) return false;\n\n        await this.client.pupPage.evaluate(async (contactId) => {\n            const contact = window\n                .require('WAWebCollections')\n                .Contact.get(contactId);\n            await window\n                .require('WAWebBlockContactAction')\n                .unblockContact(contact);\n        }, this.id._serialized);\n\n        this.isBlocked = false;\n        return true;\n    }\n\n    /**\n     * Gets the Contact's current \"about\" info. Returns null if you don't have permission to read their status.\n     * @returns {Promise<?string>}\n     */\n    async getAbout() {\n        const about = await this.client.pupPage.evaluate(async (contactId) => {\n            const wid = window.require('WAWebWidFactory').createWid(contactId);\n            return window\n                .require('WAWebContactStatusBridge')\n                .getStatus({ token: '', wid: wid });\n        }, this.id._serialized);\n\n        if (typeof about.status !== 'string') return null;\n\n        return about.status;\n    }\n\n    /**\n     * Gets the Contact's common groups with you. Returns empty array if you don't have any common group.\n     * @returns {Promise<WAWebJS.ChatId[]>}\n     */\n    async getCommonGroups() {\n        return await this.client.getCommonGroups(this.id._serialized);\n    }\n\n    /**\n     * Gets the Contact's current status broadcast.\n     * @returns {Promise<Broadcast>}\n     */\n    async getBroadcast() {\n        return await this.client.getBroadcastById(this.id._serialized);\n    }\n}\n\nmodule.exports = Contact;\n"
  },
  {
    "path": "src/structures/GroupChat.js",
    "content": "'use strict';\n\nconst Chat = require('./Chat');\n\n/**\n * Group participant information\n * @typedef {Object} GroupParticipant\n * @property {ContactId} id\n * @property {boolean} isAdmin\n * @property {boolean} isSuperAdmin\n */\n\n/**\n * Represents a Group Chat on WhatsApp\n * @extends {Chat}\n */\nclass GroupChat extends Chat {\n    _patch(data) {\n        this.groupMetadata = data.groupMetadata;\n\n        return super._patch(data);\n    }\n\n    /**\n     * Gets the group owner\n     * @type {ContactId}\n     */\n    get owner() {\n        return this.groupMetadata.owner;\n    }\n\n    /**\n     * Gets the date at which the group was created\n     * @type {date}\n     */\n    get createdAt() {\n        return new Date(this.groupMetadata.creation * 1000);\n    }\n\n    /**\n     * Gets the group description\n     * @type {string}\n     */\n    get description() {\n        return this.groupMetadata.desc;\n    }\n\n    /**\n     * Gets the group participants\n     * @type {Array<GroupParticipant>}\n     */\n    get participants() {\n        return this.groupMetadata.participants;\n    }\n\n    /**\n     * An object that handles the result for {@link addParticipants} method\n     * @typedef {Object} AddParticipantsResult\n     * @property {number} code The code of the result\n     * @property {string} message The result message\n     * @property {boolean} isInviteV4Sent Indicates if the inviteV4 was sent to the partitipant\n     */\n\n    /**\n     * An object that handles options for adding participants\n     * @typedef {Object} AddParticipnatsOptions\n     * @property {Array<number>|number} [sleep = [250, 500]] The number of milliseconds to wait before adding the next participant. If it is an array, a random sleep time between the sleep[0] and sleep[1] values will be added (the difference must be >=100 ms, otherwise, a random sleep time between sleep[1] and sleep[1] + 100 will be added). If sleep is a number, a sleep time equal to its value will be added. By default, sleep is an array with a value of [250, 500]\n     * @property {boolean} [autoSendInviteV4 = true] If true, the inviteV4 will be sent to those participants who have restricted others from being automatically added to groups, otherwise the inviteV4 won't be sent (true by default)\n     * @property {string} [comment = ''] The comment to be added to an inviteV4 (empty string by default)\n     */\n\n    /**\n     * Adds a list of participants by ID to the group\n     * @param {string|Array<string>} participantIds\n     * @param {AddParticipnatsOptions} options An object thay handles options for adding participants\n     * @returns {Promise<Object.<string, AddParticipantsResult>|string>} Returns an object with the resulting data or an error message as a string\n     */\n    async addParticipants(participantIds, options = {}) {\n        return await this.client.pupPage.evaluate(\n            async (groupId, participantIds, options) => {\n                const {\n                    sleep = [250, 500],\n                    autoSendInviteV4 = true,\n                    comment = '',\n                } = options;\n                const participantData = {};\n\n                !Array.isArray(participantIds) &&\n                    (participantIds = [participantIds]);\n                const groupWid = window\n                    .require('WAWebWidFactory')\n                    .createWid(groupId);\n                const group =\n                    window.require('WAWebCollections').Chat.get(groupWid) ||\n                    (await window\n                        .require('WAWebCollections')\n                        .Chat.find(groupWid));\n                const participantWids = participantIds.map((p) =>\n                    window.require('WAWebWidFactory').createWid(p),\n                );\n\n                const errorCodes = {\n                    default:\n                        'An unknown error occupied while adding a participant',\n                    isGroupEmpty:\n                        \"AddParticipantsError: The participant can't be added to an empty group\",\n                    iAmNotAdmin:\n                        'AddParticipantsError: You have no admin rights to add a participant to a group',\n                    200: 'The participant was added successfully',\n                    403: 'The participant can be added by sending private invitation only',\n                    404: 'The phone number is not registered on WhatsApp',\n                    408: 'You cannot add this participant because they recently left the group',\n                    409: 'The participant is already a group member',\n                    417: \"The participant can't be added to the community. You can invite them privately to join this group through its invite link\",\n                    419: \"The participant can't be added because the group is full\",\n                };\n\n                await window\n                    .require('WAWebGroupQueryJob')\n                    .queryAndUpdateGroupMetadataById({ id: groupId });\n\n                let groupParticipants =\n                    group.groupMetadata?.participants.serialize();\n\n                if (!groupParticipants) {\n                    return errorCodes.isGroupEmpty;\n                }\n\n                if (!group.iAmAdmin()) {\n                    return errorCodes.iAmNotAdmin;\n                }\n\n                groupParticipants.map(({ id }) => {\n                    return id.server === 'lid'\n                        ? window.require('WAWebApiContact').getPhoneNumber(id)\n                        : id;\n                });\n\n                const _getSleepTime = (sleep) => {\n                    if (\n                        !Array.isArray(sleep) ||\n                        (sleep.length === 2 && sleep[0] === sleep[1])\n                    ) {\n                        return sleep;\n                    }\n                    if (sleep.length === 1) {\n                        return sleep[0];\n                    }\n                    sleep[1] - sleep[0] < 100 &&\n                        (sleep[0] = sleep[1]) &&\n                        (sleep[1] += 100);\n                    return (\n                        Math.floor(Math.random() * (sleep[1] - sleep[0] + 1)) +\n                        sleep[0]\n                    );\n                };\n\n                for (let pWid of participantWids) {\n                    const pId = pWid._serialized;\n                    pWid =\n                        pWid.server === 'lid'\n                            ? window\n                                  .require('WAWebApiContact')\n                                  .getPhoneNumber(pWid)\n                            : pWid;\n\n                    participantData[pId] = {\n                        code: undefined,\n                        message: undefined,\n                        isInviteV4Sent: false,\n                    };\n\n                    if (groupParticipants.some((p) => p._serialized === pId)) {\n                        participantData[pId].code = 409;\n                        participantData[pId].message = errorCodes[409];\n                        continue;\n                    }\n\n                    if (\n                        !(\n                            await window\n                                .require('WAWebQueryExistsJob')\n                                .queryWidExists(pWid)\n                        )?.wid\n                    ) {\n                        participantData[pId].code = 404;\n                        participantData[pId].message = errorCodes[404];\n                        continue;\n                    }\n\n                    const rpcResult =\n                        await window.WWebJS.getAddParticipantsRpcResult(\n                            groupWid,\n                            pWid,\n                        );\n                    const { code: rpcResultCode } = rpcResult;\n\n                    participantData[pId].code = rpcResultCode;\n                    participantData[pId].message =\n                        errorCodes[rpcResultCode] || errorCodes.default;\n\n                    if (autoSendInviteV4 && rpcResultCode === 403) {\n                        let userChat,\n                            isInviteV4Sent = false;\n                        window\n                            .require('WAWebCollections')\n                            .Contact.gadd(pWid, { silent: true });\n\n                        if (\n                            rpcResult.name ===\n                                'ParticipantRequestCodeCanBeSent' &&\n                            (userChat =\n                                window\n                                    .require('WAWebCollections')\n                                    .Chat.get(pWid) ||\n                                (await window\n                                    .require('WAWebCollections')\n                                    .Chat.find(pWid)))\n                        ) {\n                            const groupName =\n                                group.formattedTitle || group.name;\n                            const res = await window\n                                .require('WAWebChatSendMessages')\n                                .sendGroupInviteMessage(\n                                    userChat,\n                                    group.id._serialized,\n                                    groupName,\n                                    rpcResult.inviteV4Code,\n                                    rpcResult.inviteV4CodeExp,\n                                    comment,\n                                    await window.WWebJS.getProfilePicThumbToBase64(\n                                        groupWid,\n                                    ),\n                                );\n                            isInviteV4Sent = res.messageSendResult === 'OK';\n                        }\n\n                        participantData[pId].isInviteV4Sent = isInviteV4Sent;\n                    }\n\n                    sleep &&\n                        participantWids.length > 1 &&\n                        participantWids.indexOf(pWid) !==\n                            participantWids.length - 1 &&\n                        (await new Promise((resolve) =>\n                            setTimeout(resolve, _getSleepTime(sleep)),\n                        ));\n                }\n\n                return participantData;\n            },\n            this.id._serialized,\n            participantIds,\n            options,\n        );\n    }\n\n    /**\n     * Removes a list of participants by ID to the group\n     * @param {Array<string>} participantIds\n     * @returns {Promise<{ status: number }>}\n     */\n    async removeParticipants(participantIds) {\n        return await this.client.pupPage.evaluate(\n            async (chatId, participantIds) => {\n                const chat = await window.WWebJS.getChat(chatId, {\n                    getAsModel: false,\n                });\n                const participants = (\n                    await Promise.all(\n                        participantIds.map(async (p) => {\n                            const { lid, phone } =\n                                await window.WWebJS.enforceLidAndPnRetrieval(p);\n\n                            return (\n                                chat.groupMetadata.participants.get(\n                                    lid?._serialized,\n                                ) ||\n                                chat.groupMetadata.participants.get(\n                                    phone?._serialized,\n                                )\n                            );\n                        }),\n                    )\n                ).filter(Boolean);\n                await window\n                    .require('WAWebModifyParticipantsGroupAction')\n                    .removeParticipants(chat, participants);\n                return { status: 200 };\n            },\n            this.id._serialized,\n            participantIds,\n        );\n    }\n\n    /**\n     * Promotes participants by IDs to admins\n     * @param {Array<string>} participantIds\n     * @returns {Promise<{ status: number }>} Object with status code indicating if the operation was successful\n     */\n    async promoteParticipants(participantIds) {\n        return await this.client.pupPage.evaluate(\n            async (chatId, participantIds) => {\n                const chat = await window.WWebJS.getChat(chatId, {\n                    getAsModel: false,\n                });\n                const participants = (\n                    await Promise.all(\n                        participantIds.map(async (p) => {\n                            const { lid, phone } =\n                                await window.WWebJS.enforceLidAndPnRetrieval(p);\n\n                            return (\n                                chat.groupMetadata.participants.get(\n                                    lid?._serialized,\n                                ) ||\n                                chat.groupMetadata.participants.get(\n                                    phone?._serialized,\n                                )\n                            );\n                        }),\n                    )\n                ).filter(Boolean);\n                await window\n                    .require('WAWebModifyParticipantsGroupAction')\n                    .promoteParticipants(chat, participants);\n                return { status: 200 };\n            },\n            this.id._serialized,\n            participantIds,\n        );\n    }\n\n    /**\n     * Demotes participants by IDs to regular users\n     * @param {Array<string>} participantIds\n     * @returns {Promise<{ status: number }>} Object with status code indicating if the operation was successful\n     */\n    async demoteParticipants(participantIds) {\n        return await this.client.pupPage.evaluate(\n            async (chatId, participantIds) => {\n                const chat = await window.WWebJS.getChat(chatId, {\n                    getAsModel: false,\n                });\n                const participants = (\n                    await Promise.all(\n                        participantIds.map(async (p) => {\n                            const { lid, phone } =\n                                await window.WWebJS.enforceLidAndPnRetrieval(p);\n\n                            return (\n                                chat.groupMetadata.participants.get(\n                                    lid?._serialized,\n                                ) ||\n                                chat.groupMetadata.participants.get(\n                                    phone?._serialized,\n                                )\n                            );\n                        }),\n                    )\n                ).filter(Boolean);\n                await window\n                    .require('WAWebModifyParticipantsGroupAction')\n                    .demoteParticipants(chat, participants);\n                return { status: 200 };\n            },\n            this.id._serialized,\n            participantIds,\n        );\n    }\n\n    /**\n     * Updates the group subject\n     * @param {string} subject\n     * @returns {Promise<boolean>} Returns true if the subject was properly updated. This can return false if the user does not have the necessary permissions.\n     */\n    async setSubject(subject) {\n        const success = await this.client.pupPage.evaluate(\n            async (chatId, subject) => {\n                const chatWid = window\n                    .require('WAWebWidFactory')\n                    .createWid(chatId);\n                try {\n                    await window\n                        .require('WAWebGroupModifyInfoJob')\n                        .setGroupSubject(chatWid, subject);\n                    return true;\n                } catch (err) {\n                    if (err.name === 'ServerStatusCodeError') return false;\n                    throw err;\n                }\n            },\n            this.id._serialized,\n            subject,\n        );\n\n        if (!success) return false;\n        this.name = subject;\n        return true;\n    }\n\n    /**\n     * Updates the group description\n     * @param {string} description\n     * @returns {Promise<boolean>} Returns true if the description was properly updated. This can return false if the user does not have the necessary permissions.\n     */\n    async setDescription(description) {\n        const success = await this.client.pupPage.evaluate(\n            async (chatId, description) => {\n                const chatWid = window\n                    .require('WAWebWidFactory')\n                    .createWid(chatId);\n                const chat = await window.WWebJS.getChat(chatId, {\n                    getAsModel: false,\n                });\n                let descId = chat.groupMetadata.descId;\n                let newId = await window.require('WAWebMsgKey').newId();\n                try {\n                    await window\n                        .require('WAWebGroupModifyInfoJob')\n                        .setGroupDescription(\n                            chatWid,\n                            description,\n                            newId,\n                            descId,\n                        );\n                    return true;\n                } catch (err) {\n                    if (err.name === 'ServerStatusCodeError') return false;\n                    throw err;\n                }\n            },\n            this.id._serialized,\n            description,\n        );\n\n        if (!success) return false;\n        this.groupMetadata.desc = description;\n        return true;\n    }\n\n    /**\n     * Updates the group setting to allow only admins to add members to the group.\n     * @param {boolean} [adminsOnly=true] Enable or disable this option\n     * @returns {Promise<boolean>} Returns true if the setting was properly updated. This can return false if the user does not have the necessary permissions.\n     */\n    async setAddMembersAdminsOnly(adminsOnly = true) {\n        const success = await this.client.pupPage.evaluate(\n            async (groupId, adminsOnly) => {\n                const chat = await window.WWebJS.getChat(groupId, {\n                    getAsModel: false,\n                });\n                try {\n                    await window\n                        .require('WAWebSetPropertyGroupAction')\n                        .setGroupProperty(\n                            chat,\n                            'member_add_mode',\n                            adminsOnly ? 0 : 1,\n                        );\n                    return true;\n                } catch (err) {\n                    if (err.name === 'ServerStatusCodeError') return false;\n                    throw err;\n                }\n            },\n            this.id._serialized,\n            adminsOnly,\n        );\n\n        success &&\n            (this.groupMetadata.memberAddMode = adminsOnly\n                ? 'admin_add'\n                : 'all_member_add');\n        return success;\n    }\n\n    /**\n     * Updates the group settings to only allow admins to send messages.\n     * @param {boolean} [adminsOnly=true] Enable or disable this option\n     * @returns {Promise<boolean>} Returns true if the setting was properly updated. This can return false if the user does not have the necessary permissions.\n     */\n    async setMessagesAdminsOnly(adminsOnly = true) {\n        const success = await this.client.pupPage.evaluate(\n            async (chatId, adminsOnly) => {\n                const chat = await window.WWebJS.getChat(chatId, {\n                    getAsModel: false,\n                });\n                try {\n                    await window\n                        .require('WAWebSetPropertyGroupAction')\n                        .setGroupProperty(\n                            chat,\n                            'announcement',\n                            adminsOnly ? 1 : 0,\n                        );\n                    return true;\n                } catch (err) {\n                    if (err.name === 'ServerStatusCodeError') return false;\n                    throw err;\n                }\n            },\n            this.id._serialized,\n            adminsOnly,\n        );\n\n        if (!success) return false;\n\n        this.groupMetadata.announce = adminsOnly;\n        return true;\n    }\n\n    /**\n     * Updates the group settings to only allow admins to edit group info (title, description, photo).\n     * @param {boolean} [adminsOnly=true] Enable or disable this option\n     * @returns {Promise<boolean>} Returns true if the setting was properly updated. This can return false if the user does not have the necessary permissions.\n     */\n    async setInfoAdminsOnly(adminsOnly = true) {\n        const success = await this.client.pupPage.evaluate(\n            async (chatId, adminsOnly) => {\n                const chat = await window.WWebJS.getChat(chatId, {\n                    getAsModel: false,\n                });\n                try {\n                    await window\n                        .require('WAWebSetPropertyGroupAction')\n                        .setGroupProperty(chat, 'restrict', adminsOnly ? 1 : 0);\n                    return true;\n                } catch (err) {\n                    if (err.name === 'ServerStatusCodeError') return false;\n                    throw err;\n                }\n            },\n            this.id._serialized,\n            adminsOnly,\n        );\n\n        if (!success) return false;\n\n        this.groupMetadata.restrict = adminsOnly;\n        return true;\n    }\n\n    /**\n     * Deletes the group's picture.\n     * @returns {Promise<boolean>} Returns true if the picture was properly deleted. This can return false if the user does not have the necessary permissions.\n     */\n    async deletePicture() {\n        const success = await this.client.pupPage.evaluate((chatid) => {\n            return window.WWebJS.deletePicture(chatid);\n        }, this.id._serialized);\n\n        return success;\n    }\n\n    /**\n     * Sets the group's picture.\n     * @param {MessageMedia} media\n     * @returns {Promise<boolean>} Returns true if the picture was properly updated. This can return false if the user does not have the necessary permissions.\n     */\n    async setPicture(media) {\n        const success = await this.client.pupPage.evaluate(\n            (chatid, media) => {\n                return window.WWebJS.setPicture(chatid, media);\n            },\n            this.id._serialized,\n            media,\n        );\n\n        return success;\n    }\n\n    /**\n     * Gets the invite code for a specific group\n     * @returns {Promise<string>} Group's invite code\n     */\n    async getInviteCode() {\n        const codeRes = await this.client.pupPage.evaluate(async (chatId) => {\n            try {\n                return await window\n                    .require('WAWebMexFetchGroupInviteCodeJob')\n                    .fetchMexGroupInviteCode(chatId);\n            } catch (err) {\n                if (err.name === 'ServerStatusCodeError') return undefined;\n                throw err;\n            }\n        }, this.id._serialized);\n\n        return codeRes?.code ? codeRes?.code : codeRes;\n    }\n\n    /**\n     * Invalidates the current group invite code and generates a new one\n     * @returns {Promise<string>} New invite code\n     */\n    async revokeInvite() {\n        const codeRes = await this.client.pupPage.evaluate((chatId) => {\n            const chatWid = window.require('WAWebWidFactory').createWid(chatId);\n            return window\n                .require('WAWebGroupQueryJob')\n                .resetGroupInviteCode(chatWid);\n        }, this.id._serialized);\n\n        return codeRes.code;\n    }\n\n    /**\n     * An object that handles the information about the group membership request\n     * @typedef {Object} GroupMembershipRequest\n     * @property {Object} id The wid of a user who requests to enter the group\n     * @property {Object} addedBy The wid of a user who created that request\n     * @property {Object|null} parentGroupId The wid of a community parent group to which the current group is linked\n     * @property {string} requestMethod The method used to create the request: NonAdminAdd/InviteLink/LinkedGroupJoin\n     * @property {number} t The timestamp the request was created at\n     */\n\n    /**\n     * Gets an array of membership requests\n     * @returns {Promise<Array<GroupMembershipRequest>>} An array of membership requests\n     */\n    async getGroupMembershipRequests() {\n        return await this.client.getGroupMembershipRequests(\n            this.id._serialized,\n        );\n    }\n\n    /**\n     * An object that handles the result for membership request action\n     * @typedef {Object} MembershipRequestActionResult\n     * @property {string} requesterId User ID whos membership request was approved/rejected\n     * @property {number} error An error code that occurred during the operation for the participant\n     * @property {string} message A message with a result of membership request action\n     */\n\n    /**\n     * An object that handles options for {@link approveGroupMembershipRequests} and {@link rejectGroupMembershipRequests} methods\n     * @typedef {Object} MembershipRequestActionOptions\n     * @property {Array<string>|string|null} requesterIds User ID/s who requested to join the group, if no value is provided, the method will search for all membership requests for that group\n     * @property {Array<number>|number|null} sleep The number of milliseconds to wait before performing an operation for the next requester. If it is an array, a random sleep time between the sleep[0] and sleep[1] values will be added (the difference must be >=100 ms, otherwise, a random sleep time between sleep[1] and sleep[1] + 100 will be added). If sleep is a number, a sleep time equal to its value will be added. By default, sleep is an array with a value of [250, 500]\n     */\n\n    /**\n     * Approves membership requests if any\n     * @param {MembershipRequestActionOptions} options Options for performing a membership request action\n     * @returns {Promise<Array<MembershipRequestActionResult>>} Returns an array of requester IDs whose membership requests were approved and an error for each requester, if any occurred during the operation. If there are no requests, an empty array will be returned\n     */\n    async approveGroupMembershipRequests(options = {}) {\n        return await this.client.approveGroupMembershipRequests(\n            this.id._serialized,\n            options,\n        );\n    }\n\n    /**\n     * Rejects membership requests if any\n     * @param {MembershipRequestActionOptions} options Options for performing a membership request action\n     * @returns {Promise<Array<MembershipRequestActionResult>>} Returns an array of requester IDs whose membership requests were rejected and an error for each requester, if any occurred during the operation. If there are no requests, an empty array will be returned\n     */\n    async rejectGroupMembershipRequests(options = {}) {\n        return await this.client.rejectGroupMembershipRequests(\n            this.id._serialized,\n            options,\n        );\n    }\n\n    /**\n     * Makes the bot leave the group\n     * @returns {Promise}\n     */\n    async leave() {\n        await this.client.pupPage.evaluate(async (chatId) => {\n            const chat = await window.WWebJS.getChat(chatId, {\n                getAsModel: false,\n            });\n            return window.require('WAWebExitGroupAction').sendExitGroup(chat);\n        }, this.id._serialized);\n    }\n}\n\nmodule.exports = GroupChat;\n"
  },
  {
    "path": "src/structures/GroupNotification.js",
    "content": "'use strict';\n\nconst Base = require('./Base');\n\n/**\n * Represents a GroupNotification on WhatsApp\n * @extends {Base}\n */\nclass GroupNotification extends Base {\n    constructor(client, data) {\n        super(client);\n\n        if (data) this._patch(data);\n    }\n\n    _patch(data) {\n        /**\n         * ID that represents the groupNotification\n         * @type {object}\n         */\n        this.id = data.id;\n\n        /**\n         * Extra content\n         * @type {string}\n         */\n        this.body = data.body || '';\n\n        /**\n         * GroupNotification type\n         * @type {GroupNotificationTypes}\n         */\n        this.type = data.subtype;\n\n        /**\n         * Unix timestamp for when the groupNotification was created\n         * @type {number}\n         */\n        this.timestamp = data.t;\n\n        /**\n         * ID for the Chat that this groupNotification was sent for.\n         *\n         * @type {string}\n         */\n        this.chatId =\n            typeof data.id.remote === 'object'\n                ? data.id.remote._serialized\n                : data.id.remote;\n\n        /**\n         * ContactId for the user that produced the GroupNotification.\n         * @type {string}\n         */\n        this.author =\n            typeof data.author === 'object'\n                ? data.author._serialized\n                : data.author;\n\n        /**\n         * Contact IDs for the users that were affected by this GroupNotification.\n         * @type {Array<string>}\n         */\n        this.recipientIds = [];\n\n        if (data.recipients) {\n            this.recipientIds = data.recipients;\n        }\n\n        return super._patch(data);\n    }\n\n    /**\n     * Returns the Chat this groupNotification was sent in\n     * @returns {Promise<Chat>}\n     */\n    getChat() {\n        return this.client.getChatById(this.chatId);\n    }\n\n    /**\n     * Returns the Contact this GroupNotification was produced by\n     * @returns {Promise<Contact>}\n     */\n    getContact() {\n        return this.client.getContactById(this.author);\n    }\n\n    /**\n     * Returns the Contacts affected by this GroupNotification.\n     * @returns {Promise<Array<Contact>>}\n     */\n    async getRecipients() {\n        return await Promise.all(\n            this.recipientIds.map(\n                async (m) => await this.client.getContactById(m),\n            ),\n        );\n    }\n\n    /**\n     * Sends a message to the same chat this GroupNotification was produced in.\n     *\n     * @param {string|MessageMedia|Location} content\n     * @param {object} options\n     * @returns {Promise<Message>}\n     */\n    async reply(content, options = {}) {\n        return this.client.sendMessage(this.chatId, content, options);\n    }\n}\n\nmodule.exports = GroupNotification;\n"
  },
  {
    "path": "src/structures/Label.js",
    "content": "'use strict';\n\nconst Base = require('./Base');\n// eslint-disable-next-line no-unused-vars\nconst Chat = require('./Chat');\n\n/**\n * WhatsApp Business Label information\n */\nclass Label extends Base {\n    /**\n     * @param {Base} client\n     * @param {object} labelData\n     */\n    constructor(client, labelData) {\n        super(client);\n\n        if (labelData) this._patch(labelData);\n    }\n\n    _patch(labelData) {\n        /**\n         * Label ID\n         * @type {string}\n         */\n        this.id = labelData.id;\n\n        /**\n         * Label name\n         * @type {string}\n         */\n        this.name = labelData.name;\n\n        /**\n         * Label hex color\n         * @type {string}\n         */\n        this.hexColor = labelData.hexColor;\n    }\n    /**\n     * Get all chats that have been assigned this Label\n     * @returns {Promise<Array<Chat>>}\n     */\n    async getChats() {\n        return this.client.getChatsByLabelId(this.id);\n    }\n}\n\nmodule.exports = Label;\n"
  },
  {
    "path": "src/structures/List.js",
    "content": "'use strict';\n\nconst Util = require('../util/Util');\n\n/**\n * Message type List\n */\nclass List {\n    /**\n     * @param {string} body\n     * @param {string} buttonText\n     * @param {Array<any>} sections\n     * @param {string?} title\n     * @param {string?} footer\n     */\n    constructor(body, buttonText, sections, title, footer) {\n        /**\n         * Message body\n         * @type {string}\n         */\n        this.description = body;\n\n        /**\n         * List button text\n         * @type {string}\n         */\n        this.buttonText = buttonText;\n\n        /**\n         * title of message\n         * @type {string}\n         */\n        this.title = title;\n\n        /**\n         * footer of message\n         * @type {string}\n         */\n        this.footer = footer;\n\n        /**\n         * sections of message\n         * @type {Array<any>}\n         */\n        this.sections = this._format(sections);\n    }\n\n    /**\n     * Creates section array from simple array\n     * @param {Array<any>} sections\n     * @returns {Array<any>}\n     * @example\n     * Input: [{title:'sectionTitle',rows:[{id:'customId', title:'ListItem2', description: 'desc'},{title:'ListItem2'}]}}]\n     * Returns: [{'title':'sectionTitle','rows':[{'rowId':'customId','title':'ListItem1','description':'desc'},{'rowId':'oGSRoD','title':'ListItem2','description':''}]}]\n     */\n    _format(sections) {\n        if (!sections.length) {\n            throw '[LT02] List without sections';\n        }\n        if (\n            sections.length > 1 &&\n            sections.filter((s) => typeof s.title == 'undefined').length > 1\n        ) {\n            throw \"[LT05] You can't have more than one empty title.\";\n        }\n        return sections.map((section) => {\n            if (!section.rows.length) {\n                throw '[LT03] Section without rows';\n            }\n            return {\n                title: section.title ? section.title : undefined,\n                rows: section.rows.map((row) => {\n                    if (!row.title) {\n                        throw '[LT04] Row without title';\n                    }\n                    return {\n                        rowId: row.id ? row.id : Util.generateHash(6),\n                        title: row.title,\n                        description: row.description ? row.description : '',\n                    };\n                }),\n            };\n        });\n    }\n}\n\nmodule.exports = List;\n"
  },
  {
    "path": "src/structures/Location.js",
    "content": "'use strict';\n\n/**\n * Location send options\n * @typedef {Object} LocationSendOptions\n * @property {string} [name] Location name\n * @property {string} [address] Location address\n * @property {string} [url] URL address to be shown within a location message\n * @property {string} [description] Location full description\n */\n\n/**\n * Location information\n */\nclass Location {\n    /**\n     * @param {number} latitude\n     * @param {number} longitude\n     * @param {LocationSendOptions} [options] Location send options\n     */\n    constructor(latitude, longitude, options = {}) {\n        /**\n         * Location latitude\n         * @type {number}\n         */\n        this.latitude = latitude;\n\n        /**\n         * Location longitude\n         * @type {number}\n         */\n        this.longitude = longitude;\n\n        /**\n         * Name for the location\n         * @type {string|undefined}\n         */\n        this.name = options.name;\n\n        /**\n         * Location address\n         * @type {string|undefined}\n         */\n        this.address = options.address;\n\n        /**\n         * URL address to be shown within a location message\n         * @type {string|undefined}\n         */\n        this.url = options.url;\n\n        /**\n         * Location full description\n         * @type {string|undefined}\n         */\n        this.description =\n            this.name && this.address\n                ? `${this.name}\\n${this.address}`\n                : this.name || this.address || '';\n    }\n}\n\nmodule.exports = Location;\n"
  },
  {
    "path": "src/structures/Message.js",
    "content": "'use strict';\n\nconst Base = require('./Base');\nconst MessageMedia = require('./MessageMedia');\nconst Location = require('./Location');\nconst Order = require('./Order');\nconst Payment = require('./Payment');\nconst Reaction = require('./Reaction');\nconst Contact = require('./Contact');\nconst ScheduledEvent = require('./ScheduledEvent'); // eslint-disable-line no-unused-vars\nconst { MessageTypes } = require('../util/Constants');\n\n/**\n * Represents a Message on WhatsApp\n * @extends {Base}\n */\nclass Message extends Base {\n    constructor(client, data) {\n        super(client);\n\n        if (data) this._patch(data);\n    }\n\n    _patch(data) {\n        this._data = data;\n\n        /**\n         * MediaKey that represents the sticker 'ID'\n         * @type {string}\n         */\n        this.mediaKey = data.mediaKey;\n\n        /**\n         * ID that represents the message\n         * @type {object}\n         */\n        this.id = data.id;\n\n        /**\n         * ACK status for the message\n         * @type {MessageAck}\n         */\n        this.ack = data.ack;\n\n        /**\n         * Indicates if the message has media available for download\n         * @type {boolean}\n         */\n        this.hasMedia = Boolean(data.directPath);\n\n        /**\n         * Message content\n         * @type {string}\n         */\n        this.body = this.hasMedia\n            ? data.caption || ''\n            : data.body || data.pollName || data.eventName || '';\n\n        /**\n         * Message type\n         * @type {MessageTypes}\n         */\n        this.type = data.type;\n\n        /**\n         * Unix timestamp for when the message was created\n         * @type {number}\n         */\n        this.timestamp = data.t;\n\n        /**\n         * ID for the Chat that this message was sent to, except if the message was sent by the current user.\n         * @type {string}\n         */\n        this.from =\n            typeof data.from === 'object' && data.from !== null\n                ? data.from._serialized\n                : data.from;\n\n        /**\n         * ID for who this message is for.\n         *\n         * If the message is sent by the current user, it will be the Chat to which the message is being sent.\n         * If the message is sent by another user, it will be the ID for the current user.\n         * @type {string}\n         */\n        this.to =\n            typeof data.to === 'object' && data.to !== null\n                ? data.to._serialized\n                : data.to;\n\n        /**\n         * If the message was sent to a group, this field will contain the user that sent the message.\n         * @type {string}\n         */\n        this.author =\n            typeof data.author === 'object' && data.author !== null\n                ? data.author._serialized\n                : data.author;\n\n        /**\n         * String that represents from which device type the message was sent\n         * @type {string}\n         */\n        this.deviceType =\n            typeof data.id.id === 'string' && data.id.id.length > 21\n                ? 'android'\n                : typeof data.id.id === 'string' &&\n                    data.id.id.substring(0, 2) === '3A'\n                  ? 'ios'\n                  : 'web';\n        /**\n         * Indicates if the message was forwarded\n         * @type {boolean}\n         */\n        this.isForwarded = data.isForwarded;\n\n        /**\n         * Indicates how many times the message was forwarded.\n         *\n         * The maximum value is 127.\n         * @type {number}\n         */\n        this.forwardingScore = data.forwardingScore || 0;\n\n        /**\n         * Indicates if the message is a status update\n         * @type {boolean}\n         */\n        this.isStatus =\n            data.isStatusV3 || data.id.remote === 'status@broadcast';\n\n        /**\n         * Indicates if the message was starred\n         * @type {boolean}\n         */\n        this.isStarred = data.star;\n\n        /**\n         * Indicates if the message was a broadcast\n         * @type {boolean}\n         */\n        this.broadcast = data.broadcast;\n\n        /**\n         * Indicates if the message was sent by the current user\n         * @type {boolean}\n         */\n        this.fromMe = data.id.fromMe;\n\n        /**\n         * Indicates if the message was sent as a reply to another message.\n         * @type {boolean}\n         */\n        this.hasQuotedMsg = data.quotedMsg ? true : false;\n\n        /**\n         * Indicates whether there are reactions to the message\n         * @type {boolean}\n         */\n        this.hasReaction = data.hasReaction ? true : false;\n\n        /**\n         * Indicates the duration of the message in seconds\n         * @type {string}\n         */\n        this.duration = data.duration ? data.duration : undefined;\n\n        /**\n         * Location information contained in the message, if the message is type \"location\"\n         * @type {Location}\n         */\n        this.location = (() => {\n            if (data.type !== MessageTypes.LOCATION) {\n                return undefined;\n            }\n            let description;\n            if (data.loc && typeof data.loc === 'string') {\n                let splitted = data.loc.split('\\n');\n                description = {\n                    name: splitted[0],\n                    address: splitted[1],\n                    url: data.clientUrl,\n                };\n            }\n            return new Location(data.lat, data.lng, description);\n        })();\n\n        /**\n         * List of vCards contained in the message.\n         * @type {Array<string>}\n         */\n        this.vCards =\n            data.type === MessageTypes.CONTACT_CARD_MULTI\n                ? data.vcardList.map((c) => c.vcard)\n                : data.type === MessageTypes.CONTACT_CARD\n                  ? [data.body]\n                  : [];\n\n        /**\n         * Group Invite Data\n         * @type {object}\n         */\n        this.inviteV4 =\n            data.type === MessageTypes.GROUP_INVITE\n                ? {\n                      inviteCode: data.inviteCode,\n                      inviteCodeExp: data.inviteCodeExp,\n                      groupId: data.inviteGrp,\n                      groupName: data.inviteGrpName,\n                      fromId:\n                          typeof data.from === 'object' &&\n                          '_serialized' in data.from\n                              ? data.from._serialized\n                              : data.from,\n                      toId:\n                          typeof data.to === 'object' &&\n                          '_serialized' in data.to\n                              ? data.to._serialized\n                              : data.to,\n                  }\n                : undefined;\n\n        /**\n         * Indicates the mentions in the message body.\n         * @type {string[]}\n         */\n        this.mentionedIds = data.mentionedJidList || [];\n\n        /**\n         * @typedef {Object} GroupMention\n         * @property {string} groupSubject The name  of the group\n         * @property {string} groupJid The group ID\n         */\n\n        /**\n         * Indicates whether there are group mentions in the message body\n         * @type {GroupMention[]}\n         */\n        this.groupMentions = data.groupMentions || [];\n\n        /**\n         * Order ID for message type ORDER\n         * @type {string}\n         */\n        this.orderId = data.orderId ? data.orderId : undefined;\n        /**\n         * Order Token for message type ORDER\n         * @type {string}\n         */\n        this.token = data.token ? data.token : undefined;\n\n        /**\n         * Indicates whether the message is a Gif\n         * @type {boolean}\n         */\n        this.isGif = Boolean(data.isGif);\n\n        /**\n         * Indicates if the message will disappear after it expires\n         * @type {boolean}\n         */\n        this.isEphemeral = data.isEphemeral;\n\n        /** Title */\n        if (data.title) {\n            this.title = data.title;\n        }\n\n        /** Description */\n        if (data.description) {\n            this.description = data.description;\n        }\n\n        /** Business Owner JID */\n        if (data.businessOwnerJid) {\n            this.businessOwnerJid = data.businessOwnerJid;\n        }\n\n        /** Product ID */\n        if (data.productId) {\n            this.productId = data.productId;\n        }\n\n        /** Last edit time */\n        if (data.latestEditSenderTimestampMs) {\n            this.latestEditSenderTimestampMs = data.latestEditSenderTimestampMs;\n        }\n\n        /** Last edit message author */\n        if (data.latestEditMsgKey) {\n            this.latestEditMsgKey = data.latestEditMsgKey;\n        }\n\n        /**\n         * Protocol message key.\n         * Can be used to retrieve the ID of an original message that was revoked.\n         */\n        if (data.protocolMessageKey) {\n            this.protocolMessageKey = data.protocolMessageKey;\n        }\n\n        /**\n         * Links included in the message.\n         * @type {Array<{link: string, isSuspicious: boolean}>}\n         *\n         */\n        this.links = data.links;\n\n        /** Buttons */\n        if (data.dynamicReplyButtons) {\n            this.dynamicReplyButtons = data.dynamicReplyButtons;\n        }\n\n        /** Selected Button Id **/\n        if (data.selectedButtonId) {\n            this.selectedButtonId = data.selectedButtonId;\n        }\n\n        /** Selected List row Id **/\n        if (\n            data.listResponse &&\n            data.listResponse.singleSelectReply.selectedRowId\n        ) {\n            this.selectedRowId =\n                data.listResponse.singleSelectReply.selectedRowId;\n        }\n\n        if (this.type === MessageTypes.POLL_CREATION) {\n            this.pollName = data.pollName;\n            this.pollOptions = data.pollOptions;\n            this.allowMultipleAnswers = Boolean(\n                !data.pollSelectableOptionsCount,\n            );\n            this.pollInvalidated = data.pollInvalidated;\n            this.isSentCagPollCreation = data.isSentCagPollCreation;\n            this.messageSecret = data.messageSecret\n                ? Object.keys(data.messageSecret).map(\n                      (key) => data.messageSecret[key],\n                  )\n                : [];\n        }\n\n        return super._patch(data);\n    }\n\n    _getChatId() {\n        return this.fromMe ? this.to : this.from;\n    }\n\n    /**\n     * Reloads this Message object's data in-place with the latest values from WhatsApp Web.\n     * Note that the Message must still be in the web app cache for this to work, otherwise will return null.\n     * @returns {Promise<Message>}\n     */\n    async reload() {\n        const newData = await this.client.pupPage.evaluate(async (msgId) => {\n            const msg =\n                window.require('WAWebCollections').Msg.get(msgId) ||\n                (\n                    await window\n                        .require('WAWebCollections')\n                        .Msg.getMessagesById([msgId])\n                )?.messages?.[0];\n            if (!msg) return null;\n            return window.WWebJS.getMessageModel(msg);\n        }, this.id._serialized);\n\n        if (!newData) return null;\n\n        this._patch(newData);\n        return this;\n    }\n\n    /**\n     * Returns message in a raw format\n     * @type {Object}\n     */\n    get rawData() {\n        return this._data;\n    }\n\n    /**\n     * Returns the Chat this message was sent in\n     * @returns {Promise<Chat>}\n     */\n    getChat() {\n        return this.client.getChatById(this._getChatId());\n    }\n\n    /**\n     * Returns the Contact this message was sent from\n     * @returns {Promise<Contact>}\n     */\n    getContact() {\n        return this.client.getContactById(this.author || this.from);\n    }\n\n    /**\n     * Returns the Contacts mentioned in this message\n     * @returns {Promise<Array<Contact>>}\n     */\n    async getMentions() {\n        return await Promise.all(\n            this.mentionedIds.map(\n                async (m) =>\n                    await this.client.getContactById(\n                        typeof m === 'string' ? m : m._serialized,\n                    ),\n            ),\n        );\n    }\n\n    /**\n     * Returns groups mentioned in this message\n     * @returns {Promise<Array<GroupChat>>}\n     */\n    async getGroupMentions() {\n        return await Promise.all(\n            this.groupMentions.map(\n                async (m) =>\n                    await this.client.getChatById(m.groupJid._serialized),\n            ),\n        );\n    }\n\n    /**\n     * Returns the quoted message, if any\n     * @returns {Promise<Message>}\n     */\n    async getQuotedMessage() {\n        if (!this.hasQuotedMsg) return undefined;\n\n        const quotedMsg = await this.client.pupPage.evaluate(async (msgId) => {\n            const msg =\n                window.require('WAWebCollections').Msg.get(msgId) ||\n                (\n                    await window\n                        .require('WAWebCollections')\n                        .Msg.getMessagesById([msgId])\n                )?.messages?.[0];\n            const quotedMsg = window\n                .require('WAWebQuotedMsgModelUtils')\n                .getQuotedMsgObj(msg);\n            return window.WWebJS.getMessageModel(quotedMsg);\n        }, this.id._serialized);\n\n        return new Message(this.client, quotedMsg);\n    }\n\n    /**\n     * Sends a message as a reply to this message. If chatId is specified, it will be sent\n     * through the specified Chat. If not, it will send the message\n     * in the same Chat as the original message was sent.\n     *\n     * @param {string|MessageMedia|Location} content\n     * @param {string} [chatId]\n     * @param {MessageSendOptions} [options]\n     * @returns {Promise<Message>}\n     */\n    async reply(content, chatId, options = {}) {\n        if (!chatId) {\n            chatId = this._getChatId();\n        }\n\n        options = {\n            ...options,\n            quotedMessageId: this.id._serialized,\n        };\n\n        return this.client.sendMessage(chatId, content, options);\n    }\n\n    /**\n     * React to this message with an emoji\n     * @param {string} reaction - Emoji to react with. Send an empty string to remove the reaction.\n     * @return {Promise}\n     */\n    async react(reaction) {\n        await this.client.pupPage.evaluate(\n            async (messageId, reaction) => {\n                if (!messageId) return null;\n                const msg =\n                    window.require('WAWebCollections').Msg.get(messageId) ||\n                    (\n                        await window\n                            .require('WAWebCollections')\n                            .Msg.getMessagesById([messageId])\n                    )?.messages?.[0];\n                if (!msg) return null;\n                await window\n                    .require('WAWebSendReactionMsgAction')\n                    .sendReactionToMsg(msg, reaction);\n            },\n            this.id._serialized,\n            reaction,\n        );\n    }\n\n    /**\n     * Accept Group V4 Invite\n     * @returns {Promise<Object>}\n     */\n    async acceptGroupV4Invite() {\n        return await this.client.acceptGroupV4Invite(this.inviteV4);\n    }\n\n    /**\n     * Forwards this message to another chat (that you chatted before, otherwise it will fail)\n     *\n     * @param {string|Chat} chat Chat model or chat ID to which the message will be forwarded\n     * @returns {Promise}\n     */\n    async forward(chat) {\n        const chatId = typeof chat === 'string' ? chat : chat.id._serialized;\n\n        await this.client.pupPage.evaluate(\n            async (msgId, chatId) => {\n                return window.WWebJS.forwardMessage(chatId, msgId);\n            },\n            this.id._serialized,\n            chatId,\n        );\n    }\n\n    /**\n     * Downloads and returns the attatched message media\n     * @returns {Promise<MessageMedia>}\n     */\n    async downloadMedia() {\n        if (!this.hasMedia) {\n            return undefined;\n        }\n\n        const result = await this.client.pupPage.evaluate(async (msgId) => {\n            const msg =\n                window.require('WAWebCollections').Msg.get(msgId) ||\n                (\n                    await window\n                        .require('WAWebCollections')\n                        .Msg.getMessagesById([msgId])\n                )?.messages?.[0];\n\n            // REUPLOADING mediaStage means the media is expired and the download button is spinning, cannot be downloaded now\n            if (\n                !msg ||\n                !msg.mediaData ||\n                msg.mediaData.mediaStage === 'REUPLOADING'\n            ) {\n                return null;\n            }\n            if (msg.mediaData.mediaStage != 'RESOLVED') {\n                // try to resolve media\n                await msg.downloadMedia({\n                    downloadEvenIfExpensive: true,\n                    rmrReason: 1,\n                });\n            }\n\n            if (\n                msg.mediaData.mediaStage.includes('ERROR') ||\n                msg.mediaData.mediaStage === 'FETCHING'\n            ) {\n                // media could not be downloaded\n                return undefined;\n            }\n\n            try {\n                const mockQpl = {\n                    addAnnotations: function () {\n                        return this;\n                    },\n                    addPoint: function () {\n                        return this;\n                    },\n                };\n                const decryptedMedia = await window\n                    .require('WAWebDownloadManager')\n                    .downloadManager.downloadAndMaybeDecrypt({\n                        directPath: msg.directPath,\n                        encFilehash: msg.encFilehash,\n                        filehash: msg.filehash,\n                        mediaKey: msg.mediaKey,\n                        mediaKeyTimestamp: msg.mediaKeyTimestamp,\n                        type: msg.type,\n                        signal: new AbortController().signal,\n                        downloadQpl: mockQpl,\n                    });\n\n                const data =\n                    await window.WWebJS.arrayBufferToBase64Async(\n                        decryptedMedia,\n                    );\n\n                return {\n                    data,\n                    mimetype: msg.mimetype,\n                    filename: msg.filename,\n                    filesize: msg.size,\n                };\n            } catch (e) {\n                if (e.status && e.status === 404) return undefined;\n                throw e;\n            }\n        }, this.id._serialized);\n\n        if (!result) return undefined;\n        return new MessageMedia(\n            result.mimetype,\n            result.data,\n            result.filename,\n            result.filesize,\n        );\n    }\n\n    /**\n     * Deletes a message from the chat\n     * @param {?boolean} everyone If true and the message is sent by the current user or the user is an admin, will delete it for everyone in the chat.\n     * @param {?boolean} [clearMedia = true] If true, any associated media will also be deleted from a device.\n     */\n    async delete(everyone, clearMedia = true) {\n        await this.client.pupPage.evaluate(\n            async (msgId, everyone, clearMedia) => {\n                const msg =\n                    window.require('WAWebCollections').Msg.get(msgId) ||\n                    (\n                        await window\n                            .require('WAWebCollections')\n                            .Msg.getMessagesById([msgId])\n                    )?.messages?.[0];\n                const chat =\n                    window\n                        .require('WAWebCollections')\n                        .Chat.get(msg.id.remote) ||\n                    (await window\n                        .require('WAWebCollections')\n                        .Chat.find(msg.id.remote));\n\n                const canRevoke =\n                    window\n                        .require('WAWebMsgActionCapability')\n                        .canSenderRevokeMsg(msg) ||\n                    window\n                        .require('WAWebMsgActionCapability')\n                        .canAdminRevokeMsg(msg);\n\n                const { Cmd } = window.require('WAWebCmd');\n\n                if (everyone && canRevoke) {\n                    return window.WWebJS.compareWwebVersions(\n                        window.Debug.VERSION,\n                        '>=',\n                        '2.3000.0',\n                    )\n                        ? Cmd.sendRevokeMsgs(\n                              chat,\n                              { list: [msg], type: 'message' },\n                              { clearMedia: clearMedia },\n                          )\n                        : Cmd.sendRevokeMsgs(chat, [msg], {\n                              clearMedia: true,\n                              type: msg.id.fromMe ? 'Sender' : 'Admin',\n                          });\n                }\n\n                return window.WWebJS.compareWwebVersions(\n                    window.Debug.VERSION,\n                    '>=',\n                    '2.3000.0',\n                )\n                    ? Cmd.sendDeleteMsgs(\n                          chat,\n                          { list: [msg], type: 'message' },\n                          clearMedia,\n                      )\n                    : Cmd.sendDeleteMsgs(chat, [msg], clearMedia);\n            },\n            this.id._serialized,\n            everyone,\n            clearMedia,\n        );\n    }\n\n    /**\n     * Stars this message\n     */\n    async star() {\n        await this.client.pupPage.evaluate(async (msgId) => {\n            const msg =\n                window.require('WAWebCollections').Msg.get(msgId) ||\n                (\n                    await window\n                        .require('WAWebCollections')\n                        .Msg.getMessagesById([msgId])\n                )?.messages?.[0];\n            if (window.require('WAWebMsgActionCapability').canStarMsg(msg)) {\n                let chat = await window\n                    .require('WAWebCollections')\n                    .Chat.find(msg.id.remote);\n                return window\n                    .require('WAWebCmd')\n                    .Cmd.sendStarMsgs(chat, [msg], false);\n            }\n        }, this.id._serialized);\n    }\n\n    /**\n     * Unstars this message\n     */\n    async unstar() {\n        await this.client.pupPage.evaluate(async (msgId) => {\n            const msg =\n                window.require('WAWebCollections').Msg.get(msgId) ||\n                (\n                    await window\n                        .require('WAWebCollections')\n                        .Msg.getMessagesById([msgId])\n                )?.messages?.[0];\n            if (window.require('WAWebMsgActionCapability').canStarMsg(msg)) {\n                let chat = await window\n                    .require('WAWebCollections')\n                    .Chat.find(msg.id.remote);\n                return window\n                    .require('WAWebCmd')\n                    .Cmd.sendUnstarMsgs(chat, [msg], false);\n            }\n        }, this.id._serialized);\n    }\n\n    /**\n     * Pins the message (group admins can pin messages of all group members)\n     * @param {number} duration The duration in seconds the message will be pinned in a chat\n     * @returns {Promise<boolean>} Returns true if the operation completed successfully, false otherwise\n     */\n    async pin(duration) {\n        return await this.client.pupPage.evaluate(\n            async (msgId, duration) => {\n                return await window.WWebJS.pinUnpinMsgAction(\n                    msgId,\n                    1,\n                    duration,\n                );\n            },\n            this.id._serialized,\n            duration,\n        );\n    }\n\n    /**\n     * Unpins the message (group admins can unpin messages of all group members)\n     * @returns {Promise<boolean>} Returns true if the operation completed successfully, false otherwise\n     */\n    async unpin() {\n        return await this.client.pupPage.evaluate(async (msgId) => {\n            return await window.WWebJS.pinUnpinMsgAction(msgId, 2, 0);\n        }, this.id._serialized);\n    }\n\n    /**\n     * Message Info\n     * @typedef {Object} MessageInfo\n     * @property {Array<{id: ContactId, t: number}>} delivery Contacts to which the message has been delivered to\n     * @property {number} deliveryRemaining Amount of people to whom the message has not been delivered to\n     * @property {Array<{id: ContactId, t: number}>} played Contacts who have listened to the voice message\n     * @property {number} playedRemaining Amount of people who have not listened to the message\n     * @property {Array<{id: ContactId, t: number}>} read Contacts who have read the message\n     * @property {number} readRemaining Amount of people who have not read the message\n     */\n\n    /**\n     * Get information about message delivery status.\n     * May return null if the message does not exist or is not sent by you.\n     * @returns {Promise<?MessageInfo>}\n     */\n    async getInfo() {\n        const info = await this.client.pupPage.evaluate(async (msgId) => {\n            const msg =\n                window.require('WAWebCollections').Msg.get(msgId) ||\n                (\n                    await window\n                        .require('WAWebCollections')\n                        .Msg.getMessagesById([msgId])\n                )?.messages?.[0];\n            if (!msg || !msg.id.fromMe) return null;\n\n            return new Promise((resolve) => {\n                setTimeout(\n                    async () => {\n                        resolve(\n                            await window\n                                .require('WAWebApiMessageInfoStore')\n                                .queryMsgInfo(msg.id),\n                        );\n                    },\n                    (Date.now() - msg.t * 1000 < 1250 &&\n                        Math.floor(Math.random() * (1200 - 1100 + 1)) + 1100) ||\n                        0,\n                );\n            });\n        }, this.id._serialized);\n\n        return info;\n    }\n\n    /**\n     * Gets the order associated with a given message\n     * @return {Promise<Order>}\n     */\n    async getOrder() {\n        if (this.type === MessageTypes.ORDER) {\n            const result = await this.client.pupPage.evaluate(\n                (orderId, token, chatId) => {\n                    return window.WWebJS.getOrderDetail(orderId, token, chatId);\n                },\n                this.orderId,\n                this.token,\n                this._getChatId(),\n            );\n            if (!result) return undefined;\n            return new Order(this.client, result);\n        }\n        return undefined;\n    }\n    /**\n     * Gets the payment details associated with a given message\n     * @return {Promise<Payment>}\n     */\n    async getPayment() {\n        if (this.type === MessageTypes.PAYMENT) {\n            const msg = await this.client.pupPage.evaluate(async (msgId) => {\n                const msg =\n                    window.require('WAWebCollections').Msg.get(msgId) ||\n                    (\n                        await window\n                            .require('WAWebCollections')\n                            .Msg.getMessagesById([msgId])\n                    )?.messages?.[0];\n                if (!msg) return null;\n                return msg.serialize();\n            }, this.id._serialized);\n            return new Payment(this.client, msg);\n        }\n        return undefined;\n    }\n\n    /**\n     * Reaction List\n     * @typedef {Object} ReactionList\n     * @property {string} id Original emoji\n     * @property {string} aggregateEmoji aggregate emoji\n     * @property {boolean} hasReactionByMe Flag who sent the reaction\n     * @property {Array<Reaction>} senders Reaction senders, to this message\n     */\n\n    /**\n     * Gets the reactions associated with the given message\n     * @return {Promise<ReactionList[]>}\n     */\n    async getReactions() {\n        if (!this.hasReaction) {\n            return undefined;\n        }\n\n        const reactions = await this.client.pupPage.evaluate(async (msgId) => {\n            const msgReactions = await window\n                .require('WAWebCollections')\n                .Reactions.find(msgId);\n            if (!msgReactions || !msgReactions.reactions.length) return null;\n            return msgReactions.reactions.serialize();\n        }, this.id._serialized);\n\n        if (!reactions) {\n            return undefined;\n        }\n\n        return reactions.map((reaction) => {\n            reaction.senders = reaction.senders.map((sender) => {\n                sender.timestamp = Math.round(sender.timestamp / 1000);\n                return new Reaction(this.client, sender);\n            });\n            return reaction;\n        });\n    }\n\n    /**\n     * Edits the current message.\n     * @param {string} content\n     * @param {MessageEditOptions} [options] - Options used when editing the message\n     * @returns {Promise<?Message>}\n     */\n    async edit(content, options = {}) {\n        if (options.mentions) {\n            !Array.isArray(options.mentions) &&\n                (options.mentions = [options.mentions]);\n            if (\n                options.mentions.some(\n                    (possiblyContact) => possiblyContact instanceof Contact,\n                )\n            ) {\n                console.warn(\n                    'Mentions with an array of Contact are now deprecated. See more at https://github.com/pedroslopez/whatsapp-web.js/pull/2166.',\n                );\n                options.mentions = options.mentions.map(\n                    (a) => a.id._serialized,\n                );\n            }\n        }\n\n        options.groupMentions &&\n            !Array.isArray(options.groupMentions) &&\n            (options.groupMentions = [options.groupMentions]);\n\n        let internalOptions = {\n            linkPreview: options.linkPreview === false ? undefined : true,\n            mentionedJidList: options.mentions || [],\n            groupMentions: options.groupMentions,\n            extraOptions: options.extra,\n        };\n\n        if (!this.fromMe) {\n            return null;\n        }\n        const messageEdit = await this.client.pupPage.evaluate(\n            async (msgId, message, options) => {\n                const msg =\n                    window.require('WAWebCollections').Msg.get(msgId) ||\n                    (\n                        await window\n                            .require('WAWebCollections')\n                            .Msg.getMessagesById([msgId])\n                    )?.messages?.[0];\n                if (!msg) return null;\n\n                let canEdit =\n                    window\n                        .require('WAWebMsgActionCapability')\n                        .canEditText(msg) ||\n                    window\n                        .require('WAWebMsgActionCapability')\n                        .canEditCaption(msg);\n                if (canEdit) {\n                    const msgEdit = await window.WWebJS.editMessage(\n                        msg,\n                        message,\n                        options,\n                    );\n                    return msgEdit.serialize();\n                }\n                return null;\n            },\n            this.id._serialized,\n            content,\n            internalOptions,\n        );\n        if (messageEdit) {\n            return new Message(this.client, messageEdit);\n        }\n        return null;\n    }\n\n    /**\n     * Edits the current ScheduledEvent message.\n     * Once the scheduled event is canceled, it can not be edited.\n     * @param {ScheduledEvent} editedEventObject\n     * @returns {Promise<?Message>}\n     */\n    async editScheduledEvent(editedEventObject) {\n        if (!this.fromMe) {\n            return null;\n        }\n\n        const edittedEventMsg = await this.client.pupPage.evaluate(\n            async (msgId, editedEventObject) => {\n                const msg =\n                    window.require('WAWebCollections').Msg.get(msgId) ||\n                    (\n                        await window\n                            .require('WAWebCollections')\n                            .Msg.getMessagesById([msgId])\n                    )?.messages?.[0];\n                if (!msg) return null;\n\n                const { name, startTimeTs, eventSendOptions } =\n                    editedEventObject;\n                const eventOptions = {\n                    name: name,\n                    description: eventSendOptions.description,\n                    startTime: startTimeTs,\n                    endTime: eventSendOptions.endTimeTs,\n                    location: eventSendOptions.location,\n                    callType: eventSendOptions.callType,\n                    isEventCanceled: eventSendOptions.isEventCanceled,\n                };\n\n                await window\n                    .require('WAWebSendEventEditMsgAction')\n                    .sendEventEditMessage(eventOptions, msg);\n                const editedMsg = window\n                    .require('WAWebCollections')\n                    .Msg.get(msg.id._serialized);\n                return editedMsg?.serialize();\n            },\n            this.id._serialized,\n            editedEventObject,\n        );\n\n        return edittedEventMsg && new Message(this.client, edittedEventMsg);\n    }\n    /**\n     * Returns the PollVote this poll message\n     * @returns {Promise<PollVote[]>}\n     */\n    async getPollVotes() {\n        return await this.client.getPollVotes(this.id._serialized);\n    }\n\n    /**\n     * Send votes to the poll message\n     * @param {Array<string>} selectedOptions Array of options selected.\n     * @returns {Promise}\n     */\n    async vote(selectedOptions) {\n        if (this.type != MessageTypes.POLL_CREATION)\n            throw 'Invalid usage! Can only be used with a pollCreation message';\n\n        await this.client.pupPage.evaluate(\n            async (messageId, votes) => {\n                if (!messageId) return null;\n                if (!Array.isArray(votes)) votes = [votes];\n                let localIdSet = new Set();\n                const msg =\n                    window.require('WAWebCollections').Msg.get(messageId) ||\n                    (\n                        await window\n                            .require('WAWebCollections')\n                            .Msg.getMessagesById([messageId])\n                    )?.messages?.[0];\n                if (!msg) return null;\n\n                msg.pollOptions.forEach((a) => {\n                    for (const option of votes) {\n                        if (a.name === option) localIdSet.add(a.localId);\n                    }\n                });\n\n                await window\n                    .require('WAWebPollsSendVoteMsgAction')\n                    .sendVote(msg, localIdSet);\n            },\n            this.id._serialized,\n            selectedOptions,\n        );\n    }\n}\n\nmodule.exports = Message;\n"
  },
  {
    "path": "src/structures/MessageMedia.js",
    "content": "'use strict';\n\nconst fs = require('fs');\nconst path = require('path');\nconst mime = require('mime');\nconst fetch = require('node-fetch');\nconst { URL } = require('url');\n\n/**\n * Media attached to a message\n * @param {string} mimetype MIME type of the attachment\n * @param {string} data Base64-encoded data of the file\n * @param {?string} filename Document file name. Value can be null\n * @param {?number} filesize Document file size in bytes. Value can be null\n */\nclass MessageMedia {\n    constructor(mimetype, data, filename, filesize) {\n        /**\n         * MIME type of the attachment\n         * @type {string}\n         */\n        this.mimetype = mimetype;\n\n        /**\n         * Base64 encoded data that represents the file\n         * @type {string}\n         */\n        this.data = data;\n\n        /**\n         * Document file name. Value can be null\n         * @type {?string}\n         */\n        this.filename = filename;\n\n        /**\n         * Document file size in bytes. Value can be null\n         * @type {?number}\n         */\n        this.filesize = filesize;\n    }\n\n    /**\n     * Creates a MessageMedia instance from a local file path\n     * @param {string} filePath\n     * @returns {MessageMedia}\n     */\n    static fromFilePath(filePath) {\n        const b64data = fs.readFileSync(filePath, { encoding: 'base64' });\n        const mimetype = mime.getType(filePath);\n        const filename = path.basename(filePath);\n\n        return new MessageMedia(mimetype, b64data, filename);\n    }\n\n    /**\n     * Creates a MessageMedia instance from a URL\n     * @param {string} url\n     * @param {Object} [options]\n     * @param {boolean} [options.unsafeMime=false]\n     * @param {string} [options.filename]\n     * @param {object} [options.client]\n     * @param {object} [options.reqOptions]\n     * @param {number} [options.reqOptions.size=0]\n     * @returns {Promise<MessageMedia>}\n     */\n    static async fromUrl(url, options = {}) {\n        const pUrl = new URL(url);\n        let mimetype = mime.getType(pUrl.pathname);\n\n        if (!mimetype && !options.unsafeMime)\n            throw new Error(\n                'Unable to determine MIME type using URL. Set unsafeMime to true to download it anyway.',\n            );\n\n        async function fetchData(url, options) {\n            const reqOptions = Object.assign(\n                { headers: { accept: 'image/* video/* text/* audio/*' } },\n                options,\n            );\n            const response = await fetch(url, reqOptions);\n            const mime = response.headers.get('Content-Type');\n            const size = response.headers.get('Content-Length');\n\n            const contentDisposition = response.headers.get(\n                'Content-Disposition',\n            );\n            const name = contentDisposition\n                ? contentDisposition.match(/((?<=filename=\")(.*)(?=\"))/)\n                : null;\n\n            let data = '';\n            if (response.buffer) {\n                data = (await response.buffer()).toString('base64');\n            } else {\n                const bArray = new Uint8Array(await response.arrayBuffer());\n                bArray.forEach((b) => {\n                    data += String.fromCharCode(b);\n                });\n                data = btoa(data);\n            }\n\n            return { data, mime, name, size };\n        }\n\n        const res = options.client\n            ? await options.client.pupPage.evaluate(\n                  fetchData,\n                  url,\n                  options.reqOptions,\n              )\n            : await fetchData(url, options.reqOptions);\n\n        const filename =\n            options.filename ||\n            (res.name ? res.name[0] : pUrl.pathname.split('/').pop() || 'file');\n\n        if (!mimetype) mimetype = res.mime;\n\n        return new MessageMedia(mimetype, res.data, filename, res.size || null);\n    }\n}\n\nmodule.exports = MessageMedia;\n"
  },
  {
    "path": "src/structures/Order.js",
    "content": "'use strict';\n\nconst Base = require('./Base');\nconst Product = require('./Product');\n\n/**\n * Represents a Order on WhatsApp\n * @extends {Base}\n */\nclass Order extends Base {\n    constructor(client, data) {\n        super(client);\n\n        if (data) this._patch(data);\n    }\n\n    _patch(data) {\n        /**\n         * List of products\n         * @type {Array<Product>}\n         */\n        if (data.products) {\n            this.products = data.products.map(\n                (product) => new Product(this.client, product),\n            );\n        }\n        /**\n         * Order Subtotal\n         * @type {string}\n         */\n        this.subtotal = data.subtotal;\n        /**\n         * Order Total\n         * @type {string}\n         */\n        this.total = data.total;\n        /**\n         * Order Currency\n         * @type {string}\n         */\n        this.currency = data.currency;\n        /**\n         * Order Created At\n         * @type {number}\n         */\n        this.createdAt = data.createdAt;\n\n        return super._patch(data);\n    }\n}\n\nmodule.exports = Order;\n"
  },
  {
    "path": "src/structures/Payment.js",
    "content": "const Base = require('./Base');\n\nclass Payment extends Base {\n    constructor(client, data) {\n        super(client);\n\n        if (data) this._patch(data);\n    }\n\n    _patch(data) {\n        /**\n         * The payment Id\n         * @type {object}\n         */\n        this.id = data.id;\n\n        /**\n         * The payment currency\n         * @type {string}\n         */\n        this.paymentCurrency = data.paymentCurrency;\n\n        /**\n         * The payment ammount ( R$ 1.00 = 1000 )\n         * @type {number}\n         */\n        this.paymentAmount1000 = data.paymentAmount1000;\n\n        /**\n         * The payment receiver\n         * @type {object}\n         */\n        this.paymentMessageReceiverJid = data.paymentMessageReceiverJid;\n\n        /**\n         * The payment transaction timestamp\n         * @type {number}\n         */\n        this.paymentTransactionTimestamp = data.paymentTransactionTimestamp;\n\n        /**\n         * The paymentStatus\n         *\n         * Possible Status\n         * 0:UNKNOWN_STATUS\n         * 1:PROCESSING\n         * 2:SENT\n         * 3:NEED_TO_ACCEPT\n         * 4:COMPLETE\n         * 5:COULD_NOT_COMPLETE\n         * 6:REFUNDED\n         * 7:EXPIRED\n         * 8:REJECTED\n         * 9:CANCELLED\n         * 10:WAITING_FOR_PAYER\n         * 11:WAITING\n         *\n         * @type {number}\n         */\n        this.paymentStatus = data.paymentStatus;\n\n        /**\n         * Integer that represents the payment Text\n         * @type {number}\n         */\n        this.paymentTxnStatus = data.paymentTxnStatus;\n\n        /**\n         * The note sent with the payment\n         * @type {string}\n         */\n        this.paymentNote = !data.paymentNoteMsg\n            ? undefined\n            : data.paymentNoteMsg.body\n              ? data.paymentNoteMsg.body\n              : undefined;\n\n        return super._patch(data);\n    }\n}\n\nmodule.exports = Payment;\n"
  },
  {
    "path": "src/structures/Poll.js",
    "content": "'use strict';\n\n/**\n * Poll send options\n * @typedef {Object} PollSendOptions\n * @property {boolean} [allowMultipleAnswers=false] If false it is a single choice poll, otherwise it is a multiple choice poll (false by default)\n * @property {?Array<number>} messageSecret The custom message secret, can be used as a poll ID. NOTE: it has to be a unique vector with a length of 32\n */\n\n/** Represents a Poll on WhatsApp */\nclass Poll {\n    /**\n     * @param {string} pollName\n     * @param {Array<string>} pollOptions\n     * @param {PollSendOptions} options\n     */\n    constructor(pollName, pollOptions, options = {}) {\n        /**\n         * The name of the poll\n         * @type {string}\n         */\n        this.pollName = pollName.trim();\n\n        /**\n         * The array of poll options\n         * @type {Array.<{name: string, localId: number}>}\n         */\n        this.pollOptions = pollOptions.map((option, index) => ({\n            name: option.trim(),\n            localId: index,\n        }));\n\n        /**\n         * The send options for the poll\n         * @type {PollSendOptions}\n         */\n        this.options = {\n            allowMultipleAnswers: options.allowMultipleAnswers === true,\n            messageSecret: options.messageSecret,\n        };\n    }\n}\n\nmodule.exports = Poll;\n"
  },
  {
    "path": "src/structures/PollVote.js",
    "content": "'use strict';\n\nconst Message = require('./Message');\nconst Base = require('./Base');\n\n/**\n * Selected poll option structure\n * @typedef {Object} SelectedPollOption\n * @property {number} id The local selected or deselected option ID\n * @property {string} name The option name\n */\n\n/**\n * Represents a Poll Vote on WhatsApp\n * @extends {Base}\n */\nclass PollVote extends Base {\n    constructor(client, data) {\n        super(client);\n\n        if (data) this._patch(data);\n    }\n\n    _patch(data) {\n        /**\n         * The person who voted\n         * @type {string}\n         */\n        this.voter = data.sender;\n\n        /**\n         * The selected poll option(s)\n         * If it's an empty array, the user hasn't selected any options on the poll,\n         * may occur when they deselected all poll options\n         * @type {SelectedPollOption[]}\n         */\n        if (data.selectedOptionLocalIds.length > 0) {\n            if (data.parentMessage) {\n                // temporary failsafe\n                this.selectedOptions = data.selectedOptionLocalIds.map((e) => ({\n                    name: data.parentMessage.pollOptions.find(\n                        (x) => x.localId === e,\n                    ).name,\n                    localId: e,\n                }));\n            } else {\n                this.selectedOptions = data.selectedOptionLocalIds.map((e) => ({\n                    name: undefined,\n                    localId: e,\n                }));\n            }\n        } else {\n            this.selectedOptions = [];\n        }\n\n        /**\n         * Timestamp the option was selected or deselected at\n         * @type {number}\n         */\n        this.interractedAtTs = data.senderTimestampMs;\n\n        /**\n         * The poll creation message associated with the poll vote\n         * @type {Message}\n         */\n        this.parentMessage = new Message(this.client, data.parentMessage);\n\n        /**\n         * The poll creation message id\n         * @type {Object}\n         */\n        this.parentMsgKey = data.parentMsgKey;\n\n        return super._patch(data);\n    }\n}\n\nmodule.exports = PollVote;\n"
  },
  {
    "path": "src/structures/PrivateChat.js",
    "content": "'use strict';\n\nconst Chat = require('./Chat');\n\n/**\n * Represents a Private Chat on WhatsApp\n * @extends {Chat}\n */\nclass PrivateChat extends Chat {}\n\nmodule.exports = PrivateChat;\n"
  },
  {
    "path": "src/structures/PrivateContact.js",
    "content": "'use strict';\n\nconst Contact = require('./Contact');\n\n/**\n * Represents a Private Contact on WhatsApp\n * @extends {Contact}\n */\nclass PrivateContact extends Contact {}\n\nmodule.exports = PrivateContact;\n"
  },
  {
    "path": "src/structures/Product.js",
    "content": "'use strict';\n\nconst Base = require('./Base');\nconst ProductMetadata = require('./ProductMetadata');\n\n/**\n * Represents a Product on WhatsAppBusiness\n * @extends {Base}\n */\nclass Product extends Base {\n    constructor(client, data) {\n        super(client);\n\n        if (data) this._patch(data);\n    }\n\n    _patch(data) {\n        /**\n         * Product ID\n         * @type {string}\n         */\n        this.id = data.id;\n        /**\n         * Price\n         * @type {string}\n         */\n        this.price = data.price ? data.price : '';\n        /**\n         * Product Thumbnail\n         * @type {string}\n         */\n        this.thumbnailUrl = data.thumbnailUrl;\n        /**\n         * Currency\n         * @type {string}\n         */\n        this.currency = data.currency;\n        /**\n         * Product Name\n         * @type {string}\n         */\n        this.name = data.name;\n        /**\n         * Product Quantity\n         * @type {number}\n         */\n        this.quantity = data.quantity;\n        /** Product metadata */\n        this.data = null;\n        return super._patch(data);\n    }\n\n    async getData() {\n        if (this.data === null) {\n            let result = await this.client.pupPage.evaluate((productId) => {\n                return window.WWebJS.getProductMetadata(productId);\n            }, this.id);\n            if (!result) {\n                this.data = undefined;\n            } else {\n                this.data = new ProductMetadata(this.client, result);\n            }\n        }\n        return this.data;\n    }\n}\n\nmodule.exports = Product;\n"
  },
  {
    "path": "src/structures/ProductMetadata.js",
    "content": "const Base = require('./Base');\n\nclass ProductMetadata extends Base {\n    constructor(client, data) {\n        super(client);\n\n        if (data) this._patch(data);\n    }\n\n    _patch(data) {\n        /** Product ID */\n        this.id = data.id;\n        /** Retailer ID */\n        this.retailer_id = data.retailer_id;\n        /** Product Name  */\n        this.name = data.name;\n        /** Product Description */\n        this.description = data.description;\n\n        return super._patch(data);\n    }\n}\n\nmodule.exports = ProductMetadata;\n"
  },
  {
    "path": "src/structures/Reaction.js",
    "content": "'use strict';\n\nconst Base = require('./Base');\n\n/**\n * Represents a Reaction on WhatsApp\n * @extends {Base}\n */\nclass Reaction extends Base {\n    constructor(client, data) {\n        super(client);\n\n        if (data) this._patch(data);\n    }\n\n    _patch(data) {\n        /**\n         * Reaction ID\n         * @type {object}\n         */\n        this.id = data.msgKey;\n        /**\n         * Orphan\n         * @type {number}\n         */\n        this.orphan = data.orphan;\n        /**\n         * Orphan reason\n         * @type {?string}\n         */\n        this.orphanReason = data.orphanReason;\n        /**\n         * Unix timestamp for when the reaction was created\n         * @type {number}\n         */\n        this.timestamp = data.timestamp;\n        /**\n         * Reaction\n         * @type {string}\n         */\n        this.reaction = data.reactionText;\n        /**\n         * Read\n         * @type {boolean}\n         */\n        this.read = data.read;\n        /**\n         * Message ID\n         * @type {object}\n         */\n        this.msgId = data.parentMsgKey;\n        /**\n         * Sender ID\n         * @type {string}\n         */\n        this.senderId = data.senderUserJid;\n        /**\n         * ACK\n         * @type {?number}\n         */\n        this.ack = data.ack;\n\n        return super._patch(data);\n    }\n}\n\nmodule.exports = Reaction;\n"
  },
  {
    "path": "src/structures/ScheduledEvent.js",
    "content": "'use strict';\n\n/**\n * ScheduledEvent send options\n * @typedef {Object} ScheduledEventSendOptions\n * @property {?string} description The scheduled event description\n * @property {?Date} endTime The end time of the event\n * @property {?string} location The location of the event\n * @property {?string} callType The type of a WhatsApp call link to generate, valid values are: `video` | `voice` | `none`\n * @property {boolean} [isEventCanceled = false] Indicates if a scheduled event should be sent as an already canceled\n * @property {?Array<number>} messageSecret The custom message secret, can be used as an event ID. NOTE: it has to be a unique vector with a length of 32\n */\n\n/** Represents a ScheduledEvent on WhatsApp */\nclass ScheduledEvent {\n    /**\n     * @param {string} name\n     * @param {Date} startTime\n     * @param {ScheduledEventSendOptions} options\n     */\n    constructor(name, startTime, options = {}) {\n        /**\n         * The name of the event\n         * @type {string}\n         */\n        this.name = this._validateInputs('name', name).trim();\n\n        /**\n         * The start time of the event\n         * @type {number}\n         */\n        this.startTimeTs = Math.floor(startTime.getTime() / 1000);\n\n        /**\n         * The send options for the event\n         * @type {Object}\n         */\n        this.eventSendOptions = {\n            description: options.description?.trim(),\n            endTimeTs: options.endTime\n                ? Math.floor(options.endTime.getTime() / 1000)\n                : null,\n            location: options.location?.trim(),\n            callType: this._validateInputs('callType', options.callType),\n            isEventCanceled: options.isEventCanceled ?? false,\n            messageSecret: options.messageSecret,\n        };\n    }\n\n    /**\n     * Inner function to validate input values\n     * @param {string} propName The property name to validate the value of\n     * @param {string | number} propValue The property value to validate\n     * @returns {string | number} The property value if a validation succeeded\n     */\n    _validateInputs(propName, propValue) {\n        if (propName === 'name' && !propValue) {\n            throw new (class CreateScheduledEventError extends Error {\n                constructor(m) {\n                    super(m);\n                }\n            })(`Empty '${propName}' parameter value is provided.`);\n        }\n\n        if (\n            propName === 'callType' &&\n            propValue &&\n            !['video', 'voice', 'none'].includes(propValue)\n        ) {\n            throw new (class CreateScheduledEventError extends Error {\n                constructor(m) {\n                    super(m);\n                }\n            })(\n                `Invalid '${propName}' parameter value is provided. Valid values are: 'voice' | 'video' | 'none'.`,\n            );\n        }\n\n        return propValue;\n    }\n}\n\nmodule.exports = ScheduledEvent;\n"
  },
  {
    "path": "src/structures/index.js",
    "content": "module.exports = {\n    Base: require('./Base'),\n    BusinessContact: require('./BusinessContact'),\n    Chat: require('./Chat'),\n    ClientInfo: require('./ClientInfo'),\n    Contact: require('./Contact'),\n    GroupChat: require('./GroupChat'),\n    Channel: require('./Channel'),\n    Location: require('./Location'),\n    Message: require('./Message'),\n    MessageMedia: require('./MessageMedia'),\n    PrivateChat: require('./PrivateChat'),\n    PrivateContact: require('./PrivateContact'),\n    GroupNotification: require('./GroupNotification'),\n    Label: require('./Label.js'),\n    Order: require('./Order'),\n    Product: require('./Product'),\n    Call: require('./Call'),\n    Buttons: require('./Buttons'),\n    List: require('./List'),\n    Payment: require('./Payment'),\n    Reaction: require('./Reaction'),\n    Poll: require('./Poll'),\n    PollVote: require('./PollVote'),\n    Broadcast: require('./Broadcast'),\n    ScheduledEvent: require('./ScheduledEvent'),\n};\n"
  },
  {
    "path": "src/util/Constants.js",
    "content": "'use strict';\n\nexports.WhatsWebURL = 'https://web.whatsapp.com/';\n\nexports.DefaultOptions = {\n    puppeteer: {\n        headless: true,\n        defaultViewport: null,\n    },\n    webVersion: '2.3000.1017054665',\n    webVersionCache: {\n        type: 'local',\n    },\n    authTimeoutMs: 0,\n    qrMaxRetries: 0,\n    takeoverOnConflict: false,\n    takeoverTimeoutMs: 0,\n    userAgent:\n        'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.67 Safari/537.36',\n    ffmpegPath: 'ffmpeg',\n    bypassCSP: false,\n    proxyAuthentication: undefined,\n    pairWithPhoneNumber: {\n        phoneNumber: '',\n        showNotification: true,\n        intervalMs: 180000,\n    },\n};\n\n/**\n * Client status\n * @readonly\n * @enum {number}\n */\nexports.Status = {\n    INITIALIZING: 0,\n    AUTHENTICATING: 1,\n    READY: 3,\n};\n\n/**\n * Events that can be emitted by the client\n * @readonly\n * @enum {string}\n */\nexports.Events = {\n    AUTHENTICATED: 'authenticated',\n    AUTHENTICATION_FAILURE: 'auth_failure',\n    READY: 'ready',\n    CHAT_REMOVED: 'chat_removed',\n    CHAT_ARCHIVED: 'chat_archived',\n    MESSAGE_RECEIVED: 'message',\n    MESSAGE_CIPHERTEXT: 'message_ciphertext',\n    MESSAGE_CREATE: 'message_create',\n    MESSAGE_REVOKED_EVERYONE: 'message_revoke_everyone',\n    MESSAGE_REVOKED_ME: 'message_revoke_me',\n    MESSAGE_ACK: 'message_ack',\n    MESSAGE_EDIT: 'message_edit',\n    UNREAD_COUNT: 'unread_count',\n    MESSAGE_REACTION: 'message_reaction',\n    MEDIA_UPLOADED: 'media_uploaded',\n    CONTACT_CHANGED: 'contact_changed',\n    GROUP_JOIN: 'group_join',\n    GROUP_LEAVE: 'group_leave',\n    GROUP_ADMIN_CHANGED: 'group_admin_changed',\n    GROUP_MEMBERSHIP_REQUEST: 'group_membership_request',\n    GROUP_UPDATE: 'group_update',\n    QR_RECEIVED: 'qr',\n    CODE_RECEIVED: 'code',\n    LOADING_SCREEN: 'loading_screen',\n    DISCONNECTED: 'disconnected',\n    STATE_CHANGED: 'change_state',\n    BATTERY_CHANGED: 'change_battery',\n    INCOMING_CALL: 'call',\n    REMOTE_SESSION_SAVED: 'remote_session_saved',\n    VOTE_UPDATE: 'vote_update',\n};\n\n/**\n * Message types\n * @readonly\n * @enum {string}\n */\nexports.MessageTypes = {\n    TEXT: 'chat',\n    AUDIO: 'audio',\n    VOICE: 'ptt',\n    IMAGE: 'image',\n    ALBUM: 'album',\n    VIDEO: 'video',\n    DOCUMENT: 'document',\n    STICKER: 'sticker',\n    LOCATION: 'location',\n    CONTACT_CARD: 'vcard',\n    CONTACT_CARD_MULTI: 'multi_vcard',\n    ORDER: 'order',\n    REVOKED: 'revoked',\n    PRODUCT: 'product',\n    UNKNOWN: 'unknown',\n    GROUP_INVITE: 'groups_v4_invite',\n    LIST: 'list',\n    LIST_RESPONSE: 'list_response',\n    BUTTONS_RESPONSE: 'buttons_response',\n    PAYMENT: 'payment',\n    BROADCAST_NOTIFICATION: 'broadcast_notification',\n    CALL_LOG: 'call_log',\n    CIPHERTEXT: 'ciphertext',\n    DEBUG: 'debug',\n    E2E_NOTIFICATION: 'e2e_notification',\n    GP2: 'gp2',\n    GROUP_NOTIFICATION: 'group_notification',\n    HSM: 'hsm',\n    INTERACTIVE: 'interactive',\n    NATIVE_FLOW: 'native_flow',\n    NOTIFICATION: 'notification',\n    NOTIFICATION_TEMPLATE: 'notification_template',\n    OVERSIZED: 'oversized',\n    PROTOCOL: 'protocol',\n    REACTION: 'reaction',\n    TEMPLATE_BUTTON_REPLY: 'template_button_reply',\n    POLL_CREATION: 'poll_creation',\n    SCHEDULED_EVENT_CREATION: 'scheduled_event_creation',\n};\n\n/**\n * Group notification types\n * @readonly\n * @enum {string}\n */\nexports.GroupNotificationTypes = {\n    ADD: 'add',\n    INVITE: 'invite',\n    REMOVE: 'remove',\n    LEAVE: 'leave',\n    PROMOTE: 'promote',\n    DEMOTE: 'demote',\n    SUBJECT: 'subject',\n    DESCRIPTION: 'description',\n    PICTURE: 'picture',\n    ANNOUNCE: 'announce',\n    RESTRICT: 'restrict',\n};\n\n/**\n * Chat types\n * @readonly\n * @enum {string}\n */\nexports.ChatTypes = {\n    SOLO: 'solo',\n    GROUP: 'group',\n    UNKNOWN: 'unknown',\n};\n\n/**\n * WhatsApp state\n * @readonly\n * @enum {string}\n */\nexports.WAState = {\n    CONFLICT: 'CONFLICT',\n    CONNECTED: 'CONNECTED',\n    DEPRECATED_VERSION: 'DEPRECATED_VERSION',\n    OPENING: 'OPENING',\n    PAIRING: 'PAIRING',\n    PROXYBLOCK: 'PROXYBLOCK',\n    SMB_TOS_BLOCK: 'SMB_TOS_BLOCK',\n    TIMEOUT: 'TIMEOUT',\n    TOS_BLOCK: 'TOS_BLOCK',\n    UNLAUNCHED: 'UNLAUNCHED',\n    UNPAIRED: 'UNPAIRED',\n    UNPAIRED_IDLE: 'UNPAIRED_IDLE',\n};\n\n/**\n * Message ACK\n * @readonly\n * @enum {number}\n */\nexports.MessageAck = {\n    ACK_ERROR: -1,\n    ACK_PENDING: 0,\n    ACK_SERVER: 1,\n    ACK_DEVICE: 2,\n    ACK_READ: 3,\n    ACK_PLAYED: 4,\n};\n"
  },
  {
    "path": "src/util/Injected/AuthStore/AuthStore.js",
    "content": "'use strict';\n\nexports.ExposeAuthStore = () => {\n    window.AuthStore = {};\n    window.AuthStore.AppState = window.require('WAWebSocketModel').Socket;\n    window.AuthStore.Cmd = window.require('WAWebCmd').Cmd;\n    window.AuthStore.Conn = window.require('WAWebConnModel').Conn;\n    window.AuthStore.OfflineMessageHandler = window.require(\n        'WAWebOfflineHandler',\n    ).OfflineMessageHandler;\n    window.AuthStore.PairingCodeLinkUtils = window.require(\n        'WAWebAltDeviceLinkingApi',\n    );\n    window.AuthStore.Base64Tools = window.require('WABase64');\n    window.AuthStore.RegistrationUtils = {\n        ...window.require('WAWebCompanionRegClientUtils'),\n        ...window.require('WAWebAdvSignatureApi'),\n        ...window.require('WAWebUserPrefsInfoStore'),\n        ...window.require('WAWebSignalStoreApi'),\n    };\n};\n"
  },
  {
    "path": "src/util/Injected/Utils.js",
    "content": "'use strict';\n\nexports.LoadUtils = () => {\n    window.WWebJS = {};\n\n    /**\n     * Helper function that compares between two WWeb versions. Its purpose is to help the developer to choose the correct code implementation depending on the comparison value and the WWeb version.\n     * @param {string} lOperand The left operand for the WWeb version string to compare with\n     * @param {string} operator The comparison operator\n     * @param {string} rOperand The right operand for the WWeb version string to compare with\n     * @returns {boolean} Boolean value that indicates the result of the comparison\n     */\n    window.WWebJS.compareWwebVersions = (lOperand, operator, rOperand) => {\n        if (!['>', '>=', '<', '<=', '='].includes(operator)) {\n            throw new (class _ extends Error {\n                constructor(m) {\n                    super(m);\n                    this.name = 'CompareWwebVersionsError';\n                }\n            })('Invalid comparison operator is provided');\n        }\n        if (typeof lOperand !== 'string' || typeof rOperand !== 'string') {\n            throw new (class _ extends Error {\n                constructor(m) {\n                    super(m);\n                    this.name = 'CompareWwebVersionsError';\n                }\n            })('A non-string WWeb version type is provided');\n        }\n\n        lOperand = lOperand.replace(/-beta$/, '');\n        rOperand = rOperand.replace(/-beta$/, '');\n\n        while (lOperand.length !== rOperand.length) {\n            lOperand.length > rOperand.length\n                ? (rOperand = rOperand.concat('0'))\n                : (lOperand = lOperand.concat('0'));\n        }\n\n        lOperand = Number(lOperand.replace(/\\./g, ''));\n        rOperand = Number(rOperand.replace(/\\./g, ''));\n\n        return operator === '>'\n            ? lOperand > rOperand\n            : operator === '>='\n              ? lOperand >= rOperand\n              : operator === '<'\n                ? lOperand < rOperand\n                : operator === '<='\n                  ? lOperand <= rOperand\n                  : operator === '='\n                    ? lOperand === rOperand\n                    : false;\n    };\n\n    /**\n     * Target options object description\n     * @typedef {Object} TargetOptions\n     * @property {string|number} module The target module\n     * @property {string} function The function name to get from a module\n     */\n    /**\n     * Function to modify functions\n     * @param {TargetOptions} target Options specifying the target function to search for modifying\n     * @param {Function} callback Modified function\n     */\n    window.WWebJS.injectToFunction = (target, callback) => {\n        try {\n            let module = window.require(target.module);\n            if (!module) return;\n\n            const path = target.function.split('.');\n            const funcName = path.pop();\n\n            for (const key of path) {\n                if (!module[key]) return;\n                module = module[key];\n            }\n\n            const originalFunction = module[funcName];\n            if (typeof originalFunction !== 'function') return;\n\n            module[funcName] = ((...args) => {\n                try {\n                    return callback(module, originalFunction, ...args);\n                } catch {\n                    return originalFunction.apply(module, args);\n                }\n            }).bind(module);\n        } catch {\n            return;\n        }\n    };\n\n    window.WWebJS.injectToFunction(\n        { module: 'WAWebBackendJobsCommon', function: 'mediaTypeFromProtobuf' },\n        (module, func, ...args) => {\n            const [proto] = args;\n            return proto.locationMessage ? null : func(...args);\n        },\n    );\n\n    window.WWebJS.injectToFunction(\n        { module: 'WAWebE2EProtoUtils', function: 'typeAttributeFromProtobuf' },\n        (module, func, ...args) => {\n            const [proto] = args;\n            return proto.locationMessage || proto.groupInviteMessage\n                ? 'text'\n                : func(...args);\n        },\n    );\n\n    window.WWebJS.forwardMessage = async (chatId, msgId) => {\n        const msg =\n            window.require('WAWebCollections').Msg.get(msgId) ||\n            (\n                await window\n                    .require('WAWebCollections')\n                    .Msg.getMessagesById([msgId])\n            )?.messages?.[0];\n        const chat = await window.WWebJS.getChat(chatId, { getAsModel: false });\n        return await window.require('WAWebChatForwardMessage').forwardMessages({\n            chat: chat,\n            msgs: [msg],\n            multicast: true,\n            includeCaption: true,\n            appendedText: undefined,\n        });\n    };\n\n    window.WWebJS.sendSeen = async (chatId) => {\n        const chat = await window.WWebJS.getChat(chatId, { getAsModel: false });\n        if (chat) {\n            window.require('WAWebStreamModel').Stream.markAvailable();\n            await window.require('WAWebUpdateUnreadChatAction').sendSeen({\n                chat: chat,\n                threadId: undefined,\n            });\n            window.require('WAWebStreamModel').Stream.markUnavailable();\n            return true;\n        }\n        return false;\n    };\n\n    window.WWebJS.sendMessage = async (chat, content, options = {}) => {\n        const { getIsNewsletter, getIsBroadcast } =\n            window.require('WAWebChatGetters');\n        const isChannel = getIsNewsletter(chat);\n        const isStatus = getIsBroadcast(chat);\n\n        const { findLink } = window.require('WALinkify');\n\n        let mediaOptions = {};\n        if (options.media) {\n            mediaOptions =\n                options.sendMediaAsSticker && !isChannel && !isStatus\n                    ? await window.WWebJS.processStickerData(options.media)\n                    : await window.WWebJS.processMediaData(options.media, {\n                          forceSticker: options.sendMediaAsSticker,\n                          forceGif: options.sendVideoAsGif,\n                          forceVoice: options.sendAudioAsVoice,\n                          forceDocument: options.sendMediaAsDocument,\n                          forceMediaHd: options.sendMediaAsHd,\n                          sendToChannel: isChannel,\n                          sendToStatus: isStatus,\n                      });\n            mediaOptions.caption = options.caption;\n            content = options.sendMediaAsSticker\n                ? undefined\n                : mediaOptions.preview;\n            mediaOptions.isViewOnce = options.isViewOnce;\n            delete options.media;\n            delete options.sendMediaAsSticker;\n        }\n\n        let quotedMsgOptions = {};\n        if (options.quotedMessageId) {\n            let quotedMessage = window\n                .require('WAWebCollections')\n                .Msg.get(options.quotedMessageId);\n            !quotedMessage &&\n                (quotedMessage = (\n                    await window\n                        .require('WAWebCollections')\n                        .Msg.getMessagesById([options.quotedMessageId])\n                )?.messages?.[0]);\n            if (quotedMessage) {\n                const ReplyUtils = window.require('WAWebMsgReply');\n                const canReply = ReplyUtils\n                    ? ReplyUtils.canReplyMsg(quotedMessage.unsafe())\n                    : quotedMessage.canReply();\n\n                if (canReply) {\n                    quotedMsgOptions = quotedMessage.msgContextInfo(chat);\n                }\n            } else {\n                if (!options.ignoreQuoteErrors) {\n                    throw new Error('Could not get the quoted message.');\n                }\n            }\n\n            delete options.ignoreQuoteErrors;\n            delete options.quotedMessageId;\n        }\n\n        if (options.mentionedJidList) {\n            options.mentionedJidList = options.mentionedJidList.map((id) =>\n                window.require('WAWebWidFactory').createWid(id),\n            );\n            options.mentionedJidList = options.mentionedJidList.filter(Boolean);\n        }\n\n        if (options.groupMentions) {\n            options.groupMentions = options.groupMentions.map((e) => ({\n                groupSubject: e.subject,\n                groupJid: window.require('WAWebWidFactory').createWid(e.id),\n            }));\n        }\n\n        let locationOptions = {};\n        if (options.location) {\n            let { latitude, longitude, description, url } = options.location;\n            url = findLink(url)?.href;\n            url && !description && (description = url);\n            locationOptions = {\n                type: 'location',\n                loc: description,\n                lat: latitude,\n                lng: longitude,\n                clientUrl: url,\n            };\n            delete options.location;\n        }\n\n        let pollOptions = {};\n        if (options.poll) {\n            const { pollName, pollOptions: _pollOptions } = options.poll;\n            const { allowMultipleAnswers, messageSecret } =\n                options.poll.options;\n            pollOptions = {\n                kind: 'pollCreation',\n                type: 'poll_creation',\n                pollName: pollName,\n                pollOptions: _pollOptions,\n                pollSelectableOptionsCount: allowMultipleAnswers ? 0 : 1,\n                messageSecret:\n                    Array.isArray(messageSecret) && messageSecret.length === 32\n                        ? new Uint8Array(messageSecret)\n                        : window.crypto.getRandomValues(new Uint8Array(32)),\n            };\n            delete options.poll;\n        }\n\n        let eventOptions = {};\n        if (options.event) {\n            const { name, startTimeTs, eventSendOptions } = options.event;\n            const { messageSecret } = eventSendOptions;\n            eventOptions = {\n                type: 'event_creation',\n                eventName: name,\n                eventDescription: eventSendOptions.description,\n                eventStartTime: startTimeTs,\n                eventEndTime: eventSendOptions.endTimeTs,\n                eventLocation: eventSendOptions.location && {\n                    degreesLatitude: 0,\n                    degreesLongitude: 0,\n                    name: eventSendOptions.location,\n                },\n                eventJoinLink:\n                    eventSendOptions.callType === 'none'\n                        ? null\n                        : await window\n                              .require('WAWebGenerateEventCallLink')\n                              .createEventCallLink(\n                                  startTimeTs,\n                                  eventSendOptions.callType,\n                              ),\n                isEventCanceled: eventSendOptions.isEventCanceled,\n                messageSecret:\n                    Array.isArray(messageSecret) && messageSecret.length === 32\n                        ? new Uint8Array(messageSecret)\n                        : window.crypto.getRandomValues(new Uint8Array(32)),\n            };\n            delete options.event;\n        }\n\n        let vcardOptions = {};\n        if (options.contactCard) {\n            let contact = window\n                .require('WAWebCollections')\n                .Contact.get(options.contactCard);\n            vcardOptions = {\n                body: window\n                    .require('WAWebFrontendVcardUtils')\n                    .vcardFromContactModel(contact).vcard,\n                type: 'vcard',\n                vcardFormattedName: contact.formattedName,\n            };\n            delete options.contactCard;\n        } else if (options.contactCardList) {\n            let contacts = options.contactCardList.map((c) =>\n                window.require('WAWebCollections').Contact.get(c),\n            );\n            let vcards = contacts.map((c) =>\n                window\n                    .require('WAWebFrontendVcardUtils')\n                    .vcardFromContactModel(c),\n            );\n            vcardOptions = {\n                type: 'multi_vcard',\n                vcardList: vcards,\n                body: null,\n            };\n            delete options.contactCardList;\n        } else if (\n            options.parseVCards &&\n            typeof content === 'string' &&\n            content.startsWith('BEGIN:VCARD')\n        ) {\n            delete options.parseVCards;\n            delete options.linkPreview;\n            try {\n                const parsed = window\n                    .require('WAWebVcardParsingUtils')\n                    .parseVcard(content);\n                if (parsed) {\n                    vcardOptions = {\n                        type: 'vcard',\n                        vcardFormattedName: window\n                            .require('WAWebVcardGetNameFromParsed')\n                            .vcardGetNameFromParsed(parsed),\n                    };\n                }\n            } catch (_) {\n                // not a vcard\n            }\n        }\n\n        if (options.linkPreview) {\n            delete options.linkPreview;\n            const link = findLink(content);\n            if (link) {\n                let preview = await window\n                    .require('WAWebLinkPreviewChatAction')\n                    .getLinkPreview(link);\n                if (preview && preview.data) {\n                    preview = preview.data;\n                    preview.preview = true;\n                    preview.subtype = 'url';\n                    options = { ...options, ...preview };\n                }\n            }\n        }\n\n        let buttonOptions = {};\n        if (options.buttons) {\n            let caption;\n            if (options.buttons.type === 'chat') {\n                content = options.buttons.body;\n                caption = content;\n            } else {\n                caption = options.caption ? options.caption : ' '; //Caption can't be empty\n            }\n            buttonOptions = {\n                productHeaderImageRejected: false,\n                isFromTemplate: false,\n                isDynamicReplyButtonsMsg: true,\n                title: options.buttons.title\n                    ? options.buttons.title\n                    : undefined,\n                footer: options.buttons.footer\n                    ? options.buttons.footer\n                    : undefined,\n                dynamicReplyButtons: options.buttons.buttons,\n                replyButtons: options.buttons.buttons,\n                caption: caption,\n            };\n            delete options.buttons;\n        }\n\n        let listOptions = {};\n        if (options.list) {\n            if (\n                window.require('WAWebConnModel').Conn.platform === 'smba' ||\n                window.require('WAWebConnModel').Conn.platform === 'smbi'\n            ) {\n                throw \"[LT01] Whatsapp business can't send this yet\";\n            }\n            listOptions = {\n                type: 'list',\n                footer: options.list.footer,\n                list: {\n                    ...options.list,\n                    listType: 1,\n                },\n                body: options.list.description,\n            };\n            delete options.list;\n            delete listOptions.list.footer;\n        }\n\n        const botOptions = {};\n        if (options.invokedBotWid) {\n            botOptions.messageSecret = window.crypto.getRandomValues(\n                new Uint8Array(32),\n            );\n            botOptions.botMessageSecret = await window\n                .require('WAWebBotMessageSecret')\n                .genBotMsgSecretFromMsgSecret(botOptions.messageSecret);\n            botOptions.invokedBotWid = window\n                .require('WAWebWidFactory')\n                .createWid(options.invokedBotWid);\n            botOptions.botPersonaId = window\n                .require('WAWebBotProfileCollection')\n                .BotProfileCollection.get(options.invokedBotWid).personaId;\n            delete options.invokedBotWid;\n        }\n        const { getMaybeMeLidUser, getMaybeMePnUser } = window.require(\n            'WAWebUserPrefsMeUser',\n        );\n        const lidUser = getMaybeMeLidUser();\n        const meUser = getMaybeMePnUser();\n        const newId = await window.require('WAWebMsgKey').newId();\n        let from = chat.id.isLid() ? lidUser : meUser;\n        let participant;\n\n        if (typeof chat.id?.isGroup === 'function' && chat.id.isGroup()) {\n            from =\n                chat.groupMetadata && chat.groupMetadata.isLidAddressingMode\n                    ? lidUser\n                    : meUser;\n            participant = window\n                .require('WAWebWidFactory')\n                .asUserWidOrThrow(from);\n        }\n\n        if (typeof chat.id?.isStatus === 'function' && chat.id.isStatus()) {\n            participant = window\n                .require('WAWebWidFactory')\n                .asUserWidOrThrow(from);\n        }\n\n        const newMsgKey = new (window.require('WAWebMsgKey'))({\n            from: from,\n            to: chat.id,\n            id: newId,\n            participant: participant,\n            selfDir: 'out',\n        });\n\n        const extraOptions = options.extraOptions || {};\n        delete options.extraOptions;\n\n        const ephemeralFields = window\n            .require('WAWebGetEphemeralFieldsMsgActionsUtils')\n            .getEphemeralFields(chat);\n\n        const message = {\n            ...options,\n            id: newMsgKey,\n            ack: 0,\n            body: content,\n            from: from,\n            to: chat.id,\n            local: true,\n            self: 'out',\n            t: parseInt(new Date().getTime() / 1000),\n            isNewMsg: true,\n            type: 'chat',\n            ...ephemeralFields,\n            ...mediaOptions,\n            ...(mediaOptions.toJSON ? mediaOptions.toJSON() : {}),\n            ...quotedMsgOptions,\n            ...locationOptions,\n            ...pollOptions,\n            ...eventOptions,\n            ...vcardOptions,\n            ...buttonOptions,\n            ...listOptions,\n            ...botOptions,\n            ...extraOptions,\n        };\n\n        // Bot's won't reply if canonicalUrl is set (linking)\n        if (botOptions) {\n            delete message.canonicalUrl;\n        }\n\n        if (isChannel) {\n            const msg = new (window.require('WAWebCollections').Msg.modelClass)(\n                message,\n            );\n            const msgDataFromMsgModel = window\n                .require('WAWebMsgDataFromModel')\n                .msgDataFromMsgModel(msg);\n            const isMedia = Object.keys(mediaOptions).length > 0;\n            await window\n                .require('WAWebNewsletterUpdateMsgsRecordsJob')\n                .addNewsletterMsgsRecords([msgDataFromMsgModel]);\n            chat.msgs.add(msg);\n            chat.t = msg.t;\n\n            const sendChannelMsgResponse = await window\n                .require('WAWebNewsletterSendMessageJob')\n                .sendNewsletterMessageJob({\n                    msg: msg,\n                    type:\n                        message.type === 'chat'\n                            ? 'text'\n                            : isMedia\n                              ? 'media'\n                              : 'pollCreation',\n                    newsletterJid: chat.id.toJid(),\n                    ...(isMedia\n                        ? {\n                              mediaMetadata: msg.avParams(),\n                              mediaHandle: isMedia\n                                  ? mediaOptions.mediaHandle\n                                  : null,\n                          }\n                        : {}),\n                });\n\n            if (sendChannelMsgResponse.success) {\n                msg.t = sendChannelMsgResponse.ack.t;\n                msg.serverId = sendChannelMsgResponse.serverId;\n            }\n            msg.updateAck(1, true);\n            await window\n                .require('WAWebNewsletterUpdateMsgsRecordsJob')\n                .updateNewsletterMsgRecord(msg);\n            return msg;\n        }\n\n        if (isStatus) {\n            const { backgroundColor, fontStyle } = extraOptions;\n            const isMedia = Object.keys(mediaOptions).length > 0;\n            const mediaUpdate = (data) =>\n                window.require('WAWebMediaUpdateMsg')(data, mediaOptions);\n            const msg = new (window.require('WAWebCollections').Msg.modelClass)(\n                {\n                    ...message,\n                    author: participant ? participant : null,\n                    messageSecret: window.crypto.getRandomValues(\n                        new Uint8Array(32),\n                    ),\n                    cannotBeRanked: window\n                        .require('WAWebStatusGatingUtils')\n                        .canCheckStatusRankingPosterGating(),\n                },\n            );\n\n            // for text only\n            const statusOptions = {\n                color:\n                    (backgroundColor &&\n                        window.WWebJS.assertColor(backgroundColor)) ||\n                    0xff7acca5,\n                font: (fontStyle >= 0 && fontStyle <= 7 && fontStyle) || 0,\n                text: msg.body,\n            };\n\n            await window\n                .require('WAWebSendStatusMsgAction')\n                [\n                    isMedia\n                        ? 'sendStatusMediaMsgAction'\n                        : 'sendStatusTextMsgAction'\n                ](...(isMedia ? [msg, mediaUpdate] : [statusOptions]));\n\n            return msg;\n        }\n\n        const [msgPromise, sendMsgResultPromise] = window\n            .require('WAWebSendMsgChatAction')\n            .addAndSendMsgToChat(chat, message);\n        await msgPromise;\n\n        if (options.waitUntilMsgSent) await sendMsgResultPromise;\n\n        return window\n            .require('WAWebCollections')\n            .Msg.get(newMsgKey._serialized);\n    };\n\n    window.WWebJS.editMessage = async (msg, content, options = {}) => {\n        const extraOptions = options.extraOptions || {};\n        delete options.extraOptions;\n\n        if (options.mentionedJidList) {\n            options.mentionedJidList = options.mentionedJidList.map((id) =>\n                window.require('WAWebWidFactory').createWid(id),\n            );\n            options.mentionedJidList = options.mentionedJidList.filter(Boolean);\n        }\n\n        if (options.groupMentions) {\n            options.groupMentions = options.groupMentions.map((e) => ({\n                groupSubject: e.subject,\n                groupJid: window.require('WAWebWidFactory').createWid(e.id),\n            }));\n        }\n\n        if (options.linkPreview) {\n            const { findLink } = window.require('WALinkify');\n            delete options.linkPreview;\n            const link = findLink(content);\n            if (link) {\n                const preview = await window\n                    .require('WAWebLinkPreviewChatAction')\n                    .getLinkPreview(link);\n                preview.preview = true;\n                preview.subtype = 'url';\n                options = { ...options, ...preview };\n            }\n        }\n\n        const internalOptions = {\n            ...options,\n            ...extraOptions,\n        };\n\n        await window\n            .require('WAWebSendMessageEditAction')\n            .sendMessageEdit(msg, content, internalOptions);\n        return window.require('WAWebCollections').Msg.get(msg.id._serialized);\n    };\n\n    window.WWebJS.toStickerData = async (mediaInfo) => {\n        if (mediaInfo.mimetype == 'image/webp') return mediaInfo;\n\n        const file = window.WWebJS.mediaInfoToFile(mediaInfo);\n        const webpSticker = await window\n            .require('WAWebImageUtils')\n            .toWebpSticker(file);\n        const webpBuffer = await webpSticker.arrayBuffer();\n        const data = window.WWebJS.arrayBufferToBase64(webpBuffer);\n\n        return {\n            mimetype: 'image/webp',\n            data,\n        };\n    };\n\n    window.WWebJS.processStickerData = async (mediaInfo) => {\n        if (mediaInfo.mimetype !== 'image/webp')\n            throw new Error('Invalid media type');\n\n        const file = window.WWebJS.mediaInfoToFile(mediaInfo);\n        let filehash = await window.WWebJS.getFileHash(file);\n        let mediaKey = await window.WWebJS.generateHash(32);\n\n        const controller = new AbortController();\n        const uploadedInfo = await window\n            .require('WAWebUploadManager')\n            .encryptAndUpload({\n                blob: file,\n                type: 'sticker',\n                signal: controller.signal,\n                mediaKey,\n                uploadQpl: window\n                    .require('WAWebStartMediaUploadQpl')\n                    .startMediaUploadQpl({\n                        entryPoint: 'MediaUpload',\n                    }),\n            });\n\n        const stickerInfo = {\n            ...uploadedInfo,\n            clientUrl: uploadedInfo.url,\n            deprecatedMms3Url: uploadedInfo.url,\n            uploadhash: uploadedInfo.encFilehash,\n            size: file.size,\n            type: 'sticker',\n            filehash,\n        };\n\n        return stickerInfo;\n    };\n\n    window.WWebJS.processMediaData = async (\n        mediaInfo,\n        {\n            forceSticker,\n            forceGif,\n            forceVoice,\n            forceDocument,\n            forceMediaHd,\n            sendToChannel,\n            sendToStatus,\n        },\n    ) => {\n        const file = window.WWebJS.mediaInfoToFile(mediaInfo);\n        const OpaqueData = window.require('WAWebMediaOpaqueData');\n        const opaqueData = await OpaqueData.createFromData(\n            file,\n            mediaInfo.mimetype,\n        );\n        const mediaParams = {\n            asSticker: forceSticker,\n            asGif: forceGif,\n            isPtt: forceVoice,\n            asDocument: forceDocument,\n        };\n\n        if (forceMediaHd && file.type.indexOf('image/') === 0) {\n            mediaParams.maxDimension = 2560;\n        }\n\n        const mediaPrep = window\n            .require('WAWebPrepRawMedia')\n            .prepRawMedia(opaqueData, mediaParams);\n        const mediaData = await mediaPrep.waitForPrep();\n        const mediaObject = window\n            .require('WAWebMediaStorage')\n            .getOrCreateMediaObject(mediaData.filehash);\n        const mediaType = window.require('WAWebMmsMediaTypes').msgToMediaType({\n            type: mediaData.type,\n            isGif: mediaData.isGif,\n            isNewsletter: sendToChannel,\n        });\n\n        if (!mediaData.filehash) {\n            throw new Error('media-fault: sendToChat filehash undefined');\n        }\n\n        if (\n            (forceVoice && mediaData.type === 'ptt') ||\n            (sendToStatus && mediaData.type === 'audio')\n        ) {\n            const waveform = mediaObject.contentInfo.waveform;\n            mediaData.waveform =\n                waveform || (await window.WWebJS.generateWaveform(file));\n        }\n\n        if (!(mediaData.mediaBlob instanceof OpaqueData)) {\n            mediaData.mediaBlob = await OpaqueData.createFromData(\n                mediaData.mediaBlob,\n                mediaData.mediaBlob.type,\n            );\n        }\n\n        mediaData.renderableUrl = mediaData.mediaBlob.url();\n        mediaObject.consolidate(mediaData.toJSON());\n\n        mediaData.mediaBlob.autorelease();\n        const shouldUseMediaCache = window\n            .require('WAWebMediaDataUtils')\n            .shouldUseMediaCache(\n                window.require('WAWebMmsMediaTypes').castToV4(mediaObject.type),\n            );\n        if (shouldUseMediaCache && mediaData.mediaBlob instanceof OpaqueData) {\n            const formData = mediaData.mediaBlob.formData();\n            window\n                .require('WAWebMediaInMemoryBlobCache')\n                .InMemoryMediaBlobCache.put(mediaObject.filehash, formData);\n        }\n\n        const dataToUpload = {\n            mimetype: mediaData.mimetype,\n            mediaObject,\n            mediaType,\n            ...(sendToChannel\n                ? {\n                      calculateToken: window.require('WAMediaCalculateFilehash')\n                          .getRandomFilehash,\n                  }\n                : {}),\n        };\n\n        const { uploadMedia, uploadUnencryptedMedia } = window.require(\n            'WAWebMediaMmsV4Upload',\n        );\n        const uploadedMedia = !sendToChannel\n            ? await uploadMedia(dataToUpload)\n            : await uploadUnencryptedMedia(dataToUpload);\n\n        const mediaEntry = uploadedMedia.mediaEntry;\n        if (!mediaEntry) {\n            throw new Error('upload failed: media entry was not created');\n        }\n\n        mediaData.set({\n            clientUrl: mediaEntry.mmsUrl,\n            deprecatedMms3Url: mediaEntry.deprecatedMms3Url,\n            directPath: mediaEntry.directPath,\n            mediaKey: mediaEntry.mediaKey,\n            mediaKeyTimestamp: mediaEntry.mediaKeyTimestamp,\n            filehash: mediaObject.filehash,\n            encFilehash: mediaEntry.encFilehash,\n            uploadhash: mediaEntry.uploadHash,\n            size: mediaObject.size,\n            streamingSidecar: mediaEntry.sidecar,\n            firstFrameSidecar: mediaEntry.firstFrameSidecar,\n            mediaHandle: sendToChannel ? mediaEntry.handle : null,\n        });\n\n        return mediaData;\n    };\n\n    window.WWebJS.getMessageModel = (message) => {\n        const msg = message.serialize();\n\n        const { findLinks } = window.require('WALinkify');\n\n        msg.isEphemeral = message.isEphemeral;\n        msg.isStatusV3 = message.isStatusV3;\n        msg.links = findLinks(\n            message.mediaObject ? message.caption : message.body,\n        ).map((link) => ({\n            link: link.href,\n            isSuspicious: Boolean(\n                link.suspiciousCharacters && link.suspiciousCharacters.size,\n            ),\n        }));\n\n        if (msg.buttons) {\n            msg.buttons = msg.buttons.serialize();\n        }\n        if (msg.dynamicReplyButtons) {\n            msg.dynamicReplyButtons = JSON.parse(\n                JSON.stringify(msg.dynamicReplyButtons),\n            );\n        }\n        if (msg.replyButtons) {\n            msg.replyButtons = JSON.parse(JSON.stringify(msg.replyButtons));\n        }\n\n        if (typeof msg.id.remote === 'object') {\n            msg.id = Object.assign({}, msg.id, {\n                remote: msg.id.remote._serialized,\n            });\n        }\n\n        delete msg.pendingAckUpdate;\n\n        return msg;\n    };\n\n    window.WWebJS.getChat = async (chatId, { getAsModel = true } = {}) => {\n        const isChannel = /@\\w*newsletter\\b/.test(chatId);\n        const chatWid = window.require('WAWebWidFactory').createWid(chatId);\n        let chat;\n\n        if (isChannel) {\n            try {\n                chat = window\n                    .require('WAWebCollections')\n                    .WAWebNewsletterCollection.get(chatId);\n                if (!chat) {\n                    await window\n                        .require('WAWebLoadNewsletterPreviewChatAction')\n                        .loadNewsletterPreviewChat(chatId);\n                    chat = await window\n                        .require('WAWebCollections')\n                        .WAWebNewsletterCollection.find(chatWid);\n                }\n            } catch (err) {\n                chat = null;\n            }\n        } else {\n            chat =\n                window.require('WAWebCollections').Chat.get(chatWid) ||\n                (\n                    await window\n                        .require('WAWebFindChatAction')\n                        .findOrCreateLatestChat(chatWid)\n                )?.chat;\n        }\n\n        return getAsModel && chat\n            ? await window.WWebJS.getChatModel(chat, { isChannel: isChannel })\n            : chat;\n    };\n\n    window.WWebJS.getChannelMetadata = async (inviteCode) => {\n        const role = window\n            .require('WAWebNewsletterModelUtils')\n            .getRoleByIdentifier(inviteCode);\n        const response = await window\n            .require('WAWebNewsletterMetadataQueryJob')\n            .queryNewsletterMetadataByInviteCode(inviteCode, role);\n\n        const picUrl =\n            response.newsletterPictureMetadataMixin?.picture[0]\n                ?.queryPictureDirectPathOrEmptyResponseMixinGroup.value\n                .directPath;\n\n        return {\n            id: response.idJid,\n            createdAtTs:\n                response.newsletterCreationTimeMetadataMixin.creationTimeValue,\n            titleMetadata: {\n                title: response.newsletterNameMetadataMixin.nameElementValue,\n                updatedAtTs:\n                    response.newsletterNameMetadataMixin.nameUpdateTime,\n            },\n            descriptionMetadata: {\n                description:\n                    response.newsletterDescriptionMetadataMixin\n                        .descriptionQueryDescriptionResponseMixin.elementValue,\n                updatedAtTs:\n                    response.newsletterDescriptionMetadataMixin\n                        .descriptionQueryDescriptionResponseMixin.updateTime,\n            },\n            inviteLink: `https://whatsapp.com/channel/${response.newsletterInviteLinkMetadataMixin.inviteCode}`,\n            membershipType: role,\n            stateType: response.newsletterStateMetadataMixin.stateType,\n            pictureUrl: picUrl ? `https://pps.whatsapp.net${picUrl}` : null,\n            subscribersCount:\n                response.newsletterSubscribersMetadataMixin.subscribersCount,\n            isVerified:\n                response.newsletterVerificationMetadataMixin\n                    .verificationState === 'verified',\n        };\n    };\n\n    window.WWebJS.getChats = async () => {\n        const chats = window.require('WAWebCollections').Chat.getModelsArray();\n        const chatPromises = chats.map((chat) =>\n            window.WWebJS.getChatModel(chat),\n        );\n        return await Promise.all(chatPromises);\n    };\n\n    window.WWebJS.getChannels = async () => {\n        const channels = window\n            .require('WAWebCollections')\n            .WAWebNewsletterCollection.getModelsArray();\n        const channelPromises = channels?.map((channel) =>\n            window.WWebJS.getChatModel(channel, { isChannel: true }),\n        );\n        return await Promise.all(channelPromises);\n    };\n\n    window.WWebJS.getChatModel = async (chat, { isChannel = false } = {}) => {\n        if (!chat) return null;\n\n        const model = chat.serialize();\n        model.isGroup = false;\n        model.isMuted = chat.mute?.expiration !== 0;\n        if (isChannel) {\n            model.isChannel = window\n                .require('WAWebChatGetters')\n                .getIsNewsletter(chat);\n        } else {\n            model.formattedTitle = chat.formattedTitle;\n        }\n\n        if (chat.groupMetadata) {\n            model.isGroup = true;\n            const chatWid = window\n                .require('WAWebWidFactory')\n                .createWid(chat.id._serialized);\n            const groupMetadata =\n                window.require('WAWebCollections').GroupMetadata ||\n                window.require('WAWebCollections').WAWebGroupMetadataCollection;\n            await groupMetadata.update(chatWid);\n            chat.groupMetadata.participants._models\n                .filter((x) => x.id?._serialized?.endsWith('@lid'))\n                .forEach(\n                    (x) =>\n                        x.contact?.phoneNumber &&\n                        (x.id = x.contact.phoneNumber),\n                );\n            model.groupMetadata = chat.groupMetadata.serialize();\n            model.isReadOnly = chat.groupMetadata.announce;\n        }\n\n        if (chat.newsletterMetadata) {\n            const newsletterMetadata =\n                window.require('WAWebCollections')\n                    .NewsletterMetadataCollection ||\n                window.require('WAWebCollections')\n                    .WAWebNewsletterMetadataCollection;\n            await newsletterMetadata.update(chat.id);\n            model.channelMetadata = chat.newsletterMetadata.serialize();\n            model.channelMetadata.createdAtTs =\n                chat.newsletterMetadata.creationTime;\n        }\n\n        model.lastMessage = null;\n        if (model.msgs && model.msgs.length) {\n            const lastMessage = chat.lastReceivedKey\n                ? window\n                      .require('WAWebCollections')\n                      .Msg.get(chat.lastReceivedKey._serialized) ||\n                  (\n                      await window\n                          .require('WAWebCollections')\n                          .Msg.getMessagesById([\n                              chat.lastReceivedKey._serialized,\n                          ])\n                  )?.messages?.[0]\n                : null;\n            lastMessage &&\n                (model.lastMessage =\n                    window.WWebJS.getMessageModel(lastMessage));\n        }\n\n        delete model.msgs;\n        delete model.msgUnsyncedButtonReplyMsgs;\n        delete model.unsyncedButtonReplies;\n\n        return model;\n    };\n\n    window.WWebJS.getContactModel = (contact) => {\n        let res = contact.serialize();\n        res.isBusiness =\n            contact.isBusiness === undefined ? false : contact.isBusiness;\n\n        if (contact.businessProfile) {\n            res.businessProfile = contact.businessProfile.serialize();\n        }\n\n        res.isBlocked = contact.isContactBlocked;\n\n        const ContactMethods = window.require('WAWebContactGetters');\n        res.isMe = ContactMethods.getIsMe(contact);\n        res.isUser = ContactMethods.getIsUser(contact);\n        res.isGroup = ContactMethods.getIsGroup(contact);\n        res.isWAContact = ContactMethods.getIsWAContact(contact);\n        res.userid = ContactMethods.getUserid(contact);\n        res.verifiedName = ContactMethods.getVerifiedName(contact);\n        res.verifiedLevel = ContactMethods.getVerifiedLevel(contact);\n        res.statusMute = ContactMethods.getStatusMute(contact);\n        res.name = ContactMethods.getName(contact);\n        res.shortName = ContactMethods.getShortName(contact);\n        res.pushname = ContactMethods.getPushname(contact);\n\n        const { getIsMyContact } = window.require(\n            'WAWebFrontendContactGetters',\n        );\n        res.isMyContact = getIsMyContact(contact);\n        res.isEnterprise = ContactMethods.getIsEnterprise(contact);\n\n        return res;\n    };\n\n    window.WWebJS.getContact = async (contactId) => {\n        const wid = window.require('WAWebWidFactory').createWid(contactId);\n        let contact = await window\n            .require('WAWebCollections')\n            .Contact.find(wid);\n        if (contact.id._serialized.endsWith('@lid')) {\n            contact.id = contact.phoneNumber;\n        }\n        const bizProfile = await window\n            .require('WAWebCollections')\n            .BusinessProfile.fetchBizProfile(wid);\n        bizProfile.profileOptions && (contact.businessProfile = bizProfile);\n        return window.WWebJS.getContactModel(contact);\n    };\n\n    window.WWebJS.getContacts = () => {\n        const contacts = window\n            .require('WAWebCollections')\n            .Contact.getModelsArray();\n        return contacts.map((contact) =>\n            window.WWebJS.getContactModel(contact),\n        );\n    };\n\n    window.WWebJS.mediaInfoToFile = ({ data, mimetype, filename }) => {\n        const binaryData = window.atob(data);\n\n        const buffer = new ArrayBuffer(binaryData.length);\n        const view = new Uint8Array(buffer);\n        for (let i = 0; i < binaryData.length; i++) {\n            view[i] = binaryData.charCodeAt(i);\n        }\n\n        const blob = new Blob([buffer], { type: mimetype });\n        return new File([blob], filename, {\n            type: mimetype,\n            lastModified: Date.now(),\n        });\n    };\n\n    window.WWebJS.arrayBufferToBase64 = (arrayBuffer) => {\n        let binary = '';\n        const bytes = new Uint8Array(arrayBuffer);\n        const len = bytes.byteLength;\n        for (let i = 0; i < len; i++) {\n            binary += String.fromCharCode(bytes[i]);\n        }\n        return window.btoa(binary);\n    };\n\n    window.WWebJS.arrayBufferToBase64Async = (arrayBuffer) =>\n        new Promise((resolve, reject) => {\n            const blob = new Blob([arrayBuffer], {\n                type: 'application/octet-stream',\n            });\n            const fileReader = new FileReader();\n            fileReader.onload = () => {\n                const [, data] = fileReader.result.split(',');\n                resolve(data);\n            };\n            fileReader.onerror = (e) => reject(e);\n            fileReader.readAsDataURL(blob);\n        });\n\n    window.WWebJS.getFileHash = async (data) => {\n        let buffer = await data.arrayBuffer();\n        const hashBuffer = await crypto.subtle.digest('SHA-256', buffer);\n        return btoa(String.fromCharCode(...new Uint8Array(hashBuffer)));\n    };\n\n    window.WWebJS.generateHash = async (length) => {\n        var result = '';\n        var characters =\n            'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';\n        var charactersLength = characters.length;\n        for (var i = 0; i < length; i++) {\n            result += characters.charAt(\n                Math.floor(Math.random() * charactersLength),\n            );\n        }\n        return result;\n    };\n\n    window.WWebJS.generateWaveform = async (audioFile) => {\n        try {\n            const audioData = await audioFile.arrayBuffer();\n            const audioContext = new AudioContext();\n            const audioBuffer = await audioContext.decodeAudioData(audioData);\n\n            const rawData = audioBuffer.getChannelData(0);\n            const samples = 64;\n            const blockSize = Math.floor(rawData.length / samples);\n            const filteredData = [];\n            for (let i = 0; i < samples; i++) {\n                const blockStart = blockSize * i;\n                let sum = 0;\n                for (let j = 0; j < blockSize; j++) {\n                    sum = sum + Math.abs(rawData[blockStart + j]);\n                }\n                filteredData.push(sum / blockSize);\n            }\n\n            const multiplier = Math.pow(Math.max(...filteredData), -1);\n            const normalizedData = filteredData.map((n) => n * multiplier);\n\n            const waveform = new Uint8Array(\n                normalizedData.map((n) => Math.floor(100 * n)),\n            );\n\n            return waveform;\n        } catch (e) {\n            return undefined;\n        }\n    };\n\n    window.WWebJS.sendClearChat = async (chatId) => {\n        let chat = await window.WWebJS.getChat(chatId, { getAsModel: false });\n        if (chat !== undefined) {\n            await window.require('WAWebChatClearBridge').sendClear(chat, false);\n            return true;\n        }\n        return false;\n    };\n\n    window.WWebJS.sendDeleteChat = async (chatId) => {\n        let chat = await window.WWebJS.getChat(chatId, { getAsModel: false });\n        if (chat !== undefined) {\n            await window.require('WAWebDeleteChatAction').sendDelete(chat);\n            return true;\n        }\n        return false;\n    };\n\n    window.WWebJS.sendChatstate = async (state, chatId) => {\n        chatId = window.require('WAWebWidFactory').createWid(chatId);\n\n        const ChatState = window.require('WAWebChatStateBridge');\n        switch (state) {\n            case 'typing':\n                await ChatState.sendChatStateComposing(chatId);\n                break;\n            case 'recording':\n                await ChatState.sendChatStateRecording(chatId);\n                break;\n            case 'stop':\n                await ChatState.sendChatStatePaused(chatId);\n                break;\n            default:\n                throw 'Invalid chatstate';\n        }\n\n        return true;\n    };\n\n    window.WWebJS.getLabelModel = (label) => {\n        let res = label.serialize();\n        res.hexColor = label.hexColor;\n\n        return res;\n    };\n\n    window.WWebJS.getLabels = () => {\n        const labels = window\n            .require('WAWebCollections')\n            .Label.getModelsArray();\n        return labels.map((label) => window.WWebJS.getLabelModel(label));\n    };\n\n    window.WWebJS.getLabel = (labelId) => {\n        const label = window.require('WAWebCollections').Label.get(labelId);\n        return window.WWebJS.getLabelModel(label);\n    };\n\n    window.WWebJS.getChatLabels = async (chatId) => {\n        const chat = await window.WWebJS.getChat(chatId);\n        return (chat.labels || []).map((id) => window.WWebJS.getLabel(id));\n    };\n\n    window.WWebJS.getOrderDetail = async (orderId, token, chatId) => {\n        const chatWid = window.require('WAWebWidFactory').createWid(chatId);\n        return window\n            .require('WAWebBizOrderBridge')\n            .queryOrder(chatWid, orderId, 80, 80, token);\n    };\n\n    window.WWebJS.getProductMetadata = async (productId) => {\n        let sellerId = window.require('WAWebConnModel').Conn.wid;\n        let product = await window\n            .require('WAWebBizProductCatalogBridge')\n            .queryProduct(sellerId, productId);\n        if (product && product.data) {\n            return product.data;\n        }\n\n        return undefined;\n    };\n\n    window.WWebJS.rejectCall = async (peerJid, id) => {\n        let userId = window\n            .require('WAWebUserPrefsMeUser')\n            .getMaybeMePnUser()._serialized;\n\n        const stanza = window.require('WAWap').wap(\n            'call',\n            {\n                id: window.require('WAWap').generateId(),\n                from: userId,\n                to: peerJid,\n            },\n            [\n                window.require('WAWap').wap('reject', {\n                    'call-id': id,\n                    'call-creator': peerJid,\n                    count: '0',\n                }),\n            ],\n        );\n        await window.require('WADeprecatedSendIq').deprecatedCastStanza(stanza);\n    };\n\n    window.WWebJS.cropAndResizeImage = async (media, options = {}) => {\n        if (!media.mimetype.includes('image'))\n            throw new Error('Media is not an image');\n\n        if (options.mimetype && !options.mimetype.includes('image'))\n            delete options.mimetype;\n\n        options = Object.assign(\n            {\n                size: 640,\n                mimetype: media.mimetype,\n                quality: 0.75,\n                asDataUrl: false,\n            },\n            options,\n        );\n\n        const img = await new Promise((resolve, reject) => {\n            const img = new Image();\n            img.onload = () => resolve(img);\n            img.onerror = reject;\n            img.src = `data:${media.mimetype};base64,${media.data}`;\n        });\n\n        const sl = Math.min(img.width, img.height);\n        const sx = Math.floor((img.width - sl) / 2);\n        const sy = Math.floor((img.height - sl) / 2);\n\n        const canvas = document.createElement('canvas');\n        canvas.width = options.size;\n        canvas.height = options.size;\n\n        const ctx = canvas.getContext('2d');\n        ctx.drawImage(img, sx, sy, sl, sl, 0, 0, options.size, options.size);\n\n        const dataUrl = canvas.toDataURL(options.mimetype, options.quality);\n\n        if (options.asDataUrl) return dataUrl;\n\n        return Object.assign(media, {\n            mimetype: options.mimetype,\n            data: dataUrl.replace(`data:${options.mimetype};base64,`, ''),\n        });\n    };\n\n    window.WWebJS.setPicture = async (chatId, media) => {\n        const thumbnail = await window.WWebJS.cropAndResizeImage(media, {\n            asDataUrl: true,\n            mimetype: 'image/jpeg',\n            size: 96,\n        });\n        const profilePic = await window.WWebJS.cropAndResizeImage(media, {\n            asDataUrl: true,\n            mimetype: 'image/jpeg',\n            size: 640,\n        });\n\n        const chatWid = window.require('WAWebWidFactory').createWid(chatId);\n        try {\n            const collection =\n                window\n                    .require('WAWebCollections')\n                    .ProfilePicThumb.get(chatId) ||\n                (await window\n                    .require('WAWebCollections')\n                    .ProfilePicThumb.find(chatId));\n            if (!collection?.canSet()) return false;\n\n            const res = await window\n                .require('WAWebContactProfilePicThumbBridge')\n                .sendSetPicture(chatWid, thumbnail, profilePic);\n            return res ? res.status === 200 : false;\n        } catch (err) {\n            if (err.name === 'ServerStatusCodeError') return false;\n            throw err;\n        }\n    };\n\n    window.WWebJS.deletePicture = async (chatid) => {\n        const chatWid = window.require('WAWebWidFactory').createWid(chatid);\n        try {\n            const collection = window\n                .require('WAWebCollections')\n                .ProfilePicThumb.get(chatid);\n            if (!collection.canDelete()) return;\n\n            const res = await window\n                .require('WAWebContactProfilePicThumbBridge')\n                .requestDeletePicture(chatWid);\n            return res ? res.status === 200 : false;\n        } catch (err) {\n            if (err.name === 'ServerStatusCodeError') return false;\n            throw err;\n        }\n    };\n\n    window.WWebJS.getProfilePicThumbToBase64 = async (chatWid) => {\n        const profilePicCollection = await window\n            .require('WAWebCollections')\n            .ProfilePicThumb.find(chatWid);\n\n        const _readImageAsBase64 = (imageBlob) => {\n            return new Promise((resolve) => {\n                const reader = new FileReader();\n                reader.onloadend = function () {\n                    const base64Image = reader.result;\n                    if (base64Image == null) {\n                        resolve(undefined);\n                    } else {\n                        const base64Data = base64Image.toString().split(',')[1];\n                        resolve(base64Data);\n                    }\n                };\n                reader.readAsDataURL(imageBlob);\n            });\n        };\n\n        if (profilePicCollection?.img) {\n            try {\n                const response = await fetch(profilePicCollection.img);\n                if (response.ok) {\n                    const imageBlob = await response.blob();\n                    if (imageBlob) {\n                        const base64Image = await _readImageAsBase64(imageBlob);\n                        return base64Image;\n                    }\n                }\n            } catch (error) {\n                /* empty */\n            }\n        }\n        return undefined;\n    };\n\n    window.WWebJS.getAddParticipantsRpcResult = async (\n        groupWid,\n        participantWid,\n    ) => {\n        const iqTo = window.require('WAWebWidToJid').widToGroupJid(groupWid);\n\n        const participantArgs = [\n            {\n                participantJid: window\n                    .require('WAWebWidToJid')\n                    .widToUserJid(participantWid),\n            },\n        ];\n\n        let rpcResult, resultArgs;\n        const data = {\n            name: undefined,\n            code: undefined,\n            inviteV4Code: undefined,\n            inviteV4CodeExp: undefined,\n        };\n\n        try {\n            rpcResult = await window\n                .require('WASmaxGroupsAddParticipantsRPC')\n                .sendAddParticipantsRPC({ participantArgs, iqTo });\n            resultArgs =\n                rpcResult.value.addParticipant[0]\n                    .addParticipantsParticipantAddedOrNonRegisteredWaUserParticipantErrorLidResponseMixinGroup\n                    .value.addParticipantsParticipantMixins;\n        } catch (err) {\n            data.code = 400;\n            return data;\n        }\n\n        if (rpcResult.name === 'AddParticipantsResponseSuccess') {\n            const code = resultArgs?.value.error || '200';\n            data.name = resultArgs?.name;\n            data.code = +code;\n            data.inviteV4Code = resultArgs?.value.addRequestCode;\n            data.inviteV4CodeExp =\n                resultArgs?.value.addRequestExpiration?.toString();\n        } else if (rpcResult.name === 'AddParticipantsResponseClientError') {\n            const { code: code } =\n                rpcResult.value.errorAddParticipantsClientErrors.value;\n            data.code = +code;\n        } else if (rpcResult.name === 'AddParticipantsResponseServerError') {\n            const { code: code } = rpcResult.value.errorServerErrors.value;\n            data.code = +code;\n        }\n\n        return data;\n    };\n\n    window.WWebJS.membershipRequestAction = async (\n        groupId,\n        action,\n        requesterIds,\n        sleep,\n    ) => {\n        const groupWid = window.require('WAWebWidFactory').createWid(groupId);\n        const group = await window\n            .require('WAWebCollections')\n            .Chat.find(groupWid);\n        const toApprove = action === 'Approve';\n        let membershipRequests;\n        let response;\n        let result = [];\n\n        await window\n            .require('WAWebGroupQueryJob')\n            .queryAndUpdateGroupMetadataById({ id: groupId });\n\n        if (!requesterIds?.length) {\n            membershipRequests =\n                group.groupMetadata.membershipApprovalRequests._models.map(\n                    ({ id }) => id,\n                );\n        } else {\n            !Array.isArray(requesterIds) && (requesterIds = [requesterIds]);\n            membershipRequests = requesterIds.map((r) =>\n                window.require('WAWebWidFactory').createWid(r),\n            );\n        }\n\n        if (!membershipRequests.length) return [];\n\n        const participantArgs = membershipRequests.map((m) => ({\n            participantArgs: [\n                {\n                    participantJid: window\n                        .require('WAWebWidToJid')\n                        .widToUserJid(m),\n                },\n            ],\n        }));\n\n        const groupJid = window\n            .require('WAWebWidToJid')\n            .widToGroupJid(groupWid);\n\n        const _getSleepTime = (sleep) => {\n            if (\n                !Array.isArray(sleep) ||\n                (sleep.length === 2 && sleep[0] === sleep[1])\n            ) {\n                return sleep;\n            }\n            if (sleep.length === 1) {\n                return sleep[0];\n            }\n            sleep[1] - sleep[0] < 100 &&\n                (sleep[0] = sleep[1]) &&\n                (sleep[1] += 100);\n            return (\n                Math.floor(Math.random() * (sleep[1] - sleep[0] + 1)) + sleep[0]\n            );\n        };\n\n        const membReqResCodes = {\n            default: `An unknown error occupied while ${toApprove ? 'approving' : 'rejecting'} the participant membership request`,\n            400: 'ParticipantNotFoundError',\n            401: 'ParticipantNotAuthorizedError',\n            403: 'ParticipantForbiddenError',\n            404: 'ParticipantRequestNotFoundError',\n            408: 'ParticipantTemporarilyBlockedError',\n            409: 'ParticipantConflictError',\n            412: 'ParticipantParentLinkedGroupsResourceConstraintError',\n            500: 'ParticipantResourceConstraintError',\n        };\n\n        try {\n            for (const participant of participantArgs) {\n                response = await window\n                    .require('WASmaxGroupsMembershipRequestsActionRPC')\n                    .sendMembershipRequestsActionRPC({\n                        iqTo: groupJid,\n                        [toApprove ? 'approveArgs' : 'rejectArgs']: participant,\n                    });\n\n                if (\n                    response.name === 'MembershipRequestsActionResponseSuccess'\n                ) {\n                    const value = toApprove\n                        ? response.value.membershipRequestsActionApprove\n                        : response.value.membershipRequestsActionReject;\n                    if (value?.participant) {\n                        const [_] = value.participant.map((p) => {\n                            const error = toApprove\n                                ? value.participant[0]\n                                      .membershipRequestsActionAcceptParticipantMixins\n                                      ?.value.error\n                                : value.participant[0]\n                                      .membershipRequestsActionRejectParticipantMixins\n                                      ?.value.error;\n                            return {\n                                requesterId: window\n                                    .require('WAWebWidFactory')\n                                    .createWid(p.jid)._serialized,\n                                ...(error\n                                    ? {\n                                          error: +error,\n                                          message:\n                                              membReqResCodes[error] ||\n                                              membReqResCodes.default,\n                                      }\n                                    : {\n                                          message: `${toApprove ? 'Approved' : 'Rejected'} successfully`,\n                                      }),\n                            };\n                        });\n                        _ && result.push(_);\n                    }\n                } else {\n                    result.push({\n                        requesterId: window\n                            .require('WAWebJidToWid')\n                            .userJidToUserWid(\n                                participant.participantArgs[0].participantJid,\n                            )._serialized,\n                        message: 'ServerStatusCodeError',\n                    });\n                }\n\n                sleep &&\n                    participantArgs.length > 1 &&\n                    participantArgs.indexOf(participant) !==\n                        participantArgs.length - 1 &&\n                    (await new Promise((resolve) =>\n                        setTimeout(resolve, _getSleepTime(sleep)),\n                    ));\n            }\n            return result;\n        } catch (err) {\n            return [];\n        }\n    };\n\n    window.WWebJS.subscribeToUnsubscribeFromChannel = async (\n        channelId,\n        action,\n        options = {},\n    ) => {\n        const channel = await window.WWebJS.getChat(channelId, {\n            getAsModel: false,\n        });\n\n        if (!channel || channel.newsletterMetadata.membershipType === 'owner')\n            return false;\n        options = {\n            eventSurface: 3,\n            deleteLocalModels: options.deleteLocalModels ?? true,\n        };\n\n        try {\n            if (action === 'Subscribe') {\n                await window\n                    .require('WAWebNewsletterSubscribeAction')\n                    .subscribeToNewsletterAction(channel, options);\n            } else if (action === 'Unsubscribe') {\n                await window\n                    .require('WAWebNewsletterUnsubscribeAction')\n                    .unsubscribeFromNewsletterAction(channel, options);\n            } else return false;\n            return true;\n        } catch (err) {\n            if (err.name === 'ServerStatusCodeError') return false;\n            throw err;\n        }\n    };\n\n    window.WWebJS.pinUnpinMsgAction = async (msgId, action, duration) => {\n        const message =\n            window.require('WAWebCollections').Msg.get(msgId) ||\n            (\n                await window\n                    .require('WAWebCollections')\n                    .Msg.getMessagesById([msgId])\n            )?.messages?.[0];\n        if (!message) return false;\n\n        if (typeof duration !== 'number') return false;\n\n        const originalFunction = window.require(\n            'WAWebPinMsgConstants',\n        ).getPinExpiryDuration;\n        window.require('WAWebPinMsgConstants').getPinExpiryDuration = () =>\n            duration;\n\n        const response = await window\n            .require('WAWebSendPinMessageAction')\n            .sendPinInChatMsg(message, action, duration);\n\n        window.require('WAWebPinMsgConstants').getPinExpiryDuration =\n            originalFunction;\n\n        return response.messageSendResult === 'OK';\n    };\n\n    window.WWebJS.getStatusModel = (status) => {\n        const res = status.serialize();\n        delete res._msgs;\n        return res;\n    };\n\n    window.WWebJS.getAllStatuses = () => {\n        const statuses = window\n            .require('WAWebCollections')\n            .Status.getModelsArray();\n        return statuses.map((status) => window.WWebJS.getStatusModel(status));\n    };\n\n    window.WWebJS.enforceLidAndPnRetrieval = async (userId) => {\n        const wid = window.require('WAWebWidFactory').createWid(userId);\n        const isLid = wid.server === 'lid';\n\n        let lid = isLid\n            ? wid\n            : window.require('WAWebApiContact').getCurrentLid(wid);\n        let phone = isLid\n            ? window.require('WAWebApiContact').getPhoneNumber(wid)\n            : wid;\n\n        if (!isLid && !lid) {\n            const queryResult = await window\n                .require('WAWebQueryExistsJob')\n                .queryWidExists(wid);\n            if (!queryResult?.wid) return {};\n            lid = window.require('WAWebApiContact').getCurrentLid(wid);\n        }\n\n        if (isLid && !phone) {\n            const queryResult = await window\n                .require('WAWebQueryExistsJob')\n                .queryWidExists(wid);\n            if (!queryResult?.wid) return {};\n            phone = window.require('WAWebApiContact').getPhoneNumber(wid);\n        }\n\n        return { lid, phone };\n    };\n\n    window.WWebJS.assertColor = (hex) => {\n        let color;\n        if (typeof hex === 'number') {\n            color = hex > 0 ? hex : 0xffffffff + parseInt(hex) + 1;\n        } else if (typeof hex === 'string') {\n            let number = hex.trim().replace('#', '');\n            if (number.length <= 6) {\n                number = 'FF' + number.padStart(6, '0');\n            }\n            color = parseInt(number, 16);\n        } else {\n            throw 'Invalid hex color';\n        }\n        return color;\n    };\n};\n"
  },
  {
    "path": "src/util/InterfaceController.js",
    "content": "'use strict';\n\n/**\n * Interface Controller\n */\nclass InterfaceController {\n    constructor(props) {\n        this.pupPage = props.pupPage;\n    }\n\n    /**\n     * Opens the Chat Window\n     * @param {string} chatId ID of the chat window that will be opened\n     */\n    async openChatWindow(chatId) {\n        return await this.pupPage.evaluate(async (chatId) => {\n            const chat = await window.WWebJS.getChat(chatId, {\n                getAsModel: false,\n            });\n            return await window\n                .require('WAWebCmd')\n                .Cmd.openChatBottom({ chat: chat });\n        }, chatId);\n    }\n\n    /**\n     * Opens the Chat Drawer\n     * @param {string} chatId ID of the chat drawer that will be opened\n     */\n    async openChatDrawer(chatId) {\n        await this.pupPage.evaluate(async (chatId) => {\n            let chat = await window.WWebJS.getChat(chatId, {\n                getAsModel: false,\n            });\n            await window.require('WAWebCmd').Cmd.openDrawerMid(chat);\n        }, chatId);\n    }\n\n    /**\n     * Opens the Chat Search\n     * @param {string} chatId ID of the chat search that will be opened\n     */\n    async openChatSearch(chatId) {\n        await this.pupPage.evaluate(async (chatId) => {\n            let chat = await window.WWebJS.getChat(chatId, {\n                getAsModel: false,\n            });\n            await window.require('WAWebCmd').Cmd.chatSearch(chat);\n        }, chatId);\n    }\n\n    /**\n     * Opens or Scrolls the Chat Window to the position of the message\n     * @param {string} msgId ID of the message that will be scrolled to\n     */\n    async openChatWindowAt(msgId) {\n        await this.pupPage.evaluate(async (msgId) => {\n            const msg =\n                window.require('WAWebCollections').Msg.get(msgId) ||\n                (\n                    await window\n                        .require('WAWebCollections')\n                        .Msg.getMessagesById([msgId])\n                )?.messages?.[0];\n            const chat =\n                window.require('WAWebCollections').Chat.get(msg.id.remote) ??\n                (await window\n                    .require('WAWebCollections')\n                    .Chat.find(msg.id.remote));\n            const searchContext = await window\n                .require('WAWebChatMessageSearch')\n                .getSearchContext(chat, msg.id);\n            await window\n                .require('WAWebCmd')\n                .Cmd.openChatAt({ chat: chat, msgContext: searchContext });\n        }, msgId);\n    }\n\n    /**\n     * Opens the Message Drawer\n     * @param {string} msgId ID of the message drawer that will be opened\n     */\n    async openMessageDrawer(msgId) {\n        await this.pupPage.evaluate(async (msgId) => {\n            const msg =\n                window.require('WAWebCollections').Msg.get(msgId) ||\n                (\n                    await window\n                        .require('WAWebCollections')\n                        .Msg.getMessagesById([msgId])\n                )?.messages?.[0];\n            await window.require('WAWebCmd').Cmd.msgInfoDrawer(msg);\n        }, msgId);\n    }\n\n    /**\n     * Closes the Right Drawer\n     */\n    async closeRightDrawer() {\n        await this.pupPage.evaluate(async () => {\n            await window\n                .require('WAWebDrawerManager')\n                .DrawerManager.closeDrawerRight();\n        });\n    }\n\n    /**\n     * Get all Features\n     */\n    async getFeatures() {\n        return await this.pupPage.evaluate(() => {\n            if (!window.require('WAWebCollections').Features)\n                throw new Error(\n                    'This version of Whatsapp Web does not support features',\n                );\n            return window.require('WAWebCollections').Features.F;\n        });\n    }\n\n    /**\n     * Check if Feature is enabled\n     * @param {string} feature status to check\n     */\n    async checkFeatureStatus(feature) {\n        return await this.pupPage.evaluate((feature) => {\n            if (!window.require('WAWebCollections').Features)\n                throw new Error(\n                    'This version of Whatsapp Web does not support features',\n                );\n            return window\n                .require('WAWebCollections')\n                .Features.supportsFeature(feature);\n        }, feature);\n    }\n\n    /**\n     * Enable Features\n     * @param {string[]} features to be enabled\n     */\n    async enableFeatures(features) {\n        await this.pupPage.evaluate((features) => {\n            if (!window.require('WAWebCollections').Features)\n                throw new Error(\n                    'This version of Whatsapp Web does not support features',\n                );\n            for (const feature in features) {\n                window\n                    .require('WAWebCollections')\n                    .Features.setFeature(features[feature], true);\n            }\n        }, features);\n    }\n\n    /**\n     * Disable Features\n     * @param {string[]} features to be disabled\n     */\n    async disableFeatures(features) {\n        await this.pupPage.evaluate((features) => {\n            if (!window.require('WAWebCollections').Features)\n                throw new Error(\n                    'This version of Whatsapp Web does not support features',\n                );\n            for (const feature in features) {\n                window\n                    .require('WAWebCollections')\n                    .Features.setFeature(features[feature], false);\n            }\n        }, features);\n    }\n}\n\nmodule.exports = InterfaceController;\n"
  },
  {
    "path": "src/util/Puppeteer.js",
    "content": "/**\n * Expose a function to the page if it does not exist\n *\n * NOTE:\n * Rewrite it to 'upsertFunction' after updating Puppeteer to 20.6 or higher\n * using page.removeExposedFunction\n * https://pptr.dev/api/puppeteer.page.removeexposedfunction\n *\n * @param {object} page - Puppeteer Page instance\n * @param {string} name\n * @param {Function} fn\n */\nasync function exposeFunctionIfAbsent(page, name, fn) {\n    const exist = await page.evaluate((name) => {\n        return !!window[name];\n    }, name);\n    if (exist) {\n        return;\n    }\n    await page.exposeFunction(name, fn);\n}\n\nmodule.exports = { exposeFunctionIfAbsent };\n"
  },
  {
    "path": "src/util/Util.js",
    "content": "'use strict';\n\nconst path = require('path');\nconst Crypto = require('crypto');\nconst { tmpdir } = require('os');\nconst ffmpeg = require('fluent-ffmpeg');\nconst webp = require('node-webpmux');\nconst fs = require('fs').promises;\nconst has = (o, k) => Object.prototype.hasOwnProperty.call(o, k);\n\n/**\n * Utility methods\n */\nclass Util {\n    constructor() {\n        throw new Error(\n            `The ${this.constructor.name} class may not be instantiated.`,\n        );\n    }\n\n    static generateHash(length) {\n        var result = '';\n        var characters =\n            'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';\n        var charactersLength = characters.length;\n        for (var i = 0; i < length; i++) {\n            result += characters.charAt(\n                Math.floor(Math.random() * charactersLength),\n            );\n        }\n        return result;\n    }\n\n    /**\n     * Sets default properties on an object that aren't already specified.\n     * @param {Object} def Default properties\n     * @param {Object} given Object to assign defaults to\n     * @returns {Object}\n     * @private\n     */\n    static mergeDefault(def, given) {\n        if (!given) return def;\n        for (const key in def) {\n            if (!has(given, key) || given[key] === undefined) {\n                given[key] = def[key];\n            } else if (given[key] === Object(given[key])) {\n                given[key] = Util.mergeDefault(def[key], given[key]);\n            }\n        }\n\n        return given;\n    }\n\n    /**\n     * Formats a image to webp\n     * @param {MessageMedia} media\n     *\n     * @returns {Promise<MessageMedia>} media in webp format\n     */\n    static async formatImageToWebpSticker(media, pupPage) {\n        if (!media.mimetype.includes('image'))\n            throw new Error('media is not a image');\n\n        if (media.mimetype.includes('webp')) {\n            return media;\n        }\n\n        return pupPage.evaluate((media) => {\n            return window.WWebJS.toStickerData(media);\n        }, media);\n    }\n\n    /**\n     * Formats a video to webp\n     * @param {MessageMedia} media\n     *\n     * @returns {Promise<MessageMedia>} media in webp format\n     */\n    static async formatVideoToWebpSticker(media) {\n        if (!media.mimetype.includes('video'))\n            throw new Error('media is not a video');\n\n        const videoType = media.mimetype.split('/')[1];\n\n        const tempFile = path.join(\n            tmpdir(),\n            `${Crypto.randomBytes(6).readUIntLE(0, 6).toString(36)}.webp`,\n        );\n\n        const stream = new (require('stream').Readable)();\n        const buffer = Buffer.from(\n            media.data.replace(`data:${media.mimetype};base64,`, ''),\n            'base64',\n        );\n        stream.push(buffer);\n        stream.push(null);\n\n        await new Promise((resolve, reject) => {\n            ffmpeg(stream)\n                .inputFormat(videoType)\n                .on('error', reject)\n                .on('end', () => resolve(true))\n                .addOutputOptions([\n                    '-vcodec',\n                    'libwebp',\n                    '-vf',\n                    // eslint-disable-next-line no-useless-escape\n                    \"scale='iw*min(300/iw\\,300/ih)':'ih*min(300/iw\\,300/ih)',format=rgba,pad=300:300:'(300-iw)/2':'(300-ih)/2':'#00000000',setsar=1,fps=10\",\n                    '-loop',\n                    '0',\n                    '-ss',\n                    '00:00:00.0',\n                    '-t',\n                    '00:00:05.0',\n                    '-preset',\n                    'default',\n                    '-an',\n                    '-vsync',\n                    '0',\n                    '-s',\n                    '512:512',\n                ])\n                .toFormat('webp')\n                .save(tempFile);\n        });\n\n        const data = await fs.readFile(tempFile, 'base64');\n        await fs.unlink(tempFile);\n\n        return {\n            mimetype: 'image/webp',\n            data: data,\n            filename: media.filename,\n        };\n    }\n\n    /**\n     * Sticker metadata.\n     * @typedef {Object} StickerMetadata\n     * @property {string} [name]\n     * @property {string} [author]\n     * @property {string[]} [categories]\n     */\n\n    /**\n     * Formats a media to webp\n     * @param {MessageMedia} media\n     * @param {StickerMetadata} metadata\n     *\n     * @returns {Promise<MessageMedia>} media in webp format\n     */\n    static async formatToWebpSticker(media, metadata, pupPage) {\n        let webpMedia;\n\n        if (media.mimetype.includes('image'))\n            webpMedia = await this.formatImageToWebpSticker(media, pupPage);\n        else if (media.mimetype.includes('video'))\n            webpMedia = await this.formatVideoToWebpSticker(media);\n        else throw new Error('Invalid media format');\n\n        if (metadata.name || metadata.author) {\n            const img = new webp.Image();\n            const hash = this.generateHash(32);\n            const stickerPackId = hash;\n            const packname = metadata.name;\n            const author = metadata.author;\n            const categories = metadata.categories || [''];\n            const json = {\n                'sticker-pack-id': stickerPackId,\n                'sticker-pack-name': packname,\n                'sticker-pack-publisher': author,\n                emojis: categories,\n            };\n            let exifAttr = Buffer.from([\n                0x49, 0x49, 0x2a, 0x00, 0x08, 0x00, 0x00, 0x00, 0x01, 0x00,\n                0x41, 0x57, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00,\n                0x00, 0x00,\n            ]);\n            let jsonBuffer = Buffer.from(JSON.stringify(json), 'utf8');\n            let exif = Buffer.concat([exifAttr, jsonBuffer]);\n            exif.writeUIntLE(jsonBuffer.length, 14, 4);\n            await img.load(Buffer.from(webpMedia.data, 'base64'));\n            img.exif = exif;\n            webpMedia.data = (await img.save(null)).toString('base64');\n        }\n\n        return webpMedia;\n    }\n\n    /**\n     * Configure ffmpeg path\n     * @param {string} path\n     */\n    static setFfmpegPath(path) {\n        ffmpeg.setFfmpegPath(path);\n    }\n}\n\nmodule.exports = Util;\n"
  },
  {
    "path": "src/webCache/LocalWebCache.js",
    "content": "const path = require('path');\nconst fs = require('fs');\n\nconst { WebCache, VersionResolveError } = require('./WebCache');\n\n/**\n * LocalWebCache - Fetches a WhatsApp Web version from a local file store\n * @param {object} options - options\n * @param {string} options.path - Path to the directory where cached versions are saved, default is: \"./.wwebjs_cache/\"\n * @param {boolean} options.strict - If true, will throw an error if the requested version can't be fetched. If false, will resolve to the latest version.\n */\nclass LocalWebCache extends WebCache {\n    constructor(options = {}) {\n        super();\n\n        this.path = options.path || './.wwebjs_cache/';\n        this.strict = options.strict || false;\n    }\n\n    async resolve(version) {\n        const filePath = path.join(this.path, `${version}.html`);\n\n        try {\n            return fs.readFileSync(filePath, 'utf-8');\n        } catch (err) {\n            if (this.strict)\n                throw new VersionResolveError(\n                    `Couldn't load version ${version} from the cache`,\n                );\n            return null;\n        }\n    }\n\n    async persist(indexHtml, version) {\n        // version = (version+'').replace(/[^0-9.]/g,'');\n        const filePath = path.join(this.path, `${version}.html`);\n        fs.mkdirSync(this.path, { recursive: true });\n        fs.writeFileSync(filePath, indexHtml);\n    }\n}\n\nmodule.exports = LocalWebCache;\n"
  },
  {
    "path": "src/webCache/RemoteWebCache.js",
    "content": "const fetch = require('node-fetch');\nconst { WebCache, VersionResolveError } = require('./WebCache');\n\n/**\n * RemoteWebCache - Fetches a WhatsApp Web version index from a remote server\n * @param {object} options - options\n * @param {string} options.remotePath - Endpoint that should be used to fetch the version index. Use {version} as a placeholder for the version number.\n * @param {boolean} options.strict - If true, will throw an error if the requested version can't be fetched. If false, will resolve to the latest version. Defaults to false.\n */\nclass RemoteWebCache extends WebCache {\n    constructor(options = {}) {\n        super();\n\n        if (!options.remotePath)\n            throw new Error(\n                'webVersionCache.remotePath is required when using the remote cache',\n            );\n        this.remotePath = options.remotePath;\n        this.strict = options.strict || false;\n    }\n\n    async resolve(version) {\n        const remotePath = this.remotePath.replace('{version}', version);\n\n        try {\n            const cachedRes = await fetch(remotePath);\n            if (cachedRes.ok) {\n                return cachedRes.text();\n            }\n        } catch (err) {\n            console.error(`Error fetching version ${version} from remote`, err);\n        }\n\n        if (this.strict)\n            throw new VersionResolveError(\n                `Couldn't load version ${version} from the archive`,\n            );\n        return null;\n    }\n\n    async persist() {\n        // Nothing to do here\n    }\n}\n\nmodule.exports = RemoteWebCache;\n"
  },
  {
    "path": "src/webCache/WebCache.js",
    "content": "/**\n * Default implementation of a web version cache that does nothing.\n */\nclass WebCache {\n    async resolve() {\n        return null;\n    }\n    async persist() {}\n}\n\nclass VersionResolveError extends Error {}\n\nmodule.exports = {\n    WebCache,\n    VersionResolveError,\n};\n"
  },
  {
    "path": "src/webCache/WebCacheFactory.js",
    "content": "const RemoteWebCache = require('./RemoteWebCache');\nconst LocalWebCache = require('./LocalWebCache');\nconst { WebCache } = require('./WebCache');\n\nconst createWebCache = (type, options) => {\n    switch (type) {\n        case 'remote':\n            return new RemoteWebCache(options);\n        case 'local':\n            return new LocalWebCache(options);\n        case 'none':\n            return new WebCache();\n        default:\n            throw new Error(`Invalid WebCache type ${type}`);\n    }\n};\n\nmodule.exports = {\n    createWebCache,\n};\n"
  },
  {
    "path": "tests/README.md",
    "content": "# Running Tests\n\nThese tests require an authenticated WhatsApp Web session, as well as an additional phone that you can send messages to.\n\nThis can be configured using the following environment variables:\n\n- `WWEBJS_TEST_CLIENT_ID`: `clientId` to use for local file based authentication (required for authenticated tests).\n- `WWEBJS_TEST_REMOTE_ID`: A valid WhatsApp ID that you can send messages to, e.g. `123456789@c.us`. It should be different from the ID used by the provided session (required).\n\nYou can create a `.env` file in the root directory with these variables. See `.env.example` for a template.\n\nTo run the tests:\n\n```bash\nnpm test\n```\n"
  },
  {
    "path": "tests/client.js",
    "content": "const chai = require('chai');\nconst chaiAsPromised = require('chai-as-promised');\nconst sinon = require('sinon');\n\nconst helper = require('./helper');\nconst Chat = require('../src/structures/Chat');\nconst Contact = require('../src/structures/Contact');\nconst Message = require('../src/structures/Message');\nconst MessageMedia = require('../src/structures/MessageMedia');\nconst Location = require('../src/structures/Location');\nconst { MessageTypes, DefaultOptions } = require('../src/util/Constants');\n\nconst expect = chai.expect;\nchai.use(chaiAsPromised);\n\nconst remoteId = helper.remoteId;\n\ndescribe('Client', function () {\n    describe('User Agent', function () {\n        it('should set user agent on browser', async function () {\n            this.timeout(25000);\n\n            const client = helper.createClient();\n            client.initialize();\n\n            await helper.sleep(20000);\n\n            const browserUA = await client.pupBrowser.userAgent();\n            expect(browserUA).to.equal(DefaultOptions.userAgent);\n\n            const pageUA = await client.pupPage.evaluate(\n                () => window.navigator.userAgent,\n            );\n            expect(pageUA).to.equal(DefaultOptions.userAgent);\n\n            await client.destroy();\n        });\n\n        it('should set custom user agent on browser', async function () {\n            this.timeout(25000);\n            const customUA = DefaultOptions.userAgent.replace(\n                /Chrome\\/.* /,\n                'Chrome/99.9.9999.999 ',\n            );\n\n            const client = helper.createClient({\n                options: {\n                    userAgent: customUA,\n                },\n            });\n\n            client.initialize();\n            await helper.sleep(20000);\n\n            const browserUA = await client.pupBrowser.userAgent();\n            expect(browserUA).to.equal(customUA);\n            expect(browserUA.includes('Chrome/99.9.9999.999')).to.equal(true);\n\n            const pageUA = await client.pupPage.evaluate(\n                () => window.navigator.userAgent,\n            );\n            expect(pageUA).to.equal(customUA);\n\n            await client.destroy();\n        });\n\n        it('should respect an existing user agent arg', async function () {\n            this.timeout(25000);\n\n            const customUA = DefaultOptions.userAgent.replace(\n                /Chrome\\/.* /,\n                'Chrome/99.9.9999.999 ',\n            );\n\n            const client = helper.createClient({\n                options: {\n                    puppeteer: {\n                        args: [`--user-agent=${customUA}`],\n                    },\n                },\n            });\n\n            client.initialize();\n            await helper.sleep(20000);\n\n            const browserUA = await client.pupBrowser.userAgent();\n            expect(browserUA).to.equal(customUA);\n            expect(browserUA.includes('Chrome/99.9.9999.999')).to.equal(true);\n\n            const pageUA = await client.pupPage.evaluate(\n                () => window.navigator.userAgent,\n            );\n            expect(pageUA).to.equal(DefaultOptions.userAgent);\n\n            await client.destroy();\n        });\n    });\n\n    describe('Authentication', function () {\n        it('should emit QR code if not authenticated', async function () {\n            this.timeout(25000);\n            const callback = sinon.spy();\n\n            const client = helper.createClient();\n            client.on('qr', callback);\n            client.initialize();\n\n            await helper.sleep(20000);\n\n            expect(callback.called).to.equal(true);\n            expect(callback.args[0][0]).to.have.length.greaterThanOrEqual(152);\n\n            await client.destroy();\n        });\n\n        it('should disconnect after reaching max qr retries', async function () {\n            this.timeout(50000);\n\n            const qrCallback = sinon.spy();\n            const disconnectedCallback = sinon.spy();\n\n            const client = helper.createClient({\n                options: { qrMaxRetries: 2 },\n            });\n            client.on('qr', qrCallback);\n            client.on('disconnected', disconnectedCallback);\n\n            client.initialize();\n\n            await helper.sleep(45000);\n\n            expect(qrCallback.calledThrice).to.eql(true);\n            expect(\n                disconnectedCallback.calledOnceWith(\n                    'Max qrcode retries reached',\n                ),\n            ).to.eql(true);\n        });\n\n        it('should authenticate with existing session', async function () {\n            this.timeout(40000);\n\n            const authenticatedCallback = sinon.spy();\n            const qrCallback = sinon.spy();\n            const readyCallback = sinon.spy();\n\n            const client = helper.createClient({\n                authenticated: true,\n            });\n\n            client.on('qr', qrCallback);\n            client.on('authenticated', authenticatedCallback);\n            client.on('ready', readyCallback);\n\n            await client.initialize();\n\n            expect(authenticatedCallback.called).to.equal(true);\n\n            expect(readyCallback.called).to.equal(true);\n            expect(qrCallback.called).to.equal(false);\n\n            await client.destroy();\n        });\n    });\n\n    describe('Authenticated', function () {\n        let client;\n\n        before(async function () {\n            this.timeout(35000);\n            client = helper.createClient({ authenticated: true });\n            await client.initialize();\n        });\n\n        after(async function () {\n            await client.destroy();\n        });\n\n        it('can get current WhatsApp Web version', async function () {\n            const version = await client.getWWebVersion();\n            expect(typeof version).to.equal('string');\n            console.log(`WA Version: ${version}`);\n        });\n\n        describe('Send Messages', function () {\n            it('can send a message', async function () {\n                const msg = await client.sendMessage(remoteId, 'hello world');\n                expect(msg).to.be.instanceOf(Message);\n                expect(msg.type).to.equal(MessageTypes.TEXT);\n                expect(msg.fromMe).to.equal(true);\n                expect(msg.body).to.equal('hello world');\n                expect(msg.to).to.equal(remoteId);\n            });\n\n            it('can send a media message', async function () {\n                const media = new MessageMedia(\n                    'image/png',\n                    'iVBORw0KGgoAAAANSUhEUgAAAV4AAACWBAMAAABkyf1EAAAAG1BMVEXMzMyWlpacnJyqqqrFxcWxsbGjo6O3t7e+vr6He3KoAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAEcElEQVR4nO2aTW/bRhCGh18ij1zKknMkbbf2UXITIEeyMhIfRaF1exQLA/JRclslRykO+rs7s7s0VwytNmhJtsA8gHZEcox9PTs7uysQgGEYhmEYhmEYhmEYhmEYhmEYhmEYhmEYhmEYhmEYhmGYr2OWRK/ReIKI8Zt7Hb19wTcQ0uTkGh13bQupcw7gPOvdo12/5CzNtNR7xLUtNtT3CGBQ6g3InjY720pvofUec22LJPr8PhEp2OMPyI40PdwWUdronCu9yQpdPx53bQlfLKnfOVhlnDYRBXve4Ov+IZTeMgdedm0NR+xoXJeQvdJ3CvziykSukwil16W/Oe7aGjIjqc/9ib4jQlJy0uArtN4A0+cvXFvDkmUJ47sJ1Y1ATLDNVXZkNPIepQzxy1ki9fqiwbUj/I+64zxWNzyZnPuhvohJ9K70VvXBixpcu2SAHU+Xd9EKdEJDNpYP3AQr3bQSpPQ6Y6/4dl1z7ZDbArsszjA7L0g7ibB0CDcidUWVoErvIMKZh2Xs0LUzcLW6V5NfiUgNEbaYmAVL6bXl0nJRc+1S72ua/D/cTjGPlQj7eUqd7A096rYlRjdPYlhz7VIvxpVG3cemDKF+WAwLY/6XelOZKTXXzsC4xvDjjtSN6kHLhLke6PrwM8h1raf40qjrGO7H9aTEbduucjS04ZrYU/4iuS5Z2Hdt0rvCLFdmLEXcU30AGddST62o+sLcf5l6k7CP+ru4pLYqX/VFyxbm/utQbx/r22ZEbTb2f5I2kns1Y1OQR8ZyofX+TjJxj1Rz7QQVnf1QzR26Oth0ueJVYcRP6ZUPac/Rx/5M6ixO1dhSrT3Y1DpiYmx3tF4ZUdpz9LD/dSg9PXES0LB71BwcGjKROuV28lnvnv7HHJsezheBGH5+X2CfSfRbMKW+5aGs3JFjMrjGibJc0S7TJzqjHrh2hDybj9XRXNZa89Aro55XBdbW5wti2c/5WJ7jJ1RolVUn/HWpb0I58Tziup6Rx7Dm2hnbRP1GM9PW/NFmQ4PtVRVN63Wvxfmu5sowDMMwDMMwDMMwDMMwDMMwDMMwzL+CpT//F/6beoV8zb2Jmt4Qryx6lTUCsENQ75HOkhXAO3EPVgyQtKtUy3C/e+FJg17Zjnew1Xrdb9InbG4WqfUAftG+WhLwPVyfg536+MU7m4C1CMk4ZznpXZzDYI1PDL2nS1hpvc5cNd7E2sJg05Fe7/7d3Fln8Cvc3bwB616auxsKl4WPghjemHrDqyDWeu1UNW5s2btPnSQ75oOdunEwWazfwgVG0kqluYCM9OIjWOGnfA2b9G4Ha63XKpvQ8perTvTifJNhi6+WMWmi7smEZf6G8MmhlyGq+NqP8GV84TLuJr7UIQVx+bDEoEpRZIz42gs40OuN4Mv8hXzelV7KX1isH+ewTWckikyVv+CfHuqVF7I16gN0VKypX6wPsE+zFPzkinolU9UH8OMGvSpnZqKsv13p/RsMun6X5x/y2LeAr8O66lsBwzBMP/wJfyGq8pgBk6IAAAAASUVORK5CYII=',\n                );\n\n                const msg = await client.sendMessage(remoteId, media, {\n                    caption: \"here's my media\",\n                });\n                expect(msg).to.be.instanceOf(Message);\n                expect(msg.type).to.equal(MessageTypes.IMAGE);\n                expect(msg.fromMe).to.equal(true);\n                expect(msg.hasMedia).to.equal(true);\n                expect(msg.body).to.equal(\"here's my media\");\n                expect(msg.to).to.equal(remoteId);\n            });\n\n            it('can send a media message from URL', async function () {\n                const media = await MessageMedia.fromUrl(\n                    'https://via.placeholder.com/350x150.png',\n                );\n\n                const msg = await client.sendMessage(remoteId, media);\n                expect(msg).to.be.instanceOf(Message);\n                expect(msg.type).to.equal(MessageTypes.IMAGE);\n                expect(msg.fromMe).to.equal(true);\n                expect(msg.hasMedia).to.equal(true);\n                expect(msg.to).to.equal(remoteId);\n            });\n\n            it('can send a media message as a document', async function () {\n                const media = new MessageMedia(\n                    'image/png',\n                    'iVBORw0KGgoAAAANSUhEUgAAAV4AAACWBAMAAABkyf1EAAAAG1BMVEXMzMyWlpacnJyqqqrFxcWxsbGjo6O3t7e+vr6He3KoAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAEcElEQVR4nO2aTW/bRhCGh18ij1zKknMkbbf2UXITIEeyMhIfRaF1exQLA/JRclslRykO+rs7s7s0VwytNmhJtsA8gHZEcox9PTs7uysQgGEYhmEYhmEYhmEYhmEYhmEYhmEYhmEYhmEYhmEYhmGYr2OWRK/ReIKI8Zt7Hb19wTcQ0uTkGh13bQupcw7gPOvdo12/5CzNtNR7xLUtNtT3CGBQ6g3InjY720pvofUec22LJPr8PhEp2OMPyI40PdwWUdronCu9yQpdPx53bQlfLKnfOVhlnDYRBXve4Ov+IZTeMgdedm0NR+xoXJeQvdJ3CvziykSukwil16W/Oe7aGjIjqc/9ib4jQlJy0uArtN4A0+cvXFvDkmUJ47sJ1Y1ATLDNVXZkNPIepQzxy1ki9fqiwbUj/I+64zxWNzyZnPuhvohJ9K70VvXBixpcu2SAHU+Xd9EKdEJDNpYP3AQr3bQSpPQ6Y6/4dl1z7ZDbArsszjA7L0g7ibB0CDcidUWVoErvIMKZh2Xs0LUzcLW6V5NfiUgNEbaYmAVL6bXl0nJRc+1S72ua/D/cTjGPlQj7eUqd7A096rYlRjdPYlhz7VIvxpVG3cemDKF+WAwLY/6XelOZKTXXzsC4xvDjjtSN6kHLhLke6PrwM8h1raf40qjrGO7H9aTEbduucjS04ZrYU/4iuS5Z2Hdt0rvCLFdmLEXcU30AGddST62o+sLcf5l6k7CP+ru4pLYqX/VFyxbm/utQbx/r22ZEbTb2f5I2kns1Y1OQR8ZyofX+TjJxj1Rz7QQVnf1QzR26Oth0ueJVYcRP6ZUPac/Rx/5M6ixO1dhSrT3Y1DpiYmx3tF4ZUdpz9LD/dSg9PXES0LB71BwcGjKROuV28lnvnv7HHJsezheBGH5+X2CfSfRbMKW+5aGs3JFjMrjGibJc0S7TJzqjHrh2hDybj9XRXNZa89Aro55XBdbW5wti2c/5WJ7jJ1RolVUn/HWpb0I58Tziup6Rx7Dm2hnbRP1GM9PW/NFmQ4PtVRVN63Wvxfmu5sowDMMwDMMwDMMwDMMwDMMwDMMwzL+CpT//F/6beoV8zb2Jmt4Qryx6lTUCsENQ75HOkhXAO3EPVgyQtKtUy3C/e+FJg17Zjnew1Xrdb9InbG4WqfUAftG+WhLwPVyfg536+MU7m4C1CMk4ZznpXZzDYI1PDL2nS1hpvc5cNd7E2sJg05Fe7/7d3Fln8Cvc3bwB616auxsKl4WPghjemHrDqyDWeu1UNW5s2btPnSQ75oOdunEwWazfwgVG0kqluYCM9OIjWOGnfA2b9G4Ha63XKpvQ8perTvTifJNhi6+WMWmi7smEZf6G8MmhlyGq+NqP8GV84TLuJr7UIQVx+bDEoEpRZIz42gs40OuN4Mv8hXzelV7KX1isH+ewTWckikyVv+CfHuqVF7I16gN0VKypX6wPsE+zFPzkinolU9UH8OMGvSpnZqKsv13p/RsMun6X5x/y2LeAr8O66lsBwzBMP/wJfyGq8pgBk6IAAAAASUVORK5CYII=',\n                    'this is my filename.png',\n                );\n\n                const msg = await client.sendMessage(remoteId, media, {\n                    sendMediaAsDocument: true,\n                });\n                expect(msg).to.be.instanceOf(Message);\n                expect(msg.type).to.equal(MessageTypes.DOCUMENT);\n                expect(msg.fromMe).to.equal(true);\n                expect(msg.hasMedia).to.equal(true);\n                expect(msg.body).to.equal('this is my filename.png');\n                expect(msg.to).to.equal(remoteId);\n            });\n\n            it('can send a sticker message', async function () {\n                const media = new MessageMedia(\n                    'image/png',\n                    'iVBORw0KGgoAAAANSUhEUgAAAV4AAACWBAMAAABkyf1EAAAAG1BMVEXMzMyWlpacnJyqqqrFxcWxsbGjo6O3t7e+vr6He3KoAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAEcElEQVR4nO2aTW/bRhCGh18ij1zKknMkbbf2UXITIEeyMhIfRaF1exQLA/JRclslRykO+rs7s7s0VwytNmhJtsA8gHZEcox9PTs7uysQgGEYhmEYhmEYhmEYhmEYhmEYhmEYhmEYhmEYhmEYhmGYr2OWRK/ReIKI8Zt7Hb19wTcQ0uTkGh13bQupcw7gPOvdo12/5CzNtNR7xLUtNtT3CGBQ6g3InjY720pvofUec22LJPr8PhEp2OMPyI40PdwWUdronCu9yQpdPx53bQlfLKnfOVhlnDYRBXve4Ov+IZTeMgdedm0NR+xoXJeQvdJ3CvziykSukwil16W/Oe7aGjIjqc/9ib4jQlJy0uArtN4A0+cvXFvDkmUJ47sJ1Y1ATLDNVXZkNPIepQzxy1ki9fqiwbUj/I+64zxWNzyZnPuhvohJ9K70VvXBixpcu2SAHU+Xd9EKdEJDNpYP3AQr3bQSpPQ6Y6/4dl1z7ZDbArsszjA7L0g7ibB0CDcidUWVoErvIMKZh2Xs0LUzcLW6V5NfiUgNEbaYmAVL6bXl0nJRc+1S72ua/D/cTjGPlQj7eUqd7A096rYlRjdPYlhz7VIvxpVG3cemDKF+WAwLY/6XelOZKTXXzsC4xvDjjtSN6kHLhLke6PrwM8h1raf40qjrGO7H9aTEbduucjS04ZrYU/4iuS5Z2Hdt0rvCLFdmLEXcU30AGddST62o+sLcf5l6k7CP+ru4pLYqX/VFyxbm/utQbx/r22ZEbTb2f5I2kns1Y1OQR8ZyofX+TjJxj1Rz7QQVnf1QzR26Oth0ueJVYcRP6ZUPac/Rx/5M6ixO1dhSrT3Y1DpiYmx3tF4ZUdpz9LD/dSg9PXES0LB71BwcGjKROuV28lnvnv7HHJsezheBGH5+X2CfSfRbMKW+5aGs3JFjMrjGibJc0S7TJzqjHrh2hDybj9XRXNZa89Aro55XBdbW5wti2c/5WJ7jJ1RolVUn/HWpb0I58Tziup6Rx7Dm2hnbRP1GM9PW/NFmQ4PtVRVN63Wvxfmu5sowDMMwDMMwDMMwDMMwDMMwDMMwzL+CpT//F/6beoV8zb2Jmt4Qryx6lTUCsENQ75HOkhXAO3EPVgyQtKtUy3C/e+FJg17Zjnew1Xrdb9InbG4WqfUAftG+WhLwPVyfg536+MU7m4C1CMk4ZznpXZzDYI1PDL2nS1hpvc5cNd7E2sJg05Fe7/7d3Fln8Cvc3bwB616auxsKl4WPghjemHrDqyDWeu1UNW5s2btPnSQ75oOdunEwWazfwgVG0kqluYCM9OIjWOGnfA2b9G4Ha63XKpvQ8perTvTifJNhi6+WMWmi7smEZf6G8MmhlyGq+NqP8GV84TLuJr7UIQVx+bDEoEpRZIz42gs40OuN4Mv8hXzelV7KX1isH+ewTWckikyVv+CfHuqVF7I16gN0VKypX6wPsE+zFPzkinolU9UH8OMGvSpnZqKsv13p/RsMun6X5x/y2LeAr8O66lsBwzBMP/wJfyGq8pgBk6IAAAAASUVORK5CYII=',\n                );\n\n                const msg = await client.sendMessage(remoteId, media, {\n                    sendMediaAsSticker: true,\n                });\n                expect(msg).to.be.instanceOf(Message);\n                expect(msg.type).to.equal(MessageTypes.STICKER);\n                expect(msg.fromMe).to.equal(true);\n                expect(msg.hasMedia).to.equal(true);\n                expect(msg.to).to.equal(remoteId);\n            });\n\n            it('can send a sticker message with custom author and name', async function () {\n                const media = new MessageMedia(\n                    'image/png',\n                    'iVBORw0KGgoAAAANSUhEUgAAAV4AAACWBAMAAABkyf1EAAAAG1BMVEXMzMyWlpacnJyqqqrFxcWxsbGjo6O3t7e+vr6He3KoAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAEcElEQVR4nO2aTW/bRhCGh18ij1zKknMkbbf2UXITIEeyMhIfRaF1exQLA/JRclslRykO+rs7s7s0VwytNmhJtsA8gHZEcox9PTs7uysQgGEYhmEYhmEYhmEYhmEYhmEYhmEYhmEYhmEYhmEYhmGYr2OWRK/ReIKI8Zt7Hb19wTcQ0uTkGh13bQupcw7gPOvdo12/5CzNtNR7xLUtNtT3CGBQ6g3InjY720pvofUec22LJPr8PhEp2OMPyI40PdwWUdronCu9yQpdPx53bQlfLKnfOVhlnDYRBXve4Ov+IZTeMgdedm0NR+xoXJeQvdJ3CvziykSukwil16W/Oe7aGjIjqc/9ib4jQlJy0uArtN4A0+cvXFvDkmUJ47sJ1Y1ATLDNVXZkNPIepQzxy1ki9fqiwbUj/I+64zxWNzyZnPuhvohJ9K70VvXBixpcu2SAHU+Xd9EKdEJDNpYP3AQr3bQSpPQ6Y6/4dl1z7ZDbArsszjA7L0g7ibB0CDcidUWVoErvIMKZh2Xs0LUzcLW6V5NfiUgNEbaYmAVL6bXl0nJRc+1S72ua/D/cTjGPlQj7eUqd7A096rYlRjdPYlhz7VIvxpVG3cemDKF+WAwLY/6XelOZKTXXzsC4xvDjjtSN6kHLhLke6PrwM8h1raf40qjrGO7H9aTEbduucjS04ZrYU/4iuS5Z2Hdt0rvCLFdmLEXcU30AGddST62o+sLcf5l6k7CP+ru4pLYqX/VFyxbm/utQbx/r22ZEbTb2f5I2kns1Y1OQR8ZyofX+TjJxj1Rz7QQVnf1QzR26Oth0ueJVYcRP6ZUPac/Rx/5M6ixO1dhSrT3Y1DpiYmx3tF4ZUdpz9LD/dSg9PXES0LB71BwcGjKROuV28lnvnv7HHJsezheBGH5+X2CfSfRbMKW+5aGs3JFjMrjGibJc0S7TJzqjHrh2hDybj9XRXNZa89Aro55XBdbW5wti2c/5WJ7jJ1RolVUn/HWpb0I58Tziup6Rx7Dm2hnbRP1GM9PW/NFmQ4PtVRVN63Wvxfmu5sowDMMwDMMwDMMwDMMwDMMwDMMwzL+CpT//F/6beoV8zb2Jmt4Qryx6lTUCsENQ75HOkhXAO3EPVgyQtKtUy3C/e+FJg17Zjnew1Xrdb9InbG4WqfUAftG+WhLwPVyfg536+MU7m4C1CMk4ZznpXZzDYI1PDL2nS1hpvc5cNd7E2sJg05Fe7/7d3Fln8Cvc3bwB616auxsKl4WPghjemHrDqyDWeu1UNW5s2btPnSQ75oOdunEwWazfwgVG0kqluYCM9OIjWOGnfA2b9G4Ha63XKpvQ8perTvTifJNhi6+WMWmi7smEZf6G8MmhlyGq+NqP8GV84TLuJr7UIQVx+bDEoEpRZIz42gs40OuN4Mv8hXzelV7KX1isH+ewTWckikyVv+CfHuqVF7I16gN0VKypX6wPsE+zFPzkinolU9UH8OMGvSpnZqKsv13p/RsMun6X5x/y2LeAr8O66lsBwzBMP/wJfyGq8pgBk6IAAAAASUVORK5CYII=',\n                );\n\n                const msg = await client.sendMessage(remoteId, media, {\n                    sendMediaAsSticker: true,\n                    stickerAuthor: 'WWEBJS',\n                    stickerName: 'My Sticker',\n                });\n                expect(msg).to.be.instanceOf(Message);\n                expect(msg.type).to.equal(MessageTypes.STICKER);\n                expect(msg.fromMe).to.equal(true);\n                expect(msg.hasMedia).to.equal(true);\n                expect(msg.to).to.equal(remoteId);\n            });\n\n            it('can send a location message', async function () {\n                const location = new Location(\n                    37.422,\n                    -122.084,\n                    'Googleplex\\nGoogle Headquarters',\n                );\n\n                const msg = await client.sendMessage(remoteId, location);\n                expect(msg).to.be.instanceOf(Message);\n                expect(msg.type).to.equal(MessageTypes.LOCATION);\n                expect(msg.fromMe).to.equal(true);\n                expect(msg.to).to.equal(remoteId);\n\n                expect(msg.location).to.be.instanceOf(Location);\n                expect(msg.location.latitude).to.equal(37.422);\n                expect(msg.location.longitude).to.equal(-122.084);\n                expect(msg.location.description).to.equal(\n                    'Googleplex\\nGoogle Headquarters',\n                );\n            });\n\n            it('can send a vCard as a contact card message', async function () {\n                const vCard = `BEGIN:VCARD\nVERSION:3.0\nFN;CHARSET=UTF-8:John Doe\nN;CHARSET=UTF-8:Doe;John;;;\nEMAIL;CHARSET=UTF-8;type=HOME,INTERNET:john@doe.com\nTEL;TYPE=HOME,VOICE:1234567890\nREV:2021-06-06T02:35:53.559Z\nEND:VCARD`;\n\n                const msg = await client.sendMessage(remoteId, vCard);\n                expect(msg).to.be.instanceOf(Message);\n                expect(msg.type).to.equal(MessageTypes.CONTACT_CARD);\n                expect(msg.fromMe).to.equal(true);\n                expect(msg.to).to.equal(remoteId);\n                expect(msg.body).to.equal(vCard);\n                expect(msg.vCards).to.have.lengthOf(1);\n                expect(msg.vCards[0]).to.equal(vCard);\n            });\n\n            it('can optionally turn off vCard parsing', async function () {\n                const vCard = `BEGIN:VCARD\nVERSION:3.0\nFN;CHARSET=UTF-8:John Doe\nN;CHARSET=UTF-8:Doe;John;;;\nEMAIL;CHARSET=UTF-8;type=HOME,INTERNET:john@doe.com\nTEL;TYPE=HOME,VOICE:1234567890\nREV:2021-06-06T02:35:53.559Z\nEND:VCARD`;\n\n                const msg = await client.sendMessage(remoteId, vCard, {\n                    parseVCards: false,\n                });\n                expect(msg).to.be.instanceOf(Message);\n                expect(msg.type).to.equal(MessageTypes.TEXT); // not a contact card\n                expect(msg.fromMe).to.equal(true);\n                expect(msg.to).to.equal(remoteId);\n                expect(msg.body).to.equal(vCard);\n            });\n\n            it('can send a Contact as a contact card message', async function () {\n                const contact = await client.getContactById(remoteId);\n\n                const msg = await client.sendMessage(remoteId, contact);\n                expect(msg).to.be.instanceOf(Message);\n                expect(msg.type).to.equal(MessageTypes.CONTACT_CARD);\n                expect(msg.fromMe).to.equal(true);\n                expect(msg.to).to.equal(remoteId);\n                expect(msg.body).to.match(/BEGIN:VCARD/);\n                expect(msg.vCards).to.have.lengthOf(1);\n                expect(msg.vCards[0]).to.match(/BEGIN:VCARD/);\n            });\n\n            it('can send multiple Contacts as a contact card message', async function () {\n                const contact1 = await client.getContactById(remoteId);\n                const contact2 =\n                    await client.getContactById('5511942167462@c.us'); //iFood\n\n                const msg = await client.sendMessage(remoteId, [\n                    contact1,\n                    contact2,\n                ]);\n                expect(msg).to.be.instanceOf(Message);\n                expect(msg.type).to.equal(MessageTypes.CONTACT_CARD_MULTI);\n                expect(msg.fromMe).to.equal(true);\n                expect(msg.to).to.equal(remoteId);\n                expect(msg.vCards).to.have.lengthOf(2);\n                expect(msg.vCards[0]).to.match(/BEGIN:VCARD/);\n                expect(msg.vCards[1]).to.match(/BEGIN:VCARD/);\n            });\n        });\n\n        describe('Get Chats', function () {\n            it('can get a chat by its ID', async function () {\n                const chat = await client.getChatById(remoteId);\n                expect(chat).to.be.instanceOf(Chat);\n                expect(chat.id._serialized).to.eql(remoteId);\n                expect(chat.isGroup).to.eql(false);\n            });\n\n            it('can get all chats', async function () {\n                const chats = await client.getChats();\n                expect(chats.length).to.be.greaterThanOrEqual(1);\n\n                const chat = chats.find((c) => c.id._serialized === remoteId);\n                expect(chat).to.exist;\n                expect(chat).to.be.instanceOf(Chat);\n            });\n        });\n\n        describe('Get Contacts', function () {\n            it('can get a contact by its ID', async function () {\n                const contact = await client.getContactById(remoteId);\n                expect(contact).to.be.instanceOf(Contact);\n                expect(contact.id._serialized).to.eql(remoteId);\n                expect(contact.number).to.eql(remoteId.split('@')[0]);\n            });\n\n            it('can get all contacts', async function () {\n                const contacts = await client.getContacts();\n                expect(contacts.length).to.be.greaterThanOrEqual(1);\n\n                const contact = contacts.find(\n                    (c) => c.id._serialized === remoteId,\n                );\n                expect(contact).to.exist;\n                expect(contact).to.be.instanceOf(Contact);\n            });\n\n            it('can block a contact', async function () {\n                const contact = await client.getContactById(remoteId);\n                await contact.block();\n\n                const refreshedContact = await client.getContactById(remoteId);\n                expect(refreshedContact.isBlocked).to.eql(true);\n            });\n\n            it('can get a list of blocked contacts', async function () {\n                const blockedContacts = await client.getBlockedContacts();\n                expect(blockedContacts.length).to.be.greaterThanOrEqual(1);\n\n                const contact = blockedContacts.find(\n                    (c) => c.id._serialized === remoteId,\n                );\n                expect(contact).to.exist;\n                expect(contact).to.be.instanceOf(Contact);\n            });\n\n            it('can unblock a contact', async function () {\n                const contact = await client.getContactById(remoteId);\n                await contact.unblock();\n\n                const refreshedContact = await client.getContactById(remoteId);\n                expect(refreshedContact.isBlocked).to.eql(false);\n            });\n        });\n\n        describe('Numbers and Users', function () {\n            it('can verify that a user is registered', async function () {\n                const isRegistered = await client.isRegisteredUser(remoteId);\n                expect(isRegistered).to.be.true;\n            });\n\n            it('can verify that a user is not registered', async function () {\n                const isRegistered =\n                    await client.isRegisteredUser('9999999999@c.us');\n                expect(isRegistered).to.be.false;\n            });\n\n            it(\"can get a number's whatsapp id\", async function () {\n                const number = remoteId.split('@')[0];\n                const numberId = await client.getNumberId(number);\n                expect(numberId).to.eql({\n                    server: 'c.us',\n                    user: number,\n                    _serialized: `${number}@c.us`,\n                });\n            });\n\n            it(\"returns null when getting an unregistered number's whatsapp id\", async function () {\n                const number = '9999999999';\n                const numberId = await client.getNumberId(number);\n                expect(numberId).to.eql(null);\n            });\n\n            it(\"can get a number's country code\", async function () {\n                const number = '18092201111';\n                const countryCode = await client.getCountryCode(number);\n                expect(countryCode).to.eql('1');\n            });\n\n            it('can get a formatted number', async function () {\n                const number = '18092201111';\n                const formatted = await client.getFormattedNumber(number);\n                expect(formatted).to.eql('+1 (809) 220-1111');\n            });\n\n            it('can get a formatted number from a serialized ID', async function () {\n                const number = '18092201111@c.us';\n                const formatted = await client.getFormattedNumber(number);\n                expect(formatted).to.eql('+1 (809) 220-1111');\n            });\n        });\n\n        describe('Search messages', function () {\n            it('can search for messages', async function () {\n                const m1 = await client.sendMessage(\n                    remoteId,\n                    \"I'm searching for Super Mario Brothers\",\n                );\n                const m2 = await client.sendMessage(\n                    remoteId,\n                    'This also contains Mario',\n                );\n                const m3 = await client.sendMessage(\n                    remoteId,\n                    'Nothing of interest here, just Luigi',\n                );\n\n                // wait for search index to catch up\n                await helper.sleep(1000);\n\n                const msgs = await client.searchMessages('Mario', {\n                    chatId: remoteId,\n                });\n                expect(msgs.length).to.be.greaterThanOrEqual(2);\n                const msgIds = msgs.map((m) => m.id._serialized);\n                expect(msgIds).to.include.members([\n                    m1.id._serialized,\n                    m2.id._serialized,\n                ]);\n                expect(msgIds).to.not.include.members([m3.id._serialized]);\n            });\n        });\n\n        describe('Status/About', function () {\n            let me, previousStatus;\n\n            before(async function () {\n                me = await client.getContactById(client.info.wid._serialized);\n                previousStatus = await me.getAbout();\n            });\n\n            after(async function () {\n                await client.setStatus(previousStatus);\n            });\n\n            it('can set the status text', async function () {\n                await client.setStatus('My shiny new status');\n\n                const status = await me.getAbout();\n                expect(status).to.eql('My shiny new status');\n            });\n\n            it('can set the status text to something else', async function () {\n                await client.setStatus('Busy');\n\n                const status = await me.getAbout();\n                expect(status).to.eql('Busy');\n            });\n        });\n    });\n});\n"
  },
  {
    "path": "tests/helper.js",
    "content": "const { Client, LocalAuth } = require('..');\n\nrequire('dotenv').config();\n\nconst remoteId = process.env.WWEBJS_TEST_REMOTE_ID;\nif (!remoteId)\n    throw new Error(\n        'The WWEBJS_TEST_REMOTE_ID environment variable has not been set.',\n    );\n\nfunction createClient({ authenticated, options: additionalOpts } = {}) {\n    const options = {};\n\n    if (authenticated) {\n        const clientId = process.env.WWEBJS_TEST_CLIENT_ID;\n        if (!clientId) throw new Error('No session found in environment.');\n        options.authStrategy = new LocalAuth({\n            clientId,\n        });\n    }\n\n    const allOpts = { ...options, ...(additionalOpts || {}) };\n    return new Client(allOpts);\n}\n\nfunction sleep(ms) {\n    return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nmodule.exports = {\n    sleep,\n    createClient,\n    remoteId,\n};\n"
  },
  {
    "path": "tests/structures/chat.js",
    "content": "const { expect } = require('chai');\n\nconst helper = require('../helper');\nconst Message = require('../../src/structures/Message');\nconst { MessageTypes } = require('../../src/util/Constants');\nconst { Contact } = require('../../src/structures');\n\nconst remoteId = helper.remoteId;\n\ndescribe('Chat', function () {\n    let client;\n    let chat;\n\n    before(async function () {\n        this.timeout(35000);\n        client = helper.createClient({ authenticated: true });\n        await client.initialize();\n        chat = await client.getChatById(remoteId);\n    });\n\n    after(async function () {\n        await client.destroy();\n    });\n\n    it('can send a message to a chat', async function () {\n        const msg = await chat.sendMessage('hello world');\n        expect(msg).to.be.instanceOf(Message);\n        expect(msg.type).to.equal(MessageTypes.TEXT);\n        expect(msg.fromMe).to.equal(true);\n        expect(msg.body).to.equal('hello world');\n        expect(msg.to).to.equal(remoteId);\n    });\n\n    it('can fetch messages sent in a chat', async function () {\n        await helper.sleep(1000);\n        const msg = await chat.sendMessage('another message');\n        await helper.sleep(500);\n\n        const messages = await chat.fetchMessages();\n        expect(messages.length).to.be.greaterThanOrEqual(2);\n\n        const fetchedMsg = messages[messages.length - 1];\n        expect(fetchedMsg).to.be.instanceOf(Message);\n        expect(fetchedMsg.type).to.equal(MessageTypes.TEXT);\n        expect(fetchedMsg.id._serialized).to.equal(msg.id._serialized);\n        expect(fetchedMsg.body).to.equal(msg.body);\n    });\n\n    it('can use a limit when fetching messages sent in a chat', async function () {\n        await helper.sleep(1000);\n        const msg = await chat.sendMessage('yet another message');\n        await helper.sleep(500);\n\n        const messages = await chat.fetchMessages({ limit: 1 });\n        expect(messages).to.have.lengthOf(1);\n\n        const fetchedMsg = messages[0];\n        expect(fetchedMsg).to.be.instanceOf(Message);\n        expect(fetchedMsg.type).to.equal(MessageTypes.TEXT);\n        expect(fetchedMsg.id._serialized).to.equal(msg.id._serialized);\n        expect(fetchedMsg.body).to.equal(msg.body);\n    });\n\n    it('can use fromMe=true when fetching messages sent in a chat to get only bot messages', async function () {\n        const messages = await chat.fetchMessages({ fromMe: true });\n        expect(messages).to.have.lengthOf(2);\n    });\n\n    it('can use fromMe=false when fetching messages sent in a chat to get only non bot messages', async function () {\n        const messages = await chat.fetchMessages({ fromMe: false });\n        expect(messages).to.have.lengthOf(0);\n    });\n\n    it('can get the related contact', async function () {\n        const contact = await chat.getContact();\n        expect(contact).to.be.instanceOf(Contact);\n        expect(contact.id._serialized).to.equal(chat.id._serialized);\n    });\n\n    describe('Seen', function () {\n        it('can mark a chat as unread', async function () {\n            await chat.markUnread();\n            await helper.sleep(500);\n\n            // refresh chat\n            chat = await client.getChatById(remoteId);\n            expect(chat.unreadCount).to.equal(-1);\n        });\n\n        it('can mark a chat as seen', async function () {\n            const res = await chat.sendSeen();\n            expect(res).to.equal(true);\n\n            await helper.sleep(1000);\n\n            // refresh chat\n            chat = await client.getChatById(remoteId);\n            expect(chat.unreadCount).to.equal(0);\n        });\n    });\n\n    describe('Archiving', function () {\n        it('can archive a chat', async function () {\n            const res = await chat.archive();\n            expect(res).to.equal(true);\n\n            await helper.sleep(1000);\n\n            // refresh chat\n            chat = await client.getChatById(remoteId);\n            expect(chat.archived).to.equal(true);\n        });\n\n        it('can unarchive a chat', async function () {\n            const res = await chat.unarchive();\n            expect(res).to.equal(false);\n\n            await helper.sleep(1000);\n\n            // refresh chat\n            chat = await client.getChatById(remoteId);\n            expect(chat.archived).to.equal(false);\n        });\n    });\n\n    describe('Pinning', function () {\n        it('can pin a chat', async function () {\n            const res = await chat.pin();\n            expect(res).to.equal(true);\n\n            await helper.sleep(1000);\n\n            // refresh chat\n            chat = await client.getChatById(remoteId);\n            expect(chat.pinned).to.equal(true);\n        });\n\n        it('can unpin a chat', async function () {\n            const res = await chat.unpin();\n            expect(res).to.equal(false);\n            await helper.sleep(1000);\n\n            // refresh chat\n            chat = await client.getChatById(remoteId);\n            expect(chat.pinned).to.equal(false);\n        });\n    });\n\n    describe('Muting', function () {\n        it('can mute a chat forever', async function () {\n            await chat.mute();\n\n            await helper.sleep(1000);\n\n            // refresh chat\n            chat = await client.getChatById(remoteId);\n            expect(chat.isMuted).to.equal(true);\n            expect(chat.muteExpiration).to.equal(-1);\n        });\n\n        it('can mute a chat until a specific date', async function () {\n            const unmuteDate = new Date(new Date().getTime() + 1000 * 60 * 60);\n            await chat.mute(unmuteDate);\n\n            await helper.sleep(1000);\n\n            // refresh chat\n            chat = await client.getChatById(remoteId);\n            expect(chat.isMuted).to.equal(true);\n            expect(chat.muteExpiration).to.equal(\n                Math.round(unmuteDate.getTime() / 1000),\n            );\n        });\n\n        it('can unmute a chat', async function () {\n            await chat.unmute();\n            await helper.sleep(500);\n\n            // refresh chat\n            chat = await client.getChatById(remoteId);\n            expect(chat.isMuted).to.equal(false);\n            expect(chat.muteExpiration).to.equal(0);\n        });\n    });\n\n    // eslint-disable-next-line mocha/no-skipped-tests\n    describe.skip('Destructive operations', function () {\n        it('can clear all messages from chat', async function () {\n            const res = await chat.clearMessages();\n            expect(res).to.equal(true);\n\n            await helper.sleep(3000);\n\n            const msgs = await chat.fetchMessages();\n            expect(msgs).to.have.lengthOf(0);\n        });\n\n        it('can delete a chat', async function () {\n            const res = await chat.delete();\n            expect(res).to.equal(true);\n        });\n    });\n});\n"
  },
  {
    "path": "tests/structures/group.js",
    "content": "const { expect } = require('chai');\nconst helper = require('../helper');\n\nconst remoteId = helper.remoteId;\n\ndescribe('Group', function () {\n    let client;\n    let group;\n\n    before(async function () {\n        this.timeout(35000);\n        client = helper.createClient({\n            authenticated: true,\n        });\n        await client.initialize();\n\n        const createRes = await client.createGroup('My Awesome Group', [\n            remoteId,\n        ]);\n        expect(createRes.gid).to.exist;\n        await helper.sleep(500);\n        group = await client.getChatById(createRes.gid._serialized);\n        expect(group).to.exist;\n    });\n\n    beforeEach(async function () {\n        await helper.sleep(500);\n    });\n\n    describe('Settings', function () {\n        it('can change the group subject', async function () {\n            expect(group.name).to.equal('My Awesome Group');\n            const res = await group.setSubject('My Amazing Group');\n            expect(res).to.equal(true);\n\n            await helper.sleep(1000);\n\n            // reload\n            group = await client.getChatById(group.id._serialized);\n            expect(group.name).to.equal('My Amazing Group');\n        });\n\n        it('can change the group description', async function () {\n            expect(group.description).to.equal(undefined);\n            const res = await group.setDescription('some description');\n            expect(res).to.equal(true);\n            expect(group.description).to.equal('some description');\n\n            await helper.sleep(1000);\n\n            // reload\n            group = await client.getChatById(group.id._serialized);\n            expect(group.description).to.equal('some description');\n        });\n\n        it('can set only admins able to send messages', async function () {\n            expect(group.groupMetadata.announce).to.equal(false);\n            const res = await group.setMessagesAdminsOnly();\n            expect(res).to.equal(true);\n            expect(group.groupMetadata.announce).to.equal(true);\n\n            await helper.sleep(1000);\n\n            // reload\n            group = await client.getChatById(group.id._serialized);\n            expect(group.groupMetadata.announce).to.equal(true);\n        });\n\n        it('can set all participants able to send messages', async function () {\n            expect(group.groupMetadata.announce).to.equal(true);\n            const res = await group.setMessagesAdminsOnly(false);\n            expect(res).to.equal(true);\n            expect(group.groupMetadata.announce).to.equal(false);\n\n            await helper.sleep(1000);\n\n            // reload\n            group = await client.getChatById(group.id._serialized);\n            expect(group.groupMetadata.announce).to.equal(false);\n        });\n\n        it('can set only admins able to set group info', async function () {\n            expect(group.groupMetadata.restrict).to.equal(false);\n            const res = await group.setInfoAdminsOnly();\n            expect(res).to.equal(true);\n            expect(group.groupMetadata.restrict).to.equal(true);\n\n            await helper.sleep(1000);\n\n            // reload\n            group = await client.getChatById(group.id._serialized);\n            expect(group.groupMetadata.restrict).to.equal(true);\n        });\n\n        it('can set all participants able to set group info', async function () {\n            expect(group.groupMetadata.restrict).to.equal(true);\n            const res = await group.setInfoAdminsOnly(false);\n            expect(res).to.equal(true);\n            expect(group.groupMetadata.restrict).to.equal(false);\n\n            await helper.sleep(1000);\n\n            // reload\n            group = await client.getChatById(group.id._serialized);\n            expect(group.groupMetadata.restrict).to.equal(false);\n        });\n    });\n\n    describe('Invites', function () {\n        it('can get the invite code', async function () {\n            const code = await group.getInviteCode();\n            expect(typeof code).to.equal('string');\n        });\n\n        it('can get invite info', async function () {\n            const code = await group.getInviteCode();\n            const info = await client.getInviteInfo(code);\n            expect(info.id._serialized).to.equal(group.id._serialized);\n            expect(info.participants.length).to.equal(2);\n        });\n\n        it('can revoke the invite code', async function () {\n            const code = await group.getInviteCode();\n            const newCode = await group.revokeInvite();\n            expect(typeof newCode).to.equal('string');\n            expect(newCode).to.not.equal(code);\n        });\n    });\n\n    describe('Participants', function () {\n        it('can promote a user to admin', async function () {\n            let participant = group.participants.find(\n                (p) => p.id._serialized === remoteId,\n            );\n            expect(participant).to.exist;\n            expect(participant.isAdmin).to.equal(false);\n\n            const res = await group.promoteParticipants([remoteId]);\n            expect(res.status).to.be.greaterThanOrEqual(200);\n\n            await helper.sleep(1000);\n\n            // reload and check\n            group = await client.getChatById(group.id._serialized);\n            participant = group.participants.find(\n                (p) => p.id._serialized === remoteId,\n            );\n            expect(participant).to.exist;\n            expect(participant.isAdmin).to.equal(true);\n        });\n\n        it('can demote a user', async function () {\n            let participant = group.participants.find(\n                (p) => p.id._serialized === remoteId,\n            );\n            expect(participant).to.exist;\n            expect(participant.isAdmin).to.equal(true);\n\n            const res = await group.demoteParticipants([remoteId]);\n            expect(res.status).to.be.greaterThanOrEqual(200);\n\n            await helper.sleep(1000);\n\n            // reload and check\n            group = await client.getChatById(group.id._serialized);\n            participant = group.participants.find(\n                (p) => p.id._serialized === remoteId,\n            );\n            expect(participant).to.exist;\n            expect(participant.isAdmin).to.equal(false);\n        });\n\n        it('can remove a user from the group', async function () {\n            let participant = group.participants.find(\n                (p) => p.id._serialized === remoteId,\n            );\n            expect(participant).to.exist;\n\n            const res = await group.removeParticipants([remoteId]);\n            expect(res.status).to.be.greaterThanOrEqual(200);\n\n            await helper.sleep(1000);\n\n            // reload and check\n            group = await client.getChatById(group.id._serialized);\n            participant = group.participants.find(\n                (p) => p.id._serialized === remoteId,\n            );\n            expect(participant).to.not.exist;\n        });\n\n        it('can add back a user to the group', async function () {\n            let participant = group.participants.find(\n                (p) => p.id._serialized === remoteId,\n            );\n            expect(participant).to.not.exist;\n\n            const res = await group.addParticipants([remoteId]);\n            expect(res.status).to.be.greaterThanOrEqual(200);\n\n            await helper.sleep(1000);\n\n            // reload and check\n            group = await client.getChatById(group.id._serialized);\n            participant = group.participants.find(\n                (p) => p.id._serialized === remoteId,\n            );\n            expect(participant).to.exist;\n        });\n    });\n\n    describe('Leave / re-join', function () {\n        let code;\n\n        before(async function () {\n            code = await group.getInviteCode();\n        });\n\n        it('can leave the group', async function () {\n            expect(group.isReadOnly).to.equal(false);\n            await group.leave();\n\n            await helper.sleep(1000);\n\n            // reload and check\n            group = await client.getChatById(group.id._serialized);\n            expect(group.isReadOnly).to.equal(true);\n        });\n\n        it('can join a group via invite code', async function () {\n            const chatId = await client.acceptInvite(code);\n            expect(chatId).to.equal(group.id._serialized);\n\n            await helper.sleep(1000);\n\n            // reload and check\n            group = await client.getChatById(group.id._serialized);\n            expect(group.isReadOnly).to.equal(false);\n        });\n    });\n\n    after(async function () {\n        await client.destroy();\n    });\n});\n"
  },
  {
    "path": "tests/structures/message.js",
    "content": "const { expect } = require('chai');\nconst sinon = require('sinon');\n\nconst helper = require('../helper');\nconst { Contact, Chat } = require('../../src/structures');\n\nconst remoteId = helper.remoteId;\n\ndescribe('Message', function () {\n    let client;\n    let chat;\n    let message;\n\n    before(async function () {\n        this.timeout(35000);\n        client = helper.createClient({ authenticated: true });\n        await client.initialize();\n\n        chat = await client.getChatById(remoteId);\n        message = await chat.sendMessage('this is only a test');\n\n        // wait for message to be sent\n        await helper.sleep(1000);\n    });\n\n    after(async function () {\n        await client.destroy();\n    });\n\n    it('can get the related chat', async function () {\n        const chat = await message.getChat();\n        expect(chat).to.be.instanceOf(Chat);\n        expect(chat.id._serialized).to.equal(remoteId);\n    });\n\n    it('can get the related contact', async function () {\n        const contact = await message.getContact();\n        expect(contact).to.be.instanceOf(Contact);\n        expect(contact.id._serialized).to.equal(client.info.wid._serialized);\n    });\n\n    it('can get message info', async function () {\n        const info = await message.getInfo();\n        expect(typeof info).to.equal('object');\n        expect(Array.isArray(info.played)).to.equal(true);\n        expect(Array.isArray(info.read)).to.equal(true);\n        expect(Array.isArray(info.delivery)).to.equal(true);\n    });\n\n    describe('Replies', function () {\n        let replyMsg;\n\n        it('can reply to a message', async function () {\n            replyMsg = await message.reply('this is my reply');\n            expect(replyMsg.hasQuotedMsg).to.equal(true);\n        });\n\n        it('can get the quoted message', async function () {\n            const quotedMsg = await replyMsg.getQuotedMessage();\n            expect(quotedMsg.id._serialized).to.equal(message.id._serialized);\n        });\n    });\n\n    describe('Star', function () {\n        it('can star a message', async function () {\n            expect(message.isStarred).to.equal(false);\n            await message.star();\n\n            await helper.sleep(1000);\n\n            // reload and check\n            await message.reload();\n            expect(message.isStarred).to.equal(true);\n        });\n\n        it('can un-star a message', async function () {\n            expect(message.isStarred).to.equal(true);\n            await message.unstar();\n\n            await helper.sleep(1000);\n\n            // reload and check\n            await message.reload();\n            expect(message.isStarred).to.equal(false);\n        });\n    });\n\n    describe('Delete', function () {\n        it('can delete a message for me', async function () {\n            await message.delete();\n\n            await helper.sleep(5000);\n            expect(await message.reload()).to.equal(null);\n        });\n\n        it('can delete a message for everyone', async function () {\n            message = await chat.sendMessage('sneaky message');\n            await helper.sleep(1000);\n\n            const callback = sinon.spy();\n            client.once('message_revoke_everyone', callback);\n\n            await message.delete(true);\n            await helper.sleep(1000);\n\n            expect(await message.reload()).to.equal(null);\n            expect(callback.called).to.equal(true);\n            const [revokeMsg, originalMsg] = callback.args[0];\n            expect(revokeMsg.id._serialized).to.equal(\n                originalMsg.id._serialized,\n            );\n            expect(originalMsg.body).to.equal('sneaky message');\n            expect(originalMsg.type).to.equal('chat');\n            expect(revokeMsg.body).to.equal('');\n            expect(revokeMsg.type).to.equal('revoked');\n        });\n    });\n});\n"
  },
  {
    "path": "tools/changelog.sh",
    "content": "#!/bin/sh\n\nLAST_TAG=$(git describe --tags --abbrev=0)\ngit log --pretty=\"%h - %s\" \"$LAST_TAG\"..HEAD"
  },
  {
    "path": "tools/publish",
    "content": "#!/bin/bash\nset -e\n\ncd \"$(dirname \"$0\")\"\ncd '..'\n\nBRANCH=`git rev-parse --abbrev-ref HEAD`\nRELEASE_MODE=$1\n\necho \"\"\necho \"-----> CHECK INPUTS\"\necho \"\"\n\nif [[ \"$RELEASE_MODE\" == \"alpha\" ]]\nthen\n  PRERELEASE='true'\n  VERSION_ARGS=\"prerelease --preid alpha\"\n  DIST_TAG=\"next\"\nelif [[ \"$RELEASE_MODE\" == \"alpha-minor\" ]]\nthen\n  PRERELEASE='true'\n  VERSION_ARGS=\"preminor --preid alpha\"\n  DIST_TAG=\"next\"\nelif [[ \"$RELEASE_MODE\" == \"alpha-major\" ]]\nthen\n  PRERELEASE='true'\n  VERSION_ARGS=\"premajor --preid alpha\"\n  DIST_TAG=\"next\"\nelif [[ \"$RELEASE_MODE\" == \"release-patch\" ]]\nthen\n  PRERELEASE='false'\n  VERSION_ARGS=\"patch\"\n  DIST_TAG=\"latest\" \nelif [[ \"$RELEASE_MODE\" == \"release-minor\" ]]\nthen\n  PRERELEASE='false'\n  VERSION_ARGS=\"minor\"\n  DIST_TAG=\"latest\" \nelse\n  echo 'Release Mode required'\n  exit 1\nfi\n\n# Note: When running in GitHub Actions with trusted publishing (OIDC),\n# npm whoami won't work as OIDC auth only applies during npm publish.\n# For local publishing, ensure you're logged in with 'npm login'.\nif [[ -z \"$CI\" ]] && ! npm whoami &> /dev/null; then\n  echo \"Not authenticated with npm. Run 'npm login' to authenticate.\"\n  exit 1\nfi\nif [[ -z \"$CI\" ]]; then\n  echo \"Publishing as NPM user: $(npm whoami)\"\nelse\n  echo \"Publishing via GitHub Actions OIDC trusted publishing\"\nfi\n\nif [[ $BRANCH != 'main' ]]; then\n  echo \"Not on 'main' branch.  Exiting\"\n  exit 1\nfi\n\nif [[ -n $(git status -s) ]]; then\n  echo \"There are uncommitted changes on this branch. Exiting...\"\n  exit 1\nfi\n\necho \"\"\necho \"-----> BUMP VERSION\"\necho \"\"\n\nnpm version $VERSION_ARGS --no-git-tag-version\n\nNEW_VERSION=$(cat package.json | jq -r .version)\necho \"New Version: $NEW_VERSION\"\n\necho \"\"\necho \"-----> GENERATE DOCS\"\necho \"\"\n\nnpm install\n\nnpm run generate-docs\n\necho \"\"\necho \"-----> PUSH TO NPM\"\necho \"\"\n\nnpm publish --tag $DIST_TAG\n\necho \"\"\necho \"-----> PUSH TO GIT\"\necho \"\"\n\ngit add .\n\ngit commit -am \"chore(v${NEW_VERSION}): bump version and generate docs\"\n\ngit tag \"v${NEW_VERSION}\"\n\ngit push && git push --tags\n\necho \"\"\necho \"-----> Done!\"\necho \"Version $NEW_VERSION published to $DIST_TAG tag\"\necho \"\"\n\necho \"NEW_VERSION=$NEW_VERSION\" >> $GITHUB_OUTPUT\necho \"PRERELEASE=$PRERELEASE\" >> $GITHUB_OUTPUT\n"
  },
  {
    "path": "tools/version-checker/.version",
    "content": "2.3000.1017054665"
  },
  {
    "path": "tools/version-checker/update-version",
    "content": "#!/usr/bin/env node\n\nconst fs = require('fs');\nconst puppeteer = require('puppeteer');\n\nconst args = [\n    '--autoplay-policy=user-gesture-required',\n    '--disable-background-networking',\n    '--disable-background-timer-throttling',\n    '--disable-backgrounding-occluded-windows',\n    '--disable-breakpad',\n    '--disable-client-side-phishing-detection',\n    '--disable-component-update',\n    '--disable-default-apps',\n    '--disable-dev-shm-usage',\n    '--disable-domain-reliability',\n    '--disable-extensions',\n    '--disable-features=AudioServiceOutOfProcess',\n    '--disable-hang-monitor',\n    '--disable-ipc-flooding-protection',\n    '--disable-notifications',\n    '--disable-offer-store-unmasked-wallet-cards',\n    '--disable-popup-blocking',\n    '--disable-print-preview',\n    '--disable-prompt-on-repost',\n    '--disable-renderer-backgrounding',\n    '--disable-speech-api',\n    '--disable-sync',\n    '--disable-gpu',\n    '--disable-accelerated-2d-canvas',\n    '--hide-scrollbars',\n    '--ignore-gpu-blacklist',\n    '--metrics-recording-only',\n    '--mute-audio',\n    '--no-default-browser-check',\n    '--no-first-run',\n    '--no-pings',\n    '--no-zygote',\n    '--password-store=basic',\n    '--use-gl=swiftshader',\n    '--use-mock-keychain',\n    '--disable-setuid-sandbox',\n    '--no-sandbox',\n    '--disable-blink-features=AutomationControlled',\n    '--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36',\n];\n\nconst getLatestVersion = async () => {\n    const browser = await puppeteer.launch({\n        args: args,\n    });\n    const page = await browser.newPage();\n    await page.goto('https://web.whatsapp.com', {\n        waitUntil: 'load',\n        timeout: 0,\n        referer: 'https://whatsapp.com/',\n    });\n\n    await page.waitForFunction(\n        () => window.require && window.require('WAWebBuildConstants'),\n    );\n\n    const version = await page.evaluate(() => {\n        return window.require('WAWebBuildConstants').VERSION_STR;\n    });\n\n    await browser.close();\n    return version;\n};\n\nconst getCurrentVersion = () => {\n    try {\n        const versionFile = fs.readFileSync('./.version');\n        return versionFile ? versionFile.toString().trim() : null;\n    } catch (_) {\n        return null;\n    }\n};\n\nconst updateInFile = (filePath, oldVersion, newVersion) => {\n    const originalFile = fs.readFileSync(filePath);\n    const newFile = originalFile.toString().replaceAll(oldVersion, newVersion);\n\n    fs.writeFileSync(filePath, newFile);\n};\n\nconst updateVersion = async (oldVersion, newVersion) => {\n    const filesToUpdate = ['../../src/util/Constants.js', '../../README.md'];\n\n    for (const file of filesToUpdate) {\n        updateInFile(file, oldVersion, newVersion);\n    }\n\n    fs.writeFileSync('./.version', newVersion);\n};\n\n(async () => {\n    const currentVersion = getCurrentVersion();\n    const version = (await getLatestVersion()) ?? currentVersion;\n\n    console.log(`Current version: ${currentVersion}`);\n    console.log(`Latest version: ${version}`);\n\n    if (currentVersion !== version) {\n        console.log('Updating files...');\n        await updateVersion(currentVersion, version);\n        console.log('Updated!');\n    } else {\n        console.log('No changes.');\n    }\n})();\n"
  }
]