| New file |
| | |
| | | .git |
| | | __pycache__ |
| | | *.pyc |
| | | .env |
| | | Dockerfile |
| | | tmp/ |
| | | data/ |
| New file |
| | |
| | | --- |
| | | name: Bug æ¥åï¼Bug Reportï¼ |
| | | about: åé¦é¡¹ç®ä¸çç¼ºé·æé®é¢ |
| | | title: "[Bug] ç®çæè¿°é®é¢" |
| | | labels: bug |
| | | assignees: '' |
| | | --- |
| | | |
| | | ## ð é®é¢æè¿° |
| | | <!-- æ¸
æ°ç®æ´å°æè¿°é®é¢æ¯ä»ä¹ --> |
| | | |
| | | ## ð¥ï¸ ç¯å¢ä¿¡æ¯ |
| | | - é¨ç½²æ¹å¼: å
¨æ¨¡åé¨ç½² è¿æ¯ åServeré¨ç½² |
| | | - çæ¬å·: ä¾å¦ 0.3.x |
| | | |
| | | ## ð åè¯æä»¬ï¼åºè¯¥æä¹å¤ç°è¿ä¸ªé®é¢ |
| | | <!-- è¿ä¸ªå¾éè¦ï¼æ¹ä¾¿æä»¬å¿«éå®ä½ --> |
| | | 1. æå¼ '...' |
| | | 2. ç¹å» '...' |
| | | 3. æ»å¨å° '...' |
| | | 4. çå°é误 |
| | | |
| | | ## ð¤ ä½ åæ¬å¸ææ¯æä¹æ ·ç |
| | | <!-- ç®è¦æè¿°é¢æçæ£ç¡®è¡ä¸º --> |
| | | |
| | | ## ð¯ æä¾ä¸äºæªå¾ |
| | | <!-- 妿éç¨ï¼æ·»å é®é¢çæªå¾ --> |
| | | 1. æ¯å¦æ¥å¿æªå¾ï¼è¶å¤è¶å¥½ |
| | | 2. æ¯å¦çé¢ååº |
| | | |
| | | ## ð å
¶ä»ä¿¡æ¯ |
| | | <!-- 卿¤æ·»å å
³äºæ¤é®é¢çä»»ä½å
¶ä»ä¸ä¸æä¿¡æ¯ --> |
| New file |
| | |
| | | --- |
| | | name: 代ç ä¼å建议ï¼Code Improvementï¼ |
| | | about: æåºå¯¹ç°æä»£ç çä¼åææ¹è¿å»ºè®® |
| | | title: "[Improvement] ç®çæè¿°æ¹è¿å
容" |
| | | labels: refactor |
| | | assignees: '' |
| | | --- |
| | | |
| | | ## ð¡ æ¹è¿æè¿° |
| | | <!-- æè¿°éè¦æ¹è¿ç代ç é¨å以ååå¨çé®é¢ --> |
| | | |
| | | ## ð æ¹è¿å»ºè®® |
| | | <!-- æåºå
·ä½çæ¹è¿æ¹æ¡ææè·¯ --> |
| | | |
| | | ## ð ï¸ ç¸å
³ä»£ç |
| | | <!-- 妿å¯è½ï¼æä¾ç¸å
³ä»£ç çæ®µæé¾æ¥ --> |
| | | |
| | | ## ð å
¶ä»ä¿¡æ¯ |
| | | <!-- 卿¤æ·»å ä»»ä½å
¶ä»ç¸å
³ä¿¡æ¯ --> |
| New file |
| | |
| | | --- |
| | | name: ææ¡£æ¹è¿å»ºè®®ï¼Documentation Improvementï¼ |
| | | about: æåºå¯¹é¡¹ç®ææ¡£çæ¹è¿æè¡¥å
建议 |
| | | title: "[Docs] ç®çæè¿°æ¹è¿å
容" |
| | | labels: documentation |
| | | assignees: '' |
| | | --- |
| | | |
| | | ## ð æ¹è¿æè¿° |
| | | <!-- æè¿°éè¦æ¹è¿çææ¡£é¨å以ååå¨çé®é¢ --> |
| | | |
| | | ## ⨠æ¹è¿å»ºè®® |
| | | <!-- æåºå
·ä½çæ¹è¿æ¹æ¡æå
容 --> |
| | | |
| | | ## ð å
¶ä»ä¿¡æ¯ |
| | | <!-- 卿¤æ·»å ä»»ä½å
¶ä»ç¸å
³ä¿¡æ¯ --> |
| New file |
| | |
| | | --- |
| | | name: åè½è¯·æ±ï¼Feature Requestï¼ |
| | | about: æåºæ°çåè½ææ¹è¿å»ºè®® |
| | | title: "[Feature] ç®çæè¿°åè½" |
| | | labels: enhancement |
| | | assignees: '' |
| | | --- |
| | | |
| | | ## ð éæ±æè¿° |
| | | <!-- æ¸
æ°ç®æ´å°æè¿°ä½ 叿åçä»ä¹ --> |
| | | |
| | | ## ð¯ è§£å³æ¹æ¡ |
| | | <!-- æè¿°ä½ 认为å¯è¡çè§£å³æ¹æ¡æå®ç°æ¹å¼ --> |
| | | |
| | | ## ð å¤éæ¹æ¡ |
| | | <!-- æè¿°ä½ èèè¿çæ¿ä»£æ¹æ¡æåè½ --> |
| | | |
| | | ## ð å
¶ä»ä¿¡æ¯ |
| | | <!-- 卿¤æ·»å å
³äºéæ±çä»»ä½å
¶ä»ä¸ä¸æä¿¡æ¯ --> |
| New file |
| | |
| | | version: 2 |
| | | updates: |
| | | - package-ecosystem: pip |
| | | directory: /main/xiaozhi-server |
| | | schedule: |
| | | interval: weekly |
| New file |
| | |
| | | name: Build Base Image |
| | | |
| | | on: |
| | | push: |
| | | branches: |
| | | - main |
| | | paths: |
| | | - 'main/xiaozhi-server/requirements.txt' |
| | | - 'Dockerfile-server-base' |
| | | - '.github/workflows/build-base-image.yml' |
| | | |
| | | jobs: |
| | | build-base: |
| | | name: Build and push server base image |
| | | runs-on: ubuntu-latest |
| | | permissions: |
| | | packages: write |
| | | contents: read |
| | | steps: |
| | | - name: Checkout code |
| | | uses: actions/checkout@v4 |
| | | |
| | | - name: Set up Docker Buildx |
| | | uses: docker/setup-buildx-action@v3 |
| | | |
| | | - name: Login to GitHub Container Registry |
| | | uses: docker/login-action@v3 |
| | | with: |
| | | registry: ghcr.io |
| | | username: ${{ github.actor }} |
| | | password: ${{ secrets.TOKEN }} |
| | | |
| | | - name: Build and push server-base |
| | | uses: docker/build-push-action@v6 |
| | | with: |
| | | context: . |
| | | file: Dockerfile-server-base |
| | | push: true |
| | | tags: ghcr.io/${{ github.repository }}:server-base |
| | | platforms: linux/amd64,linux/arm64 |
| | | cache-from: type=gha,scope=server-base |
| | | cache-to: type=gha,mode=max,scope=server-base |
| | | build-args: | |
| | | BUILDKIT_PROGRESS=plain |
| | | |
| | | - name: Output image info |
| | | run: | |
| | | echo "â
Base image built and pushed successfully!" |
| | | echo "ð¦ Tag: ghcr.io/${{ github.repository }}:server-base" |
| New file |
| | |
| | | name: Docker Image CI |
| | | |
| | | on: |
| | | push: |
| | | tags: |
| | | - 'v*.*.*' # åªå¨ä»¥ v å¼å¤´çæ ç¾æ¨éæ¶è§¦åï¼ä¾å¦ v1.0.0 |
| | | workflow_dispatch: |
| | | workflow_run: |
| | | workflows: ["Build Base Image"] |
| | | types: |
| | | - completed |
| | | |
| | | jobs: |
| | | release: |
| | | name: Release Docker images |
| | | runs-on: ubuntu-latest |
| | | permissions: |
| | | packages: write |
| | | contents: write |
| | | id-token: write |
| | | issues: write |
| | | steps: |
| | | - name: Check Disk Space |
| | | run: | |
| | | df -h |
| | | docker system df |
| | | |
| | | - name: Clean up Docker resources |
| | | run: | |
| | | docker system prune -af |
| | | docker builder prune -af |
| | | |
| | | - name: Checkout code |
| | | uses: actions/checkout@v4 |
| | | |
| | | - name: Set up Docker Buildx |
| | | uses: docker/setup-buildx-action@v3 |
| | | with: |
| | | driver-opts: | |
| | | network=host |
| | | |
| | | - name: Login to GitHub Container Registry |
| | | uses: docker/login-action@v3 |
| | | with: |
| | | registry: ghcr.io |
| | | username: ${{ github.actor }} |
| | | password: ${{ secrets.TOKEN }} |
| | | |
| | | - name: Extract version from tag |
| | | id: get_version |
| | | run: | |
| | | if [[ "$GITHUB_REF" =~ ^refs/tags/v([0-9]+\.[0-9]+\.[0-9]+)$ ]]; then |
| | | echo "VERSION=${BASH_REMATCH[1]}" >> $GITHUB_ENV |
| | | echo "IS_VERSION=true" >> $GITHUB_ENV |
| | | else |
| | | echo "VERSION=latest" >> $GITHUB_ENV |
| | | echo "IS_VERSION=false" >> $GITHUB_ENV |
| | | fi |
| | | |
| | | # æå»º xiaozhi-server éå |
| | | - name: Build and push xiaozhi-server |
| | | uses: docker/build-push-action@v6 |
| | | with: |
| | | context: . |
| | | file: Dockerfile-server |
| | | push: true |
| | | tags: | |
| | | ${{ env.IS_VERSION == 'true' && format('ghcr.io/{0}:server_{1},ghcr.io/{0}:server_latest', github.repository, env.VERSION) || format('ghcr.io/{0}:server_latest', github.repository) }} |
| | | platforms: linux/amd64,linux/arm64 |
| | | cache-from: type=gha |
| | | cache-to: type=gha,mode=max |
| | | build-args: | |
| | | BUILDKIT_PROGRESS=plain |
| | | |
| | | # æå»º manager-api éå |
| | | - name: Build and push manager-web |
| | | uses: docker/build-push-action@v6 |
| | | with: |
| | | context: . |
| | | file: Dockerfile-web |
| | | push: true |
| | | tags: | |
| | | ${{ env.IS_VERSION == 'true' && format('ghcr.io/{0}:web_{1},ghcr.io/{0}:web_latest', github.repository, env.VERSION) || format('ghcr.io/{0}:web_latest', github.repository) }} |
| | | platforms: linux/amd64,linux/arm64 |
| | | cache-from: type=gha |
| | | cache-to: type=gha,mode=max |
| | | build-args: | |
| | | BUILDKIT_PROGRESS=plain |
| New file |
| | |
| | | # Byte-compiled / optimized / DLL files |
| | | __pycache__/ |
| | | .idea/ |
| | | *.py[cod] |
| | | *$py.class |
| | | .vscode |
| | | .claude |
| | | AGENTS.md |
| | | |
| | | # C extensions |
| | | *.so |
| | | |
| | | # Distribution / packaging |
| | | .Python |
| | | build/ |
| | | develop-eggs/ |
| | | dist/ |
| | | downloads/ |
| | | eggs/ |
| | | .eggs/ |
| | | lib/ |
| | | lib64/ |
| | | parts/ |
| | | sdist/ |
| | | var/ |
| | | wheels/ |
| | | share/python-wheels/ |
| | | *.egg-info/ |
| | | .installed.cfg |
| | | *.egg |
| | | MANIFEST |
| | | |
| | | # PyInstaller |
| | | # Usually these files are written by a python script from a template |
| | | # before PyInstaller builds the exe, so as to inject date/other infos into it. |
| | | *.manifest |
| | | *.spec |
| | | |
| | | # Installer logs |
| | | pip-log.txt |
| | | pip-delete-this-directory.txt |
| | | |
| | | # Unit testdata / coverage reports |
| | | htmlcov/ |
| | | .tox/ |
| | | .nox/ |
| | | .coverage |
| | | .coverage.* |
| | | .cache |
| | | nosetests.xml |
| | | coverage.xml |
| | | *.cover |
| | | *.py,cover |
| | | .hypothesis/ |
| | | .pytest_cache/ |
| | | cover/ |
| | | |
| | | # Translations |
| | | *.mo |
| | | *.pot |
| | | |
| | | # Django stuff: |
| | | *.log |
| | | local_settings.py |
| | | db.sqlite3 |
| | | db.sqlite3-journal |
| | | |
| | | # Flask stuff: |
| | | instance/ |
| | | .webassets-cache |
| | | |
| | | # Scrapy stuff: |
| | | .scrapy |
| | | |
| | | # Sphinx documentation |
| | | docs/_build/ |
| | | |
| | | # PyBuilder |
| | | .pybuilder/ |
| | | target/ |
| | | *.pid |
| | | |
| | | # Jupyter Notebook |
| | | .ipynb_checkpoints |
| | | |
| | | # IPython |
| | | profile_default/ |
| | | ipython_config.py |
| | | |
| | | # pyenv |
| | | # For a library or package, you might want to ignore these files since the code is |
| | | # intended to run in multiple environments; otherwise, check them in: |
| | | # .python-version |
| | | |
| | | # pipenv |
| | | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. |
| | | # However, in case of collaboration, if having platform-specific dependencies or dependencies |
| | | # having no cross-platform support, pipenv may install dependencies that don't work, or not |
| | | # install all needed dependencies. |
| | | #Pipfile.lock |
| | | |
| | | # PEP 582; used by e.g. github.com/David-OConnor/pyflow |
| | | __pypackages__/ |
| | | |
| | | # Celery stuff |
| | | celerybeat-schedule |
| | | celerybeat.pid |
| | | |
| | | # SageMath parsed files |
| | | *.sage.py |
| | | |
| | | # Environments |
| | | .env |
| | | .venv |
| | | /.venv-*/ |
| | | env/ |
| | | venv/ |
| | | ENV/ |
| | | env.bak/ |
| | | venv.bak/ |
| | | |
| | | # Repository-local runtimes and package-manager caches |
| | | /.runtime/ |
| | | /main/manager-web/.npm-cache/ |
| | | |
| | | # Spyder project settings |
| | | .spyderproject |
| | | .spyproject |
| | | |
| | | # Rope project settings |
| | | .ropeproject |
| | | |
| | | # mkdocs documentation |
| | | /site |
| | | |
| | | # mypy |
| | | .mypy_cache/ |
| | | .dmypy.json |
| | | dmypy.json |
| | | |
| | | # Pyre type checker |
| | | .pyre/ |
| | | |
| | | # music directory |
| | | music/ |
| | | |
| | | # pytype static type analyzer |
| | | .pytype/ |
| | | |
| | | # Cython debug symbols |
| | | cython_debug/ |
| | | *.iml |
| | | tmp |
| | | .history |
| | | .DS_Store |
| | | main/xiaozhi-server/data |
| | | main/xiaozhi-server/.claude |
| | | |
| | | main/manager-web/node_modules |
| | | .config.yaml |
| | | .secrets.yaml |
| | | .private_config.yaml |
| | | .env.development |
| | | |
| | | # model files |
| | | main/xiaozhi-server/models/SenseVoiceSmall/model.pt |
| | | main/xiaozhi-server/models/sherpa-onnx* |
| | | /main/xiaozhi-server/audio_ref/ |
| | | /audio_ref/ |
| | | /asr-models/iic/SenseVoiceSmall/ |
| | | /main/xiaozhi-server/asr-models/iic/SenseVoiceSmall/ |
| | | /models/SenseVoiceSmall/model.pt |
| | | my_wakeup_words.mp3 |
| | | !main/xiaozhi-server/config/assets/bind_code.wav |
| | | !main/xiaozhi-server/config/assets/wakeup_words.wav |
| | | !main/xiaozhi-server/config/assets/bind_not_found.wav |
| | | !main/xiaozhi-server/config/assets/bind_code/*.wav |
| | | !main/xiaozhi-server/config/assets/max_output_size.wav |
| | | main/manager-api/.vscode |
| | | # Ignore webpack cache directory |
| | | main/manager-web/.webpack_cache/ |
| | | main/xiaozhi-server/mysql |
| | | uploadfile |
| | | *.json |
| | | .vscode |
| | | .cursor |
| | | |
| | | !package.json |
| | | !**/package.json |
| | | |
| | | # Do not ignore env and json files inside manager-mobile |
| | | !main/manager-mobile/**/env/ |
| | | !main/manager-mobile/**/.env* |
| | | !main/manager-mobile/**/*.json |
| | | !main/xiaozhi-server/**/*.json |
| | | !main/digital-human/**/*.json |
| | | main/digital-human/wakeword_runtime/models |
| | | main/digital-human/wakeword_runtime/sherpa-onnx-kws-zipformer-wenetspeech-3.3M-2024-01-01 |
| | | sherpa-onnx-kws-zipformer-wenetspeech-3.3M-2024-01-01.tar.bz2 |
| New file |
| | |
| | | # ç产éåï¼ä»
å
å«åºç¨ä»£ç |
| | | FROM ghcr.io/xinnan-tech/xiaozhi-esp32-server:server-base |
| | | |
| | | COPY main/xiaozhi-server . |
| | | |
| | | # å¯å¨åºç¨ |
| | | CMD ["python", "app.py"] |
| New file |
| | |
| | | # Dockerfile-server-base |
| | | # åºç¡éåï¼å
å«ç³»ç»ä¾èµåPythonå
|
| | | FROM python:3.10-slim |
| | | |
| | | # å®è£
ç³»ç»ä¾èµ |
| | | RUN apt-get update && \ |
| | | apt-get install -y --no-install-recommends libopus0 ffmpeg locales && \ |
| | | sed -i '/zh_CN.UTF-8/s/^# //g' /etc/locale.gen && \ |
| | | locale-gen && \ |
| | | apt-get clean && \ |
| | | rm -rf /var/lib/apt/lists/* |
| | | |
| | | # é
ç½®pip使ç¨å½å
éåæºï¼é¿éäºï¼å¹¶è®¾ç½®è¶
æ¶åéè¯ |
| | | RUN pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/ && \ |
| | | pip config set global.trusted-host mirrors.aliyun.com && \ |
| | | pip config set global.timeout 120 && \ |
| | | pip config set install.retries 5 |
| | | |
| | | # 设置ç¯å¢åéä»¥ç¡®ä¿æ£ç¡®çå符ç¼ç |
| | | ENV LANG=zh_CN.UTF-8 \ |
| | | LC_ALL=zh_CN.UTF-8 \ |
| | | LANGUAGE=zh_CN:zh \ |
| | | PYTHONIOENCODING=utf-8 |
| | | |
| | | WORKDIR /opt/xiaozhi-esp32-server |
| | | |
| | | # å¤å¶requirements.txt |
| | | COPY main/xiaozhi-server/requirements.txt . |
| | | |
| | | # å®è£
Pythonä¾èµ |
| | | RUN pip install --no-cache-dir --upgrade pip setuptools wheel && \ |
| | | pip install --no-cache-dir -r requirements.txt --default-timeout=120 --retries 5 |
| New file |
| | |
| | | # 第ä¸é¶æ®µï¼æå»ºVueå端 |
| | | FROM node:18 AS web-builder |
| | | WORKDIR /app |
| | | COPY main/manager-web/package*.json ./ |
| | | RUN npm install |
| | | COPY main/manager-web . |
| | | RUN npm run build |
| | | |
| | | # 第äºé¶æ®µï¼æå»ºJavaå端 |
| | | FROM maven:3.9.4-eclipse-temurin-21 AS api-builder |
| | | WORKDIR /app |
| | | COPY main/manager-api/pom.xml . |
| | | COPY main/manager-api/src ./src |
| | | RUN mvn clean package -Dmaven.test.skip=true |
| | | |
| | | # 第ä¸é¶æ®µï¼æå»ºæç»éå |
| | | FROM bellsoft/liberica-runtime-container:jre-21-glibc |
| | | |
| | | # å®è£
Nginxååä½åº |
| | | RUN apk update && \ |
| | | apk add --no-cache --no-scripts \ |
| | | nginx \ |
| | | bash \ |
| | | fontconfig \ |
| | | ttf-dejavu \ |
| | | && rm -rf /var/cache/apk/* \ |
| | | && mkdir -p /run/nginx /var/log/nginx /var/tmp/nginx /etc/nginx/conf.d |
| | | |
| | | # å¤å¶é¡¹ç®èªå¸¦ç䏿åä½ |
| | | COPY main/manager-web/public/generator/static/fonts/*.ttf /usr/share/fonts/ |
| | | |
| | | # æ´æ°åä½ç¼å |
| | | RUN fc-cache -f -v |
| | | |
| | | # é
ç½®Nginx |
| | | COPY docs/docker/nginx.conf /etc/nginx/nginx.conf |
| | | |
| | | # å¤å¶å端æå»ºäº§ç© |
| | | COPY --from=web-builder /app/dist /usr/share/nginx/html |
| | | |
| | | # å¤å¶Javaå端JARå
|
| | | COPY --from=api-builder /app/target/xiaozhi-esp32-api.jar /app/xiaozhi-esp32-api.jar |
| | | |
| | | # æ´é²ç«¯å£ |
| | | EXPOSE 8002 |
| | | |
| | | # å¯å¨èæ¬ |
| | | COPY docs/docker/start.sh /start.sh |
| | | RUN chmod +x /start.sh |
| | | CMD ["/start.sh"] |
| New file |
| | |
| | | MIT License |
| | | |
| | | Copyright (c) 2025 xinnan-tech |
| | | |
| | | Permission is hereby granted, free of charge, to any person obtaining a copy |
| | | of this software and associated documentation files (the "Software"), to deal |
| | | in the Software without restriction, including without limitation the rights |
| | | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
| | | copies of the Software, and to permit persons to whom the Software is |
| | | furnished to do so, subject to the following conditions: |
| | | |
| | | The above copyright notice and this permission notice shall be included in all |
| | | copies or substantial portions of the Software. |
| | | |
| | | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
| | | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
| | | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
| | | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
| | | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
| | | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
| | | SOFTWARE. |
| New file |
| | |
| | | [](https://github.com/xinnan-tech/xiaozhi-esp32-server) |
| | | |
| | | <h1 align="center">å°æºå端æå¡xiaozhi-esp32-server</h1> |
| | | |
| | | <p align="center"> |
| | | æ¬é¡¹ç®åºäºäººæºå
±çæºè½çè®ºåææ¯ç åæºè½ç»ç«¯è½¯ç¡¬ä»¶ä½ç³»<br/>ä¸ºå¼æºæºè½ç¡¬ä»¶é¡¹ç® |
| | | <a href="https://github.com/78/xiaozhi-esp32">xiaozhi-esp32</a>æä¾å端æå¡<br/> |
| | | æ ¹æ®<a href="https://ccnphfhqs21z.feishu.cn/wiki/M0XiwldO9iJwHikpXD5cEx71nKh">å°æºéä¿¡åè®®</a>使ç¨PythonãJavaãVueå®ç°<br/> |
| | | æ¯æMQTT+UDPåè®®ãWebsocketåè®®ãMCPæ¥å
¥ç¹ã声纹è¯å«ãç¥è¯åº |
| | | </p> |
| | | |
| | | <p align="center"> |
| | | <a href="./docs/FAQ.md">常è§é®é¢</a> |
| | | · <a href="https://github.com/xinnan-tech/xiaozhi-esp32-server/issues">åé¦é®é¢</a> |
| | | · <a href="./README.md#%E9%83%A8%E7%BD%B2%E6%96%87%E6%A1%A3">é¨ç½²ææ¡£</a> |
| | | · <a href="https://github.com/xinnan-tech/xiaozhi-esp32-server/releases">æ´æ°æ¥å¿</a> |
| | | </p> |
| | | |
| | | <p align="center"> |
| | | <a href="./README.md"><img alt="ç®ä½ä¸æçèªè¿°æä»¶" src="https://img.shields.io/badge/ç®ä½ä¸æ-DBEDFA"></a> |
| | | <a href="./docs/readme/README_en.md"><img alt="README in English" src="https://img.shields.io/badge/English-DFE0E5"></a> |
| | | <a href="./docs/readme/README_vi.md"><img alt="Tiếng Viá»t" src="https://img.shields.io/badge/Tiếng Viá»t-DFE0E5"></a> |
| | | <a href="./docs/readme/README_de.md"><img alt="Deutsch" src="https://img.shields.io/badge/Deutsch-DFE0E5"></a> |
| | | <a href="./docs/readme/README_pt_BR.md"><img alt="Português (Brasil)" src="https://img.shields.io/badge/Português (Brasil)-DFE0E5"></a> |
| | | <a href="https://github.com/xinnan-tech/xiaozhi-esp32-server/releases"> |
| | | <img alt="GitHub Contributors" src="https://img.shields.io/github/v/release/xinnan-tech/xiaozhi-esp32-server?logo=docker" /> |
| | | </a> |
| | | <a href="https://github.com/xinnan-tech/xiaozhi-esp32-server/blob/main/LICENSE"> |
| | | <img alt="GitHub pull requests" src="https://img.shields.io/badge/license-MIT-white?labelColor=black" /> |
| | | </a> |
| | | <a href="https://github.com/xinnan-tech/xiaozhi-esp32-server"> |
| | | <img alt="stars" src="https://img.shields.io/github/stars/xinnan-tech/xiaozhi-esp32-server?color=ffcb47&labelColor=black" /> |
| | | </a> |
| | | </p> |
| | | |
| | | <p align="center"> |
| | | Spearheaded by Professor Siyuan Liu's Team (South China University of Technology) |
| | | </br> |
| | | åææºææå¢é主导ç åï¼ååç工大å¦ï¼ |
| | | </br> |
| | | <img src="./docs/images/hnlg.jpg" alt="ååç工大å¦" width="50%"> |
| | | </p> |
| | | |
| | | --- |
| | | |
| | | ## éç¨äººç¾¤ ð¥ |
| | | |
| | | æ¬é¡¹ç®éè¦é
å ESP32 硬件设å¤ä½¿ç¨ã妿æ¨å·²ç»è´ä¹°äº ESP32 ç¸å
³ç¡¬ä»¶ï¼ä¸æå对æ¥è¿è¾å¥é¨ç½²çå端æå¡ï¼å¹¶å¸æç¬ç«æå»ºèªå·±ç |
| | | `xiaozhi-esp32` å端æå¡ï¼é£ä¹æ¬é¡¹ç®é常é忍ã |
| | | |
| | | æ³çä½¿ç¨ææï¼è¯·çæ³è§é¢ ð¥ |
| | | |
| | | <table> |
| | | <tr> |
| | | <td> |
| | | <a href="https://www.bilibili.com/video/BV1FMFyejExX" target="_blank"> |
| | | <picture> |
| | | <img alt="ååºé度æå" src="docs/images/demo9.png" /></picture> |
| | | </a> |
| | | </td> |
| | | <td> |
| | | <a href="https://www.bilibili.com/video/BV1vchQzaEse" target="_blank"> |
| | | <picture> |
| | | <img alt="é度ä¼åç§è¯" src="docs/images/demo6.png" /></picture> |
| | | </a> |
| | | </td> |
| | | <td> |
| | | <a href="https://www.bilibili.com/video/BV1WEcxzFEAT" target="_blank"> |
| | | <picture> |
| | | <img alt="å°æºæ°å人 æ¯æè¯é³å¤é" src="docs/images/demo8.png" /></picture> |
| | | </a> |
| | | </td> |
| | | <td> |
| | | <a href="https://www.bilibili.com/video/BV1CKVz6UEuB" target="_blank"> |
| | | <picture> |
| | | <img alt="设å¤å¼å«è®¾å¤ï¼æçµè¯" src="docs/images/demo0.png" /></picture> |
| | | </a> |
| | | </td> |
| | | <td> |
| | | <a href="https://www.bilibili.com/video/BV1C1tCzUEZh" target="_blank"> |
| | | <picture> |
| | | <img alt="夿å»çåºæ¯" src="docs/images/demo1.png" /></picture> |
| | | </a> |
| | | </td> |
| | | </tr> |
| | | <tr> |
| | | <td> |
| | | <a href="https://www.bilibili.com/video/BV1VC96Y5EMH" target="_blank"> |
| | | <picture> |
| | | <img alt="ææ¾é³ä¹æ¥è¯¢å¤©æ°ææ¥æ°é»" src="docs/images/demo7.png" /></picture> |
| | | </a> |
| | | </td> |
| | | <td> |
| | | <a href="https://www.bilibili.com/video/BV12J7WzBEaH" target="_blank"> |
| | | <picture> |
| | | <img alt="宿¶ææ" src="docs/images/demo10.png" /></picture> |
| | | </a> |
| | | </td> |
| | | <td> |
| | | <a href="https://www.bilibili.com/video/BV1Co76z7EvK" target="_blank"> |
| | | <picture> |
| | | <img alt="æç
§è¯ç©å" src="docs/images/demo12.png" /></picture> |
| | | </a> |
| | | </td> |
| | | <td> |
| | | <a href="https://www.bilibili.com/video/BV1pNXWYGEx1" target="_blank"> |
| | | <picture> |
| | | <img alt="æ§å¶å®¶çµå¼å
³" src="docs/images/demo5.png" /></picture> |
| | | </a> |
| | | </td> |
| | | <td> |
| | | <a href="https://www.bilibili.com/video/BV1TJ7WzzEo6" target="_blank"> |
| | | <picture> |
| | | <img alt="夿令任å¡" src="docs/images/demo11.png" /></picture> |
| | | </a> |
| | | </td> |
| | | </tr> |
| | | <tr> |
| | | <td> |
| | | <a href="https://www.bilibili.com/video/BV1ZQKUzYExM" target="_blank"> |
| | | <picture> |
| | | <img alt="MCPæ¥å
¥ç¹" src="docs/images/demo13.png" /></picture> |
| | | </a> |
| | | </td> |
| | | <td> |
| | | <a href="https://www.bilibili.com/video/BV1zUW5zJEkq" target="_blank"> |
| | | <picture> |
| | | <img alt="MQTTæä»¤ä¸å" src="docs/images/demo4.png" /></picture> |
| | | </a> |
| | | </td> |
| | | <td> |
| | | <a href="https://www.bilibili.com/video/BV1Exu3zqEDe" target="_blank"> |
| | | <picture> |
| | | <img alt="声纹è¯å«" src="docs/images/demo14.png" /></picture> |
| | | </a> |
| | | </td> |
| | | <td> |
| | | <a href="https://www.bilibili.com/video/BV1CDKWemEU6" target="_blank"> |
| | | <picture> |
| | | <img alt="èªå®ä¹é³è²" src="docs/images/demo2.png" /></picture> |
| | | </a> |
| | | </td> |
| | | <td> |
| | | <a href="https://www.bilibili.com/video/BV12yA2egEaC" target="_blank"> |
| | | <picture> |
| | | <img alt="使ç¨ç²¤è¯äº¤æµ" src="docs/images/demo3.png" /></picture> |
| | | </a> |
| | | </td> |
| | | </tr> |
| | | </table> |
| | | |
| | | --- |
| | | |
| | | ## è¦å â ï¸ |
| | | |
| | | 1ãæ¬é¡¹ç®ä¸ºå¼æºè½¯ä»¶ï¼æ¬è½¯ä»¶ä¸å¯¹æ¥çä»»ä½ç¬¬ä¸æ¹APIæå¡åï¼å
æ¬ä½ä¸éäºè¯é³è¯å«ã大模åãè¯é³åæçå¹³å°ï¼åä¸åå¨åä¸åä½å
³ç³»ï¼ä¸ä¸ºå
¶æå¡è´¨éåèµéå®å
¨æä¾ä»»ä½å½¢å¼çæ
ä¿ã |
| | | 建议使ç¨è
ä¼å
éæ©ææç¸å
³ä¸å¡çç
§çæå¡åï¼å¹¶ä»ç»é
读å
¶æå¡åè®®åéç§æ¿çãæ¬è½¯ä»¶ä¸æç®¡ä»»ä½è´¦æ·å¯é¥ãä¸åä¸èµéæµè½¬ã䏿¿æ
å
å¼èµéæå¤±é£é©ã |
| | | |
| | | 2ãæ¬é¡¹ç®åè½æªå®åï¼ä¸æªéè¿ç½ç»å®å
¨æµè¯ï¼è¯·å¿å¨ç产ç¯å¢ä¸ä½¿ç¨ã 妿æ¨å¨å
¬ç½ç¯å¢ä¸é¨ç½²å¦ä¹ æ¬é¡¹ç®ï¼è¯·å¡å¿
å好å¿
è¦ç鲿¤ã |
| | | |
| | | --- |
| | | |
| | | ## é¨ç½²ææ¡£ |
| | | |
| | |  |
| | | |
| | | æ¬é¡¹ç®æä¾ä¸¤ç§é¨ç½²æ¹å¼ï¼è¯·æ ¹æ®æ¨çå
·ä½éæ±éæ©ï¼ |
| | | |
| | | #### ð é¨ç½²æ¹å¼éæ© |
| | | | é¨ç½²æ¹å¼ | ç¹ç¹ | éç¨åºæ¯ | é¨ç½²ææ¡£ | é
ç½®è¦æ± | è§é¢æç¨ | |
| | | |---------|------|---------|---------|---------|---------| |
| | | | **æç®åå®è£
** | æºè½å¯¹è¯ãåæºè½ä½ç®¡ç | ä½é
ç½®ç¯å¢ï¼æ°æ®åå¨å¨é
ç½®æä»¶ï¼æ éæ°æ®åº | [â Dockerç](./docs/Deployment.md#%E6%96%B9%E5%BC%8F%E4%B8%80docker%E5%8F%AA%E8%BF%90%E8%A1%8Cserver) / [â¡æºç é¨ç½²](./docs/Deployment.md#%E6%96%B9%E5%BC%8F%E4%BA%8C%E6%9C%AC%E5%9C%B0%E6%BA%90%E7%A0%81%E5%8F%AA%E8%BF%90%E8%A1%8Cserver)| å¦æä½¿ç¨`FunASR`è¦2æ ¸4Gï¼å¦æå
¨APIï¼è¦2æ ¸2G | - | |
| | | | **å
¨æ¨¡åå®è£
** | æºè½å¯¹è¯ãå¤ç¨æ·ç®¡çã夿ºè½ä½ç®¡çãæºæ§å°çé¢æä½ | 宿´åè½ä½éªï¼æ°æ®åå¨å¨æ°æ®åº |[â Dockerç](./docs/Deployment_all.md#%E6%96%B9%E5%BC%8F%E4%B8%80docker%E8%BF%90%E8%A1%8C%E5%85%A8%E6%A8%A1%E5%9D%97) / [â¡æºç é¨ç½²](./docs/Deployment_all.md#%E6%96%B9%E5%BC%8F%E4%BA%8C%E6%9C%AC%E5%9C%B0%E6%BA%90%E7%A0%81%E8%BF%90%E8%A1%8C%E5%85%A8%E6%A8%A1%E5%9D%97) / [â¢æºç é¨ç½²èªå¨æ´æ°æç¨](./docs/dev-ops-integration.md) | å¦æä½¿ç¨`FunASR`è¦4æ ¸8Gï¼å¦æå
¨APIï¼è¦2æ ¸4G| [æ¬å°æºç å¯å¨è§é¢æç¨](https://www.bilibili.com/video/BV1wBJhz4Ewe) | |
| | | |
| | | 常è§é®é¢åç¸å
³æç¨ï¼å¯åè[è¿ä¸ªé¾æ¥](./docs/FAQ.md) |
| | | |
| | | > ð¡ æç¤ºï¼ä»¥ä¸æ¯æææ°ä»£ç é¨ç½²åçæµè¯å¹³å°ï¼æéè¦å¯ç§å½æµè¯ï¼å¹¶å为6ä¸ªï¼æ¯å¤©ä¼æ¸
ç©ºæ°æ®ï¼ |
| | | |
| | | ``` |
| | | æºæ§å°å°å: https://2662r3426b.vicp.fun |
| | | æºæ§å°(h5ç): https://2662r3426b.vicp.fun/h5/index.html |
| | | |
| | | æå¡æµè¯å·¥å
·ï¼ https://2662r3426b.vicp.fun/test/ |
| | | OTAæ¥å£å°å: https://2662r3426b.vicp.fun/xiaozhi/ota/ |
| | | Websocketæ¥å£å°å: wss://2662r3426b.vicp.fun/xiaozhi/v1/ |
| | | ``` |
| | | |
| | | #### ð© é
置说æåæ¨è |
| | | > [!Note] |
| | | > æ¬é¡¹ç®æä¾ä¸¤ç§é
ç½®æ¹æ¡ï¼ |
| | | > |
| | | > 1. `å
¥é¨å
¨å
è´¹`é
ç½®ï¼éå个人家åºä½¿ç¨ï¼ææç»ä»¶åéç¨å
è´¹æ¹æ¡ï¼æ éé¢å¤ä»è´¹ã |
| | | > |
| | | > 2. `æµå¼é
ç½®`ï¼éåæ¼ç¤ºãå¹è®ãè¶
è¿2个并åçåºæ¯ï¼éç¨æµå¼å¤çææ¯ï¼ååºé度æ´å¿«ï¼ä½éªæ´ä½³ã |
| | | > |
| | | > èª`0.5.2`çæ¬èµ·ï¼é¡¹ç®æ¯ææµå¼é
ç½®ï¼ç¸æ¯æ©æçæ¬ï¼ååºé度æå约`2.5ç§`ï¼æ¾èæ¹åç¨æ·ä½éªã |
| | | |
| | | | 模ååç§° | å
¥é¨å
¨å
费设置 | æµå¼é
ç½® | |
| | | |:---:|:---:|:---:| |
| | | | ASR(è¯é³è¯å«) | FunASR(æ¬å°) | ðXunfeiStreamASR(è®¯é£æµå¼) | |
| | | | LLM(大模å) | glm-4-flash(æºè°±) | ðqwen-flash(é¿éç¾ç¼) | |
| | | | VLLM(è§è§å¤§æ¨¡å) | glm-4v-flash(æºè°±) | ðqwen3.5-flash(é¿éç¾ç¼) | |
| | | | TTS(è¯é³åæ) | EdgeTTS(微软) | ðHuoshanDoubleStreamTTS(ç«å±±æµå¼) | |
| | | | Intent(æå¾è¯å«) | function_call(彿°è°ç¨) | function_call(彿°è°ç¨) | |
| | | | Memory(è®°å¿åè½) | mem_local_short(æ¬å°çæè®°å¿ï¼ | mem_local_shortï¼æ¬å°çæè®°å¿ï¼ | |
| | | |
| | | 妿æ¨å
³å¿åç»ä»¶çèæ¶ï¼è¯·æ¥é
[å°æºåç»ä»¶æ§è½æµè¯æ¥å](https://github.com/xinnan-tech/xiaozhi-performance-research)ï¼å¯ææ¥åä¸çæµè¯æ¹æ³å¨æ¨çç¯å¢ä¸å®é
æµè¯ã |
| | | |
| | | #### ð§ æµè¯å·¥å
· |
| | | æ¬é¡¹ç®æä¾ä»¥ä¸æµè¯å·¥å
·ï¼å¸®å©æ¨éªè¯ç³»ç»åéæ©åéçæ¨¡åï¼ |
| | | |
| | | | å·¥å
·åç§° | ä½ç½® | ä½¿ç¨æ¹æ³ | åè½è¯´æ | |
| | | |:---:|:---|:---:|:---:| |
| | | | é³é¢äº¤äºæµè¯å·¥å
· | mainãdigital-humanãindex.html | å¨ `main/digital-human` æ§è¡ `python start.py` åè®¿é® `http://127.0.0.1:8006/index.html` | æµè¯é³é¢ææ¾åæ¥æ¶åè½ï¼éªè¯Python端é³é¢å¤çæ¯å¦æ£å¸¸ | |
| | | | 模åååºæµè¯å·¥å
· | mainãxiaozhi-serverãperformance_tester.py | æ§è¡ `python performance_tester.py` | æµè¯ASR(è¯é³è¯å«)ãLLM(大模å)ãVLLM(è§è§æ¨¡å)ãTTS(è¯é³åæ)ä¸ä¸ªæ ¸å¿æ¨¡åçååºé度 | |
| | | |
| | | > ð¡ æç¤ºï¼æµè¯æ¨¡åé度æ¶ï¼åªä¼æµè¯é
ç½®äºå¯é¥ç模åã |
| | | |
| | | --- |
| | | ## åè½æ¸
å ⨠|
| | | ### å·²å®ç° â
|
| | |  |
| | | | åè½æ¨¡å | æè¿° | |
| | | |:---:|:---| |
| | | | æ ¸å¿æ¶æ | åºäº[MQTT+UDPç½å
³](https://github.com/xinnan-tech/xiaozhi-esp32-server/blob/main/docs/mqtt-gateway-integration.md)ãWebSocketãHTTPæå¡å¨ï¼æä¾å®æ´çæ§å¶å°ç®¡çå认è¯ç³»ç» | |
| | | | è¯é³äº¤äº | æ¯ææµå¼ASR(è¯é³è¯å«)ãæµå¼TTS(è¯é³åæ)ãVAD(è¯é³æ´»å¨æ£æµ)ï¼æ¯æå¤è¯è¨è¯å«åè¯é³å¤ç | |
| | | | 声纹è¯å« | æ¯æå¤ç¨æ·å£°çº¹æ³¨åã管çåè¯å«ï¼ä¸ASRå¹¶è¡å¤çï¼å®æ¶è¯å«è¯´è¯äººèº«ä»½å¹¶ä¼ éç»LLMè¿è¡ä¸ªæ§åååº | |
| | | | æºè½å¯¹è¯ | æ¯æå¤ç§LLM(大è¯è¨æ¨¡å)ï¼å®ç°æºè½å¯¹è¯ | |
| | | | è§è§æç¥ | æ¯æå¤ç§VLLM(è§è§å¤§æ¨¡å)ï¼å®ç°å¤æ¨¡æäº¤äº | |
| | | | æå¾è¯å« | æ¯æå¤æç大模åæå¾è¯å«ã大模åèªä¸»å½æ°è°ç¨ï¼æä¾æä»¶åæå¾å¤çæºå¶ | |
| | | | è®°å¿ç³»ç» | æ¯ææ¬å°çæè®°å¿ãmem0aiæ¥å£è®°å¿ãPowerMemæºè½è®°å¿ï¼å
·å¤è®°å¿æ»ç»åè½ | |
| | | | ç¥è¯åº | æ¯æRAGFlowç¥è¯åºï¼è®©å¤§æ¨¡å夿éè¦è°åº¦ç¥è¯åºåååç | |
| | | | å·¥å
·è°ç¨ | æ¯æå®¢æ·ç«¯IOTåè®®ã客æ·MCPåè®®ãæå¡ç«¯MCPåè®®ãMCPæ¥å
¥ç¹åè®®ãèªå®ä¹å·¥å
·å½æ° | |
| | | | æä»¤ä¸å | 便MQTTåè®®ï¼æ¯æä»æºæ§å°å°MCPæä»¤ä¸åå°ESP32è®¾å¤ | |
| | | | 管çåå° | æä¾Web管ççé¢ï¼æ¯æç¨æ·ç®¡çãç³»ç»é
ç½®å设å¤ç®¡çï¼ç颿¯æä¸æç®ä½ã䏿ç¹ä½ãè±ææ¾ç¤º | |
| | | | æµè¯å·¥å
· | æä¾æ§è½æµè¯å·¥å
·ãè§è§æ¨¡åæµè¯å·¥å
·åé³é¢äº¤äºæµè¯å·¥å
· | |
| | | | é¨ç½²æ¯æ | æ¯æDockeré¨ç½²åæ¬å°é¨ç½²ï¼æä¾å®æ´çé
ç½®æä»¶ç®¡ç | |
| | | | æä»¶ç³»ç» | æ¯æåè½æä»¶æ©å±ãèªå®ä¹æä»¶å¼ååæä»¶çå è½½ | |
| | | |
| | | ### æ£å¨å¼å ð§ |
| | | |
| | | æ³äºè§£å
·ä½å¼å计åè¿åº¦ï¼[请ç¹å»è¿é](https://github.com/users/xinnan-tech/projects/3)ã常è§é®é¢åç¸å
³æç¨ï¼å¯åè[è¿ä¸ªé¾æ¥](./docs/FAQ.md) |
| | | |
| | | å¦æä½ æ¯ä¸å软件å¼åè
ï¼è¿éæä¸ä»½[ãè´å¼åè
çå
¬å¼ä¿¡ã](docs/contributor_open_letter.md)ï¼æ¬¢è¿å å
¥ï¼ |
| | | |
| | | --- |
| | | |
| | | ## 产åçæ ð¬ |
| | | å°æºæ¯ä¸ä¸ªçæï¼å½ä½ 使ç¨è¿ä¸ªäº§åæ¶ï¼ä¹å¯ä»¥ççå
¶ä»å¨è¿ä¸ªçæåç[ä¼ç§é¡¹ç®](https://github.com/78/xiaozhi-esp32/blob/main/README_zh.md#%E7%9B%B8%E5%85%B3%E5%BC%80%E6%BA%90%E9%A1%B9%E7%9B%AE) |
| | | |
| | | --- |
| | | |
| | | ## æ¬é¡¹ç®æ¯æçå¹³å°/ç»ä»¶å表 ð |
| | | ### LLM è¯è¨æ¨¡å |
| | | |
| | | | ä½¿ç¨æ¹å¼ | æ¯æå¹³å° | å
è´¹å¹³å° | |
| | | |:---:|:---:|:---:| |
| | | | openai æ¥å£è°ç¨ | é¿éç¾ç¼ãç«å±±å¼æãDeepSeekãæºè°±ãGeminiãç§å¤§è®¯é£ | æºè°±ãGemini | |
| | | | ollama æ¥å£è°ç¨ | Ollama | - | |
| | | | dify æ¥å£è°ç¨ | Dify | - | |
| | | | fastgpt æ¥å£è°ç¨ | Fastgpt | - | |
| | | | coze æ¥å£è°ç¨ | Coze | - | |
| | | | xinference æ¥å£è°ç¨ | Xinference | - | |
| | | | homeassistant æ¥å£è°ç¨ | HomeAssistant | - | |
| | | |
| | | å®é
ä¸ï¼ä»»ä½æ¯æ openai æ¥å£è°ç¨ç LLM å坿¥å
¥ä½¿ç¨ã |
| | | |
| | | --- |
| | | |
| | | ### VLLM è§è§æ¨¡å |
| | | |
| | | | ä½¿ç¨æ¹å¼ | æ¯æå¹³å° | å
è´¹å¹³å° | |
| | | |:---:|:---:|:---:| |
| | | | openai æ¥å£è°ç¨ | é¿éç¾ç¼ãæºè°±ChatGLMVLLM | æºè°±ChatGLMVLLM | |
| | | |
| | | å®é
ä¸ï¼ä»»ä½æ¯æ openai æ¥å£è°ç¨ç VLLM å坿¥å
¥ä½¿ç¨ã |
| | | |
| | | --- |
| | | |
| | | ### TTS è¯é³åæ |
| | | |
| | | | ä½¿ç¨æ¹å¼ | æ¯æå¹³å° | å
è´¹å¹³å° | |
| | | |:---:|:---:|:---:| |
| | | | æ¥å£è°ç¨ | EdgeTTSãç§å¤§è®¯é£ãç«å±±å¼æãè
¾è®¯äºãé¿éäºåç¾ç¼ãCosyVoiceSiliconflowãTTS302AIãCozeCnTTSãGizwitsTTSãACGNTTSãOpenAITTSãçµçæµå¼TTSãMinimaxTTS | çµçæµå¼TTSãEdgeTTSãCosyVoiceSiliconflow(é¨å) | |
| | | | æ¬å°æå¡ | FishSpeechãGPT_SOVITS_V2ãGPT_SOVITS_V3ãIndex-TTSãPaddleSpeech | Index-TTSãPaddleSpeechãFishSpeechãGPT_SOVITS_V2ãGPT_SOVITS_V3 | |
| | | |
| | | --- |
| | | |
| | | ### VAD è¯é³æ´»å¨æ£æµ |
| | | |
| | | | ç±»å | å¹³å°åç§° | ä½¿ç¨æ¹å¼ | æ¶è´¹æ¨¡å¼ | 夿³¨ | |
| | | |:---:|:---------:|:----:|:----:|:--:| |
| | | | VAD | SileroVAD | æ¬å°ä½¿ç¨ | å
è´¹ | | |
| | | |
| | | --- |
| | | |
| | | ### ASR è¯é³è¯å« |
| | | |
| | | | ä½¿ç¨æ¹å¼ | æ¯æå¹³å° | å
è´¹å¹³å° | |
| | | |:---:|:---:|:---:| |
| | | | æ¬å°ä½¿ç¨ | FunASRãSherpaASR | FunASRãSherpaASR | |
| | | | æ¥å£è°ç¨ | FunASRServerãç«å±±å¼æãç§å¤§è®¯é£ãè
¾è®¯äºãé¿éäºãç¾åº¦äºãOpenAI ASR | FunASRServer | |
| | | |
| | | --- |
| | | |
| | | ### Voiceprint 声纹è¯å« |
| | | |
| | | | ä½¿ç¨æ¹å¼ | æ¯æå¹³å° | å
è´¹å¹³å° | |
| | | |:---:|:---:|:---:| |
| | | | æ¬å°ä½¿ç¨ | 3D-Speaker | 3D-Speaker | |
| | | |
| | | --- |
| | | |
| | | ### Memory è®°å¿åå¨ |
| | | |
| | | | ç±»å | å¹³å°åç§° | ä½¿ç¨æ¹å¼ | æ¶è´¹æ¨¡å¼ | 夿³¨ | |
| | | |:------:|:---------------:|:----:|:---------:|:--:| |
| | | | Memory | mem0ai | æ¥å£è°ç¨ | 1000次/æé¢åº¦ | | |
| | | | Memory | [powermem](./docs/powermem-integration.md) | æ¬å°æ»ç» | åå³äºLLMåDB | OceanBase弿ºï¼æ¯ææºè½æ£ç´¢ | |
| | | | Memory | mem_local_short | æ¬å°æ»ç» | å
è´¹ | | |
| | | | Memory | nomem | æ è®°å¿æ¨¡å¼ | å
è´¹ | | |
| | | |
| | | --- |
| | | |
| | | ### Intent æå¾è¯å« |
| | | |
| | | | ç±»å | å¹³å°åç§° | ä½¿ç¨æ¹å¼ | æ¶è´¹æ¨¡å¼ | 夿³¨ | |
| | | |:------:|:-------------:|:----:|:-------:|:---------------------:| |
| | | | Intent | intent_llm | æ¥å£è°ç¨ | æ ¹æ®LLMæ¶è´¹ | éè¿å¤§æ¨¡åè¯å«æå¾ï¼éç¨æ§å¼º | |
| | | | Intent | function_call | æ¥å£è°ç¨ | æ ¹æ®LLMæ¶è´¹ | éè¿å¤§æ¨¡å彿°è°ç¨å®ææå¾ï¼éåº¦å¿«ï¼ææå¥½ | |
| | | | Intent | nointent | æ æå¾æ¨¡å¼ | å
è´¹ | ä¸è¿è¡æå¾è¯å«ï¼ç´æ¥è¿å对è¯ç»æ | |
| | | |
| | | --- |
| | | |
| | | ### Rag æ£ç´¢å¢å¼ºçæ |
| | | |
| | | | ç±»å | å¹³å°åç§° | ä½¿ç¨æ¹å¼ | æ¶è´¹æ¨¡å¼ | 夿³¨ | |
| | | |:------:|:-------------:|:----:|:-------:|:---------------------:| |
| | | | Rag | ragflow | æ¥å£è°ç¨ | æ ¹æ®åçãåè¯æ¶èçtokenæ¶è´¹ | åå©RagFlowçæ£ç´¢å¢å¼ºçæåè½ï¼æä¾æ´åç¡®ç对è¯åå¤ | |
| | | |
| | | --- |
| | | |
| | | ## 鸣谢 ð |
| | | |
| | | | Logo | 项ç®/å
¬å¸ | 说æ | |
| | | |:---:|:---:|:---| |
| | | | <img src="./docs/images/logo_bailing.png" width="160"> | [ç¾èè¯é³å¯¹è¯æºå¨äºº](https://github.com/wwbin2017/bailing) | æ¬é¡¹ç®å[ç¾èè¯é³å¯¹è¯æºå¨äºº](https://github.com/wwbin2017/bailing)å¯åï¼å¹¶å¨å
¶åºç¡ä¸å®ç° | |
| | | | <img src="./docs/images/logo_tenclass.png" width="160"> | [åæ¹èæµ·](https://www.tenclass.com/) | æè°¢[åæ¹èæµ·](https://www.tenclass.com/)ä¸ºå°æºçæå¶å®äºæ åçé讯åè®®ãå¤è®¾å¤å
¼å®¹æ§æ¹æ¡åé«å¹¶ååºæ¯å®è·µç¤ºèï¼ä¸ºæ¬é¡¹ç®æä¾äºå
¨é¾è·¯ææ¯ææ¡£æ¯æ | |
| | | | <img src="./docs/images/logo_xuanfeng.png" width="160"> | [çå¤ç§æ](https://github.com/Eric0308) | æè°¢[çå¤ç§æ](https://github.com/Eric0308)è´¡ç®å½æ°è°ç¨æ¡æ¶ãMCPéä¿¡åè®®åæä»¶åè°ç¨æºå¶çå®ç°ä»£ç ï¼éè¿æ ååçæä»¤è°åº¦ä½ç³»ä¸å¨ææ©å±è½åï¼æ¾èæåäºå端设å¤(IoT)çäº¤äºæçååè½å»¶å±æ§ | |
| | | | <img src="./docs/images/logo_junsen.png" width="160"> | [huangjunsen](https://github.com/huangjunsen0406) | æè°¢[huangjunsen](https://github.com/huangjunsen0406) è´¡ç®`æºæ§å°ç§»å¨ç«¯`模åï¼å®ç°äºè·¨å¹³å°ç§»å¨è®¾å¤ç髿æ§å¶ä¸å®æ¶äº¤äºï¼å¤§å¹
æåäºç³»ç»å¨ç§»å¨åºæ¯ä¸çæä½ä¾¿æ·æ§å管çæç | |
| | | | <img src="./docs/images/logo_huiyuan.png" width="160"> | [æ±è¿è®¾è®¡](http://ui.kwd988.net/) | æè°¢[æ±è¿è®¾è®¡](http://ui.kwd988.net/)为æ¬é¡¹ç®æä¾ä¸ä¸è§è§è§£å³æ¹æ¡ï¼ç¨å
¶æå¡è¶
åå®¶ä¼ä¸çè®¾è®¡å®æç»éªï¼èµè½æ¬é¡¹ç®äº§åç¨æ·ä½éª | |
| | | | <img src="./docs/images/logo_qinren.png" width="160"> | [西å®å¤äººä¿¡æ¯ç§æ](https://www.029app.com/) | æè°¢[西å®å¤äººä¿¡æ¯ç§æ](https://www.029app.com/)æ·±åæ¬é¡¹ç®è§è§ä½ç³»ï¼ç¡®ä¿æ´ä½è®¾è®¡é£æ ¼å¨å¤åºæ¯åºç¨ä¸çä¸è´æ§åæ©å±æ§ | |
| | | | <img src="./docs/images/logo_contributors.png" width="160"> | [代ç è´¡ç®è
](https://github.com/xinnan-tech/xiaozhi-esp32-server/graphs/contributors) | æè°¢[ææä»£ç è´¡ç®è
](https://github.com/xinnan-tech/xiaozhi-esp32-server/graphs/contributors)è´¡ç®è
ï¼ä½ 们çä»åºè®©é¡¹ç®æ´å å¥å£®å强大ã | |
| | | |
| | | |
| | | <a href="https://www.star-history.com/?repos=xinnan-tech%2Fxiaozhi-esp32-server&type=date&legend=top-left"> |
| | | <picture> |
| | | <source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/chart?repos=xinnan-tech/xiaozhi-esp32-server&type=date&theme=dark&legend=top-left&sealed_token=cQovHKgZjqEnQ-svfYfN392irNvGuq-6pyv4cA8nd2jQEhQLz1ETV4YHTVk2UZyLMFbCQuZA7jduRh3YbeK5WPYaRLrfmIimGQa3lram652jJL9oQk-UuSZA5H6L4dPIhZc8KCc-Ur_UAUNbly7TePpnTR2otGknBLCOjOliD4fk1st6z7tPEDVjSRx5" /> |
| | | <source media="(prefers-color-scheme: light)" srcset="https://api.star-history.com/chart?repos=xinnan-tech/xiaozhi-esp32-server&type=date&legend=top-left&sealed_token=cQovHKgZjqEnQ-svfYfN392irNvGuq-6pyv4cA8nd2jQEhQLz1ETV4YHTVk2UZyLMFbCQuZA7jduRh3YbeK5WPYaRLrfmIimGQa3lram652jJL9oQk-UuSZA5H6L4dPIhZc8KCc-Ur_UAUNbly7TePpnTR2otGknBLCOjOliD4fk1st6z7tPEDVjSRx5" /> |
| | | <img alt="Star History Chart" src="https://api.star-history.com/chart?repos=xinnan-tech/xiaozhi-esp32-server&type=date&legend=top-left&sealed_token=cQovHKgZjqEnQ-svfYfN392irNvGuq-6pyv4cA8nd2jQEhQLz1ETV4YHTVk2UZyLMFbCQuZA7jduRh3YbeK5WPYaRLrfmIimGQa3lram652jJL9oQk-UuSZA5H6L4dPIhZc8KCc-Ur_UAUNbly7TePpnTR2otGknBLCOjOliD4fk1st6z7tPEDVjSRx5" /> |
| | | </picture> |
| | | </a> |
| New file |
| | |
| | | #!/bin/sh |
| | | # èæ¬ä½è
@VanillaNahida |
| | | # æ¬æä»¶æ¯ç¨äºä¸é®èªå¨ä¸è½½æ¬é¡¹ç®æéæä»¶ï¼èªå¨å建好ç®å½ |
| | | # æä¸åªæ¯æX86çæ¬çUbuntuç³»ç»ï¼å
¶ä»ç³»ç»æªæµè¯ |
| | | |
| | | # å®ä¹ä¸æå¤ç彿° |
| | | handle_interrupt() { |
| | | echo "" |
| | | echo "å®è£
å·²è¢«ç¨æ·ä¸æ(Ctrl+CæEsc)" |
| | | echo "å¦ééæ°å®è£
ï¼è¯·å次è¿è¡èæ¬" |
| | | exit 1 |
| | | } |
| | | |
| | | # è®¾ç½®ä¿¡å·æè·ï¼å¤çCtrl+C |
| | | trap handle_interrupt SIGINT |
| | | |
| | | # å¤çEscé® |
| | | # ä¿åç»ç«¯è®¾ç½® |
| | | old_stty_settings=$(stty -g) |
| | | # 设置ç»ç«¯ç«å³ååºï¼ä¸åæ¾ |
| | | stty -icanon -echo min 1 time 0 |
| | | |
| | | # åå°è¿ç¨æ£æµEscé® |
| | | (while true; do |
| | | read -r key |
| | | if [[ $key == $'\e' ]]; then |
| | | # æ£æµå°Escé®ï¼è§¦å䏿å¤ç |
| | | kill -SIGINT $$ |
| | | break |
| | | fi |
| | | done) & |
| | | |
| | | # èæ¬ç»ææ¶æ¢å¤ç»ç«¯è®¾ç½® |
| | | trap 'stty "$old_stty_settings"' EXIT |
| | | |
| | | |
| | | # æå°å½©è²åç¬¦ç» |
| | | echo -e "\e[1;32m" # 设置é¢è²ä¸ºäº®ç»¿è² |
| | | cat << "EOF" |
| | | èæ¬ä½è
ï¼@Bilibili é¦èå³ççº³è¥¿å¦²åµ |
| | | __ __ _ _ _ _ _ _ _ _ |
| | | \ \ / / (_)| || | | \ | | | | (_) | | |
| | | \ \ / /__ _ _ __ _ | || | __ _ | \| | __ _ | |__ _ __| | __ _ |
| | | \ \/ // _` || '_ \ | || || | / _` | | . ` | / _` || '_ \ | | / _` | / _` | |
| | | \ /| (_| || | | || || || || (_| | | |\ || (_| || | | || || (_| || (_| | |
| | | \/ \__,_||_| |_||_||_||_| \__,_| |_| \_| \__,_||_| |_||_| \__,_| \__,_| |
| | | EOF |
| | | echo -e "\e[0m" # éç½®é¢è² |
| | | echo -e "\e[1;36m å°æºæå¡ç«¯å
¨éé¨ç½²ä¸é®å®è£
èæ¬ Ver 0.2 2025å¹´8æ20æ¥æ´æ° \e[0m\n" |
| | | sleep 1 |
| | | |
| | | |
| | | |
| | | # æ£æ¥å¹¶å®è£
whiptail |
| | | check_whiptail() { |
| | | if ! command -v whiptail &> /dev/null; then |
| | | echo "æ£å¨å®è£
whiptail..." |
| | | apt update |
| | | apt install -y whiptail |
| | | fi |
| | | } |
| | | |
| | | check_whiptail |
| | | |
| | | # åå»ºç¡®è®¤å¯¹è¯æ¡ |
| | | whiptail --title "å®è£
确认" --yesno "å³å°å®è£
å°æºæå¡ç«¯ï¼æ¯å¦ç»§ç»ï¼" \ |
| | | --yes-button "ç»§ç»" --no-button "éåº" 10 50 |
| | | |
| | | # æ ¹æ®ç¨æ·éæ©æ§è¡æä½ |
| | | case $? in |
| | | 0) |
| | | ;; |
| | | 1) |
| | | exit 1 |
| | | ;; |
| | | esac |
| | | |
| | | # æ£æ¥rootæé |
| | | if [ $EUID -ne 0 ]; then |
| | | whiptail --title "æéé误" --msgbox "请使ç¨rootæéè¿è¡æ¬èæ¬" 10 50 |
| | | exit 1 |
| | | fi |
| | | |
| | | # æ£æ¥ç³»ç»çæ¬ |
| | | if [ -f /etc/os-release ]; then |
| | | . /etc/os-release |
| | | if [ "$ID" != "debian" ] && [ "$ID" != "ubuntu" ]; then |
| | | whiptail --title "ç³»ç»é误" --msgbox "è¯¥èæ¬åªæ¯æDebian/Ubuntuç³»ç»æ§è¡" 10 60 |
| | | exit 1 |
| | | fi |
| | | else |
| | | whiptail --title "ç³»ç»é误" --msgbox "æ æ³ç¡®å®ç³»ç»çæ¬ï¼è¯¥èæ¬åªæ¯æDebian/Ubuntuç³»ç»æ§è¡" 10 60 |
| | | exit 1 |
| | | fi |
| | | |
| | | # ä¸è½½é
ç½®æä»¶å½æ° |
| | | check_and_download() { |
| | | local filepath=$1 |
| | | local url=$2 |
| | | if [ ! -f "$filepath" ]; then |
| | | if ! curl -fL --progress-bar "$url" -o "$filepath"; then |
| | | whiptail --title "é误" --msgbox "${filepath}æä»¶ä¸è½½å¤±è´¥" 10 50 |
| | | exit 1 |
| | | fi |
| | | else |
| | | echo "${filepath}æä»¶å·²åå¨ï¼è·³è¿ä¸è½½" |
| | | fi |
| | | } |
| | | |
| | | # æ£æ¥æ¯å¦å·²å®è£
|
| | | check_installed() { |
| | | # æ£æ¥ç®å½æ¯å¦åå¨ä¸é空 |
| | | if [ -d "/opt/xiaozhi-server/" ] && [ "$(ls -A /opt/xiaozhi-server/)" ]; then |
| | | DIR_CHECK=1 |
| | | else |
| | | DIR_CHECK=0 |
| | | fi |
| | | |
| | | # æ£æ¥å®¹å¨æ¯å¦åå¨ |
| | | if docker inspect xiaozhi-esp32-server > /dev/null 2>&1; then |
| | | CONTAINER_CHECK=1 |
| | | else |
| | | CONTAINER_CHECK=0 |
| | | fi |
| | | |
| | | # ä¸¤æ¬¡æ£æ¥é½éè¿ |
| | | if [ $DIR_CHECK -eq 1 ] && [ $CONTAINER_CHECK -eq 1 ]; then |
| | | return 0 # å·²å®è£
|
| | | else |
| | | return 1 # æªå®è£
|
| | | fi |
| | | } |
| | | |
| | | # æ´æ°ç¸å
³ |
| | | if check_installed; then |
| | | if whiptail --title "å·²å®è£
æ£æµ" --yesno "æ£æµå°å°æºæå¡ç«¯å·²å®è£
ï¼æ¯å¦è¿è¡å级ï¼" 10 60; then |
| | | # ç¨æ·éæ©åçº§ï¼æ§è¡æ¸
çæä½ |
| | | echo "å¼å§å级æä½..." |
| | | |
| | | # åæ¢å¹¶ç§»é¤æædocker-composeæå¡ |
| | | docker compose -f /opt/xiaozhi-server/docker-compose_all.yml down |
| | | |
| | | # 忢并å é¤ç¹å®å®¹å¨ï¼èè容å¨å¯è½ä¸åå¨çæ
åµï¼ |
| | | containers=( |
| | | "xiaozhi-esp32-server" |
| | | "xiaozhi-esp32-server-web" |
| | | "xiaozhi-esp32-server-db" |
| | | "xiaozhi-esp32-server-redis" |
| | | ) |
| | | |
| | | for container in "${containers[@]}"; do |
| | | if docker ps -a --format '{{.Names}}' | grep -q "^${container}$"; then |
| | | docker stop "$container" >/dev/null 2>&1 && \ |
| | | docker rm "$container" >/dev/null 2>&1 && \ |
| | | echo "æåç§»é¤å®¹å¨: $container" |
| | | else |
| | | echo "容å¨ä¸åå¨ï¼è·³è¿: $container" |
| | | fi |
| | | done |
| | | |
| | | # å é¤ç¹å®éåï¼èèéåå¯è½ä¸åå¨çæ
åµï¼ |
| | | images=( |
| | | "ghcr.nju.edu.cn/xinnan-tech/xiaozhi-esp32-server:server_latest" |
| | | "ghcr.nju.edu.cn/xinnan-tech/xiaozhi-esp32-server:web_latest" |
| | | ) |
| | | |
| | | for image in "${images[@]}"; do |
| | | if docker images --format '{{.Repository}}:{{.Tag}}' | grep -q "^${image}$"; then |
| | | docker rmi "$image" >/dev/null 2>&1 && \ |
| | | echo "æåå é¤éå: $image" |
| | | else |
| | | echo "éåä¸åå¨ï¼è·³è¿: $image" |
| | | fi |
| | | done |
| | | |
| | | echo "æææ¸
çæä½å®æ" |
| | | |
| | | # å¤ä»½åæé
ç½®æä»¶ |
| | | mkdir -p /opt/xiaozhi-server/backup/ |
| | | if [ -f /opt/xiaozhi-server/data/.config.yaml ]; then |
| | | cp /opt/xiaozhi-server/data/.config.yaml /opt/xiaozhi-server/backup/.config.yaml |
| | | echo "å·²å¤ä»½åæé
ç½®æä»¶å° /opt/xiaozhi-server/backup/.config.yaml" |
| | | fi |
| | | |
| | | # ä¸è½½ææ°çé
ç½®æä»¶ |
| | | check_and_download "/opt/xiaozhi-server/docker-compose_all.yml" "https://ghfast.top/https://raw.githubusercontent.com/xinnan-tech/xiaozhi-esp32-server/refs/heads/main/main/xiaozhi-server/docker-compose_all.yml" |
| | | check_and_download "/opt/xiaozhi-server/data/.config.yaml" "https://ghfast.top/https://raw.githubusercontent.com/xinnan-tech/xiaozhi-esp32-server/refs/heads/main/main/xiaozhi-server/config_from_api.yaml" |
| | | |
| | | # å¯å¨Dockeræå¡ |
| | | echo "å¼å§å¯å¨ææ°çæ¬æå¡..." |
| | | # åçº§å®æåæ è®°ï¼è·³è¿åç»ä¸è½½æ¥éª¤ |
| | | UPGRADE_COMPLETED=1 |
| | | docker compose -f /opt/xiaozhi-server/docker-compose_all.yml up -d |
| | | else |
| | | whiptail --title "è·³è¿å级" --msgbox "已忶å级ï¼å°ç»§ç»ä½¿ç¨å½åçæ¬ã" 10 50 |
| | | # è·³è¿å级ï¼ç»§ç»æ§è¡åç»å®è£
æµç¨ |
| | | fi |
| | | fi |
| | | |
| | | |
| | | # æ£æ¥curlå®è£
|
| | | if ! command -v curl &> /dev/null; then |
| | | echo "------------------------------------------------------------" |
| | | echo "æªæ£æµå°curlï¼æ£å¨å®è£
..." |
| | | apt update |
| | | apt install -y curl |
| | | else |
| | | echo "------------------------------------------------------------" |
| | | echo "curlå·²å®è£
ï¼è·³è¿å®è£
æ¥éª¤" |
| | | fi |
| | | |
| | | # æ£æ¥Dockerå®è£
|
| | | if ! command -v docker &> /dev/null; then |
| | | echo "------------------------------------------------------------" |
| | | echo "æªæ£æµå°Dockerï¼æ£å¨å®è£
..." |
| | | |
| | | # 使ç¨å½å
éåæºæ¿ä»£å®æ¹æº |
| | | DISTRO=$(lsb_release -cs) |
| | | MIRROR_URL="https://mirrors.aliyun.com/docker-ce/linux/ubuntu" |
| | | GPG_URL="https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg" |
| | | |
| | | # å®è£
åºç¡ä¾èµ |
| | | apt update |
| | | apt install -y apt-transport-https ca-certificates curl software-properties-common gnupg |
| | | |
| | | # å建å¯é¥ç®å½å¹¶æ·»å å½å
éåæºå¯é¥ |
| | | mkdir -p /etc/apt/keyrings |
| | | curl -fsSL "$GPG_URL" | gpg --dearmor -o /etc/apt/keyrings/docker.gpg |
| | | |
| | | # æ·»å å½å
éåæº |
| | | echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] $MIRROR_URL $DISTRO stable" \ |
| | | > /etc/apt/sources.list.d/docker.list |
| | | |
| | | # æ·»å å¤ç¨å®æ¹æºå¯é¥ï¼é¿å
å½å
æºå¯é¥éªè¯å¤±è´¥ï¼ |
| | | apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 7EA0A9C3F273FCD8 2>/dev/null || \ |
| | | echo "è¦åï¼é¨åå¯é¥æ·»å 失败ï¼ç»§ç»å°è¯å®è£
..." |
| | | |
| | | # å®è£
Docker |
| | | apt update |
| | | apt install -y docker-ce docker-ce-cli containerd.io |
| | | |
| | | # å¯å¨æå¡ |
| | | systemctl start docker |
| | | systemctl enable docker |
| | | |
| | | # æ£æ¥æ¯å¦å®è£
æå |
| | | if docker --version; then |
| | | echo "------------------------------------------------------------" |
| | | echo "Dockerå®è£
宿ï¼" |
| | | else |
| | | whiptail --title "é误" --msgbox "Dockerå®è£
失败ï¼è¯·æ£æ¥æ¥å¿ã" 10 50 |
| | | exit 1 |
| | | fi |
| | | else |
| | | echo "Dockerå·²å®è£
ï¼è·³è¿å®è£
æ¥éª¤" |
| | | fi |
| | | |
| | | # Dockeréåæºé
ç½® |
| | | MIRROR_OPTIONS=( |
| | | "1" "轩è¾éå (æ¨è)" |
| | | "2" "è
¾è®¯äºéåæº" |
| | | "3" "ä¸ç§å¤§éåæº" |
| | | "4" "ç½æ163éåæº" |
| | | "5" "å为äºéåæº" |
| | | "6" "é¿éäºéåæº" |
| | | "7" "èªå®ä¹éåæº" |
| | | "8" "è·³è¿é
ç½®" |
| | | ) |
| | | |
| | | MIRROR_CHOICE=$(whiptail --title "éæ©Dockeréåæº" --menu "è¯·éæ©è¦ä½¿ç¨çDockeréåæº" 20 60 10 \ |
| | | "${MIRROR_OPTIONS[@]}" 3>&1 1>&2 2>&3) || { |
| | | echo "ç¨æ·åæ¶éæ©ï¼éåºèæ¬" |
| | | exit 1 |
| | | } |
| | | |
| | | case $MIRROR_CHOICE in |
| | | 1) MIRROR_URL="https://docker.xuanyuan.me" ;; |
| | | 2) MIRROR_URL="https://mirror.ccs.tencentyun.com" ;; |
| | | 3) MIRROR_URL="https://docker.mirrors.ustc.edu.cn" ;; |
| | | 4) MIRROR_URL="https://hub-mirror.c.163.com" ;; |
| | | 5) MIRROR_URL="https://05f073ad3c0010ea0f4bc00b7105ec20.mirror.swr.myhuaweicloud.com" ;; |
| | | 6) MIRROR_URL="https://registry.aliyuncs.com" ;; |
| | | 7) MIRROR_URL=$(whiptail --title "èªå®ä¹éåæº" --inputbox "请è¾å
¥å®æ´çéåæºURL:" 10 60 3>&1 1>&2 2>&3) ;; |
| | | 8) MIRROR_URL="" ;; |
| | | esac |
| | | |
| | | if [ -n "$MIRROR_URL" ]; then |
| | | mkdir -p /etc/docker |
| | | if [ -f /etc/docker/daemon.json ]; then |
| | | cp /etc/docker/daemon.json /etc/docker/daemon.json.bak |
| | | fi |
| | | cat > /etc/docker/daemon.json <<EOF |
| | | { |
| | | "dns": ["8.8.8.8", "114.114.114.114"], |
| | | "registry-mirrors": ["$MIRROR_URL"] |
| | | } |
| | | EOF |
| | | whiptail --title "é
ç½®æå" --msgbox "å·²æåæ·»å éåæº: $MIRROR_URL\n请æEnteré®éå¯Dockeræå¡å¹¶ç»§ç»..." 12 60 |
| | | echo "------------------------------------------------------------" |
| | | echo "å¼å§éå¯Dockeræå¡..." |
| | | systemctl restart docker.service |
| | | fi |
| | | |
| | | # å建å®è£
ç®å½ |
| | | echo "------------------------------------------------------------" |
| | | echo "å¼å§å建å®è£
ç®å½..." |
| | | # æ£æ¥å¹¶åå»ºæ°æ®ç®å½ |
| | | if [ ! -d /opt/xiaozhi-server/data ]; then |
| | | mkdir -p /opt/xiaozhi-server/data |
| | | echo "å·²åå»ºæ°æ®ç®å½: /opt/xiaozhi-server/data" |
| | | else |
| | | echo "ç®å½xiaozhi-server/dataå·²åå¨ï¼è·³è¿å建" |
| | | fi |
| | | |
| | | # æ£æ¥å¹¶å建模åç®å½ |
| | | if [ ! -d /opt/xiaozhi-server/models/SenseVoiceSmall ]; then |
| | | mkdir -p /opt/xiaozhi-server/models/SenseVoiceSmall |
| | | echo "å·²å建模åç®å½: /opt/xiaozhi-server/models/SenseVoiceSmall" |
| | | else |
| | | echo "ç®å½xiaozhi-server/models/SenseVoiceSmallå·²åå¨ï¼è·³è¿å建" |
| | | fi |
| | | |
| | | echo "------------------------------------------------------------" |
| | | echo "å¼å§ä¸è½½è¯é³è¯å«æ¨¡å" |
| | | # ä¸è½½æ¨¡åæä»¶ |
| | | MODEL_PATH="/opt/xiaozhi-server/models/SenseVoiceSmall/model.pt" |
| | | if [ ! -f "$MODEL_PATH" ]; then |
| | | ( |
| | | for i in {1..20}; do |
| | | echo $((i*5)) |
| | | sleep 0.5 |
| | | done |
| | | ) | whiptail --title "ä¸è½½ä¸" --gauge "å¼å§ä¸è½½è¯é³è¯å«æ¨¡å..." 10 60 0 |
| | | curl -fL --progress-bar https://modelscope.cn/models/iic/SenseVoiceSmall/resolve/master/model.pt -o "$MODEL_PATH" || { |
| | | whiptail --title "é误" --msgbox "model.ptæä»¶ä¸è½½å¤±è´¥" 10 50 |
| | | exit 1 |
| | | } |
| | | else |
| | | echo "model.ptæä»¶å·²åå¨ï¼è·³è¿ä¸è½½" |
| | | fi |
| | | |
| | | # 妿䏿¯åçº§å®æï¼ææ§è¡ä¸è½½ |
| | | if [ -z "$UPGRADE_COMPLETED" ]; then |
| | | check_and_download "/opt/xiaozhi-server/docker-compose_all.yml" "https://ghfast.top/https://raw.githubusercontent.com/xinnan-tech/xiaozhi-esp32-server/refs/heads/main/main/xiaozhi-server/docker-compose_all.yml" |
| | | check_and_download "/opt/xiaozhi-server/data/.config.yaml" "https://ghfast.top/https://raw.githubusercontent.com/xinnan-tech/xiaozhi-esp32-server/refs/heads/main/main/xiaozhi-server/config_from_api.yaml" |
| | | fi |
| | | |
| | | # å¯å¨Dockeræå¡ |
| | | ( |
| | | echo "------------------------------------------------------------" |
| | | echo "æ£å¨æåDockeréå..." |
| | | echo "è¿å¯è½éè¦å åéæ¶é´ï¼è¯·èå¿çå¾
" |
| | | docker compose -f /opt/xiaozhi-server/docker-compose_all.yml up -d |
| | | |
| | | if [ $? -ne 0 ]; then |
| | | whiptail --title "é误" --msgbox "Dockeræå¡å¯å¨å¤±è´¥ï¼è¯·å°è¯æ´æ¢éåæºåéæ°æ§è¡æ¬èæ¬" 10 60 |
| | | exit 1 |
| | | fi |
| | | |
| | | echo "------------------------------------------------------------" |
| | | echo "æ£å¨æ£æ¥æå¡å¯å¨ç¶æ..." |
| | | TIMEOUT=300 |
| | | START_TIME=$(date +%s) |
| | | while true; do |
| | | CURRENT_TIME=$(date +%s) |
| | | if [ $((CURRENT_TIME - START_TIME)) -gt $TIMEOUT ]; then |
| | | whiptail --title "é误" --msgbox "æå¡å¯å¨è¶
æ¶ï¼æªå¨æå®æ¶é´å
æ¾å°é¢ææ¥å¿å
容" 10 60 |
| | | exit 1 |
| | | fi |
| | | |
| | | if docker logs xiaozhi-esp32-server-web 2>&1 | grep -q "Started AdminApplication in"; then |
| | | break |
| | | fi |
| | | sleep 1 |
| | | done |
| | | |
| | | echo "æå¡ç«¯å¯å¨æåï¼æ£å¨å®æé
ç½®..." |
| | | echo "æ£å¨å¯å¨æå¡..." |
| | | docker compose -f /opt/xiaozhi-server/docker-compose_all.yml up -d |
| | | echo "æå¡å¯å¨å®æï¼" |
| | | ) |
| | | |
| | | # å¯é¥é
ç½® |
| | | |
| | | # è·åæå¡å¨å
¬ç½å°å |
| | | PUBLIC_IP=$(hostname -I | awk '{print $1}') |
| | | whiptail --title "é
ç½®æå¡å¨å¯é¥" --msgbox "è¯·ä½¿ç¨æµè§å¨ï¼è®¿é®ä¸æ¹é¾æ¥ï¼æå¼æºæ§å°å¹¶æ³¨åè´¦å·: \n\nå
ç½å°åï¼http://127.0.0.1:8002/\nå
¬ç½å°åï¼http://$PUBLIC_IP:8002/ (è¥æ¯äºæå¡å¨è¯·å¨æå¡å¨å®å
¨ç»æ¾è¡ç«¯å£ 8000 8001 8002)ã\n\n注åç第ä¸ä¸ªç¨æ·å³æ¯è¶
级管çåï¼ä»¥å注åçç¨æ·é½æ¯æ®éç¨æ·ãæ®éç¨æ·åªè½ç»å®è®¾å¤åé
ç½®æºè½ä½; è¶
级管çåå¯ä»¥è¿è¡æ¨¡å管çãç¨æ·ç®¡çãåæ°é
ç½®çåè½ã\n\n注å好å请æEnteré®ç»§ç»" 18 70 |
| | | SECRET_KEY=$(whiptail --title "é
ç½®æå¡å¨å¯é¥" --inputbox "请使ç¨è¶
级管çåè´¦å·ç»å½æºæ§å°\nå
ç½å°åï¼http://127.0.0.1:8002/\nå
¬ç½å°åï¼http://$PUBLIC_IP:8002/\nå¨é¡¶é¨èå åæ°åå
¸ â åæ°ç®¡ç æ¾å°åæ°ç¼ç : server.secret (æå¡å¨å¯é¥) \nå¤å¶è¯¥åæ°å¼å¹¶è¾å
¥å°ä¸é¢è¾å
¥æ¡\n\n请è¾å
¥å¯é¥(ç空åè·³è¿é
ç½®):" 15 60 3>&1 1>&2 2>&3) |
| | | |
| | | if [ -n "$SECRET_KEY" ]; then |
| | | python3 -c " |
| | | import sys, yaml; |
| | | config_path = '/opt/xiaozhi-server/data/.config.yaml'; |
| | | with open(config_path, 'r') as f: |
| | | config = yaml.safe_load(f) or {}; |
| | | config['manager-api'] = {'url': 'http://xiaozhi-esp32-server-web:8002/xiaozhi', 'secret': '$SECRET_KEY'}; |
| | | with open(config_path, 'w') as f: |
| | | yaml.dump(config, f); |
| | | " |
| | | docker restart xiaozhi-esp32-server |
| | | fi |
| | | |
| | | # è·åå¹¶æ¾ç¤ºå°åä¿¡æ¯ |
| | | LOCAL_IP=$(hostname -I | awk '{print $1}') |
| | | |
| | | # ä¿®å¤æ¥å¿æä»¶è·åä¸å°wsçé®é¢ï¼æ¹ä¸ºç¡¬ç¼ç |
| | | whiptail --title "å®è£
宿ï¼" --msgbox "\ |
| | | æå¡ç«¯ç¸å
³å°åå¦ä¸ï¼\n\ |
| | | 管çåå°è®¿é®å°å: http://$LOCAL_IP:8002\n\ |
| | | OTA å°å: http://$LOCAL_IP:8002/xiaozhi/ota/\n\ |
| | | è§è§åææ¥å£å°å: http://$LOCAL_IP:8003/mcp/vision/explain\n\ |
| | | WebSocket å°å: ws://$LOCAL_IP:8000/xiaozhi/v1/\n\ |
| | | \nå®è£
宿¯ï¼æè°¢æ¨ç使ç¨ï¼\næEnteré®éåº..." 16 70 |
| New file |
| | |
| | | # é¨ç½²æ¶æå¾ |
| | |  |
| | | # æ¹å¼ä¸ï¼Dockeråªè¿è¡Server |
| | | |
| | | `0.8.2`çæ¬å¼å§ï¼æ¬é¡¹ç®åè¡çdockeréååªæ¯æ`x86æ¶æ`ï¼å¦æéè¦å¨`arm64æ¶æ`çCPUä¸é¨ç½²ï¼å¯æç
§[è¿ä¸ªæç¨](docker-build.md)卿¬æºç¼è¯`arm64çéå`ã |
| | | |
| | | ## 1. å®è£
docker |
| | | |
| | | 妿æ¨ççµèè¿æ²¡å®è£
dockerï¼å¯ä»¥æç
§è¿éçæç¨å®è£
ï¼[dockerå®è£
](https://www.runoob.com/docker/ubuntu-docker-install.html) |
| | | |
| | | å®è£
好dockeråï¼è¿ç»§ç»ã |
| | | |
| | | ### 1.1 æå¨é¨ç½² |
| | | |
| | | #### 1.1.1 å建ç®å½ |
| | | |
| | | å®è£
å®dockeråï¼ä½ éè¦ä¸ºè¿ä¸ªé¡¹ç®æ¾ä¸ä¸ªå®æ¾é
ç½®æä»¶çç®å½ï¼ä¾å¦æä»¬å¯ä»¥æ°å»ºä¸ä¸ªæä»¶å¤¹å«`xiaozhi-server`ã |
| | | |
| | | å建好ç®å½åï¼ä½ éè¦å¨`xiaozhi-server`ä¸é¢å建`data`æä»¶å¤¹å`models`æä»¶å¤¹ï¼`models`ä¸é¢è¿è¦åå建`SenseVoiceSmall`æä»¶å¤¹ã |
| | | |
| | | æç»ç®å½ç»æå¦ä¸æç¤ºï¼ |
| | | |
| | | ``` |
| | | xiaozhi-server |
| | | ââ data |
| | | ââ models |
| | | ââ SenseVoiceSmall |
| | | ``` |
| | | |
| | | #### 1.1.2 ä¸è½½è¯é³è¯å«æ¨¡åæä»¶ |
| | | |
| | | ä½ éè¦ä¸è½½è¯é³è¯å«ç模åæä»¶ï¼å 为æ¬é¡¹ç®çé»è®¤è¯é³è¯å«ç¨çæ¯æ¬å°ç¦»çº¿è¯é³è¯å«æ¹æ¡ãå¯éè¿è¿ä¸ªæ¹å¼ä¸è½½ |
| | | [跳转å°ä¸è½½è¯é³è¯å«æ¨¡åæä»¶](#模åæä»¶) |
| | | |
| | | ä¸è½½å®åï¼åå°æ¬æç¨ã |
| | | |
| | | #### 1.1.3 ä¸è½½é
ç½®æä»¶ |
| | | |
| | | ä½ éè¦ä¸è½½ä¸¤ä¸ªé
ç½®æä»¶ï¼`docker-compose.yaml` å `config.yaml`ãéè¦ä»é¡¹ç®ä»åºä¸è½½è¿ä¸¤ä¸ªæä»¶ã |
| | | |
| | | ##### 1.1.3.1 ä¸è½½ docker-compose.yaml |
| | | |
| | | ç¨æµè§å¨æå¼[è¿ä¸ªé¾æ¥](../main/xiaozhi-server/docker-compose.yml)ã |
| | | |
| | | å¨é¡µé¢çå³ä¾§æ¾å°å称为`RAW`æé®ï¼å¨`RAW`æé®çæè¾¹ï¼æ¾å°ä¸è½½ç徿 ï¼ç¹å»ä¸è½½æé®ï¼ä¸è½½`docker-compose.yml`æä»¶ã ææä»¶ä¸è½½å°ä½ ç |
| | | `xiaozhi-server`ä¸ã |
| | | |
| | | ä¸è½½å®åï¼åå°æ¬æç¨ç»§ç»å¾ä¸ã |
| | | |
| | | ##### 1.1.3.2 å建 config.yaml |
| | | |
| | | ç¨æµè§å¨æå¼[è¿ä¸ªé¾æ¥](../main/xiaozhi-server/config.yaml)ã |
| | | |
| | | å¨é¡µé¢çå³ä¾§æ¾å°å称为`RAW`æé®ï¼å¨`RAW`æé®çæè¾¹ï¼æ¾å°ä¸è½½ç徿 ï¼ç¹å»ä¸è½½æé®ï¼ä¸è½½`config.yaml`æä»¶ã ææä»¶ä¸è½½å°ä½ ç |
| | | `xiaozhi-server`ä¸é¢ç`data`æä»¶å¤¹ä¸ï¼ç¶åæ`config.yaml`æä»¶éå½å为`.config.yaml`ã |
| | | |
| | | ä¸è½½å®é
ç½®æä»¶åï¼æä»¬ç¡®è®¤ä¸ä¸æ´ä¸ª`xiaozhi-server`éé¢çæä»¶å¦ä¸æç¤ºï¼ |
| | | |
| | | ``` |
| | | xiaozhi-server |
| | | ââ docker-compose.yml |
| | | ââ data |
| | | ââ .config.yaml |
| | | ââ models |
| | | ââ SenseVoiceSmall |
| | | ââ model.pt |
| | | ``` |
| | | |
| | | å¦æä½ çæä»¶ç®å½ç»æä¹æ¯ä¸é¢çï¼å°±ç»§ç»å¾ä¸ã妿䏿¯ï¼ä½ å°±åä»ç»ççæ¯ä¸æ¯æ¼æä½äºä»ä¹ã |
| | | |
| | | ## 2. é
ç½®é¡¹ç®æä»¶ |
| | | |
| | | æ¥ä¸éï¼ç¨åºè¿ä¸è½ç´æ¥è¿è¡ï¼ä½ éè¦é
ç½®ä¸ä¸ï¼ä½ å°åºä½¿ç¨çæ¯ä»ä¹æ¨¡åãä½ å¯ä»¥çè¿ä¸ªæç¨ï¼ |
| | | [跳转å°é
ç½®é¡¹ç®æä»¶](#é
置项ç®) |
| | | |
| | | é
ç½®å®é¡¹ç®æä»¶åï¼åå°æ¬æç¨ç»§ç»å¾ä¸ã |
| | | |
| | | ## 3. æ§è¡dockerå½ä»¤ |
| | | |
| | | æå¼å½ä»¤è¡å·¥å
·ï¼ä½¿ç¨`ç»ç«¯`æ`å½ä»¤è¡`å·¥å
· è¿å
¥å°ä½ ç`xiaozhi-server`ï¼æ§è¡ä»¥ä¸å½ä»¤ |
| | | |
| | | ``` |
| | | docker compose up -d |
| | | ``` |
| | | |
| | | æ§è¡å®åï¼åæ§è¡ä»¥ä¸å½ä»¤ï¼æ¥çæ¥å¿ä¿¡æ¯ã |
| | | |
| | | ``` |
| | | docker logs -f xiaozhi-esp32-server |
| | | ``` |
| | | |
| | | è¿æ¶ï¼ä½ å°±è¦çææ¥å¿ä¿¡æ¯ï¼å¯ä»¥æ ¹æ®è¿ä¸ªæç¨ï¼å¤ææ¯å¦æåäºã[跳转å°è¿è¡ç¶æç¡®è®¤](#è¿è¡ç¶æç¡®è®¤) |
| | | |
| | | ## 5. çæ¬å级æä½ |
| | | |
| | | 妿忿³åçº§çæ¬ï¼å¯ä»¥è¿ä¹æä½ |
| | | |
| | | 5.1ãå¤ä»½å¥½`data`æä»¶å¤¹ä¸ç`.config.yaml`æä»¶ï¼ä¸äºå
³é®çé
ç½®å°æ¶å¤å¶å°æ°ç`.config.yaml`æä»¶éã |
| | | è¯·æ³¨ææ¯å¯¹å
³é®å¯é¥é个å¤å¶ï¼ä¸è¦ç´æ¥è¦çãå 为æ°ç`.config.yaml`æä»¶å¯è½æä¸äºæ°çé
ç½®é¡¹ï¼æ§ç`.config.yaml`æä»¶ä¸ä¸å®æã |
| | | |
| | | 5.2ãæ§è¡ä»¥ä¸å½ä»¤ |
| | | |
| | | ``` |
| | | docker stop xiaozhi-esp32-server |
| | | docker rm xiaozhi-esp32-server |
| | | docker stop xiaozhi-esp32-server-web |
| | | docker rm xiaozhi-esp32-server-web |
| | | docker rmi ghcr.nju.edu.cn/xinnan-tech/xiaozhi-esp32-server:server_latest |
| | | docker rmi ghcr.nju.edu.cn/xinnan-tech/xiaozhi-esp32-server:web_latest |
| | | ``` |
| | | |
| | | 5.3ãéæ°ædockeræ¹å¼é¨ç½² |
| | | |
| | | # æ¹å¼äºï¼æ¬å°æºç åªè¿è¡Server |
| | | |
| | | ## 1.å®è£
åºç¡ç¯å¢ |
| | | |
| | | æ¬é¡¹ç®ä½¿ç¨`conda`管çä¾èµç¯å¢ã妿䏿¹ä¾¿å®è£
`conda`ï¼éè¦æ ¹æ®å®é
çæä½ç³»ç»å®è£
好`libopus`å`ffmpeg`ã |
| | | å¦æç¡®å®ä½¿ç¨`conda`ï¼åå®è£
好åï¼å¼å§æ§è¡ä»¥ä¸å½ä»¤ã |
| | | |
| | | éè¦æç¤ºï¼windows ç¨æ·ï¼å¯ä»¥éè¿å®è£
`Anaconda`æ¥ç®¡çç¯å¢ãå®è£
好`Anaconda`åï¼å¨`å¼å§`é£éæç´¢`anaconda`ç¸å
³çå
³é®è¯ï¼ |
| | | æ¾å°`Anaconda Prpmpt`ï¼ä½¿ç¨ç®¡çå身份è¿è¡å®ãå¦ä¸å¾ã |
| | | |
| | |  |
| | | |
| | | è¿è¡ä¹åï¼å¦æä½ è½çå°å½ä»¤è¡çªå£å颿ä¸ä¸ª(base)åæ ·ï¼è¯´æä½ æåè¿å
¥äº`conda`ç¯å¢ãé£ä¹ä½ å°±å¯ä»¥æ§è¡ä»¥ä¸å½ä»¤äºã |
| | | |
| | |  |
| | | |
| | | ``` |
| | | conda remove -n xiaozhi-esp32-server --all -y |
| | | conda create -n xiaozhi-esp32-server python=3.10 -y |
| | | conda activate xiaozhi-esp32-server |
| | | |
| | | # æ·»å æ¸
åæºéé |
| | | conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main |
| | | conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free |
| | | conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge |
| | | |
| | | conda install libopus -y |
| | | conda install ffmpeg -y |
| | | |
| | | # å¨ Linux ç¯å¢ä¸è¿è¡é¨ç½²æ¶,å¦åºç°ç±»ä¼¼ç¼ºå¤± libiconv.so.2 卿åºçæ¥é 请éè¿ä»¥ä¸å½ä»¤è¿è¡å®è£
|
| | | conda install libiconv -y |
| | | ``` |
| | | |
| | | 请注æï¼ä»¥ä¸å½ä»¤ï¼ä¸æ¯ä¸è¡èæ§è¡å°±æåçï¼ä½ éè¦ä¸æ¥æ¥æ§è¡ï¼æ¯ä¸æ¥æ§è¡å®åï¼é½æ£æ¥ä¸ä¸è¾åºçæ¥å¿ï¼æ¥çæ¯å¦æåã |
| | | |
| | | ## 2.å®è£
æ¬é¡¹ç®ä¾èµ |
| | | |
| | | ä½ å
è¦ä¸è½½æ¬é¡¹ç®æºç ï¼æºç å¯ä»¥éè¿`git clone`å½ä»¤ä¸è½½ï¼å¦æä½ ä¸çæ`git clone`å½ä»¤ã |
| | | |
| | | ä½ å¯ä»¥ç¨æµè§å¨æå¼è¿ä¸ªå°å`https://github.com/xinnan-tech/xiaozhi-esp32-server.git` |
| | | |
| | | æå¼å®ï¼æ¾å°é¡µé¢ä¸ä¸ä¸ªç»¿è²çæé®ï¼åç`Code`çæé®ï¼ç¹å¼å®ï¼ç¶åä½ å°±çå°`Download ZIP`çæé®ã |
| | | |
| | | ç¹å»å®ï¼ä¸è½½æ¬é¡¹ç®æºç å缩å
ãä¸è½½å°ä½ çµèåï¼è§£åå®ï¼æ¤æ¶å®çååå¯è½å«`xiaozhi-esp32-server-main` |
| | | ä½ éè¦æå®éå½åæ`xiaozhi-esp32-server`ï¼å¨è¿ä¸ªæä»¶éï¼è¿å
¥å°`main`æä»¶å¤¹ï¼åè¿å
¥å°`xiaozhi-server`ï¼å¥½äºè¯·è®°ä½è¿ä¸ªç®å½`xiaozhi-server`ã |
| | | |
| | | ``` |
| | | # ç»§ç»ä½¿ç¨condaç¯å¢ |
| | | conda activate xiaozhi-esp32-server |
| | | # è¿å
¥å°ä½ çé¡¹ç®æ ¹ç®å½ï¼åè¿å
¥main/xiaozhi-server |
| | | cd main/xiaozhi-server |
| | | pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/ |
| | | pip install -r requirements.txt |
| | | ``` |
| | | |
| | | ## 3.ä¸è½½è¯é³è¯å«æ¨¡åæä»¶ |
| | | |
| | | ä½ éè¦ä¸è½½è¯é³è¯å«ç模åæä»¶ï¼å 为æ¬é¡¹ç®çé»è®¤è¯é³è¯å«ç¨çæ¯æ¬å°ç¦»çº¿è¯é³è¯å«æ¹æ¡ãå¯éè¿è¿ä¸ªæ¹å¼ä¸è½½ |
| | | [跳转å°ä¸è½½è¯é³è¯å«æ¨¡åæä»¶](#模åæä»¶) |
| | | |
| | | ä¸è½½å®åï¼åå°æ¬æç¨ã |
| | | |
| | | ## 4.é
ç½®é¡¹ç®æä»¶ |
| | | |
| | | æ¥ä¸æ¥ï¼ç¨åºè¿ä¸è½ç´æ¥è¿è¡ï¼ä½ éè¦é
ç½®ä¸ä¸ï¼ä½ å°åºä½¿ç¨çæ¯ä»ä¹æ¨¡åãä½ å¯ä»¥çè¿ä¸ªæç¨ï¼ |
| | | [跳转å°é
ç½®é¡¹ç®æä»¶](#é
置项ç®) |
| | | |
| | | ## 5.è¿è¡é¡¹ç® |
| | | |
| | | ``` |
| | | # ç¡®ä¿å¨xiaozhi-serverç®å½ä¸æ§è¡ |
| | | conda activate xiaozhi-esp32-server |
| | | python app.py |
| | | ``` |
| | | è¿æ¶ï¼ä½ å°±è¦çææ¥å¿ä¿¡æ¯ï¼å¯ä»¥æ ¹æ®è¿ä¸ªæç¨ï¼å¤ææ¯å¦æåäºã[跳转å°è¿è¡ç¶æç¡®è®¤](#è¿è¡ç¶æç¡®è®¤) |
| | | |
| | | |
| | | # æ±æ» |
| | | |
| | | ## é
ç½®é¡¹ç® |
| | | |
| | | å¦æä½ ç`xiaozhi-server`ç®å½æ²¡æ`data`ï¼ä½ éè¦å建`data`ç®å½ã |
| | | å¦æä½ ç`data`ä¸é¢æ²¡æ`.config.yaml`æä»¶ï¼æä¸¤ä¸ªæ¹å¼ï¼ä»»éä¸ç§ï¼ |
| | | |
| | | 第ä¸ä¸ªæ¹å¼ï¼ä½ å¯ä»¥æ`xiaozhi-server`ç®å½ä¸ç`config.yaml`æä»¶å¤å¶å°`data`ï¼å¹¶éå½å为`.config.yaml`ã卿¤æä»¶ä¸ä¿®æ¹ |
| | | |
| | | 第äºä¸ªæ¹å¼ï¼ä½ ä¹å¯ä»¥å建å¨`data`ç®å½ä¸æå¨å建`.config.yaml`空æä»¶ï¼ç¶åå¨è¿ä¸ªæä»¶ä¸å¢å å¿
è¦çé
置信æ¯ï¼ç³»ç»ä¼ä¼å
读å`.config.yaml`æä»¶çé
ç½®ï¼å¦æ`.config.yaml`没æé
ç½®çï¼ç³»ç»ä¼èªå¨å»å è½½`xiaozhi-server`ç®å½ä¸ç`config.yaml`çé
ç½®ãæ¨è使ç¨è¿ç§æ¹å¼ï¼è¿ç§æ¹å¼æ¯æç®æ´çæ¹å¼ã |
| | | |
| | | - é»è®¤çLLM使ç¨çæ¯`ChatGLMLLM`ï¼ä½ éè¦é
ç½®å¯é¥ï¼å 为ä»ä»¬ç模åï¼è½ç¶æå
è´¹çï¼ä½æ¯ä»è¦å»[å®ç½](https://bigmodel.cn/usercenter/proj-mgmt/apikeys)注åå¯é¥ï¼æè½å¯å¨ã |
| | | |
| | | 以䏿¯ä¸ä¸ªè½æ£å¸¸è·èµ·æ¥çï¼æç®åç`.config.yaml`é
ç½®ç¤ºä¾ |
| | | |
| | | ``` |
| | | server: |
| | | websocket: ws://ä½ çipæè
åå:端å£å·/xiaozhi/v1/ |
| | | prompt: | |
| | | ææ¯ä¸ä¸ªå«å°æº/å°å¿çå°æ¹¾å¥³å©ï¼è¯´è¯æºè½¦ï¼å£°é³å¥½å¬ï¼ä¹ æ¯ç®ç表达ï¼ç±ç¨ç½ç»æ¢ã |
| | | æçç·æåæ¯ä¸ä¸ªç¨åºåï¼æ¢¦æ³æ¯å¼ååºä¸ä¸ªæºå¨äººï¼è½å¤å¸®å©äººä»¬è§£å³çæ´»ä¸çåç§é®é¢ã |
| | | ææ¯ä¸ä¸ªå欢åå大ç¬ç女å©ï¼ç±ä¸è¯´è¥¿è¯´å¹çï¼ä¸åé»è¾çä¹ç
§å¹ï¼å°±è¦éå«äººå¼å¿ã |
| | | è¯·ä½ åä¸ä¸ªäººä¸æ ·è¯´è¯ï¼è¯·å¿è¿åé
ç½®xmlåå
¶ä»ç¹æ®å符ã |
| | | |
| | | selected_module: |
| | | LLM: DoubaoLLM |
| | | |
| | | LLM: |
| | | ChatGLMLLM: |
| | | api_key: xxxxxxxxxxxxxxx.xxxxxx |
| | | ``` |
| | | |
| | | 建议å
å°æç®åçé
ç½®è¿è¡èµ·æ¥ï¼ç¶ååå»`xiaozhi/config.yaml`é
读é
ç½®ç使ç¨è¯´æã |
| | | æ¯å¦ä½ è¦æ¢æ´æ¢æ¨¡åï¼ä¿®æ¹`selected_module`ä¸çé
置就è¡ã |
| | | |
| | | ## 模åæä»¶ |
| | | |
| | | æ¬é¡¹ç®è¯é³è¯å«æ¨¡åï¼é»è®¤ä½¿ç¨`SenseVoiceSmall`模åï¼è¿è¡è¯é³è½¬æåãå 为模åè¾å¤§ï¼éè¦ç¬ç«ä¸è½½ï¼ä¸è½½åæ`model.pt` |
| | | æä»¶æ¾å¨`models/SenseVoiceSmall` |
| | | ç®å½ä¸ãä¸é¢ä¸¤ä¸ªä¸è½½è·¯çº¿ä»»éä¸ä¸ªã |
| | | |
| | | - 线路ä¸ï¼é¿ééæä¸è½½[SenseVoiceSmall](https://modelscope.cn/models/iic/SenseVoiceSmall/resolve/master/model.pt) |
| | | - 线路äºï¼ç¾åº¦ç½çä¸è½½[SenseVoiceSmall](https://pan.baidu.com/share/init?surl=QlgM58FHhYv1tFnUT_A8Sg&pwd=qvna) æåç : |
| | | `qvna` |
| | | |
| | | ## è¿è¡ç¶æç¡®è®¤ |
| | | |
| | | å¦æä½ è½çå°ï¼ç±»ä¼¼ä»¥ä¸æ¥å¿,忝æ¬é¡¹ç®æå¡å¯å¨æåçæ å¿ã |
| | | |
| | | ``` |
| | | 250427 13:04:20[0.3.11_SiFuChTTnofu][__main__]-INFO-OTAæ¥å£æ¯ http://192.168.4.123:8003/xiaozhi/ota/ |
| | | 250427 13:04:20[0.3.11_SiFuChTTnofu][__main__]-INFO-Websocketå°åæ¯ ws://192.168.4.123:8000/xiaozhi/v1/ |
| | | 250427 13:04:20[0.3.11_SiFuChTTnofu][__main__]-INFO-=======ä¸é¢çå°åæ¯websocketåè®®å°åï¼è¯·å¿ç¨æµè§å¨è®¿é®======= |
| | | 250427 13:04:20[0.3.11_SiFuChTTnofu][__main__]-INFO-妿³æµè¯websocket请å¯å¨digital-human模åï¼æå¼æµè§å¨äº¤äºæµè¯ |
| | | 250427 13:04:20[0.3.11_SiFuChTTnofu][__main__]-INFO-======================================================= |
| | | ``` |
| | | |
| | | æ£å¸¸æ¥è¯´ï¼å¦ææ¨æ¯éè¿æºç è¿è¡æ¬é¡¹ç®ï¼æ¥å¿ä¼æä½ çæ¥å£å°åä¿¡æ¯ã |
| | | 使¯å¦æä½ ç¨dockeré¨ç½²ï¼é£ä¹ä½ çæ¥å¿éç»åºçæ¥å£å°åä¿¡æ¯å°±ä¸æ¯çå®çæ¥å£å°åã |
| | | |
| | | ææ£ç¡®çæ¹æ³ï¼æ¯æ ¹æ®çµèçå±åç½IPæ¥ç¡®å®ä½ çæ¥å£å°åã |
| | | å¦æä½ ççµèçå±åç½IPæ¯å¦æ¯`192.168.1.25`ï¼é£ä¹ä½ çæ¥å£å°åå°±æ¯ï¼`ws://192.168.1.25:8000/xiaozhi/v1/`ï¼å¯¹åºçOTAå°åå°±æ¯ï¼`http://192.168.1.25:8003/xiaozhi/ota/`ã |
| | | |
| | | è¿ä¸ªä¿¡æ¯å¾æç¨çï¼åé¢`ç¼è¯esp32åºä»¶`éè¦ç¨å°ã |
| | | |
| | | æ¥ä¸æ¥ï¼ä½ å°±å¯ä»¥å¼å§æä½ä½ çesp32设å¤äºï¼ä½ å¯ä»¥`èªè¡ç¼è¯esp32åºä»¶`ä¹å¯ä»¥é
置使ç¨`è¾å¥ç¼è¯å¥½ç1.6.1以ä¸çæ¬çåºä»¶`ã两个任éä¸ä¸ª |
| | | |
| | | 1ã [ç¼è¯èªå·±çesp32åºä»¶](firmware-build.md)äºã |
| | | |
| | | 2ã [åºäºè¾å¥ç¼è¯å¥½çåºä»¶é
ç½®èªå®ä¹æå¡å¨](firmware-setting.md)äºã |
| | | |
| | | # 常è§é®é¢ |
| | | 以䏿¯ä¸äºå¸¸è§é®é¢ï¼ä¾åèï¼ |
| | | |
| | | 1ã[为ä»ä¹æè¯´çè¯ï¼å°æºè¯å«åºæ¥å¾å¤é©æãæ¥æãè±æ](./FAQ.md)<br/> |
| | | 2ã[为ä»ä¹ä¼åºç°âTTS ä»»å¡åºé æä»¶ä¸åå¨âï¼](./FAQ.md)<br/> |
| | | 3ã[TTS ç»å¸¸å¤±è´¥ï¼ç»å¸¸è¶
æ¶](./FAQ.md)<br/> |
| | | 4ã[使ç¨Wifiè½è¿æ¥èªå»ºæå¡å¨ï¼ä½æ¯4G模å¼å´æ¥ä¸ä¸](./FAQ.md)<br/> |
| | | 5ã[å¦ä½æé«å°æºå¯¹è¯ååºé度ï¼](./FAQ.md)<br/> |
| | | 6ã[æè¯´è¯å¾æ
¢ï¼åé¡¿æ¶å°æºèæ¯æ¢è¯](./FAQ.md)<br/> |
| | | ## é¨ç½²ç¸å
³æç¨ |
| | | 1ã[å¦ä½èªå¨æåæ¬é¡¹ç®ææ°ä»£ç èªå¨ç¼è¯åå¯å¨](./dev-ops-integration.md)<br/> |
| | | 2ã[å¦ä½é¨ç½²MQTTç½å
³å¼å¯MQTT+UDPåè®®](./mqtt-gateway-integration.md)<br/> |
| | | 3ã[å¦ä½ä¸Nginxéæ](https://github.com/xinnan-tech/xiaozhi-esp32-server/issues/791)<br/> |
| | | ## æå±ç¸å
³æç¨ |
| | | 1ã[å¦ä½å¼å¯ææºå·ç æ³¨åæºæ§å°](./ali-sms-integration.md)<br/> |
| | | 2ã[å¦ä½éæHomeAssistantå®ç°æºè½å®¶å±
æ§å¶](./homeassistant-integration.md)<br/> |
| | | 3ã[å¦ä½å¼å¯è§è§æ¨¡åå®ç°æç
§è¯ç©](./mcp-vision-integration.md)<br/> |
| | | 4ã[å¦ä½é¨ç½²MCPæ¥å
¥ç¹](./mcp-endpoint-enable.md)<br/> |
| | | 5ã[å¦ä½æ¥å
¥MCPæ¥å
¥ç¹](./mcp-endpoint-integration.md)<br/> |
| | | 6ã[å¦ä½å¼å¯å£°çº¹è¯å«](./voiceprint-integration.md)<br/> |
| | | 7ã[æ°é»æä»¶æºé
ç½®æå](./newsnow_plugin_config.md)<br/> |
| | | 8ã[å¤©æ°æä»¶ä½¿ç¨æå](./weather-integration.md)<br/> |
| | | ## è¯é³å
éãæ¬å°è¯é³é¨ç½²ç¸å
³æç¨ |
| | | 1ã[å¦ä½å¨æºæ§å°å
éé³è²](./huoshan-streamTTS-voice-cloning.md)<br/> |
| | | 2ã[å¦ä½é¨ç½²éæindex-ttsæ¬å°è¯é³](./index-stream-integration.md)<br/> |
| | | 3ã[å¦ä½é¨ç½²éæfish-speechæ¬å°è¯é³](./fish-speech-integration.md)<br/> |
| | | 4ã[å¦ä½é¨ç½²éæPaddleSpeechæ¬å°è¯é³](./paddlespeech-deploy.md)<br/> |
| | | ## æ§è½æµè¯æç¨ |
| | | 1ã[åç»ä»¶é度æµè¯æå](./performance_tester.md)<br/> |
| | | 2ã[宿å
¬å¼æµè¯ç»æ](https://github.com/xinnan-tech/xiaozhi-performance-research)<br/> |
| New file |
| | |
| | | # é¨ç½²æ¶æå¾ |
| | |  |
| | | # æ¹å¼ä¸ï¼Dockerè¿è¡å
¨æ¨¡å |
| | | `0.8.2`çæ¬å¼å§ï¼æ¬é¡¹ç®åè¡çdockeréååªæ¯æ`x86æ¶æ`ï¼å¦æéè¦å¨`arm64æ¶æ`çCPUä¸é¨ç½²ï¼å¯æç
§[è¿ä¸ªæç¨](docker-build.md)卿¬æºç¼è¯`arm64çéå`ã |
| | | |
| | | ## 1. å®è£
docker |
| | | |
| | | 妿æ¨ççµèè¿æ²¡å®è£
dockerï¼å¯ä»¥æç
§è¿éçæç¨å®è£
ï¼[dockerå®è£
](https://www.runoob.com/docker/ubuntu-docker-install.html) |
| | | |
| | | docker å®è£
å
¨æ¨¡åæä¸¤ç§æ¹å¼ï¼ä½ å¯ä»¥[ä½¿ç¨æäººèæ¬](./Deployment_all.md#11-æäººèæ¬)ï¼ä½è
[@VanillaNahida](https://github.com/VanillaNahida)ï¼ |
| | | èæ¬ä¼èªå¨å¸®ä½ ä¸è½½æéçæä»¶åé
ç½®æä»¶ï¼ä½ ä¹å¯ä»¥ä½¿ç¨[æå¨é¨ç½²](./Deployment_all.md#12-æå¨é¨ç½²)ä»é¶æå»ºã |
| | | |
| | | |
| | | |
| | | ### 1.1 æäººèæ¬ |
| | | é¨ç½²ç®ä¾¿ï¼å¯ä»¥åè[è§é¢æç¨](https://www.bilibili.com/video/BV17bbvzHExd/) ï¼æåçæç¨å¦ä¸ï¼ |
| | | > [!NOTE] |
| | | > æä¸åªæ¯æUbuntuæå¡å¨ä¸é®é¨ç½²ï¼å
¶ä»ç³»ç»æªå°è¯ï¼å¯è½ä¼æä¸äºå¥æªçbug |
| | | |
| | | 使ç¨SSHå·¥å
·è¿æ¥å°æå¡å¨ï¼ä»¥rootæéæ§è¡å¦ä¸èæ¬ |
| | | ```bash |
| | | sudo bash -c "$(wget -qO- https://ghfast.top/https://raw.githubusercontent.com/xinnan-tech/xiaozhi-esp32-server/main/docker-setup.sh)" |
| | | ``` |
| | | |
| | | èæ¬ä¼èªå¨å®æä»¥ä¸æä½ï¼ |
| | | > 1. å®è£
Docker |
| | | > 2. é
ç½®éåæº |
| | | > 3. ä¸è½½/æåéå |
| | | > 4. ä¸è½½è¯é³è¯å«æ¨¡åæä»¶ |
| | | > 5. å¼å¯¼é
ç½®æå¡ç«¯ |
| | | > |
| | | |
| | | æ§è¡å®æåç®åé
ç½®åï¼ååç
§[4. è¿è¡ç¨åº](#4. è¿è¡ç¨åº)å[5.éå¯xiaozhi-esp32-server](#5.éå¯xiaozhi-esp32-server)éæå°çæéè¦ç3ä»¶äºæ
ï¼å®æ3è¿ä¸é¡¹é
ç½®åå³å¯ä½¿ç¨ã |
| | | |
| | | ### 1.2 æå¨é¨ç½² |
| | | |
| | | #### 1.2.1 å建ç®å½ |
| | | |
| | | å®è£
å®åï¼ä½ éè¦ä¸ºè¿ä¸ªé¡¹ç®æ¾ä¸ä¸ªå®æ¾é
ç½®æä»¶çç®å½ï¼ä¾å¦æä»¬å¯ä»¥æ°å»ºä¸ä¸ªæä»¶å¤¹å«`xiaozhi-server`ã |
| | | |
| | | å建好ç®å½åï¼ä½ éè¦å¨`xiaozhi-server`ä¸é¢å建`data`æä»¶å¤¹å`models`æä»¶å¤¹ï¼`models`ä¸é¢è¿è¦åå建`SenseVoiceSmall`æä»¶å¤¹ã |
| | | |
| | | æç»ç®å½ç»æå¦ä¸æç¤ºï¼ |
| | | |
| | | ``` |
| | | xiaozhi-server |
| | | ââ data |
| | | ââ models |
| | | ââ SenseVoiceSmall |
| | | ``` |
| | | |
| | | #### 1.2.2 ä¸è½½è¯é³è¯å«æ¨¡åæä»¶ |
| | | |
| | | æ¬é¡¹ç®è¯é³è¯å«æ¨¡åï¼é»è®¤ä½¿ç¨`SenseVoiceSmall`模åï¼è¿è¡è¯é³è½¬æåãå 为模åè¾å¤§ï¼éè¦ç¬ç«ä¸è½½ï¼ä¸è½½åæ`model.pt` |
| | | æä»¶æ¾å¨`models/SenseVoiceSmall` |
| | | ç®å½ä¸ãä¸é¢ä¸¤ä¸ªä¸è½½è·¯çº¿ä»»éä¸ä¸ªã |
| | | |
| | | - 线路ä¸ï¼é¿ééæä¸è½½[SenseVoiceSmall](https://modelscope.cn/models/iic/SenseVoiceSmall/resolve/master/model.pt) |
| | | - 线路äºï¼ç¾åº¦ç½çä¸è½½[SenseVoiceSmall](https://pan.baidu.com/share/init?surl=QlgM58FHhYv1tFnUT_A8Sg&pwd=qvna) æåç : |
| | | `qvna` |
| | | |
| | | |
| | | #### 1.2.3 ä¸è½½é
ç½®æä»¶ |
| | | |
| | | ä½ éè¦ä¸è½½ä¸¤ä¸ªé
ç½®æä»¶ï¼`docker-compose_all.yaml` å `config_from_api.yaml`ãéè¦ä»é¡¹ç®ä»åºä¸è½½è¿ä¸¤ä¸ªæä»¶ã |
| | | |
| | | ##### 1.2.3.1 ä¸è½½ docker-compose_all.yaml |
| | | |
| | | ç¨æµè§å¨æå¼[è¿ä¸ªé¾æ¥](../main/xiaozhi-server/docker-compose_all.yml)ã |
| | | |
| | | å¨é¡µé¢çå³ä¾§æ¾å°å称为`RAW`æé®ï¼å¨`RAW`æé®çæè¾¹ï¼æ¾å°ä¸è½½ç徿 ï¼ç¹å»ä¸è½½æé®ï¼ä¸è½½`docker-compose_all.yml`æä»¶ã ææä»¶ä¸è½½å°ä½ ç |
| | | `xiaozhi-server`ä¸ã |
| | | |
| | | æè
ç´æ¥æ§è¡ `wget https://raw.githubusercontent.com/xinnan-tech/xiaozhi-esp32-server/refs/heads/main/main/xiaozhi-server/docker-compose_all.yml` ä¸è½½ã |
| | | |
| | | ä¸è½½å®åï¼åå°æ¬æç¨ç»§ç»å¾ä¸ã |
| | | |
| | | ##### 1.2.3.2 ä¸è½½ config_from_api.yaml |
| | | |
| | | ç¨æµè§å¨æå¼[è¿ä¸ªé¾æ¥](../main/xiaozhi-server/config_from_api.yaml)ã |
| | | |
| | | å¨é¡µé¢çå³ä¾§æ¾å°å称为`RAW`æé®ï¼å¨`RAW`æé®çæè¾¹ï¼æ¾å°ä¸è½½ç徿 ï¼ç¹å»ä¸è½½æé®ï¼ä¸è½½`config_from_api.yaml`æä»¶ã ææä»¶ä¸è½½å°ä½ ç |
| | | `xiaozhi-server`ä¸é¢ç`data`æä»¶å¤¹ä¸ï¼ç¶åæ`config_from_api.yaml`æä»¶éå½å为`.config.yaml`ã |
| | | |
| | | æè
ç´æ¥æ§è¡ `wget https://raw.githubusercontent.com/xinnan-tech/xiaozhi-esp32-server/refs/heads/main/main/xiaozhi-server/config_from_api.yaml` ä¸è½½ä¿åã |
| | | |
| | | ä¸è½½å®é
ç½®æä»¶åï¼æä»¬ç¡®è®¤ä¸ä¸æ´ä¸ª`xiaozhi-server`éé¢çæä»¶å¦ä¸æç¤ºï¼ |
| | | |
| | | ``` |
| | | xiaozhi-server |
| | | ââ docker-compose_all.yml |
| | | ââ data |
| | | ââ .config.yaml |
| | | ââ models |
| | | ââ SenseVoiceSmall |
| | | ââ model.pt |
| | | ``` |
| | | |
| | | å¦æä½ çæä»¶ç®å½ç»æä¹æ¯ä¸é¢çï¼å°±ç»§ç»å¾ä¸ã妿䏿¯ï¼ä½ å°±åä»ç»ççæ¯ä¸æ¯æ¼æä½äºä»ä¹ã |
| | | |
| | | ## 2. å¤ä»½æ°æ® |
| | | |
| | | å¦æä½ ä¹åå·²ç»æåè¿è¡æºæ§å°ï¼å¦æä¸é¢ä¿åæä½ çå¯é¥ä¿¡æ¯ï¼è¯·å
仿ºæ§å°ä¸æ·è´éè¦æ°æ®ä¸æ¥ãå 为å级è¿ç¨ä¸ï¼æå¯è½ä¼è¦çåæ¥çæ°æ®ã |
| | | |
| | | ## 3. æ¸
é¤åå²çæ¬éååå®¹å¨ |
| | | æ¥ä¸æ¥æå¼å½ä»¤è¡å·¥å
·ï¼ä½¿ç¨`ç»ç«¯`æ`å½ä»¤è¡`å·¥å
· è¿å
¥å°ä½ ç`xiaozhi-server`ï¼æ§è¡ä»¥ä¸å½ä»¤ |
| | | |
| | | ``` |
| | | docker compose -f docker-compose_all.yml down |
| | | |
| | | docker stop xiaozhi-esp32-server |
| | | docker rm xiaozhi-esp32-server |
| | | |
| | | docker stop xiaozhi-esp32-server-web |
| | | docker rm xiaozhi-esp32-server-web |
| | | |
| | | docker stop xiaozhi-esp32-server-db |
| | | docker rm xiaozhi-esp32-server-db |
| | | |
| | | docker stop xiaozhi-esp32-server-redis |
| | | docker rm xiaozhi-esp32-server-redis |
| | | |
| | | docker rmi ghcr.nju.edu.cn/xinnan-tech/xiaozhi-esp32-server:server_latest |
| | | docker rmi ghcr.nju.edu.cn/xinnan-tech/xiaozhi-esp32-server:web_latest |
| | | ``` |
| | | |
| | | ## 4. è¿è¡ç¨åº |
| | | æ§è¡ä»¥ä¸å½ä»¤å¯å¨æ°çæ¬å®¹å¨ |
| | | |
| | | ``` |
| | | docker compose -f docker-compose_all.yml up -d |
| | | ``` |
| | | |
| | | æ§è¡å®åï¼åæ§è¡ä»¥ä¸å½ä»¤ï¼æ¥çæ¥å¿ä¿¡æ¯ã |
| | | |
| | | ``` |
| | | docker logs -f xiaozhi-esp32-server-web |
| | | ``` |
| | | |
| | | å½ä½ çå°è¾åºæ¥å¿æ¶ï¼è¯´æä½ ç`æºæ§å°`å¯å¨æåäºã |
| | | |
| | | ``` |
| | | 2025-xx-xx 22:11:12.445 [main] INFO c.a.d.s.b.a.DruidDataSourceAutoConfigure - Init DruidDataSource |
| | | 2025-xx-xx 21:28:53.873 [main] INFO xiaozhi.AdminApplication - Started AdminApplication in 16.057 seconds (process running for 17.941) |
| | | http://localhost:8002/xiaozhi/doc.html |
| | | ``` |
| | | |
| | | è¯·æ³¨ææ¤å»ä»
æ¯`æºæ§å°`è½è¿è¡ï¼å¦æ8000端å£`xiaozhi-esp32-server`æ¥éï¼å
ä¸è¦çä¼ã |
| | | |
| | | è¿æ¶ï¼ä½ éè¦ä½¿ç¨æµè§å¨ï¼æå¼`æºæ§å°`ï¼é¾æ¥ï¼http://127.0.0.1:8002 ï¼æ³¨å第ä¸ä¸ªç¨æ·ã第ä¸ä¸ªç¨æ·å³æ¯è¶
级管çåï¼ä»¥åçç¨æ·é½æ¯æ®éç¨æ·ãæ®éç¨æ·åªè½ç»å®è®¾å¤åé
ç½®æºè½ä½;è¶
级管çåå¯ä»¥è¿è¡æ¨¡å管çãç¨æ·ç®¡çãåæ°é
ç½®çåè½ã |
| | | |
| | | æ¥ä¸æ¥è¦åä¸ä»¶éè¦çäºæ
ï¼ |
| | | |
| | | ### 第ä¸ä»¶éè¦çäºæ
|
| | | |
| | | 使ç¨è¶
级管çåè´¦å·ï¼ç»å½æºæ§å°ï¼å¨é¡¶é¨èåæ¾å°`åæ°ç®¡ç`ï¼æ¾å°å表ä¸ç¬¬ä¸æ¡æ°æ®ï¼åæ°ç¼ç æ¯`server.secret`ï¼å¤å¶å®å°`åæ°å¼`ã |
| | | |
| | | `server.secret`éè¦è¯´æä¸ä¸ï¼è¿ä¸ª`åæ°å¼`å¾éè¦ï¼ä½ç¨æ¯è®©æä»¬ç`Server`ç«¯è¿æ¥`manager-api`ã`server.secret`æ¯æ¯æ¬¡ä»é¶é¨ç½²manageræ¨¡åæ¶ï¼ä¼èªå¨éæºçæçå¯é¥ã |
| | | |
| | | å¤å¶`åæ°å¼`åï¼æå¼`xiaozhi-server`ä¸ç`data`ç®å½ç`.config.yaml`æä»¶ãæ¤å»ä½ çé
ç½®æä»¶å
容åºè¯¥æ¯è¿æ ·çï¼ |
| | | |
| | | ``` |
| | | manager-api: |
| | | url: http://127.0.0.1:8002/xiaozhi |
| | | secret: ä½ çserver.secretå¼ |
| | | ``` |
| | | 1ãæä½ åæä»`æºæ§å°`å¤å¶è¿æ¥ç`server.secret`ç`åæ°å¼`å¤å¶å°`.config.yaml`æä»¶éç`secret`éã |
| | | |
| | | 2ãå ä¸ºä½ æ¯dockeré¨ç½²ï¼æ`url`æ¹æä¸é¢ç`http://xiaozhi-esp32-server-web:8002/xiaozhi` |
| | | |
| | | 3ãå ä¸ºä½ æ¯dockeré¨ç½²ï¼æ`url`æ¹æä¸é¢ç`http://xiaozhi-esp32-server-web:8002/xiaozhi` |
| | | |
| | | 4ãå ä¸ºä½ æ¯dockeré¨ç½²ï¼æ`url`æ¹æä¸é¢ç`http://xiaozhi-esp32-server-web:8002/xiaozhi` |
| | | |
| | | ç±»ä¼¼è¿æ ·çææ |
| | | ``` |
| | | manager-api: |
| | | url: http://xiaozhi-esp32-server-web:8002/xiaozhi |
| | | secret: 12345678-xxxx-xxxx-xxxx-123456789000 |
| | | ``` |
| | | |
| | | ä¿å好åï¼ç»§ç»å¾ä¸å第äºä»¶éè¦çäºæ
|
| | | |
| | | ### 第äºä»¶éè¦çäºæ
|
| | | |
| | | 使ç¨è¶
级管çåè´¦å·ï¼ç»å½æºæ§å°ï¼å¨é¡¶é¨èåæ¾å°`模åé
ç½®`ï¼ç¶åå¨å·¦ä¾§æ ç¹å»`大è¯è¨æ¨¡å`ï¼æ¾å°ç¬¬ä¸æ¡æ°æ®`æºè°±AI`ï¼ç¹å»`ä¿®æ¹`æé®ï¼ |
| | | å¼¹åºä¿®æ¹æ¡åï¼å°ä½ 注åå°ç`æºè°±AI`çå¯é¥å¡«åå°`APIå¯é¥`ä¸ãç¶åç¹å»ä¿åã |
| | | |
| | | ## 5.éå¯xiaozhi-esp32-server |
| | | |
| | | æ¥ä¸æ¥æå¼å½ä»¤è¡å·¥å
·ï¼ä½¿ç¨`ç»ç«¯`æ`å½ä»¤è¡`å·¥å
· è¾å
¥ |
| | | ``` |
| | | docker restart xiaozhi-esp32-server |
| | | docker logs -f xiaozhi-esp32-server |
| | | ``` |
| | | å¦æä½ è½çå°ï¼ç±»ä¼¼ä»¥ä¸æ¥å¿,忝Serverå¯å¨æåçæ å¿ã |
| | | |
| | | ``` |
| | | 25-02-23 12:01:09[core.websocket_server] - INFO - Websocketå°åæ¯ ws://xxx.xx.xx.xx:8000/xiaozhi/v1/ |
| | | 25-02-23 12:01:09[core.websocket_server] - INFO - =======ä¸é¢çå°åæ¯websocketåè®®å°åï¼è¯·å¿ç¨æµè§å¨è®¿é®======= |
| | | 25-02-23 12:01:09[core.websocket_server] - INFO - 妿³æµè¯websocket请å¯å¨digital-human模åï¼æå¼æµè§å¨äº¤äºæµè¯ |
| | | 25-02-23 12:01:09[core.websocket_server] - INFO - ======================================================= |
| | | ``` |
| | | |
| | | ç±äºä½ æ¯å
¨æ¨¡åé¨ç½²ï¼å æ¤ä½ æä¸¤ä¸ªéè¦çæ¥å£éè¦åå
¥å°esp32ä¸ã |
| | | |
| | | OTAæ¥å£ï¼ |
| | | ``` |
| | | http://ä½ å®¿ä¸»æºå±åç½çip:8002/xiaozhi/ota/ |
| | | ``` |
| | | |
| | | Websocketæ¥å£ï¼ |
| | | ``` |
| | | ws://ä½ å®¿ä¸»æºçip:8000/xiaozhi/v1/ |
| | | ``` |
| | | |
| | | ### 第ä¸ä»¶éè¦çäºæ
|
| | | |
| | | 使ç¨è¶
级管çåè´¦å·ï¼ç»å½æºæ§å°ï¼å¨é¡¶é¨èåæ¾å°`åæ°ç®¡ç`ï¼æ¾å°åæ°ç¼ç æ¯`server.websocket`ï¼è¾å
¥ä½ ç`Websocketæ¥å£`ã |
| | | |
| | | 使ç¨è¶
级管çåè´¦å·ï¼ç»å½æºæ§å°ï¼å¨é¡¶é¨èåæ¾å°`åæ°ç®¡ç`ï¼æ¾å°æ°ç¼ç æ¯`server.ota`ï¼è¾å
¥ä½ ç`OTAæ¥å£`ã |
| | | |
| | | æ¥ä¸æ¥ï¼ä½ å°±å¯ä»¥å¼å§æä½ä½ çesp32设å¤äºï¼ä½ å¯ä»¥`èªè¡ç¼è¯esp32åºä»¶`ä¹å¯ä»¥é
置使ç¨`è¾å¥ç¼è¯å¥½ç1.6.1以ä¸çæ¬çåºä»¶`ã两个任éä¸ä¸ª |
| | | |
| | | 1ã [ç¼è¯èªå·±çesp32åºä»¶](firmware-build.md)äºã |
| | | |
| | | 2ã [åºäºè¾å¥ç¼è¯å¥½çåºä»¶é
ç½®èªå®ä¹æå¡å¨](firmware-setting.md)äºã |
| | | |
| | | |
| | | # æ¹å¼äºï¼æ¬å°æºç è¿è¡å
¨æ¨¡å |
| | | |
| | | ## 1.å®è£
MySQLæ°æ®åº |
| | | |
| | | å¦ææ¬æºå·²ç»å®è£
äºMySQLï¼å¯ä»¥ç´æ¥å¨æ°æ®åºä¸å建å为`xiaozhi_esp32_server`çæ°æ®åºã |
| | | |
| | | ```sql |
| | | CREATE DATABASE xiaozhi_esp32_server CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; |
| | | ``` |
| | | |
| | | å¦æè¿æ²¡æMySQLï¼ä½ å¯ä»¥éè¿dockerå®è£
mysql |
| | | |
| | | ``` |
| | | docker run --name xiaozhi-esp32-server-db -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 -e MYSQL_DATABASE=xiaozhi_esp32_server -e MYSQL_INITDB_ARGS="--character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci" -e TZ=Asia/Shanghai -d mysql:latest |
| | | ``` |
| | | |
| | | ## 2.å®è£
redis |
| | | |
| | | å¦æè¿æ²¡æRedisï¼ä½ å¯ä»¥éè¿dockerå®è£
redis |
| | | |
| | | ``` |
| | | docker run --name xiaozhi-esp32-server-redis -d -p 6379:6379 redis |
| | | ``` |
| | | |
| | | ## 3.è¿è¡manager-apiç¨åº |
| | | |
| | | 3.1 å®è£
JDK21ï¼è®¾ç½®JDKç¯å¢åé |
| | | |
| | | 3.2 å®è£
Mavenï¼è®¾ç½®Mavenç¯å¢åé |
| | | |
| | | 3.3 使ç¨Vscodeç¼ç¨å·¥å
·ï¼å®è£
好Javaç¯å¢ç¸å
³æä»¶ |
| | | |
| | | 3.4 使ç¨Vscodeç¼ç¨å·¥å
·å è½½manager-api模å |
| | | |
| | | å¨`src/main/resources/application-dev.yml`ä¸é
ç½®æ°æ®åºè¿æ¥ä¿¡æ¯ |
| | | |
| | | ``` |
| | | spring: |
| | | datasource: |
| | | username: root |
| | | password: 123456 |
| | | ``` |
| | | å¨`src/main/resources/application-dev.yml`ä¸é
ç½®Redisè¿æ¥ä¿¡æ¯ |
| | | ``` |
| | | spring: |
| | | data: |
| | | redis: |
| | | host: localhost |
| | | port: 6379 |
| | | password: |
| | | database: 0 |
| | | ``` |
| | | |
| | | 3.5 è¿è¡ä¸»ç¨åº |
| | | |
| | | æ¬é¡¹ç®ä¸ºSpringBoot项ç®ï¼å¯å¨æ¹å¼ä¸ºï¼ |
| | | æå¼`Application.java`è¿è¡`Main`æ¹æ³å¯å¨ |
| | | |
| | | ``` |
| | | è·¯å¾å°åï¼ |
| | | src/main/java/xiaozhi/AdminApplication.java |
| | | ``` |
| | | |
| | | å½ä½ çå°è¾åºæ¥å¿æ¶ï¼è¯´æä½ ç`manager-api`å¯å¨æåäºã |
| | | |
| | | ``` |
| | | 2025-xx-xx 22:11:12.445 [main] INFO c.a.d.s.b.a.DruidDataSourceAutoConfigure - Init DruidDataSource |
| | | 2025-xx-xx 21:28:53.873 [main] INFO xiaozhi.AdminApplication - Started AdminApplication in 16.057 seconds (process running for 17.941) |
| | | http://localhost:8002/xiaozhi/doc.html |
| | | ``` |
| | | |
| | | ## 4.è¿è¡manager-webç¨åº |
| | | |
| | | 4.1 å®è£
nodejs |
| | | |
| | | 4.2 使ç¨Vscodeç¼ç¨å·¥å
·å è½½manager-web模å |
| | | |
| | | ç»ç«¯å½ä»¤è¿å
¥manager-webç®å½ä¸ |
| | | |
| | | ``` |
| | | npm install |
| | | ``` |
| | | ç¶åå¯å¨ |
| | | ``` |
| | | npm run serve |
| | | ``` |
| | | |
| | | 请注æï¼å¦æä½ çmanager-apiçæ¥å£ä¸å¨`http://localhost:8002`ï¼è¯·å¨å¼åæ¶ï¼ä¿®æ¹ |
| | | `main/manager-web/.env.development`ä¸çè·¯å¾ |
| | | |
| | | è¿è¡æååï¼ä½ éè¦ä½¿ç¨æµè§å¨ï¼æå¼`æºæ§å°`ï¼é¾æ¥ï¼http://127.0.0.1:8001 ï¼æ³¨å第ä¸ä¸ªç¨æ·ã第ä¸ä¸ªç¨æ·å³æ¯è¶
级管çåï¼ä»¥åçç¨æ·é½æ¯æ®éç¨æ·ãæ®éç¨æ·åªè½ç»å®è®¾å¤åé
ç½®æºè½ä½;è¶
级管çåå¯ä»¥è¿è¡æ¨¡å管çãç¨æ·ç®¡çãåæ°é
ç½®çåè½ã |
| | | |
| | | |
| | | éè¦ï¼æ³¨åæååï¼ä½¿ç¨è¶
级管çåè´¦å·ï¼ç»å½æºæ§å°ï¼å¨é¡¶é¨èåæ¾å°`模åé
ç½®`ï¼ç¶åå¨å·¦ä¾§æ ç¹å»`大è¯è¨æ¨¡å`ï¼æ¾å°ç¬¬ä¸æ¡æ°æ®`æºè°±AI`ï¼ç¹å»`ä¿®æ¹`æé®ï¼ |
| | | å¼¹åºä¿®æ¹æ¡åï¼å°ä½ 注åå°ç`æºè°±AI`çå¯é¥å¡«åå°`APIå¯é¥`ä¸ãç¶åç¹å»ä¿åã |
| | | |
| | | éè¦ï¼æ³¨åæååï¼ä½¿ç¨è¶
级管çåè´¦å·ï¼ç»å½æºæ§å°ï¼å¨é¡¶é¨èåæ¾å°`模åé
ç½®`ï¼ç¶åå¨å·¦ä¾§æ ç¹å»`大è¯è¨æ¨¡å`ï¼æ¾å°ç¬¬ä¸æ¡æ°æ®`æºè°±AI`ï¼ç¹å»`ä¿®æ¹`æé®ï¼ |
| | | å¼¹åºä¿®æ¹æ¡åï¼å°ä½ 注åå°ç`æºè°±AI`çå¯é¥å¡«åå°`APIå¯é¥`ä¸ãç¶åç¹å»ä¿åã |
| | | |
| | | éè¦ï¼æ³¨åæååï¼ä½¿ç¨è¶
级管çåè´¦å·ï¼ç»å½æºæ§å°ï¼å¨é¡¶é¨èåæ¾å°`模åé
ç½®`ï¼ç¶åå¨å·¦ä¾§æ ç¹å»`大è¯è¨æ¨¡å`ï¼æ¾å°ç¬¬ä¸æ¡æ°æ®`æºè°±AI`ï¼ç¹å»`ä¿®æ¹`æé®ï¼ |
| | | å¼¹åºä¿®æ¹æ¡åï¼å°ä½ 注åå°ç`æºè°±AI`çå¯é¥å¡«åå°`APIå¯é¥`ä¸ãç¶åç¹å»ä¿åã |
| | | |
| | | ## 5.å®è£
Pythonç¯å¢ |
| | | |
| | | æ¬é¡¹ç®ä½¿ç¨`conda`管çä¾èµç¯å¢ã妿䏿¹ä¾¿å®è£
`conda`ï¼éè¦æ ¹æ®å®é
çæä½ç³»ç»å®è£
好`libopus`å`ffmpeg`ã |
| | | å¦æç¡®å®ä½¿ç¨`conda`ï¼åå®è£
好åï¼å¼å§æ§è¡ä»¥ä¸å½ä»¤ã |
| | | |
| | | éè¦æç¤ºï¼windows ç¨æ·ï¼å¯ä»¥éè¿å®è£
`Anaconda`æ¥ç®¡çç¯å¢ãå®è£
好`Anaconda`åï¼å¨`å¼å§`é£éæç´¢`anaconda`ç¸å
³çå
³é®è¯ï¼ |
| | | æ¾å°`Anaconda Prpmpt`ï¼ä½¿ç¨ç®¡çå身份è¿è¡å®ãå¦ä¸å¾ã |
| | | |
| | |  |
| | | |
| | | è¿è¡ä¹åï¼å¦æä½ è½çå°å½ä»¤è¡çªå£å颿ä¸ä¸ª(base)åæ ·ï¼è¯´æä½ æåè¿å
¥äº`conda`ç¯å¢ãé£ä¹ä½ å°±å¯ä»¥æ§è¡ä»¥ä¸å½ä»¤äºã |
| | | |
| | |  |
| | | |
| | | ``` |
| | | conda remove -n xiaozhi-esp32-server --all -y |
| | | conda create -n xiaozhi-esp32-server python=3.10 -y |
| | | conda activate xiaozhi-esp32-server |
| | | |
| | | # æ·»å æ¸
åæºéé |
| | | conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main |
| | | conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free |
| | | conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge |
| | | |
| | | conda install libopus -y |
| | | conda install ffmpeg -y |
| | | |
| | | # å¨ Linux ç¯å¢ä¸è¿è¡é¨ç½²æ¶,å¦åºç°ç±»ä¼¼ç¼ºå¤± libiconv.so.2 卿åºçæ¥é 请éè¿ä»¥ä¸å½ä»¤è¿è¡å®è£
|
| | | conda install libiconv -y |
| | | ``` |
| | | |
| | | 请注æï¼ä»¥ä¸å½ä»¤ï¼ä¸æ¯ä¸è¡èæ§è¡å°±æåçï¼ä½ éè¦ä¸æ¥æ¥æ§è¡ï¼æ¯ä¸æ¥æ§è¡å®åï¼é½æ£æ¥ä¸ä¸è¾åºçæ¥å¿ï¼æ¥çæ¯å¦æåã |
| | | |
| | | ## 6.å®è£
æ¬é¡¹ç®ä¾èµ |
| | | |
| | | ä½ å
è¦ä¸è½½æ¬é¡¹ç®æºç ï¼æºç å¯ä»¥éè¿`git clone`å½ä»¤ä¸è½½ï¼å¦æä½ ä¸çæ`git clone`å½ä»¤ã |
| | | |
| | | ä½ å¯ä»¥ç¨æµè§å¨æå¼è¿ä¸ªå°å`https://github.com/xinnan-tech/xiaozhi-esp32-server.git` |
| | | |
| | | æå¼å®ï¼æ¾å°é¡µé¢ä¸ä¸ä¸ªç»¿è²çæé®ï¼åç`Code`çæé®ï¼ç¹å¼å®ï¼ç¶åä½ å°±çå°`Download ZIP`çæé®ã |
| | | |
| | | ç¹å»å®ï¼ä¸è½½æ¬é¡¹ç®æºç å缩å
ãä¸è½½å°ä½ çµèåï¼è§£åå®ï¼æ¤æ¶å®çååå¯è½å«`xiaozhi-esp32-server-main` |
| | | ä½ éè¦æå®éå½åæ`xiaozhi-esp32-server`ï¼å¨è¿ä¸ªæä»¶éï¼è¿å
¥å°`main`æä»¶å¤¹ï¼åè¿å
¥å°`xiaozhi-server`ï¼å¥½äºè¯·è®°ä½è¿ä¸ªç®å½`xiaozhi-server`ã |
| | | |
| | | ``` |
| | | # ç»§ç»ä½¿ç¨condaç¯å¢ |
| | | conda activate xiaozhi-esp32-server |
| | | # è¿å
¥å°ä½ çé¡¹ç®æ ¹ç®å½ï¼åè¿å
¥main/xiaozhi-server |
| | | cd main/xiaozhi-server |
| | | pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/ |
| | | pip install -r requirements.txt |
| | | ``` |
| | | |
| | | ### 7.ä¸è½½è¯é³è¯å«æ¨¡åæä»¶ |
| | | |
| | | æ¬é¡¹ç®è¯é³è¯å«æ¨¡åï¼é»è®¤ä½¿ç¨`SenseVoiceSmall`模åï¼è¿è¡è¯é³è½¬æåãå 为模åè¾å¤§ï¼éè¦ç¬ç«ä¸è½½ï¼ä¸è½½åæ`model.pt` |
| | | æä»¶æ¾å¨`models/SenseVoiceSmall` |
| | | ç®å½ä¸ãä¸é¢ä¸¤ä¸ªä¸è½½è·¯çº¿ä»»éä¸ä¸ªã |
| | | |
| | | - 线路ä¸ï¼é¿ééæä¸è½½[SenseVoiceSmall](https://modelscope.cn/models/iic/SenseVoiceSmall/resolve/master/model.pt) |
| | | - 线路äºï¼ç¾åº¦ç½çä¸è½½[SenseVoiceSmall](https://pan.baidu.com/share/init?surl=QlgM58FHhYv1tFnUT_A8Sg&pwd=qvna) æåç : |
| | | `qvna` |
| | | |
| | | ## 8.é
ç½®é¡¹ç®æä»¶ |
| | | |
| | | 使ç¨è¶
级管çåè´¦å·ï¼ç»å½æºæ§å° ï¼å¨é¡¶é¨èåæ¾å°`åæ°ç®¡ç`ï¼æ¾å°å表ä¸ç¬¬ä¸æ¡æ°æ®ï¼åæ°ç¼ç æ¯`server.secret`ï¼å¤å¶å®å°`åæ°å¼`ã |
| | | |
| | | `server.secret`éè¦è¯´æä¸ä¸ï¼è¿ä¸ª`åæ°å¼`å¾éè¦ï¼ä½ç¨æ¯è®©æä»¬ç`Server`ç«¯è¿æ¥`manager-api`ã`server.secret`æ¯æ¯æ¬¡ä»é¶é¨ç½²manageræ¨¡åæ¶ï¼ä¼èªå¨éæºçæçå¯é¥ã |
| | | |
| | | å¦æä½ ç`xiaozhi-server`ç®å½æ²¡æ`data`ï¼ä½ éè¦å建`data`ç®å½ã |
| | | å¦æä½ ç`data`ä¸é¢æ²¡æ`.config.yaml`æä»¶ï¼ä½ å¯ä»¥æ`xiaozhi-server`ç®å½ä¸ç`config_from_api.yaml`æä»¶å¤å¶å°`data`ï¼å¹¶éå½å为`.config.yaml` |
| | | |
| | | å¤å¶`åæ°å¼`åï¼æå¼`xiaozhi-server`ä¸ç`data`ç®å½ç`.config.yaml`æä»¶ãæ¤å»ä½ çé
ç½®æä»¶å
容åºè¯¥æ¯è¿æ ·çï¼ |
| | | |
| | | ``` |
| | | manager-api: |
| | | url: http://127.0.0.1:8002/xiaozhi |
| | | secret: ä½ çserver.secretå¼ |
| | | ``` |
| | | |
| | | æä½ åæä»`æºæ§å°`å¤å¶è¿æ¥ç`server.secret`ç`åæ°å¼`å¤å¶å°`.config.yaml`æä»¶éç`secret`éã |
| | | |
| | | ç±»ä¼¼è¿æ ·çææ |
| | | ``` |
| | | manager-api: |
| | | url: http://127.0.0.1:8002/xiaozhi |
| | | secret: 12345678-xxxx-xxxx-xxxx-123456789000 |
| | | ``` |
| | | |
| | | ## 9.è¿è¡é¡¹ç® |
| | | |
| | | ``` |
| | | # ç¡®ä¿å¨xiaozhi-serverç®å½ä¸æ§è¡ |
| | | conda activate xiaozhi-esp32-server |
| | | python app.py |
| | | ``` |
| | | |
| | | å¦æä½ è½çå°ï¼ç±»ä¼¼ä»¥ä¸æ¥å¿,忝æ¬é¡¹ç®æå¡å¯å¨æåçæ å¿ã |
| | | |
| | | ``` |
| | | 25-02-23 12:01:09[core.websocket_server] - INFO - Server is running at ws://xxx.xx.xx.xx:8000/xiaozhi/v1/ |
| | | 25-02-23 12:01:09[core.websocket_server] - INFO - =======ä¸é¢çå°åæ¯websocketåè®®å°åï¼è¯·å¿ç¨æµè§å¨è®¿é®======= |
| | | 25-02-23 12:01:09[core.websocket_server] - INFO - 妿³æµè¯websocket请å¯å¨digital-human模åï¼æå¼æµè§å¨äº¤äºæµè¯ |
| | | 25-02-23 12:01:09[core.websocket_server] - INFO - ======================================================= |
| | | ``` |
| | | |
| | | ç±äºä½ æ¯å
¨æ¨¡åé¨ç½²ï¼å æ¤ä½ æä¸¤ä¸ªéè¦çæ¥å£ã |
| | | |
| | | OTAæ¥å£ï¼ |
| | | ``` |
| | | http://ä½ çµèå±åç½çip:8002/xiaozhi/ota/ |
| | | ``` |
| | | |
| | | Websocketæ¥å£ï¼ |
| | | ``` |
| | | ws://ä½ çµèå±åç½çip:8000/xiaozhi/v1/ |
| | | ``` |
| | | |
| | | è¯·ä½ å¡å¿
æä»¥ä¸ä¸¤ä¸ªæ¥å£å°ååå
¥å°æºæ§å°ä¸ï¼ä»ä»¬å°ä¼å½±åwebsocketå°ååæ¾åèªå¨å级åè½ã |
| | | |
| | | 1ã使ç¨è¶
级管çåè´¦å·ï¼ç»å½æºæ§å°ï¼å¨é¡¶é¨èåæ¾å°`åæ°ç®¡ç`ï¼æ¾å°åæ°ç¼ç æ¯`server.websocket`ï¼è¾å
¥ä½ ç`Websocketæ¥å£`ã |
| | | |
| | | 2ã使ç¨è¶
级管çåè´¦å·ï¼ç»å½æºæ§å°ï¼å¨é¡¶é¨èåæ¾å°`åæ°ç®¡ç`ï¼æ¾å°æ°ç¼ç æ¯`server.ota`ï¼è¾å
¥ä½ ç`OTAæ¥å£`ã |
| | | |
| | | |
| | | æ¥ä¸æ¥ï¼ä½ å°±å¯ä»¥å¼å§æä½ä½ çesp32设å¤äºï¼ä½ å¯ä»¥`èªè¡ç¼è¯esp32åºä»¶`ä¹å¯ä»¥é
置使ç¨`è¾å¥ç¼è¯å¥½ç1.6.1以ä¸çæ¬çåºä»¶`ã两个任éä¸ä¸ª |
| | | |
| | | 1ã [ç¼è¯èªå·±çesp32åºä»¶](firmware-build.md)äºã |
| | | |
| | | 2ã [åºäºè¾å¥ç¼è¯å¥½çåºä»¶é
ç½®èªå®ä¹æå¡å¨](firmware-setting.md)äºã |
| | | |
| | | # 常è§é®é¢ |
| | | 以䏿¯ä¸äºå¸¸è§é®é¢ï¼ä¾åèï¼ |
| | | |
| | | 1ã[为ä»ä¹æè¯´çè¯ï¼å°æºè¯å«åºæ¥å¾å¤é©æãæ¥æãè±æ](./FAQ.md)<br/> |
| | | 2ã[为ä»ä¹ä¼åºç°âTTS ä»»å¡åºé æä»¶ä¸åå¨âï¼](./FAQ.md)<br/> |
| | | 3ã[TTS ç»å¸¸å¤±è´¥ï¼ç»å¸¸è¶
æ¶](./FAQ.md)<br/> |
| | | 4ã[使ç¨Wifiè½è¿æ¥èªå»ºæå¡å¨ï¼ä½æ¯4G模å¼å´æ¥ä¸ä¸](./FAQ.md)<br/> |
| | | 5ã[å¦ä½æé«å°æºå¯¹è¯ååºé度ï¼](./FAQ.md)<br/> |
| | | 6ã[æè¯´è¯å¾æ
¢ï¼åé¡¿æ¶å°æºèæ¯æ¢è¯](./FAQ.md)<br/> |
| | | ## é¨ç½²ç¸å
³æç¨ |
| | | 1ã[å¦ä½èªå¨æåæ¬é¡¹ç®ææ°ä»£ç èªå¨ç¼è¯åå¯å¨](./dev-ops-integration.md)<br/> |
| | | 2ã[å¦ä½é¨ç½²MQTTç½å
³å¼å¯MQTT+UDPåè®®](./mqtt-gateway-integration.md)<br/> |
| | | 3ã[å¦ä½ä¸Nginxéæ](https://github.com/xinnan-tech/xiaozhi-esp32-server/issues/791)<br/> |
| | | ## æå±ç¸å
³æç¨ |
| | | 1ã[å¦ä½å¼å¯ææºå·ç æ³¨åæºæ§å°](./ali-sms-integration.md)<br/> |
| | | 2ã[å¦ä½éæHomeAssistantå®ç°æºè½å®¶å±
æ§å¶](./homeassistant-integration.md)<br/> |
| | | 3ã[å¦ä½å¼å¯è§è§æ¨¡åå®ç°æç
§è¯ç©](./mcp-vision-integration.md)<br/> |
| | | 4ã[å¦ä½é¨ç½²MCPæ¥å
¥ç¹](./mcp-endpoint-enable.md)<br/> |
| | | 5ã[å¦ä½æ¥å
¥MCPæ¥å
¥ç¹](./mcp-endpoint-integration.md)<br/> |
| | | 6ã[å¦ä½å¼å¯å£°çº¹è¯å«](./voiceprint-integration.md)<br/> |
| | | 7ã[æ°é»æä»¶æºé
ç½®æå](./newsnow_plugin_config.md)<br/> |
| | | 8ã[å¤©æ°æä»¶ä½¿ç¨æå](./weather-integration.md)<br/> |
| | | ## è¯é³å
éãæ¬å°è¯é³é¨ç½²ç¸å
³æç¨ |
| | | 1ã[å¦ä½å¨æºæ§å°å
éé³è²](./huoshan-streamTTS-voice-cloning.md)<br/> |
| | | 2ã[å¦ä½é¨ç½²éæindex-ttsæ¬å°è¯é³](./index-stream-integration.md)<br/> |
| | | 3ã[å¦ä½é¨ç½²éæfish-speechæ¬å°è¯é³](./fish-speech-integration.md)<br/> |
| | | 4ã[å¦ä½é¨ç½²éæPaddleSpeechæ¬å°è¯é³](./paddlespeech-deploy.md)<br/> |
| | | ## æ§è½æµè¯æç¨ |
| | | 1ã[åç»ä»¶é度æµè¯æå](./performance_tester.md)<br/> |
| | | 2ã[宿å
¬å¼æµè¯ç»æ](https://github.com/xinnan-tech/xiaozhi-performance-research)<br/> |
| New file |
| | |
| | | # 常è§é®é¢ â |
| | | |
| | | ### 1ã为ä»ä¹æè¯´çè¯ï¼å°æºè¯å«åºæ¥å¾å¤é©æãæ¥æãè±æï¼ð°ð· |
| | | |
| | | å»ºè®®ï¼æ£æ¥ä¸ä¸`models/SenseVoiceSmall`æ¯å¦å·²ç»æ`model.pt` |
| | | æä»¶ï¼å¦ææ²¡æå°±è¦ä¸è½½ï¼æ¥çè¿é[ä¸è½½è¯é³è¯å«æ¨¡åæä»¶](Deployment.md#模åæä»¶) |
| | | |
| | | ### 2ã为ä»ä¹ä¼åºç°"TTS ä»»å¡åºé æä»¶ä¸åå¨"ï¼ð |
| | | |
| | | å»ºè®®ï¼æ£æ¥ä¸ä¸æ¯å¦æ£ç¡®ä½¿ç¨`conda` å®è£
äº`libopus`å`ffmpeg`åºã |
| | | |
| | | å¦ææ²¡æå®è£
ï¼å°±å®è£
|
| | | |
| | | ``` |
| | | conda install conda-forge::libopus |
| | | conda install conda-forge::ffmpeg |
| | | ``` |
| | | |
| | | ### 3ãTTS ç»å¸¸å¤±è´¥ï¼ç»å¸¸è¶
æ¶ â° |
| | | |
| | | 建议ï¼å¦æ `EdgeTTS` ç»å¸¸å¤±è´¥ï¼è¯·å
æ£æ¥æ¯å¦ä½¿ç¨äºä»£çï¼æ¢¯åï¼ãå¦æä½¿ç¨äºï¼è¯·å°è¯å
³é代çååè¯ï¼ |
| | | 妿ç¨çæ¯ç«å±±å¼æçè±å
TTSï¼ç»å¸¸å¤±è´¥æ¶å»ºè®®ä½¿ç¨ä»è´¹çæ¬ï¼å 为æµè¯çæ¬ä»
æ¯æ 2 个并åã |
| | | |
| | | ### 4ã使ç¨Wifiè½è¿æ¥èªå»ºæå¡å¨ï¼ä½æ¯4G模å¼å´æ¥ä¸ä¸ ð |
| | | |
| | | åå ï¼è¾å¥çåºä»¶ï¼4G模å¼éè¦ä½¿ç¨å®å
¨è¿æ¥ã |
| | | |
| | | è§£å³æ¹æ³ï¼ç®åæä¸¤ç§æ¹æ³å¯ä»¥è§£å³ãä»»éä¸ç§ï¼ |
| | | |
| | | 1ãæ¹ä»£ç ãåèè¿ä¸ªè§é¢è§£å³ https://www.bilibili.com/video/BV18MfTYoE85 |
| | | |
| | | 2ã使ç¨nginxé
ç½®sslè¯ä¹¦ãåèæç¨ https://icnt94i5ctj4.feishu.cn/docx/GnYOdMNJOoRCljx1ctecsj9cnRe |
| | | |
| | | ### 5ãå¦ä½æé«å°æºå¯¹è¯ååºéåº¦ï¼ â¡ |
| | | |
| | | æ¬é¡¹ç®é»è®¤é
ç½®ä¸ºä½ææ¬æ¹æ¡ï¼å»ºè®®åå¦è
å
使ç¨é»è®¤å
费模åï¼è§£å³"è·å¾å¨"çé®é¢ï¼åä¼å"è·å¾å¿«"ã |
| | | å¦éæåååºé度ï¼å¯å°è¯æ´æ¢åç»ä»¶ãèª`0.5.2`çæ¬èµ·ï¼é¡¹ç®æ¯ææµå¼é
ç½®ï¼ç¸æ¯æ©æçæ¬ï¼ååºé度æå约`2.5ç§`ï¼æ¾èæ¹åç¨æ·ä½éªã |
| | | |
| | | | 模ååç§° | å
¥é¨å
¨å
费设置 | æµå¼é
ç½® | |
| | | |:---:|:---:|:---:| |
| | | | ASR(è¯é³è¯å«) | FunASR(æ¬å°) | ðXunfeiStreamASR(è®¯é£æµå¼) | |
| | | | LLM(大模å) | glm-4-flash(æºè°±) | ðqwen-flash(é¿éç¾ç¼) | |
| | | | VLLM(è§è§å¤§æ¨¡å) | glm-4v-flash(æºè°±) | ðqwen3.5-flash(é¿éç¾ç¼) | |
| | | | TTS(è¯é³åæ) | EdgeTTS(微软) | ðHuoshanDoubleStreamTTS(ç«å±±æµå¼) | |
| | | | Intent(æå¾è¯å«) | function_call(彿°è°ç¨) | function_call(彿°è°ç¨) | |
| | | | Memory(è®°å¿åè½) | mem_local_short(æ¬å°çæè®°å¿ï¼ | mem_local_shortï¼æ¬å°çæè®°å¿ï¼ | |
| | | |
| | | 妿æ¨å
³å¿åç»ä»¶çèæ¶ï¼è¯·æ¥é
[å°æºåç»ä»¶æ§è½æµè¯æ¥å](https://github.com/xinnan-tech/xiaozhi-performance-research)ï¼å¯ææ¥åä¸çæµè¯æ¹æ³å¨æ¨çç¯å¢ä¸å®é
æµè¯ã |
| | | |
| | | ### 6ãæè¯´è¯å¾æ
¢ï¼åé¡¿æ¶å°æºèæ¯æ¢è¯ ð£ï¸ |
| | | |
| | | 建议ï¼å¨é
ç½®æä»¶ä¸æ¾å°å¦ä¸é¨åï¼å° `min_silence_duration_ms` çå¼è°å¤§ï¼ä¾å¦æ¹ä¸º `1000`ï¼ï¼ |
| | | |
| | | ```yaml |
| | | VAD: |
| | | SileroVAD: |
| | | threshold: 0.5 |
| | | model_dir: models/snakers4_silero-vad |
| | | min_silence_duration_ms: 700 # å¦æè¯´è¯åé¡¿è¾é¿ï¼å¯å°æ¤å¼è°å¤§ |
| | | ``` |
| | | |
| | | ### 7ãé¨ç½²ç¸å
³æç¨ |
| | | 1ã[å¦ä½è¿è¡æç®åé¨ç½²](./Deployment.md)<br/> |
| | | 2ã[å¦ä½è¿è¡å
¨æ¨¡åé¨ç½²](./Deployment_all.md)<br/> |
| | | 3ã[å¦ä½é¨ç½²MQTTç½å
³å¼å¯MQTT+UDPåè®®](./mqtt-gateway-integration.md)<br/> |
| | | 4ã[å¦ä½èªå¨æåæ¬é¡¹ç®ææ°ä»£ç èªå¨ç¼è¯åå¯å¨](./dev-ops-integration.md)<br/> |
| | | 5ã[å¦ä½ä¸Nginxéæ](https://github.com/xinnan-tech/xiaozhi-esp32-server/issues/791)<br/> |
| | | 6ã[ä¿®æ¹ä»£ç åæä¹ç¼è¯èªå·±çDockeréå](./docker-build.md)<br/> |
| | | |
| | | ### 8ãç¼è¯åºä»¶ç¸å
³æç¨ |
| | | 1ã[å¦ä½èªå·±ç¼è¯å°æºåºä»¶](./firmware-build.md)<br/> |
| | | 2ã[å¦ä½åºäºè¾å¥ç¼è¯å¥½çåºä»¶ä¿®æ¹OTAå°å](./firmware-setting.md)<br/> |
| | | 3ã[忍¡åé¨ç½²å¦ä½é
ç½®åºä»¶OTAèªå¨å级](./ota-upgrade-guide.md)<br/> |
| | | |
| | | ### 9ãæå±ç¸å
³æç¨ |
| | | 1ã[å¦ä½å¼å¯ææºå·ç æ³¨åæºæ§å°](./ali-sms-integration.md)<br/> |
| | | 2ã[å¦ä½éæHomeAssistantå®ç°æºè½å®¶å±
æ§å¶](./homeassistant-integration.md)<br/> |
| | | 3ã[å¦ä½å¼å¯è§è§æ¨¡åå®ç°æç
§è¯ç©](./mcp-vision-integration.md)<br/> |
| | | 4ã[å¦ä½é¨ç½²MCPæ¥å
¥ç¹](./mcp-endpoint-enable.md)<br/> |
| | | 5ã[å¦ä½æ¥å
¥MCPæ¥å
¥ç¹](./mcp-endpoint-integration.md)<br/> |
| | | 6ã[MCPæ¹æ³å¦ä½è·å设å¤ä¿¡æ¯](./mcp-get-device-info.md)<br/> |
| | | 7ã[å¦ä½å¼å¯å£°çº¹è¯å«](./voiceprint-integration.md)<br/> |
| | | 8ã[æ°é»æä»¶æºé
ç½®æå](./newsnow_plugin_config.md)<br/> |
| | | 9ã[ç¥è¯åºragflowéææå](./ragflow-integration.md)<br/> |
| | | 10ã[å¦ä½é¨ç½²ä¸ä¸ææº](./context-provider-integration.md)<br/> |
| | | 11ã[å¦ä½éæPowerMemæºè½è®°å¿](./powermem-integration.md)<br/> |
| | | 12ã[å¦ä½é
ç½®å¤©æ°æä»¶æ¥è¯¢å¤©æ°](./weather-integration.md)<br/> |
| | | 13ã[å¦ä½å¼å¯è®¾å¤å¼å«æä»¶](./device-call-guide.md)<br/> |
| | | 14ã[å¦ä½å¼å¯èç½æç´¢åè½](./web-search-integration.md)<br/> |
| | | |
| | | ### 10ãæ°å人ç¸å
³æç¨ |
| | | 1ã[æ°å人digital-humanå¯å¨æ¹æ³](./digital-human-wakeword.md)<br/> |
| | | 2ã[å¦ä½å¨N100è¿·ä½ ä¸»æºä¸é¨ç½²æ°å人digital-human](./all-in-one-digital-human-setup.md)<br/> |
| | | |
| | | ### 11ãè¯é³å
éãæ¬å°è¯é³é¨ç½²ç¸å
³æç¨ |
| | | 1ã[å¦ä½å¨æºæ§å°å
éé³è²](./huoshan-streamTTS-voice-cloning.md)<br/> |
| | | 2ã[å¦ä½é¨ç½²éæindex-ttsæ¬å°è¯é³](./index-stream-integration.md)<br/> |
| | | 3ã[å¦ä½é¨ç½²éæfish-speechæ¬å°è¯é³](./fish-speech-integration.md)<br/> |
| | | 4ã[å¦ä½é¨ç½²éæPaddleSpeechæ¬å°è¯é³](./paddlespeech-deploy.md)<br/> |
| | | |
| | | ### 12ãæ§è½æµè¯æç¨ |
| | | 1ã[åç»ä»¶é度æµè¯æå](./performance_tester.md)<br/> |
| | | 2ã[宿å
¬å¼æµè¯ç»æ](https://github.com/xinnan-tech/xiaozhi-performance-research)<br/> |
| | | |
| | | ### 13ãæ´å¤é®é¢ï¼å¯èç³»æä»¬åé¦ ð¬ |
| | | |
| | | å¯ä»¥å¨[issues](https://github.com/xinnan-tech/xiaozhi-esp32-server/issues)æäº¤æ¨çé®é¢ã |
| New file |
| | |
| | | # é¿éäºçä¿¡éææå |
| | | |
| | | ç»å½é¿éäºæ§å¶å°ï¼è¿å
¥âçä¿¡æå¡â页é¢ï¼https://dysms.console.aliyun.com/overview |
| | | |
| | | ## ç¬¬ä¸æ¥ æ·»å ç¾å |
| | |  |
| | |  |
| | | |
| | | 以䏿¥éª¤ï¼ä¼å¾å°ç¾åï¼è¯·æå®åå
¥å°æºæ§å°åæ°ï¼`aliyun.sms.sign_name` |
| | | |
| | | ## ç¬¬äºæ¥ æ·»å æ¨¡ç |
| | |  |
| | | |
| | | 以䏿¥éª¤ï¼ä¼å¾å°æ¨¡çcodeï¼è¯·æå®åå
¥å°æºæ§å°åæ°ï¼`aliyun.sms.sms_code_template_code` |
| | | |
| | | 注æï¼ç¾åè¦ç7ä¸ªå·¥ä½æ¥ï¼çè¿è¥åæ¥å¤æååæè½åéæåã |
| | | |
| | | 注æï¼ç¾åè¦ç7ä¸ªå·¥ä½æ¥ï¼çè¿è¥åæ¥å¤æååæè½åéæåã |
| | | |
| | | 注æï¼ç¾åè¦ç7ä¸ªå·¥ä½æ¥ï¼çè¿è¥åæ¥å¤æååæè½åéæåã |
| | | |
| | | å¯ä»¥çæ¥å¤æååï¼åç»§ç»å¾ä¸æä½ã |
| | | |
| | | ## ç¬¬ä¸æ¥ å建çä¿¡è´¦æ·åå¼éæé |
| | | |
| | | ç»å½é¿éäºæ§å¶å°ï¼è¿å
¥âè®¿é®æ§å¶â页é¢ï¼https://ram.console.aliyun.com/overview?activeTab=overview |
| | | |
| | |  |
| | |  |
| | |  |
| | |  |
| | |  |
| | | |
| | | 以䏿¥éª¤ï¼ä¼å¾å°access_key_idåaccess_key_secretï¼è¯·æå®åå
¥å°æºæ§å°åæ°ï¼`aliyun.sms.access_key_id`ã`aliyun.sms.access_key_secret` |
| | | ## ç¬¬åæ¥ å¯å¨ææºæ³¨ååè½ |
| | | |
| | | 1ãæ£å¸¸æ¥è¯´ï¼ä»¥ä¸ä¿¡æ¯é½å¡«å®åï¼ä¼æè¿ä¸ªææï¼å¦ææ²¡æï¼å¯è½ç¼ºå°äºæä¸ªæ¥éª¤ |
| | | |
| | |  |
| | | |
| | | 2ãå¼å¯å
许é管çåç¨æ·å¯æ³¨åï¼å°åæ°`server.allow_user_register`设置æ`true` |
| | | |
| | | 3ãå¼å¯ææºæ³¨ååè½ï¼å°åæ°`server.enable_mobile_register`设置æ`true` |
| | |  |
| New file |
| | |
| | | # ä¸ä½æºæ°å人é
ç½®æå |
| | | |
| | | æ¬é¡¹ç®ç¨äºå¨ x86 æ¶æè®¾å¤ï¼å¦è¿·ä½ 主æºãå·¥æ§æºãæ®éçµèçï¼ä¸é¨ç½²ä¸å¥å®æ´çæ°å人å±ç¤ºç³»ç»ï¼å®ç°ä»¥ä¸åè½ï¼ |
| | | - 弿ºèªå¨è¿å
¥ Kiosk å
¨å±æµè§å¨ï¼å±ç¤ºæå®ç½é¡µ |
| | | - åå°è¿è¡å¤éè¯æ£æµæå¡ï¼æ¯æè¯é³äº¤äº |
| | | |
| | | > **说æ**ï¼æ¬ææ¡£ä»¥ **Intel N100 è¿·ä½ ä¸»æºï¼å¤©è¹ QN10-100B4ï¼** 为ä¾è¿è¡é¨ç½²æ¼ç¤ºï¼å
¶ä» x86 设å¤å¯åèè°æ´ï¼æ³¨æç½ç»é
ç½®å声å¡è®¾å¤å·®å¼ï¼ã |
| | | |
| | | ## éç¨ç¯å¢ |
| | | |
| | | | é¡¹ç® | 说æ | |
| | | |------|------| |
| | | | 示ä¾ç¡¬ä»¶ | å¤©è¹ QN10-100B4ï¼Intel N100ï¼ | |
| | | | æä½ç³»ç» | Ubuntu 24.04 LTS (Noble Numbat) | |
| | | | 示ä¾ç¨æ· | xzï¼è¯·æ ¹æ®å®é
æ
嵿¿æ¢ï¼ | |
| | | | ç½ç» | Wi-Fi è¿æ¥ï¼åºå® IPï¼å¯æéæ¹ä¸ºæçº¿ï¼ | |
| | | |
| | | ## é¨ç½²æµç¨ |
| | | |
| | | 1. ç³»ç»åå§åï¼æ¢æºãè¿ç½ï¼ |
| | | 2. å®è£
å¾å½¢ç»ä»¶ä¸ Kiosk æµè§å¨ |
| | | 3. é
ç½®èªå¨ç»å½ä¸å¾å½¢çé¢ |
| | | 4. é¨ç½²å¤éè¯æå¡ï¼Python ç¯å¢ + 麦å
é£ï¼ |
| | | 5. ä¼å弿ºé度ä¸éèå¯å¨ä¿¡æ¯ |
| | | |
| | | --- |
| | | |
| | | |
| | | ### ç³»ç»åå§åï¼æ¢æºãè¿ç½ï¼ |
| | | |
| | | ``` |
| | | sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak |
| | | |
| | | sudo tee /etc/apt/sources.list > /dev/null <<EOF |
| | | deb http://mirrors.aliyun.com/ubuntu/ noble main restricted universe multiverse |
| | | # deb-src http://mirrors.aliyun.com/ubuntu/ noble main restricted universe multiverse |
| | | |
| | | deb http://mirrors.aliyun.com/ubuntu/ noble-security main restricted universe multiverse |
| | | # deb-src http://mirrors.aliyun.com/ubuntu/ noble-security main restricted universe multiverse |
| | | |
| | | deb http://mirrors.aliyun.com/ubuntu/ noble-updates main restricted universe multiverse |
| | | # deb-src http://mirrors.aliyun.com/ubuntu/ noble-updates main restricted universe multiverse |
| | | |
| | | deb http://mirrors.aliyun.com/ubuntu/ noble-proposed main restricted universe multiverse |
| | | # deb-src http://mirrors.aliyun.com/ubuntu/ noble-proposed main restricted universe multiverse |
| | | |
| | | deb http://mirrors.aliyun.com/ubuntu/ noble-backports main restricted universe multiverse |
| | | # deb-src http://mirrors.aliyun.com/ubuntu/ noble-backports main restricted universe multiverse |
| | | EOF |
| | | |
| | | echo 'Acquire::ForceIPv4 "true";' | sudo tee /etc/apt/apt.conf.d/99force-ipv4 |
| | | ``` |
| | | |
| | | |
| | | å®è£
ç½ç»ç®¡çå·¥å
·ï¼è¥å·²åå¨å¯å¿½ç¥ï¼ |
| | | |
| | | Bash |
| | | |
| | | ``` |
| | | sudo apt update |
| | | sudo apt install network-manager -y |
| | | sudo systemctl start NetworkManager |
| | | sudo systemctl enable NetworkManager |
| | | ``` |
| | | |
| | | |
| | | 设置wifiå¯ç ï¼åºå®ip |
| | | |
| | | > **æé**ï¼ä»¥ä¸å½ä»¤ä¸ç Wi-Fi åç§°ãå¯ç ãIP å°åå为示ä¾ï¼è¯·å¡å¿
æ¿æ¢ä¸ºä½ èªå·±çå®é
ä¿¡æ¯ã |
| | | |
| | | Bash |
| | | |
| | | ``` |
| | | sudo nmcli device wifi connect "MERCURY_1812" password "12345678" |
| | | |
| | | sudo nmcli connection modify "MERCURY_1812" ipv4.addresses "192.168.0.86/24" ipv4.gateway "192.168.0.1" ipv4.dns "8.8.8.8,114.114.114.114" ipv4.method "manual" |
| | | |
| | | sudo nmcli connection up "MERCURY_1812" |
| | | ``` |
| | | |
| | | |
| | | ### ç¬¬ä¸æ¥ï¼å®è£
æ ¸å¿å¾å½¢ç»ä»¶ä¸æµè§å¨ |
| | | |
| | | è¿éæä»¬åæâæç®ä¸»ä¹âï¼åå³ä¸è£
å¤ä½çæ¡é¢ç¯å¢ï¼å¦ GNOME/KDEï¼ï¼åªè£
åºå±é©±å¨ãæè½»éççªå£ç®¡çå¨ï¼Openboxï¼ãéèé¼ æ å·¥å
·ä»¥å Chromium æµè§å¨ã |
| | | |
| | | Bash |
| | | |
| | | ``` |
| | | sudo timedatectl set-timezone Asia/Shanghai |
| | | |
| | | |
| | | sudo apt install net-tools vim fonts-wqy-microhei fonts-wqy-zenhei alsa-utils pulseaudio -y |
| | | sudo apt install --no-install-recommends xserver-xorg x11-xserver-utils xinit openbox unclutter -y |
| | | |
| | | wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb |
| | | sudo apt install ./google-chrome-stable_current_amd64.deb -y |
| | | rm google-chrome-stable_current_amd64.deb |
| | | |
| | | sudo apt purge snapd -y |
| | | |
| | | ``` |
| | | |
| | | ### ç¬¬äºæ¥ï¼é
ç½® TTY1 弿ºå
å¯èªå¨ç»å½ |
| | | |
| | | 为äºé¿å
æå¨è¾å
¥è´¦å·å¯ç çå°´å°¬ï¼æä»¬éè¿ä¿®æ¹ systemd æå¡ï¼è®©ç³»ç»ä¸å¼æºå°±èªå¨ä»¥ `xz` ç身份ç»å½ãè¿é使ç¨ä¸é®åå
¥å½ä»¤ï¼å½»åºé¿å¼ç±äº `nano` æ `vi` æä½ä¸å½å¯¼è´çä¿å失败é®é¢ã |
| | | |
| | | **1. å建é
ç½®ç®å½ï¼** |
| | | |
| | | Bash |
| | | |
| | | ``` |
| | | sudo mkdir -p /etc/systemd/system/getty@tty1.service.d/ |
| | | ``` |
| | | |
| | | **2. åå
¥èªå¨ç»å½è§åï¼** |
| | | |
| | | Bash |
| | | |
| | | ``` |
| | | echo -e "[Service]\nExecStart=\nExecStart=-/sbin/agetty --autologin xz --noclear %I \$TERM" | sudo tee /etc/systemd/system/getty@tty1.service.d/override.conf |
| | | ``` |
| | | |
| | | **3. éè½½æå¡å¹¶è®¾ç½®é»è®¤å¯å¨ç®æ ï¼** |
| | | |
| | | Bash |
| | | |
| | | ``` |
| | | sudo systemctl daemon-reload |
| | | sudo systemctl set-default multi-user.target |
| | | ``` |
| | | |
| | | ### ç¬¬ä¸æ¥ï¼é
ç½®ç»å½åèªå¨å¯å¨å¾å½¢çé¢ |
| | | |
| | | ç³»ç»èªå¨ç»å½åé»è®¤åçå¨é»åºç½åçå½ä»¤è¡ï¼æä»¬éè¦é
ç½®èæ¬ï¼è®©å®ä¸æ¦ç»å½ç«é©¬å¯å¨ X11 å¾å½¢ç¯å¢ã |
| | | |
| | | **1. 触å `startx` çå¯å¨é»è¾ï¼** |
| | | |
| | | ç´æ¥å°è§¦å代ç 追å åå
¥ä½ ç个人ç¯å¢é
ç½®æä»¶ä¸ï¼ |
| | | |
| | | Bash |
| | | |
| | | ``` |
| | | cat << 'EOF' >> ~/.bash_profile |
| | | if [ -z "$DISPLAY" ] && [ "$(fgconsole)" -eq 1 ]; then |
| | | exec startx |
| | | fi |
| | | EOF |
| | | ``` |
| | | |
| | | **2. åè¯ `startx` å»å¯å¨ Openboxï¼** |
| | | |
| | | Bash |
| | | |
| | | ``` |
| | | echo "exec openbox-session" > ~/.xinitrc |
| | | ``` |
| | | |
| | | ### ç¬¬åæ¥ï¼é
ç½®âéå¢éå£âç Openbox 䏿µè§å¨ |
| | | |
| | | è¿æ¯ææ ¸å¿ç䏿¥ï¼å
³éå±å¹ä¼ç ãéèé¼ æ ãå
¨å±é宿µè§å¨ï¼å¹¶åä¸ä¸ªâæ»å¾ªç¯âä¿è¯æµè§å¨è¢«æå¤å
³éåä¹è½ç¬é´å¤æ´»ã |
| | | |
| | | **1. å建 Openbox é
ç½®ç®å½ï¼** |
| | | |
| | | Bash |
| | | |
| | | ``` |
| | | mkdir -p ~/.config/openbox |
| | | ``` |
| | | |
| | | **2. åå
¥èªå¯å¨èæ¬ (`autostart`)ï¼** |
| | | |
| | | å¤å¶ä»¥ä¸æ´æ®µä»£ç å¹¶å车ï¼è¿ä¼èªå¨æææä¿æ¤è§ååè¿æä»¶éï¼ï¼ |
| | | |
| | | Bash |
| | | |
| | | ``` |
| | | cat << 'EOF' > ~/.config/openbox/autostart |
| | | # å
³éå±å¹ä¿æ¤ |
| | | xset -dpms |
| | | xset s noblank |
| | | xset s off |
| | | |
| | | # éèé¼ æ |
| | | unclutter -idle 0.1 -root & |
| | | |
| | | # æ»å¾ªç¯å¯å¨ Chromiumï¼å´©æºæè¢«å
³ä¹è½ç§éå¯ï¼ |
| | | while true; do |
| | | google-chrome \ |
| | | --kiosk \ |
| | | --no-first-run \ |
| | | --no-default-browser-check \ |
| | | --disable-infobars \ |
| | | --disable-session-crashed-bubble \ |
| | | --disable-translate \ |
| | | --disable-external-intent-requests \ |
| | | --autoplay-policy=no-user-gesture-required \ |
| | | --use-fake-ui-for-media-stream \ |
| | | "https://www.douyin.com" |
| | | sleep 2 |
| | | done & |
| | | EOF |
| | | ``` |
| | | |
| | | **3. å±è½ `Alt+F4` éåºå¿«æ·é®ï¼** |
| | | |
| | | 为äºé²æ¢å«äººæä¸é®ç强è¡å
³æçªå£ï¼æä»¬æ Openbox é»è®¤çç³»ç»å¿«æ·é®å¹²æã |
| | | |
| | | Bash |
| | | |
| | | ``` |
| | | cp /etc/xdg/openbox/rc.xml ~/.config/openbox/ |
| | | sed -i '/<keybind key="A-F4">/,/<\/keybind>/d' ~/.config/openbox/rc.xml |
| | | ``` |
| | | |
| | | ### ç¬¬äºæ¥ï¼éå¯éªæ¶ææ |
| | | |
| | | 妿ææç½çº¿æä¸éè¦çå¾
ææç½ç»ä¸çº¿ï¼å¯ç¦ç¨ç½ç»çå¾
æå¡ï¼é¿å
弿ºå¡é¡¿ |
| | | |
| | | Bash |
| | | |
| | | ``` |
| | | sudo systemctl mask systemd-networkd-wait-online.service |
| | | sudo systemctl mask NetworkManager-wait-online.service |
| | | ``` |
| | | |
| | | éè弿ºä¿¡æ¯ï¼GRUBï¼ |
| | | |
| | | Bash |
| | | |
| | | ``` |
| | | sudo sed -i 's/GRUB_CMDLINE_LINUX_DEFAULT=.*/GRUB_CMDLINE_LINUX_DEFAULT="quiet loglevel=3 systemd.show_status=false vt.global_cursor_default=0"/g' /etc/default/grub |
| | | |
| | | echo 'GRUB_TIMEOUT_STYLE="hidden"' | sudo tee -a /etc/default/grub |
| | | echo 'GRUB_RECORDFAIL_TIMEOUT=0' | sudo tee -a /etc/default/grub |
| | | |
| | | sudo update-grub |
| | | ``` |
| | | |
| | | 声é³è®¾ç½®æ100%ï¼ç¶å éå¯ï¼ |
| | | |
| | | Bash |
| | | |
| | | ``` |
| | | amixer -q sset Master 100% unmute |
| | | sudo reboot |
| | | ``` |
| | | |
| | | ### é¨ç½²å¤éè¯æå¡ |
| | | |
| | | å¨ä¸ä½æºä¸é¨ç½²å¤éè¯æ£æµæå¡ï¼éè¦å®è£
Python ç¯å¢ãä¸ä¼ é¡¹ç®æä»¶ãé
ç½® Camera 麦å
é£å弿ºèªå¯ã |
| | | |
| | | #### 1. å®è£
Miniconda |
| | | |
| | | ```bash |
| | | wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh |
| | | bash Miniconda3-latest-Linux-x86_64.sh -b -p $HOME/miniconda3 |
| | | ~/miniconda3/bin/conda init bash |
| | | source ~/.bashrc |
| | | rm Miniconda3-latest-Linux-x86_64.sh |
| | | ``` |
| | | |
| | | |
| | | ç¡®ä¿ç»å½æ¶èªå¨è¿å
¥condaç¯å¢ |
| | | |
| | | ```bash |
| | | if ! grep -q '.bashrc' ~/.bash_profile; then |
| | | cat << 'EOF' >> ~/.bash_profile |
| | | |
| | | if [ -f ~/.bashrc ]; then |
| | | . ~/.bashrc |
| | | fi |
| | | EOF |
| | | fi |
| | | ``` |
| | | |
| | | |
| | | #### 2. å建 Python èæç¯å¢ |
| | | |
| | | ```bash |
| | | conda create -n test python=3.10 -y |
| | | conda activate test |
| | | ``` |
| | | |
| | | è¥åºç° Terms of Service have not been accepted éè¯¯ï¼æ§è¡ï¼ |
| | | |
| | | ```bash |
| | | conda tos accept --override-channels --channel https://repo.anaconda.com/pkgs/main |
| | | conda tos accept --override-channels --channel https://repo.anaconda.com/pkgs/r |
| | | ``` |
| | | |
| | | #### 3. ä¸ä¼ é¡¹ç®æä»¶ |
| | | |
| | | å°å¼åæºä¸ç `main/digital-human/` æ´ä¸ªç®å½ä¸ä¼ å°ä¸ä½æºç `~/digital-human/` ç®å½ï¼ |
| | | |
| | | ```bash |
| | | # å¨å¼åæºä¸æ§è¡ï¼å° <ä¸ä½æºIP> æ¿æ¢ä¸ºå®é
IPï¼ |
| | | scp -r main/digital-human/ xz@<ä¸ä½æºIP>:~/digital-human/ |
| | | ``` |
| | | |
| | | #### 4. å®è£
ç³»ç»ä¾èµ |
| | | |
| | | å¤éè¯æå¡éè¦é³é¢ééåºå ALSA PulseAudio æä»¶ï¼ |
| | | |
| | | ```bash |
| | | sudo apt install libportaudio2 portaudio19-dev libasound2-plugins -y |
| | | ``` |
| | | |
| | | #### 5. å®è£
Python ä¾èµ |
| | | |
| | | ```bash |
| | | cd ~/digital-human/wakeword_runtime |
| | | pip install numpy |
| | | pip install -r requirements.txt |
| | | ``` |
| | | |
| | | #### 6. ä¸è½½å¤éè¯æ¨¡å |
| | | |
| | | 模åæä»¶ä¸å
å«å¨é¡¹ç®ä¸ï¼éè¦åç¬ä¸è½½é
ç½®ï¼è¯¦è§ [docs/digital-human-wakeword.md](digital-human-wakeword.md) ä¸çâæ¨¡åä¸è½½âç« èã |
| | | |
| | | #### 7. ä¿®æ¹ Openbox èªå¯å¨èæ¬ |
| | | |
| | | éè¦å¨ autostart ä¸å ä¸ PulseAudio å Camera 麦å
é£é
ç½®ï¼å¹¶å° Chrome å°åæ¹ä¸ºæµè¯é¡µé¢ã |
| | | |
| | | å
确认 Camera 麦å
é£å¨ PulseAudio ä¸ç设å¤åï¼ |
| | | |
| | | ```bash |
| | | pulseaudio --start |
| | | pactl list sources short |
| | | ``` |
| | | |
| | | æ¾å°å
å« `USB_Camera` çé£ä¸è¡ï¼è®°ä¸å®æ´åç§°ï¼ä¾å¦ï¼ |
| | | |
| | | ``` |
| | | alsa_input.usb-SN0002_2K_USB_Camera_46435000_P030D00_SN0002-02.mono-fallback |
| | | ``` |
| | | |
| | | ç¶åç¨å®æ´å
容è¦ç autostartï¼å° `TARGET_MIC` æ¿æ¢ä¸ºä½ çå®é
设å¤åï¼ï¼ |
| | | |
| | | ```bash |
| | | cat << 'EOF' > ~/.config/openbox/autostart |
| | | # 1. å¯å¨å£°é³æå¡å¹¶ç¨ä½çå¾
|
| | | pulseaudio --start |
| | | sleep 1 |
| | | |
| | | # 2. éå® Camera ç麦å
é£ï¼è¯·æ¿æ¢ä¸ºä½ çå®é
设å¤åï¼ |
| | | TARGET_MIC="alsa_input.usb-SN0002_2K_USB_Camera_46435000_P030D00_SN0002-02.mono-fallback" |
| | | |
| | | # 3. 设为系ç»é»è®¤éº¦å
é£ |
| | | pactl set-default-source "$TARGET_MIC" |
| | | |
| | | # 4. è§£é¤éé³ |
| | | pactl set-source-mute "$TARGET_MIC" 0 |
| | | |
| | | # 5. é³éæå° 100% |
| | | pactl set-source-volume "$TARGET_MIC" 100% |
| | | |
| | | # --- æç®æ¡é¢ä¸æµè§å¨ç¯å¢é
ç½® --- |
| | | |
| | | # å
³éå±å¹ä¿æ¤ |
| | | xset -dpms |
| | | xset s noblank |
| | | xset s off |
| | | |
| | | # éèé¼ æ |
| | | unclutter -idle 0.1 -root & |
| | | |
| | | # æ»å¾ªç¯å¯å¨æµè§å¨ï¼å´©æºæè¢«å
³ä¹è½ç§éå¯ï¼ |
| | | while true; do |
| | | google-chrome \ |
| | | --kiosk \ |
| | | --no-first-run \ |
| | | --no-default-browser-check \ |
| | | --disable-infobars \ |
| | | --disable-session-crashed-bubble \ |
| | | --disable-translate \ |
| | | --disable-external-intent-requests \ |
| | | --autoplay-policy=no-user-gesture-required \ |
| | | --use-fake-ui-for-media-stream \ |
| | | "http://127.0.0.1:8006/index.html" |
| | | sleep 2 |
| | | done & |
| | | EOF |
| | | ``` |
| | | |
| | | #### 8. é
ç½®å¤éè¯æå¡å¼æºèªå¯ |
| | | |
| | | å建 systemd æå¡æä»¶ï¼è®©å¤éè¯æå¡å¼æºèªå¨è¿è¡ã |
| | | |
| | | å
确认å½åç¨æ·ç UIDï¼ |
| | | |
| | | ```bash |
| | | id -u $(whoami) |
| | | ``` |
| | | |
| | | ç¶åç¨æ¥å°ç UID æ¿æ¢ä¸é¢ `1000`ï¼é常第ä¸ä¸ªç¨æ·å°±æ¯ 1000ï¼ï¼ |
| | | |
| | | ```bash |
| | | sudo tee /etc/systemd/system/digital-human.service << 'EOF' |
| | | [Unit] |
| | | Description=Digital Human Runtime |
| | | After=network.target sound.target |
| | | |
| | | [Service] |
| | | Type=simple |
| | | User=xz |
| | | Environment=XDG_RUNTIME_DIR=/run/user/1000 |
| | | Environment=PULSE_SERVER=unix:/run/user/1000/pulse/native |
| | | WorkingDirectory=/home/xz/digital-human |
| | | ExecStartPre=/bin/sleep 10 |
| | | ExecStart=/home/xz/miniconda3/envs/test/bin/python start.py |
| | | Restart=on-failure |
| | | RestartSec=10 |
| | | |
| | | [Install] |
| | | WantedBy=multi-user.target |
| | | EOF |
| | | ``` |
| | | |
| | | > **éè¦è¯´æ**ï¼ |
| | | > - `User=xz` â æ¿æ¢ä¸ºä½ çå®é
ç¨æ·å |
| | | > - `/run/user/1000` â æ¿æ¢ä¸ºä½ å®é
ç UID |
| | | > - `WorkingDirectory` å `ExecStart` ä¸çè·¯å¾ â æ¿æ¢ä¸ºä½ çå®é
é¨ç½²è·¯å¾ |
| | | > - `Environment` ä¸ç PulseAudio ç¯å¢åé**å¿
é¡»ä¿ç**ï¼å¦åå¤éè¯æå¡åæµè§å¨æ æ³åæ¶ä½¿ç¨ Camera 麦å
é£ |
| | | |
| | | å¯ç¨å¹¶å¯å¨æå¡ï¼ |
| | | |
| | | ```bash |
| | | sudo systemctl daemon-reload |
| | | sudo systemctl enable digital-human |
| | | sudo systemctl start digital-human |
| | | ``` |
| | | |
| | | #### 9. å¸¸ç¨æå¡ç®¡çå½ä»¤ |
| | | |
| | | ```bash |
| | | sudo systemctl start digital-human # ç«å³å¯å¨ |
| | | sudo systemctl stop digital-human # 忢 |
| | | sudo systemctl restart digital-human # éå¯ |
| | | sudo systemctl status digital-human # æ¥çç¶æ |
| | | journalctl -u digital-human -f # æ¥ç宿¶æ¥å¿ |
| | | ``` |
| | | |
| New file |
| | |
| | | # ä¸ä¸ææºä½¿ç¨æç¨ |
| | | |
| | | ## æ¦è¿° |
| | | |
| | | `ä¸ä¸ææº`ï¼å°±æ¯ä¸ºå°æºç³»ç»æç¤ºè¯çä¸ä¸ææ·»å ãæ°æ®æºãã |
| | | |
| | | `ä¸ä¸ææº` å¨å°æºå¨å¤éé£ä¸å»ï¼è·åå¤é¨ç³»ç»çæ°æ®ï¼å¹¶å°å
¶å¨ææ³¨å
¥å°å¤§æ¨¡åçç³»ç»æç¤ºè¯ï¼System Promptï¼ä¸ã |
| | | 让å
¶åå°å¤éæ¶æç¥ä¸çæä¸ªäºç©çç¶æã |
| | | |
| | | å®åMCPãè®°å¿ææ¬è´¨çåºå«ï¼`ä¸ä¸ææº`æ¯å¼ºå¶è®©å°æºæç¥ä¸ççæ°æ®ï¼`è®°å¿(Mem)`æ¯è®©ä»ç¥éä¹åèäºä»ä¹å
容ï¼`MCP(functionc all)`æ¯å½éè¦è°ç¨æé¡¹è½å/ç¥è¯çæ¶å使ç¨è°ç¨ã |
| | | |
| | | éè¿è¿ä¸ªåè½ï¼å¨å°æºå¤éçä¸å¹é£ï¼âæç¥âå°ï¼ |
| | | - 人ä½å¥åº·ä¼ æå¨ç¶æï¼ä½æ¸©ãè¡åãè¡æ°§ç¶æçï¼ |
| | | - ä¸å¡ç³»ç»ç宿¶æ°æ®ï¼æå¡å¨è´è½½ãå¾
åæ°æ®ãè¡ç¥¨ä¿¡æ¯çï¼ |
| | | - ä»»ä½å¯ä»¥éè¿ HTTP API è·åçææ¬ä¿¡æ¯ |
| | | |
| | | **注æ**ï¼è¯¥åè½åªæ¯æ¹ä¾¿å°æºå¨å¤éçæ¶åæç¥äºç©çç¶æï¼è妿æ³è¦å°æºå¤éå宿¶è·åäºç©çç¶æï¼å»ºè®®å¨æ¤åè½ä¸åç»åMCPå·¥å
·çè°ç¨ã |
| | | |
| | | ## å·¥ä½åç |
| | | |
| | | 1. **é
ç½®æº**ï¼ç¨æ·é
ç½®ä¸ä¸ªæå¤ä¸ª HTTP API å°åã |
| | | 2. **触å请æ±**ï¼å½ç³»ç»æå»º Prompt æ¶ï¼å¦æåç°æ¨¡æ¿ä¸å
å« `{{ dynamic_context }}` å ä½ç¬¦ï¼ä¼è¯·æ±ææé
ç½®ç APIã |
| | | 3. **èªå¨æ³¨å
¥**ï¼ç³»ç»ä¼èªå¨å° API è¿åçæ°æ®æ ¼å¼å为 Markdown åè¡¨ï¼æ¿æ¢ `{{ dynamic_context }}` å ä½ç¬¦ã |
| | | |
| | | ## æ¥å£è§è |
| | | |
| | | 为äºè®©å°æºæ£ç¡®è§£ææ°æ®ï¼æ¨ç API éè¦æ»¡è¶³ä»¥ä¸è§èï¼ |
| | | |
| | | - **è¯·æ±æ¹å¼**ï¼`GET` |
| | | - **请æ±å¤´**ï¼ç³»ç»ä¼èªå¨æ·»å `device-id` åæ®µå° Request Headerã |
| | | - **ååºæ ¼å¼**ï¼å¿
é¡»è¿å JSON æ ¼å¼ï¼ä¸å
å« `code` å `data` åæ®µã |
| | | |
| | | ### ååºç¤ºä¾ |
| | | |
| | | **æ
åµ 1ï¼è¿åé®å¼å¯¹** |
| | | ```json |
| | | { |
| | | "code": 0, |
| | | "msg": "success", |
| | | "data": { |
| | | "客å
温度": "26â", |
| | | "客å
湿度": "45%", |
| | | "大é¨ç¶æ": "å·²å
³é" |
| | | } |
| | | } |
| | | ``` |
| | | *注å
¥ææï¼* |
| | | ```markdown |
| | | <context> |
| | | - **客å
温度ï¼** 26â |
| | | - **客å
湿度ï¼** 45% |
| | | - **大é¨ç¶æï¼** å·²å
³é |
| | | </context> |
| | | ``` |
| | | |
| | | **æ
åµ 2ï¼è¿åå表** |
| | | ```json |
| | | { |
| | | "code": 0, |
| | | "data": [ |
| | | "æ¨æ10个å¾
åäºé¡¹", |
| | | "å½å汽车çè¡é©¶é度æ¯100kmæ¯å°æ¶" |
| | | ] |
| | | } |
| | | ``` |
| | | *注å
¥ææï¼* |
| | | ```markdown |
| | | <context> |
| | | - æ¨æ10个å¾
åäºé¡¹ |
| | | - å½å汽车çè¡é©¶é度æ¯100kmæ¯å°æ¶ |
| | | </context> |
| | | ``` |
| | | |
| | | ## é
ç½®æå |
| | | |
| | | ### æ¹å¼ 1ï¼æºæ§å°é
ç½®ï¼å
¨æ¨¡åé¨ç½²ï¼ |
| | | |
| | | 1. ç»å½æºæ§å°ï¼è¿å
¥**è§è²é
ç½®**页é¢ã |
| | | 2. æ¾å°**ä¸ä¸ææº**é
置项ï¼ç¹å»âç¼è¾æºâæé®ï¼ã |
| | | 3. ç¹å»**æ·»å **ï¼è¾å
¥æ¨ç API å°åã |
| | | 4. 妿 API éè¦é´æï¼å¯ä»¥å¨**请æ±å¤´**é¨åæ·»å `Authorization` æå
¶ä» Headerã |
| | | 5. ä¿åé
ç½®ã |
| | | |
| | | ### æ¹å¼ 2ï¼é
ç½®æä»¶é
ç½®ï¼å模åé¨ç½²ï¼ |
| | | |
| | | ç¼è¾ `xiaozhi-server/data/.config.yaml` æä»¶ï¼æ·»å `context_providers` é
ç½®æ®µï¼ |
| | | |
| | | ```yaml |
| | | # ä¸ä¸ææºé
ç½® |
| | | context_providers: |
| | | - url: "http://api.example.com/data" |
| | | headers: |
| | | Authorization: "Bearer your-token" |
| | | - url: "http://another-api.com/data" |
| | | ``` |
| | | |
| | | ## å¯ç¨åè½ |
| | | |
| | | é»è®¤æ
åµä¸ï¼ç³»ç»çæç¤ºè¯æ¨¡æ¿æä»¶ï¼`data/.agent-base-prompt.txt`ï¼ä¸å·²ç»é¢ç½®äº `{{ dynamic_context }}` å ä½ç¬¦ï¼æ¨æ éæå¨æ·»å ã |
| | | |
| | | **示ä¾ï¼** |
| | | |
| | | ```markdown |
| | | <context> |
| | | ãéè¦ï¼ä»¥ä¸ä¿¡æ¯å·²å®æ¶æä¾ï¼æ éè°ç¨å·¥å
·æ¥è¯¢ï¼è¯·ç´æ¥ä½¿ç¨ï¼ã |
| | | - **设å¤IDï¼** {{device_id}} |
| | | - **å½åæ¶é´ï¼** {{current_time}} |
| | | ... |
| | | {{ dynamic_context }} |
| | | </context> |
| | | ``` |
| | | |
| | | **注æ**ï¼å¦ææ¨ä¸éè¦ä½¿ç¨æ¤åè½ï¼å¯ä»¥éæ©**ä¸é
置任ä½ä¸ä¸ææº**ï¼ä¹å¯ä»¥ä»æç¤ºè¯æ¨¡æ¿æä»¶ä¸**å é¤** `{{ dynamic_context }}` å ä½ç¬¦ã |
| | | |
| | | ## éå½ï¼Mock æµè¯æå¡ç¤ºä¾ |
| | | |
| | | ä¸ºäºæ¹ä¾¿æ¨æµè¯åå¼åï¼æä»¬æä¾äºä¸ä¸ªç®åç Python Mock Server èæ¬ãæ¨å¯ä»¥è¿è¡æ¤èæ¬å¨æ¬å°æ¨¡æ API æ¥å£ã |
| | | |
| | | **mock_api_server.py** |
| | | |
| | | ```python |
| | | import http.server |
| | | import socketserver |
| | | import json |
| | | from urllib.parse import urlparse, parse_qs |
| | | |
| | | # 设置端å£å· |
| | | PORT = 8081 |
| | | |
| | | class MockRequestHandler(http.server.SimpleHTTPRequestHandler): |
| | | def do_GET(self): |
| | | # è§£æè·¯å¾ååæ° |
| | | parsed_path = urlparse(self.path) |
| | | path = parsed_path.path |
| | | query = parse_qs(parsed_path.query) |
| | | |
| | | response_data = {} |
| | | status_code = 200 |
| | | |
| | | print(f"æ¶å°è¯·æ±: {path}, åæ°: {query}") |
| | | |
| | | # Case 1: 模æå¥åº·æ°æ® (è¿ååå
¸ Dict) |
| | | # è·¯å¾åæ°é£æ ¼: /health |
| | | # device_id ä» Header è·å |
| | | if path == "/health": |
| | | device_id = self.headers.get("device-id", "unknown_device") |
| | | print(f"device_id: {device_id}") |
| | | response_data = { |
| | | "code": 0, |
| | | "msg": "success", |
| | | "data": { |
| | | "æµè¯è®¾å¤ID": device_id, |
| | | "å¿ç": "80 bpm", |
| | | "è¡å": "120/80 mmHg", |
| | | "ç¶æ": "è¯å¥½" |
| | | } |
| | | } |
| | | |
| | | # Case 2: æ¨¡ææ°é»å表 (è¿åå表 List) |
| | | # æ åæ°: /news/list |
| | | elif path == "/news/list": |
| | | response_data = { |
| | | "code": 0, |
| | | "msg": "success", |
| | | "data": [ |
| | | "仿¥å¤´æ¡ï¼Python 3.14 åå¸", |
| | | "ç§ææ°é»ï¼AI 婿æ¹åçæ´»", |
| | | "æ¬å°æ°é»ï¼ææ¥æå¤§é¨ï¼è®°å¾å¸¦ä¼" |
| | | ] |
| | | } |
| | | |
| | | # Case 3: 模æå¤©æ°ç®æ¥ (è¿åå符串 String) |
| | | # æ åæ°: /weather/simple |
| | | elif path == "/weather/simple": |
| | | response_data = { |
| | | "code": 0, |
| | | "msg": "success", |
| | | "data": "仿¥æ´è½¬å¤äºï¼æ°æ¸© 20-25 度ï¼ç©ºæ°è´¨éä¼ï¼éååºè¡ã" |
| | | } |
| | | |
| | | # Case 4: 模æè®¾å¤è¯¦æ
(Query忰飿 ¼) |
| | | # 忰飿 ¼: /device/info |
| | | # device_id ä» Header è·å |
| | | elif path == "/device/info": |
| | | device_id = self.headers.get("device-id", "unknown_device") |
| | | response_data = { |
| | | "code": 0, |
| | | "msg": "success", |
| | | "data": { |
| | | "æ¥è¯¢æ¹å¼": "Headeråæ°", |
| | | "设å¤ID": device_id, |
| | | "çµé": "85%", |
| | | "åºä»¶": "v2.0.1" |
| | | } |
| | | } |
| | | |
| | | # Case 5: 404 Not Found |
| | | else: |
| | | status_code = 404 |
| | | response_data = {"error": "æ¥å£ä¸åå¨"} |
| | | |
| | | # åéååº |
| | | self.send_response(status_code) |
| | | self.send_header('Content-type', 'application/json; charset=utf-8') |
| | | self.end_headers() |
| | | self.wfile.write(json.dumps(response_data, ensure_ascii=False).encode('utf-8')) |
| | | |
| | | # å¯å¨æå¡ |
| | | # å
许å°åéç¨ï¼é²æ¢å¿«éé坿¥é |
| | | socketserver.TCPServer.allow_reuse_address = True |
| | | with socketserver.TCPServer(("", PORT), MockRequestHandler) as httpd: |
| | | print(f"==================================================") |
| | | print(f"Mock API Server å·²å¯å¨: http://localhost:{PORT}") |
| | | print(f"å¯ç¨æ¥å£å表:") |
| | | print(f"1. [åå
¸] http://localhost:{PORT}/health") |
| | | print(f"2. [å表] http://localhost:{PORT}/news/list") |
| | | print(f"3. [ææ¬] http://localhost:{PORT}/weather/simple") |
| | | print(f"4. [åæ°] http://localhost:{PORT}/device/info") |
| | | print(f"==================================================") |
| | | try: |
| | | httpd.serve_forever() |
| | | except KeyboardInterrupt: |
| | | print("\næå¡å·²åæ¢") |
| | | ``` |
| New file |
| | |
| | | # è´å¼åè
çå
¬å¼ä¿¡ |
| | | |
| | | "æ¥æ±æ°´æé¸å
ç¥ï¼æ£æ¯æ²³è±æ¬²ä¸æ¶ï¼" |
| | | |
| | | 亲ç±çæåï¼ææ¯Johnï¼æ¯ä¸åæ®éå
¬å¸éçJavaç¨åºåï¼ä»å¤©ï¼ææçæ æ¯çæçå¿æ
ï¼åçç±AIææ¯ä¸åæ°çä½ ååºè¿å°å
¬å¼ä¿¡ã |
| | | |
| | | åå¹´åæçå°å¾å¤ä¼ç§ç项ç®ï¼æ¯å¦`Dify`ã`Chat2DB`ç人工æºè½ç¸å
³ç项ç®ï¼æå¨æ³ï¼æè¦æ¯è½åä¸è¿äºé¡¹ç®å¤å¥½ï¼å¯æâæ¥å½æ é¨ï¼ç©ºæå年代ç âã |
| | | |
| | | ææ¯2025å¹´åå·å°è¾å¥å¢éçè§é¢ï¼æé常好å¥ä»æ¯æä¹å®ç°çï¼ææ³å¤å»ä»ä»¬çå端æå¡ï¼æé ä¸ä¸ªä½ææ¬æ°ç¨è´¾ç»´æ¯ãå¾å¯æç°å¨åçä½åä¾ç¶åªæ¯ä¸ä¸ªäººå·¥æºéï¼å®å¹¶åä½ã没æçµéï¼ååºå¾æ
¢ï¼bugå¾å¤ã |
| | | |
| | | è¾å¥å¢éæ¯æä»¬å¦ä¹ çå¯¹è±¡ï¼æå¾æ³æ¥æåè¾å¥å¢é䏿 ·æºè½çå°æºå端æå¡ã使¯æä¹è½çè§£è¾å¥ä¸å¼æºçå³å®ãâä¸è±ç¬æ¾ä¸æ¯æ¥ï¼ç¾è±é½æ¾æ¥æ»¡åâï¼äººå·¥æºè½éå°å¼è±çæ¶ä»£ï¼ä¹è®¸å°±å¨æä»¬è¿ä»£å®ç°ï¼æä»¬å¯ä»¥ç¨èªå·±çåæï¼å®ç°ä½ææ¬æ°ç¨è´¾ç»´æ¯ãæä¸ªäººè®¤ä¸ºï¼ä»è½å®ç°çï¼æä»¬ä¹è½å®ç°ï¼åªæ¯æ¶é´é®é¢èå·²ï¼æç§°ä¹ä¸ºâæä»¬çåç»ä¹è·¯âã |
| | | |
| | | é£ä¹è¿æ¡åç»ä¹è·¯ï¼æä»¬ä¼éå°ä»ä¹å°é¾ï¼ææ³åºè¯¥ä¸å°äºå
«åä¸é¾ãè¿ä¸è·¯å¿
ç¶ä¼åºç°åç§å¦æªï¼å½ç¶ä¹æç¥ä»æä¸å¸®å©æä»¬ï¼ä¹æäººå å
¥åç»éä¼ã |
| | | |
| | | 以ä¸å
容ï¼å¦æä½ è§å¾å¥½ç¬ã飿ä¹è§å¾é常ç幸è¿ãæè½å¤å¨ä½ 人ç3ä¸å¤å¤©éåä½ ç¬äºç§ï¼ä¹ç®æ¯ä¸ºä½ åäºä¸æ¬¡è´¡ç®ã |
| | | |
| | | æ°ç¨ä½ææ¬è´¾ç»´æ¯è¿ä¸ªæ³æ³ï¼ä¼å¤±è´¥åï¼æä¸ç¥éï¼ä½æ¯æä»¬æ®é人çä¸çï¼è¿ç§å¤±è´¥ä¸æ¯å¾å¸¸è§åï¼ |
| | | |
| | | æªæ¥ï¼æä¸ç¹æ¯å¯ä»¥ç¡®å®çï¼å°±ä¸å®ä¼æäººå®å
¨å¤å»è¾å¥å¢éçåè½ï¼å®ç°æ°ç¨ä½ææ¬è´¾ç»´æ¯ãè¿ä¸ªé¡¹ç®ä¼æ¯æä»¬åï¼ |
| | | |
| | | æå¾
ä¸ä½ æºæåè¡ï¼å
±åæªæ¥ã |
| | | |
| | | Johnï¼2025.3.11ï¼å¹¿å· |
| | | |
| | | # é å¼åè´¡ç®æå |
| | | ## 项ç®ç®æ |
| | | |
| | | 1. **æ°ç¨ä½ææ¬è´¾ç»´æ¯è§£å³æ¹æ¡** |
| | | |
| | | 2. **æºè½èå¨å¨è¾¹ç¡¬ä»¶çè§£å³æ¹æ¡** |
| | | |
| | | ## å å
¥æä»¬ |
| | | |
| | | æä»¬ç忱欢è¿å¿åéåçæåå å
¥ï¼å
±å为项ç®è´¡ç®åéãæ¨å¯å¨[è¿ä¸ªé¾æ¥](https://github.com/users/xinnan-tech/projects/3)æ¥çæä»¬è¿æè¦å®ç°çåè½ï¼åè½å表ä¸è¿æ²¡ææ´¾ç¸å
³äººåå¤ççï¼æ£æ¯æ¥éæ¨çåä¸ãå䏿¹å¼å¦ä¸ï¼ |
| | | |
| | | ### 1ãæä¸ºæ®éè´¡ç®è
|
| | | |
| | | Fork 项ç®ï¼æäº¤ PRï¼ç±å¼åè
å®¡æ ¸ååå
¥ä¸»åæ¯ã |
| | | |
| | | ### 2ãæä¸ºå¼åè
|
| | | |
| | | å½ä½ 累计æäº¤ 3 æ¬¡ææ PR åï¼å¯ä»¥è系群主ç³è¯·æä¸ºå¼åè
ï¼ç¾¤ä¸»å°éè¯·ä½ å å
¥ç¬ç«çå¼åè
群ï¼å
±åæ¢è®¨é¡¹ç®æªæ¥ã |
| | | |
| | | ## å¼åè
å¼åæµç¨ |
| | | |
| | | 1. **å建æ°åæ¯** |
| | | æ¯ä¸ªåè½ç¹è¯·ä»¥æ°åæ¯æ¹å¼å¼åï¼åæ¯åç§°åºç®æ´æäºï¼è®©äººä¸ç¼çåºæå®ç°çåè½ï¼é¿å
åè½æè½¦ã |
| | | |
| | | 2. **æäº¤ PR å®¡æ ¸** |
| | | åè½å¼å宿åï¼è¯·å¨ GitHub ä¸æäº¤ PRï¼ç±å
¶ä»å¼åè
å®¡æ ¸ï¼å®¡æ ¸éè¿ååå¹¶å
¥ä¸»åæ¯ã |
| New file |
| | |
| | | # å
¨æ¨¡åæºç é¨ç½²èªå¨åçº§æ¹æ³ |
| | | |
| | | æ¬æç¨æ¯æ¹ä¾¿å
¨æ¨¡åæºç é¨ç½²çç±å¥½è
ï¼å¦ä½éè¿èªå¨å½ä»¤ï¼èªå¨æåæºç ï¼èªå¨ç¼è¯ï¼èªå¨å¯å¨ç«¯å£è¿è¡ãå®ç°æé«æççå级系ç»ã |
| | | |
| | | æ¬é¡¹ç®çæµè¯å¹³å°`https://2662r3426b.vicp.fun`ï¼ä»å¼æ¾ä»¥æ¥å°±ä½¿ç¨äºè¯¥æ¹æ³ï¼ææè¯å¥½ã |
| | | |
| | | æç¨å¯åèBç«å主`æ¯ä¹labs`åå¸çè§é¢æç¨ï¼[ã弿ºå°æºæå¡å¨xiaozhi-serverèªå¨æ´æ°ä»¥åææ°çæ¬MCPæ¥å
¥ç¹é
ç½®ä¿å§æç¨ã](https://www.bilibili.com/video/BV15H37zHE7Q) |
| | | |
| | | # å¼å§æ¡ä»¶ |
| | | - ä½ ççµè/æå¡å¨æ¯linuxæä½ç³»ç» |
| | | - ä½ å·²ç»è·éäºæ´ä¸ªæµç¨ |
| | | - ä½ åæ¬¢è·è¿ææ°åè½ï¼ä½æ¯è§å¾æ¯æ¬¡æå¨é¨ç½²æç¹éº»ç¦ï¼æå¾
æä¸ä¸ªèªå¨æ´æ°çæ¹æ³ |
| | | |
| | | 第äºä¸ªæ¡ä»¶å¿
须满足ï¼å ä¸ºæ¬æç¨ææ¶åçæäºæä»¶ï¼JDKãNode.jsç¯å¢ãCondaç¯å¢çï¼æ¯éè¦ä½ è·éæ´ä¸ªæµç¨ææçï¼å¦æä½ 没æè·éï¼å½æè®²å°æä¸ªæä»¶çæ¶åï¼ä½ å¯è½å°±ä¸ç¥éä»ä¹ææã |
| | | |
| | | # æç¨ææ |
| | | - è§£å³å½å
ä¸è½æåææ°é¡¹ç®æºç é®é¢ |
| | | - èªå¨æå代ç ç¼è¯å端æä»¶ |
| | | - èªå¨æå代ç ç¼è¯javaæä»¶ï¼èªå¨ææ8002端å£ï¼èªå¨å¯å¨8002ç«¯å£ |
| | | - èªå¨æåpython代ç ï¼èªå¨ææ8000端å£ï¼èªå¨å¯å¨8000ç«¯å£ |
| | | |
| | | # ç¬¬ä¸æ¥ éå¥½ä½ ç项ç®ç®å½ |
| | | |
| | | ä¾å¦ï¼æè§åäºæç项ç®ç®å½æ¯ï¼è¿æ¯ä¸ä¸ªæ°å»ºç空ç½çç®å½ï¼å¦æä½ 䏿³åºéï¼å¯ä»¥åæä¸æ · |
| | | ``` |
| | | /home/system/xiaozhi |
| | | ``` |
| | | |
| | | # ç¬¬äºæ¥ å
éæ¬é¡¹ç® |
| | | æ¤å»ï¼å
è¦æ§è¡ç¬¬ä¸å¥è¯ï¼æåæºç ï¼è¿å¥å½ä»¤éç¨äºå½å
ç½ç»çæå¡å¨åçµèï¼æ éç¿»å¢ |
| | | |
| | | ``` |
| | | cd /home/system/xiaozhi |
| | | git clone https://ghproxy.net/https://github.com/xinnan-tech/xiaozhi-esp32-server.git |
| | | ``` |
| | | |
| | | æ§è¡å®åï¼ä½ ç项ç®ç®å½ä¼å¤äºä¸ä¸ªæä»¶å¤¹`xiaozhi-esp32-server`ï¼è¿ä¸ªå°±æ¯é¡¹ç®çæºç |
| | | |
| | | # ç¬¬ä¸æ¥ å¤å¶åºç¡çæä»¶ |
| | | |
| | | å¦æä½ ä¹åå·²ç»è·éäºæ´ä¸ªæµç¨ï¼å¯¹funasrçæ¨¡åæä»¶`xiaozhi-server/models/SenseVoiceSmall/model.pt`åä½ çç§æé
ç½®æä»¶`xiaozhi-server/data/.config.yaml`è¿ä¸¤ä¸ªæä»¶ä¸ä¼éçã |
| | | |
| | | æ¤å»ä½ éè¦æ`model.pt`æä»¶å¤å¶å°æ°çç®å½å»ï¼ä½ å¯ä»¥è¿æ · |
| | | ``` |
| | | # å建éè¦çç®å½ |
| | | mkdir -p /home/system/xiaozhi/xiaozhi-esp32-server/main/xiaozhi-server/data/ |
| | | |
| | | cp ä½ åæ¥ç.config.yaml宿´è·¯å¾ /home/system/xiaozhi/xiaozhi-esp32-server/main/xiaozhi-server/data/.config.yaml |
| | | cp ä½ åæ¥çmodel.pt宿´è·¯å¾ /home/system/xiaozhi/xiaozhi-esp32-server/main/xiaozhi-server/models/SenseVoiceSmall/model.pt |
| | | ``` |
| | | |
| | | # ç¬¬åæ¥ 建ç«ä¸ä¸ªèªå¨ç¼è¯æä»¶ |
| | | |
| | | ## 4.1 èªå¨ç¼è¯mananger-web模å |
| | | å¨`/home/system/xiaozhi/`ç®å½ä¸ï¼å建åå为`update_8001.sh`çæä»¶ï¼å
容å¦ä¸ |
| | | |
| | | ``` |
| | | cd /home/system/xiaozhi/xiaozhi-esp32-server |
| | | git fetch --all |
| | | git reset --hard |
| | | git pull origin main |
| | | |
| | | |
| | | cd /home/system/xiaozhi/xiaozhi-esp32-server/main/manager-web |
| | | npm install |
| | | npm run build |
| | | rm -rf /home/system/xiaozhi/manager-web |
| | | mv /home/system/xiaozhi/xiaozhi-esp32-server/main/manager-web/dist /home/system/xiaozhi/manager-web |
| | | ``` |
| | | |
| | | ä¿å好忧è¡èµæå½ä»¤ |
| | | ``` |
| | | chmod 777 update_8001.sh |
| | | ``` |
| | | æ§è¡å®åï¼ç»§ç»å¾ä¸ |
| | | |
| | | ## 4.2 èªå¨ç¼è¯è¿è¡manager-api模å |
| | | å¨`/home/system/xiaozhi/`ç®å½ä¸ï¼å建åå为`update_8002.sh`çæä»¶ï¼å
容å¦ä¸ |
| | | |
| | | ``` |
| | | cd /home/system/xiaozhi/xiaozhi-esp32-server |
| | | git pull origin main |
| | | |
| | | |
| | | cd /home/system/xiaozhi/xiaozhi-esp32-server/main/manager-api |
| | | rm -rf target |
| | | mvn clean package -Dmaven.test.skip=true |
| | | cd /home/system/xiaozhi/ |
| | | |
| | | # æ¥æ¾å ç¨8002端å£çè¿ç¨å· |
| | | PID=$(sudo netstat -tulnp | grep 8002 | awk '{print $7}' | cut -d'/' -f1) |
| | | |
| | | rm -rf /home/system/xiaozhi/xiaozhi-esp32-api.jar |
| | | mv /home/system/xiaozhi/xiaozhi-esp32-server/main/manager-api/target/xiaozhi-esp32-api.jar /home/system/xiaozhi/xiaozhi-esp32-api.jar |
| | | |
| | | # æ£æ¥æ¯å¦æ¾å°è¿ç¨å· |
| | | if [ -z "$PID" ]; then |
| | | echo "æ²¡ææ¾å°å ç¨8002端å£çè¿ç¨" |
| | | else |
| | | echo "æ¾å°å ç¨8002端å£çè¿ç¨ï¼è¿ç¨å·ä¸º: $PID" |
| | | # ææè¿ç¨ |
| | | kill -9 $PID |
| | | kill -9 $PID |
| | | echo "å·²ææè¿ç¨ $PID" |
| | | fi |
| | | |
| | | nohup java -jar xiaozhi-esp32-api.jar --spring.profiles.active=dev & |
| | | |
| | | tail tail -f nohup.out |
| | | ``` |
| | | |
| | | ä¿å好忧è¡èµæå½ä»¤ |
| | | ``` |
| | | chmod 777 update_8002.sh |
| | | ``` |
| | | æ§è¡å®åï¼ç»§ç»å¾ä¸ |
| | | |
| | | ## 4.3 èªå¨ç¼è¯è¿è¡Pythoné¡¹ç® |
| | | å¨`/home/system/xiaozhi/`ç®å½ä¸ï¼å建åå为`update_8000.sh`çæä»¶ï¼å
容å¦ä¸ |
| | | |
| | | ``` |
| | | cd /home/system/xiaozhi/xiaozhi-esp32-server |
| | | git pull origin main |
| | | |
| | | # æ¥æ¾å ç¨8000端å£çè¿ç¨å· |
| | | PID=$(sudo netstat -tulnp | grep 8000 | awk '{print $7}' | cut -d'/' -f1) |
| | | |
| | | # æ£æ¥æ¯å¦æ¾å°è¿ç¨å· |
| | | if [ -z "$PID" ]; then |
| | | echo "æ²¡ææ¾å°å ç¨8000端å£çè¿ç¨" |
| | | else |
| | | echo "æ¾å°å ç¨8000端å£çè¿ç¨ï¼è¿ç¨å·ä¸º: $PID" |
| | | # ææè¿ç¨ |
| | | kill -9 $PID |
| | | kill -9 $PID |
| | | echo "å·²ææè¿ç¨ $PID" |
| | | fi |
| | | cd main/xiaozhi-server |
| | | # åå§åcondaç¯å¢ |
| | | source ~/.bashrc |
| | | conda activate xiaozhi-esp32-server |
| | | pip install -r requirements.txt |
| | | nohup python app.py >/dev/null & |
| | | tail -f /home/system/xiaozhi/xiaozhi-esp32-server/main/xiaozhi-server/tmp/server.log |
| | | ``` |
| | | |
| | | ä¿å好忧è¡èµæå½ä»¤ |
| | | ``` |
| | | chmod 777 update_8000.sh |
| | | ``` |
| | | æ§è¡å®åï¼ç»§ç»å¾ä¸ |
| | | |
| | | # æ¥å¸¸æ´æ° |
| | | |
| | | 以ä¸çèæ¬é½å»ºç«å¥½åï¼æ¥å¸¸æ´æ°ï¼æä»¬åªè¦ä¾æ¬¡æ§è¡ä»¥ä¸å½ä»¤å°±å¯ä»¥åå°èªå¨æ´æ°åå¯å¨ |
| | | |
| | | ``` |
| | | cd /home/system/xiaozhi |
| | | # æ´æ°å¹¶å¯å¨Javaç¨åº |
| | | ./update_8001.sh |
| | | # æ´æ°webç¨åº |
| | | ./update_8002.sh |
| | | # æ´æ°å¹¶å¯å¨pythonç¨åº |
| | | ./update_8000.sh |
| | | |
| | | |
| | | # åææ³æ¥çjavaæ¥å¿ï¼æ§è¡ä»¥ä¸å½ä»¤ |
| | | tail -f nohup.out |
| | | # åææ³æ¥çpythonæ¥å¿ï¼æ§è¡ä»¥ä¸å½ä»¤ |
| | | tail -f /home/system/xiaozhi/xiaozhi-esp32-server/main/xiaozhi-server/tmp/server.log |
| | | ``` |
| | | |
| | | # 注æäºé¡¹ |
| | | æµè¯å¹³å°`https://2662r3426b.vicp.fun`ï¼æ¯ä½¿ç¨nginxåäºåå代çãnginx.conf详ç»é
ç½®å¯ä»¥[åèè¿é](https://github.com/xinnan-tech/xiaozhi-esp32-server/issues/791) |
| | | |
| | | ## 常è§é®é¢ |
| | | |
| | | ### 1ã为ä»ä¹æ²¡æè§å°8001端å£ï¼ |
| | | åçï¼8001æ¯å¼åç¯å¢ä½¿ç¨çï¼ç¨äºè¿è¡å端ç端å£ãå¦æä½ æ¯æå¡å¨é¨ç½²ï¼ä¸å»ºè®®ä½¿ç¨`npm run serve`å¯å¨8001端å£è¿è¡å端ï¼èæ¯åæ¬æç¨ä¸æ ·ç¼è¯æhtmlæä»¶ï¼ç¶å使ç¨nginxæ¥ç®¡ç访é®ã |
| | | |
| | | ### 2ãæ¯æ¬¡æ´æ°éè¦æ´æ°æå¨SQLè¯å¥åï¼ |
| | | åçï¼ä¸éè¦ï¼å 为项ç®ä½¿ç¨**Liquibase**ç®¡çæ°æ®åºçæ¬ï¼ä¼èªå¨æ§è¡æ°çsqlèæ¬ã |
| New file |
| | |
| | | # 设å¤é´ç¸äºå¼å«æä»¶ä½¿ç¨æå |
| | | |
| | | ## æ¦è¿° |
| | | |
| | | 设å¤å¼å«åè½å
许两个已é
置设å¤ä¹é´éè¿è¯é³/æ°æ®ééè¿è¡ååéä¿¡ã设å¤Aå¼å«è®¾å¤Bæ¶ï¼ç³»ç»éè¿ä»¥ä¸æµç¨å®ç°ï¼ |
| | | |
| | | ``` |
| | | 设å¤A â æææ ¡éª â MQTTç½å
³ â 设å¤Bè¿ç¨å¤é â 建ç«è¿æ¥ â éè¯å»ºç« |
| | | ``` |
| | | ## 使ç¨è¿ä¸ªåè½çåææ¡ä»¶ |
| | | 1. ä½ å¿
é¡»è¦æè³å°ä¸¤ä¸ªè®¾å¤ï¼æ¯ä¸ªè®¾å¤åå·å¿
é¡»æ¯`ESP32-S3`ï¼å ä¸ºåªæ`ESP32-S3`ææ¯æè¿ç¨å¤éåè½ã |
| | | 2. ä½ ç设å¤å¿
é¡»è¦æ`两个麦å
é£`ã使¯å¦æä½ ç设å¤åªæ`å个麦å
é£`ï¼ä½ åªæ¯æ³ä½éªä¸ä¸è¿ä¸ªåè½ï¼ä¹æ¯å¯ä»¥çï¼ä½æ¯ä¼æå¼ºççå¡é¡¿æã |
| | | 3. ä½ å¿
须使ç¨[å
¨æ¨¡åé¨ç½²](Deployment_all.md)æ¬é¡¹ç®ï¼å ä¸ºä½ éè¦`æºæ§å°`æ¥ç®¡ç设å¤çæéåéä¿¡ã |
| | | 4. ä½ å¿
é¡»å®è£
å¹¶é
置好`2026å¹´5æ27æ¥`以åç[MQTTç½å
³æå¡](mqtt-gateway-integration.md)ï¼å¦æä½ å·²ç»é¨ç½²äºMQTTç½å
³æå¡ï¼è¯·ç¡®è®¤ä»£ç ççæ¬æ¯`2026å¹´5æ27æ¥`ä¹åççæ¬ã |
| | | |
| | | 以䏿¯ä½¿ç¨è¿ä¸ªåè½çç¡¬æ§æ¡ä»¶ï¼æ¥ä¸æ¥ä¼è¯¦ç»ä»ç»ã |
| | | |
| | | ## é
ç½®æ¥éª¤ |
| | | |
| | | ### ç¬¬ä¸æ¥ï¼å¼å¯é讯å½åè½ |
| | | |
| | | 1. ç¡®è®¤ä½ çæºæ§å°çæ¬æ¯`0.9.4`æä»¥ä¸çæ¬ã |
| | | 2. ç»å½æºæ§å°åå° |
| | | 3. è¿å
¥ **ç³»ç»åè½é
ç½®** |
| | | 4. å¨å·¦ä¾§åè½å表ä¸å¾é **é讯å½** |
| | | 5. ç¹å» **ä¿åé
置** 确认 |
| | | |
| | | ### ç¬¬äºæ¥ï¼é
置设å¤é´å¼å«æé |
| | | |
| | | 1. 卿ºæ§å°é¡¶é¨èåç¹å» **é讯å½** |
| | | 2. å¨å·¦ä¾§æºè½ä½ä¸ï¼è®¾å¤å表ä¸éæ©ä½ ç设å¤Aï¼æ¯ææ MACå°å æ 夿³¨å æç´¢ï¼ |
| | | 3. å¨å³ä¾§è¯¦æ
颿¿ä¸ï¼æ¾å°ç®æ 设å¤Bçç§°å¼è®¾ç½®ï¼ä¾å¦ **"å°ç"** |
| | | 4. å¾é设å¤Bç **å¼å«æé** å¤éæ¡ |
| | | 5. ç¹å» **ä¿å** |
| | | |
| | | **ååææè¯´æï¼** å¦é设å¤Aå设å¤Bäºç¸éä¿¡ï¼å¿
é¡»å¨ä¸¤ä¾§æºæ§å°åå«é
ç½®å¯¹æ¹æéãä¾å¦ï¼ |
| | | |
| | | - å¨è®¾å¤Açé
ç½®ä¸å¾é设å¤B â 设å¤Aå¯ä¸è®¾å¤Béä¿¡ |
| | | - å¨è®¾å¤Bçé
ç½®ä¸å¾é设å¤A â 设å¤Bå¯ä¸è®¾å¤Aéä¿¡ |
| | | |
| | | ### ç¬¬ä¸æ¥ï¼å¨æºè½ä½é
置添å å¼å«å·¥å
· |
| | | |
| | | 1. 卿ºæ§å°é¡¶é¨èåç¹å» **æºè½ä½ç®¡ç** |
| | | 2. å¨ååé
置设å¤è系人çç¸å
³æºè½ä½ä¸ç¹å» **ç¼è¾è§è²** |
| | | 3. å¨å³ä¾§è¯¦æ
颿¿ä¸ï¼ç¹å» **ç¼è¾åè½** |
| | | 4. å¾é **设å¤å¼å«è®¾å¤** å·¥å
· |
| | | 5. ç¹å» **ä¿åé
置** 确认 |
| | | 6. å¨å¤ä¾§å次ç¹å» **ä¿åé
ç½®** ï¼éå³éå¯è®¾å¤ |
| | | |
| | | ### ç¬¬åæ¥ï¼åºä»¶ç«¯æ·»å è¿ç¨å¤éå·¥å
· |
| | | |
| | | 1. å¨[xiaozhi-esp32](https://github.com/78/xiaozhi-esp32) 代ç çåºç¡ä¸å¢å è¿ç¨å¤éå·¥å
·MCPï¼çæ¬æ¯æä¸º2.1.0è³2.2.6ï¼2026å¹´5æ29æ¥ççæ¬ï¼ |
| | | 2. å¨application.hæä»¶ä¸æ·»å è¿ç¨å¤é彿°å£°æ |
| | | ```cpp |
| | | void RemoteWakeup(const std::string& reason); |
| | | ``` |
| | | 3. å¨application.ccæä»¶ä¸æ·»å è¿ç¨å¤é彿° |
| | | ```cpp |
| | | void Application::RemoteWakeup(const std::string& reason){ |
| | | if (!protocol_) { |
| | | return; |
| | | } |
| | | |
| | | auto state = GetDeviceState(); |
| | | |
| | | if (state == kDeviceStateIdle) { |
| | | audio_service_.EncodeWakeWord(); |
| | | |
| | | if (!protocol_->IsAudioChannelOpened()) { |
| | | SetDeviceState(kDeviceStateConnecting); |
| | | if (!protocol_->OpenAudioChannel()) { |
| | | audio_service_.EnableWakeWordDetection(true); |
| | | return; |
| | | } |
| | | } |
| | | std::string wake_word = reason; |
| | | #if CONFIG_USE_AFE_WAKE_WORD || CONFIG_USE_CUSTOM_WAKE_WORD |
| | | // Encode and send the wake word data to the server |
| | | while (auto packet = audio_service_.PopWakeWordPacket()) { |
| | | protocol_->SendAudio(std::move(packet)); |
| | | } |
| | | // Set the chat state to wake word detected |
| | | protocol_->SendWakeWordDetected(wake_word); |
| | | SetListeningMode(aec_mode_ == kAecOff ? kListeningModeAutoStop : kListeningModeRealtime); |
| | | #else |
| | | // Set flag to play popup sound after state changes to listening |
| | | // (PlaySound here would be cleared by ResetDecoder in EnableVoiceProcessing) |
| | | play_popup_on_listening_ = true; |
| | | SetListeningMode(aec_mode_ == kAecOff ? kListeningModeAutoStop : kListeningModeRealtime); |
| | | #endif |
| | | } else if (state == kDeviceStateSpeaking) { |
| | | AbortSpeaking(kAbortReasonWakeWordDetected); |
| | | SetDeviceState(kDeviceStateIdle); |
| | | } else if (state == kDeviceStateActivating) { |
| | | SetDeviceState(kDeviceStateIdle); |
| | | } |
| | | } |
| | | ``` |
| | | 4. å¨mcp_server.ccæä»¶ä¸æ·»å è¿ç¨å¤éå·¥å
· |
| | | ```cpp |
| | | AddUserOnlyTool("self.remote_wakeup", "Remote wakeup function with configurable parameters", |
| | | PropertyList({ |
| | | Property("reason", kPropertyTypeString, "Wakeup reason"), |
| | | }), |
| | | [this](const PropertyList& properties) -> ReturnValue { |
| | | std::string reason = properties["reason"].value<std::string>(); |
| | | ESP_LOGI(TAG, "Wakeup reason=%s", reason.c_str()); |
| | | auto& app = Application::GetInstance(); |
| | | app.RemoteWakeup(reason); |
| | | return true; |
| | | ``` |
| | | 5. æç
§ [åºä»¶ç¼è¯ç§å½æå](firmware-build.md) 宿åºä»¶ç§å½ |
| | | 6. æ è®ºä½ çè®¾å¤æ¯åéº¦è¿æ¯å麦ï¼è¯·å¨ç¼è¯ç¯èï¼å¾éå¼å¯AECåè½! |
| | | 7. æ è®ºä½ çè®¾å¤æ¯åéº¦è¿æ¯å麦ï¼è¯·å¨ç¼è¯ç¯èï¼å¾éå¼å¯AECåè½! |
| | | 8. æ è®ºä½ çè®¾å¤æ¯åéº¦è¿æ¯å麦ï¼è¯·å¨ç¼è¯ç¯èï¼å¾éå¼å¯AECåè½! |
| | | |
| | | ### ç¬¬äºæ¥ï¼é
ç½®MQTTç½å
³æå¡ |
| | | |
| | | 1. é¨ç½²MQTTç½å
³æå¡ï¼åè [MQTTç½å
³éæææ¡£](mqtt-gateway-integration.md) |
| | | 2. 妿已ç»é¨ç½²è¯·ç¡®è®¤ä»£ç ççæ¬æ¯2026å¹´5æ27æ¥ççæ¬ |
| | | |
| | | ## å¼å«æµç¨è¯´æ |
| | | |
| | | åå¤ä¸¤ä¸ªè®¾å¤ï¼å¨æºæ§å°ä¸é¢é
置好é讯æéå卿ºè½ä½ä¸æ·»å å¼å«å·¥å
·ä¹åï¼å¨å
¶ä¸ä¸ä¸ªå°æºå¯¹è¯é£é对ä»è¯´ï¼âå¼å«XXXâï¼è§å¯è®¾å¤Bæ¯å¦ååºã |
| | | |
| | | ## 常è§é®é¢ |
| | | |
| | | ### Q: 设å¤B没æååºå¼å«ï¼ |
| | | |
| | | - æ£æ¥è®¾å¤Bæ¯å¦å¨çº¿ï¼æºæ§å°è®¾å¤ç¶æï¼ |
| | | - 确认设å¤Bçåºä»¶å·²æ£ç¡®éæè¿ç¨å¤éå·¥å
· |
| | | - æ£æ¥MQTTç½å
³è¿æ¥æ¯å¦æ£å¸¸ |
| | | - éªè¯ååæéé
ç½®æ¯å¦å®æ´ |
| | | |
| | | ### Q: æç¤º"æ å¼å«æé"ï¼ |
| | | |
| | | - 卿ºæ§å°ç¡®è®¤è®¾å¤Aå·²å¾é设å¤Bçå¼å«æé |
| | | - 确认é
置已ä¿åï¼éä»
ä¿®æ¹æªä¿åï¼ |
| | | |
| | | ### Q: å¦ä½ç¡®è®¤é讯å½åè½å·²å¼å¯ï¼ |
| | | |
| | | - æºæ§å°é¡¶é¨èå妿¾ç¤º"é讯å½"å
¥å£ï¼å表示已å¼å¯ |
| | | |
| | | ### Q: æå«ä»å¼å«"å¼ å±±"ï¼ä½æ¯ä»èæ¯è¯å«æ"å¼ ä¸"ï¼æä¹åï¼ |
| | | - å¯ä»¥æ¥é
ä½ ä½¿ç¨çasræå¡çææ¡£ï¼ç¡®è®¤æ¯å¦æ¯æçè¯è¯å«ã |
| | | - å¦æä½ ç¨çæ¯`FunASRServer`,å¯ä»¥å¨å®¹å¨éç`çè¯æä»¶`éæ·»å "å¼ å±±"ï¼ç¶åéå¯å®¹å¨ã |
| | | - å¦æä½ ç¨çæ¯`ç«å±±å¼æ`çæå¡ï¼å¯ä»¥å¨`ç«å±±å¼æçæ§å¶å°`éæ·»å `çè¯æä»¶`ï¼ç¶ååå°æºæ§å°ç`模åé
置页é¢`ï¼æ`çè¯æä»¶åç§°`é
ç½®å¨`ç«å±±å¼æçtts`ä¸å»ã |
| | | |
| New file |
| | |
| | | # æ°å人digital-humanå¯å¨æ¹æ³ |
| | | |
| | | ## æ¦è¿° |
| | | |
| | | æµè¯é¡µé¢éæäºåºäº **Sherpa-ONNX** çé«ç²¾åº¦è¯é³å¤éåè½ï¼æ¯æèªå®ä¹å¤éè¯å宿¶æ£æµã使ç¨è½»é级å
³é®è¯æ£æµæ¨¡åï¼æä¾æ¯«ç§çº§ååºé度ã |
| | | |
| | | ## å¤éè¯æ¨¡å |
| | | |
| | | ### 模åä¸è½½ï¼å¿
éï¼ |
| | | |
| | | **éè¦è¯´æ**: 项ç®ä¸å
嫿¨¡åæä»¶ï¼éè¦æåä¸è½½é
ç½®ã |
| | | |
| | | ### 宿¹æ¨¡åä¸è½½å°å |
| | | |
| | | - **宿¹æ¨¡åå表**: <https://csukuangfj.github.io/sherpa/onnx/kws/pretrained_models/index.html> |
| | | - **æ¨è模å**: `sherpa-onnx-kws-zipformer-wenetspeech-3.3M-2024-01-01` |
| | | |
| | | ### ä¸è½½åé
ç½®æ¥éª¤ |
| | | |
| | | #### 1. ä¸è½½æ¨¡åå
|
| | | |
| | | ```bash |
| | | # æ¹æ³1ï¼ç´æ¥ä¸è½½ï¼æ¨èï¼ |
| | | cd main/digital-human/wakeword_runtime/ |
| | | wget https://github.com/k2-fsa/sherpa-onnx/releases/download/kws-models/sherpa-onnx-kws-zipformer-wenetspeech-3.3M-2024-01-01.tar.bz2 |
| | | |
| | | # è§£å |
| | | tar xvf sherpa-onnx-kws-zipformer-wenetspeech-3.3M-2024-01-01.tar.bz2 |
| | | |
| | | # æ¹æ³2ï¼ä½¿ç¨ModelScope |
| | | pip install modelscope |
| | | python -c " |
| | | from modelscope import snapshot_download |
| | | snapshot_download('pkufool/sherpa-onnx-kws-zipformer-wenetspeech-3.3M-2024-01-01', cache_dir='./models') |
| | | " |
| | | ``` |
| | | |
| | | #### 2. é
置模åæä»¶ |
| | | |
| | | 模åå
ä¸è½½åå
å«ä»¥ä¸æä»¶ï¼ |
| | | |
| | | ``` |
| | | sherpa-onnx-kws-zipformer-wenetspeech-3.3M-2024-01-01/ |
| | | âââ encoder-epoch-12-avg-2-chunk-16-left-64.int8.onnx # é度ä¼å
|
| | | âââ encoder-epoch-12-avg-2-chunk-16-left-64.onnx |
| | | âââ encoder-epoch-99-avg-1-chunk-16-left-64.int8.onnx # é度ä¼å
|
| | | âââ encoder-epoch-99-avg-1-chunk-16-left-64.onnx # 精度ä¼å
|
| | | âââ decoder-epoch-12-avg-2-chunk-16-left-64.onnx |
| | | âââ decoder-epoch-99-avg-1-chunk-16-left-64.onnx # 精度ä¼å
|
| | | âââ joiner-epoch-12-avg-2-chunk-16-left-64.int8.onnx # é度ä¼å
|
| | | âââ joiner-epoch-12-avg-2-chunk-16-left-64.onnx |
| | | âââ joiner-epoch-99-avg-1-chunk-16-left-64.int8.onnx # é度ä¼å
|
| | | âââ joiner-epoch-99-avg-1-chunk-16-left-64.onnx # 精度ä¼å
|
| | | âââ tokens.txt # Tokenæ å°è¡¨ï¼å¿
éï¼ |
| | | âââ keywords_raw.txt # 模åå
éå¯è½é带ï¼å¯éï¼runtime ä¸ä¾èµï¼ |
| | | âââ keywords.txt # ç°æç |
| | | âââ test_wavs/ # æµè¯é³é¢ï¼å¯éï¼ |
| | | âââ configuration.json # 模åå
ä¿¡æ¯ï¼å¯éï¼ |
| | | âââ README.md # è¯´æææ¡£ï¼å¯éï¼ |
| | | ``` |
| | | |
| | | #### 3. éæ©é
ç½®æ¹æ¡ |
| | | |
| | | **æ¹æ¡ä¸ï¼ç²¾åº¦ä¼å
ï¼æ¨èï¼** |
| | | |
| | | ```bash |
| | | cd sherpa-onnx-kws-zipformer-wenetspeech-3.3M-2024-01-01 |
| | | |
| | | # å建模åç®å½ |
| | | mkdir -p ../models |
| | | |
| | | # å¤å¶ç²¾åº¦ä¼å
çepoch-99 fp32ä¸ä»¶å¥ |
| | | cp encoder-epoch-99-avg-1-chunk-16-left-64.onnx ../models/encoder.onnx |
| | | cp decoder-epoch-99-avg-1-chunk-16-left-64.onnx ../models/decoder.onnx |
| | | cp joiner-epoch-99-avg-1-chunk-16-left-64.onnx ../models/joiner.onnx |
| | | |
| | | # å¤å¶é
奿件 |
| | | cp tokens.txt ../models/tokens.txt |
| | | # keywords_raw.txt å¦ææ¨¡åå
éé带ï¼å¯èªè¡ä¿çï¼runtime ä¸ä¾èµå® |
| | | ``` |
| | | |
| | | **æ¹æ¡äºï¼é度ä¼å
** |
| | | |
| | | ```bash |
| | | cd sherpa-onnx-kws-zipformer-wenetspeech-3.3M-2024-01-01 |
| | | |
| | | # å建模åç®å½ |
| | | mkdir -p ../models |
| | | |
| | | # å¤å¶é度ä¼å
çepoch-99 int8ä¸ä»¶å¥ |
| | | cp encoder-epoch-99-avg-1-chunk-16-left-64.int8.onnx ../models/encoder.onnx |
| | | cp decoder-epoch-99-avg-1-chunk-16-left-64.onnx ../models/decoder.onnx |
| | | cp joiner-epoch-99-avg-1-chunk-16-left-64.int8.onnx ../models/joiner.onnx |
| | | |
| | | # å¤å¶é
奿件 |
| | | cp tokens.txt ../models/tokens.txt |
| | | ``` |
| | | |
| | | **注æäºé¡¹**: |
| | | |
| | | - **ä¸è¦æ··ç¨ fp32 ä¸ int8**ï¼ä¸ä¸ªæ¨¡åæä»¶å¿
é¡»ä¿æä¸è´ç精度 |
| | | - **ä¼å
éæ© epoch-99**ï¼æ¯ epoch-12 è®ç»æ´å
åï¼ç²¾åº¦æ´é« |
| | | - **å¿
éæä»¶**ï¼`encoder.onnx` + `decoder.onnx` + `joiner.onnx` + `tokens.txt` + `keywords.txt` |
| | | |
| | | ### æç»æ¨¡åæä»¶ç»æ |
| | | |
| | | é
ç½®å®æåï¼æ¨¡åæä»¶åºæ¾å¨ `wakeword_runtime/models/` ç®å½ä¸ï¼å®æ´è·¯å¾ä¸º `main/digital-human/wakeword_runtime/models/`ï¼ |
| | | |
| | | ``` |
| | | wakeword_runtime/models/ |
| | | âââ encoder.onnx # ç¼ç 卿¨¡åï¼éå½ååï¼ |
| | | âââ decoder.onnx # è§£ç 卿¨¡åï¼éå½ååï¼ |
| | | âââ joiner.onnx # è¿æ¥å¨æ¨¡åï¼éå½ååï¼ |
| | | âââ tokens.txt # æ¼é³ Token æ å°è¡¨ï¼228è¡çæ¬ï¼ |
| | | âââ keywords.txt # å
³é®è¯é
ç½®æä»¶ï¼é¦æ¬¡å¯å¨èªå¨çæï¼ |
| | | âââ keywords_raw.txt # å¯éï¼runtime ä¸ä¾èµ |
| | | ``` |
| | | |
| | | ## å¯å¨æ¹å¼ |
| | | |
| | | å¨ `main/digital-human` ç®å½æ§è¡ï¼ |
| | | |
| | | ```bash |
| | | pip install -r wakeword_runtime/requirements.txt |
| | | python start.py |
| | | ``` |
| | | |
| | | å¯å¨åé»è®¤å°åï¼ |
| | | |
| | | - 页é¢å°åï¼`http://127.0.0.1:8006/index.html` |
| | | - äºä»¶æ¡¥å°åï¼`ws://127.0.0.1:8006/wakeword-ws` |
| | | - å¥åº·æ£æ¥ï¼`http://127.0.0.1:8006/health` |
| | | |
| | | 忢æ¹å¼ï¼ |
| | | |
| | | - å¨è¿è¡ç»ç«¯æ `Ctrl+C` |
| | | - ä¼åæ¶åæ¢éæé¡µé¢æå¡ãäºä»¶æ¡¥åå¤éè¯æ£æµæµç¨ |
| | | |
| | | ## é
ç½®æä»¶è¯´æ |
| | | |
| | | é
ç½®æä»¶ä½äº [main/digital-human/wakeword_runtime/config.json](../main/digital-human/wakeword_runtime/config.json)ã |
| | | |
| | | å½å主è¦é
ç½®é¡¹ï¼ |
| | | |
| | | ```json |
| | | { |
| | | "wakeword": { |
| | | "enabled": true |
| | | }, |
| | | "model_dir": "models", |
| | | "audio": { |
| | | "input_device": null, |
| | | "sample_rate": 16000, |
| | | "channels": 1 |
| | | }, |
| | | "detector": { |
| | | "num_threads": 4, |
| | | "provider": "cpu", |
| | | "max_active_paths": 2, |
| | | "keywords_score": 1.8, |
| | | "keywords_threshold": 0.1, |
| | | "num_trailing_blanks": 1, |
| | | "cooldown_seconds": 1.5 |
| | | }, |
| | | "logging": { |
| | | "level": "INFO", |
| | | "dir": "logs", |
| | | "file": "wakeword-runtime.log" |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | ååæ®µå«ä¹ï¼ |
| | | |
| | | | åæ° | 说æ | |
| | | | --- | --- | |
| | | | `wakeword.enabled` | æ¯å¦å¯ç¨æ¬å°å¤éè¯æ£æµ | |
| | | | `model_dir` | 模ååè¯è¡¨æå¨ç®å½ | |
| | | | `audio.input_device` | 麦å
é£è¾å
¥è®¾å¤ï¼é»è®¤ä½¿ç¨ç³»ç»é»è®¤è®¾å¤ | |
| | | | `audio.sample_rate` | éæ ·çï¼é»è®¤ `16000` | |
| | | | `audio.channels` | 声鿰ï¼é»è®¤ `1` | |
| | | | `detector.num_threads` | æ£æµå¨çº¿ç¨æ° | |
| | | | `detector.provider` | æ¨ç providerï¼å½åé常为 `cpu` | |
| | | | `detector.max_active_paths` | æç´¢è·¯å¾æ° | |
| | | | `detector.keywords_score` | å
³é®è¯å¢å¼ºåæ° | |
| | | | `detector.keywords_threshold` | æ£æµéå¼ | |
| | | | `detector.num_trailing_blanks` | å°¾éç©ºç½æ°é | |
| | | | `detector.cooldown_seconds` | è¿ç»è§¦åå·å´æ¶é´ | |
| | | | `logging.level` | æ¥å¿ç级 | |
| | | | `logging.dir` | æ¥å¿ç®å½ | |
| | | | `logging.file` | æ¥å¿æä»¶å | |
| | | |
| | | ## æ¨èä½¿ç¨æµç¨ |
| | | |
| | | ### 馿¬¡ä½¿ç¨ |
| | | |
| | | 1. åå¤ `models/` ç®å½ä¸ç模åæä»¶å `tokens.txt` |
| | | 2. 确认 `models/keywords.txt` åå¨ |
| | | 3. å¨ `digital-human` ç®å½è¿è¡ `python start.py` |
| | | 4. æµè§å¨æå¼ `http://127.0.0.1:8006/index.html` |
| | | 5. è¿å
¥è®¾ç½®é¡µæ£æ¥âå¤éè¯âé
ç½® |
| | | |
| | | ### ä¿®æ¹å¤éè¯ |
| | | |
| | | 1. æå¼æ°å人页é¢è®¾ç½® |
| | | 2. åå°âå¤éè¯âé¡µç¾ |
| | | 3. ä¿®æ¹å¯ç¨ç¶ææå¤éè¯å表 |
| | | 4. ç¹å»âåºç¨å¤éè¯â |
| | | 5. æ ¹æ®æç¤ºå³å®æ¯å¦ç«å³éå¯ |
| | | |
| | | ### ç¦ç¨å¤éè¯ |
| | | |
| | | 1. å°âå¯ç¨æ¬å°å¤éè¯âæ¹æç¦ç¨ |
| | | 2. ç¹å»âåºç¨å¤éè¯â |
| | | 3. 建议ç«å³éå¯ä¸æ¬¡ |
| | | |
| | | ç¦ç¨åï¼ |
| | | |
| | | - 页é¢ä¸äºä»¶æ¡¥ä»ç¶å¯ç¨ |
| | | - å¤éè¯æ£æµä¸ä¼ç»§ç»è¿è¡ |
| New file |
| | |
| | | # æ¬å°ç¼è¯dockeréåæ¹æ³ |
| | | |
| | | ç°å¨æ¬é¡¹ç®å·²ç»ä½¿ç¨`github`ç`èªå¨ç¼è¯dockeréå`åè½ï¼å¦ææ¨æåçæ¯é¡¹ç®åè¡çéåï¼æ¨æ²¡æèªå·±ç¼è¯éåçéæ±ï¼é£å°±å¿½ç¥æ¬ææ¡£ã |
| | | |
| | | 妿æ¨ä¿®æ¹äºæºç ï¼ç¶åæ³éç¨`docker`çæ¹å¼é¨ç½²è¿è¡ï¼å¯ä»¥åç
§ä»¥ä¸æ¥éª¤æä½ï¼ |
| | | |
| | | ## 1ãç¯å¢åå¤ |
| | | |
| | | å®è£
dockerï¼ |
| | | ```bash |
| | | sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin |
| | | ``` |
| | | |
| | | ## 2ãç¼è¯éå |
| | | |
| | | å½ä½ ä¿®æ¹å¥½ä»£ç åï¼éè¦ç¼è¯æ°çéåæ¶ï¼éè¦æç
§ä»¥ä¸æ¥éª¤æä½ï¼ |
| | | |
| | | åå¤å¥½ä½ ç`ä½ çç¨æ·å`å`æ°ççæ¬å·`ã |
| | | - è¿ä¸ª`ä½ çç¨æ·å`æ¯ä½ å¨`docker hub`注åçç¨æ·åï¼ä¾å¦`xiaozhi`ãå½ç¶ï¼å¦æä½ ä¸éè¦æ¨éå°`docker hub`ï¼ä½ å¯ä»¥èªç±å®ä¹ã |
| | | - è¿ä¸ª`æ°ççæ¬å·`æ¯ä½ ç¼è¯çéåçæ¬ï¼ä¾å¦`1.2.3`ï¼ä½ å¯ä»¥æ ¹æ®éè¦èªå®ä¹æè
ä½¿ç¨æ¥ææ ¼å¼ï¼ä¾å¦`20260609`ï¼ä¸»è¦æ¯æ¹ä¾¿åç°å¨è¿è¡ççæ¬å·ååºåï¼åæ¶ä¹æ¹ä¾¿ä¸æ¬¡åå¿ä½ æ¯ä»ä¹æ¶åæå»ºçï¼ä¸è¦åç°å¨ä½ æ¬æºè¿è¡ççæ¬å·ç¸åã |
| | | |
| | | è¿å
¥`xiaozhi-esp32-server`é¡¹ç®æ ¹ç®å½ï¼ç¼è¯ server å web 两个éåï¼ |
| | | |
| | | ```bash |
| | | cd é¡¹ç®æ ¹ç®å½ |
| | | |
| | | # ç¼è¯serveréå |
| | | docker build -f Dockerfile-server -t ä½ çç¨æ·å/xiaozhi-esp32-server:æ°ççæ¬å· . |
| | | |
| | | # ç¼è¯webéå |
| | | docker build -f Dockerfile-web -t ä½ çç¨æ·å/xiaozhi-esp32-server-web:æ°ççæ¬å· . |
| | | |
| | | ``` |
| | | |
| | | ## 3ãä¿®æ¹docker-composeé
ç½® |
| | | |
| | | ```bash |
| | | cd main/xiaozhi-server |
| | | ``` |
| | | |
| | | ç¼è¾ `docker-compose_all.yml` æä»¶ï¼å°éåçæ¬æ¿æ¢ä¸ºä½ åæç¼è¯ççæ¬ï¼ |
| | | |
| | | ```yaml |
| | | services: |
| | | xiaozhi-esp32-server: |
| | | image: ä½ çç¨æ·å/xiaozhi-esp32-server:æ°ççæ¬å· # ä¿®æ¹ä¸ºä½ çéåå°å |
| | | ... |
| | | |
| | | xiaozhi-esp32-server-web: |
| | | image: ä½ çç¨æ·å/xiaozhi-esp32-server-web:æ°ççæ¬å· #ä¿®æ¹ä¸ºä½ çéåå°å |
| | | ... |
| | | ``` |
| | | |
| | | ## 4ãéå¯æå¡ |
| | | |
| | | ```bash |
| | | # 忢æ§å®¹å¨ |
| | | docker compose -f docker-compose_all.yml down |
| | | |
| | | # å¯å¨æ°å®¹å¨ |
| | | docker compose -f docker-compose_all.yml up -d |
| | | ``` |
| | | |
| | | ## 5ãéªè¯ |
| | | |
| | | æ¥çæ¥å¿ç¡®è®¤æå¡å¯å¨æ£å¸¸ï¼ |
| | | |
| | | ```bash |
| | | # æ¥çserveræ¥å¿ |
| | | docker logs -f -n 50 xiaozhi-esp32-server |
| | | |
| | | # æ¥çwebæ¥å¿ |
| | | docker logs -f -n 50 xiaozhi-esp32-server-web |
| | | ``` |
| New file |
| | |
| | | user root; |
| | | worker_processes 4; |
| | | |
| | | events { |
| | | worker_connections 1024; |
| | | } |
| | | |
| | | http { |
| | | include mime.types; |
| | | default_type application/octet-stream; |
| | | sendfile on; |
| | | keepalive_timeout 300; |
| | | client_header_timeout 180s; |
| | | client_body_timeout 180s; |
| | | client_max_body_size 1024M; |
| | | |
| | | gzip on; |
| | | gzip_buffers 32 4K; |
| | | gzip_comp_level 6; |
| | | gzip_min_length 100; |
| | | gzip_types application/javascript text/css text/xml image/jpeg image/gif image/png; |
| | | gzip_disable "MSIE [1-6]\."; |
| | | gzip_vary on; |
| | | |
| | | server { |
| | | # æ åå访é®ï¼å°±ç¨localhost |
| | | server_name localhost; |
| | | # 80ç«¯å£ |
| | | listen 8002; |
| | | |
| | | # 转åå°ç¼è¯åå°webç®å½ |
| | | location / { |
| | | root /usr/share/nginx/html; |
| | | try_files $uri $uri/ /index.html; |
| | | } |
| | | |
| | | # 转åå°manager-api |
| | | location /xiaozhi/ { |
| | | proxy_pass http://127.0.0.1:8003; |
| | | proxy_set_header Host $host; |
| | | proxy_cookie_path /manager/ /; |
| | | proxy_set_header Referer $http_referer; |
| | | proxy_set_header Cookie $http_cookie; |
| | | |
| | | proxy_connect_timeout 15; |
| | | proxy_send_timeout 15; |
| | | proxy_read_timeout 15; |
| | | |
| | | proxy_set_header X-Real-IP $remote_addr; |
| | | proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; |
| | | } |
| | | } |
| | | } |
| New file |
| | |
| | | #!/bin/bash |
| | | # å¯å¨Javaå端ï¼dockerå
çå¬8003端å£ï¼ |
| | | java -jar /app/xiaozhi-esp32-api.jar \ |
| | | --server.port=8003 \ |
| | | --spring.datasource.druid.url=${SPRING_DATASOURCE_DRUID_URL} \ |
| | | --spring.datasource.druid.username=${SPRING_DATASOURCE_DRUID_USERNAME} \ |
| | | --spring.datasource.druid.password=${SPRING_DATASOURCE_DRUID_PASSWORD} \ |
| | | --spring.data.redis.host=${SPRING_DATA_REDIS_HOST} \ |
| | | --spring.data.redis.password=${SPRING_DATA_REDIS_PASSWORD} \ |
| | | --spring.data.redis.port=${SPRING_DATA_REDIS_PORT} & |
| | | |
| | | # å¯å¨Nginxï¼åå°è¿è¡ä¿æå®¹å¨åæ´»ï¼ |
| | | nginx -g 'daemon off;' |
| New file |
| | |
| | | # esp32åºä»¶ç¼è¯ |
| | | |
| | | ## 第1æ¥ åå¤ä½ çotaå°å |
| | | |
| | | å¦æä½ ï¼ä½¿ç¨çæ¯æ¬é¡¹ç®0.3.12çæ¬ï¼ä¸ç®¡æ¯ç®åServeré¨ç½²è¿æ¯å
¨æ¨¡åé¨ç½²ï¼é½ä¼æotaå°åã |
| | | |
| | | ç±äºç®åServeré¨ç½²åå
¨æ¨¡åé¨ç½²çOTAå°å设置æ¹å¼ä¸ä¸æ ·ï¼è¯·ä½ éæ©ä¸é¢çå
·ä½æ¹å¼ï¼ |
| | | |
| | | ### å¦æä½ ç¨çæ¯ç®åServeré¨ç½² |
| | | æ¤å»ï¼è¯·ä½ ç¨æµè§å¨æå¼ä½ çotaå°åï¼ä¾å¦æçotaå°å |
| | | ``` |
| | | http://192.168.1.25:8003/xiaozhi/ota/ |
| | | ``` |
| | | 妿æ¾ç¤ºâOTAæ¥å£è¿è¡æ£å¸¸ï¼å设å¤åéçwebsocketå°åæ¯ï¼ws://xxx:8000/xiaozhi/v1/ |
| | | |
| | | ä½ å¯ä»¥å¯å¨`digital-human`模ååæå¼`index.html`æµè¯ä¸ä¸ï¼æ¯å¦è½è¿ä¸ota页é¢è¾åºçwebsocketå°åã |
| | | |
| | | å¦æè®¿é®ä¸å°ï¼ä½ éè¦å°é
ç½®æä»¶`.config.yaml`éä¿®æ¹`server.websocket`çå°åï¼éå¯ååéæ°æµè¯ï¼ç´å°`index.html`è½æ£å¸¸è®¿é®ã |
| | | |
| | | æååï¼è¯·å¾ä¸è¿è¡ç¬¬2æ¥ |
| | | |
| | | ### å¦æä½ ç¨çæ¯å
¨æ¨¡åé¨ç½² |
| | | æ¤å»ï¼è¯·ä½ ç¨æµè§å¨æå¼ä½ çotaå°åï¼ä¾å¦æçotaå°å |
| | | ``` |
| | | http://192.168.1.25:8002/xiaozhi/ota/ |
| | | ``` |
| | | |
| | | 妿æ¾ç¤ºâOTAæ¥å£è¿è¡æ£å¸¸ï¼websocketé群æ°éï¼Xâãé£å°±å¾ä¸è¿è¡2æ¥ã |
| | | |
| | | 妿æ¾ç¤ºâOTAæ¥å£è¿è¡ä¸æ£å¸¸âï¼å¤§æ¦æ¯ä½ è¿æ²¡å¨`æºæ§å°`é
ç½®`Websocket`å°åãé£å°±ï¼ |
| | | |
| | | - 1ã使ç¨è¶
级管çåç»å½æºæ§å° |
| | | |
| | | - 2ãé¡¶é¨èåç¹å»`åæ°ç®¡ç` |
| | | |
| | | - 3ãå¨åè¡¨ä¸æ¾å°`server.websocket`项ç®ï¼è¾å
¥ä½ ç`Websocket`å°åãä¾å¦æçå°±æ¯ |
| | | |
| | | ``` |
| | | ws://192.168.1.25:8000/xiaozhi/v1/ |
| | | ``` |
| | | |
| | | é
ç½®å®åï¼åä½¿ç¨æµè§å¨å·æ°ä½ çotaæ¥å£å°åï¼ççæ¯ä¸æ¯æ£å¸¸äºã妿è¿ä¸æ£å¸¸å°±ï¼å°±å次确认ä¸ä¸Websocketæ¯å¦æ£å¸¸å¯å¨ï¼æ¯å¦é
ç½®äºWebsocketå°åã |
| | | |
| | | ## 第2æ¥ é
ç½®ç¯å¢ |
| | | å
æç
§è¿ä¸ªæç¨é
置项ç®ç¯å¢[ãWindowsæå»º ESP IDF 5.3.2å¼åç¯å¢ä»¥åç¼è¯å°æºã](https://icnynnzcwou8.feishu.cn/wiki/JEYDwTTALi5s2zkGlFGcDiRknXf) |
| | | |
| | | ## 第3æ¥ æå¼é
ç½®æä»¶ |
| | | é
置好ç¼è¯ç¯å¢åï¼ä¸è½½è¾å¥iaozhi-esp32é¡¹ç®æºç ï¼ |
| | | |
| | | ä»è¿éä¸è½½è¾å¥[xiaozhi-esp32é¡¹ç®æºç ](https://github.com/78/xiaozhi-esp32)ã |
| | | |
| | | ä¸è½½åï¼æå¼`xiaozhi-esp32/main/Kconfig.projbuild`æä»¶ã |
| | | |
| | | ## 第4æ¥ ä¿®æ¹OTAå°å |
| | | |
| | | æ¾å°`OTA_URL`ç`default`çå
å®¹ï¼æ`https://api.tenclass.net/xiaozhi/ota/` |
| | | æ¹æä½ èªå·±çå°åï¼ä¾å¦ï¼æçæ¥å£å°åæ¯`http://192.168.1.25:8002/xiaozhi/ota/`ï¼å°±æå
å®¹æ¹æè¿ä¸ªã |
| | | |
| | | ä¿®æ¹åï¼ |
| | | ``` |
| | | config OTA_URL |
| | | string "Default OTA URL" |
| | | default "https://api.tenclass.net/xiaozhi/ota/" |
| | | help |
| | | The application will access this URL to check for new firmwares and server address. |
| | | ``` |
| | | ä¿®æ¹åï¼ |
| | | ``` |
| | | config OTA_URL |
| | | string "Default OTA URL" |
| | | default "http://192.168.1.25:8002/xiaozhi/ota/" |
| | | help |
| | | The application will access this URL to check for new firmwares and server address. |
| | | ``` |
| | | |
| | | ## 第4æ¥ è®¾ç½®ç¼è¯åæ° |
| | | |
| | | 设置ç¼è¯åæ° |
| | | |
| | | ``` |
| | | # ç»ç«¯å½ä»¤è¡è¿å
¥xiaozhi-esp32çæ ¹ç®å½ |
| | | cd xiaozhi-esp32 |
| | | # ä¾å¦æä½¿ç¨çæ¿åæ¯esp32s3ï¼æä»¥è®¾ç½®ç¼è¯ç®æ 为esp32s3ï¼å¦æä½ çæ¿åæ¯å
¶ä»åå·ï¼è¯·æ¿æ¢æå¯¹åºçåå· |
| | | idf.py set-target esp32s3 |
| | | # è¿å
¥èåé
ç½® |
| | | idf.py menuconfig |
| | | ``` |
| | | |
| | | è¿å
¥èåé
ç½®åï¼åè¿å
¥`Xiaozhi Assistant`ï¼å°`BOARD_TYPE`è®¾ç½®ä½ æ¿åçå
·ä½åå· |
| | | ä¿åéåºï¼åå°ç»ç«¯å½ä»¤è¡ã |
| | | |
| | | ## 第5æ¥ ç¼è¯åºä»¶ |
| | | |
| | | ``` |
| | | idf.py build |
| | | ``` |
| | | |
| | | ## 第6æ¥ æå
binåºä»¶ |
| | | |
| | | ``` |
| | | cd scripts |
| | | python release.py |
| | | ``` |
| | | |
| | | ä¸é¢çæå
å½ä»¤æ§è¡å®æåï¼ä¼å¨é¡¹ç®æ ¹ç®å½ä¸ç`build`ç®å½ä¸çæåºä»¶æä»¶`merged-binary.bin`ã |
| | | è¿ä¸ª`merged-binary.bin`å°±æ¯è¦ç§å½å°ç¡¬ä»¶ä¸çåºä»¶æä»¶ã |
| | | |
| | | 注æï¼å¦ææ§è¡å°ç¬¬äºå½ä»¤åï¼æ¥äºâzipâç¸å
³çé误ï¼è¯·å¿½ç¥è¿ä¸ªé误ï¼åªè¦`build`ç®å½ä¸çæåºä»¶æä»¶`merged-binary.bin` |
| | | ï¼å¯¹ä½ 没æå¤ªå¤§å½±åï¼è¯·ç»§ç»ã |
| | | |
| | | ## 第7æ¥ ç§å½åºä»¶ |
| | | å°esp32设å¤è¿æ¥çµèï¼ä½¿ç¨chromeæµè§å¨ï¼æå¼ä»¥ä¸ç½å |
| | | |
| | | ``` |
| | | https://espressif.github.io/esp-launchpad/ |
| | | ``` |
| | | |
| | | æå¼è¿ä¸ªæç¨ï¼[Flashå·¥å
·/Web端ç§å½åºä»¶ï¼æ IDFå¼åç¯å¢ï¼](https://ccnphfhqs21z.feishu.cn/wiki/Zpz4wXBtdimBrLk25WdcXzxcnNS)ã |
| | | ç¿»å°ï¼`æ¹å¼äºï¼ESP-Launchpad æµè§å¨WEB端ç§å½`ï¼ä»`3. ç§å½åºä»¶/ä¸è½½å°å¼åæ¿`å¼å§ï¼æç
§æç¨æä½ã |
| | | |
| | | ç§å½æåä¸èç½æååï¼éè¿å¤éè¯å¤éå°æºï¼çæserver端è¾åºçæ§å¶å°ä¿¡æ¯ã |
| | | |
| | | ## 常è§é®é¢ |
| | | 以䏿¯ä¸äºå¸¸è§é®é¢ï¼ä¾åèï¼ |
| | | |
| | | [1ã为ä»ä¹æè¯´çè¯ï¼å°æºè¯å«åºæ¥å¾å¤é©æãæ¥æãè±æ](./FAQ.md) |
| | | |
| | | [2ã为ä»ä¹ä¼åºç°âTTS ä»»å¡åºé æä»¶ä¸åå¨âï¼](./FAQ.md) |
| | | |
| | | [3ãTTS ç»å¸¸å¤±è´¥ï¼ç»å¸¸è¶
æ¶](./FAQ.md) |
| | | |
| | | [4ã使ç¨Wifiè½è¿æ¥èªå»ºæå¡å¨ï¼ä½æ¯4G模å¼å´æ¥ä¸ä¸](./FAQ.md) |
| | | |
| | | [5ãå¦ä½æé«å°æºå¯¹è¯ååºé度ï¼](./FAQ.md) |
| | | |
| | | [6ãæè¯´è¯å¾æ
¢ï¼åé¡¿æ¶å°æºèæ¯æ¢è¯](./FAQ.md) |
| | | |
| | | [7ãææ³éè¿å°æºæ§å¶çµç¯ã空è°ãè¿ç¨å¼å
³æºçæä½](./FAQ.md) |
| New file |
| | |
| | | # åºäºè¾å¥ç¼è¯å¥½çåºä»¶é
ç½®èªå®ä¹æå¡å¨ |
| | | |
| | | ## 第1æ¥ ç¡®è®¤çæ¬ |
| | | ç§å½è¾å¥å·²ç»ç¼è¯å¥½ç[1.6.1çæ¬ä»¥ä¸åºä»¶](https://github.com/78/xiaozhi-esp32/releases) |
| | | |
| | | ## 第2æ¥ åå¤ä½ çotaå°å |
| | | å¦æä½ æç
§æç¨ä½¿ç¨çæ¯å
¨æ¨¡åé¨ç½²ï¼å°±åºè¯¥ä¼æotaå°åã |
| | | |
| | | æ¤å»ï¼è¯·ä½ ç¨æµè§å¨æå¼ä½ çotaå°åï¼ä¾å¦æçotaå°å |
| | | ``` |
| | | https://2662r3426b.vicp.fun/xiaozhi/ota/ |
| | | ``` |
| | | |
| | | 妿æ¾ç¤ºâOTAæ¥å£è¿è¡æ£å¸¸ï¼websocketé群æ°éï¼Xâãé£å°±å¾ä¸ã |
| | | |
| | | 妿æ¾ç¤ºâOTAæ¥å£è¿è¡ä¸æ£å¸¸âï¼å¤§æ¦æ¯ä½ è¿æ²¡å¨`æºæ§å°`é
ç½®`Websocket`å°åãé£å°±ï¼ |
| | | |
| | | - 1ã使ç¨è¶
级管çåç»å½æºæ§å° |
| | | |
| | | - 2ãé¡¶é¨èåç¹å»`åæ°ç®¡ç` |
| | | |
| | | - 3ãå¨åè¡¨ä¸æ¾å°`server.websocket`项ç®ï¼è¾å
¥ä½ ç`Websocket`å°åãä¾å¦æçå°±æ¯ |
| | | |
| | | ``` |
| | | wss://2662r3426b.vicp.fun/xiaozhi/v1/ |
| | | ``` |
| | | |
| | | é
ç½®å®åï¼åä½¿ç¨æµè§å¨å·æ°ä½ çotaæ¥å£å°åï¼ççæ¯ä¸æ¯æ£å¸¸äºã妿è¿ä¸æ£å¸¸å°±ï¼å°±å次确认ä¸ä¸Websocketæ¯å¦æ£å¸¸å¯å¨ï¼æ¯å¦é
ç½®äºWebsocketå°åã |
| | | |
| | | ## 第3æ¥ è¿å
¥é
ç½æ¨¡å¼ |
| | | è¿å
¥æºå¨çé
ç½æ¨¡å¼ï¼å¨é¡µé¢é¡¶é¨ï¼ç¹å»âé«çº§é项âï¼å¨éé¢è¾å
¥ä½ æå¡å¨ç`ota`å°åï¼ç¹å»ä¿åãéå¯è®¾å¤ |
| | |  |
| | | |
| | | ## 第4æ¥ å¤éå°æºï¼æ¥çæ¥å¿è¾åº |
| | | |
| | | å¤éå°æºï¼ççæ¥å¿æ¯ä¸æ¯æ£å¸¸è¾åºã |
| | | |
| | | |
| | | ## 常è§é®é¢ |
| | | 以䏿¯ä¸äºå¸¸è§é®é¢ï¼ä¾åèï¼ |
| | | |
| | | [1ã为ä»ä¹æè¯´çè¯ï¼å°æºè¯å«åºæ¥å¾å¤é©æãæ¥æãè±æ](./FAQ.md) |
| | | |
| | | [2ã为ä»ä¹ä¼åºç°âTTS ä»»å¡åºé æä»¶ä¸åå¨âï¼](./FAQ.md) |
| | | |
| | | [3ãTTS ç»å¸¸å¤±è´¥ï¼ç»å¸¸è¶
æ¶](./FAQ.md) |
| | | |
| | | [4ã使ç¨Wifiè½è¿æ¥èªå»ºæå¡å¨ï¼ä½æ¯4G模å¼å´æ¥ä¸ä¸](./FAQ.md) |
| | | |
| | | [5ãå¦ä½æé«å°æºå¯¹è¯ååºé度ï¼](./FAQ.md) |
| | | |
| | | [6ãæè¯´è¯å¾æ
¢ï¼åé¡¿æ¶å°æºèæ¯æ¢è¯](./FAQ.md) |
| | | |
| | | [7ãææ³éè¿å°æºæ§å¶çµç¯ã空è°ãè¿ç¨å¼å
³æºçæä½](./FAQ.md) |
| New file |
| | |
| | | ç»å½AutoDLï¼ç§èµéå |
| | | éæ©éå: |
| | | ``` |
| | | PyTorch / 2.1.0 / 3.10(ubuntu22.04) / cuda 12.1 |
| | | ``` |
| | | |
| | | æºå¨å¼æºåï¼è®¾ç½®å¦æ¯å é |
| | | ``` |
| | | source /etc/network_turbo |
| | | ``` |
| | | |
| | | è¿å
¥å·¥ä½ç®å½ |
| | | ``` |
| | | cd autodl-tmp/ |
| | | ``` |
| | | |
| | | æåé¡¹ç® |
| | | ``` |
| | | git clone https://gitclone.com/github.com/fishaudio/fish-speech.git ; cd fish-speech |
| | | ``` |
| | | |
| | | å®è£
ä¾èµ |
| | | ``` |
| | | pip install -e. |
| | | ``` |
| | | |
| | | 妿æ¥éï¼å®è£
portaudio |
| | | ``` |
| | | apt-get install portaudio19-dev -y |
| | | ``` |
| | | |
| | | å®è£
åæ§è¡ |
| | | ``` |
| | | pip install torch==2.3.1 torchvision==0.18.1 torchaudio==2.3.1 --index-url https://download.pytorch.org/whl/cu121 |
| | | ``` |
| | | |
| | | ä¸è½½æ¨¡å |
| | | ``` |
| | | cd tools |
| | | python download_models.py |
| | | ``` |
| | | |
| | | ä¸è½½å®æ¨¡ååè¿è¡æ¥å£ |
| | | ``` |
| | | python -m tools.api_server --listen 0.0.0.0:6006 |
| | | ``` |
| | | |
| | | ç¶åç¨æµè§å¨å»å°aotodlå®ä¾é¡µé¢ |
| | | ``` |
| | | https://autodl.com/console/instance/list |
| | | ``` |
| | | |
| | | å¦ä¸å¾ç¹å»ä½ åææºå¨ç`èªå®ä¹æå¡`æé®ï¼å¼å¯ç«¯å£è½¬åæå¡ |
| | |  |
| | | |
| | | 端å£è½¬åæå¡è®¾ç½®å®æåï¼ä½ æ¬å°çµèæå¼ç½å`http://localhost:6006/`ï¼å°±å¯ä»¥è®¿é®fish-speechçæ¥å£äº |
| | |  |
| | | |
| | | |
| | | å¦æä½ æ¯å模åé¨ç½²ï¼æ ¸å¿é
ç½®å¦ä¸ |
| | | ``` |
| | | selected_module: |
| | | TTS: FishSpeech |
| | | TTS: |
| | | FishSpeech: |
| | | reference_audio: ["config/assets/wakeup_words.wav",] |
| | | reference_text: ["åå°åï¼ææ¯å°æºå¦ï¼å£°é³å¥½å¬çå°æ¹¾å¥³å©ä¸æï¼è¶
å¼å¿è®¤è¯ä½ è¶ï¼æè¿å¨å¿å¥ï¼å«å¿äºç»ææ¥ç¹æè¶£çæå¦ï¼æè¶
ç±å¬å
«å¦çå¦",] |
| | | api_key: "123" |
| | | api_url: "http://127.0.0.1:6006/v1/tts" |
| | | ``` |
| | | |
| | | ç¶åéå¯æå¡ |
| New file |
| | |
| | | # å°æºESP32-弿ºæå¡ç«¯ä¸HomeAssistantéææå |
| | | |
| | | [TOC] |
| | | |
| | | ----- |
| | | |
| | | ## ç®ä» |
| | | |
| | | æ¬ææ¡£å°æå¯¼æ¨å¦ä½å°ESP32设å¤ä¸HomeAssistantè¿è¡éæã |
| | | |
| | | ## åææ¡ä»¶ |
| | | |
| | | - å·²å®è£
å¹¶é
置好`HomeAssistant` |
| | | - æ¬æ¬¡æéæ©çæ¨¡åæ¯ï¼å
è´¹çChatGLMï¼å®æ¯æfunctioncall彿°è°ç¨ |
| | | |
| | | ## å¼å§åçæä½ï¼å¿
è¦ï¼ |
| | | |
| | | ### 1. è·åHAçç½ç»ç½ç»å°åä¿¡æ¯ |
| | | |
| | | 请访é®ä½ Home Assistantçç½ç»å°åï¼ä¾å¦ï¼æçHAçå°åæ¯192.168.4.7ï¼ç«¯å£åæ¯é»è®¤ç8123ï¼å卿µè§å¨æå¼ |
| | | |
| | | ``` |
| | | http://192.168.4.7:8123 |
| | | ``` |
| | | |
| | | > æå¨æ¥è¯¢ HA ç IP å°åæ¹æ³**ï¼ä»
éå°æºesp32-serveråHAé¨ç½²å¨åä¸ä¸ªç½ç»è®¾å¤[ä¾å¦åä¸ä¸ªwifi]ä¸ï¼**ï¼ |
| | | > |
| | | > 1. è¿å
¥ Home Assistantï¼å端ï¼ã |
| | | > |
| | | > 2. ç¹å»å·¦ä¸è§ **设置ï¼Settingsï¼** â **ç³»ç»ï¼Systemï¼** â **ç½ç»ï¼Networkï¼**ã |
| | | > |
| | | > 3. æ»å°æåºé¨`Home Assistant ç½å(Home Assistant website)`åºåï¼å¨`æ¬å°ç½ç»(local network)`ä¸ï¼ç¹å»`ç¼ç`æé®ï¼å¯ä»¥çå°å½å使ç¨ç IP å°åï¼å¦ `192.168.1.10`ï¼åç½ç»æ¥å£ãç¹å»`å¤å¶è¿æ¥(copy link)`å¯ä»¥ç´æ¥å¤å¶ã |
| | | > |
| | | >  |
| | | |
| | | æï¼æ¨å·²ç»è®¾ç½®äºç´æ¥å¯ä»¥è®¿é®çHome AssistantçOAuthå°åï¼æ¨ä¹å¯ä»¥å¨æµè§å¨å
ç´æ¥è®¿é® |
| | | |
| | | ``` |
| | | http://homeassistant.local:8123 |
| | | ``` |
| | | |
| | | ### 2. ç»å½`Home Assistant`æ¿å°å¼åå¯é¥ |
| | | |
| | | ç»å½`HomeAssistant`ï¼ç¹å»`å·¦ä¸è§å¤´å -> 个人`ï¼åæ¢`å®å
¨`å¯¼èªæ ï¼åå°åºé¨`é¿æè®¿é®ä»¤ç`çæapi_keyï¼å¹¶å¤å¶ä¿åï¼åç»çæ¹æ³é½éè¦ä½¿ç¨è¿ä¸ªapi keyä¸ä»
åºç°ä¸æ¬¡ï¼å°tips: æ¨å¯ä»¥ä¿åçæçäºç»´ç å¾åï¼åç»å¯ä»¥æ«æäºç»´ç 忤æåapi keyï¼ã |
| | | |
| | | ## æ¹æ³1ï¼å°æºç¤¾åºå
±å»ºçHAè°ç¨åè½ |
| | | |
| | | ### åè½æè¿° |
| | | |
| | | - 妿¨åç»éè¦å¢å æ°ç设å¤ï¼è¯¥æ¹æ³éè¦æå¨éå¯`xiaozhi-esp32-serveræå¡ç«¯`ä»¥æ¤æ´æ°è®¾å¤ä¿¡æ¯**ï¼éè¦**ï¼ã |
| | | |
| | | - éè¦æ¨ç¡®ä¿å·²ç»å¨HomeAssistantä¸éæ`Xiaomi Home`ï¼å¹¶å°ç±³å®¶ç设å¤å¯¼å
¥è¿`HomeAssistant`ã |
| | | |
| | | - éè¦æ¨ç¡®ä¿`xiaozhi-esp32-serveræºæ§å°`è½æ£å¸¸ä½¿ç¨ã |
| | | |
| | | - æç`xiaozhi-esp32-serveræºæ§å°`å`HomeAssistant`é¨ç½²å¨åä¸å°æºå¨çå¦ä¸ä¸ªç«¯å£ï¼çæ¬æ¯`0.3.10` |
| | | |
| | | ``` |
| | | http://192.168.4.7:8002 |
| | | ``` |
| | | |
| | | |
| | | ### é
ç½®æ¥éª¤ |
| | | |
| | | #### 1. ç»å½`HomeAssistant`æ´çéè¦æ§å¶çè®¾å¤æ¸
å |
| | | |
| | | ç»å½`HomeAssistant`ï¼ç¹å»`å·¦ä¸è§ç设置`ï¼ç¶åè¿å
¥`设å¤ä¸æå¡`ï¼åç¹å»é¡¶é¨ç`å®ä½`ã |
| | | |
| | | ç¶åå¨å®ä½ä¸æç´¢ä½ ç¸å
³æ§å¶çå¼å
³ï¼ç»æåºæ¥åï¼å¨å表ä¸ï¼ç¹å»å
¶ä¸ä¸ä¸ªç»æï¼è¿æ¯ä¼åºç°ä¸ä¸ªå¼å
³ççé¢ã |
| | | |
| | | å¨å¼å
³ççé¢ï¼æä»¬å°è¯ç¹å»å¼å
³ï¼ççæ¯å¼åä¼éçæä»¬çç¹å»å¼/å
³ãå¦æè½æä½ï¼è¯´ææ¯æ£å¸¸èç½çã |
| | | |
| | | æ¥çå¨å¼å
³é¢æ¿æ¾å°è®¾ç½®æé®ï¼ç¹å»åï¼å¯ä»¥æ¥çè¿ä¸ªå¼å
³ç`å®ä½æ è¯ç¬¦`ã |
| | | |
| | | æä»¬æå¼ä¸ä¸ªè®°äºæ¬ï¼æç
§è¿æ ·æ ¼å¼æ´ç䏿¡æ°æ®ï¼ |
| | | |
| | | ä½ç½®+è±æéå·+设å¤åç§°+è±æéå·+`å®ä½æ è¯ç¬¦`+è±æåå· |
| | | |
| | | ä¾å¦ï¼æå¨å
¬å¸ï¼ææä¸ä¸ªç©å
·ç¯ï¼ä»çæ è¯ç¬¦æ¯switch.cuco_cn_460494544_cp1_on_p_2_1ï¼é£ä¹å°±è¿ä¸ªåè¿ä¸æ¡æ°æ® |
| | | |
| | | ``` |
| | | å
¬å¸,ç©å
·ç¯,switch.cuco_cn_460494544_cp1_on_p_2_1; |
| | | ``` |
| | | |
| | | å½ç¶æåæå¯è½è¦æä½ä¸¤ä¸ªç¯ï¼æçæç»çç»ææ¯ï¼ |
| | | |
| | | ``` |
| | | å
¬å¸,ç©å
·ç¯,switch.cuco_cn_460494544_cp1_on_p_2_1; |
| | | å
¬å¸,å°ç¯,switch.iot_cn_831898993_socn1_on_p_2_1; |
| | | ``` |
| | | |
| | | è¿æ®µåç¬¦ï¼æä»¬ç§°ä¸ºâè®¾å¤æ¸
åå符âéè¦ä¿å好ï¼çä¸ä¸æç¨ã |
| | | |
| | | #### 2. ç»å½`æºæ§å°` |
| | | |
| | |  |
| | | |
| | | 使ç¨ç®¡çåè´¦å·ï¼ç»å½`æºæ§å°`ãå¨`æºè½ä½ç®¡ç`ï¼æ¾å°ä½ çæºè½ä½ï¼åç¹å»`é
ç½®è§è²`ã |
| | | |
| | | å°æå¾è¯å«è®¾ç½®æ`夿ç大模åæå¾è¯å«`æ`大模åèªä¸»å½æ°è°ç¨`ãè¿æ¶ä½ ä¼çå°å³ä¾§æä¸ä¸ª`ç¼è¾åè½`ãç¹å»`ç¼è¾åè½`æé®ï¼ä¼å¼¹åº`åè½ç®¡ç`çæ¡ã |
| | | |
| | | å¨`åè½ç®¡ç`çæ¡éï¼ä½ éè¦å¾é`HomeAssistant设å¤ç¶ææ¥è¯¢`å`HomeAssistant设å¤ç¶æä¿®æ¹`ã |
| | | |
| | | å¾éåï¼å¨`å·²éåè½`ç¹å»`HomeAssistant设å¤ç¶ææ¥è¯¢`ï¼ç¶åå¨`åæ°é
ç½®`éé
ç½®ä½ ç`HomeAssistant`å°åãå¯é¥ãè®¾å¤æ¸
åå符ã |
| | | |
| | | ç¼è¾å¥½åï¼ç¹å»`ä¿åé
ç½®`ï¼è¿æ¶`åè½ç®¡ç`çæ¡ä¼éèï¼è¿æ¶ä½ åç¹å»ä¿åæºè½ä½é
ç½®ã |
| | | |
| | | ä¿åæååï¼å³å¯å¤éè®¾å¤æä½ã |
| | | |
| | | #### 3. å¤é设å«è¿è¡æ§å¶ |
| | | |
| | | å°è¯åesp32说ï¼âæå¼XXXç¯â |
| | | |
| | | ## æ¹æ³2ï¼å°æºå°Home Assistantçè¯é³å©æä½ä¸ºLLMå·¥å
· |
| | | |
| | | ### åè½æè¿° |
| | | |
| | | - è¯¥æ¹æ³æä¸ä¸ªæ¯è¾ä¸¥éç缺ç¹ââ**è¯¥æ¹æ³æ æ³ä½¿ç¨å°æºå¼æºçæçfunction_callæä»¶åè½çè½å**ï¼å 为使ç¨Home Assistantä½ä¸ºå°æºçLLMå·¥å
·ä¼å°æå¾è¯å«è½å转让ç»Home Assistantã使¯**è¿ä¸ªæ¹æ³æ¯è½ä½éªå°åççHome Assistantæä½åè½ï¼ä¸å°æºçè天è½åä¸å**ãå¦å®å¨ä»æå¯ä»¥ä½¿ç¨åæ ·æ¯Home Assistantæ¯æç[æ¹æ³3](##æ¹æ³3ï¼ä½¿ç¨Home AssistantçMCPæå¡ï¼æ¨èï¼)ï¼è½å¤æå¤§ç¨åº¦ä½éªå°Home Assistantçåè½ã |
| | | |
| | | ### é
ç½®æ¥éª¤ï¼ |
| | | |
| | | #### 1. é
ç½®Home Assistantç大模åè¯é³å©æã |
| | | |
| | | **éè¦æ¨æåé
置好Home Assistantçè¯é³å©ææå¤§æ¨¡åå·¥å
·ã** |
| | | |
| | | #### 2. è·åHome Assistantçè¯è¨å©æçAgent ID. |
| | | |
| | | 1. è¿å
¥Home Assistant页é¢å
ã左侧ç¹å»`å¼åè
婿`ã |
| | | 2. 卿å¼ç`å¼åè
婿`å
ï¼ç¹å»`å¨ä½`é项å¡ï¼å¦å¾ç¤ºæä½1ï¼ï¼å¨é¡µé¢å
çé项æ `å¨ä½`ä¸ï¼æ¾å°æè¾å
¥`conversation.processï¼å¯¹è¯-å¤çï¼`å¹¶éæ©`对è¯ï¼conversationï¼: å¤ç`ï¼å¦å¾ç¤ºæä½2ï¼ã |
| | | |
| | |  |
| | | |
| | | 3. å¨é¡µé¢å
å¾é`代ç(agent)`é项ï¼å¨åæå¸¸äº®ç`对è¯ä»£ç(conversation agent)`å
éæ©æ¨æ¥éª¤ä¸é
置好çè¯é³å©æåç§°ï¼å¦å¾ç¤ºï¼æè¿è¾¹é
ç½®å¥½çæ¯`ZhipuAi`å¹¶éæ©ã |
| | | |
| | |  |
| | | |
| | | 4. éä¸åï¼ç¹å»è¡¨å左䏿¹ç`è¿å
¥YAML模å¼`ã |
| | | |
| | |  |
| | | |
| | | 5. å¤å¶å
¶ä¸çagent-idçå¼ï¼ä¾å¦å¾ç¤ºä¸æçæ¯`01JP2DYMBDF7F4ZA2DMCF2AGX2`(ä»
ä¾åè)ã |
| | | |
| | |  |
| | | |
| | | 6. 忢å°å°æºå¼æºæå¡ç«¯`xiaozhi-esp32-server`ç`config.yaml`æä»¶å
ï¼å¨LLMé
ç½®ä¸ï¼æ¾å°Home Assistantï¼è®¾ç½®æ¨çHome Assistantçç½ç»å°åï¼Api keyåååæ¥è¯¢å°çagent_idã |
| | | 7. ä¿®æ¹`config.yaml`æä»¶å
ç`selected_module`屿§ç`LLM`为`HomeAssistant`ï¼`Intent`为`nointent`ã |
| | | 8. éå¯å°æºå¼æºæå¡ç«¯`xiaozhi-esp32-server`å³å¯æ£å¸¸ä½¿ç¨ã |
| | | |
| | | ## æ¹æ³3ï¼ä½¿ç¨Home AssistantçMCPæå¡ï¼æ¨èï¼ |
| | | |
| | | ### åè½æè¿° |
| | | |
| | | - éè¦æ¨æåå¨Home Assistantå
éæå¹¶å®è£
好HAéæââ[Model Context Protocol Server](https://www.home-assistant.io/integrations/mcp_server/)ã |
| | | |
| | | - è¿ä¸ªæ¹æ³ä¸æ¹æ³2齿¯HA宿¹æä¾çè§£å³æ¹æ³ï¼ä¸æ¹æ³2ä¸åçæ¯ï¼æ¨å¯ä»¥æ£å¸¸ä½¿ç¨å°æºå¼æºæå¡ç«¯`xiaozhi-esp32-server`ç弿ºå
±å»ºçæä»¶ï¼åæ¶å
许æ¨éæä½¿ç¨ä»»ä½ä¸ä¸ªæ¯æfunction_callåè½çLLM大模åã |
| | | |
| | | ### é
ç½®æ¥éª¤ |
| | | |
| | | #### 1. å®è£
Home AssistantçMCPæå¡éæã |
| | | |
| | | éæå®æ¹ç½åââ[Model Context Protocol Server](https://www.home-assistant.io/integrations/mcp_server/)ãã |
| | | |
| | | æè·é以䏿卿ä½ã |
| | | |
| | | > - åå¾Home Assistant页é¢ç**[设置 > 设å¤åæå¡ï¼Settings > Devices & Services.ï¼](https://my.home-assistant.io/redirect/integrations)**ã |
| | | > |
| | | > - å¨å³ä¸è§ï¼éæ© **[æ·»å éæï¼Add Integrationï¼](https://my.home-assistant.io/redirect/config_flow_start?domain=mcp_server)**æé®ã |
| | | > |
| | | > - ä»å表ä¸éæ©**模åä¸ä¸æåè®®æå¡å¨ï¼Model Context Protocol Serverï¼**ã |
| | | > |
| | | > - æç
§å±å¹ä¸ç说æå®æè®¾ç½®ã |
| | | |
| | | #### 2. é
ç½®å°æºå¼æºæå¡ç«¯MCPé
ç½®ä¿¡æ¯ |
| | | |
| | | |
| | | è¿å
¥`data`ç®å½ï¼æ¾å°`.mcp_server_settings.json`æä»¶ã |
| | | |
| | | å¦æä½ ç`data`ç®å½ä¸æ²¡æ`.mcp_server_settings.json`æä»¶ï¼ |
| | | - 请æå¨`xiaozhi-server`æä»¶å¤¹æ ¹ç®å½ç`mcp_server_settings.json`æä»¶å¤å¶å°`data`ç®å½ä¸ï¼å¹¶éå½å为`.mcp_server_settings.json` |
| | | - æ[ä¸è½½è¿ä¸ªæä»¶](https://github.com/xinnan-tech/xiaozhi-esp32-server/blob/main/main/xiaozhi-server/mcp_server_settings.json)ï¼ä¸è½½å°`data`ç®å½ä¸ï¼å¹¶éå½å为`.mcp_server_settings.json` |
| | | |
| | | |
| | | ä¿®æ¹`"mcpServers"`éçè¿é¨åçå
å®¹ï¼ |
| | | |
| | | ```json |
| | | "Home Assistant": { |
| | | "command": "mcp-proxy", |
| | | "args": [ |
| | | "http://YOUR_HA_HOST/mcp_server/sse" |
| | | ], |
| | | "env": { |
| | | "API_ACCESS_TOKEN": "YOUR_API_ACCESS_TOKEN" |
| | | } |
| | | }, |
| | | ``` |
| | | |
| | | 注æï¼ |
| | | |
| | | 1. **æ¿æ¢é
ç½®ï¼** |
| | | - æ¿æ¢`args`å
ç`YOUR_HA_HOST`为æ¨çHAæå¡å°åï¼å¦æä½ çæå¡å°åå·²ç»å
å«äºhttps/httpåæ ·ï¼ä¾å¦`http://192.168.1.101:8123`)ï¼ååªéè¦å¡«å
¥`192.168.1.101:8123`å³å¯ã |
| | | - å°`env`å
`API_ACCESS_TOKEN`ç`YOUR_API_ACCESS_TOKEN`æ¿æ¢ææ¨ä¹åè·åå°çå¼åå¯é¥api keyã |
| | | 2. **å¦æä½ æ·»å é
ç½®æ¯å¨`"mcpServers"`çæ¬å·å
åç»æ²¡ææ°ç`mcpServers`çé
ç½®æ¶ï¼éè¦ææåçéå·`,`ç§»é¤**ï¼å¦åå¯è½ä¼è§£æå¤±è´¥ã |
| | | |
| | | **æåææåè以ä¸ï¼åèå¦ä¸ï¼**ï¼ |
| | | |
| | | ```json |
| | | "mcpServers": { |
| | | "Home Assistant": { |
| | | "command": "mcp-proxy", |
| | | "args": [ |
| | | "http://192.168.1.101:8123/mcp_server/sse" |
| | | ], |
| | | "env": { |
| | | "API_ACCESS_TOKEN": "abcd.efghi.jkl" |
| | | } |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | #### 3. é
ç½®å°æºå¼æºæå¡ç«¯çç³»ç»é
ç½® |
| | | |
| | | 1. **鿩任æä¸æ¬¾æ¯æfunction_callçLLM大模åä½ä¸ºå°æºçLLMè天婿ï¼ä½ä¸è¦éæ©Home Assistantä½ä¸ºLLMå·¥å
·ï¼**ï¼æ¬æ¬¡æéæ©çæ¨¡åæ¯ï¼å
è´¹çChatGLMï¼å®æ¯æfunctioncall彿°è°ç¨ï¼ä½é¨åæ¶åè°ç¨ä¸å¤ªç¨³å®ï¼å¦æå追æ±ç¨³å®å»ºè®®æLLM设置æï¼DoubaoLLMï¼ä½¿ç¨çå
·ä½model_nameæ¯ï¼doubao-1-5-pro-32k-250115ã |
| | | |
| | | 2. 忢å°å°æºå¼æºæå¡ç«¯`xiaozhi-esp32-server`ç`config.yaml`æä»¶å
ï¼è®¾ç½®æ¨çLLM大模åé
ç½®ï¼å¹¶ä¸å°`selected_module`é
ç½®ç`Intent`è°æ´ä¸º`function_call`ã |
| | | |
| | | 3. éå¯å°æºå¼æºæå¡ç«¯`xiaozhi-esp32-server`å³å¯æ£å¸¸ä½¿ç¨ã |
| New file |
| | |
| | | # æºæ§å° ç«å±±åæµå¼è¯é³åæ+é³è²å
éé
ç½®æç¨ |
| | | |
| | | æ¬æç¨å为4ä¸ªé¶æ®µï¼åå¤é¶æ®µãé
ç½®é¶æ®µãå
éé¶æ®µã使ç¨é¶æ®µãä¸»è¦æ¯ä»ç»éè¿æºæ§å°é
ç½®ç«å±±åæµå¼è¯é³åæ+é³è²å
éçè¿ç¨ã |
| | | |
| | | ## 第ä¸é¶æ®µï¼åå¤é¶æ®µ |
| | | è¶
级管çåå
é¢å
æç«å±±å¼ææå¡å¼é好ï¼è·åå°App Idï¼Access Tokenãé»è®¤ç«ä¸å¼æä¼èµ éä¸ä¸ªé³è²èµæºãè¿ä¸ªé³è²èµæºéè¦æå®å¤å¶å°æ¬é¡¹ç®éã |
| | | |
| | | å¦æä½ æ³å
éå¤ä¸ªé³è²ï¼éè¦è´ä¹°å¼éå¤ä¸ªé³è²èµæºãåªè¦ææ¯ä¸ªé³è²èµæºç声é³ID(S_xxxxx)å¤å¶å°æ¬é¡¹ç®ãç¶ååé
ç»ç³»ç»çè´¦å·ä½¿ç¨å³å¯ã以䏿¯è¯¦ç»æ¥éª¤ï¼ |
| | | |
| | | ### 1.å¼éç«å±±å¼ææå¡ |
| | | è®¿é® https://console.volcengine.com/speech/app å¨åºç¨ç®¡çå建åºç¨ï¼å¾éè¯é³åæå¤§æ¨¡åå声é³å¤å»å¤§æ¨¡åã |
| | | |
| | | ### 2.è·åé³è²èµæºID |
| | | è®¿é® https://console.volcengine.com/speech/service/9999 å¤å¶ä¸é¡¹å
容ï¼å嫿¯App Idï¼Access Token以å声é³ID(S_xxxxx)ãå¦å¾ |
| | | |
| | |  |
| | | |
| | | ## 第äºé¶æ®µï¼é
ç½®ç«å±±å¼ææå¡ |
| | | |
| | | ### 1.å¡«åç«å±±å¼æé
ç½® |
| | | |
| | | 使ç¨è¶
级管çåè´¦å·ç»å½æºæ§å°ï¼ç¹å»é¡¶é¨ã模åé
ç½®ãï¼åç¹å»æ¨¡åé
置页é¢å·¦ä¾§çãè¯é³åæãï¼æç´¢æ¾å°âç«å±±åæµå¼è¯é³åæâï¼ç¹å»ä¿®æ¹ï¼å°ä½ ç«å±±å¼æç`App Id`å¡«å
¥å°ãåºç¨IDãåæ®µéï¼å°`Access Token`å¡«å
¥å°ã访é®ä»¤çãåæ®µéãç¶åä¿åã |
| | | |
| | | ### 2.å°é³è²èµæºIDåé
ç»ç³»ç»è´¦å· |
| | | |
| | | 使ç¨è¶
级管çåè´¦å·ç»å½æºæ§å°ï¼ç¹å»é¡¶é¨`åæ°åå
¸`ï¼å¨ä¸æèåä¸ï¼ç¹å»`ç³»ç»åè½é
ç½®`页é¢ãå¨é¡µé¢ä¸å¾é`é³è²å
é`ï¼ç¹å»ä¿åé
ç½®ãå³å¯å¨é¡¶é¨èåçå°`é³è²å
é`æé®ã |
| | | |
| | | 使ç¨è¶
级管çåè´¦å·ç»å½æºæ§å°ï¼ç¹å»é¡¶é¨ãé³è²å
éãããé³è²èµæºãã |
| | | |
| | | ç¹å»æ°å¢æé®ï¼å¨ãå¹³å°åç§°ãéæ©âç«å±±åæµå¼è¯é³åæâï¼ |
| | | |
| | | å¨ãé³è²èµæºIDãå¡«å
¥ä½ ç«å±±å¼æç声é³èµæºID(S_xxxxx)ï¼å¡«å
¥åæåè½¦ï¼ |
| | | |
| | | å¨ãå½å±è´¦å·ãéæ©ä½ è¦åé
ç»çç³»ç»è´¦å·ï¼ä½ å¯ä»¥åé
ç»ä½ èªå·±ãç¶åç¹å»ä¿å |
| | | |
| | | ## 第ä¸é¶æ®µï¼å
éé¶æ®µ |
| | | |
| | | 妿ç»å½åï¼ç¹å»é¡¶é¨ãé³è²å
éãããé³è²å
éãï¼æ¾ç¤ºãæ¨çè´¦å·ææ é³è²èµæºè¯·è系管çååé
é³è²èµæºãï¼è¯´æä½ å¨ç¬¬äºé¶æ®µè¿æ²¡ææé³è²èµæºIDåé
ç»è¿ä¸ªè´¦å·ãé£å°±æ¯åå°ç¬¬äºé¶æ®µï¼åé
é³è²èµæºç»å¯¹åºçè´¦å·ã |
| | | |
| | | 妿ç»å½åï¼ç¹å»é¡¶é¨ãé³è²å
éãããé³è²å
éãï¼è½çå°å¯¹åºçé³è²å表ã请继ç»ã |
| | | |
| | | å¨å表éä¼çå°å¯¹åºçé³è²å表ãéæ©å
¶ä¸ä¸ä¸ªé³è²èµæºï¼ç¹å»ãä¸ä¼ é³é¢ãæé®ãä¸ä¼ åï¼å¯ä»¥è¯å¬ä¸ä¸å£°é³æè
æªåææ®µå£°é³ã确认åç¹å»ãä¸ä¼ é³é¢ãæé®ã |
| | |  |
| | | |
| | | ä¸ä¼ é³é¢åï¼å¨å表éä¼çå°å¯¹åºçé³è²ä¼åæâå¾
å¤å»âç¶æãç¹å»ãç«å³å¤å»ãæé®ãç1~2ç§ä¼è¿åç»æã |
| | | |
| | | 妿å¤å»å¤±è´¥ï¼è¯·å°é¼ æ æ¾å°âé误信æ¯â徿 ä¸ï¼ä¼æ¾ç¤ºå¤±è´¥çåå ã |
| | | |
| | | 妿å¤å»æåï¼å¨å表éä¼çå°å¯¹åºçé³è²ä¼åæâè®ç»æåâç¶æãæ¤æ¶ä½ å¯ä»¥ç¹å»ã声é³åç§°ãæ çä¿®æ¹æé®ï¼ä¿®æ¹é³è²èµæºçåç§°ï¼æ¹ä¾¿åæéæ©ä½¿ç¨ã |
| | | |
| | | ## 第åé¶æ®µï¼ä½¿ç¨é¶æ®µ |
| | | |
| | | ç¹å»é¡¶é¨ãæºè½ä½ç®¡çãï¼éæ©ä»»æä¸ä¸ªæºè½ä½ï¼ç¹å»ãé
ç½®è§è²ãæé®ã |
| | | |
| | | è¯é³åæ(TTS)éæ©âç«å±±åæµå¼è¯é³åæâãå¨å表éï¼æ¾å°åå带æâå
éé³è²âçé³è²èµæºï¼å¦å¾ï¼ï¼éæ©å®ï¼ç¹å»ä¿åã |
| | |  |
| | | |
| | | æ¥ä¸æ¥ï¼å¯ä»¥å¤éå°æºåå®å¯¹è¯ã |
| New file |
| | |
| | | # IndexStreamTTS ä½¿ç¨æå |
| | | |
| | | ## ç¯å¢åå¤ |
| | | ### 1. å
éé¡¹ç® |
| | | ```bash |
| | | git clone https://github.com/Ksuriuri/index-tts-vllm.git |
| | | ``` |
| | | è¿å
¥è§£ååçç®å½ |
| | | ```bash |
| | | cd index-tts-vllm |
| | | ``` |
| | | 忢尿å®çæ¬ (使ç¨VLLM-0.10.2çåå²çæ¬) |
| | | ```bash |
| | | git checkout 224e8d5e5c8f66801845c66b30fa765328fd0be3 |
| | | ``` |
| | | |
| | | ### 2. åå»ºå¹¶æ¿æ´» conda ç¯å¢ |
| | | ```bash |
| | | conda create -n index-tts-vllm python=3.12 |
| | | conda activate index-tts-vllm |
| | | ``` |
| | | |
| | | ### 3. å®è£
PyTorch éè¦çæ¬ä¸º2.8.0ï¼ææ°çï¼ |
| | | #### æ¥çæ¾å¡æé«æ¯æççæ¬åå®é
å®è£
ççæ¬ |
| | | ```bash |
| | | nvidia-smi |
| | | nvcc --version |
| | | ``` |
| | | #### 驱卿¯æçæé« CUDA çæ¬ |
| | | ```bash |
| | | CUDA Version: 12.8 |
| | | ``` |
| | | #### å®é
å®è£
ç CUDA ç¼è¯å¨çæ¬ |
| | | ```bash |
| | | Cuda compilation tools, release 12.8, V12.8.89 |
| | | ``` |
| | | #### é£ä¹å¯¹åºçå®è£
å½ä»¤ï¼pytorché»è®¤ç»çæ¯12.8ç驱å¨çæ¬ï¼ |
| | | ```bash |
| | | pip install torch torchvision |
| | | ``` |
| | | éè¦ pytorch çæ¬ 2.8.0ï¼å¯¹åº vllm 0.10.2ï¼ï¼å
·ä½å®è£
æä»¤è¯·åèï¼[pytorch å®ç½](https://pytorch.org/get-started/locally/) |
| | | |
| | | ### 4. å®è£
ä¾èµ |
| | | ```bash |
| | | pip install -r requirements.txt |
| | | ``` |
| | | |
| | | ### 5. ä¸è½½æ¨¡åæé |
| | | ### æ¹æ¡ä¸ï¼ä¸è½½å®æ¹æéæä»¶åè½¬æ¢ |
| | | æ¤ä¸ºå®æ¹æéæä»¶ï¼ä¸è½½å°æ¬å°ä»»æè·¯å¾å³å¯ï¼æ¯æ IndexTTS-1.5 çæé |
| | | | HuggingFace | ModelScope | |
| | | |---------------------------------------------------------------|---------------------------------------------------------------------| |
| | | | [IndexTTS](https://huggingface.co/IndexTeam/Index-TTS) | [IndexTTS](https://modelscope.cn/models/IndexTeam/Index-TTS) | |
| | | | [IndexTTS-1.5](https://huggingface.co/IndexTeam/IndexTTS-1.5) | [IndexTTS-1.5](https://modelscope.cn/models/IndexTeam/IndexTTS-1.5) | |
| | | |
| | | ä¸é¢ä»¥ModelScopeçå®è£
æ¹æ³ä¸ºä¾ |
| | | #### 请注æï¼gitéè¦å®è£
å¹¶åå§åå¯ç¨lfsï¼å¦å·²å®è£
å¯ä»¥è·³è¿ï¼ |
| | | ```bash |
| | | sudo apt-get install git-lfs |
| | | git lfs install |
| | | ``` |
| | | å建模åç®å½ï¼å¹¶æå模å |
| | | ```bash |
| | | mkdir model_dir |
| | | cd model_dir |
| | | git clone https://www.modelscope.cn/IndexTeam/IndexTTS-1.5.git |
| | | ``` |
| | | |
| | | #### 模åæéè½¬æ¢ |
| | | ```bash |
| | | bash convert_hf_format.sh /path/to/your/model_dir |
| | | ``` |
| | | ä¾å¦ï¼ä½ ä¸è½½çIndexTTS-1.5模ååæ¾å¨model_dirç®å½ä¸ï¼åæ§è¡ä»¥ä¸å½ä»¤ |
| | | ```bash |
| | | bash convert_hf_format.sh model_dir/IndexTTS-1.5 |
| | | ``` |
| | | æ¤æä½ä¼å°å®æ¹ç模åæé转æ¢ä¸º transformers åºå
¼å®¹ççæ¬ï¼ä¿å卿¨¡åæéè·¯å¾ä¸ç vllm æä»¶å¤¹ä¸ï¼æ¹ä¾¿åç» vllm åºå 载模åæé |
| | | |
| | | ### 6. æ´æ¹æ¥å£éé
ä¸ä¸é¡¹ç® |
| | | æ¥å£è¿åæ°æ®ä¸é¡¹ç®ä¸éé
éè¦è°æ´ä¸ä¸ï¼ä½¿å
¶ç´æ¥è¿åé³é¢æ°æ® |
| | | ```bash |
| | | vi api_server.py |
| | | ``` |
| | | ```bash |
| | | @app.post("/tts", responses={ |
| | | 200: {"content": {"application/octet-stream": {}}}, |
| | | 500: {"content": {"application/json": {}}} |
| | | }) |
| | | async def tts_api(request: Request): |
| | | try: |
| | | data = await request.json() |
| | | text = data["text"] |
| | | character = data["character"] |
| | | |
| | | global tts |
| | | sr, wav = await tts.infer_with_ref_audio_embed(character, text) |
| | | |
| | | return Response(content=wav.tobytes(), media_type="application/octet-stream") |
| | | |
| | | except Exception as ex: |
| | | tb_str = ''.join(traceback.format_exception(type(ex), ex, ex.__traceback__)) |
| | | print(tb_str) |
| | | return JSONResponse( |
| | | status_code=500, |
| | | content={ |
| | | "status": "error", |
| | | "error": str(tb_str) |
| | | } |
| | | ) |
| | | ``` |
| | | |
| | | ### 7.ç¼åshå¯å¨èæ¬ï¼è¯·æ³¨æè¦å¨ç¸åºçcondaç¯å¢ä¸è¿è¡ï¼ |
| | | ```bash |
| | | vi start_api.sh |
| | | ``` |
| | | ### å°ä¸é¢å
容ç²è´´è¿å»å¹¶æ:è¾å
¥wqä¿å |
| | | #### èæ¬ä¸ç/home/system/index-tts-vllm/model_dir/IndexTTS-1.5 请èªè¡ä¿®æ¹ä¸ºå®é
è·¯å¾ |
| | | ```bash |
| | | # æ¿æ´»condaç¯å¢ |
| | | conda activate index-tts-vllm |
| | | echo "æ¿æ´»é¡¹ç®condaç¯å¢" |
| | | sleep 2 |
| | | # æ¥æ¾å ç¨11996端å£çè¿ç¨å· |
| | | PID_VLLM=$(sudo netstat -tulnp | grep 11996 | awk '{print $7}' | cut -d'/' -f1) |
| | | |
| | | # æ£æ¥æ¯å¦æ¾å°è¿ç¨å· |
| | | if [ -z "$PID_VLLM" ]; then |
| | | echo "æ²¡ææ¾å°å ç¨11996端å£çè¿ç¨" |
| | | else |
| | | echo "æ¾å°å ç¨11996端å£çè¿ç¨ï¼è¿ç¨å·ä¸º: $PID_VLLM" |
| | | # å
å°è¯æ®ékillï¼çå¾
2ç§ |
| | | kill $PID_VLLM |
| | | sleep 2 |
| | | # æ£æ¥è¿ç¨æ¯å¦è¿å¨ |
| | | if ps -p $PID_VLLM > /dev/null; then |
| | | echo "è¿ç¨ä»å¨è¿è¡ï¼å¼ºå¶ç»æ¢..." |
| | | kill -9 $PID_VLLM |
| | | fi |
| | | echo "å·²ç»æ¢è¿ç¨ $PID_VLLM" |
| | | fi |
| | | |
| | | # æ¥æ¾å ç¨VLLM::EngineCoreè¿ç¨ |
| | | GPU_PIDS=$(ps aux | grep -E "VLLM|EngineCore" | grep -v grep | awk '{print $2}') |
| | | |
| | | # æ£æ¥æ¯å¦æ¾å°è¿ç¨å· |
| | | if [ -z "$GPU_PIDS" ]; then |
| | | echo "æ²¡ææ¾å°VLLMç¸å
³è¿ç¨" |
| | | else |
| | | echo "æ¾å°VLLMç¸å
³è¿ç¨ï¼è¿ç¨å·ä¸º: $GPU_PIDS" |
| | | # å
å°è¯æ®ékillï¼çå¾
2ç§ |
| | | kill $GPU_PIDS |
| | | sleep 2 |
| | | # æ£æ¥è¿ç¨æ¯å¦è¿å¨ |
| | | if ps -p $GPU_PIDS > /dev/null; then |
| | | echo "è¿ç¨ä»å¨è¿è¡ï¼å¼ºå¶ç»æ¢..." |
| | | kill -9 $GPU_PIDS |
| | | fi |
| | | echo "å·²ç»æ¢è¿ç¨ $GPU_PIDS" |
| | | fi |
| | | |
| | | # å建tmpç®å½ï¼å¦æä¸åå¨ï¼ |
| | | mkdir -p tmp |
| | | |
| | | # åå°è¿è¡api_server.pyï¼æ¥å¿éå®åå°tmp/server.log |
| | | nohup python api_server.py --model_dir /home/system/index-tts-vllm/model_dir/IndexTTS-1.5 --port 11996 > tmp/server.log 2>&1 & |
| | | echo "api_server.py å·²å¨åå°è¿è¡ï¼æ¥å¿è¯·æ¥ç tmp/server.log" |
| | | ``` |
| | | ç»èæ¬æ§è¡æéå¹¶è¿è¡èæ¬ |
| | | ```bash |
| | | chmod +x start_api.sh |
| | | ./start_api.sh |
| | | ``` |
| | | æ¥å¿ä¼å¨tmp/server.logä¸è¾åºï¼å¯ä»¥éè¿ä»¥ä¸å½ä»¤æ¥çæ¥å¿æ
åµ |
| | | ```bash |
| | | tail -f tmp/server.log |
| | | ``` |
| | | 妿æ¾å¡å
åè¶³å¤ï¼å¯å¨èæ¬ä¸æ·»å å¯å¨åæ° ----gpu_memory_utilization æ¥è°æ´æ¾åå ç¨æ¯ä¾ï¼é»è®¤å¼ä¸º 0.25 |
| | | |
| | | ## é³è²é
ç½® |
| | | index-tts-vllmæ¯æéè¿é
ç½®æä»¶æ³¨åèªå®ä¹é³è²ï¼æ¯æåé³è²åæ··åé³è²é
ç½®ã |
| | | å¨é¡¹ç®æ ¹ç®å½ä¸çassets/speaker.jsonæä»¶ä¸é
ç½®èªå®ä¹é³è² |
| | | ### é
ç½®æ ¼å¼è¯´æ |
| | | ```bash |
| | | { |
| | | "说è¯äººåç§°1": [ |
| | | "é³é¢æä»¶è·¯å¾1.wav", |
| | | "é³é¢æä»¶è·¯å¾2.wav" |
| | | ], |
| | | "说è¯äººåç§°2": [ |
| | | "é³é¢æä»¶è·¯å¾3.wav" |
| | | ] |
| | | } |
| | | ``` |
| | | ### 注æ ï¼é
ç½®è§è²åéé坿å¡è¿è¡é³è²æ³¨åï¼ |
| | | æ·»å åé卿ºæ§å°ä¸æ·»å ç¸åºç说è¯äººï¼å模ååæ´æ¢ç¸åºçvoiceï¼ |
| New file |
| | |
| | | # MCP æ¥å
¥ç¹é¨ç½²ä½¿ç¨æå |
| | | |
| | | æ¬æç¨å
å«3个é¨å |
| | | - 1ãå¦ä½é¨ç½²MCPæ¥å
¥ç¹è¿ä¸ªæå¡ |
| | | - 2ãå
¨æ¨¡åé¨ç½²æ¶ï¼æä¹é
ç½®MCPæ¥å
¥ç¹ |
| | | - 3ã忍¡åé¨ç½²æ¶ï¼æä¹é
ç½®MCPæ¥å
¥ç¹ |
| | | |
| | | # 1ãå¦ä½é¨ç½²MCPæ¥å
¥ç¹è¿ä¸ªæå¡ |
| | | |
| | | ## ç¬¬ä¸æ¥ï¼ä¸è½½mcpæ¥å
¥ç¹é¡¹ç®æºç |
| | | |
| | | æµè§å¨æå¼[mcpæ¥å
¥ç¹é¡¹ç®å°å](https://github.com/xinnan-tech/mcp-endpoint-server) |
| | | |
| | | æå¼å®ï¼æ¾å°é¡µé¢ä¸ä¸ä¸ªç»¿è²çæé®ï¼åç`Code`çæé®ï¼ç¹å¼å®ï¼ç¶åä½ å°±çå°`Download ZIP`çæé®ã |
| | | |
| | | ç¹å»å®ï¼ä¸è½½æ¬é¡¹ç®æºç å缩å
ãä¸è½½å°ä½ çµèåï¼è§£åå®ï¼æ¤æ¶å®çååå¯è½å«`mcp-endpoint-server-main` |
| | | ä½ éè¦æå®éå½åæ`mcp-endpoint-server`ã |
| | | |
| | | ## ç¬¬äºæ¥ï¼å¯å¨ç¨åº |
| | | è¿ä¸ªé¡¹ç®æ¯ä¸ä¸ªå¾ç®åç项ç®ï¼å»ºè®®ä½¿ç¨dockerè¿è¡ãä¸è¿å¦æä½ 䏿³ä½¿ç¨dockerè¿è¡ï¼ä½ å¯ä»¥åè[è¿ä¸ªé¡µé¢](https://github.com/xinnan-tech/mcp-endpoint-server/blob/main/README_dev.md)ä½¿ç¨æºç è¿è¡ã以䏿¯dockerè¿è¡çæ¹æ³ |
| | | |
| | | ``` |
| | | # è¿å
¥æ¬é¡¹ç®æºç æ ¹ç®å½ |
| | | cd mcp-endpoint-server |
| | | |
| | | # æ¸
é¤ç¼å |
| | | docker compose -f docker-compose.yml down |
| | | docker stop mcp-endpoint-server |
| | | docker rm mcp-endpoint-server |
| | | docker rmi ghcr.nju.edu.cn/xinnan-tech/mcp-endpoint-server:latest |
| | | |
| | | # å¯å¨dockerå®¹å¨ |
| | | docker compose -f docker-compose.yml up -d |
| | | # æ¥çæ¥å¿ |
| | | docker logs -f mcp-endpoint-server |
| | | ``` |
| | | |
| | | æ¤æ¶ï¼æ¥å¿éä¼è¾åºç±»ä¼¼ä»¥ä¸çæ¥å¿ |
| | | ``` |
| | | 250705 INFO-=====ä¸é¢çå°åå嫿¯æºæ§å°/忍¡åMCPæ¥å
¥ç¹å°å==== |
| | | 250705 INFO-æºæ§å°MCPåæ°é
ç½®: http://172.22.0.2:8004/mcp_endpoint/health?key=abc |
| | | 250705 INFO-忍¡åé¨ç½²MCPæ¥å
¥ç¹: ws://172.22.0.2:8004/mcp_endpoint/mcp/?token=def |
| | | 250705 INFO-=====è¯·æ ¹æ®å
·ä½é¨ç½²éæ©ä½¿ç¨ï¼è¯·å¿æ³é²ç»ä»»ä½äºº====== |
| | | ``` |
| | | |
| | | è¯·ä½ æä¸¤ä¸ªæ¥å£å°åå¤å¶åºæ¥ï¼ |
| | | |
| | | ç±äºä½ æ¯dockeré¨ç½²ï¼åä¸å¯ç´æ¥ä½¿ç¨ä¸é¢çå°åï¼ |
| | | |
| | | ç±äºä½ æ¯dockeré¨ç½²ï¼åä¸å¯ç´æ¥ä½¿ç¨ä¸é¢çå°åï¼ |
| | | |
| | | ç±äºä½ æ¯dockeré¨ç½²ï¼åä¸å¯ç´æ¥ä½¿ç¨ä¸é¢çå°åï¼ |
| | | |
| | | ä½ å
æå°åå¤å¶åºæ¥ï¼æ¾å¨ä¸ä¸ªè稿éï¼ä½ è¦ç¥éä½ ççµèçå±åç½ipæ¯ä»ä¹ï¼ä¾å¦æççµèå±åç½ipæ¯`192.168.1.25`ï¼é£ä¹ |
| | | 忥æçæ¥å£å°å |
| | | ``` |
| | | æºæ§å°MCPåæ°é
ç½®: http://172.22.0.2:8004/mcp_endpoint/health?key=abc |
| | | 忍¡åé¨ç½²MCPæ¥å
¥ç¹: ws://172.22.0.2:8004/mcp_endpoint/mcp/?token=def |
| | | ``` |
| | | å°±è¦æ¹æ |
| | | ``` |
| | | æºæ§å°MCPåæ°é
ç½®: http://192.168.1.25:8004/mcp_endpoint/health?key=abc |
| | | 忍¡åé¨ç½²MCPæ¥å
¥ç¹: ws://192.168.1.25:8004/mcp_endpoint/mcp/?token=def |
| | | ``` |
| | | |
| | | æ¹å¥½åï¼è¯·ä½¿ç¨æµè§å¨ç´æ¥è®¿é®`æºæ§å°MCPåæ°é
ç½®`ã彿µè§å¨åºç°ç±»ä¼¼è¿æ ·ç代ç ï¼è¯´ææ¯æåäºã |
| | | ``` |
| | | {"result":{"status":"success","connections":{"tool_connections":0,"robot_connections":0,"total_connections":0}},"error":null,"id":null,"jsonrpc":"2.0"} |
| | | ``` |
| | | |
| | | è¯·ä½ ä¿ç好ä¸é¢ä¸¤ä¸ª`æ¥å£å°å`ï¼ä¸ä¸æ¥è¦ç¨å°ã |
| | | |
| | | # 2ãå
¨æ¨¡åé¨ç½²æ¶ï¼æä¹é
ç½®MCPæ¥å
¥ç¹ |
| | | é¦å
ï¼ä½ è¦å¼å¯MCPæ¥å
¥ç¹åè½ã卿ºæ§å°ï¼ç¹å»é¡¶é¨`åæ°åå
¸`ï¼å¨ä¸æèåä¸ï¼ç¹å»`ç³»ç»åè½é
ç½®`页é¢ãå¨é¡µé¢ä¸å¾é`MCPæ¥å
¥ç¹`ï¼ç¹å»`ä¿åé
ç½®`ãå¨`è§è²é
ç½®`页é¢ï¼ç¹å»`ç¼è¾åè½`æé®ï¼å³å¯çå°`mcpæ¥å
¥ç¹`åè½ã |
| | | |
| | | å¦æä½ æ¯å
¨æ¨¡åé¨ç½²ï¼ä½¿ç¨ç®¡çåè´¦å·ï¼ç»å½æºæ§å°ï¼ç¹å»é¡¶é¨`åæ°åå
¸`ï¼éæ©`åæ°ç®¡ç`åè½ã |
| | | |
| | | ç¶åæç´¢åæ°`server.mcp_endpoint`ï¼æ¤æ¶ï¼å®çå¼åºè¯¥æ¯`null`å¼ã |
| | | ç¹å»ä¿®æ¹æé®ï¼æä¸ä¸æ¥å¾æ¥ç`æºæ§å°MCPåæ°é
ç½®`ç²è´´å°`åæ°å¼`éãç¶åä¿åã |
| | | |
| | | 妿è½ä¿åæåï¼è¯´æä¸å顺å©ï¼ä½ å¯ä»¥å»æºè½ä½æ¥çææäºã妿䏿åï¼è¯´ææºæ§å°æ æ³è®¿é®mcpæ¥å
¥ç¹ï¼å¾å¤§æ¦çæ¯ç½ç»é²ç«å¢ï¼æè
没æå¡«åæ£ç¡®çå±åç½ipã |
| | | |
| | | # 3ã忍¡åé¨ç½²æ¶ï¼æä¹é
ç½®MCPæ¥å
¥ç¹ |
| | | |
| | | å¦æä½ æ¯å模åé¨ç½²ï¼æ¾å°ä½ çé
ç½®æä»¶`data/.config.yaml`ã |
| | | å¨é
ç½®æä»¶æç´¢`mcp_endpoint`ï¼å¦ææ²¡ææ¾å°ï¼ä½ å°±å¢å `mcp_endpoint`é
ç½®ãç±»ä¼¼ææ¯å°±æ¯è¿æ · |
| | | ``` |
| | | server: |
| | | websocket: ws://ä½ çipæè
åå:端å£å·/xiaozhi/v1/ |
| | | http_port: 8002 |
| | | log: |
| | | log_level: INFO |
| | | |
| | | # æ¤å¤å¯è½è¿æ´å¤é
ç½®.. |
| | | |
| | | mcp_endpoint: ä½ çæ¥å
¥ç¹websocketå°å |
| | | ``` |
| | | è¿æ¶ï¼è¯·ä½ æ`å¦ä½é¨ç½²MCPæ¥å
¥ç¹è¿ä¸ªæå¡`ä¸å¾å°ç`忍¡åé¨ç½²MCPæ¥å
¥ç¹` ç²è´´å° `mcp_endpoint`ä¸ãç±»ä¼¼è¿æ · |
| | | |
| | | ``` |
| | | server: |
| | | websocket: ws://ä½ çipæè
åå:端å£å·/xiaozhi/v1/ |
| | | http_port: 8002 |
| | | log: |
| | | log_level: INFO |
| | | |
| | | # æ¤å¤å¯è½è¿æ´å¤é
ç½® |
| | | |
| | | mcp_endpoint: ws://192.168.1.25:8004/mcp_endpoint/mcp/?token=def |
| | | ``` |
| | | |
| | | é
置好åï¼å¯å¨å模åä¼è¾åºå¦ä¸çæ¥å¿ã |
| | | ``` |
| | | 250705[__main__]-INFO-åå§åç»ä»¶: vadæå SileroVAD |
| | | 250705[__main__]-INFO-åå§åç»ä»¶: asræå FunASRServer |
| | | 250705[__main__]-INFO-OTAæ¥å£æ¯ http://192.168.1.25:8002/xiaozhi/ota/ |
| | | 250705[__main__]-INFO-è§è§åææ¥å£æ¯ http://192.168.1.25:8002/mcp/vision/explain |
| | | 250705[__main__]-INFO-mcpæ¥å
¥ç¹æ¯ ws://192.168.1.25:8004/mcp_endpoint/mcp/?token=abc |
| | | 250705[__main__]-INFO-Websocketå°åæ¯ ws://192.168.1.25:8000/xiaozhi/v1/ |
| | | 250705[__main__]-INFO-=======ä¸é¢çå°åæ¯websocketåè®®å°åï¼è¯·å¿ç¨æµè§å¨è®¿é®======= |
| | | 250705[__main__]-INFO-妿³æµè¯websocket请å¯å¨digital-human模åï¼æå¼æµè§å¨äº¤äºæµè¯ |
| | | 250705[__main__]-INFO-============================================================= |
| | | ``` |
| | | |
| | | å¦ä¸ï¼å¦æè½è¾åºç±»ä¼¼ç`mcpæ¥å
¥ç¹æ¯`ä¸`ws://192.168.1.25:8004/mcp_endpoint/mcp/?token=abc`说æé
ç½®æåäºã |
| | | |
| New file |
| | |
| | | # MCP æ¥å
¥ç¹ä½¿ç¨æå |
| | | |
| | | æ¬æç¨ä»¥è¾å¥å¼æºçmcp计ç®å¨åè½ä¸ºç¤ºä¾ï¼ä»ç»å¦ä½å°èªå·±èªå®ä¹çmcpæå¡æ¥å
¥å°èªå·±çæ¥å
¥ç¹éã |
| | | |
| | | æ¬æç¨çåææ¯ï¼ä½ ç`xiaozhi-server`å·²ç»å¯ç¨äºmcpæ¥å
¥ç¹åè½ï¼å¦æä½ è¿æ²¡å¯ç¨ï¼å¯ä»¥å
æ ¹æ®[è¿ä¸ªæç¨](./mcp-endpoint-enable.md)å¯ç¨ã |
| | | |
| | | # å¦ä½ä¸ºæºè½ä½æ¥å
¥ä¸ä¸ªç®åçmcpåè½ï¼å¦è®¡ç®å¨åè½ |
| | | |
| | | ### å¦æä½ æ¯å
¨æ¨¡åé¨ç½² |
| | | å¦æä½ æ¯å
¨æ¨¡åé¨ç½²ï¼ä½ å¯ä»¥è¿å
¥æºæ§å°ï¼æºè½ä½ç®¡çï¼ç¹å»`é
ç½®è§è²`ï¼å¨`æå¾è¯å«`çå³è¾¹ï¼æä¸ä¸ª`ç¼è¾åè½`çæé®ã |
| | | |
| | | ç¹å»è¿ä¸ªæé®ãå¨å¼¹åºç页é¢éï¼ä½äºåºé¨ï¼ä¼æ`MCPæ¥å
¥ç¹`ï¼æ£å¸¸æ¥è¯´ï¼ä¼æ¾ç¤ºè¿ä¸ªæºè½ä½ç`MCPæ¥å
¥ç¹å°å`ï¼æ¥ä¸æ¥ï¼æä»¬æ¥ç»è¿ä¸ªæºè½ä½æ©å±ä¸ä¸ªåºäºMCPææ¯ç计ç®å¨çåè½ã |
| | | |
| | | è¿ä¸ª`MCPæ¥å
¥ç¹å°å`å¾éè¦ï¼ä½ çä¸ä¸ä¼ç¨å°ã |
| | | |
| | | ### å¦æä½ æ¯å模åé¨ç½² |
| | | å¦æä½ æ¯å模åé¨ç½²ï¼ä¸ä½ å·²ç»å¨é
ç½®æä»¶éé
ç½®äºMCPæ¥å
¥ç¹å°åï¼é£ä¹æ£å¸¸æ¥è¯´ï¼å模åé¨ç½²å¯å¨çæ¶åï¼ä¼è¾åºå¦ä¸çæ¥å¿ã |
| | | ``` |
| | | 250705[__main__]-INFO-åå§åç»ä»¶: vadæå SileroVAD |
| | | 250705[__main__]-INFO-åå§åç»ä»¶: asræå FunASRServer |
| | | 250705[__main__]-INFO-OTAæ¥å£æ¯ http://192.168.1.25:8002/xiaozhi/ota/ |
| | | 250705[__main__]-INFO-è§è§åææ¥å£æ¯ http://192.168.1.25:8002/mcp/vision/explain |
| | | 250705[__main__]-INFO-mcpæ¥å
¥ç¹æ¯ ws://192.168.1.25:8004/mcp_endpoint/mcp/?token=abc |
| | | 250705[__main__]-INFO-Websocketå°åæ¯ ws://192.168.1.25:8000/xiaozhi/v1/ |
| | | 250705[__main__]-INFO-=======ä¸é¢çå°åæ¯websocketåè®®å°åï¼è¯·å¿ç¨æµè§å¨è®¿é®======= |
| | | 250705[__main__]-INFO-妿³æµè¯websocket请å¯å¨digital-human模åï¼æå¼æµè§å¨äº¤äºæµè¯ |
| | | 250705[__main__]-INFO-============================================================= |
| | | ``` |
| | | |
| | | å¦ä¸ï¼è¾åº`mcpæ¥å
¥ç¹æ¯`ä¸`ws://192.168.1.25:8004/mcp_endpoint/mcp/?token=abc`å°±æ¯ä½ ç`MCPæ¥å
¥ç¹å°å`ã |
| | | |
| | | è¿ä¸ª`MCPæ¥å
¥ç¹å°å`å¾éè¦ï¼ä½ çä¸ä¸ä¼ç¨å°ã |
| | | |
| | | ## ç¬¬ä¸æ¥ ä¸è½½è¾å¥MCP计ç®å¨é¡¹ç®ä»£ç |
| | | |
| | | æµè§å¨æå¼è¾å¥åç[计ç®å¨é¡¹ç®](https://github.com/78/mcp-calculator)ï¼ |
| | | |
| | | æå¼å®ï¼æ¾å°é¡µé¢ä¸ä¸ä¸ªç»¿è²çæé®ï¼åç`Code`çæé®ï¼ç¹å¼å®ï¼ç¶åä½ å°±çå°`Download ZIP`çæé®ã |
| | | |
| | | ç¹å»å®ï¼ä¸è½½æ¬é¡¹ç®æºç å缩å
ãä¸è½½å°ä½ çµèåï¼è§£åå®ï¼æ¤æ¶å®çååå¯è½å«`mcp-calculatorr-main` |
| | | ä½ éè¦æå®éå½åæ`mcp-calculator`ãæ¥ä¸æ¥ï¼æä»¬ç¨å½ä»¤è¡è¿å
¥é¡¹ç®ç®å½å³å®è£
ä¾èµ |
| | | |
| | | |
| | | ```bash |
| | | # è¿å
¥é¡¹ç®ç®å½ |
| | | cd mcp-calculator |
| | | |
| | | conda remove -n mcp-calculator --all -y |
| | | conda create -n mcp-calculator python=3.10 -y |
| | | conda activate mcp-calculator |
| | | |
| | | pip install -r requirements.txt |
| | | ``` |
| | | |
| | | ## ç¬¬äºæ¥ å¯å¨ |
| | | |
| | | å¯å¨åï¼å
ä»ä½ çæºæ§å°çæºè½ä½éï¼å¤å¶å°äºMCPæ¥å
¥ç¹çå°åã |
| | | |
| | | ä¾å¦æçæºè½ä½çmcpå°åæ¯ |
| | | ``` |
| | | ws://192.168.1.25:8004/mcp_endpoint/mcp/?token=abc |
| | | ``` |
| | | |
| | | å¼å§è¾å
¥å½ä»¤ |
| | | |
| | | ```bash |
| | | export MCP_ENDPOINT=ws://192.168.1.25:8004/mcp_endpoint/mcp/?token=abc |
| | | ``` |
| | | |
| | | è¾å
¥å®åï¼å¯å¨ç¨åº |
| | | |
| | | ```bash |
| | | python mcp_pipe.py calculator.py |
| | | ``` |
| | | |
| | | ### å¦æä½ æ¯æºæ§å°é¨ç½² |
| | | å¦æä½ æ¯æºæ§å°é¨ç½²ï¼å¯å¨å®åï¼ä½ åè¿å
¥æºæ§å°ï¼ç¹å»å·æ°MCPçæ¥å
¥ç¶æï¼å°±ä¼çå°ä½ æ©å±çåè½å表äºã |
| | | |
| | | ### å¦æä½ æ¯å模åé¨ç½² |
| | | å¦æä½ æ¯å模åé¨ç½²ï¼å½è®¾å¤è¿æ¥åï¼ä¼è¾åºç±»ä¼¼çæ¥å¿ï¼è¯´ææåäº |
| | | |
| | | ``` |
| | | 250705 -INFO-æ£å¨åå§åMCPæ¥å
¥ç¹: wss://2662r3426b.vicp.fun/mcp_e |
| | | 250705 -INFO-åéMCPæ¥å
¥ç¹åå§åæ¶æ¯ |
| | | 250705 -INFO-MCPæ¥å
¥ç¹è¿æ¥æå |
| | | 250705 -INFO-MCPæ¥å
¥ç¹åå§åæå |
| | | 250705 -INFO-ç»ä¸å·¥å
·å¤çå¨åå§å宿 |
| | | 250705 -INFO-MCPæ¥å
¥ç¹æå¡å¨ä¿¡æ¯: name=Calculator, version=1.9.4 |
| | | 250705 -INFO-MCPæ¥å
¥ç¹æ¯æçå·¥å
·æ°é: 1 |
| | | 250705 -INFO-ææMCPæ¥å
¥ç¹å·¥å
·å·²è·åï¼å®¢æ·ç«¯åå¤å°±ç»ª |
| | | 250705 -INFO-å·¥å
·ç¼å已巿° |
| | | 250705 -INFO-å½åæ¯æç彿°å表: [ 'get_time', 'get_lunar', 'play_music', 'get_weather', 'handle_exit_intent', 'calculator'] |
| | | ``` |
| | | 妿å
å«äº `'calculator'`ï¼è¯´æè®¾å¤å°å¯ä»¥æ ¹æ®æå¾è¯å«ï¼è°ç¨è®¡ç®å¨è¿ä¸ªå·¥å
·ã |
| New file |
| | |
| | | # MCP æ¹æ³å¦ä½è·å设å¤ä¿¡æ¯ |
| | | |
| | | æ¬æç¨å°æå¯¼ä½ å¦ä½ä½¿ç¨MCPæ¹æ³è·å设å¤ä¿¡æ¯ã |
| | | |
| | | ç¬¬ä¸æ¥ï¼èªå®ä¹ä½ ç`agent-base-prompt.txt`æä»¶ |
| | | |
| | | æxiaozhi-serverç®å½ç`agent-base-prompt.txt`æä»¶å
容å¤å¶å°ä½ ç`data`ç®å½ä¸ï¼å¹¶éå½å为`.agent-base-prompt.txt`ã |
| | | |
| | | ç¬¬äºæ¥ï¼ä¿®æ¹`data/.agent-base-prompt.txt`æä»¶ï¼æ¾å°`<context>`æ ç¾ï¼å¨æ ç¾å
容䏿·»å 以ä¸ä»£ç å
å®¹ï¼ |
| | | ``` |
| | | - **设å¤IDï¼** {{device_id}} |
| | | ``` |
| | | |
| | | æ·»å 宿åï¼ä½ ç`data/.agent-base-prompt.txt`æä»¶ç`<context>`æ ç¾å
容大è´å¦ä¸ï¼ |
| | | ``` |
| | | <context> |
| | | ãéè¦ï¼ä»¥ä¸ä¿¡æ¯å·²å®æ¶æä¾ï¼æ éè°ç¨å·¥å
·æ¥è¯¢ï¼è¯·ç´æ¥ä½¿ç¨ï¼ã |
| | | - **设å¤IDï¼** {{device_id}} |
| | | - **å½åæ¶é´ï¼** {{current_time}} |
| | | - **ä»å¤©æ¥æï¼** {{today_date}} ({{today_weekday}}) |
| | | - **ä»å¤©ååï¼** {{lunar_date}} |
| | | - **ç¨æ·æå¨åå¸ï¼** {{local_address}} |
| | | - **å½å°æªæ¥7天天æ°ï¼** {{weather_info}} |
| | | </context> |
| | | ``` |
| | | |
| | | ç¬¬ä¸æ¥ï¼ä¿®æ¹`data/.config.yaml`æä»¶ï¼æ¾å°`agent-base-prompt`é
ç½®ï¼ä¿®æ¹åå
容å¦ä¸ï¼ |
| | | ``` |
| | | prompt_template: agent-base-prompt.txt |
| | | ``` |
| | | ä¿®æ¹æ |
| | | ``` |
| | | prompt_template: data/.agent-base-prompt.txt |
| | | ``` |
| | | |
| | | ç¬¬åæ¥ï¼éå¯ä½ çxiaozhi-serveræå¡ã |
| | | |
| | | ç¬¬äºæ¥ï¼å¨ä½ çmcpæ¹æ³å¢å å称为`device_id`,ç±»å为`string`,æè¿°ä¸º`设å¤ID`çåæ°ã |
| | | |
| | | 第å
æ¥ï¼éæ°å¤éå°æºï¼è®©ä»è°ç¨mcpæ¹æ³ï¼æ¥çä½ çmcpæ¹æ³æ¯å¦å¯ä»¥è·å`设å¤ID`ã |
| New file |
| | |
| | | # è§è§æ¨¡åä½¿ç¨æå |
| | | æ¬æç¨å为两é¨åï¼ |
| | | - 第ä¸é¨åï¼å模åè¿è¡xiaozhi-serverå¼å¯è§è§æ¨¡å |
| | | - 第äºé¨åï¼å
¨æ¨¡åè¿è¡æ¶ï¼å¦ä½å¼å¯è§è§æ¨¡å |
| | | |
| | | å¼å¯è§è§æ¨¡ååï¼ä½ éè¦åå¤ä¸ä»¶äºï¼ |
| | | - ä½ éè¦åå¤ä¸å°å¸¦æå头ç设å¤ï¼èä¸è¿å°è®¾å¤å·²ç»å¨è¾å¥ä»åºéï¼å®ç°äºè°ç¨æå头åè½ãä¾å¦`ç«åÂ·å®ææ´¾ESP32-S3å¼åæ¿` |
| | | - ä½ è®¾å¤åºä»¶ççæ¬å级å°1.6.6åä»¥ä¸ |
| | | - ä½ å·²ç»æåè·éåºç¡å¯¹è¯æ¨¡å |
| | | |
| | | ## 忍¡åè¿è¡xiaozhi-serverå¼å¯è§è§æ¨¡å |
| | | |
| | | ### ç¬¬ä¸æ¥ç¡®è®¤ç½ç» |
| | | ç±äºè§è§æ¨¡åä¼é»è®¤å¯å¨8003端å£ã |
| | | |
| | | å¦æä½ æ¯dockerè¿è¡ï¼è¯·ç¡®è®¤ä¸ä¸ä½ ç`docker-compose.yml`æ¯å¦æ¾äº`8003`端å£ï¼å¦ææ²¡æå°±æ´æ°ææ°ç`docker-compose.yml`æä»¶ |
| | | |
| | | å¦æä½ æ¯æºç è¿è¡ï¼ç¡®è®¤é²ç«å¢æ¯å¦æ¾è¡`8003`ç«¯å£ |
| | | |
| | | ### ç¬¬äºæ¥éæ©ä½ çè§è§æ¨¡å |
| | | æå¼ä½ ç`data/.config.yaml`æä»¶ï¼è®¾ç½®ä½ ç`selected_module.VLLM`设置为æä¸ªè§è§æ¨¡åãç®åæä»¬å·²ç»æ¯æ`openai`ç±»åæ¥å£çè§è§æ¨¡åã`ChatGLMVLLM`å°±æ¯å
¶ä¸ä¸æ¬¾å
¼å®¹`openai`çæ¨¡åã |
| | | |
| | | ``` |
| | | selected_module: |
| | | VAD: .. |
| | | ASR: .. |
| | | LLM: .. |
| | | VLLM: ChatGLMVLLM |
| | | TTS: .. |
| | | Memory: .. |
| | | Intent: .. |
| | | ``` |
| | | |
| | | å设æä»¬ä½¿ç¨`ChatGLMVLLM`ä½ä¸ºè§è§æ¨¡åï¼é£æä»¬éè¦å
ç»å½[æºè°±AI](https://bigmodel.cn/usercenter/proj-mgmt/apikeys)ç½ç«ï¼ç³è¯·å¯é¥ãå¦æä½ ä¹åå·²ç»ç³è¯·è¿äºå¯é¥ï¼å¯ä»¥å¤ç¨è¿ä¸ªå¯é¥ã |
| | | |
| | | å¨ä½ çé
ç½®æä»¶ä¸ï¼å¢å è¿ä¸ªé
ç½®ï¼å¦æå·²ç»æäºè¿ä¸ªé
ç½®ï¼å°±è®¾ç½®å¥½ä½ çapi_keyã |
| | | |
| | | ``` |
| | | VLLM: |
| | | ChatGLMVLLM: |
| | | api_key: ä½ çapi_key |
| | | ``` |
| | | |
| | | ### ç¬¬ä¸æ¥å¯å¨xiaozhi-serveræå¡ |
| | | å¦æä½ æ¯æºç ï¼å°±è¾å
¥å½ä»¤å¯å¨ |
| | | ``` |
| | | python app.py |
| | | ``` |
| | | å¦æä½ æ¯dockerè¿è¡ï¼å°±éå¯å®¹å¨ |
| | | ``` |
| | | docker restart xiaozhi-esp32-server |
| | | ``` |
| | | |
| | | å¯å¨åä¼è¾åºä»¥ä¸å
å®¹çæ¥å¿ã |
| | | |
| | | ``` |
| | | 2025-06-01 **** - OTAæ¥å£æ¯ http://192.168.4.7:8003/xiaozhi/ota/ |
| | | 2025-06-01 **** - è§è§åææ¥å£æ¯ http://192.168.4.7:8003/mcp/vision/explain |
| | | 2025-06-01 **** - Websocketå°åæ¯ ws://192.168.4.7:8000/xiaozhi/v1/ |
| | | 2025-06-01 **** - =======ä¸é¢çå°åæ¯websocketåè®®å°åï¼è¯·å¿ç¨æµè§å¨è®¿é®======= |
| | | 2025-06-01 **** - 妿³æµè¯websocket请å¯å¨digital-human模åï¼æå¼æµè§å¨äº¤äºæµè¯ |
| | | 2025-06-01 **** - ============================================================= |
| | | ``` |
| | | |
| | | å¯å¨åï¼ä½¿ç¨ä½¿ç¨æµè§å¨æå¼æ¥å¿é`è§è§åææ¥å£`è¿æ¥ãççè¾åºäºä»ä¹ï¼å¦æä½ æ¯linux,æ²¡ææµè§å¨ï¼ä½ å¯ä»¥æ§è¡è¿ä¸ªå½ä»¤ï¼ |
| | | ``` |
| | | curl -i ä½ çè§è§åææ¥å£ |
| | | ``` |
| | | |
| | | æ£å¸¸æ¥è¯´ä¼è¿æ ·æ¾ç¤º |
| | | ``` |
| | | MCP Vision æ¥å£è¿è¡æ£å¸¸ï¼è§è§è§£éæ¥å£å°åæ¯ï¼http://xxxx:8003/mcp/vision/explain |
| | | ``` |
| | | |
| | | 请注æï¼å¦æä½ æ¯å
¬ç½é¨ç½²ï¼æè
dockeré¨ç½²ï¼ä¸å®è¦æ¹ä¸ä¸ä½ ç`data/.config.yaml`éè¿ä¸ªé
ç½® |
| | | ``` |
| | | server: |
| | | vision_explain: http://ä½ çipæè
åå:端å£å·/mcp/vision/explain |
| | | ``` |
| | | |
| | | 为ä»ä¹å¢ï¼å 为è§è§è§£éæ¥å£éè¦ä¸åå°è®¾å¤ï¼å¦æä½ çå°åæ¯å±åç½å°åï¼æè
æ¯dockerå
é¨å°åï¼è®¾å¤æ¯æ æ³è®¿é®çã |
| | | |
| | | åè®¾ä½ çå
¬ç½å°åæ¯`111.111.111.111`ï¼é£ä¹`vision_explain`åºè¯¥è¿ä¹é
|
| | | |
| | | ``` |
| | | server: |
| | | vision_explain: http://111.111.111.111:8003/mcp/vision/explain |
| | | ``` |
| | | |
| | | å¦æä½ çMCP Vision æ¥å£è¿è¡æ£å¸¸ï¼ä¸ä½ ä¹è¯çç¨æµè§å¨è®¿é®æ£å¸¸æå¼ä¸åç`è§è§è§£éæ¥å£å°å`ï¼è¯·ç»§ç»ä¸ä¸æ¥ |
| | | |
| | | ### ç¬¬åæ¥ 设å¤å¤éå¼å¯ |
| | | |
| | | 对设å¤è¯´â请æå¼æå头ï¼è¯´ä½ ä½ çå°äºä»ä¹â |
| | | |
| | | çæxiaozhi-serverçæ¥å¿è¾åºï¼ççææ²¡ææ¥éã |
| | | |
| | | |
| | | ## å
¨æ¨¡åè¿è¡æ¶ï¼å¦ä½å¼å¯è§è§æ¨¡å |
| | | |
| | | ### ç¬¬ä¸æ¥ 确认ç½ç» |
| | | ç±äºè§è§æ¨¡åä¼é»è®¤å¯å¨8003端å£ã |
| | | |
| | | å¦æä½ æ¯dockerè¿è¡ï¼è¯·ç¡®è®¤ä¸ä¸ä½ ç`docker-compose_all.yml`æ¯å¦æ å°äº`8003`端å£ï¼å¦ææ²¡æå°±æ´æ°ææ°ç`docker-compose_all.yml`æä»¶ |
| | | |
| | | å¦æä½ æ¯æºç è¿è¡ï¼ç¡®è®¤é²ç«å¢æ¯å¦æ¾è¡`8003`ç«¯å£ |
| | | |
| | | ### ç¬¬äºæ¥ ç¡®è®¤ä½ é
ç½®æä»¶ |
| | | |
| | | æå¼ä½ ç`data/.config.yaml`æä»¶ï¼ç¡®è®¤ä¸ä¸ä½ çé
ç½®æä»¶çç»æï¼æ¯å¦å`data/config_from_api.yaml`䏿 ·ã妿ä¸ä¸æ ·ï¼æç¼ºå°æé¡¹ï¼è¯·è¡¥é½ã |
| | | |
| | | ### ç¬¬ä¸æ¥ é
ç½®è§è§æ¨¡åå¯é¥ |
| | | |
| | | 飿们éè¦å
ç»å½[æºè°±AI](https://bigmodel.cn/usercenter/proj-mgmt/apikeys)ç½ç«ï¼ç³è¯·å¯é¥ãå¦æä½ ä¹åå·²ç»ç³è¯·è¿äºå¯é¥ï¼å¯ä»¥å¤ç¨è¿ä¸ªå¯é¥ã |
| | | |
| | | ç»å½`æºæ§å°`ï¼é¡¶é¨èåç¹å»`模åé
ç½®`ï¼å¨å·¦ä¾§æ ç¹å»`è§è§æè¯è¨æ¨¡å`ï¼æ¾å°`VLLM_ChatGLMVLLM`ï¼ç¹å»ä¿®æ¹æé®ï¼å¨å¼¹æ¡ä¸ï¼å¨`APIå¯é¥`è¾å
¥ä½ å¯é¥ï¼ç¹å»ä¿åã |
| | | |
| | | ä¿åæååï¼å»å°ä½ éè¦æµè¯çæºè½ä½åªéï¼ç¹å»`é
ç½®è§è²`ï¼å¨æå¼çå
容éï¼æ¥ç`è§è§å¤§è¯è¨æ¨¡å(VLLM)`æ¯å¦éæ©äºåæçè§è§æ¨¡åãç¹å»ä¿åã |
| | | |
| | | ### ç¬¬ä¸æ¥ å¯å¨xiaozhi-server模å |
| | | å¦æä½ æ¯æºç ï¼å°±è¾å
¥å½ä»¤å¯å¨ |
| | | ``` |
| | | python app.py |
| | | ``` |
| | | å¦æä½ æ¯dockerè¿è¡ï¼å°±éå¯å®¹å¨ |
| | | ``` |
| | | docker restart xiaozhi-esp32-server |
| | | ``` |
| | | |
| | | å¯å¨åä¼è¾åºä»¥ä¸å
å®¹çæ¥å¿ã |
| | | |
| | | ``` |
| | | 2025-06-01 **** - è§è§åææ¥å£æ¯ http://192.168.4.7:8003/mcp/vision/explain |
| | | 2025-06-01 **** - Websocketå°åæ¯ ws://192.168.4.7:8000/xiaozhi/v1/ |
| | | 2025-06-01 **** - =======ä¸é¢çå°åæ¯websocketåè®®å°åï¼è¯·å¿ç¨æµè§å¨è®¿é®======= |
| | | 2025-06-01 **** - 妿³æµè¯websocket请å¯å¨digital-human模åï¼æå¼æµè§å¨äº¤äºæµè¯ |
| | | 2025-06-01 **** - ============================================================= |
| | | ``` |
| | | |
| | | å¯å¨åï¼ä½¿ç¨ä½¿ç¨æµè§å¨æå¼æ¥å¿é`è§è§åææ¥å£`è¿æ¥ãççè¾åºäºä»ä¹ï¼å¦æä½ æ¯linux,æ²¡ææµè§å¨ï¼ä½ å¯ä»¥æ§è¡è¿ä¸ªå½ä»¤ï¼ |
| | | ``` |
| | | curl -i ä½ çè§è§åææ¥å£ |
| | | ``` |
| | | |
| | | æ£å¸¸æ¥è¯´ä¼è¿æ ·æ¾ç¤º |
| | | ``` |
| | | MCP Vision æ¥å£è¿è¡æ£å¸¸ï¼è§è§è§£éæ¥å£å°åæ¯ï¼http://xxxx:8003/mcp/vision/explain |
| | | ``` |
| | | |
| | | 请注æï¼å¦æä½ æ¯å
¬ç½é¨ç½²ï¼æè
dockeré¨ç½²ï¼ä¸å®è¦æ¹ä¸ä¸ä½ ç`data/.config.yaml`éè¿ä¸ªé
ç½® |
| | | ``` |
| | | server: |
| | | vision_explain: http://ä½ çipæè
åå:端å£å·/mcp/vision/explain |
| | | ``` |
| | | |
| | | 为ä»ä¹å¢ï¼å 为è§è§è§£éæ¥å£éè¦ä¸åå°è®¾å¤ï¼å¦æä½ çå°åæ¯å±åç½å°åï¼æè
æ¯dockerå
é¨å°åï¼è®¾å¤æ¯æ æ³è®¿é®çã |
| | | |
| | | åè®¾ä½ çå
¬ç½å°åæ¯`111.111.111.111`ï¼é£ä¹`vision_explain`åºè¯¥è¿ä¹é
|
| | | |
| | | ``` |
| | | server: |
| | | vision_explain: http://111.111.111.111:8003/mcp/vision/explain |
| | | ``` |
| | | |
| | | å¦æä½ çMCP Vision æ¥å£è¿è¡æ£å¸¸ï¼ä¸ä½ ä¹è¯çç¨æµè§å¨è®¿é®æ£å¸¸æå¼ä¸åç`è§è§è§£éæ¥å£å°å`ï¼è¯·ç»§ç»ä¸ä¸æ¥ |
| | | |
| | | ### ç¬¬åæ¥ 设å¤å¤éå¼å¯ |
| | | |
| | | 对设å¤è¯´â请æå¼æå头ï¼è¯´ä½ ä½ çå°äºä»ä¹â |
| | | |
| | | çæxiaozhi-serverçæ¥å¿è¾åºï¼ççææ²¡ææ¥éã |
| New file |
| | |
| | | # MQTT ç½å
³é¨ç½²æç¨ |
| | | |
| | | `xiaozhi-esp32-server`项ç®ï¼å¯ç»åè¾å¥å¼æºç[xiaozhi-mqtt-gateway](https://github.com/78/xiaozhi-mqtt-gateway) 项ç®è¿è¡ç®åæ¹é ï¼å³å¯å®ç°å°æºç¡¬ä»¶MQTT+UDPè¿æ¥ã |
| | | æ¬æç¨å为ä¸é¨åï¼ä½ å¯ä»¥æ ¹æ®ä½ æ¯å
¨æ¨¡åé¨ç½²è¿æ¯å模åé¨ç½²ï¼éæ©å¯¹åºçé¨åæ¥å
¥MQTTç½å
³ï¼ |
| | | - 第ä¸é¨åï¼é¨ç½²MQTTç½å
³ |
| | | - 第äºé¨åï¼å
¨æ¨¡åè¿è¡å®ç°å°æºç¡¬ä»¶MQTT+UDPè¿æ¥ |
| | | - 第ä¸é¨åï¼å模åè¿è¡xiaozhi-serverå®ç°å°æºç¡¬ä»¶MQTT+UDPè¿æ¥ |
| | | |
| | | ## åå¤é¶æ®µ |
| | | åå¤å¥½ä½ ç`xiaozhi-server`ç`mqtt-websocket`è¿æ¥å°åãå¨ä½ 忥ç`websocketå°å`åºç¡ä¸ï¼æ·»å `?from=mqtt_gateway`å符ï¼å°±å¯ä»¥å¾å°`mqtt-websocket`è¿æ¥å°å |
| | | |
| | | 1ãå¦æä½ æ¯æºç é¨ç½²ï¼ä½ ç`mqtt-websocket`å°åæ¯ï¼ |
| | | ``` |
| | | ws://127.0.0.1:8000/xiaozhi/v1/?from=mqtt_gateway |
| | | ``` |
| | | |
| | | 2ãå¦æä½ æ¯dockeré¨ç½²ï¼ä½ ç`mqtt-websocket`å°åæ¯ |
| | | ``` |
| | | ws://ä½ å®¿ä¸»æºå±åç½IP:8000/xiaozhi/v1/?from=mqtt_gateway |
| | | ``` |
| | | |
| | | ## éè¦æç¤º |
| | | |
| | | å¦æä½ æ¯æå¡å¨é¨ç½²ï¼éè¦ç¡®ä¿æå¡å¨`1883`ã`8884`ã`8007`端å£é½å¯¹å¤å¼æ¾ã`8884`éæ©çåè®®ç±»åæ¯`UDP`ï¼å
¶ä»æ¯`TCP`ã |
| | | |
| | | å¦æä½ æ¯æå¡å¨é¨ç½²ï¼éè¦ç¡®ä¿æå¡å¨`1883`ã`8884`ã`8007`端å£é½å¯¹å¤å¼æ¾ã`8884`éæ©çåè®®ç±»åæ¯`UDP`ï¼å
¶ä»æ¯`TCP`ã |
| | | |
| | | å¦æä½ æ¯æå¡å¨é¨ç½²ï¼éè¦ç¡®ä¿æå¡å¨`1883`ã`8884`ã`8007`端å£é½å¯¹å¤å¼æ¾ã`8884`éæ©çåè®®ç±»åæ¯`UDP`ï¼å
¶ä»æ¯`TCP`ã |
| | | |
| | | |
| | | ## 第ä¸é¨åï¼é¨ç½²MQTTç½å
³ |
| | | |
| | | 1. å
é[æ¹é åçxiaozhi-mqtt-gateway项ç®](https://github.com/xinnan-tech/xiaozhi-mqtt-gateway.git)ï¼ |
| | | ```bash |
| | | git clone https://ghfast.top/https://github.com/xinnan-tech/xiaozhi-mqtt-gateway.git |
| | | cd xiaozhi-mqtt-gateway |
| | | ``` |
| | | |
| | | 2. å®è£
ä¾èµï¼ |
| | | ```bash |
| | | npm install |
| | | npm install -g pm2 |
| | | ``` |
| | | |
| | | 3. é
ç½® `config.json`ï¼ |
| | | ```bash |
| | | cp config/mqtt.json.example config/mqtt.json |
| | | ``` |
| | | |
| | | 4. ç¼è¾é
ç½®æä»¶ config/mqtt.jsonï¼æä½ å¨`æ¬æåå¤é¶æ®µ`ç`mqtt-websocket`å°åæ¿æ¢å°`chat_servers`éãä¾å¦æºç é¨ç½²ç`xiaozhi-server`å°±æ¯å¦ä¸é
ç½®ï¼ |
| | | |
| | | ``` |
| | | { |
| | | "production": { |
| | | "chat_servers": [ |
| | | "ws://127.0.0.1:8000/xiaozhi/v1/?from=mqtt_gateway" |
| | | ] |
| | | }, |
| | | "debug": false, |
| | | "max_mqtt_payload_size": 8192, |
| | | "mcp_client": { |
| | | "capabilities": { |
| | | }, |
| | | "client_info": { |
| | | "name": "xiaozhi-mqtt-client", |
| | | "version": "1.0.0" |
| | | }, |
| | | "max_tools_count": 128 |
| | | } |
| | | } |
| | | ``` |
| | | 5. å¨é¡¹ç®æ ¹ç®å½å建ä¸`.env`æä»¶ï¼å¹¶è®¾ç½®ä»¥ä¸ç¯å¢åé: |
| | | ``` |
| | | PUBLIC_IP=your-ip # æå¡å¨å
¬ç½IP |
| | | MQTT_PORT=1883 # MQTTæå¡å¨ç«¯å£ |
| | | UDP_PORT=8884 # UDPæå¡å¨ç«¯å£ |
| | | API_PORT=8007 # 管çAPIç«¯å£ |
| | | MQTT_SIGNATURE_KEY=test # MQTTç¾åå¯é¥ |
| | | SERVER_SECRET=Te1st12134 # æå¡å¨å¯é¥ï¼è¯·ä¿æåæºæ§å°ï¼server.secretï¼ä¸è´æè
åxiaozhi-serveréï¼server.auth_keyï¼ä¿æä¸è´ |
| | | ``` |
| | | 请注æ`PUBLIC_IP`é
ç½®ï¼ç¡®ä¿å
¶ä¸å®é
å
¬ç½IPä¸è´ï¼å¦ææåå就填ååã |
| | | |
| | | `MQTT_SIGNATURE_KEY` æ¯ç¨äºMQTTè¿æ¥è®¤è¯çå¯é¥ï¼æå¥½è®¾ç½®æå¤æä¸ç¹çï¼æå¥½æ¯è®¾ç½®æ8个å符以ä¸ä¸åæ¶å
å«å¤§å°å忝ï¼è¿ä¸ªå¯é¥ç¨åè¿ä¼ç¨å°ã |
| | | |
| | | - 注æä¸è¦ç¨ç®åçå¯ç ï¼æ¯å¦`123456`ã`test`çã |
| | | - 注æä¸è¦ç¨ç®åçå¯ç ï¼æ¯å¦`123456`ã`test`çã |
| | | - 注æä¸è¦ç¨ç®åçå¯ç ï¼æ¯å¦`123456`ã`test`çã |
| | | |
| | | `SERVER_SECRET` æ¯ç¨çæwebsocketè¿æ¥ç认è¯ä¿¡æ¯ã |
| | | |
| | | 1ãå¦æä½ æ¯å
¨æ¨¡åé¨ç½²ï¼ä¸ä½ çæºæ§å°çåæ°ç®¡çé`server.auth.enabled`设置æäº`true`ï¼é£ä¹ï¼`SERVER_SECRET`éè¦åæºæ§å°ï¼`server.secret`ï¼ä¿æä¸è´ã |
| | | |
| | | 2ãå¦æä½ æ¯å模åé¨ç½²ï¼ä¸ä½ å¨é
ç½®æä»¶éæ`server.auth.enabled`设置æäº`true`ï¼é£ä¹ï¼`SERVER_SECRET`éè¦åé
ç½®æä»¶éï¼`server.auth_key`ï¼ä¿æä¸è´ã |
| | | |
| | | |
| | | 6. å¯å¨MQTTç½å
³ |
| | | ``` |
| | | # å¯å¨æå¡ |
| | | pm2 start ecosystem.config.js |
| | | |
| | | # æ¥çæ¥å¿ |
| | | pm2 logs xz-mqtt |
| | | ``` |
| | | |
| | | å½ä½ çå°å¦ä¸æ¥å¿ï¼è¯´æMQTTç½å
³å¯å¨æåï¼ |
| | | ``` |
| | | 0|xz-mqtt | 2025-09-11T12:14:48: MQTT æå¡å¨æ£å¨çå¬ç«¯å£ 1883 |
| | | 0|xz-mqtt | 2025-09-11T12:14:48: UDP æå¡å¨æ£å¨çå¬ x.x.x.x:8884 |
| | | ``` |
| | | |
| | | 妿éè¦éå¯MQTTç½å
³ï¼æ§è¡å¦ä¸å½ä»¤ï¼ |
| | | ``` |
| | | pm2 restart xz-mqtt |
| | | ``` |
| | | |
| | | ## 第äºé¨åï¼å
¨æ¨¡åè¿è¡å®ç°å°æºç¡¬ä»¶MQTT+UDPè¿æ¥ |
| | | |
| | | æ¥çä½ æºæ§å°é¦é¡µåºé¨ççæ¬å·ï¼ç¡®è®¤ä½ çæºæ§å°çæ¬æ¯å¦æ¯`0.7.7`å以ä¸çæ¬ã妿䏿¯ï¼éè¦åçº§æºæ§å°ã |
| | | |
| | | 1. 卿ºæ§å°é¡¶é¨ï¼ç¹å»`åæ°ç®¡ç`ï¼æç´¢`server.mqtt_gateway`ï¼ç¹å»ç¼è¾ï¼å¡«å
¥ä½ å¨`.env`æä»¶ä¸è®¾ç½®ç`PUBLIC_IP`+`:`+`MQTT_PORT`ãç±»ä¼¼è¿æ · |
| | | ``` |
| | | 192.168.0.7:1883 |
| | | ``` |
| | | 2. 卿ºæ§å°é¡¶é¨ï¼ç¹å»`åæ°ç®¡ç`ï¼æç´¢`server.mqtt_signature_key`ï¼ç¹å»ç¼è¾ï¼å¡«å
¥ä½ å¨`.env`æä»¶ä¸è®¾ç½®ç`MQTT_SIGNATURE_KEY`ã |
| | | |
| | | 3. 卿ºæ§å°é¡¶é¨ï¼ç¹å»`åæ°ç®¡ç`ï¼æç´¢`server.udp_gateway`ï¼ç¹å»ç¼è¾ï¼å¡«å
¥ä½ å¨`.env`æä»¶ä¸è®¾ç½®ç`PUBLIC_IP`+`:`+`UDP_PORT`ãç±»ä¼¼è¿æ · |
| | | ``` |
| | | 192.168.0.7:8884 |
| | | ``` |
| | | 4. 卿ºæ§å°é¡¶é¨ï¼ç¹å»`åæ°ç®¡ç`ï¼æç´¢`server.mqtt_manager_api`ï¼ç¹å»ç¼è¾ï¼å¡«å
¥ä½ å¨`.env`æä»¶ä¸è®¾ç½®ç`PUBLIC_IP`+`:`+`API_PORT`ãç±»ä¼¼è¿æ · |
| | | ``` |
| | | 192.168.0.7:8007 |
| | | ``` |
| | | |
| | | ä¸é¢çé
ç½®å®æåï¼ä½ å¯ä»¥ä½¿ç¨curlå½ä»¤ï¼éªè¯ä½ çotaå°åæ¯å¦ä¼ä¸åmqtté
ç½®ï¼æä¸é¢ç`http://localhost:8002/xiaozhi/ota/`æ¹æä½ çotaå°å |
| | | ``` |
| | | curl 'http://localhost:8002/xiaozhi/ota/' \ |
| | | -H 'Content-Type: application/json' \ |
| | | -H 'Client-Id: 7b94d69a-9808-4c59-9c9b-704333b38aff' \ |
| | | -H 'Device-Id: 11:22:33:44:55:66' \ |
| | | --data-raw $'{\n "application": {\n "version": "1.0.1",\n "elf_sha256": "1"\n },\n "board": {\n "mac": "11:22:33:44:55:66"\n }\n}' |
| | | ``` |
| | | |
| | | 妿è¿åçå
容å
å«`mqtt`ç¸å
³çé
ç½®ï¼è¯´æé
ç½®æåãç±»ä¼¼è¿æ · |
| | | |
| | | ``` |
| | | {"server_time":{"timestamp":1757567894012,"timeZone":"Asia/Shanghai","timezone_offset":480},"activation":{"code":"460609","message":"http://xiaozhi.server.com\n460609","challenge":"11:22:33:44:55:66"},"firmware":{"version":"1.0.1","url":"http://xiaozhi.server.com:8002/xiaozhi/otaMag/download/NOT_ACTIVATED_FIRMWARE_THIS_IS_A_INVALID_URL"},"websocket":{"url":"ws://192.168.4.23:8000/xiaozhi/v1/"},"mqtt":{"endpoint":"192.168.0.7:1883","client_id":"GID_default@@@11_22_33_44_55_66@@@7b94d69a-9808-4c59-9c9b-704333b38aff","username":"eyJpcCI6IjA6MDowOjA6MDowOjA6MSJ9","password":"Y8XP9xcUhVIN9OmbCHT9ETBiYNE3l3Z07Wk46wV9PE8=","publish_topic":"device-server","subscribe_topic":"devices/p2p/11_22_33_44_55_66"}} |
| | | ``` |
| | | |
| | | ç±äºMQTTä¿¡æ¯æ¯éè¦é OTAå°åä¸åçï¼å æ¤åªæä½ ä¿è¯è½æ£å¸¸è¿æ¥æå¡å¨çOTAå°åï¼éå¯å¤éå³å¯ã |
| | | |
| | | å¤éåçæmqtt-gatewayçæ¥å¿ï¼ç¡®è®¤æ¯å¦æè¿æ¥æåçæ¥å¿ã |
| | | ``` |
| | | pm2 logs xz-mqtt |
| | | ``` |
| | | |
| | | ## 第ä¸é¨åï¼å模åè¿è¡xiaozhi-serverå®ç°å°æºç¡¬ä»¶MQTT+UDPè¿æ¥ |
| | | |
| | | æå¼ä½ ç`data/.config.yaml`æä»¶ï¼å¨`server`䏿¾å°`mqtt_gateway`å¡«å
¥ä½ å¨`.env`æä»¶ä¸è®¾ç½®ç`PUBLIC_IP`+`:`+`MQTT_PORT`ãç±»ä¼¼è¿æ · |
| | | ``` |
| | | 192.168.0.7:1883 |
| | | ``` |
| | | å¨`server`䏿¾å°`mqtt_signature_key`å¡«å
¥ä½ å¨`.env`æä»¶ä¸è®¾ç½®ç`MQTT_SIGNATURE_KEY`ã |
| | | |
| | | å¨`server`䏿¾å°`udp_gateway`å¡«å
¥ä½ å¨`.env`æä»¶ä¸è®¾ç½®ç`PUBLIC_IP`+`:`+`UDP_PORT`ãç±»ä¼¼è¿æ · |
| | | ``` |
| | | 192.168.0.7:8884 |
| | | ``` |
| | | |
| | | ä¸é¢çé
ç½®å®æåï¼ä½ å¯ä»¥ä½¿ç¨curlå½ä»¤ï¼éªè¯ä½ çotaå°åæ¯å¦ä¼ä¸åmqtté
ç½®ï¼æä¸é¢ç`http://localhost:8002/xiaozhi/ota/`æ¹æä½ çotaå°å |
| | | ``` |
| | | curl 'http://localhost:8002/xiaozhi/ota/' \ |
| | | -H 'Device-Id: 11:22:33:44:55:66' \ |
| | | --data-raw $'{\n "application": {\n "version": "1.0.1",\n "elf_sha256": "1"\n },\n "board": {\n "mac": "11:22:33:44:55:66"\n }\n}' |
| | | ``` |
| | | |
| | | 妿è¿åçå
容å
å«`mqtt`ç¸å
³çé
ç½®ï¼è¯´æé
ç½®æåãç±»ä¼¼è¿æ · |
| | | ``` |
| | | {"server_time":{"timestamp":1758781561083,"timeZone":"GMT+08:00","timezone_offset":480},"activation":{"code":"527111","message":"http://xiaozhi.server.com\n527111","challenge":"11:22:33:44:55:66"},"firmware":{"version":"1.0.1","url":"http://xiaozhi.server.com:8002/xiaozhi/otaMag/download/NOT_ACTIVATED_FIRMWARE_THIS_IS_A_INVALID_URL"},"websocket":{"url":"ws://192.168.1.15:8000/xiaozhi/v1/"},"mqtt":{"endpoint":"192.168.1.15:1883","client_id":"GID_default@@@11_22_33_44_55_66@@@11_22_33_44_55_66","username":"eyJpcCI6IjE5Mi4xNjguMS4xNSJ9","password":"fjAYs49zTJecWqJ3jBt+kqxVn/x7vkXRAc85ak/va7Y=","publish_topic":"device-server","subscribe_topic":"devices/p2p/11_22_33_44_55_66"}} |
| | | ``` |
| | | |
| | | ç±äºMQTTä¿¡æ¯æ¯éè¦é OTAå°åä¸åçï¼å æ¤åªæä½ ä¿è¯è½æ£å¸¸è¿æ¥æå¡å¨çOTAå°åï¼éå¯å¤éå³å¯ã |
| | | |
| | | å¤éåçæmqtt-gatewayçæ¥å¿ï¼ç¡®è®¤æ¯å¦æè¿æ¥æåçæ¥å¿ã |
| | | ``` |
| | | pm2 logs xz-mqtt |
| | | ``` |
| New file |
| | |
| | | # get_news_from_newsnow æä»¶æ°é»æºé
ç½®æå |
| | | |
| | | ## æ¦è¿° |
| | | |
| | | `get_news_from_newsnow` æä»¶ç°å¨æ¯æéè¿Web管ççé¢å¨æé
ç½®æ°é»æºï¼ä¸åéè¦ä¿®æ¹ä»£ç ãç¨æ·å¯ä»¥å¨æºæ§å°ä¸ä¸ºæ¯ä¸ªæºè½ä½é
ç½®ä¸åçæ°é»æºã |
| | | |
| | | ## é
ç½®æ¹å¼ |
| | | |
| | | ### 1. éè¿Web管ççé¢é
ç½®ï¼æ¨èï¼ |
| | | |
| | | 1. ç»å½æºæ§å° |
| | | 2. è¿å
¥"è§è²é
ç½®"é¡µé¢ |
| | | 3. éæ©è¦é
ç½®çæºè½ä½ |
| | | 4. ç¹å»"ç¼è¾åè½"æé® |
| | | 5. å¨å³ä¾§åæ°é
ç½®åºåæ¾å°"newsnowæ°é»èå"æä»¶ |
| | | 6. å¨"æ°é»æºé
ç½®"åæ®µä¸è¾å
¥åå·åéç䏿åç§° |
| | | |
| | | ### 2. é
ç½®æä»¶æ¹å¼ |
| | | |
| | | å¨ `config.yaml` ä¸é
ç½®ï¼ |
| | | |
| | | ```yaml |
| | | plugins: |
| | | get_news_from_newsnow: |
| | | url: "https://newsnow.busiyi.world/api/s?id=" |
| | | news_sources: "æ¾æ¹æ°é»;ç¾åº¦çæ;è´¢è社;å¾®å;æé³" |
| | | ``` |
| | | |
| | | ## æ°é»æºé
ç½®æ ¼å¼ |
| | | |
| | | æ°é»æºé
置使ç¨åå·åéç䏿åç§°ï¼æ ¼å¼ä¸ºï¼ |
| | | |
| | | ``` |
| | | 䏿åç§°1;䏿åç§°2;䏿åç§°3 |
| | | ``` |
| | | |
| | | ### é
ç½®ç¤ºä¾ |
| | | |
| | | ``` |
| | | æ¾æ¹æ°é»;ç¾åº¦çæ;è´¢è社;å¾®å;æé³;ç¥ä¹;36æ°ª |
| | | ``` |
| | | |
| | | ## æ¯æçæ°é»æº |
| | | |
| | | æä»¶æ¯æä»¥ä¸æ°é»æºç䏿åç§°ï¼ |
| | | |
| | | - æ¾æ¹æ°é» |
| | | - ç¾åº¦çæ |
| | | - è´¢è社 |
| | | - å¾®å |
| | | - æé³ |
| | | - ç¥ä¹ |
| | | - 36æ°ª |
| | | - åå°è¡è§é» |
| | | - ITä¹å®¶ |
| | | - 仿¥å¤´æ¡ |
| | | - èæ |
| | | - åå©åå© |
| | | - å¿«æ |
| | | - éªç |
| | | - æ ¼éæ± |
| | | - æ³å¸è´¢ç» |
| | | - éåæ°æ® |
| | | - ç客 |
| | | - å°æ°æ´¾ |
| | | - ç¨åæé |
| | | - å¤å°ç½ |
| | | - è«é¨è½ |
| | | - èåæ©æ¥ |
| | | - é
·å® |
| | | - è¿æ¯è®ºå |
| | | - åèæ¶æ¯ |
| | | - 嫿é讯社 |
| | | - ç¾åº¦è´´å§ |
| | | - é è°±æ°é» |
| | | - 以忴å¤... |
| | | |
| | | ## é»è®¤é
ç½® |
| | | |
| | | 妿æªé
ç½®æ°é»æºï¼æä»¶å°ä½¿ç¨ä»¥ä¸é»è®¤é
ç½®ï¼ |
| | | |
| | | ``` |
| | | æ¾æ¹æ°é»;ç¾åº¦çæ;è´¢è社 |
| | | ``` |
| | | |
| | | ## 使ç¨è¯´æ |
| | | |
| | | 1. **é
ç½®æ°é»æº**ï¼å¨Webç颿é
ç½®æä»¶ä¸è®¾ç½®æ°é»æºç䏿åç§°ï¼ç¨åå·åé |
| | | 2. **è°ç¨æä»¶**ï¼ç¨æ·å¯ä»¥è¯´"ææ¥æ°é»"æ"è·åæ°é»" |
| | | 3. **æå®æ°é»æº**ï¼ç¨æ·å¯ä»¥è¯´"ææ¥æ¾æ¹æ°é»"æ"è·åç¾åº¦çæ" |
| | | 4. **è·å详æ
**ï¼ç¨æ·å¯ä»¥è¯´"详ç»ä»ç»è¿æ¡æ°é»" |
| | | |
| | | ## å·¥ä½åç |
| | | |
| | | 1. æä»¶æ¥å䏿åç§°ä½ä¸ºåæ°ï¼å¦"æ¾æ¹æ°é»"ï¼ |
| | | 2. æ ¹æ®é
ç½®çæ°é»æºå表ï¼å°ä¸æå称转æ¢ä¸ºå¯¹åºçè±æIDï¼å¦"thepaper"ï¼ |
| | | 3. 使ç¨è±æIDè°ç¨APIè·åæ°é»æ°æ® |
| | | 4. è¿åæ°é»å
容ç»ç¨æ· |
| | | |
| | | ## 注æäºé¡¹ |
| | | |
| | | 1. é
ç½®ç䏿åç§°å¿
é¡»ä¸ CHANNEL_MAP ä¸å®ä¹çåç§°å®å
¨ä¸è´ |
| | | 2. é
ç½®æ´æ¹åéè¦é坿塿鿰å è½½é
ç½® |
| | | 3. 妿é
ç½®çæ°é»æºæ æï¼æä»¶ä¼èªå¨ä½¿ç¨é»è®¤æ°é»æº |
| | | 4. å¤ä¸ªæ°é»æºä¹é´ä½¿ç¨è±æåå·(;)åéï¼ä¸è¦ä½¿ç¨ä¸æåå·(ï¼) |
| New file |
| | |
| | | # 忍¡åé¨ç½²åºä»¶OTAèªå¨å级é
ç½®æå |
| | | |
| | | æ¬æç¨å°æå¯¼ä½ å¦ä½å¨**忍¡åé¨ç½²**åºæ¯ä¸é
ç½®åºä»¶OTAèªå¨å级åè½ï¼å®ç°è®¾å¤åºä»¶çèªå¨æ´æ°ã |
| | | |
| | | å¦æä½ å·²ç»ä½¿ç¨**å
¨æ¨¡åé¨ç½²**ï¼è¯·å¿½ç¥æ¬æç¨ã |
| | | |
| | | ## åè½ä»ç» |
| | | |
| | | å¨å模åé¨ç½²ä¸ï¼xiaozhi-serverå
ç½®äºOTAåºä»¶ç®¡çåè½ï¼å¯ä»¥èªå¨æ£æµè®¾å¤çæ¬å¹¶ä¸åå级åºä»¶ãç³»ç»ä¼æ ¹æ®è®¾å¤åå·åå½åçæ¬ï¼èªå¨å¹é
å¹¶æ¨éææ°çåºä»¶çæ¬ã |
| | | |
| | | ## åææ¡ä»¶ |
| | | |
| | | - ä½ å·²ç»æåè¿è¡**忍¡åé¨ç½²**å¹¶è¿è¡xiaozhi-server |
| | | - 设å¤è½å¤æ£å¸¸è¿æ¥å°æå¡å¨ |
| | | |
| | | ## ç¬¬ä¸æ¥ åå¤åºä»¶æä»¶ |
| | | |
| | | ### 1. å建åºä»¶åæ¾ç®å½ |
| | | |
| | | åºä»¶æä»¶éè¦æ¾å¨`data/bin/`ç®å½ä¸ãå¦æè¯¥ç®å½ä¸åå¨ï¼è¯·æå¨åå»ºï¼ |
| | | |
| | | ```bash |
| | | mkdir -p data/bin |
| | | ``` |
| | | |
| | | ### 2. åºä»¶æä»¶å½åè§å |
| | | |
| | | åºä»¶æä»¶å¿
é¡»éµå¾ªä»¥ä¸å½åæ ¼å¼ï¼ |
| | | |
| | | ``` |
| | | {设å¤åå·}_{çæ¬å·}.bin |
| | | ``` |
| | | |
| | | **å½åè§å说æï¼** |
| | | - `设å¤åå·`ï¼è®¾å¤çåå·åç§°ï¼ä¾å¦ `lichuang-dev`ã`bread-compact-wifi` ç |
| | | - `çæ¬å·`ï¼åºä»¶çæ¬å·ï¼å¿
须以æ°åå¼å¤´ï¼æ¯ææ°åã忝ãç¹å·ãä¸å线åçæ¨ªçº¿ï¼ä¾å¦ `1.6.6`ã`2.0.0` ç |
| | | - æä»¶æ©å±åå¿
é¡»æ¯ `.bin` |
| | | |
| | | **å½å示ä¾ï¼** |
| | | ``` |
| | | bread-compact-wifi_1.6.6.bin |
| | | lichuang-dev_2.0.0.bin |
| | | ``` |
| | | |
| | | ### 3. æ¾ç½®åºä»¶æä»¶ |
| | | |
| | | å°åå¤å¥½çåºä»¶æä»¶ï¼.binæä»¶ï¼å¤å¶å°`data/bin/`ç®å½ä¸ï¼ |
| | | |
| | | éè¦çäºæ
说ä¸éï¼å级çbinæä»¶æ¯`xiaozhi.bin`ï¼ä¸æ¯å
¨éåºä»¶æä»¶`merged-binary.bin`! |
| | | |
| | | éè¦çäºæ
说ä¸éï¼å级çbinæä»¶æ¯`xiaozhi.bin`ï¼ä¸æ¯å
¨éåºä»¶æä»¶`merged-binary.bin`! |
| | | |
| | | éè¦çäºæ
说ä¸éï¼å级çbinæä»¶æ¯`xiaozhi.bin`ï¼ä¸æ¯å
¨éåºä»¶æä»¶`merged-binary.bin`! |
| | | |
| | | ```bash |
| | | cp xiaozhi.bin data/bin/设å¤åå·_çæ¬å·.bin |
| | | ``` |
| | | |
| | | ä¾å¦ï¼ |
| | | ```bash |
| | | cp xiaozhi.bin data/bin/bread-compact-wifi_1.6.6.bin |
| | | ``` |
| | | |
| | | ## ç¬¬äºæ¥ é
ç½®å
¬ç½è®¿é®å°åï¼ä»
å
¬ç½é¨ç½²éè¦ï¼ |
| | | |
| | | **注æï¼æ¤æ¥éª¤ä»
éç¨äºå模åå
¬ç½é¨ç½²çåºæ¯ã** |
| | | |
| | | å¦æä½ çxiaozhi-serveræ¯å
¬ç½é¨ç½²ï¼ä½¿ç¨å
¬ç½IPæååï¼ï¼**å¿
é¡»**é
ç½®`server.vision_explain`åæ°ï¼å 为OTAåºä»¶ä¸è½½å°åä¼ä½¿ç¨è¯¥é
ç½®çååå端å£ã |
| | | |
| | | å¦æä½ æ¯å±åç½é¨ç½²ï¼å¯ä»¥è·³è¿æ¤æ¥éª¤ã |
| | | |
| | | ### 为ä»ä¹è¦é
ç½®è¿ä¸ªåæ°ï¼ |
| | | |
| | | å¨å模åé¨ç½²ä¸ï¼ç³»ç»çæåºä»¶ä¸è½½å°åæ¶ï¼ä¼ä½¿ç¨`vision_explain`é
ç½®çååå端å£ä½ä¸ºåºç¡å°åã妿ä¸é
ç½®æé
ç½®é误ï¼è®¾å¤å°æ æ³è®¿é®åºä»¶ä¸è½½å°åã |
| | | |
| | | ### é
ç½®æ¹æ³ |
| | | |
| | | æå¼`data/.config.yaml`æä»¶ï¼æ¾å°`server`é
置段ï¼è®¾ç½®`vision_explain`åæ°ï¼ |
| | | |
| | | ```yaml |
| | | server: |
| | | vision_explain: http://ä½ çååæIP:端å£å·/mcp/vision/explain |
| | | ``` |
| | | |
| | | **é
置示ä¾ï¼** |
| | | |
| | | å±åç½é¨ç½²ï¼é»è®¤ï¼ï¼ |
| | | ```yaml |
| | | server: |
| | | vision_explain: http://192.168.1.100:8003/mcp/vision/explain |
| | | ``` |
| | | |
| | | å
¬ç½ååé¨ç½²ï¼ |
| | | ```yaml |
| | | server: |
| | | vision_explain: http://yourdomain.com:8003/mcp/vision/explain |
| | | ``` |
| | | |
| | | ### 注æäºé¡¹ |
| | | |
| | | - ååæIPå¿
é¡»æ¯è®¾å¤è½å¤è®¿é®çå°å |
| | | - å¦æä½¿ç¨Dockeré¨ç½²ï¼ä¸è½ä½¿ç¨Dockerå
é¨å°åï¼å¦127.0.0.1ælocalhostï¼ |
| | | - å¦æä½ ä½¿ç¨äºnginxåå代çï¼è¯·å¡«å对å¤çå°åå端å£å·ï¼ä¸æ¯æ¬é¡¹ç®è¿è¡ç端å£å· |
| | | |
| | | |
| | | ## 常è§é®é¢ |
| | | |
| | | ### 1. è®¾å¤æ¶ä¸å°åºä»¶æ´æ° |
| | | |
| | | **å¯è½åå åè§£å³æ¹æ³ï¼** |
| | | |
| | | - æ£æ¥åºä»¶æä»¶å½åæ¯å¦ç¬¦åè§åï¼`{åå·}_{çæ¬å·}.bin` |
| | | - æ£æ¥åºä»¶æä»¶æ¯å¦æ£ç¡®æ¾ç½®å¨`data/bin/`ç®å½ |
| | | - æ£æ¥è®¾å¤åå·æ¯å¦ä¸åºä»¶æä»¶åä¸çåå·å¹é
|
| | | - æ£æ¥åºä»¶çæ¬å·æ¯å¦é«äºè®¾å¤å½åçæ¬ |
| | | - æ¥çæå¡å¨æ¥å¿ï¼ç¡®è®¤OTAè¯·æ±æ¯å¦æ£å¸¸å¤ç |
| | | |
| | | ### 2. è®¾å¤æ¥åä¸è½½å°åæ æ³è®¿é® |
| | | |
| | | **å¯è½åå åè§£å³æ¹æ³ï¼** |
| | | |
| | | - æ£æ¥`server.vision_explain`é
ç½®çååæIPæ¯å¦æ£ç¡® |
| | | - 确认端å£å·é
ç½®æ£ç¡®ï¼é»è®¤8003ï¼ |
| | | - 妿æ¯å
¬ç½é¨ç½²ï¼ç¡®ä¿è®¾å¤è½å¤è®¿é®è¯¥å
¬ç½å°å |
| | | - 妿æ¯Dockeré¨ç½²ï¼ç¡®ä¿ä¸æ¯ä½¿ç¨äºå
é¨å°åï¼127.0.0.1ï¼ |
| | | - æ£æ¥é²ç«å¢æ¯å¦å¼æ¾äºå¯¹åºç«¯å£ |
| | | - å¦æä½ ä½¿ç¨äºnginxåå代çï¼è¯·å¡«å对å¤çå°åå端å£å·ï¼ä¸æ¯æ¬é¡¹ç®è¿è¡ç端å£å· |
| | | |
| | | ### 3. å¦ä½ç¡®è®¤è®¾å¤å½åçæ¬ |
| | | |
| | | æ¥çOTAè¯·æ±æ¥å¿ï¼æ¥å¿ä¸ä¼æ¾ç¤ºè®¾å¤ä¸æ¥ççæ¬å·ï¼ |
| | | |
| | | ``` |
| | | [ota_handler] - è®¾å¤ AA:BB:CC:DD:EE:FF åºä»¶å·²æ¯ææ°: 1.6.6 |
| | | ``` |
| | | |
| | | ### 4. åºä»¶æä»¶æ¾ç½®å没æçæ |
| | | |
| | | ç³»ç»æ30ç§çç¼åæ¶é´ï¼é»è®¤ï¼ï¼å¯ä»¥ï¼ |
| | | - çå¾
30ç§åå让设å¤åèµ·OTAè¯·æ± |
| | | - éå¯xiaozhi-serveræå¡ |
| | | - è°æ´`firmware_cache_ttl`é
置为æ´ççæ¶é´ |
| New file |
| | |
| | | # PaddleSpeechTTSéæxiaozhiæå¡ |
| | | |
| | | ## éç¹è¯´æ |
| | | - ä¼ç¹ï¼æ¬å°ç¦»çº¿é¨ç½²ãé度快 |
| | | - 缺ç¹ï¼æªæ¢2025å¹´9æ25æ¥ï¼é»è®¤çæ¨¡åæ¯ä¸ææ¨¡åï¼ä¸æ¯æè±æè½¬è¯é³ã妿å«è±æä¼åä¸åºå£°é³ï¼å¦éåæ¶æ¯æä¸è±æéè¦èªå·±è®ç»ã |
| | | |
| | | ## ä¸ãåºç¡ç¯å¢è¦æ± |
| | | æä½ç³»ç»ï¼Windows / Linux / WSL 2 |
| | | |
| | | Python çæ¬ï¼3.9以ä¸ï¼è¯·æ ¹æ®Paddle宿¹æç¨è°æ´ï¼ |
| | | |
| | | Paddle çæ¬ï¼å®æ¹ææ°çæ¬ ```https://www.paddlepaddle.org.cn/install``` |
| | | |
| | | ä¾èµç®¡çå·¥å
·ï¼conda æ venv |
| | | |
| | | ## äºãå¯å¨paddlespeechæå¡ |
| | | ### 1.ä»paddlespeech宿¹ä»åºæåæºç |
| | | ```bash |
| | | git clone https://github.com/PaddlePaddle/PaddleSpeech.git |
| | | ``` |
| | | ### 2.建ç«èæç¯å¢ |
| | | ```bash |
| | | |
| | | conda create -n paddle_env python=3.10 -y |
| | | conda activate paddle_env |
| | | ``` |
| | | ### 3.å®è£
paddle |
| | | å CPUæ¶æãGPUæ¶æä¸åï¼è¯·æ ¹æ®Paddle宿¹æ¯æçpythonçæ¬å»ºç«ç¯å¢ |
| | | ``` |
| | | https://www.paddlepaddle.org.cn/install |
| | | ``` |
| | | |
| | | ### 4.è¿å
¥paddlespeechç®å½ |
| | | ```bash |
| | | cd PaddleSpeech |
| | | ``` |
| | | ### 5.å®è£
paddlespeech |
| | | ```bash |
| | | pip install pytest-runner -i https://pypi.tuna.tsinghua.edu.cn/simple |
| | | |
| | | #以ä¸å½ä»¤ä½¿ç¨ä»»æä¸ä¸ª |
| | | pip install paddlepaddle -i https://mirror.baidu.com/pypi/simple |
| | | pip install paddlespeech -i https://pypi.tuna.tsinghua.edu.cn/simple |
| | | ``` |
| | | ### 6.使ç¨å½ä»¤èªå¨ä¸è½½è¯é³æ¨¡å |
| | | ```bash |
| | | paddlespeech tts --input "ä½ å¥½ï¼è¿æ¯ä¸æ¬¡æµè¯" |
| | | ``` |
| | | æ¤æ¥éª¤ä¼èªå¨ä¸è½½æ¨¡åç¼åè³æ¬å° .paddlespeech/models ç®å½ |
| | | |
| | | ### 7.ä¿®æ¹tts_online_application.yamlé
ç½® |
| | | åèç®å½ ```"PaddleSpeech\demos\streaming_tts_server\conf\tts_online_application.yaml"``` |
| | | éæ©```tts_online_application.yaml```æä»¶ç¨ç¼è¾å¨æå¼ï¼è®¾ç½®```protocol```为```websocket``` |
| | | |
| | | ### 8.å¯å¨æå¡ |
| | | ```yaml |
| | | paddlespeech_server start --config_file ./demos/streaming_tts_server/conf/tts_online_application.yaml |
| | | #宿¹é»è®¤å¯å¨å½ä»¤ï¼ |
| | | paddlespeech_server start --config_file ./conf/tts_online_application.yaml |
| | | ``` |
| | | è¯·æ ¹æ®ä½ ç```tts_online_application.yaml```çå®é
ç®å½æ¥å¯å¨å½ä»¤ï¼çå°å¦ä¸æ¥å¿å³å¯å¨æå |
| | | ``` |
| | | Prefix dict has been built successfully. |
| | | [2025-08-07 10:03:11,312] [ DEBUG] __init__.py:166 - Prefix dict has been built successfully. |
| | | INFO: Started server process [2298] |
| | | INFO: Waiting for application startup. |
| | | INFO: Application startup complete. |
| | | INFO: Uvicorn running on http://0.0.0.0:8092 (Press CTRL+C to quit) |
| | | ``` |
| | | |
| | | ## ä¸ãä¿®æ¹å°æºçé
ç½®æä»¶ |
| | | ### 1.```main/xiaozhi-server/core/providers/tts/paddle_speech.py``` |
| | | |
| | | ### 2.```main/xiaozhi-server/data/.config.yaml``` |
| | | 使ç¨å模åé¨ç½² |
| | | ```yaml |
| | | selected_module: |
| | | TTS: PaddleSpeechTTS |
| | | TTS: |
| | | PaddleSpeechTTS: |
| | | type: paddle_speech |
| | | protocol: websocket |
| | | url: ws://127.0.0.1:8092/paddlespeech/tts/streaming # TTS æå¡ç URL å°åï¼æåæ¬å°æå¡å¨ [websocketé»è®¤ws://127.0.0.1:8092/paddlespeech/tts/streaming] |
| | | spk_id: 0 # åé³äºº IDï¼0 é常表示é»è®¤çåé³äºº |
| | | sample_rate: 24000 # éæ ·ç [websocketé»è®¤24000ï¼httpé»è®¤0 èªå¨éæ©] |
| | | speed: 1.0 # è¯éï¼1.0 表示æ£å¸¸è¯éï¼>1 表示å å¿«ï¼<1 表示åæ
¢ |
| | | volume: 1.0 # é³éï¼1.0 表示æ£å¸¸é³éï¼>1 表示å¢å¤§ï¼<1 表示åå° |
| | | save_path: # ä¿åè·¯å¾ |
| | | ``` |
| | | ### 3.å¯å¨xiaozhiæå¡ |
| | | ```py |
| | | python app.py |
| | | ``` |
| | | å¯å¨`main/digital-human`ä¸ç`python start.py`åï¼æå¼`http://127.0.0.1:8006/index.html`ï¼æµè¯è¿æ¥ååéæ¶æ¯æ¶paddlespeech端æ¯å¦æè¾åºæ¥å¿ |
| | | |
| | | è¾åºæ¥å¿åèï¼ |
| | | ``` |
| | | INFO: 127.0.0.1:44312 - "WebSocket /paddlespeech/tts/streaming" [accepted] |
| | | INFO: connection open |
| | | [2025-08-07 11:16:33,355] [ INFO] - sentence: ååï¼æä¹çªç¶æ¾æè天å¦ï¼ |
| | | [2025-08-07 11:16:33,356] [ INFO] - The durations of audio is: 2.4625 s |
| | | [2025-08-07 11:16:33,356] [ INFO] - first response time: 0.1143045425415039 s |
| | | [2025-08-07 11:16:33,356] [ INFO] - final response time: 0.4777836799621582 s |
| | | [2025-08-07 11:16:33,356] [ INFO] - RTF: 0.19402382942625715 |
| | | [2025-08-07 11:16:33,356] [ INFO] - Other info: front time: 0.06514096260070801 s, first am infer time: 0.008037090301513672 s, first voc infer time: 0.04112648963928223 s, |
| | | [2025-08-07 11:16:33,356] [ INFO] - Complete the synthesis of the audio streams |
| | | INFO: connection closed |
| | | |
| | | ``` |
| New file |
| | |
| | | # è¯é³è¯å«ã大è¯è¨æ¨¡åãéæµå¼è¯é³åæãæµå¼è¯é³åæãè§è§æ¨¡åçæ§è½æµè¯å·¥å
·ä½¿ç¨æå |
| | | |
| | | 1.å¨main/xiaozhi-serverç®å½ä¸å建dataç®å½ |
| | | 2.å¨dataç®å½ä¸å建.config.yamlæä»¶ |
| | | 3.å¨.data/config.yamlä¸ï¼åå
¥ä½ çè¯é³è¯å«ã大è¯è¨æ¨¡åãæµå¼è¯é³åæãè§è§æ¨¡åçåæ° |
| | | ä¾å¦ï¼ |
| | | ``` |
| | | LLM: |
| | | ChatGLMLLM: |
| | | # å®ä¹LLM APIç±»å |
| | | type: openai |
| | | # glm-4-flash æ¯å
è´¹çï¼ä½æ¯è¿æ¯éè¦æ³¨åå¡«åapi_keyç |
| | | # å¯å¨è¿éæ¾å°ä½ çapi key https://bigmodel.cn/usercenter/proj-mgmt/apikeys |
| | | model_name: glm-4-flash |
| | | url: https://open.bigmodel.cn/api/paas/v4/ |
| | | api_key: ä½ çchat-glm web key |
| | | |
| | | TTS: |
| | | |
| | | VLLM: |
| | | |
| | | ASR: |
| | | ``` |
| | | 4.å¨main/xiaozhi-serverç®å½ä¸è¿è¡performance_tester.py: |
| | | ``` |
| | | python performance_tester.py |
| | | ``` |
| New file |
| | |
| | | # PowerMem è®°å¿ç»ä»¶éææå |
| | | |
| | | ## ç®ä» |
| | | |
| | | [PowerMem](https://www.powermem.ai/) æ¯ç± OceanBase 弿ºç Agent è®°å¿ç»ä»¶ï¼éè¿æ¬å° LLM è¿è¡è®°å¿æ»ç»åæºè½æ£ç´¢ï¼ä¸º AI 代çæä¾é«æçè®°å¿ç®¡çåè½ã |
| | | |
| | | è´¹ç¨è¯´æï¼PowerMem æ¬èº«å¼æºå
è´¹ï¼å®é
è´¹ç¨åå³äºæ¨éæ©ç LLM åæ°æ®åºï¼ |
| | | - ä½¿ç¨ SQLite + å
è´¹ LLMï¼å¦æºè°± glm-4-flashï¼= **å®å
¨å
è´¹** |
| | | - 使ç¨äºç«¯ LLM æäºç«¯æ°æ®åº = æå¯¹åºæå¡æ¶è´¹ |
| | | |
| | | > ð¡ **æä½³æ§è½æç¤º**ï¼PowerMem é
å OceanBase 使ç¨å¯å®ç°æå¤§æ§è½éæ¾ï¼SQLite ä»
建议å¨èµæºä¸è¶³çæ
åµä¸ä½¿ç¨ã |
| | | |
| | | - **GitHub**: https://github.com/oceanbase/powermem |
| | | - **å®ç½**: https://www.powermem.ai/ |
| | | - **使ç¨ç¤ºä¾**: https://github.com/oceanbase/powermem/tree/main/examples |
| | | |
| | | ## åè½ç¹æ§ |
| | | |
| | | - **æ¬å°æ»ç»**ï¼éè¿ LLM 卿¬å°è¿è¡è®°å¿æ»ç»åæå |
| | | - **ç¨æ·ç»å**ï¼éè¿ `UserMemory` èªå¨æåç¨æ·ä¿¡æ¯ï¼å§åãèä¸ãå
´è¶£çï¼ï¼æç»æ´æ°ç¨æ·ç»å |
| | | - **æºè½éå¿**ï¼åºäºè¾å®¾æµ©æ¯éå¿æ²çº¿ï¼èªå¨"éå¿"è¿æ¶åªå£°ä¿¡æ¯ |
| | | - **å¤ç§åå¨å端**ï¼æ¯æ OceanBaseï¼æ¨èï¼æä½³æ§è½ï¼ãSeekDBï¼æ¨èï¼AIåºç¨åå¨ä¸ä½ï¼ãPostgreSQLãSQLiteï¼è½»éå¤éï¼ |
| | | - **å¤ç§ LLM æ¯æ**ï¼éä¹åé®ãæºè°±ï¼glm-4-flash å
è´¹ï¼ãOpenAI ç |
| | | - **æºè½æ£ç´¢**ï¼åºäºåéæç´¢çè¯ä¹æ£ç´¢è½å |
| | | - **ç§æé¨ç½²**ï¼å®å
¨æ¯ææ¬å°ç§æåé¨ç½² |
| | | - **弿¥æä½**ï¼é«æç弿¥è®°å¿ç®¡ç |
| | | |
| | | ## å®è£
|
| | | |
| | | PowerMem 已添å å°é¡¹ç®ä¾èµä¸ï¼å¦æéè¦æå¨å®è£
ï¼ |
| | | |
| | | ```bash |
| | | pip install powermem |
| | | ``` |
| | | |
| | | ## é
置说æ |
| | | |
| | | ### åºç¡é
ç½® |
| | | |
| | | å¨ `config.yaml` ä¸é
ç½® PowerMemï¼ |
| | | |
| | | ```yaml |
| | | selected_module: |
| | | Memory: powermem |
| | | |
| | | Memory: |
| | | powermem: |
| | | type: powermem |
| | | # æ¯å¦å¯ç¨ç¨æ·ç»ååè½ |
| | | # ç¨æ·ç»åæ¯æ: oceanbaseãseekdbãsqlite (powermem 0.3.0+) |
| | | enable_user_profile: true |
| | | |
| | | # ========== LLM é
ç½® ========== |
| | | llm: |
| | | provider: openai # å¯é: qwen, openai, zhipu ç |
| | | config: |
| | | api_key: ä½ çLLM APIå¯é¥ |
| | | model: qwen-plus |
| | | # openai_base_url: https://api.openai.com/v1 # å¯éï¼èªå®ä¹æå¡å°å |
| | | |
| | | # ========== Embedding é
ç½® ========== |
| | | embedder: |
| | | provider: openai # å¯é: qwen, openai ç |
| | | config: |
| | | api_key: ä½ çåµå
¥æ¨¡åAPIå¯é¥ |
| | | model: text-embedding-v4 |
| | | openai_base_url: https://dashscope.aliyuncs.com/compatible-mode/v1 |
| | | # embedding_dims: 1024 # åé维度ï¼é1536æ¶éé
ç½® |
| | | |
| | | # ========== Database é
ç½® ========== |
| | | vector_store: |
| | | provider: sqlite # å¯é: oceanbase(æ¨è), seekdb(æ¨è), postgres, sqlite(è½»é) |
| | | config: {} # SQLite æ éé¢å¤é
ç½® |
| | | ``` |
| | | |
| | | ### é
ç½®åæ°è¯¦è§£ |
| | | |
| | | #### LLM é
ç½® |
| | | |
| | | | åæ° | 说æ | å¯éå¼ | |
| | | |------|------|--------| |
| | | | `llm.provider` | LLM æä¾å | `qwen`, `openai`, `zhipu` ç | |
| | | | `llm.config.api_key` | API å¯é¥ | - | |
| | | | `llm.config.model` | 模ååç§° | æ ¹æ®æä¾åéæ© | |
| | | | `llm.config.openai_base_url` | èªå®ä¹æå¡å°åï¼å¯éï¼ | - | |
| | | |
| | | #### Embedding é
ç½® |
| | | |
| | | | åæ° | 说æ | å¯éå¼ | |
| | | |------|------|--------| |
| | | | `embedder.provider` | åµå
¥æ¨¡åæä¾å | `qwen`, `openai` ç | |
| | | | `embedder.config.api_key` | API å¯é¥ | - | |
| | | | `embedder.config.model` | 模ååç§° | æ ¹æ®æä¾åéæ© | |
| | | | `embedder.config.openai_base_url` | èªå®ä¹æå¡å°åï¼å¯éï¼ | - | |
| | | |
| | | #### Database é
ç½® |
| | | |
| | | | åæ° | 说æ | å¯éå¼ | |
| | | |------|------|--------| |
| | | | `vector_store.provider` | åå¨å端类å | `oceanbase`(æ¨è), `seekdb`(æ¨è), `postgres`, `sqlite`(è½»é) | |
| | | | `vector_store.config` | æ°æ®åºè¿æ¥é
ç½® | æ ¹æ® provider 设置 | |
| | | |
| | | ### è®°å¿æ¨¡å¼è¯´æ |
| | | |
| | | PowerMem æ¯æä¸¤ç§è®°å¿æ¨¡å¼ï¼ |
| | | |
| | | | æ¨¡å¼ | é
ç½® | åè½ | åå¨è¦æ± | |
| | | |------|------|------|----------| |
| | | | **æ®éè®°å¿** | `enable_user_profile: false` | 对è¯è®°å¿åå¨ä¸æ£ç´¢ | æ¯ææææ°æ®åº | |
| | | | **ç¨æ·ç»å** | `enable_user_profile: true` | è®°å¿ + èªå¨æåç¨æ·ç»å | oceanbaseãseekdbãsqlite | |
| | | |
| | | > ð **çæ¬è¯´æ**ï¼PowerMem 0.3.0+ çæ¬ï¼ç¨æ·ç»ååè½æ¯æ OceanBaseãSeekDBãSQLite ä¸ç§åå¨å端ã |
| | | |
| | | ### 使ç¨éä¹åé®ï¼æ¨èï¼ |
| | | |
| | | 1. è®¿é® [é¿éäºç¾ç¼å¹³å°](https://bailian.console.aliyun.com/) 注åè´¦å· |
| | | 2. å¨ [API Key 管ç](https://bailian.console.aliyun.com/?apiKey=1#/api-key) 页é¢è·å API å¯é¥ |
| | | 3. é
ç½®å¦ä¸ï¼ |
| | | |
| | | ```yaml |
| | | Memory: |
| | | powermem: |
| | | type: powermem |
| | | enable_user_profile: true |
| | | llm: |
| | | provider: qwen |
| | | config: |
| | | api_key: sk-xxxxxxxxxxxxxxxx |
| | | model: qwen-plus |
| | | embedder: |
| | | provider: openai |
| | | config: |
| | | api_key: sk-xxxxxxxxxxxxxxxx |
| | | model: text-embedding-v4 |
| | | openai_base_url: https://dashscope.aliyuncs.com/compatible-mode/v1 |
| | | vector_store: |
| | | provider: sqlite |
| | | config: {} |
| | | ``` |
| | | |
| | | ### ä½¿ç¨æºè°±å
è´¹ LLMï¼å®å
¨å
è´¹æ¹æ¡ï¼ |
| | | |
| | | æºè°±æä¾å
è´¹ç glm-4-flash 模åï¼é
å SQLite å¯å®ç°å®å
¨å
费使ç¨ï¼ |
| | | |
| | | 1. è®¿é® [æºè°±AI弿¾å¹³å°](https://bigmodel.cn/) 注åè´¦å· |
| | | 2. å¨ [API Keys](https://bigmodel.cn/usercenter/proj-mgmt/apikeys) 页é¢è·å API å¯é¥ |
| | | 3. é
ç½®å¦ä¸ï¼ |
| | | |
| | | ```yaml |
| | | Memory: |
| | | powermem: |
| | | type: powermem |
| | | enable_user_profile: true |
| | | llm: |
| | | provider: openai # ä½¿ç¨ openai å
¼å®¹æ¨¡å¼ |
| | | config: |
| | | api_key: xxxxxxxxxxxxxxxx.xxxxxxxxxxxxxxxx |
| | | model: glm-4-flash |
| | | openai_base_url: https://open.bigmodel.cn/api/paas/v4/ |
| | | embedder: |
| | | provider: openai |
| | | config: |
| | | api_key: xxxxxxxxxxxxxxxx.xxxxxxxxxxxxxxxx |
| | | model: embedding-3 |
| | | openai_base_url: https://open.bigmodel.cn/api/paas/v4/ |
| | | vector_store: |
| | | provider: sqlite |
| | | config: {} |
| | | ``` |
| | | |
| | | ### ä½¿ç¨ OpenAI |
| | | |
| | | ```yaml |
| | | Memory: |
| | | powermem: |
| | | type: powermem |
| | | enable_user_profile: true |
| | | llm: |
| | | provider: openai |
| | | config: |
| | | api_key: sk-xxxxxxxxxxxxxxxx |
| | | model: gpt-4o-mini |
| | | openai_base_url: https://api.openai.com/v1 |
| | | embedder: |
| | | provider: openai |
| | | config: |
| | | api_key: sk-xxxxxxxxxxxxxxxx |
| | | model: text-embedding-3-small |
| | | openai_base_url: https://api.openai.com/v1 |
| | | vector_store: |
| | | provider: sqlite |
| | | config: {} |
| | | ``` |
| | | |
| | | ### ä½¿ç¨ OceanBaseï¼æä½³æ§è½æ¹æ¡ï¼ |
| | | |
| | | OceanBase æ¯ PowerMem çæä½³ææ¡£ï¼å¯å®ç°æå¤§æ§è½éæ¾ï¼ |
| | | |
| | | 1. é¨ç½² OceanBase æ°æ®åºï¼æ¯æå¼æºæ¬å°é¨ç½²æä½¿ç¨äºæå¡ï¼ |
| | | - 弿ºé¨ç½²ï¼https://github.com/oceanbase/oceanbase |
| | | - äºæå¡ï¼https://www.oceanbase.com/ |
| | | 2. é
ç½®å¦ä¸ï¼ |
| | | |
| | | ```yaml |
| | | Memory: |
| | | powermem: |
| | | type: powermem |
| | | enable_user_profile: true |
| | | llm: |
| | | provider: qwen |
| | | config: |
| | | api_key: sk-xxxxxxxxxxxxxxxx |
| | | model: qwen-plus |
| | | embedder: |
| | | provider: openai |
| | | config: |
| | | api_key: sk-xxxxxxxxxxxxxxxx |
| | | model: text-embedding-v4 |
| | | openai_base_url: https://dashscope.aliyuncs.com/compatible-mode/v1 |
| | | vector_store: |
| | | provider: oceanbase |
| | | config: |
| | | host: 127.0.0.1 |
| | | port: 2881 |
| | | user: root@test |
| | | password: your_password |
| | | db_name: powermem |
| | | collection_name: memories # é»è®¤å¼ |
| | | embedding_model_dims: 1536 # åµå
¥åé维度ï¼å¿
éåæ° |
| | | ``` |
| | | |
| | | ## 设å¤è®°å¿é离 |
| | | |
| | | PowerMem ä¼èªå¨ä½¿ç¨è®¾å¤ IDï¼`device_id`ï¼ä½ä¸º `user_id` è¿è¡è®°å¿é离ãè¿æå³çï¼ |
| | | |
| | | - æ¯ä¸ªè®¾å¤æ¥æç¬ç«çè®°å¿ç©ºé´ |
| | | - ä¸å设å¤ä¹é´çè®°å¿å®å
¨é离 |
| | | - åä¸è®¾å¤ç夿¬¡å¯¹è¯å¯ä»¥å
±äº«è®°å¿ä¸ä¸æ |
| | | |
| | | ## ç¨æ·ç»åï¼UserMemoryï¼ |
| | | |
| | | PowerMem æä¾ `UserMemory` ç±»ï¼å¯èªå¨ä»å¯¹è¯ä¸æåç¨æ·ç»åä¿¡æ¯ã |
| | | |
| | | > ð **çæ¬è¯´æ**ï¼PowerMem 0.3.0+ çæ¬ï¼ç¨æ·ç»ååè½æ¯æ OceanBaseãSeekDBãSQLite ä¸ç§åå¨å端ã |
| | | |
| | | ### å¯ç¨ç¨æ·ç»å |
| | | |
| | | å¨é
ç½®ä¸è®¾ç½® `enable_user_profile: true` å³å¯å¯ç¨ï¼ |
| | | |
| | | ```yaml |
| | | Memory: |
| | | powermem: |
| | | type: powermem |
| | | enable_user_profile: true # å¯ç¨ç¨æ·ç»å |
| | | llm: |
| | | provider: qwen |
| | | config: |
| | | api_key: sk-xxxxxxxxxxxxxxxx |
| | | model: qwen-plus |
| | | embedder: |
| | | provider: openai |
| | | config: |
| | | api_key: sk-xxxxxxxxxxxxxxxx |
| | | model: text-embedding-v4 |
| | | openai_base_url: https://dashscope.aliyuncs.com/compatible-mode/v1 |
| | | vector_store: |
| | | provider: sqlite # ç¨æ·ç»åæ¯æ: oceanbaseãseekdbãsqlite |
| | | config: {} |
| | | ``` |
| | | |
| | | ### ç¨æ·ç»åè½å |
| | | |
| | | | è½å | 说æ | |
| | | |------|------| |
| | | | **ä¿¡æ¯æå** | èªå¨ä»å¯¹è¯ä¸æåå§åãå¹´é¾ãèä¸ãå
´è¶£ç | |
| | | | **æç»æ´æ°** | éç对è¯è¿è¡ï¼ä¸æå®åç¨æ·ç»å | |
| | | | **ç»åæ£ç´¢** | å°ç¨æ·ç»åä¸è®°å¿æç´¢ç»åï¼æåæ£ç´¢ç¸å
³æ§ | |
| | | | **æºè½éå¿** | åºäºè¾å®¾æµ©æ¯éå¿æ²çº¿ï¼æ·¡åè¿æ¶ä¿¡æ¯ | |
| | | |
| | | ### å·¥ä½åç |
| | | |
| | | å¯ç¨ç¨æ·ç»ååï¼å°æºå¨æ¥è¯¢è®°å¿æ¶ä¼èªå¨è¿åï¼ |
| | | 1. **ç¨æ·ç»å**ï¼ç¨æ·çåºæ¬ä¿¡æ¯ãå
´è¶£ç±å¥½ç |
| | | 2. **ç¸å
³è®°å¿**ï¼ä¸å½å对è¯ç¸å
³çåå²è®°å¿ |
| | | |
| | | > â
**çæ¬è¯´æ**ï¼PowerMem 0.3.0+ çæ¬ï¼ç¨æ·ç»ååè½æ¯æ OceanBaseãSeekDBãSQLite ä¸ç§åå¨å端ã |
| | | |
| | | ## ä¸å
¶ä»è®°å¿ç»ä»¶çå¯¹æ¯ |
| | | |
| | | | ç¹æ§ | PowerMem | mem0ai | mem_local_short | |
| | | |------|----------|--------|-----------------| |
| | | | 工使¹å¼ | æ¬å°æ»ç» | äºç«¯æ¥å£ | æ¬å°æ»ç» | |
| | | | åå¨ä½ç½® | æ¬å°/äºç«¯DB | äºç«¯ | æ¬å°YAML | |
| | | | è´¹ç¨ | åå³äºLLMåDB | 1000次/æå
è´¹ | å®å
¨å
è´¹ | |
| | | | æºè½æ£ç´¢ | â
åéæç´¢ | â
åéæç´¢ | â å
¨éè¿å | |
| | | | ç¨æ·ç»å | â
UserMemory | â | â | |
| | | | æºè½éå¿ | â
éå¿æ²çº¿ | â | â | |
| | | | ç§æé¨ç½² | â
æ¯æ | â ä»
äºç«¯ | â
æ¯æ | |
| | | | æ°æ®åºæ¯æ | OceanBase(æ¨è)/SeekDB/PostgreSQL/SQLite | - | YAML æä»¶ | |
| | | |
| | | ## 常è§é®é¢ |
| | | |
| | | ### 1. API å¯é¥é误 |
| | | |
| | | 妿åºç° `API key is required` é误ï¼è¯·æ£æ¥ï¼ |
| | | - `llm_api_key` å `embedding_api_key` æ¯å¦æ£ç¡®å¡«å |
| | | - API å¯é¥æ¯å¦ææ |
| | | |
| | | ### 2. 模åä¸åå¨ |
| | | |
| | | 妿åºç°æ¨¡åä¸åå¨çé误ï¼è¯·ç¡®è®¤ï¼ |
| | | - `llm_model` å `embedding_model` åç§°æ¯å¦æ£ç¡® |
| | | - 对åºç模åæå¡æ¯å¦å·²å¼é |
| | | |
| | | ### 3. è¿æ¥è¶
æ¶ |
| | | |
| | | 妿åºç°è¿æ¥è¶
æ¶ï¼å¯ä»¥å°è¯ï¼ |
| | | - æ£æ¥ç½ç»è¿æ¥ |
| | | - å¦æä½¿ç¨ä»£çï¼é
ç½® `llm_base_url` å `embedding_base_url` |
| | | |
| | | ## æµè¯éªè¯ |
| | | |
| | | å¯ä»¥å¨èæç¯å¢ä¸æµè¯ PowerMem æ¯å¦æ£å¸¸å·¥ä½ï¼ |
| | | |
| | | ```bash |
| | | # æ¿æ´»èæç¯å¢ |
| | | source .venv/bin/activate |
| | | |
| | | # æµè¯ PowerMem 导å
¥ |
| | | python -c "from powermem import AsyncMemory; print('PowerMem 导å
¥æå')" |
| | | |
| | | # æµè¯ UserMemory 导å
¥ï¼ç¨æ·ç»ååè½ï¼ |
| | | python -c "from powermem import UserMemory; print('UserMemory 导å
¥æå')" |
| | | ``` |
| | | |
| | | ## æ´å¤èµæº |
| | | |
| | | - [PowerMem 宿¹ææ¡£](https://www.powermem.ai/) |
| | | - [PowerMem GitHub ä»åº](https://github.com/oceanbase/powermem) |
| | | - [PowerMem 使ç¨ç¤ºä¾](https://github.com/oceanbase/powermem/tree/main/examples) |
| | | - [OceanBase å®ç½](https://www.oceanbase.com/) |
| | | - [OceanBase GitHub](https://github.com/oceanbase/oceanbase) |
| | | - [SeekDB GitHub](https://github.com/oceanbase/seekdb)ï¼AIåçæç´¢æ°æ®åºï¼ |
| | | - [é¿éäºç¾ç¼å¹³å°](https://bailian.console.aliyun.com/) |
| | | |
| New file |
| | |
| | | # ragflow éææå |
| | | |
| | | æ¬æç¨ä¸»è¦æ¯æ¯ä¸¤é¨å |
| | | |
| | | - ä¸ãå¦ä½é¨ç½²ragflow |
| | | - äºãå¦ä½å¨æºæ§å°é
ç½®ragflowæ¥å£ |
| | | |
| | | 妿æ¨å¯¹ragflowå¾çæï¼ä¸å·²ç»é¨ç½²äºragflowï¼å¯ç´æ¥è·³è¿ç¬¬ä¸é¨åï¼ç´æ¥è¿å
¥ç¬¬äºé¨åã使¯å¦æä½ 叿æäººæå¯¼ä½ é¨ç½²ragflowï¼è®©å®è½å¤å`xiaozhi-esp32-server`å
±å使ç¨`mysql`ã`redis`åºç¡æå¡ï¼ä»¥åå°èµæºææ¬ï¼ä½ éè¦ä»ç¬¬ä¸é¨åå¼å§ã |
| | | |
| | | # 第ä¸é¨å å¦ä½é¨ç½²ragflow |
| | | ## ç¬¬ä¸æ¥ï¼ 确认mysqlãredisæ¯å¦å¯ç¨ |
| | | |
| | | ragflowéè¦ä¾èµ`mysql`æ°æ®åºãå¦æä½ ä¹åå·²ç»é¨ç½²`æºæ§å°`ï¼è¯´æä½ å·²ç»å®è£
äº`mysql`ãä½ å¯ä»¥å
±ç¨å®ã |
| | | |
| | | ä½ å¯ä»¥ä½ è¯ä¸ä¸å¨å®¿ä¸»æºä½¿ç¨`telnet`å½ä»¤ï¼ççè½ä¸è½æ£å¸¸è®¿é®`mysql`ç`3306`端å£ã |
| | | ``` shell |
| | | telnet 127.0.0.1 3306 |
| | | |
| | | telnet 127.0.0.1 6379 |
| | | ``` |
| | | 妿è½è®¿é®å°`3306`端å£å`6379`端å£ï¼è¯·å¿½ç¥ä»¥ä¸çå
容ï¼ç´æ¥è¿å
¥ç¬¬äºæ¥ã |
| | | |
| | | 妿ä¸è½è®¿é®ï¼ä½ éè¦åå¿ä¸ä¸ï¼ä½ ç`mysql`æ¯æä¹å®è£
çã |
| | | |
| | | å¦æä½ çmysqlæ¯éè¿èªå·±ä½¿ç¨å®è£
å
å®è£
çï¼è¯´æä½ ç`mysql`åäºç½ç»é离ãä½ å¯è½å
è§£å³è®¿é®`mysql`ç`3306`端å£è¿ä¸ªé®é¢ã |
| | | |
| | | å¦æä½ `mysql`æ¯éè¿æ¬é¡¹ç®ç`docker-compose_all.yml`å®è£
çãä½ éè¦æ¾ä¸ä¸ä½ 彿¶åå»ºæ°æ®åºç`docker-compose_all.yml`æä»¶ï¼ä¿®æ¹ä»¥ä¸çå
容 |
| | | |
| | | ä¿®æ¹å |
| | | ``` yaml |
| | | xiaozhi-esp32-server-db: |
| | | ... |
| | | networks: |
| | | - default |
| | | expose: |
| | | - "3306:3306" |
| | | xiaozhi-esp32-server-redis: |
| | | ... |
| | | expose: |
| | | - 6379 |
| | | ``` |
| | | |
| | | ä¿®æ¹å |
| | | ``` yaml |
| | | xiaozhi-esp32-server-db: |
| | | ... |
| | | networks: |
| | | - default |
| | | ports: |
| | | - "3306:3306" |
| | | xiaozhi-esp32-server-redis: |
| | | ... |
| | | ports: |
| | | - "6379:6379" |
| | | ``` |
| | | |
| | | æ³¨ææ¯å°`xiaozhi-esp32-server-db`å`xiaozhi-esp32-server-redis`ä¸é¢ç`expose`æ¹æ`ports`ãæ¹å®åï¼éè¦éæ°å¯å¨ã以䏿¯éå¯mysqlçå½ä»¤ï¼ |
| | | |
| | | ``` shell |
| | | # è¿å
¥ä½ docker-compose_all.ymlæå¨çæä»¶å¤¹ï¼ä¾å¦æçæ¯xiaozhi-server |
| | | cd xiaozhi-server |
| | | docker compose -f docker-compose_all.yml down |
| | | docker compose -f docker-compose.yml up -d |
| | | ``` |
| | | |
| | | å¯å¨å®åï¼å¨å®¿ä¸»æºå使ç¨`telnet`å½ä»¤ï¼ççè½ä¸è½æ£å¸¸è®¿é®`mysql`ç`3306`端å£ã |
| | | ``` shell |
| | | telnet 127.0.0.1 3306 |
| | | |
| | | telnet 127.0.0.1 6379 |
| | | ``` |
| | | æ£å¸¸æ¥è¯´è¿æ ·å°±å¯ä»¥è®¿é®çäºã |
| | | |
| | | ## ç¬¬äºæ¥ï¼ åå»ºæ°æ®åºå表 |
| | | å¦æä½ ç宿主æºï¼è½æ£å¸¸è®¿é®mysqlæ°æ®åºï¼é£å°±å¨mysqlä¸å建ä¸ä¸ªåå为`rag_flow`çæ°æ®åºå`rag_flow`ç¨æ·ï¼å¯ç 为`infini_rag_flow`ã |
| | | |
| | | ``` sql |
| | | -- åå»ºæ°æ®åº |
| | | CREATE DATABASE IF NOT EXISTS rag_flow CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; |
| | | |
| | | -- åå»ºç¨æ·å¹¶ææ |
| | | CREATE USER IF NOT EXISTS 'rag_flow'@'%' IDENTIFIED BY 'infini_rag_flow'; |
| | | GRANT ALL PRIVILEGES ON rag_flow.* TO 'rag_flow'@'%'; |
| | | |
| | | -- å·æ°æé |
| | | FLUSH PRIVILEGES; |
| | | ``` |
| | | |
| | | ## ç¬¬ä¸æ¥ï¼ ä¸è½½ragflowé¡¹ç® |
| | | |
| | | ä½ éè¦å¨ä½ çµèæ¾ä¸ä¸ªæä»¶å¤¹ï¼ç¨æ¥åæ¾ragflow项ç®ãä¾å¦æå¨`/home/system/xiaozhi`æä»¶å¤¹ã |
| | | |
| | | ä½ å¯ä»¥ä½¿ç¨`git`å½ä»¤ï¼å°ragflow项ç®ä¸è½½å°è¿ä¸ªæä»¶å¤¹ï¼æ¬æç¨ä½¿ç¨çæ¯`v0.22.0`çæ¬è¿è¡å®è£
é¨ç½²ã |
| | | ``` |
| | | git clone https://ghfast.top/https://github.com/infiniflow/ragflow.git |
| | | cd ragflow |
| | | git checkout v0.22.0 |
| | | ``` |
| | | ä¸è½½å®åï¼è¿å
¥`docker`æä»¶å¤¹ã |
| | | ``` shell |
| | | cd docker |
| | | ``` |
| | | ä¿®æ¹`ragflow/docker`æä»¶å¤¹ä¸ç`docker-compose.yml`æä»¶ï¼å°`ragflow-cpu`å`ragflow-gpu`æå¡ç`depends_on`é
ç½®å»æï¼ç¨äºè§£é¤`ragflow-cpu`æå¡å¯¹`mysql`çä¾èµã |
| | | |
| | | è¿æ¯ä¿®æ¹åï¼ |
| | | ``` yaml |
| | | ragflow-cpu: |
| | | depends_on: |
| | | mysql: |
| | | condition: service_healthy |
| | | profiles: |
| | | - cpu |
| | | ... |
| | | ragflow-gpu: |
| | | depends_on: |
| | | mysql: |
| | | condition: service_healthy |
| | | profiles: |
| | | - gpu |
| | | ``` |
| | | è¿æ¯ä¿®æ¹åï¼ |
| | | ``` yaml |
| | | ragflow-cpu: |
| | | profiles: |
| | | - cpu |
| | | ... |
| | | ragflow-gpu: |
| | | profiles: |
| | | - gpu |
| | | ``` |
| | | |
| | | æ¥çï¼ä¿®æ¹`ragflow/docker`æä»¶å¤¹ä¸ç`docker-compose-base.yml`æä»¶ï¼å»æ`mysql`å`redis`çé
ç½®ã |
| | | |
| | | ä¾å¦ï¼å é¤åï¼ |
| | | ``` yaml |
| | | services: |
| | | minio: |
| | | image: quay.io/minio/minio:RELEASE.2025-06-13T11-33-47Z |
| | | ... |
| | | mysql: |
| | | image: mysql:8.0 |
| | | ... |
| | | redis: |
| | | image: redis:6.2-alpine |
| | | ... |
| | | ``` |
| | | |
| | | å é¤å |
| | | ``` yaml |
| | | services: |
| | | minio: |
| | | image: quay.io/minio/minio:RELEASE.2025-06-13T11-33-47Z |
| | | ... |
| | | ``` |
| | | ## ç¬¬åæ¥ï¼ä¿®æ¹ç¯å¢åéé
ç½® |
| | | |
| | | ç¼è¾`ragflow/docker`æä»¶å¤¹ä¸ç`.env`æä»¶,æ¾å°ä»¥ä¸é
ç½®ï¼é个æç´¢ï¼é个修æ¹ï¼é个æç´¢ï¼é个修æ¹ï¼ |
| | | |
| | | ä¸é¢å¯¹äº`.env`æä»¶çä¿®æ¹ï¼60%ç人ä¼å¿½ç¥`MYSQL_USER`é
置导è´ragflowå¯å¨ä¸æåï¼å æ¤ï¼éè¦å¼ºè°ä¸æ¬¡ï¼ |
| | | |
| | | 强è°ç¬¬ä¸æ¬¡ï¼å¦æä½ ç`.env`æä»¶å¦ææ²¡æ`MYSQL_USER`é
ç½®ï¼è¯·å¨é
ç½®æä»¶å¢å è¿é¡¹ï¼ |
| | | |
| | | 强è°ç¬¬äºæ¬¡ï¼å¦æä½ ç`.env`æä»¶å¦ææ²¡æ`MYSQL_USER`é
ç½®ï¼è¯·å¨é
ç½®æä»¶å¢å è¿é¡¹ï¼ |
| | | |
| | | 强è°ç¬¬ä¸æ¬¡ï¼å¦æä½ ç`.env`æä»¶å¦ææ²¡æ`MYSQL_USER`é
ç½®ï¼è¯·å¨é
ç½®æä»¶å¢å è¿é¡¹ï¼ |
| | | |
| | | ``` env |
| | | # 端å£è®¾ç½® |
| | | SVR_WEB_HTTP_PORT=8008 # HTTPç«¯å£ |
| | | SVR_WEB_HTTPS_PORT=8009 # HTTPSç«¯å£ |
| | | # MySQLé
ç½® - ä¿®æ¹ä¸ºæ¨æ¬å°MySQLçä¿¡æ¯ |
| | | MYSQL_HOST=host.docker.internal # 使ç¨host.docker.internal让容å¨è®¿é®ä¸»æºæå¡ |
| | | MYSQL_PORT=3306 # æ¬å°MySQLç«¯å£ |
| | | MYSQL_USER=rag_flow # ä¸é¢å建çç¨æ·åï¼å¦ææ²¡æè¿é¡¹å°±å¢å è¿ä¸é¡¹ |
| | | MYSQL_PASSWORD=infini_rag_flow # ä¸é¢è®¾ç½®çå¯ç |
| | | MYSQL_DBNAME=rag_flow # æ°æ®åºåç§° |
| | | |
| | | # Redisé
ç½® - ä¿®æ¹ä¸ºæ¨æ¬å°Redisçä¿¡æ¯ |
| | | REDIS_HOST=host.docker.internal # 使ç¨host.docker.internal让容å¨è®¿é®ä¸»æºæå¡ |
| | | REDIS_PORT=6379 # æ¬å°Redisç«¯å£ |
| | | REDIS_PASSWORD= # å¦æä½ çRedis没æè®¾ç½®å¯ç ï¼å°±æè¿æ ·åå¡«åï¼å¦åå¡«åå¯ç |
| | | ``` |
| | | |
| | | 注æï¼å¦æä½ çRedis没æè®¾ç½®å¯ç ï¼è¿è¦ä¿®æ¹`ragflow/docker`æä»¶å¤¹ä¸`service_conf.yaml.template`ï¼å°`infini_rag_flow`æ¿æ¢æç©ºå符串ã |
| | | |
| | | ä¿®æ¹å |
| | | ``` shell |
| | | redis: |
| | | db: 1 |
| | | password: '${REDIS_PASSWORD:-infini_rag_flow}' |
| | | host: '${REDIS_HOST:-redis}:6379' |
| | | ``` |
| | | ä¿®æ¹å |
| | | ``` shell |
| | | redis: |
| | | db: 1 |
| | | password: '${REDIS_PASSWORD:-}' |
| | | host: '${REDIS_HOST:-redis}:6379' |
| | | ``` |
| | | |
| | | ## ç¬¬äºæ¥ï¼å¯å¨ragflowæå¡ |
| | | æ§è¡å½ä»¤ï¼ |
| | | ``` shell |
| | | docker-compose -f docker-compose.yml up -d |
| | | ``` |
| | | æ§è¡æååï¼ä½ å¯ä»¥ä½¿ç¨`docker logs -n 20 -f docker-ragflow-cpu-1`å½ä»¤ï¼æ¥ç`docker-ragflow-cpu-1`æå¡çæ¥å¿ã |
| | | |
| | | 妿æ¥å¿ä¸æ²¡ææ¥éï¼è¯´æragflowæå¡å¯å¨æåã |
| | | |
| | | # ç¬¬äºæ¥ï¼æ³¨åè´¦å· |
| | | ä½ å¯ä»¥å¨æµè§å¨ä¸è®¿é®`http://127.0.0.1:8008`ï¼ç¹å»`Sign Up`ï¼æ³¨åä¸ä¸ªè´¦å·ã |
| | | |
| | | 注åæååï¼ä½ å¯ä»¥ç¹å»`Sign In`ï¼ç»å½å°ragflowæå¡ãå¦æä½ æ³å
³éragflowæå¡ç注åæå¡ï¼ä¸æ³è®©å
¶ä»äººæ³¨åè´¦å·ï¼ä½ å¯ä»¥å¨`ragflow/docker`æä»¶å¤¹ä¸ç`.env`æä»¶ä¸ï¼å°`REGISTER_ENABLED`é
置项设置为`0`ã |
| | | |
| | | ``` dotenv |
| | | REGISTER_ENABLED=0 |
| | | ``` |
| | | ä¿®æ¹åï¼éå¯å¯å¨ragflowæå¡ã |
| | | ``` shell |
| | | docker-compose -f docker-compose.yml down |
| | | docker-compose -f docker-compose.yml up -d |
| | | ``` |
| | | |
| | | # 第å
æ¥ï¼é
ç½®ragflowæå¡ç模å |
| | | ä½ å¯ä»¥å¨æµè§å¨ä¸è®¿é®`http://127.0.0.1:8008`ï¼ç¹å»`Sign In`ï¼ç»å½å°ragflowæå¡ãç¹å»é¡µé¢å³ä¸è§ç`头å`ï¼è¿å
¥è®¾ç½®é¡µé¢ã |
| | | é¦å
ï¼å¨å·¦ä¾§å¯¼èªæ ä¸ï¼ç¹å»`模åä¾åºå`ï¼è¿å
¥å°æ¨¡åé
置页é¢ãå¨å³ä¾§ç`å¯é模å`æç´¢æ¡ä¸ï¼éæ©`LLM`ï¼å¨åè¡¨éæ©ä½ ä½¿ç¨ç模åä¾åºåï¼ç¹å»`æ·»å `ï¼è¾å
¥ä½ çå¯é¥ï¼ |
| | | ç¶åï¼éæ©`TEXT EMBEDDING`ï¼å¨åè¡¨éæ©ä½ ä½¿ç¨ç模åä¾åºåï¼ç¹å»`æ·»å `ï¼è¾å
¥ä½ çå¯é¥ã |
| | | æåï¼å·æ°ä¸ä¸é¡µé¢ï¼åå«ç¹å»`设置é»è®¤æ¨¡å`å表çLLMåEmbeddingï¼éæ©ä½ 使ç¨ç模åå³å¯ãè¯·ç¡®è®¤ä½ çå¯é¥å¼éäºç¸åºçæå¡ï¼æ¯å¦ææ¯ç¨çEmbeddingæ¨¡åæ¯xxxä¾åºåçï¼éè¦å»è¿ä¸ªä¾åºåå®ç½æ¥çè¿ä¸ªæ¨¡åæ¯å¦éè¦è´ä¹°èµæºå
æè½ä½¿ç¨ã |
| | | |
| | | |
| | | # 第äºé¨å é
ç½®ragflowæå¡ |
| | | |
| | | # ç¬¬ä¸æ¥ ç»å½ragflowæå¡ |
| | | ä½ å¯ä»¥å¨æµè§å¨ä¸è®¿é®`http://127.0.0.1:8008`ï¼ç¹å»`Sign In`ï¼ç»å½å°ragflowæå¡ã |
| | | |
| | | ç¶åç¹å»å³ä¸è§ç`头å`ï¼è¿å
¥è®¾ç½®é¡µé¢ãå¨å·¦ä¾§å¯¼èªæ ä¸ï¼ç¹å»`API`åè½ï¼ç¶åç¹å»"API Key"æé®ãåºç°ä¸ä¸ªå¼¹æ¡ï¼ |
| | | |
| | | å¨å¼¹æ¡ä¸ï¼ç¹å»"Create new Key"æé®ï¼çæä¸ä¸ªAPI Keyãå¤å¶è¿ä¸ª`API Key`ï¼ä½ ç¨åä¼ç¨å°ã |
| | | |
| | | # ç¬¬äºæ¥ é
ç½®å°æºæ§å° |
| | | ç¡®ä¿ä½ çæºæ§å°çæ¬æ¯`0.8.7`æä»¥ä¸ã使ç¨è¶
级管çåè´¦å·ç»å½å°æºæ§å°ã |
| | | |
| | | é¦å
ï¼ä½ è¦å
å¼å¯ç¥è¯åºåè½ãå¨é¡¶é¨å¯¼èªæ ä¸ï¼ç¹å»`åæ°åå
¸`ï¼å¨ä¸æèåä¸ï¼ç¹å»`ç³»ç»åè½é
ç½®`页é¢ãå¨é¡µé¢ä¸å¾é`ç¥è¯åº`ï¼ç¹å»`ä¿åé
ç½®`ãå³å¯å¨å¯¼èªæ çå°`ç¥è¯åº`åè½ã |
| | | |
| | | å¨é¡¶é¨å¯¼èªæ ä¸ï¼ç¹å»`模åé
ç½®`ï¼å¨å·¦ä¾§å¯¼èªæ ä¸ï¼ç¹å»`ç¥è¯åº`ãå¨åè¡¨ä¸æ¾å°`RAG_RAGFlow`ï¼ç¹å»`ç¼è¾`æé®ã |
| | | |
| | | å¨`æå¡å°å`ä¸ï¼å¡«å`http://ä½ çragflowæå¡çå±åç½IP:8008`ï¼ä¾å¦æçragflowæå¡çå±åç½IPæ¯`192.168.1.100`ï¼é£ä¹æå°±å¡«å`http://192.168.1.100:8008`ã |
| | | |
| | | å¨`APIå¯é¥`ä¸ï¼å¡«åä¹åå¤å¶ç`API Key`ã |
| | | |
| | | æåç¹å»ä¿åæé®ã |
| | | |
| | | # ç¬¬äºæ¥ å建ä¸ä¸ªç¥è¯åº |
| | | 使ç¨è¶
级管çåè´¦å·ç»å½å°æºæ§å°ãå¨é¡¶é¨å¯¼èªæ ä¸ï¼ç¹å»`ç¥è¯åº`ï¼å¨å表左ä¸èï¼ç¹å»`æ°å¢`æé®ãå¡«åä¸ä¸ªç¥è¯åºçåååæè¿°ãç¹å»ä¿åã |
| | | |
| | | ä¸ºäºæé«å¤§æ¨¡å对ç¥è¯åºççè§£åå¬åè½åï¼å»ºè®®å¨å建ç¥è¯åºæ¶ï¼å¡«åä¸ä¸ªææä¹çåååæè¿°ãä¾å¦ï¼å¦æä½ è¦å建ä¸ä¸ªå
³äº`å
¬å¸ä»ç»`çç¥è¯åºï¼é£ä¹ç¥è¯åºçååå¯ä»¥æ¯`å
¬å¸ä»ç»`ï¼æè¿°å¯ä»¥æ¯`å
³äºå
¬å¸çç¸å
³ä¿¡æ¯ä¾å¦å
¬å¸åºæ¬ä¿¡æ¯ãæå¡é¡¹ç®ãèç³»çµè¯ãå°åçã`ã |
| | | |
| | | ä¿ååï¼ä½ å¯ä»¥å¨ç¥è¯åºå表ä¸çå°è¿ä¸ªç¥è¯åºãç¹å»åæå建çç¥è¯åºç`æ¥ç`æé®ï¼è¿å
¥ç¥è¯åºè¯¦æ
页é¢ã |
| | | |
| | | å¨ç¥è¯åºè¯¦æ
页é¢ä¸ï¼å·¦ä¸è§ç¹å»`æ°å¢`æé®ï¼å¯ä»¥ä¸ä¼ ææ¡£å°ç¥è¯åºã |
| | | |
| | | ä¸ä¼ åï¼ä½ å¯ä»¥å¨ç¥è¯åºè¯¦æ
页é¢ä¸ï¼çå°ä¸ä¼ çææ¡£ãæ¤æ¶å¯ä»¥ç¹å»ææ¡£ç`è§£æ`æé®ï¼è§£æææ¡£ã |
| | | |
| | | è§£æå®æåï¼ä½ å¯ä»¥æ¥çè§£æåçåçä¿¡æ¯ãä½ å¯ä»¥å¨ç¥è¯åºè¯¦æ
页é¢ä¸ï¼ç¹å»`å¬åæµè¯`æé®ï¼å¯ä»¥æµè¯ç¥è¯åºçå¬å/æ£ç´¢åè½ã |
| | | |
| | | # ç¬¬ä¸æ¥ è®©å°æºä½¿ç¨ragflowç¥è¯åº |
| | | ç»å½å°æºæ§å°ãå¨é¡¶é¨å¯¼èªæ ä¸ï¼ç¹å»`æºè½ä½`ï¼æ¾å°ä½ è¦é
ç½®çæºè½ä½ï¼ç¹å»`é
ç½®è§è²`æé®ã |
| | | |
| | | 卿å¾è¯å«å·¦ä¾§ï¼ç¹å»`ç¼è¾åè½`æé®ï¼å¼¹åºä¸ä¸ªå¼¹æ¡ãå¨å¼¹æ¡ä¸éæ©ä½ è¦æ·»å çç¥è¯åºãä¿åå³å¯ã |
| New file |
| | |
| | | [](https://github.com/xinnan-tech/xiaozhi-esp32-server) |
| | | |
| | | <h1 align="center">Xiaozhi Backend-Service xiaozhi-esp32-server</h1> |
| | | |
| | | <p align="center"> |
| | | Dieses Projekt basiert auf der Theorie und Technologie der Mensch-Maschine-symbiotischen Intelligenz zur Entwicklung intelligenter Terminal-Hardware- und Software-Systeme<br/>und bietet Backend-Dienste für das Open-Source-Hardware-Projekt |
| | | <a href="https://github.com/78/xiaozhi-esp32">xiaozhi-esp32</a><br/> |
| | | Implementiert mit Python, Java und Vue gemäà dem <a href="https://ccnphfhqs21z.feishu.cn/wiki/M0XiwldO9iJwHikpXD5cEx71nKh">Xiaozhi-Kommunikationsprotokoll</a><br/> |
| | | Unterstützt MQTT+UDP-Protokoll, Websocket-Protokoll, MCP-Endpunkte und Stimmabdruckerkennung |
| | | </p> |
| | | |
| | | <p align="center"> |
| | | <a href="../FAQ.md">Häufige Fragen</a> |
| | | · <a href="https://github.com/xinnan-tech/xiaozhi-esp32-server/issues">Probleme melden</a> |
| | | · <a href="../../README.md#%E9%83%A8%E7%BD%B2%E6%96%87%E6%A1%A3">Deployment-Dokumentation</a> |
| | | · <a href="https://github.com/xinnan-tech/xiaozhi-esp32-server/releases">Release-Hinweise</a> |
| | | </p> |
| | | |
| | | <p align="center"> |
| | | <a href="../../README.md"><img alt="ç®ä½ä¸æçèªè¿°æä»¶" src="https://img.shields.io/badge/ç®ä½ä¸æ-DFE0E5"></a> |
| | | <a href="./README_en.md"><img alt="README in English" src="https://img.shields.io/badge/English-DFE0E5"></a> |
| | | <a href="./README_vi.md"><img alt="Tiếng Viá»t" src="https://img.shields.io/badge/Tiếng Viá»t-DFE0E5"></a> |
| | | <a href="./README_de.md"><img alt="Deutsch" src="https://img.shields.io/badge/Deutsch-DBEDFA"></a> |
| | | <a href="./README_pt_BR.md"><img alt="Português (Brasil)" src="https://img.shields.io/badge/Português (Brasil)-DFE0E5"></a> |
| | | <a href="https://github.com/xinnan-tech/xiaozhi-esp32-server/releases"> |
| | | <img alt="GitHub Contributors" src="https://img.shields.io/github/v/release/xinnan-tech/xiaozhi-esp32-server?logo=docker" /> |
| | | </a> |
| | | <a href="https://github.com/xinnan-tech/xiaozhi-esp32-server/blob/main/LICENSE"> |
| | | <img alt="GitHub pull requests" src="https://img.shields.io/badge/license-MIT-white?labelColor=black" /> |
| | | </a> |
| | | <a href="https://github.com/xinnan-tech/xiaozhi-esp32-server"> |
| | | <img alt="stars" src="https://img.shields.io/github/stars/xinnan-tech/xiaozhi-esp32-server?color=ffcb47&labelColor=black" /> |
| | | </a> |
| | | </p> |
| | | |
| | | <p align="center"> |
| | | Geleitet vom Team von Professor Siyuan Liu (South China University of Technology) |
| | | </br> |
| | | åææºææå¢é主导ç å(ååç工大å¦) |
| | | </br> |
| | | <img src="../images/hnlg.jpg" alt="South China University of Technology" width="50%"> |
| | | </p> |
| | | |
| | | --- |
| | | |
| | | ## Zielgruppe ð¥ |
| | | |
| | | Dieses Projekt erfordert ESP32-Hardware-Geräte zum Betrieb. Wenn Sie ESP32-bezogene Hardware erworben haben, erfolgreich eine Verbindung zu Brother Xias bereitgestelltem Backend-Service hergestellt haben und Ihren eigenen `xiaozhi-esp32`-Backend-Service unabhängig aufbauen möchten, dann ist dieses Projekt perfekt für Sie. |
| | | |
| | | Möchten Sie die Nutzungseffekte sehen? Klicken Sie auf die Videos unten ð¥ |
| | | |
| | | <table> |
| | | <tr> |
| | | <td> |
| | | <a href="https://www.bilibili.com/video/BV1FMFyejExX" target="_blank"> |
| | | <picture> |
| | | <img alt="ååºé度æå" src="docs/images/demo9.png" /></picture> |
| | | </a> |
| | | </td> |
| | | <td> |
| | | <a href="https://www.bilibili.com/video/BV1vchQzaEse" target="_blank"> |
| | | <picture> |
| | | <img alt="é度ä¼åç§è¯" src="docs/images/demo6.png" /></picture> |
| | | </a> |
| | | </td> |
| | | <td> |
| | | <a href="https://www.bilibili.com/video/BV1WEcxzFEAT" target="_blank"> |
| | | <picture> |
| | | <img alt="å°æºæ°å人 æ¯æè¯é³å¤é" src="docs/images/demo8.png" /></picture> |
| | | </a> |
| | | </td> |
| | | <td> |
| | | <a href="https://www.bilibili.com/video/BV1CKVz6UEuB" target="_blank"> |
| | | <picture> |
| | | <img alt="设å¤å¼å«è®¾å¤ï¼æçµè¯" src="docs/images/demo0.png" /></picture> |
| | | </a> |
| | | </td> |
| | | <td> |
| | | <a href="https://www.bilibili.com/video/BV1C1tCzUEZh" target="_blank"> |
| | | <picture> |
| | | <img alt="夿å»çåºæ¯" src="docs/images/demo1.png" /></picture> |
| | | </a> |
| | | </td> |
| | | </tr> |
| | | <tr> |
| | | <td> |
| | | <a href="https://www.bilibili.com/video/BV1VC96Y5EMH" target="_blank"> |
| | | <picture> |
| | | <img alt="ææ¾é³ä¹æ¥è¯¢å¤©æ°ææ¥æ°é»" src="docs/images/demo7.png" /></picture> |
| | | </a> |
| | | </td> |
| | | <td> |
| | | <a href="https://www.bilibili.com/video/BV12J7WzBEaH" target="_blank"> |
| | | <picture> |
| | | <img alt="宿¶ææ" src="docs/images/demo10.png" /></picture> |
| | | </a> |
| | | </td> |
| | | <td> |
| | | <a href="https://www.bilibili.com/video/BV1Co76z7EvK" target="_blank"> |
| | | <picture> |
| | | <img alt="æç
§è¯ç©å" src="docs/images/demo12.png" /></picture> |
| | | </a> |
| | | </td> |
| | | <td> |
| | | <a href="https://www.bilibili.com/video/BV1pNXWYGEx1" target="_blank"> |
| | | <picture> |
| | | <img alt="æ§å¶å®¶çµå¼å
³" src="docs/images/demo5.png" /></picture> |
| | | </a> |
| | | </td> |
| | | <td> |
| | | <a href="https://www.bilibili.com/video/BV1TJ7WzzEo6" target="_blank"> |
| | | <picture> |
| | | <img alt="夿令任å¡" src="docs/images/demo11.png" /></picture> |
| | | </a> |
| | | </td> |
| | | </tr> |
| | | <tr> |
| | | <td> |
| | | <a href="https://www.bilibili.com/video/BV1ZQKUzYExM" target="_blank"> |
| | | <picture> |
| | | <img alt="MCPæ¥å
¥ç¹" src="docs/images/demo13.png" /></picture> |
| | | </a> |
| | | </td> |
| | | <td> |
| | | <a href="https://www.bilibili.com/video/BV1zUW5zJEkq" target="_blank"> |
| | | <picture> |
| | | <img alt="MQTTæä»¤ä¸å" src="docs/images/demo4.png" /></picture> |
| | | </a> |
| | | </td> |
| | | <td> |
| | | <a href="https://www.bilibili.com/video/BV1Exu3zqEDe" target="_blank"> |
| | | <picture> |
| | | <img alt="声纹è¯å«" src="docs/images/demo14.png" /></picture> |
| | | </a> |
| | | </td> |
| | | <td> |
| | | <a href="https://www.bilibili.com/video/BV1CDKWemEU6" target="_blank"> |
| | | <picture> |
| | | <img alt="èªå®ä¹é³è²" src="docs/images/demo2.png" /></picture> |
| | | </a> |
| | | </td> |
| | | <td> |
| | | <a href="https://www.bilibili.com/video/BV12yA2egEaC" target="_blank"> |
| | | <picture> |
| | | <img alt="使ç¨ç²¤è¯äº¤æµ" src="docs/images/demo3.png" /></picture> |
| | | </a> |
| | | </td> |
| | | </tr> |
| | | </table> |
| | | |
| | | --- |
| | | |
| | | ## Warnungen â ï¸ |
| | | |
| | | 1. Dieses Projekt ist Open-Source-Software. Diese Software hat keine kommerzielle Partnerschaft mit Drittanbieter-API-Dienstleistern (einschlieÃlich, aber nicht beschränkt auf Spracherkennung, groÃe Modelle, Sprachsynthese und andere Plattformen), mit denen sie sich verbindet, und bietet keine Garantie für deren Servicequalität oder finanzielle Sicherheit. Es wird empfohlen, dass Benutzer Dienstleister mit entsprechenden Geschäftslizenzen bevorzugen und deren Servicevereinbarungen und Datenschutzrichtlinien sorgfältig lesen. Diese Software hostet keine Kontoschlüssel, nimmt nicht an Geldströmen teil und trägt nicht das Risiko von Verlusten bei Guthaben-Aufladungen. |
| | | |
| | | 2. Die Funktionalität dieses Projekts ist nicht vollständig und hat keine Netzwerksicherheitsbewertung bestanden. Bitte verwenden Sie es nicht in Produktionsumgebungen. Wenn Sie dieses Projekt zu Lernzwecken in einer öffentlichen Netzwerkumgebung bereitstellen, stellen Sie bitte sicher, dass notwendige SchutzmaÃnahmen vorhanden sind. |
| | | |
| | | --- |
| | | |
| | | ## Deployment-Dokumentation |
| | | |
| | |  |
| | | |
| | | Dieses Projekt bietet zwei Bereitstellungsmethoden. Bitte wählen Sie basierend auf Ihren spezifischen Anforderungen: |
| | | |
| | | #### ð Auswahl der Bereitstellungsmethode |
| | | | Bereitstellungsmethode | Funktionen | Anwendungsszenarien | Deployment-Dokumente | Konfigurationsanforderungen | Video-Tutorials | |
| | | |---------|------|---------|---------|---------|---------| |
| | | | **Vereinfachte Installation** | Intelligenter Dialog, Einzel-Agenten-Verwaltung | Umgebungen mit geringer Konfiguration, Daten in Konfigurationsdateien gespeichert, keine Datenbank erforderlich | [â Docker-Version](../Deployment.md#%E6%96%B9%E5%BC%8F%E4%B8%80docker%E5%8F%AA%E8%BF%90%E8%A1%8Cserver) / [â¡Quellcode-Deployment](../Deployment.md#%E6%96%B9%E5%BC%8F%E4%BA%8C%E6%9C%AC%E5%9C%B0%E6%BA%90%E7%A0%81%E5%8F%AA%E8%BF%90%E8%A1%8Cserver)| 2 Kerne 4GB bei Verwendung von `FunASR`, 2 Kerne 2GB bei allen APIs | - | |
| | | | **Vollständige Modulinstallation** | Intelligenter Dialog, Mehrbenutzerverwaltung, Mehr-Agenten-Verwaltung, Intelligente Steuerkonsole-Bedienung | Vollständige Funktionserfahrung, Daten in Datenbank gespeichert |[â Docker-Version](../Deployment_all.md#%E6%96%B9%E5%BC%8F%E4%B8%80docker%E8%BF%90%E8%A1%8C%E5%85%A8%E6%A8%A1%E5%9D%97) / [â¡Quellcode-Deployment](../Deployment_all.md#%E6%96%B9%E5%BC%8F%E4%BA%8C%E6%9C%AC%E5%9C%B0%E6%BA%90%E7%A0%81%E8%BF%90%E8%A1%8C%E5%85%A8%E6%A8%A1%E5%9D%97) / [â¢Quellcode-Deployment Auto-Update-Tutorial](../dev-ops-integration.md) | 4 Kerne 8GB bei Verwendung von `FunASR`, 2 Kerne 4GB bei allen APIs| [Video-Tutorial für lokalen Quellcode-Start](https://www.bilibili.com/video/BV1wBJhz4Ewe) | |
| | | |
| | | Häufige Fragen und entsprechende Tutorials finden Sie unter [diesem Link](../FAQ.md) |
| | | |
| | | > ð¡ Hinweis: Unten ist eine Testplattform, die mit dem neuesten Code bereitgestellt wurde. Sie können bei Bedarf brennen und testen. Gleichzeitige Benutzer: 6, Daten werden täglich gelöscht. |
| | | |
| | | ``` |
| | | Adresse der intelligenten Steuerkonsole: https://2662r3426b.vicp.fun |
| | | Adresse der intelligenten Steuerkonsole (H5): https://2662r3426b.vicp.fun/h5/index.html |
| | | |
| | | Service-Testtool: https://2662r3426b.vicp.fun/test/ |
| | | OTA-Schnittstellenadresse: https://2662r3426b.vicp.fun/xiaozhi/ota/ |
| | | Websocket-Schnittstellenadresse: wss://2662r3426b.vicp.fun/xiaozhi/v1/ |
| | | ``` |
| | | |
| | | #### ð© Konfigurationsbeschreibung und Empfehlungen |
| | | > [!Note] |
| | | > Dieses Projekt bietet zwei Konfigurationsschemata: |
| | | > |
| | | > 1. `Einstiegslevel Kostenlose Einstellungen`: Geeignet für den persönlichen und privaten Gebrauch, alle Komponenten verwenden kostenlose Lösungen, keine zusätzliche Zahlung erforderlich. |
| | | > |
| | | > 2. `Streaming-Konfiguration`: Geeignet für Demonstrationen, Schulungen, Szenarien mit mehr als 2 gleichzeitigen Benutzern usw. Verwendet Streaming-Verarbeitungstechnologie für schnellere Reaktionsgeschwindigkeit und bessere Erfahrung. |
| | | > |
| | | > Ab Version `0.5.2` unterstützt das Projekt Streaming-Konfiguration. Im Vergleich zu früheren Versionen ist die Reaktionsgeschwindigkeit um ca. `2,5 Sekunden` verbessert, was die Benutzererfahrung erheblich verbessert. |
| | | |
| | | | Modulname | Einstiegslevel Kostenlose Einstellungen | Streaming-Konfiguration | |
| | | |:---:|:---:|:---:| |
| | | | ASR (Spracherkennung) | FunASR (Lokal) | ðXunfeiStreamASR (Xunfei-Streaming) | |
| | | | LLM (GroÃes Modell) | glm-4-flash (Zhipu) | ðqwen-flash (Alibaba Bailian) | |
| | | | VLLM (Vision Large Model) | glm-4v-flash (Zhipu) | ðqwen3.5-flash (Alibaba Bailian) | |
| | | | TTS (Sprachsynthese) | EdgeTTS (Microsoft) | ðHuoshanDoubleStreamTTS (Volcano-Streaming) | |
| | | | Intent (Absichtserkennung) | function_call (Funktionsaufruf) | function_call (Funktionsaufruf) | |
| | | | Memory (Gedächtnisfunktion) | mem_local_short (Lokales Kurzzeitgedächtnis) | mem_local_short (Lokales Kurzzeitgedächtnis) | |
| | | |
| | | Wenn Sie sich um die Latenz jeder Komponente kümmern, lesen Sie bitte den [Xiaozhi-Komponenten-Leistungstestbericht](https://github.com/xinnan-tech/xiaozhi-performance-research). Sie können gemäà den Testmethoden im Bericht in Ihrer Umgebung tatsächlich testen. |
| | | |
| | | #### ð§ Testwerkzeuge |
| | | Dieses Projekt bietet die folgenden Testwerkzeuge, um Ihnen bei der Ãberprüfung des Systems und der Auswahl geeigneter Modelle zu helfen: |
| | | |
| | | | Werkzeugname | Standort | Verwendungsmethode | Funktionsbeschreibung | |
| | | |:---:|:---|:---:|:---:| |
| | | | Audio-Interaktionstesttool | mainãdigital-humanãindex.html | In `main/digital-human` `python start.py` ausführen und dann `http://127.0.0.1:8006/index.html` öffnen | Testet Audio-Wiedergabe- und Empfangsfunktionen, überprüft, ob die Python-seitige Audioverarbeitung normal ist | |
| | | | Modell-Reaktionstesttool | mainãxiaozhi-serverãperformance_tester.py | Ausführen `python performance_tester.py` | Testet die Reaktionsgeschwindigkeit von ASR (Spracherkennung), LLM (groÃes Modell), VLLM (Vision-Modell), TTS (Sprachsynthese) drei Kernmodulen | |
| | | |
| | | > ð¡ Hinweis: Beim Testen der Modellgeschwindigkeit werden nur Modelle mit konfigurierten Schlüsseln getestet. |
| | | |
| | | --- |
| | | ## Funktionsliste ⨠|
| | | ### Implementiert â
|
| | |  |
| | | | Funktionsmodul | Beschreibung | |
| | | |:---:|:---| |
| | | | Kernarchitektur | Basierend auf [MQTT+UDP-Gateway](https://github.com/xinnan-tech/xiaozhi-esp32-server/blob/main/docs/mqtt-gateway-integration.md), WebSocket und HTTP-Servern, bietet vollständiges Konsolenverwaltungs- und Authentifizierungssystem | |
| | | | Sprachinteraktion | Unterstützt Streaming-ASR (Spracherkennung), Streaming-TTS (Sprachsynthese), VAD (Sprachaktivitätserkennung), unterstützt mehrsprachige Erkennung und Sprachverarbeitung | |
| | | | Stimmabdruckerkennung | Unterstützt Mehrbenutzer-Stimmabdruckregistrierung, -verwaltung und -erkennung, verarbeitet parallel mit ASR, Echtzeit-Sprecheridentitätserkennung und Weitergabe an LLM für personalisierte Antworten | |
| | | | Intelligenter Dialog | Unterstützt mehrere LLM (groÃe Sprachmodelle), implementiert intelligenten Dialog | |
| | | | Visuelle Wahrnehmung | Unterstützt mehrere VLLM (Vision Large Models), implementiert multimodale Interaktion | |
| | | | Absichtserkennung | Unterstützt LLM-Absichtserkennung, Function Call-Funktionsaufruf, bietet plugin-basierten Absichtsverarbeitungsmechanismus | |
| | | | Gedächtnissystem | Unterstützt lokales Kurzzeitgedächtnis, mem0ai-Schnittstellengedächtnis, PowerMem intelligentes Gedächtnis, mit Gedächtniszusammenfassungsfunktion | |
| | | | Wissensdatenbank | Unterstützt RAGFlow-Wissensdatenbank, ermöglicht groÃem Modell die Bewertung, ob Wissensdatenbank benötigt wird, bevor geantwortet wird | |
| | | | Werkzeugaufruf | Unterstützt Client-IOT-Protokoll, Client-MCP-Protokoll, Server-MCP-Protokoll, MCP-Endpunktprotokoll, benutzerdefinierte Werkzeugfunktionen | |
| | | | Befehlsübermittlung | Basierend auf MQTT-Protokoll, unterstützt die Ãbermittlung von MCP-Befehlen von der intelligenten Steuerkonsole an ESP32-Geräte | |
| | | | Verwaltungs-Backend | Bietet Web-Verwaltungsoberfläche, unterstützt Benutzerverwaltung, Systemkonfiguration und Geräteverwaltung; Oberfläche unterstützt vereinfachtes Chinesisch, traditionelles Chinesisch und englische Anzeige | |
| | | | Testwerkzeuge | Bietet Leistungstestwerkzeuge, Vision-Modell-Testwerkzeuge und Audio-Interaktionstestwerkzeuge | |
| | | | Deployment-Unterstützung | Unterstützt Docker-Deployment und lokales Deployment, bietet vollständige Konfigurationsdateiverwaltung | |
| | | | Plugin-System | Unterstützt funktionale Plugin-Erweiterungen, benutzerdefinierte Plugin-Entwicklung und Plugin-Hot-Loading | |
| | | |
| | | ### In Entwicklung ð§ |
| | | |
| | | Um über spezifische Entwicklungsplanfortschritte zu erfahren, [klicken Sie hier](https://github.com/users/xinnan-tech/projects/3). Häufige Fragen und entsprechende Tutorials finden Sie unter [diesem Link](../FAQ.md) |
| | | |
| | | Wenn Sie ein Softwareentwickler sind, finden Sie hier einen [Offenen Brief an Entwickler](../contributor_open_letter.md). Willkommen beim Beitritt! |
| | | |
| | | --- |
| | | |
| | | ## Produktökosystem ð¬ |
| | | Xiaozhi ist ein Ãkosystem. Wenn Sie dieses Produkt verwenden, können Sie sich auch andere [hervorragende Projekte](https://github.com/78/xiaozhi-esp32/blob/main/README_zh.md#%E7%9B%B8%E5%85%B3%E5%BC%80%E6%BA%90%E9%A1%B9%E7%9B%AE) in diesem Ãkosystem ansehen |
| | | |
| | | --- |
| | | |
| | | ## Liste der von diesem Projekt unterstützten Plattformen/Komponenten ð |
| | | ### LLM-Sprachmodelle |
| | | |
| | | | Verwendungsmethode | Unterstützte Plattformen | Kostenlose Plattformen | |
| | | |:---:|:---:|:---:| |
| | | | OpenAI-Schnittstellenaufrufe | Alibaba Bailian, Volcano Engine Doubao, DeepSeek, Zhipu ChatGLM, Gemini | Zhipu ChatGLM, Gemini | |
| | | | Ollama-Schnittstellenaufrufe | Ollama | - | |
| | | | Dify-Schnittstellenaufrufe | Dify | - | |
| | | | FastGPT-Schnittstellenaufrufe | FastGPT | - | |
| | | | Coze-Schnittstellenaufrufe | Coze | - | |
| | | | Xinference-Schnittstellenaufrufe | Xinference | - | |
| | | | HomeAssistant-Schnittstellenaufrufe | HomeAssistant | - | |
| | | |
| | | Tatsächlich kann jedes LLM, das OpenAI-Schnittstellenaufrufe unterstützt, integriert und verwendet werden. |
| | | |
| | | --- |
| | | |
| | | ### VLLM-Vision-Modelle |
| | | |
| | | | Verwendungsmethode | Unterstützte Plattformen | Kostenlose Plattformen | |
| | | |:---:|:---:|:---:| |
| | | | OpenAI-Schnittstellenaufrufe | Alibaba Bailian, Zhipu ChatGLMVLLM | Zhipu ChatGLMVLLM | |
| | | |
| | | Tatsächlich kann jedes VLLM, das OpenAI-Schnittstellenaufrufe unterstützt, integriert und verwendet werden. |
| | | |
| | | --- |
| | | |
| | | ### TTS-Sprachsynthese |
| | | |
| | | | Verwendungsmethode | Unterstützte Plattformen | Kostenlose Plattformen | |
| | | |:---:|:---:|:---:| |
| | | | Schnittstellenaufrufe | EdgeTTS, Volcano Engine Doubao TTS, Tencent Cloud, Alibaba Cloud TTS, AliYun Stream TTS, CosyVoiceSiliconflow, TTS302AI, CozeCnTTS, GizwitsTTS, ACGNTTS, OpenAITTS, Lingxi Streaming TTS, MinimaxTTS, Volcano Dual-Stream TTS | Lingxi Streaming TTS, EdgeTTS, CosyVoiceSiliconflow (teilweise) | |
| | | | Lokale Dienste | FishSpeech, GPT_SOVITS_V2, GPT_SOVITS_V3, Index-TTS, PaddleSpeech | Index-TTS, PaddleSpeech, FishSpeech, GPT_SOVITS_V2, GPT_SOVITS_V3 | |
| | | |
| | | --- |
| | | |
| | | ### VAD-Sprachaktivitätserkennung |
| | | |
| | | | Typ | Plattformname | Verwendungsmethode | Preismodell | Hinweise | |
| | | |:---:|:---------:|:----:|:----:|:--:| |
| | | | VAD | SileroVAD | Lokale Verwendung | Kostenlos | | |
| | | |
| | | --- |
| | | |
| | | ### ASR-Spracherkennung |
| | | |
| | | | Verwendungsmethode | Unterstützte Plattformen | Kostenlose Plattformen | |
| | | |:---:|:---:|:---:| |
| | | | Lokale Verwendung | FunASR, SherpaASR | FunASR, SherpaASR | |
| | | | Schnittstellenaufrufe | DoubaoASR, Doubao Streaming ASR, FunASRServer, TencentASR, AliyunASR, Aliyun Streaming ASR, Baidu ASR, OpenAI ASR | FunASRServer | |
| | | |
| | | --- |
| | | |
| | | ### Voiceprint-Stimmabdruckerkennung |
| | | |
| | | | Verwendungsmethode | Unterstützte Plattformen | Kostenlose Plattformen | |
| | | |:---:|:---:|:---:| |
| | | | Lokale Verwendung | 3D-Speaker | 3D-Speaker | |
| | | |
| | | --- |
| | | |
| | | ### Memory-Gedächtnisspeicher |
| | | |
| | | | Typ | Plattformname | Verwendungsmethode | Preismodell | Hinweise | |
| | | |:------:|:---------------:|:----:|:---------:|:--:| |
| | | | Memory | mem0ai | Schnittstellenaufrufe | 1000 Mal/Monat Kontingent | | |
| | | | Memory | [powermem](../powermem-integration.md) | Lokale Zusammenfassung | Abhängig von LLM und DB | OceanBase Open Source, unterstützt intelligente Abfrage | |
| | | | Memory | mem_local_short | Lokale Zusammenfassung | Kostenlos | | |
| | | | Memory | nomem | Kein Gedächtnismodus | Kostenlos | | |
| | | |
| | | --- |
| | | |
| | | ### Intent-Absichtserkennung |
| | | |
| | | | Typ | Plattformname | Verwendungsmethode | Preismodell | Hinweise | |
| | | |:------:|:-------------:|:----:|:-------:|:---------------------:| |
| | | | Intent | intent_llm | Schnittstellenaufrufe | Basierend auf LLM-Preisen | Erkennt Absicht durch groÃe Modelle, starke Allgemeingültigkeit | |
| | | | Intent | function_call | Schnittstellenaufrufe | Basierend auf LLM-Preisen | Vervollständigt Absicht durch Funktionsaufruf groÃer Modelle, schnelle Geschwindigkeit, guter Effekt | |
| | | | Intent | nointent | Kein Absichtsmodus | Kostenlos | Führt keine Absichtserkennung durch, gibt direkt Dialogergebnis zurück | |
| | | |
| | | --- |
| | | |
| | | ### Rag Retrieval Augmented Generation |
| | | |
| | | | Typ | Plattformname | Verwendungsmethode | Preismodell | Hinweise | |
| | | |:------:|:-------------:|:----:|:-------:|:---------------------:| |
| | | | Rag | ragflow | Schnittstellenaufrufe | Gebühren basierend auf Token-Verbrauch für Segmentierung und Tokenisierung | Nutzt RAGFlow's Retrieval-Augmented-Generation-Funktion für präzisere Dialogantworten | |
| | | |
| | | --- |
| | | |
| | | ## Danksagungen ð |
| | | |
| | | | Logo | Projekt/Unternehmen | Beschreibung | |
| | | |:---:|:---:|:---| |
| | | | <img src="../images/logo_bailing.png" width="160"> | [Bailing Voice Dialogue Robot](https://github.com/wwbin2017/bailing) | Dieses Projekt wurde von [Bailing Voice Dialogue Robot](https://github.com/wwbin2017/bailing) inspiriert und auf dessen Basis implementiert | |
| | | | <img src="../images/logo_tenclass.png" width="160"> | [Tenclass](https://www.tenclass.com/) | Dank an [Tenclass](https://www.tenclass.com/) für die Formulierung von Standardkommunikationsprotokollen, Multi-Geräte-Kompatibilitätslösungen und High-Concurrency-Szenario-Praxisdemonstrationen für das Xiaozhi-Ãkosystem; für die Bereitstellung vollständiger technischer Dokumentationsunterstützung für dieses Projekt | |
| | | | <img src="../images/logo_xuanfeng.png" width="160"> | [Xuanfeng Technology](https://github.com/Eric0308) | Dank an [Xuanfeng Technology](https://github.com/Eric0308) für den Beitrag des Funktionsaufruf-Frameworks, des MCP-Kommunikationsprotokolls und der plugin-basierten Aufrufmechanismus-Implementierungscode. Durch standardisiertes Befehlsplanungssystem und dynamische Erweiterungsfähigkeiten wird die Interaktionseffizienz und funktionale Erweiterbarkeit von Frontend-Geräten (IoT) erheblich verbessert | |
| | | | <img src="../images/logo_junsen.png" width="160"> | [huangjunsen](https://github.com/huangjunsen0406) | Dank an [huangjunsen](https://github.com/huangjunsen0406) für den Beitrag des `Smart Control Console Mobile`-Moduls, das eine effiziente Steuerung und Echtzeit-Interaktion über mobile Geräte ermöglicht und die Betriebsbequemlichkeit und Verwaltungseffizienz des Systems in mobilen Szenarien erheblich verbessert | |
| | | | <img src="../images/logo_huiyuan.png" width="160"> | [Huiyuan Design](http://ui.kwd988.net/) | Dank an [Huiyuan Design](http://ui.kwd988.net/) für die Bereitstellung professioneller visueller Lösungen für dieses Projekt, unter Verwendung ihrer Design-Praxiserfahrung im Dienst von über tausend Unternehmen, um die Produktbenutzererfahrung dieses Projekts zu stärken | |
| | | | <img src="../images/logo_qinren.png" width="160"> | [Xi'an Qinren Information Technology](https://www.029app.com/) | Dank an [Xi'an Qinren Information Technology](https://www.029app.com/) für die Vertiefung des visuellen Systems dieses Projekts und die Sicherstellung der Konsistenz und Erweiterbarkeit des Gesamtdesignstils in Multi-Szenario-Anwendungen | |
| | | | <img src="../images/logo_contributors.png" width="160"> | [Code-Mitwirkende](https://github.com/xinnan-tech/xiaozhi-esp32-server/graphs/contributors) | Dank an [alle Code-Mitwirkenden](https://github.com/xinnan-tech/xiaozhi-esp32-server/graphs/contributors), Ihre Bemühungen haben das Projekt robuster und leistungsfähiger gemacht. | |
| | | |
| | | |
| | | <a href="https://star-history.com/#xinnan-tech/xiaozhi-esp32-server&Date"> |
| | | |
| | | <picture> |
| | | <source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/svg?repos=xinnan-tech/xiaozhi-esp32-server&type=Date&theme=dark" /> |
| | | <source media="(prefers-color-scheme: light)" srcset="https://api.star-history.com/svg?repos=xinnan-tech/xiaozhi-esp32-server&type=Date" /> |
| | | <img alt="Star History Chart" src="https://api.star-history.com/svg?repos=xinnan-tech/xiaozhi-esp32-server&type=Date" /> |
| | | </picture> |
| | | </a> |
| New file |
| | |
| | | [](https://github.com/xinnan-tech/xiaozhi-esp32-server) |
| | | |
| | | <h1 align="center">Xiaozhi Backend Service xiaozhi-esp32-server</h1> |
| | | |
| | | <p align="center"> |
| | | This project is based on human-machine symbiotic intelligence theory and technology to develop intelligent terminal hardware and software systems<br/>providing backend services for the open-source intelligent hardware project |
| | | <a href="https://github.com/78/xiaozhi-esp32">xiaozhi-esp32</a><br/> |
| | | Implemented using Python, Java, and Vue according to the <a href="https://ccnphfhqs21z.feishu.cn/wiki/M0XiwldO9iJwHikpXD5cEx71nKh">Xiaozhi Communication Protocol</a><br/> |
| | | Support for MQTT+UDP protocol, Websocket protocol, MCP access point, voiceprint recognition, and knowledge base |
| | | </p> |
| | | |
| | | <p align="center"> |
| | | <a href="../FAQ.md">FAQ</a> |
| | | · <a href="https://github.com/xinnan-tech/xiaozhi-esp32-server/issues">Report Issues</a> |
| | | · <a href="../../README.md#%E9%83%A8%E7%BD%B2%E6%96%87%E6%A1%A3">Deployment Docs</a> |
| | | · <a href="https://github.com/xinnan-tech/xiaozhi-esp32-server/releases">Release Notes</a> |
| | | </p> |
| | | |
| | | <p align="center"> |
| | | <a href="../../README.md"><img alt="ç®ä½ä¸æçèªè¿°æä»¶" src="https://img.shields.io/badge/ç®ä½ä¸æ-DFE0E5"></a> |
| | | <a href="./README_en.md"><img alt="README in English" src="https://img.shields.io/badge/English-DBEDFA"></a> |
| | | <a href="./README_vi.md"><img alt="Tiếng Viá»t" src="https://img.shields.io/badge/Tiếng Viá»t-DFE0E5"></a> |
| | | <a href="./README_de.md"><img alt="Deutsch" src="https://img.shields.io/badge/Deutsch-DFE0E5"></a> |
| | | <a href="./README_pt_BR.md"><img alt="Português (Brasil)" src="https://img.shields.io/badge/Português (Brasil)-DFE0E5"></a> |
| | | <a href="https://github.com/xinnan-tech/xiaozhi-esp32-server/releases"> |
| | | <img alt="GitHub Contributors" src="https://img.shields.io/github/v/release/xinnan-tech/xiaozhi-esp32-server?logo=docker" /> |
| | | </a> |
| | | <a href="https://github.com/xinnan-tech/xiaozhi-esp32-server/blob/main/LICENSE"> |
| | | <img alt="GitHub pull requests" src="https://img.shields.io/badge/license-MIT-white?labelColor=black" /> |
| | | </a> |
| | | <a href="https://github.com/xinnan-tech/xiaozhi-esp32-server"> |
| | | <img alt="stars" src="https://img.shields.io/github/stars/xinnan-tech/xiaozhi-esp32-server?color=ffcb47&labelColor=black" /> |
| | | </a> |
| | | </p> |
| | | |
| | | <p align="center"> |
| | | Spearheaded by Professor Siyuan Liu's Team (South China University of Technology) |
| | | </br> |
| | | åææºææå¢é主导ç åï¼ååç工大å¦ï¼ |
| | | </br> |
| | | <img src="../images/hnlg.jpg" alt="South China University of Technology" width="50%"> |
| | | </p> |
| | | |
| | | --- |
| | | |
| | | ## Target Users ð¥ |
| | | |
| | | This project requires ESP32 hardware devices to work. If you have purchased ESP32-related hardware, successfully connected to Brother Xia's deployed backend service, and want to build your own `xiaozhi-esp32` backend service independently, then this project is perfect for you. |
| | | |
| | | Want to see the usage effects? Click the videos below ð¥ |
| | | |
| | | <table> |
| | | <tr> |
| | | <td> |
| | | <a href="https://www.bilibili.com/video/BV1FMFyejExX" target="_blank"> |
| | | <picture> |
| | | <img alt="ååºé度æå" src="docs/images/demo9.png" /></picture> |
| | | </a> |
| | | </td> |
| | | <td> |
| | | <a href="https://www.bilibili.com/video/BV1vchQzaEse" target="_blank"> |
| | | <picture> |
| | | <img alt="é度ä¼åç§è¯" src="docs/images/demo6.png" /></picture> |
| | | </a> |
| | | </td> |
| | | <td> |
| | | <a href="https://www.bilibili.com/video/BV1WEcxzFEAT" target="_blank"> |
| | | <picture> |
| | | <img alt="å°æºæ°å人 æ¯æè¯é³å¤é" src="docs/images/demo8.png" /></picture> |
| | | </a> |
| | | </td> |
| | | <td> |
| | | <a href="https://www.bilibili.com/video/BV1CKVz6UEuB" target="_blank"> |
| | | <picture> |
| | | <img alt="设å¤å¼å«è®¾å¤ï¼æçµè¯" src="docs/images/demo0.png" /></picture> |
| | | </a> |
| | | </td> |
| | | <td> |
| | | <a href="https://www.bilibili.com/video/BV1C1tCzUEZh" target="_blank"> |
| | | <picture> |
| | | <img alt="夿å»çåºæ¯" src="docs/images/demo1.png" /></picture> |
| | | </a> |
| | | </td> |
| | | </tr> |
| | | <tr> |
| | | <td> |
| | | <a href="https://www.bilibili.com/video/BV1VC96Y5EMH" target="_blank"> |
| | | <picture> |
| | | <img alt="ææ¾é³ä¹æ¥è¯¢å¤©æ°ææ¥æ°é»" src="docs/images/demo7.png" /></picture> |
| | | </a> |
| | | </td> |
| | | <td> |
| | | <a href="https://www.bilibili.com/video/BV12J7WzBEaH" target="_blank"> |
| | | <picture> |
| | | <img alt="宿¶ææ" src="docs/images/demo10.png" /></picture> |
| | | </a> |
| | | </td> |
| | | <td> |
| | | <a href="https://www.bilibili.com/video/BV1Co76z7EvK" target="_blank"> |
| | | <picture> |
| | | <img alt="æç
§è¯ç©å" src="docs/images/demo12.png" /></picture> |
| | | </a> |
| | | </td> |
| | | <td> |
| | | <a href="https://www.bilibili.com/video/BV1pNXWYGEx1" target="_blank"> |
| | | <picture> |
| | | <img alt="æ§å¶å®¶çµå¼å
³" src="docs/images/demo5.png" /></picture> |
| | | </a> |
| | | </td> |
| | | <td> |
| | | <a href="https://www.bilibili.com/video/BV1TJ7WzzEo6" target="_blank"> |
| | | <picture> |
| | | <img alt="夿令任å¡" src="docs/images/demo11.png" /></picture> |
| | | </a> |
| | | </td> |
| | | </tr> |
| | | <tr> |
| | | <td> |
| | | <a href="https://www.bilibili.com/video/BV1ZQKUzYExM" target="_blank"> |
| | | <picture> |
| | | <img alt="MCPæ¥å
¥ç¹" src="docs/images/demo13.png" /></picture> |
| | | </a> |
| | | </td> |
| | | <td> |
| | | <a href="https://www.bilibili.com/video/BV1zUW5zJEkq" target="_blank"> |
| | | <picture> |
| | | <img alt="MQTTæä»¤ä¸å" src="docs/images/demo4.png" /></picture> |
| | | </a> |
| | | </td> |
| | | <td> |
| | | <a href="https://www.bilibili.com/video/BV1Exu3zqEDe" target="_blank"> |
| | | <picture> |
| | | <img alt="声纹è¯å«" src="docs/images/demo14.png" /></picture> |
| | | </a> |
| | | </td> |
| | | <td> |
| | | <a href="https://www.bilibili.com/video/BV1CDKWemEU6" target="_blank"> |
| | | <picture> |
| | | <img alt="èªå®ä¹é³è²" src="docs/images/demo2.png" /></picture> |
| | | </a> |
| | | </td> |
| | | <td> |
| | | <a href="https://www.bilibili.com/video/BV12yA2egEaC" target="_blank"> |
| | | <picture> |
| | | <img alt="使ç¨ç²¤è¯äº¤æµ" src="docs/images/demo3.png" /></picture> |
| | | </a> |
| | | </td> |
| | | </tr> |
| | | </table> |
| | | |
| | | --- |
| | | |
| | | ## Warnings â ï¸ |
| | | |
| | | 1. This project is open-source software. This software has no commercial partnership with any third-party API service providers (including but not limited to speech recognition, large models, speech synthesis, and other platforms) that it interfaces with, and does not provide any form of guarantee for their service quality or financial security. It is recommended that users prioritize service providers with relevant business licenses and carefully read their service agreements and privacy policies. This software does not host any account keys, does not participate in fund flows, and does not bear the risk of recharge fund losses. |
| | | |
| | | 2. The functionality of this project is not complete and has not passed network security assessment. Please do not use it in production environments. If you deploy this project for learning purposes in a public network environment, please ensure necessary protection measures are in place. |
| | | |
| | | --- |
| | | |
| | | ## Deployment Documentation |
| | | |
| | |  |
| | | |
| | | This project provides two deployment methods. Please choose based on your specific needs: |
| | | |
| | | #### ð Deployment Method Selection |
| | | | Deployment Method | Features | Applicable Scenarios | Deployment Docs | Configuration Requirements | Video Tutorials | |
| | | |---------|------|---------|---------|---------|---------| |
| | | | **Simplified Installation** | Intelligent dialogue, single agent management | Low-configuration environments, data stored in config files, no database required | [â Docker Version](../Deployment.md#%E6%96%B9%E5%BC%8F%E4%B8%80docker%E5%8F%AA%E8%BF%90%E8%A1%8Cserver) / [â¡Source Code Deployment](../Deployment.md#%E6%96%B9%E5%BC%8F%E4%BA%8C%E6%9C%AC%E5%9C%B0%E6%BA%90%E7%A0%81%E5%8F%AA%E8%BF%90%E8%A1%8Cserver)| 2 cores 4GB if using `FunASR`, 2 cores 2GB if all APIs | - | |
| | | | **Full Module Installation** | Intelligent dialogue, multi-user management, multi-agent management, intelligent console interface operation | Complete functionality experience, data stored in database |[â Docker Version](../Deployment_all.md#%E6%96%B9%E5%BC%8F%E4%B8%80docker%E8%BF%90%E8%A1%8C%E5%85%A8%E6%A8%A1%E5%9D%97) / [â¡Source Code Deployment](../Deployment_all.md#%E6%96%B9%E5%BC%8F%E4%BA%8C%E6%9C%AC%E5%9C%B0%E6%BA%90%E7%A0%81%E8%BF%90%E8%A1%8C%E5%85%A8%E6%A8%A1%E5%9D%97) / [â¢Source Code Deployment Auto-Update Tutorial](../dev-ops-integration.md) | 4 cores 8GB if using `FunASR`, 2 cores 4GB if all APIs| [Local Source Code Startup Video Tutorial](https://www.bilibili.com/video/BV1wBJhz4Ewe) | |
| | | |
| | | For frequently asked questions and related tutorials, please refer to [this link](../FAQ.md) |
| | | |
| | | > ð¡ Note: Below is a test platform deployed with the latest code. You can burn and test if needed. Concurrent users: 6, data will be cleared daily. |
| | | |
| | | ``` |
| | | Intelligent Control Console Address: https://2662r3426b.vicp.fun |
| | | Intelligent Control Console Address (H5): https://2662r3426b.vicp.fun/h5/index.html |
| | | |
| | | Service Test Tool: https://2662r3426b.vicp.fun/test/ |
| | | OTA Interface Address: https://2662r3426b.vicp.fun/xiaozhi/ota/ |
| | | Websocket Interface Address: wss://2662r3426b.vicp.fun/xiaozhi/v1/ |
| | | ``` |
| | | |
| | | #### ð© Configuration Description and Recommendations |
| | | > [!Note] |
| | | > This project provides two configuration schemes: |
| | | > |
| | | > 1. `Entry Level Free Settings`: Suitable for personal and home use, all components use free solutions, no additional payment required. |
| | | > |
| | | > 2. `Streaming Configuration`: Suitable for demonstrations, training, scenarios with more than 2 concurrent users, etc. Uses streaming processing technology for faster response speed and better experience. |
| | | > |
| | | > Starting from version `0.5.2`, the project supports streaming configuration. Compared to earlier versions, response speed is improved by approximately `2.5 seconds`, significantly improving user experience. |
| | | |
| | | | Module Name | Entry Level Free Settings | Streaming Configuration | |
| | | |:---:|:---:|:---:| |
| | | | ASR(Speech Recognition) | FunASR(Local) | ðXunfeiStreamASR(Xunfei Streaming) | |
| | | | LLM(Large Model) | glm-4-flash(Zhipu) | ðqwen-flash(Alibaba Bailian) | |
| | | | VLLM(Vision Large Model) | glm-4v-flash(Zhipu) | ðqwen3.5-flash(Alibaba Bailian) | |
| | | | TTS(Speech Synthesis) | EdgeTTS(Microsoft) | ðHuoshanDoubleStreamTTS(Volcano Streaming) | |
| | | | Intent(Intent Recognition) | function_call(Function calling) | function_call(Function calling) | |
| | | | Memory(Memory function) | mem_local_short(Local short-term memory) | mem_local_short(Local short-term memory) | |
| | | |
| | | If you are concerned about the latency of each component, please refer to the [Xiaozhi Component Performance Test Report](https://github.com/xinnan-tech/xiaozhi-performance-research), and test in your own environment following the test methods in the report. |
| | | |
| | | #### ð§ Testing Tools |
| | | This project provides the following testing tools to help you verify the system and choose suitable models: |
| | | |
| | | | Tool Name | Location | Usage Method | Function Description | |
| | | |:---:|:---|:---:|:---:| |
| | | | Audio Interaction Test Tool | mainãdigital-humanãindex.html | Run `python start.py` in `main/digital-human`, then open `http://127.0.0.1:8006/index.html` | Tests audio playback and reception functions, verifies if Python-side audio processing is normal | |
| | | | Model Response Test Tool | mainãxiaozhi-serverãperformance_tester.py | Execute `python performance_tester.py` | Tests response speed of three core modules: ASR(speech recognition), LLM(large model), VLLM(vision model), TTS(speech synthesis) | |
| | | |
| | | > ð¡ Note: When testing model speed, only models with configured keys will be tested. |
| | | |
| | | --- |
| | | ## Feature List ⨠|
| | | ### Implemented â
|
| | |  |
| | | | Feature Module | Description | |
| | | |:---:|:---| |
| | | | Core Architecture | Based on [MQTT+UDP gateway](https://github.com/xinnan-tech/xiaozhi-esp32-server/blob/main/docs/mqtt-gateway-integration.md), WebSocket and HTTP servers, provides complete console management and authentication system | |
| | | | Voice Interaction | Supports streaming ASR(speech recognition), streaming TTS(speech synthesis), VAD(voice activity detection), supports multi-language recognition and voice processing | |
| | | | Voiceprint Recognition | Supports multi-user voiceprint registration, management, and recognition, processes in parallel with ASR, real-time speaker identity recognition and passes to LLM for personalized responses | |
| | | | Intelligent Dialogue | Supports multiple LLM(large language models), implements intelligent dialogue | |
| | | | Visual Perception | Supports multiple VLLM(vision large models), implements multimodal interaction | |
| | | | Intent Recognition | Supports LLM intent recognition, Function Call function calling, provides plugin-based intent processing mechanism | |
| | | | Memory System | Supports local short-term memory, mem0ai interface memory, PowerMem intelligent memory, with memory summarization functionality | |
| | | | Knowledge Base | Supports RAGFlow knowledge base, enabling LLM to judge whether to schedule the knowledge base after receiving the user's question, and then answer the question | |
| | | | Tool Calling | Supports client IOT protocol, client MCP protocol, server MCP protocol, MCP endpoint protocol, custom tool functions | |
| | | | Command Delivery | Supports MCP command delivery to ESP32 devices via MQTT protocol from Smart Console | |
| | | | Management Backend | Provides Web management interface, supports user management, system configuration and device management; Supports Simplified Chinese, Traditional Chinese and English display | |
| | | | Testing Tools | Provides performance testing tools, vision model testing tools, and audio interaction testing tools | |
| | | | Deployment Support | Supports Docker deployment and local deployment, provides complete configuration file management | |
| | | | Plugin System | Supports functional plugin extensions, custom plugin development, and plugin hot-loading | |
| | | |
| | | ### Under Development ð§ |
| | | |
| | | To learn about specific development plan progress, [click here](https://github.com/users/xinnan-tech/projects/3). For frequently asked questions and related tutorials, please refer to [this link](../FAQ.md) |
| | | |
| | | If you are a software developer, here is an [Open Letter to Developers](../contributor_open_letter.md). Welcome to join! |
| | | |
| | | --- |
| | | |
| | | ## Product Ecosystem ð¬ |
| | | Xiaozhi is an ecosystem. When using this product, you can also check out other [excellent projects](https://github.com/78/xiaozhi-esp32/blob/main/README_zh.md#%E7%9B%B8%E5%85%B3%E5%BC%80%E6%BA%90%E9%A1%B9%E7%9B%AE) in this ecosystem |
| | | |
| | | --- |
| | | |
| | | ## Supported Platforms/Components List ð |
| | | ### LLM Language Models |
| | | |
| | | | Usage Method | Supported Platforms | Free Platforms | |
| | | |:---:|:---:|:---:| |
| | | | OpenAI interface calls | Alibaba Bailian, Volcano Engine, DeepSeek, Zhipu, Gemini, iFLYTEK | Zhipu, Gemini | |
| | | | Ollama interface calls | Ollama | - | |
| | | | Dify interface calls | Dify | - | |
| | | | FastGPT interface calls | FastGPT | - | |
| | | | Coze interface calls | Coze | - | |
| | | | Xinference interface calls | Xinference | - | |
| | | | HomeAssistant interface calls | HomeAssistant | - | |
| | | |
| | | In fact, any LLM that supports OpenAI interface calls can be integrated and used. |
| | | |
| | | --- |
| | | |
| | | ### VLLM Vision Models |
| | | |
| | | | Usage Method | Supported Platforms | Free Platforms | |
| | | |:---:|:---:|:---:| |
| | | | OpenAI interface calls | Alibaba Bailian, Zhipu ChatGLMVLLM | Zhipu ChatGLMVLLM | |
| | | |
| | | In fact, any VLLM that supports OpenAI interface calls can be integrated and used. |
| | | |
| | | --- |
| | | |
| | | ### TTS Speech Synthesis |
| | | |
| | | | Usage Method | Supported Platforms | Free Platforms | |
| | | |:---:|:---:|:---:| |
| | | | Interface calls | EdgeTTS, iFLYTEK, Volcano Engine, Tencent Cloud, Alibaba Cloud and Bailian, CosyVoiceSiliconflow, TTS302AI, CozeCnTTS, GizwitsTTS, ACGNTTS, OpenAITTS, Lingxi Streaming TTS, MinimaxTTS | Lingxi Streaming TTS, EdgeTTS, CosyVoiceSiliconflow(partial) | |
| | | | Local services | FishSpeech, GPT_SOVITS_V2, GPT_SOVITS_V3, Index-TTS, PaddleSpeech | Index-TTS, PaddleSpeech, FishSpeech, GPT_SOVITS_V2, GPT_SOVITS_V3 | |
| | | |
| | | --- |
| | | |
| | | ### VAD Voice Activity Detection |
| | | |
| | | | Type | Platform Name | Usage Method | Pricing Model | Notes | |
| | | |:---:|:---------:|:----:|:----:|:--:| |
| | | | VAD | SileroVAD | Local use | Free | | |
| | | |
| | | --- |
| | | |
| | | ### ASR Speech Recognition |
| | | |
| | | | Usage Method | Supported Platforms | Free Platforms | |
| | | |:---:|:---:|:---:| |
| | | | Local use | FunASR, SherpaASR | FunASR, SherpaASR | |
| | | | Interface calls | FunASRServer, Volcano Engine, iFLYTEK, Tencent Cloud, Alibaba Cloud, Baidu Cloud, OpenAI ASR | FunASRServer | |
| | | |
| | | --- |
| | | |
| | | ### Voiceprint Recognition |
| | | |
| | | | Usage Method | Supported Platforms | Free Platforms | |
| | | |:---:|:---:|:---:| |
| | | | Local use | 3D-Speaker | 3D-Speaker | |
| | | |
| | | --- |
| | | |
| | | ### Memory Storage |
| | | |
| | | | Type | Platform Name | Usage Method | Pricing Model | Notes | |
| | | |:------:|:---------------:|:----:|:---------:|:--:| |
| | | | Memory | mem0ai | Interface calls | 1000 times/month quota | | |
| | | | Memory | [powermem](../powermem-integration.md) | Local summarization | Depends on LLM and DB | OceanBase open source, supports intelligent retrieval | |
| | | | Memory | mem_local_short | Local summarization | Free | | |
| | | | Memory | nomem | No memory mode | Free | | |
| | | |
| | | --- |
| | | |
| | | ### Intent Recognition |
| | | |
| | | | Type | Platform Name | Usage Method | Pricing Model | Notes | |
| | | |:------:|:-------------:|:----:|:-------:|:---------------------:| |
| | | | Intent | intent_llm | Interface calls | Based on LLM pricing | Recognizes intent through large models, strong generalization | |
| | | | Intent | function_call | Interface calls | Based on LLM pricing | Completes intent through large model function calling, fast speed, good effect | |
| | | | Intent | nointent | No intent mode | Free | Does not perform intent recognition, directly returns dialogue result | |
| | | |
| | | --- |
| | | |
| | | ### Rag Retrieval-Augmented Generation |
| | | |
| | | | Type | Platform Name | Usage Method | Pricing Model | Notes | |
| | | |:------:|:-------------:|:----:|:-------:|:---------------------:| |
| | | | Rag | ragflow | Interface calls | Charged based on tokens consumed for slicing and word segmentation | Utilizes RagFlow's retrieval-augmented generation feature to provide more accurate dialog responses | |
| | | |
| | | --- |
| | | |
| | | ## Acknowledgments ð |
| | | |
| | | | Logo | Project/Company | Description | |
| | | |:---:|:---:|:---| |
| | | | <img src="../images/logo_bailing.png" width="160"> | [Bailing Voice Dialogue Robot](https://github.com/wwbin2017/bailing) | This project is inspired by [Bailing Voice Dialogue Robot](https://github.com/wwbin2017/bailing) and implemented on its basis | |
| | | | <img src="../images/logo_tenclass.png" width="160"> | [Tenclass](https://www.tenclass.com/) | Thanks to [Tenclass](https://www.tenclass.com/) for formulating standard communication protocols, multi-device compatibility solutions, and high-concurrency scenario practice demonstrations for the Xiaozhi ecosystem; providing full-link technical documentation support for this project | |
| | | | <img src="../images/logo_xuanfeng.png" width="160"> | [Xuanfeng Technology](https://github.com/Eric0308) | Thanks to [Xuanfeng Technology](https://github.com/Eric0308) for contributing function calling framework, MCP communication protocol, and plugin-based calling mechanism implementation code. Through standardized instruction scheduling system and dynamic expansion capabilities, it significantly improves the interaction efficiency and functional extensibility of frontend devices (IoT) | |
| | | | <img src="../images/logo_junsen.png" width="160"> | [huangjunsen](https://github.com/huangjunsen0406) | Thanks to [huangjunsen](https://github.com/huangjunsen0406) for contributing the `Smart Control Console Mobile` module, which enables efficient control and real-time interaction across mobile devices, significantly enhancing the system's operational convenience and management efficiency in mobile scenarios. | |
| | | | <img src="../images/logo_huiyuan.png" width="160"> | [Huiyuan Design](http://ui.kwd988.net/) | Thanks to [Huiyuan Design](http://ui.kwd988.net/) for providing professional visual solutions for this project, using their design practical experience serving over a thousand enterprises to empower this project's product user experience | |
| | | | <img src="../images/logo_qinren.png" width="160"> | [Xi'an Qinren Information Technology](https://www.029app.com/) | Thanks to [Xi'an Qinren Information Technology](https://www.029app.com/) for deepening this project's visual system, ensuring consistency and extensibility of overall design style in multi-scenario applications | |
| | | | <img src="../images/logo_contributors.png" width="160"> | [Code Contributors](https://github.com/xinnan-tech/xiaozhi-esp32-server/graphs/contributors) | Thanks to [all code contributors](https://github.com/xinnan-tech/xiaozhi-esp32-server/graphs/contributors), your efforts have made the project more robust and powerful. | |
| | | |
| | | |
| | | <a href="https://star-history.com/#xinnan-tech/xiaozhi-esp32-server&Date"> |
| | | |
| | | <picture> |
| | | <source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/svg?repos=xinnan-tech/xiaozhi-esp32-server&type=Date&theme=dark" /> |
| | | <source media="(prefers-color-scheme: light)" srcset="https://api.star-history.com/svg?repos=xinnan-tech/xiaozhi-esp32-server&type=Date" /> |
| | | <img alt="Star History Chart" src="https://api.star-history.com/svg?repos=xinnan-tech/xiaozhi-esp32-server&type=Date" /> |
| | | </picture> |
| | | </a> |
| New file |
| | |
| | | [](https://github.com/xinnan-tech/xiaozhi-esp32-server) |
| | | |
| | | <h1 align="center">Serviço Backend Xiaozhi xiaozhi-esp32-server</h1> |
| | | |
| | | <p align="center"> |
| | | Este projeto é baseado na teoria e tecnologia de inteligência simbiótica humano-máquina para desenvolver sistemas inteligentes de hardware e software para terminais<br/>fornecendo serviços de backend para o projeto de hardware inteligente de código aberto |
| | | <a href="https://github.com/78/xiaozhi-esp32">xiaozhi-esp32</a><br/> |
| | | Implementado usando Python, Java e Vue de acordo com o <a href="https://ccnphfhqs21z.feishu.cn/wiki/M0XiwldO9iJwHikpXD5cEx71nKh">Protocolo de Comunicação Xiaozhi</a><br/> |
| | | Suporte ao protocolo MQTT+UDP, protocolo WebSocket, ponto de acesso MCP, reconhecimento de impressão vocal e base de conhecimento |
| | | </p> |
| | | |
| | | <p align="center"> |
| | | <a href="../FAQ.md">Perguntas Frequentes</a> |
| | | · <a href="https://github.com/xinnan-tech/xiaozhi-esp32-server/issues">Reportar Problemas</a> |
| | | · <a href="../../README.md#%E9%83%A8%E7%BD%B2%E6%96%87%E6%A1%A3">Documentação de Implantação</a> |
| | | · <a href="https://github.com/xinnan-tech/xiaozhi-esp32-server/releases">Notas de Lançamento</a> |
| | | </p> |
| | | |
| | | <p align="center"> |
| | | <a href="../../README.md"><img alt="ç®ä½ä¸æçèªè¿°æä»¶" src="https://img.shields.io/badge/ç®ä½ä¸æ-DFE0E5"></a> |
| | | <a href="./README_en.md"><img alt="README in English" src="https://img.shields.io/badge/English-DFE0E5"></a> |
| | | <a href="./README_vi.md"><img alt="Tiếng Viá»t" src="https://img.shields.io/badge/Tiếng Viá»t-DFE0E5"></a> |
| | | <a href="./README_de.md"><img alt="Deutsch" src="https://img.shields.io/badge/Deutsch-DFE0E5"></a> |
| | | <a href="./README_pt_BR.md"><img alt="Português (Brasil)" src="https://img.shields.io/badge/Português (Brasil)-DBEDFA"></a> |
| | | <a href="https://github.com/xinnan-tech/xiaozhi-esp32-server/releases"> |
| | | <img alt="GitHub Contributors" src="https://img.shields.io/github/v/release/xinnan-tech/xiaozhi-esp32-server?logo=docker" /> |
| | | </a> |
| | | <a href="https://github.com/xinnan-tech/xiaozhi-esp32-server/blob/main/LICENSE"> |
| | | <img alt="GitHub pull requests" src="https://img.shields.io/badge/license-MIT-white?labelColor=black" /> |
| | | </a> |
| | | <a href="https://github.com/xinnan-tech/xiaozhi-esp32-server"> |
| | | <img alt="stars" src="https://img.shields.io/github/stars/xinnan-tech/xiaozhi-esp32-server?color=ffcb47&labelColor=black" /> |
| | | </a> |
| | | </p> |
| | | |
| | | <p align="center"> |
| | | Liderado pela Equipe do Professor Siyuan Liu (Universidade de Tecnologia do Sul da China) |
| | | </br> |
| | | åææºææå¢é主导ç åï¼ååç工大å¦ï¼ |
| | | </br> |
| | | <img src="../images/hnlg.jpg" alt="Universidade de Tecnologia do Sul da China (ååç工大å¦)" width="50%"> |
| | | </p> |
| | | |
| | | --- |
| | | |
| | | ## Público-Alvo ð¥ |
| | | |
| | | Este projeto requer dispositivos de hardware ESP32 para funcionar. Se você adquiriu hardware relacionado ao ESP32, conectou-se com sucesso ao serviço backend implantado pelo Brother Xia e deseja construir seu próprio serviço backend `xiaozhi-esp32` de forma independente, então este projeto é perfeito para você. |
| | | |
| | | Quer ver os efeitos de uso? Clique nos vÃdeos abaixo ð¥ |
| | | |
| | | <table> |
| | | <tr> |
| | | <td> |
| | | <a href="https://www.bilibili.com/video/BV1FMFyejExX" target="_blank"> |
| | | <picture> |
| | | <img alt="ååºé度æå" src="docs/images/demo9.png" /></picture> |
| | | </a> |
| | | </td> |
| | | <td> |
| | | <a href="https://www.bilibili.com/video/BV1vchQzaEse" target="_blank"> |
| | | <picture> |
| | | <img alt="é度ä¼åç§è¯" src="docs/images/demo6.png" /></picture> |
| | | </a> |
| | | </td> |
| | | <td> |
| | | <a href="https://www.bilibili.com/video/BV1WEcxzFEAT" target="_blank"> |
| | | <picture> |
| | | <img alt="å°æºæ°å人 æ¯æè¯é³å¤é" src="docs/images/demo8.png" /></picture> |
| | | </a> |
| | | </td> |
| | | <td> |
| | | <a href="https://www.bilibili.com/video/BV1CKVz6UEuB" target="_blank"> |
| | | <picture> |
| | | <img alt="设å¤å¼å«è®¾å¤ï¼æçµè¯" src="docs/images/demo0.png" /></picture> |
| | | </a> |
| | | </td> |
| | | <td> |
| | | <a href="https://www.bilibili.com/video/BV1C1tCzUEZh" target="_blank"> |
| | | <picture> |
| | | <img alt="夿å»çåºæ¯" src="docs/images/demo1.png" /></picture> |
| | | </a> |
| | | </td> |
| | | </tr> |
| | | <tr> |
| | | <td> |
| | | <a href="https://www.bilibili.com/video/BV1VC96Y5EMH" target="_blank"> |
| | | <picture> |
| | | <img alt="ææ¾é³ä¹æ¥è¯¢å¤©æ°ææ¥æ°é»" src="docs/images/demo7.png" /></picture> |
| | | </a> |
| | | </td> |
| | | <td> |
| | | <a href="https://www.bilibili.com/video/BV12J7WzBEaH" target="_blank"> |
| | | <picture> |
| | | <img alt="宿¶ææ" src="docs/images/demo10.png" /></picture> |
| | | </a> |
| | | </td> |
| | | <td> |
| | | <a href="https://www.bilibili.com/video/BV1Co76z7EvK" target="_blank"> |
| | | <picture> |
| | | <img alt="æç
§è¯ç©å" src="docs/images/demo12.png" /></picture> |
| | | </a> |
| | | </td> |
| | | <td> |
| | | <a href="https://www.bilibili.com/video/BV1pNXWYGEx1" target="_blank"> |
| | | <picture> |
| | | <img alt="æ§å¶å®¶çµå¼å
³" src="docs/images/demo5.png" /></picture> |
| | | </a> |
| | | </td> |
| | | <td> |
| | | <a href="https://www.bilibili.com/video/BV1TJ7WzzEo6" target="_blank"> |
| | | <picture> |
| | | <img alt="夿令任å¡" src="docs/images/demo11.png" /></picture> |
| | | </a> |
| | | </td> |
| | | </tr> |
| | | <tr> |
| | | <td> |
| | | <a href="https://www.bilibili.com/video/BV1ZQKUzYExM" target="_blank"> |
| | | <picture> |
| | | <img alt="MCPæ¥å
¥ç¹" src="docs/images/demo13.png" /></picture> |
| | | </a> |
| | | </td> |
| | | <td> |
| | | <a href="https://www.bilibili.com/video/BV1zUW5zJEkq" target="_blank"> |
| | | <picture> |
| | | <img alt="MQTTæä»¤ä¸å" src="docs/images/demo4.png" /></picture> |
| | | </a> |
| | | </td> |
| | | <td> |
| | | <a href="https://www.bilibili.com/video/BV1Exu3zqEDe" target="_blank"> |
| | | <picture> |
| | | <img alt="声纹è¯å«" src="docs/images/demo14.png" /></picture> |
| | | </a> |
| | | </td> |
| | | <td> |
| | | <a href="https://www.bilibili.com/video/BV1CDKWemEU6" target="_blank"> |
| | | <picture> |
| | | <img alt="èªå®ä¹é³è²" src="docs/images/demo2.png" /></picture> |
| | | </a> |
| | | </td> |
| | | <td> |
| | | <a href="https://www.bilibili.com/video/BV12yA2egEaC" target="_blank"> |
| | | <picture> |
| | | <img alt="使ç¨ç²¤è¯äº¤æµ" src="docs/images/demo3.png" /></picture> |
| | | </a> |
| | | </td> |
| | | </tr> |
| | | </table> |
| | | |
| | | --- |
| | | |
| | | ## Avisos â ï¸ |
| | | |
| | | 1. Este projeto é um software de código aberto. Este software não possui parceria comercial com nenhum provedor de serviços de API de terceiros (incluindo, mas não se limitando a reconhecimento de fala, modelos de linguagem, sÃntese de voz e outras plataformas) com os quais se conecta, e não fornece nenhuma forma de garantia quanto à qualidade de serviço ou segurança financeira desses provedores. Recomenda-se que os usuários priorizem provedores de serviço com licenças comerciais relevantes e leiam cuidadosamente seus termos de serviço e polÃticas de privacidade. Este software não armazena nenhuma chave de conta, não participa de fluxos de fundos e não assume o risco de perda de fundos recarregados. |
| | | |
| | | 2. A funcionalidade deste projeto não está completa e não passou por avaliação de segurança de rede. Por favor, não o utilize em ambientes de produção. Se você implantar este projeto para fins de aprendizado em um ambiente de rede pública, certifique-se de que as medidas de proteção necessárias estejam em vigor. |
| | | |
| | | --- |
| | | |
| | | ## Documentação de Implantação |
| | | |
| | |  |
| | | |
| | | Este projeto oferece dois métodos de implantação. Por favor, escolha de acordo com suas necessidades especÃficas: |
| | | |
| | | #### ð Seleção do Método de Implantação |
| | | | Método de Implantação | Funcionalidades | Cenários Aplicáveis | Documentação de Implantação | Requisitos de Configuração | Tutoriais em VÃdeo | |
| | | |---------|------|---------|---------|---------|---------| |
| | | | **Instalação Simplificada** | Diálogo inteligente, gerenciamento de agente único | Ambientes de baixa configuração, dados armazenados em arquivos de configuração, sem necessidade de banco de dados | [â Versão Docker](../Deployment.md#%E6%96%B9%E5%BC%8F%E4%B8%80docker%E5%8F%AA%E8%BF%90%E8%A1%8Cserver) / [â¡Implantação via Código-Fonte](../Deployment.md#%E6%96%B9%E5%BC%8F%E4%BA%8C%E6%9C%AC%E5%9C%B0%E6%BA%90%E7%A0%81%E5%8F%AA%E8%BF%90%E8%A1%8Cserver)| 2 núcleos 4GB se usar `FunASR`, 2 núcleos 2GB se todas APIs | - | |
| | | | **Instalação de Módulo Completo** | Diálogo inteligente, gerenciamento multiusuário, gerenciamento de múltiplos agentes, operação de interface do console inteligente | Experiência com funcionalidade completa, dados armazenados em banco de dados |[â Versão Docker](../Deployment_all.md#%E6%96%B9%E5%BC%8F%E4%B8%80docker%E8%BF%90%E8%A1%8C%E5%85%A8%E6%A8%A1%E5%9D%97) / [â¡Implantação via Código-Fonte](../Deployment_all.md#%E6%96%B9%E5%BC%8F%E4%BA%8C%E6%9C%AC%E5%9C%B0%E6%BA%90%E7%A0%81%E8%BF%90%E8%A1%8C%E5%85%A8%E6%A8%A1%E5%9D%97) / [â¢Tutorial de Atualização Automática via Código-Fonte](../dev-ops-integration.md) | 4 núcleos 8GB se usar `FunASR`, 2 núcleos 4GB se todas APIs| [Tutorial em VÃdeo de Inicialização via Código-Fonte Local](https://www.bilibili.com/video/BV1wBJhz4Ewe) | |
| | | |
| | | Perguntas frequentes e tutoriais relacionados podem ser consultados [neste link](../FAQ.md) |
| | | |
| | | > ð¡ Nota: Abaixo está uma plataforma de teste implantada com o código mais recente. Você pode gravar e testar se necessário. Usuários simultâneos: 6, os dados serão limpos diariamente. |
| | | |
| | | ``` |
| | | Endereço do Console de Controle Inteligente: https://2662r3426b.vicp.fun |
| | | Endereço do Console de Controle Inteligente (H5): https://2662r3426b.vicp.fun/h5/index.html |
| | | |
| | | Ferramenta de Teste de Serviço: https://2662r3426b.vicp.fun/test/ |
| | | Endereço da Interface OTA: https://2662r3426b.vicp.fun/xiaozhi/ota/ |
| | | Endereço da Interface WebSocket: wss://2662r3426b.vicp.fun/xiaozhi/v1/ |
| | | ``` |
| | | |
| | | #### ð© Descrição e Recomendações de Configuração |
| | | > [!Note] |
| | | > Este projeto oferece dois esquemas de configuração: |
| | | > |
| | | > 1. `Configurações Gratuitas NÃvel Básico`: Adequado para uso pessoal e doméstico, todos os componentes utilizam soluções gratuitas, sem necessidade de pagamento adicional. |
| | | > |
| | | > 2. `Configuração de Streaming`: Adequado para demonstrações, treinamentos, cenários com mais de 2 usuários simultâneos, etc. Utiliza tecnologia de processamento em streaming para velocidade de resposta mais rápida e melhor experiência. |
| | | > |
| | | > A partir da versão `0.5.2`, o projeto suporta configuração de streaming. Em comparação com versões anteriores, a velocidade de resposta é melhorada em aproximadamente `2,5 segundos`, melhorando significativamente a experiência do usuário. |
| | | |
| | | | Nome do Módulo | Configurações Gratuitas NÃvel Básico | Configuração de Streaming | |
| | | |:---:|:---:|:---:| |
| | | | ASR(Reconhecimento de Fala) | FunASR(Local) | ðXunfeiStreamASR(Xunfei Streaming) | |
| | | | LLM(Modelo de Linguagem) | glm-4-flash(Zhipu) | ðqwen-flash(Alibaba Bailian) | |
| | | | VLLM(Modelo de Visão) | glm-4v-flash(Zhipu) | ðqwen3.5-flash(Alibaba Bailian) | |
| | | | TTS(SÃntese de Voz) | EdgeTTS(Microsoft) | ðHuoshanDoubleStreamTTS(Volcano Streaming) | |
| | | | Intent(Reconhecimento de Intenção) | function_call(Chamada de função) | function_call(Chamada de função) | |
| | | | Memory(Função de Memória) | mem_local_short(Memória local de curto prazo) | mem_local_short(Memória local de curto prazo) | |
| | | |
| | | Se você está preocupado com o tempo de resposta de cada componente, consulte o [Relatório de Teste de Desempenho dos Componentes Xiaozhi](https://github.com/xinnan-tech/xiaozhi-performance-research), e teste em seu próprio ambiente seguindo os métodos de teste do relatório. |
| | | |
| | | #### ð§ Ferramentas de Teste |
| | | Este projeto fornece as seguintes ferramentas de teste para ajudá-lo a verificar o sistema e escolher modelos adequados: |
| | | |
| | | | Nome da Ferramenta | Localização | Método de Uso | Descrição da Função | |
| | | |:---:|:---|:---:|:---:| |
| | | | Ferramenta de Teste de Interação por Ãudio | mainãdigital-humanãindex.html | Execute `python start.py` em `main/digital-human` e depois abra `http://127.0.0.1:8006/index.html` | Testa as funções de reprodução e recepção de áudio, verifica se o processamento de áudio no lado Python está normal | |
| | | | Ferramenta de Teste de Resposta de Modelo | mainãxiaozhi-serverãperformance_tester.py | Execute `python performance_tester.py` | Testa a velocidade de resposta dos três módulos principais: ASR(reconhecimento de fala), LLM(modelo de linguagem), VLLM(modelo de visão), TTS(sÃntese de voz) | |
| | | |
| | | > ð¡ Nota: Ao testar a velocidade dos modelos, apenas os modelos com chaves configuradas serão testados. |
| | | |
| | | --- |
| | | ## Lista de Funcionalidades ⨠|
| | | ### Implementado â
|
| | |  |
| | | | Módulo de Funcionalidade | Descrição | |
| | | |:---:|:---| |
| | | | Arquitetura Principal | Baseado em [gateway MQTT+UDP](https://github.com/xinnan-tech/xiaozhi-esp32-server/blob/main/docs/mqtt-gateway-integration.md), servidores WebSocket e HTTP, fornece sistema completo de gerenciamento de console e autenticação | |
| | | | Interação por Voz | Suporta ASR em streaming (reconhecimento de fala), TTS em streaming (sÃntese de voz), VAD (detecção de atividade vocal), suporta reconhecimento multilÃngue e processamento de voz | |
| | | | Reconhecimento de Impressão Vocal | Suporta registro, gerenciamento e reconhecimento de impressão vocal de múltiplos usuários, processa em paralelo com o ASR, reconhecimento de identidade do falante em tempo real e repassa ao LLM para respostas personalizadas | |
| | | | Diálogo Inteligente | Suporta múltiplos LLM (modelos de linguagem de grande porte), implementa diálogo inteligente | |
| | | | Percepção Visual | Suporta múltiplos VLLM (modelos de visão de grande porte), implementa interação multimodal | |
| | | | Reconhecimento de Intenção | Suporta reconhecimento de intenção por LLM, Function Call (chamada de função), fornece mecanismo de processamento de intenção baseado em plugins | |
| | | | Sistema de Memória | Suporta memória local de curto prazo, memória via interface mem0ai, memória inteligente PowerMem, com funcionalidade de resumo de memória | |
| | | | Base de Conhecimento | Suporta base de conhecimento RAGFlow, permitindo que o LLM julgue se deve acionar a base de conhecimento após receber a pergunta do usuário, e então responda à pergunta | |
| | | | Chamada de Ferramentas | Suporta protocolo IOT do cliente, protocolo MCP do cliente, protocolo MCP do servidor, protocolo de endpoint MCP, funções de ferramentas personalizadas | |
| | | | Envio de Comandos | Suporta envio de comandos MCP para dispositivos ESP32 via protocolo MQTT a partir do Console Inteligente | |
| | | | Backend de Gerenciamento | Fornece interface de gerenciamento Web, suporta gerenciamento de usuários, configuração do sistema e gerenciamento de dispositivos; Suporta exibição em Chinês Simplificado, Chinês Tradicional e Inglês | |
| | | | Ferramentas de Teste | Fornece ferramentas de teste de desempenho, ferramentas de teste de modelo de visão e ferramentas de teste de interação por áudio | |
| | | | Suporte à Implantação | Suporta implantação via Docker e implantação local, fornece gerenciamento completo de arquivos de configuração | |
| | | | Sistema de Plugins | Suporta extensões de plugins funcionais, desenvolvimento de plugins personalizados e carregamento dinâmico de plugins | |
| | | |
| | | ### Em Desenvolvimento ð§ |
| | | |
| | | Para conhecer o progresso especÃfico do plano de desenvolvimento, [clique aqui](https://github.com/users/xinnan-tech/projects/3). Perguntas frequentes e tutoriais relacionados podem ser consultados [neste link](../FAQ.md) |
| | | |
| | | Se você é um desenvolvedor de software, aqui está uma [Carta Aberta aos Desenvolvedores](../contributor_open_letter.md). Seja bem-vindo a participar! |
| | | |
| | | --- |
| | | |
| | | ## Ecossistema do Produto ð¬ |
| | | Xiaozhi é um ecossistema. Ao utilizar este produto, você também pode conferir outros [projetos excelentes](https://github.com/78/xiaozhi-esp32/blob/main/README_zh.md#%E7%9B%B8%E5%85%B3%E5%BC%80%E6%BA%90%E9%A1%B9%E7%9B%AE) neste ecossistema |
| | | |
| | | --- |
| | | |
| | | ## Lista de Plataformas/Componentes Suportados ð |
| | | ### LLM Modelos de Linguagem |
| | | |
| | | | Método de Uso | Plataformas Suportadas | Plataformas Gratuitas | |
| | | |:---:|:---:|:---:| |
| | | | Chamadas via interface OpenAI | Alibaba Bailian, Volcano Engine, DeepSeek, Zhipu, Gemini, iFLYTEK | Zhipu, Gemini | |
| | | | Chamadas via interface Ollama | Ollama | - | |
| | | | Chamadas via interface Dify | Dify | - | |
| | | | Chamadas via interface FastGPT | FastGPT | - | |
| | | | Chamadas via interface Coze | Coze | - | |
| | | | Chamadas via interface Xinference | Xinference | - | |
| | | | Chamadas via interface HomeAssistant | HomeAssistant | - | |
| | | |
| | | Na verdade, qualquer LLM que suporte chamadas via interface openai pode ser integrado e utilizado. |
| | | |
| | | --- |
| | | |
| | | ### VLLM Modelos de Visão |
| | | |
| | | | Método de Uso | Plataformas Suportadas | Plataformas Gratuitas | |
| | | |:---:|:---:|:---:| |
| | | | Chamadas via interface OpenAI | Alibaba Bailian, Zhipu ChatGLMVLLM | Zhipu ChatGLMVLLM | |
| | | |
| | | Na verdade, qualquer VLLM que suporte chamadas via interface OpenAI pode ser integrado e utilizado. |
| | | |
| | | --- |
| | | |
| | | ### TTS SÃntese de Voz |
| | | |
| | | | Método de Uso | Plataformas Suportadas | Plataformas Gratuitas | |
| | | |:---:|:---:|:---:| |
| | | | Chamadas via interface | EdgeTTS, iFLYTEK, Volcano Engine, Tencent Cloud, Alibaba Cloud e Bailian, CosyVoiceSiliconflow, TTS302AI, CozeCnTTS, GizwitsTTS, ACGNTTS, OpenAITTS, Lingxi Streaming TTS, MinimaxTTS | Lingxi Streaming TTS, EdgeTTS, CosyVoiceSiliconflow(parcial) | |
| | | | Serviços locais | FishSpeech, GPT_SOVITS_V2, GPT_SOVITS_V3, Index-TTS, PaddleSpeech | Index-TTS, PaddleSpeech, FishSpeech, GPT_SOVITS_V2, GPT_SOVITS_V3 | |
| | | |
| | | --- |
| | | |
| | | ### VAD Detecção de Atividade Vocal |
| | | |
| | | | Tipo | Nome da Plataforma | Método de Uso | Modelo de Preço | Observações | |
| | | |:---:|:---------:|:----:|:----:|:--:| |
| | | | VAD | SileroVAD | Uso local | Gratuito | | |
| | | |
| | | --- |
| | | |
| | | ### ASR Reconhecimento de Fala |
| | | |
| | | | Método de Uso | Plataformas Suportadas | Plataformas Gratuitas | |
| | | |:---:|:---:|:---:| |
| | | | Uso local | FunASR, SherpaASR | FunASR, SherpaASR | |
| | | | Chamadas via interface | FunASRServer, Volcano Engine, iFLYTEK, Tencent Cloud, Alibaba Cloud, Baidu Cloud, OpenAI ASR | FunASRServer | |
| | | |
| | | --- |
| | | |
| | | ### Reconhecimento de Impressão Vocal |
| | | |
| | | | Método de Uso | Plataformas Suportadas | Plataformas Gratuitas | |
| | | |:---:|:---:|:---:| |
| | | | Uso local | 3D-Speaker | 3D-Speaker | |
| | | |
| | | --- |
| | | |
| | | ### Armazenamento de Memória |
| | | |
| | | | Tipo | Nome da Plataforma | Método de Uso | Modelo de Preço | Observações | |
| | | |:------:|:---------------:|:----:|:---------:|:--:| |
| | | | Memória | mem0ai | Chamadas via interface | Cota de 1000 vezes/mês | | |
| | | | Memória | [powermem](../powermem-integration.md) | Resumo local | Depende do LLM e BD | OceanBase de código aberto, suporta busca inteligente | |
| | | | Memória | mem_local_short | Resumo local | Gratuito | | |
| | | | Memória | nomem | Modo sem memória | Gratuito | | |
| | | |
| | | --- |
| | | |
| | | ### Reconhecimento de Intenção |
| | | |
| | | | Tipo | Nome da Plataforma | Método de Uso | Modelo de Preço | Observações | |
| | | |:------:|:-------------:|:----:|:-------:|:---------------------:| |
| | | | Intenção | intent_llm | Chamadas via interface | Baseado no preço do LLM | Reconhece intenção através de modelos de linguagem, forte generalização | |
| | | | Intenção | function_call | Chamadas via interface | Baseado no preço do LLM | Completa a intenção através de chamada de função do modelo de linguagem, velocidade rápida, bom resultado | |
| | | | Intenção | nointent | Modo sem intenção | Gratuito | Não realiza reconhecimento de intenção, retorna diretamente o resultado do diálogo | |
| | | |
| | | --- |
| | | |
| | | ### RAG Geração Aumentada por Recuperação |
| | | |
| | | | Tipo | Nome da Plataforma | Método de Uso | Modelo de Preço | Observações | |
| | | |:------:|:-------------:|:----:|:-------:|:---------------------:| |
| | | | RAG | ragflow | Chamadas via interface | Cobrado com base nos tokens consumidos para fatiamento e segmentação de palavras | Utiliza o recurso de geração aumentada por recuperação do RagFlow para fornecer respostas de diálogo mais precisas | |
| | | |
| | | --- |
| | | |
| | | ## Agradecimentos ð |
| | | |
| | | | Logo | Projeto/Empresa | Descrição | |
| | | |:---:|:---:|:---| |
| | | | <img src="../images/logo_bailing.png" width="160"> | [Robô de Diálogo por Voz Bailing](https://github.com/wwbin2017/bailing) | Este projeto foi inspirado pelo [Robô de Diálogo por Voz Bailing](https://github.com/wwbin2017/bailing) e implementado com base nele | |
| | | | <img src="../images/logo_tenclass.png" width="160"> | [Tenclass](https://www.tenclass.com/) | Agradecimentos à [Tenclass](https://www.tenclass.com/) por formular protocolos de comunicação padrão, soluções de compatibilidade multidispositivo e demonstrações práticas de cenários de alta concorrência para o ecossistema Xiaozhi; fornecendo suporte completo de documentação técnica para este projeto | |
| | | | <img src="../images/logo_xuanfeng.png" width="160"> | [Xuanfeng Technology (çå¤ç§æ)](https://github.com/Eric0308) | Agradecimentos à [Xuanfeng Technology](https://github.com/Eric0308) por contribuir com o framework de chamada de função, protocolo de comunicação MCP e implementação do mecanismo de chamada baseado em plugins. Através de um sistema padronizado de agendamento de instruções e capacidades de expansão dinâmica, melhora significativamente a eficiência de interação e extensibilidade funcional dos dispositivos de frontend (IoT) | |
| | | | <img src="../images/logo_junsen.png" width="160"> | [huangjunsen](https://github.com/huangjunsen0406) | Agradecimentos a [huangjunsen](https://github.com/huangjunsen0406) por contribuir com o módulo `Console de Controle Inteligente Mobile`, que permite controle eficiente e interação em tempo real em dispositivos móveis, melhorando significativamente a conveniência operacional e a eficiência de gerenciamento do sistema em cenários móveis. | |
| | | | <img src="../images/logo_huiyuan.png" width="160"> | [Huiyuan Design (æ±è¿è®¾è®¡)](http://ui.kwd988.net/) | Agradecimentos à [Huiyuan Design](http://ui.kwd988.net/) por fornecer soluções visuais profissionais para este projeto, utilizando sua experiência prática de design atendendo mais de mil empresas para potencializar a experiência do usuário deste produto | |
| | | | <img src="../images/logo_qinren.png" width="160"> | [Xi'an Qinren Information Technology (西å®å¤äººä¿¡æ¯ç§æ)](https://www.029app.com/) | Agradecimentos à [Xi'an Qinren Information Technology](https://www.029app.com/) por aprofundar o sistema visual deste projeto, garantindo consistência e extensibilidade do estilo de design geral em aplicações de múltiplos cenários | |
| | | | <img src="../images/logo_contributors.png" width="160"> | [Contribuidores de Código](https://github.com/xinnan-tech/xiaozhi-esp32-server/graphs/contributors) | Agradecimentos a [todos os contribuidores de código](https://github.com/xinnan-tech/xiaozhi-esp32-server/graphs/contributors), seus esforços tornaram o projeto mais robusto e poderoso. | |
| | | |
| | | |
| | | <a href="https://star-history.com/#xinnan-tech/xiaozhi-esp32-server&Date"> |
| | | |
| | | <picture> |
| | | <source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/svg?repos=xinnan-tech/xiaozhi-esp32-server&type=Date&theme=dark" /> |
| | | <source media="(prefers-color-scheme: light)" srcset="https://api.star-history.com/svg?repos=xinnan-tech/xiaozhi-esp32-server&type=Date" /> |
| | | <img alt="Star History Chart" src="https://api.star-history.com/svg?repos=xinnan-tech/xiaozhi-esp32-server&type=Date" /> |
| | | </picture> |
| | | </a> |
| New file |
| | |
| | | [](https://github.com/xinnan-tech/xiaozhi-esp32-server) |
| | | |
| | | <h1 align="center">Dá»ch vụ Backend Xiaozhi xiaozhi-esp32-server</h1> |
| | | |
| | | <p align="center"> |
| | | Dá»± án nà y dá»±a trên lý thuyết và công nghá» trà tuá» cá»ng sinh ngưá»i-máy Äá» phát triá»n há» thá»ng phần má»m và phần cứng thiết bá» Äầu cuá»i thông minh<br/>Cung cấp dá»ch vụ backend cho dá»± án phần cứng thông minh mã nguá»n má» |
| | | <a href="https://github.com/78/xiaozhi-esp32">xiaozhi-esp32</a><br/> |
| | | ÄÆ°á»£c triá»n khai bằng Python, Java, Vue theo <a href="https://ccnphfhqs21z.feishu.cn/wiki/M0XiwldO9iJwHikpXD5cEx71nKh">giao thức truyá»n thông Xiaozhi</a><br/> |
| | | Há» trợ giao thức MQTT+UDP, giao thức Websocket, Äiá»m truy cáºp MCP, nháºn dạng giá»ng nói và kho tri thức |
| | | </p> |
| | | |
| | | <p align="center"> |
| | | <a href="../FAQ.md">Câu há»i thưá»ng gặp</a> |
| | | · <a href="https://github.com/xinnan-tech/xiaozhi-esp32-server/issues">Báo cáo vấn Äá»</a> |
| | | · <a href="../../README.md#%E9%83%A8%E7%BD%B2%E6%96%87%E6%A1%A3">Tà i liá»u triá»n khai</a> |
| | | · <a href="https://github.com/xinnan-tech/xiaozhi-esp32-server/releases">Nháºt ký cáºp nháºt</a> |
| | | </p> |
| | | |
| | | <p align="center"> |
| | | <a href="../../README.md"><img alt="ç®ä½ä¸æçèªè¿°æä»¶" src="https://img.shields.io/badge/ç®ä½ä¸æ-DFE0E5"></a> |
| | | <a href="./README_en.md"><img alt="README in English" src="https://img.shields.io/badge/English-DFE0E5"></a> |
| | | <a href="./README_vi.md"><img alt="Tiếng Viá»t" src="https://img.shields.io/badge/Tiếng Viá»t-DBEDFA"></a> |
| | | <a href="./README_de.md"><img alt="Deutsch" src="https://img.shields.io/badge/Deutsch-DFE0E5"></a> |
| | | <a href="./README_pt_BR.md"><img alt="Português (Brasil)" src="https://img.shields.io/badge/Português (Brasil)-DFE0E5"></a> |
| | | <a href="https://github.com/xinnan-tech/xiaozhi-esp32-server/releases"> |
| | | <img alt="GitHub Contributors" src="https://img.shields.io/github/v/release/xinnan-tech/xiaozhi-esp32-server?logo=docker" /> |
| | | </a> |
| | | <a href="https://github.com/xinnan-tech/xiaozhi-esp32-server/blob/main/LICENSE"> |
| | | <img alt="GitHub pull requests" src="https://img.shields.io/badge/license-MIT-white?labelColor=black" /> |
| | | </a> |
| | | <a href="https://github.com/xinnan-tech/xiaozhi-esp32-server"> |
| | | <img alt="stars" src="https://img.shields.io/github/stars/xinnan-tech/xiaozhi-esp32-server?color=ffcb47&labelColor=black" /> |
| | | </a> |
| | | </p> |
| | | |
| | | <p align="center"> |
| | | Spearheaded by Professor Siyuan Liu's Team (South China University of Technology) |
| | | </br> |
| | | ÄÆ°á»£c dẫn dắt bá»i nhóm Giáo sư Lưu Tư Nguyên (Äại há»c Bách khoa Nam Trung Quá»c) |
| | | </br> |
| | | <img src="../images/hnlg.jpg" alt="ååç工大å¦" width="50%"> |
| | | </p> |
| | | |
| | | --- |
| | | |
| | | ## Ngưá»i dùng phù hợp ð¥ |
| | | |
| | | Dá»± án nà y cần ÄÆ°á»£c sá» dụng cùng vá»i thiết bá» phần cứng ESP32. Nếu bạn Äã mua phần cứng liên quan Äến ESP32, Äã thà nh công kết ná»i vá»i dá»ch vụ backend do anh Xia triá»n khai, và muá»n xây dá»±ng dá»ch vụ backend `xiaozhi-esp32` riêng cá»§a mình, thì dá»± án nà y rất phù hợp vá»i bạn. |
| | | |
| | | Muá»n xem hiá»u quả sá» dụng? Hãy xem video ð¥ |
| | | |
| | | <table> |
| | | <tr> |
| | | <td> |
| | | <a href="https://www.bilibili.com/video/BV1FMFyejExX" target="_blank"> |
| | | <picture> |
| | | <img alt="ååºé度æå" src="docs/images/demo9.png" /></picture> |
| | | </a> |
| | | </td> |
| | | <td> |
| | | <a href="https://www.bilibili.com/video/BV1vchQzaEse" target="_blank"> |
| | | <picture> |
| | | <img alt="é度ä¼åç§è¯" src="docs/images/demo6.png" /></picture> |
| | | </a> |
| | | </td> |
| | | <td> |
| | | <a href="https://www.bilibili.com/video/BV1WEcxzFEAT" target="_blank"> |
| | | <picture> |
| | | <img alt="å°æºæ°å人 æ¯æè¯é³å¤é" src="docs/images/demo8.png" /></picture> |
| | | </a> |
| | | </td> |
| | | <td> |
| | | <a href="https://www.bilibili.com/video/BV1CKVz6UEuB" target="_blank"> |
| | | <picture> |
| | | <img alt="设å¤å¼å«è®¾å¤ï¼æçµè¯" src="docs/images/demo0.png" /></picture> |
| | | </a> |
| | | </td> |
| | | <td> |
| | | <a href="https://www.bilibili.com/video/BV1C1tCzUEZh" target="_blank"> |
| | | <picture> |
| | | <img alt="夿å»çåºæ¯" src="docs/images/demo1.png" /></picture> |
| | | </a> |
| | | </td> |
| | | </tr> |
| | | <tr> |
| | | <td> |
| | | <a href="https://www.bilibili.com/video/BV1VC96Y5EMH" target="_blank"> |
| | | <picture> |
| | | <img alt="ææ¾é³ä¹æ¥è¯¢å¤©æ°ææ¥æ°é»" src="docs/images/demo7.png" /></picture> |
| | | </a> |
| | | </td> |
| | | <td> |
| | | <a href="https://www.bilibili.com/video/BV12J7WzBEaH" target="_blank"> |
| | | <picture> |
| | | <img alt="宿¶ææ" src="docs/images/demo10.png" /></picture> |
| | | </a> |
| | | </td> |
| | | <td> |
| | | <a href="https://www.bilibili.com/video/BV1Co76z7EvK" target="_blank"> |
| | | <picture> |
| | | <img alt="æç
§è¯ç©å" src="docs/images/demo12.png" /></picture> |
| | | </a> |
| | | </td> |
| | | <td> |
| | | <a href="https://www.bilibili.com/video/BV1pNXWYGEx1" target="_blank"> |
| | | <picture> |
| | | <img alt="æ§å¶å®¶çµå¼å
³" src="docs/images/demo5.png" /></picture> |
| | | </a> |
| | | </td> |
| | | <td> |
| | | <a href="https://www.bilibili.com/video/BV1TJ7WzzEo6" target="_blank"> |
| | | <picture> |
| | | <img alt="夿令任å¡" src="docs/images/demo11.png" /></picture> |
| | | </a> |
| | | </td> |
| | | </tr> |
| | | <tr> |
| | | <td> |
| | | <a href="https://www.bilibili.com/video/BV1ZQKUzYExM" target="_blank"> |
| | | <picture> |
| | | <img alt="MCPæ¥å
¥ç¹" src="docs/images/demo13.png" /></picture> |
| | | </a> |
| | | </td> |
| | | <td> |
| | | <a href="https://www.bilibili.com/video/BV1zUW5zJEkq" target="_blank"> |
| | | <picture> |
| | | <img alt="MQTTæä»¤ä¸å" src="docs/images/demo4.png" /></picture> |
| | | </a> |
| | | </td> |
| | | <td> |
| | | <a href="https://www.bilibili.com/video/BV1Exu3zqEDe" target="_blank"> |
| | | <picture> |
| | | <img alt="声纹è¯å«" src="docs/images/demo14.png" /></picture> |
| | | </a> |
| | | </td> |
| | | <td> |
| | | <a href="https://www.bilibili.com/video/BV1CDKWemEU6" target="_blank"> |
| | | <picture> |
| | | <img alt="èªå®ä¹é³è²" src="docs/images/demo2.png" /></picture> |
| | | </a> |
| | | </td> |
| | | <td> |
| | | <a href="https://www.bilibili.com/video/BV12yA2egEaC" target="_blank"> |
| | | <picture> |
| | | <img alt="使ç¨ç²¤è¯äº¤æµ" src="docs/images/demo3.png" /></picture> |
| | | </a> |
| | | </td> |
| | | </tr> |
| | | </table> |
| | | |
| | | --- |
| | | |
| | | ## Cảnh báo â ï¸ |
| | | |
| | | 1. Dá»± án nà y là phần má»m mã nguá»n má», phần má»m nà y không có quan há» hợp tác thương mại vá»i bất kỳ nhà cung cấp dá»ch vụ API bên thứ ba nà o (bao gá»m nhưng không giá»i hạn á» các ná»n tảng nháºn dạng giá»ng nói, mô hình lá»n, tá»ng hợp giá»ng nói, v.v.), và không Äảm bảo chất lượng dá»ch vụ cÅ©ng như an toà n tà i chÃnh cá»§a há». |
| | | Khuyến nghá» ngưá»i dùng ưu tiên lá»±a chá»n nhà cung cấp dá»ch vụ có giấy phép kinh doanh liên quan và Äá»c kỹ thá»a thuáºn dá»ch vụ và chÃnh sách bảo máºt cá»§a há». Phần má»m nà y không lưu trữ bất kỳ khóa tà i khoản nà o, không tham gia và o luá»ng tiá»n và không chá»u rá»§i ro mất tiá»n nạp. |
| | | |
| | | 2. Chức nÄng cá»§a dá»± án nà y chưa hoà n thiá»n và chưa qua Äánh giá bảo máºt mạng, vui lòng không sá» dụng trong môi trưá»ng sản xuất. Nếu bạn triá»n khai dá»± án nà y trong môi trưá»ng mạng công cá»ng Äá» há»c táºp, vui lòng thá»±c hiá»n các biá»n pháp bảo vá» cần thiết. |
| | | |
| | | --- |
| | | |
| | | ## Tà i liá»u triá»n khai |
| | | |
| | |  |
| | | |
| | | Dá»± án nà y cung cấp hai phương pháp triá»n khai, vui lòng chá»n theo nhu cầu cụ thá» cá»§a bạn: |
| | | |
| | | #### ð Lá»±a chá»n phương pháp triá»n khai |
| | | | Phương pháp triá»n khai | Äặc Äiá»m | Tình huá»ng áp dụng | Tà i liá»u triá»n khai | Yêu cầu cấu hình | Video hưá»ng dẫn | |
| | | |---------|------|---------|---------|---------|---------| |
| | | | **Cà i Äặt tá»i giản** | Äá»i thoại thông minh, quản lý ÄÆ¡n tác nhân | Môi trưá»ng cấu hình thấp, dữ liá»u lưu trong tá»p cấu hình, không cần cÆ¡ sá» dữ liá»u | [â Phiên bản Docker](../Deployment.md#%E6%96%B9%E5%BC%8F%E4%B8%80docker%E5%8F%AA%E8%BF%90%E8%A1%8Cserver) / [â¡Triá»n khai mã nguá»n](../Deployment.md#%E6%96%B9%E5%BC%8F%E4%BA%8C%E6%9C%AC%E5%9C%B0%E6%BA%90%E7%A0%81%E5%8F%AA%E8%BF%90%E8%A1%8Cserver)| 2 nhân 4GB nếu dùng `FunASR`, 2 nhân 2GB nếu toà n API | - | |
| | | | **Cà i Äặt toà n bá» module** | Äá»i thoại thông minh, quản lý Äa ngưá»i dùng, quản lý Äa tác nhân, bảng Äiá»u khiá»n thông minh | Trải nghiá»m Äầy Äá»§ tÃnh nÄng, dữ liá»u lưu trong cÆ¡ sá» dữ liá»u |[â Phiên bản Docker](../Deployment_all.md#%E6%96%B9%E5%BC%8F%E4%B8%80docker%E8%BF%90%E8%A1%8C%E5%85%A8%E6%A8%A1%E5%9D%97) / [â¡Triá»n khai mã nguá»n](../Deployment_all.md#%E6%96%B9%E5%BC%8F%E4%BA%8C%E6%9C%AC%E5%9C%B0%E6%BA%90%E7%A0%81%E8%BF%90%E8%A1%8C%E5%85%A8%E6%A8%A1%E5%9D%97) / [â¢Hưá»ng dẫn tá»± Äá»ng cáºp nháºt triá»n khai mã nguá»n](../dev-ops-integration.md) | 4 nhân 8GB nếu dùng `FunASR`, 2 nhân 4GB nếu toà n API| [Video hưá»ng dẫn khá»i Äá»ng mã nguá»n cục bá»](https://www.bilibili.com/video/BV1wBJhz4Ewe) | |
| | | |
| | | Câu há»i thưá»ng gặp và hưá»ng dẫn liên quan, vui lòng tham khảo [liên kết nà y](../FAQ.md) |
| | | |
| | | > ð¡ Gợi ý: Dưá»i Äây là ná»n tảng thá» nghiá»m ÄÆ°á»£c triá»n khai theo mã má»i nhất, có thá» flash Äá» thá» nghiá»m nếu cần, Äá»ng thá»i là 6, dữ liá»u sẽ ÄÆ°á»£c xóa má»i ngà y, |
| | | |
| | | ``` |
| | | Äá»a chá» bảng Äiá»u khiá»n thông minh: https://2662r3426b.vicp.fun |
| | | Bảng Äiá»u khiá»n thông minh (phiên bản h5): https://2662r3426b.vicp.fun/h5/index.html |
| | | |
| | | Công cụ kiá»m tra dá»ch vụ: https://2662r3426b.vicp.fun/test/ |
| | | Äá»a chá» giao diá»n OTA: https://2662r3426b.vicp.fun/xiaozhi/ota/ |
| | | Äá»a chá» giao diá»n Websocket: wss://2662r3426b.vicp.fun/xiaozhi/v1/ |
| | | ``` |
| | | |
| | | #### ð© Mô tả và khuyến nghá» cấu hình |
| | | > [!Note] |
| | | > Dự án nà y cung cấp hai phương án cấu hình: |
| | | > |
| | | > 1. Cấu hình `Miá»
n phà hoà n toà n cho ngưá»i má»i`: Phù hợp vá»i sá» dụng gia Äình cá nhân, tất cả các thà nh phần Äá»u sá» dụng phương án miá»
n phÃ, không cần thanh toán thêm. |
| | | > |
| | | > 2. `Cấu hình streaming`: Phù hợp vá»i demo, Äà o tạo, hÆ¡n 2 Äá»ng thá»i, v.v., sá» dụng công nghá» xá» lý streaming, tá»c Äá» phản há»i nhanh hÆ¡n, trải nghiá»m tá»t hÆ¡n. |
| | | > |
| | | > Từ phiên bản `0.5.2`, dá»± án há» trợ cấu hình streaming, so vá»i phiên bản Äầu, tá»c Äá» phản há»i cải thiá»n khoảng `2.5 giây`, cải thiá»n Äáng ká» trải nghiá»m ngưá»i dùng. |
| | | |
| | | | Tên module | Cà i Äặt miá»
n phà cho ngưá»i má»i | Cấu hình streaming | |
| | | |:---:|:---:|:---:| |
| | | | ASR(Nháºn dạng giá»ng nói) | FunASR(Local) | ðXunfeiStreamASR(Xunfei Streaming) | |
| | | | LLM(Mô hình lá»n) | glm-4-flash(Zhipu) | ðqwen-flash(Alibaba Bailian) | |
| | | | VLLM(Mô hình lá»n thá» giác) | glm-4v-flash(Zhipu) | ðqwen3.5-flash(Alibaba Bailian) | |
| | | | TTS(Tá»ng hợp giá»ng nói) | EdgeTTS(Microsoft) | ðHuoshanDoubleStreamTTS(Volcano Streaming) | |
| | | | Intent(Nháºn dạng ý Äá»nh) | function_call(Gá»i hà m) | function_call(Gá»i hà m) | |
| | | | Memory(Chức nÄng bá» nhá») | mem_local_short(Bá» nhá» ngắn hạn cục bá») | mem_local_short(Bá» nhá» ngắn hạn cục bá») | |
| | | |
| | | Nếu bạn quan tâm Äến thá»i gian cá»§a từng thà nh phần, vui lòng xem [Báo cáo kiá»m tra hiá»u suất các thà nh phần Xiaozhi](https://github.com/xinnan-tech/xiaozhi-performance-research), có thá» kiá»m tra thá»±c tế trong môi trưá»ng cá»§a bạn theo phương pháp kiá»m tra trong báo cáo. |
| | | |
| | | #### ð§ Công cụ kiá»m tra |
| | | Dá»± án nà y cung cấp các công cụ kiá»m tra sau Äá» giúp bạn xác minh há» thá»ng và chá»n mô hình phù hợp: |
| | | |
| | | | Tên công cụ | Vá» trà | Phương pháp sá» dụng | Mô tả chức nÄng | |
| | | |:---:|:---|:---:|:---:| |
| | | | Công cụ kiá»m tra tương tác âm thanh | mainãdigital-humanãindex.html | Chạy `python start.py` trong `main/digital-human`, sau Äó má» `http://127.0.0.1:8006/index.html` | Kiá»m tra chức nÄng phát và nháºn âm thanh, xác minh xá» lý âm thanh phÃa Python có bình thưá»ng không | |
| | | | Công cụ kiá»m tra phản há»i mô hình | mainãxiaozhi-serverãperformance_tester.py | Thá»±c hiá»n `python performance_tester.py` | Kiá»m tra tá»c Äá» phản há»i cá»§a ba module cá»t lõi ASR(Nháºn dạng giá»ng nói), LLM(Mô hình lá»n), VLLM(Mô hình thá» giác), TTS(Tá»ng hợp giá»ng nói) | |
| | | |
| | | > ð¡ Gợi ý: Khi kiá»m tra tá»c Äá» mô hình, chá» kiá»m tra các mô hình Äã cấu hình khóa. |
| | | |
| | | --- |
| | | ## Danh sách tÃnh nÄng ⨠|
| | | ### Äã thá»±c hiá»n â
|
| | |  |
| | | | Module chức nÄng | Mô tả | |
| | | |:---:|:---| |
| | | | Kiến trúc cá»t lõi | Dá»±a trên [cá»ng MQTT+UDP](https://github.com/xinnan-tech/xiaozhi-esp32-server/blob/main/docs/mqtt-gateway-integration.md), WebSocket, máy chá»§ HTTP, cung cấp há» thá»ng quản lý bảng Äiá»u khiá»n và xác thá»±c hoà n chá»nh | |
| | | | Tương tác giá»ng nói | Há» trợ ASR streaming(Nháºn dạng giá»ng nói), TTS streaming(Tá»ng hợp giá»ng nói), VAD(Phát hiá»n hoạt Äá»ng giá»ng nói), há» trợ nháºn dạng Äa ngôn ngữ và xá» lý giá»ng nói | |
| | | | Nháºn dạng vân giá»ng | Há» trợ ÄÄng ký, quản lý và nháºn dạng vân giá»ng Äa ngưá»i dùng, xá» lý song song vá»i ASR, nháºn dạng danh tÃnh ngưá»i nói theo thá»i gian thá»±c và truyá»n cho LLM Äá» phản há»i cá nhân hóa | |
| | | | Äá»i thoại thông minh | Há» trợ nhiá»u LLM(Mô hình ngôn ngữ lá»n), thá»±c hiá»n Äá»i thoại thông minh | |
| | | | Cảm nháºn thá» giác | Há» trợ nhiá»u VLLM(Mô hình lá»n thá» giác), thá»±c hiá»n tương tác Äa phương thức | |
| | | | Nháºn dạng ý Äá»nh | Há» trợ nháºn dạng ý Äá»nh mô hình lá»n gắn ngoà i, gá»i hà m tá»± chá»§ mô hình lá»n, cung cấp cÆ¡ chế xá» lý ý Äá»nh dạng plugin | |
| | | | Há» thá»ng bá» nhá» | Há» trợ bá» nhá» ngắn hạn cục bá», bá» nhá» giao diá»n mem0ai, bá» nhá» thông minh PowerMem, có chức nÄng tóm tắt bá» nhá» | |
| | | | Kho tri thức | Há» trợ kho tri thức RAGFlow, cho phép mô hình lá»n Äánh giá cần gá»i kho tri thức trưá»c khi trả lá»i | |
| | | | Gá»i công cụ | Há» trợ giao thức IOT phÃa client, giao thức MCP phÃa client, giao thức MCP phÃa server, giao thức Äiá»m truy cáºp MCP, hà m công cụ tùy chá»nh | |
| | | | Gá»i lá»nh | Dá»±a và o giao thức MQTT, há» trợ gá»i lá»nh MCP từ bảng Äiá»u khiá»n thông minh xuá»ng thiết bá» ESP32 | |
| | | | Backend quản lý | Cung cấp giao diá»n quản lý Web, há» trợ quản lý ngưá»i dùng, cấu hình há» thá»ng và quản lý thiết bá»; giao diá»n há» trợ hiá»n thá» tiếng Trung giản thá», tiếng Trung phá»n thá», tiếng Anh | |
| | | | Công cụ kiá»m tra | Cung cấp công cụ kiá»m tra hiá»u suất, công cụ kiá»m tra mô hình thá» giác và công cụ kiá»m tra tương tác âm thanh | |
| | | | Há» trợ triá»n khai | Há» trợ triá»n khai Docker và triá»n khai cục bá», cung cấp quản lý tá»p cấu hình hoà n chá»nh | |
| | | | Há» thá»ng plugin | Há» trợ má» rá»ng plugin chức nÄng, phát triá»n plugin tùy chá»nh và hot loading plugin | |
| | | |
| | | ### Äang phát triá»n ð§ |
| | | |
| | | Muá»n hiá»u tiến Äá» kế hoạch phát triá»n cụ thá», [vui lòng nhấp và o Äây](https://github.com/users/xinnan-tech/projects/3). Câu há»i thưá»ng gặp và hưá»ng dẫn liên quan, vui lòng tham khảo [liên kết nà y](../FAQ.md) |
| | | |
| | | Nếu bạn là má»t nhà phát triá»n phần má»m, Äây có má»t [Lá thư má» gá»i các nhà phát triá»n](../contributor_open_letter.md), chà o mừng tham gia! |
| | | |
| | | --- |
| | | |
| | | ## Há» sinh thái sản phẩm ð¬ |
| | | Xiaozhi là má»t há» sinh thái, khi bạn sá» dụng sản phẩm nà y, bạn cÅ©ng có thá» xem các [dá»± án xuất sắc](https://github.com/78/xiaozhi-esp32/blob/main/README_zh.md#%E7%9B%B8%E5%85%B3%E5%BC%80%E6%BA%90%E9%A1%B9%E7%9B%AE) khác trong há» sinh thái nà y |
| | | |
| | | --- |
| | | |
| | | ## Danh sách ná»n tảng/thà nh phần ÄÆ°á»£c dá»± án nà y há» trợ ð |
| | | ### LLM Mô hình ngôn ngữ |
| | | |
| | | | Phương pháp sá» dụng | Ná»n tảng há» trợ | Ná»n tảng miá»
n phà | |
| | | |:---:|:---:|:---:| |
| | | | Gá»i giao diá»n openai | Alibaba Bailian, Volcano Engine, DeepSeek, Zhipu, Gemini, iFlytek | Zhipu, Gemini | |
| | | | Gá»i giao diá»n ollama | Ollama | - | |
| | | | Gá»i giao diá»n dify | Dify | - | |
| | | | Gá»i giao diá»n fastgpt | Fastgpt | - | |
| | | | Gá»i giao diá»n coze | Coze | - | |
| | | | Gá»i giao diá»n xinference | Xinference | - | |
| | | | Gá»i giao diá»n homeassistant | HomeAssistant | - | |
| | | |
| | | Trên thá»±c tế, bất kỳ LLM nà o há» trợ gá»i giao diá»n openai Äá»u có thá» truy cáºp sá» dụng. |
| | | |
| | | --- |
| | | |
| | | ### VLLM Mô hình thỠgiác |
| | | |
| | | | Phương pháp sá» dụng | Ná»n tảng há» trợ | Ná»n tảng miá»
n phà | |
| | | |:---:|:---:|:---:| |
| | | | Gá»i giao diá»n openai | Alibaba Bailian, Zhipu ChatGLMVLLM | Zhipu ChatGLMVLLM | |
| | | |
| | | Trên thá»±c tế, bất kỳ VLLM nà o há» trợ gá»i giao diá»n openai Äá»u có thá» truy cáºp sá» dụng. |
| | | |
| | | --- |
| | | |
| | | ### TTS Tá»ng hợp giá»ng nói |
| | | |
| | | | Phương pháp sá» dụng | Ná»n tảng há» trợ | Ná»n tảng miá»
n phà | |
| | | |:---:|:---:|:---:| |
| | | | Gá»i giao diá»n | EdgeTTS, iFlytek, Volcano Engine, Tencent Cloud, Alibaba Cloud và Bailian, CosyVoiceSiliconflow, TTS302AI, CozeCnTTS, GizwitsTTS, ACGNTTS, OpenAITTS, Lingxi streaming TTS, MinimaxTTS | Lingxi streaming TTS, EdgeTTS, CosyVoiceSiliconflow(má»t phần) | |
| | | | Dá»ch vụ cục bá» | FishSpeech, GPT_SOVITS_V2, GPT_SOVITS_V3, Index-TTS, PaddleSpeech | Index-TTS, PaddleSpeech, FishSpeech, GPT_SOVITS_V2, GPT_SOVITS_V3 | |
| | | |
| | | --- |
| | | |
| | | ### VAD Phát hiá»n hoạt Äá»ng giá»ng nói |
| | | |
| | | | Loại | Tên ná»n tảng | Phương pháp sá» dụng | Mô hình thu phà | Ghi chú | |
| | | |:---:|:---------:|:----:|:----:|:--:| |
| | | | VAD | SileroVAD | Sá» dụng cục bá» | Miá»
n phà | | |
| | | |
| | | --- |
| | | |
| | | ### ASR Nháºn dạng giá»ng nói |
| | | |
| | | | Phương pháp sá» dụng | Ná»n tảng há» trợ | Ná»n tảng miá»
n phà | |
| | | |:---:|:---:|:---:| |
| | | | SỠdụng cục bỠ| FunASR, SherpaASR | FunASR, SherpaASR | |
| | | | Gá»i giao diá»n | FunASRServer, Volcano Engine, iFlytek, Tencent Cloud, Alibaba Cloud, Baidu Cloud, OpenAI ASR | FunASRServer | |
| | | |
| | | --- |
| | | |
| | | ### Voiceprint Nháºn dạng vân giá»ng |
| | | |
| | | | Phương pháp sá» dụng | Ná»n tảng há» trợ | Ná»n tảng miá»
n phà | |
| | | |:---:|:---:|:---:| |
| | | | SỠdụng cục bỠ| 3D-Speaker | 3D-Speaker | |
| | | |
| | | --- |
| | | |
| | | ### Memory Lưu trữ bỠnhỠ|
| | | |
| | | | Loại | Tên ná»n tảng | Phương pháp sá» dụng | Mô hình thu phà | Ghi chú | |
| | | |:------:|:---------------:|:----:|:---------:|:--:| |
| | | | Memory | mem0ai | Gá»i giao diá»n | Hạn mức 1000 lần/tháng | | |
| | | | Memory | [powermem](../powermem-integration.md) | Tóm tắt cục bá» | Phụ thuá»c và o LLM và DB | OceanBase mã nguá»n má», há» trợ tìm kiếm thông minh | |
| | | | Memory | mem_local_short | Tóm tắt cục bá» | Miá»
n phà | | |
| | | | Memory | nomem | Chế Äá» không có bá» nhá» | Miá»
n phà | | |
| | | |
| | | --- |
| | | |
| | | ### Intent Nháºn dạng ý Äá»nh |
| | | |
| | | | Loại | Tên ná»n tảng | Phương pháp sá» dụng | Mô hình thu phà | Ghi chú | |
| | | |:------:|:-------------:|:----:|:-------:|:---------------------:| |
| | | | Intent | intent_llm | Gá»i giao diá»n | Thu phà theo LLM | Nháºn dạng ý Äá»nh qua mô hình lá»n, tÃnh tá»ng quát mạnh | |
| | | | Intent | function_call | Gá»i giao diá»n | Thu phà theo LLM | Hoà n thà nh ý Äá»nh qua gá»i hà m mô hình lá»n, tá»c Äá» nhanh, hiá»u quả tá»t | |
| | | | Intent | nointent | Chế Äá» không có ý Äá»nh | Miá»
n phà | Không thá»±c hiá»n nháºn dạng ý Äá»nh, trả vá» trá»±c tiếp kết quả Äá»i thoại | |
| | | |
| | | --- |
| | | |
| | | ### Rag TÄng cưá»ng truy xuất thông tin |
| | | |
| | | | Loại | Tên ná»n tảng | Phương pháp sá» dụng | Mô hình thu phà | Ghi chú | |
| | | |:------:|:-------------:|:----:|:-------:|:---------------------:| |
| | | | Rag | ragflow | Gá»i giao diá»n | Thu phà theo token tiêu tá»n cá»§a phân Äoạn, phân từ | Sá» dụng chức nÄng tÄng cưá»ng truy xuất cá»§a RagFlow, cung cấp phản há»i Äá»i thoại chÃnh xác hÆ¡n | |
| | | |
| | | --- |
| | | |
| | | ## Lá»i cảm Æ¡n ð |
| | | |
| | | | Logo | Dự án/Công ty | Mô tả | |
| | | |:---:|:---:|:---| |
| | | | <img src="../images/logo_bailing.png" width="160"> | [Robot Äá»i thoại giá»ng nói Bailing](https://github.com/wwbin2017/bailing) | Dá»± án nà y ÄÆ°á»£c lấy cảm hứng từ [Robot Äá»i thoại giá»ng nói Bailing](https://github.com/wwbin2017/bailing) vÃ ÄÆ°á»£c triá»n khai trên cÆ¡ sá» Äó | |
| | | | <img src="../images/logo_tenclass.png" width="160"> | [Shifang Ronghai](https://www.tenclass.com/) | Cảm Æ¡n [Shifang Ronghai](https://www.tenclass.com/) Äã xây dá»±ng giao thức truyá»n thông tiêu chuẩn, phương án tương thÃch Äa thiết bá» và mô phạm thá»±c hà nh tình huá»ng Äá»ng thá»i cao cho há» sinh thái Xiaozhi; cung cấp tà i liá»u há» trợ kỹ thuáºt toà n diá»n cho dá»± án nà y | |
| | | | <img src="../images/logo_xuanfeng.png" width="160"> | [Xuanfeng Technology](https://github.com/Eric0308) | Cảm Æ¡n [Xuanfeng Technology](https://github.com/Eric0308) Äã Äóng góp khung gá»i hà m, giao thức truyá»n thông MCP và mã triá»n khai cÆ¡ chế gá»i dạng plugin, thông qua há» thá»ng Äiá»u phá»i lá»nh tiêu chuẩn hóa và khả nÄng má» rá»ng Äá»ng, Äã cải thiá»n Äáng ká» hiá»u suất tương tác và khả nÄng má» rá»ng chức nÄng cá»§a thiết bá» front-end(IoT) | |
| | | | <img src="../images/logo_junsen.png" width="160"> | [huangjunsen](https://github.com/huangjunsen0406) | Cảm Æ¡n [huangjunsen](https://github.com/huangjunsen0406) Äã Äóng góp module `Bảng Äiá»u khiá»n thông minh di Äá»ng`, thá»±c hiá»n Äiá»u khiá»n hiá»u quả và tương tác thá»i gian thá»±c trên thiết bá» di Äá»ng Äa ná»n tảng, cải thiá»n Äáng ká» sá»± tiá»n lợi váºn hà nh và hiá»u quả quản lý cá»§a há» thá»ng trong tình huá»ng di Äá»ng | |
| | | | <img src="../images/logo_huiyuan.png" width="160"> | [Huiyuan Design](http://ui.kwd988.net/) | Cảm Æ¡n [Huiyuan Design](http://ui.kwd988.net/) Äã cung cấp giải pháp thá» giác chuyên nghiá»p cho dá»± án nà y, sá» dụng kinh nghiá»m thá»±c tế thiết kế phục vụ hÆ¡n nghìn doanh nghiá»p, trao quyá»n cho trải nghiá»m ngưá»i dùng sản phẩm cá»§a dá»± án nà y | |
| | | | <img src="../images/logo_qinren.png" width="160"> | [Xi'an Qinren Information Technology](https://www.029app.com/) | Cảm Æ¡n [Xi'an Qinren Information Technology](https://www.029app.com/) Äã là m sâu sắc há» thá»ng thá» giác cá»§a dá»± án nà y, Äảm bảo tÃnh nhất quán và khả nÄng má» rá»ng cá»§a phong cách thiết kế tá»ng thá» trong ứng dụng Äa tình huá»ng | |
| | | | <img src="../images/logo_contributors.png" width="160"> | [Ngưá»i Äóng góp mã](https://github.com/xinnan-tech/xiaozhi-esp32-server/graphs/contributors) | Cảm Æ¡n [tất cả ngưá»i Äóng góp mã](https://github.com/xinnan-tech/xiaozhi-esp32-server/graphs/contributors), sá»± cá»ng hiến cá»§a bạn khiến dá»± án mạnh mẽ và vững chắc hÆ¡n. | |
| | | |
| | | |
| | | <a href="https://star-history.com/#xinnan-tech/xiaozhi-esp32-server&Date"> |
| | | |
| | | <picture> |
| | | <source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/svg?repos=xinnan-tech/xiaozhi-esp32-server&type=Date&theme=dark" /> |
| | | <source media="(prefers-color-scheme: light)" srcset="https://api.star-history.com/svg?repos=xinnan-tech/xiaozhi-esp32-server&type=Date" /> |
| | | <img alt="Star History Chart" src="https://api.star-history.com/svg?repos=xinnan-tech/xiaozhi-esp32-server&type=Date" /> |
| | | </picture> |
| | | </a> |
| New file |
| | |
| | | # 声纹è¯å«å¯ç¨æå |
| | | |
| | | æ¬æç¨å
å«3个é¨å |
| | | - 1ãå¦ä½é¨ç½²å£°çº¹è¯å«è¿ä¸ªæå¡ |
| | | - 2ãå
¨æ¨¡åé¨ç½²æ¶ï¼æä¹é
置声纹è¯å«æ¥å£ |
| | | - 3ãæç®åé¨ç½²æ¶ï¼æä¹é
置声纹è¯å« |
| | | |
| | | # 1ãå¦ä½é¨ç½²å£°çº¹è¯å«è¿ä¸ªæå¡ |
| | | |
| | | ## ç¬¬ä¸æ¥ï¼ä¸è½½å£°çº¹è¯å«é¡¹ç®æºç |
| | | |
| | | æµè§å¨æå¼[声纹è¯å«é¡¹ç®å°å](https://github.com/xinnan-tech/voiceprint-api) |
| | | |
| | | æå¼å®ï¼æ¾å°é¡µé¢ä¸ä¸ä¸ªç»¿è²çæé®ï¼åç`Code`çæé®ï¼ç¹å¼å®ï¼ç¶åä½ å°±çå°`Download ZIP`çæé®ã |
| | | |
| | | ç¹å»å®ï¼ä¸è½½æ¬é¡¹ç®æºç å缩å
ãä¸è½½å°ä½ çµèåï¼è§£åå®ï¼æ¤æ¶å®çååå¯è½å«`voiceprint-api-main` |
| | | ä½ éè¦æå®éå½åæ`voiceprint-api`ã |
| | | |
| | | ## ç¬¬äºæ¥ï¼ åå»ºæ°æ®åºå表 |
| | | |
| | | 声纹è¯å«éè¦ä¾èµ`mysql`æ°æ®åºãå¦æä½ ä¹åå·²ç»é¨ç½²`æºæ§å°`ï¼è¯´æä½ å·²ç»å®è£
äº`mysql`ãä½ å¯ä»¥å
±ç¨å®ã |
| | | |
| | | ä½ å¯ä»¥ä½ è¯ä¸ä¸å¨å®¿ä¸»æºä½¿ç¨`telnet`å½ä»¤ï¼ççè½ä¸è½æ£å¸¸è®¿é®`mysql`ç`3306`端å£ã |
| | | ``` |
| | | telnet 127.0.0.1 3306 |
| | | ``` |
| | | 妿è½è®¿é®å°3306端å£ï¼è¯·å¿½ç¥ä»¥ä¸çå
容ï¼ç´æ¥è¿å
¥ç¬¬ä¸æ¥ã |
| | | |
| | | 妿ä¸è½è®¿é®ï¼ä½ éè¦åå¿ä¸ä¸ï¼ä½ ç`mysql`æ¯æä¹å®è£
çã |
| | | |
| | | å¦æä½ çmysqlæ¯éè¿èªå·±ä½¿ç¨å®è£
å
å®è£
çï¼è¯´æä½ ç`mysql`åäºç½ç»é离ãä½ å¯è½å
è§£å³è®¿é®`mysql`ç`3306`端å£è¿ä¸ªé®é¢ã |
| | | |
| | | å¦æä½ `mysql`æ¯éè¿æ¬é¡¹ç®ç`docker-compose_all.yml`å®è£
çãä½ éè¦æ¾ä¸ä¸ä½ 彿¶åå»ºæ°æ®åºç`docker-compose_all.yml`æä»¶ï¼ä¿®æ¹ä»¥ä¸çå
容 |
| | | |
| | | ä¿®æ¹å |
| | | ``` |
| | | xiaozhi-esp32-server-db: |
| | | ... |
| | | networks: |
| | | - default |
| | | expose: |
| | | - "3306:3306" |
| | | ``` |
| | | |
| | | ä¿®æ¹å |
| | | ``` |
| | | xiaozhi-esp32-server-db: |
| | | ... |
| | | networks: |
| | | - default |
| | | ports: |
| | | - "3306:3306" |
| | | ``` |
| | | |
| | | æ³¨ææ¯å°`xiaozhi-esp32-server-db`ä¸é¢ç`expose`æ¹æ`ports`ãæ¹å®åï¼éè¦éæ°å¯å¨ã以䏿¯éå¯mysqlçå½ä»¤ï¼ |
| | | |
| | | ``` |
| | | # è¿å
¥ä½ docker-compose_all.ymlæå¨çæä»¶å¤¹ï¼ä¾å¦æçæ¯xiaozhi-server |
| | | cd xiaozhi-server |
| | | docker compose -f docker-compose_all.yml down |
| | | docker compose -f docker-compose.yml up -d |
| | | ``` |
| | | |
| | | å¯å¨å®åï¼å¨å®¿ä¸»æºå使ç¨`telnet`å½ä»¤ï¼ççè½ä¸è½æ£å¸¸è®¿é®`mysql`ç`3306`端å£ã |
| | | ``` |
| | | telnet 127.0.0.1 3306 |
| | | ``` |
| | | æ£å¸¸æ¥è¯´è¿æ ·å°±å¯ä»¥è®¿é®çäºã |
| | | |
| | | ## ç¬¬ä¸æ¥ï¼ åå»ºæ°æ®åºå表 |
| | | å¦æä½ ç宿主æºï¼è½æ£å¸¸è®¿é®mysqlæ°æ®åºï¼é£å°±å¨mysqlä¸å建ä¸ä¸ªåå为`voiceprint_db`çæ°æ®åºå`voiceprints`表ã |
| | | |
| | | ``` |
| | | CREATE DATABASE voiceprint_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; |
| | | |
| | | USE voiceprint_db; |
| | | |
| | | CREATE TABLE voiceprints ( |
| | | id INT AUTO_INCREMENT PRIMARY KEY, |
| | | speaker_id VARCHAR(255) NOT NULL UNIQUE, |
| | | feature_vector LONGBLOB NOT NULL, |
| | | created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, |
| | | updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, |
| | | INDEX idx_speaker_id (speaker_id) |
| | | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; |
| | | ``` |
| | | |
| | | ## ç¬¬åæ¥ï¼ é
ç½®æ°æ®åºè¿æ¥ |
| | | |
| | | è¿å
¥`voiceprint-api`æä»¶å¤¹ï¼å建åå为`data`çæä»¶å¤¹ã |
| | | |
| | | æ`voiceprint-api`æ ¹ç®å½éç`voiceprint.yaml`ï¼å¤å¶å°`data`çæä»¶å¤¹ï¼å°å®éå½å为`.voiceprint.yaml` |
| | | |
| | | æ¥ä¸æ¥ï¼ä½ éè¦éç¹é
ç½®ä¸ä¸`.voiceprint.yaml`éçæ°æ®åºè¿æ¥ã |
| | | |
| | | ``` |
| | | mysql: |
| | | host: "127.0.0.1" |
| | | port: 3306 |
| | | user: "root" |
| | | password: "your_password" |
| | | database: "voiceprint_db" |
| | | ``` |
| | | |
| | | 注æï¼ç±äºä½ ç声纹è¯å«æå¡æ¯ä½¿ç¨dockeré¨ç½²ï¼`host`éè¦å¡«åæä½ `mysqlæå¨æºå¨çå±åç½ip`ã |
| | | |
| | | 注æï¼ç±äºä½ ç声纹è¯å«æå¡æ¯ä½¿ç¨dockeré¨ç½²ï¼`host`éè¦å¡«åæä½ `mysqlæå¨æºå¨çå±åç½ip`ã |
| | | |
| | | 注æï¼ç±äºä½ ç声纹è¯å«æå¡æ¯ä½¿ç¨dockeré¨ç½²ï¼`host`éè¦å¡«åæä½ `mysqlæå¨æºå¨çå±åç½ip`ã |
| | | |
| | | ## ç¬¬äºæ¥ï¼å¯å¨ç¨åº |
| | | è¿ä¸ªé¡¹ç®æ¯ä¸ä¸ªå¾ç®åç项ç®ï¼å»ºè®®ä½¿ç¨dockerè¿è¡ãä¸è¿å¦æä½ 䏿³ä½¿ç¨dockerè¿è¡ï¼ä½ å¯ä»¥åè[è¿ä¸ªé¡µé¢](https://github.com/xinnan-tech/voiceprint-api/blob/main/README.md)ä½¿ç¨æºç è¿è¡ã以䏿¯dockerè¿è¡çæ¹æ³ |
| | | |
| | | ``` |
| | | # è¿å
¥æ¬é¡¹ç®æºç æ ¹ç®å½ |
| | | cd voiceprint-api |
| | | |
| | | # æ¸
é¤ç¼å |
| | | docker compose -f docker-compose.yml down |
| | | docker stop voiceprint-api |
| | | docker rm voiceprint-api |
| | | docker rmi ghcr.nju.edu.cn/xinnan-tech/voiceprint-api:latest |
| | | |
| | | # å¯å¨dockerå®¹å¨ |
| | | docker compose -f docker-compose.yml up -d |
| | | # æ¥çæ¥å¿ |
| | | docker logs -f voiceprint-api |
| | | ``` |
| | | |
| | | æ¤æ¶ï¼æ¥å¿éä¼è¾åºç±»ä¼¼ä»¥ä¸çæ¥å¿ |
| | | ``` |
| | | 250711 INFO-ð å¼å§: ç产ç¯å¢æå¡å¯å¨ï¼Uvicornï¼ï¼çå¬å°å: 0.0.0.0:8005 |
| | | 250711 INFO-============================================================ |
| | | 250711 INFO-声纹æ¥å£å°å: http://127.0.0.1:8005/voiceprint/health?key=abcd |
| | | 250711 INFO-============================================================ |
| | | ``` |
| | | |
| | | è¯·ä½ æå£°çº¹æ¥å£å°åå¤å¶åºæ¥ï¼ |
| | | |
| | | ç±äºä½ æ¯dockeré¨ç½²ï¼åä¸å¯ç´æ¥ä½¿ç¨ä¸é¢çå°åï¼ |
| | | |
| | | ç±äºä½ æ¯dockeré¨ç½²ï¼åä¸å¯ç´æ¥ä½¿ç¨ä¸é¢çå°åï¼ |
| | | |
| | | ç±äºä½ æ¯dockeré¨ç½²ï¼åä¸å¯ç´æ¥ä½¿ç¨ä¸é¢çå°åï¼ |
| | | |
| | | ä½ å
æå°åå¤å¶åºæ¥ï¼æ¾å¨ä¸ä¸ªè稿éï¼ä½ è¦ç¥éä½ ççµèçå±åç½ipæ¯ä»ä¹ï¼ä¾å¦æççµèå±åç½ipæ¯`192.168.1.25`ï¼é£ä¹ |
| | | 忥æçæ¥å£å°å |
| | | ``` |
| | | http://127.0.0.1:8005/voiceprint/health?key=abcd |
| | | |
| | | ``` |
| | | å°±è¦æ¹æ |
| | | ``` |
| | | http://192.168.1.25:8005/voiceprint/health?key=abcd |
| | | ``` |
| | | |
| | | æ¹å¥½åï¼è¯·ä½¿ç¨æµè§å¨ç´æ¥è®¿é®`声纹æ¥å£å°å`ã彿µè§å¨åºç°ç±»ä¼¼è¿æ ·ç代ç ï¼è¯´ææ¯æåäºã |
| | | ``` |
| | | {"total_voiceprints":0,"status":"healthy"} |
| | | ``` |
| | | |
| | | è¯·ä½ ä¿ç好修æ¹åç`声纹æ¥å£å°å`ï¼ä¸ä¸æ¥è¦ç¨å°ã |
| | | |
| | | # 2ãå
¨æ¨¡åé¨ç½²æ¶ï¼æä¹é
置声纹è¯å« |
| | | |
| | | ## ç¬¬ä¸æ¥ é
ç½®æ¥å£ |
| | | é¦å
ï¼ä½ è¦å¼å¯å£°çº¹è¯å«åè½ã卿ºæ§å°ï¼ç¹å»é¡¶é¨`åæ°åå
¸`ï¼å¨ä¸æèåä¸ï¼ç¹å»`ç³»ç»åè½é
ç½®`页é¢ãå¨é¡µé¢ä¸å¾é`声纹è¯å«`ï¼ç¹å»`ä¿åé
ç½®`ãå³å¯å¨æ°å»ºæºè½ä½çå¡çä¸çå°`声纹è¯å«`æé®ã |
| | | |
| | | å¦æä½ æ¯å
¨æ¨¡åé¨ç½²ï¼ä½¿ç¨ç®¡çåè´¦å·ï¼ç»å½æºæ§å°ï¼ç¹å»é¡¶é¨`åæ°åå
¸`ï¼éæ©`åæ°ç®¡ç`åè½ã |
| | | |
| | | ç¶åæç´¢åæ°`server.voice_print`ï¼æ¤æ¶ï¼å®çå¼åºè¯¥æ¯`null`å¼ã |
| | | ç¹å»ä¿®æ¹æé®ï¼æä¸ä¸æ¥å¾æ¥ç`声纹æ¥å£å°å`ç²è´´å°`åæ°å¼`éãç¶åä¿åã |
| | | |
| | | 妿è½ä¿åæåï¼è¯´æä¸å顺å©ï¼ä½ å¯ä»¥å»æºè½ä½æ¥çææäºã妿䏿åï¼è¯´ææºæ§å°æ æ³è®¿é®å£°çº¹è¯å«ï¼å¾å¤§æ¦çæ¯ç½ç»é²ç«å¢ï¼æè
没æå¡«åæ£ç¡®çå±åç½ipã |
| | | |
| | | ## ç¬¬äºæ¥ 设置æºè½ä½è®°å¿æ¨¡å¼ |
| | | |
| | | è¿å
¥ä½ çæºè½ä½çè§è²é
ç½®éï¼å°è®°å¿è®¾ç½®æ`æ¬å°çæè®°å¿`ï¼ä¸å®è¦å¼å¯`䏿¥æå+è¯é³`ã |
| | | |
| | | ## ç¬¬ä¸æ¥ åä½ çæºè½ä½è天 |
| | | |
| | | å°ä½ ç设å¤éçµï¼ç¶ååä»ç¨æ£å¸¸çè¯éåé³è°è天ã |
| | | |
| | | ## ç¬¬åæ¥ 设置声纹 |
| | | |
| | | 卿ºæ§å°ï¼`æºè½ä½ç®¡ç`页é¢ï¼å¨æºè½ä½ç颿¿éï¼æä¸ä¸ª`声纹è¯å«`æé®ï¼ç¹å»å®ãå¨åºé¨æä¸ä¸ª`æ°å¢æé®`ãå°±å¯ä»¥å¯¹æä¸ªäººè¯´çè¯è¿è¡å£°çº¹æ³¨åã |
| | | å¨å¼¹åºçæ¡éï¼`æè¿°`è¿ä¸ªå±æ§å»ºè®®å¡«åä¸ï¼å¯ä»¥æ¯è¿ä¸ªäººçèä¸ãæ§æ ¼ãç±å¥½ãæ¹ä¾¿æºè½ä½å¯¹è¯´è¯äººè¿è¡åæåäºè§£ã |
| | | |
| | | ## ç¬¬ä¸æ¥ åä½ çæºè½ä½è天 |
| | | |
| | | å°ä½ ç设å¤éçµï¼é®å®ï¼ä½ ç¥éææ¯è°åï¼å¦æä»è½åçå¾åºï¼è¯´æå£°çº¹è¯å«åè½æ£å¸¸ã |
| | | |
| | | # 3ãæç®åé¨ç½²æ¶ï¼æä¹é
置声纹è¯å« |
| | | |
| | | ## ç¬¬ä¸æ¥ é
ç½®æ¥å£ |
| | | æå¼ `xiaozhi-server/data/.config.yaml` æä»¶ï¼å¦ææ²¡æéè¦å建ï¼ï¼ç¶åæ·»å /ä¿®æ¹ä»¥ä¸å
å®¹ï¼ |
| | | |
| | | ``` |
| | | # 声纹è¯å«é
ç½® |
| | | voiceprint: |
| | | # 声纹æ¥å£å°å |
| | | url: ä½ ç声纹æ¥å£å°å |
| | | # 说è¯äººé
ç½®ï¼speaker_id,åç§°,æè¿° |
| | | speakers: |
| | | - "test1,å¼ ä¸,å¼ ä¸æ¯ä¸ä¸ªç¨åºå" |
| | | - "test2,æå,æåæ¯ä¸ä¸ªäº§åç»ç" |
| | | - "test3,çäº,çäºæ¯ä¸ä¸ªè®¾è®¡å¸" |
| | | ``` |
| | | |
| | | æä¸ä¸æ¥å¾æ¥ç `声纹æ¥å£å°å` ç²è´´å° `url` éãç¶åä¿åã |
| | | |
| | | `speakers` 忰便®éæ±æ·»å ãè¿ééè¦æ³¨æè¿ä¸ª `speaker_id` åæ°ï¼å颿³¨å声纹ä¼ç¨å°ã |
| | | |
| | | ## ç¬¬äºæ¥ 注å声纹 |
| | | å¦æä½ å·²ç»å¯å¨äºå£°çº¹æå¡ï¼æ¬å°æµè§å¨éè®¿é® `http://localhost:8005/voiceprint/docs` å³å¯æ¥ç API ææ¡£ï¼è¿éåªè¯´ææ³¨å声纹ç API å¦ä½ä½¿ç¨ã |
| | | |
| | | 注å声纹ç API å°å为 `http://localhost:8005/voiceprint/register`ï¼è¯·æ±æ¹å¼ä¸º POSTã |
| | | |
| | | 请æ±å¤´éè¦å
å« Bearer Token 认è¯ï¼token 为 `声纹æ¥å£å°å` ä¸ `?key=` åçé¨åï¼æ¯å¦å¦ææç声纹注åå°å为 `http://127.0.0.1:8005/voiceprint/health?key=abcd`ï¼é£ä¹æç token å°±æ¯`abcd`ã |
| | | |
| | | 请æ±ä½å
å«è¯´è¯äºº IDï¼speaker_idï¼ï¼å WAV é³é¢æä»¶ï¼fileï¼ï¼è¯·æ±ç¤ºä¾å¦ä¸ï¼ |
| | | |
| | | ``` |
| | | curl -X POST \ |
| | | -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \ |
| | | -F "speaker_id=your_speaker_id_here" \ |
| | | -F "file=@/path/to/your/file" \ |
| | | http://localhost:8005/voiceprint/register |
| | | ``` |
| | | |
| | | è¿éç `file` æ¯è¦æ³¨åç说è¯äººè¯´è¯çé³é¢æä»¶ï¼ `speaker_id` éè¦åç¬¬ä¸æ¥é
ç½®æ¥å£ç `speaker_id` ä¿æä¸è´ãæ¯å¦è¯´æéè¦æ³¨åå¼ ä¸ç声纹ï¼å¨ `.config.yaml` ä¸å¡«çå¼ ä¸ç `speaker_id` 为 `test1`ï¼é£ä¹ææ³¨åå¼ ä¸å£°çº¹çæ¶åï¼è¯·æ±ä½éå¡«ç `speaker_id` å°±æ¯ `test1`ï¼ `file` å¡«çå°±æ¯å¼ ä¸è¯´ä¸æ®µè¯çé³é¢æä»¶ã |
| | | |
| | | ## ç¬¬ä¸æ¥ å¯å¨æå¡ |
| | | |
| | | å¯å¨å°æºæå¡å¨å声纹æå¡ï¼å³å¯æ£å¸¸ä½¿ç¨ã |
| New file |
| | |
| | | # å¤©æ°æä»¶ä½¿ç¨æå |
| | | |
| | | ## æ¦è¿° |
| | | |
| | | å¤©æ°æä»¶ `get_weather` æ¯å°æºESP32è¯é³å©æçæ ¸å¿åè½ä¹ä¸ï¼æ¯æéè¿è¯é³æ¥è¯¢å
¨å½åå°ç天æ°ä¿¡æ¯ãæä»¶åºäºåé£å¤©æ°APIï¼æä¾å®æ¶å¤©æ°å7天天æ°é¢æ¥åè½ã |
| | | |
| | | ## API Key ç³è¯·æå |
| | | |
| | | ### 1. 注ååé£å¤©æ°è´¦å· |
| | | |
| | | 1. è®¿é® [åé£å¤©æ°æ§å¶å°](https://console.qweather.com/) |
| | | 2. 注åè´¦å·å¹¶å®æé®ç®±éªè¯ |
| | | 3. ç»å½æ§å¶å° |
| | | |
| | | ### 2. å建åºç¨è·åAPI Key |
| | | |
| | | 1. è¿å
¥æ§å¶å°åï¼ç¹å»å³ä¾§["项ç®ç®¡ç"](https://console.qweather.com/project?lang=zh) â "å建项ç®" |
| | | 2. å¡«å项ç®ä¿¡æ¯ï¼ |
| | | - **项ç®åç§°**ï¼å¦"å°æºè¯é³å©æ" |
| | | 3. ç¹å»ä¿å |
| | | 4. 项ç®åå»ºå®æåï¼å¨è¯¥é¡¹ç®ä¸ç¹å»"åå»ºåæ®" |
| | | 5. å¡«ååæ®ä¿¡æ¯ï¼ |
| | | - **åæ®åç§°**ï¼å¦"å°æºè¯é³å©æ" |
| | | - **èº«ä»½è®¤è¯æ¹å¼**ï¼éæ©"API Key" |
| | | 6. ç¹å»ä¿å |
| | | 7. å¨åæ®ä¸å¤å¶`API Key`ï¼è¿æ¯ç¬¬ä¸ä¸ªå
³é®çé
ç½®ä¿¡æ¯ |
| | | |
| | | ### 3. è·åAPI Host |
| | | |
| | | 1. 卿§å¶å°ä¸ç¹å»["设置"](https://console.qweather.com/setting?lang=zh) â "API Host" |
| | | 2. æ¥çåé
ç»ä½ çä¸å±`API Host`å°åï¼è¿ä¸ªæ¯ç¬¬äºä¸ªå
³é®çé
ç½®ä¿¡æ¯ |
| | | |
| | | 以䏿ä½ï¼ä¼å¾å°ä¸¤ä¸ªéè¦çé
置信æ¯:`API Key`å`API Host` |
| | | |
| | | ## é
ç½®æ¹å¼(ä»»éä¸ç§) |
| | | |
| | | ### æ¹å¼1. å¦æä½ ä½¿ç¨äºæºæ§å°é¨ç½²ï¼æ¨èï¼ |
| | | |
| | | 1. ç»å½æºæ§å° |
| | | 2. è¿å
¥"è§è²é
ç½®"é¡µé¢ |
| | | 3. éæ©è¦é
ç½®çæºè½ä½ |
| | | 4. ç¹å»"ç¼è¾åè½"æé® |
| | | 5. å¨å³ä¾§åæ°é
ç½®åºåæ¾å°"å¤©æ°æ¥è¯¢"æä»¶ |
| | | 6. å¾é"å¤©æ°æ¥è¯¢" |
| | | 7. å°å¤å¶è¿æ¥ç第ä¸ä¸ªå
³é®é
ç½®`API Key`,å¡«å
¥å°`å¤©æ°æä»¶ API å¯é¥`é |
| | | 8. å°å¤å¶è¿æ¥ç第äºä¸ªå
³é®é
ç½®`API Host`,å¡«å
¥å°`å¼åè
API Host`é |
| | | 9. ä¿åé
ç½®ï¼åä¿åæºè½ä½é
ç½® |
| | | |
| | | ### æ¹å¼2. å¦æä½ åªæ¯å模åxiaozhi-serveré¨ç½² |
| | | |
| | | å¨ `data/.config.yaml` ä¸é
ç½®ï¼ |
| | | |
| | | 1. å°å¤å¶è¿æ¥ç第ä¸ä¸ªå
³é®é
ç½®`API Key`,å¡«å
¥å°`api_key`é |
| | | 2. å°å¤å¶è¿æ¥ç第äºä¸ªå
³é®é
ç½®`API Host`,å¡«å
¥å°`api_host`é |
| | | 3. å°ä½ æå¨çåå¸å¡«å
¥å°`default_location`éï¼ä¾å¦`广å·` |
| | | |
| | | ```yaml |
| | | plugins: |
| | | get_weather: |
| | | api_key: "ä½ çåé£å¤©æ°APIå¯é¥" |
| | | api_host: "ä½ çåé£å¤©æ°API主æºå°å" |
| | | default_location: "ä½ çé»è®¤æ¥è¯¢åå¸" |
| | | ``` |
| | | |
| New file |
| | |
| | | # èç½æç´¢æä»¶ä½¿ç¨æå |
| | | |
| | | ## åè½ç®ä» |
| | | |
| | | èç½æç´¢æä»¶ `web_search` æ¯æå¨å¯¹è¯è¿ç¨ä¸å®æ¶èç½æç´¢ä¿¡æ¯å¹¶è¿åç»æãæä»¶æ¯æä¸¤ä¸ªæç´¢æºï¼ç§å¡ï¼Metasoï¼åTavilyï¼ç¨æ·å¯æ ¹æ®éè¦éæ©å
¶ä¸ä¸ä¸ªã |
| | | |
| | | ## API Keyç³è¯·æå |
| | | |
| | | ç®åæä»¬éé
äº`ç§å¡æç´¢`å`Tavilyæç´¢`ã |
| | | - Tavilyæç´¢ï¼æ¯ä¸ªæ1000次å
è´¹é¢åº¦ã |
| | | - ç§å¡æç´¢ï¼æ¥æè¾ä¸ºä¼è´¨çå½å
æ°æ®æºã |
| | | |
| | | ## API Keyç³è¯·æå |
| | | |
| | | ### æ¹å¼ä¸ï¼ä½¿ç¨ç§å¡æç´¢ |
| | | |
| | | - è®¿é® [ç§å¡æç´¢API](https://metaso.cn/search-api/api-keys)ï¼æ³¨åå¹¶ç»å½è´¦å· |
| | | - å¨APIå¯é¥ç®¡ç页é¢ï¼ç¹å»"å建æ°çKey" |
| | | - å¤å¶çæçAPI Keyï¼ä»¥ `mk-` 为åç¼ï¼ï¼è¿æ¯é
ç½®æéçå
³é®ä¿¡æ¯ |
| | | |
| | | ### æ¹å¼äºï¼ä½¿ç¨Tavilyæç´¢ |
| | | |
| | | - è®¿é® [Tavilyæ§å¶å°](https://app.tavily.com/home)ï¼æ³¨åå¹¶ç»å½è´¦å· |
| | | - 卿§å¶å°ä¸å建API Key |
| | | - å¤å¶çæçAPI Keyï¼ä»¥ `tvly-` 为åç¼ï¼ï¼è¿æ¯é
ç½®æéçå
³é®ä¿¡æ¯ |
| | | |
| | | ## é
ç½®æ¹å¼ |
| | | |
| | | ### æ¹å¼1. ä½¿ç¨æºæ§å°é¨ç½²ï¼æ¨èï¼ |
| | | |
| | | - ç»å½æºæ§å° |
| | | - è¿å
¥"é
ç½®è§è²"页é¢ï¼éæ©è¦é
ç½®çæºè½ä½ |
| | | - ç¹å»"ç¼è¾åè½"æé®ï¼å¨å³ä¾§åæ°é
ç½®åºåæ¾å°"èç½æç´¢"æä»¶ |
| | | - å¾é"èç½æç´¢" |
| | | - å¡«å
¥æç´¢æºï¼`metaso`æ`tavily`ï¼ï¼å¹¶å°å¯¹åºç`API Key`å¡«å
¥é
置项 |
| | | - ä¿åé
ç½®ï¼åä¿åæºè½ä½é
ç½® |
| | | |
| | | ### æ¹å¼2. 忍¡åxiaozhi-serveré¨ç½² |
| | | |
| | | å¨ `data/.config.yaml` ä¸é
ç½®ï¼ |
| | | |
| | | - å°æç´¢æºå¡«å
¥ `provider`ï¼å¯éå¼ä¸º `metaso` æ `tavily` |
| | | - å°ç³è¯·å°çAPI Keyå¡«å
¥ `api_key` |
| | | |
| | | ```yaml |
| | | plugins: |
| | | web_search: |
| | | provider: "metaso" |
| | | api_key: "ä½ çAPI Key" |
| | | ``` |
| | | |
| | | å¦éèªå®ä¹è¿åç»ææ°éåå·¥å
·æè¿°ï¼å¯é¢å¤é
ç½® `max_results` å `description`ï¼ |
| | | |
| | | ```yaml |
| | | plugins: |
| | | web_search: |
| | | provider: "metaso" |
| | | description: "èç½æç´¢å·¥å
·ãå½ç¨æ·æç¡®éè¦èç½æç´¢é®é¢æ¶ä½¿ç¨æ¤å·¥å
·ã" |
| | | max_results: 5 |
| | | api_key: "ä½ çAPI Key" |
| | | ``` |
| | | |
| | | åæ¶å¨ `functions` å表ä¸ç¡®ä¿å·²å¯ç¨ `web_search`ï¼ |
| | | |
| | | ```yaml |
| | | plugins: |
| | | functions: |
| | | - web_search |
| | | ``` |
| | | |
| | | é
ç½®å®æåé坿å¡å³å¯çæã |
| New file |
| | |
| | | # ææ¯ææ¡£ï¼`xiaozhi-esp32-server` |
| | | |
| | | **ç®å½ï¼** |
| | | |
| | | 1. [å¼è¨](#1-å¼è¨) |
| | | 2. [æ´ä½æ¶æ](#2-æ´ä½æ¶æ) |
| | | 3. [æ ¸å¿ç»ä»¶æ·±åº¦åæ](#3-æ ¸å¿ç»ä»¶æ·±åº¦åæ) |
| | | * [3.1. `xiaozhi-server` (æ ¸å¿AI弿 - Pythonå®ç°)](#31-xiaozhi-server-æ ¸å¿ai弿---pythonå®ç°) |
| | | * [3.2. `manager-api` (管çå端 - Java Spring Bootå®ç°)](#32-manager-api-管çå端---java-spring-bootå®ç°) |
| | | * [3.3. `manager-web` (Web管çå端 - Vue.jså®ç°)](#33-manager-web-web管çå端---vuejså®ç°) |
| | | * [3.4. `manager-mobile` (ç§»å¨ç®¡ç端 - uni-app+Vue3å®ç°)](#34-manager-mobile-ç§»å¨ç®¡ç端---uni-appvue3å®ç°) |
| | | * [3.5. `digital-human` (æ°å人æµè¯æ¨¡å - Python+Webå®ç°)](#35-digital-human-æ°å人æµè¯æ¨¡å---pythonwebå®ç°) |
| | | 4. [æ°æ®æµä¸äº¤äºæºå¶](#4-æ°æ®æµä¸äº¤äºæºå¶) |
| | | 5. [æ ¸å¿åè½æ¦è¦](#5-æ ¸å¿åè½æ¦è¦) |
| | | 6. [é¨ç½²ä¸é
ç½®æ¦è¿°](#6-é¨ç½²ä¸é
ç½®æ¦è¿°) |
| | | --- |
| | | |
| | | ## 1. å¼è¨ |
| | | |
| | | `xiaozhi-esp32-server` é¡¹ç®æ¯ä¸ä¸ªä¸ä¸ºåºäºESP32çæºè½ç¡¬ä»¶æä¾æ¯æç**ç»¼åæ§å端系ç»**ãå
¶æ ¸å¿ç®æ æ¯ä½¿å¼å人åè½å¤å¿«éæå»ºä¸ä¸ªå¼ºå¤§çæå¡å¨åºç¡è®¾æ½ï¼è¯¥è®¾æ½ä¸ä»
è½å¤çè§£èªç¶è¯è¨æä»¤ï¼è¿è½ä¸å¤ç§AIæå¡ï¼ç¨äºè¯é³è¯å«ãèªç¶è¯è¨çè§£åè¯é³åæï¼è¿è¡é«æäº¤äºã管çç©èç½ï¼IoTï¼è®¾å¤ï¼å¹¶æä¾ä¸ä¸ªåºäºWebçç¨æ·çé¢ä»¥è¿è¡ç³»ç»é
ç½®å管çãéè¿å°å¤ç§å°ç«¯ææ¯æ´åå°ä¸ä¸ªé«å
èä¸å¯æ©å±çå¹³å°ä¸ï¼æ¬é¡¹ç®æ¨å¨ç®ååå éå¯å®å¶åè¯é³å©æåæºè½æ§å¶ç³»ç»çå¼åè¿ç¨ãå®ä¸ä»
ä»
æ¯ä¸ä¸ªç®åçæå¡å¨ï¼æ´æ¯ä¸ä¸ªè¿æ¥ç¡¬ä»¶ãAIè½åä¸ç¨æ·ç®¡ççæ¡¥æ¢ã |
| | | |
| | | --- |
| | | |
| | | ## 2. æ´ä½æ¶æ |
| | | |
| | | `xiaozhi-esp32-server` ç³»ç»éç¨äºä¸ç§**åå¸å¼ãå¤ç»ä»¶åä½**çæ¶æè®¾è®¡ï¼ç¡®ä¿äºç³»ç»ç模ååãå¯ç»´æ¤æ§å坿©å±æ§ãåä¸ªæ ¸å¿ç»ä»¶åå¸å
¶èï¼ååå·¥ä½ã主è¦ç»ä»¶å
æ¬ï¼ |
| | | |
| | | 1. **ESP32 硬件 (客æ·ç«¯è®¾å¤):** |
| | | è¿æ¯ç»ç«¯ç¨æ·ç´æ¥ä¸ä¹äº¤äºçç©çæºè½ç¡¬ä»¶è®¾å¤ãå
¶ä¸»è¦èè´£å
æ¬ï¼ |
| | | * ææç¨æ·çè¯é³æä»¤ã |
| | | * å°ææå°çåå§é³é¢æ°æ®å®å
¨å°åéè³ `xiaozhi-server` è¿è¡å¤çã |
| | | * æ¥æ¶æ¥èª `xiaozhi-server` åæçè¯é³åå¤ï¼å¹¶éè¿æ¬å£°å¨ææ¾ç»ç¨æ·ã |
| | | * æ ¹æ®ä» `xiaozhi-server` æ¶å°çæä»¤ï¼æ§å¶ä¸ä¹è¿æ¥çå
¶ä»å¤å´è®¾å¤æIoT设å¤ï¼ä¾å¦æºè½ç¯æ³¡ãä¼ æå¨çï¼ã |
| | | |
| | | 2. **`xiaozhi-server` (æ ¸å¿AI弿 - Pythonå®ç°):** |
| | | è¿ä¸ªåºäºPythonçæå¡å¨æ¯æ´ä¸ªç³»ç»çâ大èâï¼è´è´£å¤çææè¯é³ç¸å
³çé»è¾åAI交äºãå
¶å
³é®èè´£ç»åå¦ä¸ï¼ |
| | | * éè¿WebSocketåè®®ä¸ESP32设å¤å»ºç«**稳å®ãä½å»¶è¿ç宿¶ååéä¿¡é¾è·¯**ã |
| | | * æ¥æ¶æ¥èªESP32çé³é¢æµï¼å¹¶å©ç¨è¯é³æ´»å¨æ£æµï¼VADï¼ææ¯ç²¾ç¡®ååææçè¯é³ç段ã |
| | | * éæå¹¶è°ç¨èªå¨è¯é³è¯å«ï¼ASRï¼æå¡ï¼å¯é
ç½®æ¬å°æäºç«¯ï¼ï¼å°è¯é³ç段转æ¢ä¸ºææ¬ã |
| | | * éè¿ä¸å¤§åè¯è¨æ¨¡åï¼LLMï¼çäº¤äºæ¥è§£æç¨æ·æå¾ãçææºè½åå¤ï¼å¹¶æ¯æå¤æçèªç¶è¯è¨ç解任å¡ã |
| | | * 管çå¤è½®å¯¹è¯ä¸çä¸ä¸æä¿¡æ¯åç¨æ·è®°å¿ï¼ä»¥æä¾è¿è´¯ç交äºä½éªã |
| | | * è°ç¨ææ¬è½¬è¯é³ï¼TTSï¼æå¡ï¼å°LLMçæçææ¬åå¤åæä¸ºèªç¶æµç
çè¯é³ã |
| | | * éè¿ä¸ä¸ªçµæ´»ç**æä»¶ç³»ç»**æ§è¡èªå®ä¹å½ä»¤ï¼å
æ¬å¯¹IoT设å¤çæ§å¶é»è¾ã |
| | | * ä» `manager-api` æå¡è·åå
¶è¯¦ç»çè¿è¡æ¶æä½é
ç½®ã |
| | | |
| | | 3. **`manager-api` (管çå端 - Javaå®ç°):** |
| | | è¿æ¯ä¸ä¸ªåºäºJava Spring Bootæ¡æ¶æå»ºçåºç¨ç¨åºï¼å®ä¸ºæ´ä¸ªç³»ç»ç管çåé
ç½®æä¾äºä¸å¥å®å
¨çRESTful APIãå®ä¸ä»
æ¯ `manager-web` æ§å¶å°çåç«¯æ¯æï¼ä¹æ¯ `xiaozhi-server` çé
ç½®æ°æ®æ¥æºãå
¶æ ¸å¿åè½å
æ¬ï¼ |
| | | * 为Webæ§å¶å°æä¾ç¨æ·è®¤è¯ï¼ç»å½ãæééªè¯ï¼åç¨æ·è´¦æ·ç®¡çåè½ã |
| | | * ESP32设å¤ç注åãä¿¡æ¯ç®¡ç以å设å¤ç¹å®é
ç½®çç»´æ¤ã |
| | | * å¨**MySQLæ°æ®åº**䏿ä¹
ååå¨ç³»ç»é
ç½®ï¼ä¾å¦ç¨æ·éæ©çAIæå¡æä¾åãAPIå¯é¥ã设å¤åæ°ãæä»¶è®¾ç½®çã |
| | | * æä¾ç¹å®çAPI端ç¹ï¼ä¾ `xiaozhi-server` æåå
¶æéçææ°é
ç½®ã |
| | | * 管çTTSé³è²é项ãå¤çOTAï¼Over-The-Airï¼åºä»¶æ´æ°æµç¨åç¸å
³å
æ°æ®ã |
| | | * å©ç¨ **Redis** ä½ä¸ºé«éç¼åï¼åå¨çç¹æ°æ®ï¼å¦ä¼è¯ä¿¡æ¯ãé¢ç¹è®¿é®çé
ç½®ï¼ï¼ä»¥æåAPIååºé度åç³»ç»æ´ä½æ§è½ã |
| | | |
| | | 4. **`manager-web` (Webæ§å¶é¢æ¿ - Vue.jså®ç°):** |
| | | è¿æ¯ä¸ä¸ªåºäºVue.jsæå»ºçå页åºç¨ï¼SPAï¼ï¼ä¸ºç³»ç»ç®¡çåæä¾äºä¸ä¸ªå¾å½¢åãç¨æ·å好çæä½çé¢ãå
¶ä¸»è¦è½åå
æ¬ï¼ |
| | | * 便æ·å°é
ç½® `xiaozhi-server` æä½¿ç¨çå项AIæå¡ï¼å¦ASRãLLMãTTSçæä¾å忢ãåæ°è°æ´ï¼ã |
| | | * 管çå¹³å°ç¨æ·è´¦æ·ãè§è²åé
åæéæ§å¶ã |
| | | * 管ç已注åçESP32设å¤åå
¶ç¸å
³è®¾ç½®ã |
| | | * ï¼æ½å¨åè½ï¼çæ§ç³»ç»è¿è¡ç¶æãæ¥çæ¥å¿ãè¿è¡æ
éææ¥çã |
| | | * ä¸ `manager-api` æä¾çææå端管çåè½è¿è¡å
¨é¢ç交äºã |
| | | |
| | | 5. **`manager-mobile` (æºæ§å°ç§»å¨ç - uni-appå®ç°):** |
| | | è¿æ¯ä¸ä¸ªåºäºuni-app v3 + Vue 3 + Viteç跨端移å¨ç®¡çç«¯ï¼æ¯æAppï¼Android & iOSï¼å微信å°ç¨åºãå
¶ä¸»è¦è½åå
æ¬ï¼ |
| | | * æä¾ç§»å¨è®¾å¤ä¸ç便æ·ç®¡ççé¢ï¼ä¸manager-webåè½ç±»ä¼¼ä½é对移å¨ç«¯è¿è¡äºä¼åã |
| | | * æ¯æç¨æ·ç»å½ã设å¤ç®¡çãAIæå¡é
ç½®çæ ¸å¿åè½ã |
| | | * 跨平å°éé
ï¼ä¸å¥ä»£ç å¯åæ¶è¿è¡å¨iOSãAndroidå微信å°ç¨åºä¸ã |
| | | * åºäºalova + @alova/adapter-uniappå®ç°ç½ç»è¯·æ±ï¼ä¸manager-apiæ ç¼éæã |
| | | * 使ç¨piniaè¿è¡ç¶æç®¡çï¼ç¡®ä¿æ°æ®ä¸è´æ§ã |
| | | |
| | | 6. **`digital-human` (æ°å人æµè¯æ¨¡å - Python+Webå®ç°):** |
| | | è¿æ¯ä¸ä¸ªç¬ç«çæ°å人æµè¯æ¨¡åï¼æä¾æ¬å°æµè¯é¡µé¢ãå端交äºèµæºãå¤éè¯è¿è¡æ¶ä¸äºä»¶æ¡¥è½åï¼ç¨äºèè°æ´ä¸ªæ°å人交äºé¾è·¯ãå
¶ä¸»è¦è½åå
æ¬ï¼ |
| | | * æä¾æµè§å¨ç«¯çæ°å人æµè¯é¡µé¢ï¼ç¨äºéªè¯é³é¢ææ¾ãæ¥æ¶åäº¤äºæµç¨ã |
| | | * éææ¬å°å¤éè¯è¿è¡æ¶ï¼æ¯æåºäºSherpa-ONNXçå
³é®è¯æ£æµã |
| | | * éè¿äºä»¶æ¡¥å°é¡µé¢ç¶æä¸æ¬å°è¿è¡æ¶æéï¼ä¾¿äºè°è¯å¤éè¯è§¦åä¸äº¤äºææã |
| | | * ä½ä¸ºç¬ç«æ¨¡åä¸`xiaozhi-server`ã`manager-web`ã`manager-api`å¹¶åï¼ä¾¿äºåç¬å¼ååé¨ç½²ã |
| | | |
| | | **é«å±äº¤äºæµç¨æ¦è¿°:** |
| | | |
| | | * **è¯é³äº¤äºä¸»çº¿:** **ESP32设å¤**ææå°ç¨æ·è¯é³åï¼éè¿**WebSocket**å°é³é¢æ°æ®å®æ¶ä¼ è¾ç»**`xiaozhi-server`**ã`xiaozhi-server`宿ä¸ç³»åAIå¤çï¼VADãASRãLLM交äºãTTSï¼åï¼åéè¿WebSocketå°åæçè¯é³åå¤åéåESP32设å¤è¿è¡ææ¾ãææä¸è¯é³ç´æ¥ç¸å
³ç宿¶äº¤äºå卿¤é¾è·¯å®æã |
| | | * **管çé
置主线:** 管çåéè¿æµè§å¨è®¿é®**`manager-web`**æ§å¶å°ã`manager-web`éè¿è°ç¨**`manager-api`**æä¾ç**RESTful HTTPæ¥å£**æ¥æ§è¡åç§ç®¡çæä½ï¼å¦ä¿®æ¹é
ç½®ã管çç¨æ·æè®¾å¤ï¼ãæ°æ®ä»¥JSONæ ¼å¼å¨ä¸¤è
é´ä¼ éã |
| | | * **é
ç½®åæ¥:** **`xiaozhi-server`**å¨å¯å¨æç¹å®æ´æ°æºå¶è§¦åæ¶ï¼ä¼ä¸»å¨éè¿HTTP请æ±ä»**`manager-api`**æåå
¶ææ°çæä½é
ç½®ãè¿ç¡®ä¿äºç®¡çåå¨Webçé¢ä¸æåçé
ç½®æ´æ¹è½å¤åæ¶ææå°åºç¨å°æ ¸å¿AI弿çè¿è¡ä¸ã |
| | | |
| | | è¿ç§**åå端åç¦»ãæ ¸å¿æå¡ä¸ç®¡çæå¡å离**çæ¶æè®¾è®¡ï¼ä½¿å¾ `xiaozhi-server`è½å¤ä¸æ³¨äºé«æç宿¶AIå¤çä»»å¡ï¼è `manager-api` å `manager-web` åå
±åæä¾äºä¸ä¸ªåè½å¼ºå¤§ä¸æäºä½¿ç¨ç管çåé
置平å°ãåç»ä»¶èè´£æ¸
æ°ï¼æå©äºç¬ç«å¼åãæµè¯ãé¨ç½²åæ©å±ã |
| | | |
| | | ``` |
| | | xiaozhi-esp32-server |
| | | ââ xiaozhi-server 8000 ç«¯å£ Pythonè¯è¨å¼å è´è´£ä¸esp32éä¿¡ |
| | | ââ manager-web 8001 ç«¯å£ Node.js+Vueå¼å è´è´£æä¾æ§å¶å°çwebçé¢ |
| | | ââ manager-api 8002 ç«¯å£ Javaè¯è¨å¼å è´è´£æä¾æ§å¶å°çapi |
| | | ââ manager-mobile 跨平å°ç§»å¨åºç¨ uni-app+Vue3å¼å è´è´£æä¾ç§»å¨çæºæ§å°ç®¡ç |
| | | ââ digital-human æ°å人æµè¯æ¨¡å Python+Webå®ç° è´è´£æ¬å°æµè¯é¡µé¢ãå¤éè¯è¿è¡æ¶ä¸äºä»¶æ¡¥ |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ## 3. æ ¸å¿ç»ä»¶æ·±åº¦åæ |
| | | |
| | | ### 3.1. `xiaozhi-server` (æ ¸å¿AI弿 - Pythonå®ç°) |
| | | |
| | | `xiaozhi-server` ä½ä¸ºç³»ç»çæºè½æ ¸å¿ï¼å
¨æè´è´£å¤çè¯é³äº¤äºã对æ¥åç±»AIæå¡ä»¥å管çä¸ESP32设å¤é´çéä¿¡ãå
¶è®¾è®¡ç®æ æ¯å®ç°é«æãçµæ´»ä¸å¯æ©å±çè¯é³AIå¤çè½åã |
| | | |
| | | * **æ ¸å¿ç®æ :** |
| | | * 为ESP32è®¾å¤æä¾å®æ¶çè¯é³æä»¤å¤çæå¡ã |
| | | * 深度éæåç±»AIæå¡ï¼å
æ¬ï¼èªå¨è¯é³è¯å« (ASR)ã大åè¯è¨æ¨¡å (LLM) è¿è¡èªç¶è¯è¨çè§£ (NLU)ãææ¬è½¬è¯é³ (TTS)ãè¯é³æ´»å¨æ£æµ (VAD)ãæå¾è¯å« (Intent Recognition) å对è¯è®°å¿ (Memory)ã |
| | | * ç²¾ç»ç®¡çç¨æ·ä¸è®¾å¤é´çå¯¹è¯æµç¨åä¸ä¸æç¶æã |
| | | * åºäºç¨æ·æä»¤ï¼éè¿æä»¶åæºå¶æ§è¡èªå®ä¹å½æ°åæ§å¶ç©èç½ (IoT) 设å¤ã |
| | | * æ¯æéè¿ `manager-api`è¿è¡å¨æé
ç½®å è½½ä¸æ´æ°ã |
| | | |
| | | * **æ ¸å¿ææ¯æ :** |
| | | * **Python 3:** ä½ä¸ºä¸»è¦ç¼ç¨è¯è¨ï¼Python以å
¶ä¸°å¯çAI/MLçæåºåå¿«éå¼åç¹æ§è¢«éç¨ã |
| | | * **Asyncio:** Pythonç弿¥ç¼ç¨æ¡æ¶ï¼æ¯`xiaozhi-server`髿§è½çå
³é®ãå®è¢«å¹¿æ³ç¨äºé«æå¤çæ¥èªå¤§éESP32设å¤çå¹¶åWebSocketè¿æ¥ï¼ä»¥åæ§è¡ä¸å¤é¨AIæå¡APIéä¿¡æ¶çéé»å¡I/Oæä½ï¼ç¡®ä¿æå¡å¨å¨é«å¹¶åä¸çååºè½åã |
| | | * **`websockets` åº:** æä¾WebSocketæå¡å¨çå
·ä½å®ç°ï¼æ¯æä¸ESP32客æ·ç«¯è¿è¡å
¨å工宿¶éä¿¡ã |
| | | * **HTTP客æ·ç«¯ (å¦ `aiohttp`, `httpx`):** ç¨äºå¼æ¥æ§è¡HTTP请æ±ï¼ä¸»è¦ç®çæ¯ä»`manager-api`è·åé
置信æ¯ï¼ä»¥åä¸äºç«¯AIæå¡çAPIè¿è¡äº¤äºã |
| | | * **YAML (é常éè¿ PyYAML åº):** ç¨äºè§£ææ¬å°ç `config.yaml` é
ç½®æä»¶ã |
| | | * **FFmpeg (å¤é¨ä¾èµ):** å¨ `app.py` å¯å¨æ¶ä¼è¿è¡æ£æ¥ (`check_ffmpeg_installed()`)ãFFmpegé常ç¨äºé³é¢å¤çåæ ¼å¼è½¬æ¢ï¼ä¾å¦ï¼ç¡®ä¿é³é¢æ°æ®ç¬¦åç¹å®AIæå¡çè¦æ±æè¿è¡å
é¨å¤çã |
| | | |
| | | * **å
³é®å®ç°ç»è:** |
| | | |
| | | 1. **AIæå¡æä¾è
æ¨¡å¼ (Provider Pattern - `core/providers/`):** |
| | | * **è®¾è®¡ææ³:** è¿æ¯`xiaozhi-server`éæä¸åAIæå¡çæ ¸å¿è®¾è®¡æ¨¡å¼ï¼æå¤§å°å¢å¼ºäºç³»ç»ççµæ´»æ§å坿©å±æ§ãé对æ¯ä¸ç§AIæå¡ç±»åï¼ASR, TTS, LLM, VAD, Intent, Memory, VLLMï¼ï¼é½å¨å
¶å¯¹åºåç®å½ä¸å®ä¹äºä¸ä¸ªæ½è±¡åºç±» (ABC, Abstract Base Class)ï¼ä¾å¦ `core/providers/asr/base.py`ãè¿ä¸ªåºç±»è§å®äºè¯¥ç±»åæå¡å¿
é¡»å®ç°çéç¨æ¥å£æ¹æ³ï¼å¦ASRç `async def transcribe(self, audio_chunk: bytes) -> str: pass`ï¼ã |
| | | * **å
·ä½å®ç°:** åç§å
·ä½çAIæå¡æä¾åææ¬å°æ¨¡åçå®ç°ï¼å以ç¬ç«çPython类形å¼åå¨ï¼ä¾å¦ `core/providers/asr/fun_local.py` å®ç°äºæ¬å°FunASRçé»è¾ï¼`core/providers/llm/openai.py` å®ç°äºä¸OpenAI GPT模åç对æ¥ï¼ãè¿äºå
·ä½ç±»ç»§æ¿èªç¸åºçæ½è±¡åºç±»ï¼å¹¶å®ç°å
¶å®ä¹çæ¥å£ãé¨åæä¾è
è¿ä½¿ç¨DTOs (Data Transfer Objects, åå¨äºåèªç `dto/` ç®å½) æ¥ç»æåä¸å¤é¨æå¡äº¤æ¢çæ°æ®ã |
| | | * **ä¼å¿:** ä½¿å¾æ ¸å¿ä¸å¡é»è¾è½å¤ä»¥ç»ä¸çæ¹å¼è°ç¨ä¸åçAIæå¡ï¼èæ éå
³å¿å
¶åºå±å
·ä½å®ç°ãç¨æ·å¯ä»¥éè¿é
ç½®æä»¶è½»æ¾åæ¢AIæå¡åç«¯ãæ·»å 对æ°AIæå¡çæ¯æä¹åå¾ç¸å¯¹ç®åï¼åªéå®ç°å¯¹åºçProvideræ¥å£ã |
| | | * **卿å è½½ä¸åå§å:** `core/utils/modules_initialize.py` èæ¬æ®æ¼äºå·¥åçè§è²ãå®å¨æå¡å¨å¯å¨æ¶ï¼æå¨æ¥æ¶å°é
ç½®æ´æ°æä»¤æ¶ï¼ä¼æ ¹æ®é
ç½®æä»¶ä¸ `selected_module` åå项æå¡çå
·ä½provider设置ï¼å¨æå°å¯¼å
¥å¹¶å®ä¾åç¸åºçProviderç±»ã |
| | | |
| | | 2. **WebSocketéä¿¡ä¸è¿æ¥å¤ç (`app.py`, `core/websocket_server.py`, `core/connection.py`):** |
| | | * **æå¡å¨å¯å¨ä¸å
¥å£ (`app.py`):** |
| | | * `app.py` ä½ä¸ºä¸»å
¥å£ï¼è´è´£åå§ååºç¨ç¯å¢ï¼å¦æ£æ¥FFmpegãå è½½é
ç½®ã设置æ¥å¿ï¼ã |
| | | * å®ä¼çææå è½½ä¸ä¸ª `auth_key` (JWTå¯é¥)ï¼ç¨äºä¿æ¤ç¹å®çHTTPæ¥å£ï¼å¦è§è§åææ¥å£ `/mcp/vision/explain`ï¼ãè¥é
ç½®ä¸ `manager-api.secret` 为空ï¼åä¼çæä¸ä¸ªUUIDä½ä¸º `auth_key`ã |
| | | * ä½¿ç¨ `asyncio.create_task()` å¹¶åå¯å¨ `WebSocketServer` (çå¬å¦ `ws://0.0.0.0:8000/xiaozhi/v1/`) å `SimpleHttpServer` (çå¬å¦ `http://0.0.0.0:8003/xiaozhi/ota/`)ã |
| | | * å
å«ä¸ä¸ª `monitor_stdin()` åç¨ï¼ç¨äºå¨æäºç¯å¢ä¸ä¿æåºç¨åæ´»æå¤çç»ç«¯è¾å
¥ã |
| | | * **WebSocketæå¡å¨æ ¸å¿ (`core/websocket_server.py`):** |
| | | * `WebSocketServer` ç±»ä½¿ç¨ `websockets` åºç嬿¥èªESP32设å¤çè¿æ¥è¯·æ±ã |
| | | * å¯¹äºæ¯ä¸ä¸ªæåçWebSocketè¿æ¥ï¼å®é½ä¼å建ä¸ä¸ª**ç¬ç«ç `ConnectionHandler` å®ä¾** (æ¨æµå®ä¹äº `core/connection.py`)ãè¿ç§æ¯ä¸ªè¿æ¥ä¸ä¸ªå¤çç¨åºå®ä¾ç设计模å¼ï¼æ¯å®ç°å¤è®¾å¤ç¶æé离åå¹¶åå¤ççå
³é®ï¼ç¡®ä¿æ¯ä¸ªè®¾å¤çå¯¹è¯æµç¨åä¸ä¸æä¿¡æ¯äºä¸å¹²æ°ã |
| | | * 该æå¡å¨è¿æä¾ä¸ä¸ª `_http_response` æ¹æ³ï¼å
许å¨åä¸ç«¯å£ä¸å¯¹éWebSocketå级çHTTP GET请æ±ååºç®åååºï¼ä¾å¦è¿å "Server is running"ï¼ï¼ä¾¿äºè¿è¡å¥åº·æ£æ¥ã |
| | | * **卿é
ç½®æ´æ°:** `WebSocketServer` å
å«ä¸ä¸ª `update_config()` 弿¥æ¹æ³ãæ¤æ¹æ³ä½¿ç¨ `config_lock` (ä¸ä¸ª `asyncio.Lock`) ä¿è¯é
ç½®æ´æ°çååæ§ãå®è°ç¨ `get_config_from_api()` (å¯è½å¨ `config_loader.py` ä¸å®ç°ï¼éè¿ `manage_api_client.py` ä¸ `manager-api` éä¿¡) æ¥è·åæ°çé
ç½®ãéè¿ `check_vad_update()` å `check_asr_update()` çè¾
å©å½æ°å¤ææ¯å¦éè¦éæ°åå§åç¹å®çAI模åï¼é¿å
ä¸å¿
è¦çå¼éãæ´æ°åçé
ç½®ä¼ç¨äºéæ°è°ç¨ `initialize_modules()`ï¼ä»èå®ç°AIæå¡æä¾è
çç忢ã |
| | | |
| | | 3. **æ¶æ¯å¤çä¸å¯¹è¯æµç¨æ§å¶ (`core/handle/` å `ConnectionHandler`):** |
| | | * `ConnectionHandler` (æ¨æµ) ä½ä¸ºæ¯ä¸ªè¿æ¥çæ§å¶ä¸å¿ï¼è´è´£æ¥æ¶æ¥èªESP32çæ¶æ¯ï¼å¹¶æ ¹æ®æ¶æ¯ç±»åæå½å对è¯ç¶æï¼å°å
¶ååç» `core/handle/` ç®å½ä¸çç¸åºå¤ç模åãè¿ç§æ¨¡ååçå¤çå¨è®¾è®¡ä½¿å¾ `ConnectionHandler` é»è¾æ´æ¸
æ°ï¼æäºæ©å±ã |
| | | * **主è¦å¤ç模ååå
¶èè´£:** |
| | | * `helloHandle.py`: å¤çä¸ESP32忬¡è¿æ¥æ¶çæ¡æåè®®ã设å¤è®¤è¯æåå§åä¿¡æ¯äº¤æ¢ã |
| | | * `receiveAudioHandle.py`: æ¥æ¶é³é¢æµæ°æ®ï¼è°ç¨VAD Providerè¿è¡è¯é³æ´»å¨æ£æµï¼å¹¶å°ææçé³é¢çæ®µä¼ éç»ASR Providerè¿è¡è¯å«ã |
| | | * `textHandle.py` / `intentHandler.py`: è·åASRè¯å«åºçææ¬åï¼ä¸Intent Provider (å¯è½å©ç¨LLMè¿è¡æå¾è¯å«) åLLM Provider交äºï¼ä»¥çè§£ç¨æ·æå¾å¹¶çæåæ¥å夿å³çã |
| | | * `functionHandler.py`: å½LLMçååºå
嫿§è¡ç¹å®â彿°è°ç¨âçæä»¤æ¶ï¼æ¤æ¨¡åè´è´£ä»æä»¶æ³¨åè¡¨ä¸æ¥æ¾å¹¶æ§è¡å¯¹åºçæä»¶å½æ°ã |
| | | * `sendAudioHandle.py`: å°LLMæç»çæçææ¬åå¤äº¤ç»TTS Provideråæè¯é³ï¼å¹¶å°é³é¢æµéè¿WebSocketåéåESP32ã |
| | | * `abortHandle.py`: å¤çæ¥èªESP32çä¸æè¯·æ±ï¼ä¾å¦åæ¢å½åçTTSææ¥ã |
| | | * `iotHandle.py`, `mcpHandle.py`: å¤çä¸IoTè®¾å¤æ§å¶ç¸å
³çç¹å®æä»¤ææ´å¤æç模åéä¿¡åè®® (MCP)ã |
| | | |
| | | 4. **æä»¶ååè½æ©å±ç³»ç» (`plugins_func/`):** |
| | | * **设计ç®ç:** æä¾ä¸ç§æ ååçæ¹å¼æ¥æ©å±è¯é³å©æçåè½åâæè½âï¼èæ éä¿®æ¹æ ¸å¿ä»£ç ã |
| | | * **å®ç°æºå¶:** |
| | | * å个å
·ä½åè½ä»¥ç¬ç«çPythonèæ¬å½¢å¼åå¨äº `plugins_func/functions/` ç®å½ä¸ï¼ä¾å¦ `get_weather.py`, `hass_set_state.py` ç¨äºHome Assistantéæï¼ã |
| | | * `loadplugins.py` 卿å¡å¨å¯å¨æ¶è´è´£æ«æå¹¶å è½½è¿äºæä»¶æ¨¡åã |
| | | * `register.py` (ææä»¶æ¨¡åå
é¨çç¹å®è£
饰å¨/彿°) å¯è½ç¨äºå®ä¹æ¯ä¸ªæä»¶å½æ°çå
æ°æ®ï¼å
æ¬ï¼ |
| | | * **彿°åç§° (Function Name):** LLMè°ç¨æ¶ä½¿ç¨çæ è¯ç¬¦ã |
| | | * **åè½æè¿° (Description):** ä¾LLMçè§£æ¤å½æ°çä½ç¨ã |
| | | * **åæ°æ¨¡å¼ (Parameters Schema):** é常æ¯ä¸ä¸ªJSON Schemaï¼è¯¦ç»å®ä¹äºå½æ°æéçåæ°ãç±»åãæ¯å¦å¿
é以åæè¿°ãè¿æ¯LLMè½å¤æ£ç¡®çæå½æ°è°ç¨åæ°çå
³é®ã |
| | | * **æ§è¡æµç¨:** å½LLMå¨å
¶æèè¿ç¨ä¸å³å®éè¦è°ç¨æä¸ªå¤é¨å·¥å
·æå½æ°æ¥è·åä¿¡æ¯ææ§è¡æä½æ¶ï¼å®ä¼ä¾æ®é¢å
æä¾ç彿°æ¨¡å¼çæä¸ä¸ªç»æåçâ彿°è°ç¨â请æ±ã`xiaozhi-server`ä¸ç`functionHandler.py`æè·æ¤è¯·æ±ï¼ä»æä»¶æ³¨åè¡¨ä¸æ¾å°å¯¹åºçPython彿°å¹¶æ§è¡ï¼ç¶åå°æ§è¡ç»æè¿åç»LLMï¼LLMååºäºæ¤ç»æçææç»ç»ç¨æ·çèªç¶è¯è¨åå¤ã |
| | | |
| | | 5. **é
置管ç (`config/`):** |
| | | * **å è½½æºå¶:** `config_loader.py` (éè¿ `settings.py` 被è°ç¨) è´è´£ä»æ ¹ç®å½ç `config.yaml` æä»¶å è½½åºç¡é
ç½®ã |
| | | * **è¿ç¨é
ç½®ä¸åå¹¶:** éè¿ `manage_api_client.py` (使ç¨å¦`aiohttp`çåºä¸`manager-api`éä¿¡) å¯ä»¥ä»`manager-api`æå¡æåé
ç½®ãè¿ç¨é
ç½®é常ä¼è¦çæ¬å° `config.yaml` ä¸çåå设置ï¼ä»èå®ç°éè¿Webçé¢å¨æè°æ´æå¡å¨è¡ä¸ºã |
| | | * **æ¥å¿ç³»ç»:** `logger.py` åå§ååºç¨æ¥å¿ç³»ç»ï¼å¯è½ä½¿ç¨ `loguru` æå¯¹æ å `logging` 模åè¿è¡å°è£
ï¼æ¯æéè¿ `logger.bind(tag=TAG)` æ·»å æ ç¾ï¼ä¾¿äºè¿½è¸ªåè¿æ»¤ï¼ã |
| | | * **éæèµæº:** `config/assets/` ç®å½ä¸åæ¾äºç¨äºç³»ç»æç¤ºé³çéæé³é¢æä»¶ï¼å¦è®¾å¤ç»å®æç¤ºé³ `bind_code.wav`ãé误æç¤ºé³çï¼ã |
| | | |
| | | 6. **è¾
å©HTTPæå¡ (`core/http_server.py`):** |
| | | * ä¸WebSocketæå¡å¹¶è¡è¿è¡ä¸ä¸ªç®åçHTTPæå¡å¨ï¼ç¨äºå¤çç¹å®çHTTP请æ±ãæä¸»è¦çåè½æ¯ä¸ºESP32è®¾å¤æä¾OTA (Over-The-Air) åºä»¶æ´æ°çä¸è½½æå¡ (éè¿ `/xiaozhi/ota/` 端ç¹)ãæ¤å¤ï¼ä¹å¯è½æ¿è½½å
¶ä»å¦ `/mcp/vision/explain` (è§è§åæ) çå·¥å
·æ§HTTPæ¥å£ã |
| | | |
| | | ç»¼ä¸æè¿°ï¼`xiaozhi-server` æ¯ä¸ä¸ªéç¨ç°ä»£Python弿¥ç¼ç¨æ¨¡åæå»ºçãé«åº¦æ¨¡ååãé
置驱å¨çAIåºç¨æå¡å¨ãå
¶ç²¾å¿è®¾è®¡çProvider模å¼åæä»¶æ¶æèµäºäºå®å¼ºå¤§çéåºæ§åæ©å±æ§ï¼è½å¤çµæ´»æ¥å
¥ä¸åçAIè½åå¹¶æ¯ææ¥çå¢é¿çåè½éæ±ã |
| | | |
| | | --- |
| | | |
| | | ### 3.2. `manager-api` (管çå端 - Java Spring Bootå®ç°) |
| | | |
| | | `manager-api` ç»ä»¶æ¯ä½¿ç¨JavaåSpring Bootæ¡æ¶æå»ºç强大å端æå¡ï¼ä½ä¸ºæ´ä¸ª`xiaozhi-esp32-server`çæç³»ç»çä¸å¤®è¡æ¿ç®¡çåé
ç½®ä¸æ¢ã |
| | | |
| | | * **æ ¸å¿ç®æ :** |
| | | * 为`manager-web`ï¼Vue.jsåç«¯ï¼æä¾ä¸å¥å®å
¨ã稳å®ã符åRESTfulè§èçAPIæ¥å£ï¼ä½¿å¾ç®¡çåè½å¤ä¾¿æ·å°ç®¡çç¨æ·ã设å¤ãç³»ç»é
ç½®åå
¶ä»ç¸å
³èµæºã |
| | | * å
å½`xiaozhi-server`ï¼Pythonæ ¸å¿AI弿ï¼çéä¸åé
ç½®æ°æ®æä¾è
ï¼å
许`xiaozhi-server`å®ä¾å¨å¯å¨æè¿è¡æ¶è·åå
¶ææ°çæä½åæ°ã |
| | | * æä¹
ååå¨å
³é®æ°æ®ï¼ä¾å¦ï¼ç¨æ·è´¦æ·ä¿¡æ¯ãè®¾å¤æ³¨å详æ
ãAIæå¡æä¾åé
ç½®ï¼å
æ¬APIå¯é¥ãéå®çæå¡æ¨¡åçï¼ãTTSé³è²åæ°ï¼ä»¥åOTAåºä»¶çæ¬ä¿¡æ¯çã |
| | | |
| | | * **æ ¸å¿ææ¯æ :** |
| | | * **Java 21:** 项ç®éç¨çJDKçæ¬ï¼ç¡®ä¿äºå¯¹ç°ä»£Javaç¹æ§çæ¯æã |
| | | * **Spring Boot 3:** ä½ä¸ºæ ¸å¿å¼åæ¡æ¶ï¼æå¤§å°ç®åäºç¬ç«ãç产级å«çSpringåºç¨çå建åé¨ç½²ã宿ä¾äºèªå¨é
ç½®ãå
åµWebæå¡å¨ï¼é»è®¤ä¸ºTomcatï¼ãä¾èµç®¡ççå
³é®åè½ã |
| | | * **Spring MVC:** Springæ¡æ¶ä¸ç¨äºæå»ºWebåºç¨åRESTful APIçæ¨¡åã |
| | | * **MyBatis-Plus:** ä¸ä¸ªå¯¹MyBatisè¿è¡åè½å¢å¼ºçORMï¼å¯¹è±¡å
³ç³»æ å°ï¼æ¡æ¶ãå®ç®åäºæ°æ®åºæä½ï¼æä¾äºå¼ºå¤§çCRUDï¼å¢å æ¹æ¥ï¼åè½ãæ¡ä»¶æé å¨ã代ç çæå¨çï¼å¹¶è½å¾å¥½å°ä¸Spring Bootéæã |
| | | * **MySQL:** ä½ä¸ºä¸»è¦çå端å
³ç³»åæ°æ®åºï¼ç¨äºå卿æéè¦æä¹
åçç®¡çæ°æ®åé
置信æ¯ã |
| | | * **Druid (Alibaba Druid):** ä¸ä¸ªåè½å¼ºå¤§çJDBCè¿æ¥æ± å®ç°ï¼æä¾äºä¸°å¯ççæ§åè½åä¼ç§çæ§è½ï¼ç¨äºé«æç®¡çæ°æ®åºè¿æ¥ã |
| | | * **Redis (éè¿ Spring Data Redis):** ä¸ä¸ªé«æ§è½çå
åæ°æ®ç»æåå¨ï¼å¸¸ç¨äºå®ç°æ°æ®ç¼åï¼ä¾å¦ç¼åçç¹é
ç½®æ°æ®ãç¨æ·ä¼è¯ä¿¡æ¯ï¼ï¼ä»¥æ¾èæåAPIçååºé度ã |
| | | * **Apache Shiro:** ä¸ä¸ªæç䏿ç¨çJavaå®å
¨æ¡æ¶ï¼è´è´£å¤çåºç¨ç认è¯ï¼ç¨æ·èº«ä»½éªè¯ï¼åææï¼APIè®¿é®æéæ§å¶ï¼éæ±ã |
| | | * **Liquibase:** ä¸ä¸ªç¨äºè·è¸ªã管çååºç¨æ°æ®åº schémaï¼æ¨¡å¼ï¼åæ´ç弿ºå·¥å
·ãå®å
许å¼åè
ä»¥æ°æ®åºæ å
³çæ¹å¼å®ä¹åçæ¬åæ°æ®åºç»æåæ´ã |
| | | * **Knife4j:** ä¸ä¸ªéæäºSwaggerå¹¶å¢å¼ºäºUIçAPIææ¡£çæå·¥å
·ï¼ä¸ä¸ºJava MVCæ¡æ¶ï¼å°¤å
¶æ¯Spring Bootï¼è®¾è®¡ãå®è½çæç¾è§ä¸æäºäº¤äºçAPIææ¡£çé¢ï¼é常éè¿ `/xiaozhi/doc.html` 访é®ï¼ã |
| | | * **Maven:** ç¨äºé¡¹ç®çæå»ºèªå¨ååä¾èµé¡¹ç®¡çã |
| | | * **Lombok:** ä¸ä¸ªJavaåºï¼éè¿æ³¨è§£èªå¨çææé 彿°ãgetter/setterãequals/hashCodeãtoStringçæ ·æ¿ä»£ç ï¼åå°åä½ã |
| | | * **HuTool / Google Guava:** æä¾å¤§éå®ç¨å·¥å
·ç±»ï¼ç®å常è§ç¼ç¨ä»»å¡ã |
| | | * **Aliyun Dysmsapi:** é¿éäºçä¿¡æå¡SDKï¼ç¨äºéæåéçä¿¡åè½ï¼å¦éªè¯ç ãéç¥ï¼ã |
| | | |
| | | * **å
³é®å®ç°ç»è:** |
| | | |
| | | 1. **模åå项ç®ç»æ (`modules/` å
):** |
| | | * `manager-api` çæ ¸å¿ä¸å¡é»è¾è¢«æ¸
æ°å°ååå° `src/main/java/xiaozhi/modules/` ç®å½ä¸çä¸å模åä¸ãè¿ç§æåè½é¢åå忍¡åçæ¹å¼ï¼ä¾å¦ `sys` è´è´£ç³»ç»ç®¡çï¼`agent` è´è´£æºè½ä½é
ç½®ï¼`device` è´è´£è®¾å¤ç®¡çï¼`config` è´è´£ä¸º`xiaozhi-server`æä¾é
ç½®ï¼`security` è´è´£å®å
¨ï¼`timbre` è´è´£é³è²ç®¡çï¼`ota` è´è´£åºä»¶åçº§ï¼æå¤§å°æé«äºä»£ç çå¯ç»´æ¤æ§å坿©å±æ§ã |
| | | * **忍¡åå
é¨ç»æ:** æ¯ä¸ªä¸å¡æ¨¡åé常éµå¾ªç»å
¸çä¸å±æ¶ææå
¶åä½ï¼ |
| | | * **Controller (æ§å¶å±):** ä½äº `xiaozhi.modules.[模åå].controller`ã |
| | | * **Service (æå¡å±):** ä½äº `xiaozhi.modules.[模åå].service`ã |
| | | * **DAO/Mapper (æ°æ®è®¿é®å±):** ä½äº `xiaozhi.modules.[模åå].dao`ã |
| | | * **Entity (å®ä½ç±»):** ä½äº `xiaozhi.modules.[模åå].entity`ã |
| | | * **DTO (æ°æ®ä¼ è¾å¯¹è±¡):** ä½äº `xiaozhi.modules.[模åå].dto`ã |
| | | |
| | | 2. **å屿¶æå®ç°:** |
| | | * **Controllerå± (`@RestController`):** è¿äºç±»ä½¿ç¨Spring MVC注解ï¼å¦ `@GetMapping`, `@PostMapping` çï¼æ¥å®ä¹APIç端ç¹(endpoints)ãå®ä»¬è´è´£æ¥æ¶HTTP请æ±ï¼å°è¯·æ±ä½ä¸çJSONæ°æ®ååºåå为DTO对象ï¼è°ç¨ç¸åºçService屿¹æ³å¤çä¸å¡é»è¾ï¼æåå°Serviceå±çè¿åç»æåºåå为JSONå¹¶ä½ä¸ºHTTPååºè¿åç»å®¢æ·ç«¯ã |
| | | * **Serviceå± (`@Service`):** è¿äºç±»ï¼éå¸¸æ¯æ¥å£åå
¶å®ç°ç±»çç»åï¼å°è£
äºæ ¸å¿çä¸å¡è§ååæä½æµç¨ãå®ä»¬å¯è½ä¼è°ç¨ä¸ä¸ªæå¤ä¸ªDAO/Mapper对象æ¥ä¸æ°æ®åºäº¤äºï¼å¹¶å¸¸å¸¸ä½¿ç¨ `@Transactional` 注解æ¥ç®¡çæ°æ®åºäºå¡çååæ§ã |
| | | * **Data Access (DAO/Mapper) å± (MyBatis-Plus Mappers):** è¿äºæ¯Javaæ¥å£ï¼ç»§æ¿èªMyBatis-Plusæä¾ç `BaseMapper<Entity>` æ¥å£ãMyBatis-Plusä¼ä¸ºè¿äºæ¥å£èªå¨æä¾æ åçCRUDæ¹æ³ãå¯¹äºæ´å¤æçæ°æ®åºæ¥è¯¢ï¼å¼åè
å¯ä»¥éè¿å¨Mapperæ¥å£ä¸å®ä¹æ¹æ³å¹¶ä½¿ç¨æ³¨è§£ï¼å¦ `@Select`, `@Update`ï¼æç¼å对åºçXMLæ å°æä»¶æ¥å®ç°ãä¾å¦ï¼`UserMapper.selectById(userId)` ä¼è¢«MyBatis-Plusèªå¨å®ç°ã |
| | | * **Entityå± (`@TableName`, `@TableId` çMyBatis-Plus注解):** è¿äºPOJOï¼Plain Old Java Objectsï¼ç±»ç´æ¥æ å°å°æ°æ®åºä¸çè¡¨ç»æãLombokç `@Data` 注解常ç¨äºèªå¨çægetter/setterçã |
| | | * **DTOå±:** ç¨äºå¨åå±ä¹é´ï¼ç¹å«æ¯Controllerå±ä¸Serviceå±ä¹é´ï¼ä»¥åAPIç请æ±/ååºä½ä¸ä¼ éæ°æ®ã使ç¨DTOæå©äºè§£è¦APIæ¥å£çæ°æ®ç»æä¸æ°æ®åºå®ä½çæ°æ®ç»æï¼ä½¿APIæ´ç¨³å®ã |
| | | |
| | | 3. **éç¨åè½ä¸é
ç½® (`common/` å
):** |
| | | * `src/main/java/xiaozhi/common/` å
æä¾äºä¸ç³»å跨模åå
±äº«çéç¨ç»ä»¶åé
ç½®ï¼ |
| | | * **åºç±»:** å¦ `BaseDao`, `BaseEntity`, `BaseService`, `CrudService`ï¼ä¸ºå模åçç¸åºç»ä»¶æä¾éç¨ç屿§ææ¹æ³ã |
| | | * **å
¨å±é
ç½®:** å
æ¬ `MybatisPlusConfig` (MyBatis-Plusçé
ç½®ï¼å¦å页æä»¶ãæ°æ®æéæä»¶ç)ã`RedisConfig` (Redisè¿æ¥ååºååé
ç½®)ã`SwaggerConfig` (Knife4jçé
ç½®)ã`AsyncConfig` (弿¥ä»»å¡æ§è¡å¨é
ç½®)ã |
| | | * **èªå®ä¹æ³¨è§£:** ä¾å¦ `@LogOperation` ç¨äºéè¿AOPè®°å½æä½æ¥å¿ï¼`@DataFilter` å¯è½ç¨äºå®ç°æ°æ®èå´è¿æ»¤ã |
| | | * **AOPåé¢:** å¦ `RedisAspect` å¯è½ç¨äºå®ç°æ¹æ³çº§å«çç¼åé»è¾ã |
| | | * **å
¨å±å¼å¸¸å¤ç:** `RenExceptionHandler` (ä½¿ç¨ `@ControllerAdvice` 注解) æè·åºç¨ä¸æåºçç¹å®æææå¼å¸¸ (å¦èªå®ä¹ç `RenException`)ï¼å¹¶è¿åç»ä¸æ ¼å¼çJSONé误ååºç»å®¢æ·ç«¯ã`ErrorCode` å®ä¹äºæ ååçé误ç ã |
| | | * **å·¥å
·ç±»:** æä¾äºæ¥æè½¬æ¢ãJSONå¤ç(Jackson)ãIPå°åè·åãHTTPä¸ä¸ææä½ãç»ä¸ç»æå°è£
(`Result` ç±»)çå¤ç§å®ç¨å·¥å
·ã |
| | | * **æ ¡éªå·¥å
·:** `ValidatorUtils` å `AssertUtils` ç¨äºç®ååæ°æ ¡éªé»è¾ã |
| | | * **XSS鲿¤:** `XssFilter` çç»ä»¶ç¨äºé²æ¢è·¨ç«èæ¬æ»å»ã |
| | | * **MyBatis-Plusèªå¨å¡«å
:** `FieldMetaObjectHandler` ç¨äºå¨æ§è¡æå
¥ææ´æ°æ°æ®åºæä½æ¶ï¼èªå¨å¡«å
å¦ `createTime`, `updateTime` çå
Œ
±å段ã |
| | | |
| | | 4. **å®å
¨æºå¶ (Apache Shiro):** |
| | | * Shiroçé
ç½®ï¼éå¸¸å¨ `modules/security/config/` æ `common/config/` ä¸ï¼å®ä¹äºå¦ä½è¿è¡ç¨æ·è®¤è¯åææã |
| | | * **Realms (å):** èªå®ä¹çShiro Realmç±»è´è´£ä»æ°æ®åºä¸æ¥è¯¢ç¨æ·ä¿¡æ¯ï¼ç¨æ·åãå¯ç ãçå¼ï¼è¿è¡èº«ä»½éªè¯ï¼ä»¥åè·åç¨æ·çè§è²åæéä¿¡æ¯ç¨äºææå³çã |
| | | * **Filters (è¿æ»¤å¨):** Shiroè¿æ»¤å¨é¾è¢«åºç¨äºä¿æ¤API端ç¹ï¼ç¡®ä¿åªæç»è¿è®¤è¯ä¸æ¥æè¶³å¤æéçç¨æ·æè½è®¿é®ç¹å®èµæºã |
| | | * **Session/Token Management:** Shiro管çç¨æ·ä¼è¯ã对äºRESTful APIï¼å¯è½ç»åOAuth2æJWTçä»¤çæºå¶å®ç°æ ç¶æè®¤è¯ã |
| | | |
| | | 5. **æ°æ®åºçæ¬æ§å¶ (Liquibase):** |
| | | * æ°æ®åºçè¡¨ç»æãç´¢å¼ãåå§æ°æ®çåæ´ï¼é½éè¿Liquibaseç `changelog` æä»¶ï¼é常æ¯XMLæ ¼å¼ï¼è¿è¡å®ä¹åçæ¬å管çãå½åºç¨å¯å¨æ¶ï¼Liquibaseä¼èªå¨æ£æ¥å¹¶åºç¨å¿
è¦çæ°æ®åºç»ææ´æ°ï¼ç¡®ä¿å¼åãæµè¯åç产ç¯å¢æ°æ®åºç»æçä¸è´æ§ã |
| | | |
| | | 6. **APIææ¡£:** |
| | | * 宿´çAPIæ¥å£ææ¡£å¯éè¿ä»¥ä¸å°å访é®: https://2662r3426b.vicp.fun/xiaozhi/doc.html |
| | | * è¯¥ææ¡£ä½¿ç¨Knife4jçæ,æä¾äºææRESTful API端ç¹ç详ç»è¯´æã请æ±/ååºç¤ºä¾ä»¥åå¨çº¿æµè¯åè½ã |
| | | |
| | | `manager-api` éè¿è¿äºç²¾å¿éæ©çææ¯å设计模å¼ï¼æå»ºäºä¸ä¸ªåè½å
¨é¢ãç»ææ¸
æ°ãå®å
¨å¯é 䏿äºç»´æ¤åæ©å±çJavaå端æå¡ãå
¶æ¨¡ååç设计ç¹å«éåå¤çå
·æå¤ç§ç®¡çåè½éæ±çå¤æç³»ç»ã |
| | | |
| | | --- |
| | | |
| | | ### 3.3. `manager-web` (Web管çå端 - Vue.jså®ç°) |
| | | |
| | | `manager-web` ç»ä»¶æ¯ä¸ä¸ªéç¨ Vue.js 2 æ¡æ¶æå»ºçå页åºç¨ (SPA - Single Page Application)ãå®ä¸ºç³»ç»ç®¡çåæä¾äºä¸ä¸ªåè½ä¸°å¯ã交äºå好çå¾å½¢ç¨æ·çé¢ï¼ç¨äºå
¨é¢ç®¡çåé
ç½® `xiaozhi-esp32-server` çæç³»ç»ã |
| | | |
| | | * **æ ¸å¿ç®æ :** |
| | | * æä¾ä¸ä¸ªåºäºWebçéä¸å¼æ§å¶é¢æ¿ï¼ä¾ç®¡çåè¿è¡ç³»ç»æä½ä¸çæ§ã |
| | | * å®ç°å¯¹ `xiaozhi-server` ä¸AIæå¡æä¾åï¼ASRãLLMãTTSçï¼åå
¶ç¸å
³APIå¯é¥æè®¸å¯é
ç½®ç便æ·ç®¡çã |
| | | * æ¯æç¨æ·è´¦æ·ãè§è²åæéçç²¾ç»å管çã |
| | | * æä¾ESP32设å¤ç注åãé
ç½®åç¶ææ¥çåè½ã |
| | | * å
许管çåèªå®ä¹TTSé³è²ã管çOTAåºä»¶æ´æ°æµç¨ãè°æ´ç³»ç»çº§åæ°ååå
¸æ°æ®çã |
| | | * ä½ä¸º `manager-api` ææ´é²å项åè½çå¾å½¢å交äºå端ã |
| | | |
| | | * **æ ¸å¿ææ¯æ :** |
| | | * **Vue.js 2:** ä¸ä¸ªæ¸è¿å¼çJavaScriptæ¡æ¶ï¼ç¨äºæå»ºç¨æ·çé¢ãå
¶æ ¸å¿ç¹æ§å
æ¬å£°æå¼æ¸²æãç»ä»¶åç³»ç»ãæ°æ®ç»å®çï¼é常éåæå»ºå¤æçSPAã |
| | | * **Vue CLI (`@vue/cli-service`):** Vue.jsç宿¹å½ä»¤è¡å·¥å
·ï¼ç¨äºé¡¹ç®çå¿«éæå»ºãå¼åæå¡å¨çè¿è¡ï¼æ¯æçæ¨¡åæ¿æ¢HMRï¼ã以åç产ç¯å¢æå»ºæå
ï¼å
é¨éæå¹¶é
ç½®äºWebpackï¼ã |
| | | * **Vue Router (`vue-router`):** Vue.js宿¹çè·¯ç±ç®¡çå¨ãå®è´è´£å¨SPAå
é¨å®ç°ä¸åâ页é¢âæè§å¾ç»ä»¶ä¹é´ç导èªåæ¢ï¼èæ ééæ°å è½½æ´ä¸ªHTML页é¢ï¼æä¾äºæµç
çç¨æ·ä½éªã |
| | | * **Vuex (`vuex`):** Vue.js宿¹çç¶æç®¡çæ¨¡å¼ååºãå®å
å½äºåºç¨ä¸ææç»ä»¶çâä¸å¤®æ°æ®åå¨âï¼ç¨äºç®¡çå
¨å±å
±äº«ç¶æï¼ä¾å¦å½åç»å½ç¨æ·ä¿¡æ¯ã设å¤å表ãåºç¨é
ç½®çï¼ï¼ç¹å«éç¨äºå¤§å夿åºç¨ã |
| | | * **Element UI (`element-ui`):** ä¸ä¸ªå¹¿å欢è¿çåºäºVue 2.0çæ¡é¢ç«¯UIç»ä»¶åºã宿ä¾äºå¤§éé¢å
设计åå®ç°çç»ä»¶ï¼å¦è¡¨åãè¡¨æ ¼ãå¯¹è¯æ¡ã导èªèåãæé®ãæç¤ºçï¼ï¼å¸®å©å¼åè
å¿«éæå»ºåºä¸ä¸ä¸ä¸è´çç¨æ·çé¢ã |
| | | * **JavaScript (ES6+):** å端é»è¾å®ç°ç主è¦ç¼ç¨è¯è¨ï¼å©ç¨å
¶ç°ä»£ç¹æ§è¿è¡å¼åã |
| | | * **SCSS (Sassy CSS):** ä¸ç§CSSé¢å¤çå¨ï¼å®ä¸ºCSSå¢å äºåéãåµå¥è§åãæ··å(Mixin)ãç»§æ¿çé«çº§ç¹æ§ï¼ä½¿å¾CSSä»£ç æ´æäºç»ç»ãç»´æ¤åå¤ç¨ã |
| | | * **HTTP客æ·ç«¯ (Flyio æ Axios éè¿ `vue-axios`):** ç¨äºå¨æµè§å¨ç«¯å `manager-api` å端åèµ·å¼æ¥HTTPï¼AJAXï¼è¯·æ±ï¼ä»¥è·åæ°æ®ææäº¤æä½ã |
| | | * **Webpack:** ä¸ä¸ªå¼ºå¤§ç模åæå
å·¥å
·ï¼ç±Vue CLIå¨åºå±ç®¡çåé
ç½®ï¼ãå®å°é¡¹ç®ä¸çåç§èµæºï¼JavaScriptæä»¶ãCSSãå¾çãåä½çï¼è§ä¸ºæ¨¡åï¼å¹¶å°å®ä»¬æå
ææµè§å¨å¯è¯å«çéææä»¶ã |
| | | * **Workbox (éè¿ `workbox-webpack-plugin`):** Googleå¼åçä¸ä¸ªåºï¼ç¨äºç®åService Workerçç¼ååPWAï¼Progressive Web App - æ¸è¿å¼Webåºç¨ï¼çå®ç°ãå®å¯ä»¥å¸®å©çæService Workerèæ¬ï¼å®ç°èµæºç¼åã离线访é®çåè½ã |
| | | * **Opusåº (`opus-decoder`, `opus-recorder`):** è¿äºé³é¢å¤çåºè¡¨æå端å¯è½å
·å¤ä¸äºç´æ¥å¨æµè§å¨ä¸å¤çOpusæ ¼å¼é³é¢çè½åï¼ä¾å¦ï¼ç¨äºæµè¯éº¦å
é£è¾å
¥ãå
许管çåå½å¶èªå®ä¹é³é¢ç段ï¼å¯è½ç¨äºTTSé³è²æ ·æ¬æè¯é³æä»¤æµè¯ï¼ï¼æææ¾å¨ç®¡ççé¢ä¸é¢è§çOpusç¼ç é³é¢ã |
| | | |
| | | * **å
³é®å®ç°ç»è:** |
| | | |
| | | 1. **å页åºç¨ (SPA) ç»æ:** |
| | | * æ´ä¸ªå端åºç¨å è½½ä¸ä¸ªä¸»HTMLæä»¶ (`public/index.html`)ãåç»çææé¡µé¢åæ¢åå
å®¹æ´æ°é½å¨å®¢æ·ç«¯ç±Vue Routerå¨æå®æï¼æ éæ¯æ¬¡é½ä»æå¡å¨è¯·æ±æ°çHTML页é¢ãè¿ç§æ¨¡å¼è½æä¾æ´å¿«ç页é¢å è½½éåº¦åæ´æµç
ç交äºä½éªã |
| | | |
| | | 2. **ç»ä»¶åæ¶æ (Component-Based Architecture):** |
| | | * ç¨æ·çé¢ç±ä¸ç³»åå¯å¤ç¨çVueç»ä»¶ (`.vue` åæä»¶ç»ä»¶) ææï¼å½¢æä¸ä¸ªç»ä»¶æ ãè¿ç§æ¹å¼æé«äºä»£ç çæ¨¡ååç¨åº¦ãå¯ç»´æ¤æ§åå¤ç¨æ§ã |
| | | * **`src/main.js`:** åºç¨çå
¥å£JSæä»¶ãå®è´è´£å建ååå§åæ ¹Vueå®ä¾ï¼æ³¨åå
¨å±æä»¶ï¼å¦Vue Router, Vuex, Element UIï¼ï¼å¹¶ææ ¹Vueå®ä¾æè½½å° `public/index.html` ä¸çæä¸ªDOMå
ç´ ä¸ï¼éå¸¸æ¯ `#app`ï¼ã |
| | | * **`src/App.vue`:** åºç¨çæ ¹ç»ä»¶ãå®é常å®ä¹äºåºç¨çåºç¡å¸å±ç»æï¼å¦å
å«å¯¼èªæ ãä¾§è¾¹æ ã主å
容åºï¼ï¼å¹¶éè¿ `<router-view></router-view>` æ ç¾æ¥æ¾ç¤ºå½åè·¯ç±å¹é
å°çè§å¾ç»ä»¶ã |
| | | * **è§å¾ç»ä»¶ (`src/views/`):** è¿äºç»ä»¶ä»£è¡¨äºåºç¨ä¸çå个â页é¢âæä¸»è¦åè½åºï¼ä¾å¦ `Login.vue` ç»å½é¡µ, `DeviceManagement.vue` 设å¤ç®¡ç页, `UserManagement.vue` ç¨æ·ç®¡ç页, `ModelConfig.vue` 模åé
置页ï¼ãå®ä»¬é常ç±Vue Routerç´æ¥æ å°ã |
| | | * **å¯å¤ç¨UIç»ä»¶ (`src/components/`):** å
å«äºå¨ä¸åè§å¾ä¹é´å
±äº«çãæ´å°ç²åº¦çUIç»ä»¶ï¼ä¾å¦ `HeaderBar.vue` é¡¶é¨å¯¼èªæ , `AddDeviceDialog.vue` æ·»å 设å¤å¯¹è¯æ¡, `AudioPlayer.vue` é³é¢ææ¾å¨ç»ä»¶ï¼ã |
| | | |
| | | 3. **客æ·ç«¯è·¯ç± (`src/router/index.js`):** |
| | | * Vue Router卿¤æä»¶ä¸è¿è¡é
ç½®ï¼å®ä¹äºåºç¨çè·¯ç±è¡¨ãæ¯ä¸ªè·¯ç±è§åå°ä¸ä¸ªç¹å®çURLè·¯å¾æ å°å°ä¸ä¸ªè§å¾ç»ä»¶ã |
| | | * 常常å
å«**导èªå®å« (Navigation Guards)**ï¼ä¾å¦ `beforeEach` å®å«ï¼ç¨äºå¨è·¯ç±è·³è½¬åæ§è¡é»è¾ï¼å¦æ£æ¥ç¨æ·æ¯å¦å·²ç»å½ï¼å¦ææªç»å½åéå®åå°ç»å½é¡µé¢ï¼ä»èä¿æ¤éè¦è®¤è¯æè½è®¿é®ç页é¢ã |
| | | |
| | | 4. **ç¶æç®¡ç (`src/store/index.js`):** |
| | | * Vuexè¢«ç¨æ¥æå»ºä¸ä¸ªéä¸çç¶æç®¡çä¸å¿ï¼Storeï¼ãè¿ä¸ªStoreå
å«äºï¼ |
| | | * **State:** åå¨åºç¨çº§å«çå
±äº«æ°æ®ï¼ä¾å¦ï¼å½åç»å½ç¨æ·ç详ç»ä¿¡æ¯ãä»APIè·åç设å¤å表ãç³»ç»é
ç½®çï¼ã |
| | | * **Getters:** 类似äºVueç»ä»¶ä¸ç计ç®å±æ§ï¼ç¨äºä»Stateæ´¾çåºä¸äºç¶æå¼ï¼æ¹ä¾¿ç»ä»¶ä½¿ç¨ã |
| | | * **Mutations:** **å¯ä¸**å¯ä»¥åæ¥ä¿®æ¹State䏿°æ®çæ¹æ³ãå®ä»¬å¿
é¡»æ¯åæ¥å½æ°ã |
| | | * **Actions:** ç¨äºå¤ç弿¥æä½ï¼å¦APIè°ç¨ï¼æå°è£
å¤ä¸ªMutationæäº¤ãActionsä¼è°ç¨APIï¼è·åæ°æ®åï¼éè¿ `commit` ä¸ä¸ªæå¤ä¸ªMutationæ¥æ´æ°Stateã |
| | | * ä¾å¦ï¼ç¨æ·ç»å½æ¶ï¼ä¸ä¸ªå为 `login` çActionå¯è½ä¼è¢«è°ç¨ï¼å®ä¼åå端APIåéç»å½è¯·æ±ï¼æååè·åå°ç¨æ·ä¿¡æ¯åtokenï¼ç¶å `commit` ä¸ä¸ªå为 `SET_USER_INFO` çMutationæ¥æ´æ°Stateä¸çç¨æ·ä¿¡æ¯åtokenã |
| | | |
| | | 5. **APIéä¿¡ (`src/apis/`):** |
| | | * ä¸ `manager-api` åç«¯çææHTTPéä¿¡é»è¾è¢«å°è£
å¨ `src/apis/` ç®å½ä¸ï¼é叏伿ç
§å端APIçæ¨¡åè¿è¡ç»ç»ï¼ä¾å¦ `src/apis/module/agent.js`, `src/apis/module/device.js`ï¼ã |
| | | * æ¯ä¸ªæ¨¡å导åºä¸ç³»å彿°ï¼æ¯ä¸ªå½æ°å¯¹åºä¸ä¸ªå
·ä½çAPI请æ±ãè¿äºå½æ°å
é¨ä½¿ç¨é
置好çHTTP客æ·ç«¯å®ä¾ (ä¾å¦ï¼å¨ `src/apis/api.js` æ `src/apis/httpRequest.js` ä¸ç»ä¸é
ç½®AxiosæFlyioå®ä¾ï¼å¯è½å
å«è®¾ç½®è¯·æ±åºå°åã请æ±/ååºæ¦æªå¨ç)ã |
| | | * **æ¦æªå¨ (Interceptors):** HTTP客æ·ç«¯çè¯·æ±æ¦æªå¨å¸¸ç¨äºå¨æ¯ä¸ªè¯·æ±åéåèªå¨æ·»å 认è¯ä»¤çï¼å¦JWTï¼ï¼ååºæ¦æªå¨åå¯ç¨äºå
¨å±å¤çAPIé误ï¼å¦æéä¸è¶³ãæå¡å¨éè¯¯ï¼æå¯¹ååºæ°æ®è¿è¡é¢å¤çã |
| | | |
| | | 6. **æ ·å¼ä¸èµæº (`src/styles/`, `src/assets/`):** |
| | | * `Element UI` æä¾äºåºç¡çç»ä»¶æ ·å¼ã |
| | | * `src/styles/global.scss` æä»¶ç¨äºå®ä¹å
¨å±å
±äº«çSCSSæ ·å¼ãåéãæ··å(Mixin)çã |
| | | * Vueåæä»¶ç»ä»¶å
é¨ç `<style scoped>` æ ç¾å
许ç¼ååªä½ç¨äºå½åç»ä»¶çå±é¨æ ·å¼ã |
| | | * `src/assets/` ç®å½åæ¾å¾çãåä½çéæèµæºã |
| | | |
| | | 7. **æå»ºä¸PWAç¹æ§:** |
| | | * Vue CLIéè¿Webpackå°ææä»£ç åèµæºæå
æä¼åçéææä»¶ï¼ç¨äºç产é¨ç½²ã |
| | | * `workbox-webpack-plugin` ç使ç¨ï¼ä½ç°å¨ `service-worker.js` å `registerServiceWorker.js` æä»¶ï¼è¡¨æé¡¹ç®éæäºService Workerææ¯ãService Workerå¯ä»¥æ¦æªç½ç»è¯·æ±ï¼å®ç°åç«¯èµæºçæºè½ç¼åï¼ä»èå å¿«åç»è®¿é®é度ï¼ï¼çè³å¨ç½ç»æå¼æ¶æä¾ä¸å®ç离线访é®è½åï¼æ¯PWAçæ ¸å¿ææ¯ä¹ä¸ã |
| | | |
| | | 8. **ç¯å¢é
ç½® (`.env`ç³»åæä»¶):** |
| | | * é¡¹ç®æ ¹ç®å½ä¸ç `.env` (以å `.env.development`, `.env.production` ç) æä»¶ç¨äºå®ä¹ç¯å¢åéãè¿äºåéï¼ä¾å¦ `VUE_APP_API_BASE_URL` æ¥æå® `manager-api` çåºç¡URLï¼å¯ä»¥å¨åºç¨ä»£ç ä¸éè¿ `process.env.VUE_APP_XXX` çå½¢å¼è®¿é®ï¼ä»èå
许为ä¸åæå»ºç¯å¢ï¼å¼åãæµè¯ãç产ï¼é
ç½®ä¸åçåæ°ã |
| | | |
| | | `manager-web` éè¿è¿äºææ¯ç综åè¿ç¨ï¼æå»ºäºä¸ä¸ªåè½å¼ºå¤§ãæäºç»´æ¤ä¸ç¨æ·ä½éªè¯å¥½ç管ççé¢ï¼ä¸º `xiaozhi-esp32-server` ç³»ç»çé
ç½®åçæ§æä¾äºåå®çåç«¯æ¯æã |
| | | |
| | | --- |
| | | |
| | | ### 3.4. `manager-mobile` (æºæ§å°ç§»å¨ç - uni-appå®ç°) |
| | | |
| | | `manager-mobile` ç»ä»¶æ¯ä¸ä¸ªåºäºuni-app v3 + Vue 3 + Viteç跨端移å¨ç®¡çç«¯ï¼æ¯æAppï¼Android & iOSï¼å微信å°ç¨åºãå®ä¸ºç³»ç»ç®¡çåæä¾äºç§»å¨ç«¯ç管ççé¢ï¼ä½¿å¾ç®¡çæä½æ´å 便æ·ã |
| | | |
| | | * **æ ¸å¿ç®æ :** |
| | | * æä¾ç§»å¨è®¾å¤ä¸ç便æ·ç®¡ççé¢ï¼ä¸manager-webåè½ç±»ä¼¼ä½é对移å¨ç«¯è¿è¡äºä¼åã |
| | | * æ¯æç¨æ·ç»å½ã设å¤ç®¡çãAIæå¡é
ç½®çæ ¸å¿åè½ã |
| | | * 跨平å°éé
ï¼ä¸å¥ä»£ç å¯åæ¶è¿è¡å¨iOSãAndroidå微信å°ç¨åºä¸ã |
| | | * 为移å¨ç¨æ·æä¾æµç
ã髿ç管çä½éªã |
| | | |
| | | * **å¹³å°å
¼å®¹æ§:** |
| | | |
| | | | H5 | iOS | Android | 微信å°ç¨åº | |
| | | | -- | --- | ------- | ---------- | |
| | | | â | â | â | â | |
| | | |
| | | * **æ ¸å¿ææ¯æ :** |
| | | * **uni-app v3:** ä¸ä¸ªä½¿ç¨Vue.jså¼åææå端åºç¨çæ¡æ¶ï¼æ¯æiOSãAndroidãH5ã以ååç§å°ç¨åºã |
| | | * **Vue 3:** ç¨äºæå»ºç¨æ·çé¢çæ¸è¿å¼æ¡æ¶ï¼æä¾äºæ´å¥½çæ§è½åæ°ç¹æ§ã |
| | | * **Vite:** ä¸ä¸ä»£å端å¼åä¸æå»ºå·¥å
·ï¼æä¾æéçå¼åä½éªã |
| | | * **pnpm:** å¿«éãèçç£ç空é´çå
管çå¨ã |
| | | * **alova:** è½»é级ãçµæ´»ç请æ±çç¥åºï¼æé
@alova/adapter-uniappéé
uni-appç¯å¢ã |
| | | * **pinia:** Vueçç¶æç®¡çåºï¼æ¿ä»£Vuexï¼æä¾æ´ç®æ´çAPI忴好çTypeScriptæ¯æã |
| | | * **UnoCSS:** å
·æé«æ§è½ä¸æå
·çµæ´»æ§ç峿¶åååCSS弿ã |
| | | * **TypeScript:** æä¾ç±»åå®å
¨çå¼åä½éªã |
| | | |
| | | * **å
³é®å®ç°ç»è:** |
| | | |
| | | 1. **è·¨å¹³å°æ¶æ:** |
| | | * åºäºuni-appæ¡æ¶ï¼å®ç°äºä¸å¥ä»£ç å¤ç«¯è¿è¡çç®æ ï¼å¤§å¹
åå°äºå¼ååç»´æ¤ææ¬ã |
| | | * é对ä¸åå¹³å°çç¹æ§åéå¶ï¼éè¿æ¡ä»¶ç¼è¯è¿è¡å¹³å°ç¹å®ç代ç å¤çã |
| | | |
| | | 2. **项ç®ç»æ:** |
| | | * **`src/App.vue`:** åºç¨çæ ¹ç»ä»¶ï¼å®ä¹äºå
¨å±çæ ·å¼åé
ç½®ã |
| | | * **`src/main.ts`:** åºç¨çå
¥å£æä»¶ï¼è´è´£åå§åVueå®ä¾ã注åæä»¶åè·¯ç±æ¦æªå¨ã |
| | | * **`src/pages/`:** åæ¾åºç¨ç页é¢ç»ä»¶ï¼å¦ç»å½é¡µã设å¤ç®¡ç页çã |
| | | * **`src/layouts/`:** å®ä¹åºç¨çå¸å±ç»ä»¶ï¼å¦é»è®¤å¸å±ã带tabbarçå¸å±çã |
| | | * **`src/api/`:** å°è£
ä¸å端APIçéä¿¡é»è¾ã |
| | | * **`src/store/`:** 使ç¨piniaè¿è¡ç¶æç®¡çã |
| | | * **`src/components/`:** åæ¾å¯å¤ç¨çç»ä»¶ã |
| | | * **`src/utils/`:** æä¾éç¨çå·¥å
·å½æ°ã |
| | | |
| | | 3. **ç½ç»è¯·æ±:** |
| | | * åºäºalova + @alova/adapter-uniappå®ç°ç½ç»è¯·æ±ï¼ç»ä¸å¤ç请æ±å¤´ã认è¯ãé误çã |
| | | * 请æ±å°ååç¯å¢é
ç½®éè¿.envæä»¶ç®¡çï¼æ¯æä¸åç¯å¢ç忢ã |
| | | |
| | | 4. **è·¯ç±ä¸é´æ:** |
| | | * 使ç¨uni-appçè·¯ç±ç³»ç»ï¼ç»åè·¯ç±æ¦æªå¨å®ç°é¡µé¢çç»å½éªè¯åæéæ§å¶ã |
| | | * æªç»å½ç¨æ·è®¿é®éè¦è®¤è¯ç页颿¶ï¼ä¼è¢«éå®åå°ç»å½é¡µã |
| | | |
| | | 5. **ç¶æç®¡ç:** |
| | | * 使ç¨pinia管çåºç¨ç¶æï¼å¦ç¨æ·ä¿¡æ¯ã设å¤å表çã |
| | | * éè¿pinia-plugin-persistedstateæä»¶å®ç°ç¶æçæä¹
ååå¨ã |
| | | |
| | | 6. **æå»ºä¸åå¸:** |
| | | * æ¯æå¤ç§æå»ºå½ä»¤ï¼å¦æå»ºå¾®ä¿¡å°ç¨åºãAndroidåiOS Appçã |
| | | * 使ç¨HBuilderXè¿è¡Appçäºæå
ï¼ç®åäºæå
æµç¨ã |
| | | |
| | | `manager-mobile` éè¿è¿äºææ¯çåºç¨ï¼ä¸ºç¨æ·æä¾äºä¸ä¸ªåè½å®å¤ãä½éªæµç
çç§»å¨ç«¯ç®¡çå·¥å
·ï¼ä½¿å¾ç®¡çåå¯ä»¥éæ¶éå°è¿è¡ç³»ç»ç®¡çåé
ç½®ã |
| | | |
| | | --- |
| | | |
| | | ### 3.5. `digital-human` (æ°å人æµè¯æ¨¡å - Python+Webå®ç°) |
| | | |
| | | `digital-human` ç»ä»¶æ¯ä¸ä¸ªç¬ç«çæ°å人æµè¯æ¨¡åï¼è´è´£æä¾æ¬å°æµè¯é¡µé¢ã页é¢èµæºãå¤éè¯è¿è¡æ¶åäºä»¶æ¡¥è½åãå®ä¸»è¦ç¨äºèè°æ´ä¸ªæ°å人交äºé¾è·¯ï¼å¸®å©å¼åè
éªè¯é¡µé¢äº¤äºãé³é¢è½å忬å°å¤éè¯æµç¨ã |
| | | |
| | | * **æ ¸å¿ç®æ :** |
| | | * æä¾ç¬ç«çæ¬å°æµè¯é¡µé¢ï¼ç¨äºéªè¯æ°åäººäº¤äºææã |
| | | * æä¾æ¬å°å¤éè¯è¿è¡æ¶ï¼æ¯æå
³é®è¯æ£æµä¸äºä»¶ä¸æ¥ã |
| | | * 为å端页é¢åæ¬å°è¿è¡æ¶æä¾äºä»¶æ¡¥ï¼æéæµè¯é¾è·¯ã |
| | | * 以ç¬ç«æ¨¡åå½¢å¼åå¨ï¼ä¾¿äºåç¬å¼åãè°è¯åé¨ç½²ã |
| | | |
| | | * **æ ¸å¿ææ¯æ :** |
| | | * **Python 3:** ä½ä¸ºæµè¯è¿è¡æ¶ç主è¦è¯è¨ï¼è´è´£å¯å¨æ¬å°æå¡ã管çå¤éè¯è¿è¡æ¶åäºä»¶æ¡¥ã |
| | | * **åçHTML/CSS/JavaScript:** ç¨äºæå»ºæ°å人æµè¯é¡µé¢ä¸äº¤äºé»è¾ã |
| | | * **Sherpa-ONNX:** ç¨äºæ¬å°å¤éè¯æ£æµã |
| | | * **ThreadingHTTPServer / WebSocketæ¡¥æ¥:** ç¨äºæ¿è½½æµè¯é¡µé¢ãå¥åº·æ£æ¥åæ¬å°äºä»¶éä¿¡ã |
| | | |
| | | * **å
³é®å®ç°ç»è:** |
| | | |
| | | 1. **模åå
¥å£ä¸é¡µé¢èµæº:** |
| | | * `start.py` æ¯æ¨¡åå¯å¨å
¥å£ï¼è´è´£åå§åæµè¯è¿è¡æ¶ã |
| | | * `index.html` æ¯æ°å人æµè¯é¡µé¢å
¥å£ã |
| | | * `js/`ã`css/`ã`images/`ã`resources/` ç®å½æä¾é¡µé¢èæ¬ãæ ·å¼åèµæºæä»¶ã |
| | | |
| | | 2. **æ¬å°æµè¯è¿è¡æ¶:** |
| | | * `wakeword_runtime/` ç®å½æ¿è½½æ¬å°å¤éè¯è¿è¡æ¶å®ç°ã |
| | | * è¿è¡æ¶è´è´£é
ç½®å è½½ãæ¥å¿åå§åãé³é¢ééãå
³é®è¯æ£æµåæå¡çå½å¨æç®¡çã |
| | | * 模åé»è®¤éè¿æ¬å°HTTPæå¡æ´é²é¡µé¢å°åãäºä»¶æ¡¥å°ååå¥åº·æ£æ¥æ¥å£ã |
| | | |
| | | 3. **å¤éè¯æ£æµé¾è·¯:** |
| | | * åºäºSherpa-ONNXå
³é®è¯æ£æµæ¨¡åï¼æ¯ææ¬å°å¤éè¯è§¦åã |
| | | * 模åæä»¶åå
³é®è¯é
ç½®ä½äº `wakeword_runtime/models/` åç¸åºé
ç½®æä»¶ä¸ã |
| | | * 页é¢ä¾§å¯ç»åäºä»¶æ¡¥è§å¯å¤éè¯æå¡ç¶æå触åç»æã |
| | | |
| | | 4. **è°è¯ä¸èè°å®ä½:** |
| | | * å¯å¨åå¯éè¿æµè§å¨è®¿é®æ¬å°é¡µé¢ï¼éªè¯é³é¢ææ¾ãæ¥æ¶å交äºé»è¾ã |
| | | * éè¿äºä»¶æ¡¥å¯ä»¥å°å¤éè¯ç¶æåæ¥å°é¡µé¢ï¼ä¾¿äºææ¥æ¬å°é¾è·¯é®é¢ã |
| | | * 详ç»ç模åä¸è½½ãè¿è¡æ¶é
ç½®å使ç¨è¯´æå·²æ´çå¨ `docs/digital-human-wakeword.md` ä¸ã |
| | | |
| | | `digital-human` çåå¨ä½¿å¾æ°å人ç¸å
³è½åå¯ä»¥è±ç¦»ä¸»æå¡ç¬ç«éªè¯ï¼éä½äºé¡µé¢è°è¯ãå¤éè¯èè°åæ¬å°ç¯å¢æå»ºçå¤æåº¦ã |
| | | |
| | | --- |
| | | |
| | | ## 4. æ°æ®æµä¸äº¤äºæºå¶ |
| | | |
| | | `xiaozhi-esp32-server` ç³»ç»éè¿åç»ä»¶é´å®ä¹æ¸
æ°çæ°æ®æµå交äºåè®®æ¥ååå·¥ä½ã主è¦çéä¿¡æ¹å¼ä¾èµäºé坹宿¶äº¤äºä¼åçWebSocketåè®®åéç¨äºå®¢æ·ç«¯-æå¡å¨è¯·æ±çRESTful APIã |
| | | |
| | | **4.1.æ ¸å¿è¯é³äº¤äºæµç¨ (ESP32è®¾å¤ <-> `xiaozhi-server`)** |
| | | |
| | | æ¤æµç¨æ¯å®æ¶çï¼ä¸»è¦éè¿WebSocketè¿è¡ä½å»¶è¿ãååçæ°æ®äº¤æ¢ã |
| | | |
| | | * **é讯åè®®ææ¡£:** |
| | | * 详ç»çé讯åè®®è¯´æææ¡£å¯éè¿ä»¥ä¸å°å访é®: https://ccnphfhqs21z.feishu.cn/wiki/M0XiwldO9iJwHikpXD5cEx71nKh |
| | | * è¯¥ææ¡£è¯¦ç»æè¿°äºESP32设å¤ä¸`xiaozhi-server`ä¹é´çWebSocketéä¿¡åè®®,å
æ¬: |
| | | * è¿æ¥å»ºç«ä¸æ¡ææµç¨ |
| | | * é³é¢æ°æ®ä¼ è¾æ ¼å¼ |
| | | * æ§å¶å½ä»¤æ ¼å¼ |
| | | * ç¶ææ¥åæ ¼å¼ |
| | | * é误å¤çæºå¶ |
| | | |
| | | * **è¿æ¥å»ºç«ä¸æ¡æ:** |
| | | * ESP32设å¤ä½ä¸ºå®¢æ·ç«¯ï¼ä¸»å¨å`xiaozhi-server`çæå®ç«¯ç¹ï¼ä¾å¦ `ws://<æå¡å¨IP>:<WebSocket端å£>/xiaozhi/v1/`ï¼åèµ·WebSocketè¿æ¥è¯·æ±ã |
| | | * `xiaozhi-server` (`core/websocket_server.py`) æ¥æ¶è¿æ¥ï¼å¹¶ä¸ºæ¯ä¸ªæåè¿æ¥çESP32设å¤å®ä¾åä¸ä¸ªç¬ç«ç`ConnectionHandler`对象æ¥ç®¡ç该ä¼è¯çæ´ä¸ªçå½å¨æã |
| | | * è¿æ¥å»ºç«åï¼å¯è½ä¼æ§è¡ä¸ä¸ªåå§æ¡ææµç¨ï¼ç±`core/handle/helloHandle.py`å¤çï¼ï¼ç¨äºäº¤æ¢è®¾å¤æ è¯ã认è¯ä¿¡æ¯ãåè®®çæ¬æåºæ¬ç¶æã |
| | | |
| | | * **é³é¢ä¸è¡ä¼ è¾ (ESP32 -> `xiaozhi-server`):** |
| | | * ç¨æ·å¯¹ESP32设å¤è®²è¯åï¼è®¾å¤ä¸ç麦å
飿æåå§é³é¢æ°æ®ï¼é常æ¯PCMæç»è¿å缩å¦Opusçæ ¼å¼ï¼ã |
| | | * ESP32å°è¿äºé³é¢æ°æ®åï¼chunksï¼ä½ä¸ºWebSocketç**äºè¿å¶æ¶æ¯ (binary messages)** 宿¶æ¨éå°`xiaozhi-server`对åºç`ConnectionHandler`ã |
| | | * æå¡å¨ç«¯ç`core/handle/receiveAudioHandle.py`模åè´è´£æ¥æ¶ãç¼å²å¹¶å¤çè¿äºé³é¢æ°æ®ã |
| | | |
| | | * **AIæ ¸å¿å¤ç (å¨`xiaozhi-server`å
é¨):** |
| | | * **VAD (è¯é³æ´»å¨æ£æµ):** `receiveAudioHandle.py`å©ç¨é
ç½®çVADæä¾è
ï¼å¦SileroVADï¼åæé³é¢æµï¼ä»¥åç¡®è¯å«è¯é³çèµ·å§åç»æç¹ï¼æ»¤é¤é黿åªå£°ç段ã |
| | | * **ASR (èªå¨è¯é³è¯å«):** æ£æµå°çææè¯é³ç段被éå¾é
ç½®çASRæä¾è
ï¼æ¬å°å¦FunASRï¼æäºç«¯æå¡ï¼ãASR弿å°é³é¢ä¿¡å·è½¬æ¢ä¸ºææ¬å符串ã |
| | | * **NLU/LLM (èªç¶è¯è¨çè§£/大åè¯è¨æ¨¡å):** ASRè¾åºçææ¬ï¼è¿åä»Memoryæä¾è
è·åçå½å对è¯ä¸ä¸æåå²ï¼ä»¥åä»`plugins_func/`å è½½çå¯ç¨å½æ°ï¼å·¥å
·ï¼çæè¿°æ¨¡å¼ï¼ä¸åè¢«ä¼ éç»é
ç½®çLLMæä¾è
ã |
| | | * **彿°è°ç¨æ§è¡ (è¥LLMå³çéè¦):** 妿LLMåæå认为éè¦è°ç¨å¤é¨å½æ°ï¼ä¾å¦æ¥è¯¢å¤©æ°ãæ§å¶å®¶çµï¼ï¼å®ä¼çæä¸ä¸ªç»æåç彿°è°ç¨è¯·æ±ã`core/handle/functionHandler.py`æ¥æ¶æ¤è¯·æ±ï¼æ¥æ¾å¹¶æ§è¡å¨`plugins_func/`ä¸å®ä¹çç¸åºPython彿°ï¼å¹¶å°å½æ°çæ§è¡ç»æè¿åç»LLMãLLMéååºäºæ¤ç»æçææç»çèªç¶è¯è¨åå¤ã |
| | | * **åå¤çæ:** LLMç»¼åææä¿¡æ¯ï¼ç¨æ·è¾å
¥ãä¸ä¸æã彿°è°ç¨ç»æçï¼çææç»çææ¬åå¤ã |
| | | * **è®°å¿æ´æ°:** å½å轮次ç交äºï¼ç¨æ·é®é¢ãLLMåå¤ãå¯è½çåè½è°ç¨ï¼ä¼è¢«Memoryæä¾è
å¤çï¼ä»¥æ´æ°å¯¹è¯åå²ï¼ä¾åç»äº¤äºä½¿ç¨ã |
| | | * **TTS (ææ¬è½¬è¯é³):** LLMçæçæç»ææ¬åå¤è¢«éå¾é
ç½®çTTSæä¾è
ï¼åè
å°ææ¬åæä¸ºè¯é³æ°æ®æµï¼ä¾å¦MP3æWAVæ ¼å¼ï¼ã |
| | | |
| | | * **é³é¢ä¸è¡ååº (`xiaozhi-server` -> ESP32):** |
| | | * ç±TTSæä¾è
åæçè¯é³æ°æ®æµï¼éè¿`core/handle/sendAudioHandle.py`模åï¼ä½ä¸ºWebSocketç**äºè¿å¶æ¶æ¯**宿¶åéåESP32设å¤ã |
| | | * ESP32è®¾å¤æ¥æ¶è¿äºé³é¢æ°æ®åå¹¶ç«å³éè¿æ¬å£°å¨ææ¾ç»ç¨æ·ã |
| | | |
| | | * **æ§å¶ä¸ç¶ææ¶æ¯ (åå):** |
| | | * é¤äºé³é¢æµï¼ESP32ä¸`xiaozhi-server`ä¹é´ä¹éè¿WebSocket交æ¢**ææ¬æ¶æ¯ (text messages)**ï¼è¿äºæ¶æ¯é常éç¨JSONæ ¼å¼å°è£
ã |
| | | * **ESP32 -> Server:** 设å¤å¯è½åéç¶ææ¥åï¼å¦ç½ç»ç¶åµã麦å
é£ç¶æï¼ãé误代ç ãæç¹å®çæ§å¶å½ä»¤ï¼ä¾å¦ç¨æ·æé®è§¦åçâ忢TTSææ¥âï¼ã |
| | | * **Server -> ESP32:** æå¡å¨å¯è½å鿧嶿令ç»è®¾å¤ï¼å¦âå¼å§çå¬âãâ忢çå¬âãè°æ´çµæåº¦ãä¸åç¹å®é
ç½®åæ°ï¼ã |
| | | * `core/handle/abortHandle.py`ï¼å¤çä¸æè¯·æ±ï¼ã`core/handle/reportHandle.py`ï¼å¤çè®¾å¤æ¥åï¼ç模åè´è´£è§£æåååºè¿äºæ§å¶/ç¶ææ¶æ¯ã |
| | | |
| | | **4.2.管çä¸é
ç½®æµç¨ (`manager-web` <-> `manager-api` <-> `xiaozhi-server`)** |
| | | |
| | | æ¤æµç¨ä¸»è¦ä¾èµäºåºäºHTTP/HTTPSçRESTful APIè¿è¡è¯·æ±-ååºå¼ç交äºã |
| | | |
| | | * **管çåUIåç«¯äº¤äº (`manager-web` -> `manager-api`):** |
| | | * å½ç®¡çåå¨`manager-web`ç颿§è¡æä½æ¶ï¼ä¾å¦ä¿åä¸é¡¹é
ç½®ãæ·»å ä¸ä¸ªæ°ç¨æ·ã注åä¸å°ESP32设å¤ï¼ï¼ |
| | | * Vue.jså端åºç¨ (`manager-web`) ä¼éè¿å
¶APIå°è£
模åï¼ä½äº`src/apis/module/`ï¼å`manager-api`ç对åºREST API端ç¹åèµ·å¼æ¥HTTP请æ±ï¼é常æ¯GET, POST, PUT, DELETEï¼ã |
| | | * 请æ±ä½åååºä½é常使ç¨JSONæ ¼å¼ã |
| | | * `manager-api`ä¸ç`@RestController`ç±»æ¥æ¶è¿äºè¯·æ±ã**Apache Shiro**æ¡æ¶ä¼é¦å
对请æ±è¿è¡è®¤è¯åæææ£æ¥ã |
| | | * éè¿éªè¯åï¼Controllerå°è¯·æ±ååç»ç¸åºçServiceå±å¤çä¸å¡é»è¾ãServiceå±å¯è½ä¼ä¸MySQLæ°æ®åºï¼éè¿MyBatis-Plusï¼äº¤äºï¼å¹¶å¯è½å©ç¨Redisè¿è¡æ°æ®ç¼åã |
| | | * å¤ç宿åï¼`manager-api`å`manager-web`è¿åä¸ä¸ªJSONæ ¼å¼çHTTPååºã |
| | | * `manager-web`æ ¹æ®ååºç»ææ´æ°å
¶Vuexç¶æåå¨åç¨æ·ç颿¾ç¤ºã |
| | | |
| | | * **é
ç½®åæ¥ (`manager-api` -> `xiaozhi-server`):** |
| | | * `xiaozhi-server`çè¿è¡ä¾èµäºä»`manager-api`è·åç卿é
ç½®ï¼ä¾å¦å½åéç¨çAIæå¡æä¾ååå
¶APIå¯é¥ï¼ã |
| | | * **æåæºå¶ (Pull Mechanism):** `xiaozhi-server`å
é¨ç`config/manage_api_client.py`模åï¼å¨æå¡å¨å¯å¨æ¶æéè¿ç¹å®æ´æ°è§¦åå¨ï¼ä¾å¦`WebSocketServer.update_config()`被è°ç¨ï¼ï¼ä¼å`manager-api`çä¸ä¸ªæå®ç«¯ç¹ï¼ä¾å¦ç±`modules/config/controller/`ä¸çæä¸ªControlleræä¾ï¼åèµ·HTTP GET请æ±ã |
| | | * `manager-api`ååºè¯¥è¯·æ±ï¼è¿å`xiaozhi-server`æéçé
ç½®æ°æ®ï¼JSONæ ¼å¼ï¼ã |
| | | * `xiaozhi-server`æ¥æ¶å°é
ç½®åï¼ä¼æ´æ°å
¶å
é¨ç¶æï¼å¹¶å¯è½éæ°åå§åç¸å
³çAIæå¡æ¨¡åï¼ä»¥ä½¿æ°é
ç½®çæã |
| | | |
| | | * **OTAåºä»¶æ´æ°æµç¨ (æ¦å¿µæ§æè¿°):** |
| | | * 管çåéè¿`manager-web`çé¢ä¸ä¼ æ°çESP32åºä»¶å
å°`manager-api`çç¹å®ç«¯ç¹ã |
| | | * `manager-api`å°åºä»¶æä»¶åå¨èµ·æ¥ï¼å¹¶è®°å½ç¸å
³å
æ°æ®ï¼çæ¬å·ãéç¨è®¾å¤åå·çï¼ã |
| | | * å½ç®¡çå触å对ç¹å®è®¾å¤çOTAæ´æ°æ¶ï¼ |
| | | * `manager-api`å¯è½ä¼éç¥`xiaozhi-server`ï¼å
·ä½éç¥æºå¶å¯è½æ¯ä¸ä¸ªè½®è¯¢æ£æ¥ç¹ï¼æ`xiaozhi-server`æ´é²ä¸ä¸ªæ¥æ¶æ´æ°éç¥çAPIï¼æè
æ´æ¾è¦åç妿¶æ¯éåï¼ã |
| | | * `xiaozhi-server`éåå¯ä»¥éè¿WebSocketåç®æ ESP32设å¤åé䏿¡å
å«åºä»¶ä¸è½½URLçæä»¤æ¶æ¯ã |
| | | * ESP32è®¾å¤æ¶å°æä»¤åï¼éè¿HTTP GET请æ±ä»è¯¥URLä¸è½½åºä»¶ãæ¤URLå¯è½æå`xiaozhi-server`èªèº«è¿è¡ç`SimpleHttpServer`ææå¡çè·¯å¾ï¼å¦`/xiaozhi/ota/`ï¼ï¼æè
å¨æäºæ¶æä¸ï¼ä¹å¯è½ç´æ¥æå`manager-api`æä¸ç¨çæä»¶æå¡å¨ã |
| | | |
| | | **4.3. 主è¦åè®®æ»ç»:** |
| | | |
| | | * **WebSocket:** 被éç¨äºESP32ä¸`xiaozhi-server`ä¹é´çéä¿¡é¾è·¯ï¼å 为å®é常éå宿¶ãä½å»¶è¿ãååçæ°æ®æµä¼ è¾ï¼å°¤å
¶æ¯é³é¢ï¼ï¼ä»¥å弿¥æ§å¶æ¶æ¯çä¼ éã |
| | | * **RESTful APIs (åºäºHTTP/HTTPSï¼é常使ç¨JSONä½ä¸ºæ°æ®äº¤æ¢æ ¼å¼):** è¿æ¯Webæå¡é´éä¿¡çæ åæ¹å¼ãç¨äº`manager-web`ï¼å®¢æ·ç«¯ï¼ä¸`manager-api`ï¼æå¡å¨ï¼ä¹é´ç请æ±-ååºäº¤äºï¼ä¹ç¨äº`xiaozhi-server`ï¼ä½ä¸ºå®¢æ·ç«¯ï¼ä»`manager-api`ï¼ä½ä¸ºæå¡å¨ï¼æåé
置信æ¯ãå
¶æ ç¶æç¹æ§ã广æ³çåºæ¯æåæäºçè§£çè¯ä¹ä½¿å
¶æä¸ºæ¤ç±»äº¤äºççæ³éæ©ã |
| | | |
| | | è¿ç§å¤å议并ç¨çéä¿¡çç¥ï¼ç¡®ä¿äºç³»ç»å
ä¸åç±»åç交äºéæ±é½è½å¾å°é«æåæ°å½çå¤çï¼å
¼é¡¾äºå®æ¶æ§åæ ååç请æ±-ååºæ¨¡å¼ã |
| | | |
| | | --- |
| | | |
| | | ## 5. æ ¸å¿åè½æ¦è¦ |
| | | |
| | | `xiaozhi-esp32-server` ç³»ç»æä¾äºä¸ç³»å丰å¯çåè½ï¼æ¨å¨æ¯æå¼åè
æå»ºå
è¿çè¯é³æ§å¶åºç¨ï¼ |
| | | |
| | | 1. **å
¨é¢çè¯é³äº¤äºå端:** æä¾ä»è¯é³æè·æå¯¼å°ååºçæåå¨ä½æ§è¡ç端å°ç«¯è§£å³æ¹æ¡ã |
| | | 2. **模ååå坿æçAIæå¡:** |
| | | * æ¯æå¹¿æ³çASRï¼èªå¨è¯é³è¯å«ï¼ãLLMï¼å¤§åè¯è¨æ¨¡åï¼ãTTSï¼ææ¬è½¬è¯é³ï¼ãVADï¼è¯é³æ´»å¨æ£æµï¼ãæå¾è¯å«åè®°å¿æä¾åã |
| | | * å
è®¸å¨æéæ©åé
ç½®è¿äºæå¡ï¼å
æ¬åºäºäºçAPI忬尿¨¡åï¼ï¼ä»¥å¹³è¡¡ææ¬ãæ§è½ãéç§åè¯è¨éæ±ã |
| | | 3. **é«çº§å¯¹è¯ç®¡ç:** |
| | | * æ¯æèªç¶äº¤äºï¼å
·æå¤éè¯å¯å¨å¯¹è¯ãæå¨ï¼æé®è¯´è¯å¼ï¼å¯¹è¯ä»¥å对系ç»ååºç宿¶ææçåè½ã |
| | | * å
å«ä¸ä¸æè®°å¿ï¼ä»¥å¨å¤è½®å¯¹è¯ä¸ä¿æè¿è´¯æ§ã |
| | | * å¨ä¸æ®µæ¶é´ä¸æ´»å¨åå
·æèªå¨ä¼ç 模å¼ã |
| | | 4. **å¤è¯è¨è½å:** |
| | | * æ¯æå¤ç§è¯è¨çè¯å«ååæï¼å
æ¬æ®éè¯ã粤è¯ãè±è¯ãæ¥è¯åé©è¯ï¼å
·ä½åå³äºæéçASR/LLM/TTSæä¾åï¼ã |
| | | 5. **éè¿æä»¶å®ç°ç坿©å±åè½:** |
| | | * 强大çæä»¶ç³»ç»å
许å¼åäººåæ·»å èªå®ä¹âæè½âæå½æ°ï¼ä¾å¦ï¼è·å天æ°ãæ§å¶æºè½å®¶å±
设å¤ãè®¿é®æ°é»ï¼ã |
| | | * è¿äºå½æ°å¯ä»¥ç±LLM使ç¨å
¶å½æ°è°ç¨è½åï¼æ ¹æ®æä¾çæ¨¡å¼æ¥è§¦åã |
| | | * å
置对Home Assistantéæçæ¯æã |
| | | 6. **ç©èç½è®¾å¤æ§å¶:** |
| | | * 设计ç¨äºéè¿è¯é³å½ä»¤ç®¡çåæ§å¶æºè½å®¶å±
设å¤åå
¶ä»ç©èç½ç¡¬ä»¶ï¼å¹¶å©ç¨æä»¶ç³»ç»ã |
| | | 7. **åºäºWebçç®¡çæ§å¶å° (`manager-web` & `manager-api`):** |
| | | * æä¾å
¨é¢çå¾å½¢çé¢ï¼ç¨äºï¼ |
| | | * ç³»ç»é
ç½®ï¼AIæå¡éæ©ãAPIå¯é¥ãæä½åæ°ï¼ã |
| | | * åºäºè§è²çè®¿é®æ§å¶çç¨æ·ç®¡çã |
| | | * ESP32è®¾å¤æ³¨åå管çã |
| | | * è¯é³é³è²/TTSè¯é³å®å¶ã |
| | | * ESP32设å¤çOTAï¼ç©ºä¸ä¸è½½ï¼åºä»¶æ´æ°ç®¡çã |
| | | * ç³»ç»åæ°ååå
¸ç管çã |
| | | 8. **çµæ´»çé¨ç½²é项:** |
| | | * æ¯æéè¿Docker容å¨ï¼ç¨äºç®åçä»
æå¡å¨æå
¨æ 设置ï¼åç´æ¥ä»æºä»£ç é¨ç½²ï¼ä»¥éåºåç§ç¯å¢åç¨æ·ä¸ä¸ç¥è¯ã |
| | | 9. **卿è¿ç¨é
ç½®:** |
| | | * `xiaozhi-server`å¯ä»¥ä»`manager-api`è·åå
¶é
ç½®ï¼å
è®¸å®æ¶æ´æ°AIæä¾åå设置ï¼èæ ééæ°å¯å¨æå¡å¨ã |
| | | 10. **弿ºå社åºé©±å¨:** |
| | | * æ ¹æ®MIT许å¯è¯ææï¼é¼å±éæãåä½å社åºè´¡ç®ã |
| | | 11. **ç»æµé«æçè§£å³æ¹æ¡:** |
| | | * æä¾âå
¥é¨å
¨å
费设置âè·¯å¾ï¼å©ç¨AIæå¡çå
è´¹å¥é¤ææ¬å°æ¨¡åï¼ä½¿å
¶æäºè¿è¡å®éªå个人项ç®ã |
| | | 12. **æ¸è¿å¼Webåºç¨ (PWA) ç¹æ§:** |
| | | * `manager-web`æ§å¶é¢æ¿å
å«Service Workeréæï¼ä»¥å¢å¼ºç¼ååæ½å¨ç离线访é®è½åã |
| | | 13. **详ç»çAPIææ¡£:** |
| | | * `manager-api`éè¿Knife4jæä¾OpenAPI (Swagger) ææ¡£ï¼ä»¥ä¾¿æ¸
æ°çè§£åæµè¯å
¶RESTful端ç¹ã |
| | | |
| | | è¿äºåè½å
±å使`xiaozhi-esp32-server`æä¸ºä¸ä¸ªå¼ºå¤§ãéåºæ§å¼ºä¸ç¨æ·å好çå¹³å°ï¼ç¨äºæå»ºå¤æçè¯é³äº¤äºåºç¨ç¨åºã |
| | | |
| | | --- |
| | | |
| | | ## 6. é¨ç½²ä¸é
ç½®æ¦è¿° |
| | | |
| | | `xiaozhi-esp32-server`ç³»ç»å¨è®¾è®¡ä¸å
åèèäºçµæ´»æ§ï¼æä¾äºå¤ç§é¨ç½²æ¹æ³åå
¨é¢çé
ç½®é项ï¼ä»¥éåºä¸åç使ç¨åºæ¯åéæ±ã |
| | | |
| | | **é¨ç½²é项:** |
| | | |
| | | 项ç®å¯ä»¥éè¿å¤ç§æ¹å¼é¨ç½²ï¼ä¸»è¦å
æ¬ä½¿ç¨Dockerç®åå®è£
è¿ç¨ï¼æç´æ¥ä»æºä»£ç é¨ç½²ä»¥è·å¾æ´å¤§çæ§å¶æåè¿è¡å¼åã |
| | | |
| | | 1. **åºäºDockerçé¨ç½²:** |
| | | * **ç®åå®è£
(ä»
`xiaozhi-server`):** æ¤é项ä»
é¨ç½²æ ¸å¿çåºäºPythonç`xiaozhi-server`ãå®éç¨äºä¸»è¦éè¦è¯é³AIå¤çè½ååIoTæ§å¶ï¼èä¸éè¦å®æ´Web管ççé¢åæ°æ®åºæ¯æåè½ï¼å¦OTAï¼çç¨æ·ã卿¤æ¨¡å¼ä¸ï¼é
ç½®é常éè¿æ¬å°æä»¶ï¼`config.yaml`ï¼ç®¡çï¼ä½å¦æéè¦ï¼ä»å¯å°å
¶æåä¸ä¸ªå·²åå¨ç`manager-api`å®ä¾ã |
| | | * **å
¨æ¨¡åå®è£
(ææç»ä»¶):** æ¤æ¹æ¡é¨ç½²æææ ¸å¿ç»ä»¶ï¼`xiaozhi-server`ãåºäºJavaç`manager-api`ã以ååºäºVue.jsç`manager-web`ï¼åæ¶è¿å
æ¬æéçæ°æ®åºæå¡ï¼MySQLåRedisï¼ãè¿æä¾äºå®æ´çç³»ç»ä½éªï¼å
æ¬ç¨äºå
¨é¢é
ç½®å管ççWebæ§å¶é¢æ¿ã |
| | | * 项ç®ä¸ºæ¯ä¸ªæå¡æä¾äº`Dockerfile`å®ä¹ï¼å¹¶ä½¿ç¨`docker-compose.yml`æä»¶ï¼ä¾å¦`docker-compose.yml`ç¨äºåºç¡çï¼`docker-compose_all.yml`ç¨äºå
¨åè½çï¼æ¥ç¼æå管çå¤å®¹å¨çé¨ç½²ãæ¤å¤ï¼è¿å¯è½æä¾ä¸ä¸ª`docker-setup.sh`èæ¬æ¥è¾
å©èªå¨åé¨åDockerç¯å¢çæå»ºå·¥ä½ã |
| | | |
| | | 2. **æºä»£ç é¨ç½²:** |
| | | * è¿ç§æ¹æ³éè¦ä¸ºæ¯ä¸ªç»ä»¶æå¨è®¾ç½®ç¸åºçå¼åç¯å¢ï¼Pythonç¯å¢ç¨äº`xiaozhi-server`ï¼Java/Mavenç¯å¢ç¨äº`manager-api`ï¼Node.js/Vue CLIç¯å¢ç¨äº`manager-web`ã |
| | | * 对äºå
¨æ¨¡åå®è£
ï¼è¿éè¦æå¨å®è£
åé
ç½®MySQLåRedisæ°æ®åºæå¡ã |
| | | * è¿ç§æ¹å¼é常ç¨äºé¡¹ç®å¼åãæ·±åº¦å®å¶ãè°è¯ï¼æè
å¨å¯¹ç¯å¢æç¹æ®è¦æ±ççäº§åºæ¯ä¸ã |
| | | |
| | | **é
置管ç:** |
| | | |
| | | é
ç½®æ¯å®å¶ç³»ç»è¡ä¸ºçå
³é®ï¼å°¤å
¶æ¯å¨éæ©AIæå¡æä¾åå管çAPIå¯é¥æ¹é¢ã |
| | | |
| | | 1. **`xiaozhi-server` é
ç½®:** |
| | | * **æ¬å°`config.yaml`:** ä½äº`xiaozhi-server`æ ¹ç®å½ä¸çä¸ä¸ªä¸»è¦çYAMLæ ¼å¼é
ç½®æä»¶ãå®å®ä¹äºæå¡å¨ç«¯å£ãéå®çAIæå¡æä¾åï¼ASRãLLMãTTSãVADãæå¾è¯å«ãè®°å¿æ¨¡åçï¼ãå®ä»¬åèªçAPIå¯é¥ææ¨¡åè·¯å¾ãæä»¶é
ç½®ä»¥åæ¥å¿çº§å«çã |
| | | * **éè¿`manager-api`è¿è¡è¿ç¨é
ç½®:** `xiaozhi-server`被设计为å¯ä»¥ä»`manager-api`è·åå
¶è¿è¡é
ç½®ãä»`manager-api`è·åç设置é常ä¼è¦çæ¬å°`config.yaml`ä¸çåå设置ãè¿å¸¦æ¥äºä¸¤å¤§å¥½å¤ï¼ |
| | | * **éä¸ç®¡ç:** ææé
ç½®é½å¯ä»¥éè¿`manager-web`çé¢è¿è¡ç»ä¸ç®¡çã |
| | | * **å¨ææ´æ°:** `xiaozhi-server`å¯ä»¥å·æ°å
¶é
ç½®å¹¶éæ°åå§åAI模åï¼èæ éå®å
¨é坿å¡ã |
| | | * `xiaozhi-server`ä¸ç`config/config_loader.py`å`config/manage_api_client.py`è´è´£å¤çé
ç½®çå è½½ãåå¹¶åä»`manager-api`æåçé»è¾ã |
| | | |
| | | 2. **`manager-api` é
ç½®:** |
| | | * ä½ä¸ºä¸ä¸ªSpring Bootåºç¨ï¼å
¶é
置主è¦éè¿ä½äº`src/main/resources`ç®å½ä¸ç`application.properties`æ`application.yml`æä»¶è¿è¡ç®¡çã |
| | | * å
³é®é
置项å
æ¬ï¼æ°æ®åºè¿æ¥ä¿¡æ¯ï¼MySQLçURLãç¨æ·åãå¯ç ï¼ãRedisæå¡å¨å°åå端å£ãåºç¨æå¡ç«¯å£ï¼é»è®¤ä¸º8002ï¼ãApache Shiroå®å
¨ç¸å
³ç设置ï¼ä»¥åä»»ä½éæçç¬¬ä¸æ¹æå¡ï¼å¦é¿éäºçä¿¡ï¼çé
ç½®åæ°ã |
| | | |
| | | 3. **`manager-web` é
ç½®:** |
| | | * Vue.jså端åºç¨çç¯å¢ç¹å®è®¾ç½®éè¿é¡¹ç®æ ¹ç®å½ä¸ç`.env`ç³»åæä»¶ï¼ä¾å¦`.env`, `.env.development`, `.env.production`ï¼è¿è¡ç®¡çã |
| | | * è¿éæå
³é®çé
ç½®é常æ¯`manager-api`å端çAPIåºç¡URLå°å (ä¾å¦ `VUE_APP_API_BASE_URL`)ï¼å端åºç¨å°åæ¤å°ååéææAPI请æ±ã |
| | | |
| | | 4. **é¢å®ä¹çé
ç½®æ¹æ¡:** |
| | | * é¡¹ç®ææ¡£ï¼é常æ¯READMEï¼ä¸ä¼æ¨èä¸äºå¸¸è§çé
ç½®ç»åï¼ä¾å¦ï¼ |
| | | * **âå
¥é¨å
¨å
费设置â:** è¯¥æ¹æ¡æ¨å¨å©ç¨äºAIæå¡çå
è´¹å¥é¤é¢åº¦æå®å
¨å
è´¹çæ¬å°æ¨¡åï¼ä»¥æå¤§ç¨åº¦å°éä½ç¨æ·çåå§ä½¿ç¨ææ¬åè¿è¥è´¹ç¨ã |
| | | * **âå
¨æµå¼é
ç½®â:** è¯¥æ¹æ¡ä¼å
èèç³»ç»çååºé度å交äºçæµç
æ§ï¼é常ä¼éç¨æ¯ææµå¼å¤ççï¼å¯è½ä»è´¹çï¼AIæå¡ã |
| | | * è¿äºé¢å®ä¹æ¹æ¡ä¸ºç¨æ·å¨`xiaozhi-server`ä¸é
ç½®AIæå¡æä¾åï¼éè¿`manager-web`çé¢æç´æ¥ä¿®æ¹`config.yaml`ï¼æä¾äºæå¯¼ã |
| | | |
| | | å¨å
¨æ¨¡åé¨ç½²çæ
åµä¸ï¼æ¨è使ç¨`manager-web`æ§å¶é¢æ¿ä½ä¸ºå¤§å¤æ°é
置任å¡çä¸»è¦æä½çé¢ï¼å ä¸ºå®æä¾äºä¸ç§ç¨æ·åå¥½çæ¹å¼æ¥ç®¡çç±`manager-api`æä¹
åå¹¶æç»ç±`xiaozhi-server`使ç¨çå项设置ã |
| | | |
| | | --- |
| New file |
| | |
| | | # Technical Documentation: `xiaozhi-esp32-server` |
| | | |
| | | **Table of Contents:** |
| | | |
| | | 1. [Introduction](#1-introduction) |
| | | 2. [Overall Architecture](#2-overall-architecture) |
| | | 3. [Component Deep Dive](#3-component-deep-dive) |
| | | * [3.1. `xiaozhi-server` (Core AI Engine - Python Implementation)](#31-xiaozhi-server-core-ai-engine---python-implementation) |
| | | * [3.2. `manager-api` (Management Backend - Java Spring Boot Implementation)](#32-manager-api-management-backend---java-spring-boot-implementation) |
| | | * [3.3. `manager-web` (Web Management Frontend - Vue.js Implementation)](#33-manager-web-web-management-frontend---vuejs-implementation) |
| | | * [3.4. `manager-mobile` (Mobile Management Console - uni-app Implementation)](#34-manager-mobile-mobile-management-console---uniapp-implementation) |
| | | * [3.5. `digital-human` (Digital Human Test Module - Python+Web Implementation)](#35-digital-human-digital-human-test-module---pythonweb-implementation) |
| | | 4. [Data Flow and Interaction Mechanisms](#4-data-flow-and-interaction-mechanisms) |
| | | 5. [Key Features Summary](#5-key-features-summary) |
| | | 6. [Deployment and Configuration Overview](#6-deployment-and-configuration-overview) |
| | | |
| | | --- |
| | | |
| | | ## 1. Introduction |
| | | |
| | | The `xiaozhi-esp32-server` project is a **comprehensive backend system** designed to support intelligent hardware based on ESP32. Its core goal is to enable developers to quickly build a robust server infrastructure that can understand natural language commands, interact efficiently with various AI services (for speech recognition, natural language understanding, and speech synthesis), manage IoT devices, and provide a web-based user interface for system configuration and management. By integrating multiple cutting-edge technologies into a cohesive and extensible platform, this project aims to simplify and accelerate the development process of customizable voice assistants and intelligent control systems. It is not just a simple server, but a bridge connecting hardware, AI capabilities, and user management. |
| | | |
| | | --- |
| | | |
| | | ## 2. Overall Architecture |
| | | |
| | | The `xiaozhi-esp32-server` system adopts a **distributed, multi-component collaborative** architectural design, ensuring modularity, maintainability, and scalability. Each core component has its specific role and works in coordination. The main components include: |
| | | |
| | | 1. **ESP32 Hardware (Client Device):** |
| | | This is the physical smart hardware device that end-users directly interact with. Its main responsibilities include: |
| | | * Capturing user voice commands. |
| | | * Securely sending captured raw audio data to `xiaozhi-server` for processing. |
| | | * Receiving synthesized voice responses from `xiaozhi-server` and playing them through speakers. |
| | | * Controlling other connected peripherals or IoT devices (such as smart bulbs, sensors, etc.) based on instructions received from `xiaozhi-server`. |
| | | |
| | | 2. **`xiaozhi-server` (Core AI Engine - Python Implementation):** |
| | | This Python-based server is the "brain" of the entire system, responsible for handling all voice-related logic and AI interactions. Its key responsibilities are detailed as follows: |
| | | * Establishing **stable, low-latency real-time bidirectional communication links** with ESP32 devices through the WebSocket protocol. |
| | | * Receiving audio streams from ESP32 and using Voice Activity Detection (VAD) technology to precisely segment valid speech segments. |
| | | * Integrating and calling Automatic Speech Recognition (ASR) services (configurable for local or cloud), converting speech segments to text. |
| | | * Interacting with Large Language Models (LLMs) to parse user intent, generate intelligent responses, and support complex natural language understanding tasks. |
| | | * Managing context information and user memory in multi-turn dialogues to provide coherent interaction experiences. |
| | | * Calling Text-to-Speech (TTS) services to synthesize natural and fluent speech from LLM-generated text responses. |
| | | * Executing custom commands through a flexible **plugin system**, including IoT device control logic. |
| | | * Obtaining its detailed runtime operation configuration from the `manager-api` service. |
| | | |
| | | 3. **`manager-api` (Management Backend - Java Spring Boot Implementation):** |
| | | This is an application built using the Java Spring Boot framework, providing a secure RESTful API for system management and configuration. It serves not only as the backend support for the `manager-web` console but also as the configuration data source for `xiaozhi-server`. Its core functions include: |
| | | * Providing user authentication (login, permission verification) and user account management functions for the Web console. |
| | | * Registration, information management of ESP32 devices, and maintenance of device-specific configurations. |
| | | * Persistently storing system configurations in the **MySQL database**, such as user-selected AI service providers, API keys, device parameters, plugin settings, etc. |
| | | * Providing specific API endpoints for `xiaozhi-server` to pull its required latest configuration. |
| | | * Managing TTS voice options, handling OTA (Over-The-Air) firmware update processes, and related metadata. |
| | | * Utilizing **Redis** as a high-speed cache to store hotspot data (such as session information, frequently accessed configurations) to improve API response speed and overall system performance. |
| | | |
| | | 4. **`manager-web` (Web Control Panel - Vue.js Implementation):** |
| | | This is a Single Page Application (SPA) built with Vue.js, providing system administrators with a graphical, user-friendly operation interface. Its main capabilities include: |
| | | * Conveniently configuring various AI services used by `xiaozhi-server` (such as ASR, LLM, TTS provider switching, parameter adjustment). |
| | | * Managing platform user accounts, role assignment, and permission control. |
| | | * Managing registered ESP32 devices and their related settings. |
| | | * (Potential functionality) Monitoring system operation status, viewing logs, troubleshooting, etc. |
| | | * Comprehensive interaction with all backend management functions provided by `manager-api`. |
| | | |
| | | 5. **`manager-mobile` (Mobile Management Console - uni-app Implementation):** |
| | | This is a cross-platform mobile management application based on uni-app v3 + Vue 3 + Vite, supporting App (Android & iOS) and WeChat Mini Program. Its main capabilities include: |
| | | * Providing a convenient management interface on mobile devices, similar in functionality to manager-web but optimized for mobile platforms. |
| | | * Supporting core functions such as user login, device management, and AI service configuration. |
| | | * Cross-platform adaptation, allowing a single codebase to run on iOS, Android, and WeChat Mini Programs. |
| | | * Integrating with `manager-api` through alova + `@alova/adapter-uniapp`. |
| | | * Using pinia for state management to ensure data consistency. |
| | | |
| | | 6. **`digital-human` (Digital Human Test Module - Python+Web Implementation):** |
| | | This is an independent digital human test module that provides a local test page, frontend interaction resources, a wake word runtime, and an event bridge for end-to-end debugging of the digital human interaction flow. Its main capabilities include: |
| | | * Providing a browser-based digital human test page for validating audio playback, audio reception, and interaction flow. |
| | | * Integrating a local wake word runtime with keyword detection based on Sherpa-ONNX. |
| | | * Bridging page state and the local runtime through an event bridge to simplify wake word debugging. |
| | | * Existing as a standalone module alongside `xiaozhi-server`, `manager-web`, and `manager-api`, making independent development and deployment easier. |
| | | |
| | | **High-Level Interaction Flow Overview:** |
| | | |
| | | * **Voice Interaction Main Line:** After the **ESP32 device** captures user voice, it transmits audio data in real-time to **`xiaozhi-server`** through **WebSocket**. After `xiaozhi-server` completes a series of AI processing (VAD, ASR, LLM interaction, TTS), it sends the synthesized voice response back to the ESP32 device for playback through WebSocket. All real-time interactions directly related to voice are completed in this link. |
| | | * **Management Configuration Main Line:** Administrators access the **`manager-web`** console through a browser. `manager-web` executes various management operations (such as modifying configurations, managing users or devices) by calling **RESTful HTTP interfaces** provided by **`manager-api`**. Data is passed between them in JSON format. |
| | | * **Configuration Synchronization:** **`xiaozhi-server`** actively pulls its latest operation configuration from **`manager-api`** through HTTP requests when starting or when specific update mechanisms are triggered. This ensures that configuration changes made by administrators in the Web interface can be effectively applied to the operation of the core AI engine in a timely manner. |
| | | |
| | | This **frontend-backend separation, core service and management service separation** architectural design allows `xiaozhi-server` to focus on efficient real-time AI processing tasks, while `manager-api` and `manager-web` together provide a powerful and easy-to-use management and configuration platform. Each component has clear responsibilities, facilitating independent development, testing, deployment, and expansion. |
| | | |
| | | ``` |
| | | xiaozhi-esp32-server |
| | | ââ xiaozhi-server Port 8000 Python development Responsible for ESP32 communication |
| | | ââ manager-web Port 8001 Node.js+Vue development Responsible for providing web interface for console |
| | | ââ manager-api Port 8002 Java development Responsible for providing console API |
| | | ââ manager-mobile Cross-platform mobile application uni-app+Vue3 development Responsible for providing mobile console management |
| | | ââ digital-human Digital human test module Python+Web implementation Responsible for local test page, wake word runtime, and event bridge |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ## 3. Component Deep Dive |
| | | |
| | | ### 3.1. `xiaozhi-server` (Core AI Engine - Python Implementation) |
| | | |
| | | The `xiaozhi-server` is the intelligent core of the system, responsible for processing voice interactions, interfacing with AI services, and managing communication with ESP32 devices. |
| | | |
| | | * **Purpose:** |
| | | * To provide real-time processing of voice commands from ESP32 devices. |
| | | * To integrate with various AI services for Speech-to-Text (ASR), Natural Language Understanding (via Large Language Models - LLMs), Text-to-Speech (TTS), Voice Activity Detection (VAD), Intent Recognition, and Memory. |
| | | * To manage dialogue flow and context with users. |
| | | * To execute custom functions and control IoT devices based on user commands. |
| | | * To be dynamically configurable through the `manager-api`. |
| | | |
| | | * **Core Technologies:** |
| | | * **Python 3:** The primary programming language. |
| | | * **Asyncio:** Python's asynchronous programming framework, crucial for handling concurrent WebSocket connections and non-blocking I/O for AI service API calls. |
| | | * **`websockets` Library:** For WebSocket server implementation. |
| | | * **HTTP Client (e.g., `aiohttp`, `httpx`):** For asynchronous HTTP requests to `manager-api` and external AI services. |
| | | * **YAML (PyYAML):** For local configuration file parsing. |
| | | |
| | | * **Key Implementation Aspects:** |
| | | |
| | | 1. **AI Service Provider Pattern (`core/providers/`):** |
| | | * **Concept:** A flexible design for integrating AI services. Each service type (ASR, TTS, LLM, etc.) has an abstract base class defining a common interface. Concrete classes implement this interface for specific vendors or local models. |
| | | * **Benefit:** Allows easy switching of AI service backends via configuration and simplifies adding new service integrations. |
| | | * **Initialization:** `core/utils/modules_initialize.py` acts as a factory to load and instantiate configured providers. |
| | | |
| | | 2. **WebSocket Communication & Connection Handling (`core/websocket_server.py`, `core/connection.py`):** |
| | | * **Server Setup:** Manages WebSocket connections from ESP32 devices. |
| | | * **Connection Isolation:** Each ESP32 client gets a dedicated `ConnectionHandler` instance, isolating its session state and dialogue. |
| | | * **Dynamic Configuration Updates:** Can fetch updated configurations from `manager-api` and re-initialize AI service modules live, without a full server restart. |
| | | |
| | | 3. **Message Handling & Dialogue Flow (`core/handle/`):** |
| | | * Employs a modular handler pattern. The `ConnectionHandler` dispatches message processing to specialized modules based on message type or dialogue phase (e.g., `receiveAudioHandle.py` for audio input, `intentHandler.py` for NLU, `functionHandler.py` for plugin execution, `sendAudioHandle.py` for TTS output). |
| | | |
| | | 4. **Plugin System for Extensible Functions (`plugins_func/`):** |
| | | * **Purpose:** Allows adding custom "skills" (e.g., weather, news, Home Assistant control). |
| | | * **Mechanism:** Plugins define functions and schemas. The LLM can request execution of these functions (function calling). `loadplugins.py` and `register.py` manage plugin discovery and registration. |
| | | |
| | | 5. **Configuration Management (`config/`):** |
| | | * Loads settings from a local `config.yaml` and merges them with configurations fetched from `manager-api` (via `manage_api_client.py`), enabling remote dynamic configuration. |
| | | * `logger.py` sets up structured application logging. |
| | | * `config/assets/` stores predefined audio files for system notifications. |
| | | |
| | | 6. **Auxiliary HTTP Server (`core/http_server.py`):** |
| | | * Handles specific HTTP requests, notably for OTA firmware updates (`/xiaozhi/ota/`) and other utility endpoints. |
| | | |
| | | ### 3.2. `manager-api` (Management Backend - Java Spring Boot Implementation) |
| | | |
| | | The `manager-api` component is a backend server built using Java and the Spring Boot framework, serving as the administrative hub. |
| | | |
| | | * **Purpose:** |
| | | * Provide a secure RESTful API for the `manager-web` frontend. |
| | | * Act as a centralized configuration provider for `xiaozhi-server`. |
| | | * Manage persistent data (users, devices, AI configurations, voice timbres, OTA firmware). |
| | | |
| | | * **Core Technologies:** |
| | | * **Java 21 & Spring Boot 3:** Core language and framework. |
| | | * **Spring MVC:** For building REST controllers. |
| | | * **MyBatis-Plus:** ORM for database interaction with MySQL. |
| | | * **MySQL:** Relational database. |
| | | * **Druid:** JDBC connection pool. |
| | | * **Redis (Spring Data Redis):** For caching. |
| | | * **Apache Shiro:** Security framework for authentication and authorization. |
| | | * **Liquibase:** Database schema migration. |
| | | * **Knife4j:** OpenAPI (Swagger) API documentation. |
| | | * **Maven:** Build and dependency management. |
| | | |
| | | * **Key Implementation Aspects:** |
| | | |
| | | 1. **Modular Architecture (`modules/` package):** |
| | | * Business logic is organized into distinct modules (e.g., `sys` for users/roles, `agent` for assistant configs, `device` for ESP32s, `config` for `xiaozhi-server` settings, `security`, `timbre`, `ota`). |
| | | * Each module typically follows a layered pattern: Controller, Service, DAO (Mapper), Entity, DTO. |
| | | |
| | | 2. **Layered Architecture:** |
| | | * **Controller Layer (`@RestController`):** Defines API endpoints, handles HTTP request/response. |
| | | * **Service Layer (`@Service`):** Contains business logic, transaction management. |
| | | * **Data Access Layer (MyBatis-Plus Mappers):** Interacts with the MySQL database. |
| | | |
| | | 3. **Common Functionalities (`common/` package):** |
| | | * Provides shared code: base classes, global configurations (Spring, MyBatis, Redis, Knife4j), custom annotations (e.g., `@LogOperation`), AOP aspects, global exception handling, utility classes, and XSS protection. |
| | | |
| | | 4. **Security (Apache Shiro):** |
| | | * Manages user authentication and permissions for accessing API endpoints. Configured with Shiro Realms and security filters. |
| | | |
| | | 5. **Database Schema Management (Liquibase):** |
| | | * Ensures consistent database structure across environments through versioned schema changes. |
| | | |
| | | ### 3.3. `manager-web` (Web Control Panel - Vue.js Implementation) |
| | | |
| | | The `manager-web` is a Single Page Application (SPA) providing the administrative user interface. |
| | | |
| | | * **Purpose:** |
| | | * Offer a web-based control panel for system configuration and management. |
| | | * Enable administrators to configure `xiaozhi-server`'s AI services, manage users and devices, customize voice timbres, and handle OTA updates. |
| | | |
| | | * **Core Technologies:** |
| | | * **Vue.js 2 & Vue CLI:** Core JavaScript framework and build tools. |
| | | * **Vue Router:** For client-side routing within the SPA. |
| | | * **Vuex:** For centralized state management. |
| | | * **Element UI:** UI component library for a consistent look and feel. |
| | | * **SCSS:** CSS preprocessor. |
| | | * **HTTP Client (Flyio or Axios):** For API calls to `manager-api`. |
| | | * **Workbox:** For PWA features (caching, service worker). |
| | | * **Opus Libraries:** For potential in-browser audio recording/playback. |
| | | |
| | | * **Key Implementation Aspects:** |
| | | |
| | | 1. **SPA Structure:** Single HTML page with dynamic view updates. |
| | | 2. **Component-Based Architecture:** UI built from reusable Vue components (`.vue` files in `src/views/` for pages and `src/components/` for smaller elements). |
| | | 3. **Client-Side Routing (`src/router/index.js`):** Maps browser URLs to view components, with route guards for authentication. |
| | | 4. **State Management (`src/store/index.js`):** Vuex manages global state (user info, device lists, etc.) via state, getters, mutations, and actions (often involving API calls). |
| | | 5. **API Communication (`src/apis/`):** Modularized API service files make asynchronous calls to `manager-api`. |
| | | 6. **Build Process & PWA Features:** Vue CLI (Webpack) bundles assets. Workbox enables PWA features like caching. |
| | | 7. **Environment Configuration (`.env` files):** |
| | | * The `.env` (and `.env.development`, `.env.production`, etc.) files in the project root directory are used to define environment variables. These variables (such as `VUE_APP_API_BASE_URL` to specify the base URL of `manager-api`) can be accessed in the application code through `process.env.VUE_APP_XXX`, allowing configuration of different parameters for different build environments (development, testing, production). |
| | | |
| | | `manager-web` constructs a powerful, maintainable, and user-friendly management interface through the comprehensive application of these technologies, providing solid frontend support for the configuration and monitoring of the `xiaozhi-esp32-server` system. |
| | | |
| | | ### 3.4. `manager-mobile` (Mobile Management Console - uni-app Implementation) |
| | | |
| | | The `manager-mobile` component is a cross-platform mobile management application based on uni-app v3 + Vue 3 + Vite, supporting App (Android & iOS) and WeChat Mini Program. It provides system administrators with a mobile management interface, making management operations more convenient. |
| | | |
| | | * **Core Objectives:** |
| | | * Provide a convenient management interface on mobile devices, similar in functionality to manager-web but optimized for mobile platforms. |
| | | * Support core functions such as user login, device management, and AI service configuration. |
| | | * Cross-platform adaptation, allowing a single codebase to run on iOS, Android, and WeChat Mini Programs. |
| | | * Provide mobile users with a smooth and efficient management experience. |
| | | |
| | | * **Platform Compatibility:** |
| | | |
| | | | H5 | iOS | Android | WeChat Mini Program | |
| | | | -- | --- | ------- | ------------------ | |
| | | | Ã | â | â | â | |
| | | |
| | | * **Core Technologies:** |
| | | * **uni-app v3:** A framework for developing all frontend applications using Vue.js, supporting iOS, Android, H5, and various mini-programs. |
| | | * **Vue 3:** A progressive framework for building user interfaces, providing better performance and new features. |
| | | * **Vite:** The next generation frontend development and build tool, offering an extremely fast development experience. |
| | | * **pnpm:** A fast, disk space-efficient package manager. |
| | | * **alova:** A lightweight, flexible request strategy library, paired with @alova/adapter-uniapp to adapt to the uni-app environment. |
| | | * **pinia:** State management library for Vue, replacing Vuex, providing a simpler API and better TypeScript support. |
| | | * **UnoCSS:** A high-performance and extremely flexible instant atomic CSS engine. |
| | | * **TypeScript:** Provides a type-safe development experience. |
| | | |
| | | * **Key Implementation Details:** |
| | | |
| | | 1. **Cross-Platform Architecture:** |
| | | * Based on the uni-app framework, achieving the goal of "write once, run anywhere," significantly reducing development and maintenance costs. |
| | | * Handling platform-specific code through conditional compilation to address the characteristics and limitations of different platforms. |
| | | |
| | | 2. **Project Structure:** |
| | | * **`src/App.vue`:** The root component of the application, defining global styles and configurations. |
| | | * **`src/main.ts`:** The entry file of the application, responsible for initializing the Vue instance, registering plugins, and setting up route interceptors. |
| | | * **`src/pages/`:** Stores application page components, such as login pages, device management pages, etc. |
| | | * **`src/layouts/`:** Defines application layout components, such as default layouts, layouts with tabbar, etc. |
| | | * **`src/api/`:** Encapsulates communication logic with backend APIs. |
| | | * **`src/store/`:** Uses pinia for state management. |
| | | * **`src/components/`:** Stores reusable components. |
| | | * **`src/utils/`:** Provides common utility functions. |
| | | |
| | | 3. **Network Requests:** |
| | | * Implements network requests based on alova + @alova/adapter-uniapp, unified handling of request headers, authentication, errors, etc. |
| | | * Request addresses and environment configurations are managed through .env files, supporting switching between different environments. |
| | | |
| | | 4. **Routing and Authentication:** |
| | | * Uses uni-app's routing system, combined with route interceptors to implement page login verification and permission control. |
| | | * When unlogged users access pages requiring authentication, they are redirected to the login page. |
| | | |
| | | 5. **State Management:** |
| | | * Uses pinia to manage application state, such as user information, device lists, etc. |
| | | * Implements persistent storage of state through the pinia-plugin-persistedstate plugin. |
| | | |
| | | 6. **Build and Release:** |
| | | * Supports multiple build commands, such as building WeChat Mini Programs, Android, and iOS Apps. |
| | | * Uses HBuilderX for cloud packaging of Apps, simplifying the packaging process. |
| | | |
| | | `manager-mobile` provides users with a fully functional, smooth mobile management tool through the application of these technologies, allowing administrators to perform system management and configuration anytime, anywhere. |
| | | |
| | | ### 3.5. `digital-human` (Digital Human Test Module - Python+Web Implementation) |
| | | |
| | | The `digital-human` component is an independent digital human test module responsible for providing a local test page, page resources, a wake word runtime, and an event bridge. It is primarily used to debug the complete digital human interaction flow and to validate frontend interaction, audio capability, and local wake word behavior. |
| | | |
| | | * **Core Objectives:** |
| | | * Provide an independent local test page for validating digital human interaction effects. |
| | | * Provide a local wake word runtime for keyword detection and event reporting. |
| | | * Provide an event bridge between the frontend page and the local runtime to connect the test flow. |
| | | * Exist as a standalone module for easier independent development, debugging, and deployment. |
| | | |
| | | * **Core Technologies:** |
| | | * **Python 3:** Used for the local test runtime, service startup, wake word lifecycle management, and event bridge coordination. |
| | | * **Native HTML/CSS/JavaScript:** Used to build the digital human test page and interaction logic. |
| | | * **Sherpa-ONNX:** Used for local wake word keyword detection. |
| | | * **ThreadingHTTPServer / WebSocket bridge:** Used to serve the local page, health check endpoint, and event communication. |
| | | |
| | | * **Key Implementation Aspects:** |
| | | |
| | | 1. **Module Entry and Page Resources:** |
| | | * `start.py` is the module entry point responsible for starting the local test runtime. |
| | | * `index.html` is the entry page for digital human testing. |
| | | * The `js/`, `css/`, `images/`, and `resources/` directories provide frontend scripts, styles, and static resources. |
| | | |
| | | 2. **Local Test Runtime:** |
| | | * The `wakeword_runtime/` directory contains the local wake word runtime implementation. |
| | | * The runtime is responsible for configuration loading, logging initialization, audio capture, keyword detection, and lifecycle management. |
| | | * The module exposes a local page URL, event bridge URL, and health check endpoint through a local HTTP service. |
| | | |
| | | 3. **Wake Word Detection Flow:** |
| | | * Uses Sherpa-ONNX keyword detection models to support local wake word triggering. |
| | | * Model files and keyword configurations are stored in `wakeword_runtime/models/` and related configuration files. |
| | | * The page can observe runtime state and trigger results through the event bridge. |
| | | |
| | | 4. **Debugging and Integration Positioning:** |
| | | * After startup, developers can open the local page in a browser to validate playback, reception, and interaction logic. |
| | | * The event bridge synchronizes wake word state to the page, which helps with local debugging. |
| | | * Detailed model download, runtime configuration, and usage instructions are documented in `docs/digital-human-wakeword.md`. |
| | | |
| | | The `digital-human` module allows digital human related capabilities to be validated independently from the main service, reducing the complexity of page debugging, wake word integration, and local environment setup. |
| | | |
| | | --- |
| | | |
| | | ## 4. Data Flow and Interaction Mechanisms |
| | | |
| | | The `xiaozhi-esp32-server` system coordinates work through well-defined data flows and interaction protocols between components. The main communication methods rely on WebSocket protocol optimized for real-time interaction and RESTful API suitable for client-server requests. |
| | | |
| | | **4.1. Core Voice Interaction Flow (ESP32 Device <-> `xiaozhi-server`)** |
| | | |
| | | This flow is real-time, primarily using WebSocket for low-latency, bidirectional data exchange. |
| | | |
| | | * **Communication Protocol Documentation:** |
| | | * Detailed communication protocol documentation can be accessed at: https://ccnphfhqs21z.feishu.cn/wiki/M0XiwldO9iJwHikpXD5cEx71nKh |
| | | * This document details the WebSocket communication protocol between ESP32 devices and `xiaozhi-server`, including: |
| | | * Connection establishment and handshake process |
| | | * Audio data transmission format |
| | | * Control command format |
| | | * Status report format |
| | | * Error handling mechanism |
| | | |
| | | * **Connection Establishment and Handshake:** |
| | | * The ESP32 device, as a client, actively initiates a WebSocket connection request to the specified endpoint of `xiaozhi-server` (e.g., `ws://<server-IP>:<WebSocket-port>/xiaozhi/v1/`). |
| | | * `xiaozhi-server` (`core/websocket_server.py`) receives the connection and instantiates an independent `ConnectionHandler` object for each successfully connected ESP32 device to manage the entire lifecycle of that session. |
| | | * After the connection is established, an initial handshake process may be executed (handled by `core/handle/helloHandle.py`) to exchange device identification, authentication information, protocol version, or basic status. |
| | | |
| | | * **Audio Uplink Transmission (ESP32 -> `xiaozhi-server`):** |
| | | * After a user speaks to the ESP32 device, the device's microphone captures raw audio data (usually in PCM or compressed formats like Opus). |
| | | * The ESP32 pushes these audio data chunks as WebSocket **binary messages** in real-time to the corresponding `ConnectionHandler` in `xiaozhi-server`. |
| | | * The server-side `core/handle/receiveAudioHandle.py` module is responsible for receiving, buffering, and processing these audio data. |
| | | |
| | | * **AI Core Processing (within `xiaozhi-server`):** |
| | | * **VAD (Voice Activity Detection):** `receiveAudioHandle.py` uses the configured VAD provider (such as SileroVAD) to analyze the audio stream, accurately identifying the start and end points of speech, filtering out silent or noise segments. |
| | | * **ASR (Automatic Speech Recognition):** Detected valid speech segments are sent to the configured ASR provider (local such as FunASR, or cloud services). The ASR engine converts audio signals into text strings. |
| | | * **NLU/LLM (Natural Language Understanding/Large Language Model):** The ASR output text, along with the current dialogue context history obtained from the Memory provider, and the description schemas of available functions (tools) loaded from `plugins_func/`, are passed to the configured LLM provider. |
| | | * **Function Call Execution (if LLM decides needed):** If the LLM analysis determines that an external function needs to be called (e.g., querying weather, controlling home appliances), it generates a structured function call request. `core/handle/functionHandler.py` receives this request, finds and executes the corresponding Python function defined in `plugins_func/`, and returns the function's execution result to the LLM. The LLM then generates the final natural language response based on this result. |
| | | * **Response Generation:** The LLM synthesizes all information (user input, context, function call results, etc.) to generate the final text response. |
| | | * **Memory Update:** The current round of interaction (user question, LLM response, possible function calls) is processed by the Memory provider to update the dialogue history for subsequent interactions. |
| | | * **TTS (Text-to-Speech):** The final text response generated by the LLM is sent to the configured TTS provider, which synthesizes the text into a speech data stream (e.g., MP3 or WAV format). |
| | | |
| | | * **Audio Downlink Response (`xiaozhi-server` -> ESP32):** |
| | | * The speech data stream synthesized by the TTS provider is sent in real-time as WebSocket **binary messages** back to the ESP32 device through the `core/handle/sendAudioHandle.py` module. |
| | | * The ESP32 device receives these audio data chunks and immediately plays them to the user through the speaker. |
| | | |
| | | * **Control and Status Messages (Bidirectional):** |
| | | * In addition to audio streams, ESP32 and `xiaozhi-server` also exchange **text messages** through WebSocket, these messages are usually encapsulated in JSON format. |
| | | * **ESP32 -> Server:** The device may send status reports (such as network conditions, microphone status), error codes, or specific control commands (e.g., "stop TTS playback" triggered by user button press). |
| | | * **Server -> ESP32:** The server may send control instructions to the device (such as "start listening", "stop listening", adjust sensitivity, send specific configuration parameters). |
| | | * Modules like `core/handle/abortHandle.py` (handling interrupt requests), `core/handle/reportHandle.py` (handling device reports) are responsible for parsing and responding to these control/status messages. |
| | | |
| | | **4.2. Management and Configuration Flow (`manager-web` <-> `manager-api` <-> `xiaozhi-server`)** |
| | | |
| | | This flow primarily relies on HTTP/HTTPS-based RESTful API for request-response interactions. |
| | | |
| | | * **Administrator UI Backend Interaction (`manager-web` -> `manager-api`):** |
| | | * When administrators perform operations in the `manager-web` interface (e.g., saving a configuration, adding a new user, registering an ESP32 device): |
| | | * The Vue.js frontend application (`manager-web`) will initiate asynchronous HTTP requests (usually GET, POST, PUT, DELETE) to the corresponding REST API endpoints of `manager-api` through its API encapsulation module (located in `src/apis/module/`). |
| | | * Request and response bodies typically use JSON format. |
| | | * The `@RestController` classes in `manager-api` receive these requests. The **Apache Shiro** framework will first perform authentication and authorization checks on the requests. |
| | | * After verification, the Controller distributes the request to the corresponding Service layer to handle business logic. The Service layer may interact with the MySQL database (through MyBatis-Plus) and may utilize Redis for data caching. |
| | | * After processing, `manager-api` returns an HTTP response in JSON format to `manager-web`. |
| | | * `manager-web` updates its Vuex state store and user interface display based on the response results. |
| | | |
| | | * **Configuration Synchronization (`manager-api` -> `xiaozhi-server`):** |
| | | * The operation of `xiaozhi-server` depends on dynamic configurations obtained from `manager-api` (such as currently selected AI service providers and their API keys). |
| | | * **Pull Mechanism:** The `config/manage_api_client.py` module within `xiaozhi-server`, when the server starts or through specific update triggers (e.g., when `WebSocketServer.update_config()` is called), will initiate an HTTP GET request to a specified endpoint of `manager-api` (e.g., provided by a Controller in `modules/config/controller/`). |
| | | * `manager-api` responds to this request, returning the configuration data required by `xiaozhi-server` (in JSON format). |
| | | * After receiving the configuration, `xiaozhi-server` will update its internal state and may reinitialize relevant AI service modules to make the new configuration effective. |
| | | |
| | | * **OTA Firmware Update Flow (Conceptual Description):** |
| | | * Administrators upload new ESP32 firmware packages to specific endpoints of `manager-api` through the `manager-web` interface. |
| | | * `manager-api` stores the firmware files and records related metadata (version number, applicable device models, etc.). |
| | | * When administrators trigger OTA updates for specific devices: |
| | | * `manager-api` may notify `xiaozhi-server` (the specific notification mechanism may be a polling checkpoint, or `xiaozhi-server` exposes an API to receive update notifications, or more loosely coupled like message queues). |
| | | * `xiaozhi-server` can then send an instruction message containing the firmware download URL to the target ESP32 device through WebSocket. |
| | | * After receiving the instruction, the ESP32 device downloads the firmware through an HTTP GET request from that URL. This URL may point to a path served by the `SimpleHttpServer` running on `xiaozhi-server` itself (such as `/xiaozhi/ota/`), or in some architectures, it may directly point to `manager-api` or a dedicated file server. |
| | | |
| | | **4.3. Main Protocol Summary:** |
| | | |
| | | * **WebSocket:** Selected for the communication link between ESP32 and `xiaozhi-server` because it is very suitable for real-time, low-latency, bidirectional data stream transmission (especially audio), as well as asynchronous control message delivery. |
| | | * **RESTful APIs (based on HTTP/HTTPS, usually using JSON as the data exchange format):** This is the standard way for web service communication. Used for request-response interactions between `manager-web` (client) and `manager-api` (server), and also for `xiaozhi-server` (as client) to pull configuration information from `manager-api` (as server). Its stateless nature, wide library support, and easy-to-understand semantics make it an ideal choice for such interactions. |
| | | |
| | | This multi-protocol communication strategy ensures that different types of interaction requirements within the system can be handled efficiently and appropriately, balancing real-time performance and standardized request-response patterns. |
| | | |
| | | --- |
| | | |
| | | ## 5. Key Features Summary |
| | | |
| | | The `xiaozhi-esp32-server` system provides a series of rich features aimed at supporting developers in building advanced voice control applications: |
| | | |
| | | 1. **Comprehensive Voice Interaction Backend:** Provides an end-to-end solution from voice capture guidance to response generation and action execution. |
| | | 2. **Modular and Pluggable AI Services:** |
| | | * Supports a wide range of ASR (Automatic Speech Recognition), LLM (Large Language Model), TTS (Text-to-Speech), VAD (Voice Activity Detection), Intent Recognition, and Memory providers. |
| | | * Allows dynamic selection and configuration of these services (including cloud-based APIs and local models) to balance cost, performance, privacy, and language requirements. |
| | | 3. **Advanced Dialogue Management:** |
| | | * Supports natural interaction, with wake word to start dialogue, manual (push-to-talk) dialogue, and real-time interruption of system responses. |
| | | * Includes contextual memory to maintain coherence in multi-turn dialogues. |
| | | * Has automatic sleep mode after a period of inactivity. |
| | | 4. **Multi-language Capabilities:** |
| | | * Supports recognition and synthesis in multiple languages, including Mandarin, Cantonese, English, Japanese, and Korean (specific capabilities depend on the selected ASR/LLM/TTS providers). |
| | | 5. **Extensible Functions through Plugins:** |
| | | * Powerful plugin system allows developers to add custom "skills" or functions (e.g., getting weather, controlling smart home devices, accessing news). |
| | | * These functions can be triggered by the LLM using its function calling capability, based on provided schemas. |
| | | * Built-in support for Home Assistant integration. |
| | | 6. **IoT Device Control:** |
| | | * Designed to manage and control smart home devices and other IoT hardware through voice commands, utilizing the plugin system. |
| | | 7. **Web-based Management Console (`manager-web` & `manager-api`):** |
| | | * Provides a comprehensive graphical interface for: |
| | | * System configuration (AI service selection, API keys, operation parameters). |
| | | * Role-based access control user management. |
| | | * ESP32 device registration and management. |
| | | * Voice timbre/TTS voice customization. |
| | | * OTA (Over-The-Air) firmware update management for ESP32 devices. |
| | | * System parameter and dictionary management. |
| | | 8. **Flexible Deployment Options:** |
| | | * Supports deployment through Docker containers (for simplified server-only or full-stack setup) and directly from source code, adapting to various environments and user expertise. |
| | | 9. **Dynamic Remote Configuration:** |
| | | * `xiaozhi-server` can obtain its configuration from `manager-api`, allowing real-time updates of AI providers and settings without restarting the server. |
| | | 10. **Open Source and Community-Driven:** |
| | | * Licensed under MIT License, encouraging transparency, collaboration, and community contribution. |
| | | 11. **Cost-Effective Solution:** |
| | | * Provides an "Entry Level Free Settings" path, utilizing free tiers of AI services or local models, making it easy to experiment and for personal projects. |
| | | 12. **Progressive Web Application (PWA) Features:** |
| | | * The `manager-web` control panel includes Service Worker integration to enhance caching and potential offline access capabilities. |
| | | 13. **Detailed API Documentation:** |
| | | * `manager-api` provides OpenAPI (Swagger) documentation through Knife4j for clear understanding and testing of its RESTful endpoints. |
| | | |
| | | These features together make `xiaozhi-esp32-server` a powerful, adaptable, and user-friendly platform for building complex voice interaction applications. |
| | | |
| | | --- |
| | | |
| | | ## 6. Deployment and Configuration Overview |
| | | |
| | | The `xiaozhi-esp32-server` system is designed with flexibility in mind, providing multiple deployment methods and comprehensive configuration options to adapt to different usage scenarios and requirements. |
| | | |
| | | **Deployment Options:** |
| | | |
| | | The project can be deployed in multiple ways, mainly including using Docker to simplify the installation process, or deploying directly from source code for greater control and development. |
| | | |
| | | 1. **Docker-based Deployment:** |
| | | * **Simplified Installation (Only `xiaozhi-server`):** This option only deploys the core Python-based `xiaozhi-server`. It is suitable for users who mainly need voice AI processing capabilities and IoT control, without requiring the complete Web management interface and database support functions (such as OTA). In this mode, configuration is typically managed through local files (`config.yaml`), but if needed, it can still point to an existing `manager-api` instance. |
| | | * **Full Module Installation (All Components):** This scheme deploys all core components: `xiaozhi-server`, Java-based `manager-api`, and Vue.js-based `manager-web`, along with required database services (MySQL and Redis). This provides a complete system experience, including a Web control panel for comprehensive configuration and management. |
| | | * The project provides `Dockerfile` definitions for each service and uses `docker-compose.yml` files (e.g., `docker-compose.yml` for basic version, `docker-compose_all.yml` for full-featured version) to orchestrate and manage multi-container deployment. Additionally, a `docker-setup.sh` script may be provided to assist in automating part of the Docker environment setup work. |
| | | |
| | | 2. **Source Code Deployment:** |
| | | * This method requires manual setup of the corresponding development environment for each component: Python environment for `xiaozhi-server`, Java/Maven environment for `manager-api`, Node.js/Vue CLI environment for `manager-web`. |
| | | * For full module installation, MySQL and Redis database services also need to be manually installed and configured. |
| | | * This approach is typically used for project development, deep customization, debugging, or in production scenarios with special environmental requirements. |
| | | |
| | | **Configuration Management:** |
| | | |
| | | Configuration is key to customizing system behavior, especially in selecting AI service providers and managing API keys. |
| | | |
| | | 1. **`xiaozhi-server` Configuration:** |
| | | * **Local `config.yaml`:** A main YAML format configuration file located in the `xiaozhi-server` root directory. It defines server ports, selected AI service providers (ASR, LLM, TTS, VAD, Intent Recognition, Memory modules, etc.), their respective API keys or model paths, plugin configurations, and log levels. |
| | | * **Remote Configuration through `manager-api`:** `xiaozhi-server` is designed to obtain its operation configuration from `manager-api`. Settings obtained from `manager-api` typically override settings with the same name in the local `config.yaml`. This brings two major benefits: |
| | | * **Centralized Management:** All configurations can be managed uniformly through the `manager-web` interface. |
| | | * **Dynamic Updates:** `xiaozhi-server` can refresh its configuration and reinitialize AI modules without completely restarting the service. |
| | | * `config/config_loader.py` and `config/manage_api_client.py` in `xiaozhi-server` are responsible for handling configuration loading, merging, and pulling logic from `manager-api`. |
| | | |
| | | 2. **`manager-api` Configuration:** |
| | | * As a Spring Boot application, its configuration is mainly managed through the `application.properties` or `application.yml` file located in the `src/main/resources` directory. |
| | | * Key configuration items include: database connection information (MySQL URL, username, password), Redis server address and port, application service port (default 8002), Apache Shiro security-related settings, and configuration parameters for any integrated third-party services (such as Aliyun SMS). |
| | | |
| | | 3. **`manager-web` Configuration:** |
| | | * Environment-specific settings for the Vue.js frontend application are managed through `.env` series files (e.g., `.env`, `.env.development`, `.env.production`) in the project root directory. |
| | | * The most critical configuration here is usually the API base URL address of the `manager-api` backend (e.g., `VUE_APP_API_BASE_URL`), to which the frontend application will send all API requests. |
| | | |
| | | 4. **Predefined Configuration Schemes:** |
| | | * The project documentation (usually README) will recommend some common configuration combinations, for example: |
| | | * **"Entry Level Free Settings":** This scheme aims to utilize free tier quotas of cloud AI services or completely free local models to minimize users' initial usage costs and operating expenses. |
| | | * **"Full Streaming Configuration":** This scheme prioritizes system response speed and interaction fluency, typically choosing AI services that support streaming processing (possibly paid). |
| | | * These predefined schemes provide guidance for users to configure AI service providers in `xiaozhi-server` (through the `manager-web` interface or directly modifying `config.yaml`). |
| | | |
| | | In the case of full module deployment, it is recommended to use the `manager-web` control panel as the main operation interface for most configuration tasks, as it provides a user-friendly way to manage various settings that are persisted by `manager-api` and ultimately used by `xiaozhi-server`. |
| | | |
| | | --- |
| New file |
| | |
| | | æ¬ææ¡£æ¯å¼åç±»ææ¡£ï¼å¦éé¨ç½²å°æºæå¡ç«¯ï¼[ç¹å»è¿éæ¥çé¨ç½²æç¨](../../README.md#%E9%83%A8%E7%BD%B2%E6%96%87%E6%A1%A3) |
| | | |
| | | å¦éæ¥çä¸ä½æºæ°å人è½å°é¨ç½²ãKiosk å
¨å±å¯å¨åç³»ç»ç¯å¢é
ç½®ï¼[ç¹å»è¿éæ¥çä¸ä½æºé¨ç½²æå](../../docs/all-in-one-digital-human-setup.md) |
| | | |
| | | å¦éæ¥çå¤éè¯æ¨¡åä¸è½½ãè¿è¡æ¶é
ç½®å详ç»ä½¿ç¨è¯´æï¼[ç¹å»è¿éæ¥çå¤éè¯ä¸é¢ææ¡£](../../docs/digital-human-wakeword.md) |
| | | |
| | | # 项ç®ä»ç» |
| | | |
| | | digital-human æ¯ç¬ç«çæ°å人æµè¯æ¨¡åï¼è´è´£æä¾æ¬å°æµè¯é¡µé¢ãå端交äºèµæºãå¤éè¯è¿è¡æ¶åäºä»¶æ¡¥è½åï¼ç¨äºèè°æ´ä¸ªæ°å人交äºé¾è·¯ã |
| | | |
| | | # å¿«éå¯å¨ |
| | | |
| | | å®è£
ä¾èµï¼ |
| | | |
| | | ```bash |
| | | pip install -r wakeword_runtime/requirements.txt |
| | | ``` |
| | | |
| | | å¯å¨æ¨¡åï¼ |
| | | |
| | | ```bash |
| | | python start.py |
| | | ``` |
| | | |
| | | # 访é®å°å |
| | | |
| | | å¯å¨åå¯è®¿é®ï¼ |
| | | |
| | | - 页é¢å°åï¼http://127.0.0.1:8006/index.html |
| | | - äºä»¶æ¡¥å°åï¼ws://127.0.0.1:8006/wakeword-ws |
| | | - å¥åº·æ£æ¥ï¼http://127.0.0.1:8006/health |
| | | |
| | | # ç®å½è¯´æ |
| | | |
| | | - `start.py`ï¼æ¨¡åå¯å¨å
¥å£ |
| | | - `index.html`ï¼æ°å人æµè¯é¡µé¢å
¥å£ |
| | | - `wakeword_runtime`ï¼æ¬å°å¤éè¯è¿è¡æ¶ä¸é
ç½®ç®å½ |
| | | - `js`ã`css`ï¼é¡µé¢åç«¯èæ¬ä¸æ ·å¼ |
| | | - `images`ã`resources`ï¼é¡µé¢èµæºæä»¶ |
| | | |
| | | # ç¸å
³ææ¡£ |
| | | |
| | | - ä¸ä½æºé¨ç½²æåï¼éç¨äº x86 è®¾å¤æ´æºè½å°é¨ç½²ãKiosk å±ç¤ºå弿ºèªå¯å¨é
ç½® |
| | | [../../docs/all-in-one-digital-human-setup.md](../../docs/all-in-one-digital-human-setup.md) |
| | | - å¤éè¯ä¸é¢ææ¡£ï¼éç¨äºå¤éè¯æ¨¡åä¸è½½ãè¿è¡æ¶é
ç½®åæ¬å°è°è¯è¯´æ |
| | | [../../docs/digital-human-wakeword.md](../../docs/digital-human-wakeword.md) |
| New file |
| | |
| | | /* ==================== å
¨å±æ ·å¼éç½® ==================== */ |
| | | * { |
| | | box-sizing: border-box; |
| | | margin: 0; |
| | | padding: 0; |
| | | } |
| | | |
| | | body { |
| | | font-family: 'PingFang SC', 'Microsoft YaHei', sans-serif; |
| | | margin: 0; |
| | | padding: 0; |
| | | overflow: hidden; |
| | | height: 100vh; |
| | | width: 100vw; |
| | | } |
| | | |
| | | /* ==================== èæ¯å®¹å¨ ==================== */ |
| | | .background-container { |
| | | position: fixed; |
| | | top: 0; |
| | | left: 0; |
| | | width: 100vw; |
| | | height: 100vh; |
| | | background-image: url('../images/1.png'); |
| | | background-size: cover; |
| | | background-position: center; |
| | | background-repeat: no-repeat; |
| | | transition: background-image 0.5s ease-in-out; |
| | | z-index: -2; |
| | | } |
| | | |
| | | .background-overlay { |
| | | position: absolute; |
| | | top: 0; |
| | | left: 0; |
| | | width: 100%; |
| | | height: 100%; |
| | | background: rgba(0, 0, 0, 0.3); |
| | | z-index: -1; |
| | | } |
| | | |
| | | /* ==================== ä¸»å®¹å¨ ==================== */ |
| | | .container { |
| | | position: relative; |
| | | width: 100vw; |
| | | height: 100vh; |
| | | display: flex; |
| | | flex-direction: column; |
| | | align-items: center; |
| | | justify-content: flex-end; |
| | | /* ä»åºé¨å¼å§æå */ |
| | | padding: 20px; |
| | | padding-bottom: 0; |
| | | /* ç§»é¤åºé¨paddingï¼è®©æ¨¡åå¯ä»¥å»¶ä¼¸å°é¡µé¢åºé¨ */ |
| | | } |
| | | |
| | | /* ==================== 模åå è½½åº ==================== */ |
| | | .model-container { |
| | | position: absolute; |
| | | top: 50%; |
| | | left: 50%; |
| | | width: 300px; |
| | | height: 200px; |
| | | transform: translate(-50%, -50%); |
| | | user-select: none; |
| | | } |
| | | |
| | | .model-loading { |
| | | position: absolute; |
| | | top: 0; |
| | | left: 0; |
| | | width: 100%; |
| | | height: 100%; |
| | | display: none; |
| | | flex-direction: column; |
| | | justify-content: center; |
| | | align-items: center; |
| | | z-index: 999; |
| | | transition: opacity 0.5s ease-out, visibility 0.5s ease-out; |
| | | background-image: linear-gradient(transparent 50%, rgba(88, 101, 242, 0.05) 50%); |
| | | background-size: 100% 4px; |
| | | animation: scan 1.26s linear infinite; |
| | | } |
| | | |
| | | .loading-char-float { |
| | | font-size: 22px; |
| | | letter-spacing: 3px; |
| | | position: relative; |
| | | } |
| | | |
| | | .loading-char-float .main-char { |
| | | color: #f0f8ff; |
| | | text-shadow: 0 0 5px #5865f2, 0 0 10px rgba(88, 101, 242, 0.8); |
| | | display: inline-block; |
| | | } |
| | | |
| | | .loading-char-float .main-char span { |
| | | animation: char-float 1.26s ease-in-out infinite; |
| | | display: inline-block; |
| | | } |
| | | |
| | | .loading-char-float .shadow-char { |
| | | position: absolute; |
| | | top: 3px; |
| | | left: 0; |
| | | color: rgba(88, 101, 242, 0.3); |
| | | pointer-events: none; |
| | | animation: shadow-float 1.26s ease-in-out infinite; |
| | | } |
| | | |
| | | .loading-char-float .main-char span:nth-child(1) { |
| | | animation-delay: 0s; |
| | | } |
| | | |
| | | .loading-char-float .main-char span:nth-child(2) { |
| | | animation-delay: 0.11s; |
| | | } |
| | | |
| | | .loading-char-float .main-char span:nth-child(3) { |
| | | animation-delay: 0.22s; |
| | | } |
| | | |
| | | .loading-char-float .main-char span:nth-child(4) { |
| | | animation-delay: 0.33s; |
| | | } |
| | | |
| | | .loading-char-float .main-char span:nth-child(5) { |
| | | animation-delay: 0.44s; |
| | | } |
| | | |
| | | .loading-char-float .main-char span:nth-child(6) { |
| | | animation-delay: 0.55s; |
| | | } |
| | | |
| | | @keyframes scan { |
| | | 0% { |
| | | background-position: 0 0; |
| | | } |
| | | |
| | | 100% { |
| | | background-position: 0 100px; |
| | | } |
| | | } |
| | | |
| | | @keyframes char-float { |
| | | |
| | | 0%, |
| | | 100% { |
| | | transform: translateY(0); |
| | | opacity: 1; |
| | | text-shadow: 0 0 5px #5865f2, 0 0 10px rgba(88, 101, 242, 0.8); |
| | | } |
| | | |
| | | 50% { |
| | | transform: translateY(-5px); |
| | | opacity: 0.9; |
| | | text-shadow: 0 0 10px #5865f2, 0 0 20px rgba(88, 101, 242, 0.8); |
| | | } |
| | | } |
| | | |
| | | @keyframes shadow-float { |
| | | |
| | | 0%, |
| | | 100% { |
| | | transform: translateY(3px); |
| | | opacity: 0.3; |
| | | } |
| | | |
| | | 50% { |
| | | transform: translateY(8px); |
| | | opacity: 0.15; |
| | | } |
| | | } |
| | | |
| | | /* ==================== Live2Dæ¾ç¤ºåºå ==================== */ |
| | | #live2d-stage { |
| | | position: fixed; |
| | | top: 0; |
| | | left: 0; |
| | | width: 100vw; |
| | | height: 100vh; |
| | | display: block; |
| | | z-index: 100; |
| | | pointer-events: auto; |
| | | } |
| | | |
| | | .status-indicator { |
| | | position: absolute; |
| | | top: 20px; |
| | | left: 50%; |
| | | transform: translateX(-50%); |
| | | display: flex; |
| | | align-items: center; |
| | | gap: 8px; |
| | | background: rgba(0, 0, 0, 0.4); |
| | | backdrop-filter: blur(10px); |
| | | padding: 8px 16px; |
| | | border-radius: 20px; |
| | | border: 1px solid rgba(255, 255, 255, 0.1); |
| | | color: white; |
| | | font-size: 14px; |
| | | font-weight: 500; |
| | | z-index: 10; |
| | | } |
| | | |
| | | .status-dot { |
| | | width: 8px; |
| | | height: 8px; |
| | | border-radius: 50%; |
| | | animation: pulse 2s infinite; |
| | | } |
| | | |
| | | .status-disconnected { |
| | | background-color: #f44336; |
| | | } |
| | | |
| | | .status-connecting { |
| | | background-color: #ff9800; |
| | | } |
| | | |
| | | .status-connected { |
| | | background-color: #4caf50; |
| | | } |
| | | |
| | | @keyframes pulse { |
| | | |
| | | 0%, |
| | | 100% { |
| | | opacity: 1; |
| | | } |
| | | |
| | | 50% { |
| | | opacity: 0.5; |
| | | } |
| | | } |
| | | |
| | | /* ==================== èå¤©æ¶æ¯æµï¼å¼¹å¹æ ·å¼ï¼ ==================== */ |
| | | .chat-container { |
| | | position: absolute; |
| | | bottom: 150px; |
| | | right: 20px; |
| | | z-index: 100; |
| | | } |
| | | |
| | | .chat-stream { |
| | | width: 300px; |
| | | max-height: 200px; |
| | | overflow-y: auto; |
| | | overflow-x: hidden; |
| | | display: flex; |
| | | flex-direction: column; |
| | | gap: 8px; |
| | | pointer-events: none; |
| | | margin-bottom: 10px; |
| | | } |
| | | |
| | | .chat-ipt { |
| | | width: 100%; |
| | | display: none; |
| | | justify-content: center; |
| | | margin-top: 10px; |
| | | } |
| | | |
| | | .chat-ipt input { |
| | | width: 100%; |
| | | padding: 12px 16px; |
| | | border: none; |
| | | border-radius: 24px; |
| | | background: rgba(35, 39, 42, 0.85); |
| | | backdrop-filter: blur(10px); |
| | | color: white; |
| | | font-size: 14px; |
| | | border: 1px solid rgba(255, 255, 255, 0.1); |
| | | box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1); |
| | | transition: all 0.3s ease; |
| | | } |
| | | |
| | | .chat-ipt input::placeholder { |
| | | color: rgba(255, 255, 255, 0.5); |
| | | } |
| | | |
| | | .chat-ipt input:focus { |
| | | outline: none; |
| | | border-color: rgba(88, 101, 242, 0.6); |
| | | box-shadow: 0 4px 16px rgba(88, 101, 242, 0.3); |
| | | background: rgba(45, 49, 52, 0.9); |
| | | } |
| | | |
| | | .chat-message { |
| | | animation: slideInRight 0.3s ease-out; |
| | | pointer-events: auto; |
| | | } |
| | | |
| | | .chat-message.ai .message-bubble { |
| | | background: transparent; |
| | | color: white; |
| | | align-self: flex-end; |
| | | text-shadow: 0 1px 2px rgba(0, 0, 0, 0.8); |
| | | } |
| | | |
| | | .chat-message.user .message-bubble { |
| | | background: rgba(88, 101, 242, 0.7); |
| | | color: white; |
| | | align-self: flex-start; |
| | | text-shadow: 0 1px 2px rgba(0, 0, 0, 0.8); |
| | | backdrop-filter: blur(5px); |
| | | border: 1px solid rgba(255, 255, 255, 0.2); |
| | | } |
| | | |
| | | .chat-message.system .message-bubble { |
| | | background: transparent; |
| | | color: #b9bbbe; |
| | | align-self: center; |
| | | text-shadow: 0 1px 2px rgba(0, 0, 0, 0.8); |
| | | } |
| | | |
| | | .message-bubble { |
| | | padding: 8px 12px; |
| | | border-radius: 18px; |
| | | font-size: 14px; |
| | | max-width: 250px; |
| | | word-wrap: break-word; |
| | | backdrop-filter: blur(10px); |
| | | border: 1px solid rgba(255, 255, 255, 0.1); |
| | | animation: fadeIn 0.3s ease-out; |
| | | } |
| | | |
| | | @keyframes slideInRight { |
| | | from { |
| | | transform: translateX(100%); |
| | | opacity: 0; |
| | | } |
| | | |
| | | to { |
| | | transform: translateX(0); |
| | | opacity: 1; |
| | | } |
| | | } |
| | | |
| | | @keyframes fadeIn { |
| | | from { |
| | | opacity: 0; |
| | | transform: translateY(10px); |
| | | } |
| | | |
| | | to { |
| | | opacity: 1; |
| | | transform: translateY(0); |
| | | } |
| | | } |
| | | |
| | | @keyframes fadeOut { |
| | | from { |
| | | opacity: 1; |
| | | } |
| | | |
| | | to { |
| | | opacity: 0; |
| | | } |
| | | } |
| | | |
| | | /* ==================== åºé¨æ§å¶æ ==================== */ |
| | | .control-bar { |
| | | position: fixed; |
| | | bottom: 20px; |
| | | left: 50%; |
| | | transform: translateX(-50%); |
| | | display: flex; |
| | | gap: 16px; |
| | | background: rgba(35, 39, 42, 0.9); |
| | | backdrop-filter: blur(20px); |
| | | padding: 12px 24px; |
| | | border-radius: 28px; |
| | | border: 1px solid rgba(255, 255, 255, 0.1); |
| | | box-shadow: 0 8px 32px rgba(0, 0, 0, 0.3); |
| | | z-index: 1000; |
| | | /* ç¡®ä¿æ§å¶æ 卿ä¸å± */ |
| | | } |
| | | |
| | | .control-btn { |
| | | display: flex; |
| | | flex-direction: column; |
| | | align-items: center; |
| | | justify-content: center; |
| | | width: 60px; |
| | | height: 60px; |
| | | border: none; |
| | | border-radius: 50%; |
| | | background: rgba(79, 84, 92, 0.8); |
| | | color: white; |
| | | cursor: pointer; |
| | | transition: all 0.2s ease; |
| | | position: relative; |
| | | } |
| | | |
| | | .control-btn:hover { |
| | | background: rgba(114, 137, 218, 0.8); |
| | | transform: translateY(-2px); |
| | | } |
| | | |
| | | .control-btn:active { |
| | | transform: translateY(0); |
| | | } |
| | | |
| | | .control-btn:disabled { |
| | | background: rgba(79, 84, 92, 0.4); |
| | | color: rgba(255, 255, 255, 0.4); |
| | | cursor: not-allowed; |
| | | transform: none; |
| | | } |
| | | |
| | | .control-btn:disabled:hover { |
| | | background: rgba(79, 84, 92, 0.4); |
| | | transform: none; |
| | | } |
| | | |
| | | .btn-icon { |
| | | width: 24px; |
| | | height: 24px; |
| | | margin-bottom: 4px; |
| | | } |
| | | |
| | | .btn-text { |
| | | font-size: 12px; |
| | | font-weight: 500; |
| | | } |
| | | |
| | | /* æ¨å·æé®ç¹æ®æ ·å¼ */ |
| | | .dial-btn.dial-active { |
| | | background: rgba(237, 66, 69, 0.9); |
| | | } |
| | | |
| | | .dial-btn.dial-active:hover { |
| | | background: rgba(237, 66, 69, 1); |
| | | } |
| | | |
| | | /* å½é³æé®ç¹æ®æ ·å¼ */ |
| | | .control-btn.recording { |
| | | background: rgba(237, 66, 69, 0.9); |
| | | animation: pulse 1.5s infinite; |
| | | } |
| | | |
| | | .control-btn.recording:hover { |
| | | background: rgba(237, 66, 69, 1); |
| | | } |
| | | |
| | | /* æå头æé®ç¹æ®æ ·å¼ */ |
| | | #cameraBtn.camera-active { |
| | | background: rgba(237, 66, 69, 0.9); |
| | | } |
| | | |
| | | #cameraBtn.camera-active:hover { |
| | | background: rgba(237, 66, 69, 1); |
| | | } |
| | | |
| | | /* å½é³æé®èå²å¨ç» */ |
| | | @keyframes pulse { |
| | | 0% { |
| | | box-shadow: 0 0 0 0 rgba(237, 66, 69, 0.7); |
| | | } |
| | | |
| | | 70% { |
| | | box-shadow: 0 0 0 10px rgba(237, 66, 69, 0); |
| | | } |
| | | |
| | | 100% { |
| | | box-shadow: 0 0 0 0 rgba(237, 66, 69, 0); |
| | | } |
| | | } |
| | | |
| | | /* ==================== å¼¹çªæ ·å¼ ==================== */ |
| | | .modal { |
| | | display: none; |
| | | position: fixed; |
| | | top: 0; |
| | | left: 0; |
| | | width: 100vw; |
| | | height: 100vh; |
| | | background: rgba(0, 0, 0, 0.7); |
| | | backdrop-filter: blur(5px); |
| | | z-index: 2000; |
| | | align-items: center; |
| | | justify-content: center; |
| | | } |
| | | |
| | | .modal-content { |
| | | background: #36393f; |
| | | border-radius: 12px; |
| | | width: 90%; |
| | | max-width: 500px; |
| | | max-height: 80vh; |
| | | overflow: hidden; |
| | | box-shadow: 0 20px 60px rgba(0, 0, 0, 0.5); |
| | | animation: modalSlideIn 0.3s ease-out; |
| | | } |
| | | |
| | | .settings-modal { |
| | | max-width: 700px; |
| | | max-height: 85vh; |
| | | } |
| | | |
| | | @keyframes modalSlideIn { |
| | | from { |
| | | opacity: 0; |
| | | transform: scale(0.9) translateY(-20px); |
| | | } |
| | | |
| | | to { |
| | | opacity: 1; |
| | | transform: scale(1) translateY(0); |
| | | } |
| | | } |
| | | |
| | | .modal-header { |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: space-between; |
| | | padding: 20px 24px; |
| | | border-bottom: 1px solid #40444b; |
| | | background: #2f3136; |
| | | } |
| | | |
| | | .modal-header h2 { |
| | | color: white; |
| | | font-size: 20px; |
| | | font-weight: 600; |
| | | margin: 0; |
| | | } |
| | | |
| | | .close-btn { |
| | | background: none; |
| | | border: none; |
| | | color: #b9bbbe; |
| | | font-size: 24px; |
| | | cursor: pointer; |
| | | width: 32px; |
| | | height: 32px; |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: center; |
| | | border-radius: 4px; |
| | | transition: background-color 0.2s; |
| | | } |
| | | |
| | | .close-btn:hover { |
| | | background: #40444b; |
| | | color: white; |
| | | } |
| | | |
| | | .modal-body { |
| | | padding: 24px; |
| | | max-height: calc(80vh - 80px); |
| | | overflow-y: auto; |
| | | } |
| | | |
| | | /* ==================== è¾å
¥ç»æ ·å¼ ==================== */ |
| | | .input-group { |
| | | margin-bottom: 20px; |
| | | } |
| | | |
| | | .input-group label { |
| | | display: block; |
| | | margin-bottom: 8px; |
| | | color: #b9bbbe; |
| | | font-size: 14px; |
| | | font-weight: 500; |
| | | } |
| | | |
| | | .input-group input, |
| | | .input-group textarea { |
| | | width: 100%; |
| | | padding: 12px; |
| | | border: 1px solid #40444b; |
| | | border-radius: 6px; |
| | | background: #40444b; |
| | | color: white; |
| | | font-size: 14px; |
| | | transition: border-color 0.2s; |
| | | } |
| | | |
| | | .input-group input:focus, |
| | | .input-group textarea:focus { |
| | | outline: none; |
| | | border-color: #5865f2; |
| | | } |
| | | |
| | | .input-group textarea { |
| | | resize: vertical; |
| | | min-height: 80px; |
| | | font-family: inherit; |
| | | } |
| | | |
| | | /* ==================== æé®æ ·å¼ ==================== */ |
| | | .modal-actions { |
| | | display: flex; |
| | | gap: 12px; |
| | | justify-content: flex-end; |
| | | margin-top: 24px; |
| | | } |
| | | |
| | | /* ==================== æä»¶åè®®è¦åæ ·å¼ ==================== */ |
| | | #fileProtocolWarning { |
| | | position: fixed; |
| | | top: 50%; |
| | | left: 50%; |
| | | transform: translate(-50%, -50%); |
| | | width: 95%; |
| | | max-width: 800px; |
| | | background: linear-gradient(135deg, rgba(76, 175, 80, 0.95), rgba(56, 142, 60, 0.95)); |
| | | border: 3px solid #4caf50; |
| | | border-radius: 16px; |
| | | padding: 32px; |
| | | z-index: 10000; |
| | | box-shadow: 0 20px 60px rgba(0, 0, 0, 0.4); |
| | | backdrop-filter: blur(15px); |
| | | color: white; |
| | | font-family: inherit; |
| | | animation: fadeInUp 0.5s ease-out; |
| | | } |
| | | |
| | | #fileProtocolWarning h2 { |
| | | color: #e8f5e8; |
| | | margin-bottom: 20px; |
| | | font-size: 28px; |
| | | font-weight: 700; |
| | | text-shadow: 0 2px 4px rgba(0, 0, 0, 0.3); |
| | | } |
| | | |
| | | #fileProtocolWarning p { |
| | | margin-bottom: 16px; |
| | | line-height: 1.6; |
| | | font-size: 16px; |
| | | color: #e8f5e8; |
| | | } |
| | | |
| | | #fileProtocolWarning ol { |
| | | margin: 16px 0; |
| | | padding-left: 24px; |
| | | font-size: 16px; |
| | | } |
| | | |
| | | #fileProtocolWarning pre { |
| | | background: rgba(255, 255, 255, 0.15); |
| | | padding: 12px 16px; |
| | | border-radius: 8px; |
| | | margin: 12px 0; |
| | | font-family: 'Courier New', monospace; |
| | | font-size: 14px; |
| | | overflow-x: auto; |
| | | border: 1px solid rgba(255, 255, 255, 0.2); |
| | | } |
| | | |
| | | #fileProtocolWarning strong { |
| | | color: #c8e6c9; |
| | | font-weight: 600; |
| | | } |
| | | |
| | | /* èæ¯æ¨¡ç³é®ç½© */ |
| | | .file-protocol-overlay { |
| | | position: fixed; |
| | | top: 0; |
| | | left: 0; |
| | | width: 100vw; |
| | | height: 100vh; |
| | | background: rgba(0, 0, 0, 0.6); |
| | | backdrop-filter: blur(10px); |
| | | z-index: 9999; |
| | | animation: fadeIn 0.3s ease-out; |
| | | } |
| | | |
| | | /* å¨ç»ææ */ |
| | | @keyframes fadeIn { |
| | | from { |
| | | opacity: 0; |
| | | } |
| | | |
| | | to { |
| | | opacity: 1; |
| | | } |
| | | } |
| | | |
| | | @keyframes fadeInUp { |
| | | from { |
| | | opacity: 0; |
| | | transform: translate(-50%, -40%); |
| | | } |
| | | |
| | | to { |
| | | opacity: 1; |
| | | transform: translate(-50%, -50%); |
| | | } |
| | | } |
| | | |
| | | /* ==================== è¿æ¥ä¿¡æ¯æ ·å¼ ==================== */ |
| | | .connection-info { |
| | | margin-top: 20px; |
| | | padding: 16px; |
| | | background: rgba(88, 101, 242, 0.1); |
| | | border: 1px solid rgba(88, 101, 242, 0.3); |
| | | border-radius: 8px; |
| | | text-align: center; |
| | | } |
| | | |
| | | .connection-info p { |
| | | color: #b9bbbe; |
| | | font-size: 14px; |
| | | line-height: 1.4; |
| | | margin: 0; |
| | | } |
| | | |
| | | .btn-primary { |
| | | background: #5865f2; |
| | | color: white; |
| | | border: none; |
| | | padding: 10px 20px; |
| | | border-radius: 6px; |
| | | cursor: pointer; |
| | | font-size: 14px; |
| | | font-weight: 500; |
| | | transition: background-color 0.2s; |
| | | } |
| | | |
| | | .btn-primary:hover { |
| | | background: #4752c4; |
| | | } |
| | | |
| | | .btn-secondary { |
| | | background: #4f545c; |
| | | color: white; |
| | | border: none; |
| | | padding: 10px 20px; |
| | | border-radius: 6px; |
| | | cursor: pointer; |
| | | font-size: 14px; |
| | | font-weight: 500; |
| | | transition: background-color 0.2s; |
| | | } |
| | | |
| | | .btn-secondary:hover { |
| | | background: #5d6269; |
| | | } |
| | | |
| | | /* ==================== 设置æ ç¾é¡µæ ·å¼ ==================== */ |
| | | .settings-tabs { |
| | | display: flex; |
| | | border-bottom: 1px solid #40444b; |
| | | margin-bottom: 20px; |
| | | } |
| | | |
| | | .tab-btn { |
| | | background: none; |
| | | border: none; |
| | | color: #b9bbbe; |
| | | padding: 12px 24px; |
| | | cursor: pointer; |
| | | font-size: 14px; |
| | | font-weight: 500; |
| | | border-bottom: 2px solid transparent; |
| | | transition: all 0.2s; |
| | | } |
| | | |
| | | .tab-btn.active { |
| | | color: white; |
| | | border-bottom-color: #5865f2; |
| | | } |
| | | |
| | | .tab-btn:hover:not(.active) { |
| | | color: white; |
| | | background: #40444b; |
| | | } |
| | | |
| | | .tab-content { |
| | | display: none; |
| | | } |
| | | |
| | | .tab-content.active { |
| | | display: block; |
| | | } |
| | | |
| | | /* ==================== é
ç½®é¢æ¿æ ·å¼ ==================== */ |
| | | .config-panel { |
| | | background: #2f3136; |
| | | border-radius: 8px; |
| | | padding: 20px; |
| | | } |
| | | |
| | | .config-row { |
| | | display: flex; |
| | | gap: 16px; |
| | | margin-bottom: 16px; |
| | | } |
| | | |
| | | .config-item { |
| | | flex: 1; |
| | | } |
| | | |
| | | .config-item label { |
| | | display: block; |
| | | margin-bottom: 6px; |
| | | color: #b9bbbe; |
| | | font-size: 12px; |
| | | font-weight: 500; |
| | | } |
| | | |
| | | .config-item input { |
| | | width: 100%; |
| | | padding: 8px 12px; |
| | | border: 1px solid #40444b; |
| | | border-radius: 4px; |
| | | background: #40444b; |
| | | color: white; |
| | | font-size: 14px; |
| | | } |
| | | |
| | | .config-item textarea { |
| | | width: 100%; |
| | | padding: 12px; |
| | | border: 1px solid #40444b; |
| | | border-radius: 6px; |
| | | background: #40444b; |
| | | color: white; |
| | | min-height: 100px; |
| | | resize: vertical; |
| | | box-sizing: border-box; |
| | | font-family: inherit; |
| | | font-size: 14px; |
| | | } |
| | | |
| | | .model-select { |
| | | width: 100%; |
| | | padding: 10px 40px 10px 14px; |
| | | border: 1px solid #40444b; |
| | | border-radius: 8px; |
| | | background: #40444b; |
| | | color: #ffffff; |
| | | font-size: 14px; |
| | | font-weight: 500; |
| | | cursor: pointer; |
| | | appearance: none; |
| | | -webkit-appearance: none; |
| | | -moz-appearance: none; |
| | | background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='%23ffffff'%3E%3Cpath d='M7 10l5 5 5-5z'/%3E%3C/svg%3E"); |
| | | background-repeat: no-repeat; |
| | | background-position: right 12px center; |
| | | background-size: 16px 16px; |
| | | } |
| | | |
| | | .model-select:hover { |
| | | border-color: #5865f2; |
| | | } |
| | | |
| | | .model-select:focus { |
| | | outline: none; |
| | | border-color: #5865f2; |
| | | } |
| | | |
| | | .model-select option { |
| | | background: #2f3136; |
| | | color: #ffffff; |
| | | padding: 12px; |
| | | font-size: 14px; |
| | | } |
| | | |
| | | .background-btn { |
| | | width: 100%; |
| | | padding: 10px 14px; |
| | | border: 1px solid #40444b; |
| | | border-radius: 8px; |
| | | background: #40444b; |
| | | color: #ffffff; |
| | | font-size: 14px; |
| | | font-weight: 500; |
| | | cursor: pointer; |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: center; |
| | | gap: 8px; |
| | | transition: all 0.3s ease; |
| | | } |
| | | |
| | | .background-btn:hover { |
| | | background: #4f545c; |
| | | } |
| | | |
| | | .background-btn:active { |
| | | background: #40444b; |
| | | } |
| | | |
| | | .background-btn .btn-icon { |
| | | width: 20px; |
| | | height: 20px; |
| | | fill: #ffffff; |
| | | } |
| | | |
| | | /* ==================== MCPå·¥å
·æ ·å¼ ==================== */ |
| | | .mcp-tools-container { |
| | | background: #2f3136; |
| | | border-radius: 8px; |
| | | padding: 0; |
| | | overflow: hidden; |
| | | } |
| | | |
| | | .mcp-tools-header { |
| | | display: flex; |
| | | justify-content: space-between; |
| | | align-items: center; |
| | | padding: 16px 20px; |
| | | background: #36393f; |
| | | border-bottom: 1px solid #40444b; |
| | | } |
| | | |
| | | .mcp-tools-header h3 { |
| | | margin: 0; |
| | | color: #ffffff; |
| | | font-size: 16px; |
| | | font-weight: 600; |
| | | } |
| | | |
| | | .mcp-tools-panel { |
| | | padding: 20px; |
| | | } |
| | | |
| | | .mcp-tools-list { |
| | | min-height: 200px; |
| | | max-height: 300px; |
| | | overflow-y: auto; |
| | | margin-bottom: 16px; |
| | | } |
| | | |
| | | /* MCPå·¥å
·å¡çæ ·å¼ */ |
| | | .mcp-tool-card { |
| | | background: #36393f; |
| | | border: 1px solid #40444b; |
| | | border-radius: 8px; |
| | | padding: 16px; |
| | | margin-bottom: 12px; |
| | | transition: background-color 0.2s; |
| | | } |
| | | |
| | | .mcp-tool-card:hover { |
| | | background: #40444b; |
| | | } |
| | | |
| | | .mcp-tool-header { |
| | | display: flex; |
| | | justify-content: space-between; |
| | | align-items: center; |
| | | margin-bottom: 8px; |
| | | } |
| | | |
| | | .mcp-tool-name { |
| | | font-weight: 600; |
| | | color: white; |
| | | font-size: 14px; |
| | | } |
| | | |
| | | .mcp-tool-actions { |
| | | display: flex; |
| | | gap: 8px; |
| | | } |
| | | |
| | | .mcp-edit-btn { |
| | | padding: 4px 10px; |
| | | border: none; |
| | | border-radius: 4px; |
| | | background-color: #2196f3; |
| | | color: white; |
| | | cursor: pointer; |
| | | font-size: 12px; |
| | | transition: background-color 0.2s; |
| | | } |
| | | |
| | | .mcp-edit-btn:hover { |
| | | background-color: #1976d2; |
| | | } |
| | | |
| | | .mcp-delete-btn { |
| | | padding: 4px 10px; |
| | | border: none; |
| | | border-radius: 4px; |
| | | background-color: #f44336; |
| | | color: white; |
| | | cursor: pointer; |
| | | font-size: 12px; |
| | | transition: background-color 0.2s; |
| | | } |
| | | |
| | | .mcp-delete-btn:hover { |
| | | background-color: #d32f2f; |
| | | } |
| | | |
| | | .mcp-tool-description { |
| | | color: #b9bbbe; |
| | | font-size: 13px; |
| | | line-height: 1.4; |
| | | margin-bottom: 12px; |
| | | } |
| | | |
| | | .mcp-tool-info { |
| | | background: #2f3136; |
| | | border-radius: 4px; |
| | | padding: 8px; |
| | | } |
| | | |
| | | .mcp-tool-info-row { |
| | | display: flex; |
| | | justify-content: space-between; |
| | | margin-bottom: 4px; |
| | | } |
| | | |
| | | .mcp-tool-info-label { |
| | | color: #b9bbbe; |
| | | font-size: 12px; |
| | | } |
| | | |
| | | .mcp-tool-info-value { |
| | | color: white; |
| | | font-size: 12px; |
| | | font-weight: 500; |
| | | } |
| | | |
| | | .mcp-actions { |
| | | text-align: center; |
| | | } |
| | | |
| | | .properties-container { |
| | | background: #2f3136; |
| | | border: 1px solid #40444b; |
| | | border-radius: 6px; |
| | | padding: 16px; |
| | | margin-bottom: 12px; |
| | | } |
| | | |
| | | .properties-container #addMcpPropertyBtn { |
| | | display: block; |
| | | margin: 0 auto; |
| | | } |
| | | |
| | | .properties-container #addMcpPropertyBtn:hover { |
| | | background: #4752c4; |
| | | } |
| | | |
| | | .mcp-checkbox-label { |
| | | display: flex; |
| | | align-items: center; |
| | | gap: 8px; |
| | | margin-top: 8px; |
| | | color: #b9bbbe; |
| | | font-size: 13px; |
| | | cursor: pointer; |
| | | justify-content: flex-start; |
| | | } |
| | | |
| | | .mcp-checkbox-label input[type="checkbox"] { |
| | | width: 16px; |
| | | height: 16px; |
| | | cursor: pointer; |
| | | } |
| | | |
| | | .mcp-property-name { |
| | | color: white; |
| | | font-size: 14px; |
| | | font-weight: 500; |
| | | } |
| | | |
| | | .mcp-property-header { |
| | | display: flex; |
| | | justify-content: space-between; |
| | | align-items: center; |
| | | margin-bottom: 8px; |
| | | } |
| | | |
| | | .mcp-properties-list { |
| | | display: flex; |
| | | flex-wrap: wrap; |
| | | gap: 12px; |
| | | min-height: 60px; |
| | | padding: 8px; |
| | | } |
| | | |
| | | .input-group-header { |
| | | display: flex; |
| | | justify-content: space-between; |
| | | align-items: center; |
| | | margin-bottom: 8px; |
| | | } |
| | | |
| | | .input-group-header label { |
| | | margin-bottom: 0; |
| | | } |
| | | |
| | | .input-group-header .properties-btn-primary { |
| | | margin: 0; |
| | | } |
| | | |
| | | .mcp-empty-state { |
| | | text-align: center; |
| | | padding: 20px; |
| | | color: #999; |
| | | font-size: 14px; |
| | | width: 100%; |
| | | display: none; |
| | | } |
| | | |
| | | .properties-btn-primary { |
| | | background: #2196f3; |
| | | color: white; |
| | | border: none; |
| | | padding: 6px 12px; |
| | | border-radius: 4px; |
| | | cursor: pointer; |
| | | font-size: 12px; |
| | | font-weight: 500; |
| | | transition: background-color 0.2s; |
| | | display: block; |
| | | margin: 0 auto; |
| | | } |
| | | |
| | | .properties-btn-primary:hover { |
| | | background: #2196f3; |
| | | } |
| | | |
| | | .mcp-property-card { |
| | | background: #36393f; |
| | | border: 1px solid #40444b; |
| | | border-radius: 8px; |
| | | padding: 12px; |
| | | width: 100%; |
| | | cursor: pointer; |
| | | transition: all 0.2s ease; |
| | | } |
| | | |
| | | .mcp-property-card:hover { |
| | | background: #40444b; |
| | | border-color: #5865f2; |
| | | } |
| | | |
| | | .mcp-property-card:active { |
| | | transform: none; |
| | | } |
| | | |
| | | .mcp-property-row-label { |
| | | display: flex; |
| | | align-items: flex-start; |
| | | margin-bottom: 6px; |
| | | gap: 8px; |
| | | } |
| | | |
| | | .mcp-property-label { |
| | | color: #b9bbbe; |
| | | font-size: 13px; |
| | | width: 60px; |
| | | flex-shrink: 0; |
| | | text-align: left; |
| | | } |
| | | |
| | | .mcp-property-value { |
| | | color: white; |
| | | font-size: 13px; |
| | | flex: 1; |
| | | word-break: break-all; |
| | | } |
| | | |
| | | .mcp-property-required-badge { |
| | | color: #f44336; |
| | | font-size: 12px; |
| | | } |
| | | |
| | | .mcp-property-row-action { |
| | | display: flex; |
| | | justify-content: flex-end; |
| | | margin-top: 6px; |
| | | padding-top: 6px; |
| | | border-top: 1px solid #40444b; |
| | | } |
| | | |
| | | .mcp-property-delete-btn { |
| | | background: #f44336; |
| | | color: white; |
| | | border: none; |
| | | padding: 4px 12px; |
| | | border-radius: 4px; |
| | | cursor: pointer; |
| | | font-size: 11px; |
| | | transition: background-color 0.2s; |
| | | } |
| | | |
| | | .mcp-property-delete-btn:hover { |
| | | background: #d32f2f; |
| | | } |
| | | |
| | | .mcp-property-card-optional { |
| | | background: #4f545c; |
| | | color: #b9bbbe; |
| | | font-size: 11px; |
| | | padding: 2px 8px; |
| | | border-radius: 4px; |
| | | } |
| | | |
| | | .property-modal { |
| | | max-width: 450px; |
| | | } |
| | | |
| | | /* ==================== é³é¢å¯è§å卿 ·å¼ ==================== */ |
| | | .audio-visualizer { |
| | | position: fixed; |
| | | bottom: 100px; |
| | | left: 20px; |
| | | width: 200px; |
| | | height: 60px; |
| | | background: rgba(0, 0, 0, 0.3); |
| | | backdrop-filter: blur(10px); |
| | | border-radius: 10px; |
| | | border: 1px solid rgba(255, 255, 255, 0.1); |
| | | z-index: 999; |
| | | } |
| | | |
| | | /* æ»å¨æ¡æ ·å¼ */ |
| | | .chat-stream::-webkit-scrollbar, |
| | | .modal-body::-webkit-scrollbar, |
| | | .mcp-tools-list::-webkit-scrollbar { |
| | | width: 6px; |
| | | } |
| | | |
| | | .chat-stream::-webkit-scrollbar-track, |
| | | .modal-body::-webkit-scrollbar-track, |
| | | .mcp-tools-list::-webkit-scrollbar-track { |
| | | background: #2f3136; |
| | | border-radius: 3px; |
| | | } |
| | | |
| | | .chat-stream::-webkit-scrollbar-thumb, |
| | | .modal-body::-webkit-scrollbar-thumb, |
| | | .mcp-tools-list::-webkit-scrollbar-thumb { |
| | | background: #40444b; |
| | | border-radius: 3px; |
| | | } |
| | | |
| | | .chat-stream::-webkit-scrollbar-thumb:hover, |
| | | .modal-body::-webkit-scrollbar-thumb:hover, |
| | | .mcp-tools-list::-webkit-scrollbar-thumb:hover { |
| | | background: #4f545c; |
| | | } |
| | | |
| | | /* ==================== æå头æ¾ç¤ºåºåæ ·å¼ ==================== */ |
| | | .camera-container { |
| | | position: fixed; |
| | | top: 20px; |
| | | left: 20px; |
| | | width: 180px; |
| | | height: 240px; |
| | | background: rgba(0, 0, 0, 0.5); |
| | | backdrop-filter: blur(10px); |
| | | border-radius: 8px; |
| | | border: 1px solid rgba(255, 255, 255, 0.2); |
| | | z-index: 1000; |
| | | display: none; |
| | | overflow: hidden; |
| | | box-shadow: 0 4px 20px rgba(0, 0, 0, 0.3); |
| | | cursor: move; |
| | | } |
| | | |
| | | .camera-container.active { |
| | | display: block; |
| | | } |
| | | |
| | | .camera-container.dragging { |
| | | cursor: grabbing; |
| | | box-shadow: 0 8px 30px rgba(0, 0, 0, 0.4); |
| | | border-color: rgba(88, 101, 242, 0.5); |
| | | } |
| | | |
| | | @keyframes flipWithPosition { |
| | | 0% { |
| | | transform: var(--original-transform) rotateY(0deg); |
| | | } |
| | | |
| | | 100% { |
| | | transform: var(--original-transform) rotateY(180deg); |
| | | } |
| | | } |
| | | |
| | | |
| | | .camera-container.flip { |
| | | animation: flipWithPosition 0.5s ease-in-out 1 forwards; |
| | | } |
| | | |
| | | #cameraVideo { |
| | | width: 100%; |
| | | height: 100%; |
| | | object-fit: cover; |
| | | background: #1a1a1a; |
| | | pointer-events: none; |
| | | transform: scaleX(-1); |
| | | } |
| | | |
| | | .camera-switch-mask { |
| | | position: absolute; |
| | | top: 0; |
| | | right: 0; |
| | | bottom: 0; |
| | | left: 0; |
| | | } |
| | | |
| | | .camera-switch-container { |
| | | position: absolute; |
| | | bottom: 10px; |
| | | right: 10px; |
| | | } |
| | | |
| | | .camera-switch { |
| | | display: none; |
| | | height: 20px; |
| | | color: #fff; |
| | | } |
| | | |
| | | .camera-switch .btn-icon { |
| | | margin-bottom: 0; |
| | | } |
| | | |
| | | .camera-switch.active { |
| | | display: block; |
| | | } |
| | | |
| | | /* ==================== ååºå¼è®¾è®¡ ==================== */ |
| | | @media (max-width: 768px) { |
| | | .container { |
| | | padding: 10px; |
| | | } |
| | | |
| | | .live2d-section { |
| | | height: 60vh; |
| | | margin-bottom: 10px; |
| | | } |
| | | |
| | | .live2d-canvas { |
| | | max-width: 300px; |
| | | max-height: 450px; |
| | | } |
| | | |
| | | .control-bar { |
| | | bottom: 10px; |
| | | padding: 8px 16px; |
| | | gap: 12px; |
| | | } |
| | | |
| | | .control-btn { |
| | | width: 50px; |
| | | height: 50px; |
| | | } |
| | | |
| | | .btn-icon { |
| | | width: 20px; |
| | | height: 20px; |
| | | } |
| | | |
| | | .btn-text { |
| | | font-size: 10px; |
| | | } |
| | | |
| | | .chat-container { |
| | | width: 230px; |
| | | right: 10px; |
| | | bottom: 105px; |
| | | } |
| | | |
| | | .message-bubble { |
| | | max-width: 200px; |
| | | font-size: 12px; |
| | | } |
| | | |
| | | .modal-content { |
| | | width: 95%; |
| | | margin: 10px; |
| | | } |
| | | |
| | | .config-row { |
| | | flex-direction: column; |
| | | gap: 12px; |
| | | } |
| | | |
| | | .audio-visualizer { |
| | | width: 150px; |
| | | height: 50px; |
| | | left: 10px; |
| | | bottom: 80px; |
| | | } |
| | | |
| | | .chat-ipt input { |
| | | font-size: 12px; |
| | | } |
| | | |
| | | .camera-container { |
| | | width: 130px; |
| | | height: 180px; |
| | | } |
| | | |
| | | .status-indicator { |
| | | font-size: 12px; |
| | | } |
| | | } |
| | | |
| | | @media (max-width: 480px) { |
| | | .live2d-section { |
| | | height: 50vh; |
| | | } |
| | | |
| | | .live2d-canvas { |
| | | max-width: 250px; |
| | | max-height: 350px; |
| | | } |
| | | |
| | | .control-bar { |
| | | gap: 8px; |
| | | padding: 6px 12px; |
| | | } |
| | | |
| | | .control-btn { |
| | | width: 45px; |
| | | height: 45px; |
| | | } |
| | | |
| | | .btn-text { |
| | | display: none; |
| | | } |
| | | |
| | | .chat-stream { |
| | | width: 200px; |
| | | max-height: 150px; |
| | | } |
| | | |
| | | .audio-visualizer { |
| | | width: 120px; |
| | | height: 40px; |
| | | left: 5px; |
| | | bottom: 70px; |
| | | } |
| | | } |
| | | |
| | | /* ç«å±ä¼å */ |
| | | @media (max-height: 700px) { |
| | | .live2d-section { |
| | | height: 55vh; |
| | | } |
| | | |
| | | .live2d-canvas { |
| | | max-height: 400px; |
| | | } |
| | | |
| | | .chat-stream { |
| | | bottom: 70px; |
| | | max-height: 150px; |
| | | } |
| | | |
| | | .audio-visualizer { |
| | | bottom: 70px; |
| | | } |
| | | } |
| | | |
| | | /* 横å±ä¼å */ |
| | | @media (min-width: 1024px) and (min-height: 600px) { |
| | | .live2d-section { |
| | | height: 75vh; |
| | | } |
| | | |
| | | .live2d-canvas { |
| | | max-width: 500px; |
| | | max-height: 650px; |
| | | } |
| | | |
| | | .chat-stream { |
| | | width: 350px; |
| | | max-height: 250px; |
| | | } |
| | | |
| | | .audio-visualizer { |
| | | width: 250px; |
| | | height: 80px; |
| | | } |
| | | } |
| New file |
| | |
| | | <!DOCTYPE html> |
| | | <html lang="zh-CN"> |
| | | |
| | | <head> |
| | | <meta charset="UTF-8"> |
| | | <meta name="viewport" content="width=device-width, initial-scale=1.0"> |
| | | <title>å°æºæ°å人页é¢</title> |
| | | <link rel="stylesheet" href="css/index.css?v=0206"> |
| | | <script> |
| | | // æ£æµæ¯å¦ä½¿ç¨file://åè®®æå¼ |
| | | if (window.location.protocol === 'file:') { |
| | | document.addEventListener('DOMContentLoaded', function () { |
| | | // åå»ºèæ¯æ¨¡ç³é®ç½© |
| | | const overlayDiv = document.createElement('div'); |
| | | overlayDiv.className = 'file-protocol-overlay'; |
| | | document.body.appendChild(overlayDiv); |
| | | |
| | | // å建è¦åæ¡ |
| | | const warningDiv = document.createElement('div'); |
| | | warningDiv.id = 'fileProtocolWarning'; |
| | | warningDiv.innerHTML = ` |
| | | <h2>â ï¸ è¦åï¼è¯·ä½¿ç¨HTTPæå¡å¨æå¼æ¤é¡µé¢</h2> |
| | | <p>æ¨å½å使ç¨çæ¯æ¬å°æä»¶æ¹å¼æå¼é¡µé¢ï¼file://åè®®ï¼ï¼è¿å¯è½å¯¼è´é¡µé¢åè½å¼å¸¸ã</p> |
| | | <p>æ¨å¯ä»¥ä½¿ç¨nginxæ å°å¯å¨å°æºæ°å人页é¢ï¼ä¹å¯ä»¥è¯·æç
§ä»¥ä¸æ¥éª¤å¯å¨æµè¯è¿è¡æ¶ï¼</p> |
| | | <ol> |
| | | <li>æå¼å½ä»¤è¡ç»ç«¯</li> |
| | | <li>å½ä»¤è¡è¿å
¥å° digital-human ç®å½</li> |
| | | <li>æ§è¡ä»¥ä¸å½ä»¤å¯å¨å°æºæ°å人页é¢è¿è¡æ¶ï¼</li> |
| | | </ol> |
| | | <pre>python start.py</pre> |
| | | <p>ç¶å卿µè§å¨ä¸è®¿é®ï¼<strong>http://localhost:8006/index.html</strong></p> |
| | | `; |
| | | document.body.appendChild(warningDiv); |
| | | }); |
| | | } |
| | | </script> |
| | | </head> |
| | | |
| | | <body> |
| | | <!-- èæ¯å®¹å¨ --> |
| | | <div class="background-container" id="backgroundContainer"> |
| | | <div class="background-overlay"></div> |
| | | </div> |
| | | |
| | | <!-- ä¸»å®¹å¨ --> |
| | | <div class="container"> |
| | | |
| | | <!-- æå头æ¾ç¤ºåºåï¼å¯æå¨ï¼ --> |
| | | <div class="camera-container" id="cameraContainer"> |
| | | <video id="cameraVideo" autoplay playsinline muted></video> |
| | | <div class="camera-switch-mask" id="cameraSwitchMask"> |
| | | <div class="camera-switch-container"> |
| | | <!-- æå头忢æé® --> |
| | | <div class="camera-switch" id="cameraSwitch"> |
| | | <svg class="btn-icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="7319" width="32" height="32"><path d="M722.1 530.3c0-44.9-13.8-86.5-37.2-120.9-0.3-0.6-0.6-1.2-0.9-1.7-2.9-4.2-6.1-8.1-9.2-12-0.4-0.5-0.7-1-1.1-1.5-21.4-26.3-48.3-46.7-78.7-59.9-0.8-0.4-1.7-0.8-2.5-1.2-4.9-2-9.8-3.8-14.9-5.5-1.8-0.6-3.6-1.3-5.4-1.8-4.4-1.3-8.8-2.4-13.3-3.5-2.5-0.6-4.9-1.2-7.4-1.7-1.2-0.2-2.4-0.6-3.6-0.8-3.3-0.6-6.7-0.8-10-1.3-2.3-0.3-4.6-0.7-6.9-0.9-5.6-0.5-11.2-0.8-16.7-0.9-1 0-2-0.1-3-0.1-0.2 0-0.3 0.1-0.5 0.1-42.8 0-84.6 13.1-120.4 38.6-11.5 8.1-14.2 24.1-6.2 35.7 8 11.6 23.8 14.4 35.2 6.3 27.7-19.7 60-29.6 93.1-29.3 4.8 0 9.5 0.3 14.1 0.7 1.4 0.2 2.8 0.4 4.3 0.5 3.8 0.5 7.6 1 11.3 1.8 1.6 0.3 3.3 0.8 4.9 1.1 3.7 0.8 7.3 1.7 10.9 2.8 1.1 0.4 2.2 0.8 3.4 1.2 4.1 1.3 8.1 2.8 12 4.5 0.4 0.2 0.8 0.4 1.2 0.5 23.6 10.3 44.3 26.1 60.4 45.9 0.1 0.1 0.2 0.3 0.3 0.4 22.7 28 36.4 63.9 36.4 102.9h-42.2L697 632.9l67.5-102.6h-42.4z m-119 133c-27.9 19.8-60.5 29.7-93.9 29.3-4.4-0.1-8.8-0.3-13.1-0.7-1.8-0.2-3.5-0.5-5.3-0.7-3.4-0.5-6.8-0.9-10.1-1.6-2-0.4-4-0.9-6.1-1.4-3.3-0.8-6.5-1.5-9.7-2.5-1.5-0.5-3-1-4.6-1.5-3.7-1.2-7.3-2.5-10.8-4-0.8-0.3-1.6-0.7-2.4-1.1-4.1-1.9-8.2-3.8-12.2-6l-0.6-0.3c-13.4-7.5-25.7-16.8-36.4-27.7-0.2-0.2-0.3-0.4-0.5-0.6-3.3-3.4-6.5-6.9-9.5-10.7-0.6-0.8-1.3-1.6-1.9-2.5-21.9-27.8-35.1-63-35.1-101.2h42.2l-67.5-102.6-67.5 102.6h42.2c0 45 13.9 86.7 37.3 121.1 0.3 0.5 0.5 1 0.8 1.5 2.4 3.5 5.1 6.8 7.7 10.1 1 1.3 1.9 2.6 2.9 3.8 3.9 4.7 7.9 9.2 12.1 13.5 0.4 0.4 0.8 0.9 1.2 1.3 14.1 14.3 30.1 26.4 47.4 36 0.5 0.3 0.9 0.6 1.4 0.8 5 2.7 10.1 5.2 15.3 7.5l3.9 1.8c4.4 1.9 9 3.5 13.6 5.1 2.2 0.7 4.4 1.5 6.6 2.2 4 1.2 8.1 2.2 12.3 3.2 2.8 0.7 5.5 1.4 8.3 1.9 1.2 0.3 2.3 0.6 3.4 0.8 3.9 0.7 7.8 1.1 11.8 1.6l4.2 0.6c7 0.7 14.1 1.2 21.1 1.2 42.9 0 84.7-13.3 120.6-38.8 11.4-8.2 14.2-24.1 6.2-35.8-8-11.5-23.8-14.3-35.3-6.2z m271.3-421.6H763c-26.5 0-82.9-119.7-112.5-119.7H370.6c-29.6 0-85.9 119.7-112.4 119.7H147.5c-46.3 0-83.9 40.2-83.9 89.7v478.8c0 49.6 37.6 89.8 83.9 89.8h726.9c46.3 0 83.9-40.1 83.9-89.8V331.4c0-49.5-37.6-89.7-83.9-89.7z m28 538.6c0 33.1-25 59.8-55.9 59.8h-671c-30.9 0-55.9-26.8-55.9-59.8V361.4c0-33 25-59.8 55.9-59.8h111.2c25.8 0 82-119.7 111.6-119.7h223.2c29.5 0 85.6 119.7 111.5 119.7h113.5c30.9 0 55.9 26.8 55.9 59.8v418.9z" p-id="7320" fill="#ffffff"></path></svg> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | |
| | | <!-- è¿æ¥ç¶ææç¤ºå¨ - 页é¢é¡¶é¨ä¸é¨ --> |
| | | <div class="connection-status-top"> |
| | | <div class="status-indicator"> |
| | | <span class="status-dot status-disconnected"></span> |
| | | <span id="connectionStatus">离线</span> |
| | | </div> |
| | | </div> |
| | | |
| | | <!-- 模åå è½½æç¤º --> |
| | | <div class="model-container"> |
| | | <div class="model-loading" id="modelLoading"> |
| | | <div class="loading-char-float"> |
| | | <div class="main-char"> |
| | | <span>模</span><span>å</span><span>å </span><span>è½½</span><span>ä¸</span><span>â¨</span> |
| | | </div> |
| | | <div class="shadow-char">模åå è½½ä¸â¨</div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | |
| | | <!-- Live2D Canvas å®¹å¨ --> |
| | | <canvas id="live2d-stage"></canvas> |
| | | |
| | | <!-- èå¤©æ¶æ¯æµï¼å¼¹å¹æ ·å¼ï¼ --> |
| | | <div class="chat-container"> |
| | | <div class="chat-stream" id="chatStream"> |
| | | <!-- èå¤©æ¶æ¯å°å¨ææå
¥è¿é --> |
| | | </div> |
| | | <div class="chat-ipt" id="chatIpt"> |
| | | <input type="text" id="messageInput" autocomplete="off" placeholder="è¾å
¥æ¶æ¯ï¼æEnteråé"> |
| | | </div> |
| | | </div> |
| | | |
| | | <!-- åºé¨æ§å¶æ --> |
| | | <div class="control-bar"> |
| | | <button class="control-btn" id="settingsBtn" title="设置"> |
| | | <svg class="btn-icon" viewBox="0 0 24 24" fill="currentColor"> |
| | | <path |
| | | d="M12 15.5A3.5 3.5 0 0 1 8.5 12A3.5 3.5 0 0 1 12 8.5A3.5 3.5 0 0 1 15.5 12A3.5 3.5 0 0 1 12 15.5M19.43 12.97C19.47 12.65 19.5 12.33 19.5 12C19.5 11.67 19.47 11.34 19.43 11L21.54 9.37C21.73 9.22 21.78 8.95 21.66 8.73L19.66 5.27C19.54 5.05 19.27 4.96 19.05 5.05L16.56 6.05C16.04 5.66 15.5 5.32 14.87 5.07L14.5 2.42C14.46 2.18 14.25 2 14 2H10C9.75 2 9.54 2.18 9.5 2.42L9.13 5.07C8.5 5.32 7.96 5.66 7.44 6.05L4.95 5.05C4.73 4.96 4.46 5.05 4.34 5.27L2.34 8.73C2.22 8.95 2.27 9.22 2.46 9.37L4.57 11C4.53 11.34 4.5 11.67 4.5 12C4.5 12.33 4.53 12.65 4.57 12.97L2.46 14.63C2.27 14.78 2.22 15.05 2.34 15.27L4.34 18.73C4.46 18.95 4.73 19.03 4.95 18.95L7.44 17.94C7.96 18.34 8.5 18.68 9.13 18.93L9.5 21.58C9.54 21.82 9.75 22 10 22H14C14.25 22 14.46 21.82 14.5 21.58L14.87 18.93C15.5 18.68 16.04 18.34 16.56 17.94L19.05 18.95C19.27 19.03 19.54 18.95 19.66 18.73L21.66 15.27C21.78 15.05 21.73 14.78 21.54 14.63L19.43 12.97Z" /> |
| | | </svg> |
| | | <span class="btn-text">设置</span> |
| | | </button> |
| | | |
| | | <button class="control-btn" id="cameraBtn" title="请å
è¿æ¥æå¡å¨" disabled> |
| | | <svg class="btn-icon" viewBox="0 0 24 24" fill="currentColor"> |
| | | <path |
| | | d="M17,10.5V7A1,1 0 0,0 16,6H4A1,1 0 0,0 3,7V17A1,1 0 0,0 4,18H16A1,1 0 0,0 17,17V13.5L21,17.5V6.5L17,10.5Z" /> |
| | | </svg> |
| | | <span class="btn-text">æå头</span> |
| | | </button> |
| | | |
| | | <button class="control-btn dial-btn" id="dialBtn" title="æ¨å·"> |
| | | <svg class="btn-icon" viewBox="0 0 24 24" fill="currentColor"> |
| | | <path |
| | | d="M6.62,10.79C8.06,13.62 10.38,15.94 13.21,17.38L15.41,15.18C15.69,14.9 16.08,14.82 16.43,14.93C17.55,15.3 18.75,15.5 20,15.5A1,1 0 0,1 21,16.5V20A1,1 0 0,1 20,21A17,17 0 0,1 3,4A1,1 0 0,1 4,3H7.5A1,1 0 0,1 8.5,4C8.5,5.25 8.7,6.45 9.07,7.57C9.18,7.92 9.1,8.31 8.82,8.59L6.62,10.79Z" /> |
| | | </svg> |
| | | <span class="btn-text">æ¨å·</span> |
| | | </button> |
| | | |
| | | <button class="control-btn" id="recordBtn" title="å¼å§å½é³" disabled> |
| | | <svg class="btn-icon" viewBox="0 0 24 24" fill="currentColor"> |
| | | <path |
| | | d="M12,2A3,3 0 0,1 15,5V11A3,3 0 0,1 12,14A3,3 0 0,1 9,11V5A3,3 0 0,1 12,2M19,11C19,14.53 16.39,17.44 13,17.93V21H11V17.93C7.61,17.44 5,14.53 5,11H7A5,5 0 0,0 12,16A5,5 0 0,0 17,11H19Z" /> |
| | | </svg> |
| | | <span class="btn-text">å½é³</span> |
| | | </button> |
| | | </div> |
| | | </div> |
| | | |
| | | <!-- è®¾ç½®å¼¹çª --> |
| | | <div class="modal" id="settingsModal"> |
| | | <div class="modal-content settings-modal"> |
| | | <div class="modal-header"> |
| | | <h2>设置</h2> |
| | | <button class="close-btn" id="closeSettingsBtn">×</button> |
| | | </div> |
| | | <div class="modal-body"> |
| | | <div class="settings-tabs"> |
| | | <button class="tab-btn active" data-tab="device">设å¤é
ç½®</button> |
| | | <button class="tab-btn" data-tab="wakeword">å¤éè¯</button> |
| | | <button class="tab-btn" data-tab="mcp">MCPå·¥å
·</button> |
| | | <button class="tab-btn" data-tab="other">æ°å人ç®è¤</button> |
| | | </div> |
| | | |
| | | <div class="tab-content active" id="deviceTab"> |
| | | <!-- 设å¤é
ç½®é¢æ¿ --> |
| | | <div class="config-panel"> |
| | | <div class="control-panel"> |
| | | <div class="config-row"> |
| | | <div class="config-item"> |
| | | <label for="deviceMac">设å¤MAC:</label> |
| | | <input type="text" id="deviceMac" placeholder="device-id"> |
| | | </div> |
| | | </div> |
| | | <div class="config-row"> |
| | | <div class="config-item"> |
| | | <label for="clientId">客æ·ç«¯ID:</label> |
| | | <input type="text" id="clientId" value="web_test_client" placeholder="client-id"> |
| | | </div> |
| | | <div class="config-item"> |
| | | <label for="deviceName">设å¤åç§°:</label> |
| | | <input type="text" id="deviceName" value="Webæµè¯è®¾å¤" maxlength="50" |
| | | placeholder="deviceName"> |
| | | </div> |
| | | </div> |
| | | <div class="config-row"> |
| | | <div class="config-item"> |
| | | <label for="emojiEnabled">æ
绪表æ
:</label> |
| | | <select id="emojiEnabled" class="model-select"> |
| | | <option value="true">å¯ç¨</option> |
| | | <option value="false" selected>ç¦ç¨</option> |
| | | </select> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | |
| | | <!-- è¿æ¥ä¿¡æ¯é¢æ¿ --> |
| | | <div class="connection-controls"> |
| | | <div class="input-group"> |
| | | <label for="otaUrl">OTAæå¡å¨å°å:</label> |
| | | <input type="text" id="otaUrl" value="http://127.0.0.1:8002/xiaozhi/ota/" |
| | | placeholder="OTAæå¡å¨å°åï¼å¦ï¼http://127.0.0.1:8002/xiaozhi/ota/" /> |
| | | </div> |
| | | <div class="input-group"> |
| | | <label for="serverUrl">WebSocketæå¡å¨å°å:</label> |
| | | <input type="text" id="serverUrl" value="" readonly disabled |
| | | placeholder="å¡«åOTAå°ååï¼ç¹å»æ¨å·æé®èªå¨è¿æ¥" /> |
| | | </div> |
| | | <div class="input-group"> |
| | | <label for="visionUrl">è§è§åæå°å:</label> |
| | | <input type="text" id="visionUrl" value="" readonly disabled placeholder="æå建ç«wsè¿æ¥åèªå¨è·å" /> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | |
| | | <div class="tab-content" id="wakewordTab"> |
| | | <div class="config-panel"> |
| | | <div class="control-panel"> |
| | | <div class="config-row"> |
| | | <div class="config-item"> |
| | | <label for="wakewordEnabled">å¯ç¨æ¬å°å¤éè¯:</label> |
| | | <select id="wakewordEnabled" class="model-select"> |
| | | <option value="true">å¯ç¨</option> |
| | | <option value="false">ç¦ç¨</option> |
| | | </select> |
| | | </div> |
| | | </div> |
| | | <div class="config-row"> |
| | | <div class="config-item"> |
| | | <label for="wakewordWsUrl">å¤éè¯æå¡å°å:</label> |
| | | <input type="text" id="wakewordWsUrl" placeholder="ws://127.0.0.1:8006/wakeword-ws"> |
| | | </div> |
| | | </div> |
| | | <div class="config-row"> |
| | | <div class="config-item"> |
| | | <label for="wakewordList">å¤éè¯é
ç½® (ä¸è¡ä¸ä¸ª):</label> |
| | | <textarea id="wakewordList" placeholder="ä¾å¦ï¼ å°æºå°æº ä½ å¥½å°æº"></textarea> |
| | | </div> |
| | | </div> |
| | | <div class="modal-actions"> |
| | | <button type="button" class="btn-primary" id="applyWakewordBtn">åºç¨å¤éè¯</button> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | |
| | | <div class="tab-content" id="mcpTab"> |
| | | <!-- MCP å·¥å
·ç®¡çåºå --> |
| | | <div class="mcp-tools-container"> |
| | | <div class="mcp-tools-header"> |
| | | <h3>MCP å·¥å
·ç®¡ç</h3> |
| | | </div> |
| | | <div class="mcp-tools-panel" id="mcpToolsPanel"> |
| | | <div class="mcp-tools-list" id="mcpToolsContainer"> |
| | | <!-- å·¥å
·å表å°å¨ææå
¥è¿é --> |
| | | </div> |
| | | <div class="mcp-actions"> |
| | | <button class="btn-primary" id="addMcpToolBtn"> |
| | | â æ·»å æ°å·¥å
· |
| | | </button> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | |
| | | <div class="tab-content" id="otherTab"> |
| | | <div class="other-settings-panel"> |
| | | <div class="control-panel"> |
| | | <div class="config-row"> |
| | | <div class="config-item"> |
| | | <label>éæ©æ¨¡å:</label> |
| | | <select id="live2dModelSelect" class="model-select"> |
| | | <option value="hiyori_pro_zh">hiyori (æ¥æ¥)</option> |
| | | <option value="natori_pro_zh">natori (åå)</option> |
| | | </select> |
| | | </div> |
| | | </div> |
| | | <div class="config-row"> |
| | | <div class="config-item"> |
| | | <label></label> |
| | | <button class="background-btn" id="backgroundBtn" title="åæ¢èæ¯"> |
| | | <svg class="btn-icon" viewBox="0 0 24 24" fill="currentColor"> |
| | | <path |
| | | d="M12,18A6,6 0 0,1 6,12C6,11 6.25,10.03 6.7,9.2L5.24,7.74C4.46,8.97 4,10.43 4,12A8,8 0 0,0 12,20V23L16,19L12,15V18M12,4V1L8,5L12,9V6A6,6 0 0,1 18,12C18,13 17.75,13.97 17.3,14.8L18.76,16.26C19.54,15.03 20,13.57 20,12A8,8 0 0,0 12,4Z" /> |
| | | </svg> |
| | | <span class="btn-text">åæ¢èæ¯</span> |
| | | </button> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | |
| | | <!-- MCP å·¥å
·ç¼è¾æ¨¡ææ¡ --> |
| | | <div id="mcpToolModal" class="modal"> |
| | | <div class="modal-content"> |
| | | <div class="modal-header"> |
| | | <h2 id="mcpModalTitle">æ·»å å·¥å
·</h2> |
| | | <button class="close-btn" id="closeMcpModalBtn">×</button> |
| | | </div> |
| | | <div class="modal-body"> |
| | | <div id="mcpErrorContainer"></div> |
| | | <form id="mcpToolForm"> |
| | | <div class="input-group"> |
| | | <label for="mcpToolName">å·¥å
·åç§° *</label> |
| | | <input type="text" id="mcpToolName" placeholder="ä¾å¦: self.get_device_status" required> |
| | | </div> |
| | | <div class="input-group"> |
| | | <label for="mcpToolDescription">å·¥å
·æè¿° *</label> |
| | | <textarea id="mcpToolDescription" placeholder="è¯¦ç»æè¿°å·¥å
·çåè½å使ç¨åºæ¯..." required></textarea> |
| | | </div> |
| | | <div class="input-group"> |
| | | <div class="input-group-header"> |
| | | <label>è¾å
¥åæ°</label> |
| | | <button type="button" class="properties-btn-primary" id="addMcpPropertyBtn"> |
| | | â æ·»å åæ° |
| | | </button> |
| | | </div> |
| | | <div class="properties-container"> |
| | | <div class="mcp-empty-state" id="mcpEmptyState"> |
| | | ææ åæ°ï¼ç¹å»ä¸æ¹æé®æ·»å åæ° |
| | | </div> |
| | | <div class="mcp-properties-list" id="mcpPropertiesContainer"> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div class="input-group"> |
| | | <label for="mcpMockResponse"> |
| | | 模æè¿åç»æ (JSON æ ¼å¼ï¼å¯é) |
| | | <span style="font-size: 12px; color: #999; font-weight: normal;">- ç空åè¿åé»è®¤æåæ¶æ¯</span> |
| | | </label> |
| | | <textarea id="mcpMockResponse" placeholder='{"success": true, "data": "æ§è¡æå"}'></textarea> |
| | | </div> |
| | | <div class="modal-actions"> |
| | | <button type="button" class="btn-secondary" id="cancelMcpBtn">åæ¶</button> |
| | | <button type="submit" class="btn-primary">ä¿å</button> |
| | | </div> |
| | | </form> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | |
| | | <!-- åæ°ç¼è¾æ¨¡ææ¡ --> |
| | | <div id="mcpPropertyModal" class="modal"> |
| | | <div class="modal-content property-modal"> |
| | | <div class="modal-header"> |
| | | <h2 id="mcpPropertyModalTitle">ç¼è¾åæ°</h2> |
| | | <button class="close-btn" id="closeMcpPropertyModalBtn">×</button> |
| | | </div> |
| | | <div class="modal-body"> |
| | | <form id="mcpPropertyForm"> |
| | | <input type="hidden" id="mcpPropertyIndex" value="-1"> |
| | | <div class="input-group"> |
| | | <label for="mcpPropertyName">åæ°åç§° *</label> |
| | | <input type="text" id="mcpPropertyName" placeholder="ä¾å¦: param_1" required> |
| | | </div> |
| | | <div class="input-group"> |
| | | <label for="mcpPropertyType">æ°æ®ç±»å *</label> |
| | | <select id="mcpPropertyType" class="model-select" required> |
| | | <option value="string">å符串</option> |
| | | <option value="integer">æ´æ°</option> |
| | | <option value="number">æ°å</option> |
| | | <option value="boolean">å¸å°å¼</option> |
| | | <option value="array">æ°ç»</option> |
| | | <option value="object">对象</option> |
| | | </select> |
| | | </div> |
| | | <div class="input-group" id="mcpPropertyRangeGroup" style="display: none;"> |
| | | <div class="config-row"> |
| | | <div class="config-item"> |
| | | <label for="mcpPropertyMinimum">æå°å¼</label> |
| | | <input type="number" id="mcpPropertyMinimum" placeholder="å¯é"> |
| | | </div> |
| | | <div class="config-item"> |
| | | <label for="mcpPropertyMaximum">æå¤§å¼</label> |
| | | <input type="number" id="mcpPropertyMaximum" placeholder="å¯é"> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div class="input-group"> |
| | | <label for="mcpPropertyDescription">åæ°æè¿°</label> |
| | | <input type="text" id="mcpPropertyDescription" placeholder="å¯é"> |
| | | </div> |
| | | <div class="input-group"> |
| | | <label class="mcp-checkbox-label"> |
| | | <input type="checkbox" id="mcpPropertyRequired"> |
| | | å¿
å¡«åæ° |
| | | </label> |
| | | </div> |
| | | <div class="modal-actions"> |
| | | <button type="button" class="btn-secondary" id="cancelMcpPropertyBtn">åæ¶</button> |
| | | <button type="submit" class="btn-primary">ä¿å</button> |
| | | </div> |
| | | </form> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | |
| | | <!-- èæ¯å è½½ --> |
| | | <script src="js/ui/background-load.js?v=0205"></script> |
| | | |
| | | <!-- PIXI.js 2D渲æå¼æ --> |
| | | <script src="js/live2d/pixi.js?v=0205"></script> |
| | | |
| | | <!-- Live2D Cubism 4.0 SDK --> |
| | | <script src="js/live2d/live2dcubismcore.min.js?v=0205"></script> |
| | | <script src="js/live2d/cubism4.min.js?v=0205"></script> |
| | | |
| | | <!-- Live2D 管çå¨ --> |
| | | <script src="js/live2d/live2d.js?v=0205"></script> |
| | | |
| | | <!-- Opusè§£ç åº --> |
| | | <script src="js/utils/libopus.js?v=0205"></script> |
| | | |
| | | <!-- 主åºç¨å
¥å£ --> |
| | | <script type="module" src="js/app.js?v=0205"></script> |
| | | |
| | | <!-- å
¨å±é误å¤ç --> |
| | | <script> |
| | | // æ·»å å
¨å±é误å¤ç |
| | | window.addEventListener('error', function (event) { |
| | | console.error('å
¨å±é误:', event.error); |
| | | }); |
| | | |
| | | // æ·»å æªå¤ççPromiseæç»å¤ç |
| | | window.addEventListener('unhandledrejection', function (event) { |
| | | console.error('æªå¤ççPromiseæç»:', event.reason); |
| | | }); |
| | | </script> |
| | | </body> |
| | | |
| | | </html> |
| New file |
| | |
| | | // 主åºç¨å
¥å£ |
| | | import { checkOpusLoaded, initOpusEncoder } from './core/audio/opus-codec.js?v=0205'; |
| | | import { getAudioPlayer } from './core/audio/player.js?v=0205'; |
| | | import { checkMicrophoneAvailability, isHttpNonLocalhost } from './core/audio/recorder.js?v=0205'; |
| | | import { initMcpTools } from './core/mcp/tools.js?v=0205'; |
| | | import { startWakewordBridgeListener } from './core/network/wakeword-bridge.js?v=0205'; |
| | | import { uiController } from './ui/controller.js?v=0205'; |
| | | import { log } from './utils/logger.js?v=0205'; |
| | | |
| | | // è¾
å©å½æ°ï¼å°Base64æ°æ®è½¬æ¢ä¸ºBlob |
| | | function dataURItoBlob(dataURI) { |
| | | const byteString = atob(dataURI.split(',')[1]); |
| | | const mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0]; |
| | | const ab = new ArrayBuffer(byteString.length); |
| | | const ia = new Uint8Array(ab); |
| | | for (let i = 0; i < byteString.length; i++) { |
| | | ia[i] = byteString.charCodeAt(i); |
| | | } |
| | | return new Blob([ab], { type: mimeString }); |
| | | } |
| | | |
| | | // åºç¨ç±» |
| | | class App { |
| | | constructor() { |
| | | this.uiController = null; |
| | | this.audioPlayer = null; |
| | | this.live2dManager = null; |
| | | this.cameraStream = null; |
| | | this.currentFacingMode = 'user'; |
| | | } |
| | | |
| | | // åå§ååºç¨ |
| | | async init() { |
| | | log('æ£å¨åå§ååºç¨...', 'info'); |
| | | // åå§åUIæ§å¶å¨ |
| | | this.uiController = uiController; |
| | | this.uiController.init(); |
| | | // æ£æ¥Opusåº |
| | | checkOpusLoaded(); |
| | | // åå§åOpusç¼ç å¨ |
| | | initOpusEncoder(); |
| | | // åå§åé³é¢ææ¾å¨ |
| | | this.audioPlayer = getAudioPlayer(); |
| | | await this.audioPlayer.start(); |
| | | // åå§åMCPå·¥å
· |
| | | initMcpTools(); |
| | | // åå§åæ¬å°å¤éäºä»¶çå¬ |
| | | startWakewordBridgeListener(); |
| | | // æ£æ¥éº¦å
é£å¯ç¨æ§ |
| | | await this.checkMicrophoneAvailability(); |
| | | // æ£æ¥æå头å¯ç¨æ§ |
| | | this.checkCameraAvailability(); |
| | | // åå§åLive2D |
| | | await this.initLive2D(); |
| | | // åå§åæå头 |
| | | this.initCamera(); |
| | | // å
³éå è½½loading |
| | | this.setModelLoadingStatus(false); |
| | | log('åºç¨åå§å宿', 'success'); |
| | | } |
| | | |
| | | // åå§åLive2D |
| | | async initLive2D() { |
| | | try { |
| | | // æ£æ¥Live2DManageræ¯å¦å·²å è½½ |
| | | if (typeof window.Live2DManager === 'undefined') { |
| | | throw new Error('Live2DManageræªå è½½ï¼è¯·æ£æ¥èæ¬å¼å
¥é¡ºåº'); |
| | | } |
| | | this.live2dManager = new window.Live2DManager(); |
| | | await this.live2dManager.initializeLive2D(); |
| | | // æ´æ°UIç¶æ |
| | | const live2dStatus = document.getElementById('live2dStatus'); |
| | | if (live2dStatus) { |
| | | live2dStatus.textContent = 'â å·²å è½½'; |
| | | live2dStatus.className = 'status loaded'; |
| | | } |
| | | log('Live2Dåå§å宿', 'success'); |
| | | } catch (error) { |
| | | log(`Live2Dåå§å失败: ${error.message}`, 'error'); |
| | | // æ´æ°UIç¶æ |
| | | const live2dStatus = document.getElementById('live2dStatus'); |
| | | if (live2dStatus) { |
| | | live2dStatus.textContent = 'â å 载失败'; |
| | | live2dStatus.className = 'status error'; |
| | | } |
| | | } |
| | | } |
| | | |
| | | // 设置modelå è½½ç¶æ |
| | | setModelLoadingStatus(isLoading) { |
| | | const modelLoading = document.getElementById('modelLoading'); |
| | | if (modelLoading) { |
| | | modelLoading.style.display = isLoading ? 'flex' : 'none'; |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * æ£æ¥éº¦å
é£å¯ç¨æ§ |
| | | * å¨åºç¨åå§åæ¶è°ç¨ï¼æ£æ¥éº¦å
飿¯å¦å¯ç¨å¹¶æ´æ°UIç¶æ |
| | | */ |
| | | async checkMicrophoneAvailability() { |
| | | try { |
| | | const isAvailable = await checkMicrophoneAvailability(); |
| | | const isHttp = isHttpNonLocalhost(); |
| | | // ä¿åå¯ç¨æ§ç¶æå°å
¨å±åé |
| | | window.microphoneAvailable = isAvailable; |
| | | window.isHttpNonLocalhost = isHttp; |
| | | // æ´æ°UI |
| | | if (this.uiController) { |
| | | this.uiController.updateMicrophoneAvailability(isAvailable, isHttp); |
| | | } |
| | | log(`麦å
é£å¯ç¨æ§æ£æ¥å®æ: ${isAvailable ? 'å¯ç¨' : 'ä¸å¯ç¨'}`, isAvailable ? 'success' : 'warning'); |
| | | } catch (error) { |
| | | log(`æ£æ¥éº¦å
é£å¯ç¨æ§å¤±è´¥: ${error.message}`, 'error'); |
| | | // é»è®¤è®¾ç½®ä¸ºä¸å¯ç¨ |
| | | window.microphoneAvailable = false; |
| | | window.isHttpNonLocalhost = isHttpNonLocalhost(); |
| | | if (this.uiController) { |
| | | this.uiController.updateMicrophoneAvailability(false, window.isHttpNonLocalhost); |
| | | } |
| | | } |
| | | } |
| | | |
| | | // æ£æ¥æå头å¯ç¨æ§ |
| | | checkCameraAvailability() { |
| | | window.cameraAvailable = true; |
| | | log('æå头å¯ç¨æ§æ£æ¥å®æ: é»è®¤å·²ç»å®éªè¯ç ', 'success'); |
| | | } |
| | | |
| | | // åå§åæå头 |
| | | async initCamera() { |
| | | const cameraContainer = document.getElementById('cameraContainer'); |
| | | const cameraVideo = document.getElementById('cameraVideo'); |
| | | const cameraSwitch = document.getElementById('cameraSwitch'); |
| | | const cameraSwitchMask = document.getElementById('cameraSwitchMask'); |
| | | const dialBtn = document.getElementById('dialBtn'); |
| | | |
| | | if (!cameraContainer || !cameraVideo) { |
| | | log('æå头å
ç´ æªæ¾å°ï¼è·³è¿åå§å', 'warning'); |
| | | return Promise.resolve(false); |
| | | } |
| | | |
| | | let isDragging = false; |
| | | let currentX, currentY, initialX, initialY; |
| | | let xOffset = 0, yOffset = 0; |
| | | |
| | | cameraContainer.addEventListener('mousedown', dragStart); |
| | | document.addEventListener('mousemove', drag); |
| | | document.addEventListener('mouseup', dragEnd); |
| | | cameraContainer.addEventListener('touchstart', dragStart, { passive: false }); |
| | | document.addEventListener('touchmove', drag, { passive: false }); |
| | | document.addEventListener('touchend', dragEnd); |
| | | |
| | | function dragStart(e) { |
| | | if (e.type === 'touchstart') { |
| | | initialX = e.touches[0].clientX - xOffset; |
| | | initialY = e.touches[0].clientY - yOffset; |
| | | } else { |
| | | initialX = e.clientX - xOffset; |
| | | initialY = e.clientY - yOffset; |
| | | } |
| | | isDragging = true; |
| | | cameraContainer.classList.add('dragging'); |
| | | } |
| | | |
| | | function drag(e) { |
| | | if (isDragging) { |
| | | e.preventDefault(); |
| | | if (e.type === 'touchmove') { |
| | | currentX = e.touches[0].clientX - initialX; |
| | | currentY = e.touches[0].clientY - initialY; |
| | | } else { |
| | | currentX = e.clientX - initialX; |
| | | currentY = e.clientY - initialY; |
| | | } |
| | | xOffset = currentX; |
| | | yOffset = currentY; |
| | | cameraContainer.style.transform = `translate3d(${currentX}px, ${currentY}px, 0)`; |
| | | } |
| | | } |
| | | |
| | | function dragEnd() { |
| | | initialX = currentX; |
| | | initialY = currentY; |
| | | isDragging = false; |
| | | cameraContainer.classList.remove('dragging'); |
| | | } |
| | | |
| | | return new Promise((resolve) => { |
| | | window.startCamera = async () => { |
| | | try { |
| | | if (!navigator.mediaDevices || !navigator.mediaDevices.getUserMedia) { |
| | | log('æµè§å¨ä¸æ¯ææå头API', 'warning'); |
| | | return false; |
| | | } |
| | | log('æ£å¨è¯·æ±æå头æé...', 'info'); |
| | | this.cameraStream = await navigator.mediaDevices.getUserMedia({ |
| | | video: { width: 180, height: 240, facingMode: this.currentFacingMode }, |
| | | audio: false |
| | | }); |
| | | cameraVideo.srcObject = this.cameraStream; |
| | | const devices = await navigator.mediaDevices.enumerateDevices(); |
| | | const videoDevices = devices.filter(device => device.kind === 'videoinput'); |
| | | if (videoDevices.length > 1) { |
| | | if (cameraSwitch) cameraSwitch.classList.add('active'); |
| | | } |
| | | cameraContainer.classList.add('active'); |
| | | |
| | | // åæ¢æ¶æææ
åµ |
| | | const hasActive = dialBtn.classList.contains('dial-active'); |
| | | if (!hasActive) { |
| | | cameraContainer.classList.remove('active'); |
| | | cameraSwitch.classList.remove('active'); |
| | | window.stopCamera(); |
| | | } |
| | | log('æå头已å¯å¨', 'success'); |
| | | return true; |
| | | } catch (error) { |
| | | log(`å¯å¨æå头失败: ${error.name} - ${error.message}`, 'error'); |
| | | if (error.name === 'NotAllowedError') { |
| | | log('æå头æé被æç»ï¼è¯·æ£æ¥æµè§å¨è®¾ç½®', 'warning'); |
| | | } else if (error.name === 'NotFoundError') { |
| | | log('æªæ¾å°æå头设å¤', 'warning'); |
| | | } else if (error.name === 'NotReadableError') { |
| | | log('æå头已被å
¶ä»ç¨åºå ç¨', 'warning'); |
| | | } |
| | | return false; |
| | | } |
| | | }; |
| | | |
| | | window.stopCamera = () => { |
| | | if (this.cameraStream) { |
| | | this.cameraStream.getTracks().forEach(track => track.stop()); |
| | | this.cameraStream = null; |
| | | cameraVideo.srcObject = null; |
| | | log('æå头已å
³é', 'info'); |
| | | } |
| | | }; |
| | | |
| | | window.switchCamera = async() => { |
| | | if (window.switchCameraTimer) return; |
| | | if (this.cameraStream) { |
| | | const currentTransform = window.getComputedStyle(cameraContainer).transform; |
| | | const originalTransform = currentTransform === 'none' ? 'translate(0px, 0px)' : currentTransform; |
| | | cameraContainer.style.setProperty('--original-transform', originalTransform); |
| | | cameraContainer.classList.add('flip'); |
| | | if (cameraSwitchMask) cameraSwitchMask.style.opacity = 0; |
| | | this.currentFacingMode = this.currentFacingMode === 'user' ? 'environment' : 'user'; |
| | | window.stopCamera(); |
| | | window.startCamera(); |
| | | |
| | | window.switchCameraTimer = setTimeout(() => { |
| | | if (this.currentFacingMode === 'user') { |
| | | cameraVideo.style.transform = 'scaleX(-1)'; |
| | | } else { |
| | | cameraVideo.style.transform = 'scaleX(1)'; |
| | | } |
| | | window.switchCameraTimer = null; |
| | | cameraContainer.classList.remove('flip'); |
| | | cameraContainer.style.removeProperty('--original-transform'); |
| | | if (cameraSwitchMask) cameraSwitchMask.style.opacity = 1; |
| | | }, 500); |
| | | } |
| | | }; |
| | | |
| | | window.takePhoto = (question = 'æè¿°ä¸ä¸çå°çç©å') => { |
| | | return new Promise(async (resolve) => { |
| | | const canvas = document.createElement('canvas'); |
| | | const video = cameraVideo; |
| | | |
| | | if (!video || video.readyState !== video.HAVE_ENOUGH_DATA) { |
| | | log('æ æ³æç
§ï¼æå头æªå°±ç»ª', 'warning'); |
| | | resolve({ |
| | | success: false, |
| | | error: 'æå头æªå°±ç»ªï¼è¯·ç¡®ä¿å·²è¿æ¥ä¸æå头已å¯å¨' |
| | | }); |
| | | return; |
| | | } |
| | | |
| | | canvas.width = video.videoWidth || 180; |
| | | canvas.height = video.videoHeight || 240; |
| | | const ctx = canvas.getContext('2d'); |
| | | ctx.drawImage(video, 0, 0, canvas.width, canvas.height); |
| | | |
| | | const photoData = canvas.toDataURL('image/jpeg', 0.8); |
| | | log(`æç
§æåï¼å¾åæ°æ®é¿åº¦: ${photoData.length}`, 'success'); |
| | | |
| | | try { |
| | | const xz_tester_vision = localStorage.getItem('xz_tester_vision'); |
| | | if (xz_tester_vision) { |
| | | let visionInfo = null; |
| | | |
| | | try { |
| | | visionInfo = JSON.parse(xz_tester_vision); |
| | | } catch (err) { |
| | | throw new Error(`è§è§é
置解æå¤±è´¥`); |
| | | } |
| | | |
| | | const { url, token } = visionInfo || {}; |
| | | if (!url || !token) { |
| | | throw new Error('è§è§åæå¤±è´¥ï¼é
ç½®ç¼ºå°æ¥å£å°å(url)æä»¤ç(token)'); |
| | | } |
| | | |
| | | log(`æ£å¨åéå¾çå°è§è§åææ¥å£: ${url}`, 'info'); |
| | | |
| | | const deviceId = document.getElementById('deviceMac')?.value || ''; |
| | | const clientId = document.getElementById('clientId')?.value || 'web_test_client'; |
| | | |
| | | const formData = new FormData(); |
| | | formData.append('question', question); |
| | | formData.append('image', dataURItoBlob(photoData), 'photo.jpg'); |
| | | |
| | | const response = await fetch(url, { |
| | | method: 'POST', |
| | | body: formData, |
| | | headers: { |
| | | 'Device-Id': deviceId, |
| | | 'Client-Id': clientId, |
| | | 'Authorization': `Bearer ${token}` |
| | | } |
| | | }); |
| | | |
| | | if (!response.ok) { |
| | | throw new Error(`HTTP error! status: ${response.status}`); |
| | | } |
| | | |
| | | const analysisResult = await response.json(); |
| | | log(`è§è§åæå®æ: ${JSON.stringify(analysisResult).substring(0, 200)}...`, 'success'); |
| | | |
| | | resolve({ |
| | | success: true, |
| | | message: question, |
| | | photo_data: photoData, |
| | | photo_width: canvas.width, |
| | | photo_height: canvas.height, |
| | | vision_analysis: analysisResult |
| | | }); |
| | | } else { |
| | | log('æªé
ç½®è§è§åææå¡', 'warning'); |
| | | } |
| | | } catch (error) { |
| | | log(`è§è§åæå¤±è´¥: ${error.message}`, 'error'); |
| | | resolve({ |
| | | success: true, |
| | | message: question, |
| | | photo_data: photoData, |
| | | photo_width: canvas.width, |
| | | photo_height: canvas.height, |
| | | vision_analysis: { |
| | | success: false, |
| | | error: error.message, |
| | | fallback: 'æ æ³è¿æ¥å°è§è§åææå¡' |
| | | } |
| | | }); |
| | | } |
| | | }); |
| | | }; |
| | | |
| | | log('æå头åå§å宿', 'success'); |
| | | resolve(true); |
| | | }); |
| | | } |
| | | } |
| | | |
| | | // å建并å¯å¨åºç¨ |
| | | const app = new App(); |
| | | // å°åºç¨å®ä¾æ´é²å°å
¨å±ï¼ä¾å
¶ä»æ¨¡åè®¿é® |
| | | window.chatApp = app; |
| | | document.addEventListener('DOMContentLoaded', () => { |
| | | // åå§ååºç¨ |
| | | app.init(); |
| | | }); |
| | | export default app; |
| New file |
| | |
| | | [ |
| | | { |
| | | "name": "self_camera_take_photo", |
| | | "description": "Take a photo using the device's camera. This tool captures the current camera frame and returns the image data. You MUST call this tool when user asks to 'take a photo', 'what do you see', 'describe what you see', or similar requests. After getting the photo data, describe what you see in the image. Parameter 'question' is optional, defaults to 'describe objects seen'.", |
| | | "inputSchema": { |
| | | "type": "object", |
| | | "properties": { |
| | | "question": { |
| | | "type": "string", |
| | | "description": "Question to guide the photo analysis, e.g., 'describe the objects seen'. Can be empty." |
| | | } |
| | | } |
| | | }, |
| | | "mockResponse": { |
| | | "success": true, |
| | | "photo_data": "base64_image_data", |
| | | "response": "Please describe what you see based on the returned photo_data" |
| | | } |
| | | }, |
| | | { |
| | | "name": "self.get_device_status", |
| | | "description": "Provides the real-time information of the device, including the current status of the audio speaker, screen, battery, network, etc.\nUse this tool for: \n1. Answering questions about current condition (e.g. what is the current volume of the audio speaker?)\n2. As the first step to control the device (e.g. turn up / down the volume of the audio speaker, etc.)", |
| | | "inputSchema": { |
| | | "type": "object", |
| | | "properties": {} |
| | | }, |
| | | "mockResponse": { |
| | | "audio_speaker": { |
| | | "volume": 50, |
| | | "muted": false |
| | | }, |
| | | "screen": { |
| | | "brightness": 80, |
| | | "theme": "light" |
| | | }, |
| | | "battery": { |
| | | "level": 85, |
| | | "charging": false |
| | | }, |
| | | "network": { |
| | | "connected": true, |
| | | "type": "wifi" |
| | | } |
| | | } |
| | | }, |
| | | { |
| | | "name": "self.audio_speaker.set_volume", |
| | | "description": "Set the volume of the audio speaker. If the current volume is unknown, you must call `self.get_device_status` tool first and then call this tool.", |
| | | "inputSchema": { |
| | | "type": "object", |
| | | "properties": { |
| | | "volume": { |
| | | "type": "integer", |
| | | "minimum": 0, |
| | | "maximum": 100 |
| | | } |
| | | }, |
| | | "required": [ |
| | | "volume" |
| | | ] |
| | | }, |
| | | "mockResponse": { |
| | | "success": true, |
| | | "volume": "${volume}", |
| | | "message": "é³é已设置为 ${volume}" |
| | | } |
| | | }, |
| | | { |
| | | "name": "self.screen.set_brightness", |
| | | "description": "Set the brightness of the screen.", |
| | | "inputSchema": { |
| | | "type": "object", |
| | | "properties": { |
| | | "brightness": { |
| | | "type": "integer", |
| | | "minimum": 0, |
| | | "maximum": 100 |
| | | } |
| | | }, |
| | | "required": [ |
| | | "brightness" |
| | | ] |
| | | }, |
| | | "mockResponse": { |
| | | "success": true, |
| | | "brightness": "${brightness}", |
| | | "message": "亮度已设置为 ${brightness}" |
| | | } |
| | | } |
| | | ] |
| New file |
| | |
| | | // é
ç½®ç®¡çæ¨¡å |
| | | |
| | | // é»è®¤å¤éè¯å表 |
| | | export const DEFAULT_WAKE_WORDS = 'ä½ å¥½å°æº\nä½ å¥½å°å¿\nå°ç±åå¦\nä½ å¥½å°é«\nä½ å¥½å°æ°\nå°ç¾åå¦\nå°é¾å°é¾\nåµåµåå¦\nå°æ»¨å°æ»¨\nå°å°å°å°\nå¿ä½ 好å'; |
| | | |
| | | // çæéæºMACå°å |
| | | function generateRandomMac() { |
| | | const hexDigits = '0123456789ABCDEF'; |
| | | let mac = ''; |
| | | for (let i = 0; i < 6; i++) { |
| | | if (i > 0) mac += ':'; |
| | | for (let j = 0; j < 2; j++) { |
| | | mac += hexDigits.charAt(Math.floor(Math.random() * 16)); |
| | | } |
| | | } |
| | | return mac; |
| | | } |
| | | |
| | | // å è½½é
ç½® |
| | | export function loadConfig() { |
| | | const deviceMacInput = document.getElementById('deviceMac'); |
| | | const deviceNameInput = document.getElementById('deviceName'); |
| | | const clientIdInput = document.getElementById('clientId'); |
| | | const otaUrlInput = document.getElementById('otaUrl'); |
| | | const wakewordWsUrlInput = document.getElementById('wakewordWsUrl'); |
| | | const wakewordEnabledInput = document.getElementById('wakewordEnabled'); |
| | | const wakewordListInput = document.getElementById('wakewordList'); |
| | | |
| | | // ä»localStorageå è½½MACå°åï¼å¦ææ²¡æåçææ°ç |
| | | let savedMac = localStorage.getItem('xz_tester_deviceMac'); |
| | | if (!savedMac) { |
| | | savedMac = generateRandomMac(); |
| | | localStorage.setItem('xz_tester_deviceMac', savedMac); |
| | | } |
| | | deviceMacInput.value = savedMac; |
| | | |
| | | // ä»localStorageå è½½å
¶ä»é
ç½® |
| | | const savedDeviceName = localStorage.getItem('xz_tester_deviceName'); |
| | | if (savedDeviceName) { |
| | | deviceNameInput.value = savedDeviceName; |
| | | } |
| | | |
| | | const savedClientId = localStorage.getItem('xz_tester_clientId'); |
| | | if (savedClientId) { |
| | | clientIdInput.value = savedClientId; |
| | | } |
| | | |
| | | const savedOtaUrl = localStorage.getItem('xz_tester_otaUrl'); |
| | | if (savedOtaUrl) { |
| | | otaUrlInput.value = savedOtaUrl; |
| | | } |
| | | |
| | | const savedWakewordWsUrl = localStorage.getItem('xz_tester_wakewordWsUrl'); |
| | | if (savedWakewordWsUrl !== null && wakewordWsUrlInput) { |
| | | wakewordWsUrlInput.value = savedWakewordWsUrl; |
| | | } |
| | | |
| | | const savedWakewordEnabled = localStorage.getItem('xz_tester_wakewordEnabled'); |
| | | if (savedWakewordEnabled !== null && wakewordEnabledInput) { |
| | | wakewordEnabledInput.value = savedWakewordEnabled; |
| | | } |
| | | |
| | | const savedWakewordList = localStorage.getItem('xz_tester_wakewordList'); |
| | | if (savedWakewordList !== null && wakewordListInput) { |
| | | wakewordListInput.value = savedWakewordList; |
| | | } else if (wakewordListInput) { |
| | | wakewordListInput.value = DEFAULT_WAKE_WORDS; |
| | | } |
| | | |
| | | const emojiEnabledInput = document.getElementById('emojiEnabled'); |
| | | const savedEmojiEnabled = localStorage.getItem('xz_tester_emojiEnabled'); |
| | | if (savedEmojiEnabled !== null && emojiEnabledInput) { |
| | | emojiEnabledInput.value = savedEmojiEnabled; |
| | | } |
| | | } |
| | | |
| | | // ä¿åé
ç½® |
| | | export function saveConfig() { |
| | | const deviceMacInput = document.getElementById('deviceMac'); |
| | | const deviceNameInput = document.getElementById('deviceName'); |
| | | const clientIdInput = document.getElementById('clientId'); |
| | | const wakewordWsUrlInput = document.getElementById('wakewordWsUrl'); |
| | | const wakewordEnabledInput = document.getElementById('wakewordEnabled'); |
| | | const wakewordListInput = document.getElementById('wakewordList'); |
| | | |
| | | localStorage.setItem('xz_tester_deviceMac', deviceMacInput.value); |
| | | localStorage.setItem('xz_tester_deviceName', deviceNameInput.value); |
| | | localStorage.setItem('xz_tester_clientId', clientIdInput.value); |
| | | const emojiEnabledInput = document.getElementById('emojiEnabled'); |
| | | if (emojiEnabledInput) { |
| | | localStorage.setItem('xz_tester_emojiEnabled', emojiEnabledInput.value); |
| | | } |
| | | if (wakewordEnabledInput) { |
| | | localStorage.setItem('xz_tester_wakewordEnabled', wakewordEnabledInput.value); |
| | | } |
| | | if (wakewordListInput) { |
| | | localStorage.setItem('xz_tester_wakewordList', wakewordListInput.value); |
| | | } |
| | | if (wakewordWsUrlInput && wakewordWsUrlInput.value.trim()) { |
| | | localStorage.setItem('xz_tester_wakewordWsUrl', wakewordWsUrlInput.value.trim()); |
| | | } |
| | | } |
| | | |
| | | // è·åé
ç½®å¼ |
| | | export function getConfig() { |
| | | // ä»DOMè·åå¼ |
| | | const deviceMac = document.getElementById('deviceMac')?.value.trim() || ''; |
| | | const deviceName = document.getElementById('deviceName')?.value.trim() || ''; |
| | | const clientId = document.getElementById('clientId')?.value.trim() || ''; |
| | | const emojiEnabled = document.getElementById('emojiEnabled')?.value !== 'false'; |
| | | |
| | | return { |
| | | deviceId: deviceMac, // 使ç¨MACå°åä½ä¸ºdeviceId |
| | | deviceName, |
| | | deviceMac, |
| | | clientId, |
| | | emojiEnabled |
| | | }; |
| | | } |
| | | |
| | | // ä¿åè¿æ¥URL |
| | | export function saveConnectionUrls() { |
| | | const otaUrl = document.getElementById('otaUrl').value.trim(); |
| | | const wsUrl = document.getElementById('serverUrl').value.trim(); |
| | | localStorage.setItem('xz_tester_otaUrl', otaUrl); |
| | | localStorage.setItem('xz_tester_wsUrl', wsUrl); |
| | | } |
| New file |
| | |
| | | import { log } from '../../utils/logger.js?v=0205'; |
| | | |
| | | |
| | | // æ£æ¥Opusåºæ¯å¦å·²å è½½ |
| | | export function checkOpusLoaded() { |
| | | try { |
| | | // æ£æ¥Moduleæ¯å¦åå¨ï¼æ¬å°åºå¯¼åºçå
¨å±åéï¼ |
| | | if (typeof Module === 'undefined') { |
| | | throw new Error('Opusåºæªå è½½ï¼Module对象ä¸åå¨'); |
| | | } |
| | | |
| | | // å°è¯å
使ç¨Module.instanceï¼libopus.jsæåä¸è¡å¯¼åºæ¹å¼ï¼ |
| | | if (typeof Module.instance !== 'undefined' && typeof Module.instance._opus_decoder_get_size === 'function') { |
| | | // 使ç¨Module.instanceå¯¹è±¡æ¿æ¢å
¨å±Module对象 |
| | | window.ModuleInstance = Module.instance; |
| | | log('Opusåºå è½½æåï¼ä½¿ç¨Module.instanceï¼', 'success'); |
| | | |
| | | // 3ç§åéèç¶æ |
| | | const statusElement = document.getElementById('scriptStatus'); |
| | | if (statusElement) statusElement.style.display = 'none'; |
| | | return; |
| | | } |
| | | |
| | | // å¦ææ²¡æModule.instanceï¼æ£æ¥å
¨å±Module彿° |
| | | if (typeof Module._opus_decoder_get_size === 'function') { |
| | | window.ModuleInstance = Module; |
| | | log('Opusåºå è½½æåï¼ä½¿ç¨å
¨å±Moduleï¼', 'success'); |
| | | |
| | | // 3ç§åéèç¶æ |
| | | const statusElement = document.getElementById('scriptStatus'); |
| | | if (statusElement) statusElement.style.display = 'none'; |
| | | return; |
| | | } |
| | | |
| | | throw new Error('Opusè§£ç 彿°æªæ¾å°ï¼å¯è½Moduleç»æä¸æ£ç¡®'); |
| | | } catch (err) { |
| | | log(`Opusåºå 载失败ï¼è¯·æ£æ¥libopus.jsæä»¶æ¯å¦åå¨ä¸æ£ç¡®: ${err.message}`, 'error'); |
| | | } |
| | | } |
| | | |
| | | |
| | | // å建ä¸ä¸ªOpusç¼ç å¨ |
| | | let opusEncoder = null; |
| | | export function initOpusEncoder() { |
| | | try { |
| | | if (opusEncoder) { |
| | | return opusEncoder; // å·²ç»åå§åè¿ |
| | | } |
| | | |
| | | if (!window.ModuleInstance) { |
| | | log('æ æ³å建Opusç¼ç å¨ï¼ModuleInstanceä¸å¯ç¨', 'error'); |
| | | return; |
| | | } |
| | | |
| | | // åå§åä¸ä¸ªOpusç¼ç å¨ |
| | | const mod = window.ModuleInstance; |
| | | const sampleRate = 16000; // 16kHzéæ ·ç |
| | | const channels = 1; // å声é |
| | | const application = 2048; // OPUS_APPLICATION_VOIP = 2048 |
| | | |
| | | // å建ç¼ç å¨ |
| | | opusEncoder = { |
| | | channels: channels, |
| | | sampleRate: sampleRate, |
| | | frameSize: 960, // 60ms @ 16kHz = 60 * 16 = 960 samples |
| | | maxPacketSize: 4000, // æå¤§å
å¤§å° |
| | | module: mod, |
| | | |
| | | // åå§åç¼ç å¨ |
| | | init: function () { |
| | | try { |
| | | // è·åç¼ç å¨å¤§å° |
| | | const encoderSize = mod._opus_encoder_get_size(this.channels); |
| | | log(`Opusç¼ç å¨å¤§å°: ${encoderSize}åè`, 'info'); |
| | | |
| | | // åé
å
å |
| | | this.encoderPtr = mod._malloc(encoderSize); |
| | | if (!this.encoderPtr) { |
| | | throw new Error("æ æ³åé
ç¼ç å¨å
å"); |
| | | } |
| | | |
| | | // åå§åç¼ç å¨ |
| | | const err = mod._opus_encoder_init( |
| | | this.encoderPtr, |
| | | this.sampleRate, |
| | | this.channels, |
| | | application |
| | | ); |
| | | |
| | | if (err < 0) { |
| | | throw new Error(`Opusç¼ç å¨åå§å失败: ${err}`); |
| | | } |
| | | |
| | | // 设置ä½ç (16kbps) |
| | | mod._opus_encoder_ctl(this.encoderPtr, 4002, 16000); // OPUS_SET_BITRATE |
| | | |
| | | // è®¾ç½®å¤æåº¦ (0-10, è¶é«è´¨éè¶å¥½ä½CPU使ç¨è¶å¤) |
| | | mod._opus_encoder_ctl(this.encoderPtr, 4010, 5); // OPUS_SET_COMPLEXITY |
| | | |
| | | // 设置使ç¨DTX (ä¸ä¼ è¾éé³å¸§) |
| | | mod._opus_encoder_ctl(this.encoderPtr, 4016, 1); // OPUS_SET_DTX |
| | | |
| | | log("Opusç¼ç å¨åå§åæå", 'success'); |
| | | return true; |
| | | } catch (error) { |
| | | if (this.encoderPtr) { |
| | | mod._free(this.encoderPtr); |
| | | this.encoderPtr = null; |
| | | } |
| | | log(`Opusç¼ç å¨åå§å失败: ${error.message}`, 'error'); |
| | | return false; |
| | | } |
| | | }, |
| | | |
| | | // ç¼ç PCMæ°æ®ä¸ºOpus |
| | | encode: function (pcmData) { |
| | | if (!this.encoderPtr) { |
| | | if (!this.init()) { |
| | | return null; |
| | | } |
| | | } |
| | | |
| | | try { |
| | | const mod = this.module; |
| | | |
| | | // 为PCMæ°æ®åé
å
å |
| | | const pcmPtr = mod._malloc(pcmData.length * 2); // 2åè/int16 |
| | | |
| | | // å°PCMæ°æ®å¤å¶å°HEAP |
| | | for (let i = 0; i < pcmData.length; i++) { |
| | | mod.HEAP16[(pcmPtr >> 1) + i] = pcmData[i]; |
| | | } |
| | | |
| | | // 为è¾åºåé
å
å |
| | | const outPtr = mod._malloc(this.maxPacketSize); |
| | | |
| | | // è¿è¡ç¼ç |
| | | const encodedLen = mod._opus_encode( |
| | | this.encoderPtr, |
| | | pcmPtr, |
| | | this.frameSize, |
| | | outPtr, |
| | | this.maxPacketSize |
| | | ); |
| | | |
| | | if (encodedLen < 0) { |
| | | throw new Error(`Opusç¼ç 失败: ${encodedLen}`); |
| | | } |
| | | |
| | | // å¤å¶ç¼ç åçæ°æ® |
| | | const opusData = new Uint8Array(encodedLen); |
| | | for (let i = 0; i < encodedLen; i++) { |
| | | opusData[i] = mod.HEAPU8[outPtr + i]; |
| | | } |
| | | |
| | | // éæ¾å
å |
| | | mod._free(pcmPtr); |
| | | mod._free(outPtr); |
| | | |
| | | return opusData; |
| | | } catch (error) { |
| | | log(`Opusç¼ç åºé: ${error.message}`, 'error'); |
| | | return null; |
| | | } |
| | | }, |
| | | |
| | | // 鿝ç¼ç å¨ |
| | | destroy: function () { |
| | | if (this.encoderPtr) { |
| | | this.module._free(this.encoderPtr); |
| | | this.encoderPtr = null; |
| | | } |
| | | } |
| | | }; |
| | | |
| | | opusEncoder.init(); |
| | | return opusEncoder; |
| | | } catch (error) { |
| | | log(`å建Opusç¼ç å¨å¤±è´¥: ${error.message}`, 'error'); |
| | | return false; |
| | | } |
| | | } |
| New file |
| | |
| | | // é³é¢ææ¾æ¨¡å |
| | | import BlockingQueue from '../../utils/blocking-queue.js?v=0205'; |
| | | import { log } from '../../utils/logger.js?v=0205'; |
| | | import { createStreamingContext } from './stream-context.js?v=0205'; |
| | | |
| | | // é³é¢ææ¾å¨ç±» |
| | | export class AudioPlayer { |
| | | constructor() { |
| | | // é³é¢åæ° |
| | | this.SAMPLE_RATE = 16000; |
| | | this.CHANNELS = 1; |
| | | this.FRAME_SIZE = 960; |
| | | this.MIN_AUDIO_DURATION = 0.12; |
| | | |
| | | // ç¶æ |
| | | this.audioContext = null; |
| | | this.opusDecoder = null; |
| | | this.streamingContext = null; |
| | | this.queue = new BlockingQueue(); |
| | | this.isPlaying = false; |
| | | } |
| | | |
| | | // è·åæå建AudioContext |
| | | getAudioContext() { |
| | | if (!this.audioContext) { |
| | | this.audioContext = new (window.AudioContext || window.webkitAudioContext)({ |
| | | sampleRate: this.SAMPLE_RATE, |
| | | latencyHint: 'interactive' |
| | | }); |
| | | log('å建é³é¢ä¸ä¸æï¼éæ ·ç: ' + this.SAMPLE_RATE + 'Hz', 'debug'); |
| | | } |
| | | return this.audioContext; |
| | | } |
| | | |
| | | // åå§åOpusè§£ç å¨ |
| | | async initOpusDecoder() { |
| | | if (this.opusDecoder) return this.opusDecoder; |
| | | |
| | | try { |
| | | if (typeof window.ModuleInstance === 'undefined') { |
| | | if (typeof Module !== 'undefined') { |
| | | window.ModuleInstance = Module; |
| | | log('使ç¨å
¨å±Moduleä½ä¸ºModuleInstance', 'info'); |
| | | } else { |
| | | throw new Error('Opusåºæªå è½½ï¼ModuleInstanceåModule对象é½ä¸åå¨'); |
| | | } |
| | | } |
| | | |
| | | const mod = window.ModuleInstance; |
| | | |
| | | this.opusDecoder = { |
| | | channels: this.CHANNELS, |
| | | rate: this.SAMPLE_RATE, |
| | | frameSize: this.FRAME_SIZE, |
| | | module: mod, |
| | | decoderPtr: null, |
| | | |
| | | init: function () { |
| | | if (this.decoderPtr) return true; |
| | | |
| | | const decoderSize = mod._opus_decoder_get_size(this.channels); |
| | | log(`Opusè§£ç å¨å¤§å°: ${decoderSize}åè`, 'debug'); |
| | | |
| | | this.decoderPtr = mod._malloc(decoderSize); |
| | | if (!this.decoderPtr) { |
| | | throw new Error("æ æ³åé
è§£ç å¨å
å"); |
| | | } |
| | | |
| | | const err = mod._opus_decoder_init( |
| | | this.decoderPtr, |
| | | this.rate, |
| | | this.channels |
| | | ); |
| | | |
| | | if (err < 0) { |
| | | this.destroy(); |
| | | throw new Error(`Opusè§£ç å¨åå§å失败: ${err}`); |
| | | } |
| | | |
| | | log("Opusè§£ç å¨åå§åæå", 'success'); |
| | | return true; |
| | | }, |
| | | |
| | | decode: function (opusData) { |
| | | if (!this.decoderPtr) { |
| | | if (!this.init()) { |
| | | throw new Error("è§£ç 卿ªåå§å䏿 æ³åå§å"); |
| | | } |
| | | } |
| | | |
| | | try { |
| | | const mod = this.module; |
| | | |
| | | const opusPtr = mod._malloc(opusData.length); |
| | | mod.HEAPU8.set(opusData, opusPtr); |
| | | |
| | | const pcmPtr = mod._malloc(this.frameSize * 2); |
| | | |
| | | const decodedSamples = mod._opus_decode( |
| | | this.decoderPtr, |
| | | opusPtr, |
| | | opusData.length, |
| | | pcmPtr, |
| | | this.frameSize, |
| | | 0 |
| | | ); |
| | | |
| | | if (decodedSamples < 0) { |
| | | mod._free(opusPtr); |
| | | mod._free(pcmPtr); |
| | | throw new Error(`Opusè§£ç 失败: ${decodedSamples}`); |
| | | } |
| | | |
| | | const decodedData = new Int16Array(decodedSamples); |
| | | for (let i = 0; i < decodedSamples; i++) { |
| | | decodedData[i] = mod.HEAP16[(pcmPtr >> 1) + i]; |
| | | } |
| | | |
| | | mod._free(opusPtr); |
| | | mod._free(pcmPtr); |
| | | |
| | | return decodedData; |
| | | } catch (error) { |
| | | log(`Opusè§£ç é误: ${error.message}`, 'error'); |
| | | return new Int16Array(0); |
| | | } |
| | | }, |
| | | |
| | | destroy: function () { |
| | | if (this.decoderPtr) { |
| | | this.module._free(this.decoderPtr); |
| | | this.decoderPtr = null; |
| | | } |
| | | } |
| | | }; |
| | | |
| | | if (!this.opusDecoder.init()) { |
| | | throw new Error("Opusè§£ç å¨åå§å失败"); |
| | | } |
| | | |
| | | return this.opusDecoder; |
| | | |
| | | } catch (error) { |
| | | log(`Opusè§£ç å¨åå§å失败: ${error.message}`, 'error'); |
| | | this.opusDecoder = null; |
| | | throw error; |
| | | } |
| | | } |
| | | |
| | | // å¯å¨é³é¢ç¼å² |
| | | async startAudioBuffering() { |
| | | log("å¼å§é³é¢ç¼å²...", 'info'); |
| | | |
| | | this.initOpusDecoder().catch(error => { |
| | | log(`é¢åå§åOpusè§£ç å¨å¤±è´¥: ${error.message}`, 'warning'); |
| | | }); |
| | | |
| | | const timeout = 400; |
| | | while (true) { |
| | | const packets = await this.queue.dequeue( |
| | | 6, |
| | | timeout, |
| | | (count) => { |
| | | log(`ç¼å²è¶
æ¶ï¼å½åç¼å²å
æ°: ${count}ï¼å¼å§ææ¾`, 'info'); |
| | | } |
| | | ); |
| | | if (packets.length) { |
| | | log(`å·²ç¼å² ${packets.length} 个é³é¢å
ï¼å¼å§ææ¾`, 'info'); |
| | | this.streamingContext.pushAudioBuffer(packets); |
| | | } |
| | | |
| | | while (true) { |
| | | const data = await this.queue.dequeue(99, 30); |
| | | if (data.length) { |
| | | this.streamingContext.pushAudioBuffer(data); |
| | | } else { |
| | | break; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | // ææ¾å·²ç¼å²çé³é¢ |
| | | async playBufferedAudio() { |
| | | try { |
| | | this.audioContext = this.getAudioContext(); |
| | | |
| | | if (!this.opusDecoder) { |
| | | log('åå§åOpusè§£ç å¨...', 'info'); |
| | | try { |
| | | this.opusDecoder = await this.initOpusDecoder(); |
| | | if (!this.opusDecoder) { |
| | | throw new Error('è§£ç å¨åå§å失败'); |
| | | } |
| | | log('Opusè§£ç å¨åå§åæå', 'success'); |
| | | } catch (error) { |
| | | log('Opusè§£ç å¨åå§å失败: ' + error.message, 'error'); |
| | | this.isPlaying = false; |
| | | return; |
| | | } |
| | | } |
| | | |
| | | if (!this.streamingContext) { |
| | | this.streamingContext = createStreamingContext( |
| | | this.opusDecoder, |
| | | this.audioContext, |
| | | this.SAMPLE_RATE, |
| | | this.CHANNELS, |
| | | this.MIN_AUDIO_DURATION |
| | | ); |
| | | } |
| | | |
| | | this.streamingContext.decodeOpusFrames(); |
| | | this.streamingContext.startPlaying(); |
| | | |
| | | } catch (error) { |
| | | log(`ææ¾å·²ç¼å²çé³é¢åºé: ${error.message}`, 'error'); |
| | | this.isPlaying = false; |
| | | this.streamingContext = null; |
| | | } |
| | | } |
| | | |
| | | // æ·»å é³é¢æ°æ®å°éå |
| | | enqueueAudioData(opusData) { |
| | | if (opusData.length > 0) { |
| | | this.queue.enqueue(opusData); |
| | | } else { |
| | | log('æ¶å°ç©ºé³é¢æ°æ®å¸§ï¼å¯è½æ¯ç»ææ å¿', 'warning'); |
| | | if (this.isPlaying && this.streamingContext) { |
| | | this.streamingContext.endOfStream = true; |
| | | } |
| | | } |
| | | } |
| | | |
| | | // é¢å 载解ç å¨ |
| | | async preload() { |
| | | log('é¢å è½½Opusè§£ç å¨...', 'info'); |
| | | try { |
| | | await this.initOpusDecoder(); |
| | | log('Opusè§£ç å¨é¢å è½½æå', 'success'); |
| | | } catch (error) { |
| | | log(`Opusè§£ç å¨é¢å 载失败: ${error.message}ï¼å°å¨éè¦æ¶éè¯`, 'warning'); |
| | | } |
| | | } |
| | | |
| | | // å¯å¨ææ¾ç³»ç» |
| | | async start() { |
| | | await this.preload(); |
| | | this.playBufferedAudio(); |
| | | this.startAudioBuffering(); |
| | | } |
| | | |
| | | // è·åé³é¢å
ç»è®¡ä¿¡æ¯ |
| | | getAudioStats() { |
| | | if (!this.streamingContext) { |
| | | return { |
| | | pendingDecode: 0, |
| | | pendingPlay: 0, |
| | | totalPending: 0 |
| | | }; |
| | | } |
| | | |
| | | const pendingDecode = this.streamingContext.getPendingDecodeCount(); |
| | | const pendingPlay = this.streamingContext.getPendingPlayCount(); |
| | | |
| | | return { |
| | | pendingDecode, // å¾
è§£ç å
æ° |
| | | pendingPlay, // å¾
ææ¾å
æ° |
| | | totalPending: pendingDecode + pendingPlay // æ»å¾
å¤çå
æ° |
| | | }; |
| | | } |
| | | |
| | | // æ¸
空ææé³é¢ç¼å²å¹¶åæ¢ææ¾ |
| | | clearAllAudio() { |
| | | log('AudioPlayer: æ¸
空ææé³é¢', 'info'); |
| | | |
| | | // æ¸
ç©ºæ¥æ¶éåï¼ä½¿ç¨clearæ¹æ³ä¿æå¯¹è±¡å¼ç¨ï¼ |
| | | this.queue.clear(); |
| | | |
| | | // æ¸
空æµä¸ä¸æçææç¼å² |
| | | if (this.streamingContext) { |
| | | this.streamingContext.clearAllBuffers(); |
| | | } |
| | | |
| | | log('AudioPlayer: é³é¢å·²æ¸
空', 'success'); |
| | | } |
| | | } |
| | | |
| | | // å建åä¾ |
| | | let audioPlayerInstance = null; |
| | | |
| | | export function getAudioPlayer() { |
| | | if (!audioPlayerInstance) { |
| | | audioPlayerInstance = new AudioPlayer(); |
| | | } |
| | | return audioPlayerInstance; |
| | | } |
| New file |
| | |
| | | // Audio recording module |
| | | import { log } from '../../utils/logger.js?v=0205'; |
| | | import { initOpusEncoder } from './opus-codec.js?v=0205'; |
| | | import { getAudioPlayer } from './player.js?v=0205'; |
| | | |
| | | // Audio recorder class |
| | | export class AudioRecorder { |
| | | constructor() { |
| | | this.isRecording = false; |
| | | this.audioContext = null; |
| | | this.analyser = null; |
| | | this.audioProcessor = null; |
| | | this.audioProcessorType = null; |
| | | this.audioSource = null; |
| | | this.opusEncoder = null; |
| | | this.pcmDataBuffer = new Int16Array(); |
| | | this.audioBuffers = []; |
| | | this.totalAudioSize = 0; |
| | | this.visualizationRequest = null; |
| | | this.recordingTimer = null; |
| | | this.websocket = null; |
| | | // Callback functions |
| | | this.onRecordingStart = null; |
| | | this.onRecordingStop = null; |
| | | this.onVisualizerUpdate = null; |
| | | } |
| | | |
| | | // Set WebSocket instance |
| | | setWebSocket(ws) { |
| | | this.websocket = ws; |
| | | } |
| | | |
| | | // Get AudioContext instance |
| | | getAudioContext() { |
| | | return getAudioPlayer().getAudioContext(); |
| | | } |
| | | |
| | | // Initialize encoder |
| | | initEncoder() { |
| | | if (!this.opusEncoder) { |
| | | this.opusEncoder = initOpusEncoder(); |
| | | } |
| | | return this.opusEncoder; |
| | | } |
| | | |
| | | // PCM processor code |
| | | getAudioProcessorCode() { |
| | | return ` |
| | | class AudioRecorderProcessor extends AudioWorkletProcessor { |
| | | constructor() { |
| | | super(); |
| | | this.buffers = []; |
| | | this.frameSize = 960; |
| | | this.buffer = new Int16Array(this.frameSize); |
| | | this.bufferIndex = 0; |
| | | this.isRecording = false; |
| | | this.port.onmessage = (event) => { |
| | | if (event.data.command === 'start') { |
| | | this.isRecording = true; |
| | | this.port.postMessage({ type: 'status', status: 'started' }); |
| | | } else if (event.data.command === 'stop') { |
| | | this.isRecording = false; |
| | | if (this.bufferIndex > 0) { |
| | | const finalBuffer = this.buffer.slice(0, this.bufferIndex); |
| | | this.port.postMessage({ type: 'buffer', buffer: finalBuffer }); |
| | | this.bufferIndex = 0; |
| | | } |
| | | this.port.postMessage({ type: 'status', status: 'stopped' }); |
| | | } |
| | | }; |
| | | } |
| | | process(inputs, outputs, parameters) { |
| | | if (!this.isRecording) return true; |
| | | const input = inputs[0][0]; |
| | | if (!input) return true; |
| | | for (let i = 0; i < input.length; i++) { |
| | | if (this.bufferIndex >= this.frameSize) { |
| | | this.port.postMessage({ type: 'buffer', buffer: this.buffer.slice(0) }); |
| | | this.bufferIndex = 0; |
| | | } |
| | | this.buffer[this.bufferIndex++] = Math.max(-32768, Math.min(32767, Math.floor(input[i] * 32767))); |
| | | } |
| | | return true; |
| | | } |
| | | } |
| | | registerProcessor('audio-recorder-processor', AudioRecorderProcessor); |
| | | `; |
| | | } |
| | | |
| | | // Create audio processor |
| | | async createAudioProcessor() { |
| | | this.audioContext = this.getAudioContext(); |
| | | try { |
| | | if (this.audioContext.audioWorklet) { |
| | | const blob = new Blob([this.getAudioProcessorCode()], { type: 'application/javascript' }); |
| | | const url = URL.createObjectURL(blob); |
| | | await this.audioContext.audioWorklet.addModule(url); |
| | | URL.revokeObjectURL(url); |
| | | const audioProcessor = new AudioWorkletNode(this.audioContext, 'audio-recorder-processor'); |
| | | audioProcessor.port.onmessage = (event) => { |
| | | if (event.data.type === 'buffer') { |
| | | this.processPCMBuffer(event.data.buffer); |
| | | } |
| | | }; |
| | | log('使ç¨AudioWorkletå¤çé³é¢', 'success'); |
| | | const silent = this.audioContext.createGain(); |
| | | silent.gain.value = 0; |
| | | audioProcessor.connect(silent); |
| | | silent.connect(this.audioContext.destination); |
| | | return { node: audioProcessor, type: 'worklet' }; |
| | | } else { |
| | | log('AudioWorkletä¸å¯ç¨ï¼ä½¿ç¨ScriptProcessorNodeä½ä¸ºå夿¹æ¡', 'warning'); |
| | | return this.createScriptProcessor(); |
| | | } |
| | | } catch (error) { |
| | | log(`å建é³é¢å¤çå¨å¤±è´¥: ${error.message}ï¼å°è¯å夿¹æ¡`, 'error'); |
| | | return this.createScriptProcessor(); |
| | | } |
| | | } |
| | | |
| | | // Create ScriptProcessor as fallback |
| | | createScriptProcessor() { |
| | | try { |
| | | const frameSize = 4096; |
| | | const scriptProcessor = this.audioContext.createScriptProcessor(frameSize, 1, 1); |
| | | scriptProcessor.onaudioprocess = (event) => { |
| | | if (!this.isRecording) return; |
| | | const input = event.inputBuffer.getChannelData(0); |
| | | const buffer = new Int16Array(input.length); |
| | | for (let i = 0; i < input.length; i++) { |
| | | buffer[i] = Math.max(-32768, Math.min(32767, Math.floor(input[i] * 32767))); |
| | | } |
| | | this.processPCMBuffer(buffer); |
| | | }; |
| | | const silent = this.audioContext.createGain(); |
| | | silent.gain.value = 0; |
| | | scriptProcessor.connect(silent); |
| | | silent.connect(this.audioContext.destination); |
| | | log('使ç¨ScriptProcessorNodeä½ä¸ºå夿¹æ¡æå', 'warning'); |
| | | return { node: scriptProcessor, type: 'processor' }; |
| | | } catch (fallbackError) { |
| | | log(`å夿¹æ¡ä¹å¤±è´¥: ${fallbackError.message}`, 'error'); |
| | | return null; |
| | | } |
| | | } |
| | | |
| | | // Process PCM buffer data |
| | | processPCMBuffer(buffer) { |
| | | if (!this.isRecording) return; |
| | | const newBuffer = new Int16Array(this.pcmDataBuffer.length + buffer.length); |
| | | newBuffer.set(this.pcmDataBuffer); |
| | | newBuffer.set(buffer, this.pcmDataBuffer.length); |
| | | this.pcmDataBuffer = newBuffer; |
| | | const samplesPerFrame = 960; |
| | | while (this.pcmDataBuffer.length >= samplesPerFrame) { |
| | | const frameData = this.pcmDataBuffer.slice(0, samplesPerFrame); |
| | | this.pcmDataBuffer = this.pcmDataBuffer.slice(samplesPerFrame); |
| | | this.encodeAndSendOpus(frameData); |
| | | } |
| | | } |
| | | |
| | | // Encode and send Opus data |
| | | encodeAndSendOpus(pcmData = null) { |
| | | if (!this.opusEncoder) { |
| | | log('Opusç¼ç 卿ªåå§å', 'error'); |
| | | return; |
| | | } |
| | | try { |
| | | if (pcmData) { |
| | | const opusData = this.opusEncoder.encode(pcmData); |
| | | if (opusData && opusData.length > 0) { |
| | | this.audioBuffers.push(opusData.buffer); |
| | | this.totalAudioSize += opusData.length; |
| | | if (this.websocket && this.websocket.readyState === WebSocket.OPEN) { |
| | | try { |
| | | this.websocket.send(opusData.buffer); |
| | | } catch (error) { |
| | | log(`WebSocketåéé误: ${error.message}`, 'error'); |
| | | } |
| | | } |
| | | } else { |
| | | log('Opusç¼ç å¤±è´¥ï¼æªè¿åæææ°æ®', 'error'); |
| | | } |
| | | } else { |
| | | if (this.pcmDataBuffer.length > 0) { |
| | | const samplesPerFrame = 960; |
| | | if (this.pcmDataBuffer.length < samplesPerFrame) { |
| | | const paddedBuffer = new Int16Array(samplesPerFrame); |
| | | paddedBuffer.set(this.pcmDataBuffer); |
| | | this.encodeAndSendOpus(paddedBuffer); |
| | | } else { |
| | | this.encodeAndSendOpus(this.pcmDataBuffer.slice(0, samplesPerFrame)); |
| | | } |
| | | this.pcmDataBuffer = new Int16Array(0); |
| | | } |
| | | } |
| | | } catch (error) { |
| | | log(`Opusç¼ç é误: ${error.message}`, 'error'); |
| | | } |
| | | } |
| | | |
| | | // Start recording |
| | | async start() { |
| | | if (this.isRecording) return false; |
| | | try { |
| | | if (!this.initEncoder()) { |
| | | log('æ æ³å¼å§å½é³: Opusç¼ç å¨åå§å失败', 'error'); |
| | | return false; |
| | | } |
| | | log('请è³å°å½å¶1-2ç§é³é¢ä»¥ç¡®ä¿æ¶éè¶³å¤çæ°æ®', 'info'); |
| | | const stream = await navigator.mediaDevices.getUserMedia({ audio: { echoCancellation: true, noiseSuppression: true, sampleRate: 16000, channelCount: 1 } }); |
| | | this.audioContext = this.getAudioContext(); |
| | | if (this.audioContext.state === 'suspended') { |
| | | await this.audioContext.resume(); |
| | | } |
| | | const processorResult = await this.createAudioProcessor(); |
| | | if (!processorResult) { |
| | | log('æ æ³å建é³é¢å¤çå¨', 'error'); |
| | | return false; |
| | | } |
| | | this.audioProcessor = processorResult.node; |
| | | this.audioProcessorType = processorResult.type; |
| | | this.audioSource = this.audioContext.createMediaStreamSource(stream); |
| | | this.analyser = this.audioContext.createAnalyser(); |
| | | this.analyser.fftSize = 2048; |
| | | this.audioSource.connect(this.analyser); |
| | | this.audioSource.connect(this.audioProcessor); |
| | | this.pcmDataBuffer = new Int16Array(); |
| | | this.audioBuffers = []; |
| | | this.totalAudioSize = 0; |
| | | this.isRecording = true; |
| | | if (this.audioProcessorType === 'worklet' && this.audioProcessor.port) { |
| | | this.audioProcessor.port.postMessage({ command: 'start' }); |
| | | } |
| | | // Send listening start message |
| | | if (this.websocket && this.websocket.readyState === WebSocket.OPEN) { |
| | | log(`å·²åéå½é³å¼å§æ¶æ¯`, 'info'); |
| | | } else { |
| | | log('WebSocketæªè¿æ¥ï¼æ æ³åéå¼å§æ¶æ¯', 'error'); |
| | | return false; |
| | | } |
| | | // Start visualization |
| | | if (this.onVisualizerUpdate) { |
| | | const dataArray = new Uint8Array(this.analyser.frequencyBinCount); |
| | | this.startVisualization(dataArray); |
| | | } |
| | | // Immediately notify recording start, update button state |
| | | if (this.onRecordingStart) { |
| | | this.onRecordingStart(0); |
| | | } |
| | | // Start recording timer |
| | | let recordingSeconds = 0; |
| | | this.recordingTimer = setInterval(() => { |
| | | recordingSeconds += 0.1; |
| | | if (this.onRecordingStart) { |
| | | this.onRecordingStart(recordingSeconds); |
| | | } |
| | | }, 100); |
| | | log('å·²å¼å§PCMç´æ¥å½é³', 'success'); |
| | | return true; |
| | | } catch (error) { |
| | | log(`ç´æ¥å½é³å¯å¨é误: ${error.message}`, 'error'); |
| | | this.isRecording = false; |
| | | return false; |
| | | } |
| | | } |
| | | |
| | | // Start visualization |
| | | startVisualization(dataArray) { |
| | | const draw = () => { |
| | | this.visualizationRequest = requestAnimationFrame(() => draw()); |
| | | if (!this.isRecording) return; |
| | | this.analyser.getByteFrequencyData(dataArray); |
| | | if (this.onVisualizerUpdate) { |
| | | this.onVisualizerUpdate(dataArray); |
| | | } |
| | | }; |
| | | draw(); |
| | | } |
| | | |
| | | // Stop recording |
| | | stop() { |
| | | if (!this.isRecording) return false; |
| | | try { |
| | | this.isRecording = false; |
| | | if (this.audioProcessor) { |
| | | if (this.audioProcessorType === 'worklet' && this.audioProcessor.port) { |
| | | this.audioProcessor.port.postMessage({ command: 'stop' }); |
| | | } |
| | | this.audioProcessor.disconnect(); |
| | | this.audioProcessor = null; |
| | | } |
| | | if (this.audioSource) { |
| | | this.audioSource.disconnect(); |
| | | this.audioSource = null; |
| | | } |
| | | if (this.visualizationRequest) { |
| | | cancelAnimationFrame(this.visualizationRequest); |
| | | this.visualizationRequest = null; |
| | | } |
| | | if (this.recordingTimer) { |
| | | clearInterval(this.recordingTimer); |
| | | this.recordingTimer = null; |
| | | } |
| | | // Encode and send remaining data |
| | | this.encodeAndSendOpus(); |
| | | // Send end signal |
| | | if (this.websocket && this.websocket.readyState === WebSocket.OPEN) { |
| | | const emptyOpusFrame = new Uint8Array(0); |
| | | this.websocket.send(emptyOpusFrame); |
| | | log('å·²åéå½é³åæ¢ä¿¡å·', 'info'); |
| | | } |
| | | if (this.onRecordingStop) { |
| | | this.onRecordingStop(); |
| | | } |
| | | log('已忢PCMç´æ¥å½é³', 'success'); |
| | | return true; |
| | | } catch (error) { |
| | | log(`ç´æ¥å½é³åæ¢é误: ${error.message}`, 'error'); |
| | | return false; |
| | | } |
| | | } |
| | | |
| | | // Get analyser |
| | | getAnalyser() { |
| | | return this.analyser; |
| | | } |
| | | } |
| | | |
| | | // Create singleton instance |
| | | let audioRecorderInstance = null; |
| | | |
| | | export function getAudioRecorder() { |
| | | if (!audioRecorderInstance) { |
| | | audioRecorderInstance = new AudioRecorder(); |
| | | } |
| | | return audioRecorderInstance; |
| | | } |
| | | |
| | | /** |
| | | * Check if microphone is available |
| | | * @returns {Promise<boolean>} Returns true if available, false if not available |
| | | */ |
| | | export async function checkMicrophoneAvailability() { |
| | | // Check if browser supports getUserMedia API |
| | | if (!navigator.mediaDevices || !navigator.mediaDevices.getUserMedia) { |
| | | log('æµè§å¨ä¸æ¯ægetUserMedia API', 'warning'); |
| | | return false; |
| | | } |
| | | try { |
| | | // Try to access microphone |
| | | const stream = await navigator.mediaDevices.getUserMedia({ audio: { echoCancellation: true, noiseSuppression: true, sampleRate: 16000, channelCount: 1 } }); |
| | | // Immediately stop all tracks to release microphone |
| | | stream.getTracks().forEach(track => track.stop()); |
| | | log('麦å
é£å¯ç¨æ§æ£æ¥æå', 'success'); |
| | | return true; |
| | | } catch (error) { |
| | | log(`麦å
é£ä¸å¯ç¨: ${error.message}`, 'warning'); |
| | | return false; |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * Check if it is HTTP non-localhost access |
| | | * @returns {boolean} Returns true if it is HTTP non-localhost access |
| | | */ |
| | | export function isHttpNonLocalhost() { |
| | | const protocol = window.location.protocol; |
| | | const hostname = window.location.hostname; |
| | | // Check if it is HTTP protocol |
| | | if (protocol !== 'http:') { |
| | | return false; |
| | | } |
| | | // localhost and 127.0.0.1 can use microphone |
| | | if (hostname === 'localhost' || hostname === '127.0.0.1') { |
| | | return false; |
| | | } |
| | | // Private IP addresses can also use microphone (browser allows) |
| | | if (hostname.startsWith('192.168.') || hostname.startsWith('10.') || hostname.startsWith('172.')) { |
| | | return false; |
| | | } |
| | | // Other HTTP access is considered non-localhost |
| | | return true; |
| | | } |
| New file |
| | |
| | | import BlockingQueue from '../../utils/blocking-queue.js?v=0205'; |
| | | import { log } from '../../utils/logger.js?v=0205'; |
| | | |
| | | // é³é¢æµææ¾ä¸ä¸æç±» |
| | | export class StreamingContext { |
| | | constructor(opusDecoder, audioContext, sampleRate, channels, minAudioDuration) { |
| | | this.opusDecoder = opusDecoder; |
| | | this.audioContext = audioContext; |
| | | |
| | | // é³é¢åæ° |
| | | this.sampleRate = sampleRate; |
| | | this.channels = channels; |
| | | this.minAudioDuration = minAudioDuration; |
| | | |
| | | // åå§åéååç¶æ |
| | | this.queue = []; // 已解ç çPCMéåãæ£å¨ææ¾ |
| | | this.activeQueue = new BlockingQueue(); // 已解ç çPCMéåãåå¤ææ¾ |
| | | this.pendingAudioBufferQueue = []; // å¾
å¤ççç¼åéå |
| | | this.audioBufferQueue = new BlockingQueue(); // ç¼åéå |
| | | this.playing = false; // æ¯å¦æ£å¨ææ¾ |
| | | this.endOfStream = false; // æ¯å¦æ¶å°ç»æä¿¡å· |
| | | this.source = null; // å½åé³é¢æº |
| | | this.totalSamples = 0; // ç´¯ç§¯çæ»æ ·æ¬æ° |
| | | this.lastPlayTime = 0; // 䏿¬¡ææ¾çæ¶é´æ³ |
| | | this.scheduledEndTime = 0; // å·²è°åº¦é³é¢çç»ææ¶é´ |
| | | |
| | | // åå§ååæå¨èç¹ï¼ä¾Live2D使ç¨ï¼ |
| | | this.analyser = this.audioContext.createAnalyser(); |
| | | this.analyser.fftSize = 256; |
| | | } |
| | | |
| | | // ç¼åé³é¢æ°ç» |
| | | pushAudioBuffer(item) { |
| | | this.audioBufferQueue.enqueue(...item); |
| | | } |
| | | |
| | | // è·åéè¦å¤çç¼åéåï¼å线ç¨ï¼å¨audioBufferQueueä¸ç´æ´æ°çç¶æä¸ä¸ä¼åºç°å®å
¨é®é¢ |
| | | async getPendingAudioBufferQueue() { |
| | | // çå¾
æ°æ®å°è¾¾å¹¶è·å |
| | | const data = await this.audioBufferQueue.dequeue(); |
| | | // èµå¼ç»å¾
å¤çéå |
| | | this.pendingAudioBufferQueue = data; |
| | | } |
| | | |
| | | // è·åæ£å¨ææ¾å·²è§£ç çPCMéåï¼å线ç¨ï¼å¨activeQueueä¸ç´æ´æ°çç¶æä¸ä¸ä¼åºç°å®å
¨é®é¢ |
| | | async getQueue(minSamples) { |
| | | const num = minSamples - this.queue.length > 0 ? minSamples - this.queue.length : 1; |
| | | |
| | | // çå¾
æ°æ®å¹¶è·å |
| | | const tempArray = await this.activeQueue.dequeue(num); |
| | | this.queue.push(...tempArray); |
| | | } |
| | | |
| | | // å°Int16é³é¢æ°æ®è½¬æ¢ä¸ºFloat32é³é¢æ°æ® |
| | | convertInt16ToFloat32(int16Data) { |
| | | const float32Data = new Float32Array(int16Data.length); |
| | | for (let i = 0; i < int16Data.length; i++) { |
| | | // å°[-32768,32767]èå´è½¬æ¢ä¸º[-1,1]ï¼ç»ä¸ä½¿ç¨32768.0é¿å
ä¸å¯¹ç§°å¤±ç |
| | | float32Data[i] = int16Data[i] / 32768.0; |
| | | } |
| | | return float32Data; |
| | | } |
| | | |
| | | // è·åå¾
è§£ç å
æ° |
| | | getPendingDecodeCount() { |
| | | return this.audioBufferQueue.length + this.pendingAudioBufferQueue.length; |
| | | } |
| | | |
| | | // è·åå¾
ææ¾æ ·æ¬æ°ï¼è½¬æ¢ä¸ºå
æ°ï¼æ¯å
960æ ·æ¬ï¼ |
| | | getPendingPlayCount() { |
| | | // 计ç®å·²å¨éåä¸çæ ·æ¬ |
| | | const queuedSamples = this.activeQueue.length + this.queue.length; |
| | | |
| | | // 计ç®å·²è°åº¦ä½æªææ¾çæ ·æ¬ï¼å¨Web Audioç¼å²åºä¸ï¼ |
| | | let scheduledSamples = 0; |
| | | if (this.playing && this.scheduledEndTime) { |
| | | const currentTime = this.audioContext.currentTime; |
| | | const remainingTime = Math.max(0, this.scheduledEndTime - currentTime); |
| | | scheduledSamples = Math.floor(remainingTime * this.sampleRate); |
| | | } |
| | | |
| | | const totalSamples = queuedSamples + scheduledSamples; |
| | | return Math.ceil(totalSamples / 960); |
| | | } |
| | | |
| | | // æ¸
空ææé³é¢ç¼å² |
| | | clearAllBuffers() { |
| | | log('æ¸
空ææé³é¢ç¼å²', 'info'); |
| | | |
| | | // æ¸
空ææéåï¼ä½¿ç¨clearæ¹æ³ä¿æå¯¹è±¡å¼ç¨ï¼ |
| | | this.audioBufferQueue.clear(); |
| | | this.pendingAudioBufferQueue = []; |
| | | this.activeQueue.clear(); |
| | | this.queue = []; |
| | | |
| | | // 忢å½åææ¾çé³é¢æº |
| | | if (this.source) { |
| | | try { |
| | | this.source.stop(); |
| | | this.source.disconnect(); |
| | | } catch (e) { |
| | | // 忽ç¥å·²ç»åæ¢çé误 |
| | | } |
| | | this.source = null; |
| | | } |
| | | |
| | | // éç½®ç¶æ |
| | | this.playing = false; |
| | | this.scheduledEndTime = this.audioContext.currentTime; |
| | | this.totalSamples = 0; |
| | | |
| | | log('é³é¢ç¼å²å·²æ¸
空', 'success'); |
| | | } |
| | | |
| | | // è·ååæå¨èç¹ï¼ä¾Live2D使ç¨ï¼ |
| | | getAnalyser() { |
| | | return this.analyser; |
| | | } |
| | | |
| | | // å°Opusæ°æ®è§£ç 为PCM |
| | | async decodeOpusFrames() { |
| | | if (!this.opusDecoder) { |
| | | log('Opusè§£ç 卿ªåå§åï¼æ æ³è§£ç ', 'error'); |
| | | return; |
| | | } else { |
| | | log('Opusè§£ç å¨å¯å¨', 'info'); |
| | | } |
| | | |
| | | while (true) { |
| | | let decodedSamples = []; |
| | | for (const frame of this.pendingAudioBufferQueue) { |
| | | try { |
| | | // 使ç¨Opusè§£ç å¨è§£ç |
| | | const frameData = this.opusDecoder.decode(frame); |
| | | if (frameData && frameData.length > 0) { |
| | | // 转æ¢ä¸ºFloat32 |
| | | const floatData = this.convertInt16ToFloat32(frameData); |
| | | // 使ç¨å¾ªç¯æ¿ä»£å±å¼è¿ç®ç¬¦ |
| | | for (let i = 0; i < floatData.length; i++) { |
| | | decodedSamples.push(floatData[i]); |
| | | } |
| | | } |
| | | } catch (error) { |
| | | log("Opusè§£ç 失败: " + error.message, 'error'); |
| | | } |
| | | } |
| | | |
| | | if (decodedSamples.length > 0) { |
| | | // 使ç¨å¾ªç¯æ¿ä»£å±å¼è¿ç®ç¬¦ |
| | | for (let i = 0; i < decodedSamples.length; i++) { |
| | | this.activeQueue.enqueue(decodedSamples[i]); |
| | | } |
| | | this.totalSamples += decodedSamples.length; |
| | | } else { |
| | | log('没ææåè§£ç çæ ·æ¬', 'warning'); |
| | | } |
| | | await this.getPendingAudioBufferQueue(); |
| | | } |
| | | } |
| | | |
| | | // å¼å§ææ¾é³é¢ |
| | | async startPlaying() { |
| | | this.scheduledEndTime = this.audioContext.currentTime; // è·è¸ªå·²è°åº¦é³é¢çç»ææ¶é´ |
| | | |
| | | while (true) { |
| | | // åå§ç¼å²ï¼çå¾
è¶³å¤çæ ·æ¬åå¼å§ææ¾ |
| | | const minSamples = this.sampleRate * this.minAudioDuration * 2; |
| | | if (!this.playing && this.queue.length < minSamples) { |
| | | await this.getQueue(minSamples); |
| | | } |
| | | this.playing = true; |
| | | |
| | | // æç»ææ¾éåä¸çé³é¢ï¼æ¯æ¬¡ææ¾ä¸ä¸ªå°å |
| | | while (this.playing && this.queue.length > 0) { |
| | | // æ¯æ¬¡ææ¾120msçé³é¢ï¼2个Opuså
ï¼ |
| | | const playDuration = 0.12; |
| | | const targetSamples = Math.floor(this.sampleRate * playDuration); |
| | | const actualSamples = Math.min(this.queue.length, targetSamples); |
| | | |
| | | if (actualSamples === 0) break; |
| | | |
| | | const currentSamples = this.queue.splice(0, actualSamples); |
| | | const audioBuffer = this.audioContext.createBuffer(this.channels, currentSamples.length, this.sampleRate); |
| | | audioBuffer.copyToChannel(new Float32Array(currentSamples), 0); |
| | | |
| | | // å建é³é¢æº |
| | | this.source = this.audioContext.createBufferSource(); |
| | | this.source.buffer = audioBuffer; |
| | | |
| | | // 精确è°åº¦ææ¾æ¶é´ |
| | | const currentTime = this.audioContext.currentTime; |
| | | const startTime = Math.max(this.scheduledEndTime, currentTime); |
| | | |
| | | // è¿æ¥å°åæå¨åè¾åº |
| | | this.source.connect(this.analyser); |
| | | this.source.connect(this.audioContext.destination); |
| | | |
| | | log(`è°åº¦ææ¾ ${currentSamples.length} ä¸ªæ ·æ¬ï¼çº¦ ${(currentSamples.length / this.sampleRate).toFixed(2)} ç§`, 'debug'); |
| | | this.source.start(startTime); |
| | | |
| | | // æ´æ°ä¸ä¸ä¸ªé³é¢åçè°åº¦æ¶é´ |
| | | const duration = audioBuffer.duration; |
| | | this.scheduledEndTime = startTime + duration; |
| | | this.lastPlayTime = startTime; |
| | | |
| | | // 妿éå䏿°æ®ä¸è¶³ï¼çå¾
æ°æ°æ® |
| | | if (this.queue.length < targetSamples) { |
| | | break; |
| | | } |
| | | } |
| | | |
| | | // çå¾
æ°æ°æ® |
| | | await this.getQueue(minSamples); |
| | | } |
| | | } |
| | | } |
| | | |
| | | // å建streamingContextå®ä¾çå·¥å彿° |
| | | export function createStreamingContext(opusDecoder, audioContext, sampleRate, channels, minAudioDuration) { |
| | | return new StreamingContext(opusDecoder, audioContext, sampleRate, channels, minAudioDuration); |
| | | } |
| New file |
| | |
| | | import { log } from '../../utils/logger.js?v=0205'; |
| | | |
| | | // ========================================== |
| | | // MCP å·¥å
·ç®¡çé»è¾ |
| | | // ========================================== |
| | | |
| | | // å
¨å±åé |
| | | let mcpTools = []; |
| | | let mcpEditingIndex = null; |
| | | let mcpProperties = []; |
| | | let websocket = null; // å°ä»å¤é¨è®¾ç½® |
| | | |
| | | /** |
| | | * 设置 WebSocket å®ä¾ |
| | | * @param {WebSocket} ws - WebSocket è¿æ¥å®ä¾ |
| | | */ |
| | | export function setWebSocket(ws) { |
| | | websocket = ws; |
| | | } |
| | | |
| | | /** |
| | | * åå§å MCP å·¥å
· |
| | | */ |
| | | export async function initMcpTools() { |
| | | // å è½½é»è®¤å·¥å
·æ°æ® |
| | | const defaultMcpTools = await fetch("js/config/default-mcp-tools.json").then(res => res.json()); |
| | | const savedTools = localStorage.getItem('mcpTools'); |
| | | if (savedTools) { |
| | | try { |
| | | const parsedTools = JSON.parse(savedTools); |
| | | // åå¹¶é»è®¤å·¥å
·åç¨æ·ä¿åçå·¥å
·ï¼ä¿çç¨æ·èªå®ä¹çå·¥å
· |
| | | const defaultToolNames = new Set(defaultMcpTools.map(t => t.name)); |
| | | // æ·»å é»è®¤å·¥å
·ä¸ä¸åå¨çæ°å·¥å
· |
| | | parsedTools.forEach(tool => { |
| | | if (!defaultToolNames.has(tool.name)) { |
| | | defaultMcpTools.push(tool); |
| | | } |
| | | }); |
| | | mcpTools = defaultMcpTools; |
| | | } catch (e) { |
| | | log('å è½½MCPå·¥å
·å¤±è´¥ï¼ä½¿ç¨é»è®¤å·¥å
·', 'warning'); |
| | | mcpTools = [...defaultMcpTools]; |
| | | } |
| | | } else { |
| | | mcpTools = [...defaultMcpTools]; |
| | | } |
| | | renderMcpTools(); |
| | | setupMcpEventListeners(); |
| | | } |
| | | |
| | | /** |
| | | * 渲æå·¥å
·å表 |
| | | */ |
| | | function renderMcpTools() { |
| | | const container = document.getElementById('mcpToolsContainer'); |
| | | const countSpan = document.getElementById('mcpToolsCount'); |
| | | if (!container) { |
| | | return; // Container not found, skip rendering |
| | | } |
| | | if (countSpan) { |
| | | countSpan.textContent = `${mcpTools.length} 个工å
·`; |
| | | } |
| | | if (mcpTools.length === 0) { |
| | | container.innerHTML = '<div style="text-align: center; padding: 30px; color: #999;">ææ å·¥å
·ï¼ç¹å»ä¸æ¹æé®æ·»å æ°å·¥å
·</div>'; |
| | | return; |
| | | } |
| | | container.innerHTML = mcpTools.map((tool, index) => { |
| | | const paramCount = tool.inputSchema.properties ? Object.keys(tool.inputSchema.properties).length : 0; |
| | | const requiredCount = tool.inputSchema.required ? tool.inputSchema.required.length : 0; |
| | | const hasMockResponse = tool.mockResponse && Object.keys(tool.mockResponse).length > 0; |
| | | return ` |
| | | <div class="mcp-tool-card"> |
| | | <div class="mcp-tool-header"> |
| | | <div class="mcp-tool-name">${tool.name}</div> |
| | | <div class="mcp-tool-actions"> |
| | | <button class="mcp-edit-btn" onclick="window.mcpModule.editMcpTool(${index})"> |
| | | âï¸ ç¼è¾ |
| | | </button> |
| | | <button class="mcp-delete-btn" onclick="window.mcpModule.deleteMcpTool(${index})"> |
| | | ðï¸ å é¤ |
| | | </button> |
| | | </div> |
| | | </div> |
| | | <div class="mcp-tool-description">${tool.description}</div> |
| | | <div class="mcp-tool-info"> |
| | | <div class="mcp-tool-info-row"> |
| | | <span class="mcp-tool-info-label">åæ°æ°é:</span> |
| | | <span class="mcp-tool-info-value">${paramCount} 个 ${requiredCount > 0 ? `(${requiredCount} 个å¿
å¡«)` : ''}</span> |
| | | </div> |
| | | <div class="mcp-tool-info-row"> |
| | | <span class="mcp-tool-info-label">模æè¿å:</span> |
| | | <span class="mcp-tool-info-value">${hasMockResponse ? 'â
å·²é
ç½®: ' + JSON.stringify(tool.mockResponse) : '⪠使ç¨é»è®¤'}</span> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | `; |
| | | }).join(''); |
| | | } |
| | | |
| | | /** |
| | | * 渲æåæ°å表 |
| | | */ |
| | | function renderMcpProperties() { |
| | | const container = document.getElementById('mcpPropertiesContainer'); |
| | | const emptyState = document.getElementById('mcpEmptyState'); |
| | | if (!container) { |
| | | return; // Container not found, skip rendering |
| | | } |
| | | if (mcpProperties.length === 0) { |
| | | if (emptyState) { |
| | | emptyState.style.display = 'block'; |
| | | } |
| | | container.innerHTML = ''; |
| | | return; |
| | | } |
| | | if (emptyState) { |
| | | emptyState.style.display = 'none'; |
| | | } |
| | | container.innerHTML = mcpProperties.map((prop, index) => ` |
| | | <div class="mcp-property-card" onclick="window.mcpModule.editMcpProperty(${index})"> |
| | | <div class="mcp-property-row-label"> |
| | | <span class="mcp-property-label">åæ°åç§°</span> |
| | | <span class="mcp-property-value">${prop.name}${prop.required ? ' <span class="mcp-property-required-badge">[å¿
å¡«]</span>' : ''}</span> |
| | | </div> |
| | | <div class="mcp-property-row-label"> |
| | | <span class="mcp-property-label">æ°æ®ç±»å</span> |
| | | <span class="mcp-property-value">${getTypeLabel(prop.type)}</span> |
| | | </div> |
| | | <div class="mcp-property-row-label"> |
| | | <span class="mcp-property-label">æè¿°</span> |
| | | <span class="mcp-property-value">${prop.description || '-'}</span> |
| | | </div> |
| | | <div class="mcp-property-row-action"> |
| | | <button class="mcp-property-delete-btn" onclick="event.stopPropagation(); window.mcpModule.deleteMcpProperty(${index})">å é¤</button> |
| | | </div> |
| | | </div> |
| | | `).join(''); |
| | | } |
| | | |
| | | /** |
| | | * è·åæ°æ®ç±»åæ ç¾ |
| | | */ |
| | | function getTypeLabel(type) { |
| | | const typeMap = { |
| | | 'string': 'å符串', |
| | | 'integer': 'æ´æ°', |
| | | 'number': 'æ°å', |
| | | 'boolean': 'å¸å°å¼', |
| | | 'array': 'æ°ç»', |
| | | 'object': '对象' |
| | | }; |
| | | return typeMap[type] || type; |
| | | } |
| | | |
| | | /** |
| | | * æ·»å åæ° - æå¼åæ°ç¼è¾æ¨¡ææ¡ |
| | | */ |
| | | function addMcpProperty() { |
| | | openPropertyModal(); |
| | | } |
| | | |
| | | /** |
| | | * ç¼è¾åæ° - æå¼åæ°ç¼è¾æ¨¡ææ¡ |
| | | */ |
| | | function editMcpProperty(index) { |
| | | openPropertyModal(index); |
| | | } |
| | | |
| | | /** |
| | | * æå¼åæ°ç¼è¾æ¨¡ææ¡ |
| | | */ |
| | | function openPropertyModal(index = null) { |
| | | const form = document.getElementById('mcpPropertyForm'); |
| | | const title = document.getElementById('mcpPropertyModalTitle'); |
| | | document.getElementById('mcpPropertyIndex').value = index !== null ? index : -1; |
| | | |
| | | if (index !== null) { |
| | | const prop = mcpProperties[index]; |
| | | title.textContent = 'ç¼è¾åæ°'; |
| | | document.getElementById('mcpPropertyName').value = prop.name; |
| | | document.getElementById('mcpPropertyType').value = prop.type || 'string'; |
| | | document.getElementById('mcpPropertyMinimum').value = prop.minimum !== undefined ? prop.minimum : ''; |
| | | document.getElementById('mcpPropertyMaximum').value = prop.maximum !== undefined ? prop.maximum : ''; |
| | | document.getElementById('mcpPropertyDescription').value = prop.description || ''; |
| | | document.getElementById('mcpPropertyRequired').checked = prop.required || false; |
| | | } else { |
| | | title.textContent = 'æ·»å åæ°'; |
| | | form.reset(); |
| | | document.getElementById('mcpPropertyName').value = `param_${mcpProperties.length + 1}`; |
| | | document.getElementById('mcpPropertyType').value = 'string'; |
| | | document.getElementById('mcpPropertyMinimum').value = ''; |
| | | document.getElementById('mcpPropertyMaximum').value = ''; |
| | | document.getElementById('mcpPropertyDescription').value = ''; |
| | | document.getElementById('mcpPropertyRequired').checked = false; |
| | | } |
| | | |
| | | updatePropertyRangeVisibility(); |
| | | document.getElementById('mcpPropertyModal').style.display = 'flex'; |
| | | } |
| | | |
| | | /** |
| | | * å
³éåæ°ç¼è¾æ¨¡ææ¡ |
| | | */ |
| | | function closePropertyModal() { |
| | | document.getElementById('mcpPropertyModal').style.display = 'none'; |
| | | } |
| | | |
| | | /** |
| | | * æ´æ°æ°å¼èå´è¾å
¥æ¡çå¯è§æ§ |
| | | */ |
| | | function updatePropertyRangeVisibility() { |
| | | const type = document.getElementById('mcpPropertyType').value; |
| | | const rangeGroup = document.getElementById('mcpPropertyRangeGroup'); |
| | | if (type === 'integer' || type === 'number') { |
| | | rangeGroup.style.display = 'block'; |
| | | } else { |
| | | rangeGroup.style.display = 'none'; |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * å¤çåæ°è¡¨åæäº¤ |
| | | */ |
| | | function handlePropertySubmit(e) { |
| | | e.preventDefault(); |
| | | const index = parseInt(document.getElementById('mcpPropertyIndex').value); |
| | | const name = document.getElementById('mcpPropertyName').value.trim(); |
| | | const type = document.getElementById('mcpPropertyType').value; |
| | | const minimum = document.getElementById('mcpPropertyMinimum').value; |
| | | const maximum = document.getElementById('mcpPropertyMaximum').value; |
| | | const description = document.getElementById('mcpPropertyDescription').value.trim(); |
| | | const required = document.getElementById('mcpPropertyRequired').checked; |
| | | |
| | | // æ£æ¥åç§°éå¤ |
| | | const isDuplicate = mcpProperties.some((p, i) => i !== index && p.name === name); |
| | | if (isDuplicate) { |
| | | alert('åæ°åç§°å·²åå¨ï¼è¯·ä½¿ç¨ä¸åçåç§°'); |
| | | return; |
| | | } |
| | | |
| | | const propData = { |
| | | name, |
| | | type, |
| | | description, |
| | | required |
| | | }; |
| | | |
| | | // æ°å¼ç±»åæ·»å èå´éå¶ |
| | | if (type === 'integer' || type === 'number') { |
| | | if (minimum !== '') { |
| | | propData.minimum = parseFloat(minimum); |
| | | } |
| | | if (maximum !== '') { |
| | | propData.maximum = parseFloat(maximum); |
| | | } |
| | | } |
| | | |
| | | if (index >= 0) { |
| | | mcpProperties[index] = propData; |
| | | } else { |
| | | mcpProperties.push(propData); |
| | | } |
| | | |
| | | renderMcpProperties(); |
| | | closePropertyModal(); |
| | | } |
| | | |
| | | /** |
| | | * å é¤åæ° |
| | | */ |
| | | function deleteMcpProperty(index) { |
| | | mcpProperties.splice(index, 1); |
| | | renderMcpProperties(); |
| | | } |
| | | |
| | | /** |
| | | * 设置äºä»¶çå¬ |
| | | */ |
| | | function setupMcpEventListeners() { |
| | | const panel = document.getElementById('mcpToolsPanel'); |
| | | const addBtn = document.getElementById('addMcpToolBtn'); |
| | | const modal = document.getElementById('mcpToolModal'); |
| | | const closeBtn = document.getElementById('closeMcpModalBtn'); |
| | | const cancelBtn = document.getElementById('cancelMcpBtn'); |
| | | const form = document.getElementById('mcpToolForm'); |
| | | const addPropertyBtn = document.getElementById('addMcpPropertyBtn'); |
| | | |
| | | // åæ°ç¼è¾æ¨¡ææ¡ç¸å
³å
ç´ |
| | | const propertyModal = document.getElementById('mcpPropertyModal'); |
| | | const closePropertyBtn = document.getElementById('closeMcpPropertyModalBtn'); |
| | | const cancelPropertyBtn = document.getElementById('cancelMcpPropertyBtn'); |
| | | const propertyForm = document.getElementById('mcpPropertyForm'); |
| | | const propertyTypeSelect = document.getElementById('mcpPropertyType'); |
| | | |
| | | // Return early if required elements don't exist (e.g., in test environment) |
| | | if (!panel || !addBtn || !modal || !closeBtn || !cancelBtn || !form || !addPropertyBtn) { |
| | | return; |
| | | } |
| | | addBtn.addEventListener('click', () => openMcpModal()); |
| | | closeBtn.addEventListener('click', closeMcpModal); |
| | | cancelBtn.addEventListener('click', closeMcpModal); |
| | | addPropertyBtn.addEventListener('click', addMcpProperty); |
| | | form.addEventListener('submit', handleMcpSubmit); |
| | | |
| | | // åæ°ç¼è¾æ¨¡ææ¡äºä»¶ |
| | | if (propertyModal && closePropertyBtn && cancelPropertyBtn && propertyForm && propertyTypeSelect) { |
| | | closePropertyBtn.addEventListener('click', closePropertyModal); |
| | | cancelPropertyBtn.addEventListener('click', closePropertyModal); |
| | | propertyForm.addEventListener('submit', handlePropertySubmit); |
| | | propertyTypeSelect.addEventListener('change', updatePropertyRangeVisibility); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * æå¼æ¨¡ææ¡ |
| | | */ |
| | | function openMcpModal(index = null) { |
| | | const isConnected = websocket && websocket.readyState === WebSocket.OPEN; |
| | | if (isConnected) { |
| | | alert('WebSocket å·²è¿æ¥ï¼æ æ³ç¼è¾å·¥å
·'); |
| | | return; |
| | | } |
| | | mcpEditingIndex = index; |
| | | const errorContainer = document.getElementById('mcpErrorContainer'); |
| | | errorContainer.innerHTML = ''; |
| | | if (index !== null) { |
| | | document.getElementById('mcpModalTitle').textContent = 'ç¼è¾å·¥å
·'; |
| | | const tool = mcpTools[index]; |
| | | document.getElementById('mcpToolName').value = tool.name; |
| | | document.getElementById('mcpToolDescription').value = tool.description; |
| | | document.getElementById('mcpMockResponse').value = tool.mockResponse ? JSON.stringify(tool.mockResponse, null, 2) : ''; |
| | | mcpProperties = []; |
| | | const schema = tool.inputSchema; |
| | | if (schema.properties) { |
| | | Object.keys(schema.properties).forEach(key => { |
| | | const prop = schema.properties[key]; |
| | | mcpProperties.push({ |
| | | name: key, |
| | | type: prop.type || 'string', |
| | | minimum: prop.minimum, |
| | | maximum: prop.maximum, |
| | | description: prop.description || '', |
| | | required: schema.required && schema.required.includes(key) |
| | | }); |
| | | }); |
| | | } |
| | | } else { |
| | | document.getElementById('mcpModalTitle').textContent = 'æ·»å å·¥å
·'; |
| | | document.getElementById('mcpToolForm').reset(); |
| | | mcpProperties = []; |
| | | } |
| | | renderMcpProperties(); |
| | | document.getElementById('mcpToolModal').style.display = 'flex'; |
| | | } |
| | | |
| | | /** |
| | | * å
³éæ¨¡ææ¡ |
| | | */ |
| | | function closeMcpModal() { |
| | | document.getElementById('mcpToolModal').style.display = 'none'; |
| | | mcpEditingIndex = null; |
| | | document.getElementById('mcpToolForm').reset(); |
| | | mcpProperties = []; |
| | | document.getElementById('mcpErrorContainer').innerHTML = ''; |
| | | } |
| | | |
| | | /** |
| | | * å¤ç表åæäº¤ |
| | | */ |
| | | function handleMcpSubmit(e) { |
| | | e.preventDefault(); |
| | | const errorContainer = document.getElementById('mcpErrorContainer'); |
| | | errorContainer.innerHTML = ''; |
| | | const name = document.getElementById('mcpToolName').value.trim(); |
| | | const description = document.getElementById('mcpToolDescription').value.trim(); |
| | | const mockResponseText = document.getElementById('mcpMockResponse').value.trim(); |
| | | // æ£æ¥åç§°éå¤ |
| | | const isDuplicate = mcpTools.some((tool, index) => tool.name === name && index !== mcpEditingIndex); |
| | | if (isDuplicate) { |
| | | showMcpError('å·¥å
·åç§°å·²åå¨ï¼è¯·ä½¿ç¨ä¸åçåç§°'); |
| | | return; |
| | | } |
| | | // è§£ææ¨¡æè¿åç»æ |
| | | let mockResponse = null; |
| | | if (mockResponseText) { |
| | | try { |
| | | mockResponse = JSON.parse(mockResponseText); |
| | | } catch (e) { |
| | | showMcpError('模æè¿åç»æä¸æ¯ææç JSON æ ¼å¼: ' + e.message); |
| | | return; |
| | | } |
| | | } |
| | | // æå»º inputSchema |
| | | const inputSchema = { type: "object", properties: {}, required: [] }; |
| | | mcpProperties.forEach(prop => { |
| | | const propSchema = { type: prop.type }; |
| | | if (prop.description) { |
| | | propSchema.description = prop.description; |
| | | } |
| | | if ((prop.type === 'integer' || prop.type === 'number')) { |
| | | if (prop.minimum !== undefined && prop.minimum !== '') { |
| | | propSchema.minimum = prop.minimum; |
| | | } |
| | | if (prop.maximum !== undefined && prop.maximum !== '') { |
| | | propSchema.maximum = prop.maximum; |
| | | } |
| | | } |
| | | inputSchema.properties[prop.name] = propSchema; |
| | | if (prop.required) { |
| | | inputSchema.required.push(prop.name); |
| | | } |
| | | }); |
| | | if (inputSchema.required.length === 0) { |
| | | delete inputSchema.required; |
| | | } |
| | | const tool = { name, description, inputSchema, mockResponse }; |
| | | if (mcpEditingIndex !== null) { |
| | | mcpTools[mcpEditingIndex] = tool; |
| | | log(`å·²æ´æ°å·¥å
·: ${name}`, 'success'); |
| | | } else { |
| | | mcpTools.push(tool); |
| | | log(`已添å å·¥å
·: ${name}`, 'success'); |
| | | } |
| | | saveMcpTools(); |
| | | renderMcpTools(); |
| | | closeMcpModal(); |
| | | } |
| | | |
| | | /** |
| | | * æ¾ç¤ºé误 |
| | | */ |
| | | function showMcpError(message) { |
| | | const errorContainer = document.getElementById('mcpErrorContainer'); |
| | | errorContainer.innerHTML = `<div class="mcp-error">${message}</div>`; |
| | | } |
| | | |
| | | /** |
| | | * ç¼è¾å·¥å
· |
| | | */ |
| | | function editMcpTool(index) { |
| | | openMcpModal(index); |
| | | } |
| | | |
| | | /** |
| | | * å é¤å·¥å
· |
| | | */ |
| | | function deleteMcpTool(index) { |
| | | const isConnected = websocket && websocket.readyState === WebSocket.OPEN; |
| | | if (isConnected) { |
| | | alert('WebSocket å·²è¿æ¥ï¼æ æ³ç¼è¾å·¥å
·'); |
| | | return; |
| | | } |
| | | if (confirm(`ç¡®å®è¦å é¤å·¥å
· "${mcpTools[index].name}" åï¼`)) { |
| | | const toolName = mcpTools[index].name; |
| | | mcpTools.splice(index, 1); |
| | | saveMcpTools(); |
| | | renderMcpTools(); |
| | | log(`å·²å é¤å·¥å
·: ${toolName}`, 'info'); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * ä¿åå·¥å
· |
| | | */ |
| | | function saveMcpTools() { |
| | | localStorage.setItem('mcpTools', JSON.stringify(mcpTools)); |
| | | } |
| | | |
| | | /** |
| | | * è·åå·¥å
·å表 |
| | | */ |
| | | export function getMcpTools() { |
| | | return mcpTools.map(tool => ({ name: tool.name, description: tool.description, inputSchema: tool.inputSchema })); |
| | | } |
| | | |
| | | /** |
| | | * æ§è¡å·¥å
·è°ç¨ |
| | | */ |
| | | export async function executeMcpTool(toolName, toolArgs) { |
| | | const tool = mcpTools.find(t => t.name === toolName); |
| | | if (!tool) { |
| | | log(`æªæ¾å°å·¥å
·: ${toolName}`, 'error'); |
| | | return { success: false, error: `æªç¥å·¥å
·: ${toolName}` }; |
| | | } |
| | | |
| | | // å¤çæç
§å·¥å
· |
| | | if (toolName === 'self_camera_take_photo') { |
| | | if (typeof window.takePhoto === 'function') { |
| | | const question = toolArgs && toolArgs.question ? toolArgs.question : 'æè¿°ä¸ä¸çå°çç©å'; |
| | | log(`æ£å¨æ§è¡æç
§: ${question}`, 'info'); |
| | | const result = await window.takePhoto(question); |
| | | return result; |
| | | } else { |
| | | log('æç
§åè½ä¸å¯ç¨', 'warning'); |
| | | return { success: false, error: 'æå头æªå¯å¨æä¸æ¯ææç
§åè½' }; |
| | | } |
| | | } |
| | | |
| | | // å¦æææ¨¡æè¿åç»æï¼ä½¿ç¨å® |
| | | if (tool.mockResponse) { |
| | | // æ¿æ¢æ¨¡æ¿åé |
| | | let responseStr = JSON.stringify(tool.mockResponse); |
| | | // æ¿æ¢ ${paramName} æ ¼å¼çåé |
| | | if (toolArgs) { |
| | | Object.keys(toolArgs).forEach(key => { |
| | | const regex = new RegExp(`\\$\\{${key}\\}`, 'g'); |
| | | responseStr = responseStr.replace(regex, toolArgs[key]); |
| | | }); |
| | | } |
| | | try { |
| | | const response = JSON.parse(responseStr); |
| | | log(`å·¥å
· ${toolName} æ§è¡æåï¼è¿å模æç»æ: ${responseStr}`, 'success'); |
| | | return response; |
| | | } catch (e) { |
| | | log(`è§£ææ¨¡æè¿åç»æå¤±è´¥: ${e.message}`, 'error'); |
| | | return tool.mockResponse; |
| | | } |
| | | } |
| | | // æ²¡ææ¨¡æè¿åç»æï¼è¿åé»è®¤æåæ¶æ¯ |
| | | log(`å·¥å
· ${toolName} æ§è¡æåï¼è¿åé»è®¤ç»æ`, 'success'); |
| | | return { success: true, message: `å·¥å
· ${toolName} æ§è¡æå`, tool: toolName, arguments: toolArgs }; |
| | | } |
| | | |
| | | // æ´é²å
¨å±æ¹æ³ä¾ HTML å
èäºä»¶è°ç¨ |
| | | window.mcpModule = { addMcpProperty, editMcpProperty, deleteMcpProperty, editMcpTool, deleteMcpTool }; |
| New file |
| | |
| | | import { log } from '../../utils/logger.js?v=0205'; |
| | | |
| | | // WebSocket è¿æ¥ |
| | | export async function webSocketConnect(otaUrl, config) { |
| | | |
| | | if (!validateConfig(config)) { |
| | | return; |
| | | } |
| | | |
| | | // åéOTA请æ±å¹¶è·åè¿åçwebsocketä¿¡æ¯ |
| | | const otaResult = await sendOTA(otaUrl, config); |
| | | if (!otaResult) { |
| | | log('æ æ³ä»OTAæå¡å¨è·åä¿¡æ¯', 'error'); |
| | | return; |
| | | } |
| | | |
| | | // ä»OTAååºä¸æåwebsocketä¿¡æ¯ |
| | | const { websocket } = otaResult; |
| | | if (!websocket || !websocket.url) { |
| | | log('OTAååºä¸ç¼ºå°websocketä¿¡æ¯', 'error'); |
| | | return; |
| | | } |
| | | |
| | | // 使ç¨OTAè¿åçwebsocket URL |
| | | let connUrl = new URL(websocket.url); |
| | | |
| | | // æ·»å tokenåæ°ï¼ä»OTAååºä¸è·åï¼ |
| | | if (websocket.token) { |
| | | if (websocket.token.startsWith("Bearer ")) { |
| | | connUrl.searchParams.append('authorization', websocket.token); |
| | | } else { |
| | | connUrl.searchParams.append('authorization', 'Bearer ' + websocket.token); |
| | | } |
| | | } |
| | | |
| | | // æ·»å 认è¯åæ°ï¼ä¿æåæé»è¾ï¼ |
| | | connUrl.searchParams.append('device-id', config.deviceId); |
| | | connUrl.searchParams.append('client-id', config.clientId); |
| | | |
| | | const wsurl = connUrl.toString() |
| | | |
| | | log(`æ£å¨è¿æ¥: ${wsurl}`, 'info'); |
| | | |
| | | if (wsurl) { |
| | | document.getElementById('serverUrl').value = wsurl; |
| | | } |
| | | |
| | | return new WebSocket(connUrl.toString()); |
| | | } |
| | | |
| | | // éªè¯é
ç½® |
| | | function validateConfig(config) { |
| | | if (!config.deviceMac) { |
| | | log('设å¤MACå°åä¸è½ä¸ºç©º', 'error'); |
| | | return false; |
| | | } |
| | | if (!config.clientId) { |
| | | log('客æ·ç«¯IDä¸è½ä¸ºç©º', 'error'); |
| | | return false; |
| | | } |
| | | return true; |
| | | } |
| | | |
| | | // OTAåé请æ±ï¼éªè¯ç¶æï¼å¹¶è¿åååºæ°æ® |
| | | async function sendOTA(otaUrl, config) { |
| | | try { |
| | | const res = await fetch(otaUrl, { |
| | | method: 'POST', |
| | | headers: { |
| | | 'Content-Type': 'application/json', |
| | | 'Device-Id': config.deviceId, |
| | | 'Client-Id': config.clientId |
| | | }, |
| | | body: JSON.stringify({ |
| | | version: 0, |
| | | uuid: '', |
| | | application: { |
| | | name: 'xiaozhi-web-test', |
| | | version: '1.0.0', |
| | | compile_time: '2025-04-16 10:00:00', |
| | | idf_version: '4.4.3', |
| | | elf_sha256: '1234567890abcdef1234567890abcdef1234567890abcdef' |
| | | }, |
| | | ota: { label: 'xiaozhi-web-test' }, |
| | | board: { |
| | | type: config.deviceName, |
| | | ssid: 'xiaozhi-web-test', |
| | | rssi: 0, |
| | | channel: 0, |
| | | ip: '192.168.1.1', |
| | | mac: config.deviceMac |
| | | }, |
| | | flash_size: 0, |
| | | minimum_free_heap_size: 0, |
| | | mac_address: config.deviceMac, |
| | | chip_model_name: '', |
| | | chip_info: { model: 0, cores: 0, revision: 0, features: 0 }, |
| | | partition_table: [{ label: '', type: 0, subtype: 0, address: 0, size: 0 }] |
| | | }) |
| | | }); |
| | | |
| | | if (!res.ok) throw new Error(`${res.status} ${res.statusText}`); |
| | | |
| | | const result = await res.json(); |
| | | return result; // è¿å宿´çååºæ°æ® |
| | | } catch (err) { |
| | | return null; // 失败è¿ånull |
| | | } |
| | | } |
| New file |
| | |
| | | import { uiController } from '../../ui/controller.js?v=0205'; |
| | | import { log } from '../../utils/logger.js?v=0205'; |
| | | |
| | | let wakewordSocket = null; |
| | | let reconnectTimer = null; |
| | | let reconnectAttempts = 0; |
| | | let shouldReconnect = true; |
| | | let wakewordRequestSeq = 0; |
| | | let onNextBridgeConnectedCallback = null; |
| | | |
| | | const pendingWakewordRequests = new Map(); |
| | | |
| | | export function startWakewordBridgeListener() { |
| | | if (wakewordSocket) { |
| | | return wakewordSocket; |
| | | } |
| | | |
| | | shouldReconnect = true; |
| | | log('æ£å¨è¿æ¥æ¬å°å¤éäºä»¶æ¡¥...', 'info'); |
| | | tryConnect(); |
| | | return wakewordSocket; |
| | | } |
| | | |
| | | function tryConnect() { |
| | | const bridgeUrl = buildWakewordBridgeUrl(); |
| | | |
| | | try { |
| | | wakewordSocket = new WebSocket(bridgeUrl); |
| | | wakewordSocket.onopen = () => { |
| | | reconnectAttempts = 0; |
| | | log(`æ¬å°å¤éäºä»¶æ¡¥å·²è¿æ¥: ${bridgeUrl}`, 'success'); |
| | | // è¿æ¥æååèªå¨ä¿åå°åï¼å·æ°åä»è½è®°ä½ |
| | | localStorage.setItem('xz_tester_wakewordWsUrl', bridgeUrl); |
| | | const urlInput = document.getElementById('wakewordWsUrl'); |
| | | if (urlInput) urlInput.value = bridgeUrl; |
| | | }; |
| | | |
| | | wakewordSocket.onerror = () => { |
| | | log(`æ¬å°å¤éäºä»¶æ¡¥è¿æ¥å¤±è´¥: ${bridgeUrl}`, 'error'); |
| | | }; |
| | | |
| | | wakewordSocket.onmessage = async (event) => { |
| | | try { |
| | | const message = parseWakewordBridgeMessage(event.data); |
| | | if (message.requestId && pendingWakewordRequests.has(message.requestId)) { |
| | | settleWakewordRequest(message); |
| | | return; |
| | | } |
| | | |
| | | if (message.success === false) { |
| | | log(`æ¬å°å¤éäºä»¶æ¡¥è¿åé误: ${message.error || 'æªç¥é误'}`, 'error'); |
| | | return; |
| | | } |
| | | |
| | | if (message.type === 'bridge_connected') { |
| | | log('æ¬å°å¤éçå¬å·²å°±ç»ª', 'info'); |
| | | if (onNextBridgeConnectedCallback) { |
| | | const cb = onNextBridgeConnectedCallback; |
| | | onNextBridgeConnectedCallback = null; |
| | | cb(message); |
| | | } |
| | | return; |
| | | } |
| | | |
| | | if (message.type === 'service_ready') { |
| | | log('æ¬å°å¤éæå¡å·²å¯å¨', 'info'); |
| | | return; |
| | | } |
| | | |
| | | if (message.type === 'wakeword_config') { |
| | | uiController.applyWakewordConfig(message.payload || {}); |
| | | log('已忥æ¬å°å¤éè¯é
ç½®', 'info'); |
| | | return; |
| | | } |
| | | |
| | | if (message.type === 'service_stopping') { |
| | | log('æ¬å°å¤éæå¡æ£å¨åæ¢', 'warning'); |
| | | return; |
| | | } |
| | | |
| | | if (message.type === 'wake_word_detected') { |
| | | const wakeWord = message.payload?.wake_word || 'å¤éè¯'; |
| | | log(`æ£æµå°æ¬å°å¤éäºä»¶: ${wakeWord}`, 'info'); |
| | | await uiController.triggerWakewordDial(wakeWord); |
| | | } |
| | | } catch (error) { |
| | | log(`è§£ææ¬å°å¤éäºä»¶å¤±è´¥: ${error.message}`, 'error'); |
| | | } |
| | | }; |
| | | |
| | | wakewordSocket.onclose = () => { |
| | | if (wakewordSocket) { |
| | | wakewordSocket = null; |
| | | } |
| | | |
| | | rejectAllWakewordRequests('æ¬å°å¤éäºä»¶æ¡¥å·²æå¼'); |
| | | |
| | | if (!shouldReconnect) { |
| | | return; |
| | | } |
| | | |
| | | if (reconnectTimer) { |
| | | return; |
| | | } |
| | | |
| | | reconnectAttempts += 1; |
| | | const delay = Math.min(1000 * reconnectAttempts, 5000); |
| | | log(`æ¬å°å¤éäºä»¶æ¡¥å°å¨ ${delay}ms åéè¿: ${bridgeUrl}`, 'warning'); |
| | | reconnectTimer = window.setTimeout(() => { |
| | | reconnectTimer = null; |
| | | tryConnect(); |
| | | }, delay); |
| | | }; |
| | | |
| | | return wakewordSocket; |
| | | } catch (error) { |
| | | log(`å¯å¨æ¬å°å¤éçå¬å¤±è´¥: ${error.message}`, 'error'); |
| | | return null; |
| | | } |
| | | } |
| | | |
| | | export function stopWakewordBridgeListener() { |
| | | shouldReconnect = false; |
| | | |
| | | if (reconnectTimer) { |
| | | window.clearTimeout(reconnectTimer); |
| | | reconnectTimer = null; |
| | | } |
| | | |
| | | if (!wakewordSocket) { |
| | | return; |
| | | } |
| | | |
| | | wakewordSocket.onclose = null; |
| | | wakewordSocket.close(); |
| | | wakewordSocket = null; |
| | | } |
| | | |
| | | export function sendWakewordBridgeMessage(type, payload = {}, requestId = null) { |
| | | if (!wakewordSocket || wakewordSocket.readyState !== WebSocket.OPEN) { |
| | | log('æ¬å°å¤éäºä»¶æ¡¥æªè¿æ¥ï¼æ æ³åéæ¶æ¯', 'warning'); |
| | | return false; |
| | | } |
| | | |
| | | wakewordSocket.send(JSON.stringify({ |
| | | type, |
| | | requestId, |
| | | payload, |
| | | })); |
| | | return true; |
| | | } |
| | | |
| | | export function requestWakewordBridge(type, payload = {}, timeout = 5000) { |
| | | const requestId = `wakeword-${Date.now()}-${++wakewordRequestSeq}`; |
| | | |
| | | return new Promise((resolve, reject) => { |
| | | const timer = window.setTimeout(() => { |
| | | pendingWakewordRequests.delete(requestId); |
| | | reject(new Error('æ¬å°å¤éæå¡ååºè¶
æ¶')); |
| | | }, timeout); |
| | | |
| | | pendingWakewordRequests.set(requestId, { resolve, reject, timer }); |
| | | |
| | | if (!sendWakewordBridgeMessage(type, payload, requestId)) { |
| | | window.clearTimeout(timer); |
| | | pendingWakewordRequests.delete(requestId); |
| | | reject(new Error('æ¬å°å¤éäºä»¶æ¡¥æªè¿æ¥')); |
| | | } |
| | | }); |
| | | } |
| | | |
| | | export function getWakewordBridgeUrl() { |
| | | if (wakewordSocket && wakewordSocket.url) { |
| | | return wakewordSocket.url; |
| | | } |
| | | return buildWakewordBridgeUrl(); |
| | | } |
| | | |
| | | export function onNextBridgeConnected(callback) { |
| | | onNextBridgeConnectedCallback = callback; |
| | | } |
| | | |
| | | function buildWakewordBridgeUrl() { |
| | | const configured = localStorage.getItem('xz_tester_wakewordWsUrl'); |
| | | if (configured && configured.trim()) { |
| | | return configured.trim(); |
| | | } |
| | | return 'ws://127.0.0.1:8006/wakeword-ws'; |
| | | } |
| | | |
| | | function parseWakewordBridgeMessage(rawData) { |
| | | const message = JSON.parse(rawData); |
| | | return { |
| | | type: message.type || '', |
| | | requestId: message.requestId || null, |
| | | success: message.success !== false, |
| | | payload: message.payload || {}, |
| | | error: message.error || null, |
| | | }; |
| | | } |
| | | |
| | | function settleWakewordRequest(message) { |
| | | const pendingRequest = pendingWakewordRequests.get(message.requestId); |
| | | if (!pendingRequest) { |
| | | return; |
| | | } |
| | | |
| | | window.clearTimeout(pendingRequest.timer); |
| | | pendingWakewordRequests.delete(message.requestId); |
| | | |
| | | if (message.success === false) { |
| | | pendingRequest.reject(new Error(message.error || 'æ¬å°å¤éæå¡è¿å失败')); |
| | | return; |
| | | } |
| | | |
| | | pendingRequest.resolve(message); |
| | | } |
| | | |
| | | function rejectAllWakewordRequests(errorMessage) { |
| | | pendingWakewordRequests.forEach((pendingRequest) => { |
| | | window.clearTimeout(pendingRequest.timer); |
| | | pendingRequest.reject(new Error(errorMessage)); |
| | | }); |
| | | pendingWakewordRequests.clear(); |
| | | } |
| New file |
| | |
| | | // WebSocketæ¶æ¯å¤ç模å |
| | | import { getConfig, saveConnectionUrls } from '../../config/manager.js?v=0205'; |
| | | import { uiController } from '../../ui/controller.js?v=0205'; |
| | | import { log } from '../../utils/logger.js?v=0205'; |
| | | import { getAudioPlayer } from '../audio/player.js?v=0205'; |
| | | import { getAudioRecorder } from '../audio/recorder.js?v=0205'; |
| | | import { executeMcpTool, getMcpTools, setWebSocket as setMcpWebSocket } from '../mcp/tools.js?v=0205'; |
| | | import { webSocketConnect } from './ota-connector.js?v=0205'; |
| | | |
| | | // WebSocketå¤çå¨ç±» |
| | | export class WebSocketHandler { |
| | | constructor() { |
| | | this.websocket = null; |
| | | this.onConnectionStateChange = null; |
| | | this.onRecordButtonStateChange = null; |
| | | this.onSessionStateChange = null; |
| | | this.onSessionEmotionChange = null; |
| | | this.onChatMessage = null; // æ°å¢ï¼èå¤©æ¶æ¯åè° |
| | | this.currentSessionId = null; |
| | | this.isRemoteSpeaking = false; |
| | | } |
| | | |
| | | // åéhelloæ¡ææ¶æ¯ |
| | | async sendHelloMessage() { |
| | | if (!this.websocket || this.websocket.readyState !== WebSocket.OPEN) return false; |
| | | |
| | | try { |
| | | const config = getConfig(); |
| | | |
| | | const helloMessage = { |
| | | type: 'hello', |
| | | device_id: config.deviceId, |
| | | device_name: config.deviceName, |
| | | device_mac: config.deviceMac, |
| | | token: config.token, |
| | | features: { |
| | | mcp: true, |
| | | emoji: config.emojiEnabled |
| | | } |
| | | }; |
| | | |
| | | log('åéhelloæ¡ææ¶æ¯', 'info'); |
| | | this.websocket.send(JSON.stringify(helloMessage)); |
| | | |
| | | return new Promise(resolve => { |
| | | const timeout = setTimeout(() => { |
| | | log('çå¾
helloååºè¶
æ¶', 'error'); |
| | | log('æç¤º: 请å°è¯ç¹å»"æµè¯è®¤è¯"æé®è¿è¡è¿æ¥ææ¥', 'info'); |
| | | resolve(false); |
| | | }, 5000); |
| | | |
| | | const onMessageHandler = (event) => { |
| | | try { |
| | | const response = JSON.parse(event.data); |
| | | if (response.type === 'hello' && response.session_id) { |
| | | log(`æå¡å¨æ¡ææåï¼ä¼è¯ID: ${response.session_id}`, 'success'); |
| | | clearTimeout(timeout); |
| | | this.websocket.removeEventListener('message', onMessageHandler); |
| | | resolve(true); |
| | | } |
| | | } catch (e) { |
| | | // 忽ç¥éJSONæ¶æ¯ |
| | | } |
| | | }; |
| | | |
| | | this.websocket.addEventListener('message', onMessageHandler); |
| | | }); |
| | | } catch (error) { |
| | | log(`åéhelloæ¶æ¯é误: ${error.message}`, 'error'); |
| | | return false; |
| | | } |
| | | } |
| | | |
| | | _sendWakeupMessages(sessionId) { |
| | | if (!this.websocket || this.websocket.readyState !== WebSocket.OPEN) return; |
| | | |
| | | // listen detect |
| | | this.websocket.send(JSON.stringify({ |
| | | session_id: sessionId, |
| | | type: 'listen', |
| | | state: 'detect', |
| | | text: 'å¿ï¼ä½ 好å' |
| | | })); |
| | | log('åélisten detectæ¶æ¯ï¼å¤éè¯: å¿ï¼ä½ 好å', 'info'); |
| | | |
| | | // listen startï¼å¼å§çå¬ |
| | | this.websocket.send(JSON.stringify({ |
| | | session_id: sessionId, |
| | | type: 'listen', |
| | | state: 'start', |
| | | mode: 'auto' |
| | | })); |
| | | log('åélisten startæ¶æ¯', 'info'); |
| | | } |
| | | |
| | | // å¤çææ¬æ¶æ¯ |
| | | handleTextMessage(message) { |
| | | if (message.type === 'hello') { |
| | | log(`æå¡å¨ååºï¼${JSON.stringify(message, null, 2)}`, 'success'); |
| | | window.cameraAvailable = true; |
| | | log('è¿æ¥æåï¼æå头已å¯ç¨', 'success'); |
| | | uiController.updateDialButton(true); |
| | | |
| | | this._sendWakeupMessages(message.session_id); |
| | | |
| | | uiController.startAIChatSession(); |
| | | } else if (message.type === 'tts') { |
| | | this.handleTTSMessage(message); |
| | | } else if (message.type === 'audio') { |
| | | log(`æ¶å°é³é¢æ§å¶æ¶æ¯: ${JSON.stringify(message)}`, 'info'); |
| | | } else if (message.type === 'stt') { |
| | | log(`è¯å«ç»æ: ${message.text}`, 'info'); |
| | | // æ£æ¥æ¯å¦éè¦ç»å®è®¾å¤ |
| | | if (message.text && (message.text.includes('ç»å®') || message.text.includes('bind'))) { |
| | | log('æ¶å°è®¾å¤ç»å®æç¤ºï¼æ´æ°æåå¤´ç¶æ', 'warning'); |
| | | window.cameraAvailable = false; |
| | | // å
³éæå头 |
| | | if (typeof window.stopCamera === 'function') { |
| | | window.stopCamera(); |
| | | } |
| | | // æ´æ°æå头æé®ç¶æ |
| | | const cameraBtn = document.getElementById('cameraBtn'); |
| | | if (cameraBtn) { |
| | | cameraBtn.classList.remove('camera-active'); |
| | | cameraBtn.querySelector('.btn-text').textContent = 'æå头'; |
| | | cameraBtn.disabled = true; |
| | | cameraBtn.title = '请å
ç»å®éªè¯ç '; |
| | | } |
| | | } |
| | | // ä½¿ç¨æ°çèå¤©æ¶æ¯åè°æ¾ç¤ºSTTæ¶æ¯ |
| | | if (this.onChatMessage && message.text) { |
| | | this.onChatMessage(message.text, true); |
| | | } |
| | | } else if (message.type === 'llm') { |
| | | log(`大模ååå¤: ${message.text}`, 'info'); |
| | | // ä½¿ç¨æ°çèå¤©æ¶æ¯åè°æ¾ç¤ºLLMåå¤ |
| | | if (this.onChatMessage && message.text) { |
| | | this.onChatMessage(message.text, false); |
| | | } |
| | | |
| | | // 妿å
å«è¡¨æ
ï¼æ´æ°sessionStatus表æ
并触åLive2Då¨ä½ |
| | | if (message.text && /[\u{1F300}-\u{1F9FF}]|[\u{2600}-\u{26FF}]|[\u{2700}-\u{27BF}]/u.test(message.text)) { |
| | | // æå表æ
ç¬¦å· |
| | | const emojiMatch = message.text.match(/[\u{1F300}-\u{1F9FF}]|[\u{2600}-\u{26FF}]|[\u{2700}-\u{27BF}]/u); |
| | | if (emojiMatch && this.onSessionEmotionChange) { |
| | | this.onSessionEmotionChange(emojiMatch[0]); |
| | | } |
| | | |
| | | // 触åLive2Dæ
绪å¨ä½ |
| | | if (message.emotion) { |
| | | console.log(`æ¶å°æ
ç»ªæ¶æ¯: emotion=${message.emotion}, text=${message.text}`); |
| | | this.triggerLive2DEmotionAction(message.emotion); |
| | | } |
| | | } |
| | | |
| | | // åªæå½ææ¬ä¸ä»
ä»
æ¯è¡¨æ
æ¶ï¼ææ·»å å°å¯¹è¯ä¸ |
| | | // ç§»é¤ææ¬ä¸ç表æ
åæ£æ¥æ¯å¦è¿æå
容 |
| | | const textWithoutEmoji = message.text ? message.text.replace(/[\u{1F300}-\u{1F9FF}]|[\u{2600}-\u{26FF}]|[\u{2700}-\u{27BF}]/gu, '').trim() : ''; |
| | | if (textWithoutEmoji && this.onChatMessage) { |
| | | this.onChatMessage(message.text, false); |
| | | } |
| | | } else if (message.type === 'mcp') { |
| | | this.handleMCPMessage(message); |
| | | } else { |
| | | log(`æªç¥æ¶æ¯ç±»å: ${message.type}`, 'info'); |
| | | if (this.onChatMessage) { |
| | | this.onChatMessage(`æªç¥æ¶æ¯ç±»å: ${message.type}\n${JSON.stringify(message, null, 2)}`, false); |
| | | } |
| | | } |
| | | } |
| | | |
| | | // å¤çTTSæ¶æ¯ |
| | | handleTTSMessage(message) { |
| | | if (message.state === 'start') { |
| | | log('æå¡å¨å¼å§åéè¯é³', 'info'); |
| | | this.currentSessionId = message.session_id; |
| | | this.isRemoteSpeaking = true; |
| | | if (this.onSessionStateChange) { |
| | | this.onSessionStateChange(true); |
| | | } |
| | | |
| | | // å¯å¨Live2D说è¯å¨ç» |
| | | this.startLive2DTalking(); |
| | | } else if (message.state === 'sentence_start') { |
| | | log(`æå¡å¨åéè¯é³æ®µ: ${message.text}`, 'info'); |
| | | this.ttsSentenceCount = (this.ttsSentenceCount || 0) + 1; |
| | | |
| | | if (message.text && this.onChatMessage) { |
| | | this.onChatMessage(message.text, false); |
| | | } |
| | | |
| | | // ç¡®ä¿å¨ç»å¨å¥åå¼å§æ¶è¿è¡ |
| | | const live2dManager = window.chatApp?.live2dManager; |
| | | if (live2dManager && !live2dManager.isTalking) { |
| | | this.startLive2DTalking(); |
| | | } |
| | | } else if (message.state === 'sentence_end') { |
| | | log(`è¯é³æ®µç»æ: ${message.text}`, 'info'); |
| | | |
| | | // å¥åç»ææ¶ä¸æ¸
é¤å¨ç»ï¼çå¾
ä¸ä¸ä¸ªå¥åææç»åæ¢ |
| | | } else if (message.state === 'stop') { |
| | | log('æå¡å¨è¯é³ä¼ è¾ç»æï¼æ¸
空ææé³é¢ç¼å²', 'info'); |
| | | |
| | | // æ¸
空ææé³é¢ç¼å²å¹¶åæ¢ææ¾ |
| | | const audioPlayer = getAudioPlayer(); |
| | | audioPlayer.clearAllAudio(); |
| | | |
| | | this.isRemoteSpeaking = false; |
| | | if (this.onRecordButtonStateChange) { |
| | | this.onRecordButtonStateChange(false); |
| | | } |
| | | if (this.onSessionStateChange) { |
| | | this.onSessionStateChange(false); |
| | | } |
| | | |
| | | // å»¶è¿åæ¢Live2D说è¯å¨ç»ï¼ç¡®ä¿ææå¥å齿æ¾å®æ¯ |
| | | setTimeout(() => { |
| | | this.stopLive2DTalking(); |
| | | this.ttsSentenceCount = 0; // é置计æ°å¨ |
| | | }, 1000); // 1ç§å»¶è¿ï¼ç¡®ä¿ææå¥åé½å®æ |
| | | } |
| | | } |
| | | |
| | | // å¯å¨Live2D说è¯å¨ç» |
| | | startLive2DTalking() { |
| | | try { |
| | | // è·åLive2D管çå¨å®ä¾ |
| | | const live2dManager = window.chatApp?.live2dManager; |
| | | if (live2dManager && live2dManager.live2dModel) { |
| | | // 使ç¨é³é¢ææ¾å¨çåæå¨èç¹ |
| | | live2dManager.startTalking(); |
| | | log('Live2D说è¯å¨ç»å·²å¯å¨', 'info'); |
| | | } |
| | | } catch (error) { |
| | | log(`å¯å¨Live2D说è¯å¨ç»å¤±è´¥: ${error.message}`, 'error'); |
| | | } |
| | | } |
| | | |
| | | // 忢Live2D说è¯å¨ç» |
| | | stopLive2DTalking() { |
| | | try { |
| | | const live2dManager = window.chatApp?.live2dManager; |
| | | if (live2dManager) { |
| | | live2dManager.stopTalking(); |
| | | log('Live2D说è¯å¨ç»å·²åæ¢', 'info'); |
| | | } |
| | | } catch (error) { |
| | | log(`忢Live2D说è¯å¨ç»å¤±è´¥: ${error.message}`, 'error'); |
| | | } |
| | | } |
| | | |
| | | // åå§åLive2Dé³é¢åæå¨ |
| | | initializeLive2DAudioAnalyzer() { |
| | | try { |
| | | const live2dManager = window.chatApp?.live2dManager; |
| | | if (live2dManager) { |
| | | // åå§åé³é¢åæå¨ï¼ä½¿ç¨é³é¢ææ¾å¨çä¸ä¸æï¼ |
| | | if (live2dManager.initializeAudioAnalyzer()) { |
| | | log('Live2Dé³é¢åæå¨åå§å宿ï¼å·²è¿æ¥å°é³é¢ææ¾å¨', 'success'); |
| | | } else { |
| | | log('Live2Dé³é¢åæå¨åå§å失败ï¼å°ä½¿ç¨æ¨¡æå¨ç»', 'warning'); |
| | | } |
| | | } |
| | | } catch (error) { |
| | | log(`åå§åLive2Dé³é¢åæå¨å¤±è´¥: ${error.message}`, 'error'); |
| | | } |
| | | } |
| | | |
| | | // å¤çMCPæ¶æ¯ |
| | | handleMCPMessage(message) { |
| | | const payload = message.payload || {}; |
| | | log(`æå¡å¨ä¸å: ${JSON.stringify(message)}`, 'info'); |
| | | |
| | | if (payload.method === 'tools/list') { |
| | | const tools = getMcpTools(); |
| | | |
| | | const replyMessage = JSON.stringify({ |
| | | "session_id": message.session_id || "", |
| | | "type": "mcp", |
| | | "payload": { |
| | | "jsonrpc": "2.0", |
| | | "id": payload.id, |
| | | "result": { |
| | | "tools": tools |
| | | } |
| | | } |
| | | }); |
| | | log(`客æ·ç«¯ä¸æ¥: ${replyMessage}`, 'info'); |
| | | this.websocket.send(replyMessage); |
| | | log(`åå¤MCPå·¥å
·å表: ${tools.length} 个工å
·`, 'info'); |
| | | |
| | | } else if (payload.method === 'tools/call') { |
| | | const toolName = payload.params?.name; |
| | | const toolArgs = payload.params?.arguments; |
| | | |
| | | log(`è°ç¨å·¥å
·: ${toolName} åæ°: ${JSON.stringify(toolArgs)}`, 'info'); |
| | | |
| | | executeMcpTool(toolName, toolArgs).then(result => { |
| | | const replyMessage = JSON.stringify({ |
| | | "session_id": message.session_id || "", |
| | | "type": "mcp", |
| | | "payload": { |
| | | "jsonrpc": "2.0", |
| | | "id": payload.id, |
| | | "result": { |
| | | "content": [ |
| | | { |
| | | "type": "text", |
| | | "text": JSON.stringify(result) |
| | | } |
| | | ], |
| | | "isError": false |
| | | } |
| | | } |
| | | }); |
| | | |
| | | log(`客æ·ç«¯ä¸æ¥: ${replyMessage}`, 'info'); |
| | | this.websocket.send(replyMessage); |
| | | }).catch(error => { |
| | | log(`å·¥å
·æ§è¡å¤±è´¥: ${error.message}`, 'error'); |
| | | const errorReply = JSON.stringify({ |
| | | "session_id": message.session_id || "", |
| | | "type": "mcp", |
| | | "payload": { |
| | | "jsonrpc": "2.0", |
| | | "id": payload.id, |
| | | "error": { |
| | | "code": -32603, |
| | | "message": error.message |
| | | } |
| | | } |
| | | }); |
| | | this.websocket.send(errorReply); |
| | | }); |
| | | } else if (payload.method === 'initialize') { |
| | | log(`æ¶å°å·¥å
·åå§å请æ±: ${JSON.stringify(payload.params)}`, 'info'); |
| | | // ä¿åè§è§åææ¥å£å°å |
| | | const visionUrl = document.getElementById('visionUrl'); |
| | | const visionConfig = payload?.params?.capabilities?.vision; |
| | | if (visionConfig && typeof visionConfig === 'object' && visionConfig.url && visionConfig.token) { |
| | | const visionConfigStr = JSON.stringify(visionConfig); |
| | | localStorage.setItem('xz_tester_vision', visionConfigStr); |
| | | if (visionUrl) visionUrl.value = visionConfig.url; |
| | | } else { |
| | | localStorage.removeItem('xz_tester_vision'); |
| | | if (visionUrl) visionUrl.value = ''; |
| | | } |
| | | |
| | | const replyMessage = JSON.stringify({ |
| | | "session_id": message.session_id || "", |
| | | "type": "mcp", |
| | | "payload": { |
| | | "jsonrpc": "2.0", |
| | | "id": payload.id, |
| | | "result": { |
| | | "protocolVersion": "2024-11-05", |
| | | "capabilities": { |
| | | "tools": {} |
| | | }, |
| | | "serverInfo": { |
| | | "name": "xiaozhi-web-test", |
| | | "version": "2.1.0" |
| | | } |
| | | } |
| | | } |
| | | }); |
| | | log(`åå¤åå§åååº`, 'info'); |
| | | this.websocket.send(replyMessage); |
| | | } else { |
| | | log(`æªç¥çMCPæ¹æ³: ${payload.method}`, 'warning'); |
| | | } |
| | | } |
| | | |
| | | // å¤çäºè¿å¶æ¶æ¯ |
| | | async handleBinaryMessage(data) { |
| | | try { |
| | | let arrayBuffer; |
| | | if (data instanceof ArrayBuffer) { |
| | | arrayBuffer = data; |
| | | } else if (data instanceof Blob) { |
| | | arrayBuffer = await data.arrayBuffer(); |
| | | log(`æ¶å°Blobé³é¢æ°æ®ï¼å¤§å°: ${arrayBuffer.byteLength}åè`, 'debug'); |
| | | } else { |
| | | log(`æ¶å°æªç¥ç±»åçäºè¿å¶æ°æ®: ${typeof data}`, 'warning'); |
| | | return; |
| | | } |
| | | |
| | | const opusData = new Uint8Array(arrayBuffer); |
| | | const audioPlayer = getAudioPlayer(); |
| | | audioPlayer.enqueueAudioData(opusData); |
| | | } catch (error) { |
| | | log(`å¤çäºè¿å¶æ¶æ¯åºé: ${error.message}`, 'error'); |
| | | } |
| | | } |
| | | |
| | | // è¿æ¥WebSocketæå¡å¨ |
| | | async connect() { |
| | | const config = getConfig(); |
| | | log('æ£å¨æ£æ¥OTAç¶æ...', 'info'); |
| | | saveConnectionUrls(); |
| | | |
| | | try { |
| | | const otaUrl = document.getElementById('otaUrl').value.trim(); |
| | | const ws = await webSocketConnect(otaUrl, config); |
| | | if (ws === undefined) { |
| | | return false; |
| | | } |
| | | this.websocket = ws; |
| | | |
| | | // è®¾ç½®æ¥æ¶äºè¿å¶æ°æ®çç±»å为ArrayBuffer |
| | | this.websocket.binaryType = 'arraybuffer'; |
| | | |
| | | // 设置 MCP 模åç WebSocket å®ä¾ |
| | | setMcpWebSocket(this.websocket); |
| | | |
| | | // 设置å½é³å¨çWebSocket |
| | | const audioRecorder = getAudioRecorder(); |
| | | audioRecorder.setWebSocket(this.websocket); |
| | | |
| | | this.setupEventHandlers(); |
| | | |
| | | return true; |
| | | } catch (error) { |
| | | log(`è¿æ¥é误: ${error.message}`, 'error'); |
| | | if (this.onConnectionStateChange) { |
| | | this.onConnectionStateChange(false); |
| | | } |
| | | return false; |
| | | } |
| | | } |
| | | |
| | | // 设置äºä»¶å¤çå¨ |
| | | setupEventHandlers() { |
| | | this.websocket.onopen = async () => { |
| | | const url = document.getElementById('serverUrl').value; |
| | | log(`å·²è¿æ¥å°æå¡å¨: ${url}`, 'success'); |
| | | |
| | | if (this.onConnectionStateChange) { |
| | | this.onConnectionStateChange(true); |
| | | } |
| | | |
| | | // è¿æ¥æååï¼é»è®¤ç¶æä¸ºèå¬ä¸ |
| | | this.isRemoteSpeaking = false; |
| | | if (this.onSessionStateChange) { |
| | | this.onSessionStateChange(false); |
| | | } |
| | | |
| | | // å¨WebSocketè¿æ¥æåæ¶åå§åLive2Dé³é¢åæå¨ |
| | | this.initializeLive2DAudioAnalyzer(); |
| | | |
| | | await this.sendHelloMessage(); |
| | | }; |
| | | |
| | | this.websocket.onclose = () => { |
| | | log('å·²æå¼è¿æ¥', 'info'); |
| | | |
| | | if (this.onConnectionStateChange) { |
| | | this.onConnectionStateChange(false); |
| | | } |
| | | |
| | | const audioRecorder = getAudioRecorder(); |
| | | audioRecorder.stop(); |
| | | |
| | | // å
³éæå头 |
| | | if (typeof window.stopCamera === 'function') { |
| | | window.stopCamera(); |
| | | } |
| | | |
| | | // éèæå头æ¾ç¤ºåºå |
| | | const cameraContainer = document.getElementById('cameraContainer'); |
| | | if (cameraContainer) { |
| | | cameraContainer.classList.remove('active'); |
| | | } |
| | | }; |
| | | |
| | | this.websocket.onerror = (error) => { |
| | | log(`WebSocketé误: ${error.message || 'æªç¥é误'}`, 'error'); |
| | | uiController.addChatMessage(`â ï¸ WebSocketé误: ${error.message || 'æªç¥é误'}`, false); |
| | | if (this.onConnectionStateChange) { |
| | | this.onConnectionStateChange(false); |
| | | } |
| | | }; |
| | | |
| | | this.websocket.onmessage = (event) => { |
| | | try { |
| | | if (typeof event.data === 'string') { |
| | | const message = JSON.parse(event.data); |
| | | this.handleTextMessage(message); |
| | | } else { |
| | | this.handleBinaryMessage(event.data); |
| | | } |
| | | } catch (error) { |
| | | log(`WebSocketæ¶æ¯å¤çé误: ${error.message}`, 'error'); |
| | | // ä¸åä½¿ç¨æ§çaddMessage彿°ï¼å 为conversationDivå
ç´ ä¸åå¨ |
| | | // éè¯¯æ¶æ¯å°éè¿å
¶ä»æ¹å¼æ¾ç¤º |
| | | } |
| | | }; |
| | | } |
| | | |
| | | // æå¼è¿æ¥ |
| | | disconnect() { |
| | | if (!this.websocket) return; |
| | | |
| | | this.websocket.close(); |
| | | const audioRecorder = getAudioRecorder(); |
| | | audioRecorder.stop(); |
| | | |
| | | // å
³éæå头 |
| | | if (typeof window.stopCamera === 'function') { |
| | | window.stopCamera(); |
| | | } |
| | | |
| | | // éèæå头æ¾ç¤ºåºå |
| | | const cameraContainer = document.getElementById('cameraContainer'); |
| | | if (cameraContainer) { |
| | | cameraContainer.classList.remove('active'); |
| | | } |
| | | } |
| | | |
| | | // åéææ¬æ¶æ¯ |
| | | sendTextMessage(text) { |
| | | if (text === '' || !this.websocket || this.websocket.readyState !== WebSocket.OPEN) { |
| | | return false; |
| | | } |
| | | |
| | | try { |
| | | // å¦æå¯¹æ¹æ£å¨è¯´è¯ï¼å
åéæææ¶æ¯ |
| | | if (this.isRemoteSpeaking && this.currentSessionId) { |
| | | const abortMessage = { |
| | | session_id: this.currentSessionId, |
| | | type: 'abort', |
| | | reason: 'wake_word_detected' |
| | | }; |
| | | this.websocket.send(JSON.stringify(abortMessage)); |
| | | log('åéæææ¶æ¯', 'info'); |
| | | } |
| | | |
| | | const listenMessage = { |
| | | type: 'listen', |
| | | state: 'detect', |
| | | text: text |
| | | }; |
| | | |
| | | this.websocket.send(JSON.stringify(listenMessage)); |
| | | log(`åéææ¬æ¶æ¯: ${text}`, 'info'); |
| | | |
| | | return true; |
| | | } catch (error) { |
| | | log(`åéæ¶æ¯é误: ${error.message}`, 'error'); |
| | | return false; |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 触åLive2Dæ
绪å¨ä½ |
| | | * @param {string} emotion - æ
绪åç§° |
| | | */ |
| | | triggerLive2DEmotionAction(emotion) { |
| | | try { |
| | | const live2dManager = window.chatApp?.live2dManager; |
| | | if (live2dManager && typeof live2dManager.triggerEmotionAction === 'function') { |
| | | live2dManager.triggerEmotionAction(emotion); |
| | | log(`触åLive2Dæ
绪å¨ä½: ${emotion}`, 'info'); |
| | | } else { |
| | | log(`æ æ³è§¦åLive2Dæ
绪å¨ä½: Live2D管ç卿ªæ¾å°ææ¹æ³ä¸å¯ç¨`, 'warning'); |
| | | } |
| | | } catch (error) { |
| | | log(`触åLive2Dæ
绪å¨ä½å¤±è´¥: ${error.message}`, 'error'); |
| | | } |
| | | } |
| | | |
| | | // è·åWebSocketå®ä¾ |
| | | getWebSocket() { |
| | | return this.websocket; |
| | | } |
| | | |
| | | // æ£æ¥æ¯å¦å·²è¿æ¥ |
| | | isConnected() { |
| | | return this.websocket && this.websocket.readyState === WebSocket.OPEN; |
| | | } |
| | | } |
| | | |
| | | // å建åä¾ |
| | | let wsHandlerInstance = null; |
| | | |
| | | export function getWebSocketHandler() { |
| | | if (!wsHandlerInstance) { |
| | | wsHandlerInstance = new WebSocketHandler(); |
| | | } |
| | | return wsHandlerInstance; |
| | | } |
| New file |
| | |
| | | var __pow=Math.pow,__async=(t,e,i)=>new Promise(((s,r)=>{var a=t=>{try{n(i.next(t))}catch(e){r(e)}},o=t=>{try{n(i.throw(t))}catch(e){r(e)}},n=t=>t.done?s(t.value):Promise.resolve(t.value).then(a,o);n((i=i.apply(t,e)).next())}));!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports,require("@pixi/utils"),require("@pixi/math"),require("@pixi/core"),require("@pixi/display")):"function"==typeof define&&define.amd?define(["exports","@pixi/utils","@pixi/math","@pixi/core","@pixi/display"],e):e(((t="undefined"!=typeof globalThis?globalThis:t||self).PIXI=t.PIXI||{},t.PIXI.live2d=t.PIXI.live2d||{}),t.PIXI.utils,t.PIXI,t.PIXI,t.PIXI)}(this,(function(t,e,i,s,r){"use strict";class a{constructor(){this._breathParameters=[],this._currentTime=0}static create(){return new a}setParameters(t){this._breathParameters=t}getParameters(){return this._breathParameters}updateParameters(t,e){this._currentTime+=e;const i=2*this._currentTime*3.14159;for(let s=0;s<this._breathParameters.length;++s){const e=this._breathParameters[s];t.addParameterValueById(e.parameterId,e.offset+e.peak*Math.sin(i/e.cycle),e.weight)}}}class o{constructor(t,e,i,s,r){this.parameterId=null==t?void 0:t,this.offset=null==e?0:e,this.peak=null==i?0:i,this.cycle=null==s?0:s,this.weight=null==r?0:r}}const n=class{static create(t){return new n(t)}setBlinkingInterval(t){this._blinkingIntervalSeconds=t}setBlinkingSetting(t,e,i){this._closingSeconds=t,this._closedSeconds=e,this._openingSeconds=i}setParameterIds(t){this._parameterIds=t}getParameterIds(){return this._parameterIds}updateParameters(t,e){let i;this._userTimeSeconds+=e;let s=0;switch(this._blinkingState){case h.EyeState_Closing:s=(this._userTimeSeconds-this._stateStartTimeSeconds)/this._closingSeconds,s>=1&&(s=1,this._blinkingState=h.EyeState_Closed,this._stateStartTimeSeconds=this._userTimeSeconds),i=1-s;break;case h.EyeState_Closed:s=(this._userTimeSeconds-this._stateStartTimeSeconds)/this._closedSeconds,s>=1&&(this._blinkingState=h.EyeState_Opening,this._stateStartTimeSeconds=this._userTimeSeconds),i=0;break;case h.EyeState_Opening:s=(this._userTimeSeconds-this._stateStartTimeSeconds)/this._openingSeconds,s>=1&&(s=1,this._blinkingState=h.EyeState_Interval,this._nextBlinkingTime=this.determinNextBlinkingTiming()),i=s;break;case h.EyeState_Interval:this._nextBlinkingTime<this._userTimeSeconds&&(this._blinkingState=h.EyeState_Closing,this._stateStartTimeSeconds=this._userTimeSeconds),i=1;break;case h.EyeState_First:default:this._blinkingState=h.EyeState_Interval,this._nextBlinkingTime=this.determinNextBlinkingTiming(),i=1}n.CloseIfZero||(i=-i);for(let r=0;r<this._parameterIds.length;++r)t.setParameterValueById(this._parameterIds[r],i)}constructor(t){var e,i;this._blinkingState=h.EyeState_First,this._nextBlinkingTime=0,this._stateStartTimeSeconds=0,this._blinkingIntervalSeconds=4,this._closingSeconds=.1,this._closedSeconds=.05,this._openingSeconds=.15,this._userTimeSeconds=0,this._parameterIds=[],null!=t&&(this._parameterIds=null!=(i=null==(e=t.getEyeBlinkParameters())?void 0:e.slice())?i:this._parameterIds)}determinNextBlinkingTiming(){const t=Math.random();return this._userTimeSeconds+t*(2*this._blinkingIntervalSeconds-1)}};let l=n;l.CloseIfZero=!0;var h=(t=>(t[t.EyeState_First=0]="EyeState_First",t[t.EyeState_Interval=1]="EyeState_Interval",t[t.EyeState_Closing=2]="EyeState_Closing",t[t.EyeState_Closed=3]="EyeState_Closed",t[t.EyeState_Opening=4]="EyeState_Opening",t))(h||{});class u{static create(t){const e=new u;"number"==typeof t.FadeInTime&&(e._fadeTimeSeconds=t.FadeInTime,e._fadeTimeSeconds<=0&&(e._fadeTimeSeconds=.5));const i=t.Groups,s=i.length;for(let r=0;r<s;++r){const t=i[r],s=t.length;let a=0;for(let i=0;i<s;++i){const s=t[i],r=new d;r.partId=s.Id;const o=s.Link;if(o){const t=o.length;for(let e=0;e<t;++e){const t=new d;t.partId=o[e],r.link.push(t)}}e._partGroups.push(r),++a}e._partGroupCounts.push(a)}return e}updateParameters(t,e){t!=this._lastModel&&this.reset(t),this._lastModel=t,e<0&&(e=0);let i=0;for(let s=0;s<this._partGroupCounts.length;s++){const r=this._partGroupCounts[s];this.doFade(t,e,i,r),i+=r}this.copyPartOpacities(t)}reset(t){let e=0;for(let i=0;i<this._partGroupCounts.length;++i){const s=this._partGroupCounts[i];for(let i=e;i<e+s;++i){this._partGroups[i].initialize(t);const s=this._partGroups[i].partIndex,r=this._partGroups[i].parameterIndex;if(!(s<0)){t.setPartOpacityByIndex(s,i==e?1:0),t.setParameterValueByIndex(r,i==e?1:0);for(let e=0;e<this._partGroups[i].link.length;++e)this._partGroups[i].link[e].initialize(t)}}e+=s}}copyPartOpacities(t){for(let e=0;e<this._partGroups.length;++e){const i=this._partGroups[e];if(0==i.link.length)continue;const s=this._partGroups[e].partIndex,r=t.getPartOpacityByIndex(s);for(let e=0;e<i.link.length;++e){const s=i.link[e].partIndex;s<0||t.setPartOpacityByIndex(s,r)}}}doFade(t,e,i,s){let r=-1,a=1;const o=.5;for(let n=i;n<i+s;++n){const i=this._partGroups[n].partIndex,s=this._partGroups[n].parameterIndex;if(t.getParameterValueByIndex(s)>.001){if(r>=0)break;r=n,a=t.getPartOpacityByIndex(i),a+=e/this._fadeTimeSeconds,a>1&&(a=1)}}r<0&&(r=0,a=1);for(let n=i;n<i+s;++n){const e=this._partGroups[n].partIndex;if(r==n)t.setPartOpacityByIndex(e,a);else{let i,s=t.getPartOpacityByIndex(e);i=a<o?-.5*a/o+1:(1-a)*o/.5;(1-i)*(1-a)>.15&&(i=1-.15/(1-a)),s>i&&(s=i),t.setPartOpacityByIndex(e,s)}}}constructor(){this._fadeTimeSeconds=.5,this._lastModel=void 0,this._partGroups=[],this._partGroupCounts=[]}}class d{constructor(t){this.parameterIndex=0,this.partIndex=0,this.partId="",this.link=[],null!=t&&this.assignment(t)}assignment(t){return this.partId=t.partId,this.link=t.link.map((t=>t.clone())),this}initialize(t){this.parameterIndex=t.getParameterIndex(this.partId),this.partIndex=t.getPartIndex(this.partId),t.setParameterValueByIndex(this.parameterIndex,1)}clone(){const t=new d;return t.partId=this.partId,t.parameterIndex=this.parameterIndex,t.partIndex=this.partIndex,t.link=this.link.map((t=>t.clone())),t}}class c{constructor(t,e){this.x=t||0,this.y=e||0}add(t){const e=new c(0,0);return e.x=this.x+t.x,e.y=this.y+t.y,e}substract(t){const e=new c(0,0);return e.x=this.x-t.x,e.y=this.y-t.y,e}multiply(t){const e=new c(0,0);return e.x=this.x*t.x,e.y=this.y*t.y,e}multiplyByScaler(t){return this.multiply(new c(t,t))}division(t){const e=new c(0,0);return e.x=this.x/t.x,e.y=this.y/t.y,e}divisionByScalar(t){return this.division(new c(t,t))}getLength(){return Math.sqrt(this.x*this.x+this.y*this.y)}getDistanceWith(t){return Math.sqrt((this.x-t.x)*(this.x-t.x)+(this.y-t.y)*(this.y-t.y))}dot(t){return this.x*t.x+this.y*t.y}normalize(){const t=Math.pow(this.x*this.x+this.y*this.y,.5);this.x=this.x/t,this.y=this.y/t}isEqual(t){return this.x==t.x&&this.y==t.y}isNotEqual(t){return!this.isEqual(t)}}const m=class{static range(t,e,i){return t<e?t=e:t>i&&(t=i),t}static sin(t){return Math.sin(t)}static cos(t){return Math.cos(t)}static abs(t){return Math.abs(t)}static sqrt(t){return Math.sqrt(t)}static cbrt(t){if(0===t)return t;let e=t;const i=e<0;let s;return i&&(e=-e),e===1/0?s=1/0:(s=Math.exp(Math.log(e)/3),s=(e/(s*s)+2*s)/3),i?-s:s}static getEasingSine(t){return t<0?0:t>1?1:.5-.5*this.cos(t*Math.PI)}static max(t,e){return t>e?t:e}static min(t,e){return t>e?e:t}static degreesToRadian(t){return t/180*Math.PI}static radianToDegrees(t){return 180*t/Math.PI}static directionToRadian(t,e){let i=Math.atan2(e.y,e.x)-Math.atan2(t.y,t.x);for(;i<-Math.PI;)i+=2*Math.PI;for(;i>Math.PI;)i-=2*Math.PI;return i}static directionToDegrees(t,e){const i=this.directionToRadian(t,e);let s=this.radianToDegrees(i);return e.x-t.x>0&&(s=-s),s}static radianToDirection(t){const e=new c;return e.x=this.sin(t),e.y=this.cos(t),e}static quadraticEquation(t,e,i){return this.abs(t)<m.Epsilon?this.abs(e)<m.Epsilon?-i:-i/e:-(e+this.sqrt(e*e-4*t*i))/(2*t)}static cardanoAlgorithmForBezier(t,e,i,s){if(this.sqrt(t)<m.Epsilon)return this.range(this.quadraticEquation(e,i,s),0,1);const r=e/t,a=i/t,o=(3*a-r*r)/3,n=o/3,l=(2*r*r*r-9*r*a+27*(s/t))/27,h=l/2,u=h*h+n*n*n,d=.5,c=.51;if(u<0){const t=-o/3,e=t*t*t,i=this.sqrt(e),s=-l/(2*i),a=this.range(s,-1,1),n=Math.acos(a),h=2*this.cbrt(i),u=h*this.cos(n/3)-r/3;if(this.abs(u-d)<c)return this.range(u,0,1);const m=h*this.cos((n+2*Math.PI)/3)-r/3;if(this.abs(m-d)<c)return this.range(m,0,1);const g=h*this.cos((n+4*Math.PI)/3)-r/3;return this.range(g,0,1)}if(0==u){let t;t=h<0?this.cbrt(-h):-this.cbrt(h);const e=2*t-r/3;if(this.abs(e-d)<c)return this.range(e,0,1);const i=-t-r/3;return this.range(i,0,1)}const g=this.sqrt(u),p=this.cbrt(g-h)-this.cbrt(g+h)-r/3;return this.range(p,0,1)}constructor(){}};let g=m;g.Epsilon=1e-5;class p{constructor(){this._tr=new Float32Array(16),this.loadIdentity()}static multiply(t,e,i){const s=new Float32Array([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]);for(let r=0;r<4;++r)for(let i=0;i<4;++i)for(let a=0;a<4;++a)s[i+4*r]+=t[a+4*r]*e[i+4*a];for(let r=0;r<16;++r)i[r]=s[r]}loadIdentity(){const t=new Float32Array([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]);this.setMatrix(t)}setMatrix(t){for(let e=0;e<16;++e)this._tr[e]=t[e]}getArray(){return this._tr}getScaleX(){return this._tr[0]}getScaleY(){return this._tr[5]}getTranslateX(){return this._tr[12]}getTranslateY(){return this._tr[13]}transformX(t){return this._tr[0]*t+this._tr[12]}transformY(t){return this._tr[5]*t+this._tr[13]}invertTransformX(t){return(t-this._tr[12])/this._tr[0]}invertTransformY(t){return(t-this._tr[13])/this._tr[5]}translateRelative(t,e){const i=new Float32Array([1,0,0,0,0,1,0,0,0,0,1,0,t,e,0,1]);p.multiply(i,this._tr,this._tr)}translate(t,e){this._tr[12]=t,this._tr[13]=e}translateX(t){this._tr[12]=t}translateY(t){this._tr[13]=t}scaleRelative(t,e){const i=new Float32Array([t,0,0,0,0,e,0,0,0,0,1,0,0,0,0,1]);p.multiply(i,this._tr,this._tr)}scale(t,e){this._tr[0]=t,this._tr[5]=e}multiplyByMatrix(t){p.multiply(t.getArray(),this._tr,this._tr)}clone(){const t=new p;for(let e=0;e<this._tr.length;e++)t._tr[e]=this._tr[e];return t}}class _{initialize(t){this._model=t}drawModel(){null!=this.getModel()&&this.doDrawModel()}setMvpMatrix(t){this._mvpMatrix4x4.setMatrix(t.getArray())}getMvpMatrix(){return this._mvpMatrix4x4}setModelColor(t,e,i,s){t<0?t=0:t>1&&(t=1),e<0?e=0:e>1&&(e=1),i<0?i=0:i>1&&(i=1),s<0?s=0:s>1&&(s=1),this._modelColor.R=t,this._modelColor.G=e,this._modelColor.B=i,this._modelColor.A=s}getModelColor(){return Object.assign({},this._modelColor)}setIsPremultipliedAlpha(t){this._isPremultipliedAlpha=t}isPremultipliedAlpha(){return this._isPremultipliedAlpha}setIsCulling(t){this._isCulling=t}isCulling(){return this._isCulling}setAnisotropy(t){this._anisortopy=t}getAnisotropy(){return this._anisortopy}getModel(){return this._model}constructor(){this._isCulling=!1,this._isPremultipliedAlpha=!1,this._anisortopy=0,this._modelColor=new y,this._mvpMatrix4x4=new p,this._mvpMatrix4x4.loadIdentity()}}var f=(t=>(t[t.CubismBlendMode_Normal=0]="CubismBlendMode_Normal",t[t.CubismBlendMode_Additive=1]="CubismBlendMode_Additive",t[t.CubismBlendMode_Multiplicative=2]="CubismBlendMode_Multiplicative",t))(f||{});class y{constructor(){this.R=1,this.G=1,this.B=1,this.A=1}}let x,v=!1,M=!1;const P={vertexOffset:0,vertexStep:2};class C{static startUp(t){if(v)return I("CubismFramework.startUp() is already done."),v;if(Live2DCubismCore._isStarted)return v=!0,!0;if(Live2DCubismCore._isStarted=!0,x=t,x&&Live2DCubismCore.Logging.csmSetLogFunction(x.logFunction),v=!0,v){const t=Live2DCubismCore.Version.csmGetVersion(),e=(16711680&t)>>16,i=65535&t,s=t;I("Live2D Cubism Core version: {0}.{1}.{2} ({3})",("00"+((4278190080&t)>>24)).slice(-2),("00"+e).slice(-2),("0000"+i).slice(-4),s)}return I("CubismFramework.startUp() is complete."),v}static cleanUp(){v=!1,M=!1,x=void 0}static initialize(){v?M?L("CubismFramework.initialize() skipped, already initialized."):(M=!0,I("CubismFramework.initialize() is complete.")):L("CubismFramework is not started.")}static dispose(){v?M?(_.staticRelease(),M=!1,I("CubismFramework.dispose() is complete.")):L("CubismFramework.dispose() skipped, not initialized."):L("CubismFramework is not started.")}static isStarted(){return v}static isInitialized(){return M}static coreLogFunction(t){Live2DCubismCore.Logging.csmGetLogFunction()&&Live2DCubismCore.Logging.csmGetLogFunction()(t)}static getLoggingLevel(){return null!=x?x.loggingLevel:S.LogLevel_Off}constructor(){}}var S=(t=>(t[t.LogLevel_Verbose=0]="LogLevel_Verbose",t[t.LogLevel_Debug=1]="LogLevel_Debug",t[t.LogLevel_Info=2]="LogLevel_Info",t[t.LogLevel_Warning=3]="LogLevel_Warning",t[t.LogLevel_Error=4]="LogLevel_Error",t[t.LogLevel_Off=5]="LogLevel_Off",t))(S||{});const b=()=>{};function w(t,...e){E.print(S.LogLevel_Debug,"[CSM][D]"+t+"\n",e)}function I(t,...e){E.print(S.LogLevel_Info,"[CSM][I]"+t+"\n",e)}function L(t,...e){E.print(S.LogLevel_Warning,"[CSM][W]"+t+"\n",e)}function T(t,...e){E.print(S.LogLevel_Error,"[CSM][E]"+t+"\n",e)}class E{static print(t,e,i){if(t<C.getLoggingLevel())return;const s=C.coreLogFunction;if(!s)return;s(e.replace(/{(\d+)}/g,((t,e)=>i[e])))}static dumpBytes(t,e,i){for(let s=0;s<i;s++)s%16==0&&s>0?this.print(t,"\n"):s%8==0&&s>0&&this.print(t," "),this.print(t,"{0} ",[255&e[s]]);this.print(t,"\n")}constructor(){}}class D{update(){this._model.update(),this._model.drawables.resetDynamicFlags()}getCanvasWidth(){return null==this._model?0:this._model.canvasinfo.CanvasWidth/this._model.canvasinfo.PixelsPerUnit}getCanvasHeight(){return null==this._model?0:this._model.canvasinfo.CanvasHeight/this._model.canvasinfo.PixelsPerUnit}saveParameters(){const t=this._model.parameters.count,e=this._savedParameters.length;for(let i=0;i<t;++i)i<e?this._savedParameters[i]=this._parameterValues[i]:this._savedParameters.push(this._parameterValues[i])}getModel(){return this._model}getPartIndex(t){let e;const i=this._model.parts.count;for(e=0;e<i;++e)if(t==this._partIds[e])return e;return t in this._notExistPartId?this._notExistPartId[t]:(e=i+this._notExistPartId.length,this._notExistPartId[t]=e,this._notExistPartOpacities[e]=0,e)}getPartCount(){return this._model.parts.count}setPartOpacityByIndex(t,e){t in this._notExistPartOpacities?this._notExistPartOpacities[t]=e:(0<=t&&this.getPartCount(),this._partOpacities[t]=e)}setPartOpacityById(t,e){const i=this.getPartIndex(t);i<0||this.setPartOpacityByIndex(i,e)}getPartOpacityByIndex(t){return t in this._notExistPartOpacities?this._notExistPartOpacities[t]:(0<=t&&this.getPartCount(),this._partOpacities[t])}getPartOpacityById(t){const e=this.getPartIndex(t);return e<0?0:this.getPartOpacityByIndex(e)}getParameterIndex(t){let e;const i=this._model.parameters.count;for(e=0;e<i;++e)if(t==this._parameterIds[e])return e;return t in this._notExistParameterId?this._notExistParameterId[t]:(e=this._model.parameters.count+Object.keys(this._notExistParameterId).length,this._notExistParameterId[t]=e,this._notExistParameterValues[e]=0,e)}getParameterCount(){return this._model.parameters.count}getParameterMaximumValue(t){return this._model.parameters.maximumValues[t]}getParameterMinimumValue(t){return this._model.parameters.minimumValues[t]}getParameterDefaultValue(t){return this._model.parameters.defaultValues[t]}getParameterValueByIndex(t){return t in this._notExistParameterValues?this._notExistParameterValues[t]:(0<=t&&this.getParameterCount(),this._parameterValues[t])}getParameterValueById(t){const e=this.getParameterIndex(t);return this.getParameterValueByIndex(e)}setParameterValueByIndex(t,e,i=1){t in this._notExistParameterValues?this._notExistParameterValues[t]=1==i?e:this._notExistParameterValues[t]*(1-i)+e*i:(0<=t&&this.getParameterCount(),this._model.parameters.maximumValues[t]<e&&(e=this._model.parameters.maximumValues[t]),this._model.parameters.minimumValues[t]>e&&(e=this._model.parameters.minimumValues[t]),this._parameterValues[t]=1==i?e:this._parameterValues[t]=this._parameterValues[t]*(1-i)+e*i)}setParameterValueById(t,e,i=1){const s=this.getParameterIndex(t);this.setParameterValueByIndex(s,e,i)}addParameterValueByIndex(t,e,i=1){this.setParameterValueByIndex(t,this.getParameterValueByIndex(t)+e*i)}addParameterValueById(t,e,i=1){const s=this.getParameterIndex(t);this.addParameterValueByIndex(s,e,i)}multiplyParameterValueById(t,e,i=1){const s=this.getParameterIndex(t);this.multiplyParameterValueByIndex(s,e,i)}multiplyParameterValueByIndex(t,e,i=1){this.setParameterValueByIndex(t,this.getParameterValueByIndex(t)*(1+(e-1)*i))}getDrawableIds(){return this._drawableIds.slice()}getDrawableIndex(t){const e=this._model.drawables.count;for(let i=0;i<e;++i)if(this._drawableIds[i]==t)return i;return-1}getDrawableCount(){return this._model.drawables.count}getDrawableId(t){return this._model.drawables.ids[t]}getDrawableRenderOrders(){return this._model.drawables.renderOrders}getDrawableTextureIndices(t){return this._model.drawables.textureIndices[t]}getDrawableDynamicFlagVertexPositionsDidChange(t){const e=this._model.drawables.dynamicFlags;return Live2DCubismCore.Utils.hasVertexPositionsDidChangeBit(e[t])}getDrawableVertexIndexCount(t){return this._model.drawables.indexCounts[t]}getDrawableVertexCount(t){return this._model.drawables.vertexCounts[t]}getDrawableVertices(t){return this.getDrawableVertexPositions(t)}getDrawableVertexIndices(t){return this._model.drawables.indices[t]}getDrawableVertexPositions(t){return this._model.drawables.vertexPositions[t]}getDrawableVertexUvs(t){return this._model.drawables.vertexUvs[t]}getDrawableOpacity(t){return this._model.drawables.opacities[t]}getDrawableCulling(t){const e=this._model.drawables.constantFlags;return!Live2DCubismCore.Utils.hasIsDoubleSidedBit(e[t])}getDrawableBlendMode(t){const e=this._model.drawables.constantFlags;return Live2DCubismCore.Utils.hasBlendAdditiveBit(e[t])?f.CubismBlendMode_Additive:Live2DCubismCore.Utils.hasBlendMultiplicativeBit(e[t])?f.CubismBlendMode_Multiplicative:f.CubismBlendMode_Normal}getDrawableInvertedMaskBit(t){const e=this._model.drawables.constantFlags;return Live2DCubismCore.Utils.hasIsInvertedMaskBit(e[t])}getDrawableMasks(){return this._model.drawables.masks}getDrawableMaskCounts(){return this._model.drawables.maskCounts}isUsingMasking(){for(let t=0;t<this._model.drawables.count;++t)if(!(this._model.drawables.maskCounts[t]<=0))return!0;return!1}getDrawableDynamicFlagIsVisible(t){const e=this._model.drawables.dynamicFlags;return Live2DCubismCore.Utils.hasIsVisibleBit(e[t])}getDrawableDynamicFlagVisibilityDidChange(t){const e=this._model.drawables.dynamicFlags;return Live2DCubismCore.Utils.hasVisibilityDidChangeBit(e[t])}getDrawableDynamicFlagOpacityDidChange(t){const e=this._model.drawables.dynamicFlags;return Live2DCubismCore.Utils.hasOpacityDidChangeBit(e[t])}getDrawableDynamicFlagRenderOrderDidChange(t){const e=this._model.drawables.dynamicFlags;return Live2DCubismCore.Utils.hasRenderOrderDidChangeBit(e[t])}loadParameters(){let t=this._model.parameters.count;const e=this._savedParameters.length;t>e&&(t=e);for(let i=0;i<t;++i)this._parameterValues[i]=this._savedParameters[i]}initialize(){this._parameterValues=this._model.parameters.values,this._partOpacities=this._model.parts.opacities,this._parameterMaximumValues=this._model.parameters.maximumValues,this._parameterMinimumValues=this._model.parameters.minimumValues;{const t=this._model.parameters.ids,e=this._model.parameters.count;for(let i=0;i<e;++i)this._parameterIds.push(t[i])}{const t=this._model.parts.ids,e=this._model.parts.count;for(let i=0;i<e;++i)this._partIds.push(t[i])}{const t=this._model.drawables.ids,e=this._model.drawables.count;for(let i=0;i<e;++i)this._drawableIds.push(t[i])}}constructor(t){this._model=t,this._savedParameters=[],this._parameterIds=[],this._drawableIds=[],this._partIds=[],this._notExistPartId={},this._notExistParameterId={},this._notExistParameterValues={},this._notExistPartOpacities={},this.initialize()}release(){this._model.release(),this._model=void 0}}class F{static create(t){const e=Live2DCubismCore.Moc.fromArrayBuffer(t);if(e)return new F(e);throw new Error("Unknown error")}createModel(){let t;const e=Live2DCubismCore.Model.fromMoc(this._moc);if(e)return t=new D(e),++this._modelCount,t;throw new Error("Unknown error")}deleteModel(t){null!=t&&--this._modelCount}constructor(t){this._moc=t,this._modelCount=0}release(){this._moc._release(),this._moc=void 0}}class A{constructor(t,e){this._json=t}release(){this._json=void 0}getUserDataCount(){return this._json.Meta.UserDataCount}getTotalUserDataSize(){return this._json.Meta.TotalUserDataSize}getUserDataTargetType(t){return this._json.UserData[t].Target}getUserDataId(t){return this._json.UserData[t].Id}getUserDataValue(t){return this._json.UserData[t].Value}}class B{static create(t,e){const i=new B;return i.parseUserData(t,e),i}getArtMeshUserDatas(){return this._artMeshUserDataNode}parseUserData(t,e){let i=new A(t,e);const s=i.getUserDataCount();for(let r=0;r<s;r++){const t={targetId:i.getUserDataId(r),targetType:i.getUserDataTargetType(r),value:i.getUserDataValue(r)};this._userDataNodes.push(t),"ArtMesh"==t.targetType&&this._artMeshUserDataNode.push(t)}i.release()}constructor(){this._userDataNodes=[],this._artMeshUserDataNode=[]}release(){this._userDataNodes=null}}class R{constructor(){this._fadeInSeconds=-1,this._fadeOutSeconds=-1,this._weight=1,this._offsetSeconds=0,this._firedEventValues=[]}release(){this._weight=0}updateParameters(t,e,i){if(!e.isAvailable()||e.isFinished())return;if(!e.isStarted()){e.setIsStarted(!0),e.setStartTime(i-this._offsetSeconds),e.setFadeInStartTime(i);const t=this.getDuration();e.getEndTime()<0&&e.setEndTime(t<=0?-1:e.getStartTime()+t)}let s=this._weight;s=s*(0==this._fadeInSeconds?1:g.getEasingSine((i-e.getFadeInStartTime())/this._fadeInSeconds))*(0==this._fadeOutSeconds||e.getEndTime()<0?1:g.getEasingSine((e.getEndTime()-i)/this._fadeOutSeconds)),e.setState(i,s),this.doUpdateParameters(t,i,s,e),e.getEndTime()>0&&e.getEndTime()<i&&e.setIsFinished(!0)}setFadeInTime(t){this._fadeInSeconds=t}setFadeOutTime(t){this._fadeOutSeconds=t}getFadeOutTime(){return this._fadeOutSeconds}getFadeInTime(){return this._fadeInSeconds}setWeight(t){this._weight=t}getWeight(){return this._weight}getDuration(){return-1}getLoopDuration(){return-1}setOffsetTime(t){this._offsetSeconds=t}getFiredEvent(t,e){return this._firedEventValues}setFinishedMotionHandler(t){this._onFinishedMotion=t}getFinishedMotionHandler(){return this._onFinishedMotion}}class O extends R{constructor(){super(),this._parameters=[]}static create(t){const e=new O,i=t.FadeInTime,s=t.FadeOutTime;e.setFadeInTime(void 0!==i?i:1),e.setFadeOutTime(void 0!==s?s:1);const r=t.Parameters||[];for(let a=0;a<r.length;++a){const t=r[a],i=t.Id,s=t.Value;let o;switch(t.Blend){case"Multiply":o=U.ExpressionBlendType_Multiply;break;case"Overwrite":o=U.ExpressionBlendType_Overwrite;break;default:o=U.ExpressionBlendType_Add}const n={parameterId:i,blendType:o,value:s};e._parameters.push(n)}return e}doUpdateParameters(t,e,i,s){for(let r=0;r<this._parameters.length;++r){const e=this._parameters[r];switch(e.blendType){case U.ExpressionBlendType_Add:t.addParameterValueById(e.parameterId,e.value,i);break;case U.ExpressionBlendType_Multiply:t.multiplyParameterValueById(e.parameterId,e.value,i);break;case U.ExpressionBlendType_Overwrite:t.setParameterValueById(e.parameterId,e.value,i)}}}}var k,U=(t=>(t[t.ExpressionBlendType_Add=0]="ExpressionBlendType_Add",t[t.ExpressionBlendType_Multiply=1]="ExpressionBlendType_Multiply",t[t.ExpressionBlendType_Overwrite=2]="ExpressionBlendType_Overwrite",t))(U||{});t.CubismConfig=void 0,(k=t.CubismConfig||(t.CubismConfig={})).supportMoreMaskDivisions=!0,k.setOpacityFromMotion=!1;var N=(t=>(t[t.CubismMotionCurveTarget_Model=0]="CubismMotionCurveTarget_Model",t[t.CubismMotionCurveTarget_Parameter=1]="CubismMotionCurveTarget_Parameter",t[t.CubismMotionCurveTarget_PartOpacity=2]="CubismMotionCurveTarget_PartOpacity",t))(N||{}),V=(t=>(t[t.CubismMotionSegmentType_Linear=0]="CubismMotionSegmentType_Linear",t[t.CubismMotionSegmentType_Bezier=1]="CubismMotionSegmentType_Bezier",t[t.CubismMotionSegmentType_Stepped=2]="CubismMotionSegmentType_Stepped",t[t.CubismMotionSegmentType_InverseStepped=3]="CubismMotionSegmentType_InverseStepped",t))(V||{});class j{constructor(t=0,e=0){this.time=t,this.value=e}}class G{constructor(){this.basePointIndex=0,this.segmentType=0}}class X{constructor(){this.id="",this.type=0,this.segmentCount=0,this.baseSegmentIndex=0,this.fadeInTime=0,this.fadeOutTime=0}}class z{constructor(){this.fireTime=0,this.value=""}}class W{constructor(){this.duration=0,this.loop=!1,this.curveCount=0,this.eventCount=0,this.fps=0,this.curves=[],this.segments=[],this.points=[],this.events=[]}}class H{constructor(t){this._json=t}release(){this._json=void 0}getMotionDuration(){return this._json.Meta.Duration}isMotionLoop(){return this._json.Meta.Loop||!1}getEvaluationOptionFlag(t){return Y.EvaluationOptionFlag_AreBeziersRistricted==t&&!!this._json.Meta.AreBeziersRestricted}getMotionCurveCount(){return this._json.Meta.CurveCount}getMotionFps(){return this._json.Meta.Fps}getMotionTotalSegmentCount(){return this._json.Meta.TotalSegmentCount}getMotionTotalPointCount(){return this._json.Meta.TotalPointCount}getMotionFadeInTime(){return this._json.Meta.FadeInTime}getMotionFadeOutTime(){return this._json.Meta.FadeOutTime}getMotionCurveTarget(t){return this._json.Curves[t].Target}getMotionCurveId(t){return this._json.Curves[t].Id}getMotionCurveFadeInTime(t){return this._json.Curves[t].FadeInTime}getMotionCurveFadeOutTime(t){return this._json.Curves[t].FadeOutTime}getMotionCurveSegmentCount(t){return this._json.Curves[t].Segments.length}getMotionCurveSegment(t,e){return this._json.Curves[t].Segments[e]}getEventCount(){return this._json.Meta.UserDataCount||0}getTotalEventValueSize(){return this._json.Meta.TotalUserDataSize}getEventTime(t){return this._json.UserData[t].Time}getEventValue(t){return this._json.UserData[t].Value}}var Y=(t=>(t[t.EvaluationOptionFlag_AreBeziersRistricted=0]="EvaluationOptionFlag_AreBeziersRistricted",t))(Y||{});function q(t,e,i){const s=new j;return s.time=t.time+(e.time-t.time)*i,s.value=t.value+(e.value-t.value)*i,s}function $(t,e){let i=(e-t[0].time)/(t[1].time-t[0].time);return i<0&&(i=0),t[0].value+(t[1].value-t[0].value)*i}function Z(t,e){let i=(e-t[0].time)/(t[3].time-t[0].time);i<0&&(i=0);const s=q(t[0],t[1],i),r=q(t[1],t[2],i),a=q(t[2],t[3],i),o=q(s,r,i),n=q(r,a,i);return q(o,n,i).value}function J(t,e){const i=e,s=t[0].time,r=t[3].time,a=t[1].time,o=t[2].time,n=r-3*o+3*a-s,l=3*o-6*a+3*s,h=3*a-3*s,u=s-i,d=g.cardanoAlgorithmForBezier(n,l,h,u),c=q(t[0],t[1],d),m=q(t[1],t[2],d),p=q(t[2],t[3],d),_=q(c,m,d),f=q(m,p,d);return q(_,f,d).value}function Q(t,e){return t[0].value}function K(t,e){return t[1].value}function tt(t,e,i){const s=t.curves[e];let r=-1;const a=s.baseSegmentIndex+s.segmentCount;let o=0;for(let l=s.baseSegmentIndex;l<a;++l)if(o=t.segments[l].basePointIndex+(t.segments[l].segmentType==V.CubismMotionSegmentType_Bezier?3:1),t.points[o].time>i){r=l;break}if(-1==r)return t.points[o].value;const n=t.segments[r];return n.evaluate(t.points.slice(n.basePointIndex),i)}class et extends R{constructor(){super(),this._eyeBlinkParameterIds=[],this._lipSyncParameterIds=[],this._sourceFrameRate=30,this._loopDurationSeconds=-1,this._isLoop=!1,this._isLoopFadeIn=!0,this._lastWeight=0}static create(t,e){const i=new et;return i.parse(t),i._sourceFrameRate=i._motionData.fps,i._loopDurationSeconds=i._motionData.duration,i._onFinishedMotion=e,i}doUpdateParameters(e,i,s,r){null==this._modelCurveIdEyeBlink&&(this._modelCurveIdEyeBlink="EyeBlink"),null==this._modelCurveIdLipSync&&(this._modelCurveIdLipSync="LipSync");let a=i-r.getStartTime();a<0&&(a=0);let o=Number.MAX_VALUE,n=Number.MAX_VALUE;const l=64;let h=0,u=0;this._eyeBlinkParameterIds.length>l&&w("too many eye blink targets : {0}",this._eyeBlinkParameterIds.length),this._lipSyncParameterIds.length>l&&w("too many lip sync targets : {0}",this._lipSyncParameterIds.length);const d=this._fadeInSeconds<=0?1:g.getEasingSine((i-r.getFadeInStartTime())/this._fadeInSeconds),c=this._fadeOutSeconds<=0||r.getEndTime()<0?1:g.getEasingSine((r.getEndTime()-i)/this._fadeOutSeconds);let m,p,_,f=a;if(this._isLoop)for(;f>this._motionData.duration;)f-=this._motionData.duration;const y=this._motionData.curves;for(p=0;p<this._motionData.curveCount&&y[p].type==N.CubismMotionCurveTarget_Model;++p)m=tt(this._motionData,p,f),y[p].id==this._modelCurveIdEyeBlink?n=m:y[p].id==this._modelCurveIdLipSync&&(o=m);for(;p<this._motionData.curveCount&&y[p].type==N.CubismMotionCurveTarget_Parameter;++p){if(_=e.getParameterIndex(y[p].id),-1==_)continue;const t=e.getParameterValueByIndex(_);if(m=tt(this._motionData,p,f),n!=Number.MAX_VALUE)for(let e=0;e<this._eyeBlinkParameterIds.length&&e<l;++e)if(this._eyeBlinkParameterIds[e]==y[p].id){m*=n,u|=1<<e;break}if(o!=Number.MAX_VALUE)for(let e=0;e<this._lipSyncParameterIds.length&&e<l;++e)if(this._lipSyncParameterIds[e]==y[p].id){m+=o,h|=1<<e;break}let a;if(y[p].fadeInTime<0&&y[p].fadeOutTime<0)a=t+(m-t)*s;else{let e,s;e=y[p].fadeInTime<0?d:0==y[p].fadeInTime?1:g.getEasingSine((i-r.getFadeInStartTime())/y[p].fadeInTime),s=y[p].fadeOutTime<0?c:0==y[p].fadeOutTime||r.getEndTime()<0?1:g.getEasingSine((r.getEndTime()-i)/y[p].fadeOutTime);a=t+(m-t)*(this._weight*e*s)}e.setParameterValueByIndex(_,a,1)}if(n!=Number.MAX_VALUE)for(let t=0;t<this._eyeBlinkParameterIds.length&&t<l;++t){const i=e.getParameterValueById(this._eyeBlinkParameterIds[t]);if(u>>t&1)continue;const r=i+(n-i)*s;e.setParameterValueById(this._eyeBlinkParameterIds[t],r)}if(o!=Number.MAX_VALUE)for(let t=0;t<this._lipSyncParameterIds.length&&t<l;++t){const i=e.getParameterValueById(this._lipSyncParameterIds[t]);if(h>>t&1)continue;const r=i+(o-i)*s;e.setParameterValueById(this._lipSyncParameterIds[t],r)}for(;p<this._motionData.curveCount&&y[p].type==N.CubismMotionCurveTarget_PartOpacity;++p)if(m=tt(this._motionData,p,f),t.CubismConfig.setOpacityFromMotion)e.setPartOpacityById(y[p].id,m);else{if(_=e.getParameterIndex(y[p].id),-1==_)continue;e.setParameterValueByIndex(_,m)}a>=this._motionData.duration&&(this._isLoop?(r.setStartTime(i),this._isLoopFadeIn&&r.setFadeInStartTime(i)):(this._onFinishedMotion&&this._onFinishedMotion(this),r.setIsFinished(!0))),this._lastWeight=s}setIsLoop(t){this._isLoop=t}isLoop(){return this._isLoop}setIsLoopFadeIn(t){this._isLoopFadeIn=t}isLoopFadeIn(){return this._isLoopFadeIn}getDuration(){return this._isLoop?-1:this._loopDurationSeconds}getLoopDuration(){return this._loopDurationSeconds}setParameterFadeInTime(t,e){const i=this._motionData.curves;for(let s=0;s<this._motionData.curveCount;++s)if(t==i[s].id)return void(i[s].fadeInTime=e)}setParameterFadeOutTime(t,e){const i=this._motionData.curves;for(let s=0;s<this._motionData.curveCount;++s)if(t==i[s].id)return void(i[s].fadeOutTime=e)}getParameterFadeInTime(t){const e=this._motionData.curves;for(let i=0;i<this._motionData.curveCount;++i)if(t==e[i].id)return e[i].fadeInTime;return-1}getParameterFadeOutTime(t){const e=this._motionData.curves;for(let i=0;i<this._motionData.curveCount;++i)if(t==e[i].id)return e[i].fadeOutTime;return-1}setEffectIds(t,e){this._eyeBlinkParameterIds=t,this._lipSyncParameterIds=e}release(){this._motionData=void 0}parse(t){this._motionData=new W;let e=new H(t);this._motionData.duration=e.getMotionDuration(),this._motionData.loop=e.isMotionLoop(),this._motionData.curveCount=e.getMotionCurveCount(),this._motionData.fps=e.getMotionFps(),this._motionData.eventCount=e.getEventCount();const i=e.getEvaluationOptionFlag(Y.EvaluationOptionFlag_AreBeziersRistricted),s=e.getMotionFadeInTime(),r=e.getMotionFadeOutTime();this._fadeInSeconds=void 0!==s?s<0?1:s:1,this._fadeOutSeconds=void 0!==r?r<0?1:r:1,this._motionData.curves=Array.from({length:this._motionData.curveCount}).map((()=>new X)),this._motionData.segments=Array.from({length:e.getMotionTotalSegmentCount()}).map((()=>new G)),this._motionData.events=Array.from({length:this._motionData.eventCount}).map((()=>new z)),this._motionData.points=[];let a=0,o=0;for(let n=0;n<this._motionData.curveCount;++n){const t=this._motionData.curves[n];switch(e.getMotionCurveTarget(n)){case"Model":t.type=N.CubismMotionCurveTarget_Model;break;case"Parameter":t.type=N.CubismMotionCurveTarget_Parameter;break;case"PartOpacity":t.type=N.CubismMotionCurveTarget_PartOpacity;break;default:L('Warning : Unable to get segment type from Curve! The number of "CurveCount" may be incorrect!')}t.id=e.getMotionCurveId(n),t.baseSegmentIndex=o;const s=e.getMotionCurveFadeInTime(n),r=e.getMotionCurveFadeOutTime(n);t.fadeInTime=void 0!==s?s:-1,t.fadeOutTime=void 0!==r?r:-1;for(let l=0;l<e.getMotionCurveSegmentCount(n);){0==l?(this._motionData.segments[o].basePointIndex=a,this._motionData.points[a]=new j(e.getMotionCurveSegment(n,l),e.getMotionCurveSegment(n,l+1)),a+=1,l+=2):this._motionData.segments[o].basePointIndex=a-1;switch(e.getMotionCurveSegment(n,l)){case V.CubismMotionSegmentType_Linear:this._motionData.segments[o].segmentType=V.CubismMotionSegmentType_Linear,this._motionData.segments[o].evaluate=$,this._motionData.points[a]=new j(e.getMotionCurveSegment(n,l+1),e.getMotionCurveSegment(n,l+2)),a+=1,l+=3;break;case V.CubismMotionSegmentType_Bezier:this._motionData.segments[o].segmentType=V.CubismMotionSegmentType_Bezier,this._motionData.segments[o].evaluate=i?Z:J,this._motionData.points[a]=new j(e.getMotionCurveSegment(n,l+1),e.getMotionCurveSegment(n,l+2)),this._motionData.points[a+1]=new j(e.getMotionCurveSegment(n,l+3),e.getMotionCurveSegment(n,l+4)),this._motionData.points[a+2]=new j(e.getMotionCurveSegment(n,l+5),e.getMotionCurveSegment(n,l+6)),a+=3,l+=7;break;case V.CubismMotionSegmentType_Stepped:this._motionData.segments[o].segmentType=V.CubismMotionSegmentType_Stepped,this._motionData.segments[o].evaluate=Q,this._motionData.points[a]=new j(e.getMotionCurveSegment(n,l+1),e.getMotionCurveSegment(n,l+2)),a+=1,l+=3;break;case V.CubismMotionSegmentType_InverseStepped:this._motionData.segments[o].segmentType=V.CubismMotionSegmentType_InverseStepped,this._motionData.segments[o].evaluate=K,this._motionData.points[a]=new j(e.getMotionCurveSegment(n,l+1),e.getMotionCurveSegment(n,l+2)),a+=1,l+=3}++t.segmentCount,++o}this._motionData.curves.push(t)}for(let n=0;n<e.getEventCount();++n)this._motionData.events[n].fireTime=e.getEventTime(n),this._motionData.events[n].value=e.getEventValue(n);e.release()}getFiredEvent(t,e){this._firedEventValues.length=0;for(let i=0;i<this._motionData.eventCount;++i)this._motionData.events[i].fireTime>t&&this._motionData.events[i].fireTime<=e&&this._firedEventValues.push(this._motionData.events[i].value);return this._firedEventValues}}class it{constructor(){this._autoDelete=!1,this._available=!0,this._finished=!1,this._started=!1,this._startTimeSeconds=-1,this._fadeInStartTimeSeconds=0,this._endTimeSeconds=-1,this._stateTimeSeconds=0,this._stateWeight=0,this._lastEventCheckSeconds=0,this._motionQueueEntryHandle=this,this._fadeOutSeconds=0,this._isTriggeredFadeOut=!1}release(){this._autoDelete&&this._motion&&this._motion.release()}setFadeOut(t){this._fadeOutSeconds=t,this._isTriggeredFadeOut=!0}startFadeOut(t,e){const i=e+t;this._isTriggeredFadeOut=!0,(this._endTimeSeconds<0||i<this._endTimeSeconds)&&(this._endTimeSeconds=i)}isFinished(){return this._finished}isStarted(){return this._started}getStartTime(){return this._startTimeSeconds}getFadeInStartTime(){return this._fadeInStartTimeSeconds}getEndTime(){return this._endTimeSeconds}setStartTime(t){this._startTimeSeconds=t}setFadeInStartTime(t){this._fadeInStartTimeSeconds=t}setEndTime(t){this._endTimeSeconds=t}setIsFinished(t){this._finished=t}setIsStarted(t){this._started=t}isAvailable(){return this._available}setIsAvailable(t){this._available=t}setState(t,e){this._stateTimeSeconds=t,this._stateWeight=e}getStateTime(){return this._stateTimeSeconds}getStateWeight(){return this._stateWeight}getLastCheckEventSeconds(){return this._lastEventCheckSeconds}setLastCheckEventSeconds(t){this._lastEventCheckSeconds=t}isTriggeredFadeOut(){return this._isTriggeredFadeOut}getFadeOutSeconds(){return this._fadeOutSeconds}}class st{constructor(){this._userTimeSeconds=0,this._eventCustomData=null,this._motions=[]}release(){for(let t=0;t<this._motions.length;++t)this._motions[t]&&this._motions[t].release();this._motions=void 0}startMotion(t,e,i){if(null==t)return rt;let s;for(let r=0;r<this._motions.length;++r)s=this._motions[r],null!=s&&s.setFadeOut(s._motion.getFadeOutTime());return s=new it,s._autoDelete=e,s._motion=t,this._motions.push(s),s._motionQueueEntryHandle}isFinished(){let t=0;for(;t<this._motions.length;){const e=this._motions[t];if(null==e){this._motions.splice(t,1);continue}if(null!=e._motion){if(!e.isFinished())return!1;t++}else e.release(),this._motions.splice(t,1)}return!0}isFinishedByHandle(t){for(let e=0;e<this._motions.length;e++){const i=this._motions[e];if(null!=i&&(i._motionQueueEntryHandle==t&&!i.isFinished()))return!1}return!0}stopAllMotions(){for(let t=0;t<this._motions.length;t++){const e=this._motions[t];null!=e&&e.release()}this._motions=[]}getCubismMotionQueueEntry(t){return this._motions.find((e=>null!=e&&e._motionQueueEntryHandle==t))}setEventCallback(t,e=null){this._eventCallBack=t,this._eventCustomData=e}doUpdateMotion(t,e){let i=!1,s=0;for(;s<this._motions.length;){const r=this._motions[s];if(null==r){this._motions.splice(s,1);continue}const a=r._motion;if(null==a){r.release(),this._motions.splice(s,1);continue}a.updateParameters(t,r,e),i=!0;const o=a.getFiredEvent(r.getLastCheckEventSeconds()-r.getStartTime(),e-r.getStartTime());for(let t=0;t<o.length;++t)this._eventCallBack(this,o[t],this._eventCustomData);r.setLastCheckEventSeconds(e),r.isFinished()?(r.release(),this._motions.splice(s,1)):(r.isTriggeredFadeOut()&&r.startFadeOut(r.getFadeOutSeconds(),e),s++)}return i}}const rt=-1;var at=(t=>(t[t.CubismPhysicsTargetType_Parameter=0]="CubismPhysicsTargetType_Parameter",t))(at||{}),ot=(t=>(t[t.CubismPhysicsSource_X=0]="CubismPhysicsSource_X",t[t.CubismPhysicsSource_Y=1]="CubismPhysicsSource_Y",t[t.CubismPhysicsSource_Angle=2]="CubismPhysicsSource_Angle",t))(ot||{});class nt{constructor(){this.initialPosition=new c(0,0),this.position=new c(0,0),this.lastPosition=new c(0,0),this.lastGravity=new c(0,0),this.force=new c(0,0),this.velocity=new c(0,0)}}class lt{constructor(){this.normalizationPosition={},this.normalizationAngle={}}}class ht{constructor(){this.source={}}}class ut{constructor(){this.destination={},this.translationScale=new c(0,0)}}class dt{constructor(){this.settings=[],this.inputs=[],this.outputs=[],this.particles=[],this.gravity=new c(0,0),this.wind=new c(0,0)}}class ct{constructor(t){this._json=t}release(){this._json=void 0}getGravity(){const t=new c(0,0);return t.x=this._json.Meta.EffectiveForces.Gravity.X,t.y=this._json.Meta.EffectiveForces.Gravity.Y,t}getWind(){const t=new c(0,0);return t.x=this._json.Meta.EffectiveForces.Wind.X,t.y=this._json.Meta.EffectiveForces.Wind.Y,t}getSubRigCount(){return this._json.Meta.PhysicsSettingCount}getTotalInputCount(){return this._json.Meta.TotalInputCount}getTotalOutputCount(){return this._json.Meta.TotalOutputCount}getVertexCount(){return this._json.Meta.VertexCount}getNormalizationPositionMinimumValue(t){return this._json.PhysicsSettings[t].Normalization.Position.Minimum}getNormalizationPositionMaximumValue(t){return this._json.PhysicsSettings[t].Normalization.Position.Maximum}getNormalizationPositionDefaultValue(t){return this._json.PhysicsSettings[t].Normalization.Position.Default}getNormalizationAngleMinimumValue(t){return this._json.PhysicsSettings[t].Normalization.Angle.Minimum}getNormalizationAngleMaximumValue(t){return this._json.PhysicsSettings[t].Normalization.Angle.Maximum}getNormalizationAngleDefaultValue(t){return this._json.PhysicsSettings[t].Normalization.Angle.Default}getInputCount(t){return this._json.PhysicsSettings[t].Input.length}getInputWeight(t,e){return this._json.PhysicsSettings[t].Input[e].Weight}getInputReflect(t,e){return this._json.PhysicsSettings[t].Input[e].Reflect}getInputType(t,e){return this._json.PhysicsSettings[t].Input[e].Type}getInputSourceId(t,e){return this._json.PhysicsSettings[t].Input[e].Source.Id}getOutputCount(t){return this._json.PhysicsSettings[t].Output.length}getOutputVertexIndex(t,e){return this._json.PhysicsSettings[t].Output[e].VertexIndex}getOutputAngleScale(t,e){return this._json.PhysicsSettings[t].Output[e].Scale}getOutputWeight(t,e){return this._json.PhysicsSettings[t].Output[e].Weight}getOutputDestinationId(t,e){return this._json.PhysicsSettings[t].Output[e].Destination.Id}getOutputType(t,e){return this._json.PhysicsSettings[t].Output[e].Type}getOutputReflect(t,e){return this._json.PhysicsSettings[t].Output[e].Reflect}getParticleCount(t){return this._json.PhysicsSettings[t].Vertices.length}getParticleMobility(t,e){return this._json.PhysicsSettings[t].Vertices[e].Mobility}getParticleDelay(t,e){return this._json.PhysicsSettings[t].Vertices[e].Delay}getParticleAcceleration(t,e){return this._json.PhysicsSettings[t].Vertices[e].Acceleration}getParticleRadius(t,e){return this._json.PhysicsSettings[t].Vertices[e].Radius}getParticlePosition(t,e){const i=new c(0,0);return i.x=this._json.PhysicsSettings[t].Vertices[e].Position.X,i.y=this._json.PhysicsSettings[t].Vertices[e].Position.Y,i}}const mt="Angle";class gt{static create(t){const e=new gt;return e.parse(t),e._physicsRig.gravity.y=0,e}evaluate(t,e){let i,s,r,a;const o=new c;let n,l,h,u,d,m,p,_;d=t.getModel().parameters.values,m=t.getModel().parameters.maximumValues,p=t.getModel().parameters.minimumValues,_=t.getModel().parameters.defaultValues;for(let f=0;f<this._physicsRig.subRigCount;++f){i={angle:0},o.x=0,o.y=0,n=this._physicsRig.settings[f],l=this._physicsRig.inputs.slice(n.baseInputIndex),h=this._physicsRig.outputs.slice(n.baseOutputIndex),u=this._physicsRig.particles.slice(n.baseParticleIndex);for(let e=0;e<n.inputCount;++e)s=l[e].weight/100,-1==l[e].sourceParameterIndex&&(l[e].sourceParameterIndex=t.getParameterIndex(l[e].source.id)),l[e].getNormalizedParameterValue(o,i,d[l[e].sourceParameterIndex],p[l[e].sourceParameterIndex],m[l[e].sourceParameterIndex],_[l[e].sourceParameterIndex],n.normalizationPosition,n.normalizationAngle,l[e].reflect,s);r=g.degreesToRadian(-i.angle),o.x=o.x*g.cos(r)-o.y*g.sin(r),o.y=o.x*g.sin(r)+o.y*g.cos(r),wt(u,n.particleCount,o,i.angle,this._options.wind,.001*n.normalizationPosition.maximum,e,5);for(let e=0;e<n.outputCount;++e){const i=h[e].vertexIndex;if(i<1||i>=n.particleCount)break;-1==h[e].destinationParameterIndex&&(h[e].destinationParameterIndex=t.getParameterIndex(h[e].destination.id));const s=new c;s.x=u[i].position.x-u[i-1].position.x,s.y=u[i].position.y-u[i-1].position.y,a=h[e].getValue(s,u,i,h[e].reflect,this._options.gravity);const r=h[e].destinationParameterIndex,o=!Float32Array.prototype.slice&&"subarray"in Float32Array.prototype?JSON.parse(JSON.stringify(d.subarray(r))):d.slice(r);It(o,p[r],m[r],a,h[e]);for(let t=r,e=0;t<d.length;t++,e++)d[t]=o[e]}}}setOptions(t){this._options=t}getOption(){return this._options}constructor(){this._options=new pt,this._options.gravity.y=-1,this._options.gravity.x=0,this._options.wind.x=0,this._options.wind.y=0}release(){this._physicsRig=void 0}parse(t){this._physicsRig=new dt;let e=new ct(t);this._physicsRig.gravity=e.getGravity(),this._physicsRig.wind=e.getWind(),this._physicsRig.subRigCount=e.getSubRigCount();let i=0,s=0,r=0;for(let a=0;a<this._physicsRig.subRigCount;++a){const t=new lt;t.normalizationPosition.minimum=e.getNormalizationPositionMinimumValue(a),t.normalizationPosition.maximum=e.getNormalizationPositionMaximumValue(a),t.normalizationPosition.defalut=e.getNormalizationPositionDefaultValue(a),t.normalizationAngle.minimum=e.getNormalizationAngleMinimumValue(a),t.normalizationAngle.maximum=e.getNormalizationAngleMaximumValue(a),t.normalizationAngle.defalut=e.getNormalizationAngleDefaultValue(a),t.inputCount=e.getInputCount(a),t.baseInputIndex=i,i+=t.inputCount;for(let i=0;i<t.inputCount;++i){const t=new ht;switch(t.sourceParameterIndex=-1,t.weight=e.getInputWeight(a,i),t.reflect=e.getInputReflect(a,i),e.getInputType(a,i)){case"X":t.type=ot.CubismPhysicsSource_X,t.getNormalizedParameterValue=_t;break;case"Y":t.type=ot.CubismPhysicsSource_Y,t.getNormalizedParameterValue=ft;break;case mt:t.type=ot.CubismPhysicsSource_Angle,t.getNormalizedParameterValue=yt}t.source.targetType=at.CubismPhysicsTargetType_Parameter,t.source.id=e.getInputSourceId(a,i),this._physicsRig.inputs.push(t)}t.outputCount=e.getOutputCount(a),t.baseOutputIndex=s,s+=t.outputCount;for(let i=0;i<t.outputCount;++i){const t=new ut;switch(t.destinationParameterIndex=-1,t.vertexIndex=e.getOutputVertexIndex(a,i),t.angleScale=e.getOutputAngleScale(a,i),t.weight=e.getOutputWeight(a,i),t.destination.targetType=at.CubismPhysicsTargetType_Parameter,t.destination.id=e.getOutputDestinationId(a,i),e.getOutputType(a,i)){case"X":t.type=ot.CubismPhysicsSource_X,t.getValue=xt,t.getScale=Ct;break;case"Y":t.type=ot.CubismPhysicsSource_Y,t.getValue=vt,t.getScale=St;break;case mt:t.type=ot.CubismPhysicsSource_Angle,t.getValue=Mt,t.getScale=bt}t.reflect=e.getOutputReflect(a,i),this._physicsRig.outputs.push(t)}t.particleCount=e.getParticleCount(a),t.baseParticleIndex=r,r+=t.particleCount;for(let i=0;i<t.particleCount;++i){const t=new nt;t.mobility=e.getParticleMobility(a,i),t.delay=e.getParticleDelay(a,i),t.acceleration=e.getParticleAcceleration(a,i),t.radius=e.getParticleRadius(a,i),t.position=e.getParticlePosition(a,i),this._physicsRig.particles.push(t)}this._physicsRig.settings.push(t)}this.initialize(),e.release()}initialize(){let t,e,i;for(let s=0;s<this._physicsRig.subRigCount;++s){e=this._physicsRig.settings[s],t=this._physicsRig.particles.slice(e.baseParticleIndex),t[0].initialPosition=new c(0,0),t[0].lastPosition=new c(t[0].initialPosition.x,t[0].initialPosition.y),t[0].lastGravity=new c(0,-1),t[0].lastGravity.y*=-1,t[0].velocity=new c(0,0),t[0].force=new c(0,0);for(let s=1;s<e.particleCount;++s)i=new c(0,0),i.y=t[s].radius,t[s].initialPosition=new c(t[s-1].initialPosition.x+i.x,t[s-1].initialPosition.y+i.y),t[s].position=new c(t[s].initialPosition.x,t[s].initialPosition.y),t[s].lastPosition=new c(t[s].initialPosition.x,t[s].initialPosition.y),t[s].lastGravity=new c(0,-1),t[s].lastGravity.y*=-1,t[s].velocity=new c(0,0),t[s].force=new c(0,0)}}}class pt{constructor(){this.gravity=new c(0,0),this.wind=new c(0,0)}}function _t(t,e,i,s,r,a,o,n,l,h){t.x+=Lt(i,s,r,a,o.minimum,o.maximum,o.defalut,l)*h}function ft(t,e,i,s,r,a,o,n,l,h){t.y+=Lt(i,s,r,a,o.minimum,o.maximum,o.defalut,l)*h}function yt(t,e,i,s,r,a,o,n,l,h){e.angle+=Lt(i,s,r,a,n.minimum,n.maximum,n.defalut,l)*h}function xt(t,e,i,s,r){let a=t.x;return s&&(a*=-1),a}function vt(t,e,i,s,r){let a=t.y;return s&&(a*=-1),a}function Mt(t,e,i,s,r){let a;return r=i>=2?e[i-1].position.substract(e[i-2].position):r.multiplyByScaler(-1),a=g.directionToRadian(r,t),s&&(a*=-1),a}function Pt(t,e){return Math.min(t,e)+function(t,e){return Math.abs(Math.max(t,e)-Math.min(t,e))}(t,e)/2}function Ct(t,e){return t.x}function St(t,e){return t.y}function bt(t,e){return e}function wt(t,e,i,s,r,a,o,n){let l,h,u,d,m=new c(0,0),p=new c(0,0),_=new c(0,0),f=new c(0,0);t[0].position=new c(i.x,i.y),l=g.degreesToRadian(s),d=g.radianToDirection(l),d.normalize();for(let y=1;y<e;++y)t[y].force=d.multiplyByScaler(t[y].acceleration).add(r),t[y].lastPosition=new c(t[y].position.x,t[y].position.y),h=t[y].delay*o*30,m=t[y].position.substract(t[y-1].position),u=g.directionToRadian(t[y].lastGravity,d)/n,m.x=g.cos(u)*m.x-m.y*g.sin(u),m.y=g.sin(u)*m.x+m.y*g.cos(u),t[y].position=t[y-1].position.add(m),p=t[y].velocity.multiplyByScaler(h),_=t[y].force.multiplyByScaler(h).multiplyByScaler(h),t[y].position=t[y].position.add(p).add(_),f=t[y].position.substract(t[y-1].position),f.normalize(),t[y].position=t[y-1].position.add(f.multiplyByScaler(t[y].radius)),g.abs(t[y].position.x)<a&&(t[y].position.x=0),0!=h&&(t[y].velocity=t[y].position.substract(t[y].lastPosition),t[y].velocity=t[y].velocity.divisionByScalar(h),t[y].velocity=t[y].velocity.multiplyByScaler(t[y].mobility)),t[y].force=new c(0,0),t[y].lastGravity=new c(d.x,d.y)}function It(t,e,i,s,r){let a,o,n;a=r.getScale(r.translationScale,r.angleScale),o=s*a,o<e?(o<r.valueBelowMinimum&&(r.valueBelowMinimum=o),o=e):o>i&&(o>r.valueExceededMaximum&&(r.valueExceededMaximum=o),o=i),n=r.weight/100,n>=1||(o=t[0]*(1-n)+o*n),t[0]=o}function Lt(t,e,i,s,r,a,o,n){let l=0;const h=g.max(i,e);h<t&&(t=h);const u=g.min(i,e);u>t&&(t=u);const d=g.min(r,a),c=g.max(r,a),m=o,p=Pt(u,h),_=t-p;switch(Math.sign(_)){case 1:{const t=c-m,e=h-p;0!=e&&(l=_*(t/e),l+=m);break}case-1:{const t=d-m,e=u-p;0!=e&&(l=_*(t/e),l+=m);break}case 0:l=m}return n?l:-1*l}class Tt{constructor(t=0,e=0,i=0,s=0){this.x=t,this.y=e,this.width=i,this.height=s}getCenterX(){return this.x+.5*this.width}getCenterY(){return this.y+.5*this.height}getRight(){return this.x+this.width}getBottom(){return this.y+this.height}setRect(t){this.x=t.x,this.y=t.y,this.width=t.width,this.height=t.height}expand(t,e){this.x-=t,this.y-=e,this.width+=2*t,this.height+=2*e}}let Et,Dt,Ft;class At{getChannelFlagAsColor(t){return this._channelColors[t]}getMaskRenderTexture(){let t=0;if(this._maskTexture&&0!=this._maskTexture.texture&&(this._maskTexture.frameNo=this._currentFrameNo,t=this._maskTexture.texture),0==t){const e=this._clippingMaskBufferSize;this._colorBuffer=this.gl.createTexture(),this.gl.bindTexture(this.gl.TEXTURE_2D,this._colorBuffer),this.gl.texImage2D(this.gl.TEXTURE_2D,0,this.gl.RGBA,e,e,0,this.gl.RGBA,this.gl.UNSIGNED_BYTE,null),this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_WRAP_S,this.gl.CLAMP_TO_EDGE),this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_WRAP_T,this.gl.CLAMP_TO_EDGE),this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_MIN_FILTER,this.gl.LINEAR),this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_MAG_FILTER,this.gl.LINEAR),this.gl.bindTexture(this.gl.TEXTURE_2D,null),t=this.gl.createFramebuffer(),this.gl.bindFramebuffer(this.gl.FRAMEBUFFER,t),this.gl.framebufferTexture2D(this.gl.FRAMEBUFFER,this.gl.COLOR_ATTACHMENT0,this.gl.TEXTURE_2D,this._colorBuffer,0),this.gl.bindFramebuffer(this.gl.FRAMEBUFFER,Ft),this._maskTexture=new Bt(this._currentFrameNo,t)}return t}setGL(t){this.gl=t}calcClippedDrawTotalBounds(t,e){let i=Number.MAX_VALUE,s=Number.MAX_VALUE,r=Number.MIN_VALUE,a=Number.MIN_VALUE;const o=e._clippedDrawableIndexList.length;for(let n=0;n<o;n++){const o=e._clippedDrawableIndexList[n],l=t.getDrawableVertexCount(o),h=t.getDrawableVertices(o);let u=Number.MAX_VALUE,d=Number.MAX_VALUE,c=Number.MIN_VALUE,m=Number.MIN_VALUE;const g=l*P.vertexStep;for(let t=P.vertexOffset;t<g;t+=P.vertexStep){const e=h[t],i=h[t+1];e<u&&(u=e),e>c&&(c=e),i<d&&(d=i),i>m&&(m=i)}if(u!=Number.MAX_VALUE)if(u<i&&(i=u),d<s&&(s=d),c>r&&(r=c),m>a&&(a=m),i==Number.MAX_VALUE)e._allClippedDrawRect.x=0,e._allClippedDrawRect.y=0,e._allClippedDrawRect.width=0,e._allClippedDrawRect.height=0,e._isUsing=!1;else{e._isUsing=!0;const t=r-i,o=a-s;e._allClippedDrawRect.x=i,e._allClippedDrawRect.y=s,e._allClippedDrawRect.width=t,e._allClippedDrawRect.height=o}}}constructor(){this._maskRenderTexture=null,this._colorBuffer=null,this._currentFrameNo=0,this._clippingMaskBufferSize=256,this._clippingContextListForMask=[],this._clippingContextListForDraw=[],this._channelColors=[],this._tmpBoundsOnModel=new Tt,this._tmpMatrix=new p,this._tmpMatrixForMask=new p,this._tmpMatrixForDraw=new p;let t=new y;t.R=1,t.G=0,t.B=0,t.A=0,this._channelColors.push(t),t=new y,t.R=0,t.G=1,t.B=0,t.A=0,this._channelColors.push(t),t=new y,t.R=0,t.G=0,t.B=1,t.A=0,this._channelColors.push(t),t=new y,t.R=0,t.G=0,t.B=0,t.A=1,this._channelColors.push(t)}release(){var t,e,i;const s=this;for(let r=0;r<this._clippingContextListForMask.length;r++)this._clippingContextListForMask[r]&&(null==(t=this._clippingContextListForMask[r])||t.release());s._clippingContextListForMask=void 0,s._clippingContextListForDraw=void 0,this._maskTexture&&(null==(e=this.gl)||e.deleteFramebuffer(this._maskTexture.texture),s._maskTexture=void 0),s._channelColors=void 0,null==(i=this.gl)||i.deleteTexture(this._colorBuffer),this._colorBuffer=null}initialize(t,e,i,s){for(let r=0;r<e;r++){if(s[r]<=0){this._clippingContextListForDraw.push(null);continue}let t=this.findSameClip(i[r],s[r]);null==t&&(t=new Rt(this,i[r],s[r]),this._clippingContextListForMask.push(t)),t.addClippedDrawable(r),this._clippingContextListForDraw.push(t)}}setupClippingContext(t,e){this._currentFrameNo++;let i=0;for(let s=0;s<this._clippingContextListForMask.length;s++){const e=this._clippingContextListForMask[s];this.calcClippedDrawTotalBounds(t,e),e._isUsing&&i++}if(i>0){this.gl.viewport(0,0,this._clippingMaskBufferSize,this._clippingMaskBufferSize),this._maskRenderTexture=this.getMaskRenderTexture(),e.getMvpMatrix(),e.preDraw(),this.setupLayoutBounds(i),this.gl.bindFramebuffer(this.gl.FRAMEBUFFER,this._maskRenderTexture),this.gl.clearColor(1,1,1,1),this.gl.clear(this.gl.COLOR_BUFFER_BIT);for(let i=0;i<this._clippingContextListForMask.length;i++){const s=this._clippingContextListForMask[i],r=s._allClippedDrawRect,a=s._layoutBounds,o=.05;this._tmpBoundsOnModel.setRect(r),this._tmpBoundsOnModel.expand(r.width*o,r.height*o);const n=a.width/this._tmpBoundsOnModel.width,l=a.height/this._tmpBoundsOnModel.height;this._tmpMatrix.loadIdentity(),this._tmpMatrix.translateRelative(-1,-1),this._tmpMatrix.scaleRelative(2,2),this._tmpMatrix.translateRelative(a.x,a.y),this._tmpMatrix.scaleRelative(n,l),this._tmpMatrix.translateRelative(-this._tmpBoundsOnModel.x,-this._tmpBoundsOnModel.y),this._tmpMatrixForMask.setMatrix(this._tmpMatrix.getArray()),this._tmpMatrix.loadIdentity(),this._tmpMatrix.translateRelative(a.x,a.y),this._tmpMatrix.scaleRelative(n,l),this._tmpMatrix.translateRelative(-this._tmpBoundsOnModel.x,-this._tmpBoundsOnModel.y),this._tmpMatrixForDraw.setMatrix(this._tmpMatrix.getArray()),s._matrixForMask.setMatrix(this._tmpMatrixForMask.getArray()),s._matrixForDraw.setMatrix(this._tmpMatrixForDraw.getArray());const h=s._clippingIdCount;for(let i=0;i<h;i++){const r=s._clippingIdList[i];t.getDrawableDynamicFlagVertexPositionsDidChange(r)&&(e.setIsCulling(0!=t.getDrawableCulling(r)),e.setClippingContextBufferForMask(s),e.drawMesh(t.getDrawableTextureIndices(r),t.getDrawableVertexIndexCount(r),t.getDrawableVertexCount(r),t.getDrawableVertexIndices(r),t.getDrawableVertices(r),t.getDrawableVertexUvs(r),t.getDrawableOpacity(r),f.CubismBlendMode_Normal,!1))}}this.gl.bindFramebuffer(this.gl.FRAMEBUFFER,Ft),e.setClippingContextBufferForMask(null),this.gl.viewport(Dt[0],Dt[1],Dt[2],Dt[3])}}findSameClip(t,e){for(let i=0;i<this._clippingContextListForMask.length;i++){const s=this._clippingContextListForMask[i],r=s._clippingIdCount;if(r!=e)continue;let a=0;for(let e=0;e<r;e++){const i=s._clippingIdList[e];for(let e=0;e<r;e++)if(t[e]==i){a++;break}}if(a==r)return s}return null}setupLayoutBounds(e){let i=e/4,s=e%4;i=~~i,s=~~s;let r=0;for(let a=0;a<4;a++){const e=i+(a<s?1:0);if(0==e);else if(1==e){const t=this._clippingContextListForMask[r++];t._layoutChannelNo=a,t._layoutBounds.x=0,t._layoutBounds.y=0,t._layoutBounds.width=1,t._layoutBounds.height=1}else if(2==e)for(let t=0;t<e;t++){let e=t%2;e=~~e;const i=this._clippingContextListForMask[r++];i._layoutChannelNo=a,i._layoutBounds.x=.5*e,i._layoutBounds.y=0,i._layoutBounds.width=.5,i._layoutBounds.height=1}else if(e<=4)for(let t=0;t<e;t++){let e=t%2,i=t/2;e=~~e,i=~~i;const s=this._clippingContextListForMask[r++];s._layoutChannelNo=a,s._layoutBounds.x=.5*e,s._layoutBounds.y=.5*i,s._layoutBounds.width=.5,s._layoutBounds.height=.5}else if(e<=9)for(let t=0;t<e;t++){let e=t%3,i=t/3;e=~~e,i=~~i;const s=this._clippingContextListForMask[r++];s._layoutChannelNo=a,s._layoutBounds.x=e/3,s._layoutBounds.y=i/3,s._layoutBounds.width=1/3,s._layoutBounds.height=1/3}else if(t.CubismConfig.supportMoreMaskDivisions&&e<=16)for(let t=0;t<e;t++){let e=t%4,i=t/4;e=~~e,i=~~i;const s=this._clippingContextListForMask[r++];s._layoutChannelNo=a,s._layoutBounds.x=e/4,s._layoutBounds.y=i/4,s._layoutBounds.width=1/4,s._layoutBounds.height=1/4}else T("not supported mask count : {0}",e)}}getColorBuffer(){return this._colorBuffer}getClippingContextListForDraw(){return this._clippingContextListForDraw}setClippingMaskBufferSize(t){this._clippingMaskBufferSize=t}getClippingMaskBufferSize(){return this._clippingMaskBufferSize}}class Bt{constructor(t,e){this.frameNo=t,this.texture=e}}class Rt{constructor(t,e,i){this._isUsing=!1,this._owner=t,this._clippingIdList=e,this._clippingIdCount=i,this._allClippedDrawRect=new Tt,this._layoutBounds=new Tt,this._clippedDrawableIndexList=[],this._matrixForMask=new p,this._matrixForDraw=new p}release(){const t=this;t._layoutBounds=void 0,t._allClippedDrawRect=void 0,t._clippedDrawableIndexList=void 0}addClippedDrawable(t){this._clippedDrawableIndexList.push(t)}getClippingManager(){return this._owner}setGl(t){this._owner.setGL(t)}}class Ot{static getInstance(){return null==Et?(Et=new Ot,Et):Et}static deleteInstance(){Et&&(Et.release(),Et=void 0)}constructor(){this._shaderSets=[]}release(){this.releaseShaderProgram()}setupShaderProgram(t,e,i,s,r,a,o,n,l,h,u,d,c){let m,g,p,_;u||T("NoPremultipliedAlpha is not allowed"),0==this._shaderSets.length&&this.generateShaders();const y=t.getClippingContextBufferForMask();if(null!=y){const t=this._shaderSets[kt.ShaderNames_SetupMask];this.gl.useProgram(t.shaderProgram),this.gl.activeTexture(this.gl.TEXTURE0),this.gl.bindTexture(this.gl.TEXTURE_2D,e),this.gl.uniform1i(t.samplerTexture0Location,0),null==o.vertex&&(o.vertex=this.gl.createBuffer()),this.gl.bindBuffer(this.gl.ARRAY_BUFFER,o.vertex),this.gl.bufferData(this.gl.ARRAY_BUFFER,s,this.gl.DYNAMIC_DRAW),this.gl.enableVertexAttribArray(t.attributePositionLocation),this.gl.vertexAttribPointer(t.attributePositionLocation,2,this.gl.FLOAT,!1,0,0),null==o.uv&&(o.uv=this.gl.createBuffer()),this.gl.bindBuffer(this.gl.ARRAY_BUFFER,o.uv),this.gl.bufferData(this.gl.ARRAY_BUFFER,a,this.gl.DYNAMIC_DRAW),this.gl.enableVertexAttribArray(t.attributeTexCoordLocation),this.gl.vertexAttribPointer(t.attributeTexCoordLocation,2,this.gl.FLOAT,!1,0,0);const i=y._layoutChannelNo,r=y.getClippingManager().getChannelFlagAsColor(i);this.gl.uniform4f(t.uniformChannelFlagLocation,r.R,r.G,r.B,r.A),this.gl.uniformMatrix4fv(t.uniformClipMatrixLocation,!1,y._matrixForMask.getArray());const n=y._layoutBounds;this.gl.uniform4f(t.uniformBaseColorLocation,2*n.x-1,2*n.y-1,2*n.getRight()-1,2*n.getBottom()-1),m=this.gl.ZERO,g=this.gl.ONE_MINUS_SRC_COLOR,p=this.gl.ZERO,_=this.gl.ONE_MINUS_SRC_ALPHA}else{const i=t.getClippingContextBufferForDraw(),r=null!=i?c?2:1:0;let n;switch(l){case f.CubismBlendMode_Normal:default:n=this._shaderSets[kt.ShaderNames_NormalPremultipliedAlpha+r],m=this.gl.ONE,g=this.gl.ONE_MINUS_SRC_ALPHA,p=this.gl.ONE,_=this.gl.ONE_MINUS_SRC_ALPHA;break;case f.CubismBlendMode_Additive:n=this._shaderSets[kt.ShaderNames_AddPremultipliedAlpha+r],m=this.gl.ONE,g=this.gl.ONE,p=this.gl.ZERO,_=this.gl.ONE;break;case f.CubismBlendMode_Multiplicative:n=this._shaderSets[kt.ShaderNames_MultPremultipliedAlpha+r],m=this.gl.DST_COLOR,g=this.gl.ONE_MINUS_SRC_ALPHA,p=this.gl.ZERO,_=this.gl.ONE}if(this.gl.useProgram(n.shaderProgram),null==o.vertex&&(o.vertex=this.gl.createBuffer()),this.gl.bindBuffer(this.gl.ARRAY_BUFFER,o.vertex),this.gl.bufferData(this.gl.ARRAY_BUFFER,s,this.gl.DYNAMIC_DRAW),this.gl.enableVertexAttribArray(n.attributePositionLocation),this.gl.vertexAttribPointer(n.attributePositionLocation,2,this.gl.FLOAT,!1,0,0),null==o.uv&&(o.uv=this.gl.createBuffer()),this.gl.bindBuffer(this.gl.ARRAY_BUFFER,o.uv),this.gl.bufferData(this.gl.ARRAY_BUFFER,a,this.gl.DYNAMIC_DRAW),this.gl.enableVertexAttribArray(n.attributeTexCoordLocation),this.gl.vertexAttribPointer(n.attributeTexCoordLocation,2,this.gl.FLOAT,!1,0,0),null!=i){this.gl.activeTexture(this.gl.TEXTURE1);const t=i.getClippingManager().getColorBuffer();this.gl.bindTexture(this.gl.TEXTURE_2D,t),this.gl.uniform1i(n.samplerTexture1Location,1),this.gl.uniformMatrix4fv(n.uniformClipMatrixLocation,!1,i._matrixForDraw.getArray());const e=i._layoutChannelNo,s=i.getClippingManager().getChannelFlagAsColor(e);this.gl.uniform4f(n.uniformChannelFlagLocation,s.R,s.G,s.B,s.A)}this.gl.activeTexture(this.gl.TEXTURE0),this.gl.bindTexture(this.gl.TEXTURE_2D,e),this.gl.uniform1i(n.samplerTexture0Location,0),this.gl.uniformMatrix4fv(n.uniformMatrixLocation,!1,d.getArray()),this.gl.uniform4f(n.uniformBaseColorLocation,h.R,h.G,h.B,h.A)}null==o.index&&(o.index=this.gl.createBuffer()),this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER,o.index),this.gl.bufferData(this.gl.ELEMENT_ARRAY_BUFFER,r,this.gl.DYNAMIC_DRAW),this.gl.blendFuncSeparate(m,g,p,_)}releaseShaderProgram(){for(let t=0;t<this._shaderSets.length;t++)this.gl.deleteProgram(this._shaderSets[t].shaderProgram),this._shaderSets[t].shaderProgram=0;this._shaderSets=[]}generateShaders(){for(let t=0;t<10;t++)this._shaderSets.push({});this._shaderSets[0].shaderProgram=this.loadShaderProgram(Ut,Nt),this._shaderSets[1].shaderProgram=this.loadShaderProgram(Vt,Gt),this._shaderSets[2].shaderProgram=this.loadShaderProgram(jt,Xt),this._shaderSets[3].shaderProgram=this.loadShaderProgram(jt,zt),this._shaderSets[4].shaderProgram=this._shaderSets[1].shaderProgram,this._shaderSets[5].shaderProgram=this._shaderSets[2].shaderProgram,this._shaderSets[6].shaderProgram=this._shaderSets[3].shaderProgram,this._shaderSets[7].shaderProgram=this._shaderSets[1].shaderProgram,this._shaderSets[8].shaderProgram=this._shaderSets[2].shaderProgram,this._shaderSets[9].shaderProgram=this._shaderSets[3].shaderProgram,this._shaderSets[0].attributePositionLocation=this.gl.getAttribLocation(this._shaderSets[0].shaderProgram,"a_position"),this._shaderSets[0].attributeTexCoordLocation=this.gl.getAttribLocation(this._shaderSets[0].shaderProgram,"a_texCoord"),this._shaderSets[0].samplerTexture0Location=this.gl.getUniformLocation(this._shaderSets[0].shaderProgram,"s_texture0"),this._shaderSets[0].uniformClipMatrixLocation=this.gl.getUniformLocation(this._shaderSets[0].shaderProgram,"u_clipMatrix"),this._shaderSets[0].uniformChannelFlagLocation=this.gl.getUniformLocation(this._shaderSets[0].shaderProgram,"u_channelFlag"),this._shaderSets[0].uniformBaseColorLocation=this.gl.getUniformLocation(this._shaderSets[0].shaderProgram,"u_baseColor"),this._shaderSets[1].attributePositionLocation=this.gl.getAttribLocation(this._shaderSets[1].shaderProgram,"a_position"),this._shaderSets[1].attributeTexCoordLocation=this.gl.getAttribLocation(this._shaderSets[1].shaderProgram,"a_texCoord"),this._shaderSets[1].samplerTexture0Location=this.gl.getUniformLocation(this._shaderSets[1].shaderProgram,"s_texture0"),this._shaderSets[1].uniformMatrixLocation=this.gl.getUniformLocation(this._shaderSets[1].shaderProgram,"u_matrix"),this._shaderSets[1].uniformBaseColorLocation=this.gl.getUniformLocation(this._shaderSets[1].shaderProgram,"u_baseColor"),this._shaderSets[2].attributePositionLocation=this.gl.getAttribLocation(this._shaderSets[2].shaderProgram,"a_position"),this._shaderSets[2].attributeTexCoordLocation=this.gl.getAttribLocation(this._shaderSets[2].shaderProgram,"a_texCoord"),this._shaderSets[2].samplerTexture0Location=this.gl.getUniformLocation(this._shaderSets[2].shaderProgram,"s_texture0"),this._shaderSets[2].samplerTexture1Location=this.gl.getUniformLocation(this._shaderSets[2].shaderProgram,"s_texture1"),this._shaderSets[2].uniformMatrixLocation=this.gl.getUniformLocation(this._shaderSets[2].shaderProgram,"u_matrix"),this._shaderSets[2].uniformClipMatrixLocation=this.gl.getUniformLocation(this._shaderSets[2].shaderProgram,"u_clipMatrix"),this._shaderSets[2].uniformChannelFlagLocation=this.gl.getUniformLocation(this._shaderSets[2].shaderProgram,"u_channelFlag"),this._shaderSets[2].uniformBaseColorLocation=this.gl.getUniformLocation(this._shaderSets[2].shaderProgram,"u_baseColor"),this._shaderSets[3].attributePositionLocation=this.gl.getAttribLocation(this._shaderSets[3].shaderProgram,"a_position"),this._shaderSets[3].attributeTexCoordLocation=this.gl.getAttribLocation(this._shaderSets[3].shaderProgram,"a_texCoord"),this._shaderSets[3].samplerTexture0Location=this.gl.getUniformLocation(this._shaderSets[3].shaderProgram,"s_texture0"),this._shaderSets[3].samplerTexture1Location=this.gl.getUniformLocation(this._shaderSets[3].shaderProgram,"s_texture1"),this._shaderSets[3].uniformMatrixLocation=this.gl.getUniformLocation(this._shaderSets[3].shaderProgram,"u_matrix"),this._shaderSets[3].uniformClipMatrixLocation=this.gl.getUniformLocation(this._shaderSets[3].shaderProgram,"u_clipMatrix"),this._shaderSets[3].uniformChannelFlagLocation=this.gl.getUniformLocation(this._shaderSets[3].shaderProgram,"u_channelFlag"),this._shaderSets[3].uniformBaseColorLocation=this.gl.getUniformLocation(this._shaderSets[3].shaderProgram,"u_baseColor"),this._shaderSets[4].attributePositionLocation=this.gl.getAttribLocation(this._shaderSets[4].shaderProgram,"a_position"),this._shaderSets[4].attributeTexCoordLocation=this.gl.getAttribLocation(this._shaderSets[4].shaderProgram,"a_texCoord"),this._shaderSets[4].samplerTexture0Location=this.gl.getUniformLocation(this._shaderSets[4].shaderProgram,"s_texture0"),this._shaderSets[4].uniformMatrixLocation=this.gl.getUniformLocation(this._shaderSets[4].shaderProgram,"u_matrix"),this._shaderSets[4].uniformBaseColorLocation=this.gl.getUniformLocation(this._shaderSets[4].shaderProgram,"u_baseColor"),this._shaderSets[5].attributePositionLocation=this.gl.getAttribLocation(this._shaderSets[5].shaderProgram,"a_position"),this._shaderSets[5].attributeTexCoordLocation=this.gl.getAttribLocation(this._shaderSets[5].shaderProgram,"a_texCoord"),this._shaderSets[5].samplerTexture0Location=this.gl.getUniformLocation(this._shaderSets[5].shaderProgram,"s_texture0"),this._shaderSets[5].samplerTexture1Location=this.gl.getUniformLocation(this._shaderSets[5].shaderProgram,"s_texture1"),this._shaderSets[5].uniformMatrixLocation=this.gl.getUniformLocation(this._shaderSets[5].shaderProgram,"u_matrix"),this._shaderSets[5].uniformClipMatrixLocation=this.gl.getUniformLocation(this._shaderSets[5].shaderProgram,"u_clipMatrix"),this._shaderSets[5].uniformChannelFlagLocation=this.gl.getUniformLocation(this._shaderSets[5].shaderProgram,"u_channelFlag"),this._shaderSets[5].uniformBaseColorLocation=this.gl.getUniformLocation(this._shaderSets[5].shaderProgram,"u_baseColor"),this._shaderSets[6].attributePositionLocation=this.gl.getAttribLocation(this._shaderSets[6].shaderProgram,"a_position"),this._shaderSets[6].attributeTexCoordLocation=this.gl.getAttribLocation(this._shaderSets[6].shaderProgram,"a_texCoord"),this._shaderSets[6].samplerTexture0Location=this.gl.getUniformLocation(this._shaderSets[6].shaderProgram,"s_texture0"),this._shaderSets[6].samplerTexture1Location=this.gl.getUniformLocation(this._shaderSets[6].shaderProgram,"s_texture1"),this._shaderSets[6].uniformMatrixLocation=this.gl.getUniformLocation(this._shaderSets[6].shaderProgram,"u_matrix"),this._shaderSets[6].uniformClipMatrixLocation=this.gl.getUniformLocation(this._shaderSets[6].shaderProgram,"u_clipMatrix"),this._shaderSets[6].uniformChannelFlagLocation=this.gl.getUniformLocation(this._shaderSets[6].shaderProgram,"u_channelFlag"),this._shaderSets[6].uniformBaseColorLocation=this.gl.getUniformLocation(this._shaderSets[6].shaderProgram,"u_baseColor"),this._shaderSets[7].attributePositionLocation=this.gl.getAttribLocation(this._shaderSets[7].shaderProgram,"a_position"),this._shaderSets[7].attributeTexCoordLocation=this.gl.getAttribLocation(this._shaderSets[7].shaderProgram,"a_texCoord"),this._shaderSets[7].samplerTexture0Location=this.gl.getUniformLocation(this._shaderSets[7].shaderProgram,"s_texture0"),this._shaderSets[7].uniformMatrixLocation=this.gl.getUniformLocation(this._shaderSets[7].shaderProgram,"u_matrix"),this._shaderSets[7].uniformBaseColorLocation=this.gl.getUniformLocation(this._shaderSets[7].shaderProgram,"u_baseColor"),this._shaderSets[8].attributePositionLocation=this.gl.getAttribLocation(this._shaderSets[8].shaderProgram,"a_position"),this._shaderSets[8].attributeTexCoordLocation=this.gl.getAttribLocation(this._shaderSets[8].shaderProgram,"a_texCoord"),this._shaderSets[8].samplerTexture0Location=this.gl.getUniformLocation(this._shaderSets[8].shaderProgram,"s_texture0"),this._shaderSets[8].samplerTexture1Location=this.gl.getUniformLocation(this._shaderSets[8].shaderProgram,"s_texture1"),this._shaderSets[8].uniformMatrixLocation=this.gl.getUniformLocation(this._shaderSets[8].shaderProgram,"u_matrix"),this._shaderSets[8].uniformClipMatrixLocation=this.gl.getUniformLocation(this._shaderSets[8].shaderProgram,"u_clipMatrix"),this._shaderSets[8].uniformChannelFlagLocation=this.gl.getUniformLocation(this._shaderSets[8].shaderProgram,"u_channelFlag"),this._shaderSets[8].uniformBaseColorLocation=this.gl.getUniformLocation(this._shaderSets[8].shaderProgram,"u_baseColor"),this._shaderSets[9].attributePositionLocation=this.gl.getAttribLocation(this._shaderSets[9].shaderProgram,"a_position"),this._shaderSets[9].attributeTexCoordLocation=this.gl.getAttribLocation(this._shaderSets[9].shaderProgram,"a_texCoord"),this._shaderSets[9].samplerTexture0Location=this.gl.getUniformLocation(this._shaderSets[9].shaderProgram,"s_texture0"),this._shaderSets[9].samplerTexture1Location=this.gl.getUniformLocation(this._shaderSets[9].shaderProgram,"s_texture1"),this._shaderSets[9].uniformMatrixLocation=this.gl.getUniformLocation(this._shaderSets[9].shaderProgram,"u_matrix"),this._shaderSets[9].uniformClipMatrixLocation=this.gl.getUniformLocation(this._shaderSets[9].shaderProgram,"u_clipMatrix"),this._shaderSets[9].uniformChannelFlagLocation=this.gl.getUniformLocation(this._shaderSets[9].shaderProgram,"u_channelFlag"),this._shaderSets[9].uniformBaseColorLocation=this.gl.getUniformLocation(this._shaderSets[9].shaderProgram,"u_baseColor")}loadShaderProgram(t,e){let i=this.gl.createProgram(),s=this.compileShaderSource(this.gl.VERTEX_SHADER,t);if(!s)return T("Vertex shader compile error!"),0;let r=this.compileShaderSource(this.gl.FRAGMENT_SHADER,e);if(!r)return T("Vertex shader compile error!"),0;this.gl.attachShader(i,s),this.gl.attachShader(i,r),this.gl.linkProgram(i);return this.gl.getProgramParameter(i,this.gl.LINK_STATUS)?(this.gl.deleteShader(s),this.gl.deleteShader(r),i):(T("Failed to link program: {0}",i),this.gl.deleteShader(s),this.gl.deleteShader(r),i&&this.gl.deleteProgram(i),0)}compileShaderSource(t,e){const i=e,s=this.gl.createShader(t);if(this.gl.shaderSource(s,i),this.gl.compileShader(s),!s){T("Shader compile log: {0} ",this.gl.getShaderInfoLog(s))}return this.gl.getShaderParameter(s,this.gl.COMPILE_STATUS)?s:(this.gl.deleteShader(s),null)}setGl(t){this.gl=t}}var kt=(t=>(t[t.ShaderNames_SetupMask=0]="ShaderNames_SetupMask",t[t.ShaderNames_NormalPremultipliedAlpha=1]="ShaderNames_NormalPremultipliedAlpha",t[t.ShaderNames_NormalMaskedPremultipliedAlpha=2]="ShaderNames_NormalMaskedPremultipliedAlpha",t[t.ShaderNames_NomralMaskedInvertedPremultipliedAlpha=3]="ShaderNames_NomralMaskedInvertedPremultipliedAlpha",t[t.ShaderNames_AddPremultipliedAlpha=4]="ShaderNames_AddPremultipliedAlpha",t[t.ShaderNames_AddMaskedPremultipliedAlpha=5]="ShaderNames_AddMaskedPremultipliedAlpha",t[t.ShaderNames_AddMaskedPremultipliedAlphaInverted=6]="ShaderNames_AddMaskedPremultipliedAlphaInverted",t[t.ShaderNames_MultPremultipliedAlpha=7]="ShaderNames_MultPremultipliedAlpha",t[t.ShaderNames_MultMaskedPremultipliedAlpha=8]="ShaderNames_MultMaskedPremultipliedAlpha",t[t.ShaderNames_MultMaskedPremultipliedAlphaInverted=9]="ShaderNames_MultMaskedPremultipliedAlphaInverted",t))(kt||{});const Ut="attribute vec4 a_position;attribute vec2 a_texCoord;varying vec2 v_texCoord;varying vec4 v_myPos;uniform mat4 u_clipMatrix;void main(){ gl_Position = u_clipMatrix * a_position; v_myPos = u_clipMatrix * a_position; v_texCoord = a_texCoord; v_texCoord.y = 1.0 - v_texCoord.y;}",Nt="precision mediump float;varying vec2 v_texCoord;varying vec4 v_myPos;uniform vec4 u_baseColor;uniform vec4 u_channelFlag;uniform sampler2D s_texture0;void main(){ float isInside = step(u_baseColor.x, v_myPos.x/v_myPos.w) * step(u_baseColor.y, v_myPos.y/v_myPos.w) * step(v_myPos.x/v_myPos.w, u_baseColor.z) * step(v_myPos.y/v_myPos.w, u_baseColor.w); gl_FragColor = u_channelFlag * texture2D(s_texture0, v_texCoord).a * isInside;}",Vt="attribute vec4 a_position;attribute vec2 a_texCoord;varying vec2 v_texCoord;uniform mat4 u_matrix;void main(){ gl_Position = u_matrix * a_position; v_texCoord = a_texCoord; v_texCoord.y = 1.0 - v_texCoord.y;}",jt="attribute vec4 a_position;attribute vec2 a_texCoord;varying vec2 v_texCoord;varying vec4 v_clipPos;uniform mat4 u_matrix;uniform mat4 u_clipMatrix;void main(){ gl_Position = u_matrix * a_position; v_clipPos = u_clipMatrix * a_position; v_texCoord = a_texCoord; v_texCoord.y = 1.0 - v_texCoord.y;}",Gt="precision mediump float;varying vec2 v_texCoord;uniform vec4 u_baseColor;uniform sampler2D s_texture0;void main(){ gl_FragColor = texture2D(s_texture0 , v_texCoord) * u_baseColor;}",Xt="precision mediump float;varying vec2 v_texCoord;varying vec4 v_clipPos;uniform vec4 u_baseColor;uniform vec4 u_channelFlag;uniform sampler2D s_texture0;uniform sampler2D s_texture1;void main(){ vec4 col_formask = texture2D(s_texture0 , v_texCoord) * u_baseColor; vec4 clipMask = (1.0 - texture2D(s_texture1, v_clipPos.xy / v_clipPos.w)) * u_channelFlag; float maskVal = clipMask.r + clipMask.g + clipMask.b + clipMask.a; col_formask = col_formask * maskVal; gl_FragColor = col_formask;}",zt="precision mediump float;varying vec2 v_texCoord;varying vec4 v_clipPos;uniform sampler2D s_texture0;uniform sampler2D s_texture1;uniform vec4 u_channelFlag;uniform vec4 u_baseColor;void main(){vec4 col_formask = texture2D(s_texture0, v_texCoord) * u_baseColor;vec4 clipMask = (1.0 - texture2D(s_texture1, v_clipPos.xy / v_clipPos.w)) * u_channelFlag;float maskVal = clipMask.r + clipMask.g + clipMask.b + clipMask.a;col_formask = col_formask * (1.0 - maskVal);gl_FragColor = col_formask;}";class Wt extends _{constructor(){super(),this._clippingContextBufferForMask=null,this._clippingContextBufferForDraw=null,this._clippingManager=new At,this.firstDraw=!0,this._textures={},this._sortedDrawableIndexList=[],this._bufferData={vertex:null,uv:null,index:null}}initialize(t){t.isUsingMasking()&&(this._clippingManager=new At,this._clippingManager.initialize(t,t.getDrawableCount(),t.getDrawableMasks(),t.getDrawableMaskCounts()));for(let e=t.getDrawableCount()-1;e>=0;e--)this._sortedDrawableIndexList[e]=0;super.initialize(t)}bindTexture(t,e){this._textures[t]=e}getBindedTextures(){return this._textures}setClippingMaskBufferSize(t){this._clippingManager.release(),this._clippingManager=new At,this._clippingManager.setClippingMaskBufferSize(t),this._clippingManager.initialize(this.getModel(),this.getModel().getDrawableCount(),this.getModel().getDrawableMasks(),this.getModel().getDrawableMaskCounts())}getClippingMaskBufferSize(){return this._clippingManager.getClippingMaskBufferSize()}release(){var t,e,i;const s=this;this._clippingManager.release(),s._clippingManager=void 0,null==(t=this.gl)||t.deleteBuffer(this._bufferData.vertex),this._bufferData.vertex=null,null==(e=this.gl)||e.deleteBuffer(this._bufferData.uv),this._bufferData.uv=null,null==(i=this.gl)||i.deleteBuffer(this._bufferData.index),this._bufferData.index=null,s._bufferData=void 0,s._textures=void 0}doDrawModel(){this.preDraw(),null!=this._clippingManager&&this._clippingManager.setupClippingContext(this.getModel(),this);const t=this.getModel().getDrawableCount(),e=this.getModel().getDrawableRenderOrders();for(let i=0;i<t;++i){const t=e[i];this._sortedDrawableIndexList[t]=i}for(let i=0;i<t;++i){const t=this._sortedDrawableIndexList[i];this.getModel().getDrawableDynamicFlagIsVisible(t)&&(this.setClippingContextBufferForDraw(null!=this._clippingManager?this._clippingManager.getClippingContextListForDraw()[t]:null),this.setIsCulling(this.getModel().getDrawableCulling(t)),this.drawMesh(this.getModel().getDrawableTextureIndices(t),this.getModel().getDrawableVertexIndexCount(t),this.getModel().getDrawableVertexCount(t),this.getModel().getDrawableVertexIndices(t),this.getModel().getDrawableVertices(t),this.getModel().getDrawableVertexUvs(t),this.getModel().getDrawableOpacity(t),this.getModel().getDrawableBlendMode(t),this.getModel().getDrawableInvertedMaskBit(t)))}}drawMesh(t,e,i,s,r,a,o,n,l){this.isCulling()?this.gl.enable(this.gl.CULL_FACE):this.gl.disable(this.gl.CULL_FACE),this.gl.frontFace(this.gl.CCW);const h=this.getModelColor();null==this.getClippingContextBufferForMask()&&(h.A*=o,this.isPremultipliedAlpha()&&(h.R*=h.A,h.G*=h.A,h.B*=h.A));let u=null;null!=this._textures[t]&&(u=this._textures[t]),Ot.getInstance().setupShaderProgram(this,u,i,r,s,a,this._bufferData,o,n,h,this.isPremultipliedAlpha(),this.getMvpMatrix(),l),this.gl.drawElements(this.gl.TRIANGLES,e,this.gl.UNSIGNED_SHORT,0),this.gl.useProgram(null),this.setClippingContextBufferForDraw(null),this.setClippingContextBufferForMask(null)}static doStaticRelease(){Ot.deleteInstance()}setRenderState(t,e){Ft=t,Dt=e}preDraw(){this.firstDraw&&(this.firstDraw=!1,this._anisortopy=this.gl.getExtension("EXT_texture_filter_anisotropic")||this.gl.getExtension("WEBKIT_EXT_texture_filter_anisotropic")||this.gl.getExtension("MOZ_EXT_texture_filter_anisotropic")),this.gl.disable(this.gl.SCISSOR_TEST),this.gl.disable(this.gl.STENCIL_TEST),this.gl.disable(this.gl.DEPTH_TEST),this.gl.frontFace(this.gl.CW),this.gl.enable(this.gl.BLEND),this.gl.colorMask(!0,!0,!0,!0),this.gl.bindBuffer(this.gl.ARRAY_BUFFER,null),this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER,null)}setClippingContextBufferForMask(t){this._clippingContextBufferForMask=t}getClippingContextBufferForMask(){return this._clippingContextBufferForMask}setClippingContextBufferForDraw(t){this._clippingContextBufferForDraw=t}getClippingContextBufferForDraw(){return this._clippingContextBufferForDraw}startUp(t){this.gl=t,this._clippingManager.setGL(t),Ot.getInstance().setGl(t)}}_.staticRelease=()=>{Wt.doStaticRelease()};class Ht{constructor(t){this.groups=t.Groups,this.hitAreas=t.HitAreas,this.layout=t.Layout,this.moc=t.FileReferences.Moc,this.expressions=t.FileReferences.Expressions,this.motions=t.FileReferences.Motions,this.textures=t.FileReferences.Textures,this.physics=t.FileReferences.Physics,this.pose=t.FileReferences.Pose}getEyeBlinkParameters(){var t,e;return null==(e=null==(t=this.groups)?void 0:t.find((t=>"EyeBlink"===t.Name)))?void 0:e.Ids}getLipSyncParameters(){var t,e;return null==(e=null==(t=this.groups)?void 0:t.find((t=>"LipSync"===t.Name)))?void 0:e.Ids}}const Yt="ParamAngleX",qt="ParamAngleY",$t="ParamAngleZ",Zt="ParamEyeBallX",Jt="ParamEyeBallY",Qt="ParamBodyAngleX",Kt="ParamBreath";var te;t.config=void 0,(te=t.config||(t.config={})).LOG_LEVEL_VERBOSE=0,te.LOG_LEVEL_WARNING=1,te.LOG_LEVEL_ERROR=2,te.LOG_LEVEL_NONE=999,te.logLevel=te.LOG_LEVEL_WARNING,te.sound=!0,te.motionSync=!0,te.motionFadingDuration=500,te.idleMotionFadingDuration=2e3,te.expressionFadingDuration=500,te.preserveExpressionOnMotion=!0,te.cubism4=t.CubismConfig;const ee={log(e,...i){t.config.logLevel<=t.config.LOG_LEVEL_VERBOSE&&console.log(`[${e}]`,...i)},warn(e,...i){t.config.logLevel<=t.config.LOG_LEVEL_WARNING&&console.warn(`[${e}]`,...i)},error(e,...i){t.config.logLevel<=t.config.LOG_LEVEL_ERROR&&console.error(`[${e}]`,...i)}};function ie(t,e,i){return t<e?e:t>i?i:t}function se(t,e){e.forEach((e=>{Object.getOwnPropertyNames(e.prototype).forEach((i=>{"constructor"!==i&&Object.defineProperty(t.prototype,i,Object.getOwnPropertyDescriptor(e.prototype,i))}))}))}function re(t){let e=t.lastIndexOf("/");return-1!=e&&(t=t.slice(0,e)),e=t.lastIndexOf("/"),-1!==e&&(t=t.slice(e+1)),t}function ae(t,e){const i=t.indexOf(e);-1!==i&&t.splice(i,1)}class oe extends e.EventEmitter{constructor(t,e){super(),this.expressions=[],this.reserveExpressionIndex=-1,this.destroyed=!1,this.settings=t,this.tag=`ExpressionManager(${t.name})`}init(){this.defaultExpression=this.createExpression({},void 0),this.currentExpression=this.defaultExpression,this.stopAllExpressions()}loadExpression(t){return __async(this,null,(function*(){if(!this.definitions[t])return void ee.warn(this.tag,`Undefined expression at [${t}]`);if(null===this.expressions[t])return void ee.warn(this.tag,`Cannot set expression at [${t}] because it's already failed in loading.`);if(this.expressions[t])return this.expressions[t];const e=yield this._loadExpression(t);return this.expressions[t]=e,e}))}_loadExpression(t){throw new Error("Not implemented.")}setRandomExpression(){return __async(this,null,(function*(){if(this.definitions.length){const t=[];for(let e=0;e<this.definitions.length;e++)null!==this.expressions[e]&&this.expressions[e]!==this.currentExpression&&e!==this.reserveExpressionIndex&&t.push(e);if(t.length){const e=Math.floor(Math.random()*t.length);return this.setExpression(e)}}return!1}))}resetExpression(){this._setExpression(this.defaultExpression)}restoreExpression(){this._setExpression(this.currentExpression)}setExpression(t){return __async(this,null,(function*(){if("number"!=typeof t&&(t=this.getExpressionIndex(t)),!(t>-1&&t<this.definitions.length))return!1;if(t===this.expressions.indexOf(this.currentExpression))return!1;this.reserveExpressionIndex=t;const e=yield this.loadExpression(t);return!(!e||this.reserveExpressionIndex!==t)&&(this.reserveExpressionIndex=-1,this.currentExpression=e,this._setExpression(e),!0)}))}update(t,e){return!this.isFinished()&&this.updateParameters(t,e)}destroy(){this.destroyed=!0,this.emit("destroy");this.definitions=void 0,this.expressions=void 0}}class ne{constructor(){this.targetX=0,this.targetY=0,this.x=0,this.y=0,this.vx=0,this.vy=0}focus(t,e,i=!1){this.targetX=ie(t,-1,1),this.targetY=ie(e,-1,1),i&&(this.x=this.targetX,this.y=this.targetY)}update(t){const e=this.targetX-this.x,i=this.targetY-this.y;if(Math.abs(e)<.01&&Math.abs(i)<.01)return;const s=Math.sqrt(__pow(e,2)+__pow(i,2)),r=5.333333333333333/(1e3/t);let a=r*(e/s)-this.vx,o=r*(i/s)-this.vy;const n=Math.sqrt(__pow(a,2)+__pow(o,2)),l=.006666666666666667*r*t;n>l&&(a*=l/n,o*=l/n),this.vx+=a,this.vy+=o;const h=Math.sqrt(__pow(this.vx,2)+__pow(this.vy,2)),u=.5*(Math.sqrt(__pow(l,2)+8*l*s)-l);h>u&&(this.vx*=u/h,this.vy*=u/h),this.x+=this.vx,this.y+=this.vy}}class le{constructor(t){this.json=t;let e=t.url;if("string"!=typeof e)throw new TypeError("The `url` field in settings JSON must be defined as a string.");this.url=e,this.name=re(this.url)}resolveURL(t){return e.url.resolve(this.url,t)}replaceFiles(t){this.moc=t(this.moc,"moc"),void 0!==this.pose&&(this.pose=t(this.pose,"pose")),void 0!==this.physics&&(this.physics=t(this.physics,"physics"));for(let e=0;e<this.textures.length;e++)this.textures[e]=t(this.textures[e],`textures[${e}]`)}getDefinedFiles(){const t=[];return this.replaceFiles((e=>(t.push(e),e))),t}validateFiles(t){const e=(e,i)=>{const s=this.resolveURL(e);if(!t.includes(s)){if(i)throw new Error(`File "${e}" is defined in settings, but doesn't exist in given files`);return!1}return!0};[this.moc,...this.textures].forEach((t=>e(t,!0)));return this.getDefinedFiles().filter((t=>e(t,!1)))}}var he=(t=>(t[t.NONE=0]="NONE",t[t.IDLE=1]="IDLE",t[t.NORMAL=2]="NORMAL",t[t.FORCE=3]="FORCE",t))(he||{});class ue{constructor(){this.debug=!1,this.currentPriority=0,this.reservePriority=0}reserve(t,e,i){if(i<=0)return ee.log(this.tag,"Cannot start a motion with MotionPriority.NONE."),!1;if(t===this.currentGroup&&e===this.currentIndex)return ee.log(this.tag,"Motion is already playing.",this.dump(t,e)),!1;if(t===this.reservedGroup&&e===this.reservedIndex||t===this.reservedIdleGroup&&e===this.reservedIdleIndex)return ee.log(this.tag,"Motion is already reserved.",this.dump(t,e)),!1;if(1===i){if(0!==this.currentPriority)return ee.log(this.tag,"Cannot start idle motion because another motion is playing.",this.dump(t,e)),!1;if(void 0!==this.reservedIdleGroup)return ee.log(this.tag,"Cannot start idle motion because another idle motion has reserved.",this.dump(t,e)),!1;this.setReservedIdle(t,e)}else{if(i<3){if(i<=this.currentPriority)return ee.log(this.tag,"Cannot start motion because another motion is playing as an equivalent or higher priority.",this.dump(t,e)),!1;if(i<=this.reservePriority)return ee.log(this.tag,"Cannot start motion because another motion has reserved as an equivalent or higher priority.",this.dump(t,e)),!1}this.setReserved(t,e,i)}return!0}start(t,e,i,s){if(1===s){if(this.setReservedIdle(void 0,void 0),0!==this.currentPriority)return ee.log(this.tag,"Cannot start idle motion because another motion is playing.",this.dump(e,i)),!1}else{if(e!==this.reservedGroup||i!==this.reservedIndex)return ee.log(this.tag,"Cannot start motion because another motion has taken the place.",this.dump(e,i)),!1;this.setReserved(void 0,void 0,0)}return!!t&&(this.setCurrent(e,i,s),!0)}complete(){this.setCurrent(void 0,void 0,0)}setCurrent(t,e,i){this.currentPriority=i,this.currentGroup=t,this.currentIndex=e}setReserved(t,e,i){this.reservePriority=i,this.reservedGroup=t,this.reservedIndex=e}setReservedIdle(t,e){this.reservedIdleGroup=t,this.reservedIdleIndex=e}isActive(t,e){return t===this.currentGroup&&e===this.currentIndex||t===this.reservedGroup&&e===this.reservedIndex||t===this.reservedIdleGroup&&e===this.reservedIdleIndex}reset(){this.setCurrent(void 0,void 0,0),this.setReserved(void 0,void 0,0),this.setReservedIdle(void 0,void 0)}shouldRequestIdleMotion(){return void 0===this.currentGroup&&void 0===this.reservedIdleGroup}shouldOverrideExpression(){return!t.config.preserveExpressionOnMotion&&this.currentPriority>1}dump(t,e){if(this.debug){return`\n<Requested> group = "${t}", index = ${e}\n`+["currentPriority","reservePriority","currentGroup","currentIndex","reservedGroup","reservedIndex","reservedIdleGroup","reservedIdleIndex"].map((t=>"["+t+"] "+this[t])).join("\n")}return""}}class de{static get volume(){return this._volume}static set volume(t){this._volume=(t>1?1:t<0?0:t)||0,this.audios.forEach((t=>t.volume=this._volume))}static add(t,e,i){const s=new Audio(t);return s.volume=this._volume,s.preload="auto",s.addEventListener("ended",(()=>{this.dispose(s),null==e||e()})),s.addEventListener("error",(e=>{this.dispose(s),ee.warn("SoundManager",`Error occurred on "${t}"`,e.error),null==i||i(e.error)})),this.audios.push(s),s}static play(t){return new Promise(((e,i)=>{var s;null==(s=t.play())||s.catch((e=>{t.dispatchEvent(new ErrorEvent("error",{error:e})),i(e)})),t.readyState===t.HAVE_ENOUGH_DATA?e():t.addEventListener("canplaythrough",e)}))}static dispose(t){t.pause(),t.removeAttribute("src"),ae(this.audios,t)}static destroy(){for(let t=this.audios.length-1;t>=0;t--)this.dispose(this.audios[t])}}de.audios=[],de._volume=.5;var ce=(t=>(t.ALL="ALL",t.IDLE="IDLE",t.NONE="NONE",t))(ce||{});class me extends e.EventEmitter{constructor(t,e){super(),this.motionGroups={},this.state=new ue,this.playing=!1,this.destroyed=!1,this.settings=t,this.tag=`MotionManager(${t.name})`,this.state.tag=this.tag}init(t){(null==t?void 0:t.idleMotionGroup)&&(this.groups.idle=t.idleMotionGroup),this.setupMotions(t),this.stopAllMotions()}setupMotions(t){for(const i of Object.keys(this.definitions))this.motionGroups[i]=[];let e;switch(null==t?void 0:t.motionPreload){case"NONE":return;case"ALL":e=Object.keys(this.definitions);break;default:e=[this.groups.idle]}for(const i of e)if(this.definitions[i])for(let t=0;t<this.definitions[i].length;t++)this.loadMotion(i,t).then()}loadMotion(t,e){return __async(this,null,(function*(){var i;if(!(null==(i=this.definitions[t])?void 0:i[e]))return void ee.warn(this.tag,`Undefined motion at "${t}"[${e}]`);if(null===this.motionGroups[t][e])return void ee.warn(this.tag,`Cannot start motion at "${t}"[${e}] because it's already failed in loading.`);if(this.motionGroups[t][e])return this.motionGroups[t][e];const s=yield this._loadMotion(t,e);return this.destroyed?void 0:(this.motionGroups[t][e]=null!=s?s:null,s)}))}_loadMotion(t,e){throw new Error("Not implemented.")}startMotion(e,i){return __async(this,arguments,(function*(e,i,s=he.NORMAL){var r;if(!this.state.reserve(e,i,s))return!1;const a=null==(r=this.definitions[e])?void 0:r[i];if(!a)return!1;let o;if(this.currentAudio&&de.dispose(this.currentAudio),t.config.sound){const t=this.getSoundFile(a);if(t)try{o=de.add(this.settings.resolveURL(t),(()=>this.currentAudio=void 0),(()=>this.currentAudio=void 0)),this.currentAudio=o}catch(l){ee.warn(this.tag,"Failed to create audio",t,l)}}const n=yield this.loadMotion(e,i);if(o){const e=de.play(o).catch((t=>ee.warn(this.tag,"Failed to play audio",o.src,t)));t.config.motionSync&&(yield e)}return this.state.start(n,e,i,s)?(ee.log(this.tag,"Start motion:",this.getMotionName(a)),this.emit("motionStart",e,i,o),this.state.shouldOverrideExpression()&&this.expressionManager&&this.expressionManager.resetExpression(),this.playing=!0,this._startMotion(n),!0):(o&&(de.dispose(o),this.currentAudio=void 0),!1)}))}startRandomMotion(t,e){return __async(this,null,(function*(){const i=this.definitions[t];if(null==i?void 0:i.length){const s=[];for(let e=0;e<i.length;e++)null===this.motionGroups[t][e]||this.state.isActive(t,e)||s.push(e);if(s.length){const i=Math.floor(Math.random()*s.length);return this.startMotion(t,s[i],e)}}return!1}))}stopAllMotions(){this._stopAllMotions(),this.state.reset(),this.currentAudio&&(de.dispose(this.currentAudio),this.currentAudio=void 0)}update(t,e){var i;return this.isFinished()&&(this.playing&&(this.playing=!1,this.emit("motionFinish")),this.state.shouldOverrideExpression()&&(null==(i=this.expressionManager)||i.restoreExpression()),this.state.complete(),this.state.shouldRequestIdleMotion()&&this.startRandomMotion(this.groups.idle,he.IDLE)),this.updateParameters(t,e)}destroy(){var t;this.destroyed=!0,this.emit("destroy"),this.stopAllMotions(),null==(t=this.expressionManager)||t.destroy();this.definitions=void 0,this.motionGroups=void 0}}const ge={x:0,y:0,width:0,height:0};class pe extends e.EventEmitter{constructor(){super(...arguments),this.focusController=new ne,this.originalWidth=0,this.originalHeight=0,this.width=0,this.height=0,this.localTransform=new i.Matrix,this.drawingMatrix=new i.Matrix,this.hitAreas={},this.textureFlipY=!1,this.viewport=[0,0,0,0],this.destroyed=!1}init(){this.setupLayout(),this.setupHitAreas()}setupLayout(){const t=this,e=this.getSize();t.originalWidth=e[0],t.originalHeight=e[1];const i=Object.assign({width:2,height:2},this.getLayout());this.localTransform.scale(i.width/2,i.height/2),t.width=this.originalWidth*this.localTransform.a,t.height=this.originalHeight*this.localTransform.d;const s=void 0!==i.x&&i.x-i.width/2||void 0!==i.centerX&&i.centerX||void 0!==i.left&&i.left-i.width/2||void 0!==i.right&&i.right+i.width/2||0,r=void 0!==i.y&&i.y-i.height/2||void 0!==i.centerY&&i.centerY||void 0!==i.top&&i.top-i.height/2||void 0!==i.bottom&&i.bottom+i.height/2||0;this.localTransform.translate(this.width*s,-this.height*r)}setupHitAreas(){const t=this.getHitAreaDefs().filter((t=>t.index>=0));for(const e of t)this.hitAreas[e.name]=e}hitTest(t,e){return Object.keys(this.hitAreas).filter((i=>this.isHit(i,t,e)))}isHit(t,e,i){if(!this.hitAreas[t])return!1;const s=this.hitAreas[t].index,r=this.getDrawableBounds(s,ge);return r.x<=e&&e<=r.x+r.width&&r.y<=i&&i<=r.y+r.height}getDrawableBounds(t,e){const i=this.getDrawableVertices(t);let s=i[0],r=i[0],a=i[1],o=i[1];for(let n=0;n<i.length;n+=2){const t=i[n],e=i[n+1];s=Math.min(t,s),r=Math.max(t,r),a=Math.min(e,a),o=Math.max(e,o)}return null!=e||(e={}),e.x=s,e.y=a,e.width=r-s,e.height=o-a,e}updateTransform(t){this.drawingMatrix.copyFrom(t).append(this.localTransform)}update(t,e){this.focusController.update(t)}destroy(){this.destroyed=!0,this.emit("destroy"),this.motionManager.destroy(),this.motionManager=void 0}}class _e extends Error{constructor(t,e,i,s=!1){super(t),this.url=e,this.status=i,this.aborted=s}}const fe=class{static createXHR(t,e,i,s,r){const a=new XMLHttpRequest;if(fe.allXhrSet.add(a),t){let e=fe.xhrMap.get(t);e?e.add(a):(e=new Set([a]),fe.xhrMap.set(t,e)),t.listeners("destroy").includes(fe.cancelXHRs)||t.once("destroy",fe.cancelXHRs)}return a.open("GET",e),a.responseType=i,a.onload=()=>{200!==a.status&&0!==a.status||!a.response?a.onerror():s(a.response)},a.onerror=()=>{ee.warn("XHRLoader",`Failed to load resource as ${a.responseType} (Status ${a.status}): ${e}`),r(new _e("Network error.",e,a.status))},a.onabort=()=>r(new _e("Aborted.",e,a.status,!0)),a.onloadend=()=>{var e;fe.allXhrSet.delete(a),t&&(null==(e=fe.xhrMap.get(t))||e.delete(a))},a}static cancelXHRs(){var t;null==(t=fe.xhrMap.get(this))||t.forEach((t=>{t.abort(),fe.allXhrSet.delete(t)})),fe.xhrMap.delete(this)}static release(){fe.allXhrSet.forEach((t=>t.abort())),fe.allXhrSet.clear(),fe.xhrMap=new WeakMap}};let ye=fe;function xe(t,e){let i=-1;return function s(r,a){if(a)return Promise.reject(a);if(r<=i)return Promise.reject(new Error("next() called multiple times"));i=r;const o=t[r];if(!o)return Promise.resolve();try{return Promise.resolve(o(e,s.bind(null,r+1)))}catch(n){return Promise.reject(n)}}(0)}ye.xhrMap=new WeakMap,ye.allXhrSet=new Set,ye.loader=(t,e)=>new Promise(((e,i)=>{fe.createXHR(t.target,t.settings?t.settings.resolveURL(t.url):t.url,t.type,(i=>{t.result=i,e()}),i).send()}));class ve{static load(t){return xe(this.middlewares,t).then((()=>t.result))}}ve.middlewares=[ye.loader];const Me="Live2DFactory",Pe=(t,e)=>__async(this,null,(function*(){if("string"==typeof t.source){const e=yield ve.load({url:t.source,type:"json",target:t.live2dModel});e.url=t.source,t.source=e,t.live2dModel.emit("settingsJSONLoaded",e)}return e()})),Ce=(t,e)=>__async(this,null,(function*(){if(t.source instanceof le)return t.settings=t.source,e();if("object"==typeof t.source){const i=Te.findRuntime(t.source);if(i){const s=i.createModelSettings(t.source);return t.settings=s,t.live2dModel.emit("settingsLoaded",s),e()}}throw new TypeError("Unknown settings format.")})),Se=(t,e)=>{if(t.settings){const i=Te.findRuntime(t.settings);if(i)return i.ready().then(e)}return e()},be=(t,e)=>__async(this,null,(function*(){yield e();const i=t.internalModel;if(i){const e=t.settings,s=Te.findRuntime(e);if(s){const r=[];e.pose&&r.push(ve.load({settings:e,url:e.pose,type:"json",target:i}).then((e=>{i.pose=s.createPose(i.coreModel,e),t.live2dModel.emit("poseLoaded",i.pose)})).catch((e=>{t.live2dModel.emit("poseLoadError",e),ee.warn(Me,"Failed to load pose.",e)}))),e.physics&&r.push(ve.load({settings:e,url:e.physics,type:"json",target:i}).then((e=>{i.physics=s.createPhysics(i.coreModel,e),t.live2dModel.emit("physicsLoaded",i.physics)})).catch((e=>{t.live2dModel.emit("physicsLoadError",e),ee.warn(Me,"Failed to load physics.",e)}))),r.length&&(yield Promise.all(r))}}})),we=(t,e)=>__async(this,null,(function*(){if(!t.settings)throw new TypeError("Missing settings.");{const i=t.live2dModel,r=t.settings.textures.map((e=>function(t,e={}){const i={resourceOptions:{crossorigin:e.crossOrigin}};if(s.Texture.fromURL)return s.Texture.fromURL(t,i).catch((t=>{if(t instanceof Error)throw t;const e=new Error("Texture loading error");throw e.event=t,e}));i.resourceOptions.autoLoad=!1;const r=s.Texture.from(t,i);if(r.baseTexture.valid)return Promise.resolve(r);const a=r.baseTexture.resource;return null!=a._live2d_load||(a._live2d_load=new Promise(((t,e)=>{const i=t=>{a.source.removeEventListener("error",i);const s=new Error("Texture loading error");s.event=t,e(s)};a.source.addEventListener("error",i),a.load().then((()=>t(r))).catch(i)}))),a._live2d_load}(t.settings.resolveURL(e),{crossOrigin:t.options.crossOrigin})));if(yield e(),!t.internalModel)throw new TypeError("Missing internal model.");i.internalModel=t.internalModel,i.emit("modelLoaded",t.internalModel),i.textures=yield Promise.all(r),i.emit("textureLoaded",i.textures)}})),Ie=(t,e)=>__async(this,null,(function*(){const i=t.settings;if(i instanceof le){const s=Te.findRuntime(i);if(!s)throw new TypeError("Unknown model settings.");const r=yield ve.load({settings:i,url:i.moc,type:"arraybuffer",target:t.live2dModel});if(!s.isValidMoc(r))throw new Error("Invalid moc data");const a=s.createCoreModel(r);return t.internalModel=s.createInternalModel(a,i,t.options),e()}throw new TypeError("Missing settings.")})),Le=class{static registerRuntime(t){Le.runtimes.push(t),Le.runtimes.sort(((t,e)=>e.version-t.version))}static findRuntime(t){for(const e of Le.runtimes)if(e.test(t))return e}static setupLive2DModel(t,e,i){return __async(this,null,(function*(){const s=new Promise((e=>t.once("textureLoaded",e))),r=new Promise((e=>t.once("modelLoaded",e))),a=Promise.all([s,r]).then((()=>t.emit("ready")));yield xe(Le.live2DModelMiddlewares,{live2dModel:t,source:e,options:i||{}}),yield a,t.emit("load")}))}static loadMotion(t,e,i){var s;const r=s=>t.emit("motionLoadError",e,i,s);try{const a=null==(s=t.definitions[e])?void 0:s[i];if(!a)return Promise.resolve(void 0);t.listeners("destroy").includes(Le.releaseTasks)||t.once("destroy",Le.releaseTasks);let o=Le.motionTasksMap.get(t);o||(o={},Le.motionTasksMap.set(t,o));let n=o[e];n||(n=[],o[e]=n);const l=t.getMotionFile(a);return null!=n[i]||(n[i]=ve.load({url:l,settings:t.settings,type:t.motionDataType,target:t}).then((s=>{var r;const o=null==(r=Le.motionTasksMap.get(t))?void 0:r[e];o&&delete o[i];const n=t.createMotion(s,e,a);return t.emit("motionLoaded",e,i,n),n})).catch((e=>{ee.warn(t.tag,`Failed to load motion: ${l}\n`,e),r(e)}))),n[i]}catch(a){ee.warn(t.tag,`Failed to load motion at "${e}"[${i}]\n`,a),r(a)}return Promise.resolve(void 0)}static loadExpression(t,e){const i=i=>t.emit("expressionLoadError",e,i);try{const s=t.definitions[e];if(!s)return Promise.resolve(void 0);t.listeners("destroy").includes(Le.releaseTasks)||t.once("destroy",Le.releaseTasks);let r=Le.expressionTasksMap.get(t);r||(r=[],Le.expressionTasksMap.set(t,r));const a=t.getExpressionFile(s);return null!=r[e]||(r[e]=ve.load({url:a,settings:t.settings,type:"json",target:t}).then((i=>{const r=Le.expressionTasksMap.get(t);r&&delete r[e];const a=t.createExpression(i,s);return t.emit("expressionLoaded",e,a),a})).catch((e=>{ee.warn(t.tag,`Failed to load expression: ${a}\n`,e),i(e)}))),r[e]}catch(s){ee.warn(t.tag,`Failed to load expression at [${e}]\n`,s),i(s)}return Promise.resolve(void 0)}static releaseTasks(){this instanceof me?Le.motionTasksMap.delete(this):Le.expressionTasksMap.delete(this)}};let Te=Le;Te.runtimes=[],Te.urlToJSON=Pe,Te.jsonToSettings=Ce,Te.waitUntilReady=Se,Te.setupOptionals=be,Te.setupEssentials=we,Te.createInternalModel=Ie,Te.live2DModelMiddlewares=[Pe,Ce,Se,be,we,Ie],Te.motionTasksMap=new WeakMap,Te.expressionTasksMap=new WeakMap,me.prototype._loadMotion=function(t,e){return Te.loadMotion(this,t,e)},oe.prototype._loadExpression=function(t){return Te.loadExpression(this,t)};class Ee{constructor(){this._autoInteract=!1}get autoInteract(){return this._autoInteract}set autoInteract(t){t!==this._autoInteract&&(t?this.on("pointertap",De,this):this.off("pointertap",De,this),this._autoInteract=t)}registerInteraction(t){t!==this.interactionManager&&(this.unregisterInteraction(),this._autoInteract&&t&&(this.interactionManager=t,t.on("pointermove",Fe,this)))}unregisterInteraction(){var t;this.interactionManager&&(null==(t=this.interactionManager)||t.off("pointermove",Fe,this),this.interactionManager=void 0)}}function De(t){this.tap(t.data.global.x,t.data.global.y)}function Fe(t){this.focus(t.data.global.x,t.data.global.y)}class Ae extends i.Transform{}const Be=new i.Point,Re=new i.Matrix;let Oe;class ke extends r.Container{constructor(t){super(),this.tag="Live2DModel(uninitialized)",this.textures=[],this.transform=new Ae,this.anchor=new i.ObservablePoint(this.onAnchorChange,this,0,0),this.glContextID=-1,this.elapsedTime=performance.now(),this.deltaTime=0,this._autoUpdate=!1,this.once("modelLoaded",(()=>this.init(t)))}static from(t,e){const i=new this(e);return Te.setupLive2DModel(i,t,e).then((()=>i))}static fromSync(t,e){const i=new this(e);return Te.setupLive2DModel(i,t,e).then(null==e?void 0:e.onLoad).catch(null==e?void 0:e.onError),i}static registerTicker(t){Oe=t}get autoUpdate(){return this._autoUpdate}set autoUpdate(t){var e;Oe||(Oe=null==(e=window.PIXI)?void 0:e.Ticker),t?this._destroyed||(Oe?(Oe.shared.add(this.onTickerUpdate,this),this._autoUpdate=!0):ee.warn(this.tag,"No Ticker registered, please call Live2DModel.registerTicker(Ticker).")):(null==Oe||Oe.shared.remove(this.onTickerUpdate,this),this._autoUpdate=!1)}init(t){this.tag=`Live2DModel(${this.internalModel.settings.name})`;const e=Object.assign({autoUpdate:!0,autoInteract:!0},t);e.autoInteract&&(this.interactive=!0),this.autoInteract=e.autoInteract,this.autoUpdate=e.autoUpdate}onAnchorChange(){this.pivot.set(this.anchor.x*this.internalModel.width,this.anchor.y*this.internalModel.height)}motion(t,e,i){return void 0===e?this.internalModel.motionManager.startRandomMotion(t,i):this.internalModel.motionManager.startMotion(t,e,i)}expression(t){return this.internalModel.motionManager.expressionManager?void 0===t?this.internalModel.motionManager.expressionManager.setRandomExpression():this.internalModel.motionManager.expressionManager.setExpression(t):Promise.resolve(!1)}focus(t,e,i=!1){Be.x=t,Be.y=e,this.toModelPosition(Be,Be,!0);let s=Be.x/this.internalModel.originalWidth*2-1,r=Be.y/this.internalModel.originalHeight*2-1,a=Math.atan2(r,s);this.internalModel.focusController.focus(Math.cos(a),-Math.sin(a),i)}tap(t,e){const i=this.hitTest(t,e);i.length&&(ee.log(this.tag,"Hit",i),this.emit("hit",i))}hitTest(t,e){return Be.x=t,Be.y=e,this.toModelPosition(Be,Be),this.internalModel.hitTest(Be.x,Be.y)}toModelPosition(t,e=t.clone(),i){return i||(this._recursivePostUpdateTransform(),this.parent?this.displayObjectUpdateTransform():(this.parent=this._tempDisplayObjectParent,this.displayObjectUpdateTransform(),this.parent=null)),this.transform.worldTransform.applyInverse(t,e),this.internalModel.localTransform.applyInverse(e,e),e}containsPoint(t){return this.getBounds(!0).contains(t.x,t.y)}_calculateBounds(){this._bounds.addFrame(this.transform,0,0,this.internalModel.width,this.internalModel.height)}onTickerUpdate(){this.update(Oe.shared.deltaMS)}update(t){this.deltaTime+=t,this.elapsedTime+=t}_render(t){this.registerInteraction(t.plugins.interaction),t.batch.reset(),t.geometry.reset(),t.shader.reset(),t.state.reset();let e=!1;this.glContextID!==t.CONTEXT_UID&&(this.glContextID=t.CONTEXT_UID,this.internalModel.updateWebGLContext(t.gl,this.glContextID),e=!0);for(let r=0;r<this.textures.length;r++){const i=this.textures[r];i.valid&&(!e&&i.baseTexture._glTextures[this.glContextID]||(t.gl.pixelStorei(WebGLRenderingContext.UNPACK_FLIP_Y_WEBGL,this.internalModel.textureFlipY),t.texture.bind(i.baseTexture,0)),this.internalModel.bindTexture(r,i.baseTexture._glTextures[this.glContextID].texture),i.baseTexture.touched=t.textureGC.count)}const i=t.framebuffer.viewport;this.internalModel.viewport=[i.x,i.y,i.width,i.height],this.deltaTime&&(this.internalModel.update(this.deltaTime,this.elapsedTime),this.deltaTime=0);const s=Re.copyFrom(t.globalUniforms.uniforms.projectionMatrix).append(this.worldTransform);this.internalModel.updateTransform(s),this.internalModel.draw(t.gl),t.state.reset(),t.texture.reset()}destroy(t){this.emit("destroy"),this.autoUpdate=!1,this.unregisterInteraction(),(null==t?void 0:t.texture)&&this.textures.forEach((e=>e.destroy(t.baseTexture))),this.internalModel.destroy(),super.destroy(t)}}se(ke,[Ee]);const Ue=class{static resolveURL(t,e){var i;const s=null==(i=Ue.filesMap[t])?void 0:i[e];if(void 0===s)throw new Error("Cannot find this file from uploaded files: "+e);return s}static upload(t,i){return __async(this,null,(function*(){const s={};for(const r of i.getDefinedFiles()){const a=decodeURI(e.url.resolve(i.url,r)),o=t.find((t=>t.webkitRelativePath===a));o&&(s[r]=URL.createObjectURL(o))}Ue.filesMap[i._objectURL]=s}))}static createSettings(t){return __async(this,null,(function*(){const e=t.find((t=>t.name.endsWith("model.json")||t.name.endsWith("model3.json")));if(!e)throw new TypeError("Settings file not found");const i=yield Ue.readText(e),s=JSON.parse(i);s.url=e.webkitRelativePath;const r=Te.findRuntime(s);if(!r)throw new Error("Unknown settings JSON");const a=r.createModelSettings(s);return a._objectURL=URL.createObjectURL(e),a}))}static readText(t){return __async(this,null,(function*(){return new Promise(((e,i)=>{const s=new FileReader;s.onload=()=>e(s.result),s.onerror=i,s.readAsText(t,"utf8")}))}))}};let Ne=Ue;Ne.filesMap={},Ne.factory=(t,e)=>__async(this,null,(function*(){if(Array.isArray(t.source)&&t.source[0]instanceof File){const e=t.source;let i=e.settings;if(i){if(!i._objectURL)throw new Error('"_objectURL" must be specified in ModelSettings')}else i=yield Ue.createSettings(e);i.validateFiles(e.map((t=>encodeURI(t.webkitRelativePath)))),yield Ue.upload(e,i),i.resolveURL=function(t){return Ue.resolveURL(this._objectURL,t)},t.source=i,t.live2dModel.once("modelLoaded",(t=>{t.once("destroy",(function(){const t=this.settings._objectURL;if(URL.revokeObjectURL(t),Ue.filesMap[t])for(const e of Object.values(Ue.filesMap[t]))URL.revokeObjectURL(e);delete Ue.filesMap[t]}))}))}return e()})),Te.live2DModelMiddlewares.unshift(Ne.factory);const Ve=class{static unzip(t,i){return __async(this,null,(function*(){const s=yield Ve.getFilePaths(t),r=[];for(const t of i.getDefinedFiles()){const a=decodeURI(e.url.resolve(i.url,t));s.includes(a)&&r.push(a)}const a=yield Ve.getFiles(t,r);for(let t=0;t<a.length;t++){const e=r[t],i=a[t];Object.defineProperty(i,"webkitRelativePath",{value:e})}return a}))}static createSettings(t){return __async(this,null,(function*(){const e=(yield Ve.getFilePaths(t)).find((t=>t.endsWith("model.json")||t.endsWith("model3.json")));if(!e)throw new Error("Settings file not found");const i=yield Ve.readText(t,e);if(!i)throw new Error("Empty settings file: "+e);const s=JSON.parse(i);s.url=e;const r=Te.findRuntime(s);if(!r)throw new Error("Unknown settings JSON");return r.createModelSettings(s)}))}static zipReader(t,e){return __async(this,null,(function*(){throw new Error("Not implemented")}))}static getFilePaths(t){return __async(this,null,(function*(){throw new Error("Not implemented")}))}static getFiles(t,e){return __async(this,null,(function*(){throw new Error("Not implemented")}))}static readText(t,e){return __async(this,null,(function*(){throw new Error("Not implemented")}))}static releaseReader(t){}};let je=Ve;if(je.ZIP_PROTOCOL="zip://",je.uid=0,je.factory=(t,e)=>__async(this,null,(function*(){const i=t.source;let s,r,a;if("string"==typeof i&&(i.endsWith(".zip")||i.startsWith(Ve.ZIP_PROTOCOL))?(s=i.startsWith(Ve.ZIP_PROTOCOL)?i.slice(Ve.ZIP_PROTOCOL.length):i,r=yield ve.load({url:s,type:"blob",target:t.live2dModel})):Array.isArray(i)&&1===i.length&&i[0]instanceof File&&i[0].name.endsWith(".zip")&&(r=i[0],s=URL.createObjectURL(r),a=i.settings),r){if(!r.size)throw new Error("Empty zip file");const e=yield Ve.zipReader(r,s);a||(a=yield Ve.createSettings(e)),a._objectURL=Ve.ZIP_PROTOCOL+Ve.uid+"/"+a.url;const i=yield Ve.unzip(e,a);i.settings=a,t.source=i,s.startsWith("blob:")&&t.live2dModel.once("modelLoaded",(t=>{t.once("destroy",(function(){URL.revokeObjectURL(s)}))})),Ve.releaseReader(e)}return e()})),Te.live2DModelMiddlewares.unshift(je.factory),!window.Live2DCubismCore)throw new Error("Could not find Cubism 4 runtime. This plugin requires live2dcubismcore.js to be loaded.");class Ge extends oe{constructor(t,e){var i;super(t,e),this.queueManager=new st,this.definitions=null!=(i=t.expressions)?i:[],this.init()}isFinished(){return this.queueManager.isFinished()}getExpressionIndex(t){return this.definitions.findIndex((e=>e.Name===t))}getExpressionFile(t){return t.File}createExpression(t,e){return O.create(t)}_setExpression(t){return this.queueManager.startMotion(t,!1,performance.now())}stopAllExpressions(){this.queueManager.stopAllMotions()}updateParameters(t,e){return this.queueManager.doUpdateMotion(t,e)}}class Xe extends le{constructor(t){if(super(t),!Xe.isValidJSON(t))throw new TypeError("Invalid JSON.");Object.assign(this,new Ht(t))}static isValidJSON(t){var e;return!!(null==t?void 0:t.FileReferences)&&"string"==typeof t.FileReferences.Moc&&(null==(e=t.FileReferences.Textures)?void 0:e.length)>0&&t.FileReferences.Textures.every((t=>"string"==typeof t))}replaceFiles(t){if(super.replaceFiles(t),this.motions)for(const[e,i]of Object.entries(this.motions))for(let s=0;s<i.length;s++)i[s].File=t(i[s].File,`motions.${e}[${s}].File`),void 0!==i[s].Sound&&(i[s].Sound=t(i[s].Sound,`motions.${e}[${s}].Sound`));if(this.expressions)for(let e=0;e<this.expressions.length;e++)this.expressions[e].File=t(this.expressions[e].File,`expressions[${e}].File`)}}se(Xe,[Ht]);class ze extends me{constructor(t,e){var i;super(t,e),this.groups={idle:"Idle"},this.motionDataType="json",this.queueManager=new st,this.definitions=null!=(i=t.motions)?i:{},this.eyeBlinkIds=t.getEyeBlinkParameters()||[],this.lipSyncIds=t.getLipSyncParameters()||[],this.init(e)}init(t){super.init(t),this.settings.expressions&&(this.expressionManager=new Ge(this.settings,t)),this.queueManager.setEventCallback(((t,e,i)=>{this.emit("motion:"+e)}))}isFinished(){return this.queueManager.isFinished()}_startMotion(t,e){return t.setFinishedMotionHandler(e),this.queueManager.stopAllMotions(),this.queueManager.startMotion(t,!1,performance.now())}_stopAllMotions(){this.queueManager.stopAllMotions()}createMotion(e,i,s){const r=et.create(e),a=new H(e),o=(i===this.groups.idle?t.config.idleMotionFadingDuration:t.config.motionFadingDuration)/1e3;return void 0===a.getMotionFadeInTime()&&r.setFadeInTime(s.FadeInTime>0?s.FadeInTime:o),void 0===a.getMotionFadeOutTime()&&r.setFadeOutTime(s.FadeOutTime>0?s.FadeOutTime:o),r.setEffectIds(this.eyeBlinkIds,this.lipSyncIds),r}getMotionFile(t){return t.File}getMotionName(t){return t.File}getSoundFile(t){return t.Sound}updateParameters(t,e){return this.queueManager.doUpdateMotion(t,e)}destroy(){super.destroy(),this.queueManager.release(),this.queueManager=void 0}}const We=new p;class He extends pe{constructor(t,e,s){super(),this.lipSync=!0,this.breath=a.create(),this.renderer=new Wt,this.idParamAngleX=Yt,this.idParamAngleY=qt,this.idParamAngleZ=$t,this.idParamEyeBallX=Zt,this.idParamEyeBallY=Jt,this.idParamBodyAngleX=Qt,this.idParamBreath=Kt,this.pixelsPerUnit=1,this.centeringTransform=new i.Matrix,this.coreModel=t,this.settings=e,this.motionManager=new ze(e,s),this.init()}init(){var t;super.init(),(null==(t=this.settings.getEyeBlinkParameters())?void 0:t.length)>0&&(this.eyeBlink=l.create(this.settings)),this.breath.setParameters([new o(this.idParamAngleX,0,15,6.5345,.5),new o(this.idParamAngleY,0,8,3.5345,.5),new o(this.idParamAngleZ,0,10,5.5345,.5),new o(this.idParamBodyAngleX,0,4,15.5345,.5),new o(this.idParamBreath,0,.5,3.2345,.5)]),this.renderer.initialize(this.coreModel),this.renderer.setIsPremultipliedAlpha(!0)}getSize(){return[this.coreModel.getModel().canvasinfo.CanvasWidth,this.coreModel.getModel().canvasinfo.CanvasHeight]}getLayout(){const t={};if(this.settings.layout)for(const e of Object.keys(this.settings.layout)){t[e.charAt(0).toLowerCase()+e.slice(1)]=this.settings.layout[e]}return t}setupLayout(){super.setupLayout(),this.pixelsPerUnit=this.coreModel.getModel().canvasinfo.PixelsPerUnit,this.centeringTransform.scale(this.pixelsPerUnit,this.pixelsPerUnit).translate(this.originalWidth/2,this.originalHeight/2)}updateWebGLContext(t,e){this.renderer.firstDraw=!0,this.renderer._bufferData={vertex:null,uv:null,index:null},this.renderer.startUp(t),this.renderer._clippingManager._currentFrameNo=e,this.renderer._clippingManager._maskTexture=void 0,Ot.getInstance()._shaderSets=[]}bindTexture(t,e){this.renderer.bindTexture(t,e)}getHitAreaDefs(){var t,e;return null!=(e=null==(t=this.settings.hitAreas)?void 0:t.map((t=>({id:t.Id,name:t.Name,index:this.coreModel.getDrawableIndex(t.Id)}))))?e:[]}getDrawableIDs(){return this.coreModel.getDrawableIds()}getDrawableIndex(t){return this.coreModel.getDrawableIndex(t)}getDrawableVertices(t){if("string"==typeof t&&-1===(t=this.coreModel.getDrawableIndex(t)))throw new TypeError("Unable to find drawable ID: "+t);const e=this.coreModel.getDrawableVertices(t).slice();for(let i=0;i<e.length;i+=2)e[i]=e[i]*this.pixelsPerUnit+this.originalWidth/2,e[i+1]=-e[i+1]*this.pixelsPerUnit+this.originalHeight/2;return e}updateTransform(t){this.drawingMatrix.copyFrom(this.centeringTransform).prepend(this.localTransform).prepend(t)}update(t,e){var i,s,r,a;super.update(t,e),t/=1e3,e/=1e3;const o=this.coreModel;this.emit("beforeMotionUpdate");const n=this.motionManager.update(this.coreModel,e);this.emit("afterMotionUpdate"),o.saveParameters(),null==(i=this.motionManager.expressionManager)||i.update(o,e),n||null==(s=this.eyeBlink)||s.updateParameters(o,t),this.updateFocus(),this.updateNaturalMovements(1e3*t,1e3*e),null==(r=this.physics)||r.evaluate(o,t),null==(a=this.pose)||a.updateParameters(o,t),this.emit("beforeModelUpdate"),o.update(),o.loadParameters()}updateFocus(){this.coreModel.addParameterValueById(this.idParamEyeBallX,this.focusController.x),this.coreModel.addParameterValueById(this.idParamEyeBallY,this.focusController.y),this.coreModel.addParameterValueById(this.idParamAngleX,30*this.focusController.x),this.coreModel.addParameterValueById(this.idParamAngleY,30*this.focusController.y),this.coreModel.addParameterValueById(this.idParamAngleZ,this.focusController.x*this.focusController.y*-30),this.coreModel.addParameterValueById(this.idParamBodyAngleX,10*this.focusController.x)}updateNaturalMovements(t,e){var i;null==(i=this.breath)||i.updateParameters(this.coreModel,t/1e3)}draw(t){const e=this.drawingMatrix,i=We.getArray();i[0]=e.a,i[1]=e.b,i[4]=-e.c,i[5]=-e.d,i[12]=e.tx,i[13]=e.ty,this.renderer.setMvpMatrix(We),this.renderer.setRenderState(t.getParameter(t.FRAMEBUFFER_BINDING),this.viewport),this.renderer.drawModel()}destroy(){super.destroy(),this.renderer.release(),this.coreModel.release(),this.renderer=void 0,this.coreModel=void 0}}let Ye,qe=20;function $e(){return C.isStarted()?Promise.resolve():(null!=Ye||(Ye=new Promise(((t,e)=>{!function i(){try{Ze(),t()}catch(s){if(qe--,qe<0){const t=new Error("Failed to start up Cubism 4 framework.");return t.cause=s,void e(t)}ee.log("Cubism4","Startup failed, retrying 10ms later..."),setTimeout(i,10)}}()}))),Ye)}function Ze(t){t=Object.assign({logFunction:console.log,loggingLevel:S.LogLevel_Verbose},t),C.startUp(t),C.initialize()}function Je(){var t;null==(t=this.__moc)||t.release()}Te.registerRuntime({version:4,ready:$e,test:t=>t instanceof Xe||Xe.isValidJSON(t),isValidMoc(t){if(t.byteLength<4)return!1;const e=new Int8Array(t,0,4);return"MOC3"===String.fromCharCode(...e)},createModelSettings:t=>new Xe(t),createCoreModel(t){const e=F.create(t);try{const t=e.createModel();return t.__moc=e,t}catch(i){try{e.release()}catch(s){}throw i}},createInternalModel(t,e,i){const s=new He(t,e,i),r=t;return r.__moc&&(s.__moc=r.__moc,delete r.__moc,s.once("destroy",Je)),s},createPhysics:(t,e)=>gt.create(e),createPose:(t,e)=>u.create(e)}),t.ACubismMotion=R,t.BreathParameterData=o,t.CSM_ASSERT=b,t.Constant=P,t.Cubism4ExpressionManager=Ge,t.Cubism4InternalModel=He,t.Cubism4ModelSettings=Xe,t.Cubism4MotionManager=ze,t.CubismBlendMode=f,t.CubismBreath=a,t.CubismClippingContext=Rt,t.CubismClippingManager_WebGL=At,t.CubismDebug=E,t.CubismExpressionMotion=O,t.CubismEyeBlink=l,t.CubismFramework=C,t.CubismLogDebug=w,t.CubismLogError=T,t.CubismLogInfo=I,t.CubismLogVerbose=function(t,...e){E.print(S.LogLevel_Verbose,"[CSM][V]"+t+"\n",e)},t.CubismLogWarning=L,t.CubismMath=g,t.CubismMatrix44=p,t.CubismMoc=F,t.CubismModel=D,t.CubismModelSettingsJson=Ht,t.CubismModelUserData=B,t.CubismModelUserDataJson=A,t.CubismMotion=et,t.CubismMotionCurve=X,t.CubismMotionCurveTarget=N,t.CubismMotionData=W,t.CubismMotionEvent=z,t.CubismMotionJson=H,t.CubismMotionManager=class extends st{constructor(){super(),this._currentPriority=0,this._reservePriority=0}getCurrentPriority(){return this._currentPriority}getReservePriority(){return this._reservePriority}setReservePriority(t){this._reservePriority=t}startMotionPriority(t,e,i){return i==this._reservePriority&&(this._reservePriority=0),this._currentPriority=i,super.startMotion(t,e,this._userTimeSeconds)}updateMotion(t,e){this._userTimeSeconds+=e;const i=super.doUpdateMotion(t,this._userTimeSeconds);return this.isFinished()&&(this._currentPriority=0),i}reserveMotion(t){return!(t<=this._reservePriority||t<=this._currentPriority)&&(this._reservePriority=t,!0)}},t.CubismMotionPoint=j,t.CubismMotionQueueEntry=it,t.CubismMotionQueueManager=st,t.CubismMotionSegment=G,t.CubismMotionSegmentType=V,t.CubismPhysics=gt,t.CubismPhysicsInput=ht,t.CubismPhysicsJson=ct,t.CubismPhysicsOutput=ut,t.CubismPhysicsParticle=nt,t.CubismPhysicsRig=dt,t.CubismPhysicsSource=ot,t.CubismPhysicsSubRig=lt,t.CubismPhysicsTargetType=at,t.CubismPose=u,t.CubismRenderTextureResource=Bt,t.CubismRenderer=_,t.CubismRenderer_WebGL=Wt,t.CubismShader_WebGL=Ot,t.CubismTextureColor=y,t.CubismVector2=c,t.EvaluationOptionFlag=Y,t.ExpressionBlendType=U,t.ExpressionManager=oe,t.EyeState=h,t.FileLoader=Ne,t.FocusController=ne,t.HitAreaBody="Body",t.HitAreaHead="Head",t.HitAreaPrefix="HitArea",t.InteractionMixin=Ee,t.InternalModel=pe,t.InvalidMotionQueueEntryHandleValue=rt,t.LOGICAL_HEIGHT=2,t.LOGICAL_WIDTH=2,t.Live2DFactory=Te,t.Live2DLoader=ve,t.Live2DModel=ke,t.Live2DTransform=Ae,t.LogLevel=S,t.ModelSettings=le,t.MotionManager=me,t.MotionPreloadStrategy=ce,t.MotionPriority=he,t.MotionState=ue,t.Options=pt,t.ParamAngleX=Yt,t.ParamAngleY=qt,t.ParamAngleZ=$t,t.ParamArmLA="ParamArmLA",t.ParamArmLB="ParamArmLB",t.ParamArmRA="ParamArmRA",t.ParamArmRB="ParamArmRB",t.ParamBaseX="ParamBaseX",t.ParamBaseY="ParamBaseY",t.ParamBodyAngleX=Qt,t.ParamBodyAngleY="ParamBodyAngleY",t.ParamBodyAngleZ="ParamBodyAngleZ",t.ParamBreath=Kt,t.ParamBrowLAngle="ParamBrowLAngle",t.ParamBrowLForm="ParamBrowLForm",t.ParamBrowLX="ParamBrowLX",t.ParamBrowLY="ParamBrowLY",t.ParamBrowRAngle="ParamBrowRAngle",t.ParamBrowRForm="ParamBrowRForm",t.ParamBrowRX="ParamBrowRX",t.ParamBrowRY="ParamBrowRY",t.ParamBustX="ParamBustX",t.ParamBustY="ParamBustY",t.ParamCheek="ParamCheek",t.ParamEyeBallForm="ParamEyeBallForm",t.ParamEyeBallX=Zt,t.ParamEyeBallY=Jt,t.ParamEyeLOpen="ParamEyeLOpen",t.ParamEyeLSmile="ParamEyeLSmile",t.ParamEyeROpen="ParamEyeROpen",t.ParamEyeRSmile="ParamEyeRSmile",t.ParamHairBack="ParamHairBack",t.ParamHairFluffy="ParamHairFluffy",t.ParamHairFront="ParamHairFront",t.ParamHairSide="ParamHairSide",t.ParamHandL="ParamHandL",t.ParamHandR="ParamHandR",t.ParamMouthForm="ParamMouthForm",t.ParamMouthOpenY="ParamMouthOpenY",t.ParamNONE="NONE:",t.ParamShoulderY="ParamShoulderY",t.PartData=d,t.PartsArmLPrefix="Parts01ArmL_",t.PartsArmPrefix="Parts01Arm_",t.PartsArmRPrefix="Parts01ArmR_",t.PartsIdCore="Parts01Core",t.PhysicsJsonEffectiveForces=class{constructor(){this.gravity=new c(0,0),this.wind=new c(0,0)}},t.ShaderNames=kt,t.SoundManager=de,t.VERSION="0.4.0",t.XHRLoader=ye,t.ZipLoader=je,t.applyMixins=se,t.clamp=ie,t.copyArray=function(t,e,i,s,r){const a=e[s];Array.isArray(a)&&(i[r]=a.filter((e=>null!==e&&typeof e===t)))},t.copyProperty=function(t,e,i,s,r){const a=e[s];null!==a&&typeof a===t&&(i[r]=a)},t.csmRect=Tt,t.cubism4Ready=$e,t.folderName=re,t.fragmentShaderSrcMaskInvertedPremultipliedAlpha=zt,t.fragmentShaderSrcMaskPremultipliedAlpha=Xt,t.fragmentShaderSrcPremultipliedAlpha=Gt,t.fragmentShaderSrcsetupMask=Nt,t.logger=ee,t.rand=function(t,e){return Math.random()*(e-t)+t},t.remove=ae,t.startUpCubism4=Ze,t.vertexShaderSrc=Vt,t.vertexShaderSrcMasked=jt,t.vertexShaderSrcSetupMask=Ut,Object.defineProperties(t,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})})); |
| New file |
| | |
| | | /** |
| | | * Live2D 管çå¨ |
| | | * è´è´£ Live2D 模åçåå§åãå´é¨å¨ç»æ§å¶çåè½ |
| | | */ |
| | | class Live2DManager { |
| | | constructor() { |
| | | this.live2dApp = null; |
| | | this.live2dModel = null; |
| | | this.isTalking = false; |
| | | this.mouthAnimationId = null; |
| | | this.mouthParam = 'ParamMouthOpenY'; |
| | | this.audioContext = null; |
| | | this.analyser = null; |
| | | this.dataArray = null; |
| | | this.lastEmotionActionTime = null; |
| | | this.currentModelName = null; |
| | | |
| | | // 模åç¹å®é
ç½® |
| | | this.modelConfig = { |
| | | 'hiyori_pro_zh': { |
| | | mouthParam: 'ParamMouthOpenY', |
| | | mouthAmplitude: 1.0, |
| | | mouthThresholds: { low: 0.3, high: 0.7 }, |
| | | motionMap: { |
| | | 'FlickUp': 'FlickUp', |
| | | 'FlickDown': 'FlickDown', |
| | | 'Tap': 'Tap', |
| | | 'Tap@Body': 'Tap@Body', |
| | | 'Flick': 'Flick', |
| | | 'Flick@Body': 'Flick@Body' |
| | | } |
| | | }, |
| | | 'natori_pro_zh': { |
| | | mouthParam: 'ParamMouthOpenY', |
| | | mouthAmplitude: 1.0, |
| | | mouthThresholds: { low: 0.1, high: 0.4 }, |
| | | mouthFormParam: 'ParamMouthForm', |
| | | mouthFormAmplitude: 1.0, |
| | | mouthForm2Param: 'ParamMouthForm2', |
| | | mouthForm2Amplitude: 0.8, |
| | | motionMap: { |
| | | 'FlickUp': 'FlickUp', |
| | | 'FlickDown': 'Flick@Body', |
| | | 'Tap': 'Tap', |
| | | 'Tap@Body': 'Tap@Head', |
| | | 'Flick': 'Tap', |
| | | 'Flick@Body': 'Flick@Body' |
| | | } |
| | | } |
| | | }; |
| | | |
| | | // æ
绪å°å¨ä½çæ å° |
| | | this.emotionToActionMap = { |
| | | 'happy': 'FlickUp', // å¼å¿-åä¸è½»æ«å¨ä½ |
| | | 'laughing': 'FlickUp', // 大ç¬-åä¸è½»æ«å¨ä½ |
| | | 'funny': 'FlickUp', // æç¬-åä¸è½»æ«å¨ä½ |
| | | 'sad': 'FlickDown', // 伤å¿-åä¸è½»æ«å¨ä½ |
| | | 'crying': 'FlickDown', // åæ³£-åä¸è½»æ«å¨ä½ |
| | | 'angry': 'Tap@Body', // çæ°-身ä½ç¹å»å¨ä½ |
| | | 'surprised': 'Tap', // æè®¶-ç¹å»å¨ä½ |
| | | 'neutral': 'Flick', // 平常-è½»æ«å¨ä½ |
| | | 'default': 'Flick@Body' // é»è®¤-身ä½è½»æ«å¨ä½ |
| | | }; |
| | | |
| | | // å/åå»å¤å®é
ç½®ä¸ç¶æ |
| | | this._lastClickTime = 0; |
| | | this._lastClickPos = { x: 0, y: 0 }; |
| | | this._singleClickTimer = null; |
| | | this._doubleClickMs = 280; // å廿¶é´éå¼(ms) |
| | | this._doubleClickDist = 16; // åå»å
许çæå¤§ä½ç§»(px) |
| | | // æ»å¨å¤å® |
| | | this._pointerDown = false; |
| | | this._downPos = { x: 0, y: 0 }; |
| | | this._downTime = 0; |
| | | this._downArea = 'Body'; |
| | | this._movedBeyondClick = false; |
| | | this._swipeMinDist = 24; // è§¦åæ»å¨çæå°è·ç¦» |
| | | } |
| | | |
| | | /** |
| | | * åå§å Live2D |
| | | */ |
| | | async initializeLive2D() { |
| | | try { |
| | | const canvas = document.getElementById('live2d-stage'); |
| | | |
| | | // ä¾å
é¨ä½¿ç¨ |
| | | window.PIXI = PIXI; |
| | | |
| | | this.live2dApp = new PIXI.Application({ |
| | | view: canvas, |
| | | height: window.innerHeight, |
| | | width: window.innerWidth, |
| | | resolution: window.devicePixelRatio, |
| | | autoDensity: true, |
| | | antialias: true, |
| | | backgroundAlpha: 0, |
| | | }); |
| | | |
| | | // å è½½ Live2D 模å - å¨ææ£æµå½åç®å½ï¼éé
ä¸åç¯å¢ |
| | | // è·åå½åHTMLæä»¶æå¨çç®å½è·¯å¾ |
| | | const currentPath = window.location.pathname; |
| | | const lastSlashIndex = currentPath.lastIndexOf('/'); |
| | | const basePath = currentPath.substring(0, lastSlashIndex + 1); |
| | | |
| | | // ä» localStorage 读å䏿¬¡éæ©ç模åï¼å¦ææ²¡æå使ç¨é»è®¤ |
| | | const savedModelName = localStorage.getItem('live2dModel') || 'hiyori_pro_zh'; |
| | | const modelFileMap = { |
| | | 'hiyori_pro_zh': 'hiyori_pro_t11.model3.json', |
| | | 'natori_pro_zh': 'natori_pro_t06.model3.json' |
| | | }; |
| | | const modelFileName = modelFileMap[savedModelName] || 'hiyori_pro_t11.model3.json'; |
| | | const modelPath = basePath + 'resources/' + savedModelName + '/runtime/' + modelFileName; |
| | | |
| | | this.live2dModel = await PIXI.live2d.Live2DModel.from(modelPath); |
| | | this.live2dApp.stage.addChild(this.live2dModel); |
| | | |
| | | // ä¿åå½å模ååç§° |
| | | this.currentModelName = savedModelName; |
| | | |
| | | // æ´æ°ä¸ææ¡æ¾ç¤º |
| | | const modelSelect = document.getElementById('live2dModelSelect'); |
| | | if (modelSelect) { |
| | | modelSelect.value = savedModelName; |
| | | } |
| | | |
| | | // 设置模åç¹å®çå´é¨åæ°å |
| | | if (this.modelConfig[savedModelName]) { |
| | | this.mouthParam = this.modelConfig[savedModelName].mouthParam || 'ParamMouthOpenY'; |
| | | } |
| | | |
| | | // 设置模å屿§ |
| | | this.live2dModel.scale.set(0.33); |
| | | this.live2dModel.x = (window.innerWidth - this.live2dModel.width) * 0.5; |
| | | this.live2dModel.y = -50; |
| | | |
| | | // å¯ç¨äº¤äºå¹¶çå¬ç¹å»å½ä¸ï¼å¤´é¨/身ä½çï¼ |
| | | |
| | | this.live2dModel.interactive = true; |
| | | |
| | | |
| | | this.live2dModel.on('doublehit', (args) => { |
| | | const area = Array.isArray(args) ? args[0] : args; |
| | | |
| | | // 触ååå»å¨ä½ |
| | | if (area === 'Body') { |
| | | this.motion('Flick@Body'); |
| | | } else if (area === 'Head' || area === 'Face') { |
| | | this.motion('Flick'); |
| | | } |
| | | |
| | | const app = window.chatApp; |
| | | const payload = JSON.stringify({ type: 'live2d', event: 'doublehit', area }); |
| | | if (app && app.dataChannel && app.dataChannel.readyState === 'open') { |
| | | app.dataChannel.send(payload); |
| | | } |
| | | |
| | | }); |
| | | |
| | | this.live2dModel.on('singlehit', (args) => { |
| | | const area = Array.isArray(args) ? args[0] : args; |
| | | |
| | | // 触ååå»å¨ä½ |
| | | if (area === 'Body') { |
| | | this.motion('Tap@Body'); |
| | | } else if (area === 'Head' || area === 'Face') { |
| | | this.motion('Tap'); |
| | | } |
| | | |
| | | const app = window.chatApp; |
| | | const payload = JSON.stringify({ type: 'live2d', event: 'singlehit', area }); |
| | | if (app && app.dataChannel && app.dataChannel.readyState === 'open') { |
| | | app.dataChannel.send(payload); |
| | | } |
| | | |
| | | }); |
| | | |
| | | this.live2dModel.on('swipe', (args) => { |
| | | const area = Array.isArray(args) ? args[0] : args; |
| | | const dir = Array.isArray(args) ? args[1] : undefined; |
| | | |
| | | // è§¦åæ»å¨å¨ä½ |
| | | if (area === 'Body') { |
| | | if (dir === 'up') { |
| | | this.motion('FlickUp'); |
| | | } else if (dir === 'down') { |
| | | this.motion('FlickDown'); |
| | | } |
| | | } else if (area === 'Head' || area === 'Face') { |
| | | if (dir === 'up') { |
| | | this.motion('FlickUp'); |
| | | } else if (dir === 'down') { |
| | | this.motion('FlickDown'); |
| | | } |
| | | } |
| | | |
| | | const app = window.chatApp; |
| | | const payload = JSON.stringify({ type: 'live2d', event: 'swipe', area, dir }); |
| | | if (app && app.dataChannel && app.dataChannel.readyState === 'open') { |
| | | app.dataChannel.send(payload); |
| | | } |
| | | |
| | | }); |
| | | |
| | | // å
åºï¼èªå®ä¹"头é¨/身ä½"å½ä¸åºå + å/åå»/æ»å¨åºå |
| | | this.live2dModel.on('pointerdown', (event) => { |
| | | try { |
| | | const global = event.data.global; |
| | | const bounds = this.live2dModel.getBounds(); |
| | | // ä»
å¨ç¹å»è½å¨æ¨¡åå¯è§èå´å
æ¶å¤å® |
| | | if (!bounds || !bounds.contains(global.x, global.y)) return; |
| | | |
| | | const relX = (global.x - bounds.x) / (bounds.width || 1); |
| | | const relY = (global.y - bounds.y) / (bounds.height || 1); |
| | | let area = ''; |
| | | // ç»éªéå¼ï¼æ¨¡åå¯è§ç©å½¢çä¸é¨ 20% è§ä¸º"头é¨"åºå |
| | | if (relX >= 0.4 && relX <= 0.6) { |
| | | if (relY <= 0.15) { |
| | | area = 'Head'; |
| | | } else if (relY <= 0.23) { |
| | | area = 'Face'; |
| | | } else { |
| | | area = 'Body'; |
| | | } |
| | | } |
| | | if (area === '') { |
| | | return; |
| | | } |
| | | |
| | | // è®°å½æä¸ç¶æç¨äºæ»å¨å¤å® |
| | | this._pointerDown = true; |
| | | this._downPos = { x: global.x, y: global.y }; |
| | | this._downTime = performance.now(); |
| | | this._downArea = area; |
| | | this._movedBeyondClick = false; |
| | | |
| | | const now = performance.now(); |
| | | const dt = now - (this._lastClickTime || 0); |
| | | const dx = global.x - (this._lastClickPos?.x || 0); |
| | | const dy = global.y - (this._lastClickPos?.y || 0); |
| | | const dist = Math.hypot(dx, dy); |
| | | |
| | | // å½ä¸ç¡®è®¤ï¼ä»
å½ç¹å»å¨æ¨¡å䏿¶åå/åå»å¤æ |
| | | if (this._lastClickTime && dt <= this._doubleClickMs && dist <= this._doubleClickDist) { |
| | | // å¤å®ä¸ºåå»ï¼åæ¶å¾
触åçåå»äºä»¶ |
| | | if (this._singleClickTimer) { |
| | | clearTimeout(this._singleClickTimer); |
| | | this._singleClickTimer = null; |
| | | } |
| | | if (typeof this.live2dModel.emit === 'function') { |
| | | this.live2dModel.emit('doublehit', [area]); |
| | | } |
| | | this._lastClickTime = 0; |
| | | this._pointerDown = false; // åå»å®æï¼éç½®ç¶æ |
| | | return; |
| | | } |
| | | |
| | | // å¯è½æ¯åå»ï¼è®°å½å¹¶å»¶è¿ç¡®è®¤ |
| | | this._lastClickTime = now; |
| | | this._lastClickPos = { x: global.x, y: global.y }; |
| | | if (this._singleClickTimer) { |
| | | clearTimeout(this._singleClickTimer); |
| | | this._singleClickTimer = null; |
| | | } |
| | | this._singleClickTimer = setTimeout(() => { |
| | | // è¥å¨çå¾
æé´åçäºç§»å¨è¶
è¿éå¼ï¼åä¸åå½ä½åå» |
| | | if (!this._movedBeyondClick && typeof this.live2dModel.emit === 'function') { |
| | | this.live2dModel.emit('singlehit', [area]); |
| | | } |
| | | this._singleClickTimer = null; |
| | | this._lastClickTime = 0; |
| | | }, this._doubleClickMs); |
| | | } catch (e) { |
| | | // 忽ç¥èªå®ä¹å½ä¸å¤æä¸çå¼å¸¸ï¼é¿å
å½±å主æµç¨ |
| | | } |
| | | }); |
| | | |
| | | // æéç§»å¨ï¼ç¨äºå¤å®æ¯å¦ä»"ç¹å»"å级为"æ»å¨" |
| | | this.live2dModel.on('pointermove', (event) => { |
| | | try { |
| | | if (!this._pointerDown) return; |
| | | const global = event.data.global; |
| | | const dx = global.x - this._downPos.x; |
| | | const dy = global.y - this._downPos.y; |
| | | const dist = Math.hypot(dx, dy); |
| | | |
| | | // ä½¿ç¨ _doubleClickDist ä½ä¸ºç¹å»/æ»å¨çå¤å®éå¼ |
| | | if (dist > this._doubleClickDist) { |
| | | this._movedBeyondClick = true; |
| | | // è¥å·²è¶
åºç¹å»éå¼ï¼åæ¶å¯è½çåå»è§¦å |
| | | if (this._singleClickTimer) { |
| | | clearTimeout(this._singleClickTimer); |
| | | this._singleClickTimer = null; |
| | | } |
| | | this._lastClickTime = 0; |
| | | } |
| | | } catch (e) { |
| | | // 忽ç¥ç§»å¨å¤å®ä¸çå¼å¸¸ |
| | | } |
| | | }); |
| | | |
| | | // æéæ¬èµ·ï¼ç¡®è®¤æ¯å¦ä¸ºæ»å¨ |
| | | const handlePointerUp = (event) => { |
| | | try { |
| | | if (!this._pointerDown) return; |
| | | const global = (event && event.data && event.data.global) ? event.data.global : { x: this._downPos.x, y: this._downPos.y }; |
| | | const dx = global.x - this._downPos.x; |
| | | const dy = global.y - this._downPos.y; |
| | | const dist = Math.hypot(dx, dy); |
| | | |
| | | // æ»å¨ï¼è¶
è¿æ»å¨æå°è·ç¦»å触å swipe äºä»¶ï¼æºå¸¦æ¹åä¸åºåï¼ |
| | | if (this._movedBeyondClick && dist >= this._swipeMinDist) { |
| | | if (typeof this.live2dModel.emit === 'function') { |
| | | const dir = Math.abs(dx) >= Math.abs(dy) |
| | | ? (dx > 0 ? 'right' : 'left') |
| | | : (dy > 0 ? 'down' : 'up'); |
| | | this.live2dModel.emit('swipe', [this._downArea, dir]); |
| | | } |
| | | // ç»æ¢ï¼ä¸å让åå»/åå»è§¦å |
| | | if (this._singleClickTimer) { |
| | | clearTimeout(this._singleClickTimer); |
| | | this._singleClickTimer = null; |
| | | } |
| | | this._lastClickTime = 0; |
| | | } |
| | | } catch (e) { |
| | | // å¿½ç¥æ¬èµ·å¤å®ä¸çå¼å¸¸ |
| | | } |
| | | finally { |
| | | this._pointerDown = false; |
| | | this._movedBeyondClick = false; |
| | | } |
| | | }; |
| | | |
| | | this.live2dModel.on('pointerup', handlePointerUp); |
| | | this.live2dModel.on('pointerupoutside', handlePointerUp); |
| | | |
| | | // æ·»å çªå£å¤§å°ååçå¬å¨ï¼ä¿ææ¨¡åå¨Canvasä¸é´ååºé¨ |
| | | window.addEventListener('resize', () => { |
| | | if (this.live2dModel) { |
| | | // 使ç¨çªå£å®é
å°ºå¯¸éæ°è®¡ç®æ¨¡åä½ç½® |
| | | this.live2dModel.x = (window.innerWidth - this.live2dModel.width) * 0.5; |
| | | this.live2dModel.y = -50; |
| | | } |
| | | }); |
| | | |
| | | } catch (err) { |
| | | console.error('å è½½ Live2D 模å失败:', err); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * åå§åé³é¢åæå¨ - 使ç¨é³é¢ææ¾å¨çåæå¨èç¹ |
| | | */ |
| | | initializeAudioAnalyzer() { |
| | | try { |
| | | // è·åé³é¢ææ¾å¨å®ä¾ |
| | | const audioPlayer = window.chatApp?.audioPlayer; |
| | | if (!audioPlayer) { |
| | | console.warn('é³é¢ææ¾å¨æªåå§åï¼æ æ³è·ååæå¨èç¹'); |
| | | return false; |
| | | } |
| | | |
| | | // è·åé³é¢ææ¾å¨çé³é¢ä¸ä¸æ |
| | | this.audioContext = audioPlayer.getAudioContext(); |
| | | if (!this.audioContext) { |
| | | console.warn('æ æ³è·åé³é¢ææ¾å¨çé³é¢ä¸ä¸æ'); |
| | | return false; |
| | | } |
| | | |
| | | // å建åæå¨èç¹ |
| | | this.analyser = this.audioContext.createAnalyser(); |
| | | this.analyser.fftSize = 256; |
| | | this.dataArray = new Uint8Array(this.analyser.frequencyBinCount); |
| | | |
| | | return true; |
| | | } catch (error) { |
| | | console.error('åå§åé³é¢åæå¨å¤±è´¥:', error); |
| | | return false; |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * è¿æ¥å°é³é¢ææ¾å¨çè¾åºèç¹ |
| | | */ |
| | | connectToAudioPlayer() { |
| | | try { |
| | | // è·åé³é¢ææ¾å¨çæµä¸ä¸æ |
| | | const audioPlayer = window.chatApp?.audioPlayer; |
| | | if (!audioPlayer || !audioPlayer.streamingContext) { |
| | | console.warn('é³é¢ææ¾å¨ææµä¸ä¸ææªåå§å'); |
| | | return false; |
| | | } |
| | | |
| | | // è·åé³é¢ææ¾å¨çæµä¸ä¸æ |
| | | const streamingContext = audioPlayer.streamingContext; |
| | | |
| | | // è·ååæå¨èç¹ |
| | | const analyser = streamingContext.getAnalyser(); |
| | | if (!analyser) { |
| | | console.warn('é³é¢ææ¾å¨å°æªå建åæå¨èç¹ï¼æ æ³è¿æ¥'); |
| | | return false; |
| | | } |
| | | |
| | | // 使ç¨é³é¢ææ¾å¨çåæå¨èç¹ |
| | | this.analyser = analyser; |
| | | this.dataArray = new Uint8Array(this.analyser.frequencyBinCount); |
| | | return true; |
| | | } catch (error) { |
| | | console.error('è¿æ¥å°é³é¢ææ¾å¨å¤±è´¥:', error); |
| | | return false; |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * å´é¨å¨ç»å¾ªç¯ |
| | | */ |
| | | animateMouth() { |
| | | if (!this.isTalking) return; |
| | | if (!this.live2dModel) return; |
| | | const internal = this.live2dModel && this.live2dModel.internalModel; |
| | | if (internal && internal.coreModel) { |
| | | const coreModel = internal.coreModel; |
| | | |
| | | let mouthOpenY = 0; |
| | | let mouthForm = 0; |
| | | let mouthForm2 = 0; |
| | | let average = 0; |
| | | |
| | | if (this.analyser && this.dataArray) { |
| | | this.analyser.getByteFrequencyData(this.dataArray); |
| | | average = this.dataArray.reduce((a, b) => a + b) / this.dataArray.length; |
| | | |
| | | const normalizedVolume = average / 255; |
| | | |
| | | // è·å模åç¹å®çéå¼ |
| | | let lowThreshold = 0.3; |
| | | let highThreshold = 0.7; |
| | | if (this.currentModelName && this.modelConfig[this.currentModelName]) { |
| | | lowThreshold = this.modelConfig[this.currentModelName].mouthThresholds?.low || 0.3; |
| | | highThreshold = this.modelConfig[this.currentModelName].mouthThresholds?.high || 0.7; |
| | | } |
| | | |
| | | // ä½¿ç¨æ¨¡åç¹å®çéå¼è¿è¡æ å° |
| | | let minOpenY = 0.1; |
| | | if (this.currentModelName && this.modelConfig[this.currentModelName]) { |
| | | minOpenY = this.modelConfig[this.currentModelName].mouthMinOpenY || 0.1; |
| | | } |
| | | |
| | | if (normalizedVolume < lowThreshold) { |
| | | mouthOpenY = minOpenY + Math.pow(normalizedVolume / lowThreshold, 1.5) * (0.4 - minOpenY); |
| | | } else if (normalizedVolume < highThreshold) { |
| | | mouthOpenY = 0.4 + (normalizedVolume - lowThreshold) / (highThreshold - lowThreshold) * 0.4; |
| | | } else { |
| | | mouthOpenY = 0.8 + Math.pow((normalizedVolume - highThreshold) / (1 - highThreshold), 1.2) * 0.2; |
| | | } |
| | | |
| | | // åºç¨æ¨¡åç¹å®çå´é¨å¼åå¹
度 |
| | | let amplitudeMultiplier = 1.0; |
| | | let maxOpenY = 2.5; |
| | | if (this.currentModelName && this.modelConfig[this.currentModelName]) { |
| | | amplitudeMultiplier = this.modelConfig[this.currentModelName].mouthAmplitude; |
| | | maxOpenY = this.modelConfig[this.currentModelName].maxOpenY || 2.5; |
| | | } |
| | | mouthOpenY = mouthOpenY * amplitudeMultiplier; |
| | | mouthOpenY = Math.min(Math.max(mouthOpenY, 0), maxOpenY); |
| | | |
| | | // 计ç®å´ååæ°ï¼ä»
å¯¹æ¯æå´åååçæ¨¡åï¼ |
| | | if (this.currentModelName && this.modelConfig[this.currentModelName]?.mouthFormParam) { |
| | | const config = this.modelConfig[this.currentModelName]; |
| | | const formAmplitude = config.mouthFormAmplitude || 0.5; |
| | | const form2Amplitude = config.mouthForm2Amplitude || 0; |
| | | |
| | | // å´åéé³éååï¼ |
| | | // ä½é³éï¼å´åå"ä¸"åï¼è´å¼ï¼ |
| | | // é«é³éï¼å´åå"o"åï¼æ£å¼ï¼ |
| | | // é³é=0æ¶ï¼å´å=0ï¼èªç¶ç¶æï¼ |
| | | mouthForm = (normalizedVolume - 0.5) * 2 * formAmplitude; |
| | | mouthForm = Math.max(-formAmplitude, Math.min(formAmplitude, mouthForm)); |
| | | |
| | | // 第äºå´ååæ°ï¼natoriç¹æï¼ |
| | | if (config.mouthForm2Param) { |
| | | mouthForm2 = (normalizedVolume - 0.3) * 2 * form2Amplitude; |
| | | mouthForm2 = Math.max(-form2Amplitude, Math.min(form2Amplitude, mouthForm2)); |
| | | } |
| | | } |
| | | |
| | | // è°è¯æ¥å¿ï¼è¾åºå´é¨åæ° |
| | | console.log(`[Live2D] 模å: ${this.currentModelName || 'unknown'}, é³é: ${average?.toFixed(0)}, OpenY: ${mouthOpenY.toFixed(3)}, Form: ${mouthForm.toFixed(3)}, Form2: ${mouthForm2.toFixed(3)}`); |
| | | } |
| | | |
| | | // 设置å´é¨å¼ååæ° |
| | | coreModel.setParameterValueById(this.mouthParam, mouthOpenY); |
| | | |
| | | // 设置å´ååæ°ï¼ä»
å¯¹æ¯æå´åååçæ¨¡åï¼ |
| | | if (this.currentModelName && this.modelConfig[this.currentModelName]?.mouthFormParam) { |
| | | const config = this.modelConfig[this.currentModelName]; |
| | | const formParam = config.mouthFormParam; |
| | | coreModel.setParameterValueById(formParam, mouthForm); |
| | | |
| | | // 设置第äºå´ååæ°ï¼natoriç¹æï¼ |
| | | if (config.mouthForm2Param) { |
| | | coreModel.setParameterValueById(config.mouthForm2Param, mouthForm2); |
| | | } |
| | | } |
| | | |
| | | coreModel.update(); |
| | | } |
| | | this.mouthAnimationId = requestAnimationFrame(() => this.animateMouth()); |
| | | } |
| | | |
| | | /** |
| | | * å¼å§è¯´è¯å¨ç» |
| | | */ |
| | | startTalking() { |
| | | if (this.isTalking || !this.live2dModel) return; |
| | | |
| | | // ç¡®ä¿é³é¢åæå¨å·²åå§å |
| | | if (!this.analyser) { |
| | | if (!this.initializeAudioAnalyzer()) { |
| | | console.warn('é³é¢åæå¨åå§å失败ï¼å°ä½¿ç¨æ¨¡æå¨ç»'); |
| | | // å³ä½¿åæå¨åå§å失败ï¼ä¹å¯å¨å¨ç»ï¼ä½¿ç¨æ¨¡ææ°æ®ï¼ |
| | | this.isTalking = true; |
| | | this.animateMouth(); |
| | | return; |
| | | } |
| | | } |
| | | |
| | | // è¿æ¥å°é³é¢ææ¾å¨è¾åº |
| | | if (!this.connectToAudioPlayer()) { |
| | | console.warn('æ æ³è¿æ¥å°é³é¢ææ¾å¨è¾åºï¼å°ä½¿ç¨æ¨¡æå¨ç»'); |
| | | } |
| | | |
| | | this.isTalking = true; |
| | | this.animateMouth(); |
| | | } |
| | | |
| | | /** |
| | | * åæ¢è¯´è¯å¨ç» |
| | | */ |
| | | stopTalking() { |
| | | this.isTalking = false; |
| | | if (this.mouthAnimationId) { |
| | | cancelAnimationFrame(this.mouthAnimationId); |
| | | this.mouthAnimationId = null; |
| | | } |
| | | |
| | | // éç½®å´é¨åæ° |
| | | if (this.live2dModel) { |
| | | const internal = this.live2dModel.internalModel; |
| | | if (internal && internal.coreModel) { |
| | | const coreModel = internal.coreModel; |
| | | coreModel.setParameterValueById(this.mouthParam, 0); |
| | | coreModel.update(); |
| | | } |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * åºäºæ
绪触åå¨ä½ |
| | | * @param {string} emotion - æ
绪åç§° |
| | | */ |
| | | triggerEmotionAction(emotion) { |
| | | if (!this.live2dModel) return; |
| | | |
| | | // æ·»å å·å´æ¶é´æ§å¶ï¼é¿å
è¿äºé¢ç¹è§¦å |
| | | const now = Date.now(); |
| | | if (this.lastEmotionActionTime && now - this.lastEmotionActionTime < 5000) { // 5ç§å·å´æ¶é´ |
| | | return; |
| | | } |
| | | |
| | | // æ ¹æ®æ
绪è·å对åºçå¨ä½ |
| | | const action = this.emotionToActionMap[emotion] || this.emotionToActionMap['default']; |
| | | |
| | | // 触åå¨ä½å¹¶è®°å½æ¶é´ |
| | | this.motion(action); |
| | | this.lastEmotionActionTime = now; |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * è§¦åæ¨¡åå¨ä½ï¼Motionï¼ |
| | | * @param {string} name - å¨ä½åç»åç§°ï¼å¦ 'TapBody'ã'FlickUp'ã'Idle' ç |
| | | */ |
| | | motion(name) { |
| | | try { |
| | | if (!this.live2dModel) return; |
| | | |
| | | // æ ¹æ®å½å模åè·å对åºçå¨ä½åç§° |
| | | let actualMotionName = name; |
| | | if (this.currentModelName && this.modelConfig[this.currentModelName]) { |
| | | const motionMap = this.modelConfig[this.currentModelName].motionMap; |
| | | actualMotionName = motionMap[name] || name; |
| | | } |
| | | |
| | | this.live2dModel.motion(actualMotionName); |
| | | } catch (error) { |
| | | console.error('触åå¨ä½å¤±è´¥:', error); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 设置模å交äºäºä»¶ |
| | | */ |
| | | setupModelInteractions() { |
| | | if (!this.live2dModel) return; |
| | | |
| | | this.live2dModel.interactive = true; |
| | | |
| | | this.live2dModel.on('doublehit', (args) => { |
| | | const area = Array.isArray(args) ? args[0] : args; |
| | | |
| | | if (area === 'Body') { |
| | | this.motion('Flick@Body'); |
| | | } else if (area === 'Head' || area === 'Face') { |
| | | this.motion('Flick'); |
| | | } |
| | | |
| | | const app = window.chatApp; |
| | | const payload = JSON.stringify({ type: 'live2d', event: 'doublehit', area }); |
| | | if (app && app.dataChannel && app.dataChannel.readyState === 'open') { |
| | | app.dataChannel.send(payload); |
| | | } |
| | | }); |
| | | |
| | | this.live2dModel.on('singlehit', (args) => { |
| | | const area = Array.isArray(args) ? args[0] : args; |
| | | |
| | | if (area === 'Body') { |
| | | this.motion('Tap@Body'); |
| | | } else if (area === 'Head' || area === 'Face') { |
| | | this.motion('Tap'); |
| | | } |
| | | |
| | | const app = window.chatApp; |
| | | const payload = JSON.stringify({ type: 'live2d', event: 'singlehit', area }); |
| | | if (app && app.dataChannel && app.dataChannel.readyState === 'open') { |
| | | app.dataChannel.send(payload); |
| | | } |
| | | }); |
| | | |
| | | this.live2dModel.on('swipe', (args) => { |
| | | const area = Array.isArray(args) ? args[0] : args; |
| | | const dir = Array.isArray(args) ? args[1] : undefined; |
| | | |
| | | if (area === 'Body') { |
| | | if (dir === 'up') { |
| | | this.motion('FlickUp'); |
| | | } else if (dir === 'down') { |
| | | this.motion('FlickDown'); |
| | | } |
| | | } |
| | | |
| | | const app = window.chatApp; |
| | | const payload = JSON.stringify({ type: 'live2d', event: 'swipe', area, dir }); |
| | | if (app && app.dataChannel && app.dataChannel.readyState === 'open') { |
| | | app.dataChannel.send(payload); |
| | | } |
| | | }); |
| | | |
| | | this.live2dModel.on('pointerdown', (event) => { |
| | | try { |
| | | const global = event.data.global; |
| | | const bounds = this.live2dModel.getBounds(); |
| | | if (!bounds || !bounds.contains(global.x, global.y)) return; |
| | | |
| | | const relX = (global.x - bounds.x) / (bounds.width || 1); |
| | | const relY = (global.y - bounds.y) / (bounds.height || 1); |
| | | let area = ''; |
| | | |
| | | if (relX >= 0.4 && relX <= 0.6) { |
| | | if (relY <= 0.15) { |
| | | area = 'Head'; |
| | | } else if (relY >= 0.7) { |
| | | area = 'Body'; |
| | | } |
| | | } |
| | | |
| | | if (!area) return; |
| | | |
| | | const now = Date.now(); |
| | | const dt = now - (this._lastClickTime || 0); |
| | | const dx = global.x - (this._lastClickPos?.x || 0); |
| | | const dy = global.y - (this._lastClickPos?.y || 0); |
| | | const dist = Math.hypot(dx, dy); |
| | | |
| | | if (this._lastClickTime && dt <= this._doubleClickMs && dist <= this._doubleClickDist) { |
| | | if (this._singleClickTimer) { |
| | | clearTimeout(this._singleClickTimer); |
| | | this._singleClickTimer = null; |
| | | } |
| | | |
| | | this.live2dModel.emit('doublehit', area); |
| | | this._lastClickTime = null; |
| | | this._lastClickPos = null; |
| | | } else { |
| | | this._lastClickTime = now; |
| | | this._lastClickPos = { x: global.x, y: global.y }; |
| | | |
| | | this._singleClickTimer = setTimeout(() => { |
| | | this._singleClickTimer = null; |
| | | this.live2dModel.emit('singlehit', area); |
| | | }, this._doubleClickMs); |
| | | } |
| | | } catch (e) { |
| | | console.warn('pointerdown å¤çåºé:', e); |
| | | } |
| | | }); |
| | | } |
| | | |
| | | /** |
| | | * æ¸
çèµæº |
| | | */ |
| | | destroy() { |
| | | this.stopTalking(); |
| | | |
| | | // æ¸
çé³é¢åæå¨ |
| | | if (this.audioContext) { |
| | | this.audioContext.close(); |
| | | this.audioContext = null; |
| | | } |
| | | this.analyser = null; |
| | | this.dataArray = null; |
| | | |
| | | // æ¸
ç Live2D åºç¨ |
| | | if (this.live2dApp) { |
| | | this.live2dApp.destroy(true); |
| | | this.live2dApp = null; |
| | | } |
| | | this.live2dModel = null; |
| | | } |
| | | |
| | | /** |
| | | * 忢 Live2D 模å |
| | | * @param {string} modelName - 模åç®å½åç§°ï¼å¦ 'hiyori_pro_zh'ã'natori_pro_zh' |
| | | * @returns {Promise<boolean>} - 忢æ¯å¦æå |
| | | */ |
| | | async switchModel(modelName) { |
| | | try { |
| | | // è·å模åæä»¶åæ å° |
| | | const modelFileMap = { |
| | | 'hiyori_pro_zh': 'hiyori_pro_t11.model3.json', |
| | | 'natori_pro_zh': 'natori_pro_t06.model3.json', |
| | | 'chitose': 'chitose.model3.json', |
| | | 'haru_greeter_pro_jp': 'haru_greeter_t05.model3.json' |
| | | }; |
| | | |
| | | const modelFileName = modelFileMap[modelName]; |
| | | if (!modelFileName) { |
| | | console.error('æªç¥ç模ååç§°:', modelName); |
| | | return false; |
| | | } |
| | | |
| | | // è·ååºç¡è·¯å¾ |
| | | const currentPath = window.location.pathname; |
| | | const lastSlashIndex = currentPath.lastIndexOf('/'); |
| | | const basePath = currentPath.substring(0, lastSlashIndex + 1); |
| | | const modelPath = basePath + 'resources/' + modelName + '/runtime/' + modelFileName; |
| | | |
| | | // 妿已å卿¨¡åï¼å
ç§»é¤ |
| | | if (this.live2dModel) { |
| | | this.live2dApp.stage.removeChild(this.live2dModel); |
| | | this.live2dModel.destroy(); |
| | | this.live2dModel = null; |
| | | } |
| | | |
| | | // æ¾ç¤ºå è½½ç¶æ |
| | | const app = window.chatApp; |
| | | if (app) { |
| | | app.setModelLoadingStatus(true); |
| | | } |
| | | |
| | | // å è½½æ°æ¨¡å |
| | | this.live2dModel = await PIXI.live2d.Live2DModel.from(modelPath); |
| | | this.live2dApp.stage.addChild(this.live2dModel); |
| | | |
| | | // 设置模å屿§ |
| | | this.live2dModel.scale.set(0.33); |
| | | this.live2dModel.x = (window.innerWidth - this.live2dModel.width) * 0.5; |
| | | this.live2dModel.y = -50; |
| | | |
| | | // éæ°ç»å®äº¤äºäºä»¶ |
| | | this.setupModelInteractions(); |
| | | |
| | | // éèå è½½ç¶æ |
| | | if (app) { |
| | | app.setModelLoadingStatus(false); |
| | | } |
| | | |
| | | // ä¿åå½å模ååç§° |
| | | this.currentModelName = modelName; |
| | | |
| | | // 设置模åç¹å®çå´é¨åæ°å |
| | | if (this.modelConfig[modelName]) { |
| | | this.mouthParam = this.modelConfig[modelName].mouthParam || 'ParamMouthOpenY'; |
| | | } |
| | | |
| | | // ä¿åå° localStorage |
| | | localStorage.setItem('live2dModel', modelName); |
| | | |
| | | // æ´æ°ä¸ææ¡æ¾ç¤º |
| | | const modelSelect = document.getElementById('live2dModelSelect'); |
| | | if (modelSelect) { |
| | | modelSelect.value = modelName; |
| | | } |
| | | |
| | | console.log('模å忢æå:', modelName); |
| | | return true; |
| | | } catch (error) { |
| | | console.error('åæ¢æ¨¡å失败:', error); |
| | | const app = window.chatApp; |
| | | if (app) { |
| | | app.setModelLoadingStatus(false); |
| | | } |
| | | return false; |
| | | } |
| | | } |
| | | |
| | | |
| | | } |
| | | |
| | | // 导åºå
¨å±å®ä¾ |
| | | window.Live2DManager = Live2DManager; |
| New file |
| | |
| | | /** |
| | | * Live2D Cubism Core |
| | | * (C) 2019 Live2D Inc. All rights reserved. |
| | | * |
| | | * This file is licensed pursuant to the license agreement below. |
| | | * This file corresponds to the "Redistributable Code" in the agreement. |
| | | * https://www.live2d.com/eula/live2d-proprietary-software-license-agreement_en.html |
| | | */ |
| | | var Live2DCubismCore;!function(Live2DCubismCore){var _scriptDir,_csm=function(){function _csm(){}return _csm.getVersion=function(){return _em.ccall("csmGetVersion","number",[],[])},_csm.getLatestMocVersion=function(){return _em.ccall("csmGetLatestMocVersion","number",[],[])},_csm.getMocVersion=function(moc,mocSize){return _em.ccall("csmGetMocVersion","number",["number","number"],[moc,mocSize])},_csm.getLogFunction=function(){return _em.ccall("csmGetLogFunction","number",[],[])},_csm.getSizeofModel=function(moc){return _em.ccall("csmGetSizeofModel","number",["number"],[moc])},_csm.reviveMocInPlace=function(memory,mocSize){return _em.ccall("csmReviveMocInPlace","number",["number","number"],[memory,mocSize])},_csm.initializeModelInPlace=function(moc,memory,modelSize){return _em.ccall("csmInitializeModelInPlace","number",["number","number","number"],[moc,memory,modelSize])},_csm.hasMocConsistency=function(memory,mocSize){return _em.ccall("csmHasMocConsistency","number",["number","number"],[memory,mocSize])},_csm.getParameterCount=function(model){return _em.ccall("csmGetParameterCount","number",["number"],[model])},_csm.getParameterIds=function(model){return _em.ccall("csmGetParameterIds","number",["number"],[model])},_csm.getParameterMinimumValues=function(model){return _em.ccall("csmGetParameterMinimumValues","number",["number"],[model])},_csm.getParameterTypes=function(model){return _em.ccall("csmGetParameterTypes","number",["number"],[model])},_csm.getParameterMaximumValues=function(model){return _em.ccall("csmGetParameterMaximumValues","number",["number"],[model])},_csm.getParameterDefaultValues=function(model){return _em.ccall("csmGetParameterDefaultValues","number",["number"],[model])},_csm.getParameterValues=function(model){return _em.ccall("csmGetParameterValues","number",["number"],[model])},_csm.getParameterRepeats=function(model){return _em.ccall("csmGetParameterRepeats","number",["number"],[model])},_csm.getParameterKeyCounts=function(model){return _em.ccall("csmGetParameterKeyCounts","number",["number"],[model])},_csm.getParameterKeyValues=function(model){return _em.ccall("csmGetParameterKeyValues","number",["number"],[model])},_csm.getPartCount=function(model){return _em.ccall("csmGetPartCount","number",["number"],[model])},_csm.getPartIds=function(model){return _em.ccall("csmGetPartIds","number",["number"],[model])},_csm.getPartOpacities=function(model){return _em.ccall("csmGetPartOpacities","number",["number"],[model])},_csm.getPartParentPartIndices=function(model){return _em.ccall("csmGetPartParentPartIndices","number",["number"],[model])},_csm.getDrawableCount=function(model){return _em.ccall("csmGetDrawableCount","number",["number"],[model])},_csm.getDrawableIds=function(model){return _em.ccall("csmGetDrawableIds","number",["number"],[model])},_csm.getDrawableConstantFlags=function(model){return _em.ccall("csmGetDrawableConstantFlags","number",["number"],[model])},_csm.getDrawableDynamicFlags=function(model){return _em.ccall("csmGetDrawableDynamicFlags","number",["number"],[model])},_csm.getDrawableTextureIndices=function(model){return _em.ccall("csmGetDrawableTextureIndices","number",["number"],[model])},_csm.getDrawableDrawOrders=function(model){return _em.ccall("csmGetDrawableDrawOrders","number",["number"],[model])},_csm.getDrawableRenderOrders=function(model){return _em.ccall("csmGetDrawableRenderOrders","number",["number"],[model])},_csm.getDrawableOpacities=function(model){return _em.ccall("csmGetDrawableOpacities","number",["number"],[model])},_csm.getDrawableMaskCounts=function(model){return _em.ccall("csmGetDrawableMaskCounts","number",["number"],[model])},_csm.getDrawableMasks=function(model){return _em.ccall("csmGetDrawableMasks","number",["number"],[model])},_csm.getDrawableVertexCounts=function(model){return _em.ccall("csmGetDrawableVertexCounts","number",["number"],[model])},_csm.getDrawableVertexPositions=function(model){return _em.ccall("csmGetDrawableVertexPositions","number",["number"],[model])},_csm.getDrawableVertexUvs=function(model){return _em.ccall("csmGetDrawableVertexUvs","number",["number"],[model])},_csm.getDrawableIndexCounts=function(model){return _em.ccall("csmGetDrawableIndexCounts","number",["number"],[model])},_csm.getDrawableIndices=function(model){return _em.ccall("csmGetDrawableIndices","number",["number"],[model])},_csm.getDrawableMultiplyColors=function(model){return _em.ccall("csmGetDrawableMultiplyColors","number",["number"],[model])},_csm.getDrawableScreenColors=function(model){return _em.ccall("csmGetDrawableScreenColors","number",["number"],[model])},_csm.getDrawableParentPartIndices=function(model){return _em.ccall("csmGetDrawableParentPartIndices","number",["number"],[model])},_csm.mallocMoc=function(mocSize){return _em.ccall("csmMallocMoc","number",["number"],[mocSize])},_csm.mallocModelAndInitialize=function(moc){return _em.ccall("csmMallocModelAndInitialize","number",["number"],[moc])},_csm.malloc=function(size){return _em.ccall("csmMalloc","number",["number"],[size])},_csm.setLogFunction=function(handler){_em.ccall("csmSetLogFunction",null,["number"],[handler])},_csm.updateModel=function(model){_em.ccall("csmUpdateModel",null,["number"],[model])},_csm.readCanvasInfo=function(model,outSizeInPixels,outOriginInPixels,outPixelsPerUnit){_em.ccall("csmReadCanvasInfo",null,["number","number","number","number"],[model,outSizeInPixels,outOriginInPixels,outPixelsPerUnit])},_csm.resetDrawableDynamicFlags=function(model){_em.ccall("csmResetDrawableDynamicFlags",null,["number"],[model])},_csm.free=function(memory){_em.ccall("csmFree",null,["number"],[memory])},_csm.initializeAmountOfMemory=function(size){_em.ccall("csmInitializeAmountOfMemory",null,["number"],[size])},_csm}(),Version=(Live2DCubismCore.AlignofMoc=64,Live2DCubismCore.AlignofModel=16,Live2DCubismCore.MocVersion_Unknown=0,Live2DCubismCore.MocVersion_30=1,Live2DCubismCore.MocVersion_33=2,Live2DCubismCore.MocVersion_40=3,Live2DCubismCore.MocVersion_42=4,Live2DCubismCore.MocVersion_50=5,Live2DCubismCore.ParameterType_Normal=0,Live2DCubismCore.ParameterType_BlendShape=1,function(){function Version(){}return Version.csmGetVersion=function(){return _csm.getVersion()},Version.csmGetLatestMocVersion=function(){return _csm.getLatestMocVersion()},Version.csmGetMocVersion=function(moc,mocBytes){return _csm.getMocVersion(moc._ptr,mocBytes.byteLength)},Version}()),Version=(Live2DCubismCore.Version=Version,function(){function Logging(){}return Logging.csmSetLogFunction=function(handler){Logging.logFunction=handler;handler=_em.addFunction(Logging.wrapLogFunction,"vi");_csm.setLogFunction(handler)},Logging.csmGetLogFunction=function(){return Logging.logFunction},Logging.wrapLogFunction=function(messagePtr){messagePtr=_em.UTF8ToString(messagePtr);Logging.logFunction(messagePtr)},Logging}()),Version=(Live2DCubismCore.Logging=Version,function(){function Moc(mocBytes){var memory=_csm.mallocMoc(mocBytes.byteLength);memory&&(new Uint8Array(_em.HEAPU8.buffer,memory,mocBytes.byteLength).set(new Uint8Array(mocBytes)),this._ptr=_csm.reviveMocInPlace(memory,mocBytes.byteLength),this._ptr||_csm.free(memory))}return Moc.prototype.hasMocConsistency=function(mocBytes){var memory=_csm.mallocMoc(mocBytes.byteLength);if(memory)return new Uint8Array(_em.HEAPU8.buffer,memory,mocBytes.byteLength).set(new Uint8Array(mocBytes)),mocBytes=_csm.hasMocConsistency(memory,mocBytes.byteLength),_csm.free(memory),mocBytes},Moc.fromArrayBuffer=function(buffer){return buffer&&(buffer=new Moc(buffer))._ptr?buffer:null},Moc.prototype._release=function(){_csm.free(this._ptr),this._ptr=0},Moc}()),Version=(Live2DCubismCore.Moc=Version,function(){function Model(moc){this._ptr=_csm.mallocModelAndInitialize(moc._ptr),this._ptr&&(this.parameters=new Parameters(this._ptr),this.parts=new Parts(this._ptr),this.drawables=new Drawables(this._ptr),this.canvasinfo=new CanvasInfo(this._ptr))}return Model.fromMoc=function(moc){moc=new Model(moc);return moc._ptr?moc:null},Model.prototype.update=function(){_csm.updateModel(this._ptr)},Model.prototype.release=function(){_csm.free(this._ptr),this._ptr=0},Model}()),CanvasInfo=(Live2DCubismCore.Model=Version,function(modelPtr){var _canvasSize_data,_canvasSize_dataPtr,_canvasSize_nDataBytes,_canvasOrigin_dataPtr,_canvasOrigin_nDataBytes,_canvasPPU_nDataBytes,_canvasPPU_dataPtr;modelPtr&&(_canvasSize_nDataBytes=(_canvasSize_data=new Float32Array(2)).length*_canvasSize_data.BYTES_PER_ELEMENT,_canvasSize_dataPtr=_csm.malloc(_canvasSize_nDataBytes),(_canvasSize_dataPtr=new Uint8Array(_em.HEAPU8.buffer,_canvasSize_dataPtr,_canvasSize_nDataBytes)).set(new Uint8Array(_canvasSize_data.buffer)),_canvasOrigin_nDataBytes=(_canvasSize_nDataBytes=new Float32Array(2)).length*_canvasSize_nDataBytes.BYTES_PER_ELEMENT,_canvasOrigin_dataPtr=_csm.malloc(_canvasOrigin_nDataBytes),(_canvasOrigin_dataPtr=new Uint8Array(_em.HEAPU8.buffer,_canvasOrigin_dataPtr,_canvasOrigin_nDataBytes)).set(new Uint8Array(_canvasSize_nDataBytes.buffer)),_canvasPPU_nDataBytes=(_canvasOrigin_nDataBytes=new Float32Array(1)).length*_canvasOrigin_nDataBytes.BYTES_PER_ELEMENT,_canvasPPU_dataPtr=_csm.malloc(_canvasPPU_nDataBytes),(_canvasPPU_dataPtr=new Uint8Array(_em.HEAPU8.buffer,_canvasPPU_dataPtr,_canvasPPU_nDataBytes)).set(new Uint8Array(_canvasOrigin_nDataBytes.buffer)),_csm.readCanvasInfo(modelPtr,_canvasSize_dataPtr.byteOffset,_canvasOrigin_dataPtr.byteOffset,_canvasPPU_dataPtr.byteOffset),_canvasSize_data=new Float32Array(_canvasSize_dataPtr.buffer,_canvasSize_dataPtr.byteOffset,_canvasSize_dataPtr.length),_canvasSize_nDataBytes=new Float32Array(_canvasOrigin_dataPtr.buffer,_canvasOrigin_dataPtr.byteOffset,_canvasOrigin_dataPtr.length),_canvasOrigin_nDataBytes=new Float32Array(_canvasPPU_dataPtr.buffer,_canvasPPU_dataPtr.byteOffset,_canvasPPU_dataPtr.length),this.CanvasWidth=_canvasSize_data[0],this.CanvasHeight=_canvasSize_data[1],this.CanvasOriginX=_canvasSize_nDataBytes[0],this.CanvasOriginY=_canvasSize_nDataBytes[1],this.PixelsPerUnit=_canvasOrigin_nDataBytes[0],_csm.free(_canvasSize_dataPtr.byteOffset),_csm.free(_canvasOrigin_dataPtr.byteOffset),_csm.free(_canvasPPU_dataPtr.byteOffset))}),Parameters=(Live2DCubismCore.CanvasInfo=CanvasInfo,function(modelPtr){this.count=_csm.getParameterCount(modelPtr),length=_csm.getParameterCount(modelPtr),this.ids=new Array(length);for(var length,length2,_ids=new Uint32Array(_em.HEAPU32.buffer,_csm.getParameterIds(modelPtr),length),i=0;i<_ids.length;i++)this.ids[i]=_em.UTF8ToString(_ids[i]);length=_csm.getParameterCount(modelPtr),this.minimumValues=new Float32Array(_em.HEAPF32.buffer,_csm.getParameterMinimumValues(modelPtr),length),length=_csm.getParameterCount(modelPtr),this.types=new Int32Array(_em.HEAP32.buffer,_csm.getParameterTypes(modelPtr),length),length=_csm.getParameterCount(modelPtr),this.maximumValues=new Float32Array(_em.HEAPF32.buffer,_csm.getParameterMaximumValues(modelPtr),length),length=_csm.getParameterCount(modelPtr),this.defaultValues=new Float32Array(_em.HEAPF32.buffer,_csm.getParameterDefaultValues(modelPtr),length),length=_csm.getParameterCount(modelPtr),this.values=new Float32Array(_em.HEAPF32.buffer,_csm.getParameterValues(modelPtr),length),length=_csm.getParameterCount(modelPtr),this.repeats=new Int32Array(_em.HEAP32.buffer,_csm.getParameterRepeats(modelPtr),length),length=_csm.getParameterCount(modelPtr),this.keyCounts=new Int32Array(_em.HEAP32.buffer,_csm.getParameterKeyCounts(modelPtr),length),length=_csm.getParameterCount(modelPtr),length2=new Int32Array(_em.HEAP32.buffer,_csm.getParameterKeyCounts(modelPtr),length),this.keyValues=new Array(length);for(var _keyValues=new Uint32Array(_em.HEAPU32.buffer,_csm.getParameterKeyValues(modelPtr),length),i=0;i<_keyValues.length;i++)this.keyValues[i]=new Float32Array(_em.HEAPF32.buffer,_keyValues[i],length2[i])}),Parts=(Live2DCubismCore.Parameters=Parameters,function(modelPtr){this.count=_csm.getPartCount(modelPtr),length=_csm.getPartCount(modelPtr),this.ids=new Array(length);for(var length,_ids=new Uint32Array(_em.HEAPU32.buffer,_csm.getPartIds(modelPtr),length),i=0;i<_ids.length;i++)this.ids[i]=_em.UTF8ToString(_ids[i]);length=_csm.getPartCount(modelPtr),this.opacities=new Float32Array(_em.HEAPF32.buffer,_csm.getPartOpacities(modelPtr),length),length=_csm.getPartCount(modelPtr),this.parentIndices=new Int32Array(_em.HEAP32.buffer,_csm.getPartParentPartIndices(modelPtr),length)}),Drawables=(Live2DCubismCore.Parts=Parts,function(){function Drawables(modelPtr){this._modelPtr=modelPtr;for(var length,length2=null,_ids=(this.count=_csm.getDrawableCount(modelPtr),length=_csm.getDrawableCount(modelPtr),this.ids=new Array(length),new Uint32Array(_em.HEAPU32.buffer,_csm.getDrawableIds(modelPtr),length)),i=0;i<_ids.length;i++)this.ids[i]=_em.UTF8ToString(_ids[i]);length=_csm.getDrawableCount(modelPtr),this.constantFlags=new Uint8Array(_em.HEAPU8.buffer,_csm.getDrawableConstantFlags(modelPtr),length),length=_csm.getDrawableCount(modelPtr),this.dynamicFlags=new Uint8Array(_em.HEAPU8.buffer,_csm.getDrawableDynamicFlags(modelPtr),length),length=_csm.getDrawableCount(modelPtr),this.textureIndices=new Int32Array(_em.HEAP32.buffer,_csm.getDrawableTextureIndices(modelPtr),length),length=_csm.getDrawableCount(modelPtr),this.drawOrders=new Int32Array(_em.HEAP32.buffer,_csm.getDrawableDrawOrders(modelPtr),length),length=_csm.getDrawableCount(modelPtr),this.renderOrders=new Int32Array(_em.HEAP32.buffer,_csm.getDrawableRenderOrders(modelPtr),length),length=_csm.getDrawableCount(modelPtr),this.opacities=new Float32Array(_em.HEAPF32.buffer,_csm.getDrawableOpacities(modelPtr),length),length=_csm.getDrawableCount(modelPtr),this.maskCounts=new Int32Array(_em.HEAP32.buffer,_csm.getDrawableMaskCounts(modelPtr),length),length=_csm.getDrawableCount(modelPtr),this.vertexCounts=new Int32Array(_em.HEAP32.buffer,_csm.getDrawableVertexCounts(modelPtr),length),length=_csm.getDrawableCount(modelPtr),this.indexCounts=new Int32Array(_em.HEAP32.buffer,_csm.getDrawableIndexCounts(modelPtr),length),length=_csm.getDrawableCount(modelPtr),this.multiplyColors=new Float32Array(_em.HEAPF32.buffer,_csm.getDrawableMultiplyColors(modelPtr),4*length),length=_csm.getDrawableCount(modelPtr),this.screenColors=new Float32Array(_em.HEAPF32.buffer,_csm.getDrawableScreenColors(modelPtr),4*length),length=_csm.getDrawableCount(modelPtr),this.parentPartIndices=new Int32Array(_em.HEAP32.buffer,_csm.getDrawableParentPartIndices(modelPtr),length),length=_csm.getDrawableCount(modelPtr),length2=new Int32Array(_em.HEAP32.buffer,_csm.getDrawableMaskCounts(modelPtr),length),this.masks=new Array(length);for(var _masks=new Uint32Array(_em.HEAPU32.buffer,_csm.getDrawableMasks(modelPtr),length),i=0;i<_masks.length;i++)this.masks[i]=new Int32Array(_em.HEAP32.buffer,_masks[i],length2[i]);length=_csm.getDrawableCount(modelPtr),length2=new Int32Array(_em.HEAP32.buffer,_csm.getDrawableVertexCounts(modelPtr),length),this.vertexPositions=new Array(length);for(var _vertexPositions=new Uint32Array(_em.HEAPU32.buffer,_csm.getDrawableVertexPositions(modelPtr),length),i=0;i<_vertexPositions.length;i++)this.vertexPositions[i]=new Float32Array(_em.HEAPF32.buffer,_vertexPositions[i],2*length2[i]);length=_csm.getDrawableCount(modelPtr),length2=new Int32Array(_em.HEAP32.buffer,_csm.getDrawableVertexCounts(modelPtr),length),this.vertexUvs=new Array(length);for(var _vertexUvs=new Uint32Array(_em.HEAPU32.buffer,_csm.getDrawableVertexUvs(modelPtr),length),i=0;i<_vertexUvs.length;i++)this.vertexUvs[i]=new Float32Array(_em.HEAPF32.buffer,_vertexUvs[i],2*length2[i]);length=_csm.getDrawableCount(modelPtr),length2=new Int32Array(_em.HEAP32.buffer,_csm.getDrawableIndexCounts(modelPtr),length),this.indices=new Array(length);for(var _indices=new Uint32Array(_em.HEAPU32.buffer,_csm.getDrawableIndices(modelPtr),length),i=0;i<_indices.length;i++)this.indices[i]=new Uint16Array(_em.HEAPU16.buffer,_indices[i],length2[i])}return Drawables.prototype.resetDynamicFlags=function(){_csm.resetDrawableDynamicFlags(this._modelPtr)},Drawables}()),Version=(Live2DCubismCore.Drawables=Drawables,function(){function Utils(){}return Utils.hasBlendAdditiveBit=function(bitfield){return 1==(1&bitfield)},Utils.hasBlendMultiplicativeBit=function(bitfield){return 2==(2&bitfield)},Utils.hasIsDoubleSidedBit=function(bitfield){return 4==(4&bitfield)},Utils.hasIsInvertedMaskBit=function(bitfield){return 8==(8&bitfield)},Utils.hasIsVisibleBit=function(bitfield){return 1==(1&bitfield)},Utils.hasVisibilityDidChangeBit=function(bitfield){return 2==(2&bitfield)},Utils.hasOpacityDidChangeBit=function(bitfield){return 4==(4&bitfield)},Utils.hasDrawOrderDidChangeBit=function(bitfield){return 8==(8&bitfield)},Utils.hasRenderOrderDidChangeBit=function(bitfield){return 16==(16&bitfield)},Utils.hasVertexPositionsDidChangeBit=function(bitfield){return 32==(32&bitfield)},Utils.hasBlendColorDidChangeBit=function(bitfield){return 64==(64&bitfield)},Utils}()),Version=(Live2DCubismCore.Utils=Version,function(){function Memory(){}return Memory.initializeAmountOfMemory=function(size){16777216<size&&_csm.initializeAmountOfMemory(size)},Memory}()),_em_module=(Live2DCubismCore.Memory=Version,_scriptDir="undefined"!=typeof document&&document.currentScript?document.currentScript.src:void 0,function(_em_module){_em_module=_em_module||{};var b,n,l={};for(n in b=b||(void 0!==_em_module?_em_module:{}))b.hasOwnProperty(n)&&(l[n]=b[n]);var x,y,v,w,r=!1,p="object"==typeof window,q="function"==typeof importScripts,r="object"==typeof process&&"object"==typeof process.versions&&"string"==typeof process.versions.node&&!p&&!q,t=!p&&!r&&!q,u="",D=(r?(u=__dirname+"/",v=function(a,c){var d=z(a);return d||(x=x||require("fs"),a=(y=y||require("path")).normalize(a),d=x.readFileSync(a)),c?d:d.toString()},w=function(a){return assert((a=(a=v(a,!0)).buffer?a:new Uint8Array(a)).buffer),a},1<process.argv.length&&process.argv[1].replace(/\\/g,"/"),process.argv.slice(2),process.on("uncaughtException",function(a){throw a}),process.on("unhandledRejection",B),b.inspect=function(){return"[Emscripten Module object]"}):t?("undefined"!=typeof read&&(v=function(a){var c=z(a);return c?C(c):read(a)}),w=function(a){var c;if(!(c=z(a))){if("function"==typeof readbuffer)return new Uint8Array(readbuffer(a));assert("object"==typeof(c=read(a,"binary")))}return c},"undefined"!=typeof print&&((console="undefined"==typeof console?{}:console).log=print,console.warn=console.error="undefined"!=typeof printErr?printErr:print)):(p||q)&&(q?u=self.location.href:document.currentScript&&(u=document.currentScript.src),u=0!==(u=_scriptDir||u).indexOf("blob:")?u.substr(0,u.lastIndexOf("/")+1):"",v=function(a){try{var c=new XMLHttpRequest;return c.open("GET",a,!1),c.send(null),c.responseText}catch(d){if(a=z(a))return C(a);throw d}},q)&&(w=function(a){try{var c=new XMLHttpRequest;return c.open("GET",a,!1),c.responseType="arraybuffer",c.send(null),new Uint8Array(c.response)}catch(d){if(a=z(a))return a;throw d}}),b.print||console.log.bind(console)),E=b.printErr||console.warn.bind(console);for(n in l)l.hasOwnProperty(n)&&(b[n]=l[n]);function da(){return{exports:function(asmLibraryArg,wasmMemory,wasmTable){var scratchBuffer=new ArrayBuffer(8),b=new Int32Array(scratchBuffer),c=new Float32Array(scratchBuffer),d=new Float64Array(scratchBuffer);function f(index,value){b[index]=value}function g(){return d[0]}function h(value){d[0]=value}function j(value){c[0]=value}function k(){return c[0]}scratchBuffer=wasmMemory.buffer;var U,global,buffer,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,C,H,I,J,K,L,M,U=new Uint8Array(scratchBuffer);return(scratchBuffer=function(offset,s){var V,W;if("undefined"==typeof Buffer)for(V=atob(s),W=0;W<V.length;W++)U[offset+W]=V.charCodeAt(W);else for(V=Buffer.from(s,"base64"),W=0;W<V.length;W++)U[offset+W]=V[W]})(1024,"QW4gZXJyb3Igb2NjdXJyZWQgaW4gdGhlIGludGVycG9sYXRpb24gZm9yIGJsZW5kIHNoYXBlcy4gQ29tYmluYXRpb25Db3VudCBpcyAlZC4ACgBbQ1NNXSBbRV1XYXJwRGVmb3JtZXI6OlRyYW5zZm9ybVRhcmdldCgpIGVycm9yLiBbJWRdIHAwMT0oJS40ZiAsICUuNGYpCgBbQ1NNXSBbRV1Jbml0aWFsaXplRGVmb3JtZXJzKCk6IFVua25vd24gRGVmb3JtZXIgVHlwZS4KAFtDU01dIFtFXWNzbUhhc01vY0NvbnNpc3RlbmN5OiBUaGlzIG1vYzMgc2l6ZSBpcyBpbnZhbGlkLgoAW0NTTV0gW0VdJXM6ICVzCgBbQ1NNXSBbV11Sb3RhdGlvbkRlZm9ybWVyOiBOb3QgZm91bmQgdHJhbnNmb3JtZWQgRGlyZWN0aW9uLgoAW0NTTV0gW0VdVXBkYXRlRGVmb3JtZXJIaWVyYXJjaHkoKTogVW5rbm93biBEZWZvcm1lciBUeXBlLgoAJXMKACAgAE1PQzMAImFkZHJlc3MiIGlzIG51bGwuACUwMlggAFtDU01dIFtFXWNzbUhhc01vY0NvbnNpc3RlbmN5OiBGaWxlVHlwZSBpcyBpbnZhbGlkLgoAImFkZHJlc3MiIGFsaWdubWVudCBpcyBpbnZhbGlkLgBbQ1NNXSBbRV1jc21IYXNNb2NDb25zaXN0ZW5jeTogVGhpcyBtb2MzIHZlciBpcyBpbnZhbGlkIFt2ZXI6JWRdLgoAInNpemUiIGlzIGludmFsaWQuAFtDU01dIFtFXWNzbUhhc01vY0NvbnNpc3RlbmN5OiBUaGUgQ29yZSB1bnN1cHBvcnQgbGF0ZXIgdGhhbiBtb2MzIHZlcjpbJWRdLiBUaGlzIG1vYzMgdmVyIGlzIFslZF0uCgAibW9kZWwiIGlzIGludmFsaWQuAFtDU01dIFtFXWNzbUhhc01vY0NvbnNpc3RlbmN5OiBIZWFkZXIgc2VjdGlvbiBpcyBpbnZhbGlkLgoAIm91dFNpemVJblBpeGVscyIgaXMgbnVsbC4AW0NTTV0gW0VdY3NtSGFzTW9jQ29uc2lzdGVuY3k6IERhdGEgc2VjdGlvbiBpcyBpbnZhbGlkLgoAIm91dE9yaWdpbkluUGl4ZWxzIiBpcyBudWxsLgBbQ1NNXSBbRV1jc21SZXZpdmVNb2NJblBsYWNlIGlzIGZhaWxlZC4gQ29ycnVwdGVkICBtb2MzIGZpbGUuCgAib3V0UGl4ZWxzUGVyVW5pdCIgaXMgbnVsbC4AW0NTTV0gW0VdY3NtUmV2aXZlTW9jSW5QbGFjZSBpcyBmYWlsZWQuIFRoZSBDb3JlIHVuc3VwcG9ydCBsYXRlciB0aGFuIG1vYzMgdmVyOlslZF0uIFRoaXMgbW9jMyB2ZXIgaXMgWyVkXS4KACJtb2MiIGlzIGludmFsaWQuAFtDU01dIFtFXWNzbUdldE1vY1ZlcnNpb24gaXMgZmFpbGVkLiBDb3JydXB0ZWQgbW9jMyBmaWxlLgoAInNpemUiIGlzIGludmFsaWQATGl2ZTJEIEN1YmlzbSBTREsgQ29yZSBWZXJzaW9uICVkLiVkLiVkAGNzbUdldE1vY1ZlcnNpb24AY3NtSGFzTW9jQ29uc2lzdGVuY3kAY3NtUmV2aXZlTW9jSW5QbGFjZQBjc21SZWFkQ2FudmFzSW5mbwBjc21HZXRTaXplb2ZNb2RlbABjc21Jbml0aWFsaXplTW9kZWxJblBsYWNlAGNzbVVwZGF0ZU1vZGVsAGNzbUdldFBhcmFtZXRlckNvdW50AGNzbUdldFBhcmFtZXRlcklkcwBjc21HZXRQYXJhbWV0ZXJUeXBlcwBjc21HZXRQYXJhbWV0ZXJNaW5pbXVtVmFsdWVzAGNzbUdldFBhcmFtZXRlck1heGltdW1WYWx1ZXMAY3NtR2V0UGFyYW1ldGVyRGVmYXVsdFZhbHVlcwBjc21HZXRQYXJhbWV0ZXJWYWx1ZXMAY3NtR2V0UGFyYW1ldGVyUmVwZWF0cwBjc21HZXRQYXJ0Q291bnQAY3NtR2V0UGFydElkcwBjc21HZXRQYXJ0T3BhY2l0aWVzAGNzbUdldFBhcnRQYXJlbnRQYXJ0SW5kaWNlcwBjc21HZXREcmF3YWJsZUNvdW50AGNzbUdldERyYXdhYmxlSWRzAGNzbUdldERyYXdhYmxlQ29uc3RhbnRGbGFncwBjc21HZXREcmF3YWJsZUR5bmFtaWNGbGFncwBjc21HZXREcmF3YWJsZVRleHR1cmVJbmRpY2VzAGNzbUdldERyYXdhYmxlRHJhd09yZGVycwBjc21HZXREcmF3YWJsZVJlbmRlck9yZGVycwBjc21HZXREcmF3YWJsZU9wYWNpdGllcwBjc21HZXREcmF3YWJsZU1hc2tDb3VudHMAY3NtR2V0RHJhd2FibGVNYXNrcwBjc21HZXREcmF3YWJsZVZlcnRleENvdW50cwBjc21HZXREcmF3YWJsZVZlcnRleFBvc2l0aW9ucwBjc21HZXREcmF3YWJsZVZlcnRleFV2cwBjc21HZXREcmF3YWJsZUluZGV4Q291bnRzAGNzbUdldERyYXdhYmxlSW5kaWNlcwBjc21HZXREcmF3YWJsZU11bHRpcGx5Q29sb3JzAGNzbUdldERyYXdhYmxlU2NyZWVuQ29sb3JzAGNzbUdldERyYXdhYmxlUGFyZW50UGFydEluZGljZXMAY3NtUmVzZXREcmF3YWJsZUR5bmFtaWNGbGFncwBjc21HZXRQYXJhbWV0ZXJLZXlDb3VudHMAY3NtR2V0UGFyYW1ldGVyS2V5VmFsdWVz"),scratchBuffer(3252,"Cg=="),scratchBuffer(3291,"//////8="),scratchBuffer(3360,"LSsgICAwWDB4AChudWxsKQ=="),scratchBuffer(3392,"EQAKABEREQAAAAAFAAAAAAAACQAAAAAL"),scratchBuffer(3424,"EQAPChEREQMKBwABEwkLCwAACQYLAAALAAYRAAAAERER"),scratchBuffer(3473,"Cw=="),scratchBuffer(3482,"EQAKChEREQAKAAACAAkLAAAACQALAAAL"),scratchBuffer(3531,"DA=="),scratchBuffer(3543,"DAAAAAAMAAAAAAkMAAAAAAAMAAAM"),scratchBuffer(3589,"Dg=="),scratchBuffer(3601,"DQAAAAQNAAAAAAkOAAAAAAAOAAAO"),scratchBuffer(3647,"EA=="),scratchBuffer(3659,"DwAAAAAPAAAAAAkQAAAAAAAQAAAQAAASAAAAEhIS"),scratchBuffer(3714,"EgAAABISEgAAAAAAAAk="),scratchBuffer(3763,"Cw=="),scratchBuffer(3775,"CgAAAAAKAAAAAAkLAAAAAAALAAAL"),scratchBuffer(3821,"DA=="),scratchBuffer(3833,"DAAAAAAMAAAAAAkMAAAAAAAMAAAMAAAwMTIzNDU2Nzg5QUJDREVGLTBYKzBYIDBYLTB4KzB4IDB4AGluZgBJTkYAbmFuAE5BTgAuAAAAAMgaAAAAAAAAAwAAAAQAAAAEAAAABgAAAIP5ogBETm4A/CkVANFXJwDdNPUAYtvAADyZlQBBkEMAY1H+ALveqwC3YcUAOm4kANJNQgBJBuAACeouAByS0QDrHf4AKbEcAOg+pwD1NYIARLsuAJzphAC0JnAAQX5fANaROQBTgzkAnPQ5AItfhAAo+b0A+B87AN7/lwAPmAUAES/vAApaiwBtH20Az342AAnLJwBGT7cAnmY/AC3qXwC6J3UA5evHAD178QD3OQcAklKKAPtr6gAfsV8ACF2NADADVgB7/EYA8KtrACC8zwA29JoA46kdAF5hkQAIG+YAhZllAKAUXwCNQGgAgNj/ACdzTQAGBjEAylYVAMmocwB74mAAa4zAABnERwDNZ8MACejcAFmDKgCLdsQAphyWAESv3QAZV9EApT4FAAUH/wAzfj8AwjLoAJhP3gC7fTIAJj3DAB5r7wCf+F4ANR86AH/yygDxhx0AfJAhAGokfADVbvoAMC13ABU7QwC1FMYAwxmdAK3EwgAsTUEADABdAIZ9RgDjcS0Am8aaADNiAAC00nwAtKeXADdV1QDXPvYAoxAYAE12/ABknSoAcNerAGN8+AB6sFcAFxXnAMBJVgA71tkAp4Q4ACQjywDWincAWlQjAAAfuQDxChsAGc7fAJ8x/wBmHmoAmVdhAKz7RwB+f9gAImW3ADLoiQDmv2AA78TNAGw2CQBdP9QAFt7XAFg73gDem5IA0iIoACiG6ADiWE0AxsoyAAjjFgDgfcsAF8BQAPMdpwAY4FsALhM0AIMSYgCDSAEA9Y5bAK2wfwAe6fIASEpDABBn0wCq3dgArl9CAGphzgAKKKQA05m0AAam8gBcd38Ao8KDAGE8iACKc3gAr4xaAG/XvQAtpmMA9L/LAI2B7wAmwWcAVcpFAMrZNgAoqNIAwmGNABLJdwAEJhQAEkabAMRZxADIxUQATbKRAAAX8wDUQ60AKUnlAP3VEAAAvvwAHpTMAHDO7gATPvUA7PGAALPnwwDH+CgAkwWUAMFxPgAuCbMAC0XzAIgSnACrIHsALrWfAEeSwgB7Mi8ADFVtAHKnkABr5x8AMcuWAHkWSgBBeeIA9N+JAOiUlwDi5oQAmTGXAIjtawBfXzYAu/0OAEiatABnpGwAcXJCAI1dMgCfFbgAvOUJAI0xJQD3dDkAMAUcAA0MAQBLCGgALO5YAEeqkAB05wIAvdYkAPd9pgBuSHIAnxbvAI6UpgC0kfYA0VNRAM8K8gAgmDMA9Ut+ALJjaADdPl8AQF0DAIWJfwBVUikAN2TAAG3YEAAySDIAW0x1AE5x1ABFVG4ACwnBACr1aQAUZtUAJwedAF0EUAC0O9sA6nbFAIf5FwBJa30AHSe6AJZpKQDGzKwArRRUAJDiagCI2YkALHJQAASkvgB3B5QA8zBwAAD8JwDqcagAZsJJAGTgPQCX3YMAoz+XAEOU/QANhowAMUHeAJI5nQDdcIwAF7fnAAjfOwAVNysAXICgAFqAkwAQEZIAD+jYAGyArwDb/0sAOJAPAFkYdgBipRUAYcu7AMeJuQAQQL0A0vIEAEl1JwDrtvYA2yK7AAoUqgCJJi8AZIN2AAk7MwAOlBoAUTqqAB2jwgCv7a4AXCYSAG3CTQAtepwAwFaXAAM/gwAJ8PYAK0CMAG0xmQA5tAcADCAVANjDWwD1ksQAxq1LAE7KpQCnN80A5qk2AKuSlADdQmgAGWPeAHaM7wBoi1IA/Ns3AK6hqwDfFTEAAK6hAAz72gBkTWYA7QW3ACllMABXVr8AR/86AGr5uQB1vvMAKJPfAKuAMABmjPYABMsVAPoiBgDZ5B0APbOkAFcbjwA2zQkATkLpABO+pAAzI7UA8KoaAE9lqADSwaUACz8PAFt4zQAj+XYAe4sEAIkXcgDGplMAb27iAO/rAACbSlgAxNq3AKpmugB2z88A0QIdALHxLQCMmcEAw613AIZI2gD3XaAAxoD0AKzwLwDd7JoAP1y8ANDebQCQxx8AKtu2AKMlOgAAr5oArVOTALZXBAApLbQAS4B+ANoHpwB2qg4Ae1mhABYSKgDcty0A+uX9AInb/gCJvv0A5HZsAAap/AA+gHAAhW4VAP2H/wAoPgcAYWczACoYhgBNveoAs+evAI9tbgCVZzkAMb9bAITXSAAw3xYAxy1DACVhNQDJcM4AMMu4AL9s/QCkAKIABWzkAFrdoAAhb0cAYhLSALlchABwYUkAa1bgAJlSAQBQVTcAHtW3ADPxxAATbl8AXTDkAIUuqQAdssMAoTI2AAi3pADqsdQAFvchAI9p5AAn/3cADAOAAI1ALQBPzaAAIKWZALOi0wAvXQoAtPlCABHaywB9vtAAm9vBAKsXvQDKooEACGpcAC5VFwAnAFUAfxTwAOEHhgAUC2QAlkGNAIe+3gDa/SoAayW2AHuJNAAF8/4Aub+eAGhqTwBKKqgAT8RaAC34vADXWpgA9MeVAA1NjQAgOqYApFdfABQ/sQCAOJUAzCABAHHdhgDJ3rYAv2D1AE1lEQABB2sAjLCsALLA0ABRVUgAHvsOAJVywwCjBjsAwEA1AAbcewDgRcwATin6ANbKyADo80EAfGTeAJtk2ADZvjEApJfDAHdY1ABp48UA8NoTALo6PABGGEYAVXVfANK99QBuksYArC5dAA5E7QAcPkIAYcSHACn96QDn1vMAInzKAG+RNQAI4MUA/9eNAG5q4gCw/cYAkwjBAHxddABrrbIAzW6dAD5yewDGEWoA98+pAClz3wC1yboAtwBRAOKyDQB0uiQA5X1gAHTYigANFSwAgRgMAH5mlAABKRYAn3p2AP39vgBWRe8A2X42AOzZEwCLurkAxJf8ADGoJwDxbsMAlMU2ANioVgC0qLUAz8wOABKJLQBvVzQALFaJAJnO4wDWILkAa16qAD4qnAARX8wA/QtKAOH0+wCOO20A4oYsAOnUhAD8tKkA7+7RAC41yQAvOWEAOCFEABvZyACB/AoA+0pqAC8c2ABTtIQATpmMAFQizAAqVdwAwMbWAAsZlgAacLgAaZVkACZaYAA/Uu4AfxEPAPS1EQD8y/UANLwtADS87gDoXcwA3V5gAGeOmwCSM+8AyRe4AGFYmwDhV7wAUYPGANg+EADdcUgALRzdAK8YoQAhLEYAWfPXANl6mACeVMAAT4b6AFYG/ADlea4AiSI2ADitIgBnk9wAVeiqAIImOADK55sAUQ2kAJkzsQCp1w4AaQVIAGWy8AB/iKcAiEyXAPnRNgAhkrMAe4JKAJjPIQBAn9wA3EdVAOF0OgBn60IA/p3fAF7UXwB7Z6QAuqx6AFX2ogAriCMAQbpVAFluCAAhKoYAOUeDAInj5gDlntQASftAAP9W6QAcD8oAxVmKAJT6KwDTwcUAD8XPANtargBHxYYAhUNiACGGOwAseZQAEGGHACpMewCALBoAQ78SAIgmkAB4PIkAqMTkAOXbewDEOsIAJvTqAPdnigANkr8AZaMrAD2TsQC9fAsApFHcACfdYwBp4d0AmpQZAKgplQBozigACe20AESfIABOmMoAcIJjAH58IwAPuTIAp/WOABRW5wAh8QgAtZ0qAG9+TQClGVEAtfmrAILf1gCW3WEAFjYCAMQ6nwCDoqEAcu1tADmNegCCuKkAazJcAEYnWwAANO0A0gB3APz0VQABWU0A4HGA"),scratchBuffer(6707,"QPsh+T8AAAAALUR0PgAAAICYRvg8AAAAYFHMeDsAAACAgxvwOQAAAEAgJXo4AAAAgCKC4zYAAAAAHfNpNThj7T7aD0k/Xph7P9oPyT9pN6wxaCEiM7QPFDNoIaIz2w9JP9sPSb/kyxZA5MsWwAAAAAAAAACA2w9JQNsPScAAAIA/AADAPwAAAADcz9E1AAAAAADAFT8="),scratchBuffer(6856,"BQ=="),scratchBuffer(6868,"DQ=="),scratchBuffer(6892,"DgAAAA8AAAB4HAAAAAQ="),scratchBuffer(6916,"AQ=="),scratchBuffer(6931,"Cv////8="),scratchBuffer(7188,"oCA="),global={Int8Array:Int8Array,Int16Array:Int16Array,Int32Array:Int32Array,Uint8Array:Uint8Array,Uint16Array:Uint16Array,Uint32Array:Uint32Array,Float32Array:Float32Array,Float64Array:Float64Array,NaN:NaN,Infinity:1/0,Math:Math},buffer=wasmMemory.buffer,m=(scratchBuffer=asmLibraryArg).memory,n=wasmTable,o=new global.Int8Array(buffer),p=new global.Int16Array(buffer),q=new global.Int32Array(buffer),r=new global.Uint8Array(buffer),s=new global.Uint16Array(buffer),t=new global.Uint32Array(buffer),u=new global.Float32Array(buffer),v=new global.Float64Array(buffer),w=global.Math.imul,x=global.Math.fround,y=global.Math.abs,z=global.Math.clz32,A=global.Math.min,global.Math.max,C=global.Math.floor,global.Math.ceil,global.Math.sqrt,scratchBuffer.abort,global.NaN,H=global.Infinity,I=scratchBuffer.a,J=scratchBuffer.b,K=scratchBuffer.c,L=5251776,M=0,n[1]=function(a,Mn,Nn,On,Pn){a|=0,Mn|=0,Nn|=0,On|=0,Pn|=0;var Xn,lo,mo,po,ro,so,to,uo,vo,wo,xo,yo,zo,Ao,Bo,Co,Do,Eo,Fo,Go,Ho,Io,Jo,qo,Qn=0,Rn=x(0),Sn=x(0),Tn=0,Un=x(0),Vn=x(0),Wn=x(0),Yn=x(0),Zn=x(0),_n=x(0),$n=x(0),ao=x(0),bo=x(0),co=x(0),eo=x(0),fo=x(0),go=x(0),ho=x(0),io=x(0),jo=x(0),ko=x(0),no=x(0),oo=x(0),Ko=(x(0),x(0),x(0),x(0),x(0),x(0),x(0),x(0),x(0),0);if(L=qo=L-32|0,1<=(0|Pn))for(Xn=q[16+(q[a+308>>2]+(Mn<<5)|0)>>2],Qn=q[a+60>>2]+w(Xn,24)|0,Mn=(lo=q[Qn+8>>2])+-1|0,yo=(ro=q[Qn+4>>2])+-1|0,zo=vo=(Xn=q[q[a+152>>2]+(Xn<<2)>>2])+(lo<<3)|0,Ao=wo=Xn+((uo=w(ro,mo=lo+1|0))<<3)|0,Bo=xo=Xn+(lo+uo<<3)|0,Jo=q[Qn+12>>2],so=x(0|ro),to=x(0|lo),a=0;Wn=u[4+(Qn=(po=a<<3)+Nn|0)>>2],Sn=x(Wn*so),Yn=u[Qn>>2],Rn=x(Yn*to),Qn=Wn>=x(1),Sn=!(Wn<x(0)^1)||Qn|Yn>=x(1)|Yn<x(0)?(Ko||(bo=u[4+Bo>>2],Co=u[Xn+4>>2],Zn=x(bo-Co),Do=u[4+zo>>2],Eo=u[4+Ao>>2],_n=x(Do-Eo),co=x(x(Zn-_n)*x(.5)),Fo=u[xo>>2],Go=u[Xn>>2],$n=x(Fo-Go),Ho=u[vo>>2],Io=u[wo>>2],ao=x(Ho-Io),eo=x(x($n-ao)*x(.5)),_n=x(x(_n+Zn)*x(.5)),ao=x(x(ao+$n)*x(.5)),Ko=1,Zn=x(x(x(x(x(Co+Do)+Eo)+bo)*x(.25))-x(Zn*x(.5))),$n=x(x(x(x(x(Go+Ho)+Io)+Fo)*x(.25))-x($n*x(.5)))),Wn<x(3)^1|Yn>x(-2)^1|(Yn<x(3)^1|Wn>x(-2)^1)?(u[On+po>>2]=x(Wn*eo)+x(x(Yn*ao)+$n),Rn=x(Wn*co),x(x(Yn*_n)+Zn)):(Yn<=x(0)?Wn<=x(0)?(Vn=x(x(Wn+x(2))*x(.5)),Un=x(x(Yn+x(2))*x(.5)),Rn=x(co+co),no=x(Zn-Rn),Sn=x(eo+eo),oo=x($n-Sn),jo=x(Zn-x(_n+_n)),fo=x(jo-Rn),ko=x($n-x(ao+ao)),go=x(ko-Sn),ho=u[Xn+4>>2],io=u[Xn>>2]):Qn?(Rn=x(co*x(3)),Sn=x(Zn-x(_n+_n)),jo=x(Rn+Sn),fo=x(eo*x(3)),go=x($n-x(ao+ao)),ko=x(fo+go),Vn=x(x(Wn+x(-1))*x(.5)),Un=x(x(Yn+x(2))*x(.5)),ho=x(Rn+Zn),io=x(fo+$n),fo=x(co+Sn),go=x(eo+go),no=u[4+Ao>>2],oo=u[wo>>2]):(Rn=x(Zn-x(_n+_n)),Qn=yo,Tn=x(y(Sn))<x(2147483648)?~~Sn:-2147483648,Vn=x(0|(Qn=(0|Tn)==(0|ro)?Qn:Tn)),Un=x(Vn/so),fo=x(x(Un*co)+Rn),bo=x(Un*eo),Un=x($n-x(ao+ao)),go=x(bo+Un),Wn=x(x(0|(Tn=Qn+1|0))/so),jo=x(x(Wn*co)+Rn),ko=x(x(Wn*eo)+Un),Un=x(x(Yn+x(2))*x(.5)),Vn=x(Sn-Vn),Qn=Xn+(w(Qn,mo)<<3)|0,no=u[Qn+4>>2],oo=u[Qn>>2],Qn=Xn+(w(Tn,mo)<<3)|0,ho=u[Qn+4>>2],io=u[Qn>>2]):Yn>=x(1)?Wn<=x(0)?(Vn=x(x(Wn+x(2))*x(.5)),Un=x(x(Yn+x(-1))*x(.5)),Rn=x(co+co),fo=x(x(_n+Zn)-Rn),Sn=x(eo+eo),go=x(x(ao+$n)-Sn),ho=x(x(_n*x(3))+Zn),no=x(ho-Rn),io=x(x(ao*x(3))+$n),oo=x(io-Sn),jo=u[4+zo>>2],ko=u[vo>>2]):Qn?(Rn=x(co*x(3)),jo=x(Rn+x(_n+Zn)),Sn=x(eo*x(3)),ko=x(Sn+x(ao+$n)),bo=Rn,Rn=x(x(_n*x(3))+Zn),ho=x(bo+Rn),bo=Sn,Sn=x(x(ao*x(3))+$n),io=x(bo+Sn),Vn=x(x(Wn+x(-1))*x(.5)),Un=x(x(Yn+x(-1))*x(.5)),no=x(co+Rn),oo=x(eo+Sn),fo=u[4+Bo>>2],go=u[xo>>2]):(Rn=x(x(_n*x(3))+Zn),Qn=yo,Tn=x(y(Sn))<x(2147483648)?~~Sn:-2147483648,Vn=x(0|(Qn=(0|Tn)==(0|ro)?Qn:Tn)),Un=x(Vn/so),no=x(x(Un*co)+Rn),bo=x(Un*eo),Un=x(x(ao*x(3))+$n),oo=x(bo+Un),Wn=x(x(0|(Tn=Qn+1|0))/so),ho=x(x(Wn*co)+Rn),io=x(x(Wn*eo)+Un),Un=x(x(Yn+x(-1))*x(.5)),Vn=x(Sn-Vn),Qn=Xn+(w(Qn,mo)+lo<<3)|0,fo=u[Qn+4>>2],go=u[Qn>>2],Qn=Xn+(w(Tn,mo)+lo<<3)|0,jo=u[Qn+4>>2],ko=u[Qn>>2]):Wn<=x(0)?(Vn=x(x(Wn+x(2))*x(.5)),Qn=Mn,Tn=x(y(Sn=Rn))<x(2147483648)?~~Rn:-2147483648,Rn=x(0|(Qn=(0|Tn)==(0|lo)?Qn:Tn)),Un=x(Sn-Rn),Rn=x(Rn/to),Sn=x(co+co),fo=x(x(x(Rn*_n)+Zn)-Sn),bo=x(x(Rn*ao)+$n),Rn=x(eo+eo),go=x(bo-Rn),Wn=x(x(0|(Tn=Qn+1|0))/to),no=x(x(x(Wn*_n)+Zn)-Sn),oo=x(x(x(Wn*ao)+$n)-Rn),jo=u[4+(Qn=Xn+(Qn<<3)|0)>>2],ko=u[Qn>>2],ho=u[4+(Qn=Xn+(Tn<<3)|0)>>2],io=u[Qn>>2]):Qn?(bo=Sn=x(co*x(3)),Qn=Mn,Tn=x(y(Rn))<x(2147483648)?~~Rn:-2147483648,Un=x(0|(Qn=(0|Tn)==(0|lo)?Qn:Tn)),Vn=x(Un/to),jo=x(bo+x(x(Vn*_n)+Zn)),Yn=x(eo*x(3)),ko=x(Yn+x(x(Vn*ao)+$n)),bo=Sn,Sn=x(x(0|(Tn=Qn+1|0))/to),ho=x(bo+x(x(Sn*_n)+Zn)),io=x(Yn+x(x(Sn*ao)+$n)),Vn=x(x(Wn+x(-1))*x(.5)),Un=x(Rn-Un),fo=u[4+(Qn=Xn+(Qn+uo<<3)|0)>>2],go=u[Qn>>2],no=u[4+(Qn=Xn+(Tn+uo<<3)|0)>>2],oo=u[Qn>>2]):(v[16+qo>>3]=Wn,q[qo>>2]=a,v[8+qo>>3]=Yn,Y(4,1107,qo)),x(Un+Vn)<=x(1)?(u[On+po>>2]=x(go+x(x(oo-go)*Un))+x(x(ko-go)*Vn),Rn=x(fo+x(x(no-fo)*Un)),x(x(jo-fo)*Vn)):(Rn=x(x(1)-Un),Sn=x(x(1)-Vn),u[On+po>>2]=x(io+x(x(ko-io)*Rn))+x(x(oo-io)*Sn),Rn=x(ho+x(x(jo-ho)*Rn)),x(x(no-ho)*Sn)))):(Qn=x(y(bo=Sn))<x(2147483648)?~~Sn:-2147483648,Vn=x(bo-x(0|Qn)),Tn=x(y(Sn=Rn))<x(2147483648)?~~Rn:-2147483648,Un=x(Sn-x(0|Tn)),Qn=Tn+w(Qn,mo)|0,Jo?(Rn=x(x(1)-Vn),Sn=x(x(1)-Un),Tn=Xn+(Qn<<3)|0,Qn=Xn+(Qn+mo<<3)|0,u[On+po>>2]=x(x(x(Rn*x(Sn*u[Tn>>2]))+x(Rn*x(Un*u[Tn+8>>2])))+x(Vn*x(Sn*u[Qn>>2])))+x(Vn*x(Un*u[Qn+8>>2])),Rn=x(x(x(Rn*x(Sn*u[Tn+4>>2]))+x(Rn*x(Un*u[Tn+12>>2])))+x(Vn*x(Sn*u[Qn+4>>2]))),x(Vn*x(Un*u[Qn+12>>2]))):x(Un+Vn)<=x(1)?(Rn=x(x(x(1)-Un)-Vn),Tn=Xn+(Qn<<3)|0,Qn=Xn+(Qn+mo<<3)|0,u[On+po>>2]=x(x(Rn*u[Tn>>2])+x(Un*u[Tn+8>>2]))+x(Vn*u[Qn>>2]),Rn=x(x(Rn*u[Tn+4>>2])+x(Un*u[Tn+12>>2])),x(Vn*u[Qn+4>>2])):(Rn=x(x(Un+x(-1))+Vn),Tn=Xn+(Qn+mo<<3)|0,Sn=x(x(1)-Un),Wn=x(x(1)-Vn),Qn=Xn+(Qn<<3)|0,u[On+po>>2]=x(x(Rn*u[Tn+8>>2])+x(Sn*u[Tn>>2]))+x(Wn*u[Qn+8>>2]),Rn=x(x(Rn*u[Tn+12>>2])+x(Sn*u[Tn+4>>2])),x(Wn*u[Qn+12>>2]))),u[4+(On+po|0)>>2]=Rn+Sn,(0|Pn)!=(0|(a=a+1|0)););L=32+qo|0},n[2]=function(a,jh){a|=0,jh|=0;var Ah=0,Bh=0,Ch=0,Dh=0,Eh=0,Fh=x(0),Gh=0,Hh=0,Jh=(x(0),0),Kh=0,Dh=q[a+320>>2],Ah=q[a+316>>2],Eh=q[a+308>>2];-1==(0|(Bh=q[8+(Ch=Eh+(jh<<5)|0)>>2]))?(q[(Kh=Ah)+(Ah=jh<<2)>>2]=q[q[a+148>>2]+(q[Ch+16>>2]<<2)>>2],q[Ah+Dh>>2]=1065353216):(Gh=q[Ch+16>>2],Hh=q[q[a+152>>2]+(Gh<<2)>>2],n[q[24+(Eh+(Bh<<5)|0)>>2]](a,Bh,Hh,Hh,q[16+(q[a+60>>2]+w(Gh,24)|0)>>2]),Fh=u[q[a+148>>2]+(q[Ch+16>>2]<<2)>>2],Ch=q[Ch+8>>2]<<2,u[(Bh=jh<<2)+Ah>>2]=Fh*u[Ch+Ah>>2],q[Bh+Dh>>2]=q[Ch+Dh>>2]),4<=r[q[a>>2]+4|0]&&(Dh=jh<<2,Ah=q[a+308>>2]+(jh<<5)|0,Bh=q[Ah+16>>2]<<2,Ch=q[a+328>>2],jh=q[a+324>>2],-1==(0|(Eh=q[Ah+8>>2]))?(Eh=q[a+156>>2],q[(Ah=Dh<<2)+jh>>2]=q[Eh+(Bh<<=2)>>2],q[(Gh=4|Ah)+jh>>2]=q[(Hh=4|Bh)+Eh>>2],q[(Jh=8|Ah)+jh>>2]=q[Eh+(Kh=8|Bh)>>2],q[jh+((Dh|=3)<<2)>>2]=1065353216,a=q[a+160>>2],q[Ah+Ch>>2]=q[a+Bh>>2],q[Ch+Gh>>2]=q[a+Hh>>2],q[Ch+Jh>>2]=q[a+Kh>>2]):(Bh=(Hh=Bh<<2)+q[a+156>>2]|0,u[(Ah=(Gh=Dh<<2)+jh|0)>>2]=u[Bh>>2]*u[(Eh=(Jh=Eh<<4)+jh|0)>>2],u[Ah+4>>2]=u[Bh+4>>2]*u[Eh+4>>2],u[Ah+8>>2]=u[Bh+8>>2]*u[Eh+8>>2],q[jh+((Dh|=3)<<2)>>2]=1065353216,a=Hh+q[a+160>>2]|0,Kh=u[a>>2],Fh=u[(Ah=Ch+Jh|0)>>2],u[(jh=Ch+Gh|0)>>2]=x(Kh+Fh)-x(Kh*Fh),Kh=u[a+4>>2],Fh=u[Ah+4>>2],u[jh+4>>2]=x(Kh+Fh)-x(Kh*Fh),Kh=u[a+8>>2],Fh=u[Ah+8>>2],u[jh+8>>2]=x(Kh+Fh)-x(Kh*Fh)),q[Ch+(Dh<<2)>>2]=1065353216)},n[3]=function(a,rn,sn,vn,wn){a|=0,rn|=0,sn|=0,vn|=0,wn|=0;var Bn,Cn,Dn,Fn,Gn,xn=0,xn=(x(0),x(0),x(0),x(0),x(0),x(0),x(0),x(0),(rn=q[16+(q[a+308>>2]+(rn<<5)|0)>>2])<<2),zn=function(a){var Cl,Fl,Dl,El,Bl=x(0);L=Dl=L-16|0,j(a);a:if((Cl=2147483647&(El=b[0]))>>>0<=1061752794)Bl=x(1),Cl>>>0<964689920||(Bl=ba(+a));else if(Cl>>>0<=1081824209)Fl=+a,Bl=1075235812<=Cl>>>0?x(-ba(((0|El)<0?3.141592653589793:-3.141592653589793)+Fl)):aa((0|El)<=-1?1.5707963267948966+Fl:1.5707963267948966-Fl);else if(Cl>>>0<=1088565717)Bl=1085271520<=Cl>>>0?ba(+a+((0|El)<0?6.283185307179586:-6.283185307179586)):aa((0|El)<=-1?-4.71238898038469-+a:+a-4.71238898038469);else if(Bl=x(a-a),!(2139095040<=Cl>>>0))if((Cl=3&Da(a,8+Dl|0))>>>0<=2){switch(Cl-1|0){default:Bl=ba(v[8+Dl>>3]);break a;case 0:Bl=aa(-v[8+Dl>>3]);break a;case 1:}Bl=x(-ba(v[8+Dl>>3]))}else Bl=aa(v[8+Dl>>3]);return L=16+Dl|0,Bl}(yn=x(x(x(u[4+(q[a+168>>2]+w(rn,12)|0)>>2]+u[xn+q[a+284>>2]>>2])*x(3.1415927410125732))/x(180))),An=u[xn+q[a+272>>2]>>2],En=q[xn+q[a+292>>2]>>2],yn=function(a){var Tk,yl,Al,zl=0;L=yl=L-16|0,j(a);a:if((Tk=2147483647&(Al=b[0]))>>>0<=1061752794)Tk>>>0<964689920||(a=aa(+a));else if(Tk>>>0<=1081824209)zl=+a,a=Tk>>>0<=1075235811?(0|Al)<=-1?x(-ba(zl+1.5707963267948966)):ba(zl+-1.5707963267948966):aa(-(((0|Al)<0?3.141592653589793:-3.141592653589793)+zl));else if(Tk>>>0<=1088565717)zl=+a,a=Tk>>>0<=1085271519?(0|Al)<=-1?ba(zl+4.71238898038469):x(-ba(zl+-4.71238898038469)):aa(((0|Al)<0?6.283185307179586:-6.283185307179586)+zl);else if(2139095040<=Tk>>>0)a=x(a-a);else if((Tk=3&Da(a,8+yl|0))>>>0<=2){switch(Tk-1|0){default:a=aa(v[8+yl>>3]);break a;case 0:a=ba(v[8+yl>>3]);break a;case 1:}a=aa(-v[8+yl>>3])}else a=x(-ba(v[8+yl>>3]));return L=16+yl|0,a}(yn);if((rn=0)<(0|wn))for(zn=x(An*zn),Cn=x(En?-1:1),Fn=x(zn*Cn),Bn=q[xn+q[a+288>>2]>>2]?x(-1):x(1),Gn=x(x(An*yn)*Bn),zn=x(zn*Bn),An=x(x(An*x(-yn))*Cn),yn=u[xn+q[a+280>>2]>>2],Cn=u[xn+q[a+276>>2]>>2];xn=(a=rn<<3)+vn|0,Bn=u[(a=a+sn|0)>>2],Dn=u[a+4>>2],u[xn+4>>2]=yn+x(x(Gn*Bn)+x(Fn*Dn)),u[xn>>2]=Cn+x(x(zn*Bn)+x(An*Dn)),(0|wn)!=(0|(rn=rn+1|0)););},n[4]=function(a,jh){a|=0,jh|=0;var vh,wh,xh,yh,zh,kh,lh=0,mh=0,nh=0,oh=x(0),ph=0,qh=0,rh=x(0),sh=0,th=0,uh=0;if(x(0),x(0),x(0),x(0),L=kh=L+-64|0,sh=q[a+320>>2],th=q[a+316>>2],mh=q[a+308>>2],-1==(0|(ph=q[8+(nh=mh+(jh<<5)|0)>>2])))lh=q[nh+16>>2]<<2,q[(mh=jh<<2)+th>>2]=q[lh+q[a+268>>2]>>2],q[mh+sh>>2]=q[lh+q[a+272>>2]>>2];else{lh=q[nh+16>>2]<<2,uh=q[lh+q[a+276>>2]>>2],q[24+kh>>2]=uh,lh=q[lh+q[a+280>>2]>>2],q[28+kh>>2]=lh,q[16+kh>>2]=0,wh=1==q[12+(qh=mh+(ph<<5)|0)>>2]?x(-10):x(-.10000000149011612),u[20+kh>>2]=wh,q[60+kh>>2]=lh,q[56+kh>>2]=uh,n[q[qh+24>>2]](a,ph,56+kh|0,48+kh|0,1),oh=x(1),mh=9;b:{for(;;){if(lh=mh,rh=x(oh*x(0)),u[32+kh>>2]=rh+u[56+kh>>2],vh=x(wh*oh),u[36+kh>>2]=vh+u[60+kh>>2],n[q[qh+24>>2]](a,ph,32+kh|0,40+kh|0,1),xh=x(u[44+kh>>2]-u[52+kh>>2]),u[44+kh>>2]=xh,yh=x(u[40+kh>>2]-u[48+kh>>2]),u[40+kh>>2]=yh,xh!=x(0)||yh!=x(0)){mh=q[44+kh>>2],q[8+kh>>2]=q[40+kh>>2],q[12+kh>>2]=mh;break b}if(u[32+kh>>2]=u[56+kh>>2]-rh,u[36+kh>>2]=u[60+kh>>2]-vh,n[q[qh+24>>2]](a,ph,32+kh|0,40+kh|0,1),rh=x(u[40+kh>>2]-u[48+kh>>2]),u[40+kh>>2]=rh,vh=x(u[44+kh>>2]-u[52+kh>>2]),(u[44+kh>>2]=vh)!=x(0)||rh!=x(0)){u[12+kh>>2]=-vh,u[8+kh>>2]=-rh;break b}if(mh=lh+-1|0,oh=x(oh*x(.10000000149011612)),!lh)break}Y(3,1311,0)}oh=function(a,Sh){var Th=x(0);if((Th=x(Ba(u[4+a>>2],u[a>>2])-Ba(u[4+Sh>>2],u[Sh>>2])))<x(-3.1415927410125732))for(;(Th=x(Th+x(6.2831854820251465)))<x(-3.1415927410125732););if(Th>x(3.1415927410125732))for(;(Th=x(Th+x(-6.2831854820251465)))>x(3.1415927410125732););return Th}(16+kh|0,8+kh|0),n[q[qh+24>>2]](a,q[nh+8>>2],24+kh|0,24+kh|0,1),mh=q[nh+16>>2]<<2,q[mh+q[a+276>>2]>>2]=q[24+kh>>2],q[mh+q[a+280>>2]>>2]=q[28+kh>>2],lh=mh+q[a+284>>2]|0,u[lh>>2]=u[lh>>2]+x(x(oh*x(-180))/x(3.1415927410125732)),nh=q[nh+8>>2]<<2,u[(lh=jh<<2)+th>>2]=u[mh+q[a+268>>2]>>2]*u[nh+th>>2],mh=mh+q[a+272>>2]|0,oh=x(u[mh>>2]*u[nh+sh>>2]),u[lh+sh>>2]=oh,u[mh>>2]=oh}4<=r[q[a>>2]+4|0]&&(lh=jh<<2,nh=q[a+308>>2]+(jh<<5)|0,ph=q[nh+16>>2]<<2,mh=q[a+328>>2],jh=q[a+324>>2],-1==(0|(qh=q[nh+8>>2]))?(qh=q[a+296>>2],q[(nh=lh<<2)+jh>>2]=q[qh+(ph<<=2)>>2],q[(sh=4|nh)+jh>>2]=q[(th=4|ph)+qh>>2],q[(uh=8|nh)+jh>>2]=q[qh+(zh=8|ph)>>2],q[jh+((lh|=3)<<2)>>2]=1065353216,a=q[a+300>>2],q[mh+nh>>2]=q[a+ph>>2],q[mh+sh>>2]=q[a+th>>2],q[mh+uh>>2]=q[a+zh>>2]):(ph=(th=ph<<2)+q[a+296>>2]|0,u[(nh=(sh=lh<<2)+jh|0)>>2]=u[ph>>2]*u[(qh=(uh=qh<<4)+jh|0)>>2],u[nh+4>>2]=u[ph+4>>2]*u[qh+4>>2],u[nh+8>>2]=u[ph+8>>2]*u[qh+8>>2],q[jh+((lh|=3)<<2)>>2]=1065353216,a=th+q[a+300>>2]|0,oh=u[a>>2],rh=u[(nh=mh+uh|0)>>2],u[(jh=mh+sh|0)>>2]=x(oh+rh)-x(oh*rh),oh=u[a+4>>2],rh=u[nh+4>>2],u[jh+4>>2]=x(oh+rh)-x(oh*rh),oh=u[a+8>>2],rh=u[nh+8>>2],u[jh+8>>2]=x(oh+rh)-x(oh*rh)),q[mh+(lh<<2)>>2]=1065353216),L=64+kh|0},n[5]=function(a,Tk){return a|=0,Tk|=0,x(0),x(0),0|((a=u[a>>2])<(Tk=u[Tk>>2])?-1:Tk<a)},n[6]=function(a,tj,vj,wj){a|=0,tj|=0,vj|=0,wj|=0;var Tj=0,Uj=0,Vj=x(0),Wj=0,Xj=0,Yj=0,Zj=0,_j=0;if(1<=(0|(Wj=q[a+8>>2])))for(Yj=q[a+12>>2],Xj=q[a+20>>2];u[(Uj=Tj<<2)+Yj>>2]=u[tj+Uj>>2]*u[Uj+Xj>>2],(0|(Tj=Tj+1|0))<(0|Wj););if(!((0|(Wj=q[a>>2]))<1))if(Yj=q[a+4>>2],wj)for(Uj=tj=0;;){if(q[wj>>2]){if((0|(Tj=q[(Xj=tj<<2)+q[a+16>>2]>>2]))<1)Vj=x(0);else for(Zj=Tj+Uj|0,_j=q[a+12>>2],Vj=x(0),Tj=Uj;Vj=x(Vj+u[_j+(Tj<<2)>>2]),(0|(Tj=Tj+1|0))<(0|Zj););u[vj+Xj>>2]=Vj}if(wj=wj+4|0,Uj=q[Yj+(tj<<2)>>2]+Uj|0,!((0|(tj=tj+1|0))<(0|Wj)))break}else for(Xj=q[a+16>>2],tj=wj=0;;){if((0|(Tj=q[(Uj=wj<<2)+Xj>>2]))<=0)Vj=x(0);else for(Zj=tj+Tj|0,_j=q[a+12>>2],Vj=x(0),Tj=tj;Vj=x(Vj+u[_j+(Tj<<2)>>2]),(0|(Tj=Tj+1|0))<(0|Zj););if(u[vj+Uj>>2]=Vj,tj=q[Uj+Yj>>2]+tj|0,!((0|(wj=wj+1|0))<(0|Wj)))break}},n[7]=function(a,tj,vj,wj){a|=0,tj|=0,vj|=0,wj|=0;var xj=0,yj=x(0),Oj=0,Pj=0,Qj=0,Rj=0,Sj=0;if(1<=(0|(Rj=q[a+8>>2])))for(Pj=q[a+12>>2],Qj=q[a+20>>2];u[(Oj=xj<<2)+Pj>>2]=u[tj+Oj>>2]*u[Oj+Qj>>2],(0|(xj=xj+1|0))<(0|Rj););if(!((0|(xj=q[a>>2]))<1))if(Rj=q[a+4>>2],wj)for(Oj=tj=0;;){if(q[wj>>2]){if((0|(xj=q[(Pj=tj<<2)+q[a+16>>2]>>2]))<1)yj=x(0);else for(Qj=xj+Oj|0,Sj=q[a+12>>2],yj=x(0),xj=Oj;yj=x(yj+u[Sj+(xj<<2)>>2]),(0|(xj=xj+1|0))<(0|Qj););xj=vj+Pj|0,yj=x(yj+x(.0010000000474974513)),Pj=x(y(yj))<x(2147483648)?~~yj:-2147483648,q[xj>>2]=Pj,xj=q[a>>2]}if(wj=wj+4|0,Oj=q[Rj+(tj<<2)>>2]+Oj|0,!((0|(tj=tj+1|0))<(0|xj)))break}else for(Pj=q[a+16>>2],tj=wj=0;;){if((0|(xj=q[(Oj=wj<<2)+Pj>>2]))<=0)yj=x(0);else for(Qj=tj+xj|0,Sj=q[a+12>>2],yj=x(0),xj=tj;yj=x(yj+u[Sj+(xj<<2)>>2]),(0|(xj=xj+1|0))<(0|Qj););if(xj=vj+Oj|0,yj=x(yj+x(.0010000000474974513)),Qj=x(y(yj))<x(2147483648)?~~yj:-2147483648,q[xj>>2]=Qj,tj=q[Oj+Rj>>2]+tj|0,!((0|(wj=wj+1|0))<q[a>>2]))break}},n[8]=function(a,tj,vj,wj,xj,yj){a|=0,tj|=0,vj|=0,wj|=0,xj|=0,yj|=0;var Mj,Nj,zj=0,Aj=0,Bj=0,Cj=0,Dj=0,Ej=0,Fj=0,Gj=0,Ij=0,Jj=0,Kj=x(0),Lj=0,Hj=q[a>>2];if(!((0|Hj)<1))if(Mj=xj<<2,Nj=q[a+4>>2],yj)for(;;){if(q[yj>>2]&&(Bj=q[(zj=Cj<<2)+q[a+16>>2]>>2],Fj=q[vj+zj>>2],Aj=q[wj+zj>>2],(zj=(0|(Gj=w(Aj,xj)))<1)||ca(Fj,0,w(Aj,Mj)),!(zj|(0|Bj)<1)))for(Ij=Bj+Ej|0,Jj=q[a+20>>2],zj=Ej;;){for(Kj=u[(Aj=zj<<2)+Jj>>2],Lj=q[tj+Aj>>2],Dj=0;u[(Aj=(Bj=Dj<<2)+Fj|0)>>2]=u[Aj>>2]+x(Kj*u[Bj+Lj>>2]),(0|Gj)!=(0|(Dj=Dj+1|0)););if(!((0|(zj=zj+1|0))<(0|Ij)))break}if(yj=yj+4|0,Ej=q[(Cj<<2)+Nj>>2]+Ej|0,!((0|(Cj=Cj+1|0))<(0|Hj)))break}else for(yj=0;;){if(Bj=q[(Cj=yj<<2)+q[a+16>>2]>>2],Fj=q[vj+Cj>>2],Aj=q[wj+Cj>>2],(zj=(0|(Gj=w(Aj,xj)))<1)||ca(Fj,0,w(Aj,Mj)),!(zj|(0|Bj)<=0))for(Ij=Bj+Ej|0,Jj=q[a+20>>2],zj=Ej;;){for(Kj=u[(Aj=zj<<2)+Jj>>2],Lj=q[tj+Aj>>2],Dj=0;u[(Aj=(Bj=Dj<<2)+Fj|0)>>2]=u[Aj>>2]+x(Kj*u[Bj+Lj>>2]),(0|Gj)!=(0|(Dj=Dj+1|0)););if(!((0|(zj=zj+1|0))<(0|Ij)))break}if(Ej=q[Cj+Nj>>2]+Ej|0,!((0|(yj=yj+1|0))<(0|Hj)))break}},n[9]=function(a){var Je,Ke,Le,Fe=0,Ge=0,He=0,Ie=0;if(!(q[(a|=0)+648>>2]||(0|(Fe=q[a+332>>2]))<1))for(Ke=(Ge=q[a+336>>2])+w(Fe,20)|0,Fe=q[a+424>>2],Ie=q[a+444>>2];;){if(q[Fe>>2]&&!((0|(He=q[Ge+16>>2]))<(a=1)))for(He<<=1,Le=q[Ie>>2];u[(Je=(a<<2)+Le|0)>>2]=-u[Je>>2],(0|(a=a+2|0))<(0|He););if(Ie=Ie+4|0,Fe=Fe+4|0,!((Ge=Ge+20|0)>>>0<Ke>>>0))break}},n[10]=function(a,rn,sn){var un;return $(un=q[20+(a|=0)>>2],rn|=0,rn=(sn|=0)>>>0<(rn=q[a+16>>2]-un|0)>>>0?sn:rn),q[a+20>>2]=rn+q[a+20>>2],0|sn},n[11]=function(a,Gl,Pm,Qm,Rm,Sm){a|=0,Gl=+Gl,Pm|=0,Qm|=0,Rm|=0,Sm|=0;var dn,on,Xm,hn,Tm=0,Um=0,Vm=0,Wm=0,Ym=0,Zm=0,_m=0,$m=0,an=0,bn=0,cn=0,en=0,fn=0,gn=0,kn=0;if(q[44+(L=Xm=L-560|0)>>2]=0,h(+Gl),Tm=0|b[1],on=4294967295<b[0]>>>0?0:1,hn=(0|Tm)<-1||(0|Tm)<=-1&&on?(h(Gl=-Gl),Tm=0|b[1],b[0],gn=1,3872):2048&Rm?(gn=1,3875):(gn=1&Rm)?3878:3873,2146435072==(2146435072&Tm))_(a,32,Pm,Zm=gn+3|0,-65537&Rm),Z(a,hn,gn),Qm=Sm>>>5&1,Z(a,Gl!=Gl?Qm?3899:3903:Qm?3891:3895,3);else if(Gl=function Ja(a,ic){var kc,lc,jc=0;if(h(+a),jc=0|b[1],kc=0|b[0],2047!=(0|(jc=(lc=jc)>>>20&2047))){if(!jc)return jc=ic,ic=0==a?0:(a=Ja(0x10000000000000000*a,ic),q[ic>>2]+-64|0),q[jc>>2]=ic,a;q[ic>>2]=jc+-1022,f(0,0|kc),f(1,-2146435073&lc|1071644672),a=+g()}return a}(Gl,44+Xm|0),0!=(Gl+=Gl)&&(q[44+Xm>>2]=q[44+Xm>>2]+-1),dn=16+Xm|0,97==(0|(on=32|Sm))){if(cn=(bn=32&Sm)?9+hn|0:hn,!(11<Qm>>>0)&&(Tm=12-Qm|0)){for(en=8;en*=16,Tm=Tm+-1|0;);Gl=45==r[0|cn]?-(en+(-Gl-en)):Gl+en-en}for((0|dn)==(0|(Tm=ga((Vm=(Tm=q[44+Xm>>2])>>31)^Tm+Vm,0,dn)))&&(o[15+Xm|0]=48,Tm=15+Xm|0),Ym=2|gn,Vm=q[44+Xm>>2],o[0|(an=Tm+-2|0)]=Sm+15,o[Tm+-1|0]=(0|Vm)<0?45:43,Tm=8&Rm,Um=16+Xm|0;Sm=Um,$m=bn,Vm=y(Gl)<2147483648?~~Gl:-2147483648,o[0|Um]=$m|r[Vm+3856|0],1!=((Um=Sm+1|0)-(16+Xm|0)|0)|(0==(Gl=16*(Gl-(0|Vm)))?!(Tm|0<(0|Qm)):0)||(o[Sm+1|0]=46,Um=Sm+2|0),0!=Gl;);_(a,32,Pm,Zm=(Sm=!Qm|(0|Qm)<=((Um-Xm|0)-18|0)?((dn-(16+Xm|0)|0)-an|0)+Um|0:2+((Qm+dn|0)-an|0)|0)+Ym|0,Rm),Z(a,cn,Ym),_(a,48,Pm,Zm,65536^Rm),Z(a,16+Xm|0,Qm=Um-(16+Xm|0)|0),_(a,48,Sm-((Tm=Qm)+(Qm=dn-an|0)|0)|0,0,0),Z(a,an,Qm)}else{for(Tm=(0|Qm)<0,0==Gl?Wm=q[44+Xm>>2]:(Wm=q[44+Xm>>2]+-28|0,q[44+Xm>>2]=Wm,Gl*=268435456),_m=Tm?6:Qm,Vm=bn=(0|Wm)<0?48+Xm|0:336+Xm|0;Vm=(Qm=Vm)+4|0,0!=(Gl=1e9*(Gl-((q[Qm>>2]=Tm=Gl<4294967296&0<=Gl?~~Gl>>>0:0)>>>0))););if((0|Wm)<1)Tm=Vm,Um=bn;else for(Um=bn;;){if(an=(0|Wm)<29?Wm:29,!((Tm=Vm+-4|0)>>>0<Um>>>0)){for(Qm=an,$m=0;kn=$m,$m=q[(cn=Tm)>>2],Ym=31&Qm,Ym=32<=(63&Qm)>>>(Zm=0)?(Wm=$m<<Ym,0):(Wm=(1<<Ym)-1&$m>>>32-Ym,$m<<Ym),Zm=Wm+Zm|0,Zm=($m=kn+Ym|0)>>>0<Ym>>>0?Zm+1|0:Zm,kn=cn,cn=cd($m=dd(Ym=$m,Zm,1e9),M,1e9),q[kn>>2]=Ym-cn,Um>>>0<=(Tm=Tm+-4|0)>>>0;);(Qm=$m)&&(q[(Um=Um+-4|0)>>2]=Qm)}for(;Um>>>0<(Tm=Vm)>>>0&&!q[(Vm=Tm+-4|0)>>2];);if(Wm=q[44+Xm>>2]-an|0,Vm=Tm,!(0<(0|(q[44+Xm>>2]=Wm))))break}if((0|Wm)<=-1)for(fn=1+((_m+25|0)/9|0)|0,an=102==(0|on);;){if($m=(0|Wm)<-9?9:0-Wm|0,Tm>>>0<=Um>>>0)Um=q[Um>>2]?Um:Um+4|0;else{for(cn=1e9>>>$m,Ym=-1<<$m^-1,Wm=0,Vm=Um;Qm=q[Vm>>2],q[Vm>>2]=(Qm>>>$m)+Wm,Wm=w(cn,Qm&Ym),(Vm=Vm+4|0)>>>0<Tm>>>0;);Um=q[Um>>2]?Um:Um+4|0,Wm&&(q[Tm>>2]=Wm,Tm=Tm+4|0)}if(Wm=$m+q[44+Xm>>2]|0,Tm=(0|fn)<Tm-(Qm=an?bn:Um)>>2?Qm+(fn<<2)|0:Tm,!((0|(q[44+Xm>>2]=Wm))<0))break}if(!(Tm>>>(Vm=0)<=Um>>>0||(Vm=w(bn-Um>>2,9),(Qm=q[Um>>2])>>>0<(Wm=10))))for(;Vm=Vm+1|0,(Wm=w(Wm,10))>>>0<=Qm>>>0;);if((0|(Qm=(_m-(102==(0|on)?0:Vm)|0)-(103==(0|on)&0!=(0|_m))|0))<(w(Tm-bn>>2,9)+-9|0)){if(Zm=(bn+((Qm=(0|(Ym=Qm+9216|0))/9|0)<<2)|0)-4092|0,Wm=10,(0|(Qm=1+(Ym-w(Qm,9)|0)|0))<=8)for(;Wm=w(Wm,10),9!=(0|(Qm=Qm+1|0)););if(fn=Zm+4|0,((an=(cn=q[Zm>>2])-w(Wm,Ym=(cn>>>0)/(Wm>>>0)|0)|0)||(0|fn)!=(0|Tm))&&(en=an>>>0<(Qm=Wm>>>1)>>>0?.5:(0|Tm)==(0|fn)&&(0|Qm)==(0|an)?1:1.5,Gl=1&Ym?9007199254740994:9007199254740992,!gn|45!=r[0|hn]||(en=-en,Gl=-Gl),q[Zm>>2]=Qm=cn-an|0,Gl+en!=Gl)){if(1e9<=(q[Zm>>2]=Qm=Qm+Wm|0)>>>0)for(;(Zm=Zm+-4|(q[Zm>>2]=0))>>>0<Um>>>0&&(q[(Um=Um+-4|0)>>2]=0),Qm=q[Zm>>2]+1|0,999999999<(q[Zm>>2]=Qm)>>>0;);if(Vm=w(bn-Um>>2,9),!((Qm=q[Um>>2])>>>0<(Wm=10)))for(;Vm=Vm+1|0,(Wm=w(Wm,10))>>>0<=Qm>>>0;);}Tm=(Qm=Zm+4|0)>>>0<Tm>>>0?Qm:Tm}j:{for(;;){if((an=Tm)>>>(cn=0)<=Um>>>0)break j;if(q[(Tm=an+-4|0)>>2])break}cn=1}if(103!=(0|on))Ym=8&Rm;else if(_m=((Qm=(0|Vm)<(0|(Tm=_m||1))&-5<(0|Vm))?-1^Vm:-1)+Tm|0,Sm=(Qm?-1:-2)+Sm|0,!(Ym=8&Rm)){if(Tm=9,cn&&(Ym=q[an+-4>>2])&&!((Ym>>>(Tm=0))%(Qm=10)))for(;Tm=Tm+1|0,!((Ym>>>0)%((Qm=w(Qm,10))>>>0)););Qm=w(an-bn>>2,9)+-9|0,_m=102==(32|Sm)?((Ym=0)|_m)<(0|(Qm=0<(0|(Qm=Qm-Tm|0))?Qm:0))?_m:Qm:((Ym=0)|_m)<(0|(Qm=0<(0|(Qm=(Qm+Vm|0)-Tm|0))?Qm:0))?_m:Qm}if(Zm=0!=(0|(Wm=_m|Ym)),Qm=a,kn=Pm,Tm=0<(0|Vm)?Vm:0,102!=(0|($m=32|Sm))){if((dn-(Tm=ga((Tm=Vm>>31)+Vm^Tm,0,dn))|0)<=1)for(;o[0|(Tm=Tm+-1|0)]=48,(dn-Tm|0)<2;);o[0|(fn=Tm+-2|0)]=Sm,o[Tm+-1|0]=(0|Vm)<0?45:43,Tm=dn-fn|0}if(_(Qm,32,kn,Zm=1+(Tm+(Zm+(_m+gn|0)|0)|0)|0,Rm),Z(a,hn,gn),_(a,48,Pm,Zm,65536^Rm),102==(0|$m)){for(Qm=16+Xm|8,Vm=16+Xm|9,Um=Sm=bn>>>0<Um>>>0?bn:Um;;){if(Tm=ga(q[Um>>2],0,Vm),(0|Sm)!=(0|Um)){if(!(Tm>>>0<=16+Xm>>>0))for(;o[0|(Tm=Tm+-1|0)]=48,16+Xm>>>0<Tm>>>0;);}else(0|Tm)==(0|Vm)&&(o[24+Xm|0]=48,Tm=Qm);if(Z(a,Tm,Vm-Tm|0),!((Um=Um+4|0)>>>0<=bn>>>0))break}Wm&&Z(a,3907,1);p:if(!((0|_m)<1|an>>>0<=Um>>>0))for(;;){if(16+Xm>>>0<(Tm=ga(q[Um>>2],0,Vm))>>>0)for(;o[0|(Tm=Tm+-1|0)]=48,16+Xm>>>0<Tm>>>0;);if(Z(a,Tm,(0|_m)<9?_m:9),_m=_m+-9|0,an>>>0<=(Um=Um+4|0)>>>0)break p;if(!(0<(0|_m)))break}_(a,48,_m+9|0,9,0)}else{q:if(!((0|_m)<0))for(Sm=cn?an:Um+4|0,Qm=16+Xm|8,bn=16+Xm|9,Vm=Um;;){if((0|bn)==(0|(Tm=ga(q[Vm>>2],0,bn)))&&(o[24+Xm|0]=48,Tm=Qm),(0|Um)!=(0|Vm)){if(!(Tm>>>0<=16+Xm>>>0))for(;o[0|(Tm=Tm+-1|0)]=48,16+Xm>>>0<Tm>>>0;);}else Z(a,Tm,1),Tm=Tm+1|0,(0|_m)<1&&!Ym||Z(a,3907,1);if(Z(a,$m=Tm,(0|(Tm=bn-Tm|0))<(0|_m)?Tm:_m),_m=_m-Tm|0,Sm>>>0<=(Vm=Vm+4|0)>>>0)break q;if(!(-1<(0|_m)))break}_(a,48,_m+18|0,18,0),Z(a,fn,dn-fn|0)}}return _(a,32,Pm,Zm,8192^Rm),L=560+Xm|0,0|((0|Zm)<(0|Pm)?Pm:Zm)},n[12]=function(a,Gl){a|=0;var Cm=Gl|=0;Gl=q[Gl>>2]+15&-16,q[Cm>>2]=Gl+16,Cm=a,a=function(a,Gl,Hl,Zl){var dm,am,_l=0,$l=0,bm=0,cm=0;return L=am=L-32|0,_l=(cm=_l=2147483647&Zl)-1006698496|0,$l=_l=(dm=$l=bm=Hl)>>>0<0?_l+1|0:_l,_l=cm-1140785152|0,(0|(_l=bm>>>0<0?_l+1|0:_l))==(0|$l)&dm>>>0<bm>>>0|$l>>>0<_l>>>0?(_l=Zl<<4|Hl>>>28,Hl=Hl<<4|Gl>>>28,134217728==(0|(bm=Gl&=268435455))&1<=a>>>0|134217728<Gl>>>0?(_l=_l+1073741824|0,(a=Hl+1|0)>>>0<1&&(_l=_l+1|0),$l=a):(_l=_l-((($l=Hl)>>>0<0)+-1073741824|0)|0,a|134217728^bm||((a=$l+(1&$l)|0)>>>0<$l>>>0&&(_l=_l+1|0),$l=a))):(!bm&2147418112==(0|cm)?!(a|Gl):2147418112==(0|cm)&bm>>>0<0|cm>>>0<2147418112)?(_l=2146435072,1140785151==(($l=0)|cm)&4294967295<bm>>>0|1140785151<cm>>>0||(bm=cm>>>16)>>>(_l=0)<15249||(function(a,Gl,Hl,Cm,Dm,Em){var Hm,Im,Fm=0,Gm=0;64&Em?(Gl=31&(Hl=Em-64|0),Gl=32<=(63&Hl)>>>0?(Hl=0,Dm>>>Gl):(Hl=Dm>>>Gl,((1<<Gl)-1&Dm)<<32-Gl|Cm>>>Gl),Dm=Cm=0):Em&&(Gm=Dm,Fm=31&(Im=64-Em|0),Im=32<=(63&Im)>>>0?(Gm=Cm<<Fm,0):(Gm=(1<<Fm)-1&Cm>>>32-Fm|Gm<<Fm,Cm<<Fm),Hm=Gl,Gl=31&(Fm=Em),Gl=32<=(63&Fm)>>>0?(Fm=0,Hl>>>Gl):(Fm=Hl>>>Gl,((1<<Gl)-1&Hl)<<32-Gl|Hm>>>Gl),Gl|=Im,Hl=Fm|Gm,Fm=Cm,Cm=31&Em,Cm=32<=(63&Em)>>>0?(Gm=0,Dm>>>Cm):(Gm=Dm>>>Cm,((1<<Cm)-1&Dm)<<32-Cm|Fm>>>Cm),Dm=Gm),q[a>>2]=Gl,q[4+a>>2]=Hl,q[8+a>>2]=Cm,q[12+a>>2]=Dm}(am,a,Gl,Hl,_l=65535&Zl|65536,15361-bm|0),function(a,Gl,Hl,Zl,fm,gm){var jm,hm,im=0;64&gm?(Zl=Gl,Gl=31&(fm=gm+-64|0),32<=(63&fm)>>>0?(fm=Zl<<Gl,Zl=0):(fm=(1<<Gl)-1&Zl>>>32-Gl|Hl<<Gl,Zl<<=Gl),Hl=Gl=0):gm&&(hm=Zl,Zl=31&(jm=gm),hm=32<=(63&gm)>>>0?(im=hm<<Zl,0):(im=(1<<Zl)-1&hm>>>32-Zl|fm<<Zl,hm<<Zl),Zl=Hl,fm=31&(gm=64-gm|0),32<=(63&gm)>>>0?(gm=0,Zl>>>=fm):(gm=Zl>>>fm,Zl=((1<<fm)-1&Zl)<<32-fm|Gl>>>fm),Zl|=hm,fm=gm|im,gm=Gl,Gl=31&jm,Gl=32<=(63&jm)>>>0?(im=gm<<Gl,0):(im=(1<<Gl)-1&gm>>>32-Gl|Hl<<Gl,gm<<Gl),Hl=im),q[a>>2]=Gl,q[4+a>>2]=Hl,q[8+a>>2]=Zl,q[12+a>>2]=fm}(16+am|0,a,Gl,Hl,_l,bm+-15233|0),Hl=q[4+am>>2],a=q[8+am>>2],_l=q[12+am>>2]<<4|a>>>28,$l=a<<4|Hl>>>28,134217728==(0|(Hl=a=268435455&Hl))&1<=(Gl=q[am>>2]|(0!=(q[16+am>>2]|q[24+am>>2])|0!=(q[20+am>>2]|q[28+am>>2])))>>>0|134217728<a>>>0?((a=$l+1|0)>>>0<1&&(_l=_l+1|0),$l=a):Gl|134217728^Hl||((a=$l+(1&$l)|0)>>>0<$l>>>0&&(_l=_l+1|0),$l=a))):($l=Hl<<4|Gl>>>28,_l=524287&(_l=Zl<<4|Hl>>>28)|2146959360),L=32+am|0,f(0,0|$l),f(1,-2147483648&Zl|_l),+g()}(q[Gl>>2],q[Gl+4>>2],q[Gl+8>>2],q[Gl+12>>2]),v[Cm>>3]=a},n[13]=function(a){return 0},n[14]=function(a,Gl,Cm){Gl|=0,Cm|=0;var Mm,Em,Dm=0,Jm=0,Km=0,Lm=0;for(L=Em=L-32|0,Dm=q[28+(a|=0)>>2],q[16+Em>>2]=Dm,Km=q[a+20>>2],q[28+Em>>2]=Cm,q[24+Em>>2]=Gl,Km=(q[20+Em>>2]=Gl=Km-Dm|0)+Cm|0,Lm=2,Gl=16+Em|0;;){a:{if((Jm=(Dm=0)|K(q[a+60>>2],0|Gl,0|Lm,12+Em|0))&&(q[2094]=Jm,Dm=-1),(0|(Dm=Dm?q[12+Em>>2]=-1:q[12+Em>>2]))==(0|Km))Gl=q[a+44>>2],q[a+28>>2]=Gl,q[a+20>>2]=Gl,q[a+16>>2]=Gl+q[a+48>>2],a=Cm;else{if(-1<(0|Dm))break a;q[a+28>>2]=0,q[a+16>>2]=0,q[a+20>>2]=0,q[a>>2]=32|q[a>>2],2!=((a=0)|Lm)&&(a=Cm-q[Gl+4>>2]|0)}return L=32+Em|0,0|a}Jm=q[Gl+4>>2],q[(Gl=(Mm=Jm>>>0<Dm>>>0)?Gl+8|0:Gl)>>2]=(Jm=Dm-(Mm?Jm:0)|0)+q[Gl>>2],q[Gl+4>>2]=q[Gl+4>>2]-Jm,Km=Km-Dm|0,Lm=Lm-Mm|0}},n[15]=function(a,Gl,Cm,Dm){return M=0},{d:function(){},e:function(){return q[1813]},f:function(){return 83951616},g:function(){return 5},h:function(a,tj){return tj|=0,L=tj=L-16|0,a=(a|=0)?sa(a)?(Y(4,2150,0),0):r[a+4|0]:(q[tj+4>>2]=1444,q[tj>>2]=2267,Y(4,1294,tj),0),L=tj+16|0,0|a},i:function(a,tj){var uj;return tj|=0,L=uj=L-48|0,a=(a|=0)?(a+63&-64)!=(0|a)?(q[36+uj>>2]=1522,q[32+uj>>2]=2284,Y(4,1294,32+uj|0),0):(tj+63&-64)==(0|tj)&&tj?function(a,Tk){var nl,Uk=0,Vk=0,Wk=0,Xk=0,Yk=0,Zk=0,_k=0,$k=0,al=0,bl=0,cl=0,dl=0,el=0,fl=0,gl=0,hl=0,il=0,jl=0,kl=0,ll=0,ml=0;L=Yk=(nl=Vk=L)-704&-64;a:if(Tk>>>0<=1343)Y(4,1235,0);else if(sa(a))Y(4,1469,0);else if(Vk=r[0|(ll=a+4|0)]){if(!(6<=Vk>>>0)){(hl=1==(0|!r[a+5|0]))||(da(ll,1),X(a- -64|0,4,160)),ca(Yk- -64|0,0,640),na(a,Yk- -64|0),Vk=a+Tk|0,Tk=q[Yk+64>>2];b:{c:{d:{if(5<=(gl=r[a+4|0])>>>0){if(Tk>>>0<a>>>0|Vk>>>0<Tk>>>0)break c;if((Xk=Tk+256|0)>>>0<a>>>0)break c;if(Xk>>>0<=Vk>>>0)break d;break c}if(Tk>>>0<a>>>0|Vk>>>0<Tk>>>0)break c;if((Xk=Tk+128|0)>>>0<a>>>0|Vk>>>0<Xk>>>0)break c}if(!((Wk=q[Yk+68>>2])>>>0<a>>>0|Vk>>>0<Wk>>>0|Wk>>>0<Xk>>>0||(Wk=Wk- -64|0)>>>0<a>>>0|Vk>>>0<Wk>>>0||(0|(bl=q[Tk>>2]))<0||(Xk=q[Yk+72>>2])>>>0<a>>>0|Vk>>>0<Xk>>>0|Xk>>>0<Wk>>>0||(Wk=(Uk=Xk)+(Xk=bl<<2)|0)>>>0<a>>>0|Vk>>>0<Wk>>>0||(_k=q[Yk+76>>2])>>>0<a>>>0|Vk>>>0<_k>>>0|_k>>>0<Wk>>>0||(Uk=(bl<<6)+_k|0)>>>0<a>>>0|Vk>>>0<Uk>>>0||(Wk=q[Yk+80>>2])>>>0<a>>>0|Vk>>>0<Wk>>>0|Wk>>>0<Uk>>>0||(Uk=Wk+Xk|0)>>>0<a>>>0|Vk>>>0<Uk>>>0||(Wk=q[Yk+84>>2])>>>0<a>>>0|Vk>>>0<Wk>>>0|Wk>>>0<Uk>>>0||(Uk=Wk+Xk|0)>>>0<a>>>0|Vk>>>0<Uk>>>0||(Wk=q[Yk+88>>2])>>>0<a>>>0|Vk>>>0<Wk>>>0|Wk>>>0<Uk>>>0||(Uk=Wk+Xk|0)>>>0<a>>>0|Vk>>>0<Uk>>>0||(Wk=q[Yk+92>>2])>>>0<a>>>0|Vk>>>0<Wk>>>0|Wk>>>0<Uk>>>0||(Uk=Wk+Xk|0)>>>0<a>>>0|Vk>>>0<Uk>>>0||(Wk=q[Yk+96>>2])>>>0<a>>>0|Vk>>>0<Wk>>>0|Wk>>>0<Uk>>>0||(Uk=Wk+Xk|0)>>>0<a>>>0|Vk>>>0<Uk>>>0||(Wk=q[Yk+100>>2])>>>0<a>>>0|Vk>>>0<Wk>>>0|Wk>>>0<Uk>>>0||(Wk=Wk+Xk|0)>>>0<a>>>0|Vk>>>0<Wk>>>0||(0|(Uk=q[Tk+4>>2]))<0||(Xk=q[Yk+104>>2])>>>0<a>>>0|Vk>>>0<Xk>>>0|Xk>>>0<Wk>>>0||(Zk=(Wk=Xk)+(Xk=Uk<<2)|0)>>>0<a>>>0|Vk>>>0<Zk>>>0||(Wk=q[Yk+108>>2])>>>0<a>>>0|Vk>>>0<Wk>>>0|Wk>>>0<Zk>>>0||(Uk=Wk+(Uk<<6)|0)>>>0<a>>>0|Vk>>>0<Uk>>>0||(Wk=q[Yk+112>>2])>>>0<a>>>0|Vk>>>0<Wk>>>0|Wk>>>0<Uk>>>0||(Uk=Wk+Xk|0)>>>0<a>>>0|Vk>>>0<Uk>>>0||(Wk=q[Yk+116>>2])>>>0<a>>>0|Vk>>>0<Wk>>>0|Wk>>>0<Uk>>>0||(Uk=Wk+Xk|0)>>>0<a>>>0|Vk>>>0<Uk>>>0||(Wk=q[Yk+120>>2])>>>0<a>>>0|Vk>>>0<Wk>>>0|Wk>>>0<Uk>>>0||(Uk=Wk+Xk|0)>>>0<a>>>0|Vk>>>0<Uk>>>0||(Wk=q[Yk+124>>2])>>>0<a>>>0|Vk>>>0<Wk>>>0|Wk>>>0<Uk>>>0||(Uk=Wk+Xk|0)>>>0<a>>>0|Vk>>>0<Uk>>>0||(Wk=q[Yk+128>>2])>>>0<a>>>0|Vk>>>0<Wk>>>0|Wk>>>0<Uk>>>0||(Uk=Wk+Xk|0)>>>0<a>>>0|Vk>>>0<Uk>>>0||(Wk=q[Yk+132>>2])>>>0<a>>>0|Vk>>>0<Wk>>>0|Wk>>>0<Uk>>>0||(Uk=Wk+Xk|0)>>>0<a>>>0|Vk>>>0<Uk>>>0||(Wk=q[Yk+136>>2])>>>0<a>>>0|Vk>>>0<Wk>>>0|Wk>>>0<Uk>>>0||(Wk=Wk+Xk|0)>>>0<a>>>0|Vk>>>0<Wk>>>0||(0|(Uk=q[Tk+8>>2]))<0||(Xk=q[Yk+140>>2])>>>0<a>>>0|Vk>>>0<Xk>>>0|Xk>>>0<Wk>>>0||(Wk=(cl=Uk<<2)+Xk|0)>>>0<a>>>0|Vk>>>0<Wk>>>0||(Xk=q[Yk+144>>2])>>>0<a>>>0|Vk>>>0<Xk>>>0|Xk>>>0<Wk>>>0||(Wk=Xk+cl|0)>>>0<a>>>0|Vk>>>0<Wk>>>0||(Xk=q[Yk+148>>2])>>>0<a>>>0|Vk>>>0<Xk>>>0|Xk>>>0<Wk>>>0||(Wk=Xk+cl|0)>>>0<a>>>0|Vk>>>0<Wk>>>0||(Xk=q[Yk+156>>2])>>>0<a>>>0|Vk>>>0<Xk>>>0|Xk>>>0<Wk>>>0||(Wk=Xk+cl|0)>>>0<a>>>0|Vk>>>0<Wk>>>0||(Xk=q[Yk+160>>2])>>>0<a>>>0|Vk>>>0<Xk>>>0|Xk>>>0<Wk>>>0||(Wk=Xk+cl|0)>>>0<a>>>0|Vk>>>0<Wk>>>0||(Xk=q[Yk+164>>2])>>>0<a>>>0|Vk>>>0<Xk>>>0|Xk>>>0<Wk>>>0||(Wk=Xk+cl|0)>>>0<a>>>0|Vk>>>0<Wk>>>0||(0|(Uk=q[Tk+12>>2]))<0||(Xk=q[Yk+172>>2])>>>0<a>>>0|Vk>>>0<Xk>>>0|Xk>>>0<Wk>>>0||(Wk=(dl=Uk<<2)+Xk|0)>>>0<a>>>0|Vk>>>0<Wk>>>0||(Xk=q[Yk+176>>2])>>>0<a>>>0|Vk>>>0<Xk>>>0|Xk>>>0<Wk>>>0||(Wk=Xk+dl|0)>>>0<a>>>0|Vk>>>0<Wk>>>0||(Xk=q[Yk+180>>2])>>>0<a>>>0|Vk>>>0<Xk>>>0|Xk>>>0<Wk>>>0||(Wk=Xk+dl|0)>>>0<a>>>0|Vk>>>0<Wk>>>0||(Xk=q[Yk+188>>2])>>>0<a>>>0|Vk>>>0<Xk>>>0|Xk>>>0<Wk>>>0||(Uk=Xk+dl|0)>>>0<a>>>0|Vk>>>0<Uk>>>0||(0|(Wk=q[Tk+16>>2]))<0||(Xk=q[Yk+192>>2])>>>0<a>>>0|Vk>>>0<Xk>>>0|Xk>>>0<Uk>>>0||(Zk=(Uk=Xk)+(Xk=Wk<<2)|0)>>>0<a>>>0|Vk>>>0<Zk>>>0||(Uk=q[Yk+196>>2])>>>0<a>>>0|Vk>>>0<Uk>>>0|Uk>>>0<Zk>>>0||(Zk=Uk+Xk|0)>>>0<a>>>0|Vk>>>0<Zk>>>0||(Uk=q[Yk+200>>2])>>>0<a>>>0|Vk>>>0<Uk>>>0|Uk>>>0<Zk>>>0||(Zk=Uk+Xk|0)>>>0<a>>>0|Vk>>>0<Zk>>>0||(Uk=q[Yk+204>>2])>>>0<a>>>0|Vk>>>0<Uk>>>0|Uk>>>0<Zk>>>0||(Zk=Uk+Xk|0)>>>0<a>>>0|Vk>>>0<Zk>>>0||(Uk=q[Yk+208>>2])>>>0<a>>>0|Vk>>>0<Uk>>>0|Uk>>>0<Zk>>>0||(Zk=Uk+(Wk<<6)|0)>>>0<a>>>0|Vk>>>0<Zk>>>0||(Uk=q[Yk+212>>2])>>>0<a>>>0|Vk>>>0<Uk>>>0|Uk>>>0<Zk>>>0||(Zk=Uk+Xk|0)>>>0<a>>>0|Vk>>>0<Zk>>>0||(Uk=q[Yk+216>>2])>>>0<a>>>0|Vk>>>0<Uk>>>0|Uk>>>0<Zk>>>0||(Zk=Uk+Xk|0)>>>0<a>>>0|Vk>>>0<Zk>>>0||(Uk=q[Yk+220>>2])>>>0<a>>>0|Vk>>>0<Uk>>>0|Uk>>>0<Zk>>>0||(Zk=Uk+Xk|0)>>>0<a>>>0|Vk>>>0<Zk>>>0||(Uk=q[Yk+228>>2])>>>0<a>>>0|Vk>>>0<Uk>>>0|Uk>>>0<Zk>>>0||(Zk=Uk+Xk|0)>>>0<a>>>0|Vk>>>0<Zk>>>0||(Uk=q[Yk+232>>2])>>>0<a>>>0|Vk>>>0<Uk>>>0|Uk>>>0<Zk>>>0||(Zk=Uk+Xk|0)>>>0<a>>>0|Vk>>>0<Zk>>>0||(Uk=q[Yk+236>>2])>>>0<a>>>0|Vk>>>0<Uk>>>0|Uk>>>0<Zk>>>0||(Zk=Uk+Xk|0)>>>0<a>>>0|Vk>>>0<Zk>>>0||(Uk=q[Yk+240>>2])>>>0<a>>>0|Vk>>>0<Uk>>>0|Uk>>>0<Zk>>>0||(Zk=Uk+Xk|0)>>>0<a>>>0|Vk>>>0<Zk>>>0||(Uk=q[Yk+244>>2])>>>0<a>>>0|Vk>>>0<Uk>>>0|Uk>>>0<Zk>>>0||(Zk=Uk+Xk|0)>>>0<a>>>0|Vk>>>0<Zk>>>0||(Uk=q[Yk+248>>2])>>>0<a>>>0|Vk>>>0<Uk>>>0|Uk>>>0<Zk>>>0||(Uk=Uk+Wk|0)>>>0<a>>>0|Vk>>>0<Uk>>>0||(Wk=q[Yk+252>>2])>>>0<a>>>0|Vk>>>0<Wk>>>0|Wk>>>0<Uk>>>0||(Uk=Wk+Xk|0)>>>0<a>>>0|Vk>>>0<Uk>>>0||(Wk=q[Yk+256>>2])>>>0<a>>>0|Vk>>>0<Wk>>>0|Wk>>>0<Uk>>>0||(Uk=Wk+Xk|0)>>>0<a>>>0|Vk>>>0<Uk>>>0||(Wk=q[Yk+260>>2])>>>0<a>>>0|Vk>>>0<Wk>>>0|Wk>>>0<Uk>>>0||(Uk=Wk+Xk|0)>>>0<a>>>0|Vk>>>0<Uk>>>0||(Wk=q[Yk+264>>2])>>>0<a>>>0|Vk>>>0<Wk>>>0|Wk>>>0<Uk>>>0||(Uk=Wk+Xk|0)>>>0<a>>>0|Vk>>>0<Uk>>>0||(Wk=q[Yk+268>>2])>>>0<a>>>0|Vk>>>0<Wk>>>0|Wk>>>0<Uk>>>0||(Uk=Wk+Xk|0)>>>0<a>>>0|Vk>>>0<Uk>>>0||(Wk=q[Yk+272>>2])>>>0<a>>>0|Vk>>>0<Wk>>>0|Wk>>>0<Uk>>>0||(Uk=Wk+Xk|0)>>>0<a>>>0|Vk>>>0<Uk>>>0||(0|(Zk=q[Tk+20>>2]))<0||(Wk=q[Yk+276>>2])>>>0<a>>>0|Vk>>>0<Wk>>>0|Wk>>>0<Uk>>>0||(el=(Uk=Wk)+(Wk=Zk<<2)|0)>>>0<a>>>0|Vk>>>0<el>>>0||(Uk=q[Yk+280>>2])>>>0<a>>>0|Vk>>>0<Uk>>>0|Uk>>>0<el>>>0||(Zk=Uk+(Zk<<6)|0)>>>0<a>>>0|Vk>>>0<Zk>>>0||(Uk=q[Yk+284>>2])>>>0<a>>>0|Vk>>>0<Uk>>>0|Uk>>>0<Zk>>>0||(Zk=Uk+Wk|0)>>>0<a>>>0|Vk>>>0<Zk>>>0||(Uk=q[Yk+288>>2])>>>0<a>>>0|Vk>>>0<Uk>>>0|Uk>>>0<Zk>>>0||(Zk=Uk+Wk|0)>>>0<a>>>0|Vk>>>0<Zk>>>0||(Uk=q[Yk+292>>2])>>>0<a>>>0|Vk>>>0<Uk>>>0|Uk>>>0<Zk>>>0||(Zk=Uk+Wk|0)>>>0<a>>>0|Vk>>>0<Zk>>>0||(Uk=q[Yk+296>>2])>>>0<a>>>0|Vk>>>0<Uk>>>0|Uk>>>0<Zk>>>0||(Zk=Uk+Wk|0)>>>0<a>>>0|Vk>>>0<Zk>>>0||(Uk=q[Yk+300>>2])>>>0<a>>>0|Vk>>>0<Uk>>>0|Uk>>>0<Zk>>>0||(Zk=Uk+Wk|0)>>>0<a>>>0|Vk>>>0<Zk>>>0||(Uk=q[Yk+308>>2])>>>0<a>>>0|Vk>>>0<Uk>>>0|Uk>>>0<Zk>>>0||(Zk=Uk+Wk|0)>>>0<a>>>0|Vk>>>0<Zk>>>0||(Uk=q[Yk+312>>2])>>>0<a>>>0|Vk>>>0<Uk>>>0|Uk>>>0<Zk>>>0||(Zk=Uk+Wk|0)>>>0<a>>>0|Vk>>>0<Zk>>>0||(0|(el=q[Tk+24>>2]))<0||(Uk=q[Yk+336>>2])>>>0<a>>>0|Vk>>>0<Uk>>>0|Uk>>>0<Zk>>>0||(Zk=Uk+(el<<2)|0)>>>0<a>>>0|Vk>>>0<Zk>>>0||(0|(el=q[Tk+28>>2]))<0||(Uk=q[Yk+340>>2])>>>0<a>>>0|Vk>>>0<Uk>>>0|Uk>>>0<Zk>>>0||(Zk=(jl=el<<2)+Uk|0)>>>0<a>>>0|Vk>>>0<Zk>>>0||(Uk=q[Yk+344>>2])>>>0<a>>>0|Vk>>>0<Uk>>>0|Uk>>>0<Zk>>>0||(Zk=Uk+jl|0)>>>0<a>>>0|Vk>>>0<Zk>>>0||(0|(el=q[Tk+32>>2]))<0||(Uk=q[Yk+356>>2])>>>0<a>>>0|Vk>>>0<Uk>>>0|Uk>>>0<Zk>>>0||(el=(Zk=el<<2)+Uk|0)>>>0<a>>>0|Vk>>>0<el>>>0||(Uk=q[Yk+360>>2])>>>0<a>>>0|Vk>>>0<Uk>>>0|Uk>>>0<el>>>0||(el=Uk+Zk|0)>>>0<a>>>0|Vk>>>0<el>>>0||(Uk=q[Yk+364>>2])>>>0<a>>>0|Vk>>>0<Uk>>>0|Uk>>>0<el>>>0||(el=Uk+Zk|0)>>>0<a>>>0|Vk>>>0<el>>>0||(Uk=q[Yk+368>>2])>>>0<a>>>0|Vk>>>0<Uk>>>0|Uk>>>0<el>>>0||(el=Uk+Zk|0)>>>0<a>>>0|Vk>>>0<el>>>0||(Uk=q[Yk+372>>2])>>>0<a>>>0|Vk>>>0<Uk>>>0|Uk>>>0<el>>>0||(el=Uk+Zk|0)>>>0<a>>>0|Vk>>>0<el>>>0||(Uk=q[Yk+376>>2])>>>0<a>>>0|Vk>>>0<Uk>>>0|Uk>>>0<el>>>0||(el=Uk+Zk|0)>>>0<a>>>0|Vk>>>0<el>>>0||(Uk=q[Yk+380>>2])>>>0<a>>>0|Vk>>>0<Uk>>>0|Uk>>>0<el>>>0||(el=Uk+Zk|0)>>>0<a>>>0|Vk>>>0<el>>>0||(0|($k=q[Tk+36>>2]))<0||(Uk=q[Yk+392>>2])>>>0<a>>>0|Vk>>>0<Uk>>>0|Uk>>>0<el>>>0||($k=(el=$k<<2)+Uk|0)>>>0<a>>>0|Vk>>>0<$k>>>0||(Uk=q[Yk+396>>2])>>>0<a>>>0|Vk>>>0<Uk>>>0|Uk>>>0<$k>>>0||($k=Uk+el|0)>>>0<a>>>0|Vk>>>0<$k>>>0||(Uk=q[Yk+400>>2])>>>0<a>>>0|Vk>>>0<Uk>>>0|Uk>>>0<$k>>>0||($k=Uk+el|0)>>>0<a>>>0|Vk>>>0<$k>>>0||(0|(al=q[Tk+40>>2]))<0||(Uk=q[Yk+412>>2])>>>0<a>>>0|Vk>>>0<Uk>>>0|Uk>>>0<$k>>>0||($k=Uk+(al<<2)|0)>>>0<a>>>0|Vk>>>0<$k>>>0||(0|(al=q[Tk+44>>2]))<0||(Uk=q[Yk+424>>2])>>>0<a>>>0|Vk>>>0<Uk>>>0|Uk>>>0<$k>>>0||($k=Uk+(al<<2)|0)>>>0<a>>>0|Vk>>>0<$k>>>0||(0|(al=q[Tk+48>>2]))<0||(Uk=q[Yk+428>>2])>>>0<a>>>0|Vk>>>0<Uk>>>0|Uk>>>0<$k>>>0||($k=(al<<=2)+Uk|0)>>>0<a>>>0|Vk>>>0<$k>>>0||(Uk=q[Yk+432>>2])>>>0<a>>>0|Vk>>>0<Uk>>>0|Uk>>>0<$k>>>0||($k=Uk+al|0)>>>0<a>>>0|Vk>>>0<$k>>>0||(0|(al=q[Tk+52>>2]))<0||(Uk=q[Yk+416>>2])>>>0<a>>>0|Vk>>>0<Uk>>>0|Uk>>>0<$k>>>0||($k=(al<<=2)+Uk|0)>>>0<a>>>0|Vk>>>0<$k>>>0||(Uk=q[Yk+420>>2])>>>0<a>>>0|Vk>>>0<Uk>>>0|Uk>>>0<$k>>>0||($k=Uk+al|0)>>>0<a>>>0|Vk>>>0<$k>>>0||(0|(al=q[Tk+56>>2]))<0||(Uk=q[Yk+552>>2])>>>0<a>>>0|Vk>>>0<Uk>>>0|Uk>>>0<$k>>>0||($k=Uk+(al<<2)|0)>>>0<a>>>0|Vk>>>0<$k>>>0||(0|(al=q[Tk+60>>2]))<0||(Uk=q[Yk+556>>2])>>>0<a>>>0|Vk>>>0<Uk>>>0|Uk>>>0<$k>>>0||($k=Uk+(al<<2)|0)>>>0<a>>>0|Vk>>>0<$k>>>0||(0|(al=q[Tk+64>>2]))<0||(Uk=q[Yk+560>>2])>>>0<a>>>0|Vk>>>0<Uk>>>0|Uk>>>0<$k>>>0||($k=Uk+(al<<1)|0)>>>0<a>>>0|Vk>>>0<$k>>>0||(0|(al=q[Tk+68>>2]))<0||(Uk=q[Yk+564>>2])>>>0<a>>>0|Vk>>>0<Uk>>>0|Uk>>>0<$k>>>0||($k=Uk+(al<<2)|0)>>>0<a>>>0|Vk>>>0<$k>>>0||(0|(al=q[Tk+72>>2]))<0||(Uk=q[Yk+568>>2])>>>0<a>>>0|Vk>>>0<Uk>>>0|Uk>>>0<$k>>>0||(al=($k=Uk)+(Uk=al<<2)|0)>>>0<a>>>0|Vk>>>0<al>>>0||($k=q[Yk+572>>2])>>>0<a>>>0|Vk>>>0<$k>>>0|$k>>>0<al>>>0||(al=Uk+$k|0)>>>0<a>>>0|Vk>>>0<al>>>0||($k=q[Yk+576>>2])>>>0<a>>>0|Vk>>>0<$k>>>0|$k>>>0<al>>>0||(al=Uk+$k|0)>>>0<a>>>0|Vk>>>0<al>>>0||($k=q[Yk+580>>2])>>>0<a>>>0|Vk>>>0<$k>>>0|$k>>>0<al>>>0||(al=Uk+$k|0)>>>0<a>>>0|Vk>>>0<al>>>0||($k=q[Yk+584>>2])>>>0<a>>>0|Vk>>>0<$k>>>0|$k>>>0<al>>>0||($k=Uk+$k|0)>>>0<a>>>0|Vk>>>0<$k>>>0||(0|(al=q[Tk+76>>2]))<0||(Uk=q[Yk+588>>2])>>>0<a>>>0|Vk>>>0<Uk>>>0|Uk>>>0<$k>>>0||(al=($k=al<<2)+Uk|0)>>>0<a>>>0|Vk>>>0<al>>>0||(Uk=q[Yk+592>>2])>>>0<a>>>0|Vk>>>0<Uk>>>0|Uk>>>0<al>>>0||(al=Uk+$k|0)>>>0<a>>>0|Vk>>>0<al>>>0||(Uk=q[Yk+596>>2])>>>0<a>>>0|Vk>>>0<Uk>>>0|Uk>>>0<al>>>0||($k=Uk+$k|0)>>>0<a>>>0|Vk>>>0<$k>>>0||(0|(al=q[Tk+80>>2]))<0||(Uk=q[Yk+600>>2])>>>0<a>>>0|Vk>>>0<Uk>>>0|Uk>>>0<$k>>>0||(fl=($k=Uk)+(Uk=al<<2)|0)>>>0<a>>>0|Vk>>>0<fl>>>0||($k=q[Yk+604>>2])>>>0<a>>>0|Vk>>>0<$k>>>0|$k>>>0<fl>>>0||(al=$k+(al<<6)|0)>>>0<a>>>0|Vk>>>0<al>>>0||($k=q[Yk+608>>2])>>>0<a>>>0|Vk>>>0<$k>>>0|$k>>>0<al>>>0||(al=Uk+$k|0)>>>0<a>>>0|Vk>>>0<al>>>0||($k=q[Yk+612>>2])>>>0<a>>>0|Vk>>>0<$k>>>0|$k>>>0<al>>>0||(al=Uk+$k|0)>>>0<a>>>0|Vk>>>0<al>>>0||($k=q[Yk+616>>2])>>>0<a>>>0|Vk>>>0<$k>>>0|$k>>>0<al>>>0||(al=Uk+$k|0)>>>0<a>>>0|Vk>>>0<al>>>0||($k=q[Yk+620>>2])>>>0<a>>>0|Vk>>>0<$k>>>0|$k>>>0<al>>>0||(al=Uk+$k|0)>>>0<a>>>0|Vk>>>0<al>>>0||($k=q[Yk+624>>2])>>>0<a>>>0|Vk>>>0<$k>>>0|$k>>>0<al>>>0||(al=Uk+$k|0)>>>0<a>>>0|Vk>>>0<al>>>0||($k=q[Yk+628>>2])>>>0<a>>>0|Vk>>>0<$k>>>0|$k>>>0<al>>>0||(al=Uk+$k|0)>>>0<a>>>0|Vk>>>0<al>>>0||($k=q[Yk+632>>2])>>>0<a>>>0|Vk>>>0<$k>>>0|$k>>>0<al>>>0||($k=Uk+$k|0)>>>0<a>>>0|Vk>>>0<$k>>>0||(0|(al=q[Tk+84>>2]))<0||(Uk=q[Yk+636>>2])>>>0<a>>>0|Vk>>>0<Uk>>>0|Uk>>>0<$k>>>0||($k=Uk+(al<<2)|0)>>>0<a>>>0|Vk>>>0<$k>>>0||(Uk=q[Yk+640>>2])>>>0<a>>>0|Vk>>>0<Uk>>>0|Uk>>>0<$k>>>0||($k=Uk+(al<<1)|0)>>>0<a>>>0|Vk>>>0<$k>>>0||(0|(al=q[Tk+88>>2]))<0||(Uk=q[Yk+644>>2])>>>0<a>>>0|Vk>>>0<Uk>>>0|Uk>>>0<$k>>>0||(Uk=Uk+(al<<2)|0)>>>0<a>>>0|Vk>>>0<Uk>>>0)){if(!(gl>>>0<2)){if(($k=q[Yk+168>>2])>>>0<a>>>0|Vk>>>0<$k>>>0|$k>>>0<Uk>>>0)break c;if((Uk=$k+cl|0)>>>0<a>>>0|Vk>>>0<Uk>>>0)break c;if(!(gl>>>0<4)){if(($k=q[Yk+324>>2])>>>0<a>>>0|Vk>>>0<$k>>>0|$k>>>0<Uk>>>0)break c;if(($k=Wk+$k|0)>>>0<a>>>0|Vk>>>0<$k>>>0)break c;if((Uk=q[Yk+328>>2])>>>0<a>>>0|Vk>>>0<Uk>>>0|Uk>>>0<$k>>>0)break c;if(($k=Uk+Wk|0)>>>0<a>>>0|Vk>>>0<$k>>>0)break c;if((Uk=q[Yk+332>>2])>>>0<a>>>0|Vk>>>0<Uk>>>0|Uk>>>0<$k>>>0)break c;if(($k=Uk+Wk|0)>>>0<a>>>0|Vk>>>0<$k>>>0)break c;if((Uk=q[Yk+152>>2])>>>0<a>>>0|Vk>>>0<Uk>>>0|Uk>>>0<$k>>>0)break c;if((cl=Uk+cl|0)>>>0<a>>>0|Vk>>>0<cl>>>0)break c;if((Uk=q[Yk+184>>2])>>>0<a>>>0|Vk>>>0<Uk>>>0|Uk>>>0<cl>>>0)break c;if((cl=Uk+dl|0)>>>0<a>>>0|Vk>>>0<cl>>>0)break c;if((Uk=q[Yk+224>>2])>>>0<a>>>0|Vk>>>0<Uk>>>0|Uk>>>0<cl>>>0)break c;if((Uk=Uk+Xk|0)>>>0<a>>>0|Vk>>>0<Uk>>>0)break c;if((0|(cl=q[Tk+92>>2]))<0)break c;if((Xk=q[Yk+648>>2])>>>0<a>>>0|Vk>>>0<Xk>>>0|Xk>>>0<Uk>>>0)break c;if((cl=(Uk=cl<<2)+Xk|0)>>>0<a>>>0|Vk>>>0<cl>>>0)break c;if((Xk=q[Yk+652>>2])>>>0<a>>>0|Vk>>>0<Xk>>>0|Xk>>>0<cl>>>0)break c;if((cl=Uk+Xk|0)>>>0<a>>>0|Vk>>>0<cl>>>0)break c;if((Xk=q[Yk+656>>2])>>>0<a>>>0|Vk>>>0<Xk>>>0|Xk>>>0<cl>>>0)break c;if((Uk=Uk+Xk|0)>>>0<a>>>0|Vk>>>0<Uk>>>0)break c;if((0|(cl=q[Tk+96>>2]))<0)break c;if((Xk=q[Yk+660>>2])>>>0<a>>>0|Vk>>>0<Xk>>>0|Xk>>>0<Uk>>>0)break c;if((cl=(Uk=cl<<2)+Xk|0)>>>0<a>>>0|Vk>>>0<cl>>>0)break c;if((Xk=q[Yk+664>>2])>>>0<a>>>0|Vk>>>0<Xk>>>0|Xk>>>0<cl>>>0)break c;if((cl=Uk+Xk|0)>>>0<a>>>0|Vk>>>0<cl>>>0)break c;if((Xk=q[Yk+668>>2])>>>0<a>>>0|Vk>>>0<Xk>>>0|Xk>>>0<cl>>>0)break c;if((Uk=Uk+Xk|0)>>>0<a>>>0|Vk>>>0<Uk>>>0)break c;if((Xk=q[Yk+304>>2])>>>0<a>>>0|Vk>>>0<Xk>>>0|Xk>>>0<Uk>>>0)break c;if((Uk=Wk+Xk|0)>>>0<a>>>0|Vk>>>0<Uk>>>0)break c;if((Xk=q[Yk+316>>2])>>>0<a>>>0|Vk>>>0<Xk>>>0|Xk>>>0<Uk>>>0)break c;if((Uk=Wk+Xk|0)>>>0<a>>>0|Vk>>>0<Uk>>>0)break c;if((Xk=q[Yk+320>>2])>>>0<a>>>0|Vk>>>0<Xk>>>0|Xk>>>0<Uk>>>0)break c;if((Wk=Wk+Xk|0)>>>0<a>>>0|Vk>>>0<Wk>>>0)break c;if((0|(Uk=q[Tk+100>>2]))<0)break c;if((Xk=q[Yk+436>>2])>>>0<a>>>0|Vk>>>0<Xk>>>0|Xk>>>0<Wk>>>0)break c;if((Uk=(Wk=Uk<<2)+Xk|0)>>>0<a>>>0|Vk>>>0<Uk>>>0)break c;if((Xk=q[Yk+440>>2])>>>0<a>>>0|Vk>>>0<Xk>>>0|Xk>>>0<Uk>>>0)break c;if((Uk=Wk+Xk|0)>>>0<a>>>0|Vk>>>0<Uk>>>0)break c;if((Xk=q[Yk+444>>2])>>>0<a>>>0|Vk>>>0<Xk>>>0|Xk>>>0<Uk>>>0)break c;if((Wk=Wk+Xk|0)>>>0<a>>>0|Vk>>>0<Wk>>>0)break c;if((0|(Uk=q[Tk+104>>2]))<0)break c;if((Xk=q[Yk+448>>2])>>>0<a>>>0|Vk>>>0<Xk>>>0|Xk>>>0<Wk>>>0)break c;if((Uk=(Wk=Xk)+(Xk=Uk<<2)|0)>>>0<a>>>0|Vk>>>0<Uk>>>0)break c;if((Wk=q[Yk+452>>2])>>>0<a>>>0|Vk>>>0<Wk>>>0|Wk>>>0<Uk>>>0)break c;if((Uk=Wk+Xk|0)>>>0<a>>>0|Vk>>>0<Uk>>>0)break c;if((Wk=q[Yk+456>>2])>>>0<a>>>0|Vk>>>0<Wk>>>0|Wk>>>0<Uk>>>0)break c;if((Uk=Wk+Xk|0)>>>0<a>>>0|Vk>>>0<Uk>>>0)break c;if((Wk=q[Yk+460>>2])>>>0<a>>>0|Vk>>>0<Wk>>>0|Wk>>>0<Uk>>>0)break c;if((Uk=Wk+Xk|0)>>>0<a>>>0|Vk>>>0<Uk>>>0)break c;if((Wk=q[Yk+464>>2])>>>0<a>>>0|Vk>>>0<Wk>>>0|Wk>>>0<Uk>>>0)break c;if((Wk=Wk+Xk|0)>>>0<a>>>0|Vk>>>0<Wk>>>0)break c;if((0|(Uk=q[Tk+108>>2]))<0)break c;if((Xk=q[Yk+480>>2])>>>0<a>>>0|Vk>>>0<Xk>>>0|Xk>>>0<Wk>>>0)break c;if((Uk=(Wk=Uk<<2)+Xk|0)>>>0<a>>>0|Vk>>>0<Uk>>>0)break c;if((Xk=q[Yk+484>>2])>>>0<a>>>0|Vk>>>0<Xk>>>0|Xk>>>0<Uk>>>0)break c;if((Uk=Wk+Xk|0)>>>0<a>>>0|Vk>>>0<Uk>>>0)break c;if((Xk=q[Yk+488>>2])>>>0<a>>>0|Vk>>>0<Xk>>>0|Xk>>>0<Uk>>>0)break c;if((Wk=Wk+Xk|0)>>>0<a>>>0|Vk>>>0<Wk>>>0)break c;if((0|(Uk=q[Tk+112>>2]))<0)break c;if((Xk=q[Yk+504>>2])>>>0<a>>>0|Vk>>>0<Xk>>>0|Xk>>>0<Wk>>>0)break c;if((Uk=(Wk=Uk<<2)+Xk|0)>>>0<a>>>0|Vk>>>0<Uk>>>0)break c;if((Xk=q[Yk+508>>2])>>>0<a>>>0|Vk>>>0<Xk>>>0|Xk>>>0<Uk>>>0)break c;if((Uk=Wk+Xk|0)>>>0<a>>>0|Vk>>>0<Uk>>>0)break c;if((Xk=q[Yk+512>>2])>>>0<a>>>0|Vk>>>0<Xk>>>0|Xk>>>0<Uk>>>0)break c;if((Wk=Wk+Xk|0)>>>0<a>>>0|Vk>>>0<Wk>>>0)break c;if((0|(Uk=q[Tk+116>>2]))<0)break c;if((Xk=q[Yk+528>>2])>>>0<a>>>0|Vk>>>0<Xk>>>0|Xk>>>0<Wk>>>0)break c;if((Wk=Xk+(Uk<<2)|0)>>>0<a>>>0|Vk>>>0<Wk>>>0)break c;if((0|(Uk=q[Tk+120>>2]))<0)break c;if((Xk=q[Yk+532>>2])>>>0<a>>>0|Vk>>>0<Xk>>>0|Xk>>>0<Wk>>>0)break c;if((Uk=(Wk=Uk<<2)+Xk|0)>>>0<a>>>0|Vk>>>0<Uk>>>0)break c;if((Xk=q[Yk+536>>2])>>>0<a>>>0|Vk>>>0<Xk>>>0|Xk>>>0<Uk>>>0)break c;if((Uk=Wk+Xk|0)>>>0<a>>>0|Vk>>>0<Uk>>>0)break c;if((Xk=q[Yk+540>>2])>>>0<a>>>0|Vk>>>0<Xk>>>0|Xk>>>0<Uk>>>0)break c;if((Wk=Wk+Xk|0)>>>0<a>>>0|Vk>>>0<Wk>>>0)break c;if((0|(Uk=q[Tk+124>>2]))<0)break c;if((Xk=q[Yk+544>>2])>>>0<a>>>0|Vk>>>0<Xk>>>0|Xk>>>0<Wk>>>0)break c;if((Wk=(Uk<<=2)+Xk|0)>>>0<a>>>0|Vk>>>0<Wk>>>0)break c;if((Xk=q[Yk+548>>2])>>>0<a>>>0|Vk>>>0<Xk>>>0|Xk>>>0<Wk>>>0)break c;if((Uk=Uk+Xk|0)>>>0<a>>>0|Vk>>>0<Uk>>>0)break c}}if(gl>>>0<5)break b;if(!((Xk=q[Yk+348>>2])>>>0<a>>>0|Vk>>>0<Xk>>>0|Xk>>>0<Uk>>>0||(Wk=Xk+jl|0)>>>0<a>>>0|Vk>>>0<Wk>>>0||(Xk=q[Yk+352>>2])>>>0<a>>>0|Vk>>>0<Xk>>>0|Xk>>>0<Wk>>>0||(Wk=Xk+jl|0)>>>0<a>>>0|Vk>>>0<Wk>>>0||(Xk=q[Yk+384>>2])>>>0<a>>>0|Vk>>>0<Xk>>>0|Xk>>>0<Wk>>>0||(Wk=Xk+Zk|0)>>>0<a>>>0|Vk>>>0<Wk>>>0||(Xk=q[Yk+388>>2])>>>0<a>>>0|Vk>>>0<Xk>>>0|Xk>>>0<Wk>>>0||(Wk=Xk+Zk|0)>>>0<a>>>0|Vk>>>0<Wk>>>0||(Xk=q[Yk+404>>2])>>>0<a>>>0|Vk>>>0<Xk>>>0|Xk>>>0<Wk>>>0||(Wk=Xk+el|0)>>>0<a>>>0|Vk>>>0<Wk>>>0||(Xk=q[Yk+408>>2])>>>0<a>>>0|Vk>>>0<Xk>>>0|Xk>>>0<Wk>>>0||(Wk=Xk+el|0)>>>0<a>>>0|Vk>>>0<Wk>>>0||(0|(Uk=q[Tk+128>>2]))<0||(Xk=q[Yk+468>>2])>>>0<a>>>0|Vk>>>0<Xk>>>0|Xk>>>0<Wk>>>0||(Uk=(Wk=Uk<<2)+Xk|0)>>>0<a>>>0|Vk>>>0<Uk>>>0||(Xk=q[Yk+472>>2])>>>0<a>>>0|Vk>>>0<Xk>>>0|Xk>>>0<Uk>>>0||(Uk=Wk+Xk|0)>>>0<a>>>0|Vk>>>0<Uk>>>0||(Xk=q[Yk+476>>2])>>>0<a>>>0|Vk>>>0<Xk>>>0|Xk>>>0<Uk>>>0||(Wk=Wk+Xk|0)>>>0<a>>>0|Vk>>>0<Wk>>>0||(0|(Uk=q[Tk+132>>2]))<0||(Xk=q[Yk+492>>2])>>>0<a>>>0|Vk>>>0<Xk>>>0|Xk>>>0<Wk>>>0||(Uk=(Wk=Uk<<2)+Xk|0)>>>0<a>>>0|Vk>>>0<Uk>>>0||(Xk=q[Yk+496>>2])>>>0<a>>>0|Vk>>>0<Xk>>>0|Xk>>>0<Uk>>>0||(Uk=Wk+Xk|0)>>>0<a>>>0|Vk>>>0<Uk>>>0||(Xk=q[Yk+500>>2])>>>0<a>>>0|Vk>>>0<Xk>>>0|Xk>>>0<Uk>>>0||(Wk=Wk+Xk|0)>>>0<a>>>0|Vk>>>0<Wk>>>0||(0|(Uk=q[Tk+136>>2]))<0||(Xk=q[Yk+516>>2])>>>0<a>>>0|Vk>>>0<Xk>>>0|Xk>>>0<Wk>>>0||(Uk=(Wk=Uk<<2)+Xk|0)>>>0<a>>>0|Vk>>>0<Uk>>>0||(Xk=q[Yk+520>>2])>>>0<a>>>0|Vk>>>0<Xk>>>0|Xk>>>0<Uk>>>0||(Uk=Wk+Xk|0)>>>0<a>>>0|Vk>>>0<Uk>>>0||(Xk=q[Yk+524>>2])>>>0<a>>>0|Vk>>>0<Xk>>>0|Xk>>>0<Uk>>>0||(Xk=Wk+Xk|0)>>>0<a>>>0)&&Xk>>>0<=Vk>>>0)break b}}Y(4,1760,0),da(ll,1),X(a- -64|0,4,160);break a}hl||(ya(a),o[a+5|0]=0,Tk=q[Yk+64>>2],bl=q[Tk>>2],_k=q[Yk+76>>2],gl=r[a+4|0]);f:{if((a=0)<(0|bl)){for(;;){if(63<ia((a<<6)+_k|0)>>>0)break f;if((0|bl)==(0|(a=a+1|0)))break}if(Uk=Tk+48|0,(Vk=0)<(0|(a=q[Tk>>2]))){for(Xk=q[Tk+48>>2],Wk=q[Yk+80>>2];;){if((0|(_k=q[Wk+(Vk<<2)>>2]))<0|(0|Xk)<=(0|_k))break f;if((0|a)==(0|(Vk=Vk+1|0)))break}for(el=Tk+24|0,Xk=q[Tk+24>>2],Zk=q[Yk+88>>2],bl=q[Yk+84>>2],Vk=0;;){if(Wk=q[(_k=Vk<<2)+Zk>>2]){if((0|Wk)<0|(0|Xk)<(0|Wk))break f;if((0|(_k=q[_k+bl>>2]))<0|(0|Xk)<=(0|_k))break f;if((Wk=Wk+_k|0)>>>31|(0|Xk)<(0|Wk))break f}if((0|a)==(0|(Vk=Vk+1|0)))break}for(Vk=0,Xk=q[Yk+92>>2];;){if(1<t[Xk+(Vk<<2)>>2])break f;if((0|a)==(0|(Vk=Vk+1|0)))break}for(Vk=0,Xk=q[Yk+96>>2];;){if(1<t[Xk+(Vk<<2)>>2])break f;if((0|a)==(0|(Vk=Vk+1|0)))break}for(Vk=0,Xk=q[Yk+100>>2];;){if((0|(Wk=q[Xk+(Vk<<2)>>2]))<-1|(0|a)<=(0|Wk))break f;if((0|a)==(0|(Vk=Vk+1|0)))break}}else el=Tk+24|0}else el=Tk+24|0,Uk=Tk+48|0;if((a=0)<(0|(Vk=q[Tk+4>>2]))){for(Xk=q[Yk+108>>2];;){if(63<ia(Xk+(a<<6)|0)>>>0)break f;if((0|Vk)==(0|(a=a+1|0)))break}if(Zk=(Xk=q[Tk+48>>2])+-1|0,!(((Vk=0)|(a=q[Tk+4>>2]))<=0)){for(Wk=q[Yk+112>>2];;){if((0|(_k=q[Wk+(Vk<<2)>>2]))<0|(0|Xk)<=(0|_k))break f;if((0|a)==(0|(Vk=Vk+1|0)))break}for(Vk=0,Xk=q[Yk+116>>2];;){if(1<t[Xk+(Vk<<2)>>2])break f;if((0|a)==(0|(Vk=Vk+1|0)))break}for(Vk=0,Xk=q[Yk+120>>2];;){if(1<t[Xk+(Vk<<2)>>2])break f;if((0|a)==(0|(Vk=Vk+1|0)))break}for(Xk=q[Tk>>2],Vk=0,Wk=q[Yk+124>>2];;){if((0|(_k=q[Wk+(Vk<<2)>>2]))<-1|(0|Xk)<=(0|_k))break f;if((0|a)==(0|(Vk=Vk+1|0)))break}for(Vk=0,Xk=q[Yk+128>>2];;){if((0|(Wk=q[Xk+(Vk<<2)>>2]))<-1|(0|a)<=(0|Wk))break f;if((0|a)==(0|(Vk=Vk+1|0)))break}for(Vk=0,Xk=q[Yk+132>>2];;){if(1<t[Xk+(Vk<<2)>>2])break f;if((0|a)==(0|(Vk=Vk+1|0)))break}for(Wk=Tk+8|0,_k=Tk+12|0,bl=q[Yk+136>>2],Vk=0;;){if(1<(dl=q[(cl=Vk<<2)+Xk>>2])>>>0)break f;if((0|(cl=q[bl+cl>>2]))<0|(0|cl)>=q[(dl-1|0?Wk:_k)>>2])break f;if((0|a)==(0|(Vk=Vk+1|0)))break}}}else Zk=q[Uk>>2]+-1|0;if((a=0)<(0|(Vk=q[Tk+8>>2]))){for(Xk=q[Yk+140>>2];;){if((0|(Wk=q[Xk+(a<<2)>>2]))<0|(0|Zk)<(0|Wk))break f;if((0|Vk)==(0|(a=a+1|0)))break}for(jl=Tk+28|0,Xk=q[Tk+28>>2],bl=q[Yk+148>>2],cl=q[Yk+144>>2],a=0;;){if(Wk=q[(_k=a<<2)+bl>>2]){if((0|Wk)<0|(0|Xk)<(0|Wk))break f;if((0|(_k=q[_k+cl>>2]))<0|(0|Xk)<=(0|_k))break f;if((Wk=Wk+_k|0)>>>31|(0|Xk)<(0|Wk))break f}if((0|Vk)==(0|(a=a+1|0)))break}for(a=0,Wk=q[Yk+156>>2],_k=q[Yk+164>>2],bl=q[Yk+160>>2];;){if((0|(cl=q[(Xk=a<<2)+bl>>2]))<1)break f;if((0|(dl=q[Xk+_k>>2]))<1)break f;if((0|(Xk=q[Wk+Xk>>2]))<1|(0|Xk)!=(0|w(dl+1|0,cl+1|0)))break f;if((0|Vk)==(0|(a=a+1|0)))break}}else jl=Tk+28|0;if((a=0)<(0|(Wk=q[Tk+12>>2]))){for(Vk=q[Yk+172>>2];;){if((0|(Xk=q[Vk+(a<<2)>>2]))<0|(0|Zk)<(0|Xk))break f;if((0|Wk)==(0|(a=a+1|0)))break}for($k=Tk+32|0,Vk=q[Tk+32>>2],Zk=q[Yk+180>>2],bl=q[Yk+176>>2],a=0;;){if(Xk=q[(_k=a<<2)+Zk>>2]){if((0|Xk)<0|(0|Vk)<(0|Xk))break f;if((0|(_k=q[_k+bl>>2]))<0|(0|Vk)<=(0|_k))break f;if((Xk=Xk+_k|0)>>>31|(0|Vk)<(0|Xk))break f}if((0|Wk)==(0|(a=a+1|0)))break}}else $k=Tk+32|0;Xk=Tk+16|0;m:{n:{if(!(((a=0)|(Vk=q[Tk+16>>2]))<=0)){for(Wk=q[Yk+208>>2];;){if(63<ia(Wk+(a<<6)|0)>>>0)break f;if((0|Vk)==(0|(a=a+1|0)))break}if(!(((Vk=0)|(a=q[Xk>>2]))<=0)){for(Wk=q[Uk>>2],_k=q[Yk+212>>2];;){if((0|(Zk=q[_k+(Vk<<2)>>2]))<0|(0|Wk)<=(0|Zk))break f;if((0|a)==(0|(Vk=Vk+1|0)))break}for(ll=Tk+36|0,Wk=q[Tk+36>>2],bl=q[Yk+220>>2],cl=q[Yk+216>>2],Vk=0;;){if(_k=q[(Zk=Vk<<2)+bl>>2]){if((0|_k)<0|(0|Wk)<(0|_k))break f;if((0|(Zk=q[Zk+cl>>2]))<0|(0|Wk)<=(0|Zk))break f;if((_k=_k+Zk|0)>>>31|(0|Wk)<(0|_k))break f}if((0|a)==(0|(Vk=Vk+1|0)))break}for(Vk=0,Wk=q[Yk+228>>2];;){if(1<t[Wk+(Vk<<2)>>2])break f;if((0|a)==(0|(Vk=Vk+1|0)))break}for(Vk=0,Wk=q[Yk+232>>2];;){if(1<t[Wk+(Vk<<2)>>2])break f;if((0|a)==(0|(Vk=Vk+1|0)))break}for(Wk=q[Tk>>2],Vk=0,_k=q[Yk+236>>2];;){if((0|(Zk=q[_k+(Vk<<2)>>2]))<-1|(0|Wk)<=(0|Zk))break f;if((0|a)==(0|(Vk=Vk+1|0)))break}for(Wk=q[Tk+4>>2],Vk=0,_k=q[Yk+240>>2];;){if((0|(Zk=q[_k+(Vk<<2)>>2]))<-1|(0|Wk)<=(0|Zk))break f;if((0|a)==(0|(Vk=Vk+1|0)))break}for(Wk=q[Yk+244>>2],Vk=0;;){if(q[Wk+(Vk<<2)>>2]<0)break f;if((0|a)==(0|(Vk=Vk+1|0)))break}break n}}_k=Tk+68|0,ll=Tk+36|0;break m}for(Wk=q[Yk+252>>2],Vk=0;;){if(q[Wk+(Vk<<2)>>2]<0)break f;if((0|a)==(0|(Vk=Vk+1|0)))break}for(_k=q[Tk+60>>2],Vk=0,Zk=q[Yk+256>>2];;){if((bl=q[(bl=Vk<<2)+Zk>>2]+(q[Wk+bl>>2]<<1)|0)>>>31|(0|_k)<(0|bl))break f;if((0|a)==(0|(Vk=Vk+1|0)))break}for(Wk=q[Tk+64>>2],bl=q[Yk+264>>2],cl=q[Yk+260>>2],Vk=0;;){if(_k=q[(Zk=Vk<<2)+bl>>2]){if((0|_k)<0|(0|Wk)<(0|_k))break f;if((0|(Zk=q[Zk+cl>>2]))<0|(0|Wk)<=(0|Zk))break f;if((_k=_k+Zk|0)>>>31|(0|Wk)<(0|_k))break f}if((0|a)==(0|(Vk=Vk+1|0)))break}for(_k=Tk+68|0,Wk=q[Tk+68>>2],cl=q[Yk+272>>2],dl=q[Yk+268>>2],Vk=0;;){if(Zk=q[(bl=Vk<<2)+cl>>2]){if((0|Zk)<0|(0|Wk)<(0|Zk))break f;if((0|(bl=q[bl+dl>>2]))<0|(0|Wk)<=(0|bl))break f;if((Zk=Zk+bl|0)>>>31|(0|Wk)<(0|Zk))break f}if((0|a)==(0|(Vk=Vk+1|0)))break}}p:{q:{if(!(((a=0)|(Vk=q[Tk+20>>2]))<=0)){for(Wk=q[Yk+280>>2];;){if(63<ia(Wk+(a<<6)|0)>>>0)break f;if((0|Vk)==(0|(a=a+1|0)))break}if(!(((a=0)|(Vk=q[Tk+20>>2]))<=0)){for(Wk=q[Yk+296>>2];;){if(1<t[Wk+(a<<2)>>2])break f;if((0|Vk)==(0|(a=a+1|0)))break}for(Wk=q[Yk+300>>2],a=0;;){if(q[Wk+(a<<2)>>2]<0)break f;if((0|Vk)==(0|(a=a+1|0)))break}break q}}a=q[Tk+52>>2];break p}for(a=q[Tk+52>>2],cl=q[Yk+312>>2],dl=q[Yk+308>>2],Zk=0;;){if(Wk=q[(bl=Zk<<2)+cl>>2]){if((0|Wk)<0|(0|a)<(0|Wk))break f;if((0|(bl=q[bl+dl>>2]))<0|(0|a)<=(0|bl))break f;if((Wk=Wk+bl|0)>>>31|(0|a)<(0|Wk))break f}if((0|Vk)==(0|(Zk=Zk+1|0)))break}}if(Wk=q[Tk+40>>2],(Vk=0)<(0|(Zk=q[Tk+8>>2])))for(bl=q[Yk+344>>2],cl=q[Yk+156>>2];;){if((dl=q[(dl=Vk<<2)+bl>>2]+(q[cl+dl>>2]<<1)|0)>>>31|(0|Wk)<(0|dl))break f;if((0|Zk)==(0|(Vk=Vk+1|0)))break}if((Vk=0)<(0|(Zk=q[$k>>2]))){for(bl=q[Yk+376>>2];;){if(1<t[bl+(Vk<<2)>>2])break f;if((0|Zk)==(0|(Vk=Vk+1|0)))break}for(Vk=0,bl=q[Yk+380>>2];;){if(1<t[bl+(Vk<<2)>>2])break f;if((0|Zk)==(0|(Vk=Vk+1|0)))break}}if((Vk=0)<(0|(Zk=q[Xk>>2])))for(bl=q[Yk+400>>2],cl=q[Yk+252>>2];;){if((dl=q[(dl=Vk<<2)+bl>>2]+(q[cl+dl>>2]<<1)|0)>>>31|(0|Wk)<(0|dl))break f;if((0|Zk)==(0|(Vk=Vk+1|0)))break}if((Vk=0)<(0|(Wk=q[Tk+44>>2])))for(bl=q[Yk+424>>2];;){if((0|(cl=q[bl+(Vk<<2)>>2]))<0|(0|a)<=(0|cl))break f;if((0|Wk)==(0|(Vk=Vk+1|0)))break}if(1<=(0|(cl=q[Uk>>2])))for(Vk=0,dl=q[Yk+432>>2],al=q[Yk+428>>2];;){if(Uk=q[(bl=Vk<<2)+dl>>2]){if((0|Uk)<0|(0|Wk)<(0|Uk))break f;if((0|(bl=q[al+bl>>2]))<0|(0|Wk)<=(0|bl))break f;if((Uk=Uk+bl|0)>>>31|(0|Wk)<(0|Uk))break f}if((0|cl)==(0|(Vk=Vk+1|0)))break}if(1<=(0|a))for(Wk=q[Tk+56>>2],Vk=0,cl=q[Yk+420>>2],dl=q[Yk+416>>2];;){if(Uk=q[(bl=Vk<<2)+cl>>2]){if((0|Uk)<0|(0|Wk)<(0|Uk))break f;if((0|(bl=q[bl+dl>>2]))<0|(0|Wk)<=(0|bl))break f;if((Uk=Uk+bl|0)>>>31|(0|Wk)<(0|Uk))break f}if((0|(Vk=Vk+1|0))==(0|a))break}if((a=0)<(0|(Vk=q[_k>>2])))for(Wk=q[Yk+564>>2];;){if((0|(_k=q[Wk+(a<<2)>>2]))<-1|(0|Zk)<=(0|_k))break f;if((0|Vk)==(0|(a=a+1|0)))break}if(a=q[Tk+76>>2],1<=(0|(_k=q[Tk+72>>2])))for(Vk=0,Zk=q[Yk+572>>2],bl=q[Yk+568>>2];;){if(Wk=q[(Uk=Vk<<2)+Zk>>2]){if((0|Wk)<0|(0|a)<(0|Wk))break f;if((0|(Uk=q[Uk+bl>>2]))<0|(0|a)<=(0|Uk))break f;if((Wk=Uk+Wk|0)>>>31|(0|a)<(0|Wk))break f}if((0|_k)==(0|(Vk=Vk+1|0)))break}if((Vk=0)<(0|a)){for(Wk=q[Yk+588>>2];;){if(1<t[Wk+(Vk<<2)>>2])break f;if((0|a)==(0|(Vk=Vk+1|0)))break}for(Uk=q[Yk+592>>2],Vk=0;;){if(1<(bl=q[(Zk=Vk<<2)+Wk>>2])>>>0)break f;if((0|(Zk=q[Uk+Zk>>2]))<0|(0|Zk)>=q[(bl-1|0?Xk:Tk)>>2])break f;if((0|a)==(0|(Vk=Vk+1|0)))break}for(Vk=0,Wk=q[Yk+596>>2];;){if((0|(Uk=q[Wk+(Vk<<2)>>2]))<-1|(0|_k)<=(0|Uk))break f;if((0|a)==(0|(Vk=Vk+1|0)))break}}s:{if(!(((a=0)|(Zk=q[Tk+80>>2]))<=0)){for(Vk=q[Yk+604>>2];;){if(63<ia(Vk+(a<<6)|0)>>>0)break f;if((0|Zk)==(0|(a=a+1|0)))break}if(!(((a=0)|(Zk=q[Tk+80>>2]))<=0)){for(Vk=q[Tk+48>>2],Wk=q[Yk+608>>2];;){if((0|(_k=q[Wk+(a<<2)>>2]))<0|(0|Vk)<=(0|_k))break f;if((0|Zk)==(0|(a=a+1|0)))break}for(cl=q[Tk+88>>2],_k=q[Yk+616>>2],Uk=q[Yk+612>>2],a=0;;){if(Vk=q[(Wk=a<<2)+_k>>2]){if((0|Vk)<0|(0|cl)<(0|Vk))break f;if((0|(Wk=q[Uk+Wk>>2]))<0|(0|cl)<=(0|Wk))break f;if((Vk=Vk+Wk|0)>>>31|(0|cl)<(0|Vk))break f}if((0|Zk)==(0|(a=a+1|0)))break}for(Xk=q[Xk>>2],_k=q[Yk+620>>2],a=0;;){if((0|(Vk=q[_k+(a<<2)>>2]))<0|(0|Xk)<=(0|Vk))break f;if((0|Zk)==(0|(a=a+1|0)))break}for(Uk=q[Yk+624>>2],a=0;;){if((0|(Vk=q[Uk+(a<<2)>>2]))<0|(0|Xk)<=(0|Vk))break f;if((0|Zk)==(0|(a=a+1|0)))break}for(Vk=q[Tk+84>>2],bl=q[Yk+632>>2],dl=q[Yk+628>>2],a=0;;){if(Wk=q[(al=a<<2)+bl>>2]){if((0|Wk)<0|(0|Vk)<(0|Wk))break f;if((0|(al=q[al+dl>>2]))<0|(0|Vk)<=(0|al))break f;if((Wk=Wk+al|0)>>>31|(0|Vk)<(0|Wk))break f}if((0|Zk)==(0|(a=a+1|0)))break}for(fl=q[Yk+640>>2],Vk=q[Yk+252>>2],Wk=0;;){if(0<(0|(hl=q[(a=Wk<<2)+bl>>2])))for(al=fl+(q[a+dl>>2]<<1)|0,ml=q[Vk+(q[a+Uk>>2]<<2)>>2],il=q[Vk+(q[a+_k>>2]<<2)>>2],a=0;;){if((0|ml)<=s[al+(2|(kl=a<<1))>>1]|(0|il)<=s[al+kl>>1])break f;if(!((0|(a=a+2|0))<(0|hl)))break}if((0|Zk)==(0|(Wk=Wk+1|0)))break}break s}}Xk=q[Tk+16>>2],cl=q[Tk+88>>2]}if(!((255&gl)>>>0<2)){if((a=0)<(0|(bl=q[Tk+8>>2])))for(Vk=q[Yk+168>>2];;){if(1<t[Vk+(a<<2)>>2])break f;if((0|bl)==(0|(a=a+1|0)))break}if(!((255&gl)>>>0<4)){if(_k=q[Tk+56>>2],1<=(0|(dl=q[Tk+20>>2])))for(Uk=q[Yk+332>>2],al=q[Yk+328>>2],a=0;;){if(Vk=q[(Wk=a<<2)+Uk>>2]){if((0|Vk)<0|(0|_k)<(0|Vk))break f;if((0|(Wk=q[Wk+al>>2]))<0|(0|_k)<=(0|Wk))break f;if((Vk=Vk+Wk|0)>>>31|(0|_k)<(0|Vk))break f}if((0|dl)==(0|(a=a+1|0)))break}if((0|(a=q[Tk+92>>2]))!=q[Tk+96>>2])break f;if(1<=(0|bl))for(al=q[Yk+152>>2],Vk=0,fl=q[Yk+148>>2];;){if(Wk=q[(Uk=Vk<<2)+fl>>2]){if((0|Wk)<0|(0|a)<(0|Wk))break f;if((0|(Uk=q[Uk+al>>2]))<0|(0|a)<=(0|Uk))break f;if((Wk=Uk+Wk|0)>>>31|(0|a)<(0|Wk))break f}if((0|bl)==(0|(Vk=Vk+1|0)))break}if(1<=(0|(ml=q[Tk+12>>2])))for(al=q[Yk+184>>2],Vk=0,fl=q[Yk+180>>2];;){if(Wk=q[(Uk=Vk<<2)+fl>>2]){if((0|Wk)<0|(0|a)<(0|Wk))break f;if((0|(Uk=q[Uk+al>>2]))<0|(0|a)<=(0|Uk))break f;if((Wk=Uk+Wk|0)>>>31|(0|a)<(0|Wk))break f}if((0|ml)==(0|(Vk=Vk+1|0)))break}if(1<=(0|Xk))for(al=q[Yk+224>>2],Vk=0,fl=q[Yk+220>>2];;){if(Wk=q[(Uk=Vk<<2)+fl>>2]){if((0|Wk)<0|(0|a)<(0|Wk))break f;if((0|(Uk=q[Uk+al>>2]))<0|(0|a)<=(0|Uk))break f;if((Wk=Uk+Wk|0)>>>31|(0|a)<(0|Wk))break f}if((0|Xk)==(0|(Vk=Vk+1|0)))break}if((Vk=0)<(0|dl)){for(Wk=q[Yk+304>>2];;){if(1<t[Wk+(Vk<<2)>>2])break f;if((0|dl)==(0|(Vk=Vk+1|0)))break}for(Wk=q[Tk+100>>2],fl=q[Yk+320>>2],hl=q[Yk+316>>2],Vk=0;;){if(Uk=q[(al=Vk<<2)+fl>>2]){if((0|Uk)<0|(0|Wk)<(0|Uk))break f;if((0|(al=q[al+hl>>2]))<0|(0|Wk)<=(0|al))break f;if((Uk=Uk+al|0)>>>31|(0|Wk)<(0|Uk))break f}if((0|dl)==(0|(Vk=Vk+1|0)))break}}else Wk=q[Tk+100>>2];if(1<=(0|Wk)){for(al=q[Yk+440>>2],Vk=0,hl=q[Yk+436>>2];;){if(Uk=q[(fl=Vk<<2)+al>>2]){if((0|Uk)<0|(0|_k)<(0|Uk))break f;if((0|(fl=q[fl+hl>>2]))<0|(0|_k)<=(0|fl))break f;if((Uk=Uk+fl|0)>>>31|(0|_k)<(0|Uk))break f}if((0|Wk)==(0|(Vk=Vk+1|0)))break}for(_k=q[Yk+444>>2],Vk=0;;){if((0|(fl=q[(Uk=Vk<<2)+_k>>2]))<0|(0|fl)>=q[Uk+al>>2])break f;if((0|Wk)==(0|(Vk=Vk+1|0)))break}}if((_k=0)<(0|(Vk=q[Tk+104>>2]))){for(Uk=q[Yk+448>>2];;){if((0|(al=q[Uk+(_k<<2)>>2]))<0|(0|Wk)<=(0|al))break f;if((0|Vk)==(0|(_k=_k+1|0)))break}for(Uk=q[Tk+116>>2],fl=q[Yk+464>>2],hl=q[Yk+460>>2],Wk=0;;){if(_k=q[(al=Wk<<2)+fl>>2]){if((0|_k)<0|(0|Uk)<(0|_k))break f;if((0|(al=q[al+hl>>2]))<0|(0|Uk)<=(0|al))break f;if((_k=_k+al|0)>>>31|(0|Uk)<(0|_k))break f}if((0|Vk)==(0|(Wk=Wk+1|0)))break}}else Uk=q[Tk+116>>2];if((Wk=0)<(0|(al=q[Tk+108>>2]))){for(_k=q[Yk+480>>2];;){if((0|(fl=q[_k+(Wk<<2)>>2]))<0|(0|bl)<=(0|fl))break f;if((0|al)==(0|(Wk=Wk+1|0)))break}for(fl=q[Yk+488>>2],il=q[Yk+484>>2],Wk=0;;){if(_k=q[(bl=Wk<<2)+fl>>2]){if((0|_k)<0|(0|Vk)<(0|_k))break f;if((0|(bl=q[bl+il>>2]))<0|(0|Vk)<=(0|bl))break f;if((_k=_k+bl|0)>>>31|(0|Vk)<(0|_k))break f}if((0|al)==(0|(Wk=Wk+1|0)))break}for(fl=q[jl>>2],Wk=q[Yk+456>>2],bl=q[Yk+452>>2],_k=0;;){if(kl=q[il+(_k<<2)>>2]<<2,hl=q[kl+Wk>>2]){if((0|hl)<0|(0|fl)<(0|hl))break f;if((0|(kl=q[bl+kl>>2]))<0|(0|fl)<=(0|kl))break f;if((0|(hl=hl+kl|0))<0|(0|fl)<(0|hl))break f}if((0|al)==(0|(_k=_k+1|0)))break}}else Wk=q[Yk+456>>2],bl=q[Yk+452>>2];if((_k=0)<(0|(al=q[Tk+112>>2]))){for(fl=q[Yk+504>>2];;){if((0|(hl=q[fl+(_k<<2)>>2]))<0|(0|Xk)<=(0|hl))break f;if((0|al)==(0|(_k=_k+1|0)))break}for(il=q[Yk+512>>2],hl=q[Yk+508>>2],Xk=0;;){if(_k=q[(fl=Xk<<2)+il>>2]){if((0|_k)<0|(0|Vk)<(0|_k))break f;if((0|(fl=q[fl+hl>>2]))<0|(0|Vk)<=(0|fl))break f;if((_k=_k+fl|0)>>>31|(0|Vk)<(0|_k))break f}if((0|al)==(0|(Xk=Xk+1|0)))break}for(_k=q[ll>>2],Xk=0;;){if(il=q[hl+(Xk<<2)>>2]<<2,fl=q[il+Wk>>2]){if((0|fl)<0|(0|_k)<(0|fl))break f;if((0|(il=q[bl+il>>2]))<0|(0|_k)<=(0|il))break f;if((0|(fl=fl+il|0))<0|(0|_k)<(0|fl))break f}if((0|al)==(0|(Xk=Xk+1|0)))break}}if(_k=q[Tk+120>>2],(Xk=0)<(0|Uk))for(al=q[Yk+528>>2];;){if((0|(fl=q[al+(Xk<<2)>>2]))<0|(0|_k)<=(0|fl))break f;if((0|(Xk=Xk+1|0))==(0|Uk))break}if((Xk=0)<(0|_k)){for(Uk=q[Yk+532>>2];;){if((0|(al=q[Uk+(Xk<<2)>>2]))<-1|(0|dl)<=(0|al))break f;if((0|_k)==(0|(Xk=Xk+1|0)))break}for(Uk=q[Tk+124>>2],fl=q[Yk+540>>2],hl=q[Yk+536>>2],Xk=0;;){if(dl=q[(al=Xk<<2)+fl>>2]){if((0|dl)<0|(0|Uk)<(0|dl))break f;if((0|(al=q[al+hl>>2]))<0|(0|Uk)<=(0|al))break f;if((dl=al+dl|0)>>>31|(0|Uk)<(0|dl))break f}if((0|_k)==(0|(Xk=Xk+1|0)))break}}if(!((255&gl)>>>0<5)){if((Xk=0)<(0|(gl=q[jl>>2]))){for(_k=q[Yk+348>>2];;){if((0|(Uk=q[_k+(Xk<<2)>>2]))<0|(0|a)<(0|Uk))break f;if((0|gl)==(0|(Xk=Xk+1|0)))break}for(_k=q[Yk+352>>2],Xk=0;;){if((0|(Uk=q[_k+(Xk<<2)>>2]))<0|(0|a)<(0|Uk))break f;if((0|gl)==(0|(Xk=Xk+1|0)))break}}if((gl=0)<(0|(Xk=q[$k>>2]))){for(_k=q[Yk+384>>2];;){if((0|(Uk=q[_k+(gl<<2)>>2]))<0|(0|a)<(0|Uk))break f;if((0|Xk)==(0|(gl=gl+1|0)))break}for(_k=q[Yk+388>>2],gl=0;;){if((0|(Uk=q[_k+(gl<<2)>>2]))<0|(0|a)<(0|Uk))break f;if((0|Xk)==(0|(gl=gl+1|0)))break}}if((gl=0)<(0|(_k=q[ll>>2]))){for(Uk=q[Yk+404>>2];;){if((0|(dl=q[Uk+(gl<<2)>>2]))<0|(0|a)<(0|dl))break f;if((0|_k)==(0|(gl=gl+1|0)))break}for(Uk=q[Yk+408>>2],gl=0;;){if((0|(dl=q[Uk+(gl<<2)>>2]))<0|(0|a)<(0|dl))break f;if((0|_k)==(0|(gl=gl+1|0)))break}}if((a=0)<(0|(gl=q[Tk+128>>2]))){for(_k=q[Tk>>2],Uk=q[Yk+468>>2];;){if((0|(dl=q[Uk+(a<<2)>>2]))<0|(0|_k)<=(0|dl))break f;if((0|gl)==(0|(a=a+1|0)))break}for(jl=q[Yk+476>>2],dl=q[Yk+472>>2],a=0;;){if(_k=q[(Uk=a<<2)+jl>>2]){if((0|_k)<0|(0|Vk)<(0|_k))break f;if((0|(Uk=q[Uk+dl>>2]))<0|(0|Vk)<=(0|Uk))break f;if((_k=Uk+_k|0)>>>31|(0|Vk)<(0|_k))break f}if((0|gl)==(0|(a=a+1|0)))break}for(_k=q[el>>2],a=0;;){if(el=q[dl+(a<<2)>>2]<<2,Uk=q[el+Wk>>2]){if((0|Uk)<0|(0|_k)<(0|Uk))break f;if((0|(el=q[bl+el>>2]))<0|(0|_k)<=(0|el))break f;if((0|(Uk=Uk+el|0))<0|(0|_k)<(0|Uk))break f}if((0|gl)==(0|(a=a+1|0)))break}}if((a=0)<(0|(gl=q[Tk+132>>2]))){for(_k=q[Yk+492>>2];;){if((0|(Uk=q[_k+(a<<2)>>2]))<0|(0|ml)<=(0|Uk))break f;if((0|gl)==(0|(a=a+1|0)))break}for(el=q[Yk+500>>2],Uk=q[Yk+496>>2],a=0;;){if(_k=q[(dl=a<<2)+el>>2]){if((0|_k)<0|(0|Vk)<(0|_k))break f;if((0|(dl=q[Uk+dl>>2]))<0|(0|Vk)<=(0|dl))break f;if((_k=_k+dl|0)>>>31|(0|Vk)<(0|_k))break f}if((0|gl)==(0|(a=a+1|0)))break}for(a=0;;){if(dl=q[Uk+(a<<2)>>2]<<2,_k=q[dl+Wk>>2]){if((0|_k)<0|(0|Xk)<(0|_k))break f;if((0|(dl=q[bl+dl>>2]))<0|(0|Xk)<=(0|dl))break f;if((0|(_k=_k+dl|0))<0|(0|Xk)<(0|_k))break f}if((0|gl)==(0|(a=a+1|0)))break}}if(!(((a=0)|(Tk=q[Tk+136>>2]))<=0)){for(Xk=q[Yk+516>>2];;){if((0|(gl=q[Xk+(a<<2)>>2]))<0|(0|Zk)<=(0|gl))break f;if((0|Tk)==(0|(a=a+1|0)))break}for(_k=q[Yk+524>>2],Xk=q[Yk+520>>2],a=0;;){if(Yk=q[(gl=a<<2)+_k>>2]){if((0|Yk)<0|(0|Vk)<(0|Yk))break f;if((0|(gl=q[Xk+gl>>2]))<0|(0|Vk)<=(0|gl))break f;if((Yk=Yk+gl|0)>>>31|(0|Vk)<(0|Yk))break f}if((0|Tk)==(0|(a=a+1|0)))break}for(a=0;;){if(Yk=q[Xk+(a<<2)>>2]<<2,Vk=q[Yk+Wk>>2]){if((0|Vk)<0|(0|cl)<(0|Vk))break f;if((0|(Yk=q[Yk+bl>>2]))<0|(0|cl)<=(0|Yk))break f;if((0|(Vk=Vk+Yk|0))<0|(0|cl)<(0|Vk))break f}if((0|Tk)==(0|(a=a+1|0)))break}}}}}return L=nl,1}return Y(4,1846,0),L=nl,0}q[Yk+52>>2]=Vk,q[Yk+48>>2]=5,Y(4,1640,Yk+48|0)}else q[Yk+32>>2]=Vk,Y(4,1554,Yk+32|0);return L=nl,0}(a,tj):(q[20+uj>>2]=1621,q[16+uj>>2]=2284,Y(4,1294,16+uj|0),0):(q[4+uj>>2]=1444,q[uj>>2]=2284,Y(4,1294,uj),0),L=48+uj|0,0|a},j:function(a){q[1813]=a|=0},k:function(a,cj){var dj;return cj|=0,L=dj=L-48|0,a=(a|=0)?(a+63&-64)!=(0|a)?(q[36+dj>>2]=1522,q[32+dj>>2]=2305,Y(4,1294,32+dj|0),0):(cj+63&-64)==(0|cj)&&cj?function(a){var Ok,Rk,Sk,Rh,Ik=0,Jk=0,Kk=0,Lk=0,Mk=0,Nk=0,Pk=0,Qk=0;q[24+(L=Ok=L-32|0)>>2]=0,q[16+Ok>>2]=5,q[20+Ok>>2]=1,Ka(16+(L=Rh=L-272|0)|0,2227,q[12+Rh>>2]=16+Ok|0),function(a){var Dc;q[(L=Dc=L-16|0)>>2]=a,function(a,Gl){var Hl;q[12+(L=Hl=L-16|0)>>2]=Gl,Ia(a,1432,Gl,0,0),L=16+Hl|0}(q[978],Dc),L=16+Dc|0}(16+Rh|0),L=272+Rh|0;a:{if(sa(a))Y(4,1932,0);else{if(!(6<=(Kk=r[a+4|0])>>>0)){if(1!=(0|!r[a+5|0])?(da(a+4|0,1),X(a- -64|0,4,160),na(a,a+704|(o[a+5|0]=0)),ya(a)):na(a,a+704|0),r[7256]||(q[1815]=6,o[7256]=1,q[1816]=7,q[1817]=8,q[1818]=9),Jk=q[a+704>>2],1<=(0|(Kk=q[Jk+16>>2]))){for(Qk=(Lk=q[a+912>>2])+(Kk<<2)|0,Mk=q[a+908>>2];;){Pk=q[a+1204>>2]+(q[Mk>>2]<<2)|0;d:if(!(((Jk=0)|(Ik=(Kk=q[Lk>>2])+-1|0))<1))e:for(;;){for(;;){if(q[(Nk=Pk+(Jk<<2)|0)>>2]<=-1){if(function(a,Tk,ol){var pl=0,ql=0;a:if((0|a)!=(0|Tk)){if(!(a>>>0<Tk+ol>>>0&&Tk>>>0<(ql=a+ol|0)>>>0))return $(a,Tk,ol);if(pl=3&(a^Tk),a>>>0<Tk>>>0){if(!pl){if(3&a)for(;;){if(!ol)break a;if(o[0|a]=r[0|Tk],Tk=Tk+1|0,ol=ol+-1|0,!(3&(a=a+1|0)))break}if(!(ol>>>0<=3)){for(pl=ol;q[a>>2]=q[Tk>>2],Tk=Tk+4|0,a=a+4|0,3<(pl=pl+-4|0)>>>0;);ol&=3}}if(ol)for(;o[0|a]=r[0|Tk],a=a+1|0,Tk=Tk+1|0,ol=ol+-1|0;);}else{if(!pl){if(3&ql)for(;;){if(!ol)break a;if(o[0|(pl=(ol=ol+-1|0)+a|0)]=r[Tk+ol|0],!(3&pl))break}if(!(ol>>>0<=3))for(;q[(ol=ol+-4|0)+a>>2]=q[Tk+ol>>2],3<ol>>>0;);}if(ol)for(;o[(ol=ol+-1|0)+a|0]=r[Tk+ol|0],ol;);}}}(Nk,Nk+4|0,(-1^Jk)+Kk<<2),(0|Jk)<(0|(Ik=(Kk=Ik)+-1|0)))continue e;break d}if(!((0|(Jk=Jk+1|0))<(0|Ik)))break}break}if(Jk=Lk,0<(0|Kk)&&(Kk=q[Pk+(Ik<<2)>>2]<0?Ik:Kk),q[Jk>>2]=Kk,Mk=Mk+4|0,!((Lk=Lk+4|0)>>>0<Qk>>>0))break}Jk=q[a+704>>2]}if(1<=q[Jk>>2])for(Ik=0;q[q[a+712>>2]+(Ik<<2)>>2]=q[a+716>>2]+(Ik<<6),Jk=q[a+704>>2],(0|(Ik=Ik+1|0))<q[Jk>>2];);if(1<=q[Jk+4>>2])for(Ik=0;q[q[a+744>>2]+(Ik<<2)>>2]=q[a+748>>2]+(Ik<<6),Jk=q[a+704>>2],(0|(Ik=Ik+1|0))<q[Jk+4>>2];);if(1<=q[Jk+16>>2])for(Ik=0;q[(Kk=Ik<<2)+q[a+832>>2]>>2]=q[a+848>>2]+(Ik<<6),q[Kk+q[a+836>>2]>>2]=q[a+1196>>2]+(q[Kk+q[a+896>>2]>>2]<<2),q[Kk+q[a+840>>2]>>2]=q[a+1200>>2]+(q[Kk+q[a+900>>2]>>2]<<1),q[Kk+q[a+844>>2]>>2]=q[a+1204>>2]+(q[Kk+q[a+908>>2]>>2]<<2),Jk=q[a+704>>2],(0|(Ik=Ik+1|0))<q[Jk+16>>2];);if(1<=q[Jk+20>>2])for(Ik=0;q[q[a+916>>2]+(Ik<<2)>>2]=q[a+920>>2]+(Ik<<6),Jk=q[a+704>>2],(0|(Ik=Ik+1|0))<q[Jk+20>>2];);if(1<=q[Jk+80>>2])for(Ik=0;q[q[a+1240>>2]+(Ik<<2)>>2]=q[a+1244>>2]+(Ik<<6),Jk=q[a+704>>2],(0|(Ik=Ik+1|0))<q[Jk+80>>2];);if(1&o[q[a+708>>2]+20|0])break a;if((0|(Lk=q[Jk+16>>2]))<1)break a;for(Ik=q[a+904>>2],Pk=q[a+900>>2],Nk=q[a+1200>>2],Mk=0;;){if(0<(0|(Qk=q[(Kk=Mk<<2)+Ik>>2]+-1|0)))for(Rk=Nk+(q[Kk+Pk>>2]<<1)|0,Jk=0;Sk=s[(Kk=Rk+(Jk<<1)|0)>>1],p[Kk>>1]=s[Kk+4>>1],p[Kk+4>>1]=Sk,(0|(Jk=Jk+3|0))<(0|Qk););if((0|Lk)==(0|(Mk=Mk+1|0)))break}for(Kk=q[a+892>>2],Mk=q[a+896>>2],Pk=q[a+1196>>2],Ik=0;;){if(1<=(0|(Nk=q[(Jk=Ik<<2)+Kk>>2])))for(Nk=(Jk=Pk+(q[Jk+Mk>>2]<<2)|0)+(Nk<<3)|0,Jk=Jk+4|0;u[Jk>>2]=x(1)-u[Jk>>2],(Jk=Jk+8|0)>>>0<Nk>>>0;);if((0|Lk)==(0|(Ik=Ik+1|0)))break}break a}q[4+Ok>>2]=Kk,q[Ok>>2]=5,Y(4,2023,Ok)}a=0}return L=32+Ok|0,a}(a):(q[20+dj>>2]=1621,q[16+dj>>2]=2305,Y(4,1294,16+dj|0),0):(q[4+dj>>2]=1444,q[dj>>2]=2305,Y(4,1294,dj),0),L=48+dj|0,0|a},l:function(a,cj,dj,ej){var fj;cj|=0,dj|=0,ej|=0,L=fj=L+-64|0,(a|=0)?cj?dj?ej?(a=q[q[a>>2]+708>>2],q[cj>>2]=q[a+12>>2],q[cj+4>>2]=q[a+16>>2],q[dj>>2]=q[a+4>>2],q[dj+4>>2]=q[a+8>>2],q[ej>>2]=q[a>>2]):(q[52+fj>>2]=1995,q[48+fj>>2]=2325,Y(4,1294,48+fj|0)):(q[36+fj>>2]=1903,q[32+fj>>2]=2325,Y(4,1294,32+fj|0)):(q[20+fj>>2]=1819,q[16+fj>>2]=2325,Y(4,1294,16+fj|0)):(q[4+fj>>2]=1740,q[fj>>2]=2325,Y(4,1294,fj)),L=64+fj|0},m:xa,n:wa,o:function(a){var bj;L=bj=L-16|0,(a|=0)?ua(a):(q[4+bj>>2]=1740,q[bj>>2]=2387,Y(4,1294,bj)),L=16+bj|0},p:function(a){var aj;return L=aj=L-16|0,a=(a|=0)?q[a+540>>2]:(q[4+aj>>2]=1740,q[aj>>2]=2402,Y(4,1294,aj),-1),L=16+aj|0,0|a},q:function(a){var $i;return L=$i=L-16|0,a=(a|=0)?q[q[a>>2]+916>>2]:(q[4+$i>>2]=1740,q[$i>>2]=2423,Y(4,1294,$i),0),L=16+$i|0,0|a},r:function(a){var _i;return L=_i=L-16|0,a=(a|=0)?q[a+548>>2]:(q[4+_i>>2]=1740,q[_i>>2]=2442,Y(4,1294,_i),0),L=16+_i|0,0|a},s:function(a){var Zi;return L=Zi=L-16|0,a=(a|=0)?q[q[a>>2]+928>>2]:(q[4+Zi>>2]=1740,q[Zi>>2]=2463,Y(4,1294,Zi),0),L=16+Zi|0,0|a},t:function(a){var Yi;return L=Yi=L-16|0,a=(a|=0)?q[q[a>>2]+924>>2]:(q[4+Yi>>2]=1740,q[Yi>>2]=2492,Y(4,1294,Yi),0),L=16+Yi|0,0|a},u:function(a){var Xi;return L=Xi=L-16|0,a=(a|=0)?q[q[a>>2]+932>>2]:(q[4+Xi>>2]=1740,q[Xi>>2]=2521,Y(4,1294,Xi),0),L=16+Xi|0,0|a},v:function(a){var Wi;return L=Wi=L-16|0,a=(a|=0)?q[a+552>>2]:(q[4+Wi>>2]=1740,q[Wi>>2]=2550,Y(4,1294,Wi),0),L=16+Wi|0,0|a},w:function(a){var Vi;return L=Vi=L-16|0,a=(a|=0)?q[q[a>>2]+936>>2]:(q[4+Vi>>2]=1740,q[Vi>>2]=2572,Y(4,1294,Vi),0),L=16+Vi|0,0|a},x:function(a){var Ui;return L=Ui=L-16|0,a=(a|=0)?q[a+4>>2]:(q[4+Ui>>2]=1740,q[Ui>>2]=2595,Y(4,1294,Ui),-1),L=16+Ui|0,0|a},y:function(a){var Ti;return L=Ti=L-16|0,a=(a|=0)?q[q[a>>2]+712>>2]:(q[4+Ti>>2]=1740,q[Ti>>2]=2611,Y(4,1294,Ti),0),L=16+Ti|0,0|a},z:function(a){var Si;return L=Si=L-16|0,a=(a|=0)?q[a+52>>2]:(q[4+Si>>2]=1740,q[Si>>2]=2625,Y(4,1294,Si),0),L=16+Si|0,0|a},A:function(a){var Ri;return L=Ri=L-16|0,a=(a|=0)?q[q[a>>2]+740>>2]:(q[4+Ri>>2]=1740,q[Ri>>2]=2645,Y(4,1294,Ri),0),L=16+Ri|0,0|a},B:function(a){var Qi;return L=Qi=L-16|0,a=(a|=0)?q[a+332>>2]:(q[4+Qi>>2]=1740,q[Qi>>2]=2673,Y(4,1294,Qi),-1),L=16+Qi|0,0|a},C:function(a){var Pi;return L=Pi=L-16|0,a=(a|=0)?q[q[a>>2]+832>>2]:(q[4+Pi>>2]=1740,q[Pi>>2]=2693,Y(4,1294,Pi),0),L=16+Pi|0,0|a},D:function(a){var Oi;return L=Oi=L-16|0,a=(a|=0)?q[q[a>>2]+888>>2]:(q[4+Oi>>2]=1740,q[Oi>>2]=2711,Y(4,1294,Oi),0),L=16+Oi|0,0|a},E:function(a){var Ni;return L=Ni=L-16|0,a=(a|=0)?q[a+432>>2]:(q[4+Ni>>2]=1740,q[Ni>>2]=2739,Y(4,1294,Ni),0),L=16+Ni|0,0|a},F:function(a){var Mi;return L=Mi=L-16|0,a=(a|=0)?q[q[a>>2]+884>>2]:(q[4+Mi>>2]=1740,q[Mi>>2]=2766,Y(4,1294,Mi),0),L=16+Mi|0,0|a},G:function(a){var Li;return L=Li=L-16|0,a=(a|=0)?q[a+440>>2]:(q[4+Li>>2]=1740,q[Li>>2]=2795,Y(4,1294,Li),0),L=16+Li|0,0|a},H:function(a){var Ki;return L=Ki=L-16|0,a=(a|=0)?q[a+436>>2]:(q[4+Ki>>2]=1740,q[Ki>>2]=2820,Y(4,1294,Ki),0),L=16+Ki|0,0|a},I:function(a){var Ji;return L=Ji=L-16|0,a=(a|=0)?q[a+448>>2]:(q[4+Ji>>2]=1740,q[Ji>>2]=2847,Y(4,1294,Ji),0),L=16+Ji|0,0|a},J:function(a){var Ii;return L=Ii=L-16|0,a=(a|=0)?q[q[a>>2]+912>>2]:(q[4+Ii>>2]=1740,q[Ii>>2]=2871,Y(4,1294,Ii),0),L=16+Ii|0,0|a},K:function(a){var Hi;return L=Hi=L-16|0,a=(a|=0)?q[q[a>>2]+844>>2]:(q[4+Hi>>2]=1740,q[Hi>>2]=2896,Y(4,1294,Hi),0),L=16+Hi|0,0|a},L:function(a){var Gi;return L=Gi=L-16|0,a=(a|=0)?q[q[a>>2]+892>>2]:(q[4+Gi>>2]=1740,q[Gi>>2]=2916,Y(4,1294,Gi),0),L=16+Gi|0,0|a},M:function(a){var qi;return L=qi=L-16|0,a=(a|=0)?q[a+444>>2]:(q[4+qi>>2]=1740,q[qi>>2]=2943,Y(4,1294,qi),0),L=16+qi|0,0|a},N:function(a){var pi;return L=pi=L-16|0,a=(a|=0)?q[q[a>>2]+836>>2]:(q[4+pi>>2]=1740,q[pi>>2]=2973,Y(4,1294,pi),0),L=16+pi|0,0|a},O:function(a){var oi;return L=oi=L-16|0,a=(a|=0)?q[q[a>>2]+904>>2]:(q[4+oi>>2]=1740,q[oi>>2]=2997,Y(4,1294,oi),0),L=16+oi|0,0|a},P:function(a){var ni;return L=ni=L-16|0,a=(a|=0)?q[q[a>>2]+840>>2]:(q[4+ni>>2]=1740,q[ni>>2]=3023,Y(4,1294,ni),0),L=16+ni|0,0|a},Q:function(a){var mi;return L=mi=L-16|0,a=(a|=0)?q[a+452>>2]:(q[4+mi>>2]=1740,q[mi>>2]=3045,Y(4,1294,mi),0),L=16+mi|0,0|a},R:function(a){var li;return L=li=L-16|0,a=(a|=0)?q[a+456>>2]:(q[4+li>>2]=1740,q[li>>2]=3074,Y(4,1294,li),0),L=16+li|0,0|a},S:function(a){var ki;return L=ki=L-16|0,a=(a|=0)?q[q[a>>2]+876>>2]:(q[4+ki>>2]=1740,q[ki>>2]=3101,Y(4,1294,ki),0),L=16+ki|0,0|a},T:function(a){var ji;L=ji=L-16|0,(a|=0)?q[a+428>>2]=1:(q[4+ji>>2]=1740,q[ji>>2]=3133,Y(4,1294,ji)),L=16+ji|0},U:function(a){var ii;return L=ii=L-16|0,a=(a|=0)?q[a+640>>2]:(q[4+ii>>2]=1740,q[ii>>2]=3162,Y(4,1294,ii),0),L=16+ii|0,0|a},V:function(a){var hi;return L=hi=L-16|0,a=(a|=0)?q[a+636>>2]:(q[4+hi>>2]=1740,q[hi>>2]=3187,Y(4,1294,hi),0),L=16+hi|0,0|a},W:function(a){var Cc;return oa(12+(L=Cc=L-16|0)|0,64,a|=0),L=16+Cc|0,q[12+Cc>>2]},X:function(a){var Ln,Jn,Kn=0;return L=Jn=L-16|0,!(a|=0)||oa(12+Jn|0,16,Ln=xa(a))||(Kn=wa(a,q[12+Jn>>2],Ln))||(pa(q[12+Jn>>2]),Kn=0),L=16+Jn|0,0|Kn},Y:function(a){return 0|qa(a|=0)},Z:function(a){pa(a|=0)},_:function(a){var rn;oa(12+(L=rn=L-16|0)|0,64,a|=0),pa(q[12+rn>>2]),L=16+rn|0},$:function(){return 0|L},aa:function(a){return 0|(L=L-(0|a)&-16)},ba:function(a){L=0|a},ca:function(a){return 0|(a=0|(a|=0),(P=0|N())<(a=P+(a|=0)|0)&&a<65536&&(a=new ArrayBuffer(w(a,65536)),(S=new global.Int8Array(a)).set(o),o=S,o=new global.Int8Array(a),p=new global.Int16Array(a),q=new global.Int32Array(a),r=new global.Uint8Array(a),s=new global.Uint16Array(a),t=new global.Uint32Array(a),u=new global.Float32Array(a),v=new global.Float64Array(a),buffer=a,m.buffer=a),P);var S,P},da:function(a,Tk){n[a|=0](Tk|=0)}};function X(a,b,c){var e,f,d=0;if(c)for(;;){if(c=c+-1|0,a>>>0<(d=(e=a+b|0)-1|0)>>>0)for(;f=r[0|a],o[0|a]=r[0|d],o[0|d]=f,(a=a+1|0)>>>0<(d=d+-1|0)>>>0;);if(a=e,!c)break}}function Y(a,b,c){var g;L=g=L-272|0,t[1812]>a>>>0||(a=q[1813])&&(Ka(16+g|0,b,q[12+g>>2]=c),n[a](16+g|0)),L=272+g|0}function Z(a,b,c){32&r[0|a]||!function(a,Gl,Pm){var Qm=0,Rm=0,Sm=0;a:{if(!(Qm=q[Pm+16>>2])){if(function(a){var Pm;return Pm=r[a+74|0],o[a+74|0]=Pm+-1|Pm,8&(Pm=q[a>>2])?(q[a>>2]=32|Pm,1):(q[a+4>>2]=0,q[a+8>>2]=0,Pm=q[a+44>>2],q[a+28>>2]=Pm,q[a+20>>2]=Pm,q[a+16>>2]=Pm+q[a+48>>2],0)}(Pm))break a;Qm=q[Pm+16>>2]}if(Qm-(Sm=q[Pm+20>>2])>>>0<Gl>>>0)return n[q[Pm+36>>2]](Pm,a,Gl);b:if(!(o[Pm+75|0]<0)){for(Qm=Gl;;){if(!(Rm=Qm))break b;if(10==r[(Qm=Rm+-1|0)+a|0])break}if(n[q[Pm+36>>2]](Pm,a,Rm)>>>0<Rm>>>0)break a;Gl=Gl-Rm|0,a=a+Rm|0,Sm=q[Pm+20>>2]}$(Sm,a,Gl),q[Pm+20>>2]=q[Pm+20>>2]+Gl}}(b,c,a)}function _(a,b,c,h,i){var k,l,j;if(L=j=L-256|0,!(73728&i|(0|c)<=(0|h))){if(ca(j,b,(k=(i=c-h|0)>>>0<256)?i:256),b=a,l=j,!k){for(c=c-h|0;Z(a,j,256),255<(i=i+-256|0)>>>0;);i=255&c}Z(b,l,i)}L=256+j|0}function $(a,b,c){var h,i=0;if(8192<=c>>>0)I(0|a,0|b,0|c);else{if(h=a+c|0,3&(a^b))if(h>>>0<4)c=a;else if((i=h-4|0)>>>0<a>>>0)c=a;else for(c=a;o[0|c]=r[0|b],o[c+1|0]=r[b+1|0],o[c+2|0]=r[b+2|0],o[c+3|0]=r[b+3|0],b=b+4|0,(c=c+4|0)>>>0<=i>>>0;);else{b:if((0|c)<1)c=a;else if(3&a)for(c=a;;){if(o[0|c]=r[0|b],b=b+1|0,h>>>0<=(c=c+1|0)>>>0)break b;if(!(3&c))break}else c=a;if(!((a=-4&h)>>>0<64||(i=a+-64|0)>>>0<c>>>0))for(;q[c>>2]=q[b>>2],q[c+4>>2]=q[b+4>>2],q[c+8>>2]=q[b+8>>2],q[c+12>>2]=q[b+12>>2],q[c+16>>2]=q[b+16>>2],q[c+20>>2]=q[b+20>>2],q[c+24>>2]=q[b+24>>2],q[c+28>>2]=q[b+28>>2],q[c+32>>2]=q[b+32>>2],q[c+36>>2]=q[b+36>>2],q[c+40>>2]=q[b+40>>2],q[c+44>>2]=q[b+44>>2],q[c+48>>2]=q[b+48>>2],q[c+52>>2]=q[b+52>>2],q[c+56>>2]=q[b+56>>2],q[c+60>>2]=q[b+60>>2],b=b- -64|0,(c=c- -64|0)>>>0<=i>>>0;);if(!(a>>>0<=c>>>0))for(;q[c>>2]=q[b>>2],b=b+4|0,(c=c+4|0)>>>0<a>>>0;);}if(c>>>0<h>>>0)for(;o[0|c]=r[0|b],b=b+1|0,(0|h)!=(0|(c=c+1|0)););}}function aa(a){var b,c;return x((b=a*a)*b*(c=b*a)*(2718311493989822e-21*b-.00019839334836096632)+(c*(.008333329385889463*b-.16666666641626524)+a))}function ba(a){var m;return x(-.499999997251031*(a*=a)+1+.04166662332373906*(m=a*a)+a*m*(2439044879627741e-20*a-.001388676377460993))}function ca(a,n,p){var r,s,t,u;if(p&&(o[(r=a+p|0)-1|0]=n,o[0|a]=n,!(p>>>0<3||(o[r-2|0]=n,o[a+1|0]=n,o[r-3|0]=n,o[a+2|0]=n,p>>>0<7)||(o[r-4|0]=n,o[a+3|0]=n,p>>>0<9)||(s=(r=0-a&3)+a|0,n=w(255&n,16843009),q[s>>2]=n,q[(r=(p=p-r&-4)+s|0)-4>>2]=n,p>>>0<9)||(q[8+s>>2]=n,q[4+s>>2]=n,q[r-8>>2]=n,q[r-12>>2]=n,p>>>0<25)||(q[24+s>>2]=n,q[20+s>>2]=n,q[16+s>>2]=n,q[12+s>>2]=n,q[r-16>>2]=n,q[r-20>>2]=n,q[r-24>>2]=n,q[r-28>>2]=n,(p=p-(u=4&s|24)|0)>>>0<32))))for(t=r=n,n=s+u|0;q[n+24>>2]=t,q[n+28>>2]=r,q[n+16>>2]=t,q[n+20>>2]=r,q[n+8>>2]=t,q[n+12>>2]=r,q[n>>2]=t,q[n+4>>2]=r,n=n+32|0,31<(p=p+-32|0)>>>0;);return a}function da(a,n){var p;if(a>>>0<(n=(a+n|0)-1|0)>>>0)for(;p=r[0|a],o[0|a]=r[0|n],o[0|n]=p,(a=a+1|0)>>>0<(n=n+-1|0)>>>0;);}function ea(a){var n,o=N();return(a=(n=q[2224])+a|0)>>>0<=o<<16>>>0||J(0|a)?(q[2224]=a,n):(q[2094]=48,-1)}function fa(a,v,y,z,B,C,D){var H,I,K,N,Q,R,S,O,P,J,E=0,F=x(0),G=x(0),M=x(0);if(x(0),x(0),x(0),x(0),L=J=L-16|0,1<=(0|a))for(R=w(a,12)+v|0;;){if(1<=(0|(I=q[v+4>>2])))for(S=(a=q[v+8>>2])+w(I,48)|0,I=(H=q[v>>2]<<4)+D|0,K=(8|H)+D|0,H=(4|H)+D|0;(E=q[a+8>>2])&&((O=E+-1|0)>>>0<=1?(P=(q[a+4>>2]<<2)+y|0,E=q[P+(q[a+12>>2]<<2)>>2]<<2,F=u[E+C>>2],Q=u[B+E>>2],G=u[z+E>>2],O-1?(M=G,G=u[a+20>>2],u[I>>2]=u[I>>2]+x(u[a+44>>2]*x(M*G)),u[H>>2]=u[H>>2]+x(x(Q*G)*u[a+44>>2]),u[K>>2]=u[K>>2]+x(x(F*G)*u[a+44>>2])):(E=q[(q[a+16>>2]<<2)+P>>2]<<2,O=u[E+C>>2],P=u[B+E>>2],M=G,G=u[a+20>>2],N=u[a+24>>2],u[I>>2]=u[I>>2]+x(u[a+44>>2]*x(x(M*G)+x(u[z+E>>2]*N))),u[H>>2]=u[H>>2]+x(x(x(Q*G)+x(P*N))*u[a+44>>2]),u[K>>2]=u[K>>2]+x(x(x(F*G)+x(O*N))*u[a+44>>2]))):(q[J>>2]=E,Y(4,1024,J))),(a=a+48|0)>>>0<S>>>0;);if(a=(q[v>>2]<<4)+D|0,F=u[a>>2],u[a>>2]=F<x(0)?x(0):x(A(F,x(1))),F=u[a+4>>2],u[a+4>>2]=F<x(0)?x(0):x(A(F,x(1))),F=u[a+8>>2],u[a+8>>2]=F<x(0)?x(0):x(A(F,x(1))),!((v=v+12|0)>>>0<R>>>0))break}L=16+J|0}function ga(a,q,v){var y,z,x=0;if(1==(0|q)&a>>>0<0|q>>>0<1)x=a;else for(;y=cd(x=dd(a,q,10),z=M,10),o[0|(v=v+-1|0)]=a-y|48,y=9==(0|q)&4294967295<a>>>0|9<q>>>0,a=x,q=z,y;);if(x)for(;o[0|(v=v+-1|0)]=x-w(a=(x>>>0)/10|0,10)|48,q=9<x>>>0,x=a,q;);return v}function ha(a){return a+-48>>>0<10}function ia(a){var q;return(q=La(a,64))?q-a|0:64}function ja(a,v){var w=0;return 1024<=(0|v)?(a*=898846567431158e293,v=(0|(w=v+-1023|0))<1024?w:(a*=898846567431158e293,((0|v)<3069?v:3069)+-2046|0)):-1023<(0|v)||(a*=22250738585072014e-324,v=-1023<(0|(w=v+1022|0))?w:(a*=22250738585072014e-324,(-3066<(0|v)?v:-3066)+2044|0)),f(0,0),f(1,v+1023<<20),a*+g()}function ka(a,v){var A=0,C=a,B=v>>>0<=31?(A=q[a+4>>2],q[a>>2]):(A=q[a>>2],q[a+4>>2]=A,v=v+-32|(q[a>>2]=0),0);q[C>>2]=B<<v,q[a+4>>2]=A<<v|B>>>32-v}function la(a,v,D,V,W){var X,Y=0,Z=0,_=0;L=X=L-240|0,Y=q[v>>2],q[232+X>>2]=Y,v=q[v+4>>2],q[X>>2]=a,Z=1;a:{b:{c:{if(((q[236+X>>2]=v)||1!=(0|Y))&&(Y=a-q[(D<<2)+W>>2]|0,!((0|n[5](Y,a))<1))){for(_=!V;;){e:{if(v=Y,!(!_|(0|D)<2)){if(V=q[((D<<2)+W|0)-8>>2],-1<(0|n[5](Y=a+-4|0,v)))break e;if(-1<(0|n[5](Y-V|0,v)))break e}if(q[(Z<<2)+X>>2]=v,Z=Z+1|0,ma(232+X|0,a=Oa(232+X|0)),D=a+D|0,!q[236+X>>2]&&1==q[232+X>>2])break b;if(_=1,Y=(a=v)-q[(D<<2)+W>>2]|(V=0),0<(0|n[5](Y,q[X>>2])))continue;break c}break}v=a;break b}v=a}if(V)break a}Na(X,Z),ta(v,D,W)}L=240+X|0}function ma(a,v){var D=0,V=a,L=v>>>0<=31?(D=q[a>>2],q[a+4>>2]):(D=q[a+4>>2],q[a+4>>2]=0,q[a>>2]=D,v=v+-32|0,0);q[V+4>>2]=L>>>v,q[a>>2]=L<<32-v|D>>>v}function na(a,v){var W=r[a+4|0];q[v>>2]=q[a+64>>2]+a,q[v+4>>2]=q[a+68>>2]+a,q[v+8>>2]=q[a+72>>2]+a,q[v+12>>2]=q[a+76>>2]+a,q[v+16>>2]=q[a+80>>2]+a,q[v+20>>2]=q[a+84>>2]+a,q[v+24>>2]=q[a+88>>2]+a,q[v+28>>2]=q[a+92>>2]+a,q[v+32>>2]=q[a+96>>2]+a,q[v+36>>2]=q[a+100>>2]+a,q[v+40>>2]=q[a+104>>2]+a,q[v+44>>2]=q[a+108>>2]+a,q[v+48>>2]=q[a+112>>2]+a,q[v+52>>2]=q[a+116>>2]+a,q[v+56>>2]=q[a+120>>2]+a,q[v+60>>2]=q[a+124>>2]+a,q[v- -64>>2]=q[a+128>>2]+a,q[v+68>>2]=q[a+132>>2]+a,q[v+72>>2]=q[a+136>>2]+a,q[v+76>>2]=q[a+140>>2]+a,q[v+80>>2]=q[a+144>>2]+a,q[v+84>>2]=q[a+148>>2]+a,q[v+92>>2]=q[a+152>>2]+a,q[v+96>>2]=q[a+156>>2]+a,q[v+100>>2]=q[a+160>>2]+a,q[v+108>>2]=q[a+164>>2]+a,q[v+112>>2]=q[a+168>>2]+a,q[v+116>>2]=q[a+172>>2]+a,q[v+124>>2]=q[a+176>>2]+a,q[v+128>>2]=q[a+180>>2]+a,q[v+132>>2]=q[a+184>>2]+a,q[v+136>>2]=q[a+188>>2]+a,q[v+140>>2]=q[a+192>>2]+a,q[v+144>>2]=q[a+196>>2]+a,q[v+148>>2]=q[a+200>>2]+a,q[v+152>>2]=q[a+204>>2]+a,q[v+156>>2]=q[a+208>>2]+a,q[v+164>>2]=q[a+212>>2]+a,q[v+168>>2]=q[a+216>>2]+a,q[v+172>>2]=q[a+220>>2]+a,q[v+176>>2]=q[a+224>>2]+a,q[v+180>>2]=q[a+228>>2]+a,q[v+184>>2]=q[a+232>>2]+a,q[v+188>>2]=q[a+236>>2]+a,q[v+192>>2]=q[a+240>>2]+a,q[v+196>>2]=q[a+244>>2]+a,q[v+200>>2]=q[a+248>>2]+a,q[v+204>>2]=q[a+252>>2]+a,q[v+208>>2]=q[a+256>>2]+a,q[v+212>>2]=q[a+260>>2]+a,q[v+216>>2]=q[a+264>>2]+a,q[v+220>>2]=q[a+268>>2]+a,q[v+224>>2]=q[a+272>>2]+a,q[v+228>>2]=q[a+276>>2]+a,q[v+232>>2]=q[a+280>>2]+a,q[v+236>>2]=q[a+284>>2]+a,q[v+244>>2]=q[a+288>>2]+a,q[v+248>>2]=q[a+292>>2]+a,q[v+272>>2]=q[a+296>>2]+a,q[v+276>>2]=q[a+300>>2]+a,q[v+280>>2]=q[a+304>>2]+a,q[v+292>>2]=q[a+308>>2]+a,q[v+296>>2]=q[a+312>>2]+a,q[v+300>>2]=q[a+316>>2]+a,q[v+304>>2]=q[a+320>>2]+a,q[v+308>>2]=q[a+324>>2]+a,q[v+312>>2]=q[a+328>>2]+a,q[v+316>>2]=q[a+332>>2]+a,q[v+328>>2]=q[a+336>>2]+a,q[v+332>>2]=q[a+340>>2]+a,q[v+336>>2]=q[a+344>>2]+a,q[v+348>>2]=q[a+348>>2]+a,q[v+360>>2]=q[a+352>>2]+a,q[v+364>>2]=q[a+356>>2]+a,q[v+368>>2]=q[a+360>>2]+a,q[v+352>>2]=q[a+364>>2]+a,q[v+356>>2]=q[a+368>>2]+a,q[v+488>>2]=q[a+372>>2]+a,q[v+492>>2]=q[a+376>>2]+a,q[v+496>>2]=q[a+380>>2]+a,q[v+500>>2]=q[a+384>>2]+a,q[v+504>>2]=q[a+388>>2]+a,q[v+508>>2]=q[a+392>>2]+a,q[v+512>>2]=q[a+396>>2]+a,q[v+516>>2]=q[a+400>>2]+a,q[v+520>>2]=q[a+404>>2]+a,q[v+524>>2]=q[a+408>>2]+a,q[v+528>>2]=q[a+412>>2]+a,q[v+532>>2]=q[a+416>>2]+a,q[v+536>>2]=q[a+420>>2]+a,q[v+540>>2]=q[a+424>>2]+a,q[v+544>>2]=q[a+428>>2]+a,q[v+548>>2]=q[a+432>>2]+a,q[v+552>>2]=q[a+436>>2]+a,q[v+556>>2]=q[a+440>>2]+a,q[v+560>>2]=q[a+444>>2]+a,q[v+564>>2]=q[a+448>>2]+a,q[v+568>>2]=q[a+452>>2]+a,q[v+572>>2]=q[a+456>>2]+a,q[v+576>>2]=q[a+460>>2]+a,q[v+580>>2]=q[a+464>>2]+a,W>>>0<2||(q[v+104>>2]=q[a+468>>2]+a,W>>>0<4)||(q[v+260>>2]=q[a+472>>2]+a,q[v+264>>2]=q[a+476>>2]+a,q[v+268>>2]=q[a+480>>2]+a,q[v+88>>2]=q[a+484>>2]+a,q[v+120>>2]=q[a+488>>2]+a,q[v+160>>2]=q[a+492>>2]+a,q[v+584>>2]=q[a+496>>2]+a,q[v+588>>2]=q[a+500>>2]+a,q[v+592>>2]=q[a+504>>2]+a,q[v+596>>2]=q[a+508>>2]+a,q[v+600>>2]=q[a+512>>2]+a,q[v+604>>2]=q[a+516>>2]+a,q[v+240>>2]=q[a+520>>2]+a,q[v+252>>2]=q[a+524>>2]+a,q[v+256>>2]=q[a+528>>2]+a,q[v+372>>2]=q[a+532>>2]+a,q[v+376>>2]=q[a+536>>2]+a,q[v+380>>2]=q[a+540>>2]+a,q[v+384>>2]=q[a+544>>2]+a,q[v+388>>2]=q[a+548>>2]+a,q[v+392>>2]=q[a+552>>2]+a,q[v+396>>2]=q[a+556>>2]+a,q[v+400>>2]=q[a+560>>2]+a,q[v+416>>2]=q[a+564>>2]+a,q[v+420>>2]=q[a+568>>2]+a,q[v+424>>2]=q[a+572>>2]+a,q[v+440>>2]=q[a+576>>2]+a,q[v+444>>2]=q[a+580>>2]+a,q[v+448>>2]=q[a+584>>2]+a,q[v+464>>2]=q[a+588>>2]+a,q[v+468>>2]=q[a+592>>2]+a,q[v+472>>2]=q[a+596>>2]+a,q[v+476>>2]=q[a+600>>2]+a,q[v+480>>2]=q[a+604>>2]+a,q[v+484>>2]=q[a+608>>2]+a,4!=(0|W)&&(q[v+284>>2]=q[a+612>>2]+a,q[v+288>>2]=q[a+616>>2]+a,q[v+320>>2]=q[a+620>>2]+a,q[v+324>>2]=q[a+624>>2]+a,q[v+340>>2]=q[a+628>>2]+a,q[v+344>>2]=q[a+632>>2]+a,q[v+404>>2]=q[a+636>>2]+a,q[v+408>>2]=q[a+640>>2]+a,q[v+412>>2]=q[a+644>>2]+a,q[v+428>>2]=q[a+648>>2]+a,q[v+432>>2]=q[a+652>>2]+a,q[v+436>>2]=q[a+656>>2]+a,q[v+452>>2]=q[a+660>>2]+a,q[v+456>>2]=q[a+664>>2]+a,q[v+460>>2]=q[a+668>>2]+a))}function oa(a,v,$){var aa=0;a:{if(8==(0|v))v=qa($);else{if(aa=28,3&v|1!=(0|function(a){for(var ap=0,bp=0;bp=ap,a;)a&=a-1,ap=ap+1|0;return bp}(v>>>2)))break a;if(aa=48,-64-v>>>0<$>>>0)break a;v=function(a,Tk){var tl,ul,ol=0,rl=0,sl=0;if((rl=a>>>0>(ol=16)?a:16)+-1&rl)for(;ol=(a=ol)<<1,a>>>0<rl>>>0;);else a=rl;return-64-a>>>0<=Tk>>>0?(q[2094]=48,0):(ol=qa(12+((rl=Tk>>>0<11?16:Tk+11&-8)+a|0)|0))?(Tk=ol+-8|0,ol&a+-1?(sl=(-8&(ul=q[(tl=ol+-4|0)>>2]))-(ol=(a=15<(ol=((a+ol|0)-1&0-a)-8|0)-Tk>>>0?ol:a+ol|0)-Tk|0)|0,3&ul?(q[a+4>>2]=sl|1&q[a+4>>2]|2,q[4+(sl=a+sl|0)>>2]=1|q[4+sl>>2],q[tl>>2]=ol|1&q[tl>>2]|2,q[a+4>>2]=1|q[a+4>>2],za(Tk,ol)):(Tk=q[Tk>>2],q[a+4>>2]=sl,q[a>>2]=Tk+ol)):a=Tk,3&(Tk=q[a+4>>2])&&((ol=-8&Tk)>>>0<=rl+16>>>0||(q[a+4>>2]=rl|1&Tk|2,q[(Tk=a+rl|0)+4>>2]=3|(rl=ol-rl|0),q[4+(ol=a+ol|0)>>2]=1|q[ol+4>>2],za(Tk,rl))),a+8|0):0}(16<v>>>0?v:16,$)}if(!v)return 1;q[a>>2]=v,aa=0}return aa}function pa(a){var da,v=0,$=0,ba=0,ca=0,ea=0,fa=0,ha=0;a:if(a){da=(ba=a+-8|0)+(a=-8&($=q[a+-4>>2]))|0;b:if(!(1&$)){if(!(3&$))break a;if((ba=ba-($=q[ba>>2])|0)>>>0<t[2099])break a;if(a=a+$|0,q[2100]!=(0|ba))if($>>>0<=255)ca=q[ba+8>>2],$>>>=3,(0|(v=q[ba+12>>2]))==(0|ca)?(ha=q[2095]&fd($),q[2095]=ha):(q[ca+12>>2]=v,q[v+8>>2]=ca);else{if(fa=q[ba+24>>2],(0|ba)!=(0|($=q[ba+12>>2])))v=q[ba+8>>2],q[v+12>>2]=$,q[$+8>>2]=v;else if(v=(v=q[(ca=ba+20|0)>>2])||q[(ca=ba+16|0)>>2]){for(;ea=ca,(v=q[(ca=($=v)+20|0)>>2])||(ca=$+16|0,v=q[$+16>>2]););q[ea>>2]=0}else $=0;if(fa){ca=q[ba+28>>2];e:{if(q[(v=8684+(ca<<2)|0)>>2]==(0|ba)){if(q[v>>2]=$)break e;ha=q[2096]&fd(ca),q[2096]=ha;break b}if(!(q[fa+(q[fa+16>>2]==(0|ba)?16:20)>>2]=$))break b}q[$+24>>2]=fa,(v=q[ba+16>>2])&&(q[$+16>>2]=v,q[v+24>>2]=$),(v=q[ba+20>>2])&&(q[$+20>>2]=v,q[v+24>>2]=$)}}else if(3==(3&($=q[4+da>>2])))return q[2097]=a,q[4+da>>2]=-2&$,q[ba+4>>2]=1|a,q[a+ba>>2]=a}if(!(da>>>0<=ba>>>0)&&1&($=q[4+da>>2])){f:{if(!(2&$)){if(q[2101]==(0|da)){if(q[2101]=ba,a=q[2098]+a|0,q[2098]=a,q[ba+4>>2]=1|a,q[2100]!=(0|ba))break a;return q[2097]=0,q[2100]=0}if(q[2100]==(0|da))return q[2100]=ba,a=q[2097]+a|0,q[2097]=a,q[ba+4>>2]=1|a,q[a+ba>>2]=a;a=(-8&$)+a|0;g:if($>>>0<=255)$>>>=3,(0|(v=q[8+da>>2]))==(0|(ca=q[12+da>>2]))?(ha=q[2095]&fd($),q[2095]=ha):(q[v+12>>2]=ca,q[ca+8>>2]=v);else{if(fa=q[24+da>>2],(0|da)!=(0|($=q[12+da>>2])))v=q[8+da>>2],q[v+12>>2]=$,q[$+8>>2]=v;else if(v=(v=q[(ca=20+da|0)>>2])||q[(ca=16+da|0)>>2]){for(;ea=ca,(v=q[(ca=($=v)+20|0)>>2])||(ca=$+16|0,v=q[$+16>>2]););q[ea>>2]=0}else $=0;if(fa){ca=q[28+da>>2];j:{if(q[(v=8684+(ca<<2)|0)>>2]==(0|da)){if(q[v>>2]=$)break j;ha=q[2096]&fd(ca),q[2096]=ha;break g}if(!(q[fa+(q[fa+16>>2]==(0|da)?16:20)>>2]=$))break g}q[$+24>>2]=fa,(v=q[16+da>>2])&&(q[$+16>>2]=v,q[v+24>>2]=$),(v=q[20+da>>2])&&(q[$+20>>2]=v,q[v+24>>2]=$)}}if(q[ba+4>>2]=1|a,q[a+ba>>2]=a,q[2100]!=(0|ba))break f;return q[2097]=a}q[4+da>>2]=-2&$,q[ba+4>>2]=1|a,q[a+ba>>2]=a}if(a>>>0<=255)return $=8420+((a>>>=3)<<3)|0,a=(v=q[2095])&(a=1<<a)?q[$+8>>2]:(q[2095]=a|v,$),q[$+8>>2]=ba,q[a+12>>2]=ba,q[ba+12>>2]=$,q[ba+8>>2]=a;q[ba+16>>2]=0,v=q[ba+20>>2]=0,(ca=a>>>8)&&(v=31,16777215<a>>>0||(v=ca,v=28+((v=((v=(v<<=ca=ca+1048320>>>16&8)<<(fa=v+520192>>>16&4))<<(ea=v+245760>>>16&2)>>>15)-(ea|ca|fa)|0)<<1|a>>>v+21&1)|0)),ea=8684+((q[($=ba)+28>>2]=v)<<2)|0;m:if((ca=q[2096])&($=1<<v)){ca=a<<(31==(0|v)?0:25-(v>>>1)|0),$=q[ea>>2];n:{for(;;){if((-8&q[(v=$)+4>>2])==(0|a))break n;if($=ca>>>29,ca<<=1,!($=q[16+(ea=v+(4&$)|0)>>2]))break}q[ea+16>>2]=ba,q[ba+12>>2]=ba,q[ba+24>>2]=v,q[ba+8>>2]=ba;break m}a=q[v+8>>2],q[a+12>>2]=ba,q[v+8>>2]=ba,q[ba+24>>2]=0,q[ba+12>>2]=v,q[ba+8>>2]=a}else q[2096]=$|ca,q[ea>>2]=ba,q[ba+12>>2]=ba,q[ba+24>>2]=ea,q[ba+8>>2]=ba;if(a=q[2103]+-1|0,!(q[2103]=a)){for(ba=8836;ba=(a=q[ba>>2])+8|0,a;);q[2103]=-1}}}}function qa(a){var sa,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,ua=0;L=sa=L-16|0;a:{b:{c:{d:{e:{f:{g:{h:{i:{j:{k:{if(a>>>0<=244){if(3&(ia=(ma=q[2095])>>>(a=(na=a>>>0<11?16:a+11&-8)>>>3))){a=(ia=q[8428+(la=(ja=a+(1&(-1^ia))|0)<<3)>>2])+8|0,(0|(ka=q[ia+8>>2]))==(0|(la=la+8420|0))?(ua=fd(ja)&ma,q[2095]=ua):(q[ka+12>>2]=la,q[la+8>>2]=ka),q[ia+4>>2]=3|(ja<<=3),q[4+(ia=ia+ja|0)>>2]=1|q[ia+4>>2];break a}if(na>>>0<=(pa=q[2097])>>>0)break k;if(ia){ja=ia=(a=(0-(a=(0-(ja=2<<a)|ja)&ia<<a)&a)-1|0)>>>12&16,ia=q[8428+(ka=(ja=((ja=(ja|=ia=(a>>>=ia)>>>5&8)|(ia=(a>>>=ia)>>>2&4)|(ia=(a>>>=ia)>>>1&2))|(ia=(a>>>=ia)>>>1&1))+(a>>>ia)|0)<<3)>>2],(0|(a=q[ia+8>>2]))==(0|(ka=ka+8420|0))?(ma=fd(ja)&ma,q[2095]=ma):(q[a+12>>2]=ka,q[ka+8>>2]=a),a=ia+8|0,q[ia+4>>2]=3|na,q[4+(oa=ia+na|0)>>2]=1|(la=(ja<<=3)-na|0),q[ia+ja>>2]=la,pa&&(ia=8420+((ja=pa>>>3)<<3)|0,ka=q[2100],ja=(ja=1<<ja)&ma?q[ia+8>>2]:(q[2095]=ja|ma,ia),q[ia+8>>2]=ka,q[ja+12>>2]=ka,q[ka+12>>2]=ia,q[ka+8>>2]=ja),q[2100]=oa,q[2097]=la;break a}if(!(ra=q[2096]))break k;for(ja=ia=(a=(ra&0-ra)-1|0)>>>12&16,ia=q[8684+(((ja=(ja|=ia=(a>>>=ia)>>>5&8)|(ia=(a>>>=ia)>>>2&4)|(ia=(a>>>=ia)>>>1&2))|(ia=(a>>>=ia)>>>1&1))+(a>>>ia)<<2)>>2],ka=(-8&q[ia+4>>2])-na|0,ja=ia;a=(a=q[ja+16>>2])||q[ja+20>>2];)ka=(ja=(la=(-8&q[a+4>>2])-na|0)>>>0<ka>>>0)?la:ka,ia=ja?a:ia,ja=a;if(qa=q[ia+24>>2],(0|(la=q[ia+12>>2]))!=(0|ia)){a=q[ia+8>>2],q[a+12>>2]=la,q[la+8>>2]=a;break b}if(!(a=q[(ja=ia+20|0)>>2])){if(!(a=q[ia+16>>2]))break j;ja=ia+16|0}for(;oa=ja,(a=q[(ja=(la=a)+20|0)>>2])||(ja=la+16|0,a=q[la+16>>2]););q[oa>>2]=0;break b}if(na=-1,!(4294967231<a>>>0)&&(na=-8&(ia=a+11|0),pa=q[2096])){ja=0-na|0,ma=0,(ia>>>=8)&&(ma=31,16777215<na>>>0||(ma=28+((a=((ma=(ia<<=ka=ia+1048320>>>16&8)<<(a=ia+520192>>>16&4))<<(ia=ma+245760>>>16&2)>>>15)-(ia|a|ka)|0)<<1|na>>>a+21&1)|0));q:{r:{if(ka=q[8684+(ma<<2)>>2])for(ia=na<<(31==(0|ma)?0:25-(ma>>>1)|0),a=0;;){if(!(ja>>>0<=(oa=(-8&q[ka+4>>2])-na|0)>>>0||(la=ka,ja=oa))){ja=0,a=ka;break r}if(oa=q[ka+20>>2],ka=q[16+((ia>>>29&4)+ka|0)>>2],a=oa&&(0|oa)!=(0|ka)?oa:a,ia<<=0!=(0|ka),!ka)break}else a=0;if(!(a|la)){if(!(a=(0-(a=2<<ma)|a)&pa))break k;ka=ia=(a=(a&0-a)-1|0)>>>12&16,a=q[8684+(((ka=(ka|=ia=(a>>>=ia)>>>5&8)|(ia=(a>>>=ia)>>>2&4)|(ia=(a>>>=ia)>>>1&2))|(ia=(a>>>=ia)>>>1&1))+(a>>>ia)<<2)>>2]}if(!a)break q}for(;ja=(ia=(ka=(-8&q[a+4>>2])-na|0)>>>0<ja>>>0)?ka:ja,la=ia?a:la,a=(ia=q[a+16>>2])||q[a+20>>2];);}if(!(!la|ja>>>0>=q[2097]-na>>>0)){if(oa=q[la+24>>2],(0|la)!=(0|(ia=q[la+12>>2]))){a=q[la+8>>2],q[a+12>>2]=ia,q[ia+8>>2]=a;break c}if(!(a=q[(ka=la+20|0)>>2])){if(!(a=q[la+16>>2]))break i;ka=la+16|0}for(;ma=ka,(a=q[(ka=(ia=a)+20|0)>>2])||(ka=ia+16|0,a=q[ia+16>>2]););q[ma>>2]=0;break c}}}if(na>>>0<=(ia=q[2097])>>>0){a=q[2100],16<=(ja=ia-na|0)>>>0?(q[2097]=ja,q[2100]=ka=a+na|0,q[ka+4>>2]=1|ja,q[a+ia>>2]=ja,q[a+4>>2]=3|na):(q[2100]=0,q[2097]=0,q[a+4>>2]=3|ia,q[4+(ia=a+ia|0)>>2]=1|q[ia+4>>2]),a=a+8|0;break a}if(na>>>0<(ka=q[2098])>>>0){q[2098]=ia=ka-na|0,a=q[2101],q[2101]=ja=a+na|0,q[ja+4>>2]=1|ia,q[a+4>>2]=3|na,a=a+8|0;break a}if((ja=(ma=(ja=la=na+47|(a=0))+(ia=q[2213]?q[2215]:(q[2216]=-1,q[2217]=-1,q[2214]=4096,q[2215]=4096,q[2213]=12+sa&-16^1431655768,q[2218]=0,q[2206]=0,4096))|0)&(oa=0-ia|0))>>>0<=na>>>0)break a;if((ia=q[2205])&&(qa=(pa=q[2203])+ja|0)>>>0<=pa>>>0|ia>>>0<qa>>>0)break a;if(4&r[8824])break f;v:{w:{if(ia=q[2101])for(a=8828;;){if((pa=q[a>>2])+q[a+4>>2]>>>0>ia>>>0&&pa>>>0<=ia>>>0)break w;if(!(a=q[a+8>>2]))break}if(-1==(0|(ia=ea(0))))break g;if(ma=ja,(ma=(ka=(a=q[2214])+-1|0)&ia?(ja-ia|0)+(ia+ka&0-a)|0:ma)>>>0<=na>>>0|2147483646<ma>>>0)break g;if((a=q[2205])&&(oa=(ka=q[2203])+ma|0)>>>0<=ka>>>0|a>>>0<oa>>>0)break g;if((0|ia)!=(0|(a=ea(ma))))break v;break e}if(2147483646<(ma=oa&ma-ka)>>>0)break g;if((0|(ia=ea(ma)))==(q[a>>2]+q[a+4>>2]|0))break h;a=ia}if(!(na+48>>>0<=ma>>>0|2147483646<ma>>>0|-1==(0|(ia=a)))){if(2147483646<(a=(a=q[2215])+(la-ma|0)&0-a)>>>0)break e;if(-1!=(0|ea(a))){ma=a+ma|0;break e}ea(0-ma|0);break g}if(-1!=(0|ia))break e;break g}la=0;break b}ia=0;break c}if(-1!=(0|ia))break e}q[2206]=4|q[2206]}if(2147483646<ja>>>0)break d;if(ia=ea(ja),(a=ea(0))>>>0<=ia>>>0|-1==(0|ia)|-1==(0|a))break d;if((ma=a-ia|0)>>>0<=na+40>>>0)break d}a=q[2203]+ma|0,(q[2203]=a)>>>0>t[2204]&&(q[2204]=a);x:{y:{z:{if(ja=q[2101]){for(a=8828;;){if(((ka=q[a>>2])+(la=q[a+4>>2])|0)==(0|ia))break z;if(!(a=q[a+8>>2]))break}break y}for((a=q[2099])>>>0<=ia>>>0&&a||(q[2099]=ia),a=0,q[2208]=ma,q[2207]=ia,q[2103]=-1,q[2104]=q[2213],q[2210]=0;q[8428+(ja=a<<3)>>2]=ka=ja+8420|0,q[ja+8432>>2]=ka,32!=(0|(a=a+1|0)););q[2098]=ka=(a=ma+-40|0)-(ja=ia+8&7?-8-ia&7:0)|0,q[2101]=ja=ia+ja|0,q[ja+4>>2]=1|ka,q[4+(a+ia|0)>>2]=40,q[2102]=q[2217];break x}if(!(8&r[a+12|0]|ia>>>0<=ja>>>0|ja>>>0<ka>>>0)){q[a+4>>2]=la+ma,q[2101]=ia=(a=ja+8&7?-8-ja&7:0)+ja|0,ka=q[2098]+ma|0,q[2098]=a=ka-a|0,q[ia+4>>2]=1|a,q[4+(ja+ka|0)>>2]=40,q[2102]=q[2217];break x}}ia>>>0<(la=q[2099])>>>0&&(q[2099]=ia,la=0),ka=ia+ma|0,a=8828;A:{B:{C:{D:{E:{F:{for(;(0|ka)!=q[a>>2];)if(!(a=q[a+8>>2]))break F;if(!(8&r[a+12|0]))break E}for(a=8828;;){if((ka=q[a>>2])>>>0<=ja>>>0&&ja>>>0<(la=ka+q[a+4>>2]|0)>>>0)break D;a=q[a+8>>2]}}if(q[a>>2]=ia,q[a+4>>2]=q[a+4>>2]+ma,q[4+(qa=(ia+8&7?-8-ia&7:0)+ia|0)>>2]=3|na,a=((ia=ka+(ka+8&7?-8-ka&7:0)|0)-qa|0)-na|0,oa=na+qa|0,(0|ia)==(0|ja)){q[2101]=oa,a=q[2098]+a|0,q[2098]=a,q[oa+4>>2]=1|a;break B}if(q[2100]==(0|ia)){q[2100]=oa,a=q[2097]+a|0,q[2097]=a,q[oa+4>>2]=1|a,q[a+oa>>2]=a;break B}if(1==(3&(ja=q[ia+4>>2]))){ra=-8&ja;G:if(ja>>>0<=255)la=ja>>>3,ja=q[ia+8>>2],(0|(ka=q[ia+12>>2]))==(0|ja)?(ua=q[2095]&fd(la),q[2095]=ua):(q[ja+12>>2]=ka,q[ka+8>>2]=ja);else{if(pa=q[ia+24>>2],(0|(ma=q[ia+12>>2]))!=(0|ia))ja=q[ia+8>>2],q[ja+12>>2]=ma,q[ma+8>>2]=ja;else if(na=(na=q[(ka=ia+20|0)>>2])||q[(ka=ia+16|0)>>2]){for(;ja=ka,(na=q[(ka=(ma=na)+20|0)>>2])||(ka=ma+16|0,na=q[ma+16>>2]););q[ja>>2]=0}else ma=0;if(pa){ja=q[ia+28>>2];J:{if(q[(ka=8684+(ja<<2)|0)>>2]==(0|ia)){if(q[ka>>2]=ma)break J;ua=q[2096]&fd(ja),q[2096]=ua;break G}if(!(q[pa+(q[pa+16>>2]==(0|ia)?16:20)>>2]=ma))break G}q[ma+24>>2]=pa,(ja=q[ia+16>>2])&&(q[ma+16>>2]=ja,q[ja+24>>2]=ma),(ja=q[ia+20>>2])&&(q[ma+20>>2]=ja,q[ja+24>>2]=ma)}}ia=ia+ra|0,a=a+ra|0}if(q[ia+4>>2]=-2&q[ia+4>>2],q[oa+4>>2]=1|a,(q[a+oa>>2]=a)>>>0<=255){a=8420+((ia=a>>>3)<<3)|0,ia=(ja=q[2095])&(ia=1<<ia)?q[a+8>>2]:(q[2095]=ia|ja,a),q[a+8>>2]=oa,q[ia+12>>2]=oa,q[oa+12>>2]=a,q[oa+8>>2]=ia;break B}if(ia=0,(ka=a>>>8)&&(ia=31,16777215<a>>>0||(ia=28+((ia=((na=(ka<<=la=ka+1048320>>>16&8)<<(ia=ka+520192>>>16&4))<<(ka=na+245760>>>16&2)>>>15)-(ka|ia|la)|0)<<1|a>>>ia+21&1)|0)),q[(ja=oa)+28>>2]=ia,q[oa+16>>2]=0,ja=8684+(ia<<2)|(q[oa+20>>2]=0),(ka=q[2096])&(la=1<<ia)){for(ka=a<<(31==(0|ia)?0:25-(ia>>>1)|0),ia=q[ja>>2];;){if((-8&q[(ja=ia)+4>>2])==(0|a))break C;if(ia=ka>>>29,ka<<=1,!(ia=q[16+(la=(4&ia)+ja|0)>>2]))break}q[la+16>>2]=oa}else q[2096]=ka|la,q[ja>>2]=oa;q[oa+24>>2]=ja,q[oa+12>>2]=oa,q[oa+8>>2]=oa;break B}for(q[2098]=oa=(a=ma+-40|0)-(ka=ia+8&7?-8-ia&7:0)|0,q[2101]=ka=ia+ka|0,q[ka+4>>2]=1|oa,q[4+(a+ia|0)>>2]=40,q[2102]=q[2217],q[(ka=(a=(la+(la+-39&7?39-la&7:0)|0)-47|0)>>>0<ja+16>>>0?ja:a)+4>>2]=27,a=q[2210],q[ka+16>>2]=q[2209],q[ka+20>>2]=a,a=q[2208],q[ka+8>>2]=q[2207],q[ka+12>>2]=a,q[2209]=ka+8,q[2208]=ma,q[2207]=ia,a=ka+24|(q[2210]=0);q[a+4>>2]=7,ia=a+8|0,a=a+4|0,ia>>>0<la>>>0;);if((0|ja)==(0|ka))break x;if(q[ka+4>>2]=-2&q[ka+4>>2],q[ja+4>>2]=1|(la=ka-ja|0),(q[ka>>2]=la)>>>0<=255){a=8420+((ia=la>>>3)<<3)|0,ia=(ka=q[2095])&(ia=1<<ia)?q[a+8>>2]:(q[2095]=ia|ka,a),q[a+8>>2]=ja,q[ia+12>>2]=ja,q[ja+12>>2]=a,q[ja+8>>2]=ia;break x}if(q[ja+16>>2]=0,a=q[ja+20>>2]=0,(ka=la>>>8)&&(a=31,16777215<la>>>0||(a=28+((a=((oa=(ka<<=ma=ka+1048320>>>16&8)<<(a=ka+520192>>>16&4))<<(ka=oa+245760>>>16&2)>>>15)-(ka|a|ma)|0)<<1|la>>>a+21&1)|0)),ia=8684+((q[(ia=ja)+28>>2]=a)<<2)|0,(ka=q[2096])&(ma=1<<a)){for(a=la<<(31==(0|a)?0:25-(a>>>1)|0),ia=q[ia>>2];;){if((0|la)==(-8&q[(ka=ia)+4>>2]))break A;if(ia=a>>>29,a<<=1,!(ia=q[16+(ma=ka+(4&ia)|0)>>2]))break}q[ma+16>>2]=ja,q[ja+24>>2]=ka}else q[2096]=ka|ma,q[ia>>2]=ja,q[ja+24>>2]=ia;q[ja+12>>2]=ja,q[ja+8>>2]=ja;break x}a=q[ja+8>>2],q[a+12>>2]=oa,q[ja+8>>2]=oa,q[oa+24>>2]=0,q[oa+12>>2]=ja,q[oa+8>>2]=a}a=qa+8|0;break a}a=q[ka+8>>2],q[a+12>>2]=ja,q[ka+8>>2]=ja,q[ja+24>>2]=0,q[ja+12>>2]=ka,q[ja+8>>2]=a}if(!((a=q[2098])>>>0<=na>>>0)){q[2098]=ia=a-na|0,a=q[2101],q[2101]=ja=a+na|0,q[ja+4>>2]=1|ia,q[a+4>>2]=3|na,a=a+8|0;break a}}q[2094]=48,a=0;break a}Q:if(oa){a=q[la+28>>2];R:{if(q[(ka=8684+(a<<2)|0)>>2]==(0|la)){if(q[ka>>2]=ia)break R;pa=fd(a)&pa,q[2096]=pa;break Q}if(!(q[oa+(q[oa+16>>2]==(0|la)?16:20)>>2]=ia))break Q}q[ia+24>>2]=oa,(a=q[la+16>>2])&&(q[ia+16>>2]=a,q[a+24>>2]=ia),(a=q[la+20>>2])&&(q[ia+20>>2]=a,q[a+24>>2]=ia)}S:if(ja>>>0<=15)q[la+4>>2]=3|(a=ja+na|0),q[4+(a=a+la|0)>>2]=1|q[a+4>>2];else if(q[la+4>>2]=3|na,q[4+(ka=la+na|0)>>2]=1|ja,(q[ja+ka>>2]=ja)>>>0<=255)a=8420+((ia=ja>>>3)<<3)|0,ia=(ja=q[2095])&(ia=1<<ia)?q[a+8>>2]:(q[2095]=ia|ja,a),q[a+8>>2]=ka,q[ia+12>>2]=ka,q[ka+12>>2]=a,q[ka+8>>2]=ia;else{a=0,(na=ja>>>8)&&(a=31,16777215<ja>>>0||(a=28+((a=((oa=(na<<=ma=na+1048320>>>16&8)<<(a=na+520192>>>16&4))<<(na=oa+245760>>>16&2)>>>15)-(na|a|ma)|0)<<1|ja>>>a+21&1)|0)),q[(ia=ka)+28>>2]=a,q[ka+16>>2]=0,ia=8684+(a<<2)|(q[ka+20>>2]=0);V:{if((na=1<<a)&pa){for(a=ja<<(31==(0|a)?0:25-(a>>>1)|0),na=q[ia>>2];;){if((-8&q[(ia=na)+4>>2])==(0|ja))break V;if(na=a>>>29,a<<=1,!(na=q[16+(ma=(4&na)+ia|0)>>2]))break}q[ma+16>>2]=ka}else q[2096]=na|pa,q[ia>>2]=ka;q[ka+24>>2]=ia,q[ka+12>>2]=ka,q[ka+8>>2]=ka;break S}a=q[ia+8>>2],q[a+12>>2]=ka,q[ia+8>>2]=ka,q[ka+24>>2]=0,q[ka+12>>2]=ia,q[ka+8>>2]=a}a=la+8|0;break a}X:if(qa){a=q[ia+28>>2];Y:{if(q[(ja=8684+(a<<2)|0)>>2]==(0|ia)){if(q[ja>>2]=la)break Y;ua=fd(a)&ra,q[2096]=ua;break X}if(!(q[qa+(q[qa+16>>2]==(0|ia)?16:20)>>2]=la))break X}q[la+24>>2]=qa,(a=q[ia+16>>2])&&(q[la+16>>2]=a,q[a+24>>2]=la),(a=q[ia+20>>2])&&(q[la+20>>2]=a,q[a+24>>2]=la)}ka>>>0<=15?(q[ia+4>>2]=3|(a=ka+na|0),q[4+(a=a+ia|0)>>2]=1|q[a+4>>2]):(q[ia+4>>2]=3|na,q[4+(na=ia+na|0)>>2]=1|ka,q[ka+na>>2]=ka,pa&&(a=8420+((ja=pa>>>3)<<3)|0,la=q[2100],ja=(ja=1<<ja)&ma?q[a+8>>2]:(q[2095]=ja|ma,a),q[a+8>>2]=la,q[ja+12>>2]=la,q[la+12>>2]=a,q[la+8>>2]=ja),q[2100]=na,q[2097]=ka),a=ia+8|0}return L=16+sa|0,a}function ra(a,va,wa,xa,ya,za,Aa){var Qa,Ta,Ba,Ca=0,Da=0,Fa=0,Ia=0,Ja=0,Ka=0,Ma=0,Na=0,Oa=0,Pa=0,Ra=0,Sa=0;q[76+(L=Ba=L-80|0)>>2]=va,Ta=55+Ba|0,Qa=56+Ba|0,va=0;a:{b:{c:for(;;){(0|Oa)<0||(Oa=(2147483647-Oa|0)<(0|va)?(q[2094]=61,-1):va+Oa|0);e:{f:{g:{h:{i:{j:{k:{l:{m:{n:{o:{p:{q:{if(Ia=q[76+Ba>>2],Fa=r[0|(va=Ia)]){for(;;){r:{s:{t:if(Ca=255&Fa){if(37!=(0|Ca))break s;for(Fa=va;;){if(37!=r[va+1|0])break t;if(q[76+Ba>>2]=Ca=va+2|0,Fa=Fa+1|0,Da=r[va+2|0],va=Ca,37!=(0|Da))break}}else Fa=va;if(va=Fa-Ia|0,a&&Z(a,Ia,va),va)continue c;Pa=-1,Ja=!ha(o[q[76+(Ca=Ba)>>2]+(Fa=1)|0]),va=q[76+Ba>>2],Ja|36!=r[va+2|0]||(Pa=o[va+1|0]+-48|0,Ra=1,Fa=3),q[Ca+76>>2]=va=Fa+va|0;u:if(31<(Da=(Ma=o[(Fa=0)|va])+-32|0)>>>0)Ca=va;else if(Ca=va,75913&(Da=1<<Da))for(;;){if(q[76+Ba>>2]=Ca=va+1|0,Fa|=Da,31<(Da=(Ma=o[va+1|0])+-32|0)>>>0)break u;if(va=Ca,!(75913&(Da=1<<Da)))break}if(42==(0|Ma)){if(Ja=Ba,ha(o[Ca+1|0])&&(va=q[76+Ba>>2],36==r[va+2|0]))q[((o[va+1|0]<<2)+ya|0)-192>>2]=10,Na=q[((o[va+1|0]<<3)+xa|0)-384>>2],Ra=1,va=va+3|0;else{if(Ra)break b;Na=Ra=0,a&&(va=q[wa>>2],q[wa>>2]=va+4,Na=q[va>>2]),va=q[76+Ba>>2]+1|0}q[Ja+76>>2]=va,-1<(0|Na)||(Na=0-Na|0,Fa|=8192)}else{if((0|(Na=Ha(76+Ba|0)))<0)break b;va=q[76+Ba>>2]}if(Da=-1,46==r[0|va])if(42==r[va+1|0])if(ha(o[va+2|0])&&(va=q[76+Ba>>2],36==r[va+3|0]))q[((o[va+2|0]<<2)+ya|0)-192>>2]=10,Da=q[((o[va+2|0]<<3)+xa|0)-384>>2],q[76+Ba>>2]=va=va+4|0;else{if(Ra)break b;Da=a?(va=q[wa>>2],q[wa>>2]=va+4,q[va>>2]):0,va=q[76+Ba>>2]+2|0,q[76+Ba>>2]=va}else q[76+Ba>>2]=va+1,Da=Ha(76+Ba|0),va=q[76+Ba>>2];for(Ca=0;;){if(Sa=Ca,Ka=-1,57<o[0|va]+-65>>>0)break a;if(q[76+Ba>>2]=Ma=va+1|0,Ca=o[0|va],va=Ma,!((Ca=r[3327+(Ca+w(Sa,58)|0)|0])+-1>>>0<8))break}if(!Ca)break a;A:{B:{C:{if(19==(0|Ca)){if((0|Pa)<=-1)break C;break a}if((0|Pa)<0)break B;q[(Pa<<2)+ya>>2]=Ca,Ca=q[4+(va=(Pa<<3)+xa|0)>>2],q[64+Ba>>2]=q[va>>2],q[68+Ba>>2]=Ca}if(va=0,a)break A;continue c}if(!a)break e;Ga(64+Ba|0,Ca,wa,Aa),Ma=q[76+Ba>>2]}if(Ja=-65537&Fa,Fa=8192&Fa?Ja:Fa,Pa=3360,Ca=Qa,va=o[Ma+-1|(Ka=0)],(Ma=(va=Sa&&3==(15&va)?-33&va:va)+-88|0)>>>0<=32)break r;D:{E:{F:{G:{if(6<(Ja=va+-65|0)>>>0){if(83!=(0|va))break f;if(!Da)break G;Ca=q[64+Ba>>2];break E}switch(Ja-1|0){case 1:break F;case 0:case 2:break f;default:break q}}_(a,32,Na,va=0,Fa);break D}q[12+Ba>>2]=0,q[8+Ba>>2]=q[64+Ba>>2],q[64+Ba>>2]=8+Ba,Da=-1,Ca=8+Ba|0}va=0;H:{for(;;){if(!(Ia=q[Ca>>2]))break H;if((Ja=(0|(Ia=Ea(4+Ba|0,Ia)))<0)|Da-va>>>0<Ia>>>0)break;if(Ca=Ca+4|0,!((va=va+Ia|0)>>>0<Da>>>0))break H}if(Ka=-1,Ja)break a}if(_(a,32,Na,va,Fa),va)for(Da=0,Ca=q[64+Ba>>2];;){if(!(Ia=q[Ca>>2]))break D;if((0|va)<(0|(Da=(Ia=Ea(4+Ba|0,Ia))+Da|0)))break D;if(Z(a,4+Ba|0,Ia),Ca=Ca+4|0,!(Da>>>0<va>>>0))break}else va=0}_(a,32,Na,va,8192^Fa),va=(0|va)<(0|Na)?Na:va;continue c}q[76+Ba>>2]=Ca=va+1|0,Fa=r[va+1|0],va=Ca;continue}break}switch(Ma-1|0){case 28:break i;case 21:break j;case 23:break l;case 22:break m;case 11:case 16:break n;case 10:break o;case 26:break p;case 8:case 12:case 13:case 14:break q;case 0:case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 9:case 15:case 17:case 18:case 19:case 20:case 24:case 25:case 27:case 29:case 30:break f;default:break k}}if(Ka=Oa,a)break a;if(!Ra)break e;for(va=1;;){if(a=q[(va<<2)+ya>>2]){if(Ga((va<<3)+xa|0,a,wa,Aa),10!=(0|(va=va+(Ka=1)|0)))continue;break a}break}if(Ka=1,9<va>>>0)break a;if(Ka=-1,q[(va<<2)+ya>>2])break a;for(;!q[((va=va+1|0)<<2)+ya>>2]&&10!=(0|va););Ka=va>>>0<10?-1:1;break a}va=0|n[za](a,v[64+Ba>>3],Na,Da,Fa,va);continue}Ca=(va=La(Ia=(va=q[64+Ba>>2])||3370,Da))||Da+Ia|0,Fa=Ja,Da=va?va-Ia|0:Da;break f}o[55+Ba|0]=q[64+Ba>>2],Da=1,Ia=Ta,Fa=Ja;break f}if(va=Ja=q[68+Ba>>2],Ia=q[64+Ba>>2],(0|va)<-1||(0|va)<=-1&&!(4294967295<Ia>>>0)){va=0-(va+(0<Ia>>>0)|0)|0,q[64+Ba>>2]=Ia=0-Ia|0,q[68+Ba>>2]=va,Ka=1,Pa=3360;break h}if(2048&Fa){Ka=1,Pa=3361;break h}Pa=(Ka=1&Fa)?3362:3360;break h}if(Ia=function(a,Gl,Pm){if(a|Gl)for(;o[0|(Pm=Pm+-1|0)]=7&a|48,(a=(7&Gl)<<29|a>>>3)|(Gl>>>=3););return Pm}(q[64+Ba>>2],q[68+Ba>>2],Qa),!(8&Fa))break g;Da=(0|(va=Qa-Ia|0))<(0|Da)?Da:va+1|0;break g}Da=8<Da>>>0?Da:8,Fa|=8,va=120}if(Ia=function(a,Gl,Pm,Qm){if(a|Gl)for(;o[0|(Pm=Pm+-1|0)]=r[3856+(15&a)|0]|Qm,(a=(15&Gl)<<28|a>>>4)|(Gl>>>=4););return Pm}(q[64+Ba>>2],q[68+Ba>>2],Qa,32&va),!(8&Fa)|!(q[64+Ba>>2]|q[68+Ba>>2]))break g;Pa=3360+(va>>>4)|0,Ka=2;break g}if(7<(Ca=255&Sa)>>>(va=0))continue;switch(Ca-1|0){default:case 0:q[q[64+Ba>>2]>>2]=Oa;continue;case 1:Ca=q[64+Ba>>2],q[Ca>>2]=Oa,q[Ca+4>>2]=Oa>>31;continue;case 2:p[q[64+Ba>>2]>>1]=Oa;continue;case 3:o[q[64+Ba>>2]]=Oa;continue;case 5:q[q[64+Ba>>2]>>2]=Oa;continue;case 4:continue;case 6:}Ca=q[64+Ba>>2],q[Ca>>2]=Oa,q[Ca+4>>2]=Oa>>31;continue}Ia=q[64+Ba>>2],va=q[68+Ba>>2],Pa=3360}Ia=ga(Ia,va,Qa)}Fa=-1<(0|Da)?-65537&Fa:Fa,Da=!!((Ja=va=q[68+Ba>>2])|(Ma=q[64+Ba>>2]))|Da?(0|(va=!(Ja|Ma)+(Qa-Ia|0)|0))<(0|Da)?Da:va:(Ia=Qa,0)}_(a,32,va=(0|Na)<(0|(Ca=(Da=(0|Da)<(0|(Ja=Ca-Ia|0))?Ja:Da)+Ka|0))?Ca:Na,Ca,Fa),Z(a,Pa,Ka),_(a,48,va,Ca,65536^Fa),_(a,48,Da,Ja,0),Z(a,Ia,Ja),_(a,32,va,Ca,8192^Fa);continue}break}Ka=0;break a}Ka=-1}return L=80+Ba|0,Ka}function sa(a){var ya,va=0,wa=0,xa=0,za=0,xa=4,wa=1439;a:if(va=r[0|a]){for(;!((0|(ya=r[0|wa]))!=(0|va)||!(xa=xa+-1|0)|!ya);)if(wa=wa+1|0,va=r[a+1|0],a=a+1|0,!va)break a;za=va}return(255&za)-r[0|wa]|0}function ta(a,Aa,Ea){var La,Ga,Ha=0,Ua=0,Va=0;q[(L=Ga=L-240|0)>>2]=a,Ua=1;a:if(!((0|Aa)<2))for(Ha=a;;){if(Ha=(La=Ha+-4|0)-q[((Va=Aa+-2|0)<<2)+Ea>>2]|0,0<=(0|n[5](a,Ha))&&-1<(0|n[5](a,La)))break a;if(a=(Ua<<2)+Ga|0,0<=(0|n[5](Ha,La))?(q[a>>2]=Ha,Va=Aa+-1|0):Ha=q[a>>2]=La,Ua=Ua+1|0,(0|Va)<2)break a;a=q[Ga>>2],Aa=Va}Na(Ga,Ua),L=240+Ga|0}function ua(a){var Ea,_a,Aa=0;if(x(0),function(a){var Hg,Ig;q[a+428>>2]&&(Ig=q[a+332>>2],$(q[a+460>>2],q[a+436>>2],Hg=Ig<<2),$(q[a+464>>2],q[a+440>>2],Hg),$(q[a+468>>2],q[a+448>>2],Hg),r[q[a>>2]+4|0]<4||($(q[a+472>>2],q[a+452>>2],Hg=Ig<<4),$(q[a+476>>2],q[a+456>>2],Hg)))}(a),function(a){var he,ie,je,ce=0,de=x(0),ee=x(0),fe=0,ge=x(0);x(0),x(0);if(1<=(0|(fe=q[a>>2])))for(je=(ce=q[a+4>>2])+w(fe,52)|0,a=q[a+12>>2];de=u[a>>2],u[ce+44>>2]!=(de=(he=q[ce+16>>2])?(ee=de,de=u[ce+4>>2],ge=u[ce+12>>2],ee=x(x(ee-de)/ge),ie=x(C(ee)),fe=x(y(ie))<x(2147483648)?~~ie:-2147483648,x(de+x(ge*x(ee-x(0|fe))))):(ge=u[ce+4>>2],ee=u[ce+8>>2],de<ge?ge:ee<de?ee:de))?(u[ce+44>>2]=de,q[ce+48>>2]=1):q[ce+48>>2]=0,he||(u[a>>2]=de),a=a+4|0,(ce=ce+52|0)>>>0<je>>>0;);}(a+540|0),function(a){var Td,Ud,Zd,$d,ae,be,Od=0,Pd=0,Qd=x(0),Rd=0,Sd=x(0),Vd=(x(0),x(0),0),Wd=x(0),Xd=0,Yd=0,_d=0;x(0);if(1<=(0|(Rd=q[a+540>>2])))for(ae=(Vd=q[a+544>>2])+w(Rd,52)|0,be=q[a+644>>2];;){a:if(!(q[Vd>>2]||(0|(Rd=q[Vd+32>>2]))<1))if(Zd=(a=q[Vd+28>>2])+w(Rd,28)|0,$d=u[Vd+24>>2],Ud=u[Vd+20>>2],Td=u[Vd+44>>2],be)for(;;){Wd=x(Yd=0);h:{i:{j:{if((0|(Pd=q[a>>2]))<1)Od=Rd=0;else if(Xd=q[a+4>>2],Sd=u[Xd>>2],Qd=x(Sd-Ud),1==(0|Pd))Rd=Td<x(Ud+Sd)^1|Qd<Td^1,Od=0;else{if(Td<Qd){Rd=1,Od=0;break i}if(Rd=0,Td<x(Ud+Sd))Od=0;else{if(Od=1,Qd=u[Xd+4>>2],!(Td<x(Ud+Qd)))for(;;){if((0|Pd)==(0|(Od=Od+1|0)))break j;if(Sd=Qd,Qd=u[Xd+(Od<<2)>>2],Td<x(Ud+Qd))break}x(Qd-Ud)<Td||(Od=Od+-1|0,(Qd=x(Qd-Sd))<$d)||(Wd=x(x(Td-Sd)/Qd))}}if(Rd)break i;if(Xd=Pd=1,q[a+16>>2])break h;break i}Od=Pd+-1|0,Rd=1}Xd=(Pd=(Sd=u[a+12>>2])!=Wd)&(Wd==x(0)|Sd==x(0))|q[a+8>>2]!=(0|Od),Yd=Rd}if(q[a+20>>2]=Xd,q[a+24>>2]=Pd,u[a+12>>2]=Wd,q[a+16>>2]=Yd,q[a+8>>2]=Od,!((a=a+28|0)>>>0<Zd>>>0))break}else{if(!q[Vd+48>>2])for(;;)if(q[a+20>>2]=0,!((a=a+28|(q[a+24>>2]=0))>>>0<Zd>>>0))break a;for(;;){Wd=x(Yd=0);b:{c:{d:{e:if(!(((Pd=0)|(Od=q[(Xd=a)>>2]))<1)){if(Rd=q[a+4>>2],Sd=u[Rd>>2],Qd=x(Sd-Ud),1!=(0|Od)){if(!(Td<Qd)){if(Pd=0,Td<x(Ud+Sd))break e;Pd=1;f:if(Qd=u[Rd+4>>2],!(Td<x(Ud+Qd))){for(Od=Od+-1|0;Sd=Qd,(0|Od)!=(0|Pd);)if(Qd=u[Rd+((Pd=Pd+1|0)<<2)>>2],Td<x(Ud+Qd))break f;Rd=1;break c}if(Rd=0,x(Qd-Ud)<Td){Od=Pd;break d}if(Od=Pd+-1|0,(Qd=x(Qd-Sd))<$d)break d;Wd=x(x(Td-Sd)/Qd);break d}Rd=1,Od=0;break c}Pd=Td<x(Ud+Sd)^1|Qd<Td^1}Rd=Pd,Od=0}if(!Rd&&(_d=Pd=1,q[a+16>>2]))break b}Yd=Rd,_d=(Pd=(Sd=u[a+12>>2])!=Wd)&(Wd==x(0)|Sd==x(0))|q[a+8>>2]!=(0|Od)}if(q[Xd+20>>2]=_d,q[a+24>>2]=Pd,u[a+12>>2]=Wd,q[a+16>>2]=Yd,q[a+8>>2]=Od,!((a=a+28|0)>>>0<Zd>>>0))break}}if(!((Vd=Vd+52|0)>>>0<ae>>>0))break}}(a),function(a){var od,pd,qd,rd,sd,hd=0,id=x(0),jd=0,kd=0,ld=x(0),md=0,nd=x(0);x(0);if(!(r[q[a>>2]+4|0]<4||(0|(hd=q[a+540>>2]))<1))for(rd=(md=q[a+544>>2])+w(hd,52)|0,sd=q[a+644>>2];;){b:if(1==q[md>>2]&&!((0|(hd=q[md+40>>2]))<1))if(pd=(a=q[md+36>>2])+w(hd,28)|0,od=u[md+44>>2],sd)for(;;){nd=x(hd=0);d:if(!((0|(kd=q[a>>2]))<2||(jd=q[a+4>>2],od<=(id=u[jd>>2])))){hd=1;e:if(!(od<(ld=u[jd+4>>2]))){for(;id=ld,(0|kd)!=(0|(hd=hd+1|0));)if(od<(ld=u[jd+(hd<<2)>>2]))break e;hd=kd+-1|0;break d}nd=x(x(od-id)/x(ld-id)),hd=hd+-1|0}if(id=u[a+16>>2],u[a+16>>2]=nd,kd=q[a+12>>2],q[a+12>>2]=hd,q[a+24>>2]=jd=id!=nd,q[a+20>>2]=jd&(nd==x(0)|id==x(0))|(0|hd)!=(0|kd),!((a=a+28|0)>>>0<pd>>>0))break}else{if(!q[md+48>>2])for(;;)if(q[a+20>>2]=0,!((a=a+28|(q[a+24>>2]=0))>>>0<pd>>>0))break b;for(;;){nd=x(kd=0);c:if(!((0|(qd=q[a>>2]))<2||(jd=q[a+4>>2],od<=(id=u[jd>>2])))){if(hd=1,!(od<(ld=u[jd+4>>2])))for(kd=qd+-1|0;;){if(id=ld,(0|hd)==(0|kd))break c;if(od<(ld=u[jd+((hd=hd+1|0)<<2)>>2]))break}nd=x(x(od-id)/x(ld-id)),kd=hd+-1|0}if(id=u[a+16>>2],u[a+16>>2]=nd,hd=q[a+12>>2],q[a+12>>2]=kd,q[a+24>>2]=jd=id!=nd,q[a+20>>2]=jd&(nd==x(0)|id==x(0))|(0|hd)!=(0|kd),!((a=a+28|0)>>>0<pd>>>0))break}}if(!((md=md+52|0)>>>0<rd>>>0))break}}(a),function(a){var Fd,Gd,Jd,Kd,Ld,Md,Nd,td=0,ud=0,vd=0,wd=0,xd=0,yd=0,zd=0,Ad=x(0),Bd=0,Dd=0,Ed=0,Hd=0,Id=0;if(1<=(0|(ud=q[a+564>>2])))for(Md=(xd=q[a+568>>2])+w(ud,36)|0,Kd=q[a+644>>2];;){a:{if(!(yd=((vd=wd=ud=0)|(Gd=q[xd+4>>2]))<1))for(Bd=q[xd>>2],a=Hd=0;;){if(td=q[Bd+(a<<2)>>2],q[td+16>>2]){td=1,Id=0;break a}if(vd=vd||q[td+24>>2],ud=ud||q[td+20>>2],wd=(u[td+12>>2]!=x(0))+wd|0,(0|Gd)==(0|(a=a+1|0)))break}if(td=0,(Hd=Kd?1:vd)|(Id=Kd?1:ud)&&(q[xd+12>>2]=Bd=1<<wd,31!=(0|wd))){for(ud=q[xd+20>>2],Ld=q[xd>>2],vd=(a=q[xd+16>>2])+(zd=Bd<<2)|0,vd=ca(a,0,4+((-1^a)+((a=a+4|0)>>>0<vd>>>0?vd:a)|0)&-4),zd=ud+zd|0,a=ud;q[a>>2]=1065353216,(a=a+4|0)>>>0<zd>>>0;);if(!yd){if(yd=0,zd=td=1,wd)for(;;){if(wd=q[(yd<<2)+Ld>>2],Dd=q[wd+8>>2],Ed=w(Dd,td),(Ad=u[wd+12>>2])!=x(a=0)){for(q[vd>>2]=Ed+q[vd>>2],u[ud>>2]=x(x(1)-Ad)*u[ud>>2],Dd=w(Dd+(a=1)|0,td);Ad=u[wd+12>>2],Nd=q[(Jd=(Fd=a<<2)+vd|0)>>2],q[Jd>>2]=Nd+((Jd=a&zd)?Dd:Ed),u[(Fd=ud+Fd|0)>>2]=(Jd?Ad:x(x(1)-Ad))*u[Fd>>2],(0|Bd)!=(0|(a=a+1|0)););zd<<=1}else for(;q[(Dd=vd+(a<<2)|0)>>2]=Ed+q[Dd>>2],(0|Bd)!=(0|(a=a+1|0)););if(td=w(q[wd>>2],td),(0|Gd)==(0|(yd=yd+1|0)))break}else for(;;){if(wd=q[(yd<<2)+Ld>>2],zd=w(q[wd+8>>2],td),(Ad=u[wd+12>>2])!=x(a=0))q[vd>>2]=zd+q[vd>>2],u[ud>>2]=x(x(1)-Ad)*u[ud>>2];else for(;q[(Ed=vd+(a<<2)|0)>>2]=zd+q[Ed>>2],(0|Bd)!=(0|(a=a+1|0)););if(td=w(q[wd>>2],td),(0|Gd)==(0|(yd=yd+1|0)))break}td=0}}}if(q[xd+32>>2]=td,q[xd+24>>2]=Id,q[xd+28>>2]=Hd,!((xd=xd+36|0)>>>0<Md>>>0))break}}(a),function(a){var dd,ed,fd,gd,Tc=x(0),Uc=0,Vc=0,Wc=0,Xc=0,Yc=0,Zc=x(0),_c=x(0),$c=x(0),ad=0,bd=0,cd=0;if(!(r[q[a>>2]+4|0]<4||(0|(Uc=q[a+588>>2]))<1))for(gd=(Wc=q[a+592>>2])+w(Uc,48)|0,dd=q[a+644>>2];;){if(a=q[Wc>>2],(bd=dd?1:q[a+20>>2])|(cd=dd?1:q[a+24>>2])){c:{d:{Yc=Wc,Xc=q[a+8>>2],Uc=q[a+12>>2],Tc=u[a+16>>2],a=(0|Xc)!=(0|Uc);e:{if(Tc!=x(0)){if(a=Uc+1|0,(0|Uc)==(0|Xc)){q[Wc+8>>2]=bd=1,Tc=x(x(1)-Tc),cd=1;break e}a=(0|a)==(0|Xc)?1:2}if(q[Yc+8>>2]=a,!cd)break d;a=Uc}u[Wc+24>>2]=Tc,u[Wc+20>>2]=x(1)-Tc;break c}cd=0,a=Uc}bd?(q[Wc+12>>2]=a,q[Wc+16>>2]=a+1):bd=0}else bd=cd=0;g:if((0|(ed=q[Wc+36>>2]))<1)$c=x(1);else{if(fd=q[Wc+40>>2],a=0,$c=x(1),!dd)for(;;){h:{i:{if(Uc=q[(a<<2)+fd>>2],Vc=q[Uc>>2]){if(!q[Vc+48>>2]){Tc=u[Uc+16>>2];break h}if((0|(Xc=q[Uc+12>>2]))<1){Tc=x(1),u[Uc+16>>2]=1;break h}if(ad=q[Uc+8>>2],1!=(0|Xc)&&(Zc=u[Vc+44>>2],Yc=q[Uc+4>>2],!(Zc<=(_c=u[Yc>>2]))))break i;Tc=u[ad>>2],u[Uc+16>>2]=Tc;break h}q[Uc+16>>2]=1065353216,Tc=x(1);break h}Vc=1;j:if(!(Zc<(Tc=u[Yc+4>>2]))){for(;_c=Tc,(0|Xc)!=(0|(Vc=Vc+1|0));)if(Zc<(Tc=u[Yc+(Vc<<2)>>2]))break j;Tc=u[(ad+(Xc<<2)|0)-4>>2],u[Uc+16>>2]=Tc;break h}Yc=Uc,Tc=x(x(Zc-_c)/x(Tc-_c)),Tc=x(x(Tc*u[(Uc=ad+(Vc<<2)|0)>>2])+x(u[Uc+-4>>2]*x(x(1)-Tc))),u[Yc+16>>2]=Tc}if($c=$c<Tc?$c:Tc,(0|ed)==(0|(a=a+1|0)))break g}for(;;){Uc=q[(a<<2)+fd>>2],Vc=q[Uc>>2],Tc=x(1);l:if(Vc&&(ad=q[Uc+12>>2],Tc=x(1),!((0|ad)<1))&&(Xc=q[Uc+8>>2],Tc=u[Xc>>2],1!=(0|ad))){m:{if(Zc=u[Vc+44>>2],Yc=q[Uc+4>>2],Zc<=(_c=u[Yc>>2])){Tc=u[Xc>>2];break l}if(Vc=1,!(Zc<(Tc=u[Yc+4>>2]))){for(;_c=Tc,(0|ad)!=(0|(Vc=Vc+1|0));)if(Zc<(Tc=u[Yc+(Vc<<2)>>2]))break m;Tc=u[(Xc+(ad<<2)|0)-4>>2];break l}}Tc=x(x(Zc-_c)/x(Tc-_c)),Tc=x(x(Tc*u[(Vc=Xc+(Vc<<2)|0)>>2])+x(u[Vc+-4>>2]*x(x(1)-Tc)))}if($c=$c<(u[Uc+16>>2]=Tc)?$c:Tc,(0|ed)==(0|(a=a+1|0)))break}}if(q[Wc+32>>2]=cd,q[Wc+28>>2]=bd,u[Wc+44>>2]=$c,!((Wc=Wc+48|0)>>>0<gd>>>0))break}}(a),1<=(0|(Ea=q[a+4>>2])))for(Ea=(Aa=q[a+52>>2])+(Ea<<2)|0;_a=u[Aa>>2],u[Aa>>2]=_a<x(0)?x(0):x(A(_a,x(1))),(Aa=Aa+4|0)>>>0<Ea>>>0;);!function(a){var Ce,De,Ee,Ae=0,Be=0;if(1<=(0|(Be=q[a+4>>2])))for(Ee=(Ae=q[a+8>>2])+w(Be,12)|0,a=Ce=q[a+40>>2];Be=0,q[Ae+8>>2]&&(De=q[Ae+4>>2],!q[(De<<2)+Ce>>2]&&-1!=(0|De)||(Be=!q[q[Ae>>2]+32>>2])),q[a>>2]=Be,a=a+4|0,(Ae=Ae+12|0)>>>0<Ee>>>0;);}(a),function(a){var og,sg,tg,ug,vg,wg,xg,mg=0,ng=0,pg=0,qg=0,rg=0;if(1<=(0|(sg=q[a+4>>2])))for(ug=q[a+8>>2],tg=q[a>>2],vg=q[tg+724>>2];;){if(og=q[w(qg,12)+ug>>2],(q[og+28>>2]||q[og+24>>2])&&(q[(mg=qg<<2)+q[a+28>>2]>>2]=q[og+12>>2],q[og+24>>2])&&!((0|(pg=q[og+12>>2]))<1))for(pg=(ng=q[og+16>>2])+(pg<<2)|0,wg=q[mg+vg>>2],mg=q[a+36>>2]+(rg<<2)|0,xg=q[tg+976>>2];q[mg>>2]=q[(q[ng>>2]+wg<<2)+xg>>2],mg=mg+4|0,(ng=ng+4|0)>>>0<pg>>>0;);if(q[og+28>>2]&&!((0|(mg=q[og+12>>2]))<1))for(pg=(ng=q[og+20>>2])+(mg<<2)|0,mg=q[a+32>>2]+(rg<<2)|0;q[mg>>2]=q[ng>>2],mg=mg+4|0,(ng=ng+4|0)>>>0<pg>>>0;);if(rg=q[og+8>>2]+rg|0,(0|sg)==(0|(qg=qg+1|0)))break}}(a),n[q[1816]](a+12|0,q[a+36>>2],q[a+44>>2],q[a+40>>2]),function(a){var ue,ve,we,xe,ye,ze,re=0,se=0,te=0;if(1<=(0|(te=q[a+304>>2])))for(we=(re=q[a+308>>2])+(te<<5)|0,xe=q[a+264>>2],ye=q[a+144>>2],ze=q[a+40>>2],te=ve=q[a+312>>2];ue=te,se=0,a=se=!q[re+28>>2]||-1!=(0|(a=q[re+4>>2]))&&(se=0,!q[(a<<2)+ze>>2])||-1!=(0|(a=q[re+8>>2]))&&(se=0,!q[(a<<2)+ve>>2])?se:!q[q[re>>2]+32>>2],q[ue>>2]=a,(ue=q[re+12>>2])>>>0<=1?ue-1?q[(q[re+16>>2]<<2)+ye>>2]=a:q[(q[re+16>>2]<<2)+xe>>2]=a:Y(4,1372,0),te=te+4|0,(re=re+32|0)>>>0<we>>>0;);}(a),function(a){var dg,eg,fg,gg,hg,ig,jg,kg,lg,Rf=0,Sf=0,Tf=0,Uf=0,Vf=0,Wf=0,Xf=0,Yf=0,Zf=0,_f=0,$f=0,ag=0,bg=0,cg=0,Vf=q[a>>2];if(1<=(0|(Yf=q[a+56>>2]))){for(Zf=q[a+60>>2],_f=q[Vf+1052>>2],$f=q[Vf+784>>2];;){if(Rf=q[Zf+w(Wf,24)>>2],(q[Rf+28>>2]||q[Rf+24>>2])&&(q[(Sf=Wf<<2)+q[a+80>>2]>>2]=q[Rf+12>>2],q[Rf+24>>2])&&!((0|(Uf=q[Rf+12>>2]))<1))for(ag=(Tf=q[Rf+16>>2])+(Uf<<2)|0,bg=q[Sf+$f>>2],Sf=(Uf=Xf<<2)+q[a+92>>2]|0,Uf=Uf+q[a+88>>2]|0;cg=bg+q[Tf>>2]<<2,q[Sf>>2]=_f+(q[cg+q[Vf+984>>2]>>2]<<2),q[Uf>>2]=q[cg+q[Vf+980>>2]>>2],Uf=Uf+4|0,Sf=Sf+4|0,(Tf=Tf+4|0)>>>0<ag>>>0;);if(q[Rf+28>>2]&&!((0|(Sf=q[Rf+12>>2]))<1))for(Uf=(Tf=q[Rf+20>>2])+(Sf<<2)|0,Sf=q[a+84>>2]+(Xf<<2)|0;q[Sf>>2]=q[Tf>>2],Sf=Sf+4|0,(Tf=Tf+4|0)>>>0<Uf>>>0;);if(Xf=q[Rf+8>>2]+Xf|0,(0|Yf)==(0|(Wf=Wf+1|0)))break}Vf=q[a>>2]}if(!(r[Vf+4|0]<4||(0|(bg=q[a+56>>2]))<1))for(cg=q[Vf+792>>2],dg=q[a+60>>2],Tf=Xf=0;;){if(Wf=q[w(Tf,24)+dg>>2],q[Wf+24>>2]&&!((0|(Rf=q[Wf+12>>2]))<1))for(eg=(Sf=q[Wf+16>>2])+(Rf<<2)|0,fg=q[cg+(Tf<<2)>>2],Uf=(Rf=Xf<<2)+q[a+96>>2]|0,Yf=Rf+q[a+100>>2]|0,Zf=Rf+q[a+104>>2]|0,_f=Rf+q[a+108>>2]|0,$f=Rf+q[a+112>>2]|0,ag=Rf+q[a+116>>2]|0,gg=q[Vf+1308>>2],hg=q[Vf+1304>>2],ig=q[Vf+1300>>2],jg=q[Vf+1296>>2],kg=q[Vf+1292>>2],lg=q[Vf+1288>>2];Rf=q[Sf>>2]+fg<<2,q[Uf>>2]=q[Rf+lg>>2],q[Yf>>2]=q[Rf+kg>>2],q[Zf>>2]=q[Rf+jg>>2],q[_f>>2]=q[Rf+ig>>2],q[$f>>2]=q[Rf+hg>>2],q[ag>>2]=q[Rf+gg>>2],ag=ag+4|0,$f=$f+4|0,_f=_f+4|0,Zf=Zf+4|0,Yf=Yf+4|0,Uf=Uf+4|0,(Sf=Sf+4|0)>>>0<eg>>>0;);if(Xf=q[Wf+8>>2]+Xf|0,(0|bg)==(0|(Tf=Tf+1|0)))break}}(a),function(a){var uf=0,vf=0,xf=0,yf=0,zf=0,Af=0,Bf=0,Cf=0,Df=0,Ef=0,Ff=0,Gf=0,Hf=0,If=0,Jf=0,Kf=0,Lf=0,Mf=0,Nf=0,Of=0,Pf=0,Qf=q[a+168>>2],wf=q[a>>2];if(1<=(0|(Hf=q[a+164>>2])))for(Jf=q[wf+816>>2];;){if(xf=q[w(Bf,12)+Qf>>2],(q[xf+28>>2]||q[xf+24>>2])&&(q[(Cf=Bf<<2)+q[a+188>>2]>>2]=q[xf+12>>2],q[xf+24>>2])){if(vf=q[xf+16>>2],If=q[Cf+Jf>>2],1<=(0|(uf=q[xf+12>>2])))for(Kf=vf+(uf<<2)|0,yf=(uf=Af<<2)+q[a+200>>2]|0,Df=uf+q[a+204>>2]|0,Ef=uf+q[a+208>>2]|0,Ff=uf+q[a+212>>2]|0,Gf=uf+q[a+196>>2]|0,Lf=q[wf+996>>2],Mf=q[wf+1012>>2],Nf=q[wf+1008>>2],Of=q[wf+1004>>2],Pf=q[wf+1e3>>2],uf=vf;zf=If+q[uf>>2]<<2,q[yf>>2]=q[zf+Pf>>2],q[Df>>2]=q[zf+Of>>2],q[Ef>>2]=q[zf+Nf>>2],q[Ff>>2]=q[zf+Mf>>2],q[Gf>>2]=q[zf+Lf>>2],Gf=Gf+4|0,Ff=Ff+4|0,Ef=Ef+4|0,Df=Df+4|0,yf=yf+4|0,(uf=uf+4|0)>>>0<Kf>>>0;);uf=If+q[vf>>2]<<2,q[Cf+q[a+288>>2]>>2]=q[uf+q[wf+1016>>2]>>2],q[Cf+q[a+292>>2]>>2]=q[uf+q[wf+1020>>2]>>2]}if(q[xf+28>>2]&&!((0|(vf=q[xf+12>>2]))<1))for(vf=(uf=q[xf+20>>2])+(vf<<2)|0,yf=q[a+192>>2]+(Af<<2)|0;q[yf>>2]=q[uf>>2],yf=yf+4|0,(uf=uf+4|0)>>>0<vf>>>0;);if(Af=q[xf+8>>2]+Af|0,(0|Hf)==(0|(Bf=Bf+1|0)))break}if(!(r[wf+4|0]<4||(0|(Cf=q[a+164>>2]))<1))for(If=q[wf+824>>2],Af=xf=0;;){if(zf=q[w(Af,12)+Qf>>2],q[zf+24>>2]&&!((0|(uf=q[zf+12>>2]))<1))for(Hf=(yf=q[zf+16>>2])+(uf<<2)|0,Jf=q[If+(Af<<2)>>2],Df=(vf=xf<<2)+q[a+216>>2]|0,Ef=vf+q[a+220>>2]|0,Ff=vf+q[a+224>>2]|0,Gf=vf+q[a+228>>2]|0,uf=vf+q[a+232>>2]|0,Bf=vf+q[a+236>>2]|0,Kf=q[wf+1308>>2],Lf=q[wf+1304>>2],Mf=q[wf+1300>>2],Nf=q[wf+1296>>2],Of=q[wf+1292>>2],Pf=q[wf+1288>>2];vf=Jf+q[yf>>2]<<2,q[Df>>2]=q[vf+Pf>>2],q[Ef>>2]=q[vf+Of>>2],q[Ff>>2]=q[vf+Nf>>2],q[Gf>>2]=q[vf+Mf>>2],q[uf>>2]=q[vf+Lf>>2],q[Bf>>2]=q[vf+Kf>>2],Bf=Bf+4|0,uf=uf+4|0,Gf=Gf+4|0,Ff=Ff+4|0,Ef=Ef+4|0,Df=Df+4|0,(yf=yf+4|0)>>>0<Hf>>>0;);if(xf=q[zf+8>>2]+xf|0,(0|Cf)==(0|(Af=Af+1|0)))break}}(a),function(a){var wk,ok=0,pk=0,qk=0,rk=0,sk=0,tk=0,uk=0,vk=0,ok=a- -64|0;if(n[q[1815]](ok,q[a+88>>2],q[a+148>>2],q[a+144>>2]),n[q[1817]](ok,q[a+92>>2],q[a+152>>2],q[q[a>>2]+796>>2],2,q[a+144>>2]),!(r[q[a>>2]+4|0]<4||(n[q[1815]](ok,q[a+96>>2],q[a+120>>2],q[a+144>>2]),n[q[1815]](ok,q[a+100>>2],q[a+124>>2],q[a+144>>2]),n[q[1815]](ok,q[a+104>>2],q[a+128>>2],q[a+144>>2]),n[q[1815]](ok,q[a+108>>2],q[a+132>>2],q[a+144>>2]),n[q[1815]](ok,q[a+112>>2],q[a+136>>2],q[a+144>>2]),n[q[1815]](ok,q[a+116>>2],q[a+140>>2],q[a+144>>2]),(0|(tk=q[a+56>>2]))<1))){for(uk=q[a+128>>2],vk=q[a+124>>2],wk=q[a+120>>2],pk=q[a+156>>2],ok=0;q[(qk=rk<<2)+pk>>2]=q[(sk=ok<<2)+wk>>2],q[pk+(4|qk)>>2]=q[sk+vk>>2],q[pk+(8|qk)>>2]=q[sk+uk>>2],rk=rk+4|0,(0|tk)!=(0|(ok=ok+1|0)););for(pk=q[a+160>>2],sk=q[a+140>>2],uk=q[a+136>>2],vk=q[a+132>>2],ok=a=0;q[(rk=a<<2)+pk>>2]=q[(qk=ok<<2)+vk>>2],q[pk+(4|rk)>>2]=q[qk+uk>>2],q[pk+(8|rk)>>2]=q[qk+sk>>2],a=a+4|0,(0|tk)!=(0|(ok=ok+1|0)););}}(a),function(a){var nk,fk=0,gk=0,hk=0,ik=0,jk=0,kk=0,lk=0,mk=0,fk=a+172|0;if(n[q[1815]](fk,q[a+196>>2],q[a+268>>2],q[a+264>>2]),n[q[1815]](fk,q[a+200>>2],q[a+284>>2],q[a+264>>2]),n[q[1815]](fk,q[a+204>>2],q[a+276>>2],q[a+264>>2]),n[q[1815]](fk,q[a+208>>2],q[a+280>>2],q[a+264>>2]),n[q[1815]](fk,q[a+212>>2],q[a+272>>2],q[a+264>>2]),!(r[q[a>>2]+4|0]<4||(n[q[1815]](fk,q[a+216>>2],q[a+240>>2],q[a+264>>2]),n[q[1815]](fk,q[a+220>>2],q[a+244>>2],q[a+264>>2]),n[q[1815]](fk,q[a+224>>2],q[a+248>>2],q[a+264>>2]),n[q[1815]](fk,q[a+228>>2],q[a+252>>2],q[a+264>>2]),n[q[1815]](fk,q[a+232>>2],q[a+256>>2],q[a+264>>2]),n[q[1815]](fk,q[a+236>>2],q[a+260>>2],q[a+264>>2]),(0|(kk=q[a+164>>2]))<1))){for(lk=q[a+248>>2],mk=q[a+244>>2],nk=q[a+240>>2],gk=q[a+296>>2],fk=0;q[(hk=ik<<2)+gk>>2]=q[(jk=fk<<2)+nk>>2],q[gk+(4|hk)>>2]=q[jk+mk>>2],q[gk+(8|hk)>>2]=q[jk+lk>>2],ik=ik+4|0,(0|kk)!=(0|(fk=fk+1|0)););for(gk=q[a+300>>2],jk=q[a+260>>2],lk=q[a+256>>2],mk=q[a+252>>2],fk=a=0;q[(ik=a<<2)+gk>>2]=q[(hk=fk<<2)+mk>>2],q[gk+(4|ik)>>2]=q[hk+lk>>2],q[gk+(8|ik)>>2]=q[hk+jk>>2],a=a+4|0,(0|kk)!=(0|(fk=fk+1|0)););}}(a),function(a){var oe,pe,qe,le=0,me=0,ne=0;if(1<=(0|(me=q[a+332>>2])))for(oe=(le=q[a+336>>2])+w(me,20)|0,pe=q[a+312>>2],qe=q[a+40>>2],a=q[a+424>>2];me=0,q[le+12>>2]&&(ne=q[le+4>>2],q[(ne<<2)+qe>>2]||-1==(0|ne))&&(ne=q[le+8>>2],q[(ne<<2)+pe>>2]||-1==(0|ne))&&(me=!q[q[le>>2]+32>>2]),q[a>>2]=me,a=a+4|0,(le=le+20|0)>>>0<oe>>>0;);}(a),function(a){var mf,nf,of,pf,qf,rf,sf,tf,Ye=0,Ze=0,_e=0,$e=0,af=0,bf=0,cf=0,df=0,ef=0,ff=0,gf=0,hf=0,jf=0,kf=0,lf=0,$e=q[a>>2];if(1<=(0|(ff=q[a+332>>2]))){for(gf=q[a+336>>2],hf=q[$e+1052>>2],jf=q[$e+856>>2];;){if(Ye=q[gf+w(cf,20)>>2],(q[Ye+28>>2]||q[Ye+24>>2])&&(q[(Ze=cf<<2)+q[a+356>>2]>>2]=q[Ye+12>>2],q[Ye+24>>2])&&!((0|(af=q[Ye+12>>2]))<1))for(kf=(_e=q[Ye+16>>2])+(af<<2)|0,lf=q[Ze+jf>>2],Ze=(bf=df<<2)+q[a+372>>2]|0,af=bf+q[a+364>>2]|0,bf=bf+q[a+368>>2]|0;ef=lf+q[_e>>2]<<2,q[Ze>>2]=hf+(q[ef+q[$e+1040>>2]>>2]<<2),q[af>>2]=q[ef+q[$e+1032>>2]>>2],q[bf>>2]=q[ef+q[$e+1036>>2]>>2],bf=bf+4|0,af=af+4|0,Ze=Ze+4|0,(_e=_e+4|0)>>>0<kf>>>0;);if(q[Ye+28>>2]&&!((0|(Ze=q[Ye+12>>2]))<1))for(af=(_e=q[Ye+20>>2])+(Ze<<2)|0,Ze=q[a+360>>2]+(df<<2)|0;q[Ze>>2]=q[_e>>2],Ze=Ze+4|0,(_e=_e+4|0)>>>0<af>>>0;);if(df=q[Ye+8>>2]+df|0,(0|ff)==(0|(cf=cf+1|0)))break}$e=q[a>>2]}if(!(r[$e+4|0]<4||(0|(jf=q[a+332>>2]))<1))for(kf=q[$e+864>>2],lf=q[a+336>>2],_e=df=0;;){if(cf=q[lf+w(_e,20)>>2],q[cf+24>>2]&&!((0|(Ye=q[cf+12>>2]))<1))for(mf=(Ze=q[cf+16>>2])+(Ye<<2)|0,nf=q[kf+(_e<<2)>>2],af=(Ye=df<<2)+q[a+376>>2]|0,bf=Ye+q[a+380>>2]|0,ef=Ye+q[a+384>>2]|0,ff=Ye+q[a+388>>2]|0,gf=Ye+q[a+392>>2]|0,hf=Ye+q[a+396>>2]|0,of=q[$e+1308>>2],pf=q[$e+1304>>2],qf=q[$e+1300>>2],rf=q[$e+1296>>2],sf=q[$e+1292>>2],tf=q[$e+1288>>2];Ye=q[Ze>>2]+nf<<2,q[af>>2]=q[Ye+tf>>2],q[bf>>2]=q[Ye+sf>>2],q[ef>>2]=q[Ye+rf>>2],q[ff>>2]=q[Ye+qf>>2],q[gf>>2]=q[Ye+pf>>2],q[hf>>2]=q[Ye+of>>2],hf=hf+4|0,gf=gf+4|0,ff=ff+4|0,ef=ef+4|0,bf=bf+4|0,af=af+4|0,(Ze=Ze+4|0)>>>0<mf>>>0;);if(df=q[cf+8>>2]+df|0,(0|jf)==(0|(_e=_e+1|0)))break}}(a),function(a){var ek,tj=0,vj=0,wj=0,$j=0,ak=0,bk=0,ck=0,dk=0,tj=a+340|0;if(n[q[1815]](tj,q[a+364>>2],q[a+448>>2],q[a+424>>2]),n[q[1816]](tj,q[a+368>>2],q[a+440>>2],q[a+424>>2]),n[q[1817]](tj,q[a+372>>2],q[a+444>>2],q[q[a>>2]+892>>2],2,q[a+424>>2]),!(r[q[a>>2]+4|0]<4||(n[q[1815]](tj,q[a+376>>2],q[a+400>>2],q[a+424>>2]),n[q[1815]](tj,q[a+380>>2],q[a+404>>2],q[a+424>>2]),n[q[1815]](tj,q[a+384>>2],q[a+408>>2],q[a+424>>2]),n[q[1815]](tj,q[a+388>>2],q[a+412>>2],q[a+424>>2]),n[q[1815]](tj,q[a+392>>2],q[a+416>>2],q[a+424>>2]),n[q[1815]](tj,q[a+396>>2],q[a+420>>2],q[a+424>>2]),(0|(bk=q[a+332>>2]))<1))){for(ck=q[a+408>>2],dk=q[a+404>>2],ek=q[a+400>>2],vj=q[a+452>>2],tj=0;q[(wj=$j<<2)+vj>>2]=q[(ak=tj<<2)+ek>>2],q[vj+(4|wj)>>2]=q[ak+dk>>2],q[vj+(8|wj)>>2]=q[ak+ck>>2],$j=$j+4|0,(0|bk)!=(0|(tj=tj+1|0)););for(vj=q[a+456>>2],ak=q[a+420>>2],ck=q[a+416>>2],dk=q[a+412>>2],tj=a=0;q[($j=a<<2)+vj>>2]=q[(wj=tj<<2)+dk>>2],q[vj+(4|$j)>>2]=q[wj+ck>>2],q[vj+(8|$j)>>2]=q[wj+ak>>2],a=a+4|0,(0|bk)!=(0|(tj=tj+1|0)););}}(a),function(a){var Oe,Se,Te,Ue,Ve,We,Xe,Me=0,Ne=0,Pe=0,Qe=0,Re=0;if(1<=(0|(Se=q[a+500>>2])))for(Ue=q[a+504>>2],Te=q[a>>2],Ve=q[Te+1252>>2];;){if(Oe=q[w(Qe,24)+Ue>>2],(q[Oe+28>>2]||q[Oe+24>>2])&&(q[(Me=Qe<<2)+q[a+524>>2]>>2]=q[Oe+12>>2],q[Oe+24>>2])&&!((0|(Pe=q[Oe+12>>2]))<1))for(Pe=(Ne=q[Oe+16>>2])+(Pe<<2)|0,We=q[Me+Ve>>2],Me=q[a+532>>2]+(Re<<2)|0,Xe=q[Te+1284>>2];q[Me>>2]=q[(q[Ne>>2]+We<<2)+Xe>>2],Me=Me+4|0,(Ne=Ne+4|0)>>>0<Pe>>>0;);if(q[Oe+28>>2]&&!((0|(Me=q[Oe+12>>2]))<1))for(Pe=(Ne=q[Oe+20>>2])+(Me<<2)|0,Me=q[a+528>>2]+(Re<<2)|0;q[Me>>2]=q[Ne>>2],Me=Me+4|0,(Ne=Ne+4|0)>>>0<Pe>>>0;);if(Re=q[Oe+8>>2]+Re|0,(0|Se)==(0|(Qe=Qe+1|0)))break}}(a),n[q[1815]](a+508|0,q[a+532>>2],q[a+536>>2],0),function(a){var Ck,Dk,Ek,Fk,Gk,Hk,xk=x(0),yk=0,zk=0,Ak=0,Bk=0;x(0);if(L=Ck=L-16|0,Ak=q[a>>2],!(r[Ak+4|0]<5||(0|(Bk=q[a+596>>2]))<1))for(Fk=(zk=q[a+600>>2])+w(Bk,12)|0,Gk=q[a+44>>2],Bk=q[Ak+976>>2];;){if(Ak=(q[zk>>2]<<2)+Gk|0,xk=x(q[Ak>>2]),1<=(0|(yk=q[zk+4>>2])))for(Hk=(a=q[zk+8>>2])+w(yk,48)|0;(yk=q[a+8>>2])&&((Dk=yk+-1|0)>>>0<=1?(yk=q[a+4>>2],Ek=u[Bk+(yk+q[a+12>>2]<<2)>>2],xk=x(Dk-1?xk+x(u[a+44>>2]*x(Ek*u[a+20>>2])):xk+x(u[a+44>>2]*x(x(Ek*u[a+20>>2])+x(u[Bk+(yk+q[a+16>>2]<<2)>>2]*u[a+24>>2]))))):(q[Ck>>2]=yk,Y(4,1024,Ck))),(a=a+48|0)>>>0<Hk>>>0;);if(xk=(xk=x(xk+x(.0010000000474974513)))<x(0)?x(0):x(A(xk,x(1e3))),a=x(y(xk))<x(2147483648)?~~xk:-2147483648,q[Ak>>2]=a,!((zk=zk+12|0)>>>0<Fk>>>0))break}L=16+Ck|0}(a),function(a){var kj,lj,mj,nj,oj,pj,qj,rj,sj,cj=0,ej=0,gj=0,hj=0,ij=0,jj=x(0);if(L=kj=L-16|0,cj=q[a>>2],!(r[cj+4|0]<4||(va(a,q[a+604>>2],q[a+608>>2],q[cj+984>>2],q[a+152>>2],q[cj+796>>2]),ej=q[a>>2],r[ej+4|0]<5))){if(gj=q[a+608>>2],oj=q[ej+992>>2],pj=q[ej+988>>2],1<=(0|(cj=q[a+604>>2]))){for(qj=w(cj,12)+gj|0,rj=q[a+148>>2],lj=q[ej+980>>2];;){if(mj=(q[gj>>2]<<2)+rj|0,ij=q[mj>>2],1<=(0|(hj=q[gj+4>>2])))for(sj=(cj=q[gj+8>>2])+w(hj,48)|0;(hj=q[cj+8>>2])&&((nj=hj+-1|0)>>>0<=1?(hj=q[cj+4>>2],jj=u[(hj+q[cj+12>>2]<<2)+lj>>2],j(x(nj-1?x(u[cj+44>>2]*x(jj*u[cj+20>>2]))+(f(0,ij),k()):x(u[cj+44>>2]*x(x(jj*u[cj+20>>2])+x(u[(hj+q[cj+16>>2]<<2)+lj>>2]*u[cj+24>>2])))+(f(0,ij),k()))),ij=b[0]):(q[kj>>2]=hj,Y(4,1024,kj))),(cj=cj+48|0)>>>0<sj>>>0;);if(f(0,ij),jj=k(),u[mj>>2]=jj<x(0)?x(0):x(A(jj,x(1))),!((gj=gj+12|0)>>>0<qj>>>0))break}gj=q[a+608>>2],cj=q[a+604>>2]}fa(cj,gj,pj,q[ej+1288>>2],q[ej+1292>>2],q[ej+1296>>2],q[a+156>>2]),fa(q[a+604>>2],q[a+608>>2],oj,q[ej+1300>>2],q[ej+1304>>2],q[ej+1308>>2],q[a+160>>2])}L=16+kj|0}(a),function(a){var yi,ri=0,si=0,ti=0,ui=0,vi=0,wi=x(0),xi=0,zi=0,Ai=0,Bi=0,Ci=0,Di=0,Ei=0,Fi=0;if(L=yi=L-80|0,vi=q[a>>2],!(r[vi+4|0]<5)){if(Di=q[vi+1028>>2],Ei=q[vi+1024>>2],ti=si=q[a+616>>2],!((0|(ri=q[a+612>>2]))<1)){for(zi=w(ri,12)+si|0,Ai=q[a+276>>2],xi=q[vi+1004>>2];;){if(Bi=Ai+(q[si>>2]<<2)|0,ti=q[Bi>>2],1<=(0|(ui=q[si+4>>2])))for(Fi=(ri=q[si+8>>2])+w(ui,48)|0;(ui=q[ri+8>>2])&&((Ci=ui+-1|0)>>>0<=1?(ui=q[ri+4>>2],wi=u[xi+(ui+q[ri+12>>2]<<2)>>2],j(x(Ci-1?x(u[ri+44>>2]*x(wi*u[ri+20>>2]))+(f(0,ti),k()):x(u[ri+44>>2]*x(x(wi*u[ri+20>>2])+x(u[xi+(ui+q[ri+16>>2]<<2)>>2]*u[ri+24>>2])))+(f(0,ti),k()))),ti=b[0]):(q[64+yi>>2]=ui,Y(4,1024,64+yi|0))),(ri=ri+48|0)>>>0<Fi>>>0;);if(q[Bi>>2]=ti,!((si=si+12|0)>>>0<zi>>>0))break}if(ti=si=q[a+616>>2],!((0|(ri=q[a+612>>2]))<1)){for(zi=w(ri,12)+si|0,Ai=q[a+280>>2],xi=q[q[a>>2]+1008>>2];;){if(Bi=Ai+(q[si>>2]<<2)|0,ti=q[Bi>>2],1<=(0|(ui=q[si+4>>2])))for(Fi=(ri=q[si+8>>2])+w(ui,48)|0;(ui=q[ri+8>>2])&&((Ci=ui+-1|0)>>>0<=1?(ui=q[ri+4>>2],wi=u[xi+(ui+q[ri+12>>2]<<2)>>2],j(x(Ci-1?x(u[ri+44>>2]*x(wi*u[ri+20>>2]))+(f(0,ti),k()):x(u[ri+44>>2]*x(x(wi*u[ri+20>>2])+x(u[xi+(ui+q[ri+16>>2]<<2)>>2]*u[ri+24>>2])))+(f(0,ti),k()))),ti=b[0]):(q[48+yi>>2]=ui,Y(4,1024,48+yi|0))),(ri=ri+48|0)>>>0<Fi>>>0;);if(q[Bi>>2]=ti,!((si=si+12|0)>>>0<zi>>>0))break}if(ti=si=q[a+616>>2],!((0|(ri=q[a+612>>2]))<1)){for(zi=w(ri,12)+si|0,Ai=q[a+268>>2],xi=q[q[a>>2]+996>>2];;){if(Bi=Ai+(q[si>>2]<<2)|0,ti=q[Bi>>2],1<=(0|(ui=q[si+4>>2])))for(Fi=(ri=q[si+8>>2])+w(ui,48)|0;(ui=q[ri+8>>2])&&((Ci=ui+-1|0)>>>0<=1?(ui=q[ri+4>>2],wi=u[xi+(ui+q[ri+12>>2]<<2)>>2],j(x(Ci-1?x(u[ri+44>>2]*x(wi*u[ri+20>>2]))+(f(0,ti),k()):x(u[ri+44>>2]*x(x(wi*u[ri+20>>2])+x(u[xi+(ui+q[ri+16>>2]<<2)>>2]*u[ri+24>>2])))+(f(0,ti),k()))),ti=b[0]):(q[32+yi>>2]=ui,Y(4,1024,32+yi|0))),(ri=ri+48|0)>>>0<Fi>>>0;);if(f(0,ti),wi=k(),u[Bi>>2]=wi<x(0)?x(0):x(A(wi,x(1))),!((si=si+12|0)>>>0<zi>>>0))break}ri=q[a+612>>2],ti=q[a+616>>2]}}}if(fa(ri,ti,Ei,q[vi+1288>>2],q[vi+1292>>2],q[vi+1296>>2],q[a+296>>2]),fa(q[a+612>>2],q[a+616>>2],Di,q[vi+1300>>2],q[vi+1304>>2],q[vi+1308>>2],q[a+300>>2]),!((0|(ri=q[a+612>>2]))<1)){for(ui=(si=q[a+616>>2])+w(ri,12)|0,Di=q[a+284>>2],vi=q[q[a>>2]+1e3>>2];;){if(Ei=Di+(q[si>>2]<<2)|0,ti=q[Ei>>2],1<=(0|(xi=q[si+4>>2])))for(zi=(ri=q[si+8>>2])+w(xi,48)|0;(xi=q[ri+8>>2])&&((Ai=xi+-1|0)>>>0<=1?(xi=q[ri+4>>2],wi=u[vi+(xi+q[ri+12>>2]<<2)>>2],j(x(Ai-1?x(u[ri+44>>2]*x(wi*u[ri+20>>2]))+(f(0,ti),k()):x(u[ri+44>>2]*x(x(wi*u[ri+20>>2])+x(u[vi+(xi+q[ri+16>>2]<<2)>>2]*u[ri+24>>2])))+(f(0,ti),k()))),ti=b[0]):(q[16+yi>>2]=xi,Y(4,1024,16+yi|0))),(ri=ri+48|0)>>>0<zi>>>0;);if(f(0,ti),wi=k(),u[Ei>>2]=wi<x(-3600)?x(-3600):x(A(wi,x(3600))),!((si=si+12|0)>>>0<ui>>>0))break}if(!((0|(ri=q[a+612>>2]))<1))for(xi=(si=q[a+616>>2])+w(ri,12)|0,ui=q[a+272>>2],a=q[q[a>>2]+1012>>2];;){if(Di=ui+(q[si>>2]<<2)|0,ti=q[Di>>2],1<=(0|(vi=q[si+4>>2])))for(Ei=(ri=q[si+8>>2])+w(vi,48)|0;(vi=q[ri+8>>2])&&((zi=vi+-1|0)>>>0<=1?(vi=q[ri+4>>2],wi=u[a+(vi+q[ri+12>>2]<<2)>>2],j(x(zi-1?x(u[ri+44>>2]*x(wi*u[ri+20>>2]))+(f(0,ti),k()):x(u[ri+44>>2]*x(x(wi*u[ri+20>>2])+x(u[a+(vi+q[ri+16>>2]<<2)>>2]*u[ri+24>>2])))+(f(0,ti),k()))),ti=b[0]):(q[yi>>2]=vi,Y(4,1024,yi))),(ri=ri+48|0)>>>0<Ei>>>0;);if(f(0,ti),wi=k(),u[Di>>2]=wi<x(9999999747378752e-20)?x(9999999747378752e-20):x(A(wi,x(100))),!((si=si+12|0)>>>0<xi>>>0))break}}}L=80+yi|0}(a),function(a){var Zh,di,ei,fi,gi,Sh=0,Uh=0,Vh=0,Wh=0,Xh=x(0),Yh=0,_h=0,$h=0,ai=0,bi=0,ci=0;x(0);if(L=Zh=L-32|0,Vh=q[a>>2],!(r[Vh+4|0]<4||(va(a,q[a+620>>2],q[a+624>>2],q[Vh+1040>>2],q[a+444>>2],q[Vh+892>>2]),Yh=q[a>>2],r[Yh+4|0]<5))){if(fi=q[Yh+1048>>2],gi=q[Yh+1044>>2],Vh=Wh=q[a+624>>2],!((0|(Sh=q[a+620>>2]))<1)){for(bi=w(Sh,12)+Wh|0,ci=q[a+440>>2],_h=q[Yh+1036>>2];;){if(Vh=ci+(q[Wh>>2]<<2)|0,Xh=x(q[Vh>>2]),1<=(0|(Uh=q[Wh+4>>2])))for($h=(Sh=q[Wh+8>>2])+w(Uh,48)|0;(Uh=q[Sh+8>>2])&&((ai=Uh+-1|0)>>>0<=1?(Uh=q[Sh+4>>2],di=u[_h+(Uh+q[Sh+12>>2]<<2)>>2],Xh=x(ai-1?Xh+x(u[Sh+44>>2]*x(di*u[Sh+20>>2])):Xh+x(u[Sh+44>>2]*x(x(di*u[Sh+20>>2])+x(u[_h+(Uh+q[Sh+16>>2]<<2)>>2]*u[Sh+24>>2]))))):(q[16+Zh>>2]=Uh,Y(4,1024,16+Zh|0))),(Sh=Sh+48|0)>>>0<$h>>>0;);if(Xh=(Xh=x(Xh+x(.0010000000474974513)))<x(0)?x(0):x(A(Xh,x(1e3))),Sh=x(y(Xh))<x(2147483648)?~~Xh:-2147483648,q[Vh>>2]=Sh,!((Wh=Wh+12|0)>>>0<bi>>>0))break}if(Vh=Wh=q[a+624>>2],!((0|(Sh=q[a+620>>2]))<1)){for(bi=w(Sh,12)+Wh|0,ci=q[a+448>>2],_h=q[q[a>>2]+1032>>2];;){if($h=ci+(q[Wh>>2]<<2)|0,Vh=q[$h>>2],1<=(0|(Uh=q[Wh+4>>2])))for(ai=(Sh=q[Wh+8>>2])+w(Uh,48)|0;(Uh=q[Sh+8>>2])&&((ei=Uh+-1|0)>>>0<=1?(Uh=q[Sh+4>>2],Xh=u[_h+(Uh+q[Sh+12>>2]<<2)>>2],j(x(ei-1?x(u[Sh+44>>2]*x(Xh*u[Sh+20>>2]))+(f(0,Vh),k()):x(u[Sh+44>>2]*x(x(Xh*u[Sh+20>>2])+x(u[_h+(Uh+q[Sh+16>>2]<<2)>>2]*u[Sh+24>>2])))+(f(0,Vh),k()))),Vh=b[0]):(q[Zh>>2]=Uh,Y(4,1024,Zh))),(Sh=Sh+48|0)>>>0<ai>>>0;);if(f(0,Vh),Xh=k(),u[$h>>2]=Xh<x(0)?x(0):x(A(Xh,x(1))),!((Wh=Wh+12|0)>>>0<bi>>>0))break}Sh=q[a+620>>2],Vh=q[a+624>>2]}}fa(Sh,Vh,gi,q[Yh+1288>>2],q[Yh+1292>>2],q[Yh+1296>>2],q[a+452>>2]),fa(q[a+620>>2],q[a+624>>2],fi,q[Yh+1300>>2],q[Yh+1304>>2],q[Yh+1308>>2],q[a+456>>2])}L=32+Zh|0}(a),function(a){var Og,Pg,Qg,Rg,Sg,Tg,Jg=0,Kg=0,Lg=0,Mg=0,Ng=x(0);if(L=Og=L-16|0,Kg=q[a>>2],!(r[Kg+4|0]<5||(0|(Mg=q[a+628>>2]))<1))for(Rg=(Lg=q[a+632>>2])+w(Mg,12)|0,Sg=q[a+536>>2],Mg=q[Kg+1284>>2];;){if(Pg=(q[Lg>>2]<<2)+Sg|0,Kg=q[Pg>>2],1<=(0|(Jg=q[Lg+4>>2])))for(Tg=(a=q[Lg+8>>2])+w(Jg,48)|0;(Jg=q[a+8>>2])&&((Qg=Jg+-1|0)>>>0<=1?(Jg=q[a+4>>2],Ng=u[Mg+(Jg+q[a+12>>2]<<2)>>2],j(x(Qg-1?x(u[a+44>>2]*x(Ng*u[a+20>>2]))+(f(0,Kg),k()):x(u[a+44>>2]*x(x(Ng*u[a+20>>2])+x(u[Mg+(Jg+q[a+16>>2]<<2)>>2]*u[a+24>>2])))+(f(0,Kg),k()))),Kg=b[0]):(q[Og>>2]=Jg,Y(4,1024,Og))),(a=a+48|0)>>>0<Tg>>>0;);if(f(0,Kg),Ng=k(),u[Pg>>2]=Ng<x(0)?x(0):x(A(Ng,x(1))),!((Lg=Lg+12|0)>>>0<Rg>>>0))break}L=16+Og|0}(a),function(a){var Nh,Qh,jh=0,Lh=0,Mh=0,Oh=x(0),Ph=0;if(1<=(0|(jh=q[a+4>>2])))for(Qh=(Lh=q[a+8>>2])+w(jh,12)|0,jh=q[a+40>>2],Mh=q[a+52>>2],a=Nh=q[a+48>>2];q[jh>>2]&&(Oh=u[Mh>>2],u[a>>2]=Oh,-1!=(0|(Ph=q[Lh+4>>2])))&&(u[a>>2]=Oh*u[(Ph<<2)+Nh>>2]),a=a+4|0,Mh=Mh+4|0,jh=jh+4|0,(Lh=Lh+12|0)>>>0<Qh>>>0;);}(a),function(a){var ih,fh=0,gh=0,hh=0;if(1<=(0|(ih=q[a+304>>2])))for(fh=q[a+308>>2],gh=q[a+312>>2];q[gh>>2]&&n[q[fh+20>>2]](a,hh),gh=gh+4|0,fh=fh+32|0,(0|ih)!=(0|(hh=hh+1|0)););}(a),function(a){var Wg,Xg,$g,dh,eh,Ug=0,Vg=0,Yg=(x(0),x(0),0),Zg=0,_g=0,ah=(x(0),0),bh=0,ch=0;if(1<=(0|(Ug=q[a+332>>2])))for(bh=(Vg=q[a+336>>2])+w(Ug,20)|0,ch=q[a+308>>2],ah=q[a+316>>2],eh=q[a+48>>2],Ug=q[a+448>>2],Yg=q[a+444>>2],_g=q[a+424>>2];q[_g>>2]&&(-1!=(0|(Zg=q[Vg+4>>2]))&&(u[Ug>>2]=u[(Zg<<2)+eh>>2]*u[Ug>>2]),-1!=(0|(Zg=q[Vg+8>>2])))&&(u[Ug>>2]=u[ah+(Zg<<2)>>2]*u[Ug>>2],dh=q[Yg>>2],n[q[24+(ch+(Zg<<5)|0)>>2]](a,Zg,dh,dh,q[Vg+16>>2])),Yg=Yg+4|0,Ug=Ug+4|0,_g=_g+4|0,(Vg=Vg+20|0)>>>0<bh>>>0;);if(!(r[q[a>>2]+4|0]<4||(0|(Ug=q[a+332>>2]))<1))for(Zg=(Yg=q[a+336>>2])+w(Ug,20)|0,bh=q[a+328>>2],ch=q[a+324>>2],Vg=q[a+452>>2],Ug=q[a+456>>2],_g=q[a+424>>2];q[_g>>2]&&-1!=(0|(a=q[Yg+8>>2]))&&(a=(ah=a<<4)+ch|0,Wg=x(u[Vg>>2]*u[a>>2]),u[Vg>>2]=Wg,Xg=x(u[Vg+4>>2]*u[a+4>>2]),u[Vg+4>>2]=Xg,$g=u[a+8>>2],q[Vg+12>>2]=1065353216,u[Vg+4>>2]=Xg<x(0)?x(0):x(A(Xg,x(1))),u[Vg>>2]=Wg<x(0)?x(0):x(A(Wg,x(1))),Wg=x($g*u[Vg+8>>2]),u[Vg+8>>2]=Wg<x(0)?x(0):x(A(Wg,x(1))),Wg=u[Ug>>2],Xg=u[(a=bh+ah|0)>>2],Wg=x(x(Wg+Xg)-x(Wg*Xg)),u[Ug>>2]=Wg,Xg=u[Ug+4>>2],$g=u[a+4>>2],Xg=x(x(Xg+$g)-x(Xg*$g)),u[Ug+4>>2]=Xg,$g=u[a+8>>2],q[Ug+12>>2]=1065353216,u[Ug+4>>2]=Xg<x(0)?x(0):x(A(Xg,x(1))),u[Ug>>2]=Wg<x(0)?x(0):x(A(Wg,x(1))),Wg=u[Ug+8>>2],Wg=x(x($g+Wg)-x(Wg*$g)),u[Ug+8>>2]=Wg<x(0)?x(0):x(A(Wg,x(1)))),Ug=Ug+16|0,Vg=Vg+16|0,_g=_g+4|0,(Yg=Yg+20|0)>>>0<Zg>>>0;);}(a),function(a){var Mn,Nn,Pn,Lo,Mo,No,Oo,Po,Qo,Ro,So,To,Uo,Vo,Wo,Xo,Yo,Zo,_o,$o,On=0;x(0),x(0),x(0),x(0),x(0),x(0),x(0);if(1<=(0|(Po=q[a+500>>2])))for(_o=q[a+536>>2],Qo=q[a+444>>2],$o=q[a+504>>2];;){if(a=w(On,24)+$o|0,0<(0|(Ro=q[a+12>>2])))for(Pn=u[(On<<2)+_o>>2],So=q[a+20>>2],To=q[a+16>>2],Uo=q[(q[a+4>>2]<<2)+Qo>>2],Vo=q[(q[a+8>>2]<<2)+Qo>>2],a=0;Wo=u[((Mn=1|a)<<2)+To>>2],Nn=s[(a<<1)+So>>1]<<3&262136,Lo=u[(Xo=(4|Nn)+Uo|0)>>2],Mn=s[(Mn<<1)+So>>1]<<3&262136,Mo=u[(Yo=(4|Mn)+Vo|0)>>2],No=u[(Nn=Nn+Uo|0)>>2],Zo=u[(a<<2)+To>>2],Oo=u[(Mn=Mn+Vo|0)>>2],u[Nn>>2]=No+x(Pn*x(Zo*x(Oo-No))),u[Xo>>2]=Lo+x(Pn*x(Zo*x(Mo-Lo))),u[Mn>>2]=Oo+x(Pn*x(Wo*x(No-Oo))),u[Yo>>2]=Mo+x(Pn*x(Wo*x(Lo-Mo))),(0|(a=a+2|0))<(0|Ro););if(!((0|(On=On+1|0))<(0|Po)))break}}(a),n[q[1818]](a),function(a){var Oc,Pc,Rc,Sc,Ec=0,Fc=0,Gc=0,Hc=0,Ic=0,Jc=0,Kc=0,Lc=0,Mc=0,Nc=0,Qc=0;if(!((0|(Oc=q[a+480>>2]))<1)){for(Hc=(Pc=q[a+484>>2])+w(Oc,28)|0,Kc=q[a+424>>2],Lc=q[a+40>>2],Ic=q[a+44>>2],Qc=q[a+440>>2],Ec=Pc;;){if(1<=(0|(Jc=q[Ec+4>>2])))for(Nc=Ec+20|0,Mc=q[Ec+12>>2],Fc=0;Rc=q[4+(Gc=Mc+(Fc<<4)|0)>>2]<<2,Gc=1==q[(Sc=Gc)>>2],q[Sc+12>>2]=q[(q[(Gc?Lc:Kc)+Rc>>2]?(Gc?Ic:Qc)+Rc|0:Nc)>>2],(0|(Fc=Fc+1|0))<(0|Jc););if(!((Ec=Ec+28|0)>>>0<Hc>>>0))break}if(!((0|Oc)<1))for(Qc=q[a+436>>2],Lc=0;;){if(Hc=w(Lc,28)+Pc|0,!(q[(Kc=Hc)+24>>2]<1)){for(Gc=q[a+488>>2],Fc=0;q[Gc+(Fc<<2)>>2]=-1,(0|(Fc=Fc+1|0))<(0|(Ec=q[Kc+24>>2])););if(!((0|Ec)<1))for(Ec=q[a+496>>2],Fc=0;q[Ec+(Fc<<2)>>2]=-1,(0|(Fc=Fc+1|0))<q[Kc+24>>2];);}if(!(q[Hc+4>>2]<1)){for(Ic=q[a+492>>2],Fc=0;q[Ic+(Fc<<2)>>2]=-1,(0|(Fc=Fc+1|0))<(0|(Ec=q[Hc+4>>2])););if(!((0|Ec)<1))for(Jc=q[Hc+12>>2],Nc=q[a+496>>2],Fc=0;Mc=q[12+(Jc+(Fc<<4)|0)>>2]-q[Hc+20>>2]<<2,Ec=-1==(0|(Ec=q[(Gc=Mc+Nc|0)>>2]))?Mc+q[a+488>>2]|0:Ic+(Ec<<2)|0,q[Ec>>2]=Fc,(0|(Fc=(q[Gc>>2]=Fc)+1|0))<q[Hc+4>>2];);}if(1<=(0|(Ec=q[Kc+24>>2])))for(Ic=q[Hc+8>>2],Nc=q[a+488>>2],Jc=0;;){if(-1!=(0|(Fc=q[Nc+(Jc<<2)>>2]))){for(Mc=q[a+492>>2],Gc=q[Hc+12>>2];Ic=(Ec=1==q[(Ec=Gc+(Fc<<4)|0)>>2]?(Ec=w(q[Ec+8>>2],28)+Pc|0,q[Ec+8>>2]=Ic,q[Ec>>2]):(q[Qc+(q[Ec+4>>2]<<2)>>2]=Ic,1))+Ic|0,(0|Fc)<(0|(Ec=q[Mc+(Fc<<2)>>2]))&&-1!=(0|(Fc=Ec)););Ec=q[Kc+24>>2]}if(!((0|(Jc=Jc+1|0))<(0|Ec)))break}if((0|Oc)==(0|(Lc=Lc+1|0)))break}}}(a),function(a){var yg=0,zg=0,Ag=0,Bg=0,Dg=0,Eg=x(0),Fg=0,Gg=0,Cg=q[a+332>>2];if(q[a+644>>2]){if(!(((q[a+428>>2]=0)|Cg)<1))for(;yg=126,Fg=q[a+432>>2]+Ag|0,!q[(zg=Ag<<2)+q[a+424>>2]>>2]|u[zg+q[a+448>>2]>>2]==x(0)||(yg=127),o[0|Fg]=yg,(0|Cg)!=(0|(Ag=Ag+1|0)););}else if(q[a+428>>2]){if(yg=r[q[a>>2]+4|0],!(((q[a+428>>2]=0)|Cg)<1))if(4<=yg>>>0)for(;Eg=u[(yg=Ag<<2)+q[a+448>>2]>>2],Bg=q[yg+q[a+424>>2]>>2],zg=Eg!=x(0)&0!=(0|Bg),Fg=q[a+432>>2]+Ag|0,zg=(0|zg)==(1&o[0|Fg])?zg:2|zg,zg=Eg!=u[yg+q[a+468>>2]>>2]?4|zg:zg,zg=q[yg+q[a+440>>2]>>2]==q[yg+q[a+464>>2]>>2]?zg:8|zg,yg=q[yg+q[a+436>>2]>>2]==q[yg+q[a+460>>2]>>2]?zg:16|zg,yg=Bg?32|yg:yg,Bg=(zg=Gg<<2)+q[a+452>>2]|0,Dg=zg+q[a+472>>2]|0,(u[Bg>>2]!=u[Dg>>2]|u[Bg+4>>2]!=u[Dg+4>>2]|(u[Bg+8>>2]!=u[Dg+8>>2]|u[Bg+12>>2]!=u[Dg+12>>2])||(Bg=zg+q[a+456>>2]|0,zg=zg+q[a+476>>2]|0,u[Bg>>2]!=u[zg>>2]|u[Bg+4>>2]!=u[zg+4>>2]|u[Bg+8>>2]!=u[zg+8>>2])||u[Bg+12>>2]!=u[zg+12>>2])&&(yg|=64),o[0|Fg]=yg,Gg=Gg+4|0,(0|Cg)!=(0|(Ag=Ag+1|0)););else for(;Eg=u[(yg=Ag<<2)+q[a+448>>2]>>2],Bg=q[yg+q[a+424>>2]>>2],zg=Eg!=x(0)&0!=(0|Bg),Dg=q[a+432>>2]+Ag|0,zg=(0|zg)==(1&o[0|Dg])?zg:2|zg,zg=Eg!=u[yg+q[a+468>>2]>>2]?4|zg:zg,zg=q[yg+q[a+440>>2]>>2]==q[yg+q[a+464>>2]>>2]?zg:8|zg,yg=q[yg+q[a+436>>2]>>2]==q[yg+q[a+460>>2]>>2]?zg:16|zg,o[0|Dg]=Bg?32|yg:yg,(0|Cg)!=(0|(Ag=Ag+1|0)););}else if(!((0|Cg)<1))for(;!q[(yg=Ag<<2)+q[a+424>>2]>>2]|u[yg+q[a+448>>2]>>2]==x(0)?(yg=q[a+432>>2]+Ag|0,o[0|yg]=254&r[0|yg]):(yg=q[a+432>>2]+Ag|0,o[0|yg]=1|r[0|yg]),(0|Cg)!=(0|(Ag=Ag+1|0)););}(a),q[a+644>>2]=0}function va(a,Wa,Xa,Ya,Za,$a){var fb,gb,hb,jb,kb,cb,db,ab=0,bb=0,eb=0,ib=0;if(L=cb=L-32|0,1<=(0|Wa))for(kb=w(Wa,12)+Xa|0;;){if(!((0|(ab=q[Xa+4>>2]))<1))if(fb=(Wa=q[Xa+8>>2])+w(ab,48)|0,ab=q[Xa>>2]<<2,1<=(0|(db=q[ab+$a>>2])))for(db<<=1,gb=q[q[a>>2]+1052>>2],hb=q[Za+ab>>2];;){b:if(ab=q[Wa+8>>2]){c:{if((bb=ab+-1|0)>>>0<=1){if(ab=(q[Wa+4>>2]<<2)+Ya|0,ib=(q[ab+(q[Wa+12>>2]<<2)>>2]<<2)+gb|0,bb-1)break c;for(eb=(q[ab+(q[Wa+16>>2]<<2)>>2]<<2)+gb|0,ab=0;u[(jb=(bb=ab<<2)+hb|0)>>2]=u[jb>>2]+x(u[Wa+44>>2]*x(x(u[bb+ib>>2]*u[Wa+20>>2])+x(u[bb+eb>>2]*u[Wa+24>>2]))),(0|db)!=(0|(ab=ab+1|0)););break b}q[cb>>2]=ab,Y(4,1024,cb);break b}for(ab=0;u[(eb=(bb=ab<<2)+hb|0)>>2]=u[eb>>2]+x(u[Wa+44>>2]*x(u[bb+ib>>2]*u[Wa+20>>2])),(0|db)!=(0|(ab=ab+1|0)););}if(!((Wa=Wa+48|0)>>>0<fb>>>0))break}else for(;3<=(ab=q[Wa+8>>2])>>>0&&(q[16+cb>>2]=ab,Y(4,1024,16+cb|0)),(Wa=Wa+48|0)>>>0<fb>>>0;);if(!((Xa=Xa+12|0)>>>0<kb>>>0))break}L=32+cb|0}function wa(a,Wa,Xa){var Ya;Wa|=0,Xa|=0,L=Ya=L+-64|0;a:{if(a|=0)if(Wa)if((Wa+15&-16)!=(0|Wa))q[52+Ya>>2]=1522,q[48+Ya>>2]=2361,Y(4,1294,48+Ya|0);else{if(Wa=function(a,Gl,Hl){var lm,Zl=0,fm=0,gm=0,mm=0,nm=0,om=0,pm=0,qm=0,rm=0,sm=0,tm=0,um=0,vm=0,wm=x(0),xm=0,ym=0,zm=0,Am=0,Bm=0;if(ca(16+(L=lm=L-576|0)|0,0,560),Fa(a,16+lm|0,12+lm|0),(mm=q[12+lm>>2])>>>0<=Hl>>>0){if(Zl=(fm=ca(Gl,0,mm))+q[16+lm>>2]|0,q[Zl+8>>2]=fm+q[20+lm>>2],q[Zl+40>>2]=fm+q[24+lm>>2],q[Zl+44>>2]=fm+q[28+lm>>2],q[Zl+48>>2]=fm+q[32+lm>>2],q[Zl+52>>2]=fm+q[36+lm>>2],q[Zl+16>>2]=fm+q[40+lm>>2],q[Zl+24>>2]=fm+q[44+lm>>2],q[Zl+28>>2]=fm+q[48+lm>>2],q[Zl+32>>2]=fm+q[52+lm>>2],q[Zl+36>>2]=fm+q[56+lm>>2],Gl=q[a+704>>2],q[Zl+308>>2]=fm+q[60+lm>>2],q[Zl+312>>2]=fm+q[64+lm>>2],q[Zl+316>>2]=fm+q[68+lm>>2],q[Zl+320>>2]=fm+q[72+lm>>2],q[Zl+324>>2]=fm+q[76+lm>>2],q[Zl+328>>2]=fm+q[80+lm>>2],q[Zl+60>>2]=fm+q[84+lm>>2],q[Zl+144>>2]=fm+q[88+lm>>2],q[Zl+148>>2]=fm+q[92+lm>>2],Hl=fm+q[96+lm>>2]|0,q[Zl+152>>2]=Hl,!((0|(mm=q[Gl+8>>2]))<1)&&(Gl=fm+q[100+lm>>2]|0,q[Hl>>2]=Gl,1!=(0|mm)))for(Hl=1;Gl=(15+(q[q[a+796>>2]+(gm<<2)>>2]<<3)&-16)+Gl|0,q[q[Zl+152>>2]+(Hl<<2)>>2]=Gl,(0|mm)!=(0|(Hl=(gm=Hl)+1|0)););if(q[Zl+156>>2]=fm+q[104+lm>>2],q[Zl+160>>2]=fm+q[108+lm>>2],q[Zl+68>>2]=fm+q[112+lm>>2],q[Zl+76>>2]=fm+q[116+lm>>2],q[Zl+80>>2]=fm+q[120+lm>>2],q[Zl+84>>2]=fm+q[124+lm>>2],q[Zl+88>>2]=fm+q[128+lm>>2],q[Zl+92>>2]=fm+q[132+lm>>2],q[Zl+96>>2]=fm+q[136+lm>>2],q[Zl+100>>2]=fm+q[140+lm>>2],q[Zl+104>>2]=fm+q[144+lm>>2],q[Zl+108>>2]=fm+q[148+lm>>2],q[Zl+112>>2]=fm+q[152+lm>>2],q[Zl+116>>2]=fm+q[156+lm>>2],q[Zl+120>>2]=fm+q[160+lm>>2],q[Zl+124>>2]=fm+q[164+lm>>2],q[Zl+128>>2]=fm+q[168+lm>>2],q[Zl+132>>2]=fm+q[172+lm>>2],q[Zl+136>>2]=fm+q[176+lm>>2],q[Zl+140>>2]=fm+q[180+lm>>2],q[Zl+168>>2]=fm+q[184+lm>>2],q[Zl+264>>2]=fm+q[188+lm>>2],q[Zl+268>>2]=fm+q[192+lm>>2],q[Zl+272>>2]=fm+q[196+lm>>2],q[Zl+276>>2]=fm+q[200+lm>>2],q[Zl+280>>2]=fm+q[204+lm>>2],q[Zl+284>>2]=fm+q[208+lm>>2],q[Zl+288>>2]=fm+q[212+lm>>2],q[Zl+292>>2]=fm+q[216+lm>>2],q[Zl+296>>2]=fm+q[220+lm>>2],q[Zl+300>>2]=fm+q[224+lm>>2],q[Zl+176>>2]=fm+q[228+lm>>2],q[Zl+184>>2]=fm+q[232+lm>>2],q[Zl+188>>2]=fm+q[236+lm>>2],q[Zl+192>>2]=fm+q[240+lm>>2],q[Zl+196>>2]=fm+q[244+lm>>2],q[Zl+200>>2]=fm+q[248+lm>>2],q[Zl+204>>2]=fm+q[252+lm>>2],q[Zl+208>>2]=fm+q[256+lm>>2],q[Zl+212>>2]=fm+q[260+lm>>2],q[Zl+216>>2]=fm+q[264+lm>>2],q[Zl+220>>2]=fm+q[268+lm>>2],q[Zl+224>>2]=fm+q[272+lm>>2],q[Zl+228>>2]=fm+q[276+lm>>2],q[Zl+232>>2]=fm+q[280+lm>>2],q[Zl+236>>2]=fm+q[284+lm>>2],q[Zl+240>>2]=fm+q[288+lm>>2],q[Zl+244>>2]=fm+q[292+lm>>2],q[Zl+248>>2]=fm+q[296+lm>>2],q[Zl+252>>2]=fm+q[300+lm>>2],q[Zl+256>>2]=fm+q[304+lm>>2],q[Zl+260>>2]=fm+q[308+lm>>2],Gl=q[a+704>>2],q[Zl+336>>2]=fm+q[312+lm>>2],q[Zl+424>>2]=fm+q[316+lm>>2],q[Zl+432>>2]=fm+q[320+lm>>2],q[Zl+436>>2]=fm+q[324+lm>>2],q[Zl+440>>2]=fm+q[328+lm>>2],Hl=fm+q[332+lm>>2]|0,q[Zl+444>>2]=Hl,!((0|(mm=q[Gl+16>>2]))<1)&&(gm=fm+q[336+lm>>2]|0,q[Hl>>2]=gm,(Hl=1)!=(0|mm)))for(Gl=0;gm=(15+(q[q[a+892>>2]+(Gl<<2)>>2]<<3)&-16)+gm|0,q[q[Zl+444>>2]+(Hl<<2)>>2]=gm,(0|mm)!=(0|(Hl=(Gl=Hl)+1|0)););if(q[Zl+448>>2]=fm+q[340+lm>>2],q[Zl+452>>2]=fm+q[344+lm>>2],q[Zl+456>>2]=fm+q[348+lm>>2],q[Zl+460>>2]=fm+q[352+lm>>2],q[Zl+464>>2]=fm+q[356+lm>>2],q[Zl+468>>2]=fm+q[360+lm>>2],q[Zl+472>>2]=fm+q[364+lm>>2],q[Zl+476>>2]=fm+q[368+lm>>2],q[Zl+344>>2]=fm+q[372+lm>>2],q[Zl+352>>2]=fm+q[376+lm>>2],q[Zl+356>>2]=fm+q[380+lm>>2],q[Zl+360>>2]=fm+q[384+lm>>2],q[Zl+364>>2]=fm+q[388+lm>>2],q[Zl+368>>2]=fm+q[392+lm>>2],q[Zl+372>>2]=fm+q[396+lm>>2],q[Zl+376>>2]=fm+q[400+lm>>2],q[Zl+380>>2]=fm+q[404+lm>>2],q[Zl+384>>2]=fm+q[408+lm>>2],q[Zl+388>>2]=fm+q[412+lm>>2],q[Zl+392>>2]=fm+q[416+lm>>2],q[Zl+396>>2]=fm+q[420+lm>>2],q[Zl+400>>2]=fm+q[424+lm>>2],q[Zl+404>>2]=fm+q[428+lm>>2],q[Zl+408>>2]=fm+q[432+lm>>2],q[Zl+412>>2]=fm+q[436+lm>>2],q[Zl+416>>2]=fm+q[440+lm>>2],q[Zl+420>>2]=fm+q[444+lm>>2],Gl=q[448+lm>>2],Hl=q[452+lm>>2],q[Zl+552>>2]=fm+q[456+lm>>2],q[Zl+548>>2]=Hl+fm,q[Zl+544>>2]=Gl+fm,q[Zl+560>>2]=fm+q[460+lm>>2],Gl=q[a+704>>2],pm=fm+q[464+lm>>2]|0,q[Zl+568>>2]=pm,1<=(0|(om=q[Gl+48>>2])))for(gm=fm+q[468+lm>>2]|0,Gl=fm+q[472+lm>>2]|0,nm=fm+q[476+lm>>2]|0,qm=q[a+1072>>2],Hl=0;mm=pm+w(Hl,36)|0,q[mm+20>>2]=nm,q[mm+16>>2]=Gl,q[mm>>2]=gm,gm=((mm=q[qm+(Hl<<2)>>2])<<2)+gm|0,nm=(mm=1<<mm<<2)+nm|0,Gl=Gl+mm|0,(0|om)!=(0|(Hl=Hl+1|0)););if(Gl=q[a+704>>2],mm=fm+q[516+lm>>2]|0,q[Zl+484>>2]=mm,1<=(0|(Gl=q[Gl+72>>2])))for(gm=fm+q[520+lm>>2]|0,nm=q[a+1212>>2],Hl=0;q[12+(mm+w(Hl,28)|0)>>2]=gm,gm=(q[nm+(Hl<<2)>>2]<<4)+gm|0,(0|Gl)!=(0|(Hl=Hl+1|0)););q[Zl+488>>2]=fm+q[524+lm>>2],q[Zl+492>>2]=fm+q[528+lm>>2],q[Zl+496>>2]=fm+q[532+lm>>2],q[Zl+504>>2]=fm+q[536+lm>>2],q[Zl+536>>2]=fm+q[540+lm>>2],q[Zl+512>>2]=fm+q[544+lm>>2],q[Zl+520>>2]=fm+q[548+lm>>2],q[Zl+524>>2]=fm+q[552+lm>>2],q[Zl+528>>2]=fm+q[556+lm>>2],q[Zl+532>>2]=fm+q[560+lm>>2];c:{if(4<=(om=r[a+4|0])>>>0){if(q[Zl+576>>2]=fm+q[480+lm>>2],q[Zl+584>>2]=fm+q[484+lm>>2],Gl=q[a+704>>2],Hl=q[492+lm>>2],mm=fm+q[488+lm>>2]|0,q[Zl+592>>2]=mm,1<=(0|(Gl=q[Gl+104>>2])))for(gm=Hl+fm|0,nm=q[a+1104>>2],Hl=0;q[40+(mm+w(Hl,48)|0)>>2]=gm,gm=(q[nm+(Hl<<2)>>2]<<2)+gm|0,(0|Gl)!=(0|(Hl=Hl+1|0)););q[Zl+608>>2]=fm+q[500+lm>>2],q[Zl+624>>2]=fm+q[508+lm>>2]}else{if(Gl=q[572+lm>>2],Hl=q[568+lm>>2],q[Zl+636>>2]=fm+q[564+lm>>2],q[Zl+640>>2]=Hl+fm,q[q[a+704>>2]+20>>2]<1)break c;for(mm=Gl+fm|0,pm=0;;){e:{if((0|(gm=q[(Gl=pm<<2)+q[a+952>>2]>>2]))<=0)Gl=Gl+q[Zl+636>>2]|0;else{for(nm=gm+(Hl=q[Gl+q[a+948>>2]>>2])|0,qm=q[a+1060>>2],gm=0;gm=q[qm+(Hl<<2)>>2]+gm|0,(0|(Hl=Hl+1|0))<(0|nm););if(Gl=Gl+q[Zl+636>>2]|0,Hl=mm,gm)break e}Hl=gm=0}if(q[Gl>>2]=Hl,mm=(gm<<2)+mm|0,!((0|(pm=pm+1|0))<q[q[a+704>>2]+20>>2]))break}}om>>>0<5||(q[Zl+600>>2]=fm+q[496+lm>>2],q[Zl+616>>2]=fm+q[504+lm>>2],q[Zl+632>>2]=fm+q[512+lm>>2])}q[Zl+644>>2]=1,q[Zl>>2]=a,q[Zl+648>>2]=1&o[q[a+708>>2]+20|0],fm=q[a+704>>2],pm=q[fm+20>>2];g:if(!((0|(q[Zl+540>>2]=pm))<1)){if(Gl=pm+-1|0,qm=q[a+952>>2],rm=q[a+940>>2],sm=q[a+932>>2],tm=q[a+936>>2],um=q[a+924>>2],vm=q[a+928>>2],xm=q[Zl+552>>2],zm=q[Zl+544>>2],om>>>0<4)for(;;)if(Hl=zm+w(Gl,52)|0,gm=(mm=Gl<<2)+vm|(q[Hl>>2]=0),q[Hl+4>>2]=q[gm>>2],q[Hl+8>>2]=q[(nm=mm+um|0)>>2],u[Hl+12>>2]=u[nm>>2]-u[gm>>2],q[Hl+16>>2]=q[mm+tm>>2],q[Hl+44>>2]=q[(gm=mm+sm|0)>>2],wm=Aa(x(q[mm+rm>>2])),u[Hl+20>>2]=wm,u[Hl+24>>2]=wm*x(1.5),ym=q[mm+qm>>2],nm=0,nm=(q[Hl+32>>2]=ym)?q[Zl+560>>2]+w(q[mm+q[a+948>>2]>>2],28)|0:nm,q[Hl+48>>2]=1,q[Hl+28>>2]=nm,q[mm+xm>>2]=q[gm>>2],Hl=0<(0|Gl),Gl=Gl+-1|0,!Hl)break g;for(ym=q[a+960>>2],Bm=q[a+944>>2];Hl=zm+w(Gl,52)|0,q[Hl>>2]=q[(gm=Gl<<2)+Bm>>2],q[Hl+4>>2]=q[(mm=gm+vm|0)>>2],q[Hl+8>>2]=q[(nm=gm+um|0)>>2],u[Hl+12>>2]=u[nm>>2]-u[mm>>2],q[Hl+16>>2]=q[gm+tm>>2],q[Hl+44>>2]=q[(Am=gm+sm|0)>>2],wm=Aa(x(q[gm+rm>>2])),u[Hl+20>>2]=wm,u[Hl+24>>2]=wm*x(1.5),nm=q[gm+qm>>2],q[Hl+32>>2]=nm,q[Hl+28>>2]=nm?q[Zl+560>>2]+w(q[gm+q[a+948>>2]>>2],28)|0:0,mm=q[gm+ym>>2],mm=(q[Hl+40>>2]=mm)?q[Zl+584>>2]+w(q[gm+q[a+956>>2]>>2],28)|0:0,q[Hl+48>>2]=1,q[Hl+36>>2]=mm,q[gm+xm>>2]=q[Am>>2],Hl=0<(0|Gl),Gl=Gl+-1|0,Hl;);}if(4<=om>>>0?(q[Zl+548>>2]=q[a+944>>2],mm=a):(ca(q[Zl+548>>2],0,pm<<2),mm=q[Zl>>2],fm=q[mm+704>>2]),gm=q[fm+52>>2],1<=(0|(q[Zl+556>>2]=gm)))for(Hl=q[mm+1056>>2],nm=q[mm+1192>>2],pm=q[mm+1060>>2],om=q[Zl+560>>2];Gl=om+w(gm=gm+-1|0,28)|0,q[Gl>>2]=q[(qm=gm<<2)+pm>>2],qm=q[Hl+qm>>2],q[Gl+24>>2]=1,q[Gl+16>>2]=0,q[Gl+20>>2]=1,q[Gl+8>>2]=0,q[Gl+12>>2]=0,q[Gl+4>>2]=nm+(qm<<2),0<(0|gm););if(gm=q[fm+48>>2],1<=(0|(q[Zl+564>>2]=gm))){for(;;){if(Gl=q[Zl+568>>2]+w(gm=gm+-1|0,36)|0,nm=q[(fm=gm<<2)+q[mm+1072>>2]>>2],1<=(0|(q[Gl+4>>2]=nm)))for(Hl=0;q[q[Gl>>2]+(Hl<<2)>>2]=q[Zl+560>>2]+w(q[q[mm+1064>>2]+(q[fm+q[mm+1068>>2]>>2]+Hl<<2)>>2],28),(0|nm)!=(0|(Hl=Hl+1|0)););if(q[Gl+24>>2]=1,q[Gl+28>>2]=1,q[Gl+8>>2]=1<<nm,!(0<(0|gm)))break}mm=q[Zl>>2],fm=q[mm+704>>2]}if(Gl=q[fm>>2],(0|(q[Zl+4>>2]=Gl))<1)Hl=0;else{for(qm=q[mm+732>>2],rm=q[mm+736>>2],sm=q[mm+740>>2],nm=q[mm+720>>2],tm=q[Zl+52>>2],pm=q[Zl+568>>2],um=q[Zl+8>>2],gm=Gl;om=um+w(gm=gm+-1|0,12)|0,q[om>>2]=pm+w(q[(Hl=gm<<2)+nm>>2],36),q[om+4>>2]=q[Hl+sm>>2],q[om+8>>2]=q[Hl+rm>>2],u[Hl+tm>>2]=q[Hl+qm>>2]?x(1):x(0),0<(0|gm););for(om=q[Zl+16>>2],Hl=0;gm=q[8+(pm+w(q[(qm=(Gl=Gl+-1|0)<<2)+nm>>2],36)|0)>>2],Hl=Hl+(q[om+qm>>2]=gm)|0,0<(0|Gl););Gl=q[Zl+4>>2]}if(q[Zl+12>>2]=Gl,q[Zl+20>>2]=Hl,Gl=q[fm+4>>2],1<=(0|(q[Zl+304>>2]=Gl))){for(;Hl=q[Zl+308>>2]+((Gl=Gl+-1|0)<<5)|0,q[Hl>>2]=q[Zl+568>>2]+w(q[(gm=Gl<<2)+q[mm+752>>2]>>2],36),q[Hl+4>>2]=q[gm+q[mm+764>>2]>>2],q[Hl+8>>2]=q[gm+q[mm+768>>2]>>2],nm=q[gm+q[mm+772>>2]>>2],q[Hl+12>>2]=nm,fm=q[gm+q[mm+776>>2]>>2],q[Hl+16>>2]=fm,q[Hl+28>>2]=q[gm+q[mm+760>>2]>>2],nm>>>0<=1?nm-1?(q[20+(q[Zl+60>>2]+w(fm,24)|0)>>2]=Gl,q[Hl+24>>2]=1,q[Hl+20>>2]=2):(q[8+(q[Zl+168>>2]+w(fm,12)|0)>>2]=Gl,q[Hl+24>>2]=3,q[Hl+20>>2]=4):Y(4,1179,0),0<(0|Gl););mm=q[Zl>>2],fm=q[mm+704>>2]}gm=q[fm+8>>2];k:if(!((0|(q[Zl+56>>2]=gm))<1)){if(Hl=gm+-1|0,pm=q[mm+796>>2],om=q[mm+804>>2],qm=q[mm+800>>2],rm=q[mm+780>>2],sm=q[Zl+568>>2],tm=q[Zl+60>>2],r[mm+4|0]<2)for(;;)if(Gl=tm+w(Hl,24)|0,q[Gl>>2]=sm+w(q[(nm=Hl<<2)+rm>>2],36),q[Gl+4>>2]=q[nm+qm>>2],q[Gl+8>>2]=q[nm+om>>2],nm=q[nm+pm>>2],q[Gl+12>>2]=0,q[Gl+16>>2]=nm,Gl=0<(0|Hl),Hl=Hl+-1|0,!Gl)break k;for(um=q[mm+808>>2];Gl=tm+w(Hl,24)|0,q[Gl>>2]=sm+w(q[(nm=Hl<<2)+rm>>2],36),q[Gl+4>>2]=q[nm+qm>>2],q[Gl+8>>2]=q[nm+om>>2],q[Gl+16>>2]=q[nm+pm>>2],q[Gl+12>>2]=q[nm+um>>2],Gl=0<(0|Hl),Hl=Hl+-1|0,Gl;);}if(Hl=q[fm+12>>2],1<=(0|(q[Zl+164>>2]=Hl)))for(nm=q[mm+828>>2],pm=q[mm+812>>2],om=q[Zl+568>>2],qm=q[Zl+168>>2],Gl=Hl;rm=qm+w(Gl=Gl+-1|0,12)|0,q[rm>>2]=om+w(q[(sm=Gl<<2)+pm>>2],36),q[rm+4>>2]=q[nm+sm>>2],0<(0|Gl););if(((Gl=0)|gm)<1)nm=0;else{for(pm=q[Zl+68>>2],om=q[Zl+60>>2],nm=0;Hl=q[q[om+w(gm=gm+-1|0,24)>>2]+8>>2],nm=(q[pm+(gm<<2)>>2]=Hl)+nm|0,0<(0|gm););Hl=q[Zl+164>>2],gm=q[Zl+56>>2]}if(q[Zl+64>>2]=gm,q[Zl+72>>2]=nm,gm=Zl,1<=(0|Hl)){for(pm=q[Zl+176>>2],om=q[Zl+168>>2];nm=q[q[om+w(Hl=Hl+-1|0,12)>>2]+8>>2],Gl=Gl+(q[pm+(Hl<<2)>>2]=nm)|0,0<(0|Hl););Hl=q[Zl+164>>2]}if(q[gm+172>>2]=Hl,q[Zl+180>>2]=Gl,nm=q[fm+16>>2],1<=(0|(q[Zl+332>>2]=nm))){for(qm=q[mm+872>>2],rm=q[mm+892>>2],sm=q[mm+880>>2],tm=q[mm+876>>2],pm=q[mm+852>>2],om=q[Zl+568>>2],um=q[Zl+336>>2],Gl=nm;Hl=um+w(Gl=Gl+-1|0,20)|0,q[Hl>>2]=om+w(q[(gm=Gl<<2)+pm>>2],36),q[Hl+4>>2]=q[gm+tm>>2],q[Hl+8>>2]=q[gm+sm>>2],q[Hl+16>>2]=q[gm+rm>>2],q[Hl+12>>2]=q[gm+qm>>2],0<(0|Gl););for(gm=q[Zl+344>>2],Hl=0;Gl=q[8+(om+w(q[(qm=(nm=nm+-1|0)<<2)+pm>>2],36)|0)>>2],Hl=(q[gm+qm>>2]=Gl)+Hl|0,0<(0|nm););if(q[Zl+348>>2]=Hl,nm=q[Zl+332>>2],!((0|(q[Zl+340>>2]=nm))<1))for(Hl=nm<<2,gm=q[Zl+456>>2],pm=q[Zl+452>>2];q[(om=(Gl=Hl+-4|0)<<2)+pm>>2]=1065353216,q[(qm=(Hl<<=2)-4|0)+pm>>2]=1065353216,q[(rm=(Hl=Hl+-12|0)+pm|0)>>2]=1065353216,q[rm+4>>2]=1065353216,q[gm+om>>2]=0,q[gm+qm>>2]=1065353216,q[(Hl=Hl+gm|0)>>2]=0,q[Hl+4>>2]=0,Hl=Gl,0<(0|(nm=nm+-1|0)););}else q[Zl+340>>2]=nm,q[Zl+348>>2]=0;if(nm=q[fm+72>>2],1<=(0|(q[Zl+480>>2]=nm)))for(qm=q[mm+1208>>2],rm=q[mm+1224>>2],sm=q[mm+1220>>2],tm=q[mm+1216>>2],um=q[mm+1212>>2],vm=q[Zl+484>>2],gm=0;;){if(Gl=vm+w(gm,28)|0,pm=q[(Hl=gm<<2)+um>>2],q[Gl+4>>2]=pm,q[Gl>>2]=q[Hl+tm>>2],om=q[Hl+sm>>2],q[Gl+16>>2]=om,xm=q[Hl+rm>>2],q[Gl+20>>2]=xm,q[Gl+8>>2]=0,q[Gl+24>>2]=1+(om-xm|0),1<=(0|pm))for(xm=q[Hl+qm>>2],zm=q[Gl+12>>2],ym=q[mm+1236>>2],Bm=q[mm+1228>>2],Am=q[mm+1232>>2],Hl=0;q[4+(Gl=zm+(Hl<<4)|0)>>2]=q[(om=Hl+xm<<2)+Am>>2],q[Gl>>2]=q[om+Bm>>2],om=q[om+ym>>2],q[Gl+12>>2]=0,q[Gl+8>>2]=om,(0|pm)!=(0|(Hl=Hl+1|0)););if((0|nm)==(0|(gm=gm+1|0)))break}if(Hl=q[fm+80>>2],(0|(q[Zl+500>>2]=Hl))<1)gm=0;else{for(om=q[mm+1280>>2],qm=q[mm+1268>>2],rm=q[mm+1276>>2],sm=q[mm+1272>>2],tm=q[mm+1264>>2],um=q[mm+1260>>2],nm=q[mm+1248>>2],pm=q[Zl+568>>2],vm=q[Zl+504>>2];Gl=vm+w(Hl=Hl+-1|0,24)|0,q[Gl>>2]=pm+w(q[(gm=Hl<<2)+nm>>2],36),q[Gl+4>>2]=q[gm+um>>2],q[Gl+8>>2]=q[gm+tm>>2],q[Gl+12>>2]=q[gm+sm>>2],gm=q[gm+qm>>2],q[Gl+20>>2]=om+(gm<<1),q[Gl+16>>2]=rm+(gm<<2),0<(0|Hl););if((0|(Hl=q[Zl+500>>2]))<1)gm=0;else{for(om=q[Zl+512>>2],gm=0;Gl=q[8+(pm+w(q[(qm=(Hl=Hl+-1|0)<<2)+nm>>2],36)|0)>>2],gm=(q[om+qm>>2]=Gl)+gm|0,0<(0|Hl););Hl=q[Zl+500>>2]}}q[Zl+508>>2]=Hl,q[Zl+516>>2]=gm;o:if(4<=r[a+4|0]){if(!((nm=r[mm+4|0])>>>0<4)){if(Hl=q[fm+120>>2],1<=(0|(q[Zl+572>>2]=Hl))){for(om=q[mm+1172>>2],qm=q[Zl+576>>2];nm=(0|(fm=q[(Gl=(Hl=Hl+-1|0)<<2)+om>>2]))<0?fm=pm=gm=0:(gm=(nm=q[Gl+q[mm+1176>>2]>>2]<<2)+q[mm+1188>>2]|0,pm=q[Gl+q[mm+1180>>2]>>2],fm=q[Zl+544>>2]+w(fm,52)|0,nm+q[mm+1184>>2]|0),Gl=qm+w(Hl,20)|0,q[Gl+12>>2]=pm,q[Gl+8>>2]=gm,q[Gl+4>>2]=nm,q[Gl>>2]=fm,0<(0|Hl););if(mm=q[Zl>>2],(nm=r[mm+4|0])>>>0<4)break o}if(fm=q[mm+704>>2],gm=q[fm+100>>2],1<=(0|(q[Zl+580>>2]=gm)))for(pm=q[mm+1084>>2],om=q[mm+1076>>2],qm=q[mm+1192>>2],rm=q[mm+1080>>2],sm=q[Zl+584>>2];Gl=sm+w(gm=gm+-1|0,28)|0,q[Gl>>2]=q[(Hl=gm<<2)+rm>>2],q[Gl+4>>2]=qm+(q[Hl+om>>2]<<2),Hl=q[Hl+pm>>2],q[Gl+20>>2]=1,q[Gl+24>>2]=1,q[Gl+12>>2]=0,q[Gl+16>>2]=0,q[Gl+8>>2]=Hl,0<(0|gm););if(gm=q[fm+104>>2],1<=(0|(q[Zl+588>>2]=gm))){for(;;){if(Gl=q[Zl+592>>2]+w(gm=gm+-1|0,48)|0,q[Gl>>2]=q[Zl+584>>2]+w(q[(nm=gm<<2)+q[mm+1088>>2]>>2],28),Hl=q[nm+q[mm+1092>>2]>>2],q[Gl+28>>2]=1,q[Gl+32>>2]=1,q[Gl+8>>2]=0,q[Gl+4>>2]=Hl,fm=q[nm+q[mm+1104>>2]>>2],1<=(0|(q[Gl+36>>2]=fm)))for(Hl=0;q[q[Gl+40>>2]+(Hl<<2)>>2]=q[Zl+576>>2]+w(q[q[mm+1168>>2]+(q[nm+q[mm+1100>>2]>>2]+Hl<<2)>>2],20),(0|fm)!=(0|(Hl=Hl+1|0)););if(!(1<=(0|gm)))break}mm=q[Zl>>2],nm=r[mm+4|0]}if(!(nm>>>0<4)){if(nm=q[a+704>>2],Hl=q[nm+108>>2],1<=(0|(q[Zl+604>>2]=Hl)))for(fm=q[a+1124>>2],pm=q[a+1128>>2],om=q[a+1120>>2],qm=q[Zl+592>>2],rm=q[Zl+608>>2];Gl=rm+w(Hl=Hl+-1|0,12)|0,q[Gl>>2]=q[(gm=Hl<<2)+om>>2],q[Gl+4>>2]=q[gm+pm>>2],q[Gl+8>>2]=qm+w(q[fm+gm>>2],48),0<(0|Hl););if(Hl=q[nm+112>>2],1<=(0|(q[Zl+620>>2]=Hl)))for(nm=q[a+1148>>2],fm=q[a+1152>>2],pm=q[a+1144>>2],om=q[Zl+592>>2],qm=q[Zl+624>>2];Gl=qm+w(Hl=Hl+-1|0,12)|0,q[Gl>>2]=q[(gm=Hl<<2)+pm>>2],q[Gl+4>>2]=q[fm+gm>>2],q[Gl+8>>2]=om+w(q[gm+nm>>2],48),0<(0|Hl););if(gm=q[mm+1192>>2],Gl=q[q[mm+704>>2]+20>>2],q[Zl+640>>2]=q[mm+972>>2],nm=q[mm+964>>2],q[Zl+636>>2]=nm,!((0|Gl)<(Hl=1))&&(q[nm>>2]=gm+(q[q[mm+968>>2]>>2]<<2),1!=(0|Gl)))for(;q[(nm=Hl<<2)+q[Zl+636>>2]>>2]=gm+(q[nm+q[mm+968>>2]>>2]<<2),(0|Gl)!=(0|(Hl=Hl+1|0)););}}}else if(!(q[fm+20>>2]<1))for(fm=0;;){if(gm=q[(pm=fm<<2)+q[Zl+636>>2]>>2],1<=((Gl=0)|(Hl=q[pm+q[mm+952>>2]>>2])))for(rm=Hl+(om=q[pm+q[mm+948>>2]>>2])|0,sm=q[mm+1060>>2],tm=q[mm+1056>>2];;){if(1<=(0|(qm=q[(Hl=om<<2)+sm>>2])))for(um=qm+(nm=q[Hl+tm>>2])|0,vm=q[mm+1192>>2];;){qm=gm+(Gl<<2)|0,wm=u[vm+(nm<<2)>>2],Hl=gm;q:{if(0<(0|Gl))for(;;){if(u[Hl>>2]==wm)break q;if(!((Hl=Hl+4|0)>>>0<qm>>>0))break}u[qm>>2]=wm,Gl=Gl+1|0}if(!((0|(nm=nm+1|0))<(0|um)))break}if(!((0|(om=om+1|0))<(0|rm)))break}if(function(a,rn){var sn,In,vn=0,wn=0,Hn=0;q[8+(L=sn=L-208|0)>>2]=1,q[12+sn>>2]=0;a:if(In=rn<<2){for(q[16+sn>>2]=4,Hn=rn=q[20+sn>>2]=4,vn=2;rn=(Hn+4|0)+(wn=rn)|0,q[(16+sn|0)+(vn<<2)>>2]=rn,vn=vn+1|0,Hn=wn,rn>>>0<In>>>0;);if((wn=(a+In|0)-4|0)>>>0<=a>>>0)rn=vn=1;else for(rn=vn=1;rn=3==(3&vn)?(ta(a,rn,16+sn|0),ma(8+sn|0,2),rn+2|0):(t[(16+sn|0)+((Hn=rn+-1|0)<<2)>>2]>=wn-a>>>0?la(a,8+sn|0,rn,0,16+sn|0):ta(a,rn,16+sn|0),1==(0|rn)?(ka(8+sn|0,1),0):(ka(8+sn|0,Hn),1)),vn=1|q[8+sn>>2],q[8+sn>>2]=vn,(a=a+4|0)>>>0<wn>>>0;);for(la(a,8+sn|0,rn,0,16+sn|0);;){e:{f:{g:{if(!(1!=(0|rn)|1!=(0|vn))){if(q[12+sn>>2])break g;break a}if(1<(0|rn))break f}ma(8+sn|0,wn=Oa(8+sn|0)),vn=q[8+sn>>2],rn=rn+wn|0;break e}ka(8+sn|0,2),q[8+sn>>2]=7^q[8+sn>>2],ma(8+sn|0,1),la((Hn=a+-4|0)-q[(16+sn|0)+((wn=rn+-2|0)<<2)>>2]|0,8+sn|0,rn+-1|0,1,16+sn|0),ka(8+sn|0,1),vn=1|q[8+sn>>2],q[8+sn>>2]=vn,la(Hn,8+sn|0,wn,1,16+sn|0),rn=wn}a=a+-4|0}}L=208+sn|0}(gm,Gl),q[pm+q[Zl+640>>2]>>2]=Gl,!((0|(fm=fm+1|0))<q[q[mm+704>>2]+20>>2]))break}if(!(r[a+4|0]<5|r[q[Zl>>2]+4|0]<4)){if(Gl=q[a+704>>2],Hl=q[Gl+128>>2],1<=(0|(q[Zl+596>>2]=Hl)))for(nm=q[a+1112>>2],fm=q[a+1116>>2],pm=q[a+1108>>2],om=q[Zl+592>>2],qm=q[Zl+600>>2];mm=qm+w(Hl=Hl+-1|0,12)|0,q[mm>>2]=q[(gm=Hl<<2)+pm>>2],q[mm+4>>2]=q[fm+gm>>2],q[mm+8>>2]=om+w(q[gm+nm>>2],48),0<(0|Hl););if(Hl=q[Gl+132>>2],1<=(0|(q[Zl+612>>2]=Hl)))for(nm=q[a+1136>>2],fm=q[a+1140>>2],pm=q[a+1132>>2],om=q[Zl+592>>2],qm=q[Zl+616>>2];mm=qm+w(Hl=Hl+-1|0,12)|0,q[mm>>2]=q[(gm=Hl<<2)+pm>>2],q[mm+4>>2]=q[fm+gm>>2],q[mm+8>>2]=om+w(q[gm+nm>>2],48),0<(0|Hl););if(Hl=q[Gl+136>>2],!((0|(q[Zl+628>>2]=Hl))<1))for(mm=q[a+1160>>2],gm=q[a+1164>>2],nm=q[a+1156>>2],fm=q[Zl+592>>2],pm=q[Zl+632>>2];a=pm+w(Hl=Hl+-1|0,12)|0,q[a>>2]=q[(Gl=Hl<<2)+nm>>2],q[a+4>>2]=q[Gl+gm>>2],q[a+8>>2]=fm+w(q[Gl+mm>>2],48),0<(0|Hl););}ua(Zl)}return L=576+lm|0,Zl}(a,Wa,Xa))break a;q[36+Ya>>2]=2209,q[32+Ya>>2]=2361,Y(4,1294,32+Ya|0)}else q[20+Ya>>2]=1444,q[16+Ya>>2]=2361,Y(4,1294,16+Ya|0);else q[4+Ya>>2]=2132,q[Ya>>2]=2361,Y(4,1294,Ya);Wa=0}return L=64+Ya|0,0|Wa}function xa(a){var Wa;return L=Wa=L-16|0,a=(a|=0)?function(a){var Gl;return ca(16+(L=Gl=L-576|0)|0,0,560),Fa(a,16+Gl|0,12+Gl|0),L=576+Gl|0,q[12+Gl>>2]}(a):(q[4+Wa>>2]=2132,q[Wa>>2]=2343,Y(4,1294,Wa),0),L=16+Wa|0,0|a}function ya(a){var Xa=r[a+4|0];X(q[a+704>>2],4,64),da(q[a+708>>2],4),da(q[a+708>>2]+4|0,4),da(q[a+708>>2]+8|0,4),da(q[a+708>>2]+12|0,4),da(q[a+708>>2]+16|0,4),da(q[a+708>>2]+20|0,1),X(q[a+720>>2],4,q[q[a+704>>2]>>2]),X(q[a+724>>2],4,q[q[a+704>>2]>>2]),X(q[a+728>>2],4,q[q[a+704>>2]>>2]),X(q[a+732>>2],4,q[q[a+704>>2]>>2]),X(q[a+736>>2],4,q[q[a+704>>2]>>2]),X(q[a+740>>2],4,q[q[a+704>>2]>>2]),X(q[a+752>>2],4,q[q[a+704>>2]+4>>2]),X(q[a+756>>2],4,q[q[a+704>>2]+4>>2]),X(q[a+760>>2],4,q[q[a+704>>2]+4>>2]),X(q[a+764>>2],4,q[q[a+704>>2]+4>>2]),X(q[a+768>>2],4,q[q[a+704>>2]+4>>2]),X(q[a+772>>2],4,q[q[a+704>>2]+4>>2]),X(q[a+776>>2],4,q[q[a+704>>2]+4>>2]),X(q[a+780>>2],4,q[q[a+704>>2]+8>>2]),X(q[a+784>>2],4,q[q[a+704>>2]+8>>2]),X(q[a+788>>2],4,q[q[a+704>>2]+8>>2]),X(q[a+796>>2],4,q[q[a+704>>2]+8>>2]),X(q[a+800>>2],4,q[q[a+704>>2]+8>>2]),X(q[a+804>>2],4,q[q[a+704>>2]+8>>2]),X(q[a+812>>2],4,q[q[a+704>>2]+12>>2]),X(q[a+816>>2],4,q[q[a+704>>2]+12>>2]),X(q[a+820>>2],4,q[q[a+704>>2]+12>>2]),X(q[a+828>>2],4,q[q[a+704>>2]+12>>2]),X(q[a+852>>2],4,q[q[a+704>>2]+16>>2]),X(q[a+856>>2],4,q[q[a+704>>2]+16>>2]),X(q[a+860>>2],4,q[q[a+704>>2]+16>>2]),X(q[a+868>>2],4,q[q[a+704>>2]+16>>2]),X(q[a+872>>2],4,q[q[a+704>>2]+16>>2]),X(q[a+876>>2],4,q[q[a+704>>2]+16>>2]),X(q[a+880>>2],4,q[q[a+704>>2]+16>>2]),X(q[a+884>>2],4,q[q[a+704>>2]+16>>2]),X(q[a+888>>2],1,q[q[a+704>>2]+16>>2]),X(q[a+892>>2],4,q[q[a+704>>2]+16>>2]),X(q[a+896>>2],4,q[q[a+704>>2]+16>>2]),X(q[a+900>>2],4,q[q[a+704>>2]+16>>2]),X(q[a+904>>2],4,q[q[a+704>>2]+16>>2]),X(q[a+908>>2],4,q[q[a+704>>2]+16>>2]),X(q[a+912>>2],4,q[q[a+704>>2]+16>>2]),X(q[a+924>>2],4,q[q[a+704>>2]+20>>2]),X(q[a+928>>2],4,q[q[a+704>>2]+20>>2]),X(q[a+932>>2],4,q[q[a+704>>2]+20>>2]),X(q[a+936>>2],4,q[q[a+704>>2]+20>>2]),X(q[a+940>>2],4,q[q[a+704>>2]+20>>2]),X(q[a+948>>2],4,q[q[a+704>>2]+20>>2]),X(q[a+952>>2],4,q[q[a+704>>2]+20>>2]),X(q[a+976>>2],4,q[q[a+704>>2]+24>>2]),X(q[a+980>>2],4,q[q[a+704>>2]+28>>2]),X(q[a+984>>2],4,q[q[a+704>>2]+28>>2]),X(q[a+996>>2],4,q[q[a+704>>2]+32>>2]),X(q[a+1e3>>2],4,q[q[a+704>>2]+32>>2]),X(q[a+1004>>2],4,q[q[a+704>>2]+32>>2]),X(q[a+1008>>2],4,q[q[a+704>>2]+32>>2]),X(q[a+1012>>2],4,q[q[a+704>>2]+32>>2]),X(q[a+1016>>2],4,q[q[a+704>>2]+32>>2]),X(q[a+1020>>2],4,q[q[a+704>>2]+32>>2]),X(q[a+1032>>2],4,q[q[a+704>>2]+36>>2]),X(q[a+1036>>2],4,q[q[a+704>>2]+36>>2]),X(q[a+1040>>2],4,q[q[a+704>>2]+36>>2]),X(q[a+1052>>2],4,q[q[a+704>>2]+40>>2]),X(q[a+1064>>2],4,q[q[a+704>>2]+44>>2]),X(q[a+1068>>2],4,q[q[a+704>>2]+48>>2]),X(q[a+1072>>2],4,q[q[a+704>>2]+48>>2]),X(q[a+1056>>2],4,q[q[a+704>>2]+52>>2]),X(q[a+1060>>2],4,q[q[a+704>>2]+52>>2]),X(q[a+1192>>2],4,q[q[a+704>>2]+56>>2]),X(q[a+1196>>2],4,q[q[a+704>>2]+60>>2]),X(q[a+1200>>2],2,q[q[a+704>>2]+64>>2]),X(q[a+1204>>2],4,q[q[a+704>>2]+68>>2]),X(q[a+1208>>2],4,q[q[a+704>>2]+72>>2]),X(q[a+1212>>2],4,q[q[a+704>>2]+72>>2]),X(q[a+1216>>2],4,q[q[a+704>>2]+72>>2]),X(q[a+1220>>2],4,q[q[a+704>>2]+72>>2]),X(q[a+1224>>2],4,q[q[a+704>>2]+72>>2]),X(q[a+1228>>2],4,q[q[a+704>>2]+76>>2]),X(q[a+1232>>2],4,q[q[a+704>>2]+76>>2]),X(q[a+1236>>2],4,q[q[a+704>>2]+76>>2]),X(q[a+1248>>2],4,q[q[a+704>>2]+80>>2]),X(q[a+1252>>2],4,q[q[a+704>>2]+80>>2]),X(q[a+1256>>2],4,q[q[a+704>>2]+80>>2]),X(q[a+1260>>2],4,q[q[a+704>>2]+80>>2]),X(q[a+1264>>2],4,q[q[a+704>>2]+80>>2]),X(q[a+1268>>2],4,q[q[a+704>>2]+80>>2]),X(q[a+1272>>2],4,q[q[a+704>>2]+80>>2]),X(q[a+1276>>2],4,q[q[a+704>>2]+84>>2]),X(q[a+1280>>2],2,q[q[a+704>>2]+84>>2]),X(q[a+1284>>2],4,q[q[a+704>>2]+88>>2]),Xa>>>0<2||(X(q[a+808>>2],4,q[q[a+704>>2]+8>>2]),Xa>>>0<4)||(X(q[a+968>>2],4,q[q[a+704>>2]+20>>2]),X(q[a+972>>2],4,q[q[a+704>>2]+20>>2]),X(q[a+792>>2],4,q[q[a+704>>2]+8>>2]),X(q[a+824>>2],4,q[q[a+704>>2]+12>>2]),X(q[a+864>>2],4,q[q[a+704>>2]+16>>2]),X(q[a+1288>>2],4,q[q[a+704>>2]+92>>2]),X(q[a+1292>>2],4,q[q[a+704>>2]+92>>2]),X(q[a+1296>>2],4,q[q[a+704>>2]+92>>2]),X(q[a+1300>>2],4,q[q[a+704>>2]+96>>2]),X(q[a+1304>>2],4,q[q[a+704>>2]+96>>2]),X(q[a+1308>>2],4,q[q[a+704>>2]+96>>2]),X(q[a+944>>2],4,q[q[a+704>>2]+20>>2]),X(q[a+956>>2],4,q[q[a+704>>2]+20>>2]),X(q[a+960>>2],4,q[q[a+704>>2]+20>>2]),X(q[a+1076>>2],4,q[q[a+704>>2]+100>>2]),X(q[a+1080>>2],4,q[q[a+704>>2]+100>>2]),X(q[a+1084>>2],4,q[q[a+704>>2]+100>>2]),X(q[a+1088>>2],4,q[q[a+704>>2]+104>>2]),X(q[a+1092>>2],4,q[q[a+704>>2]+104>>2]),X(q[a+1096>>2],4,q[q[a+704>>2]+104>>2]),X(q[a+1100>>2],4,q[q[a+704>>2]+104>>2]),X(q[a+1104>>2],4,q[q[a+704>>2]+104>>2]),X(q[a+1120>>2],4,q[q[a+704>>2]+108>>2]),X(q[a+1124>>2],4,q[q[a+704>>2]+108>>2]),X(q[a+1128>>2],4,q[q[a+704>>2]+108>>2]),X(q[a+1144>>2],4,q[q[a+704>>2]+112>>2]),X(q[a+1148>>2],4,q[q[a+704>>2]+112>>2]),X(q[a+1152>>2],4,q[q[a+704>>2]+112>>2]),X(q[a+1168>>2],4,q[q[a+704>>2]+116>>2]),X(q[a+1172>>2],4,q[q[a+704>>2]+120>>2]),X(q[a+1176>>2],4,q[q[a+704>>2]+120>>2]),X(q[a+1180>>2],4,q[q[a+704>>2]+120>>2]),X(q[a+1184>>2],4,q[q[a+704>>2]+124>>2]),X(q[a+1188>>2],4,q[q[a+704>>2]+124>>2]),4!=(0|Xa)&&(X(q[a+988>>2],4,q[q[a+704>>2]+28>>2]),X(q[a+992>>2],4,q[q[a+704>>2]+28>>2]),X(q[a+1024>>2],4,q[q[a+704>>2]+32>>2]),X(q[a+1028>>2],4,q[q[a+704>>2]+32>>2]),X(q[a+1044>>2],4,q[q[a+704>>2]+36>>2]),X(q[a+1048>>2],4,q[q[a+704>>2]+36>>2]),X(q[a+1108>>2],4,q[q[a+704>>2]+128>>2]),X(q[a+1112>>2],4,q[q[a+704>>2]+128>>2]),X(q[a+1116>>2],4,q[q[a+704>>2]+128>>2]),X(q[a+1132>>2],4,q[q[a+704>>2]+132>>2]),X(q[a+1136>>2],4,q[q[a+704>>2]+132>>2]),X(q[a+1140>>2],4,q[q[a+704>>2]+132>>2]),X(q[a+1156>>2],4,q[q[a+704>>2]+136>>2]),X(q[a+1160>>2],4,q[q[a+704>>2]+136>>2]),X(q[a+1164>>2],4,q[q[a+704>>2]+136>>2])))}function za(a,Za){var $a=0,lb=0,mb=0,ob=0,pb=0,rb=0,nb=a+Za|0;a:{b:if(!(1&($a=q[a+4>>2]))){if(!(3&$a))break a;if(Za=($a=q[a>>2])+Za|0,(0|(a=a-$a|0))!=q[2100])if($a>>>0<=255)mb=$a>>>3,$a=q[a+8>>2],(0|(lb=q[a+12>>2]))==(0|$a)?(rb=q[2095]&fd(mb),q[2095]=rb):(q[$a+12>>2]=lb,q[lb+8>>2]=$a);else{if(pb=q[a+24>>2],(0|($a=q[a+12>>2]))!=(0|a))lb=q[a+8>>2],q[lb+12>>2]=$a,q[$a+8>>2]=lb;else if(mb=(mb=q[(lb=a+20|0)>>2])||q[(lb=a+16|0)>>2]){for(;ob=lb,(mb=q[(lb=($a=mb)+20|0)>>2])||(lb=$a+16|0,mb=q[$a+16>>2]););q[ob>>2]=0}else $a=0;if(pb){lb=q[a+28>>2];e:{if(q[(mb=8684+(lb<<2)|0)>>2]==(0|a)){if(q[mb>>2]=$a)break e;rb=q[2096]&fd(lb),q[2096]=rb;break b}if(!(q[pb+(q[pb+16>>2]==(0|a)?16:20)>>2]=$a))break b}q[$a+24>>2]=pb,(lb=q[a+16>>2])&&(q[$a+16>>2]=lb,q[lb+24>>2]=$a),(lb=q[a+20>>2])&&(q[$a+20>>2]=lb,q[lb+24>>2]=$a)}}else if(3==(3&($a=q[4+nb>>2])))return q[2097]=Za,q[4+nb>>2]=-2&$a,q[a+4>>2]=1|Za,q[nb>>2]=Za}f:{if(!(2&($a=q[4+nb>>2]))){if(q[2101]==(0|nb)){if(q[2101]=a,Za=q[2098]+Za|0,q[2098]=Za,q[a+4>>2]=1|Za,q[2100]!=(0|a))break a;return q[2097]=0,q[2100]=0}if(q[2100]==(0|nb))return q[2100]=a,Za=q[2097]+Za|0,q[2097]=Za,q[a+4>>2]=1|Za,q[a+Za>>2]=Za;Za=(-8&$a)+Za|0;g:if($a>>>0<=255)mb=$a>>>3,$a=q[8+nb>>2],(0|(lb=q[12+nb>>2]))==(0|$a)?(rb=q[2095]&fd(mb),q[2095]=rb):(q[$a+12>>2]=lb,q[lb+8>>2]=$a);else{if(pb=q[24+nb>>2],(0|nb)!=(0|($a=q[12+nb>>2])))lb=q[8+nb>>2],q[lb+12>>2]=$a,q[$a+8>>2]=lb;else if(mb=(mb=q[(lb=20+nb|0)>>2])||q[(lb=16+nb|0)>>2]){for(;ob=lb,(mb=q[(lb=($a=mb)+20|0)>>2])||(lb=$a+16|0,mb=q[$a+16>>2]););q[ob>>2]=0}else $a=0;if(pb){lb=q[28+nb>>2];j:{if(q[(mb=8684+(lb<<2)|0)>>2]==(0|nb)){if(q[mb>>2]=$a)break j;rb=q[2096]&fd(lb),q[2096]=rb;break g}if(!(q[pb+(q[pb+16>>2]==(0|nb)?16:20)>>2]=$a))break g}q[$a+24>>2]=pb,(lb=q[16+nb>>2])&&(q[$a+16>>2]=lb,q[lb+24>>2]=$a),(lb=q[20+nb>>2])&&(q[$a+20>>2]=lb,q[lb+24>>2]=$a)}}if(q[a+4>>2]=1|Za,q[a+Za>>2]=Za,q[2100]!=(0|a))break f;return q[2097]=Za}q[4+nb>>2]=-2&$a,q[a+4>>2]=1|Za,q[a+Za>>2]=Za}if(Za>>>0<=255)return Za=8420+(($a=Za>>>3)<<3)|0,$a=(lb=q[2095])&($a=1<<$a)?q[Za+8>>2]:(q[2095]=$a|lb,Za),q[Za+8>>2]=a,q[$a+12>>2]=a,q[a+12>>2]=Za,q[a+8>>2]=$a;q[a+16>>2]=0,$a=q[a+20>>2]=0,(mb=Za>>>8)&&($a=31,16777215<Za>>>0||($a=28+(($a=((nb=(mb<<=ob=mb+1048320>>>16&8)<<($a=mb+520192>>>16&4))<<(mb=245760+nb>>>16&2)>>>15)-(mb|$a|ob)|0)<<1|Za>>>$a+21&1)|0)),mb=8684+((q[(lb=a)+28>>2]=$a)<<2)|0;m:{if((lb=q[2096])&(ob=1<<$a)){for(lb=Za<<(31==(0|$a)?0:25-($a>>>1)|0),$a=q[mb>>2];;){if((-8&q[(mb=$a)+4>>2])==(0|Za))break m;if($a=lb>>>29,lb<<=1,!($a=q[16+(ob=mb+(4&$a)|0)>>2]))break}q[ob+16>>2]=a}else q[2096]=lb|ob,q[mb>>2]=a;return q[a+24>>2]=mb,q[a+12>>2]=a,q[a+8>>2]=a}Za=q[mb+8>>2],q[Za+12>>2]=a,q[mb+8>>2]=a,q[a+24>>2]=0,q[a+12>>2]=mb,q[a+8>>2]=Za}}function Aa(a){var vb,xb,yb,Ab,Bb,Cb,sb,wb,Za=x(0),tb=(x(0),0),ub=0,zb=(x(0),x(0),x(0),x(0),0);x(0),x(0);a:{b:{if(j(a),ub=2147483647&(tb=b[0])){if(!(ub>>>0<2139095041))return x(x(.10000000149011612)+a);if(1065353216==(0|ub))return x(-1<(0|tb)?.10000000149011612:10);if(2139095040==(0|ub))return x(-1<(0|tb)?0:-a);if(1073741824==(0|tb))return x(.010000000707805157);if(1056964608==(0|tb))return x(.3162277638912201);if(1291845633<=ub>>>0)return x((0|tb)<0?H:0);if(vb=u[1709],wb=x(x(1.600000023841858)-vb),xb=x(x(1)/x(vb+x(1.600000023841858))),f(0,-4096&(j(sb=x(wb*xb)),b[0])),Za=k(),yb=x(Za*Za),Bb=u[1713],vb=x(xb*x(x(wb-x((Ab=Za)*x(3.099609375)))-x(Za*x(x(1.600000023841858)-x(x(3.099609375)-vb))))),xb=x(x(sb+Za)*vb),Za=x(sb*sb),wb=x(xb+x(x(Za*Za)*x(x(Za*x(x(Za*x(x(Za*x(x(Za*x(x(Za*x(.20697501301765442))+x(.23066075146198273)))+x(.2727281153202057)))+x(.3333333432674408)))+x(.4285714328289032)))+x(.6000000238418579)))),f(0,-4096&(j(x(x(yb+x(3))+wb)),b[0])),Za=k(),xb=x(Ab*Za),sb=x(x(vb*Za)+x(sb*x(wb-x(x(Za+x(-3))-yb)))),f(0,-4096&(j(x(xb+sb)),b[0])),Za=k(),vb=x(Za*x(.9619140625)),yb=x(u[1711]+x(x(x(sb-x(Za-xb))*x(.9617967009544373))+x(Za*x(-.00011736857413779944)))),f(0,-4096&(j(x(x(Bb+x(vb+yb))+x(-4))),b[0])),sb=k(),f(0,-4096&tb),wb=k(),Za=x(sb*wb),a=x(x(x(yb-x(x(x(sb-x(-4))-Bb)-vb))*a)+x(x(a-wb)*sb)),j(sb=x(Za+a)),1124073473<=(0|(tb=b[0])))break b;d:{if((ub=1124073472)==(0|tb)){if(x(a+x(4.299566569443414e-8))>x(sb-Za))break b}else{if(ub=2147483647&tb,!(a<=x(sb-Za)^1|-1021968384!=(0|tb))|1125515265<=ub>>>0)break a;if(ub>>>0<1056964609)break d}zb=(8388607&(ub=(8388608>>>(ub>>>23)-126)+tb|0)|8388608)>>>150-(Cb=ub>>>23&255),zb=(0|tb)<0?0-zb|0:zb,Za=x(Za-(f(0,ub&-8388608>>Cb-127),k())),j(x(a+Za)),tb=b[0]}f(0,-32768&tb),sb=k(),vb=x(sb*x(.693145751953125)),sb=x(x(sb*x(14286065379565116e-22))+x(x(a-x(sb-Za))*x(.6931471824645996))),a=x(vb+sb),Za=x(a*a),Za=x(a-x(Za*x(x(Za*x(x(Za*x(x(Za*x(x(Za*x(4.138136944220605e-8))+x(-16533901998627698e-22)))+x(661375597701408e-19)))+x(-.0027777778450399637)))+x(.1666666716337204)))),Ab=x(x(a*Za)/x(Za+x(-2))),Za=x(sb-x(a-vb)),a=(0|(tb=0|(j(a=x(x(a-x(Ab-x(Za+x(a*Za))))+x(1))),b[0]+(zb<<23))))<=8388607?function(a,Tk){var vl=0;return 128<=(0|Tk)?(a=x(a*x(17014118346046923e22)),Tk=(0|(vl=Tk+-127|0))<128?vl:(a=x(a*x(17014118346046923e22)),((0|Tk)<381?Tk:381)+-254|0)):-127<(0|Tk)||(a=x(a*x(11754943508222875e-54)),Tk=-127<(0|(vl=Tk+126|0))?vl:(a=x(a*x(11754943508222875e-54)),(-378<(0|Tk)?Tk:-378)+252|0)),x(a*(f(0,1065353216+(Tk<<23)|0),k()))}(a,zb):(f(0,tb),k()),a=x(x(1)*a)}else a=x(1);return a}return x(H)}return x(0)}function Ba(a,Db){var Jb,Eb,Gb,Fb=0,Hb=0,Ib=x(0);if(j(Db),!((Gb=2147483647&(Eb=b[0]))>>>0<=2139095040&&(j(a),(Fb=2147483647&(Hb=b[0]))>>>0<2139095041)))return x(a+Db);if(1065353216==(0|Eb))return Ca(a);Eb=(Jb=Eb>>>30&2)|Hb>>>31;b:{c:{d:{e:{if(!Fb){switch(Eb-2|0){case 0:break e;case 1:break;default:break d}return x(-3.1415927410125732)}if(2139095040!=(0|Gb)){if(!Gb|!(Fb>>>0<=218103808+Gb>>>0&&2139095040!=(0|Fb)))break b;if(a=Ib=Fb+218103808>>>0<Gb>>>0&&(Ib=x(0),Jb)?Ib:Ca(x(y(x(a/Db)))),Eb>>>0<=2){switch(Eb-1|0){case 0:return x(-a);case 1:break;default:break d}return x(x(3.1415927410125732)-x(a+x(8.742277657347586e-8)))}return x(x(a+x(8.742277657347586e-8))+x(-3.1415927410125732))}if(2139095040==(0|Fb))break c;return u[6816+(Eb<<2)>>2]}a=x(3.1415927410125732)}return a}return u[6800+(Eb<<2)>>2]}return x((0|Hb)<0?-1.5707963705062866:1.5707963705062866)}function Ca(a){x(0);var Kb,Nb,Ob,Db,Mb,Lb=0;x(0),x(0),j(a);a:{if(1283457024<=(Db=2147483647&(Mb=b[0]))>>>0){if(2139095040<Db>>>0)break a;return x((0|Mb)<0?-1.570796251296997:1.570796251296997)}b:{if(Db>>>0<=1054867455){if(Lb=-1,964689920<=Db>>>0)break b;break a}a=x(y(a)),Lb=Db>>>0<=1066926079?Db>>>0<=1060110335?(a=x(x(x(a+a)+x(-1))/x(a+x(2))),0):(a=x(x(a+x(-1))/x(a+x(1))),1):Db>>>0<=1075576831?(a=x(x(a+x(-1.5))/x(x(a*x(1.5))+x(1))),2):(a=x(x(-1)/a),3)}if(Db=Lb,Nb=x(a*a),Kb=x(Nb*Nb),Ob=x(Kb*x(x(Kb*x(-.106480173766613))+x(-.19999158382415771))),Kb=x(Nb*x(x(Kb*x(x(Kb*x(.06168760731816292))+x(.14253635704517365)))+x(.333333283662796))),(0|Db)<=-1)return x(a-x(a*x(Ob+Kb)));a=x(u[6768+(Db<<=2)>>2]-x(x(x(a*x(Ob+Kb))-u[6784+Db>>2])-a)),a=(0|Mb)<0?x(-a):a}return a}function Da(a,Pb){var Ub,Sb,Tb,Qb=0,Rb=0;return L=Sb=L-16|0,j(a),(Qb=2147483647&(Tb=b[0]))>>>0<=1305022426?(v[Pb>>3]=(Ub=+a)+-1.5707963109016418*(Rb=.6366197723675814*Ub+6755399441055744-6755399441055744)+-1.5893254773528196e-8*Rb,Qb=y(Rb)<2147483648?~~Rb:-2147483648):2139095040<=Qb>>>0?(v[Pb>>3]=x(a-a),Qb=0):(Ub=Qb,v[8+Sb>>3]=(f(0,Ub-((Qb=(Qb>>>23)-150|0)<<23)|0),k()),Qb=function(a,Gl,Hl){var Ll,Ql,Ul,Vl,Xl,Yl,Il=0,Jl=0,Kl=0,Ml=0,Nl=0,Ol=0,Pl=0,Rl=0,Sl=0,Tl=0,Wl=0;if(L=Ll=L-560|0,Pl=(Jl=Hl)+w(Ul=0<(0|(Hl=(Hl+-3|0)/24|0))?Hl:0,-24)|0,0<=(0|(Ql=q[980])))for(Jl=Ql+1|0,Hl=Ul;v[(320+Ll|0)+(Kl<<3)>>3]=(0|Hl)<0?0:+q[3936+(Hl<<2)>>2],Hl=Hl+1|0,(0|Jl)!=(0|(Kl=Kl+1|0)););for(Nl=Pl+-24|0,Jl=0;;){for(Il=Hl=0;Il+=v[(Hl<<3)+a>>3]*v[(320+Ll|0)+(Jl-Hl<<3)>>3],1!=(0|(Hl=Hl+1|0)););if(v[(Jl<<3)+Ll>>3]=Il,Hl=(0|Jl)<(0|Ql),Jl=Jl+1|0,!Hl)break}Yl=23-Nl|0,Vl=24-Nl|0,Jl=Ql;a:{for(;;){if(Il=v[(Jl<<3)+Ll>>3],!(Sl=((Hl=0)|(Kl=Jl))<1))for(;Ol=(480+Ll|0)+(Hl<<2)|0,Rl=Il,Ml=y(Il*=5.960464477539063e-8)<2147483648?~~Il:-2147483648,Ml=y(Rl+=-16777216*(Il=0|Ml))<2147483648?~~Rl:-2147483648,q[Ol>>2]=Ml,Il=v[((Kl=Kl+-1|0)<<3)+Ll>>3]+Il,(0|Jl)!=(0|(Hl=Hl+1|0)););Il=ja(Il,Nl),Il=(Il+=-8*C(.125*Il))-(0|(Ol=y(Il)<2147483648?~~Il:-2147483648));e:{f:{g:{if(Wl=(0|Nl)<1){if(Nl)break g;Ml=q[476+((Jl<<2)+Ll|0)>>2]>>23}else Ml=q[476+(Kl=(Jl<<2)+Ll|0)>>2],Tl=Kl,Kl=Ml-((Hl=Ml>>Vl)<<Vl)|0,Ol=Hl+Ol|0,Ml=(q[Tl+476>>2]=Kl)>>Yl;if((0|Ml)<1)break e;break f}if(Ml=2,!(.5<=Il)){Ml=0;break e}}if(Kl=Hl=0,!Sl)for(;;){Sl=q[(Xl=(480+Ll|0)+(Hl<<2)|0)>>2],Tl=16777215;i:{j:{if(!Kl){if(!Sl)break j;Tl=16777216,Kl=1}q[Xl>>2]=Tl-Sl;break i}Kl=0}if((0|Jl)==(0|(Hl=Hl+1|0)))break}Wl||1<(Hl=Nl+-1|0)>>>0||(q[476+(Hl=(Jl<<2)+Ll|0)>>2]=Hl-1?8388607&q[Hl+476>>2]:4194303&q[Hl+476>>2]),Ol=Ol+1|0,2==(0|Ml)&&(Il=1-Il,Ml=2,Kl)&&(Il-=ja(1,Nl))}if(0!=Il)break;if(!(((Kl=0)|(Hl=Jl))<=(0|Ql))){for(;Kl=q[(480+Ll|0)+((Hl=Hl+-1|0)<<2)>>2]|Kl,(0|Ql)<(0|Hl););if(Kl){for(Pl=Nl;Pl=Pl+-24|0,!q[(480+Ll|0)+((Jl=Jl+-1|0)<<2)>>2];);break a}}for(Hl=1;Hl=(Kl=Hl)+1|0,!q[(480+Ll|0)+(Ql-Kl<<2)>>2];);for(Kl=Jl+Kl|0;;){for(Jl=Ol=Jl+1|0,v[(320+Ll|0)+(Ol<<3)>>3]=q[3936+(Ul+Jl<<2)>>2],Il=Hl=0;Il+=v[(Hl<<3)+a>>3]*v[(320+Ll|0)+(Ol-Hl<<3)>>3],1!=(0|(Hl=Hl+1|0)););if(v[(Jl<<3)+Ll>>3]=Il,!((0|Jl)<(0|Kl)))break}Jl=Kl}16777216<=(Il=ja(Il,0-Nl|0))?(a=(480+Ll|0)+(Jl<<2)|0,Rl=Il,Hl=y(Il*=5.960464477539063e-8)<2147483648?~~Il:-2147483648,Kl=y(Il=Rl+-16777216*(0|Hl))<2147483648?~~Il:-2147483648,q[a>>2]=Kl,Jl=Jl+1|0):(Hl=y(Il)<2147483648?~~Il:-2147483648,Pl=Nl),q[(480+Ll|0)+(Jl<<2)>>2]=Hl}if(Il=ja(1,Pl),!((0|Jl)<=-1)){for(Hl=Jl;v[(Hl<<3)+Ll>>3]=Il*+q[(480+Ll|0)+(Hl<<2)>>2],Il*=5.960464477539063e-8,a=0<(0|Hl),Hl=Hl+-1|0,a;);if(!((0|Jl)<=-1))for(Hl=Jl;;){for(Nl=Jl-(a=Hl)|0,Hl=Il=0;Il+=v[6704+(Hl<<3)>>3]*v[(a+Hl<<3)+Ll>>3],!((0|Ql)<=(0|Hl))&&(Pl=Hl>>>0<Nl>>>0,Hl=Hl+1|0,Pl););if(v[(160+Ll|0)+(Nl<<3)>>3]=Il,Hl=a+-1|0,!(0<(0|a)))break}}if(0<=(Jl|(Il=0)))for(;Il+=v[(160+Ll|0)+(Jl<<3)>>3],a=0<(0|Jl),Jl=Jl+-1|0,a;);return v[Gl>>3]=Ml?-Il:Il,L=560+Ll|0,7&Ol}(8+Sb|0,Sb,Qb),Rb=v[Sb>>3],(0|Tb)<=-1?(v[Pb>>3]=-Rb,Qb=0-Qb|0):v[Pb>>3]=Rb),L=16+Sb|0,Qb}function Ea(a,Pb){return a?function(a,Gl){a:{if(a){if(Gl>>>0<=127)break a;if(q[q[1797]>>2]){if(Gl>>>0<=2047)return o[a+1|0]=63&Gl|128,o[0|a]=Gl>>>6|192,2;if(!(57344!=(-8192&Gl)&&55296<=Gl>>>0))return o[a+2|0]=63&Gl|128,o[0|a]=Gl>>>12|224,o[a+1|0]=Gl>>>6&63|128,3;if(Gl+-65536>>>0<=1048575)return o[a+3|0]=63&Gl|128,o[0|a]=Gl>>>18|240,o[a+2|0]=Gl>>>6&63|128,o[a+1|0]=Gl>>>12&63|128,4}else if(57216==(-128&Gl))break a;q[2094]=25,a=-1}else a=1;return a}return o[0|a]=Gl,1}(a,Pb):0}function Fa(a,Pb,Wb){var fc,gc,Xb=0,Yb=0,Zb=0,_b=0,$b=0,ac=0,bc=0,cc=0,dc=0,ec=r[a+4|0];if(q[Pb>>2]=652,Yb=q[a+704>>2],1<=(0|(_b=q[Yb>>2]))){for($b=q[a+720>>2],bc=q[a+1072>>2];Zb=(1<<q[bc+(q[$b+(Xb<<2)>>2]<<2)>>2])+Zb|0,(0|_b)!=(0|(Xb=Xb+1|0)););Xb=Zb<<2}if(q[Pb+4>>2]=w(_b,12),q[Pb+8>>2]=q[Yb>>2]<<2,q[Pb+12>>2]=q[Yb>>2]<<2,q[Pb+16>>2]=q[Yb>>2]<<2,q[Pb+20>>2]=q[Yb>>2]<<2,Zb=q[Yb>>2],q[Pb+28>>2]=Xb,q[Pb+24>>2]=Zb<<2,Zb=q[Yb>>2],q[Pb+40>>2]=Xb,q[Pb+36>>2]=Xb,q[Pb+32>>2]=Zb<<2,q[Pb+44>>2]=q[Yb+4>>2]<<5,q[Pb+48>>2]=q[Yb+4>>2]<<2,q[Pb+52>>2]=q[Yb+4>>2]<<2,q[Pb+56>>2]=q[Yb+4>>2]<<2,q[Pb+60>>2]=q[Yb+4>>2]<<4,q[Pb+64>>2]=q[Yb+4>>2]<<4,1<=((Xb=0)|(_b=q[Yb+8>>2]))){for($b=q[a+780>>2],bc=q[a+1072>>2],dc=q[a+796>>2],Zb=0;ac=(15+(q[(cc=Xb<<2)+dc>>2]<<3)&-16)+ac|0,Zb=(1<<q[bc+(q[$b+cc>>2]<<2)>>2])+Zb|0,(0|_b)!=(0|(Xb=Xb+1|0)););Xb=Zb<<2}if(q[Pb+68>>2]=w(_b,24),q[Pb+72>>2]=q[Yb+8>>2]<<2,q[Pb+76>>2]=q[Yb+8>>2]<<2,Zb=q[Yb+8>>2],q[Pb+84>>2]=ac,q[Pb+80>>2]=Zb<<2,q[Pb+88>>2]=q[Yb+8>>2]<<4,q[Pb+92>>2]=q[Yb+8>>2]<<4,Zb=q[Yb+8>>2],q[Pb+100>>2]=Xb,q[Pb+96>>2]=Zb<<2,Zb=q[Yb+8>>2],q[Pb+140>>2]=Xb,q[Pb+136>>2]=Xb,q[Pb+132>>2]=Xb,q[Pb+128>>2]=Xb,q[Pb+124>>2]=Xb,q[Pb+120>>2]=Xb,q[Pb+116>>2]=Xb,q[Pb+112>>2]=Xb,q[Pb+108>>2]=Xb,q[Pb+104>>2]=Zb<<2,q[Pb+144>>2]=q[Yb+8>>2]<<2,q[Pb+148>>2]=q[Yb+8>>2]<<2,q[Pb+152>>2]=q[Yb+8>>2]<<2,q[Pb+156>>2]=q[Yb+8>>2]<<2,q[Pb+160>>2]=q[Yb+8>>2]<<2,q[Pb+164>>2]=q[Yb+8>>2]<<2,1<=((Xb=ac=0)|(_b=q[Yb+12>>2]))){for($b=q[a+812>>2],bc=q[a+1072>>2],Zb=0;Zb=(1<<q[bc+(q[$b+(Xb<<2)>>2]<<2)>>2])+Zb|0,(0|_b)!=(0|(Xb=Xb+1|0)););Xb=Zb<<2}if(q[Pb+168>>2]=w(_b,12),q[Pb+172>>2]=q[Yb+12>>2]<<2,q[Pb+176>>2]=q[Yb+12>>2]<<2,q[Pb+180>>2]=q[Yb+12>>2]<<2,q[Pb+184>>2]=q[Yb+12>>2]<<2,q[Pb+188>>2]=q[Yb+12>>2]<<2,q[Pb+192>>2]=q[Yb+12>>2]<<2,q[Pb+196>>2]=q[Yb+12>>2]<<2,q[Pb+200>>2]=q[Yb+12>>2]<<2,q[Pb+204>>2]=q[Yb+12>>2]<<4,q[Pb+208>>2]=q[Yb+12>>2]<<4,Zb=q[Yb+12>>2],q[Pb+216>>2]=Xb,q[Pb+212>>2]=Zb<<2,Zb=q[Yb+12>>2],q[Pb+268>>2]=Xb,q[Pb+264>>2]=Xb,q[Pb+260>>2]=Xb,q[Pb+256>>2]=Xb,q[Pb+252>>2]=Xb,q[Pb+248>>2]=Xb,q[Pb+244>>2]=Xb,q[Pb+240>>2]=Xb,q[Pb+236>>2]=Xb,q[Pb+232>>2]=Xb,q[Pb+228>>2]=Xb,q[Pb+224>>2]=Xb,q[Pb+220>>2]=Zb<<2,q[Pb+272>>2]=q[Yb+12>>2]<<2,q[Pb+276>>2]=q[Yb+12>>2]<<2,q[Pb+280>>2]=q[Yb+12>>2]<<2,q[Pb+284>>2]=q[Yb+12>>2]<<2,q[Pb+288>>2]=q[Yb+12>>2]<<2,q[Pb+292>>2]=q[Yb+12>>2]<<2,1<=((Xb=0)|(Zb=q[Yb+16>>2]))){for($b=q[a+852>>2],bc=q[a+1072>>2],dc=q[a+892>>2],_b=0;ac=(15+(q[(cc=Xb<<2)+dc>>2]<<3)&-16)+ac|0,_b=(1<<q[bc+(q[$b+cc>>2]<<2)>>2])+_b|0,(0|Zb)!=(0|(Xb=Xb+1|0)););Xb=_b<<2}if(q[Pb+296>>2]=w(Zb,20),q[Pb+300>>2]=q[Yb+16>>2]<<2,q[Pb+304>>2]=q[Yb+16>>2],q[Pb+308>>2]=q[Yb+16>>2]<<2,q[Pb+312>>2]=q[Yb+16>>2]<<2,Zb=q[Yb+16>>2],q[Pb+320>>2]=ac,q[Pb+316>>2]=Zb<<2,q[Pb+324>>2]=q[Yb+16>>2]<<2,q[Pb+328>>2]=q[Yb+16>>2]<<4,q[Pb+332>>2]=q[Yb+16>>2]<<4,q[Pb+336>>2]=q[Yb+16>>2]<<2,q[Pb+340>>2]=q[Yb+16>>2]<<2,q[Pb+344>>2]=q[Yb+16>>2]<<2,q[Pb+348>>2]=q[Yb+16>>2]<<4,q[Pb+352>>2]=q[Yb+16>>2]<<4,Zb=q[Yb+16>>2],q[Pb+360>>2]=Xb,q[Pb+356>>2]=Zb<<2,Zb=q[Yb+16>>2],q[Pb+404>>2]=Xb,q[Pb+400>>2]=Xb,q[Pb+396>>2]=Xb,q[Pb+392>>2]=Xb,q[Pb+388>>2]=Xb,q[Pb+384>>2]=Xb,q[Pb+380>>2]=Xb,q[Pb+376>>2]=Xb,q[Pb+372>>2]=Xb,q[Pb+368>>2]=Xb,q[Pb+364>>2]=Zb<<2,q[Pb+408>>2]=q[Yb+16>>2]<<2,q[Pb+412>>2]=q[Yb+16>>2]<<2,q[Pb+416>>2]=q[Yb+16>>2]<<2,q[Pb+420>>2]=q[Yb+16>>2]<<2,q[Pb+424>>2]=q[Yb+16>>2]<<2,q[Pb+428>>2]=q[Yb+16>>2]<<2,$b=q[a+704>>2],q[Pb+432>>2]=w(q[$b+20>>2],52),q[Pb+436>>2]=ec>>>(Xb=_b=0)<=3?q[$b+20>>2]<<2:0,q[Pb+440>>2]=q[$b+20>>2]<<2,q[Pb+444>>2]=w(q[$b+52>>2],28),1<=(0|(Yb=q[$b+48>>2]))){for(Zb=q[a+1072>>2],ac=0;ac=(bc=q[Zb+(Xb<<2)>>2])+ac|0,_b=(1<<bc)+_b|0,(0|Yb)!=(0|(Xb=Xb+1|0)););Xb=_b<<2,_b=ac<<2}if(q[Pb+460>>2]=Xb,q[Pb+456>>2]=Xb,q[Pb+452>>2]=_b,q[Pb+448>>2]=w(Yb,36),q[Pb+500>>2]=w(q[$b+72>>2],28),1<=((ac=Xb=Zb=0)|(bc=q[$b+72>>2]))){for(dc=q[a+1224>>2],cc=q[a+1220>>2],gc=q[a+1212>>2],_b=0;_b=(0|(fc=q[(Yb=ac<<2)+cc>>2]-q[Yb+dc>>2]|0))<(0|_b)?_b:1+fc|0,Xb=(0|Xb)<(0|(Yb=q[Yb+gc>>2]))?Yb:Xb,(0|bc)!=(0|(ac=ac+1|0)););ac=Xb<<2,Xb=_b<<2}if(Yb=q[$b+76>>2],q[Pb+516>>2]=Xb,q[Pb+512>>2]=ac,q[Pb+508>>2]=Xb,q[Pb+504>>2]=Yb<<4,1<=(0|(Yb=q[$b+80>>2]))){for(Zb=q[a+1248>>2],ac=q[a+1072>>2],_b=Xb=0;_b=(1<<q[ac+(q[Zb+(Xb<<2)>>2]<<2)>>2])+_b|0,(0|Yb)!=(0|(Xb=Xb+1|0)););Zb=_b<<2}if(q[Pb+520>>2]=w(Yb,24),q[Pb+524>>2]=q[$b+80>>2]<<2,Yb=q[$b+80>>2],q[Pb+532>>2]=Zb,q[Pb+528>>2]=Yb<<2,Yb=q[$b+80>>2],q[Pb+544>>2]=Zb,q[Pb+540>>2]=Zb,q[Pb+536>>2]=Yb<<2,Yb=Pb,4<=ec>>>0){if(q[Pb+464>>2]=w(q[$b+120>>2],20),q[Pb+468>>2]=w(q[$b+100>>2],28),Zb=Pb,1<=((Xb=ac=0)|(bc=q[$b+104>>2]))){for(a=q[a+1104>>2],_b=0;_b=q[a+(Xb<<2)>>2]+_b|0,(0|bc)!=(0|(Xb=Xb+1|0)););a=_b<<2}else a=0;q[Zb+476>>2]=a,q[Pb+472>>2]=w(bc,48),q[Pb+484>>2]=w(q[$b+108>>2],12),a=q[$b+112>>2],q[Pb+552>>2]=0,q[Pb+492>>2]=w(a,12),a=0}else{if((0|(ac=q[$b+20>>2]))<1)_b=0;else for(bc=q[a+1060>>2],dc=q[a+952>>2],a=q[a+948>>2],Zb=_b=0;;){if(1<=(0|(cc=q[(Xb=Zb<<2)+dc>>2])))for(cc=(Xb=bc+(q[a+Xb>>2]<<2)|0)+(cc<<2)|0;_b=q[Xb>>2]+_b|0,(Xb=Xb+4|0)>>>0<cc>>>0;);if((0|ac)==(0|(Zb=Zb+1|0)))break}q[Pb+552>>2]=ac<<2,ac=q[$b+20>>2]<<2,a=_b<<2}for(q[Yb+556>>2]=a,q[Pb+548>>2]=ac,4<ec>>>0&&(q[Pb+480>>2]=w(q[$b+128>>2],12),q[Pb+488>>2]=w(q[$b+132>>2],12),q[Pb+496>>2]=w(q[$b+136>>2],12)),Xb=_b=0;Xb=((Yb=q[(a=(_b<<2)+Pb|0)>>2])+15&-16)+(q[a>>2]=Xb)|0,140!=(0|(_b=_b+1|0)););q[Wb>>2]=Xb}function Ga(a,Pb,Wb,hc){a:{if(!(20<Pb>>>0||9<(Pb=Pb+-9|0)>>>0)){switch(Pb-1|0){default:return Pb=q[Wb>>2],q[Wb>>2]=Pb+4,q[a>>2]=q[Pb>>2];case 0:return Pb=q[Wb>>2],q[Wb>>2]=Pb+4,Pb=q[Pb>>2],q[a>>2]=Pb,q[a+4>>2]=Pb>>31;case 1:return Pb=q[Wb>>2],q[Wb>>2]=Pb+4,q[a>>2]=q[Pb>>2],q[a+4>>2]=0;case 3:return Pb=q[Wb>>2],q[Wb>>2]=Pb+4,Pb=p[Pb>>1],q[a>>2]=Pb,q[a+4>>2]=Pb>>31;case 4:return Pb=q[Wb>>2],q[Wb>>2]=Pb+4,q[a>>2]=s[Pb>>1],q[a+4>>2]=0;case 5:return Pb=q[Wb>>2],q[Wb>>2]=Pb+4,Pb=o[0|Pb],q[a>>2]=Pb,q[a+4>>2]=Pb>>31;case 6:return Pb=q[Wb>>2],q[Wb>>2]=Pb+4,q[a>>2]=r[0|Pb],q[a+4>>2]=0;case 2:case 7:break a;case 8:}n[hc](a,Wb)}return}Pb=q[Wb>>2]+7&-8,q[Wb>>2]=Pb+8,Wb=q[Pb+4>>2],q[a>>2]=q[Pb>>2],q[a+4>>2]=Wb}function Ha(a){var Pb,hc,Wb=0;if(ha(o[q[a>>2]]))for(;Pb=q[a>>2],hc=o[0|Pb],q[a>>2]=Pb+1,Wb=(w(Wb,10)+hc|0)-48|0,ha(o[Pb+1|0]););return Wb}function Ia(a,ic,jc,kc,lc){var oc,mc;q[204+(L=mc=L-208|0)>>2]=jc,ca(160+mc|(jc=0),0,40),q[200+mc>>2]=q[204+mc>>2],(0|ra(0,ic,200+mc|0,80+mc|0,160+mc|0,kc,lc))<0||(jc=0<=q[a+76>>2]?1:jc,jc=q[a>>2],o[a+74|0]<=0&&(q[a>>2]=-33&jc),oc=32&jc,q[a+48>>2]?ra(a,ic,200+mc|0,80+mc|0,160+mc|0,kc,lc):(q[a+48>>2]=80,q[a+16>>2]=80+mc,q[a+28>>2]=mc,q[a+20>>2]=mc,jc=q[a+44>>2],ra(a,ic,200+(q[a+44>>2]=mc)|0,80+mc|0,160+mc|0,kc,lc),jc&&(n[q[a+36>>2]](a,0,0),q[a+48>>2]=0,q[a+44>>2]=jc,q[a+28>>2]=0,q[a+16>>2]=0,q[a+20>>2]=0)),q[a>>2]=q[a>>2]|oc),L=208+mc|0}function Ka(a,ic,pc){var rc,qc;$(8+(L=qc=L-160|0)|0,3216,144),q[52+qc>>2]=a,q[28+qc>>2]=a,q[56+qc>>2]=rc=(rc=-2-a|0)>>>0<256?rc:256,q[36+qc>>2]=a=a+rc|0,q[24+qc>>2]=a,Ia(8+qc|0,ic,pc,11,12),rc&&(a=q[28+qc>>2],o[a-((0|a)==q[24+qc>>2])|0]=0),L=160+qc|0}function La(a,ic){var sc,tc,pc=0,pc=0!=(0|ic);a:{b:{c:{d:if(!(!ic|!(3&a)))for(;;){if(!r[0|a])break c;if(a=a+1|0,pc=0!=(0|(ic=ic+-1|0)),!ic)break d;if(!(3&a))break}if(!pc)break b}if(!r[0|a])break a;e:{if(4<=ic>>>0){for(pc=(pc=ic+-4|0)-(sc=-4&pc)|0,sc=4+(a+sc|0)|0;;){if((-1^(tc=q[a>>2]))&tc+-16843009&-2139062144)break e;if(a=a+4|0,!(3<(ic=ic+-4|0)>>>0))break}ic=pc,a=sc}if(!ic)break b}for(;;){if(!r[0|a])break a;if(a=a+1|0,!(ic=ic+-1|0))break}}return 0}return a}function Ma(a){var uc,ic=0;if(!a)return 32;if(!(1&a))for(;ic=ic+1|0,uc=2&a,a>>>=1,!uc;);return ic}function Na(a,vc){var zc,Ac,Bc,yc,wc=0,xc=0,xc=4;L=yc=L-256|0;a:if(!((0|vc)<2))for(wc=q[(Bc=(vc<<2)+a|0)>>2]=yc;;){for($(wc,q[a>>2],zc=xc>>>0<256?xc:256),wc=0;$(q[(Ac=(wc<<2)+a|0)>>2],q[((wc=wc+1|0)<<2)+a>>2],zc),q[Ac>>2]=q[Ac>>2]+zc,(0|vc)!=(0|wc););if(!(xc=xc-zc|0))break a;wc=q[Bc>>2]}L=256+yc|0}function Oa(a){return Ma(q[a>>2]+-1|0)||((a=Ma(q[a+4>>2]))?a+32|0:0)}function $c(a,ap){ap|=0,b[0]=a|=0,b[1]=ap}function cd(a,ap,bp){return function(a,ap,bp){var fp,dp,cp,ep,gp=w(dp=bp>>>16,cp=a>>>16);return a=(65535&(cp=((fp=w(ep=65535&bp,a&=65535))>>>16)+w(cp,ep)|0))+w(a,dp)|0,M=((gp+w(ap,bp)|0)+(cp>>>16)|0)+(a>>>16)|0,65535&fp|a<<16}(a,ap,bp)}function dd(a,ap,bp){return function(a,ap,bp){var op,np,hp=0,ip=0,jp=0,kp=0,lp=0,mp=0,pp=0;a:{b:{c:{d:{e:{if(!(ip=ap))return $c((ap=a)-w(a=(a>>>0)/(bp>>>0)|0,bp)|0,0),M=0,a;if(hp=bp){if(!((kp=hp+-1|0)&hp))break e;lp=0-(kp=(z(hp)+33|0)-z(ip)|0)|0;break c}if(!a)return $c(0,ip-w(a=(ip>>>0)/0|0,0)|0),M=0,a;if((hp=32-z(ip)|0)>>>0<31)break d;break b}if($c(a&kp,0),1==(0|hp))break a;return bp=31&(hp=hp?31-z(hp+-1^hp)|0:32),a=32<=(63&hp)>>>0?(ip=0,ap>>>bp):(ip=ap>>>bp,((1<<bp)-1&ap)<<32-bp|a>>>bp),M=ip,a}kp=hp+1|0,lp=63-hp|0}if(hp=ap,jp=31&(ip=63&kp),jp=32<=ip>>>0?(ip=0,hp>>>jp):(ip=hp>>>jp,((1<<jp)-1&hp)<<32-jp|a>>>jp),hp=31&(lp&=63),32<=lp>>>0?(ap=a<<hp,a=0):(ap=(1<<hp)-1&a>>>32-hp|ap<<hp,a<<=hp),kp)for((lp=bp+(hp=-1)|0)>>>0<4294967295&&(hp=0);jp=(np=mp=jp<<1|ap>>>31)-(op=bp&(mp=hp-((ip=ip<<1|jp>>>31)+(lp>>>0<mp>>>0)|0)>>31))|0,ip=ip-(np>>>0<op>>>0)|0,ap=ap<<1|a>>>31,a=pp|a<<1,pp=mp&=1,kp=kp+-1|0;);return $c(jp,ip),M=ap<<1|a>>>31,mp|a<<1}$c(a,ap),ap=a=0}return M=ap,a}(a,ap,bp)}function fd(a){var qp;return(-1>>>(qp=31&a)&-2)<<qp|(-1<<(a=0-a&31)&-2)>>>a}function N(){return buffer.byteLength/65536|0}}(H,I,J)}}l=null,b.wasmBinary&&(F=b.wasmBinary);var WebAssembly={},F=[];"object"!=typeof WebAssembly&&E("no native wasm support detected");var I,J=new function(a){var c=Array(16);return c.grow=function(){17<=c.length&&B("Unable to grow wasm table. Use a higher value for RESERVED_FUNCTION_POINTERS or set ALLOW_TABLE_GROWTH."),c.push(null)},c.set=function(a,e){c[a]=e},c.get=function(a){return c[a]},c},K=!1;function assert(a,c){a||B("Assertion failed: "+c)}var buffer,M,L,N,ha="undefined"!=typeof TextDecoder?new TextDecoder("utf8"):void 0;function ia(a,c,d){var e=c+d;for(d=c;a[d]&&!(e<=d);)++d;if(16<d-c&&a.subarray&&ha)return ha.decode(a.subarray(c,d));for(e="";c<d;){var g,m,f=a[c++];128&f?(g=63&a[c++],192==(224&f)?e+=String.fromCharCode((31&f)<<6|g):(m=63&a[c++],(f=224==(240&f)?(15&f)<<12|g<<6|m:(7&f)<<18|g<<12|m<<6|63&a[c++])<65536?e+=String.fromCharCode(f):(f-=65536,e+=String.fromCharCode(55296|f>>10,56320|1023&f)))):e+=String.fromCharCode(f)}return e}function ja(a,c){return a?ia(L,a,c):""}function ka(a){return 0<a%65536&&(a+=65536-a%65536),a}function la(a){buffer=a,b.HEAP8=M=new Int8Array(a),b.HEAP16=new Int16Array(a),b.HEAP32=N=new Int32Array(a),b.HEAPU8=L=new Uint8Array(a),b.HEAPU16=new Uint16Array(a),b.HEAPU32=new Uint32Array(a),b.HEAPF32=new Float32Array(a),b.HEAPF64=new Float64Array(a)}"undefined"!=typeof TextDecoder&&new TextDecoder("utf-16le");var G=b.TOTAL_MEMORY||16777216;function O(a){for(;0<a.length;){var d,c=a.shift();"function"==typeof c?c():"number"==typeof(d=c.fa)?void 0===c.ea?b.dynCall_v(d):b.dynCall_vi(d,c.ea):d(void 0===c.ea?null:c.ea)}}(I=b.wasmMemory||new function(){return{buffer:new ArrayBuffer(G/65536*65536),grow:function(a){return ca(a)}}})&&(buffer=I.buffer),buffer.byteLength,la(buffer),N[2224]=5251968;var ra,ma=[],na=[],oa=[],pa=[],P=(Math.imul&&-5===Math.imul(4294967295,5)||(Math.imul=function(a,c){var d=65535&a,e=65535&c;return d*e+((a>>>16)*e+d*(c>>>16)<<16)|0}),Math.fround||(ra=new Float32Array(1),Math.fround=function(a){return ra[0]=a,ra[0]}),Math.clz32||(Math.clz32=function(a){var c=32,d=a>>16;return d&&(c-=16,a=d),(d=a>>8)&&(c-=8,a=d),(d=a>>4)&&(c-=4,a=d),(d=a>>2)&&(c-=2,a=d),a>>1?c-2:c-a}),Math.trunc||(Math.trunc=function(a){return a<0?Math.ceil(a):Math.floor(a)}),0),Q=null,U=null;function B(a){throw b.onAbort&&b.onAbort(a),D(a),E(a),K=!0,"abort("+a+"). Build with -s ASSERTIONS=1 for more info."}b.preloadedImages={},b.preloadedAudios={};var V="data:application/octet-stream;base64,";function W(a){return String.prototype.startsWith?a.startsWith(V):0===a.indexOf(V)}var X="_em_module.wasm";function ta(){try{if(F)return new Uint8Array(F);var a=z(X);if(a)return a;if(w)return w(X);throw"both async and sync fetching of the wasm failed"}catch(c){B(c)}}W(X)||(t=X,X=b.locateFile?b.locateFile(t,u):u+t),na.push({fa:function(){va()}});var wa=[null,[],[]],xa=!1;function C(a){for(var c=[],d=0;d<a.length;d++){var e=a[d];255<e&&(xa&&assert(!1,"Character code "+e+" ("+String.fromCharCode(e)+") at offset "+d+" not in 0x00-0xFF."),e&=255),c.push(String.fromCharCode(e))}return c.join("")}var ya="function"==typeof atob?atob:function(a){var c="",d=0;a=a.replace(/[^A-Za-z0-9\+\/=]/g,"");do{var e="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".indexOf(a.charAt(d++)),f="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".indexOf(a.charAt(d++)),g="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".indexOf(a.charAt(d++)),m="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".indexOf(a.charAt(d++)),e=e<<2|f>>4,f=(15&f)<<4|g>>2,h=(3&g)<<6|m}while(c+=String.fromCharCode(e),64!==g&&(c+=String.fromCharCode(f)),64!==m&&(c+=String.fromCharCode(h)),d<a.length);return c};function z(a){if(W(a)){if(a=a.slice(V.length),"boolean"==typeof r&&r){try{var c=Buffer.from(a,"base64")}catch(g){c=new Buffer(a,"base64")}var d=new Uint8Array(c.buffer,c.byteOffset,c.byteLength)}else try{for(var e=ya(a),f=new Uint8Array(e.length),c=0;c<e.length;++c)f[c]=e.charCodeAt(c);d=f}catch(g){throw Error("Converting base64 string to bytes failed.")}return d}}var Y,H={a:function(a,c,d){L.set(L.subarray(c,c+d),a)},b:function(a){if(2147418112<a)return!1;for(var c=Math.max(M.length,16777216);c<a;)c=c<=536870912?ka(2*c):Math.min(ka((3*c+2147483648)/4),2147418112);a:{try{I.grow(c-buffer.byteLength+65535>>16),la(I.buffer);var d=1;break a}catch(e){}d=void 0}return!!d},c:function(a,c,d,e){try{for(var f=0,g=0;g<d;g++){for(var m=N[c+8*g>>2],h=N[c+(8*g+4)>>2],A=0;A<h;A++){var R=L[m+A],S=wa[a];0===R||10===R?((1===a?D:E)(ia(S,0)),S.length=0):S.push(R)}f+=h}return N[e>>2]=f,0}catch(T){return"undefined"!=typeof FS&&T instanceof FS.ga||B(T),T.ha}},memory:I,table:J},u=function(){function a(a){b.asm=a.exports,P--,b.monitorRunDependencies&&b.monitorRunDependencies(P),0==P&&(null!==Q&&(clearInterval(Q),Q=null),U)&&(a=U,U=null,a())}function c(c){a(c.instance)}function d(a){(F||!p&&!q||"function"!=typeof fetch?new Promise(function(a){a(ta())}):fetch(X,{credentials:"same-origin"}).then(function(a){if(a.ok)return a.arrayBuffer();throw"failed to load wasm binary file at '"+X+"'"}).catch(ta)).then(function(){return{then:function(a){a({instance:new da})}}}).then(a,function(a){E("failed to asynchronously prepare wasm: "+a),B(a)})}var e={env:H,wasi_unstable:H};if(P++,b.monitorRunDependencies&&b.monitorRunDependencies(P),b.instantiateWasm)try{return b.instantiateWasm(e,a)}catch(f){return E("Module.instantiateWasm callback failed with error: "+f),!1}return F||"function"!=typeof WebAssembly.instantiateStreaming||W(X)||"function"!=typeof fetch?d(c):fetch(X,{credentials:"same-origin"}).then(function(a){return WebAssembly.instantiateStreaming(a,e).then(c,function(a){E("wasm streaming compile failed: "+a),E("falling back to ArrayBuffer instantiation"),d(c)})}),{}}(),va=(b.asm=u,b.___wasm_call_ctors=function(){return b.asm.d.apply(null,arguments)}),Aa=(b._csmGetLogFunction=function(){return b.asm.e.apply(null,arguments)},b._csmGetVersion=function(){return b.asm.f.apply(null,arguments)},b._csmGetLatestMocVersion=function(){return b.asm.g.apply(null,arguments)},b._csmGetMocVersion=function(){return b.asm.h.apply(null,arguments)},b._csmHasMocConsistency=function(){return b.asm.i.apply(null,arguments)},b._csmSetLogFunction=function(){return b.asm.j.apply(null,arguments)},b._csmReviveMocInPlace=function(){return b.asm.k.apply(null,arguments)},b._csmReadCanvasInfo=function(){return b.asm.l.apply(null,arguments)},b._csmGetSizeofModel=function(){return b.asm.m.apply(null,arguments)},b._csmInitializeModelInPlace=function(){return b.asm.n.apply(null,arguments)},b._csmUpdateModel=function(){return b.asm.o.apply(null,arguments)},b._csmGetParameterCount=function(){return b.asm.p.apply(null,arguments)},b._csmGetParameterIds=function(){return b.asm.q.apply(null,arguments)},b._csmGetParameterTypes=function(){return b.asm.r.apply(null,arguments)},b._csmGetParameterMinimumValues=function(){return b.asm.s.apply(null,arguments)},b._csmGetParameterMaximumValues=function(){return b.asm.t.apply(null,arguments)},b._csmGetParameterDefaultValues=function(){return b.asm.u.apply(null,arguments)},b._csmGetParameterValues=function(){return b.asm.v.apply(null,arguments)},b._csmGetParameterRepeats=function(){return b.asm.w.apply(null,arguments)},b._csmGetPartCount=function(){return b.asm.x.apply(null,arguments)},b._csmGetPartIds=function(){return b.asm.y.apply(null,arguments)},b._csmGetPartOpacities=function(){return b.asm.z.apply(null,arguments)},b._csmGetPartParentPartIndices=function(){return b.asm.A.apply(null,arguments)},b._csmGetDrawableCount=function(){return b.asm.B.apply(null,arguments)},b._csmGetDrawableIds=function(){return b.asm.C.apply(null,arguments)},b._csmGetDrawableConstantFlags=function(){return b.asm.D.apply(null,arguments)},b._csmGetDrawableDynamicFlags=function(){return b.asm.E.apply(null,arguments)},b._csmGetDrawableTextureIndices=function(){return b.asm.F.apply(null,arguments)},b._csmGetDrawableDrawOrders=function(){return b.asm.G.apply(null,arguments)},b._csmGetDrawableRenderOrders=function(){return b.asm.H.apply(null,arguments)},b._csmGetDrawableOpacities=function(){return b.asm.I.apply(null,arguments)},b._csmGetDrawableMaskCounts=function(){return b.asm.J.apply(null,arguments)},b._csmGetDrawableMasks=function(){return b.asm.K.apply(null,arguments)},b._csmGetDrawableVertexCounts=function(){return b.asm.L.apply(null,arguments)},b._csmGetDrawableVertexPositions=function(){return b.asm.M.apply(null,arguments)},b._csmGetDrawableVertexUvs=function(){return b.asm.N.apply(null,arguments)},b._csmGetDrawableIndexCounts=function(){return b.asm.O.apply(null,arguments)},b._csmGetDrawableIndices=function(){return b.asm.P.apply(null,arguments)},b._csmGetDrawableMultiplyColors=function(){return b.asm.Q.apply(null,arguments)},b._csmGetDrawableScreenColors=function(){return b.asm.R.apply(null,arguments)},b._csmGetDrawableParentPartIndices=function(){return b.asm.S.apply(null,arguments)},b._csmResetDrawableDynamicFlags=function(){return b.asm.T.apply(null,arguments)},b._csmGetParameterKeyCounts=function(){return b.asm.U.apply(null,arguments)},b._csmGetParameterKeyValues=function(){return b.asm.V.apply(null,arguments)},b._csmMallocMoc=function(){return b.asm.W.apply(null,arguments)},b._csmMallocModelAndInitialize=function(){return b.asm.X.apply(null,arguments)},b._csmMalloc=function(){return b.asm.Y.apply(null,arguments)},b._csmFree=function(){return b.asm.Z.apply(null,arguments)},b._csmInitializeAmountOfMemory=function(){return b.asm._.apply(null,arguments)},b.stackSave=function(){return b.asm.$.apply(null,arguments)}),Ba=b.stackAlloc=function(){return b.asm.aa.apply(null,arguments)},Ca=b.stackRestore=function(){return b.asm.ba.apply(null,arguments)},ca=b.__growWasmMemory=function(){return b.asm.ca.apply(null,arguments)};function Z(){function a(){if(!Y&&(Y=!0,!K)){if(O(na),O(oa),b.onRuntimeInitialized&&b.onRuntimeInitialized(),b.postRun)for("function"==typeof b.postRun&&(b.postRun=[b.postRun]);b.postRun.length;){var a=b.postRun.shift();pa.unshift(a)}O(pa)}}if(!(0<P)){if(b.preRun)for("function"==typeof b.preRun&&(b.preRun=[b.preRun]);b.preRun.length;)!function(){var a=b.preRun.shift();ma.unshift(a)}();O(ma),0<P||(b.setStatus?(b.setStatus("Running..."),setTimeout(function(){setTimeout(function(){b.setStatus("")},1),a()},1)):a())}}if(b.dynCall_vi=function(){return b.asm.da.apply(null,arguments)},b.asm=u,b.ccall=function(a,c,d,e){var f={string:function(a){var c=0;if(null!=a&&0!==a){var d=1+(a.length<<2),e=c=Ba(d),f=L;if(0<d){for(var d=e+d-1,g=0;g<a.length;++g){var k=a.charCodeAt(g);if((k=55296<=k&&k<=57343?65536+((1023&k)<<10)|1023&a.charCodeAt(++g):k)<=127){if(d<=e)break;f[e++]=k}else{if(k<=2047){if(d<=e+1)break;f[e++]=192|k>>6}else{if(k<=65535){if(d<=e+2)break;f[e++]=224|k>>12}else{if(d<=e+3)break;f[e++]=240|k>>18,f[e++]=128|k>>12&63}f[e++]=128|k>>6&63}f[e++]=128|63&k}}f[e]=0}}return c},array:function(a){var c=Ba(a.length);return M.set(a,c),c}},g=function(a){var c=b["_"+a];return assert(c,"Cannot call unknown function "+a+", make sure it is exported"),c}(a),m=[];if(a=0,e)for(var h=0;h<e.length;h++){var A=f[d[h]];A?(0===a&&(a=Aa()),m[h]=A(e[h])):m[h]=e[h]}return d=function(a){return"string"===c?ja(a):"boolean"===c?!!a:a}(d=g.apply(null,m)),0!==a&&Ca(a),d},b.UTF8ToString=ja,b.addFunction=function(a,c){var d=J.length;try{J.grow(1)}catch(e){if(!e instanceof RangeError)throw e;throw"Unable to grow wasm table. Use a higher value for RESERVED_FUNCTION_POINTERS or set ALLOW_TABLE_GROWTH."}try{J.set(d,a)}catch(e){if(!e instanceof TypeError)throw e;assert(void 0!==c,"Missing signature argument to addFunction"),J.set(d,a)}return d},b.then=function(a){var c;return Y?a(b):(c=b.onRuntimeInitialized,b.onRuntimeInitialized=function(){c&&c(),a(b)}),b},U=function Da(){Y||Z(),Y||(U=Da)},b.run=Z,b.preInit)for("function"==typeof b.preInit&&(b.preInit=[b.preInit]);0<b.preInit.length;)b.preInit.pop()();return Z(),_em_module}),_em=("object"==typeof exports&&"object"==typeof module?module.exports=_em_module:"function"==typeof define&&define.amd?define([],function(){return _em_module}):"object"==typeof exports&&(exports._em_module=_em_module),_em_module())}(Live2DCubismCore=Live2DCubismCore||{}); |
| New file |
| | |
| | | // èæ¯å¾å è½½æ£æµ |
| | | (function() { |
| | | const backgroundContainer = document.getElementById('backgroundContainer'); |
| | | |
| | | // æåèæ¯å¾çURL |
| | | let bgImageUrl = window.getComputedStyle(backgroundContainer).backgroundImage; |
| | | const urlMatch = bgImageUrl && bgImageUrl.match(/url\(["']?(.*?)["']?\)/); |
| | | |
| | | if (!urlMatch || !urlMatch[1]) { |
| | | console.warn('æªæåå°ææçèæ¯å¾çURL'); |
| | | return; |
| | | } |
| | | |
| | | bgImageUrl = urlMatch[1]; |
| | | |
| | | const bgImage = new Image(); |
| | | bgImage.onerror = function() { |
| | | console.error('èæ¯å¾çå 载失败:', bgImageUrl); |
| | | }; |
| | | |
| | | // å è½½æåæ¾ç¤ºæ¨¡åå è½½ |
| | | bgImage.onload = function() { |
| | | modelLoading.style.display = 'flex'; |
| | | }; |
| | | |
| | | bgImage.src = bgImageUrl; |
| | | })(); |
| New file |
| | |
| | | // UI controller module |
| | | import { loadConfig, saveConfig } from '../config/manager.js?v=0205'; |
| | | import { getAudioPlayer } from '../core/audio/player.js?v=0205'; |
| | | import { getAudioRecorder } from '../core/audio/recorder.js?v=0205'; |
| | | import { requestWakewordBridge, stopWakewordBridgeListener, startWakewordBridgeListener, getWakewordBridgeUrl, onNextBridgeConnected } from '../core/network/wakeword-bridge.js?v=0205'; |
| | | import { getWebSocketHandler } from '../core/network/websocket.js?v=0205'; |
| | | import { log } from '../utils/logger.js?v=0205'; |
| | | |
| | | // UI controller class |
| | | class UIController { |
| | | constructor() { |
| | | this.isEditing = false; |
| | | this.visualizerCanvas = null; |
| | | this.visualizerContext = null; |
| | | this.audioStatsTimer = null; |
| | | this.currentBackgroundIndex = localStorage.getItem('backgroundIndex') ? parseInt(localStorage.getItem('backgroundIndex')) : 0; |
| | | this.backgroundImages = ['1.png', '2.png', '3.png']; |
| | | this.dialBtnDisabled = false; |
| | | this.isConnecting = false; |
| | | this.lastWakewordDialTime = 0; |
| | | |
| | | // Bind methods |
| | | this.init = this.init.bind(this); |
| | | this.initEventListeners = this.initEventListeners.bind(this); |
| | | this.updateDialButton = this.updateDialButton.bind(this); |
| | | this.addChatMessage = this.addChatMessage.bind(this); |
| | | this.switchBackground = this.switchBackground.bind(this); |
| | | this.switchLive2DModel = this.switchLive2DModel.bind(this); |
| | | this.showModal = this.showModal.bind(this); |
| | | this.hideModal = this.hideModal.bind(this); |
| | | this.switchTab = this.switchTab.bind(this); |
| | | this.applyWakewordConfig = this.applyWakewordConfig.bind(this); |
| | | this.handleApplyWakeword = this.handleApplyWakeword.bind(this); |
| | | this.triggerWakewordDial = this.triggerWakewordDial.bind(this); |
| | | } |
| | | |
| | | // Initialize |
| | | init() { |
| | | console.log('UIController init started'); |
| | | |
| | | this.visualizerCanvas = document.getElementById('audioVisualizer'); |
| | | if (this.visualizerCanvas) { |
| | | this.visualizerContext = this.visualizerCanvas.getContext('2d'); |
| | | this.initVisualizer(); |
| | | } |
| | | |
| | | // Check if connect button exists during initialization |
| | | const connectBtn = document.getElementById('connectBtn'); |
| | | console.log('connectBtn during init:', connectBtn); |
| | | |
| | | this.initEventListeners(); |
| | | this.startAudioStatsMonitor(); |
| | | loadConfig(); |
| | | |
| | | // Register recording callback |
| | | const audioRecorder = getAudioRecorder(); |
| | | audioRecorder.onRecordingStart = (seconds) => { |
| | | this.updateRecordButtonState(true, seconds); |
| | | }; |
| | | |
| | | // Initialize status display |
| | | this.updateConnectionUI(false); |
| | | // Apply saved background |
| | | const backgroundContainer = document.querySelector('.background-container'); |
| | | if (backgroundContainer) { |
| | | backgroundContainer.style.backgroundImage = `url('./images/${this.backgroundImages[this.currentBackgroundIndex]}')`; |
| | | } |
| | | |
| | | this.updateDialButton(false); |
| | | |
| | | console.log('UIController init completed'); |
| | | } |
| | | |
| | | // Initialize visualizer |
| | | initVisualizer() { |
| | | if (this.visualizerCanvas) { |
| | | this.visualizerCanvas.width = this.visualizerCanvas.clientWidth; |
| | | this.visualizerCanvas.height = this.visualizerCanvas.clientHeight; |
| | | this.visualizerContext.fillStyle = '#fafafa'; |
| | | this.visualizerContext.fillRect(0, 0, this.visualizerCanvas.width, this.visualizerCanvas.height); |
| | | } |
| | | } |
| | | |
| | | // Initialize event listeners |
| | | initEventListeners() { |
| | | // Settings button |
| | | const settingsBtn = document.getElementById('settingsBtn'); |
| | | if (settingsBtn) { |
| | | settingsBtn.addEventListener('click', () => { |
| | | this.showModal('settingsModal'); |
| | | }); |
| | | } |
| | | |
| | | // Background switch button |
| | | const backgroundBtn = document.getElementById('backgroundBtn'); |
| | | if (backgroundBtn) { |
| | | backgroundBtn.addEventListener('click', this.switchBackground); |
| | | } |
| | | |
| | | // Model select change event |
| | | const modelSelect = document.getElementById('live2dModelSelect'); |
| | | if (modelSelect) { |
| | | modelSelect.addEventListener('change', () => { |
| | | this.switchLive2DModel(); |
| | | }); |
| | | } |
| | | |
| | | // Camera switch button |
| | | const cameraSwitch = document.getElementById('cameraSwitch'); |
| | | const cameraSwitchMask = document.getElementById('cameraSwitchMask'); |
| | | if (cameraSwitchMask) { |
| | | cameraSwitchMask.addEventListener('click', () => { |
| | | const isCameraActive = cameraSwitch.classList.contains('active'); |
| | | if (isCameraActive) { |
| | | window.switchCamera(); |
| | | } |
| | | }) |
| | | } |
| | | |
| | | // Dial button |
| | | const dialBtn = document.getElementById('dialBtn'); |
| | | if (dialBtn) { |
| | | dialBtn.addEventListener('click', () => { |
| | | dialBtn.disabled = true; |
| | | this.dialBtnDisabled = true; |
| | | setTimeout(() => { |
| | | dialBtn.disabled = false; |
| | | this.dialBtnDisabled = false; |
| | | }, 3000); |
| | | |
| | | const wsHandler = getWebSocketHandler(); |
| | | const isConnected = wsHandler.isConnected(); |
| | | |
| | | if (isConnected) { |
| | | wsHandler.disconnect(); |
| | | this.updateDialButton(false); |
| | | if (cameraSwitch) cameraSwitch.classList.remove('active'); |
| | | this.addChatMessage('Disconnected, see you next time~ð', false); |
| | | } else { |
| | | // Check if OTA URL is filled |
| | | const otaUrlInput = document.getElementById('otaUrl'); |
| | | if (!otaUrlInput || !otaUrlInput.value.trim()) { |
| | | // If OTA URL is not filled, show settings modal and switch to device tab |
| | | this.showModal('settingsModal'); |
| | | this.switchTab('device'); |
| | | this.addChatMessage('Please fill in OTA server URL', false); |
| | | return; |
| | | } |
| | | |
| | | // Start connection process |
| | | this.handleConnect(); |
| | | } |
| | | }); |
| | | } |
| | | |
| | | // Camera button |
| | | const cameraBtn = document.getElementById('cameraBtn'); |
| | | let cameraTimer = null; |
| | | if (cameraBtn) { |
| | | cameraBtn.addEventListener('click', () => { |
| | | if (cameraTimer) { |
| | | clearTimeout(cameraTimer); |
| | | cameraTimer = null; |
| | | } |
| | | cameraTimer = setTimeout(() => { |
| | | const cameraContainer = document.getElementById('cameraContainer'); |
| | | if (!cameraContainer) { |
| | | log('æå头容å¨ä¸åå¨', 'warning'); |
| | | return; |
| | | } |
| | | |
| | | const isActive = cameraContainer.classList.contains('active'); |
| | | if (isActive) { |
| | | // å
³éæå头 |
| | | if (typeof window.stopCamera === 'function') { |
| | | if (cameraSwitch) cameraSwitch.classList.remove('active'); |
| | | window.stopCamera(); |
| | | } |
| | | cameraContainer.classList.remove('active'); |
| | | cameraBtn.classList.remove('camera-active'); |
| | | cameraBtn.querySelector('.btn-text').textContent = 'æå头'; |
| | | log('æå头已å
³é', 'info'); |
| | | } else { |
| | | // æå¼æå头 |
| | | if (typeof window.startCamera === 'function') { |
| | | window.startCamera().then(success => { |
| | | if (success) { |
| | | cameraBtn.classList.add('camera-active'); |
| | | cameraBtn.querySelector('.btn-text').textContent = 'å
³é'; |
| | | } else { |
| | | this.addChatMessage('â ï¸ æå头å¯å¨å¤±è´¥ï¼è¯·æ£æ¥æµè§å¨æé', false); |
| | | } |
| | | }).catch(error => { |
| | | log(`å¯å¨æå头å¼å¸¸: ${error.message}`, 'error'); |
| | | }); |
| | | } else { |
| | | log('startCamera彿°æªå®ä¹', 'warning'); |
| | | } |
| | | } |
| | | }, 300); |
| | | }); |
| | | } |
| | | |
| | | // Record button |
| | | const recordBtn = document.getElementById('recordBtn'); |
| | | if (recordBtn) { |
| | | let recordTimer = null; |
| | | recordBtn.addEventListener('click', () => { |
| | | if (recordTimer) { |
| | | clearTimeout(recordTimer); |
| | | recordTimer = null; |
| | | } |
| | | recordTimer = setTimeout(() => { |
| | | const audioRecorder = getAudioRecorder(); |
| | | if (audioRecorder.isRecording) { |
| | | audioRecorder.stop(); |
| | | // Restore record button to normal state |
| | | recordBtn.classList.remove('recording'); |
| | | recordBtn.querySelector('.btn-text').textContent = 'å½é³'; |
| | | } else { |
| | | // Update button state to recording |
| | | recordBtn.classList.add('recording'); |
| | | recordBtn.querySelector('.btn-text').textContent = 'å½é³ä¸'; |
| | | |
| | | // Start recording, update button state after delay |
| | | setTimeout(() => { |
| | | audioRecorder.start(); |
| | | }, 100); |
| | | } |
| | | }, 300); |
| | | }); |
| | | } |
| | | |
| | | // Chat input event listener |
| | | const chatIpt = document.getElementById('chatIpt'); |
| | | if (chatIpt) { |
| | | const wsHandler = getWebSocketHandler(); |
| | | chatIpt.addEventListener('keydown', (e) => { |
| | | if (e.key === 'Enter') { |
| | | if (e.target.value) { |
| | | wsHandler.sendTextMessage(e.target.value); |
| | | e.target.value = ''; |
| | | return; |
| | | } |
| | | } |
| | | }); |
| | | } |
| | | |
| | | // Close button |
| | | const closeButtons = document.querySelectorAll('.close-btn'); |
| | | closeButtons.forEach(btn => { |
| | | btn.addEventListener('click', (e) => { |
| | | e.stopPropagation(); |
| | | const modal = e.target.closest('.modal'); |
| | | if (modal) { |
| | | if (modal.id === 'settingsModal') { |
| | | saveConfig(); |
| | | } |
| | | this.hideModal(modal.id); |
| | | } |
| | | }); |
| | | }); |
| | | |
| | | // Settings tab switch |
| | | const tabBtns = document.querySelectorAll('.tab-btn'); |
| | | tabBtns.forEach(btn => { |
| | | btn.addEventListener('click', (e) => { |
| | | this.switchTab(e.target.dataset.tab); |
| | | }); |
| | | }); |
| | | |
| | | const applyWakewordBtn = document.getElementById('applyWakewordBtn'); |
| | | if (applyWakewordBtn) { |
| | | applyWakewordBtn.addEventListener('click', this.handleApplyWakeword); |
| | | } |
| | | |
| | | // ç¹å»æ¨¡ææ¡èæ¯å
³éï¼ä»
对ç¹å®æ¨¡ææ¡ç¦ç¨æ¤åè½ï¼ |
| | | const modals = document.querySelectorAll('.modal'); |
| | | modals.forEach(modal => { |
| | | modal.addEventListener('click', (e) => { |
| | | if (e.target === modal) { |
| | | // settingsModalãmcpToolModalãmcpPropertyModal åªè½éè¿ç¹å»Xå
³é |
| | | const nonClosableModals = ['settingsModal', 'mcpToolModal', 'mcpPropertyModal']; |
| | | if (nonClosableModals.includes(modal.id)) { |
| | | return; // ç¦æ¢ç¹å»èæ¯å
³é |
| | | } |
| | | this.hideModal(modal.id); |
| | | } |
| | | }); |
| | | }); |
| | | |
| | | // Add MCP tool button |
| | | const addMCPToolBtn = document.getElementById('addMCPToolBtn'); |
| | | if (addMCPToolBtn) { |
| | | addMCPToolBtn.addEventListener('click', (e) => { |
| | | e.stopPropagation(); |
| | | this.addMCPTool(); |
| | | }); |
| | | } |
| | | |
| | | // Connect button and send button are not removed, can be added to dial button later |
| | | } |
| | | |
| | | // Update connection status UI |
| | | updateConnectionUI(isConnected) { |
| | | const connectionStatus = document.getElementById('connectionStatus'); |
| | | const statusDot = document.querySelector('.status-dot'); |
| | | |
| | | if (connectionStatus) { |
| | | if (isConnected) { |
| | | connectionStatus.textContent = 'å·²è¿æ¥'; |
| | | if (statusDot) { |
| | | statusDot.className = 'status-dot status-connected'; |
| | | } |
| | | } else { |
| | | connectionStatus.textContent = '离线'; |
| | | if (statusDot) { |
| | | statusDot.className = 'status-dot status-disconnected'; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | // Update dial button state |
| | | updateDialButton(isConnected) { |
| | | const dialBtn = document.getElementById('dialBtn'); |
| | | const recordBtn = document.getElementById('recordBtn'); |
| | | const cameraBtn = document.getElementById('cameraBtn'); |
| | | |
| | | if (dialBtn) { |
| | | if (isConnected) { |
| | | dialBtn.classList.add('dial-active'); |
| | | dialBtn.querySelector('.btn-text').textContent = 'ææ'; |
| | | // Update dial button icon to hang up icon |
| | | dialBtn.querySelector('svg').innerHTML = ` |
| | | <path d="M12,9C10.4,9 9,10.4 9,12C9,13.6 10.4,15 12,15C13.6,15 15,13.6 15,12C15,10.4 13.6,9 12,9M12,17C9.2,17 7,14.8 7,12C7,9.2 9.2,7 12,7C14.8,7 17,9.2 17,12C17,14.8 14.8,17 12,17M12,4.5C7,4.5 2.7,7.6 1,12C2.7,16.4 7,19.5 12,19.5C17,19.5 21.3,16.4 23,12C21.3,7.6 17,4.5 12,4.5Z"/> |
| | | `; |
| | | } else { |
| | | dialBtn.classList.remove('dial-active'); |
| | | dialBtn.querySelector('.btn-text').textContent = 'æ¨å·'; |
| | | // Restore dial button icon |
| | | dialBtn.querySelector('svg').innerHTML = ` |
| | | <path d="M6.62,10.79C8.06,13.62 10.38,15.94 13.21,17.38L15.41,15.18C15.69,14.9 16.08,14.82 16.43,14.93C17.55,15.3 18.75,15.5 20,15.5A1,1 0 0,1 21,16.5V20A1,1 0 0,1 20,21A17,17 0 0,1 3,4A1,1 0 0,1 4,3H7.5A1,1 0 0,1 8.5,4C8.5,5.25 8.7,6.45 9.07,7.57C9.18,7.92 9.1,8.31 8.82,8.59L6.62,10.79Z"/> |
| | | `; |
| | | } |
| | | } |
| | | |
| | | // Update camera button state - reset to default when disconnected |
| | | if (cameraBtn && !isConnected) { |
| | | const cameraContainer = document.getElementById('cameraContainer'); |
| | | if (cameraContainer && cameraContainer.classList.contains('active')) { |
| | | cameraContainer.classList.remove('active'); |
| | | } |
| | | cameraBtn.classList.remove('camera-active'); |
| | | cameraBtn.querySelector('.btn-text').textContent = 'æå头'; |
| | | cameraBtn.disabled = true; |
| | | cameraBtn.title = '请å
è¿æ¥æå¡å¨'; |
| | | // å
³éæå头 |
| | | if (typeof window.stopCamera === 'function') { |
| | | window.stopCamera(); |
| | | } |
| | | } |
| | | |
| | | // Update camera button state - enable when connected and camera is available |
| | | if (cameraBtn && isConnected) { |
| | | if (window.cameraAvailable) { |
| | | cameraBtn.disabled = false; |
| | | cameraBtn.title = 'æå¼/å
³éæå头'; |
| | | } else { |
| | | cameraBtn.disabled = true; |
| | | cameraBtn.title = '请å
ç»å®éªè¯ç '; |
| | | } |
| | | } |
| | | |
| | | // Update record button state |
| | | if (recordBtn) { |
| | | const microphoneAvailable = window.microphoneAvailable !== false; |
| | | if (isConnected && microphoneAvailable) { |
| | | recordBtn.disabled = false; |
| | | recordBtn.title = 'å¼å§å½é³'; |
| | | // Restore record button to normal state |
| | | recordBtn.querySelector('.btn-text').textContent = 'å½é³'; |
| | | recordBtn.classList.remove('recording'); |
| | | } else { |
| | | recordBtn.disabled = true; |
| | | if (!microphoneAvailable) { |
| | | recordBtn.title = window.isHttpNonLocalhost ? 'å½åç±äºæ¯http访é®ï¼æ æ³å½é³ï¼åªè½ç¨æå交äº' : '麦å
é£ä¸å¯ç¨'; |
| | | } else { |
| | | recordBtn.title = '请å
è¿æ¥æå¡å¨'; |
| | | } |
| | | // Restore record button to normal state |
| | | recordBtn.querySelector('.btn-text').textContent = 'å½é³'; |
| | | recordBtn.classList.remove('recording'); |
| | | } |
| | | } |
| | | } |
| | | |
| | | // Update record button state |
| | | updateRecordButtonState(isRecording, seconds = 0) { |
| | | const recordBtn = document.getElementById('recordBtn'); |
| | | if (recordBtn) { |
| | | if (isRecording) { |
| | | recordBtn.querySelector('.btn-text').textContent = `å½é³ä¸`; |
| | | recordBtn.classList.add('recording'); |
| | | } else { |
| | | recordBtn.querySelector('.btn-text').textContent = 'å½é³'; |
| | | recordBtn.classList.remove('recording'); |
| | | } |
| | | // Only enable button when microphone is available |
| | | recordBtn.disabled = window.microphoneAvailable === false; |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * Update microphone availability state |
| | | * @param {boolean} isAvailable - Whether microphone is available |
| | | * @param {boolean} isHttpNonLocalhost - Whether it is HTTP non-localhost access |
| | | */ |
| | | updateMicrophoneAvailability(isAvailable, isHttpNonLocalhost) { |
| | | const recordBtn = document.getElementById('recordBtn'); |
| | | if (!recordBtn) return; |
| | | if (!isAvailable) { |
| | | // Disable record button |
| | | recordBtn.disabled = true; |
| | | // Update button text and title |
| | | recordBtn.querySelector('.btn-text').textContent = 'å½é³'; |
| | | recordBtn.title = isHttpNonLocalhost ? 'å½åç±äºæ¯http访é®ï¼æ æ³å½é³ï¼åªè½ç¨æå交äº' : '麦å
é£ä¸å¯ç¨'; |
| | | |
| | | } else { |
| | | // If connected, enable record button |
| | | const wsHandler = getWebSocketHandler(); |
| | | if (wsHandler && wsHandler.isConnected()) { |
| | | recordBtn.disabled = false; |
| | | recordBtn.title = 'å¼å§å½é³'; |
| | | } |
| | | } |
| | | } |
| | | |
| | | // Add chat message |
| | | addChatMessage(content, isUser = false) { |
| | | const chatStream = document.getElementById('chatStream'); |
| | | if (!chatStream) return; |
| | | |
| | | const messageDiv = document.createElement('div'); |
| | | messageDiv.className = `chat-message ${isUser ? 'user' : 'ai'}`; |
| | | messageDiv.innerHTML = `<div class="message-bubble">${content}</div>`; |
| | | chatStream.appendChild(messageDiv); |
| | | |
| | | // Scroll to bottom |
| | | chatStream.scrollTop = chatStream.scrollHeight; |
| | | } |
| | | |
| | | // Switch background |
| | | switchBackground() { |
| | | this.currentBackgroundIndex = (this.currentBackgroundIndex + 1) % this.backgroundImages.length; |
| | | const backgroundContainer = document.querySelector('.background-container'); |
| | | if (backgroundContainer) { |
| | | backgroundContainer.style.backgroundImage = `url('./images/${this.backgroundImages[this.currentBackgroundIndex]}')`; |
| | | } |
| | | localStorage.setItem('backgroundIndex', this.currentBackgroundIndex); |
| | | } |
| | | |
| | | // Switch Live2D model |
| | | switchLive2DModel() { |
| | | const modelSelect = document.getElementById('live2dModelSelect'); |
| | | if (!modelSelect) { |
| | | console.error('模å鿩䏿æ¡ä¸åå¨'); |
| | | return; |
| | | } |
| | | |
| | | const selectedModel = modelSelect.value; |
| | | const app = window.chatApp; |
| | | |
| | | if (app && app.live2dManager) { |
| | | app.live2dManager.switchModel(selectedModel) |
| | | .then(success => { |
| | | if (success) { |
| | | this.addChatMessage(`已忢尿¨¡å: ${selectedModel}`, false); |
| | | } else { |
| | | this.addChatMessage('模ååæ¢å¤±è´¥', false); |
| | | } |
| | | }) |
| | | .catch(error => { |
| | | console.error('模å忢é误:', error); |
| | | this.addChatMessage('模å忢åºé', false); |
| | | }); |
| | | } else { |
| | | this.addChatMessage('Live2D管ç卿ªåå§å', false); |
| | | } |
| | | } |
| | | |
| | | // Show modal |
| | | showModal(modalId) { |
| | | const modal = document.getElementById(modalId); |
| | | if (modal) { |
| | | modal.style.display = 'flex'; |
| | | } |
| | | } |
| | | |
| | | // Hide modal |
| | | hideModal(modalId) { |
| | | const modal = document.getElementById(modalId); |
| | | if (modal) { |
| | | modal.style.display = 'none'; |
| | | } |
| | | } |
| | | |
| | | // Switch tab |
| | | switchTab(tabName) { |
| | | // Remove active class from all tabs |
| | | const tabBtns = document.querySelectorAll('.tab-btn'); |
| | | const tabContents = document.querySelectorAll('.tab-content'); |
| | | |
| | | tabBtns.forEach(btn => btn.classList.remove('active')); |
| | | tabContents.forEach(content => content.classList.remove('active')); |
| | | |
| | | // Activate selected tab |
| | | const activeTabBtn = document.querySelector(`[data-tab="${tabName}"]`); |
| | | const activeTabContent = document.getElementById(`${tabName}Tab`); |
| | | |
| | | if (activeTabBtn && activeTabContent) { |
| | | activeTabBtn.classList.add('active'); |
| | | activeTabContent.classList.add('active'); |
| | | } |
| | | } |
| | | |
| | | applyWakewordConfig(config = {}) { |
| | | const wakewordEnabledInput = document.getElementById('wakewordEnabled'); |
| | | const wakewordListInput = document.getElementById('wakewordList'); |
| | | |
| | | if (!wakewordEnabledInput || !wakewordListInput) { |
| | | return; |
| | | } |
| | | |
| | | const wakeWords = Array.isArray(config.wakeWords) |
| | | ? config.wakeWords.filter(item => typeof item === 'string' && item.trim()) |
| | | : []; |
| | | |
| | | wakewordEnabledInput.value = config.enabled === false ? 'false' : 'true'; |
| | | wakewordListInput.value = wakeWords.join('\n'); |
| | | saveConfig(); |
| | | } |
| | | |
| | | async handleApplyWakeword() { |
| | | const wakewordEnabledInput = document.getElementById('wakewordEnabled'); |
| | | const wakewordListInput = document.getElementById('wakewordList'); |
| | | const wakewordWsUrlInput = document.getElementById('wakewordWsUrl'); |
| | | if (!wakewordEnabledInput || !wakewordListInput) { |
| | | return; |
| | | } |
| | | |
| | | const wakeWords = wakewordListInput.value |
| | | .split(/\r?\n/u) |
| | | .map(item => item.trim()) |
| | | .filter(Boolean) |
| | | .filter((item, index, items) => items.indexOf(item) === index); |
| | | |
| | | const payload = { |
| | | enabled: wakewordEnabledInput.value !== 'false', |
| | | wakeWords, |
| | | }; |
| | | |
| | | if (payload.enabled && payload.wakeWords.length === 0) { |
| | | this.addChatMessage('å¯ç¨å¤éè¯æ¶ï¼è³å°éè¦å¡«åä¸ä¸ªå¤éè¯ã', false); |
| | | return; |
| | | } |
| | | |
| | | const applyWakewordBtn = document.getElementById('applyWakewordBtn'); |
| | | if (applyWakewordBtn) { |
| | | applyWakewordBtn.disabled = true; |
| | | applyWakewordBtn.textContent = 'åºç¨ä¸...'; |
| | | } |
| | | |
| | | try { |
| | | // ä¿åå°åå° localStorage |
| | | if (wakewordWsUrlInput && wakewordWsUrlInput.value.trim()) { |
| | | localStorage.setItem('xz_tester_wakewordWsUrl', wakewordWsUrlInput.value.trim()); |
| | | } |
| | | |
| | | // æ¯è¾æ°å°ååå½åè¿æ¥å°å |
| | | const newWsUrl = localStorage.getItem('xz_tester_wakewordWsUrl'); |
| | | const currentWsUrl = getWakewordBridgeUrl(); |
| | | const urlChanged = newWsUrl !== currentWsUrl; |
| | | |
| | | if (urlChanged) { |
| | | // å°ååäºï¼å
确认 |
| | | const shouldRestart = window.confirm('å°åå·²åæ´ï¼æ¯å¦ç»§ç»ï¼ï¼å°æå¼æ§è¿æ¥å¹¶éæ°è¿æ¥ï¼'); |
| | | if (!shouldRestart) { |
| | | // æ¢å¤ localStorage éçæ§å°å |
| | | localStorage.setItem('xz_tester_wakewordWsUrl', currentWsUrl); |
| | | this.addChatMessage('已忶å°ååæ´ã', false); |
| | | return; |
| | | } |
| | | |
| | | // æå¼æ§è¿æ¥ |
| | | stopWakewordBridgeListener(); |
| | | |
| | | // å¯å¨æ°è¿æ¥ï¼èªå¨ç¨æ°å°åï¼ |
| | | startWakewordBridgeListener(); |
| | | |
| | | // ç bridge_connected |
| | | await new Promise((resolve, reject) => { |
| | | const timeout = setTimeout(() => { |
| | | reject(new Error('è¿æ¥æ°æå¡å¨è¶
æ¶')); |
| | | }, 5000); |
| | | |
| | | onNextBridgeConnected(() => { |
| | | clearTimeout(timeout); |
| | | resolve(); |
| | | }); |
| | | }); |
| | | |
| | | // åé
ç½®åéå¯ |
| | | await requestWakewordBridge('set_wakeword_config', payload); |
| | | this.applyWakewordConfig(payload); |
| | | await requestWakewordBridge('restart_wakeword_service'); |
| | | this.addChatMessage('å¤éè¯é
置已ä¿åï¼å¤éè¯æå¡æ£å¨éå¯ã', false); |
| | | } else { |
| | | // å°å没åï¼ç´æ¥å¨å½åè¿æ¥æä½ |
| | | const response = await requestWakewordBridge('set_wakeword_config', payload); |
| | | this.applyWakewordConfig(response.payload || payload); |
| | | |
| | | const shouldRestart = window.confirm('å¤éè¯å·²ä¿åãæ¯å¦ç°å¨éå¯å¤éè¯æå¡ä»¥ç«å³çæï¼'); |
| | | if (!shouldRestart) { |
| | | this.addChatMessage('å¤éè¯é
置已ä¿åï¼å¯ç¨åæå¨é坿å¡åçæã', false); |
| | | return; |
| | | } |
| | | |
| | | await requestWakewordBridge('restart_wakeword_service'); |
| | | this.addChatMessage('å¤éè¯é
置已ä¿åï¼å¤éè¯æå¡æ£å¨éå¯ã', false); |
| | | } |
| | | } catch (error) { |
| | | this.addChatMessage(`åºç¨å¤éè¯å¤±è´¥: ${error.message}`, false); |
| | | } finally { |
| | | if (applyWakewordBtn) { |
| | | applyWakewordBtn.disabled = false; |
| | | applyWakewordBtn.textContent = 'åºç¨å¤éè¯'; |
| | | } |
| | | } |
| | | } |
| | | |
| | | // Start AI chat session after connection |
| | | startAIChatSession() { |
| | | this.addChatMessage('è¿æ¥æåï¼å¼å§è天å§~ð', false); |
| | | // Check microphone availability and show error messages if needed |
| | | if (!window.microphoneAvailable) { |
| | | if (window.isHttpNonLocalhost) { |
| | | this.addChatMessage('â ï¸ å½åç±äºæ¯http访é®ï¼æ æ³å½é³ï¼åªè½ç¨æå交äº', false); |
| | | } else { |
| | | this.addChatMessage('â ï¸ éº¦å
é£ä¸å¯ç¨ï¼è¯·æ£æ¥æé设置ï¼åªè½ç¨æå交äº', false); |
| | | } |
| | | } |
| | | // Start recording only if microphone is available |
| | | if (window.microphoneAvailable) { |
| | | const recordBtn = document.getElementById('recordBtn'); |
| | | if (recordBtn) { |
| | | recordBtn.click(); |
| | | } |
| | | } |
| | | // Start camera only if camera is available (bound with verification code) |
| | | if (window.cameraAvailable && typeof window.startCamera === 'function') { |
| | | window.startCamera().then(success => { |
| | | if (success) { |
| | | const cameraBtn = document.getElementById('cameraBtn'); |
| | | if (cameraBtn) { |
| | | cameraBtn.classList.add('camera-active'); |
| | | cameraBtn.querySelector('.btn-text').textContent = 'å
³é'; |
| | | } |
| | | } else { |
| | | this.addChatMessage('â ï¸ æå头å¯å¨å¤±è´¥ï¼å¯è½è¢«æµè§å¨æç»', false); |
| | | } |
| | | }).catch(error => { |
| | | log(`å¯å¨æå头å¼å¸¸: ${error.message}`, 'error'); |
| | | }); |
| | | } |
| | | } |
| | | |
| | | // Handle connect button click |
| | | async handleConnect() { |
| | | const wsHandler = getWebSocketHandler(); |
| | | if (this.isConnecting || (wsHandler && wsHandler.isConnected())) { |
| | | log('è¿æ¥å·²å卿æ£å¨è¿è¡ï¼å¿½ç¥æ¬æ¬¡æ¨å·è¯·æ±', 'info'); |
| | | return; |
| | | } |
| | | |
| | | this.isConnecting = true; |
| | | console.log('handleConnect called'); |
| | | |
| | | try { |
| | | // Switch to device settings tab |
| | | this.switchTab('device'); |
| | | |
| | | // Wait for DOM update |
| | | await new Promise(resolve => setTimeout(resolve, 50)); |
| | | |
| | | const otaUrlInput = document.getElementById('otaUrl'); |
| | | |
| | | console.log('otaUrl element:', otaUrlInput); |
| | | |
| | | if (!otaUrlInput || !otaUrlInput.value) { |
| | | this.addChatMessage('请è¾å
¥OTAæå¡å¨å°å', false); |
| | | return; |
| | | } |
| | | |
| | | const otaUrl = otaUrlInput.value; |
| | | console.log('otaUrl value:', otaUrl); |
| | | |
| | | // Update dial button state to connecting |
| | | const dialBtn = document.getElementById('dialBtn'); |
| | | if (dialBtn) { |
| | | dialBtn.classList.add('dial-active'); |
| | | dialBtn.querySelector('.btn-text').textContent = 'è¿æ¥ä¸...'; |
| | | dialBtn.disabled = true; |
| | | } |
| | | |
| | | // Show connecting message |
| | | this.addChatMessage('æ£å¨è¿æ¥æå¡å¨...', false); |
| | | |
| | | const chatIpt = document.getElementById('chatIpt'); |
| | | if (chatIpt) { |
| | | chatIpt.style.display = 'flex'; |
| | | } |
| | | |
| | | // Get WebSocket handler instance |
| | | // Register connection state callback BEFORE connecting |
| | | wsHandler.onConnectionStateChange = (isConnected) => { |
| | | this.updateConnectionUI(isConnected); |
| | | this.updateDialButton(isConnected); |
| | | }; |
| | | |
| | | // Register chat message callback BEFORE connecting |
| | | wsHandler.onChatMessage = (text, isUser) => { |
| | | this.addChatMessage(text, isUser); |
| | | }; |
| | | |
| | | // Register record button state callback BEFORE connecting |
| | | wsHandler.onRecordButtonStateChange = (isRecording) => { |
| | | const recordBtn = document.getElementById('recordBtn'); |
| | | if (recordBtn) { |
| | | if (isRecording) { |
| | | recordBtn.classList.add('recording'); |
| | | recordBtn.querySelector('.btn-text').textContent = 'å½é³ä¸'; |
| | | } else { |
| | | recordBtn.classList.remove('recording'); |
| | | recordBtn.querySelector('.btn-text').textContent = 'å½é³'; |
| | | } |
| | | } |
| | | }; |
| | | |
| | | const isConnected = await wsHandler.connect(); |
| | | |
| | | if (isConnected) { |
| | | // Check microphone availability (check again after connection) |
| | | const { checkMicrophoneAvailability } = await import('../core/audio/recorder.js?v=0205'); |
| | | const micAvailable = await checkMicrophoneAvailability(); |
| | | |
| | | if (!micAvailable) { |
| | | const isHttp = window.isHttpNonLocalhost; |
| | | if (isHttp) { |
| | | this.addChatMessage('â ï¸ å½åç±äºæ¯http访é®ï¼æ æ³å½é³ï¼åªè½ç¨æå交äº', false); |
| | | } |
| | | // Update global state |
| | | window.microphoneAvailable = false; |
| | | } |
| | | |
| | | // Update dial button state |
| | | const dialBtn = document.getElementById('dialBtn'); |
| | | if (dialBtn) { |
| | | if (!this.dialBtnDisabled) { |
| | | dialBtn.disabled = false; |
| | | } |
| | | dialBtn.querySelector('.btn-text').textContent = 'ææ'; |
| | | dialBtn.classList.add('dial-active'); |
| | | } |
| | | |
| | | this.hideModal('settingsModal'); |
| | | } else { |
| | | throw new Error('OTAè¿æ¥å¤±è´¥'); |
| | | } |
| | | } catch (error) { |
| | | console.error('Connection error details:', { |
| | | message: error.message, |
| | | stack: error.stack, |
| | | name: error.name |
| | | }); |
| | | |
| | | // Show error message |
| | | const errorMessage = error.message.includes('Cannot set properties of null') |
| | | ? 'è¿æ¥å¤±è´¥ï¼è¯·æ£æ¥è®¾å¤è¿æ¥' |
| | | : `è¿æ¥å¤±è´¥: ${error.message}`; |
| | | |
| | | this.addChatMessage(errorMessage, false); |
| | | |
| | | // Restore dial button state |
| | | const dialBtn = document.getElementById('dialBtn'); |
| | | if (dialBtn) { |
| | | if (!this.dialBtnDisabled) { |
| | | dialBtn.disabled = false; |
| | | } |
| | | dialBtn.querySelector('.btn-text').textContent = 'æ¨å·'; |
| | | dialBtn.classList.remove('dial-active'); |
| | | console.log('Dial button state restored successfully'); |
| | | } |
| | | } finally { |
| | | this.isConnecting = false; |
| | | } |
| | | } |
| | | |
| | | async triggerWakewordDial(wakeWord = 'å¤éè¯') { |
| | | const wsHandler = getWebSocketHandler(); |
| | | const now = Date.now(); |
| | | |
| | | if (wsHandler && wsHandler.isConnected()) { |
| | | log('页é¢å·²è¿æ¥ï¼å¿½ç¥èªå¨æ¨å·', 'info'); |
| | | return false; |
| | | } |
| | | |
| | | if (this.isConnecting || this.dialBtnDisabled) { |
| | | log('页颿£å¨è¿æ¥ä¸ï¼å¿½ç¥éå¤å¤é', 'info'); |
| | | return false; |
| | | } |
| | | |
| | | if (now - this.lastWakewordDialTime < 3000) { |
| | | log('å¤é触åè¿äºé¢ç¹ï¼å¿½ç¥æ¬æ¬¡èªå¨æ¨å·', 'warning'); |
| | | return false; |
| | | } |
| | | |
| | | this.lastWakewordDialTime = now; |
| | | this.addChatMessage(`æ£æµå°å¤éè¯â${wakeWord}âï¼åå¤è¿æ¥æå¡å¨...`, false); |
| | | await this.handleConnect(); |
| | | return true; |
| | | } |
| | | |
| | | // Add MCP tool |
| | | addMCPTool() { |
| | | const mcpToolsList = document.getElementById('mcpToolsList'); |
| | | if (!mcpToolsList) return; |
| | | |
| | | const toolId = `mcp-tool-${Date.now()}`; |
| | | const toolDiv = document.createElement('div'); |
| | | toolDiv.className = 'properties-container'; |
| | | toolDiv.innerHTML = ` |
| | | <div class="property-item"> |
| | | <input type="text" placeholder="å·¥å
·åç§°" value="æ°å·¥å
·"> |
| | | <input type="text" placeholder="å·¥å
·æè¿°" value="å·¥å
·æè¿°"> |
| | | <button class="remove-property" onclick="uiController.removeMCPTool('${toolId}')">å é¤</button> |
| | | </div> |
| | | `; |
| | | |
| | | mcpToolsList.appendChild(toolDiv); |
| | | } |
| | | |
| | | // Remove MCP tool |
| | | removeMCPTool(toolId) { |
| | | const toolElement = document.getElementById(toolId); |
| | | if (toolElement) { |
| | | toolElement.remove(); |
| | | } |
| | | } |
| | | |
| | | // Update audio statistics display |
| | | updateAudioStats() { |
| | | const audioPlayer = getAudioPlayer(); |
| | | if (!audioPlayer) return; |
| | | |
| | | const stats = audioPlayer.getAudioStats(); |
| | | // Here can add audio statistics UI update logic |
| | | } |
| | | |
| | | // Start audio statistics monitor |
| | | startAudioStatsMonitor() { |
| | | // Update audio statistics every 100ms |
| | | this.audioStatsTimer = setInterval(() => { |
| | | this.updateAudioStats(); |
| | | }, 100); |
| | | } |
| | | |
| | | // Stop audio statistics monitor |
| | | stopAudioStatsMonitor() { |
| | | if (this.audioStatsTimer) { |
| | | clearInterval(this.audioStatsTimer); |
| | | this.audioStatsTimer = null; |
| | | } |
| | | } |
| | | |
| | | // Draw audio visualizer waveform |
| | | drawVisualizer(dataArray) { |
| | | if (!this.visualizerContext || !this.visualizerCanvas) return; |
| | | |
| | | this.visualizerContext.fillStyle = '#fafafa'; |
| | | this.visualizerContext.fillRect(0, 0, this.visualizerCanvas.width, this.visualizerCanvas.height); |
| | | |
| | | const barWidth = (this.visualizerCanvas.width / dataArray.length) * 2.5; |
| | | let barHeight; |
| | | let x = 0; |
| | | |
| | | for (let i = 0; i < dataArray.length; i++) { |
| | | barHeight = dataArray[i] / 2; |
| | | |
| | | // Create gradient color: from purple to blue to green |
| | | const gradient = this.visualizerContext.createLinearGradient(0, 0, 0, this.visualizerCanvas.height); |
| | | gradient.addColorStop(0, '#8e44ad'); |
| | | gradient.addColorStop(0.5, '#3498db'); |
| | | gradient.addColorStop(1, '#1abc9c'); |
| | | |
| | | this.visualizerContext.fillStyle = gradient; |
| | | this.visualizerContext.fillRect(x, this.visualizerCanvas.height - barHeight, barWidth, barHeight); |
| | | x += barWidth + 1; |
| | | } |
| | | } |
| | | |
| | | // Update session status UI |
| | | updateSessionStatus(isSpeaking) { |
| | | // Here can add session status UI update logic |
| | | // For example: update Live2D model's mouth movement status |
| | | } |
| | | |
| | | // Update session emotion |
| | | updateSessionEmotion(emoji) { |
| | | // Here can add emotion update logic |
| | | // For example: display emoji in status indicator |
| | | } |
| | | } |
| | | |
| | | // Create singleton instance |
| | | export const uiController = new UIController(); |
| | | |
| | | // Export class for module usage |
| | | export { UIController }; |
| New file |
| | |
| | | export default class BlockingQueue { |
| | | #items = []; |
| | | #waiters = []; // {resolve, reject, min, timer, onTimeout} |
| | | |
| | | /* 空éå䏿¬¡æ§é¸é¨ */ |
| | | #emptyPromise = null; |
| | | #emptyResolve = null; |
| | | |
| | | /* ç产è
ï¼ææ°æ®å¡è¿å» */ |
| | | enqueue(item, ...restItems) { |
| | | if (restItems.length === 0) { |
| | | this.#items.push(item); |
| | | } |
| | | // 妿æé¢å¤åæ°ï¼æ¹éå¤çææé¡¹ |
| | | else { |
| | | const items = [item, ...restItems].filter(i => i); |
| | | if (items.length === 0) return; |
| | | this.#items.push(...items); |
| | | } |
| | | // è¥æç©ºéåé¸é¨ï¼ä¸æ¬¡æ§æ¾è¡ææçå¾
è
|
| | | if (this.#emptyResolve) { |
| | | this.#emptyResolve(); |
| | | this.#emptyResolve = null; |
| | | this.#emptyPromise = null; |
| | | } |
| | | |
| | | // å¤éæææ£å¨çç waiter |
| | | this.#wakeWaiters(); |
| | | } |
| | | |
| | | /* æ¶è´¹è
ï¼min æ¡æ timeout ms å
å°è° */ |
| | | async dequeue(min = 1, timeout = Infinity, onTimeout = null) { |
| | | // 1. è¥ç©ºï¼çç¬¬ä¸æ¬¡æ°æ®å°è¾¾ï¼ææè°ç¨å
±äº«åä¸ä¸ª promiseï¼ |
| | | if (this.#items.length === 0) { |
| | | await this.#waitForFirstItem(); |
| | | } |
| | | |
| | | // ç«å³æ»¡è¶³ |
| | | if (this.#items.length >= min) { |
| | | return this.#flush(); |
| | | } |
| | | |
| | | // éè¦çå¾
|
| | | return new Promise((resolve, reject) => { |
| | | let timer = null; |
| | | const waiter = { resolve, reject, min, onTimeout, timer }; |
| | | |
| | | // è¶
æ¶é»è¾ |
| | | if (Number.isFinite(timeout)) { |
| | | waiter.timer = setTimeout(() => { |
| | | this.#removeWaiter(waiter); |
| | | if (onTimeout) onTimeout(this.#items.length); |
| | | resolve(this.#flush()); |
| | | }, timeout); |
| | | } |
| | | |
| | | this.#waiters.push(waiter); |
| | | }); |
| | | } |
| | | |
| | | /* 空éåé¸é¨çæå¨ */ |
| | | #waitForFirstItem() { |
| | | if (!this.#emptyPromise) { |
| | | this.#emptyPromise = new Promise(r => (this.#emptyResolve = r)); |
| | | } |
| | | return this.#emptyPromise; |
| | | } |
| | | |
| | | /* å
é¨ï¼æ¯æ¬¡æ°æ®åå¨åï¼æ£æ¥åªäº waiter 已满足 */ |
| | | #wakeWaiters() { |
| | | for (let i = this.#waiters.length - 1; i >= 0; i--) { |
| | | const w = this.#waiters[i]; |
| | | if (this.#items.length >= w.min) { |
| | | this.#removeWaiter(w); |
| | | w.resolve(this.#flush()); |
| | | } |
| | | } |
| | | } |
| | | |
| | | #removeWaiter(waiter) { |
| | | const idx = this.#waiters.indexOf(waiter); |
| | | if (idx !== -1) { |
| | | this.#waiters.splice(idx, 1); |
| | | if (waiter.timer) clearTimeout(waiter.timer); |
| | | } |
| | | } |
| | | |
| | | #flush() { |
| | | const snapshot = [...this.#items]; |
| | | this.#items.length = 0; |
| | | return snapshot; |
| | | } |
| | | |
| | | /* å½åç¼åé¿åº¦ï¼ä¸å«çå¾
è
ï¼ */ |
| | | get length() { |
| | | return this.#items.length; |
| | | } |
| | | |
| | | /* æ¸
空éåï¼ä¿æå¯¹è±¡å¼ç¨ï¼ä¸å½±åçå¾
è
ï¼ */ |
| | | clear() { |
| | | this.#items.length = 0; |
| | | } |
| | | } |
| New file |
| | |
| | | var Module = function(Module) { |
| | | Module = Module || {}; |
| | | |
| | | var b;b||(b=eval("(function() { try { return Module || {} } catch(e) { return {} } })()"));var f={},l;for(l in b)b.hasOwnProperty(l)&&(f[l]=b[l]);var p=!1,q=!1,r=!1,t=!1; |
| | | if(b.ENVIRONMENT)if("WEB"===b.ENVIRONMENT)p=!0;else if("WORKER"===b.ENVIRONMENT)q=!0;else if("NODE"===b.ENVIRONMENT)r=!0;else if("SHELL"===b.ENVIRONMENT)t=!0;else throw Error("The provided Module['ENVIRONMENT'] value is not valid. It must be one of: WEB|WORKER|NODE|SHELL.");else p="object"===typeof window,q="function"===typeof importScripts,r="object"===typeof process&&"function"===typeof require&&!p&&!q,t=!p&&!r&&!q; |
| | | if(r){b.print||(b.print=console.log);b.printErr||(b.printErr=console.warn);var u,v;b.read=function(a,c){u||(u=null);v||(v=require("path"));a=v.normalize(a);var d=u.readFileSync(a);d||a==v.resolve(a)||(a=path.join(__dirname,"..","src",a),d=u.readFileSync(a));d&&!c&&(d=d.toString());return d};b.readBinary=function(a){a=b.read(a,!0);a.buffer||(a=new Uint8Array(a));assert(a.buffer);return a};b.load=function(a){aa(read(a))};b.thisProgram||(b.thisProgram=1<process.argv.length?process.argv[1].replace(/\\/g, |
| | | "/"):"unknown-program");b.arguments=process.argv.slice(2);"undefined"!==typeof module&&(module.exports=b);process.on("uncaughtException",function(a){if(!(a instanceof w))throw a;});b.inspect=function(){return"[Emscripten Module object]"}}else if(t)b.print||(b.print=print),"undefined"!=typeof printErr&&(b.printErr=printErr),b.read="undefined"!=typeof read?read:function(){throw"no read() available (jsc?)";},b.readBinary=function(a){if("function"===typeof readbuffer)return new Uint8Array(readbuffer(a)); |
| | | a=read(a,"binary");assert("object"===typeof a);return a},"undefined"!=typeof scriptArgs?b.arguments=scriptArgs:"undefined"!=typeof arguments&&(b.arguments=arguments),eval("if (typeof gc === 'function' && gc.toString().indexOf('[native code]') > 0) var gc = undefined");else if(p||q)b.read=function(a){var c=new XMLHttpRequest;c.open("GET",a,!1);c.send(null);return c.responseText},b.readAsync=function(a,c,d){var e=new XMLHttpRequest;e.open("GET",a,!0);e.responseType="arraybuffer";e.onload=function(){200== |
| | | e.status||0==e.status&&e.response?c(e.response):d()};e.onerror=d;e.send(null)},"undefined"!=typeof arguments&&(b.arguments=arguments),"undefined"!==typeof console?(b.print||(b.print=function(a){console.log(a)}),b.printErr||(b.printErr=function(a){console.warn(a)})):b.print||(b.print=function(){}),q&&(b.load=importScripts),"undefined"===typeof b.setWindowTitle&&(b.setWindowTitle=function(a){document.title=a});else throw"Unknown runtime environment. Where are we?";function aa(a){eval.call(null,a)} |
| | | !b.load&&b.read&&(b.load=function(a){aa(b.read(a))});b.print||(b.print=function(){});b.printErr||(b.printErr=b.print);b.arguments||(b.arguments=[]);b.thisProgram||(b.thisProgram="./this.program");b.print=b.print;b.m=b.printErr;b.preRun=[];b.postRun=[];for(l in f)f.hasOwnProperty(l)&&(b[l]=f[l]); |
| | | var f=void 0,y={B:function(a){tempRet0=a},w:function(){return tempRet0},g:function(){return x},c:function(a){x=a},q:function(a){switch(a){case "i1":case "i8":return 1;case "i16":return 2;case "i32":return 4;case "i64":return 8;case "float":return 4;case "double":return 8;default:return"*"===a[a.length-1]?y.i:"i"===a[0]?(a=parseInt(a.substr(1)),assert(0===a%8),a/8):0}},v:function(a){return Math.max(y.q(a),y.i)},C:16,Q:function(a,c){"double"===c||"i64"===c?a&7&&(assert(4===(a&7)),a+=4):assert(0===(a& |
| | | 3));return a},K:function(a,c,d){return d||"i64"!=a&&"double"!=a?a?Math.min(c||(a?y.v(a):0),y.i):Math.min(c,8):8},k:function(a,c,d){return d&&d.length?(d.splice||(d=Array.prototype.slice.call(d)),d.splice(0,0,c),b["dynCall_"+a].apply(null,d)):b["dynCall_"+a].call(null,c)},e:[],r:function(a){for(var c=0;c<y.e.length;c++)if(!y.e[c])return y.e[c]=a,2*(1+c);throw"Finished up all reserved function pointers. Use a higher value for RESERVED_FUNCTION_POINTERS.";},A:function(a){y.e[(a-2)/2]=null},d:function(a){y.d.n|| |
| | | (y.d.n={});y.d.n[a]||(y.d.n[a]=1,b.m(a))},l:{},M:function(a,c){assert(c);y.l[c]||(y.l[c]={});var d=y.l[c];d[a]||(d[a]=function(){return y.k(c,a,arguments)});return d[a]},L:function(){throw"You must build with -s RETAIN_COMPILER_SETTINGS=1 for Runtime.getCompilerSetting or emscripten_get_compiler_setting to work";},f:function(a){var c=x;x=x+a|0;x=x+15&-16;return c},o:function(a){var c=z;z=z+a|0;z=z+15&-16;return c},b:function(a){var c=E;E=E+a|0;E=E+15&-16;if(a=E>=F)G("Cannot enlarge memory arrays. Either (1) compile with -s TOTAL_MEMORY=X with X higher than the current value "+ |
| | | F+", (2) compile with -s ALLOW_MEMORY_GROWTH=1 which adjusts the size at runtime but prevents some optimizations, (3) set Module.TOTAL_MEMORY to a higher value before the program runs, or if you want malloc to return NULL (0) instead of this abort, compile with -s ABORTING_MALLOC=0 "),a=!0;return a?(E=c,0):c},p:function(a,c){return Math.ceil(a/(c?c:16))*(c?c:16)},P:function(a,c,d){return d?+(a>>>0)+4294967296*+(c>>>0):+(a>>>0)+4294967296*+(c|0)},h:8,i:4,D:0};b.Runtime=y;y.addFunction=y.r; |
| | | y.removeFunction=y.A;var H=!1;function assert(a,c){a||G("Assertion failed: "+c)}function ba(a){var c=b["_"+a];if(!c)try{c=eval("_"+a)}catch(d){}assert(c,"Cannot call unknown function "+a+" (perhaps LLVM optimizations or closure removed it?)");return c}var ca,da; |
| | | (function(){function a(a){a=a.toString().match(g).slice(1);return{arguments:a[0],body:a[1],returnValue:a[2]}}function c(){if(!k){k={};for(var c in d)d.hasOwnProperty(c)&&(k[c]=a(d[c]))}}var d={stackSave:function(){y.g()},stackRestore:function(){y.c()},arrayToC:function(a){var c=y.f(a.length);ea(a,c);return c},stringToC:function(a){var c=0;null!==a&&void 0!==a&&0!==a&&(c=y.f((a.length<<2)+1),fa(a,c));return c}},e={string:d.stringToC,array:d.arrayToC};da=function(a,c,d,g,k){a=ba(a);var C=[],D=0;if(g)for(var n= |
| | | 0;n<g.length;n++){var P=e[d[n]];P?(0===D&&(D=y.g()),C[n]=P(g[n])):C[n]=g[n]}d=a.apply(null,C);"string"===c&&(d=I(d));if(0!==D){if(k&&k.async){EmterpreterAsync.F.push(function(){y.c(D)});return}y.c(D)}return d};var g=/^function\s*[a-zA-Z$_0-9]*\s*\(([^)]*)\)\s*{\s*([^*]*?)[\s;]*(?:return\s*(.*?)[;\s]*)?}$/,k=null;ca=function(d,e,g){g=g||[];var B=ba(d);d=g.every(function(a){return"number"===a});var oa="string"!==e;if(oa&&d)return B;var C=g.map(function(a,c){return"$"+c});e="(function("+C.join(",")+ |
| | | ") {";var D=g.length;if(!d){c();e+="var stack = "+k.stackSave.body+";";for(var n=0;n<D;n++){var P=C[n],K=g[n];"number"!==K&&(K=k[K+"ToC"],e+="var "+K.arguments+" = "+P+";",e+=K.body+";",e+=P+"=("+K.returnValue+");")}}g=a(function(){return B}).returnValue;e+="var ret = "+g+"("+C.join(",")+");";oa||(g=a(function(){return I}).returnValue,e+="ret = "+g+"(ret);");d||(c(),e+=k.stackRestore.body.replace("()","(stack)")+";");return eval(e+"return ret})")}})();b.ccall=da;b.cwrap=ca; |
| | | function ga(a,c,d){d=d||"i8";"*"===d.charAt(d.length-1)&&(d="i32");switch(d){case "i1":J[a>>0]=c;break;case "i8":J[a>>0]=c;break;case "i16":L[a>>1]=c;break;case "i32":M[a>>2]=c;break;case "i64":tempI64=[c>>>0,(tempDouble=c,1<=+ha(tempDouble)?0<tempDouble?(ia(+ja(tempDouble/4294967296),4294967295)|0)>>>0:~~+ka((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)];M[a>>2]=tempI64[0];M[a+4>>2]=tempI64[1];break;case "float":N[a>>2]=c;break;case "double":la[a>>3]=c;break;default:G("invalid type for setValue: "+ |
| | | d)}}b.setValue=ga;function ma(a,c){c=c||"i8";"*"===c.charAt(c.length-1)&&(c="i32");switch(c){case "i1":return J[a>>0];case "i8":return J[a>>0];case "i16":return L[a>>1];case "i32":return M[a>>2];case "i64":return M[a>>2];case "float":return N[a>>2];case "double":return la[a>>3];default:G("invalid type for setValue: "+c)}return null}b.getValue=ma;b.ALLOC_NORMAL=0;b.ALLOC_STACK=1;b.ALLOC_STATIC=2;b.ALLOC_DYNAMIC=3;b.ALLOC_NONE=4; |
| | | function O(a,c,d,e){var g,k;"number"===typeof a?(g=!0,k=a):(g=!1,k=a.length);var h="string"===typeof c?c:null;d=4==d?e:["function"===typeof Q?Q:y.o,y.f,y.o,y.b][void 0===d?2:d](Math.max(k,h?1:c.length));if(g){e=d;assert(0==(d&3));for(a=d+(k&-4);e<a;e+=4)M[e>>2]=0;for(a=d+k;e<a;)J[e++>>0]=0;return d}if("i8"===h)return a.subarray||a.slice?R.set(a,d):R.set(new Uint8Array(a),d),d;e=0;for(var A,m;e<k;){var B=a[e];"function"===typeof B&&(B=y.N(B));g=h||c[e];0===g?e++:("i64"==g&&(g="i32"),ga(d+e,B,g),m!== |
| | | g&&(A=y.q(g),m=g),e+=A)}return d}b.allocate=O;b.getMemory=function(a){return na?"undefined"!==typeof S&&!S.a||!T?y.b(a):Q(a):y.o(a)};function I(a,c){if(0===c||!a)return"";for(var d=0,e,g=0;;){e=R[a+g>>0];d|=e;if(0==e&&!c)break;g++;if(c&&g==c)break}c||(c=g);e="";if(128>d){for(;0<c;)d=String.fromCharCode.apply(String,R.subarray(a,a+Math.min(c,1024))),e=e?e+d:d,a+=1024,c-=1024;return e}return b.UTF8ToString(a)}b.Pointer_stringify=I; |
| | | b.AsciiToString=function(a){for(var c="";;){var d=J[a++>>0];if(!d)return c;c+=String.fromCharCode(d)}};b.stringToAscii=function(a,c){return pa(a,c,!1)}; |
| | | function qa(a,c){for(var d,e,g,k,h,A,m="";;){d=a[c++];if(!d)return m;d&128?(e=a[c++]&63,192==(d&224)?m+=String.fromCharCode((d&31)<<6|e):(g=a[c++]&63,224==(d&240)?d=(d&15)<<12|e<<6|g:(k=a[c++]&63,240==(d&248)?d=(d&7)<<18|e<<12|g<<6|k:(h=a[c++]&63,248==(d&252)?d=(d&3)<<24|e<<18|g<<12|k<<6|h:(A=a[c++]&63,d=(d&1)<<30|e<<24|g<<18|k<<12|h<<6|A))),65536>d?m+=String.fromCharCode(d):(d-=65536,m+=String.fromCharCode(55296|d>>10,56320|d&1023)))):m+=String.fromCharCode(d)}}b.UTF8ArrayToString=qa; |
| | | b.UTF8ToString=function(a){return qa(R,a)}; |
| | | function ra(a,c,d,e){if(!(0<e))return 0;var g=d;e=d+e-1;for(var k=0;k<a.length;++k){var h=a.charCodeAt(k);55296<=h&&57343>=h&&(h=65536+((h&1023)<<10)|a.charCodeAt(++k)&1023);if(127>=h){if(d>=e)break;c[d++]=h}else{if(2047>=h){if(d+1>=e)break;c[d++]=192|h>>6}else{if(65535>=h){if(d+2>=e)break;c[d++]=224|h>>12}else{if(2097151>=h){if(d+3>=e)break;c[d++]=240|h>>18}else{if(67108863>=h){if(d+4>=e)break;c[d++]=248|h>>24}else{if(d+5>=e)break;c[d++]=252|h>>30;c[d++]=128|h>>24&63}c[d++]=128|h>>18&63}c[d++]=128| |
| | | h>>12&63}c[d++]=128|h>>6&63}c[d++]=128|h&63}}c[d]=0;return d-g}b.stringToUTF8Array=ra;b.stringToUTF8=function(a,c,d){return ra(a,R,c,d)};function sa(a){for(var c=0,d=0;d<a.length;++d){var e=a.charCodeAt(d);55296<=e&&57343>=e&&(e=65536+((e&1023)<<10)|a.charCodeAt(++d)&1023);127>=e?++c:c=2047>=e?c+2:65535>=e?c+3:2097151>=e?c+4:67108863>=e?c+5:c+6}return c}b.lengthBytesUTF8=sa; |
| | | function ta(){return ua().replace(/__Z[\w\d_]+/g,function(a){var c;a:{if(b.___cxa_demangle)try{var d=Q(a.length);fa(a.substr(1),d);var e=Q(4),g=b.___cxa_demangle(d,0,0,e);if(0===ma(e,"i32")&&g){c=I(g);break a}}catch(k){c=a;break a}finally{d&&va(d),e&&va(e),g&&va(g)}y.d("warning: build with -s DEMANGLE_SUPPORT=1 to link in libcxxabi demangling");c=a}return a===c?a:a+" ["+c+"]"})} |
| | | function ua(){var a=Error();if(!a.stack){try{throw Error(0);}catch(c){a=c}if(!a.stack)return"(no stack trace available)"}return a.stack.toString()}b.stackTrace=function(){return ta()};function wa(){var a=E;0<a%4096&&(a+=4096-a%4096);return a}for(var buffer,J,R,L,xa,M,ya,N,la,za=0,z=0,na=!1,Aa=0,x=0,Ba=0,E=0,Ca=b.TOTAL_STACK||5242880,F=b.TOTAL_MEMORY||16777216,U=65536;U<F||U<2*Ca;)U=16777216>U?2*U:U+16777216;U!==F&&(F=U);b.buffer?buffer=b.buffer:buffer=new ArrayBuffer(F);b.HEAP8=J=new Int8Array(buffer); |
| | | b.HEAP16=L=new Int16Array(buffer);b.HEAP32=M=new Int32Array(buffer);b.HEAPU8=R=new Uint8Array(buffer);b.HEAPU16=xa=new Uint16Array(buffer);b.HEAPU32=ya=new Uint32Array(buffer);b.HEAPF32=N=new Float32Array(buffer);b.HEAPF64=la=new Float64Array(buffer);M[0]=255;if(255!==R[0]||0!==R[3])throw"Typed arrays 2 must be run on a little-endian system";b.HEAP=void 0;b.buffer=buffer;b.HEAP8=J;b.HEAP16=L;b.HEAP32=M;b.HEAPU8=R;b.HEAPU16=xa;b.HEAPU32=ya;b.HEAPF32=N;b.HEAPF64=la; |
| | | function V(a){for(;0<a.length;){var c=a.shift();if("function"==typeof c)c();else{var d=c.J;"number"===typeof d?void 0===c.j?y.k("v",d):y.k("vi",d,[c.j]):d(void 0===c.j?null:c.j)}}}var Da=[],Ea=[],Fa=[],Ga=[],Ha=[],T=!1;function Ia(a){Da.unshift(a)}b.addOnPreRun=Ia;b.addOnInit=function(a){Ea.unshift(a)};b.addOnPreMain=function(a){Fa.unshift(a)};b.addOnExit=function(a){Ga.unshift(a)};function Ja(a){Ha.unshift(a)}b.addOnPostRun=Ja; |
| | | function Ka(a,c,d){d=Array(0<d?d:sa(a)+1);a=ra(a,d,0,d.length);c&&(d.length=a);return d}b.intArrayFromString=Ka;b.intArrayToString=function(a){for(var c=[],d=0;d<a.length;d++){var e=a[d];255<e&&(e&=255);c.push(String.fromCharCode(e))}return c.join("")};function fa(a,c,d){a=Ka(a,d);for(d=0;d<a.length;)J[c+d>>0]=a[d],d+=1}b.writeStringToMemory=fa;function ea(a,c){for(var d=0;d<a.length;d++)J[c++>>0]=a[d]}b.writeArrayToMemory=ea; |
| | | function pa(a,c,d){for(var e=0;e<a.length;++e)J[c++>>0]=a.charCodeAt(e);d||(J[c>>0]=0)}b.writeAsciiToMemory=pa;Math.imul&&-5===Math.imul(4294967295,5)||(Math.imul=function(a,c){var d=a&65535,e=c&65535;return d*e+((a>>>16)*e+d*(c>>>16)<<16)|0});Math.O=Math.imul;Math.clz32||(Math.clz32=function(a){a=a>>>0;for(var c=0;32>c;c++)if(a&1<<31-c)return c;return 32});Math.H=Math.clz32;var ha=Math.abs,ka=Math.ceil,ja=Math.floor,La=Math.pow,ia=Math.min,W=0,Ma=null,X=null; |
| | | b.addRunDependency=function(){W++;b.monitorRunDependencies&&b.monitorRunDependencies(W)};b.removeRunDependency=function(){W--;b.monitorRunDependencies&&b.monitorRunDependencies(W);if(0==W&&(null!==Ma&&(clearInterval(Ma),Ma=null),X)){var a=X;X=null;a()}};b.preloadedImages={};b.preloadedAudios={};za=8;z=za+31072;Ea.push(); |
| | | O([1,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,2,0,0,0,1,0,0,0,7,0,0,0,0,0,0,0,4,0,0,0,3,0,0,0,6,0,0,0,1,0,0,0,5,0,0,0,2,0,0,0,15,0,0,0,0,0,0,0,8,0,0,0,7,0,0,0,12,0,0,0,3,0,0,0,11,0,0,0,4,0,0,0,14,0,0,0,1,0,0,0,9,0,0,0,6,0,0,0,13,0,0,0,2,0,0,0,10,0,0,0,5,0,0,0,0,0,157,62,0,64,94,62,0,192,4,62,0,128,237,62,0,64,137,62,0,0,0,0,0,192,76,63,0,0,205,61,0,0,0,0,190,98,0,0,198,98,0,0,215,98,0,0,232,98,0,0,247,98,0,0,8,99,0,0,32,99,0,0,46,99,0,0,0,0,128,63,0,0,0,64,0,0,64,64,0,0,128,64,0,0,160,64,0,0,192,64,0,0,224, |
| | | 64,0,0,0,65,0,0,128,65,0,0,192,65,0,0,16,66,0,0,48,66,0,0,72,66,0,0,96,66,0,0,120,66,0,0,134,66,0,0,144,66,0,0,158,66,0,0,176,66,0,0,212,66,0,0,6,67,0,0,128,63,0,0,128,63,0,0,128,63,0,0,128,63,0,0,128,63,0,0,128,63,0,0,128,63,0,0,0,64,0,0,0,64,0,0,0,64,0,0,0,64,0,0,0,64,0,0,0,64,0,0,0,64,0,0,64,64,0,0,64,64,0,0,128,64,0,0,160,64,0,0,192,64,0,0,0,65,0,0,0,65,168,1,0,0,104,4,0,0,36,7,0,0,220,9,0,0,144,12,0,0,64,15,0,0,236,17,0,0,84,19,0,0,16,20,0,0,132,20,0,0,208,20,0,0,8,21,0,0,40,21,0,0,64,21,0,0, |
| | | 76,21,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, |
| | | 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, |
| | | 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0, |
| | | 1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0, |
| | | 0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0, |
| | | 0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,3,0,0,0,5,0,0,0,7,0,0,0,9,0,0,0,11,0,0,0,13,0,0,0,15,0,0,0,17,0,0,0,19,0,0,0,21,0,0,0,23,0,0,0,25,0,0,0,27,0,0,0,29,0,0,0,31,0,0,0,33,0,0,0,35,0,0,0,37,0,0,0,39,0,0,0,41,0,0,0,43, |
| | | 0,0,0,45,0,0,0,47,0,0,0,49,0,0,0,51,0,0,0,53,0,0,0,55,0,0,0,57,0,0,0,59,0,0,0,61,0,0,0,63,0,0,0,65,0,0,0,67,0,0,0,69,0,0,0,71,0,0,0,73,0,0,0,75,0,0,0,77,0,0,0,79,0,0,0,81,0,0,0,83,0,0,0,85,0,0,0,87,0,0,0,89,0,0,0,91,0,0,0,93,0,0,0,95,0,0,0,97,0,0,0,99,0,0,0,101,0,0,0,103,0,0,0,105,0,0,0,107,0,0,0,109,0,0,0,111,0,0,0,113,0,0,0,115,0,0,0,117,0,0,0,119,0,0,0,121,0,0,0,123,0,0,0,125,0,0,0,127,0,0,0,129,0,0,0,131,0,0,0,133,0,0,0,135,0,0,0,137,0,0,0,139,0,0,0,141,0,0,0,143,0,0,0,145,0,0,0,147,0,0,0,149, |
| | | 0,0,0,151,0,0,0,153,0,0,0,155,0,0,0,157,0,0,0,159,0,0,0,161,0,0,0,163,0,0,0,165,0,0,0,167,0,0,0,169,0,0,0,171,0,0,0,173,0,0,0,175,0,0,0,177,0,0,0,179,0,0,0,181,0,0,0,183,0,0,0,185,0,0,0,187,0,0,0,189,0,0,0,191,0,0,0,193,0,0,0,195,0,0,0,197,0,0,0,199,0,0,0,201,0,0,0,203,0,0,0,205,0,0,0,207,0,0,0,209,0,0,0,211,0,0,0,213,0,0,0,215,0,0,0,217,0,0,0,219,0,0,0,221,0,0,0,223,0,0,0,225,0,0,0,227,0,0,0,229,0,0,0,231,0,0,0,233,0,0,0,235,0,0,0,237,0,0,0,239,0,0,0,241,0,0,0,243,0,0,0,245,0,0,0,247,0,0,0,249,0, |
| | | 0,0,251,0,0,0,253,0,0,0,255,0,0,0,1,1,0,0,3,1,0,0,5,1,0,0,7,1,0,0,9,1,0,0,11,1,0,0,13,1,0,0,15,1,0,0,17,1,0,0,19,1,0,0,21,1,0,0,23,1,0,0,25,1,0,0,27,1,0,0,29,1,0,0,31,1,0,0,33,1,0,0,35,1,0,0,37,1,0,0,39,1,0,0,41,1,0,0,43,1,0,0,45,1,0,0,47,1,0,0,49,1,0,0,51,1,0,0,53,1,0,0,55,1,0,0,57,1,0,0,59,1,0,0,61,1,0,0,63,1,0,0,65,1,0,0,67,1,0,0,69,1,0,0,71,1,0,0,73,1,0,0,75,1,0,0,77,1,0,0,79,1,0,0,81,1,0,0,83,1,0,0,85,1,0,0,87,1,0,0,89,1,0,0,91,1,0,0,93,1,0,0,95,1,0,0,13,0,0,0,25,0,0,0,41,0,0,0,61,0,0,0,85,0, |
| | | 0,0,113,0,0,0,145,0,0,0,181,0,0,0,221,0,0,0,9,1,0,0,57,1,0,0,109,1,0,0,165,1,0,0,225,1,0,0,33,2,0,0,101,2,0,0,173,2,0,0,249,2,0,0,73,3,0,0,157,3,0,0,245,3,0,0,81,4,0,0,177,4,0,0,21,5,0,0,125,5,0,0,233,5,0,0,89,6,0,0,205,6,0,0,69,7,0,0,193,7,0,0,65,8,0,0,197,8,0,0,77,9,0,0,217,9,0,0,105,10,0,0,253,10,0,0,149,11,0,0,49,12,0,0,209,12,0,0,117,13,0,0,29,14,0,0,201,14,0,0,121,15,0,0,45,16,0,0,229,16,0,0,161,17,0,0,97,18,0,0,37,19,0,0,237,19,0,0,185,20,0,0,137,21,0,0,93,22,0,0,53,23,0,0,17,24,0,0,241,24, |
| | | 0,0,213,25,0,0,189,26,0,0,169,27,0,0,153,28,0,0,141,29,0,0,133,30,0,0,129,31,0,0,129,32,0,0,133,33,0,0,141,34,0,0,153,35,0,0,169,36,0,0,189,37,0,0,213,38,0,0,241,39,0,0,17,41,0,0,53,42,0,0,93,43,0,0,137,44,0,0,185,45,0,0,237,46,0,0,37,48,0,0,97,49,0,0,161,50,0,0,229,51,0,0,45,53,0,0,121,54,0,0,201,55,0,0,29,57,0,0,117,58,0,0,209,59,0,0,49,61,0,0,149,62,0,0,253,63,0,0,105,65,0,0,217,66,0,0,77,68,0,0,197,69,0,0,65,71,0,0,193,72,0,0,69,74,0,0,205,75,0,0,89,77,0,0,233,78,0,0,125,80,0,0,21,82,0,0,177, |
| | | 83,0,0,81,85,0,0,245,86,0,0,157,88,0,0,73,90,0,0,249,91,0,0,173,93,0,0,101,95,0,0,33,97,0,0,225,98,0,0,165,100,0,0,109,102,0,0,57,104,0,0,9,106,0,0,221,107,0,0,181,109,0,0,145,111,0,0,113,113,0,0,85,115,0,0,61,117,0,0,41,119,0,0,25,121,0,0,13,123,0,0,5,125,0,0,1,127,0,0,1,129,0,0,5,131,0,0,13,133,0,0,25,135,0,0,41,137,0,0,61,139,0,0,85,141,0,0,113,143,0,0,145,145,0,0,181,147,0,0,221,149,0,0,9,152,0,0,57,154,0,0,109,156,0,0,165,158,0,0,225,160,0,0,33,163,0,0,101,165,0,0,173,167,0,0,249,169,0,0,73, |
| | | 172,0,0,157,174,0,0,245,176,0,0,81,179,0,0,177,181,0,0,21,184,0,0,125,186,0,0,233,188,0,0,89,191,0,0,205,193,0,0,69,196,0,0,193,198,0,0,65,201,0,0,197,203,0,0,77,206,0,0,217,208,0,0,105,211,0,0,253,213,0,0,149,216,0,0,49,219,0,0,209,221,0,0,117,224,0,0,29,227,0,0,201,229,0,0,121,232,0,0,45,235,0,0,229,237,0,0,161,240,0,0,63,0,0,0,129,0,0,0,231,0,0,0,121,1,0,0,63,2,0,0,65,3,0,0,135,4,0,0,25,6,0,0,255,7,0,0,65,10,0,0,231,12,0,0,249,15,0,0,127,19,0,0,129,23,0,0,7,28,0,0,25,33,0,0,191,38,0,0,1,45,0,0, |
| | | 231,51,0,0,121,59,0,0,191,67,0,0,193,76,0,0,135,86,0,0,25,97,0,0,127,108,0,0,193,120,0,0,231,133,0,0,249,147,0,0,255,162,0,0,1,179,0,0,7,196,0,0,25,214,0,0,63,233,0,0,129,253,0,0,231,18,1,0,121,41,1,0,63,65,1,0,65,90,1,0,135,116,1,0,25,144,1,0,255,172,1,0,65,203,1,0,231,234,1,0,249,11,2,0,127,46,2,0,129,82,2,0,7,120,2,0,25,159,2,0,191,199,2,0,1,242,2,0,231,29,3,0,121,75,3,0,191,122,3,0,193,171,3,0,135,222,3,0,25,19,4,0,127,73,4,0,193,129,4,0,231,187,4,0,249,247,4,0,255,53,5,0,1,118,5,0,7,184,5,0, |
| | | 25,252,5,0,63,66,6,0,129,138,6,0,231,212,6,0,121,33,7,0,63,112,7,0,65,193,7,0,135,20,8,0,25,106,8,0,255,193,8,0,65,28,9,0,231,120,9,0,249,215,9,0,127,57,10,0,129,157,10,0,7,4,11,0,25,109,11,0,191,216,11,0,1,71,12,0,231,183,12,0,121,43,13,0,191,161,13,0,193,26,14,0,135,150,14,0,25,21,15,0,127,150,15,0,193,26,16,0,231,161,16,0,249,43,17,0,255,184,17,0,1,73,18,0,7,220,18,0,25,114,19,0,63,11,20,0,129,167,20,0,231,70,21,0,121,233,21,0,63,143,22,0,65,56,23,0,135,228,23,0,25,148,24,0,255,70,25,0,65,253, |
| | | 25,0,231,182,26,0,249,115,27,0,127,52,28,0,129,248,28,0,7,192,29,0,25,139,30,0,191,89,31,0,1,44,32,0,231,1,33,0,121,219,33,0,191,184,34,0,193,153,35,0,135,126,36,0,25,103,37,0,127,83,38,0,193,67,39,0,231,55,40,0,249,47,41,0,255,43,42,0,1,44,43,0,7,48,44,0,25,56,45,0,63,68,46,0,129,84,47,0,231,104,48,0,121,129,49,0,63,158,50,0,65,191,51,0,135,228,52,0,25,14,54,0,255,59,55,0,65,110,56,0,231,164,57,0,249,223,58,0,127,31,60,0,129,99,61,0,7,172,62,0,25,249,63,0,191,74,65,0,1,161,66,0,231,251,67,0,121, |
| | | 91,69,0,191,191,70,0,193,40,72,0,135,150,73,0,25,9,75,0,127,128,76,0,193,252,77,0,231,125,79,0,249,3,81,0,255,142,82,0,1,31,84,0,7,180,85,0,25,78,87,0,63,237,88,0,129,145,90,0,231,58,92,0,121,233,93,0,63,157,95,0,65,86,97,0,135,20,99,0,25,216,100,0,255,160,102,0,65,111,104,0,231,66,106,0,249,27,108,0,127,250,109,0,65,1,0,0,169,2,0,0,9,5,0,0,193,8,0,0,65,14,0,0,9,22,0,0,169,32,0,0,193,46,0,0,1,65,0,0,41,88,0,0,9,117,0,0,129,152,0,0,129,195,0,0,9,247,0,0,41,52,1,0,1,124,1,0,193,207,1,0,169,48,2,0,9, |
| | | 160,2,0,65,31,3,0,193,175,3,0,9,83,4,0,169,10,5,0,65,216,5,0,129,189,6,0,41,188,7,0,9,214,8,0,1,13,10,0,1,99,11,0,9,218,12,0,41,116,14,0,129,51,16,0,65,26,18,0,169,42,20,0,9,103,22,0,193,209,24,0,65,109,27,0,9,60,30,0,169,64,33,0,193,125,36,0,1,246,39,0,41,172,43,0,9,163,47,0,129,221,51,0,129,94,56,0,9,41,61,0,41,64,66,0,1,167,71,0,193,96,77,0,169,112,83,0,9,218,89,0,65,160,96,0,193,198,103,0,9,81,111,0,169,66,119,0,65,159,127,0,129,106,136,0,41,168,145,0,9,92,155,0,1,138,165,0,1,54,176,0,9,100,187, |
| | | 0,41,24,199,0,129,86,211,0,65,35,224,0,169,130,237,0,9,121,251,0,193,10,10,1,65,60,25,1,9,18,41,1,169,144,57,1,193,188,74,1,1,155,92,1,41,48,111,1,9,129,130,1,129,146,150,1,129,105,171,1,9,11,193,1,41,124,215,1,1,194,238,1,193,225,6,2,169,224,31,2,9,196,57,2,65,145,84,2,193,77,112,2,9,255,140,2,169,170,170,2,65,86,201,2,129,7,233,2,41,196,9,3,9,146,43,3,1,119,78,3,1,121,114,3,9,158,151,3,41,236,189,3,129,105,229,3,65,28,14,4,169,10,56,4,9,59,99,4,193,179,143,4,65,123,189,4,9,152,236,4,169,16,29,5, |
| | | 193,235,78,5,1,48,130,5,41,228,182,5,9,15,237,5,129,183,36,6,129,228,93,6,9,157,152,6,41,232,212,6,1,205,18,7,193,82,82,7,169,128,147,7,9,94,214,7,65,242,26,8,193,68,97,8,9,93,169,8,169,66,243,8,65,253,62,9,129,148,140,9,41,16,220,9,9,120,45,10,1,212,128,10,1,44,214,10,9,136,45,11,41,240,134,11,129,108,226,11,65,5,64,12,169,194,159,12,9,173,1,13,193,204,101,13,65,42,204,13,9,206,52,14,169,192,159,14,193,10,13,15,1,181,124,15,41,200,238,15,9,77,99,16,129,76,218,16,129,207,83,17,9,223,207,17,41,132, |
| | | 78,18,1,200,207,18,193,179,83,19,169,80,218,19,9,168,99,20,65,195,239,20,193,171,126,21,9,107,16,22,169,10,165,22,65,148,60,23,129,17,215,23,41,140,116,24,9,14,21,25,1,161,184,25,1,79,95,26,9,34,9,27,41,36,182,27,129,95,102,28,65,222,25,29,169,170,208,29,9,207,138,30,193,85,72,31,65,73,9,32,9,180,205,32,169,160,149,33,193,25,97,34,1,42,48,35,41,220,2,36,9,59,217,36,129,81,179,37,147,6,0,0,69,14,0,0,15,28,0,0,17,51,0,0,91,87,0,0,13,142,0,0,119,221,0,0,57,77,1,0,99,230,1,0,149,179,2,0,31,193,3,0,33, |
| | | 29,5,0,171,215,6,0,221,2,9,0,7,179,11,0,201,254,14,0,51,255,18,0,229,207,23,0,47,143,29,0,49,94,36,0,251,96,44,0,173,190,53,0,151,161,64,0,89,55,77,0,3,177,91,0,53,67,108,0,63,38,127,0,65,150,148,0,75,211,172,0,125,33,200,0,39,201,230,0,233,22,9,1,211,91,47,1,133,237,89,1,79,38,137,1,81,101,189,1,155,14,247,1,77,139,54,2,183,73,124,2,121,189,200,2,163,95,28,3,213,174,119,3,95,47,219,3,97,107,71,4,235,242,188,4,29,92,60,5,71,67,198,5,9,75,91,6,115,28,252,6,37,103,169,7,111,225,99,8,113,72,44,9,59, |
| | | 96,3,10,237,243,233,10,215,213,224,11,153,223,232,12,67,242,2,14,117,246,47,15,127,220,112,16,129,156,198,17,139,54,50,19,189,178,180,20,103,33,79,22,41,155,2,24,19,65,208,25,197,60,185,27,143,192,190,29,145,7,226,31,219,85,36,34,141,248,134,36,247,69,11,39,185,157,178,41,227,104,126,44,21,26,112,47,159,45,137,50,161,41,203,53,43,158,55,57,93,37,208,60,135,99,150,64,73,7,140,68,179,201,178,72,101,110,12,77,175,195,154,81,177,162,95,86,123,239,92,91,45,153,148,96,23,154,8,102,217,247,186,107,131,195, |
| | | 173,113,181,25,227,119,191,34,93,126,29,35,0,0,113,77,0,0,145,156,0,0,253,38,1,0,101,12,2,0,233,119,3,0,153,162,5,0,53,214,8,0,45,112,13,0,225,228,19,0,33,195,28,0,237,183,40,0,117,146,56,0,89,72,77,0,41,250,103,0,37,248,137,0,61,199,180,0,81,38,234,0,177,19,44,1,221,210,124,1,133,242,222,1,201,82,85,2,185,43,227,2,21,20,140,3,77,8,84,4,193,113,63,5,65,46,83,6,205,151,148,7,149,140,9,9,57,119,184,10,73,87,168,12,5,202,224,14,93,19,106,17,49,39,77,20,209,178,147,23,189,38,72,27,165,192,117,31,169, |
| | | 149,40,36,217,156,109,41,245,185,82,47,109,200,230,53,161,166,57,61,97,65,92,69,173,159,96,78,181,238,89,88,25,142,92,99,105,28,126,111,229,131,213,124,255,189,0,0,1,168,1,0,143,107,3,0,241,158,6,0,63,35,12,0,193,61,21,0,143,182,35,0,241,252,57,0,255,81,91,0,1,250,139,0,15,117,209,0,113,191,50,1,63,154,184,1,193,220,109,2,15,207,95,3,113,142,158,4,255,123,61,6,1,182,83,8,143,156,252,10,241,97,88,14,63,167,140,18,193,37,197,23,143,101,52,30,241,129,20,38,255,251,167,47,1,156,58,59,15,98,34,73,113, |
| | | 134,192,89,63,138,130,109,193,88,227,132,1,14,4,0,145,33,9,0,17,44,19,0,65,238,37,0,65,79,71,0,145,67,128,0,17,247,221,0,1,70,115,1,1,146,90,2,17,1,184,3,145,53,188,5,65,143,167,8,65,6,206,12,17,178,155,18,145,15,154,26,1,26,118,37,1,76,7,52,145,158,87,71,17,157,172,96,65,166,145,129,35,81,22,0,197,158,50,0,23,185,107,0,153,246,216,0,107,137,160,1,13,196,254,2,31,1,80,5,33,217,29,9,51,108,48,15,213,162,164,24,167,103,8,39,41,253,125,60,123,181,231,91,29,119,29,137,175,160,45,201,173,142,123,0,137, |
| | | 230,25,1,57,150,94,2,61,22,216,4,181,99,119,9,225,40,198,17,33,3,52,32,117,72,130,56,125,87,87,96,191,91,175,2,129,216,39,6,247,132,94,13,233,254,173,27,127,139,235,54,129,183,229,104,23,3,156,193,193,12,255,14,57,106,133,34,25,238,145,75,129,120,43,158,51,225,9,84,149,139,0,0,55,152,0,0,255,165,0,0,4,181,0,0,103,197,0,0,69,215,0,0,193,234,0,0,255,255,0,0,172,21,0,0,128,187,0,0,120,0,0,0,21,0,0,0,21,0,0,0,0,154,89,63,0,0,0,0,0,0,128,63,0,0,128,63,72,87,0,0,3,0,0,0,8,0,0,0,120,0,0,0,11,0,0,0,249,99, |
| | | 0,0,116,87,0,0,24,22,0,0,128,7,0,0,3,0,0,0,248,23,0,0,48,39,0,0,104,39,0,0,160,39,0,0,216,39,0,0,136,1,0,0,166,94,0,0,224,100,0,0,104,102,0,0,106,28,141,56,82,187,30,58,8,105,220,58,130,237,87,59,137,99,178,59,3,42,5,60,48,220,57,60,180,62,119,60,28,163,158,60,209,242,197,60,254,134,241,60,155,171,16,61,5,173,42,61,132,194,70,61,83,230,100,61,17,137,130,61,135,159,147,61,203,178,165,61,209,190,184,61,58,191,204,61,84,175,225,61,20,138,247,61,14,37,7,62,217,244,18,62,95,49,31,62,104,215,43,62,138, |
| | | 227,56,62,48,82,70,62,148,31,84,62,191,71,98,62,142,198,112,62,176,151,127,62,82,91,135,62,96,15,143,62,152,229,150,62,121,219,158,62,112,238,166,62,216,27,175,62,251,96,183,62,17,187,191,62,70,39,200,62,183,162,208,62,120,42,217,62,148,187,225,62,12,83,234,62,222,237,242,62,6,137,251,62,190,16,2,63,31,90,6,63,36,159,10,63,80,222,14,63,43,22,19,63,65,69,23,63,37,106,27,63,115,131,31,63,206,143,35,63,230,141,39,63,116,124,43,63,63,90,47,63,25,38,51,63,231,222,54,63,153,131,58,63,51,19,62,63,197,140, |
| | | 65,63,119,239,68,63,127,58,72,63,39,109,75,63,206,134,78,63,229,134,81,63,241,108,84,63,142,56,87,63,105,233,89,63,69,127,92,63,250,249,94,63,115,89,97,63,175,157,99,63,193,198,101,63,207,212,103,63,17,200,105,63,210,160,107,63,110,95,109,63,80,4,111,63,244,143,112,63,230,2,114,63,189,93,115,63,31,161,116,63,191,205,117,63,87,228,118,63,176,229,119,63,151,210,120,63,227,171,121,63,115,114,122,63,39,39,123,63,231,202,123,63,157,94,124,63,53,227,124,63,156,89,125,63,189,194,125,63,134,31,126,63,222, |
| | | 112,126,63,171,183,126,63,207,244,126,63,38,41,127,63,134,85,127,63,190,122,127,63,150,153,127,63,204,178,127,63,20,199,127,63,28,215,127,63,130,227,127,63,221,236,127,63,182,243,127,63,138,248,127,63,200,251,127,63,214,253,127,63,7,255,127,63,165,255,127,63,232,255,127,63,253,255,127,63,0,0,128,63,224,1,0,0,135,136,8,59,255,255,255,255,5,0,96,0,3,0,32,0,4,0,8,0,2,0,4,0,4,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,158,87,0,0,48,24,0,0,0,0,0,0,0,0,128,63,0,0,0,128,99,250,127,63,191,117,86,188,139,233,127,63,10, |
| | | 113,214,188,121,205,127,63,231,206,32,189,47,166,127,63,58,94,86,189,175,115,127,63,19,242,133,189,249,53,127,63,42,175,160,189,18,237,126,63,51,101,187,189,253,152,126,63,4,19,214,189,188,57,126,63,115,183,240,189,85,207,125,63,168,168,5,190,203,89,125,63,187,239,18,190,37,217,124,63,92,48,32,190,103,77,124,63,245,105,45,190,152,182,123,63,243,155,58,190,190,20,123,63,194,197,71,190,226,103,122,63,205,230,84,190,9,176,121,63,130,254,97,190,60,237,120,63,77,12,111,190,132,31,120,63,156,15,124,190, |
| | | 234,70,119,63,238,131,132,190,119,99,118,63,62,250,138,190,54,117,117,63,117,106,145,190,48,124,116,63,76,212,151,190,113,120,115,63,122,55,158,190,3,106,114,63,183,147,164,190,244,80,113,63,188,232,170,190,79,45,112,63,65,54,177,190,33,255,110,63,1,124,183,190,118,198,109,63,180,185,189,190,94,131,108,63,21,239,195,190,231,53,107,63,222,27,202,190,30,222,105,63,201,63,208,190,18,124,104,63,146,90,214,190,212,15,103,63,243,107,220,190,116,153,101,63,170,115,226,190,1,25,100,63,113,113,232,190,141, |
| | | 142,98,63,7,101,238,190,40,250,96,63,39,78,244,190,230,91,95,63,144,44,250,190,215,179,93,63,0,0,0,191,15,2,92,63,27,228,2,191,160,70,90,63,119,194,5,191,158,129,88,63,246,154,8,191,29,179,86,63,119,109,11,191,49,219,84,63,218,57,14,191,239,249,82,63,0,0,17,191,108,15,81,63,202,191,19,191,189,27,79,63,24,121,22,191,248,30,77,63,205,43,25,191,52,25,75,63,202,215,27,191,136,10,73,63,241,124,30,191,10,243,70,63,36,27,33,191,209,210,68,63,70,178,35,191,247,169,66,63,58,66,38,191,147,120,64,63,227,202, |
| | | 40,191,189,62,62,63,37,76,43,191,143,252,59,63,227,197,45,191,34,178,57,63,1,56,48,191,144,95,55,63,101,162,50,191,243,4,53,63,243,4,53,191,101,162,50,63,144,95,55,191,1,56,48,63,34,178,57,191,227,197,45,63,143,252,59,191,37,76,43,63,189,62,62,191,227,202,40,63,147,120,64,191,58,66,38,63,247,169,66,191,70,178,35,63,209,210,68,191,36,27,33,63,10,243,70,191,241,124,30,63,136,10,73,191,202,215,27,63,52,25,75,191,205,43,25,63,248,30,77,191,24,121,22,63,189,27,79,191,202,191,19,63,108,15,81,191,0,0,17, |
| | | 63,239,249,82,191,218,57,14,63,49,219,84,191,119,109,11,63,29,179,86,191,246,154,8,63,158,129,88,191,119,194,5,63,160,70,90,191,27,228,2,63,15,2,92,191,0,0,0,63,215,179,93,191,144,44,250,62,230,91,95,191,39,78,244,62,40,250,96,191,7,101,238,62,141,142,98,191,113,113,232,62,1,25,100,191,170,115,226,62,116,153,101,191,243,107,220,62,212,15,103,191,146,90,214,62,18,124,104,191,201,63,208,62,30,222,105,191,222,27,202,62,231,53,107,191,21,239,195,62,94,131,108,191,180,185,189,62,118,198,109,191,1,124, |
| | | 183,62,33,255,110,191,65,54,177,62,79,45,112,191,188,232,170,62,244,80,113,191,183,147,164,62,3,106,114,191,122,55,158,62,113,120,115,191,76,212,151,62,48,124,116,191,117,106,145,62,54,117,117,191,62,250,138,62,119,99,118,191,238,131,132,62,234,70,119,191,156,15,124,62,132,31,120,191,77,12,111,62,60,237,120,191,130,254,97,62,9,176,121,191,205,230,84,62,226,103,122,191,194,197,71,62,190,20,123,191,243,155,58,62,152,182,123,191,245,105,45,62,103,77,124,191,92,48,32,62,37,217,124,191,187,239,18,62,203, |
| | | 89,125,191,168,168,5,62,85,207,125,191,115,183,240,61,188,57,126,191,4,19,214,61,253,152,126,191,51,101,187,61,18,237,126,191,42,175,160,61,249,53,127,191,19,242,133,61,175,115,127,191,58,94,86,61,47,166,127,191,231,206,32,61,121,205,127,191,10,113,214,60,139,233,127,191,191,117,86,60,99,250,127,191,0,48,141,36,0,0,128,191,191,117,86,188,99,250,127,191,10,113,214,188,139,233,127,191,231,206,32,189,121,205,127,191,58,94,86,189,47,166,127,191,19,242,133,189,175,115,127,191,42,175,160,189,249,53,127, |
| | | 191,51,101,187,189,18,237,126,191,4,19,214,189,253,152,126,191,115,183,240,189,188,57,126,191,168,168,5,190,85,207,125,191,187,239,18,190,203,89,125,191,92,48,32,190,37,217,124,191,245,105,45,190,103,77,124,191,243,155,58,190,152,182,123,191,194,197,71,190,190,20,123,191,205,230,84,190,226,103,122,191,130,254,97,190,9,176,121,191,77,12,111,190,60,237,120,191,156,15,124,190,132,31,120,191,238,131,132,190,234,70,119,191,62,250,138,190,119,99,118,191,117,106,145,190,54,117,117,191,76,212,151,190,48, |
| | | 124,116,191,122,55,158,190,113,120,115,191,183,147,164,190,3,106,114,191,188,232,170,190,244,80,113,191,65,54,177,190,79,45,112,191,1,124,183,190,33,255,110,191,180,185,189,190,118,198,109,191,21,239,195,190,94,131,108,191,222,27,202,190,231,53,107,191,201,63,208,190,30,222,105,191,146,90,214,190,18,124,104,191,243,107,220,190,212,15,103,191,170,115,226,190,116,153,101,191,113,113,232,190,1,25,100,191,7,101,238,190,141,142,98,191,39,78,244,190,40,250,96,191,144,44,250,190,230,91,95,191,0,0,0,191, |
| | | 215,179,93,191,27,228,2,191,15,2,92,191,119,194,5,191,160,70,90,191,246,154,8,191,158,129,88,191,119,109,11,191,29,179,86,191,218,57,14,191,49,219,84,191,0,0,17,191,239,249,82,191,202,191,19,191,108,15,81,191,24,121,22,191,189,27,79,191,205,43,25,191,248,30,77,191,202,215,27,191,52,25,75,191,241,124,30,191,136,10,73,191,36,27,33,191,10,243,70,191,70,178,35,191,209,210,68,191,58,66,38,191,247,169,66,191,227,202,40,191,147,120,64,191,37,76,43,191,189,62,62,191,227,197,45,191,143,252,59,191,1,56,48, |
| | | 191,34,178,57,191,101,162,50,191,144,95,55,191,243,4,53,191,243,4,53,191,144,95,55,191,101,162,50,191,34,178,57,191,1,56,48,191,143,252,59,191,227,197,45,191,189,62,62,191,37,76,43,191,147,120,64,191,227,202,40,191,247,169,66,191,58,66,38,191,209,210,68,191,70,178,35,191,10,243,70,191,36,27,33,191,136,10,73,191,241,124,30,191,52,25,75,191,202,215,27,191,248,30,77,191,205,43,25,191,189,27,79,191,24,121,22,191,108,15,81,191,202,191,19,191,239,249,82,191,0,0,17,191,49,219,84,191,218,57,14,191,29,179, |
| | | 86,191,119,109,11,191,158,129,88,191,246,154,8,191,160,70,90,191,119,194,5,191,15,2,92,191,27,228,2,191,215,179,93,191,0,0,0,191,230,91,95,191,144,44,250,190,40,250,96,191,39,78,244,190,141,142,98,191,7,101,238,190,1,25,100,191,113,113,232,190,116,153,101,191,170,115,226,190,212,15,103,191,243,107,220,190,18,124,104,191,146,90,214,190,30,222,105,191,201,63,208,190,231,53,107,191,222,27,202,190,94,131,108,191,21,239,195,190,118,198,109,191,180,185,189,190,33,255,110,191,1,124,183,190,79,45,112,191, |
| | | 65,54,177,190,244,80,113,191,188,232,170,190,3,106,114,191,183,147,164,190,113,120,115,191,122,55,158,190,48,124,116,191,76,212,151,190,54,117,117,191,117,106,145,190,119,99,118,191,62,250,138,190,234,70,119,191,238,131,132,190,132,31,120,191,156,15,124,190,60,237,120,191,77,12,111,190,9,176,121,191,130,254,97,190,226,103,122,191,205,230,84,190,190,20,123,191,194,197,71,190,152,182,123,191,243,155,58,190,103,77,124,191,245,105,45,190,37,217,124,191,92,48,32,190,203,89,125,191,187,239,18,190,85,207, |
| | | 125,191,168,168,5,190,188,57,126,191,115,183,240,189,253,152,126,191,4,19,214,189,18,237,126,191,51,101,187,189,249,53,127,191,42,175,160,189,175,115,127,191,19,242,133,189,47,166,127,191,58,94,86,189,121,205,127,191,231,206,32,189,139,233,127,191,10,113,214,188,99,250,127,191,191,117,86,188,0,0,128,191,0,48,13,165,99,250,127,191,191,117,86,60,139,233,127,191,10,113,214,60,121,205,127,191,231,206,32,61,47,166,127,191,58,94,86,61,175,115,127,191,19,242,133,61,249,53,127,191,42,175,160,61,18,237,126, |
| | | 191,51,101,187,61,253,152,126,191,4,19,214,61,188,57,126,191,115,183,240,61,85,207,125,191,168,168,5,62,203,89,125,191,187,239,18,62,37,217,124,191,92,48,32,62,103,77,124,191,245,105,45,62,152,182,123,191,243,155,58,62,190,20,123,191,194,197,71,62,226,103,122,191,205,230,84,62,9,176,121,191,130,254,97,62,60,237,120,191,77,12,111,62,132,31,120,191,156,15,124,62,234,70,119,191,238,131,132,62,119,99,118,191,62,250,138,62,54,117,117,191,117,106,145,62,48,124,116,191,76,212,151,62,113,120,115,191,122, |
| | | 55,158,62,3,106,114,191,183,147,164,62,244,80,113,191,188,232,170,62,79,45,112,191,65,54,177,62,33,255,110,191,1,124,183,62,118,198,109,191,180,185,189,62,94,131,108,191,21,239,195,62,231,53,107,191,222,27,202,62,30,222,105,191,201,63,208,62,18,124,104,191,146,90,214,62,212,15,103,191,243,107,220,62,116,153,101,191,170,115,226,62,1,25,100,191,113,113,232,62,141,142,98,191,7,101,238,62,40,250,96,191,39,78,244,62,230,91,95,191,144,44,250,62,215,179,93,191,0,0,0,63,15,2,92,191,27,228,2,63,160,70,90, |
| | | 191,119,194,5,63,158,129,88,191,246,154,8,63,29,179,86,191,119,109,11,63,49,219,84,191,218,57,14,63,239,249,82,191,0,0,17,63,108,15,81,191,202,191,19,63,189,27,79,191,24,121,22,63,248,30,77,191,205,43,25,63,52,25,75,191,202,215,27,63,136,10,73,191,241,124,30,63,10,243,70,191,36,27,33,63,209,210,68,191,70,178,35,63,247,169,66,191,58,66,38,63,147,120,64,191,227,202,40,63,189,62,62,191,37,76,43,63,143,252,59,191,227,197,45,63,34,178,57,191,1,56,48,63,144,95,55,191,101,162,50,63,243,4,53,191,243,4,53, |
| | | 63,101,162,50,191,144,95,55,63,1,56,48,191,34,178,57,63,227,197,45,191,143,252,59,63,37,76,43,191,189,62,62,63,227,202,40,191,147,120,64,63,58,66,38,191,247,169,66,63,70,178,35,191,209,210,68,63,36,27,33,191,10,243,70,63,241,124,30,191,136,10,73,63,202,215,27,191,52,25,75,63,205,43,25,191,248,30,77,63,24,121,22,191,189,27,79,63,202,191,19,191,108,15,81,63,0,0,17,191,239,249,82,63,218,57,14,191,49,219,84,63,119,109,11,191,29,179,86,63,246,154,8,191,158,129,88,63,119,194,5,191,160,70,90,63,27,228,2, |
| | | 191,15,2,92,63,0,0,0,191,215,179,93,63,144,44,250,190,230,91,95,63,39,78,244,190,40,250,96,63,7,101,238,190,141,142,98,63,113,113,232,190,1,25,100,63,170,115,226,190,116,153,101,63,243,107,220,190,212,15,103,63,146,90,214,190,18,124,104,63,201,63,208,190,30,222,105,63,222,27,202,190,231,53,107,63,21,239,195,190,94,131,108,63,180,185,189,190,118,198,109,63,1,124,183,190,33,255,110,63,65,54,177,190,79,45,112,63,188,232,170,190,244,80,113,63,183,147,164,190,3,106,114,63,122,55,158,190,113,120,115,63, |
| | | 76,212,151,190,48,124,116,63,117,106,145,190,54,117,117,63,62,250,138,190,119,99,118,63,238,131,132,190,234,70,119,63,156,15,124,190,132,31,120,63,77,12,111,190,60,237,120,63,130,254,97,190,9,176,121,63,205,230,84,190,226,103,122,63,194,197,71,190,190,20,123,63,243,155,58,190,152,182,123,63,245,105,45,190,103,77,124,63,92,48,32,190,37,217,124,63,187,239,18,190,203,89,125,63,168,168,5,190,85,207,125,63,115,183,240,189,188,57,126,63,4,19,214,189,253,152,126,63,51,101,187,189,18,237,126,63,42,175,160, |
| | | 189,249,53,127,63,19,242,133,189,175,115,127,63,58,94,86,189,47,166,127,63,231,206,32,189,121,205,127,63,10,113,214,188,139,233,127,63,191,117,86,188,99,250,127,63,0,200,83,165,0,0,128,63,191,117,86,60,99,250,127,63,10,113,214,60,139,233,127,63,231,206,32,61,121,205,127,63,58,94,86,61,47,166,127,63,19,242,133,61,175,115,127,63,42,175,160,61,249,53,127,63,51,101,187,61,18,237,126,63,4,19,214,61,253,152,126,63,115,183,240,61,188,57,126,63,168,168,5,62,85,207,125,63,187,239,18,62,203,89,125,63,92,48, |
| | | 32,62,37,217,124,63,245,105,45,62,103,77,124,63,243,155,58,62,152,182,123,63,194,197,71,62,190,20,123,63,205,230,84,62,226,103,122,63,130,254,97,62,9,176,121,63,77,12,111,62,60,237,120,63,156,15,124,62,132,31,120,63,238,131,132,62,234,70,119,63,62,250,138,62,119,99,118,63,117,106,145,62,54,117,117,63,76,212,151,62,48,124,116,63,122,55,158,62,113,120,115,63,183,147,164,62,3,106,114,63,188,232,170,62,244,80,113,63,65,54,177,62,79,45,112,63,1,124,183,62,33,255,110,63,180,185,189,62,118,198,109,63,21, |
| | | 239,195,62,94,131,108,63,222,27,202,62,231,53,107,63,201,63,208,62,30,222,105,63,146,90,214,62,18,124,104,63,243,107,220,62,212,15,103,63,170,115,226,62,116,153,101,63,113,113,232,62,1,25,100,63,7,101,238,62,141,142,98,63,39,78,244,62,40,250,96,63,144,44,250,62,230,91,95,63,0,0,0,63,215,179,93,63,27,228,2,63,15,2,92,63,119,194,5,63,160,70,90,63,246,154,8,63,158,129,88,63,119,109,11,63,29,179,86,63,218,57,14,63,49,219,84,63,0,0,17,63,239,249,82,63,202,191,19,63,108,15,81,63,24,121,22,63,189,27,79, |
| | | 63,205,43,25,63,248,30,77,63,202,215,27,63,52,25,75,63,241,124,30,63,136,10,73,63,36,27,33,63,10,243,70,63,70,178,35,63,209,210,68,63,58,66,38,63,247,169,66,63,227,202,40,63,147,120,64,63,37,76,43,63,189,62,62,63,227,197,45,63,143,252,59,63,1,56,48,63,34,178,57,63,101,162,50,63,144,95,55,63,243,4,53,63,243,4,53,63,144,95,55,63,101,162,50,63,34,178,57,63,1,56,48,63,143,252,59,63,227,197,45,63,189,62,62,63,37,76,43,63,147,120,64,63,227,202,40,63,247,169,66,63,58,66,38,63,209,210,68,63,70,178,35,63, |
| | | 10,243,70,63,36,27,33,63,136,10,73,63,241,124,30,63,52,25,75,63,202,215,27,63,248,30,77,63,205,43,25,63,189,27,79,63,24,121,22,63,108,15,81,63,202,191,19,63,239,249,82,63,0,0,17,63,49,219,84,63,218,57,14,63,29,179,86,63,119,109,11,63,158,129,88,63,246,154,8,63,160,70,90,63,119,194,5,63,15,2,92,63,27,228,2,63,215,179,93,63,0,0,0,63,230,91,95,63,144,44,250,62,40,250,96,63,39,78,244,62,141,142,98,63,7,101,238,62,1,25,100,63,113,113,232,62,116,153,101,63,170,115,226,62,212,15,103,63,243,107,220,62,18, |
| | | 124,104,63,146,90,214,62,30,222,105,63,201,63,208,62,231,53,107,63,222,27,202,62,94,131,108,63,21,239,195,62,118,198,109,63,180,185,189,62,33,255,110,63,1,124,183,62,79,45,112,63,65,54,177,62,244,80,113,63,188,232,170,62,3,106,114,63,183,147,164,62,113,120,115,63,122,55,158,62,48,124,116,63,76,212,151,62,54,117,117,63,117,106,145,62,119,99,118,63,62,250,138,62,234,70,119,63,238,131,132,62,132,31,120,63,156,15,124,62,60,237,120,63,77,12,111,62,9,176,121,63,130,254,97,62,226,103,122,63,205,230,84,62, |
| | | 190,20,123,63,194,197,71,62,152,182,123,63,243,155,58,62,103,77,124,63,245,105,45,62,37,217,124,63,92,48,32,62,203,89,125,63,187,239,18,62,85,207,125,63,168,168,5,62,188,57,126,63,115,183,240,61,253,152,126,63,4,19,214,61,18,237,126,63,51,101,187,61,249,53,127,63,42,175,160,61,175,115,127,63,19,242,133,61,47,166,127,63,58,94,86,61,121,205,127,63,231,206,32,61,139,233,127,63,10,113,214,60,99,250,127,63,191,117,86,60,240,0,0,0,137,136,136,59,1,0,0,0,5,0,48,0,3,0,16,0,4,0,4,0,4,0,1,0,0,0,0,0,0,0,0,0, |
| | | 0,0,0,0,0,0,0,0,94,91,0,0,48,24,0,0,0,0,0,0,120,0,0,0,136,136,8,60,2,0,0,0,5,0,24,0,3,0,8,0,2,0,4,0,4,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,62,93,0,0,48,24,0,0,0,0,0,0,60,0,0,0,137,136,136,60,3,0,0,0,5,0,12,0,3,0,4,0,4,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,46,94,0,0,48,24,0,0,0,0,0,0,255,255,127,63,142,255,127,63,106,254,127,63,147,252,127,63,7,250,127,63,200,246,127,63,214,242,127,63,48,238,127,63,214,232,127,63,200,226,127,63,7,220,127,63,147,212,127,63],"i8",4,y.h); |
| | | O([107,204,127,63,143,195,127,63,0,186,127,63,189,175,127,63,199,164,127,63,29,153,127,63,192,140,127,63,176,127,127,63,236,113,127,63,118,99,127,63,75,84,127,63,110,68,127,63,222,51,127,63,154,34,127,63,163,16,127,63,250,253,126,63,157,234,126,63,141,214,126,63,203,193,126,63,86,172,126,63,46,150,126,63,83,127,126,63,198,103,126,63,134,79,126,63,148,54,126,63,239,28,126,63,152,2,126,63,143,231,125,63,211,203,125,63,102,175,125,63,70,146,125,63,116,116,125,63,241,85,125,63,188,54,125,63,213,22,125, |
| | | 63,60,246,124,63,242,212,124,63,246,178,124,63,73,144,124,63,235,108,124,63,219,72,124,63,27,36,124,63,169,254,123,63,135,216,123,63,180,177,123,63,48,138,123,63,252,97,123,63,23,57,123,63,130,15,123,63,61,229,122,63,72,186,122,63,162,142,122,63,77,98,122,63,72,53,122,63,148,7,122,63,48,217,121,63,29,170,121,63,90,122,121,63,233,73,121,63,200,24,121,63,249,230,120,63,123,180,120,63,78,129,120,63,115,77,120,63,234,24,120,63,178,227,119,63,205,173,119,63,58,119,119,63,249,63,119,63,10,8,119,63,110, |
| | | 207,118,63,37,150,118,63,47,92,118,63,140,33,118,63,60,230,117,63,64,170,117,63,151,109,117,63,66,48,117,63,65,242,116,63,148,179,116,63,59,116,116,63,55,52,116,63,135,243,115,63,44,178,115,63,38,112,115,63,118,45,115,63,26,234,114,63,20,166,114,63,100,97,114,63,10,28,114,63,5,214,113,63,87,143,113,63,0,72,113,63,255,255,112,63,85,183,112,63,2,110,112,63,6,36,112,63,98,217,111,63,21,142,111,63,32,66,111,63,132,245,110,63,63,168,110,63,83,90,110,63,192,11,110,63,134,188,109,63,165,108,109,63,29,28, |
| | | 109,63,239,202,108,63,27,121,108,63,161,38,108,63,128,211,107,63,187,127,107,63,80,43,107,63,64,214,106,63,140,128,106,63,50,42,106,63,53,211,105,63,147,123,105,63,77,35,105,63,100,202,104,63,216,112,104,63,168,22,104,63,213,187,103,63,96,96,103,63,72,4,103,63,143,167,102,63,51,74,102,63,54,236,101,63,151,141,101,63,87,46,101,63,119,206,100,63,245,109,100,63,212,12,100,63,18,171,99,63,177,72,99,63,176,229,98,63,16,130,98,63,209,29,98,63,243,184,97,63,119,83,97,63,92,237,96,63,164,134,96,63,78,31, |
| | | 96,63,91,183,95,63,203,78,95,63,158,229,94,63,213,123,94,63,112,17,94,63,110,166,93,63,210,58,93,63,154,206,92,63,198,97,92,63,89,244,91,63,81,134,91,63,174,23,91,63,114,168,90,63,157,56,90,63,46,200,89,63,39,87,89,63,135,229,88,63,79,115,88,63,127,0,88,63,23,141,87,63,24,25,87,63,130,164,86,63,86,47,86,63,147,185,85,63,58,67,85,63,75,204,84,63,199,84,84,63,174,220,83,63,1,100,83,63,191,234,82,63,233,112,82,63,127,246,81,63,130,123,81,63,242,255,80,63,207,131,80,63,26,7,80,63,210,137,79,63,250,11, |
| | | 79,63,144,141,78,63,148,14,78,63,9,143,77,63,237,14,77,63,65,142,76,63,5,13,76,63,59,139,75,63,225,8,75,63,249,133,74,63,131,2,74,63,127,126,73,63,238,249,72,63,207,116,72,63,36,239,71,63,237,104,71,63,41,226,70,63,218,90,70,63,0,211,69,63,155,74,69,63,172,193,68,63,50,56,68,63,47,174,67,63,162,35,67,63,141,152,66,63,239,12,66,63,200,128,65,63,26,244,64,63,229,102,64,63,40,217,63,63,229,74,63,63,27,188,62,63,204,44,62,63,247,156,61,63,157,12,61,63,190,123,60,63,92,234,59,63,117,88,59,63,10,198,58, |
| | | 63,29,51,58,63,173,159,57,63,187,11,57,63,71,119,56,63,81,226,55,63,218,76,55,63,227,182,54,63,107,32,54,63,116,137,53,63,253,241,52,63,7,90,52,63,147,193,51,63,160,40,51,63,48,143,50,63,66,245,49,63,216,90,49,63,241,191,48,63,142,36,48,63,175,136,47,63,85,236,46,63,129,79,46,63,50,178,45,63,105,20,45,63,39,118,44,63,107,215,43,63,55,56,43,63,139,152,42,63,103,248,41,63,204,87,41,63,186,182,40,63,50,21,40,63,51,115,39,63,191,208,38,63,214,45,38,63,121,138,37,63,167,230,36,63,97,66,36,63,169,157,35, |
| | | 63,125,248,34,63,223,82,34,63,207,172,33,63,77,6,33,63,91,95,32,63,248,183,31,63,37,16,31,63,226,103,30,63,48,191,29,63,16,22,29,63,129,108,28,63,132,194,27,63,26,24,27,63,67,109,26,63,0,194,25,63,81,22,25,63,54,106,24,63,177,189,23,63,193,16,23,63,103,99,22,63,163,181,21,63,118,7,21,63,225,88,20,63,228,169,19,63,127,250,18,63,179,74,18,63,128,154,17,63,231,233,16,63,232,56,16,63,132,135,15,63,187,213,14,63,142,35,14,63,254,112,13,63,10,190,12,63,179,10,12,63,250,86,11,63,223,162,10,63,99,238,9,63, |
| | | 134,57,9,63,73,132,8,63,172,206,7,63,175,24,7,63,84,98,6,63,155,171,5,63,131,244,4,63,15,61,4,63,61,133,3,63,15,205,2,63,134,20,2,63,161,91,1,63,97,162,0,63,143,209,255,62,167,93,254,62,14,233,252,62,194,115,251,62,198,253,249,62,27,135,248,62,193,15,247,62,186,151,245,62,6,31,244,62,168,165,242,62,158,43,241,62,236,176,239,62,145,53,238,62,144,185,236,62,232,60,235,62,154,191,233,62,169,65,232,62,21,195,230,62,223,67,229,62,8,196,227,62,145,67,226,62,124,194,224,62,200,64,223,62,120,190,221,62,140, |
| | | 59,220,62,6,184,218,62,230,51,217,62,46,175,215,62,223,41,214,62,249,163,212,62,125,29,211,62,110,150,209,62,204,14,208,62,151,134,206,62,210,253,204,62,125,116,203,62,153,234,201,62,39,96,200,62,40,213,198,62,159,73,197,62,138,189,195,62,236,48,194,62,198,163,192,62,25,22,191,62,230,135,189,62,45,249,187,62,241,105,186,62,50,218,184,62,241,73,183,62,47,185,181,62,238,39,180,62,47,150,178,62,242,3,177,62,57,113,175,62,4,222,173,62,86,74,172,62,47,182,170,62,144,33,169,62,122,140,167,62,239,246,165, |
| | | 62,239,96,164,62,124,202,162,62,151,51,161,62,64,156,159,62,122,4,158,62,68,108,156,62,161,211,154,62,145,58,153,62,22,161,151,62,48,7,150,62,225,108,148,62,41,210,146,62,11,55,145,62,135,155,143,62,158,255,141,62,81,99,140,62,162,198,138,62,145,41,137,62,32,140,135,62,80,238,133,62,34,80,132,62,151,177,130,62,176,18,129,62,222,230,126,62,169,167,123,62,195,103,120,62,47,39,117,62,238,229,113,62,4,164,110,62,115,97,107,62,60,30,104,62,98,218,100,62,232,149,97,62,207,80,94,62,26,11,91,62,204,196,87, |
| | | 62,230,125,84,62,107,54,81,62,93,238,77,62,191,165,74,62,146,92,71,62,218,18,68,62,151,200,64,62,206,125,61,62,128,50,58,62,174,230,54,62,93,154,51,62,141,77,48,62,66,0,45,62,125,178,41,62,66,100,38,62,145,21,35,62,110,198,31,62,219,118,28,62,218,38,25,62,109,214,21,62,152,133,18,62,91,52,15,62,186,226,11,62,183,144,8,62,84,62,5,62,148,235,1,62,240,48,253,61,6,138,246,61,113,226,239,61,51,58,233,61,79,145,226,61,207,231,219,61,181,61,213,61,3,147,206,61,192,231,199,61,242,59,193,61,156,143,186,61, |
| | | 195,226,179,61,108,53,173,61,155,135,166,61,85,217,159,61,159,42,153,61,126,123,146,61,246,203,139,61,11,28,133,61,135,215,124,61,70,118,111,61,93,20,98,61,214,177,84,61,185,78,71,61,16,235,57,61,229,134,44,61,64,34,31,61,44,189,17,61,178,87,4,61,181,227,237,60,96,23,211,60,118,74,184,60,11,125,157,60,50,175,130,60,250,193,79,60,254,36,26,60,42,15,201,59,153,167,59,59,46,125,214,185,210,70,113,187,171,222,227,187,166,140,39,188,129,41,93,188,225,98,137,188,160,48,164,188,236,253,190,188,179,202,217, |
| | | 188,224,150,244,188,49,177,7,189,147,22,21,189,140,123,34,189,19,224,47,189,30,68,61,189,165,167,74,189,157,10,88,189,254,108,101,189,190,206,114,189,234,23,128,189,27,200,134,189,237,119,141,189,92,39,148,189,99,214,154,189,253,132,161,189,38,51,168,189,217,224,174,189,17,142,181,189,202,58,188,189,254,230,194,189,170,146,201,189,200,61,208,189,84,232,214,189,74,146,221,189,164,59,228,189,93,228,234,189,114,140,241,189,221,51,248,189,154,218,254,189,82,192,2,190,252,18,6,190,71,101,9,190,50,183, |
| | | 12,190,186,8,16,190,221,89,19,190,152,170,22,190,234,250,25,190,208,74,29,190,71,154,32,190,78,233,35,190,225,55,39,190,0,134,42,190,166,211,45,190,211,32,49,190,131,109,52,190,181,185,55,190,101,5,59,190,147,80,62,190,58,155,65,190,90,229,68,190,240,46,72,190,249,119,75,190,116,192,78,190,93,8,82,190,179,79,85,190,115,150,88,190,156,220,91,190,42,34,95,190,27,103,98,190,109,171,101,190,31,239,104,190,44,50,108,190,148,116,111,190,84,182,114,190,106,247,117,190,211,55,121,190,141,119,124,190,150, |
| | | 182,127,190,117,122,129,190,69,25,131,190,185,183,132,190,208,85,134,190,136,243,135,190,225,144,137,190,218,45,139,190,112,202,140,190,164,102,142,190,116,2,144,190,223,157,145,190,228,56,147,190,129,211,148,190,182,109,150,190,129,7,152,190,226,160,153,190,215,57,155,190,95,210,156,190,121,106,158,190,35,2,160,190,94,153,161,190,38,48,163,190,125,198,164,190,96,92,166,190,206,241,167,190,198,134,169,190,71,27,171,190,80,175,172,190,224,66,174,190,245,213,175,190,143,104,177,190,173,250,178,190, |
| | | 77,140,180,190,110,29,182,190,16,174,183,190,48,62,185,190,207,205,186,190,234,92,188,190,130,235,189,190,148,121,191,190,31,7,193,190,35,148,194,190,159,32,196,190,145,172,197,190,248,55,199,190,211,194,200,190,34,77,202,190,226,214,203,190,19,96,205,190,181,232,206,190,197,112,208,190,66,248,209,190,45,127,211,190,131,5,213,190,67,139,214,190,109,16,216,190,255,148,217,190,249,24,219,190,89,156,220,190,29,31,222,190,70,161,223,190,211,34,225,190,193,163,226,190,16,36,228,190,190,163,229,190,204, |
| | | 34,231,190,56,161,232,190,0,31,234,190,36,156,235,190,162,24,237,190,122,148,238,190,171,15,240,190,51,138,241,190,18,4,243,190,70,125,244,190,207,245,245,190,170,109,247,190,217,228,248,190,88,91,250,190,40,209,251,190,71,70,253,190,181,186,254,190,56,23,0,191,187,208,0,191,228,137,1,191,178,66,2,191,37,251,2,191,59,179,3,191,246,106,4,191,83,34,5,191,83,217,5,191,245,143,6,191,56,70,7,191,29,252,7,191,162,177,8,191,199,102,9,191,140,27,10,191,240,207,10,191,243,131,11,191,147,55,12,191,209,234, |
| | | 12,191,172,157,13,191,36,80,14,191,56,2,15,191,232,179,15,191,50,101,16,191,24,22,17,191,151,198,17,191,176,118,18,191,99,38,19,191,174,213,19,191,145,132,20,191,13,51,21,191,31,225,21,191,200,142,22,191,8,60,23,191,221,232,23,191,72,149,24,191,72,65,25,191,220,236,25,191,4,152,26,191,192,66,27,191,15,237,27,191,240,150,28,191,99,64,29,191,104,233,29,191,254,145,30,191,37,58,31,191,220,225,31,191,35,137,32,191,250,47,33,191,95,214,33,191,82,124,34,191,212,33,35,191,227,198,35,191,127,107,36,191,167, |
| | | 15,37,191,92,179,37,191,157,86,38,191,104,249,38,191,191,155,39,191,160,61,40,191,11,223,40,191,255,127,41,191,125,32,42,191,131,192,42,191,17,96,43,191,39,255,43,191,196,157,44,191,232,59,45,191,146,217,45,191,195,118,46,191,121,19,47,191,180,175,47,191,115,75,48,191,183,230,48,191,127,129,49,191,203,27,50,191,153,181,50,191,234,78,51,191,189,231,51,191,18,128,52,191,232,23,53,191,63,175,53,191,22,70,54,191,110,220,54,191,69,114,55,191,156,7,56,191,113,156,56,191,197,48,57,191,150,196,57,191,230, |
| | | 87,58,191,178,234,58,191,252,124,59,191,194,14,60,191,3,160,60,191,193,48,61,191,250,192,61,191,173,80,62,191,219,223,62,191,131,110,63,191,165,252,63,191,64,138,64,191,83,23,65,191,224,163,65,191,228,47,66,191,96,187,66,191,83,70,67,191,190,208,67,191,158,90,68,191,246,227,68,191,194,108,69,191,5,245,69,191,188,124,70,191,232,3,71,191,137,138,71,191,157,16,72,191,37,150,72,191,32,27,73,191,142,159,73,191,111,35,74,191,193,166,74,191,134,41,75,191,188,171,75,191,99,45,76,191,122,174,76,191,2,47,77, |
| | | 191,250,174,77,191,98,46,78,191,57,173,78,191,126,43,79,191,51,169,79,191,85,38,80,191,230,162,80,191,228,30,81,191,80,154,81,191,40,21,82,191,109,143,82,191,30,9,83,191,59,130,83,191,195,250,83,191,183,114,84,191,22,234,84,191,223,96,85,191,18,215,85,191,176,76,86,191,183,193,86,191,39,54,87,191,0,170,87,191,66,29,88,191,236,143,88,191,254,1,89,191,120,115,89,191,89,228,89,191,162,84,90,191,81,196,90,191,102,51,91,191,226,161,91,191,195,15,92,191,10,125,92,191,183,233,92,191,200,85,93,191,62,193, |
| | | 93,191,24,44,94,191,87,150,94,191,249,255,94,191,255,104,95,191,104,209,95,191,51,57,96,191,98,160,96,191,243,6,97,191,229,108,97,191,58,210,97,191,240,54,98,191,8,155,98,191,128,254,98,191,89,97,99,191,146,195,99,191,44,37,100,191,37,134,100,191,126,230,100,191,55,70,101,191,78,165,101,191,197,3,102,191,154,97,102,191,205,190,102,191,94,27,103,191,77,119,103,191,154,210,103,191,68,45,104,191,75,135,104,191,174,224,104,191,111,57,105,191,139,145,105,191,4,233,105,191,217,63,106,191,9,150,106,191, |
| | | 148,235,106,191,123,64,107,191,188,148,107,191,89,232,107,191,79,59,108,191,160,141,108,191,75,223,108,191,79,48,109,191,173,128,109,191,101,208,109,191,117,31,110,191,223,109,110,191,161,187,110,191,187,8,111,191,46,85,111,191,248,160,111,191,27,236,111,191,149,54,112,191,103,128,112,191,144,201,112,191,15,18,113,191,230,89,113,191,19,161,113,191,151,231,113,191,113,45,114,191,160,114,114,191,38,183,114,191,1,251,114,191,50,62,115,191,184,128,115,191,148,194,115,191,196,3,116,191,73,68,116,191,34, |
| | | 132,116,191,80,195,116,191,210,1,117,191,168,63,117,191,210,124,117,191,80,185,117,191,33,245,117,191,69,48,118,191,189,106,118,191,136,164,118,191,166,221,118,191,22,22,119,191,217,77,119,191,239,132,119,191,87,187,119,191,17,241,119,191,29,38,120,191,122,90,120,191,42,142,120,191,43,193,120,191,125,243,120,191,33,37,121,191,22,86,121,191,92,134,121,191,242,181,121,191,218,228,121,191,18,19,122,191,154,64,122,191,115,109,122,191,157,153,122,191,22,197,122,191,223,239,122,191,248,25,123,191,97,67, |
| | | 123,191,26,108,123,191,34,148,123,191,122,187,123,191,32,226,123,191,23,8,124,191,92,45,124,191,240,81,124,191,211,117,124,191,5,153,124,191,134,187,124,191,85,221,124,191,115,254,124,191,223,30,125,191,154,62,125,191,163,93,125,191,250,123,125,191,159,153,125,191,146,182,125,191,211,210,125,191,98,238,125,191,63,9,126,191,105,35,126,191,225,60,126,191,167,85,126,191,186,109,126,191,27,133,126,191,201,155,126,191,196,177,126,191,13,199,126,191,162,219,126,191,133,239,126,191,181,2,127,191,50,21,127, |
| | | 191,252,38,127,191,19,56,127,191,118,72,127,191,39,88,127,191,36,103,127,191,110,117,127,191,5,131,127,191,232,143,127,191,25,156,127,191,149,167,127,191,95,178,127,191,116,188,127,191,215,197,127,191,133,206,127,191,129,214,127,191,200,221,127,191,93,228,127,191,61,234,127,191,106,239,127,191,227,243,127,191,169,247,127,191,187,250,127,191,25,253,127,191,196,254,127,191,187,255,127,191,250,255,127,63,57,254,127,63,169,249,127,63,75,242,127,63,30,232,127,63,35,219,127,63,89,203,127,63,193,184,127, |
| | | 63,91,163,127,63,40,139,127,63,39,112,127,63,90,82,127,63,191,49,127,63,88,14,127,63,37,232,126,63,38,191,126,63,92,147,126,63,200,100,126,63,105,51,126,63,65,255,125,63,79,200,125,63,150,142,125,63,20,82,125,63,203,18,125,63,188,208,124,63,231,139,124,63,77,68,124,63,239,249,123,63,205,172,123,63,233,92,123,63,67,10,123,63,221,180,122,63,182,92,122,63,209,1,122,63,46,164,121,63,206,67,121,63,178,224,120,63,220,122,120,63,76,18,120,63,4,167,119,63,4,57,119,63,79,200,118,63,228,84,118,63,198,222,117, |
| | | 63,246,101,117,63,117,234,116,63,68,108,116,63,101,235,115,63,218,103,115,63,163,225,114,63,194,88,114,63,57,205,113,63,9,63,113,63,52,174,112,63,187,26,112,63,160,132,111,63,228,235,110,63,138,80,110,63,147,178,109,63,1,18,109,63,213,110,108,63,17,201,107,63,183,32,107,63,201,117,106,63,73,200,105,63,57,24,105,63,155,101,104,63,111,176,103,63,186,248,102,63,124,62,102,63,184,129,101,63,111,194,100,63,164,0,100,63,90,60,99,63,145,117,98,63,76,172,97,63,142,224,96,63,89,18,96,63,174,65,95,63,145,110, |
| | | 94,63,3,153,93,63,8,193,92,63,160,230,91,63,207,9,91,63,152,42,90,63,251,72,89,63,253,100,88,63,159,126,87,63,229,149,86,63,208,170,85,63,99,189,84,63,161,205,83,63,140,219,82,63,39,231,81,63,117,240,80,63,121,247,79,63,52,252,78,63,171,254,77,63,223,254,76,63,212,252,75,63,140,248,74,63,10,242,73,63,82,233,72,63,101,222,71,63,71,209,70,63,251,193,69,63,132,176,68,63,229,156,67,63,32,135,66,63,58,111,65,63,52,85,64,63,19,57,63,63,216,26,62,63,136,250,60,63,38,216,59,63,180,179,58,63,54,141,57,63, |
| | | 175,100,56,63,34,58,55,63,147,13,54,63,5,223,52,63,124,174,51,63,249,123,50,63,130,71,49,63,25,17,48,63,194,216,46,63,127,158,45,63,86,98,44,63,72,36,43,63,90,228,41,63,144,162,40,63,235,94,39,63,113,25,38,63,37,210,36,63,9,137,35,63,35,62,34,63,117,241,32,63,4,163,31,63,210,82,30,63,228,0,29,63,61,173,27,63,225,87,26,63,211,0,25,63,25,168,23,63,180,77,22,63,170,241,20,63,253,147,19,63,178,52,18,63,204,211,16,63,80,113,15,63,66,13,14,63,164,167,12,63,124,64,11,63,205,215,9,63,154,109,8,63,233,1,7, |
| | | 63,189,148,5,63,25,38,4,63,3,182,2,63,126,68,1,63,28,163,255,62,110,186,252,62,250,206,249,62,202,224,246,62,228,239,243,62,81,252,240,62,26,6,238,62,71,13,235,62,224,17,232,62,237,19,229,62,119,19,226,62,135,16,223,62,36,11,220,62,88,3,217,62,42,249,213,62,164,236,210,62,205,221,207,62,175,204,204,62,82,185,201,62,191,163,198,62,254,139,195,62,24,114,192,62,22,86,189,62,0,56,186,62,224,23,183,62,189,245,179,62,161,209,176,62,149,171,173,62,162,131,170,62,207,89,167,62,39,46,164,62,178,0,161,62,121, |
| | | 209,157,62,133,160,154,62,223,109,151,62,143,57,148,62,160,3,145,62,26,204,141,62,5,147,138,62,107,88,135,62,86,28,132,62,205,222,128,62,182,63,123,62,16,191,116,62,187,59,110,62,201,181,103,62,77,45,97,62,89,162,90,62,255,20,84,62,81,133,77,62,99,243,70,62,70,95,64,62,13,201,57,62,202,48,51,62,144,150,44,62,114,250,37,62,130,92,31,62,210,188,24,62,118,27,18,62,127,120,11,62,1,212,4,62,29,92,252,61,114,13,239,61,41,188,225,61,102,104,212,61,78,18,199,61,8,186,185,61,184,95,172,61,132,3,159,61,146, |
| | | 165,145,61,7,70,132,61,18,202,109,61,122,5,83,61,145,62,56,61,164,117,29,61,252,170,2,61,202,189,207,60,86,35,154,60,97,14,73,60,197,167,187,59,61,122,86,186,9,70,241,187,18,221,99,188,80,138,167,188,65,36,221,188,227,93,9,189,35,40,36,189,150,240,62,189,242,182,89,189,234,122,116,189,26,158,135,189,66,253,148,189,200,90,162,189,134,182,175,189,87,16,189,189,22,104,202,189,155,189,215,189,195,16,229,189,105,97,242,189,101,175,255,189,74,125,6,190,104,33,13,190,250,195,19,190,237,100,26,190,46,4,33, |
| | | 190,172,161,39,190,83,61,46,190,16,215,52,190,210,110,59,190,134,4,66,190,25,152,72,190,121,41,79,190,148,184,85,190,86,69,92,190,174,207,98,190,137,87,105,190,214,220,111,190,128,95,118,190,120,223,124,190,84,174,129,190,129,235,132,190,56,39,136,190,114,97,139,190,36,154,142,190,69,209,145,190,205,6,149,190,179,58,152,190,238,108,155,190,116,157,158,190,61,204,161,190,64,249,164,190,115,36,168,190,207,77,171,190,73,117,174,190,218,154,177,190,120,190,180,190,27,224,183,190,186,255,186,190,75,29, |
| | | 190,190,199,56,193,190,37,82,196,190,91,105,199,190,97,126,202,190,48,145,205,190,188,161,208,190,0,176,211,190,241,187,214,190,135,197,217,190,186,204,220,190,129,209,223,190,211,211,226,190,169,211,229,190,250,208,232,190,189,203,235,190,234,195,238,190,120,185,241,190,96,172,244,190,154,156,247,190,28,138,250,190,223,116,253,190,109,46,0,191,3,161,1,191,45,18,3,191,230,129,4,191,44,240,5,191,250,92,7,191,76,200,8,191,30,50,10,191,108,154,11,191,50,1,13,191,108,102,14,191,23,202,15,191,45,44,17, |
| | | 191,172,140,18,191,144,235,19,191,213,72,21,191,118,164,22,191,113,254,23,191,192,86,25,191,98,173,26,191,81,2,28,191,138,85,29,191,9,167,30,191,203,246,31,191,204,68,33,191,9,145,34,191,124,219,35,191,36,36,37,191,253,106,38,191,2,176,39,191,48,243,40,191,132,52,42,191,250,115,43,191,143,177,44,191,63,237,45,191,7,39,47,191,227,94,48,191,208,148,49,191,202,200,50,191,206,250,51,191,218,42,53,191,232,88,54,191,247,132,55,191,2,175,56,191,7,215,57,191,3,253,58,191,241,32,60,191,207,66,61,191,154,98, |
| | | 62,191,79,128,63,191,233,155,64,191,104,181,65,191,198,204,66,191,1,226,67,191,23,245,68,191,3,6,70,191,196,20,71,191,86,33,72,191,182,43,73,191,225,51,74,191,212,57,75,191,141,61,76,191,9,63,77,191,68,62,78,191,61,59,79,191,240,53,80,191,90,46,81,191,121,36,82,191,74,24,83,191,202,9,84,191,247,248,84,191,206,229,85,191,77,208,86,191,112,184,87,191,55,158,88,191,156,129,89,191,160,98,90,191,62,65,91,191,117,29,92,191,65,247,92,191,162,206,93,191,148,163,94,191,20,118,95,191,34,70,96,191,186,19,97, |
| | | 191,217,222,97,191,127,167,98,191,169,109,99,191,84,49,100,191,126,242,100,191,38,177,101,191,73,109,102,191,229,38,103,191,248,221,103,191,128,146,104,191,123,68,105,191,232,243,105,191,195,160,106,191,12,75,107,191,192,242,107,191,222,151,108,191,100,58,109,191,80,218,109,191,160,119,110,191,83,18,111,191,102,170,111,191,217,63,112,191,169,210,112,191,213,98,113,191,91,240,113,191,58,123,114,191,113,3,115,191,253,136,115,191,222,11,116,191,17,140,116,191,150,9,117,191,107,132,117,191,143,252,117, |
| | | 191,0,114,118,191,189,228,118,191,198,84,119,191,24,194,119,191,178,44,120,191,147,148,120,191,187,249,120,191,40,92,121,191,217,187,121,191,205,24,122,191,2,115,122,191,121,202,122,191,47,31,123,191,36,113,123,191,88,192,123,191,201,12,124,191,118,86,124,191,95,157,124,191,130,225,124,191,224,34,125,191,119,97,125,191,71,157,125,191,79,214,125,191,142,12,126,191,4,64,126,191,176,112,126,191,146,158,126,191,169,201,126,191,245,241,126,191,117,23,127,191,41,58,127,191,16,90,127,191,43,119,127,191, |
| | | 120,145,127,191,248,168,127,191,170,189,127,191,143,207,127,191,165,222,127,191,237,234,127,191,102,244,127,191,17,251,127,191,237,254,127,191,234,255,127,63,229,248,127,63,166,230,127,63,45,201,127,63,124,160,127,63,149,108,127,63,121,45,127,63,44,227,126,63,177,141,126,63,11,45,126,63,63,193,125,63,82,74,125,63,72,200,124,63,40,59,124,63,247,162,123,63,189,255,122,63,128,81,122,63,72,152,121,63,30,212,120,63,9,5,120,63,19,43,119,63,70,70,118,63,172,86,117,63,78,92,116,63,56,87,115,63,118,71,114, |
| | | 63,19,45,113,63,28,8,112,63,158,216,110,63,165,158,109,63,64,90,108,63,126,11,107,63,107,178,105,63,25,79,104,63,150,225,102,63,242,105,101,63,62,232,99,63,139,92,98,63,234,198,96,63,109,39,95,63,38,126,93,63,40,203,91,63,133,14,90,63,83,72,88,63,163,120,86,63,139,159,84,63,32,189,82,63,118,209,80,63,163,220,78,63,189,222,76,63,219,215,74,63,19,200,72,63,124,175,70,63,46,142,68,63,65,100,66,63,206,49,64,63,236,246,61,63,180,179,59,63,66,104,57,63,173,20,55,63,16,185,52,63,134,85,50,63,41,234,47,63, |
| | | 21,119,45,63,101,252,42,63,53,122,40,63,161,240,37,63,198,95,35,63,192,199,32,63,172,40,30,63,169,130,27,63,212,213,24,63,74,34,22,63,42,104,19,63,147,167,16,63,164,224,13,63,123,19,11,63,57,64,8,63,253,102,5,63,231,135,2,63,45,70,255,62,91,113,249,62,151,145,243,62,36,167,237,62,69,178,231,62,60,179,225,62,76,170,219,62,186,151,213,62,201,123,207,62,190,86,201,62,223,40,195,62,112,242,188,62,183,179,182,62,251,108,176,62,129,30,170,62,146,200,163,62,115,107,157,62,108,7,151,62,197,156,144,62,199, |
| | | 43,138,62,185,180,131,62,199,111,122,62,33,107,109,62,17,92,96,62,41,67,83,62,253,32,70,62,32,246,56,62,38,195,43,62,164,136,30,62,45,71,17,62,87,255,3,62,110,99,237,61,194,189,210,61,218,14,184,61,222,87,157,61,251,153,130,61,188,172,79,61,101,28,26,61,153,10,201,60,42,167,59,60,193,120,214,186,45,68,113,188,87,215,227,188,76,129,39,189,148,15,93,189,21,74,137,189,90,6,164,189,109,187,190,189,34,104,217,189,78,11,244,189,227,81,7,190,47,152,20,190,247,215,33,190,165,16,47,190,166,65,60,190,100,106, |
| | | 73,190,77,138,86,190,205,160,99,190,80,173,112,190,69,175,125,190,13,83,133,190,158,200,139,190,13,56,146,190,18,161,152,190,102,3,159,190,191,94,165,190,216,178,171,190,105,255,177,190,43,68,184,190,216,128,190,190,42,181,196,190,219,224,202,190,165,3,209,190,69,29,215,190,117,45,221,190,241,51,227,190,118,48,233,190,192,34,239,190,141,10,245,190,155,231,250,190,211,92,0,191,56,64,3,191,219,29,6,191,155,245,8,191,90,199,11,191,247,146,14,191,84,88,17,191,80,23,20,191,205,207,22,191,172,129,25,191, |
| | | 208,44,28,191,26,209,30,191,109,110,33,191,171,4,36,191,183,147,38,191,116,27,41,191,199,155,43,191,147,20,46,191,187,133,48,191,38,239,50,191,183,80,53,191,85,170,55,191,227,251,57,191,74,69,60,191,110,134,62,191,55,191,64,191,139,239,66,191,83,23,69,191,117,54,71,191,218,76,73,191,107,90,75,191,16,95,77,191,179,90,79,191,62,77,81,191,154,54,83,191,179,22,85,191,114,237,86,191,197,186,88,191,149,126,90,191,208,56,92,191,98,233,93,191,56,144,95,191,64,45,97,191,103,192,98,191,156,73,100,191,206,200, |
| | | 101,191,235,61,103,191,227,168,104,191,167,9,106,191,39,96,107,191,84,172,108,191,31,238,109,191,122,37,111,191,88,82,112,191,171,116,113,191,103,140,114,191,127,153,115,191,231,155,116,191,149,147,117,191,126,128,118,191,150,98,119,191,212,57,120,191,47,6,121,191,158,199,121,191,23,126,122,191,148,41,123,191,13,202,123,191,122,95,124,191,213,233,124,191,24,105,125,191,62,221,125,191,64,70,126,191,28,164,126,191,204,246,126,191,77,62,127,191,156,122,127,191,182,171,127,191,153,209,127,191,67,236, |
| | | 127,191,180,251,127,191,166,255,127,63,148,227,127,63,156,154,127,63,204,36,127,63,56,130,126,63,253,178,125,63,63,183,124,63,42,143,123,63,243,58,122,63,212,186,120,63,17,15,119,63,246,55,117,63,213,53,115,63,8,9,113,63,241,177,110,63,249,48,108,63,144,134,105,63,47,179,102,63,83,183,99,63,132,147,96,63,78,72,93,63,69,214,89,63,3,62,86,63,43,128,82,63,101,157,78,63,94,150,74,63,204,107,70,63,106,30,66,63,249,174,61,63,64,30,57,63,13,109,52,63,50,156,47,63,135,172,42,63,235,158,37,63,63,116,32,63, |
| | | 109,45,27,63,97,203,21,63,13,79,16,63,104,185,10,63,107,11,5,63,46,140,254,62,221,212,242,62,241,242,230,62,127,232,218,62,166,183,206,62,136,98,194,62,78,235,181,62,42,84,169,62,81,159,156,62,253,206,143,62,109,229,130,62,206,201,107,62,98,159,81,62,48,80,55,62,211,224,28,62,241,85,2,62,98,104,207,61,124,0,154,61,36,251,72,61,27,164,187,60,243,119,86,187,100,61,241,188,187,192,99,189,103,93,167,189,20,189,220,189,3,251,8,190,115,127,35,190,52,231,61,190,164,45,88,190,38,78,114,190,18,34,134,190, |
| | | 137,5,147,190,52,207,159,190,213,124,172,190,51,12,185,190,26,123,197,190,91,199,209,190,205,238,221,190,80,239,233,190,199,198,245,190,144,185,0,191,38,121,6,191,36,33,12,191,141,176,17,191,102,38,23,191,186,129,28,191,152,193,33,191,21,229,38,191,74,235,43,191,86,211,48,191,91,156,53,191,131,69,58,191,253,205,62,191,252,52,67,191,188,121,71,191,125,155,75,191,132,153,79,191,31,115,83,191,161,39,87,191,99,182,90,191,198,30,94,191,48,96,97,191,15,122,100,191,216,107,103,191,7,53,106,191,31,213,108, |
| | | 191,169,75,111,191,55,152,113,191,98,186,115,191,201,177,117,191,22,126,119,191,246,30,121,191,33,148,122,191,85,221,123,191,89,250,124,191,250,234,125,191,14,175,126,191,116,70,127,191,15,177,127,191,206,238,127,191,0,0,0,0,0,0,0,0,3,0,0,0,2,0,0,0,3,0,0,0,2,0,0,0,5,0,0,0,2,0,0,0,3,0,0,0,2,0,0,0,3,0,0,0,2,0,0,0,5,0,0,0,2,0,0,0,3,0,0,0,2,0,0,0,0,0,206,64,0,0,200,64,0,0,184,64,0,0,170,64,0,0,162,64,0,0,154,64,0,0,144,64,0,0,140,64,0,0,156,64,0,0,150,64,0,0,146,64,0,0,142,64,0,0,156,64,0,0,148,64,0, |
| | | 0,138,64,0,0,144,64,0,0,140,64,0,0,148,64,0,0,152,64,0,0,142,64,0,0,112,64,0,0,112,64,0,0,112,64,0,0,112,64,0,0,112,64,0,134,107,63,0,20,46,63,0,112,189,62,0,208,76,62,0,0,102,63,0,0,76,63,0,0,38,63,0,0,0,63,15,0,0,0,10,0,0,0,5,0,0,0,6,0,0,0,4,0,0,0,3,0,0,0,191,104,0,0,199,104,0,0,215,104,0,0,247,104,0,0,255,104,0,0,15,105,0,0,47,105,0,0,87,105,0,0,167,105,0,0,71,106,0,0,79,106,0,0,95,106,0,0,32,0,10,0,20,46,100,1,130,106,0,0,194,107,0,0,2,108,0,0,20,108,0,0,180,108,0,0,252,108,0,0,134,95,0,0,32, |
| | | 0,16,0,102,38,171,1,68,109,0,0,68,111,0,0,132,111,0,0,162,111,0,0,162,112,0,0,234,112,0,0,156,95,0,0,0,0,0,0,64,31,0,0,184,36,0,0,236,44,0,0,188,52,0,0,92,68,0,0,168,97,0,0,128,56,1,0,0,0,0,0,40,35,0,0,224,46,0,0,164,56,0,0,68,72,0,0,180,95,0,0,172,138,0,0,128,56,1,0,0,0,0,0,4,41,0,0,176,54,0,0,104,66,0,0,252,83,0,0,84,111,0,0,16,164,0,0,128,56,1,0,77,113,0,0,80,113,0,0,10,103,242,14,86,205,228,29,10,103,242,14,117,82,130,12,89,154,4,25,117,82,130,12,70,17,49,10,237,3,98,20,70,17,49,10,218,2,215, |
| | | 7,249,198,173,15,218,2,215,7,34,182,82,5,218,250,164,10,34,182,82,5,70,243,46,30,43,227,75,14,31,102,128,24,28,44,29,10,218,97,72,18,237,156,244,6,236,48,19,11,227,144,165,4,237,164,29,2,10,223,107,3,48,117,0,0,112,23,0,0,32,209,255,255,32,209,255,255,0,64,0,0,108,34,0,0,66,15,0,0,18,6,0,0,77,2,0,0,219,0,0,0,237,0,0,0,153,0,0,0,73,0,0,0,30,0,0,0,12,0,0,0,7,0,0,0,0,64,0,0,147,93,0,0,189,112,0,0,237,121,0,0,178,125,0,0,36,127,0,0,0,250,0,0,128,62,0,0,160,140,0,0,128,62,0,0,248,42,0,0,232,3,0,0,176, |
| | | 54,0,0,232,3,0,0,8,82,0,0,208,7,0,0,96,109,0,0,208,7,0,0,224,46,0,0,232,3,0,0,80,70,0,0,208,7,0,0,8,82,0,0,208,7,0,0,48,117,0,0,208,7,0,0,248,42,0,0,232,3,0,0,176,54,0,0,232,3,0,0,104,66,0,0,232,3,0,0,8,82,0,0,208,7,0,0,224,46,0,0,232,3,0,0,152,58,0,0,232,3,0,0,80,70,0,0,208,7,0,0,240,85,0,0,208,7,0,0,230,90,52,56,119,78,51,57,211,217,201,57,146,145,51,58,204,96,140,58,97,251,201,58,153,126,9,59,203,128,51,59,213,37,99,59,119,46,140,59,168,138,169,59,69,184,201,59,135,166,236,59,232,46,9,60,174,102, |
| | | 29,60,247,2,51,60,147,255,73,60,79,88,98,60,94,17,124,60,46,145,139,60,189,199,153,60,92,172,168,60,243,60,184,60,129,121,200,60,238,95,217,60,57,240,234,60,99,42,253,60,53,7,8,61,16,204,17,61,205,228,27,61,97,80,38,61,203,14,49,61,0,31,60,61,254,128,71,61,198,52,83,61,63,56,95,61,105,139,107,61,69,46,120,61,105,144,130,61,123,48,137,61,224,247,143,61,138,229,150,61,123,249,157,61,177,51,165,61,33,147,172,61,80,24,180,61,51,194,187,61,79,145,195,61,18,132,203,61,2,155,211,61,31,214,219,61,215,51, |
| | | 228,61,175,180,236,61,33,88,245,61,168,29,254,61,161,130,3,62,242,6,8,62,199,155,12,62,221,64,17,62,52,246,21,62,69,187,26,62,17,144,31,62,84,116,36,62,203,103,41,62,51,106,46,62,141,123,51,62,82,155,56,62,197,201,61,62,28,6,67,62,89,80,72,62,122,168,77,62,183,13,83,62,82,128,88,62,8,0,94,62,84,140,99,62,242,36,105,62,37,202,110,62,36,123,116,62,172,55,122,62,0,0,128,62,171,233,130,62,249,216,133,62,133,205,136,62,80,199,139,62,55,198,142,62,247,201,145,62,179,210,148,62,38,224,151,62,15,242,154, |
| | | 62,108,8,158,62,28,35,161,62,255,65,164,62,208,100,167,62,177,139,170,62,28,182,173,62,84,228,176,62,211,21,180,62,186,74,183,62,232,130,186,62,249,189,189,62,13,252,192,62,226,60,196,62,86,128,199,62,71,198,202,62,149,14,206,62,251,88,209,62,122,165,212,62,241,243,215,62,28,68,219,62,217,149,222,62,8,233,225,62,167,61,229,62,83,147,232,62,12,234,235,62,175,65,239,62,28,154,242,62,14,243,245,62,136,76,249,62,34,166,252,62,0,0,0,63,239,172,1,63,188,89,3,63,121,6,5,63,242,178,6,63,41,95,8,63,250,10, |
| | | 10,63,86,182,11,63,44,97,13,63,124,11,15,63,19,181,16,63,242,93,18,63,8,6,20,63,67,173,21,63,130,83,23,63,182,248,24,63,220,156,26,63,213,63,28,63,143,225,29,63,249,129,31,63,4,33,33,63,140,190,34,63,163,90,36,63,23,245,37,63,214,141,39,63,242,36,41,63,40,186,42,63,152,77,44,63,1,223,45,63,114,110,47,63,202,251,48,63,249,134,50,63,237,15,52,63,167,150,53,63,4,27,55,63,229,156,56,63,88,28,58,63,61,153,59,63,131,19,61,63,42,139,62,63,0,0,64,63,21,114,65,63,55,225,66,63,119,77,68,63,195,182,69,63,235, |
| | | 28,71,63,254,127,72,63,236,223,73,63,146,60,75,63,225,149,76,63,234,235,77,63,121,62,79,63,143,141,80,63,43,217,81,63,29,33,83,63,115,101,84,63,13,166,85,63,235,226,86,63,252,27,88,63,47,81,89,63,115,130,90,63,201,175,91,63,14,217,92,63,67,254,93,63,88,31,95,63,75,60,96,63,252,84,97,63,106,105,98,63,133,121,99,63,60,133,100,63,160,140,101,63,126,143,102,63,214,141,103,63,186,135,104,63,246,124,105,63,156,109,106,63,138,89,107,63,209,64,108,63,79,35,109,63,4,1,110,63,241,217,110,63,243,173,111,63, |
| | | 28,125,112,63,73,71,113,63,124,12,114,63,180,204,114,63,240,135,115,63,16,62,116,63,19,239,116,63,250,154,117,63,179,65,118,63,63,227,118,63,141,127,119,63,173,22,120,63,126,168,120,63,1,53,121,63,52,188,121,63,24,62,122,63,157,186,122,63,194,49,123,63,119,163,123,63,187,15,124,63,159,118,124,63,2,216,124,63,244,51,125,63,101,138,125,63,68,219,125,63,179,38,126,63,143,108,126,63,235,172,126,63,163,231,126,63,218,28,127,63,127,76,127,63,129,118,127,63,2,155,127,63,208,185,127,63,28,211,127,63,197, |
| | | 230,127,63,203,244,127,63,47,253,127,63,0,0,128,63,2,0,0,0,4,0,0,0,6,0,0,0,8,0,0,0,10,0,0,0,12,0,0,0,14,0,0,0,16,0,0,0,20,0,0,0,24,0,0,0,28,0,0,0,32,0,0,0,40,0,0,0,48,0,0,0,56,0,0,0,68,0,0,0,80,0,0,0,96,0,0,0,120,0,0,0,1,0,0,0,2,0,0,0,4,0,0,0,6,0,0,0,8,0,0,0,10,0,0,0,12,0,0,0,14,0,0,0,16,0,0,0,20,0,0,0,24,0,0,0,28,0,0,0,32,0,0,0,40,0,0,0,48,0,0,0,56,0,0,0,68,0,0,0,80,0,0,0,96,0,0,0,120,0,0,0,160,0,0,0,200,0,0,0,0,0,128,62,0,0,128,62,0,0,128,62,0,0,128,62,0,0,128,62,0,0,128,62,0,0,128,62,0,0,128,62, |
| | | 0,0,128,62,0,0,128,62,0,0,128,62,0,0,128,62,0,0,128,62,0,0,128,62,0,0,128,62,0,0,128,62,208,37,180,62,151,57,173,62,9,165,159,62,250,237,139,62,205,172,101,62,248,169,42,62,52,48,210,61,90,241,13,61,90,241,13,189,52,48,210,189,248,169,42,190,205,172,101,190,250,237,139,190,9,165,159,190,151,57,173,190,208,37,180,190,135,138,177,62,27,131,150,62,96,35,73,62,196,66,141,61,196,66,141,189,96,35,73,190,27,131,150,190,135,138,177,190,135,138,177,190,27,131,150,190,96,35,73,190,196,66,141,189,196,66,141, |
| | | 61,96,35,73,62,27,131,150,62,135,138,177,62,151,57,173,62,205,172,101,62,90,241,13,61,248,169,42,190,9,165,159,190,208,37,180,190,250,237,139,190,52,48,210,189,52,48,210,61,250,237,139,62,208,37,180,62,9,165,159,62,248,169,42,62,90,241,13,189,205,172,101,190,151,57,173,190,125,61,167,62,210,139,10,62,210,139,10,190,125,61,167,190,125,61,167,190,210,139,10,190,210,139,10,62,125,61,167,62,125,61,167,62,210,139,10,62,210,139,10,190,125,61,167,190,125,61,167,190,210,139,10,190,210,139,10,62,125,61,167, |
| | | 62,9,165,159,62,90,241,13,61,250,237,139,190,151,57,173,190,52,48,210,189,205,172,101,62,208,37,180,62,248,169,42,62,248,169,42,190,208,37,180,190,205,172,101,190,52,48,210,61,151,57,173,62,250,237,139,62,90,241,13,189,9,165,159,190,27,131,150,62,196,66,141,189,135,138,177,190,96,35,73,190,96,35,73,62,135,138,177,62,196,66,141,61,27,131,150,190,27,131,150,190,196,66,141,61,135,138,177,62,96,35,73,62,96,35,73,190,135,138,177,190,196,66,141,189,27,131,150,62,250,237,139,62,248,169,42,190,151,57,173, |
| | | 190,90,241,13,61,208,37,180,62,52,48,210,61,9,165,159,190,205,172,101,190,205,172,101,62,9,165,159,62,52,48,210,189,208,37,180,190,90,241,13,189,151,57,173,62,248,169,42,62,250,237,139,190,0,0,0,0,5,193,35,61,233,125,163,61,37,150,244,61,226,116,34,62,172,28,74,62,221,37,113,62,52,186,139,62,180,119,158,62,228,191,176,62,173,136,194,62,37,201,211,62,24,122,228,62,24,149,244,62,200,10,2,63,28,124,9,63,73,157,16,63,202,109,23,63,192,237,29,63,159,29,36,63,84,254,41,63,46,145,47,63,224,215,52,63,99, |
| | | 212,57,63,240,136,62,63,211,247,66,63,171,35,71,63,23,15,75,63,216,188,78,63,173,47,82,63,106,106,85,63,206,111,88,63,154,66,91,63,142,229,93,63,75,91,96,63,110,166,98,63,100,201,100,63,155,198,102,63,111,160,104,63,247,88,106,63,128,242,107,63,223,110,109,63,11,208,110,63,202,23,112,63,224,71,113,63,225,97,114,63,77,103,115,63,150,89,116,63,12,58,117,63,255,9,118,63,138,202,118,63,187,124,119,63,192,33,120,63,98,186,120,63,157,71,121,63,75,202,121,63,36,67,122,63,242,178,122,63,59,26,123,63,200, |
| | | 121,123,63,32,210,123,63,200,35,124,63,55,111,124,63,242,180,124,63,94,245,124,63,224,48,125,63,236,103,125,63,183,154,125,63,180,201,125,63,6,245,125,63,17,29,126,63,24,66,126,63,78,100,126,63,211,131,126,63,253,160,126,63,237,187,126,63,195,212,126,63,179,235,126,63,239,0,127,63,135,20,127,63,141,38,127,63,67,55,127,63,170,70,127,63,227,84,127,63,15,98,127,63,47,110,127,63,100,121,127,63,190,131,127,63,63,141,127,63,24,150,127,63,56,158,127,63,194,165,127,63,163,172,127,63,16,179,127,63,245,184, |
| | | 127,63,119,190,127,63,114,195,127,63,25,200,127,63,108,204,127,63,91,208,127,63,6,212,127,63,111,215,127,63,131,218,127,63,102,221,127,63,21,224,127,63,130,226,127,63,205,228,127,63,230,230,127,63,205,232,127,63,146,234,127,63,70,236,127,63,200,237,127,63,40,239,127,63,120,240,127,63,166,241,127,63,195,242,127,63,191,243,127,63,186,244,127,63,148,245,127,63,94,246,127,63,39,247,127,63,207,247,127,63,119,248,127,63,253,248,127,63,148,249,127,63,9,250,127,63,127,250,127,63,244,250,127,63,89,251,127, |
| | | 63,173,251,127,63,1,252,127,63,84,252,127,63,152,252,127,63,219,252,127,63,30,253,127,63,80,253,127,63,130,253,127,63,181,253,127,63,231,253,127,63,9,254,127,63,59,254,127,63,93,254,127,63,126,254,127,63,143,254,127,63,176,254,127,63,210,254,127,63,227,254,127,63,244,254,127,63,21,255,127,63,38,255,127,63,55,255,127,63,71,255,127,63,88,255,127,63,88,255,127,63,105,255,127,63,122,255,127,63,122,255,127,63,139,255,127,63,155,255,127,63,155,255,127,63,155,255,127,63,172,255,127,63,172,255,127,63,189, |
| | | 255,127,63,189,255,127,63,189,255,127,63,206,255,127,63,206,255,127,63,206,255,127,63],"i8",4,y.h+10240); |
| | | O([206,255,127,63,206,255,127,63,222,255,127,63,222,255,127,63,222,255,127,63,222,255,127,63,222,255,127,63,222,255,127,63,239,255,127,63,239,255,127,63,239,255,127,63,239,255,127,63,239,255,127,63,239,255,127,63,239,255,127,63,239,255,127,63,239,255,127,63,239,255,127,63,239,255,127,63,239,255,127,63,239,255,127,63,0,0,128,63,0,0,128,63,0,0,128,63,0,0,128,63,0,0,128,63,0,0,128,63,0,0,128,63,0,0,128,63,0,0,128,63,0,0,128,63,0,0,128,63,3,0,0,0,148,80,0,0,160,80,0,0,25,0,0,0,15,0,0,0,2,0,0,0,14,190, |
| | | 192,189,172,31,155,190,149,130,26,191,150,149,70,190,84,114,62,190,146,3,26,191,6,152,62,189,2,160,234,189,182,43,212,189,185,114,30,191,106,190,162,190,28,7,46,190,107,243,143,189,90,158,23,62,33,173,209,62,10,102,12,63,125,60,188,62,20,33,253,190,143,169,67,63,8,119,235,191,10,243,46,62,117,147,76,65,80,83,139,191,108,236,162,191,181,21,130,193,28,107,193,65,162,98,178,192,255,231,48,190,47,79,39,190,158,206,101,190,255,87,194,189,155,60,149,189,203,248,135,190,44,97,205,189,203,33,83,189,64,166, |
| | | 21,190,238,35,247,189,160,253,56,190,219,167,3,62,233,95,226,62,213,202,252,190,29,203,43,62,231,168,83,62,1,79,74,190,247,3,214,62,71,119,192,63,173,249,69,191,64,164,32,193,43,194,205,62,192,178,62,64,201,118,115,65,100,204,241,191,39,165,152,191,23,204,233,60,134,193,132,187,201,232,144,61,84,72,7,60,154,231,189,189,103,71,42,188,59,137,140,187,159,122,160,187,88,90,145,189,85,196,39,187,169,11,34,61,177,219,103,62,241,54,5,61,52,17,38,62,170,10,205,189,86,185,248,62,108,4,2,62,86,102,146,62,228, |
| | | 254,126,60,106,251,215,61,159,142,67,64,136,70,147,63,57,40,129,191,71,90,234,191,139,84,84,64,210,53,91,192,13,253,243,189,232,39,38,189,25,31,226,59,241,90,147,60,171,170,28,189,237,238,195,59,5,106,150,188,246,141,249,58,37,201,19,190,106,115,50,189,210,214,129,58,161,100,98,62,158,210,17,62,128,215,247,62,221,12,207,62,124,15,3,63,250,242,114,190,55,139,119,62,47,110,179,62,183,13,51,191,136,99,38,65,18,165,41,64,83,208,27,192,53,7,134,192,125,150,135,63,60,247,218,63,12,212,218,59,186,186,147, |
| | | 189,191,192,34,189,69,144,20,61,38,112,235,189,208,37,193,188,210,156,6,60,124,58,104,188,114,11,7,189,31,26,17,189,171,204,53,59,154,208,148,190,218,230,146,191,140,104,163,190,89,193,47,191,163,233,188,62,64,50,245,62,253,245,58,62,163,119,210,190,8,144,97,63,39,107,147,192,33,31,188,63,224,243,171,62,161,214,232,191,245,91,241,193,8,172,177,64,252,177,255,58,106,21,253,189,37,245,148,189,41,102,131,189,252,233,90,189,35,134,221,189,20,249,191,189,43,237,142,189,75,171,225,188,167,236,68,190,122, |
| | | 110,225,189,172,28,146,62,105,170,207,190,7,203,189,61,35,101,147,190,201,231,89,191,252,194,203,189,212,95,111,190,111,129,164,191,13,108,145,63,155,201,71,64,187,39,143,189,66,91,238,191,113,201,41,64,120,238,233,192,26,168,28,64,135,138,146,186,54,152,129,189,127,33,26,189,138,114,25,190,229,100,18,62,247,202,60,62,113,202,252,61,117,220,154,61,70,65,240,61,200,40,191,61,71,193,141,61,22,144,172,61,175,81,144,61,27,166,113,61,173,246,192,61,61,209,229,190,92,47,215,60,148,107,138,62,106,78,134, |
| | | 190,98,186,48,62,49,37,0,64,133,9,35,190,99,96,29,61,26,81,35,65,182,248,132,64,7,206,21,192,120,99,97,189,79,18,30,60,98,186,16,190,8,223,224,60,187,222,12,61,136,166,71,189,97,152,194,61,35,245,253,187,158,146,24,189,185,155,179,187,187,236,135,189,45,182,196,61,230,206,76,190,12,24,41,189,251,87,22,63,48,68,83,61,142,172,172,62,218,226,90,63,93,26,43,63,202,82,235,189,178,75,104,192,37,89,239,190,177,164,92,190,57,98,39,64,145,238,207,62,180,142,174,191,203,61,46,61,20,5,250,61,210,98,191,61,67, |
| | | 4,252,61,160,165,11,61,155,226,17,190,245,130,15,61,15,250,72,189,55,41,150,61,113,52,108,61,83,235,253,61,185,215,83,189,147,139,129,190,69,47,23,63,113,89,21,62,238,95,161,62,207,217,98,62,177,168,24,190,79,89,93,62,127,251,178,190,253,135,196,65,161,131,126,191,11,66,29,63,242,82,150,193,27,76,53,192,69,128,55,191,84,196,177,190,253,130,245,62,128,238,123,190,215,96,155,61,137,150,12,62,211,19,54,190,185,51,243,61,46,253,141,186,175,7,115,190,129,34,182,62,33,7,5,190,218,78,96,189,101,28,163,190, |
| | | 21,171,166,190,107,211,56,62,171,31,128,189,183,155,16,62,40,41,176,62,24,207,192,62,95,126,23,191,102,247,186,64,170,241,194,190,46,56,99,62,239,172,181,191,48,108,229,201,122,170,171,63,218,31,232,60,27,113,55,189,162,59,173,188,127,121,210,188,9,192,100,60,236,86,170,60,101,102,48,188,198,207,53,60,202,13,112,61,62,180,207,188,178,134,6,189,121,35,243,61,78,38,94,190,247,62,21,62,230,93,245,61,106,111,187,189,198,21,247,189,41,83,161,189,106,23,19,190,134,89,24,191,188,116,147,191,198,109,160, |
| | | 191,181,224,149,191,42,227,138,64,64,26,110,201,249,102,175,191,204,76,36,189,13,168,87,62,141,239,11,190,159,57,11,62,64,87,86,189,28,28,54,61,199,207,107,60,239,56,135,59,170,27,158,188,226,177,95,62,162,178,225,189,236,163,1,192,165,17,107,63,28,8,29,192,134,3,153,63,184,86,123,189,48,18,246,191,186,192,157,62,172,202,254,62,42,144,105,63,102,75,86,62,147,24,22,192,95,94,12,64,39,20,207,192,144,78,217,63,169,161,57,191,112,218,66,60,77,206,26,61,109,235,98,61,109,130,185,60,243,67,144,189,93,3, |
| | | 246,188,182,124,73,60,72,233,136,187,62,158,140,189,125,64,0,61,219,50,32,61,194,108,186,62,242,165,193,189,126,80,188,60,194,81,50,190,228,218,168,62,44,239,234,61,112,182,153,62,62,33,219,61,18,136,7,62,8,148,185,64,125,118,104,63,80,195,103,191,88,202,86,192,248,56,67,62,207,161,60,62,50,116,44,191,208,94,109,62,213,29,112,189,65,74,108,62,216,101,224,190,240,193,123,62,23,72,48,190,182,123,179,61,121,115,56,191,85,106,38,62,85,187,139,60,143,114,208,61,117,230,198,62,213,38,170,63,2,241,138,63, |
| | | 108,177,111,191,51,167,23,192,66,9,215,192,144,102,92,192,241,215,8,64,116,181,99,65,82,68,157,64,20,203,69,192,16,18,27,193,252,170,68,191,164,228,229,63,75,35,97,61,17,82,39,62,16,59,163,61,253,223,12,61,211,175,99,189,237,178,165,187,217,102,153,60,110,201,5,61,34,162,189,60,175,119,31,62,154,15,67,61,75,120,130,190,151,255,204,63,210,28,77,191,119,132,35,64,65,213,60,63,19,102,174,191,221,9,50,191,71,90,28,192,62,174,221,191,131,250,124,64,205,1,242,63,101,224,248,62,75,89,53,193,128,147,112, |
| | | 74,249,75,195,190,126,29,248,61,94,44,104,191,249,20,60,64,51,196,209,63,231,255,97,63,2,213,95,63,45,207,155,63,46,226,95,191,166,182,164,62,93,249,72,63,160,81,114,63,134,55,19,191,62,203,93,192,34,137,98,63,173,62,189,61,144,131,30,193,116,93,200,62,10,242,35,62,170,43,3,192,240,167,132,64,210,22,140,61,58,60,20,190,123,16,146,190,69,44,194,62,116,70,148,191,167,29,227,188,154,153,29,193,16,93,154,192,51,167,109,64,139,224,119,64,26,163,97,64,0,64,202,69,27,76,255,82,130,90,179,98,162,107,96,117, |
| | | 0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,10,0,12,0,14,0,16,0,20,0,24,0,28,0,34,0,40,0,48,0,60,0,78,0,100,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,8,0,8,0,8,0,16,0,16,0,16,0,21,0,21,0,24,0,29,0,34,0,36,0,0,0,96,0,192,0,32,1,128,1,32,0,128,0,224,0,64,1,160,1,64,0,160,0,0,1,96,1,192,1,8,0,104,0,200,0,40,1,136,1,40,0,136,0,232,0,72,1,168,1,72,0,168,0,8,1,104,1,200,1,16,0,112,0,208,0,48,1,144,1,48,0,144,0,240,0,80,1,176,1,80,0,176,0,16,1,112,1,208,1,24,0,120,0,216,0,56,1,152,1,56,0,152,0,248,0,88,1,184,1,88,0, |
| | | 184,0,24,1,120,1,216,1,4,0,100,0,196,0,36,1,132,1,36,0,132,0,228,0,68,1,164,1,68,0,164,0,4,1,100,1,196,1,12,0,108,0,204,0,44,1,140,1,44,0,140,0,236,0,76,1,172,1,76,0,172,0,12,1,108,1,204,1,20,0,116,0,212,0,52,1,148,1,52,0,148,0,244,0,84,1,180,1,84,0,180,0,20,1,116,1,212,1,28,0,124,0,220,0,60,1,156,1,60,0,156,0,252,0,92,1,188,1,92,0,188,0,28,1,124,1,220,1,1,0,97,0,193,0,33,1,129,1,33,0,129,0,225,0,65,1,161,1,65,0,161,0,1,1,97,1,193,1,9,0,105,0,201,0,41,1,137,1,41,0,137,0,233,0,73,1,169,1,73,0,169, |
| | | 0,9,1,105,1,201,1,17,0,113,0,209,0,49,1,145,1,49,0,145,0,241,0,81,1,177,1,81,0,177,0,17,1,113,1,209,1,25,0,121,0,217,0,57,1,153,1,57,0,153,0,249,0,89,1,185,1,89,0,185,0,25,1,121,1,217,1,5,0,101,0,197,0,37,1,133,1,37,0,133,0,229,0,69,1,165,1,69,0,165,0,5,1,101,1,197,1,13,0,109,0,205,0,45,1,141,1,45,0,141,0,237,0,77,1,173,1,77,0,173,0,13,1,109,1,205,1,21,0,117,0,213,0,53,1,149,1,53,0,149,0,245,0,85,1,181,1,85,0,181,0,21,1,117,1,213,1,29,0,125,0,221,0,61,1,157,1,61,0,157,0,253,0,93,1,189,1,93,0,189, |
| | | 0,29,1,125,1,221,1,2,0,98,0,194,0,34,1,130,1,34,0,130,0,226,0,66,1,162,1,66,0,162,0,2,1,98,1,194,1,10,0,106,0,202,0,42,1,138,1,42,0,138,0,234,0,74,1,170,1,74,0,170,0,10,1,106,1,202,1,18,0,114,0,210,0,50,1,146,1,50,0,146,0,242,0,82,1,178,1,82,0,178,0,18,1,114,1,210,1,26,0,122,0,218,0,58,1,154,1,58,0,154,0,250,0,90,1,186,1,90,0,186,0,26,1,122,1,218,1,6,0,102,0,198,0,38,1,134,1,38,0,134,0,230,0,70,1,166,1,70,0,166,0,6,1,102,1,198,1,14,0,110,0,206,0,46,1,142,1,46,0,142,0,238,0,78,1,174,1,78,0,174,0,14, |
| | | 1,110,1,206,1,22,0,118,0,214,0,54,1,150,1,54,0,150,0,246,0,86,1,182,1,86,0,182,0,22,1,118,1,214,1,30,0,126,0,222,0,62,1,158,1,62,0,158,0,254,0,94,1,190,1,94,0,190,0,30,1,126,1,222,1,3,0,99,0,195,0,35,1,131,1,35,0,131,0,227,0,67,1,163,1,67,0,163,0,3,1,99,1,195,1,11,0,107,0,203,0,43,1,139,1,43,0,139,0,235,0,75,1,171,1,75,0,171,0,11,1,107,1,203,1,19,0,115,0,211,0,51,1,147,1,51,0,147,0,243,0,83,1,179,1,83,0,179,0,19,1,115,1,211,1,27,0,123,0,219,0,59,1,155,1,59,0,155,0,251,0,91,1,187,1,91,0,187,0,27,1, |
| | | 123,1,219,1,7,0,103,0,199,0,39,1,135,1,39,0,135,0,231,0,71,1,167,1,71,0,167,0,7,1,103,1,199,1,15,0,111,0,207,0,47,1,143,1,47,0,143,0,239,0,79,1,175,1,79,0,175,0,15,1,111,1,207,1,23,0,119,0,215,0,55,1,151,1,55,0,151,0,247,0,87,1,183,1,87,0,183,0,23,1,119,1,215,1,31,0,127,0,223,0,63,1,159,1,63,0,159,0,255,0,95,1,191,1,95,0,191,0,31,1,127,1,223,1,0,0,48,0,96,0,144,0,192,0,16,0,64,0,112,0,160,0,208,0,32,0,80,0,128,0,176,0,224,0,4,0,52,0,100,0,148,0,196,0,20,0,68,0,116,0,164,0,212,0,36,0,84,0,132,0,180, |
| | | 0,228,0,8,0,56,0,104,0,152,0,200,0,24,0,72,0,120,0,168,0,216,0,40,0,88,0,136,0,184,0,232,0,12,0,60,0,108,0,156,0,204,0,28,0,76,0,124,0,172,0,220,0,44,0,92,0,140,0,188,0,236,0,1,0,49,0,97,0,145,0,193,0,17,0,65,0,113,0,161,0,209,0,33,0,81,0,129,0,177,0,225,0,5,0,53,0,101,0,149,0,197,0,21,0,69,0,117,0,165,0,213,0,37,0,85,0,133,0,181,0,229,0,9,0,57,0,105,0,153,0,201,0,25,0,73,0,121,0,169,0,217,0,41,0,89,0,137,0,185,0,233,0,13,0,61,0,109,0,157,0,205,0,29,0,77,0,125,0,173,0,221,0,45,0,93,0,141,0,189,0, |
| | | 237,0,2,0,50,0,98,0,146,0,194,0,18,0,66,0,114,0,162,0,210,0,34,0,82,0,130,0,178,0,226,0,6,0,54,0,102,0,150,0,198,0,22,0,70,0,118,0,166,0,214,0,38,0,86,0,134,0,182,0,230,0,10,0,58,0,106,0,154,0,202,0,26,0,74,0,122,0,170,0,218,0,42,0,90,0,138,0,186,0,234,0,14,0,62,0,110,0,158,0,206,0,30,0,78,0,126,0,174,0,222,0,46,0,94,0,142,0,190,0,238,0,3,0,51,0,99,0,147,0,195,0,19,0,67,0,115,0,163,0,211,0,35,0,83,0,131,0,179,0,227,0,7,0,55,0,103,0,151,0,199,0,23,0,71,0,119,0,167,0,215,0,39,0,87,0,135,0,183,0,231, |
| | | 0,11,0,59,0,107,0,155,0,203,0,27,0,75,0,123,0,171,0,219,0,43,0,91,0,139,0,187,0,235,0,15,0,63,0,111,0,159,0,207,0,31,0,79,0,127,0,175,0,223,0,47,0,95,0,143,0,191,0,239,0,0,0,24,0,48,0,72,0,96,0,8,0,32,0,56,0,80,0,104,0,16,0,40,0,64,0,88,0,112,0,4,0,28,0,52,0,76,0,100,0,12,0,36,0,60,0,84,0,108,0,20,0,44,0,68,0,92,0,116,0,1,0,25,0,49,0,73,0,97,0,9,0,33,0,57,0,81,0,105,0,17,0,41,0,65,0,89,0,113,0,5,0,29,0,53,0,77,0,101,0,13,0,37,0,61,0,85,0,109,0,21,0,45,0,69,0,93,0,117,0,2,0,26,0,50,0,74,0,98,0,10, |
| | | 0,34,0,58,0,82,0,106,0,18,0,42,0,66,0,90,0,114,0,6,0,30,0,54,0,78,0,102,0,14,0,38,0,62,0,86,0,110,0,22,0,46,0,70,0,94,0,118,0,3,0,27,0,51,0,75,0,99,0,11,0,35,0,59,0,83,0,107,0,19,0,43,0,67,0,91,0,115,0,7,0,31,0,55,0,79,0,103,0,15,0,39,0,63,0,87,0,111,0,23,0,47,0,71,0,95,0,119,0,0,0,12,0,24,0,36,0,48,0,4,0,16,0,28,0,40,0,52,0,8,0,20,0,32,0,44,0,56,0,1,0,13,0,25,0,37,0,49,0,5,0,17,0,29,0,41,0,53,0,9,0,21,0,33,0,45,0,57,0,2,0,14,0,26,0,38,0,50,0,6,0,18,0,30,0,42,0,54,0,10,0,22,0,34,0,46,0,58,0,3,0,15, |
| | | 0,27,0,39,0,51,0,7,0,19,0,31,0,43,0,55,0,11,0,23,0,35,0,47,0,59,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,41,0,41,0,41,0,82,0,82,0,123,0,164,0,200,0,222,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,0,41,0,41,0,41,0,123,0,123,0,123,0,164,0,164,0,240,0,10,1,27,1,39,1,41,0,41,0,41,0,41,0,41,0,41,0,41,0,41,0,123,0,123,0,123,0,123,0,240,0,240,0,240,0,10,1,10,1,49,1,62,1,72,1,80,1,123,0,123,0,123,0,123,0,123,0,123,0,123,0,123,0,240,0,240,0,240,0,240,0,49,1,49,1,49,1,62,1, |
| | | 62,1,87,1,95,1,102,1,108,1,240,0,240,0,240,0,240,0,240,0,240,0,240,0,240,0,49,1,49,1,49,1,49,1,87,1,87,1,87,1,95,1,95,1,114,1,120,1,126,1,131,1,184,126,154,121,154,121,102,102,184,126,51,115,16,48,250,0,3,0,6,0,3,0,3,0,3,0,4,0,3,0,3,0,3,0,205,1,100,0,3,0,40,0,3,0,3,0,3,0,5,0,14,0,14,0,10,0,11,0,3,0,8,0,9,0,7,0,3,0,91,1,18,0,29,0,38,0,40,0,46,0,52,0,62,0,84,0,92,202,190,216,182,223,154,226,156,230,120,236,122,244,204,252,52,3,134,11,136,19,100,25,102,29,74,32,66,39,164,53,100,0,240,0,32,0,100,0,205, |
| | | 60,0,48,0,32,30,161,36,42,0,32,254,31,246,31,234,31,216,31,194,31,168,31,136,31,98,31,58,31,10,31,216,30,160,30,98,30,34,30,220,29,144,29,66,29,238,28,150,28,58,28,216,27,114,27,10,27,156,26,42,26,180,25,58,25,188,24,60,24,182,23,46,23,160,22,16,22,126,21,232,20,78,20,176,19,16,19,110,18,200,17,30,17,116,16,198,15,22,15,100,14,174,13,248,12,64,12,132,11,200,10,10,10,74,9,138,8,198,7,2,7,62,6,120,5,178,4,234,3,34,3,90,2,146,1,202,0,0,0,54,255,110,254,166,253,222,252,22,252,78,251,136,250,194,249,254, |
| | | 248,58,248,118,247,182,246,246,245,56,245,124,244,192,243,8,243,82,242,156,241,234,240,58,240,140,239,226,238,56,238,146,237,240,236,80,236,178,235,24,235,130,234,240,233,96,233,210,232,74,232,196,231,68,231,198,230,76,230,214,229,100,229,246,228,142,228,40,228,198,227,106,227,18,227,190,226,112,226,36,226,222,225,158,225,96,225,40,225,246,224,198,224,158,224,120,224,88,224,62,224,40,224,22,224,10,224,2,224,0,224,210,6,138,58,171,152,198,26,169,100,246,216,42,175,213,201,207,255,64,0,17,0,99,255, |
| | | 97,1,16,254,163,0,39,43,189,86,217,255,6,0,91,0,86,255,186,0,23,0,128,252,192,24,216,77,237,255,220,255,102,0,167,255,232,255,72,1,73,252,8,10,37,62,135,199,61,201,64,0,128,0,134,255,36,0,54,1,0,253,72,2,51,36,69,69,12,0,128,0,18,0,114,255,32,1,139,255,159,252,27,16,123,56,104,2,13,200,246,255,39,0,58,0,210,255,172,255,120,0,184,0,197,254,227,253,4,5,4,21,64,35,230,62,198,196,243,255,0,0,20,0,26,0,5,0,225,255,213,255,252,255,65,0,90,0,7,0,99,255,8,255,212,255,81,2,47,6,52,10,199,12,228,87,5,197,3, |
| | | 0,242,255,236,255,241,255,2,0,25,0,37,0,25,0,240,255,185,255,149,255,177,255,50,0,36,1,111,2,214,3,8,5,184,5,148,107,103,196,17,0,12,0,8,0,1,0,246,255,234,255,226,255,224,255,234,255,3,0,44,0,100,0,168,0,243,0,61,1,125,1,173,1,199,1,19,245,149,230,89,18,243,41,31,6,84,32,189,0,168,253,105,2,103,119,117,0,97,255,210,251,8,116,52,0,221,0,168,246,116,110,252,255,17,2,234,242,229,102,208,255,246,2,140,240,165,93,176,255,137,3,117,239,6,83,157,255,204,3,130,239,102,71,149,255,199,3,139,240,39,59,153,255, |
| | | 128,3,97,242,174,46,165,255,5,3,207,244,94,34,185,255,99,2,161,247,152,22,210,255,169,1,161,250,180,11,0,1,1,1,2,3,3,3,2,3,3,3,2,3,3,3,0,3,12,15,48,51,60,63,192,195,204,207,240,243,252,255,0,255,0,255,0,255,0,255,0,255,0,254,1,0,1,255,0,254,0,253,2,0,1,255,0,254,0,253,3,0,1,255,117,110,107,110,111,119,110,32,101,114,114,111,114,0,115,117,99,99,101,115,115,0,105,110,118,97,108,105,100,32,97,114,103,117,109,101,110,116,0,98,117,102,102,101,114,32,116,111,111,32,115,109,97,108,108,0,105,110,116,101, |
| | | 114,110,97,108,32,101,114,114,111,114,0,99,111,114,114,117,112,116,101,100,32,115,116,114,101,97,109,0,114,101,113,117,101,115,116,32,110,111,116,32,105,109,112,108,101,109,101,110,116,101,100,0,105,110,118,97,108,105,100,32,115,116,97,116,101,0,109,101,109,111,114,121,32,97,108,108,111,99,97,116,105,111,110,32,102,97,105,108,101,100,0,108,105,98,111,112,117,115,32,49,46,49,46,50,0,2,1,0,255,255,156,110,86,70,59,51,45,40,37,33,31,28,26,25,23,22,21,20,19,18,17,16,16,15,15,14,13,13,12,12,12,12,11,11, |
| | | 11,10,10,10,9,9,9,9,9,9,8,8,8,8,8,7,7,7,7,7,7,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,25,23,2,0,126,124,119,109,87,41,19,9,4,2,0,2,1,0,25,23,2,0,126,124,119,109,87,41,19,9,4,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,90,80,75,69,63,56,49,40,34,29,20,18,10,0,0,0,0,0,0,0,0,110,100,90,84,78,71,65,58,51,45,39,32,26,20,12,0,0,0,0,0,0,118,110,103,93,86,80,75,70,65,59,53,47,40,31,23,15,4,0,0,0,0,126, |
| | | 119,112,104,95,89,83,78,72,66,60,54,47,39,32,25,17,12,1,0,0,134,127,120,114,103,97,91,85,78,72,66,60,54,47,41,35,29,23,16,10,1,144,137,130,124,113,107,101,95,88,82,76,70,64,57,51,45,39,33,26,15,1,152,145,138,132,123,117,111,105,98,92,86,80,74,67,61,55,49,43,36,20,1,162,155,148,142,133,127,121,115,108,102,96,90,84,77,71,65,59,53,46,30,1,172,165,158,152,143,137,131,125,118,112,106,100,94,87,81,75,69,63,56,45,20,200,200,200,200,200,200,200,200,198,193,188,183,178,173,168,163,158,153,148,129,104,40,7, |
| | | 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,40,15,23,28,31,34,36,38,39,41,42,43,44,45,46,47,47,49,50,51,52,53,54,55,55,57,58,59,60,61,62,63,63,65,66,67,68,69,70,71,71,40,20,33,41,48,53,57,61,64,66,69,71,73,75,76,78,80,82,85,87,89,91,92,94,96,98,101,103,105,107,108,110,112,114,117,119,121,123,124,126,128,40,23,39,51,60,67,73,79,83,87,91,94,97,100,102,105,107,111,115,118,121,124,126,129,131,135,139,142,145,148,150,153,155,159,163,166,169,172,174,177,179,35,28,49,65, |
| | | 78,89,99,107,114,120,126,132,136,141,145,149,153,159,165,171,176,180,185,189,192,199,205,211,216,220,225,229,232,239,245,251,21,33,58,79,97,112,125,137,148,157,166,174,182,189,195,201,207,217,227,235,243,251,17,35,63,86,106,123,139,152,165,177,187,197,206,214,222,230,237,250,25,31,55,75,91,105,117,128,138,146,154,161,168,174,180,185,190,200,208,215,222,229,235,240,245,255,16,36,65,89,110,128,144,159,173,185,196,207,217,226,234,242,250,11,41,74,103,128,151,172,191,209,225,241,255,9,43,79,110,138,163, |
| | | 186,207,227,246,12,39,71,99,123,144,164,182,198,214,228,241,253,9,44,81,113,142,168,192,214,235,255,7,49,90,127,160,191,220,247,6,51,95,134,170,203,234,7,47,87,123,155,184,212,237,6,52,97,137,174,208,240,5,57,106,151,192,231,5,59,111,158,202,243,5,55,103,147,187,224,5,60,113,161,206,248,4,65,122,175,224,4,67,127,182,234,224,224,224,224,224,224,224,224,160,160,160,160,185,185,185,178,178,168,134,61,37,224,224,224,224,224,224,224,224,240,240,240,240,207,207,207,198,198,183,144,66,40,160,160,160,160, |
| | | 160,160,160,160,185,185,185,185,193,193,193,183,183,172,138,64,38,240,240,240,240,240,240,240,240,207,207,207,207,204,204,204,193,193,180,143,66,40,185,185,185,185,185,185,185,185,193,193,193,193,193,193,193,183,183,172,138,65,39,207,207,207,207,207,207,207,207,204,204,204,204,201,201,201,188,188,176,141,66,40,193,193,193,193,193,193,193,193,193,193,193,193,194,194,194,184,184,173,139,65,39,204,204,204,204,204,204,204,204,201,201,201,201,198,198,198,187,187,175,140,66,40,72,127,65,129,66,128,65,128, |
| | | 64,128,62,128,64,128,64,128,92,78,92,79,92,78,90,79,116,41,115,40,114,40,132,26,132,26,145,17,161,12,176,10,177,11,24,179,48,138,54,135,54,132,53,134,56,133,55,132,55,132,61,114,70,96,74,88,75,88,87,74,89,66,91,67,100,59,108,50,120,40,122,37,97,43,78,50,83,78,84,81,88,75,86,74,87,71,90,73,93,74,93,74,109,40,114,36,117,34,117,34,143,17,145,18,146,19,162,12,165,10,178,7,189,6,190,8,177,9,23,178,54,115,63,102,66,98,69,99,74,89,71,91,73,91,78,89,86,80,92,66,93,64,102,59,103,60,104,60,117,52,123,44,138, |
| | | 35,133,31,97,38,77,45,61,90,93,60,105,42,107,41,110,45,116,38,113,38,112,38,124,26,132,27,136,19,140,20,155,14,159,16,158,18,170,13,177,10,187,8,192,6,175,9,159,10,21,178,59,110,71,86,75,85,84,83,91,66,88,73,87,72,92,75,98,72,105,58,107,54,115,52,114,55,112,56,129,51,132,40,150,33,140,29,98,35,77,42,42,121,96,66,108,43,111,40,117,44,123,32,120,36,119,33,127,33,134,34,139,21,147,23,152,20,158,25,154,26,166,21,173,16,184,13,184,10,150,13,139,15,22,178,63,114,74,82,84,83,92,82,103,62,96,72,96,67,101, |
| | | 73,107,72,113,55,118,52,125,52,118,52,117,55,135,49,137,39,157,32,145,29,97,33,77,40,2,1,0,0,8,13,16,19,21,23,24,26,27,28,29,30,31,32,32,33,34,34,35,36,36,37,37,224,112,44,15,3,2,1,0,254,237,192,132,70,23,4,0,255,252,226,155,61,11,2,0,250,245,234,203,71,50,42,38,35,33,31,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0,179,99,0,71,56,43,30,21,12,6,0,199,165,144,124,109,96,84,71,61,51,42,32,23,15,8,0,241,225,211,199,187,175,164,153,142,132,123,114,105,96,88,80,72,64, |
| | | 57,50,44,38,33,29,24,20,16,12,9,5,2,0,15,131,138,138,155,155,173,173,69,93,115,118,131,138,141,138,150,150,155,150,155,160,166,160,131,128,134,141,141,141,145,145,145,150,155,155,155,155,160,160,160,160,166,166,173,173,182,192,182,192,192,192,205,192,205,224,4,6,24,7,5,0,0,2,0,0,12,28,41,13,252,247,15,42,25,14,1,254,62,41,247,246,37,65,252,3,250,4,66,7,248,16,14,38,253,33,13,22,39,23,12,255,36,64,27,250,249,10,55,43,17,1,1,8,1,1,6,245,74,53,247,244,55,76,244,8,253,3,93,27,252,26,39,59,3,248,2,0,77, |
| | | 11,9,248,22,44,250,7,40,9,26,3,9,249,20,101,249,4,3,248,42,26,0,241,33,68,2,23,254,55,46,254,15,3,255,21,16,41,250,27,61,39,5,245,42,88,4,1,254,60,65,6,252,255,251,73,56,1,247,19,94,29,247,0,12,99,6,4,8,237,102,46,243,3,2,13,3,2,9,235,84,72,238,245,46,104,234,8,18,38,48,23,0,240,70,83,235,11,5,245,117,22,248,250,23,117,244,3,3,248,95,28,4,246,15,77,60,241,255,4,124,2,252,3,38,84,24,231,2,13,42,13,31,21,252,56,46,255,255,35,79,243,19,249,65,88,247,242,20,4,81,49,227,20,0,75,3,239,5,247,44,92,248,1, |
| | | 253,22,69,31,250,95,41,244,5,39,67,16,252,1,0,250,120,55,220,243,44,122,4,232,81,5,11,3,7,2,0,9,10,88,46,2,90,87,93,91,82,98,109,120,118,12,113,115,117,119,99,59,87,111,63,111,112,80,126,124,125,124,129,121,126,23,132,127,127,127,126,127,122,133,130,134,101,118,119,145,126,86,124,120,123,119,170,173,107,109,8,16,32,12,35,60,83,108,132,157,180,206,228,15,32,55,77,101,125,151,175,201,225,19,42,66,89,114,137,162,184,209,230,12,25,50,72,97,120,147,172,200,223,26,44,69,90,114,135,159,180,205,225,13,22, |
| | | 53,80,106,130,156,180,205,228,15,25,44,64,90,115,142,168,196,222,19,24,62,82,100,120,145,168,190,214,22,31,50,79,103,120,151,170,203,227,21,29,45,65,106,124,150,171,196,224,30,49,75,97,121,142,165,186,209,229,19,25,52,70,93,116,143,166,192,219,26,34,62,75,97,118,145,167,194,217,25,33,56,70,91,113,143,165,196,223,21,34,51,72,97,117,145,171,196,222,20,29,50,67,90,117,144,168,197,221,22,31,48,66,95,117,146,168,196,222,24,33,51,77,116,134,158,180,200,224,21,28,70,87,106,124,149,170,194,217,26,33,53,64, |
| | | 83,117,152,173,204,225,27,34,65,95,108,129,155,174,210,225,20,26,72,99,113,131,154,176,200,219,34,43,61,78,93,114,155,177,205,229,23,29,54,97,124,138,163,179,209,229,30,38,56,89,118,129,158,178,200,231,21,29,49,63,85,111,142,163,193,222,27,48,77,103,133,158,179,196,215,232,29,47,74,99,124,151,176,198,220,237,33,42,61,76,93,121,155,174,207,225,29,53,87,112,136,154,170,188,208,227,24,30,52,84,131,150,166,186,203,229,37,48,64,84,104,118,156,177,201,230,212,178,148,129,108,96,85,82,79,77,61,59,57,56, |
| | | 51,49,48,45,42,41,40,38,36,34,31,30,21,12,10,3,1,0,255,245,244,236,233,225,217,203,190,176,175,161,149,136,125,114,102,91,81,71,60,52,43,35,28,20,19,18,12,11,5,0,179,138,140,148,151,149,153,151,163,116,67,82,59,92,72,100,89,92,16,0,0,0,0,99,66,36,36,34,36,34,34,34,34,83,69,36,52,34,116,102,70,68,68,176,102,68,68,34,65,85,68,84,36,116,141,152,139,170,132,187,184,216,137,132,249,168,185,139,104,102,100,68,68,178,218,185,185,170,244,216,187,187,170,244,187,187,219,138,103,155,184,185,137,116,183,155, |
| | | 152,136,132,217,184,184,170,164,217,171,155,139,244,169,184,185,170,164,216,223,218,138,214,143,188,218,168,244,141,136,155,170,168,138,220,219,139,164,219,202,216,137,168,186,246,185,139,116,185,219,185,138,100,100,134,100,102,34,68,68,100,68,168,203,221,218,168,167,154,136,104,70,164,246,171,137,139,137,155,218,219,139,255,254,253,238,14,3,2,1,0,255,254,252,218,35,3,2,1,0,255,254,250,208,59,4,2,1,0,255,254,246,194,71,10,2,1,0,255,252,236,183,82,8,2,1,0,255,252,235,180,90,17,2,1,0,255,248,224,171, |
| | | 97,30,4,1,0,255,254,236,173,95,37,7,1,0,255,255,255,131,6,145,255,255,255,255,255,236,93,15,96,255,255,255,255,255,194,83,25,71,221,255,255,255,255,162,73,34,66,162,255,255,255,210,126,73,43,57,173,255,255,255,201,125,71,48,58,130,255,255,255,166,110,73,57,62,104,210,255,255,251,123,65,55,68,100,171,255,7,23,38,54,69,85,100,116,131,147,162,178,193,208,223,239,13,25,41,55,69,83,98,112,127,142,157,171,187,203,220,236,15,21,34,51,61,78,92,106,126,136,152,167,185,205,225,240,10,21,36,50,63,79,95,110, |
| | | 126,141,157,173,189,205,221,237,17,20,37,51,59,78,89,107,123,134,150,164,184,205,224,240,10,15,32,51,67,81,96,112,129,142,158,173,189,204,220,236,8,21,37,51,65,79,98,113,126,138,155,168,179,192,209,218,12,15,34,55,63,78,87,108,118,131,148,167,185,203,219,236,16,19,32,36,56,79,91,108,118,136,154,171,186,204,220,237,11,28,43,58,74,89,105,120,135,150,165,180,196,211,226,241,6,16,33,46,60,75,92,107,123,137,156,169,185,199,214,225,11,19,30,44,57,74,89,105,121,135,152,169,186,202,218,234,12,19,29,46,57, |
| | | 71,88,100,120,132,148,165,182,199,216,233,17,23,35,46,56,77,92,106,123,134,152,167,185,204,222,237,14,17,45,53,63,75,89,107,115,132,151,171,188,206,221,240,9,16,29,40,56,71,88,103,119,137,154,171,189,205,222,237,16,19,36,48,57,76,87,105,118,132,150,167,185,202,218,236,12,17,29,54,71,81,94,104,126,136,149,164,182,201,221,237,15,28,47,62,79,97,115,129,142,155,168,180,194,208,223,238,8,14,30,45,62,78,94,111,127,143,159,175,192,207,223,239,17,30,49,62,79,92,107,119,132,145,160,174,190,204,220,235,14, |
| | | 19,36,45,61,76,91,108,121,138,154,172,189,205,222,238,12,18,31,45,60,76,91,107,123,138,154,171,187,204,221,236,13,17,31,43,53,70,83,103,114,131,149,167,185,203,220,237,17,22,35,42,58,78,93,110,125,139,155,170,188,206,224,240,8,15,34,50,67,83,99,115,131,146,162,178,193,209,224,239,13,16,41,66,73,86,95,111,128,137,150,163,183,206,225,241,17,25,37,52,63,75,92,102,119,132,144,160,175,191,212,231,19,31,49,65,83,100,117,133,147,161,174,187,200,213,227,242,18,31,52,68,88,103,117,126,138,149,163,177,192, |
| | | 207,223,239,16,29,47,61,76,90,106,119,133,147,161,176,193,209,224,240,15,21,35,50,61,73,86,97,110,119,129,141,175,198,218,237,225,204,201,184,183,175,158,154,153,135,119,115,113,110,109,99,98,95,79,68,52,50,48,45,43,32,31,27,18,10,3,0,255,251,235,230,212,201,196,182,167,166,163,151,138,124,110,104,90,78,76,70,69,57,45,34,24,21,11,6,5,4,3,0,175,148,160,176,178,173,174,164,177,174,196,182,198,192,182,68,62,66,60,72,117,85,90,118,136,151,142,160,142,155,0,0,0,0,0,0,0,1,100,102,102,68,68,36,34,96,164, |
| | | 107,158,185,180,185,139,102,64,66,36,34,34,0,1,32,208,139,141,191,152,185,155,104,96,171,104,166,102,102,102,132,1,0,0,0,0,16,16,0,80,109,78,107,185,139,103,101,208,212,141,139,173,153,123,103,36,0,0,0,0,0,0,1,48,0,0,0,0,0,0,32,68,135,123,119,119,103,69,98,68,103,120,118,118,102,71,98,134,136,157,184,182,153,139,134,208,168,248,75,189,143,121,107,32,49,34,34,34,0,17,2,210,235,139,123,185,137,105,134,98,135,104,182,100,183,171,134,100,70,68,70,66,66,34,131,64,166,102,68,36,2,1,0,134,166,102,68,34, |
| | | 34,66,132,212,246,158,139,107,107,87,102,100,219,125,122,137,118,103,132,114,135,137,105,171,106,50,34,164,214,141,143,185,151,121,103,192,34,0,0,0,0,0,1,208,109,74,187,134,249,159,137,102,110,154,118,87,101,119,101,0,2,0,36,36,66,68,35,96,164,102,100,36,0,2,33,167,138,174,102,100,84,2,2,100,107,120,119,36,197,24,0,255,254,253,244,12,3,2,1,0,255,254,252,224,38,3,2,1,0,255,254,251,209,57,4,2,1,0,255,254,244,195,69,4,2,1,0,255,251,232,184,84,7,2,1,0,255,254,240,186,86,14,2,1,0,255,254,239,178,91,30, |
| | | 5,1,0,255,248,227,177,100,19,2,1,0,255,255,255,156,4,154,255,255,255,255,255,227,102,15,92,255,255,255,255,255,213,83,24,72,236,255,255,255,255,150,76,33,63,214,255,255,255,190,121,77,43,55,185,255,255,255,245,137,71,43,59,139,255,255,255,255,131,66,50,66,107,194,255,255,166,116,76,55,53,125,255,255,249,247,246,245,244,234,210,202,201,200,197,174,82,59,56,55,54,46,22,12,11,10,9,7,0,64,0,203,150,0,215,195,166,125,110,82,0,120,0,128,64,0,232,158,10,0,230,0,243,221,192,181,0,171,85,0,192,128,64,0,205, |
| | | 154,102,51,0,213,171,128,85,43,0,224,192,160,128,96,64,32,0,100,40,16,7,3,1,0,253,250,244,233,212,182,150,131,120,110,98,85,72,60,49,40,32,25,19,15,13,11,9,8,7,6,5,4,3,2,1,0,210,208,206,203,199,193,183,168,142,104,74,52,37,27,20,14,10,6,4,2,0,223,201,183,167,152,138,124,111,98,88,79,70,62,56,50,44,39,35,31,27,24,21,18,16,14,12,10,8,6,4,3,2,1,0,188,176,155,138,119,97,67,43,26,10,0,165,119,80,61,47,35,27,20,14,9,4,0,113,63,0,8,10,12,16,125,51,26,18,15,12,11,10,9,8,7,6,5,4,3,2,1,0,198,105,45,22,15,12, |
| | | 11,10,9,8,7,6,5,4,3,2,1,0,213,162,116,83,59,43,32,24,18,15,12,9,7,6,5,3,2,0,239,187,116,59,28,16,11,10,9,8,7,6,5,4,3,2,1,0,250,229,188,135,86,51,30,19,13,10,8,6,5,4,3,2,1,0,249,235,213,185,156,128,103,83,66,53,42,33,26,21,17,13,10,0,254,249,235,206,164,118,77,46,27,16,10,7,5,4,3,2,1,0,255,253,249,239,220,191,156,119,85,57,37,23,15,10,6,4,2,0,255,253,251,246,237,223,203,179,152,124,98,75,55,40,29,21,15,0,255,254,253,247,220,162,106,67,42,28,18,12,9,6,4,3,2,0,31,57,107,160,205,205,255,255,255,255,255, |
| | | 255,255,255,255,255,255,255,69,47,67,111,166,205,255,255,255,255,255,255,255,255,255,255,255,255,82,74,79,95,109,128,145,160,173,205,205,205,224,255,255,224,255,224,125,74,59,69,97,141,182,255,255,255,255,255,255,255,255,255,255,255,173,115,85,73,76,92,115,145,173,205,224,224,255,255,255,255,255,255,166,134,113,102,101,102,107,118,125,138,145,155,166,182,192,192,205,150,224,182,134,101,83,79,85,97,120,145,173,205,224,255,255,255,255,255,255,224,192,150,120,101,92,89,93,102,118,134,160,182,192,224, |
| | | 224,224,255,224,224,182,155,134,118,109,104,102,106,111,118,131,145,160,173,131,241,190,178,132,87,74,41,14,0,223,193,157,140,106,57,39,18,0,131,74,141,79,80,138,95,104,134,95,99,91,125,93,76,123,115,123,128,0,214,42,0,235,128,21,0,244,184,72,11,0,248,214,128,42,7,0,248,225,170,80,25,5,0,251,236,198,126,54,18,3,0,250,238,211,159,82,35,15,5,0,250,231,203,168,128,88,53,25,6,0,252,238,216,185,148,108,71,40,18,4,0,253,243,225,199,166,128,90,57,31,13,3,0,254,246,233,212,183,147,109,73,44,23,10,2,0,255, |
| | | 250,240,223,198,166,128,90,58,33,16,6,1,0,255,251,244,231,210,181,146,110,75,46,25,12,5,1,0,255,253,248,238,221,196,164,128,92,60,35,18,8,3,1,0,255,253,249,242,229,208,180,146,110,76,48,27,14,7,3,1,0,129,0,207,50,0,236,129,20,0,245,185,72,10,0,249,213,129,42,6,0,250,226,169,87,27,4,0,251,233,194,130,62,20,4,0,250,236,207,160,99,47,17,3,0,255,240,217,182,131,81,41,11,1,0,255,254,233,201,159,107,61,20,2,1,0,255,249,233,206,170,128,86,50,23,7,1,0,255,250,238,217,186,148,108,70,39,18,6,1,0,255,252,243, |
| | | 226,200,166,128,90,56,30,13,4,1,0,255,252,245,231,209,180,146,110,76,47,25,11,4,1,0,255,253,248,237,219,194,163,128,93,62,37,19,8,3,1,0,255,254,250,241,226,205,177,145,111,79,51,30,15,6,2,1,0,129,0,203,54,0,234,129,23,0,245,184,73,10,0,250,215,129,41,5,0,252,232,173,86,24,3,0,253,240,200,129,56,15,2,0,253,244,217,164,94,38,10,1,0,253,245,226,189,132,71,27,7,1,0,253,246,231,203,159,105,56,23,6,1,0,255,248,235,213,179,133,85,47,19,5,1,0,255,254,243,221,194,159,117,70,37,12,2,1,0,255,254,248,234,208, |
| | | 171,128,85,48,22,8,2,1,0,255,254,250,240,220,189,149,107,67,36,16,6,2,1,0,255,254,251,243,227,201,166,128,90,55,29,13,5,2,1,0,255,254,252,246,234,213,183,147,109,73,43,22,10,4,2,1,0,130,0,200,58,0,231,130,26,0,244,184,76,12,0,249,214,130,43,6,0,252,232,173,87,24,3,0,253,241,203,131,56,14,2,0,254,246,221,167,94,35,8,1,0,254,249,232,193,130,65,23,5,1,0,255,251,239,211,162,99,45,15,4,1,0,255,251,243,223,186,131,74,33,11,3,1,0,255,252,245,230,202,158,105,57,24,8,2,1,0,255,253,247,235,214,179,132,84,44, |
| | | 19,7,2,1,0,255,254,250,240,223,196,159,112,69,36,15,6,2,1,0,255,254,253,245,231,209,176,136,93,55,27,11,3,2,1,0,255,254,253,252,239,221,194,158,117,76,42,18,4,3,2,1,0,0,0,2,5,9,14,20,27,35,44,54,65,77,90,104,119,135,254,49,67,77,82,93,99,198,11,18,24,31,36,45,255,46,66,78,87,94,104,208,14,21,32,42,51,66,255,94,104,109,112,115,118,248,53,69,80,88,95,102,0,15,8,7,4,11,12,3,2,13,10,5,6,9,14,1,0,9,6,3,4,5,8,1,2,7,0,1,0,0,0,1,0,0,1,255,1,255,2,254,2,254,3,253,0,1,0,1,255,2,255,2,254,3,254,3,253,7,254, |
| | | 7,0,2,255,255,255,0,0,1,1,0,1,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,255,2,1,0,1,1,0,0,255,255,0,0,1,255,0,1,255,0,255,1,254,2,254,254,2,253,2,3,253,252,3,252,4,4,251,5,250,251,6,249,6,5,8,247,0,0,1,0,0,0,0,0,0,0,255,1,0,0,1,255,0,1,255,255,1,255,2,1,255,2,254,254,2,254,2,2,3,253,0,1,0,0,0,0,0,0,1,0,1,0,0,1,255,1,0,0,2,1,255,2,255,255,2,255,2,2,255,3,254,254,254,3,0,1,0,0,1,0,1,255,2,255,2,255,2,3,254,3,254,254,4,4,253,5,253,252,6,252,6,5,251,8,250,251,249,9,251,8,255,6,255,6,252,10,250,10, |
| | | 254,6,255,6,251,10,247,12,253,7,254,7,249,13,16,24,34,6,0,3,0,7,3,0,1,10,0,2,6,18,10,12,4,0,2,0,0,0,9,4,7,4,0,3,12,7,7,255,255],"i8",4,y.h+20480);var Na=z,z=z+16;function Oa(a){b.___errno_location&&(M[b.___errno_location()>>2]=a);return a}b._i64Add=Pa;b._bitshift64Ashr=Qa;b._memset=Ra;b._memcpy=Sa;var Ta=ha;function S(a){S.a||(E=wa(),S.a=!0,assert(y.b),S.u=y.b,y.b=function(){G("cannot dynamically allocate, sbrk now has control")});var c=E;return 0==a||S.u(a)?c:4294967295} |
| | | function Y(){Y.a||(Y.a=[]);Y.a.push(y.g());return Y.a.length-1}b._memmove=Ua; |
| | | var Aa=x=y.p(z),na=!0,Ba=Aa+Ca,E=y.p(Ba),Va=O([8,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,7,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1, |
| | | 0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0],"i8",3);b.s={Math:Math,Int8Array:Int8Array,Int16Array:Int16Array,Int32Array:Int32Array,Uint8Array:Uint8Array,Uint16Array:Uint16Array,Uint32Array:Uint32Array,Float32Array:Float32Array,Float64Array:Float64Array,NaN:NaN,Infinity:Infinity}; |
| | | b.t={abort:G,assert:assert,invoke_viiiiiii:function(a,c,d,e,g,k,h,A){try{b.dynCall_viiiiiii(a,c,d,e,g,k,h,A)}catch(m){if("number"!==typeof m&&"longjmp"!==m)throw m;Z.setThrew(1,0)}},_llvm_pow_f64:La,_pthread_self:function(){return 0},_abort:function(){b.abort()},___setErrNo:Oa,_llvm_stacksave:Y,_sbrk:S,_time:function(a){var c=Date.now()/1E3|0;a&&(M[a>>2]=c);return c},_llvm_fabs_f64:Ta,_emscripten_memcpy_big:function(a,c,d){R.set(R.subarray(c,c+d),a);return a},_llvm_stackrestore:function(a){var c= |
| | | Y.a[a];Y.a.splice(a,1);y.c(c)},_sysconf:function(a){switch(a){case 30:return 4096;case 85:return U/4096;case 132:case 133:case 12:case 137:case 138:case 15:case 235:case 16:case 17:case 18:case 19:case 20:case 149:case 13:case 10:case 236:case 153:case 9:case 21:case 22:case 159:case 154:case 14:case 77:case 78:case 139:case 80:case 81:case 82:case 68:case 67:case 164:case 11:case 29:case 47:case 48:case 95:case 52:case 51:case 46:return 200809;case 79:return 0;case 27:case 246:case 127:case 128:case 23:case 24:case 160:case 161:case 181:case 182:case 242:case 183:case 184:case 243:case 244:case 245:case 165:case 178:case 179:case 49:case 50:case 168:case 169:case 175:case 170:case 171:case 172:case 97:case 76:case 32:case 173:case 35:return-1; |
| | | case 176:case 177:case 7:case 155:case 8:case 157:case 125:case 126:case 92:case 93:case 129:case 130:case 131:case 94:case 91:return 1;case 74:case 60:case 69:case 70:case 4:return 1024;case 31:case 42:case 72:return 32;case 87:case 26:case 33:return 2147483647;case 34:case 1:return 47839;case 38:case 36:return 99;case 43:case 37:return 2048;case 0:return 2097152;case 3:return 65536;case 28:return 32768;case 44:return 32767;case 75:return 16384;case 39:return 1E3;case 89:return 700;case 71:return 256; |
| | | case 40:return 255;case 2:return 100;case 180:return 64;case 25:return 20;case 5:return 16;case 6:return 6;case 73:return 4;case 84:return"object"===typeof navigator?navigator.hardwareConcurrency||1:1}Oa(22);return-1},STACKTOP:x,STACK_MAX:Ba,tempDoublePtr:Na,ABORT:H,cttz_i8:Va};// EMSCRIPTEN_START_ASM |
| | | var Z=(function(global,env,buffer) { |
| | | "use asm";var a=new global.Int8Array(buffer);var b=new global.Int16Array(buffer);var c=new global.Int32Array(buffer);var d=new global.Uint8Array(buffer);var e=new global.Uint16Array(buffer);var f=new global.Uint32Array(buffer);var g=new global.Float32Array(buffer);var h=new global.Float64Array(buffer);var i=env.STACKTOP|0;var j=env.STACK_MAX|0;var k=env.tempDoublePtr|0;var l=env.ABORT|0;var m=env.cttz_i8|0;var n=0;var o=0;var p=0;var q=0;var r=global.NaN,s=global.Infinity;var t=0,u=0,v=0,w=0,x=0.0,y=0,z=0,A=0,B=0.0;var C=0;var D=0;var E=0;var F=0;var G=0;var H=0;var I=0;var J=0;var K=0;var L=0;var M=global.Math.floor;var N=global.Math.abs;var O=global.Math.sqrt;var P=global.Math.pow;var Q=global.Math.cos;var R=global.Math.sin;var S=global.Math.tan;var T=global.Math.acos;var U=global.Math.asin;var V=global.Math.atan;var W=global.Math.atan2;var X=global.Math.exp;var Y=global.Math.log;var Z=global.Math.ceil;var _=global.Math.imul;var $=global.Math.min;var aa=global.Math.clz32;var ba=env.abort;var ca=env.assert;var da=env.invoke_viiiiiii;var ea=env._llvm_pow_f64;var fa=env._pthread_self;var ga=env._abort;var ha=env.___setErrNo;var ia=env._llvm_stacksave;var ja=env._sbrk;var ka=env._time;var la=env._llvm_fabs_f64;var ma=env._emscripten_memcpy_big;var na=env._llvm_stackrestore;var oa=env._sysconf;var pa=0.0; |
| | | // EMSCRIPTEN_START_FUNCS |
| | | function Lb(a,d,e,f,h,j,k){a=a|0;d=d|0;e=e|0;f=f|0;h=h|0;j=j|0;k=k|0;var l=0,m=0.0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ja=0,ka=0,la=0,ma=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0;ta=i;i=i+304|0;X=ta+288|0;Y=ta+284|0;l=ta+280|0;Z=ta+276|0;$=ta+272|0;aa=ta+268|0;ba=ta+264|0;ca=ta+260|0;ha=ta+256|0;ka=ta+252|0;ga=ta+248|0;M=ta+244|0;B=ta+240|0;n=ta+192|0;C=ta+184|0;ra=ta+176|0;ua=ta+168|0;oa=ta+164|0;pa=ta+160|0;qa=ta+156|0;V=ta+152|0;K=ta+148|0;Q=ta+144|0;q=ta+140|0;fa=ta+136|0;O=ta+132|0;P=ta+128|0;sa=ta+124|0;ja=ta+120|0;I=ta+116|0;G=ta+112|0;A=ta+108|0;T=ta+104|0;S=ta+100|0;J=ta+96|0;H=ta+92|0;z=ta+88|0;F=ta+84|0;y=ta+80|0;s=ta+76|0;U=ta+72|0;E=ta+68|0;D=ta+64|0;L=ta+60|0;N=ta+56|0;la=ta+52|0;ma=ta+48|0;R=ta+44|0;u=ta+40|0;p=ta+36|0;o=ta+32|0;da=ta+28|0;x=ta+24|0;w=ta+20|0;t=ta+16|0;r=ta+12|0;v=ta+8|0;W=ta+4|0;ea=ta;c[Y>>2]=a;c[l>>2]=d;c[Z>>2]=e;c[$>>2]=f;c[aa>>2]=h;c[ba>>2]=j;c[ca>>2]=k;c[fa>>2]=c[(c[Y>>2]|0)+8>>2];c[J>>2]=0;c[H>>2]=0;c[D>>2]=0;c[N>>2]=c[(c[Y>>2]|0)+12>>2];c[la>>2]=c[c[Y>>2]>>2];c[ma>>2]=c[(c[la>>2]|0)+8>>2];c[R>>2]=c[(c[la>>2]|0)+4>>2];c[u>>2]=c[(c[la>>2]|0)+32>>2];c[sa>>2]=c[(c[Y>>2]|0)+20>>2];c[ja>>2]=c[(c[Y>>2]|0)+24>>2];c[aa>>2]=_(c[aa>>2]|0,c[(c[Y>>2]|0)+16>>2]|0)|0;c[ua>>2]=(c[Y>>2]|0)+84+((_(2048+(c[R>>2]|0)|0,c[fa>>2]|0)|0)<<2);c[oa>>2]=(c[ua>>2]|0)+((c[fa>>2]|0)*24<<2);c[pa>>2]=(c[oa>>2]|0)+(c[ma>>2]<<1<<2);c[qa>>2]=(c[pa>>2]|0)+(c[ma>>2]<<1<<2);c[V>>2]=(c[qa>>2]|0)+(c[ma>>2]<<1<<2);c[O>>2]=0;while(1){if((c[O>>2]|0)>(c[(c[la>>2]|0)+36>>2]|0))break;if((c[(c[la>>2]|0)+44>>2]<<c[O>>2]|0)==(c[aa>>2]|0))break;c[O>>2]=(c[O>>2]|0)+1}if((c[O>>2]|0)>(c[(c[la>>2]|0)+36>>2]|0)){c[X>>2]=-1;ua=c[X>>2]|0;i=ta;return ua|0}c[P>>2]=1<<c[O>>2];if((c[Z>>2]|0)<0|(c[Z>>2]|0)>1275|(c[$>>2]|0)==0){c[X>>2]=-1;ua=c[X>>2]|0;i=ta;return ua|0}c[ga>>2]=_(c[P>>2]|0,c[(c[la>>2]|0)+44>>2]|0)|0;c[ha>>2]=0;do{ua=(c[Y>>2]|0)+84+((_(c[ha>>2]|0,2048+(c[R>>2]|0)|0)|0)<<2)|0;c[C+(c[ha>>2]<<2)>>2]=ua;c[ra+(c[ha>>2]<<2)>>2]=(c[C+(c[ha>>2]<<2)>>2]|0)+8192+(0-(c[ga>>2]|0)<<2);ua=(c[ha>>2]|0)+1|0;c[ha>>2]=ua}while((ua|0)<(c[fa>>2]|0));c[I>>2]=c[ja>>2];if((c[I>>2]|0)>(c[(c[la>>2]|0)+12>>2]|0))c[I>>2]=c[(c[la>>2]|0)+12>>2];if((c[l>>2]|0)==0|(c[Z>>2]|0)<=1){Mb(c[Y>>2]|0,c[ga>>2]|0,c[O>>2]|0);Pb(ra,c[$>>2]|0,c[ga>>2]|0,c[fa>>2]|0,c[(c[Y>>2]|0)+16>>2]|0,(c[la>>2]|0)+16|0,(c[Y>>2]|0)+76|0,c[ca>>2]|0);c[X>>2]=(c[aa>>2]|0)/(c[(c[Y>>2]|0)+16>>2]|0)|0;ua=c[X>>2]|0;i=ta;return ua|0}if(!(c[ba>>2]|0)){Yb(n,c[l>>2]|0,c[Z>>2]|0);c[ba>>2]=n}a:do if((c[N>>2]|0)==1){c[ka>>2]=0;while(1){if((c[ka>>2]|0)>=(c[ma>>2]|0))break a;if(+g[(c[oa>>2]|0)+(c[ka>>2]<<2)>>2]>+g[(c[oa>>2]|0)+((c[ma>>2]|0)+(c[ka>>2]|0)<<2)>>2])m=+g[(c[oa>>2]|0)+(c[ka>>2]<<2)>>2];else m=+g[(c[oa>>2]|0)+((c[ma>>2]|0)+(c[ka>>2]|0)<<2)>>2];g[(c[oa>>2]|0)+(c[ka>>2]<<2)>>2]=m;c[ka>>2]=(c[ka>>2]|0)+1}}while(0);c[z>>2]=c[Z>>2]<<3;c[y>>2]=Qb(c[ba>>2]|0)|0;do if((c[y>>2]|0)<(c[z>>2]|0))if((c[y>>2]|0)==1){c[L>>2]=dc(c[ba>>2]|0,15)|0;break}else{c[L>>2]=0;break}else c[L>>2]=1;while(0);if(c[L>>2]|0){c[y>>2]=c[Z>>2]<<3;a=c[y>>2]|0;a=a-(Qb(c[ba>>2]|0)|0)|0;ua=(c[ba>>2]|0)+20|0;c[ua>>2]=(c[ua>>2]|0)+a}g[S>>2]=0.0;c[T>>2]=0;c[U>>2]=0;if((c[sa>>2]|0)==0?((c[y>>2]|0)+16|0)<=(c[z>>2]|0):0){if(dc(c[ba>>2]|0,1)|0){c[o>>2]=fc(c[ba>>2]|0,6)|0;ua=16<<c[o>>2];c[T>>2]=ua+(gc(c[ba>>2]|0,4+(c[o>>2]|0)|0)|0)-1;c[p>>2]=gc(c[ba>>2]|0,3)|0;ua=(Qb(c[ba>>2]|0)|0)+2|0;if((ua|0)<=(c[z>>2]|0))c[U>>2]=ec(c[ba>>2]|0,25575,2)|0;g[S>>2]=+((c[p>>2]|0)+1|0)*.09375}c[y>>2]=Qb(c[ba>>2]|0)|0}if((c[O>>2]|0)>0?((c[y>>2]|0)+3|0)<=(c[z>>2]|0):0){c[Q>>2]=dc(c[ba>>2]|0,3)|0;c[y>>2]=Qb(c[ba>>2]|0)|0}else c[Q>>2]=0;if(c[Q>>2]|0)c[K>>2]=c[P>>2];else c[K>>2]=0;if(((c[y>>2]|0)+3|0)<=(c[z>>2]|0))l=dc(c[ba>>2]|0,3)|0;else l=0;c[q>>2]=l;fd(c[la>>2]|0,c[sa>>2]|0,c[ja>>2]|0,c[oa>>2]|0,c[q>>2]|0,c[ba>>2]|0,c[N>>2]|0,c[O>>2]|0);ua=c[ma>>2]|0;c[da>>2]=ia()|0;e=i;i=i+((1*(ua<<2)|0)+15&-16)|0;Rb(c[sa>>2]|0,c[ja>>2]|0,c[Q>>2]|0,e,c[O>>2]|0,c[ba>>2]|0);c[y>>2]=Qb(c[ba>>2]|0)|0;c[M>>2]=2;if(((c[y>>2]|0)+4|0)<=(c[z>>2]|0))c[M>>2]=ec(c[ba>>2]|0,25578,5)|0;n=i;i=i+((1*(c[ma>>2]<<2)|0)+15&-16)|0;eb(c[la>>2]|0,n,c[O>>2]|0,c[N>>2]|0);h=i;i=i+((1*(c[ma>>2]<<2)|0)+15&-16)|0;c[s>>2]=6;c[z>>2]=c[z>>2]<<3;c[y>>2]=Xb(c[ba>>2]|0)|0;c[ka>>2]=c[sa>>2];while(1){if((c[ka>>2]|0)>=(c[ja>>2]|0))break;l=_(c[N>>2]|0,(b[(c[u>>2]|0)+((c[ka>>2]|0)+1<<1)>>1]|0)-(b[(c[u>>2]|0)+(c[ka>>2]<<1)>>1]|0)|0)|0;c[x>>2]=l<<c[O>>2];l=c[x>>2]|0;if((c[x>>2]<<3|0)<((48>(c[x>>2]|0)?48:c[x>>2]|0)|0))l=l<<3;else l=48>(l|0)?48:c[x>>2]|0;c[w>>2]=l;c[t>>2]=c[s>>2];c[r>>2]=0;while(1){if(((c[y>>2]|0)+(c[t>>2]<<3)|0)>=(c[z>>2]|0))break;if((c[r>>2]|0)>=(c[n+(c[ka>>2]<<2)>>2]|0))break;c[v>>2]=dc(c[ba>>2]|0,c[t>>2]|0)|0;c[y>>2]=Xb(c[ba>>2]|0)|0;if(!(c[v>>2]|0))break;c[r>>2]=(c[r>>2]|0)+(c[w>>2]|0);c[z>>2]=(c[z>>2]|0)-(c[w>>2]|0);c[t>>2]=1}c[h+(c[ka>>2]<<2)>>2]=c[r>>2];if((c[r>>2]|0)>0)c[s>>2]=2>((c[s>>2]|0)-1|0)?2:(c[s>>2]|0)-1|0;c[ka>>2]=(c[ka>>2]|0)+1}j=i;i=i+((1*(c[ma>>2]<<2)|0)+15&-16)|0;if(((c[y>>2]|0)+48|0)<=(c[z>>2]|0))l=ec(c[ba>>2]|0,25582,7)|0;else l=5;c[A>>2]=l;ua=c[Z>>2]<<3<<3;c[B>>2]=ua-(Xb(c[ba>>2]|0)|0)-1;if((c[Q>>2]|0)!=0&(c[O>>2]|0)>=2)l=(c[B>>2]|0)>=((c[O>>2]|0)+2<<3|0);else l=0;c[E>>2]=l?8:0;c[B>>2]=(c[B>>2]|0)-(c[E>>2]|0);k=i;i=i+((1*(c[ma>>2]<<2)|0)+15&-16)|0;d=i;i=i+((1*(c[ma>>2]<<2)|0)+15&-16)|0;c[G>>2]=jd(c[la>>2]|0,c[sa>>2]|0,c[ja>>2]|0,h,n,c[A>>2]|0,J,H,c[B>>2]|0,F,k,j,d,c[N>>2]|0,c[O>>2]|0,c[ba>>2]|0,0,0,0)|0;gd(c[la>>2]|0,c[sa>>2]|0,c[ja>>2]|0,c[oa>>2]|0,j,c[ba>>2]|0,c[N>>2]|0);c[ha>>2]=0;do{qj(c[C+(c[ha>>2]<<2)>>2]|0,(c[C+(c[ha>>2]<<2)>>2]|0)+(c[ga>>2]<<2)|0,(2048-(c[ga>>2]|0)+((c[R>>2]|0)/2|0)<<2)+0|0)|0;ua=(c[ha>>2]|0)+1|0;c[ha>>2]=ua}while((ua|0)<(c[fa>>2]|0));ua=_(c[N>>2]|0,c[ma>>2]|0)|0;l=i;i=i+((1*ua|0)+15&-16)|0;ua=(_(c[N>>2]|0,c[ga>>2]|0)|0)<<2;n=i;i=i+((1*ua|0)+15&-16)|0;Ka(0,c[la>>2]|0,c[sa>>2]|0,c[ja>>2]|0,n,(c[N>>2]|0)==2?n+(c[ga>>2]<<2)|0:0,l,0,k,c[K>>2]|0,c[M>>2]|0,c[H>>2]|0,c[J>>2]|0,e,(c[Z>>2]<<6)-(c[E>>2]|0)|0,c[F>>2]|0,c[ba>>2]|0,c[O>>2]|0,c[G>>2]|0,(c[Y>>2]|0)+36|0,c[(c[Y>>2]|0)+32>>2]|0);if((c[E>>2]|0)>0)c[D>>2]=gc(c[ba>>2]|0,1)|0;H=c[la>>2]|0;J=c[sa>>2]|0;K=c[ja>>2]|0;M=c[oa>>2]|0;ua=c[Z>>2]<<3;ua=ua-(Qb(c[ba>>2]|0)|0)|0;hd(H,J,K,M,j,d,ua,c[ba>>2]|0,c[N>>2]|0);if(c[D>>2]|0)Ga(c[la>>2]|0,n,l,c[O>>2]|0,c[N>>2]|0,c[ga>>2]|0,c[sa>>2]|0,c[ja>>2]|0,c[oa>>2]|0,c[pa>>2]|0,c[qa>>2]|0,k,c[(c[Y>>2]|0)+36>>2]|0,c[(c[Y>>2]|0)+32>>2]|0);b:do if(c[L>>2]|0){c[ka>>2]=0;while(1){if((c[ka>>2]|0)>=(_(c[N>>2]|0,c[ma>>2]|0)|0))break b;g[(c[oa>>2]|0)+(c[ka>>2]<<2)>>2]=-28.0;c[ka>>2]=(c[ka>>2]|0)+1}}while(0);Nb(c[la>>2]|0,n,ra,c[oa>>2]|0,c[sa>>2]|0,c[I>>2]|0,c[N>>2]|0,c[fa>>2]|0,c[Q>>2]|0,c[O>>2]|0,c[(c[Y>>2]|0)+16>>2]|0,c[L>>2]|0,c[(c[Y>>2]|0)+32>>2]|0);c[ha>>2]=0;do{if((c[(c[Y>>2]|0)+52>>2]|0)>15)l=c[(c[Y>>2]|0)+52>>2]|0;else l=15;c[(c[Y>>2]|0)+52>>2]=l;if((c[(c[Y>>2]|0)+56>>2]|0)>15)l=c[(c[Y>>2]|0)+56>>2]|0;else l=15;c[(c[Y>>2]|0)+56>>2]=l;cb(c[ra+(c[ha>>2]<<2)>>2]|0,c[ra+(c[ha>>2]<<2)>>2]|0,c[(c[Y>>2]|0)+56>>2]|0,c[(c[Y>>2]|0)+52>>2]|0,c[(c[la>>2]|0)+44>>2]|0,+g[(c[Y>>2]|0)+64>>2],+g[(c[Y>>2]|0)+60>>2],c[(c[Y>>2]|0)+72>>2]|0,c[(c[Y>>2]|0)+68>>2]|0,c[(c[la>>2]|0)+60>>2]|0,c[R>>2]|0,c[(c[Y>>2]|0)+32>>2]|0);if(c[O>>2]|0)cb((c[ra+(c[ha>>2]<<2)>>2]|0)+(c[(c[la>>2]|0)+44>>2]<<2)|0,(c[ra+(c[ha>>2]<<2)>>2]|0)+(c[(c[la>>2]|0)+44>>2]<<2)|0,c[(c[Y>>2]|0)+52>>2]|0,c[T>>2]|0,(c[ga>>2]|0)-(c[(c[la>>2]|0)+44>>2]|0)|0,+g[(c[Y>>2]|0)+60>>2],+g[S>>2],c[(c[Y>>2]|0)+68>>2]|0,c[U>>2]|0,c[(c[la>>2]|0)+60>>2]|0,c[R>>2]|0,c[(c[Y>>2]|0)+32>>2]|0);ua=(c[ha>>2]|0)+1|0;c[ha>>2]=ua}while((ua|0)<(c[fa>>2]|0));c[(c[Y>>2]|0)+56>>2]=c[(c[Y>>2]|0)+52>>2];g[(c[Y>>2]|0)+64>>2]=+g[(c[Y>>2]|0)+60>>2];c[(c[Y>>2]|0)+72>>2]=c[(c[Y>>2]|0)+68>>2];c[(c[Y>>2]|0)+52>>2]=c[T>>2];g[(c[Y>>2]|0)+60>>2]=+g[S>>2];c[(c[Y>>2]|0)+68>>2]=c[U>>2];if(c[O>>2]|0){c[(c[Y>>2]|0)+56>>2]=c[(c[Y>>2]|0)+52>>2];g[(c[Y>>2]|0)+64>>2]=+g[(c[Y>>2]|0)+60>>2];c[(c[Y>>2]|0)+72>>2]=c[(c[Y>>2]|0)+68>>2]}if((c[N>>2]|0)==1)pj((c[oa>>2]|0)+(c[ma>>2]<<2)|0,c[oa>>2]|0,(c[ma>>2]<<2)+0|0)|0;c:do if(c[Q>>2]|0){c[ka>>2]=0;while(1){if((c[ka>>2]|0)>=(c[ma>>2]<<1|0))break c;l=c[ka>>2]|0;if(+g[(c[pa>>2]|0)+(c[ka>>2]<<2)>>2]<+g[(c[oa>>2]|0)+(c[ka>>2]<<2)>>2])m=+g[(c[pa>>2]|0)+(l<<2)>>2];else m=+g[(c[oa>>2]|0)+(l<<2)>>2];g[(c[pa>>2]|0)+(c[ka>>2]<<2)>>2]=m;c[ka>>2]=(c[ka>>2]|0)+1}}else{pj(c[qa>>2]|0,c[pa>>2]|0,(c[ma>>2]<<1<<2)+0|0)|0;pj(c[pa>>2]|0,c[oa>>2]|0,(c[ma>>2]<<1<<2)+0|0)|0;if((c[(c[Y>>2]|0)+48>>2]|0)<10)g[W>>2]=+(c[P>>2]|0)*1.0000000474974513e-03;else g[W>>2]=1.0;c[ka>>2]=0;while(1){if((c[ka>>2]|0)>=(c[ma>>2]<<1|0))break c;l=c[ka>>2]|0;if(+g[(c[V>>2]|0)+(c[ka>>2]<<2)>>2]+ +g[W>>2]<+g[(c[oa>>2]|0)+(c[ka>>2]<<2)>>2])m=+g[(c[V>>2]|0)+(l<<2)>>2]+ +g[W>>2];else m=+g[(c[oa>>2]|0)+(l<<2)>>2];g[(c[V>>2]|0)+(c[ka>>2]<<2)>>2]=m;c[ka>>2]=(c[ka>>2]|0)+1}}while(0);c[ha>>2]=0;do{c[ka>>2]=0;while(1){if((c[ka>>2]|0)>=(c[sa>>2]|0))break;ua=_(c[ha>>2]|0,c[ma>>2]|0)|0;g[(c[oa>>2]|0)+(ua+(c[ka>>2]|0)<<2)>>2]=0.0;ua=_(c[ha>>2]|0,c[ma>>2]|0)|0;g[(c[qa>>2]|0)+(ua+(c[ka>>2]|0)<<2)>>2]=-28.0;ua=_(c[ha>>2]|0,c[ma>>2]|0)|0;g[(c[pa>>2]|0)+(ua+(c[ka>>2]|0)<<2)>>2]=-28.0;c[ka>>2]=(c[ka>>2]|0)+1}c[ka>>2]=c[ja>>2];while(1){l=c[ha>>2]|0;if((c[ka>>2]|0)>=(c[ma>>2]|0))break;ua=_(l,c[ma>>2]|0)|0;g[(c[oa>>2]|0)+(ua+(c[ka>>2]|0)<<2)>>2]=0.0;ua=_(c[ha>>2]|0,c[ma>>2]|0)|0;g[(c[qa>>2]|0)+(ua+(c[ka>>2]|0)<<2)>>2]=-28.0;ua=_(c[ha>>2]|0,c[ma>>2]|0)|0;g[(c[pa>>2]|0)+(ua+(c[ka>>2]|0)<<2)>>2]=-28.0;c[ka>>2]=(c[ka>>2]|0)+1}ua=l+1|0;c[ha>>2]=ua}while((ua|0)<2);c[(c[Y>>2]|0)+36>>2]=c[(c[ba>>2]|0)+28>>2];Pb(ra,c[$>>2]|0,c[ga>>2]|0,c[fa>>2]|0,c[(c[Y>>2]|0)+16>>2]|0,(c[la>>2]|0)+16|0,(c[Y>>2]|0)+76|0,c[ca>>2]|0);c[(c[Y>>2]|0)+48>>2]=0;ua=Qb(c[ba>>2]|0)|0;if((ua|0)>(c[Z>>2]<<3|0)){c[X>>2]=-3;c[ea>>2]=1}else{if(Sb(c[ba>>2]|0)|0)c[(c[Y>>2]|0)+40>>2]=1;c[X>>2]=(c[aa>>2]|0)/(c[(c[Y>>2]|0)+16>>2]|0)|0;c[ea>>2]=1}na(c[da>>2]|0);ua=c[X>>2]|0;i=ta;return ua|0}function Mb(a,d,e){a=a|0;d=d|0;e=e|0;var f=0.0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ja=0,ka=0;ka=i;i=i+4608|0;aa=ka+4596|0;ba=ka+4592|0;L=ka+4588|0;da=ka+4584|0;fa=ka+4580|0;ca=ka+4576|0;ea=ka+4568|0;Y=ka+4560|0;C=ka+4556|0;X=ka+4552|0;j=ka+4548|0;k=ka+4544|0;N=ka+4540|0;ha=ka+4536|0;W=ka+4532|0;ja=ka+4528|0;$=ka+4524|0;ga=ka+4520|0;h=ka+4516|0;S=ka+4512|0;Z=ka+4508|0;U=ka+4504|0;T=ka+4500|0;R=ka+4496|0;M=ka+4492|0;V=ka+4488|0;Q=ka+4484|0;P=ka+4480|0;K=ka+4476|0;A=ka+4472|0;F=ka+4468|0;l=ka+4464|0;w=ka+368|0;t=ka+360|0;r=ka+356|0;o=ka+352|0;s=ka+348|0;z=ka+344|0;y=ka+340|0;x=ka+336|0;B=ka+332|0;q=ka+232|0;D=ka+136|0;m=ka+128|0;n=ka+124|0;u=ka+120|0;v=ka+116|0;H=ka+112|0;E=ka+16|0;p=ka+12|0;I=ka+8|0;G=ka+4|0;J=ka;c[aa>>2]=a;c[ba>>2]=d;c[L>>2]=e;c[ca>>2]=c[(c[aa>>2]|0)+8>>2];c[ha>>2]=c[c[aa>>2]>>2];c[W>>2]=c[(c[ha>>2]|0)+8>>2];c[ja>>2]=c[(c[ha>>2]|0)+4>>2];c[S>>2]=c[(c[ha>>2]|0)+32>>2];c[da>>2]=0;do{a=(c[aa>>2]|0)+84+((_(c[da>>2]|0,2048+(c[ja>>2]|0)|0)|0)<<2)|0;c[ea+(c[da>>2]<<2)>>2]=a;c[Y+(c[da>>2]<<2)>>2]=(c[ea+(c[da>>2]<<2)>>2]|0)+8192+(0-(c[ba>>2]|0)<<2);a=(c[da>>2]|0)+1|0;c[da>>2]=a}while((a|0)<(c[ca>>2]|0));c[C>>2]=(c[aa>>2]|0)+84+((_(2048+(c[ja>>2]|0)|0,c[ca>>2]|0)|0)<<2);c[X>>2]=(c[C>>2]|0)+((c[ca>>2]|0)*24<<2);c[j>>2]=(c[X>>2]|0)+(c[W>>2]<<1<<2);c[k>>2]=(c[j>>2]|0)+(c[W>>2]<<1<<2);c[N>>2]=(c[k>>2]|0)+(c[W>>2]<<1<<2);c[ga>>2]=c[(c[aa>>2]|0)+48>>2];c[$>>2]=c[(c[aa>>2]|0)+20>>2];c[h>>2]=((c[ga>>2]|0)>=5?1:(c[$>>2]|0)!=0)&1;if(c[h>>2]|0){c[U>>2]=c[(c[aa>>2]|0)+24>>2];if((c[U>>2]|0)<(c[(c[ha>>2]|0)+12>>2]|0))e=c[U>>2]|0;else e=c[(c[ha>>2]|0)+12>>2]|0;do if((c[$>>2]|0)<=(e|0))if((c[U>>2]|0)<(c[(c[ha>>2]|0)+12>>2]|0)){e=c[U>>2]|0;break}else{e=c[(c[ha>>2]|0)+12>>2]|0;break}else e=c[$>>2]|0;while(0);c[T>>2]=e;K=_(c[ca>>2]|0,c[ba>>2]|0)|0;c[M>>2]=ia()|0;d=i;i=i+((1*(K<<2)|0)+15&-16)|0;g[R>>2]=(c[ga>>2]|0)==0?1.5:.5;c[da>>2]=0;do{c[fa>>2]=c[$>>2];while(1){e=c[da>>2]|0;if((c[fa>>2]|0)>=(c[U>>2]|0))break;J=_(e,c[W>>2]|0)|0;K=_(c[da>>2]|0,c[W>>2]|0)|0;e=_(c[da>>2]|0,c[W>>2]|0)|0;e=e+(c[fa>>2]|0)|0;if(+g[(c[N>>2]|0)+(J+(c[fa>>2]|0)<<2)>>2]>+g[(c[X>>2]|0)+(K+(c[fa>>2]|0)<<2)>>2]-+g[R>>2])f=+g[(c[N>>2]|0)+(e<<2)>>2];else f=+g[(c[X>>2]|0)+(e<<2)>>2]-+g[R>>2];K=_(c[da>>2]|0,c[W>>2]|0)|0;g[(c[X>>2]|0)+(K+(c[fa>>2]|0)<<2)>>2]=f;c[fa>>2]=(c[fa>>2]|0)+1}K=e+1|0;c[da>>2]=K}while((K|0)<(c[ca>>2]|0));c[Z>>2]=c[(c[aa>>2]|0)+36>>2];c[da>>2]=0;while(1){if((c[da>>2]|0)>=(c[ca>>2]|0))break;c[fa>>2]=c[$>>2];while(1){if((c[fa>>2]|0)>=(c[T>>2]|0))break;W=_(c[ba>>2]|0,c[da>>2]|0)|0;c[Q>>2]=W+(b[(c[S>>2]|0)+(c[fa>>2]<<1)>>1]<<c[L>>2]);c[P>>2]=(b[(c[S>>2]|0)+((c[fa>>2]|0)+1<<1)>>1]|0)-(b[(c[S>>2]|0)+(c[fa>>2]<<1)>>1]|0)<<c[L>>2];c[V>>2]=0;while(1){if((c[V>>2]|0)>=(c[P>>2]|0))break;c[Z>>2]=Ba(c[Z>>2]|0)|0;g[d+((c[Q>>2]|0)+(c[V>>2]|0)<<2)>>2]=+(c[Z>>2]>>20|0);c[V>>2]=(c[V>>2]|0)+1}td(d+(c[Q>>2]<<2)|0,c[P>>2]|0,1.0,c[(c[aa>>2]|0)+32>>2]|0);c[fa>>2]=(c[fa>>2]|0)+1}c[da>>2]=(c[da>>2]|0)+1}c[(c[aa>>2]|0)+36>>2]=c[Z>>2];c[da>>2]=0;do{qj(c[ea+(c[da>>2]<<2)>>2]|0,(c[ea+(c[da>>2]<<2)>>2]|0)+(c[ba>>2]<<2)|0,(2048-(c[ba>>2]|0)+(c[ja>>2]>>1)<<2)+0|0)|0;fa=(c[da>>2]|0)+1|0;c[da>>2]=fa}while((fa|0)<(c[ca>>2]|0));Nb(c[ha>>2]|0,d,Y,c[X>>2]|0,c[$>>2]|0,c[T>>2]|0,c[ca>>2]|0,c[ca>>2]|0,0,c[L>>2]|0,c[(c[aa>>2]|0)+16>>2]|0,0,c[(c[aa>>2]|0)+32>>2]|0);na(c[M>>2]|0);ha=c[ga>>2]|0;ha=ha+1|0;ja=c[aa>>2]|0;ja=ja+48|0;c[ja>>2]=ha;i=ka;return}g[A>>2]=1.0;if(!(c[ga>>2]|0)){$=Ob(ea,c[ca>>2]|0,c[(c[aa>>2]|0)+32>>2]|0)|0;c[F>>2]=$;c[(c[aa>>2]|0)+44>>2]=$}else{c[F>>2]=c[(c[aa>>2]|0)+44>>2];g[A>>2]=.800000011920929}$=c[ja>>2]|0;c[l>>2]=ia()|0;e=i;i=i+((1*($<<2)|0)+15&-16)|0;c[K>>2]=c[(c[ha>>2]|0)+60>>2];c[da>>2]=0;do{g[o>>2]=0.0;c[s>>2]=c[ea+(c[da>>2]<<2)>>2];c[fa>>2]=0;while(1){if((c[fa>>2]|0)>=1024)break;g[w+(c[fa>>2]<<2)>>2]=+g[(c[s>>2]|0)+(1024+(c[fa>>2]|0)<<2)>>2];c[fa>>2]=(c[fa>>2]|0)+1}if(!(c[ga>>2]|0)){Yc(w,q,c[K>>2]|0,c[ja>>2]|0,24,1024,c[(c[aa>>2]|0)+32>>2]|0)|0;g[q>>2]=+g[q>>2]*1.000100016593933;c[fa>>2]=1;while(1){if((c[fa>>2]|0)>24)break;ha=q+(c[fa>>2]<<2)|0;g[ha>>2]=+g[ha>>2]-+g[q+(c[fa>>2]<<2)>>2]*6.400000711437315e-05*+(c[fa>>2]|0)*+(c[fa>>2]|0);c[fa>>2]=(c[fa>>2]|0)+1}Uc((c[C>>2]|0)+((c[da>>2]|0)*24<<2)|0,q,24)}c[x>>2]=(c[F>>2]<<1|0)<1024?c[F>>2]<<1:1024;c[fa>>2]=0;while(1){if((c[fa>>2]|0)>=24)break;g[D+(c[fa>>2]<<2)>>2]=+g[(c[s>>2]|0)+(2048-(c[x>>2]|0)-1-(c[fa>>2]|0)<<2)>>2];c[fa>>2]=(c[fa>>2]|0)+1}Vc(w+4096+(0-(c[x>>2]|0)<<2)|0,(c[C>>2]|0)+((c[da>>2]|0)*24<<2)|0,w+4096+(0-(c[x>>2]|0)<<2)|0,c[x>>2]|0,24,D,c[(c[aa>>2]|0)+32>>2]|0);g[m>>2]=1.0;g[n>>2]=1.0;c[u>>2]=c[x>>2]>>1;c[fa>>2]=0;while(1){if((c[fa>>2]|0)>=(c[u>>2]|0))break;g[v>>2]=+g[w+(1024-(c[u>>2]|0)+(c[fa>>2]|0)<<2)>>2];g[m>>2]=+g[m>>2]+ +g[v>>2]*+g[v>>2];g[v>>2]=+g[w+(1024-(c[u>>2]<<1)+(c[fa>>2]|0)<<2)>>2];g[n>>2]=+g[n>>2]+ +g[v>>2]*+g[v>>2];c[fa>>2]=(c[fa>>2]|0)+1}g[m>>2]=+g[m>>2]<+g[n>>2]?+g[m>>2]:+g[n>>2];g[t>>2]=+O(+(+g[m>>2]/+g[n>>2]));qj(c[s>>2]|0,(c[s>>2]|0)+(c[ba>>2]<<2)|0,(2048-(c[ba>>2]|0)<<2)+0|0)|0;c[z>>2]=1024-(c[F>>2]|0);c[y>>2]=(c[ba>>2]|0)+(c[ja>>2]|0);g[r>>2]=+g[A>>2]*+g[t>>2];c[B>>2]=0;c[fa>>2]=0;while(1){if((c[fa>>2]|0)>=(c[y>>2]|0))break;if((c[B>>2]|0)>=(c[F>>2]|0)){c[B>>2]=(c[B>>2]|0)-(c[F>>2]|0);g[r>>2]=+g[r>>2]*+g[t>>2]}g[(c[s>>2]|0)+(2048-(c[ba>>2]|0)+(c[fa>>2]|0)<<2)>>2]=+g[r>>2]*+g[w+((c[z>>2]|0)+(c[B>>2]|0)<<2)>>2];g[H>>2]=+g[(c[s>>2]|0)+(1024-(c[ba>>2]|0)+(c[z>>2]|0)+(c[B>>2]|0)<<2)>>2];g[o>>2]=+g[o>>2]+ +g[H>>2]*+g[H>>2];c[fa>>2]=(c[fa>>2]|0)+1;c[B>>2]=(c[B>>2]|0)+1}c[fa>>2]=0;while(1){if((c[fa>>2]|0)>=24)break;g[E+(c[fa>>2]<<2)>>2]=+g[(c[s>>2]|0)+(2048-(c[ba>>2]|0)-1-(c[fa>>2]|0)<<2)>>2];c[fa>>2]=(c[fa>>2]|0)+1}Xc((c[s>>2]|0)+8192+(0-(c[ba>>2]|0)<<2)|0,(c[C>>2]|0)+((c[da>>2]|0)*24<<2)|0,(c[s>>2]|0)+8192+(0-(c[ba>>2]|0)<<2)|0,c[y>>2]|0,24,E,c[(c[aa>>2]|0)+32>>2]|0);g[p>>2]=0.0;c[fa>>2]=0;while(1){if((c[fa>>2]|0)>=(c[y>>2]|0))break;g[I>>2]=+g[(c[s>>2]|0)+(2048-(c[ba>>2]|0)+(c[fa>>2]|0)<<2)>>2];g[p>>2]=+g[p>>2]+ +g[I>>2]*+g[I>>2];c[fa>>2]=(c[fa>>2]|0)+1}a:do if(+g[o>>2]>+g[p>>2]*.20000000298023224){if(+g[o>>2]<+g[p>>2]){g[G>>2]=+O(+((+g[o>>2]+1.0)/(+g[p>>2]+1.0)));c[fa>>2]=0;while(1){if((c[fa>>2]|0)>=(c[ja>>2]|0))break;g[J>>2]=1.0-+g[(c[K>>2]|0)+(c[fa>>2]<<2)>>2]*(1.0-+g[G>>2]);g[(c[s>>2]|0)+(2048-(c[ba>>2]|0)+(c[fa>>2]|0)<<2)>>2]=+g[J>>2]*+g[(c[s>>2]|0)+(2048-(c[ba>>2]|0)+(c[fa>>2]|0)<<2)>>2];c[fa>>2]=(c[fa>>2]|0)+1}c[fa>>2]=c[ja>>2];while(1){if((c[fa>>2]|0)>=(c[y>>2]|0))break a;g[(c[s>>2]|0)+(2048-(c[ba>>2]|0)+(c[fa>>2]|0)<<2)>>2]=+g[G>>2]*+g[(c[s>>2]|0)+(2048-(c[ba>>2]|0)+(c[fa>>2]|0)<<2)>>2];c[fa>>2]=(c[fa>>2]|0)+1}}}else{c[fa>>2]=0;while(1){if((c[fa>>2]|0)>=(c[y>>2]|0))break a;g[(c[s>>2]|0)+(2048-(c[ba>>2]|0)+(c[fa>>2]|0)<<2)>>2]=0.0;c[fa>>2]=(c[fa>>2]|0)+1}}while(0);cb(e,(c[s>>2]|0)+8192|0,c[(c[aa>>2]|0)+52>>2]|0,c[(c[aa>>2]|0)+52>>2]|0,c[ja>>2]|0,-+g[(c[aa>>2]|0)+60>>2],-+g[(c[aa>>2]|0)+60>>2],c[(c[aa>>2]|0)+68>>2]|0,c[(c[aa>>2]|0)+68>>2]|0,0,0,c[(c[aa>>2]|0)+32>>2]|0);c[fa>>2]=0;while(1){if((c[fa>>2]|0)>=((c[ja>>2]|0)/2|0|0))break;g[(c[s>>2]|0)+(2048+(c[fa>>2]|0)<<2)>>2]=+g[(c[K>>2]|0)+(c[fa>>2]<<2)>>2]*+g[e+((c[ja>>2]|0)-1-(c[fa>>2]|0)<<2)>>2]+ +g[(c[K>>2]|0)+((c[ja>>2]|0)-(c[fa>>2]|0)-1<<2)>>2]*+g[e+(c[fa>>2]<<2)>>2];c[fa>>2]=(c[fa>>2]|0)+1}ha=(c[da>>2]|0)+1|0;c[da>>2]=ha}while((ha|0)<(c[ca>>2]|0));na(c[l>>2]|0);ha=c[ga>>2]|0;ha=ha+1|0;ja=c[aa>>2]|0;ja=ja+48|0;c[ja>>2]=ha;i=ka;return}function Nb(a,b,d,e,f,h,j,k,l,m,n,o,p){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;j=j|0;k=k|0;l=l|0;m=m|0;n=n|0;o=o|0;p=p|0;var q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0;P=i;i=i+112|0;q=P+100|0;r=P+96|0;w=P+92|0;x=P+88|0;y=P+84|0;z=P+80|0;A=P+76|0;B=P+72|0;Q=P+68|0;C=P+64|0;s=P+60|0;t=P+56|0;u=P+52|0;I=P+48|0;L=P+44|0;E=P+40|0;H=P+36|0;D=P+32|0;F=P+28|0;G=P+24|0;O=P+20|0;M=P+16|0;N=P+12|0;v=P+8|0;J=P+4|0;K=P;c[q>>2]=a;c[r>>2]=b;c[w>>2]=d;c[x>>2]=e;c[y>>2]=f;c[z>>2]=h;c[A>>2]=j;c[B>>2]=k;c[Q>>2]=l;c[C>>2]=m;c[s>>2]=n;c[t>>2]=o;c[u>>2]=p;c[N>>2]=c[(c[q>>2]|0)+4>>2];c[M>>2]=c[(c[q>>2]|0)+8>>2];c[F>>2]=c[(c[q>>2]|0)+44>>2]<<c[C>>2];f=c[F>>2]|0;c[v>>2]=ia()|0;j=i;i=i+((1*(f<<2)|0)+15&-16)|0;c[E>>2]=1<<c[C>>2];if(c[Q>>2]|0){c[D>>2]=c[E>>2];c[G>>2]=c[(c[q>>2]|0)+44>>2];c[O>>2]=c[(c[q>>2]|0)+36>>2]}else{c[D>>2]=1;c[G>>2]=c[(c[q>>2]|0)+44>>2]<<c[C>>2];c[O>>2]=(c[(c[q>>2]|0)+36>>2]|0)-(c[C>>2]|0)}if((c[B>>2]|0)==2&(c[A>>2]|0)==1){Fa(c[q>>2]|0,c[r>>2]|0,j,c[x>>2]|0,c[y>>2]|0,c[z>>2]|0,c[E>>2]|0,c[s>>2]|0,c[t>>2]|0);c[J>>2]=(c[(c[w>>2]|0)+4>>2]|0)+(((c[N>>2]|0)/2|0)<<2);pj(c[J>>2]|0,j|0,(c[F>>2]<<2)+0|0)|0;c[H>>2]=0;while(1){if((c[H>>2]|0)>=(c[D>>2]|0))break;Q=(c[c[w>>2]>>2]|0)+((_(c[G>>2]|0,c[H>>2]|0)|0)<<2)|0;Ic((c[q>>2]|0)+64|0,(c[J>>2]|0)+(c[H>>2]<<2)|0,Q,c[(c[q>>2]|0)+60>>2]|0,c[N>>2]|0,c[O>>2]|0,c[D>>2]|0,c[u>>2]|0);c[H>>2]=(c[H>>2]|0)+1}c[H>>2]=0;while(1){if((c[H>>2]|0)>=(c[D>>2]|0))break;Q=(c[(c[w>>2]|0)+4>>2]|0)+((_(c[G>>2]|0,c[H>>2]|0)|0)<<2)|0;Ic((c[q>>2]|0)+64|0,j+(c[H>>2]<<2)|0,Q,c[(c[q>>2]|0)+60>>2]|0,c[N>>2]|0,c[O>>2]|0,c[D>>2]|0,c[u>>2]|0);c[H>>2]=(c[H>>2]|0)+1}Q=c[v>>2]|0;na(Q|0);i=P;return}if(!((c[B>>2]|0)==1&(c[A>>2]|0)==2)){c[I>>2]=0;do{L=(c[r>>2]|0)+((_(c[I>>2]|0,c[F>>2]|0)|0)<<2)|0;Q=(c[x>>2]|0)+((_(c[I>>2]|0,c[M>>2]|0)|0)<<2)|0;Fa(c[q>>2]|0,L,j,Q,c[y>>2]|0,c[z>>2]|0,c[E>>2]|0,c[s>>2]|0,c[t>>2]|0);c[H>>2]=0;while(1){if((c[H>>2]|0)>=(c[D>>2]|0))break;Q=(c[(c[w>>2]|0)+(c[I>>2]<<2)>>2]|0)+((_(c[G>>2]|0,c[H>>2]|0)|0)<<2)|0;Ic((c[q>>2]|0)+64|0,j+(c[H>>2]<<2)|0,Q,c[(c[q>>2]|0)+60>>2]|0,c[N>>2]|0,c[O>>2]|0,c[D>>2]|0,c[u>>2]|0);c[H>>2]=(c[H>>2]|0)+1}Q=(c[I>>2]|0)+1|0;c[I>>2]=Q}while((Q|0)<(c[B>>2]|0));Q=c[v>>2]|0;na(Q|0);i=P;return}c[K>>2]=(c[c[w>>2]>>2]|0)+(((c[N>>2]|0)/2|0)<<2);Fa(c[q>>2]|0,c[r>>2]|0,j,c[x>>2]|0,c[y>>2]|0,c[z>>2]|0,c[E>>2]|0,c[s>>2]|0,c[t>>2]|0);Fa(c[q>>2]|0,(c[r>>2]|0)+(c[F>>2]<<2)|0,c[K>>2]|0,(c[x>>2]|0)+(c[M>>2]<<2)|0,c[y>>2]|0,c[z>>2]|0,c[E>>2]|0,c[s>>2]|0,c[t>>2]|0);c[L>>2]=0;while(1){if((c[L>>2]|0)>=(c[F>>2]|0))break;g[j+(c[L>>2]<<2)>>2]=(+g[j+(c[L>>2]<<2)>>2]+ +g[(c[K>>2]|0)+(c[L>>2]<<2)>>2])*.5;c[L>>2]=(c[L>>2]|0)+1}c[H>>2]=0;while(1){if((c[H>>2]|0)>=(c[D>>2]|0))break;Q=(c[c[w>>2]>>2]|0)+((_(c[G>>2]|0,c[H>>2]|0)|0)<<2)|0;Ic((c[q>>2]|0)+64|0,j+(c[H>>2]<<2)|0,Q,c[(c[q>>2]|0)+60>>2]|0,c[N>>2]|0,c[O>>2]|0,c[D>>2]|0,c[u>>2]|0);c[H>>2]=(c[H>>2]|0)+1}Q=c[v>>2]|0;na(Q|0);i=P;return}function Ob(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0;f=i;i=i+4112|0;k=f+4108|0;j=f+4104|0;g=f+4100|0;e=f+4096|0;h=f;c[k>>2]=a;c[j>>2]=b;c[g>>2]=d;Kc(c[k>>2]|0,h,2048,c[j>>2]|0,c[g>>2]|0);Pc(h+1440|0,h,1328,620,e,c[g>>2]|0);c[e>>2]=720-(c[e>>2]|0);i=f;return c[e>>2]|0}function Pb(a,b,d,e,f,h,j,k){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0.0;C=i;i=i+80|0;l=C+72|0;m=C+68|0;n=C+64|0;o=C+60|0;p=C+56|0;D=C+52|0;q=C+48|0;u=C+40|0;s=C+36|0;t=C+32|0;v=C+28|0;r=C+24|0;w=C+20|0;A=C+16|0;B=C+12|0;x=C+8|0;y=C+4|0;z=C;c[l>>2]=a;c[m>>2]=b;c[n>>2]=d;c[o>>2]=e;c[p>>2]=f;c[D>>2]=h;c[q>>2]=j;c[C+44>>2]=k;c[t>>2]=0;b=c[n>>2]|0;c[r>>2]=ia()|0;e=i;i=i+((1*(b<<2)|0)+15&-16)|0;g[v>>2]=+g[c[D>>2]>>2];c[s>>2]=(c[n>>2]|0)/(c[p>>2]|0)|0;c[u>>2]=0;do{g[x>>2]=+g[(c[q>>2]|0)+(c[u>>2]<<2)>>2];c[A>>2]=c[(c[l>>2]|0)+(c[u>>2]<<2)>>2];c[B>>2]=(c[m>>2]|0)+(c[u>>2]<<2);D=(c[p>>2]|0)>1;c[w>>2]=0;a:do if(D){while(1){if((c[w>>2]|0)>=(c[n>>2]|0))break;g[y>>2]=+g[(c[A>>2]|0)+(c[w>>2]<<2)>>2]+ +g[x>>2]+1.0000000031710769e-30;g[x>>2]=+g[v>>2]*+g[y>>2];g[e+(c[w>>2]<<2)>>2]=+g[y>>2];c[w>>2]=(c[w>>2]|0)+1}c[t>>2]=1}else while(1){if((c[w>>2]|0)>=(c[n>>2]|0))break a;g[z>>2]=+g[(c[A>>2]|0)+(c[w>>2]<<2)>>2]+ +g[x>>2]+1.0000000031710769e-30;g[x>>2]=+g[v>>2]*+g[z>>2];D=_(c[w>>2]|0,c[o>>2]|0)|0;g[(c[B>>2]|0)+(D<<2)>>2]=+g[z>>2]*.000030517578125;c[w>>2]=(c[w>>2]|0)+1}while(0);g[(c[q>>2]|0)+(c[u>>2]<<2)>>2]=+g[x>>2];b:do if(c[t>>2]|0){c[w>>2]=0;while(1){if((c[w>>2]|0)>=(c[s>>2]|0))break b;E=+g[e+((_(c[w>>2]|0,c[p>>2]|0)|0)<<2)>>2]*.000030517578125;D=_(c[w>>2]|0,c[o>>2]|0)|0;g[(c[B>>2]|0)+(D<<2)>>2]=E;c[w>>2]=(c[w>>2]|0)+1}}while(0);D=(c[u>>2]|0)+1|0;c[u>>2]=D}while((D|0)<(c[o>>2]|0));na(c[r>>2]|0);i=C;return}function Qb(a){a=a|0;var b=0,d=0;b=i;i=i+16|0;d=b;c[d>>2]=a;a=(c[(c[d>>2]|0)+20>>2]|0)-(32-(aa(c[(c[d>>2]|0)+28>>2]|0)|0))|0;i=b;return a|0}function Rb(b,d,e,f,g,h){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;x=i;i=i+64|0;j=x+52|0;k=x+48|0;l=x+44|0;m=x+40|0;n=x+36|0;o=x+32|0;r=x+28|0;q=x+24|0;v=x+20|0;w=x+16|0;u=x+12|0;s=x+8|0;p=x+4|0;t=x;c[j>>2]=b;c[k>>2]=d;c[l>>2]=e;c[m>>2]=f;c[n>>2]=g;c[o>>2]=h;c[p>>2]=c[(c[o>>2]|0)+4>>2]<<3;c[t>>2]=Qb(c[o>>2]|0)|0;c[s>>2]=c[l>>2]|0?2:4;if((c[n>>2]|0)>0)g=((c[t>>2]|0)+(c[s>>2]|0)+1|0)>>>0<=(c[p>>2]|0)>>>0;else g=0;c[w>>2]=g&1;c[p>>2]=(c[p>>2]|0)-(c[w>>2]|0);c[q>>2]=0;c[u>>2]=0;c[r>>2]=c[j>>2];while(1){if((c[r>>2]|0)>=(c[k>>2]|0))break;if(((c[t>>2]|0)+(c[s>>2]|0)|0)>>>0<=(c[p>>2]|0)>>>0){f=dc(c[o>>2]|0,c[s>>2]|0)|0;c[q>>2]=c[q>>2]^f;c[t>>2]=Qb(c[o>>2]|0)|0;c[u>>2]=c[u>>2]|c[q>>2]}c[(c[m>>2]|0)+(c[r>>2]<<2)>>2]=c[q>>2];c[s>>2]=c[l>>2]|0?4:5;c[r>>2]=(c[r>>2]|0)+1}c[v>>2]=0;if(c[w>>2]|0?(a[25232+(c[n>>2]<<3)+((c[l>>2]<<2)+0+(c[u>>2]|0))>>0]|0)!=(a[25232+(c[n>>2]<<3)+((c[l>>2]<<2)+2+(c[u>>2]|0))>>0]|0):0)c[v>>2]=dc(c[o>>2]|0,1)|0;c[r>>2]=c[j>>2];while(1){if((c[r>>2]|0)>=(c[k>>2]|0))break;c[(c[m>>2]|0)+(c[r>>2]<<2)>>2]=a[25232+(c[n>>2]<<3)+((c[l>>2]<<2)+(c[v>>2]<<1)+(c[(c[m>>2]|0)+(c[r>>2]<<2)>>2]|0))>>0];c[r>>2]=(c[r>>2]|0)+1}i=x;return}function Sb(a){a=a|0;var b=0,d=0;d=i;i=i+16|0;b=d;c[b>>2]=a;i=d;return c[(c[b>>2]|0)+44>>2]|0}function Tb(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0;f=i;i=i+16|0;j=f+12|0;h=f+8|0;g=f+4|0;k=f;c[j>>2]=a;c[h>>2]=b;c[g>>2]=d;c[k>>2]=e;b=c[k>>2]|0;a=Ub(c[h>>2]|0,c[j>>2]|0)|0;rc(b,a,(c[(c[364+(((c[h>>2]|0)<(c[g>>2]|0)?c[h>>2]|0:c[g>>2]|0)<<2)>>2]|0)+(((c[h>>2]|0)>(c[g>>2]|0)?c[h>>2]|0:c[g>>2]|0)<<2)>>2]|0)+(c[(c[364+(((c[h>>2]|0)<((c[g>>2]|0)+1|0)?c[h>>2]|0:(c[g>>2]|0)+1|0)<<2)>>2]|0)+(((c[h>>2]|0)>((c[g>>2]|0)+1|0)?c[h>>2]|0:(c[g>>2]|0)+1|0)<<2)>>2]|0)|0);i=f;return}function Ub(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0;j=i;i=i+32|0;d=j+16|0;e=j+12|0;f=j+8|0;g=j+4|0;h=j;c[d>>2]=a;c[e>>2]=b;c[g>>2]=(c[d>>2]|0)-1;c[f>>2]=(c[(c[e>>2]|0)+(c[g>>2]<<2)>>2]|0)<0&1;c[h>>2]=N(c[(c[e>>2]|0)+(c[g>>2]<<2)>>2]|0)|0;do{c[g>>2]=(c[g>>2]|0)+-1;if(((c[d>>2]|0)-(c[g>>2]|0)|0)>(c[h>>2]|0))b=(c[d>>2]|0)-(c[g>>2]|0)|0;else b=c[h>>2]|0;if(((c[d>>2]|0)-(c[g>>2]|0)|0)<(c[h>>2]|0))a=(c[d>>2]|0)-(c[g>>2]|0)|0;else a=c[h>>2]|0;c[f>>2]=(c[f>>2]|0)+(c[(c[364+(a<<2)>>2]|0)+(b<<2)>>2]|0);b=N(c[(c[e>>2]|0)+(c[g>>2]<<2)>>2]|0)|0;c[h>>2]=(c[h>>2]|0)+b;if((c[(c[e>>2]|0)+(c[g>>2]<<2)>>2]|0)<0){if(((c[d>>2]|0)-(c[g>>2]|0)|0)>((c[h>>2]|0)+1|0))b=(c[d>>2]|0)-(c[g>>2]|0)|0;else b=(c[h>>2]|0)+1|0;if(((c[d>>2]|0)-(c[g>>2]|0)|0)<((c[h>>2]|0)+1|0))a=(c[d>>2]|0)-(c[g>>2]|0)|0;else a=(c[h>>2]|0)+1|0;c[f>>2]=(c[f>>2]|0)+(c[(c[364+(a<<2)>>2]|0)+(b<<2)>>2]|0)}}while((c[g>>2]|0)>0);i=j;return c[f>>2]|0}function Vb(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,g=0,h=0,j=0,k=0,l=0;g=i;i=i+16|0;h=g+12|0;k=g+8|0;j=g+4|0;l=g;c[h>>2]=a;c[k>>2]=b;c[j>>2]=d;c[l>>2]=e;d=c[k>>2]|0;b=c[j>>2]|0;a=fc(c[l>>2]|0,(c[(c[364+(((c[k>>2]|0)<(c[j>>2]|0)?c[k>>2]|0:c[j>>2]|0)<<2)>>2]|0)+(((c[k>>2]|0)>(c[j>>2]|0)?c[k>>2]|0:c[j>>2]|0)<<2)>>2]|0)+(c[(c[364+(((c[k>>2]|0)<((c[j>>2]|0)+1|0)?c[k>>2]|0:(c[j>>2]|0)+1|0)<<2)>>2]|0)+(((c[k>>2]|0)>((c[j>>2]|0)+1|0)?c[k>>2]|0:(c[j>>2]|0)+1|0)<<2)>>2]|0)|0)|0;f=+Wb(d,b,a,c[h>>2]|0);i=g;return +f}function Wb(a,d,e,f){a=a|0;d=d|0;e=e|0;f=f|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0.0,v=0.0,w=0.0;t=i;i=i+48|0;h=t+36|0;j=t+32|0;k=t+28|0;l=t+24|0;n=t+20|0;q=t+16|0;m=t+12|0;r=t+40|0;s=t+8|0;o=t+4|0;p=t;c[h>>2]=a;c[j>>2]=d;c[k>>2]=e;c[l>>2]=f;g[s>>2]=0.0;while(1){e=c[j>>2]|0;if((c[h>>2]|0)<=2)break;d=c[h>>2]|0;do if((e|0)>=(c[h>>2]|0)){c[p>>2]=c[364+(d<<2)>>2];c[n>>2]=c[(c[p>>2]|0)+((c[j>>2]|0)+1<<2)>>2];c[q>>2]=0-((c[k>>2]|0)>>>0>=(c[n>>2]|0)>>>0&1);c[k>>2]=(c[k>>2]|0)-(c[n>>2]&c[q>>2]);c[m>>2]=c[j>>2];c[o>>2]=c[(c[p>>2]|0)+(c[h>>2]<<2)>>2];a:do if((c[o>>2]|0)>>>0>(c[k>>2]|0)>>>0){c[j>>2]=c[h>>2];do{f=c[h>>2]|0;a=(c[j>>2]|0)+-1|0;c[j>>2]=a;c[n>>2]=c[(c[364+(a<<2)>>2]|0)+(f<<2)>>2]}while((c[n>>2]|0)>>>0>(c[k>>2]|0)>>>0)}else{c[n>>2]=c[(c[p>>2]|0)+(c[j>>2]<<2)>>2];while(1){if((c[n>>2]|0)>>>0<=(c[k>>2]|0)>>>0)break a;c[j>>2]=(c[j>>2]|0)+-1;c[n>>2]=c[(c[p>>2]|0)+(c[j>>2]<<2)>>2]}}while(0);c[k>>2]=(c[k>>2]|0)-(c[n>>2]|0);b[r>>1]=(c[m>>2]|0)-(c[j>>2]|0)+(c[q>>2]|0)^c[q>>2];a=b[r>>1]|0;f=c[l>>2]|0;c[l>>2]=f+4;c[f>>2]=a;g[s>>2]=+g[s>>2]+ +(b[r>>1]|0)*+(b[r>>1]|0)}else{c[n>>2]=c[(c[364+(c[j>>2]<<2)>>2]|0)+(d<<2)>>2];c[o>>2]=c[(c[364+((c[j>>2]|0)+1<<2)>>2]|0)+(c[h>>2]<<2)>>2];if((c[n>>2]|0)>>>0<=(c[k>>2]|0)>>>0?(c[k>>2]|0)>>>0<(c[o>>2]|0)>>>0:0){c[k>>2]=(c[k>>2]|0)-(c[n>>2]|0);f=c[l>>2]|0;c[l>>2]=f+4;c[f>>2]=0;break}c[q>>2]=0-((c[k>>2]|0)>>>0>=(c[o>>2]|0)>>>0&1);c[k>>2]=(c[k>>2]|0)-(c[o>>2]&c[q>>2]);c[m>>2]=c[j>>2];do{f=c[h>>2]|0;a=(c[j>>2]|0)+-1|0;c[j>>2]=a;c[n>>2]=c[(c[364+(a<<2)>>2]|0)+(f<<2)>>2]}while((c[n>>2]|0)>>>0>(c[k>>2]|0)>>>0);c[k>>2]=(c[k>>2]|0)-(c[n>>2]|0);b[r>>1]=(c[m>>2]|0)-(c[j>>2]|0)+(c[q>>2]|0)^c[q>>2];a=b[r>>1]|0;f=c[l>>2]|0;c[l>>2]=f+4;c[f>>2]=a;g[s>>2]=+g[s>>2]+ +(b[r>>1]|0)*+(b[r>>1]|0)}while(0);c[h>>2]=(c[h>>2]|0)+-1}c[n>>2]=(e<<1)+1;c[q>>2]=0-((c[k>>2]|0)>>>0>=(c[n>>2]|0)>>>0&1);c[k>>2]=(c[k>>2]|0)-(c[n>>2]&c[q>>2]);c[m>>2]=c[j>>2];c[j>>2]=((c[k>>2]|0)+1|0)>>>1;if(!(c[j>>2]|0)){p=c[m>>2]|0;o=c[j>>2]|0;o=p-o|0;p=c[q>>2]|0;p=o+p|0;o=c[q>>2]|0;o=p^o;o=o&65535;b[r>>1]=o;o=b[r>>1]|0;o=o<<16>>16;p=c[l>>2]|0;n=p+4|0;c[l>>2]=n;c[p>>2]=o;w=+g[s>>2];p=b[r>>1]|0;u=+(p<<16>>16);p=b[r>>1]|0;v=+(p<<16>>16);v=u*v;v=w+v;g[s>>2]=v;p=c[k>>2]|0;p=0-p|0;c[q>>2]=p;p=c[j>>2]|0;o=c[q>>2]|0;o=p+o|0;p=c[q>>2]|0;p=o^p;p=p&65535;b[r>>1]=p;p=b[r>>1]|0;p=p<<16>>16;q=c[l>>2]|0;c[q>>2]=p;v=+g[s>>2];q=b[r>>1]|0;w=+(q<<16>>16);r=b[r>>1]|0;u=+(r<<16>>16);u=w*u;u=v+u;g[s>>2]=u;u=+g[s>>2];i=t;return +u}c[k>>2]=(c[k>>2]|0)-((c[j>>2]<<1)-1);p=c[m>>2]|0;o=c[j>>2]|0;o=p-o|0;p=c[q>>2]|0;p=o+p|0;o=c[q>>2]|0;o=p^o;o=o&65535;b[r>>1]=o;o=b[r>>1]|0;o=o<<16>>16;p=c[l>>2]|0;n=p+4|0;c[l>>2]=n;c[p>>2]=o;u=+g[s>>2];p=b[r>>1]|0;w=+(p<<16>>16);p=b[r>>1]|0;v=+(p<<16>>16);v=w*v;v=u+v;g[s>>2]=v;p=c[k>>2]|0;p=0-p|0;c[q>>2]=p;p=c[j>>2]|0;o=c[q>>2]|0;o=p+o|0;p=c[q>>2]|0;p=o^p;p=p&65535;b[r>>1]=p;p=b[r>>1]|0;p=p<<16>>16;q=c[l>>2]|0;c[q>>2]=p;v=+g[s>>2];q=b[r>>1]|0;u=+(q<<16>>16);r=b[r>>1]|0;w=+(r<<16>>16);w=u*w;w=v+w;g[s>>2]=w;w=+g[s>>2];i=t;return +w}function Xb(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;e=i;i=i+32|0;h=e+16|0;d=e+12|0;g=e+8|0;b=e+4|0;f=e;c[h>>2]=a;c[d>>2]=c[(c[h>>2]|0)+20>>2]<<3;c[b>>2]=32-(aa(c[(c[h>>2]|0)+28>>2]|0)|0);c[g>>2]=(c[(c[h>>2]|0)+28>>2]|0)>>>((c[b>>2]|0)-16|0);c[f>>2]=((c[g>>2]|0)>>>12)-8;c[f>>2]=(c[f>>2]|0)+((c[g>>2]|0)>>>0>(c[5512+(c[f>>2]<<2)>>2]|0)>>>0&1);c[b>>2]=(c[b>>2]<<3)+(c[f>>2]|0);i=e;return (c[d>>2]|0)-(c[b>>2]|0)|0}function Yb(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=i;i=i+16|0;f=e+8|0;h=e+4|0;g=e;c[f>>2]=a;c[h>>2]=b;c[g>>2]=d;c[c[f>>2]>>2]=c[h>>2];c[(c[f>>2]|0)+4>>2]=c[g>>2];c[(c[f>>2]|0)+8>>2]=0;c[(c[f>>2]|0)+12>>2]=0;c[(c[f>>2]|0)+16>>2]=0;c[(c[f>>2]|0)+20>>2]=9;c[(c[f>>2]|0)+24>>2]=0;c[(c[f>>2]|0)+28>>2]=128;a=Zb(c[f>>2]|0)|0;c[(c[f>>2]|0)+40>>2]=a;c[(c[f>>2]|0)+32>>2]=(c[(c[f>>2]|0)+28>>2]|0)-1-(c[(c[f>>2]|0)+40>>2]>>1);c[(c[f>>2]|0)+44>>2]=0;_b(c[f>>2]|0);i=e;return}function Zb(a){a=a|0;var b=0,e=0,f=0;e=i;i=i+16|0;b=e;c[b>>2]=a;if((c[(c[b>>2]|0)+24>>2]|0)>>>0>=(c[(c[b>>2]|0)+4>>2]|0)>>>0){a=0;i=e;return a|0}f=(c[b>>2]|0)+24|0;a=c[f>>2]|0;c[f>>2]=a+1;a=d[(c[c[b>>2]>>2]|0)+a>>0]|0;i=e;return a|0}function _b(a){a=a|0;var b=0,d=0,e=0;e=i;i=i+16|0;b=e+4|0;d=e;c[b>>2]=a;while(1){if((c[(c[b>>2]|0)+28>>2]|0)>>>0>8388608)break;a=(c[b>>2]|0)+20|0;c[a>>2]=(c[a>>2]|0)+8;a=(c[b>>2]|0)+28|0;c[a>>2]=c[a>>2]<<8;c[d>>2]=c[(c[b>>2]|0)+40>>2];a=Zb(c[b>>2]|0)|0;c[(c[b>>2]|0)+40>>2]=a;c[d>>2]=(c[d>>2]<<8|c[(c[b>>2]|0)+40>>2])>>1;c[(c[b>>2]|0)+32>>2]=(c[(c[b>>2]|0)+32>>2]<<8)+(255&~c[d>>2])&2147483647}i=e;return}function $b(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;f=i;i=i+16|0;g=f+8|0;e=f+4|0;d=f;c[g>>2]=a;c[e>>2]=b;a=ac(c[(c[g>>2]|0)+28>>2]|0,c[e>>2]|0)|0;c[(c[g>>2]|0)+36>>2]=a;c[d>>2]=((c[(c[g>>2]|0)+32>>2]|0)>>>0)/((c[(c[g>>2]|0)+36>>2]|0)>>>0)|0;i=f;return (c[e>>2]|0)-((c[d>>2]|0)+1+((c[e>>2]|0)-((c[d>>2]|0)+1)&0-((c[e>>2]|0)>>>0<((c[d>>2]|0)+1|0)>>>0&1)))|0}function ac(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;f=i;i=i+16|0;e=f+4|0;d=f;c[e>>2]=a;c[d>>2]=b;i=f;return ((c[e>>2]|0)>>>0)/((c[d>>2]|0)>>>0)|0|0}function bc(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;f=i;i=i+16|0;g=f+8|0;e=f+4|0;d=f;c[g>>2]=a;c[e>>2]=b;c[(c[g>>2]|0)+36>>2]=(c[(c[g>>2]|0)+28>>2]|0)>>>(c[e>>2]|0);c[d>>2]=((c[(c[g>>2]|0)+32>>2]|0)>>>0)/((c[(c[g>>2]|0)+36>>2]|0)>>>0)|0;i=f;return (1<<c[e>>2])-((c[d>>2]|0)+1+((1<<c[e>>2])-((c[d>>2]|0)+1)&0-(1<<c[e>>2]>>>0<((c[d>>2]|0)+1|0)>>>0&1)))|0}function cc(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0;k=i;i=i+32|0;f=k+16|0;g=k+12|0;h=k+8|0;l=k+4|0;j=k;c[f>>2]=a;c[g>>2]=b;c[h>>2]=d;c[l>>2]=e;c[j>>2]=_(c[(c[f>>2]|0)+36>>2]|0,(c[l>>2]|0)-(c[h>>2]|0)|0)|0;d=(c[f>>2]|0)+32|0;c[d>>2]=(c[d>>2]|0)-(c[j>>2]|0);d=c[f>>2]|0;if((c[g>>2]|0)>>>0>0){j=_(c[d+36>>2]|0,(c[h>>2]|0)-(c[g>>2]|0)|0)|0;l=c[f>>2]|0;l=l+28|0;c[l>>2]=j;l=c[f>>2]|0;_b(l);i=k;return}else{j=(c[d+28>>2]|0)-(c[j>>2]|0)|0;l=c[f>>2]|0;l=l+28|0;c[l>>2]=j;l=c[f>>2]|0;_b(l);i=k;return}}function dc(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0;j=i;i=i+32|0;d=j+20|0;k=j+16|0;f=j+12|0;e=j+8|0;h=j+4|0;g=j;c[d>>2]=a;c[k>>2]=b;c[f>>2]=c[(c[d>>2]|0)+28>>2];c[e>>2]=c[(c[d>>2]|0)+32>>2];c[h>>2]=(c[f>>2]|0)>>>(c[k>>2]|0);c[g>>2]=(c[e>>2]|0)>>>0<(c[h>>2]|0)>>>0&1;if(!(c[g>>2]|0))c[(c[d>>2]|0)+32>>2]=(c[e>>2]|0)-(c[h>>2]|0);if(c[g>>2]|0){h=c[h>>2]|0;k=c[d>>2]|0;k=k+28|0;c[k>>2]=h;k=c[d>>2]|0;_b(k);k=c[g>>2]|0;i=j;return k|0}else{h=(c[f>>2]|0)-(c[h>>2]|0)|0;k=c[d>>2]|0;k=k+28|0;c[k>>2]=h;k=c[d>>2]|0;_b(k);k=c[g>>2]|0;i=j;return k|0}return 0}function ec(a,b,e){a=a|0;b=b|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;n=i;i=i+32|0;f=n+28|0;g=n+24|0;o=n+20|0;j=n+16|0;h=n+12|0;l=n+8|0;m=n+4|0;k=n;c[f>>2]=a;c[g>>2]=b;c[o>>2]=e;c[l>>2]=c[(c[f>>2]|0)+28>>2];c[h>>2]=c[(c[f>>2]|0)+32>>2];c[j>>2]=(c[l>>2]|0)>>>(c[o>>2]|0);c[k>>2]=-1;do{c[m>>2]=c[l>>2];a=c[j>>2]|0;o=(c[k>>2]|0)+1|0;c[k>>2]=o;c[l>>2]=_(a,d[(c[g>>2]|0)+o>>0]|0)|0}while((c[h>>2]|0)>>>0<(c[l>>2]|0)>>>0);c[(c[f>>2]|0)+32>>2]=(c[h>>2]|0)-(c[l>>2]|0);c[(c[f>>2]|0)+28>>2]=(c[m>>2]|0)-(c[l>>2]|0);_b(c[f>>2]|0);i=n;return c[k>>2]|0}function fc(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0;l=i;i=i+32|0;d=l+24|0;e=l+20|0;f=l+16|0;g=l+12|0;j=l+8|0;h=l+4|0;k=l;c[e>>2]=a;c[f>>2]=b;c[f>>2]=(c[f>>2]|0)+-1;c[h>>2]=32-(aa(c[f>>2]|0)|0);if((c[h>>2]|0)<=8){c[f>>2]=(c[f>>2]|0)+1;c[j>>2]=$b(c[e>>2]|0,c[f>>2]|0)|0;cc(c[e>>2]|0,c[j>>2]|0,(c[j>>2]|0)+1|0,c[f>>2]|0);c[d>>2]=c[j>>2];k=c[d>>2]|0;i=l;return k|0}c[h>>2]=(c[h>>2]|0)-8;c[g>>2]=((c[f>>2]|0)>>>(c[h>>2]|0))+1;c[j>>2]=$b(c[e>>2]|0,c[g>>2]|0)|0;cc(c[e>>2]|0,c[j>>2]|0,(c[j>>2]|0)+1|0,c[g>>2]|0);j=c[j>>2]<<c[h>>2];c[k>>2]=j|(gc(c[e>>2]|0,c[h>>2]|0)|0);if((c[k>>2]|0)>>>0<=(c[f>>2]|0)>>>0){c[d>>2]=c[k>>2];k=c[d>>2]|0;i=l;return k|0}else{c[(c[e>>2]|0)+44>>2]=1;c[d>>2]=c[f>>2];k=c[d>>2]|0;i=l;return k|0}return 0}function gc(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0;j=i;i=i+32|0;d=j+16|0;e=j+12|0;h=j+8|0;f=j+4|0;g=j;c[d>>2]=a;c[e>>2]=b;c[h>>2]=c[(c[d>>2]|0)+12>>2];c[f>>2]=c[(c[d>>2]|0)+16>>2];if((c[f>>2]|0)>>>0<(c[e>>2]|0)>>>0)do{a=hc(c[d>>2]|0)|0;c[h>>2]=c[h>>2]|a<<c[f>>2];c[f>>2]=(c[f>>2]|0)+8}while((c[f>>2]|0)<=24);c[g>>2]=c[h>>2]&(1<<c[e>>2])-1;c[h>>2]=(c[h>>2]|0)>>>(c[e>>2]|0);c[f>>2]=(c[f>>2]|0)-(c[e>>2]|0);c[(c[d>>2]|0)+12>>2]=c[h>>2];c[(c[d>>2]|0)+16>>2]=c[f>>2];h=(c[d>>2]|0)+20|0;c[h>>2]=(c[h>>2]|0)+(c[e>>2]|0);i=j;return c[g>>2]|0}function hc(a){a=a|0;var b=0,e=0,f=0,g=0;e=i;i=i+16|0;b=e;c[b>>2]=a;if((c[(c[b>>2]|0)+8>>2]|0)>>>0>=(c[(c[b>>2]|0)+4>>2]|0)>>>0){a=0;i=e;return a|0}f=c[(c[b>>2]|0)+4>>2]|0;g=(c[b>>2]|0)+8|0;a=(c[g>>2]|0)+1|0;c[g>>2]=a;a=d[(c[c[b>>2]>>2]|0)+(f-a)>>0]|0;i=e;return a|0}function ic(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=i;i=i+16|0;f=e+8|0;h=e+4|0;g=e;c[f>>2]=a;c[h>>2]=b;c[g>>2]=d;c[c[f>>2]>>2]=c[h>>2];c[(c[f>>2]|0)+8>>2]=0;c[(c[f>>2]|0)+12>>2]=0;c[(c[f>>2]|0)+16>>2]=0;c[(c[f>>2]|0)+20>>2]=33;c[(c[f>>2]|0)+24>>2]=0;c[(c[f>>2]|0)+28>>2]=-2147483648;c[(c[f>>2]|0)+40>>2]=-1;c[(c[f>>2]|0)+32>>2]=0;c[(c[f>>2]|0)+36>>2]=0;c[(c[f>>2]|0)+4>>2]=c[g>>2];c[(c[f>>2]|0)+44>>2]=0;i=e;return}function jc(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0;l=i;i=i+32|0;f=l+16|0;g=l+12|0;h=l+8|0;j=l+4|0;k=l;c[f>>2]=a;c[g>>2]=b;c[h>>2]=d;c[j>>2]=e;c[k>>2]=kc(c[(c[f>>2]|0)+28>>2]|0,c[j>>2]|0)|0;if((c[g>>2]|0)>>>0>0){e=(c[(c[f>>2]|0)+28>>2]|0)-(_(c[k>>2]|0,(c[j>>2]|0)-(c[g>>2]|0)|0)|0)|0;a=(c[f>>2]|0)+32|0;c[a>>2]=(c[a>>2]|0)+e;k=_(c[k>>2]|0,(c[h>>2]|0)-(c[g>>2]|0)|0)|0;c[(c[f>>2]|0)+28>>2]=k;k=c[f>>2]|0;lc(k);i=l;return}else{a=_(c[k>>2]|0,(c[j>>2]|0)-(c[h>>2]|0)|0)|0;k=(c[f>>2]|0)+28|0;c[k>>2]=(c[k>>2]|0)-a;k=c[f>>2]|0;lc(k);i=l;return}}function kc(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;f=i;i=i+16|0;e=f+4|0;d=f;c[e>>2]=a;c[d>>2]=b;i=f;return ((c[e>>2]|0)>>>0)/((c[d>>2]|0)>>>0)|0|0}function lc(a){a=a|0;var b=0,d=0;d=i;i=i+16|0;b=d;c[b>>2]=a;while(1){if((c[(c[b>>2]|0)+28>>2]|0)>>>0>8388608)break;mc(c[b>>2]|0,(c[(c[b>>2]|0)+32>>2]|0)>>>23);c[(c[b>>2]|0)+32>>2]=c[(c[b>>2]|0)+32>>2]<<8&2147483647;a=(c[b>>2]|0)+28|0;c[a>>2]=c[a>>2]<<8;a=(c[b>>2]|0)+20|0;c[a>>2]=(c[a>>2]|0)+8}i=d;return}function mc(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;h=i;i=i+16|0;d=h+12|0;e=h+8|0;f=h+4|0;g=h;c[d>>2]=a;c[e>>2]=b;if((c[e>>2]|0)==255){g=(c[d>>2]|0)+36|0;c[g>>2]=(c[g>>2]|0)+1;i=h;return}c[f>>2]=c[e>>2]>>8;if((c[(c[d>>2]|0)+40>>2]|0)>=0){b=nc(c[d>>2]|0,(c[(c[d>>2]|0)+40>>2]|0)+(c[f>>2]|0)|0)|0;a=(c[d>>2]|0)+44|0;c[a>>2]=c[a>>2]|b}if((c[(c[d>>2]|0)+36>>2]|0)>>>0>0){c[g>>2]=255+(c[f>>2]|0)&255;do{f=nc(c[d>>2]|0,c[g>>2]|0)|0;a=(c[d>>2]|0)+44|0;c[a>>2]=c[a>>2]|f;a=(c[d>>2]|0)+36|0;f=(c[a>>2]|0)+-1|0;c[a>>2]=f}while(f>>>0>0)}c[(c[d>>2]|0)+40>>2]=c[e>>2]&255;i=h;return}function nc(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0;h=i;i=i+16|0;e=h+8|0;f=h+4|0;g=h;c[f>>2]=b;c[g>>2]=d;if(((c[(c[f>>2]|0)+24>>2]|0)+(c[(c[f>>2]|0)+8>>2]|0)|0)>>>0>=(c[(c[f>>2]|0)+4>>2]|0)>>>0){c[e>>2]=-1;d=c[e>>2]|0;i=h;return d|0}else{b=c[g>>2]&255;g=(c[f>>2]|0)+24|0;d=c[g>>2]|0;c[g>>2]=d+1;a[(c[c[f>>2]>>2]|0)+d>>0]=b;c[e>>2]=0;d=c[e>>2]|0;i=h;return d|0}return 0}function oc(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0;l=i;i=i+32|0;f=l+16|0;g=l+12|0;h=l+8|0;j=l+4|0;k=l;c[f>>2]=a;c[g>>2]=b;c[h>>2]=d;c[j>>2]=e;c[k>>2]=(c[(c[f>>2]|0)+28>>2]|0)>>>(c[j>>2]|0);if((c[g>>2]|0)>>>0>0){b=(c[(c[f>>2]|0)+28>>2]|0)-(_(c[k>>2]|0,(1<<c[j>>2])-(c[g>>2]|0)|0)|0)|0;a=(c[f>>2]|0)+32|0;c[a>>2]=(c[a>>2]|0)+b;k=_(c[k>>2]|0,(c[h>>2]|0)-(c[g>>2]|0)|0)|0;c[(c[f>>2]|0)+28>>2]=k;k=c[f>>2]|0;lc(k);i=l;return}else{a=_(c[k>>2]|0,(1<<c[j>>2])-(c[h>>2]|0)|0)|0;k=(c[f>>2]|0)+28|0;c[k>>2]=(c[k>>2]|0)-a;k=c[f>>2]|0;lc(k);i=l;return}}function pc(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0;k=i;i=i+32|0;e=k+20|0;f=k+16|0;l=k+12|0;h=k+8|0;j=k+4|0;g=k;c[e>>2]=a;c[f>>2]=b;c[l>>2]=d;c[h>>2]=c[(c[e>>2]|0)+28>>2];c[g>>2]=c[(c[e>>2]|0)+32>>2];c[j>>2]=(c[h>>2]|0)>>>(c[l>>2]|0);c[h>>2]=(c[h>>2]|0)-(c[j>>2]|0);if(c[f>>2]|0)c[(c[e>>2]|0)+32>>2]=(c[g>>2]|0)+(c[h>>2]|0);c[(c[e>>2]|0)+28>>2]=c[f>>2]|0?c[j>>2]|0:c[h>>2]|0;lc(c[e>>2]|0);i=k;return}function qc(a,b,e,f){a=a|0;b=b|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0;l=i;i=i+32|0;g=l+16|0;h=l+12|0;j=l+8|0;m=l+4|0;k=l;c[g>>2]=a;c[h>>2]=b;c[j>>2]=e;c[m>>2]=f;c[k>>2]=(c[(c[g>>2]|0)+28>>2]|0)>>>(c[m>>2]|0);if((c[h>>2]|0)>0){a=(c[(c[g>>2]|0)+28>>2]|0)-(_(c[k>>2]|0,d[(c[j>>2]|0)+((c[h>>2]|0)-1)>>0]|0)|0)|0;m=(c[g>>2]|0)+32|0;c[m>>2]=(c[m>>2]|0)+a;m=_(c[k>>2]|0,(d[(c[j>>2]|0)+((c[h>>2]|0)-1)>>0]|0)-(d[(c[j>>2]|0)+(c[h>>2]|0)>>0]|0)|0)|0;c[(c[g>>2]|0)+28>>2]=m;m=c[g>>2]|0;lc(m);i=l;return}else{k=_(c[k>>2]|0,d[(c[j>>2]|0)+(c[h>>2]|0)>>0]|0)|0;m=(c[g>>2]|0)+28|0;c[m>>2]=(c[m>>2]|0)-k;m=c[g>>2]|0;lc(m);i=l;return}}function rc(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0;l=i;i=i+32|0;e=l+20|0;f=l+16|0;g=l+12|0;j=l+8|0;h=l+4|0;k=l;c[e>>2]=a;c[f>>2]=b;c[g>>2]=d;c[g>>2]=(c[g>>2]|0)+-1;c[k>>2]=32-(aa(c[g>>2]|0)|0);if((c[k>>2]|0)>8){c[k>>2]=(c[k>>2]|0)-8;c[j>>2]=((c[g>>2]|0)>>>(c[k>>2]|0))+1;c[h>>2]=(c[f>>2]|0)>>>(c[k>>2]|0);jc(c[e>>2]|0,c[h>>2]|0,(c[h>>2]|0)+1|0,c[j>>2]|0);sc(c[e>>2]|0,c[f>>2]&(1<<c[k>>2])-1,c[k>>2]|0);i=l;return}else{jc(c[e>>2]|0,c[f>>2]|0,(c[f>>2]|0)+1|0,(c[g>>2]|0)+1|0);i=l;return}}function sc(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0;k=i;i=i+32|0;e=k+16|0;f=k+12|0;g=k+8|0;j=k+4|0;h=k;c[e>>2]=a;c[f>>2]=b;c[g>>2]=d;c[j>>2]=c[(c[e>>2]|0)+12>>2];c[h>>2]=c[(c[e>>2]|0)+16>>2];if(((c[h>>2]|0)+(c[g>>2]|0)|0)>>>0>32)do{b=tc(c[e>>2]|0,c[j>>2]&255)|0;a=(c[e>>2]|0)+44|0;c[a>>2]=c[a>>2]|b;c[j>>2]=(c[j>>2]|0)>>>8;c[h>>2]=(c[h>>2]|0)-8}while((c[h>>2]|0)>=8);c[j>>2]=c[j>>2]|c[f>>2]<<c[h>>2];c[h>>2]=(c[h>>2]|0)+(c[g>>2]|0);c[(c[e>>2]|0)+12>>2]=c[j>>2];c[(c[e>>2]|0)+16>>2]=c[h>>2];j=(c[e>>2]|0)+20|0;c[j>>2]=(c[j>>2]|0)+(c[g>>2]|0);i=k;return}function tc(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;h=i;i=i+16|0;e=h+8|0;f=h+4|0;g=h;c[f>>2]=b;c[g>>2]=d;if(((c[(c[f>>2]|0)+24>>2]|0)+(c[(c[f>>2]|0)+8>>2]|0)|0)>>>0>=(c[(c[f>>2]|0)+4>>2]|0)>>>0){c[e>>2]=-1;d=c[e>>2]|0;i=h;return d|0}else{g=c[g>>2]&255;b=c[(c[f>>2]|0)+4>>2]|0;j=(c[f>>2]|0)+8|0;d=(c[j>>2]|0)+1|0;c[j>>2]=d;a[(c[c[f>>2]>>2]|0)+(b-d)>>0]=g;c[e>>2]=0;d=c[e>>2]|0;i=h;return d|0}return 0}function uc(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0;m=i;i=i+32|0;g=m+16|0;h=m+12|0;j=m+8|0;l=m+4|0;k=m;c[g>>2]=b;c[h>>2]=e;c[j>>2]=f;c[l>>2]=8-(c[j>>2]|0);c[k>>2]=(1<<c[j>>2])-1<<c[l>>2];f=c[g>>2]|0;if((c[(c[g>>2]|0)+24>>2]|0)>>>0>0){a[c[c[g>>2]>>2]>>0]=(d[c[f>>2]>>0]|0)&~c[k>>2]|c[h>>2]<<c[l>>2];i=m;return}b=c[g>>2]|0;if((c[f+40>>2]|0)>=0){c[(c[g>>2]|0)+40>>2]=c[b+40>>2]&~c[k>>2]|c[h>>2]<<c[l>>2];i=m;return}f=c[g>>2]|0;if((c[b+28>>2]|0)>>>0<=-2147483648>>>(c[j>>2]|0)>>>0){c[(c[g>>2]|0)+32>>2]=c[f+32>>2]&~(c[k>>2]<<23)|c[h>>2]<<23+(c[l>>2]|0);i=m;return}else{c[f+44>>2]=-1;i=m;return}}function vc(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;i=i+16|0;e=d+4|0;f=d;c[e>>2]=a;c[f>>2]=b;qj((c[c[e>>2]>>2]|0)+(c[f>>2]|0)+(0-(c[(c[e>>2]|0)+8>>2]|0))|0,(c[c[e>>2]>>2]|0)+(c[(c[e>>2]|0)+4>>2]|0)+(0-(c[(c[e>>2]|0)+8>>2]|0))|0,(c[(c[e>>2]|0)+8>>2]|0)+0|0)|0;c[(c[e>>2]|0)+4>>2]=c[f>>2];i=d;return}function wc(b){b=b|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0;l=i;i=i+32|0;g=l+20|0;k=l+16|0;j=l+12|0;e=l+8|0;f=l+4|0;h=l;c[g>>2]=b;c[h>>2]=32-(32-(aa(c[(c[g>>2]|0)+28>>2]|0)|0));c[e>>2]=2147483647>>>(c[h>>2]|0);c[f>>2]=(c[(c[g>>2]|0)+32>>2]|0)+(c[e>>2]|0)&~c[e>>2];if((c[f>>2]|c[e>>2])>>>0>=((c[(c[g>>2]|0)+32>>2]|0)+(c[(c[g>>2]|0)+28>>2]|0)|0)>>>0){c[h>>2]=(c[h>>2]|0)+1;c[e>>2]=(c[e>>2]|0)>>>1;c[f>>2]=(c[(c[g>>2]|0)+32>>2]|0)+(c[e>>2]|0)&~c[e>>2]}while(1){b=c[g>>2]|0;if((c[h>>2]|0)<=0)break;mc(b,(c[f>>2]|0)>>>23);c[f>>2]=c[f>>2]<<8&2147483647;c[h>>2]=(c[h>>2]|0)-8}if(!((c[b+40>>2]|0)<0?(c[(c[g>>2]|0)+36>>2]|0)>>>0<=0:0))mc(c[g>>2]|0,0);c[k>>2]=c[(c[g>>2]|0)+12>>2];c[j>>2]=c[(c[g>>2]|0)+16>>2];while(1){b=c[g>>2]|0;if((c[j>>2]|0)<8)break;e=tc(b,c[k>>2]&255)|0;f=(c[g>>2]|0)+44|0;c[f>>2]=c[f>>2]|e;c[k>>2]=(c[k>>2]|0)>>>8;c[j>>2]=(c[j>>2]|0)-8}if(c[b+44>>2]|0){i=l;return}oj((c[c[g>>2]>>2]|0)+(c[(c[g>>2]|0)+24>>2]|0)|0,0,(c[(c[g>>2]|0)+4>>2]|0)-(c[(c[g>>2]|0)+24>>2]|0)-(c[(c[g>>2]|0)+8>>2]|0)|0)|0;if((c[j>>2]|0)<=0){i=l;return}if((c[(c[g>>2]|0)+8>>2]|0)>>>0>=(c[(c[g>>2]|0)+4>>2]|0)>>>0){c[(c[g>>2]|0)+44>>2]=-1;i=l;return}c[h>>2]=0-(c[h>>2]|0);if(((c[(c[g>>2]|0)+24>>2]|0)+(c[(c[g>>2]|0)+8>>2]|0)|0)>>>0>=(c[(c[g>>2]|0)+4>>2]|0)>>>0?(c[h>>2]|0)<(c[j>>2]|0):0){c[k>>2]=c[k>>2]&(1<<c[h>>2])-1;c[(c[g>>2]|0)+44>>2]=-1}j=(c[c[g>>2]>>2]|0)+((c[(c[g>>2]|0)+4>>2]|0)-(c[(c[g>>2]|0)+8>>2]|0)-1)|0;a[j>>0]=d[j>>0]|0|c[k>>2]&255;i=l;return}function xc(a,d){a=a|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;o=i;i=i+64|0;e=o+60|0;f=o+56|0;l=o+52|0;k=o+48|0;m=o+44|0;g=o+40|0;h=o+8|0;j=o+4|0;n=o;c[e>>2]=a;c[f>>2]=d;if((c[(c[e>>2]|0)+8>>2]|0)>0)d=c[(c[e>>2]|0)+8>>2]|0;else d=0;c[n>>2]=d;c[h>>2]=1;c[g>>2]=0;do{c[m>>2]=b[(c[e>>2]|0)+12+(c[g>>2]<<1<<1)>>1];c[k>>2]=b[(c[e>>2]|0)+12+((c[g>>2]<<1)+1<<1)>>1];a=_(c[h+(c[g>>2]<<2)>>2]|0,c[m>>2]|0)|0;c[h+((c[g>>2]|0)+1<<2)>>2]=a;c[g>>2]=(c[g>>2]|0)+1}while((c[k>>2]|0)!=1);c[k>>2]=b[(c[e>>2]|0)+12+((c[g>>2]<<1)-1<<1)>>1];c[j>>2]=(c[g>>2]|0)-1;while(1){if((c[j>>2]|0)<0)break;if(c[j>>2]|0)c[l>>2]=b[(c[e>>2]|0)+12+((c[j>>2]<<1)-1<<1)>>1];else c[l>>2]=1;switch(b[(c[e>>2]|0)+12+(c[j>>2]<<1<<1)>>1]|0){case 2:{yc(c[f>>2]|0,c[k>>2]|0,c[h+(c[j>>2]<<2)>>2]|0);break}case 4:{zc(c[f>>2]|0,c[h+(c[j>>2]<<2)>>2]<<c[n>>2],c[e>>2]|0,c[k>>2]|0,c[h+(c[j>>2]<<2)>>2]|0,c[l>>2]|0);break}case 3:{Ac(c[f>>2]|0,c[h+(c[j>>2]<<2)>>2]<<c[n>>2],c[e>>2]|0,c[k>>2]|0,c[h+(c[j>>2]<<2)>>2]|0,c[l>>2]|0);break}case 5:{Bc(c[f>>2]|0,c[h+(c[j>>2]<<2)>>2]<<c[n>>2],c[e>>2]|0,c[k>>2]|0,c[h+(c[j>>2]<<2)>>2]|0,c[l>>2]|0);break}default:{}}c[k>>2]=c[l>>2];c[j>>2]=(c[j>>2]|0)+-1}i=o;return}function yc(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0,k=0,l=0,m=0;m=i;i=i+32|0;e=m+28|0;f=m+20|0;h=m+16|0;j=m+12|0;l=m+8|0;k=m;c[e>>2]=a;c[m+24>>2]=b;c[f>>2]=d;g[l>>2]=.7071067690849304;c[j>>2]=0;while(1){if((c[j>>2]|0)>=(c[f>>2]|0))break;c[h>>2]=(c[e>>2]|0)+32;b=c[h>>2]|0;c[k>>2]=c[b>>2];c[k+4>>2]=c[b+4>>2];g[c[h>>2]>>2]=+g[c[e>>2]>>2]-+g[k>>2];g[(c[h>>2]|0)+4>>2]=+g[(c[e>>2]|0)+4>>2]-+g[k+4>>2];b=c[e>>2]|0;g[b>>2]=+g[b>>2]+ +g[k>>2];b=(c[e>>2]|0)+4|0;g[b>>2]=+g[b>>2]+ +g[k+4>>2];g[k>>2]=(+g[(c[h>>2]|0)+8>>2]+ +g[(c[h>>2]|0)+8+4>>2])*+g[l>>2];g[k+4>>2]=(+g[(c[h>>2]|0)+8+4>>2]-+g[(c[h>>2]|0)+8>>2])*+g[l>>2];g[(c[h>>2]|0)+8>>2]=+g[(c[e>>2]|0)+8>>2]-+g[k>>2];g[(c[h>>2]|0)+8+4>>2]=+g[(c[e>>2]|0)+8+4>>2]-+g[k+4>>2];b=(c[e>>2]|0)+8|0;g[b>>2]=+g[b>>2]+ +g[k>>2];b=(c[e>>2]|0)+8+4|0;g[b>>2]=+g[b>>2]+ +g[k+4>>2];g[k>>2]=+g[(c[h>>2]|0)+16+4>>2];g[k+4>>2]=-+g[(c[h>>2]|0)+16>>2];g[(c[h>>2]|0)+16>>2]=+g[(c[e>>2]|0)+16>>2]-+g[k>>2];g[(c[h>>2]|0)+16+4>>2]=+g[(c[e>>2]|0)+16+4>>2]-+g[k+4>>2];b=(c[e>>2]|0)+16|0;g[b>>2]=+g[b>>2]+ +g[k>>2];b=(c[e>>2]|0)+16+4|0;g[b>>2]=+g[b>>2]+ +g[k+4>>2];g[k>>2]=(+g[(c[h>>2]|0)+24+4>>2]-+g[(c[h>>2]|0)+24>>2])*+g[l>>2];g[k+4>>2]=(-+g[(c[h>>2]|0)+24+4>>2]-+g[(c[h>>2]|0)+24>>2])*+g[l>>2];g[(c[h>>2]|0)+24>>2]=+g[(c[e>>2]|0)+24>>2]-+g[k>>2];g[(c[h>>2]|0)+24+4>>2]=+g[(c[e>>2]|0)+24+4>>2]-+g[k+4>>2];b=(c[e>>2]|0)+24|0;g[b>>2]=+g[b>>2]+ +g[k>>2];b=(c[e>>2]|0)+24+4|0;g[b>>2]=+g[b>>2]+ +g[k+4>>2];c[e>>2]=(c[e>>2]|0)+64;c[j>>2]=(c[j>>2]|0)+1}i=m;return}function zc(a,b,d,e,f,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0;A=i;i=i+128|0;j=A+120|0;k=A+116|0;l=A+112|0;m=A+108|0;n=A+104|0;o=A+100|0;q=A+96|0;v=A+88|0;w=A+80|0;r=A+72|0;u=A+24|0;x=A+20|0;y=A+16|0;z=A+12|0;s=A+8|0;t=A+4|0;p=A;c[j>>2]=a;c[k>>2]=b;c[l>>2]=d;c[m>>2]=e;c[n>>2]=f;c[o>>2]=h;if((c[m>>2]|0)==1){c[q>>2]=0;while(1){if((c[q>>2]|0)>=(c[n>>2]|0))break;g[v>>2]=+g[c[j>>2]>>2]-+g[(c[j>>2]|0)+16>>2];g[v+4>>2]=+g[(c[j>>2]|0)+4>>2]-+g[(c[j>>2]|0)+16+4>>2];z=c[j>>2]|0;g[z>>2]=+g[z>>2]+ +g[(c[j>>2]|0)+16>>2];z=(c[j>>2]|0)+4|0;g[z>>2]=+g[z>>2]+ +g[(c[j>>2]|0)+16+4>>2];g[w>>2]=+g[(c[j>>2]|0)+8>>2]+ +g[(c[j>>2]|0)+24>>2];g[w+4>>2]=+g[(c[j>>2]|0)+8+4>>2]+ +g[(c[j>>2]|0)+24+4>>2];g[(c[j>>2]|0)+16>>2]=+g[c[j>>2]>>2]-+g[w>>2];g[(c[j>>2]|0)+16+4>>2]=+g[(c[j>>2]|0)+4>>2]-+g[w+4>>2];z=c[j>>2]|0;g[z>>2]=+g[z>>2]+ +g[w>>2];z=(c[j>>2]|0)+4|0;g[z>>2]=+g[z>>2]+ +g[w+4>>2];g[w>>2]=+g[(c[j>>2]|0)+8>>2]-+g[(c[j>>2]|0)+24>>2];g[w+4>>2]=+g[(c[j>>2]|0)+8+4>>2]-+g[(c[j>>2]|0)+24+4>>2];g[(c[j>>2]|0)+8>>2]=+g[v>>2]+ +g[w+4>>2];g[(c[j>>2]|0)+8+4>>2]=+g[v+4>>2]-+g[w>>2];g[(c[j>>2]|0)+24>>2]=+g[v>>2]-+g[w+4>>2];g[(c[j>>2]|0)+24+4>>2]=+g[v+4>>2]+ +g[w>>2];c[j>>2]=(c[j>>2]|0)+32;c[q>>2]=(c[q>>2]|0)+1}i=A;return}c[s>>2]=c[m>>2]<<1;c[t>>2]=(c[m>>2]|0)*3;c[p>>2]=c[j>>2];c[q>>2]=0;while(1){if((c[q>>2]|0)>=(c[n>>2]|0))break;c[j>>2]=(c[p>>2]|0)+((_(c[q>>2]|0,c[o>>2]|0)|0)<<3);d=c[(c[l>>2]|0)+48>>2]|0;c[x>>2]=d;c[y>>2]=d;c[z>>2]=d;c[r>>2]=0;while(1){if((c[r>>2]|0)>=(c[m>>2]|0))break;g[u>>2]=+g[(c[j>>2]|0)+(c[m>>2]<<3)>>2]*+g[c[x>>2]>>2]-+g[(c[j>>2]|0)+(c[m>>2]<<3)+4>>2]*+g[(c[x>>2]|0)+4>>2];g[u+4>>2]=+g[(c[j>>2]|0)+(c[m>>2]<<3)>>2]*+g[(c[x>>2]|0)+4>>2]+ +g[(c[j>>2]|0)+(c[m>>2]<<3)+4>>2]*+g[c[x>>2]>>2];g[u+8>>2]=+g[(c[j>>2]|0)+(c[s>>2]<<3)>>2]*+g[c[y>>2]>>2]-+g[(c[j>>2]|0)+(c[s>>2]<<3)+4>>2]*+g[(c[y>>2]|0)+4>>2];g[u+8+4>>2]=+g[(c[j>>2]|0)+(c[s>>2]<<3)>>2]*+g[(c[y>>2]|0)+4>>2]+ +g[(c[j>>2]|0)+(c[s>>2]<<3)+4>>2]*+g[c[y>>2]>>2];g[u+16>>2]=+g[(c[j>>2]|0)+(c[t>>2]<<3)>>2]*+g[c[z>>2]>>2]-+g[(c[j>>2]|0)+(c[t>>2]<<3)+4>>2]*+g[(c[z>>2]|0)+4>>2];g[u+16+4>>2]=+g[(c[j>>2]|0)+(c[t>>2]<<3)>>2]*+g[(c[z>>2]|0)+4>>2]+ +g[(c[j>>2]|0)+(c[t>>2]<<3)+4>>2]*+g[c[z>>2]>>2];g[u+40>>2]=+g[c[j>>2]>>2]-+g[u+8>>2];g[u+40+4>>2]=+g[(c[j>>2]|0)+4>>2]-+g[u+8+4>>2];d=c[j>>2]|0;g[d>>2]=+g[d>>2]+ +g[u+8>>2];d=(c[j>>2]|0)+4|0;g[d>>2]=+g[d>>2]+ +g[u+8+4>>2];g[u+24>>2]=+g[u>>2]+ +g[u+16>>2];g[u+24+4>>2]=+g[u+4>>2]+ +g[u+16+4>>2];g[u+32>>2]=+g[u>>2]-+g[u+16>>2];g[u+32+4>>2]=+g[u+4>>2]-+g[u+16+4>>2];g[(c[j>>2]|0)+(c[s>>2]<<3)>>2]=+g[c[j>>2]>>2]-+g[u+24>>2];g[(c[j>>2]|0)+(c[s>>2]<<3)+4>>2]=+g[(c[j>>2]|0)+4>>2]-+g[u+24+4>>2];c[x>>2]=(c[x>>2]|0)+(c[k>>2]<<3);c[y>>2]=(c[y>>2]|0)+(c[k>>2]<<1<<3);c[z>>2]=(c[z>>2]|0)+((c[k>>2]|0)*3<<3);d=c[j>>2]|0;g[d>>2]=+g[d>>2]+ +g[u+24>>2];d=(c[j>>2]|0)+4|0;g[d>>2]=+g[d>>2]+ +g[u+24+4>>2];g[(c[j>>2]|0)+(c[m>>2]<<3)>>2]=+g[u+40>>2]+ +g[u+32+4>>2];g[(c[j>>2]|0)+(c[m>>2]<<3)+4>>2]=+g[u+40+4>>2]-+g[u+32>>2];g[(c[j>>2]|0)+(c[t>>2]<<3)>>2]=+g[u+40>>2]-+g[u+32+4>>2];g[(c[j>>2]|0)+(c[t>>2]<<3)+4>>2]=+g[u+40+4>>2]+ +g[u+32>>2];c[j>>2]=(c[j>>2]|0)+8;c[r>>2]=(c[r>>2]|0)+1}c[q>>2]=(c[q>>2]|0)+1}i=A;return}function Ac(a,b,d,e,f,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;x=i;i=i+112|0;j=x+96|0;k=x+92|0;l=x+88|0;m=x+84|0;n=x+80|0;o=x+76|0;r=x+72|0;s=x+68|0;t=x+64|0;v=x+60|0;w=x+56|0;u=x+16|0;q=x+8|0;p=x;c[j>>2]=a;c[k>>2]=b;c[l>>2]=d;c[m>>2]=e;c[n>>2]=f;c[o>>2]=h;c[t>>2]=c[m>>2]<<1;c[p>>2]=c[j>>2];d=_(c[k>>2]|0,c[m>>2]|0)|0;d=(c[(c[l>>2]|0)+48>>2]|0)+(d<<3)|0;c[q>>2]=c[d>>2];c[q+4>>2]=c[d+4>>2];c[r>>2]=0;while(1){if((c[r>>2]|0)>=(c[n>>2]|0))break;c[j>>2]=(c[p>>2]|0)+((_(c[r>>2]|0,c[o>>2]|0)|0)<<3);d=c[(c[l>>2]|0)+48>>2]|0;c[w>>2]=d;c[v>>2]=d;c[s>>2]=c[m>>2];do{g[u+8>>2]=+g[(c[j>>2]|0)+(c[m>>2]<<3)>>2]*+g[c[v>>2]>>2]-+g[(c[j>>2]|0)+(c[m>>2]<<3)+4>>2]*+g[(c[v>>2]|0)+4>>2];g[u+8+4>>2]=+g[(c[j>>2]|0)+(c[m>>2]<<3)>>2]*+g[(c[v>>2]|0)+4>>2]+ +g[(c[j>>2]|0)+(c[m>>2]<<3)+4>>2]*+g[c[v>>2]>>2];g[u+16>>2]=+g[(c[j>>2]|0)+(c[t>>2]<<3)>>2]*+g[c[w>>2]>>2]-+g[(c[j>>2]|0)+(c[t>>2]<<3)+4>>2]*+g[(c[w>>2]|0)+4>>2];g[u+16+4>>2]=+g[(c[j>>2]|0)+(c[t>>2]<<3)>>2]*+g[(c[w>>2]|0)+4>>2]+ +g[(c[j>>2]|0)+(c[t>>2]<<3)+4>>2]*+g[c[w>>2]>>2];g[u+24>>2]=+g[u+8>>2]+ +g[u+16>>2];g[u+24+4>>2]=+g[u+8+4>>2]+ +g[u+16+4>>2];g[u>>2]=+g[u+8>>2]-+g[u+16>>2];g[u+4>>2]=+g[u+8+4>>2]-+g[u+16+4>>2];c[v>>2]=(c[v>>2]|0)+(c[k>>2]<<3);c[w>>2]=(c[w>>2]|0)+(c[k>>2]<<1<<3);g[(c[j>>2]|0)+(c[m>>2]<<3)>>2]=+g[c[j>>2]>>2]-+g[u+24>>2]*.5;g[(c[j>>2]|0)+(c[m>>2]<<3)+4>>2]=+g[(c[j>>2]|0)+4>>2]-+g[u+24+4>>2]*.5;g[u>>2]=+g[u>>2]*+g[q+4>>2];d=u+4|0;g[d>>2]=+g[d>>2]*+g[q+4>>2];d=c[j>>2]|0;g[d>>2]=+g[d>>2]+ +g[u+24>>2];d=(c[j>>2]|0)+4|0;g[d>>2]=+g[d>>2]+ +g[u+24+4>>2];g[(c[j>>2]|0)+(c[t>>2]<<3)>>2]=+g[(c[j>>2]|0)+(c[m>>2]<<3)>>2]+ +g[u+4>>2];g[(c[j>>2]|0)+(c[t>>2]<<3)+4>>2]=+g[(c[j>>2]|0)+(c[m>>2]<<3)+4>>2]-+g[u>>2];d=(c[j>>2]|0)+(c[m>>2]<<3)|0;g[d>>2]=+g[d>>2]-+g[u+4>>2];d=(c[j>>2]|0)+(c[m>>2]<<3)+4|0;g[d>>2]=+g[d>>2]+ +g[u>>2];c[j>>2]=(c[j>>2]|0)+8;d=(c[s>>2]|0)+-1|0;c[s>>2]=d}while((d|0)!=0);c[r>>2]=(c[r>>2]|0)+1}i=x;return}function Bc(a,b,d,e,f,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0;A=i;i=i+192|0;j=A+184|0;k=A+180|0;B=A+176|0;l=A+172|0;m=A+168|0;n=A+164|0;o=A+160|0;p=A+156|0;q=A+152|0;r=A+148|0;s=A+144|0;u=A+140|0;x=A+136|0;v=A+32|0;w=A+24|0;y=A+16|0;z=A+8|0;t=A;c[j>>2]=a;c[k>>2]=b;c[B>>2]=d;c[l>>2]=e;c[m>>2]=f;c[n>>2]=h;c[t>>2]=c[j>>2];d=_(c[k>>2]|0,c[l>>2]|0)|0;d=(c[(c[B>>2]|0)+48>>2]|0)+(d<<3)|0;c[y>>2]=c[d>>2];c[y+4>>2]=c[d+4>>2];d=_(c[k>>2]<<1,c[l>>2]|0)|0;d=(c[(c[B>>2]|0)+48>>2]|0)+(d<<3)|0;c[z>>2]=c[d>>2];c[z+4>>2]=c[d+4>>2];c[w>>2]=c[(c[B>>2]|0)+48>>2];c[u>>2]=0;while(1){if((c[u>>2]|0)>=(c[m>>2]|0))break;c[j>>2]=(c[t>>2]|0)+((_(c[u>>2]|0,c[n>>2]|0)|0)<<3);c[o>>2]=c[j>>2];c[p>>2]=(c[o>>2]|0)+(c[l>>2]<<3);c[q>>2]=(c[o>>2]|0)+(c[l>>2]<<1<<3);c[r>>2]=(c[o>>2]|0)+((c[l>>2]|0)*3<<3);c[s>>2]=(c[o>>2]|0)+(c[l>>2]<<2<<3);c[x>>2]=0;while(1){if((c[x>>2]|0)>=(c[l>>2]|0))break;B=c[o>>2]|0;c[v>>2]=c[B>>2];c[v+4>>2]=c[B+4>>2];B=_(c[x>>2]|0,c[k>>2]|0)|0;d=_(c[x>>2]|0,c[k>>2]|0)|0;g[v+8>>2]=+g[c[p>>2]>>2]*+g[(c[w>>2]|0)+(B<<3)>>2]-+g[(c[p>>2]|0)+4>>2]*+g[(c[w>>2]|0)+(d<<3)+4>>2];d=_(c[x>>2]|0,c[k>>2]|0)|0;B=_(c[x>>2]|0,c[k>>2]|0)|0;g[v+8+4>>2]=+g[c[p>>2]>>2]*+g[(c[w>>2]|0)+(d<<3)+4>>2]+ +g[(c[p>>2]|0)+4>>2]*+g[(c[w>>2]|0)+(B<<3)>>2];B=_(c[x>>2]<<1,c[k>>2]|0)|0;d=_(c[x>>2]<<1,c[k>>2]|0)|0;g[v+16>>2]=+g[c[q>>2]>>2]*+g[(c[w>>2]|0)+(B<<3)>>2]-+g[(c[q>>2]|0)+4>>2]*+g[(c[w>>2]|0)+(d<<3)+4>>2];d=_(c[x>>2]<<1,c[k>>2]|0)|0;B=_(c[x>>2]<<1,c[k>>2]|0)|0;g[v+16+4>>2]=+g[c[q>>2]>>2]*+g[(c[w>>2]|0)+(d<<3)+4>>2]+ +g[(c[q>>2]|0)+4>>2]*+g[(c[w>>2]|0)+(B<<3)>>2];B=_((c[x>>2]|0)*3|0,c[k>>2]|0)|0;d=_((c[x>>2]|0)*3|0,c[k>>2]|0)|0;g[v+24>>2]=+g[c[r>>2]>>2]*+g[(c[w>>2]|0)+(B<<3)>>2]-+g[(c[r>>2]|0)+4>>2]*+g[(c[w>>2]|0)+(d<<3)+4>>2];d=_((c[x>>2]|0)*3|0,c[k>>2]|0)|0;B=_((c[x>>2]|0)*3|0,c[k>>2]|0)|0;g[v+24+4>>2]=+g[c[r>>2]>>2]*+g[(c[w>>2]|0)+(d<<3)+4>>2]+ +g[(c[r>>2]|0)+4>>2]*+g[(c[w>>2]|0)+(B<<3)>>2];B=_(c[x>>2]<<2,c[k>>2]|0)|0;d=_(c[x>>2]<<2,c[k>>2]|0)|0;g[v+32>>2]=+g[c[s>>2]>>2]*+g[(c[w>>2]|0)+(B<<3)>>2]-+g[(c[s>>2]|0)+4>>2]*+g[(c[w>>2]|0)+(d<<3)+4>>2];d=_(c[x>>2]<<2,c[k>>2]|0)|0;B=_(c[x>>2]<<2,c[k>>2]|0)|0;g[v+32+4>>2]=+g[c[s>>2]>>2]*+g[(c[w>>2]|0)+(d<<3)+4>>2]+ +g[(c[s>>2]|0)+4>>2]*+g[(c[w>>2]|0)+(B<<3)>>2];g[v+56>>2]=+g[v+8>>2]+ +g[v+32>>2];g[v+56+4>>2]=+g[v+8+4>>2]+ +g[v+32+4>>2];g[v+80>>2]=+g[v+8>>2]-+g[v+32>>2];g[v+80+4>>2]=+g[v+8+4>>2]-+g[v+32+4>>2];g[v+64>>2]=+g[v+16>>2]+ +g[v+24>>2];g[v+64+4>>2]=+g[v+16+4>>2]+ +g[v+24+4>>2];g[v+72>>2]=+g[v+16>>2]-+g[v+24>>2];g[v+72+4>>2]=+g[v+16+4>>2]-+g[v+24+4>>2];B=c[o>>2]|0;g[B>>2]=+g[B>>2]+(+g[v+56>>2]+ +g[v+64>>2]);B=(c[o>>2]|0)+4|0;g[B>>2]=+g[B>>2]+(+g[v+56+4>>2]+ +g[v+64+4>>2]);g[v+40>>2]=+g[v>>2]+ +g[v+56>>2]*+g[y>>2]+ +g[v+64>>2]*+g[z>>2];g[v+40+4>>2]=+g[v+4>>2]+ +g[v+56+4>>2]*+g[y>>2]+ +g[v+64+4>>2]*+g[z>>2];g[v+48>>2]=+g[v+80+4>>2]*+g[y+4>>2]+ +g[v+72+4>>2]*+g[z+4>>2];g[v+48+4>>2]=-(+g[v+80>>2]*+g[y+4>>2])-+g[v+72>>2]*+g[z+4>>2];g[c[p>>2]>>2]=+g[v+40>>2]-+g[v+48>>2];g[(c[p>>2]|0)+4>>2]=+g[v+40+4>>2]-+g[v+48+4>>2];g[c[s>>2]>>2]=+g[v+40>>2]+ +g[v+48>>2];g[(c[s>>2]|0)+4>>2]=+g[v+40+4>>2]+ +g[v+48+4>>2];g[v+88>>2]=+g[v>>2]+ +g[v+56>>2]*+g[z>>2]+ +g[v+64>>2]*+g[y>>2];g[v+88+4>>2]=+g[v+4>>2]+ +g[v+56+4>>2]*+g[z>>2]+ +g[v+64+4>>2]*+g[y>>2];g[v+96>>2]=-(+g[v+80+4>>2]*+g[z+4>>2])+ +g[v+72+4>>2]*+g[y+4>>2];g[v+96+4>>2]=+g[v+80>>2]*+g[z+4>>2]-+g[v+72>>2]*+g[y+4>>2];g[c[q>>2]>>2]=+g[v+88>>2]+ +g[v+96>>2];g[(c[q>>2]|0)+4>>2]=+g[v+88+4>>2]+ +g[v+96+4>>2];g[c[r>>2]>>2]=+g[v+88>>2]-+g[v+96>>2];g[(c[r>>2]|0)+4>>2]=+g[v+88+4>>2]-+g[v+96+4>>2];c[o>>2]=(c[o>>2]|0)+8;c[p>>2]=(c[p>>2]|0)+8;c[q>>2]=(c[q>>2]|0)+8;c[r>>2]=(c[r>>2]|0)+8;c[s>>2]=(c[s>>2]|0)+8;c[x>>2]=(c[x>>2]|0)+1}c[u>>2]=(c[u>>2]|0)+1}i=A;return}function Cc(a,d,e){a=a|0;d=d|0;e=e|0;var f=0,h=0,j=0,k=0,l=0,m=0,n=0;n=i;i=i+32|0;f=n+24|0;h=n+20|0;j=n+16|0;k=n+12|0;l=n+8|0;m=n;c[f>>2]=a;c[h>>2]=d;c[j>>2]=e;g[l>>2]=+g[(c[f>>2]|0)+4>>2];c[k>>2]=0;while(1){if((c[k>>2]|0)>=(c[c[f>>2]>>2]|0))break;a=(c[h>>2]|0)+(c[k>>2]<<3)|0;c[m>>2]=c[a>>2];c[m+4>>2]=c[a+4>>2];g[(c[j>>2]|0)+(b[(c[(c[f>>2]|0)+44>>2]|0)+(c[k>>2]<<1)>>1]<<3)>>2]=+g[l>>2]*+g[m>>2];g[(c[j>>2]|0)+(b[(c[(c[f>>2]|0)+44>>2]|0)+(c[k>>2]<<1)>>1]<<3)+4>>2]=+g[l>>2]*+g[m+4>>2];c[k>>2]=(c[k>>2]|0)+1}xc(c[f>>2]|0,c[j>>2]|0);i=n;return}function Dc(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;q=i;i=i+48|0;j=q+36|0;k=q+32|0;l=q+28|0;f=q+24|0;n=q+20|0;h=q+16|0;p=q+12|0;o=q+8|0;m=q+4|0;g=q;c[j>>2]=a;c[k>>2]=b;c[l>>2]=d;c[f>>2]=e;c[h>>2]=c[c[k>>2]>>2];c[n>>2]=0;if(!(c[h>>2]|0)){m=c[j>>2]|0;o=c[n>>2]|0;n=c[n>>2]|0;p=c[l>>2]|0;p=n+p|0;oc(m,o,p,15);i=q;return}c[p>>2]=0-((c[h>>2]|0)<0&1);c[h>>2]=(c[h>>2]|0)+(c[p>>2]|0)^c[p>>2];c[n>>2]=c[l>>2];c[l>>2]=Ec(c[l>>2]|0,c[f>>2]|0)|0;c[o>>2]=1;while(1){if((c[l>>2]|0)>>>0>0)a=(c[o>>2]|0)<(c[h>>2]|0);else a=0;e=c[l>>2]|0;if(!a)break;c[l>>2]=e<<1;c[n>>2]=(c[n>>2]|0)+((c[l>>2]|0)+2);c[l>>2]=(_(c[l>>2]|0,c[f>>2]|0)|0)>>>15;c[o>>2]=(c[o>>2]|0)+1}if(e|0){c[l>>2]=(c[l>>2]|0)+1;c[n>>2]=(c[n>>2]|0)+(c[l>>2]&~c[p>>2]);m=c[j>>2]|0;o=c[n>>2]|0;n=c[n>>2]|0;p=c[l>>2]|0;p=n+p|0;oc(m,o,p,15);i=q;return}c[g>>2]=(32768-(c[n>>2]|0)+1-1|0)>>>0;c[g>>2]=(c[g>>2]|0)-(c[p>>2]|0)>>1;if(((c[h>>2]|0)-(c[o>>2]|0)|0)<((c[g>>2]|0)-1|0))e=(c[h>>2]|0)-(c[o>>2]|0)|0;else e=(c[g>>2]|0)-1|0;c[m>>2]=e;c[n>>2]=(c[n>>2]|0)+((c[m>>2]<<1)+1+(c[p>>2]|0));c[l>>2]=1<(32768-(c[n>>2]|0)|0)>>>0?1:32768-(c[n>>2]|0)|0;c[c[k>>2]>>2]=(c[o>>2]|0)+(c[m>>2]|0)+(c[p>>2]|0)^c[p>>2];m=c[j>>2]|0;o=c[n>>2]|0;n=c[n>>2]|0;p=c[l>>2]|0;p=n+p|0;oc(m,o,p,15);i=q;return}function Ec(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;i=i+16|0;g=d+8|0;e=d+4|0;f=d;c[g>>2]=a;c[e>>2]=b;c[f>>2]=32736-(c[g>>2]|0);a=(_(c[f>>2]|0,16384-(c[e>>2]|0)|0)|0)>>>15;i=d;return a|0}function Fc(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;m=i;i=i+32|0;e=m+24|0;j=m+20|0;f=m+16|0;l=m+12|0;k=m+8|0;h=m+4|0;g=m;c[e>>2]=a;c[j>>2]=b;c[f>>2]=d;c[l>>2]=0;c[h>>2]=bc(c[e>>2]|0,15)|0;c[k>>2]=0;do if((c[h>>2]|0)>>>0>=(c[j>>2]|0)>>>0){c[l>>2]=(c[l>>2]|0)+1;c[k>>2]=c[j>>2];c[j>>2]=(Ec(c[j>>2]|0,c[f>>2]|0)|0)+1;while(1){if((c[j>>2]|0)>>>0>1)d=(c[h>>2]|0)>>>0>=((c[k>>2]|0)+(c[j>>2]<<1)|0)>>>0;else d=0;a=c[j>>2]|0;if(!d)break;c[j>>2]=a<<1;c[k>>2]=(c[k>>2]|0)+(c[j>>2]|0);c[j>>2]=(_((c[j>>2]|0)-2|0,c[f>>2]|0)|0)>>>15;c[j>>2]=(c[j>>2]|0)+1;c[l>>2]=(c[l>>2]|0)+1}if(a>>>0<=1){c[g>>2]=((c[h>>2]|0)-(c[k>>2]|0)|0)>>>1;c[l>>2]=(c[l>>2]|0)+(c[g>>2]|0);c[k>>2]=(c[k>>2]|0)+(c[g>>2]<<1)}if((c[h>>2]|0)>>>0<((c[k>>2]|0)+(c[j>>2]|0)|0)>>>0){c[l>>2]=0-(c[l>>2]|0);break}else{c[k>>2]=(c[k>>2]|0)+(c[j>>2]|0);break}}while(0);a=c[e>>2]|0;d=c[k>>2]|0;if(((c[k>>2]|0)+(c[j>>2]|0)|0)>>>0>=32768){k=32768;cc(a,d,k,32768);l=c[l>>2]|0;i=m;return l|0}k=(c[k>>2]|0)+(c[j>>2]|0)|0;cc(a,d,k,32768);l=c[l>>2]|0;i=m;return l|0}function Gc(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;h=i;i=i+32|0;b=h+16|0;d=h+12|0;f=h+8|0;e=h+4|0;g=h;c[b>>2]=a;c[f>>2]=0;c[e>>2]=32-(aa(c[b>>2]|0)|0)-1>>1;c[d>>2]=1<<c[e>>2];do{c[g>>2]=(c[f>>2]<<1)+(c[d>>2]|0)<<c[e>>2];if((c[g>>2]|0)>>>0<=(c[b>>2]|0)>>>0){c[f>>2]=(c[f>>2]|0)+(c[d>>2]|0);c[b>>2]=(c[b>>2]|0)-(c[g>>2]|0)}c[d>>2]=(c[d>>2]|0)>>>1;c[e>>2]=(c[e>>2]|0)+-1}while((c[e>>2]|0)>=0);i=h;return c[f>>2]|0}function Hc(a,d,e,f,h,j,k,l){a=a|0;d=d|0;e=e|0;f=f|0;h=h|0;j=j|0;k=k|0;l=l|0;var m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0.0;U=i;i=i+160|0;V=U+144|0;o=U+140|0;p=U+136|0;q=U+132|0;r=U+128|0;m=U+124|0;s=U+120|0;x=U+112|0;n=U+108|0;u=U+104|0;v=U+100|0;B=U+96|0;G=U+92|0;A=U+88|0;t=U+84|0;J=U+80|0;K=U+76|0;O=U+72|0;H=U+68|0;I=U+64|0;P=U+60|0;C=U+56|0;L=U+48|0;D=U+44|0;E=U+40|0;z=U+36|0;y=U+32|0;S=U+28|0;M=U+24|0;w=U+20|0;Q=U+16|0;R=U+12|0;F=U+8|0;T=U+4|0;N=U;c[V>>2]=a;c[o>>2]=d;c[p>>2]=e;c[q>>2]=f;c[r>>2]=h;c[m>>2]=j;c[s>>2]=k;c[U+116>>2]=l;c[B>>2]=c[(c[V>>2]|0)+8+(c[m>>2]<<2)>>2];g[A>>2]=+g[(c[B>>2]|0)+4>>2];c[n>>2]=c[c[V>>2]>>2];c[G>>2]=c[(c[V>>2]|0)+24>>2];c[x>>2]=0;while(1){l=c[n>>2]>>1;if((c[x>>2]|0)>=(c[m>>2]|0))break;c[n>>2]=l;c[G>>2]=(c[G>>2]|0)+(c[n>>2]<<2);c[x>>2]=(c[x>>2]|0)+1}c[u>>2]=l;c[v>>2]=c[n>>2]>>2;d=c[u>>2]|0;c[t>>2]=ia()|0;l=i;i=i+((1*(d<<2)|0)+15&-16)|0;d=i;i=i+((1*(c[v>>2]<<3)|0)+15&-16)|0;c[J>>2]=(c[o>>2]|0)+(c[r>>2]>>1<<2);c[K>>2]=(c[o>>2]|0)+(c[u>>2]<<2)+-4+(c[r>>2]>>1<<2);c[O>>2]=l;c[H>>2]=(c[q>>2]|0)+(c[r>>2]>>1<<2);c[I>>2]=(c[q>>2]|0)+(c[r>>2]>>1<<2)+-4;c[x>>2]=0;while(1){if((c[x>>2]|0)>=((c[r>>2]|0)+3>>2|0))break;W=+g[c[I>>2]>>2]*+g[(c[J>>2]|0)+(c[u>>2]<<2)>>2]+ +g[c[H>>2]>>2]*+g[c[K>>2]>>2];V=c[O>>2]|0;c[O>>2]=V+4;g[V>>2]=W;W=+g[c[H>>2]>>2]*+g[c[J>>2]>>2]-+g[c[I>>2]>>2]*+g[(c[K>>2]|0)+(0-(c[u>>2]|0)<<2)>>2];V=c[O>>2]|0;c[O>>2]=V+4;g[V>>2]=W;c[J>>2]=(c[J>>2]|0)+8;c[K>>2]=(c[K>>2]|0)+-8;c[H>>2]=(c[H>>2]|0)+8;c[I>>2]=(c[I>>2]|0)+-8;c[x>>2]=(c[x>>2]|0)+1}c[H>>2]=c[q>>2];c[I>>2]=(c[q>>2]|0)+(c[r>>2]<<2)+-4;while(1){if((c[x>>2]|0)>=((c[v>>2]|0)-((c[r>>2]|0)+3>>2)|0))break;W=+g[c[K>>2]>>2];V=c[O>>2]|0;c[O>>2]=V+4;g[V>>2]=W;W=+g[c[J>>2]>>2];V=c[O>>2]|0;c[O>>2]=V+4;g[V>>2]=W;c[J>>2]=(c[J>>2]|0)+8;c[K>>2]=(c[K>>2]|0)+-8;c[x>>2]=(c[x>>2]|0)+1}while(1){if((c[x>>2]|0)>=(c[v>>2]|0))break;W=-(+g[c[H>>2]>>2]*+g[(c[J>>2]|0)+(0-(c[u>>2]|0)<<2)>>2])+ +g[c[I>>2]>>2]*+g[c[K>>2]>>2];V=c[O>>2]|0;c[O>>2]=V+4;g[V>>2]=W;W=+g[c[I>>2]>>2]*+g[c[J>>2]>>2]+ +g[c[H>>2]>>2]*+g[(c[K>>2]|0)+(c[u>>2]<<2)>>2];V=c[O>>2]|0;c[O>>2]=V+4;g[V>>2]=W;c[J>>2]=(c[J>>2]|0)+8;c[K>>2]=(c[K>>2]|0)+-8;c[H>>2]=(c[H>>2]|0)+8;c[I>>2]=(c[I>>2]|0)+-8;c[x>>2]=(c[x>>2]|0)+1}c[P>>2]=l;c[C>>2]=c[G>>2];c[x>>2]=0;while(1){if((c[x>>2]|0)>=(c[v>>2]|0))break;g[D>>2]=+g[(c[C>>2]|0)+(c[x>>2]<<2)>>2];g[E>>2]=+g[(c[C>>2]|0)+((c[v>>2]|0)+(c[x>>2]|0)<<2)>>2];V=c[P>>2]|0;c[P>>2]=V+4;g[z>>2]=+g[V>>2];V=c[P>>2]|0;c[P>>2]=V+4;g[y>>2]=+g[V>>2];g[S>>2]=+g[z>>2]*+g[D>>2]-+g[y>>2]*+g[E>>2];g[M>>2]=+g[y>>2]*+g[D>>2]+ +g[z>>2]*+g[E>>2];g[L>>2]=+g[S>>2];g[L+4>>2]=+g[M>>2];g[L>>2]=+g[A>>2]*+g[L>>2];g[L+4>>2]=+g[A>>2]*+g[L+4>>2];V=d+(b[(c[(c[B>>2]|0)+44>>2]|0)+(c[x>>2]<<1)>>1]<<3)|0;c[V>>2]=c[L>>2];c[V+4>>2]=c[L+4>>2];c[x>>2]=(c[x>>2]|0)+1}xc(c[B>>2]|0,d);c[w>>2]=d;c[Q>>2]=c[p>>2];c[R>>2]=(c[p>>2]|0)+((_(c[s>>2]|0,(c[u>>2]|0)-1|0)|0)<<2);c[F>>2]=c[G>>2];c[x>>2]=0;while(1){if((c[x>>2]|0)>=(c[v>>2]|0))break;g[T>>2]=+g[(c[w>>2]|0)+4>>2]*+g[(c[F>>2]|0)+((c[v>>2]|0)+(c[x>>2]|0)<<2)>>2]-+g[c[w>>2]>>2]*+g[(c[F>>2]|0)+(c[x>>2]<<2)>>2];g[N>>2]=+g[c[w>>2]>>2]*+g[(c[F>>2]|0)+((c[v>>2]|0)+(c[x>>2]|0)<<2)>>2]+ +g[(c[w>>2]|0)+4>>2]*+g[(c[F>>2]|0)+(c[x>>2]<<2)>>2];g[c[Q>>2]>>2]=+g[T>>2];g[c[R>>2]>>2]=+g[N>>2];c[w>>2]=(c[w>>2]|0)+8;c[Q>>2]=(c[Q>>2]|0)+(c[s>>2]<<1<<2);c[R>>2]=(c[R>>2]|0)+(0-(c[s>>2]<<1)<<2);c[x>>2]=(c[x>>2]|0)+1}na(c[t>>2]|0);i=U;return}function Ic(a,d,e,f,h,j,k,l){a=a|0;d=d|0;e=e|0;f=f|0;h=h|0;j=j|0;k=k|0;l=l|0;var m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0.0;V=i;i=i+144|0;m=V+140|0;n=V+136|0;o=V+132|0;p=V+128|0;q=V+124|0;r=V+120|0;s=V+116|0;x=V+108|0;t=V+104|0;u=V+100|0;v=V+96|0;F=V+92|0;K=V+88|0;M=V+84|0;P=V+80|0;B=V+76|0;w=V+72|0;A=V+68|0;T=V+64|0;N=V+60|0;Q=V+56|0;R=V+52|0;D=V+48|0;z=V+44|0;y=V+40|0;U=V+36|0;O=V+32|0;C=V+28|0;E=V+24|0;L=V+20|0;S=V+16|0;G=V+12|0;H=V+8|0;I=V+4|0;J=V;c[m>>2]=a;c[n>>2]=d;c[o>>2]=e;c[p>>2]=f;c[q>>2]=h;c[r>>2]=j;c[s>>2]=k;c[V+112>>2]=l;c[t>>2]=c[c[m>>2]>>2];c[F>>2]=c[(c[m>>2]|0)+24>>2];c[x>>2]=0;while(1){l=c[t>>2]>>1;if((c[x>>2]|0)>=(c[r>>2]|0))break;c[t>>2]=l;c[F>>2]=(c[F>>2]|0)+(c[t>>2]<<2);c[x>>2]=(c[x>>2]|0)+1}c[u>>2]=l;c[v>>2]=c[t>>2]>>2;c[K>>2]=c[n>>2];c[M>>2]=(c[n>>2]|0)+((_(c[s>>2]|0,(c[u>>2]|0)-1|0)|0)<<2);c[P>>2]=(c[o>>2]|0)+(c[q>>2]>>1<<2);c[B>>2]=c[F>>2];c[w>>2]=c[(c[(c[m>>2]|0)+8+(c[r>>2]<<2)>>2]|0)+44>>2];c[x>>2]=0;while(1){if((c[x>>2]|0)>=(c[v>>2]|0))break;t=c[w>>2]|0;c[w>>2]=t+2;c[A>>2]=b[t>>1];g[T>>2]=+g[c[M>>2]>>2]*+g[(c[B>>2]|0)+(c[x>>2]<<2)>>2]+ +g[c[K>>2]>>2]*+g[(c[B>>2]|0)+((c[v>>2]|0)+(c[x>>2]|0)<<2)>>2];g[N>>2]=+g[c[K>>2]>>2]*+g[(c[B>>2]|0)+(c[x>>2]<<2)>>2]-+g[c[M>>2]>>2]*+g[(c[B>>2]|0)+((c[v>>2]|0)+(c[x>>2]|0)<<2)>>2];g[(c[P>>2]|0)+((c[A>>2]<<1)+1<<2)>>2]=+g[T>>2];g[(c[P>>2]|0)+(c[A>>2]<<1<<2)>>2]=+g[N>>2];c[K>>2]=(c[K>>2]|0)+(c[s>>2]<<1<<2);c[M>>2]=(c[M>>2]|0)+(0-(c[s>>2]<<1)<<2);c[x>>2]=(c[x>>2]|0)+1}xc(c[(c[m>>2]|0)+8+(c[r>>2]<<2)>>2]|0,(c[o>>2]|0)+(c[q>>2]>>1<<2)|0);c[Q>>2]=(c[o>>2]|0)+(c[q>>2]>>1<<2);c[R>>2]=(c[o>>2]|0)+(c[q>>2]>>1<<2)+(c[u>>2]<<2)+-8;c[D>>2]=c[F>>2];c[x>>2]=0;while(1){if((c[x>>2]|0)>=((c[v>>2]|0)+1>>1|0))break;g[z>>2]=+g[(c[Q>>2]|0)+4>>2];g[y>>2]=+g[c[Q>>2]>>2];g[C>>2]=+g[(c[D>>2]|0)+(c[x>>2]<<2)>>2];g[E>>2]=+g[(c[D>>2]|0)+((c[v>>2]|0)+(c[x>>2]|0)<<2)>>2];g[U>>2]=+g[z>>2]*+g[C>>2]+ +g[y>>2]*+g[E>>2];g[O>>2]=+g[z>>2]*+g[E>>2]-+g[y>>2]*+g[C>>2];g[z>>2]=+g[(c[R>>2]|0)+4>>2];g[y>>2]=+g[c[R>>2]>>2];g[c[Q>>2]>>2]=+g[U>>2];g[(c[R>>2]|0)+4>>2]=+g[O>>2];g[C>>2]=+g[(c[D>>2]|0)+((c[v>>2]|0)-(c[x>>2]|0)-1<<2)>>2];g[E>>2]=+g[(c[D>>2]|0)+((c[u>>2]|0)-(c[x>>2]|0)-1<<2)>>2];g[U>>2]=+g[z>>2]*+g[C>>2]+ +g[y>>2]*+g[E>>2];g[O>>2]=+g[z>>2]*+g[E>>2]-+g[y>>2]*+g[C>>2];g[c[R>>2]>>2]=+g[U>>2];g[(c[Q>>2]|0)+4>>2]=+g[O>>2];c[Q>>2]=(c[Q>>2]|0)+8;c[R>>2]=(c[R>>2]|0)+-8;c[x>>2]=(c[x>>2]|0)+1}c[L>>2]=(c[o>>2]|0)+(c[q>>2]<<2)+-4;c[S>>2]=c[o>>2];c[G>>2]=c[p>>2];c[H>>2]=(c[p>>2]|0)+(c[q>>2]<<2)+-4;c[x>>2]=0;while(1){if((c[x>>2]|0)>=((c[q>>2]|0)/2|0|0))break;g[I>>2]=+g[c[L>>2]>>2];g[J>>2]=+g[c[S>>2]>>2];W=+g[c[H>>2]>>2]*+g[J>>2]-+g[c[G>>2]>>2]*+g[I>>2];U=c[S>>2]|0;c[S>>2]=U+4;g[U>>2]=W;W=+g[c[G>>2]>>2]*+g[J>>2]+ +g[c[H>>2]>>2]*+g[I>>2];U=c[L>>2]|0;c[L>>2]=U+-4;g[U>>2]=W;c[G>>2]=(c[G>>2]|0)+4;c[H>>2]=(c[H>>2]|0)+-4;c[x>>2]=(c[x>>2]|0)+1}i=V;return}function Jc(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0;l=i;i=i+32|0;h=l+20|0;e=l+16|0;f=l+12|0;j=l+8|0;k=l+4|0;g=l;c[e>>2]=a;c[f>>2]=b;c[j>>2]=d;c[k>>2]=0;a:while(1){if((c[k>>2]|0)>=1){e=12;break}c[g>>2]=0;while(1){if((c[g>>2]|0)>=4)break;if((c[e>>2]|0)==(c[c[5544+(c[k>>2]<<2)>>2]>>2]|0)?(c[f>>2]<<c[g>>2]|0)==(_(c[(c[5544+(c[k>>2]<<2)>>2]|0)+44>>2]|0,c[(c[5544+(c[k>>2]<<2)>>2]|0)+40>>2]|0)|0):0){e=7;break a}c[g>>2]=(c[g>>2]|0)+1}c[k>>2]=(c[k>>2]|0)+1}if((e|0)==7){if(c[j>>2]|0)c[c[j>>2]>>2]=0;c[h>>2]=c[5544+(c[k>>2]<<2)>>2];k=c[h>>2]|0;i=l;return k|0}else if((e|0)==12){if(c[j>>2]|0)c[c[j>>2]>>2]=-1;c[h>>2]=0;k=c[h>>2]|0;i=l;return k|0}return 0}function Kc(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;u=i;i=i+112|0;h=u+108|0;j=u+104|0;k=u+100|0;l=u+96|0;m=u+92|0;p=u+88|0;n=u+68|0;t=u+64|0;q=u+48|0;s=u+24|0;r=u+4|0;o=u;c[h>>2]=a;c[j>>2]=b;c[k>>2]=d;c[l>>2]=e;c[m>>2]=f;g[t>>2]=1.0;c[s>>2]=0;c[s+4>>2]=0;c[s+8>>2]=0;c[s+12>>2]=0;c[s+16>>2]=0;g[o>>2]=.800000011920929;c[p>>2]=1;while(1){if((c[p>>2]|0)>=(c[k>>2]>>1|0))break;g[(c[j>>2]|0)+(c[p>>2]<<2)>>2]=((+g[(c[c[h>>2]>>2]|0)+((c[p>>2]<<1)-1<<2)>>2]+ +g[(c[c[h>>2]>>2]|0)+((c[p>>2]<<1)+1<<2)>>2])*.5+ +g[(c[c[h>>2]>>2]|0)+(c[p>>2]<<1<<2)>>2])*.5;c[p>>2]=(c[p>>2]|0)+1}g[c[j>>2]>>2]=(+g[(c[c[h>>2]>>2]|0)+4>>2]*.5+ +g[c[c[h>>2]>>2]>>2])*.5;if((c[l>>2]|0)==2){c[p>>2]=1;while(1){if((c[p>>2]|0)>=(c[k>>2]>>1|0))break;b=(c[j>>2]|0)+(c[p>>2]<<2)|0;g[b>>2]=+g[b>>2]+((+g[(c[(c[h>>2]|0)+4>>2]|0)+((c[p>>2]<<1)-1<<2)>>2]+ +g[(c[(c[h>>2]|0)+4>>2]|0)+((c[p>>2]<<1)+1<<2)>>2])*.5+ +g[(c[(c[h>>2]|0)+4>>2]|0)+(c[p>>2]<<1<<2)>>2])*.5;c[p>>2]=(c[p>>2]|0)+1}b=c[j>>2]|0;g[b>>2]=+g[b>>2]+(+g[(c[(c[h>>2]|0)+4>>2]|0)+4>>2]*.5+ +g[c[(c[h>>2]|0)+4>>2]>>2])*.5}Yc(c[j>>2]|0,n,0,0,4,c[k>>2]>>1,c[m>>2]|0)|0;g[n>>2]=+g[n>>2]*1.000100016593933;c[p>>2]=1;while(1){if((c[p>>2]|0)>4)break;b=n+(c[p>>2]<<2)|0;g[b>>2]=+g[b>>2]-+g[n+(c[p>>2]<<2)>>2]*(+(c[p>>2]|0)*.00800000037997961)*(+(c[p>>2]|0)*.00800000037997961);c[p>>2]=(c[p>>2]|0)+1}Uc(q,n,4);c[p>>2]=0;while(1){if((c[p>>2]|0)>=4)break;g[t>>2]=+g[t>>2]*.8999999761581421;g[q+(c[p>>2]<<2)>>2]=+g[q+(c[p>>2]<<2)>>2]*+g[t>>2];c[p>>2]=(c[p>>2]|0)+1}g[r>>2]=+g[q>>2]+.800000011920929;g[r+4>>2]=+g[q+4>>2]+ +g[o>>2]*+g[q>>2];g[r+8>>2]=+g[q+8>>2]+ +g[o>>2]*+g[q+4>>2];g[r+12>>2]=+g[q+12>>2]+ +g[o>>2]*+g[q+8>>2];g[r+16>>2]=+g[o>>2]*+g[q+12>>2];Lc(c[j>>2]|0,r,c[j>>2]|0,c[k>>2]>>1,s);i=u;return}function Lc(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;y=i;i=i+80|0;h=y+64|0;z=y+60|0;j=y+56|0;k=y+52|0;l=y+48|0;m=y+44|0;s=y+40|0;t=y+36|0;u=y+32|0;v=y+28|0;w=y+24|0;n=y+20|0;o=y+16|0;p=y+12|0;q=y+8|0;r=y+4|0;x=y;c[h>>2]=a;c[z>>2]=b;c[j>>2]=d;c[k>>2]=e;c[l>>2]=f;g[s>>2]=+g[c[z>>2]>>2];g[t>>2]=+g[(c[z>>2]|0)+4>>2];g[u>>2]=+g[(c[z>>2]|0)+8>>2];g[v>>2]=+g[(c[z>>2]|0)+12>>2];g[w>>2]=+g[(c[z>>2]|0)+16>>2];g[n>>2]=+g[c[l>>2]>>2];g[o>>2]=+g[(c[l>>2]|0)+4>>2];g[p>>2]=+g[(c[l>>2]|0)+8>>2];g[q>>2]=+g[(c[l>>2]|0)+12>>2];g[r>>2]=+g[(c[l>>2]|0)+16>>2];c[m>>2]=0;while(1){if((c[m>>2]|0)>=(c[k>>2]|0))break;g[x>>2]=+g[(c[h>>2]|0)+(c[m>>2]<<2)>>2];g[x>>2]=+g[x>>2]+ +g[s>>2]*+g[n>>2];g[x>>2]=+g[x>>2]+ +g[t>>2]*+g[o>>2];g[x>>2]=+g[x>>2]+ +g[u>>2]*+g[p>>2];g[x>>2]=+g[x>>2]+ +g[v>>2]*+g[q>>2];g[x>>2]=+g[x>>2]+ +g[w>>2]*+g[r>>2];g[r>>2]=+g[q>>2];g[q>>2]=+g[p>>2];g[p>>2]=+g[o>>2];g[o>>2]=+g[n>>2];g[n>>2]=+g[(c[h>>2]|0)+(c[m>>2]<<2)>>2];g[(c[j>>2]|0)+(c[m>>2]<<2)>>2]=+g[x>>2];c[m>>2]=(c[m>>2]|0)+1}g[c[l>>2]>>2]=+g[n>>2];g[(c[l>>2]|0)+4>>2]=+g[o>>2];g[(c[l>>2]|0)+8>>2]=+g[p>>2];g[(c[l>>2]|0)+12>>2]=+g[q>>2];g[(c[l>>2]|0)+16>>2]=+g[r>>2];i=y;return}function Mc(a,b,d,e,f,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;r=i;i=i+64|0;j=r+48|0;k=r+44|0;l=r+40|0;m=r+36|0;n=r+32|0;o=r+24|0;p=r+8|0;q=r;c[j>>2]=a;c[k>>2]=b;c[l>>2]=d;c[m>>2]=e;c[n>>2]=f;c[r+28>>2]=h;c[o>>2]=0;while(1){if((c[o>>2]|0)>=((c[n>>2]|0)-3|0))break;c[p>>2]=0;c[p+4>>2]=0;c[p+8>>2]=0;c[p+12>>2]=0;Nc(c[j>>2]|0,(c[k>>2]|0)+(c[o>>2]<<2)|0,p,c[m>>2]|0);g[(c[l>>2]|0)+(c[o>>2]<<2)>>2]=+g[p>>2];g[(c[l>>2]|0)+((c[o>>2]|0)+1<<2)>>2]=+g[p+4>>2];g[(c[l>>2]|0)+((c[o>>2]|0)+2<<2)>>2]=+g[p+8>>2];g[(c[l>>2]|0)+((c[o>>2]|0)+3<<2)>>2]=+g[p+12>>2];c[o>>2]=(c[o>>2]|0)+4}while(1){if((c[o>>2]|0)>=(c[n>>2]|0))break;g[q>>2]=+Oc(c[j>>2]|0,(c[k>>2]|0)+(c[o>>2]<<2)|0,c[m>>2]|0);g[(c[l>>2]|0)+(c[o>>2]<<2)>>2]=+g[q>>2];c[o>>2]=(c[o>>2]|0)+1}i=r;return}function Nc(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;u=i;i=i+64|0;f=u+48|0;h=u+44|0;j=u+40|0;k=u+36|0;l=u+32|0;q=u+28|0;r=u+24|0;s=u+20|0;t=u+16|0;m=u+12|0;n=u+8|0;o=u+4|0;p=u;c[f>>2]=a;c[h>>2]=b;c[j>>2]=d;c[k>>2]=e;g[t>>2]=0.0;b=c[h>>2]|0;c[h>>2]=b+4;g[q>>2]=+g[b>>2];b=c[h>>2]|0;c[h>>2]=b+4;g[r>>2]=+g[b>>2];b=c[h>>2]|0;c[h>>2]=b+4;g[s>>2]=+g[b>>2];c[l>>2]=0;while(1){if((c[l>>2]|0)>=((c[k>>2]|0)-3|0))break;b=c[f>>2]|0;c[f>>2]=b+4;g[m>>2]=+g[b>>2];b=c[h>>2]|0;c[h>>2]=b+4;g[t>>2]=+g[b>>2];g[c[j>>2]>>2]=+g[c[j>>2]>>2]+ +g[m>>2]*+g[q>>2];g[(c[j>>2]|0)+4>>2]=+g[(c[j>>2]|0)+4>>2]+ +g[m>>2]*+g[r>>2];g[(c[j>>2]|0)+8>>2]=+g[(c[j>>2]|0)+8>>2]+ +g[m>>2]*+g[s>>2];g[(c[j>>2]|0)+12>>2]=+g[(c[j>>2]|0)+12>>2]+ +g[m>>2]*+g[t>>2];b=c[f>>2]|0;c[f>>2]=b+4;g[m>>2]=+g[b>>2];b=c[h>>2]|0;c[h>>2]=b+4;g[q>>2]=+g[b>>2];g[c[j>>2]>>2]=+g[c[j>>2]>>2]+ +g[m>>2]*+g[r>>2];g[(c[j>>2]|0)+4>>2]=+g[(c[j>>2]|0)+4>>2]+ +g[m>>2]*+g[s>>2];g[(c[j>>2]|0)+8>>2]=+g[(c[j>>2]|0)+8>>2]+ +g[m>>2]*+g[t>>2];g[(c[j>>2]|0)+12>>2]=+g[(c[j>>2]|0)+12>>2]+ +g[m>>2]*+g[q>>2];b=c[f>>2]|0;c[f>>2]=b+4;g[m>>2]=+g[b>>2];b=c[h>>2]|0;c[h>>2]=b+4;g[r>>2]=+g[b>>2];g[c[j>>2]>>2]=+g[c[j>>2]>>2]+ +g[m>>2]*+g[s>>2];g[(c[j>>2]|0)+4>>2]=+g[(c[j>>2]|0)+4>>2]+ +g[m>>2]*+g[t>>2];g[(c[j>>2]|0)+8>>2]=+g[(c[j>>2]|0)+8>>2]+ +g[m>>2]*+g[q>>2];g[(c[j>>2]|0)+12>>2]=+g[(c[j>>2]|0)+12>>2]+ +g[m>>2]*+g[r>>2];b=c[f>>2]|0;c[f>>2]=b+4;g[m>>2]=+g[b>>2];b=c[h>>2]|0;c[h>>2]=b+4;g[s>>2]=+g[b>>2];g[c[j>>2]>>2]=+g[c[j>>2]>>2]+ +g[m>>2]*+g[t>>2];g[(c[j>>2]|0)+4>>2]=+g[(c[j>>2]|0)+4>>2]+ +g[m>>2]*+g[q>>2];g[(c[j>>2]|0)+8>>2]=+g[(c[j>>2]|0)+8>>2]+ +g[m>>2]*+g[r>>2];g[(c[j>>2]|0)+12>>2]=+g[(c[j>>2]|0)+12>>2]+ +g[m>>2]*+g[s>>2];c[l>>2]=(c[l>>2]|0)+4}b=c[l>>2]|0;c[l>>2]=b+1;if((b|0)<(c[k>>2]|0)){b=c[f>>2]|0;c[f>>2]=b+4;g[n>>2]=+g[b>>2];b=c[h>>2]|0;c[h>>2]=b+4;g[t>>2]=+g[b>>2];g[c[j>>2]>>2]=+g[c[j>>2]>>2]+ +g[n>>2]*+g[q>>2];g[(c[j>>2]|0)+4>>2]=+g[(c[j>>2]|0)+4>>2]+ +g[n>>2]*+g[r>>2];g[(c[j>>2]|0)+8>>2]=+g[(c[j>>2]|0)+8>>2]+ +g[n>>2]*+g[s>>2];g[(c[j>>2]|0)+12>>2]=+g[(c[j>>2]|0)+12>>2]+ +g[n>>2]*+g[t>>2]}b=c[l>>2]|0;c[l>>2]=b+1;if((b|0)<(c[k>>2]|0)){b=c[f>>2]|0;c[f>>2]=b+4;g[o>>2]=+g[b>>2];b=c[h>>2]|0;c[h>>2]=b+4;g[q>>2]=+g[b>>2];g[c[j>>2]>>2]=+g[c[j>>2]>>2]+ +g[o>>2]*+g[r>>2];g[(c[j>>2]|0)+4>>2]=+g[(c[j>>2]|0)+4>>2]+ +g[o>>2]*+g[s>>2];g[(c[j>>2]|0)+8>>2]=+g[(c[j>>2]|0)+8>>2]+ +g[o>>2]*+g[t>>2];g[(c[j>>2]|0)+12>>2]=+g[(c[j>>2]|0)+12>>2]+ +g[o>>2]*+g[q>>2]}if((c[l>>2]|0)>=(c[k>>2]|0)){i=u;return}b=c[f>>2]|0;c[f>>2]=b+4;g[p>>2]=+g[b>>2];b=c[h>>2]|0;c[h>>2]=b+4;g[r>>2]=+g[b>>2];g[c[j>>2]>>2]=+g[c[j>>2]>>2]+ +g[p>>2]*+g[s>>2];g[(c[j>>2]|0)+4>>2]=+g[(c[j>>2]|0)+4>>2]+ +g[p>>2]*+g[t>>2];g[(c[j>>2]|0)+8>>2]=+g[(c[j>>2]|0)+8>>2]+ +g[p>>2]*+g[q>>2];g[(c[j>>2]|0)+12>>2]=+g[(c[j>>2]|0)+12>>2]+ +g[p>>2]*+g[r>>2];i=u;return}function Oc(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0,h=0,j=0,k=0,l=0,m=0;m=i;i=i+32|0;f=m+16|0;h=m+12|0;j=m+8|0;k=m+4|0;l=m;c[f>>2]=a;c[h>>2]=b;c[j>>2]=d;g[l>>2]=0.0;c[k>>2]=0;while(1){e=+g[l>>2];if((c[k>>2]|0)>=(c[j>>2]|0))break;g[l>>2]=e+ +g[(c[f>>2]|0)+(c[k>>2]<<2)>>2]*+g[(c[h>>2]|0)+(c[k>>2]<<2)>>2];c[k>>2]=(c[k>>2]|0)+1}i=m;return +e}function Pc(a,b,d,e,f,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;z=i;i=i+80|0;j=z+64|0;k=z+60|0;l=z+56|0;m=z+52|0;n=z+48|0;o=z+44|0;u=z+40|0;v=z+36|0;w=z+32|0;s=z+24|0;x=z+20|0;p=z+16|0;y=z+12|0;q=z+8|0;r=z+4|0;t=z;c[j>>2]=a;c[k>>2]=b;c[l>>2]=d;c[m>>2]=e;c[n>>2]=f;c[o>>2]=h;c[s>>2]=0;c[s+4>>2]=0;c[w>>2]=(c[l>>2]|0)+(c[m>>2]|0);d=c[l>>2]>>2;c[p>>2]=ia()|0;h=i;i=i+((1*(d<<2)|0)+15&-16)|0;d=i;i=i+((1*(c[w>>2]>>2<<2)|0)+15&-16)|0;e=i;i=i+((1*(c[m>>2]>>1<<2)|0)+15&-16)|0;c[v>>2]=0;while(1){if((c[v>>2]|0)>=(c[l>>2]>>2|0))break;g[h+(c[v>>2]<<2)>>2]=+g[(c[j>>2]|0)+(c[v>>2]<<1<<2)>>2];c[v>>2]=(c[v>>2]|0)+1}c[v>>2]=0;while(1){if((c[v>>2]|0)>=(c[w>>2]>>2|0))break;g[d+(c[v>>2]<<2)>>2]=+g[(c[k>>2]|0)+(c[v>>2]<<1<<2)>>2];c[v>>2]=(c[v>>2]|0)+1}Mc(h,d,e,c[l>>2]>>2,c[m>>2]>>2,c[o>>2]|0);Qc(e,d,c[l>>2]>>2,c[m>>2]>>2,s);c[u>>2]=0;while(1){if((c[u>>2]|0)>=(c[m>>2]>>1|0))break;g[e+(c[u>>2]<<2)>>2]=0.0;if(!((N((c[u>>2]|0)-(c[s>>2]<<1)|0)|0)>2?(N((c[u>>2]|0)-(c[s+4>>2]<<1)|0)|0)>2:0)){g[y>>2]=+Oc(c[j>>2]|0,(c[k>>2]|0)+(c[u>>2]<<2)|0,c[l>>2]>>1);g[e+(c[u>>2]<<2)>>2]=-1.0>+g[y>>2]?-1.0:+g[y>>2]}c[u>>2]=(c[u>>2]|0)+1}Qc(e,c[k>>2]|0,c[l>>2]>>1,c[m>>2]>>1,s);if((c[s>>2]|0)>0?(c[s>>2]|0)<((c[m>>2]>>1)-1|0):0){g[q>>2]=+g[e+((c[s>>2]|0)-1<<2)>>2];g[r>>2]=+g[e+(c[s>>2]<<2)>>2];g[t>>2]=+g[e+((c[s>>2]|0)+1<<2)>>2];if(+g[t>>2]-+g[q>>2]>(+g[r>>2]-+g[q>>2])*.699999988079071){c[x>>2]=1;y=c[s>>2]|0;y=y<<1;x=c[x>>2]|0;x=y-x|0;y=c[n>>2]|0;c[y>>2]=x;y=c[p>>2]|0;na(y|0);i=z;return}if(+g[q>>2]-+g[t>>2]>(+g[r>>2]-+g[t>>2])*.699999988079071){c[x>>2]=-1;y=c[s>>2]|0;y=y<<1;x=c[x>>2]|0;x=y-x|0;y=c[n>>2]|0;c[y>>2]=x;y=c[p>>2]|0;na(y|0);i=z;return}else{c[x>>2]=0;y=c[s>>2]|0;y=y<<1;x=c[x>>2]|0;x=y-x|0;y=c[n>>2]|0;c[y>>2]=x;y=c[p>>2]|0;na(y|0);i=z;return}}c[x>>2]=0;y=c[s>>2]|0;y=y<<1;x=c[x>>2]|0;x=y-x|0;y=c[n>>2]|0;c[y>>2]=x;y=c[p>>2]|0;na(y|0);i=z;return}function Qc(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;u=i;i=i+64|0;h=u+52|0;j=u+48|0;k=u+44|0;l=u+40|0;m=u+36|0;q=u+32|0;r=u+28|0;n=u+24|0;p=u+16|0;o=u+8|0;s=u+4|0;t=u;c[h>>2]=a;c[j>>2]=b;c[k>>2]=d;c[l>>2]=e;c[m>>2]=f;g[n>>2]=1.0;g[p>>2]=-1.0;g[p+4>>2]=-1.0;g[o>>2]=0.0;g[o+4>>2]=0.0;c[c[m>>2]>>2]=0;c[(c[m>>2]|0)+4>>2]=1;c[r>>2]=0;while(1){if((c[r>>2]|0)>=(c[k>>2]|0))break;g[n>>2]=+g[n>>2]+ +g[(c[j>>2]|0)+(c[r>>2]<<2)>>2]*+g[(c[j>>2]|0)+(c[r>>2]<<2)>>2];c[r>>2]=(c[r>>2]|0)+1}c[q>>2]=0;while(1){if((c[q>>2]|0)>=(c[l>>2]|0))break;do if(+g[(c[h>>2]|0)+(c[q>>2]<<2)>>2]>0.0?(g[t>>2]=+g[(c[h>>2]|0)+(c[q>>2]<<2)>>2],g[t>>2]=+g[t>>2]*9.999999960041972e-13,g[s>>2]=+g[t>>2]*+g[t>>2],+g[s>>2]*+g[o+4>>2]>+g[p+4>>2]*+g[n>>2]):0)if(+g[s>>2]*+g[o>>2]>+g[p>>2]*+g[n>>2]){g[p+4>>2]=+g[p>>2];g[o+4>>2]=+g[o>>2];c[(c[m>>2]|0)+4>>2]=c[c[m>>2]>>2];g[p>>2]=+g[s>>2];g[o>>2]=+g[n>>2];c[c[m>>2]>>2]=c[q>>2];break}else{g[p+4>>2]=+g[s>>2];g[o+4>>2]=+g[n>>2];c[(c[m>>2]|0)+4>>2]=c[q>>2];break}while(0);g[n>>2]=+g[n>>2]+(+g[(c[j>>2]|0)+((c[q>>2]|0)+(c[k>>2]|0)<<2)>>2]*+g[(c[j>>2]|0)+((c[q>>2]|0)+(c[k>>2]|0)<<2)>>2]-+g[(c[j>>2]|0)+(c[q>>2]<<2)>>2]*+g[(c[j>>2]|0)+(c[q>>2]<<2)>>2]);g[n>>2]=1.0>+g[n>>2]?1.0:+g[n>>2];c[q>>2]=(c[q>>2]|0)+1}i=u;return}function Rc(a,b,d,e,f,h,j,k){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;j=+j;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,P=0,Q=0;Q=i;i=i+128|0;m=Q+124|0;n=Q+120|0;o=Q+116|0;p=Q+112|0;q=Q+108|0;r=Q+104|0;s=Q+100|0;E=Q+92|0;l=Q+88|0;u=Q+84|0;v=Q+80|0;B=Q+76|0;C=Q+72|0;H=Q+68|0;L=Q+64|0;K=Q+60|0;P=Q+56|0;M=Q+52|0;J=Q+40|0;y=Q+36|0;z=Q+32|0;G=Q+28|0;F=Q+24|0;t=Q+20|0;w=Q+16|0;x=Q+12|0;D=Q+8|0;A=Q+4|0;I=Q;c[m>>2]=a;c[n>>2]=b;c[o>>2]=d;c[p>>2]=e;c[q>>2]=f;c[r>>2]=h;g[s>>2]=j;c[Q+96>>2]=k;c[F>>2]=c[o>>2];c[n>>2]=(c[n>>2]|0)/2|0;c[o>>2]=(c[o>>2]|0)/2|0;a=c[q>>2]|0;c[a>>2]=(c[a>>2]|0)/2|0;c[r>>2]=(c[r>>2]|0)/2|0;c[p>>2]=(c[p>>2]|0)/2|0;c[m>>2]=(c[m>>2]|0)+(c[n>>2]<<2);if((c[c[q>>2]>>2]|0)>=(c[n>>2]|0))c[c[q>>2]>>2]=(c[n>>2]|0)-1;a=c[c[q>>2]>>2]|0;c[v>>2]=a;c[u>>2]=a;a=(c[n>>2]|0)+1|0;c[t>>2]=ia()|0;f=i;i=i+((1*(a<<2)|0)+15&-16)|0;Sc(c[m>>2]|0,c[m>>2]|0,(c[m>>2]|0)+(0-(c[v>>2]|0)<<2)|0,c[p>>2]|0,K,L);g[f>>2]=+g[K>>2];g[P>>2]=+g[K>>2];c[l>>2]=1;while(1){if((c[l>>2]|0)>(c[n>>2]|0))break;g[P>>2]=+g[P>>2]+ +g[(c[m>>2]|0)+(0-(c[l>>2]|0)<<2)>>2]*+g[(c[m>>2]|0)+(0-(c[l>>2]|0)<<2)>>2]-+g[(c[m>>2]|0)+((c[p>>2]|0)-(c[l>>2]|0)<<2)>>2]*+g[(c[m>>2]|0)+((c[p>>2]|0)-(c[l>>2]|0)<<2)>>2];g[f+(c[l>>2]<<2)>>2]=0.0>+g[P>>2]?0.0:+g[P>>2];c[l>>2]=(c[l>>2]|0)+1}g[P>>2]=+g[f+(c[v>>2]<<2)>>2];g[y>>2]=+g[L>>2];g[z>>2]=+g[P>>2];j=+g[L>>2]/+O(+(+g[K>>2]*+g[P>>2]+1.0));g[C>>2]=j;g[B>>2]=j;c[E>>2]=2;while(1){if((c[E>>2]|0)>15)break;g[A>>2]=0.0;c[w>>2]=Tc((c[v>>2]<<1)+(c[E>>2]|0)|0,c[E>>2]<<1)|0;if((c[w>>2]|0)<(c[o>>2]|0))break;do if((c[E>>2]|0)==2){e=c[v>>2]|0;if(((c[w>>2]|0)+(c[v>>2]|0)|0)>(c[n>>2]|0)){c[x>>2]=e;break}else{c[x>>2]=e+(c[w>>2]|0);break}}else{l=_(c[17400+(c[E>>2]<<2)>>2]<<1,c[v>>2]|0)|0;c[x>>2]=Tc(l+(c[E>>2]|0)|0,c[E>>2]<<1)|0}while(0);Sc(c[m>>2]|0,(c[m>>2]|0)+(0-(c[w>>2]|0)<<2)|0,(c[m>>2]|0)+(0-(c[x>>2]|0)<<2)|0,c[p>>2]|0,L,M);g[L>>2]=+g[L>>2]+ +g[M>>2];g[P>>2]=+g[f+(c[w>>2]<<2)>>2]+ +g[f+(c[x>>2]<<2)>>2];g[D>>2]=+g[L>>2]/+O(+(+g[K>>2]*2.0*1.0*+g[P>>2]+1.0));do if((N((c[w>>2]|0)-(c[r>>2]|0)|0)|0)<=1)g[A>>2]=+g[s>>2];else{if((N((c[w>>2]|0)-(c[r>>2]|0)|0)|0)<=2?(l=_((c[E>>2]|0)*5|0,c[E>>2]|0)|0,(l|0)<(c[v>>2]|0)):0){g[A>>2]=+g[s>>2]*.5;break}g[A>>2]=0.0}while(0);if(.30000001192092896>+g[C>>2]*.699999988079071-+g[A>>2])j=.30000001192092896;else j=+g[C>>2]*.699999988079071-+g[A>>2];g[I>>2]=j;if((c[w>>2]|0)>=((c[o>>2]|0)*3|0)){if((c[w>>2]|0)<(c[o>>2]<<1|0)){if(.5>+g[C>>2]*.8999999761581421-+g[A>>2])j=.5;else j=+g[C>>2]*.8999999761581421-+g[A>>2];g[I>>2]=j}}else{if(.4000000059604645>+g[C>>2]*.8500000238418579-+g[A>>2])j=.4000000059604645;else j=+g[C>>2]*.8500000238418579-+g[A>>2];g[I>>2]=j}if(+g[D>>2]>+g[I>>2]){g[y>>2]=+g[L>>2];g[z>>2]=+g[P>>2];c[u>>2]=c[w>>2];g[B>>2]=+g[D>>2]}c[E>>2]=(c[E>>2]|0)+1}g[y>>2]=0.0>+g[y>>2]?0.0:+g[y>>2];if(+g[z>>2]<=+g[y>>2])g[H>>2]=1.0;else g[H>>2]=+g[y>>2]/(+g[z>>2]+1.0);c[E>>2]=0;while(1){if((c[E>>2]|0)>=3)break;j=+Oc(c[m>>2]|0,(c[m>>2]|0)+(0-((c[u>>2]|0)+(c[E>>2]|0)-1)<<2)|0,c[p>>2]|0);g[J+(c[E>>2]<<2)>>2]=j;c[E>>2]=(c[E>>2]|0)+1}do if(!(+g[J+8>>2]-+g[J>>2]>(+g[J+4>>2]-+g[J>>2])*.699999988079071))if(+g[J>>2]-+g[J+8>>2]>(+g[J+4>>2]-+g[J+8>>2])*.699999988079071){c[G>>2]=-1;break}else{c[G>>2]=0;break}else c[G>>2]=1;while(0);if(+g[H>>2]>+g[B>>2])g[H>>2]=+g[B>>2];c[c[q>>2]>>2]=(c[u>>2]<<1)+(c[G>>2]|0);if((c[c[q>>2]>>2]|0)>=(c[F>>2]|0)){j=+g[H>>2];P=c[t>>2]|0;na(P|0);i=Q;return +j}c[c[q>>2]>>2]=c[F>>2];j=+g[H>>2];P=c[t>>2]|0;na(P|0);i=Q;return +j}function Sc(a,b,d,e,f,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var j=0.0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;t=i;i=i+48|0;k=t+32|0;l=t+28|0;m=t+24|0;n=t+20|0;o=t+16|0;p=t+12|0;q=t+8|0;r=t+4|0;s=t;c[k>>2]=a;c[l>>2]=b;c[m>>2]=d;c[n>>2]=e;c[o>>2]=f;c[p>>2]=h;g[r>>2]=0.0;g[s>>2]=0.0;c[q>>2]=0;while(1){j=+g[r>>2];if((c[q>>2]|0)>=(c[n>>2]|0))break;g[r>>2]=j+ +g[(c[k>>2]|0)+(c[q>>2]<<2)>>2]*+g[(c[l>>2]|0)+(c[q>>2]<<2)>>2];g[s>>2]=+g[s>>2]+ +g[(c[k>>2]|0)+(c[q>>2]<<2)>>2]*+g[(c[m>>2]|0)+(c[q>>2]<<2)>>2];c[q>>2]=(c[q>>2]|0)+1}g[c[o>>2]>>2]=j;g[c[p>>2]>>2]=+g[s>>2];i=t;return}function Tc(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;f=i;i=i+16|0;e=f+4|0;d=f;c[e>>2]=a;c[d>>2]=b;i=f;return ((c[e>>2]|0)>>>0)/((c[d>>2]|0)>>>0)|0|0}function Uc(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;q=i;i=i+48|0;r=q+40|0;e=q+36|0;f=q+32|0;j=q+28|0;k=q+24|0;m=q+20|0;h=q+16|0;l=q+12|0;n=q+8|0;o=q+4|0;p=q;c[r>>2]=a;c[e>>2]=b;c[f>>2]=d;g[h>>2]=+g[c[e>>2]>>2];c[l>>2]=c[r>>2];c[j>>2]=0;while(1){if((c[j>>2]|0)>=(c[f>>2]|0))break;g[(c[l>>2]|0)+(c[j>>2]<<2)>>2]=0.0;c[j>>2]=(c[j>>2]|0)+1}if(!(+g[c[e>>2]>>2]!=0.0)){i=q;return}c[j>>2]=0;while(1){if((c[j>>2]|0)>=(c[f>>2]|0)){e=15;break}g[n>>2]=0.0;c[k>>2]=0;while(1){if((c[k>>2]|0)>=(c[j>>2]|0))break;g[n>>2]=+g[n>>2]+ +g[(c[l>>2]|0)+(c[k>>2]<<2)>>2]*+g[(c[e>>2]|0)+((c[j>>2]|0)-(c[k>>2]|0)<<2)>>2];c[k>>2]=(c[k>>2]|0)+1}g[n>>2]=+g[n>>2]+ +g[(c[e>>2]|0)+((c[j>>2]|0)+1<<2)>>2];g[m>>2]=-(+g[n>>2]/+g[h>>2]);g[(c[l>>2]|0)+(c[j>>2]<<2)>>2]=+g[m>>2];c[k>>2]=0;while(1){if((c[k>>2]|0)>=((c[j>>2]|0)+1>>1|0))break;g[o>>2]=+g[(c[l>>2]|0)+(c[k>>2]<<2)>>2];g[p>>2]=+g[(c[l>>2]|0)+((c[j>>2]|0)-1-(c[k>>2]|0)<<2)>>2];g[(c[l>>2]|0)+(c[k>>2]<<2)>>2]=+g[o>>2]+ +g[m>>2]*+g[p>>2];g[(c[l>>2]|0)+((c[j>>2]|0)-1-(c[k>>2]|0)<<2)>>2]=+g[p>>2]+ +g[m>>2]*+g[o>>2];c[k>>2]=(c[k>>2]|0)+1}g[h>>2]=+g[h>>2]-+g[m>>2]*+g[m>>2]*+g[h>>2];if(+g[h>>2]<+g[c[e>>2]>>2]*1.0000000474974513e-03){e=15;break}c[j>>2]=(c[j>>2]|0)+1}if((e|0)==15){i=q;return}}function Vc(a,b,d,e,f,h,j){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;v=i;i=i+64|0;k=v+60|0;l=v+56|0;m=v+52|0;n=v+48|0;o=v+44|0;p=v+40|0;r=v+32|0;s=v+28|0;q=v+24|0;t=v+8|0;u=v;c[k>>2]=a;c[l>>2]=b;c[m>>2]=d;c[n>>2]=e;c[o>>2]=f;c[p>>2]=h;c[v+36>>2]=j;a=c[o>>2]|0;c[q>>2]=ia()|0;e=i;i=i+((1*(a<<2)|0)+15&-16)|0;a=i;i=i+((1*((c[n>>2]|0)+(c[o>>2]|0)<<2)|0)+15&-16)|0;c[r>>2]=0;while(1){if((c[r>>2]|0)>=(c[o>>2]|0))break;g[e+(c[r>>2]<<2)>>2]=+g[(c[l>>2]|0)+((c[o>>2]|0)-(c[r>>2]|0)-1<<2)>>2];c[r>>2]=(c[r>>2]|0)+1}c[r>>2]=0;while(1){if((c[r>>2]|0)>=(c[o>>2]|0))break;g[a+(c[r>>2]<<2)>>2]=+g[(c[p>>2]|0)+((c[o>>2]|0)-(c[r>>2]|0)-1<<2)>>2];c[r>>2]=(c[r>>2]|0)+1}c[r>>2]=0;while(1){if((c[r>>2]|0)>=(c[n>>2]|0))break;g[a+((c[r>>2]|0)+(c[o>>2]|0)<<2)>>2]=+g[(c[k>>2]|0)+(c[r>>2]<<2)>>2];c[r>>2]=(c[r>>2]|0)+1}c[r>>2]=0;while(1){if((c[r>>2]|0)>=(c[o>>2]|0))break;g[(c[p>>2]|0)+(c[r>>2]<<2)>>2]=+g[(c[k>>2]|0)+((c[n>>2]|0)-(c[r>>2]|0)-1<<2)>>2];c[r>>2]=(c[r>>2]|0)+1}c[r>>2]=0;while(1){if((c[r>>2]|0)>=((c[n>>2]|0)-3|0))break;c[t>>2]=0;c[t+4>>2]=0;c[t+8>>2]=0;c[t+12>>2]=0;Wc(e,a+(c[r>>2]<<2)|0,t,c[o>>2]|0);g[(c[m>>2]|0)+(c[r>>2]<<2)>>2]=+g[(c[k>>2]|0)+(c[r>>2]<<2)>>2]+ +g[t>>2];g[(c[m>>2]|0)+((c[r>>2]|0)+1<<2)>>2]=+g[(c[k>>2]|0)+((c[r>>2]|0)+1<<2)>>2]+ +g[t+4>>2];g[(c[m>>2]|0)+((c[r>>2]|0)+2<<2)>>2]=+g[(c[k>>2]|0)+((c[r>>2]|0)+2<<2)>>2]+ +g[t+8>>2];g[(c[m>>2]|0)+((c[r>>2]|0)+3<<2)>>2]=+g[(c[k>>2]|0)+((c[r>>2]|0)+3<<2)>>2]+ +g[t+12>>2];c[r>>2]=(c[r>>2]|0)+4}while(1){if((c[r>>2]|0)>=(c[n>>2]|0))break;g[u>>2]=0.0;c[s>>2]=0;while(1){if((c[s>>2]|0)>=(c[o>>2]|0))break;g[u>>2]=+g[u>>2]+ +g[e+(c[s>>2]<<2)>>2]*+g[a+((c[r>>2]|0)+(c[s>>2]|0)<<2)>>2];c[s>>2]=(c[s>>2]|0)+1}g[(c[m>>2]|0)+(c[r>>2]<<2)>>2]=+g[(c[k>>2]|0)+(c[r>>2]<<2)>>2]+ +g[u>>2];c[r>>2]=(c[r>>2]|0)+1}na(c[q>>2]|0);i=v;return}function Wc(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;u=i;i=i+64|0;f=u+48|0;h=u+44|0;j=u+40|0;k=u+36|0;l=u+32|0;q=u+28|0;r=u+24|0;s=u+20|0;t=u+16|0;m=u+12|0;n=u+8|0;o=u+4|0;p=u;c[f>>2]=a;c[h>>2]=b;c[j>>2]=d;c[k>>2]=e;g[t>>2]=0.0;b=c[h>>2]|0;c[h>>2]=b+4;g[q>>2]=+g[b>>2];b=c[h>>2]|0;c[h>>2]=b+4;g[r>>2]=+g[b>>2];b=c[h>>2]|0;c[h>>2]=b+4;g[s>>2]=+g[b>>2];c[l>>2]=0;while(1){if((c[l>>2]|0)>=((c[k>>2]|0)-3|0))break;b=c[f>>2]|0;c[f>>2]=b+4;g[m>>2]=+g[b>>2];b=c[h>>2]|0;c[h>>2]=b+4;g[t>>2]=+g[b>>2];g[c[j>>2]>>2]=+g[c[j>>2]>>2]+ +g[m>>2]*+g[q>>2];g[(c[j>>2]|0)+4>>2]=+g[(c[j>>2]|0)+4>>2]+ +g[m>>2]*+g[r>>2];g[(c[j>>2]|0)+8>>2]=+g[(c[j>>2]|0)+8>>2]+ +g[m>>2]*+g[s>>2];g[(c[j>>2]|0)+12>>2]=+g[(c[j>>2]|0)+12>>2]+ +g[m>>2]*+g[t>>2];b=c[f>>2]|0;c[f>>2]=b+4;g[m>>2]=+g[b>>2];b=c[h>>2]|0;c[h>>2]=b+4;g[q>>2]=+g[b>>2];g[c[j>>2]>>2]=+g[c[j>>2]>>2]+ +g[m>>2]*+g[r>>2];g[(c[j>>2]|0)+4>>2]=+g[(c[j>>2]|0)+4>>2]+ +g[m>>2]*+g[s>>2];g[(c[j>>2]|0)+8>>2]=+g[(c[j>>2]|0)+8>>2]+ +g[m>>2]*+g[t>>2];g[(c[j>>2]|0)+12>>2]=+g[(c[j>>2]|0)+12>>2]+ +g[m>>2]*+g[q>>2];b=c[f>>2]|0;c[f>>2]=b+4;g[m>>2]=+g[b>>2];b=c[h>>2]|0;c[h>>2]=b+4;g[r>>2]=+g[b>>2];g[c[j>>2]>>2]=+g[c[j>>2]>>2]+ +g[m>>2]*+g[s>>2];g[(c[j>>2]|0)+4>>2]=+g[(c[j>>2]|0)+4>>2]+ +g[m>>2]*+g[t>>2];g[(c[j>>2]|0)+8>>2]=+g[(c[j>>2]|0)+8>>2]+ +g[m>>2]*+g[q>>2];g[(c[j>>2]|0)+12>>2]=+g[(c[j>>2]|0)+12>>2]+ +g[m>>2]*+g[r>>2];b=c[f>>2]|0;c[f>>2]=b+4;g[m>>2]=+g[b>>2];b=c[h>>2]|0;c[h>>2]=b+4;g[s>>2]=+g[b>>2];g[c[j>>2]>>2]=+g[c[j>>2]>>2]+ +g[m>>2]*+g[t>>2];g[(c[j>>2]|0)+4>>2]=+g[(c[j>>2]|0)+4>>2]+ +g[m>>2]*+g[q>>2];g[(c[j>>2]|0)+8>>2]=+g[(c[j>>2]|0)+8>>2]+ +g[m>>2]*+g[r>>2];g[(c[j>>2]|0)+12>>2]=+g[(c[j>>2]|0)+12>>2]+ +g[m>>2]*+g[s>>2];c[l>>2]=(c[l>>2]|0)+4}b=c[l>>2]|0;c[l>>2]=b+1;if((b|0)<(c[k>>2]|0)){b=c[f>>2]|0;c[f>>2]=b+4;g[n>>2]=+g[b>>2];b=c[h>>2]|0;c[h>>2]=b+4;g[t>>2]=+g[b>>2];g[c[j>>2]>>2]=+g[c[j>>2]>>2]+ +g[n>>2]*+g[q>>2];g[(c[j>>2]|0)+4>>2]=+g[(c[j>>2]|0)+4>>2]+ +g[n>>2]*+g[r>>2];g[(c[j>>2]|0)+8>>2]=+g[(c[j>>2]|0)+8>>2]+ +g[n>>2]*+g[s>>2];g[(c[j>>2]|0)+12>>2]=+g[(c[j>>2]|0)+12>>2]+ +g[n>>2]*+g[t>>2]}b=c[l>>2]|0;c[l>>2]=b+1;if((b|0)<(c[k>>2]|0)){b=c[f>>2]|0;c[f>>2]=b+4;g[o>>2]=+g[b>>2];b=c[h>>2]|0;c[h>>2]=b+4;g[q>>2]=+g[b>>2];g[c[j>>2]>>2]=+g[c[j>>2]>>2]+ +g[o>>2]*+g[r>>2];g[(c[j>>2]|0)+4>>2]=+g[(c[j>>2]|0)+4>>2]+ +g[o>>2]*+g[s>>2];g[(c[j>>2]|0)+8>>2]=+g[(c[j>>2]|0)+8>>2]+ +g[o>>2]*+g[t>>2];g[(c[j>>2]|0)+12>>2]=+g[(c[j>>2]|0)+12>>2]+ +g[o>>2]*+g[q>>2]}if((c[l>>2]|0)>=(c[k>>2]|0)){i=u;return}b=c[f>>2]|0;c[f>>2]=b+4;g[p>>2]=+g[b>>2];b=c[h>>2]|0;c[h>>2]=b+4;g[r>>2]=+g[b>>2];g[c[j>>2]>>2]=+g[c[j>>2]>>2]+ +g[p>>2]*+g[s>>2];g[(c[j>>2]|0)+4>>2]=+g[(c[j>>2]|0)+4>>2]+ +g[p>>2]*+g[t>>2];g[(c[j>>2]|0)+8>>2]=+g[(c[j>>2]|0)+8>>2]+ +g[p>>2]*+g[q>>2];g[(c[j>>2]|0)+12>>2]=+g[(c[j>>2]|0)+12>>2]+ +g[p>>2]*+g[r>>2];i=u;return}function Xc(a,b,d,e,f,h,j){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;v=i;i=i+64|0;k=v+60|0;l=v+56|0;m=v+52|0;n=v+48|0;o=v+44|0;p=v+40|0;r=v+32|0;s=v+28|0;q=v+24|0;t=v+8|0;u=v;c[k>>2]=a;c[l>>2]=b;c[m>>2]=d;c[n>>2]=e;c[o>>2]=f;c[p>>2]=h;c[v+36>>2]=j;a=c[o>>2]|0;c[q>>2]=ia()|0;e=i;i=i+((1*(a<<2)|0)+15&-16)|0;a=i;i=i+((1*((c[n>>2]|0)+(c[o>>2]|0)<<2)|0)+15&-16)|0;c[r>>2]=0;while(1){if((c[r>>2]|0)>=(c[o>>2]|0))break;g[e+(c[r>>2]<<2)>>2]=+g[(c[l>>2]|0)+((c[o>>2]|0)-(c[r>>2]|0)-1<<2)>>2];c[r>>2]=(c[r>>2]|0)+1}c[r>>2]=0;while(1){if((c[r>>2]|0)>=(c[o>>2]|0))break;g[a+(c[r>>2]<<2)>>2]=-+g[(c[p>>2]|0)+((c[o>>2]|0)-(c[r>>2]|0)-1<<2)>>2];c[r>>2]=(c[r>>2]|0)+1}while(1){if((c[r>>2]|0)>=((c[n>>2]|0)+(c[o>>2]|0)|0))break;g[a+(c[r>>2]<<2)>>2]=0.0;c[r>>2]=(c[r>>2]|0)+1}c[r>>2]=0;while(1){if((c[r>>2]|0)>=((c[n>>2]|0)-3|0))break;g[t>>2]=+g[(c[k>>2]|0)+(c[r>>2]<<2)>>2];g[t+4>>2]=+g[(c[k>>2]|0)+((c[r>>2]|0)+1<<2)>>2];g[t+8>>2]=+g[(c[k>>2]|0)+((c[r>>2]|0)+2<<2)>>2];g[t+12>>2]=+g[(c[k>>2]|0)+((c[r>>2]|0)+3<<2)>>2];Wc(e,a+(c[r>>2]<<2)|0,t,c[o>>2]|0);g[a+((c[r>>2]|0)+(c[o>>2]|0)<<2)>>2]=-+g[t>>2];g[(c[m>>2]|0)+(c[r>>2]<<2)>>2]=+g[t>>2];g[t+4>>2]=+g[t+4>>2]+ +g[a+((c[r>>2]|0)+(c[o>>2]|0)<<2)>>2]*+g[c[l>>2]>>2];g[a+((c[r>>2]|0)+(c[o>>2]|0)+1<<2)>>2]=-+g[t+4>>2];g[(c[m>>2]|0)+((c[r>>2]|0)+1<<2)>>2]=+g[t+4>>2];g[t+8>>2]=+g[t+8>>2]+ +g[a+((c[r>>2]|0)+(c[o>>2]|0)+1<<2)>>2]*+g[c[l>>2]>>2];g[t+8>>2]=+g[t+8>>2]+ +g[a+((c[r>>2]|0)+(c[o>>2]|0)<<2)>>2]*+g[(c[l>>2]|0)+4>>2];g[a+((c[r>>2]|0)+(c[o>>2]|0)+2<<2)>>2]=-+g[t+8>>2];g[(c[m>>2]|0)+((c[r>>2]|0)+2<<2)>>2]=+g[t+8>>2];g[t+12>>2]=+g[t+12>>2]+ +g[a+((c[r>>2]|0)+(c[o>>2]|0)+2<<2)>>2]*+g[c[l>>2]>>2];g[t+12>>2]=+g[t+12>>2]+ +g[a+((c[r>>2]|0)+(c[o>>2]|0)+1<<2)>>2]*+g[(c[l>>2]|0)+4>>2];g[t+12>>2]=+g[t+12>>2]+ +g[a+((c[r>>2]|0)+(c[o>>2]|0)<<2)>>2]*+g[(c[l>>2]|0)+8>>2];g[a+((c[r>>2]|0)+(c[o>>2]|0)+3<<2)>>2]=-+g[t+12>>2];g[(c[m>>2]|0)+((c[r>>2]|0)+3<<2)>>2]=+g[t+12>>2];c[r>>2]=(c[r>>2]|0)+4}while(1){if((c[r>>2]|0)>=(c[n>>2]|0))break;g[u>>2]=+g[(c[k>>2]|0)+(c[r>>2]<<2)>>2];c[s>>2]=0;while(1){if((c[s>>2]|0)>=(c[o>>2]|0))break;g[u>>2]=+g[u>>2]-+g[e+(c[s>>2]<<2)>>2]*+g[a+((c[r>>2]|0)+(c[s>>2]|0)<<2)>>2];c[s>>2]=(c[s>>2]|0)+1}g[a+((c[r>>2]|0)+(c[o>>2]|0)<<2)>>2]=+g[u>>2];g[(c[m>>2]|0)+(c[r>>2]<<2)>>2]=+g[u>>2];c[r>>2]=(c[r>>2]|0)+1}c[r>>2]=0;while(1){if((c[r>>2]|0)>=(c[o>>2]|0))break;g[(c[p>>2]|0)+(c[r>>2]<<2)>>2]=+g[(c[m>>2]|0)+((c[n>>2]|0)-(c[r>>2]|0)-1<<2)>>2];c[r>>2]=(c[r>>2]|0)+1}na(c[q>>2]|0);i=v;return}function Yc(a,b,d,e,f,h,j){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;j=j|0;var k=0.0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;z=i;i=i+64|0;l=z+52|0;p=z+48|0;m=z+44|0;n=z+40|0;q=z+36|0;r=z+32|0;o=z+28|0;t=z+24|0;v=z+20|0;w=z+16|0;u=z+12|0;x=z+8|0;y=z+4|0;s=z;c[l>>2]=a;c[p>>2]=b;c[m>>2]=d;c[n>>2]=e;c[q>>2]=f;c[r>>2]=h;c[o>>2]=j;c[u>>2]=(c[r>>2]|0)-(c[q>>2]|0);a=c[r>>2]|0;c[s>>2]=ia()|0;b=i;i=i+((1*(a<<2)|0)+15&-16)|0;if(!(c[n>>2]|0))c[y>>2]=c[l>>2];else{c[v>>2]=0;while(1){if((c[v>>2]|0)>=(c[r>>2]|0))break;g[b+(c[v>>2]<<2)>>2]=+g[(c[l>>2]|0)+(c[v>>2]<<2)>>2];c[v>>2]=(c[v>>2]|0)+1}c[v>>2]=0;while(1){if((c[v>>2]|0)>=(c[n>>2]|0))break;g[b+(c[v>>2]<<2)>>2]=+g[(c[l>>2]|0)+(c[v>>2]<<2)>>2]*+g[(c[m>>2]|0)+(c[v>>2]<<2)>>2];g[b+((c[r>>2]|0)-(c[v>>2]|0)-1<<2)>>2]=+g[(c[l>>2]|0)+((c[r>>2]|0)-(c[v>>2]|0)-1<<2)>>2]*+g[(c[m>>2]|0)+(c[v>>2]<<2)>>2];c[v>>2]=(c[v>>2]|0)+1}c[y>>2]=b}c[x>>2]=0;Mc(c[y>>2]|0,c[y>>2]|0,c[p>>2]|0,c[u>>2]|0,(c[q>>2]|0)+1|0,c[o>>2]|0);c[w>>2]=0;while(1){if((c[w>>2]|0)>(c[q>>2]|0))break;c[v>>2]=(c[w>>2]|0)+(c[u>>2]|0);g[t>>2]=0.0;while(1){k=+g[t>>2];if((c[v>>2]|0)>=(c[r>>2]|0))break;g[t>>2]=k+ +g[(c[y>>2]|0)+(c[v>>2]<<2)>>2]*+g[(c[y>>2]|0)+((c[v>>2]|0)-(c[w>>2]|0)<<2)>>2];c[v>>2]=(c[v>>2]|0)+1}o=(c[p>>2]|0)+(c[w>>2]<<2)|0;g[o>>2]=+g[o>>2]+k;c[w>>2]=(c[w>>2]|0)+1}y=c[x>>2]|0;na(c[s>>2]|0);i=z;return y|0}function Zc(a,b,d,e,f,h,j,k,l,m,n,o,p,q,r,s,t){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;j=j|0;k=k|0;l=l|0;m=m|0;n=n|0;o=o|0;p=p|0;q=q|0;r=r|0;s=s|0;t=t|0;var u=0.0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,$=0,aa=0,ba=0;aa=i;i=i+224|0;z=aa+216|0;A=aa+212|0;H=aa+208|0;x=aa+204|0;I=aa+200|0;J=aa+196|0;K=aa+192|0;L=aa+188|0;M=aa+184|0;N=aa+180|0;B=aa+176|0;v=aa+172|0;ba=aa+168|0;C=aa+164|0;D=aa+160|0;w=aa+156|0;E=aa+152|0;S=aa+148|0;V=aa+144|0;R=aa+96|0;Z=aa+92|0;O=aa+88|0;T=aa+84|0;W=aa+80|0;F=aa+76|0;U=aa+72|0;Q=aa+24|0;$=aa+20|0;Y=aa+16|0;X=aa+12|0;y=aa+8|0;P=aa+4|0;G=aa;c[z>>2]=a;c[A>>2]=b;c[H>>2]=d;c[x>>2]=e;c[I>>2]=f;c[J>>2]=h;c[K>>2]=j;c[L>>2]=k;c[M>>2]=l;c[N>>2]=m;c[B>>2]=n;c[v>>2]=o;c[ba>>2]=p;c[C>>2]=q;c[D>>2]=r;c[w>>2]=s;c[E>>2]=t;c[O>>2]=0;if(!(c[ba>>2]|0))if(!(c[D>>2]|0)?+g[c[C>>2]>>2]>+(_(c[N>>2]<<1,(c[H>>2]|0)-(c[A>>2]|0)|0)|0):0)m=(c[v>>2]|0)>(_((c[H>>2]|0)-(c[A>>2]|0)|0,c[N>>2]|0)|0);else m=0;else m=1;c[S>>2]=m&1;c[T>>2]=~~(+((c[K>>2]|0)>>>0)*+g[c[C>>2]>>2]*+(c[w>>2]|0)/+(c[N>>2]<<9|0));g[W>>2]=+_c(c[I>>2]|0,c[J>>2]|0,c[A>>2]|0,c[x>>2]|0,c[(c[z>>2]|0)+8>>2]|0,c[N>>2]|0);c[Z>>2]=$c(c[M>>2]|0)|0;if(((c[Z>>2]|0)+3|0)>>>0>(c[K>>2]|0)>>>0){c[S>>2]=0;c[D>>2]=0}g[V>>2]=16.0;if(((c[H>>2]|0)-(c[A>>2]|0)|0)>10){if(+g[V>>2]<+(c[v>>2]|0)*.125)u=+g[V>>2];else u=+(c[v>>2]|0)*.125;g[V>>2]=u}if(c[E>>2]|0)g[V>>2]=3.0;q=R;f=c[M>>2]|0;e=q+48|0;do{c[q>>2]=c[f>>2];q=q+4|0;f=f+4|0}while((q|0)<(e|0));ba=_(c[N>>2]|0,c[(c[z>>2]|0)+8>>2]|0)|0;c[F>>2]=ia()|0;n=i;i=i+((1*(ba<<2)|0)+15&-16)|0;ba=(_(c[N>>2]|0,c[(c[z>>2]|0)+8>>2]|0)|0)<<2;j=i;i=i+((1*ba|0)+15&-16)|0;ba=(_(c[N>>2]|0,c[(c[z>>2]|0)+8>>2]|0)|0)<<2;pj(n|0,c[J>>2]|0,ba+0|0)|0;if((c[D>>2]|0)!=0|(c[S>>2]|0)!=0)c[O>>2]=ad(c[z>>2]|0,c[A>>2]|0,c[H>>2]|0,c[I>>2]|0,n,c[K>>2]|0,c[Z>>2]|0,26384+((c[B>>2]|0)*84|0)+42|0,j,c[M>>2]|0,c[N>>2]|0,c[B>>2]|0,1,+g[V>>2],c[E>>2]|0)|0;if(c[S>>2]|0){ba=(_(c[N>>2]|0,c[(c[z>>2]|0)+8>>2]|0)|0)<<2;pj(c[J>>2]|0,n|0,ba+0|0)|0;ba=(_(c[N>>2]|0,c[(c[z>>2]|0)+8>>2]|0)|0)<<2;pj(c[L>>2]|0,j|0,ba+0|0)|0}else{c[$>>2]=Xb(c[M>>2]|0)|0;q=Q;f=c[M>>2]|0;e=q+48|0;do{c[q>>2]=c[f>>2];q=q+4|0;f=f+4|0}while((q|0)<(e|0));c[Y>>2]=bd(R)|0;c[X>>2]=bd(Q)|0;q=cd(Q)|0;c[U>>2]=q+(c[Y>>2]|0);q=(c[X>>2]|0)-(c[Y>>2]|0)|0;c[y>>2]=q;c[y>>2]=(c[y>>2]|0)==0?1:q;q=c[y>>2]|0;c[G>>2]=ia()|0;m=i;i=i+((1*q|0)+15&-16)|0;pj(m|0,c[U>>2]|0,(c[X>>2]|0)-(c[Y>>2]|0)+0|0)|0;q=c[M>>2]|0;f=R;e=q+48|0;do{c[q>>2]=c[f>>2];q=q+4|0;f=f+4|0}while((q|0)<(e|0));c[P>>2]=ad(c[z>>2]|0,c[A>>2]|0,c[H>>2]|0,c[I>>2]|0,c[J>>2]|0,c[K>>2]|0,c[Z>>2]|0,26384+((c[B>>2]|0)*84|0)+((c[S>>2]|0)*42|0)|0,c[L>>2]|0,c[M>>2]|0,c[N>>2]|0,c[B>>2]|0,0,+g[V>>2],c[E>>2]|0)|0;do if(c[D>>2]|0){if((c[O>>2]|0)>=(c[P>>2]|0)){if((c[O>>2]|0)!=(c[P>>2]|0))break;ba=Xb(c[M>>2]|0)|0;if((ba+(c[T>>2]|0)|0)<=(c[$>>2]|0))break}q=c[M>>2]|0;f=Q;e=q+48|0;do{c[q>>2]=c[f>>2];q=q+4|0;f=f+4|0}while((q|0)<(e|0));pj(c[U>>2]|0,m|0,(c[X>>2]|0)-(c[Y>>2]|0)+0|0)|0;ba=(_(c[N>>2]|0,c[(c[z>>2]|0)+8>>2]|0)|0)<<2;pj(c[J>>2]|0,n|0,ba+0|0)|0;ba=(_(c[N>>2]|0,c[(c[z>>2]|0)+8>>2]|0)|0)<<2;pj(c[L>>2]|0,j|0,ba+0|0)|0;c[S>>2]=1}while(0);na(c[G>>2]|0)}if(c[S>>2]|0){g[c[C>>2]>>2]=+g[W>>2];ba=c[F>>2]|0;na(ba|0);i=aa;return}else{g[c[C>>2]>>2]=+g[17580+(c[B>>2]<<2)>>2]*+g[17580+(c[B>>2]<<2)>>2]*+g[c[C>>2]>>2]+ +g[W>>2];ba=c[F>>2]|0;na(ba|0);i=aa;return}}function _c(a,b,d,e,f,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;t=i;i=i+48|0;j=t+36|0;k=t+32|0;l=t+28|0;m=t+24|0;n=t+20|0;o=t+16|0;p=t+12|0;s=t+8|0;r=t+4|0;q=t;c[j>>2]=a;c[k>>2]=b;c[l>>2]=d;c[m>>2]=e;c[n>>2]=f;c[o>>2]=h;g[r>>2]=0.0;c[p>>2]=0;do{c[s>>2]=c[l>>2];while(1){if((c[s>>2]|0)>=(c[m>>2]|0))break;b=(c[s>>2]|0)+(_(c[p>>2]|0,c[n>>2]|0)|0)|0;d=(c[s>>2]|0)+(_(c[p>>2]|0,c[n>>2]|0)|0)|0;g[q>>2]=+g[(c[j>>2]|0)+(b<<2)>>2]-+g[(c[k>>2]|0)+(d<<2)>>2];g[r>>2]=+g[r>>2]+ +g[q>>2]*+g[q>>2];c[s>>2]=(c[s>>2]|0)+1}d=(c[p>>2]|0)+1|0;c[p>>2]=d}while((d|0)<(c[o>>2]|0));i=t;return +(200.0<+g[r>>2]?200.0:+g[r>>2])}function $c(a){a=a|0;var b=0,d=0;b=i;i=i+16|0;d=b;c[d>>2]=a;a=(c[(c[d>>2]|0)+20>>2]|0)-(32-(aa(c[(c[d>>2]|0)+28>>2]|0)|0))|0;i=b;return a|0}function ad(a,b,e,f,h,j,k,l,m,n,o,p,q,r,s){a=a|0;b=b|0;e=e|0;f=f|0;h=h|0;j=j|0;k=k|0;l=l|0;m=m|0;n=n|0;o=o|0;p=p|0;q=q|0;r=+r;s=s|0;var t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,$=0;$=i;i=i+128|0;v=$+124|0;w=$+120|0;A=$+116|0;B=$+112|0;C=$+108|0;D=$+104|0;E=$+100|0;F=$+96|0;G=$+92|0;H=$+88|0;x=$+84|0;t=$+80|0;u=$+76|0;y=$+72|0;z=$+68|0;R=$+64|0;L=$+60|0;I=$+56|0;U=$+48|0;O=$+44|0;J=$+40|0;K=$+36|0;W=$+32|0;X=$+28|0;V=$+24|0;Z=$+20|0;Q=$+16|0;Y=$+12|0;S=$+8|0;P=$+4|0;T=$;c[v>>2]=a;c[w>>2]=b;c[A>>2]=e;c[B>>2]=f;c[C>>2]=h;c[D>>2]=j;c[E>>2]=k;c[F>>2]=l;c[G>>2]=m;c[H>>2]=n;c[x>>2]=o;c[t>>2]=p;c[u>>2]=q;g[y>>2]=r;c[z>>2]=s;c[I>>2]=0;c[U>>2]=0;c[U+4>>2]=0;if(((c[E>>2]|0)+3|0)<=(c[D>>2]|0))pc(c[H>>2]|0,c[u>>2]|0,3);if(c[u>>2]|0){g[O>>2]=0.0;g[J>>2]=.149993896484375}else{g[J>>2]=+g[17564+(c[t>>2]<<2)>>2];g[O>>2]=+g[17580+(c[t>>2]<<2)>>2]}c[R>>2]=c[w>>2];while(1){if((c[R>>2]|0)>=(c[A>>2]|0))break;c[L>>2]=0;do{k=(c[R>>2]|0)+(_(c[L>>2]|0,c[(c[v>>2]|0)+8>>2]|0)|0)|0;g[Z>>2]=+g[(c[B>>2]|0)+(k<<2)>>2];k=(c[R>>2]|0)+(_(c[L>>2]|0,c[(c[v>>2]|0)+8>>2]|0)|0)|0;if(-9.0>+g[(c[C>>2]|0)+(k<<2)>>2])r=-9.0;else{k=(c[R>>2]|0)+(_(c[L>>2]|0,c[(c[v>>2]|0)+8>>2]|0)|0)|0;r=+g[(c[C>>2]|0)+(k<<2)>>2]}g[S>>2]=r;g[Q>>2]=+g[Z>>2]-+g[O>>2]*+g[S>>2]-+g[U+(c[L>>2]<<2)>>2];c[W>>2]=~~+M(+(+g[Q>>2]+.5));k=(c[R>>2]|0)+(_(c[L>>2]|0,c[(c[v>>2]|0)+8>>2]|0)|0)|0;if(-28.0>+g[(c[C>>2]|0)+(k<<2)>>2])r=-28.0;else{k=(c[R>>2]|0)+(_(c[L>>2]|0,c[(c[v>>2]|0)+8>>2]|0)|0)|0;r=+g[(c[C>>2]|0)+(k<<2)>>2]}g[P>>2]=r-+g[y>>2];if((c[W>>2]|0)<0?+g[Z>>2]<+g[P>>2]:0){k=(c[W>>2]|0)+~~(+g[P>>2]-+g[Z>>2])|0;c[W>>2]=k;c[W>>2]=(c[W>>2]|0)>0?0:k}c[X>>2]=c[W>>2];c[E>>2]=$c(c[H>>2]|0)|0;c[K>>2]=(c[D>>2]|0)-(c[E>>2]|0)-(_((c[x>>2]|0)*3|0,(c[A>>2]|0)-(c[R>>2]|0)|0)|0);if((c[K>>2]|0)<30?(c[R>>2]|0)!=(c[w>>2]|0):0){if((c[K>>2]|0)<24)c[W>>2]=1<(c[W>>2]|0)?1:c[W>>2]|0;if((c[K>>2]|0)<16)c[W>>2]=-1>(c[W>>2]|0)?-1:c[W>>2]|0}if((c[z>>2]|0)!=0&(c[R>>2]|0)>=2)c[W>>2]=(c[W>>2]|0)<0?c[W>>2]|0:0;do if(((c[D>>2]|0)-(c[E>>2]|0)|0)<15)if(((c[D>>2]|0)-(c[E>>2]|0)|0)<2)if(((c[D>>2]|0)-(c[E>>2]|0)|0)>=1){c[W>>2]=0<(c[W>>2]|0)?0:c[W>>2]|0;pc(c[H>>2]|0,0-(c[W>>2]|0)|0,1);break}else{c[W>>2]=-1;break}else{if(-1>(((c[W>>2]|0)<1?c[W>>2]|0:1)|0))t=-1;else t=(c[W>>2]|0)<1?c[W>>2]|0:1;c[W>>2]=t;qc(c[H>>2]|0,c[W>>2]<<1^0-((c[W>>2]|0)<0&1),26720,2);break}else{c[T>>2]=((c[R>>2]|0)<20?c[R>>2]|0:20)<<1;Dc(c[H>>2]|0,W,(d[(c[F>>2]|0)+(c[T>>2]|0)>>0]|0)<<7,(d[(c[F>>2]|0)+((c[T>>2]|0)+1)>>0]|0)<<6)}while(0);k=(c[R>>2]|0)+(_(c[L>>2]|0,c[(c[v>>2]|0)+8>>2]|0)|0)|0;g[(c[G>>2]|0)+(k<<2)>>2]=+g[Q>>2]-+(c[W>>2]|0);k=N((c[X>>2]|0)-(c[W>>2]|0)|0)|0;c[I>>2]=(c[I>>2]|0)+k;g[V>>2]=+(c[W>>2]|0);g[Y>>2]=+g[O>>2]*+g[S>>2]+ +g[U+(c[L>>2]<<2)>>2]+ +g[V>>2];k=(c[R>>2]|0)+(_(c[L>>2]|0,c[(c[v>>2]|0)+8>>2]|0)|0)|0;g[(c[C>>2]|0)+(k<<2)>>2]=+g[Y>>2];g[U+(c[L>>2]<<2)>>2]=+g[U+(c[L>>2]<<2)>>2]+ +g[V>>2]-+g[J>>2]*+g[V>>2];k=(c[L>>2]|0)+1|0;c[L>>2]=k}while((k|0)<(c[x>>2]|0));c[R>>2]=(c[R>>2]|0)+1}i=$;return (c[z>>2]|0?0:c[I>>2]|0)|0}function bd(a){a=a|0;var b=0,d=0;d=i;i=i+16|0;b=d;c[b>>2]=a;i=d;return c[(c[b>>2]|0)+24>>2]|0}function cd(a){a=a|0;var b=0,d=0;d=i;i=i+16|0;b=d;c[b>>2]=a;i=d;return c[c[b>>2]>>2]|0}function dd(a,d,e,f,h,j,k,l){a=a|0;d=d|0;e=e|0;f=f|0;h=h|0;j=j|0;k=k|0;l=l|0;var m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;y=i;i=i+64|0;m=y+44|0;z=y+40|0;n=y+36|0;o=y+32|0;p=y+28|0;q=y+24|0;r=y+20|0;s=y+16|0;v=y+12|0;t=y+8|0;u=y+48|0;x=y+4|0;w=y;c[m>>2]=a;c[z>>2]=d;c[n>>2]=e;c[o>>2]=f;c[p>>2]=h;c[q>>2]=j;c[r>>2]=k;c[s>>2]=l;c[v>>2]=c[z>>2];while(1){if((c[v>>2]|0)>=(c[n>>2]|0))break;b[u>>1]=1<<c[(c[q>>2]|0)+(c[v>>2]<<2)>>2];if((c[(c[q>>2]|0)+(c[v>>2]<<2)>>2]|0)>0){c[t>>2]=0;do{z=(c[v>>2]|0)+(_(c[t>>2]|0,c[(c[m>>2]|0)+8>>2]|0)|0)|0;c[x>>2]=~~+M(+((+g[(c[p>>2]|0)+(z<<2)>>2]+.5)*+(b[u>>1]|0)));if((c[x>>2]|0)>((b[u>>1]|0)-1|0))c[x>>2]=(b[u>>1]|0)-1;if((c[x>>2]|0)<0)c[x>>2]=0;sc(c[r>>2]|0,c[x>>2]|0,c[(c[q>>2]|0)+(c[v>>2]<<2)>>2]|0);g[w>>2]=(+(c[x>>2]|0)+.5)*+(1<<14-(c[(c[q>>2]|0)+(c[v>>2]<<2)>>2]|0)|0)*.00006103515625-.5;z=(c[v>>2]|0)+(_(c[t>>2]|0,c[(c[m>>2]|0)+8>>2]|0)|0)|0;z=(c[o>>2]|0)+(z<<2)|0;g[z>>2]=+g[z>>2]+ +g[w>>2];z=(c[v>>2]|0)+(_(c[t>>2]|0,c[(c[m>>2]|0)+8>>2]|0)|0)|0;z=(c[p>>2]|0)+(z<<2)|0;g[z>>2]=+g[z>>2]-+g[w>>2];z=(c[t>>2]|0)+1|0;c[t>>2]=z}while((z|0)<(c[s>>2]|0))}c[v>>2]=(c[v>>2]|0)+1}i=y;return}function ed(a,b,d,e,f,h,j,k,l,m){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;j=j|0;k=k|0;l=l|0;m=m|0;var n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;C=i;i=i+64|0;n=C+56|0;o=C+52|0;p=C+48|0;q=C+44|0;r=C+40|0;s=C+36|0;t=C+32|0;u=C+28|0;v=C+24|0;w=C+20|0;y=C+16|0;A=C+12|0;x=C+8|0;B=C+4|0;z=C;c[n>>2]=a;c[o>>2]=b;c[p>>2]=d;c[q>>2]=e;c[r>>2]=f;c[s>>2]=h;c[t>>2]=j;c[u>>2]=k;c[v>>2]=l;c[w>>2]=m;c[A>>2]=0;while(1){if((c[A>>2]|0)>=2)break;c[y>>2]=c[o>>2];while(1){if((c[y>>2]|0)>=(c[p>>2]|0))break;if((c[u>>2]|0)<(c[w>>2]|0))break;if((c[(c[s>>2]|0)+(c[y>>2]<<2)>>2]|0)<8?(c[(c[t>>2]|0)+(c[y>>2]<<2)>>2]|0)==(c[A>>2]|0):0){c[x>>2]=0;do{b=(c[y>>2]|0)+(_(c[x>>2]|0,c[(c[n>>2]|0)+8>>2]|0)|0)|0;c[B>>2]=+g[(c[r>>2]|0)+(b<<2)>>2]<0.0?0:1;sc(c[v>>2]|0,c[B>>2]|0,1);g[z>>2]=(+(c[B>>2]|0)-.5)*+(1<<14-(c[(c[s>>2]|0)+(c[y>>2]<<2)>>2]|0)-1|0)*.00006103515625;b=(c[y>>2]|0)+(_(c[x>>2]|0,c[(c[n>>2]|0)+8>>2]|0)|0)|0;b=(c[q>>2]|0)+(b<<2)|0;g[b>>2]=+g[b>>2]+ +g[z>>2];c[u>>2]=(c[u>>2]|0)+-1;b=(c[x>>2]|0)+1|0;c[x>>2]=b}while((b|0)<(c[w>>2]|0))}c[y>>2]=(c[y>>2]|0)+1}c[A>>2]=(c[A>>2]|0)+1}i=C;return}function fd(a,b,e,f,h,j,k,l){a=a|0;b=b|0;e=e|0;f=f|0;h=h|0;j=j|0;k=k|0;l=l|0;var m=0.0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0;G=i;i=i+96|0;p=G+80|0;n=G+76|0;q=G+72|0;r=G+68|0;H=G+64|0;s=G+60|0;t=G+56|0;o=G+52|0;B=G+48|0;y=G+44|0;w=G+40|0;A=G+32|0;x=G+28|0;u=G+24|0;v=G+20|0;E=G+16|0;D=G+12|0;C=G+8|0;F=G+4|0;z=G;c[p>>2]=a;c[n>>2]=b;c[q>>2]=e;c[r>>2]=f;c[H>>2]=h;c[s>>2]=j;c[t>>2]=k;c[o>>2]=l;c[B>>2]=26384+((c[o>>2]|0)*84|0)+((c[H>>2]|0)*42|0);c[A>>2]=0;c[A+4>>2]=0;if(c[H>>2]|0){g[x>>2]=0.0;g[u>>2]=.149993896484375}else{g[u>>2]=+g[17564+(c[o>>2]<<2)>>2];g[x>>2]=+g[17580+(c[o>>2]<<2)>>2]}c[v>>2]=c[(c[s>>2]|0)+4>>2]<<3;c[y>>2]=c[n>>2];while(1){if((c[y>>2]|0)>=(c[q>>2]|0))break;c[w>>2]=0;do{c[E>>2]=$c(c[s>>2]|0)|0;do if(((c[v>>2]|0)-(c[E>>2]|0)|0)<15){if(((c[v>>2]|0)-(c[E>>2]|0)|0)>=2){c[D>>2]=ec(c[s>>2]|0,26720,2)|0;c[D>>2]=c[D>>2]>>1^0-(c[D>>2]&1);break}if(((c[v>>2]|0)-(c[E>>2]|0)|0)>=1){c[D>>2]=0-(dc(c[s>>2]|0,1)|0);break}else{c[D>>2]=-1;break}}else{c[z>>2]=((c[y>>2]|0)<20?c[y>>2]|0:20)<<1;c[D>>2]=Fc(c[s>>2]|0,(d[(c[B>>2]|0)+(c[z>>2]|0)>>0]|0)<<7,(d[(c[B>>2]|0)+((c[z>>2]|0)+1)>>0]|0)<<6)|0}while(0);g[C>>2]=+(c[D>>2]|0);H=(c[y>>2]|0)+(_(c[w>>2]|0,c[(c[p>>2]|0)+8>>2]|0)|0)|0;if(-9.0>+g[(c[r>>2]|0)+(H<<2)>>2])m=-9.0;else{H=(c[y>>2]|0)+(_(c[w>>2]|0,c[(c[p>>2]|0)+8>>2]|0)|0)|0;m=+g[(c[r>>2]|0)+(H<<2)>>2]}H=(c[y>>2]|0)+(_(c[w>>2]|0,c[(c[p>>2]|0)+8>>2]|0)|0)|0;g[(c[r>>2]|0)+(H<<2)>>2]=m;H=(c[y>>2]|0)+(_(c[w>>2]|0,c[(c[p>>2]|0)+8>>2]|0)|0)|0;g[F>>2]=+g[x>>2]*+g[(c[r>>2]|0)+(H<<2)>>2]+ +g[A+(c[w>>2]<<2)>>2]+ +g[C>>2];H=(c[y>>2]|0)+(_(c[w>>2]|0,c[(c[p>>2]|0)+8>>2]|0)|0)|0;g[(c[r>>2]|0)+(H<<2)>>2]=+g[F>>2];g[A+(c[w>>2]<<2)>>2]=+g[A+(c[w>>2]<<2)>>2]+ +g[C>>2]-+g[u>>2]*+g[C>>2];H=(c[w>>2]|0)+1|0;c[w>>2]=H}while((H|0)<(c[t>>2]|0));c[y>>2]=(c[y>>2]|0)+1}i=G;return}function gd(a,b,d,e,f,h,j){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;u=i;i=i+48|0;k=u+40|0;v=u+36|0;l=u+32|0;m=u+28|0;n=u+24|0;o=u+20|0;p=u+16|0;r=u+12|0;q=u+8|0;t=u+4|0;s=u;c[k>>2]=a;c[v>>2]=b;c[l>>2]=d;c[m>>2]=e;c[n>>2]=f;c[o>>2]=h;c[p>>2]=j;c[r>>2]=c[v>>2];while(1){if((c[r>>2]|0)>=(c[l>>2]|0))break;if((c[(c[n>>2]|0)+(c[r>>2]<<2)>>2]|0)>0){c[q>>2]=0;do{c[t>>2]=gc(c[o>>2]|0,c[(c[n>>2]|0)+(c[r>>2]<<2)>>2]|0)|0;g[s>>2]=(+(c[t>>2]|0)+.5)*+(1<<14-(c[(c[n>>2]|0)+(c[r>>2]<<2)>>2]|0)|0)*.00006103515625-.5;v=(c[r>>2]|0)+(_(c[q>>2]|0,c[(c[k>>2]|0)+8>>2]|0)|0)|0;v=(c[m>>2]|0)+(v<<2)|0;g[v>>2]=+g[v>>2]+ +g[s>>2];v=(c[q>>2]|0)+1|0;c[q>>2]=v}while((v|0)<(c[p>>2]|0))}c[r>>2]=(c[r>>2]|0)+1}i=u;return}function hd(a,b,d,e,f,h,j,k,l){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;j=j|0;k=k|0;l=l|0;var m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0;A=i;i=i+64|0;m=A+52|0;n=A+48|0;o=A+44|0;p=A+40|0;q=A+36|0;r=A+32|0;s=A+28|0;t=A+24|0;u=A+20|0;w=A+16|0;y=A+12|0;v=A+8|0;z=A+4|0;x=A;c[m>>2]=a;c[n>>2]=b;c[o>>2]=d;c[p>>2]=e;c[q>>2]=f;c[r>>2]=h;c[s>>2]=j;c[t>>2]=k;c[u>>2]=l;c[y>>2]=0;while(1){if((c[y>>2]|0)>=2)break;c[w>>2]=c[n>>2];while(1){if((c[w>>2]|0)>=(c[o>>2]|0))break;if((c[s>>2]|0)<(c[u>>2]|0))break;if((c[(c[q>>2]|0)+(c[w>>2]<<2)>>2]|0)<8?(c[(c[r>>2]|0)+(c[w>>2]<<2)>>2]|0)==(c[y>>2]|0):0){c[v>>2]=0;do{c[z>>2]=gc(c[t>>2]|0,1)|0;g[x>>2]=(+(c[z>>2]|0)-.5)*+(1<<14-(c[(c[q>>2]|0)+(c[w>>2]<<2)>>2]|0)-1|0)*.00006103515625;b=(c[w>>2]|0)+(_(c[v>>2]|0,c[(c[m>>2]|0)+8>>2]|0)|0)|0;b=(c[p>>2]|0)+(b<<2)|0;g[b>>2]=+g[b>>2]+ +g[x>>2];c[s>>2]=(c[s>>2]|0)+-1;b=(c[v>>2]|0)+1|0;c[v>>2]=b}while((b|0)<(c[u>>2]|0))}c[w>>2]=(c[w>>2]|0)+1}c[y>>2]=(c[y>>2]|0)+1}i=A;return}function id(a,b,d,e,f,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0.0;r=i;i=i+32|0;j=r+28|0;k=r+24|0;l=r+20|0;m=r+16|0;n=r+12|0;o=r+8|0;p=r+4|0;q=r;c[j>>2]=a;c[k>>2]=b;c[l>>2]=d;c[m>>2]=e;c[n>>2]=f;c[o>>2]=h;c[p>>2]=0;do{c[q>>2]=0;while(1){if((c[q>>2]|0)>=(c[k>>2]|0))break;a=(c[q>>2]|0)+(_(c[p>>2]|0,c[(c[j>>2]|0)+8>>2]|0)|0)|0;s=+Y(+(+g[(c[m>>2]|0)+(a<<2)>>2]))*1.4426950408889634;a=(c[q>>2]|0)+(_(c[p>>2]|0,c[(c[j>>2]|0)+8>>2]|0)|0)|0;g[(c[n>>2]|0)+(a<<2)>>2]=s-+g[17464+(c[q>>2]<<2)>>2];c[q>>2]=(c[q>>2]|0)+1}c[q>>2]=c[k>>2];while(1){h=c[p>>2]|0;if((c[q>>2]|0)>=(c[l>>2]|0))break;a=_(h,c[(c[j>>2]|0)+8>>2]|0)|0;g[(c[n>>2]|0)+(a+(c[q>>2]|0)<<2)>>2]=-14.0;c[q>>2]=(c[q>>2]|0)+1}a=h+1|0;c[p>>2]=a}while((a|0)<(c[o>>2]|0));i=r;return}function jd(a,e,f,g,h,j,k,l,m,n,o,p,q,r,s,t,u,v,w){a=a|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|0;m=m|0;n=n|0;o=o|0;p=p|0;q=q|0;r=r|0;s=s|0;t=t|0;u=u|0;v=v|0;w=w|0;var x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0;ha=i;i=i+160|0;D=ha+144|0;E=ha+140|0;P=ha+136|0;Q=ha+132|0;R=ha+128|0;x=ha+124|0;S=ha+120|0;T=ha+116|0;U=ha+112|0;V=ha+108|0;F=ha+104|0;G=ha+100|0;H=ha+96|0;I=ha+92|0;J=ha+88|0;K=ha+84|0;L=ha+80|0;M=ha+76|0;N=ha+72|0;ea=ha+68|0;aa=ha+64|0;da=ha+60|0;ca=ha+56|0;Z=ha+52|0;ga=ha+48|0;fa=ha+44|0;ba=ha+40|0;$=ha+36|0;O=ha+32|0;A=ha+28|0;C=ha+24|0;B=ha+20|0;z=ha+16|0;y=ha+12|0;X=ha+8|0;Y=ha+4|0;W=ha;c[D>>2]=a;c[E>>2]=e;c[P>>2]=f;c[Q>>2]=g;c[R>>2]=h;c[x>>2]=j;c[S>>2]=k;c[T>>2]=l;c[U>>2]=m;c[V>>2]=n;c[F>>2]=o;c[G>>2]=p;c[H>>2]=q;c[I>>2]=r;c[J>>2]=s;c[K>>2]=t;c[L>>2]=u;c[M>>2]=v;c[N>>2]=w;c[U>>2]=(c[U>>2]|0)>0?c[U>>2]|0:0;c[da>>2]=c[(c[D>>2]|0)+8>>2];c[ga>>2]=c[E>>2];c[fa>>2]=(c[U>>2]|0)>=8?8:0;c[U>>2]=(c[U>>2]|0)-(c[fa>>2]|0);c[$>>2]=0;c[ba>>2]=0;do if((c[I>>2]|0)==2){c[ba>>2]=d[26723+((c[P>>2]|0)-(c[E>>2]|0))>>0];if((c[ba>>2]|0)>(c[U>>2]|0)){c[ba>>2]=0;break}else{c[U>>2]=(c[U>>2]|0)-(c[ba>>2]|0);c[$>>2]=(c[U>>2]|0)>=8?8:0;c[U>>2]=(c[U>>2]|0)-(c[$>>2]|0);break}}while(0);j=c[da>>2]|0;c[O>>2]=ia()|0;s=i;i=i+((1*(j<<2)|0)+15&-16)|0;j=i;i=i+((1*(c[da>>2]<<2)|0)+15&-16)|0;n=i;i=i+((1*(c[da>>2]<<2)|0)+15&-16)|0;h=i;i=i+((1*(c[da>>2]<<2)|0)+15&-16)|0;c[ca>>2]=c[E>>2];while(1){if((c[ca>>2]|0)>=(c[P>>2]|0))break;if((c[I>>2]<<3|0)>(((b[(c[(c[D>>2]|0)+32>>2]|0)+((c[ca>>2]|0)+1<<1)>>1]|0)-(b[(c[(c[D>>2]|0)+32>>2]|0)+(c[ca>>2]<<1)>>1]|0)|0)*3<<c[J>>2]<<3>>4|0))r=c[I>>2]<<3;else r=((b[(c[(c[D>>2]|0)+32>>2]|0)+((c[ca>>2]|0)+1<<1)>>1]|0)-(b[(c[(c[D>>2]|0)+32>>2]|0)+(c[ca>>2]<<1)>>1]|0)|0)*3<<c[J>>2]<<3>>4;c[n+(c[ca>>2]<<2)>>2]=r;m=_(c[I>>2]|0,(b[(c[(c[D>>2]|0)+32>>2]|0)+((c[ca>>2]|0)+1<<1)>>1]|0)-(b[(c[(c[D>>2]|0)+32>>2]|0)+(c[ca>>2]<<1)>>1]|0)|0)|0;m=_(m,(c[x>>2]|0)-5-(c[J>>2]|0)|0)|0;m=_(m,(c[P>>2]|0)-(c[ca>>2]|0)-1|0)|0;m=(_(m,1<<(c[J>>2]|0)+3)|0)>>6;c[h+(c[ca>>2]<<2)>>2]=m;if(((b[(c[(c[D>>2]|0)+32>>2]|0)+((c[ca>>2]|0)+1<<1)>>1]|0)-(b[(c[(c[D>>2]|0)+32>>2]|0)+(c[ca>>2]<<1)>>1]|0)<<c[J>>2]|0)==1){m=h+(c[ca>>2]<<2)|0;c[m>>2]=(c[m>>2]|0)-(c[I>>2]<<3)}c[ca>>2]=(c[ca>>2]|0)+1}c[ea>>2]=1;c[aa>>2]=(c[(c[D>>2]|0)+48>>2]|0)-1;do{c[A>>2]=0;c[C>>2]=0;c[B>>2]=(c[ea>>2]|0)+(c[aa>>2]|0)>>1;c[ca>>2]=c[P>>2];while(1){x=c[ca>>2]|0;c[ca>>2]=x+-1;if((x|0)<=(c[E>>2]|0))break;c[y>>2]=(b[(c[(c[D>>2]|0)+32>>2]|0)+((c[ca>>2]|0)+1<<1)>>1]|0)-(b[(c[(c[D>>2]|0)+32>>2]|0)+(c[ca>>2]<<1)>>1]|0);m=_(c[I>>2]|0,c[y>>2]|0)|0;x=_(c[B>>2]|0,c[da>>2]|0)|0;x=_(m,d[(c[(c[D>>2]|0)+52>>2]|0)+(x+(c[ca>>2]|0))>>0]|0)|0;c[z>>2]=x<<c[J>>2]>>2;if((c[z>>2]|0)>0){if(0>((c[z>>2]|0)+(c[h+(c[ca>>2]<<2)>>2]|0)|0))r=0;else r=(c[z>>2]|0)+(c[h+(c[ca>>2]<<2)>>2]|0)|0;c[z>>2]=r}c[z>>2]=(c[z>>2]|0)+(c[(c[Q>>2]|0)+(c[ca>>2]<<2)>>2]|0);if(!(c[A>>2]|0?1:(c[z>>2]|0)>=(c[n+(c[ca>>2]<<2)>>2]|0))){if((c[z>>2]|0)<(c[I>>2]<<3|0))continue;c[C>>2]=(c[C>>2]|0)+(c[I>>2]<<3);continue}c[A>>2]=1;if((c[z>>2]|0)<(c[(c[R>>2]|0)+(c[ca>>2]<<2)>>2]|0))r=c[z>>2]|0;else r=c[(c[R>>2]|0)+(c[ca>>2]<<2)>>2]|0;c[C>>2]=(c[C>>2]|0)+r}r=c[B>>2]|0;if((c[C>>2]|0)>(c[U>>2]|0))c[aa>>2]=r-1;else c[ea>>2]=r+1}while((c[ea>>2]|0)<=(c[aa>>2]|0));C=c[ea>>2]|0;c[ea>>2]=C+-1;c[aa>>2]=C;c[ca>>2]=c[E>>2];while(1){if((c[ca>>2]|0)>=(c[P>>2]|0))break;c[W>>2]=(b[(c[(c[D>>2]|0)+32>>2]|0)+((c[ca>>2]|0)+1<<1)>>1]|0)-(b[(c[(c[D>>2]|0)+32>>2]|0)+(c[ca>>2]<<1)>>1]|0);B=_(c[I>>2]|0,c[W>>2]|0)|0;C=_(c[ea>>2]|0,c[da>>2]|0)|0;C=_(B,d[(c[(c[D>>2]|0)+52>>2]|0)+(C+(c[ca>>2]|0))>>0]|0)|0;c[X>>2]=C<<c[J>>2]>>2;if((c[aa>>2]|0)>=(c[(c[D>>2]|0)+48>>2]|0))r=c[(c[R>>2]|0)+(c[ca>>2]<<2)>>2]|0;else{C=_(c[I>>2]|0,c[W>>2]|0)|0;r=_(c[aa>>2]|0,c[da>>2]|0)|0;r=_(C,d[(c[(c[D>>2]|0)+52>>2]|0)+(r+(c[ca>>2]|0))>>0]|0)|0;r=r<<c[J>>2]>>2}c[Y>>2]=r;if((c[X>>2]|0)>0){if(0>((c[X>>2]|0)+(c[h+(c[ca>>2]<<2)>>2]|0)|0))r=0;else r=(c[X>>2]|0)+(c[h+(c[ca>>2]<<2)>>2]|0)|0;c[X>>2]=r}if((c[Y>>2]|0)>0){if(0>((c[Y>>2]|0)+(c[h+(c[ca>>2]<<2)>>2]|0)|0))r=0;else r=(c[Y>>2]|0)+(c[h+(c[ca>>2]<<2)>>2]|0)|0;c[Y>>2]=r}if((c[ea>>2]|0)>0)c[X>>2]=(c[X>>2]|0)+(c[(c[Q>>2]|0)+(c[ca>>2]<<2)>>2]|0);c[Y>>2]=(c[Y>>2]|0)+(c[(c[Q>>2]|0)+(c[ca>>2]<<2)>>2]|0);if((c[(c[Q>>2]|0)+(c[ca>>2]<<2)>>2]|0)>0)c[ga>>2]=c[ca>>2];if(0>((c[Y>>2]|0)-(c[X>>2]|0)|0))r=0;else r=(c[Y>>2]|0)-(c[X>>2]|0)|0;c[Y>>2]=r;c[s+(c[ca>>2]<<2)>>2]=c[X>>2];c[j+(c[ca>>2]<<2)>>2]=c[Y>>2];c[ca>>2]=(c[ca>>2]|0)+1}c[Z>>2]=kd(c[D>>2]|0,c[E>>2]|0,c[P>>2]|0,c[ga>>2]|0,s,j,n,c[R>>2]|0,c[U>>2]|0,c[V>>2]|0,c[fa>>2]|0,c[S>>2]|0,c[ba>>2]|0,c[T>>2]|0,c[$>>2]|0,c[F>>2]|0,c[G>>2]|0,c[H>>2]|0,c[I>>2]|0,c[J>>2]|0,c[K>>2]|0,c[L>>2]|0,c[M>>2]|0,c[N>>2]|0)|0;ga=c[Z>>2]|0;na(c[O>>2]|0);i=ha;return ga|0}function kd(a,e,f,g,h,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B){a=a|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|0;m=m|0;n=n|0;o=o|0;p=p|0;q=q|0;r=r|0;s=s|0;t=t|0;u=u|0;v=v|0;w=w|0;x=x|0;y=y|0;z=z|0;A=A|0;B=B|0;var C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0;Da=i;i=i+224|0;ea=Da+208|0;ba=Da+204|0;ma=Da+200|0;P=Da+196|0;G=Da+192|0;H=Da+188|0;Q=Da+184|0;na=Da+180|0;Z=Da+176|0;oa=Da+172|0;L=Da+168|0;fa=Da+164|0;M=Da+160|0;ga=Da+156|0;W=Da+152|0;ha=Da+148|0;ia=Da+144|0;ja=Da+140|0;ka=Da+136|0;la=Da+132|0;X=Da+128|0;Y=Da+124|0;N=Da+120|0;O=Da+116|0;aa=Da+112|0;J=Da+108|0;C=Da+104|0;D=Da+100|0;za=Da+96|0;Aa=Da+92|0;Ca=Da+88|0;ua=Da+84|0;R=Da+80|0;ca=Da+76|0;$=Da+72|0;I=Da+68|0;sa=Da+64|0;E=Da+60|0;F=Da+56|0;K=Da+52|0;T=Da+48|0;S=Da+44|0;U=Da+40|0;da=Da+36|0;qa=Da+32|0;pa=Da+28|0;va=Da+24|0;Ba=Da+20|0;ra=Da+16|0;wa=Da+12|0;ta=Da+8|0;ya=Da+4|0;xa=Da;c[ea>>2]=a;c[ba>>2]=e;c[ma>>2]=f;c[P>>2]=g;c[G>>2]=h;c[H>>2]=j;c[Q>>2]=k;c[na>>2]=l;c[Z>>2]=m;c[oa>>2]=n;c[L>>2]=o;c[fa>>2]=p;c[M>>2]=q;c[ga>>2]=r;c[W>>2]=s;c[ha>>2]=t;c[ia>>2]=u;c[ja>>2]=v;c[ka>>2]=w;c[la>>2]=x;c[X>>2]=y;c[Y>>2]=z;c[N>>2]=A;c[O>>2]=B;c[ua>>2]=-1;c[R>>2]=c[ka>>2]<<3;c[Ca>>2]=(c[ka>>2]|0)>1&1;c[Aa>>2]=c[la>>2]<<3;c[J>>2]=0;c[C>>2]=64;c[D>>2]=0;while(1){if((c[D>>2]|0)>=6)break;c[E>>2]=(c[J>>2]|0)+(c[C>>2]|0)>>1;c[aa>>2]=0;c[I>>2]=0;c[za>>2]=c[ma>>2];while(1){m=c[za>>2]|0;c[za>>2]=m+-1;if((m|0)<=(c[ba>>2]|0))break;c[F>>2]=(c[(c[G>>2]|0)+(c[za>>2]<<2)>>2]|0)+((_(c[E>>2]|0,c[(c[H>>2]|0)+(c[za>>2]<<2)>>2]|0)|0)>>6);if(!(c[I>>2]|0?1:(c[F>>2]|0)>=(c[(c[Q>>2]|0)+(c[za>>2]<<2)>>2]|0))){if((c[F>>2]|0)<(c[R>>2]|0))continue;c[aa>>2]=(c[aa>>2]|0)+(c[R>>2]|0);continue}c[I>>2]=1;if((c[F>>2]|0)<(c[(c[na>>2]|0)+(c[za>>2]<<2)>>2]|0))w=c[F>>2]|0;else w=c[(c[na>>2]|0)+(c[za>>2]<<2)>>2]|0;c[aa>>2]=(c[aa>>2]|0)+w}w=c[E>>2]|0;if((c[aa>>2]|0)>(c[Z>>2]|0))c[C>>2]=w;else c[J>>2]=w;c[D>>2]=(c[D>>2]|0)+1}c[aa>>2]=0;c[I>>2]=0;c[za>>2]=c[ma>>2];while(1){F=c[za>>2]|0;c[za>>2]=F+-1;if((F|0)<=(c[ba>>2]|0))break;c[K>>2]=(c[(c[G>>2]|0)+(c[za>>2]<<2)>>2]|0)+((_(c[J>>2]|0,c[(c[H>>2]|0)+(c[za>>2]<<2)>>2]|0)|0)>>6);do if(!(c[I>>2]|0?1:(c[K>>2]|0)>=(c[(c[Q>>2]|0)+(c[za>>2]<<2)>>2]|0)))if((c[K>>2]|0)>=(c[R>>2]|0)){c[K>>2]=c[R>>2];break}else{c[K>>2]=0;break}else c[I>>2]=1;while(0);if((c[K>>2]|0)<(c[(c[na>>2]|0)+(c[za>>2]<<2)>>2]|0))w=c[K>>2]|0;else w=c[(c[na>>2]|0)+(c[za>>2]<<2)>>2]|0;c[K>>2]=w;c[(c[ha>>2]|0)+(c[za>>2]<<2)>>2]=c[K>>2];c[aa>>2]=(c[aa>>2]|0)+(c[K>>2]|0)}c[ua>>2]=c[ma>>2];while(1){c[za>>2]=(c[ua>>2]|0)-1;if((c[za>>2]|0)<=(c[P>>2]|0)){V=29;break}c[ca>>2]=(c[Z>>2]|0)-(c[aa>>2]|0);c[$>>2]=ld(c[ca>>2]|0,(b[(c[(c[ea>>2]|0)+32>>2]|0)+(c[ua>>2]<<1)>>1]|0)-(b[(c[(c[ea>>2]|0)+32>>2]|0)+(c[ba>>2]<<1)>>1]|0)|0)|0;K=_((b[(c[(c[ea>>2]|0)+32>>2]|0)+(c[ua>>2]<<1)>>1]|0)-(b[(c[(c[ea>>2]|0)+32>>2]|0)+(c[ba>>2]<<1)>>1]|0)|0,c[$>>2]|0)|0;c[ca>>2]=(c[ca>>2]|0)-K;if(((c[ca>>2]|0)-((b[(c[(c[ea>>2]|0)+32>>2]|0)+(c[za>>2]<<1)>>1]|0)-(b[(c[(c[ea>>2]|0)+32>>2]|0)+(c[ba>>2]<<1)>>1]|0))|0)>0)w=(c[ca>>2]|0)-((b[(c[(c[ea>>2]|0)+32>>2]|0)+(c[za>>2]<<1)>>1]|0)-(b[(c[(c[ea>>2]|0)+32>>2]|0)+(c[ba>>2]<<1)>>1]|0))|0;else w=0;c[U>>2]=w;c[T>>2]=(b[(c[(c[ea>>2]|0)+32>>2]|0)+(c[ua>>2]<<1)>>1]|0)-(b[(c[(c[ea>>2]|0)+32>>2]|0)+(c[za>>2]<<1)>>1]|0);K=(c[(c[ha>>2]|0)+(c[za>>2]<<2)>>2]|0)+(_(c[$>>2]|0,c[T>>2]|0)|0)|0;c[S>>2]=K+(c[U>>2]|0);if((c[(c[Q>>2]|0)+(c[za>>2]<<2)>>2]|0)>((c[R>>2]|0)+8|0))w=c[(c[Q>>2]|0)+(c[za>>2]<<2)>>2]|0;else w=(c[R>>2]|0)+8|0;if((c[S>>2]|0)>=(w|0)){if(!(c[Y>>2]|0)){if(dc(c[X>>2]|0,1)|0)break}else{if((c[ua>>2]|0)<=((c[ba>>2]|0)+2|0)){V=40;break}K=_((c[za>>2]|0)<(c[N>>2]|0)?7:9,c[T>>2]|0)|0;if((c[S>>2]|0)>(K<<c[la>>2]<<3>>4|0)?(c[za>>2]|0)<=(c[O>>2]|0):0){V=40;break}pc(c[X>>2]|0,0,1)}c[aa>>2]=(c[aa>>2]|0)+8;c[S>>2]=(c[S>>2]|0)-8}c[aa>>2]=(c[aa>>2]|0)-((c[(c[ha>>2]|0)+(c[za>>2]<<2)>>2]|0)+(c[M>>2]|0));if((c[M>>2]|0)>0)c[M>>2]=d[26723+((c[za>>2]|0)-(c[ba>>2]|0))>>0];c[aa>>2]=(c[aa>>2]|0)+(c[M>>2]|0);if((c[S>>2]|0)>=(c[R>>2]|0)){c[aa>>2]=(c[aa>>2]|0)+(c[R>>2]|0);c[(c[ha>>2]|0)+(c[za>>2]<<2)>>2]=c[R>>2]}else c[(c[ha>>2]|0)+(c[za>>2]<<2)>>2]=0;c[ua>>2]=(c[ua>>2]|0)+-1}if((V|0)==29)c[Z>>2]=(c[Z>>2]|0)+(c[L>>2]|0);else if((V|0)==40)pc(c[X>>2]|0,1,1);do if((c[M>>2]|0)>0){if(!(c[Y>>2]|0)){V=c[ba>>2]|0;V=V+(fc(c[X>>2]|0,(c[ua>>2]|0)+1-(c[ba>>2]|0)|0)|0)|0;c[c[fa>>2]>>2]=V;break}if((c[c[fa>>2]>>2]|0)<(c[ua>>2]|0))w=c[c[fa>>2]>>2]|0;else w=c[ua>>2]|0;c[c[fa>>2]>>2]=w;rc(c[X>>2]|0,(c[c[fa>>2]>>2]|0)-(c[ba>>2]|0)|0,(c[ua>>2]|0)+1-(c[ba>>2]|0)|0)}else c[c[fa>>2]>>2]=0;while(0);if((c[c[fa>>2]>>2]|0)<=(c[ba>>2]|0)){c[Z>>2]=(c[Z>>2]|0)+(c[W>>2]|0);c[W>>2]=0}do if((c[W>>2]|0)>0){w=c[X>>2]|0;if(c[Y>>2]|0){pc(w,c[c[ga>>2]>>2]|0,1);break}else{Y=dc(w,1)|0;c[c[ga>>2]>>2]=Y;break}}else c[c[ga>>2]>>2]=0;while(0);c[ca>>2]=(c[Z>>2]|0)-(c[aa>>2]|0);c[$>>2]=ld(c[ca>>2]|0,(b[(c[(c[ea>>2]|0)+32>>2]|0)+(c[ua>>2]<<1)>>1]|0)-(b[(c[(c[ea>>2]|0)+32>>2]|0)+(c[ba>>2]<<1)>>1]|0)|0)|0;aa=_((b[(c[(c[ea>>2]|0)+32>>2]|0)+(c[ua>>2]<<1)>>1]|0)-(b[(c[(c[ea>>2]|0)+32>>2]|0)+(c[ba>>2]<<1)>>1]|0)|0,c[$>>2]|0)|0;c[ca>>2]=(c[ca>>2]|0)-aa;c[za>>2]=c[ba>>2];while(1){if((c[za>>2]|0)>=(c[ua>>2]|0))break;Z=_(c[$>>2]|0,(b[(c[(c[ea>>2]|0)+32>>2]|0)+((c[za>>2]|0)+1<<1)>>1]|0)-(b[(c[(c[ea>>2]|0)+32>>2]|0)+(c[za>>2]<<1)>>1]|0)|0)|0;aa=(c[ha>>2]|0)+(c[za>>2]<<2)|0;c[aa>>2]=(c[aa>>2]|0)+Z;c[za>>2]=(c[za>>2]|0)+1}c[za>>2]=c[ba>>2];while(1){if((c[za>>2]|0)>=(c[ua>>2]|0))break;if((c[ca>>2]|0)<((b[(c[(c[ea>>2]|0)+32>>2]|0)+((c[za>>2]|0)+1<<1)>>1]|0)-(b[(c[(c[ea>>2]|0)+32>>2]|0)+(c[za>>2]<<1)>>1]|0)|0))w=c[ca>>2]|0;else w=(b[(c[(c[ea>>2]|0)+32>>2]|0)+((c[za>>2]|0)+1<<1)>>1]|0)-(b[(c[(c[ea>>2]|0)+32>>2]|0)+(c[za>>2]<<1)>>1]|0)|0;c[da>>2]=w;aa=(c[ha>>2]|0)+(c[za>>2]<<2)|0;c[aa>>2]=(c[aa>>2]|0)+(c[da>>2]|0);c[ca>>2]=(c[ca>>2]|0)-(c[da>>2]|0);c[za>>2]=(c[za>>2]|0)+1}c[sa>>2]=0;c[za>>2]=c[ba>>2];while(1){if((c[za>>2]|0)>=(c[ua>>2]|0))break;c[qa>>2]=(b[(c[(c[ea>>2]|0)+32>>2]|0)+((c[za>>2]|0)+1<<1)>>1]|0)-(b[(c[(c[ea>>2]|0)+32>>2]|0)+(c[za>>2]<<1)>>1]|0);c[pa>>2]=c[qa>>2]<<c[la>>2];c[ta>>2]=(c[(c[ha>>2]|0)+(c[za>>2]<<2)>>2]|0)+(c[sa>>2]|0);w=c[ta>>2]|0;if((c[pa>>2]|0)>1){if((w-(c[(c[na>>2]|0)+(c[za>>2]<<2)>>2]|0)|0)>0)w=(c[ta>>2]|0)-(c[(c[na>>2]|0)+(c[za>>2]<<2)>>2]|0)|0;else w=0;c[wa>>2]=w;c[(c[ha>>2]|0)+(c[za>>2]<<2)>>2]=(c[ta>>2]|0)-(c[wa>>2]|0);w=_(c[ka>>2]|0,c[pa>>2]|0)|0;if((c[ka>>2]|0)==2&(c[pa>>2]|0)>2?!(c[c[ga>>2]>>2]|0):0)x=(c[za>>2]|0)<(c[c[fa>>2]>>2]|0);else x=0;c[va>>2]=w+(x?1:0);c[ra>>2]=_(c[va>>2]|0,(b[(c[(c[ea>>2]|0)+56>>2]|0)+(c[za>>2]<<1)>>1]|0)+(c[Aa>>2]|0)|0)|0;c[Ba>>2]=(c[ra>>2]>>1)-((c[va>>2]|0)*21|0);if((c[pa>>2]|0)==2)c[Ba>>2]=(c[Ba>>2]|0)+(c[va>>2]<<3>>2);if(((c[(c[ha>>2]|0)+(c[za>>2]<<2)>>2]|0)+(c[Ba>>2]|0)|0)>=(c[va>>2]<<1<<3|0)){if(((c[(c[ha>>2]|0)+(c[za>>2]<<2)>>2]|0)+(c[Ba>>2]|0)|0)<((c[va>>2]|0)*3<<3|0))c[Ba>>2]=(c[Ba>>2]|0)+(c[ra>>2]>>3)}else c[Ba>>2]=(c[Ba>>2]|0)+(c[ra>>2]>>2);if(0>((c[(c[ha>>2]|0)+(c[za>>2]<<2)>>2]|0)+(c[Ba>>2]|0)+(c[va>>2]<<2)|0))w=0;else w=(c[(c[ha>>2]|0)+(c[za>>2]<<2)>>2]|0)+(c[Ba>>2]|0)+(c[va>>2]<<2)|0;c[(c[ia>>2]|0)+(c[za>>2]<<2)>>2]=w;da=(ld(c[(c[ia>>2]|0)+(c[za>>2]<<2)>>2]|0,c[va>>2]|0)|0)>>>3;c[(c[ia>>2]|0)+(c[za>>2]<<2)>>2]=da;da=_(c[ka>>2]|0,c[(c[ia>>2]|0)+(c[za>>2]<<2)>>2]|0)|0;if((da|0)>(c[(c[ha>>2]|0)+(c[za>>2]<<2)>>2]>>3|0))c[(c[ia>>2]|0)+(c[za>>2]<<2)>>2]=c[(c[ha>>2]|0)+(c[za>>2]<<2)>>2]>>c[Ca>>2]>>3;if((c[(c[ia>>2]|0)+(c[za>>2]<<2)>>2]|0)<8)w=c[(c[ia>>2]|0)+(c[za>>2]<<2)>>2]|0;else w=8;c[(c[ia>>2]|0)+(c[za>>2]<<2)>>2]=w;ca=_(c[(c[ia>>2]|0)+(c[za>>2]<<2)>>2]|0,c[va>>2]<<3)|0;c[(c[ja>>2]|0)+(c[za>>2]<<2)>>2]=(ca|0)>=((c[(c[ha>>2]|0)+(c[za>>2]<<2)>>2]|0)+(c[Ba>>2]|0)|0)&1;ca=(_(c[ka>>2]|0,c[(c[ia>>2]|0)+(c[za>>2]<<2)>>2]|0)|0)<<3;da=(c[ha>>2]|0)+(c[za>>2]<<2)|0;c[da>>2]=(c[da>>2]|0)-ca}else{if(0>(w-(c[ka>>2]<<3)|0))w=0;else w=(c[ta>>2]|0)-(c[ka>>2]<<3)|0;c[wa>>2]=w;c[(c[ha>>2]|0)+(c[za>>2]<<2)>>2]=(c[ta>>2]|0)-(c[wa>>2]|0);c[(c[ia>>2]|0)+(c[za>>2]<<2)>>2]=0;c[(c[ja>>2]|0)+(c[za>>2]<<2)>>2]=1}if((c[wa>>2]|0)>0){if((c[wa>>2]>>(c[Ca>>2]|0)+3|0)<(8-(c[(c[ia>>2]|0)+(c[za>>2]<<2)>>2]|0)|0))w=c[wa>>2]>>(c[Ca>>2]|0)+3;else w=8-(c[(c[ia>>2]|0)+(c[za>>2]<<2)>>2]|0)|0;c[ya>>2]=w;da=(c[ia>>2]|0)+(c[za>>2]<<2)|0;c[da>>2]=(c[da>>2]|0)+(c[ya>>2]|0);c[xa>>2]=(_(c[ya>>2]|0,c[ka>>2]|0)|0)<<3;c[(c[ja>>2]|0)+(c[za>>2]<<2)>>2]=(c[xa>>2]|0)>=((c[wa>>2]|0)-(c[sa>>2]|0)|0)&1;c[wa>>2]=(c[wa>>2]|0)-(c[xa>>2]|0)}c[sa>>2]=c[wa>>2];c[za>>2]=(c[za>>2]|0)+1}c[c[oa>>2]>>2]=c[sa>>2];while(1){if((c[za>>2]|0)>=(c[ma>>2]|0))break;c[(c[ia>>2]|0)+(c[za>>2]<<2)>>2]=c[(c[ha>>2]|0)+(c[za>>2]<<2)>>2]>>c[Ca>>2]>>3;c[(c[ha>>2]|0)+(c[za>>2]<<2)>>2]=0;c[(c[ja>>2]|0)+(c[za>>2]<<2)>>2]=(c[(c[ia>>2]|0)+(c[za>>2]<<2)>>2]|0)<1&1;c[za>>2]=(c[za>>2]|0)+1}i=Da;return c[ua>>2]|0}function ld(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;f=i;i=i+16|0;e=f+4|0;d=f;c[e>>2]=a;c[d>>2]=b;i=f;return ((c[e>>2]|0)>>>0)/((c[d>>2]|0)>>>0)|0|0}function md(a,b,d,e,f,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;E=i;i=i+96|0;j=E+84|0;k=E+80|0;l=E+76|0;F=E+72|0;m=E+68|0;n=E+64|0;v=E+60|0;w=E+56|0;z=E+52|0;x=E+48|0;A=E+44|0;C=E+40|0;D=E+36|0;u=E+32|0;o=E+28|0;y=E+24|0;B=E+20|0;s=E+16|0;t=E+12|0;r=E+8|0;p=E+4|0;q=E;c[j>>2]=a;c[k>>2]=b;c[l>>2]=d;c[F>>2]=e;c[m>>2]=f;c[n>>2]=h;f=c[k>>2]|0;c[o>>2]=ia()|0;a=i;i=i+((1*(f<<2)|0)+15&-16)|0;f=i;i=i+((1*(c[k>>2]<<2)|0)+15&-16)|0;d=i;i=i+((1*(c[k>>2]<<2)|0)+15&-16)|0;nd(c[j>>2]|0,c[k>>2]|0,1,c[m>>2]|0,c[l>>2]|0,c[F>>2]|0);g[A>>2]=0.0;c[w>>2]=0;do{b=d+(c[w>>2]<<2)|0;if(+g[(c[j>>2]|0)+(c[w>>2]<<2)>>2]>0.0)g[b>>2]=1.0;else{g[b>>2]=-1.0;g[(c[j>>2]|0)+(c[w>>2]<<2)>>2]=-+g[(c[j>>2]|0)+(c[w>>2]<<2)>>2]}c[f+(c[w>>2]<<2)>>2]=0;g[a+(c[w>>2]<<2)>>2]=0.0;F=(c[w>>2]|0)+1|0;c[w>>2]=F}while((F|0)<(c[k>>2]|0));g[D>>2]=0.0;g[C>>2]=0.0;c[x>>2]=c[l>>2];if((c[l>>2]|0)>(c[k>>2]>>1|0)){c[w>>2]=0;do{g[A>>2]=+g[A>>2]+ +g[(c[j>>2]|0)+(c[w>>2]<<2)>>2];F=(c[w>>2]|0)+1|0;c[w>>2]=F}while((F|0)<(c[k>>2]|0));if(!(+g[A>>2]>1.0000000036274937e-15&+g[A>>2]<64.0)){g[c[j>>2]>>2]=1.0;c[w>>2]=1;do{g[(c[j>>2]|0)+(c[w>>2]<<2)>>2]=0.0;F=(c[w>>2]|0)+1|0;c[w>>2]=F}while((F|0)<(c[k>>2]|0));g[A>>2]=1.0}g[y>>2]=+((c[l>>2]|0)-1|0)*(1.0/+g[A>>2]);c[w>>2]=0;do{F=~~+M(+(+g[y>>2]*+g[(c[j>>2]|0)+(c[w>>2]<<2)>>2]));c[f+(c[w>>2]<<2)>>2]=F;g[a+(c[w>>2]<<2)>>2]=+(c[f+(c[w>>2]<<2)>>2]|0);g[D>>2]=+g[D>>2]+ +g[a+(c[w>>2]<<2)>>2]*+g[a+(c[w>>2]<<2)>>2];g[C>>2]=+g[C>>2]+ +g[(c[j>>2]|0)+(c[w>>2]<<2)>>2]*+g[a+(c[w>>2]<<2)>>2];F=a+(c[w>>2]<<2)|0;g[F>>2]=+g[F>>2]*2.0;c[x>>2]=(c[x>>2]|0)-(c[f+(c[w>>2]<<2)>>2]|0);F=(c[w>>2]|0)+1|0;c[w>>2]=F}while((F|0)<(c[k>>2]|0))}if((c[x>>2]|0)>((c[k>>2]|0)+3|0)){g[B>>2]=+(c[x>>2]|0);g[D>>2]=+g[D>>2]+ +g[B>>2]*+g[B>>2];g[D>>2]=+g[D>>2]+ +g[B>>2]*+g[a>>2];c[f>>2]=(c[f>>2]|0)+(c[x>>2]|0);c[x>>2]=0}g[z>>2]=1.0;c[v>>2]=0;while(1){if((c[v>>2]|0)>=(c[x>>2]|0))break;g[t>>2]=-999999986991104.0;g[r>>2]=0.0;c[s>>2]=0;g[D>>2]=+g[D>>2]+1.0;c[w>>2]=0;do{g[p>>2]=+g[C>>2]+ +g[(c[j>>2]|0)+(c[w>>2]<<2)>>2];g[q>>2]=+g[D>>2]+ +g[a+(c[w>>2]<<2)>>2];g[p>>2]=+g[p>>2]*+g[p>>2];if(+g[r>>2]*+g[p>>2]>+g[q>>2]*+g[t>>2]){g[r>>2]=+g[q>>2];g[t>>2]=+g[p>>2];c[s>>2]=c[w>>2]}F=(c[w>>2]|0)+1|0;c[w>>2]=F}while((F|0)<(c[k>>2]|0));g[C>>2]=+g[C>>2]+ +g[(c[j>>2]|0)+(c[s>>2]<<2)>>2];g[D>>2]=+g[D>>2]+ +g[a+(c[s>>2]<<2)>>2];F=a+(c[s>>2]<<2)|0;g[F>>2]=+g[F>>2]+ +g[z>>2]*2.0;F=f+(c[s>>2]<<2)|0;c[F>>2]=(c[F>>2]|0)+1;c[v>>2]=(c[v>>2]|0)+1}c[w>>2]=0;do{g[(c[j>>2]|0)+(c[w>>2]<<2)>>2]=+g[d+(c[w>>2]<<2)>>2]*+g[(c[j>>2]|0)+(c[w>>2]<<2)>>2];if(+g[d+(c[w>>2]<<2)>>2]<0.0)c[f+(c[w>>2]<<2)>>2]=0-(c[f+(c[w>>2]<<2)>>2]|0);F=(c[w>>2]|0)+1|0;c[w>>2]=F}while((F|0)<(c[k>>2]|0));Tb(f,c[k>>2]|0,c[l>>2]|0,c[n>>2]|0);c[u>>2]=qd(f,c[k>>2]|0,c[m>>2]|0)|0;F=c[u>>2]|0;na(c[o>>2]|0);i=E;return F|0}function nd(a,b,d,e,f,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;w=i;i=i+64|0;j=w+48|0;k=w+44|0;l=w+40|0;m=w+36|0;n=w+32|0;o=w+28|0;s=w+24|0;p=w+20|0;t=w+16|0;r=w+12|0;v=w+8|0;u=w+4|0;q=w;c[j>>2]=a;c[k>>2]=b;c[l>>2]=d;c[m>>2]=e;c[n>>2]=f;c[o>>2]=h;c[u>>2]=0;if((c[o>>2]|0)==0?1:(c[n>>2]<<1|0)>=(c[k>>2]|0)){i=w;return}c[q>>2]=c[17596+((c[o>>2]|0)-1<<2)>>2];g[r>>2]=+(c[k>>2]|0)*1.0/+((c[k>>2]|0)+(_(c[q>>2]|0,c[n>>2]|0)|0)|0);g[v>>2]=+g[r>>2]*+g[r>>2]*.5;g[p>>2]=+Q(+(+g[v>>2]*1.5707963705062866));g[t>>2]=+Q(+((1.0-+g[v>>2])*1.5707963705062866));a:do if((c[k>>2]|0)>=(c[m>>2]<<3|0)){c[u>>2]=1;while(1){v=_(c[u>>2]|0,c[u>>2]|0)|0;v=_(v+(c[u>>2]|0)|0,c[m>>2]|0)|0;if((v+(c[m>>2]>>2)|0)>=(c[k>>2]|0))break a;c[u>>2]=(c[u>>2]|0)+1}}while(0);c[k>>2]=od(c[k>>2]|0,c[m>>2]|0)|0;c[s>>2]=0;while(1){if((c[s>>2]|0)>=(c[m>>2]|0))break;if((c[l>>2]|0)>=0){v=(c[j>>2]|0)+((_(c[s>>2]|0,c[k>>2]|0)|0)<<2)|0;pd(v,c[k>>2]|0,1,+g[p>>2],-+g[t>>2]);if(c[u>>2]|0){v=(c[j>>2]|0)+((_(c[s>>2]|0,c[k>>2]|0)|0)<<2)|0;pd(v,c[k>>2]|0,c[u>>2]|0,+g[t>>2],-+g[p>>2])}}else{if(c[u>>2]|0){v=(c[j>>2]|0)+((_(c[s>>2]|0,c[k>>2]|0)|0)<<2)|0;pd(v,c[k>>2]|0,c[u>>2]|0,+g[t>>2],+g[p>>2])}v=(c[j>>2]|0)+((_(c[s>>2]|0,c[k>>2]|0)|0)<<2)|0;pd(v,c[k>>2]|0,1,+g[p>>2],+g[t>>2])}c[s>>2]=(c[s>>2]|0)+1}i=w;return}function od(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;f=i;i=i+16|0;e=f+4|0;d=f;c[e>>2]=a;c[d>>2]=b;i=f;return ((c[e>>2]|0)>>>0)/((c[d>>2]|0)>>>0)|0|0}function pd(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=+e;f=+f;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;u=i;i=i+48|0;h=u+44|0;j=u+40|0;k=u+36|0;l=u+32|0;m=u+28|0;o=u+24|0;p=u+20|0;n=u+16|0;q=u+12|0;s=u+8|0;r=u+4|0;t=u;c[h>>2]=a;c[j>>2]=b;c[k>>2]=d;g[l>>2]=e;g[m>>2]=f;c[n>>2]=c[h>>2];g[p>>2]=-+g[m>>2];c[o>>2]=0;while(1){if((c[o>>2]|0)>=((c[j>>2]|0)-(c[k>>2]|0)|0))break;g[q>>2]=+g[c[n>>2]>>2];g[s>>2]=+g[(c[n>>2]|0)+(c[k>>2]<<2)>>2];g[(c[n>>2]|0)+(c[k>>2]<<2)>>2]=+g[l>>2]*+g[s>>2]+ +g[m>>2]*+g[q>>2];f=+g[l>>2]*+g[q>>2]+ +g[p>>2]*+g[s>>2];d=c[n>>2]|0;c[n>>2]=d+4;g[d>>2]=f;c[o>>2]=(c[o>>2]|0)+1}c[n>>2]=(c[h>>2]|0)+((c[j>>2]|0)-(c[k>>2]<<1)-1<<2);c[o>>2]=(c[j>>2]|0)-(c[k>>2]<<1)-1;while(1){if((c[o>>2]|0)<0)break;g[r>>2]=+g[c[n>>2]>>2];g[t>>2]=+g[(c[n>>2]|0)+(c[k>>2]<<2)>>2];g[(c[n>>2]|0)+(c[k>>2]<<2)>>2]=+g[l>>2]*+g[t>>2]+ +g[m>>2]*+g[r>>2];f=+g[l>>2]*+g[r>>2]+ +g[p>>2]*+g[t>>2];s=c[n>>2]|0;c[n>>2]=s+-4;g[s>>2]=f;c[o>>2]=(c[o>>2]|0)+-1}i=u;return}function qd(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;o=i;i=i+48|0;e=o+32|0;f=o+28|0;g=o+24|0;h=o+20|0;k=o+16|0;j=o+12|0;l=o+8|0;m=o+4|0;n=o;c[f>>2]=a;c[g>>2]=b;c[h>>2]=d;if((c[h>>2]|0)<=1){c[e>>2]=1;n=c[e>>2]|0;i=o;return n|0}c[j>>2]=od(c[g>>2]|0,c[h>>2]|0)|0;c[k>>2]=0;c[l>>2]=0;do{c[n>>2]=0;c[m>>2]=0;do{a=_(c[l>>2]|0,c[j>>2]|0)|0;c[n>>2]=c[n>>2]|c[(c[f>>2]|0)+(a+(c[m>>2]|0)<<2)>>2];a=(c[m>>2]|0)+1|0;c[m>>2]=a}while((a|0)<(c[j>>2]|0));c[k>>2]=c[k>>2]|((c[n>>2]|0)!=0&1)<<c[l>>2];a=(c[l>>2]|0)+1|0;c[l>>2]=a}while((a|0)<(c[h>>2]|0));c[e>>2]=c[k>>2];n=c[e>>2]|0;i=o;return n|0}function rd(a,b,d,e,f,h,j){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;j=+j;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;k=i;i=i+48|0;r=k+36|0;o=k+32|0;q=k+28|0;p=k+24|0;n=k+20|0;u=k+16|0;s=k+12|0;t=k+8|0;m=k+4|0;l=k;c[r>>2]=a;c[o>>2]=b;c[q>>2]=d;c[p>>2]=e;c[n>>2]=f;c[u>>2]=h;g[s>>2]=j;h=c[o>>2]|0;c[l>>2]=ia()|0;e=i;i=i+((1*(h<<2)|0)+15&-16)|0;g[t>>2]=+Vb(e,c[o>>2]|0,c[q>>2]|0,c[u>>2]|0);sd(e,c[r>>2]|0,c[o>>2]|0,+g[t>>2],+g[s>>2]);nd(c[r>>2]|0,c[o>>2]|0,-1,c[n>>2]|0,c[q>>2]|0,c[p>>2]|0);c[m>>2]=qd(e,c[o>>2]|0,c[n>>2]|0)|0;e=c[m>>2]|0;na(c[l>>2]|0);i=k;return e|0}function sd(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=+e;f=+f;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;n=i;i=i+32|0;h=n+28|0;j=n+24|0;k=n+20|0;q=n+16|0;o=n+12|0;m=n+8|0;p=n+4|0;l=n;c[h>>2]=a;c[j>>2]=b;c[k>>2]=d;g[q>>2]=e;g[o>>2]=f;g[p>>2]=+g[q>>2];f=1.0/+O(+(+g[p>>2]));g[l>>2]=f*+g[o>>2];c[m>>2]=0;do{g[(c[j>>2]|0)+(c[m>>2]<<2)>>2]=+g[l>>2]*+(c[(c[h>>2]|0)+(c[m>>2]<<2)>>2]|0);q=(c[m>>2]|0)+1|0;c[m>>2]=q}while((q|0)<(c[k>>2]|0));i=n;return}function td(a,b,d,e){a=a|0;b=b|0;d=+d;e=e|0;var f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;l=i;i=i+48|0;m=l+32|0;f=l+28|0;n=l+24|0;j=l+16|0;p=l+12|0;h=l+8|0;o=l+4|0;k=l;c[m>>2]=a;c[f>>2]=b;g[n>>2]=d;c[l+20>>2]=e;g[p>>2]=+ud(c[m>>2]|0,c[m>>2]|0,c[f>>2]|0)+1.0000000036274937e-15;g[o>>2]=+g[p>>2];d=1.0/+O(+(+g[o>>2]));g[h>>2]=d*+g[n>>2];c[k>>2]=c[m>>2];c[j>>2]=0;while(1){if((c[j>>2]|0)>=(c[f>>2]|0))break;g[c[k>>2]>>2]=+g[h>>2]*+g[c[k>>2]>>2];c[k>>2]=(c[k>>2]|0)+4;c[j>>2]=(c[j>>2]|0)+1}i=l;return}function ud(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0,h=0,j=0,k=0,l=0,m=0;m=i;i=i+32|0;f=m+16|0;h=m+12|0;j=m+8|0;k=m+4|0;l=m;c[f>>2]=a;c[h>>2]=b;c[j>>2]=d;g[l>>2]=0.0;c[k>>2]=0;while(1){e=+g[l>>2];if((c[k>>2]|0)>=(c[j>>2]|0))break;g[l>>2]=e+ +g[(c[f>>2]|0)+(c[k>>2]<<2)>>2]*+g[(c[h>>2]|0)+(c[k>>2]<<2)>>2];c[k>>2]=(c[k>>2]|0)+1}i=m;return +e}function vd(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0.0;t=i;i=i+64|0;h=t+48|0;j=t+44|0;u=t+40|0;k=t+36|0;n=t+28|0;o=t+24|0;q=t+20|0;s=t+16|0;l=t+12|0;m=t+8|0;p=t+4|0;r=t;c[h>>2]=a;c[j>>2]=b;c[u>>2]=d;c[k>>2]=e;c[t+32>>2]=f;g[m>>2]=1.0000000036274937e-15;g[l>>2]=1.0000000036274937e-15;a:do if(c[u>>2]|0){c[n>>2]=0;while(1){if((c[n>>2]|0)>=(c[k>>2]|0))break a;g[p>>2]=+g[(c[h>>2]|0)+(c[n>>2]<<2)>>2]+ +g[(c[j>>2]|0)+(c[n>>2]<<2)>>2];g[r>>2]=+g[(c[h>>2]|0)+(c[n>>2]<<2)>>2]-+g[(c[j>>2]|0)+(c[n>>2]<<2)>>2];g[l>>2]=+g[l>>2]+ +g[p>>2]*+g[p>>2];g[m>>2]=+g[m>>2]+ +g[r>>2]*+g[r>>2];c[n>>2]=(c[n>>2]|0)+1}}else{v=+ud(c[h>>2]|0,c[h>>2]|0,c[k>>2]|0);g[l>>2]=+g[l>>2]+v;v=+ud(c[j>>2]|0,c[j>>2]|0,c[k>>2]|0);g[m>>2]=+g[m>>2]+v}while(0);g[q>>2]=+O(+(+g[l>>2]));g[s>>2]=+O(+(+g[m>>2]));c[o>>2]=~~+M(+(+W(+(+g[s>>2]),+(+g[q>>2]))*10430.3818359375+.5));i=t;return c[o>>2]|0}function wd(a){a=a|0;var d=0,e=0,f=0,g=0,h=0;h=i;i=i+16|0;d=h+12|0;g=h+8|0;f=h+4|0;e=h;c[d>>2]=a;c[f>>2]=32767/((c[(c[d>>2]|0)+2340>>2]|0)+1|0)|0;c[e>>2]=0;c[g>>2]=0;while(1){if((c[g>>2]|0)>=(c[(c[d>>2]|0)+2340>>2]|0))break;c[e>>2]=(c[e>>2]|0)+(c[f>>2]|0);b[(c[d>>2]|0)+2772+1280+(c[g>>2]<<1)>>1]=c[e>>2];c[g>>2]=(c[g>>2]|0)+1}c[(c[d>>2]|0)+2772+1376>>2]=0;c[(c[d>>2]|0)+2772+1380>>2]=3176576;i=h;return} |
| | | function cg(a,d,e){a=a|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;t=i;i=i+48|0;f=t+40|0;g=t+36|0;h=t+32|0;m=t+28|0;j=t+24|0;n=t+20|0;o=t+16|0;k=t+44|0;l=t+12|0;r=t+8|0;q=t+4|0;p=t;c[f>>2]=a;c[g>>2]=d;c[h>>2]=e;c[j>>2]=0;c[o>>2]=0;while(1){if((c[o>>2]|0)>=20)break;c[r>>2]=(b[c[f>>2]>>1]|0)-(b[c[g>>2]>>1]|0);c[j>>2]=0;c[m>>2]=1;while(1){if((c[m>>2]|0)>((c[h>>2]|0)-1|0))break;c[l>>2]=(b[(c[f>>2]|0)+(c[m>>2]<<1)>>1]|0)-((b[(c[f>>2]|0)+((c[m>>2]|0)-1<<1)>>1]|0)+(b[(c[g>>2]|0)+(c[m>>2]<<1)>>1]|0));if((c[l>>2]|0)<(c[r>>2]|0)){c[r>>2]=c[l>>2];c[j>>2]=c[m>>2]}c[m>>2]=(c[m>>2]|0)+1}c[l>>2]=32768-((b[(c[f>>2]|0)+((c[h>>2]|0)-1<<1)>>1]|0)+(b[(c[g>>2]|0)+(c[h>>2]<<1)>>1]|0));if((c[l>>2]|0)<(c[r>>2]|0)){c[r>>2]=c[l>>2];c[j>>2]=c[h>>2]}if((c[r>>2]|0)>=0){s=41;break}do if(!(c[j>>2]|0))b[c[f>>2]>>1]=b[c[g>>2]>>1]|0;else{if((c[j>>2]|0)==(c[h>>2]|0)){b[(c[f>>2]|0)+((c[h>>2]|0)-1<<1)>>1]=32768-(b[(c[g>>2]|0)+(c[h>>2]<<1)>>1]|0);break}c[q>>2]=0;c[n>>2]=0;while(1){if((c[n>>2]|0)>=(c[j>>2]|0))break;c[q>>2]=(c[q>>2]|0)+(b[(c[g>>2]|0)+(c[n>>2]<<1)>>1]|0);c[n>>2]=(c[n>>2]|0)+1}c[q>>2]=(c[q>>2]|0)+(b[(c[g>>2]|0)+(c[j>>2]<<1)>>1]>>1);c[p>>2]=32768;c[n>>2]=c[h>>2];while(1){if((c[n>>2]|0)<=(c[j>>2]|0))break;c[p>>2]=(c[p>>2]|0)-(b[(c[g>>2]|0)+(c[n>>2]<<1)>>1]|0);c[n>>2]=(c[n>>2]|0)+-1}c[p>>2]=(c[p>>2]|0)-(b[(c[g>>2]|0)+(c[j>>2]<<1)>>1]>>1);e=((b[(c[f>>2]|0)+((c[j>>2]|0)-1<<1)>>1]|0)+(b[(c[f>>2]|0)+(c[j>>2]<<1)>>1]|0)>>1)+((b[(c[f>>2]|0)+((c[j>>2]|0)-1<<1)>>1]|0)+(b[(c[f>>2]|0)+(c[j>>2]<<1)>>1]|0)&1)|0;do if((c[q>>2]|0)>(c[p>>2]|0)){if((e|0)>(c[q>>2]|0)){e=c[q>>2]|0;break}if((((b[(c[f>>2]|0)+((c[j>>2]|0)-1<<1)>>1]|0)+(b[(c[f>>2]|0)+(c[j>>2]<<1)>>1]|0)>>1)+((b[(c[f>>2]|0)+((c[j>>2]|0)-1<<1)>>1]|0)+(b[(c[f>>2]|0)+(c[j>>2]<<1)>>1]|0)&1)|0)<(c[p>>2]|0)){e=c[p>>2]|0;break}else{e=((b[(c[f>>2]|0)+((c[j>>2]|0)-1<<1)>>1]|0)+(b[(c[f>>2]|0)+(c[j>>2]<<1)>>1]|0)>>1)+((b[(c[f>>2]|0)+((c[j>>2]|0)-1<<1)>>1]|0)+(b[(c[f>>2]|0)+(c[j>>2]<<1)>>1]|0)&1)|0;break}}else{if((e|0)>(c[p>>2]|0)){e=c[p>>2]|0;break}if((((b[(c[f>>2]|0)+((c[j>>2]|0)-1<<1)>>1]|0)+(b[(c[f>>2]|0)+(c[j>>2]<<1)>>1]|0)>>1)+((b[(c[f>>2]|0)+((c[j>>2]|0)-1<<1)>>1]|0)+(b[(c[f>>2]|0)+(c[j>>2]<<1)>>1]|0)&1)|0)<(c[q>>2]|0)){e=c[q>>2]|0;break}else{e=((b[(c[f>>2]|0)+((c[j>>2]|0)-1<<1)>>1]|0)+(b[(c[f>>2]|0)+(c[j>>2]<<1)>>1]|0)>>1)+((b[(c[f>>2]|0)+((c[j>>2]|0)-1<<1)>>1]|0)+(b[(c[f>>2]|0)+(c[j>>2]<<1)>>1]|0)&1)|0;break}}while(0);b[k>>1]=e;b[(c[f>>2]|0)+((c[j>>2]|0)-1<<1)>>1]=(b[k>>1]|0)-(b[(c[g>>2]|0)+(c[j>>2]<<1)>>1]>>1);b[(c[f>>2]|0)+(c[j>>2]<<1)>>1]=(b[(c[f>>2]|0)+((c[j>>2]|0)-1<<1)>>1]|0)+(b[(c[g>>2]|0)+(c[j>>2]<<1)>>1]|0)}while(0);c[o>>2]=(c[o>>2]|0)+1}if((s|0)==41){i=t;return}if((c[o>>2]|0)!=20){i=t;return}vg(c[f>>2]|0,c[h>>2]|0);s=(dg(b[c[f>>2]>>1]|0,b[c[g>>2]>>1]|0)|0)&65535;b[c[f>>2]>>1]=s;c[m>>2]=1;while(1){if((c[m>>2]|0)>=(c[h>>2]|0))break;s=(dg(b[(c[f>>2]|0)+(c[m>>2]<<1)>>1]|0,(b[(c[f>>2]|0)+((c[m>>2]|0)-1<<1)>>1]|0)+(b[(c[g>>2]|0)+(c[m>>2]<<1)>>1]|0)|0)|0)&65535;b[(c[f>>2]|0)+(c[m>>2]<<1)>>1]=s;c[m>>2]=(c[m>>2]|0)+1}s=(eg(b[(c[f>>2]|0)+((c[h>>2]|0)-1<<1)>>1]|0,32768-(b[(c[g>>2]|0)+(c[h>>2]<<1)>>1]|0)|0)|0)&65535;b[(c[f>>2]|0)+((c[h>>2]|0)-1<<1)>>1]=s;c[m>>2]=(c[h>>2]|0)-2;while(1){if((c[m>>2]|0)<0)break;s=(eg(b[(c[f>>2]|0)+(c[m>>2]<<1)>>1]|0,(b[(c[f>>2]|0)+((c[m>>2]|0)+1<<1)>>1]|0)-(b[(c[g>>2]|0)+((c[m>>2]|0)+1<<1)>>1]|0)|0)|0)&65535;b[(c[f>>2]|0)+(c[m>>2]<<1)>>1]=s;c[m>>2]=(c[m>>2]|0)+-1}i=t;return}function dg(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;f=i;i=i+16|0;e=f+4|0;d=f;c[e>>2]=a;c[d>>2]=b;i=f;return ((c[e>>2]|0)>(c[d>>2]|0)?c[e>>2]|0:c[d>>2]|0)|0}function eg(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;f=i;i=i+16|0;e=f+4|0;d=f;c[e>>2]=a;c[d>>2]=b;i=f;return ((c[e>>2]|0)<(c[d>>2]|0)?c[e>>2]|0:c[d>>2]|0)|0}function fg(a,d,e){a=a|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0;m=i;i=i+32|0;f=m+20|0;g=m+16|0;h=m+12|0;j=m+8|0;k=m+4|0;l=m;c[f>>2]=a;c[g>>2]=d;c[h>>2]=e;c[k>>2]=gg(b[c[g>>2]>>1]|0,1)|0;c[k>>2]=131072/(c[k>>2]|0)|0;c[l>>2]=gg((b[(c[g>>2]|0)+2>>1]|0)-(b[c[g>>2]>>1]|0)|0,1)|0;c[l>>2]=131072/(c[l>>2]|0)|0;d=(hg((c[k>>2]|0)+(c[l>>2]|0)|0,32767)|0)&65535;b[c[f>>2]>>1]=d;c[j>>2]=1;while(1){if((c[j>>2]|0)>=((c[h>>2]|0)-1|0))break;c[k>>2]=gg((b[(c[g>>2]|0)+((c[j>>2]|0)+1<<1)>>1]|0)-(b[(c[g>>2]|0)+(c[j>>2]<<1)>>1]|0)|0,1)|0;c[k>>2]=131072/(c[k>>2]|0)|0;d=(hg((c[k>>2]|0)+(c[l>>2]|0)|0,32767)|0)&65535;b[(c[f>>2]|0)+(c[j>>2]<<1)>>1]=d;c[l>>2]=gg((b[(c[g>>2]|0)+((c[j>>2]|0)+2<<1)>>1]|0)-(b[(c[g>>2]|0)+((c[j>>2]|0)+1<<1)>>1]|0)|0,1)|0;c[l>>2]=131072/(c[l>>2]|0)|0;d=(hg((c[k>>2]|0)+(c[l>>2]|0)|0,32767)|0)&65535;b[(c[f>>2]|0)+((c[j>>2]|0)+1<<1)>>1]=d;c[j>>2]=(c[j>>2]|0)+2}c[k>>2]=gg(32768-(b[(c[g>>2]|0)+((c[h>>2]|0)-1<<1)>>1]|0)|0,1)|0;c[k>>2]=131072/(c[k>>2]|0)|0;l=(hg((c[k>>2]|0)+(c[l>>2]|0)|0,32767)|0)&65535;b[(c[f>>2]|0)+((c[h>>2]|0)-1<<1)>>1]=l;i=m;return}function gg(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;f=i;i=i+16|0;e=f+4|0;d=f;c[e>>2]=a;c[d>>2]=b;i=f;return ((c[e>>2]|0)>(c[d>>2]|0)?c[e>>2]|0:c[d>>2]|0)|0}function hg(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;f=i;i=i+16|0;e=f+4|0;d=f;c[e>>2]=a;c[d>>2]=b;i=f;return ((c[e>>2]|0)<(c[d>>2]|0)?c[e>>2]|0:c[d>>2]|0)|0}function ig(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0;m=i;i=i+32|0;g=m+20|0;h=m+16|0;j=m+12|0;k=m+8|0;n=m+4|0;l=m;c[h>>2]=b;c[j>>2]=d;c[k>>2]=e;c[n>>2]=f;oj(c[h>>2]|0,0,300)|0;d=(c[j>>2]|0)!=8e3&(c[j>>2]|0)!=12e3&(c[j>>2]|0)!=16e3;do if(c[n>>2]|0){if(!(d&(c[j>>2]|0)!=24e3&(c[j>>2]|0)!=48e3)?!((c[k>>2]|0)!=8e3&(c[k>>2]|0)!=12e3&(c[k>>2]|0)!=16e3):0){c[(c[h>>2]|0)+292>>2]=a[30493+((((c[j>>2]>>12)-((c[j>>2]|0)>16e3&1)>>((c[j>>2]|0)>24e3&1))-1|0)*3|0)+(((c[k>>2]>>12)-((c[k>>2]|0)>16e3&1)>>((c[k>>2]|0)>24e3&1))-1)>>0];break}c[g>>2]=-1;n=c[g>>2]|0;i=m;return n|0}else{if(!d?!((c[k>>2]|0)!=8e3&(c[k>>2]|0)!=12e3&(c[k>>2]|0)!=16e3&(c[k>>2]|0)!=24e3&(c[k>>2]|0)!=48e3):0){c[(c[h>>2]|0)+292>>2]=a[30508+((((c[j>>2]>>12)-((c[j>>2]|0)>16e3&1)>>((c[j>>2]|0)>24e3&1))-1|0)*5|0)+(((c[k>>2]>>12)-((c[k>>2]|0)>16e3&1)>>((c[k>>2]|0)>24e3&1))-1)>>0];break}c[g>>2]=-1;n=c[g>>2]|0;i=m;return n|0}while(0);c[(c[h>>2]|0)+284>>2]=(c[j>>2]|0)/1e3|0;c[(c[h>>2]|0)+288>>2]=(c[k>>2]|0)/1e3|0;c[(c[h>>2]|0)+268>>2]=(c[(c[h>>2]|0)+284>>2]|0)*10;c[l>>2]=0;e=c[k>>2]|0;b=c[j>>2]|0;do if((c[k>>2]|0)>(c[j>>2]|0)){d=(c[h>>2]|0)+264|0;if((e|0)==(b<<1|0)){c[d>>2]=1;break}else{c[d>>2]=2;c[l>>2]=1;break}}else{d=(c[h>>2]|0)+264|0;if((e|0)>=(b|0)){c[d>>2]=0;break}c[d>>2]=3;if((c[k>>2]<<2|0)==((c[j>>2]|0)*3|0)){c[(c[h>>2]|0)+280>>2]=3;c[(c[h>>2]|0)+276>>2]=18;c[(c[h>>2]|0)+296>>2]=24846;break}if(((c[k>>2]|0)*3|0)==(c[j>>2]<<1|0)){c[(c[h>>2]|0)+280>>2]=2;c[(c[h>>2]|0)+276>>2]=18;c[(c[h>>2]|0)+296>>2]=24904;break}if((c[k>>2]<<1|0)==(c[j>>2]|0)){c[(c[h>>2]|0)+280>>2]=1;c[(c[h>>2]|0)+276>>2]=24;c[(c[h>>2]|0)+296>>2]=24944;break}if(((c[k>>2]|0)*3|0)==(c[j>>2]|0)){c[(c[h>>2]|0)+280>>2]=1;c[(c[h>>2]|0)+276>>2]=36;c[(c[h>>2]|0)+296>>2]=24972;break}if((c[k>>2]<<2|0)==(c[j>>2]|0)){c[(c[h>>2]|0)+280>>2]=1;c[(c[h>>2]|0)+276>>2]=36;c[(c[h>>2]|0)+296>>2]=25012;break}if(((c[k>>2]|0)*6|0)==(c[j>>2]|0)){c[(c[h>>2]|0)+280>>2]=1;c[(c[h>>2]|0)+276>>2]=36;c[(c[h>>2]|0)+296>>2]=25052;break}c[g>>2]=-1;n=c[g>>2]|0;i=m;return n|0}while(0);c[(c[h>>2]|0)+272>>2]=((c[j>>2]<<14+(c[l>>2]|0)|0)/(c[k>>2]|0)|0)<<2;while(1){n=_(c[(c[h>>2]|0)+272>>2]>>16,(c[k>>2]&65535)<<16>>16)|0;n=n+((_(c[(c[h>>2]|0)+272>>2]&65535,(c[k>>2]&65535)<<16>>16)|0)>>16)|0;n=n+(_(c[(c[h>>2]|0)+272>>2]|0,(c[k>>2]>>15)+1>>1)|0)|0;if((n|0)>=(c[j>>2]<<c[l>>2]|0))break;n=(c[h>>2]|0)+272|0;c[n>>2]=(c[n>>2]|0)+1}c[g>>2]=0;n=c[g>>2]|0;i=m;return n|0}function jg(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0;l=i;i=i+32|0;f=l+16|0;g=l+12|0;h=l+8|0;j=l+4|0;k=l;c[f>>2]=a;c[g>>2]=b;c[h>>2]=d;c[j>>2]=e;c[k>>2]=(c[(c[f>>2]|0)+284>>2]|0)-(c[(c[f>>2]|0)+292>>2]|0);pj((c[f>>2]|0)+168+(c[(c[f>>2]|0)+292>>2]<<1)|0,c[h>>2]|0,c[k>>2]<<1|0)|0;switch(c[(c[f>>2]|0)+264>>2]|0){case 1:{sg(c[f>>2]|0,c[g>>2]|0,(c[f>>2]|0)+168|0,c[(c[f>>2]|0)+284>>2]|0);sg(c[f>>2]|0,(c[g>>2]|0)+(c[(c[f>>2]|0)+288>>2]<<1)|0,(c[h>>2]|0)+(c[k>>2]<<1)|0,(c[j>>2]|0)-(c[(c[f>>2]|0)+284>>2]|0)|0);break}case 2:{pg(c[f>>2]|0,c[g>>2]|0,(c[f>>2]|0)+168|0,c[(c[f>>2]|0)+284>>2]|0);pg(c[f>>2]|0,(c[g>>2]|0)+(c[(c[f>>2]|0)+288>>2]<<1)|0,(c[h>>2]|0)+(c[k>>2]<<1)|0,(c[j>>2]|0)-(c[(c[f>>2]|0)+284>>2]|0)|0);break}case 3:{ng(c[f>>2]|0,c[g>>2]|0,(c[f>>2]|0)+168|0,c[(c[f>>2]|0)+284>>2]|0);ng(c[f>>2]|0,(c[g>>2]|0)+(c[(c[f>>2]|0)+288>>2]<<1)|0,(c[h>>2]|0)+(c[k>>2]<<1)|0,(c[j>>2]|0)-(c[(c[f>>2]|0)+284>>2]|0)|0);break}default:{pj(c[g>>2]|0,(c[f>>2]|0)+168|0,c[(c[f>>2]|0)+284>>2]<<1|0)|0;pj((c[g>>2]|0)+(c[(c[f>>2]|0)+288>>2]<<1)|0,(c[h>>2]|0)+(c[k>>2]<<1)|0,(c[j>>2]|0)-(c[(c[f>>2]|0)+284>>2]|0)<<1|0)|0}}pj((c[f>>2]|0)+168|0,(c[h>>2]|0)+((c[j>>2]|0)-(c[(c[f>>2]|0)+292>>2]|0)<<1)|0,c[(c[f>>2]|0)+292>>2]<<1|0)|0;i=l;return 0}function kg(a,d,e,f){a=a|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;q=i;i=i+1968|0;g=q+1964|0;h=q+1960|0;j=q+1956|0;k=q+1952|0;o=q+1948|0;n=q+1944|0;p=q+1940|0;m=q+1936|0;l=q;c[g>>2]=a;c[h>>2]=d;c[j>>2]=e;c[k>>2]=f;d=c[g>>2]|0;c[l>>2]=c[d>>2];c[l+4>>2]=c[d+4>>2];c[l+8>>2]=c[d+8>>2];c[l+12>>2]=c[d+12>>2];while(1){c[o>>2]=(c[k>>2]|0)<480?c[k>>2]|0:480;mg((c[g>>2]|0)+16|0,l+16|0,c[j>>2]|0,25092,c[o>>2]|0);c[m>>2]=l;c[n>>2]=c[o>>2];while(1){if((c[n>>2]|0)<=2)break;d=_(c[c[m>>2]>>2]>>16,b[12548]|0)|0;c[p>>2]=d+((_(c[c[m>>2]>>2]&65535,b[12548]|0)|0)>>16);d=_(c[(c[m>>2]|0)+4>>2]>>16,b[12549]|0)|0;c[p>>2]=(c[p>>2]|0)+(d+((_(c[(c[m>>2]|0)+4>>2]&65535,b[12549]|0)|0)>>16));d=_(c[(c[m>>2]|0)+8>>2]>>16,b[12551]|0)|0;c[p>>2]=(c[p>>2]|0)+(d+((_(c[(c[m>>2]|0)+8>>2]&65535,b[12551]|0)|0)>>16));d=_(c[(c[m>>2]|0)+12>>2]>>16,b[12550]|0)|0;c[p>>2]=(c[p>>2]|0)+(d+((_(c[(c[m>>2]|0)+12>>2]&65535,b[12550]|0)|0)>>16));if(((c[p>>2]>>5)+1>>1|0)<=32767)if(((c[p>>2]>>5)+1>>1|0)<-32768)a=-32768;else a=(c[p>>2]>>5)+1>>1;else a=32767;d=c[h>>2]|0;c[h>>2]=d+2;b[d>>1]=a;d=_(c[(c[m>>2]|0)+4>>2]>>16,b[12550]|0)|0;c[p>>2]=d+((_(c[(c[m>>2]|0)+4>>2]&65535,b[12550]|0)|0)>>16);d=_(c[(c[m>>2]|0)+8>>2]>>16,b[12551]|0)|0;c[p>>2]=(c[p>>2]|0)+(d+((_(c[(c[m>>2]|0)+8>>2]&65535,b[12551]|0)|0)>>16));d=_(c[(c[m>>2]|0)+12>>2]>>16,b[12549]|0)|0;c[p>>2]=(c[p>>2]|0)+(d+((_(c[(c[m>>2]|0)+12>>2]&65535,b[12549]|0)|0)>>16));d=_(c[(c[m>>2]|0)+16>>2]>>16,b[12548]|0)|0;c[p>>2]=(c[p>>2]|0)+(d+((_(c[(c[m>>2]|0)+16>>2]&65535,b[12548]|0)|0)>>16));if(((c[p>>2]>>5)+1>>1|0)<=32767)if(((c[p>>2]>>5)+1>>1|0)<-32768)a=-32768;else a=(c[p>>2]>>5)+1>>1;else a=32767;d=c[h>>2]|0;c[h>>2]=d+2;b[d>>1]=a;c[m>>2]=(c[m>>2]|0)+12;c[n>>2]=(c[n>>2]|0)-3}c[j>>2]=(c[j>>2]|0)+(c[o>>2]<<1);c[k>>2]=(c[k>>2]|0)-(c[o>>2]|0);if((c[k>>2]|0)<=0)break;d=l+(c[o>>2]<<2)|0;c[l>>2]=c[d>>2];c[l+4>>2]=c[d+4>>2];c[l+8>>2]=c[d+8>>2];c[l+12>>2]=c[d+12>>2]}p=c[g>>2]|0;o=l+(c[o>>2]<<2)|0;c[p>>2]=c[o>>2];c[p+4>>2]=c[o+4>>2];c[p+8>>2]=c[o+8>>2];c[p+12>>2]=c[o+12>>2];i=q;return}function lg(a,d,e,f){a=a|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;q=i;i=i+48|0;g=q+36|0;h=q+32|0;j=q+28|0;r=q+24|0;n=q+20|0;o=q+16|0;m=q+12|0;p=q+8|0;l=q+4|0;k=q;c[g>>2]=a;c[h>>2]=d;c[j>>2]=e;c[r>>2]=f;c[o>>2]=c[r>>2]>>1;c[n>>2]=0;while(1){if((c[n>>2]|0)>=(c[o>>2]|0))break;c[m>>2]=b[(c[j>>2]|0)+(c[n>>2]<<1<<1)>>1]<<10;c[l>>2]=(c[m>>2]|0)-(c[c[g>>2]>>2]|0);r=_(c[l>>2]>>16,-25727)|0;c[k>>2]=(c[l>>2]|0)+(r+((_(c[l>>2]&65535,-25727)|0)>>16));c[p>>2]=(c[c[g>>2]>>2]|0)+(c[k>>2]|0);c[c[g>>2]>>2]=(c[m>>2]|0)+(c[k>>2]|0);c[m>>2]=b[(c[j>>2]|0)+((c[n>>2]<<1)+1<<1)>>1]<<10;c[l>>2]=(c[m>>2]|0)-(c[(c[g>>2]|0)+4>>2]|0);c[k>>2]=((c[l>>2]>>16)*9872|0)+((c[l>>2]&65535)*9872>>16);c[p>>2]=(c[p>>2]|0)+(c[(c[g>>2]|0)+4>>2]|0);c[p>>2]=(c[p>>2]|0)+(c[k>>2]|0);c[(c[g>>2]|0)+4>>2]=(c[m>>2]|0)+(c[k>>2]|0);if(((c[p>>2]>>10)+1>>1|0)<=32767)if(((c[p>>2]>>10)+1>>1|0)<-32768)a=-32768;else a=(c[p>>2]>>10)+1>>1;else a=32767;b[(c[h>>2]|0)+(c[n>>2]<<1)>>1]=a;c[n>>2]=(c[n>>2]|0)+1}i=q;return}function mg(a,d,e,f,g){a=a|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;p=i;i=i+32|0;h=p+24|0;j=p+20|0;k=p+16|0;l=p+12|0;m=p+8|0;n=p+4|0;o=p;c[h>>2]=a;c[j>>2]=d;c[k>>2]=e;c[l>>2]=f;c[m>>2]=g;c[n>>2]=0;while(1){if((c[n>>2]|0)>=(c[m>>2]|0))break;c[o>>2]=(c[c[h>>2]>>2]|0)+(b[(c[k>>2]|0)+(c[n>>2]<<1)>>1]<<8);c[(c[j>>2]|0)+(c[n>>2]<<2)>>2]=c[o>>2];c[o>>2]=c[o>>2]<<2;d=_(c[o>>2]>>16,b[c[l>>2]>>1]|0)|0;d=(c[(c[h>>2]|0)+4>>2]|0)+(d+((_(c[o>>2]&65535,b[c[l>>2]>>1]|0)|0)>>16))|0;c[c[h>>2]>>2]=d;d=_(c[o>>2]>>16,b[(c[l>>2]|0)+2>>1]|0)|0;d=d+((_(c[o>>2]&65535,b[(c[l>>2]|0)+2>>1]|0)|0)>>16)|0;c[(c[h>>2]|0)+4>>2]=d;c[n>>2]=(c[n>>2]|0)+1}i=p;return}function ng(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;p=i;i=i+48|0;q=p+36|0;f=p+32|0;g=p+28|0;h=p+24|0;l=p+20|0;o=p+16|0;n=p+12|0;m=p+8|0;k=p+4|0;j=p;c[q>>2]=a;c[f>>2]=b;c[g>>2]=d;c[h>>2]=e;c[l>>2]=c[q>>2];b=(c[(c[l>>2]|0)+268>>2]|0)+(c[(c[l>>2]|0)+276>>2]|0)|0;c[j>>2]=ia()|0;a=i;i=i+((1*(b<<2)|0)+15&-16)|0;pj(a|0,(c[l>>2]|0)+24|0,c[(c[l>>2]|0)+276>>2]<<2|0)|0;c[k>>2]=(c[(c[l>>2]|0)+296>>2]|0)+4;c[m>>2]=c[(c[l>>2]|0)+272>>2];while(1){if((c[h>>2]|0)<(c[(c[l>>2]|0)+268>>2]|0))d=c[h>>2]|0;else d=c[(c[l>>2]|0)+268>>2]|0;c[o>>2]=d;mg(c[l>>2]|0,a+(c[(c[l>>2]|0)+276>>2]<<2)|0,c[g>>2]|0,c[(c[l>>2]|0)+296>>2]|0,c[o>>2]|0);c[n>>2]=c[o>>2]<<16;c[f>>2]=og(c[f>>2]|0,a,c[k>>2]|0,c[(c[l>>2]|0)+276>>2]|0,c[(c[l>>2]|0)+280>>2]|0,c[n>>2]|0,c[m>>2]|0)|0;c[g>>2]=(c[g>>2]|0)+(c[o>>2]<<1);c[h>>2]=(c[h>>2]|0)-(c[o>>2]|0);if((c[h>>2]|0)<=1)break;pj(a|0,a+(c[o>>2]<<2)|0,c[(c[l>>2]|0)+276>>2]<<2|0)|0}pj((c[l>>2]|0)+24|0,a+(c[o>>2]<<2)|0,c[(c[l>>2]|0)+276>>2]<<2|0)|0;na(c[j>>2]|0);i=p;return}function og(a,d,e,f,g,h,j){a=a|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;v=i;i=i+48|0;n=v+44|0;o=v+40|0;p=v+36|0;w=v+32|0;k=v+28|0;q=v+24|0;r=v+20|0;t=v+16|0;u=v+12|0;s=v+8|0;l=v+4|0;m=v;c[n>>2]=a;c[o>>2]=d;c[p>>2]=e;c[w>>2]=f;c[k>>2]=g;c[q>>2]=h;c[r>>2]=j;switch(c[w>>2]|0){case 18:{c[t>>2]=0;while(1){if((c[t>>2]|0)>=(c[q>>2]|0))break;c[s>>2]=(c[o>>2]|0)+(c[t>>2]>>16<<2);w=_((c[t>>2]&65535)>>16,(c[k>>2]&65535)<<16>>16)|0;c[l>>2]=w+((_(c[t>>2]&65535,(c[k>>2]&65535)<<16>>16)|0)>>16);c[m>>2]=(c[p>>2]|0)+((c[l>>2]|0)*9<<1);w=_(c[c[s>>2]>>2]>>16,b[c[m>>2]>>1]|0)|0;c[u>>2]=w+((_(c[c[s>>2]>>2]&65535,b[c[m>>2]>>1]|0)|0)>>16);w=_(c[(c[s>>2]|0)+4>>2]>>16,b[(c[m>>2]|0)+2>>1]|0)|0;c[u>>2]=(c[u>>2]|0)+(w+((_(c[(c[s>>2]|0)+4>>2]&65535,b[(c[m>>2]|0)+2>>1]|0)|0)>>16));w=_(c[(c[s>>2]|0)+8>>2]>>16,b[(c[m>>2]|0)+4>>1]|0)|0;c[u>>2]=(c[u>>2]|0)+(w+((_(c[(c[s>>2]|0)+8>>2]&65535,b[(c[m>>2]|0)+4>>1]|0)|0)>>16));w=_(c[(c[s>>2]|0)+12>>2]>>16,b[(c[m>>2]|0)+6>>1]|0)|0;c[u>>2]=(c[u>>2]|0)+(w+((_(c[(c[s>>2]|0)+12>>2]&65535,b[(c[m>>2]|0)+6>>1]|0)|0)>>16));w=_(c[(c[s>>2]|0)+16>>2]>>16,b[(c[m>>2]|0)+8>>1]|0)|0;c[u>>2]=(c[u>>2]|0)+(w+((_(c[(c[s>>2]|0)+16>>2]&65535,b[(c[m>>2]|0)+8>>1]|0)|0)>>16));w=_(c[(c[s>>2]|0)+20>>2]>>16,b[(c[m>>2]|0)+10>>1]|0)|0;c[u>>2]=(c[u>>2]|0)+(w+((_(c[(c[s>>2]|0)+20>>2]&65535,b[(c[m>>2]|0)+10>>1]|0)|0)>>16));w=_(c[(c[s>>2]|0)+24>>2]>>16,b[(c[m>>2]|0)+12>>1]|0)|0;c[u>>2]=(c[u>>2]|0)+(w+((_(c[(c[s>>2]|0)+24>>2]&65535,b[(c[m>>2]|0)+12>>1]|0)|0)>>16));w=_(c[(c[s>>2]|0)+28>>2]>>16,b[(c[m>>2]|0)+14>>1]|0)|0;c[u>>2]=(c[u>>2]|0)+(w+((_(c[(c[s>>2]|0)+28>>2]&65535,b[(c[m>>2]|0)+14>>1]|0)|0)>>16));w=_(c[(c[s>>2]|0)+32>>2]>>16,b[(c[m>>2]|0)+16>>1]|0)|0;c[u>>2]=(c[u>>2]|0)+(w+((_(c[(c[s>>2]|0)+32>>2]&65535,b[(c[m>>2]|0)+16>>1]|0)|0)>>16));c[m>>2]=(c[p>>2]|0)+(((c[k>>2]|0)-1-(c[l>>2]|0)|0)*9<<1);w=_(c[(c[s>>2]|0)+68>>2]>>16,b[c[m>>2]>>1]|0)|0;c[u>>2]=(c[u>>2]|0)+(w+((_(c[(c[s>>2]|0)+68>>2]&65535,b[c[m>>2]>>1]|0)|0)>>16));w=_(c[(c[s>>2]|0)+64>>2]>>16,b[(c[m>>2]|0)+2>>1]|0)|0;c[u>>2]=(c[u>>2]|0)+(w+((_(c[(c[s>>2]|0)+64>>2]&65535,b[(c[m>>2]|0)+2>>1]|0)|0)>>16));w=_(c[(c[s>>2]|0)+60>>2]>>16,b[(c[m>>2]|0)+4>>1]|0)|0;c[u>>2]=(c[u>>2]|0)+(w+((_(c[(c[s>>2]|0)+60>>2]&65535,b[(c[m>>2]|0)+4>>1]|0)|0)>>16));w=_(c[(c[s>>2]|0)+56>>2]>>16,b[(c[m>>2]|0)+6>>1]|0)|0;c[u>>2]=(c[u>>2]|0)+(w+((_(c[(c[s>>2]|0)+56>>2]&65535,b[(c[m>>2]|0)+6>>1]|0)|0)>>16));w=_(c[(c[s>>2]|0)+52>>2]>>16,b[(c[m>>2]|0)+8>>1]|0)|0;c[u>>2]=(c[u>>2]|0)+(w+((_(c[(c[s>>2]|0)+52>>2]&65535,b[(c[m>>2]|0)+8>>1]|0)|0)>>16));w=_(c[(c[s>>2]|0)+48>>2]>>16,b[(c[m>>2]|0)+10>>1]|0)|0;c[u>>2]=(c[u>>2]|0)+(w+((_(c[(c[s>>2]|0)+48>>2]&65535,b[(c[m>>2]|0)+10>>1]|0)|0)>>16));w=_(c[(c[s>>2]|0)+44>>2]>>16,b[(c[m>>2]|0)+12>>1]|0)|0;c[u>>2]=(c[u>>2]|0)+(w+((_(c[(c[s>>2]|0)+44>>2]&65535,b[(c[m>>2]|0)+12>>1]|0)|0)>>16));w=_(c[(c[s>>2]|0)+40>>2]>>16,b[(c[m>>2]|0)+14>>1]|0)|0;c[u>>2]=(c[u>>2]|0)+(w+((_(c[(c[s>>2]|0)+40>>2]&65535,b[(c[m>>2]|0)+14>>1]|0)|0)>>16));w=_(c[(c[s>>2]|0)+36>>2]>>16,b[(c[m>>2]|0)+16>>1]|0)|0;c[u>>2]=(c[u>>2]|0)+(w+((_(c[(c[s>>2]|0)+36>>2]&65535,b[(c[m>>2]|0)+16>>1]|0)|0)>>16));if(((c[u>>2]>>5)+1>>1|0)<=32767)if(((c[u>>2]>>5)+1>>1|0)<-32768)e=-32768;else e=(c[u>>2]>>5)+1>>1;else e=32767;w=c[n>>2]|0;c[n>>2]=w+2;b[w>>1]=e;c[t>>2]=(c[t>>2]|0)+(c[r>>2]|0)}w=c[n>>2]|0;i=v;return w|0}case 24:{c[t>>2]=0;while(1){if((c[t>>2]|0)>=(c[q>>2]|0))break;c[s>>2]=(c[o>>2]|0)+(c[t>>2]>>16<<2);w=_((c[c[s>>2]>>2]|0)+(c[(c[s>>2]|0)+92>>2]|0)>>16,b[c[p>>2]>>1]|0)|0;c[u>>2]=w+((_((c[c[s>>2]>>2]|0)+(c[(c[s>>2]|0)+92>>2]|0)&65535,b[c[p>>2]>>1]|0)|0)>>16);w=_((c[(c[s>>2]|0)+4>>2]|0)+(c[(c[s>>2]|0)+88>>2]|0)>>16,b[(c[p>>2]|0)+2>>1]|0)|0;c[u>>2]=(c[u>>2]|0)+(w+((_((c[(c[s>>2]|0)+4>>2]|0)+(c[(c[s>>2]|0)+88>>2]|0)&65535,b[(c[p>>2]|0)+2>>1]|0)|0)>>16));w=_((c[(c[s>>2]|0)+8>>2]|0)+(c[(c[s>>2]|0)+84>>2]|0)>>16,b[(c[p>>2]|0)+4>>1]|0)|0;c[u>>2]=(c[u>>2]|0)+(w+((_((c[(c[s>>2]|0)+8>>2]|0)+(c[(c[s>>2]|0)+84>>2]|0)&65535,b[(c[p>>2]|0)+4>>1]|0)|0)>>16));w=_((c[(c[s>>2]|0)+12>>2]|0)+(c[(c[s>>2]|0)+80>>2]|0)>>16,b[(c[p>>2]|0)+6>>1]|0)|0;c[u>>2]=(c[u>>2]|0)+(w+((_((c[(c[s>>2]|0)+12>>2]|0)+(c[(c[s>>2]|0)+80>>2]|0)&65535,b[(c[p>>2]|0)+6>>1]|0)|0)>>16));w=_((c[(c[s>>2]|0)+16>>2]|0)+(c[(c[s>>2]|0)+76>>2]|0)>>16,b[(c[p>>2]|0)+8>>1]|0)|0;c[u>>2]=(c[u>>2]|0)+(w+((_((c[(c[s>>2]|0)+16>>2]|0)+(c[(c[s>>2]|0)+76>>2]|0)&65535,b[(c[p>>2]|0)+8>>1]|0)|0)>>16));w=_((c[(c[s>>2]|0)+20>>2]|0)+(c[(c[s>>2]|0)+72>>2]|0)>>16,b[(c[p>>2]|0)+10>>1]|0)|0;c[u>>2]=(c[u>>2]|0)+(w+((_((c[(c[s>>2]|0)+20>>2]|0)+(c[(c[s>>2]|0)+72>>2]|0)&65535,b[(c[p>>2]|0)+10>>1]|0)|0)>>16));w=_((c[(c[s>>2]|0)+24>>2]|0)+(c[(c[s>>2]|0)+68>>2]|0)>>16,b[(c[p>>2]|0)+12>>1]|0)|0;c[u>>2]=(c[u>>2]|0)+(w+((_((c[(c[s>>2]|0)+24>>2]|0)+(c[(c[s>>2]|0)+68>>2]|0)&65535,b[(c[p>>2]|0)+12>>1]|0)|0)>>16));w=_((c[(c[s>>2]|0)+28>>2]|0)+(c[(c[s>>2]|0)+64>>2]|0)>>16,b[(c[p>>2]|0)+14>>1]|0)|0;c[u>>2]=(c[u>>2]|0)+(w+((_((c[(c[s>>2]|0)+28>>2]|0)+(c[(c[s>>2]|0)+64>>2]|0)&65535,b[(c[p>>2]|0)+14>>1]|0)|0)>>16));w=_((c[(c[s>>2]|0)+32>>2]|0)+(c[(c[s>>2]|0)+60>>2]|0)>>16,b[(c[p>>2]|0)+16>>1]|0)|0;c[u>>2]=(c[u>>2]|0)+(w+((_((c[(c[s>>2]|0)+32>>2]|0)+(c[(c[s>>2]|0)+60>>2]|0)&65535,b[(c[p>>2]|0)+16>>1]|0)|0)>>16));w=_((c[(c[s>>2]|0)+36>>2]|0)+(c[(c[s>>2]|0)+56>>2]|0)>>16,b[(c[p>>2]|0)+18>>1]|0)|0;c[u>>2]=(c[u>>2]|0)+(w+((_((c[(c[s>>2]|0)+36>>2]|0)+(c[(c[s>>2]|0)+56>>2]|0)&65535,b[(c[p>>2]|0)+18>>1]|0)|0)>>16));w=_((c[(c[s>>2]|0)+40>>2]|0)+(c[(c[s>>2]|0)+52>>2]|0)>>16,b[(c[p>>2]|0)+20>>1]|0)|0;c[u>>2]=(c[u>>2]|0)+(w+((_((c[(c[s>>2]|0)+40>>2]|0)+(c[(c[s>>2]|0)+52>>2]|0)&65535,b[(c[p>>2]|0)+20>>1]|0)|0)>>16));w=_((c[(c[s>>2]|0)+44>>2]|0)+(c[(c[s>>2]|0)+48>>2]|0)>>16,b[(c[p>>2]|0)+22>>1]|0)|0;c[u>>2]=(c[u>>2]|0)+(w+((_((c[(c[s>>2]|0)+44>>2]|0)+(c[(c[s>>2]|0)+48>>2]|0)&65535,b[(c[p>>2]|0)+22>>1]|0)|0)>>16));if(((c[u>>2]>>5)+1>>1|0)<=32767)if(((c[u>>2]>>5)+1>>1|0)<-32768)e=-32768;else e=(c[u>>2]>>5)+1>>1;else e=32767;w=c[n>>2]|0;c[n>>2]=w+2;b[w>>1]=e;c[t>>2]=(c[t>>2]|0)+(c[r>>2]|0)}w=c[n>>2]|0;i=v;return w|0}case 36:{c[t>>2]=0;while(1){if((c[t>>2]|0)>=(c[q>>2]|0))break;c[s>>2]=(c[o>>2]|0)+(c[t>>2]>>16<<2);w=_((c[c[s>>2]>>2]|0)+(c[(c[s>>2]|0)+140>>2]|0)>>16,b[c[p>>2]>>1]|0)|0;c[u>>2]=w+((_((c[c[s>>2]>>2]|0)+(c[(c[s>>2]|0)+140>>2]|0)&65535,b[c[p>>2]>>1]|0)|0)>>16);w=_((c[(c[s>>2]|0)+4>>2]|0)+(c[(c[s>>2]|0)+136>>2]|0)>>16,b[(c[p>>2]|0)+2>>1]|0)|0;c[u>>2]=(c[u>>2]|0)+(w+((_((c[(c[s>>2]|0)+4>>2]|0)+(c[(c[s>>2]|0)+136>>2]|0)&65535,b[(c[p>>2]|0)+2>>1]|0)|0)>>16));w=_((c[(c[s>>2]|0)+8>>2]|0)+(c[(c[s>>2]|0)+132>>2]|0)>>16,b[(c[p>>2]|0)+4>>1]|0)|0;c[u>>2]=(c[u>>2]|0)+(w+((_((c[(c[s>>2]|0)+8>>2]|0)+(c[(c[s>>2]|0)+132>>2]|0)&65535,b[(c[p>>2]|0)+4>>1]|0)|0)>>16));w=_((c[(c[s>>2]|0)+12>>2]|0)+(c[(c[s>>2]|0)+128>>2]|0)>>16,b[(c[p>>2]|0)+6>>1]|0)|0;c[u>>2]=(c[u>>2]|0)+(w+((_((c[(c[s>>2]|0)+12>>2]|0)+(c[(c[s>>2]|0)+128>>2]|0)&65535,b[(c[p>>2]|0)+6>>1]|0)|0)>>16));w=_((c[(c[s>>2]|0)+16>>2]|0)+(c[(c[s>>2]|0)+124>>2]|0)>>16,b[(c[p>>2]|0)+8>>1]|0)|0;c[u>>2]=(c[u>>2]|0)+(w+((_((c[(c[s>>2]|0)+16>>2]|0)+(c[(c[s>>2]|0)+124>>2]|0)&65535,b[(c[p>>2]|0)+8>>1]|0)|0)>>16));w=_((c[(c[s>>2]|0)+20>>2]|0)+(c[(c[s>>2]|0)+120>>2]|0)>>16,b[(c[p>>2]|0)+10>>1]|0)|0;c[u>>2]=(c[u>>2]|0)+(w+((_((c[(c[s>>2]|0)+20>>2]|0)+(c[(c[s>>2]|0)+120>>2]|0)&65535,b[(c[p>>2]|0)+10>>1]|0)|0)>>16));w=_((c[(c[s>>2]|0)+24>>2]|0)+(c[(c[s>>2]|0)+116>>2]|0)>>16,b[(c[p>>2]|0)+12>>1]|0)|0;c[u>>2]=(c[u>>2]|0)+(w+((_((c[(c[s>>2]|0)+24>>2]|0)+(c[(c[s>>2]|0)+116>>2]|0)&65535,b[(c[p>>2]|0)+12>>1]|0)|0)>>16));w=_((c[(c[s>>2]|0)+28>>2]|0)+(c[(c[s>>2]|0)+112>>2]|0)>>16,b[(c[p>>2]|0)+14>>1]|0)|0;c[u>>2]=(c[u>>2]|0)+(w+((_((c[(c[s>>2]|0)+28>>2]|0)+(c[(c[s>>2]|0)+112>>2]|0)&65535,b[(c[p>>2]|0)+14>>1]|0)|0)>>16));w=_((c[(c[s>>2]|0)+32>>2]|0)+(c[(c[s>>2]|0)+108>>2]|0)>>16,b[(c[p>>2]|0)+16>>1]|0)|0;c[u>>2]=(c[u>>2]|0)+(w+((_((c[(c[s>>2]|0)+32>>2]|0)+(c[(c[s>>2]|0)+108>>2]|0)&65535,b[(c[p>>2]|0)+16>>1]|0)|0)>>16));w=_((c[(c[s>>2]|0)+36>>2]|0)+(c[(c[s>>2]|0)+104>>2]|0)>>16,b[(c[p>>2]|0)+18>>1]|0)|0;c[u>>2]=(c[u>>2]|0)+(w+((_((c[(c[s>>2]|0)+36>>2]|0)+(c[(c[s>>2]|0)+104>>2]|0)&65535,b[(c[p>>2]|0)+18>>1]|0)|0)>>16));w=_((c[(c[s>>2]|0)+40>>2]|0)+(c[(c[s>>2]|0)+100>>2]|0)>>16,b[(c[p>>2]|0)+20>>1]|0)|0;c[u>>2]=(c[u>>2]|0)+(w+((_((c[(c[s>>2]|0)+40>>2]|0)+(c[(c[s>>2]|0)+100>>2]|0)&65535,b[(c[p>>2]|0)+20>>1]|0)|0)>>16));w=_((c[(c[s>>2]|0)+44>>2]|0)+(c[(c[s>>2]|0)+96>>2]|0)>>16,b[(c[p>>2]|0)+22>>1]|0)|0;c[u>>2]=(c[u>>2]|0)+(w+((_((c[(c[s>>2]|0)+44>>2]|0)+(c[(c[s>>2]|0)+96>>2]|0)&65535,b[(c[p>>2]|0)+22>>1]|0)|0)>>16));w=_((c[(c[s>>2]|0)+48>>2]|0)+(c[(c[s>>2]|0)+92>>2]|0)>>16,b[(c[p>>2]|0)+24>>1]|0)|0;c[u>>2]=(c[u>>2]|0)+(w+((_((c[(c[s>>2]|0)+48>>2]|0)+(c[(c[s>>2]|0)+92>>2]|0)&65535,b[(c[p>>2]|0)+24>>1]|0)|0)>>16));w=_((c[(c[s>>2]|0)+52>>2]|0)+(c[(c[s>>2]|0)+88>>2]|0)>>16,b[(c[p>>2]|0)+26>>1]|0)|0;c[u>>2]=(c[u>>2]|0)+(w+((_((c[(c[s>>2]|0)+52>>2]|0)+(c[(c[s>>2]|0)+88>>2]|0)&65535,b[(c[p>>2]|0)+26>>1]|0)|0)>>16));w=_((c[(c[s>>2]|0)+56>>2]|0)+(c[(c[s>>2]|0)+84>>2]|0)>>16,b[(c[p>>2]|0)+28>>1]|0)|0;c[u>>2]=(c[u>>2]|0)+(w+((_((c[(c[s>>2]|0)+56>>2]|0)+(c[(c[s>>2]|0)+84>>2]|0)&65535,b[(c[p>>2]|0)+28>>1]|0)|0)>>16));w=_((c[(c[s>>2]|0)+60>>2]|0)+(c[(c[s>>2]|0)+80>>2]|0)>>16,b[(c[p>>2]|0)+30>>1]|0)|0;c[u>>2]=(c[u>>2]|0)+(w+((_((c[(c[s>>2]|0)+60>>2]|0)+(c[(c[s>>2]|0)+80>>2]|0)&65535,b[(c[p>>2]|0)+30>>1]|0)|0)>>16));w=_((c[(c[s>>2]|0)+64>>2]|0)+(c[(c[s>>2]|0)+76>>2]|0)>>16,b[(c[p>>2]|0)+32>>1]|0)|0;c[u>>2]=(c[u>>2]|0)+(w+((_((c[(c[s>>2]|0)+64>>2]|0)+(c[(c[s>>2]|0)+76>>2]|0)&65535,b[(c[p>>2]|0)+32>>1]|0)|0)>>16));w=_((c[(c[s>>2]|0)+68>>2]|0)+(c[(c[s>>2]|0)+72>>2]|0)>>16,b[(c[p>>2]|0)+34>>1]|0)|0;c[u>>2]=(c[u>>2]|0)+(w+((_((c[(c[s>>2]|0)+68>>2]|0)+(c[(c[s>>2]|0)+72>>2]|0)&65535,b[(c[p>>2]|0)+34>>1]|0)|0)>>16));if(((c[u>>2]>>5)+1>>1|0)<=32767)if(((c[u>>2]>>5)+1>>1|0)<-32768)e=-32768;else e=(c[u>>2]>>5)+1>>1;else e=32767;w=c[n>>2]|0;c[n>>2]=w+2;b[w>>1]=e;c[t>>2]=(c[t>>2]|0)+(c[r>>2]|0)}w=c[n>>2]|0;i=v;return w|0}default:{w=c[n>>2]|0;i=v;return w|0}}return 0}function pg(a,d,e,f){a=a|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;p=i;i=i+48|0;q=p+32|0;g=p+28|0;h=p+24|0;j=p+20|0;l=p+16|0;o=p+12|0;n=p+8|0;m=p+4|0;k=p;c[q>>2]=a;c[g>>2]=d;c[h>>2]=e;c[j>>2]=f;c[l>>2]=c[q>>2];d=(c[(c[l>>2]|0)+268>>2]<<1)+8|0;c[k>>2]=ia()|0;a=i;i=i+((1*(d<<1)|0)+15&-16)|0;d=(c[l>>2]|0)+24|0;b[a>>1]=b[d>>1]|0;b[a+2>>1]=b[d+2>>1]|0;b[a+4>>1]=b[d+4>>1]|0;b[a+6>>1]=b[d+6>>1]|0;b[a+8>>1]=b[d+8>>1]|0;b[a+10>>1]=b[d+10>>1]|0;b[a+12>>1]=b[d+12>>1]|0;b[a+14>>1]=b[d+14>>1]|0;c[m>>2]=c[(c[l>>2]|0)+272>>2];while(1){if((c[j>>2]|0)<(c[(c[l>>2]|0)+268>>2]|0))e=c[j>>2]|0;else e=c[(c[l>>2]|0)+268>>2]|0;c[o>>2]=e;rg(c[l>>2]|0,a+16|0,c[h>>2]|0,c[o>>2]|0);c[n>>2]=c[o>>2]<<17;c[g>>2]=qg(c[g>>2]|0,a,c[n>>2]|0,c[m>>2]|0)|0;c[h>>2]=(c[h>>2]|0)+(c[o>>2]<<1);c[j>>2]=(c[j>>2]|0)-(c[o>>2]|0);if((c[j>>2]|0)<=0)break;q=a+(c[o>>2]<<1<<1)|0;b[a>>1]=b[q>>1]|0;b[a+2>>1]=b[q+2>>1]|0;b[a+4>>1]=b[q+4>>1]|0;b[a+6>>1]=b[q+6>>1]|0;b[a+8>>1]=b[q+8>>1]|0;b[a+10>>1]=b[q+10>>1]|0;b[a+12>>1]=b[q+12>>1]|0;b[a+14>>1]=b[q+14>>1]|0}q=(c[l>>2]|0)+24|0;o=a+(c[o>>2]<<1<<1)|0;b[q>>1]=b[o>>1]|0;b[q+2>>1]=b[o+2>>1]|0;b[q+4>>1]=b[o+4>>1]|0;b[q+6>>1]=b[o+6>>1]|0;b[q+8>>1]=b[o+8>>1]|0;b[q+10>>1]=b[o+10>>1]|0;b[q+12>>1]=b[o+12>>1]|0;b[q+14>>1]=b[o+14>>1]|0;na(c[k>>2]|0);i=p;return}function qg(a,d,e,f){a=a|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;p=i;i=i+32|0;g=p+28|0;h=p+24|0;j=p+20|0;k=p+16|0;m=p+12|0;n=p+8|0;l=p+4|0;o=p;c[g>>2]=a;c[h>>2]=d;c[j>>2]=e;c[k>>2]=f;c[m>>2]=0;while(1){if((c[m>>2]|0)>=(c[j>>2]|0))break;c[o>>2]=(((c[m>>2]&65535)>>16)*12|0)+((c[m>>2]&65535)*12>>16);c[l>>2]=(c[h>>2]|0)+(c[m>>2]>>16<<1);c[n>>2]=_(b[c[l>>2]>>1]|0,b[25104+(c[o>>2]<<3)>>1]|0)|0;c[n>>2]=(c[n>>2]|0)+(_(b[(c[l>>2]|0)+2>>1]|0,b[25104+(c[o>>2]<<3)+2>>1]|0)|0);c[n>>2]=(c[n>>2]|0)+(_(b[(c[l>>2]|0)+4>>1]|0,b[25104+(c[o>>2]<<3)+4>>1]|0)|0);c[n>>2]=(c[n>>2]|0)+(_(b[(c[l>>2]|0)+6>>1]|0,b[25104+(c[o>>2]<<3)+6>>1]|0)|0);c[n>>2]=(c[n>>2]|0)+(_(b[(c[l>>2]|0)+8>>1]|0,b[25104+(11-(c[o>>2]|0)<<3)+6>>1]|0)|0);c[n>>2]=(c[n>>2]|0)+(_(b[(c[l>>2]|0)+10>>1]|0,b[25104+(11-(c[o>>2]|0)<<3)+4>>1]|0)|0);c[n>>2]=(c[n>>2]|0)+(_(b[(c[l>>2]|0)+12>>1]|0,b[25104+(11-(c[o>>2]|0)<<3)+2>>1]|0)|0);c[n>>2]=(c[n>>2]|0)+(_(b[(c[l>>2]|0)+14>>1]|0,b[25104+(11-(c[o>>2]|0)<<3)>>1]|0)|0);if(((c[n>>2]>>14)+1>>1|0)<=32767)if(((c[n>>2]>>14)+1>>1|0)<-32768)d=-32768;else d=(c[n>>2]>>14)+1>>1;else d=32767;a=c[g>>2]|0;c[g>>2]=a+2;b[a>>1]=d;c[m>>2]=(c[m>>2]|0)+(c[k>>2]|0)}i=p;return c[g>>2]|0}function rg(a,d,e,f){a=a|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;r=i;i=i+48|0;g=r+36|0;h=r+32|0;j=r+28|0;k=r+24|0;o=r+20|0;n=r+16|0;p=r+12|0;q=r+8|0;m=r+4|0;l=r;c[g>>2]=a;c[h>>2]=d;c[j>>2]=e;c[k>>2]=f;c[o>>2]=0;while(1){if((c[o>>2]|0)>=(c[k>>2]|0))break;c[n>>2]=b[(c[j>>2]|0)+(c[o>>2]<<1)>>1]<<10;c[m>>2]=(c[n>>2]|0)-(c[c[g>>2]>>2]|0);d=_(c[m>>2]>>16,b[12417]|0)|0;c[l>>2]=d+((_(c[m>>2]&65535,b[12417]|0)|0)>>16);c[p>>2]=(c[c[g>>2]>>2]|0)+(c[l>>2]|0);c[c[g>>2]>>2]=(c[n>>2]|0)+(c[l>>2]|0);c[m>>2]=(c[p>>2]|0)-(c[(c[g>>2]|0)+4>>2]|0);d=_(c[m>>2]>>16,b[12418]|0)|0;c[l>>2]=d+((_(c[m>>2]&65535,b[12418]|0)|0)>>16);c[q>>2]=(c[(c[g>>2]|0)+4>>2]|0)+(c[l>>2]|0);c[(c[g>>2]|0)+4>>2]=(c[p>>2]|0)+(c[l>>2]|0);c[m>>2]=(c[q>>2]|0)-(c[(c[g>>2]|0)+8>>2]|0);d=_(c[m>>2]>>16,b[12419]|0)|0;c[l>>2]=(c[m>>2]|0)+(d+((_(c[m>>2]&65535,b[12419]|0)|0)>>16));c[p>>2]=(c[(c[g>>2]|0)+8>>2]|0)+(c[l>>2]|0);c[(c[g>>2]|0)+8>>2]=(c[q>>2]|0)+(c[l>>2]|0);if(((c[p>>2]>>9)+1>>1|0)<=32767)if(((c[p>>2]>>9)+1>>1|0)<-32768)a=-32768;else a=(c[p>>2]>>9)+1>>1;else a=32767;b[(c[h>>2]|0)+(c[o>>2]<<1<<1)>>1]=a;c[m>>2]=(c[n>>2]|0)-(c[(c[g>>2]|0)+12>>2]|0);d=_(c[m>>2]>>16,b[12420]|0)|0;c[l>>2]=d+((_(c[m>>2]&65535,b[12420]|0)|0)>>16);c[p>>2]=(c[(c[g>>2]|0)+12>>2]|0)+(c[l>>2]|0);c[(c[g>>2]|0)+12>>2]=(c[n>>2]|0)+(c[l>>2]|0);c[m>>2]=(c[p>>2]|0)-(c[(c[g>>2]|0)+16>>2]|0);d=_(c[m>>2]>>16,b[12421]|0)|0;c[l>>2]=d+((_(c[m>>2]&65535,b[12421]|0)|0)>>16);c[q>>2]=(c[(c[g>>2]|0)+16>>2]|0)+(c[l>>2]|0);c[(c[g>>2]|0)+16>>2]=(c[p>>2]|0)+(c[l>>2]|0);c[m>>2]=(c[q>>2]|0)-(c[(c[g>>2]|0)+20>>2]|0);d=_(c[m>>2]>>16,b[12422]|0)|0;c[l>>2]=(c[m>>2]|0)+(d+((_(c[m>>2]&65535,b[12422]|0)|0)>>16));c[p>>2]=(c[(c[g>>2]|0)+20>>2]|0)+(c[l>>2]|0);c[(c[g>>2]|0)+20>>2]=(c[q>>2]|0)+(c[l>>2]|0);if(((c[p>>2]>>9)+1>>1|0)<=32767)if(((c[p>>2]>>9)+1>>1|0)<-32768)a=-32768;else a=(c[p>>2]>>9)+1>>1;else a=32767;b[(c[h>>2]|0)+((c[o>>2]<<1)+1<<1)>>1]=a;c[o>>2]=(c[o>>2]|0)+1}i=r;return}function sg(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0;f=i;i=i+32|0;l=f+16|0;j=f+12|0;h=f+8|0;g=f+4|0;k=f;c[l>>2]=a;c[j>>2]=b;c[h>>2]=d;c[g>>2]=e;c[k>>2]=c[l>>2];rg(c[k>>2]|0,c[j>>2]|0,c[h>>2]|0,c[g>>2]|0);i=f;return}function tg(a){a=a|0;var b=0,d=0,e=0,f=0;f=i;i=i+16|0;b=f+8|0;d=f+4|0;e=f;c[d>>2]=a;a=c[d>>2]|0;if((c[d>>2]|0)<0){c[d>>2]=0-a;if((c[d>>2]|0)>=192){c[b>>2]=0;e=c[b>>2]|0;i=f;return e|0}else{c[e>>2]=c[d>>2]>>5;c[b>>2]=(c[17960+(c[e>>2]<<2)>>2]|0)-(_((c[17984+(c[e>>2]<<2)>>2]&65535)<<16>>16,(c[d>>2]&31)<<16>>16)|0);e=c[b>>2]|0;i=f;return e|0}}else if((a|0)>=192){c[b>>2]=32767;e=c[b>>2]|0;i=f;return e|0}else{c[e>>2]=c[d>>2]>>5;c[b>>2]=(c[18008+(c[e>>2]<<2)>>2]|0)+(_((c[17984+(c[e>>2]<<2)>>2]&65535)<<16>>16,(c[d>>2]&31)<<16>>16)|0);e=c[b>>2]|0;i=f;return e|0}return 0}function ug(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;n=i;i=i+32|0;f=n+24|0;g=n+20|0;h=n+16|0;j=n+12|0;m=n+8|0;k=n+4|0;l=n;c[f>>2]=a;c[g>>2]=b;c[h>>2]=d;c[j>>2]=e;c[k>>2]=0;while(1){if((c[k>>2]|0)>=(c[j>>2]|0))break;c[(c[g>>2]|0)+(c[k>>2]<<2)>>2]=c[k>>2];c[k>>2]=(c[k>>2]|0)+1}c[k>>2]=1;while(1){if((c[k>>2]|0)>=(c[j>>2]|0))break;c[m>>2]=c[(c[f>>2]|0)+(c[k>>2]<<2)>>2];c[l>>2]=(c[k>>2]|0)-1;while(1){if((c[l>>2]|0)<0)break;if((c[m>>2]|0)>=(c[(c[f>>2]|0)+(c[l>>2]<<2)>>2]|0))break;c[(c[f>>2]|0)+((c[l>>2]|0)+1<<2)>>2]=c[(c[f>>2]|0)+(c[l>>2]<<2)>>2];c[(c[g>>2]|0)+((c[l>>2]|0)+1<<2)>>2]=c[(c[g>>2]|0)+(c[l>>2]<<2)>>2];c[l>>2]=(c[l>>2]|0)+-1}c[(c[f>>2]|0)+((c[l>>2]|0)+1<<2)>>2]=c[m>>2];c[(c[g>>2]|0)+((c[l>>2]|0)+1<<2)>>2]=c[k>>2];c[k>>2]=(c[k>>2]|0)+1}c[k>>2]=c[j>>2];while(1){if((c[k>>2]|0)>=(c[h>>2]|0))break;c[m>>2]=c[(c[f>>2]|0)+(c[k>>2]<<2)>>2];if((c[m>>2]|0)<(c[(c[f>>2]|0)+((c[j>>2]|0)-1<<2)>>2]|0)){c[l>>2]=(c[j>>2]|0)-2;while(1){if((c[l>>2]|0)<0)break;if((c[m>>2]|0)>=(c[(c[f>>2]|0)+(c[l>>2]<<2)>>2]|0))break;c[(c[f>>2]|0)+((c[l>>2]|0)+1<<2)>>2]=c[(c[f>>2]|0)+(c[l>>2]<<2)>>2];c[(c[g>>2]|0)+((c[l>>2]|0)+1<<2)>>2]=c[(c[g>>2]|0)+(c[l>>2]<<2)>>2];c[l>>2]=(c[l>>2]|0)+-1}c[(c[f>>2]|0)+((c[l>>2]|0)+1<<2)>>2]=c[m>>2];c[(c[g>>2]|0)+((c[l>>2]|0)+1<<2)>>2]=c[k>>2]}c[k>>2]=(c[k>>2]|0)+1}i=n;return}function vg(a,d){a=a|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0;k=i;i=i+32|0;e=k+16|0;f=k+12|0;j=k+8|0;g=k+4|0;h=k;c[e>>2]=a;c[f>>2]=d;c[g>>2]=1;while(1){if((c[g>>2]|0)>=(c[f>>2]|0))break;c[j>>2]=b[(c[e>>2]|0)+(c[g>>2]<<1)>>1];c[h>>2]=(c[g>>2]|0)-1;while(1){if((c[h>>2]|0)<0)break;if((c[j>>2]|0)>=(b[(c[e>>2]|0)+(c[h>>2]<<1)>>1]|0))break;b[(c[e>>2]|0)+((c[h>>2]|0)+1<<1)>>1]=b[(c[e>>2]|0)+(c[h>>2]<<1)>>1]|0;c[h>>2]=(c[h>>2]|0)+-1}b[(c[e>>2]|0)+((c[h>>2]|0)+1<<1)>>1]=c[j>>2];c[g>>2]=(c[g>>2]|0)+1}i=k;return}function wg(a,d,e,f){a=a|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;q=i;i=i+32|0;h=q+28|0;j=q+24|0;k=q+20|0;l=q+16|0;m=q+12|0;p=q+8|0;o=q+4|0;n=q;c[h>>2]=a;c[j>>2]=d;c[k>>2]=e;c[l>>2]=f;c[n>>2]=0;c[p>>2]=0;c[l>>2]=(c[l>>2]|0)+-1;c[m>>2]=0;while(1){if((c[m>>2]|0)>=(c[l>>2]|0))break;c[n>>2]=(c[n>>2]|0)+(_(b[(c[k>>2]|0)+(c[m>>2]<<1)>>1]|0,b[(c[k>>2]|0)+(c[m>>2]<<1)>>1]|0)|0);c[n>>2]=(c[n>>2]|0)+(_(b[(c[k>>2]|0)+((c[m>>2]|0)+1<<1)>>1]|0,b[(c[k>>2]|0)+((c[m>>2]|0)+1<<1)>>1]|0)|0);if((c[n>>2]|0)<0){g=4;break}c[m>>2]=(c[m>>2]|0)+2}if((g|0)==4){c[n>>2]=(c[n>>2]|0)>>>2;c[p>>2]=2;c[m>>2]=(c[m>>2]|0)+2}while(1){a=c[m>>2]|0;if((c[m>>2]|0)>=(c[l>>2]|0))break;c[o>>2]=_(b[(c[k>>2]|0)+(a<<1)>>1]|0,b[(c[k>>2]|0)+(c[m>>2]<<1)>>1]|0)|0;c[o>>2]=(c[o>>2]|0)+(_(b[(c[k>>2]|0)+((c[m>>2]|0)+1<<1)>>1]|0,b[(c[k>>2]|0)+((c[m>>2]|0)+1<<1)>>1]|0)|0);c[n>>2]=(c[n>>2]|0)+((c[o>>2]|0)>>>(c[p>>2]|0));if((c[n>>2]|0)<0){c[n>>2]=(c[n>>2]|0)>>>2;c[p>>2]=(c[p>>2]|0)+2}c[m>>2]=(c[m>>2]|0)+2}if((a|0)==(c[l>>2]|0)){c[o>>2]=_(b[(c[k>>2]|0)+(c[m>>2]<<1)>>1]|0,b[(c[k>>2]|0)+(c[m>>2]<<1)>>1]|0)|0;c[n>>2]=(c[n>>2]|0)+(c[o>>2]>>c[p>>2])}if(!(c[n>>2]&-1073741824)){p=c[p>>2]|0;o=c[j>>2]|0;c[o>>2]=p;o=c[n>>2]|0;p=c[h>>2]|0;c[p>>2]=o;i=q;return}c[n>>2]=(c[n>>2]|0)>>>2;c[p>>2]=(c[p>>2]|0)+2;p=c[p>>2]|0;o=c[j>>2]|0;c[o>>2]=p;o=c[n>>2]|0;p=c[h>>2]|0;c[p>>2]=o;i=q;return}function xg(a,d){a=a|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0;l=i;i=i+48|0;e=l+40|0;f=l+36|0;j=l+32|0;g=l+8|0;h=l+4|0;k=l;c[e>>2]=a;c[f>>2]=d;c[j>>2]=ec(c[e>>2]|0,28978,8)|0;c[g+8>>2]=(c[j>>2]|0)/5|0;c[g+12+8>>2]=(c[j>>2]|0)-((c[g+8>>2]|0)*5|0);c[j>>2]=0;while(1){if((c[j>>2]|0)>=2)break;a=ec(c[e>>2]|0,29031,8)|0;c[g+((c[j>>2]|0)*12|0)>>2]=a;a=ec(c[e>>2]|0,29038,8)|0;c[g+((c[j>>2]|0)*12|0)+4>>2]=a;c[j>>2]=(c[j>>2]|0)+1}c[j>>2]=0;while(1){if((c[j>>2]|0)>=2)break;a=g+((c[j>>2]|0)*12|0)|0;c[a>>2]=(c[a>>2]|0)+((c[g+((c[j>>2]|0)*12|0)+8>>2]|0)*3|0);c[h>>2]=b[24526+(c[g+((c[j>>2]|0)*12|0)>>2]<<1)>>1];c[k>>2]=(((b[24526+((c[g+((c[j>>2]|0)*12|0)>>2]|0)+1<<1)>>1]|0)-(c[h>>2]|0)>>16)*6554|0)+(((b[24526+((c[g+((c[j>>2]|0)*12|0)>>2]|0)+1<<1)>>1]|0)-(c[h>>2]|0)&65535)*6554>>16);a=(c[h>>2]|0)+(_((c[k>>2]&65535)<<16>>16,((c[g+((c[j>>2]|0)*12|0)+4>>2]<<1)+1&65535)<<16>>16)|0)|0;c[(c[f>>2]|0)+(c[j>>2]<<2)>>2]=a;c[j>>2]=(c[j>>2]|0)+1}k=c[f>>2]|0;c[k>>2]=(c[k>>2]|0)-(c[(c[f>>2]|0)+4>>2]|0);i=l;return}function yg(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;i=i+16|0;f=d+4|0;e=d;c[f>>2]=a;c[e>>2]=b;a=ec(c[f>>2]|0,29003,8)|0;c[c[e>>2]>>2]=a;i=d;return}function zg(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0;h=i;i=i+16|0;e=h+8|0;f=h+4|0;g=h;c[e>>2]=b;c[f>>2]=d;c[g>>2]=((a[(c[f>>2]|0)+2>>0]|0)*5|0)+(a[(c[f>>2]|0)+3+2>>0]|0);qc(c[e>>2]|0,c[g>>2]|0,28978,8);c[g>>2]=0;while(1){if((c[g>>2]|0)>=2)break;qc(c[e>>2]|0,a[(c[f>>2]|0)+((c[g>>2]|0)*3|0)>>0]|0,29031,8);qc(c[e>>2]|0,a[(c[f>>2]|0)+((c[g>>2]|0)*3|0)+1>>0]|0,29038,8);c[g>>2]=(c[g>>2]|0)+1}i=h;return}function Ag(b,d){b=b|0;d=d|0;var e=0,f=0,g=0;e=i;i=i+16|0;g=e;f=e+4|0;c[g>>2]=b;a[f>>0]=d;qc(c[g>>2]|0,a[f>>0]|0,29003,8);i=e;return}function Bg(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;r=i;i=i+64|0;o=r+52|0;u=r+48|0;t=r+44|0;p=r+40|0;s=r+36|0;h=r+32|0;n=r+28|0;v=r+24|0;w=r+20|0;k=r+16|0;l=r+12|0;j=r+8|0;q=r+4|0;m=r;c[o>>2]=a;c[u>>2]=b;c[t>>2]=d;c[p>>2]=e;c[s>>2]=f;c[h>>2]=g;wg(k,v,c[u>>2]|0,c[s>>2]|0);wg(l,w,c[t>>2]|0,c[s>>2]|0);c[n>>2]=Cg(c[v>>2]|0,c[w>>2]|0)|0;c[n>>2]=(c[n>>2]|0)+(c[n>>2]&1);c[l>>2]=c[l>>2]>>(c[n>>2]|0)-(c[w>>2]|0);c[k>>2]=c[k>>2]>>(c[n>>2]|0)-(c[v>>2]|0);c[k>>2]=Cg(c[k>>2]|0,1)|0;c[j>>2]=Rf(c[u>>2]|0,c[t>>2]|0,c[n>>2]|0,c[s>>2]|0)|0;c[q>>2]=Dg(c[j>>2]|0,c[k>>2]|0,13)|0;if((c[q>>2]|0)>16384)f=16384;else f=(c[q>>2]|0)<-16384?-16384:c[q>>2]|0;c[q>>2]=f;w=_(c[q>>2]>>16,(c[q>>2]&65535)<<16>>16)|0;c[m>>2]=w+((_(c[q>>2]&65535,(c[q>>2]&65535)<<16>>16)|0)>>16);w=c[m>>2]|0;c[h>>2]=Cg(c[h>>2]|0,(c[m>>2]|0)>0?w:0-w|0)|0;c[n>>2]=c[n>>2]>>1;w=c[c[p>>2]>>2]|0;v=Fg(c[k>>2]|0)|0;v=_((v<<c[n>>2])-(c[c[p>>2]>>2]|0)>>16,(c[h>>2]&65535)<<16>>16)|0;u=Fg(c[k>>2]|0)|0;u=w+(v+((_((u<<c[n>>2])-(c[c[p>>2]>>2]|0)&65535,(c[h>>2]&65535)<<16>>16)|0)>>16))|0;c[c[p>>2]>>2]=u;u=_(c[j>>2]>>16,(c[q>>2]&65535)<<16>>16)|0;c[l>>2]=(c[l>>2]|0)-(u+((_(c[j>>2]&65535,(c[q>>2]&65535)<<16>>16)|0)>>16)<<4);u=_(c[k>>2]>>16,(c[m>>2]&65535)<<16>>16)|0;c[l>>2]=(c[l>>2]|0)+(u+((_(c[k>>2]&65535,(c[m>>2]&65535)<<16>>16)|0)>>16)<<6);u=c[(c[p>>2]|0)+4>>2]|0;v=Fg(c[l>>2]|0)|0;v=_((v<<c[n>>2])-(c[(c[p>>2]|0)+4>>2]|0)>>16,(c[h>>2]&65535)<<16>>16)|0;w=Fg(c[l>>2]|0)|0;w=u+(v+((_((w<<c[n>>2])-(c[(c[p>>2]|0)+4>>2]|0)&65535,(c[h>>2]&65535)<<16>>16)|0)>>16))|0;c[(c[p>>2]|0)+4>>2]=w;if((c[c[p>>2]>>2]|0)>1)f=c[c[p>>2]>>2]|0;else f=1;w=Dg(c[(c[p>>2]|0)+4>>2]|0,f,14)|0;c[c[o>>2]>>2]=w;if((c[c[o>>2]>>2]|0)>32767){v=32767;w=c[o>>2]|0;c[w>>2]=v;w=c[q>>2]|0;i=r;return w|0}if((c[c[o>>2]>>2]|0)<0){v=0;w=c[o>>2]|0;c[w>>2]=v;w=c[q>>2]|0;i=r;return w|0}v=c[c[o>>2]>>2]|0;w=c[o>>2]|0;c[w>>2]=v;w=c[q>>2]|0;i=r;return w|0}function Cg(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;f=i;i=i+16|0;e=f+4|0;d=f;c[e>>2]=a;c[d>>2]=b;i=f;return ((c[e>>2]|0)>(c[d>>2]|0)?c[e>>2]|0:c[d>>2]|0)|0}function Dg(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;h=i;i=i+48|0;f=h+40|0;q=h+36|0;p=h+32|0;j=h+28|0;l=h+24|0;k=h+20|0;g=h+16|0;m=h+12|0;n=h+8|0;o=h+4|0;e=h;c[q>>2]=a;c[p>>2]=b;c[j>>2]=d;b=c[q>>2]|0;c[l>>2]=(Eg((c[q>>2]|0)>0?b:0-b|0)|0)-1;c[n>>2]=c[q>>2]<<c[l>>2];b=c[p>>2]|0;c[k>>2]=(Eg((c[p>>2]|0)>0?b:0-b|0)|0)-1;c[o>>2]=c[p>>2]<<c[k>>2];c[m>>2]=536870911/(c[o>>2]>>16|0)|0;b=_(c[n>>2]>>16,(c[m>>2]&65535)<<16>>16)|0;c[e>>2]=b+((_(c[n>>2]&65535,(c[m>>2]&65535)<<16>>16)|0)>>16);b=c[n>>2]|0;a=c[o>>2]|0;d=c[e>>2]|0;d=yj(a|0,((a|0)<0)<<31>>31|0,d|0,((d|0)<0)<<31>>31|0)|0;d=nj(d|0,C|0,32)|0;c[n>>2]=b-(d<<3);d=_(c[n>>2]>>16,(c[m>>2]&65535)<<16>>16)|0;c[e>>2]=(c[e>>2]|0)+(d+((_(c[n>>2]&65535,(c[m>>2]&65535)<<16>>16)|0)>>16));c[g>>2]=29+(c[l>>2]|0)-(c[k>>2]|0)-(c[j>>2]|0);d=c[g>>2]|0;if((c[g>>2]|0)>=0)if((d|0)<32){c[f>>2]=c[e>>2]>>c[g>>2];q=c[f>>2]|0;i=h;return q|0}else{c[f>>2]=0;q=c[f>>2]|0;i=h;return q|0}a=c[e>>2]|0;b=0-(c[g>>2]|0)|0;do if((-2147483648>>0-d|0)>(2147483647>>0-(c[g>>2]|0)|0)){if((a|0)>(-2147483648>>b|0)){d=-2147483648>>0-(c[g>>2]|0);break}if((c[e>>2]|0)<(2147483647>>0-(c[g>>2]|0)|0)){d=2147483647>>0-(c[g>>2]|0);break}else{d=c[e>>2]|0;break}}else{if((a|0)>(2147483647>>b|0)){d=2147483647>>0-(c[g>>2]|0);break}if((c[e>>2]|0)<(-2147483648>>0-(c[g>>2]|0)|0)){d=-2147483648>>0-(c[g>>2]|0);break}else{d=c[e>>2]|0;break}}while(0);c[f>>2]=d<<0-(c[g>>2]|0);q=c[f>>2]|0;i=h;return q|0}function Eg(a){a=a|0;var b=0,d=0;d=i;i=i+16|0;b=d;c[b>>2]=a;if(!(c[b>>2]|0)){a=32;i=d;return a|0}a=32-(32-(aa(c[b>>2]|0)|0))|0;i=d;return a|0}function Fg(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;h=i;i=i+32|0;b=h+16|0;d=h+12|0;g=h+8|0;f=h+4|0;e=h;c[d>>2]=a;if((c[d>>2]|0)<=0){c[b>>2]=0;g=c[b>>2]|0;i=h;return g|0}Gg(c[d>>2]|0,f,e);if(c[f>>2]&1|0)c[g>>2]=32768;else c[g>>2]=46214;c[g>>2]=c[g>>2]>>(c[f>>2]>>1);a=_(c[g>>2]>>16,(((c[e>>2]&65535)<<16>>16)*213&65535)<<16>>16)|0;c[g>>2]=(c[g>>2]|0)+(a+((_(c[g>>2]&65535,(((c[e>>2]&65535)<<16>>16)*213&65535)<<16>>16)|0)>>16));c[b>>2]=c[g>>2];g=c[b>>2]|0;i=h;return g|0}function Gg(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;e=i;i=i+16|0;h=e+12|0;j=e+8|0;f=e+4|0;g=e;c[h>>2]=a;c[j>>2]=b;c[f>>2]=d;c[g>>2]=Eg(c[h>>2]|0)|0;c[c[j>>2]>>2]=c[g>>2];b=(Hg(c[h>>2]|0,24-(c[g>>2]|0)|0)|0)&127;c[c[f>>2]>>2]=b;i=e;return}function Hg(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0;k=i;i=i+32|0;e=k+20|0;d=k+16|0;f=k+12|0;j=k+8|0;h=k+4|0;g=k;c[d>>2]=a;c[f>>2]=b;c[j>>2]=c[d>>2];c[h>>2]=c[f>>2];c[g>>2]=0-(c[f>>2]|0);if(!(c[f>>2]|0)){c[e>>2]=c[d>>2];j=c[e>>2]|0;i=k;return j|0}d=c[j>>2]|0;if((c[f>>2]|0)<0){c[e>>2]=d<<c[g>>2]|(c[j>>2]|0)>>>(32-(c[g>>2]|0)|0);j=c[e>>2]|0;i=k;return j|0}else{c[e>>2]=d<<32-(c[h>>2]|0)|(c[j>>2]|0)>>>(c[h>>2]|0);j=c[e>>2]|0;i=k;return j|0}return 0}function Ig(d,e){d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;r=i;i=i+48|0;f=r+40|0;g=r+36|0;k=r+32|0;l=r+28|0;o=r+24|0;m=r+20|0;q=r+16|0;n=r+12|0;j=r+8|0;h=r+4|0;p=r;c[f>>2]=d;c[g>>2]=e;c[p>>2]=0;c[o>>2]=0;while(1){if((c[o>>2]|0)>=2)break;c[j>>2]=2147483647;c[k>>2]=0;a:while(1){if((c[k>>2]|0)>=15)break;c[m>>2]=b[24526+(c[k>>2]<<1)>>1];c[q>>2]=(((b[24526+((c[k>>2]|0)+1<<1)>>1]|0)-(c[m>>2]|0)>>16)*6554|0)+(((b[24526+((c[k>>2]|0)+1<<1)>>1]|0)-(c[m>>2]|0)&65535)*6554>>16);c[l>>2]=0;while(1){if((c[l>>2]|0)>=5)break;c[n>>2]=(c[m>>2]|0)+(_((c[q>>2]&65535)<<16>>16,((c[l>>2]<<1)+1&65535)<<16>>16)|0);d=(c[(c[f>>2]|0)+(c[o>>2]<<2)>>2]|0)-(c[n>>2]|0)|0;c[h>>2]=((c[(c[f>>2]|0)+(c[o>>2]<<2)>>2]|0)-(c[n>>2]|0)|0)>0?d:0-d|0;if((c[h>>2]|0)>=(c[j>>2]|0))break a;c[j>>2]=c[h>>2];c[p>>2]=c[n>>2];a[(c[g>>2]|0)+((c[o>>2]|0)*3|0)>>0]=c[k>>2];a[(c[g>>2]|0)+((c[o>>2]|0)*3|0)+1>>0]=c[l>>2];c[l>>2]=(c[l>>2]|0)+1}c[k>>2]=(c[k>>2]|0)+1}a[(c[g>>2]|0)+((c[o>>2]|0)*3|0)+2>>0]=(a[(c[g>>2]|0)+((c[o>>2]|0)*3|0)>>0]|0)/3|0;d=(c[g>>2]|0)+((c[o>>2]|0)*3|0)|0;a[d>>0]=(a[d>>0]|0)-((a[(c[g>>2]|0)+((c[o>>2]|0)*3|0)+2>>0]|0)*3|0);c[(c[f>>2]|0)+(c[o>>2]<<2)>>2]=c[p>>2];c[o>>2]=(c[o>>2]|0)+1}q=c[f>>2]|0;c[q>>2]=(c[q>>2]|0)-(c[(c[f>>2]|0)+4>>2]|0);i=r;return}function Jg(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;p=i;i=i+48|0;f=p+32|0;h=p+28|0;q=p+24|0;j=p+20|0;o=p+16|0;n=p+12|0;m=p+8|0;k=p+4|0;l=p;c[f>>2]=a;c[h>>2]=b;c[q>>2]=d;c[j>>2]=e;g[n>>2]=3.1415927410125732/+((c[j>>2]|0)+1|0);g[m>>2]=2.0-+g[n>>2]*+g[n>>2];if((c[q>>2]|0)<2){g[k>>2]=0.0;g[l>>2]=+g[n>>2]}else{g[k>>2]=1.0;g[l>>2]=+g[m>>2]*.5}c[o>>2]=0;while(1){if((c[o>>2]|0)>=(c[j>>2]|0))break;g[(c[f>>2]|0)+((c[o>>2]|0)+0<<2)>>2]=+g[(c[h>>2]|0)+((c[o>>2]|0)+0<<2)>>2]*.5*(+g[k>>2]+ +g[l>>2]);g[(c[f>>2]|0)+((c[o>>2]|0)+1<<2)>>2]=+g[(c[h>>2]|0)+((c[o>>2]|0)+1<<2)>>2]*+g[l>>2];g[k>>2]=+g[m>>2]*+g[l>>2]-+g[k>>2];g[(c[f>>2]|0)+((c[o>>2]|0)+2<<2)>>2]=+g[(c[h>>2]|0)+((c[o>>2]|0)+2<<2)>>2]*.5*(+g[l>>2]+ +g[k>>2]);g[(c[f>>2]|0)+((c[o>>2]|0)+3<<2)>>2]=+g[(c[h>>2]|0)+((c[o>>2]|0)+3<<2)>>2]*+g[k>>2];g[l>>2]=+g[m>>2]*+g[k>>2]-+g[l>>2];c[o>>2]=(c[o>>2]|0)+4}i=p;return}function Kg(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0.0;o=i;i=i+32|0;p=o+24|0;h=o+20|0;j=o+16|0;k=o+12|0;l=o+8|0;m=o+4|0;n=o;c[p>>2]=a;c[h>>2]=b;c[j>>2]=d;c[k>>2]=e;c[l>>2]=f;c[n>>2]=(c[p>>2]|0)+((c[k>>2]|0)-1<<2);c[m>>2]=0;while(1){if((c[m>>2]|0)>=(c[k>>2]|0))break;q=+Hh(c[n>>2]|0,c[h>>2]|0,c[j>>2]|0);g[(c[l>>2]|0)+(c[m>>2]<<2)>>2]=q;c[n>>2]=(c[n>>2]|0)+-4;c[m>>2]=(c[m>>2]|0)+1}i=o;return}function Lg(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;r=i;i=i+48|0;f=r+36|0;j=r+32|0;k=r+28|0;l=r+24|0;n=r+20|0;o=r+16|0;m=r;p=r+12|0;q=r+8|0;c[f>>2]=a;c[j>>2]=b;c[k>>2]=d;c[l>>2]=e;c[p>>2]=(c[f>>2]|0)+((c[k>>2]|0)-1<<2);h[m>>3]=+Gh(c[p>>2]|0,c[j>>2]|0);g[(c[l>>2]|0)+(0<<2)>>2]=+h[m>>3];c[n>>2]=1;while(1){if((c[n>>2]|0)>=(c[k>>2]|0))break;h[m>>3]=+h[m>>3]+(+g[(c[p>>2]|0)+(0-(c[n>>2]|0)<<2)>>2]*+g[(c[p>>2]|0)+(0-(c[n>>2]|0)<<2)>>2]-+g[(c[p>>2]|0)+((c[j>>2]|0)-(c[n>>2]|0)<<2)>>2]*+g[(c[p>>2]|0)+((c[j>>2]|0)-(c[n>>2]|0)<<2)>>2]);a=_(c[n>>2]|0,c[k>>2]|0)|0;g[(c[l>>2]|0)+(a+(c[n>>2]|0)<<2)>>2]=+h[m>>3];c[n>>2]=(c[n>>2]|0)+1}c[q>>2]=(c[f>>2]|0)+((c[k>>2]|0)-2<<2);c[o>>2]=1;while(1){if((c[o>>2]|0)>=(c[k>>2]|0))break;h[m>>3]=+Hh(c[p>>2]|0,c[q>>2]|0,c[j>>2]|0);g[(c[l>>2]|0)+((_(c[o>>2]|0,c[k>>2]|0)|0)+0<<2)>>2]=+h[m>>3];g[(c[l>>2]|0)+(0+(c[o>>2]|0)<<2)>>2]=+h[m>>3];c[n>>2]=1;while(1){if((c[n>>2]|0)>=((c[k>>2]|0)-(c[o>>2]|0)|0))break;h[m>>3]=+h[m>>3]+(+g[(c[p>>2]|0)+(0-(c[n>>2]|0)<<2)>>2]*+g[(c[q>>2]|0)+(0-(c[n>>2]|0)<<2)>>2]-+g[(c[p>>2]|0)+((c[j>>2]|0)-(c[n>>2]|0)<<2)>>2]*+g[(c[q>>2]|0)+((c[j>>2]|0)-(c[n>>2]|0)<<2)>>2]);a=_((c[o>>2]|0)+(c[n>>2]|0)|0,c[k>>2]|0)|0;g[(c[l>>2]|0)+(a+(c[n>>2]|0)<<2)>>2]=+h[m>>3];a=_(c[n>>2]|0,c[k>>2]|0)|0;g[(c[l>>2]|0)+(a+((c[o>>2]|0)+(c[n>>2]|0))<<2)>>2]=+h[m>>3];c[n>>2]=(c[n>>2]|0)+1}c[q>>2]=(c[q>>2]|0)+-4;c[o>>2]=(c[o>>2]|0)+1}i=r;return}function Mg(b){b=b|0;var d=0,e=0;e=i;i=i+16|0;d=e;c[d>>2]=b;We(c[d>>2]|0,(c[d>>2]|0)+5128+2|0)|0;b=c[d>>2]|0;if((c[(c[d>>2]|0)+4556>>2]|0)>=13){c[b+6116>>2]=0;c[(c[d>>2]|0)+6112>>2]=0;a[(c[d>>2]|0)+4768+29>>0]=1;a[(c[d>>2]|0)+4752+(c[(c[d>>2]|0)+5780>>2]|0)>>0]=1;i=e;return}a[b+4768+29>>0]=0;b=(c[d>>2]|0)+6116|0;c[b>>2]=(c[b>>2]|0)+1;b=c[d>>2]|0;if((c[(c[d>>2]|0)+6116>>2]|0)>=10){if((c[b+6116>>2]|0)>30){c[(c[d>>2]|0)+6116>>2]=10;c[(c[d>>2]|0)+6112>>2]=0}}else c[b+6112>>2]=0;a[(c[d>>2]|0)+4752+(c[(c[d>>2]|0)+5780>>2]|0)>>0]=0;i=e;return}function Ng(d,e,f,h,j,k){d=d|0;e=e|0;f=f|0;h=h|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0;X=i;i=i+15152|0;o=X+13856|0;p=X+13852|0;q=X+13848|0;r=X+13844|0;s=X+13840|0;t=X+13836|0;u=X+13832|0;Q=X+12920|0;I=X+12916|0;J=X+12912|0;K=X+12908|0;A=X+12904|0;z=X+12900|0;P=X+12896|0;n=X+12892|0;m=X+12888|0;W=X+11608|0;l=X+8920|0;T=X+8872|0;U=X+8824|0;R=X+4444|0;S=X+64|0;V=X+60|0;L=X+56|0;M=X+52|0;N=X+48|0;C=X+44|0;D=X+40|0;F=X+36|0;G=X+32|0;H=X+28|0;B=X+13862|0;x=X+13860|0;y=X+24|0;v=X+15139|0;O=X+8|0;w=X+13864|0;E=X;c[p>>2]=d;c[q>>2]=e;c[r>>2]=f;c[s>>2]=h;c[t>>2]=j;c[u>>2]=k;c[P>>2]=0;c[D>>2]=0;c[C>>2]=0;c[N>>2]=0;c[M>>2]=0;a[v>>0]=0;f=(c[p>>2]|0)+4644|0;k=c[f>>2]|0;c[f>>2]=k+1;a[(c[p>>2]|0)+4768+34>>0]=k&3;c[n>>2]=(c[p>>2]|0)+9356+(c[(c[p>>2]|0)+4616>>2]<<2);c[m>>2]=l+(c[(c[p>>2]|0)+4616>>2]<<2);ee((c[p>>2]|0)+16|0,(c[p>>2]|0)+5128+2|0,c[(c[p>>2]|0)+4608>>2]|0);Og((c[n>>2]|0)+((c[(c[p>>2]|0)+4600>>2]|0)*5<<2)|0,(c[p>>2]|0)+5128+2|0,c[(c[p>>2]|0)+4608>>2]|0);c[I>>2]=0;while(1){if((c[I>>2]|0)>=8)break;k=((c[(c[p>>2]|0)+4600>>2]|0)*5|0)+(_(c[I>>2]|0,c[(c[p>>2]|0)+4608>>2]>>3)|0)|0;k=(c[n>>2]|0)+(k<<2)|0;g[k>>2]=+g[k>>2]+ +(1-(c[I>>2]&2)|0)*9.999999974752427e-07;c[I>>2]=(c[I>>2]|0)+1}a:do if(!(c[(c[p>>2]|0)+4712>>2]|0)){Xg(c[p>>2]|0,Q,l,c[n>>2]|0,c[(c[p>>2]|0)+5124>>2]|0);fh(c[p>>2]|0,Q,c[m>>2]|0,c[n>>2]|0);Yg(c[p>>2]|0,Q,l,c[n>>2]|0,c[s>>2]|0);nh(c[p>>2]|0,Q,c[s>>2]|0);kh(c[p>>2]|0,Q,W,c[n>>2]|0);Pg(c[p>>2]|0,Q,W,c[s>>2]|0);c[K>>2]=6;b[B>>1]=256;c[z>>2]=0;c[A>>2]=0;c[F>>2]=ce((c[p>>2]|0)+4768|0,c[(c[p>>2]|0)+4604>>2]|0)|0;c[G>>2]=-1;c[H>>2]=-1;h=T;j=c[r>>2]|0;e=h+48|0;do{c[h>>2]=c[j>>2];h=h+4|0;j=j+4|0}while((h|0)<(e|0));pj(R|0,(c[p>>2]|0)+144|0,4380)|0;c[V>>2]=a[(c[p>>2]|0)+4768+34>>0];b[x>>1]=b[(c[p>>2]|0)+5804>>1]|0;c[y>>2]=c[(c[p>>2]|0)+5800>>2];c[J>>2]=0;while(1){do if((c[F>>2]|0)!=(c[G>>2]|0)){if((c[F>>2]|0)==(c[H>>2]|0)){c[L>>2]=c[N>>2];break}if((c[J>>2]|0)>0){h=c[r>>2]|0;j=T;e=h+48|0;do{c[h>>2]=c[j>>2];h=h+4|0;j=j+4|0}while((h|0)<(e|0));pj((c[p>>2]|0)+144|0,R|0,4380)|0;a[(c[p>>2]|0)+4768+34>>0]=c[V>>2];b[(c[p>>2]|0)+5804>>1]=b[x>>1]|0;c[(c[p>>2]|0)+5800>>2]=c[y>>2]}Bh(c[p>>2]|0,Q,(c[p>>2]|0)+4768|0,(c[p>>2]|0)+144|0,(c[p>>2]|0)+4804|0,W);Xd(c[p>>2]|0,c[r>>2]|0,c[(c[p>>2]|0)+5780>>2]|0,0,c[s>>2]|0);Yd(c[r>>2]|0,a[(c[p>>2]|0)+4768+29>>0]|0,a[(c[p>>2]|0)+4768+30>>0]|0,(c[p>>2]|0)+4804|0,c[(c[p>>2]|0)+4608>>2]|0);c[L>>2]=Rg(c[r>>2]|0)|0;if((c[u>>2]|0)==0&(c[J>>2]|0)==0?(c[L>>2]|0)<=(c[t>>2]|0):0)break a}else c[L>>2]=c[M>>2];while(0);if((c[J>>2]|0)==(c[K>>2]|0))break;do if((c[L>>2]|0)>(c[t>>2]|0))if((c[z>>2]|0)==0&(c[J>>2]|0)>=2){n=Q+852|0;g[n>>2]=+g[n>>2]*1.5;c[A>>2]=0;c[H>>2]=-1;break}else{c[A>>2]=1;c[N>>2]=c[L>>2];c[D>>2]=b[B>>1];c[H>>2]=c[F>>2];break}else{if((c[L>>2]|0)>=((c[t>>2]|0)-5|0))break a;c[z>>2]=1;c[M>>2]=c[L>>2];c[C>>2]=b[B>>1];if((c[F>>2]|0)!=(c[G>>2]|0)){c[G>>2]=c[F>>2];h=U;j=c[r>>2]|0;e=h+48|0;do{c[h>>2]=c[j>>2];h=h+4|0;j=j+4|0}while((h|0)<(e|0));pj(w|0,c[c[r>>2]>>2]|0,c[(c[r>>2]|0)+24>>2]|0)|0;pj(S|0,(c[p>>2]|0)+144|0,4380)|0;a[v>>0]=a[(c[p>>2]|0)+7200>>0]|0}}while(0);do if(c[z>>2]&c[A>>2]){n=_((c[D>>2]|0)-(c[C>>2]|0)|0,(c[t>>2]|0)-(c[M>>2]|0)|0)|0;b[B>>1]=(c[C>>2]|0)+((n|0)/((c[N>>2]|0)-(c[M>>2]|0)|0)|0);if((b[B>>1]|0)>((c[C>>2]|0)+((c[D>>2]|0)-(c[C>>2]|0)>>2)|0)){b[B>>1]=(c[C>>2]|0)+((c[D>>2]|0)-(c[C>>2]|0)>>2);break}if((b[B>>1]|0)<((c[D>>2]|0)-((c[D>>2]|0)-(c[C>>2]|0)>>2)|0))b[B>>1]=(c[D>>2]|0)-((c[D>>2]|0)-(c[C>>2]|0)>>2)}else{c[E>>2]=Wf((((c[L>>2]|0)-(c[t>>2]|0)<<7|0)/(c[(c[p>>2]|0)+4608>>2]|0)|0)+2048|0)|0;c[E>>2]=Sg(c[E>>2]|0,131072)|0;if((c[L>>2]|0)>(c[t>>2]|0))c[E>>2]=Tg(c[E>>2]|0,85197)|0;n=_(c[E>>2]>>16,b[B>>1]|0)|0;b[B>>1]=n+((_(c[E>>2]&65535,b[B>>1]|0)|0)>>16)}while(0);c[I>>2]=0;while(1){if((c[I>>2]|0)>=(c[(c[p>>2]|0)+4604>>2]|0))break;n=_(c[Q+892+(c[I>>2]<<2)>>2]>>16,b[B>>1]|0)|0;if((n+((_(c[Q+892+(c[I>>2]<<2)>>2]&65535,b[B>>1]|0)|0)>>16)|0)<=8388607){n=_(c[Q+892+(c[I>>2]<<2)>>2]>>16,b[B>>1]|0)|0;if((n+((_(c[Q+892+(c[I>>2]<<2)>>2]&65535,b[B>>1]|0)|0)>>16)|0)<-8388608)h=-8388608;else{h=_(c[Q+892+(c[I>>2]<<2)>>2]>>16,b[B>>1]|0)|0;h=h+((_(c[Q+892+(c[I>>2]<<2)>>2]&65535,b[B>>1]|0)|0)>>16)|0}}else h=8388607;c[O+(c[I>>2]<<2)>>2]=h<<8;c[I>>2]=(c[I>>2]|0)+1}a[(c[p>>2]|0)+7200>>0]=a[Q+908>>0]|0;_d((c[p>>2]|0)+4768|0,O,(c[p>>2]|0)+7200|0,(c[s>>2]|0)==2&1,c[(c[p>>2]|0)+4604>>2]|0);c[F>>2]=ce((c[p>>2]|0)+4768|0,c[(c[p>>2]|0)+4604>>2]|0)|0;c[I>>2]=0;while(1){if((c[I>>2]|0)>=(c[(c[p>>2]|0)+4604>>2]|0))break;g[Q+(c[I>>2]<<2)>>2]=+(c[O+(c[I>>2]<<2)>>2]|0)/65536.0;c[I>>2]=(c[I>>2]|0)+1}c[J>>2]=(c[J>>2]|0)+1}if(c[z>>2]|0){if((c[F>>2]|0)!=(c[G>>2]|0)?(c[L>>2]|0)<=(c[t>>2]|0):0)break;h=c[r>>2]|0;j=U;e=h+48|0;do{c[h>>2]=c[j>>2];h=h+4|0;j=j+4|0}while((h|0)<(e|0));pj(c[c[r>>2]>>2]|0,w|0,c[U+24>>2]|0)|0;pj((c[p>>2]|0)+144|0,S|0,4380)|0;a[(c[p>>2]|0)+7200>>0]=a[v>>0]|0}}while(0);qj((c[p>>2]|0)+9356|0,(c[p>>2]|0)+9356+(c[(c[p>>2]|0)+4608>>2]<<2)|0,(c[(c[p>>2]|0)+4616>>2]|0)+((c[(c[p>>2]|0)+4600>>2]|0)*5|0)<<2|0)|0;if(c[(c[p>>2]|0)+4712>>2]|0){c[c[q>>2]>>2]=0;c[o>>2]=c[P>>2];W=c[o>>2]|0;i=X;return W|0}else{c[(c[p>>2]|0)+4568>>2]=c[Q+228+((c[(c[p>>2]|0)+4604>>2]|0)-1<<2)>>2];a[(c[p>>2]|0)+4565>>0]=a[(c[p>>2]|0)+4768+29>>0]|0;c[(c[p>>2]|0)+4696>>2]=0;W=(Rg(c[r>>2]|0)|0)+7>>3;c[c[q>>2]>>2]=W;c[o>>2]=c[P>>2];W=c[o>>2]|0;i=X;return W|0}return 0}function Og(a,d,e){a=a|0;d=d|0;e=e|0;var f=0,h=0,j=0,k=0,l=0;k=i;i=i+16|0;f=k+12|0;h=k+8|0;l=k+4|0;j=k;c[f>>2]=a;c[h>>2]=d;c[l>>2]=e;c[j>>2]=(c[l>>2]|0)-1;while(1){if((c[j>>2]|0)<0)break;g[(c[f>>2]|0)+(c[j>>2]<<2)>>2]=+(b[(c[h>>2]|0)+(c[j>>2]<<1)>>1]|0);c[j>>2]=(c[j>>2]|0)+-1}i=k;return}function Pg(d,e,f,h){d=d|0;e=e|0;f=f|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;s=i;i=i+4448|0;j=s+4432|0;k=s+4428|0;l=s+4424|0;m=s+4420|0;p=s+4416|0;n=s+4400|0;o=s+4384|0;q=s+4380|0;r=s;c[j>>2]=d;c[k>>2]=e;c[l>>2]=f;c[m>>2]=h;c[q>>2]=(c[j>>2]|0)+6132+((c[(c[j>>2]|0)+5780>>2]|0)*36|0);if(!(c[(c[j>>2]|0)+6124>>2]|0)){i=s;return}if((c[(c[j>>2]|0)+4556>>2]|0)<=77){i=s;return}c[(c[j>>2]|0)+4756+(c[(c[j>>2]|0)+5780>>2]<<2)>>2]=1;pj(r|0,(c[j>>2]|0)+144|0,4380)|0;h=c[q>>2]|0;d=(c[j>>2]|0)+4768|0;e=h+36|0;do{b[h>>1]=b[d>>1]|0;h=h+2|0;d=d+2|0}while((h|0)<(e|0));pj(o|0,c[k>>2]|0,c[(c[j>>2]|0)+4604>>2]<<2|0)|0;if(!((c[(c[j>>2]|0)+5780>>2]|0)!=0?(c[(c[j>>2]|0)+4756+((c[(c[j>>2]|0)+5780>>2]|0)-1<<2)>>2]|0)!=0:0)){a[(c[j>>2]|0)+4564>>0]=a[(c[j>>2]|0)+7200>>0]|0;f=c[q>>2]|0;a[f>>0]=(a[f>>0]|0)+(c[(c[j>>2]|0)+6128>>2]|0);f=(Qg(a[c[q>>2]>>0]|0,63)|0)&255;a[c[q>>2]>>0]=f}ae(n,c[q>>2]|0,(c[j>>2]|0)+4564|0,(c[m>>2]|0)==2&1,c[(c[j>>2]|0)+4604>>2]|0);c[p>>2]=0;while(1){if((c[p>>2]|0)>=(c[(c[j>>2]|0)+4604>>2]|0))break;g[(c[k>>2]|0)+(c[p>>2]<<2)>>2]=+(c[n+(c[p>>2]<<2)>>2]|0)*.0000152587890625;c[p>>2]=(c[p>>2]|0)+1}Bh(c[j>>2]|0,c[k>>2]|0,c[q>>2]|0,r,(c[j>>2]|0)+6240+((c[(c[j>>2]|0)+5780>>2]|0)*320|0)|0,c[l>>2]|0);pj(c[k>>2]|0,o|0,c[(c[j>>2]|0)+4604>>2]<<2|0)|0;i=s;return}function Qg(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;f=i;i=i+16|0;e=f+4|0;d=f;c[e>>2]=a;c[d>>2]=b;i=f;return ((c[e>>2]|0)<(c[d>>2]|0)?c[e>>2]|0:c[d>>2]|0)|0}function Rg(a){a=a|0;var b=0,d=0;b=i;i=i+16|0;d=b;c[d>>2]=a;a=(c[(c[d>>2]|0)+20>>2]|0)-(32-(aa(c[(c[d>>2]|0)+28>>2]|0)|0))|0;i=b;return a|0}function Sg(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;f=i;i=i+16|0;e=f+4|0;d=f;c[e>>2]=a;c[d>>2]=b;i=f;return ((c[e>>2]|0)<(c[d>>2]|0)?c[e>>2]|0:c[d>>2]|0)|0}function Tg(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;f=i;i=i+16|0;e=f+4|0;d=f;c[e>>2]=a;c[d>>2]=b;i=f;return ((c[e>>2]|0)>(c[d>>2]|0)?c[e>>2]|0:c[d>>2]|0)|0}function Ug(b,d,e,f){b=b|0;d=d|0;e=e|0;f=+f;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;v=i;i=i+1744|0;j=v+1700|0;k=v+1696|0;l=v+1692|0;h=v+1688|0;q=v+1684|0;u=v+1680|0;o=v+1616|0;r=v+1608|0;s=v+1604|0;t=v+1600|0;n=v+1704|0;p=v+1536|0;m=v;c[j>>2]=b;c[k>>2]=d;c[l>>2]=e;g[h>>2]=f;c[u>>2]=(c[(c[j>>2]|0)+4612>>2]|0)+(c[(c[j>>2]|0)+4664>>2]|0);a[(c[j>>2]|0)+4768+31>>0]=4;g[r>>2]=+Eh(o,c[l>>2]|0,+g[h>>2],c[u>>2]|0,c[(c[j>>2]|0)+4604>>2]|0,c[(c[j>>2]|0)+4664>>2]|0);a:do if((c[(c[j>>2]|0)+4656>>2]|0?(c[(c[j>>2]|0)+4696>>2]|0)==0:0)?(c[(c[j>>2]|0)+4604>>2]|0)==4:0){f=+Eh(p,(c[l>>2]|0)+(c[u>>2]<<1<<2)|0,+g[h>>2],c[u>>2]|0,2,c[(c[j>>2]|0)+4664>>2]|0);g[r>>2]=+g[r>>2]-f;xh(c[k>>2]|0,p,c[(c[j>>2]|0)+4664>>2]|0);g[s>>2]=3402823466385288598117041.0e14;c[q>>2]=3;while(1){if((c[q>>2]|0)<0)break a;de(n,(c[j>>2]|0)+4524|0,c[k>>2]|0,c[q>>2]|0,c[(c[j>>2]|0)+4664>>2]|0);zh(p,n,c[(c[j>>2]|0)+4664>>2]|0);Zg(m,p,c[l>>2]|0,c[u>>2]<<1,c[(c[j>>2]|0)+4664>>2]|0);f=+Gh(m+(c[(c[j>>2]|0)+4664>>2]<<2)|0,(c[u>>2]|0)-(c[(c[j>>2]|0)+4664>>2]|0)|0);g[t>>2]=f+ +Gh(m+(c[(c[j>>2]|0)+4664>>2]<<2)+(c[u>>2]<<2)|0,(c[u>>2]|0)-(c[(c[j>>2]|0)+4664>>2]|0)|0);f=+g[t>>2];if(!(+g[t>>2]<+g[r>>2])){if(f>+g[s>>2])break a}else{g[r>>2]=f;a[(c[j>>2]|0)+4768+31>>0]=c[q>>2]}g[s>>2]=+g[t>>2];c[q>>2]=(c[q>>2]|0)+-1}}while(0);if((a[(c[j>>2]|0)+4768+31>>0]|0)!=4){i=v;return}xh(c[k>>2]|0,o,c[(c[j>>2]|0)+4664>>2]|0);i=v;return}function Vg(a,b,d,e,f,h,j,k,l){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;j=j|0;k=k|0;l=l|0;var m=0.0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0;L=i;i=i+192|0;n=L+188|0;O=L+184|0;o=L+180|0;N=L+176|0;p=L+172|0;q=L+168|0;r=L+164|0;B=L+160|0;M=L+156|0;G=L+152|0;H=L+148|0;C=L+144|0;J=L+140|0;v=L+136|0;t=L+132|0;s=L+128|0;D=L+112|0;I=L+104|0;F=L+100|0;E=L+80|0;K=L+64|0;x=L+48|0;z=L+44|0;u=L+24|0;A=L+8|0;y=L+4|0;w=L;c[n>>2]=a;c[O>>2]=b;c[o>>2]=d;c[N>>2]=e;c[p>>2]=f;c[q>>2]=h;c[r>>2]=j;c[B>>2]=k;c[M>>2]=l;c[C>>2]=c[n>>2];c[v>>2]=c[O>>2];c[y>>2]=(c[N>>2]|0)+(c[M>>2]<<2);c[H>>2]=0;while(1){if((c[H>>2]|0)>=(c[B>>2]|0))break;c[w>>2]=(c[y>>2]|0)+(0-((c[(c[p>>2]|0)+(c[H>>2]<<2)>>2]|0)+2)<<2);Lg(c[w>>2]|0,c[r>>2]|0,5,c[v>>2]|0);Kg(c[w>>2]|0,c[y>>2]|0,c[r>>2]|0,5,u);m=+Gh(c[y>>2]|0,c[r>>2]|0);g[A+(c[H>>2]<<2)>>2]=m;g[z>>2]=+g[A+(c[H>>2]<<2)>>2]+1.0+ +g[c[v>>2]>>2]+ +g[(c[v>>2]|0)+96>>2];g[z>>2]=+g[z>>2]*.01666666753590107;ph(c[v>>2]|0,A+(c[H>>2]<<2)|0,+g[z>>2],5);sh(c[v>>2]|0,5,u,c[C>>2]|0);m=+qh(c[C>>2]|0,c[v>>2]|0,u,+g[A+(c[H>>2]<<2)>>2],5);g[x+(c[H>>2]<<2)>>2]=m;g[J>>2]=+g[(c[q>>2]|0)+(c[H>>2]<<2)>>2]/(+g[x+(c[H>>2]<<2)>>2]*+g[(c[q>>2]|0)+(c[H>>2]<<2)>>2]+ +(c[r>>2]|0)*.009999999776482582);Uh(c[v>>2]|0,+g[J>>2],25);g[K+(c[H>>2]<<2)>>2]=+g[(c[v>>2]|0)+48>>2];c[y>>2]=(c[y>>2]|0)+(c[r>>2]<<2);c[C>>2]=(c[C>>2]|0)+20;c[v>>2]=(c[v>>2]|0)+100;c[H>>2]=(c[H>>2]|0)+1}if(c[o>>2]|0){g[s>>2]=9.999999974752427e-07;g[t>>2]=0.0;c[H>>2]=0;while(1){if((c[H>>2]|0)>=(c[B>>2]|0))break;g[t>>2]=+g[t>>2]+ +g[A+(c[H>>2]<<2)>>2]*+g[(c[q>>2]|0)+(c[H>>2]<<2)>>2];g[s>>2]=+g[s>>2]+ +g[x+(c[H>>2]<<2)>>2]*+g[(c[q>>2]|0)+(c[H>>2]<<2)>>2];c[H>>2]=(c[H>>2]|0)+1}m=+Wg(+g[t>>2]/+g[s>>2])*3.0;g[c[o>>2]>>2]=m}c[C>>2]=c[n>>2];c[H>>2]=0;while(1){if((c[H>>2]|0)>=(c[B>>2]|0))break;g[D+(c[H>>2]<<2)>>2]=0.0;c[G>>2]=0;while(1){if((c[G>>2]|0)>=5)break;O=D+(c[H>>2]<<2)|0;g[O>>2]=+g[O>>2]+ +g[(c[C>>2]|0)+(c[G>>2]<<2)>>2];c[G>>2]=(c[G>>2]|0)+1}c[C>>2]=(c[C>>2]|0)+20;c[H>>2]=(c[H>>2]|0)+1}g[J>>2]=1.0000000474974513e-03;c[H>>2]=0;while(1){if((c[H>>2]|0)>=(c[B>>2]|0))break;g[J>>2]=+g[J>>2]+ +g[K+(c[H>>2]<<2)>>2];c[H>>2]=(c[H>>2]|0)+1}g[I>>2]=0.0;c[H>>2]=0;while(1){if((c[H>>2]|0)>=(c[B>>2]|0))break;g[I>>2]=+g[I>>2]+ +g[D+(c[H>>2]<<2)>>2]*+g[K+(c[H>>2]<<2)>>2];c[H>>2]=(c[H>>2]|0)+1}g[I>>2]=+g[I>>2]/+g[J>>2];c[C>>2]=c[n>>2];c[H>>2]=0;while(1){if((c[H>>2]|0)>=(c[B>>2]|0))break;g[F>>2]=.10000000149011612/(+g[K+(c[H>>2]<<2)>>2]+.10000000149011612)*(+g[I>>2]-+g[D+(c[H>>2]<<2)>>2]);g[J>>2]=0.0;c[G>>2]=0;while(1){if((c[G>>2]|0)>=5)break;if(+g[(c[C>>2]|0)+(c[G>>2]<<2)>>2]>.10000000149011612)m=+g[(c[C>>2]|0)+(c[G>>2]<<2)>>2];else m=.10000000149011612;g[E+(c[G>>2]<<2)>>2]=m;g[J>>2]=+g[J>>2]+ +g[E+(c[G>>2]<<2)>>2];c[G>>2]=(c[G>>2]|0)+1}g[J>>2]=+g[F>>2]/+g[J>>2];c[G>>2]=0;while(1){if((c[G>>2]|0)>=5)break;g[(c[C>>2]|0)+(c[G>>2]<<2)>>2]=+g[(c[C>>2]|0)+(c[G>>2]<<2)>>2]+ +g[E+(c[G>>2]<<2)>>2]*+g[J>>2];c[G>>2]=(c[G>>2]|0)+1}c[C>>2]=(c[C>>2]|0)+20;c[H>>2]=(c[H>>2]|0)+1}i=L;return}function Wg(a){a=+a;var b=0,c=0;b=i;i=i+16|0;c=b;h[c>>3]=a;a=+hj(+h[c>>3])*3.32192809488736;i=b;return +a}function Xg(d,e,f,h,j){d=d|0;e=e|0;f=f|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;p=i;i=i+1792|0;k=p+1776|0;l=p+1772|0;m=p+1768|0;z=p+1764|0;n=p+1760|0;q=p+1756|0;o=p+1752|0;u=p+1748|0;x=p+1744|0;r=p+1740|0;v=p+1672|0;s=p+1608|0;t=p+1544|0;w=p+8|0;y=p;c[k>>2]=d;c[l>>2]=e;c[m>>2]=f;c[z>>2]=h;c[n>>2]=j;c[q>>2]=(c[(c[k>>2]|0)+4620>>2]|0)+(c[(c[k>>2]|0)+4608>>2]|0)+(c[(c[k>>2]|0)+4616>>2]|0);c[r>>2]=(c[z>>2]|0)+(0-(c[(c[k>>2]|0)+4616>>2]|0)<<2);c[x>>2]=(c[r>>2]|0)+(c[q>>2]<<2)+(0-(c[(c[k>>2]|0)+4572>>2]|0)<<2);c[y>>2]=w;Jg(c[y>>2]|0,c[x>>2]|0,1,c[(c[k>>2]|0)+4620>>2]|0);c[y>>2]=(c[y>>2]|0)+(c[(c[k>>2]|0)+4620>>2]<<2);c[x>>2]=(c[x>>2]|0)+(c[(c[k>>2]|0)+4620>>2]<<2);pj(c[y>>2]|0,c[x>>2]|0,(c[(c[k>>2]|0)+4572>>2]|0)-(c[(c[k>>2]|0)+4620>>2]<<1)<<2|0)|0;c[y>>2]=(c[y>>2]|0)+((c[(c[k>>2]|0)+4572>>2]|0)-(c[(c[k>>2]|0)+4620>>2]<<1)<<2);c[x>>2]=(c[x>>2]|0)+((c[(c[k>>2]|0)+4572>>2]|0)-(c[(c[k>>2]|0)+4620>>2]<<1)<<2);Jg(c[y>>2]|0,c[x>>2]|0,2,c[(c[k>>2]|0)+4620>>2]|0);Dh(v,w,c[(c[k>>2]|0)+4572>>2]|0,(c[(c[k>>2]|0)+4672>>2]|0)+1|0);g[v>>2]=+g[v>>2]+(+g[v>>2]*1.0000000474974513e-03+1.0);g[u>>2]=+Vh(t,v,c[(c[k>>2]|0)+4672>>2]|0);g[(c[l>>2]|0)+868>>2]=+g[v>>2]/(+g[u>>2]>1.0?+g[u>>2]:1.0);Ih(s,t,c[(c[k>>2]|0)+4672>>2]|0);Fh(s,c[(c[k>>2]|0)+4672>>2]|0,.9900000095367432);Zg(c[m>>2]|0,s,c[r>>2]|0,c[q>>2]|0,c[(c[k>>2]|0)+4672>>2]|0);if(a[(c[k>>2]|0)+4768+29>>0]|0?(c[(c[k>>2]|0)+4696>>2]|0)==0:0){g[o>>2]=.6000000238418579;g[o>>2]=+g[o>>2]-+(c[(c[k>>2]|0)+4672>>2]|0)*.004000000189989805;g[o>>2]=+g[o>>2]-+(c[(c[k>>2]|0)+4556>>2]|0)*.10000000149011612*.00390625;g[o>>2]=+g[o>>2]-+(a[(c[k>>2]|0)+4565>>0]>>1|0)*.15000000596046448;g[o>>2]=+g[o>>2]-+(c[(c[k>>2]|0)+4744>>2]|0)*.10000000149011612*.000030517578125;z=(Lh(c[m>>2]|0,(c[l>>2]|0)+228|0,(c[k>>2]|0)+4768+26|0,(c[k>>2]|0)+4768+28|0,(c[k>>2]|0)+12236|0,c[(c[k>>2]|0)+4568>>2]|0,+(c[(c[k>>2]|0)+4676>>2]|0)/65536.0,+g[o>>2],c[(c[k>>2]|0)+4600>>2]|0,c[(c[k>>2]|0)+4668>>2]|0,c[(c[k>>2]|0)+4604>>2]|0,c[n>>2]|0)|0)==0;k=(c[k>>2]|0)+4768+29|0;if(z){a[k>>0]=2;i=p;return}else{a[k>>0]=1;i=p;return}}z=(c[l>>2]|0)+228|0;c[z>>2]=0;c[z+4>>2]=0;c[z+8>>2]=0;c[z+12>>2]=0;b[(c[k>>2]|0)+4768+26>>1]=0;a[(c[k>>2]|0)+4768+28>>0]=0;g[(c[k>>2]|0)+12236>>2]=0.0;i=p;return}function Yg(d,e,f,h,j){d=d|0;e=e|0;f=f|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0.0;y=i;i=i+2048|0;l=y+2004|0;m=y+2e3|0;n=y+1996|0;o=y+1992|0;p=y+1988|0;t=y+1984|0;r=y+1584|0;u=y+1568|0;s=y+1552|0;k=y+2008|0;x=y+1548|0;w=y+1544|0;q=y+8|0;v=y;c[l>>2]=d;c[m>>2]=e;c[n>>2]=f;c[o>>2]=h;c[p>>2]=j;c[t>>2]=0;while(1){if((c[t>>2]|0)>=(c[(c[l>>2]|0)+4604>>2]|0))break;g[u+(c[t>>2]<<2)>>2]=1.0/+g[(c[m>>2]|0)+(c[t>>2]<<2)>>2];g[s+(c[t>>2]<<2)>>2]=+g[u+(c[t>>2]<<2)>>2]*+g[u+(c[t>>2]<<2)>>2];c[t>>2]=(c[t>>2]|0)+1}if((a[(c[l>>2]|0)+4768+29>>0]|0)==2){Vg((c[m>>2]|0)+144|0,r,(c[m>>2]|0)+872|0,c[n>>2]|0,(c[m>>2]|0)+228|0,s,c[(c[l>>2]|0)+4612>>2]|0,c[(c[l>>2]|0)+4604>>2]|0,c[(c[l>>2]|0)+4616>>2]|0);Ch((c[m>>2]|0)+144|0,(c[l>>2]|0)+4768+4|0,(c[l>>2]|0)+4768+32|0,(c[l>>2]|0)+4688|0,r,c[(c[l>>2]|0)+4684>>2]|0,c[(c[l>>2]|0)+4680>>2]|0,c[(c[l>>2]|0)+4604>>2]|0,c[(c[l>>2]|0)+5124>>2]|0);eh(c[l>>2]|0,c[m>>2]|0,c[p>>2]|0);dh(q,(c[o>>2]|0)+(0-(c[(c[l>>2]|0)+4664>>2]|0)<<2)|0,(c[m>>2]|0)+144|0,(c[m>>2]|0)+228|0,u,c[(c[l>>2]|0)+4612>>2]|0,c[(c[l>>2]|0)+4604>>2]|0,c[(c[l>>2]|0)+4664>>2]|0)}else{c[x>>2]=(c[o>>2]|0)+(0-(c[(c[l>>2]|0)+4664>>2]|0)<<2);c[w>>2]=q;c[t>>2]=0;while(1){if((c[t>>2]|0)>=(c[(c[l>>2]|0)+4604>>2]|0))break;Th(c[w>>2]|0,c[x>>2]|0,+g[u+(c[t>>2]<<2)>>2],(c[(c[l>>2]|0)+4612>>2]|0)+(c[(c[l>>2]|0)+4664>>2]|0)|0);c[w>>2]=(c[w>>2]|0)+((c[(c[l>>2]|0)+4612>>2]|0)+(c[(c[l>>2]|0)+4664>>2]|0)<<2);c[x>>2]=(c[x>>2]|0)+(c[(c[l>>2]|0)+4612>>2]<<2);c[t>>2]=(c[t>>2]|0)+1}oj((c[m>>2]|0)+144|0,0,(c[(c[l>>2]|0)+4604>>2]|0)*5<<2|0)|0;g[(c[m>>2]|0)+872>>2]=0.0;c[(c[l>>2]|0)+4688>>2]=0}if(c[(c[l>>2]|0)+4696>>2]|0){g[v>>2]=.009999999776482582;h=c[l>>2]|0;z=+g[v>>2];Ug(h,k,q,z);h=c[l>>2]|0;f=c[m>>2]|0;f=f+16|0;e=c[l>>2]|0;e=e+4524|0;Ah(h,f,k,e);e=c[m>>2]|0;e=e+876|0;f=c[m>>2]|0;f=f+16|0;h=c[m>>2]|0;w=c[l>>2]|0;w=w+4612|0;w=c[w>>2]|0;x=c[l>>2]|0;x=x+4604|0;x=c[x>>2]|0;m=c[l>>2]|0;m=m+4664|0;m=c[m>>2]|0;rh(e,q,f,h,w,x,m);m=c[l>>2]|0;m=m+4524|0;l=m+32|0;do{b[m>>1]=b[k>>1]|0;m=m+2|0;k=k+2|0}while((m|0)<(l|0));i=y;return}else{g[v>>2]=+P(2.0,+(+g[(c[m>>2]|0)+872>>2]/3.0))/1.0e4;g[v>>2]=+g[v>>2]/(+g[(c[m>>2]|0)+860>>2]*.75+.25);h=c[l>>2]|0;z=+g[v>>2];Ug(h,k,q,z);h=c[l>>2]|0;f=c[m>>2]|0;f=f+16|0;e=c[l>>2]|0;e=e+4524|0;Ah(h,f,k,e);e=c[m>>2]|0;e=e+876|0;f=c[m>>2]|0;f=f+16|0;h=c[m>>2]|0;w=c[l>>2]|0;w=w+4612|0;w=c[w>>2]|0;x=c[l>>2]|0;x=x+4604|0;x=c[x>>2]|0;m=c[l>>2]|0;m=m+4664|0;m=c[m>>2]|0;rh(e,q,f,h,w,x,m);m=c[l>>2]|0;m=m+4524|0;l=m+32|0;do{b[m>>1]=b[k>>1]|0;m=m+2|0;k=k+2|0}while((m|0)<(l|0));i=y;return}}function Zg(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0;m=i;i=i+32|0;g=m+16|0;h=m+12|0;j=m+8|0;k=m+4|0;l=m;c[g>>2]=a;c[h>>2]=b;c[j>>2]=d;c[k>>2]=e;c[l>>2]=f;switch(c[l>>2]|0){case 6:{_g(c[g>>2]|0,c[h>>2]|0,c[j>>2]|0,c[k>>2]|0);break}case 8:{$g(c[g>>2]|0,c[h>>2]|0,c[j>>2]|0,c[k>>2]|0);break}case 10:{ah(c[g>>2]|0,c[h>>2]|0,c[j>>2]|0,c[k>>2]|0);break}case 12:{bh(c[g>>2]|0,c[h>>2]|0,c[j>>2]|0,c[k>>2]|0);break}case 16:{ch(c[g>>2]|0,c[h>>2]|0,c[j>>2]|0,c[k>>2]|0);break}default:{}}oj(c[g>>2]|0,0,c[l>>2]<<2|0)|0;i=m;return}function _g(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;o=i;i=i+32|0;f=o+24|0;h=o+20|0;j=o+16|0;k=o+12|0;m=o+8|0;l=o+4|0;n=o;c[f>>2]=a;c[h>>2]=b;c[j>>2]=d;c[k>>2]=e;c[m>>2]=6;while(1){if((c[m>>2]|0)>=(c[k>>2]|0))break;c[n>>2]=(c[j>>2]|0)+((c[m>>2]|0)-1<<2);g[l>>2]=+g[c[n>>2]>>2]*+g[c[h>>2]>>2]+ +g[(c[n>>2]|0)+-4>>2]*+g[(c[h>>2]|0)+4>>2]+ +g[(c[n>>2]|0)+-8>>2]*+g[(c[h>>2]|0)+8>>2]+ +g[(c[n>>2]|0)+-12>>2]*+g[(c[h>>2]|0)+12>>2]+ +g[(c[n>>2]|0)+-16>>2]*+g[(c[h>>2]|0)+16>>2]+ +g[(c[n>>2]|0)+-20>>2]*+g[(c[h>>2]|0)+20>>2];g[(c[f>>2]|0)+(c[m>>2]<<2)>>2]=+g[(c[n>>2]|0)+4>>2]-+g[l>>2];c[m>>2]=(c[m>>2]|0)+1}i=o;return}function $g(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;o=i;i=i+32|0;f=o+24|0;h=o+20|0;j=o+16|0;k=o+12|0;m=o+8|0;l=o+4|0;n=o;c[f>>2]=a;c[h>>2]=b;c[j>>2]=d;c[k>>2]=e;c[m>>2]=8;while(1){if((c[m>>2]|0)>=(c[k>>2]|0))break;c[n>>2]=(c[j>>2]|0)+((c[m>>2]|0)-1<<2);g[l>>2]=+g[c[n>>2]>>2]*+g[c[h>>2]>>2]+ +g[(c[n>>2]|0)+-4>>2]*+g[(c[h>>2]|0)+4>>2]+ +g[(c[n>>2]|0)+-8>>2]*+g[(c[h>>2]|0)+8>>2]+ +g[(c[n>>2]|0)+-12>>2]*+g[(c[h>>2]|0)+12>>2]+ +g[(c[n>>2]|0)+-16>>2]*+g[(c[h>>2]|0)+16>>2]+ +g[(c[n>>2]|0)+-20>>2]*+g[(c[h>>2]|0)+20>>2]+ +g[(c[n>>2]|0)+-24>>2]*+g[(c[h>>2]|0)+24>>2]+ +g[(c[n>>2]|0)+-28>>2]*+g[(c[h>>2]|0)+28>>2];g[(c[f>>2]|0)+(c[m>>2]<<2)>>2]=+g[(c[n>>2]|0)+4>>2]-+g[l>>2];c[m>>2]=(c[m>>2]|0)+1}i=o;return}function ah(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;o=i;i=i+32|0;f=o+24|0;h=o+20|0;j=o+16|0;k=o+12|0;m=o+8|0;l=o+4|0;n=o;c[f>>2]=a;c[h>>2]=b;c[j>>2]=d;c[k>>2]=e;c[m>>2]=10;while(1){if((c[m>>2]|0)>=(c[k>>2]|0))break;c[n>>2]=(c[j>>2]|0)+((c[m>>2]|0)-1<<2);g[l>>2]=+g[c[n>>2]>>2]*+g[c[h>>2]>>2]+ +g[(c[n>>2]|0)+-4>>2]*+g[(c[h>>2]|0)+4>>2]+ +g[(c[n>>2]|0)+-8>>2]*+g[(c[h>>2]|0)+8>>2]+ +g[(c[n>>2]|0)+-12>>2]*+g[(c[h>>2]|0)+12>>2]+ +g[(c[n>>2]|0)+-16>>2]*+g[(c[h>>2]|0)+16>>2]+ +g[(c[n>>2]|0)+-20>>2]*+g[(c[h>>2]|0)+20>>2]+ +g[(c[n>>2]|0)+-24>>2]*+g[(c[h>>2]|0)+24>>2]+ +g[(c[n>>2]|0)+-28>>2]*+g[(c[h>>2]|0)+28>>2]+ +g[(c[n>>2]|0)+-32>>2]*+g[(c[h>>2]|0)+32>>2]+ +g[(c[n>>2]|0)+-36>>2]*+g[(c[h>>2]|0)+36>>2];g[(c[f>>2]|0)+(c[m>>2]<<2)>>2]=+g[(c[n>>2]|0)+4>>2]-+g[l>>2];c[m>>2]=(c[m>>2]|0)+1}i=o;return}function bh(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;o=i;i=i+32|0;f=o+24|0;h=o+20|0;j=o+16|0;k=o+12|0;m=o+8|0;l=o+4|0;n=o;c[f>>2]=a;c[h>>2]=b;c[j>>2]=d;c[k>>2]=e;c[m>>2]=12;while(1){if((c[m>>2]|0)>=(c[k>>2]|0))break;c[n>>2]=(c[j>>2]|0)+((c[m>>2]|0)-1<<2);g[l>>2]=+g[c[n>>2]>>2]*+g[c[h>>2]>>2]+ +g[(c[n>>2]|0)+-4>>2]*+g[(c[h>>2]|0)+4>>2]+ +g[(c[n>>2]|0)+-8>>2]*+g[(c[h>>2]|0)+8>>2]+ +g[(c[n>>2]|0)+-12>>2]*+g[(c[h>>2]|0)+12>>2]+ +g[(c[n>>2]|0)+-16>>2]*+g[(c[h>>2]|0)+16>>2]+ +g[(c[n>>2]|0)+-20>>2]*+g[(c[h>>2]|0)+20>>2]+ +g[(c[n>>2]|0)+-24>>2]*+g[(c[h>>2]|0)+24>>2]+ +g[(c[n>>2]|0)+-28>>2]*+g[(c[h>>2]|0)+28>>2]+ +g[(c[n>>2]|0)+-32>>2]*+g[(c[h>>2]|0)+32>>2]+ +g[(c[n>>2]|0)+-36>>2]*+g[(c[h>>2]|0)+36>>2]+ +g[(c[n>>2]|0)+-40>>2]*+g[(c[h>>2]|0)+40>>2]+ +g[(c[n>>2]|0)+-44>>2]*+g[(c[h>>2]|0)+44>>2];g[(c[f>>2]|0)+(c[m>>2]<<2)>>2]=+g[(c[n>>2]|0)+4>>2]-+g[l>>2];c[m>>2]=(c[m>>2]|0)+1}i=o;return}function ch(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;o=i;i=i+32|0;f=o+24|0;h=o+20|0;j=o+16|0;k=o+12|0;m=o+8|0;l=o+4|0;n=o;c[f>>2]=a;c[h>>2]=b;c[j>>2]=d;c[k>>2]=e;c[m>>2]=16;while(1){if((c[m>>2]|0)>=(c[k>>2]|0))break;c[n>>2]=(c[j>>2]|0)+((c[m>>2]|0)-1<<2);g[l>>2]=+g[c[n>>2]>>2]*+g[c[h>>2]>>2]+ +g[(c[n>>2]|0)+-4>>2]*+g[(c[h>>2]|0)+4>>2]+ +g[(c[n>>2]|0)+-8>>2]*+g[(c[h>>2]|0)+8>>2]+ +g[(c[n>>2]|0)+-12>>2]*+g[(c[h>>2]|0)+12>>2]+ +g[(c[n>>2]|0)+-16>>2]*+g[(c[h>>2]|0)+16>>2]+ +g[(c[n>>2]|0)+-20>>2]*+g[(c[h>>2]|0)+20>>2]+ +g[(c[n>>2]|0)+-24>>2]*+g[(c[h>>2]|0)+24>>2]+ +g[(c[n>>2]|0)+-28>>2]*+g[(c[h>>2]|0)+28>>2]+ +g[(c[n>>2]|0)+-32>>2]*+g[(c[h>>2]|0)+32>>2]+ +g[(c[n>>2]|0)+-36>>2]*+g[(c[h>>2]|0)+36>>2]+ +g[(c[n>>2]|0)+-40>>2]*+g[(c[h>>2]|0)+40>>2]+ +g[(c[n>>2]|0)+-44>>2]*+g[(c[h>>2]|0)+44>>2]+ +g[(c[n>>2]|0)+-48>>2]*+g[(c[h>>2]|0)+48>>2]+ +g[(c[n>>2]|0)+-52>>2]*+g[(c[h>>2]|0)+52>>2]+ +g[(c[n>>2]|0)+-56>>2]*+g[(c[h>>2]|0)+56>>2]+ +g[(c[n>>2]|0)+-60>>2]*+g[(c[h>>2]|0)+60>>2];g[(c[f>>2]|0)+(c[m>>2]<<2)>>2]=+g[(c[n>>2]|0)+4>>2]-+g[l>>2];c[m>>2]=(c[m>>2]|0)+1}i=o;return}function dh(a,b,d,e,f,h,j,k){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0;z=i;i=i+80|0;A=z+76|0;B=z+72|0;l=z+68|0;m=z+64|0;n=z+60|0;o=z+56|0;p=z+52|0;q=z+48|0;y=z+44|0;x=z+40|0;r=z+20|0;s=z+16|0;u=z+12|0;w=z+8|0;t=z+4|0;v=z;c[A>>2]=a;c[B>>2]=b;c[l>>2]=d;c[m>>2]=e;c[n>>2]=f;c[o>>2]=h;c[p>>2]=j;c[q>>2]=k;c[y>>2]=c[B>>2];c[s>>2]=c[A>>2];c[w>>2]=0;while(1){if((c[w>>2]|0)>=(c[p>>2]|0))break;c[x>>2]=(c[y>>2]|0)+(0-(c[(c[m>>2]|0)+(c[w>>2]<<2)>>2]|0)<<2);g[u>>2]=+g[(c[n>>2]|0)+(c[w>>2]<<2)>>2];c[t>>2]=0;while(1){if((c[t>>2]|0)>=5)break;g[r+(c[t>>2]<<2)>>2]=+g[(c[l>>2]|0)+(((c[w>>2]|0)*5|0)+(c[t>>2]|0)<<2)>>2];c[t>>2]=(c[t>>2]|0)+1}c[t>>2]=0;while(1){if((c[t>>2]|0)>=((c[o>>2]|0)+(c[q>>2]|0)|0))break;g[(c[s>>2]|0)+(c[t>>2]<<2)>>2]=+g[(c[y>>2]|0)+(c[t>>2]<<2)>>2];c[v>>2]=0;while(1){if((c[v>>2]|0)>=5)break;B=(c[s>>2]|0)+(c[t>>2]<<2)|0;g[B>>2]=+g[B>>2]-+g[r+(c[v>>2]<<2)>>2]*+g[(c[x>>2]|0)+(2-(c[v>>2]|0)<<2)>>2];c[v>>2]=(c[v>>2]|0)+1}B=(c[s>>2]|0)+(c[t>>2]<<2)|0;g[B>>2]=+g[B>>2]*+g[u>>2];c[x>>2]=(c[x>>2]|0)+4;c[t>>2]=(c[t>>2]|0)+1}c[s>>2]=(c[s>>2]|0)+((c[o>>2]|0)+(c[q>>2]|0)<<2);c[y>>2]=(c[y>>2]|0)+(c[o>>2]<<2);c[w>>2]=(c[w>>2]|0)+1}i=z;return}function eh(d,e,f){d=d|0;e=e|0;f=f|0;var h=0.0,j=0,k=0,l=0,m=0,n=0;m=i;i=i+16|0;k=m+12|0;l=m+8|0;n=m+4|0;j=m;c[k>>2]=d;c[l>>2]=e;c[n>>2]=f;f=c[k>>2]|0;if(!(c[n>>2]|0)){c[j>>2]=(c[f+4640>>2]|0)+(c[(c[k>>2]|0)+5776>>2]|0);if(!(+(c[j>>2]|0)*+g[(c[l>>2]|0)+872>>2]*.10000000149011612>2.0))if(+(c[j>>2]|0)*+g[(c[l>>2]|0)+872>>2]*.10000000149011612<0.0)h=0.0;else h=+(c[j>>2]|0)*+g[(c[l>>2]|0)+872>>2]*.10000000149011612;else h=2.0;a[(c[k>>2]|0)+4768+33>>0]=~~h}else a[f+4768+33>>0]=0;g[(c[l>>2]|0)+224>>2]=+(b[24566+(a[(c[k>>2]|0)+4768+33>>0]<<1)>>1]|0)/16384.0;i=m;return}function fh(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,Q=0.0,R=0;M=i;i=i+1152|0;D=M+1140|0;E=M+1136|0;h=M+1132|0;R=M+1128|0;K=M+1124|0;J=M+1120|0;m=M+1116|0;q=M+1112|0;F=M+1108|0;G=M+1104|0;H=M+1100|0;w=M+1096|0;x=M+1092|0;k=M+1088|0;l=M+1084|0;j=M+1080|0;s=M+1076|0;o=M+1072|0;p=M+1068|0;v=M+1064|0;u=M+1060|0;L=M+1056|0;I=M+1052|0;A=M+1048|0;C=M+88|0;r=M+20|0;B=M+16|0;n=M+12|0;y=M+8|0;z=M+4|0;t=M;c[D>>2]=b;c[E>>2]=d;c[h>>2]=e;c[R>>2]=f;c[K>>2]=(c[D>>2]|0)+7200;c[B>>2]=(c[R>>2]|0)+(0-(c[(c[D>>2]|0)+4624>>2]|0)<<2);g[q>>2]=+(c[(c[D>>2]|0)+4748>>2]|0)*.0078125;g[(c[E>>2]|0)+856>>2]=+((c[(c[D>>2]|0)+4728>>2]|0)+(c[(c[D>>2]|0)+4728+4>>2]|0)|0)*.5*.000030517578125;Q=+gh((+g[q>>2]-20.0)*.25);g[(c[E>>2]|0)+860>>2]=Q;if(!(c[(c[D>>2]|0)+4708>>2]|0)){g[I>>2]=1.0-+(c[(c[D>>2]|0)+4556>>2]|0)*.00390625;g[q>>2]=+g[q>>2]-+g[(c[E>>2]|0)+860>>2]*2.0*(+g[(c[E>>2]|0)+856>>2]*.5+.5)*+g[I>>2]*+g[I>>2]}e=c[D>>2]|0;if((a[(c[D>>2]|0)+4768+29>>0]|0)==2)g[q>>2]=+g[q>>2]+ +g[e+12236>>2]*2.0;else g[q>>2]=+g[q>>2]+(+(c[e+4748>>2]|0)*-.4000000059604645*.0078125+6.0)*(1.0-+g[(c[E>>2]|0)+856>>2]);e=c[D>>2]|0;if((a[(c[D>>2]|0)+4768+29>>0]|0)==2){a[e+4768+30>>0]=0;g[(c[E>>2]|0)+864>>2]=0.0}else{c[m>>2]=c[e+4600>>2]<<1;g[j>>2]=0.0;g[l>>2]=0.0;c[n>>2]=c[h>>2];c[J>>2]=0;while(1){if((c[J>>2]|0)>=((((c[(c[D>>2]|0)+4604>>2]&65535)<<16>>16)*5|0)/2|0|0))break;Q=+(c[m>>2]|0);g[w>>2]=Q+ +Gh(c[n>>2]|0,c[m>>2]|0);g[k>>2]=+hh(+g[w>>2]);if((c[J>>2]|0)>0){Q=+N(+(+g[k>>2]-+g[l>>2]));g[j>>2]=+g[j>>2]+Q}g[l>>2]=+g[k>>2];c[n>>2]=(c[n>>2]|0)+(c[m>>2]<<2);c[J>>2]=(c[J>>2]|0)+1}Q=+gh((+g[j>>2]-5.0)*.4000000059604645);g[(c[E>>2]|0)+864>>2]=Q;e=(c[D>>2]|0)+4768+30|0;if(+g[(c[E>>2]|0)+864>>2]>.75)a[e>>0]=0;else a[e>>0]=1;g[q>>2]=+g[q>>2]+(+g[(c[E>>2]|0)+864>>2]-.5)*2.0}g[L>>2]=+g[(c[E>>2]|0)+868>>2]*1.0000000474974513e-03;Q=.949999988079071/(+g[L>>2]*+g[L>>2]+1.0);g[p>>2]=Q;g[o>>2]=Q;g[s>>2]=(1.0-+g[(c[E>>2]|0)+860>>2]*.75)*.009999999776482582;g[o>>2]=+g[o>>2]-+g[s>>2];g[p>>2]=+g[p>>2]+ +g[s>>2];g[o>>2]=+g[o>>2]/+g[p>>2];if((c[(c[D>>2]|0)+4704>>2]|0)>0)g[A>>2]=+(c[(c[D>>2]|0)+4704>>2]|0)/65536.0+ +g[(c[E>>2]|0)+860>>2]*.009999999776482582;else g[A>>2]=0.0;c[J>>2]=0;while(1){if((c[J>>2]|0)>=(c[(c[D>>2]|0)+4604>>2]|0))break;c[t>>2]=(c[(c[D>>2]|0)+4600>>2]|0)*3;c[z>>2]=((c[(c[D>>2]|0)+4628>>2]|0)-(c[t>>2]|0)|0)/2|0;Jg(C,c[B>>2]|0,1,c[z>>2]|0);c[y>>2]=c[z>>2];pj(C+(c[y>>2]<<2)|0,(c[B>>2]|0)+(c[y>>2]<<2)|0,c[t>>2]<<2|0)|0;c[y>>2]=(c[y>>2]|0)+(c[t>>2]|0);Jg(C+(c[y>>2]<<2)|0,(c[B>>2]|0)+(c[y>>2]<<2)|0,2,c[z>>2]|0);c[B>>2]=(c[B>>2]|0)+(c[(c[D>>2]|0)+4612>>2]<<2);if((c[(c[D>>2]|0)+4704>>2]|0)>0)wh(r,C,+g[A>>2],c[(c[D>>2]|0)+4628>>2]|0,c[(c[D>>2]|0)+4660>>2]|0);else Dh(r,C,c[(c[D>>2]|0)+4628>>2]|0,(c[(c[D>>2]|0)+4660>>2]|0)+1|0);g[r>>2]=+g[r>>2]+ +g[r>>2]*4.999999873689376e-05;g[w>>2]=+Jh((c[E>>2]|0)+500+(c[J>>2]<<4<<2)|0,r,c[(c[D>>2]|0)+4660>>2]|0);Q=+O(+(+g[w>>2]));g[(c[E>>2]|0)+(c[J>>2]<<2)>>2]=Q;if((c[(c[D>>2]|0)+4704>>2]|0)>0){Q=+ih((c[E>>2]|0)+500+(c[J>>2]<<4<<2)|0,+g[A>>2],c[(c[D>>2]|0)+4660>>2]|0);R=(c[E>>2]|0)+(c[J>>2]<<2)|0;g[R>>2]=+g[R>>2]*Q}Fh((c[E>>2]|0)+500+(c[J>>2]<<4<<2)|0,c[(c[D>>2]|0)+4660>>2]|0,+g[p>>2]);pj((c[E>>2]|0)+244+(c[J>>2]<<4<<2)|0,(c[E>>2]|0)+500+(c[J>>2]<<4<<2)|0,c[(c[D>>2]|0)+4660>>2]<<2|0)|0;Fh((c[E>>2]|0)+244+(c[J>>2]<<4<<2)|0,c[(c[D>>2]|0)+4660>>2]|0,+g[o>>2]);g[x>>2]=+Kh((c[E>>2]|0)+500+(c[J>>2]<<4<<2)|0,c[(c[D>>2]|0)+4660>>2]|0);g[w>>2]=+Kh((c[E>>2]|0)+244+(c[J>>2]<<4<<2)|0,c[(c[D>>2]|0)+4660>>2]|0);g[(c[E>>2]|0)+788+(c[J>>2]<<2)>>2]=1.0-(1.0-+g[x>>2]/+g[w>>2])*.699999988079071;jh((c[E>>2]|0)+500+(c[J>>2]<<4<<2)|0,(c[E>>2]|0)+244+(c[J>>2]<<4<<2)|0,+g[A>>2],3.999000072479248,c[(c[D>>2]|0)+4660>>2]|0);c[J>>2]=(c[J>>2]|0)+1}g[v>>2]=+P(2.0,+(+g[q>>2]*-.1599999964237213));g[u>>2]=+P(2.0,.3199999928474426);c[J>>2]=0;while(1){if((c[J>>2]|0)>=(c[(c[D>>2]|0)+4604>>2]|0))break;R=(c[E>>2]|0)+(c[J>>2]<<2)|0;g[R>>2]=+g[R>>2]*+g[v>>2];R=(c[E>>2]|0)+(c[J>>2]<<2)|0;g[R>>2]=+g[R>>2]+ +g[u>>2];c[J>>2]=(c[J>>2]|0)+1}g[v>>2]=+g[(c[E>>2]|0)+860>>2]*.10000000149011612+1.0499999523162842;c[J>>2]=0;while(1){if((c[J>>2]|0)>=(c[(c[D>>2]|0)+4604>>2]|0))break;R=(c[E>>2]|0)+788+(c[J>>2]<<2)|0;g[R>>2]=+g[R>>2]*+g[v>>2];c[J>>2]=(c[J>>2]|0)+1}g[L>>2]=((+(c[(c[D>>2]|0)+4728>>2]|0)*.000030517578125-1.0)*.5+1.0)*4.0;g[L>>2]=+g[L>>2]*(+(c[(c[D>>2]|0)+4556>>2]|0)*.00390625);if((a[(c[D>>2]|0)+4768+29>>0]|0)==2){c[J>>2]=0;while(1){e=c[D>>2]|0;if((c[J>>2]|0)>=(c[(c[D>>2]|0)+4604>>2]|0))break;g[I>>2]=.20000000298023224/+(c[e+4600>>2]|0)+3.0/+(c[(c[E>>2]|0)+228+(c[J>>2]<<2)>>2]|0);g[(c[E>>2]|0)+756+(c[J>>2]<<2)>>2]=+g[I>>2]+-1.0;g[(c[E>>2]|0)+772+(c[J>>2]<<2)>>2]=1.0-+g[I>>2]-+g[I>>2]*+g[L>>2];c[J>>2]=(c[J>>2]|0)+1}g[H>>2]=-.25-+(c[e+4556>>2]|0)*.26249998807907104*.00390625}else{g[I>>2]=1.2999999523162842/+(c[(c[D>>2]|0)+4600>>2]|0);g[(c[E>>2]|0)+756>>2]=+g[I>>2]+-1.0;g[(c[E>>2]|0)+772>>2]=1.0-+g[I>>2]-+g[I>>2]*+g[L>>2]*.6000000238418579;c[J>>2]=1;while(1){if((c[J>>2]|0)>=(c[(c[D>>2]|0)+4604>>2]|0))break;g[(c[E>>2]|0)+756+(c[J>>2]<<2)>>2]=+g[(c[E>>2]|0)+756>>2];g[(c[E>>2]|0)+772+(c[J>>2]<<2)>>2]=+g[(c[E>>2]|0)+772>>2];c[J>>2]=(c[J>>2]|0)+1}g[H>>2]=-.25}g[F>>2]=(1.0-+g[(c[E>>2]|0)+860>>2])*.10000000149011612*+g[(c[D>>2]|0)+12236>>2];g[F>>2]=+g[F>>2]+(1.0-+g[(c[E>>2]|0)+856>>2])*.10000000149011612;if((a[(c[D>>2]|0)+4768+29>>0]|0)==2){g[G>>2]=.30000001192092896;g[G>>2]=+g[G>>2]+(1.0-(1.0-+g[(c[E>>2]|0)+860>>2])*+g[(c[E>>2]|0)+856>>2])*.20000000298023224;Q=+O(+(+g[(c[D>>2]|0)+12236>>2]));g[G>>2]=+g[G>>2]*Q}else g[G>>2]=0.0;c[J>>2]=0;while(1){if((c[J>>2]|0)>=(c[(c[D>>2]|0)+4604>>2]|0))break;R=(c[K>>2]|0)+4|0;g[R>>2]=+g[R>>2]+(+g[F>>2]-+g[(c[K>>2]|0)+4>>2])*.4000000059604645;g[(c[E>>2]|0)+804+(c[J>>2]<<2)>>2]=+g[(c[K>>2]|0)+4>>2];R=(c[K>>2]|0)+8|0;g[R>>2]=+g[R>>2]+(+g[G>>2]-+g[(c[K>>2]|0)+8>>2])*.4000000059604645;g[(c[E>>2]|0)+836+(c[J>>2]<<2)>>2]=+g[(c[K>>2]|0)+8>>2];R=(c[K>>2]|0)+12|0;g[R>>2]=+g[R>>2]+(+g[H>>2]-+g[(c[K>>2]|0)+12>>2])*.4000000059604645;g[(c[E>>2]|0)+820+(c[J>>2]<<2)>>2]=+g[(c[K>>2]|0)+12>>2];c[J>>2]=(c[J>>2]|0)+1}i=M;return}function gh(a){a=+a;var b=0,c=0;b=i;i=i+16|0;c=b;g[c>>2]=a;a=1.0/(+X(+-+g[c>>2])+1.0);i=b;return +a}function hh(a){a=+a;var b=0,c=0;b=i;i=i+16|0;c=b;h[c>>3]=a;a=+hj(+h[c>>3])*3.32192809488736;i=b;return +a}function ih(a,b,d){a=a|0;b=+b;d=d|0;var e=0,f=0,h=0,j=0,k=0,l=0;k=i;i=i+32|0;e=k+16|0;f=k+12|0;l=k+8|0;j=k+4|0;h=k;c[e>>2]=a;g[f>>2]=b;c[l>>2]=d;g[f>>2]=-+g[f>>2];g[h>>2]=+g[(c[e>>2]|0)+((c[l>>2]|0)-1<<2)>>2];c[j>>2]=(c[l>>2]|0)-2;while(1){b=+g[f>>2]*+g[h>>2];if((c[j>>2]|0)<0)break;g[h>>2]=b+ +g[(c[e>>2]|0)+(c[j>>2]<<2)>>2];c[j>>2]=(c[j>>2]|0)+-1}i=k;return +(1.0/(1.0-b))}function jh(a,b,d,e,f){a=a|0;b=b|0;d=+d;e=+e;f=f|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;v=i;i=i+64|0;h=v+48|0;j=v+44|0;k=v+40|0;l=v+36|0;m=v+32|0;q=v+28|0;s=v+24|0;r=v+20|0;u=v+16|0;t=v+12|0;n=v+8|0;p=v+4|0;o=v;c[h>>2]=a;c[j>>2]=b;g[k>>2]=d;g[l>>2]=e;c[m>>2]=f;c[r>>2]=0;c[q>>2]=(c[m>>2]|0)-1;while(1){d=+g[k>>2];if((c[q>>2]|0)<=0)break;f=(c[h>>2]|0)+((c[q>>2]|0)-1<<2)|0;g[f>>2]=+g[f>>2]-d*+g[(c[h>>2]|0)+(c[q>>2]<<2)>>2];f=(c[j>>2]|0)+((c[q>>2]|0)-1<<2)|0;g[f>>2]=+g[f>>2]-+g[k>>2]*+g[(c[j>>2]|0)+(c[q>>2]<<2)>>2];c[q>>2]=(c[q>>2]|0)+-1}g[p>>2]=(1.0-d*+g[k>>2])/(+g[k>>2]*+g[c[h>>2]>>2]+1.0);g[o>>2]=(1.0-+g[k>>2]*+g[k>>2])/(+g[k>>2]*+g[c[j>>2]>>2]+1.0);c[q>>2]=0;while(1){if((c[q>>2]|0)>=(c[m>>2]|0))break;f=(c[h>>2]|0)+(c[q>>2]<<2)|0;g[f>>2]=+g[f>>2]*+g[p>>2];f=(c[j>>2]|0)+(c[q>>2]<<2)|0;g[f>>2]=+g[f>>2]*+g[o>>2];c[q>>2]=(c[q>>2]|0)+1}c[s>>2]=0;while(1){if((c[s>>2]|0)>=10){b=31;break}g[t>>2]=-1.0;c[q>>2]=0;while(1){if((c[q>>2]|0)>=(c[m>>2]|0))break;e=+N(+(+g[(c[h>>2]|0)+(c[q>>2]<<2)>>2]));f=e>+N(+(+g[(c[j>>2]|0)+(c[q>>2]<<2)>>2]));b=c[q>>2]|0;if(f)d=+g[(c[h>>2]|0)+(b<<2)>>2];else d=+g[(c[j>>2]|0)+(b<<2)>>2];g[u>>2]=+N(+d);if(+g[u>>2]>+g[t>>2]){g[t>>2]=+g[u>>2];c[r>>2]=c[q>>2]}c[q>>2]=(c[q>>2]|0)+1}if(+g[t>>2]<=+g[l>>2]){b=31;break}c[q>>2]=1;while(1){if((c[q>>2]|0)>=(c[m>>2]|0))break;f=(c[h>>2]|0)+((c[q>>2]|0)-1<<2)|0;g[f>>2]=+g[f>>2]+ +g[k>>2]*+g[(c[h>>2]|0)+(c[q>>2]<<2)>>2];f=(c[j>>2]|0)+((c[q>>2]|0)-1<<2)|0;g[f>>2]=+g[f>>2]+ +g[k>>2]*+g[(c[j>>2]|0)+(c[q>>2]<<2)>>2];c[q>>2]=(c[q>>2]|0)+1}g[p>>2]=1.0/+g[p>>2];g[o>>2]=1.0/+g[o>>2];c[q>>2]=0;while(1){if((c[q>>2]|0)>=(c[m>>2]|0))break;f=(c[h>>2]|0)+(c[q>>2]<<2)|0;g[f>>2]=+g[f>>2]*+g[p>>2];f=(c[j>>2]|0)+(c[q>>2]<<2)|0;g[f>>2]=+g[f>>2]*+g[o>>2];c[q>>2]=(c[q>>2]|0)+1}g[n>>2]=.9900000095367432-(+(c[s>>2]|0)*.10000000149011612+.800000011920929)*(+g[t>>2]-+g[l>>2])/(+g[t>>2]*+((c[r>>2]|0)+1|0));Fh(c[h>>2]|0,c[m>>2]|0,+g[n>>2]);Fh(c[j>>2]|0,c[m>>2]|0,+g[n>>2]);c[q>>2]=(c[m>>2]|0)-1;while(1){d=+g[k>>2];if((c[q>>2]|0)<=0)break;f=(c[h>>2]|0)+((c[q>>2]|0)-1<<2)|0;g[f>>2]=+g[f>>2]-d*+g[(c[h>>2]|0)+(c[q>>2]<<2)>>2];f=(c[j>>2]|0)+((c[q>>2]|0)-1<<2)|0;g[f>>2]=+g[f>>2]-+g[k>>2]*+g[(c[j>>2]|0)+(c[q>>2]<<2)>>2];c[q>>2]=(c[q>>2]|0)+-1}g[p>>2]=(1.0-d*+g[k>>2])/(+g[k>>2]*+g[c[h>>2]>>2]+1.0);g[o>>2]=(1.0-+g[k>>2]*+g[k>>2])/(+g[k>>2]*+g[c[j>>2]>>2]+1.0);c[q>>2]=0;while(1){if((c[q>>2]|0)>=(c[m>>2]|0))break;f=(c[h>>2]|0)+(c[q>>2]<<2)|0;g[f>>2]=+g[f>>2]*+g[p>>2];f=(c[j>>2]|0)+(c[q>>2]<<2)|0;g[f>>2]=+g[f>>2]*+g[o>>2];c[q>>2]=(c[q>>2]|0)+1}c[s>>2]=(c[s>>2]|0)+1}if((b|0)==31){i=v;return}}function kh(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0;y=i;i=i+464|0;h=y+460|0;j=y+456|0;z=y+452|0;A=y+448|0;q=y+444|0;s=y+440|0;t=y+436|0;u=y+432|0;n=y+428|0;r=y+424|0;p=y+420|0;o=y+416|0;l=y+408|0;k=y+404|0;v=y+400|0;w=y+396|0;m=y+384|0;x=y;c[h>>2]=b;c[j>>2]=d;c[z>>2]=e;c[A>>2]=f;c[q>>2]=(c[h>>2]|0)+7216;c[v>>2]=c[A>>2];c[w>>2]=c[z>>2];c[u>>2]=c[(c[q>>2]|0)+2136>>2];c[t>>2]=0;while(1){b=c[h>>2]|0;if((c[t>>2]|0)>=(c[(c[h>>2]|0)+4604>>2]|0))break;if((a[b+4768+29>>0]|0)==2)c[u>>2]=c[(c[j>>2]|0)+228+(c[t>>2]<<2)>>2];g[n>>2]=+g[(c[j>>2]|0)+836+(c[t>>2]<<2)>>2]*(1.0-+g[(c[j>>2]|0)+804+(c[t>>2]<<2)>>2]);g[m>>2]=+g[n>>2]*.25;g[m+4>>2]=+g[n>>2]*.4999847412109375;g[m+8>>2]=+g[n>>2]*.25;g[r>>2]=+g[(c[j>>2]|0)+820+(c[t>>2]<<2)>>2];g[p>>2]=+g[(c[j>>2]|0)+756+(c[t>>2]<<2)>>2];g[o>>2]=+g[(c[j>>2]|0)+772+(c[t>>2]<<2)>>2];c[k>>2]=(c[j>>2]|0)+244+(c[t>>2]<<4<<2);lh((c[q>>2]|0)+2048|0,x,c[k>>2]|0,c[v>>2]|0,+(c[(c[h>>2]|0)+4704>>2]|0)/65536.0,c[(c[h>>2]|0)+4612>>2]|0,c[(c[h>>2]|0)+4660>>2]|0);g[l>>2]=+g[(c[j>>2]|0)+788+(c[t>>2]<<2)>>2];g[l+4>>2]=-+g[(c[j>>2]|0)+788+(c[t>>2]<<2)>>2]*(+g[(c[j>>2]|0)+804+(c[t>>2]<<2)>>2]*+g[n>>2]+.05000000074505806+ +g[(c[j>>2]|0)+860>>2]*.10000000149011612);g[c[w>>2]>>2]=+g[l>>2]*+g[x>>2]+ +g[l+4>>2]*+g[(c[q>>2]|0)+2128>>2];c[s>>2]=1;while(1){if((c[s>>2]|0)>=(c[(c[h>>2]|0)+4612>>2]|0))break;g[(c[w>>2]|0)+(c[s>>2]<<2)>>2]=+g[l>>2]*+g[x+(c[s>>2]<<2)>>2]+ +g[l+4>>2]*+g[x+((c[s>>2]|0)-1<<2)>>2];c[s>>2]=(c[s>>2]|0)+1}g[(c[q>>2]|0)+2128>>2]=+g[x+((c[(c[h>>2]|0)+4612>>2]|0)-1<<2)>>2];mh(c[q>>2]|0,c[w>>2]|0,c[w>>2]|0,m,+g[r>>2],+g[p>>2],+g[o>>2],c[u>>2]|0,c[(c[h>>2]|0)+4612>>2]|0);c[v>>2]=(c[v>>2]|0)+(c[(c[h>>2]|0)+4612>>2]<<2);c[w>>2]=(c[w>>2]|0)+(c[(c[h>>2]|0)+4612>>2]<<2);c[t>>2]=(c[t>>2]|0)+1}c[(c[q>>2]|0)+2136>>2]=c[(c[j>>2]|0)+228+((c[b+4604>>2]|0)-1<<2)>>2];i=y;return}function lh(a,b,d,e,f,h,j){a=a|0;b=b|0;d=d|0;e=e|0;f=+f;h=h|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;w=i;i=i+48|0;k=w+44|0;l=w+40|0;m=w+36|0;n=w+32|0;o=w+28|0;p=w+24|0;q=w+20|0;t=w+16|0;s=w+12|0;r=w+8|0;u=w+4|0;v=w;c[k>>2]=a;c[l>>2]=b;c[m>>2]=d;c[n>>2]=e;g[o>>2]=f;c[p>>2]=h;c[q>>2]=j;c[t>>2]=0;while(1){if((c[t>>2]|0)>=(c[p>>2]|0))break;g[v>>2]=+g[c[k>>2]>>2]+ +g[o>>2]*+g[(c[k>>2]|0)+4>>2];g[c[k>>2]>>2]=+g[(c[n>>2]|0)+(c[t>>2]<<2)>>2];g[u>>2]=+g[(c[k>>2]|0)+4>>2]+ +g[o>>2]*(+g[(c[k>>2]|0)+8>>2]-+g[v>>2]);g[(c[k>>2]|0)+4>>2]=+g[v>>2];g[r>>2]=+g[c[m>>2]>>2]*+g[v>>2];c[s>>2]=2;while(1){if((c[s>>2]|0)>=(c[q>>2]|0))break;g[v>>2]=+g[(c[k>>2]|0)+(c[s>>2]<<2)>>2]+ +g[o>>2]*(+g[(c[k>>2]|0)+((c[s>>2]|0)+1<<2)>>2]-+g[u>>2]);g[(c[k>>2]|0)+(c[s>>2]<<2)>>2]=+g[u>>2];g[r>>2]=+g[r>>2]+ +g[(c[m>>2]|0)+((c[s>>2]|0)-1<<2)>>2]*+g[u>>2];g[u>>2]=+g[(c[k>>2]|0)+((c[s>>2]|0)+1<<2)>>2]+ +g[o>>2]*(+g[(c[k>>2]|0)+((c[s>>2]|0)+2<<2)>>2]-+g[v>>2]);g[(c[k>>2]|0)+((c[s>>2]|0)+1<<2)>>2]=+g[v>>2];g[r>>2]=+g[r>>2]+ +g[(c[m>>2]|0)+(c[s>>2]<<2)>>2]*+g[v>>2];c[s>>2]=(c[s>>2]|0)+2}g[(c[k>>2]|0)+(c[q>>2]<<2)>>2]=+g[u>>2];g[r>>2]=+g[r>>2]+ +g[(c[m>>2]|0)+((c[q>>2]|0)-1<<2)>>2]*+g[u>>2];g[(c[l>>2]|0)+(c[t>>2]<<2)>>2]=+g[(c[n>>2]|0)+(c[t>>2]<<2)>>2]-+g[r>>2];c[t>>2]=(c[t>>2]|0)+1}i=w;return}function mh(a,b,d,e,f,h,j,k,l){a=a|0;b=b|0;d=d|0;e=e|0;f=+f;h=+h;j=+j;k=k|0;l=l|0;var m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;E=i;i=i+80|0;m=E+68|0;n=E+64|0;o=E+60|0;p=E+56|0;q=E+52|0;r=E+48|0;s=E+44|0;t=E+40|0;u=E+36|0;x=E+32|0;y=E+28|0;w=E+24|0;B=E+20|0;z=E+16|0;A=E+12|0;C=E+8|0;D=E+4|0;v=E;c[m>>2]=a;c[n>>2]=b;c[o>>2]=d;c[p>>2]=e;g[q>>2]=f;g[r>>2]=h;g[s>>2]=j;c[t>>2]=k;c[u>>2]=l;c[v>>2]=c[m>>2];c[w>>2]=c[(c[m>>2]|0)+2116>>2];g[C>>2]=+g[(c[m>>2]|0)+2120>>2];g[D>>2]=+g[(c[m>>2]|0)+2124>>2];c[x>>2]=0;while(1){if((c[x>>2]|0)>=(c[u>>2]|0))break;if((c[t>>2]|0)>0){c[y>>2]=(c[t>>2]|0)+(c[w>>2]|0);g[A>>2]=+g[(c[v>>2]|0)+(((c[y>>2]|0)-1-1&511)<<2)>>2]*+g[c[p>>2]>>2];g[A>>2]=+g[A>>2]+ +g[(c[v>>2]|0)+(((c[y>>2]|0)-1&511)<<2)>>2]*+g[(c[p>>2]|0)+4>>2];g[A>>2]=+g[A>>2]+ +g[(c[v>>2]|0)+(((c[y>>2]|0)-1+1&511)<<2)>>2]*+g[(c[p>>2]|0)+8>>2]}else g[A>>2]=0.0;g[B>>2]=+g[C>>2]*+g[q>>2];g[z>>2]=+g[C>>2]*+g[s>>2]+ +g[D>>2]*+g[r>>2];g[C>>2]=+g[(c[n>>2]|0)+(c[x>>2]<<2)>>2]-+g[B>>2];g[D>>2]=+g[C>>2]-+g[z>>2];c[w>>2]=(c[w>>2]|0)-1&511;g[(c[v>>2]|0)+(c[w>>2]<<2)>>2]=+g[D>>2];g[(c[o>>2]|0)+(c[x>>2]<<2)>>2]=+g[D>>2]-+g[A>>2];c[x>>2]=(c[x>>2]|0)+1}g[(c[m>>2]|0)+2120>>2]=+g[C>>2];g[(c[m>>2]|0)+2124>>2]=+g[D>>2];c[(c[m>>2]|0)+2116>>2]=c[w>>2];i=E;return}function nh(d,e,f){d=d|0;e=e|0;f=f|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0.0;s=i;i=i+64|0;p=s+48|0;q=s+44|0;h=s+40|0;n=s+36|0;l=s+32|0;m=s+16|0;o=s+12|0;j=s+8|0;k=s+4|0;r=s;c[p>>2]=d;c[q>>2]=e;c[h>>2]=f;c[n>>2]=(c[p>>2]|0)+7200;a:do if((a[(c[p>>2]|0)+4768+29>>0]|0)==2){g[o>>2]=1.0-+oh((+g[(c[q>>2]|0)+872>>2]-12.0)*.25)*.5;c[l>>2]=0;while(1){if((c[l>>2]|0)>=(c[(c[p>>2]|0)+4604>>2]|0))break a;e=(c[q>>2]|0)+(c[l>>2]<<2)|0;g[e>>2]=+g[e>>2]*+g[o>>2];c[l>>2]=(c[l>>2]|0)+1}}while(0);t=+P(2.0,+((21.0-+(c[(c[p>>2]|0)+4748>>2]|0)*.0078125)*.33000001311302185));g[j>>2]=t/+(c[(c[p>>2]|0)+4612>>2]|0);c[l>>2]=0;while(1){if((c[l>>2]|0)>=(c[(c[p>>2]|0)+4604>>2]|0))break;g[k>>2]=+g[(c[q>>2]|0)+(c[l>>2]<<2)>>2];g[k>>2]=+O(+(+g[k>>2]*+g[k>>2]+ +g[(c[q>>2]|0)+876+(c[l>>2]<<2)>>2]*+g[j>>2]));g[(c[q>>2]|0)+(c[l>>2]<<2)>>2]=+g[k>>2]<32767.0?+g[k>>2]:32767.0;c[l>>2]=(c[l>>2]|0)+1}c[l>>2]=0;while(1){if((c[l>>2]|0)>=(c[(c[p>>2]|0)+4604>>2]|0))break;c[m+(c[l>>2]<<2)>>2]=~~(+g[(c[q>>2]|0)+(c[l>>2]<<2)>>2]*65536.0);c[l>>2]=(c[l>>2]|0)+1}pj((c[q>>2]|0)+892|0,m|0,c[(c[p>>2]|0)+4604>>2]<<2|0)|0;a[(c[q>>2]|0)+908>>0]=a[c[n>>2]>>0]|0;_d((c[p>>2]|0)+4768|0,m,c[n>>2]|0,(c[h>>2]|0)==2&1,c[(c[p>>2]|0)+4604>>2]|0);c[l>>2]=0;while(1){if((c[l>>2]|0)>=(c[(c[p>>2]|0)+4604>>2]|0))break;g[(c[q>>2]|0)+(c[l>>2]<<2)>>2]=+(c[m+(c[l>>2]<<2)>>2]|0)/65536.0;c[l>>2]=(c[l>>2]|0)+1}do if((a[(c[p>>2]|0)+4768+29>>0]|0)==2){h=(c[p>>2]|0)+4768+30|0;if(+g[(c[q>>2]|0)+872>>2]+ +(c[(c[p>>2]|0)+4744>>2]|0)*.000030517578125>1.0){a[h>>0]=0;break}else{a[h>>0]=1;break}}while(0);g[r>>2]=+(b[24558+(a[(c[p>>2]|0)+4768+29>>0]>>1<<2)+(a[(c[p>>2]|0)+4768+30>>0]<<1)>>1]|0)/1024.0;g[(c[q>>2]|0)+852>>2]=+(c[(c[p>>2]|0)+4652>>2]|0)*-.05000000074505806+1.2000000476837158+ +(c[(c[p>>2]|0)+4556>>2]|0)*-.20000000298023224*.00390625+ +g[(c[q>>2]|0)+856>>2]*-.10000000149011612+ +g[(c[q>>2]|0)+860>>2]*-.20000000298023224+ +g[r>>2]*.800000011920929;i=s;return}function oh(a){a=+a;var b=0,c=0;b=i;i=i+16|0;c=b;g[c>>2]=a;a=1.0/(+X(+-+g[c>>2])+1.0);i=b;return +a}function ph(a,b,d,e){a=a|0;b=b|0;d=+d;e=e|0;var f=0,h=0,j=0,k=0,l=0,m=0;m=i;i=i+32|0;f=m+16|0;h=m+12|0;j=m+8|0;k=m+4|0;l=m;c[f>>2]=a;c[h>>2]=b;g[j>>2]=d;c[k>>2]=e;c[l>>2]=0;while(1){d=+g[j>>2];if((c[l>>2]|0)>=(c[k>>2]|0))break;b=_(c[l>>2]|0,c[k>>2]|0)|0;b=(c[f>>2]|0)+(b+(c[l>>2]|0)<<2)|0;g[b>>2]=+g[b>>2]+d;c[l>>2]=(c[l>>2]|0)+1}l=c[h>>2]|0;g[l>>2]=+g[l>>2]+d;i=m;return}function qh(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=+e;f=f|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;t=i;i=i+48|0;h=t+40|0;j=t+36|0;k=t+32|0;l=t+28|0;m=t+24|0;n=t+20|0;o=t+16|0;p=t+12|0;s=t+8|0;q=t+4|0;r=t;c[h>>2]=a;c[j>>2]=b;c[k>>2]=d;g[l>>2]=e;c[m>>2]=f;g[q>>2]=0.0;d=(_(c[m>>2]|0,c[m>>2]|0)|0)-1|0;g[r>>2]=(+g[c[j>>2]>>2]+ +g[(c[j>>2]|0)+(d<<2)>>2])*9.99999993922529e-09;c[p>>2]=0;while(1){if((c[p>>2]|0)>=10)break;g[q>>2]=+g[l>>2];g[s>>2]=0.0;c[n>>2]=0;while(1){if((c[n>>2]|0)>=(c[m>>2]|0))break;g[s>>2]=+g[s>>2]+ +g[(c[k>>2]|0)+(c[n>>2]<<2)>>2]*+g[(c[h>>2]|0)+(c[n>>2]<<2)>>2];c[n>>2]=(c[n>>2]|0)+1}g[q>>2]=+g[q>>2]-+g[s>>2]*2.0;c[n>>2]=0;while(1){if((c[n>>2]|0)>=(c[m>>2]|0))break;g[s>>2]=0.0;c[o>>2]=(c[n>>2]|0)+1;while(1){if((c[o>>2]|0)>=(c[m>>2]|0))break;e=+g[(c[j>>2]|0)+((c[n>>2]|0)+(_(c[m>>2]|0,c[o>>2]|0)|0)<<2)>>2];g[s>>2]=+g[s>>2]+e*+g[(c[h>>2]|0)+(c[o>>2]<<2)>>2];c[o>>2]=(c[o>>2]|0)+1}e=+g[(c[j>>2]|0)+((c[n>>2]|0)+(_(c[m>>2]|0,c[n>>2]|0)|0)<<2)>>2];g[q>>2]=+g[q>>2]+ +g[(c[h>>2]|0)+(c[n>>2]<<2)>>2]*(+g[s>>2]*2.0+e*+g[(c[h>>2]|0)+(c[n>>2]<<2)>>2]);c[n>>2]=(c[n>>2]|0)+1}if(+g[q>>2]>0.0)break;c[n>>2]=0;while(1){e=+g[r>>2];if((c[n>>2]|0)>=(c[m>>2]|0))break;d=(c[j>>2]|0)+((c[n>>2]|0)+(_(c[m>>2]|0,c[n>>2]|0)|0)<<2)|0;g[d>>2]=+g[d>>2]+e;c[n>>2]=(c[n>>2]|0)+1}g[r>>2]=e*2.0;c[p>>2]=(c[p>>2]|0)+1}if((c[p>>2]|0)!=10){e=+g[q>>2];i=t;return +e}g[q>>2]=1.0;e=+g[q>>2];i=t;return +e}function rh(a,b,d,e,f,h,j){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0.0;t=i;i=i+816|0;k=t+800|0;l=t+796|0;m=t+792|0;n=t+788|0;o=t+784|0;u=t+780|0;p=t+776|0;s=t+772|0;r=t+768|0;q=t;c[k>>2]=a;c[l>>2]=b;c[m>>2]=d;c[n>>2]=e;c[o>>2]=f;c[u>>2]=h;c[p>>2]=j;c[r>>2]=q+(c[p>>2]<<2);c[s>>2]=(c[p>>2]|0)+(c[o>>2]|0);Zg(q,c[m>>2]|0,(c[l>>2]|0)+(0<<2)|0,c[s>>2]<<1,c[p>>2]|0);v=+g[c[n>>2]>>2]*+g[c[n>>2]>>2];v=v*+Gh((c[r>>2]|0)+(0<<2)|0,c[o>>2]|0);g[c[k>>2]>>2]=v;v=+g[(c[n>>2]|0)+4>>2]*+g[(c[n>>2]|0)+4>>2];v=v*+Gh((c[r>>2]|0)+(c[s>>2]<<2)|0,c[o>>2]|0);g[(c[k>>2]|0)+4>>2]=v;if((c[u>>2]|0)!=4){i=t;return}Zg(q,(c[m>>2]|0)+64|0,(c[l>>2]|0)+(c[s>>2]<<1<<2)|0,c[s>>2]<<1,c[p>>2]|0);v=+g[(c[n>>2]|0)+8>>2]*+g[(c[n>>2]|0)+8>>2];v=v*+Gh((c[r>>2]|0)+(0<<2)|0,c[o>>2]|0);g[(c[k>>2]|0)+8>>2]=v;v=+g[(c[n>>2]|0)+12>>2]*+g[(c[n>>2]|0)+12>>2];v=v*+Gh((c[r>>2]|0)+(c[s>>2]<<2)|0,c[o>>2]|0);g[(c[k>>2]|0)+12>>2]=v;i=t;return}function sh(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;n=i;i=i+1184|0;p=n+1168|0;f=n+1164|0;o=n+1160|0;h=n+1156|0;m=n+1152|0;k=n+128|0;l=n+64|0;j=n;c[p>>2]=a;c[f>>2]=b;c[o>>2]=d;c[h>>2]=e;th(c[p>>2]|0,c[f>>2]|0,k,j);uh(k,c[f>>2]|0,c[o>>2]|0,l);c[m>>2]=0;while(1){if((c[m>>2]|0)>=(c[f>>2]|0))break;g[l+(c[m>>2]<<2)>>2]=+g[l+(c[m>>2]<<2)>>2]*+g[j+(c[m>>2]<<2)>>2];c[m>>2]=(c[m>>2]|0)+1}vh(k,c[f>>2]|0,l,c[h>>2]|0);i=n;return}function th(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;y=i;i=i+192|0;f=y+184|0;j=y+180|0;k=y+176|0;l=y+172|0;p=y+168|0;q=y+164|0;r=y+160|0;s=y+156|0;o=y+152|0;t=y+148|0;u=y+144|0;v=y+8|0;n=y;w=y+80|0;m=y+16|0;c[f>>2]=a;c[j>>2]=b;c[k>>2]=d;c[l>>2]=e;c[o>>2]=1;b=(_(c[j>>2]|0,c[j>>2]|0)|0)-1|0;h[n>>3]=(+g[c[f>>2]>>2]+ +g[(c[f>>2]|0)+(b<<2)>>2])*4.999999873689376e-06;c[s>>2]=0;while(1){if(!((c[s>>2]|0)<(c[j>>2]|0)?(c[o>>2]|0)==1:0))break;c[o>>2]=0;c[q>>2]=0;while(1){if((c[q>>2]|0)>=(c[j>>2]|0))break;c[t>>2]=(c[k>>2]|0)+((_(c[q>>2]|0,c[j>>2]|0)|0)+0<<2);b=_(c[q>>2]|0,c[j>>2]|0)|0;h[v>>3]=+g[(c[f>>2]|0)+(b+(c[q>>2]|0)<<2)>>2];c[p>>2]=0;while(1){if((c[p>>2]|0)>=(c[q>>2]|0))break;g[w+(c[p>>2]<<2)>>2]=+g[(c[t>>2]|0)+(c[p>>2]<<2)>>2]*+g[m+(c[p>>2]<<2)>>2];h[v>>3]=+h[v>>3]-+g[(c[t>>2]|0)+(c[p>>2]<<2)>>2]*+g[w+(c[p>>2]<<2)>>2];c[p>>2]=(c[p>>2]|0)+1}if(+h[v>>3]<+h[n>>3]){x=9;break}g[m+(c[q>>2]<<2)>>2]=+h[v>>3];g[(c[l>>2]|0)+(c[q>>2]<<2)>>2]=1.0/+h[v>>3];b=_(c[q>>2]|0,c[j>>2]|0)|0;g[(c[k>>2]|0)+(b+(c[q>>2]|0)<<2)>>2]=1.0;c[t>>2]=(c[f>>2]|0)+((_(c[q>>2]|0,c[j>>2]|0)|0)+0<<2);c[u>>2]=(c[k>>2]|0)+((_((c[q>>2]|0)+1|0,c[j>>2]|0)|0)+0<<2);c[p>>2]=(c[q>>2]|0)+1;while(1){if((c[p>>2]|0)>=(c[j>>2]|0))break;h[v>>3]=0.0;c[r>>2]=0;while(1){if((c[r>>2]|0)>=(c[q>>2]|0))break;h[v>>3]=+h[v>>3]+ +g[(c[u>>2]|0)+(c[r>>2]<<2)>>2]*+g[w+(c[r>>2]<<2)>>2];c[r>>2]=(c[r>>2]|0)+1}b=_(c[p>>2]|0,c[j>>2]|0)|0;g[(c[k>>2]|0)+(b+(c[q>>2]|0)<<2)>>2]=(+g[(c[t>>2]|0)+(c[p>>2]<<2)>>2]-+h[v>>3])*+g[(c[l>>2]|0)+(c[q>>2]<<2)>>2];c[u>>2]=(c[u>>2]|0)+(c[j>>2]<<2);c[p>>2]=(c[p>>2]|0)+1}c[q>>2]=(c[q>>2]|0)+1}if((x|0)==9){x=0;h[v>>3]=+((c[s>>2]|0)+1|0)*+h[n>>3]-+h[v>>3];c[p>>2]=0;while(1){if((c[p>>2]|0)>=(c[j>>2]|0))break;b=_(c[p>>2]|0,c[j>>2]|0)|0;b=(c[f>>2]|0)+(b+(c[p>>2]|0)<<2)|0;g[b>>2]=+g[b>>2]+ +h[v>>3];c[p>>2]=(c[p>>2]|0)+1}c[o>>2]=1}c[s>>2]=(c[s>>2]|0)+1}i=y;return}function uh(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;p=i;i=i+32|0;f=p+28|0;h=p+24|0;j=p+20|0;k=p+16|0;l=p+12|0;m=p+8|0;o=p+4|0;n=p;c[f>>2]=a;c[h>>2]=b;c[j>>2]=d;c[k>>2]=e;c[l>>2]=0;while(1){if((c[l>>2]|0)>=(c[h>>2]|0))break;c[n>>2]=(c[f>>2]|0)+((_(c[l>>2]|0,c[h>>2]|0)|0)+0<<2);g[o>>2]=0.0;c[m>>2]=0;while(1){if((c[m>>2]|0)>=(c[l>>2]|0))break;g[o>>2]=+g[o>>2]+ +g[(c[n>>2]|0)+(c[m>>2]<<2)>>2]*+g[(c[k>>2]|0)+(c[m>>2]<<2)>>2];c[m>>2]=(c[m>>2]|0)+1}g[o>>2]=+g[(c[j>>2]|0)+(c[l>>2]<<2)>>2]-+g[o>>2];g[(c[k>>2]|0)+(c[l>>2]<<2)>>2]=+g[o>>2];c[l>>2]=(c[l>>2]|0)+1}i=p;return}function vh(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;p=i;i=i+32|0;f=p+28|0;h=p+24|0;j=p+20|0;k=p+16|0;l=p+12|0;m=p+8|0;o=p+4|0;n=p;c[f>>2]=a;c[h>>2]=b;c[j>>2]=d;c[k>>2]=e;c[l>>2]=(c[h>>2]|0)-1;while(1){if((c[l>>2]|0)<0)break;c[n>>2]=(c[f>>2]|0)+(0+(c[l>>2]|0)<<2);g[o>>2]=0.0;c[m>>2]=(c[h>>2]|0)-1;while(1){if((c[m>>2]|0)<=(c[l>>2]|0))break;e=_(c[m>>2]|0,c[h>>2]|0)|0;g[o>>2]=+g[o>>2]+ +g[(c[n>>2]|0)+(e<<2)>>2]*+g[(c[k>>2]|0)+(c[m>>2]<<2)>>2];c[m>>2]=(c[m>>2]|0)+-1}g[o>>2]=+g[(c[j>>2]|0)+(c[l>>2]<<2)>>2]-+g[o>>2];g[(c[k>>2]|0)+(c[l>>2]<<2)>>2]=+g[o>>2];c[l>>2]=(c[l>>2]|0)+-1}i=p;return}function wh(a,b,d,e,f){a=a|0;b=b|0;d=+d;e=e|0;f=f|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;u=i;i=i+320|0;j=u+312|0;k=u+308|0;l=u+304|0;m=u+300|0;n=u+296|0;q=u+292|0;p=u+288|0;s=u+280|0;t=u+272|0;r=u+136|0;o=u;c[j>>2]=a;c[k>>2]=b;g[l>>2]=d;c[m>>2]=e;c[n>>2]=f;oj(r|0,0,136)|0;oj(o|0,0,136)|0;c[q>>2]=0;while(1){if((c[q>>2]|0)>=(c[m>>2]|0))break;h[s>>3]=+g[(c[k>>2]|0)+(c[q>>2]<<2)>>2];c[p>>2]=0;while(1){if((c[p>>2]|0)>=(c[n>>2]|0))break;h[t>>3]=+h[r+(c[p>>2]<<3)>>3]+ +g[l>>2]*(+h[r+((c[p>>2]|0)+1<<3)>>3]-+h[s>>3]);h[r+(c[p>>2]<<3)>>3]=+h[s>>3];f=o+(c[p>>2]<<3)|0;h[f>>3]=+h[f>>3]+ +h[r>>3]*+h[s>>3];h[s>>3]=+h[r+((c[p>>2]|0)+1<<3)>>3]+ +g[l>>2]*(+h[r+((c[p>>2]|0)+2<<3)>>3]-+h[t>>3]);h[r+((c[p>>2]|0)+1<<3)>>3]=+h[t>>3];f=o+((c[p>>2]|0)+1<<3)|0;h[f>>3]=+h[f>>3]+ +h[r>>3]*+h[t>>3];c[p>>2]=(c[p>>2]|0)+2}h[r+(c[n>>2]<<3)>>3]=+h[s>>3];f=o+(c[n>>2]<<3)|0;h[f>>3]=+h[f>>3]+ +h[r>>3]*+h[s>>3];c[q>>2]=(c[q>>2]|0)+1}c[p>>2]=0;while(1){if((c[p>>2]|0)>=((c[n>>2]|0)+1|0))break;g[(c[j>>2]|0)+(c[p>>2]<<2)>>2]=+h[o+(c[p>>2]<<3)>>3];c[p>>2]=(c[p>>2]|0)+1}i=u;return}function xh(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0,k=0,l=0;l=i;i=i+80|0;e=l+76|0;f=l+72|0;h=l+68|0;k=l+64|0;j=l;c[e>>2]=a;c[f>>2]=b;c[h>>2]=d;c[k>>2]=0;while(1){if((c[k>>2]|0)>=(c[h>>2]|0))break;b=yh(+g[(c[f>>2]|0)+(c[k>>2]<<2)>>2]*65536.0)|0;c[j+(c[k>>2]<<2)>>2]=b;c[k>>2]=(c[k>>2]|0)+1}Hf(c[e>>2]|0,j,c[h>>2]|0);i=l;return}function yh(a){a=+a;var b=0,c=0;c=i;i=i+16|0;b=c;g[b>>2]=a;b=ij(+g[b>>2])|0;i=c;return b|0}function zh(a,d,e){a=a|0;d=d|0;e=e|0;var f=0,h=0,j=0,k=0,l=0,m=0;l=i;i=i+48|0;f=l+12|0;m=l+8|0;h=l+4|0;k=l;j=l+16|0;c[f>>2]=a;c[m>>2]=d;c[h>>2]=e;ag(j,c[m>>2]|0,c[h>>2]|0);c[k>>2]=0;while(1){if((c[k>>2]|0)>=(c[h>>2]|0))break;g[(c[f>>2]|0)+(c[k>>2]<<2)>>2]=+(b[j+(c[k>>2]<<1)>>1]|0)*.000244140625;c[k>>2]=(c[k>>2]|0)+1}i=l;return}function Ah(a,d,e,f){a=a|0;d=d|0;e=e|0;f=f|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;n=i;i=i+96|0;h=n+20|0;j=n+16|0;p=n+12|0;o=n+8|0;l=n+4|0;m=n;k=n+24|0;c[h>>2]=a;c[j>>2]=d;c[p>>2]=e;c[o>>2]=f;pf(c[h>>2]|0,k,c[p>>2]|0,c[o>>2]|0);c[m>>2]=0;while(1){if((c[m>>2]|0)>=2)break;c[l>>2]=0;while(1){if((c[l>>2]|0)>=(c[(c[h>>2]|0)+4664>>2]|0))break;g[(c[j>>2]|0)+(c[m>>2]<<6)+(c[l>>2]<<2)>>2]=+(b[k+(c[m>>2]<<5)+(c[l>>2]<<1)>>1]|0)*.000244140625;c[l>>2]=(c[l>>2]|0)+1}c[m>>2]=(c[m>>2]|0)+1}i=n;return}function Bh(d,e,f,h,j,k){d=d|0;e=e|0;f=f|0;h=h|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;D=i;i=i+1632|0;l=D+1388|0;m=D+1384|0;n=D+1380|0;o=D+1376|0;p=D+1372|0;q=D+1368|0;A=D+1364|0;B=D+1360|0;C=D+80|0;s=D+64|0;y=D+1560|0;v=D+1520|0;w=D+56|0;r=D+1392|0;u=D+40|0;x=D+32|0;z=D+16|0;t=D;c[l>>2]=d;c[m>>2]=e;c[n>>2]=f;c[o>>2]=h;c[p>>2]=j;c[q>>2]=k;c[A>>2]=0;while(1){if((c[A>>2]|0)>=(c[(c[l>>2]|0)+4604>>2]|0))break;c[B>>2]=0;while(1){d=c[A>>2]|0;if((c[B>>2]|0)>=(c[(c[l>>2]|0)+4660>>2]|0))break;k=(yh(+g[(c[m>>2]|0)+500+((d<<4)+(c[B>>2]|0)<<2)>>2]*8192.0)|0)&65535;b[r+((c[A>>2]<<4)+(c[B>>2]|0)<<1)>>1]=k;c[B>>2]=(c[B>>2]|0)+1}c[A>>2]=d+1}c[A>>2]=0;while(1){if((c[A>>2]|0)>=(c[(c[l>>2]|0)+4604>>2]|0))break;k=(yh(+g[(c[m>>2]|0)+772+(c[A>>2]<<2)>>2]*16384.0)|0)<<16;k=k|(yh(+g[(c[m>>2]|0)+756+(c[A>>2]<<2)>>2]*16384.0)|0)&65535;c[u+(c[A>>2]<<2)>>2]=k;k=yh(+g[(c[m>>2]|0)+820+(c[A>>2]<<2)>>2]*16384.0)|0;c[z+(c[A>>2]<<2)>>2]=k;k=yh(+g[(c[m>>2]|0)+836+(c[A>>2]<<2)>>2]*16384.0)|0;c[t+(c[A>>2]<<2)>>2]=k;c[A>>2]=(c[A>>2]|0)+1}c[x>>2]=yh(+g[(c[m>>2]|0)+852>>2]*1024.0)|0;c[A>>2]=0;while(1){if((c[A>>2]|0)>=((c[(c[l>>2]|0)+4604>>2]|0)*5|0))break;k=(yh(+g[(c[m>>2]|0)+144+(c[A>>2]<<2)>>2]*16384.0)|0)&65535;b[v+(c[A>>2]<<1)>>1]=k;c[A>>2]=(c[A>>2]|0)+1}c[B>>2]=0;while(1){k=(c[B>>2]|0)<2;c[A>>2]=0;if(!k)break;while(1){if((c[A>>2]|0)>=(c[(c[l>>2]|0)+4664>>2]|0))break;k=(yh(+g[(c[m>>2]|0)+16+(c[B>>2]<<6)+(c[A>>2]<<2)>>2]*4096.0)|0)&65535;b[y+(c[B>>2]<<5)+(c[A>>2]<<1)>>1]=k;c[A>>2]=(c[A>>2]|0)+1}c[B>>2]=(c[B>>2]|0)+1}while(1){if((c[A>>2]|0)>=(c[(c[l>>2]|0)+4604>>2]|0))break;B=yh(+g[(c[m>>2]|0)+(c[A>>2]<<2)>>2]*65536.0)|0;c[s+(c[A>>2]<<2)>>2]=B;c[A>>2]=(c[A>>2]|0)+1}if((a[(c[n>>2]|0)+29>>0]|0)==2)c[w>>2]=b[24566+(a[(c[n>>2]|0)+33>>0]<<1)>>1];else c[w>>2]=0;c[A>>2]=0;while(1){if((c[A>>2]|0)>=(c[(c[l>>2]|0)+4608>>2]|0))break;B=yh(+g[(c[q>>2]|0)+(c[A>>2]<<2)>>2]*8.0)|0;c[C+(c[A>>2]<<2)>>2]=B;c[A>>2]=(c[A>>2]|0)+1}if((c[(c[l>>2]|0)+4652>>2]|0)<=1?(c[(c[l>>2]|0)+4704>>2]|0)<=0:0){me(c[l>>2]|0,c[o>>2]|0,c[n>>2]|0,C,c[p>>2]|0,y,v,r,t,z,u,s,(c[m>>2]|0)+228|0,c[x>>2]|0,c[w>>2]|0);i=D;return}se(c[l>>2]|0,c[o>>2]|0,c[n>>2]|0,C,c[p>>2]|0,y,v,r,t,z,u,s,(c[m>>2]|0)+228|0,c[x>>2]|0,c[w>>2]|0);i=D;return}function Ch(a,d,e,f,h,j,k,l,m){a=a|0;d=d|0;e=e|0;f=f|0;h=h|0;j=j|0;k=k|0;l=l|0;m=m|0;var n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;z=i;i=i+480|0;n=z+436|0;o=z+432|0;p=z+428|0;q=z+424|0;r=z+420|0;s=z+416|0;t=z+412|0;u=z+408|0;v=z+404|0;y=z+400|0;w=z+440|0;x=z;c[n>>2]=a;c[o>>2]=d;c[p>>2]=e;c[q>>2]=f;c[r>>2]=h;c[s>>2]=j;c[t>>2]=k;c[u>>2]=l;c[v>>2]=m;c[y>>2]=0;while(1){if((c[y>>2]|0)>=((c[u>>2]|0)*5|0))break;f=(yh(+g[(c[n>>2]|0)+(c[y>>2]<<2)>>2]*16384.0)|0)&65535;b[w+(c[y>>2]<<1)>>1]=f;c[y>>2]=(c[y>>2]|0)+1}c[y>>2]=0;while(1){if((c[y>>2]|0)>=(((c[u>>2]|0)*5|0)*5|0))break;f=yh(+g[(c[r>>2]|0)+(c[y>>2]<<2)>>2]*262144.0)|0;c[x+(c[y>>2]<<2)>>2]=f;c[y>>2]=(c[y>>2]|0)+1}df(w,c[o>>2]|0,c[p>>2]|0,c[q>>2]|0,x,c[s>>2]|0,c[t>>2]|0,c[u>>2]|0,c[v>>2]|0);c[y>>2]=0;while(1){if((c[y>>2]|0)>=((c[u>>2]|0)*5|0))break;g[(c[n>>2]|0)+(c[y>>2]<<2)>>2]=+(b[w+(c[y>>2]<<1)>>1]|0)*.00006103515625;c[y>>2]=(c[y>>2]|0)+1}i=z;return}function Dh(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0,j=0,k=0,l=0,m=0,n=0.0;m=i;i=i+32|0;f=m+16|0;h=m+12|0;j=m+8|0;k=m+4|0;l=m;c[f>>2]=a;c[h>>2]=b;c[j>>2]=d;c[k>>2]=e;if((c[k>>2]|0)>(c[j>>2]|0))c[k>>2]=c[j>>2];c[l>>2]=0;while(1){if((c[l>>2]|0)>=(c[k>>2]|0))break;n=+Hh(c[h>>2]|0,(c[h>>2]|0)+(c[l>>2]<<2)|0,(c[j>>2]|0)-(c[l>>2]|0)|0);g[(c[f>>2]|0)+(c[l>>2]<<2)>>2]=n;c[l>>2]=(c[l>>2]|0)+1}i=m;return}function Eh(a,b,d,e,f,j){a=a|0;b=b|0;d=+d;e=e|0;f=f|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0;K=i;i=i+784|0;k=K+768|0;l=K+764|0;m=K+760|0;n=K+756|0;o=K+752|0;p=K+748|0;y=K+744|0;z=K+740|0;F=K+736|0;E=K+732|0;s=K+720|0;x=K+712|0;C=K+704|0;B=K+696|0;A=K+688|0;D=K+680|0;r=K+672|0;G=K+664|0;H=K+656|0;I=K+728|0;v=K+528|0;w=K+400|0;u=K+264|0;t=K+128|0;q=K;c[k>>2]=a;c[l>>2]=b;g[m>>2]=d;c[n>>2]=e;c[o>>2]=f;c[p>>2]=j;h[s>>3]=+Gh(c[l>>2]|0,_(c[o>>2]|0,c[n>>2]|0)|0);a=v;f=a+128|0;do{c[a>>2]=0;a=a+4|0}while((a|0)<(f|0));c[F>>2]=0;while(1){if((c[F>>2]|0)>=(c[o>>2]|0))break;c[I>>2]=(c[l>>2]|0)+((_(c[F>>2]|0,c[n>>2]|0)|0)<<2);c[z>>2]=1;while(1){if((c[z>>2]|0)>=((c[p>>2]|0)+1|0))break;d=+Hh(c[I>>2]|0,(c[I>>2]|0)+(c[z>>2]<<2)|0,(c[n>>2]|0)-(c[z>>2]|0)|0);b=v+((c[z>>2]|0)-1<<3)|0;h[b>>3]=+h[b>>3]+d;c[z>>2]=(c[z>>2]|0)+1}c[F>>2]=(c[F>>2]|0)+1}a=w;j=v;f=a+128|0;do{c[a>>2]=c[j>>2];a=a+4|0;j=j+4|0}while((a|0)<(f|0));d=+h[s>>3]+ +h[s>>3]*9.999999747378752e-06+9.999999717180685e-10;h[u>>3]=d;h[t>>3]=d;h[x>>3]=1.0;c[E>>2]=0;c[z>>2]=0;while(1){if((c[z>>2]|0)>=(c[p>>2]|0))break;c[F>>2]=0;while(1){if((c[F>>2]|0)>=(c[o>>2]|0))break;c[I>>2]=(c[l>>2]|0)+((_(c[F>>2]|0,c[n>>2]|0)|0)<<2);h[G>>3]=+g[(c[I>>2]|0)+(c[z>>2]<<2)>>2];h[H>>3]=+g[(c[I>>2]|0)+((c[n>>2]|0)-(c[z>>2]|0)-1<<2)>>2];c[y>>2]=0;while(1){if((c[y>>2]|0)>=(c[z>>2]|0))break;b=v+(c[y>>2]<<3)|0;h[b>>3]=+h[b>>3]-+g[(c[I>>2]|0)+(c[z>>2]<<2)>>2]*+g[(c[I>>2]|0)+((c[z>>2]|0)-(c[y>>2]|0)-1<<2)>>2];b=w+(c[y>>2]<<3)|0;h[b>>3]=+h[b>>3]-+g[(c[I>>2]|0)+((c[n>>2]|0)-(c[z>>2]|0)-1<<2)>>2]*+g[(c[I>>2]|0)+((c[n>>2]|0)-(c[z>>2]|0)+(c[y>>2]|0)<<2)>>2];h[r>>3]=+h[q+(c[y>>2]<<3)>>3];h[G>>3]=+h[G>>3]+ +g[(c[I>>2]|0)+((c[z>>2]|0)-(c[y>>2]|0)-1<<2)>>2]*+h[r>>3];h[H>>3]=+h[H>>3]+ +g[(c[I>>2]|0)+((c[n>>2]|0)-(c[z>>2]|0)+(c[y>>2]|0)<<2)>>2]*+h[r>>3];c[y>>2]=(c[y>>2]|0)+1}c[y>>2]=0;while(1){if((c[y>>2]|0)>(c[z>>2]|0))break;b=u+(c[y>>2]<<3)|0;h[b>>3]=+h[b>>3]-+h[G>>3]*+g[(c[I>>2]|0)+((c[z>>2]|0)-(c[y>>2]|0)<<2)>>2];b=t+(c[y>>2]<<3)|0;h[b>>3]=+h[b>>3]-+h[H>>3]*+g[(c[I>>2]|0)+((c[n>>2]|0)-(c[z>>2]|0)+(c[y>>2]|0)-1<<2)>>2];c[y>>2]=(c[y>>2]|0)+1}c[F>>2]=(c[F>>2]|0)+1}h[G>>3]=+h[v+(c[z>>2]<<3)>>3];h[H>>3]=+h[w+(c[z>>2]<<3)>>3];c[y>>2]=0;while(1){if((c[y>>2]|0)>=(c[z>>2]|0))break;h[r>>3]=+h[q+(c[y>>2]<<3)>>3];h[G>>3]=+h[G>>3]+ +h[w+((c[z>>2]|0)-(c[y>>2]|0)-1<<3)>>3]*+h[r>>3];h[H>>3]=+h[H>>3]+ +h[v+((c[z>>2]|0)-(c[y>>2]|0)-1<<3)>>3]*+h[r>>3];c[y>>2]=(c[y>>2]|0)+1}h[u+((c[z>>2]|0)+1<<3)>>3]=+h[G>>3];h[t+((c[z>>2]|0)+1<<3)>>3]=+h[H>>3];h[C>>3]=+h[t+((c[z>>2]|0)+1<<3)>>3];h[A>>3]=+h[t>>3];h[B>>3]=+h[u>>3];c[y>>2]=0;while(1){if((c[y>>2]|0)>=(c[z>>2]|0))break;h[r>>3]=+h[q+(c[y>>2]<<3)>>3];h[C>>3]=+h[C>>3]+ +h[t+((c[z>>2]|0)-(c[y>>2]|0)<<3)>>3]*+h[r>>3];h[A>>3]=+h[A>>3]+ +h[t+((c[y>>2]|0)+1<<3)>>3]*+h[r>>3];h[B>>3]=+h[B>>3]+ +h[u+((c[y>>2]|0)+1<<3)>>3]*+h[r>>3];c[y>>2]=(c[y>>2]|0)+1}h[D>>3]=+h[C>>3]*-2.0/(+h[B>>3]+ +h[A>>3]);h[G>>3]=+h[x>>3]*(1.0-+h[D>>3]*+h[D>>3]);if(+h[G>>3]<=+g[m>>2]){h[D>>3]=+O(+(1.0-+g[m>>2]/+h[x>>3]));if(+h[C>>3]>0.0)h[D>>3]=-+h[D>>3];h[x>>3]=+g[m>>2];c[E>>2]=1}else h[x>>3]=+h[G>>3];c[y>>2]=0;while(1){if((c[y>>2]|0)>=((c[z>>2]|0)+1>>1|0))break;h[G>>3]=+h[q+(c[y>>2]<<3)>>3];h[H>>3]=+h[q+((c[z>>2]|0)-(c[y>>2]|0)-1<<3)>>3];h[q+(c[y>>2]<<3)>>3]=+h[G>>3]+ +h[D>>3]*+h[H>>3];h[q+((c[z>>2]|0)-(c[y>>2]|0)-1<<3)>>3]=+h[H>>3]+ +h[D>>3]*+h[G>>3];c[y>>2]=(c[y>>2]|0)+1}h[q+(c[z>>2]<<3)>>3]=+h[D>>3];if(c[E>>2]|0){J=33;break}c[y>>2]=0;while(1){if((c[y>>2]|0)>((c[z>>2]|0)+1|0))break;h[G>>3]=+h[u+(c[y>>2]<<3)>>3];b=u+(c[y>>2]<<3)|0;h[b>>3]=+h[b>>3]+ +h[D>>3]*+h[t+((c[z>>2]|0)-(c[y>>2]|0)+1<<3)>>3];b=t+((c[z>>2]|0)-(c[y>>2]|0)+1<<3)|0;h[b>>3]=+h[b>>3]+ +h[D>>3]*+h[G>>3];c[y>>2]=(c[y>>2]|0)+1}c[z>>2]=(c[z>>2]|0)+1}a:do if((J|0)==33){c[y>>2]=(c[z>>2]|0)+1;while(1){if((c[y>>2]|0)>=(c[p>>2]|0))break a;h[q+(c[y>>2]<<3)>>3]=0.0;c[y>>2]=(c[y>>2]|0)+1}}while(0);if(!(c[E>>2]|0)){h[B>>3]=+h[u>>3];h[G>>3]=1.0;c[y>>2]=0;while(1){if((c[y>>2]|0)>=(c[p>>2]|0))break;h[r>>3]=+h[q+(c[y>>2]<<3)>>3];h[B>>3]=+h[B>>3]+ +h[u+((c[y>>2]|0)+1<<3)>>3]*+h[r>>3];h[G>>3]=+h[G>>3]+ +h[r>>3]*+h[r>>3];g[(c[k>>2]|0)+(c[y>>2]<<2)>>2]=-+h[r>>3];c[y>>2]=(c[y>>2]|0)+1}h[B>>3]=+h[B>>3]-+h[s>>3]*9.999999747378752e-06*+h[G>>3];d=+h[B>>3];i=K;return +d}c[y>>2]=0;while(1){if((c[y>>2]|0)>=(c[p>>2]|0))break;g[(c[k>>2]|0)+(c[y>>2]<<2)>>2]=-+h[q+(c[y>>2]<<3)>>3];c[y>>2]=(c[y>>2]|0)+1}c[F>>2]=0;while(1){if((c[F>>2]|0)>=(c[o>>2]|0))break;J=(c[l>>2]|0)+((_(c[F>>2]|0,c[n>>2]|0)|0)<<2)|0;d=+Gh(J,c[p>>2]|0);h[s>>3]=+h[s>>3]-d;c[F>>2]=(c[F>>2]|0)+1}h[B>>3]=+h[s>>3]*+h[x>>3];d=+h[B>>3];i=K;return +d}function Fh(a,b,d){a=a|0;b=b|0;d=+d;var e=0,f=0,h=0,j=0,k=0,l=0;l=i;i=i+32|0;e=l+16|0;f=l+12|0;h=l+8|0;k=l+4|0;j=l;c[e>>2]=a;c[f>>2]=b;g[h>>2]=d;g[j>>2]=+g[h>>2];c[k>>2]=0;while(1){d=+g[j>>2];if((c[k>>2]|0)>=((c[f>>2]|0)-1|0))break;b=(c[e>>2]|0)+(c[k>>2]<<2)|0;g[b>>2]=+g[b>>2]*d;g[j>>2]=+g[j>>2]*+g[h>>2];c[k>>2]=(c[k>>2]|0)+1}k=(c[e>>2]|0)+((c[f>>2]|0)-1<<2)|0;g[k>>2]=+g[k>>2]*d;i=l;return}function Gh(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,j=0,k=0,l=0;l=i;i=i+32|0;d=l+20|0;e=l+16|0;j=l+12|0;f=l+8|0;k=l;c[d>>2]=a;c[e>>2]=b;h[k>>3]=0.0;c[f>>2]=c[e>>2]&65532;c[j>>2]=0;while(1){if((c[j>>2]|0)>=(c[f>>2]|0))break;h[k>>3]=+h[k>>3]+(+g[(c[d>>2]|0)+((c[j>>2]|0)+0<<2)>>2]*+g[(c[d>>2]|0)+((c[j>>2]|0)+0<<2)>>2]+ +g[(c[d>>2]|0)+((c[j>>2]|0)+1<<2)>>2]*+g[(c[d>>2]|0)+((c[j>>2]|0)+1<<2)>>2]+ +g[(c[d>>2]|0)+((c[j>>2]|0)+2<<2)>>2]*+g[(c[d>>2]|0)+((c[j>>2]|0)+2<<2)>>2]+ +g[(c[d>>2]|0)+((c[j>>2]|0)+3<<2)>>2]*+g[(c[d>>2]|0)+((c[j>>2]|0)+3<<2)>>2]);c[j>>2]=(c[j>>2]|0)+4}while(1){if((c[j>>2]|0)>=(c[e>>2]|0))break;h[k>>3]=+h[k>>3]+ +g[(c[d>>2]|0)+(c[j>>2]<<2)>>2]*+g[(c[d>>2]|0)+(c[j>>2]<<2)>>2];c[j>>2]=(c[j>>2]|0)+1}i=l;return +(+h[k>>3])}function Hh(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,j=0,k=0,l=0,m=0,n=0;n=i;i=i+32|0;e=n+24|0;f=n+20|0;j=n+16|0;l=n+12|0;k=n+8|0;m=n;c[e>>2]=a;c[f>>2]=b;c[j>>2]=d;h[m>>3]=0.0;c[k>>2]=c[j>>2]&65532;c[l>>2]=0;while(1){if((c[l>>2]|0)>=(c[k>>2]|0))break;h[m>>3]=+h[m>>3]+(+g[(c[e>>2]|0)+((c[l>>2]|0)+0<<2)>>2]*+g[(c[f>>2]|0)+((c[l>>2]|0)+0<<2)>>2]+ +g[(c[e>>2]|0)+((c[l>>2]|0)+1<<2)>>2]*+g[(c[f>>2]|0)+((c[l>>2]|0)+1<<2)>>2]+ +g[(c[e>>2]|0)+((c[l>>2]|0)+2<<2)>>2]*+g[(c[f>>2]|0)+((c[l>>2]|0)+2<<2)>>2]+ +g[(c[e>>2]|0)+((c[l>>2]|0)+3<<2)>>2]*+g[(c[f>>2]|0)+((c[l>>2]|0)+3<<2)>>2]);c[l>>2]=(c[l>>2]|0)+4}while(1){if((c[l>>2]|0)>=(c[j>>2]|0))break;h[m>>3]=+h[m>>3]+ +g[(c[e>>2]|0)+(c[l>>2]<<2)>>2]*+g[(c[f>>2]|0)+(c[l>>2]<<2)>>2];c[l>>2]=(c[l>>2]|0)+1}i=n;return +(+h[m>>3])}function Ih(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0,k=0,l=0,m=0;m=i;i=i+96|0;e=m+80|0;f=m+76|0;h=m+72|0;k=m+68|0;l=m+64|0;j=m;c[e>>2]=a;c[f>>2]=b;c[h>>2]=d;c[k>>2]=0;while(1){if((c[k>>2]|0)>=(c[h>>2]|0))break;c[l>>2]=0;while(1){if((c[l>>2]|0)>=(c[k>>2]|0))break;g[j+(c[l>>2]<<2)>>2]=+g[(c[e>>2]|0)+(c[l>>2]<<2)>>2];c[l>>2]=(c[l>>2]|0)+1}c[l>>2]=0;while(1){a=c[k>>2]|0;if((c[l>>2]|0)>=(c[k>>2]|0))break;b=(c[e>>2]|0)+(c[l>>2]<<2)|0;g[b>>2]=+g[b>>2]+ +g[j+(a-(c[l>>2]|0)-1<<2)>>2]*+g[(c[f>>2]|0)+(c[k>>2]<<2)>>2];c[l>>2]=(c[l>>2]|0)+1}g[(c[e>>2]|0)+(c[k>>2]<<2)>>2]=-+g[(c[f>>2]|0)+(a<<2)>>2];c[k>>2]=(c[k>>2]|0)+1}i=m;return}function Jh(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;s=i;i=i+48|0;e=s+44|0;f=s+40|0;h=s+36|0;l=s+32|0;o=s+28|0;n=s+24|0;p=s+20|0;q=s+16|0;r=s+12|0;m=s+8|0;j=s+4|0;k=s;c[e>>2]=a;c[f>>2]=b;c[h>>2]=d;g[p>>2]=+g[c[f>>2]>>2]*9.999999960041972e-13+9.999999717180685e-10;g[q>>2]=+g[c[f>>2]>>2];g[q>>2]=+g[p>>2]>+g[q>>2]?+g[p>>2]:+g[q>>2];g[c[e>>2]>>2]=+g[(c[f>>2]|0)+4>>2]/+g[q>>2];g[q>>2]=+g[q>>2]-+g[c[e>>2]>>2]*+g[(c[f>>2]|0)+4>>2];g[q>>2]=+g[p>>2]>+g[q>>2]?+g[p>>2]:+g[q>>2];c[n>>2]=1;while(1){if((c[n>>2]|0)>=(c[h>>2]|0))break;g[r>>2]=+g[(c[f>>2]|0)+((c[n>>2]|0)+1<<2)>>2];c[l>>2]=0;while(1){if((c[l>>2]|0)>=(c[n>>2]|0))break;g[r>>2]=+g[r>>2]-+g[(c[e>>2]|0)+(c[l>>2]<<2)>>2]*+g[(c[f>>2]|0)+((c[n>>2]|0)-(c[l>>2]|0)<<2)>>2];c[l>>2]=(c[l>>2]|0)+1}g[m>>2]=+g[r>>2]/+g[q>>2];g[q>>2]=+g[q>>2]-+g[m>>2]*+g[r>>2];g[q>>2]=+g[p>>2]>+g[q>>2]?+g[p>>2]:+g[q>>2];c[o>>2]=c[n>>2]>>1;c[l>>2]=0;while(1){if((c[l>>2]|0)>=(c[o>>2]|0))break;g[j>>2]=+g[(c[e>>2]|0)+(c[l>>2]<<2)>>2];g[k>>2]=+g[(c[e>>2]|0)+((c[n>>2]|0)-(c[l>>2]|0)-1<<2)>>2];d=(c[e>>2]|0)+((c[n>>2]|0)-(c[l>>2]|0)-1<<2)|0;g[d>>2]=+g[d>>2]-+g[m>>2]*+g[j>>2];d=(c[e>>2]|0)+(c[l>>2]<<2)|0;g[d>>2]=+g[d>>2]-+g[m>>2]*+g[k>>2];c[l>>2]=(c[l>>2]|0)+1}if(c[n>>2]&1|0){d=(c[e>>2]|0)+(c[o>>2]<<2)|0;g[d>>2]=+g[d>>2]-+g[m>>2]*+g[(c[e>>2]|0)+(c[o>>2]<<2)>>2]}g[(c[e>>2]|0)+(c[n>>2]<<2)>>2]=+g[m>>2];c[n>>2]=(c[n>>2]|0)+1}i=s;return +(+g[q>>2])}function Kh(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0.0;r=i;i=i+192|0;d=r+184|0;t=r+180|0;s=r+176|0;l=r+172|0;m=r+168|0;k=r+24|0;n=r+16|0;o=r+8|0;p=r;j=r+40|0;f=r+36|0;e=r+32|0;c[t>>2]=a;c[s>>2]=b;c[e>>2]=j+((c[s>>2]&1)<<6);pj(c[e>>2]|0,c[t>>2]|0,c[s>>2]<<2|0)|0;h[k>>3]=1.0;c[l>>2]=(c[s>>2]|0)-1;while(1){if((c[l>>2]|0)<=0)break;h[n>>3]=-+g[(c[e>>2]|0)+(c[l>>2]<<2)>>2];if(+h[n>>3]>.9998999834060669|+h[n>>3]<-.9998999834060669){q=4;break}h[o>>3]=1.0-+h[n>>3]*+h[n>>3];h[p>>3]=1.0/+h[o>>3];h[k>>3]=+h[k>>3]*+h[o>>3];c[f>>2]=c[e>>2];c[e>>2]=j+((c[l>>2]&1)<<6);c[m>>2]=0;while(1){if((c[m>>2]|0)>=(c[l>>2]|0))break;g[(c[e>>2]|0)+(c[m>>2]<<2)>>2]=(+g[(c[f>>2]|0)+(c[m>>2]<<2)>>2]-+g[(c[f>>2]|0)+((c[l>>2]|0)-(c[m>>2]|0)-1<<2)>>2]*+h[n>>3])*+h[p>>3];c[m>>2]=(c[m>>2]|0)+1}c[l>>2]=(c[l>>2]|0)+-1}if((q|0)==4){g[d>>2]=0.0;u=+g[d>>2];i=r;return +u}h[n>>3]=-+g[c[e>>2]>>2];if(+h[n>>3]>.9998999834060669|+h[n>>3]<-.9998999834060669){g[d>>2]=0.0;u=+g[d>>2];i=r;return +u}else{h[o>>3]=1.0-+h[n>>3]*+h[n>>3];h[k>>3]=+h[k>>3]*+h[o>>3];g[d>>2]=+h[k>>3];u=+g[d>>2];i=r;return +u}return 0.0}function Lh(d,e,f,j,k,l,m,n,o,p,q,r){d=d|0;e=e|0;f=f|0;j=j|0;k=k|0;l=l|0;m=+m;n=+n;o=o|0;p=p|0;q=q|0;r=r|0;var s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0;La=i;i=i+13936|0;Ca=La+10416|0;da=La+10412|0;Ea=La+10408|0;Fa=La+10404|0;Ga=La+10400|0;H=La+10396|0;I=La+10392|0;s=La+10388|0;J=La+10384|0;ya=La+10380|0;ea=La+10376|0;Da=La+10372|0;fa=La+10368|0;U=La+10364|0;Ka=La+10360|0;la=La+10356|0;qa=La+10352|0;T=La+9072|0;y=La+8432|0;z=La+13288|0;x=La+12968|0;u=La+8408|0;ba=La+8404|0;ia=La+8400|0;K=La+6016|0;G=La+5756|0;M=La+5712|0;xa=La+5708|0;P=La+5704|0;ja=La+24|0;E=La+16|0;oa=La+8|0;pa=La;R=La+5608|0;Q=La+12664|0;X=La+5600|0;W=La+5596|0;t=La+5592|0;ga=La+5588|0;N=La+5584|0;O=La+5580|0;ha=La+5576|0;Ha=La+5572|0;L=La+5568|0;za=La+5564|0;wa=La+5560|0;ma=La+5556|0;Aa=La+5552|0;Ja=La+5548|0;V=La+5544|0;$=La+5540|0;S=La+5536|0;na=La+2816|0;ka=La+96|0;ra=La+88|0;A=La+84|0;C=La+80|0;B=La+76|0;va=La+72|0;aa=La+68|0;F=La+64|0;Ba=La+60|0;ta=La+56|0;Z=La+52|0;sa=La+48|0;Y=La+44|0;D=La+40|0;ua=La+36|0;Ia=La+32|0;w=La+11384|0;v=La+10424|0;c[da>>2]=d;c[Ea>>2]=e;c[Fa>>2]=f;c[Ga>>2]=j;c[H>>2]=k;c[I>>2]=l;g[s>>2]=m;g[J>>2]=n;c[ya>>2]=o;c[ea>>2]=p;c[Da>>2]=q;c[fa>>2]=r;c[A>>2]=_(20+((c[Da>>2]|0)*5|0)|0,c[ya>>2]|0)|0;c[B>>2]=20+((c[Da>>2]|0)*5|0)<<2;c[C>>2]=20+((c[Da>>2]|0)*5|0)<<3;c[va>>2]=(c[ya>>2]|0)*5;c[F>>2]=20;c[aa>>2]=40;c[Ba>>2]=c[ya>>2]<<1;c[Z>>2]=8;c[ta>>2]=16;c[sa>>2]=((c[ya>>2]|0)*18|0)-1;c[D>>2]=72;c[Y>>2]=143;do if((c[ya>>2]|0)!=16)if((c[ya>>2]|0)==12){Mh(v,c[da>>2]|0,c[A>>2]|0);c[u>>2]=0;c[u+4>>2]=0;c[u+8>>2]=0;c[u+12>>2]=0;c[u+16>>2]=0;c[u+20>>2]=0;kg(u,z,v,c[A>>2]|0);Nh(T,z,c[C>>2]|0);break}else{Mh(z,c[da>>2]|0,c[C>>2]|0);break}else{Mh(w,c[da>>2]|0,c[A>>2]|0);c[u>>2]=0;c[u+4>>2]=0;lg(u,z,w,c[A>>2]|0);Nh(T,z,c[C>>2]|0)}while(0);c[u>>2]=0;c[u+4>>2]=0;lg(u,x,z,c[C>>2]|0);Nh(y,x,c[B>>2]|0);c[U>>2]=(c[B>>2]|0)-1;while(1){if((c[U>>2]|0)<=0)break;l=y+(c[U>>2]<<2)|0;g[l>>2]=+g[l>>2]+ +g[y+((c[U>>2]|0)-1<<2)>>2];c[U>>2]=(c[U>>2]|0)+-1}oj(K|0,0,(c[Da>>2]<<2)*149|0)|0;c[xa>>2]=y+(c[F>>2]<<2<<2);c[Ka>>2]=0;while(1){if((c[Ka>>2]|0)>=(c[Da>>2]>>1|0))break;c[P>>2]=(c[xa>>2]|0)+(0-(c[Z>>2]|0)<<2);Mc(c[xa>>2]|0,(c[xa>>2]|0)+(0-(c[D>>2]|0)<<2)|0,G,c[aa>>2]|0,(c[D>>2]|0)-(c[Z>>2]|0)+1|0,c[fa>>2]|0);h[ja>>3]=+g[G+((c[D>>2]|0)-(c[Z>>2]|0)<<2)>>2];n=+Gh(c[xa>>2]|0,c[aa>>2]|0);n=n+ +Gh(c[P>>2]|0,c[aa>>2]|0);h[E>>3]=n+ +(c[aa>>2]|0)*4.0e3;F=K+(c[Z>>2]<<2)|0;g[F>>2]=+g[F>>2]+ +h[ja>>3]*2.0/+h[E>>3];c[la>>2]=(c[Z>>2]|0)+1;while(1){if((c[la>>2]|0)>(c[D>>2]|0))break;c[P>>2]=(c[P>>2]|0)+-4;h[ja>>3]=+g[G+((c[D>>2]|0)-(c[la>>2]|0)<<2)>>2];h[E>>3]=+h[E>>3]+(+g[c[P>>2]>>2]*+g[c[P>>2]>>2]-+g[(c[P>>2]|0)+(c[aa>>2]<<2)>>2]*+g[(c[P>>2]|0)+(c[aa>>2]<<2)>>2]);F=K+(c[la>>2]<<2)|0;g[F>>2]=+g[F>>2]+ +h[ja>>3]*2.0/+h[E>>3];c[la>>2]=(c[la>>2]|0)+1}c[xa>>2]=(c[xa>>2]|0)+(c[aa>>2]<<2);c[Ka>>2]=(c[Ka>>2]|0)+1}c[U>>2]=c[D>>2];while(1){if((c[U>>2]|0)<(c[Z>>2]|0))break;G=K+(c[U>>2]<<2)|0;g[G>>2]=+g[G>>2]-+g[K+(c[U>>2]<<2)>>2]*+(c[U>>2]|0)/4096.0;c[U>>2]=(c[U>>2]|0)+-1}c[X>>2]=4+(c[ea>>2]<<1);Wh(K+(c[Z>>2]<<2)|0,R,(c[D>>2]|0)-(c[Z>>2]|0)+1|0,c[X>>2]|0);g[t>>2]=+g[K+(c[Z>>2]<<2)>>2];if(+g[t>>2]<.20000000298023224){oj(c[Ea>>2]|0,0,c[Da>>2]<<2|0)|0;g[c[H>>2]>>2]=0.0;b[c[Fa>>2]>>1]=0;a[c[Ga>>2]>>0]=0;c[Ca>>2]=1;Ka=c[Ca>>2]|0;i=La;return Ka|0}g[ba>>2]=+g[s>>2]*+g[t>>2];c[U>>2]=0;while(1){if((c[U>>2]|0)>=(c[X>>2]|0))break;s=c[U>>2]|0;if(!(+g[K+((c[Z>>2]|0)+(c[U>>2]|0)<<2)>>2]>+g[ba>>2])){ca=24;break}c[R+(c[U>>2]<<2)>>2]=(c[R+(s<<2)>>2]|0)+(c[Z>>2]|0)<<1;c[U>>2]=(c[U>>2]|0)+1}if((ca|0)==24)c[X>>2]=s;c[U>>2]=(c[ta>>2]|0)-5;while(1){if((c[U>>2]|0)>=((c[Y>>2]|0)+5|0))break;b[Q+(c[U>>2]<<1)>>1]=0;c[U>>2]=(c[U>>2]|0)+1}c[U>>2]=0;while(1){if((c[U>>2]|0)>=(c[X>>2]|0))break;b[Q+(c[R+(c[U>>2]<<2)>>2]<<1)>>1]=1;c[U>>2]=(c[U>>2]|0)+1}c[U>>2]=(c[Y>>2]|0)+3;while(1){if((c[U>>2]|0)<(c[ta>>2]|0))break;ca=Q+(c[U>>2]<<1)|0;b[ca>>1]=(b[ca>>1]|0)+((b[Q+((c[U>>2]|0)-1<<1)>>1]|0)+(b[Q+((c[U>>2]|0)-2<<1)>>1]|0));c[U>>2]=(c[U>>2]|0)+-1}c[X>>2]=0;c[U>>2]=c[ta>>2];while(1){if((c[U>>2]|0)>=((c[Y>>2]|0)+1|0))break;if((b[Q+((c[U>>2]|0)+1<<1)>>1]|0)>0){c[R+(c[X>>2]<<2)>>2]=c[U>>2];c[X>>2]=(c[X>>2]|0)+1}c[U>>2]=(c[U>>2]|0)+1}c[U>>2]=(c[Y>>2]|0)+3;while(1){if((c[U>>2]|0)<(c[ta>>2]|0))break;ca=Q+(c[U>>2]<<1)|0;b[ca>>1]=(b[ca>>1]|0)+((b[Q+((c[U>>2]|0)-1<<1)>>1]|0)+(b[Q+((c[U>>2]|0)-2<<1)>>1]|0)+(b[Q+((c[U>>2]|0)-3<<1)>>1]|0));c[U>>2]=(c[U>>2]|0)+-1}c[W>>2]=0;c[U>>2]=c[ta>>2];while(1){if((c[U>>2]|0)>=((c[Y>>2]|0)+4|0))break;if((b[Q+(c[U>>2]<<1)>>1]|0)>0){b[Q+(c[W>>2]<<1)>>1]=(c[U>>2]|0)-2;c[W>>2]=(c[W>>2]|0)+1}c[U>>2]=(c[U>>2]|0)+1}oj(K|0,0,2384)|0;if((c[ya>>2]|0)==8)c[xa>>2]=(c[da>>2]|0)+640;else c[xa>>2]=T+640;c[Ka>>2]=0;while(1){if((c[Ka>>2]|0)>=(c[Da>>2]|0))break;h[pa>>3]=+Gh(c[xa>>2]|0,c[aa>>2]|0)+1.0;c[qa>>2]=0;while(1){if((c[qa>>2]|0)>=(c[W>>2]|0))break;c[la>>2]=b[Q+(c[qa>>2]<<1)>>1];c[P>>2]=(c[xa>>2]|0)+(0-(c[la>>2]|0)<<2);h[ja>>3]=+Hh(c[P>>2]|0,c[xa>>2]|0,c[aa>>2]|0);if(+h[ja>>3]>0.0){h[oa>>3]=+Gh(c[P>>2]|0,c[aa>>2]|0);g[K+((c[Ka>>2]|0)*596|0)+(c[la>>2]<<2)>>2]=+h[ja>>3]*2.0/(+h[oa>>3]+ +h[pa>>3])}else g[K+((c[Ka>>2]|0)*596|0)+(c[la>>2]<<2)>>2]=0.0;c[qa>>2]=(c[qa>>2]|0)+1}c[xa>>2]=(c[xa>>2]|0)+(c[aa>>2]<<2);c[Ka>>2]=(c[Ka>>2]|0)+1}g[ga>>2]=0.0;g[N>>2]=-1.0e3;c[Ha>>2]=0;c[za>>2]=-1;if((c[I>>2]|0)>0){if((c[ya>>2]|0)!=12){if((c[ya>>2]|0)==16)c[I>>2]=c[I>>2]>>1}else c[I>>2]=(c[I>>2]<<1|0)/3|0;g[$>>2]=+Oh(+(c[I>>2]|0))}else g[$>>2]=0.0;do if((c[Da>>2]|0)==4){c[Ja>>2]=11;c[Ia>>2]=30286;if((c[ya>>2]|0)==8&(c[ea>>2]|0)>0){c[ua>>2]=11;break}else{c[ua>>2]=3;break}}else{c[Ja>>2]=3;c[Ia>>2]=30252;c[ua>>2]=3}while(0);c[Ka>>2]=0;while(1){if((c[Ka>>2]|0)>=(c[X>>2]|0))break;c[la>>2]=c[R+(c[Ka>>2]<<2)>>2];c[qa>>2]=0;while(1){if((c[qa>>2]|0)>=(c[ua>>2]|0))break;g[M+(c[qa>>2]<<2)>>2]=0.0;c[U>>2]=0;while(1){if((c[U>>2]|0)>=(c[Da>>2]|0))break;ba=_(c[U>>2]|0,c[Ja>>2]|0)|0;ca=M+(c[qa>>2]<<2)|0;g[ca>>2]=+g[ca>>2]+ +g[K+((c[U>>2]|0)*596|0)+((c[la>>2]|0)+(a[(c[Ia>>2]|0)+(ba+(c[qa>>2]|0))>>0]|0)<<2)>>2];c[U>>2]=(c[U>>2]|0)+1}c[qa>>2]=(c[qa>>2]|0)+1}g[ha>>2]=-1.0e3;c[L>>2]=0;c[U>>2]=0;while(1){if((c[U>>2]|0)>=(c[ua>>2]|0))break;if(+g[M+(c[U>>2]<<2)>>2]>+g[ha>>2]){g[ha>>2]=+g[M+(c[U>>2]<<2)>>2];c[L>>2]=c[U>>2]}c[U>>2]=(c[U>>2]|0)+1}g[V>>2]=+Oh(+(c[la>>2]|0));g[O>>2]=+g[ha>>2]-+(c[Da>>2]|0)*.20000000298023224*+g[V>>2];if((c[I>>2]|0)>0){g[S>>2]=+g[V>>2]-+g[$>>2];g[S>>2]=+g[S>>2]*+g[S>>2];g[O>>2]=+g[O>>2]-+(c[Da>>2]|0)*.20000000298023224*+g[c[H>>2]>>2]*+g[S>>2]/(+g[S>>2]+.5)}if(+g[O>>2]>+g[N>>2]?+g[ha>>2]>+(c[Da>>2]|0)*+g[J>>2]:0){g[N>>2]=+g[O>>2];g[ga>>2]=+g[ha>>2];c[za>>2]=c[la>>2];c[Ha>>2]=c[L>>2]}c[Ka>>2]=(c[Ka>>2]|0)+1}if((c[za>>2]|0)==-1){Ka=c[Ea>>2]|0;c[Ka>>2]=0;c[Ka+4>>2]=0;c[Ka+8>>2]=0;c[Ka+12>>2]=0;g[c[H>>2]>>2]=0.0;b[c[Fa>>2]>>1]=0;a[c[Ga>>2]>>0]=0;c[Ca>>2]=1;Ka=c[Ca>>2]|0;i=La;return Ka|0}g[c[H>>2]>>2]=+g[ga>>2]/+(c[Da>>2]|0);if((c[ya>>2]|0)>8){s=c[za>>2]|0;if((c[ya>>2]|0)==12)c[za>>2]=(((s&65535)<<16>>16)*3>>1)+(((c[za>>2]&65535)<<16>>16)*3&1);else c[za>>2]=s<<1;s=c[za>>2]|0;do if((c[Ba>>2]|0)>(c[sa>>2]|0))if((s|0)>(c[Ba>>2]|0)){s=c[Ba>>2]|0;break}else{s=(c[za>>2]|0)<(c[sa>>2]|0)?c[sa>>2]|0:c[za>>2]|0;break}else if((s|0)>(c[sa>>2]|0)){s=c[sa>>2]|0;break}else{s=(c[za>>2]|0)<(c[Ba>>2]|0)?c[Ba>>2]|0:c[za>>2]|0;break}while(0);c[za>>2]=s;c[wa>>2]=Ph((c[za>>2]|0)-2|0,c[Ba>>2]|0)|0;c[ma>>2]=Qh((c[za>>2]|0)+2|0,c[sa>>2]|0)|0;c[Aa>>2]=c[za>>2];c[Ha>>2]=0;g[ga>>2]=-1.0e3;Rh(ka,c[da>>2]|0,c[wa>>2]|0,c[va>>2]|0,c[Da>>2]|0,c[ea>>2]|0,c[fa>>2]|0);Sh(na,c[da>>2]|0,c[wa>>2]|0,c[va>>2]|0,c[Da>>2]|0,c[ea>>2]|0);c[ra>>2]=0;g[ia>>2]=.05000000074505806/+(c[za>>2]|0);if((c[Da>>2]|0)==4){c[ua>>2]=a[30490+(c[ea>>2]|0)>>0];c[Ja>>2]=34;c[Ia>>2]=30330}else{c[ua>>2]=12;c[Ja>>2]=12;c[Ia>>2]=30258}c[xa>>2]=(c[da>>2]|0)+((c[ya>>2]|0)*20<<2);h[pa>>3]=+Gh(c[xa>>2]|0,_(c[Da>>2]|0,c[va>>2]|0)|0)+1.0;c[la>>2]=c[wa>>2];while(1){if((c[la>>2]|0)>(c[ma>>2]|0))break;c[qa>>2]=0;while(1){if((c[qa>>2]|0)>=(c[ua>>2]|0))break;h[ja>>3]=0.0;h[oa>>3]=+h[pa>>3];c[Ka>>2]=0;while(1){if((c[Ka>>2]|0)>=(c[Da>>2]|0))break;h[ja>>3]=+h[ja>>3]+ +g[ka+((c[Ka>>2]|0)*680|0)+((c[qa>>2]|0)*20|0)+(c[ra>>2]<<2)>>2];h[oa>>3]=+h[oa>>3]+ +g[na+((c[Ka>>2]|0)*680|0)+((c[qa>>2]|0)*20|0)+(c[ra>>2]<<2)>>2];c[Ka>>2]=(c[Ka>>2]|0)+1}if(+h[ja>>3]>0.0){g[ha>>2]=+h[ja>>3]*2.0/+h[oa>>3];g[ha>>2]=+g[ha>>2]*(1.0-+g[ia>>2]*+(c[qa>>2]|0))}else g[ha>>2]=0.0;if(+g[ha>>2]>+g[ga>>2]?((c[la>>2]|0)+(a[30330+(c[qa>>2]|0)>>0]|0)|0)<=(c[sa>>2]|0):0){g[ga>>2]=+g[ha>>2];c[Aa>>2]=c[la>>2];c[Ha>>2]=c[qa>>2]}c[qa>>2]=(c[qa>>2]|0)+1}c[ra>>2]=(c[ra>>2]|0)+1;c[la>>2]=(c[la>>2]|0)+1}c[Ka>>2]=0;while(1){s=c[Aa>>2]|0;if((c[Ka>>2]|0)>=(c[Da>>2]|0))break;za=_(c[Ka>>2]|0,c[Ja>>2]|0)|0;c[(c[Ea>>2]|0)+(c[Ka>>2]<<2)>>2]=s+(a[(c[Ia>>2]|0)+(za+(c[Ha>>2]|0))>>0]|0);s=c[(c[Ea>>2]|0)+(c[Ka>>2]<<2)>>2]|0;do if((c[Ba>>2]|0)>((c[ya>>2]|0)*18|0)){if((s|0)>(c[Ba>>2]|0)){s=c[Ba>>2]|0;break}if((c[(c[Ea>>2]|0)+(c[Ka>>2]<<2)>>2]|0)<((c[ya>>2]|0)*18|0)){s=(c[ya>>2]|0)*18|0;break}else{s=c[(c[Ea>>2]|0)+(c[Ka>>2]<<2)>>2]|0;break}}else{if((s|0)>((c[ya>>2]|0)*18|0)){s=(c[ya>>2]|0)*18|0;break}if((c[(c[Ea>>2]|0)+(c[Ka>>2]<<2)>>2]|0)<(c[Ba>>2]|0)){s=c[Ba>>2]|0;break}else{s=c[(c[Ea>>2]|0)+(c[Ka>>2]<<2)>>2]|0;break}}while(0);c[(c[Ea>>2]|0)+(c[Ka>>2]<<2)>>2]=s;c[Ka>>2]=(c[Ka>>2]|0)+1}b[c[Fa>>2]>>1]=s-(c[Ba>>2]|0);a[c[Ga>>2]>>0]=c[Ha>>2]}else{c[Ka>>2]=0;while(1){s=c[za>>2]|0;if((c[Ka>>2]|0)>=(c[Da>>2]|0))break;Ba=_(c[Ka>>2]|0,c[Ja>>2]|0)|0;c[(c[Ea>>2]|0)+(c[Ka>>2]<<2)>>2]=s+(a[(c[Ia>>2]|0)+(Ba+(c[Ha>>2]|0))>>0]|0);s=c[(c[Ea>>2]|0)+(c[Ka>>2]<<2)>>2]|0;do if((c[ta>>2]|0)>144){if((s|0)>(c[ta>>2]|0)){s=c[ta>>2]|0;break}if((c[(c[Ea>>2]|0)+(c[Ka>>2]<<2)>>2]|0)<144)s=144;else s=c[(c[Ea>>2]|0)+(c[Ka>>2]<<2)>>2]|0}else if((s|0)<=144)if((c[(c[Ea>>2]|0)+(c[Ka>>2]<<2)>>2]|0)<(c[ta>>2]|0)){s=c[ta>>2]|0;break}else{s=c[(c[Ea>>2]|0)+(c[Ka>>2]<<2)>>2]|0;break}else s=144;while(0);c[(c[Ea>>2]|0)+(c[Ka>>2]<<2)>>2]=s;c[Ka>>2]=(c[Ka>>2]|0)+1}b[c[Fa>>2]>>1]=s-(c[ta>>2]|0);a[c[Ga>>2]>>0]=c[Ha>>2]}c[Ca>>2]=0;Ka=c[Ca>>2]|0;i=La;return Ka|0}function Mh(a,d,e){a=a|0;d=d|0;e=e|0;var f=0,h=0,j=0,k=0,l=0;k=i;i=i+16|0;f=k+12|0;h=k+8|0;l=k+4|0;j=k;c[f>>2]=a;c[h>>2]=d;c[l>>2]=e;c[j>>2]=(c[l>>2]|0)-1;while(1){if((c[j>>2]|0)<0)break;if((ij(+g[(c[h>>2]|0)+(c[j>>2]<<2)>>2])|0)<=32767)if((ij(+g[(c[h>>2]|0)+(c[j>>2]<<2)>>2])|0)<-32768)d=-32768;else d=ij(+g[(c[h>>2]|0)+(c[j>>2]<<2)>>2])|0;else d=32767;b[(c[f>>2]|0)+(c[j>>2]<<1)>>1]=d;c[j>>2]=(c[j>>2]|0)+-1}i=k;return}function Nh(a,d,e){a=a|0;d=d|0;e=e|0;var f=0,h=0,j=0,k=0,l=0;k=i;i=i+16|0;f=k+12|0;h=k+8|0;l=k+4|0;j=k;c[f>>2]=a;c[h>>2]=d;c[l>>2]=e;c[j>>2]=(c[l>>2]|0)-1;while(1){if((c[j>>2]|0)<0)break;g[(c[f>>2]|0)+(c[j>>2]<<2)>>2]=+(b[(c[h>>2]|0)+(c[j>>2]<<1)>>1]|0);c[j>>2]=(c[j>>2]|0)+-1}i=k;return}function Oh(a){a=+a;var b=0,c=0;b=i;i=i+16|0;c=b;h[c>>3]=a;a=+hj(+h[c>>3])*3.32192809488736;i=b;return +a}function Ph(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;f=i;i=i+16|0;e=f+4|0;d=f;c[e>>2]=a;c[d>>2]=b;i=f;return ((c[e>>2]|0)>(c[d>>2]|0)?c[e>>2]|0:c[d>>2]|0)|0}function Qh(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;f=i;i=i+16|0;e=f+4|0;d=f;c[e>>2]=a;c[d>>2]=b;i=f;return ((c[e>>2]|0)<(c[d>>2]|0)?c[e>>2]|0:c[d>>2]|0)|0}function Rh(b,d,e,f,h,j,k){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0;H=i;i=i+256|0;l=H+252|0;m=H+248|0;n=H+244|0;o=H+240|0;p=H+236|0;q=H+232|0;r=H+228|0;F=H+224|0;w=H+220|0;y=H+216|0;z=H+212|0;A=H+208|0;C=H+204|0;B=H+200|0;D=H+196|0;v=H+192|0;x=H+188|0;u=H+184|0;E=H+96|0;G=H+8|0;t=H+4|0;s=H;c[l>>2]=b;c[m>>2]=d;c[n>>2]=e;c[o>>2]=f;c[p>>2]=h;c[q>>2]=j;c[r>>2]=k;if((c[p>>2]|0)==4){c[t>>2]=30466+(c[q>>2]<<3);c[s>>2]=30330;c[D>>2]=a[30490+(c[q>>2]|0)>>0];c[u>>2]=34}else{c[t>>2]=30282;c[s>>2]=30258;c[D>>2]=12;c[u>>2]=12}c[F>>2]=(c[m>>2]|0)+(c[o>>2]<<2<<2);c[z>>2]=0;while(1){if((c[z>>2]|0)>=(c[p>>2]|0))break;c[A>>2]=0;c[C>>2]=a[(c[t>>2]|0)+((c[z>>2]<<1)+0)>>0];c[B>>2]=a[(c[t>>2]|0)+((c[z>>2]<<1)+1)>>0];Mc(c[F>>2]|0,(c[F>>2]|0)+(0-(c[n>>2]|0)<<2)+(0-(c[B>>2]|0)<<2)|0,G,c[o>>2]|0,(c[B>>2]|0)-(c[C>>2]|0)+1|0,c[r>>2]|0);c[y>>2]=c[C>>2];while(1){if((c[y>>2]|0)>(c[B>>2]|0))break;g[E+(c[A>>2]<<2)>>2]=+g[G+((c[B>>2]|0)-(c[y>>2]|0)<<2)>>2];c[A>>2]=(c[A>>2]|0)+1;c[y>>2]=(c[y>>2]|0)+1}c[v>>2]=a[(c[t>>2]|0)+((c[z>>2]<<1)+0)>>0];c[w>>2]=0;while(1){if((c[w>>2]|0)>=(c[D>>2]|0))break;e=_(c[z>>2]|0,c[u>>2]|0)|0;c[x>>2]=(a[(c[s>>2]|0)+(e+(c[w>>2]|0))>>0]|0)-(c[v>>2]|0);c[y>>2]=0;while(1){if((c[y>>2]|0)>=5)break;g[(c[l>>2]|0)+((c[z>>2]|0)*680|0)+((c[w>>2]|0)*20|0)+(c[y>>2]<<2)>>2]=+g[E+((c[x>>2]|0)+(c[y>>2]|0)<<2)>>2];c[y>>2]=(c[y>>2]|0)+1}c[w>>2]=(c[w>>2]|0)+1}c[F>>2]=(c[F>>2]|0)+(c[o>>2]<<2);c[z>>2]=(c[z>>2]|0)+1}i=H;return}function Sh(b,d,e,f,j,k){b=b|0;d=d|0;e=e|0;f=f|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0;G=i;i=i+176|0;l=G+168|0;m=G+164|0;n=G+160|0;o=G+156|0;p=G+152|0;q=G+148|0;F=G+144|0;t=G+140|0;w=G;A=G+136|0;x=G+132|0;z=G+128|0;B=G+124|0;D=G+120|0;v=G+116|0;y=G+112|0;u=G+108|0;C=G+104|0;E=G+16|0;s=G+12|0;r=G+8|0;c[l>>2]=b;c[m>>2]=d;c[n>>2]=e;c[o>>2]=f;c[p>>2]=j;c[q>>2]=k;if((c[p>>2]|0)==4){c[s>>2]=30466+(c[q>>2]<<3);c[r>>2]=30330;c[D>>2]=a[30490+(c[q>>2]|0)>>0];c[u>>2]=34}else{c[s>>2]=30282;c[r>>2]=30258;c[D>>2]=12;c[u>>2]=12}c[F>>2]=(c[m>>2]|0)+(c[o>>2]<<2<<2);c[A>>2]=0;while(1){if((c[A>>2]|0)>=(c[p>>2]|0))break;c[B>>2]=0;c[t>>2]=(c[F>>2]|0)+(0-((c[n>>2]|0)+(a[(c[s>>2]|0)+((c[A>>2]<<1)+0)>>0]|0))<<2);h[w>>3]=+Gh(c[t>>2]|0,c[o>>2]|0)+.001;g[E+(c[B>>2]<<2)>>2]=+h[w>>3];c[B>>2]=(c[B>>2]|0)+1;c[C>>2]=(a[(c[s>>2]|0)+((c[A>>2]<<1)+1)>>0]|0)-(a[(c[s>>2]|0)+((c[A>>2]<<1)+0)>>0]|0)+1;c[x>>2]=1;while(1){if((c[x>>2]|0)>=(c[C>>2]|0))break;h[w>>3]=+h[w>>3]-+g[(c[t>>2]|0)+((c[o>>2]|0)-(c[x>>2]|0)<<2)>>2]*+g[(c[t>>2]|0)+((c[o>>2]|0)-(c[x>>2]|0)<<2)>>2];h[w>>3]=+h[w>>3]+ +g[(c[t>>2]|0)+(0-(c[x>>2]|0)<<2)>>2]*+g[(c[t>>2]|0)+(0-(c[x>>2]|0)<<2)>>2];g[E+(c[B>>2]<<2)>>2]=+h[w>>3];c[B>>2]=(c[B>>2]|0)+1;c[x>>2]=(c[x>>2]|0)+1}c[v>>2]=a[(c[s>>2]|0)+((c[A>>2]<<1)+0)>>0];c[x>>2]=0;while(1){if((c[x>>2]|0)>=(c[D>>2]|0))break;e=_(c[A>>2]|0,c[u>>2]|0)|0;c[y>>2]=(a[(c[r>>2]|0)+(e+(c[x>>2]|0))>>0]|0)-(c[v>>2]|0);c[z>>2]=0;while(1){if((c[z>>2]|0)>=5)break;g[(c[l>>2]|0)+((c[A>>2]|0)*680|0)+((c[x>>2]|0)*20|0)+(c[z>>2]<<2)>>2]=+g[E+((c[y>>2]|0)+(c[z>>2]|0)<<2)>>2];c[z>>2]=(c[z>>2]|0)+1}c[x>>2]=(c[x>>2]|0)+1}c[F>>2]=(c[F>>2]|0)+(c[o>>2]<<2);c[A>>2]=(c[A>>2]|0)+1}i=G;return}function Th(a,b,d,e){a=a|0;b=b|0;d=+d;e=e|0;var f=0,h=0,j=0,k=0,l=0,m=0,n=0;n=i;i=i+32|0;f=n+20|0;h=n+16|0;j=n+12|0;k=n+8|0;m=n+4|0;l=n;c[f>>2]=a;c[h>>2]=b;g[j>>2]=d;c[k>>2]=e;c[l>>2]=c[k>>2]&65532;c[m>>2]=0;while(1){if((c[m>>2]|0)>=(c[l>>2]|0))break;g[(c[f>>2]|0)+((c[m>>2]|0)+0<<2)>>2]=+g[j>>2]*+g[(c[h>>2]|0)+((c[m>>2]|0)+0<<2)>>2];g[(c[f>>2]|0)+((c[m>>2]|0)+1<<2)>>2]=+g[j>>2]*+g[(c[h>>2]|0)+((c[m>>2]|0)+1<<2)>>2];g[(c[f>>2]|0)+((c[m>>2]|0)+2<<2)>>2]=+g[j>>2]*+g[(c[h>>2]|0)+((c[m>>2]|0)+2<<2)>>2];g[(c[f>>2]|0)+((c[m>>2]|0)+3<<2)>>2]=+g[j>>2]*+g[(c[h>>2]|0)+((c[m>>2]|0)+3<<2)>>2];c[m>>2]=(c[m>>2]|0)+4}while(1){if((c[m>>2]|0)>=(c[k>>2]|0))break;g[(c[f>>2]|0)+(c[m>>2]<<2)>>2]=+g[j>>2]*+g[(c[h>>2]|0)+(c[m>>2]<<2)>>2];c[m>>2]=(c[m>>2]|0)+1}i=n;return} |
| | | function ra(a){a=a|0;var b=0;b=i;i=i+a|0;i=i+15&-16;return b|0}function sa(){return i|0}function ta(a){a=a|0;i=a}function ua(a,b){a=a|0;b=b|0;i=a;j=b}function va(a,b){a=a|0;b=b|0;if(!n){n=a;o=b}}function wa(b){b=b|0;a[k>>0]=a[b>>0];a[k+1>>0]=a[b+1>>0];a[k+2>>0]=a[b+2>>0];a[k+3>>0]=a[b+3>>0]}function xa(b){b=b|0;a[k>>0]=a[b>>0];a[k+1>>0]=a[b+1>>0];a[k+2>>0]=a[b+2>>0];a[k+3>>0]=a[b+3>>0];a[k+4>>0]=a[b+4>>0];a[k+5>>0]=a[b+5>>0];a[k+6>>0]=a[b+6>>0];a[k+7>>0]=a[b+7>>0]}function ya(a){a=a|0;C=a}function za(){return C|0}function Aa(a,b,d,e,f){a=+a;b=b|0;d=d|0;e=e|0;f=f|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0;o=i;i=i+32|0;h=o+20|0;j=o+16|0;k=o+12|0;l=o+8|0;m=o+4|0;n=o;g[h>>2]=a;c[j>>2]=b;c[k>>2]=d;c[l>>2]=e;c[m>>2]=f;c[n>>2]=0;while(1){if((c[n>>2]|0)>=(c[l>>2]|0))break;if(+g[h>>2]<+g[(c[j>>2]|0)+(c[n>>2]<<2)>>2])break;c[n>>2]=(c[n>>2]|0)+1}if((c[n>>2]|0)>(c[m>>2]|0)?+g[h>>2]<+g[(c[j>>2]|0)+(c[m>>2]<<2)>>2]+ +g[(c[k>>2]|0)+(c[m>>2]<<2)>>2]:0)c[n>>2]=c[m>>2];if((c[n>>2]|0)>=(c[m>>2]|0)){b=c[n>>2]|0;i=o;return b|0}if(!(+g[h>>2]>+g[(c[j>>2]|0)+((c[m>>2]|0)-1<<2)>>2]-+g[(c[k>>2]|0)+((c[m>>2]|0)-1<<2)>>2])){b=c[n>>2]|0;i=o;return b|0}c[n>>2]=c[m>>2];b=c[n>>2]|0;i=o;return b|0}function Ba(a){a=a|0;var b=0,d=0;b=i;i=i+16|0;d=b;c[d>>2]=a;a=(_(1664525,c[d>>2]|0)|0)+1013904223|0;i=b;return a|0}function Ca(a,d,e,f,h,j){a=a|0;d=d|0;e=e|0;f=f|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0.0;v=i;i=i+48|0;k=v+40|0;l=v+36|0;m=v+32|0;n=v+28|0;o=v+24|0;p=v+20|0;t=v+16|0;r=v+12|0;q=v+8|0;s=v+4|0;u=v;c[k>>2]=a;c[l>>2]=d;c[m>>2]=e;c[n>>2]=f;c[o>>2]=h;c[p>>2]=j;c[s>>2]=c[(c[k>>2]|0)+32>>2];c[q>>2]=c[(c[k>>2]|0)+44>>2]<<c[p>>2];c[r>>2]=0;do{c[t>>2]=0;while(1){h=c[r>>2]|0;if((c[t>>2]|0)>=(c[n>>2]|0))break;f=_(h,c[q>>2]|0)|0;a=_(c[r>>2]|0,c[q>>2]|0)|0;g[u>>2]=+Da((c[l>>2]|0)+(f+(b[(c[s>>2]|0)+(c[t>>2]<<1)>>1]<<c[p>>2])<<2)|0,(c[l>>2]|0)+(a+(b[(c[s>>2]|0)+(c[t>>2]<<1)>>1]<<c[p>>2])<<2)|0,(b[(c[s>>2]|0)+((c[t>>2]|0)+1<<1)>>1]|0)-(b[(c[s>>2]|0)+(c[t>>2]<<1)>>1]|0)<<c[p>>2])+1.0000000272452012e-27;w=+O(+(+g[u>>2]));a=(c[t>>2]|0)+(_(c[r>>2]|0,c[(c[k>>2]|0)+8>>2]|0)|0)|0;g[(c[m>>2]|0)+(a<<2)>>2]=w;c[t>>2]=(c[t>>2]|0)+1}a=h+1|0;c[r>>2]=a}while((a|0)<(c[o>>2]|0));i=v;return}function Da(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0,h=0,j=0,k=0,l=0,m=0;m=i;i=i+32|0;f=m+16|0;h=m+12|0;j=m+8|0;k=m+4|0;l=m;c[f>>2]=a;c[h>>2]=b;c[j>>2]=d;g[l>>2]=0.0;c[k>>2]=0;while(1){e=+g[l>>2];if((c[k>>2]|0)>=(c[j>>2]|0))break;g[l>>2]=e+ +g[(c[f>>2]|0)+(c[k>>2]<<2)>>2]*+g[(c[h>>2]|0)+(c[k>>2]<<2)>>2];c[k>>2]=(c[k>>2]|0)+1}i=m;return +e}function Ea(a,d,e,f,h,j,k){a=a|0;d=d|0;e=e|0;f=f|0;h=h|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;y=i;i=i+64|0;l=y+48|0;m=y+44|0;n=y+40|0;o=y+36|0;p=y+32|0;q=y+28|0;r=y+24|0;w=y+20|0;t=y+16|0;s=y+12|0;u=y+8|0;x=y+4|0;v=y;c[l>>2]=a;c[m>>2]=d;c[n>>2]=e;c[o>>2]=f;c[p>>2]=h;c[q>>2]=j;c[r>>2]=k;c[u>>2]=c[(c[l>>2]|0)+32>>2];c[s>>2]=_(c[r>>2]|0,c[(c[l>>2]|0)+44>>2]|0)|0;c[t>>2]=0;do{c[w>>2]=0;while(1){if((c[w>>2]|0)>=(c[p>>2]|0))break;a=(c[w>>2]|0)+(_(c[t>>2]|0,c[(c[l>>2]|0)+8>>2]|0)|0)|0;g[v>>2]=1.0/(+g[(c[o>>2]|0)+(a<<2)>>2]+1.0000000272452012e-27);c[x>>2]=_(c[r>>2]|0,b[(c[u>>2]|0)+(c[w>>2]<<1)>>1]|0)|0;while(1){if((c[x>>2]|0)>=(_(c[r>>2]|0,b[(c[u>>2]|0)+((c[w>>2]|0)+1<<1)>>1]|0)|0))break;d=(c[x>>2]|0)+(_(c[t>>2]|0,c[s>>2]|0)|0)|0;a=(c[x>>2]|0)+(_(c[t>>2]|0,c[s>>2]|0)|0)|0;g[(c[n>>2]|0)+(a<<2)>>2]=+g[(c[m>>2]|0)+(d<<2)>>2]*+g[v>>2];c[x>>2]=(c[x>>2]|0)+1}c[w>>2]=(c[w>>2]|0)+1}a=(c[t>>2]|0)+1|0;c[t>>2]=a}while((a|0)<(c[q>>2]|0));i=y;return}function Fa(a,d,e,f,h,j,k,l,m){a=a|0;d=d|0;e=e|0;f=f|0;h=h|0;j=j|0;k=k|0;l=l|0;m=m|0;var n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0.0;F=i;i=i+80|0;G=F+72|0;o=F+68|0;p=F+64|0;q=F+60|0;r=F+56|0;s=F+52|0;t=F+48|0;n=F+44|0;u=F+40|0;B=F+36|0;v=F+32|0;x=F+28|0;z=F+24|0;E=F+20|0;y=F+16|0;C=F+12|0;w=F+8|0;A=F+4|0;D=F;c[G>>2]=a;c[o>>2]=d;c[p>>2]=e;c[q>>2]=f;c[r>>2]=h;c[s>>2]=j;c[t>>2]=k;c[n>>2]=l;c[u>>2]=m;c[y>>2]=c[(c[G>>2]|0)+32>>2];c[v>>2]=_(c[t>>2]|0,c[(c[G>>2]|0)+44>>2]|0)|0;c[x>>2]=_(c[t>>2]|0,b[(c[y>>2]|0)+(c[s>>2]<<1)>>1]|0)|0;if((c[n>>2]|0)!=1){if((c[x>>2]|0)<((c[v>>2]|0)/(c[n>>2]|0)|0|0))n=c[x>>2]|0;else n=(c[v>>2]|0)/(c[n>>2]|0)|0;c[x>>2]=n}if(c[u>>2]|0){c[x>>2]=0;c[s>>2]=0;c[r>>2]=0}c[z>>2]=c[p>>2];c[E>>2]=(c[o>>2]|0)+((_(c[t>>2]|0,b[(c[y>>2]|0)+(c[r>>2]<<1)>>1]|0)|0)<<2);c[B>>2]=0;while(1){if((c[B>>2]|0)>=(_(c[t>>2]|0,b[(c[y>>2]|0)+(c[r>>2]<<1)>>1]|0)|0))break;G=c[z>>2]|0;c[z>>2]=G+4;g[G>>2]=0.0;c[B>>2]=(c[B>>2]|0)+1}c[B>>2]=c[r>>2];while(1){if((c[B>>2]|0)>=(c[s>>2]|0))break;c[C>>2]=_(c[t>>2]|0,b[(c[y>>2]|0)+(c[B>>2]<<1)>>1]|0)|0;c[w>>2]=_(c[t>>2]|0,b[(c[y>>2]|0)+((c[B>>2]|0)+1<<1)>>1]|0)|0;g[D>>2]=+g[(c[q>>2]|0)+(c[B>>2]<<2)>>2]+ +g[17464+(c[B>>2]<<2)>>2];g[A>>2]=+X(+(+g[D>>2]*.6931471805599453));do{G=c[E>>2]|0;c[E>>2]=G+4;H=+g[G>>2]*+g[A>>2];G=c[z>>2]|0;c[z>>2]=G+4;g[G>>2]=H;G=(c[C>>2]|0)+1|0;c[C>>2]=G}while((G|0)<(c[w>>2]|0));c[B>>2]=(c[B>>2]|0)+1}oj((c[p>>2]|0)+(c[x>>2]<<2)|0,0,(c[v>>2]|0)-(c[x>>2]|0)<<2|0)|0;i=F;return}function Ga(a,e,f,h,j,k,l,m,n,o,p,q,r,s){a=a|0;e=e|0;f=f|0;h=h|0;j=j|0;k=k|0;l=l|0;m=m|0;n=n|0;o=o|0;p=p|0;q=q|0;r=r|0;s=s|0;var t=0.0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,Y=0;W=i;i=i+112|0;u=W+108|0;v=W+104|0;A=W+100|0;B=W+96|0;C=W+92|0;D=W+88|0;Y=W+84|0;E=W+80|0;F=W+76|0;G=W+72|0;w=W+68|0;x=W+64|0;y=W+60|0;z=W+56|0;K=W+52|0;M=W+48|0;N=W+44|0;P=W+40|0;I=W+36|0;V=W+32|0;U=W+28|0;L=W+24|0;J=W+20|0;Q=W+16|0;R=W+12|0;H=W+8|0;S=W+4|0;T=W;c[u>>2]=a;c[v>>2]=e;c[A>>2]=f;c[B>>2]=h;c[C>>2]=j;c[D>>2]=k;c[Y>>2]=l;c[E>>2]=m;c[F>>2]=n;c[G>>2]=o;c[w>>2]=p;c[x>>2]=q;c[y>>2]=r;c[z>>2]=s;c[M>>2]=c[Y>>2];while(1){if((c[M>>2]|0)>=(c[E>>2]|0))break;c[I>>2]=(b[(c[(c[u>>2]|0)+32>>2]|0)+((c[M>>2]|0)+1<<1)>>1]|0)-(b[(c[(c[u>>2]|0)+32>>2]|0)+(c[M>>2]<<1)>>1]|0);Y=Ha(1+(c[(c[x>>2]|0)+(c[M>>2]<<2)>>2]|0)|0,(b[(c[(c[u>>2]|0)+32>>2]|0)+((c[M>>2]|0)+1<<1)>>1]|0)-(b[(c[(c[u>>2]|0)+32>>2]|0)+(c[M>>2]<<1)>>1]|0)|0)|0;c[L>>2]=Y>>>(c[B>>2]|0);g[V>>2]=+X(+(+(c[L>>2]|0)*-.125*.6931471805599453))*.5;g[U>>2]=1.0/+O(+(+(c[I>>2]<<c[B>>2]|0)));c[K>>2]=0;do{c[T>>2]=0;Y=_(c[K>>2]|0,c[(c[u>>2]|0)+8>>2]|0)|0;g[Q>>2]=+g[(c[G>>2]|0)+(Y+(c[M>>2]|0)<<2)>>2];Y=_(c[K>>2]|0,c[(c[u>>2]|0)+8>>2]|0)|0;g[R>>2]=+g[(c[w>>2]|0)+(Y+(c[M>>2]|0)<<2)>>2];if((c[C>>2]|0)==1){if(+g[Q>>2]>+g[(c[G>>2]|0)+((c[(c[u>>2]|0)+8>>2]|0)+(c[M>>2]|0)<<2)>>2])t=+g[Q>>2];else t=+g[(c[G>>2]|0)+((c[(c[u>>2]|0)+8>>2]|0)+(c[M>>2]|0)<<2)>>2];g[Q>>2]=t;if(+g[R>>2]>+g[(c[w>>2]|0)+((c[(c[u>>2]|0)+8>>2]|0)+(c[M>>2]|0)<<2)>>2])t=+g[R>>2];else t=+g[(c[w>>2]|0)+((c[(c[u>>2]|0)+8>>2]|0)+(c[M>>2]|0)<<2)>>2];g[R>>2]=t}Y=_(c[K>>2]|0,c[(c[u>>2]|0)+8>>2]|0)|0;g[H>>2]=+g[(c[F>>2]|0)+(Y+(c[M>>2]|0)<<2)>>2]-(+g[Q>>2]<+g[R>>2]?+g[Q>>2]:+g[R>>2]);g[H>>2]=0.0>+g[H>>2]?0.0:+g[H>>2];g[S>>2]=+X(+(-+g[H>>2]*.6931471805599453))*2.0;if((c[B>>2]|0)==3)g[S>>2]=+g[S>>2]*1.4142135381698608;g[S>>2]=+g[V>>2]<+g[S>>2]?+g[V>>2]:+g[S>>2];g[S>>2]=+g[S>>2]*+g[U>>2];Y=(c[v>>2]|0)+((_(c[K>>2]|0,c[D>>2]|0)|0)<<2)|0;c[J>>2]=Y+(b[(c[(c[u>>2]|0)+32>>2]|0)+(c[M>>2]<<1)>>1]<<c[B>>2]<<2);c[P>>2]=0;while(1){if((c[P>>2]|0)>=(1<<c[B>>2]|0))break;Y=_(c[M>>2]|0,c[C>>2]|0)|0;if(!(d[(c[A>>2]|0)+(Y+(c[K>>2]|0))>>0]&1<<c[P>>2])){c[N>>2]=0;while(1){if((c[N>>2]|0)>=(c[I>>2]|0))break;c[y>>2]=Ba(c[y>>2]|0)|0;t=+g[S>>2];g[(c[J>>2]|0)+((c[N>>2]<<c[B>>2])+(c[P>>2]|0)<<2)>>2]=c[y>>2]&32768|0?t:-t;c[N>>2]=(c[N>>2]|0)+1}c[T>>2]=1}c[P>>2]=(c[P>>2]|0)+1}if(c[T>>2]|0)td(c[J>>2]|0,c[I>>2]<<c[B>>2],1.0,c[z>>2]|0);Y=(c[K>>2]|0)+1|0;c[K>>2]=Y}while((Y|0)<(c[C>>2]|0));c[M>>2]=(c[M>>2]|0)+1}i=W;return}function Ha(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;f=i;i=i+16|0;e=f+4|0;d=f;c[e>>2]=a;c[d>>2]=b;i=f;return ((c[e>>2]|0)>>>0)/((c[d>>2]|0)>>>0)|0|0}function Ia(a,d,e,f,h,j,k,l,m,n){a=a|0;d=d|0;e=e|0;f=f|0;h=h|0;j=j|0;k=k|0;l=l|0;m=m|0;n=n|0;var o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0;N=i;i=i+112|0;G=N+104|0;o=N+100|0;q=N+96|0;H=N+92|0;I=N+88|0;r=N+84|0;s=N+80|0;t=N+76|0;u=N+72|0;v=N+68|0;p=N+64|0;A=N+60|0;y=N+56|0;x=N+52|0;M=N+48|0;L=N+44|0;z=N+40|0;J=N+36|0;K=N+32|0;B=N+28|0;w=N+24|0;D=N+20|0;C=N+8|0;E=N+4|0;F=N;c[o>>2]=a;c[q>>2]=d;c[H>>2]=e;c[I>>2]=f;c[r>>2]=h;c[s>>2]=j;c[t>>2]=k;c[u>>2]=l;c[v>>2]=m;c[p>>2]=n;c[M>>2]=0;c[L>>2]=0;c[z>>2]=c[(c[o>>2]|0)+32>>2];c[K>>2]=0;c[x>>2]=_(c[p>>2]|0,c[(c[o>>2]|0)+44>>2]|0)|0;if((_(c[p>>2]|0,(b[(c[z>>2]|0)+(c[u>>2]<<1)>>1]|0)-(b[(c[z>>2]|0)+((c[u>>2]|0)-1<<1)>>1]|0)|0)|0)<=8){c[G>>2]=0;M=c[G>>2]|0;i=N;return M|0}c[y>>2]=0;do{c[A>>2]=0;while(1){if((c[A>>2]|0)>=(c[u>>2]|0))break;c[D>>2]=0;c[C>>2]=0;c[C+4>>2]=0;c[C+8>>2]=0;k=(c[q>>2]|0)+((_(c[p>>2]|0,b[(c[z>>2]|0)+(c[A>>2]<<1)>>1]|0)|0)<<2)|0;c[E>>2]=k+((_(c[y>>2]|0,c[x>>2]|0)|0)<<2);c[w>>2]=_(c[p>>2]|0,(b[(c[z>>2]|0)+((c[A>>2]|0)+1<<1)>>1]|0)-(b[(c[z>>2]|0)+(c[A>>2]<<1)>>1]|0)|0)|0;if((c[w>>2]|0)>8){c[B>>2]=0;while(1){if((c[B>>2]|0)>=(c[w>>2]|0))break;g[F>>2]=+g[(c[E>>2]|0)+(c[B>>2]<<2)>>2]*+g[(c[E>>2]|0)+(c[B>>2]<<2)>>2]*+(c[w>>2]|0);if(+g[F>>2]<.25)c[C>>2]=(c[C>>2]|0)+1;if(+g[F>>2]<.0625){k=C+4|0;c[k>>2]=(c[k>>2]|0)+1}if(+g[F>>2]<.015625){k=C+8|0;c[k>>2]=(c[k>>2]|0)+1}c[B>>2]=(c[B>>2]|0)+1}if((c[A>>2]|0)>((c[(c[o>>2]|0)+8>>2]|0)-4|0)){k=Ha((c[C+4>>2]|0)+(c[C>>2]|0)<<5,c[w>>2]|0)|0;c[K>>2]=(c[K>>2]|0)+k}c[D>>2]=((c[C+8>>2]<<1|0)>=(c[w>>2]|0)&1)+((c[C+4>>2]<<1|0)>=(c[w>>2]|0)&1)+((c[C>>2]<<1|0)>=(c[w>>2]|0)&1);c[M>>2]=(c[M>>2]|0)+(c[D>>2]<<8);c[L>>2]=(c[L>>2]|0)+1}c[A>>2]=(c[A>>2]|0)+1}k=(c[y>>2]|0)+1|0;c[y>>2]=k}while((k|0)<(c[v>>2]|0));do if(c[t>>2]|0){if(c[K>>2]|0)c[K>>2]=Ha(c[K>>2]|0,_(c[v>>2]|0,4-(c[(c[o>>2]|0)+8>>2]|0)+(c[u>>2]|0)|0)|0)|0;c[c[r>>2]>>2]=(c[c[r>>2]>>2]|0)+(c[K>>2]|0)>>1;c[K>>2]=c[c[r>>2]>>2];if((c[c[s>>2]>>2]|0)!=2){if(!(c[c[s>>2]>>2]|0))c[K>>2]=(c[K>>2]|0)-4}else c[K>>2]=(c[K>>2]|0)+4;if((c[K>>2]|0)>22){c[c[s>>2]>>2]=2;break}o=c[s>>2]|0;if((c[K>>2]|0)>18){c[o>>2]=1;break}else{c[o>>2]=0;break}}while(0);c[M>>2]=Ha(c[M>>2]|0,c[L>>2]|0)|0;c[M>>2]=(c[M>>2]|0)+(c[c[H>>2]>>2]|0)>>1;c[c[H>>2]>>2]=c[M>>2];c[M>>2]=((c[M>>2]|0)*3|0)+((3-(c[I>>2]|0)<<7)+64)+2>>2;do if((c[M>>2]|0)>=80){if((c[M>>2]|0)<256){c[J>>2]=2;break}if((c[M>>2]|0)<384){c[J>>2]=1;break}else{c[J>>2]=0;break}}else c[J>>2]=3;while(0);c[G>>2]=c[J>>2];M=c[G>>2]|0;i=N;return M|0}function Ja(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0;n=i;i=i+32|0;e=n+24|0;f=n+20|0;h=n+16|0;j=n+12|0;k=n+8|0;l=n+4|0;m=n;c[e>>2]=a;c[f>>2]=b;c[h>>2]=d;c[f>>2]=c[f>>2]>>1;c[j>>2]=0;while(1){if((c[j>>2]|0)>=(c[h>>2]|0))break;c[k>>2]=0;while(1){if((c[k>>2]|0)>=(c[f>>2]|0))break;d=_(c[h>>2]<<1,c[k>>2]|0)|0;g[l>>2]=+g[(c[e>>2]|0)+(d+(c[j>>2]|0)<<2)>>2]*.7071067690849304;d=_(c[h>>2]|0,(c[k>>2]<<1)+1|0)|0;g[m>>2]=+g[(c[e>>2]|0)+(d+(c[j>>2]|0)<<2)>>2]*.7071067690849304;d=_(c[h>>2]<<1,c[k>>2]|0)|0;g[(c[e>>2]|0)+(d+(c[j>>2]|0)<<2)>>2]=+g[l>>2]+ +g[m>>2];d=_(c[h>>2]|0,(c[k>>2]<<1)+1|0)|0;g[(c[e>>2]|0)+(d+(c[j>>2]|0)<<2)>>2]=+g[l>>2]-+g[m>>2];c[k>>2]=(c[k>>2]|0)+1}c[j>>2]=(c[j>>2]|0)+1}i=n;return}function Ka(e,f,h,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A){e=e|0;f=f|0;h=h|0;j=j|0;k=k|0;l=l|0;m=m|0;n=n|0;o=o|0;p=p|0;q=q|0;r=r|0;s=s|0;t=t|0;u=u|0;v=v|0;w=w|0;x=x|0;y=y|0;z=z|0;A=A|0;var B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ja=0,ka=0,la=0,ma=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0;xa=i;i=i+256|0;za=xa+240|0;B=xa+236|0;M=xa+232|0;O=xa+228|0;P=xa+224|0;Q=xa+220|0;R=xa+216|0;Aa=xa+212|0;S=xa+208|0;Ba=xa+204|0;C=xa+200|0;D=xa+196|0;E=xa+192|0;F=xa+188|0;G=xa+184|0;H=xa+180|0;I=xa+176|0;J=xa+172|0;K=xa+168|0;L=xa+164|0;ya=xa+160|0;ga=xa+156|0;qa=xa+152|0;ba=xa+148|0;ma=xa+144|0;oa=xa+140|0;la=xa+136|0;T=xa+132|0;V=xa+128|0;ka=xa+124|0;ua=xa+120|0;U=xa+116|0;pa=xa+112|0;ra=xa+108|0;$=xa+64|0;N=xa+60|0;sa=xa+56|0;Z=xa+52|0;W=xa+48|0;aa=xa+44|0;ca=xa+40|0;X=xa+36|0;Y=xa+32|0;ta=xa+28|0;va=xa+24|0;wa=xa+20|0;ja=xa+16|0;fa=xa+12|0;da=xa+8|0;ea=xa+4|0;ha=xa;c[za>>2]=e;c[B>>2]=f;c[M>>2]=h;c[O>>2]=j;c[P>>2]=k;c[Q>>2]=l;c[R>>2]=m;c[Aa>>2]=n;c[S>>2]=o;c[Ba>>2]=p;c[C>>2]=q;c[D>>2]=r;c[E>>2]=s;c[F>>2]=t;c[G>>2]=u;c[H>>2]=v;c[I>>2]=w;c[J>>2]=x;c[K>>2]=y;c[L>>2]=z;c[ya>>2]=A;c[ba>>2]=c[(c[B>>2]|0)+32>>2];c[ua>>2]=1;c[U>>2]=c[Q>>2]|0?2:1;c[ra>>2]=((c[za>>2]|0)!=0^1)&1;c[V>>2]=1<<c[J>>2];c[T>>2]=c[Ba>>2]|0?c[V>>2]|0:1;c[pa>>2]=_(c[V>>2]|0,b[(c[ba>>2]|0)+(c[M>>2]<<1)>>1]|0)|0;t=_(c[V>>2]|0,b[(c[ba>>2]|0)+((c[(c[B>>2]|0)+8>>2]|0)-1<<1)>>1]|0)|0;t=_(c[U>>2]|0,t-(c[pa>>2]|0)|0)|0;c[N>>2]=ia()|0;u=i;i=i+((1*(t<<2)|0)+15&-16)|0;c[ma>>2]=u;u=(c[ma>>2]|0)+((_(c[V>>2]|0,b[(c[ba>>2]|0)+((c[(c[B>>2]|0)+8>>2]|0)-1<<1)>>1]|0)|0)<<2)|0;c[oa>>2]=u+(0-(c[pa>>2]|0)<<2);c[la>>2]=(c[P>>2]|0)+((_(c[V>>2]|0,b[(c[ba>>2]|0)+((c[(c[B>>2]|0)+8>>2]|0)-1<<1)>>1]|0)|0)<<2);c[ka>>2]=0;c[$+32>>2]=c[Aa>>2];c[$+24>>2]=c[I>>2];c[$>>2]=c[za>>2];c[$+12>>2]=c[E>>2];c[$+4>>2]=c[B>>2];c[$+36>>2]=c[c[L>>2]>>2];c[$+16>>2]=c[C>>2];c[$+40>>2]=c[ya>>2];c[ga>>2]=c[M>>2];while(1){if((c[ga>>2]|0)>=(c[O>>2]|0))break;c[ca>>2]=-1;c[ta>>2]=0;c[$+8>>2]=c[ga>>2];c[ja>>2]=(c[ga>>2]|0)==((c[O>>2]|0)-1|0)&1;c[X>>2]=(c[P>>2]|0)+((_(c[V>>2]|0,b[(c[ba>>2]|0)+(c[ga>>2]<<1)>>1]|0)|0)<<2);if(c[Q>>2]|0)c[Y>>2]=(c[Q>>2]|0)+((_(c[V>>2]|0,b[(c[ba>>2]|0)+(c[ga>>2]<<1)>>1]|0)|0)<<2);else c[Y>>2]=0;Ba=_(c[V>>2]|0,b[(c[ba>>2]|0)+((c[ga>>2]|0)+1<<1)>>1]|0)|0;c[W>>2]=Ba-(_(c[V>>2]|0,b[(c[ba>>2]|0)+(c[ga>>2]<<1)>>1]|0)|0);c[sa>>2]=Xb(c[I>>2]|0)|0;if((c[ga>>2]|0)!=(c[M>>2]|0))c[H>>2]=(c[H>>2]|0)-(c[sa>>2]|0);c[qa>>2]=(c[G>>2]|0)-(c[sa>>2]|0)-1;c[$+28>>2]=c[qa>>2];if((c[ga>>2]|0)<=((c[K>>2]|0)-1|0)){if(3<((c[K>>2]|0)-(c[ga>>2]|0)|0))x=3;else x=(c[K>>2]|0)-(c[ga>>2]|0)|0;c[aa>>2]=La(c[H>>2]|0,x)|0;if(((c[qa>>2]|0)+1|0)<((c[(c[S>>2]|0)+(c[ga>>2]<<2)>>2]|0)+(c[aa>>2]|0)|0))x=(c[qa>>2]|0)+1|0;else x=(c[(c[S>>2]|0)+(c[ga>>2]<<2)>>2]|0)+(c[aa>>2]|0)|0;do if(16383>=(x|0))if(((c[qa>>2]|0)+1|0)<((c[(c[S>>2]|0)+(c[ga>>2]<<2)>>2]|0)+(c[aa>>2]|0)|0)){x=(c[qa>>2]|0)+1|0;break}else{x=(c[(c[S>>2]|0)+(c[ga>>2]<<2)>>2]|0)+(c[aa>>2]|0)|0;break}else x=16383;while(0);do if(0<=(x|0)){if(((c[qa>>2]|0)+1|0)<((c[(c[S>>2]|0)+(c[ga>>2]<<2)>>2]|0)+(c[aa>>2]|0)|0))x=(c[qa>>2]|0)+1|0;else x=(c[(c[S>>2]|0)+(c[ga>>2]<<2)>>2]|0)+(c[aa>>2]|0)|0;if(16383>=(x|0))if(((c[qa>>2]|0)+1|0)<((c[(c[S>>2]|0)+(c[ga>>2]<<2)>>2]|0)+(c[aa>>2]|0)|0)){x=(c[qa>>2]|0)+1|0;break}else{x=(c[(c[S>>2]|0)+(c[ga>>2]<<2)>>2]|0)+(c[aa>>2]|0)|0;break}else x=16383}else x=0;while(0);c[Z>>2]=x}else c[Z>>2]=0;if((c[ra>>2]|0?(Ba=_(c[V>>2]|0,b[(c[ba>>2]|0)+(c[ga>>2]<<1)>>1]|0)|0,(Ba-(c[W>>2]|0)|0)>=(_(c[V>>2]|0,b[(c[ba>>2]|0)+(c[M>>2]<<1)>>1]|0)|0)):0)?(c[ua>>2]|0)!=0|(c[ka>>2]|0)==0:0)c[ka>>2]=c[ga>>2];c[ta>>2]=c[(c[F>>2]|0)+(c[ga>>2]<<2)>>2];c[$+20>>2]=c[ta>>2];if((c[ga>>2]|0)>=(c[(c[B>>2]|0)+12>>2]|0)){c[X>>2]=c[ma>>2];if(c[Q>>2]|0)c[Y>>2]=c[ma>>2];c[la>>2]=0}if((c[ga>>2]|0)==((c[O>>2]|0)-1|0))c[la>>2]=0;if(c[ka>>2]|0?(c[C>>2]|0)!=3|(c[T>>2]|0)>1|(c[ta>>2]|0)<0:0){Ba=_(c[V>>2]|0,b[(c[ba>>2]|0)+(c[ka>>2]<<1)>>1]|0)|0;if(0>(Ba-(c[pa>>2]|0)-(c[W>>2]|0)|0))x=0;else{x=_(c[V>>2]|0,b[(c[ba>>2]|0)+(c[ka>>2]<<1)>>1]|0)|0;x=x-(c[pa>>2]|0)-(c[W>>2]|0)|0}c[ca>>2]=x;c[fa>>2]=c[ka>>2];do{Aa=c[V>>2]|0;Ba=(c[fa>>2]|0)+-1|0;c[fa>>2]=Ba;Ba=_(Aa,b[(c[ba>>2]|0)+(Ba<<1)>>1]|0)|0}while((Ba|0)>((c[ca>>2]|0)+(c[pa>>2]|0)|0));c[da>>2]=(c[ka>>2]|0)-1;do{Aa=c[V>>2]|0;Ba=(c[da>>2]|0)+1|0;c[da>>2]=Ba;Ba=_(Aa,b[(c[ba>>2]|0)+(Ba<<1)>>1]|0)|0}while((Ba|0)<((c[ca>>2]|0)+(c[pa>>2]|0)+(c[W>>2]|0)|0));c[wa>>2]=0;c[va>>2]=0;c[ea>>2]=c[fa>>2];do{Ba=(_(c[ea>>2]|0,c[U>>2]|0)|0)+0|0;c[va>>2]=c[va>>2]|d[(c[R>>2]|0)+Ba>>0];Ba=_(c[ea>>2]|0,c[U>>2]|0)|0;c[wa>>2]=c[wa>>2]|d[(c[R>>2]|0)+(Ba+(c[U>>2]|0)-1)>>0];Ba=(c[ea>>2]|0)+1|0;c[ea>>2]=Ba}while((Ba|0)<(c[da>>2]|0))}else{Ba=(1<<c[T>>2])-1|0;c[wa>>2]=Ba;c[va>>2]=Ba}a:do if((c[D>>2]|0?(c[ga>>2]|0)==(c[E>>2]|0):0)?(c[D>>2]=0,c[ra>>2]|0):0){c[ha>>2]=0;while(1){Ba=_(c[V>>2]|0,b[(c[ba>>2]|0)+(c[ga>>2]<<1)>>1]|0)|0;if((c[ha>>2]|0)>=(Ba-(c[pa>>2]|0)|0))break a;g[(c[ma>>2]|0)+(c[ha>>2]<<2)>>2]=(+g[(c[ma>>2]|0)+(c[ha>>2]<<2)>>2]+ +g[(c[oa>>2]|0)+(c[ha>>2]<<2)>>2])*.5;c[ha>>2]=(c[ha>>2]|0)+1}}while(0);if(c[D>>2]|0){if((c[ca>>2]|0)!=-1)x=(c[ma>>2]|0)+(c[ca>>2]<<2)|0;else x=0;if(c[ja>>2]|0)k=0;else{k=(c[ma>>2]|0)+((_(c[V>>2]|0,b[(c[ba>>2]|0)+(c[ga>>2]<<1)>>1]|0)|0)<<2)|0;k=k+(0-(c[pa>>2]|0)<<2)|0}c[va>>2]=Ma($,c[X>>2]|0,c[W>>2]|0,(c[Z>>2]|0)/2|0,c[T>>2]|0,x,c[J>>2]|0,k,1.0,c[la>>2]|0,c[va>>2]|0)|0;if((c[ca>>2]|0)!=-1)x=(c[oa>>2]|0)+(c[ca>>2]<<2)|0;else x=0;if(c[ja>>2]|0)k=0;else{k=(c[oa>>2]|0)+((_(c[V>>2]|0,b[(c[ba>>2]|0)+(c[ga>>2]<<1)>>1]|0)|0)<<2)|0;k=k+(0-(c[pa>>2]|0)<<2)|0}c[wa>>2]=Ma($,c[Y>>2]|0,c[W>>2]|0,(c[Z>>2]|0)/2|0,c[T>>2]|0,x,c[J>>2]|0,k,1.0,c[la>>2]|0,c[wa>>2]|0)|0}else{l=c[X>>2]|0;if(c[Y>>2]|0){if((c[ca>>2]|0)!=-1)x=(c[ma>>2]|0)+(c[ca>>2]<<2)|0;else x=0;if(c[ja>>2]|0)k=0;else{k=(c[ma>>2]|0)+((_(c[V>>2]|0,b[(c[ba>>2]|0)+(c[ga>>2]<<1)>>1]|0)|0)<<2)|0;k=k+(0-(c[pa>>2]|0)<<2)|0}c[va>>2]=Na($,l,c[Y>>2]|0,c[W>>2]|0,c[Z>>2]|0,c[T>>2]|0,x,c[J>>2]|0,k,c[la>>2]|0,c[va>>2]|c[wa>>2])|0}else{if((c[ca>>2]|0)!=-1)x=(c[ma>>2]|0)+(c[ca>>2]<<2)|0;else x=0;if(c[ja>>2]|0)k=0;else{k=(c[ma>>2]|0)+((_(c[V>>2]|0,b[(c[ba>>2]|0)+(c[ga>>2]<<1)>>1]|0)|0)<<2)|0;k=k+(0-(c[pa>>2]|0)<<2)|0}c[va>>2]=Ma($,l,c[W>>2]|0,c[Z>>2]|0,c[T>>2]|0,x,c[J>>2]|0,k,1.0,c[la>>2]|0,c[va>>2]|c[wa>>2])|0}c[wa>>2]=c[va>>2]}Ba=(_(c[ga>>2]|0,c[U>>2]|0)|0)+0|0;a[(c[R>>2]|0)+Ba>>0]=c[va>>2];Ba=_(c[ga>>2]|0,c[U>>2]|0)|0;a[(c[R>>2]|0)+(Ba+(c[U>>2]|0)-1)>>0]=c[wa>>2];c[H>>2]=(c[H>>2]|0)+((c[(c[S>>2]|0)+(c[ga>>2]<<2)>>2]|0)+(c[sa>>2]|0));c[ua>>2]=(c[Z>>2]|0)>(c[W>>2]<<3|0)&1;c[ga>>2]=(c[ga>>2]|0)+1}c[c[L>>2]>>2]=c[$+36>>2];na(c[N>>2]|0);i=xa;return}function La(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;f=i;i=i+16|0;e=f+4|0;d=f;c[e>>2]=a;c[d>>2]=b;i=f;return (c[e>>2]|0)/(c[d>>2]|0)|0|0}function Ma(a,b,e,f,h,j,k,l,m,n,o){a=a|0;b=b|0;e=e|0;f=f|0;h=h|0;j=j|0;k=k|0;l=l|0;m=+m;n=n|0;o=o|0;var p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,P=0,Q=0;Q=i;i=i+112|0;p=Q+100|0;q=Q+96|0;t=Q+92|0;u=Q+88|0;v=Q+84|0;w=Q+80|0;x=Q+76|0;y=Q+72|0;z=Q+68|0;A=Q+64|0;r=Q+60|0;s=Q+56|0;C=Q+52|0;D=Q+48|0;E=Q+44|0;B=Q+40|0;P=Q+36|0;L=Q+32|0;J=Q+28|0;F=Q+24|0;M=Q+20|0;I=Q+16|0;G=Q+12|0;N=Q+8|0;H=Q+4|0;K=Q;c[q>>2]=a;c[t>>2]=b;c[u>>2]=e;c[v>>2]=f;c[w>>2]=h;c[x>>2]=j;c[y>>2]=k;c[z>>2]=l;g[A>>2]=m;c[r>>2]=n;c[s>>2]=o;c[C>>2]=c[u>>2];c[D>>2]=c[u>>2];c[B>>2]=c[w>>2];c[P>>2]=0;c[L>>2]=0;c[F>>2]=0;c[M>>2]=((c[c[q>>2]>>2]|0)!=0^1)&1;c[G>>2]=c[c[q>>2]>>2];c[N>>2]=c[(c[q>>2]|0)+20>>2];c[J>>2]=(c[B>>2]|0)==1&1;c[D>>2]=Ha(c[D>>2]|0,c[w>>2]|0)|0;if((c[u>>2]|0)==1){c[p>>2]=Oa(c[q>>2]|0,c[t>>2]|0,0,c[v>>2]|0,c[z>>2]|0)|0;P=c[p>>2]|0;i=Q;return P|0}if((c[N>>2]|0)>0)c[L>>2]=c[N>>2];do if((c[r>>2]|0)!=0&(c[x>>2]|0)!=0){if((c[L>>2]|0)==0?!((c[D>>2]&1|0)==0&(c[N>>2]|0)<0|(c[B>>2]|0)>1):0)break;pj(c[r>>2]|0,c[x>>2]|0,(c[u>>2]<<2)+0|0)|0;c[x>>2]=c[r>>2]}while(0);c[I>>2]=0;while(1){if((c[I>>2]|0)>=(c[L>>2]|0))break;if(c[G>>2]|0)Ja(c[t>>2]|0,c[u>>2]>>c[I>>2],1<<c[I>>2]);if(c[x>>2]|0)Ja(c[x>>2]|0,c[u>>2]>>c[I>>2],1<<c[I>>2]);c[s>>2]=d[25200+(c[s>>2]&15)>>0]|0|(d[25200+(c[s>>2]>>4)>>0]|0)<<2;c[I>>2]=(c[I>>2]|0)+1}c[w>>2]=c[w>>2]>>c[L>>2];c[D>>2]=c[D>>2]<<c[L>>2];while(1){if(!((c[D>>2]&1|0)==0?(c[N>>2]|0)<0:0))break;if(c[G>>2]|0)Ja(c[t>>2]|0,c[D>>2]|0,c[w>>2]|0);if(c[x>>2]|0)Ja(c[x>>2]|0,c[D>>2]|0,c[w>>2]|0);c[s>>2]=c[s>>2]|c[s>>2]<<c[w>>2];c[w>>2]=c[w>>2]<<1;c[D>>2]=c[D>>2]>>1;c[P>>2]=(c[P>>2]|0)+1;c[N>>2]=(c[N>>2]|0)+1}c[B>>2]=c[w>>2];c[E>>2]=c[D>>2];if((c[B>>2]|0)>1){if(c[G>>2]|0)Pa(c[t>>2]|0,c[D>>2]>>c[L>>2],c[B>>2]<<c[L>>2],c[J>>2]|0);if(c[x>>2]|0)Pa(c[x>>2]|0,c[D>>2]>>c[L>>2],c[B>>2]<<c[L>>2],c[J>>2]|0)}c[F>>2]=Qa(c[q>>2]|0,c[t>>2]|0,c[u>>2]|0,c[v>>2]|0,c[w>>2]|0,c[x>>2]|0,c[y>>2]|0,+g[A>>2],c[s>>2]|0)|0;if(c[M>>2]|0){if((c[B>>2]|0)>1)Ra(c[t>>2]|0,c[D>>2]>>c[L>>2],c[B>>2]<<c[L>>2],c[J>>2]|0);c[D>>2]=c[E>>2];c[w>>2]=c[B>>2];c[I>>2]=0;while(1){if((c[I>>2]|0)>=(c[P>>2]|0))break;c[w>>2]=c[w>>2]>>1;c[D>>2]=c[D>>2]<<1;c[F>>2]=c[F>>2]|(c[F>>2]|0)>>>(c[w>>2]|0);Ja(c[t>>2]|0,c[D>>2]|0,c[w>>2]|0);c[I>>2]=(c[I>>2]|0)+1}c[I>>2]=0;while(1){if((c[I>>2]|0)>=(c[L>>2]|0))break;c[F>>2]=d[25216+(c[F>>2]|0)>>0];Ja(c[t>>2]|0,c[C>>2]>>c[I>>2],1<<c[I>>2]);c[I>>2]=(c[I>>2]|0)+1}c[w>>2]=c[w>>2]<<c[L>>2];a:do if(c[z>>2]|0){g[K>>2]=+O(+(+(c[C>>2]|0)));c[H>>2]=0;while(1){if((c[H>>2]|0)>=(c[C>>2]|0))break a;g[(c[z>>2]|0)+(c[H>>2]<<2)>>2]=+g[K>>2]*+g[(c[t>>2]|0)+(c[H>>2]<<2)>>2];c[H>>2]=(c[H>>2]|0)+1}}while(0);c[F>>2]=c[F>>2]&(1<<c[w>>2])-1}c[p>>2]=c[F>>2];P=c[p>>2]|0;i=Q;return P|0}function Na(a,b,d,e,f,h,j,k,l,m,n){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;j=j|0;k=k|0;l=l|0;m=m|0;n=n|0;var o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0;X=i;i=i+160|0;C=X+156|0;D=X+152|0;G=X+148|0;H=X+144|0;I=X+140|0;A=X+136|0;J=X+132|0;K=X+128|0;L=X+124|0;M=X+120|0;E=X+116|0;F=X+112|0;r=X+108|0;s=X+104|0;O=X+100|0;S=X+96|0;W=X+92|0;N=X+88|0;U=X+84|0;R=X+80|0;V=X+76|0;z=X+72|0;P=X+68|0;B=X+64|0;u=X+40|0;t=X+36|0;q=X+32|0;p=X+28|0;o=X+24|0;v=X+20|0;x=X+16|0;y=X+12|0;w=X+8|0;T=X+4|0;Q=X;c[D>>2]=a;c[G>>2]=b;c[H>>2]=d;c[I>>2]=e;c[A>>2]=f;c[J>>2]=h;c[K>>2]=j;c[L>>2]=k;c[M>>2]=l;c[E>>2]=m;c[F>>2]=n;c[r>>2]=0;c[s>>2]=0;c[O>>2]=0;g[S>>2]=0.0;g[W>>2]=0.0;c[N>>2]=0;c[U>>2]=((c[c[D>>2]>>2]|0)!=0^1)&1;c[q>>2]=c[c[D>>2]>>2];c[p>>2]=c[(c[D>>2]|0)+24>>2];if((c[I>>2]|0)==1){c[C>>2]=Oa(c[D>>2]|0,c[G>>2]|0,c[H>>2]|0,c[A>>2]|0,c[M>>2]|0)|0;W=c[C>>2]|0;i=X;return W|0}c[t>>2]=c[F>>2];Sa(c[D>>2]|0,u,c[G>>2]|0,c[H>>2]|0,c[I>>2]|0,A,c[J>>2]|0,c[J>>2]|0,c[L>>2]|0,1,F);c[O>>2]=c[u>>2];c[r>>2]=c[u+4>>2];c[s>>2]=c[u+8>>2];c[z>>2]=c[u+12>>2];c[P>>2]=c[u+16>>2];c[B>>2]=c[u+20>>2];g[S>>2]=+(c[r>>2]|0)*.000030517578125;g[W>>2]=+(c[s>>2]|0)*.000030517578125;do if((c[I>>2]|0)==2){c[v>>2]=0;c[R>>2]=c[A>>2];c[V>>2]=0;c[V>>2]=(c[P>>2]|0)!=0&(c[P>>2]|0)!=16384?8:0;c[R>>2]=(c[R>>2]|0)-(c[V>>2]|0);c[o>>2]=(c[P>>2]|0)>8192&1;T=(c[D>>2]|0)+28|0;c[T>>2]=(c[T>>2]|0)-((c[B>>2]|0)+(c[V>>2]|0));c[x>>2]=c[o>>2]|0?c[H>>2]|0:c[G>>2]|0;c[y>>2]=c[o>>2]|0?c[G>>2]|0:c[H>>2]|0;do if(c[V>>2]|0)if(c[q>>2]|0){c[v>>2]=+g[c[x>>2]>>2]*+g[(c[y>>2]|0)+4>>2]-+g[(c[x>>2]|0)+4>>2]*+g[c[y>>2]>>2]<0.0&1;sc(c[p>>2]|0,c[v>>2]|0,1);break}else{c[v>>2]=gc(c[p>>2]|0,1)|0;break}while(0);c[v>>2]=1-(c[v>>2]<<1);c[N>>2]=Ma(c[D>>2]|0,c[x>>2]|0,c[I>>2]|0,c[R>>2]|0,c[J>>2]|0,c[K>>2]|0,c[L>>2]|0,c[M>>2]|0,1.0,c[E>>2]|0,c[t>>2]|0)|0;g[c[y>>2]>>2]=+(0-(c[v>>2]|0)|0)*+g[(c[x>>2]|0)+4>>2];g[(c[y>>2]|0)+4>>2]=+(c[v>>2]|0)*+g[c[x>>2]>>2];if(c[U>>2]|0){g[c[G>>2]>>2]=+g[S>>2]*+g[c[G>>2]>>2];g[(c[G>>2]|0)+4>>2]=+g[S>>2]*+g[(c[G>>2]|0)+4>>2];g[c[H>>2]>>2]=+g[W>>2]*+g[c[H>>2]>>2];g[(c[H>>2]|0)+4>>2]=+g[W>>2]*+g[(c[H>>2]|0)+4>>2];g[w>>2]=+g[c[G>>2]>>2];g[c[G>>2]>>2]=+g[w>>2]-+g[c[H>>2]>>2];g[c[H>>2]>>2]=+g[w>>2]+ +g[c[H>>2]>>2];g[w>>2]=+g[(c[G>>2]|0)+4>>2];g[(c[G>>2]|0)+4>>2]=+g[w>>2]-+g[(c[H>>2]|0)+4>>2];g[(c[H>>2]|0)+4>>2]=+g[w>>2]+ +g[(c[H>>2]|0)+4>>2]}}else{h=c[A>>2]|0;if((c[A>>2]|0)>=(((c[A>>2]|0)-(c[z>>2]|0)|0)/2|0|0))h=(h-(c[z>>2]|0)|0)/2|0;if(0<=(h|0)){h=c[A>>2]|0;if((c[A>>2]|0)>=(((c[A>>2]|0)-(c[z>>2]|0)|0)/2|0|0))h=(h-(c[z>>2]|0)|0)/2|0}else h=0;c[R>>2]=h;c[V>>2]=(c[A>>2]|0)-(c[R>>2]|0);h=(c[D>>2]|0)+28|0;c[h>>2]=(c[h>>2]|0)-(c[B>>2]|0);c[T>>2]=c[(c[D>>2]|0)+28>>2];h=c[D>>2]|0;if((c[R>>2]|0)>=(c[V>>2]|0)){c[N>>2]=Ma(h,c[G>>2]|0,c[I>>2]|0,c[R>>2]|0,c[J>>2]|0,c[K>>2]|0,c[L>>2]|0,c[M>>2]|0,1.0,c[E>>2]|0,c[F>>2]|0)|0;c[T>>2]=(c[R>>2]|0)-((c[T>>2]|0)-(c[(c[D>>2]|0)+28>>2]|0));if((c[T>>2]|0)>24&(c[P>>2]|0)!=0)c[V>>2]=(c[V>>2]|0)+((c[T>>2]|0)-24);W=Ma(c[D>>2]|0,c[H>>2]|0,c[I>>2]|0,c[V>>2]|0,c[J>>2]|0,0,c[L>>2]|0,0,+g[W>>2],0,c[F>>2]>>c[J>>2])|0;c[N>>2]=c[N>>2]|W;break}else{c[N>>2]=Ma(h,c[H>>2]|0,c[I>>2]|0,c[V>>2]|0,c[J>>2]|0,0,c[L>>2]|0,0,+g[W>>2],0,c[F>>2]>>c[J>>2])|0;c[T>>2]=(c[V>>2]|0)-((c[T>>2]|0)-(c[(c[D>>2]|0)+28>>2]|0));if((c[T>>2]|0)>24&(c[P>>2]|0)!=16384)c[R>>2]=(c[R>>2]|0)+((c[T>>2]|0)-24);W=Ma(c[D>>2]|0,c[G>>2]|0,c[I>>2]|0,c[R>>2]|0,c[J>>2]|0,c[K>>2]|0,c[L>>2]|0,c[M>>2]|0,1.0,c[E>>2]|0,c[F>>2]|0)|0;c[N>>2]=c[N>>2]|W;break}}while(0);a:do if(c[U>>2]|0){if((c[I>>2]|0)!=2)$a(c[G>>2]|0,c[H>>2]|0,+g[S>>2],c[I>>2]|0,c[(c[D>>2]|0)+40>>2]|0);if(c[O>>2]|0){c[Q>>2]=0;while(1){if((c[Q>>2]|0)>=(c[I>>2]|0))break a;g[(c[H>>2]|0)+(c[Q>>2]<<2)>>2]=-+g[(c[H>>2]|0)+(c[Q>>2]<<2)>>2];c[Q>>2]=(c[Q>>2]|0)+1}}}while(0);c[C>>2]=c[N>>2];W=c[C>>2]|0;i=X;return W|0}function Oa(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;u=i;i=i+48|0;h=u+44|0;j=u+40|0;k=u+36|0;l=u+32|0;m=u+28|0;q=u+24|0;n=u+20|0;s=u+16|0;t=u+12|0;p=u+8|0;o=u+4|0;r=u;c[h>>2]=a;c[j>>2]=b;c[k>>2]=d;c[l>>2]=e;c[m>>2]=f;c[q>>2]=((c[c[h>>2]>>2]|0)!=0^1)&1;c[t>>2]=c[j>>2];c[p>>2]=c[c[h>>2]>>2];c[o>>2]=c[(c[h>>2]|0)+24>>2];c[s>>2]=(c[k>>2]|0)!=0&1;c[n>>2]=0;do{c[r>>2]=0;if((c[(c[h>>2]|0)+28>>2]|0)>=8){if(c[p>>2]|0){c[r>>2]=+g[c[t>>2]>>2]<0.0&1;sc(c[o>>2]|0,c[r>>2]|0,1)}else c[r>>2]=gc(c[o>>2]|0,1)|0;f=(c[h>>2]|0)+28|0;c[f>>2]=(c[f>>2]|0)-8;c[l>>2]=(c[l>>2]|0)-8}if(c[q>>2]|0)g[c[t>>2]>>2]=c[r>>2]|0?-1.0:1.0;c[t>>2]=c[k>>2];f=(c[n>>2]|0)+1|0;c[n>>2]=f}while((f|0)<(1+(c[s>>2]|0)|0));if(!(c[m>>2]|0)){i=u;return 1}g[c[m>>2]>>2]=+g[c[j>>2]>>2];i=u;return 1}function Pa(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;p=i;i=i+48|0;f=p+32|0;h=p+28|0;j=p+24|0;q=p+20|0;m=p+16|0;n=p+12|0;l=p+8|0;k=p+4|0;o=p;c[f>>2]=a;c[h>>2]=b;c[j>>2]=d;c[q>>2]=e;c[l>>2]=_(c[h>>2]|0,c[j>>2]|0)|0;d=c[l>>2]|0;c[k>>2]=ia()|0;b=i;i=i+((1*(d<<2)|0)+15&-16)|0;if(c[q>>2]|0){c[o>>2]=8+(c[j>>2]<<2)+-8;c[m>>2]=0;while(1){if((c[m>>2]|0)>=(c[j>>2]|0))break;c[n>>2]=0;while(1){if((c[n>>2]|0)>=(c[h>>2]|0))break;d=_(c[n>>2]|0,c[j>>2]|0)|0;q=_(c[(c[o>>2]|0)+(c[m>>2]<<2)>>2]|0,c[h>>2]|0)|0;g[b+(q+(c[n>>2]|0)<<2)>>2]=+g[(c[f>>2]|0)+(d+(c[m>>2]|0)<<2)>>2];c[n>>2]=(c[n>>2]|0)+1}c[m>>2]=(c[m>>2]|0)+1}o=c[f>>2]|0;n=c[l>>2]|0;n=n<<2;q=0;q=n+q|0;pj(o|0,b|0,q|0)|0;q=c[k>>2]|0;na(q|0);i=p;return}else{c[m>>2]=0;while(1){if((c[m>>2]|0)>=(c[j>>2]|0))break;c[n>>2]=0;while(1){if((c[n>>2]|0)>=(c[h>>2]|0))break;o=_(c[n>>2]|0,c[j>>2]|0)|0;q=_(c[m>>2]|0,c[h>>2]|0)|0;g[b+(q+(c[n>>2]|0)<<2)>>2]=+g[(c[f>>2]|0)+(o+(c[m>>2]|0)<<2)>>2];c[n>>2]=(c[n>>2]|0)+1}c[m>>2]=(c[m>>2]|0)+1}o=c[f>>2]|0;n=c[l>>2]|0;n=n<<2;q=0;q=n+q|0;pj(o|0,b|0,q|0)|0;q=c[k>>2]|0;na(q|0);i=p;return}}function Qa(a,e,f,h,j,k,l,m,n){a=a|0;e=e|0;f=f|0;h=h|0;j=j|0;k=k|0;l=l|0;m=+m;n=n|0;var o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0;Y=i;i=i+176|0;G=Y+164|0;H=Y+160|0;U=Y+156|0;D=Y+152|0;V=Y+148|0;I=Y+144|0;J=Y+140|0;W=Y+136|0;K=Y+132|0;Z=Y+128|0;v=Y+124|0;p=Y+120|0;r=Y+116|0;s=Y+112|0;L=Y+108|0;P=Y+104|0;T=Y+100|0;X=Y+96|0;w=Y+92|0;M=Y+88|0;E=Y+84|0;u=Y+80|0;q=Y+76|0;A=Y+72|0;C=Y+68|0;O=Y+64|0;S=Y+60|0;B=Y+56|0;N=Y+52|0;F=Y+48|0;x=Y+24|0;Q=Y+20|0;R=Y+16|0;z=Y+12|0;t=Y+8|0;o=Y+4|0;y=Y;c[G>>2]=a;c[H>>2]=e;c[U>>2]=f;c[D>>2]=h;c[V>>2]=j;c[I>>2]=k;c[J>>2]=l;g[W>>2]=m;c[K>>2]=n;c[r>>2]=0;c[s>>2]=0;c[L>>2]=c[V>>2];g[P>>2]=0.0;g[T>>2]=0.0;c[X>>2]=0;c[w>>2]=((c[c[G>>2]>>2]|0)!=0^1)&1;c[M>>2]=0;c[E>>2]=c[c[G>>2]>>2];c[u>>2]=c[(c[G>>2]|0)+4>>2];c[q>>2]=c[(c[G>>2]|0)+8>>2];c[A>>2]=c[(c[G>>2]|0)+16>>2];c[C>>2]=c[(c[G>>2]|0)+24>>2];k=_((c[J>>2]|0)+1|0,c[(c[u>>2]|0)+8>>2]|0)|0;c[Z>>2]=(c[(c[u>>2]|0)+92+8>>2]|0)+(b[(c[(c[u>>2]|0)+92+4>>2]|0)+(k+(c[q>>2]|0)<<1)>>1]|0);if((c[J>>2]|0)!=-1?((c[U>>2]|0)>2?(c[D>>2]|0)>((d[(c[Z>>2]|0)+(d[c[Z>>2]>>0]|0)>>0]|0)+12|0):0):0){c[Q>>2]=0;c[U>>2]=c[U>>2]>>1;c[M>>2]=(c[H>>2]|0)+(c[U>>2]<<2);c[J>>2]=(c[J>>2]|0)-1;if((c[V>>2]|0)==1)c[K>>2]=c[K>>2]&1|c[K>>2]<<1;c[V>>2]=(c[V>>2]|0)+1>>1;Sa(c[G>>2]|0,x,c[H>>2]|0,c[M>>2]|0,c[U>>2]|0,D,c[V>>2]|0,c[L>>2]|0,c[J>>2]|0,0,K);c[r>>2]=c[x+4>>2];c[s>>2]=c[x+8>>2];c[B>>2]=c[x+12>>2];c[N>>2]=c[x+16>>2];c[F>>2]=c[x+20>>2];g[P>>2]=+(c[r>>2]|0)*.000030517578125;g[T>>2]=+(c[s>>2]|0)*.000030517578125;do if((c[L>>2]|0)>1?c[N>>2]&16383|0:0){j=c[B>>2]|0;if((c[N>>2]|0)>8192){c[B>>2]=(c[B>>2]|0)-(j>>4-(c[J>>2]|0));break}if(0<(j+(c[U>>2]<<3>>5-(c[J>>2]|0))|0))j=0;else j=(c[B>>2]|0)+(c[U>>2]<<3>>5-(c[J>>2]|0))|0;c[B>>2]=j}while(0);j=c[D>>2]|0;if((c[D>>2]|0)>=(((c[D>>2]|0)-(c[B>>2]|0)|0)/2|0|0))j=(j-(c[B>>2]|0)|0)/2|0;if(0<=(j|0)){j=c[D>>2]|0;if((c[D>>2]|0)>=(((c[D>>2]|0)-(c[B>>2]|0)|0)/2|0|0))j=(j-(c[B>>2]|0)|0)/2|0}else j=0;c[O>>2]=j;c[S>>2]=(c[D>>2]|0)-(c[O>>2]|0);Z=(c[G>>2]|0)+28|0;c[Z>>2]=(c[Z>>2]|0)-(c[F>>2]|0);if(c[I>>2]|0)c[Q>>2]=(c[I>>2]|0)+(c[U>>2]<<2);c[R>>2]=c[(c[G>>2]|0)+28>>2];j=c[G>>2]|0;if((c[O>>2]|0)>=(c[S>>2]|0)){c[X>>2]=Qa(j,c[H>>2]|0,c[U>>2]|0,c[O>>2]|0,c[V>>2]|0,c[I>>2]|0,c[J>>2]|0,+g[W>>2]*+g[P>>2],c[K>>2]|0)|0;c[R>>2]=(c[O>>2]|0)-((c[R>>2]|0)-(c[(c[G>>2]|0)+28>>2]|0));if((c[R>>2]|0)>24&(c[N>>2]|0)!=0)c[S>>2]=(c[S>>2]|0)+((c[R>>2]|0)-24);Z=Qa(c[G>>2]|0,c[M>>2]|0,c[U>>2]|0,c[S>>2]|0,c[V>>2]|0,c[Q>>2]|0,c[J>>2]|0,+g[W>>2]*+g[T>>2],c[K>>2]>>c[V>>2])|0;c[X>>2]=c[X>>2]|Z<<(c[L>>2]>>1);Z=c[X>>2]|0;i=Y;return Z|0}else{Z=Qa(j,c[M>>2]|0,c[U>>2]|0,c[S>>2]|0,c[V>>2]|0,c[Q>>2]|0,c[J>>2]|0,+g[W>>2]*+g[T>>2],c[K>>2]>>c[V>>2])|0;c[X>>2]=Z<<(c[L>>2]>>1);c[R>>2]=(c[S>>2]|0)-((c[R>>2]|0)-(c[(c[G>>2]|0)+28>>2]|0));if((c[R>>2]|0)>24&(c[N>>2]|0)!=16384)c[O>>2]=(c[O>>2]|0)+((c[R>>2]|0)-24);Z=Qa(c[G>>2]|0,c[H>>2]|0,c[U>>2]|0,c[O>>2]|0,c[V>>2]|0,c[I>>2]|0,c[J>>2]|0,+g[W>>2]*+g[P>>2],c[K>>2]|0)|0;c[X>>2]=c[X>>2]|Z;Z=c[X>>2]|0;i=Y;return Z|0}}c[v>>2]=Ta(c[u>>2]|0,c[q>>2]|0,c[J>>2]|0,c[D>>2]|0)|0;c[p>>2]=Ua(c[u>>2]|0,c[q>>2]|0,c[J>>2]|0,c[v>>2]|0)|0;Z=(c[G>>2]|0)+28|0;c[Z>>2]=(c[Z>>2]|0)-(c[p>>2]|0);while(1){if(!((c[(c[G>>2]|0)+28>>2]|0)<0?(c[v>>2]|0)>0:0))break;Z=(c[G>>2]|0)+28|0;c[Z>>2]=(c[Z>>2]|0)+(c[p>>2]|0);c[v>>2]=(c[v>>2]|0)+-1;c[p>>2]=Ua(c[u>>2]|0,c[q>>2]|0,c[J>>2]|0,c[v>>2]|0)|0;Z=(c[G>>2]|0)+28|0;c[Z>>2]=(c[Z>>2]|0)-(c[p>>2]|0)}if(c[v>>2]|0){c[z>>2]=Va(c[v>>2]|0)|0;o=c[H>>2]|0;h=c[U>>2]|0;e=c[z>>2]|0;f=c[A>>2]|0;l=c[V>>2]|0;j=c[C>>2]|0;if(c[E>>2]|0){c[X>>2]=md(o,h,e,f,l,j)|0;Z=c[X>>2]|0;i=Y;return Z|0}else{c[X>>2]=rd(o,h,e,f,l,j,+g[W>>2])|0;Z=c[X>>2]|0;i=Y;return Z|0}}if(!(c[w>>2]|0)){Z=c[X>>2]|0;i=Y;return Z|0}c[o>>2]=(1<<c[V>>2])-1;c[K>>2]=c[K>>2]&c[o>>2];if(!(c[K>>2]|0)){oj(c[H>>2]|0,0,c[U>>2]<<2|0)|0;Z=c[X>>2]|0;i=Y;return Z|0}Z=(c[I>>2]|0)==0;c[t>>2]=0;if(Z){while(1){if((c[t>>2]|0)>=(c[U>>2]|0))break;Z=Ba(c[(c[G>>2]|0)+36>>2]|0)|0;c[(c[G>>2]|0)+36>>2]=Z;g[(c[H>>2]|0)+(c[t>>2]<<2)>>2]=+(c[(c[G>>2]|0)+36>>2]>>20|0);c[t>>2]=(c[t>>2]|0)+1}c[X>>2]=c[o>>2]}else{while(1){if((c[t>>2]|0)>=(c[U>>2]|0))break;Z=Ba(c[(c[G>>2]|0)+36>>2]|0)|0;c[(c[G>>2]|0)+36>>2]=Z;g[y>>2]=.00390625;m=+g[y>>2];g[y>>2]=c[(c[G>>2]|0)+36>>2]&32768|0?m:-m;g[(c[H>>2]|0)+(c[t>>2]<<2)>>2]=+g[(c[I>>2]|0)+(c[t>>2]<<2)>>2]+ +g[y>>2];c[t>>2]=(c[t>>2]|0)+1}c[X>>2]=c[K>>2]}td(c[H>>2]|0,c[U>>2]|0,+g[W>>2],c[(c[G>>2]|0)+40>>2]|0);Z=c[X>>2]|0;i=Y;return Z|0}function Ra(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;p=i;i=i+48|0;h=p+32|0;j=p+28|0;k=p+24|0;q=p+20|0;n=p+16|0;o=p+12|0;m=p+8|0;l=p+4|0;f=p;c[h>>2]=a;c[j>>2]=b;c[k>>2]=d;c[q>>2]=e;c[m>>2]=_(c[j>>2]|0,c[k>>2]|0)|0;d=c[m>>2]|0;c[l>>2]=ia()|0;a=i;i=i+((1*(d<<2)|0)+15&-16)|0;if(c[q>>2]|0){c[f>>2]=8+(c[k>>2]<<2)+-8;c[n>>2]=0;while(1){if((c[n>>2]|0)>=(c[k>>2]|0))break;c[o>>2]=0;while(1){b=c[n>>2]|0;if((c[o>>2]|0)>=(c[j>>2]|0))break;d=_(c[(c[f>>2]|0)+(b<<2)>>2]|0,c[j>>2]|0)|0;q=_(c[o>>2]|0,c[k>>2]|0)|0;g[a+(q+(c[n>>2]|0)<<2)>>2]=+g[(c[h>>2]|0)+(d+(c[o>>2]|0)<<2)>>2];c[o>>2]=(c[o>>2]|0)+1}c[n>>2]=b+1}o=c[h>>2]|0;n=c[m>>2]|0;n=n<<2;q=0;q=n+q|0;pj(o|0,a|0,q|0)|0;q=c[l>>2]|0;na(q|0);i=p;return}else{c[n>>2]=0;while(1){if((c[n>>2]|0)>=(c[k>>2]|0))break;c[o>>2]=0;while(1){b=c[n>>2]|0;if((c[o>>2]|0)>=(c[j>>2]|0))break;f=_(b,c[j>>2]|0)|0;q=_(c[o>>2]|0,c[k>>2]|0)|0;g[a+(q+(c[n>>2]|0)<<2)>>2]=+g[(c[h>>2]|0)+(f+(c[o>>2]|0)<<2)>>2];c[o>>2]=(c[o>>2]|0)+1}c[n>>2]=b+1}o=c[h>>2]|0;n=c[m>>2]|0;n=n<<2;q=0;q=n+q|0;pj(o|0,a|0,q|0)|0;q=c[l>>2]|0;na(q|0);i=p;return}}function Sa(a,d,e,f,h,j,k,l,m,n,o){a=a|0;d=d|0;e=e|0;f=f|0;h=h|0;j=j|0;k=k|0;l=l|0;m=m|0;n=n|0;o=o|0;var p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,$=0,aa=0,ba=0;Y=i;i=i+160|0;p=Y+148|0;K=Y+144|0;D=Y+140|0;E=Y+136|0;M=Y+132|0;N=Y+128|0;O=Y+124|0;q=Y+120|0;ba=Y+116|0;F=Y+112|0;L=Y+108|0;J=Y+104|0;V=Y+100|0;P=Y+96|0;S=Y+92|0;U=Y+88|0;W=Y+84|0;$=Y+80|0;aa=Y+76|0;X=Y+72|0;T=Y+68|0;R=Y+64|0;I=Y+60|0;H=Y+56|0;Z=Y+52|0;Q=Y+48|0;G=Y+44|0;z=Y+40|0;B=Y+36|0;A=Y+32|0;C=Y+28|0;u=Y+24|0;x=Y+20|0;y=Y+16|0;w=Y+12|0;r=Y+8|0;s=Y+4|0;t=Y;c[p>>2]=a;c[K>>2]=d;c[D>>2]=e;c[E>>2]=f;c[M>>2]=h;c[N>>2]=j;c[O>>2]=k;c[q>>2]=l;c[ba>>2]=m;c[F>>2]=n;c[L>>2]=o;c[V>>2]=0;c[T>>2]=0;c[R>>2]=c[c[p>>2]>>2];c[I>>2]=c[(c[p>>2]|0)+4>>2];c[H>>2]=c[(c[p>>2]|0)+8>>2];c[Z>>2]=c[(c[p>>2]|0)+12>>2];c[Q>>2]=c[(c[p>>2]|0)+24>>2];c[G>>2]=c[(c[p>>2]|0)+32>>2];c[$>>2]=(b[(c[(c[I>>2]|0)+56>>2]|0)+(c[H>>2]<<1)>>1]|0)+(c[ba>>2]<<3);c[aa>>2]=(c[$>>2]>>1)-((c[F>>2]|0?(c[M>>2]|0)==2:0)?16:4);c[J>>2]=Wa(c[M>>2]|0,c[c[N>>2]>>2]|0,c[aa>>2]|0,c[$>>2]|0,c[F>>2]|0)|0;if(c[F>>2]|0?(c[H>>2]|0)>=(c[Z>>2]|0):0)c[J>>2]=1;if(c[R>>2]|0)c[V>>2]=vd(c[D>>2]|0,c[E>>2]|0,c[F>>2]|0,c[M>>2]|0,c[(c[p>>2]|0)+40>>2]|0)|0;c[X>>2]=Xb(c[Q>>2]|0)|0;do if((c[J>>2]|0)!=1){if(c[R>>2]|0)c[V>>2]=(_(c[V>>2]|0,c[J>>2]|0)|0)+8192>>14;do if((c[F>>2]|0)!=0&(c[M>>2]|0)>2){c[z>>2]=3;c[B>>2]=c[V>>2];c[A>>2]=(c[J>>2]|0)/2|0;k=_(c[z>>2]|0,(c[A>>2]|0)+1|0)|0;c[C>>2]=k+(c[A>>2]|0);k=c[Q>>2]|0;if(c[R>>2]|0){if((c[B>>2]|0)<=(c[A>>2]|0))q=_(c[z>>2]|0,c[B>>2]|0)|0;else q=(c[B>>2]|0)-1-(c[A>>2]|0)+(_((c[A>>2]|0)+1|0,c[z>>2]|0)|0)|0;if((c[B>>2]|0)<=(c[A>>2]|0))p=_(c[z>>2]|0,(c[B>>2]|0)+1|0)|0;else p=(c[B>>2]|0)-(c[A>>2]|0)+(_((c[A>>2]|0)+1|0,c[z>>2]|0)|0)|0;jc(k,q,p,c[C>>2]|0);break}c[u>>2]=$b(k,c[C>>2]|0)|0;if((c[u>>2]|0)<(_((c[A>>2]|0)+1|0,c[z>>2]|0)|0))c[B>>2]=(c[u>>2]|0)/(c[z>>2]|0)|0;else c[B>>2]=(c[A>>2]|0)+1+((c[u>>2]|0)-(_((c[A>>2]|0)+1|0,c[z>>2]|0)|0));if((c[B>>2]|0)<=(c[A>>2]|0))q=_(c[z>>2]|0,c[B>>2]|0)|0;else q=(c[B>>2]|0)-1-(c[A>>2]|0)+(_((c[A>>2]|0)+1|0,c[z>>2]|0)|0)|0;if((c[B>>2]|0)<=(c[A>>2]|0))p=_(c[z>>2]|0,(c[B>>2]|0)+1|0)|0;else p=(c[B>>2]|0)-(c[A>>2]|0)+(_((c[A>>2]|0)+1|0,c[z>>2]|0)|0)|0;cc(c[Q>>2]|0,q,p,c[C>>2]|0);c[V>>2]=c[B>>2]}else{if((c[q>>2]|0)>1|(c[F>>2]|0)!=0){p=c[Q>>2]|0;if(c[R>>2]|0){rc(p,c[V>>2]|0,(c[J>>2]|0)+1|0);break}else{c[V>>2]=fc(p,(c[J>>2]|0)+1|0)|0;break}}c[x>>2]=1;c[y>>2]=_((c[J>>2]>>1)+1|0,(c[J>>2]>>1)+1|0)|0;if(!(c[R>>2]|0)){c[r>>2]=0;c[s>>2]=$b(c[Q>>2]|0,c[y>>2]|0)|0;if((c[s>>2]|0)<((_(c[J>>2]>>1,(c[J>>2]>>1)+1|0)|0)>>1|0)){c[V>>2]=((Gc((c[s>>2]<<3)+1|0)|0)-1|0)>>>1;c[x>>2]=(c[V>>2]|0)+1;c[r>>2]=(_(c[V>>2]|0,(c[V>>2]|0)+1|0)|0)>>1}else{ba=(c[J>>2]|0)+1<<1;c[V>>2]=(ba-(Gc(((c[y>>2]|0)-(c[s>>2]|0)-1<<3)+1|0)|0)|0)>>>1;c[x>>2]=(c[J>>2]|0)+1-(c[V>>2]|0);c[r>>2]=(c[y>>2]|0)-((_((c[J>>2]|0)+1-(c[V>>2]|0)|0,(c[J>>2]|0)+2-(c[V>>2]|0)|0)|0)>>1)}cc(c[Q>>2]|0,c[r>>2]|0,(c[r>>2]|0)+(c[x>>2]|0)|0,c[y>>2]|0);break}if((c[V>>2]|0)<=(c[J>>2]>>1|0))p=(c[V>>2]|0)+1|0;else p=(c[J>>2]|0)+1-(c[V>>2]|0)|0;c[x>>2]=p;if((c[V>>2]|0)<=(c[J>>2]>>1|0))p=(_(c[V>>2]|0,(c[V>>2]|0)+1|0)|0)>>1;else p=(c[y>>2]|0)-((_((c[J>>2]|0)+1-(c[V>>2]|0)|0,(c[J>>2]|0)+2-(c[V>>2]|0)|0)|0)>>1)|0;c[w>>2]=p;jc(c[Q>>2]|0,c[w>>2]|0,(c[w>>2]|0)+(c[x>>2]|0)|0,c[y>>2]|0)}while(0);c[V>>2]=Ha(c[V>>2]<<14,c[J>>2]|0)|0;if((c[R>>2]|0)!=0&(c[F>>2]|0)!=0)if(!(c[V>>2]|0)){Xa(c[I>>2]|0,c[D>>2]|0,c[E>>2]|0,c[G>>2]|0,c[H>>2]|0,c[M>>2]|0);break}else{Ya(c[D>>2]|0,c[E>>2]|0,c[M>>2]|0);break}}else if(c[F>>2]|0){if(c[R>>2]|0){c[T>>2]=(c[V>>2]|0)>8192&1;a:do if(c[T>>2]|0){c[t>>2]=0;while(1){if((c[t>>2]|0)>=(c[M>>2]|0))break a;g[(c[E>>2]|0)+(c[t>>2]<<2)>>2]=-+g[(c[E>>2]|0)+(c[t>>2]<<2)>>2];c[t>>2]=(c[t>>2]|0)+1}}while(0);Xa(c[I>>2]|0,c[D>>2]|0,c[E>>2]|0,c[G>>2]|0,c[H>>2]|0,c[M>>2]|0)}do if((c[c[N>>2]>>2]|0)>16?(c[(c[p>>2]|0)+28>>2]|0)>16:0){p=c[Q>>2]|0;if(c[R>>2]|0){pc(p,c[T>>2]|0,2);break}else{c[T>>2]=dc(p,2)|0;break}}else v=60;while(0);if((v|0)==60)c[T>>2]=0;c[V>>2]=0}while(0);ba=Xb(c[Q>>2]|0)|0;c[W>>2]=ba-(c[X>>2]|0);ba=c[N>>2]|0;c[ba>>2]=(c[ba>>2]|0)-(c[W>>2]|0);if(!(c[V>>2]|0)){c[S>>2]=32767;c[U>>2]=0;ba=c[L>>2]|0;c[ba>>2]=c[ba>>2]&(1<<c[O>>2])-1;c[P>>2]=-16384;ba=c[T>>2]|0;aa=c[K>>2]|0;c[aa>>2]=ba;aa=c[S>>2]|0;ba=c[K>>2]|0;ba=ba+4|0;c[ba>>2]=aa;ba=c[U>>2]|0;aa=c[K>>2]|0;aa=aa+8|0;c[aa>>2]=ba;aa=c[P>>2]|0;ba=c[K>>2]|0;ba=ba+12|0;c[ba>>2]=aa;ba=c[V>>2]|0;aa=c[K>>2]|0;aa=aa+16|0;c[aa>>2]=ba;aa=c[W>>2]|0;ba=c[K>>2]|0;ba=ba+20|0;c[ba>>2]=aa;i=Y;return}if((c[V>>2]|0)==16384){c[S>>2]=0;c[U>>2]=32767;ba=c[L>>2]|0;c[ba>>2]=c[ba>>2]&(1<<c[O>>2])-1<<c[O>>2];c[P>>2]=16384;ba=c[T>>2]|0;aa=c[K>>2]|0;c[aa>>2]=ba;aa=c[S>>2]|0;ba=c[K>>2]|0;ba=ba+4|0;c[ba>>2]=aa;ba=c[U>>2]|0;aa=c[K>>2]|0;aa=aa+8|0;c[aa>>2]=ba;aa=c[P>>2]|0;ba=c[K>>2]|0;ba=ba+12|0;c[ba>>2]=aa;ba=c[V>>2]|0;aa=c[K>>2]|0;aa=aa+16|0;c[aa>>2]=ba;aa=c[W>>2]|0;ba=c[K>>2]|0;ba=ba+20|0;c[ba>>2]=aa;i=Y;return}else{c[S>>2]=(Za(c[V>>2]&65535)|0)<<16>>16;c[U>>2]=(Za(16384-(c[V>>2]|0)&65535)|0)<<16>>16;ba=((c[M>>2]|0)-1<<7&65535)<<16>>16;c[P>>2]=16384+(_(ba,((_a(c[U>>2]|0,c[S>>2]|0)|0)&65535)<<16>>16)|0)>>15;ba=c[T>>2]|0;aa=c[K>>2]|0;c[aa>>2]=ba;aa=c[S>>2]|0;ba=c[K>>2]|0;ba=ba+4|0;c[ba>>2]=aa;ba=c[U>>2]|0;aa=c[K>>2]|0;aa=aa+8|0;c[aa>>2]=ba;aa=c[P>>2]|0;ba=c[K>>2]|0;ba=ba+12|0;c[ba>>2]=aa;ba=c[V>>2]|0;aa=c[K>>2]|0;aa=aa+16|0;c[aa>>2]=ba;aa=c[W>>2]|0;ba=c[K>>2]|0;ba=ba+20|0;c[ba>>2]=aa;i=Y;return}}function Ta(a,e,f,g){a=a|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;p=i;i=i+48|0;k=p+36|0;r=p+32|0;q=p+28|0;s=p+24|0;l=p+20|0;h=p+16|0;o=p+12|0;n=p+8|0;m=p+4|0;j=p;c[r>>2]=a;c[q>>2]=e;c[s>>2]=f;c[l>>2]=g;c[s>>2]=(c[s>>2]|0)+1;a=_(c[s>>2]|0,c[(c[r>>2]|0)+8>>2]|0)|0;c[m>>2]=(c[(c[r>>2]|0)+92+8>>2]|0)+(b[(c[(c[r>>2]|0)+92+4>>2]|0)+(a+(c[q>>2]|0)<<1)>>1]|0);c[o>>2]=0;c[n>>2]=d[c[m>>2]>>0];c[l>>2]=(c[l>>2]|0)+-1;c[h>>2]=0;while(1){if((c[h>>2]|0)>=6)break;c[j>>2]=(c[o>>2]|0)+(c[n>>2]|0)+1>>1;f=c[j>>2]|0;if((d[(c[m>>2]|0)+(c[j>>2]|0)>>0]|0)>=(c[l>>2]|0))c[n>>2]=f;else c[o>>2]=f;c[h>>2]=(c[h>>2]|0)+1}if(!(c[o>>2]|0))f=-1;else f=d[(c[m>>2]|0)+(c[o>>2]|0)>>0]|0;if(((c[l>>2]|0)-f|0)<=((d[(c[m>>2]|0)+(c[n>>2]|0)>>0]|0)-(c[l>>2]|0)|0)){c[k>>2]=c[o>>2];s=c[k>>2]|0;i=p;return s|0}else{c[k>>2]=c[n>>2];s=c[k>>2]|0;i=p;return s|0}return 0}function Ua(a,e,f,g){a=a|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0;k=i;i=i+32|0;m=k+16|0;l=k+12|0;n=k+8|0;h=k+4|0;j=k;c[m>>2]=a;c[l>>2]=e;c[n>>2]=f;c[h>>2]=g;c[n>>2]=(c[n>>2]|0)+1;g=_(c[n>>2]|0,c[(c[m>>2]|0)+8>>2]|0)|0;c[j>>2]=(c[(c[m>>2]|0)+92+8>>2]|0)+(b[(c[(c[m>>2]|0)+92+4>>2]|0)+(g+(c[l>>2]|0)<<1)>>1]|0);if(!(c[h>>2]|0)){n=0;i=k;return n|0}n=(d[(c[j>>2]|0)+(c[h>>2]|0)>>0]|0)+1|0;i=k;return n|0}function Va(a){a=a|0;var b=0,d=0;d=i;i=i+16|0;b=d;c[b>>2]=a;a=c[b>>2]|0;if((c[b>>2]|0)<8){b=a;i=d;return b|0}b=8+(a&7)<<(c[b>>2]>>3)-1;i=d;return b|0}function Wa(a,d,e,f,g){a=a|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;o=i;i=i+32|0;p=o+28|0;h=o+24|0;j=o+20|0;k=o+16|0;q=o+12|0;n=o+8|0;m=o+4|0;l=o;c[p>>2]=a;c[h>>2]=d;c[j>>2]=e;c[k>>2]=f;c[q>>2]=g;c[l>>2]=(c[p>>2]<<1)-1;if((c[q>>2]|0)!=0&(c[p>>2]|0)==2)c[l>>2]=(c[l>>2]|0)+-1;q=(c[h>>2]|0)+(_(c[l>>2]|0,c[j>>2]|0)|0)|0;c[m>>2]=La(q,c[l>>2]|0)|0;if(((c[h>>2]|0)-(c[k>>2]|0)-32|0)<(c[m>>2]|0))h=(c[h>>2]|0)-(c[k>>2]|0)-32|0;else h=c[m>>2]|0;c[m>>2]=h;c[m>>2]=64<(c[m>>2]|0)?64:c[m>>2]|0;if((c[m>>2]|0)<4){c[n>>2]=1;q=c[n>>2]|0;i=o;return q|0}else{c[n>>2]=b[22328+((c[m>>2]&7)<<1)>>1]>>14-(c[m>>2]>>3);c[n>>2]=(c[n>>2]|0)+1>>1<<1;q=c[n>>2]|0;i=o;return q|0}return 0}function Xa(a,b,d,e,f,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;r=i;i=i+64|0;v=r+56|0;j=r+52|0;k=r+48|0;x=r+44|0;y=r+40|0;l=r+36|0;w=r+32|0;o=r+28|0;m=r+24|0;n=r+20|0;u=r+16|0;t=r+12|0;s=r+8|0;q=r+4|0;p=r;c[v>>2]=a;c[j>>2]=b;c[k>>2]=d;c[x>>2]=e;c[y>>2]=f;c[l>>2]=h;c[w>>2]=c[y>>2];g[u>>2]=+g[(c[x>>2]|0)+(c[w>>2]<<2)>>2];g[t>>2]=+g[(c[x>>2]|0)+((c[w>>2]|0)+(c[(c[v>>2]|0)+8>>2]|0)<<2)>>2];g[s>>2]=+O(+(+g[u>>2]*+g[u>>2]+1.0000000036274937e-15+ +g[t>>2]*+g[t>>2]))+1.0000000036274937e-15;g[m>>2]=+g[u>>2]/+g[s>>2];g[n>>2]=+g[t>>2]/+g[s>>2];c[o>>2]=0;while(1){if((c[o>>2]|0)>=(c[l>>2]|0))break;g[p>>2]=+g[(c[j>>2]|0)+(c[o>>2]<<2)>>2];g[q>>2]=+g[(c[k>>2]|0)+(c[o>>2]<<2)>>2];g[(c[j>>2]|0)+(c[o>>2]<<2)>>2]=+g[m>>2]*+g[p>>2]+ +g[n>>2]*+g[q>>2];c[o>>2]=(c[o>>2]|0)+1}i=r;return}function Ya(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0,k=0,l=0,m=0;m=i;i=i+32|0;e=m+20|0;f=m+16|0;h=m+12|0;j=m+8|0;l=m+4|0;k=m;c[e>>2]=a;c[f>>2]=b;c[h>>2]=d;c[j>>2]=0;while(1){if((c[j>>2]|0)>=(c[h>>2]|0))break;g[k>>2]=+g[(c[e>>2]|0)+(c[j>>2]<<2)>>2]*.7071067690849304;g[l>>2]=+g[(c[f>>2]|0)+(c[j>>2]<<2)>>2]*.7071067690849304;g[(c[e>>2]|0)+(c[j>>2]<<2)>>2]=+g[k>>2]+ +g[l>>2];g[(c[f>>2]|0)+(c[j>>2]<<2)>>2]=+g[l>>2]-+g[k>>2];c[j>>2]=(c[j>>2]|0)+1}i=m;return}function Za(a){a=a|0;var d=0,e=0,f=0,g=0;e=i;i=i+16|0;g=e+6|0;f=e;d=e+4|0;b[g>>1]=a;c[f>>2]=4096+(_(b[g>>1]|0,b[g>>1]|0)|0)>>13;b[d>>1]=c[f>>2];b[d>>1]=32767-(b[d>>1]|0)+(16384+(_(b[d>>1]|0,((16384+(_(b[d>>1]|0,(8277+(16384+(_(-626,b[d>>1]|0)|0)>>15)&65535)<<16>>16)|0)>>15)+-7651&65535)<<16>>16)|0)>>15);i=e;return 1+(b[d>>1]|0)&65535|0}function _a(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;i=i+16|0;f=d+12|0;e=d+8|0;g=d+4|0;h=d;c[f>>2]=a;c[e>>2]=b;c[g>>2]=32-(aa(c[e>>2]|0)|0);c[h>>2]=32-(aa(c[f>>2]|0)|0);c[e>>2]=c[e>>2]<<15-(c[g>>2]|0);c[f>>2]=c[f>>2]<<15-(c[h>>2]|0);a=((c[h>>2]|0)-(c[g>>2]|0)<<11)+(16384+(_((c[f>>2]&65535)<<16>>16,((16384+(_((c[f>>2]&65535)<<16>>16,-2597)|0)>>15)+7932&65535)<<16>>16)|0)>>15)|0;a=a-(16384+(_((c[e>>2]&65535)<<16>>16,((16384+(_((c[e>>2]&65535)<<16>>16,-2597)|0)>>15)+7932&65535)<<16>>16)|0)>>15)|0;i=d;return a|0}function $a(a,b,d,e,f){a=a|0;b=b|0;d=+d;e=e|0;f=f|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;u=i;i=i+64|0;h=u+60|0;j=u+56|0;k=u+52|0;l=u+48|0;o=u+40|0;v=u+36|0;w=u+32|0;m=u+28|0;n=u+24|0;x=u+20|0;t=u+16|0;q=u+12|0;s=u+8|0;r=u+4|0;p=u;c[h>>2]=a;c[j>>2]=b;g[k>>2]=d;c[l>>2]=e;c[u+44>>2]=f;g[v>>2]=0.0;g[w>>2]=0.0;ab(c[j>>2]|0,c[h>>2]|0,c[j>>2]|0,c[l>>2]|0,v,w);g[v>>2]=+g[k>>2]*+g[v>>2];g[x>>2]=+g[k>>2];g[m>>2]=+g[x>>2]*+g[x>>2]+ +g[w>>2]-+g[v>>2]*2.0;g[n>>2]=+g[x>>2]*+g[x>>2]+ +g[w>>2]+ +g[v>>2]*2.0;if(+g[n>>2]<6.000000284984708e-04|+g[m>>2]<6.000000284984708e-04){pj(c[j>>2]|0,c[h>>2]|0,(c[l>>2]<<2)+0|0)|0;i=u;return}g[t>>2]=+g[m>>2];g[q>>2]=1.0/+O(+(+g[t>>2]));g[t>>2]=+g[n>>2];g[s>>2]=1.0/+O(+(+g[t>>2]));c[o>>2]=0;while(1){if((c[o>>2]|0)>=(c[l>>2]|0))break;g[p>>2]=+g[k>>2]*+g[(c[h>>2]|0)+(c[o>>2]<<2)>>2];g[r>>2]=+g[(c[j>>2]|0)+(c[o>>2]<<2)>>2];g[(c[h>>2]|0)+(c[o>>2]<<2)>>2]=+g[q>>2]*(+g[p>>2]-+g[r>>2]);g[(c[j>>2]|0)+(c[o>>2]<<2)>>2]=+g[s>>2]*(+g[p>>2]+ +g[r>>2]);c[o>>2]=(c[o>>2]|0)+1}i=u;return}function ab(a,b,d,e,f,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var j=0.0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;t=i;i=i+48|0;k=t+32|0;l=t+28|0;m=t+24|0;n=t+20|0;o=t+16|0;p=t+12|0;q=t+8|0;r=t+4|0;s=t;c[k>>2]=a;c[l>>2]=b;c[m>>2]=d;c[n>>2]=e;c[o>>2]=f;c[p>>2]=h;g[r>>2]=0.0;g[s>>2]=0.0;c[q>>2]=0;while(1){j=+g[r>>2];if((c[q>>2]|0)>=(c[n>>2]|0))break;g[r>>2]=j+ +g[(c[k>>2]|0)+(c[q>>2]<<2)>>2]*+g[(c[l>>2]|0)+(c[q>>2]<<2)>>2];g[s>>2]=+g[s>>2]+ +g[(c[k>>2]|0)+(c[q>>2]<<2)>>2]*+g[(c[m>>2]|0)+(c[q>>2]<<2)>>2];c[q>>2]=(c[q>>2]|0)+1}g[c[o>>2]>>2]=j;g[c[p>>2]>>2]=+g[s>>2];i=t;return}function bb(a){a=a|0;var b=0,d=0,e=0,f=0;e=i;i=i+16|0;f=e+4|0;b=e;c[f>>2]=a;a=c[f>>2]|0;a:do if((a|0)<16e3)if((a|0)<12e3){switch(a|0){case 8e3:break;default:{d=7;break a}}c[b>>2]=6;break}else{switch(a|0){case 12e3:break;default:{d=7;break a}}c[b>>2]=4;break}else{if((a|0)<24e3){switch(a|0){case 16e3:break;default:{d=7;break a}}c[b>>2]=3;break}if((a|0)<48e3){switch(a|0){case 24e3:break;default:{d=7;break a}}c[b>>2]=2;break}else{switch(a|0){case 48e3:break;default:{d=7;break a}}c[b>>2]=1;break}}while(0);if((d|0)==7)c[b>>2]=0;i=e;return c[b>>2]|0}function cb(a,b,d,e,f,h,j,k,l,m,n,o){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=+h;j=+j;k=k|0;l=l|0;m=m|0;n=n|0;o=o|0;var p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0;N=i;i=i+112|0;p=N+96|0;q=N+92|0;s=N+88|0;t=N+84|0;u=N+80|0;v=N+76|0;w=N+72|0;x=N+68|0;y=N+64|0;z=N+60|0;r=N+56|0;H=N+48|0;B=N+44|0;C=N+40|0;D=N+36|0;E=N+32|0;F=N+28|0;G=N+24|0;I=N+20|0;J=N+16|0;K=N+12|0;L=N+8|0;M=N+4|0;A=N;c[p>>2]=a;c[q>>2]=b;c[s>>2]=d;c[t>>2]=e;c[u>>2]=f;g[v>>2]=h;g[w>>2]=j;c[x>>2]=k;c[y>>2]=l;c[z>>2]=m;c[r>>2]=n;c[N+52>>2]=o;if(+g[v>>2]==0.0&+g[w>>2]==0.0){if((c[q>>2]|0)==(c[p>>2]|0)){i=N;return}qj(c[p>>2]|0,c[q>>2]|0,(c[u>>2]<<2)+0|0)|0;i=N;return}g[B>>2]=+g[v>>2]*+g[128+((c[x>>2]|0)*12|0)>>2];g[C>>2]=+g[v>>2]*+g[128+((c[x>>2]|0)*12|0)+4>>2];g[D>>2]=+g[v>>2]*+g[128+((c[x>>2]|0)*12|0)+8>>2];g[E>>2]=+g[w>>2]*+g[128+((c[y>>2]|0)*12|0)>>2];g[F>>2]=+g[w>>2]*+g[128+((c[y>>2]|0)*12|0)+4>>2];g[G>>2]=+g[w>>2]*+g[128+((c[y>>2]|0)*12|0)+8>>2];g[J>>2]=+g[(c[q>>2]|0)+(0-(c[t>>2]|0)+1<<2)>>2];g[K>>2]=+g[(c[q>>2]|0)+(0-(c[t>>2]|0)<<2)>>2];g[L>>2]=+g[(c[q>>2]|0)+(0-(c[t>>2]|0)-1<<2)>>2];g[M>>2]=+g[(c[q>>2]|0)+(0-(c[t>>2]|0)-2<<2)>>2];if((+g[v>>2]==+g[w>>2]?(c[s>>2]|0)==(c[t>>2]|0):0)?(c[x>>2]|0)==(c[y>>2]|0):0)c[r>>2]=0;c[H>>2]=0;while(1){if((c[H>>2]|0)>=(c[r>>2]|0))break;g[I>>2]=+g[(c[q>>2]|0)+((c[H>>2]|0)-(c[t>>2]|0)+2<<2)>>2];g[A>>2]=+g[(c[z>>2]|0)+(c[H>>2]<<2)>>2]*+g[(c[z>>2]|0)+(c[H>>2]<<2)>>2];g[(c[p>>2]|0)+(c[H>>2]<<2)>>2]=+g[(c[q>>2]|0)+(c[H>>2]<<2)>>2]+(1.0-+g[A>>2])*+g[B>>2]*+g[(c[q>>2]|0)+((c[H>>2]|0)-(c[s>>2]|0)<<2)>>2]+(1.0-+g[A>>2])*+g[C>>2]*(+g[(c[q>>2]|0)+((c[H>>2]|0)-(c[s>>2]|0)+1<<2)>>2]+ +g[(c[q>>2]|0)+((c[H>>2]|0)-(c[s>>2]|0)-1<<2)>>2])+(1.0-+g[A>>2])*+g[D>>2]*(+g[(c[q>>2]|0)+((c[H>>2]|0)-(c[s>>2]|0)+2<<2)>>2]+ +g[(c[q>>2]|0)+((c[H>>2]|0)-(c[s>>2]|0)-2<<2)>>2])+ +g[A>>2]*+g[E>>2]*+g[K>>2]+ +g[A>>2]*+g[F>>2]*(+g[J>>2]+ +g[L>>2])+ +g[A>>2]*+g[G>>2]*(+g[I>>2]+ +g[M>>2]);g[M>>2]=+g[L>>2];g[L>>2]=+g[K>>2];g[K>>2]=+g[J>>2];g[J>>2]=+g[I>>2];c[H>>2]=(c[H>>2]|0)+1}if(!(+g[w>>2]==0.0)){db((c[p>>2]|0)+(c[H>>2]<<2)|0,(c[q>>2]|0)+(c[H>>2]<<2)|0,c[t>>2]|0,(c[u>>2]|0)-(c[H>>2]|0)|0,+g[E>>2],+g[F>>2],+g[G>>2]);i=N;return}if((c[q>>2]|0)==(c[p>>2]|0)){i=N;return}qj((c[p>>2]|0)+(c[r>>2]<<2)|0,(c[q>>2]|0)+(c[r>>2]<<2)|0,((c[u>>2]|0)-(c[r>>2]|0)<<2)+0|0)|0;i=N;return}function db(a,b,d,e,f,h,j){a=a|0;b=b|0;d=d|0;e=e|0;f=+f;h=+h;j=+j;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;x=i;i=i+64|0;k=x+48|0;l=x+44|0;m=x+40|0;n=x+36|0;o=x+32|0;p=x+28|0;q=x+24|0;s=x+20|0;t=x+16|0;u=x+12|0;v=x+8|0;w=x+4|0;r=x;c[k>>2]=a;c[l>>2]=b;c[m>>2]=d;c[n>>2]=e;g[o>>2]=f;g[p>>2]=h;g[q>>2]=j;g[w>>2]=+g[(c[l>>2]|0)+(0-(c[m>>2]|0)-2<<2)>>2];g[v>>2]=+g[(c[l>>2]|0)+(0-(c[m>>2]|0)-1<<2)>>2];g[u>>2]=+g[(c[l>>2]|0)+(0-(c[m>>2]|0)<<2)>>2];g[t>>2]=+g[(c[l>>2]|0)+(0-(c[m>>2]|0)+1<<2)>>2];c[r>>2]=0;while(1){if((c[r>>2]|0)>=(c[n>>2]|0))break;g[s>>2]=+g[(c[l>>2]|0)+((c[r>>2]|0)-(c[m>>2]|0)+2<<2)>>2];g[(c[k>>2]|0)+(c[r>>2]<<2)>>2]=+g[(c[l>>2]|0)+(c[r>>2]<<2)>>2]+ +g[o>>2]*+g[u>>2]+ +g[p>>2]*(+g[t>>2]+ +g[v>>2])+ +g[q>>2]*(+g[s>>2]+ +g[w>>2]);g[w>>2]=+g[v>>2];g[v>>2]=+g[u>>2];g[u>>2]=+g[t>>2];g[t>>2]=+g[s>>2];c[r>>2]=(c[r>>2]|0)+1}i=x;return}function eb(a,e,f,g){a=a|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0;o=i;i=i+32|0;h=o+20|0;j=o+16|0;k=o+12|0;l=o+8|0;n=o+4|0;m=o;c[h>>2]=a;c[j>>2]=e;c[k>>2]=f;c[l>>2]=g;c[n>>2]=0;while(1){if((c[n>>2]|0)>=(c[(c[h>>2]|0)+8>>2]|0))break;c[m>>2]=(b[(c[(c[h>>2]|0)+32>>2]|0)+((c[n>>2]|0)+1<<1)>>1]|0)-(b[(c[(c[h>>2]|0)+32>>2]|0)+(c[n>>2]<<1)>>1]|0)<<c[k>>2];a=_(c[(c[h>>2]|0)+8>>2]|0,(c[k>>2]<<1)+(c[l>>2]|0)-1|0)|0;a=_((d[(c[(c[h>>2]|0)+92+12>>2]|0)+(a+(c[n>>2]|0))>>0]|0)+64|0,c[l>>2]|0)|0;a=(_(a,c[m>>2]|0)|0)>>2;c[(c[j>>2]|0)+(c[n>>2]<<2)>>2]=a;c[n>>2]=(c[n>>2]|0)+1}i=o;return}function fb(a){a=a|0;var b=0,d=0,e=0;e=i;i=i+16|0;b=e+4|0;d=e;c[d>>2]=a;if((c[d>>2]|0)>0|(c[d>>2]|0)<-7){c[b>>2]=25264;a=c[b>>2]|0;i=e;return a|0}else{c[b>>2]=c[164+(0-(c[d>>2]|0)<<2)>>2];a=c[b>>2]|0;i=e;return a|0}return 0}function gb(){return 25415}function hb(a){a=a|0;var b=0,d=0,e=0;b=i;i=i+16|0;d=b+4|0;e=b;c[d>>2]=a;c[e>>2]=Jc(48e3,960,0)|0;a=ib(c[e>>2]|0,c[d>>2]|0)|0;i=b;return a|0}function ib(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;e=i;i=i+16|0;f=e+8|0;g=e+4|0;d=e;c[f>>2]=a;c[g>>2]=b;a=204+((_(c[g>>2]|0,c[(c[f>>2]|0)+4>>2]|0)|0)-1<<2)|0;c[d>>2]=a+(c[g>>2]<<10<<2)+((_((c[g>>2]|0)*3|0,c[(c[f>>2]|0)+8>>2]|0)|0)<<2);i=e;return c[d>>2]|0}function jb(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0;k=i;i=i+32|0;f=k+20|0;g=k+16|0;h=k+12|0;m=k+8|0;l=k+4|0;j=k;c[g>>2]=a;c[h>>2]=b;c[m>>2]=d;c[l>>2]=e;b=c[g>>2]|0;a=Jc(48e3,960,0)|0;c[j>>2]=kb(b,a,c[m>>2]|0,c[l>>2]|0)|0;if(c[j>>2]|0){c[f>>2]=c[j>>2];m=c[f>>2]|0;i=k;return m|0}else{m=bb(c[h>>2]|0)|0;c[(c[g>>2]|0)+28>>2]=m;c[f>>2]=0;m=c[f>>2]|0;i=k;return m|0}return 0}function kb(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0;l=i;i=i+32|0;f=l+20|0;g=l+16|0;h=l+12|0;j=l+8|0;k=l+4|0;c[g>>2]=a;c[h>>2]=b;c[j>>2]=d;c[k>>2]=e;if((c[j>>2]|0)<0|(c[j>>2]|0)>2){c[f>>2]=-1;a=c[f>>2]|0;i=l;return a|0}if((c[g>>2]|0)==0|(c[h>>2]|0)==0){c[f>>2]=-7;a=c[f>>2]|0;i=l;return a|0}else{a=c[g>>2]|0;oj(a|0,0,ib(c[h>>2]|0,c[j>>2]|0)|0)|0;c[c[g>>2]>>2]=c[h>>2];a=c[j>>2]|0;c[(c[g>>2]|0)+4>>2]=a;c[(c[g>>2]|0)+8>>2]=a;c[(c[g>>2]|0)+28>>2]=1;c[(c[g>>2]|0)+32>>2]=0;c[(c[g>>2]|0)+36>>2]=c[(c[c[g>>2]>>2]|0)+12>>2];c[(c[g>>2]|0)+48>>2]=1;c[(c[g>>2]|0)+72>>2]=c[k>>2];c[(c[g>>2]|0)+52>>2]=1;c[(c[g>>2]|0)+16>>2]=1;c[(c[g>>2]|0)+40>>2]=-1;c[(c[g>>2]|0)+44>>2]=0;c[(c[g>>2]|0)+12>>2]=0;c[(c[g>>2]|0)+24>>2]=5;c[(c[g>>2]|0)+60>>2]=24;lb(c[g>>2]|0,4028,l)|0;c[f>>2]=0;a=c[f>>2]|0;i=l;return a|0}return 0}function lb(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0;F=i;i=i+128|0;E=F+112|0;C=F+108|0;G=F+104|0;e=F+88|0;m=F+84|0;n=F+80|0;v=F+76|0;w=F+72|0;x=F+68|0;y=F+64|0;z=F+60|0;D=F+56|0;A=F+52|0;B=F+48|0;o=F+44|0;p=F+40|0;f=F+36|0;j=F+32|0;k=F+28|0;l=F+24|0;q=F+20|0;h=F+16|0;r=F+12|0;s=F+8|0;t=F+4|0;u=F;c[C>>2]=a;c[G>>2]=b;c[e>>2]=d;do switch(c[G>>2]|0){case 4010:{D=(c[e>>2]|0)+(4-1)&~(4-1);G=c[D>>2]|0;c[e>>2]=D+4;c[m>>2]=G;if((c[m>>2]|0)<0|(c[m>>2]|0)>10)e=41;else{c[(c[C>>2]|0)+24>>2]=c[m>>2];e=40}break}case 10010:{D=(c[e>>2]|0)+(4-1)&~(4-1);G=c[D>>2]|0;c[e>>2]=D+4;c[n>>2]=G;if((c[n>>2]|0)>=0?(c[n>>2]|0)<(c[(c[c[C>>2]>>2]|0)+8>>2]|0):0){c[(c[C>>2]|0)+32>>2]=c[n>>2];e=40}else e=41;break}case 10012:{D=(c[e>>2]|0)+(4-1)&~(4-1);G=c[D>>2]|0;c[e>>2]=D+4;c[v>>2]=G;if((c[v>>2]|0)>=1?(c[v>>2]|0)<=(c[(c[c[C>>2]>>2]|0)+8>>2]|0):0){c[(c[C>>2]|0)+36>>2]=c[v>>2];e=40}else e=41;break}case 10002:{D=(c[e>>2]|0)+(4-1)&~(4-1);G=c[D>>2]|0;c[e>>2]=D+4;c[w>>2]=G;if((c[w>>2]|0)<0|(c[w>>2]|0)>2)e=41;else{c[(c[C>>2]|0)+20>>2]=(c[w>>2]|0)<=1&1;c[(c[C>>2]|0)+12>>2]=(c[w>>2]|0)==0&1;e=40}break}case 4014:{D=(c[e>>2]|0)+(4-1)&~(4-1);G=c[D>>2]|0;c[e>>2]=D+4;c[x>>2]=G;if((c[x>>2]|0)<0|(c[x>>2]|0)>100)e=41;else{c[(c[C>>2]|0)+56>>2]=c[x>>2];e=40}break}case 4020:{D=(c[e>>2]|0)+(4-1)&~(4-1);G=c[D>>2]|0;c[e>>2]=D+4;c[y>>2]=G;c[(c[C>>2]|0)+52>>2]=c[y>>2];e=40;break}case 4006:{D=(c[e>>2]|0)+(4-1)&~(4-1);G=c[D>>2]|0;c[e>>2]=D+4;c[z>>2]=G;c[(c[C>>2]|0)+44>>2]=c[z>>2];e=40;break}case 4002:{d=(c[e>>2]|0)+(4-1)&~(4-1);G=c[d>>2]|0;c[e>>2]=d+4;c[D>>2]=G;if((c[D>>2]|0)<=500&(c[D>>2]|0)!=-1)e=41;else{if((c[D>>2]|0)<((c[(c[C>>2]|0)+4>>2]|0)*26e4|0))e=c[D>>2]|0;else e=(c[(c[C>>2]|0)+4>>2]|0)*26e4|0;c[D>>2]=e;c[(c[C>>2]|0)+40>>2]=c[D>>2];e=40}break}case 10008:{D=(c[e>>2]|0)+(4-1)&~(4-1);G=c[D>>2]|0;c[e>>2]=D+4;c[A>>2]=G;if((c[A>>2]|0)<1|(c[A>>2]|0)>2)e=41;else{c[(c[C>>2]|0)+8>>2]=c[A>>2];e=40}break}case 4036:{D=(c[e>>2]|0)+(4-1)&~(4-1);G=c[D>>2]|0;c[e>>2]=D+4;c[B>>2]=G;if((c[B>>2]|0)<8|(c[B>>2]|0)>24)e=41;else{c[(c[C>>2]|0)+60>>2]=c[B>>2];e=40}break}case 4037:{D=(c[e>>2]|0)+(4-1)&~(4-1);G=c[D>>2]|0;c[e>>2]=D+4;c[o>>2]=G;c[c[o>>2]>>2]=c[(c[C>>2]|0)+60>>2];e=40;break}case 4040:{D=(c[e>>2]|0)+(4-1)&~(4-1);G=c[D>>2]|0;c[e>>2]=D+4;c[p>>2]=G;c[(c[C>>2]|0)+64>>2]=c[p>>2];e=40;break}case 4028:{c[j>>2]=(c[C>>2]|0)+200+((_(c[(c[C>>2]|0)+4>>2]|0,(c[(c[c[C>>2]>>2]|0)+4>>2]|0)+1024|0)|0)<<2);c[k>>2]=(c[j>>2]|0)+((_(c[(c[C>>2]|0)+4>>2]|0,c[(c[c[C>>2]>>2]|0)+8>>2]|0)|0)<<2);c[l>>2]=(c[k>>2]|0)+((_(c[(c[C>>2]|0)+4>>2]|0,c[(c[c[C>>2]>>2]|0)+8>>2]|0)|0)<<2);oj((c[C>>2]|0)+76|0,0,(ib(c[c[C>>2]>>2]|0,c[(c[C>>2]|0)+4>>2]|0)|0)-((c[C>>2]|0)+76-(c[C>>2]|0))|0)|0;c[f>>2]=0;while(1){if((c[f>>2]|0)>=(_(c[(c[C>>2]|0)+4>>2]|0,c[(c[c[C>>2]>>2]|0)+8>>2]|0)|0))break;g[(c[l>>2]|0)+(c[f>>2]<<2)>>2]=-28.0;g[(c[k>>2]|0)+(c[f>>2]<<2)>>2]=-28.0;c[f>>2]=(c[f>>2]|0)+1}c[(c[C>>2]|0)+172>>2]=0;g[(c[C>>2]|0)+84>>2]=1.0;c[(c[C>>2]|0)+80>>2]=2;c[(c[C>>2]|0)+88>>2]=256;c[(c[C>>2]|0)+96>>2]=0;c[(c[C>>2]|0)+100>>2]=0;e=40;break}case 10016:{D=(c[e>>2]|0)+(4-1)&~(4-1);G=c[D>>2]|0;c[e>>2]=D+4;c[q>>2]=G;c[(c[C>>2]|0)+48>>2]=c[q>>2];e=40;break}case 10022:{D=(c[e>>2]|0)+(4-1)&~(4-1);G=c[D>>2]|0;c[e>>2]=D+4;c[h>>2]=G;if(c[h>>2]|0){pj((c[C>>2]|0)+120|0,c[h>>2]|0,28|0)|0;e=40}else e=40;break}case 10015:{D=(c[e>>2]|0)+(4-1)&~(4-1);G=c[D>>2]|0;c[e>>2]=D+4;c[r>>2]=G;if(!(c[r>>2]|0))e=41;else{c[c[r>>2]>>2]=c[c[C>>2]>>2];e=40}break}case 4031:{D=(c[e>>2]|0)+(4-1)&~(4-1);G=c[D>>2]|0;c[e>>2]=D+4;c[s>>2]=G;if(!(c[s>>2]|0))e=41;else{c[c[s>>2]>>2]=c[(c[C>>2]|0)+76>>2];e=40}break}case 10024:{D=(c[e>>2]|0)+(4-1)&~(4-1);G=c[D>>2]|0;c[e>>2]=D+4;c[t>>2]=G;c[(c[C>>2]|0)+68>>2]=c[t>>2];e=40;break}case 10026:{D=(c[e>>2]|0)+(4-1)&~(4-1);G=c[D>>2]|0;c[e>>2]=D+4;c[u>>2]=G;c[(c[C>>2]|0)+192>>2]=c[u>>2];e=40;break}default:{c[E>>2]=-5;G=c[E>>2]|0;i=F;return G|0}}while(0);if((e|0)==40){c[E>>2]=0;G=c[E>>2]|0;i=F;return G|0}else if((e|0)==41){c[E>>2]=-1;G=c[E>>2]|0;i=F;return G|0}return 0}function mb(a,b,d,e,f,h,j,k){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;j=j|0;k=k|0;var l=0.0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0;z=i;i=i+64|0;m=z+52|0;q=z+48|0;r=z+44|0;n=z+40|0;s=z+36|0;A=z+32|0;t=z+28|0;o=z+24|0;w=z+20|0;v=z+16|0;x=z+12|0;u=z+8|0;p=z+4|0;y=z;c[m>>2]=a;c[q>>2]=b;c[r>>2]=d;c[n>>2]=e;c[s>>2]=f;c[A>>2]=h;c[t>>2]=j;c[o>>2]=k;g[v>>2]=+g[c[A>>2]>>2];g[x>>2]=+g[c[t>>2]>>2];if(!(((c[s>>2]|0)==1?+g[(c[A>>2]|0)+4>>2]==0.0:0)^1|(c[o>>2]|0)!=0)){c[w>>2]=0;while(1){if((c[w>>2]|0)>=(c[r>>2]|0))break;A=_(c[n>>2]|0,c[w>>2]|0)|0;g[p>>2]=+g[(c[m>>2]|0)+(A<<2)>>2]*32768.0;g[(c[q>>2]|0)+(c[w>>2]<<2)>>2]=+g[p>>2]-+g[x>>2];g[x>>2]=+g[v>>2]*+g[p>>2];c[w>>2]=(c[w>>2]|0)+1}g[c[t>>2]>>2]=+g[x>>2];i=z;return}c[u>>2]=(c[r>>2]|0)/(c[s>>2]|0)|0;if((c[s>>2]|0)!=1)oj(c[q>>2]|0,0,c[r>>2]<<2|0)|0;c[w>>2]=0;while(1){if((c[w>>2]|0)>=(c[u>>2]|0))break;p=_(c[n>>2]|0,c[w>>2]|0)|0;A=_(c[w>>2]|0,c[s>>2]|0)|0;g[(c[q>>2]|0)+(A<<2)>>2]=+g[(c[m>>2]|0)+(p<<2)>>2]*32768.0;c[w>>2]=(c[w>>2]|0)+1}a:do if(c[o>>2]|0){c[w>>2]=0;while(1){if((c[w>>2]|0)>=(c[u>>2]|0))break a;A=_(c[w>>2]|0,c[s>>2]|0)|0;if(65536.0<+g[(c[q>>2]|0)+(A<<2)>>2])l=65536.0;else{A=_(c[w>>2]|0,c[s>>2]|0)|0;l=+g[(c[q>>2]|0)+(A<<2)>>2]}if(!(-65536.0>l)){A=_(c[w>>2]|0,c[s>>2]|0)|0;if(65536.0<+g[(c[q>>2]|0)+(A<<2)>>2])l=65536.0;else{A=_(c[w>>2]|0,c[s>>2]|0)|0;l=+g[(c[q>>2]|0)+(A<<2)>>2]}}else l=-65536.0;A=_(c[w>>2]|0,c[s>>2]|0)|0;g[(c[q>>2]|0)+(A<<2)>>2]=l;c[w>>2]=(c[w>>2]|0)+1}}while(0);c[w>>2]=0;while(1){if((c[w>>2]|0)>=(c[r>>2]|0))break;g[y>>2]=+g[(c[q>>2]|0)+(c[w>>2]<<2)>>2];g[(c[q>>2]|0)+(c[w>>2]<<2)>>2]=+g[y>>2]-+g[x>>2];g[x>>2]=+g[v>>2]*+g[y>>2];c[w>>2]=(c[w>>2]|0)+1}g[c[t>>2]>>2]=+g[x>>2];i=z;return}function nb(a,d,e,f,h,j){a=a|0;d=d|0;e=e|0;f=f|0;h=h|0;j=j|0;var k=0,l=0.0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,$=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ja=0,ka=0,la=0,ma=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Ba=0,Da=0,Fa=0,Ga=0,Ha=0,Ja=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0,Xa=0,Ya=0,Za=0,_a=0,$a=0,ab=0,bb=0,cb=0,db=0,fb=0,gb=0,hb=0,ib=0,jb=0,kb=0,lb=0,nb=0,vb=0,yb=0;yb=i;i=i+448|0;gb=yb+440|0;hb=yb+436|0;s=yb+432|0;k=yb+428|0;o=yb+424|0;ib=yb+420|0;jb=yb+416|0;$a=yb+412|0;Za=yb+408|0;Ma=yb+404|0;Ga=yb+400|0;p=yb+352|0;y=yb+348|0;bb=yb+344|0;cb=yb+340|0;db=yb+336|0;Wa=yb+332|0;nb=yb+328|0;Ya=yb+324|0;Ja=yb+320|0;La=yb+316|0;T=yb+312|0;S=yb+308|0;xa=yb+304|0;wa=yb+300|0;fb=yb+296|0;_a=yb+292|0;U=yb+288|0;Qa=yb+284|0;P=yb+280|0;Fa=yb+276|0;Ua=yb+272|0;Sa=yb+268|0;Ra=yb+264|0;V=yb+260|0;X=yb+256|0;za=yb+252|0;fa=yb+248|0;ra=yb+244|0;Pa=yb+240|0;ma=yb+236|0;Va=yb+232|0;R=yb+228|0;Oa=yb+224|0;Na=yb+220|0;Xa=yb+216|0;O=yb+212|0;pa=yb+208|0;ka=yb+204|0;qa=yb+200|0;u=yb+196|0;ha=yb+192|0;Ta=yb+188|0;ab=yb+184|0;x=yb+180|0;Z=yb+176|0;M=yb+172|0;Ha=yb+168|0;vb=yb+164|0;la=yb+160|0;oa=yb+156|0;ea=yb+152|0;Ba=yb+148|0;m=yb+144|0;n=yb+140|0;q=yb+136|0;r=yb+132|0;kb=yb+128|0;t=yb+124|0;v=yb+120|0;z=yb+116|0;w=yb+112|0;I=yb+108|0;E=yb+104|0;C=yb+100|0;H=yb+96|0;G=yb+92|0;A=yb+88|0;B=yb+84|0;D=yb+80|0;F=yb+76|0;J=yb+72|0;K=yb+68|0;L=yb+64|0;N=yb+60|0;da=yb+56|0;ca=yb+52|0;Y=yb+48|0;W=yb+44|0;ba=yb+40|0;$=yb+36|0;ta=yb+32|0;ua=yb+28|0;ya=yb+24|0;ga=yb+20|0;ja=yb+16|0;va=yb+12|0;sa=yb+8|0;Da=yb+4|0;lb=yb;c[hb>>2]=a;c[s>>2]=d;c[k>>2]=e;c[o>>2]=f;c[ib>>2]=h;c[jb>>2]=j;c[Wa>>2]=0;c[nb>>2]=0;c[Ya>>2]=c[(c[hb>>2]|0)+4>>2];c[Ja>>2]=c[(c[hb>>2]|0)+8>>2];c[Ua>>2]=15;g[Sa>>2]=0.0;c[Ra>>2]=0;c[Va>>2]=0;c[Na>>2]=0;c[Xa>>2]=0;c[O>>2]=0;c[ka>>2]=0;c[vb>>2]=0;g[la>>2]=0.0;g[oa>>2]=0.0;g[ea>>2]=0.0;c[Ba>>2]=51e4;c[Ta>>2]=c[c[hb>>2]>>2];c[ab>>2]=c[(c[Ta>>2]|0)+8>>2];c[x>>2]=c[(c[Ta>>2]|0)+4>>2];c[Z>>2]=c[(c[Ta>>2]|0)+32>>2];c[fb>>2]=c[(c[hb>>2]|0)+32>>2];c[_a>>2]=c[(c[hb>>2]|0)+36>>2];g[pa>>2]=0.0;if((c[ib>>2]|0)<2|(c[s>>2]|0)==0){c[gb>>2]=-1;vb=c[gb>>2]|0;i=yb;return vb|0}c[k>>2]=_(c[k>>2]|0,c[(c[hb>>2]|0)+28>>2]|0)|0;c[La>>2]=0;while(1){if((c[La>>2]|0)>(c[(c[Ta>>2]|0)+36>>2]|0))break;if((c[(c[Ta>>2]|0)+44>>2]<<c[La>>2]|0)==(c[k>>2]|0))break;c[La>>2]=(c[La>>2]|0)+1}if((c[La>>2]|0)>(c[(c[Ta>>2]|0)+36>>2]|0)){c[gb>>2]=-1;vb=c[gb>>2]|0;i=yb;return vb|0}c[T>>2]=1<<c[La>>2];c[Ma>>2]=_(c[T>>2]|0,c[(c[Ta>>2]|0)+44>>2]|0)|0;c[y>>2]=(c[hb>>2]|0)+200+((_(c[Ya>>2]|0,c[x>>2]|0)|0)<<2);c[bb>>2]=(c[hb>>2]|0)+200+((_(c[Ya>>2]|0,(c[x>>2]|0)+1024|0)|0)<<2);c[cb>>2]=(c[bb>>2]|0)+((_(c[Ya>>2]|0,c[ab>>2]|0)|0)<<2);c[db>>2]=(c[cb>>2]|0)+((_(c[Ya>>2]|0,c[ab>>2]|0)|0)<<2);if(!(c[jb>>2]|0)){c[ma>>2]=1;c[xa>>2]=0}else{c[ma>>2]=ob(c[jb>>2]|0)|0;c[xa>>2]=(c[ma>>2]|0)+4>>3}c[ib>>2]=(c[ib>>2]|0)<1275?c[ib>>2]|0:1275;c[wa>>2]=(c[ib>>2]|0)-(c[xa>>2]|0);if(c[(c[hb>>2]|0)+44>>2]|0?(c[(c[hb>>2]|0)+40>>2]|0)!=-1:0){c[m>>2]=c[c[Ta>>2]>>2]>>3;n=_(c[(c[hb>>2]|0)+40>>2]|0,c[k>>2]|0)|0;c[za>>2]=(n+(c[m>>2]>>1)|0)/(c[m>>2]|0)|0;c[V>>2]=c[za>>2]>>6}else{c[za>>2]=0;c[n>>2]=_(c[(c[hb>>2]|0)+40>>2]|0,c[k>>2]|0)|0;if((c[ma>>2]|0)>1)c[n>>2]=(c[n>>2]|0)+(c[ma>>2]|0);if((c[(c[hb>>2]|0)+40>>2]|0)!=-1){if((c[ib>>2]|0)<((((c[n>>2]|0)+(c[c[Ta>>2]>>2]<<2)|0)/(c[c[Ta>>2]>>2]<<3|0)|0)-(((c[(c[hb>>2]|0)+48>>2]|0)!=0^1^1)&1)|0))k=c[ib>>2]|0;else k=(((c[n>>2]|0)+(c[c[Ta>>2]>>2]<<2)|0)/(c[c[Ta>>2]>>2]<<3|0)|0)-(((c[(c[hb>>2]|0)+48>>2]|0)!=0^1^1)&1)|0;do if(2<=(k|0))if((c[ib>>2]|0)<((((c[n>>2]|0)+(c[c[Ta>>2]>>2]<<2)|0)/(c[c[Ta>>2]>>2]<<3|0)|0)-(((c[(c[hb>>2]|0)+48>>2]|0)!=0^1^1)&1)|0)){k=c[ib>>2]|0;break}else{k=(((c[n>>2]|0)+(c[c[Ta>>2]>>2]<<2)|0)/(c[c[Ta>>2]>>2]<<3|0)|0)-(((c[(c[hb>>2]|0)+48>>2]|0)!=0^1^1)&1)|0;break}else k=2;while(0);c[ib>>2]=k}c[V>>2]=c[ib>>2]}if((c[(c[hb>>2]|0)+40>>2]|0)!=-1)c[Ba>>2]=(c[(c[hb>>2]|0)+40>>2]|0)-(_(((c[Ja>>2]|0)*40|0)+20|0,(400>>c[La>>2])-50|0)|0);if(!(c[jb>>2]|0)){ic(p,c[o>>2]|0,c[ib>>2]|0);c[jb>>2]=p}if((c[za>>2]|0)>0?c[(c[hb>>2]|0)+52>>2]|0:0){c[q>>2]=c[za>>2];if((((c[ma>>2]|0)==1?2:0)|0)>((c[za>>2]|0)+(c[q>>2]|0)-(c[(c[hb>>2]|0)+164>>2]|0)>>6|0))k=(c[ma>>2]|0)==1?2:0;else k=(c[za>>2]|0)+(c[q>>2]|0)-(c[(c[hb>>2]|0)+164>>2]|0)>>6;do if((k|0)<(c[wa>>2]|0))if((((c[ma>>2]|0)==1?2:0)|0)>((c[za>>2]|0)+(c[q>>2]|0)-(c[(c[hb>>2]|0)+164>>2]|0)>>6|0)){k=(c[ma>>2]|0)==1?2:0;break}else{k=(c[za>>2]|0)+(c[q>>2]|0)-(c[(c[hb>>2]|0)+164>>2]|0)>>6;break}else k=c[wa>>2]|0;while(0);c[r>>2]=k;if((c[r>>2]|0)<(c[wa>>2]|0)){c[ib>>2]=(c[xa>>2]|0)+(c[r>>2]|0);c[wa>>2]=c[r>>2];vc(c[jb>>2]|0,c[ib>>2]|0)}}c[fa>>2]=c[ib>>2]<<3;c[U>>2]=c[_a>>2];if((c[U>>2]|0)>(c[(c[Ta>>2]|0)+12>>2]|0))c[U>>2]=c[(c[Ta>>2]|0)+12>>2];r=_(c[Ya>>2]|0,(c[Ma>>2]|0)+(c[x>>2]|0)|0)|0;c[kb>>2]=ia()|0;e=i;i=i+((1*(r<<2)|0)+15&-16)|0;l=+g[(c[hb>>2]|0)+180>>2];r=_(c[Ja>>2]|0,(c[Ma>>2]|0)-(c[x>>2]|0)|0)|0;if(l>+pb(c[s>>2]|0,(r|0)/(c[(c[hb>>2]|0)+28>>2]|0)|0))l=+g[(c[hb>>2]|0)+180>>2];else{r=_(c[Ja>>2]|0,(c[Ma>>2]|0)-(c[x>>2]|0)|0)|0;l=+pb(c[s>>2]|0,(r|0)/(c[(c[hb>>2]|0)+28>>2]|0)|0)}g[u>>2]=l;q=_(c[Ja>>2]|0,(c[Ma>>2]|0)-(c[x>>2]|0)|0)|0;r=_(c[Ja>>2]|0,c[x>>2]|0)|0;l=+pb((c[s>>2]|0)+(((q|0)/(c[(c[hb>>2]|0)+28>>2]|0)|0)<<2)|0,(r|0)/(c[(c[hb>>2]|0)+28>>2]|0)|0);g[(c[hb>>2]|0)+180>>2]=l;if(+g[u>>2]>+g[(c[hb>>2]|0)+180>>2])l=+g[u>>2];else l=+g[(c[hb>>2]|0)+180>>2];g[u>>2]=l;c[Xa>>2]=+g[u>>2]<=1.0/+(1<<c[(c[hb>>2]|0)+60>>2]|0)&1;if((c[ma>>2]|0)==1)pc(c[jb>>2]|0,c[Xa>>2]|0,15);else c[Xa>>2]=0;if(c[Xa>>2]|0){if((c[za>>2]|0)>0){r=(c[ib>>2]|0)<((c[xa>>2]|0)+2|0)?c[ib>>2]|0:(c[xa>>2]|0)+2|0;c[ib>>2]=r;c[V>>2]=r;c[fa>>2]=c[ib>>2]<<3;c[wa>>2]=2;vc(c[jb>>2]|0,c[ib>>2]|0)}c[ma>>2]=c[ib>>2]<<3;q=c[ma>>2]|0;q=q-(ob(c[jb>>2]|0)|0)|0;r=(c[jb>>2]|0)+20|0;c[r>>2]=(c[r>>2]|0)+q}c[Za>>2]=0;do{c[t>>2]=0;c[t>>2]=(c[(c[hb>>2]|0)+16>>2]|0?+g[u>>2]>65536.0:0)&1;r=e+((_(c[Za>>2]|0,(c[Ma>>2]|0)+(c[x>>2]|0)|0)|0)<<2)|0;mb((c[s>>2]|0)+(c[Za>>2]<<2)|0,r+(c[x>>2]<<2)|0,c[Ma>>2]|0,c[Ya>>2]|0,c[(c[hb>>2]|0)+28>>2]|0,(c[Ta>>2]|0)+16|0,(c[hb>>2]|0)+148+(c[Za>>2]<<2)|0,c[t>>2]|0);r=(c[Za>>2]|0)+1|0;c[Za>>2]=r}while((r|0)<(c[Ya>>2]|0));if((c[wa>>2]|0)>3?(c[(c[hb>>2]|0)+68>>2]|0)!=0:0)if((c[fb>>2]|0)!=0|(c[Xa>>2]|0)!=0)k=0;else Q=63;else if(((c[fb>>2]|0)==0?(c[wa>>2]|0)>((c[Ja>>2]|0)*12|0):0)^1|(c[Xa>>2]|0)!=0)k=0;else Q=63;if((Q|0)==63)if(!(c[(c[hb>>2]|0)+20>>2]|0)?(c[(c[hb>>2]|0)+24>>2]|0)>=5:0){if((c[La>>2]|0)!=3?(c[(c[hb>>2]|0)+116>>2]|0)!=0:0)k=(c[(c[hb>>2]|0)+64>>2]|0)==5010;else k=0;k=k^1}else k=0;c[v>>2]=k&1;c[Va>>2]=c[(c[hb>>2]|0)+100>>2];c[R>>2]=qb(c[hb>>2]|0,e,c[y>>2]|0,c[Ya>>2]|0,c[Ma>>2]|0,c[Va>>2]|0,Ua,Sa,z,c[v>>2]|0,c[wa>>2]|0)|0;if(!(!(+g[Sa>>2]>.4000000059604645)?!(+g[(c[hb>>2]|0)+108>>2]>.4000000059604645):0))Q=70;do if((Q|0)==70){if(c[(c[hb>>2]|0)+120>>2]|0?!(+g[(c[hb>>2]|0)+120+4>>2]>.3):0)break;if(!(+(c[Ua>>2]|0)>+(c[(c[hb>>2]|0)+104>>2]|0)*1.26)?!(+(c[Ua>>2]|0)<+(c[(c[hb>>2]|0)+104>>2]|0)*.79):0)break;c[ka>>2]=1}while(0);if(!(c[R>>2]|0)){if((c[fb>>2]|0)==0?((c[ma>>2]|0)+16|0)<=(c[fa>>2]|0):0)pc(c[jb>>2]|0,0,1)}else{pc(c[jb>>2]|0,1,1);c[Ua>>2]=(c[Ua>>2]|0)+1;c[w>>2]=32-(aa(c[Ua>>2]|0)|0)-5;rc(c[jb>>2]|0,c[w>>2]|0,6);sc(c[jb>>2]|0,(c[Ua>>2]|0)-(16<<c[w>>2])|0,4+(c[w>>2]|0)|0);c[Ua>>2]=(c[Ua>>2]|0)-1;sc(c[jb>>2]|0,c[z>>2]|0,3);qc(c[jb>>2]|0,c[Va>>2]|0,25429,2)}c[nb>>2]=0;c[Wa>>2]=0;if((c[(c[hb>>2]|0)+24>>2]|0)>=1?(c[(c[hb>>2]|0)+68>>2]|0)==0:0)c[nb>>2]=rb(e,(c[Ma>>2]|0)+(c[x>>2]|0)|0,c[Ya>>2]|0,pa,O)|0;if((c[La>>2]|0)>0?(z=(ob(c[jb>>2]|0)|0)+3|0,(z|0)<=(c[fa>>2]|0)):0){if(c[nb>>2]|0)c[Wa>>2]=c[T>>2]}else{c[nb>>2]=0;c[vb>>2]=1}z=(_(c[Ya>>2]|0,c[Ma>>2]|0)|0)<<2;f=i;i=i+((1*z|0)+15&-16)|0;z=(_(c[ab>>2]|0,c[Ya>>2]|0)|0)<<2;p=i;i=i+((1*z|0)+15&-16)|0;z=(_(c[ab>>2]|0,c[Ya>>2]|0)|0)<<2;o=i;i=i+((1*z|0)+15&-16)|0;if(c[Wa>>2]|0)k=(c[(c[hb>>2]|0)+24>>2]|0)>=8;else k=0;c[M>>2]=k&1;z=(_(c[Ja>>2]|0,c[ab>>2]|0)|0)<<2;j=i;i=i+((1*z|0)+15&-16)|0;a:do if(c[M>>2]|0){sb(c[Ta>>2]|0,0,e,f,c[Ja>>2]|0,c[Ya>>2]|0,c[La>>2]|0,c[(c[hb>>2]|0)+28>>2]|0,c[(c[hb>>2]|0)+72>>2]|0);Ca(c[Ta>>2]|0,f,p,c[U>>2]|0,c[Ja>>2]|0,c[La>>2]|0);id(c[Ta>>2]|0,c[U>>2]|0,c[_a>>2]|0,p,j,c[Ja>>2]|0);c[$a>>2]=0;while(1){if((c[$a>>2]|0)>=(_(c[Ja>>2]|0,c[ab>>2]|0)|0))break a;z=j+(c[$a>>2]<<2)|0;g[z>>2]=+g[z>>2]+ +(c[La>>2]|0)*.5;c[$a>>2]=(c[$a>>2]|0)+1}}while(0);sb(c[Ta>>2]|0,c[Wa>>2]|0,e,f,c[Ja>>2]|0,c[Ya>>2]|0,c[La>>2]|0,c[(c[hb>>2]|0)+28>>2]|0,c[(c[hb>>2]|0)+72>>2]|0);if((c[Ya>>2]|0)==2&(c[Ja>>2]|0)==1)c[O>>2]=0;Ca(c[Ta>>2]|0,f,p,c[U>>2]|0,c[Ja>>2]|0,c[La>>2]|0);b:do if(c[(c[hb>>2]|0)+68>>2]|0){c[$a>>2]=2;while(1){if((c[$a>>2]|0)>=(c[_a>>2]|0))break b;if(+g[p+(c[$a>>2]<<2)>>2]<+g[p>>2]*9.999999747378752e-05)l=+g[p+(c[$a>>2]<<2)>>2];else l=+g[p>>2]*9.999999747378752e-05;g[p+(c[$a>>2]<<2)>>2]=l;if(+g[p+(c[$a>>2]<<2)>>2]>1.0000000036274937e-15)l=+g[p+(c[$a>>2]<<2)>>2];else l=1.0000000036274937e-15;g[p+(c[$a>>2]<<2)>>2]=l;c[$a>>2]=(c[$a>>2]|0)+1}}while(0);id(c[Ta>>2]|0,c[U>>2]|0,c[_a>>2]|0,p,o,c[Ja>>2]|0);z=(_(c[Ja>>2]|0,c[ab>>2]|0)|0)<<2;m=i;i=i+((1*z|0)+15&-16)|0;oj(m|0,0,c[_a>>2]<<2|0)|0;do if(!(c[fb>>2]|0)){if(!(c[(c[hb>>2]|0)+192>>2]|0))break;if(c[(c[hb>>2]|0)+68>>2]|0)break;g[H>>2]=0.0;g[G>>2]=0.0;c[A>>2]=0;if(2>(c[(c[hb>>2]|0)+92>>2]|0))k=2;else k=c[(c[hb>>2]|0)+92>>2]|0;c[I>>2]=k;c[Za>>2]=0;while(1){if((c[Za>>2]|0)>=(c[Ja>>2]|0))break;c[$a>>2]=0;while(1){if((c[$a>>2]|0)>=(c[I>>2]|0))break;z=_(c[ab>>2]|0,c[Za>>2]|0)|0;if(+g[(c[(c[hb>>2]|0)+192>>2]|0)+(z+(c[$a>>2]|0)<<2)>>2]<.25){z=_(c[ab>>2]|0,c[Za>>2]|0)|0;l=+g[(c[(c[hb>>2]|0)+192>>2]|0)+(z+(c[$a>>2]|0)<<2)>>2]}else l=.25;do if(l>-2.0){z=_(c[ab>>2]|0,c[Za>>2]|0)|0;if(!(+g[(c[(c[hb>>2]|0)+192>>2]|0)+(z+(c[$a>>2]|0)<<2)>>2]<.25)){l=.25;break}z=_(c[ab>>2]|0,c[Za>>2]|0)|0;l=+g[(c[(c[hb>>2]|0)+192>>2]|0)+(z+(c[$a>>2]|0)<<2)>>2]}else l=-2.0;while(0);g[B>>2]=l;if(+g[B>>2]>0.0)g[B>>2]=+g[B>>2]*.5;g[H>>2]=+g[H>>2]+ +g[B>>2]*+((b[(c[Z>>2]|0)+((c[$a>>2]|0)+1<<1)>>1]|0)-(b[(c[Z>>2]|0)+(c[$a>>2]<<1)>>1]|0)|0);c[A>>2]=(c[A>>2]|0)+((b[(c[Z>>2]|0)+((c[$a>>2]|0)+1<<1)>>1]|0)-(b[(c[Z>>2]|0)+(c[$a>>2]<<1)>>1]|0));g[G>>2]=+g[G>>2]+ +g[B>>2]*+(1+(c[$a>>2]<<1)-(c[I>>2]|0)|0);c[$a>>2]=(c[$a>>2]|0)+1}c[Za>>2]=(c[Za>>2]|0)+1}g[H>>2]=+g[H>>2]/+(c[A>>2]|0);g[H>>2]=+g[H>>2]+.20000000298023224;B=_(c[Ja>>2]|0,(c[I>>2]|0)-1|0)|0;B=_(B,(c[I>>2]|0)+1|0)|0;g[G>>2]=+g[G>>2]*6.0/+(_(B,c[I>>2]|0)|0);g[G>>2]=+g[G>>2]*.5;if((+g[G>>2]<.03099999949336052?+g[G>>2]:.03099999949336052)>-.03099999949336052)l=+g[G>>2]<.03099999949336052?+g[G>>2]:.03099999949336052;else l=-.03099999949336052;g[G>>2]=l;c[E>>2]=0;while(1){if((b[(c[Z>>2]|0)+((c[E>>2]|0)+1<<1)>>1]|0)>=((b[(c[Z>>2]|0)+(c[I>>2]<<1)>>1]|0)/2|0|0))break;c[E>>2]=(c[E>>2]|0)+1}c[C>>2]=0;c[$a>>2]=0;while(1){if((c[$a>>2]|0)>=(c[I>>2]|0))break;g[D>>2]=+g[H>>2]+ +g[G>>2]*+((c[$a>>2]|0)-(c[E>>2]|0)|0);l=+g[(c[(c[hb>>2]|0)+192>>2]|0)+(c[$a>>2]<<2)>>2];if((c[Ja>>2]|0)==2){if(l>+g[(c[(c[hb>>2]|0)+192>>2]|0)+((c[ab>>2]|0)+(c[$a>>2]|0)<<2)>>2])l=+g[(c[(c[hb>>2]|0)+192>>2]|0)+(c[$a>>2]<<2)>>2];else l=+g[(c[(c[hb>>2]|0)+192>>2]|0)+((c[ab>>2]|0)+(c[$a>>2]|0)<<2)>>2];g[F>>2]=l}else g[F>>2]=l;g[F>>2]=+g[F>>2]<0.0?+g[F>>2]:0.0;g[F>>2]=+g[F>>2]-+g[D>>2];if(+g[F>>2]>.25){g[m+(c[$a>>2]<<2)>>2]=+g[F>>2]-.25;c[C>>2]=(c[C>>2]|0)+1}c[$a>>2]=(c[$a>>2]|0)+1}c:do if((c[C>>2]|0)>=3){g[H>>2]=+g[H>>2]+.25;if(+g[H>>2]>0.0){g[H>>2]=0.0;g[G>>2]=0.0;oj(m|0,0,c[I>>2]<<2|0)|0;break}c[$a>>2]=0;while(1){if((c[$a>>2]|0)>=(c[I>>2]|0))break c;if(0.0>+g[m+(c[$a>>2]<<2)>>2]-.25)l=0.0;else l=+g[m+(c[$a>>2]<<2)>>2]-.25;g[m+(c[$a>>2]<<2)>>2]=l;c[$a>>2]=(c[$a>>2]|0)+1}}while(0);g[H>>2]=+g[H>>2]+.20000000298023224;g[ea>>2]=+g[G>>2]*64.0;g[la>>2]=+g[H>>2]}while(0);if(!(c[(c[hb>>2]|0)+68>>2]|0)){g[J>>2]=-10.0;g[K>>2]=0.0;if(c[Wa>>2]|0)l=+(c[La>>2]|0)*.5;else l=0.0;g[L>>2]=l;c[$a>>2]=c[fb>>2];while(1){if((c[$a>>2]|0)>=(c[_a>>2]|0))break;if(+g[J>>2]-1.0>+g[o+(c[$a>>2]<<2)>>2]-+g[L>>2])l=+g[J>>2]-1.0;else l=+g[o+(c[$a>>2]<<2)>>2]-+g[L>>2];g[J>>2]=l;if((c[Ja>>2]|0)==2){if(+g[J>>2]>+g[o+((c[$a>>2]|0)+(c[ab>>2]|0)<<2)>>2]-+g[L>>2])l=+g[J>>2];else l=+g[o+((c[$a>>2]|0)+(c[ab>>2]|0)<<2)>>2]-+g[L>>2];g[J>>2]=l}g[K>>2]=+g[K>>2]+ +g[J>>2];c[$a>>2]=(c[$a>>2]|0)+1}g[K>>2]=+g[K>>2]/+((c[_a>>2]|0)-(c[fb>>2]|0)|0);g[oa>>2]=+g[K>>2]-+g[(c[hb>>2]|0)+196>>2];if(3.0<(-1.5>+g[oa>>2]?-1.5:+g[oa>>2]))l=3.0;else l=-1.5>+g[oa>>2]?-1.5:+g[oa>>2];g[oa>>2]=l;L=(c[hb>>2]|0)+196|0;g[L>>2]=+g[L>>2]+ +g[oa>>2]*.019999999552965164}if(!(c[M>>2]|0)){M=(_(c[Ja>>2]|0,c[ab>>2]|0)|0)<<2;pj(j|0,o|0,M+0|0)|0}do if((c[La>>2]|0)>0){M=(ob(c[jb>>2]|0)|0)+3|0;if(c[nb>>2]|0?1:(M|0)>(c[fa>>2]|0))break;if((c[(c[hb>>2]|0)+24>>2]|0)<5)break;if(c[(c[hb>>2]|0)+68>>2]|0)break;if(!(tb(o,c[bb>>2]|0,c[ab>>2]|0,c[fb>>2]|0,c[_a>>2]|0,c[Ja>>2]|0)|0))break;c[nb>>2]=1;c[Wa>>2]=c[T>>2];sb(c[Ta>>2]|0,c[Wa>>2]|0,e,f,c[Ja>>2]|0,c[Ya>>2]|0,c[La>>2]|0,c[(c[hb>>2]|0)+28>>2]|0,c[(c[hb>>2]|0)+72>>2]|0);Ca(c[Ta>>2]|0,f,p,c[U>>2]|0,c[Ja>>2]|0,c[La>>2]|0);id(c[Ta>>2]|0,c[U>>2]|0,c[_a>>2]|0,p,o,c[Ja>>2]|0);c[$a>>2]=0;while(1){if((c[$a>>2]|0)>=(_(c[Ja>>2]|0,c[ab>>2]|0)|0))break;M=j+(c[$a>>2]<<2)|0;g[M>>2]=+g[M>>2]+ +(c[La>>2]|0)*.5;c[$a>>2]=(c[$a>>2]|0)+1}g[pa>>2]=.20000000298023224}while(0);do if((c[La>>2]|0)>0){M=(ob(c[jb>>2]|0)|0)+3|0;if((M|0)>(c[fa>>2]|0))break;pc(c[jb>>2]|0,c[nb>>2]|0,3)}while(0);a=(_(c[Ja>>2]|0,c[Ma>>2]|0)|0)<<2;n=i;i=i+((1*a|0)+15&-16)|0;Ea(c[Ta>>2]|0,f,n,p,c[U>>2]|0,c[Ja>>2]|0,c[T>>2]|0);a=i;i=i+((1*(c[ab>>2]<<2)|0)+15&-16)|0;d:do if((c[fb>>2]|0)==0?(c[V>>2]|0)>=((c[Ja>>2]|0)*15|0):0){if((c[(c[hb>>2]|0)+24>>2]|0)<2){Q=192;break}if(c[(c[hb>>2]|0)+68>>2]|0){Q=192;break}do if((c[V>>2]|0)>=40){if((c[V>>2]|0)<60){c[N>>2]=6;break}if((c[V>>2]|0)<100){c[N>>2]=4;break}else{c[N>>2]=3;break}}else c[N>>2]=12;while(0);c[N>>2]=c[N>>2]<<1;c[S>>2]=ub(c[Ta>>2]|0,c[U>>2]|0,c[nb>>2]|0,a,c[N>>2]|0,n,c[Ma>>2]|0,c[La>>2]|0,P,+g[pa>>2],c[O>>2]|0)|0;c[$a>>2]=c[U>>2];while(1){if((c[$a>>2]|0)>=(c[_a>>2]|0))break d;c[a+(c[$a>>2]<<2)>>2]=c[a+((c[U>>2]|0)-1<<2)>>2];c[$a>>2]=(c[$a>>2]|0)+1}}else Q=192;while(0);if((Q|0)==192){c[P>>2]=0;c[$a>>2]=0;while(1){if((c[$a>>2]|0)>=(c[_a>>2]|0))break;c[a+(c[$a>>2]<<2)>>2]=c[nb>>2];c[$a>>2]=(c[$a>>2]|0)+1}c[S>>2]=0}Q=(_(c[Ja>>2]|0,c[ab>>2]|0)|0)<<2;d=i;i=i+((1*Q|0)+15&-16)|0;Zc(c[Ta>>2]|0,c[fb>>2]|0,c[_a>>2]|0,c[U>>2]|0,o,c[bb>>2]|0,c[fa>>2]|0,d,c[jb>>2]|0,c[Ja>>2]|0,c[La>>2]|0,c[wa>>2]|0,c[(c[hb>>2]|0)+12>>2]|0,(c[hb>>2]|0)+84|0,(c[(c[hb>>2]|0)+24>>2]|0)>=4&1,c[(c[hb>>2]|0)+56>>2]|0,c[(c[hb>>2]|0)+68>>2]|0);wb(c[fb>>2]|0,c[_a>>2]|0,c[nb>>2]|0,a,c[La>>2]|0,c[S>>2]|0,c[jb>>2]|0);S=(ob(c[jb>>2]|0)|0)+4|0;if((S|0)<=(c[fa>>2]|0)){e:do if(!(c[(c[hb>>2]|0)+68>>2]|0)){do if(!(c[Wa>>2]|0)){if((c[(c[hb>>2]|0)+24>>2]|0)<3)break;if(c[fb>>2]|0?1:(c[wa>>2]|0)<((c[Ja>>2]|0)*10|0))break;if(c[R>>2]|0)k=(c[Wa>>2]|0)!=0^1;else k=0;U=Ia(c[Ta>>2]|0,n,(c[hb>>2]|0)+88|0,c[(c[hb>>2]|0)+80>>2]|0,(c[hb>>2]|0)+96|0,(c[hb>>2]|0)+100|0,k&1,c[U>>2]|0,c[Ja>>2]|0,c[T>>2]|0)|0;c[(c[hb>>2]|0)+80>>2]=U;break e}while(0);k=(c[hb>>2]|0)+80|0;if(!(c[(c[hb>>2]|0)+24>>2]|0)){c[k>>2]=0;break}else{c[k>>2]=2;break}}else{c[(c[hb>>2]|0)+100>>2]=0;c[(c[hb>>2]|0)+80>>2]=2}while(0);qc(c[jb>>2]|0,c[(c[hb>>2]|0)+80>>2]|0,25560,5)}h=i;i=i+((1*(c[ab>>2]<<2)|0)+15&-16)|0;g[ha>>2]=+xb(o,j,c[ab>>2]|0,c[fb>>2]|0,c[_a>>2]|0,c[Ja>>2]|0,h,c[(c[hb>>2]|0)+60>>2]|0,c[(c[Ta>>2]|0)+56>>2]|0,c[nb>>2]|0,c[(c[hb>>2]|0)+44>>2]|0,c[(c[hb>>2]|0)+52>>2]|0,c[Z>>2]|0,c[La>>2]|0,c[V>>2]|0,qa,c[(c[hb>>2]|0)+68>>2]|0,m);if(c[(c[hb>>2]|0)+68>>2]|0){if(8<((c[V>>2]|0)/3|0|0))k=8;else k=(c[V>>2]|0)/3|0;c[h>>2]=k}f=i;i=i+((1*(c[ab>>2]<<2)|0)+15&-16)|0;eb(c[Ta>>2]|0,f,c[La>>2]|0,c[Ja>>2]|0);c[X>>2]=6;c[fa>>2]=c[fa>>2]<<3;c[ra>>2]=0;c[ma>>2]=Xb(c[jb>>2]|0)|0;c[$a>>2]=c[fb>>2];while(1){k=c[Ja>>2]|0;if((c[$a>>2]|0)>=(c[_a>>2]|0))break;k=_(k,(b[(c[Z>>2]|0)+((c[$a>>2]|0)+1<<1)>>1]|0)-(b[(c[Z>>2]|0)+(c[$a>>2]<<1)>>1]|0)|0)|0;c[da>>2]=k<<c[La>>2];k=c[da>>2]|0;if((c[da>>2]<<3|0)<((48>(c[da>>2]|0)?48:c[da>>2]|0)|0))k=k<<3;else k=48>(k|0)?48:c[da>>2]|0;c[ca>>2]=k;c[Y>>2]=c[X>>2];c[W>>2]=0;c[ba>>2]=0;while(1){if(((c[ma>>2]|0)+(c[Y>>2]<<3)|0)>=((c[fa>>2]|0)-(c[ra>>2]|0)|0))break;if((c[W>>2]|0)>=(c[f+(c[$a>>2]<<2)>>2]|0))break;c[$>>2]=(c[ba>>2]|0)<(c[h+(c[$a>>2]<<2)>>2]|0)&1;pc(c[jb>>2]|0,c[$>>2]|0,c[Y>>2]|0);c[ma>>2]=Xb(c[jb>>2]|0)|0;if(!(c[$>>2]|0))break;c[W>>2]=(c[W>>2]|0)+(c[ca>>2]|0);c[ra>>2]=(c[ra>>2]|0)+(c[ca>>2]|0);c[Y>>2]=1;c[ba>>2]=(c[ba>>2]|0)+1}if(c[ba>>2]|0)c[X>>2]=2>((c[X>>2]|0)-1|0)?2:(c[X>>2]|0)-1|0;c[h+(c[$a>>2]<<2)>>2]=c[W>>2];c[$a>>2]=(c[$a>>2]|0)+1}if((k|0)==2){if(c[La>>2]|0)c[Ra>>2]=Ab(c[Ta>>2]|0,n,c[La>>2]|0,c[Ma>>2]|0)|0;da=Aa(+((c[Ba>>2]|0)/1e3|0|0),196,280,21,c[(c[hb>>2]|0)+188>>2]|0)|0;c[(c[hb>>2]|0)+188>>2]=da;if((c[fb>>2]|0)>(c[(c[hb>>2]|0)+188>>2]|0))k=c[fb>>2]|0;else k=c[(c[hb>>2]|0)+188>>2]|0;do if((c[_a>>2]|0)>=(k|0))if((c[fb>>2]|0)>(c[(c[hb>>2]|0)+188>>2]|0)){k=c[fb>>2]|0;break}else{k=c[(c[hb>>2]|0)+188>>2]|0;break}else k=c[_a>>2]|0;while(0);c[(c[hb>>2]|0)+188>>2]=k}c[Fa>>2]=5;if(((c[ma>>2]|0)+48|0)<=((c[fa>>2]|0)-(c[ra>>2]|0)|0)){if(c[(c[hb>>2]|0)+68>>2]|0)c[Fa>>2]=5;else c[Fa>>2]=Bb(c[Ta>>2]|0,n,o,c[_a>>2]|0,c[La>>2]|0,c[Ja>>2]|0,c[Ma>>2]|0,(c[hb>>2]|0)+120|0,(c[hb>>2]|0)+184|0,+g[pa>>2],c[(c[hb>>2]|0)+188>>2]|0,+g[ea>>2],c[(c[hb>>2]|0)+72>>2]|0)|0;qc(c[jb>>2]|0,c[Fa>>2]|0,25564,7);c[ma>>2]=Xb(c[jb>>2]|0)|0}if((c[za>>2]|0)>0){c[va>>2]=(c[(c[Ta>>2]|0)+36>>2]|0)-(c[La>>2]|0);if((c[ib>>2]|0)<(1275>>3-(c[La>>2]|0)|0))k=c[ib>>2]|0;else k=1275>>3-(c[La>>2]|0);c[ib>>2]=k;c[ga>>2]=(c[za>>2]|0)-(((c[Ja>>2]|0)*40|0)+20<<3);if(c[(c[hb>>2]|0)+52>>2]|0)c[ga>>2]=(c[ga>>2]|0)+(c[(c[hb>>2]|0)+172>>2]>>c[va>>2]);c[ya>>2]=Db(c[Ta>>2]|0,(c[hb>>2]|0)+120|0,c[ga>>2]|0,c[La>>2]|0,c[Ba>>2]|0,c[(c[hb>>2]|0)+92>>2]|0,c[Ja>>2]|0,c[(c[hb>>2]|0)+188>>2]|0,c[(c[hb>>2]|0)+52>>2]|0,+g[(c[hb>>2]|0)+184>>2],c[qa>>2]|0,+g[pa>>2],c[ka>>2]|0,+g[ha>>2],c[(c[hb>>2]|0)+64>>2]|0,c[(c[hb>>2]|0)+68>>2]|0,(c[(c[hb>>2]|0)+192>>2]|0)!=0&1,+g[la>>2],+g[oa>>2])|0;c[ya>>2]=(c[ya>>2]|0)+(c[ma>>2]|0);c[ja>>2]=((c[ma>>2]|0)+(c[ra>>2]|0)+64-1>>6)+2-(c[xa>>2]|0);c[wa>>2]=(c[ya>>2]|0)+32>>6;c[wa>>2]=(c[ja>>2]|0)>(c[wa>>2]|0)?c[ja>>2]|0:c[wa>>2]|0;if((c[ib>>2]|0)<((c[wa>>2]|0)+(c[xa>>2]|0)|0))k=c[ib>>2]|0;else k=(c[wa>>2]|0)+(c[xa>>2]|0)|0;c[wa>>2]=k-(c[xa>>2]|0);c[ua>>2]=(c[ya>>2]|0)-(c[za>>2]|0);c[ya>>2]=c[wa>>2]<<6;if(c[Xa>>2]|0){c[wa>>2]=2;c[ya>>2]=128;c[ua>>2]=0}if((c[(c[hb>>2]|0)+176>>2]|0)<970){ra=(c[hb>>2]|0)+176|0;c[ra>>2]=(c[ra>>2]|0)+1;g[ta>>2]=1.0/+((c[(c[hb>>2]|0)+176>>2]|0)+20|0)}else g[ta>>2]=1.0000000474974513e-03;if(c[(c[hb>>2]|0)+52>>2]|0){ra=(c[hb>>2]|0)+164|0;c[ra>>2]=(c[ra>>2]|0)+((c[ya>>2]|0)-(c[za>>2]|0))}if(c[(c[hb>>2]|0)+52>>2]|0){ya=_(c[ua>>2]|0,1<<c[va>>2])|0;za=(c[hb>>2]|0)+168|0;c[za>>2]=(c[za>>2]|0)+~~(+g[ta>>2]*+(ya-(c[(c[hb>>2]|0)+172>>2]|0)-(c[(c[hb>>2]|0)+168>>2]|0)|0));c[(c[hb>>2]|0)+172>>2]=0-(c[(c[hb>>2]|0)+168>>2]|0)}do if(c[(c[hb>>2]|0)+52>>2]|0){if((c[(c[hb>>2]|0)+164>>2]|0)>=0)break;c[sa>>2]=(0-(c[(c[hb>>2]|0)+164>>2]|0)|0)/64|0;c[wa>>2]=(c[wa>>2]|0)+(c[Xa>>2]|0?0:c[sa>>2]|0);c[(c[hb>>2]|0)+164>>2]=0}while(0);if((c[ib>>2]|0)<((c[wa>>2]|0)+(c[xa>>2]|0)|0))k=c[ib>>2]|0;else k=(c[wa>>2]|0)+(c[xa>>2]|0)|0;c[ib>>2]=k;vc(c[jb>>2]|0,c[ib>>2]|0)}m=i;i=i+((1*(c[ab>>2]<<2)|0)+15&-16)|0;j=i;i=i+((1*(c[ab>>2]<<2)|0)+15&-16)|0;e=i;i=i+((1*(c[ab>>2]<<2)|0)+15&-16)|0;za=c[ib>>2]<<3<<3;c[Ga>>2]=za-(Xb(c[jb>>2]|0)|0)-1;if((c[nb>>2]|0)!=0&(c[La>>2]|0)>=2)k=(c[Ga>>2]|0)>=((c[La>>2]|0)+2<<3|0);else k=0;c[Oa>>2]=k?8:0;c[Ga>>2]=(c[Ga>>2]|0)-(c[Oa>>2]|0);c[Ha>>2]=(c[_a>>2]|0)-1;if(c[(c[hb>>2]|0)+120>>2]|0){do if((c[Ba>>2]|0)>=((c[Ja>>2]|0)*32e3|0)){if((c[Ba>>2]|0)<((c[Ja>>2]|0)*48e3|0)){c[Da>>2]=16;break}if((c[Ba>>2]|0)<((c[Ja>>2]|0)*6e4|0)){c[Da>>2]=18;break}if((c[Ba>>2]|0)<((c[Ja>>2]|0)*8e4|0)){c[Da>>2]=19;break}else{c[Da>>2]=20;break}}else c[Da>>2]=13;while(0);if((c[(c[hb>>2]|0)+120+24>>2]|0)>(c[Da>>2]|0))k=c[(c[hb>>2]|0)+120+24>>2]|0;else k=c[Da>>2]|0;c[Ha>>2]=k}if(c[(c[hb>>2]|0)+68>>2]|0)c[Ha>>2]=1;c[Qa>>2]=jd(c[Ta>>2]|0,c[fb>>2]|0,c[_a>>2]|0,h,f,c[Fa>>2]|0,(c[hb>>2]|0)+188|0,Ra,c[Ga>>2]|0,Pa,j,m,e,c[Ja>>2]|0,c[La>>2]|0,c[jb>>2]|0,1,c[(c[hb>>2]|0)+92>>2]|0,c[Ha>>2]|0)|0;if(c[(c[hb>>2]|0)+92>>2]|0){if(((c[(c[hb>>2]|0)+92>>2]|0)-1|0)>(c[Qa>>2]|0))k=(c[(c[hb>>2]|0)+92>>2]|0)-1|0;else k=c[Qa>>2]|0;f=c[(c[hb>>2]|0)+92>>2]|0;do if(((c[(c[hb>>2]|0)+92>>2]|0)+1|0)>=(k|0))if((f-1|0)>(c[Qa>>2]|0)){k=(c[(c[hb>>2]|0)+92>>2]|0)-1|0;break}else{k=c[Qa>>2]|0;break}else k=f+1|0;while(0);c[(c[hb>>2]|0)+92>>2]=k}else c[(c[hb>>2]|0)+92>>2]=c[Qa>>2];dd(c[Ta>>2]|0,c[fb>>2]|0,c[_a>>2]|0,c[bb>>2]|0,d,m,c[jb>>2]|0,c[Ja>>2]|0);Ga=_(c[Ja>>2]|0,c[ab>>2]|0)|0;Ha=i;i=i+((1*Ga|0)+15&-16)|0;Ka(1,c[Ta>>2]|0,c[fb>>2]|0,c[_a>>2]|0,n,(c[Ja>>2]|0)==2?n+(c[Ma>>2]<<2)|0:0,Ha,p,j,c[Wa>>2]|0,c[(c[hb>>2]|0)+80>>2]|0,c[Ra>>2]|0,c[(c[hb>>2]|0)+188>>2]|0,a,(c[ib>>2]<<6)-(c[Oa>>2]|0)|0,c[Pa>>2]|0,c[jb>>2]|0,c[La>>2]|0,c[Qa>>2]|0,(c[hb>>2]|0)+76|0,c[(c[hb>>2]|0)+72>>2]|0);if((c[Oa>>2]|0)>0){c[Na>>2]=(c[(c[hb>>2]|0)+116>>2]|0)<2&1;sc(c[jb>>2]|0,c[Na>>2]|0,1)}Pa=c[Ta>>2]|0;Qa=c[fb>>2]|0;Ra=c[_a>>2]|0;Ta=c[bb>>2]|0;Wa=c[ib>>2]<<3;Wa=Wa-(ob(c[jb>>2]|0)|0)|0;ed(Pa,Qa,Ra,Ta,d,m,e,Wa,c[jb>>2]|0,c[Ja>>2]|0);f:do if(c[Xa>>2]|0){c[$a>>2]=0;while(1){if((c[$a>>2]|0)>=(_(c[Ja>>2]|0,c[ab>>2]|0)|0))break f;g[(c[bb>>2]|0)+(c[$a>>2]<<2)>>2]=-28.0;c[$a>>2]=(c[$a>>2]|0)+1}}while(0);c[(c[hb>>2]|0)+104>>2]=c[Ua>>2];g[(c[hb>>2]|0)+108>>2]=+g[Sa>>2];c[(c[hb>>2]|0)+112>>2]=c[Va>>2];if((c[Ya>>2]|0)==2&(c[Ja>>2]|0)==1)pj((c[bb>>2]|0)+(c[ab>>2]<<2)|0,c[bb>>2]|0,(c[ab>>2]<<2)+0|0)|0;g:do if(c[nb>>2]|0){c[$a>>2]=0;while(1){if((c[$a>>2]|0)>=(_(c[Ya>>2]|0,c[ab>>2]|0)|0))break g;k=c[$a>>2]|0;if(+g[(c[cb>>2]|0)+(c[$a>>2]<<2)>>2]<+g[(c[bb>>2]|0)+(c[$a>>2]<<2)>>2])l=+g[(c[cb>>2]|0)+(k<<2)>>2];else l=+g[(c[bb>>2]|0)+(k<<2)>>2];g[(c[cb>>2]|0)+(c[$a>>2]<<2)>>2]=l;c[$a>>2]=(c[$a>>2]|0)+1}}else{Xa=(_(c[Ya>>2]|0,c[ab>>2]|0)|0)<<2;pj(c[db>>2]|0,c[cb>>2]|0,Xa+0|0)|0;Xa=(_(c[Ya>>2]|0,c[ab>>2]|0)|0)<<2;pj(c[cb>>2]|0,c[bb>>2]|0,Xa+0|0)|0}while(0);c[Za>>2]=0;do{c[$a>>2]=0;while(1){if((c[$a>>2]|0)>=(c[fb>>2]|0))break;Xa=_(c[Za>>2]|0,c[ab>>2]|0)|0;g[(c[bb>>2]|0)+(Xa+(c[$a>>2]|0)<<2)>>2]=0.0;Xa=_(c[Za>>2]|0,c[ab>>2]|0)|0;g[(c[db>>2]|0)+(Xa+(c[$a>>2]|0)<<2)>>2]=-28.0;Xa=_(c[Za>>2]|0,c[ab>>2]|0)|0;g[(c[cb>>2]|0)+(Xa+(c[$a>>2]|0)<<2)>>2]=-28.0;c[$a>>2]=(c[$a>>2]|0)+1}c[$a>>2]=c[_a>>2];while(1){k=c[Za>>2]|0;if((c[$a>>2]|0)>=(c[ab>>2]|0))break;Xa=_(k,c[ab>>2]|0)|0;g[(c[bb>>2]|0)+(Xa+(c[$a>>2]|0)<<2)>>2]=0.0;Xa=_(c[Za>>2]|0,c[ab>>2]|0)|0;g[(c[db>>2]|0)+(Xa+(c[$a>>2]|0)<<2)>>2]=-28.0;Xa=_(c[Za>>2]|0,c[ab>>2]|0)|0;g[(c[cb>>2]|0)+(Xa+(c[$a>>2]|0)<<2)>>2]=-28.0;c[$a>>2]=(c[$a>>2]|0)+1}Xa=k+1|0;c[Za>>2]=Xa}while((Xa|0)<(c[Ya>>2]|0));k=(c[hb>>2]|0)+116|0;if((c[nb>>2]|0)!=0|(c[vb>>2]|0)!=0)c[k>>2]=(c[k>>2]|0)+1;else c[k>>2]=0;c[(c[hb>>2]|0)+76>>2]=c[(c[jb>>2]|0)+28>>2];wc(c[jb>>2]|0);if(Eb(c[jb>>2]|0)|0){c[gb>>2]=-3;c[lb>>2]=1}else{c[gb>>2]=c[ib>>2];c[lb>>2]=1}na(c[kb>>2]|0);vb=c[gb>>2]|0;i=yb;return vb|0}function ob(a){a=a|0;var b=0,d=0;b=i;i=i+16|0;d=b;c[d>>2]=a;a=(c[(c[d>>2]|0)+20>>2]|0)-(32-(aa(c[(c[d>>2]|0)+28>>2]|0)|0))|0;i=b;return a|0}function pb(a,b){a=a|0;b=b|0;var d=0.0,e=0,f=0,h=0,j=0,k=0,l=0;l=i;i=i+32|0;e=l+16|0;f=l+12|0;h=l+8|0;j=l+4|0;k=l;c[e>>2]=a;c[f>>2]=b;g[j>>2]=0.0;g[k>>2]=0.0;c[h>>2]=0;while(1){d=+g[j>>2];if((c[h>>2]|0)>=(c[f>>2]|0))break;if(d>+g[(c[e>>2]|0)+(c[h>>2]<<2)>>2])d=+g[j>>2];else d=+g[(c[e>>2]|0)+(c[h>>2]<<2)>>2];g[j>>2]=d;if(+g[k>>2]<+g[(c[e>>2]|0)+(c[h>>2]<<2)>>2])d=+g[k>>2];else d=+g[(c[e>>2]|0)+(c[h>>2]<<2)>>2];g[k>>2]=d;c[h>>2]=(c[h>>2]|0)+1}i=l;return +(d>-+g[k>>2]?+g[j>>2]:-+g[k>>2])}function qb(a,b,d,e,f,h,j,k,l,m,n){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;j=j|0;k=k|0;l=l|0;m=m|0;n=n|0;var o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0;L=i;i=i+96|0;s=L+92|0;t=L+88|0;v=L+84|0;w=L+80|0;x=L+76|0;y=L+72|0;z=L+68|0;A=L+64|0;B=L+60|0;q=L+56|0;o=L+52|0;C=L+48|0;J=L+40|0;E=L+36|0;I=L+32|0;D=L+28|0;r=L+24|0;H=L+20|0;K=L+16|0;G=L+12|0;u=L+8|0;p=L+4|0;F=L;c[s>>2]=a;c[t>>2]=b;c[v>>2]=d;c[w>>2]=e;c[x>>2]=f;c[y>>2]=h;c[z>>2]=j;c[A>>2]=k;c[B>>2]=l;c[q>>2]=m;c[o>>2]=n;c[E>>2]=c[c[s>>2]>>2];c[G>>2]=c[(c[E>>2]|0)+4>>2];l=_(c[w>>2]|0,(c[x>>2]|0)+1024|0)|0;c[u>>2]=ia()|0;a=i;i=i+((1*(l<<2)|0)+15&-16)|0;c[J>>2]=a;c[J+4>>2]=a+((c[x>>2]|0)+1024<<2);c[C>>2]=0;do{pj(c[J+(c[C>>2]<<2)>>2]|0,(c[v>>2]|0)+(c[C>>2]<<10<<2)|0,4096|0)|0;a=(c[t>>2]|0)+((_(c[C>>2]|0,(c[x>>2]|0)+(c[G>>2]|0)|0)|0)<<2)|0;pj((c[J+(c[C>>2]<<2)>>2]|0)+4096|0,a+(c[G>>2]<<2)|0,(c[x>>2]<<2)+0|0)|0;a=(c[C>>2]|0)+1|0;c[C>>2]=a}while((a|0)<(c[w>>2]|0));if(c[q>>2]|0){l=1024+(c[x>>2]|0)>>1;c[p>>2]=ia()|0;a=i;i=i+((1*(l<<2)|0)+15&-16)|0;Kc(J,a,1024+(c[x>>2]|0)|0,c[w>>2]|0,c[(c[s>>2]|0)+72>>2]|0);Pc(a+2048|0,a,c[x>>2]|0,979,I,c[(c[s>>2]|0)+72>>2]|0);c[I>>2]=1024-(c[I>>2]|0);g[D>>2]=+Rc(a,1024,15,c[x>>2]|0,I,c[(c[s>>2]|0)+104>>2]|0,+g[(c[s>>2]|0)+108>>2],c[(c[s>>2]|0)+72>>2]|0);if((c[I>>2]|0)>1022)c[I>>2]=1022;g[D>>2]=+g[D>>2]*.699999988079071;if((c[(c[s>>2]|0)+56>>2]|0)>2)g[D>>2]=+g[D>>2]*.5;if((c[(c[s>>2]|0)+56>>2]|0)>4)g[D>>2]=+g[D>>2]*.5;if((c[(c[s>>2]|0)+56>>2]|0)>8)g[D>>2]=0.0;na(c[p>>2]|0)}else{g[D>>2]=0.0;c[I>>2]=15}g[r>>2]=.20000000298023224;a=(N((c[I>>2]|0)-(c[(c[s>>2]|0)+104>>2]|0)|0)|0)*10|0;if((a|0)>(c[I>>2]|0))g[r>>2]=+g[r>>2]+.20000000298023224;if((c[o>>2]|0)<25)g[r>>2]=+g[r>>2]+.10000000149011612;if((c[o>>2]|0)<35)g[r>>2]=+g[r>>2]+.10000000149011612;if(+g[(c[s>>2]|0)+108>>2]>.4000000059604645)g[r>>2]=+g[r>>2]-.10000000149011612;if(+g[(c[s>>2]|0)+108>>2]>.550000011920929)g[r>>2]=+g[r>>2]-.10000000149011612;g[r>>2]=+g[r>>2]>.20000000298023224?+g[r>>2]:.20000000298023224;if(+g[D>>2]<+g[r>>2]){g[D>>2]=0.0;c[H>>2]=0;c[K>>2]=0}else{if(+N(+(+g[D>>2]-+g[(c[s>>2]|0)+108>>2]))<.10000000149011612)g[D>>2]=+g[(c[s>>2]|0)+108>>2];c[K>>2]=~~+M(+(+g[D>>2]*32.0/3.0+.5))-1;if(0>((7<(c[K>>2]|0)?7:c[K>>2]|0)|0))o=0;else o=7<(c[K>>2]|0)?7:c[K>>2]|0;c[K>>2]=o;g[D>>2]=+((c[K>>2]|0)+1|0)*.09375;c[H>>2]=1}c[C>>2]=0;do{c[F>>2]=(c[(c[E>>2]|0)+44>>2]|0)-(c[G>>2]|0);if((c[(c[s>>2]|0)+104>>2]|0)>15)o=c[(c[s>>2]|0)+104>>2]|0;else o=15;c[(c[s>>2]|0)+104>>2]=o;l=(c[t>>2]|0)+((_(c[C>>2]|0,(c[x>>2]|0)+(c[G>>2]|0)|0)|0)<<2)|0;a=(c[s>>2]|0)+200+((_(c[C>>2]|0,c[G>>2]|0)|0)<<2)|0;pj(l|0,a|0,(c[G>>2]<<2)+0|0)|0;if(c[F>>2]|0){a=(c[t>>2]|0)+((_(c[C>>2]|0,(c[x>>2]|0)+(c[G>>2]|0)|0)|0)<<2)|0;cb(a+(c[G>>2]<<2)|0,(c[J+(c[C>>2]<<2)>>2]|0)+4096|0,c[(c[s>>2]|0)+104>>2]|0,c[(c[s>>2]|0)+104>>2]|0,c[F>>2]|0,-+g[(c[s>>2]|0)+108>>2],-+g[(c[s>>2]|0)+108>>2],c[(c[s>>2]|0)+112>>2]|0,c[(c[s>>2]|0)+112>>2]|0,0,0,c[(c[s>>2]|0)+72>>2]|0)}a=(c[t>>2]|0)+((_(c[C>>2]|0,(c[x>>2]|0)+(c[G>>2]|0)|0)|0)<<2)|0;cb(a+(c[G>>2]<<2)+(c[F>>2]<<2)|0,(c[J+(c[C>>2]<<2)>>2]|0)+4096+(c[F>>2]<<2)|0,c[(c[s>>2]|0)+104>>2]|0,c[I>>2]|0,(c[x>>2]|0)-(c[F>>2]|0)|0,-+g[(c[s>>2]|0)+108>>2],-+g[D>>2],c[(c[s>>2]|0)+112>>2]|0,c[y>>2]|0,c[(c[E>>2]|0)+60>>2]|0,c[G>>2]|0,c[(c[s>>2]|0)+72>>2]|0);a=(c[s>>2]|0)+200+((_(c[C>>2]|0,c[G>>2]|0)|0)<<2)|0;o=(c[t>>2]|0)+((_(c[C>>2]|0,(c[x>>2]|0)+(c[G>>2]|0)|0)|0)<<2)|0;pj(a|0,o+(c[x>>2]<<2)|0,(c[G>>2]<<2)+0|0)|0;o=(c[v>>2]|0)+(c[C>>2]<<10<<2)|0;if((c[x>>2]|0)>1024)qj(o|0,(c[J+(c[C>>2]<<2)>>2]|0)+(c[x>>2]<<2)|0,4096|0)|0;else{qj(o|0,(c[v>>2]|0)+(c[C>>2]<<10<<2)+(c[x>>2]<<2)|0,(1024-(c[x>>2]|0)<<2)+0|0)|0;qj((c[v>>2]|0)+(c[C>>2]<<10<<2)+4096+(0-(c[x>>2]|0)<<2)|0,(c[J+(c[C>>2]<<2)>>2]|0)+4096|0,(c[x>>2]<<2)+0|0)|0}a=(c[C>>2]|0)+1|0;c[C>>2]=a}while((a|0)<(c[w>>2]|0));g[c[A>>2]>>2]=+g[D>>2];c[c[z>>2]>>2]=c[I>>2];c[c[B>>2]>>2]=c[K>>2];K=c[H>>2]|0;na(c[u>>2]|0);i=L;return K|0}function rb(a,b,e,f,h){a=a|0;b=b|0;e=e|0;f=f|0;h=h|0;var j=0.0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0;G=i;i=i+96|0;k=G+84|0;l=G+80|0;m=G+76|0;C=G+72|0;n=G+68|0;p=G+64|0;v=G+60|0;w=G+56|0;E=G+52|0;s=G+48|0;o=G+44|0;F=G+40|0;r=G+36|0;D=G+32|0;u=G+28|0;y=G+24|0;x=G+20|0;t=G+16|0;z=G+12|0;B=G+8|0;A=G+4|0;q=G;c[k>>2]=a;c[l>>2]=b;c[m>>2]=e;c[C>>2]=f;c[n>>2]=h;c[E>>2]=0;c[s>>2]=0;f=c[l>>2]|0;c[D>>2]=ia()|0;b=i;i=i+((1*(f<<2)|0)+15&-16)|0;c[r>>2]=(c[l>>2]|0)/2|0;c[o>>2]=0;while(1){if((c[o>>2]|0)>=(c[m>>2]|0))break;c[y>>2]=0;g[v>>2]=0.0;g[w>>2]=0.0;c[p>>2]=0;while(1){if((c[p>>2]|0)>=(c[l>>2]|0))break;f=(c[p>>2]|0)+(_(c[o>>2]|0,c[l>>2]|0)|0)|0;g[z>>2]=+g[(c[k>>2]|0)+(f<<2)>>2];g[B>>2]=+g[v>>2]+ +g[z>>2];g[v>>2]=+g[w>>2]+ +g[B>>2]-+g[z>>2]*2.0;g[w>>2]=+g[z>>2]-+g[B>>2]*.5;g[b+(c[p>>2]<<2)>>2]=+g[B>>2];c[p>>2]=(c[p>>2]|0)+1}e=b;a=e+48|0;do{c[e>>2]=0;e=e+4|0}while((e|0)<(a|0));g[u>>2]=0.0;g[v>>2]=0.0;c[p>>2]=0;while(1){if((c[p>>2]|0)>=(c[r>>2]|0))break;g[A>>2]=+g[b+(c[p>>2]<<1<<2)>>2]*+g[b+(c[p>>2]<<1<<2)>>2]+ +g[b+((c[p>>2]<<1)+1<<2)>>2]*+g[b+((c[p>>2]<<1)+1<<2)>>2];g[u>>2]=+g[u>>2]+ +g[A>>2];g[b+(c[p>>2]<<2)>>2]=+g[v>>2]+(+g[A>>2]-+g[v>>2])*.0625;g[v>>2]=+g[b+(c[p>>2]<<2)>>2];c[p>>2]=(c[p>>2]|0)+1}g[v>>2]=0.0;g[t>>2]=0.0;c[p>>2]=(c[r>>2]|0)-1;while(1){if((c[p>>2]|0)<0)break;g[b+(c[p>>2]<<2)>>2]=+g[v>>2]+(+g[b+(c[p>>2]<<2)>>2]-+g[v>>2])*.125;g[v>>2]=+g[b+(c[p>>2]<<2)>>2];g[t>>2]=+g[t>>2]>+g[v>>2]?+g[t>>2]:+g[v>>2];c[p>>2]=(c[p>>2]|0)+-1}g[u>>2]=+O(+(+g[u>>2]*+g[t>>2]*.5*+(c[r>>2]|0)));g[x>>2]=+(c[r>>2]|0)/(+g[u>>2]+1.0000000036274937e-15);c[y>>2]=0;c[p>>2]=12;while(1){if((c[p>>2]|0)>=((c[r>>2]|0)-5|0))break;if(127.0<+M(+(+g[x>>2]*64.0*(+g[b+(c[p>>2]<<2)>>2]+1.0000000036274937e-15))))j=127.0;else j=+M(+(+g[x>>2]*64.0*(+g[b+(c[p>>2]<<2)>>2]+1.0000000036274937e-15)));if(!(0.0>j))if(127.0<+M(+(+g[x>>2]*64.0*(+g[b+(c[p>>2]<<2)>>2]+1.0000000036274937e-15))))j=127.0;else j=+M(+(+g[x>>2]*64.0*(+g[b+(c[p>>2]<<2)>>2]+1.0000000036274937e-15)));else j=0.0;c[q>>2]=~~j;c[y>>2]=(c[y>>2]|0)+(d[25432+(c[q>>2]|0)>>0]|0);c[p>>2]=(c[p>>2]|0)+4}c[y>>2]=(c[y>>2]<<6<<2|0)/(((c[r>>2]|0)-17|0)*6|0)|0;if((c[y>>2]|0)>(c[s>>2]|0)){c[c[n>>2]>>2]=c[o>>2];c[s>>2]=c[y>>2]}c[o>>2]=(c[o>>2]|0)+1}c[E>>2]=(c[s>>2]|0)>200&1;if(0.0>+O(+(+((c[s>>2]|0)*27|0)))-42.0)j=0.0;else j=+O(+(+((c[s>>2]|0)*27|0)))-42.0;g[F>>2]=j;if(0.0>(163.0<+g[F>>2]?163.0:+g[F>>2])*.006899999920278788-.139){j=0.0;j=+O(+j);F=c[C>>2]|0;g[F>>2]=j;F=c[E>>2]|0;E=c[D>>2]|0;na(E|0);i=G;return F|0}j=(163.0<+g[F>>2]?163.0:+g[F>>2])*.006899999920278788-.139;j=+O(+j);F=c[C>>2]|0;g[F>>2]=j;F=c[E>>2]|0;E=c[D>>2]|0;na(E|0);i=G;return F|0}function sb(a,b,d,e,f,h,j,k,l){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;j=j|0;k=k|0;l=l|0;var m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;D=i;i=i+80|0;m=D+64|0;n=D+60|0;o=D+56|0;p=D+52|0;q=D+48|0;r=D+44|0;s=D+40|0;t=D+36|0;u=D+32|0;B=D+28|0;w=D+24|0;v=D+20|0;C=D+16|0;A=D+12|0;x=D+8|0;z=D+4|0;y=D;c[m>>2]=a;c[n>>2]=b;c[o>>2]=d;c[p>>2]=e;c[q>>2]=f;c[r>>2]=h;c[s>>2]=j;c[t>>2]=k;c[u>>2]=l;c[B>>2]=c[(c[m>>2]|0)+4>>2];if(c[n>>2]|0){c[v>>2]=c[n>>2];c[w>>2]=c[(c[m>>2]|0)+44>>2];c[C>>2]=c[(c[m>>2]|0)+36>>2]}else{c[v>>2]=1;c[w>>2]=c[(c[m>>2]|0)+44>>2]<<c[s>>2];c[C>>2]=(c[(c[m>>2]|0)+36>>2]|0)-(c[s>>2]|0)}c[z>>2]=0;do{c[x>>2]=0;while(1){if((c[x>>2]|0)>=(c[v>>2]|0))break;b=_(c[v>>2]|0,c[w>>2]|0)|0;b=(c[o>>2]|0)+((_(c[z>>2]|0,b+(c[B>>2]|0)|0)|0)<<2)|0;b=b+((_(c[x>>2]|0,c[w>>2]|0)|0)<<2)|0;k=_(c[z>>2]|0,c[w>>2]|0)|0;k=(c[x>>2]|0)+(_(k,c[v>>2]|0)|0)|0;Hc((c[m>>2]|0)+64|0,b,(c[p>>2]|0)+(k<<2)|0,c[(c[m>>2]|0)+60>>2]|0,c[B>>2]|0,c[C>>2]|0,c[v>>2]|0,c[u>>2]|0);c[x>>2]=(c[x>>2]|0)+1}k=(c[z>>2]|0)+1|0;c[z>>2]=k}while((k|0)<(c[r>>2]|0));a:do if((c[r>>2]|0)==2&(c[q>>2]|0)==1){c[A>>2]=0;while(1){if((c[A>>2]|0)>=(_(c[v>>2]|0,c[w>>2]|0)|0))break a;k=_(c[v>>2]|0,c[w>>2]|0)|0;g[(c[p>>2]|0)+(c[A>>2]<<2)>>2]=+g[(c[p>>2]|0)+(c[A>>2]<<2)>>2]*.5+ +g[(c[p>>2]|0)+(k+(c[A>>2]|0)<<2)>>2]*.5;c[A>>2]=(c[A>>2]|0)+1}}while(0);if((c[t>>2]|0)==1){i=D;return}c[z>>2]=0;do{k=_(c[v>>2]|0,c[w>>2]|0)|0;c[y>>2]=(k|0)/(c[t>>2]|0)|0;c[A>>2]=0;while(1){if((c[A>>2]|0)>=(c[y>>2]|0))break;k=_(c[z>>2]|0,c[v>>2]|0)|0;k=_(k,c[w>>2]|0)|0;k=(c[p>>2]|0)+(k+(c[A>>2]|0)<<2)|0;g[k>>2]=+g[k>>2]*+(c[t>>2]|0);c[A>>2]=(c[A>>2]|0)+1}b=_(c[z>>2]|0,c[v>>2]|0)|0;b=_(b,c[w>>2]|0)|0;k=_(c[v>>2]|0,c[w>>2]|0)|0;oj((c[p>>2]|0)+(b+(c[y>>2]|0)<<2)|0,0,k-(c[y>>2]|0)<<2|0)|0;k=(c[z>>2]|0)+1|0;c[z>>2]=k}while((k|0)<(c[q>>2]|0));i=D;return}function tb(a,b,d,e,f,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var j=0.0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;w=i;i=i+160|0;l=w+144|0;k=w+140|0;m=w+136|0;n=w+132|0;o=w+128|0;p=w+124|0;r=w+120|0;q=w+116|0;s=w+112|0;t=w+8|0;u=w+4|0;v=w;c[l>>2]=a;c[k>>2]=b;c[m>>2]=d;c[n>>2]=e;c[o>>2]=f;c[p>>2]=h;g[s>>2]=0.0;j=+g[(c[k>>2]|0)+(c[n>>2]<<2)>>2];h=c[n>>2]|0;a:do if((c[p>>2]|0)==1){g[t+(h<<2)>>2]=j;c[r>>2]=(c[n>>2]|0)+1;while(1){if((c[r>>2]|0)>=(c[o>>2]|0))break a;h=c[r>>2]|0;if(+g[t+((c[r>>2]|0)-1<<2)>>2]-1.0>+g[(c[k>>2]|0)+(c[r>>2]<<2)>>2])j=+g[t+(h-1<<2)>>2]-1.0;else j=+g[(c[k>>2]|0)+(h<<2)>>2];g[t+(c[r>>2]<<2)>>2]=j;c[r>>2]=(c[r>>2]|0)+1}}else{f=c[n>>2]|0;if(j>+g[(c[k>>2]|0)+(h+(c[m>>2]|0)<<2)>>2])j=+g[(c[k>>2]|0)+(f<<2)>>2];else j=+g[(c[k>>2]|0)+(f+(c[m>>2]|0)<<2)>>2];g[t+(c[n>>2]<<2)>>2]=j;c[r>>2]=(c[n>>2]|0)+1;while(1){if((c[r>>2]|0)>=(c[o>>2]|0))break a;h=c[r>>2]|0;if(+g[(c[k>>2]|0)+(c[r>>2]<<2)>>2]>+g[(c[k>>2]|0)+((c[r>>2]|0)+(c[m>>2]|0)<<2)>>2])j=+g[(c[k>>2]|0)+(h<<2)>>2];else j=+g[(c[k>>2]|0)+(h+(c[m>>2]|0)<<2)>>2];f=c[r>>2]|0;do if(!(+g[t+((c[r>>2]|0)-1<<2)>>2]-1.0>j)){h=c[r>>2]|0;if(+g[(c[k>>2]|0)+(f<<2)>>2]>+g[(c[k>>2]|0)+((c[r>>2]|0)+(c[m>>2]|0)<<2)>>2]){j=+g[(c[k>>2]|0)+(h<<2)>>2];break}else{j=+g[(c[k>>2]|0)+(h+(c[m>>2]|0)<<2)>>2];break}}else j=+g[t+(f-1<<2)>>2]-1.0;while(0);g[t+(c[r>>2]<<2)>>2]=j;c[r>>2]=(c[r>>2]|0)+1}}while(0);c[r>>2]=(c[o>>2]|0)-2;while(1){if((c[r>>2]|0)<(c[n>>2]|0))break;h=c[r>>2]|0;if(+g[t+(c[r>>2]<<2)>>2]>+g[t+((c[r>>2]|0)+1<<2)>>2]-1.0)j=+g[t+(h<<2)>>2];else j=+g[t+(h+1<<2)>>2]-1.0;g[t+(c[r>>2]<<2)>>2]=j;c[r>>2]=(c[r>>2]|0)+-1}c[q>>2]=0;do{c[r>>2]=2>(c[n>>2]|0)?2:c[n>>2]|0;while(1){if((c[r>>2]|0)>=((c[o>>2]|0)-1|0))break;k=(c[r>>2]|0)+(_(c[q>>2]|0,c[m>>2]|0)|0)|0;if(0.0>+g[(c[l>>2]|0)+(k<<2)>>2])j=0.0;else{k=(c[r>>2]|0)+(_(c[q>>2]|0,c[m>>2]|0)|0)|0;j=+g[(c[l>>2]|0)+(k<<2)>>2]}g[u>>2]=j;if(0.0>+g[t+(c[r>>2]<<2)>>2])j=0.0;else j=+g[t+(c[r>>2]<<2)>>2];g[v>>2]=j;if(0.0>+g[u>>2]-+g[v>>2])j=0.0;else j=+g[u>>2]-+g[v>>2];g[s>>2]=+g[s>>2]+j;c[r>>2]=(c[r>>2]|0)+1}k=(c[q>>2]|0)+1|0;c[q>>2]=k}while((k|0)<(c[p>>2]|0));g[s>>2]=+g[s>>2]/+(_(c[p>>2]|0,(c[o>>2]|0)-1-(2>(c[n>>2]|0)?2:c[n>>2]|0)|0)|0);i=w;return +g[s>>2]>1.0|0}function ub(d,e,f,h,j,k,l,m,n,o,p){d=d|0;e=e|0;f=f|0;h=h|0;j=j|0;k=k|0;l=l|0;m=m|0;n=n|0;o=+o;p=p|0;var q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0;W=i;i=i+144|0;q=W+128|0;H=W+124|0;I=W+120|0;T=W+116|0;J=W+112|0;s=W+108|0;t=W+104|0;K=W+100|0;u=W+96|0;X=W+92|0;r=W+88|0;U=W+84|0;L=W+80|0;M=W+76|0;F=W+72|0;G=W+64|0;V=W+60|0;A=W+56|0;S=W+52|0;B=W+48|0;x=W+44|0;C=W+40|0;w=W+36|0;y=W+32|0;z=W+28|0;v=W+24|0;D=W+20|0;E=W+16|0;O=W+12|0;P=W+8|0;Q=W+4|0;R=W;c[q>>2]=d;c[H>>2]=e;c[I>>2]=f;c[T>>2]=h;c[J>>2]=j;c[s>>2]=k;c[t>>2]=l;c[K>>2]=m;c[u>>2]=n;g[X>>2]=o;c[r>>2]=p;c[V>>2]=0;g[A>>2]=(-.25>.5-+g[X>>2]?-.25:.5-+g[X>>2])*.03999999910593033;k=c[H>>2]|0;c[S>>2]=ia()|0;j=i;i=i+((1*(k<<2)|0)+15&-16)|0;k=i;i=i+((1*((b[(c[(c[q>>2]|0)+32>>2]|0)+(c[H>>2]<<1)>>1]|0)-(b[(c[(c[q>>2]|0)+32>>2]|0)+((c[H>>2]|0)-1<<1)>>1]|0)<<c[K>>2]<<2)|0)+15&-16)|0;f=i;i=i+((1*((b[(c[(c[q>>2]|0)+32>>2]|0)+(c[H>>2]<<1)>>1]|0)-(b[(c[(c[q>>2]|0)+32>>2]|0)+((c[H>>2]|0)-1<<1)>>1]|0)<<c[K>>2]<<2)|0)+15&-16)|0;e=i;i=i+((1*(c[H>>2]<<2)|0)+15&-16)|0;d=i;i=i+((1*(c[H>>2]<<2)|0)+15&-16)|0;c[c[u>>2]>>2]=0;c[U>>2]=0;while(1){if((c[U>>2]|0)>=(c[H>>2]|0))break;c[z>>2]=0;c[x>>2]=(b[(c[(c[q>>2]|0)+32>>2]|0)+((c[U>>2]|0)+1<<1)>>1]|0)-(b[(c[(c[q>>2]|0)+32>>2]|0)+(c[U>>2]<<1)>>1]|0)<<c[K>>2];c[C>>2]=((b[(c[(c[q>>2]|0)+32>>2]|0)+((c[U>>2]|0)+1<<1)>>1]|0)-(b[(c[(c[q>>2]|0)+32>>2]|0)+(c[U>>2]<<1)>>1]|0)|0)==1&1;X=_(c[r>>2]|0,c[t>>2]|0)|0;pj(k|0,(c[s>>2]|0)+(X+(b[(c[(c[q>>2]|0)+32>>2]|0)+(c[U>>2]<<1)>>1]<<c[K>>2])<<2)|0,(c[x>>2]<<2)+0|0)|0;g[w>>2]=+vb(k,c[x>>2]|0,c[I>>2]|0?c[K>>2]|0:0,+g[A>>2]);g[y>>2]=+g[w>>2];if(!((c[I>>2]|0)==0|(c[C>>2]|0)!=0)?(pj(f|0,k|0,(c[x>>2]<<2)+0|0)|0,Ja(f,c[x>>2]>>c[K>>2],1<<c[K>>2]),g[w>>2]=+vb(f,c[x>>2]|0,(c[K>>2]|0)+1|0,+g[A>>2]),+g[w>>2]<+g[y>>2]):0){g[y>>2]=+g[w>>2];c[z>>2]=-1}c[B>>2]=0;while(1){m=(c[I>>2]|0)!=0;if((c[B>>2]|0)>=((c[K>>2]|0)+(((c[I>>2]|0?1:(c[C>>2]|0)!=0)^1)&1)|0))break;if(m)c[v>>2]=(c[K>>2]|0)-(c[B>>2]|0)-1;else c[v>>2]=(c[B>>2]|0)+1;Ja(k,c[x>>2]>>c[B>>2],1<<c[B>>2]);g[w>>2]=+vb(k,c[x>>2]|0,c[v>>2]|0,+g[A>>2]);if(+g[w>>2]<+g[y>>2]){g[y>>2]=+g[w>>2];c[z>>2]=(c[B>>2]|0)+1}c[B>>2]=(c[B>>2]|0)+1}l=c[z>>2]|0;if(m)c[j+(c[U>>2]<<2)>>2]=l<<1;else{X=_(-2,l)|0;c[j+(c[U>>2]<<2)>>2]=X}X=c[u>>2]|0;c[X>>2]=(c[X>>2]|0)+((c[I>>2]|0?c[K>>2]|0:0)-((c[j+(c[U>>2]<<2)>>2]|0)/2|0));do if(c[C>>2]|0){if(c[j+(c[U>>2]<<2)>>2]|0?(c[j+(c[U>>2]<<2)>>2]|0)!=(_(-2,c[K>>2]|0)|0):0)break;X=j+(c[U>>2]<<2)|0;c[X>>2]=(c[X>>2]|0)-1}while(0);c[U>>2]=(c[U>>2]|0)+1}c[V>>2]=0;c[F>>2]=0;while(1){if((c[F>>2]|0)>=2)break;c[L>>2]=0;c[M>>2]=c[I>>2]|0?0:c[J>>2]|0;c[U>>2]=1;while(1){m=c[L>>2]|0;l=c[M>>2]|0;if((c[U>>2]|0)>=(c[H>>2]|0))break;if((m|0)<(l+(c[J>>2]|0)|0))m=c[L>>2]|0;else m=(c[M>>2]|0)+(c[J>>2]|0)|0;c[D>>2]=m;if(((c[L>>2]|0)+(c[J>>2]|0)|0)<(c[M>>2]|0))m=(c[L>>2]|0)+(c[J>>2]|0)|0;else m=c[M>>2]|0;c[E>>2]=m;c[L>>2]=(c[D>>2]|0)+(N((c[j+(c[U>>2]<<2)>>2]|0)-(a[25232+(c[K>>2]<<3)+((c[I>>2]<<2)+(c[F>>2]<<1)+0)>>0]<<1)|0)|0);c[M>>2]=(c[E>>2]|0)+(N((c[j+(c[U>>2]<<2)>>2]|0)-(a[25232+(c[K>>2]<<3)+((c[I>>2]<<2)+(c[F>>2]<<1)+1)>>0]<<1)|0)|0);c[U>>2]=(c[U>>2]|0)+1}c[L>>2]=(m|0)<(l|0)?c[L>>2]|0:c[M>>2]|0;c[G+(c[F>>2]<<2)>>2]=c[L>>2];c[F>>2]=(c[F>>2]|0)+1}if(c[I>>2]|0?(c[G+4>>2]|0)<(c[G>>2]|0):0)c[V>>2]=1;c[L>>2]=0;c[M>>2]=c[I>>2]|0?0:c[J>>2]|0;c[U>>2]=1;while(1){m=c[L>>2]|0;if((c[U>>2]|0)>=(c[H>>2]|0))break;c[Q>>2]=m;c[R>>2]=(c[M>>2]|0)+(c[J>>2]|0);if((c[Q>>2]|0)<(c[R>>2]|0)){c[O>>2]=c[Q>>2];c[e+(c[U>>2]<<2)>>2]=0}else{c[O>>2]=c[R>>2];c[e+(c[U>>2]<<2)>>2]=1}c[Q>>2]=(c[L>>2]|0)+(c[J>>2]|0);c[R>>2]=c[M>>2];if((c[Q>>2]|0)<(c[R>>2]|0)){c[P>>2]=c[Q>>2];c[d+(c[U>>2]<<2)>>2]=0}else{c[P>>2]=c[R>>2];c[d+(c[U>>2]<<2)>>2]=1}c[L>>2]=(c[O>>2]|0)+(N((c[j+(c[U>>2]<<2)>>2]|0)-(a[25232+(c[K>>2]<<3)+((c[I>>2]<<2)+(c[V>>2]<<1)+0)>>0]<<1)|0)|0);c[M>>2]=(c[P>>2]|0)+(N((c[j+(c[U>>2]<<2)>>2]|0)-(a[25232+(c[K>>2]<<3)+((c[I>>2]<<2)+(c[V>>2]<<1)+1)>>0]<<1)|0)|0);c[U>>2]=(c[U>>2]|0)+1}c[(c[T>>2]|0)+((c[H>>2]|0)-1<<2)>>2]=(m|0)<(c[M>>2]|0)?0:1;c[U>>2]=(c[H>>2]|0)-2;while(1){if((c[U>>2]|0)<0)break;m=(c[U>>2]|0)+1|0;if((c[(c[T>>2]|0)+((c[U>>2]|0)+1<<2)>>2]|0)==1)c[(c[T>>2]|0)+(c[U>>2]<<2)>>2]=c[d+(m<<2)>>2];else c[(c[T>>2]|0)+(c[U>>2]<<2)>>2]=c[e+(m<<2)>>2];c[U>>2]=(c[U>>2]|0)+-1}X=c[V>>2]|0;na(c[S>>2]|0);i=W;return X|0}function vb(a,b,d,e){a=a|0;b=b|0;d=d|0;e=+e;var f=0,h=0,j=0,k=0,l=0,m=0,n=0;n=i;i=i+32|0;f=n+20|0;h=n+16|0;j=n+12|0;k=n+8|0;m=n+4|0;l=n;c[f>>2]=a;c[h>>2]=b;c[j>>2]=d;g[k>>2]=e;g[l>>2]=0.0;c[m>>2]=0;while(1){if((c[m>>2]|0)>=(c[h>>2]|0))break;e=+N(+(+g[(c[f>>2]|0)+(c[m>>2]<<2)>>2]));g[l>>2]=+g[l>>2]+e;c[m>>2]=(c[m>>2]|0)+1}g[l>>2]=+g[l>>2]+ +(c[j>>2]|0)*+g[k>>2]*+g[l>>2];i=n;return +(+g[l>>2])}function wb(b,d,e,f,g,h,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;y=i;i=i+64|0;k=y+52|0;l=y+48|0;m=y+44|0;n=y+40|0;o=y+36|0;p=y+32|0;q=y+28|0;s=y+24|0;t=y+20|0;x=y+16|0;w=y+12|0;u=y+8|0;r=y+4|0;v=y;c[k>>2]=b;c[l>>2]=d;c[m>>2]=e;c[n>>2]=f;c[o>>2]=g;c[p>>2]=h;c[q>>2]=j;c[r>>2]=c[(c[q>>2]|0)+4>>2]<<3;c[v>>2]=ob(c[q>>2]|0)|0;c[u>>2]=c[m>>2]|0?2:4;if((c[o>>2]|0)>0)g=((c[v>>2]|0)+(c[u>>2]|0)+1|0)>>>0<=(c[r>>2]|0)>>>0;else g=0;c[x>>2]=g&1;c[r>>2]=(c[r>>2]|0)-(c[x>>2]|0);c[w>>2]=0;c[s>>2]=0;c[t>>2]=c[k>>2];while(1){if((c[t>>2]|0)>=(c[l>>2]|0))break;if(((c[v>>2]|0)+(c[u>>2]|0)|0)>>>0<=(c[r>>2]|0)>>>0){pc(c[q>>2]|0,c[(c[n>>2]|0)+(c[t>>2]<<2)>>2]^c[s>>2],c[u>>2]|0);c[v>>2]=ob(c[q>>2]|0)|0;c[s>>2]=c[(c[n>>2]|0)+(c[t>>2]<<2)>>2];c[w>>2]=c[w>>2]|c[s>>2]}else c[(c[n>>2]|0)+(c[t>>2]<<2)>>2]=c[s>>2];c[u>>2]=c[m>>2]|0?4:5;c[t>>2]=(c[t>>2]|0)+1}if(c[x>>2]|0?(a[25232+(c[o>>2]<<3)+((c[m>>2]<<2)+0+(c[w>>2]|0))>>0]|0)!=(a[25232+(c[o>>2]<<3)+((c[m>>2]<<2)+2+(c[w>>2]|0))>>0]|0):0)pc(c[q>>2]|0,c[p>>2]|0,1);else c[p>>2]=0;c[t>>2]=c[k>>2];while(1){if((c[t>>2]|0)>=(c[l>>2]|0))break;c[(c[n>>2]|0)+(c[t>>2]<<2)>>2]=a[25232+(c[o>>2]<<3)+((c[m>>2]<<2)+(c[p>>2]<<1)+(c[(c[n>>2]|0)+(c[t>>2]<<2)>>2]|0))>>0];c[t>>2]=(c[t>>2]|0)+1}i=y;return}function xb(a,d,e,f,h,j,k,l,m,n,o,p,q,r,s,t,u,v){a=a|0;d=d|0;e=e|0;f=f|0;h=h|0;j=j|0;k=k|0;l=l|0;m=m|0;n=n|0;o=o|0;p=p|0;q=q|0;r=r|0;s=s|0;t=t|0;u=u|0;v=v|0;var w=0.0,x=0.0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,$=0,aa=0,ba=0,ca=0,da=0;da=i;i=i+128|0;I=da+120|0;B=da+116|0;H=da+112|0;K=da+108|0;S=da+104|0;T=da+100|0;U=da+96|0;y=da+92|0;z=da+88|0;V=da+84|0;L=da+80|0;M=da+76|0;N=da+72|0;O=da+68|0;P=da+64|0;Q=da+60|0;A=da+56|0;J=da+52|0;Z=da+48|0;C=da+44|0;aa=da+40|0;$=da+36|0;R=da+32|0;E=da+28|0;F=da+24|0;G=da+20|0;D=da+16|0;ba=da+12|0;W=da+8|0;X=da+4|0;Y=da;c[I>>2]=a;c[B>>2]=d;c[H>>2]=e;c[K>>2]=f;c[S>>2]=h;c[T>>2]=j;c[U>>2]=k;c[y>>2]=l;c[z>>2]=m;c[V>>2]=n;c[L>>2]=o;c[M>>2]=p;c[N>>2]=q;c[O>>2]=r;c[P>>2]=s;c[Q>>2]=t;c[A>>2]=u;c[J>>2]=v;c[aa>>2]=0;o=_(c[T>>2]|0,c[H>>2]|0)|0;c[R>>2]=ia()|0;a=i;i=i+((1*(o<<2)|0)+15&-16)|0;o=(_(c[T>>2]|0,c[H>>2]|0)|0)<<2;r=i;i=i+((1*o|0)+15&-16)|0;oj(c[U>>2]|0,0,c[H>>2]<<2|0)|0;g[$>>2]=-31.899999618530273;c[Z>>2]=0;while(1){if((c[Z>>2]|0)>=(c[S>>2]|0))break;x=+(b[(c[z>>2]|0)+(c[Z>>2]<<1)>>1]|0)*.0625+.5+ +(9-(c[y>>2]|0)|0)-+g[17464+(c[Z>>2]<<2)>>2]+ +(_((c[Z>>2]|0)+5|0,(c[Z>>2]|0)+5|0)|0)*.006200000178068876;g[r+(c[Z>>2]<<2)>>2]=x;c[Z>>2]=(c[Z>>2]|0)+1}c[C>>2]=0;do{c[Z>>2]=0;while(1){if((c[Z>>2]|0)>=(c[S>>2]|0))break;z=_(c[C>>2]|0,c[H>>2]|0)|0;if(+g[$>>2]>+g[(c[I>>2]|0)+(z+(c[Z>>2]|0)<<2)>>2]-+g[r+(c[Z>>2]<<2)>>2])w=+g[$>>2];else{z=_(c[C>>2]|0,c[H>>2]|0)|0;w=+g[(c[I>>2]|0)+(z+(c[Z>>2]|0)<<2)>>2]-+g[r+(c[Z>>2]<<2)>>2]}g[$>>2]=w;c[Z>>2]=(c[Z>>2]|0)+1}z=(c[C>>2]|0)+1|0;c[C>>2]=z}while((z|0)<(c[T>>2]|0));if((c[P>>2]|0)>50&(c[O>>2]|0)>=1^1|(c[A>>2]|0)!=0){ba=c[aa>>2]|0;ca=c[Q>>2]|0;c[ca>>2]=ba;x=+g[$>>2];ca=c[R>>2]|0;na(ca|0);i=da;return +x}c[E>>2]=0;c[C>>2]=0;do{c[D>>2]=a+((_(c[C>>2]|0,c[H>>2]|0)|0)<<2);A=_(c[C>>2]|0,c[H>>2]|0)|0;g[c[D>>2]>>2]=+g[(c[B>>2]|0)+(A<<2)>>2];c[Z>>2]=1;while(1){if((c[Z>>2]|0)>=(c[S>>2]|0))break;z=_(c[C>>2]|0,c[H>>2]|0)|0;A=_(c[C>>2]|0,c[H>>2]|0)|0;if(+g[(c[B>>2]|0)+(z+(c[Z>>2]|0)<<2)>>2]>+g[(c[B>>2]|0)+(A+(c[Z>>2]|0)-1<<2)>>2]+.5)c[E>>2]=c[Z>>2];A=_(c[C>>2]|0,c[H>>2]|0)|0;if(+g[(c[D>>2]|0)+((c[Z>>2]|0)-1<<2)>>2]+1.5<+g[(c[B>>2]|0)+(A+(c[Z>>2]|0)<<2)>>2])w=+g[(c[D>>2]|0)+((c[Z>>2]|0)-1<<2)>>2]+1.5;else{A=_(c[C>>2]|0,c[H>>2]|0)|0;w=+g[(c[B>>2]|0)+(A+(c[Z>>2]|0)<<2)>>2]}g[(c[D>>2]|0)+(c[Z>>2]<<2)>>2]=w;c[Z>>2]=(c[Z>>2]|0)+1}c[Z>>2]=(c[E>>2]|0)-1;while(1){if((c[Z>>2]|0)<0)break;A=_(c[C>>2]|0,c[H>>2]|0)|0;if(+g[(c[D>>2]|0)+((c[Z>>2]|0)+1<<2)>>2]+2.0<+g[(c[B>>2]|0)+(A+(c[Z>>2]|0)<<2)>>2])w=+g[(c[D>>2]|0)+((c[Z>>2]|0)+1<<2)>>2]+2.0;else{A=_(c[C>>2]|0,c[H>>2]|0)|0;w=+g[(c[B>>2]|0)+(A+(c[Z>>2]|0)<<2)>>2]}j=c[Z>>2]|0;do if(!(+g[(c[D>>2]|0)+(c[Z>>2]<<2)>>2]<w)){A=_(c[C>>2]|0,c[H>>2]|0)|0;if(+g[(c[D>>2]|0)+(j+1<<2)>>2]+2.0<+g[(c[B>>2]|0)+(A+(c[Z>>2]|0)<<2)>>2]){w=+g[(c[D>>2]|0)+((c[Z>>2]|0)+1<<2)>>2]+2.0;break}else{A=_(c[C>>2]|0,c[H>>2]|0)|0;w=+g[(c[B>>2]|0)+(A+(c[Z>>2]|0)<<2)>>2];break}}else w=+g[(c[D>>2]|0)+(j<<2)>>2];while(0);g[(c[D>>2]|0)+(c[Z>>2]<<2)>>2]=w;c[Z>>2]=(c[Z>>2]|0)+-1}g[F>>2]=1.0;c[Z>>2]=2;while(1){if((c[Z>>2]|0)>=((c[S>>2]|0)-2|0))break;w=+g[(c[D>>2]|0)+(c[Z>>2]<<2)>>2];A=_(c[C>>2]|0,c[H>>2]|0)|0;x=+yb((c[B>>2]|0)+(A+(c[Z>>2]|0)-2<<2)|0);if(w>x-+g[F>>2])w=+g[(c[D>>2]|0)+(c[Z>>2]<<2)>>2];else{A=_(c[C>>2]|0,c[H>>2]|0)|0;w=+yb((c[B>>2]|0)+(A+(c[Z>>2]|0)-2<<2)|0);w=w-+g[F>>2]}g[(c[D>>2]|0)+(c[Z>>2]<<2)>>2]=w;c[Z>>2]=(c[Z>>2]|0)+1}A=_(c[C>>2]|0,c[H>>2]|0)|0;x=+zb((c[B>>2]|0)+(A<<2)|0);g[G>>2]=x-+g[F>>2];if(+g[c[D>>2]>>2]>+g[G>>2])w=+g[c[D>>2]>>2];else w=+g[G>>2];g[c[D>>2]>>2]=w;if(+g[(c[D>>2]|0)+4>>2]>+g[G>>2])w=+g[(c[D>>2]|0)+4>>2];else w=+g[G>>2];g[(c[D>>2]|0)+4>>2]=w;A=_(c[C>>2]|0,c[H>>2]|0)|0;x=+zb((c[B>>2]|0)+(A+(c[S>>2]|0)-3<<2)|0);g[G>>2]=x-+g[F>>2];if(+g[(c[D>>2]|0)+((c[S>>2]|0)-2<<2)>>2]>+g[G>>2])w=+g[(c[D>>2]|0)+((c[S>>2]|0)-2<<2)>>2];else w=+g[G>>2];g[(c[D>>2]|0)+((c[S>>2]|0)-2<<2)>>2]=w;if(+g[(c[D>>2]|0)+((c[S>>2]|0)-1<<2)>>2]>+g[G>>2])w=+g[(c[D>>2]|0)+((c[S>>2]|0)-1<<2)>>2];else w=+g[G>>2];g[(c[D>>2]|0)+((c[S>>2]|0)-1<<2)>>2]=w;c[Z>>2]=0;while(1){if((c[Z>>2]|0)>=(c[S>>2]|0))break;j=c[Z>>2]|0;if(+g[(c[D>>2]|0)+(c[Z>>2]<<2)>>2]>+g[r+(c[Z>>2]<<2)>>2])w=+g[(c[D>>2]|0)+(j<<2)>>2];else w=+g[r+(j<<2)>>2];g[(c[D>>2]|0)+(c[Z>>2]<<2)>>2]=w;c[Z>>2]=(c[Z>>2]|0)+1}A=(c[C>>2]|0)+1|0;c[C>>2]=A}while((A|0)<(c[T>>2]|0));G=(c[T>>2]|0)==2;c[Z>>2]=c[K>>2];a:do if(G)while(1){if((c[Z>>2]|0)>=(c[S>>2]|0))break a;if(+g[a+((c[H>>2]|0)+(c[Z>>2]|0)<<2)>>2]>+g[a+(c[Z>>2]<<2)>>2]-4.0)w=+g[a+((c[H>>2]|0)+(c[Z>>2]|0)<<2)>>2];else w=+g[a+(c[Z>>2]<<2)>>2]-4.0;g[a+((c[H>>2]|0)+(c[Z>>2]|0)<<2)>>2]=w;if(+g[a+(c[Z>>2]<<2)>>2]>+g[a+((c[H>>2]|0)+(c[Z>>2]|0)<<2)>>2]-4.0)w=+g[a+(c[Z>>2]<<2)>>2];else w=+g[a+((c[H>>2]|0)+(c[Z>>2]|0)<<2)>>2]-4.0;g[a+(c[Z>>2]<<2)>>2]=w;if(0.0>+g[(c[I>>2]|0)+(c[Z>>2]<<2)>>2]-+g[a+(c[Z>>2]<<2)>>2])x=0.0;else x=+g[(c[I>>2]|0)+(c[Z>>2]<<2)>>2]-+g[a+(c[Z>>2]<<2)>>2];if(0.0>+g[(c[I>>2]|0)+((c[H>>2]|0)+(c[Z>>2]|0)<<2)>>2]-+g[a+((c[H>>2]|0)+(c[Z>>2]|0)<<2)>>2])w=0.0;else w=+g[(c[I>>2]|0)+((c[H>>2]|0)+(c[Z>>2]|0)<<2)>>2]-+g[a+((c[H>>2]|0)+(c[Z>>2]|0)<<2)>>2];g[a+(c[Z>>2]<<2)>>2]=(x+w)*.5;c[Z>>2]=(c[Z>>2]|0)+1}else while(1){if((c[Z>>2]|0)>=(c[S>>2]|0))break a;if(0.0>+g[(c[I>>2]|0)+(c[Z>>2]<<2)>>2]-+g[a+(c[Z>>2]<<2)>>2])w=0.0;else w=+g[(c[I>>2]|0)+(c[Z>>2]<<2)>>2]-+g[a+(c[Z>>2]<<2)>>2];g[a+(c[Z>>2]<<2)>>2]=w;c[Z>>2]=(c[Z>>2]|0)+1}while(0);c[Z>>2]=c[K>>2];while(1){if((c[Z>>2]|0)>=(c[S>>2]|0))break;j=c[Z>>2]|0;if(+g[a+(c[Z>>2]<<2)>>2]>+g[(c[J>>2]|0)+(c[Z>>2]<<2)>>2])w=+g[a+(j<<2)>>2];else w=+g[(c[J>>2]|0)+(j<<2)>>2];g[a+(c[Z>>2]<<2)>>2]=w;c[Z>>2]=(c[Z>>2]|0)+1}b:do if(!(((c[L>>2]|0)==0|(c[M>>2]|0)!=0)^1|(c[V>>2]|0)!=0)){c[Z>>2]=c[K>>2];while(1){if((c[Z>>2]|0)>=(c[S>>2]|0))break b;g[a+(c[Z>>2]<<2)>>2]=+g[a+(c[Z>>2]<<2)>>2]*.5;c[Z>>2]=(c[Z>>2]|0)+1}}while(0);c[Z>>2]=c[K>>2];while(1){if((c[Z>>2]|0)>=(c[S>>2]|0)){ca=103;break}if((c[Z>>2]|0)<8){K=a+(c[Z>>2]<<2)|0;g[K>>2]=+g[K>>2]*2.0}if((c[Z>>2]|0)>=12)g[a+(c[Z>>2]<<2)>>2]=+g[a+(c[Z>>2]<<2)>>2]*.5;if(+g[a+(c[Z>>2]<<2)>>2]<4.0)w=+g[a+(c[Z>>2]<<2)>>2];else w=4.0;g[a+(c[Z>>2]<<2)>>2]=w;K=_(c[T>>2]|0,(b[(c[N>>2]|0)+((c[Z>>2]|0)+1<<1)>>1]|0)-(b[(c[N>>2]|0)+(c[Z>>2]<<1)>>1]|0)|0)|0;c[ba>>2]=K<<c[O>>2];do if((c[ba>>2]|0)>=6){w=+g[a+(c[Z>>2]<<2)>>2];if((c[ba>>2]|0)>48){c[W>>2]=~~(w*8.0);c[X>>2]=((_(c[W>>2]|0,c[ba>>2]|0)|0)<<3|0)/8|0;break}else{c[W>>2]=~~(w*+(c[ba>>2]|0)/6.0);c[X>>2]=(c[W>>2]|0)*6<<3;break}}else{c[W>>2]=~~+g[a+(c[Z>>2]<<2)>>2];c[X>>2]=(_(c[W>>2]|0,c[ba>>2]|0)|0)<<3}while(0);if(!(c[L>>2]|0?(c[M>>2]|0)==0|(c[V>>2]|0)!=0:0))ca=100;if((ca|0)==100?(ca=0,((c[aa>>2]|0)+(c[X>>2]|0)>>3>>3|0)>((c[P>>2]|0)/4|0|0)):0)break;c[(c[U>>2]|0)+(c[Z>>2]<<2)>>2]=c[W>>2];c[aa>>2]=(c[aa>>2]|0)+(c[X>>2]|0);c[Z>>2]=(c[Z>>2]|0)+1}if((ca|0)==103){ba=c[aa>>2]|0;ca=c[Q>>2]|0;c[ca>>2]=ba;x=+g[$>>2];ca=c[R>>2]|0;na(ca|0);i=da;return +x}c[Y>>2]=((c[P>>2]|0)/4|0)<<3<<3;c[(c[U>>2]|0)+(c[Z>>2]<<2)>>2]=(c[Y>>2]|0)-(c[aa>>2]|0);c[aa>>2]=c[Y>>2];ba=c[aa>>2]|0;ca=c[Q>>2]|0;c[ca>>2]=ba;x=+g[$>>2];ca=c[R>>2]|0;na(ca|0);i=da;return +x}function yb(a){a=a|0;var b=0,d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0.0;n=i;i=i+48|0;b=n+32|0;d=n+28|0;e=n+24|0;f=n+20|0;h=n+16|0;j=n+12|0;k=n+8|0;l=n+4|0;m=n;c[d>>2]=a;g[h>>2]=+g[(c[d>>2]|0)+8>>2];a=c[d>>2]|0;if(+g[c[d>>2]>>2]>+g[(c[d>>2]|0)+4>>2]){g[e>>2]=+g[a+4>>2];g[f>>2]=+g[c[d>>2]>>2]}else{g[e>>2]=+g[a>>2];g[f>>2]=+g[(c[d>>2]|0)+4>>2]}a=c[d>>2]|0;if(+g[(c[d>>2]|0)+12>>2]>+g[(c[d>>2]|0)+16>>2]){g[j>>2]=+g[a+16>>2];g[k>>2]=+g[(c[d>>2]|0)+12>>2]}else{g[j>>2]=+g[a+12>>2];g[k>>2]=+g[(c[d>>2]|0)+16>>2]}if(+g[e>>2]>+g[j>>2]){g[l>>2]=+g[e>>2];g[e>>2]=+g[j>>2];g[j>>2]=+g[l>>2];g[m>>2]=+g[f>>2];g[f>>2]=+g[k>>2];g[k>>2]=+g[m>>2]}if(+g[h>>2]>+g[f>>2])if(+g[f>>2]<+g[j>>2]){g[b>>2]=+g[h>>2]<+g[j>>2]?+g[h>>2]:+g[j>>2];o=+g[b>>2];i=n;return +o}else{g[b>>2]=+g[k>>2]<+g[f>>2]?+g[k>>2]:+g[f>>2];o=+g[b>>2];i=n;return +o}else if(+g[h>>2]<+g[j>>2]){g[b>>2]=+g[f>>2]<+g[j>>2]?+g[f>>2]:+g[j>>2];o=+g[b>>2];i=n;return +o}else{g[b>>2]=+g[h>>2]<+g[k>>2]?+g[h>>2]:+g[k>>2];o=+g[b>>2];i=n;return +o}return 0.0}function zb(a){a=a|0;var b=0,d=0,e=0,f=0,h=0,j=0,k=0.0;j=i;i=i+32|0;b=j+16|0;d=j+12|0;e=j+8|0;f=j+4|0;h=j;c[d>>2]=a;a=c[d>>2]|0;if(+g[c[d>>2]>>2]>+g[(c[d>>2]|0)+4>>2]){g[e>>2]=+g[a+4>>2];g[f>>2]=+g[c[d>>2]>>2]}else{g[e>>2]=+g[a>>2];g[f>>2]=+g[(c[d>>2]|0)+4>>2]}g[h>>2]=+g[(c[d>>2]|0)+8>>2];if(+g[f>>2]<+g[h>>2]){g[b>>2]=+g[f>>2];k=+g[b>>2];i=j;return +k}if(+g[e>>2]<+g[h>>2]){g[b>>2]=+g[h>>2];k=+g[b>>2];i=j;return +k}else{g[b>>2]=+g[e>>2];k=+g[b>>2];i=j;return +k}return 0.0}function Ab(a,d,e,f){a=a|0;d=d|0;e=e|0;f=f|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0.0;v=i;i=i+64|0;h=v+48|0;j=v+44|0;k=v+40|0;l=v+36|0;q=v+32|0;u=v+28|0;s=v+24|0;t=v+20|0;r=v+16|0;m=v+12|0;o=v+8|0;n=v+4|0;p=v;c[h>>2]=a;c[j>>2]=d;c[k>>2]=e;c[l>>2]=f;g[s>>2]=1.0000000036274937e-15;g[t>>2]=1.0000000036274937e-15;c[q>>2]=0;while(1){if((c[q>>2]|0)>=13)break;c[r>>2]=b[(c[(c[h>>2]|0)+32>>2]|0)+(c[q>>2]<<1)>>1]<<c[k>>2];while(1){if((c[r>>2]|0)>=(b[(c[(c[h>>2]|0)+32>>2]|0)+((c[q>>2]|0)+1<<1)>>1]<<c[k>>2]|0))break;g[m>>2]=+g[(c[j>>2]|0)+(c[r>>2]<<2)>>2];g[o>>2]=+g[(c[j>>2]|0)+((c[l>>2]|0)+(c[r>>2]|0)<<2)>>2];g[n>>2]=+g[m>>2]+ +g[o>>2];g[p>>2]=+g[m>>2]-+g[o>>2];w=+N(+(+g[m>>2]));g[s>>2]=+g[s>>2]+(w+ +N(+(+g[o>>2])));w=+N(+(+g[n>>2]));g[t>>2]=+g[t>>2]+(w+ +N(+(+g[p>>2])));c[r>>2]=(c[r>>2]|0)+1}c[q>>2]=(c[q>>2]|0)+1}g[t>>2]=+g[t>>2]*.7071070075035095;c[u>>2]=13;if((c[k>>2]|0)<=1)c[u>>2]=(c[u>>2]|0)-8;i=v;return +((b[(c[(c[h>>2]|0)+32>>2]|0)+26>>1]<<(c[k>>2]|0)+1)+(c[u>>2]|0)|0)*+g[t>>2]>+(b[(c[(c[h>>2]|0)+32>>2]|0)+26>>1]<<(c[k>>2]|0)+1|0)*+g[s>>2]|0}function Bb(a,d,e,f,h,j,k,l,m,n,o,p,q){a=a|0;d=d|0;e=e|0;f=f|0;h=h|0;j=j|0;k=k|0;l=l|0;m=m|0;n=+n;o=o|0;p=+p;q=q|0;var r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,O=0,P=0,Q=0;Q=i;i=i+96|0;B=Q+92|0;s=Q+88|0;C=Q+84|0;D=Q+80|0;u=Q+76|0;E=Q+72|0;v=Q+68|0;L=Q+64|0;F=Q+60|0;K=Q+56|0;t=Q+52|0;J=Q+48|0;H=Q+40|0;I=Q+36|0;G=Q+32|0;P=Q+28|0;O=Q+24|0;z=Q+20|0;A=Q+16|0;y=Q+12|0;x=Q+8|0;r=Q+4|0;w=Q;c[B>>2]=a;c[s>>2]=d;c[C>>2]=e;c[D>>2]=f;c[u>>2]=h;c[E>>2]=j;c[v>>2]=k;c[L>>2]=l;c[F>>2]=m;g[K>>2]=n;c[t>>2]=o;g[J>>2]=p;c[Q+44>>2]=q;g[I>>2]=0.0;g[O>>2]=5.0;if((c[E>>2]|0)==2){g[y>>2]=0.0;c[H>>2]=0;while(1){if((c[H>>2]|0)>=8)break;g[r>>2]=+Cb((c[s>>2]|0)+(b[(c[(c[B>>2]|0)+32>>2]|0)+(c[H>>2]<<1)>>1]<<c[u>>2]<<2)|0,(c[s>>2]|0)+((c[v>>2]|0)+(b[(c[(c[B>>2]|0)+32>>2]|0)+(c[H>>2]<<1)>>1]<<c[u>>2])<<2)|0,(b[(c[(c[B>>2]|0)+32>>2]|0)+((c[H>>2]|0)+1<<1)>>1]|0)-(b[(c[(c[B>>2]|0)+32>>2]|0)+(c[H>>2]<<1)>>1]|0)<<c[u>>2]);g[y>>2]=+g[y>>2]+ +g[r>>2];c[H>>2]=(c[H>>2]|0)+1}g[y>>2]=+g[y>>2]*.125;if(1.0<+N(+(+g[y>>2])))p=1.0;else p=+N(+(+g[y>>2]));g[y>>2]=p;g[x>>2]=+g[y>>2];c[H>>2]=8;while(1){if((c[H>>2]|0)>=(c[t>>2]|0))break;g[w>>2]=+Cb((c[s>>2]|0)+(b[(c[(c[B>>2]|0)+32>>2]|0)+(c[H>>2]<<1)>>1]<<c[u>>2]<<2)|0,(c[s>>2]|0)+((c[v>>2]|0)+(b[(c[(c[B>>2]|0)+32>>2]|0)+(c[H>>2]<<1)>>1]<<c[u>>2])<<2)|0,(b[(c[(c[B>>2]|0)+32>>2]|0)+((c[H>>2]|0)+1<<1)>>1]|0)-(b[(c[(c[B>>2]|0)+32>>2]|0)+(c[H>>2]<<1)>>1]|0)<<c[u>>2]);if(+g[x>>2]<+N(+(+g[w>>2])))p=+g[x>>2];else p=+N(+(+g[w>>2]));g[x>>2]=p;c[H>>2]=(c[H>>2]|0)+1}if(1.0<+N(+(+g[x>>2])))p=1.0;else p=+N(+(+g[x>>2]));g[x>>2]=p;g[z>>2]=+Y(+(1.0010000467300415-+g[y>>2]*+g[y>>2]))*1.4426950408889634;if(+g[z>>2]*.5>+Y(+(1.0010000467300415-+g[x>>2]*+g[x>>2]))*1.4426950408889634)p=+g[z>>2]*.5;else p=+Y(+(1.0010000467300415-+g[x>>2]*+g[x>>2]))*1.4426950408889634;g[A>>2]=p;g[O>>2]=+g[O>>2]+(-4.0>+g[z>>2]*.75?-4.0:+g[z>>2]*.75);if(+g[c[F>>2]>>2]+.25<-(+g[A>>2]*.5))p=+g[c[F>>2]>>2]+.25;else p=-(+g[A>>2]*.5);g[c[F>>2]>>2]=p}c[G>>2]=0;do{c[H>>2]=0;while(1){if((c[H>>2]|0)>=((c[D>>2]|0)-1|0))break;F=(c[H>>2]|0)+(_(c[G>>2]|0,c[(c[B>>2]|0)+8>>2]|0)|0)|0;g[I>>2]=+g[I>>2]+ +g[(c[C>>2]|0)+(F<<2)>>2]*+(2+(c[H>>2]<<1)-(c[D>>2]|0)|0);c[H>>2]=(c[H>>2]|0)+1}F=(c[G>>2]|0)+1|0;c[G>>2]=F}while((F|0)<(c[E>>2]|0));n=+(_(c[E>>2]|0,(c[D>>2]|0)-1|0)|0);g[I>>2]=+g[I>>2]/n;if(2.0<(+g[I>>2]+1.0)/6.0)p=2.0;else p=(+g[I>>2]+1.0)/6.0;if(!(-2.0>p))if(2.0<(+g[I>>2]+1.0)/6.0)p=2.0;else p=(+g[I>>2]+1.0)/6.0;else p=-2.0;g[O>>2]=+g[O>>2]-p;g[O>>2]=+g[O>>2]-+g[J>>2];g[O>>2]=+g[O>>2]-+g[K>>2]*2.0;if(c[c[L>>2]>>2]|0){if(2.0<(+g[(c[L>>2]|0)+8>>2]+.05000000074505806)*2.0)p=2.0;else p=(+g[(c[L>>2]|0)+8>>2]+.05000000074505806)*2.0;if(!(-2.0>p))if(2.0<(+g[(c[L>>2]|0)+8>>2]+.05000000074505806)*2.0)p=2.0;else p=(+g[(c[L>>2]|0)+8>>2]+.05000000074505806)*2.0;else p=-2.0;g[O>>2]=+g[O>>2]-p}c[P>>2]=~~+M(+(+g[O>>2]+.5));if(0>((10<(c[P>>2]|0)?10:c[P>>2]|0)|0)){O=0;c[P>>2]=O;P=c[P>>2]|0;i=Q;return P|0}O=10<(c[P>>2]|0)?10:c[P>>2]|0;c[P>>2]=O;P=c[P>>2]|0;i=Q;return P|0}function Cb(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0,h=0,j=0,k=0,l=0,m=0;m=i;i=i+32|0;f=m+16|0;h=m+12|0;j=m+8|0;k=m+4|0;l=m;c[f>>2]=a;c[h>>2]=b;c[j>>2]=d;g[l>>2]=0.0;c[k>>2]=0;while(1){e=+g[l>>2];if((c[k>>2]|0)>=(c[j>>2]|0))break;g[l>>2]=e+ +g[(c[f>>2]|0)+(c[k>>2]<<2)>>2]*+g[(c[h>>2]|0)+(c[k>>2]<<2)>>2];c[k>>2]=(c[k>>2]|0)+1}i=m;return +e}function Db(a,d,e,f,h,j,k,l,m,n,o,p,q,r,s,t,u,v,w){a=a|0;d=d|0;e=e|0;f=f|0;h=h|0;j=j|0;k=k|0;l=l|0;m=m|0;n=+n;o=o|0;p=+p;q=q|0;r=+r;s=s|0;t=t|0;u=u|0;v=+v;w=+w;var x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0;ea=i;i=i+144|0;ga=ea+140|0;D=ea+136|0;aa=ea+132|0;P=ea+128|0;X=ea+124|0;fa=ea+120|0;Q=ea+116|0;x=ea+112|0;Y=ea+108|0;y=ea+104|0;E=ea+100|0;V=ea+96|0;H=ea+92|0;N=ea+88|0;F=ea+84|0;O=ea+80|0;W=ea+76|0;I=ea+72|0;$=ea+68|0;ca=ea+64|0;J=ea+60|0;z=ea+56|0;G=ea+52|0;U=ea+48|0;S=ea+44|0;A=ea+40|0;B=ea+36|0;C=ea+32|0;M=ea+28|0;L=ea+24|0;K=ea+20|0;T=ea+16|0;R=ea+12|0;Z=ea+8|0;ba=ea+4|0;da=ea;c[ga>>2]=a;c[D>>2]=d;c[aa>>2]=e;c[P>>2]=f;c[X>>2]=h;c[fa>>2]=j;c[Q>>2]=k;c[x>>2]=l;c[Y>>2]=m;g[y>>2]=n;c[E>>2]=o;g[V>>2]=p;c[H>>2]=q;g[N>>2]=r;c[F>>2]=s;c[O>>2]=t;c[W>>2]=u;g[I>>2]=v;g[$>>2]=w;c[U>>2]=c[(c[ga>>2]|0)+8>>2];c[S>>2]=c[(c[ga>>2]|0)+32>>2];c[z>>2]=c[fa>>2]|0?c[fa>>2]|0:c[U>>2]|0;c[J>>2]=b[(c[S>>2]|0)+(c[z>>2]<<1)>>1]<<c[P>>2];if((c[Q>>2]|0)==2)c[J>>2]=(c[J>>2]|0)+(b[(c[S>>2]|0)+(((c[x>>2]|0)<(c[z>>2]|0)?c[x>>2]|0:c[z>>2]|0)<<1)>>1]<<c[P>>2]);c[ca>>2]=c[aa>>2];if(c[c[D>>2]>>2]|0?+g[(c[D>>2]|0)+16>>2]<.4:0)c[ca>>2]=(c[ca>>2]|0)-~~(+(c[J>>2]<<3|0)*(.4000000059604645-+g[(c[D>>2]|0)+16>>2]));if((c[Q>>2]|0)==2){c[A>>2]=(c[x>>2]|0)<(c[z>>2]|0)?c[x>>2]|0:c[z>>2]|0;c[B>>2]=(b[(c[S>>2]|0)+(c[A>>2]<<1)>>1]<<c[P>>2])-(c[A>>2]|0);g[C>>2]=+(c[B>>2]|0)*.800000011920929/+(c[J>>2]|0);g[y>>2]=+g[y>>2]<1.0?+g[y>>2]:1.0;if(+g[C>>2]*+(c[ca>>2]|0)<(+g[y>>2]-.10000000149011612)*+(c[B>>2]<<3|0))r=+g[C>>2]*+(c[ca>>2]|0);else r=(+g[y>>2]-.10000000149011612)*+(c[B>>2]<<3|0);c[ca>>2]=(c[ca>>2]|0)-~~r}c[ca>>2]=(c[ca>>2]|0)+((c[E>>2]|0)-(16<<c[P>>2]));g[G>>2]=(c[F>>2]|0)==5010?.019999999552965164:.03999999910593033;c[ca>>2]=(c[ca>>2]|0)+~~((+g[V>>2]-+g[G>>2])*+(c[ca>>2]|0));if(!(c[O>>2]|0?1:(c[c[D>>2]>>2]|0)==0)){if(0.0>+g[(c[D>>2]|0)+4>>2]-.15000000596046448)r=0.0;else r=+g[(c[D>>2]|0)+4>>2]-.15000000596046448;g[L>>2]=r-.09000000357627869;c[M>>2]=(c[ca>>2]|0)+~~(+(c[J>>2]<<3|0)*1.2000000476837158*+g[L>>2]);if(c[H>>2]|0)c[M>>2]=(c[M>>2]|0)+~~(+(c[J>>2]<<3|0)*.800000011920929);c[ca>>2]=c[M>>2]}if(!((c[W>>2]|0)==0|(c[O>>2]|0)!=0)){c[K>>2]=(c[ca>>2]|0)+~~(+g[I>>2]*+(c[J>>2]<<3|0));if(((c[ca>>2]|0)/4|0|0)>(c[K>>2]|0))x=(c[ca>>2]|0)/4|0;else x=c[K>>2]|0;c[ca>>2]=x}c[R>>2]=b[(c[S>>2]|0)+((c[U>>2]|0)-2<<1)>>1]<<c[P>>2];p=+((_(c[Q>>2]|0,c[R>>2]|0)|0)<<3|0);c[T>>2]=~~(p*+g[N>>2]);c[T>>2]=(c[T>>2]|0)>(c[ca>>2]>>2|0)?c[T>>2]|0:c[ca>>2]>>2;c[ca>>2]=(c[ca>>2]|0)<(c[T>>2]|0)?c[ca>>2]|0:c[T>>2]|0;if((c[W>>2]|0)==0|(c[O>>2]|0)!=0?(c[Y>>2]|0)!=0|(c[X>>2]|0)<64e3:0){if(0.0>+((c[X>>2]|0)-32e3|0)*.000030517578125)r=0.0;else r=+((c[X>>2]|0)-32e3|0)*.000030517578125;g[Z>>2]=r;if(c[Y>>2]|0)g[Z>>2]=+g[Z>>2]<.6700000166893005?+g[Z>>2]:.6700000166893005;c[ca>>2]=(c[aa>>2]|0)+~~(+g[Z>>2]*+((c[ca>>2]|0)-(c[aa>>2]|0)|0))}if(!((c[W>>2]|0)==0&+g[V>>2]<.20000000298023224)){fa=c[aa>>2]|0;fa=fa<<1;da=c[ca>>2]|0;da=(fa|0)<(da|0);fa=c[aa>>2]|0;fa=fa<<1;ga=c[ca>>2]|0;ga=da?fa:ga;c[ca>>2]=ga;ga=c[ca>>2]|0;i=ea;return ga|0}if(0>((32e3<(96e3-(c[X>>2]|0)|0)?32e3:96e3-(c[X>>2]|0)|0)|0))x=0;else x=32e3<(96e3-(c[X>>2]|0)|0)?32e3:96e3-(c[X>>2]|0)|0;g[ba>>2]=+(x|0)*3.099999958067201e-06;g[da>>2]=+g[$>>2]*+g[ba>>2];c[ca>>2]=(c[ca>>2]|0)+~~(+g[da>>2]*+(c[ca>>2]|0));fa=c[aa>>2]|0;fa=fa<<1;da=c[ca>>2]|0;da=(fa|0)<(da|0);fa=c[aa>>2]|0;fa=fa<<1;ga=c[ca>>2]|0;ga=da?fa:ga;c[ca>>2]=ga;ga=c[ca>>2]|0;i=ea;return ga|0}function Eb(a){a=a|0;var b=0,d=0;d=i;i=i+16|0;b=d;c[b>>2]=a;i=d;return c[(c[b>>2]|0)+44>>2]|0}function Fb(a){a=a|0;var b=0,d=0,e=0;b=i;i=i+16|0;d=b+4|0;e=b;c[d>>2]=a;c[e>>2]=Jc(48e3,960,0)|0;a=Gb(c[e>>2]|0,c[d>>2]|0)|0;i=b;return a|0}function Gb(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;e=i;i=i+16|0;f=e+8|0;g=e+4|0;d=e;c[f>>2]=a;c[g>>2]=b;a=88+((_(c[g>>2]|0,2048+(c[(c[f>>2]|0)+4>>2]|0)|0)|0)-1<<2)|0;c[d>>2]=a+((c[g>>2]|0)*24<<2)+(c[(c[f>>2]|0)+8>>2]<<3<<2);i=e;return c[d>>2]|0}function Hb(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0;j=i;i=i+32|0;e=j+16|0;f=j+12|0;g=j+8|0;k=j+4|0;h=j;c[f>>2]=a;c[g>>2]=b;c[k>>2]=d;b=c[f>>2]|0;a=Jc(48e3,960,0)|0;c[h>>2]=Ib(b,a,c[k>>2]|0)|0;if(c[h>>2]|0){c[e>>2]=c[h>>2];k=c[e>>2]|0;i=j;return k|0}k=bb(c[g>>2]|0)|0;c[(c[f>>2]|0)+16>>2]=k;if(!(c[(c[f>>2]|0)+16>>2]|0)){c[e>>2]=-1;k=c[e>>2]|0;i=j;return k|0}else{c[e>>2]=0;k=c[e>>2]|0;i=j;return k|0}return 0}function Ib(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;j=i;i=i+32|0;e=j+16|0;f=j+12|0;g=j+8|0;h=j+4|0;c[f>>2]=a;c[g>>2]=b;c[h>>2]=d;if((c[h>>2]|0)<0|(c[h>>2]|0)>2){c[e>>2]=-1;a=c[e>>2]|0;i=j;return a|0}if(!(c[f>>2]|0)){c[e>>2]=-7;a=c[e>>2]|0;i=j;return a|0}else{a=c[f>>2]|0;oj(a|0,0,Gb(c[g>>2]|0,c[h>>2]|0)|0)|0;c[c[f>>2]>>2]=c[g>>2];c[(c[f>>2]|0)+4>>2]=c[(c[g>>2]|0)+4>>2];a=c[h>>2]|0;c[(c[f>>2]|0)+8>>2]=a;c[(c[f>>2]|0)+12>>2]=a;c[(c[f>>2]|0)+16>>2]=1;c[(c[f>>2]|0)+20>>2]=0;c[(c[f>>2]|0)+24>>2]=c[(c[c[f>>2]>>2]|0)+12>>2];c[(c[f>>2]|0)+28>>2]=1;a=Jb()|0;c[(c[f>>2]|0)+32>>2]=a;c[(c[f>>2]|0)+48>>2]=0;Kb(c[f>>2]|0,4028,j)|0;c[e>>2]=0;a=c[e>>2]|0;i=j;return a|0}return 0}function Jb(){return 0}function Kb(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;x=i;i=i+96|0;w=x+80|0;e=x+76|0;y=x+72|0;f=x+56|0;n=x+52|0;o=x+48|0;p=x+44|0;q=x+40|0;r=x+36|0;h=x+32|0;j=x+28|0;k=x+24|0;l=x+20|0;m=x+16|0;s=x+12|0;t=x+8|0;u=x+4|0;v=x;c[e>>2]=a;c[y>>2]=b;c[f>>2]=d;a:do switch(c[y>>2]|0){case 10010:{d=(c[f>>2]|0)+(4-1)&~(4-1);y=c[d>>2]|0;c[f>>2]=d+4;c[n>>2]=y;if((c[n>>2]|0)>=0?(c[n>>2]|0)<(c[(c[c[e>>2]>>2]|0)+8>>2]|0):0){c[(c[e>>2]|0)+20>>2]=c[n>>2];e=24}else e=25;break}case 10012:{d=(c[f>>2]|0)+(4-1)&~(4-1);y=c[d>>2]|0;c[f>>2]=d+4;c[o>>2]=y;if((c[o>>2]|0)>=1?(c[o>>2]|0)<=(c[(c[c[e>>2]>>2]|0)+8>>2]|0):0){c[(c[e>>2]|0)+24>>2]=c[o>>2];e=24}else e=25;break}case 10008:{d=(c[f>>2]|0)+(4-1)&~(4-1);y=c[d>>2]|0;c[f>>2]=d+4;c[p>>2]=y;if((c[p>>2]|0)<1|(c[p>>2]|0)>2)e=25;else{c[(c[e>>2]|0)+12>>2]=c[p>>2];e=24}break}case 10007:{d=(c[f>>2]|0)+(4-1)&~(4-1);y=c[d>>2]|0;c[f>>2]=d+4;c[q>>2]=y;if(!(c[q>>2]|0))e=25;else{c[c[q>>2]>>2]=c[(c[e>>2]|0)+40>>2];c[(c[e>>2]|0)+40>>2]=0;e=24}break}case 4027:{d=(c[f>>2]|0)+(4-1)&~(4-1);y=c[d>>2]|0;c[f>>2]=d+4;c[r>>2]=y;if(!(c[r>>2]|0))e=25;else{c[c[r>>2]>>2]=(c[(c[e>>2]|0)+4>>2]|0)/(c[(c[e>>2]|0)+16>>2]|0)|0;e=24}break}case 4028:{c[j>>2]=(c[e>>2]|0)+84+((_(2048+(c[(c[e>>2]|0)+4>>2]|0)|0,c[(c[e>>2]|0)+8>>2]|0)|0)<<2);c[k>>2]=(c[j>>2]|0)+((c[(c[e>>2]|0)+8>>2]|0)*24<<2);c[l>>2]=(c[k>>2]|0)+(c[(c[c[e>>2]>>2]|0)+8>>2]<<1<<2);c[m>>2]=(c[l>>2]|0)+(c[(c[c[e>>2]>>2]|0)+8>>2]<<1<<2);oj((c[e>>2]|0)+36|0,0,(Gb(c[c[e>>2]>>2]|0,c[(c[e>>2]|0)+8>>2]|0)|0)-((c[e>>2]|0)+36-(c[e>>2]|0))|0)|0;c[h>>2]=0;while(1){if((c[h>>2]|0)>=(c[(c[c[e>>2]>>2]|0)+8>>2]<<1|0)){e=24;break a}g[(c[m>>2]|0)+(c[h>>2]<<2)>>2]=-28.0;g[(c[l>>2]|0)+(c[h>>2]<<2)>>2]=-28.0;c[h>>2]=(c[h>>2]|0)+1}}case 4033:{d=(c[f>>2]|0)+(4-1)&~(4-1);y=c[d>>2]|0;c[f>>2]=d+4;c[s>>2]=y;if(!(c[s>>2]|0))e=25;else{c[c[s>>2]>>2]=c[(c[e>>2]|0)+52>>2];e=24}break}case 10015:{d=(c[f>>2]|0)+(4-1)&~(4-1);y=c[d>>2]|0;c[f>>2]=d+4;c[t>>2]=y;if(!(c[t>>2]|0))e=25;else{c[c[t>>2]>>2]=c[c[e>>2]>>2];e=24}break}case 10016:{d=(c[f>>2]|0)+(4-1)&~(4-1);y=c[d>>2]|0;c[f>>2]=d+4;c[u>>2]=y;c[(c[e>>2]|0)+28>>2]=c[u>>2];e=24;break}case 4031:{d=(c[f>>2]|0)+(4-1)&~(4-1);y=c[d>>2]|0;c[f>>2]=d+4;c[v>>2]=y;if(!(c[v>>2]|0))e=25;else{c[c[v>>2]>>2]=c[(c[e>>2]|0)+36>>2];e=24}break}default:{c[w>>2]=-5;y=c[w>>2]|0;i=x;return y|0}}while(0);if((e|0)==24){c[w>>2]=0;y=c[w>>2]|0;i=x;return y|0}else if((e|0)==25){c[w>>2]=-1;y=c[w>>2]|0;i=x;return y|0}return 0} |
| | | function ye(d,e,f,g,h,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D){d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|0;m=m|0;n=n|0;o=o|0;p=p|0;q=q|0;r=r|0;s=s|0;t=t|0;u=u|0;v=v|0;w=w|0;x=x|0;y=y|0;z=z|0;A=A|0;B=B|0;C=C|0;D=D|0;var E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ja=0,ka=0,la=0,ma=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0;Na=i;i=i+256|0;E=Na+240|0;Ha=Na+236|0;N=Na+232|0;T=Na+228|0;U=Na+224|0;V=Na+220|0;W=Na+216|0;X=Na+212|0;Y=Na+208|0;Z=Na+204|0;F=Na+200|0;G=Na+196|0;H=Na+192|0;I=Na+188|0;J=Na+184|0;Oa=Na+180|0;K=Na+176|0;L=Na+172|0;Ia=Na+168|0;M=Na+164|0;O=Na+160|0;P=Na+156|0;Q=Na+152|0;Ja=Na+148|0;R=Na+144|0;S=Na+140|0;la=Na+136|0;ma=Na+132|0;La=Na+128|0;ha=Na+124|0;ga=Na+120|0;ea=Na+116|0;oa=Na+112|0;ja=Na+108|0;ca=Na+104|0;ba=Na+100|0;pa=Na+96|0;ra=Na+92|0;qa=Na+88|0;ya=Na+84|0;Ba=Na+80|0;za=Na+76|0;Aa=Na+72|0;fa=Na+68|0;da=Na+64|0;va=Na+60|0;wa=Na+56|0;xa=Na+52|0;ka=Na+48|0;aa=Na+44|0;Ga=Na+40|0;$=Na+36|0;Ea=Na+32|0;Fa=Na+28|0;Ca=Na+24|0;sa=Na+20|0;Da=Na+16|0;ta=Na+12|0;Ma=Na+8|0;ua=Na+4|0;Ka=Na;c[E>>2]=d;c[Ha>>2]=e;c[N>>2]=f;c[T>>2]=g;c[U>>2]=h;c[V>>2]=j;c[W>>2]=k;c[X>>2]=l;c[Y>>2]=m;c[Z>>2]=n;c[F>>2]=o;c[G>>2]=p;c[H>>2]=q;c[I>>2]=r;c[J>>2]=s;c[Oa>>2]=t;c[K>>2]=u;c[L>>2]=v;c[Ia>>2]=w;c[M>>2]=x;c[O>>2]=y;c[P>>2]=z;c[Q>>2]=A;c[Ja>>2]=B;c[R>>2]=C;c[S>>2]=D;j=c[Ja>>2]|0;c[Ka>>2]=ia()|0;t=i;i=i+((1*(j*48|0)|0)+15&-16)|0;c[Da>>2]=(c[E>>2]|0)+1280+((c[(c[E>>2]|0)+4364>>2]|0)-(c[G>>2]|0)+1<<2);c[sa>>2]=(c[W>>2]|0)+((c[(c[E>>2]|0)+4360>>2]|0)-(c[G>>2]|0)+2<<2);c[$>>2]=c[Oa>>2]>>6;c[la>>2]=0;while(1){if((c[la>>2]|0)>=(c[Ia>>2]|0))break;if((c[N>>2]|0)==2){c[ca>>2]=2;Oa=_(c[c[sa>>2]>>2]>>16,b[c[Z>>2]>>1]|0)|0;c[ca>>2]=(c[ca>>2]|0)+(Oa+((_(c[c[sa>>2]>>2]&65535,b[c[Z>>2]>>1]|0)|0)>>16));Oa=_(c[(c[sa>>2]|0)+-4>>2]>>16,b[(c[Z>>2]|0)+2>>1]|0)|0;c[ca>>2]=(c[ca>>2]|0)+(Oa+((_(c[(c[sa>>2]|0)+-4>>2]&65535,b[(c[Z>>2]|0)+2>>1]|0)|0)>>16));Oa=_(c[(c[sa>>2]|0)+-8>>2]>>16,b[(c[Z>>2]|0)+4>>1]|0)|0;c[ca>>2]=(c[ca>>2]|0)+(Oa+((_(c[(c[sa>>2]|0)+-8>>2]&65535,b[(c[Z>>2]|0)+4>>1]|0)|0)>>16));Oa=_(c[(c[sa>>2]|0)+-12>>2]>>16,b[(c[Z>>2]|0)+6>>1]|0)|0;c[ca>>2]=(c[ca>>2]|0)+(Oa+((_(c[(c[sa>>2]|0)+-12>>2]&65535,b[(c[Z>>2]|0)+6>>1]|0)|0)>>16));Oa=_(c[(c[sa>>2]|0)+-16>>2]>>16,b[(c[Z>>2]|0)+8>>1]|0)|0;c[ca>>2]=(c[ca>>2]|0)+(Oa+((_(c[(c[sa>>2]|0)+-16>>2]&65535,b[(c[Z>>2]|0)+8>>1]|0)|0)>>16));c[ca>>2]=c[ca>>2]<<1;c[sa>>2]=(c[sa>>2]|0)+4}else c[ca>>2]=0;if((c[G>>2]|0)>0){Oa=_((c[c[Da>>2]>>2]|0)+(c[(c[Da>>2]|0)+-8>>2]|0)>>16,(c[H>>2]&65535)<<16>>16)|0;c[ra>>2]=Oa+((_((c[c[Da>>2]>>2]|0)+(c[(c[Da>>2]|0)+-8>>2]|0)&65535,(c[H>>2]&65535)<<16>>16)|0)>>16);Oa=(c[ra>>2]|0)+(_(c[(c[Da>>2]|0)+-4>>2]>>16,c[H>>2]>>16)|0)|0;c[ra>>2]=Oa+((_(c[(c[Da>>2]|0)+-4>>2]&65535,c[H>>2]>>16)|0)>>16);c[ra>>2]=(c[ca>>2]|0)-(c[ra>>2]<<2);c[Da>>2]=(c[Da>>2]|0)+4}else c[ra>>2]=0;c[La>>2]=0;while(1){if((c[La>>2]|0)>=(c[Ja>>2]|0))break;c[Ma>>2]=(c[Ha>>2]|0)+((c[La>>2]|0)*1168|0);c[ua>>2]=t+((c[La>>2]|0)*48|0);Oa=907633515+(_(c[(c[Ma>>2]|0)+1156>>2]|0,196314165)|0)|0;c[(c[Ma>>2]|0)+1156>>2]=Oa;c[ta>>2]=(c[Ma>>2]|0)+(31+(c[la>>2]|0)<<2);c[ba>>2]=c[P>>2]>>1;Oa=_(c[c[ta>>2]>>2]>>16,b[c[Y>>2]>>1]|0)|0;c[ba>>2]=(c[ba>>2]|0)+(Oa+((_(c[c[ta>>2]>>2]&65535,b[c[Y>>2]>>1]|0)|0)>>16));Oa=_(c[(c[ta>>2]|0)+-4>>2]>>16,b[(c[Y>>2]|0)+2>>1]|0)|0;c[ba>>2]=(c[ba>>2]|0)+(Oa+((_(c[(c[ta>>2]|0)+-4>>2]&65535,b[(c[Y>>2]|0)+2>>1]|0)|0)>>16));Oa=_(c[(c[ta>>2]|0)+-8>>2]>>16,b[(c[Y>>2]|0)+4>>1]|0)|0;c[ba>>2]=(c[ba>>2]|0)+(Oa+((_(c[(c[ta>>2]|0)+-8>>2]&65535,b[(c[Y>>2]|0)+4>>1]|0)|0)>>16));Oa=_(c[(c[ta>>2]|0)+-12>>2]>>16,b[(c[Y>>2]|0)+6>>1]|0)|0;c[ba>>2]=(c[ba>>2]|0)+(Oa+((_(c[(c[ta>>2]|0)+-12>>2]&65535,b[(c[Y>>2]|0)+6>>1]|0)|0)>>16));Oa=_(c[(c[ta>>2]|0)+-16>>2]>>16,b[(c[Y>>2]|0)+8>>1]|0)|0;c[ba>>2]=(c[ba>>2]|0)+(Oa+((_(c[(c[ta>>2]|0)+-16>>2]&65535,b[(c[Y>>2]|0)+8>>1]|0)|0)>>16));Oa=_(c[(c[ta>>2]|0)+-20>>2]>>16,b[(c[Y>>2]|0)+10>>1]|0)|0;c[ba>>2]=(c[ba>>2]|0)+(Oa+((_(c[(c[ta>>2]|0)+-20>>2]&65535,b[(c[Y>>2]|0)+10>>1]|0)|0)>>16));Oa=_(c[(c[ta>>2]|0)+-24>>2]>>16,b[(c[Y>>2]|0)+12>>1]|0)|0;c[ba>>2]=(c[ba>>2]|0)+(Oa+((_(c[(c[ta>>2]|0)+-24>>2]&65535,b[(c[Y>>2]|0)+12>>1]|0)|0)>>16));Oa=_(c[(c[ta>>2]|0)+-28>>2]>>16,b[(c[Y>>2]|0)+14>>1]|0)|0;c[ba>>2]=(c[ba>>2]|0)+(Oa+((_(c[(c[ta>>2]|0)+-28>>2]&65535,b[(c[Y>>2]|0)+14>>1]|0)|0)>>16));Oa=_(c[(c[ta>>2]|0)+-32>>2]>>16,b[(c[Y>>2]|0)+16>>1]|0)|0;c[ba>>2]=(c[ba>>2]|0)+(Oa+((_(c[(c[ta>>2]|0)+-32>>2]&65535,b[(c[Y>>2]|0)+16>>1]|0)|0)>>16));Oa=_(c[(c[ta>>2]|0)+-36>>2]>>16,b[(c[Y>>2]|0)+18>>1]|0)|0;c[ba>>2]=(c[ba>>2]|0)+(Oa+((_(c[(c[ta>>2]|0)+-36>>2]&65535,b[(c[Y>>2]|0)+18>>1]|0)|0)>>16));if((c[P>>2]|0)==16){Oa=_(c[(c[ta>>2]|0)+-40>>2]>>16,b[(c[Y>>2]|0)+20>>1]|0)|0;c[ba>>2]=(c[ba>>2]|0)+(Oa+((_(c[(c[ta>>2]|0)+-40>>2]&65535,b[(c[Y>>2]|0)+20>>1]|0)|0)>>16));Oa=_(c[(c[ta>>2]|0)+-44>>2]>>16,b[(c[Y>>2]|0)+22>>1]|0)|0;c[ba>>2]=(c[ba>>2]|0)+(Oa+((_(c[(c[ta>>2]|0)+-44>>2]&65535,b[(c[Y>>2]|0)+22>>1]|0)|0)>>16));Oa=_(c[(c[ta>>2]|0)+-48>>2]>>16,b[(c[Y>>2]|0)+24>>1]|0)|0;c[ba>>2]=(c[ba>>2]|0)+(Oa+((_(c[(c[ta>>2]|0)+-48>>2]&65535,b[(c[Y>>2]|0)+24>>1]|0)|0)>>16));Oa=_(c[(c[ta>>2]|0)+-52>>2]>>16,b[(c[Y>>2]|0)+26>>1]|0)|0;c[ba>>2]=(c[ba>>2]|0)+(Oa+((_(c[(c[ta>>2]|0)+-52>>2]&65535,b[(c[Y>>2]|0)+26>>1]|0)|0)>>16));Oa=_(c[(c[ta>>2]|0)+-56>>2]>>16,b[(c[Y>>2]|0)+28>>1]|0)|0;c[ba>>2]=(c[ba>>2]|0)+(Oa+((_(c[(c[ta>>2]|0)+-56>>2]&65535,b[(c[Y>>2]|0)+28>>1]|0)|0)>>16));Oa=_(c[(c[ta>>2]|0)+-60>>2]>>16,b[(c[Y>>2]|0)+30>>1]|0)|0;c[ba>>2]=(c[ba>>2]|0)+(Oa+((_(c[(c[ta>>2]|0)+-60>>2]&65535,b[(c[Y>>2]|0)+30>>1]|0)|0)>>16))}c[ba>>2]=c[ba>>2]<<4;Oa=_(c[(c[Ma>>2]|0)+1088>>2]>>16,(c[Q>>2]&65535)<<16>>16)|0;c[Fa>>2]=(c[c[ta>>2]>>2]|0)+(Oa+((_(c[(c[Ma>>2]|0)+1088>>2]&65535,(c[Q>>2]&65535)<<16>>16)|0)>>16));Oa=_((c[(c[Ma>>2]|0)+1088+4>>2]|0)-(c[Fa>>2]|0)>>16,(c[Q>>2]&65535)<<16>>16)|0;c[Ea>>2]=(c[(c[Ma>>2]|0)+1088>>2]|0)+(Oa+((_((c[(c[Ma>>2]|0)+1088+4>>2]|0)-(c[Fa>>2]|0)&65535,(c[Q>>2]&65535)<<16>>16)|0)>>16));c[(c[Ma>>2]|0)+1088>>2]=c[Fa>>2];c[pa>>2]=c[O>>2]>>1;Oa=_(c[Fa>>2]>>16,b[c[F>>2]>>1]|0)|0;c[pa>>2]=(c[pa>>2]|0)+(Oa+((_(c[Fa>>2]&65535,b[c[F>>2]>>1]|0)|0)>>16));c[ma>>2]=2;while(1){if((c[ma>>2]|0)>=(c[O>>2]|0))break;Oa=_((c[(c[Ma>>2]|0)+1088+((c[ma>>2]|0)+0<<2)>>2]|0)-(c[Ea>>2]|0)>>16,(c[Q>>2]&65535)<<16>>16)|0;c[Fa>>2]=(c[(c[Ma>>2]|0)+1088+((c[ma>>2]|0)-1<<2)>>2]|0)+(Oa+((_((c[(c[Ma>>2]|0)+1088+((c[ma>>2]|0)+0<<2)>>2]|0)-(c[Ea>>2]|0)&65535,(c[Q>>2]&65535)<<16>>16)|0)>>16));c[(c[Ma>>2]|0)+1088+((c[ma>>2]|0)-1<<2)>>2]=c[Ea>>2];Oa=_(c[Ea>>2]>>16,b[(c[F>>2]|0)+((c[ma>>2]|0)-1<<1)>>1]|0)|0;c[pa>>2]=(c[pa>>2]|0)+(Oa+((_(c[Ea>>2]&65535,b[(c[F>>2]|0)+((c[ma>>2]|0)-1<<1)>>1]|0)|0)>>16));Oa=_((c[(c[Ma>>2]|0)+1088+((c[ma>>2]|0)+1<<2)>>2]|0)-(c[Fa>>2]|0)>>16,(c[Q>>2]&65535)<<16>>16)|0;c[Ea>>2]=(c[(c[Ma>>2]|0)+1088+((c[ma>>2]|0)+0<<2)>>2]|0)+(Oa+((_((c[(c[Ma>>2]|0)+1088+((c[ma>>2]|0)+1<<2)>>2]|0)-(c[Fa>>2]|0)&65535,(c[Q>>2]&65535)<<16>>16)|0)>>16));c[(c[Ma>>2]|0)+1088+((c[ma>>2]|0)+0<<2)>>2]=c[Fa>>2];Oa=_(c[Fa>>2]>>16,b[(c[F>>2]|0)+(c[ma>>2]<<1)>>1]|0)|0;c[pa>>2]=(c[pa>>2]|0)+(Oa+((_(c[Fa>>2]&65535,b[(c[F>>2]|0)+(c[ma>>2]<<1)>>1]|0)|0)>>16));c[ma>>2]=(c[ma>>2]|0)+2}c[(c[Ma>>2]|0)+1088+((c[O>>2]|0)-1<<2)>>2]=c[Ea>>2];Oa=_(c[Ea>>2]>>16,b[(c[F>>2]|0)+((c[O>>2]|0)-1<<1)>>1]|0)|0;c[pa>>2]=(c[pa>>2]|0)+(Oa+((_(c[Ea>>2]&65535,b[(c[F>>2]|0)+((c[O>>2]|0)-1<<1)>>1]|0)|0)>>16));c[pa>>2]=c[pa>>2]<<1;Oa=_(c[(c[Ma>>2]|0)+1152>>2]>>16,(c[I>>2]&65535)<<16>>16)|0;c[pa>>2]=(c[pa>>2]|0)+(Oa+((_(c[(c[Ma>>2]|0)+1152>>2]&65535,(c[I>>2]&65535)<<16>>16)|0)>>16));c[pa>>2]=c[pa>>2]<<2;Oa=_(c[(c[Ma>>2]|0)+960+(c[c[R>>2]>>2]<<2)>>2]>>16,(c[J>>2]&65535)<<16>>16)|0;c[qa>>2]=Oa+((_(c[(c[Ma>>2]|0)+960+(c[c[R>>2]>>2]<<2)>>2]&65535,(c[J>>2]&65535)<<16>>16)|0)>>16);Oa=(c[qa>>2]|0)+(_(c[(c[Ma>>2]|0)+1152>>2]>>16,c[J>>2]>>16)|0)|0;c[qa>>2]=Oa+((_(c[(c[Ma>>2]|0)+1152>>2]&65535,c[J>>2]>>16)|0)>>16);c[qa>>2]=c[qa>>2]<<2;c[Ea>>2]=(c[pa>>2]|0)+(c[qa>>2]|0);c[Fa>>2]=(c[ra>>2]|0)+(c[ba>>2]|0);c[Ea>>2]=(c[Fa>>2]|0)-(c[Ea>>2]|0);c[Ea>>2]=(c[Ea>>2]>>3)+1>>1;c[ya>>2]=(c[(c[T>>2]|0)+(c[la>>2]<<2)>>2]|0)-(c[Ea>>2]|0);if((c[(c[Ma>>2]|0)+1156>>2]|0)<0)c[ya>>2]=0-(c[ya>>2]|0);if((c[ya>>2]|0)>30720)o=30720;else o=(c[ya>>2]|0)<-31744?-31744:c[ya>>2]|0;c[ya>>2]=o;c[wa>>2]=(c[ya>>2]|0)-(c[L>>2]|0);c[va>>2]=c[wa>>2]>>10;o=c[va>>2]|0;do if((c[va>>2]|0)<=0){if(!o){c[wa>>2]=c[L>>2];c[xa>>2]=(c[wa>>2]|0)+944;c[za>>2]=_((c[wa>>2]&65535)<<16>>16,(c[K>>2]&65535)<<16>>16)|0;c[Aa>>2]=_((c[xa>>2]&65535)<<16>>16,(c[K>>2]&65535)<<16>>16)|0;break}if((c[va>>2]|0)==-1){c[xa>>2]=c[L>>2];c[wa>>2]=(c[xa>>2]|0)-944;c[za>>2]=_((0-(c[wa>>2]|0)&65535)<<16>>16,(c[K>>2]&65535)<<16>>16)|0;c[Aa>>2]=_((c[xa>>2]&65535)<<16>>16,(c[K>>2]&65535)<<16>>16)|0;break}else{c[wa>>2]=(c[va>>2]<<10)+80;c[wa>>2]=(c[wa>>2]|0)+(c[L>>2]|0);c[xa>>2]=(c[wa>>2]|0)+1024;c[za>>2]=_((0-(c[wa>>2]|0)&65535)<<16>>16,(c[K>>2]&65535)<<16>>16)|0;c[Aa>>2]=_((0-(c[xa>>2]|0)&65535)<<16>>16,(c[K>>2]&65535)<<16>>16)|0;break}}else{c[wa>>2]=(o<<10)-80;c[wa>>2]=(c[wa>>2]|0)+(c[L>>2]|0);c[xa>>2]=(c[wa>>2]|0)+1024;c[za>>2]=_((c[wa>>2]&65535)<<16>>16,(c[K>>2]&65535)<<16>>16)|0;c[Aa>>2]=_((c[xa>>2]&65535)<<16>>16,(c[K>>2]&65535)<<16>>16)|0}while(0);c[Ba>>2]=(c[ya>>2]|0)-(c[wa>>2]|0);c[za>>2]=(c[za>>2]|0)+(_((c[Ba>>2]&65535)<<16>>16,(c[Ba>>2]&65535)<<16>>16)|0)>>10;c[Ba>>2]=(c[ya>>2]|0)-(c[xa>>2]|0);c[Aa>>2]=(c[Aa>>2]|0)+(_((c[Ba>>2]&65535)<<16>>16,(c[Ba>>2]&65535)<<16>>16)|0)>>10;o=c[(c[Ma>>2]|0)+1164>>2]|0;if((c[za>>2]|0)<(c[Aa>>2]|0)){c[(c[ua>>2]|0)+4>>2]=o+(c[za>>2]|0);c[(c[ua>>2]|0)+24+4>>2]=(c[(c[Ma>>2]|0)+1164>>2]|0)+(c[Aa>>2]|0);c[c[ua>>2]>>2]=c[wa>>2];c[(c[ua>>2]|0)+24>>2]=c[xa>>2]}else{c[(c[ua>>2]|0)+4>>2]=o+(c[Aa>>2]|0);c[(c[ua>>2]|0)+24+4>>2]=(c[(c[Ma>>2]|0)+1164>>2]|0)+(c[za>>2]|0);c[c[ua>>2]>>2]=c[xa>>2];c[(c[ua>>2]|0)+24>>2]=c[wa>>2]}c[ka>>2]=c[c[ua>>2]>>2]<<4;if((c[(c[Ma>>2]|0)+1156>>2]|0)<0)c[ka>>2]=0-(c[ka>>2]|0);c[aa>>2]=(c[ka>>2]|0)+(c[ca>>2]|0);c[Ga>>2]=(c[aa>>2]|0)+(c[ba>>2]|0);c[Ca>>2]=(c[Ga>>2]|0)-(c[pa>>2]|0);c[(c[ua>>2]|0)+16>>2]=(c[Ca>>2]|0)-(c[qa>>2]|0);c[(c[ua>>2]|0)+12>>2]=c[Ca>>2];c[(c[ua>>2]|0)+20>>2]=c[aa>>2];c[(c[ua>>2]|0)+8>>2]=c[Ga>>2];c[ka>>2]=c[(c[ua>>2]|0)+24>>2]<<4;if((c[(c[Ma>>2]|0)+1156>>2]|0)<0)c[ka>>2]=0-(c[ka>>2]|0);c[aa>>2]=(c[ka>>2]|0)+(c[ca>>2]|0);c[Ga>>2]=(c[aa>>2]|0)+(c[ba>>2]|0);c[Ca>>2]=(c[Ga>>2]|0)-(c[pa>>2]|0);c[(c[ua>>2]|0)+24+16>>2]=(c[Ca>>2]|0)-(c[qa>>2]|0);c[(c[ua>>2]|0)+24+12>>2]=c[Ca>>2];c[(c[ua>>2]|0)+24+20>>2]=c[aa>>2];c[(c[ua>>2]|0)+24+8>>2]=c[Ga>>2];c[La>>2]=(c[La>>2]|0)+1}c[c[R>>2]>>2]=(c[c[R>>2]>>2]|0)-1&31;c[oa>>2]=(c[c[R>>2]>>2]|0)+(c[S>>2]|0)&31;c[fa>>2]=c[t+4>>2];c[ha>>2]=0;c[La>>2]=1;while(1){if((c[La>>2]|0)>=(c[Ja>>2]|0))break;if((c[t+((c[La>>2]|0)*48|0)+4>>2]|0)<(c[fa>>2]|0)){c[fa>>2]=c[t+((c[La>>2]|0)*48|0)+4>>2];c[ha>>2]=c[La>>2]}c[La>>2]=(c[La>>2]|0)+1}c[ja>>2]=c[(c[Ha>>2]|0)+((c[ha>>2]|0)*1168|0)+448+(c[oa>>2]<<2)>>2];c[La>>2]=0;while(1){if((c[La>>2]|0)>=(c[Ja>>2]|0))break;if((c[(c[Ha>>2]|0)+((c[La>>2]|0)*1168|0)+448+(c[oa>>2]<<2)>>2]|0)!=(c[ja>>2]|0)){c[t+((c[La>>2]|0)*48|0)+4>>2]=(c[t+((c[La>>2]|0)*48|0)+4>>2]|0)+134217727;c[t+((c[La>>2]|0)*48|0)+24+4>>2]=(c[t+((c[La>>2]|0)*48|0)+24+4>>2]|0)+134217727}c[La>>2]=(c[La>>2]|0)+1}c[da>>2]=c[t+4>>2];c[fa>>2]=c[t+24+4>>2];c[ea>>2]=0;c[ga>>2]=0;c[La>>2]=1;while(1){if((c[La>>2]|0)>=(c[Ja>>2]|0))break;if((c[t+((c[La>>2]|0)*48|0)+4>>2]|0)>(c[da>>2]|0)){c[da>>2]=c[t+((c[La>>2]|0)*48|0)+4>>2];c[ea>>2]=c[La>>2]}if((c[t+((c[La>>2]|0)*48|0)+24+4>>2]|0)<(c[fa>>2]|0)){c[fa>>2]=c[t+((c[La>>2]|0)*48|0)+24+4>>2];c[ga>>2]=c[La>>2]}c[La>>2]=(c[La>>2]|0)+1}if((c[fa>>2]|0)<(c[da>>2]|0)){pj((c[Ha>>2]|0)+((c[ea>>2]|0)*1168|0)+(c[la>>2]<<2)|0,(c[Ha>>2]|0)+((c[ga>>2]|0)*1168|0)+(c[la>>2]<<2)|0,1168-(c[la>>2]<<2)|0)|0;Oa=t+((c[ea>>2]|0)*48|0)|0;j=t+((c[ga>>2]|0)*48|0)+24|0;c[Oa>>2]=c[j>>2];c[Oa+4>>2]=c[j+4>>2];c[Oa+8>>2]=c[j+8>>2];c[Oa+12>>2]=c[j+12>>2];c[Oa+16>>2]=c[j+16>>2];c[Oa+20>>2]=c[j+20>>2]}c[Ma>>2]=(c[Ha>>2]|0)+((c[ha>>2]|0)*1168|0);if(!((c[M>>2]|0)<=0?(c[la>>2]|0)<(c[S>>2]|0):0)){a[(c[U>>2]|0)+((c[la>>2]|0)-(c[S>>2]|0))>>0]=(c[(c[Ma>>2]|0)+576+(c[oa>>2]<<2)>>2]>>9)+1>>1;Oa=_(c[(c[Ma>>2]|0)+704+(c[oa>>2]<<2)>>2]>>16,(c[(c[X>>2]|0)+(c[oa>>2]<<2)>>2]&65535)<<16>>16)|0;Oa=Oa+((_(c[(c[Ma>>2]|0)+704+(c[oa>>2]<<2)>>2]&65535,(c[(c[X>>2]|0)+(c[oa>>2]<<2)>>2]&65535)<<16>>16)|0)>>16)|0;if(((Oa+(_(c[(c[Ma>>2]|0)+704+(c[oa>>2]<<2)>>2]|0,(c[(c[X>>2]|0)+(c[oa>>2]<<2)>>2]>>15)+1>>1)|0)>>7)+1>>1|0)<=32767){Oa=_(c[(c[Ma>>2]|0)+704+(c[oa>>2]<<2)>>2]>>16,(c[(c[X>>2]|0)+(c[oa>>2]<<2)>>2]&65535)<<16>>16)|0;Oa=Oa+((_(c[(c[Ma>>2]|0)+704+(c[oa>>2]<<2)>>2]&65535,(c[(c[X>>2]|0)+(c[oa>>2]<<2)>>2]&65535)<<16>>16)|0)>>16)|0;if(((Oa+(_(c[(c[Ma>>2]|0)+704+(c[oa>>2]<<2)>>2]|0,(c[(c[X>>2]|0)+(c[oa>>2]<<2)>>2]>>15)+1>>1)|0)>>7)+1>>1|0)<-32768)o=-32768;else{o=_(c[(c[Ma>>2]|0)+704+(c[oa>>2]<<2)>>2]>>16,(c[(c[X>>2]|0)+(c[oa>>2]<<2)>>2]&65535)<<16>>16)|0;o=o+((_(c[(c[Ma>>2]|0)+704+(c[oa>>2]<<2)>>2]&65535,(c[(c[X>>2]|0)+(c[oa>>2]<<2)>>2]&65535)<<16>>16)|0)>>16)|0;o=(o+(_(c[(c[Ma>>2]|0)+704+(c[oa>>2]<<2)>>2]|0,(c[(c[X>>2]|0)+(c[oa>>2]<<2)>>2]>>15)+1>>1)|0)>>7)+1>>1}}else o=32767;b[(c[V>>2]|0)+((c[la>>2]|0)-(c[S>>2]|0)<<1)>>1]=o;c[(c[E>>2]|0)+1280+((c[(c[E>>2]|0)+4364>>2]|0)-(c[S>>2]|0)<<2)>>2]=c[(c[Ma>>2]|0)+960+(c[oa>>2]<<2)>>2];c[(c[W>>2]|0)+((c[(c[E>>2]|0)+4360>>2]|0)-(c[S>>2]|0)<<2)>>2]=c[(c[Ma>>2]|0)+832+(c[oa>>2]<<2)>>2]}Oa=(c[E>>2]|0)+4364|0;c[Oa>>2]=(c[Oa>>2]|0)+1;Oa=(c[E>>2]|0)+4360|0;c[Oa>>2]=(c[Oa>>2]|0)+1;c[La>>2]=0;while(1){if((c[La>>2]|0)>=(c[Ja>>2]|0))break;c[Ma>>2]=(c[Ha>>2]|0)+((c[La>>2]|0)*1168|0);c[ua>>2]=t+((c[La>>2]|0)*48|0);c[(c[Ma>>2]|0)+1152>>2]=c[(c[ua>>2]|0)+12>>2];c[(c[Ma>>2]|0)+(32+(c[la>>2]|0)<<2)>>2]=c[(c[ua>>2]|0)+8>>2];c[(c[Ma>>2]|0)+704+(c[c[R>>2]>>2]<<2)>>2]=c[(c[ua>>2]|0)+8>>2];c[(c[Ma>>2]|0)+576+(c[c[R>>2]>>2]<<2)>>2]=c[c[ua>>2]>>2];c[(c[Ma>>2]|0)+832+(c[c[R>>2]>>2]<<2)>>2]=c[(c[ua>>2]|0)+20>>2]<<1;c[(c[Ma>>2]|0)+960+(c[c[R>>2]>>2]<<2)>>2]=c[(c[ua>>2]|0)+16>>2];c[(c[Ma>>2]|0)+1156>>2]=(c[(c[Ma>>2]|0)+1156>>2]|0)+((c[c[ua>>2]>>2]>>9)+1>>1);c[(c[Ma>>2]|0)+448+(c[c[R>>2]>>2]<<2)>>2]=c[(c[Ma>>2]|0)+1156>>2];c[(c[Ma>>2]|0)+1164>>2]=c[(c[ua>>2]|0)+4>>2];c[La>>2]=(c[La>>2]|0)+1}c[(c[X>>2]|0)+(c[c[R>>2]>>2]<<2)>>2]=c[$>>2];c[la>>2]=(c[la>>2]|0)+1}c[La>>2]=0;while(1){if((c[La>>2]|0)>=(c[Ja>>2]|0))break;c[Ma>>2]=(c[Ha>>2]|0)+((c[La>>2]|0)*1168|0);o=c[Ma>>2]|0;t=(c[Ma>>2]|0)+(c[Ia>>2]<<2)|0;q=o+128|0;do{c[o>>2]=c[t>>2];o=o+4|0;t=t+4|0}while((o|0)<(q|0));c[La>>2]=(c[La>>2]|0)+1}na(c[Ka>>2]|0);i=Na;return}function ze(a){a=a|0;var b=0,d=0;b=i;i=i+16|0;d=b;c[d>>2]=a;c[(c[d>>2]|0)+4168>>2]=c[(c[d>>2]|0)+2328>>2]<<7;c[(c[d>>2]|0)+4168+72>>2]=65536;c[(c[d>>2]|0)+4168+72+4>>2]=65536;c[(c[d>>2]|0)+4168+88>>2]=20;c[(c[d>>2]|0)+4168+84>>2]=2;i=b;return}function Ae(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0;m=i;i=i+32|0;h=m+16|0;g=m+12|0;j=m+8|0;k=m+4|0;l=m;c[h>>2]=a;c[g>>2]=b;c[j>>2]=d;c[k>>2]=e;c[l>>2]=f;if((c[(c[h>>2]|0)+2316>>2]|0)!=(c[(c[h>>2]|0)+4168+80>>2]|0)){ze(c[h>>2]|0);c[(c[h>>2]|0)+4168+80>>2]=c[(c[h>>2]|0)+2316>>2]}d=c[h>>2]|0;f=c[g>>2]|0;if(c[k>>2]|0){Be(d,f,c[j>>2]|0,c[l>>2]|0);l=(c[h>>2]|0)+4160|0;c[l>>2]=(c[l>>2]|0)+1;i=m;return}else{Ke(d,f);i=m;return}}function Be(a,d,e,f){a=a|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0;N=i;i=i+176|0;z=N+120|0;A=N+116|0;B=N+112|0;m=N+108|0;F=N+104|0;G=N+100|0;u=N+96|0;H=N+92|0;r=N+88|0;y=N+84|0;k=N+80|0;l=N+76|0;L=N+72|0;q=N+68|0;w=N+64|0;t=N+60|0;h=N+56|0;j=N+52|0;x=N+48|0;v=N+44|0;E=N+40|0;o=N+36|0;K=N+160|0;n=N+32|0;M=N+28|0;D=N+128|0;J=N+24|0;I=N+16|0;C=N+8|0;s=N+4|0;p=N;c[z>>2]=a;c[A>>2]=d;c[B>>2]=e;c[m>>2]=f;c[J>>2]=(c[z>>2]|0)+4168;g=(c[(c[z>>2]|0)+2336>>2]|0)+(c[(c[z>>2]|0)+2328>>2]|0)|0;c[C>>2]=ia()|0;d=i;i=i+((1*(g<<2)|0)+15&-16)|0;g=i;i=i+((1*(c[(c[z>>2]|0)+2336>>2]<<1)|0)+15&-16)|0;c[I>>2]=c[(c[J>>2]|0)+72>>2]>>6;c[I+4>>2]=c[(c[J>>2]|0)+72+4>>2]>>6;if(c[(c[z>>2]|0)+2376>>2]|0){e=(c[J>>2]|0)+14|0;a=e+32|0;do{b[e>>1]=0;e=e+2|0}while((e|0)<(a|0))}Ce(h,k,j,l,(c[z>>2]|0)+4|0,I,c[(c[z>>2]|0)+2332>>2]|0,c[(c[z>>2]|0)+2324>>2]|0);f=c[(c[J>>2]|0)+84>>2]|0;if((c[h>>2]>>c[l>>2]|0)<(c[j>>2]>>c[k>>2]|0)){l=De(0,(_(f-1|0,c[(c[J>>2]|0)+88>>2]|0)|0)-128|0)|0;c[x>>2]=(c[z>>2]|0)+4+(l<<2)}else{l=De(0,(_(f,c[(c[J>>2]|0)+88>>2]|0)|0)-128|0)|0;c[x>>2]=(c[z>>2]|0)+4+(l<<2)}c[n>>2]=(c[J>>2]|0)+4;b[K>>1]=b[(c[J>>2]|0)+56>>1]|0;c[q>>2]=b[24440+((Ee(1,c[(c[z>>2]|0)+4160>>2]|0)|0)<<1)>>1];l=(c[(c[z>>2]|0)+4164>>2]|0)==2;f=Ee(1,c[(c[z>>2]|0)+4160>>2]|0)|0;if(l)c[w>>2]=b[24444+(f<<1)>>1];else c[w>>2]=b[24448+(f<<1)>>1];Pf((c[J>>2]|0)+14|0,c[(c[z>>2]|0)+2340>>2]|0,64881);pj(D|0,(c[J>>2]|0)+14|0,c[(c[z>>2]|0)+2340>>2]<<1|0)|0;do if(!(c[(c[z>>2]|0)+4160>>2]|0)){b[K>>1]=16384;if((c[(c[z>>2]|0)+4164>>2]|0)!=2){c[s>>2]=Yf((c[J>>2]|0)+14|0,c[(c[z>>2]|0)+2340>>2]|0)|0;c[p>>2]=Ge(134217728,c[s>>2]|0)|0;c[p>>2]=He(4194304,c[p>>2]|0)|0;c[p>>2]=c[p>>2]<<3;s=_(c[p>>2]>>16,(c[w>>2]&65535)<<16>>16)|0;c[w>>2]=s+((_(c[p>>2]&65535,(c[w>>2]&65535)<<16>>16)|0)>>16)>>14;break}c[F>>2]=0;while(1){if((c[F>>2]|0)>=5)break;b[K>>1]=(b[K>>1]|0)-(b[(c[n>>2]|0)+(c[F>>2]<<1)>>1]|0);c[F>>2]=(c[F>>2]|0)+1}b[K>>1]=Fe(3277,b[K>>1]|0)|0;b[K>>1]=(_(b[K>>1]|0,b[(c[J>>2]|0)+68>>1]|0)|0)>>14}while(0);c[L>>2]=c[(c[J>>2]|0)+52>>2];c[H>>2]=(c[c[J>>2]>>2]>>7)+1>>1;c[y>>2]=c[(c[z>>2]|0)+2336>>2];c[r>>2]=(c[(c[z>>2]|0)+2336>>2]|0)-(c[H>>2]|0)-(c[(c[z>>2]|0)+2340>>2]|0)-2;Xf(g+(c[r>>2]<<1)|0,(c[z>>2]|0)+1348+(c[r>>2]<<1)|0,D,(c[(c[z>>2]|0)+2336>>2]|0)-(c[r>>2]|0)|0,c[(c[z>>2]|0)+2340>>2]|0,c[m>>2]|0);c[t>>2]=Ie(c[(c[J>>2]|0)+72+4>>2]|0,46)|0;c[t>>2]=(c[t>>2]|0)<1073741823?c[t>>2]|0:1073741823;c[F>>2]=(c[r>>2]|0)+(c[(c[z>>2]|0)+2340>>2]|0);while(1){if((c[F>>2]|0)>=(c[(c[z>>2]|0)+2336>>2]|0))break;s=_(c[t>>2]>>16,b[g+(c[F>>2]<<1)>>1]|0)|0;s=s+((_(c[t>>2]&65535,b[g+(c[F>>2]<<1)>>1]|0)|0)>>16)|0;c[d+(c[F>>2]<<2)>>2]=s;c[F>>2]=(c[F>>2]|0)+1}c[u>>2]=0;while(1){if((c[u>>2]|0)>=(c[(c[z>>2]|0)+2324>>2]|0))break;c[v>>2]=d+((c[y>>2]|0)-(c[H>>2]|0)+2<<2);c[F>>2]=0;while(1){if((c[F>>2]|0)>=(c[(c[z>>2]|0)+2332>>2]|0))break;c[o>>2]=2;t=_(c[c[v>>2]>>2]>>16,b[c[n>>2]>>1]|0)|0;c[o>>2]=(c[o>>2]|0)+(t+((_(c[c[v>>2]>>2]&65535,b[c[n>>2]>>1]|0)|0)>>16));t=_(c[(c[v>>2]|0)+-4>>2]>>16,b[(c[n>>2]|0)+2>>1]|0)|0;c[o>>2]=(c[o>>2]|0)+(t+((_(c[(c[v>>2]|0)+-4>>2]&65535,b[(c[n>>2]|0)+2>>1]|0)|0)>>16));t=_(c[(c[v>>2]|0)+-8>>2]>>16,b[(c[n>>2]|0)+4>>1]|0)|0;c[o>>2]=(c[o>>2]|0)+(t+((_(c[(c[v>>2]|0)+-8>>2]&65535,b[(c[n>>2]|0)+4>>1]|0)|0)>>16));t=_(c[(c[v>>2]|0)+-12>>2]>>16,b[(c[n>>2]|0)+6>>1]|0)|0;c[o>>2]=(c[o>>2]|0)+(t+((_(c[(c[v>>2]|0)+-12>>2]&65535,b[(c[n>>2]|0)+6>>1]|0)|0)>>16));t=_(c[(c[v>>2]|0)+-16>>2]>>16,b[(c[n>>2]|0)+8>>1]|0)|0;c[o>>2]=(c[o>>2]|0)+(t+((_(c[(c[v>>2]|0)+-16>>2]&65535,b[(c[n>>2]|0)+8>>1]|0)|0)>>16));c[v>>2]=(c[v>>2]|0)+4;c[L>>2]=907633515+(_(c[L>>2]|0,196314165)|0);c[r>>2]=c[L>>2]>>25&127;t=_(c[(c[x>>2]|0)+(c[r>>2]<<2)>>2]>>16,b[K>>1]|0)|0;t=(c[o>>2]|0)+(t+((_(c[(c[x>>2]|0)+(c[r>>2]<<2)>>2]&65535,b[K>>1]|0)|0)>>16))<<2;c[d+(c[y>>2]<<2)>>2]=t;c[y>>2]=(c[y>>2]|0)+1;c[F>>2]=(c[F>>2]|0)+1}c[G>>2]=0;while(1){if((c[G>>2]|0)>=5)break;t=(_((c[q>>2]&65535)<<16>>16,b[(c[n>>2]|0)+(c[G>>2]<<1)>>1]|0)|0)>>15&65535;b[(c[n>>2]|0)+(c[G>>2]<<1)>>1]=t;c[G>>2]=(c[G>>2]|0)+1}b[K>>1]=(_(b[K>>1]|0,(c[w>>2]&65535)<<16>>16)|0)>>15;c[c[J>>2]>>2]=(c[c[J>>2]>>2]|0)+(((c[c[J>>2]>>2]>>16)*655|0)+((c[c[J>>2]>>2]&65535)*655>>16));t=Ge(c[c[J>>2]>>2]|0,((c[(c[z>>2]|0)+2316>>2]&65535)<<16>>16)*18<<8)|0;c[c[J>>2]>>2]=t;c[H>>2]=(c[c[J>>2]>>2]>>7)+1>>1;c[u>>2]=(c[u>>2]|0)+1}c[M>>2]=d+((c[(c[z>>2]|0)+2336>>2]|0)-16<<2);e=c[M>>2]|0;f=(c[z>>2]|0)+1284|0;a=e+64|0;do{c[e>>2]=c[f>>2];e=e+4|0;f=f+4|0}while((e|0)<(a|0));c[F>>2]=0;while(1){f=c[z>>2]|0;if((c[F>>2]|0)>=(c[(c[z>>2]|0)+2328>>2]|0))break;c[E>>2]=c[f+2340>>2]>>1;y=_(c[(c[M>>2]|0)+(16+(c[F>>2]|0)-1<<2)>>2]>>16,b[D>>1]|0)|0;c[E>>2]=(c[E>>2]|0)+(y+((_(c[(c[M>>2]|0)+(16+(c[F>>2]|0)-1<<2)>>2]&65535,b[D>>1]|0)|0)>>16));y=_(c[(c[M>>2]|0)+(16+(c[F>>2]|0)-2<<2)>>2]>>16,b[D+2>>1]|0)|0;c[E>>2]=(c[E>>2]|0)+(y+((_(c[(c[M>>2]|0)+(16+(c[F>>2]|0)-2<<2)>>2]&65535,b[D+2>>1]|0)|0)>>16));y=_(c[(c[M>>2]|0)+(16+(c[F>>2]|0)-3<<2)>>2]>>16,b[D+4>>1]|0)|0;c[E>>2]=(c[E>>2]|0)+(y+((_(c[(c[M>>2]|0)+(16+(c[F>>2]|0)-3<<2)>>2]&65535,b[D+4>>1]|0)|0)>>16));y=_(c[(c[M>>2]|0)+(16+(c[F>>2]|0)-4<<2)>>2]>>16,b[D+6>>1]|0)|0;c[E>>2]=(c[E>>2]|0)+(y+((_(c[(c[M>>2]|0)+(16+(c[F>>2]|0)-4<<2)>>2]&65535,b[D+6>>1]|0)|0)>>16));y=_(c[(c[M>>2]|0)+(16+(c[F>>2]|0)-5<<2)>>2]>>16,b[D+8>>1]|0)|0;c[E>>2]=(c[E>>2]|0)+(y+((_(c[(c[M>>2]|0)+(16+(c[F>>2]|0)-5<<2)>>2]&65535,b[D+8>>1]|0)|0)>>16));y=_(c[(c[M>>2]|0)+(16+(c[F>>2]|0)-6<<2)>>2]>>16,b[D+10>>1]|0)|0;c[E>>2]=(c[E>>2]|0)+(y+((_(c[(c[M>>2]|0)+(16+(c[F>>2]|0)-6<<2)>>2]&65535,b[D+10>>1]|0)|0)>>16));y=_(c[(c[M>>2]|0)+(16+(c[F>>2]|0)-7<<2)>>2]>>16,b[D+12>>1]|0)|0;c[E>>2]=(c[E>>2]|0)+(y+((_(c[(c[M>>2]|0)+(16+(c[F>>2]|0)-7<<2)>>2]&65535,b[D+12>>1]|0)|0)>>16));y=_(c[(c[M>>2]|0)+(16+(c[F>>2]|0)-8<<2)>>2]>>16,b[D+14>>1]|0)|0;c[E>>2]=(c[E>>2]|0)+(y+((_(c[(c[M>>2]|0)+(16+(c[F>>2]|0)-8<<2)>>2]&65535,b[D+14>>1]|0)|0)>>16));y=_(c[(c[M>>2]|0)+(16+(c[F>>2]|0)-9<<2)>>2]>>16,b[D+16>>1]|0)|0;c[E>>2]=(c[E>>2]|0)+(y+((_(c[(c[M>>2]|0)+(16+(c[F>>2]|0)-9<<2)>>2]&65535,b[D+16>>1]|0)|0)>>16));y=_(c[(c[M>>2]|0)+(16+(c[F>>2]|0)-10<<2)>>2]>>16,b[D+18>>1]|0)|0;c[E>>2]=(c[E>>2]|0)+(y+((_(c[(c[M>>2]|0)+(16+(c[F>>2]|0)-10<<2)>>2]&65535,b[D+18>>1]|0)|0)>>16));c[G>>2]=10;while(1){if((c[G>>2]|0)>=(c[(c[z>>2]|0)+2340>>2]|0))break;y=_(c[(c[M>>2]|0)+(16+(c[F>>2]|0)-(c[G>>2]|0)-1<<2)>>2]>>16,b[D+(c[G>>2]<<1)>>1]|0)|0;c[E>>2]=(c[E>>2]|0)+(y+((_(c[(c[M>>2]|0)+(16+(c[F>>2]|0)-(c[G>>2]|0)-1<<2)>>2]&65535,b[D+(c[G>>2]<<1)>>1]|0)|0)>>16));c[G>>2]=(c[G>>2]|0)+1}c[(c[M>>2]|0)+(16+(c[F>>2]|0)<<2)>>2]=(c[(c[M>>2]|0)+(16+(c[F>>2]|0)<<2)>>2]|0)+(c[E>>2]<<4);y=_(c[(c[M>>2]|0)+(16+(c[F>>2]|0)<<2)>>2]>>16,(c[I+4>>2]&65535)<<16>>16)|0;y=y+((_(c[(c[M>>2]|0)+(16+(c[F>>2]|0)<<2)>>2]&65535,(c[I+4>>2]&65535)<<16>>16)|0)>>16)|0;if(((y+(_(c[(c[M>>2]|0)+(16+(c[F>>2]|0)<<2)>>2]|0,(c[I+4>>2]>>15)+1>>1)|0)>>7)+1>>1|0)<=32767){y=_(c[(c[M>>2]|0)+(16+(c[F>>2]|0)<<2)>>2]>>16,(c[I+4>>2]&65535)<<16>>16)|0;y=y+((_(c[(c[M>>2]|0)+(16+(c[F>>2]|0)<<2)>>2]&65535,(c[I+4>>2]&65535)<<16>>16)|0)>>16)|0;if(((y+(_(c[(c[M>>2]|0)+(16+(c[F>>2]|0)<<2)>>2]|0,(c[I+4>>2]>>15)+1>>1)|0)>>7)+1>>1|0)<-32768)f=-32768;else{f=_(c[(c[M>>2]|0)+(16+(c[F>>2]|0)<<2)>>2]>>16,(c[I+4>>2]&65535)<<16>>16)|0;f=f+((_(c[(c[M>>2]|0)+(16+(c[F>>2]|0)<<2)>>2]&65535,(c[I+4>>2]&65535)<<16>>16)|0)>>16)|0;f=(f+(_(c[(c[M>>2]|0)+(16+(c[F>>2]|0)<<2)>>2]|0,(c[I+4>>2]>>15)+1>>1)|0)>>7)+1>>1}}else f=32767;if((f|0)<=32767){y=_(c[(c[M>>2]|0)+(16+(c[F>>2]|0)<<2)>>2]>>16,(c[I+4>>2]&65535)<<16>>16)|0;y=y+((_(c[(c[M>>2]|0)+(16+(c[F>>2]|0)<<2)>>2]&65535,(c[I+4>>2]&65535)<<16>>16)|0)>>16)|0;if(((y+(_(c[(c[M>>2]|0)+(16+(c[F>>2]|0)<<2)>>2]|0,(c[I+4>>2]>>15)+1>>1)|0)>>7)+1>>1|0)<=32767){y=_(c[(c[M>>2]|0)+(16+(c[F>>2]|0)<<2)>>2]>>16,(c[I+4>>2]&65535)<<16>>16)|0;y=y+((_(c[(c[M>>2]|0)+(16+(c[F>>2]|0)<<2)>>2]&65535,(c[I+4>>2]&65535)<<16>>16)|0)>>16)|0;if(((y+(_(c[(c[M>>2]|0)+(16+(c[F>>2]|0)<<2)>>2]|0,(c[I+4>>2]>>15)+1>>1)|0)>>7)+1>>1|0)<-32768)f=-32768;else{f=_(c[(c[M>>2]|0)+(16+(c[F>>2]|0)<<2)>>2]>>16,(c[I+4>>2]&65535)<<16>>16)|0;f=f+((_(c[(c[M>>2]|0)+(16+(c[F>>2]|0)<<2)>>2]&65535,(c[I+4>>2]&65535)<<16>>16)|0)>>16)|0;f=(f+(_(c[(c[M>>2]|0)+(16+(c[F>>2]|0)<<2)>>2]|0,(c[I+4>>2]>>15)+1>>1)|0)>>7)+1>>1}}else f=32767;if((f|0)>=-32768){y=_(c[(c[M>>2]|0)+(16+(c[F>>2]|0)<<2)>>2]>>16,(c[I+4>>2]&65535)<<16>>16)|0;y=y+((_(c[(c[M>>2]|0)+(16+(c[F>>2]|0)<<2)>>2]&65535,(c[I+4>>2]&65535)<<16>>16)|0)>>16)|0;if(((y+(_(c[(c[M>>2]|0)+(16+(c[F>>2]|0)<<2)>>2]|0,(c[I+4>>2]>>15)+1>>1)|0)>>7)+1>>1|0)<=32767){y=_(c[(c[M>>2]|0)+(16+(c[F>>2]|0)<<2)>>2]>>16,(c[I+4>>2]&65535)<<16>>16)|0;y=y+((_(c[(c[M>>2]|0)+(16+(c[F>>2]|0)<<2)>>2]&65535,(c[I+4>>2]&65535)<<16>>16)|0)>>16)|0;if(((y+(_(c[(c[M>>2]|0)+(16+(c[F>>2]|0)<<2)>>2]|0,(c[I+4>>2]>>15)+1>>1)|0)>>7)+1>>1|0)<-32768)f=-32768;else{f=_(c[(c[M>>2]|0)+(16+(c[F>>2]|0)<<2)>>2]>>16,(c[I+4>>2]&65535)<<16>>16)|0;f=f+((_(c[(c[M>>2]|0)+(16+(c[F>>2]|0)<<2)>>2]&65535,(c[I+4>>2]&65535)<<16>>16)|0)>>16)|0;f=(f+(_(c[(c[M>>2]|0)+(16+(c[F>>2]|0)<<2)>>2]|0,(c[I+4>>2]>>15)+1>>1)|0)>>7)+1>>1}}else f=32767}else f=-32768}else f=32767;b[(c[B>>2]|0)+(c[F>>2]<<1)>>1]=f;c[F>>2]=(c[F>>2]|0)+1}e=f+1284|0;f=(c[M>>2]|0)+(c[(c[z>>2]|0)+2328>>2]<<2)|0;a=e+64|0;do{c[e>>2]=c[f>>2];e=e+4|0;f=f+4|0}while((e|0)<(a|0));c[(c[J>>2]|0)+52>>2]=c[L>>2];b[(c[J>>2]|0)+56>>1]=b[K>>1]|0;c[F>>2]=0;while(1){if((c[F>>2]|0)>=4)break;c[(c[A>>2]|0)+(c[F>>2]<<2)>>2]=c[H>>2];c[F>>2]=(c[F>>2]|0)+1}na(c[C>>2]|0);i=N;return}function Ce(a,d,e,f,g,h,j,k){a=a|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;x=i;i=i+48|0;l=x+44|0;m=x+40|0;n=x+36|0;o=x+32|0;p=x+28|0;q=x+24|0;r=x+20|0;s=x+16|0;v=x+12|0;w=x+8|0;u=x+4|0;t=x;c[l>>2]=a;c[m>>2]=d;c[n>>2]=e;c[o>>2]=f;c[p>>2]=g;c[q>>2]=h;c[r>>2]=j;c[s>>2]=k;j=c[r>>2]<<1;c[t>>2]=ia()|0;a=i;i=i+((1*(j<<1)|0)+15&-16)|0;c[u>>2]=a;c[w>>2]=0;while(1){if((c[w>>2]|0)>=2)break;c[v>>2]=0;while(1){if((c[v>>2]|0)>=(c[r>>2]|0))break;j=(c[v>>2]|0)+(_((c[w>>2]|0)+(c[s>>2]|0)-2|0,c[r>>2]|0)|0)|0;j=_(c[(c[p>>2]|0)+(j<<2)>>2]>>16,(c[(c[q>>2]|0)+(c[w>>2]<<2)>>2]&65535)<<16>>16)|0;f=(c[v>>2]|0)+(_((c[w>>2]|0)+(c[s>>2]|0)-2|0,c[r>>2]|0)|0)|0;f=j+((_(c[(c[p>>2]|0)+(f<<2)>>2]&65535,(c[(c[q>>2]|0)+(c[w>>2]<<2)>>2]&65535)<<16>>16)|0)>>16)|0;j=(c[v>>2]|0)+(_((c[w>>2]|0)+(c[s>>2]|0)-2|0,c[r>>2]|0)|0)|0;if((f+(_(c[(c[p>>2]|0)+(j<<2)>>2]|0,(c[(c[q>>2]|0)+(c[w>>2]<<2)>>2]>>15)+1>>1)|0)>>8|0)<=32767){j=(c[v>>2]|0)+(_((c[w>>2]|0)+(c[s>>2]|0)-2|0,c[r>>2]|0)|0)|0;j=_(c[(c[p>>2]|0)+(j<<2)>>2]>>16,(c[(c[q>>2]|0)+(c[w>>2]<<2)>>2]&65535)<<16>>16)|0;f=(c[v>>2]|0)+(_((c[w>>2]|0)+(c[s>>2]|0)-2|0,c[r>>2]|0)|0)|0;f=j+((_(c[(c[p>>2]|0)+(f<<2)>>2]&65535,(c[(c[q>>2]|0)+(c[w>>2]<<2)>>2]&65535)<<16>>16)|0)>>16)|0;j=(c[v>>2]|0)+(_((c[w>>2]|0)+(c[s>>2]|0)-2|0,c[r>>2]|0)|0)|0;if((f+(_(c[(c[p>>2]|0)+(j<<2)>>2]|0,(c[(c[q>>2]|0)+(c[w>>2]<<2)>>2]>>15)+1>>1)|0)>>8|0)<-32768)e=-32768;else{e=(c[v>>2]|0)+(_((c[w>>2]|0)+(c[s>>2]|0)-2|0,c[r>>2]|0)|0)|0;e=_(c[(c[p>>2]|0)+(e<<2)>>2]>>16,(c[(c[q>>2]|0)+(c[w>>2]<<2)>>2]&65535)<<16>>16)|0;j=(c[v>>2]|0)+(_((c[w>>2]|0)+(c[s>>2]|0)-2|0,c[r>>2]|0)|0)|0;j=e+((_(c[(c[p>>2]|0)+(j<<2)>>2]&65535,(c[(c[q>>2]|0)+(c[w>>2]<<2)>>2]&65535)<<16>>16)|0)>>16)|0;e=(c[v>>2]|0)+(_((c[w>>2]|0)+(c[s>>2]|0)-2|0,c[r>>2]|0)|0)|0;e=j+(_(c[(c[p>>2]|0)+(e<<2)>>2]|0,(c[(c[q>>2]|0)+(c[w>>2]<<2)>>2]>>15)+1>>1)|0)>>8}}else e=32767;b[(c[u>>2]|0)+(c[v>>2]<<1)>>1]=e;c[v>>2]=(c[v>>2]|0)+1}c[u>>2]=(c[u>>2]|0)+(c[r>>2]<<1);c[w>>2]=(c[w>>2]|0)+1}wg(c[l>>2]|0,c[m>>2]|0,a,c[r>>2]|0);wg(c[n>>2]|0,c[o>>2]|0,a+(c[r>>2]<<1)|0,c[r>>2]|0);na(c[t>>2]|0);i=x;return}function De(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;f=i;i=i+16|0;e=f+4|0;d=f;c[e>>2]=a;c[d>>2]=b;i=f;return ((c[e>>2]|0)>(c[d>>2]|0)?c[e>>2]|0:c[d>>2]|0)|0}function Ee(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;f=i;i=i+16|0;e=f+4|0;d=f;c[e>>2]=a;c[d>>2]=b;i=f;return ((c[e>>2]|0)<(c[d>>2]|0)?c[e>>2]|0:c[d>>2]|0)|0}function Fe(a,c){a=a|0;c=c|0;var d=0,e=0,f=0;f=i;i=i+16|0;e=f+2|0;d=f;b[e>>1]=a;b[d>>1]=c;i=f;return ((b[e>>1]|0)>(b[d>>1]|0)?b[e>>1]|0:b[d>>1]|0)&65535|0}function Ge(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;f=i;i=i+16|0;e=f+4|0;d=f;c[e>>2]=a;c[d>>2]=b;i=f;return ((c[e>>2]|0)<(c[d>>2]|0)?c[e>>2]|0:c[d>>2]|0)|0}function He(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;f=i;i=i+16|0;e=f+4|0;d=f;c[e>>2]=a;c[d>>2]=b;i=f;return ((c[e>>2]|0)>(c[d>>2]|0)?c[e>>2]|0:c[d>>2]|0)|0}function Ie(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;h=i;i=i+48|0;f=h+32|0;n=h+28|0;d=h+24|0;j=h+20|0;g=h+16|0;k=h+12|0;m=h+8|0;l=h+4|0;e=h;c[n>>2]=a;c[d>>2]=b;b=c[n>>2]|0;c[j>>2]=(Je((c[n>>2]|0)>0?b:0-b|0)|0)-1;c[m>>2]=c[n>>2]<<c[j>>2];c[k>>2]=536870911/(c[m>>2]>>16|0)|0;c[e>>2]=c[k>>2]<<16;b=_(c[m>>2]>>16,(c[k>>2]&65535)<<16>>16)|0;c[l>>2]=536870912-(b+((_(c[m>>2]&65535,(c[k>>2]&65535)<<16>>16)|0)>>16))<<3;b=_(c[l>>2]>>16,(c[k>>2]&65535)<<16>>16)|0;b=(c[e>>2]|0)+(b+((_(c[l>>2]&65535,(c[k>>2]&65535)<<16>>16)|0)>>16))|0;c[e>>2]=b+(_(c[l>>2]|0,(c[k>>2]>>15)+1>>1)|0);c[g>>2]=61-(c[j>>2]|0)-(c[d>>2]|0);b=c[g>>2]|0;if((c[g>>2]|0)>0)if((b|0)<32){c[f>>2]=c[e>>2]>>c[g>>2];n=c[f>>2]|0;i=h;return n|0}else{c[f>>2]=0;n=c[f>>2]|0;i=h;return n|0}a=c[e>>2]|0;d=0-(c[g>>2]|0)|0;do if((-2147483648>>0-b|0)>(2147483647>>0-(c[g>>2]|0)|0)){if((a|0)>(-2147483648>>d|0)){b=-2147483648>>0-(c[g>>2]|0);break}if((c[e>>2]|0)<(2147483647>>0-(c[g>>2]|0)|0)){b=2147483647>>0-(c[g>>2]|0);break}else{b=c[e>>2]|0;break}}else{if((a|0)>(2147483647>>d|0)){b=2147483647>>0-(c[g>>2]|0);break}if((c[e>>2]|0)<(-2147483648>>0-(c[g>>2]|0)|0)){b=-2147483648>>0-(c[g>>2]|0);break}else{b=c[e>>2]|0;break}}while(0);c[f>>2]=b<<0-(c[g>>2]|0);n=c[f>>2]|0;i=h;return n|0}function Je(a){a=a|0;var b=0,d=0;d=i;i=i+16|0;b=d;c[b>>2]=a;if(!(c[b>>2]|0)){a=32;i=d;return a|0}a=32-(32-(aa(c[b>>2]|0)|0))|0;i=d;return a|0}function Ke(d,e){d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;r=i;i=i+48|0;f=r+40|0;g=r+36|0;h=r+32|0;o=r+28|0;j=r+24|0;k=r+20|0;l=r+16|0;m=r+12|0;p=r+8|0;n=r+4|0;q=r;c[f>>2]=d;c[g>>2]=e;c[l>>2]=(c[f>>2]|0)+4168;c[(c[f>>2]|0)+4164>>2]=a[(c[f>>2]|0)+2736+29>>0];c[h>>2]=0;a:do if((a[(c[f>>2]|0)+2736+29>>0]|0)==2){c[k>>2]=0;while(1){e=_(c[k>>2]|0,c[(c[f>>2]|0)+2332>>2]|0)|0;if((e|0)>=(c[(c[g>>2]|0)+((c[(c[f>>2]|0)+2324>>2]|0)-1<<2)>>2]|0))break;if((c[k>>2]|0)==(c[(c[f>>2]|0)+2324>>2]|0))break;c[o>>2]=0;c[j>>2]=0;while(1){if((c[j>>2]|0)>=5)break;c[o>>2]=(c[o>>2]|0)+(b[(c[g>>2]|0)+96+((((c[(c[f>>2]|0)+2324>>2]|0)-1-(c[k>>2]|0)|0)*5|0)+(c[j>>2]|0)<<1)>>1]|0);c[j>>2]=(c[j>>2]|0)+1}if((c[o>>2]|0)>(c[h>>2]|0)){c[h>>2]=c[o>>2];e=(c[l>>2]|0)+4|0;d=(c[g>>2]|0)+96+((((c[(c[f>>2]|0)+2324>>2]|0)-1-(c[k>>2]|0)&65535)<<16>>16)*5<<1)|0;b[e>>1]=b[d>>1]|0;b[e+2>>1]=b[d+2>>1]|0;b[e+4>>1]=b[d+4>>1]|0;b[e+6>>1]=b[d+6>>1]|0;b[e+8>>1]=b[d+8>>1]|0;c[c[l>>2]>>2]=c[(c[g>>2]|0)+((c[(c[f>>2]|0)+2324>>2]|0)-1-(c[k>>2]|0)<<2)>>2]<<8}c[k>>2]=(c[k>>2]|0)+1}o=(c[l>>2]|0)+4|0;c[o>>2]=0;c[o+4>>2]=0;b[o+8>>1]=0;b[(c[l>>2]|0)+4+4>>1]=c[h>>2];if((c[h>>2]|0)<11469){c[p>>2]=11744256;c[m>>2]=(c[p>>2]|0)/(((c[h>>2]|0)>1?c[h>>2]|0:1)|0)|0;c[j>>2]=0;while(1){if((c[j>>2]|0)>=5)break a;q=(_(b[(c[l>>2]|0)+4+(c[j>>2]<<1)>>1]|0,(c[m>>2]&65535)<<16>>16)|0)>>10&65535;b[(c[l>>2]|0)+4+(c[j>>2]<<1)>>1]=q;c[j>>2]=(c[j>>2]|0)+1}}if((c[h>>2]|0)>15565){c[q>>2]=255016960;c[n>>2]=(c[q>>2]|0)/(((c[h>>2]|0)>1?c[h>>2]|0:1)|0)|0;c[j>>2]=0;while(1){if((c[j>>2]|0)>=5)break a;q=(_(b[(c[l>>2]|0)+4+(c[j>>2]<<1)>>1]|0,(c[n>>2]&65535)<<16>>16)|0)>>14&65535;b[(c[l>>2]|0)+4+(c[j>>2]<<1)>>1]=q;c[j>>2]=(c[j>>2]|0)+1}}}else{c[c[l>>2]>>2]=((c[(c[f>>2]|0)+2316>>2]&65535)<<16>>16)*18<<8;q=(c[l>>2]|0)+4|0;c[q>>2]=0;c[q+4>>2]=0;b[q+8>>1]=0}while(0);pj((c[l>>2]|0)+14|0,(c[g>>2]|0)+32+32|0,c[(c[f>>2]|0)+2340>>2]<<1|0)|0;b[(c[l>>2]|0)+68>>1]=c[(c[g>>2]|0)+136>>2];q=(c[l>>2]|0)+72|0;p=(c[g>>2]|0)+16+((c[(c[f>>2]|0)+2324>>2]|0)-2<<2)|0;c[q>>2]=c[p>>2];c[q+4>>2]=c[p+4>>2];c[(c[l>>2]|0)+88>>2]=c[(c[f>>2]|0)+2332>>2];c[(c[l>>2]|0)+84>>2]=c[(c[f>>2]|0)+2324>>2];i=r;return}function Le(a,d,e){a=a|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;r=i;i=i+48|0;f=r+40|0;g=r+36|0;h=r+32|0;o=r+28|0;l=r+24|0;k=r+20|0;p=r+16|0;m=r+12|0;j=r+8|0;n=r+4|0;q=r;c[f>>2]=a;c[g>>2]=d;c[h>>2]=e;c[p>>2]=(c[f>>2]|0)+4168;if(c[(c[f>>2]|0)+4160>>2]|0){wg((c[p>>2]|0)+60|0,(c[p>>2]|0)+64|0,c[g>>2]|0,c[h>>2]|0);c[(c[p>>2]|0)+48>>2]=1;i=r;return}a:do if(c[(c[f>>2]|0)+4168+48>>2]|0){wg(k,l,c[g>>2]|0,c[h>>2]|0);if((c[l>>2]|0)<=(c[(c[p>>2]|0)+64>>2]|0)){if((c[l>>2]|0)<(c[(c[p>>2]|0)+64>>2]|0))c[k>>2]=c[k>>2]>>(c[(c[p>>2]|0)+64>>2]|0)-(c[l>>2]|0)}else c[(c[p>>2]|0)+60>>2]=c[(c[p>>2]|0)+60>>2]>>(c[l>>2]|0)-(c[(c[p>>2]|0)+64>>2]|0);if((c[k>>2]|0)>(c[(c[p>>2]|0)+60>>2]|0)){c[j>>2]=Je(c[(c[p>>2]|0)+60>>2]|0)|0;c[j>>2]=(c[j>>2]|0)-1;c[(c[p>>2]|0)+60>>2]=c[(c[p>>2]|0)+60>>2]<<c[j>>2];a=c[k>>2]|0;c[k>>2]=a>>(He(24-(c[j>>2]|0)|0,0)|0);c[m>>2]=(c[(c[p>>2]|0)+60>>2]|0)/(((c[k>>2]|0)>1?c[k>>2]|0:1)|0)|0;c[n>>2]=(Me(c[m>>2]|0)|0)<<4;c[q>>2]=(65536-(c[n>>2]|0)|0)/(c[h>>2]|0)|0;c[q>>2]=c[q>>2]<<2;c[o>>2]=0;while(1){if((c[o>>2]|0)>=(c[h>>2]|0))break a;a=_(c[n>>2]>>16,b[(c[g>>2]|0)+(c[o>>2]<<1)>>1]|0)|0;a=a+((_(c[n>>2]&65535,b[(c[g>>2]|0)+(c[o>>2]<<1)>>1]|0)|0)>>16)&65535;b[(c[g>>2]|0)+(c[o>>2]<<1)>>1]=a;c[n>>2]=(c[n>>2]|0)+(c[q>>2]|0);if((c[n>>2]|0)>65536)break a;c[o>>2]=(c[o>>2]|0)+1}}}while(0);c[(c[p>>2]|0)+48>>2]=0;i=r;return}function Me(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;h=i;i=i+32|0;b=h+16|0;d=h+12|0;g=h+8|0;f=h+4|0;e=h;c[d>>2]=a;if((c[d>>2]|0)<=0){c[b>>2]=0;g=c[b>>2]|0;i=h;return g|0}Ne(c[d>>2]|0,f,e);if(c[f>>2]&1|0)c[g>>2]=32768;else c[g>>2]=46214;c[g>>2]=c[g>>2]>>(c[f>>2]>>1);a=_(c[g>>2]>>16,(((c[e>>2]&65535)<<16>>16)*213&65535)<<16>>16)|0;c[g>>2]=(c[g>>2]|0)+(a+((_(c[g>>2]&65535,(((c[e>>2]&65535)<<16>>16)*213&65535)<<16>>16)|0)>>16));c[b>>2]=c[g>>2];g=c[b>>2]|0;i=h;return g|0}function Ne(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;e=i;i=i+16|0;h=e+12|0;j=e+8|0;f=e+4|0;g=e;c[h>>2]=a;c[j>>2]=b;c[f>>2]=d;c[g>>2]=Je(c[h>>2]|0)|0;c[c[j>>2]>>2]=c[g>>2];b=(Oe(c[h>>2]|0,24-(c[g>>2]|0)|0)|0)&127;c[c[f>>2]>>2]=b;i=e;return}function Oe(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0;k=i;i=i+32|0;e=k+20|0;d=k+16|0;f=k+12|0;j=k+8|0;h=k+4|0;g=k;c[d>>2]=a;c[f>>2]=b;c[j>>2]=c[d>>2];c[h>>2]=c[f>>2];c[g>>2]=0-(c[f>>2]|0);if(!(c[f>>2]|0)){c[e>>2]=c[d>>2];j=c[e>>2]|0;i=k;return j|0}d=c[j>>2]|0;if((c[f>>2]|0)<0){c[e>>2]=d<<c[g>>2]|(c[j>>2]|0)>>>(32-(c[g>>2]|0)|0);j=c[e>>2]|0;i=k;return j|0}else{c[e>>2]=d<<32-(c[h>>2]|0)|(c[j>>2]|0)>>>(c[h>>2]|0);j=c[e>>2]|0;i=k;return j|0}return 0}function Pe(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0;d=i;i=i+80|0;g=d+68|0;f=d+64|0;e=d+32|0;h=d+16|0;j=d+8|0;k=d;c[g>>2]=a;c[f>>2]=b;Qe(e,c[f>>2]|0,8);Qe(h,e,4);Qe(j,h,2);Qe(k,j,1);Re(c[g>>2]|0,c[j>>2]|0,c[k>>2]|0,30015);Re(c[g>>2]|0,c[h>>2]|0,c[j>>2]|0,29863);Re(c[g>>2]|0,c[e>>2]|0,c[h>>2]|0,29711);Re(c[g>>2]|0,c[c[f>>2]>>2]|0,c[e>>2]|0,29559);Re(c[g>>2]|0,c[(c[f>>2]|0)+8>>2]|0,c[e+4>>2]|0,29559);Re(c[g>>2]|0,c[e+8>>2]|0,c[h+4>>2]|0,29711);Re(c[g>>2]|0,c[(c[f>>2]|0)+16>>2]|0,c[e+8>>2]|0,29559);Re(c[g>>2]|0,c[(c[f>>2]|0)+24>>2]|0,c[e+12>>2]|0,29559);Re(c[g>>2]|0,c[h+8>>2]|0,c[j+4>>2]|0,29863);Re(c[g>>2]|0,c[e+16>>2]|0,c[h+8>>2]|0,29711);Re(c[g>>2]|0,c[(c[f>>2]|0)+32>>2]|0,c[e+16>>2]|0,29559);Re(c[g>>2]|0,c[(c[f>>2]|0)+40>>2]|0,c[e+20>>2]|0,29559);Re(c[g>>2]|0,c[e+24>>2]|0,c[h+12>>2]|0,29711);Re(c[g>>2]|0,c[(c[f>>2]|0)+48>>2]|0,c[e+24>>2]|0,29559);Re(c[g>>2]|0,c[(c[f>>2]|0)+56>>2]|0,c[e+28>>2]|0,29559);i=d;return}function Qe(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;j=i;i=i+16|0;e=j+12|0;f=j+8|0;g=j+4|0;h=j;c[e>>2]=a;c[f>>2]=b;c[g>>2]=d;c[h>>2]=0;while(1){if((c[h>>2]|0)>=(c[g>>2]|0))break;c[(c[e>>2]|0)+(c[h>>2]<<2)>>2]=(c[(c[f>>2]|0)+(c[h>>2]<<1<<2)>>2]|0)+(c[(c[f>>2]|0)+((c[h>>2]<<1)+1<<2)>>2]|0);c[h>>2]=(c[h>>2]|0)+1}i=j;return}function Re(a,b,e,f){a=a|0;b=b|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0;l=i;i=i+16|0;g=l+12|0;h=l+8|0;j=l+4|0;k=l;c[g>>2]=a;c[h>>2]=b;c[j>>2]=e;c[k>>2]=f;if((c[j>>2]|0)<=0){i=l;return}qc(c[g>>2]|0,c[h>>2]|0,(c[k>>2]|0)+(d[30167+(c[j>>2]|0)>>0]|0)|0,8);i=l;return}function Se(a,d,e){a=a|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0;f=i;i=i+48|0;j=f+8|0;h=f+4|0;m=f;l=f+40|0;k=f+32|0;g=f+16|0;c[j>>2]=a;c[h>>2]=d;c[m>>2]=e;Te(l,l+2|0,c[h>>2]|0,c[m>>2]|0,30015);Te(k,k+2|0,c[h>>2]|0,b[l>>1]|0,29863);Te(g,g+2|0,c[h>>2]|0,b[k>>1]|0,29711);Te(c[j>>2]|0,(c[j>>2]|0)+2|0,c[h>>2]|0,b[g>>1]|0,29559);Te((c[j>>2]|0)+4|0,(c[j>>2]|0)+6|0,c[h>>2]|0,b[g+2>>1]|0,29559);Te(g+4|0,g+6|0,c[h>>2]|0,b[k+2>>1]|0,29711);Te((c[j>>2]|0)+8|0,(c[j>>2]|0)+10|0,c[h>>2]|0,b[g+4>>1]|0,29559);Te((c[j>>2]|0)+12|0,(c[j>>2]|0)+14|0,c[h>>2]|0,b[g+6>>1]|0,29559);Te(k+4|0,k+6|0,c[h>>2]|0,b[l+2>>1]|0,29863);Te(g+8|0,g+10|0,c[h>>2]|0,b[k+4>>1]|0,29711);Te((c[j>>2]|0)+16|0,(c[j>>2]|0)+18|0,c[h>>2]|0,b[g+8>>1]|0,29559);Te((c[j>>2]|0)+20|0,(c[j>>2]|0)+22|0,c[h>>2]|0,b[g+10>>1]|0,29559);Te(g+12|0,g+14|0,c[h>>2]|0,b[k+6>>1]|0,29711);Te((c[j>>2]|0)+24|0,(c[j>>2]|0)+26|0,c[h>>2]|0,b[g+12>>1]|0,29559);Te((c[j>>2]|0)+28|0,(c[j>>2]|0)+30|0,c[h>>2]|0,b[g+14>>1]|0,29559);i=f;return}function Te(a,e,f,g,h){a=a|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0;o=i;i=i+32|0;j=o+16|0;k=o+12|0;l=o+8|0;m=o+4|0;n=o;c[j>>2]=a;c[k>>2]=e;c[l>>2]=f;c[m>>2]=g;c[n>>2]=h;if((c[m>>2]|0)>0){h=(ec(c[l>>2]|0,(c[n>>2]|0)+(d[30167+(c[m>>2]|0)>>0]|0)|0,8)|0)&65535;b[c[j>>2]>>1]=h;b[c[k>>2]>>1]=(c[m>>2]|0)-(b[c[j>>2]>>1]|0);i=o;return}else{b[c[j>>2]>>1]=0;b[c[k>>2]>>1]=0;i=o;return}}function Ue(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;g=i;i=i+16|0;d=g+8|0;e=g+4|0;f=g;c[d>>2]=a;c[f>>2]=0;a=c[d>>2]|0;b=a+112|0;do{c[a>>2]=0;a=a+4|0}while((a|0)<(b|0));c[e>>2]=0;while(1){if((c[e>>2]|0)>=4)break;b=Ve(50/((c[e>>2]|0)+1|0)|0,1)|0;c[(c[d>>2]|0)+92+(c[e>>2]<<2)>>2]=b;c[e>>2]=(c[e>>2]|0)+1}c[e>>2]=0;while(1){if((c[e>>2]|0)>=4)break;c[(c[d>>2]|0)+60+(c[e>>2]<<2)>>2]=(c[(c[d>>2]|0)+92+(c[e>>2]<<2)>>2]|0)*100;c[(c[d>>2]|0)+76+(c[e>>2]<<2)>>2]=2147483647/(c[(c[d>>2]|0)+60+(c[e>>2]<<2)>>2]|0)|0;c[e>>2]=(c[e>>2]|0)+1}c[(c[d>>2]|0)+108>>2]=15;c[e>>2]=0;while(1){if((c[e>>2]|0)>=4)break;c[(c[d>>2]|0)+40+(c[e>>2]<<2)>>2]=25600;c[e>>2]=(c[e>>2]|0)+1}i=g;return c[f>>2]|0}function Ve(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;f=i;i=i+16|0;e=f+4|0;d=f;c[e>>2]=a;c[d>>2]=b;i=f;return ((c[e>>2]|0)>(c[d>>2]|0)?c[e>>2]|0:c[d>>2]|0)|0}function We(a,d){a=a|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;C=i;i=i+144|0;s=C+132|0;F=C+128|0;v=C+124|0;q=C+120|0;p=C+116|0;E=C+112|0;D=C+108|0;k=C+104|0;h=C+100|0;j=C+96|0;w=C+92|0;l=C+88|0;x=C+84|0;m=C+80|0;r=C+76|0;A=C+72|0;e=C+136|0;o=C+56|0;u=C+40|0;B=C+36|0;n=C+32|0;g=C+16|0;z=C+8|0;y=C+4|0;t=C;c[s>>2]=a;c[F>>2]=d;c[z>>2]=0;c[y>>2]=(c[s>>2]|0)+32;c[E>>2]=c[(c[s>>2]|0)+4608>>2]>>1;c[D>>2]=c[(c[s>>2]|0)+4608>>2]>>2;c[k>>2]=c[(c[s>>2]|0)+4608>>2]>>3;c[g>>2]=0;c[g+4>>2]=(c[k>>2]|0)+(c[D>>2]|0);c[g+8>>2]=(c[g+4>>2]|0)+(c[k>>2]|0);c[g+12>>2]=(c[g+8>>2]|0)+(c[D>>2]|0);a=(c[g+12>>2]|0)+(c[E>>2]|0)|0;c[t>>2]=ia()|0;f=i;i=i+((1*(a<<1)|0)+15&-16)|0;Mf(c[F>>2]|0,c[y>>2]|0,f,f+(c[g+12>>2]<<1)|0,c[(c[s>>2]|0)+4608>>2]|0);Mf(f,(c[y>>2]|0)+8|0,f,f+(c[g+8>>2]<<1)|0,c[E>>2]|0);Mf(f,(c[y>>2]|0)+16|0,f,f+(c[g+4>>2]<<1)|0,c[D>>2]|0);b[f+((c[k>>2]|0)-1<<1)>>1]=b[f+((c[k>>2]|0)-1<<1)>>1]>>1;b[e>>1]=b[f+((c[k>>2]|0)-1<<1)>>1]|0;c[l>>2]=(c[k>>2]|0)-1;while(1){if((c[l>>2]|0)<=0)break;b[f+((c[l>>2]|0)-1<<1)>>1]=b[f+((c[l>>2]|0)-1<<1)>>1]>>1;F=f+(c[l>>2]<<1)|0;b[F>>1]=(b[F>>1]|0)-(b[f+((c[l>>2]|0)-1<<1)>>1]|0);c[l>>2]=(c[l>>2]|0)+-1}b[f>>1]=(b[f>>1]|0)-(b[(c[y>>2]|0)+56>>1]|0);b[(c[y>>2]|0)+56>>1]=b[e>>1]|0;c[x>>2]=0;while(1){if((c[x>>2]|0)>=4)break;F=c[(c[s>>2]|0)+4608>>2]|0;c[k>>2]=F>>(Xe(4-(c[x>>2]|0)|0,3)|0);c[h>>2]=c[k>>2]>>2;c[j>>2]=0;c[o+(c[x>>2]<<2)>>2]=c[(c[y>>2]|0)+24+(c[x>>2]<<2)>>2];c[m>>2]=0;while(1){if((c[m>>2]|0)>=4)break;c[r>>2]=0;c[l>>2]=0;while(1){if((c[l>>2]|0)>=(c[h>>2]|0))break;c[n>>2]=b[f+((c[g+(c[x>>2]<<2)>>2]|0)+(c[l>>2]|0)+(c[j>>2]|0)<<1)>>1]>>3;c[r>>2]=(c[r>>2]|0)+(_((c[n>>2]&65535)<<16>>16,(c[n>>2]&65535)<<16>>16)|0);c[l>>2]=(c[l>>2]|0)+1}d=c[o+(c[x>>2]<<2)>>2]|0;a=c[r>>2]|0;if((c[m>>2]|0)<3){if(d+a&-2147483648|0)d=2147483647;else d=(c[o+(c[x>>2]<<2)>>2]|0)+(c[r>>2]|0)|0;c[o+(c[x>>2]<<2)>>2]=d}else{if(d+(a>>1)&-2147483648|0)d=2147483647;else d=(c[o+(c[x>>2]<<2)>>2]|0)+(c[r>>2]>>1)|0;c[o+(c[x>>2]<<2)>>2]=d}c[j>>2]=(c[j>>2]|0)+(c[h>>2]|0);c[m>>2]=(c[m>>2]|0)+1}c[(c[y>>2]|0)+24+(c[x>>2]<<2)>>2]=c[r>>2];c[x>>2]=(c[x>>2]|0)+1}Ye(o,c[y>>2]|0);c[r>>2]=0;c[p>>2]=0;c[x>>2]=0;while(1){if((c[x>>2]|0)>=4)break;c[B>>2]=(c[o+(c[x>>2]<<2)>>2]|0)-(c[(c[y>>2]|0)+60+(c[x>>2]<<2)>>2]|0);d=c[x>>2]|0;if((c[B>>2]|0)>0){a=c[o+(c[x>>2]<<2)>>2]|0;if(!(c[o+(d<<2)>>2]&-8388608))c[u+(c[x>>2]<<2)>>2]=(a<<8|0)/((c[(c[y>>2]|0)+60+(c[x>>2]<<2)>>2]|0)+1|0)|0;else c[u+(c[x>>2]<<2)>>2]=(a|0)/((c[(c[y>>2]|0)+60+(c[x>>2]<<2)>>2]>>8)+1|0)|0;c[w>>2]=(Sf(c[u+(c[x>>2]<<2)>>2]|0)|0)-1024;c[r>>2]=(c[r>>2]|0)+(_((c[w>>2]&65535)<<16>>16,(c[w>>2]&65535)<<16>>16)|0);if((c[B>>2]|0)<1048576){E=(_e(c[B>>2]|0)|0)<<6>>16;E=_(E,(c[w>>2]&65535)<<16>>16)|0;F=(_e(c[B>>2]|0)|0)<<6&65535;c[w>>2]=E+((_(F,(c[w>>2]&65535)<<16>>16)|0)>>16)}F=_(c[17944+(c[x>>2]<<2)>>2]>>16,(c[w>>2]&65535)<<16>>16)|0;c[p>>2]=(c[p>>2]|0)+(F+((_(c[17944+(c[x>>2]<<2)>>2]&65535,(c[w>>2]&65535)<<16>>16)|0)>>16))}else c[u+(d<<2)>>2]=256;c[x>>2]=(c[x>>2]|0)+1}c[r>>2]=(c[r>>2]|0)/4|0;c[q>>2]=((_e(c[r>>2]|0)|0)*3&65535)<<16>>16;c[v>>2]=tg(0+(((c[q>>2]&65535)<<16>>16)*45e3>>16)-128|0)|0;F=(tg(c[p>>2]|0)|0)-16384<<1;c[(c[s>>2]|0)+4744>>2]=F;c[B>>2]=0;c[x>>2]=0;while(1){if((c[x>>2]|0)>=4)break;F=_((c[x>>2]|0)+1|0,(c[o+(c[x>>2]<<2)>>2]|0)-(c[(c[y>>2]|0)+60+(c[x>>2]<<2)>>2]|0)>>4)|0;c[B>>2]=(c[B>>2]|0)+F;c[x>>2]=(c[x>>2]|0)+1}if((c[B>>2]|0)>0){if((c[B>>2]|0)<32768){d=c[B>>2]|0;if((c[(c[s>>2]|0)+4608>>2]|0)==((c[(c[s>>2]|0)+4600>>2]|0)*10|0)){if((d|0)>32767)d=32767;else d=(c[B>>2]|0)<-32768?-32768:c[B>>2]|0;c[B>>2]=d<<16}else{if((d|0)>65535)d=65535;else d=(c[B>>2]|0)<-65536?-65536:c[B>>2]|0;c[B>>2]=d<<15}c[B>>2]=_e(c[B>>2]|0)|0;F=_(32768+(c[B>>2]|0)>>16,(c[v>>2]&65535)<<16>>16)|0;c[v>>2]=F+((_(32768+(c[B>>2]|0)&65535,(c[v>>2]&65535)<<16>>16)|0)>>16)}}else c[v>>2]=c[v>>2]>>1;F=Xe(c[v>>2]>>7,255)|0;c[(c[s>>2]|0)+4556>>2]=F;F=_(c[v>>2]>>16,(c[v>>2]&65535)<<16>>16)|0;c[A>>2]=0+((F+((_(c[v>>2]&65535,(c[v>>2]&65535)<<16>>16)|0)>>16)&65535)<<16>>16<<12>>16);if((c[(c[s>>2]|0)+4608>>2]|0)==((c[(c[s>>2]|0)+4600>>2]|0)*10|0))c[A>>2]=c[A>>2]>>1;c[x>>2]=0;while(1){if((c[x>>2]|0)>=4)break;F=_((c[u+(c[x>>2]<<2)>>2]|0)-(c[(c[y>>2]|0)+40+(c[x>>2]<<2)>>2]|0)>>16,(c[A>>2]&65535)<<16>>16)|0;F=(c[(c[y>>2]|0)+40+(c[x>>2]<<2)>>2]|0)+(F+((_((c[u+(c[x>>2]<<2)>>2]|0)-(c[(c[y>>2]|0)+40+(c[x>>2]<<2)>>2]|0)&65535,(c[A>>2]&65535)<<16>>16)|0)>>16))|0;c[(c[y>>2]|0)+40+(c[x>>2]<<2)>>2]=F;c[w>>2]=((Sf(c[(c[y>>2]|0)+40+(c[x>>2]<<2)>>2]|0)|0)-1024|0)*3;F=tg((c[w>>2]|0)-2048>>4)|0;c[(c[s>>2]|0)+4728+(c[x>>2]<<2)>>2]=F;c[x>>2]=(c[x>>2]|0)+1}F=c[z>>2]|0;na(c[t>>2]|0);i=C;return F|0}function Xe(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;f=i;i=i+16|0;e=f+4|0;d=f;c[e>>2]=a;c[d>>2]=b;i=f;return ((c[e>>2]|0)<(c[d>>2]|0)?c[e>>2]|0:c[d>>2]|0)|0}function Ye(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;m=i;i=i+32|0;d=m+28|0;e=m+24|0;h=m+20|0;k=m+16|0;l=m+12|0;g=m+8|0;f=m+4|0;j=m;c[d>>2]=a;c[e>>2]=b;if((c[(c[e>>2]|0)+108>>2]|0)<1e3)c[j>>2]=32767/((c[(c[e>>2]|0)+108>>2]>>4)+1|0)|0;else c[j>>2]=0;c[h>>2]=0;while(1){if((c[h>>2]|0)>=4)break;c[k>>2]=c[(c[e>>2]|0)+60+(c[h>>2]<<2)>>2];if((c[(c[d>>2]|0)+(c[h>>2]<<2)>>2]|0)+(c[(c[e>>2]|0)+92+(c[h>>2]<<2)>>2]|0)&-2147483648|0)a=2147483647;else a=(c[(c[d>>2]|0)+(c[h>>2]<<2)>>2]|0)+(c[(c[e>>2]|0)+92+(c[h>>2]<<2)>>2]|0)|0;c[l>>2]=a;c[g>>2]=2147483647/(c[l>>2]|0)|0;do if((c[l>>2]|0)<=(c[k>>2]<<3|0))if((c[l>>2]|0)<(c[k>>2]|0)){c[f>>2]=1024;break}else{a=_(c[g>>2]>>16,(c[k>>2]&65535)<<16>>16)|0;a=a+((_(c[g>>2]&65535,(c[k>>2]&65535)<<16>>16)|0)>>16)|0;a=a+(_(c[g>>2]|0,(c[k>>2]>>15)+1>>1)|0)>>16<<11;b=_(c[g>>2]>>16,(c[k>>2]&65535)<<16>>16)|0;b=b+((_(c[g>>2]&65535,(c[k>>2]&65535)<<16>>16)|0)>>16)|0;c[f>>2]=a+((b+(_(c[g>>2]|0,(c[k>>2]>>15)+1>>1)|0)&65535)<<11>>16);break}else c[f>>2]=128;while(0);c[f>>2]=Ze(c[f>>2]|0,c[j>>2]|0)|0;b=_((c[g>>2]|0)-(c[(c[e>>2]|0)+76+(c[h>>2]<<2)>>2]|0)>>16,(c[f>>2]&65535)<<16>>16)|0;b=(c[(c[e>>2]|0)+76+(c[h>>2]<<2)>>2]|0)+(b+((_((c[g>>2]|0)-(c[(c[e>>2]|0)+76+(c[h>>2]<<2)>>2]|0)&65535,(c[f>>2]&65535)<<16>>16)|0)>>16))|0;c[(c[e>>2]|0)+76+(c[h>>2]<<2)>>2]=b;c[k>>2]=2147483647/(c[(c[e>>2]|0)+76+(c[h>>2]<<2)>>2]|0)|0;c[k>>2]=(c[k>>2]|0)<16777215?c[k>>2]|0:16777215;c[(c[e>>2]|0)+60+(c[h>>2]<<2)>>2]=c[k>>2];c[h>>2]=(c[h>>2]|0)+1}l=(c[e>>2]|0)+108|0;c[l>>2]=(c[l>>2]|0)+1;i=m;return}function Ze(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;f=i;i=i+16|0;e=f+4|0;d=f;c[e>>2]=a;c[d>>2]=b;i=f;return ((c[e>>2]|0)>(c[d>>2]|0)?c[e>>2]|0:c[d>>2]|0)|0}function _e(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;h=i;i=i+32|0;b=h+16|0;d=h+12|0;g=h+8|0;f=h+4|0;e=h;c[d>>2]=a;if((c[d>>2]|0)<=0){c[b>>2]=0;g=c[b>>2]|0;i=h;return g|0}$e(c[d>>2]|0,f,e);if(c[f>>2]&1|0)c[g>>2]=32768;else c[g>>2]=46214;c[g>>2]=c[g>>2]>>(c[f>>2]>>1);a=_(c[g>>2]>>16,(((c[e>>2]&65535)<<16>>16)*213&65535)<<16>>16)|0;c[g>>2]=(c[g>>2]|0)+(a+((_(c[g>>2]&65535,(((c[e>>2]&65535)<<16>>16)*213&65535)<<16>>16)|0)>>16));c[b>>2]=c[g>>2];g=c[b>>2]|0;i=h;return g|0}function $e(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;e=i;i=i+16|0;h=e+12|0;j=e+8|0;f=e+4|0;g=e;c[h>>2]=a;c[j>>2]=b;c[f>>2]=d;c[g>>2]=af(c[h>>2]|0)|0;c[c[j>>2]>>2]=c[g>>2];b=(bf(c[h>>2]|0,24-(c[g>>2]|0)|0)|0)&127;c[c[f>>2]>>2]=b;i=e;return}function af(a){a=a|0;var b=0,d=0;d=i;i=i+16|0;b=d;c[b>>2]=a;if(!(c[b>>2]|0)){a=32;i=d;return a|0}a=32-(32-(aa(c[b>>2]|0)|0))|0;i=d;return a|0}function bf(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0;k=i;i=i+32|0;e=k+20|0;d=k+16|0;f=k+12|0;j=k+8|0;h=k+4|0;g=k;c[d>>2]=a;c[f>>2]=b;c[j>>2]=c[d>>2];c[h>>2]=c[f>>2];c[g>>2]=0-(c[f>>2]|0);if(!(c[f>>2]|0)){c[e>>2]=c[d>>2];j=c[e>>2]|0;i=k;return j|0}d=c[j>>2]|0;if((c[f>>2]|0)<0){c[e>>2]=d<<c[g>>2]|(c[j>>2]|0)>>>(32-(c[g>>2]|0)|0);j=c[e>>2]|0;i=k;return j|0}else{c[e>>2]=d<<32-(c[h>>2]|0)|(c[j>>2]|0)>>>(c[h>>2]|0);j=c[e>>2]|0;i=k;return j|0}return 0}function cf(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;h=i;i=i+16|0;f=h+12|0;d=h+8|0;g=h+4|0;e=h;c[f>>2]=a;c[d>>2]=b;c[g>>2]=c[(c[f>>2]|0)+4600>>2];c[e>>2]=((c[g>>2]&65535)<<16>>16)*1e3;if(!(c[e>>2]|0)){b=c[f>>2]|0;if((c[(c[f>>2]|0)+4596>>2]|0)<(c[(c[f>>2]|0)+4580>>2]|0))b=c[b+4596>>2]|0;else b=c[b+4580>>2]|0;c[e>>2]=b;c[g>>2]=(c[e>>2]|0)/1e3|0;g=c[g>>2]|0;i=h;return g|0}if(((c[e>>2]|0)<=(c[(c[f>>2]|0)+4580>>2]|0)?(c[e>>2]|0)<=(c[(c[f>>2]|0)+4588>>2]|0):0)?(c[e>>2]|0)>=(c[(c[f>>2]|0)+4592>>2]|0):0){if((c[(c[f>>2]|0)+16+8>>2]|0)>=256)c[(c[f>>2]|0)+16+12>>2]=0;if((c[(c[f>>2]|0)+4560>>2]|0)==0?(c[(c[d>>2]|0)+60>>2]|0)==0:0){g=c[g>>2]|0;i=h;return g|0}b=c[f>>2]|0;if((((c[(c[f>>2]|0)+4600>>2]&65535)<<16>>16)*1e3|0)>(c[(c[f>>2]|0)+4596>>2]|0)){if(!(c[b+16+12>>2]|0)){c[(c[f>>2]|0)+16+8>>2]=256;e=(c[f>>2]|0)+16|0;c[e>>2]=0;c[e+4>>2]=0}b=(c[f>>2]|0)+16|0;if(c[(c[d>>2]|0)+60>>2]|0){c[b+12>>2]=0;c[g>>2]=(c[(c[f>>2]|0)+4600>>2]|0)==16?12:8;g=c[g>>2]|0;i=h;return g|0}if((c[b+8>>2]|0)<=0){c[(c[d>>2]|0)+84>>2]=1;f=(c[d>>2]|0)+52|0;c[f>>2]=(c[f>>2]|0)-(((c[(c[d>>2]|0)+52>>2]|0)*5|0)/((c[(c[d>>2]|0)+24>>2]|0)+5|0)|0);g=c[g>>2]|0;i=h;return g|0}else{c[(c[f>>2]|0)+16+12>>2]=-2;g=c[g>>2]|0;i=h;return g|0}}if((((c[b+4600>>2]&65535)<<16>>16)*1e3|0)>=(c[(c[f>>2]|0)+4596>>2]|0)){if((c[(c[f>>2]|0)+16+12>>2]|0)>=0){g=c[g>>2]|0;i=h;return g|0}c[(c[f>>2]|0)+16+12>>2]=1;g=c[g>>2]|0;i=h;return g|0}b=c[f>>2]|0;if(c[(c[d>>2]|0)+60>>2]|0){c[g>>2]=(c[b+4600>>2]|0)==8?12:16;c[(c[f>>2]|0)+16+8>>2]=0;e=(c[f>>2]|0)+16|0;c[e>>2]=0;c[e+4>>2]=0;c[(c[f>>2]|0)+16+12>>2]=1;g=c[g>>2]|0;i=h;return g|0}if(!(c[b+16+12>>2]|0)){c[(c[d>>2]|0)+84>>2]=1;f=(c[d>>2]|0)+52|0;c[f>>2]=(c[f>>2]|0)-(((c[(c[d>>2]|0)+52>>2]|0)*5|0)/((c[(c[d>>2]|0)+24>>2]|0)+5|0)|0);g=c[g>>2]|0;i=h;return g|0}else{c[(c[f>>2]|0)+16+12>>2]=1;g=c[g>>2]|0;i=h;return g|0}}c[e>>2]=c[(c[f>>2]|0)+4580>>2];if((c[e>>2]|0)<(c[(c[f>>2]|0)+4588>>2]|0))b=c[e>>2]|0;else b=c[(c[f>>2]|0)+4588>>2]|0;c[e>>2]=b;if((c[e>>2]|0)>(c[(c[f>>2]|0)+4592>>2]|0))b=c[e>>2]|0;else b=c[(c[f>>2]|0)+4592>>2]|0;c[e>>2]=b;c[g>>2]=(c[e>>2]|0)/1e3|0;g=c[g>>2]|0;i=h;return g|0}function df(d,e,f,g,h,j,k,l,m){d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|0;m=m|0;var n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0;M=i;i=i+112|0;E=M+96|0;F=M+92|0;n=M+88|0;G=M+84|0;o=M+80|0;p=M+76|0;q=M+72|0;H=M+68|0;K=M+60|0;L=M+56|0;u=M+52|0;D=M+100|0;v=M+48|0;J=M+44|0;t=M+40|0;s=M+36|0;r=M+32|0;B=M+28|0;A=M+24|0;z=M+20|0;C=M+16|0;I=M+12|0;y=M+8|0;w=M+4|0;x=M;c[E>>2]=d;c[F>>2]=e;c[n>>2]=f;c[G>>2]=g;c[o>>2]=h;c[p>>2]=j;c[q>>2]=k;c[H>>2]=l;c[M+64>>2]=m;c[z>>2]=2147483647;c[I>>2]=0;c[L>>2]=0;while(1){if((c[L>>2]|0)>=3)break;c[x>>2]=51;c[v>>2]=c[17632+(c[L>>2]<<2)>>2];c[J>>2]=c[17644+(c[L>>2]<<2)>>2];c[t>>2]=c[17656+(c[L>>2]<<2)>>2];c[u>>2]=a[27263+(c[L>>2]|0)>>0];c[r>>2]=c[o>>2];c[s>>2]=c[E>>2];c[A>>2]=0;c[C>>2]=c[c[G>>2]>>2];c[K>>2]=0;while(1){if((c[K>>2]|0)>=(c[H>>2]|0))break;g=Wf(5333-(c[C>>2]|0)+896|0)|0;c[y>>2]=g-(c[x>>2]|0);ef(D+(c[K>>2]|0)|0,B,w,c[s>>2]|0,c[r>>2]|0,c[J>>2]|0,c[t>>2]|0,c[v>>2]|0,c[p>>2]|0,c[y>>2]|0,c[u>>2]|0);if((c[A>>2]|0)+(c[B>>2]|0)&-2147483648|0)d=2147483647;else d=(c[A>>2]|0)+(c[B>>2]|0)|0;c[A>>2]=d;g=c[C>>2]|0;if(0>(g+(Sf((c[x>>2]|0)+(c[w>>2]|0)|0)|0)-896|0))d=0;else{d=c[C>>2]|0;d=d+(Sf((c[x>>2]|0)+(c[w>>2]|0)|0)|0)-896|0}c[C>>2]=d;c[s>>2]=(c[s>>2]|0)+10;c[r>>2]=(c[r>>2]|0)+100;c[K>>2]=(c[K>>2]|0)+1}c[A>>2]=2147483646<(c[A>>2]|0)?2147483646:c[A>>2]|0;if((c[A>>2]|0)<(c[z>>2]|0)){c[z>>2]=c[A>>2];a[c[n>>2]>>0]=c[L>>2];pj(c[F>>2]|0,D|0,c[H>>2]|0)|0;c[I>>2]=c[C>>2]}if(c[q>>2]|0?(c[A>>2]|0)<(b[12226]|0):0)break;c[L>>2]=(c[L>>2]|0)+1}c[J>>2]=c[17644+(a[c[n>>2]>>0]<<2)>>2];c[K>>2]=0;while(1){if((c[K>>2]|0)>=(c[H>>2]|0))break;c[L>>2]=0;while(1){d=c[K>>2]|0;if((c[L>>2]|0)>=5)break;b[(c[E>>2]|0)+(((c[K>>2]|0)*5|0)+(c[L>>2]|0)<<1)>>1]=a[(c[J>>2]|0)+(((a[(c[F>>2]|0)+d>>0]|0)*5|0)+(c[L>>2]|0))>>0]<<7;c[L>>2]=(c[L>>2]|0)+1}c[K>>2]=d+1}c[c[G>>2]>>2]=c[I>>2];i=M;return}function ef(e,f,g,h,j,k,l,m,n,o,p){e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|0;m=m|0;n=n|0;o=o|0;p=p|0;var q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0;G=i;i=i+80|0;q=G+60|0;r=G+56|0;t=G+52|0;u=G+48|0;v=G+44|0;H=G+40|0;w=G+36|0;x=G+32|0;y=G+28|0;z=G+24|0;s=G+20|0;D=G+16|0;C=G+12|0;A=G+8|0;B=G+64|0;E=G+4|0;F=G;c[q>>2]=e;c[r>>2]=f;c[t>>2]=g;c[u>>2]=h;c[v>>2]=j;c[H>>2]=k;c[w>>2]=l;c[x>>2]=m;c[y>>2]=n;c[z>>2]=o;c[s>>2]=p;c[c[r>>2]>>2]=2147483647;c[A>>2]=c[H>>2];c[D>>2]=0;while(1){if((c[D>>2]|0)>=(c[s>>2]|0))break;c[C>>2]=d[(c[w>>2]|0)+(c[D>>2]|0)>>0];b[B>>1]=(b[c[u>>2]>>1]|0)-(a[c[A>>2]>>0]<<7);b[B+2>>1]=(b[(c[u>>2]|0)+2>>1]|0)-(a[(c[A>>2]|0)+1>>0]<<7);b[B+4>>1]=(b[(c[u>>2]|0)+4>>1]|0)-(a[(c[A>>2]|0)+2>>0]<<7);b[B+6>>1]=(b[(c[u>>2]|0)+6>>1]|0)-(a[(c[A>>2]|0)+3>>0]<<7);b[B+8>>1]=(b[(c[u>>2]|0)+8>>1]|0)-(a[(c[A>>2]|0)+4>>0]<<7);c[E>>2]=_((c[y>>2]&65535)<<16>>16,d[(c[x>>2]|0)+(c[D>>2]|0)>>0]|0)|0;if(((c[C>>2]|0)-(c[z>>2]|0)|0)>0)p=(c[C>>2]|0)-(c[z>>2]|0)|0;else p=0;c[E>>2]=(c[E>>2]|0)+(p<<10);H=_(c[(c[v>>2]|0)+4>>2]>>16,b[B+2>>1]|0)|0;c[F>>2]=H+((_(c[(c[v>>2]|0)+4>>2]&65535,b[B+2>>1]|0)|0)>>16);H=_(c[(c[v>>2]|0)+8>>2]>>16,b[B+4>>1]|0)|0;c[F>>2]=(c[F>>2]|0)+(H+((_(c[(c[v>>2]|0)+8>>2]&65535,b[B+4>>1]|0)|0)>>16));H=_(c[(c[v>>2]|0)+12>>2]>>16,b[B+6>>1]|0)|0;c[F>>2]=(c[F>>2]|0)+(H+((_(c[(c[v>>2]|0)+12>>2]&65535,b[B+6>>1]|0)|0)>>16));H=_(c[(c[v>>2]|0)+16>>2]>>16,b[B+8>>1]|0)|0;c[F>>2]=(c[F>>2]|0)+(H+((_(c[(c[v>>2]|0)+16>>2]&65535,b[B+8>>1]|0)|0)>>16));c[F>>2]=c[F>>2]<<1;H=_(c[c[v>>2]>>2]>>16,b[B>>1]|0)|0;c[F>>2]=(c[F>>2]|0)+(H+((_(c[c[v>>2]>>2]&65535,b[B>>1]|0)|0)>>16));H=_(c[F>>2]>>16,b[B>>1]|0)|0;c[E>>2]=(c[E>>2]|0)+(H+((_(c[F>>2]&65535,b[B>>1]|0)|0)>>16));H=_(c[(c[v>>2]|0)+28>>2]>>16,b[B+4>>1]|0)|0;c[F>>2]=H+((_(c[(c[v>>2]|0)+28>>2]&65535,b[B+4>>1]|0)|0)>>16);H=_(c[(c[v>>2]|0)+32>>2]>>16,b[B+6>>1]|0)|0;c[F>>2]=(c[F>>2]|0)+(H+((_(c[(c[v>>2]|0)+32>>2]&65535,b[B+6>>1]|0)|0)>>16));H=_(c[(c[v>>2]|0)+36>>2]>>16,b[B+8>>1]|0)|0;c[F>>2]=(c[F>>2]|0)+(H+((_(c[(c[v>>2]|0)+36>>2]&65535,b[B+8>>1]|0)|0)>>16));c[F>>2]=c[F>>2]<<1;H=_(c[(c[v>>2]|0)+24>>2]>>16,b[B+2>>1]|0)|0;c[F>>2]=(c[F>>2]|0)+(H+((_(c[(c[v>>2]|0)+24>>2]&65535,b[B+2>>1]|0)|0)>>16));H=_(c[F>>2]>>16,b[B+2>>1]|0)|0;c[E>>2]=(c[E>>2]|0)+(H+((_(c[F>>2]&65535,b[B+2>>1]|0)|0)>>16));H=_(c[(c[v>>2]|0)+52>>2]>>16,b[B+6>>1]|0)|0;c[F>>2]=H+((_(c[(c[v>>2]|0)+52>>2]&65535,b[B+6>>1]|0)|0)>>16);H=_(c[(c[v>>2]|0)+56>>2]>>16,b[B+8>>1]|0)|0;c[F>>2]=(c[F>>2]|0)+(H+((_(c[(c[v>>2]|0)+56>>2]&65535,b[B+8>>1]|0)|0)>>16));c[F>>2]=c[F>>2]<<1;H=_(c[(c[v>>2]|0)+48>>2]>>16,b[B+4>>1]|0)|0;c[F>>2]=(c[F>>2]|0)+(H+((_(c[(c[v>>2]|0)+48>>2]&65535,b[B+4>>1]|0)|0)>>16));H=_(c[F>>2]>>16,b[B+4>>1]|0)|0;c[E>>2]=(c[E>>2]|0)+(H+((_(c[F>>2]&65535,b[B+4>>1]|0)|0)>>16));H=_(c[(c[v>>2]|0)+76>>2]>>16,b[B+8>>1]|0)|0;c[F>>2]=H+((_(c[(c[v>>2]|0)+76>>2]&65535,b[B+8>>1]|0)|0)>>16);c[F>>2]=c[F>>2]<<1;H=_(c[(c[v>>2]|0)+72>>2]>>16,b[B+6>>1]|0)|0;c[F>>2]=(c[F>>2]|0)+(H+((_(c[(c[v>>2]|0)+72>>2]&65535,b[B+6>>1]|0)|0)>>16));H=_(c[F>>2]>>16,b[B+6>>1]|0)|0;c[E>>2]=(c[E>>2]|0)+(H+((_(c[F>>2]&65535,b[B+6>>1]|0)|0)>>16));H=_(c[(c[v>>2]|0)+96>>2]>>16,b[B+8>>1]|0)|0;c[F>>2]=H+((_(c[(c[v>>2]|0)+96>>2]&65535,b[B+8>>1]|0)|0)>>16);H=_(c[F>>2]>>16,b[B+8>>1]|0)|0;c[E>>2]=(c[E>>2]|0)+(H+((_(c[F>>2]&65535,b[B+8>>1]|0)|0)>>16));if((c[E>>2]|0)<(c[c[r>>2]>>2]|0)){c[c[r>>2]>>2]=c[E>>2];a[c[q>>2]>>0]=c[D>>2];c[c[t>>2]>>2]=c[C>>2]}c[A>>2]=(c[A>>2]|0)+5;c[D>>2]=(c[D>>2]|0)+1}i=G;return}function ff(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0;j=i;i=i+32|0;k=j+20|0;f=j+16|0;d=j+12|0;e=j+8|0;g=j+4|0;h=j;c[k>>2]=b;c[h>>2]=c[k>>2];if((a[(c[h>>2]|0)+4565>>0]|0)!=2){i=j;return}c[d>>2]=((c[(c[h>>2]|0)+4600>>2]|0)*1e3<<16|0)/(c[(c[h>>2]|0)+4568>>2]|0)|0;c[e>>2]=(Sf(c[d>>2]|0)|0)-2048;c[f>>2]=c[(c[h>>2]|0)+4728>>2];l=c[e>>2]|0;b=_(0-(c[f>>2]|0)<<2>>16,(c[f>>2]&65535)<<16>>16)|0;b=b+((_(0-(c[f>>2]|0)<<2&65535,(c[f>>2]&65535)<<16>>16)|0)>>16)>>16;d=c[e>>2]|0;d=_(b,(d-((Sf(3932160)|0)-2048)&65535)<<16>>16)|0;b=_(0-(c[f>>2]|0)<<2>>16,(c[f>>2]&65535)<<16>>16)|0;b=b+((_(0-(c[f>>2]|0)<<2&65535,(c[f>>2]&65535)<<16>>16)|0)>>16)&65535;k=c[e>>2]|0;c[e>>2]=l+(d+((_(b,(k-((Sf(3932160)|0)-2048)&65535)<<16>>16)|0)>>16));c[g>>2]=(c[e>>2]|0)-(c[(c[h>>2]|0)+8>>2]>>8);if((c[g>>2]|0)<0)c[g>>2]=(c[g>>2]|0)*3;if((c[g>>2]|0)>51)d=51;else d=(c[g>>2]|0)<-51?-51:c[g>>2]|0;c[g>>2]=d;l=((_((c[(c[h>>2]|0)+4556>>2]&65535)<<16>>16,(c[g>>2]&65535)<<16>>16)|0)>>16)*6554|0;l=(c[(c[h>>2]|0)+8>>2]|0)+(l+(((_((c[(c[h>>2]|0)+4556>>2]&65535)<<16>>16,(c[g>>2]&65535)<<16>>16)|0)&65535)*6554>>16))|0;c[(c[h>>2]|0)+8>>2]=l;l=(Sf(60)|0)<<8;l=(l|0)>((Sf(100)|0)<<8|0);d=c[(c[h>>2]|0)+8>>2]|0;do if(l){if((d|0)>((Sf(60)|0)<<8|0)){d=(Sf(60)|0)<<8;break}l=c[(c[h>>2]|0)+8>>2]|0;if((l|0)<((Sf(100)|0)<<8|0)){d=(Sf(100)|0)<<8;break}else{d=c[(c[h>>2]|0)+8>>2]|0;break}}else{if((d|0)>((Sf(100)|0)<<8|0)){d=(Sf(100)|0)<<8;break}l=c[(c[h>>2]|0)+8>>2]|0;if((l|0)<((Sf(60)|0)<<8|0)){d=(Sf(60)|0)<<8;break}else{d=c[(c[h>>2]|0)+8>>2]|0;break}}while(0);c[(c[h>>2]|0)+8>>2]=d;i=j;return}function gf(f,g,h,j,k,l,m){f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|0;m=m|0;var n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0;L=i;i=i+288|0;n=L+64|0;o=L+60|0;p=L+56|0;q=L+52|0;r=L+48|0;s=L+44|0;t=L+40|0;C=L+36|0;K=L+32|0;E=L+28|0;z=L+24|0;H=L+20|0;A=L+16|0;x=L+12|0;J=L+232|0;I=L+200|0;v=L+168|0;y=L+136|0;w=L+104|0;G=L+264|0;B=L+72|0;F=L+8|0;D=L+4|0;u=L;c[n>>2]=f;c[o>>2]=g;c[p>>2]=h;c[q>>2]=j;c[r>>2]=k;c[s>>2]=l;c[t>>2]=m;cg(c[o>>2]|0,c[(c[p>>2]|0)+32>>2]|0,b[(c[p>>2]|0)+2>>1]|0);k=e[c[p>>2]>>1]|0;c[u>>2]=ia()|0;l=i;i=i+((1*(k<<2)|0)+15&-16)|0;mf(l,c[o>>2]|0,c[(c[p>>2]|0)+8>>2]|0,b[c[p>>2]>>1]|0,b[(c[p>>2]|0)+2>>1]|0);k=i;i=i+((1*(c[s>>2]<<2)|0)+15&-16)|0;ug(l,k,b[c[p>>2]>>1]|0,c[s>>2]|0);l=i;i=i+((1*(c[s>>2]<<2)|0)+15&-16)|0;g=i;i=i+((1*(c[s>>2]<<4)|0)+15&-16)|0;c[K>>2]=0;while(1){if((c[K>>2]|0)>=(c[s>>2]|0))break;c[E>>2]=c[k+(c[K>>2]<<2)>>2];m=_(c[E>>2]|0,b[(c[p>>2]|0)+2>>1]|0)|0;c[F>>2]=(c[(c[p>>2]|0)+8>>2]|0)+m;c[C>>2]=0;while(1){if((c[C>>2]|0)>=(b[(c[p>>2]|0)+2>>1]|0))break;b[v+(c[C>>2]<<1)>>1]=(d[(c[F>>2]|0)+(c[C>>2]|0)>>0]&65535)<<7;b[J+(c[C>>2]<<1)>>1]=(b[(c[o>>2]|0)+(c[C>>2]<<1)>>1]|0)-(b[v+(c[C>>2]<<1)>>1]|0);c[C>>2]=(c[C>>2]|0)+1}fg(y,v,b[(c[p>>2]|0)+2>>1]|0);c[C>>2]=0;while(1){if((c[C>>2]|0)>=(b[(c[p>>2]|0)+2>>1]|0))break;c[x>>2]=hf(b[y+(c[C>>2]<<1)>>1]<<16)|0;m=(_(b[J+(c[C>>2]<<1)>>1]|0,(c[x>>2]&65535)<<16>>16)|0)>>14&65535;b[I+(c[C>>2]<<1)>>1]=m;c[C>>2]=(c[C>>2]|0)+1}c[C>>2]=0;while(1){if((c[C>>2]|0)>=(b[(c[p>>2]|0)+2>>1]|0))break;b[w+(c[C>>2]<<1)>>1]=(b[(c[q>>2]|0)+(c[C>>2]<<1)>>1]<<5|0)/(b[y+(c[C>>2]<<1)>>1]|0)|0;c[C>>2]=(c[C>>2]|0)+1}nf(B,G,c[p>>2]|0,c[E>>2]|0);f=of(g+(c[K>>2]<<4)|0,I,w,G,B,c[(c[p>>2]|0)+28>>2]|0,b[(c[p>>2]|0)+4>>1]|0,b[(c[p>>2]|0)+6>>1]|0,c[r>>2]|0,b[(c[p>>2]|0)+2>>1]|0)|0;c[l+(c[K>>2]<<2)>>2]=f;f=_(c[t>>2]>>1,b[c[p>>2]>>1]|0)|0;c[D>>2]=(c[(c[p>>2]|0)+12>>2]|0)+f;f=c[E>>2]|0;if(!(c[E>>2]|0))c[H>>2]=256-(d[(c[D>>2]|0)+f>>0]|0);else c[H>>2]=(d[(c[D>>2]|0)+(f-1)>>0]|0)-(d[(c[D>>2]|0)+(c[E>>2]|0)>>0]|0);c[A>>2]=1024-(Sf(c[H>>2]|0)|0);m=(c[l+(c[K>>2]<<2)>>2]|0)+(_((c[A>>2]&65535)<<16>>16,(c[r>>2]>>2&65535)<<16>>16)|0)|0;c[l+(c[K>>2]<<2)>>2]=m;c[K>>2]=(c[K>>2]|0)+1}ug(l,z,c[s>>2]|0,1);a[c[n>>2]>>0]=c[k+(c[z>>2]<<2)>>2];pj((c[n>>2]|0)+1|0,g+(c[z>>2]<<4)|0,b[(c[p>>2]|0)+2>>1]|0)|0;ge(c[o>>2]|0,c[n>>2]|0,c[p>>2]|0);K=c[l>>2]|0;na(c[u>>2]|0);i=L;return K|0}function hf(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;h=i;i=i+32|0;b=h+16|0;d=h+12|0;g=h+8|0;f=h+4|0;e=h;c[d>>2]=a;if((c[d>>2]|0)<=0){c[b>>2]=0;g=c[b>>2]|0;i=h;return g|0}jf(c[d>>2]|0,f,e);if(c[f>>2]&1|0)c[g>>2]=32768;else c[g>>2]=46214;c[g>>2]=c[g>>2]>>(c[f>>2]>>1);a=_(c[g>>2]>>16,(((c[e>>2]&65535)<<16>>16)*213&65535)<<16>>16)|0;c[g>>2]=(c[g>>2]|0)+(a+((_(c[g>>2]&65535,(((c[e>>2]&65535)<<16>>16)*213&65535)<<16>>16)|0)>>16));c[b>>2]=c[g>>2];g=c[b>>2]|0;i=h;return g|0}function jf(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;e=i;i=i+16|0;h=e+12|0;j=e+8|0;f=e+4|0;g=e;c[h>>2]=a;c[j>>2]=b;c[f>>2]=d;c[g>>2]=kf(c[h>>2]|0)|0;c[c[j>>2]>>2]=c[g>>2];b=(lf(c[h>>2]|0,24-(c[g>>2]|0)|0)|0)&127;c[c[f>>2]>>2]=b;i=e;return}function kf(a){a=a|0;var b=0,d=0;d=i;i=i+16|0;b=d;c[b>>2]=a;if(!(c[b>>2]|0)){a=32;i=d;return a|0}a=32-(32-(aa(c[b>>2]|0)|0))|0;i=d;return a|0}function lf(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0;k=i;i=i+32|0;e=k+20|0;d=k+16|0;f=k+12|0;j=k+8|0;h=k+4|0;g=k;c[d>>2]=a;c[f>>2]=b;c[j>>2]=c[d>>2];c[h>>2]=c[f>>2];c[g>>2]=0-(c[f>>2]|0);if(!(c[f>>2]|0)){c[e>>2]=c[d>>2];j=c[e>>2]|0;i=k;return j|0}d=c[j>>2]|0;if((c[f>>2]|0)<0){c[e>>2]=d<<c[g>>2]|(c[j>>2]|0)>>>(32-(c[g>>2]|0)|0);j=c[e>>2]|0;i=k;return j|0}else{c[e>>2]=d<<32-(c[h>>2]|0)|(c[j>>2]|0)>>>(c[h>>2]|0);j=c[e>>2]|0;i=k;return j|0}return 0}function mf(a,e,f,g,h){a=a|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;t=i;i=i+48|0;j=t+36|0;k=t+32|0;l=t+28|0;m=t+24|0;n=t+20|0;p=t+16|0;q=t+12|0;o=t+8|0;s=t+4|0;r=t;c[j>>2]=a;c[k>>2]=e;c[l>>2]=f;c[m>>2]=g;c[n>>2]=h;c[p>>2]=0;while(1){if((c[p>>2]|0)>=(c[m>>2]|0))break;c[r>>2]=0;c[q>>2]=0;while(1){if((c[q>>2]|0)>=(c[n>>2]|0))break;f=b[(c[k>>2]|0)+(c[q>>2]<<1)>>1]|0;e=c[l>>2]|0;c[l>>2]=e+1;c[o>>2]=f-(d[e>>0]<<7);c[s>>2]=_((c[o>>2]&65535)<<16>>16,(c[o>>2]&65535)<<16>>16)|0;e=b[(c[k>>2]|0)+((c[q>>2]|0)+1<<1)>>1]|0;f=c[l>>2]|0;c[l>>2]=f+1;c[o>>2]=e-(d[f>>0]<<7);c[s>>2]=(c[s>>2]|0)+(_((c[o>>2]&65535)<<16>>16,(c[o>>2]&65535)<<16>>16)|0);c[r>>2]=(c[r>>2]|0)+(c[s>>2]>>4);c[q>>2]=(c[q>>2]|0)+2}c[(c[j>>2]|0)+(c[p>>2]<<2)>>2]=c[r>>2];c[p>>2]=(c[p>>2]|0)+1}i=t;return}function nf(e,f,g,h){e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;p=i;i=i+32|0;j=p+20|0;k=p+16|0;l=p+12|0;q=p+8|0;o=p+4|0;n=p+24|0;m=p;c[j>>2]=e;c[k>>2]=f;c[l>>2]=g;c[q>>2]=h;g=(_(c[q>>2]|0,b[(c[l>>2]|0)+2>>1]|0)|0)/2|0;c[m>>2]=(c[(c[l>>2]|0)+20>>2]|0)+g;c[o>>2]=0;while(1){if((c[o>>2]|0)>=(b[(c[l>>2]|0)+2>>1]|0))break;q=c[m>>2]|0;c[m>>2]=q+1;a[n>>0]=a[q>>0]|0;b[(c[j>>2]|0)+(c[o>>2]<<1)>>1]=((d[n>>0]>>1&7)<<16>>16)*9;q=(c[o>>2]|0)+(_(d[n>>0]&1,(b[(c[l>>2]|0)+2>>1]|0)-1|0)|0)|0;a[(c[k>>2]|0)+(c[o>>2]|0)>>0]=a[(c[(c[l>>2]|0)+16>>2]|0)+q>>0]|0;b[(c[j>>2]|0)+((c[o>>2]|0)+1<<1)>>1]=((d[n>>0]>>5&7)<<16>>16)*9;q=(c[o>>2]|0)+(_(d[n>>0]>>4&1,(b[(c[l>>2]|0)+2>>1]|0)-1|0)|0)+1|0;a[(c[k>>2]|0)+((c[o>>2]|0)+1)>>0]=a[(c[(c[l>>2]|0)+16>>2]|0)+q>>0]|0;c[o>>2]=(c[o>>2]|0)+2}i=p;return}function of(e,f,g,h,j,k,l,m,n,o){e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|0;m=m|0;n=n|0;o=o|0;var p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,$=0,aa=0;aa=i;i=i+448|0;q=aa+352|0;r=aa+348|0;s=aa+344|0;t=aa+340|0;u=aa+336|0;v=aa+332|0;p=aa+328|0;w=aa+378|0;x=aa+324|0;y=aa+376|0;E=aa+320|0;L=aa+316|0;P=aa+312|0;K=aa+308|0;I=aa+304|0;H=aa+300|0;F=aa+296|0;$=aa+292|0;U=aa+288|0;D=aa+284|0;Q=aa+280|0;S=aa+276|0;X=aa+272|0;Y=aa+268|0;C=aa+264|0;N=aa+260|0;O=aa+256|0;M=aa+252|0;V=aa+248|0;J=aa+232|0;G=aa+384|0;W=aa+360|0;z=aa+200|0;B=aa+184|0;A=aa+168|0;Z=aa+160|0;R=aa+80|0;T=aa;c[q>>2]=e;c[r>>2]=f;c[s>>2]=g;c[t>>2]=h;c[u>>2]=j;c[v>>2]=k;c[p>>2]=l;b[w>>1]=m;c[x>>2]=n;b[y>>1]=o;c[E>>2]=-10;while(1){if((c[E>>2]|0)>9)break;c[Q>>2]=c[E>>2]<<10;c[S>>2]=(c[Q>>2]|0)+1024;do if((c[E>>2]|0)<=0){if(!(c[E>>2]|0)){c[S>>2]=(c[S>>2]|0)-102;break}f=(c[E>>2]|0)==-1;c[Q>>2]=(c[Q>>2]|0)+102;if(!f)c[S>>2]=(c[S>>2]|0)+102}else{c[Q>>2]=(c[Q>>2]|0)-102;c[S>>2]=(c[S>>2]|0)-102}while(0);f=_(c[Q>>2]>>16,(c[p>>2]&65535)<<16>>16)|0;f=f+((_(c[Q>>2]&65535,(c[p>>2]&65535)<<16>>16)|0)>>16)|0;c[R+((c[E>>2]|0)+10<<2)>>2]=f;f=_(c[S>>2]>>16,(c[p>>2]&65535)<<16>>16)|0;f=f+((_(c[S>>2]&65535,(c[p>>2]&65535)<<16>>16)|0)>>16)|0;c[T+((c[E>>2]|0)+10<<2)>>2]=f;c[E>>2]=(c[E>>2]|0)+1}c[P>>2]=1;c[z>>2]=0;b[W>>1]=0;c[E>>2]=(b[y>>1]|0)-1;a:while(1){c[Z>>2]=(c[v>>2]|0)+(b[(c[u>>2]|0)+(c[E>>2]<<1)>>1]|0);c[V>>2]=d[(c[t>>2]|0)+(c[E>>2]|0)>>0]<<8;c[F>>2]=b[(c[r>>2]|0)+(c[E>>2]<<1)>>1];c[L>>2]=0;while(1){if((c[L>>2]|0)>=(c[P>>2]|0))break;f=_(c[V>>2]>>16,b[W+(c[L>>2]<<1)>>1]|0)|0;c[U>>2]=f+((_(c[V>>2]&65535,b[W+(c[L>>2]<<1)>>1]|0)|0)>>16);c[$>>2]=(c[F>>2]|0)-(c[U>>2]|0);f=_(b[w>>1]>>16,(c[$>>2]&65535)<<16>>16)|0;c[K>>2]=f+((_(b[w>>1]&65535,(c[$>>2]&65535)<<16>>16)|0)>>16);if((c[K>>2]|0)>9)p=9;else p=(c[K>>2]|0)<-10?-10:c[K>>2]|0;c[K>>2]=p;a[G+(c[L>>2]<<4)+(c[E>>2]|0)>>0]=c[K>>2];c[Q>>2]=c[R+((c[K>>2]|0)+10<<2)>>2];c[S>>2]=c[T+((c[K>>2]|0)+10<<2)>>2];c[Q>>2]=(c[Q>>2]|0)+(c[U>>2]|0);c[S>>2]=(c[S>>2]|0)+(c[U>>2]|0);b[W+(c[L>>2]<<1)>>1]=c[Q>>2];b[W+((c[L>>2]|0)+(c[P>>2]|0)<<1)>>1]=c[S>>2];j=c[K>>2]|0;do if(((c[K>>2]|0)+1|0)>=4){p=c[K>>2]|0;if((j+1|0)==4){c[X>>2]=d[(c[Z>>2]|0)+(p+4)>>0];c[Y>>2]=280;break}else{c[X>>2]=108+(((p&65535)<<16>>16)*43|0);c[Y>>2]=(c[X>>2]|0)+43;break}}else{p=c[K>>2]|0;if((j|0)>-4){c[X>>2]=d[(c[Z>>2]|0)+(p+4)>>0];c[Y>>2]=d[(c[Z>>2]|0)+((c[K>>2]|0)+1+4)>>0];break}if((p|0)==-4){c[X>>2]=280;c[Y>>2]=d[(c[Z>>2]|0)+((c[K>>2]|0)+1+4)>>0];break}else{c[X>>2]=108+(_(-43,(c[K>>2]&65535)<<16>>16)|0);c[Y>>2]=(c[X>>2]|0)-43;break}}while(0);c[C>>2]=c[z+(c[L>>2]<<2)>>2];c[D>>2]=(c[F>>2]|0)-(c[Q>>2]|0);f=_((c[D>>2]&65535)<<16>>16,(c[D>>2]&65535)<<16>>16)|0;f=(c[C>>2]|0)+(_(f,b[(c[s>>2]|0)+(c[E>>2]<<1)>>1]|0)|0)|0;f=f+(_((c[x>>2]&65535)<<16>>16,(c[X>>2]&65535)<<16>>16)|0)|0;c[z+(c[L>>2]<<2)>>2]=f;c[D>>2]=(c[F>>2]|0)-(c[S>>2]|0);f=_((c[D>>2]&65535)<<16>>16,(c[D>>2]&65535)<<16>>16)|0;f=(c[C>>2]|0)+(_(f,b[(c[s>>2]|0)+(c[E>>2]<<1)>>1]|0)|0)|0;f=f+(_((c[x>>2]&65535)<<16>>16,(c[Y>>2]&65535)<<16>>16)|0)|0;c[z+((c[L>>2]|0)+(c[P>>2]|0)<<2)>>2]=f;c[L>>2]=(c[L>>2]|0)+1}b:do if((c[P>>2]|0)<=2){c[L>>2]=0;while(1){if((c[L>>2]|0)>=(c[P>>2]|0))break;a[G+((c[L>>2]|0)+(c[P>>2]|0)<<4)+(c[E>>2]|0)>>0]=(a[G+(c[L>>2]<<4)+(c[E>>2]|0)>>0]|0)+1;c[L>>2]=(c[L>>2]|0)+1}c[P>>2]=c[P>>2]<<1;c[L>>2]=c[P>>2];while(1){if((c[L>>2]|0)>=4)break b;a[G+(c[L>>2]<<4)+(c[E>>2]|0)>>0]=a[G+((c[L>>2]|0)-(c[P>>2]|0)<<4)+(c[E>>2]|0)>>0]|0;c[L>>2]=(c[L>>2]|0)+1}}else{if((c[E>>2]|0)<=0)break a;c[L>>2]=0;while(1){if((c[L>>2]|0)>=4)break;p=c[z+(c[L>>2]<<2)>>2]|0;j=c[L>>2]|0;if((c[z+(c[L>>2]<<2)>>2]|0)>(c[z+((c[L>>2]|0)+4<<2)>>2]|0)){c[A+(j<<2)>>2]=p;c[B+(c[L>>2]<<2)>>2]=c[z+((c[L>>2]|0)+4<<2)>>2];c[z+(c[L>>2]<<2)>>2]=c[B+(c[L>>2]<<2)>>2];c[z+((c[L>>2]|0)+4<<2)>>2]=c[A+(c[L>>2]<<2)>>2];c[Q>>2]=b[W+(c[L>>2]<<1)>>1];b[W+(c[L>>2]<<1)>>1]=b[W+((c[L>>2]|0)+4<<1)>>1]|0;b[W+((c[L>>2]|0)+4<<1)>>1]=c[Q>>2];c[J+(c[L>>2]<<2)>>2]=(c[L>>2]|0)+4}else{c[B+(j<<2)>>2]=p;c[A+(c[L>>2]<<2)>>2]=c[z+((c[L>>2]|0)+4<<2)>>2];c[J+(c[L>>2]<<2)>>2]=c[L>>2]}c[L>>2]=(c[L>>2]|0)+1}while(1){c[O>>2]=2147483647;c[M>>2]=0;c[I>>2]=0;c[H>>2]=0;c[L>>2]=0;while(1){p=c[O>>2]|0;if((c[L>>2]|0)>=4)break;if((p|0)>(c[A+(c[L>>2]<<2)>>2]|0)){c[O>>2]=c[A+(c[L>>2]<<2)>>2];c[I>>2]=c[L>>2]}if((c[M>>2]|0)<(c[B+(c[L>>2]<<2)>>2]|0)){c[M>>2]=c[B+(c[L>>2]<<2)>>2];c[H>>2]=c[L>>2]}c[L>>2]=(c[L>>2]|0)+1}if((p|0)>=(c[M>>2]|0))break;c[J+(c[H>>2]<<2)>>2]=c[J+(c[I>>2]<<2)>>2]^4;c[z+(c[H>>2]<<2)>>2]=c[z+((c[I>>2]|0)+4<<2)>>2];b[W+(c[H>>2]<<1)>>1]=b[W+((c[I>>2]|0)+4<<1)>>1]|0;c[B+(c[H>>2]<<2)>>2]=0;c[A+(c[I>>2]<<2)>>2]=2147483647;p=G+(c[H>>2]<<4)|0;j=G+(c[I>>2]<<4)|0;k=p+16|0;do{a[p>>0]=a[j>>0]|0;p=p+1|0;j=j+1|0}while((p|0)<(k|0))}c[L>>2]=0;while(1){if((c[L>>2]|0)>=4)break b;f=G+(c[L>>2]<<4)+(c[E>>2]|0)|0;a[f>>0]=(a[f>>0]|0)+(c[J+(c[L>>2]<<2)>>2]>>2);c[L>>2]=(c[L>>2]|0)+1}}while(0);c[E>>2]=(c[E>>2]|0)+-1}c[K>>2]=0;c[N>>2]=2147483647;c[L>>2]=0;while(1){if((c[L>>2]|0)>=8)break;if((c[N>>2]|0)>(c[z+(c[L>>2]<<2)>>2]|0)){c[N>>2]=c[z+(c[L>>2]<<2)>>2];c[K>>2]=c[L>>2]}c[L>>2]=(c[L>>2]|0)+1}c[L>>2]=0;while(1){if((c[L>>2]|0)>=(b[y>>1]|0))break;a[(c[q>>2]|0)+(c[L>>2]|0)>>0]=a[G+((c[K>>2]&3)<<4)+(c[L>>2]|0)>>0]|0;c[L>>2]=(c[L>>2]|0)+1}$=c[q>>2]|0;a[$>>0]=(a[$>>0]|0)+(c[K>>2]>>2);i=aa;return c[N>>2]|0}function pf(d,e,f,g){d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;t=i;i=i+128|0;h=t+28|0;j=t+24|0;k=t+20|0;l=t+16|0;o=t+12|0;n=t+8|0;m=t+4|0;p=t;q=t+96|0;s=t+64|0;r=t+32|0;c[h>>2]=d;c[j>>2]=e;c[k>>2]=f;c[l>>2]=g;d=_(-5,(c[(c[h>>2]|0)+4556>>2]&65535)<<16>>16)|0;c[m>>2]=3146+(d+(((c[(c[h>>2]|0)+4556>>2]&65535)<<16>>16)*59246>>16));if((c[(c[h>>2]|0)+4604>>2]|0)==2)c[m>>2]=(c[m>>2]|0)+(c[m>>2]>>1);fg(s,c[k>>2]|0,c[(c[h>>2]|0)+4664>>2]|0);if((c[(c[h>>2]|0)+4656>>2]|0)==1)e=(a[(c[h>>2]|0)+4768+31>>0]|0)<4;else e=0;c[n>>2]=e&1;a:do if(c[n>>2]|0){de(q,c[l>>2]|0,c[k>>2]|0,a[(c[h>>2]|0)+4768+31>>0]|0,c[(c[h>>2]|0)+4664>>2]|0);fg(r,q,c[(c[h>>2]|0)+4664>>2]|0);c[p>>2]=(_(a[(c[h>>2]|0)+4768+31>>0]<<16>>16,a[(c[h>>2]|0)+4768+31>>0]<<16>>16)|0)<<11;c[o>>2]=0;while(1){if((c[o>>2]|0)>=(c[(c[h>>2]|0)+4664>>2]|0))break a;d=_(b[r+(c[o>>2]<<1)>>1]>>16,(c[p>>2]&65535)<<16>>16)|0;d=(b[s+(c[o>>2]<<1)>>1]>>1)+(d+((_(b[r+(c[o>>2]<<1)>>1]&65535,(c[p>>2]&65535)<<16>>16)|0)>>16))&65535;b[s+(c[o>>2]<<1)>>1]=d;c[o>>2]=(c[o>>2]|0)+1}}while(0);gf((c[h>>2]|0)+4768+8|0,c[k>>2]|0,c[(c[h>>2]|0)+4724>>2]|0,s,c[m>>2]|0,c[(c[h>>2]|0)+4692>>2]|0,a[(c[h>>2]|0)+4768+29>>0]|0)|0;ag((c[j>>2]|0)+32|0,c[k>>2]|0,c[(c[h>>2]|0)+4664>>2]|0);if(c[n>>2]|0){de(q,c[l>>2]|0,c[k>>2]|0,a[(c[h>>2]|0)+4768+31>>0]|0,c[(c[h>>2]|0)+4664>>2]|0);ag(c[j>>2]|0,q,c[(c[h>>2]|0)+4664>>2]|0);i=t;return}else{pj(c[j>>2]|0,(c[j>>2]|0)+32|0,c[(c[h>>2]|0)+4664>>2]<<1|0)|0;i=t;return}}function qf(d,e,f,g,h,j,k,l,m,n,o){d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|0;m=m|0;n=n|0;o=o|0;var p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0;V=i;i=i+144|0;J=V+128|0;p=V+124|0;M=V+120|0;w=V+116|0;x=V+112|0;y=V+108|0;z=V+104|0;r=V+100|0;A=V+96|0;F=V+92|0;K=V+88|0;O=V+84|0;v=V+80|0;B=V+76|0;G=V+72|0;H=V+68|0;S=V+64|0;q=V+60|0;E=V+56|0;R=V+48|0;P=V+44|0;Q=V+40|0;t=V+36|0;s=V+32|0;C=V+28|0;u=V+24|0;D=V+20|0;U=V+16|0;T=V+12|0;I=V+8|0;N=V+4|0;L=V;c[J>>2]=d;c[p>>2]=e;c[M>>2]=f;c[w>>2]=g;c[x>>2]=h;c[y>>2]=j;c[z>>2]=k;c[r>>2]=l;c[A>>2]=m;c[F>>2]=n;c[K>>2]=o;c[N>>2]=(c[p>>2]|0)+-4;f=(c[K>>2]|0)+2|0;c[L>>2]=ia()|0;j=i;i=i+((1*(f<<1)|0)+15&-16)|0;c[O>>2]=0;while(1){if((c[O>>2]|0)>=((c[K>>2]|0)+2|0))break;c[S>>2]=(b[(c[p>>2]|0)+((c[O>>2]|0)-2<<1)>>1]|0)+(b[(c[M>>2]|0)+((c[O>>2]|0)-2<<1)>>1]|0);c[q>>2]=(b[(c[p>>2]|0)+((c[O>>2]|0)-2<<1)>>1]|0)-(b[(c[M>>2]|0)+((c[O>>2]|0)-2<<1)>>1]|0);b[(c[N>>2]|0)+(c[O>>2]<<1)>>1]=(c[S>>2]>>1)+(c[S>>2]&1);if(((c[q>>2]>>1)+(c[q>>2]&1)|0)<=32767)if(((c[q>>2]>>1)+(c[q>>2]&1)|0)<-32768)o=-32768;else o=(c[q>>2]>>1)+(c[q>>2]&1)|0;else o=32767;b[j+(c[O>>2]<<1)>>1]=o;c[O>>2]=(c[O>>2]|0)+1}g=c[N>>2]|0;h=(c[J>>2]|0)+4|0;b[g>>1]=b[h>>1]|0;b[g+2>>1]=b[h+2>>1]|0;g=(c[J>>2]|0)+8|0;b[j>>1]=b[g>>1]|0;b[j+2>>1]=b[g+2>>1]|0;g=(c[J>>2]|0)+4|0;h=(c[N>>2]|0)+(c[K>>2]<<1)|0;b[g>>1]=b[h>>1]|0;b[g+2>>1]=b[h+2>>1]|0;g=(c[J>>2]|0)+8|0;h=j+(c[K>>2]<<1)|0;b[g>>1]=b[h>>1]|0;b[g+2>>1]=b[h+2>>1]|0;g=i;i=i+((1*(c[K>>2]<<1)|0)+15&-16)|0;h=i;i=i+((1*(c[K>>2]<<1)|0)+15&-16)|0;c[O>>2]=0;while(1){if((c[O>>2]|0)>=(c[K>>2]|0))break;c[S>>2]=((b[(c[N>>2]|0)+(c[O>>2]<<1)>>1]|0)+(b[(c[N>>2]|0)+((c[O>>2]|0)+2<<1)>>1]|0)+(b[(c[N>>2]|0)+((c[O>>2]|0)+1<<1)>>1]<<1)>>1)+1>>1;b[g+(c[O>>2]<<1)>>1]=c[S>>2];b[h+(c[O>>2]<<1)>>1]=(b[(c[N>>2]|0)+((c[O>>2]|0)+1<<1)>>1]|0)-(c[S>>2]|0);c[O>>2]=(c[O>>2]|0)+1}o=i;i=i+((1*(c[K>>2]<<1)|0)+15&-16)|0;n=i;i=i+((1*(c[K>>2]<<1)|0)+15&-16)|0;c[O>>2]=0;while(1){if((c[O>>2]|0)>=(c[K>>2]|0))break;c[S>>2]=((b[j+(c[O>>2]<<1)>>1]|0)+(b[j+((c[O>>2]|0)+2<<1)>>1]|0)+(b[j+((c[O>>2]|0)+1<<1)>>1]<<1)>>1)+1>>1;b[o+(c[O>>2]<<1)>>1]=c[S>>2];b[n+(c[O>>2]<<1)>>1]=(b[j+((c[O>>2]|0)+1<<1)>>1]|0)-(c[S>>2]|0);c[O>>2]=(c[O>>2]|0)+1}c[v>>2]=(c[K>>2]|0)==((c[F>>2]|0)*10|0)&1;c[E>>2]=c[v>>2]|0?328:655;q=(_((c[r>>2]&65535)<<16>>16,(c[r>>2]&65535)<<16>>16)|0)>>16;q=_(q,(c[E>>2]&65535)<<16>>16)|0;r=(_((c[r>>2]&65535)<<16>>16,(c[r>>2]&65535)<<16>>16)|0)&65535;c[E>>2]=q+((_(r,(c[E>>2]&65535)<<16>>16)|0)>>16);c[R>>2]=Bg(t,g,o,(c[J>>2]|0)+12|0,c[K>>2]|0,c[E>>2]|0)|0;c[R+4>>2]=Bg(s,h,n,(c[J>>2]|0)+12+8|0,c[K>>2]|0,c[E>>2]|0)|0;c[C>>2]=(c[s>>2]|0)+(((c[t>>2]&65535)<<16>>16)*3|0);c[C>>2]=(c[C>>2]|0)<65536?c[C>>2]|0:65536;v=(c[z>>2]|0)-(c[v>>2]|0?1200:600)|0;c[z>>2]=v;c[z>>2]=(c[z>>2]|0)<1?1:v;c[D>>2]=2e3+(((c[F>>2]&65535)<<16>>16)*900|0);c[u>>2]=(c[C>>2]|0)*3;v=rf(c[z>>2]|0,851968+(c[u>>2]|0)|0,19)|0;c[c[y>>2]>>2]=v;if((c[c[y>>2]>>2]|0)<(c[D>>2]|0)){c[c[y>>2]>>2]=c[D>>2];c[(c[y>>2]|0)+4>>2]=(c[z>>2]|0)-(c[c[y>>2]>>2]|0);v=_(65536+(c[u>>2]|0)>>16,(c[D>>2]&65535)<<16>>16)|0;c[U>>2]=rf((c[(c[y>>2]|0)+4>>2]<<1)-(c[D>>2]|0)|0,v+((_(65536+(c[u>>2]|0)&65535,(c[D>>2]&65535)<<16>>16)|0)>>16)|0,16)|0;if((c[U>>2]|0)>16384)o=16384;else o=(c[U>>2]|0)<0?0:c[U>>2]|0;c[U>>2]=o}else{c[(c[y>>2]|0)+4>>2]=(c[z>>2]|0)-(c[c[y>>2]>>2]|0);c[U>>2]=16384}v=_((c[U>>2]|0)-(b[(c[J>>2]|0)+28>>1]|0)>>16,(c[E>>2]&65535)<<16>>16)|0;E=(b[(c[J>>2]|0)+28>>1]|0)+(v+((_((c[U>>2]|0)-(b[(c[J>>2]|0)+28>>1]|0)&65535,(c[E>>2]&65535)<<16>>16)|0)>>16))&65535;b[(c[J>>2]|0)+28>>1]=E;a[c[x>>2]>>0]=0;a:do if(!(c[A>>2]|0)){do if(!(b[(c[J>>2]|0)+30>>1]|0)){if((c[z>>2]<<3|0)>=((c[D>>2]|0)*13|0)?(E=_(c[C>>2]>>16,b[(c[J>>2]|0)+28>>1]|0)|0,(E+((_(c[C>>2]&65535,b[(c[J>>2]|0)+28>>1]|0)|0)>>16)|0)>=819):0)break;c[R>>2]=(_(b[(c[J>>2]|0)+28>>1]|0,(c[R>>2]&65535)<<16>>16)|0)>>14;c[R+4>>2]=(_(b[(c[J>>2]|0)+28>>1]|0,(c[R+4>>2]&65535)<<16>>16)|0)>>14;Ig(R,c[w>>2]|0);c[U>>2]=0;c[R>>2]=0;c[R+4>>2]=0;c[c[y>>2]>>2]=c[z>>2];c[(c[y>>2]|0)+4>>2]=0;a[c[x>>2]>>0]=1;break a}while(0);do if(b[(c[J>>2]|0)+30>>1]|0){if((c[z>>2]<<3|0)>=((c[D>>2]|0)*11|0)?(E=_(c[C>>2]>>16,b[(c[J>>2]|0)+28>>1]|0)|0,(E+((_(c[C>>2]&65535,b[(c[J>>2]|0)+28>>1]|0)|0)>>16)|0)>=328):0)break;c[R>>2]=(_(b[(c[J>>2]|0)+28>>1]|0,(c[R>>2]&65535)<<16>>16)|0)>>14;c[R+4>>2]=(_(b[(c[J>>2]|0)+28>>1]|0,(c[R+4>>2]&65535)<<16>>16)|0)>>14;Ig(R,c[w>>2]|0);c[U>>2]=0;c[R>>2]=0;c[R+4>>2]=0;break a}while(0);if((b[(c[J>>2]|0)+28>>1]|0)>15565){Ig(R,c[w>>2]|0);c[U>>2]=16384;break}else{c[R>>2]=(_(b[(c[J>>2]|0)+28>>1]|0,(c[R>>2]&65535)<<16>>16)|0)>>14;c[R+4>>2]=(_(b[(c[J>>2]|0)+28>>1]|0,(c[R+4>>2]&65535)<<16>>16)|0)>>14;Ig(R,c[w>>2]|0);c[U>>2]=b[(c[J>>2]|0)+28>>1];break}}else{c[U>>2]=0;c[R>>2]=0;c[R+4>>2]=0;Ig(R,c[w>>2]|0)}while(0);do if((a[c[x>>2]>>0]|0)==1){E=(c[J>>2]|0)+32|0;b[E>>1]=(b[E>>1]|0)+((c[K>>2]|0)-(c[F>>2]<<3));if((b[(c[J>>2]|0)+32>>1]|0)<((c[F>>2]|0)*5|0)){a[c[x>>2]>>0]=0;break}else{b[(c[J>>2]|0)+32>>1]=1e4;break}}else b[(c[J>>2]|0)+32>>1]=0;while(0);if((a[c[x>>2]>>0]|0)==0?(c[(c[y>>2]|0)+4>>2]|0)<1:0){c[(c[y>>2]|0)+4>>2]=1;E=tf(1,(c[z>>2]|0)-(c[(c[y>>2]|0)+4>>2]|0)|0)|0;c[c[y>>2]>>2]=E}c[P>>2]=0-(b[c[J>>2]>>1]|0);c[Q>>2]=0-(b[(c[J>>2]|0)+2>>1]|0);c[T>>2]=b[(c[J>>2]|0)+30>>1]<<10;c[B>>2]=65536/(c[F>>2]<<3|0)|0;c[G>>2]=0-(((_(((c[R>>2]|0)-(b[c[J>>2]>>1]|0)&65535)<<16>>16,(c[B>>2]&65535)<<16>>16)|0)>>15)+1>>1);c[H>>2]=0-(((_(((c[R+4>>2]|0)-(b[(c[J>>2]|0)+2>>1]|0)&65535)<<16>>16,(c[B>>2]&65535)<<16>>16)|0)>>15)+1>>1);E=_((c[U>>2]|0)-(b[(c[J>>2]|0)+30>>1]|0)>>16,(c[B>>2]&65535)<<16>>16)|0;c[I>>2]=E+((_((c[U>>2]|0)-(b[(c[J>>2]|0)+30>>1]|0)&65535,(c[B>>2]&65535)<<16>>16)|0)>>16)<<10;c[O>>2]=0;while(1){if((c[O>>2]|0)>=(c[F>>2]<<3|0))break;c[P>>2]=(c[P>>2]|0)+(c[G>>2]|0);c[Q>>2]=(c[Q>>2]|0)+(c[H>>2]|0);c[T>>2]=(c[T>>2]|0)+(c[I>>2]|0);c[S>>2]=(b[(c[N>>2]|0)+(c[O>>2]<<1)>>1]|0)+(b[(c[N>>2]|0)+((c[O>>2]|0)+2<<1)>>1]|0)+(b[(c[N>>2]|0)+((c[O>>2]|0)+1<<1)>>1]<<1)<<9;D=_(c[T>>2]>>16,b[j+((c[O>>2]|0)+1<<1)>>1]|0)|0;D=D+((_(c[T>>2]&65535,b[j+((c[O>>2]|0)+1<<1)>>1]|0)|0)>>16)|0;E=_(c[S>>2]>>16,(c[P>>2]&65535)<<16>>16)|0;c[S>>2]=D+(E+((_(c[S>>2]&65535,(c[P>>2]&65535)<<16>>16)|0)>>16));E=_(b[(c[N>>2]|0)+((c[O>>2]|0)+1<<1)>>1]<<11>>16,(c[Q>>2]&65535)<<16>>16)|0;c[S>>2]=(c[S>>2]|0)+(E+((_(b[(c[N>>2]|0)+((c[O>>2]|0)+1<<1)>>1]<<11&65535,(c[Q>>2]&65535)<<16>>16)|0)>>16));if(((c[S>>2]>>7)+1>>1|0)<=32767)if(((c[S>>2]>>7)+1>>1|0)<-32768)o=-32768;else o=(c[S>>2]>>7)+1>>1;else o=32767;b[(c[M>>2]|0)+((c[O>>2]|0)-1<<1)>>1]=o;c[O>>2]=(c[O>>2]|0)+1}c[P>>2]=0-(c[R>>2]|0);c[Q>>2]=0-(c[R+4>>2]|0);c[T>>2]=c[U>>2]<<10;c[O>>2]=c[F>>2]<<3;while(1){if((c[O>>2]|0)>=(c[K>>2]|0))break;c[S>>2]=(b[(c[N>>2]|0)+(c[O>>2]<<1)>>1]|0)+(b[(c[N>>2]|0)+((c[O>>2]|0)+2<<1)>>1]|0)+(b[(c[N>>2]|0)+((c[O>>2]|0)+1<<1)>>1]<<1)<<9;H=_(c[T>>2]>>16,b[j+((c[O>>2]|0)+1<<1)>>1]|0)|0;H=H+((_(c[T>>2]&65535,b[j+((c[O>>2]|0)+1<<1)>>1]|0)|0)>>16)|0;I=_(c[S>>2]>>16,(c[P>>2]&65535)<<16>>16)|0;c[S>>2]=H+(I+((_(c[S>>2]&65535,(c[P>>2]&65535)<<16>>16)|0)>>16));I=_(b[(c[N>>2]|0)+((c[O>>2]|0)+1<<1)>>1]<<11>>16,(c[Q>>2]&65535)<<16>>16)|0;c[S>>2]=(c[S>>2]|0)+(I+((_(b[(c[N>>2]|0)+((c[O>>2]|0)+1<<1)>>1]<<11&65535,(c[Q>>2]&65535)<<16>>16)|0)>>16));if(((c[S>>2]>>7)+1>>1|0)<=32767)if(((c[S>>2]>>7)+1>>1|0)<-32768)o=-32768;else o=(c[S>>2]>>7)+1>>1;else o=32767;b[(c[M>>2]|0)+((c[O>>2]|0)-1<<1)>>1]=o;c[O>>2]=(c[O>>2]|0)+1}b[c[J>>2]>>1]=c[R>>2];b[(c[J>>2]|0)+2>>1]=c[R+4>>2];b[(c[J>>2]|0)+30>>1]=c[U>>2];na(c[L>>2]|0);i=V;return}function rf(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;h=i;i=i+48|0;f=h+40|0;q=h+36|0;p=h+32|0;j=h+28|0;l=h+24|0;k=h+20|0;g=h+16|0;m=h+12|0;n=h+8|0;o=h+4|0;e=h;c[q>>2]=a;c[p>>2]=b;c[j>>2]=d;b=c[q>>2]|0;c[l>>2]=(sf((c[q>>2]|0)>0?b:0-b|0)|0)-1;c[n>>2]=c[q>>2]<<c[l>>2];b=c[p>>2]|0;c[k>>2]=(sf((c[p>>2]|0)>0?b:0-b|0)|0)-1;c[o>>2]=c[p>>2]<<c[k>>2];c[m>>2]=536870911/(c[o>>2]>>16|0)|0;b=_(c[n>>2]>>16,(c[m>>2]&65535)<<16>>16)|0;c[e>>2]=b+((_(c[n>>2]&65535,(c[m>>2]&65535)<<16>>16)|0)>>16);b=c[n>>2]|0;a=c[o>>2]|0;d=c[e>>2]|0;d=yj(a|0,((a|0)<0)<<31>>31|0,d|0,((d|0)<0)<<31>>31|0)|0;d=nj(d|0,C|0,32)|0;c[n>>2]=b-(d<<3);d=_(c[n>>2]>>16,(c[m>>2]&65535)<<16>>16)|0;c[e>>2]=(c[e>>2]|0)+(d+((_(c[n>>2]&65535,(c[m>>2]&65535)<<16>>16)|0)>>16));c[g>>2]=29+(c[l>>2]|0)-(c[k>>2]|0)-(c[j>>2]|0);d=c[g>>2]|0;if((c[g>>2]|0)>=0)if((d|0)<32){c[f>>2]=c[e>>2]>>c[g>>2];q=c[f>>2]|0;i=h;return q|0}else{c[f>>2]=0;q=c[f>>2]|0;i=h;return q|0}a=c[e>>2]|0;b=0-(c[g>>2]|0)|0;do if((-2147483648>>0-d|0)>(2147483647>>0-(c[g>>2]|0)|0)){if((a|0)>(-2147483648>>b|0)){d=-2147483648>>0-(c[g>>2]|0);break}if((c[e>>2]|0)<(2147483647>>0-(c[g>>2]|0)|0)){d=2147483647>>0-(c[g>>2]|0);break}else{d=c[e>>2]|0;break}}else{if((a|0)>(2147483647>>b|0)){d=2147483647>>0-(c[g>>2]|0);break}if((c[e>>2]|0)<(-2147483648>>0-(c[g>>2]|0)|0)){d=-2147483648>>0-(c[g>>2]|0);break}else{d=c[e>>2]|0;break}}while(0);c[f>>2]=d<<0-(c[g>>2]|0);q=c[f>>2]|0;i=h;return q|0}function sf(a){a=a|0;var b=0,d=0;d=i;i=i+16|0;b=d;c[b>>2]=a;if(!(c[b>>2]|0)){a=32;i=d;return a|0}a=32-(32-(aa(c[b>>2]|0)|0))|0;i=d;return a|0}function tf(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;f=i;i=i+16|0;e=f+4|0;d=f;c[e>>2]=a;c[d>>2]=b;i=f;return ((c[e>>2]|0)>(c[d>>2]|0)?c[e>>2]|0:c[d>>2]|0)|0}function uf(a,d,e,f,g,h){a=a|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;w=i;i=i+64|0;m=w+52|0;q=w+48|0;r=w+44|0;n=w+40|0;j=w+36|0;s=w+32|0;u=w+28|0;x=w+24|0;k=w+20|0;l=w+16|0;v=w+12|0;t=w+8|0;o=w+4|0;p=w;c[m>>2]=a;c[q>>2]=d;c[r>>2]=e;c[n>>2]=f;c[j>>2]=g;c[s>>2]=h;e=c[q>>2]|0;d=(c[m>>2]|0)+4|0;b[e>>1]=b[d>>1]|0;b[e+2>>1]=b[d+2>>1]|0;e=c[r>>2]|0;d=(c[m>>2]|0)+8|0;b[e>>1]=b[d>>1]|0;b[e+2>>1]=b[d+2>>1]|0;e=(c[m>>2]|0)+4|0;d=(c[q>>2]|0)+(c[s>>2]<<1)|0;b[e>>1]=b[d>>1]|0;b[e+2>>1]=b[d+2>>1]|0;e=(c[m>>2]|0)+8|0;d=(c[r>>2]|0)+(c[s>>2]<<1)|0;b[e>>1]=b[d>>1]|0;b[e+2>>1]=b[d+2>>1]|0;c[o>>2]=b[c[m>>2]>>1];c[p>>2]=b[(c[m>>2]|0)+2>>1];c[x>>2]=65536/(c[j>>2]<<3|0)|0;c[k>>2]=((_(((c[c[n>>2]>>2]|0)-(b[c[m>>2]>>1]|0)&65535)<<16>>16,(c[x>>2]&65535)<<16>>16)|0)>>15)+1>>1;c[l>>2]=((_(((c[(c[n>>2]|0)+4>>2]|0)-(b[(c[m>>2]|0)+2>>1]|0)&65535)<<16>>16,(c[x>>2]&65535)<<16>>16)|0)>>15)+1>>1;c[u>>2]=0;while(1){if((c[u>>2]|0)>=(c[j>>2]<<3|0))break;c[o>>2]=(c[o>>2]|0)+(c[k>>2]|0);c[p>>2]=(c[p>>2]|0)+(c[l>>2]|0);c[v>>2]=(b[(c[q>>2]|0)+(c[u>>2]<<1)>>1]|0)+(b[(c[q>>2]|0)+((c[u>>2]|0)+2<<1)>>1]|0)+(b[(c[q>>2]|0)+((c[u>>2]|0)+1<<1)>>1]<<1)<<9;x=_(c[v>>2]>>16,(c[o>>2]&65535)<<16>>16)|0;c[v>>2]=(b[(c[r>>2]|0)+((c[u>>2]|0)+1<<1)>>1]<<8)+(x+((_(c[v>>2]&65535,(c[o>>2]&65535)<<16>>16)|0)>>16));x=_(b[(c[q>>2]|0)+((c[u>>2]|0)+1<<1)>>1]<<11>>16,(c[p>>2]&65535)<<16>>16)|0;c[v>>2]=(c[v>>2]|0)+(x+((_(b[(c[q>>2]|0)+((c[u>>2]|0)+1<<1)>>1]<<11&65535,(c[p>>2]&65535)<<16>>16)|0)>>16));if(((c[v>>2]>>7)+1>>1|0)<=32767)if(((c[v>>2]>>7)+1>>1|0)<-32768)h=-32768;else h=(c[v>>2]>>7)+1>>1;else h=32767;b[(c[r>>2]|0)+((c[u>>2]|0)+1<<1)>>1]=h;c[u>>2]=(c[u>>2]|0)+1}c[o>>2]=c[c[n>>2]>>2];c[p>>2]=c[(c[n>>2]|0)+4>>2];c[u>>2]=c[j>>2]<<3;while(1){if((c[u>>2]|0)>=(c[s>>2]|0))break;c[v>>2]=(b[(c[q>>2]|0)+(c[u>>2]<<1)>>1]|0)+(b[(c[q>>2]|0)+((c[u>>2]|0)+2<<1)>>1]|0)+(b[(c[q>>2]|0)+((c[u>>2]|0)+1<<1)>>1]<<1)<<9;x=_(c[v>>2]>>16,(c[o>>2]&65535)<<16>>16)|0;c[v>>2]=(b[(c[r>>2]|0)+((c[u>>2]|0)+1<<1)>>1]<<8)+(x+((_(c[v>>2]&65535,(c[o>>2]&65535)<<16>>16)|0)>>16));x=_(b[(c[q>>2]|0)+((c[u>>2]|0)+1<<1)>>1]<<11>>16,(c[p>>2]&65535)<<16>>16)|0;c[v>>2]=(c[v>>2]|0)+(x+((_(b[(c[q>>2]|0)+((c[u>>2]|0)+1<<1)>>1]<<11&65535,(c[p>>2]&65535)<<16>>16)|0)>>16));if(((c[v>>2]>>7)+1>>1|0)<=32767)if(((c[v>>2]>>7)+1>>1|0)<-32768)h=-32768;else h=(c[v>>2]>>7)+1>>1;else h=32767;b[(c[r>>2]|0)+((c[u>>2]|0)+1<<1)>>1]=h;c[u>>2]=(c[u>>2]|0)+1}b[c[m>>2]>>1]=c[c[n>>2]>>2];b[(c[m>>2]|0)+2>>1]=c[(c[n>>2]|0)+4>>2];c[u>>2]=0;while(1){if((c[u>>2]|0)>=(c[s>>2]|0))break;c[v>>2]=(b[(c[q>>2]|0)+((c[u>>2]|0)+1<<1)>>1]|0)+(b[(c[r>>2]|0)+((c[u>>2]|0)+1<<1)>>1]|0);c[t>>2]=(b[(c[q>>2]|0)+((c[u>>2]|0)+1<<1)>>1]|0)-(b[(c[r>>2]|0)+((c[u>>2]|0)+1<<1)>>1]|0);if((c[v>>2]|0)>32767)h=32767;else h=(c[v>>2]|0)<-32768?-32768:c[v>>2]|0;b[(c[q>>2]|0)+((c[u>>2]|0)+1<<1)>>1]=h;if((c[t>>2]|0)>32767)h=32767;else h=(c[t>>2]|0)<-32768?-32768:c[t>>2]|0;b[(c[r>>2]|0)+((c[u>>2]|0)+1<<1)>>1]=h;c[u>>2]=(c[u>>2]|0)+1}i=w;return}function vf(a){a=a|0;var b=0,d=0,e=0,f=0;f=i;i=i+16|0;b=f+4|0;d=f;c[d>>2]=a;if(!(((((((c[(c[d>>2]|0)+8>>2]|0)!=8e3?(c[(c[d>>2]|0)+8>>2]|0)!=12e3:0)?(c[(c[d>>2]|0)+8>>2]|0)!=16e3:0)?(c[(c[d>>2]|0)+8>>2]|0)!=24e3:0)?(c[(c[d>>2]|0)+8>>2]|0)!=32e3:0)?(c[(c[d>>2]|0)+8>>2]|0)!=44100:0)?(c[(c[d>>2]|0)+8>>2]|0)!=48e3:0))e=8;do if((e|0)==8){if(((c[(c[d>>2]|0)+20>>2]|0)!=8e3?(c[(c[d>>2]|0)+20>>2]|0)!=12e3:0)?(c[(c[d>>2]|0)+20>>2]|0)!=16e3:0)break;if(((c[(c[d>>2]|0)+12>>2]|0)!=8e3?(c[(c[d>>2]|0)+12>>2]|0)!=12e3:0)?(c[(c[d>>2]|0)+12>>2]|0)!=16e3:0)break;if(((c[(c[d>>2]|0)+16>>2]|0)!=8e3?(c[(c[d>>2]|0)+16>>2]|0)!=12e3:0)?(c[(c[d>>2]|0)+16>>2]|0)!=16e3:0)break;if(((c[(c[d>>2]|0)+16>>2]|0)<=(c[(c[d>>2]|0)+20>>2]|0)?(c[(c[d>>2]|0)+12>>2]|0)>=(c[(c[d>>2]|0)+20>>2]|0):0)?(c[(c[d>>2]|0)+16>>2]|0)<=(c[(c[d>>2]|0)+12>>2]|0):0){if((((c[(c[d>>2]|0)+24>>2]|0)!=10?(c[(c[d>>2]|0)+24>>2]|0)!=20:0)?(c[(c[d>>2]|0)+24>>2]|0)!=40:0)?(c[(c[d>>2]|0)+24>>2]|0)!=60:0){c[b>>2]=-103;e=c[b>>2]|0;i=f;return e|0}if((c[(c[d>>2]|0)+32>>2]|0)>=0?(c[(c[d>>2]|0)+32>>2]|0)<=100:0){if((c[(c[d>>2]|0)+44>>2]|0)>=0?(c[(c[d>>2]|0)+44>>2]|0)<=1:0){if((c[(c[d>>2]|0)+48>>2]|0)>=0?(c[(c[d>>2]|0)+48>>2]|0)<=1:0){do if((c[(c[d>>2]|0)+40>>2]|0)>=0){if((c[(c[d>>2]|0)+40>>2]|0)>1)break;do if((c[c[d>>2]>>2]|0)>=1){if((c[c[d>>2]>>2]|0)>2)break;do if((c[(c[d>>2]|0)+4>>2]|0)>=1){if((c[(c[d>>2]|0)+4>>2]|0)>2)break;if((c[(c[d>>2]|0)+4>>2]|0)>(c[c[d>>2]>>2]|0)){c[b>>2]=-111;e=c[b>>2]|0;i=f;return e|0}do if((c[(c[d>>2]|0)+36>>2]|0)>=0){if((c[(c[d>>2]|0)+36>>2]|0)>10)break;c[b>>2]=0;e=c[b>>2]|0;i=f;return e|0}while(0);c[b>>2]=-106;e=c[b>>2]|0;i=f;return e|0}while(0);c[b>>2]=-111;e=c[b>>2]|0;i=f;return e|0}while(0);c[b>>2]=-111;e=c[b>>2]|0;i=f;return e|0}while(0);c[b>>2]=-107;e=c[b>>2]|0;i=f;return e|0}c[b>>2]=-109;e=c[b>>2]|0;i=f;return e|0}c[b>>2]=-108;e=c[b>>2]|0;i=f;return e|0}c[b>>2]=-105;e=c[b>>2]|0;i=f;return e|0}}while(0);c[b>>2]=-102;e=c[b>>2]|0;i=f;return e|0}function wf(a,d){a=a|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;m=i;i=i+32|0;e=m+20|0;f=m+16|0;h=m+12|0;k=m+8|0;g=m+4|0;j=m;c[e>>2]=a;c[f>>2]=d;c[k>>2]=0;if((c[f>>2]|0)>8e4)d=8e4;else d=(c[f>>2]|0)<5e3?5e3:c[f>>2]|0;c[f>>2]=d;if((c[f>>2]|0)==(c[(c[e>>2]|0)+4632>>2]|0)){l=c[k>>2]|0;i=m;return l|0}c[(c[e>>2]|0)+4632>>2]=c[f>>2];do if((c[(c[e>>2]|0)+4600>>2]|0)!=8)if((c[(c[e>>2]|0)+4600>>2]|0)==12){c[j>>2]=17772;break}else{c[j>>2]=17804;break}else c[j>>2]=17740;while(0);if((c[(c[e>>2]|0)+4604>>2]|0)==2)c[f>>2]=(c[f>>2]|0)-2200;c[h>>2]=1;while(1){if((c[h>>2]|0)>=8){l=16;break}if((c[f>>2]|0)<=(c[(c[j>>2]|0)+(c[h>>2]<<2)>>2]|0))break;c[h>>2]=(c[h>>2]|0)+1}if((l|0)==16){l=c[k>>2]|0;i=m;return l|0}c[g>>2]=((c[f>>2]|0)-(c[(c[j>>2]|0)+((c[h>>2]|0)-1<<2)>>2]|0)<<6|0)/((c[(c[j>>2]|0)+(c[h>>2]<<2)>>2]|0)-(c[(c[j>>2]|0)+((c[h>>2]|0)-1<<2)>>2]|0)|0)|0;l=(b[24510+((c[h>>2]|0)-1<<1)>>1]<<6)+(_(c[g>>2]|0,(b[24510+(c[h>>2]<<1)>>1]|0)-(b[24510+((c[h>>2]|0)-1<<1)>>1]|0)|0)|0)|0;c[(c[e>>2]|0)+4748>>2]=l;l=c[k>>2]|0;i=m;return l|0}function xf(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;e=i;i=i+16|0;f=e+8|0;g=e+4|0;d=e;c[f>>2]=a;c[g>>2]=b;c[d>>2]=0;oj(c[f>>2]|0,0,12240)|0;c[(c[f>>2]|0)+5124>>2]=c[g>>2];a=(Sf(3932160)|0)-2048<<8;c[(c[f>>2]|0)+8>>2]=a;c[(c[f>>2]|0)+12>>2]=c[(c[f>>2]|0)+8>>2];c[(c[f>>2]|0)+4696>>2]=1;a=Ue((c[f>>2]|0)+32|0)|0;c[d>>2]=(c[d>>2]|0)+a;i=e;return c[d>>2]|0}function yf(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;p=i;i=i+48|0;h=p+32|0;j=p+28|0;k=p+24|0;l=p+20|0;r=p+16|0;q=p+12|0;m=p+8|0;n=p+4|0;o=p;c[j>>2]=a;c[k>>2]=b;c[l>>2]=d;c[r>>2]=e;c[q>>2]=f;c[m>>2]=g;c[o>>2]=0;c[(c[j>>2]|0)+6108>>2]=c[(c[k>>2]|0)+44>>2];c[(c[j>>2]|0)+4708>>2]=c[(c[k>>2]|0)+48>>2];c[(c[j>>2]|0)+4580>>2]=c[(c[k>>2]|0)+8>>2];c[(c[j>>2]|0)+4588>>2]=c[(c[k>>2]|0)+12>>2];c[(c[j>>2]|0)+4592>>2]=c[(c[k>>2]|0)+16>>2];c[(c[j>>2]|0)+4596>>2]=c[(c[k>>2]|0)+20>>2];c[(c[j>>2]|0)+6120>>2]=c[(c[k>>2]|0)+40>>2];c[(c[j>>2]|0)+5784>>2]=c[c[k>>2]>>2];c[(c[j>>2]|0)+5788>>2]=c[(c[k>>2]|0)+4>>2];c[(c[j>>2]|0)+4560>>2]=c[r>>2];c[(c[j>>2]|0)+5792>>2]=c[q>>2];if(c[(c[j>>2]|0)+4700>>2]|0?(c[(c[j>>2]|0)+4712>>2]|0)==0:0){if((c[(c[j>>2]|0)+4580>>2]|0)!=(c[(c[j>>2]|0)+4584>>2]|0)?(c[(c[j>>2]|0)+4600>>2]|0)>0:0){r=zf(c[j>>2]|0,c[(c[j>>2]|0)+4600>>2]|0)|0;c[o>>2]=(c[o>>2]|0)+r}c[h>>2]=c[o>>2];r=c[h>>2]|0;i=p;return r|0}c[n>>2]=cf(c[j>>2]|0,c[k>>2]|0)|0;if(c[m>>2]|0)c[n>>2]=c[m>>2];r=zf(c[j>>2]|0,c[n>>2]|0)|0;c[o>>2]=(c[o>>2]|0)+r;r=Cf(c[j>>2]|0,c[n>>2]|0,c[(c[k>>2]|0)+24>>2]|0)|0;c[o>>2]=(c[o>>2]|0)+r;r=Df(c[j>>2]|0,c[(c[k>>2]|0)+36>>2]|0)|0;c[o>>2]=(c[o>>2]|0)+r;c[(c[j>>2]|0)+4640>>2]=c[(c[k>>2]|0)+32>>2];r=Ff(c[j>>2]|0,c[l>>2]|0)|0;c[o>>2]=(c[o>>2]|0)+r;c[(c[j>>2]|0)+4700>>2]=1;c[h>>2]=c[o>>2];r=c[h>>2]|0;i=p;return r|0}function zf(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;n=i;i=i+336|0;d=n+328|0;e=n+324|0;l=n+320|0;j=n+316|0;g=n+312|0;k=n+308|0;h=n+304|0;f=n+300|0;m=n;c[d>>2]=a;c[e>>2]=b;c[l>>2]=0;if((c[(c[d>>2]|0)+4600>>2]|0)==(c[e>>2]|0)?(c[(c[d>>2]|0)+4584>>2]|0)==(c[(c[d>>2]|0)+4580>>2]|0):0){k=c[d>>2]|0;k=k+4580|0;k=c[k>>2]|0;m=c[d>>2]|0;m=m+4584|0;c[m>>2]=k;m=c[l>>2]|0;i=n;return m|0}b=c[d>>2]|0;if(!(c[(c[d>>2]|0)+4600>>2]|0)){k=ig(b+5808|0,c[(c[d>>2]|0)+4580>>2]|0,(c[e>>2]|0)*1e3|0,1)|0;c[l>>2]=(c[l>>2]|0)+k;k=c[d>>2]|0;k=k+4580|0;k=c[k>>2]|0;m=c[d>>2]|0;m=m+4584|0;c[m>>2]=k;m=c[l>>2]|0;i=n;return m|0}else{c[h>>2]=((c[b+4604>>2]|0)*5<<1)+5;c[k>>2]=_(c[h>>2]|0,c[(c[d>>2]|0)+4600>>2]|0)|0;c[j>>2]=_(c[h>>2]|0,c[e>>2]|0)|0;b=(c[k>>2]|0)>(c[j>>2]|0)?c[k>>2]|0:c[j>>2]|0;c[f>>2]=ia()|0;a=i;i=i+((1*(b<<1)|0)+15&-16)|0;Af(a,(c[d>>2]|0)+9356|0,c[k>>2]|0);b=ig(m,((c[(c[d>>2]|0)+4600>>2]&65535)<<16>>16)*1e3|0,c[(c[d>>2]|0)+4580>>2]|0,0)|0;c[l>>2]=(c[l>>2]|0)+b;c[g>>2]=_(c[h>>2]|0,(c[(c[d>>2]|0)+4580>>2]|0)/1e3|0)|0;h=i;i=i+((1*(c[g>>2]<<1)|0)+15&-16)|0;k=jg(m,h,a,c[k>>2]|0)|0;c[l>>2]=(c[l>>2]|0)+k;k=ig((c[d>>2]|0)+5808|0,c[(c[d>>2]|0)+4580>>2]|0,((c[e>>2]&65535)<<16>>16)*1e3|0,1)|0;c[l>>2]=(c[l>>2]|0)+k;k=jg((c[d>>2]|0)+5808|0,a,h,c[g>>2]|0)|0;c[l>>2]=(c[l>>2]|0)+k;Bf((c[d>>2]|0)+9356|0,a,c[j>>2]|0);na(c[f>>2]|0);k=c[d>>2]|0;k=k+4580|0;k=c[k>>2]|0;m=c[d>>2]|0;m=m+4584|0;c[m>>2]=k;m=c[l>>2]|0;i=n;return m|0}return 0}function Af(a,d,e){a=a|0;d=d|0;e=e|0;var f=0,h=0,j=0,k=0,l=0;k=i;i=i+16|0;f=k+12|0;h=k+8|0;l=k+4|0;j=k;c[f>>2]=a;c[h>>2]=d;c[l>>2]=e;c[j>>2]=(c[l>>2]|0)-1;while(1){if((c[j>>2]|0)<0)break;if((ij(+g[(c[h>>2]|0)+(c[j>>2]<<2)>>2])|0)<=32767)if((ij(+g[(c[h>>2]|0)+(c[j>>2]<<2)>>2])|0)<-32768)d=-32768;else d=ij(+g[(c[h>>2]|0)+(c[j>>2]<<2)>>2])|0;else d=32767;b[(c[f>>2]|0)+(c[j>>2]<<1)>>1]=d;c[j>>2]=(c[j>>2]|0)+-1}i=k;return}function Bf(a,d,e){a=a|0;d=d|0;e=e|0;var f=0,h=0,j=0,k=0,l=0;k=i;i=i+16|0;f=k+12|0;h=k+8|0;l=k+4|0;j=k;c[f>>2]=a;c[h>>2]=d;c[l>>2]=e;c[j>>2]=(c[l>>2]|0)-1;while(1){if((c[j>>2]|0)<0)break;g[(c[f>>2]|0)+(c[j>>2]<<2)>>2]=+(b[(c[h>>2]|0)+(c[j>>2]<<1)>>1]|0);c[j>>2]=(c[j>>2]|0)+-1}i=k;return}function Cf(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0;k=i;i=i+16|0;h=k+12|0;g=k+8|0;f=k+4|0;j=k;c[h>>2]=b;c[g>>2]=d;c[f>>2]=e;c[j>>2]=0;if((c[f>>2]|0)!=(c[(c[h>>2]|0)+4636>>2]|0)){if((c[f>>2]|0)!=10&(c[f>>2]|0)!=20&(c[f>>2]|0)!=40&(c[f>>2]|0)!=60)c[j>>2]=-103;do if((c[f>>2]|0)<=10){c[(c[h>>2]|0)+5776>>2]=1;c[(c[h>>2]|0)+4604>>2]=(c[f>>2]|0)==10?2:1;e=_((c[f>>2]&65535)<<16>>16,(c[g>>2]&65535)<<16>>16)|0;c[(c[h>>2]|0)+4608>>2]=e;c[(c[h>>2]|0)+4572>>2]=((c[g>>2]&65535)<<16>>16)*14;e=(c[h>>2]|0)+4720|0;if((c[(c[h>>2]|0)+4600>>2]|0)==8){c[e>>2]=29174;break}else{c[e>>2]=29162;break}}else{c[(c[h>>2]|0)+5776>>2]=(c[f>>2]|0)/20|0;c[(c[h>>2]|0)+4604>>2]=4;c[(c[h>>2]|0)+4608>>2]=((c[g>>2]&65535)<<16>>16)*20;c[(c[h>>2]|0)+4572>>2]=((c[g>>2]&65535)<<16>>16)*24;e=(c[h>>2]|0)+4720|0;if((c[(c[h>>2]|0)+4600>>2]|0)==8){c[e>>2]=29151;break}else{c[e>>2]=29117;break}}while(0);c[(c[h>>2]|0)+4636>>2]=c[f>>2];c[(c[h>>2]|0)+4632>>2]=0}if((c[(c[h>>2]|0)+4600>>2]|0)==(c[g>>2]|0)){j=c[j>>2]|0;i=k;return j|0}e=(c[h>>2]|0)+7200|0;c[e>>2]=0;c[e+4>>2]=0;c[e+8>>2]=0;c[e+12>>2]=0;oj((c[h>>2]|0)+7216|0,0,2140)|0;oj((c[h>>2]|0)+144|0,0,4380)|0;e=(c[h>>2]|0)+4524|0;c[e>>2]=0;c[e+4>>2]=0;c[e+8>>2]=0;c[e+12>>2]=0;c[e+16>>2]=0;c[e+20>>2]=0;c[e+24>>2]=0;c[e+28>>2]=0;e=(c[h>>2]|0)+16|0;c[e>>2]=0;c[e+4>>2]=0;c[(c[h>>2]|0)+5772>>2]=0;c[(c[h>>2]|0)+5780>>2]=0;c[(c[h>>2]|0)+4632>>2]=0;c[(c[h>>2]|0)+4568>>2]=100;c[(c[h>>2]|0)+4696>>2]=1;c[(c[h>>2]|0)+7216+2136>>2]=100;a[(c[h>>2]|0)+7200>>0]=10;c[(c[h>>2]|0)+144+4356>>2]=100;c[(c[h>>2]|0)+144+4372>>2]=65536;a[(c[h>>2]|0)+4565>>0]=0;c[(c[h>>2]|0)+4600>>2]=c[g>>2];e=(c[(c[h>>2]|0)+4604>>2]|0)==4;d=(c[h>>2]|0)+4720|0;do if((c[(c[h>>2]|0)+4600>>2]|0)==8)if(e){c[d>>2]=29151;break}else{c[d>>2]=29174;break}else if(e){c[d>>2]=29117;break}else{c[d>>2]=29162;break}while(0);if((c[(c[h>>2]|0)+4600>>2]|0)!=8?(c[(c[h>>2]|0)+4600>>2]|0)!=12:0){c[(c[h>>2]|0)+4664>>2]=16;c[(c[h>>2]|0)+4724>>2]=17704}else{c[(c[h>>2]|0)+4664>>2]=10;c[(c[h>>2]|0)+4724>>2]=17668}c[(c[h>>2]|0)+4612>>2]=(c[g>>2]|0)*5;e=_((c[(c[h>>2]|0)+4612>>2]&65535)<<16>>16,(c[(c[h>>2]|0)+4604>>2]&65535)<<16>>16)|0;c[(c[h>>2]|0)+4608>>2]=e;c[(c[h>>2]|0)+4616>>2]=((c[g>>2]&65535)<<16>>16)*20;c[(c[h>>2]|0)+4620>>2]=(c[g>>2]&65535)<<16>>16<<1;c[(c[h>>2]|0)+4576>>2]=((c[g>>2]&65535)<<16>>16)*18;e=(c[g>>2]&65535)<<16>>16;if((c[(c[h>>2]|0)+4604>>2]|0)==4)c[(c[h>>2]|0)+4572>>2]=e*24;else c[(c[h>>2]|0)+4572>>2]=e*14;e=c[h>>2]|0;if((c[(c[h>>2]|0)+4600>>2]|0)==16){c[e+4684>>2]=10;c[(c[h>>2]|0)+4716>>2]=29049;j=c[j>>2]|0;i=k;return j|0}d=(c[h>>2]|0)+4684|0;if((c[e+4600>>2]|0)==12){c[d>>2]=13;c[(c[h>>2]|0)+4716>>2]=29043;j=c[j>>2]|0;i=k;return j|0}else{c[d>>2]=15;c[(c[h>>2]|0)+4716>>2]=29034;j=c[j>>2]|0;i=k;return j|0}return 0}function Df(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;g=i;i=i+16|0;d=g+8|0;e=g+4|0;f=g;c[d>>2]=a;c[e>>2]=b;c[f>>2]=0;do if((c[e>>2]|0)>=2){if((c[e>>2]|0)<4){c[(c[d>>2]|0)+4668>>2]=1;c[(c[d>>2]|0)+4676>>2]=49807;c[(c[d>>2]|0)+4672>>2]=8;c[(c[d>>2]|0)+4660>>2]=10;c[(c[d>>2]|0)+4624>>2]=(c[(c[d>>2]|0)+4600>>2]|0)*5;c[(c[d>>2]|0)+4652>>2]=1;c[(c[d>>2]|0)+4656>>2]=0;c[(c[d>>2]|0)+4680>>2]=0;c[(c[d>>2]|0)+4692>>2]=4;c[(c[d>>2]|0)+4704>>2]=0;break}if((c[e>>2]|0)<6){c[(c[d>>2]|0)+4668>>2]=1;c[(c[d>>2]|0)+4676>>2]=48497;c[(c[d>>2]|0)+4672>>2]=10;c[(c[d>>2]|0)+4660>>2]=12;c[(c[d>>2]|0)+4624>>2]=(c[(c[d>>2]|0)+4600>>2]|0)*5;c[(c[d>>2]|0)+4652>>2]=2;c[(c[d>>2]|0)+4656>>2]=1;c[(c[d>>2]|0)+4680>>2]=0;c[(c[d>>2]|0)+4692>>2]=8;c[(c[d>>2]|0)+4704>>2]=(c[(c[d>>2]|0)+4600>>2]|0)*983;break}b=(c[d>>2]|0)+4668|0;if((c[e>>2]|0)<8){c[b>>2]=1;c[(c[d>>2]|0)+4676>>2]=47186;c[(c[d>>2]|0)+4672>>2]=12;c[(c[d>>2]|0)+4660>>2]=14;c[(c[d>>2]|0)+4624>>2]=(c[(c[d>>2]|0)+4600>>2]|0)*5;c[(c[d>>2]|0)+4652>>2]=3;c[(c[d>>2]|0)+4656>>2]=1;c[(c[d>>2]|0)+4680>>2]=0;c[(c[d>>2]|0)+4692>>2]=16;c[(c[d>>2]|0)+4704>>2]=(c[(c[d>>2]|0)+4600>>2]|0)*983;break}else{c[b>>2]=2;c[(c[d>>2]|0)+4676>>2]=45875;c[(c[d>>2]|0)+4672>>2]=16;c[(c[d>>2]|0)+4660>>2]=16;c[(c[d>>2]|0)+4624>>2]=(c[(c[d>>2]|0)+4600>>2]|0)*5;c[(c[d>>2]|0)+4652>>2]=4;c[(c[d>>2]|0)+4656>>2]=1;c[(c[d>>2]|0)+4680>>2]=0;c[(c[d>>2]|0)+4692>>2]=32;c[(c[d>>2]|0)+4704>>2]=(c[(c[d>>2]|0)+4600>>2]|0)*983;break}}else{c[(c[d>>2]|0)+4668>>2]=0;c[(c[d>>2]|0)+4676>>2]=52429;c[(c[d>>2]|0)+4672>>2]=6;c[(c[d>>2]|0)+4660>>2]=8;c[(c[d>>2]|0)+4624>>2]=(c[(c[d>>2]|0)+4600>>2]|0)*3;c[(c[d>>2]|0)+4652>>2]=1;c[(c[d>>2]|0)+4656>>2]=0;c[(c[d>>2]|0)+4680>>2]=1;c[(c[d>>2]|0)+4692>>2]=2;c[(c[d>>2]|0)+4704>>2]=0}while(0);a=Ef(c[(c[d>>2]|0)+4672>>2]|0,c[(c[d>>2]|0)+4664>>2]|0)|0;c[(c[d>>2]|0)+4672>>2]=a;c[(c[d>>2]|0)+4628>>2]=((c[(c[d>>2]|0)+4600>>2]|0)*5|0)+(c[(c[d>>2]|0)+4624>>2]<<1);c[(c[d>>2]|0)+4648>>2]=c[e>>2];i=g;return c[f>>2]|0}function Ef(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;f=i;i=i+16|0;e=f+4|0;d=f;c[e>>2]=a;c[d>>2]=b;i=f;return ((c[e>>2]|0)<(c[d>>2]|0)?c[e>>2]|0:c[d>>2]|0)|0}function Ff(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0;j=i;i=i+32|0;f=j+16|0;d=j+12|0;g=j+8|0;h=j+4|0;e=j;c[f>>2]=a;c[d>>2]=b;c[h>>2]=0;c[g>>2]=c[(c[f>>2]|0)+6124>>2];c[(c[f>>2]|0)+6124>>2]=0;if(!(c[(c[f>>2]|0)+6120>>2]|0)){h=c[h>>2]|0;i=j;return h|0}if((c[(c[f>>2]|0)+4640>>2]|0)<=0){h=c[h>>2]|0;i=j;return h|0}do if((c[(c[f>>2]|0)+4600>>2]|0)!=8)if((c[(c[f>>2]|0)+4600>>2]|0)==12){c[e>>2]=14e3;break}else{c[e>>2]=16e3;break}else c[e>>2]=12e3;while(0);if((c[(c[f>>2]|0)+4640>>2]|0)<25)b=c[(c[f>>2]|0)+4640>>2]|0;else b=25;b=((_(c[e>>2]|0,125-b|0)|0)>>16)*655|0;if((c[(c[f>>2]|0)+4640>>2]|0)<25)a=c[(c[f>>2]|0)+4640>>2]|0;else a=25;c[e>>2]=b+(((_(c[e>>2]|0,125-a|0)|0)&65535)*655>>16);if((c[d>>2]|0)<=(c[e>>2]|0)){h=c[h>>2]|0;i=j;return h|0}b=c[f>>2]|0;if(!(c[g>>2]|0))c[b+6128>>2]=7;else{g=Gf(7-(((c[b+4640>>2]>>16)*26214|0)+((c[(c[f>>2]|0)+4640>>2]&65535)*26214>>16))|0,2)|0;c[(c[f>>2]|0)+6128>>2]=g}c[(c[f>>2]|0)+6124>>2]=1;h=c[h>>2]|0;i=j;return h|0}function Gf(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;f=i;i=i+16|0;e=f+4|0;d=f;c[e>>2]=a;c[d>>2]=b;i=f;return ((c[e>>2]|0)>(c[d>>2]|0)?c[e>>2]|0:c[d>>2]|0)|0}function Hf(a,d,e){a=a|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;D=i;i=i+160|0;f=D+156|0;g=D+152|0;h=D+148|0;p=D+144|0;q=D+140|0;r=D+136|0;m=D+132|0;u=D+128|0;o=D+124|0;x=D+120|0;w=D+116|0;y=D+112|0;A=D+108|0;z=D+104|0;B=D+100|0;v=D+96|0;s=D+92|0;n=D+88|0;j=D+52|0;l=D+16|0;k=D+8|0;t=D;c[f>>2]=a;c[g>>2]=d;c[h>>2]=e;c[k>>2]=j;c[k+4>>2]=l;c[m>>2]=c[h>>2]>>1;If(c[g>>2]|0,j,l,c[m>>2]|0);c[t>>2]=j;c[x>>2]=b[12288];c[A>>2]=Kf(c[t>>2]|0,c[x>>2]|0,c[m>>2]|0)|0;if((c[A>>2]|0)<0){b[c[f>>2]>>1]=0;c[t>>2]=l;c[A>>2]=Kf(c[t>>2]|0,c[x>>2]|0,c[m>>2]|0)|0;c[u>>2]=1}else c[u>>2]=0;c[q>>2]=1;c[p>>2]=0;c[v>>2]=0;a:while(1){c[w>>2]=b[24576+(c[q>>2]<<1)>>1];c[z>>2]=Kf(c[t>>2]|0,c[w>>2]|0,c[m>>2]|0)|0;if(!((c[A>>2]|0)<=0?(c[z>>2]|0)>=(c[v>>2]|0):0))C=7;do if((C|0)==7){C=0;if((c[A>>2]|0)>=0?(c[z>>2]|0)<=(0-(c[v>>2]|0)|0):0)break;c[q>>2]=(c[q>>2]|0)+1;c[x>>2]=c[w>>2];c[A>>2]=c[z>>2];c[v>>2]=0;if((c[q>>2]|0)<=128)continue a;c[p>>2]=(c[p>>2]|0)+1;if((c[p>>2]|0)>30)break a;Of(c[g>>2]|0,c[h>>2]|0,65536-(_((10+(c[p>>2]|0)&65535)<<16>>16,(c[p>>2]&65535)<<16>>16)|0)|0);If(c[g>>2]|0,j,l,c[m>>2]|0);c[t>>2]=j;c[x>>2]=b[12288];c[A>>2]=Kf(c[t>>2]|0,c[x>>2]|0,c[m>>2]|0)|0;if((c[A>>2]|0)<0){b[c[f>>2]>>1]=0;c[t>>2]=l;c[A>>2]=Kf(c[t>>2]|0,c[x>>2]|0,c[m>>2]|0)|0;c[u>>2]=1}else c[u>>2]=0;c[q>>2]=1;continue a}while(0);if(!(c[z>>2]|0))c[v>>2]=1;else c[v>>2]=0;c[o>>2]=-256;c[r>>2]=0;while(1){if((c[r>>2]|0)>=3)break;c[y>>2]=((c[x>>2]|0)+(c[w>>2]|0)>>1)+((c[x>>2]|0)+(c[w>>2]|0)&1);c[B>>2]=Kf(c[t>>2]|0,c[y>>2]|0,c[m>>2]|0)|0;if(!((c[A>>2]|0)<=0&(c[B>>2]|0)>=0)?!((c[A>>2]|0)>=0&(c[B>>2]|0)<=0):0){c[x>>2]=c[y>>2];c[A>>2]=c[B>>2];c[o>>2]=(c[o>>2]|0)+(128>>c[r>>2])}else{c[w>>2]=c[y>>2];c[z>>2]=c[B>>2]}c[r>>2]=(c[r>>2]|0)+1}e=c[A>>2]|0;a=c[A>>2]|0;if((((c[A>>2]|0)>0?e:0-e|0)|0)<65536){c[n>>2]=a-(c[z>>2]|0);c[s>>2]=(c[A>>2]<<5)+(c[n>>2]>>1);if(c[n>>2]|0)c[o>>2]=(c[o>>2]|0)+((c[s>>2]|0)/(c[n>>2]|0)|0)}else c[o>>2]=(c[o>>2]|0)+((a|0)/((c[A>>2]|0)-(c[z>>2]|0)>>5|0)|0);e=(Lf((c[q>>2]<<8)+(c[o>>2]|0)|0,32767)|0)&65535;b[(c[f>>2]|0)+(c[u>>2]<<1)>>1]=e;c[u>>2]=(c[u>>2]|0)+1;if((c[u>>2]|0)>=(c[h>>2]|0)){C=34;break}c[t>>2]=c[k+((c[u>>2]&1)<<2)>>2];c[x>>2]=b[24576+((c[q>>2]|0)-1<<1)>>1];c[A>>2]=1-(c[u>>2]&2)<<12}if((C|0)==34){i=D;return}b[c[f>>2]>>1]=32768/((c[h>>2]|0)+1|0)|0;c[q>>2]=1;while(1){if((c[q>>2]|0)>=(c[h>>2]|0))break;C=(_(((c[q>>2]|0)+1&65535)<<16>>16,b[c[f>>2]>>1]|0)|0)&65535;b[(c[f>>2]|0)+(c[q>>2]<<1)>>1]=C;c[q>>2]=(c[q>>2]|0)+1}i=D;return}function If(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0;l=i;i=i+32|0;f=l+16|0;g=l+12|0;h=l+8|0;j=l+4|0;k=l;c[f>>2]=a;c[g>>2]=b;c[h>>2]=d;c[j>>2]=e;c[(c[g>>2]|0)+(c[j>>2]<<2)>>2]=65536;c[(c[h>>2]|0)+(c[j>>2]<<2)>>2]=65536;c[k>>2]=0;while(1){b=c[j>>2]|0;if((c[k>>2]|0)>=(c[j>>2]|0))break;c[(c[g>>2]|0)+(c[k>>2]<<2)>>2]=0-(c[(c[f>>2]|0)+(b-(c[k>>2]|0)-1<<2)>>2]|0)-(c[(c[f>>2]|0)+((c[j>>2]|0)+(c[k>>2]|0)<<2)>>2]|0);c[(c[h>>2]|0)+(c[k>>2]<<2)>>2]=0-(c[(c[f>>2]|0)+((c[j>>2]|0)-(c[k>>2]|0)-1<<2)>>2]|0)+(c[(c[f>>2]|0)+((c[j>>2]|0)+(c[k>>2]|0)<<2)>>2]|0);c[k>>2]=(c[k>>2]|0)+1}c[k>>2]=b;while(1){if((c[k>>2]|0)<=0)break;f=(c[g>>2]|0)+((c[k>>2]|0)-1<<2)|0;c[f>>2]=(c[f>>2]|0)-(c[(c[g>>2]|0)+(c[k>>2]<<2)>>2]|0);f=(c[h>>2]|0)+((c[k>>2]|0)-1<<2)|0;c[f>>2]=(c[f>>2]|0)+(c[(c[h>>2]|0)+(c[k>>2]<<2)>>2]|0);c[k>>2]=(c[k>>2]|0)+-1}Jf(c[g>>2]|0,c[j>>2]|0);Jf(c[h>>2]|0,c[j>>2]|0);i=l;return}function Jf(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;h=i;i=i+16|0;d=h+12|0;e=h+8|0;f=h+4|0;g=h;c[d>>2]=a;c[e>>2]=b;c[f>>2]=2;while(1){if((c[f>>2]|0)>(c[e>>2]|0))break;c[g>>2]=c[e>>2];while(1){if((c[g>>2]|0)<=(c[f>>2]|0))break;a=(c[d>>2]|0)+((c[g>>2]|0)-2<<2)|0;c[a>>2]=(c[a>>2]|0)-(c[(c[d>>2]|0)+(c[g>>2]<<2)>>2]|0);c[g>>2]=(c[g>>2]|0)+-1}a=(c[d>>2]|0)+((c[f>>2]|0)-2<<2)|0;c[a>>2]=(c[a>>2]|0)-(c[(c[d>>2]|0)+(c[f>>2]<<2)>>2]<<1);c[f>>2]=(c[f>>2]|0)+1}i=h;return}function Kf(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0;k=i;i=i+32|0;e=k+20|0;l=k+16|0;f=k+12|0;g=k+8|0;h=k+4|0;j=k;c[e>>2]=a;c[l>>2]=b;c[f>>2]=d;c[j>>2]=c[(c[e>>2]|0)+(c[f>>2]<<2)>>2];c[h>>2]=c[l>>2]<<4;if(8==(c[f>>2]|0)^1^1){l=_(c[j>>2]>>16,(c[h>>2]&65535)<<16>>16)|0;l=(c[(c[e>>2]|0)+28>>2]|0)+(l+((_(c[j>>2]&65535,(c[h>>2]&65535)<<16>>16)|0)>>16))|0;c[j>>2]=l+(_(c[j>>2]|0,(c[h>>2]>>15)+1>>1)|0);l=_(c[j>>2]>>16,(c[h>>2]&65535)<<16>>16)|0;l=(c[(c[e>>2]|0)+24>>2]|0)+(l+((_(c[j>>2]&65535,(c[h>>2]&65535)<<16>>16)|0)>>16))|0;c[j>>2]=l+(_(c[j>>2]|0,(c[h>>2]>>15)+1>>1)|0);l=_(c[j>>2]>>16,(c[h>>2]&65535)<<16>>16)|0;l=(c[(c[e>>2]|0)+20>>2]|0)+(l+((_(c[j>>2]&65535,(c[h>>2]&65535)<<16>>16)|0)>>16))|0;c[j>>2]=l+(_(c[j>>2]|0,(c[h>>2]>>15)+1>>1)|0);l=_(c[j>>2]>>16,(c[h>>2]&65535)<<16>>16)|0;l=(c[(c[e>>2]|0)+16>>2]|0)+(l+((_(c[j>>2]&65535,(c[h>>2]&65535)<<16>>16)|0)>>16))|0;c[j>>2]=l+(_(c[j>>2]|0,(c[h>>2]>>15)+1>>1)|0);l=_(c[j>>2]>>16,(c[h>>2]&65535)<<16>>16)|0;l=(c[(c[e>>2]|0)+12>>2]|0)+(l+((_(c[j>>2]&65535,(c[h>>2]&65535)<<16>>16)|0)>>16))|0;c[j>>2]=l+(_(c[j>>2]|0,(c[h>>2]>>15)+1>>1)|0);l=_(c[j>>2]>>16,(c[h>>2]&65535)<<16>>16)|0;l=(c[(c[e>>2]|0)+8>>2]|0)+(l+((_(c[j>>2]&65535,(c[h>>2]&65535)<<16>>16)|0)>>16))|0;c[j>>2]=l+(_(c[j>>2]|0,(c[h>>2]>>15)+1>>1)|0);l=_(c[j>>2]>>16,(c[h>>2]&65535)<<16>>16)|0;l=(c[(c[e>>2]|0)+4>>2]|0)+(l+((_(c[j>>2]&65535,(c[h>>2]&65535)<<16>>16)|0)>>16))|0;c[j>>2]=l+(_(c[j>>2]|0,(c[h>>2]>>15)+1>>1)|0);l=_(c[j>>2]>>16,(c[h>>2]&65535)<<16>>16)|0;l=(c[c[e>>2]>>2]|0)+(l+((_(c[j>>2]&65535,(c[h>>2]&65535)<<16>>16)|0)>>16))|0;c[j>>2]=l+(_(c[j>>2]|0,(c[h>>2]>>15)+1>>1)|0);l=c[j>>2]|0;i=k;return l|0}c[g>>2]=(c[f>>2]|0)-1;while(1){if((c[g>>2]|0)<0)break;l=_(c[j>>2]>>16,(c[h>>2]&65535)<<16>>16)|0;l=(c[(c[e>>2]|0)+(c[g>>2]<<2)>>2]|0)+(l+((_(c[j>>2]&65535,(c[h>>2]&65535)<<16>>16)|0)>>16))|0;c[j>>2]=l+(_(c[j>>2]|0,(c[h>>2]>>15)+1>>1)|0);c[g>>2]=(c[g>>2]|0)+-1}l=c[j>>2]|0;i=k;return l|0}function Lf(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;f=i;i=i+16|0;e=f+4|0;d=f;c[e>>2]=a;c[d>>2]=b;i=f;return ((c[e>>2]|0)<(c[d>>2]|0)?c[e>>2]|0:c[d>>2]|0)|0}function Mf(a,d,e,f,g){a=a|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;t=i;i=i+48|0;h=t+44|0;j=t+40|0;k=t+36|0;l=t+32|0;u=t+28|0;q=t+24|0;m=t+20|0;p=t+16|0;n=t+12|0;o=t+8|0;r=t+4|0;s=t;c[h>>2]=a;c[j>>2]=d;c[k>>2]=e;c[l>>2]=f;c[u>>2]=g;c[m>>2]=c[u>>2]>>1;c[q>>2]=0;while(1){if((c[q>>2]|0)>=(c[m>>2]|0))break;c[p>>2]=b[(c[h>>2]|0)+(c[q>>2]<<1<<1)>>1]<<10;c[o>>2]=(c[p>>2]|0)-(c[c[j>>2]>>2]|0);u=_(c[o>>2]>>16,b[12286]|0)|0;c[n>>2]=(c[o>>2]|0)+(u+((_(c[o>>2]&65535,b[12286]|0)|0)>>16));c[r>>2]=(c[c[j>>2]>>2]|0)+(c[n>>2]|0);c[c[j>>2]>>2]=(c[p>>2]|0)+(c[n>>2]|0);c[p>>2]=b[(c[h>>2]|0)+((c[q>>2]<<1)+1<<1)>>1]<<10;c[o>>2]=(c[p>>2]|0)-(c[(c[j>>2]|0)+4>>2]|0);u=_(c[o>>2]>>16,b[12287]|0)|0;c[n>>2]=u+((_(c[o>>2]&65535,b[12287]|0)|0)>>16);c[s>>2]=(c[(c[j>>2]|0)+4>>2]|0)+(c[n>>2]|0);c[(c[j>>2]|0)+4>>2]=(c[p>>2]|0)+(c[n>>2]|0);if((((c[s>>2]|0)+(c[r>>2]|0)>>10)+1>>1|0)<=32767)if((((c[s>>2]|0)+(c[r>>2]|0)>>10)+1>>1|0)<-32768)g=-32768;else g=((c[s>>2]|0)+(c[r>>2]|0)>>10)+1>>1;else g=32767;b[(c[k>>2]|0)+(c[q>>2]<<1)>>1]=g;if((((c[s>>2]|0)-(c[r>>2]|0)>>10)+1>>1|0)<=32767)if((((c[s>>2]|0)-(c[r>>2]|0)>>10)+1>>1|0)<-32768)g=-32768;else g=((c[s>>2]|0)-(c[r>>2]|0)>>10)+1>>1;else g=32767;b[(c[l>>2]|0)+(c[q>>2]<<1)>>1]=g;c[q>>2]=(c[q>>2]|0)+1}i=t;return}function Nf(a,d,e,f,g,h,j){a=a|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;x=i;i=i+64|0;k=x+52|0;l=x+48|0;y=x+44|0;m=x+40|0;n=x+36|0;o=x+32|0;p=x+28|0;v=x+24|0;u=x+20|0;r=x+16|0;q=x+12|0;t=x+8|0;s=x+4|0;w=x;c[k>>2]=a;c[l>>2]=d;c[y>>2]=e;c[m>>2]=f;c[n>>2]=g;c[o>>2]=h;c[p>>2]=j;c[q>>2]=0-(c[c[y>>2]>>2]|0)&16383;c[r>>2]=0-(c[c[y>>2]>>2]|0)>>14;c[s>>2]=0-(c[(c[y>>2]|0)+4>>2]|0)&16383;c[t>>2]=0-(c[(c[y>>2]|0)+4>>2]|0)>>14;c[v>>2]=0;while(1){if((c[v>>2]|0)>=(c[o>>2]|0))break;y=_(c[v>>2]|0,c[p>>2]|0)|0;c[u>>2]=b[(c[k>>2]|0)+(y<<1)>>1];y=_(c[c[l>>2]>>2]>>16,(c[u>>2]&65535)<<16>>16)|0;c[w>>2]=(c[c[m>>2]>>2]|0)+(y+((_(c[c[l>>2]>>2]&65535,(c[u>>2]&65535)<<16>>16)|0)>>16))<<2;y=_(c[w>>2]>>16,(c[q>>2]&65535)<<16>>16)|0;y=(c[(c[m>>2]|0)+4>>2]|0)+((y+((_(c[w>>2]&65535,(c[q>>2]&65535)<<16>>16)|0)>>16)>>13)+1>>1)|0;c[c[m>>2]>>2]=y;y=_(c[w>>2]>>16,(c[r>>2]&65535)<<16>>16)|0;y=(c[c[m>>2]>>2]|0)+(y+((_(c[w>>2]&65535,(c[r>>2]&65535)<<16>>16)|0)>>16))|0;c[c[m>>2]>>2]=y;y=_(c[(c[l>>2]|0)+4>>2]>>16,(c[u>>2]&65535)<<16>>16)|0;y=(c[c[m>>2]>>2]|0)+(y+((_(c[(c[l>>2]|0)+4>>2]&65535,(c[u>>2]&65535)<<16>>16)|0)>>16))|0;c[c[m>>2]>>2]=y;y=_(c[w>>2]>>16,(c[s>>2]&65535)<<16>>16)|0;y=(y+((_(c[w>>2]&65535,(c[s>>2]&65535)<<16>>16)|0)>>16)>>13)+1>>1;c[(c[m>>2]|0)+4>>2]=y;y=_(c[w>>2]>>16,(c[t>>2]&65535)<<16>>16)|0;y=(c[(c[m>>2]|0)+4>>2]|0)+(y+((_(c[w>>2]&65535,(c[t>>2]&65535)<<16>>16)|0)>>16))|0;c[(c[m>>2]|0)+4>>2]=y;y=_(c[(c[l>>2]|0)+8>>2]>>16,(c[u>>2]&65535)<<16>>16)|0;y=(c[(c[m>>2]|0)+4>>2]|0)+(y+((_(c[(c[l>>2]|0)+8>>2]&65535,(c[u>>2]&65535)<<16>>16)|0)>>16))|0;c[(c[m>>2]|0)+4>>2]=y;if(((c[w>>2]|0)+16384-1>>14|0)<=32767)if(((c[w>>2]|0)+16384-1>>14|0)<-32768)e=-32768;else e=(c[w>>2]|0)+16384-1>>14;else e=32767;y=_(c[v>>2]|0,c[p>>2]|0)|0;b[(c[n>>2]|0)+(y<<1)>>1]=e;c[v>>2]=(c[v>>2]|0)+1}i=x;return}function Of(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0;k=i;i=i+32|0;e=k+16|0;f=k+12|0;g=k+8|0;j=k+4|0;h=k;c[e>>2]=a;c[f>>2]=b;c[g>>2]=d;c[h>>2]=(c[g>>2]|0)-65536;c[j>>2]=0;while(1){a=c[g>>2]>>16;if((c[j>>2]|0)>=((c[f>>2]|0)-1|0))break;b=_(a,(c[(c[e>>2]|0)+(c[j>>2]<<2)>>2]&65535)<<16>>16)|0;b=b+((_(c[g>>2]&65535,(c[(c[e>>2]|0)+(c[j>>2]<<2)>>2]&65535)<<16>>16)|0)>>16)|0;b=b+(_(c[g>>2]|0,(c[(c[e>>2]|0)+(c[j>>2]<<2)>>2]>>15)+1>>1)|0)|0;c[(c[e>>2]|0)+(c[j>>2]<<2)>>2]=b;b=((_(c[g>>2]|0,c[h>>2]|0)|0)>>15)+1>>1;c[g>>2]=(c[g>>2]|0)+b;c[j>>2]=(c[j>>2]|0)+1}j=_(a,(c[(c[e>>2]|0)+((c[f>>2]|0)-1<<2)>>2]&65535)<<16>>16)|0;j=j+((_(c[g>>2]&65535,(c[(c[e>>2]|0)+((c[f>>2]|0)-1<<2)>>2]&65535)<<16>>16)|0)>>16)|0;j=j+(_(c[g>>2]|0,(c[(c[e>>2]|0)+((c[f>>2]|0)-1<<2)>>2]>>15)+1>>1)|0)|0;c[(c[e>>2]|0)+((c[f>>2]|0)-1<<2)>>2]=j;i=k;return}function Pf(a,d,e){a=a|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0;l=i;i=i+32|0;f=l+16|0;g=l+12|0;h=l+8|0;k=l+4|0;j=l;c[f>>2]=a;c[g>>2]=d;c[h>>2]=e;c[j>>2]=(c[h>>2]|0)-65536;c[k>>2]=0;while(1){a=c[h>>2]|0;if((c[k>>2]|0)>=((c[g>>2]|0)-1|0))break;d=((_(a,b[(c[f>>2]|0)+(c[k>>2]<<1)>>1]|0)|0)>>15)+1>>1&65535;b[(c[f>>2]|0)+(c[k>>2]<<1)>>1]=d;d=((_(c[h>>2]|0,c[j>>2]|0)|0)>>15)+1>>1;c[h>>2]=(c[h>>2]|0)+d;c[k>>2]=(c[k>>2]|0)+1}k=((_(a,b[(c[f>>2]|0)+((c[g>>2]|0)-1<<1)>>1]|0)|0)>>15)+1>>1&65535;b[(c[f>>2]|0)+((c[g>>2]|0)-1<<1)>>1]=k;i=l;return}function Qf(d,e,f,g,h){d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;u=i;i=i+48|0;j=u+36|0;l=u+38|0;m=u+32|0;k=u+28|0;n=u+24|0;r=u+20|0;q=u+16|0;t=u+12|0;s=u+8|0;p=u+4|0;o=u;b[j>>1]=d;a[l>>0]=e;c[m>>2]=f;c[k>>2]=g;c[n>>2]=h;g=(c[n>>2]|0)==4;do if((c[k>>2]|0)==8)if(g){c[o>>2]=30286;c[p>>2]=11;break}else{c[o>>2]=30252;c[p>>2]=3;break}else if(g){c[o>>2]=30330;c[p>>2]=34;break}else{c[o>>2]=30258;c[p>>2]=12;break}while(0);c[t>>2]=(c[k>>2]&65535)<<16>>16<<1;c[s>>2]=((c[k>>2]&65535)<<16>>16)*18;c[r>>2]=(c[t>>2]|0)+(b[j>>1]|0);c[q>>2]=0;while(1){if((c[q>>2]|0)>=(c[n>>2]|0))break;g=_(c[q>>2]|0,c[p>>2]|0)|0;c[(c[m>>2]|0)+(c[q>>2]<<2)>>2]=(c[r>>2]|0)+(a[(c[o>>2]|0)+(g+(a[l>>0]|0))>>0]|0);g=c[(c[m>>2]|0)+(c[q>>2]<<2)>>2]|0;do if((c[t>>2]|0)>(c[s>>2]|0)){if((g|0)>(c[t>>2]|0)){g=c[t>>2]|0;break}if((c[(c[m>>2]|0)+(c[q>>2]<<2)>>2]|0)<(c[s>>2]|0)){g=c[s>>2]|0;break}else{g=c[(c[m>>2]|0)+(c[q>>2]<<2)>>2]|0;break}}else{if((g|0)>(c[s>>2]|0)){g=c[s>>2]|0;break}if((c[(c[m>>2]|0)+(c[q>>2]<<2)>>2]|0)<(c[t>>2]|0)){g=c[t>>2]|0;break}else{g=c[(c[m>>2]|0)+(c[q>>2]<<2)>>2]|0;break}}while(0);c[(c[m>>2]|0)+(c[q>>2]<<2)>>2]=g;c[q>>2]=(c[q>>2]|0)+1}i=u;return}function Rf(a,d,e,f){a=a|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0;n=i;i=i+32|0;g=n+20|0;h=n+16|0;j=n+12|0;k=n+8|0;l=n+4|0;m=n;c[g>>2]=a;c[h>>2]=d;c[j>>2]=e;c[k>>2]=f;c[m>>2]=0;c[l>>2]=0;while(1){a=c[m>>2]|0;if((c[l>>2]|0)>=(c[k>>2]|0))break;e=_(b[(c[g>>2]|0)+(c[l>>2]<<1)>>1]|0,b[(c[h>>2]|0)+(c[l>>2]<<1)>>1]|0)|0;c[m>>2]=a+(e>>c[j>>2]);c[l>>2]=(c[l>>2]|0)+1}i=n;return a|0}function Sf(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;i=i+16|0;f=b+8|0;e=b+4|0;d=b;c[f>>2]=a;Tf(c[f>>2]|0,e,d);a=((_(c[d>>2]|0,128-(c[d>>2]|0)|0)|0)>>16)*179|0;a=(31-(c[e>>2]|0)<<7)+((c[d>>2]|0)+(a+(((_(c[d>>2]|0,128-(c[d>>2]|0)|0)|0)&65535)*179>>16)))|0;i=b;return a|0}function Tf(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;e=i;i=i+16|0;h=e+12|0;j=e+8|0;f=e+4|0;g=e;c[h>>2]=a;c[j>>2]=b;c[f>>2]=d;c[g>>2]=Uf(c[h>>2]|0)|0;c[c[j>>2]>>2]=c[g>>2];b=(Vf(c[h>>2]|0,24-(c[g>>2]|0)|0)|0)&127;c[c[f>>2]>>2]=b;i=e;return}function Uf(a){a=a|0;var b=0,d=0;d=i;i=i+16|0;b=d;c[b>>2]=a;if(!(c[b>>2]|0)){a=32;i=d;return a|0}a=32-(32-(aa(c[b>>2]|0)|0))|0;i=d;return a|0}function Vf(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0;k=i;i=i+32|0;e=k+20|0;d=k+16|0;f=k+12|0;j=k+8|0;h=k+4|0;g=k;c[d>>2]=a;c[f>>2]=b;c[j>>2]=c[d>>2];c[h>>2]=c[f>>2];c[g>>2]=0-(c[f>>2]|0);if(!(c[f>>2]|0)){c[e>>2]=c[d>>2];j=c[e>>2]|0;i=k;return j|0}d=c[j>>2]|0;if((c[f>>2]|0)<0){c[e>>2]=d<<c[g>>2]|(c[j>>2]|0)>>>(32-(c[g>>2]|0)|0);j=c[e>>2]|0;i=k;return j|0}else{c[e>>2]=d<<32-(c[h>>2]|0)|(c[j>>2]|0)>>>(c[h>>2]|0);j=c[e>>2]|0;i=k;return j|0}return 0}function Wf(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;h=i;i=i+16|0;d=h+12|0;e=h+8|0;g=h+4|0;f=h;c[e>>2]=a;if((c[e>>2]|0)<0){c[d>>2]=0;g=c[d>>2]|0;i=h;return g|0}if((c[e>>2]|0)>=3967){c[d>>2]=2147483647;g=c[d>>2]|0;i=h;return g|0}c[g>>2]=1<<(c[e>>2]>>7);c[f>>2]=c[e>>2]&127;a=c[g>>2]|0;b=c[g>>2]|0;if((c[e>>2]|0)<2048){e=_((_((c[f>>2]&65535)<<16>>16,(128-(c[f>>2]|0)&65535)<<16>>16)|0)>>16,-174)|0;c[g>>2]=a+((_(b,(c[f>>2]|0)+(e+((_((_((c[f>>2]&65535)<<16>>16,(128-(c[f>>2]|0)&65535)<<16>>16)|0)&65535,-174)|0)>>16))|0)|0)>>7)}else{e=_((_((c[f>>2]&65535)<<16>>16,(128-(c[f>>2]|0)&65535)<<16>>16)|0)>>16,-174)|0;c[g>>2]=a+(_(b>>7,(c[f>>2]|0)+(e+((_((_((c[f>>2]&65535)<<16>>16,(128-(c[f>>2]|0)&65535)<<16>>16)|0)&65535,-174)|0)>>16))|0)|0)}c[d>>2]=c[g>>2];g=c[d>>2]|0;i=h;return g|0}function Xf(a,d,e,f,g,h){a=a|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;t=i;i=i+48|0;j=t+40|0;k=t+36|0;l=t+32|0;m=t+28|0;n=t+24|0;q=t+16|0;p=t+12|0;s=t+8|0;r=t+4|0;o=t;c[j>>2]=a;c[k>>2]=d;c[l>>2]=e;c[m>>2]=f;c[n>>2]=g;c[t+20>>2]=h;c[p>>2]=c[n>>2];while(1){if((c[p>>2]|0)>=(c[m>>2]|0))break;c[o>>2]=(c[k>>2]|0)+((c[p>>2]|0)-1<<1);c[s>>2]=_(b[c[o>>2]>>1]|0,b[c[l>>2]>>1]|0)|0;c[s>>2]=(c[s>>2]|0)+(_(b[(c[o>>2]|0)+-2>>1]|0,b[(c[l>>2]|0)+2>>1]|0)|0);c[s>>2]=(c[s>>2]|0)+(_(b[(c[o>>2]|0)+-4>>1]|0,b[(c[l>>2]|0)+4>>1]|0)|0);c[s>>2]=(c[s>>2]|0)+(_(b[(c[o>>2]|0)+-6>>1]|0,b[(c[l>>2]|0)+6>>1]|0)|0);c[s>>2]=(c[s>>2]|0)+(_(b[(c[o>>2]|0)+-8>>1]|0,b[(c[l>>2]|0)+8>>1]|0)|0);c[s>>2]=(c[s>>2]|0)+(_(b[(c[o>>2]|0)+-10>>1]|0,b[(c[l>>2]|0)+10>>1]|0)|0);c[q>>2]=6;while(1){if((c[q>>2]|0)>=(c[n>>2]|0))break;c[s>>2]=(c[s>>2]|0)+(_(b[(c[o>>2]|0)+(0-(c[q>>2]|0)<<1)>>1]|0,b[(c[l>>2]|0)+(c[q>>2]<<1)>>1]|0)|0);c[s>>2]=(c[s>>2]|0)+(_(b[(c[o>>2]|0)+(0-(c[q>>2]|0)-1<<1)>>1]|0,b[(c[l>>2]|0)+((c[q>>2]|0)+1<<1)>>1]|0)|0);c[q>>2]=(c[q>>2]|0)+2}c[s>>2]=(b[(c[o>>2]|0)+2>>1]<<12)-(c[s>>2]|0);c[r>>2]=(c[s>>2]>>11)+1>>1;if((c[r>>2]|0)>32767)e=32767;else e=(c[r>>2]|0)<-32768?-32768:c[r>>2]|0;b[(c[j>>2]|0)+(c[p>>2]<<1)>>1]=e;c[p>>2]=(c[p>>2]|0)+1}oj(c[j>>2]|0,0,c[n>>2]<<1|0)|0;i=t;return}function Yf(a,d){a=a|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;m=i;i=i+160|0;e=m+148|0;f=m+144|0;g=m+140|0;l=m+136|0;j=m+8|0;h=m+4|0;k=m;c[f>>2]=a;c[g>>2]=d;c[k>>2]=0;c[h>>2]=j+((c[g>>2]&1)<<6);c[l>>2]=0;while(1){if((c[l>>2]|0)>=(c[g>>2]|0))break;c[k>>2]=(c[k>>2]|0)+(b[(c[f>>2]|0)+(c[l>>2]<<1)>>1]|0);c[(c[h>>2]|0)+(c[l>>2]<<2)>>2]=b[(c[f>>2]|0)+(c[l>>2]<<1)>>1]<<12;c[l>>2]=(c[l>>2]|0)+1}if((c[k>>2]|0)>=4096){c[e>>2]=0;d=c[e>>2]|0;i=m;return d|0}else{c[e>>2]=Zf(j,c[g>>2]|0)|0;d=c[e>>2]|0;i=m;return d|0}return 0}function Zf(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;r=i;i=i+64|0;d=r+48|0;e=r+44|0;s=r+40|0;j=r+36|0;l=r+32|0;k=r+28|0;h=r+24|0;m=r+20|0;n=r+16|0;o=r+12|0;p=r+8|0;g=r+4|0;f=r;c[e>>2]=a;c[s>>2]=b;c[f>>2]=(c[e>>2]|0)+((c[s>>2]&1)<<6);c[h>>2]=1073741824;c[j>>2]=(c[s>>2]|0)-1;while(1){if((c[j>>2]|0)<=0)break;if((c[(c[f>>2]|0)+(c[j>>2]<<2)>>2]|0)>16773022){q=5;break}if((c[(c[f>>2]|0)+(c[j>>2]<<2)>>2]|0)<-16773022){q=5;break}c[m>>2]=0-(c[(c[f>>2]|0)+(c[j>>2]<<2)>>2]<<7);s=c[m>>2]|0;b=c[m>>2]|0;b=yj(s|0,((s|0)<0)<<31>>31|0,b|0,((b|0)<0)<<31>>31|0)|0;b=nj(b|0,C|0,32)|0;c[n>>2]=1073741824-b;b=c[n>>2]|0;c[k>>2]=32-(_f((c[n>>2]|0)>0?b:0-b|0)|0);c[o>>2]=$f(c[n>>2]|0,(c[k>>2]|0)+30|0)|0;b=c[h>>2]|0;s=c[n>>2]|0;s=yj(b|0,((b|0)<0)<<31>>31|0,s|0,((s|0)<0)<<31>>31|0)|0;s=nj(s|0,C|0,32)|0;c[h>>2]=s<<2;c[g>>2]=c[f>>2];c[f>>2]=(c[e>>2]|0)+((c[j>>2]&1)<<6);c[l>>2]=0;while(1){if((c[l>>2]|0)>=(c[j>>2]|0))break;b=c[(c[g>>2]|0)+(c[l>>2]<<2)>>2]|0;a=c[(c[g>>2]|0)+((c[j>>2]|0)-(c[l>>2]|0)-1<<2)>>2]|0;s=c[m>>2]|0;s=yj(a|0,((a|0)<0)<<31>>31|0,s|0,((s|0)<0)<<31>>31|0)|0;s=nj(s|0,C|0,30)|0;s=mj(s|0,C|0,1,0)|0;s=nj(s|0,C|0,1)|0;c[p>>2]=b-s;s=(c[k>>2]|0)==1;b=c[p>>2]|0;a=c[o>>2]|0;a=yj(b|0,((b|0)<0)<<31>>31|0,a|0,((a|0)<0)<<31>>31|0)|0;b=C;if(s){b=nj(a|0,b|0,1)|0;s=C;t=c[p>>2]|0;a=c[o>>2]|0;a=yj(t|0,((t|0)<0)<<31>>31|0,a|0,((a|0)<0)<<31>>31|0)|0;a=mj(b|0,s|0,a&1|0,0)|0}else{a=nj(a|0,b|0,(c[k>>2]|0)-1|0)|0;a=mj(a|0,C|0,1,0)|0;a=nj(a|0,C|0,1)|0}c[(c[f>>2]|0)+(c[l>>2]<<2)>>2]=a;c[l>>2]=(c[l>>2]|0)+1}c[j>>2]=(c[j>>2]|0)+-1}if((q|0)==5){c[d>>2]=0;t=c[d>>2]|0;i=r;return t|0}if((c[c[f>>2]>>2]|0)<=16773022?(c[c[f>>2]>>2]|0)>=-16773022:0){c[m>>2]=0-(c[c[f>>2]>>2]<<7);t=c[m>>2]|0;s=c[m>>2]|0;s=yj(t|0,((t|0)<0)<<31>>31|0,s|0,((s|0)<0)<<31>>31|0)|0;s=nj(s|0,C|0,32)|0;c[n>>2]=1073741824-s;s=c[h>>2]|0;t=c[n>>2]|0;t=yj(s|0,((s|0)<0)<<31>>31|0,t|0,((t|0)<0)<<31>>31|0)|0;t=nj(t|0,C|0,32)|0;c[h>>2]=t<<2;c[d>>2]=c[h>>2];t=c[d>>2]|0;i=r;return t|0}c[d>>2]=0;t=c[d>>2]|0;i=r;return t|0}function _f(a){a=a|0;var b=0,d=0;d=i;i=i+16|0;b=d;c[b>>2]=a;if(!(c[b>>2]|0)){a=32;i=d;return a|0}a=32-(32-(aa(c[b>>2]|0)|0))|0;i=d;return a|0}function $f(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;h=i;i=i+48|0;f=h+32|0;n=h+28|0;d=h+24|0;j=h+20|0;g=h+16|0;k=h+12|0;m=h+8|0;l=h+4|0;e=h;c[n>>2]=a;c[d>>2]=b;b=c[n>>2]|0;c[j>>2]=(_f((c[n>>2]|0)>0?b:0-b|0)|0)-1;c[m>>2]=c[n>>2]<<c[j>>2];c[k>>2]=536870911/(c[m>>2]>>16|0)|0;c[e>>2]=c[k>>2]<<16;b=_(c[m>>2]>>16,(c[k>>2]&65535)<<16>>16)|0;c[l>>2]=536870912-(b+((_(c[m>>2]&65535,(c[k>>2]&65535)<<16>>16)|0)>>16))<<3;b=_(c[l>>2]>>16,(c[k>>2]&65535)<<16>>16)|0;b=(c[e>>2]|0)+(b+((_(c[l>>2]&65535,(c[k>>2]&65535)<<16>>16)|0)>>16))|0;c[e>>2]=b+(_(c[l>>2]|0,(c[k>>2]>>15)+1>>1)|0);c[g>>2]=61-(c[j>>2]|0)-(c[d>>2]|0);b=c[g>>2]|0;if((c[g>>2]|0)>0)if((b|0)<32){c[f>>2]=c[e>>2]>>c[g>>2];n=c[f>>2]|0;i=h;return n|0}else{c[f>>2]=0;n=c[f>>2]|0;i=h;return n|0}a=c[e>>2]|0;d=0-(c[g>>2]|0)|0;do if((-2147483648>>0-b|0)>(2147483647>>0-(c[g>>2]|0)|0)){if((a|0)>(-2147483648>>d|0)){b=-2147483648>>0-(c[g>>2]|0);break}if((c[e>>2]|0)<(2147483647>>0-(c[g>>2]|0)|0)){b=2147483647>>0-(c[g>>2]|0);break}else{b=c[e>>2]|0;break}}else{if((a|0)>(2147483647>>d|0)){b=2147483647>>0-(c[g>>2]|0);break}if((c[e>>2]|0)<(-2147483648>>0-(c[g>>2]|0)|0)){b=-2147483648>>0-(c[g>>2]|0);break}else{b=c[e>>2]|0;break}}while(0);c[f>>2]=b<<0-(c[g>>2]|0);n=c[f>>2]|0;i=h;return n|0}function ag(a,e,f){a=a|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;C=i;i=i+272|0;x=C+264|0;g=C+260|0;y=C+256|0;v=C+252|0;B=C+248|0;A=C+244|0;p=C+240|0;n=C+176|0;h=C+140|0;k=C+104|0;j=C+100|0;l=C+96|0;s=C+92|0;r=C+88|0;o=C+84|0;q=C+80|0;z=C+16|0;u=C+12|0;m=C+8|0;t=C+4|0;w=C;c[x>>2]=a;c[g>>2]=e;c[y>>2]=f;c[t>>2]=0;c[v>>2]=(c[y>>2]|0)==16?30226:30242;c[B>>2]=0;while(1){if((c[B>>2]|0)>=(c[y>>2]|0))break;c[s>>2]=b[(c[g>>2]|0)+(c[B>>2]<<1)>>1]>>8;c[r>>2]=(b[(c[g>>2]|0)+(c[B>>2]<<1)>>1]|0)-(c[s>>2]<<8);c[o>>2]=b[24576+(c[s>>2]<<1)>>1];c[q>>2]=(b[24576+((c[s>>2]|0)+1<<1)>>1]|0)-(c[o>>2]|0);f=((c[o>>2]<<8)+(_(c[q>>2]|0,c[r>>2]|0)|0)>>3)+1>>1;c[n+(d[(c[v>>2]|0)+(c[B>>2]|0)>>0]<<2)>>2]=f;c[B>>2]=(c[B>>2]|0)+1}c[p>>2]=c[y>>2]>>1;bg(h,n,c[p>>2]|0);bg(k,n+4|0,c[p>>2]|0);c[B>>2]=0;while(1){if((c[B>>2]|0)>=(c[p>>2]|0))break;c[j>>2]=(c[h+((c[B>>2]|0)+1<<2)>>2]|0)+(c[h+(c[B>>2]<<2)>>2]|0);c[l>>2]=(c[k+((c[B>>2]|0)+1<<2)>>2]|0)-(c[k+(c[B>>2]<<2)>>2]|0);c[z+(c[B>>2]<<2)>>2]=0-(c[l>>2]|0)-(c[j>>2]|0);c[z+((c[y>>2]|0)-(c[B>>2]|0)-1<<2)>>2]=(c[l>>2]|0)-(c[j>>2]|0);c[B>>2]=(c[B>>2]|0)+1}c[A>>2]=0;while(1){if((c[A>>2]|0)>=10)break;c[u>>2]=0;c[B>>2]=0;while(1){if((c[B>>2]|0)>=(c[y>>2]|0))break;v=c[z+(c[B>>2]<<2)>>2]|0;c[m>>2]=(c[z+(c[B>>2]<<2)>>2]|0)>0?v:0-v|0;if((c[m>>2]|0)>(c[u>>2]|0)){c[u>>2]=c[m>>2];c[t>>2]=c[B>>2]}c[B>>2]=(c[B>>2]|0)+1}c[u>>2]=(c[u>>2]>>4)+1>>1;if((c[u>>2]|0)<=32767)break;c[u>>2]=(c[u>>2]|0)<163838?c[u>>2]|0:163838;c[w>>2]=65470-(((c[u>>2]|0)-32767<<14|0)/((_(c[u>>2]|0,(c[t>>2]|0)+1|0)|0)>>2|0)|0);Of(z,c[y>>2]|0,c[w>>2]|0);c[A>>2]=(c[A>>2]|0)+1}w=(c[A>>2]|0)==10;c[B>>2]=0;a:do if(w)while(1){if((c[B>>2]|0)>=(c[y>>2]|0))break a;if(((c[z+(c[B>>2]<<2)>>2]>>4)+1>>1|0)<=32767)if(((c[z+(c[B>>2]<<2)>>2]>>4)+1>>1|0)<-32768)g=-32768;else g=(c[z+(c[B>>2]<<2)>>2]>>4)+1>>1;else g=32767;b[(c[x>>2]|0)+(c[B>>2]<<1)>>1]=g;c[z+(c[B>>2]<<2)>>2]=b[(c[x>>2]|0)+(c[B>>2]<<1)>>1]<<5;c[B>>2]=(c[B>>2]|0)+1}else while(1){if((c[B>>2]|0)>=(c[y>>2]|0))break a;b[(c[x>>2]|0)+(c[B>>2]<<1)>>1]=(c[z+(c[B>>2]<<2)>>2]>>4)+1>>1;c[B>>2]=(c[B>>2]|0)+1}while(0);c[A>>2]=0;while(1){if((c[A>>2]|0)>=16){g=31;break}if((Yf(c[x>>2]|0,c[y>>2]|0)|0)>=107374){g=31;break}Of(z,c[y>>2]|0,65536-(2<<c[A>>2])|0);c[B>>2]=0;while(1){if((c[B>>2]|0)>=(c[y>>2]|0))break;b[(c[x>>2]|0)+(c[B>>2]<<1)>>1]=(c[z+(c[B>>2]<<2)>>2]>>4)+1>>1;c[B>>2]=(c[B>>2]|0)+1}c[A>>2]=(c[A>>2]|0)+1}if((g|0)==31){i=C;return}}function bg(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0;l=i;i=i+32|0;e=l+20|0;f=l+16|0;g=l+12|0;j=l+8|0;k=l+4|0;h=l;c[e>>2]=a;c[f>>2]=b;c[g>>2]=d;c[c[e>>2]>>2]=65536;c[(c[e>>2]|0)+4>>2]=0-(c[c[f>>2]>>2]|0);c[j>>2]=1;while(1){if((c[j>>2]|0)>=(c[g>>2]|0))break;c[h>>2]=c[(c[f>>2]|0)+(c[j>>2]<<1<<2)>>2];d=c[(c[e>>2]|0)+((c[j>>2]|0)-1<<2)>>2]<<1;b=c[h>>2]|0;a=c[(c[e>>2]|0)+(c[j>>2]<<2)>>2]|0;a=yj(b|0,((b|0)<0)<<31>>31|0,a|0,((a|0)<0)<<31>>31|0)|0;a=nj(a|0,C|0,15)|0;a=mj(a|0,C|0,1,0)|0;a=nj(a|0,C|0,1)|0;c[(c[e>>2]|0)+((c[j>>2]|0)+1<<2)>>2]=d-a;c[k>>2]=c[j>>2];while(1){if((c[k>>2]|0)<=1)break;b=c[(c[e>>2]|0)+((c[k>>2]|0)-2<<2)>>2]|0;a=c[h>>2]|0;d=c[(c[e>>2]|0)+((c[k>>2]|0)-1<<2)>>2]|0;d=yj(a|0,((a|0)<0)<<31>>31|0,d|0,((d|0)<0)<<31>>31|0)|0;d=nj(d|0,C|0,15)|0;d=mj(d|0,C|0,1,0)|0;d=nj(d|0,C|0,1)|0;a=(c[e>>2]|0)+(c[k>>2]<<2)|0;c[a>>2]=(c[a>>2]|0)+(b-d);c[k>>2]=(c[k>>2]|0)+-1}a=(c[e>>2]|0)+4|0;c[a>>2]=(c[a>>2]|0)-(c[h>>2]|0);c[j>>2]=(c[j>>2]|0)+1}i=l;return} |
| | | function xd(a,d,e,f){a=a|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;t=i;i=i+80|0;l=t+40|0;g=t+36|0;m=t+32|0;n=t+28|0;q=t+24|0;j=t+20|0;s=t+16|0;h=t+12|0;k=t+8|0;p=t+48|0;r=t+4|0;o=t;c[l>>2]=a;c[g>>2]=d;c[m>>2]=e;c[n>>2]=f;c[r>>2]=(c[l>>2]|0)+2772;if((c[(c[l>>2]|0)+2316>>2]|0)!=(c[(c[r>>2]|0)+1384>>2]|0)){wd(c[l>>2]|0);c[(c[r>>2]|0)+1384>>2]=c[(c[l>>2]|0)+2316>>2]}a:do if((c[(c[l>>2]|0)+4160>>2]|0)==0?(c[(c[l>>2]|0)+4164>>2]|0)==0:0){c[q>>2]=0;while(1){if((c[q>>2]|0)>=(c[(c[l>>2]|0)+2340>>2]|0))break;d=(c[r>>2]|0)+1280+(c[q>>2]<<1)|0;b[d>>1]=(b[d>>1]|0)+((((b[(c[l>>2]|0)+2344+(c[q>>2]<<1)>>1]|0)-(b[(c[r>>2]|0)+1280+(c[q>>2]<<1)>>1]|0)>>16)*16348|0)+(((b[(c[l>>2]|0)+2344+(c[q>>2]<<1)>>1]|0)-(b[(c[r>>2]|0)+1280+(c[q>>2]<<1)>>1]|0)&65535)*16348>>16));c[q>>2]=(c[q>>2]|0)+1}c[h>>2]=0;c[j>>2]=0;c[q>>2]=0;while(1){if((c[q>>2]|0)>=(c[(c[l>>2]|0)+2324>>2]|0))break;if((c[(c[g>>2]|0)+16+(c[q>>2]<<2)>>2]|0)>(c[h>>2]|0)){c[h>>2]=c[(c[g>>2]|0)+16+(c[q>>2]<<2)>>2];c[j>>2]=c[q>>2]}c[q>>2]=(c[q>>2]|0)+1}qj((c[r>>2]|0)+(c[(c[l>>2]|0)+2332>>2]<<2)|0,c[r>>2]|0,(_((c[(c[l>>2]|0)+2324>>2]|0)-1|0,c[(c[l>>2]|0)+2332>>2]|0)|0)<<2|0)|0;j=_(c[j>>2]|0,c[(c[l>>2]|0)+2332>>2]|0)|0;pj(c[r>>2]|0,(c[l>>2]|0)+4+(j<<2)|0,c[(c[l>>2]|0)+2332>>2]<<2|0)|0;c[q>>2]=0;while(1){if((c[q>>2]|0)>=(c[(c[l>>2]|0)+2324>>2]|0))break a;j=(c[r>>2]|0)+1376|0;c[j>>2]=(c[j>>2]|0)+((((c[(c[g>>2]|0)+16+(c[q>>2]<<2)>>2]|0)-(c[(c[r>>2]|0)+1376>>2]|0)>>16)*4634|0)+(((c[(c[g>>2]|0)+16+(c[q>>2]<<2)>>2]|0)-(c[(c[r>>2]|0)+1376>>2]|0)&65535)*4634>>16));c[q>>2]=(c[q>>2]|0)+1}}while(0);if(!(c[(c[l>>2]|0)+4160>>2]|0)){oj((c[r>>2]|0)+1312|0,0,c[(c[l>>2]|0)+2340>>2]<<2|0)|0;i=t;return}j=(c[n>>2]|0)+16|0;c[o>>2]=ia()|0;h=i;i=i+((1*(j<<2)|0)+15&-16)|0;j=_(b[(c[l>>2]|0)+4168+56>>1]>>16,(c[(c[l>>2]|0)+4168+72+4>>2]&65535)<<16>>16)|0;j=j+((_(b[(c[l>>2]|0)+4168+56>>1]&65535,(c[(c[l>>2]|0)+4168+72+4>>2]&65535)<<16>>16)|0)>>16)|0;c[k>>2]=j+(_(b[(c[l>>2]|0)+4168+56>>1]|0,(c[(c[l>>2]|0)+4168+72+4>>2]>>15)+1>>1)|0);if((c[k>>2]|0)<2097152?(c[(c[r>>2]|0)+1376>>2]|0)<=8388608:0){j=_(c[k>>2]>>16,(c[k>>2]&65535)<<16>>16)|0;j=j+((_(c[k>>2]&65535,(c[k>>2]&65535)<<16>>16)|0)>>16)|0;c[k>>2]=j+(_(c[k>>2]|0,(c[k>>2]>>15)+1>>1)|0);j=_(c[(c[r>>2]|0)+1376>>2]>>16,(c[(c[r>>2]|0)+1376>>2]&65535)<<16>>16)|0;j=j+((_(c[(c[r>>2]|0)+1376>>2]&65535,(c[(c[r>>2]|0)+1376>>2]&65535)<<16>>16)|0)>>16)|0;j=j+(_(c[(c[r>>2]|0)+1376>>2]|0,(c[(c[r>>2]|0)+1376>>2]>>15)+1>>1)|0)|0;c[k>>2]=j-(c[k>>2]<<5);c[k>>2]=(yd(c[k>>2]|0)|0)<<8}else{c[k>>2]=_(c[k>>2]>>16,c[k>>2]>>16)|0;j=_(c[(c[r>>2]|0)+1376>>2]>>16,c[(c[r>>2]|0)+1376>>2]>>16)|0;c[k>>2]=j-(c[k>>2]<<5);c[k>>2]=(yd(c[k>>2]|0)|0)<<16}Cd(h+64|0,c[r>>2]|0,c[k>>2]|0,c[n>>2]|0,(c[r>>2]|0)+1380|0);ag(p,(c[r>>2]|0)+1280|0,c[(c[l>>2]|0)+2340>>2]|0);g=h;e=(c[r>>2]|0)+1312|0;f=g+64|0;do{c[g>>2]=c[e>>2];g=g+4|0;e=e+4|0}while((g|0)<(f|0));c[q>>2]=0;while(1){if((c[q>>2]|0)>=(c[n>>2]|0))break;c[s>>2]=c[(c[l>>2]|0)+2340>>2]>>1;k=_(c[h+(16+(c[q>>2]|0)-1<<2)>>2]>>16,b[p>>1]|0)|0;c[s>>2]=(c[s>>2]|0)+(k+((_(c[h+(16+(c[q>>2]|0)-1<<2)>>2]&65535,b[p>>1]|0)|0)>>16));k=_(c[h+(16+(c[q>>2]|0)-2<<2)>>2]>>16,b[p+2>>1]|0)|0;c[s>>2]=(c[s>>2]|0)+(k+((_(c[h+(16+(c[q>>2]|0)-2<<2)>>2]&65535,b[p+2>>1]|0)|0)>>16));k=_(c[h+(16+(c[q>>2]|0)-3<<2)>>2]>>16,b[p+4>>1]|0)|0;c[s>>2]=(c[s>>2]|0)+(k+((_(c[h+(16+(c[q>>2]|0)-3<<2)>>2]&65535,b[p+4>>1]|0)|0)>>16));k=_(c[h+(16+(c[q>>2]|0)-4<<2)>>2]>>16,b[p+6>>1]|0)|0;c[s>>2]=(c[s>>2]|0)+(k+((_(c[h+(16+(c[q>>2]|0)-4<<2)>>2]&65535,b[p+6>>1]|0)|0)>>16));k=_(c[h+(16+(c[q>>2]|0)-5<<2)>>2]>>16,b[p+8>>1]|0)|0;c[s>>2]=(c[s>>2]|0)+(k+((_(c[h+(16+(c[q>>2]|0)-5<<2)>>2]&65535,b[p+8>>1]|0)|0)>>16));k=_(c[h+(16+(c[q>>2]|0)-6<<2)>>2]>>16,b[p+10>>1]|0)|0;c[s>>2]=(c[s>>2]|0)+(k+((_(c[h+(16+(c[q>>2]|0)-6<<2)>>2]&65535,b[p+10>>1]|0)|0)>>16));k=_(c[h+(16+(c[q>>2]|0)-7<<2)>>2]>>16,b[p+12>>1]|0)|0;c[s>>2]=(c[s>>2]|0)+(k+((_(c[h+(16+(c[q>>2]|0)-7<<2)>>2]&65535,b[p+12>>1]|0)|0)>>16));k=_(c[h+(16+(c[q>>2]|0)-8<<2)>>2]>>16,b[p+14>>1]|0)|0;c[s>>2]=(c[s>>2]|0)+(k+((_(c[h+(16+(c[q>>2]|0)-8<<2)>>2]&65535,b[p+14>>1]|0)|0)>>16));k=_(c[h+(16+(c[q>>2]|0)-9<<2)>>2]>>16,b[p+16>>1]|0)|0;c[s>>2]=(c[s>>2]|0)+(k+((_(c[h+(16+(c[q>>2]|0)-9<<2)>>2]&65535,b[p+16>>1]|0)|0)>>16));k=_(c[h+(16+(c[q>>2]|0)-10<<2)>>2]>>16,b[p+18>>1]|0)|0;c[s>>2]=(c[s>>2]|0)+(k+((_(c[h+(16+(c[q>>2]|0)-10<<2)>>2]&65535,b[p+18>>1]|0)|0)>>16));if((c[(c[l>>2]|0)+2340>>2]|0)==16){k=_(c[h+(16+(c[q>>2]|0)-11<<2)>>2]>>16,b[p+20>>1]|0)|0;c[s>>2]=(c[s>>2]|0)+(k+((_(c[h+(16+(c[q>>2]|0)-11<<2)>>2]&65535,b[p+20>>1]|0)|0)>>16));k=_(c[h+(16+(c[q>>2]|0)-12<<2)>>2]>>16,b[p+22>>1]|0)|0;c[s>>2]=(c[s>>2]|0)+(k+((_(c[h+(16+(c[q>>2]|0)-12<<2)>>2]&65535,b[p+22>>1]|0)|0)>>16));k=_(c[h+(16+(c[q>>2]|0)-13<<2)>>2]>>16,b[p+24>>1]|0)|0;c[s>>2]=(c[s>>2]|0)+(k+((_(c[h+(16+(c[q>>2]|0)-13<<2)>>2]&65535,b[p+24>>1]|0)|0)>>16));k=_(c[h+(16+(c[q>>2]|0)-14<<2)>>2]>>16,b[p+26>>1]|0)|0;c[s>>2]=(c[s>>2]|0)+(k+((_(c[h+(16+(c[q>>2]|0)-14<<2)>>2]&65535,b[p+26>>1]|0)|0)>>16));k=_(c[h+(16+(c[q>>2]|0)-15<<2)>>2]>>16,b[p+28>>1]|0)|0;c[s>>2]=(c[s>>2]|0)+(k+((_(c[h+(16+(c[q>>2]|0)-15<<2)>>2]&65535,b[p+28>>1]|0)|0)>>16));k=_(c[h+(16+(c[q>>2]|0)-16<<2)>>2]>>16,b[p+30>>1]|0)|0;c[s>>2]=(c[s>>2]|0)+(k+((_(c[h+(16+(c[q>>2]|0)-16<<2)>>2]&65535,b[p+30>>1]|0)|0)>>16))}c[h+(16+(c[q>>2]|0)<<2)>>2]=(c[h+(16+(c[q>>2]|0)<<2)>>2]|0)+(c[s>>2]<<4);if(((b[(c[m>>2]|0)+(c[q>>2]<<1)>>1]|0)+((c[h+(16+(c[q>>2]|0)<<2)>>2]>>9)+1>>1)|0)<=32767)if(((b[(c[m>>2]|0)+(c[q>>2]<<1)>>1]|0)+((c[h+(16+(c[q>>2]|0)<<2)>>2]>>9)+1>>1)|0)<-32768)g=-32768;else g=(b[(c[m>>2]|0)+(c[q>>2]<<1)>>1]|0)+((c[h+(16+(c[q>>2]|0)<<2)>>2]>>9)+1>>1)|0;else g=32767;b[(c[m>>2]|0)+(c[q>>2]<<1)>>1]=g;c[q>>2]=(c[q>>2]|0)+1}g=(c[r>>2]|0)+1312|0;e=h+(c[n>>2]<<2)|0;f=g+64|0;do{c[g>>2]=c[e>>2];g=g+4|0;e=e+4|0}while((g|0)<(f|0));na(c[o>>2]|0);i=t;return}function yd(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;h=i;i=i+32|0;b=h+16|0;d=h+12|0;g=h+8|0;f=h+4|0;e=h;c[d>>2]=a;if((c[d>>2]|0)<=0){c[b>>2]=0;g=c[b>>2]|0;i=h;return g|0}zd(c[d>>2]|0,f,e);if(c[f>>2]&1|0)c[g>>2]=32768;else c[g>>2]=46214;c[g>>2]=c[g>>2]>>(c[f>>2]>>1);a=_(c[g>>2]>>16,(((c[e>>2]&65535)<<16>>16)*213&65535)<<16>>16)|0;c[g>>2]=(c[g>>2]|0)+(a+((_(c[g>>2]&65535,(((c[e>>2]&65535)<<16>>16)*213&65535)<<16>>16)|0)>>16));c[b>>2]=c[g>>2];g=c[b>>2]|0;i=h;return g|0}function zd(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;e=i;i=i+16|0;h=e+12|0;j=e+8|0;f=e+4|0;g=e;c[h>>2]=a;c[j>>2]=b;c[f>>2]=d;c[g>>2]=Ad(c[h>>2]|0)|0;c[c[j>>2]>>2]=c[g>>2];b=(Bd(c[h>>2]|0,24-(c[g>>2]|0)|0)|0)&127;c[c[f>>2]>>2]=b;i=e;return}function Ad(a){a=a|0;var b=0,d=0;d=i;i=i+16|0;b=d;c[b>>2]=a;if(!(c[b>>2]|0)){a=32;i=d;return a|0}a=32-(32-(aa(c[b>>2]|0)|0))|0;i=d;return a|0}function Bd(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0;k=i;i=i+32|0;e=k+20|0;d=k+16|0;f=k+12|0;j=k+8|0;h=k+4|0;g=k;c[d>>2]=a;c[f>>2]=b;c[j>>2]=c[d>>2];c[h>>2]=c[f>>2];c[g>>2]=0-(c[f>>2]|0);if(!(c[f>>2]|0)){c[e>>2]=c[d>>2];j=c[e>>2]|0;i=k;return j|0}d=c[j>>2]|0;if((c[f>>2]|0)<0){c[e>>2]=d<<c[g>>2]|(c[j>>2]|0)>>>(32-(c[g>>2]|0)|0);j=c[e>>2]|0;i=k;return j|0}else{c[e>>2]=d<<32-(c[h>>2]|0)|(c[j>>2]|0)>>>(c[h>>2]|0);j=c[e>>2]|0;i=k;return j|0}return 0}function Cd(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;q=i;i=i+48|0;g=q+32|0;h=q+28|0;j=q+24|0;k=q+20|0;l=q+16|0;p=q+12|0;n=q+8|0;o=q+4|0;m=q;c[g>>2]=a;c[h>>2]=b;c[j>>2]=d;c[k>>2]=e;c[l>>2]=f;c[m>>2]=255;while(1){if((c[m>>2]|0)<=(c[k>>2]|0))break;c[m>>2]=c[m>>2]>>1}c[p>>2]=c[c[l>>2]>>2];c[n>>2]=0;while(1){d=c[p>>2]|0;if((c[n>>2]|0)>=(c[k>>2]|0))break;c[p>>2]=907633515+(_(d,196314165)|0);c[o>>2]=c[p>>2]>>24&c[m>>2];f=_(c[(c[h>>2]|0)+(c[o>>2]<<2)>>2]>>16,(c[j>>2]>>4&65535)<<16>>16)|0;f=f+((_(c[(c[h>>2]|0)+(c[o>>2]<<2)>>2]&65535,(c[j>>2]>>4&65535)<<16>>16)|0)>>16)|0;if((f+(_(c[(c[h>>2]|0)+(c[o>>2]<<2)>>2]|0,(c[j>>2]>>4>>15)+1>>1)|0)|0)<=32767){f=_(c[(c[h>>2]|0)+(c[o>>2]<<2)>>2]>>16,(c[j>>2]>>4&65535)<<16>>16)|0;f=f+((_(c[(c[h>>2]|0)+(c[o>>2]<<2)>>2]&65535,(c[j>>2]>>4&65535)<<16>>16)|0)>>16)|0;if((f+(_(c[(c[h>>2]|0)+(c[o>>2]<<2)>>2]|0,(c[j>>2]>>4>>15)+1>>1)|0)|0)<-32768)d=-32768;else{d=_(c[(c[h>>2]|0)+(c[o>>2]<<2)>>2]>>16,(c[j>>2]>>4&65535)<<16>>16)|0;d=d+((_(c[(c[h>>2]|0)+(c[o>>2]<<2)>>2]&65535,(c[j>>2]>>4&65535)<<16>>16)|0)>>16)|0;d=d+(_(c[(c[h>>2]|0)+(c[o>>2]<<2)>>2]|0,(c[j>>2]>>4>>15)+1>>1)|0)|0}}else d=32767;c[(c[g>>2]|0)+(c[n>>2]<<2)>>2]=(d&65535)<<16>>16;c[n>>2]=(c[n>>2]|0)+1}c[c[l>>2]>>2]=d;i=q;return}function Dd(b,d,e,f,g,h){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;s=i;i=i+48|0;j=s+40|0;v=s+36|0;k=s+32|0;t=s+28|0;u=s+24|0;l=s+20|0;m=s+16|0;p=s+12|0;q=s+8|0;n=s+44|0;r=s+4|0;o=s;c[j>>2]=b;c[v>>2]=d;c[k>>2]=e;c[t>>2]=f;c[u>>2]=g;c[l>>2]=h;a[n+1>>0]=0;c[r>>2]=c[v>>2];c[m>>2]=(((c[u>>2]|0)+(c[t>>2]<<1)&65535)<<16>>16)*7;c[o>>2]=30184+(c[m>>2]|0);c[k>>2]=(c[k>>2]|0)+8>>4;c[m>>2]=0;while(1){if((c[m>>2]|0)>=(c[k>>2]|0))break;c[q>>2]=c[(c[l>>2]|0)+(c[m>>2]<<2)>>2];a:do if((c[q>>2]|0)>0){a[n>>0]=a[(c[o>>2]|0)+((c[q>>2]&31|0)<6?c[q>>2]&31:6)>>0]|0;c[p>>2]=0;while(1){if((c[p>>2]|0)>=16)break a;if(a[(c[r>>2]|0)+(c[p>>2]|0)>>0]|0)qc(c[j>>2]|0,(a[(c[r>>2]|0)+(c[p>>2]|0)>>0]>>15)+1|0,n,8);c[p>>2]=(c[p>>2]|0)+1}}while(0);c[r>>2]=(c[r>>2]|0)+16;c[m>>2]=(c[m>>2]|0)+1}i=s;return}function Ed(d,e,f,g,h,j){d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;t=i;i=i+48|0;k=t+40|0;w=t+36|0;l=t+32|0;u=t+28|0;v=t+24|0;m=t+20|0;n=t+16|0;q=t+12|0;r=t+8|0;o=t+44|0;s=t+4|0;p=t;c[k>>2]=d;c[w>>2]=e;c[l>>2]=f;c[u>>2]=g;c[v>>2]=h;c[m>>2]=j;a[o+1>>0]=0;c[s>>2]=c[w>>2];c[n>>2]=(((c[v>>2]|0)+(c[u>>2]<<1)&65535)<<16>>16)*7;c[p>>2]=30184+(c[n>>2]|0);c[l>>2]=(c[l>>2]|0)+8>>4;c[n>>2]=0;while(1){if((c[n>>2]|0)>=(c[l>>2]|0))break;c[r>>2]=c[(c[m>>2]|0)+(c[n>>2]<<2)>>2];a:do if((c[r>>2]|0)>0){a[o>>0]=a[(c[p>>2]|0)+((c[r>>2]&31|0)<6?c[r>>2]&31:6)>>0]|0;c[q>>2]=0;while(1){if((c[q>>2]|0)>=16)break a;if((b[(c[s>>2]|0)+(c[q>>2]<<1)>>1]|0)>0){v=((ec(c[k>>2]|0,o,8)|0)<<1)-1|0;w=(c[s>>2]|0)+(c[q>>2]<<1)|0;b[w>>1]=_(b[w>>1]|0,v)|0}c[q>>2]=(c[q>>2]|0)+1}}while(0);c[s>>2]=(c[s>>2]|0)+32;c[n>>2]=(c[n>>2]|0)+1}i=t;return}function Fd(a){a=a|0;var b=0,d=0;b=i;i=i+16|0;d=b;c[d>>2]=a;oj(c[d>>2]|0,0,4260)|0;c[(c[d>>2]|0)+2376>>2]=1;c[c[d>>2]>>2]=65536;wd(c[d>>2]|0);ze(c[d>>2]|0);i=b;return 0}function Gd(d,e,f,g,h){d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0;M=i;i=i+144|0;o=M+100|0;p=M+96|0;q=M+92|0;l=M+88|0;r=M+84|0;B=M+80|0;D=M+76|0;E=M+72|0;L=M+68|0;J=M+64|0;z=M+60|0;K=M+56|0;t=M+52|0;v=M+48|0;I=M+44|0;u=M+104|0;y=M+40|0;x=M+36|0;w=M+32|0;C=M+28|0;A=M+24|0;n=M+20|0;m=M+16|0;G=M+12|0;F=M+8|0;H=M+4|0;s=M;c[o>>2]=d;c[p>>2]=e;c[q>>2]=f;c[l>>2]=g;c[r>>2]=h;c[E>>2]=0;f=c[(c[o>>2]|0)+2336>>2]|0;c[s>>2]=ia()|0;g=i;i=i+((1*(f<<1)|0)+15&-16)|0;f=i;i=i+((1*((c[(c[o>>2]|0)+2336>>2]|0)+(c[(c[o>>2]|0)+2328>>2]|0)<<2)|0)+15&-16)|0;j=i;i=i+((1*(c[(c[o>>2]|0)+2332>>2]<<2)|0)+15&-16)|0;k=i;i=i+((1*((c[(c[o>>2]|0)+2332>>2]|0)+16<<2)|0)+15&-16)|0;c[m>>2]=b[24558+(a[(c[o>>2]|0)+2736+29>>0]>>1<<2)+(a[(c[o>>2]|0)+2736+30>>0]<<1)>>1];if((a[(c[o>>2]|0)+2736+31>>0]|0)<4)c[z>>2]=1;else c[z>>2]=0;c[n>>2]=a[(c[o>>2]|0)+2736+34>>0];c[B>>2]=0;while(1){if((c[B>>2]|0)>=(c[(c[o>>2]|0)+2328>>2]|0))break;c[n>>2]=907633515+(_(c[n>>2]|0,196314165)|0);c[(c[o>>2]|0)+4+(c[B>>2]<<2)>>2]=b[(c[l>>2]|0)+(c[B>>2]<<1)>>1]<<14;h=(c[o>>2]|0)+4+(c[B>>2]<<2)|0;d=c[h>>2]|0;if((c[(c[o>>2]|0)+4+(c[B>>2]<<2)>>2]|0)<=0){if((d|0)<0){e=(c[o>>2]|0)+4+(c[B>>2]<<2)|0;c[e>>2]=(c[e>>2]|0)+1280}}else c[h>>2]=d-1280;e=(c[o>>2]|0)+4+(c[B>>2]<<2)|0;c[e>>2]=(c[e>>2]|0)+(c[m>>2]<<4);if((c[n>>2]|0)<0)c[(c[o>>2]|0)+4+(c[B>>2]<<2)>>2]=0-(c[(c[o>>2]|0)+4+(c[B>>2]<<2)>>2]|0);c[n>>2]=(c[n>>2]|0)+(b[(c[l>>2]|0)+(c[B>>2]<<1)>>1]|0);c[B>>2]=(c[B>>2]|0)+1}h=k;d=(c[o>>2]|0)+1284|0;e=h+64|0;do{c[h>>2]=c[d>>2];h=h+4|0;d=d+4|0}while((h|0)<(e|0));c[F>>2]=(c[o>>2]|0)+4;c[I>>2]=c[q>>2];c[J>>2]=c[(c[o>>2]|0)+2336>>2];c[D>>2]=0;while(1){if((c[D>>2]|0)>=(c[(c[o>>2]|0)+2324>>2]|0))break;c[H>>2]=j;c[t>>2]=(c[p>>2]|0)+32+(c[D>>2]>>1<<5);pj(u|0,c[t>>2]|0,c[(c[o>>2]|0)+2340>>2]<<1|0)|0;c[v>>2]=(c[p>>2]|0)+96+((c[D>>2]|0)*5<<1);c[K>>2]=a[(c[o>>2]|0)+2736+29>>0];c[w>>2]=c[(c[p>>2]|0)+16+(c[D>>2]<<2)>>2]>>6;c[C>>2]=Hd(c[(c[p>>2]|0)+16+(c[D>>2]<<2)>>2]|0,47)|0;a:do if((c[(c[p>>2]|0)+16+(c[D>>2]<<2)>>2]|0)!=(c[c[o>>2]>>2]|0)){c[A>>2]=Jd(c[c[o>>2]>>2]|0,c[(c[p>>2]|0)+16+(c[D>>2]<<2)>>2]|0,16)|0;c[B>>2]=0;while(1){if((c[B>>2]|0)>=16)break a;n=_(c[A>>2]>>16,(c[k+(c[B>>2]<<2)>>2]&65535)<<16>>16)|0;n=n+((_(c[A>>2]&65535,(c[k+(c[B>>2]<<2)>>2]&65535)<<16>>16)|0)>>16)|0;n=n+(_(c[A>>2]|0,(c[k+(c[B>>2]<<2)>>2]>>15)+1>>1)|0)|0;c[k+(c[B>>2]<<2)>>2]=n;c[B>>2]=(c[B>>2]|0)+1}}else c[A>>2]=65536;while(0);c[c[o>>2]>>2]=c[(c[p>>2]|0)+16+(c[D>>2]<<2)>>2];if((c[(c[o>>2]|0)+4160>>2]|0?(c[(c[o>>2]|0)+4164>>2]|0)==2:0)?((c[D>>2]|0)<2?(a[(c[o>>2]|0)+2736+29>>0]|0)!=2:0):0){n=c[v>>2]|0;b[n>>1]=0;b[n+2>>1]=0;b[n+4>>1]=0;b[n+6>>1]=0;b[n+8>>1]=0;b[(c[v>>2]|0)+4>>1]=4096;c[K>>2]=2;c[(c[p>>2]|0)+(c[D>>2]<<2)>>2]=c[(c[o>>2]|0)+2308>>2]}b:do if((c[K>>2]|0)==2){c[E>>2]=c[(c[p>>2]|0)+(c[D>>2]<<2)>>2];if(c[D>>2]|0?!((c[D>>2]|0)==2&(c[z>>2]|0)!=0):0){if((c[A>>2]|0)==65536)break;c[B>>2]=0;while(1){if((c[B>>2]|0)>=((c[E>>2]|0)+2|0))break b;n=_(c[A>>2]>>16,(c[f+((c[J>>2]|0)-(c[B>>2]|0)-1<<2)>>2]&65535)<<16>>16)|0;n=n+((_(c[A>>2]&65535,(c[f+((c[J>>2]|0)-(c[B>>2]|0)-1<<2)>>2]&65535)<<16>>16)|0)>>16)|0;n=n+(_(c[A>>2]|0,(c[f+((c[J>>2]|0)-(c[B>>2]|0)-1<<2)>>2]>>15)+1>>1)|0)|0;c[f+((c[J>>2]|0)-(c[B>>2]|0)-1<<2)>>2]=n;c[B>>2]=(c[B>>2]|0)+1}}c[L>>2]=(c[(c[o>>2]|0)+2336>>2]|0)-(c[E>>2]|0)-(c[(c[o>>2]|0)+2340>>2]|0)-2;if((c[D>>2]|0)==2)pj((c[o>>2]|0)+1348+(c[(c[o>>2]|0)+2336>>2]<<1)|0,c[q>>2]|0,c[(c[o>>2]|0)+2332>>2]<<1<<1|0)|0;n=(c[L>>2]|0)+(_(c[D>>2]|0,c[(c[o>>2]|0)+2332>>2]|0)|0)|0;Xf(g+(c[L>>2]<<1)|0,(c[o>>2]|0)+1348+(n<<1)|0,c[t>>2]|0,(c[(c[o>>2]|0)+2336>>2]|0)-(c[L>>2]|0)|0,c[(c[o>>2]|0)+2340>>2]|0,c[r>>2]|0);if(!(c[D>>2]|0)){n=_(c[C>>2]>>16,(c[(c[p>>2]|0)+136>>2]&65535)<<16>>16)|0;c[C>>2]=n+((_(c[C>>2]&65535,(c[(c[p>>2]|0)+136>>2]&65535)<<16>>16)|0)>>16)<<2}c[B>>2]=0;while(1){if((c[B>>2]|0)>=((c[E>>2]|0)+2|0))break b;n=_(c[C>>2]>>16,b[g+((c[(c[o>>2]|0)+2336>>2]|0)-(c[B>>2]|0)-1<<1)>>1]|0)|0;n=n+((_(c[C>>2]&65535,b[g+((c[(c[o>>2]|0)+2336>>2]|0)-(c[B>>2]|0)-1<<1)>>1]|0)|0)>>16)|0;c[f+((c[J>>2]|0)-(c[B>>2]|0)-1<<2)>>2]=n;c[B>>2]=(c[B>>2]|0)+1}}while(0);c:do if((c[K>>2]|0)==2){c[G>>2]=f+((c[J>>2]|0)-(c[E>>2]|0)+2<<2);c[B>>2]=0;while(1){if((c[B>>2]|0)>=(c[(c[o>>2]|0)+2332>>2]|0))break c;c[y>>2]=2;n=_(c[c[G>>2]>>2]>>16,b[c[v>>2]>>1]|0)|0;c[y>>2]=(c[y>>2]|0)+(n+((_(c[c[G>>2]>>2]&65535,b[c[v>>2]>>1]|0)|0)>>16));n=_(c[(c[G>>2]|0)+-4>>2]>>16,b[(c[v>>2]|0)+2>>1]|0)|0;c[y>>2]=(c[y>>2]|0)+(n+((_(c[(c[G>>2]|0)+-4>>2]&65535,b[(c[v>>2]|0)+2>>1]|0)|0)>>16));n=_(c[(c[G>>2]|0)+-8>>2]>>16,b[(c[v>>2]|0)+4>>1]|0)|0;c[y>>2]=(c[y>>2]|0)+(n+((_(c[(c[G>>2]|0)+-8>>2]&65535,b[(c[v>>2]|0)+4>>1]|0)|0)>>16));n=_(c[(c[G>>2]|0)+-12>>2]>>16,b[(c[v>>2]|0)+6>>1]|0)|0;c[y>>2]=(c[y>>2]|0)+(n+((_(c[(c[G>>2]|0)+-12>>2]&65535,b[(c[v>>2]|0)+6>>1]|0)|0)>>16));n=_(c[(c[G>>2]|0)+-16>>2]>>16,b[(c[v>>2]|0)+8>>1]|0)|0;c[y>>2]=(c[y>>2]|0)+(n+((_(c[(c[G>>2]|0)+-16>>2]&65535,b[(c[v>>2]|0)+8>>1]|0)|0)>>16));c[G>>2]=(c[G>>2]|0)+4;c[(c[H>>2]|0)+(c[B>>2]<<2)>>2]=(c[(c[F>>2]|0)+(c[B>>2]<<2)>>2]|0)+(c[y>>2]<<1);c[f+(c[J>>2]<<2)>>2]=c[(c[H>>2]|0)+(c[B>>2]<<2)>>2]<<1;c[J>>2]=(c[J>>2]|0)+1;c[B>>2]=(c[B>>2]|0)+1}}else c[H>>2]=c[F>>2];while(0);c[B>>2]=0;while(1){if((c[B>>2]|0)>=(c[(c[o>>2]|0)+2332>>2]|0))break;c[x>>2]=c[(c[o>>2]|0)+2340>>2]>>1;n=_(c[k+(16+(c[B>>2]|0)-1<<2)>>2]>>16,b[u>>1]|0)|0;c[x>>2]=(c[x>>2]|0)+(n+((_(c[k+(16+(c[B>>2]|0)-1<<2)>>2]&65535,b[u>>1]|0)|0)>>16));n=_(c[k+(16+(c[B>>2]|0)-2<<2)>>2]>>16,b[u+2>>1]|0)|0;c[x>>2]=(c[x>>2]|0)+(n+((_(c[k+(16+(c[B>>2]|0)-2<<2)>>2]&65535,b[u+2>>1]|0)|0)>>16));n=_(c[k+(16+(c[B>>2]|0)-3<<2)>>2]>>16,b[u+4>>1]|0)|0;c[x>>2]=(c[x>>2]|0)+(n+((_(c[k+(16+(c[B>>2]|0)-3<<2)>>2]&65535,b[u+4>>1]|0)|0)>>16));n=_(c[k+(16+(c[B>>2]|0)-4<<2)>>2]>>16,b[u+6>>1]|0)|0;c[x>>2]=(c[x>>2]|0)+(n+((_(c[k+(16+(c[B>>2]|0)-4<<2)>>2]&65535,b[u+6>>1]|0)|0)>>16));n=_(c[k+(16+(c[B>>2]|0)-5<<2)>>2]>>16,b[u+8>>1]|0)|0;c[x>>2]=(c[x>>2]|0)+(n+((_(c[k+(16+(c[B>>2]|0)-5<<2)>>2]&65535,b[u+8>>1]|0)|0)>>16));n=_(c[k+(16+(c[B>>2]|0)-6<<2)>>2]>>16,b[u+10>>1]|0)|0;c[x>>2]=(c[x>>2]|0)+(n+((_(c[k+(16+(c[B>>2]|0)-6<<2)>>2]&65535,b[u+10>>1]|0)|0)>>16));n=_(c[k+(16+(c[B>>2]|0)-7<<2)>>2]>>16,b[u+12>>1]|0)|0;c[x>>2]=(c[x>>2]|0)+(n+((_(c[k+(16+(c[B>>2]|0)-7<<2)>>2]&65535,b[u+12>>1]|0)|0)>>16));n=_(c[k+(16+(c[B>>2]|0)-8<<2)>>2]>>16,b[u+14>>1]|0)|0;c[x>>2]=(c[x>>2]|0)+(n+((_(c[k+(16+(c[B>>2]|0)-8<<2)>>2]&65535,b[u+14>>1]|0)|0)>>16));n=_(c[k+(16+(c[B>>2]|0)-9<<2)>>2]>>16,b[u+16>>1]|0)|0;c[x>>2]=(c[x>>2]|0)+(n+((_(c[k+(16+(c[B>>2]|0)-9<<2)>>2]&65535,b[u+16>>1]|0)|0)>>16));n=_(c[k+(16+(c[B>>2]|0)-10<<2)>>2]>>16,b[u+18>>1]|0)|0;c[x>>2]=(c[x>>2]|0)+(n+((_(c[k+(16+(c[B>>2]|0)-10<<2)>>2]&65535,b[u+18>>1]|0)|0)>>16));if((c[(c[o>>2]|0)+2340>>2]|0)==16){n=_(c[k+(16+(c[B>>2]|0)-11<<2)>>2]>>16,b[u+20>>1]|0)|0;c[x>>2]=(c[x>>2]|0)+(n+((_(c[k+(16+(c[B>>2]|0)-11<<2)>>2]&65535,b[u+20>>1]|0)|0)>>16));n=_(c[k+(16+(c[B>>2]|0)-12<<2)>>2]>>16,b[u+22>>1]|0)|0;c[x>>2]=(c[x>>2]|0)+(n+((_(c[k+(16+(c[B>>2]|0)-12<<2)>>2]&65535,b[u+22>>1]|0)|0)>>16));n=_(c[k+(16+(c[B>>2]|0)-13<<2)>>2]>>16,b[u+24>>1]|0)|0;c[x>>2]=(c[x>>2]|0)+(n+((_(c[k+(16+(c[B>>2]|0)-13<<2)>>2]&65535,b[u+24>>1]|0)|0)>>16));n=_(c[k+(16+(c[B>>2]|0)-14<<2)>>2]>>16,b[u+26>>1]|0)|0;c[x>>2]=(c[x>>2]|0)+(n+((_(c[k+(16+(c[B>>2]|0)-14<<2)>>2]&65535,b[u+26>>1]|0)|0)>>16));n=_(c[k+(16+(c[B>>2]|0)-15<<2)>>2]>>16,b[u+28>>1]|0)|0;c[x>>2]=(c[x>>2]|0)+(n+((_(c[k+(16+(c[B>>2]|0)-15<<2)>>2]&65535,b[u+28>>1]|0)|0)>>16));n=_(c[k+(16+(c[B>>2]|0)-16<<2)>>2]>>16,b[u+30>>1]|0)|0;c[x>>2]=(c[x>>2]|0)+(n+((_(c[k+(16+(c[B>>2]|0)-16<<2)>>2]&65535,b[u+30>>1]|0)|0)>>16))}c[k+(16+(c[B>>2]|0)<<2)>>2]=(c[(c[H>>2]|0)+(c[B>>2]<<2)>>2]|0)+(c[x>>2]<<4);n=_(c[k+(16+(c[B>>2]|0)<<2)>>2]>>16,(c[w>>2]&65535)<<16>>16)|0;n=n+((_(c[k+(16+(c[B>>2]|0)<<2)>>2]&65535,(c[w>>2]&65535)<<16>>16)|0)>>16)|0;if(((n+(_(c[k+(16+(c[B>>2]|0)<<2)>>2]|0,(c[w>>2]>>15)+1>>1)|0)>>7)+1>>1|0)<=32767){n=_(c[k+(16+(c[B>>2]|0)<<2)>>2]>>16,(c[w>>2]&65535)<<16>>16)|0;n=n+((_(c[k+(16+(c[B>>2]|0)<<2)>>2]&65535,(c[w>>2]&65535)<<16>>16)|0)>>16)|0;if(((n+(_(c[k+(16+(c[B>>2]|0)<<2)>>2]|0,(c[w>>2]>>15)+1>>1)|0)>>7)+1>>1|0)<-32768)h=-32768;else{h=_(c[k+(16+(c[B>>2]|0)<<2)>>2]>>16,(c[w>>2]&65535)<<16>>16)|0;h=h+((_(c[k+(16+(c[B>>2]|0)<<2)>>2]&65535,(c[w>>2]&65535)<<16>>16)|0)>>16)|0;h=(h+(_(c[k+(16+(c[B>>2]|0)<<2)>>2]|0,(c[w>>2]>>15)+1>>1)|0)>>7)+1>>1}}else h=32767;b[(c[I>>2]|0)+(c[B>>2]<<1)>>1]=h;c[B>>2]=(c[B>>2]|0)+1}h=k;d=k+(c[(c[o>>2]|0)+2332>>2]<<2)|0;e=h+64|0;do{c[h>>2]=c[d>>2];h=h+4|0;d=d+4|0}while((h|0)<(e|0));c[F>>2]=(c[F>>2]|0)+(c[(c[o>>2]|0)+2332>>2]<<2);c[I>>2]=(c[I>>2]|0)+(c[(c[o>>2]|0)+2332>>2]<<1);c[D>>2]=(c[D>>2]|0)+1}h=(c[o>>2]|0)+1284|0;d=k;e=h+64|0;do{c[h>>2]=c[d>>2];h=h+4|0;d=d+4|0}while((h|0)<(e|0));na(c[s>>2]|0);i=M;return}function Hd(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;h=i;i=i+48|0;f=h+32|0;n=h+28|0;d=h+24|0;j=h+20|0;g=h+16|0;k=h+12|0;m=h+8|0;l=h+4|0;e=h;c[n>>2]=a;c[d>>2]=b;b=c[n>>2]|0;c[j>>2]=(Id((c[n>>2]|0)>0?b:0-b|0)|0)-1;c[m>>2]=c[n>>2]<<c[j>>2];c[k>>2]=536870911/(c[m>>2]>>16|0)|0;c[e>>2]=c[k>>2]<<16;b=_(c[m>>2]>>16,(c[k>>2]&65535)<<16>>16)|0;c[l>>2]=536870912-(b+((_(c[m>>2]&65535,(c[k>>2]&65535)<<16>>16)|0)>>16))<<3;b=_(c[l>>2]>>16,(c[k>>2]&65535)<<16>>16)|0;b=(c[e>>2]|0)+(b+((_(c[l>>2]&65535,(c[k>>2]&65535)<<16>>16)|0)>>16))|0;c[e>>2]=b+(_(c[l>>2]|0,(c[k>>2]>>15)+1>>1)|0);c[g>>2]=61-(c[j>>2]|0)-(c[d>>2]|0);b=c[g>>2]|0;if((c[g>>2]|0)>0)if((b|0)<32){c[f>>2]=c[e>>2]>>c[g>>2];n=c[f>>2]|0;i=h;return n|0}else{c[f>>2]=0;n=c[f>>2]|0;i=h;return n|0}a=c[e>>2]|0;d=0-(c[g>>2]|0)|0;do if((-2147483648>>0-b|0)>(2147483647>>0-(c[g>>2]|0)|0)){if((a|0)>(-2147483648>>d|0)){b=-2147483648>>0-(c[g>>2]|0);break}if((c[e>>2]|0)<(2147483647>>0-(c[g>>2]|0)|0)){b=2147483647>>0-(c[g>>2]|0);break}else{b=c[e>>2]|0;break}}else{if((a|0)>(2147483647>>d|0)){b=2147483647>>0-(c[g>>2]|0);break}if((c[e>>2]|0)<(-2147483648>>0-(c[g>>2]|0)|0)){b=-2147483648>>0-(c[g>>2]|0);break}else{b=c[e>>2]|0;break}}while(0);c[f>>2]=b<<0-(c[g>>2]|0);n=c[f>>2]|0;i=h;return n|0}function Id(a){a=a|0;var b=0,d=0;d=i;i=i+16|0;b=d;c[b>>2]=a;if(!(c[b>>2]|0)){a=32;i=d;return a|0}a=32-(32-(aa(c[b>>2]|0)|0))|0;i=d;return a|0}function Jd(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;h=i;i=i+48|0;f=h+40|0;q=h+36|0;p=h+32|0;j=h+28|0;l=h+24|0;k=h+20|0;g=h+16|0;m=h+12|0;n=h+8|0;o=h+4|0;e=h;c[q>>2]=a;c[p>>2]=b;c[j>>2]=d;b=c[q>>2]|0;c[l>>2]=(Id((c[q>>2]|0)>0?b:0-b|0)|0)-1;c[n>>2]=c[q>>2]<<c[l>>2];b=c[p>>2]|0;c[k>>2]=(Id((c[p>>2]|0)>0?b:0-b|0)|0)-1;c[o>>2]=c[p>>2]<<c[k>>2];c[m>>2]=536870911/(c[o>>2]>>16|0)|0;b=_(c[n>>2]>>16,(c[m>>2]&65535)<<16>>16)|0;c[e>>2]=b+((_(c[n>>2]&65535,(c[m>>2]&65535)<<16>>16)|0)>>16);b=c[n>>2]|0;a=c[o>>2]|0;d=c[e>>2]|0;d=yj(a|0,((a|0)<0)<<31>>31|0,d|0,((d|0)<0)<<31>>31|0)|0;d=nj(d|0,C|0,32)|0;c[n>>2]=b-(d<<3);d=_(c[n>>2]>>16,(c[m>>2]&65535)<<16>>16)|0;c[e>>2]=(c[e>>2]|0)+(d+((_(c[n>>2]&65535,(c[m>>2]&65535)<<16>>16)|0)>>16));c[g>>2]=29+(c[l>>2]|0)-(c[k>>2]|0)-(c[j>>2]|0);d=c[g>>2]|0;if((c[g>>2]|0)>=0)if((d|0)<32){c[f>>2]=c[e>>2]>>c[g>>2];q=c[f>>2]|0;i=h;return q|0}else{c[f>>2]=0;q=c[f>>2]|0;i=h;return q|0}a=c[e>>2]|0;b=0-(c[g>>2]|0)|0;do if((-2147483648>>0-d|0)>(2147483647>>0-(c[g>>2]|0)|0)){if((a|0)>(-2147483648>>b|0)){d=-2147483648>>0-(c[g>>2]|0);break}if((c[e>>2]|0)<(2147483647>>0-(c[g>>2]|0)|0)){d=2147483647>>0-(c[g>>2]|0);break}else{d=c[e>>2]|0;break}}else{if((a|0)>(2147483647>>b|0)){d=2147483647>>0-(c[g>>2]|0);break}if((c[e>>2]|0)<(-2147483648>>0-(c[g>>2]|0)|0)){d=-2147483648>>0-(c[g>>2]|0);break}else{d=c[e>>2]|0;break}}while(0);c[f>>2]=d<<0-(c[g>>2]|0);q=c[f>>2]|0;i=h;return q|0}function Kd(b,d,e,f,g,h,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;x=i;i=i+192|0;k=x+180|0;l=x+176|0;m=x+172|0;n=x+168|0;o=x+164|0;p=x+160|0;q=x+156|0;s=x+152|0;t=x+148|0;v=x+144|0;u=x+4|0;r=x;c[k>>2]=b;c[l>>2]=d;c[m>>2]=e;c[n>>2]=f;c[o>>2]=g;c[p>>2]=h;c[q>>2]=j;c[v>>2]=0;c[s>>2]=c[(c[k>>2]|0)+2328>>2];c[u+136>>2]=0;do if(!(c[o>>2]|0))w=4;else{if((c[o>>2]|0)==2?(c[(c[k>>2]|0)+2420+(c[(c[k>>2]|0)+2388>>2]<<2)>>2]|0)==1:0){w=4;break}Ae(c[k>>2]|0,u,c[m>>2]|0,1,c[q>>2]|0)}while(0);if((w|0)==4){d=(c[s>>2]|0)+16-1&-16;c[r>>2]=ia()|0;w=i;i=i+((1*(d<<1)|0)+15&-16)|0;Md(c[k>>2]|0,c[l>>2]|0,c[(c[k>>2]|0)+2388>>2]|0,c[o>>2]|0,c[p>>2]|0);Nd(c[l>>2]|0,w,a[(c[k>>2]|0)+2736+29>>0]|0,a[(c[k>>2]|0)+2736+30>>0]|0,c[(c[k>>2]|0)+2328>>2]|0);Ld(c[k>>2]|0,u,c[p>>2]|0);Gd(c[k>>2]|0,u,c[m>>2]|0,w,c[q>>2]|0);Ae(c[k>>2]|0,u,c[m>>2]|0,0,c[q>>2]|0);c[(c[k>>2]|0)+4160>>2]=0;c[(c[k>>2]|0)+4164>>2]=a[(c[k>>2]|0)+2736+29>>0];c[(c[k>>2]|0)+2376>>2]=0;na(c[r>>2]|0)}c[t>>2]=(c[(c[k>>2]|0)+2336>>2]|0)-(c[(c[k>>2]|0)+2328>>2]|0);qj((c[k>>2]|0)+1348|0,(c[k>>2]|0)+1348+(c[(c[k>>2]|0)+2328>>2]<<1)|0,c[t>>2]<<1|0)|0;pj((c[k>>2]|0)+1348+(c[t>>2]<<1)|0,c[m>>2]|0,c[(c[k>>2]|0)+2328>>2]<<1|0)|0;xd(c[k>>2]|0,u,c[m>>2]|0,c[s>>2]|0);Le(c[k>>2]|0,c[m>>2]|0,c[s>>2]|0);c[(c[k>>2]|0)+2308>>2]=c[u+((c[(c[k>>2]|0)+2324>>2]|0)-1<<2)>>2];c[c[n>>2]>>2]=c[s>>2];i=x;return c[v>>2]|0}function Ld(d,e,f){d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;p=i;i=i+96|0;g=p+24|0;h=p+20|0;q=p+16|0;l=p+12|0;m=p+8|0;j=p+4|0;o=p+64|0;n=p+32|0;k=p;c[g>>2]=d;c[h>>2]=e;c[q>>2]=f;ae((c[h>>2]|0)+16|0,(c[g>>2]|0)+2736|0,(c[g>>2]|0)+2312|0,(c[q>>2]|0)==2&1,c[(c[g>>2]|0)+2324>>2]|0);ge(o,(c[g>>2]|0)+2736+8|0,c[(c[g>>2]|0)+2732>>2]|0);ag((c[h>>2]|0)+32+32|0,o,c[(c[g>>2]|0)+2340>>2]|0);if((c[(c[g>>2]|0)+2376>>2]|0)==1)a[(c[g>>2]|0)+2736+31>>0]=4;if((a[(c[g>>2]|0)+2736+31>>0]|0)<4){c[l>>2]=0;while(1){if((c[l>>2]|0)>=(c[(c[g>>2]|0)+2340>>2]|0))break;q=(b[(c[g>>2]|0)+2344+(c[l>>2]<<1)>>1]|0)+((_(a[(c[g>>2]|0)+2736+31>>0]|0,(b[o+(c[l>>2]<<1)>>1]|0)-(b[(c[g>>2]|0)+2344+(c[l>>2]<<1)>>1]|0)|0)|0)>>2)&65535;b[n+(c[l>>2]<<1)>>1]=q;c[l>>2]=(c[l>>2]|0)+1}ag((c[h>>2]|0)+32|0,n,c[(c[g>>2]|0)+2340>>2]|0)}else pj((c[h>>2]|0)+32|0,(c[h>>2]|0)+32+32|0,c[(c[g>>2]|0)+2340>>2]<<1|0)|0;pj((c[g>>2]|0)+2344|0,o|0,c[(c[g>>2]|0)+2340>>2]<<1|0)|0;if(c[(c[g>>2]|0)+4160>>2]|0){Pf((c[h>>2]|0)+32|0,c[(c[g>>2]|0)+2340>>2]|0,63570);Pf((c[h>>2]|0)+32+32|0,c[(c[g>>2]|0)+2340>>2]|0,63570)}if((a[(c[g>>2]|0)+2736+29>>0]|0)!=2){oj(c[h>>2]|0,0,c[(c[g>>2]|0)+2324>>2]<<2|0)|0;oj((c[h>>2]|0)+96|0,0,(c[(c[g>>2]|0)+2324>>2]|0)*5<<1|0)|0;a[(c[g>>2]|0)+2736+32>>0]=0;c[(c[h>>2]|0)+136>>2]=0;i=p;return}Qf(b[(c[g>>2]|0)+2736+26>>1]|0,a[(c[g>>2]|0)+2736+28>>0]|0,c[h>>2]|0,c[(c[g>>2]|0)+2316>>2]|0,c[(c[g>>2]|0)+2324>>2]|0);c[k>>2]=c[17644+(a[(c[g>>2]|0)+2736+32>>0]<<2)>>2];c[m>>2]=0;while(1){if((c[m>>2]|0)>=(c[(c[g>>2]|0)+2324>>2]|0))break;c[j>>2]=a[(c[g>>2]|0)+2736+4+(c[m>>2]|0)>>0];c[l>>2]=0;while(1){if((c[l>>2]|0)>=5)break;b[(c[h>>2]|0)+96+(((c[m>>2]|0)*5|0)+(c[l>>2]|0)<<1)>>1]=a[(c[k>>2]|0)+(((c[j>>2]|0)*5|0)+(c[l>>2]|0))>>0]<<7;c[l>>2]=(c[l>>2]|0)+1}c[m>>2]=(c[m>>2]|0)+1}c[j>>2]=a[(c[g>>2]|0)+2736+33>>0];c[(c[h>>2]|0)+136>>2]=b[24566+(c[j>>2]<<1)>>1];i=p;return}function Md(d,e,f,g,h){d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;t=i;i=i+96|0;j=t+36|0;k=t+32|0;u=t+28|0;v=t+24|0;l=t+20|0;q=t+16|0;r=t+12|0;m=t+8|0;n=t+4|0;o=t;p=t+40|0;s=t+72|0;c[j>>2]=d;c[k>>2]=e;c[u>>2]=f;c[v>>2]=g;c[l>>2]=h;if(!(c[v>>2]|0)?!(c[(c[j>>2]|0)+2404+(c[u>>2]<<2)>>2]|0):0)c[m>>2]=ec(c[k>>2]|0,29024,8)|0;else c[m>>2]=(ec(c[k>>2]|0,29020,8)|0)+2;a[(c[j>>2]|0)+2736+29>>0]=c[m>>2]>>1;a[(c[j>>2]|0)+2736+30>>0]=c[m>>2]&1;f=c[k>>2]|0;if((c[l>>2]|0)==2){v=(ec(f,26771,8)|0)&255;a[(c[j>>2]|0)+2736>>0]=v}else{u=(ec(f,26747+(a[(c[j>>2]|0)+2736+29>>0]<<3)|0,8)|0)<<3&255;a[(c[j>>2]|0)+2736>>0]=u;u=((ec(c[k>>2]|0,29049,8)|0)&255)<<24>>24;v=(c[j>>2]|0)+2736|0;a[v>>0]=(a[v>>0]|0)+u}c[q>>2]=1;while(1){f=c[k>>2]|0;if((c[q>>2]|0)>=(c[(c[j>>2]|0)+2324>>2]|0))break;v=(ec(f,26771,8)|0)&255;a[(c[j>>2]|0)+2736+(c[q>>2]|0)>>0]=v;c[q>>2]=(c[q>>2]|0)+1}v=_(a[(c[j>>2]|0)+2736+29>>0]>>1,b[c[(c[j>>2]|0)+2732>>2]>>1]|0)|0;v=(ec(f,(c[(c[(c[j>>2]|0)+2732>>2]|0)+12>>2]|0)+v|0,8)|0)&255;a[(c[j>>2]|0)+2736+8>>0]=v;nf(p,s,c[(c[j>>2]|0)+2732>>2]|0,a[(c[j>>2]|0)+2736+8>>0]|0);c[q>>2]=0;while(1){if((c[q>>2]|0)>=(b[(c[(c[j>>2]|0)+2732>>2]|0)+2>>1]|0))break;c[m>>2]=ec(c[k>>2]|0,(c[(c[(c[j>>2]|0)+2732>>2]|0)+24>>2]|0)+(b[p+(c[q>>2]<<1)>>1]|0)|0,8)|0;if(c[m>>2]|0){if((c[m>>2]|0)==8){v=ec(c[k>>2]|0,29057,8)|0;c[m>>2]=(c[m>>2]|0)+v}}else{v=ec(c[k>>2]|0,29057,8)|0;c[m>>2]=(c[m>>2]|0)-v}a[(c[j>>2]|0)+2736+8+((c[q>>2]|0)+1)>>0]=(c[m>>2]|0)-4;c[q>>2]=(c[q>>2]|0)+1}if((c[(c[j>>2]|0)+2324>>2]|0)==4){v=(ec(c[k>>2]|0,29026,8)|0)&255;a[(c[j>>2]|0)+2736+31>>0]=v}else a[(c[j>>2]|0)+2736+31>>0]=4;if((a[(c[j>>2]|0)+2736+29>>0]|0)!=2){v=c[j>>2]|0;v=v+2736|0;v=v+29|0;v=a[v>>0]|0;v=v<<24>>24;u=c[j>>2]|0;u=u+2396|0;c[u>>2]=v;u=c[k>>2]|0;u=ec(u,29034,8)|0;u=u&255;v=c[j>>2]|0;v=v+2736|0;v=v+34|0;a[v>>0]=u;i=t;return}c[n>>2]=1;if(((c[l>>2]|0)==2?(c[(c[j>>2]|0)+2396>>2]|0)==2:0)?(c[o>>2]=((ec(c[k>>2]|0,29096,8)|0)&65535)<<16>>16,(c[o>>2]|0)>0):0){c[o>>2]=(c[o>>2]|0)-9;b[(c[j>>2]|0)+2736+26>>1]=(b[(c[j>>2]|0)+2400>>1]|0)+(c[o>>2]|0);c[n>>2]=0}if(c[n>>2]|0){u=((ec(c[k>>2]|0,29064,8)|0)&65535)<<16>>16;u=(_(u,c[(c[j>>2]|0)+2316>>2]>>1)|0)&65535;b[(c[j>>2]|0)+2736+26>>1]=u;u=((ec(c[k>>2]|0,c[(c[j>>2]|0)+2380>>2]|0,8)|0)&65535)<<16>>16;v=(c[j>>2]|0)+2736+26|0;b[v>>1]=(b[v>>1]|0)+u}b[(c[j>>2]|0)+2400>>1]=b[(c[j>>2]|0)+2736+26>>1]|0;v=(ec(c[k>>2]|0,c[(c[j>>2]|0)+2384>>2]|0,8)|0)&255;a[(c[j>>2]|0)+2736+28>>0]=v;v=(ec(c[k>>2]|0,26812,8)|0)&255;a[(c[j>>2]|0)+2736+32>>0]=v;c[r>>2]=0;while(1){if((c[r>>2]|0)>=(c[(c[j>>2]|0)+2324>>2]|0))break;v=(ec(c[k>>2]|0,c[17620+(a[(c[j>>2]|0)+2736+32>>0]<<2)>>2]|0,8)|0)&255;a[(c[j>>2]|0)+2736+4+(c[r>>2]|0)>>0]=v;c[r>>2]=(c[r>>2]|0)+1}if(!(c[l>>2]|0)){v=(ec(c[k>>2]|0,29017,8)|0)&255;a[(c[j>>2]|0)+2736+33>>0]=v;v=c[j>>2]|0;v=v+2736|0;v=v+29|0;v=a[v>>0]|0;v=v<<24>>24;u=c[j>>2]|0;u=u+2396|0;c[u>>2]=v;u=c[k>>2]|0;u=ec(u,29034,8)|0;u=u&255;v=c[j>>2]|0;v=v+2736|0;v=v+34|0;a[v>>0]=u;i=t;return}else{a[(c[j>>2]|0)+2736+33>>0]=0;v=c[j>>2]|0;v=v+2736|0;v=v+29|0;v=a[v>>0]|0;v=v<<24>>24;u=c[j>>2]|0;u=u+2396|0;c[u>>2]=v;u=c[k>>2]|0;u=ec(u,29034,8)|0;u=u&255;v=c[j>>2]|0;v=v+2736|0;v=v+34|0;a[v>>0]=u;i=t;return}}function Nd(a,d,e,f,g){a=a|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;y=i;i=i+224|0;k=y+212|0;l=y+208|0;m=y+204|0;n=y+200|0;o=y+196|0;q=y+192|0;s=y+188|0;t=y+184|0;r=y+180|0;p=y+176|0;u=y+172|0;h=y+168|0;x=y+88|0;v=y+8|0;w=y+4|0;j=y;c[k>>2]=a;c[l>>2]=d;c[m>>2]=e;c[n>>2]=f;c[o>>2]=g;c[h>>2]=ec(c[k>>2]|0,29523+((c[m>>2]>>1)*9|0)|0,8)|0;c[r>>2]=c[o>>2]>>4;if((c[r>>2]<<4|0)<(c[o>>2]|0))c[r>>2]=(c[r>>2]|0)+1;c[j>>2]=29181+((c[h>>2]|0)*18|0);c[q>>2]=0;while(1){if((c[q>>2]|0)>=(c[r>>2]|0))break;c[v+(c[q>>2]<<2)>>2]=0;e=ec(c[k>>2]|0,c[j>>2]|0,8)|0;c[x+(c[q>>2]<<2)>>2]=e;while(1){h=c[q>>2]|0;if((c[x+(c[q>>2]<<2)>>2]|0)!=17)break;e=v+(h<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=ec(c[k>>2]|0,29343+((c[v+(c[q>>2]<<2)>>2]|0)==10&1)|0,8)|0;c[x+(c[q>>2]<<2)>>2]=e}c[q>>2]=h+1}c[q>>2]=0;while(1){if((c[q>>2]|0)>=(c[r>>2]|0))break;h=(c[l>>2]|0)+((c[q>>2]&65535)<<16>>16<<4<<1)|0;if((c[x+(c[q>>2]<<2)>>2]|0)>0)Se(h,c[k>>2]|0,c[x+(c[q>>2]<<2)>>2]|0);else{g=h+32|0;do{b[h>>1]=0;h=h+2|0}while((h|0)<(g|0))}c[q>>2]=(c[q>>2]|0)+1}c[q>>2]=0;while(1){if((c[q>>2]|0)>=(c[r>>2]|0))break;if((c[v+(c[q>>2]<<2)>>2]|0)>0){c[u>>2]=c[v+(c[q>>2]<<2)>>2];c[w>>2]=(c[l>>2]|0)+((c[q>>2]&65535)<<16>>16<<4<<1);c[t>>2]=0;while(1){if((c[t>>2]|0)>=16)break;c[p>>2]=b[(c[w>>2]|0)+(c[t>>2]<<1)>>1];c[s>>2]=0;while(1){h=c[p>>2]|0;if((c[s>>2]|0)>=(c[u>>2]|0))break;c[p>>2]=h<<1;j=ec(c[k>>2]|0,29015,8)|0;c[p>>2]=(c[p>>2]|0)+j;c[s>>2]=(c[s>>2]|0)+1}b[(c[w>>2]|0)+(c[t>>2]<<1)>>1]=h;c[t>>2]=(c[t>>2]|0)+1}j=x+(c[q>>2]<<2)|0;c[j>>2]=c[j>>2]|c[u>>2]<<5}c[q>>2]=(c[q>>2]|0)+1}Ed(c[k>>2]|0,c[l>>2]|0,c[o>>2]|0,c[m>>2]|0,c[n>>2]|0,x);i=y;return}function Od(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0;l=i;i=i+32|0;g=l+16|0;h=l+12|0;f=l+8|0;j=l+4|0;k=l;c[g>>2]=b;c[h>>2]=d;c[f>>2]=e;c[k>>2]=0;c[(c[g>>2]|0)+2332>>2]=((c[h>>2]&65535)<<16>>16)*5;c[j>>2]=_((c[(c[g>>2]|0)+2324>>2]&65535)<<16>>16,(c[(c[g>>2]|0)+2332>>2]&65535)<<16>>16)|0;if(!((c[(c[g>>2]|0)+2316>>2]|0)==(c[h>>2]|0)?(c[(c[g>>2]|0)+2320>>2]|0)==(c[f>>2]|0):0)){b=ig((c[g>>2]|0)+2432|0,((c[h>>2]&65535)<<16>>16)*1e3|0,c[f>>2]|0,0)|0;c[k>>2]=(c[k>>2]|0)+b;c[(c[g>>2]|0)+2320>>2]=c[f>>2]}if((c[(c[g>>2]|0)+2316>>2]|0)==(c[h>>2]|0)?(c[j>>2]|0)==(c[(c[g>>2]|0)+2328>>2]|0):0){k=c[k>>2]|0;i=l;return k|0}f=(c[(c[g>>2]|0)+2324>>2]|0)==4;e=(c[g>>2]|0)+2384|0;do if((c[h>>2]|0)==8)if(f){c[e>>2]=29151;break}else{c[e>>2]=29174;break}else if(f){c[e>>2]=29117;break}else{c[e>>2]=29162;break}while(0);if((c[(c[g>>2]|0)+2316>>2]|0)!=(c[h>>2]|0)){c[(c[g>>2]|0)+2336>>2]=((c[h>>2]&65535)<<16>>16)*20;f=(c[g>>2]|0)+2340|0;if((c[h>>2]|0)==8|(c[h>>2]|0)==12){c[f>>2]=10;c[(c[g>>2]|0)+2732>>2]=17668}else{c[f>>2]=16;c[(c[g>>2]|0)+2732>>2]=17704}do if((c[h>>2]|0)!=16){if((c[h>>2]|0)==12){c[(c[g>>2]|0)+2380>>2]=29043;break}if((c[h>>2]|0)==8)c[(c[g>>2]|0)+2380>>2]=29034}else c[(c[g>>2]|0)+2380>>2]=29049;while(0);c[(c[g>>2]|0)+2376>>2]=1;c[(c[g>>2]|0)+2308>>2]=100;a[(c[g>>2]|0)+2312>>0]=10;c[(c[g>>2]|0)+4164>>2]=0;oj((c[g>>2]|0)+1348|0,0,960)|0;f=(c[g>>2]|0)+1284|0;e=f+64|0;do{c[f>>2]=0;f=f+4|0}while((f|0)<(e|0))}c[(c[g>>2]|0)+2316>>2]=c[h>>2];c[(c[g>>2]|0)+2328>>2]=c[j>>2];k=c[k>>2]|0;i=l;return k|0}function Pd(a){a=a|0;var b=0,d=0,e=0;d=i;i=i+16|0;e=d+4|0;b=d;c[e>>2]=a;c[b>>2]=0;c[c[e>>2]>>2]=8544;i=d;return c[b>>2]|0}function Qd(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;g=i;i=i+16|0;b=g+12|0;e=g+8|0;f=g+4|0;d=g;c[b>>2]=a;c[f>>2]=0;c[d>>2]=c[b>>2];c[e>>2]=0;while(1){if((c[e>>2]|0)>=2)break;c[f>>2]=Fd((c[d>>2]|0)+((c[e>>2]|0)*4260|0)|0)|0;c[e>>2]=(c[e>>2]|0)+1}e=(c[b>>2]|0)+8520|0;c[e>>2]=0;c[e+4>>2]=0;c[e+8>>2]=0;c[(c[b>>2]|0)+8540>>2]=0;i=g;return c[f>>2]|0}function Rd(d,e,f,g,h,j,k,l){d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|0;var m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0;P=i;i=i+784|0;y=P+128|0;R=P+124|0;z=P+120|0;A=P+116|0;Q=P+112|0;r=P+108|0;B=P+104|0;C=P+100|0;s=P+96|0;G=P+92|0;I=P+88|0;F=P+84|0;M=P+80|0;J=P+76|0;n=P+72|0;N=P+64|0;u=P+56|0;L=P+52|0;K=P+48|0;E=P+44|0;w=P+40|0;O=P+36|0;x=P+32|0;m=P+28|0;p=P+136|0;o=P+24|0;D=P+20|0;t=P+16|0;v=P+12|0;H=P;c[R>>2]=d;c[z>>2]=e;c[A>>2]=f;c[Q>>2]=g;c[r>>2]=h;c[B>>2]=j;c[C>>2]=k;c[s>>2]=l;c[F>>2]=0;c[M>>2]=0;c[u>>2]=0;c[u+4>>2]=0;c[K>>2]=c[R>>2];c[E>>2]=c[K>>2];a:do if(c[Q>>2]|0){c[I>>2]=0;while(1){if((c[I>>2]|0)>=(c[(c[z>>2]|0)+4>>2]|0))break a;c[(c[E>>2]|0)+((c[I>>2]|0)*4260|0)+2388>>2]=0;c[I>>2]=(c[I>>2]|0)+1}}while(0);if((c[(c[z>>2]|0)+4>>2]|0)>(c[(c[K>>2]|0)+8536>>2]|0)){R=Fd((c[E>>2]|0)+4260|0)|0;c[M>>2]=(c[M>>2]|0)+R}if((c[(c[z>>2]|0)+4>>2]|0)==1?(c[(c[K>>2]|0)+8536>>2]|0)==2:0)l=(c[(c[z>>2]|0)+12>>2]|0)==((c[(c[E>>2]|0)+2316>>2]|0)*1e3|0);else l=0;c[O>>2]=l&1;b:do if(!(c[(c[E>>2]|0)+2388>>2]|0)){c[I>>2]=0;c:while(1){if((c[I>>2]|0)>=(c[(c[z>>2]|0)+4>>2]|0))break b;do if(!(c[(c[z>>2]|0)+16>>2]|0)){c[(c[E>>2]|0)+((c[I>>2]|0)*4260|0)+2392>>2]=1;c[(c[E>>2]|0)+((c[I>>2]|0)*4260|0)+2324>>2]=2}else{if((c[(c[z>>2]|0)+16>>2]|0)==10){c[(c[E>>2]|0)+((c[I>>2]|0)*4260|0)+2392>>2]=1;c[(c[E>>2]|0)+((c[I>>2]|0)*4260|0)+2324>>2]=2;break}if((c[(c[z>>2]|0)+16>>2]|0)==20){c[(c[E>>2]|0)+((c[I>>2]|0)*4260|0)+2392>>2]=1;c[(c[E>>2]|0)+((c[I>>2]|0)*4260|0)+2324>>2]=4;break}if((c[(c[z>>2]|0)+16>>2]|0)==40){c[(c[E>>2]|0)+((c[I>>2]|0)*4260|0)+2392>>2]=2;c[(c[E>>2]|0)+((c[I>>2]|0)*4260|0)+2324>>2]=4;break}if((c[(c[z>>2]|0)+16>>2]|0)!=60){q=23;break c}c[(c[E>>2]|0)+((c[I>>2]|0)*4260|0)+2392>>2]=3;c[(c[E>>2]|0)+((c[I>>2]|0)*4260|0)+2324>>2]=4}while(0);c[m>>2]=(c[(c[z>>2]|0)+12>>2]>>10)+1;if((c[m>>2]|0)!=8&(c[m>>2]|0)!=12&(c[m>>2]|0)!=16){q=25;break}R=Od((c[E>>2]|0)+((c[I>>2]|0)*4260|0)|0,c[m>>2]|0,c[(c[z>>2]|0)+8>>2]|0)|0;c[M>>2]=(c[M>>2]|0)+R;c[I>>2]=(c[I>>2]|0)+1}if((q|0)==23){c[y>>2]=-203;R=c[y>>2]|0;i=P;return R|0}else if((q|0)==25){c[y>>2]=-200;R=c[y>>2]|0;i=P;return R|0}}while(0);do if((c[c[z>>2]>>2]|0)==2?(c[(c[z>>2]|0)+4>>2]|0)==2:0){if((c[(c[K>>2]|0)+8532>>2]|0)!=1?(c[(c[K>>2]|0)+8536>>2]|0)!=1:0)break;c[(c[K>>2]|0)+8520>>2]=0;c[(c[K>>2]|0)+8520+8>>2]=0;pj((c[E>>2]|0)+4260+2432|0,(c[E>>2]|0)+2432|0,300)|0}while(0);c[(c[K>>2]|0)+8532>>2]=c[c[z>>2]>>2];c[(c[K>>2]|0)+8536>>2]=c[(c[z>>2]|0)+4>>2];if((c[(c[z>>2]|0)+8>>2]|0)<=48e3?(c[(c[z>>2]|0)+8>>2]|0)>=8e3:0){d:do if((c[A>>2]|0)!=1?(c[(c[E>>2]|0)+2388>>2]|0)==0:0){c[I>>2]=0;while(1){if((c[I>>2]|0)>=(c[(c[z>>2]|0)+4>>2]|0))break;c[G>>2]=0;while(1){R=(c[G>>2]|0)<(c[(c[E>>2]|0)+((c[I>>2]|0)*4260|0)+2392>>2]|0);l=dc(c[r>>2]|0,1)|0;if(!R)break;c[(c[E>>2]|0)+((c[I>>2]|0)*4260|0)+2404+(c[G>>2]<<2)>>2]=l;c[G>>2]=(c[G>>2]|0)+1}c[(c[E>>2]|0)+((c[I>>2]|0)*4260|0)+2416>>2]=l;c[I>>2]=(c[I>>2]|0)+1}c[I>>2]=0;while(1){if((c[I>>2]|0)>=(c[(c[z>>2]|0)+4>>2]|0))break;R=(c[E>>2]|0)+((c[I>>2]|0)*4260|0)+2420|0;c[R>>2]=0;c[R+4>>2]=0;c[R+8>>2]=0;e:do if(c[(c[E>>2]|0)+((c[I>>2]|0)*4260|0)+2416>>2]|0){if((c[(c[E>>2]|0)+((c[I>>2]|0)*4260|0)+2392>>2]|0)==1){c[(c[E>>2]|0)+((c[I>>2]|0)*4260|0)+2420>>2]=1;break}c[n>>2]=(ec(c[r>>2]|0,c[17836+((c[(c[E>>2]|0)+((c[I>>2]|0)*4260|0)+2392>>2]|0)-2<<2)>>2]|0,8)|0)+1;c[G>>2]=0;while(1){if((c[G>>2]|0)>=(c[(c[E>>2]|0)+((c[I>>2]|0)*4260|0)+2392>>2]|0))break e;c[(c[E>>2]|0)+((c[I>>2]|0)*4260|0)+2420+(c[G>>2]<<2)>>2]=c[n>>2]>>c[G>>2]&1;c[G>>2]=(c[G>>2]|0)+1}}while(0);c[I>>2]=(c[I>>2]|0)+1}if(!(c[A>>2]|0)){c[G>>2]=0;while(1){if((c[G>>2]|0)>=(c[(c[E>>2]|0)+2392>>2]|0))break d;c[I>>2]=0;while(1){l=c[G>>2]|0;if((c[I>>2]|0)>=(c[(c[z>>2]|0)+4>>2]|0))break;if(c[(c[E>>2]|0)+((c[I>>2]|0)*4260|0)+2420+(l<<2)>>2]|0){do if((c[I>>2]|0)==0?(c[(c[z>>2]|0)+4>>2]|0)==2:0){xg(c[r>>2]|0,u);if(c[(c[E>>2]|0)+4260+2420+(c[G>>2]<<2)>>2]|0)break;yg(c[r>>2]|0,F)}while(0);do if((c[G>>2]|0)>0){if(!(c[(c[E>>2]|0)+((c[I>>2]|0)*4260|0)+2420+((c[G>>2]|0)-1<<2)>>2]|0)){q=64;break}c[o>>2]=2}else q=64;while(0);if((q|0)==64){q=0;c[o>>2]=0}Md((c[E>>2]|0)+((c[I>>2]|0)*4260|0)|0,c[r>>2]|0,c[G>>2]|0,1,c[o>>2]|0);Nd(c[r>>2]|0,p,a[(c[E>>2]|0)+((c[I>>2]|0)*4260|0)+2736+29>>0]|0,a[(c[E>>2]|0)+((c[I>>2]|0)*4260|0)+2736+30>>0]|0,c[(c[E>>2]|0)+((c[I>>2]|0)*4260|0)+2328>>2]|0)}c[I>>2]=(c[I>>2]|0)+1}c[G>>2]=l+1}}}while(0);f:do if((c[(c[z>>2]|0)+4>>2]|0)==2){do if(c[A>>2]|0){if((c[A>>2]|0)==2?(c[(c[E>>2]|0)+2420+(c[(c[E>>2]|0)+2388>>2]<<2)>>2]|0)==1:0)break;c[I>>2]=0;while(1){if((c[I>>2]|0)>=2)break f;c[u+(c[I>>2]<<2)>>2]=b[(c[K>>2]|0)+8520+(c[I>>2]<<1)>>1];c[I>>2]=(c[I>>2]|0)+1}}while(0);xg(c[r>>2]|0,u);if(!((c[A>>2]|0)==0?!(c[(c[E>>2]|0)+4260+2404+(c[(c[E>>2]|0)+2388>>2]<<2)>>2]|0):0))q=74;do if((q|0)==74){if((c[A>>2]|0)==2?(c[(c[E>>2]|0)+4260+2420+(c[(c[E>>2]|0)+2388>>2]<<2)>>2]|0)==0:0)break;c[F>>2]=0;break f}while(0);yg(c[r>>2]|0,F)}while(0);if(((c[F>>2]|0)==0?(c[(c[z>>2]|0)+4>>2]|0)==2:0)?(c[(c[K>>2]|0)+8540>>2]|0)==1:0){oj((c[K>>2]|0)+4260+1348|0,0,960)|0;l=(c[K>>2]|0)+4260+1284|0;e=l+64|0;do{c[l>>2]=0;l=l+4|0}while((l|0)<(e|0));c[(c[K>>2]|0)+4260+2308>>2]=100;a[(c[K>>2]|0)+4260+2312>>0]=10;c[(c[K>>2]|0)+4260+4164>>2]=0;c[(c[K>>2]|0)+4260+2376>>2]=1}R=_(c[(c[z>>2]|0)+12>>2]|0,c[(c[z>>2]|0)+4>>2]|0)|0;c[x>>2]=(R|0)<(_(c[(c[z>>2]|0)+8>>2]|0,c[c[z>>2]>>2]|0)|0)&1;if(c[x>>2]|0)l=1;else l=_(c[(c[z>>2]|0)+4>>2]|0,(c[(c[E>>2]|0)+2328>>2]|0)+2|0)|0;c[D>>2]=ia()|0;e=i;i=i+((1*(l<<1)|0)+15&-16)|0;if(c[x>>2]|0){c[N>>2]=c[B>>2];c[N+4>>2]=(c[B>>2]|0)+(c[(c[E>>2]|0)+2328>>2]<<1)+4}else{c[N>>2]=e;c[N+4>>2]=e+(c[(c[E>>2]|0)+2328>>2]<<1)+4}if(!(c[A>>2]|0))c[w>>2]=((c[F>>2]|0)!=0^1)&1;else{if(c[(c[K>>2]|0)+8540>>2]|0)if((c[A>>2]|0)==2?(c[(c[z>>2]|0)+4>>2]|0)==2:0)l=(c[(c[E>>2]|0)+4260+2420+(c[(c[E>>2]|0)+4260+2388>>2]<<2)>>2]|0)==1;else l=0;else l=1;c[w>>2]=l&1}c[I>>2]=0;while(1){if((c[I>>2]|0)>=(c[(c[z>>2]|0)+4>>2]|0))break;if((c[I>>2]|0)==0|(c[w>>2]|0)!=0){c[t>>2]=(c[(c[E>>2]|0)+2388>>2]|0)-(c[I>>2]|0);g:do if((c[t>>2]|0)<=0)c[v>>2]=0;else{if((c[A>>2]|0)==2){c[v>>2]=c[(c[E>>2]|0)+((c[I>>2]|0)*4260|0)+2420+((c[t>>2]|0)-1<<2)>>2]|0?2:0;break}do if((c[I>>2]|0)>0){if(!(c[(c[K>>2]|0)+8540>>2]|0))break;c[v>>2]=1;break g}while(0);c[v>>2]=2}while(0);R=Kd((c[E>>2]|0)+((c[I>>2]|0)*4260|0)|0,c[r>>2]|0,(c[N+(c[I>>2]<<2)>>2]|0)+4|0,J,c[A>>2]|0,c[v>>2]|0,c[s>>2]|0)|0;c[M>>2]=(c[M>>2]|0)+R}else oj((c[N+(c[I>>2]<<2)>>2]|0)+4|0,0,c[J>>2]<<1|0)|0;R=(c[E>>2]|0)+((c[I>>2]|0)*4260|0)+2388|0;c[R>>2]=(c[R>>2]|0)+1;c[I>>2]=(c[I>>2]|0)+1}if((c[c[z>>2]>>2]|0)==2?(c[(c[z>>2]|0)+4>>2]|0)==2:0)uf((c[K>>2]|0)+8520|0,c[N>>2]|0,c[N+4>>2]|0,u,c[(c[E>>2]|0)+2316>>2]|0,c[J>>2]|0);else{R=c[N>>2]|0;Q=(c[K>>2]|0)+8520+4|0;b[R>>1]=b[Q>>1]|0;b[R+2>>1]=b[Q+2>>1]|0;R=(c[K>>2]|0)+8520+4|0;Q=(c[N>>2]|0)+(c[J>>2]<<1)|0;b[R>>1]=b[Q>>1]|0;b[R+2>>1]=b[Q+2>>1]|0}R=_(c[J>>2]|0,c[(c[z>>2]|0)+8>>2]|0)|0;c[c[C>>2]>>2]=(R|0)/(((c[(c[E>>2]|0)+2316>>2]&65535)<<16>>16)*1e3|0)|0;if((c[c[z>>2]>>2]|0)==2)l=c[c[C>>2]>>2]|0;else l=1;e=i;i=i+((1*(l<<1)|0)+15&-16)|0;if((c[c[z>>2]>>2]|0)==2)c[L>>2]=e;else c[L>>2]=c[B>>2];if(c[x>>2]|0)l=_(c[(c[z>>2]|0)+4>>2]|0,(c[(c[E>>2]|0)+2328>>2]|0)+2|0)|0;else l=1;e=i;i=i+((1*(l<<1)|0)+15&-16)|0;if(c[x>>2]|0){R=(_(c[(c[z>>2]|0)+4>>2]|0,(c[(c[E>>2]|0)+2328>>2]|0)+2|0)|0)<<1;pj(e|0,c[B>>2]|0,R+0|0)|0;c[N>>2]=e;c[N+4>>2]=e+(c[(c[E>>2]|0)+2328>>2]<<1)+4}c[I>>2]=0;while(1){l=c[z>>2]|0;if((c[c[z>>2]>>2]|0)<(c[(c[z>>2]|0)+4>>2]|0))l=c[l>>2]|0;else l=c[l+4>>2]|0;if((c[I>>2]|0)>=(l|0))break;R=jg((c[E>>2]|0)+((c[I>>2]|0)*4260|0)+2432|0,c[L>>2]|0,(c[N+(c[I>>2]<<2)>>2]|0)+2|0,c[J>>2]|0)|0;c[M>>2]=(c[M>>2]|0)+R;h:do if((c[c[z>>2]>>2]|0)==2){c[G>>2]=0;while(1){if((c[G>>2]|0)>=(c[c[C>>2]>>2]|0))break h;b[(c[B>>2]|0)+((c[I>>2]|0)+(c[G>>2]<<1)<<1)>>1]=b[(c[L>>2]|0)+(c[G>>2]<<1)>>1]|0;c[G>>2]=(c[G>>2]|0)+1}}while(0);c[I>>2]=(c[I>>2]|0)+1}i:do if((c[c[z>>2]>>2]|0)==2){if((c[(c[z>>2]|0)+4>>2]|0)!=1)break;if(c[O>>2]|0){R=jg((c[E>>2]|0)+4260+2432|0,c[L>>2]|0,(c[N>>2]|0)+2|0,c[J>>2]|0)|0;c[M>>2]=(c[M>>2]|0)+R;c[G>>2]=0;while(1){if((c[G>>2]|0)>=(c[c[C>>2]>>2]|0))break i;b[(c[B>>2]|0)+(1+(c[G>>2]<<1)<<1)>>1]=b[(c[L>>2]|0)+(c[G>>2]<<1)>>1]|0;c[G>>2]=(c[G>>2]|0)+1}}else{c[G>>2]=0;while(1){if((c[G>>2]|0)>=(c[c[C>>2]>>2]|0))break i;b[(c[B>>2]|0)+(1+(c[G>>2]<<1)<<1)>>1]=b[(c[B>>2]|0)+(0+(c[G>>2]<<1)<<1)>>1]|0;c[G>>2]=(c[G>>2]|0)+1}}}while(0);if((c[(c[E>>2]|0)+4164>>2]|0)==2){c[H>>2]=c[4402];c[H+4>>2]=c[4403];c[H+8>>2]=c[4404];R=_(c[(c[E>>2]|0)+2308>>2]|0,c[H+((c[(c[E>>2]|0)+2316>>2]|0)-8>>2<<2)>>2]|0)|0;c[(c[z>>2]|0)+20>>2]=R}else c[(c[z>>2]|0)+20>>2]=0;j:do if((c[A>>2]|0)==1){c[G>>2]=0;while(1){if((c[G>>2]|0)>=(c[(c[K>>2]|0)+8536>>2]|0))break j;a[(c[K>>2]|0)+((c[G>>2]|0)*4260|0)+2312>>0]=10;c[G>>2]=(c[G>>2]|0)+1}}else c[(c[K>>2]|0)+8540>>2]=c[F>>2];while(0);c[y>>2]=c[M>>2];na(c[D>>2]|0);R=c[y>>2]|0;i=P;return R|0}c[M>>2]=-200;c[y>>2]=c[M>>2];R=c[y>>2]|0;i=P;return R|0}function Sd(a){a=a|0;var b=0,d=0,e=0;d=i;i=i+16|0;e=d+4|0;b=d;c[e>>2]=a;c[b>>2]=0;c[c[e>>2]>>2]=24568;i=d;return c[b>>2]|0}function Td(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0;l=i;i=i+32|0;e=l+20|0;f=l+16|0;g=l+12|0;j=l+8|0;h=l+4|0;k=l;c[e>>2]=a;c[f>>2]=b;c[g>>2]=d;c[k>>2]=0;c[j>>2]=c[e>>2];oj(c[j>>2]|0,0,24568)|0;c[h>>2]=0;while(1){if((c[h>>2]|0)>=2)break;d=xf((c[j>>2]|0)+((c[h>>2]|0)*12240|0)|0,c[f>>2]|0)|0;c[k>>2]=(c[k>>2]|0)+d;c[h>>2]=(c[h>>2]|0)+1}c[(c[j>>2]|0)+24544>>2]=1;c[(c[j>>2]|0)+24548>>2]=1;j=Ud(c[e>>2]|0,c[g>>2]|0)|0;c[k>>2]=(c[k>>2]|0)+j;i=l;return c[k>>2]|0}function Ud(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0;g=i;i=i+32|0;j=g+16|0;d=g+12|0;e=g+8|0;f=g+4|0;h=g;c[j>>2]=a;c[d>>2]=b;c[e>>2]=0;c[h>>2]=c[j>>2];c[f>>2]=c[h>>2];c[c[d>>2]>>2]=c[(c[h>>2]|0)+24544>>2];c[(c[d>>2]|0)+4>>2]=c[(c[h>>2]|0)+24548>>2];c[(c[d>>2]|0)+8>>2]=c[(c[f>>2]|0)+4580>>2];c[(c[d>>2]|0)+12>>2]=c[(c[f>>2]|0)+4588>>2];c[(c[d>>2]|0)+16>>2]=c[(c[f>>2]|0)+4592>>2];c[(c[d>>2]|0)+20>>2]=c[(c[f>>2]|0)+4596>>2];c[(c[d>>2]|0)+24>>2]=c[(c[f>>2]|0)+4636>>2];c[(c[d>>2]|0)+28>>2]=c[(c[f>>2]|0)+4632>>2];c[(c[d>>2]|0)+32>>2]=c[(c[f>>2]|0)+4640>>2];c[(c[d>>2]|0)+36>>2]=c[(c[f>>2]|0)+4648>>2];c[(c[d>>2]|0)+40>>2]=c[(c[f>>2]|0)+6120>>2];c[(c[d>>2]|0)+44>>2]=c[(c[f>>2]|0)+6108>>2];c[(c[d>>2]|0)+48>>2]=c[(c[f>>2]|0)+4708>>2];c[(c[d>>2]|0)+68>>2]=((c[(c[f>>2]|0)+4600>>2]&65535)<<16>>16)*1e3;c[(c[d>>2]|0)+72>>2]=c[(c[f>>2]|0)+4560>>2];if((c[(c[f>>2]|0)+4600>>2]|0)!=16){h=0;h=h&1;j=c[d>>2]|0;j=j+76|0;c[j>>2]=h;j=c[e>>2]|0;i=g;return j|0}h=(c[(c[f>>2]|0)+16+12>>2]|0)==0;h=h&1;j=c[d>>2]|0;j=j+76|0;c[j>>2]=h;j=c[e>>2]|0;i=g;return j|0}function Vd(d,e,f,g,h,j,k){d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0;Y=i;i=i+176|0;P=Y+156|0;Z=Y+152|0;Q=Y+148|0;o=Y+144|0;p=Y+140|0;q=Y+136|0;r=Y+132|0;R=Y+128|0;T=Y+124|0;B=Y+120|0;F=Y+116|0;A=Y+112|0;X=Y+108|0;W=Y+104|0;V=Y+100|0;I=Y+96|0;J=Y+92|0;G=Y+88|0;H=Y+84|0;m=Y+80|0;K=Y+76|0;u=Y+72|0;t=Y+64|0;w=Y+56|0;s=Y+52|0;L=Y+48|0;U=Y+44|0;n=Y+40|0;z=Y+36|0;M=Y+32|0;l=Y+28|0;S=Y+24|0;D=Y+20|0;C=Y+160|0;x=Y+16|0;v=Y+12|0;E=Y+8|0;N=Y+4|0;y=Y;c[Z>>2]=d;c[Q>>2]=e;c[o>>2]=f;c[p>>2]=g;c[q>>2]=h;c[r>>2]=j;c[R>>2]=k;c[X>>2]=0;c[W>>2]=0;c[V>>2]=0;c[H>>2]=0;c[U>>2]=c[Z>>2];if(c[(c[Q>>2]|0)+64>>2]|0){c[(c[U>>2]|0)+4696>>2]=1;c[(c[U>>2]|0)+12240+4696>>2]=1}c[(c[U>>2]|0)+12240+5780>>2]=0;c[(c[U>>2]|0)+5780>>2]=0;Z=vf(c[Q>>2]|0)|0;c[V>>2]=Z;if(Z|0){c[P>>2]=c[V>>2];Z=c[P>>2]|0;i=Y;return Z|0}c[(c[Q>>2]|0)+84>>2]=0;if((c[(c[Q>>2]|0)+4>>2]|0)>(c[(c[U>>2]|0)+24548>>2]|0)?(Z=xf((c[U>>2]|0)+12240|0,c[(c[U>>2]|0)+5124>>2]|0)|0,c[V>>2]=(c[V>>2]|0)+Z,c[(c[U>>2]|0)+24480>>2]=0,c[(c[U>>2]|0)+24480+8>>2]=0,c[(c[U>>2]|0)+24480+12>>2]=0,c[(c[U>>2]|0)+24480+12+4>>2]=1,c[(c[U>>2]|0)+24480+12+8>>2]=0,c[(c[U>>2]|0)+24480+12+12>>2]=1,b[(c[U>>2]|0)+24480+30>>1]=0,b[(c[U>>2]|0)+24480+28>>1]=16384,(c[(c[U>>2]|0)+24544>>2]|0)==2):0){pj((c[U>>2]|0)+12240+5808|0,(c[U>>2]|0)+5808|0,300)|0;Z=(c[U>>2]|0)+12240|0;f=c[U>>2]|0;c[Z>>2]=c[f>>2];c[Z+4>>2]=c[f+4>>2]}if((c[(c[Q>>2]|0)+24>>2]|0)!=(c[(c[U>>2]|0)+4636>>2]|0))e=1;else e=(c[(c[U>>2]|0)+24548>>2]|0)!=(c[(c[Q>>2]|0)+4>>2]|0);c[n>>2]=e&1;c[(c[U>>2]|0)+24544>>2]=c[c[Q>>2]>>2];c[(c[U>>2]|0)+24548>>2]=c[(c[Q>>2]|0)+4>>2];c[G>>2]=((c[p>>2]|0)*100|0)/(c[(c[Q>>2]|0)+8>>2]|0)|0;c[M>>2]=(c[G>>2]|0)>1?c[G>>2]>>1:1;c[z>>2]=0;e=c[G>>2]|0;a:do if(!(c[R>>2]|0)){Z=_(e,c[(c[Q>>2]|0)+8>>2]|0)|0;if((c[p>>2]|0)<0?1:(Z|0)!=((c[p>>2]|0)*100|0)){c[P>>2]=-101;Z=c[P>>2]|0;i=Y;return Z|0}if(((c[p>>2]|0)*1e3|0)>(_(c[(c[Q>>2]|0)+24>>2]|0,c[(c[Q>>2]|0)+8>>2]|0)|0)){c[P>>2]=-101;Z=c[P>>2]|0;i=Y;return Z|0}}else{if((e|0)!=1){c[P>>2]=-101;Z=c[P>>2]|0;i=Y;return Z|0}c[T>>2]=0;while(1){if((c[T>>2]|0)>=(c[(c[Q>>2]|0)+4>>2]|0))break;c[V>>2]=xf((c[U>>2]|0)+((c[T>>2]|0)*12240|0)|0,c[(c[U>>2]|0)+((c[T>>2]|0)*12240|0)+5124>>2]|0)|0;c[T>>2]=(c[T>>2]|0)+1}c[X>>2]=c[(c[Q>>2]|0)+24>>2];c[(c[Q>>2]|0)+24>>2]=10;c[W>>2]=c[(c[Q>>2]|0)+36>>2];c[(c[Q>>2]|0)+36>>2]=0;c[T>>2]=0;while(1){if((c[T>>2]|0)>=(c[(c[Q>>2]|0)+4>>2]|0))break a;c[(c[U>>2]|0)+((c[T>>2]|0)*12240|0)+4700>>2]=0;c[(c[U>>2]|0)+((c[T>>2]|0)*12240|0)+4712>>2]=1;c[T>>2]=(c[T>>2]|0)+1}}while(0);c[u>>2]=c[(c[Q>>2]|0)+28>>2]>>(c[(c[Q>>2]|0)+4>>2]|0)-1;c[T>>2]=0;while(1){if((c[T>>2]|0)>=(c[(c[Q>>2]|0)+4>>2]|0))break;if((c[T>>2]|0)==1)e=c[(c[U>>2]|0)+4600>>2]|0;else e=0;c[l>>2]=e;Z=yf((c[U>>2]|0)+((c[T>>2]|0)*12240|0)|0,c[Q>>2]|0,c[u>>2]|0,c[(c[U>>2]|0)+24560>>2]|0,c[T>>2]|0,c[l>>2]|0)|0;c[V>>2]=Z;if(Z|0){O=28;break}b:do if(c[n>>2]|0?1:(c[(c[U>>2]|0)+((c[T>>2]|0)*12240|0)+4696>>2]|0)!=0){c[B>>2]=0;while(1){if((c[B>>2]|0)>=(c[(c[U>>2]|0)+5776>>2]|0))break b;c[(c[U>>2]|0)+((c[T>>2]|0)*12240|0)+4756+(c[B>>2]<<2)>>2]=0;c[B>>2]=(c[B>>2]|0)+1}}while(0);c[(c[U>>2]|0)+((c[T>>2]|0)*12240|0)+6112>>2]=c[(c[U>>2]|0)+((c[T>>2]|0)*12240|0)+6108>>2];c[T>>2]=(c[T>>2]|0)+1}if((O|0)==28){c[P>>2]=c[V>>2];Z=c[P>>2]|0;i=Y;return Z|0}c[J>>2]=_((c[G>>2]|0)*10|0,c[(c[U>>2]|0)+4600>>2]|0)|0;Z=_(c[J>>2]|0,c[(c[U>>2]|0)+4580>>2]|0)|0;c[m>>2]=(Z|0)/((c[(c[U>>2]|0)+4600>>2]|0)*1e3|0)|0;Z=c[m>>2]|0;c[S>>2]=ia()|0;d=i;i=i+((1*(Z<<1)|0)+15&-16)|0;while(1){c[I>>2]=(c[(c[U>>2]|0)+4608>>2]|0)-(c[(c[U>>2]|0)+5772>>2]|0);c[I>>2]=(c[I>>2]|0)<(c[J>>2]|0)?c[I>>2]|0:c[J>>2]|0;Z=_(c[I>>2]|0,c[(c[U>>2]|0)+4580>>2]|0)|0;c[H>>2]=(Z|0)/((c[(c[U>>2]|0)+4600>>2]|0)*1e3|0)|0;if((c[c[Q>>2]>>2]|0)==2?(c[(c[Q>>2]|0)+4>>2]|0)==2:0){c[D>>2]=c[(c[U>>2]|0)+5780>>2];c[T>>2]=0;while(1){if((c[T>>2]|0)>=(c[H>>2]|0))break;b[d+(c[T>>2]<<1)>>1]=b[(c[o>>2]|0)+(c[T>>2]<<1<<1)>>1]|0;c[T>>2]=(c[T>>2]|0)+1}if((c[D>>2]|0)==0?(c[(c[U>>2]|0)+24552>>2]|0)==1:0)pj((c[U>>2]|0)+12240+5808|0,(c[U>>2]|0)+5808|0,300)|0;Z=jg((c[U>>2]|0)+5808|0,(c[U>>2]|0)+5128+((c[(c[U>>2]|0)+5772>>2]|0)+2<<1)|0,d,c[H>>2]|0)|0;c[V>>2]=(c[V>>2]|0)+Z;Z=(c[U>>2]|0)+5772|0;c[Z>>2]=(c[Z>>2]|0)+(c[I>>2]|0);c[I>>2]=(c[(c[U>>2]|0)+12240+4608>>2]|0)-(c[(c[U>>2]|0)+12240+5772>>2]|0);if((c[I>>2]|0)<(_((c[G>>2]|0)*10|0,c[(c[U>>2]|0)+12240+4600>>2]|0)|0))e=c[I>>2]|0;else e=_((c[G>>2]|0)*10|0,c[(c[U>>2]|0)+12240+4600>>2]|0)|0;c[I>>2]=e;c[T>>2]=0;while(1){if((c[T>>2]|0)>=(c[H>>2]|0))break;b[d+(c[T>>2]<<1)>>1]=b[(c[o>>2]|0)+((c[T>>2]<<1)+1<<1)>>1]|0;c[T>>2]=(c[T>>2]|0)+1}Z=jg((c[U>>2]|0)+12240+5808|0,(c[U>>2]|0)+12240+5128+((c[(c[U>>2]|0)+12240+5772>>2]|0)+2<<1)|0,d,c[H>>2]|0)|0;c[V>>2]=(c[V>>2]|0)+Z;Z=(c[U>>2]|0)+12240+5772|0;c[Z>>2]=(c[Z>>2]|0)+(c[I>>2]|0)}else O=49;do if((O|0)==49){O=0;if((c[c[Q>>2]>>2]|0)==2?(c[(c[Q>>2]|0)+4>>2]|0)==1:0){c[T>>2]=0;while(1){if((c[T>>2]|0)>=(c[H>>2]|0))break;c[L>>2]=(b[(c[o>>2]|0)+(c[T>>2]<<1<<1)>>1]|0)+(b[(c[o>>2]|0)+((c[T>>2]<<1)+1<<1)>>1]|0);b[d+(c[T>>2]<<1)>>1]=(c[L>>2]>>1)+(c[L>>2]&1);c[T>>2]=(c[T>>2]|0)+1}Z=jg((c[U>>2]|0)+5808|0,(c[U>>2]|0)+5128+((c[(c[U>>2]|0)+5772>>2]|0)+2<<1)|0,d,c[H>>2]|0)|0;c[V>>2]=(c[V>>2]|0)+Z;c:do if((c[(c[U>>2]|0)+24552>>2]|0)==2?(c[(c[U>>2]|0)+5780>>2]|0)==0:0){Z=jg((c[U>>2]|0)+12240+5808|0,(c[U>>2]|0)+12240+5128+((c[(c[U>>2]|0)+12240+5772>>2]|0)+2<<1)|0,d,c[H>>2]|0)|0;c[V>>2]=(c[V>>2]|0)+Z;c[T>>2]=0;while(1){if((c[T>>2]|0)>=(c[(c[U>>2]|0)+4608>>2]|0))break c;b[(c[U>>2]|0)+5128+((c[(c[U>>2]|0)+5772>>2]|0)+(c[T>>2]|0)+2<<1)>>1]=(b[(c[U>>2]|0)+5128+((c[(c[U>>2]|0)+5772>>2]|0)+(c[T>>2]|0)+2<<1)>>1]|0)+(b[(c[U>>2]|0)+12240+5128+((c[(c[U>>2]|0)+12240+5772>>2]|0)+(c[T>>2]|0)+2<<1)>>1]|0)>>1;c[T>>2]=(c[T>>2]|0)+1}}while(0);Z=(c[U>>2]|0)+5772|0;c[Z>>2]=(c[Z>>2]|0)+(c[I>>2]|0);break}pj(d|0,c[o>>2]|0,c[H>>2]<<1|0)|0;Z=jg((c[U>>2]|0)+5808|0,(c[U>>2]|0)+5128+((c[(c[U>>2]|0)+5772>>2]|0)+2<<1)|0,d,c[H>>2]|0)|0;c[V>>2]=(c[V>>2]|0)+Z;Z=(c[U>>2]|0)+5772|0;c[Z>>2]=(c[Z>>2]|0)+(c[I>>2]|0)}while(0);Z=_(c[H>>2]|0,c[c[Q>>2]>>2]|0)|0;c[o>>2]=(c[o>>2]|0)+(Z<<1);c[p>>2]=(c[p>>2]|0)-(c[H>>2]|0);c[(c[U>>2]|0)+24560>>2]=0;if((c[(c[U>>2]|0)+5772>>2]|0)<(c[(c[U>>2]|0)+4608>>2]|0))break;if(!(c[R>>2]|0?1:(c[(c[U>>2]|0)+5780>>2]|0)!=0)){a[C>>0]=0;a[C+1>>0]=0;a[C>>0]=256-(256>>(_((c[(c[U>>2]|0)+5776>>2]|0)+1|0,c[(c[Q>>2]|0)+4>>2]|0)|0));qc(c[q>>2]|0,0,C,8);c[T>>2]=0;while(1){if((c[T>>2]|0)>=(c[(c[Q>>2]|0)+4>>2]|0))break;c[s>>2]=0;c[B>>2]=0;while(1){if((c[B>>2]|0)>=(c[(c[U>>2]|0)+((c[T>>2]|0)*12240|0)+5776>>2]|0))break;c[s>>2]=c[s>>2]|c[(c[U>>2]|0)+((c[T>>2]|0)*12240|0)+4756+(c[B>>2]<<2)>>2]<<c[B>>2];c[B>>2]=(c[B>>2]|0)+1}a[(c[U>>2]|0)+((c[T>>2]|0)*12240|0)+4755>>0]=(c[s>>2]|0)>0?1:0;if(c[s>>2]|0?(c[(c[U>>2]|0)+((c[T>>2]|0)*12240|0)+5776>>2]|0)>1:0)qc(c[q>>2]|0,(c[s>>2]|0)-1|0,c[17836+((c[(c[U>>2]|0)+((c[T>>2]|0)*12240|0)+5776>>2]|0)-2<<2)>>2]|0,8);c[T>>2]=(c[T>>2]|0)+1}c[B>>2]=0;while(1){Z=(c[B>>2]|0)<(c[(c[U>>2]|0)+5776>>2]|0);c[T>>2]=0;if(!Z)break;while(1){e=c[B>>2]|0;if((c[T>>2]|0)>=(c[(c[Q>>2]|0)+4>>2]|0))break;if(c[(c[U>>2]|0)+((c[T>>2]|0)*12240|0)+4756+(e<<2)>>2]|0){if(((c[T>>2]|0)==0?(c[(c[Q>>2]|0)+4>>2]|0)==2:0)?(zg(c[q>>2]|0,(c[U>>2]|0)+24480+34+((c[B>>2]|0)*6|0)|0),(c[(c[U>>2]|0)+12240+4756+(c[B>>2]<<2)>>2]|0)==0):0)Ag(c[q>>2]|0,a[(c[U>>2]|0)+24480+52+(c[B>>2]|0)>>0]|0);if((c[B>>2]|0)>0?c[(c[U>>2]|0)+((c[T>>2]|0)*12240|0)+4756+((c[B>>2]|0)-1<<2)>>2]|0:0)c[x>>2]=2;else c[x>>2]=0;Xd((c[U>>2]|0)+((c[T>>2]|0)*12240|0)|0,c[q>>2]|0,c[B>>2]|0,1,c[x>>2]|0);Yd(c[q>>2]|0,a[(c[U>>2]|0)+((c[T>>2]|0)*12240|0)+6132+((c[B>>2]|0)*36|0)+29>>0]|0,a[(c[U>>2]|0)+((c[T>>2]|0)*12240|0)+6132+((c[B>>2]|0)*36|0)+30>>0]|0,(c[U>>2]|0)+((c[T>>2]|0)*12240|0)+6240+((c[B>>2]|0)*320|0)|0,c[(c[U>>2]|0)+((c[T>>2]|0)*12240|0)+4608>>2]|0)}c[T>>2]=(c[T>>2]|0)+1}c[B>>2]=e+1}while(1){if((c[T>>2]|0)>=(c[(c[Q>>2]|0)+4>>2]|0))break;Z=(c[U>>2]|0)+((c[T>>2]|0)*12240|0)+4756|0;c[Z>>2]=0;c[Z+4>>2]=0;c[Z+8>>2]=0;c[T>>2]=(c[T>>2]|0)+1}Z=Wd(c[q>>2]|0)|0;c[(c[U>>2]|0)+24536>>2]=Z}ff(c[U>>2]|0);c[F>>2]=(_(c[(c[Q>>2]|0)+28>>2]|0,c[(c[Q>>2]|0)+24>>2]|0)|0)/1e3|0;if(!(c[R>>2]|0))c[F>>2]=(c[F>>2]|0)-(c[(c[U>>2]|0)+24536>>2]|0);c[F>>2]=(c[F>>2]|0)/(c[(c[U>>2]|0)+5776>>2]|0)|0;e=(c[F>>2]&65535)<<16>>16;if((c[(c[Q>>2]|0)+24>>2]|0)==10)c[u>>2]=e*100;else c[u>>2]=e*50;c[u>>2]=(c[u>>2]|0)-(((c[(c[U>>2]|0)+24540>>2]|0)*1e3|0)/500|0);if((c[R>>2]|0)==0?(c[(c[U>>2]|0)+5780>>2]|0)>0:0){Z=Wd(c[q>>2]|0)|0;c[v>>2]=Z-(c[(c[U>>2]|0)+24536>>2]|0)-(_(c[F>>2]|0,c[(c[U>>2]|0)+5780>>2]|0)|0);c[u>>2]=(c[u>>2]|0)-(((c[v>>2]|0)*1e3|0)/500|0)}e=c[u>>2]|0;do if((c[(c[Q>>2]|0)+28>>2]|0)>5e3)if((e|0)>(c[(c[Q>>2]|0)+28>>2]|0)){e=c[(c[Q>>2]|0)+28>>2]|0;break}else{e=(c[u>>2]|0)<5e3?5e3:c[u>>2]|0;break}else if((e|0)<=5e3)if((c[u>>2]|0)<(c[(c[Q>>2]|0)+28>>2]|0)){e=c[(c[Q>>2]|0)+28>>2]|0;break}else{e=c[u>>2]|0;break}else e=5e3;while(0);c[u>>2]=e;e=c[U>>2]|0;if((c[(c[Q>>2]|0)+4>>2]|0)==2){qf(e+24480|0,(c[U>>2]|0)+5128+4|0,(c[U>>2]|0)+12240+5128+4|0,(c[U>>2]|0)+24480+34+((c[(c[U>>2]|0)+5780>>2]|0)*6|0)|0,(c[U>>2]|0)+24480+52+(c[(c[U>>2]|0)+5780>>2]|0)|0,t,c[u>>2]|0,c[(c[U>>2]|0)+4556>>2]|0,c[(c[Q>>2]|0)+56>>2]|0,c[(c[U>>2]|0)+4600>>2]|0,c[(c[U>>2]|0)+4608>>2]|0);e=c[U>>2]|0;if(!(a[(c[U>>2]|0)+24480+52+(c[(c[U>>2]|0)+5780>>2]|0)>>0]|0)){if((c[e+24564>>2]|0)==1){Z=(c[U>>2]|0)+12240+7200|0;c[Z>>2]=0;c[Z+4>>2]=0;c[Z+8>>2]=0;c[Z+12>>2]=0;oj((c[U>>2]|0)+12240+7216|0,0,2140)|0;oj((c[U>>2]|0)+12240+144|0,0,4380)|0;Z=(c[U>>2]|0)+12240+4524|0;c[Z>>2]=0;c[Z+4>>2]=0;c[Z+8>>2]=0;c[Z+12>>2]=0;c[Z+16>>2]=0;c[Z+20>>2]=0;c[Z+24>>2]=0;c[Z+28>>2]=0;Z=(c[U>>2]|0)+12240+16|0;c[Z>>2]=0;c[Z+4>>2]=0;c[(c[U>>2]|0)+12240+4568>>2]=100;c[(c[U>>2]|0)+12240+144+4356>>2]=100;a[(c[U>>2]|0)+12240+7200>>0]=10;a[(c[U>>2]|0)+12240+4565>>0]=0;c[(c[U>>2]|0)+12240+144+4372>>2]=65536;c[(c[U>>2]|0)+12240+4696>>2]=1}Mg((c[U>>2]|0)+12240|0)}else a[(c[U>>2]|0)+12240+4752+(c[e+5780>>2]|0)>>0]=0;if((c[R>>2]|0)==0?(zg(c[q>>2]|0,(c[U>>2]|0)+24480+34+((c[(c[U>>2]|0)+5780>>2]|0)*6|0)|0),(a[(c[U>>2]|0)+12240+4752+(c[(c[U>>2]|0)+5780>>2]|0)>>0]|0)==0):0)Ag(c[q>>2]|0,a[(c[U>>2]|0)+24480+52+(c[(c[U>>2]|0)+5780>>2]|0)>>0]|0)}else{c[e+5128>>2]=c[(c[U>>2]|0)+24480+4>>2];Z=(c[U>>2]|0)+24480+4|0;n=(c[U>>2]|0)+5128+(c[(c[U>>2]|0)+4608>>2]<<1)|0;b[Z>>1]=b[n>>1]|0;b[Z+2>>1]=b[n+2>>1]|0}Mg(c[U>>2]|0);c[T>>2]=0;while(1){if((c[T>>2]|0)>=(c[(c[Q>>2]|0)+4>>2]|0))break;c[E>>2]=c[(c[Q>>2]|0)+52>>2];do if(!((c[M>>2]|0)==2&(c[z>>2]|0)==0)){if((c[M>>2]|0)==3){if(!(c[z>>2]|0)){c[E>>2]=(c[E>>2]<<1|0)/5|0;break}if((c[z>>2]|0)!=1)break;c[E>>2]=((c[E>>2]|0)*3|0)/4|0}}else c[E>>2]=((c[E>>2]|0)*3|0)/5|0;while(0);if(c[(c[Q>>2]|0)+48>>2]|0)e=(c[z>>2]|0)==((c[M>>2]|0)-1|0);else e=0;c[N>>2]=e&1;do if((c[(c[Q>>2]|0)+4>>2]|0)==1)c[w>>2]=c[u>>2];else{c[w>>2]=c[t+(c[T>>2]<<2)>>2];if(c[T>>2]|0)break;if((c[t+4>>2]|0)<=0)break;c[N>>2]=0;c[E>>2]=(c[E>>2]|0)-((c[(c[Q>>2]|0)+52>>2]|0)/(c[M>>2]<<1|0)|0)}while(0);if((c[w>>2]|0)>0){wf((c[U>>2]|0)+((c[T>>2]|0)*12240|0)|0,c[w>>2]|0)|0;d:do if(((c[(c[U>>2]|0)+5780>>2]|0)-(c[T>>2]|0)|0)<=0)c[y>>2]=0;else{do if((c[T>>2]|0)>0){if(!(c[(c[U>>2]|0)+24564>>2]|0))break;c[y>>2]=1;break d}while(0);c[y>>2]=2}while(0);c[V>>2]=Ng((c[U>>2]|0)+((c[T>>2]|0)*12240|0)|0,c[r>>2]|0,c[q>>2]|0,c[y>>2]|0,c[E>>2]|0,c[N>>2]|0)|0}c[(c[U>>2]|0)+((c[T>>2]|0)*12240|0)+4700>>2]=0;c[(c[U>>2]|0)+((c[T>>2]|0)*12240|0)+5772>>2]=0;Z=(c[U>>2]|0)+((c[T>>2]|0)*12240|0)+5780|0;c[Z>>2]=(c[Z>>2]|0)+1;c[T>>2]=(c[T>>2]|0)+1}c[(c[U>>2]|0)+24564>>2]=a[(c[U>>2]|0)+24480+52+((c[(c[U>>2]|0)+5780>>2]|0)-1)>>0];do if((c[c[r>>2]>>2]|0)>0?(c[(c[U>>2]|0)+5780>>2]|0)==(c[(c[U>>2]|0)+5776>>2]|0):0){c[A>>2]=0;c[T>>2]=0;while(1){if((c[T>>2]|0)>=(c[(c[Q>>2]|0)+4>>2]|0))break;c[B>>2]=0;while(1){Z=(c[B>>2]|0)<(c[(c[U>>2]|0)+((c[T>>2]|0)*12240|0)+5776>>2]|0);c[A>>2]=c[A>>2]<<1;if(!Z)break;c[A>>2]=c[A>>2]|a[(c[U>>2]|0)+((c[T>>2]|0)*12240|0)+4752+(c[B>>2]|0)>>0];c[B>>2]=(c[B>>2]|0)+1}c[A>>2]=c[A>>2]|a[(c[U>>2]|0)+((c[T>>2]|0)*12240|0)+4755>>0];c[T>>2]=(c[T>>2]|0)+1}if(!(c[R>>2]|0))uc(c[q>>2]|0,c[A>>2]|0,_((c[(c[U>>2]|0)+5776>>2]|0)+1|0,c[(c[Q>>2]|0)+4>>2]|0)|0);do if(c[(c[U>>2]|0)+6112>>2]|0){if((c[(c[Q>>2]|0)+4>>2]|0)!=1?(c[(c[U>>2]|0)+12240+6112>>2]|0)==0:0)break;c[c[r>>2]>>2]=0}while(0);n=(c[U>>2]|0)+24540|0;c[n>>2]=(c[n>>2]|0)+(c[c[r>>2]>>2]<<3);n=(_(c[(c[Q>>2]|0)+28>>2]|0,c[(c[Q>>2]|0)+24>>2]|0)|0)/1e3|0;Z=(c[U>>2]|0)+24540|0;c[Z>>2]=(c[Z>>2]|0)-n;do if((c[(c[U>>2]|0)+24540>>2]|0)>1e4)e=1e4;else{if((c[(c[U>>2]|0)+24540>>2]|0)<0){e=0;break}e=c[(c[U>>2]|0)+24540>>2]|0}while(0);c[(c[U>>2]|0)+24540>>2]=e;c[K>>2]=13+(0+(((c[(c[U>>2]|0)+24556>>2]&65535)<<16>>16)*3188>>16));e=(c[U>>2]|0)+24560|0;if((c[(c[U>>2]|0)+4556>>2]|0)<(c[K>>2]|0)){c[e>>2]=1;c[(c[U>>2]|0)+24556>>2]=0;break}else{c[e>>2]=0;Z=(c[U>>2]|0)+24556|0;c[Z>>2]=(c[Z>>2]|0)+(c[(c[Q>>2]|0)+24>>2]|0);break}}while(0);if(!(c[p>>2]|0))break;c[z>>2]=(c[z>>2]|0)+1}c[(c[U>>2]|0)+24552>>2]=c[(c[Q>>2]|0)+4>>2];c[(c[Q>>2]|0)+72>>2]=c[(c[U>>2]|0)+24560>>2];if((c[(c[U>>2]|0)+4600>>2]|0)==16)e=(c[(c[U>>2]|0)+16+12>>2]|0)==0;else e=0;c[(c[Q>>2]|0)+76>>2]=e&1;c[(c[Q>>2]|0)+68>>2]=((c[(c[U>>2]|0)+4600>>2]&65535)<<16>>16)*1e3;if(c[(c[Q>>2]|0)+56>>2]|0)e=0;else e=b[(c[U>>2]|0)+24480+28>>1]|0;c[(c[Q>>2]|0)+80>>2]=e;e:do if(c[R>>2]|0){c[(c[Q>>2]|0)+24>>2]=c[X>>2];c[(c[Q>>2]|0)+36>>2]=c[W>>2];c[T>>2]=0;while(1){if((c[T>>2]|0)>=(c[(c[Q>>2]|0)+4>>2]|0))break e;c[(c[U>>2]|0)+((c[T>>2]|0)*12240|0)+4700>>2]=0;c[(c[U>>2]|0)+((c[T>>2]|0)*12240|0)+4712>>2]=0;c[T>>2]=(c[T>>2]|0)+1}}while(0);c[P>>2]=c[V>>2];na(c[S>>2]|0);Z=c[P>>2]|0;i=Y;return Z|0}function Wd(a){a=a|0;var b=0,d=0;b=i;i=i+16|0;d=b;c[d>>2]=a;a=(c[(c[d>>2]|0)+20>>2]|0)-(32-(aa(c[(c[d>>2]|0)+28>>2]|0)|0))|0;i=b;return a|0}function Xd(d,e,f,g,h){d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;y=i;i=i+112|0;n=y+48|0;o=y+44|0;j=y+40|0;k=y+36|0;p=y+32|0;t=y+28|0;u=y+24|0;l=y+20|0;s=y+16|0;q=y+12|0;r=y+56|0;m=y+88|0;x=y+8|0;v=y+4|0;w=y;c[n>>2]=d;c[o>>2]=e;c[j>>2]=f;c[k>>2]=g;c[p>>2]=h;if(c[k>>2]|0)c[x>>2]=(c[n>>2]|0)+6132+((c[j>>2]|0)*36|0);else c[x>>2]=(c[n>>2]|0)+4768;c[l>>2]=(a[(c[x>>2]|0)+29>>0]<<1)+(a[(c[x>>2]|0)+30>>0]|0);j=c[o>>2]|0;f=c[l>>2]|0;if((c[k>>2]|0)!=0|(c[l>>2]|0)>=2)qc(j,f-2|0,29020,8);else qc(j,f,29024,8);j=c[o>>2]|0;f=a[c[x>>2]>>0]|0;if((c[p>>2]|0)==2)qc(j,f,26771,8);else{qc(j,f>>3,26747+(a[(c[x>>2]|0)+29>>0]<<3)|0,8);qc(c[o>>2]|0,a[c[x>>2]>>0]&7,29049,8)}c[t>>2]=1;while(1){j=c[o>>2]|0;if((c[t>>2]|0)>=(c[(c[n>>2]|0)+4604>>2]|0))break;qc(j,a[(c[x>>2]|0)+(c[t>>2]|0)>>0]|0,26771,8);c[t>>2]=(c[t>>2]|0)+1}l=_(a[(c[x>>2]|0)+29>>0]>>1,b[c[(c[n>>2]|0)+4724>>2]>>1]|0)|0;qc(j,a[(c[x>>2]|0)+8>>0]|0,(c[(c[(c[n>>2]|0)+4724>>2]|0)+12>>2]|0)+l|0,8);nf(r,m,c[(c[n>>2]|0)+4724>>2]|0,a[(c[x>>2]|0)+8>>0]|0);c[t>>2]=0;while(1){if((c[t>>2]|0)>=(b[(c[(c[n>>2]|0)+4724>>2]|0)+2>>1]|0))break;do if((a[(c[x>>2]|0)+8+((c[t>>2]|0)+1)>>0]|0)<4){j=c[o>>2]|0;f=c[t>>2]|0;if((a[(c[x>>2]|0)+8+((c[t>>2]|0)+1)>>0]|0)<=-4){qc(j,0,(c[(c[(c[n>>2]|0)+4724>>2]|0)+24>>2]|0)+(b[r+(f<<1)>>1]|0)|0,8);qc(c[o>>2]|0,0-(a[(c[x>>2]|0)+8+((c[t>>2]|0)+1)>>0]|0)-4|0,29057,8);break}else{qc(j,(a[(c[x>>2]|0)+8+(f+1)>>0]|0)+4|0,(c[(c[(c[n>>2]|0)+4724>>2]|0)+24>>2]|0)+(b[r+(c[t>>2]<<1)>>1]|0)|0,8);break}}else{qc(c[o>>2]|0,8,(c[(c[(c[n>>2]|0)+4724>>2]|0)+24>>2]|0)+(b[r+(c[t>>2]<<1)>>1]|0)|0,8);qc(c[o>>2]|0,(a[(c[x>>2]|0)+8+((c[t>>2]|0)+1)>>0]|0)-4|0,29057,8)}while(0);c[t>>2]=(c[t>>2]|0)+1}if((c[(c[n>>2]|0)+4604>>2]|0)==4)qc(c[o>>2]|0,a[(c[x>>2]|0)+31>>0]|0,29026,8);if((a[(c[x>>2]|0)+29>>0]|0)!=2){v=c[x>>2]|0;v=v+29|0;v=a[v>>0]|0;v=v<<24>>24;w=c[n>>2]|0;w=w+5800|0;c[w>>2]=v;w=c[o>>2]|0;x=c[x>>2]|0;x=x+34|0;x=a[x>>0]|0;x=x<<24>>24;qc(w,x,29034,8);i=y;return}c[s>>2]=1;if((c[p>>2]|0)==2?(c[(c[n>>2]|0)+5800>>2]|0)==2:0){c[q>>2]=(b[(c[x>>2]|0)+26>>1]|0)-(b[(c[n>>2]|0)+5804>>1]|0);if((c[q>>2]|0)<-8|(c[q>>2]|0)>11)c[q>>2]=0;else{c[q>>2]=(c[q>>2]|0)+9;c[s>>2]=0}qc(c[o>>2]|0,c[q>>2]|0,29096,8)}if(c[s>>2]|0){c[v>>2]=(b[(c[x>>2]|0)+26>>1]|0)/(c[(c[n>>2]|0)+4600>>2]>>1|0)|0;c[w>>2]=(b[(c[x>>2]|0)+26>>1]|0)-(_((c[v>>2]&65535)<<16>>16,(c[(c[n>>2]|0)+4600>>2]>>1&65535)<<16>>16)|0);qc(c[o>>2]|0,c[v>>2]|0,29064,8);qc(c[o>>2]|0,c[w>>2]|0,c[(c[n>>2]|0)+4716>>2]|0,8)}b[(c[n>>2]|0)+5804>>1]=b[(c[x>>2]|0)+26>>1]|0;qc(c[o>>2]|0,a[(c[x>>2]|0)+28>>0]|0,c[(c[n>>2]|0)+4720>>2]|0,8);qc(c[o>>2]|0,a[(c[x>>2]|0)+32>>0]|0,26812,8);c[u>>2]=0;while(1){if((c[u>>2]|0)>=(c[(c[n>>2]|0)+4604>>2]|0))break;qc(c[o>>2]|0,a[(c[x>>2]|0)+4+(c[u>>2]|0)>>0]|0,c[17620+(a[(c[x>>2]|0)+32>>0]<<2)>>2]|0,8);c[u>>2]=(c[u>>2]|0)+1}if(c[p>>2]|0){v=c[x>>2]|0;v=v+29|0;v=a[v>>0]|0;v=v<<24>>24;w=c[n>>2]|0;w=w+5800|0;c[w>>2]=v;w=c[o>>2]|0;x=c[x>>2]|0;x=x+34|0;x=a[x>>0]|0;x=x<<24>>24;qc(w,x,29034,8);i=y;return}qc(c[o>>2]|0,a[(c[x>>2]|0)+33>>0]|0,29017,8);v=c[x>>2]|0;v=v+29|0;v=a[v>>0]|0;v=v<<24>>24;w=c[n>>2]|0;w=w+5800|0;c[w>>2]=v;w=c[o>>2]|0;x=c[x>>2]|0;x=x+34|0;x=a[x>>0]|0;x=x<<24>>24;qc(w,x,29034,8);i=y;return}function Yd(b,e,f,g,h){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;F=i;i=i+128|0;r=F+116|0;s=F+112|0;t=F+108|0;u=F+104|0;v=F+100|0;z=F+96|0;C=F+92|0;B=F+88|0;A=F+84|0;y=F+80|0;D=F+76|0;o=F+72|0;j=F+68|0;x=F+64|0;l=F+60|0;p=F+56|0;n=F+24|0;k=F+16|0;E=F+12|0;q=F+8|0;m=F+4|0;w=F;c[r>>2]=b;c[s>>2]=e;c[t>>2]=f;c[u>>2]=g;c[v>>2]=h;c[j>>2]=0;c[n>>2]=0;c[n+4>>2]=0;c[n+8>>2]=0;c[n+12>>2]=0;c[n+16>>2]=0;c[n+20>>2]=0;c[n+24>>2]=0;c[n+28>>2]=0;c[A>>2]=c[v>>2]>>4;if((c[A>>2]<<4|0)<(c[v>>2]|0)){c[A>>2]=(c[A>>2]|0)+1;h=(c[u>>2]|0)+(c[v>>2]|0)|0;b=h+16|0;do{a[h>>0]=0;h=h+1|0}while((h|0)<(b|0))}e=c[A>>2]<<4;c[w>>2]=ia()|0;b=i;i=i+((1*(e<<2)|0)+15&-16)|0;c[z>>2]=0;while(1){if((c[z>>2]|0)>=(c[A>>2]<<4|0))break;e=a[(c[u>>2]|0)+((c[z>>2]|0)+0)>>0]|0;c[b+((c[z>>2]|0)+0<<2)>>2]=(a[(c[u>>2]|0)+((c[z>>2]|0)+0)>>0]|0)>0?e:0-e|0;e=a[(c[u>>2]|0)+((c[z>>2]|0)+1)>>0]|0;c[b+((c[z>>2]|0)+1<<2)>>2]=(a[(c[u>>2]|0)+((c[z>>2]|0)+1)>>0]|0)>0?e:0-e|0;e=a[(c[u>>2]|0)+((c[z>>2]|0)+2)>>0]|0;c[b+((c[z>>2]|0)+2<<2)>>2]=(a[(c[u>>2]|0)+((c[z>>2]|0)+2)>>0]|0)>0?e:0-e|0;e=a[(c[u>>2]|0)+((c[z>>2]|0)+3)>>0]|0;c[b+((c[z>>2]|0)+3<<2)>>2]=(a[(c[u>>2]|0)+((c[z>>2]|0)+3)>>0]|0)>0?e:0-e|0;c[z>>2]=(c[z>>2]|0)+4}g=i;i=i+((1*(c[A>>2]<<2)|0)+15&-16)|0;f=i;i=i+((1*(c[A>>2]<<2)|0)+15&-16)|0;c[k>>2]=b;c[z>>2]=0;while(1){if((c[z>>2]|0)>=(c[A>>2]|0))break;c[f+(c[z>>2]<<2)>>2]=0;a:while(1){c[o>>2]=Zd(n,c[k>>2]|0,d[29177]|0,8)|0;e=Zd(n,n,d[29178]|0,4)|0;c[o>>2]=(c[o>>2]|0)+e;e=Zd(n,n,d[29179]|0,2)|0;c[o>>2]=(c[o>>2]|0)+e;e=Zd(g+(c[z>>2]<<2)|0,n,d[29180]|0,1)|0;c[o>>2]=(c[o>>2]|0)+e;if(!(c[o>>2]|0))break;e=f+(c[z>>2]<<2)|0;c[e>>2]=(c[e>>2]|0)+1;c[C>>2]=0;while(1){if((c[C>>2]|0)>=16)continue a;c[(c[k>>2]|0)+(c[C>>2]<<2)>>2]=c[(c[k>>2]|0)+(c[C>>2]<<2)>>2]>>1;c[C>>2]=(c[C>>2]|0)+1}}c[k>>2]=(c[k>>2]|0)+64;c[z>>2]=(c[z>>2]|0)+1}c[l>>2]=2147483647;c[C>>2]=0;while(1){if((c[C>>2]|0)>=9)break;c[m>>2]=29361+((c[C>>2]|0)*18|0);c[p>>2]=d[29541+((c[s>>2]>>1)*9|0)+(c[C>>2]|0)>>0];c[z>>2]=0;while(1){if((c[z>>2]|0)>=(c[A>>2]|0))break;if((c[f+(c[z>>2]<<2)>>2]|0)>0)c[p>>2]=(c[p>>2]|0)+(d[(c[m>>2]|0)+17>>0]|0);else c[p>>2]=(c[p>>2]|0)+(d[(c[m>>2]|0)+(c[g+(c[z>>2]<<2)>>2]|0)>>0]|0);c[z>>2]=(c[z>>2]|0)+1}if((c[p>>2]|0)<(c[l>>2]|0)){c[l>>2]=c[p>>2];c[j>>2]=c[C>>2]}c[C>>2]=(c[C>>2]|0)+1}qc(c[r>>2]|0,c[j>>2]|0,29523+((c[s>>2]>>1)*9|0)|0,8);c[q>>2]=29181+((c[j>>2]|0)*18|0);c[z>>2]=0;while(1){if((c[z>>2]|0)>=(c[A>>2]|0))break;h=c[r>>2]|0;if(!(c[f+(c[z>>2]<<2)>>2]|0))qc(h,c[g+(c[z>>2]<<2)>>2]|0,c[q>>2]|0,8);else{qc(h,17,c[q>>2]|0,8);c[C>>2]=0;while(1){h=c[r>>2]|0;if((c[C>>2]|0)>=((c[f+(c[z>>2]<<2)>>2]|0)-1|0))break;qc(h,17,29343,8);c[C>>2]=(c[C>>2]|0)+1}qc(h,c[g+(c[z>>2]<<2)>>2]|0,29343,8)}c[z>>2]=(c[z>>2]|0)+1}c[z>>2]=0;while(1){if((c[z>>2]|0)>=(c[A>>2]|0))break;if((c[g+(c[z>>2]<<2)>>2]|0)>0)Pe(c[r>>2]|0,b+(c[z>>2]<<4<<2)|0);c[z>>2]=(c[z>>2]|0)+1}c[z>>2]=0;while(1){if((c[z>>2]|0)>=(c[A>>2]|0))break;b:do if((c[f+(c[z>>2]<<2)>>2]|0)>0){c[E>>2]=(c[u>>2]|0)+(c[z>>2]<<4);c[D>>2]=(c[f+(c[z>>2]<<2)>>2]|0)-1;c[C>>2]=0;while(1){if((c[C>>2]|0)>=16)break b;q=a[(c[E>>2]|0)+(c[C>>2]|0)>>0]|0;c[x>>2]=(((a[(c[E>>2]|0)+(c[C>>2]|0)>>0]|0)>0?q:0-q|0)&255)<<24>>24;c[B>>2]=c[D>>2];while(1){h=c[x>>2]|0;if((c[B>>2]|0)<=0)break;c[y>>2]=h>>c[B>>2]&1;qc(c[r>>2]|0,c[y>>2]|0,29015,8);c[B>>2]=(c[B>>2]|0)+-1}c[y>>2]=h&1;qc(c[r>>2]|0,c[y>>2]|0,29015,8);c[C>>2]=(c[C>>2]|0)+1}}while(0);c[z>>2]=(c[z>>2]|0)+1}Dd(c[r>>2]|0,c[u>>2]|0,c[v>>2]|0,c[s>>2]|0,c[t>>2]|0,g);na(c[w>>2]|0);i=F;return}function Zd(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;n=i;i=i+32|0;m=n+24|0;f=n+20|0;g=n+16|0;h=n+12|0;j=n+8|0;k=n+4|0;l=n;c[f>>2]=a;c[g>>2]=b;c[h>>2]=d;c[j>>2]=e;c[k>>2]=0;while(1){if((c[k>>2]|0)>=(c[j>>2]|0)){f=6;break}c[l>>2]=(c[(c[g>>2]|0)+(c[k>>2]<<1<<2)>>2]|0)+(c[(c[g>>2]|0)+((c[k>>2]<<1)+1<<2)>>2]|0);if((c[l>>2]|0)>(c[h>>2]|0)){f=4;break}c[(c[f>>2]|0)+(c[k>>2]<<2)>>2]=c[l>>2];c[k>>2]=(c[k>>2]|0)+1}if((f|0)==4){c[m>>2]=1;m=c[m>>2]|0;i=n;return m|0}else if((f|0)==6){c[m>>2]=0;m=c[m>>2]|0;i=n;return m|0}return 0}function _d(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;p=i;i=i+32|0;h=p+24|0;j=p+20|0;k=p+16|0;l=p+12|0;m=p+8|0;o=p+4|0;n=p;c[h>>2]=b;c[j>>2]=d;c[k>>2]=e;c[l>>2]=f;c[m>>2]=g;c[o>>2]=0;while(1){if((c[o>>2]|0)>=(c[m>>2]|0))break;Sf(c[(c[j>>2]|0)+(c[o>>2]<<2)>>2]|0)|0;e=0+((((Sf(c[(c[j>>2]|0)+(c[o>>2]<<2)>>2]|0)|0)-2090&65535)<<16>>16)*2251>>16)&255;a[(c[h>>2]|0)+(c[o>>2]|0)>>0]=e;if((a[(c[h>>2]|0)+(c[o>>2]|0)>>0]|0)<(a[c[k>>2]>>0]|0)){e=(c[h>>2]|0)+(c[o>>2]|0)|0;a[e>>0]=(a[e>>0]|0)+1<<24>>24}if((a[(c[h>>2]|0)+(c[o>>2]|0)>>0]|0)<=63)if((a[(c[h>>2]|0)+(c[o>>2]|0)>>0]|0)<0)f=0;else f=a[(c[h>>2]|0)+(c[o>>2]|0)>>0]|0;else f=63;a[(c[h>>2]|0)+(c[o>>2]|0)>>0]=f;if((c[o>>2]|0)==0&(c[l>>2]|0)==0){f=a[(c[h>>2]|0)+(c[o>>2]|0)>>0]|0;do if(((a[c[k>>2]>>0]|0)+-4|0)>63){if((f|0)>((a[c[k>>2]>>0]|0)+-4|0)){f=(a[c[k>>2]>>0]|0)+-4|0;break}if((a[(c[h>>2]|0)+(c[o>>2]|0)>>0]|0)<63)f=63;else f=a[(c[h>>2]|0)+(c[o>>2]|0)>>0]|0}else if((f|0)<=63)if((a[(c[h>>2]|0)+(c[o>>2]|0)>>0]|0)<((a[c[k>>2]>>0]|0)+-4|0)){f=(a[c[k>>2]>>0]|0)+-4|0;break}else{f=a[(c[h>>2]|0)+(c[o>>2]|0)>>0]|0;break}else f=63;while(0);a[(c[h>>2]|0)+(c[o>>2]|0)>>0]=f;a[c[k>>2]>>0]=a[(c[h>>2]|0)+(c[o>>2]|0)>>0]|0}else{a[(c[h>>2]|0)+(c[o>>2]|0)>>0]=(a[(c[h>>2]|0)+(c[o>>2]|0)>>0]|0)-(a[c[k>>2]>>0]|0);c[n>>2]=8+(a[c[k>>2]>>0]|0);if((a[(c[h>>2]|0)+(c[o>>2]|0)>>0]|0)>(c[n>>2]|0))a[(c[h>>2]|0)+(c[o>>2]|0)>>0]=(c[n>>2]|0)+((a[(c[h>>2]|0)+(c[o>>2]|0)>>0]|0)-(c[n>>2]|0)+1>>1);if((a[(c[h>>2]|0)+(c[o>>2]|0)>>0]|0)<=36)if((a[(c[h>>2]|0)+(c[o>>2]|0)>>0]|0)<-4)f=-4;else f=a[(c[h>>2]|0)+(c[o>>2]|0)>>0]|0;else f=36;a[(c[h>>2]|0)+(c[o>>2]|0)>>0]=f;f=a[(c[h>>2]|0)+(c[o>>2]|0)>>0]|0;if((a[(c[h>>2]|0)+(c[o>>2]|0)>>0]|0)>(c[n>>2]|0)){e=c[k>>2]|0;a[e>>0]=(a[e>>0]|0)+((f<<1)-(c[n>>2]|0))}else{e=c[k>>2]|0;a[e>>0]=(a[e>>0]|0)+f}e=(c[h>>2]|0)+(c[o>>2]|0)|0;a[e>>0]=(a[e>>0]|0)+4}e=Wf($d(((a[c[k>>2]>>0]<<16>>16)*29|0)+((a[c[k>>2]>>0]<<16>>16)*7281>>16)+2090|0,3967)|0)|0;c[(c[j>>2]|0)+(c[o>>2]<<2)>>2]=e;c[o>>2]=(c[o>>2]|0)+1}i=p;return}function $d(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;f=i;i=i+16|0;e=f+4|0;d=f;c[e>>2]=a;c[d>>2]=b;i=f;return ((c[e>>2]|0)<(c[d>>2]|0)?c[e>>2]|0:c[d>>2]|0)|0}function ae(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;q=i;i=i+32|0;h=q+28|0;j=q+24|0;k=q+20|0;l=q+16|0;m=q+12|0;p=q+8|0;o=q+4|0;n=q;c[h>>2]=b;c[j>>2]=d;c[k>>2]=e;c[l>>2]=f;c[m>>2]=g;c[p>>2]=0;while(1){if((c[p>>2]|0)>=(c[m>>2]|0))break;f=a[(c[j>>2]|0)+(c[p>>2]|0)>>0]|0;do if(!((c[p>>2]|0)==0&(c[l>>2]|0)==0)){c[o>>2]=f+-4;c[n>>2]=8+(a[c[k>>2]>>0]|0);f=c[o>>2]|0;if((c[o>>2]|0)>(c[n>>2]|0)){e=c[k>>2]|0;a[e>>0]=(a[e>>0]|0)+((f<<1)-(c[n>>2]|0));break}else{e=c[k>>2]|0;a[e>>0]=(a[e>>0]|0)+f;break}}else{e=(be(f,(a[c[k>>2]>>0]|0)-16|0)|0)&255;a[c[k>>2]>>0]=e}while(0);if((a[c[k>>2]>>0]|0)<=63)if((a[c[k>>2]>>0]|0)<0)f=0;else f=a[c[k>>2]>>0]|0;else f=63;a[c[k>>2]>>0]=f;e=Wf($d(((a[c[k>>2]>>0]<<16>>16)*29|0)+((a[c[k>>2]>>0]<<16>>16)*7281>>16)+2090|0,3967)|0)|0;c[(c[h>>2]|0)+(c[p>>2]<<2)>>2]=e;c[p>>2]=(c[p>>2]|0)+1}i=q;return}function be(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;f=i;i=i+16|0;e=f+4|0;d=f;c[e>>2]=a;c[d>>2]=b;i=f;return ((c[e>>2]|0)>(c[d>>2]|0)?c[e>>2]|0:c[d>>2]|0)|0}function ce(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;j=i;i=i+16|0;e=j+12|0;f=j+8|0;h=j+4|0;g=j;c[e>>2]=b;c[f>>2]=d;c[g>>2]=0;c[h>>2]=0;while(1){if((c[h>>2]|0)>=(c[f>>2]|0))break;c[g>>2]=(a[(c[e>>2]|0)+(c[h>>2]|0)>>0]|0)+(c[g>>2]<<8);c[h>>2]=(c[h>>2]|0)+1}i=j;return c[g>>2]|0}function de(a,d,e,f,g){a=a|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0;o=i;i=i+32|0;h=o+20|0;j=o+16|0;k=o+12|0;l=o+8|0;m=o+4|0;n=o;c[h>>2]=a;c[j>>2]=d;c[k>>2]=e;c[l>>2]=f;c[m>>2]=g;c[n>>2]=0;while(1){if((c[n>>2]|0)>=(c[m>>2]|0))break;a=(b[(c[j>>2]|0)+(c[n>>2]<<1)>>1]|0)+((_(((b[(c[k>>2]|0)+(c[n>>2]<<1)>>1]|0)-(b[(c[j>>2]|0)+(c[n>>2]<<1)>>1]|0)&65535)<<16>>16,(c[l>>2]&65535)<<16>>16)|0)>>2)&65535;b[(c[h>>2]|0)+(c[n>>2]<<1)>>1]=a;c[n>>2]=(c[n>>2]|0)+1}i=o;return}function ee(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;m=i;i=i+48|0;g=m+36|0;h=m+32|0;j=m+28|0;l=m+16|0;k=m+8|0;e=m+4|0;f=m;c[g>>2]=a;c[h>>2]=b;c[j>>2]=d;c[e>>2]=0;c[f>>2]=0;if(!(c[(c[g>>2]|0)+12>>2]|0)){i=m;return}c[e>>2]=256-(c[(c[g>>2]|0)+8>>2]|0)<<10;c[f>>2]=c[e>>2]>>16;c[e>>2]=(c[e>>2]|0)-(c[f>>2]<<16);fe(l,k,c[f>>2]|0,c[e>>2]|0);if(((c[(c[g>>2]|0)+8>>2]|0)+(c[(c[g>>2]|0)+12>>2]|0)|0)<=256)if(((c[(c[g>>2]|0)+8>>2]|0)+(c[(c[g>>2]|0)+12>>2]|0)|0)<0)e=0;else e=(c[(c[g>>2]|0)+8>>2]|0)+(c[(c[g>>2]|0)+12>>2]|0)|0;else e=256;c[(c[g>>2]|0)+8>>2]=e;Nf(c[h>>2]|0,l,k,c[g>>2]|0,c[h>>2]|0,c[j>>2]|0,1);i=m;return}function fe(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0;m=i;i=i+32|0;f=m+20|0;g=m+16|0;h=m+12|0;j=m+8|0;l=m+4|0;k=m;c[f>>2]=a;c[g>>2]=b;c[h>>2]=d;c[j>>2]=e;if((c[h>>2]|0)>=4){l=c[f>>2]|0;c[l>>2]=c[4473];c[l+4>>2]=c[4474];c[l+8>>2]=c[4475];l=c[g>>2]|0;c[l>>2]=c[4484];c[l+4>>2]=c[4485];i=m;return}if((c[j>>2]|0)<=0){l=c[f>>2]|0;k=17844+((c[h>>2]|0)*12|0)|0;c[l>>2]=c[k>>2];c[l+4>>2]=c[k+4>>2];c[l+8>>2]=c[k+8>>2];l=c[g>>2]|0;k=17904+(c[h>>2]<<3)|0;c[l>>2]=c[k>>2];c[l+4>>2]=c[k+4>>2];i=m;return}d=(c[j>>2]|0)<32768;c[l>>2]=0;if(d){while(1){if((c[l>>2]|0)>=3)break;d=_((c[17844+(((c[h>>2]|0)+1|0)*12|0)+(c[l>>2]<<2)>>2]|0)-(c[17844+((c[h>>2]|0)*12|0)+(c[l>>2]<<2)>>2]|0)>>16,(c[j>>2]&65535)<<16>>16)|0;d=(c[17844+((c[h>>2]|0)*12|0)+(c[l>>2]<<2)>>2]|0)+(d+((_((c[17844+(((c[h>>2]|0)+1|0)*12|0)+(c[l>>2]<<2)>>2]|0)-(c[17844+((c[h>>2]|0)*12|0)+(c[l>>2]<<2)>>2]|0)&65535,(c[j>>2]&65535)<<16>>16)|0)>>16))|0;c[(c[f>>2]|0)+(c[l>>2]<<2)>>2]=d;c[l>>2]=(c[l>>2]|0)+1}c[k>>2]=0;while(1){if((c[k>>2]|0)>=2)break;l=_((c[17904+((c[h>>2]|0)+1<<3)+(c[k>>2]<<2)>>2]|0)-(c[17904+(c[h>>2]<<3)+(c[k>>2]<<2)>>2]|0)>>16,(c[j>>2]&65535)<<16>>16)|0;l=(c[17904+(c[h>>2]<<3)+(c[k>>2]<<2)>>2]|0)+(l+((_((c[17904+((c[h>>2]|0)+1<<3)+(c[k>>2]<<2)>>2]|0)-(c[17904+(c[h>>2]<<3)+(c[k>>2]<<2)>>2]|0)&65535,(c[j>>2]&65535)<<16>>16)|0)>>16))|0;c[(c[g>>2]|0)+(c[k>>2]<<2)>>2]=l;c[k>>2]=(c[k>>2]|0)+1}i=m;return}else{while(1){if((c[l>>2]|0)>=3)break;d=_((c[17844+(((c[h>>2]|0)+1|0)*12|0)+(c[l>>2]<<2)>>2]|0)-(c[17844+((c[h>>2]|0)*12|0)+(c[l>>2]<<2)>>2]|0)>>16,((c[j>>2]|0)-65536&65535)<<16>>16)|0;d=(c[17844+(((c[h>>2]|0)+1|0)*12|0)+(c[l>>2]<<2)>>2]|0)+(d+((_((c[17844+(((c[h>>2]|0)+1|0)*12|0)+(c[l>>2]<<2)>>2]|0)-(c[17844+((c[h>>2]|0)*12|0)+(c[l>>2]<<2)>>2]|0)&65535,((c[j>>2]|0)-65536&65535)<<16>>16)|0)>>16))|0;c[(c[f>>2]|0)+(c[l>>2]<<2)>>2]=d;c[l>>2]=(c[l>>2]|0)+1}c[k>>2]=0;while(1){if((c[k>>2]|0)>=2)break;l=_((c[17904+((c[h>>2]|0)+1<<3)+(c[k>>2]<<2)>>2]|0)-(c[17904+(c[h>>2]<<3)+(c[k>>2]<<2)>>2]|0)>>16,((c[j>>2]|0)-65536&65535)<<16>>16)|0;l=(c[17904+((c[h>>2]|0)+1<<3)+(c[k>>2]<<2)>>2]|0)+(l+((_((c[17904+((c[h>>2]|0)+1<<3)+(c[k>>2]<<2)>>2]|0)-(c[17904+(c[h>>2]<<3)+(c[k>>2]<<2)>>2]|0)&65535,((c[j>>2]|0)-65536&65535)<<16>>16)|0)>>16))|0;c[(c[g>>2]|0)+(c[k>>2]<<2)>>2]=l;c[k>>2]=(c[k>>2]|0)+1}i=m;return}}function ge(e,f,g){e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;t=i;i=i+144|0;m=t+24|0;h=t+20|0;n=t+16|0;r=t+12|0;l=t+128|0;j=t+96|0;s=t+64|0;q=t+32|0;p=t+8|0;o=t+4|0;k=t;c[m>>2]=e;c[h>>2]=f;c[n>>2]=g;g=_(a[c[h>>2]>>0]|0,b[(c[n>>2]|0)+2>>1]|0)|0;c[k>>2]=(c[(c[n>>2]|0)+8>>2]|0)+g;c[r>>2]=0;while(1){if((c[r>>2]|0)>=(b[(c[n>>2]|0)+2>>1]|0))break;b[(c[m>>2]|0)+(c[r>>2]<<1)>>1]=d[(c[k>>2]|0)+(c[r>>2]|0)>>0]<<7;c[r>>2]=(c[r>>2]|0)+1}nf(j,l,c[n>>2]|0,a[c[h>>2]>>0]|0);he(s,(c[h>>2]|0)+1|0,l,b[(c[n>>2]|0)+4>>1]|0,b[(c[n>>2]|0)+2>>1]|0);fg(q,c[m>>2]|0,b[(c[n>>2]|0)+2>>1]|0);c[r>>2]=0;while(1){if((c[r>>2]|0)>=(b[(c[n>>2]|0)+2>>1]|0))break;c[p>>2]=ie(b[q+(c[r>>2]<<1)>>1]<<16)|0;c[o>>2]=(b[(c[m>>2]|0)+(c[r>>2]<<1)>>1]|0)+((b[s+(c[r>>2]<<1)>>1]<<14|0)/(c[p>>2]|0)|0);if((c[o>>2]|0)>32767)h=32767;else h=(c[o>>2]|0)<0?0:c[o>>2]|0;b[(c[m>>2]|0)+(c[r>>2]<<1)>>1]=h;c[r>>2]=(c[r>>2]|0)+1}cg(c[m>>2]|0,c[(c[n>>2]|0)+32>>2]|0,b[(c[n>>2]|0)+2>>1]|0);i=t;return}function he(e,f,g,h,j){e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;r=i;i=i+32|0;k=r+24|0;l=r+20|0;m=r+16|0;n=r+12|0;s=r+28|0;o=r+8|0;p=r+4|0;q=r;c[k>>2]=e;c[l>>2]=f;c[m>>2]=g;c[n>>2]=h;b[s>>1]=j;c[p>>2]=0;c[o>>2]=(b[s>>1]|0)-1;while(1){if((c[o>>2]|0)<0)break;c[q>>2]=(_((c[p>>2]&65535)<<16>>16,d[(c[m>>2]|0)+(c[o>>2]|0)>>0]|0)|0)>>8;c[p>>2]=a[(c[l>>2]|0)+(c[o>>2]|0)>>0]<<10;f=c[p>>2]|0;if((c[p>>2]|0)<=0){if((f|0)<0)c[p>>2]=(c[p>>2]|0)+102}else c[p>>2]=f-102;s=_(c[p>>2]>>16,(c[n>>2]&65535)<<16>>16)|0;c[p>>2]=(c[q>>2]|0)+(s+((_(c[p>>2]&65535,(c[n>>2]&65535)<<16>>16)|0)>>16));b[(c[k>>2]|0)+(c[o>>2]<<1)>>1]=c[p>>2];c[o>>2]=(c[o>>2]|0)+-1}i=r;return}function ie(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;h=i;i=i+32|0;b=h+16|0;d=h+12|0;g=h+8|0;f=h+4|0;e=h;c[d>>2]=a;if((c[d>>2]|0)<=0){c[b>>2]=0;g=c[b>>2]|0;i=h;return g|0}je(c[d>>2]|0,f,e);if(c[f>>2]&1|0)c[g>>2]=32768;else c[g>>2]=46214;c[g>>2]=c[g>>2]>>(c[f>>2]>>1);a=_(c[g>>2]>>16,(((c[e>>2]&65535)<<16>>16)*213&65535)<<16>>16)|0;c[g>>2]=(c[g>>2]|0)+(a+((_(c[g>>2]&65535,(((c[e>>2]&65535)<<16>>16)*213&65535)<<16>>16)|0)>>16));c[b>>2]=c[g>>2];g=c[b>>2]|0;i=h;return g|0}function je(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;e=i;i=i+16|0;h=e+12|0;j=e+8|0;f=e+4|0;g=e;c[h>>2]=a;c[j>>2]=b;c[f>>2]=d;c[g>>2]=ke(c[h>>2]|0)|0;c[c[j>>2]>>2]=c[g>>2];b=(le(c[h>>2]|0,24-(c[g>>2]|0)|0)|0)&127;c[c[f>>2]>>2]=b;i=e;return}function ke(a){a=a|0;var b=0,d=0;d=i;i=i+16|0;b=d;c[b>>2]=a;if(!(c[b>>2]|0)){a=32;i=d;return a|0}a=32-(32-(aa(c[b>>2]|0)|0))|0;i=d;return a|0}function le(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0;k=i;i=i+32|0;e=k+20|0;d=k+16|0;f=k+12|0;j=k+8|0;h=k+4|0;g=k;c[d>>2]=a;c[f>>2]=b;c[j>>2]=c[d>>2];c[h>>2]=c[f>>2];c[g>>2]=0-(c[f>>2]|0);if(!(c[f>>2]|0)){c[e>>2]=c[d>>2];j=c[e>>2]|0;i=k;return j|0}d=c[j>>2]|0;if((c[f>>2]|0)<0){c[e>>2]=d<<c[g>>2]|(c[j>>2]|0)>>>(32-(c[g>>2]|0)|0);j=c[e>>2]|0;i=k;return j|0}else{c[e>>2]=d<<32-(c[h>>2]|0)|(c[j>>2]|0)>>>(c[h>>2]|0);j=c[e>>2]|0;i=k;return j|0}return 0}function me(d,e,f,g,h,j,k,l,m,n,o,p,q,r,s){d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|0;m=m|0;n=n|0;o=o|0;p=p|0;q=q|0;r=r|0;s=s|0;var t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0;T=i;i=i+112|0;t=T+100|0;u=T+96|0;B=T+92|0;C=T+88|0;D=T+84|0;E=T+80|0;F=T+76|0;G=T+72|0;H=T+68|0;I=T+64|0;v=T+60|0;w=T+56|0;x=T+52|0;y=T+48|0;z=T+44|0;O=T+40|0;P=T+36|0;S=T+32|0;N=T+28|0;K=T+24|0;L=T+20|0;J=T+16|0;R=T+12|0;M=T+8|0;Q=T+4|0;A=T;c[t>>2]=d;c[u>>2]=e;c[B>>2]=f;c[C>>2]=g;c[D>>2]=h;c[E>>2]=j;c[F>>2]=k;c[G>>2]=l;c[H>>2]=m;c[I>>2]=n;c[v>>2]=o;c[w>>2]=p;c[x>>2]=q;c[y>>2]=r;c[z>>2]=s;c[(c[u>>2]|0)+4368>>2]=a[(c[B>>2]|0)+34>>0];c[P>>2]=c[(c[u>>2]|0)+4356>>2];c[Q>>2]=b[24558+(a[(c[B>>2]|0)+29>>0]>>1<<2)+(a[(c[B>>2]|0)+30>>0]<<1)>>1];if((a[(c[B>>2]|0)+31>>0]|0)==4)c[N>>2]=0;else c[N>>2]=1;p=(c[(c[t>>2]|0)+4616>>2]|0)+(c[(c[t>>2]|0)+4608>>2]|0)|0;c[A>>2]=ia()|0;l=i;i=i+((1*(p<<2)|0)+15&-16)|0;p=i;i=i+((1*((c[(c[t>>2]|0)+4616>>2]|0)+(c[(c[t>>2]|0)+4608>>2]|0)<<1)|0)+15&-16)|0;m=i;i=i+((1*(c[(c[t>>2]|0)+4612>>2]<<2)|0)+15&-16)|0;c[(c[u>>2]|0)+4364>>2]=c[(c[t>>2]|0)+4616>>2];c[(c[u>>2]|0)+4360>>2]=c[(c[t>>2]|0)+4616>>2];c[R>>2]=(c[u>>2]|0)+(c[(c[t>>2]|0)+4616>>2]<<1);c[O>>2]=0;while(1){if((c[O>>2]|0)>=(c[(c[t>>2]|0)+4604>>2]|0))break;c[K>>2]=(c[E>>2]|0)+((c[O>>2]>>1|1-(c[N>>2]|0))<<4<<1);c[L>>2]=(c[F>>2]|0)+((c[O>>2]|0)*5<<1);c[J>>2]=(c[G>>2]|0)+(c[O>>2]<<4<<1);c[M>>2]=c[(c[H>>2]|0)+(c[O>>2]<<2)>>2]>>2;c[M>>2]=c[M>>2]|c[(c[H>>2]|0)+(c[O>>2]<<2)>>2]>>1<<16;c[(c[u>>2]|0)+4376>>2]=0;if((a[(c[B>>2]|0)+29>>0]|0)==2?(c[P>>2]=c[(c[x>>2]|0)+(c[O>>2]<<2)>>2],(c[O>>2]&3-(c[N>>2]<<1)|0)==0):0){c[S>>2]=(c[(c[t>>2]|0)+4616>>2]|0)-(c[P>>2]|0)-(c[(c[t>>2]|0)+4664>>2]|0)-2;g=(c[S>>2]|0)+(_(c[O>>2]|0,c[(c[t>>2]|0)+4612>>2]|0)|0)|0;Xf(p+(c[S>>2]<<1)|0,(c[u>>2]|0)+(g<<1)|0,c[K>>2]|0,(c[(c[t>>2]|0)+4616>>2]|0)-(c[S>>2]|0)|0,c[(c[t>>2]|0)+4664>>2]|0,c[(c[t>>2]|0)+5124>>2]|0);c[(c[u>>2]|0)+4376>>2]=1;c[(c[u>>2]|0)+4360>>2]=c[(c[t>>2]|0)+4616>>2]}ne(c[t>>2]|0,c[u>>2]|0,c[C>>2]|0,m,p,l,c[O>>2]|0,c[z>>2]|0,c[w>>2]|0,c[x>>2]|0,a[(c[B>>2]|0)+29>>0]|0);re(c[u>>2]|0,a[(c[B>>2]|0)+29>>0]|0,m,c[D>>2]|0,c[R>>2]|0,l,c[K>>2]|0,c[L>>2]|0,c[J>>2]|0,c[P>>2]|0,c[M>>2]|0,c[(c[I>>2]|0)+(c[O>>2]<<2)>>2]|0,c[(c[v>>2]|0)+(c[O>>2]<<2)>>2]|0,c[(c[w>>2]|0)+(c[O>>2]<<2)>>2]|0,c[y>>2]|0,c[Q>>2]|0,c[(c[t>>2]|0)+4612>>2]|0,c[(c[t>>2]|0)+4660>>2]|0,c[(c[t>>2]|0)+4664>>2]|0);c[C>>2]=(c[C>>2]|0)+(c[(c[t>>2]|0)+4612>>2]<<2);c[D>>2]=(c[D>>2]|0)+(c[(c[t>>2]|0)+4612>>2]|0);c[R>>2]=(c[R>>2]|0)+(c[(c[t>>2]|0)+4612>>2]<<1);c[O>>2]=(c[O>>2]|0)+1}c[(c[u>>2]|0)+4356>>2]=c[(c[x>>2]|0)+((c[(c[t>>2]|0)+4604>>2]|0)-1<<2)>>2];qj(c[u>>2]|0,(c[u>>2]|0)+(c[(c[t>>2]|0)+4608>>2]<<1)|0,c[(c[t>>2]|0)+4616>>2]<<1|0)|0;qj((c[u>>2]|0)+1280|0,(c[u>>2]|0)+1280+(c[(c[t>>2]|0)+4608>>2]<<2)|0,c[(c[t>>2]|0)+4616>>2]<<2|0)|0;na(c[A>>2]|0);i=T;return}function ne(a,d,e,f,g,h,j,k,l,m,n){a=a|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|0;m=m|0;n=n|0;var o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;D=i;i=i+64|0;o=D+60|0;p=D+56|0;r=D+52|0;s=D+48|0;t=D+44|0;u=D+40|0;v=D+36|0;w=D+32|0;x=D+28|0;E=D+24|0;q=D+20|0;z=D+16|0;C=D+12|0;y=D+8|0;B=D+4|0;A=D;c[o>>2]=a;c[p>>2]=d;c[r>>2]=e;c[s>>2]=f;c[t>>2]=g;c[u>>2]=h;c[v>>2]=j;c[w>>2]=k;c[x>>2]=l;c[E>>2]=m;c[q>>2]=n;c[C>>2]=c[(c[E>>2]|0)+(c[v>>2]<<2)>>2];if((c[(c[x>>2]|0)+(c[v>>2]<<2)>>2]|0)>1)l=c[(c[x>>2]|0)+(c[v>>2]<<2)>>2]|0;else l=1;c[B>>2]=oe(l,47)|0;if((c[(c[x>>2]|0)+(c[v>>2]<<2)>>2]|0)!=(c[(c[p>>2]|0)+4372>>2]|0))c[y>>2]=qe(c[(c[p>>2]|0)+4372>>2]|0,c[(c[x>>2]|0)+(c[v>>2]<<2)>>2]|0,16)|0;else c[y>>2]=65536;c[A>>2]=(c[B>>2]>>7)+1>>1;c[z>>2]=0;while(1){if((c[z>>2]|0)>=(c[(c[o>>2]|0)+4612>>2]|0))break;E=_(c[(c[r>>2]|0)+(c[z>>2]<<2)>>2]>>16,(c[A>>2]&65535)<<16>>16)|0;E=E+((_(c[(c[r>>2]|0)+(c[z>>2]<<2)>>2]&65535,(c[A>>2]&65535)<<16>>16)|0)>>16)|0;E=E+(_(c[(c[r>>2]|0)+(c[z>>2]<<2)>>2]|0,(c[A>>2]>>15)+1>>1)|0)|0;c[(c[s>>2]|0)+(c[z>>2]<<2)>>2]=E;c[z>>2]=(c[z>>2]|0)+1}c[(c[p>>2]|0)+4372>>2]=c[(c[x>>2]|0)+(c[v>>2]<<2)>>2];a:do if(c[(c[p>>2]|0)+4376>>2]|0){if(!(c[v>>2]|0)){E=_(c[B>>2]>>16,(c[w>>2]&65535)<<16>>16)|0;c[B>>2]=E+((_(c[B>>2]&65535,(c[w>>2]&65535)<<16>>16)|0)>>16)<<2}c[z>>2]=(c[(c[p>>2]|0)+4360>>2]|0)-(c[C>>2]|0)-2;while(1){if((c[z>>2]|0)>=(c[(c[p>>2]|0)+4360>>2]|0))break a;E=_(c[B>>2]>>16,b[(c[t>>2]|0)+(c[z>>2]<<1)>>1]|0)|0;E=E+((_(c[B>>2]&65535,b[(c[t>>2]|0)+(c[z>>2]<<1)>>1]|0)|0)>>16)|0;c[(c[u>>2]|0)+(c[z>>2]<<2)>>2]=E;c[z>>2]=(c[z>>2]|0)+1}}while(0);if((c[y>>2]|0)==65536){i=D;return}c[z>>2]=(c[(c[p>>2]|0)+4364>>2]|0)-(c[(c[o>>2]|0)+4616>>2]|0);while(1){if((c[z>>2]|0)>=(c[(c[p>>2]|0)+4364>>2]|0))break;E=_(c[y>>2]>>16,(c[(c[p>>2]|0)+1280+(c[z>>2]<<2)>>2]&65535)<<16>>16)|0;E=E+((_(c[y>>2]&65535,(c[(c[p>>2]|0)+1280+(c[z>>2]<<2)>>2]&65535)<<16>>16)|0)>>16)|0;E=E+(_(c[y>>2]|0,(c[(c[p>>2]|0)+1280+(c[z>>2]<<2)>>2]>>15)+1>>1)|0)|0;c[(c[p>>2]|0)+1280+(c[z>>2]<<2)>>2]=E;c[z>>2]=(c[z>>2]|0)+1}b:do if((c[q>>2]|0)==2?(c[(c[p>>2]|0)+4376>>2]|0)==0:0){c[z>>2]=(c[(c[p>>2]|0)+4360>>2]|0)-(c[C>>2]|0)-2;while(1){if((c[z>>2]|0)>=(c[(c[p>>2]|0)+4360>>2]|0))break b;E=_(c[y>>2]>>16,(c[(c[u>>2]|0)+(c[z>>2]<<2)>>2]&65535)<<16>>16)|0;E=E+((_(c[y>>2]&65535,(c[(c[u>>2]|0)+(c[z>>2]<<2)>>2]&65535)<<16>>16)|0)>>16)|0;E=E+(_(c[y>>2]|0,(c[(c[u>>2]|0)+(c[z>>2]<<2)>>2]>>15)+1>>1)|0)|0;c[(c[u>>2]|0)+(c[z>>2]<<2)>>2]=E;c[z>>2]=(c[z>>2]|0)+1}}while(0);E=_(c[y>>2]>>16,(c[(c[p>>2]|0)+4352>>2]&65535)<<16>>16)|0;E=E+((_(c[y>>2]&65535,(c[(c[p>>2]|0)+4352>>2]&65535)<<16>>16)|0)>>16)|0;E=E+(_(c[y>>2]|0,(c[(c[p>>2]|0)+4352>>2]>>15)+1>>1)|0)|0;c[(c[p>>2]|0)+4352>>2]=E;c[z>>2]=0;while(1){if((c[z>>2]|0)>=32)break;E=_(c[y>>2]>>16,(c[(c[p>>2]|0)+3840+(c[z>>2]<<2)>>2]&65535)<<16>>16)|0;E=E+((_(c[y>>2]&65535,(c[(c[p>>2]|0)+3840+(c[z>>2]<<2)>>2]&65535)<<16>>16)|0)>>16)|0;E=E+(_(c[y>>2]|0,(c[(c[p>>2]|0)+3840+(c[z>>2]<<2)>>2]>>15)+1>>1)|0)|0;c[(c[p>>2]|0)+3840+(c[z>>2]<<2)>>2]=E;c[z>>2]=(c[z>>2]|0)+1}c[z>>2]=0;while(1){if((c[z>>2]|0)>=16)break;E=_(c[y>>2]>>16,(c[(c[p>>2]|0)+4288+(c[z>>2]<<2)>>2]&65535)<<16>>16)|0;E=E+((_(c[y>>2]&65535,(c[(c[p>>2]|0)+4288+(c[z>>2]<<2)>>2]&65535)<<16>>16)|0)>>16)|0;E=E+(_(c[y>>2]|0,(c[(c[p>>2]|0)+4288+(c[z>>2]<<2)>>2]>>15)+1>>1)|0)|0;c[(c[p>>2]|0)+4288+(c[z>>2]<<2)>>2]=E;c[z>>2]=(c[z>>2]|0)+1}i=D;return}function oe(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;h=i;i=i+48|0;f=h+32|0;n=h+28|0;d=h+24|0;j=h+20|0;g=h+16|0;k=h+12|0;m=h+8|0;l=h+4|0;e=h;c[n>>2]=a;c[d>>2]=b;b=c[n>>2]|0;c[j>>2]=(pe((c[n>>2]|0)>0?b:0-b|0)|0)-1;c[m>>2]=c[n>>2]<<c[j>>2];c[k>>2]=536870911/(c[m>>2]>>16|0)|0;c[e>>2]=c[k>>2]<<16;b=_(c[m>>2]>>16,(c[k>>2]&65535)<<16>>16)|0;c[l>>2]=536870912-(b+((_(c[m>>2]&65535,(c[k>>2]&65535)<<16>>16)|0)>>16))<<3;b=_(c[l>>2]>>16,(c[k>>2]&65535)<<16>>16)|0;b=(c[e>>2]|0)+(b+((_(c[l>>2]&65535,(c[k>>2]&65535)<<16>>16)|0)>>16))|0;c[e>>2]=b+(_(c[l>>2]|0,(c[k>>2]>>15)+1>>1)|0);c[g>>2]=61-(c[j>>2]|0)-(c[d>>2]|0);b=c[g>>2]|0;if((c[g>>2]|0)>0)if((b|0)<32){c[f>>2]=c[e>>2]>>c[g>>2];n=c[f>>2]|0;i=h;return n|0}else{c[f>>2]=0;n=c[f>>2]|0;i=h;return n|0}a=c[e>>2]|0;d=0-(c[g>>2]|0)|0;do if((-2147483648>>0-b|0)>(2147483647>>0-(c[g>>2]|0)|0)){if((a|0)>(-2147483648>>d|0)){b=-2147483648>>0-(c[g>>2]|0);break}if((c[e>>2]|0)<(2147483647>>0-(c[g>>2]|0)|0)){b=2147483647>>0-(c[g>>2]|0);break}else{b=c[e>>2]|0;break}}else{if((a|0)>(2147483647>>d|0)){b=2147483647>>0-(c[g>>2]|0);break}if((c[e>>2]|0)<(-2147483648>>0-(c[g>>2]|0)|0)){b=-2147483648>>0-(c[g>>2]|0);break}else{b=c[e>>2]|0;break}}while(0);c[f>>2]=b<<0-(c[g>>2]|0);n=c[f>>2]|0;i=h;return n|0}function pe(a){a=a|0;var b=0,d=0;d=i;i=i+16|0;b=d;c[b>>2]=a;if(!(c[b>>2]|0)){a=32;i=d;return a|0}a=32-(32-(aa(c[b>>2]|0)|0))|0;i=d;return a|0}function qe(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;h=i;i=i+48|0;f=h+40|0;q=h+36|0;p=h+32|0;j=h+28|0;l=h+24|0;k=h+20|0;g=h+16|0;m=h+12|0;n=h+8|0;o=h+4|0;e=h;c[q>>2]=a;c[p>>2]=b;c[j>>2]=d;b=c[q>>2]|0;c[l>>2]=(pe((c[q>>2]|0)>0?b:0-b|0)|0)-1;c[n>>2]=c[q>>2]<<c[l>>2];b=c[p>>2]|0;c[k>>2]=(pe((c[p>>2]|0)>0?b:0-b|0)|0)-1;c[o>>2]=c[p>>2]<<c[k>>2];c[m>>2]=536870911/(c[o>>2]>>16|0)|0;b=_(c[n>>2]>>16,(c[m>>2]&65535)<<16>>16)|0;c[e>>2]=b+((_(c[n>>2]&65535,(c[m>>2]&65535)<<16>>16)|0)>>16);b=c[n>>2]|0;a=c[o>>2]|0;d=c[e>>2]|0;d=yj(a|0,((a|0)<0)<<31>>31|0,d|0,((d|0)<0)<<31>>31|0)|0;d=nj(d|0,C|0,32)|0;c[n>>2]=b-(d<<3);d=_(c[n>>2]>>16,(c[m>>2]&65535)<<16>>16)|0;c[e>>2]=(c[e>>2]|0)+(d+((_(c[n>>2]&65535,(c[m>>2]&65535)<<16>>16)|0)>>16));c[g>>2]=29+(c[l>>2]|0)-(c[k>>2]|0)-(c[j>>2]|0);d=c[g>>2]|0;if((c[g>>2]|0)>=0)if((d|0)<32){c[f>>2]=c[e>>2]>>c[g>>2];q=c[f>>2]|0;i=h;return q|0}else{c[f>>2]=0;q=c[f>>2]|0;i=h;return q|0}a=c[e>>2]|0;b=0-(c[g>>2]|0)|0;do if((-2147483648>>0-d|0)>(2147483647>>0-(c[g>>2]|0)|0)){if((a|0)>(-2147483648>>b|0)){d=-2147483648>>0-(c[g>>2]|0);break}if((c[e>>2]|0)<(2147483647>>0-(c[g>>2]|0)|0)){d=2147483647>>0-(c[g>>2]|0);break}else{d=c[e>>2]|0;break}}else{if((a|0)>(2147483647>>b|0)){d=2147483647>>0-(c[g>>2]|0);break}if((c[e>>2]|0)<(-2147483648>>0-(c[g>>2]|0)|0)){d=-2147483648>>0-(c[g>>2]|0);break}else{d=c[e>>2]|0;break}}while(0);c[f>>2]=d<<0-(c[g>>2]|0);q=c[f>>2]|0;i=h;return q|0}function re(d,e,f,g,h,j,k,l,m,n,o,p,q,r,s,t,u,v,w){d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|0;m=m|0;n=n|0;o=o|0;p=p|0;q=q|0;r=r|0;s=s|0;t=t|0;u=u|0;v=v|0;w=w|0;var x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0;ma=i;i=i+176|0;ka=ma+168|0;x=ma+164|0;F=ma+160|0;G=ma+156|0;H=ma+152|0;I=ma+148|0;J=ma+144|0;K=ma+140|0;L=ma+136|0;M=ma+132|0;y=ma+128|0;z=ma+124|0;A=ma+120|0;na=ma+116|0;B=ma+112|0;C=ma+108|0;la=ma+104|0;D=ma+100|0;E=ma+96|0;S=ma+92|0;T=ma+88|0;Q=ma+84|0;P=ma+80|0;U=ma+76|0;W=ma+72|0;V=ma+68|0;ba=ma+64|0;ea=ma+60|0;Z=ma+56|0;$=ma+52|0;aa=ma+48|0;ca=ma+44|0;da=ma+40|0;R=ma+36|0;O=ma+32|0;ja=ma+28|0;N=ma+24|0;ha=ma+20|0;ia=ma+16|0;fa=ma+12|0;Y=ma+8|0;ga=ma+4|0;X=ma;c[ka>>2]=d;c[x>>2]=e;c[F>>2]=f;c[G>>2]=g;c[H>>2]=h;c[I>>2]=j;c[J>>2]=k;c[K>>2]=l;c[L>>2]=m;c[M>>2]=n;c[y>>2]=o;c[z>>2]=p;c[A>>2]=q;c[na>>2]=r;c[B>>2]=s;c[C>>2]=t;c[la>>2]=u;c[D>>2]=v;c[E>>2]=w;c[ga>>2]=(c[ka>>2]|0)+1280+((c[(c[ka>>2]|0)+4364>>2]|0)-(c[M>>2]|0)+1<<2);c[X>>2]=(c[I>>2]|0)+((c[(c[ka>>2]|0)+4360>>2]|0)-(c[M>>2]|0)+2<<2);c[N>>2]=c[na>>2]>>6;c[Y>>2]=(c[ka>>2]|0)+3840+124;c[S>>2]=0;while(1){m=c[ka>>2]|0;if((c[S>>2]|0)>=(c[la>>2]|0))break;na=907633515+(_(c[m+4368>>2]|0,196314165)|0)|0;c[(c[ka>>2]|0)+4368>>2]=na;c[P>>2]=c[E>>2]>>1;na=_(c[c[Y>>2]>>2]>>16,b[c[J>>2]>>1]|0)|0;c[P>>2]=(c[P>>2]|0)+(na+((_(c[c[Y>>2]>>2]&65535,b[c[J>>2]>>1]|0)|0)>>16));na=_(c[(c[Y>>2]|0)+-4>>2]>>16,b[(c[J>>2]|0)+2>>1]|0)|0;c[P>>2]=(c[P>>2]|0)+(na+((_(c[(c[Y>>2]|0)+-4>>2]&65535,b[(c[J>>2]|0)+2>>1]|0)|0)>>16));na=_(c[(c[Y>>2]|0)+-8>>2]>>16,b[(c[J>>2]|0)+4>>1]|0)|0;c[P>>2]=(c[P>>2]|0)+(na+((_(c[(c[Y>>2]|0)+-8>>2]&65535,b[(c[J>>2]|0)+4>>1]|0)|0)>>16));na=_(c[(c[Y>>2]|0)+-12>>2]>>16,b[(c[J>>2]|0)+6>>1]|0)|0;c[P>>2]=(c[P>>2]|0)+(na+((_(c[(c[Y>>2]|0)+-12>>2]&65535,b[(c[J>>2]|0)+6>>1]|0)|0)>>16));na=_(c[(c[Y>>2]|0)+-16>>2]>>16,b[(c[J>>2]|0)+8>>1]|0)|0;c[P>>2]=(c[P>>2]|0)+(na+((_(c[(c[Y>>2]|0)+-16>>2]&65535,b[(c[J>>2]|0)+8>>1]|0)|0)>>16));na=_(c[(c[Y>>2]|0)+-20>>2]>>16,b[(c[J>>2]|0)+10>>1]|0)|0;c[P>>2]=(c[P>>2]|0)+(na+((_(c[(c[Y>>2]|0)+-20>>2]&65535,b[(c[J>>2]|0)+10>>1]|0)|0)>>16));na=_(c[(c[Y>>2]|0)+-24>>2]>>16,b[(c[J>>2]|0)+12>>1]|0)|0;c[P>>2]=(c[P>>2]|0)+(na+((_(c[(c[Y>>2]|0)+-24>>2]&65535,b[(c[J>>2]|0)+12>>1]|0)|0)>>16));na=_(c[(c[Y>>2]|0)+-28>>2]>>16,b[(c[J>>2]|0)+14>>1]|0)|0;c[P>>2]=(c[P>>2]|0)+(na+((_(c[(c[Y>>2]|0)+-28>>2]&65535,b[(c[J>>2]|0)+14>>1]|0)|0)>>16));na=_(c[(c[Y>>2]|0)+-32>>2]>>16,b[(c[J>>2]|0)+16>>1]|0)|0;c[P>>2]=(c[P>>2]|0)+(na+((_(c[(c[Y>>2]|0)+-32>>2]&65535,b[(c[J>>2]|0)+16>>1]|0)|0)>>16));na=_(c[(c[Y>>2]|0)+-36>>2]>>16,b[(c[J>>2]|0)+18>>1]|0)|0;c[P>>2]=(c[P>>2]|0)+(na+((_(c[(c[Y>>2]|0)+-36>>2]&65535,b[(c[J>>2]|0)+18>>1]|0)|0)>>16));if((c[E>>2]|0)==16){na=_(c[(c[Y>>2]|0)+-40>>2]>>16,b[(c[J>>2]|0)+20>>1]|0)|0;c[P>>2]=(c[P>>2]|0)+(na+((_(c[(c[Y>>2]|0)+-40>>2]&65535,b[(c[J>>2]|0)+20>>1]|0)|0)>>16));na=_(c[(c[Y>>2]|0)+-44>>2]>>16,b[(c[J>>2]|0)+22>>1]|0)|0;c[P>>2]=(c[P>>2]|0)+(na+((_(c[(c[Y>>2]|0)+-44>>2]&65535,b[(c[J>>2]|0)+22>>1]|0)|0)>>16));na=_(c[(c[Y>>2]|0)+-48>>2]>>16,b[(c[J>>2]|0)+24>>1]|0)|0;c[P>>2]=(c[P>>2]|0)+(na+((_(c[(c[Y>>2]|0)+-48>>2]&65535,b[(c[J>>2]|0)+24>>1]|0)|0)>>16));na=_(c[(c[Y>>2]|0)+-52>>2]>>16,b[(c[J>>2]|0)+26>>1]|0)|0;c[P>>2]=(c[P>>2]|0)+(na+((_(c[(c[Y>>2]|0)+-52>>2]&65535,b[(c[J>>2]|0)+26>>1]|0)|0)>>16));na=_(c[(c[Y>>2]|0)+-56>>2]>>16,b[(c[J>>2]|0)+28>>1]|0)|0;c[P>>2]=(c[P>>2]|0)+(na+((_(c[(c[Y>>2]|0)+-56>>2]&65535,b[(c[J>>2]|0)+28>>1]|0)|0)>>16));na=_(c[(c[Y>>2]|0)+-60>>2]>>16,b[(c[J>>2]|0)+30>>1]|0)|0;c[P>>2]=(c[P>>2]|0)+(na+((_(c[(c[Y>>2]|0)+-60>>2]&65535,b[(c[J>>2]|0)+30>>1]|0)|0)>>16))}if((c[x>>2]|0)==2){c[Q>>2]=2;na=_(c[c[X>>2]>>2]>>16,b[c[K>>2]>>1]|0)|0;c[Q>>2]=(c[Q>>2]|0)+(na+((_(c[c[X>>2]>>2]&65535,b[c[K>>2]>>1]|0)|0)>>16));na=_(c[(c[X>>2]|0)+-4>>2]>>16,b[(c[K>>2]|0)+2>>1]|0)|0;c[Q>>2]=(c[Q>>2]|0)+(na+((_(c[(c[X>>2]|0)+-4>>2]&65535,b[(c[K>>2]|0)+2>>1]|0)|0)>>16));na=_(c[(c[X>>2]|0)+-8>>2]>>16,b[(c[K>>2]|0)+4>>1]|0)|0;c[Q>>2]=(c[Q>>2]|0)+(na+((_(c[(c[X>>2]|0)+-8>>2]&65535,b[(c[K>>2]|0)+4>>1]|0)|0)>>16));na=_(c[(c[X>>2]|0)+-12>>2]>>16,b[(c[K>>2]|0)+6>>1]|0)|0;c[Q>>2]=(c[Q>>2]|0)+(na+((_(c[(c[X>>2]|0)+-12>>2]&65535,b[(c[K>>2]|0)+6>>1]|0)|0)>>16));na=_(c[(c[X>>2]|0)+-16>>2]>>16,b[(c[K>>2]|0)+8>>1]|0)|0;c[Q>>2]=(c[Q>>2]|0)+(na+((_(c[(c[X>>2]|0)+-16>>2]&65535,b[(c[K>>2]|0)+8>>1]|0)|0)>>16));c[X>>2]=(c[X>>2]|0)+4}else c[Q>>2]=0;c[ia>>2]=c[c[Y>>2]>>2];c[ha>>2]=c[(c[ka>>2]|0)+4288>>2];c[(c[ka>>2]|0)+4288>>2]=c[ia>>2];c[U>>2]=c[D>>2]>>1;na=_(c[ia>>2]>>16,b[c[L>>2]>>1]|0)|0;c[U>>2]=(c[U>>2]|0)+(na+((_(c[ia>>2]&65535,b[c[L>>2]>>1]|0)|0)>>16));c[T>>2]=2;while(1){if((c[T>>2]|0)>=(c[D>>2]|0))break;c[ia>>2]=c[(c[ka>>2]|0)+4288+((c[T>>2]|0)-1<<2)>>2];c[(c[ka>>2]|0)+4288+((c[T>>2]|0)-1<<2)>>2]=c[ha>>2];na=_(c[ha>>2]>>16,b[(c[L>>2]|0)+((c[T>>2]|0)-1<<1)>>1]|0)|0;c[U>>2]=(c[U>>2]|0)+(na+((_(c[ha>>2]&65535,b[(c[L>>2]|0)+((c[T>>2]|0)-1<<1)>>1]|0)|0)>>16));c[ha>>2]=c[(c[ka>>2]|0)+4288+((c[T>>2]|0)+0<<2)>>2];c[(c[ka>>2]|0)+4288+((c[T>>2]|0)+0<<2)>>2]=c[ia>>2];na=_(c[ia>>2]>>16,b[(c[L>>2]|0)+(c[T>>2]<<1)>>1]|0)|0;c[U>>2]=(c[U>>2]|0)+(na+((_(c[ia>>2]&65535,b[(c[L>>2]|0)+(c[T>>2]<<1)>>1]|0)|0)>>16));c[T>>2]=(c[T>>2]|0)+2}c[(c[ka>>2]|0)+4288+((c[D>>2]|0)-1<<2)>>2]=c[ha>>2];na=_(c[ha>>2]>>16,b[(c[L>>2]|0)+((c[D>>2]|0)-1<<1)>>1]|0)|0;c[U>>2]=(c[U>>2]|0)+(na+((_(c[ha>>2]&65535,b[(c[L>>2]|0)+((c[D>>2]|0)-1<<1)>>1]|0)|0)>>16));c[U>>2]=c[U>>2]<<1;na=_(c[(c[ka>>2]|0)+4352>>2]>>16,(c[z>>2]&65535)<<16>>16)|0;c[U>>2]=(c[U>>2]|0)+(na+((_(c[(c[ka>>2]|0)+4352>>2]&65535,(c[z>>2]&65535)<<16>>16)|0)>>16));na=_(c[(c[ka>>2]|0)+1280+((c[(c[ka>>2]|0)+4364>>2]|0)-1<<2)>>2]>>16,(c[A>>2]&65535)<<16>>16)|0;c[V>>2]=na+((_(c[(c[ka>>2]|0)+1280+((c[(c[ka>>2]|0)+4364>>2]|0)-1<<2)>>2]&65535,(c[A>>2]&65535)<<16>>16)|0)>>16);na=(c[V>>2]|0)+(_(c[(c[ka>>2]|0)+4352>>2]>>16,c[A>>2]>>16)|0)|0;c[V>>2]=na+((_(c[(c[ka>>2]|0)+4352>>2]&65535,c[A>>2]>>16)|0)>>16);c[ha>>2]=(c[P>>2]<<2)-(c[U>>2]|0);c[ha>>2]=(c[ha>>2]|0)-(c[V>>2]|0);if((c[M>>2]|0)>0){na=_((c[c[ga>>2]>>2]|0)+(c[(c[ga>>2]|0)+-8>>2]|0)>>16,(c[y>>2]&65535)<<16>>16)|0;c[W>>2]=na+((_((c[c[ga>>2]>>2]|0)+(c[(c[ga>>2]|0)+-8>>2]|0)&65535,(c[y>>2]&65535)<<16>>16)|0)>>16);na=(c[W>>2]|0)+(_(c[(c[ga>>2]|0)+-4>>2]>>16,c[y>>2]>>16)|0)|0;c[W>>2]=na+((_(c[(c[ga>>2]|0)+-4>>2]&65535,c[y>>2]>>16)|0)>>16);c[W>>2]=c[W>>2]<<1;c[ga>>2]=(c[ga>>2]|0)+4;c[ia>>2]=(c[Q>>2]|0)-(c[W>>2]|0);c[ha>>2]=(c[ia>>2]|0)+(c[ha>>2]<<1);c[ha>>2]=(c[ha>>2]>>2)+1>>1}else c[ha>>2]=(c[ha>>2]>>1)+1>>1;c[ba>>2]=(c[(c[F>>2]|0)+(c[S>>2]<<2)>>2]|0)-(c[ha>>2]|0);if((c[(c[ka>>2]|0)+4368>>2]|0)<0)c[ba>>2]=0-(c[ba>>2]|0);if((c[ba>>2]|0)>30720)m=30720;else m=(c[ba>>2]|0)<-31744?-31744:c[ba>>2]|0;c[ba>>2]=m;c[$>>2]=(c[ba>>2]|0)-(c[C>>2]|0);c[Z>>2]=c[$>>2]>>10;m=c[Z>>2]|0;do if((c[Z>>2]|0)<=0){if(!m){c[$>>2]=c[C>>2];c[aa>>2]=(c[$>>2]|0)+944;c[ca>>2]=_((c[$>>2]&65535)<<16>>16,(c[B>>2]&65535)<<16>>16)|0;c[da>>2]=_((c[aa>>2]&65535)<<16>>16,(c[B>>2]&65535)<<16>>16)|0;break}if((c[Z>>2]|0)==-1){c[aa>>2]=c[C>>2];c[$>>2]=(c[aa>>2]|0)-944;c[ca>>2]=_((0-(c[$>>2]|0)&65535)<<16>>16,(c[B>>2]&65535)<<16>>16)|0;c[da>>2]=_((c[aa>>2]&65535)<<16>>16,(c[B>>2]&65535)<<16>>16)|0;break}else{c[$>>2]=(c[Z>>2]<<10)+80;c[$>>2]=(c[$>>2]|0)+(c[C>>2]|0);c[aa>>2]=(c[$>>2]|0)+1024;c[ca>>2]=_((0-(c[$>>2]|0)&65535)<<16>>16,(c[B>>2]&65535)<<16>>16)|0;c[da>>2]=_((0-(c[aa>>2]|0)&65535)<<16>>16,(c[B>>2]&65535)<<16>>16)|0;break}}else{c[$>>2]=(m<<10)-80;c[$>>2]=(c[$>>2]|0)+(c[C>>2]|0);c[aa>>2]=(c[$>>2]|0)+1024;c[ca>>2]=_((c[$>>2]&65535)<<16>>16,(c[B>>2]&65535)<<16>>16)|0;c[da>>2]=_((c[aa>>2]&65535)<<16>>16,(c[B>>2]&65535)<<16>>16)|0}while(0);c[ea>>2]=(c[ba>>2]|0)-(c[$>>2]|0);c[ca>>2]=(c[ca>>2]|0)+(_((c[ea>>2]&65535)<<16>>16,(c[ea>>2]&65535)<<16>>16)|0);c[ea>>2]=(c[ba>>2]|0)-(c[aa>>2]|0);c[da>>2]=(c[da>>2]|0)+(_((c[ea>>2]&65535)<<16>>16,(c[ea>>2]&65535)<<16>>16)|0);if((c[da>>2]|0)<(c[ca>>2]|0))c[$>>2]=c[aa>>2];a[(c[G>>2]|0)+(c[S>>2]|0)>>0]=(c[$>>2]>>9)+1>>1;c[R>>2]=c[$>>2]<<4;if((c[(c[ka>>2]|0)+4368>>2]|0)<0)c[R>>2]=0-(c[R>>2]|0);c[O>>2]=(c[R>>2]|0)+(c[Q>>2]<<1);c[ja>>2]=(c[O>>2]|0)+(c[P>>2]<<4);na=_(c[ja>>2]>>16,(c[N>>2]&65535)<<16>>16)|0;na=na+((_(c[ja>>2]&65535,(c[N>>2]&65535)<<16>>16)|0)>>16)|0;if(((na+(_(c[ja>>2]|0,(c[N>>2]>>15)+1>>1)|0)>>7)+1>>1|0)<=32767){na=_(c[ja>>2]>>16,(c[N>>2]&65535)<<16>>16)|0;na=na+((_(c[ja>>2]&65535,(c[N>>2]&65535)<<16>>16)|0)>>16)|0;if(((na+(_(c[ja>>2]|0,(c[N>>2]>>15)+1>>1)|0)>>7)+1>>1|0)<-32768)m=-32768;else{m=_(c[ja>>2]>>16,(c[N>>2]&65535)<<16>>16)|0;m=m+((_(c[ja>>2]&65535,(c[N>>2]&65535)<<16>>16)|0)>>16)|0;m=(m+(_(c[ja>>2]|0,(c[N>>2]>>15)+1>>1)|0)>>7)+1>>1}}else m=32767;b[(c[H>>2]|0)+(c[S>>2]<<1)>>1]=m;c[Y>>2]=(c[Y>>2]|0)+4;c[c[Y>>2]>>2]=c[ja>>2];c[fa>>2]=(c[ja>>2]|0)-(c[U>>2]<<2);c[(c[ka>>2]|0)+4352>>2]=c[fa>>2];c[(c[ka>>2]|0)+1280+(c[(c[ka>>2]|0)+4364>>2]<<2)>>2]=(c[fa>>2]|0)-(c[V>>2]<<2);c[(c[I>>2]|0)+(c[(c[ka>>2]|0)+4360>>2]<<2)>>2]=c[O>>2]<<1;na=(c[ka>>2]|0)+4364|0;c[na>>2]=(c[na>>2]|0)+1;na=(c[ka>>2]|0)+4360|0;c[na>>2]=(c[na>>2]|0)+1;c[(c[ka>>2]|0)+4368>>2]=(c[(c[ka>>2]|0)+4368>>2]|0)+(a[(c[G>>2]|0)+(c[S>>2]|0)>>0]|0);c[S>>2]=(c[S>>2]|0)+1}o=m+3840|0;m=(c[ka>>2]|0)+3840+(c[la>>2]<<2)|0;r=o+128|0;do{c[o>>2]=c[m>>2];o=o+4|0;m=m+4|0}while((o|0)<(r|0));i=ma;return}function se(d,e,f,g,h,j,k,l,m,n,o,p,q,r,s){d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|0;m=m|0;n=n|0;o=o|0;p=p|0;q=q|0;r=r|0;s=s|0;var t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0;ca=i;i=i+272|0;S=ca+264|0;T=ca+260|0;x=ca+256|0;y=ca+252|0;W=ca+248|0;z=ca+244|0;A=ca+240|0;B=ca+236|0;C=ca+232|0;D=ca+228|0;t=ca+224|0;u=ca+220|0;U=ca+216|0;v=ca+212|0;w=ca+208|0;Z=ca+204|0;M=ca+200|0;N=ca+196|0;Q=ca+192|0;I=ca+188|0;K=ca+184|0;R=ca+180|0;$=ca+176|0;P=ca+172|0;Y=ca+168|0;F=ca+164|0;G=ca+160|0;E=ca+156|0;ba=ca+152|0;H=ca+148|0;O=ca+144|0;J=ca+140|0;X=ca+136|0;aa=ca+132|0;V=ca+128|0;L=ca;c[S>>2]=d;c[T>>2]=e;c[x>>2]=f;c[y>>2]=g;c[W>>2]=h;c[z>>2]=j;c[A>>2]=k;c[B>>2]=l;c[C>>2]=m;c[D>>2]=n;c[t>>2]=o;c[u>>2]=p;c[U>>2]=q;c[v>>2]=r;c[w>>2]=s;c[N>>2]=c[(c[T>>2]|0)+4356>>2];g=c[(c[S>>2]|0)+4652>>2]|0;c[V>>2]=ia()|0;k=i;i=i+((1*(g*1168|0)|0)+15&-16)|0;oj(k|0,0,(c[(c[S>>2]|0)+4652>>2]|0)*1168|0)|0;c[M>>2]=0;while(1){if((c[M>>2]|0)>=(c[(c[S>>2]|0)+4652>>2]|0))break;c[aa>>2]=k+((c[M>>2]|0)*1168|0);c[(c[aa>>2]|0)+1156>>2]=(c[M>>2]|0)+(a[(c[x>>2]|0)+34>>0]|0)&3;c[(c[aa>>2]|0)+1160>>2]=c[(c[aa>>2]|0)+1156>>2];c[(c[aa>>2]|0)+1164>>2]=0;c[(c[aa>>2]|0)+1152>>2]=c[(c[T>>2]|0)+4352>>2];c[(c[aa>>2]|0)+960>>2]=c[(c[T>>2]|0)+1280+((c[(c[S>>2]|0)+4616>>2]|0)-1<<2)>>2];l=c[aa>>2]|0;p=(c[T>>2]|0)+3840|0;m=l+128|0;do{c[l>>2]=c[p>>2];l=l+4|0;p=p+4|0}while((l|0)<(m|0));l=(c[aa>>2]|0)+1088|0;p=(c[T>>2]|0)+4288|0;m=l+64|0;do{c[l>>2]=c[p>>2];l=l+4|0;p=p+4|0}while((l|0)<(m|0));c[M>>2]=(c[M>>2]|0)+1}c[O>>2]=b[24558+(a[(c[x>>2]|0)+29>>0]>>1<<2)+(a[(c[x>>2]|0)+30>>0]<<1)>>1];c[P>>2]=0;c[Y>>2]=te(32,c[(c[S>>2]|0)+4612>>2]|0)|0;a:do if((a[(c[x>>2]|0)+29>>0]|0)!=2){if((c[N>>2]|0)>0)c[Y>>2]=te(c[Y>>2]|0,(c[N>>2]|0)-2-1|0)|0}else{c[M>>2]=0;while(1){if((c[M>>2]|0)>=(c[(c[S>>2]|0)+4604>>2]|0))break a;c[Y>>2]=te(c[Y>>2]|0,(c[(c[U>>2]|0)+(c[M>>2]<<2)>>2]|0)-2-1|0)|0;c[M>>2]=(c[M>>2]|0)+1}}while(0);if((a[(c[x>>2]|0)+31>>0]|0)==4)c[I>>2]=0;else c[I>>2]=1;l=i;i=i+((1*((c[(c[S>>2]|0)+4616>>2]|0)+(c[(c[S>>2]|0)+4608>>2]|0)<<2)|0)+15&-16)|0;p=i;i=i+((1*((c[(c[S>>2]|0)+4616>>2]|0)+(c[(c[S>>2]|0)+4608>>2]|0)<<1)|0)+15&-16)|0;m=i;i=i+((1*(c[(c[S>>2]|0)+4612>>2]<<2)|0)+15&-16)|0;c[ba>>2]=(c[T>>2]|0)+(c[(c[S>>2]|0)+4616>>2]<<1);c[(c[T>>2]|0)+4364>>2]=c[(c[S>>2]|0)+4616>>2];c[(c[T>>2]|0)+4360>>2]=c[(c[S>>2]|0)+4616>>2];c[R>>2]=0;c[M>>2]=0;while(1){if((c[M>>2]|0)>=(c[(c[S>>2]|0)+4604>>2]|0))break;c[F>>2]=(c[z>>2]|0)+((c[M>>2]>>1|1-(c[I>>2]|0))<<4<<1);c[G>>2]=(c[A>>2]|0)+((c[M>>2]|0)*5<<1);c[E>>2]=(c[B>>2]|0)+(c[M>>2]<<4<<1);c[H>>2]=c[(c[C>>2]|0)+(c[M>>2]<<2)>>2]>>2;c[H>>2]=c[H>>2]|c[(c[C>>2]|0)+(c[M>>2]<<2)>>2]>>1<<16;c[(c[T>>2]|0)+4376>>2]=0;if((a[(c[x>>2]|0)+29>>0]|0)==2?(c[N>>2]=c[(c[U>>2]|0)+(c[M>>2]<<2)>>2],(c[M>>2]&3-(c[I>>2]<<1)|0)==0):0){if((c[M>>2]|0)==2){c[J>>2]=c[k+1164>>2];c[K>>2]=0;c[Z>>2]=1;while(1){if((c[Z>>2]|0)>=(c[(c[S>>2]|0)+4652>>2]|0))break;if((c[k+((c[Z>>2]|0)*1168|0)+1164>>2]|0)<(c[J>>2]|0)){c[J>>2]=c[k+((c[Z>>2]|0)*1168|0)+1164>>2];c[K>>2]=c[Z>>2]}c[Z>>2]=(c[Z>>2]|0)+1}c[Z>>2]=0;while(1){if((c[Z>>2]|0)>=(c[(c[S>>2]|0)+4652>>2]|0))break;if((c[Z>>2]|0)!=(c[K>>2]|0)){g=k+((c[Z>>2]|0)*1168|0)+1164|0;c[g>>2]=(c[g>>2]|0)+134217727}c[Z>>2]=(c[Z>>2]|0)+1}c[aa>>2]=k+((c[K>>2]|0)*1168|0);c[$>>2]=(c[P>>2]|0)+(c[Y>>2]|0);c[Z>>2]=0;while(1){if((c[Z>>2]|0)>=(c[Y>>2]|0))break;c[$>>2]=(c[$>>2]|0)-1&31;a[(c[W>>2]|0)+((c[Z>>2]|0)-(c[Y>>2]|0))>>0]=(c[(c[aa>>2]|0)+576+(c[$>>2]<<2)>>2]>>9)+1>>1;g=_(c[(c[aa>>2]|0)+704+(c[$>>2]<<2)>>2]>>16,(c[(c[u>>2]|0)+4>>2]&65535)<<16>>16)|0;g=g+((_(c[(c[aa>>2]|0)+704+(c[$>>2]<<2)>>2]&65535,(c[(c[u>>2]|0)+4>>2]&65535)<<16>>16)|0)>>16)|0;if(((g+(_(c[(c[aa>>2]|0)+704+(c[$>>2]<<2)>>2]|0,(c[(c[u>>2]|0)+4>>2]>>15)+1>>1)|0)>>13)+1>>1|0)<=32767){g=_(c[(c[aa>>2]|0)+704+(c[$>>2]<<2)>>2]>>16,(c[(c[u>>2]|0)+4>>2]&65535)<<16>>16)|0;g=g+((_(c[(c[aa>>2]|0)+704+(c[$>>2]<<2)>>2]&65535,(c[(c[u>>2]|0)+4>>2]&65535)<<16>>16)|0)>>16)|0;if(((g+(_(c[(c[aa>>2]|0)+704+(c[$>>2]<<2)>>2]|0,(c[(c[u>>2]|0)+4>>2]>>15)+1>>1)|0)>>13)+1>>1|0)<-32768)o=-32768;else{o=_(c[(c[aa>>2]|0)+704+(c[$>>2]<<2)>>2]>>16,(c[(c[u>>2]|0)+4>>2]&65535)<<16>>16)|0;o=o+((_(c[(c[aa>>2]|0)+704+(c[$>>2]<<2)>>2]&65535,(c[(c[u>>2]|0)+4>>2]&65535)<<16>>16)|0)>>16)|0;o=(o+(_(c[(c[aa>>2]|0)+704+(c[$>>2]<<2)>>2]|0,(c[(c[u>>2]|0)+4>>2]>>15)+1>>1)|0)>>13)+1>>1}}else o=32767;b[(c[ba>>2]|0)+((c[Z>>2]|0)-(c[Y>>2]|0)<<1)>>1]=o;c[(c[T>>2]|0)+1280+((c[(c[T>>2]|0)+4364>>2]|0)-(c[Y>>2]|0)+(c[Z>>2]|0)<<2)>>2]=c[(c[aa>>2]|0)+960+(c[$>>2]<<2)>>2];c[Z>>2]=(c[Z>>2]|0)+1}c[R>>2]=0}c[Q>>2]=(c[(c[S>>2]|0)+4616>>2]|0)-(c[N>>2]|0)-(c[(c[S>>2]|0)+4664>>2]|0)-2;g=(c[Q>>2]|0)+(_(c[M>>2]|0,c[(c[S>>2]|0)+4612>>2]|0)|0)|0;Xf(p+(c[Q>>2]<<1)|0,(c[T>>2]|0)+(g<<1)|0,c[F>>2]|0,(c[(c[S>>2]|0)+4616>>2]|0)-(c[Q>>2]|0)|0,c[(c[S>>2]|0)+4664>>2]|0,c[(c[S>>2]|0)+5124>>2]|0);c[(c[T>>2]|0)+4360>>2]=c[(c[S>>2]|0)+4616>>2];c[(c[T>>2]|0)+4376>>2]=1}ue(c[S>>2]|0,c[T>>2]|0,k,c[y>>2]|0,m,p,l,c[M>>2]|0,c[(c[S>>2]|0)+4652>>2]|0,c[w>>2]|0,c[u>>2]|0,c[U>>2]|0,a[(c[x>>2]|0)+29>>0]|0,c[Y>>2]|0);ha=c[T>>2]|0;ga=a[(c[x>>2]|0)+29>>0]|0;fa=c[W>>2]|0;ea=c[ba>>2]|0;da=c[F>>2]|0;o=c[G>>2]|0;s=c[E>>2]|0;r=c[N>>2]|0;e=c[H>>2]|0;j=c[(c[D>>2]|0)+(c[M>>2]<<2)>>2]|0;n=c[(c[t>>2]|0)+(c[M>>2]<<2)>>2]|0;q=c[(c[u>>2]|0)+(c[M>>2]<<2)>>2]|0;d=c[v>>2]|0;f=c[O>>2]|0;h=c[(c[S>>2]|0)+4612>>2]|0;g=c[R>>2]|0;c[R>>2]=g+1;ye(ha,k,ga,m,fa,ea,l,L,da,o,s,r,e,j,n,q,d,f,h,g,c[(c[S>>2]|0)+4660>>2]|0,c[(c[S>>2]|0)+4664>>2]|0,c[(c[S>>2]|0)+4704>>2]|0,c[(c[S>>2]|0)+4652>>2]|0,P,c[Y>>2]|0);c[y>>2]=(c[y>>2]|0)+(c[(c[S>>2]|0)+4612>>2]<<2);c[W>>2]=(c[W>>2]|0)+(c[(c[S>>2]|0)+4612>>2]|0);c[ba>>2]=(c[ba>>2]|0)+(c[(c[S>>2]|0)+4612>>2]<<1);c[M>>2]=(c[M>>2]|0)+1}c[J>>2]=c[k+1164>>2];c[K>>2]=0;c[M>>2]=1;while(1){if((c[M>>2]|0)>=(c[(c[S>>2]|0)+4652>>2]|0))break;if((c[k+((c[M>>2]|0)*1168|0)+1164>>2]|0)<(c[J>>2]|0)){c[J>>2]=c[k+((c[M>>2]|0)*1168|0)+1164>>2];c[K>>2]=c[M>>2]}c[M>>2]=(c[M>>2]|0)+1}c[aa>>2]=k+((c[K>>2]|0)*1168|0);a[(c[x>>2]|0)+34>>0]=c[(c[aa>>2]|0)+1160>>2];c[$>>2]=(c[P>>2]|0)+(c[Y>>2]|0);c[X>>2]=c[(c[u>>2]|0)+((c[(c[S>>2]|0)+4604>>2]|0)-1<<2)>>2]>>6;c[Z>>2]=0;while(1){if((c[Z>>2]|0)>=(c[Y>>2]|0))break;c[$>>2]=(c[$>>2]|0)-1&31;a[(c[W>>2]|0)+((c[Z>>2]|0)-(c[Y>>2]|0))>>0]=(c[(c[aa>>2]|0)+576+(c[$>>2]<<2)>>2]>>9)+1>>1;ha=_(c[(c[aa>>2]|0)+704+(c[$>>2]<<2)>>2]>>16,(c[X>>2]&65535)<<16>>16)|0;ha=ha+((_(c[(c[aa>>2]|0)+704+(c[$>>2]<<2)>>2]&65535,(c[X>>2]&65535)<<16>>16)|0)>>16)|0;if(((ha+(_(c[(c[aa>>2]|0)+704+(c[$>>2]<<2)>>2]|0,(c[X>>2]>>15)+1>>1)|0)>>7)+1>>1|0)<=32767){ha=_(c[(c[aa>>2]|0)+704+(c[$>>2]<<2)>>2]>>16,(c[X>>2]&65535)<<16>>16)|0;ha=ha+((_(c[(c[aa>>2]|0)+704+(c[$>>2]<<2)>>2]&65535,(c[X>>2]&65535)<<16>>16)|0)>>16)|0;if(((ha+(_(c[(c[aa>>2]|0)+704+(c[$>>2]<<2)>>2]|0,(c[X>>2]>>15)+1>>1)|0)>>7)+1>>1|0)<-32768)l=-32768;else{l=_(c[(c[aa>>2]|0)+704+(c[$>>2]<<2)>>2]>>16,(c[X>>2]&65535)<<16>>16)|0;l=l+((_(c[(c[aa>>2]|0)+704+(c[$>>2]<<2)>>2]&65535,(c[X>>2]&65535)<<16>>16)|0)>>16)|0;l=(l+(_(c[(c[aa>>2]|0)+704+(c[$>>2]<<2)>>2]|0,(c[X>>2]>>15)+1>>1)|0)>>7)+1>>1}}else l=32767;b[(c[ba>>2]|0)+((c[Z>>2]|0)-(c[Y>>2]|0)<<1)>>1]=l;c[(c[T>>2]|0)+1280+((c[(c[T>>2]|0)+4364>>2]|0)-(c[Y>>2]|0)+(c[Z>>2]|0)<<2)>>2]=c[(c[aa>>2]|0)+960+(c[$>>2]<<2)>>2];c[Z>>2]=(c[Z>>2]|0)+1}l=(c[T>>2]|0)+3840|0;p=(c[aa>>2]|0)+(c[(c[S>>2]|0)+4612>>2]<<2)|0;m=l+128|0;do{c[l>>2]=c[p>>2];l=l+4|0;p=p+4|0}while((l|0)<(m|0));l=(c[T>>2]|0)+4288|0;p=(c[aa>>2]|0)+1088|0;m=l+64|0;do{c[l>>2]=c[p>>2];l=l+4|0;p=p+4|0}while((l|0)<(m|0));c[(c[T>>2]|0)+4352>>2]=c[(c[aa>>2]|0)+1152>>2];c[(c[T>>2]|0)+4356>>2]=c[(c[U>>2]|0)+((c[(c[S>>2]|0)+4604>>2]|0)-1<<2)>>2];qj(c[T>>2]|0,(c[T>>2]|0)+(c[(c[S>>2]|0)+4608>>2]<<1)|0,c[(c[S>>2]|0)+4616>>2]<<1|0)|0;qj((c[T>>2]|0)+1280|0,(c[T>>2]|0)+1280+(c[(c[S>>2]|0)+4608>>2]<<2)|0,c[(c[S>>2]|0)+4616>>2]<<2|0)|0;na(c[V>>2]|0);i=ca;return}function te(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;f=i;i=i+16|0;e=f+4|0;d=f;c[e>>2]=a;c[d>>2]=b;i=f;return ((c[e>>2]|0)<(c[d>>2]|0)?c[e>>2]|0:c[d>>2]|0)|0}function ue(a,d,e,f,g,h,j,k,l,m,n,o,p,q){a=a|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|0;m=m|0;n=n|0;o=o|0;p=p|0;q=q|0;var r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0;L=i;i=i+96|0;r=L+80|0;s=L+76|0;w=L+72|0;x=L+68|0;y=L+64|0;z=L+60|0;A=L+56|0;B=L+52|0;C=L+48|0;D=L+44|0;t=L+40|0;M=L+36|0;u=L+32|0;v=L+28|0;F=L+24|0;I=L+20|0;J=L+16|0;E=L+12|0;H=L+8|0;G=L+4|0;K=L;c[r>>2]=a;c[s>>2]=d;c[w>>2]=e;c[x>>2]=f;c[y>>2]=g;c[z>>2]=h;c[A>>2]=j;c[B>>2]=k;c[C>>2]=l;c[D>>2]=m;c[t>>2]=n;c[M>>2]=o;c[u>>2]=p;c[v>>2]=q;c[J>>2]=c[(c[M>>2]|0)+(c[B>>2]<<2)>>2];if((c[(c[t>>2]|0)+(c[B>>2]<<2)>>2]|0)>1)n=c[(c[t>>2]|0)+(c[B>>2]<<2)>>2]|0;else n=1;c[H>>2]=ve(n,47)|0;if((c[(c[t>>2]|0)+(c[B>>2]<<2)>>2]|0)!=(c[(c[s>>2]|0)+4372>>2]|0))c[E>>2]=xe(c[(c[s>>2]|0)+4372>>2]|0,c[(c[t>>2]|0)+(c[B>>2]<<2)>>2]|0,16)|0;else c[E>>2]=65536;c[G>>2]=(c[H>>2]>>7)+1>>1;c[F>>2]=0;while(1){if((c[F>>2]|0)>=(c[(c[r>>2]|0)+4612>>2]|0))break;M=_(c[(c[x>>2]|0)+(c[F>>2]<<2)>>2]>>16,(c[G>>2]&65535)<<16>>16)|0;M=M+((_(c[(c[x>>2]|0)+(c[F>>2]<<2)>>2]&65535,(c[G>>2]&65535)<<16>>16)|0)>>16)|0;M=M+(_(c[(c[x>>2]|0)+(c[F>>2]<<2)>>2]|0,(c[G>>2]>>15)+1>>1)|0)|0;c[(c[y>>2]|0)+(c[F>>2]<<2)>>2]=M;c[F>>2]=(c[F>>2]|0)+1}c[(c[s>>2]|0)+4372>>2]=c[(c[t>>2]|0)+(c[B>>2]<<2)>>2];a:do if(c[(c[s>>2]|0)+4376>>2]|0){if(!(c[B>>2]|0)){M=_(c[H>>2]>>16,(c[D>>2]&65535)<<16>>16)|0;c[H>>2]=M+((_(c[H>>2]&65535,(c[D>>2]&65535)<<16>>16)|0)>>16)<<2}c[F>>2]=(c[(c[s>>2]|0)+4360>>2]|0)-(c[J>>2]|0)-2;while(1){if((c[F>>2]|0)>=(c[(c[s>>2]|0)+4360>>2]|0))break a;M=_(c[H>>2]>>16,b[(c[z>>2]|0)+(c[F>>2]<<1)>>1]|0)|0;M=M+((_(c[H>>2]&65535,b[(c[z>>2]|0)+(c[F>>2]<<1)>>1]|0)|0)>>16)|0;c[(c[A>>2]|0)+(c[F>>2]<<2)>>2]=M;c[F>>2]=(c[F>>2]|0)+1}}while(0);if((c[E>>2]|0)==65536){i=L;return}c[F>>2]=(c[(c[s>>2]|0)+4364>>2]|0)-(c[(c[r>>2]|0)+4616>>2]|0);while(1){if((c[F>>2]|0)>=(c[(c[s>>2]|0)+4364>>2]|0))break;M=_(c[E>>2]>>16,(c[(c[s>>2]|0)+1280+(c[F>>2]<<2)>>2]&65535)<<16>>16)|0;M=M+((_(c[E>>2]&65535,(c[(c[s>>2]|0)+1280+(c[F>>2]<<2)>>2]&65535)<<16>>16)|0)>>16)|0;M=M+(_(c[E>>2]|0,(c[(c[s>>2]|0)+1280+(c[F>>2]<<2)>>2]>>15)+1>>1)|0)|0;c[(c[s>>2]|0)+1280+(c[F>>2]<<2)>>2]=M;c[F>>2]=(c[F>>2]|0)+1}b:do if((c[u>>2]|0)==2?(c[(c[s>>2]|0)+4376>>2]|0)==0:0){c[F>>2]=(c[(c[s>>2]|0)+4360>>2]|0)-(c[J>>2]|0)-2;while(1){if((c[F>>2]|0)>=((c[(c[s>>2]|0)+4360>>2]|0)-(c[v>>2]|0)|0))break b;M=_(c[E>>2]>>16,(c[(c[A>>2]|0)+(c[F>>2]<<2)>>2]&65535)<<16>>16)|0;M=M+((_(c[E>>2]&65535,(c[(c[A>>2]|0)+(c[F>>2]<<2)>>2]&65535)<<16>>16)|0)>>16)|0;M=M+(_(c[E>>2]|0,(c[(c[A>>2]|0)+(c[F>>2]<<2)>>2]>>15)+1>>1)|0)|0;c[(c[A>>2]|0)+(c[F>>2]<<2)>>2]=M;c[F>>2]=(c[F>>2]|0)+1}}while(0);c[I>>2]=0;while(1){if((c[I>>2]|0)>=(c[C>>2]|0))break;c[K>>2]=(c[w>>2]|0)+((c[I>>2]|0)*1168|0);M=_(c[E>>2]>>16,(c[(c[K>>2]|0)+1152>>2]&65535)<<16>>16)|0;M=M+((_(c[E>>2]&65535,(c[(c[K>>2]|0)+1152>>2]&65535)<<16>>16)|0)>>16)|0;M=M+(_(c[E>>2]|0,(c[(c[K>>2]|0)+1152>>2]>>15)+1>>1)|0)|0;c[(c[K>>2]|0)+1152>>2]=M;c[F>>2]=0;while(1){if((c[F>>2]|0)>=32)break;M=_(c[E>>2]>>16,(c[(c[K>>2]|0)+(c[F>>2]<<2)>>2]&65535)<<16>>16)|0;M=M+((_(c[E>>2]&65535,(c[(c[K>>2]|0)+(c[F>>2]<<2)>>2]&65535)<<16>>16)|0)>>16)|0;M=M+(_(c[E>>2]|0,(c[(c[K>>2]|0)+(c[F>>2]<<2)>>2]>>15)+1>>1)|0)|0;c[(c[K>>2]|0)+(c[F>>2]<<2)>>2]=M;c[F>>2]=(c[F>>2]|0)+1}c[F>>2]=0;while(1){if((c[F>>2]|0)>=16)break;M=_(c[E>>2]>>16,(c[(c[K>>2]|0)+1088+(c[F>>2]<<2)>>2]&65535)<<16>>16)|0;M=M+((_(c[E>>2]&65535,(c[(c[K>>2]|0)+1088+(c[F>>2]<<2)>>2]&65535)<<16>>16)|0)>>16)|0;M=M+(_(c[E>>2]|0,(c[(c[K>>2]|0)+1088+(c[F>>2]<<2)>>2]>>15)+1>>1)|0)|0;c[(c[K>>2]|0)+1088+(c[F>>2]<<2)>>2]=M;c[F>>2]=(c[F>>2]|0)+1}c[F>>2]=0;while(1){if((c[F>>2]|0)>=32)break;M=_(c[E>>2]>>16,(c[(c[K>>2]|0)+832+(c[F>>2]<<2)>>2]&65535)<<16>>16)|0;M=M+((_(c[E>>2]&65535,(c[(c[K>>2]|0)+832+(c[F>>2]<<2)>>2]&65535)<<16>>16)|0)>>16)|0;M=M+(_(c[E>>2]|0,(c[(c[K>>2]|0)+832+(c[F>>2]<<2)>>2]>>15)+1>>1)|0)|0;c[(c[K>>2]|0)+832+(c[F>>2]<<2)>>2]=M;M=_(c[E>>2]>>16,(c[(c[K>>2]|0)+960+(c[F>>2]<<2)>>2]&65535)<<16>>16)|0;M=M+((_(c[E>>2]&65535,(c[(c[K>>2]|0)+960+(c[F>>2]<<2)>>2]&65535)<<16>>16)|0)>>16)|0;M=M+(_(c[E>>2]|0,(c[(c[K>>2]|0)+960+(c[F>>2]<<2)>>2]>>15)+1>>1)|0)|0;c[(c[K>>2]|0)+960+(c[F>>2]<<2)>>2]=M;c[F>>2]=(c[F>>2]|0)+1}c[I>>2]=(c[I>>2]|0)+1}i=L;return}function ve(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;h=i;i=i+48|0;f=h+32|0;n=h+28|0;d=h+24|0;j=h+20|0;g=h+16|0;k=h+12|0;m=h+8|0;l=h+4|0;e=h;c[n>>2]=a;c[d>>2]=b;b=c[n>>2]|0;c[j>>2]=(we((c[n>>2]|0)>0?b:0-b|0)|0)-1;c[m>>2]=c[n>>2]<<c[j>>2];c[k>>2]=536870911/(c[m>>2]>>16|0)|0;c[e>>2]=c[k>>2]<<16;b=_(c[m>>2]>>16,(c[k>>2]&65535)<<16>>16)|0;c[l>>2]=536870912-(b+((_(c[m>>2]&65535,(c[k>>2]&65535)<<16>>16)|0)>>16))<<3;b=_(c[l>>2]>>16,(c[k>>2]&65535)<<16>>16)|0;b=(c[e>>2]|0)+(b+((_(c[l>>2]&65535,(c[k>>2]&65535)<<16>>16)|0)>>16))|0;c[e>>2]=b+(_(c[l>>2]|0,(c[k>>2]>>15)+1>>1)|0);c[g>>2]=61-(c[j>>2]|0)-(c[d>>2]|0);b=c[g>>2]|0;if((c[g>>2]|0)>0)if((b|0)<32){c[f>>2]=c[e>>2]>>c[g>>2];n=c[f>>2]|0;i=h;return n|0}else{c[f>>2]=0;n=c[f>>2]|0;i=h;return n|0}a=c[e>>2]|0;d=0-(c[g>>2]|0)|0;do if((-2147483648>>0-b|0)>(2147483647>>0-(c[g>>2]|0)|0)){if((a|0)>(-2147483648>>d|0)){b=-2147483648>>0-(c[g>>2]|0);break}if((c[e>>2]|0)<(2147483647>>0-(c[g>>2]|0)|0)){b=2147483647>>0-(c[g>>2]|0);break}else{b=c[e>>2]|0;break}}else{if((a|0)>(2147483647>>d|0)){b=2147483647>>0-(c[g>>2]|0);break}if((c[e>>2]|0)<(-2147483648>>0-(c[g>>2]|0)|0)){b=-2147483648>>0-(c[g>>2]|0);break}else{b=c[e>>2]|0;break}}while(0);c[f>>2]=b<<0-(c[g>>2]|0);n=c[f>>2]|0;i=h;return n|0}function we(a){a=a|0;var b=0,d=0;d=i;i=i+16|0;b=d;c[b>>2]=a;if(!(c[b>>2]|0)){a=32;i=d;return a|0}a=32-(32-(aa(c[b>>2]|0)|0))|0;i=d;return a|0}function xe(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;h=i;i=i+48|0;f=h+40|0;q=h+36|0;p=h+32|0;j=h+28|0;l=h+24|0;k=h+20|0;g=h+16|0;m=h+12|0;n=h+8|0;o=h+4|0;e=h;c[q>>2]=a;c[p>>2]=b;c[j>>2]=d;b=c[q>>2]|0;c[l>>2]=(we((c[q>>2]|0)>0?b:0-b|0)|0)-1;c[n>>2]=c[q>>2]<<c[l>>2];b=c[p>>2]|0;c[k>>2]=(we((c[p>>2]|0)>0?b:0-b|0)|0)-1;c[o>>2]=c[p>>2]<<c[k>>2];c[m>>2]=536870911/(c[o>>2]>>16|0)|0;b=_(c[n>>2]>>16,(c[m>>2]&65535)<<16>>16)|0;c[e>>2]=b+((_(c[n>>2]&65535,(c[m>>2]&65535)<<16>>16)|0)>>16);b=c[n>>2]|0;a=c[o>>2]|0;d=c[e>>2]|0;d=yj(a|0,((a|0)<0)<<31>>31|0,d|0,((d|0)<0)<<31>>31|0)|0;d=nj(d|0,C|0,32)|0;c[n>>2]=b-(d<<3);d=_(c[n>>2]>>16,(c[m>>2]&65535)<<16>>16)|0;c[e>>2]=(c[e>>2]|0)+(d+((_(c[n>>2]&65535,(c[m>>2]&65535)<<16>>16)|0)>>16));c[g>>2]=29+(c[l>>2]|0)-(c[k>>2]|0)-(c[j>>2]|0);d=c[g>>2]|0;if((c[g>>2]|0)>=0)if((d|0)<32){c[f>>2]=c[e>>2]>>c[g>>2];q=c[f>>2]|0;i=h;return q|0}else{c[f>>2]=0;q=c[f>>2]|0;i=h;return q|0}a=c[e>>2]|0;b=0-(c[g>>2]|0)|0;do if((-2147483648>>0-d|0)>(2147483647>>0-(c[g>>2]|0)|0)){if((a|0)>(-2147483648>>b|0)){d=-2147483648>>0-(c[g>>2]|0);break}if((c[e>>2]|0)<(2147483647>>0-(c[g>>2]|0)|0)){d=2147483647>>0-(c[g>>2]|0);break}else{d=c[e>>2]|0;break}}else{if((a|0)>(2147483647>>b|0)){d=2147483647>>0-(c[g>>2]|0);break}if((c[e>>2]|0)<(-2147483648>>0-(c[g>>2]|0)|0)){d=-2147483648>>0-(c[g>>2]|0);break}else{d=c[e>>2]|0;break}}while(0);c[f>>2]=d<<0-(c[g>>2]|0);q=c[f>>2]|0;i=h;return q|0} |
| | | function Uh(a,b,d){a=a|0;b=+b;d=d|0;var e=0,f=0,h=0,j=0,k=0,l=0;l=i;i=i+32|0;e=l+16|0;f=l+12|0;h=l+8|0;k=l+4|0;j=l;c[e>>2]=a;g[f>>2]=b;c[h>>2]=d;c[j>>2]=c[h>>2]&65532;c[k>>2]=0;while(1){if((c[k>>2]|0)>=(c[j>>2]|0))break;d=(c[e>>2]|0)+((c[k>>2]|0)+0<<2)|0;g[d>>2]=+g[d>>2]*+g[f>>2];d=(c[e>>2]|0)+((c[k>>2]|0)+1<<2)|0;g[d>>2]=+g[d>>2]*+g[f>>2];d=(c[e>>2]|0)+((c[k>>2]|0)+2<<2)|0;g[d>>2]=+g[d>>2]*+g[f>>2];d=(c[e>>2]|0)+((c[k>>2]|0)+3<<2)|0;g[d>>2]=+g[d>>2]*+g[f>>2];c[k>>2]=(c[k>>2]|0)+4}while(1){if((c[k>>2]|0)>=(c[h>>2]|0))break;j=(c[e>>2]|0)+(c[k>>2]<<2)|0;g[j>>2]=+g[j>>2]*+g[f>>2];c[k>>2]=(c[k>>2]|0)+1}i=l;return}function Vh(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0.0;p=i;i=i+176|0;e=p+168|0;f=p+164|0;h=p+160|0;m=p+156|0;n=p+152|0;j=p+16|0;k=p+8|0;l=p+4|0;o=p;c[e>>2]=a;c[f>>2]=b;c[h>>2]=d;c[m>>2]=0;while(1){if((c[m>>2]|0)>=((c[h>>2]|0)+1|0))break;q=+g[(c[f>>2]|0)+(c[m>>2]<<2)>>2];g[j+(c[m>>2]<<3)+4>>2]=q;g[j+(c[m>>2]<<3)>>2]=q;c[m>>2]=(c[m>>2]|0)+1}c[m>>2]=0;while(1){if((c[m>>2]|0)>=(c[h>>2]|0))break;g[o>>2]=-+g[j+((c[m>>2]|0)+1<<3)>>2]/(+g[j+4>>2]>9.999999717180685e-10?+g[j+4>>2]:9.999999717180685e-10);g[(c[e>>2]|0)+(c[m>>2]<<2)>>2]=+g[o>>2];c[n>>2]=0;while(1){if((c[n>>2]|0)>=((c[h>>2]|0)-(c[m>>2]|0)|0))break;g[k>>2]=+g[j+((c[n>>2]|0)+(c[m>>2]|0)+1<<3)>>2];g[l>>2]=+g[j+(c[n>>2]<<3)+4>>2];g[j+((c[n>>2]|0)+(c[m>>2]|0)+1<<3)>>2]=+g[k>>2]+ +g[l>>2]*+g[o>>2];g[j+(c[n>>2]<<3)+4>>2]=+g[l>>2]+ +g[k>>2]*+g[o>>2];c[n>>2]=(c[n>>2]|0)+1}c[m>>2]=(c[m>>2]|0)+1}i=p;return +(+g[j+4>>2])}function Wh(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;o=i;i=i+32|0;f=o+24|0;h=o+20|0;j=o+16|0;k=o+12|0;n=o+8|0;l=o+4|0;m=o;c[f>>2]=a;c[h>>2]=b;c[j>>2]=d;c[k>>2]=e;c[l>>2]=0;while(1){if((c[l>>2]|0)>=(c[k>>2]|0))break;c[(c[h>>2]|0)+(c[l>>2]<<2)>>2]=c[l>>2];c[l>>2]=(c[l>>2]|0)+1}c[l>>2]=1;while(1){if((c[l>>2]|0)>=(c[k>>2]|0))break;g[n>>2]=+g[(c[f>>2]|0)+(c[l>>2]<<2)>>2];c[m>>2]=(c[l>>2]|0)-1;while(1){if((c[m>>2]|0)<0)break;if(!(+g[n>>2]>+g[(c[f>>2]|0)+(c[m>>2]<<2)>>2]))break;g[(c[f>>2]|0)+((c[m>>2]|0)+1<<2)>>2]=+g[(c[f>>2]|0)+(c[m>>2]<<2)>>2];c[(c[h>>2]|0)+((c[m>>2]|0)+1<<2)>>2]=c[(c[h>>2]|0)+(c[m>>2]<<2)>>2];c[m>>2]=(c[m>>2]|0)+-1}g[(c[f>>2]|0)+((c[m>>2]|0)+1<<2)>>2]=+g[n>>2];c[(c[h>>2]|0)+((c[m>>2]|0)+1<<2)>>2]=c[l>>2];c[l>>2]=(c[l>>2]|0)+1}c[l>>2]=c[k>>2];while(1){if((c[l>>2]|0)>=(c[j>>2]|0))break;g[n>>2]=+g[(c[f>>2]|0)+(c[l>>2]<<2)>>2];if(+g[n>>2]>+g[(c[f>>2]|0)+((c[k>>2]|0)-1<<2)>>2]){c[m>>2]=(c[k>>2]|0)-2;while(1){if((c[m>>2]|0)<0)break;if(!(+g[n>>2]>+g[(c[f>>2]|0)+(c[m>>2]<<2)>>2]))break;g[(c[f>>2]|0)+((c[m>>2]|0)+1<<2)>>2]=+g[(c[f>>2]|0)+(c[m>>2]<<2)>>2];c[(c[h>>2]|0)+((c[m>>2]|0)+1<<2)>>2]=c[(c[h>>2]|0)+(c[m>>2]<<2)>>2];c[m>>2]=(c[m>>2]|0)+-1}g[(c[f>>2]|0)+((c[m>>2]|0)+1<<2)>>2]=+g[n>>2];c[(c[h>>2]|0)+((c[m>>2]|0)+1<<2)>>2]=c[l>>2]}c[l>>2]=(c[l>>2]|0)+1}i=o;return}function Xh(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0;A=i;i=i+80|0;h=A+64|0;j=A+60|0;k=A+56|0;l=A+52|0;n=A+48|0;r=A+44|0;x=A+40|0;m=A+36|0;y=A+32|0;o=A+28|0;w=A+24|0;q=A+20|0;s=A+16|0;v=A+12|0;u=A+8|0;p=A+4|0;t=A;c[h>>2]=a;c[j>>2]=b;c[k>>2]=d;c[l>>2]=e;if(!((((c[k>>2]|0)<1|(c[j>>2]|0)<1)^1)&(c[h>>2]|0)!=0&(c[l>>2]|0)!=0)){i=A;return}c[r>>2]=0;while(1){if((c[r>>2]|0)>=(_(c[j>>2]|0,c[k>>2]|0)|0))break;if(2.0<+g[(c[h>>2]|0)+(c[r>>2]<<2)>>2])f=2.0;else f=+g[(c[h>>2]|0)+(c[r>>2]<<2)>>2];if(!(-2.0>f))if(2.0<+g[(c[h>>2]|0)+(c[r>>2]<<2)>>2])f=2.0;else f=+g[(c[h>>2]|0)+(c[r>>2]<<2)>>2];else f=-2.0;g[(c[h>>2]|0)+(c[r>>2]<<2)>>2]=f;c[r>>2]=(c[r>>2]|0)+1}c[n>>2]=0;while(1){if((c[n>>2]|0)>=(c[k>>2]|0))break;c[x>>2]=(c[h>>2]|0)+(c[n>>2]<<2);g[m>>2]=+g[(c[l>>2]|0)+(c[n>>2]<<2)>>2];c[r>>2]=0;while(1){if((c[r>>2]|0)>=(c[j>>2]|0))break;e=_(c[r>>2]|0,c[k>>2]|0)|0;if(+g[(c[x>>2]|0)+(e<<2)>>2]*+g[m>>2]>=0.0)break;d=_(c[r>>2]|0,c[k>>2]|0)|0;b=_(c[r>>2]|0,c[k>>2]|0)|0;a=_(c[r>>2]|0,c[k>>2]|0)|0;e=_(c[r>>2]|0,c[k>>2]|0)|0;g[(c[x>>2]|0)+(e<<2)>>2]=+g[(c[x>>2]|0)+(d<<2)>>2]+ +g[m>>2]*+g[(c[x>>2]|0)+(b<<2)>>2]*+g[(c[x>>2]|0)+(a<<2)>>2];c[r>>2]=(c[r>>2]|0)+1}c[o>>2]=0;g[y>>2]=+g[c[x>>2]>>2];do{c[v>>2]=0;c[r>>2]=c[o>>2];while(1){if((c[r>>2]|0)>=(c[j>>2]|0))break;e=_(c[r>>2]|0,c[k>>2]|0)|0;if(+g[(c[x>>2]|0)+(e<<2)>>2]>1.0)break;e=_(c[r>>2]|0,c[k>>2]|0)|0;if(+g[(c[x>>2]|0)+(e<<2)>>2]<-1.0)break;c[r>>2]=(c[r>>2]|0)+1}if((c[r>>2]|0)==(c[j>>2]|0)){z=23;break}c[u>>2]=c[r>>2];e=c[r>>2]|0;c[q>>2]=e;c[w>>2]=e;e=_(c[r>>2]|0,c[k>>2]|0)|0;g[s>>2]=+N(+(+g[(c[x>>2]|0)+(e<<2)>>2]));while(1){if((c[w>>2]|0)<=0)break;a=_(c[r>>2]|0,c[k>>2]|0)|0;e=_((c[w>>2]|0)-1|0,c[k>>2]|0)|0;if(!(+g[(c[x>>2]|0)+(a<<2)>>2]*+g[(c[x>>2]|0)+(e<<2)>>2]>=0.0))break;c[w>>2]=(c[w>>2]|0)+-1}while(1){if((c[q>>2]|0)>=(c[j>>2]|0))break;a=_(c[r>>2]|0,c[k>>2]|0)|0;e=_(c[q>>2]|0,c[k>>2]|0)|0;if(!(+g[(c[x>>2]|0)+(a<<2)>>2]*+g[(c[x>>2]|0)+(e<<2)>>2]>=0.0))break;e=_(c[q>>2]|0,c[k>>2]|0)|0;f=+N(+(+g[(c[x>>2]|0)+(e<<2)>>2]));if(f>+g[s>>2]){e=_(c[q>>2]|0,c[k>>2]|0)|0;g[s>>2]=+N(+(+g[(c[x>>2]|0)+(e<<2)>>2]));c[u>>2]=c[q>>2]}c[q>>2]=(c[q>>2]|0)+1}if(!(c[w>>2]|0)){d=_(c[r>>2]|0,c[k>>2]|0)|0;d=+g[(c[x>>2]|0)+(d<<2)>>2]*+g[c[x>>2]>>2]>=0.0}else d=0;c[v>>2]=d&1;g[m>>2]=(+g[s>>2]-1.0)/(+g[s>>2]*+g[s>>2]);e=_(c[r>>2]|0,c[k>>2]|0)|0;if(+g[(c[x>>2]|0)+(e<<2)>>2]>0.0)g[m>>2]=-+g[m>>2];c[r>>2]=c[w>>2];while(1){if((c[r>>2]|0)>=(c[q>>2]|0))break;d=_(c[r>>2]|0,c[k>>2]|0)|0;b=_(c[r>>2]|0,c[k>>2]|0)|0;a=_(c[r>>2]|0,c[k>>2]|0)|0;e=_(c[r>>2]|0,c[k>>2]|0)|0;g[(c[x>>2]|0)+(e<<2)>>2]=+g[(c[x>>2]|0)+(d<<2)>>2]+ +g[m>>2]*+g[(c[x>>2]|0)+(b<<2)>>2]*+g[(c[x>>2]|0)+(a<<2)>>2];c[r>>2]=(c[r>>2]|0)+1}a:do if((c[v>>2]|0)!=0&(c[u>>2]|0)>=2){g[t>>2]=+g[y>>2]-+g[c[x>>2]>>2];g[p>>2]=+g[t>>2]/+(c[u>>2]|0);c[r>>2]=c[o>>2];while(1){if((c[r>>2]|0)>=(c[u>>2]|0))break a;g[t>>2]=+g[t>>2]-+g[p>>2];e=_(c[r>>2]|0,c[k>>2]|0)|0;e=(c[x>>2]|0)+(e<<2)|0;g[e>>2]=+g[e>>2]+ +g[t>>2];e=_(c[r>>2]|0,c[k>>2]|0)|0;if(1.0<+g[(c[x>>2]|0)+(e<<2)>>2])f=1.0;else{e=_(c[r>>2]|0,c[k>>2]|0)|0;f=+g[(c[x>>2]|0)+(e<<2)>>2]}if(!(-1.0>f)){e=_(c[r>>2]|0,c[k>>2]|0)|0;if(1.0<+g[(c[x>>2]|0)+(e<<2)>>2])f=1.0;else{e=_(c[r>>2]|0,c[k>>2]|0)|0;f=+g[(c[x>>2]|0)+(e<<2)>>2]}}else f=-1.0;e=_(c[r>>2]|0,c[k>>2]|0)|0;g[(c[x>>2]|0)+(e<<2)>>2]=f;c[r>>2]=(c[r>>2]|0)+1}}while(0);c[o>>2]=c[q>>2]}while((c[o>>2]|0)!=(c[j>>2]|0));if((z|0)==23){z=0;g[m>>2]=0.0}g[(c[l>>2]|0)+(c[n>>2]<<2)>>2]=+g[m>>2];c[n>>2]=(c[n>>2]|0)+1}i=A;return}function Yh(b,e){b=b|0;e=e|0;var f=0,g=0,h=0,j=0;j=i;i=i+16|0;f=j+8|0;g=j+4|0;h=j;c[g>>2]=b;c[h>>2]=e;e=c[g>>2]|0;if((c[g>>2]|0)<252){a[c[h>>2]>>0]=e;c[f>>2]=1;h=c[f>>2]|0;i=j;return h|0}else{a[c[h>>2]>>0]=252+(e&3);a[(c[h>>2]|0)+1>>0]=(c[g>>2]|0)-(d[c[h>>2]>>0]|0)>>2;c[f>>2]=2;h=c[f>>2]|0;i=j;return h|0}return 0}function Zh(a,b){a=a|0;b=b|0;var e=0,f=0,g=0,h=0;h=i;i=i+16|0;e=h+8|0;f=h+4|0;g=h;c[e>>2]=a;c[f>>2]=b;b=d[c[e>>2]>>0]|0;if((d[c[e>>2]>>0]|0)&128|0){c[g>>2]=b>>3&3;c[g>>2]=(c[f>>2]<<c[g>>2]|0)/400|0;g=c[g>>2]|0;i=h;return g|0}a=d[c[e>>2]>>0]|0;if((b&96|0)!=96){c[g>>2]=a>>3&3;b=c[f>>2]|0;if((c[g>>2]|0)==3){c[g>>2]=(b*60|0)/1e3|0;g=c[g>>2]|0;i=h;return g|0}else{c[g>>2]=(b<<c[g>>2]|0)/100|0;g=c[g>>2]|0;i=h;return g|0}}else{b=c[f>>2]|0;if(a&8|0)b=(b|0)/50|0;else b=(b|0)/100|0;c[g>>2]=b;g=c[g>>2]|0;i=h;return g|0}return 0}function _h(e,f,g,h,j,k,l,m){e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|0;m=m|0;var n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0;J=i;i=i+80|0;n=J+72|0;o=J+68|0;p=J+64|0;q=J+60|0;r=J+56|0;s=J+52|0;t=J+48|0;u=J+44|0;v=J+40|0;C=J+36|0;w=J+32|0;z=J+28|0;x=J+24|0;y=J+77|0;H=J+76|0;B=J+20|0;D=J+16|0;F=J+12|0;A=J+8|0;E=J+4|0;G=J;c[o>>2]=e;c[p>>2]=f;c[q>>2]=g;c[r>>2]=h;c[s>>2]=j;c[t>>2]=k;c[u>>2]=l;c[v>>2]=m;c[F>>2]=0;c[A>>2]=c[o>>2];if(!(c[t>>2]|0)){c[n>>2]=-1;I=c[n>>2]|0;i=J;return I|0}c[B>>2]=Zh(c[o>>2]|0,48e3)|0;c[x>>2]=0;k=c[o>>2]|0;c[o>>2]=k+1;a[H>>0]=a[k>>0]|0;c[p>>2]=(c[p>>2]|0)+-1;c[D>>2]=c[p>>2];a:do switch(d[H>>0]&3|0){case 0:{c[z>>2]=1;break}case 1:{c[z>>2]=2;c[x>>2]=1;if(!(c[q>>2]|0)){if(!(c[p>>2]&1)){c[D>>2]=(c[p>>2]|0)/2|0;b[c[t>>2]>>1]=c[D>>2];break a}c[n>>2]=-4;I=c[n>>2]|0;i=J;return I|0}break}case 2:{c[z>>2]=2;c[w>>2]=$h(c[o>>2]|0,c[p>>2]|0,c[t>>2]|0)|0;c[p>>2]=(c[p>>2]|0)-(c[w>>2]|0);if((b[c[t>>2]>>1]|0)>=0?(b[c[t>>2]>>1]|0)<=(c[p>>2]|0):0){c[o>>2]=(c[o>>2]|0)+(c[w>>2]|0);c[D>>2]=(c[p>>2]|0)-(b[c[t>>2]>>1]|0);break a}c[n>>2]=-4;I=c[n>>2]|0;i=J;return I|0}default:{if((c[p>>2]|0)<1){c[n>>2]=-4;I=c[n>>2]|0;i=J;return I|0}k=c[o>>2]|0;c[o>>2]=k+1;a[y>>0]=a[k>>0]|0;c[z>>2]=d[y>>0]&63;if((c[z>>2]|0)>0?(_(c[B>>2]|0,c[z>>2]|0)|0)<=5760:0){c[p>>2]=(c[p>>2]|0)+-1;b:do if(d[y>>0]&64|0){while(1){if((c[p>>2]|0)<=0)break;k=c[o>>2]|0;c[o>>2]=k+1;c[E>>2]=d[k>>0];c[p>>2]=(c[p>>2]|0)+-1;c[G>>2]=(c[E>>2]|0)==255?254:c[E>>2]|0;c[p>>2]=(c[p>>2]|0)-(c[G>>2]|0);c[F>>2]=(c[F>>2]|0)+(c[G>>2]|0);if((c[E>>2]|0)!=255)break b}c[n>>2]=-4;I=c[n>>2]|0;i=J;return I|0}while(0);if((c[p>>2]|0)<0){c[n>>2]=-4;I=c[n>>2]|0;i=J;return I|0}c[x>>2]=((d[y>>0]&128|0)!=0^1)&1;if(c[x>>2]|0){if(c[q>>2]|0)break a;c[D>>2]=(c[p>>2]|0)/(c[z>>2]|0)|0;I=_(c[D>>2]|0,c[z>>2]|0)|0;if((I|0)!=(c[p>>2]|0)){c[n>>2]=-4;I=c[n>>2]|0;i=J;return I|0}c[C>>2]=0;while(1){if((c[C>>2]|0)>=((c[z>>2]|0)-1|0))break a;b[(c[t>>2]|0)+(c[C>>2]<<1)>>1]=c[D>>2];c[C>>2]=(c[C>>2]|0)+1}}c[D>>2]=c[p>>2];c[C>>2]=0;while(1){if((c[C>>2]|0)>=((c[z>>2]|0)-1|0))break;c[w>>2]=$h(c[o>>2]|0,c[p>>2]|0,(c[t>>2]|0)+(c[C>>2]<<1)|0)|0;c[p>>2]=(c[p>>2]|0)-(c[w>>2]|0);if((b[(c[t>>2]|0)+(c[C>>2]<<1)>>1]|0)<0){I=29;break}if((b[(c[t>>2]|0)+(c[C>>2]<<1)>>1]|0)>(c[p>>2]|0)){I=29;break}c[o>>2]=(c[o>>2]|0)+(c[w>>2]|0);c[D>>2]=(c[D>>2]|0)-((c[w>>2]|0)+(b[(c[t>>2]|0)+(c[C>>2]<<1)>>1]|0));c[C>>2]=(c[C>>2]|0)+1}if((I|0)==29){c[n>>2]=-4;I=c[n>>2]|0;i=J;return I|0}if((c[D>>2]|0)>=0)break a;c[n>>2]=-4;I=c[n>>2]|0;i=J;return I|0}c[n>>2]=-4;I=c[n>>2]|0;i=J;return I|0}}while(0);c:do if(c[q>>2]|0){c[w>>2]=$h(c[o>>2]|0,c[p>>2]|0,(c[t>>2]|0)+(c[z>>2]<<1)+-2|0)|0;c[p>>2]=(c[p>>2]|0)-(c[w>>2]|0);if((b[(c[t>>2]|0)+((c[z>>2]|0)-1<<1)>>1]|0)>=0?(b[(c[t>>2]|0)+((c[z>>2]|0)-1<<1)>>1]|0)<=(c[p>>2]|0):0){c[o>>2]=(c[o>>2]|0)+(c[w>>2]|0);if(!(c[x>>2]|0)){if(((c[w>>2]|0)+(b[(c[t>>2]|0)+((c[z>>2]|0)-1<<1)>>1]|0)|0)<=(c[D>>2]|0))break;c[n>>2]=-4;I=c[n>>2]|0;i=J;return I|0}I=_(b[(c[t>>2]|0)+((c[z>>2]|0)-1<<1)>>1]|0,c[z>>2]|0)|0;if((I|0)>(c[p>>2]|0)){c[n>>2]=-4;I=c[n>>2]|0;i=J;return I|0}c[C>>2]=0;while(1){if((c[C>>2]|0)>=((c[z>>2]|0)-1|0))break c;b[(c[t>>2]|0)+(c[C>>2]<<1)>>1]=b[(c[t>>2]|0)+((c[z>>2]|0)-1<<1)>>1]|0;c[C>>2]=(c[C>>2]|0)+1}}c[n>>2]=-4;I=c[n>>2]|0;i=J;return I|0}else{if((c[D>>2]|0)<=1275){b[(c[t>>2]|0)+((c[z>>2]|0)-1<<1)>>1]=c[D>>2];break}c[n>>2]=-4;I=c[n>>2]|0;i=J;return I|0}while(0);if(c[u>>2]|0)c[c[u>>2]>>2]=(c[o>>2]|0)-(c[A>>2]|0);c[C>>2]=0;while(1){if((c[C>>2]|0)>=(c[z>>2]|0))break;if(c[s>>2]|0)c[(c[s>>2]|0)+(c[C>>2]<<2)>>2]=c[o>>2];c[o>>2]=(c[o>>2]|0)+(b[(c[t>>2]|0)+(c[C>>2]<<1)>>1]|0);c[C>>2]=(c[C>>2]|0)+1}if(c[v>>2]|0)c[c[v>>2]>>2]=(c[F>>2]|0)+((c[o>>2]|0)-(c[A>>2]|0));if(c[r>>2]|0)a[c[r>>2]>>0]=a[H>>0]|0;c[n>>2]=c[z>>2];I=c[n>>2]|0;i=J;return I|0}function $h(a,e,f){a=a|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0;l=i;i=i+16|0;g=l+12|0;h=l+8|0;j=l+4|0;k=l;c[h>>2]=a;c[j>>2]=e;c[k>>2]=f;if((c[j>>2]|0)<1){b[c[k>>2]>>1]=-1;c[g>>2]=-1;f=c[g>>2]|0;i=l;return f|0}if((d[c[h>>2]>>0]|0|0)<252){b[c[k>>2]>>1]=d[c[h>>2]>>0]|0;c[g>>2]=1;f=c[g>>2]|0;i=l;return f|0}if((c[j>>2]|0)<2){b[c[k>>2]>>1]=-1;c[g>>2]=-1;f=c[g>>2]|0;i=l;return f|0}else{b[c[k>>2]>>1]=((d[(c[h>>2]|0)+1>>0]|0)<<2)+(d[c[h>>2]>>0]|0);c[g>>2]=2;f=c[g>>2]|0;i=l;return f|0}return 0}function ai(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;h=i;i=i+32|0;b=h+16|0;d=h+12|0;g=h+8|0;e=h+4|0;f=h;c[d>>2]=a;if((c[d>>2]|0)<1|(c[d>>2]|0)>2){c[b>>2]=0;g=c[b>>2]|0;i=h;return g|0}c[f>>2]=Pd(g)|0;if(c[f>>2]|0){c[b>>2]=0;g=c[b>>2]|0;i=h;return g|0}else{c[g>>2]=bi(c[g>>2]|0)|0;c[e>>2]=Fb(c[d>>2]|0)|0;f=bi(88)|0;c[b>>2]=f+(c[g>>2]|0)+(c[e>>2]|0);g=c[b>>2]|0;i=h;return g|0}return 0}function bi(a){a=a|0;var b=0,d=0,e=0;b=i;i=i+16|0;e=b+4|0;d=b;c[e>>2]=a;c[d>>2]=4;a=_((((c[e>>2]|0)+(c[d>>2]|0)-1|0)>>>0)/((c[d>>2]|0)>>>0)|0,c[d>>2]|0)|0;i=b;return a|0}function ci(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;o=i;i=i+48|0;n=o;e=o+32|0;f=o+28|0;g=o+24|0;h=o+20|0;m=o+16|0;j=o+12|0;k=o+8|0;l=o+4|0;c[f>>2]=a;c[g>>2]=b;c[h>>2]=d;if(!((c[g>>2]|0)!=48e3&(c[g>>2]|0)!=24e3&(c[g>>2]|0)!=16e3&(c[g>>2]|0)!=12e3&(c[g>>2]|0)!=8e3)?!((c[h>>2]|0)!=1&(c[h>>2]|0)!=2):0){a=c[f>>2]|0;oj(a|0,0,ai(c[h>>2]|0)|0)|0;c[k>>2]=Pd(l)|0;if(c[k>>2]|0){c[e>>2]=-3;n=c[e>>2]|0;i=o;return n|0}c[l>>2]=bi(c[l>>2]|0)|0;a=bi(88)|0;c[(c[f>>2]|0)+4>>2]=a;c[c[f>>2]>>2]=(c[(c[f>>2]|0)+4>>2]|0)+(c[l>>2]|0);c[m>>2]=(c[f>>2]|0)+(c[(c[f>>2]|0)+4>>2]|0);c[j>>2]=(c[f>>2]|0)+(c[c[f>>2]>>2]|0);a=c[h>>2]|0;c[(c[f>>2]|0)+8>>2]=a;c[(c[f>>2]|0)+48>>2]=a;c[(c[f>>2]|0)+12>>2]=c[g>>2];c[(c[f>>2]|0)+16+8>>2]=c[(c[f>>2]|0)+12>>2];c[(c[f>>2]|0)+16>>2]=c[(c[f>>2]|0)+8>>2];c[k>>2]=Qd(c[m>>2]|0)|0;if(c[k>>2]|0){c[e>>2]=-3;n=c[e>>2]|0;i=o;return n|0}c[k>>2]=Hb(c[j>>2]|0,c[g>>2]|0,c[h>>2]|0)|0;if(c[k>>2]|0){c[e>>2]=-3;n=c[e>>2]|0;i=o;return n|0}else{a=c[j>>2]|0;c[n>>2]=0;Kb(a,10016,n)|0;c[(c[f>>2]|0)+60>>2]=0;c[(c[f>>2]|0)+64>>2]=(c[g>>2]|0)/400|0;n=di()|0;c[(c[f>>2]|0)+44>>2]=n;c[e>>2]=0;n=c[e>>2]|0;i=o;return n|0}}c[e>>2]=-1;n=c[e>>2]|0;i=o;return n|0}function di(){return 0}function ei(a,d,e,f,h,j,k,l,m){a=a|0;d=d|0;e=e|0;f=f|0;h=h|0;j=j|0;k=k|0;l=l|0;m=m|0;var n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0;N=i;i=i+208|0;G=N+88|0;H=N+84|0;n=N+80|0;o=N+76|0;I=N+72|0;J=N+68|0;p=N+64|0;q=N+60|0;r=N+56|0;s=N+52|0;v=N+48|0;w=N+44|0;t=N+40|0;x=N+36|0;F=N+192|0;z=N+32|0;y=N+28|0;A=N+24|0;B=N+20|0;E=N+96|0;K=N+16|0;L=N+12|0;u=N+8|0;C=N+4|0;D=N;c[H>>2]=a;c[n>>2]=d;c[o>>2]=e;c[I>>2]=f;c[J>>2]=h;c[p>>2]=j;c[q>>2]=k;c[r>>2]=l;c[s>>2]=m;if((c[p>>2]|0)<0|(c[p>>2]|0)>1){c[G>>2]=-1;M=c[G>>2]|0;i=N;return M|0}if((c[p>>2]|0)!=0|(c[o>>2]|0)==0|(c[n>>2]|0)==0?(c[J>>2]|0)%((c[(c[H>>2]|0)+12>>2]|0)/400|0|0)|0|0:0){c[G>>2]=-1;M=c[G>>2]|0;i=N;return M|0}if((c[o>>2]|0)==0|(c[n>>2]|0)==0){c[K>>2]=0;while(1){n=(c[I>>2]|0)+((_(c[K>>2]|0,c[(c[H>>2]|0)+8>>2]|0)|0)<<2)|0;c[L>>2]=fi(c[H>>2]|0,0,0,n,(c[J>>2]|0)-(c[K>>2]|0)|0,0)|0;n=c[L>>2]|0;if((c[L>>2]|0)<0){M=9;break}c[K>>2]=(c[K>>2]|0)+n;if((c[K>>2]|0)>=(c[J>>2]|0)){M=11;break}}if((M|0)==9){c[G>>2]=n;M=c[G>>2]|0;i=N;return M|0}else if((M|0)==11){ii()|0;c[(c[H>>2]|0)+72>>2]=c[K>>2];c[G>>2]=c[K>>2];M=c[G>>2]|0;i=N;return M|0}}if((c[o>>2]|0)<0){c[G>>2]=-1;M=c[G>>2]|0;i=N;return M|0}c[A>>2]=ji(c[n>>2]|0)|0;c[y>>2]=ki(c[n>>2]|0)|0;c[z>>2]=Zh(c[n>>2]|0,c[(c[H>>2]|0)+12>>2]|0)|0;c[B>>2]=li(c[n>>2]|0)|0;c[t>>2]=_h(c[n>>2]|0,c[o>>2]|0,c[q>>2]|0,F,0,E,x,c[r>>2]|0)|0;if((c[t>>2]|0)<0){c[G>>2]=c[t>>2];M=c[G>>2]|0;i=N;return M|0}c[n>>2]=(c[n>>2]|0)+(c[x>>2]|0);if(c[p>>2]|0){if(!((c[A>>2]|0)==1002?1:(c[J>>2]|0)<(c[z>>2]|0))?(c[(c[H>>2]|0)+56>>2]|0)!=1002:0){c[u>>2]=c[(c[H>>2]|0)+72>>2];if((c[J>>2]|0)-(c[z>>2]|0)|0?(c[C>>2]=ei(c[H>>2]|0,0,0,c[I>>2]|0,(c[J>>2]|0)-(c[z>>2]|0)|0,0,0,0,c[s>>2]|0)|0,(c[C>>2]|0)<0):0){c[(c[H>>2]|0)+72>>2]=c[u>>2];c[G>>2]=c[C>>2];M=c[G>>2]|0;i=N;return M|0}c[(c[H>>2]|0)+56>>2]=c[A>>2];c[(c[H>>2]|0)+52>>2]=c[y>>2];c[(c[H>>2]|0)+64>>2]=c[z>>2];c[(c[H>>2]|0)+48>>2]=c[B>>2];M=(c[I>>2]|0)+((_(c[(c[H>>2]|0)+8>>2]|0,(c[J>>2]|0)-(c[z>>2]|0)|0)|0)<<2)|0;c[C>>2]=fi(c[H>>2]|0,c[n>>2]|0,b[E>>1]|0,M,c[z>>2]|0,1)|0;if((c[C>>2]|0)<0){c[G>>2]=c[C>>2];M=c[G>>2]|0;i=N;return M|0}else{ii()|0;c[(c[H>>2]|0)+72>>2]=c[J>>2];c[G>>2]=c[J>>2];M=c[G>>2]|0;i=N;return M|0}}c[G>>2]=ei(c[H>>2]|0,0,0,c[I>>2]|0,c[J>>2]|0,0,0,0,c[s>>2]|0)|0;M=c[G>>2]|0;i=N;return M|0}L=_(c[t>>2]|0,c[z>>2]|0)|0;if((L|0)>(c[J>>2]|0)){c[G>>2]=-2;M=c[G>>2]|0;i=N;return M|0}c[(c[H>>2]|0)+56>>2]=c[A>>2];c[(c[H>>2]|0)+52>>2]=c[y>>2];c[(c[H>>2]|0)+64>>2]=c[z>>2];c[(c[H>>2]|0)+48>>2]=c[B>>2];c[w>>2]=0;c[v>>2]=0;while(1){if((c[v>>2]|0)>=(c[t>>2]|0))break;L=(c[I>>2]|0)+((_(c[w>>2]|0,c[(c[H>>2]|0)+8>>2]|0)|0)<<2)|0;c[D>>2]=fi(c[H>>2]|0,c[n>>2]|0,b[E+(c[v>>2]<<1)>>1]|0,L,(c[J>>2]|0)-(c[w>>2]|0)|0,0)|0;if((c[D>>2]|0)<0){M=31;break}c[n>>2]=(c[n>>2]|0)+(b[E+(c[v>>2]<<1)>>1]|0);c[w>>2]=(c[w>>2]|0)+(c[D>>2]|0);c[v>>2]=(c[v>>2]|0)+1}if((M|0)==31){c[G>>2]=c[D>>2];M=c[G>>2]|0;i=N;return M|0}c[(c[H>>2]|0)+72>>2]=c[w>>2];ii()|0;if(c[s>>2]|0)Xh(c[I>>2]|0,c[w>>2]|0,c[(c[H>>2]|0)+8>>2]|0,(c[H>>2]|0)+76|0);else{g[(c[H>>2]|0)+76+4>>2]=0.0;g[(c[H>>2]|0)+76>>2]=0.0}c[G>>2]=c[w>>2];M=c[G>>2]|0;i=N;return M|0}function fi(d,e,f,h,j,k){d=d|0;e=e|0;f=f|0;h=h|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,Y=0,Z=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ja=0,ka=0,la=0,ma=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0;ta=i;i=i+320|0;fa=ta+80|0;ea=ta+72|0;da=ta+64|0;ca=ta+56|0;ba=ta+48|0;aa=ta+40|0;$=ta+32|0;Z=ta+24|0;Y=ta+16|0;y=ta+8|0;x=ta;qa=ta+308|0;ra=ta+304|0;A=ta+300|0;B=ta+296|0;ja=ta+292|0;ka=ta+288|0;C=ta+284|0;t=ta+280|0;H=ta+276|0;N=ta+272|0;v=ta+268|0;pa=ta+264|0;L=ta+216|0;u=ta+212|0;o=ta+208|0;z=ta+204|0;m=ta+200|0;P=ta+196|0;S=ta+192|0;sa=ta+188|0;O=ta+184|0;W=ta+180|0;V=ta+176|0;Q=ta+172|0;R=ta+168|0;K=ta+164|0;F=ta+160|0;D=ta+156|0;E=ta+152|0;n=ta+148|0;oa=ta+144|0;ga=ta+140|0;T=ta+136|0;G=ta+132|0;l=ta+128|0;la=ta+124|0;ma=ta+120|0;r=ta+116|0;p=ta+112|0;s=ta+108|0;q=ta+104|0;w=ta+100|0;I=ta+96|0;U=ta+312|0;J=ta+92|0;M=ta+88|0;ha=ta+84|0;c[ra>>2]=d;c[A>>2]=e;c[B>>2]=f;c[ja>>2]=h;c[ka>>2]=j;c[C>>2]=k;c[v>>2]=0;c[pa>>2]=0;c[P>>2]=0;c[W>>2]=0;c[Q>>2]=0;c[R>>2]=0;c[K>>2]=0;c[T>>2]=0;c[t>>2]=(c[ra>>2]|0)+(c[(c[ra>>2]|0)+4>>2]|0);c[H>>2]=(c[ra>>2]|0)+(c[c[ra>>2]>>2]|0);c[oa>>2]=(c[(c[ra>>2]|0)+12>>2]|0)/50|0;c[n>>2]=c[oa>>2]>>1;c[E>>2]=c[n>>2]>>1;c[D>>2]=c[E>>2]>>1;if((c[ka>>2]|0)<(c[D>>2]|0)){c[qa>>2]=-2;sa=c[qa>>2]|0;i=ta;return sa|0}if((c[ka>>2]|0)<(((c[(c[ra>>2]|0)+12>>2]|0)/25|0)*3|0))e=c[ka>>2]|0;else e=((c[(c[ra>>2]|0)+12>>2]|0)/25|0)*3|0;c[ka>>2]=e;if((c[B>>2]|0)<=1){c[A>>2]=0;if((c[ka>>2]|0)<(c[(c[ra>>2]|0)+64>>2]|0))e=c[ka>>2]|0;else e=c[(c[ra>>2]|0)+64>>2]|0;c[ka>>2]=e}do if(!(c[A>>2]|0)){c[sa>>2]=c[ka>>2];c[O>>2]=c[(c[ra>>2]|0)+60>>2];if(!(c[O>>2]|0)){c[N>>2]=0;while(1){if((c[N>>2]|0)>=(_(c[sa>>2]|0,c[(c[ra>>2]|0)+8>>2]|0)|0))break;g[(c[ja>>2]|0)+(c[N>>2]<<2)>>2]=0.0;c[N>>2]=(c[N>>2]|0)+1}c[qa>>2]=c[sa>>2];sa=c[qa>>2]|0;i=ta;return sa|0}if((c[sa>>2]|0)>(c[oa>>2]|0)){while(1){c[l>>2]=fi(c[ra>>2]|0,0,0,c[ja>>2]|0,(c[sa>>2]|0)<(c[oa>>2]|0)?c[sa>>2]|0:c[oa>>2]|0,0)|0;e=c[l>>2]|0;if((c[l>>2]|0)<0){k=20;break}pa=_(e,c[(c[ra>>2]|0)+8>>2]|0)|0;c[ja>>2]=(c[ja>>2]|0)+(pa<<2);c[sa>>2]=(c[sa>>2]|0)-(c[l>>2]|0);if((c[sa>>2]|0)<=0){k=22;break}}if((k|0)==20){c[qa>>2]=e;sa=c[qa>>2]|0;i=ta;return sa|0}else if((k|0)==22){c[qa>>2]=c[ka>>2];sa=c[qa>>2]|0;i=ta;return sa|0}}if((c[sa>>2]|0)<(c[oa>>2]|0)){if((c[sa>>2]|0)>(c[n>>2]|0)){c[sa>>2]=c[n>>2];break}if(((c[O>>2]|0)!=1e3?(c[sa>>2]|0)>(c[E>>2]|0):0)?(c[sa>>2]|0)<(c[n>>2]|0):0)c[sa>>2]=c[E>>2]}}else{c[sa>>2]=c[(c[ra>>2]|0)+64>>2];c[O>>2]=c[(c[ra>>2]|0)+56>>2];Yb(L,c[A>>2]|0,c[B>>2]|0)}while(0);c[G>>2]=0;c[z>>2]=1;c[m>>2]=1;do if(c[A>>2]|0?(c[(c[ra>>2]|0)+60>>2]|0)>0:0){if(!(((c[O>>2]|0)==1002?(c[(c[ra>>2]|0)+60>>2]|0)!=1002:0)?!(c[(c[ra>>2]|0)+68>>2]|0):0)){if((c[O>>2]|0)==1002)break;if((c[(c[ra>>2]|0)+60>>2]|0)!=1002)break}c[W>>2]=1;e=_(c[E>>2]|0,c[(c[ra>>2]|0)+8>>2]|0)|0;if((c[O>>2]|0)==1002){c[m>>2]=e;break}else{c[z>>2]=e;break}}while(0);m=c[m>>2]|0;c[la>>2]=ia()|0;e=i;i=i+((1*(m<<2)|0)+15&-16)|0;if((c[W>>2]|0)!=0&(c[O>>2]|0)==1002){c[P>>2]=e;fi(c[ra>>2]|0,0,0,c[P>>2]|0,(c[E>>2]|0)<(c[sa>>2]|0)?c[E>>2]|0:c[sa>>2]|0,0)|0}a:do if((c[sa>>2]|0)>(c[ka>>2]|0)){c[qa>>2]=-1;c[ma>>2]=1}else{c[ka>>2]=c[sa>>2];if((c[O>>2]|0)==1002|(c[G>>2]|0)!=0)e=1;else e=_((c[n>>2]|0)>(c[ka>>2]|0)?c[n>>2]|0:c[ka>>2]|0,c[(c[ra>>2]|0)+8>>2]|0)|0;c[o>>2]=e;j=i;i=i+((1*(c[o>>2]<<1)|0)+15&-16)|0;b:do if((c[O>>2]|0)!=1002){c[s>>2]=j;if((c[(c[ra>>2]|0)+60>>2]|0)==1002)Qd(c[t>>2]|0)|0;if(10>(((c[sa>>2]|0)*1e3|0)/(c[(c[ra>>2]|0)+12>>2]|0)|0|0))e=10;else e=((c[sa>>2]|0)*1e3|0)/(c[(c[ra>>2]|0)+12>>2]|0)|0;c[(c[ra>>2]|0)+16+16>>2]=e;do if(c[A>>2]|0){c[(c[ra>>2]|0)+16+4>>2]=c[(c[ra>>2]|0)+48>>2];e=c[ra>>2]|0;if((c[O>>2]|0)!=1e3){c[e+16+12>>2]=16e3;break}k=c[ra>>2]|0;if((c[e+52>>2]|0)==1101){c[k+16+12>>2]=8e3;break}if((c[k+52>>2]|0)==1102){c[(c[ra>>2]|0)+16+12>>2]=12e3;break}else{c[(c[ra>>2]|0)+16+12>>2]=16e3;break}}while(0);c[r>>2]=(c[A>>2]|0)==0?1:c[C>>2]<<1;c[p>>2]=0;c:while(1){c[q>>2]=(c[p>>2]|0)==0&1;c[v>>2]=Rd(c[t>>2]|0,(c[ra>>2]|0)+16|0,c[r>>2]|0,c[q>>2]|0,L,c[s>>2]|0,u,c[(c[ra>>2]|0)+44>>2]|0)|0;d:do if(c[v>>2]|0){if(!(c[r>>2]|0))break c;c[u>>2]=c[ka>>2];c[N>>2]=0;while(1){if((c[N>>2]|0)>=(_(c[ka>>2]|0,c[(c[ra>>2]|0)+8>>2]|0)|0))break d;b[(c[s>>2]|0)+(c[N>>2]<<1)>>1]=0;c[N>>2]=(c[N>>2]|0)+1}}while(0);o=_(c[u>>2]|0,c[(c[ra>>2]|0)+8>>2]|0)|0;c[s>>2]=(c[s>>2]|0)+(o<<1);c[p>>2]=(c[p>>2]|0)+(c[u>>2]|0);if((c[p>>2]|0)>=(c[ka>>2]|0))break b}c[qa>>2]=-3;c[ma>>2]=1;break a}while(0);c[V>>2]=0;if((c[C>>2]|0)==0&(c[O>>2]|0)!=1002&(c[A>>2]|0)!=0?(v=(gi(L)|0)+17|0,(v+(((c[(c[ra>>2]|0)+56>>2]|0)==1001&1)*20|0)|0)<=(c[B>>2]<<3|0)):0){if((c[O>>2]|0)==1001)c[Q>>2]=dc(L,12)|0;else c[Q>>2]=1;if(c[Q>>2]|0){c[K>>2]=dc(L,1)|0;if((c[O>>2]|0)==1001)e=(fc(L,256)|0)+2|0;else{e=c[B>>2]|0;e=e-((gi(L)|0)+7>>3)|0}c[R>>2]=e;c[B>>2]=(c[B>>2]|0)-(c[R>>2]|0);v=c[B>>2]<<3;if((v|0)<(gi(L)|0)){c[B>>2]=0;c[R>>2]=0;c[Q>>2]=0}v=L+4|0;c[v>>2]=(c[v>>2]|0)-(c[R>>2]|0)}}if((c[O>>2]|0)!=1002)c[V>>2]=17;c[w>>2]=21;switch(c[(c[ra>>2]|0)+52>>2]|0){case 1101:{c[w>>2]=13;break}case 1103:case 1102:{c[w>>2]=17;break}case 1104:{c[w>>2]=19;break}case 1105:{c[w>>2]=21;break}default:{}}v=c[H>>2]|0;c[x>>2]=c[w>>2];Kb(v,10012,x)|0;x=c[H>>2]|0;c[y>>2]=c[(c[ra>>2]|0)+48>>2];Kb(x,10008,y)|0;if(c[Q>>2]|0){c[W>>2]=0;c[z>>2]=1}e=i;i=i+((1*(c[z>>2]<<2)|0)+15&-16)|0;if((c[W>>2]|0)!=0&(c[O>>2]|0)!=1002){c[P>>2]=e;fi(c[ra>>2]|0,0,0,c[P>>2]|0,(c[E>>2]|0)<(c[sa>>2]|0)?c[E>>2]|0:c[sa>>2]|0,0)|0}if(c[Q>>2]|0)e=_(c[E>>2]|0,c[(c[ra>>2]|0)+8>>2]|0)|0;else e=1;c[S>>2]=e;e=i;i=i+((1*(c[S>>2]<<2)|0)+15&-16)|0;if((c[Q>>2]|0)!=0&(c[K>>2]|0)!=0){S=c[H>>2]|0;c[Y>>2]=0;Kb(S,10010,Y)|0;Lb(c[H>>2]|0,(c[A>>2]|0)+(c[B>>2]|0)|0,c[R>>2]|0,e,c[E>>2]|0,0,0)|0;Y=c[H>>2]|0;c[Z>>2]=T+(((T-T|0)/4|0)<<2);Kb(Y,4031,Z)|0}Z=c[H>>2]|0;c[$>>2]=c[V>>2];Kb(Z,10010,$)|0;do if((c[O>>2]|0)==1e3){a[U>>0]=a[30523]|0;a[U+1>>0]=a[30524]|0;e:do if(!(c[G>>2]|0)){c[N>>2]=0;while(1){if((c[N>>2]|0)>=(_(c[ka>>2]|0,c[(c[ra>>2]|0)+8>>2]|0)|0))break e;g[(c[ja>>2]|0)+(c[N>>2]<<2)>>2]=0.0;c[N>>2]=(c[N>>2]|0)+1}}while(0);if((c[(c[ra>>2]|0)+60>>2]|0)==1001){if((c[Q>>2]|0)!=0&(c[K>>2]|0)!=0?c[(c[ra>>2]|0)+68>>2]|0:0)break;oa=c[H>>2]|0;c[ba>>2]=0;Kb(oa,10010,ba)|0;Lb(c[H>>2]|0,U,2,c[ja>>2]|0,c[D>>2]|0,0,c[G>>2]|0)|0}}else{c[I>>2]=(c[oa>>2]|0)<(c[ka>>2]|0)?c[oa>>2]|0:c[ka>>2]|0;do if((c[O>>2]|0)!=(c[(c[ra>>2]|0)+60>>2]|0)){if((c[(c[ra>>2]|0)+60>>2]|0)<=0)break;if(c[(c[ra>>2]|0)+68>>2]|0)break;Kb(c[H>>2]|0,4028,aa)|0}while(0);c[pa>>2]=Lb(c[H>>2]|0,c[C>>2]|0?0:c[A>>2]|0,c[B>>2]|0,c[ja>>2]|0,c[I>>2]|0,L,c[G>>2]|0)|0}while(0);f:do if(!((c[O>>2]|0)==1002|(c[G>>2]|0)!=0)){c[N>>2]=0;while(1){if((c[N>>2]|0)>=(_(c[ka>>2]|0,c[(c[ra>>2]|0)+8>>2]|0)|0))break f;g[(c[ja>>2]|0)+(c[N>>2]<<2)>>2]=+g[(c[ja>>2]|0)+(c[N>>2]<<2)>>2]+ +(b[j+(c[N>>2]<<1)>>1]|0)*.000030517578125;c[N>>2]=(c[N>>2]|0)+1}}while(0);oa=c[H>>2]|0;c[ca>>2]=J+(((J-J|0)/4|0)<<2);Kb(oa,10015,ca)|0;c[ga>>2]=c[(c[J>>2]|0)+60>>2];if(!((c[Q>>2]|0)==0|(c[K>>2]|0)!=0)){Kb(c[H>>2]|0,4028,da)|0;oa=c[H>>2]|0;c[ea>>2]=0;Kb(oa,10010,ea)|0;Lb(c[H>>2]|0,(c[A>>2]|0)+(c[B>>2]|0)|0,c[R>>2]|0,e,c[E>>2]|0,0,0)|0;ea=c[H>>2]|0;c[fa>>2]=T+(((T-T|0)/4|0)<<2);Kb(ea,4031,fa)|0;ea=(c[ja>>2]|0)+((_(c[(c[ra>>2]|0)+8>>2]|0,(c[ka>>2]|0)-(c[D>>2]|0)|0)|0)<<2)|0;fa=e+((_(c[(c[ra>>2]|0)+8>>2]|0,c[D>>2]|0)|0)<<2)|0;oa=(c[ja>>2]|0)+((_(c[(c[ra>>2]|0)+8>>2]|0,(c[ka>>2]|0)-(c[D>>2]|0)|0)|0)<<2)|0;hi(ea,fa,oa,c[D>>2]|0,c[(c[ra>>2]|0)+8>>2]|0,c[ga>>2]|0,c[(c[ra>>2]|0)+12>>2]|0)}if((c[Q>>2]|0)!=0&(c[K>>2]|0)!=0){c[F>>2]=0;while(1){if((c[F>>2]|0)>=(c[(c[ra>>2]|0)+8>>2]|0))break;c[N>>2]=0;while(1){if((c[N>>2]|0)>=(c[D>>2]|0))break;fa=_(c[(c[ra>>2]|0)+8>>2]|0,c[N>>2]|0)|0;oa=_(c[(c[ra>>2]|0)+8>>2]|0,c[N>>2]|0)|0;g[(c[ja>>2]|0)+(oa+(c[F>>2]|0)<<2)>>2]=+g[e+(fa+(c[F>>2]|0)<<2)>>2];c[N>>2]=(c[N>>2]|0)+1}c[F>>2]=(c[F>>2]|0)+1}ea=e+((_(c[(c[ra>>2]|0)+8>>2]|0,c[D>>2]|0)|0)<<2)|0;fa=(c[ja>>2]|0)+((_(c[(c[ra>>2]|0)+8>>2]|0,c[D>>2]|0)|0)<<2)|0;oa=(c[ja>>2]|0)+((_(c[(c[ra>>2]|0)+8>>2]|0,c[D>>2]|0)|0)<<2)|0;hi(ea,fa,oa,c[D>>2]|0,c[(c[ra>>2]|0)+8>>2]|0,c[ga>>2]|0,c[(c[ra>>2]|0)+12>>2]|0)}do if(c[W>>2]|0){if((c[sa>>2]|0)<(c[E>>2]|0)){hi(c[P>>2]|0,c[ja>>2]|0,c[ja>>2]|0,c[D>>2]|0,c[(c[ra>>2]|0)+8>>2]|0,c[ga>>2]|0,c[(c[ra>>2]|0)+12>>2]|0);break}c[N>>2]=0;while(1){if((c[N>>2]|0)>=(_(c[(c[ra>>2]|0)+8>>2]|0,c[D>>2]|0)|0))break;g[(c[ja>>2]|0)+(c[N>>2]<<2)>>2]=+g[(c[P>>2]|0)+(c[N>>2]<<2)>>2];c[N>>2]=(c[N>>2]|0)+1}ea=(c[P>>2]|0)+((_(c[(c[ra>>2]|0)+8>>2]|0,c[D>>2]|0)|0)<<2)|0;fa=(c[ja>>2]|0)+((_(c[(c[ra>>2]|0)+8>>2]|0,c[D>>2]|0)|0)<<2)|0;oa=(c[ja>>2]|0)+((_(c[(c[ra>>2]|0)+8>>2]|0,c[D>>2]|0)|0)<<2)|0;hi(ea,fa,oa,c[D>>2]|0,c[(c[ra>>2]|0)+8>>2]|0,c[ga>>2]|0,c[(c[ra>>2]|0)+12>>2]|0)}while(0);g:do if(c[(c[ra>>2]|0)+40>>2]|0){g[M>>2]=+X(+(+(c[(c[ra>>2]|0)+40>>2]|0)*6.488140788860619e-04*.6931471805599453));c[N>>2]=0;while(1){if((c[N>>2]|0)>=(_(c[ka>>2]|0,c[(c[ra>>2]|0)+8>>2]|0)|0))break g;g[ha>>2]=+g[(c[ja>>2]|0)+(c[N>>2]<<2)>>2]*+g[M>>2];g[(c[ja>>2]|0)+(c[N>>2]<<2)>>2]=+g[ha>>2];c[N>>2]=(c[N>>2]|0)+1}}while(0);if((c[B>>2]|0)<=1)c[(c[ra>>2]|0)+84>>2]=0;else c[(c[ra>>2]|0)+84>>2]=c[L+28>>2]^c[T>>2];c[(c[ra>>2]|0)+60>>2]=c[O>>2];if(c[Q>>2]|0)e=(c[K>>2]|0)!=0^1;else e=0;c[(c[ra>>2]|0)+68>>2]=e&1;if((c[pa>>2]|0)>=0)ii()|0;c[qa>>2]=(c[pa>>2]|0)<0?c[pa>>2]|0:c[sa>>2]|0;c[ma>>2]=1}while(0);na(c[la>>2]|0);sa=c[qa>>2]|0;i=ta;return sa|0}function gi(a){a=a|0;var b=0,d=0;b=i;i=i+16|0;d=b;c[d>>2]=a;a=(c[(c[d>>2]|0)+20>>2]|0)-(32-(aa(c[(c[d>>2]|0)+28>>2]|0)|0))|0;i=b;return a|0}function hi(a,b,d,e,f,h,j){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;u=i;i=i+48|0;k=u+40|0;l=u+36|0;m=u+32|0;n=u+28|0;o=u+24|0;p=u+20|0;v=u+16|0;r=u+12|0;q=u+8|0;s=u+4|0;t=u;c[k>>2]=a;c[l>>2]=b;c[m>>2]=d;c[n>>2]=e;c[o>>2]=f;c[p>>2]=h;c[v>>2]=j;c[s>>2]=48e3/(c[v>>2]|0)|0;c[q>>2]=0;while(1){if((c[q>>2]|0)>=(c[o>>2]|0))break;c[r>>2]=0;while(1){if((c[r>>2]|0)>=(c[n>>2]|0))break;h=_(c[r>>2]|0,c[s>>2]|0)|0;e=_(c[r>>2]|0,c[s>>2]|0)|0;g[t>>2]=+g[(c[p>>2]|0)+(h<<2)>>2]*+g[(c[p>>2]|0)+(e<<2)>>2];e=_(c[r>>2]|0,c[o>>2]|0)|0;h=_(c[r>>2]|0,c[o>>2]|0)|0;v=_(c[r>>2]|0,c[o>>2]|0)|0;g[(c[m>>2]|0)+(v+(c[q>>2]|0)<<2)>>2]=+g[t>>2]*+g[(c[l>>2]|0)+(e+(c[q>>2]|0)<<2)>>2]+(1.0-+g[t>>2])*+g[(c[k>>2]|0)+(h+(c[q>>2]|0)<<2)>>2];c[r>>2]=(c[r>>2]|0)+1}c[q>>2]=(c[q>>2]|0)+1}i=u;return}function ii(){return 0}function ji(a){a=a|0;var b=0,e=0,f=0;f=i;i=i+16|0;b=f+4|0;e=f;c[b>>2]=a;do if(!((d[c[b>>2]>>0]|0)&128|0))if(((d[c[b>>2]>>0]|0)&96|0)==96){c[e>>2]=1001;break}else{c[e>>2]=1e3;break}else c[e>>2]=1002;while(0);i=f;return c[e>>2]|0}function ki(a){a=a|0;var b=0,e=0,f=0,g=0;g=i;i=i+16|0;b=g+4|0;f=g;c[b>>2]=a;e=d[c[b>>2]>>0]|0;if((d[c[b>>2]>>0]|0)&128|0){e=1102+(e>>5&3)|0;c[f>>2]=e;c[f>>2]=(c[f>>2]|0)==1102?1101:e;f=c[f>>2]|0;i=g;return f|0}a=d[c[b>>2]>>0]|0;if((e&96|0)==96){c[f>>2]=a&16|0?1105:1104;f=c[f>>2]|0;i=g;return f|0}else{c[f>>2]=1101+(a>>5&3);f=c[f>>2]|0;i=g;return f|0}return 0}function li(a){a=a|0;var b=0,e=0;e=i;i=i+16|0;b=e;c[b>>2]=a;i=e;return ((d[c[b>>2]>>0]|0)&4|0?2:1)|0}function mi(a,d,e,f,h,j){a=a|0;d=d|0;e=e|0;f=f|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;v=i;i=i+48|0;l=v+40|0;m=v+36|0;n=v+32|0;o=v+28|0;p=v+24|0;q=v+20|0;r=v+16|0;u=v+12|0;t=v+8|0;k=v+4|0;s=v;c[m>>2]=a;c[n>>2]=d;c[o>>2]=e;c[p>>2]=f;c[q>>2]=h;c[r>>2]=j;if((c[q>>2]|0)<=0){c[l>>2]=-1;u=c[l>>2]|0;i=v;return u|0}do if(!((c[n>>2]|0)!=0&(c[o>>2]|0)>0^1|(c[r>>2]|0)!=0)){c[k>>2]=ni(c[m>>2]|0,c[n>>2]|0,c[o>>2]|0)|0;if((c[k>>2]|0)>0){c[q>>2]=(c[q>>2]|0)<(c[k>>2]|0)?c[q>>2]|0:c[k>>2]|0;break}c[l>>2]=-4;u=c[l>>2]|0;i=v;return u|0}while(0);a=_(c[q>>2]|0,c[(c[m>>2]|0)+8>>2]|0)|0;c[s>>2]=ia()|0;d=i;i=i+((1*(a<<2)|0)+15&-16)|0;c[u>>2]=ei(c[m>>2]|0,c[n>>2]|0,c[o>>2]|0,d,c[q>>2]|0,c[r>>2]|0,0,0,1)|0;a:do if((c[u>>2]|0)>0){c[t>>2]=0;while(1){if((c[t>>2]|0)>=(_(c[u>>2]|0,c[(c[m>>2]|0)+8>>2]|0)|0))break a;r=qi(+g[d+(c[t>>2]<<2)>>2])|0;b[(c[p>>2]|0)+(c[t>>2]<<1)>>1]=r;c[t>>2]=(c[t>>2]|0)+1}}while(0);c[l>>2]=c[u>>2];na(c[s>>2]|0);u=c[l>>2]|0;i=v;return u|0}function ni(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=i;i=i+16|0;f=e+8|0;h=e+4|0;g=e;c[f>>2]=a;c[h>>2]=b;c[g>>2]=d;b=oi(c[h>>2]|0,c[g>>2]|0,c[(c[f>>2]|0)+12>>2]|0)|0;i=e;return b|0}function oi(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0;j=i;i=i+32|0;e=j+20|0;f=j+16|0;l=j+12|0;g=j+8|0;h=j+4|0;k=j;c[f>>2]=a;c[l>>2]=b;c[g>>2]=d;c[k>>2]=pi(c[f>>2]|0,c[l>>2]|0)|0;d=c[k>>2]|0;if((c[k>>2]|0)<0){c[e>>2]=d;l=c[e>>2]|0;i=j;return l|0}c[h>>2]=_(d,Zh(c[f>>2]|0,c[g>>2]|0)|0)|0;if(((c[h>>2]|0)*25|0)>((c[g>>2]|0)*3|0)){c[e>>2]=-4;l=c[e>>2]|0;i=j;return l|0}else{c[e>>2]=c[h>>2];l=c[e>>2]|0;i=j;return l|0}return 0}function pi(a,b){a=a|0;b=b|0;var e=0,f=0,g=0,h=0,j=0;j=i;i=i+16|0;e=j+12|0;f=j+8|0;g=j+4|0;h=j;c[f>>2]=a;c[g>>2]=b;do if((c[g>>2]|0)>=1){c[h>>2]=(d[c[f>>2]>>0]|0)&3;if(!(c[h>>2]|0)){c[e>>2]=1;break}if((c[h>>2]|0)!=3){c[e>>2]=2;break}if((c[g>>2]|0)<2){c[e>>2]=-4;break}else{c[e>>2]=(d[(c[f>>2]|0)+1>>0]|0)&63;break}}else c[e>>2]=-1;while(0);i=j;return c[e>>2]|0}function qi(a){a=+a;var b=0,c=0;c=i;i=i+16|0;b=c;g[b>>2]=a;g[b>>2]=+g[b>>2]*32768.0;g[b>>2]=+g[b>>2]>-32768.0?+g[b>>2]:-32768.0;g[b>>2]=+g[b>>2]<32767.0?+g[b>>2]:32767.0;b=(ij(+g[b>>2])|0)&65535;i=c;return b|0}function ri(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;p=i;i=i+32|0;h=p+24|0;j=p+20|0;k=p+16|0;l=p+12|0;m=p+8|0;n=p+4|0;o=p;c[j>>2]=a;c[k>>2]=b;c[l>>2]=d;c[m>>2]=e;c[n>>2]=f;c[o>>2]=g;if((c[n>>2]|0)<=0){c[h>>2]=-1;a=c[h>>2]|0;i=p;return a|0}else{c[h>>2]=ei(c[j>>2]|0,c[k>>2]|0,c[l>>2]|0,c[m>>2]|0,c[n>>2]|0,c[o>>2]|0,0,0,0)|0;a=c[h>>2]|0;i=p;return a|0}return 0}function si(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;t=i;i=i+80|0;q=t+8|0;r=t+76|0;e=t+72|0;u=t+68|0;s=t+64|0;f=t+48|0;h=t+44|0;g=t+40|0;j=t+36|0;k=t+32|0;l=t+28|0;m=t+24|0;n=t+20|0;o=t+16|0;p=t+12|0;c[e>>2]=a;c[u>>2]=b;c[s>>2]=0;c[h>>2]=(c[e>>2]|0)+(c[(c[e>>2]|0)+4>>2]|0);c[g>>2]=(c[e>>2]|0)+(c[c[e>>2]>>2]|0);c[f>>2]=d;a:do switch(c[u>>2]|0){case 4009:{d=(c[f>>2]|0)+(4-1)&~(4-1);u=c[d>>2]|0;c[f>>2]=d+4;c[j>>2]=u;if(c[j>>2]|0){c[c[j>>2]>>2]=c[(c[e>>2]|0)+52>>2];e=20}else e=21;break}case 4031:{d=(c[f>>2]|0)+(4-1)&~(4-1);u=c[d>>2]|0;c[f>>2]=d+4;c[k>>2]=u;if(c[k>>2]|0){c[c[k>>2]>>2]=c[(c[e>>2]|0)+84>>2];e=20}else e=21;break}case 4028:{oj((c[e>>2]|0)+48|0,0,88-((c[e>>2]|0)+48-(c[e>>2]|0))|0)|0;Kb(c[g>>2]|0,4028,t)|0;Qd(c[h>>2]|0)|0;c[(c[e>>2]|0)+48>>2]=c[(c[e>>2]|0)+8>>2];c[(c[e>>2]|0)+64>>2]=(c[(c[e>>2]|0)+12>>2]|0)/400|0;e=20;break}case 4029:{d=(c[f>>2]|0)+(4-1)&~(4-1);u=c[d>>2]|0;c[f>>2]=d+4;c[l>>2]=u;if(c[l>>2]|0){c[c[l>>2]>>2]=c[(c[e>>2]|0)+12>>2];e=20}else e=21;break}case 4033:{d=(c[f>>2]|0)+(4-1)&~(4-1);u=c[d>>2]|0;c[f>>2]=d+4;c[m>>2]=u;if(c[m>>2]|0)if((c[(c[e>>2]|0)+60>>2]|0)==1002){e=c[g>>2]|0;c[q>>2]=(c[m>>2]|0)+((((c[m>>2]|0)-(c[m>>2]|0)|0)/4|0)<<2);Kb(e,4033,q)|0;e=20;break a}else{c[c[m>>2]>>2]=c[(c[e>>2]|0)+16+20>>2];e=20;break a}else e=21;break}case 4045:{d=(c[f>>2]|0)+(4-1)&~(4-1);u=c[d>>2]|0;c[f>>2]=d+4;c[n>>2]=u;if(c[n>>2]|0){c[c[n>>2]>>2]=c[(c[e>>2]|0)+40>>2];e=20}else e=21;break}case 4034:{d=(c[f>>2]|0)+(4-1)&~(4-1);u=c[d>>2]|0;c[f>>2]=d+4;c[o>>2]=u;if((c[o>>2]|0)<-32768|(c[o>>2]|0)>32767)e=21;else{c[(c[e>>2]|0)+40>>2]=c[o>>2];e=20}break}case 4039:{d=(c[f>>2]|0)+(4-1)&~(4-1);u=c[d>>2]|0;c[f>>2]=d+4;c[p>>2]=u;if(c[p>>2]|0){c[c[p>>2]>>2]=c[(c[e>>2]|0)+72>>2];e=20}else e=21;break}default:{c[s>>2]=-5;e=20}}while(0);if((e|0)==20){c[r>>2]=c[s>>2];u=c[r>>2]|0;i=t;return u|0}else if((e|0)==21){c[r>>2]=-1;u=c[r>>2]|0;i=t;return u|0}return 0}function ti(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;h=i;i=i+32|0;b=h+16|0;d=h+12|0;g=h+8|0;e=h+4|0;f=h;c[d>>2]=a;if((c[d>>2]|0)<1|(c[d>>2]|0)>2){c[b>>2]=0;g=c[b>>2]|0;i=h;return g|0}c[f>>2]=Sd(g)|0;if(c[f>>2]|0){c[b>>2]=0;g=c[b>>2]|0;i=h;return g|0}else{c[g>>2]=ui(c[g>>2]|0)|0;c[e>>2]=hb(c[d>>2]|0)|0;f=ui(18220)|0;c[b>>2]=f+(c[g>>2]|0)+(c[e>>2]|0);g=c[b>>2]|0;i=h;return g|0}return 0}function ui(a){a=a|0;var b=0,d=0,e=0;b=i;i=i+16|0;e=b+4|0;d=b;c[e>>2]=a;c[d>>2]=4;a=_((((c[e>>2]|0)+(c[d>>2]|0)-1|0)>>>0)/((c[d>>2]|0)>>>0)|0,c[d>>2]|0)|0;i=b;return a|0}function vi(a,d,e,f){a=a|0;d=d|0;e=e|0;f=f|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;u=i;i=i+64|0;t=u+8|0;s=u;h=u+48|0;j=u+44|0;k=u+40|0;l=u+36|0;m=u+32|0;r=u+28|0;n=u+24|0;o=u+20|0;p=u+16|0;q=u+12|0;c[j>>2]=a;c[k>>2]=d;c[l>>2]=e;c[m>>2]=f;if((!((c[k>>2]|0)!=48e3&(c[k>>2]|0)!=24e3&(c[k>>2]|0)!=16e3&(c[k>>2]|0)!=12e3&(c[k>>2]|0)!=8e3)?!((c[l>>2]|0)!=1&(c[l>>2]|0)!=2):0)?!((c[m>>2]|0)!=2048&(c[m>>2]|0)!=2049&(c[m>>2]|0)!=2051):0){a=c[j>>2]|0;oj(a|0,0,ti(c[l>>2]|0)|0)|0;c[p>>2]=Sd(q)|0;if(c[p>>2]|0){c[h>>2]=-1;t=c[h>>2]|0;i=u;return t|0}c[q>>2]=ui(c[q>>2]|0)|0;a=ui(18220)|0;c[(c[j>>2]|0)+4>>2]=a;c[c[j>>2]>>2]=(c[(c[j>>2]|0)+4>>2]|0)+(c[q>>2]|0);c[r>>2]=(c[j>>2]|0)+(c[(c[j>>2]|0)+4>>2]|0);c[n>>2]=(c[j>>2]|0)+(c[c[j>>2]>>2]|0);a=c[l>>2]|0;c[(c[j>>2]|0)+100>>2]=a;c[(c[j>>2]|0)+14288>>2]=a;c[(c[j>>2]|0)+132>>2]=c[k>>2];a=wi()|0;c[(c[j>>2]|0)+168>>2]=a;c[p>>2]=Td(c[r>>2]|0,c[(c[j>>2]|0)+168>>2]|0,(c[j>>2]|0)+8|0)|0;if(c[p>>2]|0){c[h>>2]=-3;t=c[h>>2]|0;i=u;return t|0}c[(c[j>>2]|0)+8>>2]=c[l>>2];c[(c[j>>2]|0)+8+4>>2]=c[l>>2];c[(c[j>>2]|0)+8+8>>2]=c[(c[j>>2]|0)+132>>2];c[(c[j>>2]|0)+8+12>>2]=16e3;c[(c[j>>2]|0)+8+16>>2]=8e3;c[(c[j>>2]|0)+8+20>>2]=16e3;c[(c[j>>2]|0)+8+24>>2]=20;c[(c[j>>2]|0)+8+28>>2]=25e3;c[(c[j>>2]|0)+8+32>>2]=0;c[(c[j>>2]|0)+8+36>>2]=9;c[(c[j>>2]|0)+8+40>>2]=0;c[(c[j>>2]|0)+8+44>>2]=0;c[(c[j>>2]|0)+8+48>>2]=0;c[(c[j>>2]|0)+8+64>>2]=0;c[o>>2]=jb(c[n>>2]|0,c[k>>2]|0,c[l>>2]|0,c[(c[j>>2]|0)+168>>2]|0)|0;if(c[o>>2]|0){c[h>>2]=-3;t=c[h>>2]|0;i=u;return t|0}else{a=c[n>>2]|0;c[s>>2]=0;lb(a,10016,s)|0;s=c[n>>2]|0;c[t>>2]=c[(c[j>>2]|0)+8+36>>2];lb(s,4010,t)|0;c[(c[j>>2]|0)+136>>2]=1;c[(c[j>>2]|0)+140>>2]=1;c[(c[j>>2]|0)+152>>2]=-1e3;t=3e3+(_(c[k>>2]|0,c[l>>2]|0)|0)|0;c[(c[j>>2]|0)+148>>2]=t;c[(c[j>>2]|0)+96>>2]=c[m>>2];c[(c[j>>2]|0)+112>>2]=-1e3;c[(c[j>>2]|0)+116>>2]=-1e3;c[(c[j>>2]|0)+120>>2]=1105;c[(c[j>>2]|0)+108>>2]=-1e3;c[(c[j>>2]|0)+124>>2]=-1e3;c[(c[j>>2]|0)+128>>2]=-1;c[(c[j>>2]|0)+160>>2]=(c[(c[j>>2]|0)+132>>2]|0)/100|0;c[(c[j>>2]|0)+156>>2]=24;c[(c[j>>2]|0)+144>>2]=5e3;c[(c[j>>2]|0)+104>>2]=(c[(c[j>>2]|0)+132>>2]|0)/250|0;b[(c[j>>2]|0)+14292>>1]=16384;g[(c[j>>2]|0)+14300>>2]=1.0;t=(Sf(60)|0)<<8;c[(c[j>>2]|0)+14296>>2]=t;c[(c[j>>2]|0)+14344>>2]=1;c[(c[j>>2]|0)+14320>>2]=1001;c[(c[j>>2]|0)+14336>>2]=1105;Yi((c[j>>2]|0)+172|0);c[h>>2]=0;t=c[h>>2]|0;i=u;return t|0}}c[h>>2]=-1;t=c[h>>2]|0;i=u;return t|0}function wi(){return 0}function xi(a,b,d,e,f,h,j){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;u=i;i=i+48|0;v=u+40|0;k=u+36|0;l=u+32|0;m=u+28|0;n=u+24|0;o=u+20|0;p=u+16|0;t=u+12|0;s=u+8|0;r=u+4|0;q=u;c[v>>2]=a;c[k>>2]=b;c[l>>2]=d;c[m>>2]=e;c[n>>2]=f;c[o>>2]=h;c[p>>2]=j;c[t>>2]=c[v>>2];c[r>>2]=0;while(1){if((c[r>>2]|0)>=(c[l>>2]|0))break;v=_((c[r>>2]|0)+(c[m>>2]|0)|0,c[p>>2]|0)|0;g[(c[k>>2]|0)+(c[r>>2]<<2)>>2]=+g[(c[t>>2]|0)+(v+(c[n>>2]|0)<<2)>>2]*32768.0;c[r>>2]=(c[r>>2]|0)+1}a:do if((c[o>>2]|0)<=-1){if((c[o>>2]|0)==-2){c[q>>2]=1;while(1){if((c[q>>2]|0)>=(c[p>>2]|0))break a;c[r>>2]=0;while(1){if((c[r>>2]|0)>=(c[l>>2]|0))break;d=_((c[r>>2]|0)+(c[m>>2]|0)|0,c[p>>2]|0)|0;v=(c[k>>2]|0)+(c[r>>2]<<2)|0;g[v>>2]=+g[v>>2]+ +g[(c[t>>2]|0)+(d+(c[q>>2]|0)<<2)>>2]*32768.0;c[r>>2]=(c[r>>2]|0)+1}c[q>>2]=(c[q>>2]|0)+1}}}else{c[r>>2]=0;while(1){if((c[r>>2]|0)>=(c[l>>2]|0))break a;d=_((c[r>>2]|0)+(c[m>>2]|0)|0,c[p>>2]|0)|0;v=(c[k>>2]|0)+(c[r>>2]<<2)|0;g[v>>2]=+g[v>>2]+ +g[(c[t>>2]|0)+(d+(c[o>>2]|0)<<2)>>2]*32768.0;c[r>>2]=(c[r>>2]|0)+1}}while(0);g[s>>2]=1.0;if((c[p>>2]|0)==-2)g[s>>2]=+g[s>>2]/+(c[p>>2]|0);else g[s>>2]=+g[s>>2]/2.0;c[r>>2]=0;while(1){if((c[r>>2]|0)>=(c[l>>2]|0))break;v=(c[k>>2]|0)+(c[r>>2]<<2)|0;g[v>>2]=+g[v>>2]*+g[s>>2];c[r>>2]=(c[r>>2]|0)+1}i=u;return}function yi(a,d,e,f,h,j,k){a=a|0;d=d|0;e=e|0;f=f|0;h=h|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;v=i;i=i+48|0;w=v+40|0;l=v+36|0;m=v+32|0;n=v+28|0;o=v+24|0;p=v+20|0;q=v+16|0;u=v+12|0;t=v+8|0;s=v+4|0;r=v;c[w>>2]=a;c[l>>2]=d;c[m>>2]=e;c[n>>2]=f;c[o>>2]=h;c[p>>2]=j;c[q>>2]=k;c[u>>2]=c[w>>2];c[s>>2]=0;while(1){if((c[s>>2]|0)>=(c[m>>2]|0))break;w=_((c[s>>2]|0)+(c[n>>2]|0)|0,c[q>>2]|0)|0;g[(c[l>>2]|0)+(c[s>>2]<<2)>>2]=+(b[(c[u>>2]|0)+(w+(c[o>>2]|0)<<1)>>1]|0);c[s>>2]=(c[s>>2]|0)+1}a:do if((c[p>>2]|0)<=-1){if((c[p>>2]|0)==-2){c[r>>2]=1;while(1){if((c[r>>2]|0)>=(c[q>>2]|0))break a;c[s>>2]=0;while(1){if((c[s>>2]|0)>=(c[m>>2]|0))break;e=_((c[s>>2]|0)+(c[n>>2]|0)|0,c[q>>2]|0)|0;w=(c[l>>2]|0)+(c[s>>2]<<2)|0;g[w>>2]=+g[w>>2]+ +(b[(c[u>>2]|0)+(e+(c[r>>2]|0)<<1)>>1]|0);c[s>>2]=(c[s>>2]|0)+1}c[r>>2]=(c[r>>2]|0)+1}}}else{c[s>>2]=0;while(1){if((c[s>>2]|0)>=(c[m>>2]|0))break a;e=_((c[s>>2]|0)+(c[n>>2]|0)|0,c[q>>2]|0)|0;w=(c[l>>2]|0)+(c[s>>2]<<2)|0;g[w>>2]=+g[w>>2]+ +(b[(c[u>>2]|0)+(e+(c[p>>2]|0)<<1)>>1]|0);c[s>>2]=(c[s>>2]|0)+1}}while(0);g[t>>2]=.000030517578125;if((c[q>>2]|0)==-2)g[t>>2]=+g[t>>2]/+(c[q>>2]|0);else g[t>>2]=+g[t>>2]/2.0;c[s>>2]=0;while(1){if((c[s>>2]|0)>=(c[m>>2]|0))break;w=(c[l>>2]|0)+(c[s>>2]<<2)|0;g[w>>2]=+g[w>>2]*+g[t>>2];c[s>>2]=(c[s>>2]|0)+1}i=v;return}function zi(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0;k=i;i=i+32|0;f=k+16|0;g=k+12|0;e=k+8|0;h=k+4|0;j=k;c[g>>2]=a;c[e>>2]=b;c[h>>2]=d;if((c[g>>2]|0)<((c[h>>2]|0)/400|0|0)){c[f>>2]=-1;j=c[f>>2]|0;i=k;return j|0}do if((c[e>>2]|0)==5e3)c[j>>2]=c[g>>2];else{if((c[e>>2]|0)==5010){c[j>>2]=(c[h>>2]|0)/50|0;break}if(!((c[e>>2]|0)>=5001&(c[e>>2]|0)<=5006)){c[f>>2]=-1;j=c[f>>2]|0;i=k;return j|0}d=c[h>>2]|0;if((((c[h>>2]|0)*3|0)/50|0|0)<(((c[h>>2]|0)/400|0)<<(c[e>>2]|0)-5001|0))d=(d*3|0)/50|0;else d=((d|0)/400|0)<<(c[e>>2]|0)-5001;c[j>>2]=d}while(0);if((c[j>>2]|0)>(c[g>>2]|0)){c[f>>2]=-1;j=c[f>>2]|0;i=k;return j|0}if(((((((c[j>>2]|0)*400|0)!=(c[h>>2]|0)?((c[j>>2]|0)*200|0)!=(c[h>>2]|0):0)?((c[j>>2]|0)*100|0)!=(c[h>>2]|0):0)?((c[j>>2]|0)*50|0)!=(c[h>>2]|0):0)?((c[j>>2]|0)*25|0)!=(c[h>>2]|0):0)?((c[j>>2]|0)*50|0)!=((c[h>>2]|0)*3|0):0){c[f>>2]=-1;j=c[f>>2]|0;i=k;return j|0}c[f>>2]=c[j>>2];j=c[f>>2]|0;i=k;return j|0}function Ai(a,b,d,e,f,g,h,j,k){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;w=i;i=i+48|0;l=w+40|0;m=w+36|0;n=w+32|0;o=w+28|0;p=w+24|0;q=w+20|0;r=w+16|0;s=w+12|0;t=w+8|0;u=w+4|0;v=w;c[m>>2]=a;c[n>>2]=b;c[o>>2]=d;c[p>>2]=e;c[q>>2]=f;c[r>>2]=g;c[s>>2]=h;c[t>>2]=j;c[u>>2]=k;if((c[o>>2]|0)==5010?(c[n>>2]|0)>=((c[q>>2]|0)/200|0|0):0){c[v>>2]=3;c[v>>2]=Bi(c[m>>2]|0,c[n>>2]|0,c[p>>2]|0,c[q>>2]|0,c[r>>2]|0,0.0,c[u>>2]|0,c[s>>2]|0,c[t>>2]|0)|0;while(1){if((((c[q>>2]|0)/400|0)<<c[v>>2]|0)<=(c[n>>2]|0))break;c[v>>2]=(c[v>>2]|0)+-1}c[n>>2]=((c[q>>2]|0)/400|0)<<c[v>>2]}else c[n>>2]=zi(c[n>>2]|0,c[o>>2]|0,c[q>>2]|0)|0;if((c[n>>2]|0)<0){c[l>>2]=-1;d=c[l>>2]|0;i=w;return d|0}else{c[l>>2]=c[n>>2];d=c[l>>2]|0;i=w;return d|0}return 0}function Bi(a,b,d,e,f,h,j,k,l){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=+h;j=j|0;k=k|0;l=l|0;var m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0;H=i;i=i+304|0;n=H+296|0;m=H+292|0;o=H+288|0;I=H+284|0;p=H+280|0;q=H+276|0;r=H+272|0;s=H+268|0;t=H+264|0;v=H+260|0;z=H+256|0;x=H+144|0;y=H+36|0;B=H+32|0;w=H+28|0;E=H+24|0;D=H+20|0;C=H+16|0;u=H+12|0;F=H+8|0;G=H+4|0;A=H;c[n>>2]=a;c[m>>2]=b;c[o>>2]=d;c[I>>2]=e;c[p>>2]=f;g[q>>2]=h;c[r>>2]=j;c[s>>2]=k;c[t>>2]=l;c[w>>2]=0;c[E>>2]=(c[I>>2]|0)/400|0;a=c[E>>2]|0;c[u>>2]=ia()|0;e=i;i=i+((1*(a<<2)|0)+15&-16)|0;g[x>>2]=+g[c[r>>2]>>2];g[y>>2]=1.0/(+g[c[r>>2]>>2]+1.0000000036274937e-15);if(c[s>>2]|0){c[C>>2]=(c[E>>2]<<1)-(c[s>>2]|0);c[m>>2]=(c[m>>2]|0)-(c[C>>2]|0);g[x+4>>2]=+g[(c[r>>2]|0)+4>>2];g[y+4>>2]=1.0/(+g[(c[r>>2]|0)+4>>2]+1.0000000036274937e-15);g[x+8>>2]=+g[(c[r>>2]|0)+8>>2];g[y+8>>2]=1.0/(+g[(c[r>>2]|0)+8>>2]+1.0000000036274937e-15);c[D>>2]=3}else{c[D>>2]=1;c[C>>2]=0}if(((c[m>>2]|0)/(c[E>>2]|0)|0|0)<24)d=(c[m>>2]|0)/(c[E>>2]|0)|0;else d=24;c[v>>2]=d;g[B>>2]=0.0;c[z>>2]=0;while(1){if((c[z>>2]|0)>=(c[v>>2]|0))break;g[F>>2]=1.0000000036274937e-15;I=_(c[z>>2]|0,c[E>>2]|0)|0;qa[c[t>>2]&3](c[n>>2]|0,e,c[E>>2]|0,I+(c[C>>2]|0)|0,0,-2,c[o>>2]|0);if(!(c[z>>2]|0))g[B>>2]=+g[e>>2];c[A>>2]=0;while(1){if((c[A>>2]|0)>=(c[E>>2]|0))break;g[G>>2]=+g[e+(c[A>>2]<<2)>>2];g[F>>2]=+g[F>>2]+(+g[G>>2]-+g[B>>2])*(+g[G>>2]-+g[B>>2]);g[B>>2]=+g[G>>2];c[A>>2]=(c[A>>2]|0)+1}g[x+((c[z>>2]|0)+(c[D>>2]|0)<<2)>>2]=+g[F>>2];g[y+((c[z>>2]|0)+(c[D>>2]|0)<<2)>>2]=1.0/+g[F>>2];c[z>>2]=(c[z>>2]|0)+1}g[x+((c[z>>2]|0)+(c[D>>2]|0)<<2)>>2]=+g[x+((c[z>>2]|0)+(c[D>>2]|0)-1<<2)>>2];if(c[s>>2]|0)c[v>>2]=24<((c[v>>2]|0)+2|0)?24:(c[v>>2]|0)+2|0;c[w>>2]=Ci(x,y,c[v>>2]|0,~~((+g[q>>2]*.5+1.0)*+(((c[o>>2]|0)*60|0)+40|0)),(c[p>>2]|0)/400|0)|0;g[c[r>>2]>>2]=+g[x+(1<<c[w>>2]<<2)>>2];if(!(c[s>>2]|0)){I=c[w>>2]|0;G=c[u>>2]|0;na(G|0);i=H;return I|0}g[(c[r>>2]|0)+4>>2]=+g[x+((1<<c[w>>2])+1<<2)>>2];g[(c[r>>2]|0)+8>>2]=+g[x+((1<<c[w>>2])+2<<2)>>2];I=c[w>>2]|0;G=c[u>>2]|0;na(G|0);i=H;return I|0}function Ci(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var h=0.0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0.0;z=i;i=i+3136|0;j=z+3124|0;k=z+3120|0;l=z+3116|0;m=z+3112|0;n=z+3108|0;x=z+3104|0;p=z+1568|0;y=z+32|0;o=z+28|0;w=z+24|0;r=z+20|0;s=z+16|0;t=z+12|0;u=z+8|0;q=z+4|0;v=z;c[j>>2]=a;c[k>>2]=b;c[l>>2]=d;c[m>>2]=e;c[n>>2]=f;do if((c[n>>2]|0)>=80)if((c[n>>2]|0)>160){g[r>>2]=1.0;break}else{g[r>>2]=(+(c[n>>2]|0)-80.0)/80.0;break}else g[r>>2]=0.0;while(0);c[x>>2]=0;while(1){if((c[x>>2]|0)>=16)break;c[y+(c[x>>2]<<2)>>2]=-1;g[p+(c[x>>2]<<2)>>2]=1.0e10;c[x>>2]=(c[x>>2]|0)+1}c[x>>2]=0;while(1){if((c[x>>2]|0)>=4)break;A=+((c[m>>2]|0)+(_(c[n>>2]|0,1<<c[x>>2])|0)|0);h=+g[r>>2];h=A*(h*+Di(c[j>>2]|0,c[k>>2]|0,c[x>>2]|0,(c[l>>2]|0)+1|0)+1.0);g[p+(1<<c[x>>2]<<2)>>2]=h;c[y+(1<<c[x>>2]<<2)>>2]=c[x>>2];c[x>>2]=(c[x>>2]|0)+1}c[x>>2]=1;while(1){if((c[x>>2]|0)>=(c[l>>2]|0))break;c[s>>2]=2;while(1){if((c[s>>2]|0)>=16)break;g[p+(c[x>>2]<<6)+(c[s>>2]<<2)>>2]=+g[p+((c[x>>2]|0)-1<<6)+((c[s>>2]|0)-1<<2)>>2];c[y+(c[x>>2]<<6)+(c[s>>2]<<2)>>2]=(c[s>>2]|0)-1;c[s>>2]=(c[s>>2]|0)+1}c[s>>2]=0;while(1){if((c[s>>2]|0)>=4)break;c[y+(c[x>>2]<<6)+(1<<c[s>>2]<<2)>>2]=1;g[u>>2]=+g[p+((c[x>>2]|0)-1<<6)+4>>2];c[t>>2]=1;while(1){if((c[t>>2]|0)>=4)break;g[v>>2]=+g[p+((c[x>>2]|0)-1<<6)+((1<<(c[t>>2]|0)+1)-1<<2)>>2];if(+g[v>>2]<+g[u>>2]){c[y+(c[x>>2]<<6)+(1<<c[s>>2]<<2)>>2]=(1<<(c[t>>2]|0)+1)-1;g[u>>2]=+g[v>>2]}c[t>>2]=(c[t>>2]|0)+1}A=+((c[m>>2]|0)+(_(c[n>>2]|0,1<<c[s>>2])|0)|0);h=+g[r>>2];g[q>>2]=A*(h*+Di((c[j>>2]|0)+(c[x>>2]<<2)|0,(c[k>>2]|0)+(c[x>>2]<<2)|0,c[s>>2]|0,(c[l>>2]|0)-(c[x>>2]|0)+1|0)+1.0);g[p+(c[x>>2]<<6)+(1<<c[s>>2]<<2)>>2]=+g[u>>2];h=+g[q>>2];if(((c[l>>2]|0)-(c[x>>2]|0)|0)<(1<<c[s>>2]|0)){f=p+(c[x>>2]<<6)+(1<<c[s>>2]<<2)|0;g[f>>2]=+g[f>>2]+h*+((c[l>>2]|0)-(c[x>>2]|0)|0)/+(1<<c[s>>2]|0)}else{f=p+(c[x>>2]<<6)+(1<<c[s>>2]<<2)|0;g[f>>2]=+g[f>>2]+h}c[s>>2]=(c[s>>2]|0)+1}c[x>>2]=(c[x>>2]|0)+1}c[w>>2]=1;g[o>>2]=+g[p+((c[l>>2]|0)-1<<6)+4>>2];c[x>>2]=2;while(1){if((c[x>>2]|0)>=16)break;if(+g[p+((c[l>>2]|0)-1<<6)+(c[x>>2]<<2)>>2]<+g[o>>2]){g[o>>2]=+g[p+((c[l>>2]|0)-1<<6)+(c[x>>2]<<2)>>2];c[w>>2]=c[x>>2]}c[x>>2]=(c[x>>2]|0)+1}c[x>>2]=(c[l>>2]|0)-1;while(1){a=c[w>>2]|0;if((c[x>>2]|0)<0)break;c[w>>2]=c[y+(c[x>>2]<<6)+(a<<2)>>2];c[x>>2]=(c[x>>2]|0)+-1}i=z;return a|0}function Di(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;r=i;i=i+48|0;k=r+32|0;l=r+28|0;h=r+24|0;j=r+20|0;n=r+16|0;m=r+12|0;o=r+8|0;p=r+4|0;q=r;c[k>>2]=a;c[l>>2]=b;c[h>>2]=d;c[j>>2]=e;g[o>>2]=0.0;g[p>>2]=0.0;if((c[j>>2]|0)<((1<<c[h>>2])+1|0))h=c[j>>2]|0;else h=(1<<c[h>>2])+1|0;c[m>>2]=h;c[n>>2]=0;while(1){if((c[n>>2]|0)>=(c[m>>2]|0))break;g[o>>2]=+g[o>>2]+ +g[(c[k>>2]|0)+(c[n>>2]<<2)>>2];g[p>>2]=+g[p>>2]+ +g[(c[l>>2]|0)+(c[n>>2]<<2)>>2];c[n>>2]=(c[n>>2]|0)+1}g[q>>2]=+g[o>>2]*+g[p>>2]/+(_(c[m>>2]|0,c[m>>2]|0)|0);if(0.0>(+g[q>>2]-2.0)*.05000000074505806)f=0.0;else f=(+g[q>>2]-2.0)*.05000000074505806;if(1.0<+O(+f)){f=1.0;i=r;return +f}if(0.0>(+g[q>>2]-2.0)*.05000000074505806)f=0.0;else f=(+g[q>>2]-2.0)*.05000000074505806;f=+O(+f);i=r;return +f}function Ei(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;D=i;i=i+96|0;h=D+84|0;j=D+80|0;E=D+76|0;C=D+72|0;u=D+68|0;v=D+64|0;A=D+60|0;q=D+56|0;r=D+52|0;t=D+48|0;y=D+44|0;z=D+40|0;w=D+36|0;x=D+32|0;B=D+28|0;k=D+24|0;o=D+20|0;l=D+16|0;m=D+12|0;n=D+8|0;p=D+4|0;s=D;c[h>>2]=a;c[j>>2]=b;c[E>>2]=d;c[C>>2]=e;c[B>>2]=(c[E>>2]|0)/(c[j>>2]|0)|0;g[o>>2]=1.0-25.0/+((50>(c[B>>2]|0)?50:c[B>>2]|0)|0);g[t>>2]=0.0;g[r>>2]=0.0;g[q>>2]=0.0;c[k>>2]=0;while(1){if((c[k>>2]|0)>=(c[j>>2]|0))break;g[l>>2]=0.0;g[m>>2]=0.0;g[n>>2]=0.0;g[p>>2]=+g[(c[h>>2]|0)+(c[k>>2]<<1<<2)>>2];g[s>>2]=+g[(c[h>>2]|0)+((c[k>>2]<<1)+1<<2)>>2];g[l>>2]=+g[p>>2]*+g[p>>2];g[m>>2]=+g[p>>2]*+g[s>>2];g[n>>2]=+g[s>>2]*+g[s>>2];g[p>>2]=+g[(c[h>>2]|0)+((c[k>>2]<<1)+2<<2)>>2];g[s>>2]=+g[(c[h>>2]|0)+((c[k>>2]<<1)+3<<2)>>2];g[l>>2]=+g[l>>2]+ +g[p>>2]*+g[p>>2];g[m>>2]=+g[m>>2]+ +g[p>>2]*+g[s>>2];g[n>>2]=+g[n>>2]+ +g[s>>2]*+g[s>>2];g[p>>2]=+g[(c[h>>2]|0)+((c[k>>2]<<1)+4<<2)>>2];g[s>>2]=+g[(c[h>>2]|0)+((c[k>>2]<<1)+5<<2)>>2];g[l>>2]=+g[l>>2]+ +g[p>>2]*+g[p>>2];g[m>>2]=+g[m>>2]+ +g[p>>2]*+g[s>>2];g[n>>2]=+g[n>>2]+ +g[s>>2]*+g[s>>2];g[p>>2]=+g[(c[h>>2]|0)+((c[k>>2]<<1)+6<<2)>>2];g[s>>2]=+g[(c[h>>2]|0)+((c[k>>2]<<1)+7<<2)>>2];g[l>>2]=+g[l>>2]+ +g[p>>2]*+g[p>>2];g[m>>2]=+g[m>>2]+ +g[p>>2]*+g[s>>2];g[n>>2]=+g[n>>2]+ +g[s>>2]*+g[s>>2];g[q>>2]=+g[q>>2]+ +g[l>>2];g[r>>2]=+g[r>>2]+ +g[m>>2];g[t>>2]=+g[t>>2]+ +g[n>>2];c[k>>2]=(c[k>>2]|0)+4}E=c[C>>2]|0;g[E>>2]=+g[E>>2]+ +g[o>>2]*(+g[q>>2]-+g[c[C>>2]>>2]);E=(c[C>>2]|0)+4|0;g[E>>2]=+g[E>>2]+ +g[o>>2]*(+g[r>>2]-+g[(c[C>>2]|0)+4>>2]);E=(c[C>>2]|0)+8|0;g[E>>2]=+g[E>>2]+ +g[o>>2]*(+g[t>>2]-+g[(c[C>>2]|0)+8>>2]);if(0.0>+g[c[C>>2]>>2])f=0.0;else f=+g[c[C>>2]>>2];g[c[C>>2]>>2]=f;if(0.0>+g[(c[C>>2]|0)+4>>2])f=0.0;else f=+g[(c[C>>2]|0)+4>>2];g[(c[C>>2]|0)+4>>2]=f;if(0.0>+g[(c[C>>2]|0)+8>>2])f=0.0;else f=+g[(c[C>>2]|0)+8>>2];g[(c[C>>2]|0)+8>>2]=f;h=c[C>>2]|0;if(+g[c[C>>2]>>2]>+g[(c[C>>2]|0)+8>>2])f=+g[h>>2];else f=+g[h+8>>2];if(f>7.999999797903001e-04){g[y>>2]=+O(+(+g[c[C>>2]>>2]));g[z>>2]=+O(+(+g[(c[C>>2]|0)+8>>2]));g[w>>2]=+O(+(+g[y>>2]));g[x>>2]=+O(+(+g[z>>2]));if(+g[(c[C>>2]|0)+4>>2]<+g[y>>2]*+g[z>>2])f=+g[(c[C>>2]|0)+4>>2];else f=+g[y>>2]*+g[z>>2];g[(c[C>>2]|0)+4>>2]=f;g[u>>2]=+g[(c[C>>2]|0)+4>>2]/(+g[y>>2]*+g[z>>2]+1.0000000036274937e-15);f=+N(+(+g[w>>2]-+g[x>>2]))*1.0;g[v>>2]=f/(+g[w>>2]+1.0000000036274937e-15+ +g[x>>2]);f=+O(+(1.0-+g[u>>2]*+g[u>>2]));g[A>>2]=f*+g[v>>2];h=(c[C>>2]|0)+12|0;g[h>>2]=+g[h>>2]+(+g[A>>2]-+g[(c[C>>2]|0)+12>>2])/+(c[B>>2]|0);h=c[C>>2]|0;if(+g[(c[C>>2]|0)+16>>2]-.019999999552965164/+(c[B>>2]|0)>+g[(c[C>>2]|0)+12>>2])f=+g[h+16>>2]-.019999999552965164/+(c[B>>2]|0);else f=+g[h+12>>2];g[(c[C>>2]|0)+16>>2]=f}else{g[A>>2]=0.0;g[u>>2]=1.0;g[v>>2]=0.0}if(1.0<+g[(c[C>>2]|0)+16>>2]*20.0){f=1.0;i=D;return +f}f=+g[(c[C>>2]|0)+16>>2]*20.0;i=D;return +f}function Fi(e,f,h,j,k,l,m,n,o,p,q,r,s){e=e|0;f=f|0;h=h|0;j=j|0;k=k|0;l=l|0;m=m|0;n=n|0;o=o|0;p=p|0;q=q|0;r=r|0;s=s|0;var t=0.0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ja=0,ka=0,la=0,ma=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0,Xa=0,Ya=0,Za=0,_a=0,$a=0,ab=0,bb=0,cb=0,db=0,eb=0,fb=0,gb=0,hb=0,ib=0,jb=0,kb=0,mb=0,ob=0,pb=0,qb=0,rb=0,sb=0,tb=0,ub=0,vb=0,wb=0,xb=0,yb=0,zb=0,Ab=0,Bb=0,Cb=0,Db=0,Eb=0,Fb=0,Gb=0,Hb=0,Ib=0,Jb=0,Kb=0,Lb=0,Mb=0,Nb=0,Ob=0,Pb=0,Qb=0,Rb=0;Rb=i;i=i+1072|0;Db=Rb+168|0;Cb=Rb+160|0;Bb=Rb+152|0;Ab=Rb+144|0;zb=Rb+136|0;yb=Rb+128|0;xb=Rb+120|0;wb=Rb+112|0;vb=Rb+104|0;ub=Rb+96|0;tb=Rb+88|0;sb=Rb+80|0;Ua=Rb+72|0;Ta=Rb+64|0;Sa=Rb+56|0;Ra=Rb+48|0;Qa=Rb+40|0;Pa=Rb+32|0;Oa=Rb+24|0;Na=Rb+16|0;U=Rb+8|0;w=Rb;Ob=Rb+1048|0;Pb=Rb+1044|0;sa=Rb+1040|0;Gb=Rb+1036|0;Qb=Rb+1032|0;aa=Rb+1028|0;ba=Rb+1024|0;u=Rb+1020|0;v=Rb+1016|0;ca=Rb+1012|0;Y=Rb+1008|0;Z=Rb+1004|0;$=Rb+1e3|0;ta=Rb+996|0;Ga=Rb+992|0;gb=Rb+988|0;Xa=Rb+984|0;Nb=Rb+980|0;Ma=Rb+976|0;Hb=Rb+928|0;Va=Rb+920|0;Ea=Rb+916|0;rb=Rb+912|0;Jb=Rb+908|0;Kb=Rb+904|0;hb=Rb+900|0;pb=Rb+896|0;Lb=Rb+892|0;qb=Rb+888|0;W=Rb+884|0;V=Rb+880|0;K=Rb+876|0;Za=Rb+872|0;y=Rb+868|0;Da=Rb+864|0;Ba=Rb+860|0;ib=Rb+856|0;Ya=Rb+852|0;Ib=Rb+848|0;_a=Rb+844|0;F=Rb+840|0;$a=Rb+836|0;fb=Rb+808|0;S=Rb+804|0;T=Rb+800|0;x=Rb+796|0;B=Rb+792|0;z=Rb+788|0;A=Rb+784|0;C=Rb+780|0;E=Rb+776|0;D=Rb+772|0;G=Rb+768|0;H=Rb+680|0;J=Rb+676|0;I=Rb+672|0;N=Rb+640|0;L=Rb+632|0;O=Rb+628|0;Q=Rb+624|0;P=Rb+620|0;R=Rb+616|0;oa=Rb+612|0;ka=Rb+608|0;ha=Rb+604|0;ja=Rb+600|0;la=Rb+596|0;da=Rb+592|0;pa=Rb+588|0;fa=Rb+584|0;qa=Rb+284|0;ea=Rb+280|0;Mb=Rb+276|0;Fb=Rb+272|0;X=Rb+268|0;ra=Rb+264|0;ma=Rb+260|0;Ia=Rb+256|0;ga=Rb+252|0;xa=Rb+248|0;ya=Rb+244|0;Aa=Rb+240|0;ua=Rb+236|0;va=Rb+232|0;za=Rb+1052|0;wa=Rb+228|0;Ca=Rb+224|0;Ha=Rb+220|0;Fa=Rb+216|0;La=Rb+212|0;Ka=Rb+208|0;Wa=Rb+204|0;Ja=Rb+200|0;ab=Rb+196|0;bb=Rb+192|0;cb=Rb+188|0;mb=Rb+184|0;jb=Rb+1056|0;ob=Rb+180|0;kb=Rb+1054|0;db=Rb+176|0;eb=Rb+172|0;c[Pb>>2]=e;c[sa>>2]=f;c[Gb>>2]=h;c[Qb>>2]=j;c[aa>>2]=k;c[ba>>2]=l;c[u>>2]=m;c[v>>2]=n;c[ca>>2]=o;c[Y>>2]=p;c[Z>>2]=q;c[$>>2]=r;c[ta>>2]=s;c[Nb>>2]=0;c[Ea>>2]=0;c[rb>>2]=0;c[Jb>>2]=0;c[Kb>>2]=0;c[hb>>2]=0;c[Lb>>2]=0;c[qb>>2]=0;c[S>>2]=-1;c[T>>2]=-1;c[Ib>>2]=1276<(c[aa>>2]|0)?1276:c[aa>>2]|0;c[(c[Pb>>2]|0)+18216>>2]=0;if(!((((((!(c[(c[Pb>>2]|0)+144>>2]|0)?((c[Gb>>2]|0)*400|0)!=(c[(c[Pb>>2]|0)+132>>2]|0):0)?((c[Gb>>2]|0)*200|0)!=(c[(c[Pb>>2]|0)+132>>2]|0):0)?((c[Gb>>2]|0)*100|0)!=(c[(c[Pb>>2]|0)+132>>2]|0):0)?((c[Gb>>2]|0)*50|0)!=(c[(c[Pb>>2]|0)+132>>2]|0):0)?((c[Gb>>2]|0)*25|0)!=(c[(c[Pb>>2]|0)+132>>2]|0):0)?((c[Gb>>2]|0)*50|0)!=((c[(c[Pb>>2]|0)+132>>2]|0)*3|0):0))Eb=8;if((Eb|0)==8?!((c[Ib>>2]|0)<=0?1:((c[Gb>>2]|0)*400|0)<(c[(c[Pb>>2]|0)+132>>2]|0)):0){c[Ga>>2]=(c[Pb>>2]|0)+(c[(c[Pb>>2]|0)+4>>2]|0);c[gb>>2]=(c[Pb>>2]|0)+(c[c[Pb>>2]>>2]|0);if((c[(c[Pb>>2]|0)+96>>2]|0)==2051)c[y>>2]=0;else c[y>>2]=c[(c[Pb>>2]|0)+104>>2];if((c[ba>>2]|0)<(c[(c[Pb>>2]|0)+156>>2]|0))q=c[ba>>2]|0;else q=c[(c[Pb>>2]|0)+156>>2]|0;c[ba>>2]=q;e=c[gb>>2]|0;c[w>>2]=$a+((($a-$a|0)/4|0)<<2);lb(e,10015,w)|0;c[fb>>2]=0;if((c[(c[Pb>>2]|0)+8+36>>2]|0)>=7?(c[(c[Pb>>2]|0)+132>>2]|0)==48e3:0){c[S>>2]=c[(c[Pb>>2]|0)+172+8508>>2];c[T>>2]=c[(c[Pb>>2]|0)+172+8512>>2];aj((c[Pb>>2]|0)+172|0,c[$a>>2]|0,c[u>>2]|0,c[v>>2]|0,c[Gb>>2]|0,c[ca>>2]|0,c[Y>>2]|0,c[Z>>2]|0,c[(c[Pb>>2]|0)+132>>2]|0,c[ba>>2]|0,c[$>>2]|0,fb)}c[(c[Pb>>2]|0)+128>>2]=-1;c[(c[Pb>>2]|0)+18212>>2]=0;do if(c[fb>>2]|0){if((c[(c[Pb>>2]|0)+112>>2]|0)==-1e3){w=~~+M(+((1.0-+g[fb+20>>2])*100.0+.5));c[(c[Pb>>2]|0)+128>>2]=w}c[x>>2]=c[fb+24>>2];if((c[x>>2]|0)<=12){c[(c[Pb>>2]|0)+18212>>2]=1101;break}if((c[x>>2]|0)<=14){c[(c[Pb>>2]|0)+18212>>2]=1102;break}if((c[x>>2]|0)<=16){c[(c[Pb>>2]|0)+18212>>2]=1103;break}q=(c[Pb>>2]|0)+18212|0;if((c[x>>2]|0)<=18){c[q>>2]=1104;break}else{c[q>>2]=1105;break}}while(0);if((c[(c[Pb>>2]|0)+100>>2]|0)==2?(c[(c[Pb>>2]|0)+108>>2]|0)!=1:0)g[F>>2]=+Ei(c[sa>>2]|0,c[Gb>>2]|0,c[(c[Pb>>2]|0)+132>>2]|0,(c[Pb>>2]|0)+14352|0);else g[F>>2]=0.0;c[_a>>2]=c[y>>2];y=Gi(c[Pb>>2]|0,c[Gb>>2]|0,c[Ib>>2]|0)|0;c[(c[Pb>>2]|0)+148>>2]=y;c[Da>>2]=(c[(c[Pb>>2]|0)+132>>2]|0)/(c[Gb>>2]|0)|0;do if((c[Ib>>2]|0)>=3?(c[(c[Pb>>2]|0)+148>>2]|0)>=((c[Da>>2]|0)*3<<3|0):0){if((c[Da>>2]|0)<50){if((_(c[Ib>>2]|0,c[Da>>2]|0)|0)<300)break;if((c[(c[Pb>>2]|0)+148>>2]|0)<2400)break}if(!(c[(c[Pb>>2]|0)+136>>2]|0)){if((((c[(c[Pb>>2]|0)+148>>2]|0)+(c[Da>>2]<<2)|0)/(c[Da>>2]<<3|0)|0|0)<(c[Ib>>2]|0))q=((c[(c[Pb>>2]|0)+148>>2]|0)+(c[Da>>2]<<2)|0)/(c[Da>>2]<<3|0)|0;else q=c[Ib>>2]|0;c[A>>2]=q;B=_(c[A>>2]|0,c[Da>>2]<<3)|0;c[(c[Pb>>2]|0)+148>>2]=B;c[Ib>>2]=c[A>>2]}c[Ba>>2]=(_(c[Da>>2]|0,c[Ib>>2]|0)|0)<<3;c[Za>>2]=(c[(c[Pb>>2]|0)+148>>2]|0)-(_(((c[(c[Pb>>2]|0)+100>>2]|0)*40|0)+20|0,((c[(c[Pb>>2]|0)+132>>2]|0)/(c[Gb>>2]|0)|0)-50|0)|0);do if((c[(c[Pb>>2]|0)+112>>2]|0)!=3001){if((c[(c[Pb>>2]|0)+112>>2]|0)==3002){c[K>>2]=0;break}q=c[Pb>>2]|0;if((c[(c[Pb>>2]|0)+128>>2]|0)>=0){c[K>>2]=(c[q+128>>2]|0)*327>>8;if((c[(c[Pb>>2]|0)+96>>2]|0)!=2049)break;c[K>>2]=(c[K>>2]|0)<115?c[K>>2]|0:115;break}if((c[q+96>>2]|0)==2048){c[K>>2]=115;break}else{c[K>>2]=48;break}}else c[K>>2]=127;while(0);if((c[(c[Pb>>2]|0)+108>>2]|0)!=-1e3?(c[(c[Pb>>2]|0)+100>>2]|0)==2:0)c[(c[Pb>>2]|0)+14288>>2]=c[(c[Pb>>2]|0)+108>>2];else Eb=73;do if((Eb|0)==73){if((c[(c[Pb>>2]|0)+100>>2]|0)!=2){c[(c[Pb>>2]|0)+14288>>2]=c[(c[Pb>>2]|0)+100>>2];break}c[C>>2]=3e4;q=c[C>>2]|0;if((c[(c[Pb>>2]|0)+14288>>2]|0)==2)c[C>>2]=q-1e3;else c[C>>2]=q+1e3;c[(c[Pb>>2]|0)+14288>>2]=(c[Za>>2]|0)>(c[C>>2]|0)?2:1}while(0);c[Za>>2]=(c[(c[Pb>>2]|0)+148>>2]|0)-(_(((c[(c[Pb>>2]|0)+14288>>2]|0)*40|0)+20|0,((c[(c[Pb>>2]|0)+132>>2]|0)/(c[Gb>>2]|0)|0)-50|0)|0);q=c[Pb>>2]|0;do if((c[(c[Pb>>2]|0)+96>>2]|0)==2051)c[q+14320>>2]=1002;else{if((c[q+124>>2]|0)!=-1e3){c[(c[Pb>>2]|0)+14320>>2]=c[(c[Pb>>2]|0)+124>>2];break}c[E>>2]=~~((1.0-+g[F>>2])*+(c[4508]|0)+ +g[F>>2]*+(c[4510]|0));c[D>>2]=~~((1.0-+g[F>>2])*+(c[4511]|0)+ +g[F>>2]*+(c[4511]|0));F=_(c[K>>2]|0,c[K>>2]|0)|0;c[G>>2]=(c[D>>2]|0)+((_(F,(c[E>>2]|0)-(c[D>>2]|0)|0)|0)>>14);if((c[(c[Pb>>2]|0)+96>>2]|0)==2048)c[G>>2]=(c[G>>2]|0)+8e3;do if((c[(c[Pb>>2]|0)+14324>>2]|0)==1002)c[G>>2]=(c[G>>2]|0)-4e3;else{if((c[(c[Pb>>2]|0)+14324>>2]|0)<=0)break;c[G>>2]=(c[G>>2]|0)+4e3}while(0);c[(c[Pb>>2]|0)+14320>>2]=(c[Za>>2]|0)>=(c[G>>2]|0)?1002:1e3;do if(c[(c[Pb>>2]|0)+8+40>>2]|0){if((c[(c[Pb>>2]|0)+8+32>>2]|0)<=(128-(c[K>>2]|0)>>4|0))break;c[(c[Pb>>2]|0)+14320>>2]=1e3}while(0);if(!((c[K>>2]|0)>100?(c[(c[Pb>>2]|0)+8+44>>2]|0)!=0:0))break;c[(c[Pb>>2]|0)+14320>>2]=1e3}while(0);if((c[(c[Pb>>2]|0)+14320>>2]|0)!=1002?(c[Gb>>2]|0)<((c[(c[Pb>>2]|0)+132>>2]|0)/100|0|0):0)c[(c[Pb>>2]|0)+14320>>2]=1002;if(c[(c[Pb>>2]|0)+164>>2]|0)c[(c[Pb>>2]|0)+14320>>2]=1002;G=_((c[Da>>2]|0)>50?12e3:8e3,c[Gb>>2]|0)|0;if((c[Ib>>2]|0)<((G|0)/(c[(c[Pb>>2]|0)+132>>2]<<3|0)|0|0))c[(c[Pb>>2]|0)+14320>>2]=1002;do if((c[(c[Pb>>2]|0)+14288>>2]|0)==1){if((c[(c[Pb>>2]|0)+14328>>2]|0)!=2){Eb=107;break}if(c[(c[Pb>>2]|0)+8+56>>2]|0){Eb=107;break}if((c[(c[Pb>>2]|0)+14320>>2]|0)==1002){Eb=107;break}if((c[(c[Pb>>2]|0)+14324>>2]|0)==1002){Eb=107;break}c[(c[Pb>>2]|0)+8+56>>2]=1;c[(c[Pb>>2]|0)+14288>>2]=2}else Eb=107;while(0);if((Eb|0)==107)c[(c[Pb>>2]|0)+8+56>>2]=0;do if((c[(c[Pb>>2]|0)+14324>>2]|0)>0){if(!((c[(c[Pb>>2]|0)+14320>>2]|0)!=1002?(c[(c[Pb>>2]|0)+14324>>2]|0)==1002:0)){if((c[(c[Pb>>2]|0)+14320>>2]|0)!=1002)break;if((c[(c[Pb>>2]|0)+14324>>2]|0)==1002)break}c[Jb>>2]=1;c[hb>>2]=(c[(c[Pb>>2]|0)+14320>>2]|0)!=1002&1;if(c[hb>>2]|0)break;if((c[Gb>>2]|0)>=((c[(c[Pb>>2]|0)+132>>2]|0)/100|0|0)){c[(c[Pb>>2]|0)+14320>>2]=c[(c[Pb>>2]|0)+14324>>2];c[Lb>>2]=1;break}else{c[Jb>>2]=0;break}}while(0);if(c[(c[Pb>>2]|0)+14340>>2]|0){c[Jb>>2]=1;c[hb>>2]=1;c[(c[Pb>>2]|0)+14340>>2]=0;c[Ea>>2]=1}do if(c[Jb>>2]|0){G=_(c[Ib>>2]|0,(c[(c[Pb>>2]|0)+132>>2]|0)/200|0)|0;if(257<((G|0)/((c[Gb>>2]|0)+((c[(c[Pb>>2]|0)+132>>2]|0)/200|0)|0)|0|0))q=257;else{q=_(c[Ib>>2]|0,(c[(c[Pb>>2]|0)+132>>2]|0)/200|0)|0;q=(q|0)/((c[Gb>>2]|0)+((c[(c[Pb>>2]|0)+132>>2]|0)/200|0)|0)|0}c[Kb>>2]=q;if(!(c[(c[Pb>>2]|0)+136>>2]|0))break;if((c[Kb>>2]|0)<((c[(c[Pb>>2]|0)+148>>2]|0)/1600|0|0))q=c[Kb>>2]|0;else q=(c[(c[Pb>>2]|0)+148>>2]|0)/1600|0;c[Kb>>2]=q}while(0);do if((c[(c[Pb>>2]|0)+14320>>2]|0)!=1002){if((c[(c[Pb>>2]|0)+14324>>2]|0)!=1002)break;Td(c[Ga>>2]|0,c[(c[Pb>>2]|0)+168>>2]|0,H)|0;c[Ea>>2]=1}while(0);do if((c[(c[Pb>>2]|0)+14320>>2]|0)!=1002){if(c[(c[Pb>>2]|0)+14344>>2]|0){Eb=133;break}if(c[(c[Pb>>2]|0)+8+72>>2]|0)Eb=133}else Eb=133;while(0);do if((Eb|0)==133){c[L>>2]=1105;c[O>>2]=c[Za>>2];do if((c[(c[Pb>>2]|0)+14320>>2]|0)!=1002){c[O>>2]=(_(c[O>>2]|0,45+(c[(c[Pb>>2]|0)+8+36>>2]|0)|0)|0)/50|0;if(c[(c[Pb>>2]|0)+136>>2]|0)break;c[O>>2]=(c[O>>2]|0)-1e3}while(0);do if((c[(c[Pb>>2]|0)+100>>2]|0)==2){if((c[(c[Pb>>2]|0)+108>>2]|0)==1){Eb=139;break}c[J>>2]=18048;c[I>>2]=18080}else Eb=139;while(0);if((Eb|0)==139){c[J>>2]=18112;c[I>>2]=18144}c[Xa>>2]=0;while(1){if((c[Xa>>2]|0)>=8)break;H=_(c[K>>2]|0,c[K>>2]|0)|0;H=(c[(c[I>>2]|0)+(c[Xa>>2]<<2)>>2]|0)+((_(H,(c[(c[J>>2]|0)+(c[Xa>>2]<<2)>>2]|0)-(c[(c[I>>2]|0)+(c[Xa>>2]<<2)>>2]|0)|0)|0)>>14)|0;c[N+(c[Xa>>2]<<2)>>2]=H;c[Xa>>2]=(c[Xa>>2]|0)+1}do{c[Q>>2]=c[N+((c[L>>2]|0)-1102<<1<<2)>>2];c[P>>2]=c[N+(((c[L>>2]|0)-1102<<1)+1<<2)>>2];do if(!(c[(c[Pb>>2]|0)+14344>>2]|0)){q=c[P>>2]|0;m=c[Q>>2]|0;if((c[(c[Pb>>2]|0)+14336>>2]|0)>=(c[L>>2]|0)){c[Q>>2]=m-q;break}else{c[Q>>2]=m+q;break}}while(0);if((c[O>>2]|0)>=(c[Q>>2]|0))break;K=(c[L>>2]|0)+-1|0;c[L>>2]=K}while((K|0)>1101);c[(c[Pb>>2]|0)+14336>>2]=c[L>>2];if(c[(c[Pb>>2]|0)+14344>>2]|0)break;if((c[(c[Pb>>2]|0)+14320>>2]|0)==1002)break;if(c[(c[Pb>>2]|0)+8+76>>2]|0)break;if((c[(c[Pb>>2]|0)+14336>>2]|0)<=1103)break;c[(c[Pb>>2]|0)+14336>>2]=1103}while(0);if((c[(c[Pb>>2]|0)+14336>>2]|0)>(c[(c[Pb>>2]|0)+120>>2]|0))c[(c[Pb>>2]|0)+14336>>2]=c[(c[Pb>>2]|0)+120>>2];if((c[(c[Pb>>2]|0)+116>>2]|0)!=-1e3)c[(c[Pb>>2]|0)+14336>>2]=c[(c[Pb>>2]|0)+116>>2];if((c[Ba>>2]|0)<15e3?(c[(c[Pb>>2]|0)+14320>>2]|0)!=1002:0){if((c[(c[Pb>>2]|0)+14336>>2]|0)<1103)q=c[(c[Pb>>2]|0)+14336>>2]|0;else q=1103;c[(c[Pb>>2]|0)+14336>>2]=q}do if((c[(c[Pb>>2]|0)+132>>2]|0)<=24e3){if((c[(c[Pb>>2]|0)+14336>>2]|0)<=1104)break;c[(c[Pb>>2]|0)+14336>>2]=1104}while(0);do if((c[(c[Pb>>2]|0)+132>>2]|0)<=16e3){if((c[(c[Pb>>2]|0)+14336>>2]|0)<=1103)break;c[(c[Pb>>2]|0)+14336>>2]=1103}while(0);do if((c[(c[Pb>>2]|0)+132>>2]|0)<=12e3){if((c[(c[Pb>>2]|0)+14336>>2]|0)<=1102)break;c[(c[Pb>>2]|0)+14336>>2]=1102}while(0);do if((c[(c[Pb>>2]|0)+132>>2]|0)<=8e3){if((c[(c[Pb>>2]|0)+14336>>2]|0)<=1101)break;c[(c[Pb>>2]|0)+14336>>2]=1101}while(0);do if(c[(c[Pb>>2]|0)+18212>>2]|0){if((c[(c[Pb>>2]|0)+116>>2]|0)!=-1e3)break;do if((c[Za>>2]|0)<=((c[(c[Pb>>2]|0)+14288>>2]|0)*18e3|0)){if((c[(c[Pb>>2]|0)+14320>>2]|0)!=1002){Eb=179;break}c[R>>2]=1101}else Eb=179;while(0);a:do if((Eb|0)==179){do if((c[Za>>2]|0)<=((c[(c[Pb>>2]|0)+14288>>2]|0)*24e3|0)){if((c[(c[Pb>>2]|0)+14320>>2]|0)!=1002)break;c[R>>2]=1102;break a}while(0);if((c[Za>>2]|0)<=((c[(c[Pb>>2]|0)+14288>>2]|0)*3e4|0)){c[R>>2]=1103;break}if((c[Za>>2]|0)<=((c[(c[Pb>>2]|0)+14288>>2]|0)*44e3|0)){c[R>>2]=1104;break}else{c[R>>2]=1105;break}}while(0);if((c[(c[Pb>>2]|0)+18212>>2]|0)>(c[R>>2]|0))q=c[(c[Pb>>2]|0)+18212>>2]|0;else q=c[R>>2]|0;c[(c[Pb>>2]|0)+18212>>2]=q;q=c[Pb>>2]|0;if((c[(c[Pb>>2]|0)+14336>>2]|0)<(c[(c[Pb>>2]|0)+18212>>2]|0))q=c[q+14336>>2]|0;else q=c[q+18212>>2]|0;c[(c[Pb>>2]|0)+14336>>2]=q}while(0);R=c[gb>>2]|0;c[U>>2]=c[ba>>2];lb(R,4036,U)|0;do if((c[(c[Pb>>2]|0)+14320>>2]|0)==1002){if((c[(c[Pb>>2]|0)+14336>>2]|0)!=1102)break;c[(c[Pb>>2]|0)+14336>>2]=1103}while(0);if(c[(c[Pb>>2]|0)+164>>2]|0)c[(c[Pb>>2]|0)+14336>>2]=1101;do if((c[Gb>>2]|0)>((c[(c[Pb>>2]|0)+132>>2]|0)/50|0|0)){if((c[(c[Pb>>2]|0)+14320>>2]|0)!=1002?(c[(c[Pb>>2]|0)+14336>>2]|0)<=1103:0)break;if((c[S>>2]|0)!=-1){c[(c[Pb>>2]|0)+172+8508>>2]=c[S>>2];c[(c[Pb>>2]|0)+172+8512>>2]=c[T>>2]}c[oa>>2]=(c[Gb>>2]|0)>((c[(c[Pb>>2]|0)+132>>2]|0)/25|0|0)?3:2;if(1276<(((c[aa>>2]|0)-3|0)/(c[oa>>2]|0)|0|0))q=1276;else q=((c[aa>>2]|0)-3|0)/(c[oa>>2]|0)|0;c[da>>2]=q;q=_(c[oa>>2]|0,c[da>>2]|0)|0;c[fa>>2]=ia()|0;m=i;i=i+((1*q|0)+15&-16)|0;Ti(qa)|0;c[ka>>2]=c[(c[Pb>>2]|0)+124>>2];c[ha>>2]=c[(c[Pb>>2]|0)+116>>2];c[ja>>2]=c[(c[Pb>>2]|0)+108>>2];c[(c[Pb>>2]|0)+124>>2]=c[(c[Pb>>2]|0)+14320>>2];c[(c[Pb>>2]|0)+116>>2]=c[(c[Pb>>2]|0)+14336>>2];c[(c[Pb>>2]|0)+108>>2]=c[(c[Pb>>2]|0)+14288>>2];c[la>>2]=c[(c[Pb>>2]|0)+8+56>>2];q=c[Pb>>2]|0;if(c[la>>2]|0)c[q+108>>2]=1;else c[(c[Pb>>2]|0)+14328>>2]=c[q+14288>>2];c[Xa>>2]=0;while(1){q=c[Pb>>2]|0;if((c[Xa>>2]|0)>=(c[oa>>2]|0)){Eb=219;break}c[q+8+56>>2]=0;do if(c[Lb>>2]|0){if((c[Xa>>2]|0)!=((c[oa>>2]|0)-1|0))break;c[(c[Pb>>2]|0)+124>>2]=1002}while(0);Jb=(c[sa>>2]|0)+((_(c[Xa>>2]|0,(_(c[(c[Pb>>2]|0)+100>>2]|0,c[(c[Pb>>2]|0)+132>>2]|0)|0)/50|0)|0)<<2)|0;Kb=m+(_(c[Xa>>2]|0,c[da>>2]|0)|0)|0;c[ea>>2]=Fi(c[Pb>>2]|0,Jb,(c[(c[Pb>>2]|0)+132>>2]|0)/50|0,Kb,c[da>>2]|0,c[ba>>2]|0,0,0,c[ca>>2]|0,c[Y>>2]|0,c[Z>>2]|0,c[$>>2]|0,c[ta>>2]|0)|0;if((c[ea>>2]|0)<0){Eb=215;break}Kb=m+(_(c[Xa>>2]|0,c[da>>2]|0)|0)|0;c[Nb>>2]=Ui(qa,Kb,c[ea>>2]|0)|0;if((c[Nb>>2]|0)<0){Eb=217;break}c[Xa>>2]=(c[Xa>>2]|0)+1}do if((Eb|0)==215){c[Ob>>2]=-3;c[Mb>>2]=1}else if((Eb|0)==217){c[Ob>>2]=-3;c[Mb>>2]=1}else if((Eb|0)==219){if(c[q+136>>2]|0)c[pa>>2]=c[aa>>2];else{if((((c[(c[Pb>>2]|0)+148>>2]|0)*3|0)/(1200/(c[oa>>2]|0)|0|0)|0|0)<(c[aa>>2]|0))q=((c[(c[Pb>>2]|0)+148>>2]|0)*3|0)/(1200/(c[oa>>2]|0)|0|0)|0;else q=c[aa>>2]|0;c[pa>>2]=q}c[Nb>>2]=Wi(qa,0,c[oa>>2]|0,c[Qb>>2]|0,c[pa>>2]|0,0,((c[(c[Pb>>2]|0)+136>>2]|0)!=0^1)&1)|0;if((c[Nb>>2]|0)<0){c[Ob>>2]=-3;c[Mb>>2]=1;break}else{c[(c[Pb>>2]|0)+124>>2]=c[ka>>2];c[(c[Pb>>2]|0)+116>>2]=c[ha>>2];c[(c[Pb>>2]|0)+108>>2]=c[ja>>2];c[(c[Pb>>2]|0)+8+56>>2]=c[la>>2];c[Ob>>2]=c[Nb>>2];c[Mb>>2]=1;break}}while(0);na(c[fa>>2]|0);Qb=c[Ob>>2]|0;i=Rb;return Qb|0}while(0);c[ib>>2]=c[(c[Pb>>2]|0)+14336>>2];if((c[ib>>2]|0)>1103?(c[(c[Pb>>2]|0)+14320>>2]|0)==1e3:0)c[(c[Pb>>2]|0)+14320>>2]=1001;if((c[ib>>2]|0)<=1103?(c[(c[Pb>>2]|0)+14320>>2]|0)==1001:0)c[(c[Pb>>2]|0)+14320>>2]=1e3;qa=_(c[(c[Pb>>2]|0)+148>>2]|0,c[Gb>>2]|0)|0;if(((c[Ib>>2]|0)-(c[Kb>>2]|0)|0)<((qa|0)/(c[(c[Pb>>2]|0)+132>>2]<<3|0)|0|0))q=(c[Ib>>2]|0)-(c[Kb>>2]|0)|0;else{q=_(c[(c[Pb>>2]|0)+148>>2]|0,c[Gb>>2]|0)|0;q=(q|0)/(c[(c[Pb>>2]|0)+132>>2]<<3|0)|0}c[Va>>2]=q-1;c[Qb>>2]=(c[Qb>>2]|0)+1;ic(Hb,c[Qb>>2]|0,(c[Ib>>2]|0)-1|0);pa=_((c[_a>>2]|0)+(c[Gb>>2]|0)|0,c[(c[Pb>>2]|0)+100>>2]|0)|0;c[Fb>>2]=ia()|0;n=i;i=i+((1*(pa<<2)|0)+15&-16)|0;pa=_((c[(c[Pb>>2]|0)+160>>2]|0)-(c[_a>>2]|0)|0,c[(c[Pb>>2]|0)+100>>2]|0)|0;qa=(_(c[_a>>2]|0,c[(c[Pb>>2]|0)+100>>2]|0)|0)<<2;pj(n|0,(c[Pb>>2]|0)+14372+(pa<<2)|0,qa+0|0)|0;if((c[(c[Pb>>2]|0)+14320>>2]|0)==1002)c[V>>2]=(Sf(60)|0)<<8;else c[V>>2]=c[(c[Ga>>2]|0)+8>>2];c[(c[Pb>>2]|0)+14296>>2]=(c[(c[Pb>>2]|0)+14296>>2]|0)+((((c[V>>2]|0)-(c[(c[Pb>>2]|0)+14296>>2]|0)>>16)*983|0)+(((c[V>>2]|0)-(c[(c[Pb>>2]|0)+14296>>2]|0)&65535)*983>>16));c[W>>2]=Wf(c[(c[Pb>>2]|0)+14296>>2]>>8)|0;q=c[sa>>2]|0;if((c[(c[Pb>>2]|0)+96>>2]|0)==2048){sa=n+((_(c[_a>>2]|0,c[(c[Pb>>2]|0)+100>>2]|0)|0)<<2)|0;Ii(q,c[W>>2]|0,sa,(c[Pb>>2]|0)+14304|0,c[Gb>>2]|0,c[(c[Pb>>2]|0)+100>>2]|0,c[(c[Pb>>2]|0)+132>>2]|0)}else{sa=n+((_(c[_a>>2]|0,c[(c[Pb>>2]|0)+100>>2]|0)|0)<<2)|0;Ki(q,3,sa,(c[Pb>>2]|0)+14304|0,c[Gb>>2]|0,c[(c[Pb>>2]|0)+100>>2]|0,c[(c[Pb>>2]|0)+132>>2]|0)}do if(c[ta>>2]|0){sa=n+((_(c[_a>>2]|0,c[(c[Pb>>2]|0)+100>>2]|0)|0)<<2)|0;ta=n+((_(c[_a>>2]|0,c[(c[Pb>>2]|0)+100>>2]|0)|0)<<2)|0;g[X>>2]=+Li(sa,ta,_(c[Gb>>2]|0,c[(c[Pb>>2]|0)+100>>2]|0)|0);if(+g[X>>2]<1.0e9?!(+g[X>>2]!=+g[X>>2]):0)break;ta=n+((_(c[_a>>2]|0,c[(c[Pb>>2]|0)+100>>2]|0)|0)<<2)|0;oj(ta|0,0,(_(c[Gb>>2]|0,c[(c[Pb>>2]|0)+100>>2]|0)|0)<<2|0)|0;g[(c[Pb>>2]|0)+14304+12>>2]=0.0;g[(c[Pb>>2]|0)+14304+8>>2]=0.0;g[(c[Pb>>2]|0)+14304+4>>2]=0.0;g[(c[Pb>>2]|0)+14304>>2]=0.0}while(0);g[Ya>>2]=1.0;if((c[(c[Pb>>2]|0)+14320>>2]|0)!=1002){ta=_(c[(c[Pb>>2]|0)+100>>2]|0,c[Gb>>2]|0)|0;c[Ia>>2]=ia()|0;m=i;i=i+((1*(ta<<1)|0)+15&-16)|0;c[ra>>2]=_(c[Va>>2]<<3,c[Da>>2]|0)|0;do if((c[(c[Pb>>2]|0)+14320>>2]|0)==1001){q=_(c[(c[Pb>>2]|0)+14288>>2]|0,5e3+(((c[(c[Pb>>2]|0)+132>>2]|0)==((c[Gb>>2]|0)*100|0)&1)*1e3|0)|0)|0;c[(c[Pb>>2]|0)+8+28>>2]=q;q=(c[ra>>2]|0)-(c[(c[Pb>>2]|0)+8+28>>2]|0)|0;if((c[ib>>2]|0)==1104){ta=(c[Pb>>2]|0)+8+28|0;c[ta>>2]=(c[ta>>2]|0)+((q<<1|0)/3|0)}else{ta=(c[Pb>>2]|0)+8+28|0;c[ta>>2]=(c[ta>>2]|0)+((q*3|0)/5|0)}if((c[(c[Pb>>2]|0)+8+28>>2]|0)>((c[ra>>2]<<2|0)/5|0|0))c[(c[Pb>>2]|0)+8+28>>2]=(c[ra>>2]<<2|0)/5|0;if(c[(c[Pb>>2]|0)+14348>>2]|0)break;c[ma>>2]=(c[ra>>2]|0)-(c[(c[Pb>>2]|0)+8+28>>2]|0);c[ga>>2]=(c[ib>>2]|0)==1104?3e3:3600;g[Ya>>2]=+(c[ma>>2]|0)/(+(c[ma>>2]|0)+ +(_(c[(c[Pb>>2]|0)+14288>>2]|0,c[ga>>2]|0)|0));g[Ya>>2]=+g[Ya>>2]<.8571428656578064?+g[Ya>>2]+.1428571492433548:1.0}else c[(c[Pb>>2]|0)+8+28>>2]=c[ra>>2];while(0);do if(c[(c[Pb>>2]|0)+14348>>2]|0){if(!(c[(c[Pb>>2]|0)+136>>2]|0))break;if(c[(c[Pb>>2]|0)+164>>2]|0)break;g[xa>>2]=0.0;c[va>>2]=17;b[za>>1]=16e3;do if((c[(c[Pb>>2]|0)+14336>>2]|0)==1101){c[va>>2]=13;b[za>>1]=8e3}else{if((c[(c[Pb>>2]|0)+14336>>2]|0)!=1102)break;c[va>>2]=15;b[za>>1]=12e3}while(0);c[ua>>2]=0;while(1){if((c[ua>>2]|0)>=(c[(c[Pb>>2]|0)+100>>2]|0))break;c[Xa>>2]=0;while(1){q=c[ua>>2]|0;if((c[Xa>>2]|0)>=(c[va>>2]|0))break;if(+g[(c[(c[Pb>>2]|0)+14348>>2]|0)+((q*21|0)+(c[Xa>>2]|0)<<2)>>2]<.5)t=+g[(c[(c[Pb>>2]|0)+14348>>2]|0)+(((c[ua>>2]|0)*21|0)+(c[Xa>>2]|0)<<2)>>2];else t=.5;do if(t>-2.0){if(!(+g[(c[(c[Pb>>2]|0)+14348>>2]|0)+(((c[ua>>2]|0)*21|0)+(c[Xa>>2]|0)<<2)>>2]<.5)){t=.5;break}t=+g[(c[(c[Pb>>2]|0)+14348>>2]|0)+(((c[ua>>2]|0)*21|0)+(c[Xa>>2]|0)<<2)>>2]}else t=-2.0;while(0);g[wa>>2]=t;if(+g[wa>>2]>0.0)g[wa>>2]=+g[wa>>2]*.5;g[xa>>2]=+g[xa>>2]+ +g[wa>>2];c[Xa>>2]=(c[Xa>>2]|0)+1}c[ua>>2]=q+1}g[ya>>2]=+g[xa>>2]/+(c[va>>2]|0)*+(c[(c[Pb>>2]|0)+100>>2]|0);g[ya>>2]=+g[ya>>2]+.20000000298023224;c[Aa>>2]=~~(+(b[za>>1]|0)*+g[ya>>2]);if((c[Aa>>2]|0)>((_(-2,c[(c[Pb>>2]|0)+8+28>>2]|0)|0)/3|0|0))q=c[Aa>>2]|0;else q=(_(-2,c[(c[Pb>>2]|0)+8+28>>2]|0)|0)/3|0;c[Aa>>2]=q;do if((c[(c[Pb>>2]|0)+14336>>2]|0)==1104)Eb=281;else{if((c[(c[Pb>>2]|0)+14336>>2]|0)==1105){Eb=281;break}za=(c[Pb>>2]|0)+8+28|0;c[za>>2]=(c[za>>2]|0)+(c[Aa>>2]|0)}while(0);if((Eb|0)==281){za=(c[Pb>>2]|0)+8+28|0;c[za>>2]=(c[za>>2]|0)+(((c[Aa>>2]|0)*3|0)/5|0)}Aa=_(c[Aa>>2]|0,c[Gb>>2]|0)|0;c[Va>>2]=(c[Va>>2]|0)+((Aa|0)/(c[(c[Pb>>2]|0)+132>>2]<<3|0)|0)}while(0);c[(c[Pb>>2]|0)+8+24>>2]=((c[Gb>>2]|0)*1e3|0)/(c[(c[Pb>>2]|0)+132>>2]|0)|0;c[(c[Pb>>2]|0)+8>>2]=c[(c[Pb>>2]|0)+100>>2];c[(c[Pb>>2]|0)+8+4>>2]=c[(c[Pb>>2]|0)+14288>>2];do if((c[ib>>2]|0)!=1101){q=(c[Pb>>2]|0)+8+20|0;if((c[ib>>2]|0)==1102){c[q>>2]=12e3;break}else{c[q>>2]=16e3;break}}else c[(c[Pb>>2]|0)+8+20>>2]=8e3;while(0);q=(c[Pb>>2]|0)+8+16|0;if((c[(c[Pb>>2]|0)+14320>>2]|0)==1001)c[q>>2]=16e3;else c[q>>2]=8e3;do if((c[(c[Pb>>2]|0)+14320>>2]|0)==1e3){c[Ca>>2]=c[Ba>>2];c[(c[Pb>>2]|0)+8+12>>2]=16e3;if((c[Da>>2]|0)>50)c[Ca>>2]=(c[Ca>>2]<<1|0)/3|0;if((c[Ca>>2]|0)<13e3){c[(c[Pb>>2]|0)+8+12>>2]=12e3;if(12e3<(c[(c[Pb>>2]|0)+8+20>>2]|0))q=12e3;else q=c[(c[Pb>>2]|0)+8+20>>2]|0;c[(c[Pb>>2]|0)+8+20>>2]=q}if((c[Ca>>2]|0)>=9600)break;c[(c[Pb>>2]|0)+8+12>>2]=8e3;if(8e3<(c[(c[Pb>>2]|0)+8+20>>2]|0))q=8e3;else q=c[(c[Pb>>2]|0)+8+20>>2]|0;c[(c[Pb>>2]|0)+8+20>>2]=q}else c[(c[Pb>>2]|0)+8+12>>2]=16e3;while(0);c[(c[Pb>>2]|0)+8+48>>2]=((c[(c[Pb>>2]|0)+136>>2]|0)!=0^1)&1;if(1275<((c[Ib>>2]|0)-1-(c[Kb>>2]|0)|0))q=1275;else q=(c[Ib>>2]|0)-1-(c[Kb>>2]|0)|0;c[Ma>>2]=q;c[(c[Pb>>2]|0)+8+52>>2]=c[Ma>>2]<<3;if((c[(c[Pb>>2]|0)+14320>>2]|0)==1001)c[(c[Pb>>2]|0)+8+52>>2]=((c[(c[Pb>>2]|0)+8+52>>2]|0)*9|0)/10|0;if(c[(c[Pb>>2]|0)+8+48>>2]|0){Da=_(c[(c[Pb>>2]|0)+8+28>>2]|0,c[Gb>>2]|0)|0;c[(c[Pb>>2]|0)+8+52>>2]=((Da|0)/(c[(c[Pb>>2]|0)+132>>2]<<3|0)|0)<<3;if(1>((c[(c[Pb>>2]|0)+8+28>>2]|0)-2e3|0))q=1;else q=(c[(c[Pb>>2]|0)+8+28>>2]|0)-2e3|0;c[(c[Pb>>2]|0)+8+28>>2]=q}if(c[Ea>>2]|0){c[Ha>>2]=0;c[Fa>>2]=_(c[(c[Pb>>2]|0)+100>>2]|0,(c[(c[Pb>>2]|0)+160>>2]|0)-(c[(c[Pb>>2]|0)+104>>2]|0)-((c[(c[Pb>>2]|0)+132>>2]|0)/400|0)|0)|0;Mi((c[Pb>>2]|0)+14372+(c[Fa>>2]<<2)|0,(c[Pb>>2]|0)+14372+(c[Fa>>2]<<2)|0,0.0,1.0,c[(c[$a>>2]|0)+4>>2]|0,(c[(c[Pb>>2]|0)+132>>2]|0)/400|0,c[(c[Pb>>2]|0)+100>>2]|0,c[(c[$a>>2]|0)+60>>2]|0,c[(c[Pb>>2]|0)+132>>2]|0);oj((c[Pb>>2]|0)+14372|0,0,c[Fa>>2]<<2|0)|0;c[Xa>>2]=0;while(1){if((c[Xa>>2]|0)>=(_(c[(c[Pb>>2]|0)+160>>2]|0,c[(c[Pb>>2]|0)+100>>2]|0)|0))break;Fa=Ni(+g[(c[Pb>>2]|0)+14372+(c[Xa>>2]<<2)>>2])|0;b[m+(c[Xa>>2]<<1)>>1]=Fa;c[Xa>>2]=(c[Xa>>2]|0)+1}Vd(c[Ga>>2]|0,(c[Pb>>2]|0)+8|0,m,c[(c[Pb>>2]|0)+160>>2]|0,0,Ha,1)|0}c[Xa>>2]=0;while(1){if((c[Xa>>2]|0)>=(_(c[Gb>>2]|0,c[(c[Pb>>2]|0)+100>>2]|0)|0))break;Ha=_(c[_a>>2]|0,c[(c[Pb>>2]|0)+100>>2]|0)|0;Ha=Ni(+g[n+(Ha+(c[Xa>>2]|0)<<2)>>2])|0;b[m+(c[Xa>>2]<<1)>>1]=Ha;c[Xa>>2]=(c[Xa>>2]|0)+1}c[Nb>>2]=Vd(c[Ga>>2]|0,(c[Pb>>2]|0)+8|0,m,c[Gb>>2]|0,Hb,Ma,0)|0;do if(c[Nb>>2]|0){c[Ob>>2]=-3;c[Mb>>2]=1}else{q=c[Pb>>2]|0;if(!(c[Ma>>2]|0)){c[q+18216>>2]=0;Xa=Hi(c[(c[Pb>>2]|0)+14320>>2]|0,(c[(c[Pb>>2]|0)+132>>2]|0)/(c[Gb>>2]|0)|0,c[ib>>2]|0,c[(c[Pb>>2]|0)+14288>>2]|0)|0;a[(c[Qb>>2]|0)+-1>>0]=Xa;c[Ob>>2]=1;c[Mb>>2]=1;break}do if((c[q+14320>>2]|0)==1e3){if((c[(c[Pb>>2]|0)+8+68>>2]|0)==8e3){c[ib>>2]=1101;break}if((c[(c[Pb>>2]|0)+8+68>>2]|0)==12e3){c[ib>>2]=1102;break}if((c[(c[Pb>>2]|0)+8+68>>2]|0)!=16e3)break;c[ib>>2]=1103}while(0);c[(c[Pb>>2]|0)+8+60>>2]=c[(c[Pb>>2]|0)+8+84>>2];if(c[(c[Pb>>2]|0)+8+60>>2]|0){c[Jb>>2]=1;c[hb>>2]=0;c[(c[Pb>>2]|0)+14340>>2]=1}c[Mb>>2]=0}while(0);na(c[Ia>>2]|0);if(!(c[Mb>>2]|0))Eb=335}else Eb=335;b:do if((Eb|0)==335){c[La>>2]=21;switch(c[ib>>2]|0){case 1101:{c[La>>2]=13;break}case 1103:case 1102:{c[La>>2]=17;break}case 1104:{c[La>>2]=19;break}case 1105:{c[La>>2]=21;break}default:{}}Xa=c[gb>>2]|0;c[Na>>2]=c[La>>2];lb(Xa,10012,Na)|0;Xa=c[gb>>2]|0;c[Oa>>2]=c[(c[Pb>>2]|0)+14288>>2];lb(Xa,10008,Oa)|0;Xa=c[gb>>2]|0;c[Pa>>2]=-1;lb(Xa,4002,Pa)|0;do if((c[(c[Pb>>2]|0)+14320>>2]|0)!=1e3){g[Ka>>2]=2.0;Xa=c[gb>>2]|0;c[Qa>>2]=0;lb(Xa,4006,Qa)|0;if(c[(c[Pb>>2]|0)+8+64>>2]|0)g[Ka>>2]=0.0;Xa=c[gb>>2]|0;c[Ra>>2]=~~+g[Ka>>2];lb(Xa,10002,Ra)|0;if((c[(c[Pb>>2]|0)+14320>>2]|0)==1001){c[Wa>>2]=(Oi(Hb)|0)+7>>3;if(c[Jb>>2]|0)c[Wa>>2]=(c[Wa>>2]|0)+((c[(c[Pb>>2]|0)+14320>>2]|0)==1001?3:1);q=c[Wa>>2]|0;m=c[Va>>2]|0;if(c[(c[Pb>>2]|0)+136>>2]|0){Xa=_(c[(c[Pb>>2]|0)+8+28>>2]|0,c[Gb>>2]|0)|0;c[pb>>2]=q+m-((Xa|0)/(c[(c[Pb>>2]|0)+132>>2]<<3|0)|0);break}else{c[pb>>2]=(q|0)>(m|0)?c[Wa>>2]|0:c[Va>>2]|0;break}}if(!(c[(c[Pb>>2]|0)+136>>2]|0)){c[pb>>2]=c[Va>>2];break}c[Ja>>2]=0;do if((c[(c[Pb>>2]|0)+144>>2]|0)==5010){if((c[Gb>>2]|0)==((c[(c[Pb>>2]|0)+132>>2]|0)/50|0|0))break;c[Ja>>2]=_(((c[(c[Pb>>2]|0)+14288>>2]|0)*60|0)+40|0,((c[(c[Pb>>2]|0)+132>>2]|0)/(c[Gb>>2]|0)|0)-50|0)|0;if(!(c[fb>>2]|0))break;c[Ja>>2]=~~(+(c[Ja>>2]|0)*(+g[fb+4>>2]*.5+1.0))}while(0);Xa=c[gb>>2]|0;c[Sa>>2]=1;lb(Xa,4006,Sa)|0;Xa=c[gb>>2]|0;c[Ta>>2]=c[(c[Pb>>2]|0)+140>>2];lb(Xa,4020,Ta)|0;Xa=c[gb>>2]|0;c[Ua>>2]=(c[(c[Pb>>2]|0)+148>>2]|0)+(c[Ja>>2]|0);lb(Xa,4002,Ua)|0;c[pb>>2]=(c[Ib>>2]|0)-1-(c[Kb>>2]|0)}else c[pb>>2]=0;while(0);Xa=((_(c[(c[Pb>>2]|0)+100>>2]|0,c[(c[Pb>>2]|0)+132>>2]|0)|0)/400|0)<<2;m=i;i=i+((1*Xa|0)+15&-16)|0;do if((c[(c[Pb>>2]|0)+14320>>2]|0)!=1e3){if((c[(c[Pb>>2]|0)+14320>>2]|0)==(c[(c[Pb>>2]|0)+14324>>2]|0))break;if((c[(c[Pb>>2]|0)+14324>>2]|0)<=0)break;Wa=_((c[(c[Pb>>2]|0)+160>>2]|0)-(c[_a>>2]|0)-((c[(c[Pb>>2]|0)+132>>2]|0)/400|0)|0,c[(c[Pb>>2]|0)+100>>2]|0)|0;Xa=((_(c[(c[Pb>>2]|0)+100>>2]|0,c[(c[Pb>>2]|0)+132>>2]|0)|0)/400|0)<<2;pj(m|0,(c[Pb>>2]|0)+14372+(Wa<<2)|0,Xa+0|0)|0}while(0);Xa=(_(c[(c[Pb>>2]|0)+100>>2]|0,(c[(c[Pb>>2]|0)+160>>2]|0)-((c[Gb>>2]|0)+(c[_a>>2]|0))|0)|0)>0;q=(c[Pb>>2]|0)+14372|0;if(Xa){Wa=_(c[(c[Pb>>2]|0)+100>>2]|0,c[Gb>>2]|0)|0;Xa=(_(c[(c[Pb>>2]|0)+100>>2]|0,(c[(c[Pb>>2]|0)+160>>2]|0)-(c[Gb>>2]|0)-(c[_a>>2]|0)|0)|0)<<2;qj(q|0,(c[Pb>>2]|0)+14372+(Wa<<2)|0,Xa+0|0)|0;Xa=_(c[(c[Pb>>2]|0)+100>>2]|0,(c[(c[Pb>>2]|0)+160>>2]|0)-(c[Gb>>2]|0)-(c[_a>>2]|0)|0)|0;_a=(_((c[Gb>>2]|0)+(c[_a>>2]|0)|0,c[(c[Pb>>2]|0)+100>>2]|0)|0)<<2;pj((c[Pb>>2]|0)+14372+(Xa<<2)|0,n|0,_a+0|0)|0}else{Xa=n+((_((c[Gb>>2]|0)+(c[_a>>2]|0)-(c[(c[Pb>>2]|0)+160>>2]|0)|0,c[(c[Pb>>2]|0)+100>>2]|0)|0)<<2)|0;_a=(_(c[(c[Pb>>2]|0)+160>>2]|0,c[(c[Pb>>2]|0)+100>>2]|0)|0)<<2;pj(q|0,Xa|0,_a+0|0)|0}if(+g[Ya>>2]<1.0?1:+g[(c[Pb>>2]|0)+14300>>2]<1.0)Mi(n,n,+g[(c[Pb>>2]|0)+14300>>2],+g[Ya>>2],c[(c[$a>>2]|0)+4>>2]|0,c[Gb>>2]|0,c[(c[Pb>>2]|0)+100>>2]|0,c[(c[$a>>2]|0)+60>>2]|0,c[(c[Pb>>2]|0)+132>>2]|0);g[(c[Pb>>2]|0)+14300>>2]=+g[Ya>>2];if(!((c[(c[Pb>>2]|0)+14320>>2]|0)==1001?(c[(c[Pb>>2]|0)+14288>>2]|0)!=1:0)){if(16384<((0>((c[Za>>2]|0)-3e4|0)?0:(c[Za>>2]|0)-3e4|0)<<1|0))q=16384;else q=(0>((c[Za>>2]|0)-3e4|0)?0:(c[Za>>2]|0)-3e4|0)<<1;c[(c[Pb>>2]|0)+8+80>>2]=q}do if(!(c[(c[Pb>>2]|0)+14348>>2]|0)){if((c[(c[Pb>>2]|0)+100>>2]|0)!=2)break;if((b[(c[Pb>>2]|0)+14292>>1]|0)>=16384?(c[(c[Pb>>2]|0)+8+80>>2]|0)>=16384:0)break;g[ab>>2]=+(b[(c[Pb>>2]|0)+14292>>1]|0);g[bb>>2]=+(c[(c[Pb>>2]|0)+8+80>>2]|0);g[ab>>2]=+g[ab>>2]*.00006103515625;g[bb>>2]=+g[bb>>2]*.00006103515625;Pi(n,n,+g[ab>>2],+g[bb>>2],c[(c[$a>>2]|0)+4>>2]|0,c[Gb>>2]|0,c[(c[Pb>>2]|0)+100>>2]|0,c[(c[$a>>2]|0)+60>>2]|0,c[(c[Pb>>2]|0)+132>>2]|0);b[(c[Pb>>2]|0)+14292>>1]=c[(c[Pb>>2]|0)+8+80>>2]}while(0);do if((c[(c[Pb>>2]|0)+14320>>2]|0)!=1002){bb=(Oi(Hb)|0)+17|0;if((bb+(((c[(c[Pb>>2]|0)+14320>>2]|0)==1001&1)*20|0)|0)>((c[Ib>>2]|0)-1<<3|0)){Eb=393;break}do if((c[(c[Pb>>2]|0)+14320>>2]|0)==1001){if((c[Jb>>2]|0)==0?(bb=(Oi(Hb)|0)+37|0,(bb|0)>(c[pb>>2]<<3|0)):0)break;pc(Hb,c[Jb>>2]|0,12)}while(0);if(!(c[Jb>>2]|0))break;pc(Hb,c[hb>>2]|0,1);q=(c[Ib>>2]|0)-1|0;if((c[(c[Pb>>2]|0)+14320>>2]|0)==1001)c[cb>>2]=q-(c[pb>>2]|0);else c[cb>>2]=q-((Oi(Hb)|0)+7>>3);if((c[cb>>2]|0)<((c[(c[Pb>>2]|0)+148>>2]|0)/1600|0|0))q=c[cb>>2]|0;else q=(c[(c[Pb>>2]|0)+148>>2]|0)/1600|0;c[Kb>>2]=q;if(257<((2>(c[Kb>>2]|0)?2:c[Kb>>2]|0)|0))q=257;else q=2>(c[Kb>>2]|0)?2:c[Kb>>2]|0;c[Kb>>2]=q;if((c[(c[Pb>>2]|0)+14320>>2]|0)!=1001)break;rc(Hb,(c[Kb>>2]|0)-2|0,256)}else Eb=393;while(0);if((Eb|0)==393)c[Jb>>2]=0;if(!(c[Jb>>2]|0)){c[(c[Pb>>2]|0)+14340>>2]=0;c[Kb>>2]=0}if((c[(c[Pb>>2]|0)+14320>>2]|0)!=1002)c[rb>>2]=17;if((c[(c[Pb>>2]|0)+14320>>2]|0)==1e3){c[Nb>>2]=(Oi(Hb)|0)+7>>3;wc(Hb);c[pb>>2]=c[Nb>>2]}else{if(((c[Ib>>2]|0)-1-(c[Kb>>2]|0)|0)<(c[pb>>2]|0))q=(c[Ib>>2]|0)-1-(c[Kb>>2]|0)|0;else q=c[pb>>2]|0;c[pb>>2]=q;vc(Hb,c[pb>>2]|0)}if(!(!(c[Jb>>2]|0)?(c[(c[Pb>>2]|0)+14320>>2]|0)==1e3:0)){Eb=c[gb>>2]|0;c[sb>>2]=fb+(((fb-fb|0)/28|0)*28|0);lb(Eb,10022,sb)|0}do if((c[Jb>>2]|0)!=0&(c[hb>>2]|0)!=0){Eb=c[gb>>2]|0;c[tb>>2]=0;lb(Eb,10010,tb)|0;Eb=c[gb>>2]|0;c[ub>>2]=0;lb(Eb,4006,ub)|0;c[mb>>2]=nb(c[gb>>2]|0,n,(c[(c[Pb>>2]|0)+132>>2]|0)/200|0,(c[Qb>>2]|0)+(c[pb>>2]|0)|0,c[Kb>>2]|0,0)|0;if((c[mb>>2]|0)<0){c[Ob>>2]=-3;c[Mb>>2]=1;break b}else{Eb=c[gb>>2]|0;c[vb>>2]=qb+(((qb-qb|0)/4|0)<<2);lb(Eb,4031,vb)|0;lb(c[gb>>2]|0,4028,wb)|0;break}}while(0);Eb=c[gb>>2]|0;c[xb>>2]=c[rb>>2];lb(Eb,10010,xb)|0;do if((c[(c[Pb>>2]|0)+14320>>2]|0)!=1e3){do if((c[(c[Pb>>2]|0)+14320>>2]|0)!=(c[(c[Pb>>2]|0)+14324>>2]|0)){if((c[(c[Pb>>2]|0)+14324>>2]|0)<=0)break;lb(c[gb>>2]|0,4028,yb)|0;nb(c[gb>>2]|0,m,(c[(c[Pb>>2]|0)+132>>2]|0)/400|0,jb,2,0)|0;Eb=c[gb>>2]|0;c[zb>>2]=0;lb(Eb,10002,zb)|0}while(0);Eb=Oi(Hb)|0;if((Eb|0)>(c[pb>>2]<<3|0))break;c[Nb>>2]=nb(c[gb>>2]|0,n,c[Gb>>2]|0,0,c[pb>>2]|0,Hb)|0;if((c[Nb>>2]|0)>=0)break;c[Ob>>2]=-3;c[Mb>>2]=1;break b}while(0);do if(!((c[Jb>>2]|0)==0|(c[hb>>2]|0)!=0)){c[db>>2]=(c[(c[Pb>>2]|0)+132>>2]|0)/200|0;c[eb>>2]=(c[(c[Pb>>2]|0)+132>>2]|0)/400|0;lb(c[gb>>2]|0,4028,Ab)|0;Eb=c[gb>>2]|0;c[Bb>>2]=0;lb(Eb,10010,Bb)|0;Eb=c[gb>>2]|0;c[Cb>>2]=0;lb(Eb,10002,Cb)|0;Eb=n+((_(c[(c[Pb>>2]|0)+100>>2]|0,(c[Gb>>2]|0)-(c[db>>2]|0)-(c[eb>>2]|0)|0)|0)<<2)|0;nb(c[gb>>2]|0,Eb,c[eb>>2]|0,kb,2,0)|0;Eb=n+((_(c[(c[Pb>>2]|0)+100>>2]|0,(c[Gb>>2]|0)-(c[db>>2]|0)|0)|0)<<2)|0;c[ob>>2]=nb(c[gb>>2]|0,Eb,c[db>>2]|0,(c[Qb>>2]|0)+(c[pb>>2]|0)|0,c[Kb>>2]|0,0)|0;if((c[ob>>2]|0)<0){c[Ob>>2]=-3;c[Mb>>2]=1;break b}else{Eb=c[gb>>2]|0;c[Db>>2]=qb+(((qb-qb|0)/4|0)<<2);lb(Eb,4031,Db)|0;break}}while(0);c[Qb>>2]=(c[Qb>>2]|0)+-1;q=Hi(c[(c[Pb>>2]|0)+14320>>2]|0,(c[(c[Pb>>2]|0)+132>>2]|0)/(c[Gb>>2]|0)|0,c[ib>>2]|0,c[(c[Pb>>2]|0)+14288>>2]|0)|0;a[c[Qb>>2]>>0]=q;c[(c[Pb>>2]|0)+18216>>2]=c[Hb+28>>2]^c[qb>>2];q=c[Pb>>2]|0;if(c[Lb>>2]|0)c[q+14324>>2]=1002;else c[(c[Pb>>2]|0)+14324>>2]=c[q+14320>>2];c[(c[Pb>>2]|0)+14328>>2]=c[(c[Pb>>2]|0)+14288>>2];c[(c[Pb>>2]|0)+14332>>2]=c[Gb>>2];c[(c[Pb>>2]|0)+14344>>2]=0;Lb=Oi(Hb)|0;c:do if((Lb|0)>((c[Ib>>2]|0)-1<<3|0))if((c[Ib>>2]|0)<2){c[Ob>>2]=-2;c[Mb>>2]=1;break b}else{a[(c[Qb>>2]|0)+1>>0]=0;c[Nb>>2]=1;c[(c[Pb>>2]|0)+18216>>2]=0;break}else{if(!(((c[Jb>>2]|0?1:(c[(c[Pb>>2]|0)+14320>>2]|0)!=1e3)^1)&(c[Nb>>2]|0)>2))break;do{if(d[(c[Qb>>2]|0)+(c[Nb>>2]|0)>>0]|0)break c;c[Nb>>2]=(c[Nb>>2]|0)+-1}while((c[Nb>>2]|0)>2)}while(0);c[Nb>>2]=(c[Nb>>2]|0)+(1+(c[Kb>>2]|0));do if(!(c[(c[Pb>>2]|0)+136>>2]|0))if(Xi(c[Qb>>2]|0,c[Nb>>2]|0,c[Ib>>2]|0)|0){c[Ob>>2]=-3;c[Mb>>2]=1;break b}else{c[Nb>>2]=c[Ib>>2];break}while(0);c[Ob>>2]=c[Nb>>2];c[Mb>>2]=1}while(0);na(c[Fb>>2]|0);Qb=c[Ob>>2]|0;i=Rb;return Qb|0}while(0);c[B>>2]=c[(c[Pb>>2]|0)+14320>>2];if(!(c[(c[Pb>>2]|0)+14336>>2]|0))q=1101;else q=c[(c[Pb>>2]|0)+14336>>2]|0;c[z>>2]=q;if(!(c[B>>2]|0))c[B>>2]=1e3;if((c[Da>>2]|0)>100)c[B>>2]=1002;if((c[Da>>2]|0)<50)c[B>>2]=1e3;do if(!((c[B>>2]|0)==1e3&(c[z>>2]|0)>1103)){if((c[B>>2]|0)==1002&(c[z>>2]|0)==1102){c[z>>2]=1101;break}if((c[z>>2]|0)<=1104)c[z>>2]=1104}else c[z>>2]=1103;while(0);Pb=Hi(c[B>>2]|0,c[Da>>2]|0,c[z>>2]|0,c[(c[Pb>>2]|0)+14288>>2]|0)|0;a[c[Qb>>2]>>0]=Pb;c[Ob>>2]=1;Qb=c[Ob>>2]|0;i=Rb;return Qb|0}c[Ob>>2]=-1;Qb=c[Ob>>2]|0;i=Rb;return Qb|0}function Gi(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;j=i;i=i+16|0;e=j+12|0;f=j+8|0;g=j+4|0;h=j;c[f>>2]=a;c[g>>2]=b;c[h>>2]=d;if(!(c[g>>2]|0))c[g>>2]=(c[(c[f>>2]|0)+132>>2]|0)/400|0;b=c[f>>2]|0;if((c[(c[f>>2]|0)+152>>2]|0)==-1e3){c[e>>2]=(((c[b+132>>2]|0)*60|0)/(c[g>>2]|0)|0)+(_(c[(c[f>>2]|0)+132>>2]|0,c[(c[f>>2]|0)+100>>2]|0)|0);h=c[e>>2]|0;i=j;return h|0}if((c[b+152>>2]|0)==-1){h=_(c[h>>2]<<3,c[(c[f>>2]|0)+132>>2]|0)|0;c[e>>2]=(h|0)/(c[g>>2]|0)|0;h=c[e>>2]|0;i=j;return h|0}else{c[e>>2]=c[(c[f>>2]|0)+152>>2];h=c[e>>2]|0;i=j;return h|0}return 0}function Hi(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;p=i;i=i+32|0;h=p+20|0;j=p+16|0;k=p+12|0;l=p+8|0;m=p+4|0;o=p+24|0;n=p;c[h>>2]=b;c[j>>2]=e;c[k>>2]=f;c[l>>2]=g;c[m>>2]=0;while(1){if((c[j>>2]|0)>=400)break;c[j>>2]=c[j>>2]<<1;c[m>>2]=(c[m>>2]|0)+1}do if((c[h>>2]|0)!=1e3)if((c[h>>2]|0)==1002){b=(c[k>>2]|0)-1102|0;c[n>>2]=b;c[n>>2]=(c[n>>2]|0)<0?0:b;a[o>>0]=-128;a[o>>0]=d[o>>0]|0|c[n>>2]<<5;a[o>>0]=d[o>>0]|0|c[m>>2]<<3;break}else{a[o>>0]=96;a[o>>0]=d[o>>0]|0|(c[k>>2]|0)-1104<<4;a[o>>0]=d[o>>0]|0|(c[m>>2]|0)-2<<3;break}else{a[o>>0]=(c[k>>2]|0)-1101<<5;a[o>>0]=d[o>>0]|0|(c[m>>2]|0)-2<<3}while(0);a[o>>0]=d[o>>0]|0|((c[l>>2]|0)==2&1)<<2;i=p;return a[o>>0]|0}function Ii(a,b,d,e,f,g,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;q=i;i=i+64|0;j=q+60|0;v=q+56|0;k=q+52|0;l=q+48|0;m=q+44|0;n=q+40|0;u=q+36|0;p=q+24|0;o=q+16|0;s=q+8|0;t=q+4|0;r=q;c[j>>2]=a;c[v>>2]=b;c[k>>2]=d;c[l>>2]=e;c[m>>2]=f;c[n>>2]=g;c[u>>2]=h;c[s>>2]=(((c[v>>2]&65535)<<16>>16)*2471|0)/((c[u>>2]|0)/1e3|0|0)|0;c[t>>2]=268435456-((c[s>>2]|0)*471|0);c[p>>2]=c[t>>2];c[p+4>>2]=0-(c[t>>2]|0)<<1;c[p+8>>2]=c[t>>2];c[r>>2]=c[t>>2]>>6;d=_(c[s>>2]>>16,(c[s>>2]&65535)<<16>>16)|0;d=d+((_(c[s>>2]&65535,(c[s>>2]&65535)<<16>>16)|0)>>16)|0;d=_(c[r>>2]>>16,(d+(_(c[s>>2]|0,(c[s>>2]>>15)+1>>1)|0)-8388608&65535)<<16>>16)|0;f=_(c[s>>2]>>16,(c[s>>2]&65535)<<16>>16)|0;f=f+((_(c[s>>2]&65535,(c[s>>2]&65535)<<16>>16)|0)>>16)|0;f=d+((_(c[r>>2]&65535,(f+(_(c[s>>2]|0,(c[s>>2]>>15)+1>>1)|0)-8388608&65535)<<16>>16)|0)>>16)|0;d=_(c[s>>2]>>16,(c[s>>2]&65535)<<16>>16)|0;d=d+((_(c[s>>2]&65535,(c[s>>2]&65535)<<16>>16)|0)>>16)|0;c[o>>2]=f+(_(c[r>>2]|0,(d+(_(c[s>>2]|0,(c[s>>2]>>15)+1>>1)|0)-8388608>>15)+1>>1)|0);d=_(c[r>>2]>>16,(c[r>>2]&65535)<<16>>16)|0;d=d+((_(c[r>>2]&65535,(c[r>>2]&65535)<<16>>16)|0)>>16)|0;c[o+4>>2]=d+(_(c[r>>2]|0,(c[r>>2]>>15)+1>>1)|0);Ji(c[j>>2]|0,p,o,c[l>>2]|0,c[k>>2]|0,c[m>>2]|0,c[n>>2]|0);if((c[n>>2]|0)!=2){i=q;return}Ji((c[j>>2]|0)+4|0,p,o,(c[l>>2]|0)+8|0,(c[k>>2]|0)+4|0,c[m>>2]|0,c[n>>2]|0);i=q;return}function Ji(a,b,d,e,f,h,j){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;u=i;i=i+64|0;k=u+60|0;v=u+56|0;w=u+52|0;l=u+48|0;m=u+44|0;n=u+40|0;o=u+36|0;s=u+32|0;t=u+28|0;r=u+24|0;p=u+16|0;q=u;c[k>>2]=a;c[v>>2]=b;c[w>>2]=d;c[l>>2]=e;c[m>>2]=f;c[n>>2]=h;c[o>>2]=j;g[p>>2]=+(c[c[w>>2]>>2]|0)*3.725290298461914e-09;g[p+4>>2]=+(c[(c[w>>2]|0)+4>>2]|0)*3.725290298461914e-09;g[q>>2]=+(c[c[v>>2]>>2]|0)*3.725290298461914e-09;g[q+4>>2]=+(c[(c[v>>2]|0)+4>>2]|0)*3.725290298461914e-09;g[q+8>>2]=+(c[(c[v>>2]|0)+8>>2]|0)*3.725290298461914e-09;c[s>>2]=0;while(1){if((c[s>>2]|0)>=(c[n>>2]|0))break;w=_(c[s>>2]|0,c[o>>2]|0)|0;g[r>>2]=+g[(c[k>>2]|0)+(w<<2)>>2];g[t>>2]=+g[c[l>>2]>>2]+ +g[q>>2]*+g[r>>2];g[c[l>>2]>>2]=+g[(c[l>>2]|0)+4>>2]-+g[t>>2]*+g[p>>2]+ +g[q+4>>2]*+g[r>>2];g[(c[l>>2]|0)+4>>2]=-+g[t>>2]*+g[p+4>>2]+ +g[q+8>>2]*+g[r>>2]+1.0000000031710769e-30;w=_(c[s>>2]|0,c[o>>2]|0)|0;g[(c[m>>2]|0)+(w<<2)>>2]=+g[t>>2];c[s>>2]=(c[s>>2]|0)+1}i=u;return}function Ki(a,b,d,e,f,h,j){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;v=i;i=i+64|0;k=v+48|0;x=v+44|0;l=v+40|0;m=v+36|0;n=v+32|0;o=v+28|0;w=v+24|0;p=v+20|0;r=v+16|0;q=v+12|0;t=v+8|0;s=v+4|0;u=v;c[k>>2]=a;c[x>>2]=b;c[l>>2]=d;c[m>>2]=e;c[n>>2]=f;c[o>>2]=h;c[w>>2]=j;g[q>>2]=+(c[x>>2]|0)*4.0/+(c[w>>2]|0);c[p>>2]=0;while(1){if((c[p>>2]|0)>=(c[o>>2]|0))break;c[r>>2]=0;while(1){if((c[r>>2]|0)>=(c[n>>2]|0))break;x=_(c[o>>2]|0,c[r>>2]|0)|0;g[t>>2]=+g[(c[k>>2]|0)+(x+(c[p>>2]|0)<<2)>>2];g[s>>2]=+g[t>>2]-+g[(c[m>>2]|0)+(c[p>>2]<<1<<2)>>2];g[(c[m>>2]|0)+(c[p>>2]<<1<<2)>>2]=+g[(c[m>>2]|0)+(c[p>>2]<<1<<2)>>2]+ +g[q>>2]*(+g[t>>2]-+g[(c[m>>2]|0)+(c[p>>2]<<1<<2)>>2])+1.0000000031710769e-30;g[u>>2]=+g[s>>2]-+g[(c[m>>2]|0)+((c[p>>2]<<1)+1<<2)>>2];g[(c[m>>2]|0)+((c[p>>2]<<1)+1<<2)>>2]=+g[(c[m>>2]|0)+((c[p>>2]<<1)+1<<2)>>2]+ +g[q>>2]*(+g[s>>2]-+g[(c[m>>2]|0)+((c[p>>2]<<1)+1<<2)>>2])+1.0000000031710769e-30;x=_(c[o>>2]|0,c[r>>2]|0)|0;g[(c[l>>2]|0)+(x+(c[p>>2]|0)<<2)>>2]=+g[u>>2];c[r>>2]=(c[r>>2]|0)+1}c[p>>2]=(c[p>>2]|0)+1}i=v;return}function Li(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0,h=0,j=0,k=0,l=0,m=0;m=i;i=i+32|0;f=m+16|0;h=m+12|0;j=m+8|0;k=m+4|0;l=m;c[f>>2]=a;c[h>>2]=b;c[j>>2]=d;g[l>>2]=0.0;c[k>>2]=0;while(1){e=+g[l>>2];if((c[k>>2]|0)>=(c[j>>2]|0))break;g[l>>2]=e+ +g[(c[f>>2]|0)+(c[k>>2]<<2)>>2]*+g[(c[h>>2]|0)+(c[k>>2]<<2)>>2];c[k>>2]=(c[k>>2]|0)+1}i=m;return +e}function Mi(a,b,d,e,f,h,j,k,l){a=a|0;b=b|0;d=+d;e=+e;f=f|0;h=h|0;j=j|0;k=k|0;l=l|0;var m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;B=i;i=i+80|0;m=B+64|0;n=B+60|0;o=B+56|0;p=B+52|0;C=B+48|0;q=B+44|0;r=B+40|0;s=B+36|0;D=B+32|0;w=B+28|0;x=B+24|0;y=B+20|0;t=B+16|0;u=B+12|0;z=B+8|0;v=B+4|0;A=B;c[m>>2]=a;c[n>>2]=b;g[o>>2]=d;g[p>>2]=e;c[C>>2]=f;c[q>>2]=h;c[r>>2]=j;c[s>>2]=k;c[D>>2]=l;c[x>>2]=48e3/(c[D>>2]|0)|0;c[y>>2]=(c[C>>2]|0)/(c[x>>2]|0)|0;k=(c[r>>2]|0)==1;c[w>>2]=0;a:do if(k)while(1){if((c[w>>2]|0)>=(c[y>>2]|0))break a;C=_(c[w>>2]|0,c[x>>2]|0)|0;D=_(c[w>>2]|0,c[x>>2]|0)|0;g[z>>2]=+g[(c[s>>2]|0)+(C<<2)>>2]*+g[(c[s>>2]|0)+(D<<2)>>2];g[u>>2]=+g[z>>2]*+g[p>>2]+(1.0-+g[z>>2])*+g[o>>2];g[(c[n>>2]|0)+(c[w>>2]<<2)>>2]=+g[u>>2]*+g[(c[m>>2]|0)+(c[w>>2]<<2)>>2];c[w>>2]=(c[w>>2]|0)+1}else while(1){if((c[w>>2]|0)>=(c[y>>2]|0))break a;C=_(c[w>>2]|0,c[x>>2]|0)|0;D=_(c[w>>2]|0,c[x>>2]|0)|0;g[A>>2]=+g[(c[s>>2]|0)+(C<<2)>>2]*+g[(c[s>>2]|0)+(D<<2)>>2];g[v>>2]=+g[A>>2]*+g[p>>2]+(1.0-+g[A>>2])*+g[o>>2];g[(c[n>>2]|0)+(c[w>>2]<<1<<2)>>2]=+g[v>>2]*+g[(c[m>>2]|0)+(c[w>>2]<<1<<2)>>2];g[(c[n>>2]|0)+((c[w>>2]<<1)+1<<2)>>2]=+g[v>>2]*+g[(c[m>>2]|0)+((c[w>>2]<<1)+1<<2)>>2];c[w>>2]=(c[w>>2]|0)+1}while(0);c[t>>2]=0;do{c[w>>2]=c[y>>2];while(1){if((c[w>>2]|0)>=(c[q>>2]|0))break;C=_(c[w>>2]|0,c[r>>2]|0)|0;D=_(c[w>>2]|0,c[r>>2]|0)|0;g[(c[n>>2]|0)+(D+(c[t>>2]|0)<<2)>>2]=+g[p>>2]*+g[(c[m>>2]|0)+(C+(c[t>>2]|0)<<2)>>2];c[w>>2]=(c[w>>2]|0)+1}D=(c[t>>2]|0)+1|0;c[t>>2]=D}while((D|0)<(c[r>>2]|0));i=B;return}function Ni(a){a=+a;var b=0,c=0;c=i;i=i+16|0;b=c;g[b>>2]=a;g[b>>2]=+g[b>>2]*32768.0;g[b>>2]=+g[b>>2]>-32768.0?+g[b>>2]:-32768.0;g[b>>2]=+g[b>>2]<32767.0?+g[b>>2]:32767.0;b=(ij(+g[b>>2])|0)&65535;i=c;return b|0}function Oi(a){a=a|0;var b=0,d=0;b=i;i=i+16|0;d=b;c[d>>2]=a;a=(c[(c[d>>2]|0)+20>>2]|0)-(32-(aa(c[(c[d>>2]|0)+28>>2]|0)|0))|0;i=b;return a|0}function Pi(a,b,d,e,f,h,j,k,l){a=a|0;b=b|0;d=+d;e=+e;f=f|0;h=h|0;j=j|0;k=k|0;l=l|0;var m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;A=i;i=i+64|0;m=A+60|0;n=A+56|0;o=A+52|0;p=A+48|0;B=A+44|0;q=A+40|0;r=A+36|0;s=A+32|0;C=A+28|0;w=A+24|0;y=A+20|0;x=A+16|0;t=A+12|0;v=A+8|0;z=A+4|0;u=A;c[m>>2]=a;c[n>>2]=b;g[o>>2]=d;g[p>>2]=e;c[B>>2]=f;c[q>>2]=h;c[r>>2]=j;c[s>>2]=k;c[C>>2]=l;c[x>>2]=48e3/(c[C>>2]|0)|0;c[y>>2]=(c[B>>2]|0)/(c[x>>2]|0)|0;g[o>>2]=1.0-+g[o>>2];g[p>>2]=1.0-+g[p>>2];c[w>>2]=0;while(1){if((c[w>>2]|0)>=(c[y>>2]|0))break;C=_(c[w>>2]|0,c[x>>2]|0)|0;B=_(c[w>>2]|0,c[x>>2]|0)|0;g[z>>2]=+g[(c[s>>2]|0)+(C<<2)>>2]*+g[(c[s>>2]|0)+(B<<2)>>2];g[v>>2]=+g[z>>2]*+g[p>>2]+(1.0-+g[z>>2])*+g[o>>2];B=_(c[w>>2]|0,c[r>>2]|0)|0;C=(_(c[w>>2]|0,c[r>>2]|0)|0)+1|0;g[t>>2]=(+g[(c[m>>2]|0)+(B<<2)>>2]-+g[(c[m>>2]|0)+(C<<2)>>2])*.5;g[t>>2]=+g[v>>2]*+g[t>>2];C=_(c[w>>2]|0,c[r>>2]|0)|0;B=_(c[w>>2]|0,c[r>>2]|0)|0;g[(c[n>>2]|0)+(B<<2)>>2]=+g[(c[n>>2]|0)+(C<<2)>>2]-+g[t>>2];B=(_(c[w>>2]|0,c[r>>2]|0)|0)+1|0;C=(_(c[w>>2]|0,c[r>>2]|0)|0)+1|0;g[(c[n>>2]|0)+(C<<2)>>2]=+g[(c[n>>2]|0)+(B<<2)>>2]+ +g[t>>2];c[w>>2]=(c[w>>2]|0)+1}while(1){if((c[w>>2]|0)>=(c[q>>2]|0))break;B=_(c[w>>2]|0,c[r>>2]|0)|0;C=(_(c[w>>2]|0,c[r>>2]|0)|0)+1|0;g[u>>2]=(+g[(c[m>>2]|0)+(B<<2)>>2]-+g[(c[m>>2]|0)+(C<<2)>>2])*.5;g[u>>2]=+g[p>>2]*+g[u>>2];C=_(c[w>>2]|0,c[r>>2]|0)|0;B=_(c[w>>2]|0,c[r>>2]|0)|0;g[(c[n>>2]|0)+(B<<2)>>2]=+g[(c[n>>2]|0)+(C<<2)>>2]-+g[u>>2];B=(_(c[w>>2]|0,c[r>>2]|0)|0)+1|0;C=(_(c[w>>2]|0,c[r>>2]|0)|0)+1|0;g[(c[n>>2]|0)+(C<<2)>>2]=+g[(c[n>>2]|0)+(B<<2)>>2]+ +g[u>>2];c[w>>2]=(c[w>>2]|0)+1}i=A;return}function Qi(a,d,e,f,h){a=a|0;d=d|0;e=e|0;f=f|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;t=i;i=i+48|0;k=t+36|0;l=t+32|0;m=t+28|0;n=t+24|0;o=t+20|0;r=t+16|0;s=t+12|0;q=t+8|0;j=t+4|0;p=t;c[k>>2]=a;c[l>>2]=d;c[m>>2]=e;c[n>>2]=f;c[o>>2]=h;if((c[(c[k>>2]|0)+96>>2]|0)==2051)c[j>>2]=0;else c[j>>2]=c[(c[k>>2]|0)+104>>2];c[q>>2]=Ai(c[l>>2]|0,c[m>>2]|0,c[(c[k>>2]|0)+144>>2]|0,c[(c[k>>2]|0)+100>>2]|0,c[(c[k>>2]|0)+132>>2]|0,c[(c[k>>2]|0)+148>>2]|0,c[j>>2]|0,1,(c[k>>2]|0)+172+6872|0)|0;a=_(c[q>>2]|0,c[(c[k>>2]|0)+100>>2]|0)|0;c[p>>2]=ia()|0;e=i;i=i+((1*(a<<2)|0)+15&-16)|0;c[r>>2]=0;while(1){if((c[r>>2]|0)>=(_(c[q>>2]|0,c[(c[k>>2]|0)+100>>2]|0)|0))break;g[e+(c[r>>2]<<2)>>2]=+(b[(c[l>>2]|0)+(c[r>>2]<<1)>>1]|0)*.000030517578125;c[r>>2]=(c[r>>2]|0)+1}c[s>>2]=Fi(c[k>>2]|0,e,c[q>>2]|0,c[n>>2]|0,c[o>>2]|0,16,c[l>>2]|0,c[m>>2]|0,0,-2,c[(c[k>>2]|0)+100>>2]|0,1,0)|0;s=c[s>>2]|0;na(c[p>>2]|0);i=t;return s|0}function Ri(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;o=i;i=i+32|0;g=o+24|0;h=o+20|0;j=o+16|0;k=o+12|0;l=o+8|0;n=o+4|0;m=o;c[g>>2]=a;c[h>>2]=b;c[j>>2]=d;c[k>>2]=e;c[l>>2]=f;if((c[(c[g>>2]|0)+96>>2]|0)==2051)c[m>>2]=0;else c[m>>2]=c[(c[g>>2]|0)+104>>2];c[n>>2]=Ai(c[h>>2]|0,c[j>>2]|0,c[(c[g>>2]|0)+144>>2]|0,c[(c[g>>2]|0)+100>>2]|0,c[(c[g>>2]|0)+132>>2]|0,c[(c[g>>2]|0)+148>>2]|0,c[m>>2]|0,2,(c[g>>2]|0)+172+6872|0)|0;a=Fi(c[g>>2]|0,c[h>>2]|0,c[n>>2]|0,c[k>>2]|0,c[l>>2]|0,24,c[h>>2]|0,c[j>>2]|0,0,-2,c[(c[g>>2]|0)+100>>2]|0,2,1)|0;i=o;return a|0}function Si(a,d,e){a=a|0;d=d|0;e=e|0;var f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0;ha=i;i=i+352|0;ca=ha+48|0;ba=ha+40|0;aa=ha+32|0;$=ha+24|0;_=ha+16|0;Z=ha+8|0;Y=ha;fa=ha+336|0;ea=ha+332|0;ia=ha+328|0;ga=ha+324|0;h=ha+320|0;f=ha+304|0;m=ha+300|0;n=ha+296|0;y=ha+292|0;J=ha+288|0;da=ha+284|0;T=ha+280|0;U=ha+276|0;V=ha+272|0;W=ha+268|0;X=ha+264|0;o=ha+260|0;p=ha+256|0;q=ha+252|0;r=ha+248|0;s=ha+244|0;t=ha+240|0;u=ha+236|0;v=ha+232|0;w=ha+228|0;x=ha+224|0;z=ha+220|0;A=ha+216|0;B=ha+212|0;C=ha+208|0;D=ha+204|0;E=ha+200|0;F=ha+196|0;G=ha+192|0;H=ha+188|0;I=ha+184|0;K=ha+180|0;L=ha+176|0;M=ha+172|0;N=ha+168|0;O=ha+164|0;k=ha+160|0;j=ha+72|0;l=ha+68|0;P=ha+64|0;Q=ha+60|0;R=ha+56|0;S=ha+52|0;c[ea>>2]=a;c[ia>>2]=d;c[ga>>2]=0;c[f>>2]=e;c[h>>2]=(c[ea>>2]|0)+(c[c[ea>>2]>>2]|0);a:do switch(c[ia>>2]|0){case 4e3:{da=(c[f>>2]|0)+(4-1)&~(4-1);ia=c[da>>2]|0;c[f>>2]=da+4;c[m>>2]=ia;do if(!((c[m>>2]|0)!=2048&(c[m>>2]|0)!=2049&(c[m>>2]|0)!=2051)){if((c[(c[ea>>2]|0)+14344>>2]|0)==0?(c[(c[ea>>2]|0)+96>>2]|0)!=(c[m>>2]|0):0)break;c[(c[ea>>2]|0)+96>>2]=c[m>>2];f=99;break a}while(0);c[ga>>2]=-1;f=99;break}case 4001:{da=(c[f>>2]|0)+(4-1)&~(4-1);ia=c[da>>2]|0;c[f>>2]=da+4;c[n>>2]=ia;if(c[n>>2]|0){c[c[n>>2]>>2]=c[(c[ea>>2]|0)+96>>2];f=99}else f=100;break}case 4002:{da=(c[f>>2]|0)+(4-1)&~(4-1);ia=c[da>>2]|0;c[f>>2]=da+4;c[y>>2]=ia;do if((c[y>>2]|0)!=-1e3&(c[y>>2]|0)!=-1){if((c[y>>2]|0)<=0){f=100;break a}if((c[y>>2]|0)<=500){c[y>>2]=500;break}if((c[y>>2]|0)>((c[(c[ea>>2]|0)+100>>2]|0)*3e5|0))c[y>>2]=(c[(c[ea>>2]|0)+100>>2]|0)*3e5}while(0);c[(c[ea>>2]|0)+152>>2]=c[y>>2];f=99;break}case 4003:{da=(c[f>>2]|0)+(4-1)&~(4-1);ia=c[da>>2]|0;c[f>>2]=da+4;c[J>>2]=ia;if(c[J>>2]|0){f=Gi(c[ea>>2]|0,c[(c[ea>>2]|0)+14332>>2]|0,1276)|0;c[c[J>>2]>>2]=f;f=99}else f=100;break}case 4022:{e=(c[f>>2]|0)+(4-1)&~(4-1);ia=c[e>>2]|0;c[f>>2]=e+4;c[da>>2]=ia;f=c[da>>2]|0;if((c[da>>2]|0)<1){if((f|0)!=-1e3){f=100;break a}}else if((c[da>>2]|0)!=-1e3?(f|0)>(c[(c[ea>>2]|0)+100>>2]|0):0){f=100;break a}c[(c[ea>>2]|0)+108>>2]=c[da>>2];f=99;break}case 4023:{da=(c[f>>2]|0)+(4-1)&~(4-1);ia=c[da>>2]|0;c[f>>2]=da+4;c[T>>2]=ia;if(c[T>>2]|0){c[c[T>>2]>>2]=c[(c[ea>>2]|0)+108>>2];f=99}else f=100;break}case 4004:{da=(c[f>>2]|0)+(4-1)&~(4-1);ia=c[da>>2]|0;c[f>>2]=da+4;c[U>>2]=ia;if(!((c[U>>2]|0)<1101|(c[U>>2]|0)>1105)){c[(c[ea>>2]|0)+120>>2]=c[U>>2];h=c[ea>>2]|0;if((c[(c[ea>>2]|0)+120>>2]|0)==1101){c[h+8+12>>2]=8e3;f=99;break a}f=(c[ea>>2]|0)+8+12|0;if((c[h+120>>2]|0)==1102){c[f>>2]=12e3;f=99;break a}else{c[f>>2]=16e3;f=99;break a}}else f=100;break}case 4005:{da=(c[f>>2]|0)+(4-1)&~(4-1);ia=c[da>>2]|0;c[f>>2]=da+4;c[V>>2]=ia;if(c[V>>2]|0){c[c[V>>2]>>2]=c[(c[ea>>2]|0)+120>>2];f=99}else f=100;break}case 4008:{da=(c[f>>2]|0)+(4-1)&~(4-1);ia=c[da>>2]|0;c[f>>2]=da+4;c[W>>2]=ia;if(!(((c[W>>2]|0)<1101|(c[W>>2]|0)>1105)&(c[W>>2]|0)!=-1e3)){c[(c[ea>>2]|0)+116>>2]=c[W>>2];h=c[ea>>2]|0;if((c[(c[ea>>2]|0)+116>>2]|0)==1101){c[h+8+12>>2]=8e3;f=99;break a}f=(c[ea>>2]|0)+8+12|0;if((c[h+116>>2]|0)==1102){c[f>>2]=12e3;f=99;break a}else{c[f>>2]=16e3;f=99;break a}}else f=100;break}case 4009:{da=(c[f>>2]|0)+(4-1)&~(4-1);ia=c[da>>2]|0;c[f>>2]=da+4;c[X>>2]=ia;if(c[X>>2]|0){c[c[X>>2]>>2]=c[(c[ea>>2]|0)+14336>>2];f=99}else f=100;break}case 4016:{da=(c[f>>2]|0)+(4-1)&~(4-1);ia=c[da>>2]|0;c[f>>2]=da+4;c[o>>2]=ia;if((c[o>>2]|0)<0|(c[o>>2]|0)>1)f=100;else{c[(c[ea>>2]|0)+8+44>>2]=c[o>>2];f=99}break}case 4017:{da=(c[f>>2]|0)+(4-1)&~(4-1);ia=c[da>>2]|0;c[f>>2]=da+4;c[p>>2]=ia;if(c[p>>2]|0){c[c[p>>2]>>2]=c[(c[ea>>2]|0)+8+44>>2];f=99}else f=100;break}case 4010:{da=(c[f>>2]|0)+(4-1)&~(4-1);ia=c[da>>2]|0;c[f>>2]=da+4;c[q>>2]=ia;if((c[q>>2]|0)<0|(c[q>>2]|0)>10)f=100;else{c[(c[ea>>2]|0)+8+36>>2]=c[q>>2];f=c[h>>2]|0;c[Y>>2]=c[q>>2];lb(f,4010,Y)|0;f=99}break}case 4011:{da=(c[f>>2]|0)+(4-1)&~(4-1);ia=c[da>>2]|0;c[f>>2]=da+4;c[r>>2]=ia;if(c[r>>2]|0){c[c[r>>2]>>2]=c[(c[ea>>2]|0)+8+36>>2];f=99}else f=100;break}case 4012:{da=(c[f>>2]|0)+(4-1)&~(4-1);ia=c[da>>2]|0;c[f>>2]=da+4;c[s>>2]=ia;if((c[s>>2]|0)<0|(c[s>>2]|0)>1)f=100;else{c[(c[ea>>2]|0)+8+40>>2]=c[s>>2];f=99}break}case 4013:{da=(c[f>>2]|0)+(4-1)&~(4-1);ia=c[da>>2]|0;c[f>>2]=da+4;c[t>>2]=ia;if(c[t>>2]|0){c[c[t>>2]>>2]=c[(c[ea>>2]|0)+8+40>>2];f=99}else f=100;break}case 4014:{da=(c[f>>2]|0)+(4-1)&~(4-1);ia=c[da>>2]|0;c[f>>2]=da+4;c[u>>2]=ia;if((c[u>>2]|0)<0|(c[u>>2]|0)>100)f=100;else{c[(c[ea>>2]|0)+8+32>>2]=c[u>>2];f=c[h>>2]|0;c[Z>>2]=c[u>>2];lb(f,4014,Z)|0;f=99}break}case 4015:{da=(c[f>>2]|0)+(4-1)&~(4-1);ia=c[da>>2]|0;c[f>>2]=da+4;c[v>>2]=ia;if(c[v>>2]|0){c[c[v>>2]>>2]=c[(c[ea>>2]|0)+8+32>>2];f=99}else f=100;break}case 4006:{da=(c[f>>2]|0)+(4-1)&~(4-1);ia=c[da>>2]|0;c[f>>2]=da+4;c[w>>2]=ia;if((c[w>>2]|0)<0|(c[w>>2]|0)>1)f=100;else{c[(c[ea>>2]|0)+136>>2]=c[w>>2];c[(c[ea>>2]|0)+8+48>>2]=1-(c[w>>2]|0);f=99}break}case 4007:{da=(c[f>>2]|0)+(4-1)&~(4-1);ia=c[da>>2]|0;c[f>>2]=da+4;c[x>>2]=ia;if(c[x>>2]|0){c[c[x>>2]>>2]=c[(c[ea>>2]|0)+136>>2];f=99}else f=100;break}case 11018:{da=(c[f>>2]|0)+(4-1)&~(4-1);ia=c[da>>2]|0;c[f>>2]=da+4;c[z>>2]=ia;if((c[z>>2]|0)<-1|(c[z>>2]|0)>100)f=100;else{c[(c[ea>>2]|0)+128>>2]=c[z>>2];f=99}break}case 11019:{da=(c[f>>2]|0)+(4-1)&~(4-1);ia=c[da>>2]|0;c[f>>2]=da+4;c[A>>2]=ia;if(c[A>>2]|0){c[c[A>>2]>>2]=c[(c[ea>>2]|0)+128>>2];f=99}else f=100;break}case 4020:{da=(c[f>>2]|0)+(4-1)&~(4-1);ia=c[da>>2]|0;c[f>>2]=da+4;c[B>>2]=ia;if((c[B>>2]|0)<0|(c[B>>2]|0)>1)f=100;else{c[(c[ea>>2]|0)+140>>2]=c[B>>2];f=99}break}case 4021:{da=(c[f>>2]|0)+(4-1)&~(4-1);ia=c[da>>2]|0;c[f>>2]=da+4;c[C>>2]=ia;if(c[C>>2]|0){c[c[C>>2]>>2]=c[(c[ea>>2]|0)+140>>2];f=99}else f=100;break}case 4024:{da=(c[f>>2]|0)+(4-1)&~(4-1);ia=c[da>>2]|0;c[f>>2]=da+4;c[D>>2]=ia;if((c[D>>2]|0)!=-1e3&(c[D>>2]|0)!=3001&(c[D>>2]|0)!=3002)f=100;else{c[(c[ea>>2]|0)+112>>2]=c[D>>2];f=99}break}case 4025:{da=(c[f>>2]|0)+(4-1)&~(4-1);ia=c[da>>2]|0;c[f>>2]=da+4;c[E>>2]=ia;if(c[E>>2]|0){c[c[E>>2]>>2]=c[(c[ea>>2]|0)+112>>2];f=99}else f=100;break}case 4027:{da=(c[f>>2]|0)+(4-1)&~(4-1);ia=c[da>>2]|0;c[f>>2]=da+4;c[F>>2]=ia;if(c[F>>2]|0){c[c[F>>2]>>2]=(c[(c[ea>>2]|0)+132>>2]|0)/400|0;if((c[(c[ea>>2]|0)+96>>2]|0)!=2051){f=c[F>>2]|0;c[f>>2]=(c[f>>2]|0)+(c[(c[ea>>2]|0)+104>>2]|0);f=99}else f=99}else f=100;break}case 4029:{da=(c[f>>2]|0)+(4-1)&~(4-1);ia=c[da>>2]|0;c[f>>2]=da+4;c[G>>2]=ia;if(c[G>>2]|0){c[c[G>>2]>>2]=c[(c[ea>>2]|0)+132>>2];f=99}else f=100;break}case 4031:{da=(c[f>>2]|0)+(4-1)&~(4-1);ia=c[da>>2]|0;c[f>>2]=da+4;c[H>>2]=ia;if(c[H>>2]|0){c[c[H>>2]>>2]=c[(c[ea>>2]|0)+18216>>2];f=99}else f=100;break}case 4036:{da=(c[f>>2]|0)+(4-1)&~(4-1);ia=c[da>>2]|0;c[f>>2]=da+4;c[I>>2]=ia;if((c[I>>2]|0)<8|(c[I>>2]|0)>24)f=100;else{c[(c[ea>>2]|0)+156>>2]=c[I>>2];f=99}break}case 4037:{da=(c[f>>2]|0)+(4-1)&~(4-1);ia=c[da>>2]|0;c[f>>2]=da+4;c[K>>2]=ia;if(c[K>>2]|0){c[c[K>>2]>>2]=c[(c[ea>>2]|0)+156>>2];f=99}else f=100;break}case 4040:{da=(c[f>>2]|0)+(4-1)&~(4-1);ia=c[da>>2]|0;c[f>>2]=da+4;c[L>>2]=ia;if((c[L>>2]|0)!=5e3&(c[L>>2]|0)!=5001&(c[L>>2]|0)!=5002&(c[L>>2]|0)!=5003&(c[L>>2]|0)!=5004&(c[L>>2]|0)!=5005&(c[L>>2]|0)!=5006&(c[L>>2]|0)!=5010)f=100;else{c[(c[ea>>2]|0)+144>>2]=c[L>>2];f=c[h>>2]|0;c[_>>2]=c[L>>2];lb(f,4040,_)|0;f=99}break}case 4041:{da=(c[f>>2]|0)+(4-1)&~(4-1);ia=c[da>>2]|0;c[f>>2]=da+4;c[M>>2]=ia;if(c[M>>2]|0){c[c[M>>2]>>2]=c[(c[ea>>2]|0)+144>>2];f=99}else f=100;break}case 4042:{da=(c[f>>2]|0)+(4-1)&~(4-1);ia=c[da>>2]|0;c[f>>2]=da+4;c[N>>2]=ia;if((c[N>>2]|0)>1|(c[N>>2]|0)<0)f=100;else{c[(c[ea>>2]|0)+8+64>>2]=c[N>>2];f=99}break}case 4043:{da=(c[f>>2]|0)+(4-1)&~(4-1);ia=c[da>>2]|0;c[f>>2]=da+4;c[O>>2]=ia;if(c[O>>2]|0){c[c[O>>2]>>2]=c[(c[ea>>2]|0)+8+64>>2];f=99}else f=100;break}case 4028:{c[k>>2]=(c[ea>>2]|0)+(c[(c[ea>>2]|0)+4>>2]|0);_i((c[ea>>2]|0)+172|0);c[l>>2]=(c[ea>>2]|0)+14288;oj(c[l>>2]|0,0,18220-((c[l>>2]|0)-(c[ea>>2]|0))|0)|0;lb(c[h>>2]|0,4028,$)|0;Td(c[k>>2]|0,c[(c[ea>>2]|0)+168>>2]|0,j)|0;c[(c[ea>>2]|0)+14288>>2]=c[(c[ea>>2]|0)+100>>2];b[(c[ea>>2]|0)+14292>>1]=16384;g[(c[ea>>2]|0)+14300>>2]=1.0;c[(c[ea>>2]|0)+14344>>2]=1;c[(c[ea>>2]|0)+14320>>2]=1001;c[(c[ea>>2]|0)+14336>>2]=1105;f=(Sf(60)|0)<<8;c[(c[ea>>2]|0)+14296>>2]=f;f=99;break}case 11002:{da=(c[f>>2]|0)+(4-1)&~(4-1);ia=c[da>>2]|0;c[f>>2]=da+4;c[P>>2]=ia;if(((c[P>>2]|0)<1e3|(c[P>>2]|0)>1002)&(c[P>>2]|0)!=-1e3)f=100;else{c[(c[ea>>2]|0)+124>>2]=c[P>>2];f=99}break}case 10024:{da=(c[f>>2]|0)+(4-1)&~(4-1);ia=c[da>>2]|0;c[f>>2]=da+4;c[Q>>2]=ia;c[(c[ea>>2]|0)+164>>2]=c[Q>>2];f=c[h>>2]|0;c[aa>>2]=c[Q>>2];c[ga>>2]=lb(f,10024,aa)|0;f=99;break}case 10026:{da=(c[f>>2]|0)+(4-1)&~(4-1);ia=c[da>>2]|0;c[f>>2]=da+4;c[R>>2]=ia;c[(c[ea>>2]|0)+14348>>2]=c[R>>2];f=c[h>>2]|0;c[ba>>2]=(c[R>>2]|0)+((((c[R>>2]|0)-(c[R>>2]|0)|0)/4|0)<<2);c[ga>>2]=lb(f,10026,ba)|0;f=99;break}case 10015:{ea=(c[f>>2]|0)+(4-1)&~(4-1);ia=c[ea>>2]|0;c[f>>2]=ea+4;c[S>>2]=ia;if(c[S>>2]|0){f=c[h>>2]|0;c[ca>>2]=(c[S>>2]|0)+((((c[S>>2]|0)-(c[S>>2]|0)|0)/4|0)<<2);c[ga>>2]=lb(f,10015,ca)|0;f=99}else f=100;break}default:{c[ga>>2]=-5;f=99}}while(0);if((f|0)==99){c[fa>>2]=c[ga>>2];ia=c[fa>>2]|0;i=ha;return ia|0}else if((f|0)==100){c[fa>>2]=-1;ia=c[fa>>2]|0;i=ha;return ia|0}return 0}function Ti(a){a=a|0;var b=0,d=0;d=i;i=i+16|0;b=d;c[b>>2]=a;c[(c[b>>2]|0)+4>>2]=0;i=d;return c[b>>2]|0}function Ui(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=i;i=i+16|0;h=e+8|0;g=e+4|0;f=e;c[h>>2]=a;c[g>>2]=b;c[f>>2]=d;a=Vi(c[h>>2]|0,c[g>>2]|0,c[f>>2]|0,0)|0;i=e;return a|0}function Vi(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;q=i;i=i+32|0;h=q+24|0;j=q+20|0;k=q+16|0;l=q+12|0;m=q+8|0;p=q+28|0;n=q+4|0;o=q;c[j>>2]=b;c[k>>2]=e;c[l>>2]=f;c[m>>2]=g;if((c[l>>2]|0)<1){c[h>>2]=-4;p=c[h>>2]|0;i=q;return p|0}if(c[(c[j>>2]|0)+4>>2]|0){if(((d[c[j>>2]>>0]|0)&252|0)!=((d[c[k>>2]>>0]|0)&252|0)){c[h>>2]=-4;p=c[h>>2]|0;i=q;return p|0}}else{a[c[j>>2]>>0]=a[c[k>>2]>>0]|0;g=Zh(c[k>>2]|0,8e3)|0;c[(c[j>>2]|0)+296>>2]=g}c[n>>2]=pi(c[k>>2]|0,c[l>>2]|0)|0;if((c[n>>2]|0)<1){c[h>>2]=-4;p=c[h>>2]|0;i=q;return p|0}if((_((c[n>>2]|0)+(c[(c[j>>2]|0)+4>>2]|0)|0,c[(c[j>>2]|0)+296>>2]|0)|0)>960){c[h>>2]=-4;p=c[h>>2]|0;i=q;return p|0}c[o>>2]=_h(c[k>>2]|0,c[l>>2]|0,c[m>>2]|0,p,(c[j>>2]|0)+8+(c[(c[j>>2]|0)+4>>2]<<2)|0,(c[j>>2]|0)+200+(c[(c[j>>2]|0)+4>>2]<<1)|0,0,0)|0;if((c[o>>2]|0)<1){c[h>>2]=c[o>>2];p=c[h>>2]|0;i=q;return p|0}else{p=(c[j>>2]|0)+4|0;c[p>>2]=(c[p>>2]|0)+(c[n>>2]|0);c[h>>2]=0;p=c[h>>2]|0;i=q;return p|0}return 0}function Wi(e,f,g,h,j,k,l){e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|0;var m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;F=i;i=i+80|0;q=F+68|0;o=F+64|0;m=F+60|0;n=F+56|0;r=F+52|0;s=F+48|0;t=F+44|0;u=F+40|0;x=F+36|0;v=F+32|0;D=F+28|0;y=F+24|0;w=F+20|0;B=F+16|0;E=F+12|0;A=F+8|0;z=F+4|0;C=F;c[o>>2]=e;c[m>>2]=f;c[n>>2]=g;c[r>>2]=h;c[s>>2]=j;c[t>>2]=k;c[u>>2]=l;if(((c[m>>2]|0)>=0?(c[m>>2]|0)<(c[n>>2]|0):0)?(c[n>>2]|0)<=(c[(c[o>>2]|0)+4>>2]|0):0){c[v>>2]=(c[n>>2]|0)-(c[m>>2]|0);c[y>>2]=(c[o>>2]|0)+200+(c[m>>2]<<1);c[w>>2]=(c[o>>2]|0)+8+(c[m>>2]<<2);if(c[t>>2]|0)c[D>>2]=1+((b[(c[y>>2]|0)+((c[v>>2]|0)-1<<1)>>1]|0)>=252&1);else c[D>>2]=0;c[B>>2]=c[r>>2];do if((c[v>>2]|0)!=1){if((c[v>>2]|0)==2){m=b[c[y>>2]>>1]|0;if((b[(c[y>>2]|0)+2>>1]|0)==(b[c[y>>2]>>1]|0)){c[D>>2]=(c[D>>2]|0)+((m<<1)+1);if((c[D>>2]|0)<=(c[s>>2]|0)){e=(d[c[o>>2]>>0]&252|1)&255;k=c[B>>2]|0;c[B>>2]=k+1;a[k>>0]=e;break}c[q>>2]=-2;E=c[q>>2]|0;i=F;return E|0}else{c[D>>2]=(c[D>>2]|0)+(m+(b[(c[y>>2]|0)+2>>1]|0)+2+((b[c[y>>2]>>1]|0)>=252&1));if((c[D>>2]|0)<=(c[s>>2]|0)){e=(d[c[o>>2]>>0]&252|2)&255;k=c[B>>2]|0;c[B>>2]=k+1;a[k>>0]=e;k=Yh(b[c[y>>2]>>1]|0,c[B>>2]|0)|0;c[B>>2]=(c[B>>2]|0)+k;break}c[q>>2]=-2;E=c[q>>2]|0;i=F;return E|0}}}else{c[D>>2]=(c[D>>2]|0)+((b[c[y>>2]>>1]|0)+1);if((c[D>>2]|0)<=(c[s>>2]|0)){e=d[c[o>>2]>>0]&252;k=c[B>>2]|0;c[B>>2]=k+1;a[k>>0]=e;break}c[q>>2]=-2;E=c[q>>2]|0;i=F;return E|0}while(0);if((c[v>>2]|0)<=2){if(c[u>>2]|0?(c[D>>2]|0)<(c[s>>2]|0):0)p=23}else p=23;a:do if((p|0)==23){c[A>>2]=0;c[B>>2]=c[r>>2];if(c[t>>2]|0)c[D>>2]=1+((b[(c[y>>2]|0)+((c[v>>2]|0)-1<<1)>>1]|0)>=252&1);else c[D>>2]=0;c[E>>2]=0;c[x>>2]=1;while(1){if((c[x>>2]|0)>=(c[v>>2]|0))break;if((b[(c[y>>2]|0)+(c[x>>2]<<1)>>1]|0)!=(b[c[y>>2]>>1]|0)){p=29;break}c[x>>2]=(c[x>>2]|0)+1}if((p|0)==29)c[E>>2]=1;do if(c[E>>2]|0){c[D>>2]=(c[D>>2]|0)+2;c[x>>2]=0;while(1){if((c[x>>2]|0)>=((c[v>>2]|0)-1|0))break;c[D>>2]=(c[D>>2]|0)+(1+((b[(c[y>>2]|0)+(c[x>>2]<<1)>>1]|0)>=252&1)+(b[(c[y>>2]|0)+(c[x>>2]<<1)>>1]|0));c[x>>2]=(c[x>>2]|0)+1}c[D>>2]=(c[D>>2]|0)+(b[(c[y>>2]|0)+((c[v>>2]|0)-1<<1)>>1]|0);if((c[D>>2]|0)<=(c[s>>2]|0)){p=(d[c[o>>2]>>0]&252|3)&255;o=c[B>>2]|0;c[B>>2]=o+1;a[o>>0]=p;o=(c[v>>2]|128)&255;p=c[B>>2]|0;c[B>>2]=p+1;a[p>>0]=o;break}c[q>>2]=-2;E=c[q>>2]|0;i=F;return E|0}else{p=(_(c[v>>2]|0,b[c[y>>2]>>1]|0)|0)+2|0;c[D>>2]=(c[D>>2]|0)+p;if((c[D>>2]|0)<=(c[s>>2]|0)){p=(d[c[o>>2]>>0]&252|3)&255;o=c[B>>2]|0;c[B>>2]=o+1;a[o>>0]=p;o=c[v>>2]&255;p=c[B>>2]|0;c[B>>2]=p+1;a[p>>0]=o;break}c[q>>2]=-2;E=c[q>>2]|0;i=F;return E|0}while(0);if(c[u>>2]|0)m=(c[s>>2]|0)-(c[D>>2]|0)|0;else m=0;c[A>>2]=m;if(c[A>>2]|0){p=(c[r>>2]|0)+1|0;a[p>>0]=d[p>>0]|64;c[z>>2]=((c[A>>2]|0)-1|0)/255|0;c[x>>2]=0;while(1){if((c[x>>2]|0)>=(c[z>>2]|0))break;p=c[B>>2]|0;c[B>>2]=p+1;a[p>>0]=-1;c[x>>2]=(c[x>>2]|0)+1}p=(c[A>>2]|0)-((c[z>>2]|0)*255|0)-1&255;z=c[B>>2]|0;c[B>>2]=z+1;a[z>>0]=p;c[D>>2]=(c[D>>2]|0)+(c[A>>2]|0)}if(c[E>>2]|0){c[x>>2]=0;while(1){if((c[x>>2]|0)>=((c[v>>2]|0)-1|0))break a;E=Yh(b[(c[y>>2]|0)+(c[x>>2]<<1)>>1]|0,c[B>>2]|0)|0;c[B>>2]=(c[B>>2]|0)+E;c[x>>2]=(c[x>>2]|0)+1}}}while(0);if(c[t>>2]|0){c[C>>2]=Yh(b[(c[y>>2]|0)+((c[v>>2]|0)-1<<1)>>1]|0,c[B>>2]|0)|0;c[B>>2]=(c[B>>2]|0)+(c[C>>2]|0)}c[x>>2]=0;while(1){if((c[x>>2]|0)>=(c[v>>2]|0))break;qj(c[B>>2]|0,c[(c[w>>2]|0)+(c[x>>2]<<2)>>2]|0,(b[(c[y>>2]|0)+(c[x>>2]<<1)>>1]|0)+0|0)|0;c[B>>2]=(c[B>>2]|0)+(b[(c[y>>2]|0)+(c[x>>2]<<1)>>1]|0);c[x>>2]=(c[x>>2]|0)+1}b:do if(c[u>>2]|0)while(1){if((c[B>>2]|0)>>>0>=((c[r>>2]|0)+(c[s>>2]|0)|0)>>>0)break b;E=c[B>>2]|0;c[B>>2]=E+1;a[E>>0]=0}while(0);c[q>>2]=c[D>>2];E=c[q>>2]|0;i=F;return E|0}c[q>>2]=-1;E=c[q>>2]|0;i=F;return E|0}function Xi(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0;l=i;i=i+320|0;e=l+316|0;f=l+312|0;g=l+308|0;h=l+304|0;k=l+4|0;j=l;c[f>>2]=a;c[g>>2]=b;c[h>>2]=d;if((c[g>>2]|0)<1){c[e>>2]=-1;k=c[e>>2]|0;i=l;return k|0}if((c[g>>2]|0)==(c[h>>2]|0)){c[e>>2]=0;k=c[e>>2]|0;i=l;return k|0}if((c[g>>2]|0)>(c[h>>2]|0)){c[e>>2]=-1;k=c[e>>2]|0;i=l;return k|0}Ti(k)|0;qj((c[f>>2]|0)+(c[h>>2]|0)+(0-(c[g>>2]|0))|0,c[f>>2]|0,(c[g>>2]|0)+0|0)|0;Ui(k,(c[f>>2]|0)+(c[h>>2]|0)+(0-(c[g>>2]|0))|0,c[g>>2]|0)|0;c[j>>2]=Wi(k,0,c[k+4>>2]|0,c[f>>2]|0,c[h>>2]|0,0,1)|0;if((c[j>>2]|0)>0){c[e>>2]=0;k=c[e>>2]|0;i=l;return k|0}else{c[e>>2]=c[j>>2];k=c[e>>2]|0;i=l;return k|0}return 0}function Yi(a){a=a|0;var b=0,d=0;b=i;i=i+16|0;d=b;c[d>>2]=a;a=Zi()|0;c[c[d>>2]>>2]=a;_i(c[d>>2]|0);i=b;return}function Zi(){return 0}function _i(a){a=a|0;var b=0,d=0,e=0;b=i;i=i+16|0;d=b+4|0;e=b;c[d>>2]=a;c[e>>2]=(c[d>>2]|0)+4;oj(c[e>>2]|0,0,14116-((c[e>>2]|0)-(c[d>>2]|0))|0)|0;i=b;return}function $i(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0;n=i;i=i+32|0;h=n+24|0;j=n+20|0;e=n+16|0;f=n+12|0;k=n+8|0;m=n+4|0;l=n;c[h>>2]=a;c[j>>2]=b;c[e>>2]=d;c[f>>2]=c[(c[h>>2]|0)+8508>>2];c[k>>2]=(c[(c[h>>2]|0)+8504>>2]|0)-(c[(c[h>>2]|0)+8508>>2]|0);if((c[k>>2]|0)<0)c[k>>2]=(c[k>>2]|0)+200;if((c[e>>2]|0)>480?(c[f>>2]|0)!=(c[(c[h>>2]|0)+8504>>2]|0):0){a=(c[f>>2]|0)+1|0;c[f>>2]=a;c[f>>2]=(c[f>>2]|0)==200?0:a}if((c[f>>2]|0)==(c[(c[h>>2]|0)+8504>>2]|0))c[f>>2]=(c[f>>2]|0)+-1;if((c[f>>2]|0)<0)c[f>>2]=199;pj(c[j>>2]|0,(c[h>>2]|0)+8516+((c[f>>2]|0)*28|0)|0,28|0)|0;a=(c[h>>2]|0)+8512|0;c[a>>2]=(c[a>>2]|0)+((c[e>>2]|0)/120|0);while(1){e=c[h>>2]|0;if((c[(c[h>>2]|0)+8512>>2]|0)<4)break;a=e+8512|0;c[a>>2]=(c[a>>2]|0)-4;a=(c[h>>2]|0)+8508|0;c[a>>2]=(c[a>>2]|0)+1}if((c[e+8508>>2]|0)>=200){a=(c[h>>2]|0)+8508|0;c[a>>2]=(c[a>>2]|0)-200}c[k>>2]=((c[k>>2]|0)-10|0)>0?(c[k>>2]|0)-10|0:0;g[m>>2]=0.0;c[l>>2]=0;while(1){if((c[l>>2]|0)>=(200-(c[k>>2]|0)|0))break;g[m>>2]=+g[m>>2]+ +g[(c[h>>2]|0)+7688+(c[l>>2]<<2)>>2];c[l>>2]=(c[l>>2]|0)+1}while(1){if((c[l>>2]|0)>=200)break;g[m>>2]=+g[m>>2]+ +g[(c[h>>2]|0)+6888+(c[l>>2]<<2)>>2];c[l>>2]=(c[l>>2]|0)+1}g[m>>2]=+g[m>>2]*+g[(c[h>>2]|0)+8492>>2]+(1.0-+g[m>>2])*+g[(c[h>>2]|0)+8488>>2];g[(c[j>>2]|0)+20>>2]=+g[m>>2];i=n;return}function aj(a,b,d,e,f,g,h,j,k,l,m,n){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|0;m=m|0;n=n|0;var o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;C=i;i=i+64|0;p=C+52|0;q=C+48|0;t=C+44|0;u=C+40|0;v=C+36|0;w=C+32|0;x=C+28|0;y=C+24|0;o=C+20|0;z=C+16|0;r=C+12|0;s=C+8|0;A=C+4|0;B=C;c[p>>2]=a;c[q>>2]=b;c[t>>2]=d;c[u>>2]=e;c[v>>2]=f;c[w>>2]=g;c[x>>2]=h;c[y>>2]=j;c[o>>2]=k;c[z>>2]=l;c[r>>2]=m;c[s>>2]=n;if(!(c[t>>2]|0)){z=c[s>>2]|0;c[z>>2]=0;z=c[p>>2]|0;A=c[s>>2]|0;B=c[v>>2]|0;$i(z,A,B);i=C;return}if((((c[o>>2]|0)*195|0)/100|0|0)<(c[u>>2]|0))o=((c[o>>2]|0)*195|0)/100|0;else o=c[u>>2]|0;c[u>>2]=o;c[B>>2]=(c[u>>2]|0)-(c[(c[p>>2]|0)+6884>>2]|0);c[A>>2]=c[(c[p>>2]|0)+6884>>2];do{bj(c[p>>2]|0,c[q>>2]|0,c[t>>2]|0,480<(c[B>>2]|0)?480:c[B>>2]|0,c[A>>2]|0,c[w>>2]|0,c[x>>2]|0,c[y>>2]|0,c[z>>2]|0,c[r>>2]|0);c[A>>2]=(c[A>>2]|0)+480;c[B>>2]=(c[B>>2]|0)-480}while((c[B>>2]|0)>0);c[(c[p>>2]|0)+6884>>2]=c[u>>2];z=(c[p>>2]|0)+6884|0;c[z>>2]=(c[z>>2]|0)-(c[v>>2]|0);z=c[s>>2]|0;c[z>>2]=0;z=c[p>>2]|0;A=c[s>>2]|0;B=c[v>>2]|0;$i(z,A,B);i=C;return} |
| | | function bj(a,b,d,e,f,h,j,k,l,m){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;j=j|0;k=k|0;l=l|0;m=m|0;var n=0.0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0,Xa=0;Xa=i;i=i+10192|0;Sa=Xa+10180|0;o=Xa+10176|0;p=Xa+10172|0;q=Xa+10168|0;r=Xa+10164|0;s=Xa+10160|0;t=Xa+10156|0;u=Xa+10152|0;V=Xa+10148|0;v=Xa+10144|0;Fa=Xa+10140|0;sa=Xa+10136|0;Q=Xa+10132|0;ha=Xa+10128|0;x=Xa+10124|0;w=Xa+10120|0;I=Xa+10116|0;F=Xa+10112|0;_=Xa+10040|0;ua=Xa+9968|0;ya=Xa+9936|0;Aa=Xa+9836|0;Ca=Xa+9832|0;va=Xa+9828|0;Va=Xa+9824|0;Da=Xa+9816|0;Ba=Xa+9812|0;wa=Xa+9808|0;Ra=Xa+9800|0;za=Xa+9796|0;ra=Xa+9792|0;ia=Xa+9788|0;ta=Xa+9784|0;la=Xa+9780|0;Ua=Xa+9776|0;na=Xa+9772|0;oa=Xa+9768|0;T=Xa+9764|0;Wa=Xa+9760|0;L=Xa+5920|0;pa=Xa+2080|0;ea=Xa+1120|0;ba=Xa+160|0;U=Xa+152|0;z=Xa+148|0;B=Xa+144|0;y=Xa+140|0;A=Xa+136|0;C=Xa+132|0;J=Xa+128|0;G=Xa+124|0;D=Xa+120|0;K=Xa+116|0;H=Xa+112|0;R=Xa+108|0;S=Xa+104|0;E=Xa+100|0;W=Xa+96|0;da=Xa+92|0;aa=Xa+88|0;X=Xa+84|0;Z=Xa+80|0;ca=Xa+76|0;$=Xa+72|0;ga=Xa+68|0;ka=Xa+64|0;ja=Xa+60|0;ma=Xa+56|0;xa=Xa+52|0;Pa=Xa+48|0;Ea=Xa+44|0;Ja=Xa+40|0;Ka=Xa+36|0;Na=Xa+32|0;Ga=Xa+28|0;La=Xa+24|0;Oa=Xa+20|0;Ha=Xa+16|0;Ia=Xa+12|0;Ma=Xa+8|0;Qa=Xa+4|0;Ta=Xa;c[Sa>>2]=a;c[o>>2]=b;c[p>>2]=d;c[q>>2]=e;c[r>>2]=f;c[s>>2]=h;c[t>>2]=j;c[u>>2]=k;c[V>>2]=l;c[v>>2]=m;c[ha>>2]=480;c[x>>2]=240;c[w>>2]=(c[Sa>>2]|0)+4;c[I>>2]=(c[Sa>>2]|0)+964;c[F>>2]=(c[Sa>>2]|0)+1924;g[Xa+9820>>2]=97.40908813476562;g[Da>>2]=0.0;c[Ua>>2]=0;g[na>>2]=0.0;d=(c[Sa>>2]|0)+6864|0;c[d>>2]=(c[d>>2]|0)+1;if(20<(1+(c[(c[Sa>>2]|0)+6868>>2]|0)|0))k=20;else k=1+(c[(c[Sa>>2]|0)+6868>>2]|0)|0;g[za>>2]=1.0/+(k|0);if(50<(1+(c[(c[Sa>>2]|0)+6868>>2]|0)|0))k=50;else k=1+(c[(c[Sa>>2]|0)+6868>>2]|0)|0;g[ra>>2]=1.0/+(k|0);if(1e3<(1+(c[(c[Sa>>2]|0)+6868>>2]|0)|0))k=1e3;else k=1+(c[(c[Sa>>2]|0)+6868>>2]|0)|0;g[ia>>2]=1.0/+(k|0);if((c[(c[Sa>>2]|0)+6868>>2]|0)<4)g[(c[Sa>>2]|0)+6844>>2]=.5;c[Q>>2]=c[(c[o>>2]|0)+64+8>>2];if(!(c[(c[Sa>>2]|0)+6868>>2]|0))c[(c[Sa>>2]|0)+5764>>2]=240;if((c[q>>2]|0)<(720-(c[(c[Sa>>2]|0)+5764>>2]|0)|0))k=c[q>>2]|0;else k=720-(c[(c[Sa>>2]|0)+5764>>2]|0)|0;qa[c[v>>2]&3](c[p>>2]|0,(c[Sa>>2]|0)+2884+(c[(c[Sa>>2]|0)+5764>>2]<<2)|0,k,c[r>>2]|0,c[s>>2]|0,c[t>>2]|0,c[u>>2]|0);if(((c[(c[Sa>>2]|0)+5764>>2]|0)+(c[q>>2]|0)|0)<720){Wa=(c[Sa>>2]|0)+5764|0;c[Wa>>2]=(c[Wa>>2]|0)+(c[q>>2]|0);i=Xa;return}d=(c[Sa>>2]|0)+8504|0;o=c[d>>2]|0;c[d>>2]=o+1;c[Wa>>2]=(c[Sa>>2]|0)+8516+(o*28|0);if((c[(c[Sa>>2]|0)+8504>>2]|0)>=200){o=(c[Sa>>2]|0)+8504|0;c[o>>2]=(c[o>>2]|0)-200}c[Fa>>2]=0;while(1){if((c[Fa>>2]|0)>=(c[x>>2]|0))break;g[U>>2]=+g[18176+(c[Fa>>2]<<2)>>2];g[L+(c[Fa>>2]<<3)>>2]=+g[U>>2]*+g[(c[Sa>>2]|0)+2884+(c[Fa>>2]<<2)>>2];g[L+(c[Fa>>2]<<3)+4>>2]=+g[U>>2]*+g[(c[Sa>>2]|0)+2884+((c[x>>2]|0)+(c[Fa>>2]|0)<<2)>>2];g[L+((c[ha>>2]|0)-(c[Fa>>2]|0)-1<<3)>>2]=+g[U>>2]*+g[(c[Sa>>2]|0)+2884+((c[ha>>2]|0)-(c[Fa>>2]|0)-1<<2)>>2];g[L+((c[ha>>2]|0)-(c[Fa>>2]|0)-1<<3)+4>>2]=+g[U>>2]*+g[(c[Sa>>2]|0)+2884+((c[ha>>2]|0)+(c[x>>2]|0)-(c[Fa>>2]|0)-1<<2)>>2];c[Fa>>2]=(c[Fa>>2]|0)+1}qj((c[Sa>>2]|0)+2884|0,(c[Sa>>2]|0)+2884+2880+-960|0,960|0)|0;c[T>>2]=(c[q>>2]|0)-(720-(c[(c[Sa>>2]|0)+5764>>2]|0));qa[c[v>>2]&3](c[p>>2]|0,(c[Sa>>2]|0)+2884+960|0,c[T>>2]|0,(c[r>>2]|0)+720-(c[(c[Sa>>2]|0)+5764>>2]|0)|0,c[s>>2]|0,c[t>>2]|0,c[u>>2]|0);c[(c[Sa>>2]|0)+5764>>2]=240+(c[T>>2]|0);Cc(c[Q>>2]|0,L,pa);if(+g[pa>>2]!=+g[pa>>2]){c[c[Wa>>2]>>2]=0;i=Xa;return}c[Fa>>2]=1;while(1){if((c[Fa>>2]|0)>=(c[x>>2]|0))break;g[z>>2]=+g[pa+(c[Fa>>2]<<3)>>2]+ +g[pa+((c[ha>>2]|0)-(c[Fa>>2]|0)<<3)>>2];g[y>>2]=+g[pa+(c[Fa>>2]<<3)+4>>2]-+g[pa+((c[ha>>2]|0)-(c[Fa>>2]|0)<<3)+4>>2];g[B>>2]=+g[pa+(c[Fa>>2]<<3)+4>>2]+ +g[pa+((c[ha>>2]|0)-(c[Fa>>2]|0)<<3)+4>>2];g[A>>2]=+g[pa+((c[ha>>2]|0)-(c[Fa>>2]|0)<<3)>>2]-+g[pa+(c[Fa>>2]<<3)>>2];g[C>>2]=+cj(+g[y>>2],+g[z>>2])*.15915493667125702;g[J>>2]=+g[C>>2]-+g[(c[w>>2]|0)+(c[Fa>>2]<<2)>>2];g[G>>2]=+g[J>>2]-+g[(c[I>>2]|0)+(c[Fa>>2]<<2)>>2];g[D>>2]=+cj(+g[A>>2],+g[B>>2])*.15915493667125702;g[K>>2]=+g[D>>2]-+g[C>>2];g[H>>2]=+g[K>>2]-+g[J>>2];g[R>>2]=+g[G>>2]-+M(+(+g[G>>2]+.5));n=+N(+(+g[R>>2]));g[ba+(c[Fa>>2]<<2)>>2]=n;g[R>>2]=+g[R>>2]*+g[R>>2];g[R>>2]=+g[R>>2]*+g[R>>2];g[S>>2]=+g[H>>2]-+M(+(+g[H>>2]+.5));n=+N(+(+g[S>>2]));U=ba+(c[Fa>>2]<<2)|0;g[U>>2]=+g[U>>2]+n;g[S>>2]=+g[S>>2]*+g[S>>2];g[S>>2]=+g[S>>2]*+g[S>>2];g[E>>2]=(+g[(c[F>>2]|0)+(c[Fa>>2]<<2)>>2]+ +g[R>>2]*2.0+ +g[S>>2])*.25;g[ea+(c[Fa>>2]<<2)>>2]=1.0/(+g[E>>2]*62341.81640625+1.0)-.014999999664723873;g[(c[w>>2]|0)+(c[Fa>>2]<<2)>>2]=+g[D>>2];g[(c[I>>2]|0)+(c[Fa>>2]<<2)>>2]=+g[K>>2];g[(c[F>>2]|0)+(c[Fa>>2]<<2)>>2]=+g[S>>2];c[Fa>>2]=(c[Fa>>2]|0)+1}g[Ca>>2]=0.0;g[va>>2]=0.0;g[(c[Wa>>2]|0)+16>>2]=0.0;g[Va>>2]=0.0;g[Ba>>2]=0.0;a:do if(!(c[(c[Sa>>2]|0)+6868>>2]|0)){c[sa>>2]=0;while(1){if((c[sa>>2]|0)>=18)break a;g[(c[Sa>>2]|0)+6420+(c[sa>>2]<<2)>>2]=1.0e10;g[(c[Sa>>2]|0)+6492+(c[sa>>2]<<2)>>2]=-1.0e10;c[sa>>2]=(c[sa>>2]|0)+1}}while(0);g[wa>>2]=0.0;g[ta>>2]=0.0;c[sa>>2]=0;while(1){if((c[sa>>2]|0)>=18)break;g[W>>2]=0.0;g[da>>2]=0.0;g[aa>>2]=0.0;c[Fa>>2]=c[19136+(c[sa>>2]<<2)>>2];while(1){if((c[Fa>>2]|0)>=(c[19136+((c[sa>>2]|0)+1<<2)>>2]|0))break;g[$>>2]=+g[pa+(c[Fa>>2]<<3)>>2]*+g[pa+(c[Fa>>2]<<3)>>2]+ +g[pa+((c[ha>>2]|0)-(c[Fa>>2]|0)<<3)>>2]*+g[pa+((c[ha>>2]|0)-(c[Fa>>2]|0)<<3)>>2]+ +g[pa+(c[Fa>>2]<<3)+4>>2]*+g[pa+(c[Fa>>2]<<3)+4>>2]+ +g[pa+((c[ha>>2]|0)-(c[Fa>>2]|0)<<3)+4>>2]*+g[pa+((c[ha>>2]|0)-(c[Fa>>2]|0)<<3)+4>>2];g[W>>2]=+g[W>>2]+ +g[$>>2];g[da>>2]=+g[da>>2]+ +g[$>>2]*+g[ea+(c[Fa>>2]<<2)>>2];g[aa>>2]=+g[aa>>2]+ +g[$>>2]*2.0*(.5-+g[ba+(c[Fa>>2]<<2)>>2]);c[Fa>>2]=(c[Fa>>2]|0)+1}if(!(+g[W>>2]<1.0e9)){fa=37;break}if(+g[W>>2]!=+g[W>>2]){fa=37;break}g[(c[Sa>>2]|0)+5844+((c[(c[Sa>>2]|0)+6856>>2]|0)*72|0)+(c[sa>>2]<<2)>>2]=+g[W>>2];g[Va>>2]=+g[Va>>2]+ +g[aa>>2]/(+g[W>>2]+1.0000000036274937e-15);n=+O(+(+g[W>>2]+1.000000013351432e-10));g[ta>>2]=+g[ta>>2]+n;n=+Y(+(+g[W>>2]+1.000000013351432e-10));g[ua+(c[sa>>2]<<2)>>2]=n;k=c[sa>>2]|0;if(+g[ua+(c[sa>>2]<<2)>>2]<+g[(c[Sa>>2]|0)+6420+(c[sa>>2]<<2)>>2]+.009999999776482582)n=+g[ua+(k<<2)>>2];else n=+g[(c[Sa>>2]|0)+6420+(k<<2)>>2]+.009999999776482582;g[(c[Sa>>2]|0)+6420+(c[sa>>2]<<2)>>2]=n;k=c[sa>>2]|0;if(+g[ua+(c[sa>>2]<<2)>>2]>+g[(c[Sa>>2]|0)+6492+(c[sa>>2]<<2)>>2]-.10000000149011612)n=+g[ua+(k<<2)>>2];else n=+g[(c[Sa>>2]|0)+6492+(k<<2)>>2]-.10000000149011612;g[(c[Sa>>2]|0)+6492+(c[sa>>2]<<2)>>2]=n;if(+g[(c[Sa>>2]|0)+6492+(c[sa>>2]<<2)>>2]<+g[(c[Sa>>2]|0)+6420+(c[sa>>2]<<2)>>2]+1.0){U=(c[Sa>>2]|0)+6492+(c[sa>>2]<<2)|0;g[U>>2]=+g[U>>2]+.5;U=(c[Sa>>2]|0)+6420+(c[sa>>2]<<2)|0;g[U>>2]=+g[U>>2]-.5}g[wa>>2]=+g[wa>>2]+(+g[ua+(c[sa>>2]<<2)>>2]-+g[(c[Sa>>2]|0)+6420+(c[sa>>2]<<2)>>2])/(+g[(c[Sa>>2]|0)+6492+(c[sa>>2]<<2)>>2]+1.0000000036274937e-15-+g[(c[Sa>>2]|0)+6420+(c[sa>>2]<<2)>>2]);g[Z>>2]=0.0;g[X>>2]=0.0;c[Fa>>2]=0;while(1){if((c[Fa>>2]|0)>=8)break;n=+O(+(+g[(c[Sa>>2]|0)+5844+((c[Fa>>2]|0)*72|0)+(c[sa>>2]<<2)>>2]));g[X>>2]=+g[X>>2]+n;g[Z>>2]=+g[Z>>2]+ +g[(c[Sa>>2]|0)+5844+((c[Fa>>2]|0)*72|0)+(c[sa>>2]<<2)>>2];c[Fa>>2]=(c[Fa>>2]|0)+1}if(.9900000095367432<+g[X>>2]/+O(+(+g[Z>>2]*8.0+1.0e-15)))n=.9900000095367432;else n=+g[X>>2]/+O(+(+g[Z>>2]*8.0+1.0e-15));g[ca>>2]=n;g[ca>>2]=+g[ca>>2]*+g[ca>>2];g[ca>>2]=+g[ca>>2]*+g[ca>>2];g[Ba>>2]=+g[Ba>>2]+ +g[ca>>2];if(+g[da>>2]/(+g[W>>2]+1.0000000036274937e-15)>+g[ca>>2]*+g[(c[Sa>>2]|0)+5768+(c[sa>>2]<<2)>>2])n=+g[da>>2]/(+g[W>>2]+1.0000000036274937e-15);else n=+g[ca>>2]*+g[(c[Sa>>2]|0)+5768+(c[sa>>2]<<2)>>2];g[_+(c[sa>>2]<<2)>>2]=n;g[Ca>>2]=+g[Ca>>2]+ +g[_+(c[sa>>2]<<2)>>2];if((c[sa>>2]|0)>=9)g[Ca>>2]=+g[Ca>>2]-+g[_+((c[sa>>2]|0)-18+9<<2)>>2];if(+g[va>>2]>(+((c[sa>>2]|0)-18|0)*.029999999329447746+1.0)*+g[Ca>>2])n=+g[va>>2];else n=(+((c[sa>>2]|0)-18|0)*.029999999329447746+1.0)*+g[Ca>>2];g[va>>2]=n;g[Da>>2]=+g[Da>>2]+ +g[_+(c[sa>>2]<<2)>>2]*+((c[sa>>2]|0)-8|0);g[(c[Sa>>2]|0)+5768+(c[sa>>2]<<2)>>2]=+g[_+(c[sa>>2]<<2)>>2];c[sa>>2]=(c[sa>>2]|0)+1}if((fa|0)==37){c[c[Wa>>2]>>2]=0;i=Xa;return}g[la>>2]=0.0;c[Ua>>2]=0;g[na>>2]=0.0;g[oa>>2]=5.699999746866524e-04/+(1<<(0>((c[V>>2]|0)-8|0)?0:(c[V>>2]|0)-8|0)|0);g[oa>>2]=+g[oa>>2]*+g[oa>>2];c[sa>>2]=0;while(1){if((c[sa>>2]|0)>=21)break;g[ga>>2]=0.0;c[ka>>2]=c[19212+(c[sa>>2]<<2)>>2];c[ja>>2]=c[19212+((c[sa>>2]|0)+1<<2)>>2];c[Fa>>2]=c[ka>>2];while(1){if((c[Fa>>2]|0)>=(c[ja>>2]|0))break;g[ma>>2]=+g[pa+(c[Fa>>2]<<3)>>2]*+g[pa+(c[Fa>>2]<<3)>>2]+ +g[pa+((c[ha>>2]|0)-(c[Fa>>2]|0)<<3)>>2]*+g[pa+((c[ha>>2]|0)-(c[Fa>>2]|0)<<3)>>2]+ +g[pa+(c[Fa>>2]<<3)+4>>2]*+g[pa+(c[Fa>>2]<<3)+4>>2]+ +g[pa+((c[ha>>2]|0)-(c[Fa>>2]|0)<<3)+4>>2]*+g[pa+((c[ha>>2]|0)-(c[Fa>>2]|0)<<3)+4>>2];g[ga>>2]=+g[ga>>2]+ +g[ma>>2];c[Fa>>2]=(c[Fa>>2]|0)+1}g[na>>2]=+g[na>>2]>+g[ga>>2]?+g[na>>2]:+g[ga>>2];if((1.0-+g[ia>>2])*+g[(c[Sa>>2]|0)+6564+(c[sa>>2]<<2)>>2]>+g[ga>>2])n=(1.0-+g[ia>>2])*+g[(c[Sa>>2]|0)+6564+(c[sa>>2]<<2)>>2];else n=+g[ga>>2];g[(c[Sa>>2]|0)+6564+(c[sa>>2]<<2)>>2]=n;if(+g[ga>>2]>+g[(c[Sa>>2]|0)+6564+(c[sa>>2]<<2)>>2])n=+g[ga>>2];else n=+g[(c[Sa>>2]|0)+6564+(c[sa>>2]<<2)>>2];g[ga>>2]=n;g[la>>2]=+g[la>>2]*.05000000074505806>+g[ga>>2]?+g[la>>2]*.05000000074505806:+g[ga>>2];if((+g[ga>>2]>+g[la>>2]*.1?+g[ga>>2]*1.0e9>+g[na>>2]:0)?+g[ga>>2]>+g[oa>>2]*+((c[ja>>2]|0)-(c[ka>>2]|0)|0):0)c[Ua>>2]=c[sa>>2];c[sa>>2]=(c[sa>>2]|0)+1}if((c[(c[Sa>>2]|0)+6868>>2]|0)<=2)c[Ua>>2]=20;g[ta>>2]=+hj(+g[ta>>2])*20.0;if(+g[(c[Sa>>2]|0)+6848>>2]-.029999999329447746>+g[ta>>2])n=+g[(c[Sa>>2]|0)+6848>>2]-.029999999329447746;else n=+g[ta>>2];g[(c[Sa>>2]|0)+6848>>2]=n;pa=(c[Sa>>2]|0)+6852|0;g[pa>>2]=+g[pa>>2]*(1.0-+g[ra>>2]);if(+g[ta>>2]<+g[(c[Sa>>2]|0)+6848>>2]-30.0){ta=(c[Sa>>2]|0)+6852|0;g[ta>>2]=+g[ta>>2]+ +g[ra>>2]}c[Fa>>2]=0;while(1){if((c[Fa>>2]|0)>=8)break;g[xa>>2]=0.0;c[sa>>2]=0;while(1){if((c[sa>>2]|0)>=16)break;g[xa>>2]=+g[xa>>2]+ +g[19300+((c[Fa>>2]<<4)+(c[sa>>2]|0)<<2)>>2]*+g[ua+(c[sa>>2]<<2)>>2];c[sa>>2]=(c[sa>>2]|0)+1}g[ya+(c[Fa>>2]<<2)>>2]=+g[xa>>2];c[Fa>>2]=(c[Fa>>2]|0)+1}g[Ba>>2]=+g[Ba>>2]/18.0;n=+g[wa>>2]/18.0;g[wa>>2]=n;g[wa>>2]=(c[(c[Sa>>2]|0)+6868>>2]|0)<10?.5:n;g[Va>>2]=+g[Va>>2]/18.0;g[(c[Wa>>2]|0)+16>>2]=+g[Va>>2]+(1.0-+g[Va>>2])*+g[wa>>2];g[Ca>>2]=+g[va>>2]/9.0;if(+g[Ca>>2]>+g[(c[Sa>>2]|0)+5840>>2]*.800000011920929)n=+g[Ca>>2];else n=+g[(c[Sa>>2]|0)+5840>>2]*.800000011920929;g[Ca>>2]=n;g[(c[Sa>>2]|0)+5840>>2]=+g[Ca>>2];g[Da>>2]=+g[Da>>2]/64.0;g[(c[Wa>>2]|0)+8>>2]=+g[Da>>2];c[(c[Sa>>2]|0)+6856>>2]=((c[(c[Sa>>2]|0)+6856>>2]|0)+1|0)%8|0;Da=(c[Sa>>2]|0)+6868|0;c[Da>>2]=(c[Da>>2]|0)+1;g[(c[Wa>>2]|0)+4>>2]=+g[Ca>>2];c[Fa>>2]=0;while(1){if((c[Fa>>2]|0)>=4)break;g[Aa+(c[Fa>>2]<<2)>>2]=(+g[ya+(c[Fa>>2]<<2)>>2]+ +g[(c[Sa>>2]|0)+6648+((c[Fa>>2]|0)+24<<2)>>2])*-.12298999726772308+(+g[(c[Sa>>2]|0)+6648+(c[Fa>>2]<<2)>>2]+ +g[(c[Sa>>2]|0)+6648+((c[Fa>>2]|0)+16<<2)>>2])*.49195000529289246+ +g[(c[Sa>>2]|0)+6648+((c[Fa>>2]|0)+8<<2)>>2]*.6969299912452698-+g[(c[Sa>>2]|0)+6776+(c[Fa>>2]<<2)>>2]*1.4349000453948975;c[Fa>>2]=(c[Fa>>2]|0)+1}c[Fa>>2]=0;while(1){if((c[Fa>>2]|0)>=4)break;g[(c[Sa>>2]|0)+6776+(c[Fa>>2]<<2)>>2]=(1.0-+g[za>>2])*+g[(c[Sa>>2]|0)+6776+(c[Fa>>2]<<2)>>2]+ +g[za>>2]*+g[ya+(c[Fa>>2]<<2)>>2];c[Fa>>2]=(c[Fa>>2]|0)+1}c[Fa>>2]=0;while(1){if((c[Fa>>2]|0)>=4)break;g[Aa+(4+(c[Fa>>2]|0)<<2)>>2]=(+g[ya+(c[Fa>>2]<<2)>>2]-+g[(c[Sa>>2]|0)+6648+((c[Fa>>2]|0)+24<<2)>>2])*.6324599981307983+(+g[(c[Sa>>2]|0)+6648+(c[Fa>>2]<<2)>>2]-+g[(c[Sa>>2]|0)+6648+((c[Fa>>2]|0)+16<<2)>>2])*.31622999906539917;c[Fa>>2]=(c[Fa>>2]|0)+1}c[Fa>>2]=0;while(1){if((c[Fa>>2]|0)>=3)break;g[Aa+(8+(c[Fa>>2]|0)<<2)>>2]=(+g[ya+(c[Fa>>2]<<2)>>2]+ +g[(c[Sa>>2]|0)+6648+((c[Fa>>2]|0)+24<<2)>>2])*.5345199704170227-(+g[(c[Sa>>2]|0)+6648+(c[Fa>>2]<<2)>>2]+ +g[(c[Sa>>2]|0)+6648+((c[Fa>>2]|0)+16<<2)>>2])*.26725998520851135-+g[(c[Sa>>2]|0)+6648+((c[Fa>>2]|0)+8<<2)>>2]*.5345199704170227;c[Fa>>2]=(c[Fa>>2]|0)+1}b:do if((c[(c[Sa>>2]|0)+6868>>2]|0)>5){c[Fa>>2]=0;while(1){if((c[Fa>>2]|0)>=9)break b;g[(c[Sa>>2]|0)+6808+(c[Fa>>2]<<2)>>2]=(1.0-+g[za>>2])*+g[(c[Sa>>2]|0)+6808+(c[Fa>>2]<<2)>>2]+ +g[za>>2]*+g[Aa+(c[Fa>>2]<<2)>>2]*+g[Aa+(c[Fa>>2]<<2)>>2];c[Fa>>2]=(c[Fa>>2]|0)+1}}while(0);c[Fa>>2]=0;while(1){if((c[Fa>>2]|0)>=8)break;g[(c[Sa>>2]|0)+6648+((c[Fa>>2]|0)+24<<2)>>2]=+g[(c[Sa>>2]|0)+6648+((c[Fa>>2]|0)+16<<2)>>2];g[(c[Sa>>2]|0)+6648+((c[Fa>>2]|0)+16<<2)>>2]=+g[(c[Sa>>2]|0)+6648+((c[Fa>>2]|0)+8<<2)>>2];g[(c[Sa>>2]|0)+6648+((c[Fa>>2]|0)+8<<2)>>2]=+g[(c[Sa>>2]|0)+6648+(c[Fa>>2]<<2)>>2];g[(c[Sa>>2]|0)+6648+(c[Fa>>2]<<2)>>2]=+g[ya+(c[Fa>>2]<<2)>>2];c[Fa>>2]=(c[Fa>>2]|0)+1}c[Fa>>2]=0;while(1){if((c[Fa>>2]|0)>=9)break;n=+O(+(+g[(c[Sa>>2]|0)+6808+(c[Fa>>2]<<2)>>2]));g[Aa+(11+(c[Fa>>2]|0)<<2)>>2]=n;c[Fa>>2]=(c[Fa>>2]|0)+1}g[Aa+80>>2]=+g[(c[Wa>>2]|0)+4>>2];g[Aa+84>>2]=+g[(c[Wa>>2]|0)+16>>2];g[Aa+88>>2]=+g[Ba>>2];g[Aa+92>>2]=+g[(c[Wa>>2]|0)+8>>2];g[Aa+96>>2]=+g[(c[Sa>>2]|0)+6852>>2];dj(20616,Aa,Ra);g[Ra>>2]=(+g[Ra>>2]+1.0)*.5;g[Ra>>2]=+g[Ra>>2]*1.2100000381469727*+g[Ra>>2]+.009999999776482582-+P(+(+g[Ra>>2]),10.0)*.23000000417232513;g[Ra+4>>2]=+g[Ra+4>>2]*.5+.5;g[Ra>>2]=+g[Ra+4>>2]*+g[Ra>>2]+(1.0-+g[Ra+4>>2])*.5;g[Pa>>2]=+g[Ra+4>>2]*4.999999873689376e-05;g[Ea>>2]=.05000000074505806;if(.05000000074505806>(.949999988079071<+g[Ra>>2]?.949999988079071:+g[Ra>>2]))n=.05000000074505806;else n=.949999988079071<+g[Ra>>2]?.949999988079071:+g[Ra>>2];g[Ia>>2]=n;if(.949999988079071<+g[(c[Sa>>2]|0)+6844>>2])n=.949999988079071;else n=+g[(c[Sa>>2]|0)+6844>>2];if(!(.05000000074505806>n))if(.949999988079071<+g[(c[Sa>>2]|0)+6844>>2])n=.949999988079071;else n=+g[(c[Sa>>2]|0)+6844>>2];else n=.05000000074505806;g[Ma>>2]=n;n=+N(+(+g[Ia>>2]-+g[Ma>>2]))*.05000000074505806;g[Ea>>2]=n/(+g[Ia>>2]*(1.0-+g[Ma>>2])+ +g[Ma>>2]*(1.0-+g[Ia>>2]))+.009999999776482582;g[Ja>>2]=(1.0-+g[(c[Sa>>2]|0)+6844>>2])*(1.0-+g[Pa>>2])+ +g[(c[Sa>>2]|0)+6844>>2]*+g[Pa>>2];g[Ka>>2]=+g[(c[Sa>>2]|0)+6844>>2]*(1.0-+g[Pa>>2])+(1.0-+g[(c[Sa>>2]|0)+6844>>2])*+g[Pa>>2];n=+P(+(1.0-+g[Ra>>2]),+(+g[Ea>>2]));g[Ja>>2]=+g[Ja>>2]*n;n=+P(+(+g[Ra>>2]),+(+g[Ea>>2]));g[Ka>>2]=+g[Ka>>2]*n;g[(c[Sa>>2]|0)+6844>>2]=+g[Ka>>2]/(+g[Ja>>2]+ +g[Ka>>2]);g[(c[Wa>>2]|0)+20>>2]=+g[(c[Sa>>2]|0)+6844>>2];g[La>>2]=9.999999682655225e-21;g[Oa>>2]=+P(+(1.0-+g[Ra>>2]),+(+g[Ea>>2]));g[Ha>>2]=+P(+(+g[Ra>>2]),+(+g[Ea>>2]));if((c[(c[Sa>>2]|0)+6868>>2]|0)==1){g[(c[Sa>>2]|0)+6888>>2]=.5;g[(c[Sa>>2]|0)+7688>>2]=.5}g[Na>>2]=+g[(c[Sa>>2]|0)+6888>>2]+ +g[(c[Sa>>2]|0)+6888+4>>2];g[Ga>>2]=+g[(c[Sa>>2]|0)+7688>>2]+ +g[(c[Sa>>2]|0)+7688+4>>2];g[(c[Sa>>2]|0)+6888>>2]=+g[Na>>2]*(1.0-+g[Pa>>2])*+g[Oa>>2];g[(c[Sa>>2]|0)+7688>>2]=+g[Ga>>2]*(1.0-+g[Pa>>2])*+g[Ha>>2];c[Fa>>2]=1;while(1){if((c[Fa>>2]|0)>=199)break;g[(c[Sa>>2]|0)+6888+(c[Fa>>2]<<2)>>2]=+g[(c[Sa>>2]|0)+6888+((c[Fa>>2]|0)+1<<2)>>2]*+g[Oa>>2];g[(c[Sa>>2]|0)+7688+(c[Fa>>2]<<2)>>2]=+g[(c[Sa>>2]|0)+7688+((c[Fa>>2]|0)+1<<2)>>2]*+g[Ha>>2];c[Fa>>2]=(c[Fa>>2]|0)+1}g[(c[Sa>>2]|0)+6888+796>>2]=+g[Ga>>2]*+g[Pa>>2]*+g[Oa>>2];g[(c[Sa>>2]|0)+7688+796>>2]=+g[Na>>2]*+g[Pa>>2]*+g[Ha>>2];c[Fa>>2]=0;while(1){if((c[Fa>>2]|0)>=200)break;g[La>>2]=+g[La>>2]+(+g[(c[Sa>>2]|0)+6888+(c[Fa>>2]<<2)>>2]+ +g[(c[Sa>>2]|0)+7688+(c[Fa>>2]<<2)>>2]);c[Fa>>2]=(c[Fa>>2]|0)+1}g[La>>2]=1.0/+g[La>>2];c[Fa>>2]=0;while(1){if((c[Fa>>2]|0)>=200)break;Pa=(c[Sa>>2]|0)+6888+(c[Fa>>2]<<2)|0;g[Pa>>2]=+g[Pa>>2]*+g[La>>2];Pa=(c[Sa>>2]|0)+7688+(c[Fa>>2]<<2)|0;g[Pa>>2]=+g[Pa>>2]*+g[La>>2];c[Fa>>2]=(c[Fa>>2]|0)+1}g[La>>2]=+g[(c[Sa>>2]|0)+7688>>2];c[Fa>>2]=1;while(1){if((c[Fa>>2]|0)>=200)break;g[La>>2]=+g[La>>2]+ +g[(c[Sa>>2]|0)+6888+(c[Fa>>2]<<2)>>2];c[Fa>>2]=(c[Fa>>2]|0)+1}k=c[Sa>>2]|0;do if(+g[Ra+4>>2]>.75){if(+g[k+6844>>2]>.9){Oa=(c[Sa>>2]|0)+8500|0;Pa=(c[Oa>>2]|0)+1|0;c[Oa>>2]=Pa;g[Qa>>2]=1.0/+(Pa|0);if((c[(c[Sa>>2]|0)+8500>>2]|0)<500)k=c[(c[Sa>>2]|0)+8500>>2]|0;else k=500;c[(c[Sa>>2]|0)+8500>>2]=k;if(-.20000000298023224>+g[Ra>>2]-+g[(c[Sa>>2]|0)+8492>>2])n=-.20000000298023224;else n=+g[Ra>>2]-+g[(c[Sa>>2]|0)+8492>>2];Pa=(c[Sa>>2]|0)+8492|0;g[Pa>>2]=+g[Pa>>2]+ +g[Qa>>2]*n}if(!(+g[(c[Sa>>2]|0)+6844>>2]<.1))break;Pa=(c[Sa>>2]|0)+8496|0;Qa=(c[Pa>>2]|0)+1|0;c[Pa>>2]=Qa;g[Ta>>2]=1.0/+(Qa|0);if((c[(c[Sa>>2]|0)+8496>>2]|0)<500)k=c[(c[Sa>>2]|0)+8496>>2]|0;else k=500;c[(c[Sa>>2]|0)+8496>>2]=k;if(.20000000298023224<+g[Ra>>2]-+g[(c[Sa>>2]|0)+8488>>2])n=.20000000298023224;else n=+g[Ra>>2]-+g[(c[Sa>>2]|0)+8488>>2];Ra=(c[Sa>>2]|0)+8488|0;g[Ra>>2]=+g[Ra>>2]+ +g[Ta>>2]*n}else{if(!(c[k+8500>>2]|0))g[(c[Sa>>2]|0)+8492>>2]=.8999999761581421;if(c[(c[Sa>>2]|0)+8496>>2]|0)break;g[(c[Sa>>2]|0)+8488>>2]=.10000000149011612}while(0);if((c[(c[Sa>>2]|0)+6860>>2]|0)!=(+g[(c[Sa>>2]|0)+6844>>2]>.5|0))c[(c[Sa>>2]|0)+6864>>2]=0;c[(c[Sa>>2]|0)+6860>>2]=+g[(c[Sa>>2]|0)+6844>>2]>.5&1;c[(c[Wa>>2]|0)+24>>2]=c[Ua>>2];g[(c[Wa>>2]|0)+12>>2]=+g[Va>>2];c[c[Wa>>2]>>2]=1;i=Xa;return}function cj(a,b){a=+a;b=+b;var c=0,d=0,e=0,f=0,h=0,j=0,k=0,l=0;l=i;i=i+32|0;c=l+24|0;d=l+20|0;e=l+16|0;j=l+12|0;k=l+8|0;f=l+4|0;h=l;g[d>>2]=a;g[e>>2]=b;a=+N(+(+g[e>>2]));if(a+ +N(+(+g[d>>2]))<9.999999717180685e-10){g[e>>2]=+g[e>>2]*999999995904.0;g[d>>2]=+g[d>>2]*999999995904.0}g[j>>2]=+g[e>>2]*+g[e>>2];g[k>>2]=+g[d>>2]*+g[d>>2];if(+g[j>>2]<+g[k>>2]){g[f>>2]=(+g[k>>2]+ +g[j>>2]*.6784840226173401)*(+g[k>>2]+ +g[j>>2]*.0859554186463356);if(+g[f>>2]!=0.0){g[c>>2]=-+g[e>>2]*+g[d>>2]*(+g[k>>2]+ +g[j>>2]*.43157973885536194)/+g[f>>2]+(+g[d>>2]<0.0?-1.5707963705062866:1.5707963705062866);a=+g[c>>2];i=l;return +a}else{g[c>>2]=+g[d>>2]<0.0?-1.5707963705062866:1.5707963705062866;a=+g[c>>2];i=l;return +a}}else{g[h>>2]=(+g[j>>2]+ +g[k>>2]*.6784840226173401)*(+g[j>>2]+ +g[k>>2]*.0859554186463356);if(+g[h>>2]!=0.0){g[c>>2]=+g[e>>2]*+g[d>>2]*(+g[j>>2]+ +g[k>>2]*.43157973885536194)/+g[h>>2]+(+g[d>>2]<0.0?-1.5707963705062866:1.5707963705062866)-(+g[e>>2]*+g[d>>2]<0.0?-1.5707963705062866:1.5707963705062866);a=+g[c>>2];i=l;return +a}else{g[c>>2]=(+g[d>>2]<0.0?-1.5707963705062866:1.5707963705062866)-(+g[e>>2]*+g[d>>2]<0.0?-1.5707963705062866:1.5707963705062866);a=+g[c>>2];i=l;return +a}}return 0.0}function dj(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0.0;r=i;i=i+448|0;k=r+436|0;f=r+432|0;l=r+428|0;o=r+424|0;n=r+24|0;m=r+16|0;h=r+12|0;j=r+8|0;p=r+4|0;q=r;c[k>>2]=a;c[f>>2]=b;c[l>>2]=d;c[m>>2]=c[(c[k>>2]|0)+8>>2];c[o>>2]=0;while(1){if((c[o>>2]|0)>=(c[(c[(c[k>>2]|0)+4>>2]|0)+4>>2]|0))break;d=c[m>>2]|0;c[m>>2]=d+4;g[j>>2]=+g[d>>2];c[h>>2]=0;while(1){e=+g[j>>2];if((c[h>>2]|0)>=(c[c[(c[k>>2]|0)+4>>2]>>2]|0))break;s=+g[(c[f>>2]|0)+(c[h>>2]<<2)>>2];d=c[m>>2]|0;c[m>>2]=d+4;g[j>>2]=e+s*+g[d>>2];c[h>>2]=(c[h>>2]|0)+1}s=+ej(e);g[n+(c[o>>2]<<2)>>2]=s;c[o>>2]=(c[o>>2]|0)+1}c[o>>2]=0;while(1){if((c[o>>2]|0)>=(c[(c[(c[k>>2]|0)+4>>2]|0)+8>>2]|0))break;j=c[m>>2]|0;c[m>>2]=j+4;g[q>>2]=+g[j>>2];c[p>>2]=0;while(1){e=+g[q>>2];if((c[p>>2]|0)>=(c[(c[(c[k>>2]|0)+4>>2]|0)+4>>2]|0))break;s=+g[n+(c[p>>2]<<2)>>2];j=c[m>>2]|0;c[m>>2]=j+4;g[q>>2]=e+s*+g[j>>2];c[p>>2]=(c[p>>2]|0)+1}s=+ej(e);g[(c[l>>2]|0)+(c[o>>2]<<2)>>2]=s;c[o>>2]=(c[o>>2]|0)+1}i=r;return}function ej(a){a=+a;var b=0,d=0,e=0,f=0,h=0,j=0,k=0;k=i;i=i+32|0;b=k+20|0;d=k+16|0;f=k+12|0;j=k+8|0;e=k+4|0;h=k;g[d>>2]=a;g[h>>2]=1.0;if(!(+g[d>>2]<8.0)){g[b>>2]=1.0;a=+g[b>>2];i=k;return +a}if(!(+g[d>>2]>-8.0)){g[b>>2]=-1.0;a=+g[b>>2];i=k;return +a}if(+g[d>>2]!=+g[d>>2]){g[b>>2]=0.0;a=+g[b>>2];i=k;return +a}if(+g[d>>2]<0.0){g[d>>2]=-+g[d>>2];g[h>>2]=-1.0}c[f>>2]=~~+M(+(+g[d>>2]*25.0+.5));g[d>>2]=+g[d>>2]-+(c[f>>2]|0)*.03999999910593033;g[j>>2]=+g[19812+(c[f>>2]<<2)>>2];g[e>>2]=1.0-+g[j>>2]*+g[j>>2];g[j>>2]=+g[j>>2]+ +g[d>>2]*+g[e>>2]*(1.0-+g[j>>2]*+g[d>>2]);g[b>>2]=+g[h>>2]*+g[j>>2];a=+g[b>>2];i=k;return +a}function fj(){var a=0;if(!(c[7632]|0))a=30572;else a=c[(fa()|0)+64>>2]|0;return a|0}function gj(a){a=+a;var b=0;b=(g[k>>2]=a,c[k>>2]|0);if((b&2130706432)>>>0<=1249902592){b=(b|0)<0;a=b?a+-8388608.0+8388608.0:a+8388608.0+-8388608.0;if(a==0.0)a=b?-0.0:0.0}return +a}function hj(a){a=+a;var b=0,d=0,e=0,f=0,g=0.0,i=0.0,j=0.0,l=0.0,m=0.0;h[k>>3]=a;d=c[k>>2]|0;b=c[k+4>>2]|0;e=(b|0)<0;do if(e|b>>>0<1048576){g=+N(+a);h[k>>3]=g;if((c[k>>2]|0)==0&(c[k+4>>2]|0)==0){a=-1.0/(a*a);break}if(e){a=(a-a)/0.0;break}else{h[k>>3]=a*18014398509481984.0;b=c[k+4>>2]|0;e=c[k>>2]|0;d=-1077;f=9;break}}else if(b>>>0<=2146435071)if((d|0)==0&0==0&(b|0)==1072693248)a=0.0;else{e=d;d=-1023;f=9}while(0);if((f|0)==9){f=b+614242|0;c[k>>2]=e;c[k+4>>2]=(f&1048575)+1072079006;j=+h[k>>3]+-1.0;i=j*(j*.5);l=j/(j+2.0);m=l*l;a=m*m;h[k>>3]=j-i;e=c[k+4>>2]|0;c[k>>2]=0;c[k+4>>2]=e;g=+h[k>>3];a=j-g-i+l*(i+(a*(a*(a*.15313837699209373+.22222198432149784)+.3999999999940942)+m*(a*(a*(a*.14798198605116586+.1818357216161805)+.2857142874366239)+.6666666666666735)));m=g*.4342944818781689;i=+(d+(f>>>20)|0);l=i*.30102999566361177;j=l+m;a=j+(m+(l-j)+(a*.4342944818781689+(i*3.694239077158931e-13+(g+a)*2.5082946711645275e-11)))}return +a}function ij(a){a=+a;return ~~+gj(a)|0}function jj(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0;do if(a>>>0<245){o=a>>>0<11?16:a+11&-8;a=o>>>3;j=c[7644]|0;b=j>>>a;if(b&3|0){b=(b&1^1)+a|0;d=30616+(b<<1<<2)|0;e=d+8|0;f=c[e>>2]|0;g=f+8|0;h=c[g>>2]|0;do if((d|0)!=(h|0)){if(h>>>0<(c[7648]|0)>>>0)ga();a=h+12|0;if((c[a>>2]|0)==(f|0)){c[a>>2]=d;c[e>>2]=h;break}else ga()}else c[7644]=j&~(1<<b);while(0);L=b<<3;c[f+4>>2]=L|3;L=f+L+4|0;c[L>>2]=c[L>>2]|1;L=g;return L|0}h=c[7646]|0;if(o>>>0>h>>>0){if(b|0){d=2<<a;d=b<<a&(d|0-d);d=(d&0-d)+-1|0;i=d>>>12&16;d=d>>>i;f=d>>>5&8;d=d>>>f;g=d>>>2&4;d=d>>>g;e=d>>>1&2;d=d>>>e;b=d>>>1&1;b=(f|i|g|e|b)+(d>>>b)|0;d=30616+(b<<1<<2)|0;e=d+8|0;g=c[e>>2]|0;i=g+8|0;f=c[i>>2]|0;do if((d|0)!=(f|0)){if(f>>>0<(c[7648]|0)>>>0)ga();a=f+12|0;if((c[a>>2]|0)==(g|0)){c[a>>2]=d;c[e>>2]=f;k=c[7646]|0;break}else ga()}else{c[7644]=j&~(1<<b);k=h}while(0);h=(b<<3)-o|0;c[g+4>>2]=o|3;e=g+o|0;c[e+4>>2]=h|1;c[e+h>>2]=h;if(k|0){f=c[7649]|0;b=k>>>3;d=30616+(b<<1<<2)|0;a=c[7644]|0;b=1<<b;if(a&b){a=d+8|0;b=c[a>>2]|0;if(b>>>0<(c[7648]|0)>>>0)ga();else{l=a;m=b}}else{c[7644]=a|b;l=d+8|0;m=d}c[l>>2]=f;c[m+12>>2]=f;c[f+8>>2]=m;c[f+12>>2]=d}c[7646]=h;c[7649]=e;L=i;return L|0}a=c[7645]|0;if(a){d=(a&0-a)+-1|0;K=d>>>12&16;d=d>>>K;J=d>>>5&8;d=d>>>J;L=d>>>2&4;d=d>>>L;b=d>>>1&2;d=d>>>b;e=d>>>1&1;e=c[30880+((J|K|L|b|e)+(d>>>e)<<2)>>2]|0;d=(c[e+4>>2]&-8)-o|0;b=e;while(1){a=c[b+16>>2]|0;if(!a){a=c[b+20>>2]|0;if(!a){j=e;break}}b=(c[a+4>>2]&-8)-o|0;L=b>>>0<d>>>0;d=L?b:d;b=a;e=L?a:e}g=c[7648]|0;if(j>>>0<g>>>0)ga();i=j+o|0;if(j>>>0>=i>>>0)ga();h=c[j+24>>2]|0;e=c[j+12>>2]|0;do if((e|0)==(j|0)){b=j+20|0;a=c[b>>2]|0;if(!a){b=j+16|0;a=c[b>>2]|0;if(!a){n=0;break}}while(1){e=a+20|0;f=c[e>>2]|0;if(f|0){a=f;b=e;continue}e=a+16|0;f=c[e>>2]|0;if(!f)break;else{a=f;b=e}}if(b>>>0<g>>>0)ga();else{c[b>>2]=0;n=a;break}}else{f=c[j+8>>2]|0;if(f>>>0<g>>>0)ga();a=f+12|0;if((c[a>>2]|0)!=(j|0))ga();b=e+8|0;if((c[b>>2]|0)==(j|0)){c[a>>2]=e;c[b>>2]=f;n=e;break}else ga()}while(0);do if(h|0){a=c[j+28>>2]|0;b=30880+(a<<2)|0;if((j|0)==(c[b>>2]|0)){c[b>>2]=n;if(!n){c[7645]=c[7645]&~(1<<a);break}}else{if(h>>>0<(c[7648]|0)>>>0)ga();a=h+16|0;if((c[a>>2]|0)==(j|0))c[a>>2]=n;else c[h+20>>2]=n;if(!n)break}b=c[7648]|0;if(n>>>0<b>>>0)ga();c[n+24>>2]=h;a=c[j+16>>2]|0;do if(a|0)if(a>>>0<b>>>0)ga();else{c[n+16>>2]=a;c[a+24>>2]=n;break}while(0);a=c[j+20>>2]|0;if(a|0)if(a>>>0<(c[7648]|0)>>>0)ga();else{c[n+20>>2]=a;c[a+24>>2]=n;break}}while(0);if(d>>>0<16){L=d+o|0;c[j+4>>2]=L|3;L=j+L+4|0;c[L>>2]=c[L>>2]|1}else{c[j+4>>2]=o|3;c[i+4>>2]=d|1;c[i+d>>2]=d;a=c[7646]|0;if(a|0){f=c[7649]|0;b=a>>>3;e=30616+(b<<1<<2)|0;a=c[7644]|0;b=1<<b;if(a&b){a=e+8|0;b=c[a>>2]|0;if(b>>>0<(c[7648]|0)>>>0)ga();else{p=a;q=b}}else{c[7644]=a|b;p=e+8|0;q=e}c[p>>2]=f;c[q+12>>2]=f;c[f+8>>2]=q;c[f+12>>2]=e}c[7646]=d;c[7649]=i}L=j+8|0;return L|0}}}else if(a>>>0<=4294967231){a=a+11|0;o=a&-8;j=c[7645]|0;if(j){d=0-o|0;a=a>>>8;if(a)if(o>>>0>16777215)i=31;else{q=(a+1048320|0)>>>16&8;E=a<<q;p=(E+520192|0)>>>16&4;E=E<<p;i=(E+245760|0)>>>16&2;i=14-(p|q|i)+(E<<i>>>15)|0;i=o>>>(i+7|0)&1|i<<1}else i=0;b=c[30880+(i<<2)>>2]|0;a:do if(!b){a=0;b=0;E=86}else{f=d;a=0;g=o<<((i|0)==31?0:25-(i>>>1)|0);h=b;b=0;while(1){e=c[h+4>>2]&-8;d=e-o|0;if(d>>>0<f>>>0)if((e|0)==(o|0)){a=h;b=h;E=90;break a}else b=h;else d=f;e=c[h+20>>2]|0;h=c[h+16+(g>>>31<<2)>>2]|0;a=(e|0)==0|(e|0)==(h|0)?a:e;e=(h|0)==0;if(e){E=86;break}else{f=d;g=g<<(e&1^1)}}}while(0);if((E|0)==86){if((a|0)==0&(b|0)==0){a=2<<i;a=j&(a|0-a);if(!a)break;q=(a&0-a)+-1|0;m=q>>>12&16;q=q>>>m;l=q>>>5&8;q=q>>>l;n=q>>>2&4;q=q>>>n;p=q>>>1&2;q=q>>>p;a=q>>>1&1;a=c[30880+((l|m|n|p|a)+(q>>>a)<<2)>>2]|0}if(!a){i=d;j=b}else E=90}if((E|0)==90)while(1){E=0;q=(c[a+4>>2]&-8)-o|0;e=q>>>0<d>>>0;d=e?q:d;b=e?a:b;e=c[a+16>>2]|0;if(e|0){a=e;E=90;continue}a=c[a+20>>2]|0;if(!a){i=d;j=b;break}else E=90}if((j|0)!=0?i>>>0<((c[7646]|0)-o|0)>>>0:0){f=c[7648]|0;if(j>>>0<f>>>0)ga();h=j+o|0;if(j>>>0>=h>>>0)ga();g=c[j+24>>2]|0;d=c[j+12>>2]|0;do if((d|0)==(j|0)){b=j+20|0;a=c[b>>2]|0;if(!a){b=j+16|0;a=c[b>>2]|0;if(!a){s=0;break}}while(1){d=a+20|0;e=c[d>>2]|0;if(e|0){a=e;b=d;continue}d=a+16|0;e=c[d>>2]|0;if(!e)break;else{a=e;b=d}}if(b>>>0<f>>>0)ga();else{c[b>>2]=0;s=a;break}}else{e=c[j+8>>2]|0;if(e>>>0<f>>>0)ga();a=e+12|0;if((c[a>>2]|0)!=(j|0))ga();b=d+8|0;if((c[b>>2]|0)==(j|0)){c[a>>2]=d;c[b>>2]=e;s=d;break}else ga()}while(0);do if(g|0){a=c[j+28>>2]|0;b=30880+(a<<2)|0;if((j|0)==(c[b>>2]|0)){c[b>>2]=s;if(!s){c[7645]=c[7645]&~(1<<a);break}}else{if(g>>>0<(c[7648]|0)>>>0)ga();a=g+16|0;if((c[a>>2]|0)==(j|0))c[a>>2]=s;else c[g+20>>2]=s;if(!s)break}b=c[7648]|0;if(s>>>0<b>>>0)ga();c[s+24>>2]=g;a=c[j+16>>2]|0;do if(a|0)if(a>>>0<b>>>0)ga();else{c[s+16>>2]=a;c[a+24>>2]=s;break}while(0);a=c[j+20>>2]|0;if(a|0)if(a>>>0<(c[7648]|0)>>>0)ga();else{c[s+20>>2]=a;c[a+24>>2]=s;break}}while(0);do if(i>>>0>=16){c[j+4>>2]=o|3;c[h+4>>2]=i|1;c[h+i>>2]=i;a=i>>>3;if(i>>>0<256){d=30616+(a<<1<<2)|0;b=c[7644]|0;a=1<<a;if(b&a){a=d+8|0;b=c[a>>2]|0;if(b>>>0<(c[7648]|0)>>>0)ga();else{u=a;v=b}}else{c[7644]=b|a;u=d+8|0;v=d}c[u>>2]=h;c[v+12>>2]=h;c[h+8>>2]=v;c[h+12>>2]=d;break}a=i>>>8;if(a)if(i>>>0>16777215)d=31;else{K=(a+1048320|0)>>>16&8;L=a<<K;J=(L+520192|0)>>>16&4;L=L<<J;d=(L+245760|0)>>>16&2;d=14-(J|K|d)+(L<<d>>>15)|0;d=i>>>(d+7|0)&1|d<<1}else d=0;e=30880+(d<<2)|0;c[h+28>>2]=d;a=h+16|0;c[a+4>>2]=0;c[a>>2]=0;a=c[7645]|0;b=1<<d;if(!(a&b)){c[7645]=a|b;c[e>>2]=h;c[h+24>>2]=e;c[h+12>>2]=h;c[h+8>>2]=h;break}f=i<<((d|0)==31?0:25-(d>>>1)|0);a=c[e>>2]|0;while(1){if((c[a+4>>2]&-8|0)==(i|0)){d=a;E=148;break}b=a+16+(f>>>31<<2)|0;d=c[b>>2]|0;if(!d){E=145;break}else{f=f<<1;a=d}}if((E|0)==145)if(b>>>0<(c[7648]|0)>>>0)ga();else{c[b>>2]=h;c[h+24>>2]=a;c[h+12>>2]=h;c[h+8>>2]=h;break}else if((E|0)==148){a=d+8|0;b=c[a>>2]|0;L=c[7648]|0;if(b>>>0>=L>>>0&d>>>0>=L>>>0){c[b+12>>2]=h;c[a>>2]=h;c[h+8>>2]=b;c[h+12>>2]=d;c[h+24>>2]=0;break}else ga()}}else{L=i+o|0;c[j+4>>2]=L|3;L=j+L+4|0;c[L>>2]=c[L>>2]|1}while(0);L=j+8|0;return L|0}}}else o=-1;while(0);d=c[7646]|0;if(d>>>0>=o>>>0){a=d-o|0;b=c[7649]|0;if(a>>>0>15){L=b+o|0;c[7649]=L;c[7646]=a;c[L+4>>2]=a|1;c[L+a>>2]=a;c[b+4>>2]=o|3}else{c[7646]=0;c[7649]=0;c[b+4>>2]=d|3;L=b+d+4|0;c[L>>2]=c[L>>2]|1}L=b+8|0;return L|0}a=c[7647]|0;if(a>>>0>o>>>0){J=a-o|0;c[7647]=J;L=c[7650]|0;K=L+o|0;c[7650]=K;c[K+4>>2]=J|1;c[L+4>>2]=o|3;L=L+8|0;return L|0}do if(!(c[7762]|0)){a=oa(30)|0;if(!(a+-1&a)){c[7764]=a;c[7763]=a;c[7765]=-1;c[7766]=-1;c[7767]=0;c[7755]=0;c[7762]=(ka(0)|0)&-16^1431655768;break}else ga()}while(0);h=o+48|0;g=c[7764]|0;i=o+47|0;f=g+i|0;g=0-g|0;j=f&g;if(j>>>0<=o>>>0){L=0;return L|0}a=c[7754]|0;if(a|0?(u=c[7752]|0,v=u+j|0,v>>>0<=u>>>0|v>>>0>a>>>0):0){L=0;return L|0}b:do if(!(c[7755]&4)){a=c[7650]|0;c:do if(a){d=31024;while(1){b=c[d>>2]|0;if(b>>>0<=a>>>0?(r=d+4|0,(b+(c[r>>2]|0)|0)>>>0>a>>>0):0){e=d;d=r;break}d=c[d+8>>2]|0;if(!d){E=173;break c}}a=f-(c[7647]|0)&g;if(a>>>0<2147483647){b=ja(a|0)|0;if((b|0)==((c[e>>2]|0)+(c[d>>2]|0)|0)){if((b|0)!=(-1|0)){h=b;f=a;E=193;break b}}else E=183}}else E=173;while(0);do if((E|0)==173?(t=ja(0)|0,(t|0)!=(-1|0)):0){a=t;b=c[7763]|0;d=b+-1|0;if(!(d&a))a=j;else a=j-a+(d+a&0-b)|0;b=c[7752]|0;d=b+a|0;if(a>>>0>o>>>0&a>>>0<2147483647){v=c[7754]|0;if(v|0?d>>>0<=b>>>0|d>>>0>v>>>0:0)break;b=ja(a|0)|0;if((b|0)==(t|0)){h=t;f=a;E=193;break b}else E=183}}while(0);d:do if((E|0)==183){d=0-a|0;do if(h>>>0>a>>>0&(a>>>0<2147483647&(b|0)!=(-1|0))?(w=c[7764]|0,w=i-a+w&0-w,w>>>0<2147483647):0)if((ja(w|0)|0)==(-1|0)){ja(d|0)|0;break d}else{a=w+a|0;break}while(0);if((b|0)!=(-1|0)){h=b;f=a;E=193;break b}}while(0);c[7755]=c[7755]|4;E=190}else E=190;while(0);if((((E|0)==190?j>>>0<2147483647:0)?(x=ja(j|0)|0,y=ja(0)|0,x>>>0<y>>>0&((x|0)!=(-1|0)&(y|0)!=(-1|0))):0)?(z=y-x|0,z>>>0>(o+40|0)>>>0):0){h=x;f=z;E=193}if((E|0)==193){a=(c[7752]|0)+f|0;c[7752]=a;if(a>>>0>(c[7753]|0)>>>0)c[7753]=a;i=c[7650]|0;do if(i){e=31024;do{a=c[e>>2]|0;b=e+4|0;d=c[b>>2]|0;if((h|0)==(a+d|0)){A=a;B=b;C=d;D=e;E=203;break}e=c[e+8>>2]|0}while((e|0)!=0);if(((E|0)==203?(c[D+12>>2]&8|0)==0:0)?i>>>0<h>>>0&i>>>0>=A>>>0:0){c[B>>2]=C+f;L=i+8|0;L=(L&7|0)==0?0:0-L&7;K=i+L|0;L=f-L+(c[7647]|0)|0;c[7650]=K;c[7647]=L;c[K+4>>2]=L|1;c[K+L+4>>2]=40;c[7651]=c[7766];break}a=c[7648]|0;if(h>>>0<a>>>0){c[7648]=h;j=h}else j=a;d=h+f|0;a=31024;while(1){if((c[a>>2]|0)==(d|0)){b=a;E=211;break}a=c[a+8>>2]|0;if(!a){b=31024;break}}if((E|0)==211)if(!(c[a+12>>2]&8)){c[b>>2]=h;l=a+4|0;c[l>>2]=(c[l>>2]|0)+f;l=h+8|0;l=h+((l&7|0)==0?0:0-l&7)|0;a=d+8|0;a=d+((a&7|0)==0?0:0-a&7)|0;k=l+o|0;g=a-l-o|0;c[l+4>>2]=o|3;do if((a|0)!=(i|0)){if((a|0)==(c[7649]|0)){L=(c[7646]|0)+g|0;c[7646]=L;c[7649]=k;c[k+4>>2]=L|1;c[k+L>>2]=L;break}b=c[a+4>>2]|0;if((b&3|0)==1){i=b&-8;f=b>>>3;e:do if(b>>>0>=256){h=c[a+24>>2]|0;e=c[a+12>>2]|0;do if((e|0)==(a|0)){d=a+16|0;e=d+4|0;b=c[e>>2]|0;if(!b){b=c[d>>2]|0;if(!b){J=0;break}}else d=e;while(1){e=b+20|0;f=c[e>>2]|0;if(f|0){b=f;d=e;continue}e=b+16|0;f=c[e>>2]|0;if(!f)break;else{b=f;d=e}}if(d>>>0<j>>>0)ga();else{c[d>>2]=0;J=b;break}}else{f=c[a+8>>2]|0;if(f>>>0<j>>>0)ga();b=f+12|0;if((c[b>>2]|0)!=(a|0))ga();d=e+8|0;if((c[d>>2]|0)==(a|0)){c[b>>2]=e;c[d>>2]=f;J=e;break}else ga()}while(0);if(!h)break;b=c[a+28>>2]|0;d=30880+(b<<2)|0;do if((a|0)!=(c[d>>2]|0)){if(h>>>0<(c[7648]|0)>>>0)ga();b=h+16|0;if((c[b>>2]|0)==(a|0))c[b>>2]=J;else c[h+20>>2]=J;if(!J)break e}else{c[d>>2]=J;if(J|0)break;c[7645]=c[7645]&~(1<<b);break e}while(0);e=c[7648]|0;if(J>>>0<e>>>0)ga();c[J+24>>2]=h;b=a+16|0;d=c[b>>2]|0;do if(d|0)if(d>>>0<e>>>0)ga();else{c[J+16>>2]=d;c[d+24>>2]=J;break}while(0);b=c[b+4>>2]|0;if(!b)break;if(b>>>0<(c[7648]|0)>>>0)ga();else{c[J+20>>2]=b;c[b+24>>2]=J;break}}else{d=c[a+8>>2]|0;e=c[a+12>>2]|0;b=30616+(f<<1<<2)|0;do if((d|0)!=(b|0)){if(d>>>0<j>>>0)ga();if((c[d+12>>2]|0)==(a|0))break;ga()}while(0);if((e|0)==(d|0)){c[7644]=c[7644]&~(1<<f);break}do if((e|0)==(b|0))G=e+8|0;else{if(e>>>0<j>>>0)ga();b=e+8|0;if((c[b>>2]|0)==(a|0)){G=b;break}ga()}while(0);c[d+12>>2]=e;c[G>>2]=d}while(0);a=a+i|0;g=i+g|0}a=a+4|0;c[a>>2]=c[a>>2]&-2;c[k+4>>2]=g|1;c[k+g>>2]=g;a=g>>>3;if(g>>>0<256){d=30616+(a<<1<<2)|0;b=c[7644]|0;a=1<<a;do if(!(b&a)){c[7644]=b|a;K=d+8|0;L=d}else{a=d+8|0;b=c[a>>2]|0;if(b>>>0>=(c[7648]|0)>>>0){K=a;L=b;break}ga()}while(0);c[K>>2]=k;c[L+12>>2]=k;c[k+8>>2]=L;c[k+12>>2]=d;break}a=g>>>8;do if(!a)d=0;else{if(g>>>0>16777215){d=31;break}K=(a+1048320|0)>>>16&8;L=a<<K;J=(L+520192|0)>>>16&4;L=L<<J;d=(L+245760|0)>>>16&2;d=14-(J|K|d)+(L<<d>>>15)|0;d=g>>>(d+7|0)&1|d<<1}while(0);e=30880+(d<<2)|0;c[k+28>>2]=d;a=k+16|0;c[a+4>>2]=0;c[a>>2]=0;a=c[7645]|0;b=1<<d;if(!(a&b)){c[7645]=a|b;c[e>>2]=k;c[k+24>>2]=e;c[k+12>>2]=k;c[k+8>>2]=k;break}f=g<<((d|0)==31?0:25-(d>>>1)|0);a=c[e>>2]|0;while(1){if((c[a+4>>2]&-8|0)==(g|0)){d=a;E=281;break}b=a+16+(f>>>31<<2)|0;d=c[b>>2]|0;if(!d){E=278;break}else{f=f<<1;a=d}}if((E|0)==278)if(b>>>0<(c[7648]|0)>>>0)ga();else{c[b>>2]=k;c[k+24>>2]=a;c[k+12>>2]=k;c[k+8>>2]=k;break}else if((E|0)==281){a=d+8|0;b=c[a>>2]|0;L=c[7648]|0;if(b>>>0>=L>>>0&d>>>0>=L>>>0){c[b+12>>2]=k;c[a>>2]=k;c[k+8>>2]=b;c[k+12>>2]=d;c[k+24>>2]=0;break}else ga()}}else{L=(c[7647]|0)+g|0;c[7647]=L;c[7650]=k;c[k+4>>2]=L|1}while(0);L=l+8|0;return L|0}else b=31024;while(1){a=c[b>>2]|0;if(a>>>0<=i>>>0?(F=a+(c[b+4>>2]|0)|0,F>>>0>i>>>0):0){b=F;break}b=c[b+8>>2]|0}g=b+-47|0;d=g+8|0;d=g+((d&7|0)==0?0:0-d&7)|0;g=i+16|0;d=d>>>0<g>>>0?i:d;a=d+8|0;e=h+8|0;e=(e&7|0)==0?0:0-e&7;L=h+e|0;e=f+-40-e|0;c[7650]=L;c[7647]=e;c[L+4>>2]=e|1;c[L+e+4>>2]=40;c[7651]=c[7766];e=d+4|0;c[e>>2]=27;c[a>>2]=c[7756];c[a+4>>2]=c[7757];c[a+8>>2]=c[7758];c[a+12>>2]=c[7759];c[7756]=h;c[7757]=f;c[7759]=0;c[7758]=a;a=d+24|0;do{a=a+4|0;c[a>>2]=7}while((a+4|0)>>>0<b>>>0);if((d|0)!=(i|0)){h=d-i|0;c[e>>2]=c[e>>2]&-2;c[i+4>>2]=h|1;c[d>>2]=h;a=h>>>3;if(h>>>0<256){d=30616+(a<<1<<2)|0;b=c[7644]|0;a=1<<a;if(b&a){a=d+8|0;b=c[a>>2]|0;if(b>>>0<(c[7648]|0)>>>0)ga();else{H=a;I=b}}else{c[7644]=b|a;H=d+8|0;I=d}c[H>>2]=i;c[I+12>>2]=i;c[i+8>>2]=I;c[i+12>>2]=d;break}a=h>>>8;if(a)if(h>>>0>16777215)d=31;else{K=(a+1048320|0)>>>16&8;L=a<<K;J=(L+520192|0)>>>16&4;L=L<<J;d=(L+245760|0)>>>16&2;d=14-(J|K|d)+(L<<d>>>15)|0;d=h>>>(d+7|0)&1|d<<1}else d=0;f=30880+(d<<2)|0;c[i+28>>2]=d;c[i+20>>2]=0;c[g>>2]=0;a=c[7645]|0;b=1<<d;if(!(a&b)){c[7645]=a|b;c[f>>2]=i;c[i+24>>2]=f;c[i+12>>2]=i;c[i+8>>2]=i;break}e=h<<((d|0)==31?0:25-(d>>>1)|0);a=c[f>>2]|0;while(1){if((c[a+4>>2]&-8|0)==(h|0)){d=a;E=307;break}b=a+16+(e>>>31<<2)|0;d=c[b>>2]|0;if(!d){E=304;break}else{e=e<<1;a=d}}if((E|0)==304)if(b>>>0<(c[7648]|0)>>>0)ga();else{c[b>>2]=i;c[i+24>>2]=a;c[i+12>>2]=i;c[i+8>>2]=i;break}else if((E|0)==307){a=d+8|0;b=c[a>>2]|0;L=c[7648]|0;if(b>>>0>=L>>>0&d>>>0>=L>>>0){c[b+12>>2]=i;c[a>>2]=i;c[i+8>>2]=b;c[i+12>>2]=d;c[i+24>>2]=0;break}else ga()}}}else{L=c[7648]|0;if((L|0)==0|h>>>0<L>>>0)c[7648]=h;c[7756]=h;c[7757]=f;c[7759]=0;c[7653]=c[7762];c[7652]=-1;a=0;do{L=30616+(a<<1<<2)|0;c[L+12>>2]=L;c[L+8>>2]=L;a=a+1|0}while((a|0)!=32);L=h+8|0;L=(L&7|0)==0?0:0-L&7;K=h+L|0;L=f+-40-L|0;c[7650]=K;c[7647]=L;c[K+4>>2]=L|1;c[K+L+4>>2]=40;c[7651]=c[7766]}while(0);a=c[7647]|0;if(a>>>0>o>>>0){J=a-o|0;c[7647]=J;L=c[7650]|0;K=L+o|0;c[7650]=K;c[K+4>>2]=J|1;c[L+4>>2]=o|3;L=L+8|0;return L|0}}c[(fj()|0)>>2]=12;L=0;return L|0}function kj(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;if(!a)return;d=a+-8|0;h=c[7648]|0;if(d>>>0<h>>>0)ga();a=c[a+-4>>2]|0;b=a&3;if((b|0)==1)ga();e=a&-8;m=d+e|0;do if(!(a&1)){a=c[d>>2]|0;if(!b)return;k=d+(0-a)|0;j=a+e|0;if(k>>>0<h>>>0)ga();if((k|0)==(c[7649]|0)){a=m+4|0;b=c[a>>2]|0;if((b&3|0)!=3){q=k;g=j;break}c[7646]=j;c[a>>2]=b&-2;c[k+4>>2]=j|1;c[k+j>>2]=j;return}e=a>>>3;if(a>>>0<256){b=c[k+8>>2]|0;d=c[k+12>>2]|0;a=30616+(e<<1<<2)|0;if((b|0)!=(a|0)){if(b>>>0<h>>>0)ga();if((c[b+12>>2]|0)!=(k|0))ga()}if((d|0)==(b|0)){c[7644]=c[7644]&~(1<<e);q=k;g=j;break}if((d|0)!=(a|0)){if(d>>>0<h>>>0)ga();a=d+8|0;if((c[a>>2]|0)==(k|0))f=a;else ga()}else f=d+8|0;c[b+12>>2]=d;c[f>>2]=b;q=k;g=j;break}f=c[k+24>>2]|0;d=c[k+12>>2]|0;do if((d|0)==(k|0)){b=k+16|0;d=b+4|0;a=c[d>>2]|0;if(!a){a=c[b>>2]|0;if(!a){i=0;break}}else b=d;while(1){d=a+20|0;e=c[d>>2]|0;if(e|0){a=e;b=d;continue}d=a+16|0;e=c[d>>2]|0;if(!e)break;else{a=e;b=d}}if(b>>>0<h>>>0)ga();else{c[b>>2]=0;i=a;break}}else{e=c[k+8>>2]|0;if(e>>>0<h>>>0)ga();a=e+12|0;if((c[a>>2]|0)!=(k|0))ga();b=d+8|0;if((c[b>>2]|0)==(k|0)){c[a>>2]=d;c[b>>2]=e;i=d;break}else ga()}while(0);if(f){a=c[k+28>>2]|0;b=30880+(a<<2)|0;if((k|0)==(c[b>>2]|0)){c[b>>2]=i;if(!i){c[7645]=c[7645]&~(1<<a);q=k;g=j;break}}else{if(f>>>0<(c[7648]|0)>>>0)ga();a=f+16|0;if((c[a>>2]|0)==(k|0))c[a>>2]=i;else c[f+20>>2]=i;if(!i){q=k;g=j;break}}d=c[7648]|0;if(i>>>0<d>>>0)ga();c[i+24>>2]=f;a=k+16|0;b=c[a>>2]|0;do if(b|0)if(b>>>0<d>>>0)ga();else{c[i+16>>2]=b;c[b+24>>2]=i;break}while(0);a=c[a+4>>2]|0;if(a)if(a>>>0<(c[7648]|0)>>>0)ga();else{c[i+20>>2]=a;c[a+24>>2]=i;q=k;g=j;break}else{q=k;g=j}}else{q=k;g=j}}else{q=d;g=e}while(0);if(q>>>0>=m>>>0)ga();a=m+4|0;b=c[a>>2]|0;if(!(b&1))ga();if(!(b&2)){if((m|0)==(c[7650]|0)){p=(c[7647]|0)+g|0;c[7647]=p;c[7650]=q;c[q+4>>2]=p|1;if((q|0)!=(c[7649]|0))return;c[7649]=0;c[7646]=0;return}if((m|0)==(c[7649]|0)){p=(c[7646]|0)+g|0;c[7646]=p;c[7649]=q;c[q+4>>2]=p|1;c[q+p>>2]=p;return}g=(b&-8)+g|0;e=b>>>3;do if(b>>>0>=256){f=c[m+24>>2]|0;a=c[m+12>>2]|0;do if((a|0)==(m|0)){b=m+16|0;d=b+4|0;a=c[d>>2]|0;if(!a){a=c[b>>2]|0;if(!a){n=0;break}}else b=d;while(1){d=a+20|0;e=c[d>>2]|0;if(e|0){a=e;b=d;continue}d=a+16|0;e=c[d>>2]|0;if(!e)break;else{a=e;b=d}}if(b>>>0<(c[7648]|0)>>>0)ga();else{c[b>>2]=0;n=a;break}}else{b=c[m+8>>2]|0;if(b>>>0<(c[7648]|0)>>>0)ga();d=b+12|0;if((c[d>>2]|0)!=(m|0))ga();e=a+8|0;if((c[e>>2]|0)==(m|0)){c[d>>2]=a;c[e>>2]=b;n=a;break}else ga()}while(0);if(f|0){a=c[m+28>>2]|0;b=30880+(a<<2)|0;if((m|0)==(c[b>>2]|0)){c[b>>2]=n;if(!n){c[7645]=c[7645]&~(1<<a);break}}else{if(f>>>0<(c[7648]|0)>>>0)ga();a=f+16|0;if((c[a>>2]|0)==(m|0))c[a>>2]=n;else c[f+20>>2]=n;if(!n)break}d=c[7648]|0;if(n>>>0<d>>>0)ga();c[n+24>>2]=f;a=m+16|0;b=c[a>>2]|0;do if(b|0)if(b>>>0<d>>>0)ga();else{c[n+16>>2]=b;c[b+24>>2]=n;break}while(0);a=c[a+4>>2]|0;if(a|0)if(a>>>0<(c[7648]|0)>>>0)ga();else{c[n+20>>2]=a;c[a+24>>2]=n;break}}}else{b=c[m+8>>2]|0;d=c[m+12>>2]|0;a=30616+(e<<1<<2)|0;if((b|0)!=(a|0)){if(b>>>0<(c[7648]|0)>>>0)ga();if((c[b+12>>2]|0)!=(m|0))ga()}if((d|0)==(b|0)){c[7644]=c[7644]&~(1<<e);break}if((d|0)!=(a|0)){if(d>>>0<(c[7648]|0)>>>0)ga();a=d+8|0;if((c[a>>2]|0)==(m|0))l=a;else ga()}else l=d+8|0;c[b+12>>2]=d;c[l>>2]=b}while(0);c[q+4>>2]=g|1;c[q+g>>2]=g;if((q|0)==(c[7649]|0)){c[7646]=g;return}}else{c[a>>2]=b&-2;c[q+4>>2]=g|1;c[q+g>>2]=g}a=g>>>3;if(g>>>0<256){d=30616+(a<<1<<2)|0;b=c[7644]|0;a=1<<a;if(b&a){a=d+8|0;b=c[a>>2]|0;if(b>>>0<(c[7648]|0)>>>0)ga();else{o=a;p=b}}else{c[7644]=b|a;o=d+8|0;p=d}c[o>>2]=q;c[p+12>>2]=q;c[q+8>>2]=p;c[q+12>>2]=d;return}a=g>>>8;if(a)if(g>>>0>16777215)d=31;else{o=(a+1048320|0)>>>16&8;p=a<<o;n=(p+520192|0)>>>16&4;p=p<<n;d=(p+245760|0)>>>16&2;d=14-(n|o|d)+(p<<d>>>15)|0;d=g>>>(d+7|0)&1|d<<1}else d=0;e=30880+(d<<2)|0;c[q+28>>2]=d;c[q+20>>2]=0;c[q+16>>2]=0;a=c[7645]|0;b=1<<d;do if(a&b){f=g<<((d|0)==31?0:25-(d>>>1)|0);a=c[e>>2]|0;while(1){if((c[a+4>>2]&-8|0)==(g|0)){d=a;e=130;break}b=a+16+(f>>>31<<2)|0;d=c[b>>2]|0;if(!d){e=127;break}else{f=f<<1;a=d}}if((e|0)==127)if(b>>>0<(c[7648]|0)>>>0)ga();else{c[b>>2]=q;c[q+24>>2]=a;c[q+12>>2]=q;c[q+8>>2]=q;break}else if((e|0)==130){a=d+8|0;b=c[a>>2]|0;p=c[7648]|0;if(b>>>0>=p>>>0&d>>>0>=p>>>0){c[b+12>>2]=q;c[a>>2]=q;c[q+8>>2]=b;c[q+12>>2]=d;c[q+24>>2]=0;break}else ga()}}else{c[7645]=a|b;c[e>>2]=q;c[q+24>>2]=e;c[q+12>>2]=q;c[q+8>>2]=q}while(0);q=(c[7652]|0)+-1|0;c[7652]=q;if(!q)a=31032;else return;while(1){a=c[a>>2]|0;if(!a)break;else a=a+8|0}c[7652]=-1;return}function lj(){}function mj(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;c=a+c>>>0;return (C=b+d+(c>>>0<a>>>0|0)>>>0,c|0)|0}function nj(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){C=b>>c;return a>>>c|(b&(1<<c)-1)<<32-c}C=(b|0)<0?-1:0;return b>>c-32|0}function oj(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;f=b+e|0;if((e|0)>=20){d=d&255;h=b&3;i=d|d<<8|d<<16|d<<24;g=f&~3;if(h){h=b+4-h|0;while((b|0)<(h|0)){a[b>>0]=d;b=b+1|0}}while((b|0)<(g|0)){c[b>>2]=i;b=b+4|0}}while((b|0)<(f|0)){a[b>>0]=d;b=b+1|0}return b-e|0}function pj(b,d,e){b=b|0;d=d|0;e=e|0;var f=0;if((e|0)>=4096)return ma(b|0,d|0,e|0)|0;f=b|0;if((b&3)==(d&3)){while(b&3){if(!e)return f|0;a[b>>0]=a[d>>0]|0;b=b+1|0;d=d+1|0;e=e-1|0}while((e|0)>=4){c[b>>2]=c[d>>2];b=b+4|0;d=d+4|0;e=e-4|0}}while((e|0)>0){a[b>>0]=a[d>>0]|0;b=b+1|0;d=d+1|0;e=e-1|0}return f|0}function qj(b,c,d){b=b|0;c=c|0;d=d|0;var e=0;if((c|0)<(b|0)&(b|0)<(c+d|0)){e=b;c=c+d|0;b=b+d|0;while((d|0)>0){b=b-1|0;c=c-1|0;d=d-1|0;a[b>>0]=a[c>>0]|0}b=e}else pj(b,c,d)|0;return b|0}function rj(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;d=b-d-(c>>>0>a>>>0|0)>>>0;return (C=d,a-c>>>0|0)|0}function sj(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){C=b<<c|(a&(1<<c)-1<<32-c)>>>32-c;return a<<c}C=a<<c-32;return 0}function tj(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){C=b>>>c;return a>>>c|(b&(1<<c)-1)<<32-c}C=0;return b>>>c-32|0}function uj(b){b=b|0;var c=0;c=a[m+(b&255)>>0]|0;if((c|0)<8)return c|0;c=a[m+(b>>8&255)>>0]|0;if((c|0)<8)return c+8|0;c=a[m+(b>>16&255)>>0]|0;if((c|0)<8)return c+16|0;return (a[m+(b>>>24)>>0]|0)+24|0}function vj(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0;f=a&65535;e=b&65535;c=_(e,f)|0;d=a>>>16;a=(c>>>16)+(_(e,d)|0)|0;e=b>>>16;b=_(e,f)|0;return (C=(a>>>16)+(_(e,d)|0)+(((a&65535)+b|0)>>>16)|0,a+b<<16|c&65535|0)|0}function wj(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;j=b>>31|((b|0)<0?-1:0)<<1;i=((b|0)<0?-1:0)>>31|((b|0)<0?-1:0)<<1;f=d>>31|((d|0)<0?-1:0)<<1;e=((d|0)<0?-1:0)>>31|((d|0)<0?-1:0)<<1;h=rj(j^a|0,i^b|0,j|0,i|0)|0;g=C;a=f^j;b=e^i;return rj((Bj(h,g,rj(f^c|0,e^d|0,f|0,e|0)|0,C,0)|0)^a|0,C^b|0,a|0,b|0)|0}function xj(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0;f=i;i=i+16|0;j=f|0;h=b>>31|((b|0)<0?-1:0)<<1;g=((b|0)<0?-1:0)>>31|((b|0)<0?-1:0)<<1;l=e>>31|((e|0)<0?-1:0)<<1;k=((e|0)<0?-1:0)>>31|((e|0)<0?-1:0)<<1;a=rj(h^a|0,g^b|0,h|0,g|0)|0;b=C;Bj(a,b,rj(l^d|0,k^e|0,l|0,k|0)|0,C,j)|0;e=rj(c[j>>2]^h|0,c[j+4>>2]^g|0,h|0,g|0)|0;d=C;i=f;return (C=d,e)|0}function yj(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;e=a;f=c;c=vj(e,f)|0;a=C;return (C=(_(b,f)|0)+(_(d,e)|0)+a|a&0,c|0|0)|0}function zj(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return Bj(a,b,c,d,0)|0}function Aj(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;g=i;i=i+16|0;f=g|0;Bj(a,b,d,e,f)|0;i=g;return (C=c[f+4>>2]|0,c[f>>2]|0)|0}function Bj(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;l=a;j=b;k=j;h=d;n=e;i=n;if(!k){g=(f|0)!=0;if(!i){if(g){c[f>>2]=(l>>>0)%(h>>>0);c[f+4>>2]=0}n=0;f=(l>>>0)/(h>>>0)>>>0;return (C=n,f)|0}else{if(!g){n=0;f=0;return (C=n,f)|0}c[f>>2]=a|0;c[f+4>>2]=b&0;n=0;f=0;return (C=n,f)|0}}g=(i|0)==0;do if(h){if(!g){g=(aa(i|0)|0)-(aa(k|0)|0)|0;if(g>>>0<=31){m=g+1|0;i=31-g|0;b=g-31>>31;h=m;a=l>>>(m>>>0)&b|k<<i;b=k>>>(m>>>0)&b;g=0;i=l<<i;break}if(!f){n=0;f=0;return (C=n,f)|0}c[f>>2]=a|0;c[f+4>>2]=j|b&0;n=0;f=0;return (C=n,f)|0}g=h-1|0;if(g&h|0){i=(aa(h|0)|0)+33-(aa(k|0)|0)|0;p=64-i|0;m=32-i|0;j=m>>31;o=i-32|0;b=o>>31;h=i;a=m-1>>31&k>>>(o>>>0)|(k<<m|l>>>(i>>>0))&b;b=b&k>>>(i>>>0);g=l<<p&j;i=(k<<p|l>>>(o>>>0))&j|l<<m&i-33>>31;break}if(f|0){c[f>>2]=g&l;c[f+4>>2]=0}if((h|0)==1){o=j|b&0;p=a|0|0;return (C=o,p)|0}else{p=uj(h|0)|0;o=k>>>(p>>>0)|0;p=k<<32-p|l>>>(p>>>0)|0;return (C=o,p)|0}}else{if(g){if(f|0){c[f>>2]=(k>>>0)%(h>>>0);c[f+4>>2]=0}o=0;p=(k>>>0)/(h>>>0)>>>0;return (C=o,p)|0}if(!l){if(f|0){c[f>>2]=0;c[f+4>>2]=(k>>>0)%(i>>>0)}o=0;p=(k>>>0)/(i>>>0)>>>0;return (C=o,p)|0}g=i-1|0;if(!(g&i)){if(f|0){c[f>>2]=a|0;c[f+4>>2]=g&k|b&0}o=0;p=k>>>((uj(i|0)|0)>>>0);return (C=o,p)|0}g=(aa(i|0)|0)-(aa(k|0)|0)|0;if(g>>>0<=30){b=g+1|0;i=31-g|0;h=b;a=k<<i|l>>>(b>>>0);b=k>>>(b>>>0);g=0;i=l<<i;break}if(!f){o=0;p=0;return (C=o,p)|0}c[f>>2]=a|0;c[f+4>>2]=j|b&0;o=0;p=0;return (C=o,p)|0}while(0);if(!h){k=i;j=0;i=0}else{m=d|0|0;l=n|e&0;k=mj(m|0,l|0,-1,-1)|0;d=C;j=i;i=0;do{e=j;j=g>>>31|j<<1;g=i|g<<1;e=a<<1|e>>>31|0;n=a>>>31|b<<1|0;rj(k|0,d|0,e|0,n|0)|0;p=C;o=p>>31|((p|0)<0?-1:0)<<1;i=o&1;a=rj(e|0,n|0,o&m|0,(((p|0)<0?-1:0)>>31|((p|0)<0?-1:0)<<1)&l|0)|0;b=C;h=h-1|0}while((h|0)!=0);k=j;j=0}h=0;if(f|0){c[f>>2]=a;c[f+4>>2]=b}o=(g|0)>>>31|(k|h)<<1|(h<<1|g>>>31)&0|j;p=(g<<1|0>>>31)&-2|i;return (C=o,p)|0}function Cj(a,b,c,d,e,f,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;qa[a&3](b|0,c|0,d|0,e|0,f|0,g|0,h|0)}function Dj(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;ba(0)} |
| | | |
| | | // EMSCRIPTEN_END_FUNCS |
| | | var qa=[Dj,yi,xi,Dj];return{_opus_decoder_get_size:ai,_opus_get_version_string:gb,_free:kj,_opus_encode_float:Ri,_opus_strerror:fb,_i64Add:mj,_memmove:qj,_opus_decoder_init:ci,_bitshift64Ashr:nj,_opus_encoder_get_size:ti,_memset:oj,_malloc:jj,_opus_decoder_ctl:si,_opus_encode:Qi,_opus_encoder_init:vi,_opus_decode:mi,_opus_packet_get_nb_samples:oi,_memcpy:pj,_opus_encoder_ctl:Si,_opus_decode_float:ri,runPostSets:lj,stackAlloc:ra,stackSave:sa,stackRestore:ta,establishStackSpace:ua,setThrew:va,setTempRet0:ya,getTempRet0:za,dynCall_viiiiiii:Cj}}) |
| | | |
| | | |
| | | // EMSCRIPTEN_END_ASM |
| | | (b.s,b.t,buffer);b._opus_decoder_get_size=Z._opus_decoder_get_size;b._opus_get_version_string=Z._opus_get_version_string;var va=b._free=Z._free; |
| | | b._opus_encode_float=Z._opus_encode_float;b._opus_strerror=Z._opus_strerror;var Pa=b._i64Add=Z._i64Add,Ua=b._memmove=Z._memmove;b._opus_decoder_init=Z._opus_decoder_init;var Qa=b._bitshift64Ashr=Z._bitshift64Ashr;b._opus_encoder_get_size=Z._opus_encoder_get_size;var Ra=b._memset=Z._memset,Q=b._malloc=Z._malloc;b._opus_packet_get_nb_samples=Z._opus_packet_get_nb_samples;b._opus_encode=Z._opus_encode;b._opus_encoder_init=Z._opus_encoder_init;b._opus_decode=Z._opus_decode;b._opus_decoder_ctl=Z._opus_decoder_ctl; |
| | | var Sa=b._memcpy=Z._memcpy;b._opus_encoder_ctl=Z._opus_encoder_ctl;b._opus_decode_float=Z._opus_decode_float;b.runPostSets=Z.runPostSets;b.dynCall_viiiiiii=Z.dynCall_viiiiiii;y.f=Z.stackAlloc;y.g=Z.stackSave;y.c=Z.stackRestore;y.I=Z.establishStackSpace;y.B=Z.setTempRet0;y.w=Z.getTempRet0;function w(a){this.name="ExitStatus";this.message="Program terminated with exit("+a+")";this.status=a}w.prototype=Error();w.prototype.constructor=w;var Wa=null,X=function Xa(){b.calledRun||Ya();b.calledRun||(X=Xa)}; |
| | | b.callMain=b.G=function(a){function c(){for(var a=0;3>a;a++)e.push(0)}a=a||[];T||(T=!0,V(Ea));var d=a.length+1,e=[O(Ka(b.thisProgram),"i8",0)];c();for(var g=0;g<d-1;g+=1)e.push(O(Ka(a[g]),"i8",0)),c();e.push(0);e=O(e,"i32",0);try{var k=b._main(d,e,0);Za(k,!0)}catch(h){if(!(h instanceof w))if("SimulateInfiniteLoop"==h)b.noExitRuntime=!0;else throw h&&"object"===typeof h&&h.stack&&b.m("exception thrown: "+[h,h.stack]),h;}finally{}}; |
| | | function Ya(a){function c(){if(!b.calledRun&&(b.calledRun=!0,!H)){T||(T=!0,V(Ea));V(Fa);if(b.onRuntimeInitialized)b.onRuntimeInitialized();b._main&&$a&&b.callMain(a);if(b.postRun)for("function"==typeof b.postRun&&(b.postRun=[b.postRun]);b.postRun.length;)Ja(b.postRun.shift());V(Ha)}}a=a||b.arguments;null===Wa&&(Wa=Date.now());if(!(0<W)){if(b.preRun)for("function"==typeof b.preRun&&(b.preRun=[b.preRun]);b.preRun.length;)Ia(b.preRun.shift());V(Da);0<W||b.calledRun||(b.setStatus?(b.setStatus("Running..."), |
| | | setTimeout(function(){setTimeout(function(){b.setStatus("")},1);c()},1)):c())}}b.run=b.run=Ya;function Za(a,c){if(!c||!b.noExitRuntime){if(!b.noExitRuntime&&(H=!0,x=void 0,V(Ga),b.onExit))b.onExit(a);r?process.exit(a):t&&"function"===typeof quit&&quit(a);throw new w(a);}}b.exit=b.exit=Za;var ab=[]; |
| | | function G(a){void 0!==a?(b.print(a),b.m(a),a=JSON.stringify(a)):a="";H=!0;var c="abort("+a+") at "+ta()+"\nIf this abort() is unexpected, build with -s ASSERTIONS=1 which can give more information.";ab&&ab.forEach(function(d){c=d(c,a)});throw c;}b.abort=b.abort=G;if(b.preInit)for("function"==typeof b.preInit&&(b.preInit=[b.preInit]);0<b.preInit.length;)b.preInit.pop()();var $a=!0;b.noInitialRun&&($a=!1);Ya(); |
| | | |
| | | |
| | | return Module; |
| | | }; |
| | | Module.instance = Module(); |
| New file |
| | |
| | | // æ¥å¿è®°å½å½æ° |
| | | export function log(message, type = 'info') { |
| | | // å°æ¶æ¯ææ¢è¡ç¬¦å岿å¤è¡ |
| | | const lines = message.split('\n'); |
| | | const now = new Date(); |
| | | // const timestamp = `[${now.toLocaleTimeString()}] `; |
| | | const timestamp = `[${now.toLocaleTimeString()}.${now.getMilliseconds().toString().padStart(3, '0')}] `; |
| | | |
| | | // æ£æ¥æ¯å¦å卿¥å¿å®¹å¨ |
| | | const logContainer = document.getElementById('logContainer'); |
| | | if (!logContainer) { |
| | | // 妿æ¥å¿å®¹å¨ä¸åå¨ï¼åªè¾åºå°æ§å¶å° |
| | | console.log(`[${type.toUpperCase()}] ${message}`); |
| | | return; |
| | | } |
| | | |
| | | // 为æ¯ä¸è¡å建æ¥å¿æ¡ç® |
| | | lines.forEach((line, index) => { |
| | | const logEntry = document.createElement('div'); |
| | | logEntry.className = `log-entry log-${type}`; |
| | | // 妿æ¯ç¬¬ä¸æ¡æ¥å¿ï¼æ¾ç¤ºæ¶é´æ³ |
| | | const prefix = index === 0 ? timestamp : ' '.repeat(timestamp.length); |
| | | logEntry.textContent = `${prefix}${line}`; |
| | | // logEntry.textContent = `[${new Date().toLocaleTimeString()}] ${message}`; |
| | | // logEntry.style ä¿çèµ·å§çç©ºæ ¼ |
| | | logEntry.style.whiteSpace = 'pre'; |
| | | if (type === 'error') { |
| | | logEntry.style.color = 'red'; |
| | | } else if (type === 'debug') { |
| | | logEntry.style.color = 'gray'; |
| | | return; |
| | | } else if (type === 'warning') { |
| | | logEntry.style.color = 'orange'; |
| | | } else if (type === 'success') { |
| | | logEntry.style.color = 'green'; |
| | | } else { |
| | | logEntry.style.color = 'black'; |
| | | } |
| | | logContainer.appendChild(logEntry); |
| | | }); |
| | | |
| | | logContainer.scrollTop = logContainer.scrollHeight; |
| | | } |
| New file |
| | |
| | | |
| | | ============================================================ |
| | | |
| | | ç¤ºä¾æ¨¡å |
| | | æ¡æ¿æ¥å - PRO |
| | | |
| | | ============================================================ |
| | | |
| | | è¯¥ç¤ºä¾æ¶åºäºCubism3.0å¶ä½çæ 忍¡åç´ æã |
| | | |
| | | å¯ç¨äºå¦ä¹ åå½¢å¨çæé 以ååæ°çä½¿ç¨æ¹æ³ã |
| | | 模åçè©é¨åºç¨äºæ°åè½ãè¶æ°´ãã |
| | | |
| | | |
| | | ------------------------------ |
| | | ç´ æä½¿ç¨è®¸å¯ |
| | | ------------------------------ |
| | | |
| | | ãæ®éç¨æ·ä»¥åå°è§æ¨¡ä¼ä¸å¨åæææåè®®çæ
åµä¸å¯ç¨äºåä¸ç¨éã |
| | | ãä¸/å¤§è§æ¨¡çä¼ä¸åªè½ç¨äºéå
¬å¼çå
é¨è¯ç¨ã |
| | | ãå¨ä½¿ç¨è¯¥ç´ ææ¶ï¼è¯·ç¡®è®¤ä»¥ä¸çãæ å¿æä¾ç´ æä½¿ç¨ææåè®®ãä¸çâææç±»åâãâLive2Dååè§è²âççç¸å
³å
å®¹ï¼ |
| | | ãå¹¶å¿
é¡»æ¥åãLive2D Cubism ç¤ºä¾æ¨¡åçä½¿ç¨ææè¦æ±ãä¸çå©ç¨æ¡ä»¶ã |
| | | |
| | | ãæå
³è®¸å¯è¯çæ´å¤ä¿¡æ¯ï¼è¯·åé
以ä¸é¡µé¢ã |
| | | ãhttps://www.live2d.com/zh-CHS/download/sample-data/ |
| | | |
| | | |
| | | ------------------------------ |
| | | åä½è
|
| | | ------------------------------ |
| | | |
| | | æç»ï¼Kani Biimu |
| | | 模åï¼Live2D |
| | | |
| | | |
| | | ------------------------------ |
| | | ç´ æå
容 |
| | | ------------------------------ |
| | | |
| | | 模åæä»¶(cmo3)ãâ»å
å«ç©ç模æçè®¾å® |
| | | å¨ç»æä»¶(can3) |
| | | åµå
¥æä»¶å表(runtimeæä»¶å¤¹) |
| | | ã»æ¨¡åæ°æ®(moc3) |
| | | ã»å¨ä½æ°æ®(motion3.json) |
| | | ã»æ¨¡åè®¾å®æä»¶(model3.json) |
| | | ã»ç©ç模æè®¾å®æä»¶(physics3.json) |
| | | ã»å§¿å¿è®¾å®æä»¶(pose3.json) |
| | | ã»è¾
婿¾ç¤ºçæä»¶(cdi3.json) |
| | | |
| | | |
| | | ------------------------------ |
| | | æ´æ°è®°å½ |
| | | ------------------------------ |
| | | |
| | | ãcmo3ã |
| | | |
| | | ãhiyori_pro_t11 |
| | | ã2023å¹´03æ08æ¥ ä¿®æ¹äºé¨å模åå
³é®ç¹ |
| | | |
| | | hiyori_pro_t10 |
| | | 2021å¹´06æ10æ¥ å
¬å¼ |
| | | |
| | | |
| | | ãcan3ã |
| | | |
| | | ãhiyori_pro_t04 |
| | | ã2023å¹´03æ08æ¥ ä¿®æ¹äºé¨åå¨ç»å
³é®å¸§ |
| | | |
| | | hiyori_pro_t03 |
| | | 2021å¹´06æ10æ¥ å
¬å¼ |
| | | |
| | | ã |
| New file |
| | |
| | | { |
| | | "Version": 3, |
| | | "Parameters": [ |
| | | { |
| | | "Id": "ParamAngleX", |
| | | "GroupId": "ParamGroupFace", |
| | | "Name": "è§åº¦ X" |
| | | }, |
| | | { |
| | | "Id": "ParamAngleY", |
| | | "GroupId": "ParamGroupFace", |
| | | "Name": "è§åº¦ Y" |
| | | }, |
| | | { |
| | | "Id": "ParamAngleZ", |
| | | "GroupId": "ParamGroupFace", |
| | | "Name": "è§åº¦ Z" |
| | | }, |
| | | { |
| | | "Id": "ParamCheek", |
| | | "GroupId": "ParamGroupFace", |
| | | "Name": "è¸é¢æ³çº¢" |
| | | }, |
| | | { |
| | | "Id": "ParamEyeLOpen", |
| | | "GroupId": "ParamGroupEyes", |
| | | "Name": "å·¦ç¼ å¼é" |
| | | }, |
| | | { |
| | | "Id": "ParamEyeLSmile", |
| | | "GroupId": "ParamGroupEyes", |
| | | "Name": "å·¦ç¼ å¾®ç¬" |
| | | }, |
| | | { |
| | | "Id": "ParamEyeROpen", |
| | | "GroupId": "ParamGroupEyes", |
| | | "Name": "å³ç¼ å¼é" |
| | | }, |
| | | { |
| | | "Id": "ParamEyeRSmile", |
| | | "GroupId": "ParamGroupEyes", |
| | | "Name": "å³ç¼ å¾®ç¬" |
| | | }, |
| | | { |
| | | "Id": "ParamEyeBallX", |
| | | "GroupId": "ParamGroupEyeballs", |
| | | "Name": "ç¼ç X" |
| | | }, |
| | | { |
| | | "Id": "ParamEyeBallY", |
| | | "GroupId": "ParamGroupEyeballs", |
| | | "Name": "ç¼ç Y" |
| | | }, |
| | | { |
| | | "Id": "ParamBrowLY", |
| | | "GroupId": "ParamGroupBrows", |
| | | "Name": "å·¦ç ä¸ä¸" |
| | | }, |
| | | { |
| | | "Id": "ParamBrowRY", |
| | | "GroupId": "ParamGroupBrows", |
| | | "Name": "å³ç ä¸ä¸" |
| | | }, |
| | | { |
| | | "Id": "ParamBrowLX", |
| | | "GroupId": "ParamGroupBrows", |
| | | "Name": "å·¦ç å·¦å³" |
| | | }, |
| | | { |
| | | "Id": "ParamBrowRX", |
| | | "GroupId": "ParamGroupBrows", |
| | | "Name": "å³ç å·¦å³" |
| | | }, |
| | | { |
| | | "Id": "ParamBrowLAngle", |
| | | "GroupId": "ParamGroupBrows", |
| | | "Name": "å·¦ç è§åº¦" |
| | | }, |
| | | { |
| | | "Id": "ParamBrowRAngle", |
| | | "GroupId": "ParamGroupBrows", |
| | | "Name": "å³ç è§åº¦" |
| | | }, |
| | | { |
| | | "Id": "ParamBrowLForm", |
| | | "GroupId": "ParamGroupBrows", |
| | | "Name": "å·¦ç åå½¢" |
| | | }, |
| | | { |
| | | "Id": "ParamBrowRForm", |
| | | "GroupId": "ParamGroupBrows", |
| | | "Name": "å³ç åå½¢" |
| | | }, |
| | | { |
| | | "Id": "ParamMouthForm", |
| | | "GroupId": "ParamGroupMouth", |
| | | "Name": "å´ åå½¢" |
| | | }, |
| | | { |
| | | "Id": "ParamMouthOpenY", |
| | | "GroupId": "ParamGroupMouth", |
| | | "Name": "å´ å¼é" |
| | | }, |
| | | { |
| | | "Id": "ParamBodyAngleX", |
| | | "GroupId": "ParamGroupBody", |
| | | "Name": "身ä½çæè½¬ X" |
| | | }, |
| | | { |
| | | "Id": "ParamBodyAngleY", |
| | | "GroupId": "ParamGroupBody", |
| | | "Name": "身ä½çæè½¬ Y" |
| | | }, |
| | | { |
| | | "Id": "ParamBodyAngleZ", |
| | | "GroupId": "ParamGroupBody", |
| | | "Name": "身ä½çæè½¬ Z" |
| | | }, |
| | | { |
| | | "Id": "ParamBreath", |
| | | "GroupId": "ParamGroupBody", |
| | | "Name": "å¼å¸" |
| | | }, |
| | | { |
| | | "Id": "ParamShoulder", |
| | | "GroupId": "ParamGroupBody", |
| | | "Name": "è©" |
| | | }, |
| | | { |
| | | "Id": "ParamLeg", |
| | | "GroupId": "ParamGroupBody", |
| | | "Name": "è
¿" |
| | | }, |
| | | { |
| | | "Id": "ParamArmLA", |
| | | "GroupId": "ParamGroupArms", |
| | | "Name": "å·¦è A" |
| | | }, |
| | | { |
| | | "Id": "ParamArmRA", |
| | | "GroupId": "ParamGroupArms", |
| | | "Name": "å³è A" |
| | | }, |
| | | { |
| | | "Id": "ParamArmLB", |
| | | "GroupId": "ParamGroupArms", |
| | | "Name": "å·¦è B" |
| | | }, |
| | | { |
| | | "Id": "ParamArmRB", |
| | | "GroupId": "ParamGroupArms", |
| | | "Name": "å³è B" |
| | | }, |
| | | { |
| | | "Id": "ParamHandLB", |
| | | "GroupId": "ParamGroupArms", |
| | | "Name": "å·¦æB æè½¬" |
| | | }, |
| | | { |
| | | "Id": "ParamHandRB", |
| | | "GroupId": "ParamGroupArms", |
| | | "Name": "峿B æè½¬" |
| | | }, |
| | | { |
| | | "Id": "ParamHandL", |
| | | "GroupId": "ParamGroupArms", |
| | | "Name": "å·¦æ" |
| | | }, |
| | | { |
| | | "Id": "ParamHandR", |
| | | "GroupId": "ParamGroupArms", |
| | | "Name": "峿" |
| | | }, |
| | | { |
| | | "Id": "ParamBustY", |
| | | "GroupId": "ParamGroupSway", |
| | | "Name": "è¸é¨ æå¨" |
| | | }, |
| | | { |
| | | "Id": "ParamHairAhoge", |
| | | "GroupId": "ParamGroupSway", |
| | | "Name": "头åæå¨ 忝" |
| | | }, |
| | | { |
| | | "Id": "ParamHairFront", |
| | | "GroupId": "ParamGroupSway", |
| | | "Name": "头åæå¨ å" |
| | | }, |
| | | { |
| | | "Id": "ParamHairBack", |
| | | "GroupId": "ParamGroupSway", |
| | | "Name": "头åæå¨ å" |
| | | }, |
| | | { |
| | | "Id": "ParamSideupRibbon", |
| | | "GroupId": "ParamGroupSway", |
| | | "Name": "å饰çæå¨" |
| | | }, |
| | | { |
| | | "Id": "ParamRibbon", |
| | | "GroupId": "ParamGroupSway", |
| | | "Name": "è´è¶ç»çæå¨" |
| | | }, |
| | | { |
| | | "Id": "ParamSkirt", |
| | | "GroupId": "ParamGroupSway", |
| | | "Name": "çè£çæå¨" |
| | | }, |
| | | { |
| | | "Id": "ParamSkirt2", |
| | | "GroupId": "ParamGroupSway", |
| | | "Name": "çè£çä¸å·" |
| | | }, |
| | | { |
| | | "Id": "Param_Angle_Rotation_1_ArtMesh62", |
| | | "GroupId": "ParamGroup2", |
| | | "Name": "[0]辫åå·¦" |
| | | }, |
| | | { |
| | | "Id": "Param_Angle_Rotation_2_ArtMesh62", |
| | | "GroupId": "ParamGroup2", |
| | | "Name": "[1]辫åå·¦" |
| | | }, |
| | | { |
| | | "Id": "Param_Angle_Rotation_3_ArtMesh62", |
| | | "GroupId": "ParamGroup2", |
| | | "Name": "[2]辫åå·¦" |
| | | }, |
| | | { |
| | | "Id": "Param_Angle_Rotation_4_ArtMesh62", |
| | | "GroupId": "ParamGroup2", |
| | | "Name": "[3]辫åå·¦" |
| | | }, |
| | | { |
| | | "Id": "Param_Angle_Rotation_5_ArtMesh62", |
| | | "GroupId": "ParamGroup2", |
| | | "Name": "[4]辫åå·¦" |
| | | }, |
| | | { |
| | | "Id": "Param_Angle_Rotation_6_ArtMesh62", |
| | | "GroupId": "ParamGroup2", |
| | | "Name": "[5]辫åå·¦" |
| | | }, |
| | | { |
| | | "Id": "Param_Angle_Rotation_7_ArtMesh62", |
| | | "GroupId": "ParamGroup2", |
| | | "Name": "[6]辫åå·¦" |
| | | }, |
| | | { |
| | | "Id": "Param_Angle_Rotation_1_ArtMesh61", |
| | | "GroupId": "ParamGroup", |
| | | "Name": "[0]辫åå³" |
| | | }, |
| | | { |
| | | "Id": "Param_Angle_Rotation_2_ArtMesh61", |
| | | "GroupId": "ParamGroup", |
| | | "Name": "[1]辫åå³" |
| | | }, |
| | | { |
| | | "Id": "Param_Angle_Rotation_3_ArtMesh61", |
| | | "GroupId": "ParamGroup", |
| | | "Name": "[2]辫åå³" |
| | | }, |
| | | { |
| | | "Id": "Param_Angle_Rotation_4_ArtMesh61", |
| | | "GroupId": "ParamGroup", |
| | | "Name": "[3]辫åå³" |
| | | }, |
| | | { |
| | | "Id": "Param_Angle_Rotation_5_ArtMesh61", |
| | | "GroupId": "ParamGroup", |
| | | "Name": "[4]辫åå³" |
| | | }, |
| | | { |
| | | "Id": "Param_Angle_Rotation_6_ArtMesh61", |
| | | "GroupId": "ParamGroup", |
| | | "Name": "[5]辫åå³" |
| | | }, |
| | | { |
| | | "Id": "Param_Angle_Rotation_7_ArtMesh61", |
| | | "GroupId": "ParamGroup", |
| | | "Name": "[6]辫åå³" |
| | | }, |
| | | { |
| | | "Id": "Param_Angle_Rotation_1_ArtMesh55", |
| | | "GroupId": "ParamGroup4", |
| | | "Name": "[0]ä¾§åå·¦" |
| | | }, |
| | | { |
| | | "Id": "Param_Angle_Rotation_2_ArtMesh55", |
| | | "GroupId": "ParamGroup4", |
| | | "Name": "[1]ä¾§åå·¦" |
| | | }, |
| | | { |
| | | "Id": "Param_Angle_Rotation_3_ArtMesh55", |
| | | "GroupId": "ParamGroup4", |
| | | "Name": "[2]ä¾§åå·¦" |
| | | }, |
| | | { |
| | | "Id": "Param_Angle_Rotation_4_ArtMesh55", |
| | | "GroupId": "ParamGroup4", |
| | | "Name": "[3]ä¾§åå·¦" |
| | | }, |
| | | { |
| | | "Id": "Param_Angle_Rotation_5_ArtMesh55", |
| | | "GroupId": "ParamGroup4", |
| | | "Name": "[4]ä¾§åå·¦" |
| | | }, |
| | | { |
| | | "Id": "Param_Angle_Rotation_6_ArtMesh55", |
| | | "GroupId": "ParamGroup4", |
| | | "Name": "[5]ä¾§åå·¦" |
| | | }, |
| | | { |
| | | "Id": "Param_Angle_Rotation_7_ArtMesh55", |
| | | "GroupId": "ParamGroup4", |
| | | "Name": "[6]ä¾§åå·¦" |
| | | }, |
| | | { |
| | | "Id": "Param_Angle_Rotation_1_ArtMesh54", |
| | | "GroupId": "ParamGroup3", |
| | | "Name": "[0]ä¾§åå³" |
| | | }, |
| | | { |
| | | "Id": "Param_Angle_Rotation_2_ArtMesh54", |
| | | "GroupId": "ParamGroup3", |
| | | "Name": "[1]ä¾§åå³" |
| | | }, |
| | | { |
| | | "Id": "Param_Angle_Rotation_3_ArtMesh54", |
| | | "GroupId": "ParamGroup3", |
| | | "Name": "[2]ä¾§åå³" |
| | | }, |
| | | { |
| | | "Id": "Param_Angle_Rotation_4_ArtMesh54", |
| | | "GroupId": "ParamGroup3", |
| | | "Name": "[3]ä¾§åå³" |
| | | }, |
| | | { |
| | | "Id": "Param_Angle_Rotation_5_ArtMesh54", |
| | | "GroupId": "ParamGroup3", |
| | | "Name": "[4]ä¾§åå³" |
| | | }, |
| | | { |
| | | "Id": "Param_Angle_Rotation_6_ArtMesh54", |
| | | "GroupId": "ParamGroup3", |
| | | "Name": "[5]ä¾§åå³" |
| | | }, |
| | | { |
| | | "Id": "Param_Angle_Rotation_7_ArtMesh54", |
| | | "GroupId": "ParamGroup3", |
| | | "Name": "[6]ä¾§åå³" |
| | | } |
| | | ], |
| | | "ParameterGroups": [ |
| | | { |
| | | "Id": "ParamGroupFace", |
| | | "GroupId": "", |
| | | "Name": "è¸" |
| | | }, |
| | | { |
| | | "Id": "ParamGroupEyes", |
| | | "GroupId": "", |
| | | "Name": "ç¼ç" |
| | | }, |
| | | { |
| | | "Id": "ParamGroupEyeballs", |
| | | "GroupId": "", |
| | | "Name": "ç¼ç " |
| | | }, |
| | | { |
| | | "Id": "ParamGroupBrows", |
| | | "GroupId": "", |
| | | "Name": "çæ¯" |
| | | }, |
| | | { |
| | | "Id": "ParamGroupMouth", |
| | | "GroupId": "", |
| | | "Name": "å´" |
| | | }, |
| | | { |
| | | "Id": "ParamGroupBody", |
| | | "GroupId": "", |
| | | "Name": "身ä½" |
| | | }, |
| | | { |
| | | "Id": "ParamGroupArms", |
| | | "GroupId": "", |
| | | "Name": "æè" |
| | | }, |
| | | { |
| | | "Id": "ParamGroupSway", |
| | | "GroupId": "", |
| | | "Name": "æå¨" |
| | | }, |
| | | { |
| | | "Id": "ParamGroup2", |
| | | "GroupId": "", |
| | | "Name": "æå¨ 辫åå·¦" |
| | | }, |
| | | { |
| | | "Id": "ParamGroup", |
| | | "GroupId": "", |
| | | "Name": "æå¨ 辫åå³" |
| | | }, |
| | | { |
| | | "Id": "ParamGroup4", |
| | | "GroupId": "", |
| | | "Name": "æå¨ ä¾§åå·¦" |
| | | }, |
| | | { |
| | | "Id": "ParamGroup3", |
| | | "GroupId": "", |
| | | "Name": "æå¨ ä¾§åå³" |
| | | } |
| | | ], |
| | | "Parts": [ |
| | | { |
| | | "Id": "PartCore", |
| | | "Name": "Core" |
| | | }, |
| | | { |
| | | "Id": "PartCheek", |
| | | "Name": "è¸é¢" |
| | | }, |
| | | { |
| | | "Id": "PartBrow", |
| | | "Name": "çæ¯" |
| | | }, |
| | | { |
| | | "Id": "PartEye", |
| | | "Name": "ç¼ç" |
| | | }, |
| | | { |
| | | "Id": "PartNose", |
| | | "Name": "é¼»å" |
| | | }, |
| | | { |
| | | "Id": "PartMouth", |
| | | "Name": "å´" |
| | | }, |
| | | { |
| | | "Id": "PartFace", |
| | | "Name": "è¸" |
| | | }, |
| | | { |
| | | "Id": "PartEar", |
| | | "Name": "è³æµ" |
| | | }, |
| | | { |
| | | "Id": "PartHairSide", |
| | | "Name": "ä¾§å" |
| | | }, |
| | | { |
| | | "Id": "PartHairFront", |
| | | "Name": "åå" |
| | | }, |
| | | { |
| | | "Id": "PartHairBack", |
| | | "Name": "åå" |
| | | }, |
| | | { |
| | | "Id": "PartNeck", |
| | | "Name": "èå" |
| | | }, |
| | | { |
| | | "Id": "PartArmA", |
| | | "Name": "æèA" |
| | | }, |
| | | { |
| | | "Id": "PartArmB", |
| | | "Name": "æèB" |
| | | }, |
| | | { |
| | | "Id": "PartBody", |
| | | "Name": "身ä½" |
| | | }, |
| | | { |
| | | "Id": "PartBackground", |
| | | "Name": "èæ¯" |
| | | }, |
| | | { |
| | | "Id": "PartSketch", |
| | | "Name": "[åèå¾]" |
| | | }, |
| | | { |
| | | "Id": "PartEyeBall", |
| | | "Name": "ç¼ç " |
| | | }, |
| | | { |
| | | "Id": "ArtMesh55_Skinning", |
| | | "Name": "ä¾§åå³" |
| | | }, |
| | | { |
| | | "Id": "Part4", |
| | | "Name": "ä¾§åå·¦(æè½¬)" |
| | | }, |
| | | { |
| | | "Id": "ArtMesh54_Skinning", |
| | | "Name": "ä¾§åå³(èç®)" |
| | | }, |
| | | { |
| | | "Id": "Part3", |
| | | "Name": "ä¾§åå³(æè½¬)" |
| | | }, |
| | | { |
| | | "Id": "ArtMesh61_Skinning", |
| | | "Name": "辫åå³(èç®)" |
| | | }, |
| | | { |
| | | "Id": "Part", |
| | | "Name": "辫åå³(æè½¬)" |
| | | }, |
| | | { |
| | | "Id": "ArtMesh62_Skinning", |
| | | "Name": "辫åå·¦(èç®)" |
| | | }, |
| | | { |
| | | "Id": "Part2", |
| | | "Name": "辫åå·¦(æè½¬)" |
| | | } |
| | | ], |
| | | "CombinedParameters": [ |
| | | [ |
| | | "ParamAngleX", |
| | | "ParamAngleY" |
| | | ], |
| | | [ |
| | | "ParamMouthForm", |
| | | "ParamMouthOpenY" |
| | | ] |
| | | ] |
| | | } |
| New file |
| | |
| | | { |
| | | "Version": 3, |
| | | "FileReferences": { |
| | | "Moc": "hiyori_pro_t11.moc3", |
| | | "Textures": [ |
| | | "hiyori_pro_t11.2048/texture_00.png", |
| | | "hiyori_pro_t11.2048/texture_01.png" |
| | | ], |
| | | "Physics": "hiyori_pro_t11.physics3.json", |
| | | "Pose": "hiyori_pro_t11.pose3.json", |
| | | "DisplayInfo": "hiyori_pro_t11.cdi3.json", |
| | | "Motions": { |
| | | "Idle": [ |
| | | { |
| | | "File": "motion/hiyori_m01.motion3.json" |
| | | }, |
| | | { |
| | | "File": "motion/hiyori_m02.motion3.json" |
| | | }, |
| | | { |
| | | "File": "motion/hiyori_m05.motion3.json" |
| | | } |
| | | ], |
| | | "Flick": [ |
| | | { |
| | | "File": "motion/hiyori_m03.motion3.json" |
| | | } |
| | | ], |
| | | "FlickDown": [ |
| | | { |
| | | "File": "motion/hiyori_m04.motion3.json" |
| | | } |
| | | ], |
| | | "FlickUp": [ |
| | | { |
| | | "File": "motion/hiyori_m06.motion3.json" |
| | | } |
| | | ], |
| | | "Tap": [ |
| | | { |
| | | "File": "motion/hiyori_m07.motion3.json" |
| | | }, |
| | | { |
| | | "File": "motion/hiyori_m08.motion3.json" |
| | | } |
| | | ], |
| | | "Tap@Body": [ |
| | | { |
| | | "File": "motion/hiyori_m09.motion3.json" |
| | | } |
| | | ], |
| | | "Flick@Body": [ |
| | | { |
| | | "File": "motion/hiyori_m10.motion3.json" |
| | | } |
| | | ] |
| | | } |
| | | }, |
| | | "Groups": [ |
| | | { |
| | | "Target": "Parameter", |
| | | "Name": "LipSync", |
| | | "Ids": [ |
| | | "ParamMouthOpenY" |
| | | ] |
| | | }, |
| | | { |
| | | "Target": "Parameter", |
| | | "Name": "EyeBlink", |
| | | "Ids": [ |
| | | "ParamEyeLOpen", |
| | | "ParamEyeROpen" |
| | | ] |
| | | } |
| | | ], |
| | | "HitAreas": [ |
| | | { |
| | | "Id": "HitArea", |
| | | "Name": "Body" |
| | | } |
| | | ] |
| | | } |
| New file |
| | |
| | | { |
| | | "Version": 3, |
| | | "Meta": { |
| | | "PhysicsSettingCount": 11, |
| | | "TotalInputCount": 34, |
| | | "TotalOutputCount": 35, |
| | | "VertexCount": 58, |
| | | "EffectiveForces": { |
| | | "Gravity": { |
| | | "X": 0, |
| | | "Y": -1 |
| | | }, |
| | | "Wind": { |
| | | "X": 0, |
| | | "Y": 0 |
| | | } |
| | | }, |
| | | "PhysicsDictionary": [ |
| | | { |
| | | "Id": "PhysicsSetting1", |
| | | "Name": "åå" |
| | | }, |
| | | { |
| | | "Id": "PhysicsSetting2", |
| | | "Name": "åå" |
| | | }, |
| | | { |
| | | "Id": "PhysicsSetting3", |
| | | "Name": "ä¸å¸¦ 头å" |
| | | }, |
| | | { |
| | | "Id": "PhysicsSetting4", |
| | | "Name": "çè£ æ¨ªåæå¨" |
| | | }, |
| | | { |
| | | "Id": "PhysicsSetting5", |
| | | "Name": "çè£ çºµåæå¨" |
| | | }, |
| | | { |
| | | "Id": "PhysicsSetting6", |
| | | "Name": "ä¸å¸¦ 身ä½" |
| | | }, |
| | | { |
| | | "Id": "PhysicsSetting7", |
| | | "Name": "è¸ æå¨" |
| | | }, |
| | | { |
| | | "Id": "PhysicsSetting8", |
| | | "Name": "辫å å³" |
| | | }, |
| | | { |
| | | "Id": "PhysicsSetting9", |
| | | "Name": "辫å å·¦" |
| | | }, |
| | | { |
| | | "Id": "PhysicsSetting10", |
| | | "Name": "ä¾§å å³" |
| | | }, |
| | | { |
| | | "Id": "PhysicsSetting11", |
| | | "Name": "ä¾§å å·¦" |
| | | } |
| | | ] |
| | | }, |
| | | "PhysicsSettings": [ |
| | | { |
| | | "Id": "PhysicsSetting1", |
| | | "Input": [ |
| | | { |
| | | "Source": { |
| | | "Target": "Parameter", |
| | | "Id": "ParamAngleX" |
| | | }, |
| | | "Weight": 60, |
| | | "Type": "X", |
| | | "Reflect": false |
| | | }, |
| | | { |
| | | "Source": { |
| | | "Target": "Parameter", |
| | | "Id": "ParamAngleZ" |
| | | }, |
| | | "Weight": 60, |
| | | "Type": "Angle", |
| | | "Reflect": false |
| | | }, |
| | | { |
| | | "Source": { |
| | | "Target": "Parameter", |
| | | "Id": "ParamBodyAngleX" |
| | | }, |
| | | "Weight": 40, |
| | | "Type": "X", |
| | | "Reflect": false |
| | | }, |
| | | { |
| | | "Source": { |
| | | "Target": "Parameter", |
| | | "Id": "ParamBodyAngleZ" |
| | | }, |
| | | "Weight": 40, |
| | | "Type": "Angle", |
| | | "Reflect": false |
| | | } |
| | | ], |
| | | "Output": [ |
| | | { |
| | | "Destination": { |
| | | "Target": "Parameter", |
| | | "Id": "ParamHairFront" |
| | | }, |
| | | "VertexIndex": 1, |
| | | "Scale": 1.522, |
| | | "Weight": 100, |
| | | "Type": "Angle", |
| | | "Reflect": false |
| | | } |
| | | ], |
| | | "Vertices": [ |
| | | { |
| | | "Position": { |
| | | "X": 0, |
| | | "Y": 0 |
| | | }, |
| | | "Mobility": 1, |
| | | "Delay": 1, |
| | | "Acceleration": 1, |
| | | "Radius": 0 |
| | | }, |
| | | { |
| | | "Position": { |
| | | "X": 0, |
| | | "Y": 3 |
| | | }, |
| | | "Mobility": 0.95, |
| | | "Delay": 0.9, |
| | | "Acceleration": 1.5, |
| | | "Radius": 3 |
| | | } |
| | | ], |
| | | "Normalization": { |
| | | "Position": { |
| | | "Minimum": -10, |
| | | "Default": 0, |
| | | "Maximum": 10 |
| | | }, |
| | | "Angle": { |
| | | "Minimum": -10, |
| | | "Default": 0, |
| | | "Maximum": 10 |
| | | } |
| | | } |
| | | }, |
| | | { |
| | | "Id": "PhysicsSetting2", |
| | | "Input": [ |
| | | { |
| | | "Source": { |
| | | "Target": "Parameter", |
| | | "Id": "ParamAngleX" |
| | | }, |
| | | "Weight": 60, |
| | | "Type": "X", |
| | | "Reflect": false |
| | | }, |
| | | { |
| | | "Source": { |
| | | "Target": "Parameter", |
| | | "Id": "ParamAngleZ" |
| | | }, |
| | | "Weight": 60, |
| | | "Type": "Angle", |
| | | "Reflect": false |
| | | }, |
| | | { |
| | | "Source": { |
| | | "Target": "Parameter", |
| | | "Id": "ParamBodyAngleX" |
| | | }, |
| | | "Weight": 40, |
| | | "Type": "X", |
| | | "Reflect": false |
| | | }, |
| | | { |
| | | "Source": { |
| | | "Target": "Parameter", |
| | | "Id": "ParamBodyAngleZ" |
| | | }, |
| | | "Weight": 40, |
| | | "Type": "Angle", |
| | | "Reflect": false |
| | | } |
| | | ], |
| | | "Output": [ |
| | | { |
| | | "Destination": { |
| | | "Target": "Parameter", |
| | | "Id": "ParamHairBack" |
| | | }, |
| | | "VertexIndex": 1, |
| | | "Scale": 2.061, |
| | | "Weight": 100, |
| | | "Type": "Angle", |
| | | "Reflect": false |
| | | } |
| | | ], |
| | | "Vertices": [ |
| | | { |
| | | "Position": { |
| | | "X": 0, |
| | | "Y": 0 |
| | | }, |
| | | "Mobility": 1, |
| | | "Delay": 1, |
| | | "Acceleration": 1, |
| | | "Radius": 0 |
| | | }, |
| | | { |
| | | "Position": { |
| | | "X": 0, |
| | | "Y": 15 |
| | | }, |
| | | "Mobility": 0.95, |
| | | "Delay": 0.8, |
| | | "Acceleration": 1.5, |
| | | "Radius": 15 |
| | | } |
| | | ], |
| | | "Normalization": { |
| | | "Position": { |
| | | "Minimum": -10, |
| | | "Default": 0, |
| | | "Maximum": 10 |
| | | }, |
| | | "Angle": { |
| | | "Minimum": -30, |
| | | "Default": 0, |
| | | "Maximum": 30 |
| | | } |
| | | } |
| | | }, |
| | | { |
| | | "Id": "PhysicsSetting3", |
| | | "Input": [ |
| | | { |
| | | "Source": { |
| | | "Target": "Parameter", |
| | | "Id": "ParamAngleX" |
| | | }, |
| | | "Weight": 40, |
| | | "Type": "X", |
| | | "Reflect": false |
| | | }, |
| | | { |
| | | "Source": { |
| | | "Target": "Parameter", |
| | | "Id": "ParamAngleZ" |
| | | }, |
| | | "Weight": 40, |
| | | "Type": "Angle", |
| | | "Reflect": false |
| | | }, |
| | | { |
| | | "Source": { |
| | | "Target": "Parameter", |
| | | "Id": "ParamBodyAngleX" |
| | | }, |
| | | "Weight": 60, |
| | | "Type": "X", |
| | | "Reflect": false |
| | | }, |
| | | { |
| | | "Source": { |
| | | "Target": "Parameter", |
| | | "Id": "ParamBodyAngleZ" |
| | | }, |
| | | "Weight": 60, |
| | | "Type": "Angle", |
| | | "Reflect": false |
| | | } |
| | | ], |
| | | "Output": [ |
| | | { |
| | | "Destination": { |
| | | "Target": "Parameter", |
| | | "Id": "ParamSideupRibbon" |
| | | }, |
| | | "VertexIndex": 1, |
| | | "Scale": 1.775, |
| | | "Weight": 100, |
| | | "Type": "Angle", |
| | | "Reflect": false |
| | | } |
| | | ], |
| | | "Vertices": [ |
| | | { |
| | | "Position": { |
| | | "X": 0, |
| | | "Y": 0 |
| | | }, |
| | | "Mobility": 1, |
| | | "Delay": 1, |
| | | "Acceleration": 1, |
| | | "Radius": 0 |
| | | }, |
| | | { |
| | | "Position": { |
| | | "X": 0, |
| | | "Y": 10 |
| | | }, |
| | | "Mobility": 0.9, |
| | | "Delay": 0.6, |
| | | "Acceleration": 1.5, |
| | | "Radius": 10 |
| | | } |
| | | ], |
| | | "Normalization": { |
| | | "Position": { |
| | | "Minimum": -10, |
| | | "Default": 0, |
| | | "Maximum": 10 |
| | | }, |
| | | "Angle": { |
| | | "Minimum": -7.8, |
| | | "Default": 0, |
| | | "Maximum": 8 |
| | | } |
| | | } |
| | | }, |
| | | { |
| | | "Id": "PhysicsSetting4", |
| | | "Input": [ |
| | | { |
| | | "Source": { |
| | | "Target": "Parameter", |
| | | "Id": "ParamBodyAngleX" |
| | | }, |
| | | "Weight": 100, |
| | | "Type": "X", |
| | | "Reflect": false |
| | | }, |
| | | { |
| | | "Source": { |
| | | "Target": "Parameter", |
| | | "Id": "ParamBodyAngleZ" |
| | | }, |
| | | "Weight": 100, |
| | | "Type": "Angle", |
| | | "Reflect": false |
| | | } |
| | | ], |
| | | "Output": [ |
| | | { |
| | | "Destination": { |
| | | "Target": "Parameter", |
| | | "Id": "ParamSkirt" |
| | | }, |
| | | "VertexIndex": 1, |
| | | "Scale": 1.434, |
| | | "Weight": 100, |
| | | "Type": "Angle", |
| | | "Reflect": false |
| | | } |
| | | ], |
| | | "Vertices": [ |
| | | { |
| | | "Position": { |
| | | "X": 0, |
| | | "Y": 0 |
| | | }, |
| | | "Mobility": 1, |
| | | "Delay": 1, |
| | | "Acceleration": 1, |
| | | "Radius": 0 |
| | | }, |
| | | { |
| | | "Position": { |
| | | "X": 0, |
| | | "Y": 10 |
| | | }, |
| | | "Mobility": 0.9, |
| | | "Delay": 0.6, |
| | | "Acceleration": 1.5, |
| | | "Radius": 10 |
| | | } |
| | | ], |
| | | "Normalization": { |
| | | "Position": { |
| | | "Minimum": -10, |
| | | "Default": 0, |
| | | "Maximum": 10 |
| | | }, |
| | | "Angle": { |
| | | "Minimum": -10, |
| | | "Default": 0, |
| | | "Maximum": 10 |
| | | } |
| | | } |
| | | }, |
| | | { |
| | | "Id": "PhysicsSetting5", |
| | | "Input": [ |
| | | { |
| | | "Source": { |
| | | "Target": "Parameter", |
| | | "Id": "ParamBodyAngleY" |
| | | }, |
| | | "Weight": 100, |
| | | "Type": "X", |
| | | "Reflect": false |
| | | } |
| | | ], |
| | | "Output": [ |
| | | { |
| | | "Destination": { |
| | | "Target": "Parameter", |
| | | "Id": "ParamSkirt2" |
| | | }, |
| | | "VertexIndex": 1, |
| | | "Scale": 1.306, |
| | | "Weight": 100, |
| | | "Type": "Angle", |
| | | "Reflect": false |
| | | } |
| | | ], |
| | | "Vertices": [ |
| | | { |
| | | "Position": { |
| | | "X": 0, |
| | | "Y": 0 |
| | | }, |
| | | "Mobility": 1, |
| | | "Delay": 1, |
| | | "Acceleration": 1, |
| | | "Radius": 0 |
| | | }, |
| | | { |
| | | "Position": { |
| | | "X": 0, |
| | | "Y": 10 |
| | | }, |
| | | "Mobility": 0.8, |
| | | "Delay": 0.9, |
| | | "Acceleration": 2, |
| | | "Radius": 10 |
| | | } |
| | | ], |
| | | "Normalization": { |
| | | "Position": { |
| | | "Minimum": -10, |
| | | "Default": 0, |
| | | "Maximum": 10 |
| | | }, |
| | | "Angle": { |
| | | "Minimum": -10, |
| | | "Default": 0, |
| | | "Maximum": 10 |
| | | } |
| | | } |
| | | }, |
| | | { |
| | | "Id": "PhysicsSetting6", |
| | | "Input": [ |
| | | { |
| | | "Source": { |
| | | "Target": "Parameter", |
| | | "Id": "ParamBodyAngleX" |
| | | }, |
| | | "Weight": 100, |
| | | "Type": "X", |
| | | "Reflect": false |
| | | }, |
| | | { |
| | | "Source": { |
| | | "Target": "Parameter", |
| | | "Id": "ParamBodyAngleZ" |
| | | }, |
| | | "Weight": 100, |
| | | "Type": "Angle", |
| | | "Reflect": false |
| | | } |
| | | ], |
| | | "Output": [ |
| | | { |
| | | "Destination": { |
| | | "Target": "Parameter", |
| | | "Id": "ParamRibbon" |
| | | }, |
| | | "VertexIndex": 1, |
| | | "Scale": 1.402, |
| | | "Weight": 100, |
| | | "Type": "Angle", |
| | | "Reflect": false |
| | | } |
| | | ], |
| | | "Vertices": [ |
| | | { |
| | | "Position": { |
| | | "X": 0, |
| | | "Y": 0 |
| | | }, |
| | | "Mobility": 1, |
| | | "Delay": 1, |
| | | "Acceleration": 1, |
| | | "Radius": 0 |
| | | }, |
| | | { |
| | | "Position": { |
| | | "X": 0, |
| | | "Y": 10 |
| | | }, |
| | | "Mobility": 0.9, |
| | | "Delay": 0.6, |
| | | "Acceleration": 1.5, |
| | | "Radius": 10 |
| | | } |
| | | ], |
| | | "Normalization": { |
| | | "Position": { |
| | | "Minimum": -10, |
| | | "Default": 0, |
| | | "Maximum": 10 |
| | | }, |
| | | "Angle": { |
| | | "Minimum": -10, |
| | | "Default": 0, |
| | | "Maximum": 10.6 |
| | | } |
| | | } |
| | | }, |
| | | { |
| | | "Id": "PhysicsSetting7", |
| | | "Input": [ |
| | | { |
| | | "Source": { |
| | | "Target": "Parameter", |
| | | "Id": "ParamBodyAngleY" |
| | | }, |
| | | "Weight": 100, |
| | | "Type": "X", |
| | | "Reflect": false |
| | | } |
| | | ], |
| | | "Output": [ |
| | | { |
| | | "Destination": { |
| | | "Target": "Parameter", |
| | | "Id": "ParamBustY" |
| | | }, |
| | | "VertexIndex": 1, |
| | | "Scale": 1, |
| | | "Weight": 100, |
| | | "Type": "Angle", |
| | | "Reflect": false |
| | | } |
| | | ], |
| | | "Vertices": [ |
| | | { |
| | | "Position": { |
| | | "X": 0, |
| | | "Y": 0 |
| | | }, |
| | | "Mobility": 1, |
| | | "Delay": 1, |
| | | "Acceleration": 1, |
| | | "Radius": 0 |
| | | }, |
| | | { |
| | | "Position": { |
| | | "X": 0, |
| | | "Y": 3 |
| | | }, |
| | | "Mobility": 0.8, |
| | | "Delay": 0.9, |
| | | "Acceleration": 1.5, |
| | | "Radius": 3 |
| | | } |
| | | ], |
| | | "Normalization": { |
| | | "Position": { |
| | | "Minimum": -10, |
| | | "Default": 0, |
| | | "Maximum": 10 |
| | | }, |
| | | "Angle": { |
| | | "Minimum": -10, |
| | | "Default": 0, |
| | | "Maximum": 10 |
| | | } |
| | | } |
| | | }, |
| | | { |
| | | "Id": "PhysicsSetting8", |
| | | "Input": [ |
| | | { |
| | | "Source": { |
| | | "Target": "Parameter", |
| | | "Id": "ParamAngleX" |
| | | }, |
| | | "Weight": 60, |
| | | "Type": "X", |
| | | "Reflect": false |
| | | }, |
| | | { |
| | | "Source": { |
| | | "Target": "Parameter", |
| | | "Id": "ParamAngleZ" |
| | | }, |
| | | "Weight": 60, |
| | | "Type": "Angle", |
| | | "Reflect": false |
| | | }, |
| | | { |
| | | "Source": { |
| | | "Target": "Parameter", |
| | | "Id": "ParamBodyAngleX" |
| | | }, |
| | | "Weight": 40, |
| | | "Type": "X", |
| | | "Reflect": false |
| | | }, |
| | | { |
| | | "Source": { |
| | | "Target": "Parameter", |
| | | "Id": "ParamBodyAngleZ" |
| | | }, |
| | | "Weight": 40, |
| | | "Type": "Angle", |
| | | "Reflect": false |
| | | } |
| | | ], |
| | | "Output": [ |
| | | { |
| | | "Destination": { |
| | | "Target": "Parameter", |
| | | "Id": "Param_Angle_Rotation_1_ArtMesh61" |
| | | }, |
| | | "VertexIndex": 1, |
| | | "Scale": 10, |
| | | "Weight": 100, |
| | | "Type": "Angle", |
| | | "Reflect": false |
| | | }, |
| | | { |
| | | "Destination": { |
| | | "Target": "Parameter", |
| | | "Id": "Param_Angle_Rotation_2_ArtMesh61" |
| | | }, |
| | | "VertexIndex": 2, |
| | | "Scale": 20, |
| | | "Weight": 100, |
| | | "Type": "Angle", |
| | | "Reflect": false |
| | | }, |
| | | { |
| | | "Destination": { |
| | | "Target": "Parameter", |
| | | "Id": "Param_Angle_Rotation_3_ArtMesh61" |
| | | }, |
| | | "VertexIndex": 3, |
| | | "Scale": 30, |
| | | "Weight": 100, |
| | | "Type": "Angle", |
| | | "Reflect": false |
| | | }, |
| | | { |
| | | "Destination": { |
| | | "Target": "Parameter", |
| | | "Id": "Param_Angle_Rotation_4_ArtMesh61" |
| | | }, |
| | | "VertexIndex": 4, |
| | | "Scale": 30, |
| | | "Weight": 100, |
| | | "Type": "Angle", |
| | | "Reflect": false |
| | | }, |
| | | { |
| | | "Destination": { |
| | | "Target": "Parameter", |
| | | "Id": "Param_Angle_Rotation_5_ArtMesh61" |
| | | }, |
| | | "VertexIndex": 5, |
| | | "Scale": 30, |
| | | "Weight": 100, |
| | | "Type": "Angle", |
| | | "Reflect": false |
| | | }, |
| | | { |
| | | "Destination": { |
| | | "Target": "Parameter", |
| | | "Id": "Param_Angle_Rotation_6_ArtMesh61" |
| | | }, |
| | | "VertexIndex": 6, |
| | | "Scale": 30, |
| | | "Weight": 100, |
| | | "Type": "Angle", |
| | | "Reflect": false |
| | | }, |
| | | { |
| | | "Destination": { |
| | | "Target": "Parameter", |
| | | "Id": "Param_Angle_Rotation_7_ArtMesh61" |
| | | }, |
| | | "VertexIndex": 7, |
| | | "Scale": 30, |
| | | "Weight": 100, |
| | | "Type": "Angle", |
| | | "Reflect": false |
| | | } |
| | | ], |
| | | "Vertices": [ |
| | | { |
| | | "Position": { |
| | | "X": 0, |
| | | "Y": 0 |
| | | }, |
| | | "Mobility": 1, |
| | | "Delay": 1, |
| | | "Acceleration": 1, |
| | | "Radius": 10 |
| | | }, |
| | | { |
| | | "Position": { |
| | | "X": 0, |
| | | "Y": 10 |
| | | }, |
| | | "Mobility": 0.85, |
| | | "Delay": 0.85, |
| | | "Acceleration": 1.2, |
| | | "Radius": 10 |
| | | }, |
| | | { |
| | | "Position": { |
| | | "X": 0, |
| | | "Y": 20 |
| | | }, |
| | | "Mobility": 0.85, |
| | | "Delay": 0.85, |
| | | "Acceleration": 1.2, |
| | | "Radius": 10 |
| | | }, |
| | | { |
| | | "Position": { |
| | | "X": 0, |
| | | "Y": 30 |
| | | }, |
| | | "Mobility": 0.85, |
| | | "Delay": 0.85, |
| | | "Acceleration": 1.2, |
| | | "Radius": 10 |
| | | }, |
| | | { |
| | | "Position": { |
| | | "X": 0, |
| | | "Y": 40 |
| | | }, |
| | | "Mobility": 0.85, |
| | | "Delay": 0.85, |
| | | "Acceleration": 1.2, |
| | | "Radius": 10 |
| | | }, |
| | | { |
| | | "Position": { |
| | | "X": 0, |
| | | "Y": 50 |
| | | }, |
| | | "Mobility": 0.85, |
| | | "Delay": 0.85, |
| | | "Acceleration": 1.2, |
| | | "Radius": 10 |
| | | }, |
| | | { |
| | | "Position": { |
| | | "X": 0, |
| | | "Y": 60 |
| | | }, |
| | | "Mobility": 0.85, |
| | | "Delay": 0.85, |
| | | "Acceleration": 1.2, |
| | | "Radius": 10 |
| | | }, |
| | | { |
| | | "Position": { |
| | | "X": 0, |
| | | "Y": 70 |
| | | }, |
| | | "Mobility": 0.85, |
| | | "Delay": 0.85, |
| | | "Acceleration": 1.2, |
| | | "Radius": 10 |
| | | }, |
| | | { |
| | | "Position": { |
| | | "X": 0, |
| | | "Y": 80 |
| | | }, |
| | | "Mobility": 0.85, |
| | | "Delay": 0.85, |
| | | "Acceleration": 1.2, |
| | | "Radius": 10 |
| | | }, |
| | | { |
| | | "Position": { |
| | | "X": 0, |
| | | "Y": 90 |
| | | }, |
| | | "Mobility": 0.85, |
| | | "Delay": 0.85, |
| | | "Acceleration": 1.2, |
| | | "Radius": 10 |
| | | }, |
| | | { |
| | | "Position": { |
| | | "X": 0, |
| | | "Y": 100 |
| | | }, |
| | | "Mobility": 0.85, |
| | | "Delay": 0.85, |
| | | "Acceleration": 1.2, |
| | | "Radius": 10 |
| | | } |
| | | ], |
| | | "Normalization": { |
| | | "Position": { |
| | | "Minimum": -10, |
| | | "Default": 0, |
| | | "Maximum": 10 |
| | | }, |
| | | "Angle": { |
| | | "Minimum": -10, |
| | | "Default": 0, |
| | | "Maximum": 10 |
| | | } |
| | | } |
| | | }, |
| | | { |
| | | "Id": "PhysicsSetting9", |
| | | "Input": [ |
| | | { |
| | | "Source": { |
| | | "Target": "Parameter", |
| | | "Id": "ParamAngleX" |
| | | }, |
| | | "Weight": 60, |
| | | "Type": "X", |
| | | "Reflect": false |
| | | }, |
| | | { |
| | | "Source": { |
| | | "Target": "Parameter", |
| | | "Id": "ParamAngleZ" |
| | | }, |
| | | "Weight": 60, |
| | | "Type": "Angle", |
| | | "Reflect": false |
| | | }, |
| | | { |
| | | "Source": { |
| | | "Target": "Parameter", |
| | | "Id": "ParamBodyAngleX" |
| | | }, |
| | | "Weight": 40, |
| | | "Type": "X", |
| | | "Reflect": false |
| | | }, |
| | | { |
| | | "Source": { |
| | | "Target": "Parameter", |
| | | "Id": "ParamBodyAngleZ" |
| | | }, |
| | | "Weight": 40, |
| | | "Type": "Angle", |
| | | "Reflect": false |
| | | } |
| | | ], |
| | | "Output": [ |
| | | { |
| | | "Destination": { |
| | | "Target": "Parameter", |
| | | "Id": "Param_Angle_Rotation_1_ArtMesh62" |
| | | }, |
| | | "VertexIndex": 1, |
| | | "Scale": 10, |
| | | "Weight": 100, |
| | | "Type": "Angle", |
| | | "Reflect": false |
| | | }, |
| | | { |
| | | "Destination": { |
| | | "Target": "Parameter", |
| | | "Id": "Param_Angle_Rotation_2_ArtMesh62" |
| | | }, |
| | | "VertexIndex": 2, |
| | | "Scale": 20, |
| | | "Weight": 100, |
| | | "Type": "Angle", |
| | | "Reflect": false |
| | | }, |
| | | { |
| | | "Destination": { |
| | | "Target": "Parameter", |
| | | "Id": "Param_Angle_Rotation_3_ArtMesh62" |
| | | }, |
| | | "VertexIndex": 3, |
| | | "Scale": 30, |
| | | "Weight": 100, |
| | | "Type": "Angle", |
| | | "Reflect": false |
| | | }, |
| | | { |
| | | "Destination": { |
| | | "Target": "Parameter", |
| | | "Id": "Param_Angle_Rotation_4_ArtMesh62" |
| | | }, |
| | | "VertexIndex": 4, |
| | | "Scale": 30, |
| | | "Weight": 100, |
| | | "Type": "Angle", |
| | | "Reflect": false |
| | | }, |
| | | { |
| | | "Destination": { |
| | | "Target": "Parameter", |
| | | "Id": "Param_Angle_Rotation_5_ArtMesh62" |
| | | }, |
| | | "VertexIndex": 5, |
| | | "Scale": 30, |
| | | "Weight": 100, |
| | | "Type": "Angle", |
| | | "Reflect": false |
| | | }, |
| | | { |
| | | "Destination": { |
| | | "Target": "Parameter", |
| | | "Id": "Param_Angle_Rotation_6_ArtMesh62" |
| | | }, |
| | | "VertexIndex": 6, |
| | | "Scale": 30, |
| | | "Weight": 100, |
| | | "Type": "Angle", |
| | | "Reflect": false |
| | | }, |
| | | { |
| | | "Destination": { |
| | | "Target": "Parameter", |
| | | "Id": "Param_Angle_Rotation_7_ArtMesh62" |
| | | }, |
| | | "VertexIndex": 7, |
| | | "Scale": 30, |
| | | "Weight": 100, |
| | | "Type": "Angle", |
| | | "Reflect": false |
| | | } |
| | | ], |
| | | "Vertices": [ |
| | | { |
| | | "Position": { |
| | | "X": 0, |
| | | "Y": 0 |
| | | }, |
| | | "Mobility": 1, |
| | | "Delay": 1, |
| | | "Acceleration": 1, |
| | | "Radius": 10 |
| | | }, |
| | | { |
| | | "Position": { |
| | | "X": 0, |
| | | "Y": 10 |
| | | }, |
| | | "Mobility": 0.85, |
| | | "Delay": 0.85, |
| | | "Acceleration": 1.2, |
| | | "Radius": 10 |
| | | }, |
| | | { |
| | | "Position": { |
| | | "X": 0, |
| | | "Y": 20 |
| | | }, |
| | | "Mobility": 0.85, |
| | | "Delay": 0.85, |
| | | "Acceleration": 1.2, |
| | | "Radius": 10 |
| | | }, |
| | | { |
| | | "Position": { |
| | | "X": 0, |
| | | "Y": 30 |
| | | }, |
| | | "Mobility": 0.85, |
| | | "Delay": 0.85, |
| | | "Acceleration": 1.2, |
| | | "Radius": 10 |
| | | }, |
| | | { |
| | | "Position": { |
| | | "X": 0, |
| | | "Y": 40 |
| | | }, |
| | | "Mobility": 0.85, |
| | | "Delay": 0.85, |
| | | "Acceleration": 1.2, |
| | | "Radius": 10 |
| | | }, |
| | | { |
| | | "Position": { |
| | | "X": 0, |
| | | "Y": 50 |
| | | }, |
| | | "Mobility": 0.85, |
| | | "Delay": 0.85, |
| | | "Acceleration": 1.2, |
| | | "Radius": 10 |
| | | }, |
| | | { |
| | | "Position": { |
| | | "X": 0, |
| | | "Y": 60 |
| | | }, |
| | | "Mobility": 0.85, |
| | | "Delay": 0.85, |
| | | "Acceleration": 1.2, |
| | | "Radius": 10 |
| | | }, |
| | | { |
| | | "Position": { |
| | | "X": 0, |
| | | "Y": 70 |
| | | }, |
| | | "Mobility": 0.85, |
| | | "Delay": 0.85, |
| | | "Acceleration": 1.2, |
| | | "Radius": 10 |
| | | }, |
| | | { |
| | | "Position": { |
| | | "X": 0, |
| | | "Y": 80 |
| | | }, |
| | | "Mobility": 0.85, |
| | | "Delay": 0.85, |
| | | "Acceleration": 1.2, |
| | | "Radius": 10 |
| | | }, |
| | | { |
| | | "Position": { |
| | | "X": 0, |
| | | "Y": 90 |
| | | }, |
| | | "Mobility": 0.85, |
| | | "Delay": 0.85, |
| | | "Acceleration": 1.2, |
| | | "Radius": 10 |
| | | }, |
| | | { |
| | | "Position": { |
| | | "X": 0, |
| | | "Y": 100 |
| | | }, |
| | | "Mobility": 0.85, |
| | | "Delay": 0.85, |
| | | "Acceleration": 1.2, |
| | | "Radius": 10 |
| | | } |
| | | ], |
| | | "Normalization": { |
| | | "Position": { |
| | | "Minimum": -10, |
| | | "Default": 0, |
| | | "Maximum": 10 |
| | | }, |
| | | "Angle": { |
| | | "Minimum": -10, |
| | | "Default": 0, |
| | | "Maximum": 10 |
| | | } |
| | | } |
| | | }, |
| | | { |
| | | "Id": "PhysicsSetting10", |
| | | "Input": [ |
| | | { |
| | | "Source": { |
| | | "Target": "Parameter", |
| | | "Id": "ParamAngleX" |
| | | }, |
| | | "Weight": 60, |
| | | "Type": "X", |
| | | "Reflect": false |
| | | }, |
| | | { |
| | | "Source": { |
| | | "Target": "Parameter", |
| | | "Id": "ParamAngleZ" |
| | | }, |
| | | "Weight": 60, |
| | | "Type": "Angle", |
| | | "Reflect": false |
| | | }, |
| | | { |
| | | "Source": { |
| | | "Target": "Parameter", |
| | | "Id": "ParamBodyAngleX" |
| | | }, |
| | | "Weight": 40, |
| | | "Type": "X", |
| | | "Reflect": false |
| | | }, |
| | | { |
| | | "Source": { |
| | | "Target": "Parameter", |
| | | "Id": "ParamBodyAngleZ" |
| | | }, |
| | | "Weight": 40, |
| | | "Type": "Angle", |
| | | "Reflect": false |
| | | } |
| | | ], |
| | | "Output": [ |
| | | { |
| | | "Destination": { |
| | | "Target": "Parameter", |
| | | "Id": "Param_Angle_Rotation_1_ArtMesh54" |
| | | }, |
| | | "VertexIndex": 1, |
| | | "Scale": 5, |
| | | "Weight": 100, |
| | | "Type": "Angle", |
| | | "Reflect": false |
| | | }, |
| | | { |
| | | "Destination": { |
| | | "Target": "Parameter", |
| | | "Id": "Param_Angle_Rotation_2_ArtMesh54" |
| | | }, |
| | | "VertexIndex": 2, |
| | | "Scale": 5, |
| | | "Weight": 100, |
| | | "Type": "Angle", |
| | | "Reflect": false |
| | | }, |
| | | { |
| | | "Destination": { |
| | | "Target": "Parameter", |
| | | "Id": "Param_Angle_Rotation_3_ArtMesh54" |
| | | }, |
| | | "VertexIndex": 3, |
| | | "Scale": 10, |
| | | "Weight": 100, |
| | | "Type": "Angle", |
| | | "Reflect": false |
| | | }, |
| | | { |
| | | "Destination": { |
| | | "Target": "Parameter", |
| | | "Id": "Param_Angle_Rotation_4_ArtMesh54" |
| | | }, |
| | | "VertexIndex": 4, |
| | | "Scale": 20, |
| | | "Weight": 100, |
| | | "Type": "Angle", |
| | | "Reflect": false |
| | | }, |
| | | { |
| | | "Destination": { |
| | | "Target": "Parameter", |
| | | "Id": "Param_Angle_Rotation_5_ArtMesh54" |
| | | }, |
| | | "VertexIndex": 5, |
| | | "Scale": 20, |
| | | "Weight": 100, |
| | | "Type": "Angle", |
| | | "Reflect": false |
| | | }, |
| | | { |
| | | "Destination": { |
| | | "Target": "Parameter", |
| | | "Id": "Param_Angle_Rotation_6_ArtMesh54" |
| | | }, |
| | | "VertexIndex": 6, |
| | | "Scale": 25, |
| | | "Weight": 100, |
| | | "Type": "Angle", |
| | | "Reflect": false |
| | | }, |
| | | { |
| | | "Destination": { |
| | | "Target": "Parameter", |
| | | "Id": "Param_Angle_Rotation_7_ArtMesh54" |
| | | }, |
| | | "VertexIndex": 7, |
| | | "Scale": 30, |
| | | "Weight": 100, |
| | | "Type": "Angle", |
| | | "Reflect": false |
| | | } |
| | | ], |
| | | "Vertices": [ |
| | | { |
| | | "Position": { |
| | | "X": 0, |
| | | "Y": 0 |
| | | }, |
| | | "Mobility": 0.9, |
| | | "Delay": 1, |
| | | "Acceleration": 1, |
| | | "Radius": 15 |
| | | }, |
| | | { |
| | | "Position": { |
| | | "X": 0, |
| | | "Y": 15 |
| | | }, |
| | | "Mobility": 0.9, |
| | | "Delay": 0.85, |
| | | "Acceleration": 1.2, |
| | | "Radius": 15 |
| | | }, |
| | | { |
| | | "Position": { |
| | | "X": 0, |
| | | "Y": 30 |
| | | }, |
| | | "Mobility": 0.9, |
| | | "Delay": 0.85, |
| | | "Acceleration": 1.2, |
| | | "Radius": 15 |
| | | }, |
| | | { |
| | | "Position": { |
| | | "X": 0, |
| | | "Y": 45 |
| | | }, |
| | | "Mobility": 0.9, |
| | | "Delay": 0.85, |
| | | "Acceleration": 1.2, |
| | | "Radius": 15 |
| | | }, |
| | | { |
| | | "Position": { |
| | | "X": 0, |
| | | "Y": 60 |
| | | }, |
| | | "Mobility": 0.9, |
| | | "Delay": 0.85, |
| | | "Acceleration": 1.2, |
| | | "Radius": 15 |
| | | }, |
| | | { |
| | | "Position": { |
| | | "X": 0, |
| | | "Y": 75 |
| | | }, |
| | | "Mobility": 0.9, |
| | | "Delay": 0.85, |
| | | "Acceleration": 1.2, |
| | | "Radius": 15 |
| | | }, |
| | | { |
| | | "Position": { |
| | | "X": 0, |
| | | "Y": 90 |
| | | }, |
| | | "Mobility": 0.9, |
| | | "Delay": 0.85, |
| | | "Acceleration": 1.2, |
| | | "Radius": 15 |
| | | }, |
| | | { |
| | | "Position": { |
| | | "X": 0, |
| | | "Y": 105 |
| | | }, |
| | | "Mobility": 0.9, |
| | | "Delay": 0.85, |
| | | "Acceleration": 1.2, |
| | | "Radius": 15 |
| | | }, |
| | | { |
| | | "Position": { |
| | | "X": 0, |
| | | "Y": 120 |
| | | }, |
| | | "Mobility": 0.9, |
| | | "Delay": 0.85, |
| | | "Acceleration": 1.2, |
| | | "Radius": 15 |
| | | }, |
| | | { |
| | | "Position": { |
| | | "X": 0, |
| | | "Y": 135 |
| | | }, |
| | | "Mobility": 0.9, |
| | | "Delay": 0.85, |
| | | "Acceleration": 1.2, |
| | | "Radius": 15 |
| | | }, |
| | | { |
| | | "Position": { |
| | | "X": 0, |
| | | "Y": 150 |
| | | }, |
| | | "Mobility": 0.9, |
| | | "Delay": 0.85, |
| | | "Acceleration": 1.2, |
| | | "Radius": 15 |
| | | } |
| | | ], |
| | | "Normalization": { |
| | | "Position": { |
| | | "Minimum": -10, |
| | | "Default": 0, |
| | | "Maximum": 10 |
| | | }, |
| | | "Angle": { |
| | | "Minimum": -10, |
| | | "Default": 0, |
| | | "Maximum": 10 |
| | | } |
| | | } |
| | | }, |
| | | { |
| | | "Id": "PhysicsSetting11", |
| | | "Input": [ |
| | | { |
| | | "Source": { |
| | | "Target": "Parameter", |
| | | "Id": "ParamAngleX" |
| | | }, |
| | | "Weight": 60, |
| | | "Type": "X", |
| | | "Reflect": false |
| | | }, |
| | | { |
| | | "Source": { |
| | | "Target": "Parameter", |
| | | "Id": "ParamAngleZ" |
| | | }, |
| | | "Weight": 60, |
| | | "Type": "Angle", |
| | | "Reflect": false |
| | | }, |
| | | { |
| | | "Source": { |
| | | "Target": "Parameter", |
| | | "Id": "ParamBodyAngleX" |
| | | }, |
| | | "Weight": 40, |
| | | "Type": "X", |
| | | "Reflect": false |
| | | }, |
| | | { |
| | | "Source": { |
| | | "Target": "Parameter", |
| | | "Id": "ParamBodyAngleZ" |
| | | }, |
| | | "Weight": 40, |
| | | "Type": "Angle", |
| | | "Reflect": false |
| | | } |
| | | ], |
| | | "Output": [ |
| | | { |
| | | "Destination": { |
| | | "Target": "Parameter", |
| | | "Id": "Param_Angle_Rotation_1_ArtMesh55" |
| | | }, |
| | | "VertexIndex": 1, |
| | | "Scale": 5, |
| | | "Weight": 100, |
| | | "Type": "Angle", |
| | | "Reflect": false |
| | | }, |
| | | { |
| | | "Destination": { |
| | | "Target": "Parameter", |
| | | "Id": "Param_Angle_Rotation_2_ArtMesh55" |
| | | }, |
| | | "VertexIndex": 2, |
| | | "Scale": 5, |
| | | "Weight": 100, |
| | | "Type": "Angle", |
| | | "Reflect": false |
| | | }, |
| | | { |
| | | "Destination": { |
| | | "Target": "Parameter", |
| | | "Id": "Param_Angle_Rotation_3_ArtMesh55" |
| | | }, |
| | | "VertexIndex": 3, |
| | | "Scale": 10, |
| | | "Weight": 100, |
| | | "Type": "Angle", |
| | | "Reflect": false |
| | | }, |
| | | { |
| | | "Destination": { |
| | | "Target": "Parameter", |
| | | "Id": "Param_Angle_Rotation_4_ArtMesh55" |
| | | }, |
| | | "VertexIndex": 4, |
| | | "Scale": 20, |
| | | "Weight": 100, |
| | | "Type": "Angle", |
| | | "Reflect": false |
| | | }, |
| | | { |
| | | "Destination": { |
| | | "Target": "Parameter", |
| | | "Id": "Param_Angle_Rotation_5_ArtMesh55" |
| | | }, |
| | | "VertexIndex": 5, |
| | | "Scale": 20, |
| | | "Weight": 100, |
| | | "Type": "Angle", |
| | | "Reflect": false |
| | | }, |
| | | { |
| | | "Destination": { |
| | | "Target": "Parameter", |
| | | "Id": "Param_Angle_Rotation_6_ArtMesh55" |
| | | }, |
| | | "VertexIndex": 6, |
| | | "Scale": 25, |
| | | "Weight": 100, |
| | | "Type": "Angle", |
| | | "Reflect": false |
| | | }, |
| | | { |
| | | "Destination": { |
| | | "Target": "Parameter", |
| | | "Id": "Param_Angle_Rotation_7_ArtMesh55" |
| | | }, |
| | | "VertexIndex": 7, |
| | | "Scale": 30, |
| | | "Weight": 100, |
| | | "Type": "Angle", |
| | | "Reflect": false |
| | | } |
| | | ], |
| | | "Vertices": [ |
| | | { |
| | | "Position": { |
| | | "X": 0, |
| | | "Y": 0 |
| | | }, |
| | | "Mobility": 0.9, |
| | | "Delay": 0.7, |
| | | "Acceleration": 1, |
| | | "Radius": 15 |
| | | }, |
| | | { |
| | | "Position": { |
| | | "X": 0, |
| | | "Y": 15 |
| | | }, |
| | | "Mobility": 0.9, |
| | | "Delay": 0.85, |
| | | "Acceleration": 1.2, |
| | | "Radius": 15 |
| | | }, |
| | | { |
| | | "Position": { |
| | | "X": 0, |
| | | "Y": 30 |
| | | }, |
| | | "Mobility": 0.9, |
| | | "Delay": 0.85, |
| | | "Acceleration": 1.2, |
| | | "Radius": 15 |
| | | }, |
| | | { |
| | | "Position": { |
| | | "X": 0, |
| | | "Y": 45 |
| | | }, |
| | | "Mobility": 0.9, |
| | | "Delay": 0.85, |
| | | "Acceleration": 1.2, |
| | | "Radius": 15 |
| | | }, |
| | | { |
| | | "Position": { |
| | | "X": 0, |
| | | "Y": 60 |
| | | }, |
| | | "Mobility": 0.9, |
| | | "Delay": 0.85, |
| | | "Acceleration": 1.2, |
| | | "Radius": 15 |
| | | }, |
| | | { |
| | | "Position": { |
| | | "X": 0, |
| | | "Y": 75 |
| | | }, |
| | | "Mobility": 0.9, |
| | | "Delay": 0.85, |
| | | "Acceleration": 1.2, |
| | | "Radius": 15 |
| | | }, |
| | | { |
| | | "Position": { |
| | | "X": 0, |
| | | "Y": 90 |
| | | }, |
| | | "Mobility": 0.9, |
| | | "Delay": 0.85, |
| | | "Acceleration": 1.2, |
| | | "Radius": 15 |
| | | }, |
| | | { |
| | | "Position": { |
| | | "X": 0, |
| | | "Y": 105 |
| | | }, |
| | | "Mobility": 0.9, |
| | | "Delay": 0.85, |
| | | "Acceleration": 1.2, |
| | | "Radius": 15 |
| | | }, |
| | | { |
| | | "Position": { |
| | | "X": 0, |
| | | "Y": 120 |
| | | }, |
| | | "Mobility": 0.9, |
| | | "Delay": 0.85, |
| | | "Acceleration": 1.2, |
| | | "Radius": 15 |
| | | }, |
| | | { |
| | | "Position": { |
| | | "X": 0, |
| | | "Y": 135 |
| | | }, |
| | | "Mobility": 0.9, |
| | | "Delay": 0.85, |
| | | "Acceleration": 1.2, |
| | | "Radius": 15 |
| | | }, |
| | | { |
| | | "Position": { |
| | | "X": 0, |
| | | "Y": 150 |
| | | }, |
| | | "Mobility": 0.9, |
| | | "Delay": 0.85, |
| | | "Acceleration": 1.2, |
| | | "Radius": 15 |
| | | } |
| | | ], |
| | | "Normalization": { |
| | | "Position": { |
| | | "Minimum": -10, |
| | | "Default": 0, |
| | | "Maximum": 10 |
| | | }, |
| | | "Angle": { |
| | | "Minimum": -10, |
| | | "Default": 0, |
| | | "Maximum": 10 |
| | | } |
| | | } |
| | | } |
| | | ] |
| | | } |
| New file |
| | |
| | | { |
| | | "Type": "Live2D Pose", |
| | | "Groups": [ |
| | | [ |
| | | { |
| | | "Id": "PartArmA", |
| | | "Link": [] |
| | | }, |
| | | { |
| | | "Id": "PartArmB", |
| | | "Link": [] |
| | | } |
| | | ] |
| | | ] |
| | | } |
| New file |
| | |
| | | { |
| | | "Version": 3, |
| | | "Meta": { |
| | | "Duration": 4.7, |
| | | "Fps": 30.0, |
| | | "Loop": true, |
| | | "AreBeziersRestricted": false, |
| | | "CurveCount": 29, |
| | | "TotalSegmentCount": 135, |
| | | "TotalPointCount": 374, |
| | | "UserDataCount": 0, |
| | | "TotalUserDataSize": 0 |
| | | }, |
| | | "Curves": [ |
| | | { |
| | | "Target": "Parameter", |
| | | "Id": "ParamAngleX", |
| | | "Segments": [ |
| | | 0, |
| | | -8, |
| | | 1, |
| | | 0.067, |
| | | -8, |
| | | 0.133, |
| | | -8, |
| | | 0.2, |
| | | -8, |
| | | 1, |
| | | 0.278, |
| | | -8, |
| | | 0.356, |
| | | -8, |
| | | 0.433, |
| | | -8, |
| | | 1, |
| | | 0.556, |
| | | -8, |
| | | 0.678, |
| | | -8, |
| | | 0.8, |
| | | -8, |
| | | 1, |
| | | 0.956, |
| | | -8, |
| | | 1.111, |
| | | -8, |
| | | 1.267, |
| | | -8, |
| | | 1, |
| | | 1.522, |
| | | -8, |
| | | 1.778, |
| | | 0, |
| | | 2.033, |
| | | 0, |
| | | 1, |
| | | 2.122, |
| | | 0, |
| | | 2.211, |
| | | 0, |
| | | 2.3, |
| | | 0, |
| | | 1, |
| | | 2.556, |
| | | 0, |
| | | 2.811, |
| | | 9, |
| | | 3.067, |
| | | 9, |
| | | 1, |
| | | 3.356, |
| | | 9, |
| | | 3.644, |
| | | 0, |
| | | 3.933, |
| | | 0, |
| | | 1, |
| | | 4.067, |
| | | 0, |
| | | 4.2, |
| | | 1, |
| | | 4.333, |
| | | 1, |
| | | 0, |
| | | 4.7, |
| | | 1 |
| | | ] |
| | | }, |
| | | { |
| | | "Target": "Parameter", |
| | | "Id": "ParamAngleY", |
| | | "Segments": [ |
| | | 0, |
| | | -5, |
| | | 1, |
| | | 0.067, |
| | | -5, |
| | | 0.133, |
| | | -5, |
| | | 0.2, |
| | | -5, |
| | | 1, |
| | | 0.322, |
| | | -5, |
| | | 0.444, |
| | | 16, |
| | | 0.567, |
| | | 16, |
| | | 1, |
| | | 0.711, |
| | | 16, |
| | | 0.856, |
| | | -12, |
| | | 1, |
| | | -12, |
| | | 1, |
| | | 1.089, |
| | | -12, |
| | | 1.178, |
| | | 11, |
| | | 1.267, |
| | | 11, |
| | | 1, |
| | | 1.356, |
| | | 11, |
| | | 1.444, |
| | | 9.376, |
| | | 1.533, |
| | | 3, |
| | | 1, |
| | | 1.611, |
| | | -2.579, |
| | | 1.689, |
| | | -8, |
| | | 1.767, |
| | | -8, |
| | | 1, |
| | | 1.856, |
| | | -8, |
| | | 1.944, |
| | | 0, |
| | | 2.033, |
| | | 0, |
| | | 1, |
| | | 2.122, |
| | | 0, |
| | | 2.211, |
| | | 0, |
| | | 2.3, |
| | | 0, |
| | | 1, |
| | | 2.578, |
| | | 0, |
| | | 2.856, |
| | | -30, |
| | | 3.133, |
| | | -30, |
| | | 1, |
| | | 3.278, |
| | | -30, |
| | | 3.422, |
| | | 15, |
| | | 3.567, |
| | | 15, |
| | | 1, |
| | | 3.689, |
| | | 15, |
| | | 3.811, |
| | | -9, |
| | | 3.933, |
| | | -9, |
| | | 0, |
| | | 4.7, |
| | | -9 |
| | | ] |
| | | }, |
| | | { |
| | | "Target": "Parameter", |
| | | "Id": "ParamAngleZ", |
| | | "Segments": [ |
| | | 0, |
| | | 0, |
| | | 1, |
| | | 0.067, |
| | | 0, |
| | | 0.133, |
| | | 0, |
| | | 0.2, |
| | | 0, |
| | | 1, |
| | | 0.278, |
| | | 0, |
| | | 0.356, |
| | | 0, |
| | | 0.433, |
| | | 0, |
| | | 1, |
| | | 0.711, |
| | | 0, |
| | | 0.989, |
| | | 0, |
| | | 1.267, |
| | | 0, |
| | | 1, |
| | | 1.522, |
| | | 0, |
| | | 1.778, |
| | | 14, |
| | | 2.033, |
| | | 14, |
| | | 1, |
| | | 2.178, |
| | | 14, |
| | | 2.322, |
| | | 14, |
| | | 2.467, |
| | | 14, |
| | | 1, |
| | | 2.8, |
| | | 14, |
| | | 3.133, |
| | | 16, |
| | | 3.467, |
| | | 16, |
| | | 1, |
| | | 3.633, |
| | | 16, |
| | | 3.8, |
| | | -13, |
| | | 3.967, |
| | | -13, |
| | | 1, |
| | | 4.111, |
| | | -13, |
| | | 4.256, |
| | | -11.207, |
| | | 4.4, |
| | | -11.207, |
| | | 0, |
| | | 4.7, |
| | | -11.207 |
| | | ] |
| | | }, |
| | | { |
| | | "Target": "Parameter", |
| | | "Id": "ParamCheek", |
| | | "Segments": [ |
| | | 0, |
| | | 0, |
| | | 0, |
| | | 4.7, |
| | | 0 |
| | | ] |
| | | }, |
| | | { |
| | | "Target": "Parameter", |
| | | "Id": "ParamEyeLOpen", |
| | | "Segments": [ |
| | | 0, |
| | | 1, |
| | | 1, |
| | | 0.556, |
| | | 1, |
| | | 1.111, |
| | | 1, |
| | | 1.667, |
| | | 1, |
| | | 1, |
| | | 1.711, |
| | | 1, |
| | | 1.756, |
| | | 0, |
| | | 1.8, |
| | | 0, |
| | | 1, |
| | | 1.822, |
| | | 0, |
| | | 1.844, |
| | | 0, |
| | | 1.867, |
| | | 0, |
| | | 1, |
| | | 1.911, |
| | | 0, |
| | | 1.956, |
| | | 1, |
| | | 2, |
| | | 1, |
| | | 1, |
| | | 2.489, |
| | | 1, |
| | | 2.978, |
| | | 1, |
| | | 3.467, |
| | | 1, |
| | | 1, |
| | | 3.511, |
| | | 1, |
| | | 3.556, |
| | | 0, |
| | | 3.6, |
| | | 0, |
| | | 1, |
| | | 3.622, |
| | | 0, |
| | | 3.644, |
| | | 0, |
| | | 3.667, |
| | | 0, |
| | | 1, |
| | | 3.733, |
| | | 0, |
| | | 3.8, |
| | | 1, |
| | | 3.867, |
| | | 1, |
| | | 0, |
| | | 4.7, |
| | | 1 |
| | | ] |
| | | }, |
| | | { |
| | | "Target": "Parameter", |
| | | "Id": "ParamEyeLSmile", |
| | | "Segments": [ |
| | | 0, |
| | | 0, |
| | | 0, |
| | | 4.7, |
| | | 0 |
| | | ] |
| | | }, |
| | | { |
| | | "Target": "Parameter", |
| | | "Id": "ParamEyeROpen", |
| | | "Segments": [ |
| | | 0, |
| | | 1, |
| | | 1, |
| | | 0.556, |
| | | 1, |
| | | 1.111, |
| | | 1, |
| | | 1.667, |
| | | 1, |
| | | 1, |
| | | 1.711, |
| | | 1, |
| | | 1.756, |
| | | 0, |
| | | 1.8, |
| | | 0, |
| | | 1, |
| | | 1.822, |
| | | 0, |
| | | 1.844, |
| | | 0, |
| | | 1.867, |
| | | 0, |
| | | 1, |
| | | 1.911, |
| | | 0, |
| | | 1.956, |
| | | 1, |
| | | 2, |
| | | 1, |
| | | 1, |
| | | 2.489, |
| | | 1, |
| | | 2.978, |
| | | 1, |
| | | 3.467, |
| | | 1, |
| | | 1, |
| | | 3.511, |
| | | 1, |
| | | 3.556, |
| | | 0, |
| | | 3.6, |
| | | 0, |
| | | 1, |
| | | 3.622, |
| | | 0, |
| | | 3.644, |
| | | 0, |
| | | 3.667, |
| | | 0, |
| | | 1, |
| | | 3.733, |
| | | 0, |
| | | 3.8, |
| | | 1, |
| | | 3.867, |
| | | 1, |
| | | 0, |
| | | 4.7, |
| | | 1 |
| | | ] |
| | | }, |
| | | { |
| | | "Target": "Parameter", |
| | | "Id": "ParamEyeRSmile", |
| | | "Segments": [ |
| | | 0, |
| | | 0, |
| | | 0, |
| | | 4.7, |
| | | 0 |
| | | ] |
| | | }, |
| | | { |
| | | "Target": "Parameter", |
| | | "Id": "ParamEyeBallX", |
| | | "Segments": [ |
| | | 0, |
| | | 0, |
| | | 1, |
| | | 0.156, |
| | | 0, |
| | | 0.311, |
| | | -0.02, |
| | | 0.467, |
| | | -0.02, |
| | | 1, |
| | | 0.578, |
| | | -0.02, |
| | | 0.689, |
| | | 0, |
| | | 0.8, |
| | | 0, |
| | | 1, |
| | | 1.056, |
| | | 0, |
| | | 1.311, |
| | | 0, |
| | | 1.567, |
| | | 0, |
| | | 1, |
| | | 1.767, |
| | | 0, |
| | | 1.967, |
| | | -0.131, |
| | | 2.167, |
| | | -0.15, |
| | | 1, |
| | | 2.644, |
| | | -0.195, |
| | | 3.122, |
| | | -0.2, |
| | | 3.6, |
| | | -0.2, |
| | | 1, |
| | | 3.622, |
| | | -0.2, |
| | | 3.644, |
| | | 0.803, |
| | | 3.667, |
| | | 0.803, |
| | | 0, |
| | | 4.7, |
| | | 0.803 |
| | | ] |
| | | }, |
| | | { |
| | | "Target": "Parameter", |
| | | "Id": "ParamEyeBallY", |
| | | "Segments": [ |
| | | 0, |
| | | 0, |
| | | 1, |
| | | 0.156, |
| | | 0, |
| | | 0.311, |
| | | 0.01, |
| | | 0.467, |
| | | 0.08, |
| | | 1, |
| | | 0.578, |
| | | 0.13, |
| | | 0.689, |
| | | 0.21, |
| | | 0.8, |
| | | 0.21, |
| | | 1, |
| | | 1.056, |
| | | 0.21, |
| | | 1.311, |
| | | 0.21, |
| | | 1.567, |
| | | 0.21, |
| | | 1, |
| | | 1.767, |
| | | 0.21, |
| | | 1.967, |
| | | 0.08, |
| | | 2.167, |
| | | 0.08, |
| | | 1, |
| | | 2.644, |
| | | 0.08, |
| | | 3.122, |
| | | 0.086, |
| | | 3.6, |
| | | 0.1, |
| | | 1, |
| | | 3.622, |
| | | 0.101, |
| | | 3.644, |
| | | 0.794, |
| | | 3.667, |
| | | 0.794, |
| | | 0, |
| | | 4.7, |
| | | 0.794 |
| | | ] |
| | | }, |
| | | { |
| | | "Target": "Parameter", |
| | | "Id": "ParamBrowLY", |
| | | "Segments": [ |
| | | 0, |
| | | 0, |
| | | 0, |
| | | 4.7, |
| | | 0 |
| | | ] |
| | | }, |
| | | { |
| | | "Target": "Parameter", |
| | | "Id": "ParamBrowRY", |
| | | "Segments": [ |
| | | 0, |
| | | 0, |
| | | 0, |
| | | 4.7, |
| | | 0 |
| | | ] |
| | | }, |
| | | { |
| | | "Target": "Parameter", |
| | | "Id": "ParamBrowLX", |
| | | "Segments": [ |
| | | 0, |
| | | 0, |
| | | 0, |
| | | 4.7, |
| | | 0 |
| | | ] |
| | | }, |
| | | { |
| | | "Target": "Parameter", |
| | | "Id": "ParamBrowRX", |
| | | "Segments": [ |
| | | 0, |
| | | 0, |
| | | 0, |
| | | 4.7, |
| | | 0 |
| | | ] |
| | | }, |
| | | { |
| | | "Target": "Parameter", |
| | | "Id": "ParamBrowLAngle", |
| | | "Segments": [ |
| | | 0, |
| | | 0, |
| | | 0, |
| | | 4.7, |
| | | 0 |
| | | ] |
| | | }, |
| | | { |
| | | "Target": "Parameter", |
| | | "Id": "ParamBrowRAngle", |
| | | "Segments": [ |
| | | 0, |
| | | 0, |
| | | 0, |
| | | 4.7, |
| | | 0 |
| | | ] |
| | | }, |
| | | { |
| | | "Target": "Parameter", |
| | | "Id": "ParamBrowLForm", |
| | | "Segments": [ |
| | | 0, |
| | | 0, |
| | | 0, |
| | | 4.7, |
| | | 0 |
| | | ] |
| | | }, |
| | | { |
| | | "Target": "Parameter", |
| | | "Id": "ParamBrowRForm", |
| | | "Segments": [ |
| | | 0, |
| | | 0, |
| | | 0, |
| | | 4.7, |
| | | 0 |
| | | ] |
| | | }, |
| | | { |
| | | "Target": "Parameter", |
| | | "Id": "ParamBodyAngleX", |
| | | "Segments": [ |
| | | 0, |
| | | 1, |
| | | 1, |
| | | 0.856, |
| | | 1, |
| | | 1.711, |
| | | 1, |
| | | 2.567, |
| | | 1, |
| | | 1, |
| | | 2.789, |
| | | 1, |
| | | 3.011, |
| | | 1.145, |
| | | 3.233, |
| | | 0, |
| | | 1, |
| | | 3.467, |
| | | -1.202, |
| | | 3.7, |
| | | -6, |
| | | 3.933, |
| | | -6, |
| | | 0, |
| | | 4.7, |
| | | -6 |
| | | ] |
| | | }, |
| | | { |
| | | "Target": "Parameter", |
| | | "Id": "ParamBodyAngleY", |
| | | "Segments": [ |
| | | 0, |
| | | 0, |
| | | 1, |
| | | 0.067, |
| | | 0, |
| | | 0.133, |
| | | 0, |
| | | 0.2, |
| | | 0, |
| | | 1, |
| | | 0.278, |
| | | 0, |
| | | 0.356, |
| | | 7, |
| | | 0.433, |
| | | 7, |
| | | 1, |
| | | 0.611, |
| | | 7, |
| | | 0.789, |
| | | -4, |
| | | 0.967, |
| | | -4, |
| | | 1, |
| | | 1.078, |
| | | -4, |
| | | 1.189, |
| | | 6, |
| | | 1.3, |
| | | 6, |
| | | 1, |
| | | 1.433, |
| | | 6, |
| | | 1.567, |
| | | -3, |
| | | 1.7, |
| | | -3, |
| | | 1, |
| | | 1.789, |
| | | -3, |
| | | 1.878, |
| | | -1.459, |
| | | 1.967, |
| | | 0, |
| | | 1, |
| | | 2.067, |
| | | 1.642, |
| | | 2.167, |
| | | 3.47, |
| | | 2.267, |
| | | 4, |
| | | 1, |
| | | 2.367, |
| | | 4.53, |
| | | 2.467, |
| | | 4.312, |
| | | 2.567, |
| | | 5, |
| | | 1, |
| | | 2.889, |
| | | 7.215, |
| | | 3.211, |
| | | 10, |
| | | 3.533, |
| | | 10, |
| | | 1, |
| | | 3.667, |
| | | 10, |
| | | 3.8, |
| | | 0, |
| | | 3.933, |
| | | 0, |
| | | 1, |
| | | 4.067, |
| | | 0, |
| | | 4.2, |
| | | 0, |
| | | 4.333, |
| | | 0, |
| | | 0, |
| | | 4.7, |
| | | 0 |
| | | ] |
| | | }, |
| | | { |
| | | "Target": "Parameter", |
| | | "Id": "ParamBodyAngleZ", |
| | | "Segments": [ |
| | | 0, |
| | | 0, |
| | | 1, |
| | | 0.822, |
| | | 0, |
| | | 1.644, |
| | | 0, |
| | | 2.467, |
| | | 0, |
| | | 1, |
| | | 2.722, |
| | | 0, |
| | | 2.978, |
| | | 5, |
| | | 3.233, |
| | | 5, |
| | | 1, |
| | | 3.489, |
| | | 5, |
| | | 3.744, |
| | | -5, |
| | | 4, |
| | | -5, |
| | | 1, |
| | | 4.156, |
| | | -5, |
| | | 4.311, |
| | | -3.976, |
| | | 4.467, |
| | | -3.976, |
| | | 0, |
| | | 4.7, |
| | | -3.976 |
| | | ] |
| | | }, |
| | | { |
| | | "Target": "Parameter", |
| | | "Id": "ParamBreath", |
| | | "Segments": [ |
| | | 0, |
| | | 0, |
| | | 0, |
| | | 4.7, |
| | | 0 |
| | | ] |
| | | }, |
| | | { |
| | | "Target": "Parameter", |
| | | "Id": "ParamShoulder", |
| | | "Segments": [ |
| | | 0, |
| | | 0, |
| | | 1, |
| | | 0.111, |
| | | 0, |
| | | 0.222, |
| | | 0.2, |
| | | 0.333, |
| | | 0.2, |
| | | 1, |
| | | 0.422, |
| | | 0.2, |
| | | 0.511, |
| | | -0.1, |
| | | 0.6, |
| | | -0.1, |
| | | 1, |
| | | 1.578, |
| | | -0.1, |
| | | 2.556, |
| | | -0.1, |
| | | 3.533, |
| | | -0.1, |
| | | 1, |
| | | 3.611, |
| | | -0.1, |
| | | 3.689, |
| | | 0.2, |
| | | 3.767, |
| | | 0.2, |
| | | 1, |
| | | 3.989, |
| | | 0.2, |
| | | 4.211, |
| | | -0.9, |
| | | 4.433, |
| | | -0.9, |
| | | 0, |
| | | 4.7, |
| | | -0.9 |
| | | ] |
| | | }, |
| | | { |
| | | "Target": "Parameter", |
| | | "Id": "ParamLeg", |
| | | "Segments": [ |
| | | 0, |
| | | 1, |
| | | 0, |
| | | 4.7, |
| | | 1 |
| | | ] |
| | | }, |
| | | { |
| | | "Target": "Parameter", |
| | | "Id": "ParamArmLA", |
| | | "Segments": [ |
| | | 0, |
| | | -10, |
| | | 1, |
| | | 0.178, |
| | | -10, |
| | | 0.356, |
| | | -7, |
| | | 0.533, |
| | | -7, |
| | | 1, |
| | | 0.7, |
| | | -7, |
| | | 0.867, |
| | | -10, |
| | | 1.033, |
| | | -10, |
| | | 1, |
| | | 1.2, |
| | | -10, |
| | | 1.367, |
| | | -8, |
| | | 1.533, |
| | | -8, |
| | | 1, |
| | | 1.611, |
| | | -8, |
| | | 1.689, |
| | | -8.746, |
| | | 1.767, |
| | | -9, |
| | | 1, |
| | | 2.011, |
| | | -9.797, |
| | | 2.256, |
| | | -10, |
| | | 2.5, |
| | | -10, |
| | | 1, |
| | | 2.556, |
| | | -10, |
| | | 2.611, |
| | | -10, |
| | | 2.667, |
| | | -10, |
| | | 1, |
| | | 2.789, |
| | | -10, |
| | | 2.911, |
| | | -10, |
| | | 3.033, |
| | | -10, |
| | | 0, |
| | | 4.7, |
| | | -10 |
| | | ] |
| | | }, |
| | | { |
| | | "Target": "Parameter", |
| | | "Id": "ParamArmRA", |
| | | "Segments": [ |
| | | 0, |
| | | -10, |
| | | 1, |
| | | 0.178, |
| | | -10, |
| | | 0.356, |
| | | -7, |
| | | 0.533, |
| | | -7, |
| | | 1, |
| | | 0.7, |
| | | -7, |
| | | 0.867, |
| | | -10, |
| | | 1.033, |
| | | -10, |
| | | 1, |
| | | 1.2, |
| | | -10, |
| | | 1.367, |
| | | -6, |
| | | 1.533, |
| | | -6, |
| | | 1, |
| | | 1.611, |
| | | -6, |
| | | 1.689, |
| | | -6.903, |
| | | 1.767, |
| | | -7.5, |
| | | 1, |
| | | 2.011, |
| | | -9.377, |
| | | 2.256, |
| | | -10, |
| | | 2.5, |
| | | -10, |
| | | 1, |
| | | 2.567, |
| | | -10, |
| | | 2.633, |
| | | -8.958, |
| | | 2.7, |
| | | -8.958, |
| | | 1, |
| | | 2.811, |
| | | -8.958, |
| | | 2.922, |
| | | -10, |
| | | 3.033, |
| | | -10, |
| | | 0, |
| | | 4.7, |
| | | -10 |
| | | ] |
| | | }, |
| | | { |
| | | "Target": "Parameter", |
| | | "Id": "ParamHairAhoge", |
| | | "Segments": [ |
| | | 0, |
| | | 0, |
| | | 1, |
| | | 0.144, |
| | | 0, |
| | | 0.289, |
| | | 10, |
| | | 0.433, |
| | | 10, |
| | | 1, |
| | | 0.578, |
| | | 10, |
| | | 0.722, |
| | | -10, |
| | | 0.867, |
| | | -10, |
| | | 1, |
| | | 0.989, |
| | | -10, |
| | | 1.111, |
| | | 4, |
| | | 1.233, |
| | | 4, |
| | | 1, |
| | | 1.322, |
| | | 4, |
| | | 1.411, |
| | | 2.767, |
| | | 1.5, |
| | | 0, |
| | | 1, |
| | | 1.611, |
| | | -3.459, |
| | | 1.722, |
| | | -5.351, |
| | | 1.833, |
| | | -5.351, |
| | | 1, |
| | | 1.922, |
| | | -5.351, |
| | | 2.011, |
| | | 1.661, |
| | | 2.1, |
| | | 1.661, |
| | | 1, |
| | | 2.233, |
| | | 1.661, |
| | | 2.367, |
| | | 0, |
| | | 2.5, |
| | | 0, |
| | | 1, |
| | | 2.867, |
| | | 0, |
| | | 3.233, |
| | | 10, |
| | | 3.6, |
| | | 10, |
| | | 1, |
| | | 3.722, |
| | | 10, |
| | | 3.844, |
| | | -10, |
| | | 3.967, |
| | | -10, |
| | | 1, |
| | | 4.078, |
| | | -10, |
| | | 4.189, |
| | | 6, |
| | | 4.3, |
| | | 6, |
| | | 1, |
| | | 4.356, |
| | | 6, |
| | | 4.411, |
| | | 0, |
| | | 4.467, |
| | | 0, |
| | | 0, |
| | | 4.7, |
| | | 0 |
| | | ] |
| | | }, |
| | | { |
| | | "Target": "PartOpacity", |
| | | "Id": "PartArmA", |
| | | "Segments": [ |
| | | 0, |
| | | 1, |
| | | 0, |
| | | 4.7, |
| | | 1 |
| | | ] |
| | | }, |
| | | { |
| | | "Target": "PartOpacity", |
| | | "Id": "PartArmB", |
| | | "Segments": [ |
| | | 0, |
| | | 0, |
| | | 0, |
| | | 4.7, |
| | | 0 |
| | | ] |
| | | } |
| | | ] |
| | | } |
| New file |
| | |
| | | { |
| | | "Version": 3, |
| | | "Meta": { |
| | | "Duration": 5.93, |
| | | "Fps": 30.0, |
| | | "Loop": true, |
| | | "AreBeziersRestricted": false, |
| | | "CurveCount": 31, |
| | | "TotalSegmentCount": 190, |
| | | "TotalPointCount": 537, |
| | | "UserDataCount": 0, |
| | | "TotalUserDataSize": 0 |
| | | }, |
| | | "Curves": [ |
| | | { |
| | | "Target": "Parameter", |
| | | "Id": "ParamAngleX", |
| | | "Segments": [ |
| | | 0, |
| | | 18, |
| | | 1, |
| | | 0.211, |
| | | 18, |
| | | 0.422, |
| | | 0, |
| | | 0.633, |
| | | 0, |
| | | 1, |
| | | 0.889, |
| | | 0, |
| | | 1.144, |
| | | 22, |
| | | 1.4, |
| | | 22, |
| | | 1, |
| | | 1.578, |
| | | 22, |
| | | 1.756, |
| | | 22, |
| | | 1.933, |
| | | 22, |
| | | 1, |
| | | 2.1, |
| | | 22, |
| | | 2.267, |
| | | 14.992, |
| | | 2.433, |
| | | 0, |
| | | 1, |
| | | 2.6, |
| | | -14.992, |
| | | 2.767, |
| | | -23, |
| | | 2.933, |
| | | -23, |
| | | 1, |
| | | 3.244, |
| | | -23, |
| | | 3.556, |
| | | -23, |
| | | 3.867, |
| | | -23, |
| | | 1, |
| | | 4.078, |
| | | -23, |
| | | 4.289, |
| | | 0, |
| | | 4.5, |
| | | 0, |
| | | 0, |
| | | 5.933, |
| | | 0 |
| | | ] |
| | | }, |
| | | { |
| | | "Target": "Parameter", |
| | | "Id": "ParamAngleY", |
| | | "Segments": [ |
| | | 0, |
| | | -24, |
| | | 1, |
| | | 0.211, |
| | | -24, |
| | | 0.422, |
| | | 0, |
| | | 0.633, |
| | | 0, |
| | | 1, |
| | | 0.889, |
| | | 0, |
| | | 1.144, |
| | | -18, |
| | | 1.4, |
| | | -18, |
| | | 1, |
| | | 1.522, |
| | | -18, |
| | | 1.644, |
| | | -11, |
| | | 1.767, |
| | | -11, |
| | | 1, |
| | | 1.822, |
| | | -11, |
| | | 1.878, |
| | | -11, |
| | | 1.933, |
| | | -11, |
| | | 1, |
| | | 2.1, |
| | | -11, |
| | | 2.267, |
| | | -3, |
| | | 2.433, |
| | | -3, |
| | | 1, |
| | | 2.6, |
| | | -3, |
| | | 2.767, |
| | | -30, |
| | | 2.933, |
| | | -30, |
| | | 1, |
| | | 3.133, |
| | | -30, |
| | | 3.333, |
| | | -23, |
| | | 3.533, |
| | | -23, |
| | | 1, |
| | | 3.644, |
| | | -23, |
| | | 3.756, |
| | | -23, |
| | | 3.867, |
| | | -23, |
| | | 1, |
| | | 3.911, |
| | | -23, |
| | | 3.956, |
| | | -23, |
| | | 4, |
| | | -23, |
| | | 1, |
| | | 4.167, |
| | | -23, |
| | | 4.333, |
| | | 0, |
| | | 4.5, |
| | | 0, |
| | | 0, |
| | | 5.933, |
| | | 0 |
| | | ] |
| | | }, |
| | | { |
| | | "Target": "Parameter", |
| | | "Id": "ParamAngleZ", |
| | | "Segments": [ |
| | | 0, |
| | | 0, |
| | | 1, |
| | | 0.222, |
| | | 0, |
| | | 0.444, |
| | | 0, |
| | | 0.667, |
| | | 0, |
| | | 1, |
| | | 0.756, |
| | | 0, |
| | | 0.844, |
| | | 1.707, |
| | | 0.933, |
| | | 8, |
| | | 1, |
| | | 1.122, |
| | | 21.373, |
| | | 1.311, |
| | | 30, |
| | | 1.5, |
| | | 30, |
| | | 1, |
| | | 1.656, |
| | | 30, |
| | | 1.811, |
| | | 30, |
| | | 1.967, |
| | | 30, |
| | | 1, |
| | | 2.289, |
| | | 30, |
| | | 2.611, |
| | | -30, |
| | | 2.933, |
| | | -30, |
| | | 1, |
| | | 3.244, |
| | | -30, |
| | | 3.556, |
| | | -30, |
| | | 3.867, |
| | | -30, |
| | | 1, |
| | | 4.078, |
| | | -30, |
| | | 4.289, |
| | | -21.337, |
| | | 4.5, |
| | | 1, |
| | | 1, |
| | | 4.578, |
| | | 9.23, |
| | | 4.656, |
| | | 17, |
| | | 4.733, |
| | | 17, |
| | | 0, |
| | | 5.933, |
| | | 17 |
| | | ] |
| | | }, |
| | | { |
| | | "Target": "Parameter", |
| | | "Id": "ParamCheek", |
| | | "Segments": [ |
| | | 0, |
| | | 1, |
| | | 0, |
| | | 5.933, |
| | | 1 |
| | | ] |
| | | }, |
| | | { |
| | | "Target": "Parameter", |
| | | "Id": "ParamEyeLOpen", |
| | | "Segments": [ |
| | | 0, |
| | | 1, |
| | | 1, |
| | | 0.333, |
| | | 1, |
| | | 0.667, |
| | | 1, |
| | | 1, |
| | | 1, |
| | | 1, |
| | | 1.044, |
| | | 1, |
| | | 1.089, |
| | | 0, |
| | | 1.133, |
| | | 0, |
| | | 1, |
| | | 1.156, |
| | | 0, |
| | | 1.178, |
| | | 0, |
| | | 1.2, |
| | | 0, |
| | | 1, |
| | | 1.256, |
| | | 0, |
| | | 1.311, |
| | | 1, |
| | | 1.367, |
| | | 1, |
| | | 1, |
| | | 1.833, |
| | | 1, |
| | | 2.3, |
| | | 1, |
| | | 2.767, |
| | | 1, |
| | | 1, |
| | | 2.867, |
| | | 1, |
| | | 2.967, |
| | | 1.2, |
| | | 3.067, |
| | | 1.2, |
| | | 1, |
| | | 3.233, |
| | | 1.2, |
| | | 3.4, |
| | | 1, |
| | | 3.567, |
| | | 1, |
| | | 1, |
| | | 3.689, |
| | | 1, |
| | | 3.811, |
| | | 1, |
| | | 3.933, |
| | | 1, |
| | | 1, |
| | | 3.978, |
| | | 1, |
| | | 4.022, |
| | | 0, |
| | | 4.067, |
| | | 0, |
| | | 1, |
| | | 4.089, |
| | | 0, |
| | | 4.111, |
| | | 0, |
| | | 4.133, |
| | | 0, |
| | | 1, |
| | | 4.189, |
| | | 0, |
| | | 4.244, |
| | | 1, |
| | | 4.3, |
| | | 1, |
| | | 1, |
| | | 4.4, |
| | | 1, |
| | | 4.5, |
| | | 1, |
| | | 4.6, |
| | | 1, |
| | | 1, |
| | | 4.633, |
| | | 1, |
| | | 4.667, |
| | | 0, |
| | | 4.7, |
| | | 0, |
| | | 0, |
| | | 5.933, |
| | | 0 |
| | | ] |
| | | }, |
| | | { |
| | | "Target": "Parameter", |
| | | "Id": "ParamEyeLSmile", |
| | | "Segments": [ |
| | | 0, |
| | | 0.63, |
| | | 1, |
| | | 1.433, |
| | | 0.63, |
| | | 2.867, |
| | | 0.6, |
| | | 4.3, |
| | | 0.6, |
| | | 1, |
| | | 4.4, |
| | | 0.6, |
| | | 4.5, |
| | | 0.771, |
| | | 4.6, |
| | | 0.771, |
| | | 0, |
| | | 5.933, |
| | | 0.771 |
| | | ] |
| | | }, |
| | | { |
| | | "Target": "Parameter", |
| | | "Id": "ParamEyeROpen", |
| | | "Segments": [ |
| | | 0, |
| | | 1, |
| | | 1, |
| | | 0.333, |
| | | 1, |
| | | 0.667, |
| | | 1, |
| | | 1, |
| | | 1, |
| | | 1, |
| | | 1.044, |
| | | 1, |
| | | 1.089, |
| | | 0, |
| | | 1.133, |
| | | 0, |
| | | 1, |
| | | 1.156, |
| | | 0, |
| | | 1.178, |
| | | 0, |
| | | 1.2, |
| | | 0, |
| | | 1, |
| | | 1.256, |
| | | 0, |
| | | 1.311, |
| | | 1, |
| | | 1.367, |
| | | 1, |
| | | 1, |
| | | 1.833, |
| | | 1, |
| | | 2.3, |
| | | 1, |
| | | 2.767, |
| | | 1, |
| | | 1, |
| | | 2.867, |
| | | 1, |
| | | 2.967, |
| | | 1.2, |
| | | 3.067, |
| | | 1.2, |
| | | 1, |
| | | 3.233, |
| | | 1.2, |
| | | 3.4, |
| | | 1, |
| | | 3.567, |
| | | 1, |
| | | 1, |
| | | 3.689, |
| | | 1, |
| | | 3.811, |
| | | 1, |
| | | 3.933, |
| | | 1, |
| | | 1, |
| | | 3.978, |
| | | 1, |
| | | 4.022, |
| | | 0, |
| | | 4.067, |
| | | 0, |
| | | 1, |
| | | 4.089, |
| | | 0, |
| | | 4.111, |
| | | 0, |
| | | 4.133, |
| | | 0, |
| | | 1, |
| | | 4.189, |
| | | 0, |
| | | 4.244, |
| | | 1, |
| | | 4.3, |
| | | 1, |
| | | 1, |
| | | 4.4, |
| | | 1, |
| | | 4.5, |
| | | 1, |
| | | 4.6, |
| | | 1, |
| | | 1, |
| | | 4.633, |
| | | 1, |
| | | 4.667, |
| | | 0, |
| | | 4.7, |
| | | 0, |
| | | 0, |
| | | 5.933, |
| | | 0 |
| | | ] |
| | | }, |
| | | { |
| | | "Target": "Parameter", |
| | | "Id": "ParamEyeRSmile", |
| | | "Segments": [ |
| | | 0, |
| | | 0.63, |
| | | 1, |
| | | 1.433, |
| | | 0.63, |
| | | 2.867, |
| | | 0.6, |
| | | 4.3, |
| | | 0.6, |
| | | 1, |
| | | 4.4, |
| | | 0.6, |
| | | 4.5, |
| | | 0.76, |
| | | 4.6, |
| | | 0.76, |
| | | 0, |
| | | 5.933, |
| | | 0.76 |
| | | ] |
| | | }, |
| | | { |
| | | "Target": "Parameter", |
| | | "Id": "ParamEyeBallX", |
| | | "Segments": [ |
| | | 0, |
| | | -0.002, |
| | | 1, |
| | | 0.211, |
| | | -0.002, |
| | | 0.422, |
| | | 0, |
| | | 0.633, |
| | | 0, |
| | | 1, |
| | | 0.889, |
| | | 0, |
| | | 1.144, |
| | | -0.31, |
| | | 1.4, |
| | | -0.31, |
| | | 1, |
| | | 1.578, |
| | | -0.31, |
| | | 1.756, |
| | | -0.31, |
| | | 1.933, |
| | | -0.31, |
| | | 1, |
| | | 2.233, |
| | | -0.31, |
| | | 2.533, |
| | | 0.67, |
| | | 2.833, |
| | | 0.67, |
| | | 1, |
| | | 3.144, |
| | | 0.67, |
| | | 3.456, |
| | | 0.67, |
| | | 3.767, |
| | | 0.67, |
| | | 1, |
| | | 4.011, |
| | | 0.67, |
| | | 4.256, |
| | | 0, |
| | | 4.5, |
| | | 0, |
| | | 0, |
| | | 5.933, |
| | | 0 |
| | | ] |
| | | }, |
| | | { |
| | | "Target": "Parameter", |
| | | "Id": "ParamEyeBallY", |
| | | "Segments": [ |
| | | 0, |
| | | 0, |
| | | 1, |
| | | 0.211, |
| | | 0, |
| | | 0.422, |
| | | 0, |
| | | 0.633, |
| | | 0, |
| | | 1, |
| | | 0.889, |
| | | 0, |
| | | 1.144, |
| | | 0.38, |
| | | 1.4, |
| | | 0.38, |
| | | 1, |
| | | 1.578, |
| | | 0.38, |
| | | 1.756, |
| | | 0.38, |
| | | 1.933, |
| | | 0.38, |
| | | 1, |
| | | 2.233, |
| | | 0.38, |
| | | 2.533, |
| | | 0.46, |
| | | 2.833, |
| | | 0.46, |
| | | 1, |
| | | 3.144, |
| | | 0.46, |
| | | 3.456, |
| | | 0.46, |
| | | 3.767, |
| | | 0.46, |
| | | 1, |
| | | 4.011, |
| | | 0.46, |
| | | 4.256, |
| | | 0, |
| | | 4.5, |
| | | 0, |
| | | 0, |
| | | 5.933, |
| | | 0 |
| | | ] |
| | | }, |
| | | { |
| | | "Target": "Parameter", |
| | | "Id": "ParamBrowLY", |
| | | "Segments": [ |
| | | 0, |
| | | 0, |
| | | 1, |
| | | 0.956, |
| | | 0, |
| | | 1.911, |
| | | 0, |
| | | 2.867, |
| | | 0, |
| | | 1, |
| | | 2.933, |
| | | 0, |
| | | 3, |
| | | 0.125, |
| | | 3.067, |
| | | 0.125, |
| | | 1, |
| | | 3.133, |
| | | 0.125, |
| | | 3.2, |
| | | 0, |
| | | 3.267, |
| | | 0, |
| | | 1, |
| | | 3.711, |
| | | 0, |
| | | 4.156, |
| | | 0, |
| | | 4.6, |
| | | 0, |
| | | 1, |
| | | 4.667, |
| | | 0, |
| | | 4.733, |
| | | 0.396, |
| | | 4.8, |
| | | 0.396, |
| | | 0, |
| | | 5.933, |
| | | 0.396 |
| | | ] |
| | | }, |
| | | { |
| | | "Target": "Parameter", |
| | | "Id": "ParamBrowRY", |
| | | "Segments": [ |
| | | 0, |
| | | 0, |
| | | 1, |
| | | 0.956, |
| | | 0, |
| | | 1.911, |
| | | 0, |
| | | 2.867, |
| | | 0, |
| | | 1, |
| | | 2.933, |
| | | 0, |
| | | 3, |
| | | 0.125, |
| | | 3.067, |
| | | 0.125, |
| | | 1, |
| | | 3.133, |
| | | 0.125, |
| | | 3.2, |
| | | 0, |
| | | 3.267, |
| | | 0, |
| | | 1, |
| | | 3.711, |
| | | 0, |
| | | 4.156, |
| | | 0, |
| | | 4.6, |
| | | 0, |
| | | 1, |
| | | 4.667, |
| | | 0, |
| | | 4.733, |
| | | 0.417, |
| | | 4.8, |
| | | 0.417, |
| | | 0, |
| | | 5.933, |
| | | 0.417 |
| | | ] |
| | | }, |
| | | { |
| | | "Target": "Parameter", |
| | | "Id": "ParamBrowLX", |
| | | "Segments": [ |
| | | 0, |
| | | 0, |
| | | 0, |
| | | 5.933, |
| | | 0 |
| | | ] |
| | | }, |
| | | { |
| | | "Target": "Parameter", |
| | | "Id": "ParamBrowRX", |
| | | "Segments": [ |
| | | 0, |
| | | 0, |
| | | 0, |
| | | 5.933, |
| | | 0 |
| | | ] |
| | | }, |
| | | { |
| | | "Target": "Parameter", |
| | | "Id": "ParamBrowLAngle", |
| | | "Segments": [ |
| | | 0, |
| | | 0.03, |
| | | 0, |
| | | 5.933, |
| | | 0.03 |
| | | ] |
| | | }, |
| | | { |
| | | "Target": "Parameter", |
| | | "Id": "ParamBrowRAngle", |
| | | "Segments": [ |
| | | 0, |
| | | 0, |
| | | 0, |
| | | 5.933, |
| | | 0 |
| | | ] |
| | | }, |
| | | { |
| | | "Target": "Parameter", |
| | | "Id": "ParamBrowLForm", |
| | | "Segments": [ |
| | | 0, |
| | | 0, |
| | | 0, |
| | | 5.933, |
| | | 0 |
| | | ] |
| | | }, |
| | | { |
| | | "Target": "Parameter", |
| | | "Id": "ParamBrowRForm", |
| | | "Segments": [ |
| | | 0, |
| | | 0, |
| | | 0, |
| | | 5.933, |
| | | 0 |
| | | ] |
| | | }, |
| | | { |
| | | "Target": "Parameter", |
| | | "Id": "ParamBodyAngleX", |
| | | "Segments": [ |
| | | 0, |
| | | 0, |
| | | 1, |
| | | 0.244, |
| | | 0, |
| | | 0.489, |
| | | 0, |
| | | 0.733, |
| | | 0, |
| | | 1, |
| | | 0.778, |
| | | 0, |
| | | 0.822, |
| | | 0.667, |
| | | 0.867, |
| | | 2, |
| | | 1, |
| | | 1.044, |
| | | 7.333, |
| | | 1.222, |
| | | 10, |
| | | 1.4, |
| | | 10, |
| | | 1, |
| | | 1.533, |
| | | 10, |
| | | 1.667, |
| | | 10, |
| | | 1.8, |
| | | 10, |
| | | 1, |
| | | 2.178, |
| | | 10, |
| | | 2.556, |
| | | 6, |
| | | 2.933, |
| | | 6, |
| | | 1, |
| | | 3.244, |
| | | 6, |
| | | 3.556, |
| | | 6, |
| | | 3.867, |
| | | 6, |
| | | 1, |
| | | 4.189, |
| | | 6, |
| | | 4.511, |
| | | 0, |
| | | 4.833, |
| | | 0, |
| | | 1, |
| | | 4.956, |
| | | 0, |
| | | 5.078, |
| | | 1.192, |
| | | 5.2, |
| | | 1.192, |
| | | 1, |
| | | 5.322, |
| | | 1.192, |
| | | 5.444, |
| | | 0.013, |
| | | 5.567, |
| | | 0.013, |
| | | 0, |
| | | 5.933, |
| | | 0.013 |
| | | ] |
| | | }, |
| | | { |
| | | "Target": "Parameter", |
| | | "Id": "ParamBodyAngleY", |
| | | "Segments": [ |
| | | 0, |
| | | 0, |
| | | 1, |
| | | 0.211, |
| | | 0, |
| | | 0.422, |
| | | 0, |
| | | 0.633, |
| | | 0, |
| | | 1, |
| | | 0.667, |
| | | 0, |
| | | 0.7, |
| | | 0, |
| | | 0.733, |
| | | 0, |
| | | 1, |
| | | 1.133, |
| | | 0, |
| | | 1.533, |
| | | 0, |
| | | 1.933, |
| | | 0, |
| | | 1, |
| | | 2.078, |
| | | 0, |
| | | 2.222, |
| | | 4, |
| | | 2.367, |
| | | 4, |
| | | 1, |
| | | 2.556, |
| | | 4, |
| | | 2.744, |
| | | -2.18, |
| | | 2.933, |
| | | -2.18, |
| | | 1, |
| | | 3.022, |
| | | -2.18, |
| | | 3.111, |
| | | 0, |
| | | 3.2, |
| | | 0, |
| | | 1, |
| | | 3.456, |
| | | 0, |
| | | 3.711, |
| | | -1, |
| | | 3.967, |
| | | -1, |
| | | 1, |
| | | 4.067, |
| | | -1, |
| | | 4.167, |
| | | -1.018, |
| | | 4.267, |
| | | 0, |
| | | 1, |
| | | 4.333, |
| | | 0.679, |
| | | 4.4, |
| | | 10, |
| | | 4.467, |
| | | 10, |
| | | 1, |
| | | 4.567, |
| | | 10, |
| | | 4.667, |
| | | -5, |
| | | 4.767, |
| | | -5, |
| | | 1, |
| | | 4.889, |
| | | -5, |
| | | 5.011, |
| | | 0, |
| | | 5.133, |
| | | 0, |
| | | 0, |
| | | 5.933, |
| | | 0 |
| | | ] |
| | | }, |
| | | { |
| | | "Target": "Parameter", |
| | | "Id": "ParamBodyAngleZ", |
| | | "Segments": [ |
| | | 0, |
| | | 0, |
| | | 1, |
| | | 0.233, |
| | | 0, |
| | | 0.467, |
| | | 0, |
| | | 0.7, |
| | | 0, |
| | | 1, |
| | | 0.733, |
| | | 0, |
| | | 0.767, |
| | | 0, |
| | | 0.8, |
| | | 0, |
| | | 1, |
| | | 1.278, |
| | | 0, |
| | | 1.756, |
| | | -4, |
| | | 2.233, |
| | | -4, |
| | | 1, |
| | | 2.544, |
| | | -4, |
| | | 2.856, |
| | | 8, |
| | | 3.167, |
| | | 8, |
| | | 1, |
| | | 3.4, |
| | | 8, |
| | | 3.633, |
| | | 8.008, |
| | | 3.867, |
| | | 7.985, |
| | | 1, |
| | | 4.178, |
| | | 7.954, |
| | | 4.489, |
| | | -3, |
| | | 4.8, |
| | | -3, |
| | | 0, |
| | | 5.933, |
| | | -3 |
| | | ] |
| | | }, |
| | | { |
| | | "Target": "Parameter", |
| | | "Id": "ParamBreath", |
| | | "Segments": [ |
| | | 0, |
| | | 0, |
| | | 1, |
| | | 0.122, |
| | | 0, |
| | | 0.244, |
| | | 1, |
| | | 0.367, |
| | | 1, |
| | | 1, |
| | | 0.511, |
| | | 1, |
| | | 0.656, |
| | | 0, |
| | | 0.8, |
| | | 0, |
| | | 1, |
| | | 1.022, |
| | | 0, |
| | | 1.244, |
| | | 1, |
| | | 1.467, |
| | | 1, |
| | | 1, |
| | | 1.689, |
| | | 1, |
| | | 1.911, |
| | | 0, |
| | | 2.133, |
| | | 0, |
| | | 1, |
| | | 2.344, |
| | | 0, |
| | | 2.556, |
| | | 1, |
| | | 2.767, |
| | | 1, |
| | | 1, |
| | | 2.967, |
| | | 1, |
| | | 3.167, |
| | | 0, |
| | | 3.367, |
| | | 0, |
| | | 1, |
| | | 3.578, |
| | | 0, |
| | | 3.789, |
| | | 1, |
| | | 4, |
| | | 1, |
| | | 1, |
| | | 4.233, |
| | | 1, |
| | | 4.467, |
| | | 0, |
| | | 4.7, |
| | | 0, |
| | | 1, |
| | | 4.9, |
| | | 0, |
| | | 5.1, |
| | | 0, |
| | | 5.3, |
| | | 0, |
| | | 0, |
| | | 5.933, |
| | | 0 |
| | | ] |
| | | }, |
| | | { |
| | | "Target": "Parameter", |
| | | "Id": "ParamShoulder", |
| | | "Segments": [ |
| | | 0, |
| | | 0, |
| | | 1, |
| | | 0.456, |
| | | 0, |
| | | 0.911, |
| | | 0.4, |
| | | 1.367, |
| | | 0.4, |
| | | 1, |
| | | 1.889, |
| | | 0.4, |
| | | 2.411, |
| | | -1, |
| | | 2.933, |
| | | -1, |
| | | 1, |
| | | 3.244, |
| | | -1, |
| | | 3.556, |
| | | -1, |
| | | 3.867, |
| | | -1, |
| | | 0, |
| | | 5.933, |
| | | -1 |
| | | ] |
| | | }, |
| | | { |
| | | "Target": "Parameter", |
| | | "Id": "ParamLeg", |
| | | "Segments": [ |
| | | 0, |
| | | 1, |
| | | 0, |
| | | 5.933, |
| | | 1 |
| | | ] |
| | | }, |
| | | { |
| | | "Target": "Parameter", |
| | | "Id": "ParamArmLA", |
| | | "Segments": [ |
| | | 0, |
| | | -8.7, |
| | | 1, |
| | | 0.289, |
| | | -8.7, |
| | | 0.578, |
| | | -8.7, |
| | | 0.867, |
| | | -8.7, |
| | | 1, |
| | | 1, |
| | | -8.7, |
| | | 1.133, |
| | | -10, |
| | | 1.267, |
| | | -10, |
| | | 1, |
| | | 1.578, |
| | | -10, |
| | | 1.889, |
| | | -10, |
| | | 2.2, |
| | | -10, |
| | | 1, |
| | | 2.444, |
| | | -10, |
| | | 2.689, |
| | | -6.9, |
| | | 2.933, |
| | | -6.9, |
| | | 1, |
| | | 3.244, |
| | | -6.9, |
| | | 3.556, |
| | | -6.9, |
| | | 3.867, |
| | | -6.9, |
| | | 1, |
| | | 3.989, |
| | | -6.9, |
| | | 4.111, |
| | | -8.3, |
| | | 4.233, |
| | | -8.3, |
| | | 1, |
| | | 4.344, |
| | | -8.3, |
| | | 4.456, |
| | | -3, |
| | | 4.567, |
| | | -3, |
| | | 1, |
| | | 4.689, |
| | | -3, |
| | | 4.811, |
| | | -4, |
| | | 4.933, |
| | | -4, |
| | | 1, |
| | | 5.1, |
| | | -4, |
| | | 5.267, |
| | | -3, |
| | | 5.433, |
| | | -3, |
| | | 0, |
| | | 5.933, |
| | | -3 |
| | | ] |
| | | }, |
| | | { |
| | | "Target": "Parameter", |
| | | "Id": "ParamArmRA", |
| | | "Segments": [ |
| | | 0, |
| | | -8.7, |
| | | 1, |
| | | 0.289, |
| | | -8.7, |
| | | 0.578, |
| | | -8.7, |
| | | 0.867, |
| | | -8.7, |
| | | 1, |
| | | 1, |
| | | -8.7, |
| | | 1.133, |
| | | -10, |
| | | 1.267, |
| | | -10, |
| | | 1, |
| | | 1.578, |
| | | -10, |
| | | 1.889, |
| | | -10, |
| | | 2.2, |
| | | -10, |
| | | 1, |
| | | 2.444, |
| | | -10, |
| | | 2.689, |
| | | -10, |
| | | 2.933, |
| | | -10, |
| | | 1, |
| | | 3.244, |
| | | -10, |
| | | 3.556, |
| | | -10, |
| | | 3.867, |
| | | -10, |
| | | 1, |
| | | 3.989, |
| | | -10, |
| | | 4.111, |
| | | -9.998, |
| | | 4.233, |
| | | -7.8, |
| | | 1, |
| | | 4.344, |
| | | -5.802, |
| | | 4.456, |
| | | 0.03, |
| | | 4.567, |
| | | 0.03, |
| | | 1, |
| | | 4.689, |
| | | 0.03, |
| | | 4.811, |
| | | -1, |
| | | 4.933, |
| | | -1, |
| | | 1, |
| | | 5.122, |
| | | -1, |
| | | 5.311, |
| | | -0.002, |
| | | 5.5, |
| | | -0.002, |
| | | 0, |
| | | 5.933, |
| | | -0.002 |
| | | ] |
| | | }, |
| | | { |
| | | "Target": "Parameter", |
| | | "Id": "ParamHandL", |
| | | "Segments": [ |
| | | 0, |
| | | 0, |
| | | 1, |
| | | 1.067, |
| | | 0, |
| | | 2.133, |
| | | 0, |
| | | 3.2, |
| | | 0, |
| | | 1, |
| | | 3.633, |
| | | 0, |
| | | 4.067, |
| | | 1, |
| | | 4.5, |
| | | 1, |
| | | 1, |
| | | 4.667, |
| | | 1, |
| | | 4.833, |
| | | -1, |
| | | 5, |
| | | -1, |
| | | 1, |
| | | 5.122, |
| | | -1, |
| | | 5.244, |
| | | 0.208, |
| | | 5.367, |
| | | 0.208, |
| | | 0, |
| | | 5.933, |
| | | 0.208 |
| | | ] |
| | | }, |
| | | { |
| | | "Target": "Parameter", |
| | | "Id": "ParamHandR", |
| | | "Segments": [ |
| | | 0, |
| | | 0, |
| | | 1, |
| | | 1.067, |
| | | 0, |
| | | 2.133, |
| | | 0, |
| | | 3.2, |
| | | 0, |
| | | 1, |
| | | 3.633, |
| | | 0, |
| | | 4.067, |
| | | 1, |
| | | 4.5, |
| | | 1, |
| | | 1, |
| | | 4.667, |
| | | 1, |
| | | 4.833, |
| | | -1, |
| | | 5, |
| | | -1, |
| | | 1, |
| | | 5.122, |
| | | -1, |
| | | 5.244, |
| | | 0.208, |
| | | 5.367, |
| | | 0.208, |
| | | 0, |
| | | 5.933, |
| | | 0.208 |
| | | ] |
| | | }, |
| | | { |
| | | "Target": "Parameter", |
| | | "Id": "ParamHairAhoge", |
| | | "Segments": [ |
| | | 0, |
| | | 0, |
| | | 1, |
| | | 0.333, |
| | | 0, |
| | | 0.667, |
| | | 0, |
| | | 1, |
| | | 0, |
| | | 1, |
| | | 1.133, |
| | | 0, |
| | | 1.267, |
| | | 10, |
| | | 1.4, |
| | | 10, |
| | | 1, |
| | | 1.489, |
| | | 10, |
| | | 1.578, |
| | | 2.177, |
| | | 1.667, |
| | | 2.177, |
| | | 1, |
| | | 1.789, |
| | | 2.177, |
| | | 1.911, |
| | | 10, |
| | | 2.033, |
| | | 10, |
| | | 1, |
| | | 2.289, |
| | | 10, |
| | | 2.544, |
| | | -10, |
| | | 2.8, |
| | | -10, |
| | | 1, |
| | | 2.933, |
| | | -10, |
| | | 3.067, |
| | | 7.54, |
| | | 3.2, |
| | | 7.54, |
| | | 1, |
| | | 3.344, |
| | | 7.54, |
| | | 3.489, |
| | | 0, |
| | | 3.633, |
| | | 0, |
| | | 1, |
| | | 3.911, |
| | | 0, |
| | | 4.189, |
| | | 0, |
| | | 4.467, |
| | | 0, |
| | | 1, |
| | | 4.6, |
| | | 0, |
| | | 4.733, |
| | | 10, |
| | | 4.867, |
| | | 10, |
| | | 1, |
| | | 4.989, |
| | | 10, |
| | | 5.111, |
| | | -10, |
| | | 5.233, |
| | | -10, |
| | | 1, |
| | | 5.322, |
| | | -10, |
| | | 5.411, |
| | | 3.456, |
| | | 5.5, |
| | | 3.456, |
| | | 1, |
| | | 5.556, |
| | | 3.456, |
| | | 5.611, |
| | | 0, |
| | | 5.667, |
| | | 0, |
| | | 0, |
| | | 5.933, |
| | | 0 |
| | | ] |
| | | }, |
| | | { |
| | | "Target": "PartOpacity", |
| | | "Id": "PartArmA", |
| | | "Segments": [ |
| | | 0, |
| | | 1, |
| | | 0, |
| | | 5.93, |
| | | 1 |
| | | ] |
| | | }, |
| | | { |
| | | "Target": "PartOpacity", |
| | | "Id": "PartArmB", |
| | | "Segments": [ |
| | | 0, |
| | | 0, |
| | | 0, |
| | | 5.93, |
| | | 0 |
| | | ] |
| | | } |
| | | ] |
| | | } |
| xiaozhi-esp32-server/main/digital-human/resources/hiyori_pro_zh/runtime/motion/hiyori_m03.motion3.json
xiaozhi-esp32-server/main/digital-human/resources/hiyori_pro_zh/runtime/motion/hiyori_m04.motion3.json
xiaozhi-esp32-server/main/digital-human/resources/hiyori_pro_zh/runtime/motion/hiyori_m05.motion3.json
xiaozhi-esp32-server/main/digital-human/resources/hiyori_pro_zh/runtime/motion/hiyori_m06.motion3.json
xiaozhi-esp32-server/main/digital-human/resources/hiyori_pro_zh/runtime/motion/hiyori_m07.motion3.json
xiaozhi-esp32-server/main/digital-human/resources/hiyori_pro_zh/runtime/motion/hiyori_m08.motion3.json
xiaozhi-esp32-server/main/digital-human/resources/hiyori_pro_zh/runtime/motion/hiyori_m09.motion3.json
xiaozhi-esp32-server/main/digital-human/resources/hiyori_pro_zh/runtime/motion/hiyori_m10.motion3.json
xiaozhi-esp32-server/main/digital-human/resources/natori_pro_zh/ReadMe.txt
xiaozhi-esp32-server/main/digital-human/resources/natori_pro_zh/natori_pro_exp_t03.can3
xiaozhi-esp32-server/main/digital-human/resources/natori_pro_zh/natori_pro_motions_t03.can3
xiaozhi-esp32-server/main/digital-human/resources/natori_pro_zh/natori_pro_t06.cmo3
xiaozhi-esp32-server/main/digital-human/resources/natori_pro_zh/runtime/exp/Angry.exp3.json
xiaozhi-esp32-server/main/digital-human/resources/natori_pro_zh/runtime/exp/Blushing.exp3.json
xiaozhi-esp32-server/main/digital-human/resources/natori_pro_zh/runtime/exp/Normal.exp3.json
xiaozhi-esp32-server/main/digital-human/resources/natori_pro_zh/runtime/exp/Sad.exp3.json
xiaozhi-esp32-server/main/digital-human/resources/natori_pro_zh/runtime/exp/Smile.exp3.json
xiaozhi-esp32-server/main/digital-human/resources/natori_pro_zh/runtime/exp/Surprised.exp3.json
xiaozhi-esp32-server/main/digital-human/resources/natori_pro_zh/runtime/exp/exp_01.exp3.json
xiaozhi-esp32-server/main/digital-human/resources/natori_pro_zh/runtime/exp/exp_02.exp3.json
xiaozhi-esp32-server/main/digital-human/resources/natori_pro_zh/runtime/exp/exp_03.exp3.json
xiaozhi-esp32-server/main/digital-human/resources/natori_pro_zh/runtime/exp/exp_04.exp3.json
xiaozhi-esp32-server/main/digital-human/resources/natori_pro_zh/runtime/exp/exp_05.exp3.json
xiaozhi-esp32-server/main/digital-human/resources/natori_pro_zh/runtime/motions/mtn_00.motion3.json
xiaozhi-esp32-server/main/digital-human/resources/natori_pro_zh/runtime/motions/mtn_01.motion3.json
xiaozhi-esp32-server/main/digital-human/resources/natori_pro_zh/runtime/motions/mtn_02.motion3.json
xiaozhi-esp32-server/main/digital-human/resources/natori_pro_zh/runtime/motions/mtn_03.motion3.json
xiaozhi-esp32-server/main/digital-human/resources/natori_pro_zh/runtime/motions/mtn_04.motion3.json
xiaozhi-esp32-server/main/digital-human/resources/natori_pro_zh/runtime/motions/mtn_05.motion3.json
xiaozhi-esp32-server/main/digital-human/resources/natori_pro_zh/runtime/motions/mtn_06.motion3.json
xiaozhi-esp32-server/main/digital-human/resources/natori_pro_zh/runtime/motions/mtn_07.motion3.json
xiaozhi-esp32-server/main/digital-human/resources/natori_pro_zh/runtime/natori.pose3.json
xiaozhi-esp32-server/main/digital-human/resources/natori_pro_zh/runtime/natori_pro_t06.4096/texture_00.png
xiaozhi-esp32-server/main/digital-human/resources/natori_pro_zh/runtime/natori_pro_t06.cdi3.json
xiaozhi-esp32-server/main/digital-human/resources/natori_pro_zh/runtime/natori_pro_t06.moc3
xiaozhi-esp32-server/main/digital-human/resources/natori_pro_zh/runtime/natori_pro_t06.model3.json
xiaozhi-esp32-server/main/digital-human/resources/natori_pro_zh/runtime/natori_pro_t06.physics3.json
xiaozhi-esp32-server/main/digital-human/start.py
xiaozhi-esp32-server/main/digital-human/wakeword_runtime/__init__.py
xiaozhi-esp32-server/main/digital-human/wakeword_runtime/bridge/__init__.py
xiaozhi-esp32-server/main/digital-human/wakeword_runtime/bridge/event_bridge.py
xiaozhi-esp32-server/main/digital-human/wakeword_runtime/config.json
xiaozhi-esp32-server/main/digital-human/wakeword_runtime/config/__init__.py
xiaozhi-esp32-server/main/digital-human/wakeword_runtime/config/config_loader.py
xiaozhi-esp32-server/main/digital-human/wakeword_runtime/config/logging_setup.py
xiaozhi-esp32-server/main/digital-human/wakeword_runtime/core/__init__.py
xiaozhi-esp32-server/main/digital-human/wakeword_runtime/core/detector.py
xiaozhi-esp32-server/main/digital-human/wakeword_runtime/core/detector_assets.py
xiaozhi-esp32-server/main/digital-human/wakeword_runtime/core/microphone.py
xiaozhi-esp32-server/main/digital-human/wakeword_runtime/plugins/__init__.py
xiaozhi-esp32-server/main/digital-human/wakeword_runtime/plugins/audio.py
xiaozhi-esp32-server/main/digital-human/wakeword_runtime/plugins/base.py
xiaozhi-esp32-server/main/digital-human/wakeword_runtime/plugins/manager.py
xiaozhi-esp32-server/main/digital-human/wakeword_runtime/plugins/wake_word.py
xiaozhi-esp32-server/main/digital-human/wakeword_runtime/requirements.txt
xiaozhi-esp32-server/main/digital-human/wakeword_runtime/runtime/__init__.py
xiaozhi-esp32-server/main/digital-human/wakeword_runtime/runtime/app.py
xiaozhi-esp32-server/main/digital-human/wakeword_runtime/runtime/http_server.py
xiaozhi-esp32-server/main/manager-api/README.md
xiaozhi-esp32-server/main/manager-api/pom.xml
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/AdminApplication.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/common/annotation/DataFilter.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/common/annotation/LogOperation.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/common/aspect/RedisAspect.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/common/config/AsyncConfig.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/common/config/MybatisPlusConfig.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/common/config/RestTemplateConfig.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/common/config/SwaggerConfig.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/common/constant/Constant.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/common/convert/DateConverter.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/common/dao/BaseDao.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/common/entity/BaseEntity.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/common/exception/ErrorCode.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/common/exception/RenException.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/common/exception/RenExceptionHandler.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/common/handler/FieldMetaObjectHandler.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/common/interceptor/DataFilterInterceptor.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/common/interceptor/DataScope.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/common/page/PageData.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/common/page/TokenDTO.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/common/redis/RedisConfig.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/common/redis/RedisKeys.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/common/redis/RedisUtils.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/common/service/BaseService.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/common/service/CrudService.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/common/service/impl/BaseServiceImpl.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/common/service/impl/CrudServiceImpl.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/common/user/UserDetail.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/common/utils/AESUtils.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/common/utils/ConvertUtils.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/common/utils/DateUtils.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/common/utils/HttpContextUtils.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/common/utils/IpUtils.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/common/utils/JsonRpcTwo.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/common/utils/JsonUtils.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/common/utils/MessageUtils.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/common/utils/PropertiesUtils.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/common/utils/ResourcesUtils.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/common/utils/Result.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/common/utils/ResultUtils.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/common/utils/SM2Utils.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/common/utils/SensitiveDataUtils.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/common/utils/Sm2DecryptUtil.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/common/utils/SpringContextUtils.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/common/utils/TreeNode.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/common/utils/TreeUtils.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/common/validator/AssertUtils.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/common/validator/ValidatorUtils.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/common/validator/group/AddGroup.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/common/validator/group/DefaultGroup.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/common/validator/group/UpdateGroup.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/common/xss/SqlFilter.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/common/xss/XssConfig.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/common/xss/XssFilter.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/common/xss/XssHttpServletRequestWrapper.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/common/xss/XssProperties.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/common/xss/XssUtils.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/agent/Enums/AgentChatHistoryType.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/agent/Enums/AgentSnapshotField.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/agent/Enums/XiaoZhiMcpJsonRpcJson.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/agent/controller/AgentChatHistoryController.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/agent/controller/AgentController.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/agent/controller/AgentMcpAccessPointController.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/agent/controller/AgentSnapshotController.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/agent/controller/AgentTemplateController.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/agent/controller/AgentVoicePrintController.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/agent/dao/AgentChatTitleDao.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/agent/dao/AgentContextProviderDao.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/agent/dao/AgentCorrectWordMappingDao.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/agent/dao/AgentDao.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/agent/dao/AgentPluginMappingMapper.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/agent/dao/AgentSnapshotDao.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/agent/dao/AgentTagDao.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/agent/dao/AgentTagRelationDao.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/agent/dao/AgentTemplateDao.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/agent/dao/AgentVoicePrintDao.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/agent/dao/AiAgentChatAudioDao.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/agent/dao/AiAgentChatHistoryDao.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/agent/dto/AgentChatHistoryDTO.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/agent/dto/AgentChatHistoryReportDTO.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/agent/dto/AgentChatSessionDTO.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/agent/dto/AgentChatSummaryDTO.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/agent/dto/AgentCreateDTO.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/agent/dto/AgentDTO.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/agent/dto/AgentMemoryDTO.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/agent/dto/AgentSnapshotDataDTO.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/agent/dto/AgentSnapshotPageDTO.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/agent/dto/AgentSnapshotRestoreDTO.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/agent/dto/AgentSnapshotTagDTO.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/agent/dto/AgentTagDTO.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/agent/dto/AgentUpdateDTO.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/agent/dto/AgentVoicePrintSaveDTO.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/agent/dto/AgentVoicePrintUpdateDTO.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/agent/dto/ContextProviderDTO.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/agent/dto/IdentifyVoicePrintResponse.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/agent/entity/AgentChatAudioEntity.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/agent/entity/AgentChatHistoryEntity.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/agent/entity/AgentChatTitleEntity.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/agent/entity/AgentContextProviderEntity.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/agent/entity/AgentCorrectWordMappingEntity.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/agent/entity/AgentEntity.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/agent/entity/AgentPluginMapping.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/agent/entity/AgentSnapshotEntity.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/agent/entity/AgentTagEntity.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/agent/entity/AgentTagRelationEntity.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/agent/entity/AgentTemplateEntity.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/agent/entity/AgentVoicePrintEntity.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/agent/service/AgentChatAudioService.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/agent/service/AgentChatHistoryService.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/agent/service/AgentChatSummaryService.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/agent/service/AgentChatTitleService.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/agent/service/AgentContextProviderService.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/agent/service/AgentMcpAccessPointService.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/agent/service/AgentPluginMappingService.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/agent/service/AgentService.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/agent/service/AgentSnapshotService.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/agent/service/AgentTagService.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/agent/service/AgentTemplateService.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/agent/service/AgentVoicePrintService.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/agent/service/biz/AgentChatHistoryBizService.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/agent/service/biz/impl/AgentChatHistoryBizServiceImpl.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/agent/service/impl/AgentChatAudioServiceImpl.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/agent/service/impl/AgentChatHistoryServiceImpl.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/agent/service/impl/AgentChatSummaryServiceImpl.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/agent/service/impl/AgentChatTitleServiceImpl.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/agent/service/impl/AgentContextProviderServiceImpl.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/agent/service/impl/AgentMcpAccessPointServiceImpl.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/agent/service/impl/AgentPluginMappingServiceImpl.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/agent/service/impl/AgentServiceImpl.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/agent/service/impl/AgentSnapshotRedactionRunner.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/agent/service/impl/AgentSnapshotServiceImpl.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/agent/service/impl/AgentTagServiceImpl.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/agent/service/impl/AgentTemplateServiceImpl.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/agent/service/impl/AgentVoicePrintServiceImpl.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/agent/typehandler/ContextProviderListTypeHandler.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/agent/vo/AgentChatHistoryUserVO.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/agent/vo/AgentInfoVO.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/agent/vo/AgentSnapshotVO.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/agent/vo/AgentTemplateVO.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/agent/vo/AgentVoicePrintVO.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/config/controller/ConfigController.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/config/dto/AgentModelsDTO.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/config/dto/CorrectWordsDTO.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/config/init/SystemInitConfig.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/config/service/ConfigService.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/config/service/impl/ConfigServiceImpl.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/correctword/controller/CorrectWordController.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/correctword/dao/CorrectWordFileDao.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/correctword/dao/CorrectWordItemDao.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/correctword/dto/CorrectWordFileCreateDTO.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/correctword/entity/CorrectWordFileEntity.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/correctword/entity/CorrectWordItemEntity.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/correctword/service/CorrectWordFileService.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/correctword/service/impl/CorrectWordFileServiceImpl.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/correctword/vo/CorrectWordFileVO.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/correctword/vo/CorrectWordSimpleVO.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/device/controller/DeviceController.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/device/controller/OTAController.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/device/controller/OTAMagController.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/device/dao/DeviceAddressBookDao.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/device/dao/DeviceDao.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/device/dao/OtaDao.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/device/dto/DeviceAddressBookAliasDTO.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/device/dto/DeviceAddressBookPermissionDTO.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/device/dto/DeviceManualAddDTO.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/device/dto/DevicePageUserDTO.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/device/dto/DeviceRegisterDTO.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/device/dto/DeviceReportReqDTO.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/device/dto/DeviceReportRespDTO.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/device/dto/DeviceToolsCallReqDTO.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/device/dto/DeviceUnBindDTO.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/device/dto/DeviceUpdateDTO.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/device/entity/DeviceAddressBookEntity.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/device/entity/DeviceEntity.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/device/entity/OtaEntity.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/device/service/DeviceAddressBookService.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/device/service/DeviceService.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/device/service/OtaService.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/device/service/impl/DeviceAddressBookServiceImpl.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/device/service/impl/DeviceServiceImpl.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/device/service/impl/MqttGatewayAuthorization.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/device/service/impl/OtaServiceImpl.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/device/vo/DeviceOtaVO.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/device/vo/UserShowDeviceListVO.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/knowledge/config/KnowledgeBaseConfig.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/knowledge/config/RAGTaskConfig.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/knowledge/controller/KnowledgeBaseController.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/knowledge/controller/KnowledgeFilesController.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/knowledge/dao/DocumentDao.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/knowledge/dao/KnowledgeBaseDao.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/knowledge/dto/KnowledgeBaseDTO.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/knowledge/dto/KnowledgeFilesDTO.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/knowledge/dto/dataset/DatasetDTO.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/knowledge/dto/document/ChunkDTO.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/knowledge/dto/document/DocumentDTO.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/knowledge/dto/document/RetrievalDTO.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/knowledge/entity/DocumentEntity.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/knowledge/entity/KnowledgeBaseEntity.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/knowledge/rag/KnowledgeBaseAdapter.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/knowledge/rag/KnowledgeBaseAdapterFactory.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/knowledge/rag/RAGFlowClient.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/knowledge/rag/impl/RAGFlowAdapter.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/knowledge/service/KnowledgeBaseService.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/knowledge/service/KnowledgeFilesService.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/knowledge/service/KnowledgeManagerService.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/knowledge/service/impl/KnowledgeBaseServiceImpl.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/knowledge/service/impl/KnowledgeFilesServiceImpl.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/knowledge/service/impl/KnowledgeManagerServiceImpl.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/knowledge/task/DocumentStatusSyncTask.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/llm/service/LLMService.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/llm/service/impl/OpenAIStyleLLMServiceImpl.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/model/controller/ModelController.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/model/controller/ModelProviderController.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/model/dao/ModelConfigDao.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/model/dao/ModelProviderDao.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/model/dto/LlmModelBasicInfoDTO.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/model/dto/ModelBasicInfoDTO.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/model/dto/ModelConfigBodyDTO.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/model/dto/ModelConfigDTO.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/model/dto/ModelProviderDTO.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/model/dto/VoiceDTO.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/model/entity/ModelConfigEntity.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/model/entity/ModelProviderEntity.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/model/service/ModelConfigService.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/model/service/ModelProviderService.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/model/service/impl/ModelConfigServiceImpl.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/model/service/impl/ModelProviderServiceImpl.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/security/config/FilterConfig.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/security/config/ShiroConfig.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/security/config/WebMvcConfig.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/security/controller/LoginController.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/security/dao/SysUserTokenDao.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/security/dto/LoginDTO.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/security/dto/SmsVerificationDTO.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/security/entity/SysUserTokenEntity.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/security/oauth2/Oauth2Filter.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/security/oauth2/Oauth2Realm.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/security/oauth2/Oauth2Token.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/security/oauth2/TokenGenerator.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/security/password/BCrypt.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/security/password/BCryptPasswordEncoder.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/security/password/PasswordEncoder.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/security/password/PasswordUtils.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/security/secret/ServerSecretFilter.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/security/secret/ServerSecretToken.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/security/service/CaptchaService.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/security/service/ShiroService.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/security/service/SysUserTokenService.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/security/service/impl/CaptchaServiceImpl.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/security/service/impl/ShiroServiceImpl.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/security/service/impl/SysUserTokenServiceImpl.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/security/user/SecurityUser.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/sms/service/SmsService.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/sms/service/imp/ALiYunSmsService.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/sys/controller/AdminController.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/sys/controller/ServerSideManageController.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/sys/controller/SysDictDataController.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/sys/controller/SysDictTypeController.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/sys/controller/SysParamsController.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/sys/dao/SysDictDataDao.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/sys/dao/SysDictTypeDao.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/sys/dao/SysParamsDao.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/sys/dao/SysUserDao.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/sys/dto/AdminPageUserDTO.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/sys/dto/EmitSeverActionDTO.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/sys/dto/PasswordDTO.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/sys/dto/RetrievePasswordDTO.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/sys/dto/ServerActionPayloadDTO.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/sys/dto/ServerActionResponseDTO.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/sys/dto/SysDictDataDTO.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/sys/dto/SysDictTypeDTO.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/sys/dto/SysParamsDTO.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/sys/dto/SysUserDTO.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/sys/entity/SysDictDataEntity.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/sys/entity/SysDictTypeEntity.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/sys/entity/SysParamsEntity.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/sys/entity/SysUserEntity.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/sys/enums/ServerActionEnum.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/sys/enums/ServerActionResponseEnum.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/sys/enums/SuperAdminEnum.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/sys/redis/SysParamsRedis.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/sys/service/SysDictDataService.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/sys/service/SysDictTypeService.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/sys/service/SysParamsService.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/sys/service/SysUserService.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/sys/service/SysUserUtilService.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/sys/service/TokenService.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/sys/service/impl/SysDictDataServiceImpl.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/sys/service/impl/SysDictTypeServiceImpl.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/sys/service/impl/SysParamsServiceImpl.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/sys/service/impl/SysUserServiceImpl.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/sys/service/impl/SysUserUtilServiceImpl.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/sys/service/impl/TokenServiceImpl.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/sys/utils/WebSocketClientManager.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/sys/utils/WebSocketTestHandler.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/sys/utils/WebSocketValidator.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/sys/vo/AdminPageUserVO.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/sys/vo/SysDictDataItem.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/sys/vo/SysDictDataVO.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/sys/vo/SysDictTypeVO.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/timbre/controller/TimbreController.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/timbre/dao/TimbreDao.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/timbre/dto/TimbreDataDTO.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/timbre/dto/TimbrePageDTO.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/timbre/entity/TimbreEntity.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/timbre/service/TimbreService.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/timbre/service/impl/TimbreServiceImpl.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/timbre/vo/TimbreDetailsVO.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/voiceclone/controller/VoiceCloneController.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/voiceclone/controller/VoiceResourceController.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/voiceclone/dao/VoiceCloneDao.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/voiceclone/dto/VoiceCloneDTO.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/voiceclone/dto/VoiceCloneResponseDTO.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/voiceclone/entity/VoiceCloneEntity.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/voiceclone/service/VoiceCloneService.java
xiaozhi-esp32-server/main/manager-api/src/main/java/xiaozhi/modules/voiceclone/service/impl/VoiceCloneServiceImpl.java
xiaozhi-esp32-server/main/manager-api/src/main/resources/application-dev.yml
xiaozhi-esp32-server/main/manager-api/src/main/resources/application.yml
xiaozhi-esp32-server/main/manager-api/src/main/resources/db/changelog/202503141335.sql
xiaozhi-esp32-server/main/manager-api/src/main/resources/db/changelog/202503141346.sql
xiaozhi-esp32-server/main/manager-api/src/main/resources/db/changelog/202504082211.sql
xiaozhi-esp32-server/main/manager-api/src/main/resources/db/changelog/202504092335.sql
xiaozhi-esp32-server/main/manager-api/src/main/resources/db/changelog/202504112044.sql
xiaozhi-esp32-server/main/manager-api/src/main/resources/db/changelog/202504112058.sql
xiaozhi-esp32-server/main/manager-api/src/main/resources/db/changelog/202504151206.sql
xiaozhi-esp32-server/main/manager-api/src/main/resources/db/changelog/202504181536.sql
xiaozhi-esp32-server/main/manager-api/src/main/resources/db/changelog/202504221135.sql
xiaozhi-esp32-server/main/manager-api/src/main/resources/db/changelog/202504221555.sql
xiaozhi-esp32-server/main/manager-api/src/main/resources/db/changelog/202504251422.sql
xiaozhi-esp32-server/main/manager-api/src/main/resources/db/changelog/202504291043.sql
xiaozhi-esp32-server/main/manager-api/src/main/resources/db/changelog/202504301341.sql
xiaozhi-esp32-server/main/manager-api/src/main/resources/db/changelog/202505022134.sql
xiaozhi-esp32-server/main/manager-api/src/main/resources/db/changelog/202505081146.sql
xiaozhi-esp32-server/main/manager-api/src/main/resources/db/changelog/202505091555.sql
xiaozhi-esp32-server/main/manager-api/src/main/resources/db/changelog/202505111914.sql
xiaozhi-esp32-server/main/manager-api/src/main/resources/db/changelog/202505122348.sql
xiaozhi-esp32-server/main/manager-api/src/main/resources/db/changelog/202505142037.sql
xiaozhi-esp32-server/main/manager-api/src/main/resources/db/changelog/202505151451.sql
xiaozhi-esp32-server/main/manager-api/src/main/resources/db/changelog/202505182234.sql
xiaozhi-esp32-server/main/manager-api/src/main/resources/db/changelog/202505201744.sql
xiaozhi-esp32-server/main/manager-api/src/main/resources/db/changelog/202505271414.sql
xiaozhi-esp32-server/main/manager-api/src/main/resources/db/changelog/202505292203.sql
xiaozhi-esp32-server/main/manager-api/src/main/resources/db/changelog/202506010920.sql
xiaozhi-esp32-server/main/manager-api/src/main/resources/db/changelog/202506031639.sql
xiaozhi-esp32-server/main/manager-api/src/main/resources/db/changelog/202506032232.sql
xiaozhi-esp32-server/main/manager-api/src/main/resources/db/changelog/202506051538.sql
xiaozhi-esp32-server/main/manager-api/src/main/resources/db/changelog/202506080955.sql
xiaozhi-esp32-server/main/manager-api/src/main/resources/db/changelog/202506091720.sql
xiaozhi-esp32-server/main/manager-api/src/main/resources/db/changelog/202506161101.sql
xiaozhi-esp32-server/main/manager-api/src/main/resources/db/changelog/202506191643.sql
xiaozhi-esp32-server/main/manager-api/src/main/resources/db/changelog/202506251620.sql
xiaozhi-esp32-server/main/manager-api/src/main/resources/db/changelog/202506261637.sql
xiaozhi-esp32-server/main/manager-api/src/main/resources/db/changelog/202507031602.sql
xiaozhi-esp32-server/main/manager-api/src/main/resources/db/changelog/202507041018.sql
xiaozhi-esp32-server/main/manager-api/src/main/resources/db/changelog/202507071130.sql
xiaozhi-esp32-server/main/manager-api/src/main/resources/db/changelog/202507071530.sql
xiaozhi-esp32-server/main/manager-api/src/main/resources/db/changelog/202507081646.sql
xiaozhi-esp32-server/main/manager-api/src/main/resources/db/changelog/202507101203.sql
xiaozhi-esp32-server/main/manager-api/src/main/resources/db/changelog/202508081701.sql
xiaozhi-esp32-server/main/manager-api/src/main/resources/db/changelog/202508111734.sql
xiaozhi-esp32-server/main/manager-api/src/main/resources/db/changelog/202508131557.sql
xiaozhi-esp32-server/main/manager-api/src/main/resources/db/changelog/202508271113.sql
xiaozhi-esp32-server/main/manager-api/src/main/resources/db/changelog/202509051745.sql
xiaozhi-esp32-server/main/manager-api/src/main/resources/db/changelog/202509080922.sql
xiaozhi-esp32-server/main/manager-api/src/main/resources/db/changelog/202509081140.sql
xiaozhi-esp32-server/main/manager-api/src/main/resources/db/changelog/202509091042.sql
xiaozhi-esp32-server/main/manager-api/src/main/resources/db/changelog/202509091633.sql
xiaozhi-esp32-server/main/manager-api/src/main/resources/db/changelog/202509161610.sql
xiaozhi-esp32-server/main/manager-api/src/main/resources/db/changelog/202509161701.sql
xiaozhi-esp32-server/main/manager-api/src/main/resources/db/changelog/202509191545.sql
xiaozhi-esp32-server/main/manager-api/src/main/resources/db/changelog/202509220926.sql
xiaozhi-esp32-server/main/manager-api/src/main/resources/db/changelog/202509220958.sql
xiaozhi-esp32-server/main/manager-api/src/main/resources/db/changelog/202509221530.sql
xiaozhi-esp32-server/main/manager-api/src/main/resources/db/changelog/202510071522.sql
xiaozhi-esp32-server/main/manager-api/src/main/resources/db/changelog/202510191042.sql
xiaozhi-esp32-server/main/manager-api/src/main/resources/db/changelog/202510250956.sql
xiaozhi-esp32-server/main/manager-api/src/main/resources/db/changelog/202510251150.sql
xiaozhi-esp32-server/main/manager-api/src/main/resources/db/changelog/202511131023.sql
xiaozhi-esp32-server/main/manager-api/src/main/resources/db/changelog/202511221450.sql
xiaozhi-esp32-server/main/manager-api/src/main/resources/db/changelog/202512031517.sql
xiaozhi-esp32-server/main/manager-api/src/main/resources/db/changelog/202512041515.sql
xiaozhi-esp32-server/main/manager-api/src/main/resources/db/changelog/202512131453.sql
xiaozhi-esp32-server/main/manager-api/src/main/resources/db/changelog/202512161529.sql
xiaozhi-esp32-server/main/manager-api/src/main/resources/db/changelog/202512192245.sql
xiaozhi-esp32-server/main/manager-api/src/main/resources/db/changelog/202512221117.sql
xiaozhi-esp32-server/main/manager-api/src/main/resources/db/changelog/202512301430.sql
xiaozhi-esp32-server/main/manager-api/src/main/resources/db/changelog/202601051433.sql
xiaozhi-esp32-server/main/manager-api/src/main/resources/db/changelog/202601141645.sql
xiaozhi-esp32-server/main/manager-api/src/main/resources/db/changelog/202601231530.sql
xiaozhi-esp32-server/main/manager-api/src/main/resources/db/changelog/202601261730.sql
xiaozhi-esp32-server/main/manager-api/src/main/resources/db/changelog/202602021555.sql
xiaozhi-esp32-server/main/manager-api/src/main/resources/db/changelog/202602051017.sql
xiaozhi-esp32-server/main/manager-api/src/main/resources/db/changelog/202602051125.sql
xiaozhi-esp32-server/main/manager-api/src/main/resources/db/changelog/202602061650.sql
xiaozhi-esp32-server/main/manager-api/src/main/resources/db/changelog/202602271137.sql
xiaozhi-esp32-server/main/manager-api/src/main/resources/db/changelog/202602281000.sql
xiaozhi-esp32-server/main/manager-api/src/main/resources/db/changelog/202603091051.sql
xiaozhi-esp32-server/main/manager-api/src/main/resources/db/changelog/202603101723.sql
xiaozhi-esp32-server/main/manager-api/src/main/resources/db/changelog/202603111131.sql
xiaozhi-esp32-server/main/manager-api/src/main/resources/db/changelog/202603231037.sql
xiaozhi-esp32-server/main/manager-api/src/main/resources/db/changelog/202603311200.sql
xiaozhi-esp32-server/main/manager-api/src/main/resources/db/changelog/202604010930.sql
xiaozhi-esp32-server/main/manager-api/src/main/resources/db/changelog/202604011035.sql
xiaozhi-esp32-server/main/manager-api/src/main/resources/db/changelog/202604011545.sql
xiaozhi-esp32-server/main/manager-api/src/main/resources/db/changelog/202604161357.sql
xiaozhi-esp32-server/main/manager-api/src/main/resources/db/changelog/202604201719.sql
xiaozhi-esp32-server/main/manager-api/src/main/resources/db/changelog/202604211515.sql
xiaozhi-esp32-server/main/manager-api/src/main/resources/db/changelog/202604211700.sql
xiaozhi-esp32-server/main/manager-api/src/main/resources/db/changelog/202604300930.sql
xiaozhi-esp32-server/main/manager-api/src/main/resources/db/changelog/202605071037.sql
xiaozhi-esp32-server/main/manager-api/src/main/resources/db/changelog/202605071120.sql
xiaozhi-esp32-server/main/manager-api/src/main/resources/db/changelog/202605081008.sql
xiaozhi-esp32-server/main/manager-api/src/main/resources/db/changelog/202605121509.sql
xiaozhi-esp32-server/main/manager-api/src/main/resources/db/changelog/202605251426.sql
xiaozhi-esp32-server/main/manager-api/src/main/resources/db/changelog/202606231030.sql
xiaozhi-esp32-server/main/manager-api/src/main/resources/db/changelog/202606261131.sql
xiaozhi-esp32-server/main/manager-api/src/main/resources/db/changelog/202607011405.sql
xiaozhi-esp32-server/main/manager-api/src/main/resources/db/changelog/202607071530.sql
xiaozhi-esp32-server/main/manager-api/src/main/resources/db/changelog/202607101200.sql
xiaozhi-esp32-server/main/manager-api/src/main/resources/db/changelog/202607290930.sql
xiaozhi-esp32-server/main/manager-api/src/main/resources/db/changelog/202608061030.sql
xiaozhi-esp32-server/main/manager-api/src/main/resources/db/changelog/202608061800.sql
xiaozhi-esp32-server/main/manager-api/src/main/resources/db/changelog/202608131030.sql
xiaozhi-esp32-server/main/manager-api/src/main/resources/db/changelog/db.changelog-master.yaml
xiaozhi-esp32-server/main/manager-api/src/main/resources/i18n/messages.properties
xiaozhi-esp32-server/main/manager-api/src/main/resources/i18n/messages_de_DE.properties
xiaozhi-esp32-server/main/manager-api/src/main/resources/i18n/messages_en_US.properties
xiaozhi-esp32-server/main/manager-api/src/main/resources/i18n/messages_pt_BR.properties
xiaozhi-esp32-server/main/manager-api/src/main/resources/i18n/messages_vi_VN.properties
xiaozhi-esp32-server/main/manager-api/src/main/resources/i18n/messages_zh_CN.properties
xiaozhi-esp32-server/main/manager-api/src/main/resources/i18n/messages_zh_TW.properties
xiaozhi-esp32-server/main/manager-api/src/main/resources/i18n/validation.properties
xiaozhi-esp32-server/main/manager-api/src/main/resources/i18n/validation_de_DE.properties
xiaozhi-esp32-server/main/manager-api/src/main/resources/i18n/validation_en_US.properties
xiaozhi-esp32-server/main/manager-api/src/main/resources/i18n/validation_pt_BR.properties
xiaozhi-esp32-server/main/manager-api/src/main/resources/i18n/validation_vi_VN.properties
xiaozhi-esp32-server/main/manager-api/src/main/resources/i18n/validation_zh_CN.properties
xiaozhi-esp32-server/main/manager-api/src/main/resources/i18n/validation_zh_TW.properties
xiaozhi-esp32-server/main/manager-api/src/main/resources/logback-spring.xml
xiaozhi-esp32-server/main/manager-api/src/main/resources/lua/emptyAll.lua
xiaozhi-esp32-server/main/manager-api/src/main/resources/lua/getKeyOrCreate.lua
xiaozhi-esp32-server/main/manager-api/src/main/resources/mapper/agent/AgentCorrectWordMappingDao.xml
xiaozhi-esp32-server/main/manager-api/src/main/resources/mapper/agent/AgentDao.xml
xiaozhi-esp32-server/main/manager-api/src/main/resources/mapper/agent/AgentPluginMappingMapper.xml
xiaozhi-esp32-server/main/manager-api/src/main/resources/mapper/agent/AgentSnapshotDao.xml
xiaozhi-esp32-server/main/manager-api/src/main/resources/mapper/agent/AgentTagDao.xml
xiaozhi-esp32-server/main/manager-api/src/main/resources/mapper/agent/AgentTagRelationDao.xml
xiaozhi-esp32-server/main/manager-api/src/main/resources/mapper/agent/AgentTemplateMapper.xml
xiaozhi-esp32-server/main/manager-api/src/main/resources/mapper/agent/AiAgentChatHistoryDao.xml
xiaozhi-esp32-server/main/manager-api/src/main/resources/mapper/correctword/CorrectWordItemDao.xml
xiaozhi-esp32-server/main/manager-api/src/main/resources/mapper/device/DeviceAddressBookDao.xml
xiaozhi-esp32-server/main/manager-api/src/main/resources/mapper/device/DeviceDao.xml
xiaozhi-esp32-server/main/manager-api/src/main/resources/mapper/knowledge/KnowledgeBaseDao.xml
xiaozhi-esp32-server/main/manager-api/src/main/resources/mapper/model/ModelConfigDao.xml
xiaozhi-esp32-server/main/manager-api/src/main/resources/mapper/model/ModelProviderDao.xml
xiaozhi-esp32-server/main/manager-api/src/main/resources/mapper/security/SysUserTokenDao.xml
xiaozhi-esp32-server/main/manager-api/src/main/resources/mapper/sys/SysDictDataDao.xml
xiaozhi-esp32-server/main/manager-api/src/main/resources/mapper/sys/SysDictTypeDao.xml
xiaozhi-esp32-server/main/manager-api/src/main/resources/mapper/sys/SysParamsDao.xml
xiaozhi-esp32-server/main/manager-api/src/main/resources/mapper/sys/SysUserDao.xml
xiaozhi-esp32-server/main/manager-api/src/main/resources/mapper/voiceclone/VoiceCloneDao.xml
xiaozhi-esp32-server/main/manager-api/src/test/java/xiaozhi/common/redis/RedisSerializationTest.java
xiaozhi-esp32-server/main/manager-api/src/test/java/xiaozhi/common/service/impl/BaseServiceImplTest.java
xiaozhi-esp32-server/main/manager-api/src/test/java/xiaozhi/common/utils/AESUtilsTest.java
xiaozhi-esp32-server/main/manager-api/src/test/java/xiaozhi/common/utils/JsonUtilsTest.java
xiaozhi-esp32-server/main/manager-api/src/test/java/xiaozhi/modules/agent/dto/AgentUpdateDTOTest.java
xiaozhi-esp32-server/main/manager-api/src/test/java/xiaozhi/modules/agent/service/impl/AgentSnapshotRedactionRunnerTest.java
xiaozhi-esp32-server/main/manager-api/src/test/java/xiaozhi/modules/agent/service/impl/AgentSnapshotServiceImplTest.java
xiaozhi-esp32-server/main/manager-api/src/test/java/xiaozhi/modules/agent/typehandler/ContextProviderListTypeHandlerTest.java
xiaozhi-esp32-server/main/manager-api/src/test/java/xiaozhi/modules/config/service/impl/ConfigServiceImplTest.java
xiaozhi-esp32-server/main/manager-api/src/test/java/xiaozhi/modules/device/DeviceTest.java
xiaozhi-esp32-server/main/manager-api/src/test/java/xiaozhi/modules/device/controller/DeviceControllerTest.java
xiaozhi-esp32-server/main/manager-api/src/test/java/xiaozhi/modules/device/service/impl/DeviceAddressBookServiceImplTest.java
xiaozhi-esp32-server/main/manager-api/src/test/java/xiaozhi/modules/device/service/impl/DeviceAutoUpdateTest.java
xiaozhi-esp32-server/main/manager-api/src/test/java/xiaozhi/modules/device/service/impl/DeviceTimeSerializationTest.java
xiaozhi-esp32-server/main/manager-api/src/test/java/xiaozhi/modules/device/service/impl/MqttGatewayAuthorizationTest.java
xiaozhi-esp32-server/main/manager-api/src/test/java/xiaozhi/modules/security/config/ShiroConfigTest.java
xiaozhi-esp32-server/main/manager-api/src/test/java/xiaozhi/modules/sys/loginControllerTest.java
xiaozhi-esp32-server/main/manager-api/src/test/java/xiaozhi/modules/sys/service/impl/SysDictDataServiceImplTest.java
xiaozhi-esp32-server/main/manager-api/src/test/java/xiaozhi/modules/sys/service/impl/SysParamsServiceImplTest.java
xiaozhi-esp32-server/main/manager-api/src/test/java/xiaozhi/modules/timbre/service/impl/TimbreServiceImplTest.java
xiaozhi-esp32-server/main/manager-api/src/test/resources/application.yml
xiaozhi-esp32-server/main/manager-mobile/.commitlintrc.cjs
xiaozhi-esp32-server/main/manager-mobile/.editorconfig
xiaozhi-esp32-server/main/manager-mobile/.gitignore
xiaozhi-esp32-server/main/manager-mobile/.npmrc
xiaozhi-esp32-server/main/manager-mobile/LICENSE
xiaozhi-esp32-server/main/manager-mobile/README.md
xiaozhi-esp32-server/main/manager-mobile/env/.env
xiaozhi-esp32-server/main/manager-mobile/env/.env.development
xiaozhi-esp32-server/main/manager-mobile/env/.env.production
xiaozhi-esp32-server/main/manager-mobile/env/.env.test
xiaozhi-esp32-server/main/manager-mobile/eslint.config.mjs
xiaozhi-esp32-server/main/manager-mobile/favicon.ico
xiaozhi-esp32-server/main/manager-mobile/index.html
xiaozhi-esp32-server/main/manager-mobile/manifest.config.ts
xiaozhi-esp32-server/main/manager-mobile/package.json
xiaozhi-esp32-server/main/manager-mobile/pages.config.ts
xiaozhi-esp32-server/main/manager-mobile/patches/@dcloudio__uni-h5.patch
xiaozhi-esp32-server/main/manager-mobile/pnpm-lock.yaml
xiaozhi-esp32-server/main/manager-mobile/pnpm-workspace.yaml
xiaozhi-esp32-server/main/manager-mobile/scripts/postupgrade.js
xiaozhi-esp32-server/main/manager-mobile/src/App.vue
xiaozhi-esp32-server/main/manager-mobile/src/api/agent/agent.ts
xiaozhi-esp32-server/main/manager-mobile/src/api/agent/types.ts
xiaozhi-esp32-server/main/manager-mobile/src/api/auth.ts
xiaozhi-esp32-server/main/manager-mobile/src/api/chat-history/chat-history.ts
xiaozhi-esp32-server/main/manager-mobile/src/api/chat-history/index.ts
xiaozhi-esp32-server/main/manager-mobile/src/api/chat-history/types.ts
xiaozhi-esp32-server/main/manager-mobile/src/api/device/device.ts
xiaozhi-esp32-server/main/manager-mobile/src/api/device/index.ts
xiaozhi-esp32-server/main/manager-mobile/src/api/device/types.ts
xiaozhi-esp32-server/main/manager-mobile/src/api/voiceprint/index.ts
xiaozhi-esp32-server/main/manager-mobile/src/api/voiceprint/types.ts
xiaozhi-esp32-server/main/manager-mobile/src/api/voiceprint/voiceprint.ts
xiaozhi-esp32-server/main/manager-mobile/src/components/.gitkeep
xiaozhi-esp32-server/main/manager-mobile/src/components/custom-tabs/index.vue
xiaozhi-esp32-server/main/manager-mobile/src/env.d.ts
xiaozhi-esp32-server/main/manager-mobile/src/hooks/.gitkeep
xiaozhi-esp32-server/main/manager-mobile/src/hooks/usePageAuth.ts
xiaozhi-esp32-server/main/manager-mobile/src/hooks/useRequest.ts
xiaozhi-esp32-server/main/manager-mobile/src/hooks/useUpload.ts
xiaozhi-esp32-server/main/manager-mobile/src/http/README.md
xiaozhi-esp32-server/main/manager-mobile/src/http/request/alova.ts
xiaozhi-esp32-server/main/manager-mobile/src/http/request/enum.ts
xiaozhi-esp32-server/main/manager-mobile/src/http/request/types.ts
xiaozhi-esp32-server/main/manager-mobile/src/i18n/de.ts
xiaozhi-esp32-server/main/manager-mobile/src/i18n/en.ts
xiaozhi-esp32-server/main/manager-mobile/src/i18n/index.ts
xiaozhi-esp32-server/main/manager-mobile/src/i18n/pt_BR.ts
xiaozhi-esp32-server/main/manager-mobile/src/i18n/vi.ts
xiaozhi-esp32-server/main/manager-mobile/src/i18n/zh_CN.ts
xiaozhi-esp32-server/main/manager-mobile/src/i18n/zh_TW.ts
xiaozhi-esp32-server/main/manager-mobile/src/layouts/default.vue
xiaozhi-esp32-server/main/manager-mobile/src/layouts/fg-tabbar/fg-tabbar.vue
xiaozhi-esp32-server/main/manager-mobile/src/layouts/fg-tabbar/tabbar.md
xiaozhi-esp32-server/main/manager-mobile/src/layouts/fg-tabbar/tabbar.ts
xiaozhi-esp32-server/main/manager-mobile/src/layouts/fg-tabbar/tabbarList.ts
xiaozhi-esp32-server/main/manager-mobile/src/layouts/tabbar.vue
xiaozhi-esp32-server/main/manager-mobile/src/main.ts
xiaozhi-esp32-server/main/manager-mobile/src/manifest.json
xiaozhi-esp32-server/main/manager-mobile/src/pages-sub/demo/index.vue
xiaozhi-esp32-server/main/manager-mobile/src/pages.json
xiaozhi-esp32-server/main/manager-mobile/src/pages/agent/components/AgentSnapshotPanel.vue
xiaozhi-esp32-server/main/manager-mobile/src/pages/agent/components/agentSnapshotContracts.test.mjs
xiaozhi-esp32-server/main/manager-mobile/src/pages/agent/components/agentSnapshotUtils.mjs
xiaozhi-esp32-server/main/manager-mobile/src/pages/agent/components/agentSnapshotUtils.test.mjs
xiaozhi-esp32-server/main/manager-mobile/src/pages/agent/components/voicePreviewUtils.mjs
xiaozhi-esp32-server/main/manager-mobile/src/pages/agent/components/voicePreviewUtils.test.mjs
xiaozhi-esp32-server/main/manager-mobile/src/pages/agent/edit.vue
xiaozhi-esp32-server/main/manager-mobile/src/pages/agent/index.vue
xiaozhi-esp32-server/main/manager-mobile/src/pages/agent/provider.vue
xiaozhi-esp32-server/main/manager-mobile/src/pages/agent/speedPitch.vue
xiaozhi-esp32-server/main/manager-mobile/src/pages/agent/tools.vue
xiaozhi-esp32-server/main/manager-mobile/src/pages/chat-history/detail.vue
xiaozhi-esp32-server/main/manager-mobile/src/pages/chat-history/index.vue
xiaozhi-esp32-server/main/manager-mobile/src/pages/device-config/components/ultrasonic-config.vue
xiaozhi-esp32-server/main/manager-mobile/src/pages/device-config/components/wifi-config.vue
xiaozhi-esp32-server/main/manager-mobile/src/pages/device-config/components/wifi-selector.vue
xiaozhi-esp32-server/main/manager-mobile/src/pages/device-config/index.vue
xiaozhi-esp32-server/main/manager-mobile/src/pages/device/deviceTimeUtils.mjs
xiaozhi-esp32-server/main/manager-mobile/src/pages/device/deviceTimeUtils.test.mjs
xiaozhi-esp32-server/main/manager-mobile/src/pages/device/index.vue
xiaozhi-esp32-server/main/manager-mobile/src/pages/forgot-password/index.vue
xiaozhi-esp32-server/main/manager-mobile/src/pages/index/index.vue
xiaozhi-esp32-server/main/manager-mobile/src/pages/login/index.vue
xiaozhi-esp32-server/main/manager-mobile/src/pages/login/privacy-policy-en.vue
xiaozhi-esp32-server/main/manager-mobile/src/pages/login/privacy-policy-zh.vue
xiaozhi-esp32-server/main/manager-mobile/src/pages/login/user-agreement-en.vue
xiaozhi-esp32-server/main/manager-mobile/src/pages/login/user-agreement-zh.vue
xiaozhi-esp32-server/main/manager-mobile/src/pages/register/index.vue
xiaozhi-esp32-server/main/manager-mobile/src/pages/settings/index.vue
xiaozhi-esp32-server/main/manager-mobile/src/pages/voiceprint/index.vue
xiaozhi-esp32-server/main/manager-mobile/src/router/interceptor.ts
xiaozhi-esp32-server/main/manager-mobile/src/static/app/icons/1024x1024.png
xiaozhi-esp32-server/main/manager-mobile/src/static/app/icons/120x120.png
xiaozhi-esp32-server/main/manager-mobile/src/static/app/icons/144x144.png
xiaozhi-esp32-server/main/manager-mobile/src/static/app/icons/152x152.png
xiaozhi-esp32-server/main/manager-mobile/src/static/app/icons/167x167.png
xiaozhi-esp32-server/main/manager-mobile/src/static/app/icons/180x180.png
xiaozhi-esp32-server/main/manager-mobile/src/static/app/icons/192x192.png
xiaozhi-esp32-server/main/manager-mobile/src/static/app/icons/20x20.png
xiaozhi-esp32-server/main/manager-mobile/src/static/app/icons/29x29.png
xiaozhi-esp32-server/main/manager-mobile/src/static/app/icons/40x40.png
xiaozhi-esp32-server/main/manager-mobile/src/static/app/icons/58x58.png
xiaozhi-esp32-server/main/manager-mobile/src/static/app/icons/60x60.png
xiaozhi-esp32-server/main/manager-mobile/src/static/app/icons/72x72.png
xiaozhi-esp32-server/main/manager-mobile/src/static/app/icons/76x76.png
xiaozhi-esp32-server/main/manager-mobile/src/static/app/icons/80x80.png
xiaozhi-esp32-server/main/manager-mobile/src/static/app/icons/87x87.png
xiaozhi-esp32-server/main/manager-mobile/src/static/app/icons/96x96.png
xiaozhi-esp32-server/main/manager-mobile/src/static/images/.gitkeep
xiaozhi-esp32-server/main/manager-mobile/src/static/images/default-avatar.png
xiaozhi-esp32-server/main/manager-mobile/src/static/images/home/main-top-bg.png
xiaozhi-esp32-server/main/manager-mobile/src/static/logo.png
xiaozhi-esp32-server/main/manager-mobile/src/static/logo.svg
xiaozhi-esp32-server/main/manager-mobile/src/static/tabbar/chat.png
xiaozhi-esp32-server/main/manager-mobile/src/static/tabbar/chat_activate.png
xiaozhi-esp32-server/main/manager-mobile/src/static/tabbar/device.png
xiaozhi-esp32-server/main/manager-mobile/src/static/tabbar/device_activate.png
xiaozhi-esp32-server/main/manager-mobile/src/static/tabbar/example.png
xiaozhi-esp32-server/main/manager-mobile/src/static/tabbar/exampleHL.png
xiaozhi-esp32-server/main/manager-mobile/src/static/tabbar/home.png
xiaozhi-esp32-server/main/manager-mobile/src/static/tabbar/homeHL.png
xiaozhi-esp32-server/main/manager-mobile/src/static/tabbar/microphone.png
xiaozhi-esp32-server/main/manager-mobile/src/static/tabbar/microphone_activate.png
xiaozhi-esp32-server/main/manager-mobile/src/static/tabbar/network.png
xiaozhi-esp32-server/main/manager-mobile/src/static/tabbar/network_activate.png
xiaozhi-esp32-server/main/manager-mobile/src/static/tabbar/personal.png
xiaozhi-esp32-server/main/manager-mobile/src/static/tabbar/personalHL.png
xiaozhi-esp32-server/main/manager-mobile/src/static/tabbar/robot.png
xiaozhi-esp32-server/main/manager-mobile/src/static/tabbar/robot_activate.png
xiaozhi-esp32-server/main/manager-mobile/src/static/tabbar/system.png
xiaozhi-esp32-server/main/manager-mobile/src/static/tabbar/system_activate.png
xiaozhi-esp32-server/main/manager-mobile/src/store/config.ts
xiaozhi-esp32-server/main/manager-mobile/src/store/index.ts
xiaozhi-esp32-server/main/manager-mobile/src/store/lang.ts
xiaozhi-esp32-server/main/manager-mobile/src/store/plugin.ts
xiaozhi-esp32-server/main/manager-mobile/src/store/provider.ts
xiaozhi-esp32-server/main/manager-mobile/src/store/speedPitch.ts
xiaozhi-esp32-server/main/manager-mobile/src/store/user.ts
xiaozhi-esp32-server/main/manager-mobile/src/style/iconfont.css
xiaozhi-esp32-server/main/manager-mobile/src/style/index.scss
xiaozhi-esp32-server/main/manager-mobile/src/typings.d.ts
xiaozhi-esp32-server/main/manager-mobile/src/typings.ts
xiaozhi-esp32-server/main/manager-mobile/src/uni.scss
xiaozhi-esp32-server/main/manager-mobile/src/utils/index.ts
xiaozhi-esp32-server/main/manager-mobile/src/utils/platform.ts
xiaozhi-esp32-server/main/manager-mobile/src/utils/toast.ts
xiaozhi-esp32-server/main/manager-mobile/src/utils/uploadFile.ts
xiaozhi-esp32-server/main/manager-mobile/src/wot-design-uni.d.ts
xiaozhi-esp32-server/main/manager-mobile/tsconfig.json
xiaozhi-esp32-server/main/manager-mobile/uno.config.ts
xiaozhi-esp32-server/main/manager-mobile/unpackage/res/icons/1024x1024.png
xiaozhi-esp32-server/main/manager-mobile/unpackage/res/icons/120x120.png
xiaozhi-esp32-server/main/manager-mobile/unpackage/res/icons/144x144.png
xiaozhi-esp32-server/main/manager-mobile/unpackage/res/icons/152x152.png
xiaozhi-esp32-server/main/manager-mobile/unpackage/res/icons/167x167.png
xiaozhi-esp32-server/main/manager-mobile/unpackage/res/icons/180x180.png
xiaozhi-esp32-server/main/manager-mobile/unpackage/res/icons/192x192.png
xiaozhi-esp32-server/main/manager-mobile/unpackage/res/icons/20x20.png
xiaozhi-esp32-server/main/manager-mobile/unpackage/res/icons/29x29.png
xiaozhi-esp32-server/main/manager-mobile/unpackage/res/icons/40x40.png
xiaozhi-esp32-server/main/manager-mobile/unpackage/res/icons/58x58.png
xiaozhi-esp32-server/main/manager-mobile/unpackage/res/icons/60x60.png
xiaozhi-esp32-server/main/manager-mobile/unpackage/res/icons/72x72.png
xiaozhi-esp32-server/main/manager-mobile/unpackage/res/icons/76x76.png
xiaozhi-esp32-server/main/manager-mobile/unpackage/res/icons/80x80.png
xiaozhi-esp32-server/main/manager-mobile/unpackage/res/icons/87x87.png
xiaozhi-esp32-server/main/manager-mobile/unpackage/res/icons/96x96.png
xiaozhi-esp32-server/main/manager-mobile/vite.config.ts
xiaozhi-esp32-server/main/manager-web/.env.production
xiaozhi-esp32-server/main/manager-web/.npmrc
xiaozhi-esp32-server/main/manager-web/README.md
xiaozhi-esp32-server/main/manager-web/babel.config.js
xiaozhi-esp32-server/main/manager-web/package.json
xiaozhi-esp32-server/main/manager-web/public/favicon.ico
xiaozhi-esp32-server/main/manager-web/public/generator/README.md
xiaozhi-esp32-server/main/manager-web/public/generator/assets/ft_render-ByO_jG18.js
xiaozhi-esp32-server/main/manager-web/public/generator/assets/index-B3ns2K1c.css
xiaozhi-esp32-server/main/manager-web/public/generator/assets/index-Guo1hQ-y.js
xiaozhi-esp32-server/main/manager-web/public/generator/favicon.ico
xiaozhi-esp32-server/main/manager-web/public/generator/index.html
xiaozhi-esp32-server/main/manager-web/public/generator/static/README.md
xiaozhi-esp32-server/main/manager-web/public/generator/static/charsets/deepseek.txt
xiaozhi-esp32-server/main/manager-web/public/generator/static/charsets/gb2312.txt
xiaozhi-esp32-server/main/manager-web/public/generator/static/charsets/latin1.txt
xiaozhi-esp32-server/main/manager-web/public/generator/static/charsets/qwen18409.txt
xiaozhi-esp32-server/main/manager-web/public/generator/static/emojis/noto-emoji_128/angry.gif
xiaozhi-esp32-server/main/manager-web/public/generator/static/emojis/noto-emoji_128/confident.gif
xiaozhi-esp32-server/main/manager-web/public/generator/static/emojis/noto-emoji_128/confused.gif
xiaozhi-esp32-server/main/manager-web/public/generator/static/emojis/noto-emoji_128/cool.gif
xiaozhi-esp32-server/main/manager-web/public/generator/static/emojis/noto-emoji_128/crying.gif
xiaozhi-esp32-server/main/manager-web/public/generator/static/emojis/noto-emoji_128/delicious.gif
xiaozhi-esp32-server/main/manager-web/public/generator/static/emojis/noto-emoji_128/embarrassed.gif
xiaozhi-esp32-server/main/manager-web/public/generator/static/emojis/noto-emoji_128/funny.gif
xiaozhi-esp32-server/main/manager-web/public/generator/static/emojis/noto-emoji_128/happy.gif
xiaozhi-esp32-server/main/manager-web/public/generator/static/emojis/noto-emoji_128/kissy.gif
xiaozhi-esp32-server/main/manager-web/public/generator/static/emojis/noto-emoji_128/laughing.gif
xiaozhi-esp32-server/main/manager-web/public/generator/static/emojis/noto-emoji_128/loving.gif
xiaozhi-esp32-server/main/manager-web/public/generator/static/emojis/noto-emoji_128/neutral.gif
xiaozhi-esp32-server/main/manager-web/public/generator/static/emojis/noto-emoji_128/relaxed.gif
xiaozhi-esp32-server/main/manager-web/public/generator/static/emojis/noto-emoji_128/sad.gif
xiaozhi-esp32-server/main/manager-web/public/generator/static/emojis/noto-emoji_128/shocked.gif
xiaozhi-esp32-server/main/manager-web/public/generator/static/emojis/noto-emoji_128/silly.gif
xiaozhi-esp32-server/main/manager-web/public/generator/static/emojis/noto-emoji_128/sleepy.gif
xiaozhi-esp32-server/main/manager-web/public/generator/static/emojis/noto-emoji_128/surprised.gif
xiaozhi-esp32-server/main/manager-web/public/generator/static/emojis/noto-emoji_128/thinking.gif
xiaozhi-esp32-server/main/manager-web/public/generator/static/emojis/noto-emoji_128/winking.gif
xiaozhi-esp32-server/main/manager-web/public/generator/static/emojis/noto-emoji_64/angry.gif
xiaozhi-esp32-server/main/manager-web/public/generator/static/emojis/noto-emoji_64/confident.gif
xiaozhi-esp32-server/main/manager-web/public/generator/static/emojis/noto-emoji_64/confused.gif
xiaozhi-esp32-server/main/manager-web/public/generator/static/emojis/noto-emoji_64/cool.gif
xiaozhi-esp32-server/main/manager-web/public/generator/static/emojis/noto-emoji_64/crying.gif
xiaozhi-esp32-server/main/manager-web/public/generator/static/emojis/noto-emoji_64/delicious.gif
xiaozhi-esp32-server/main/manager-web/public/generator/static/emojis/noto-emoji_64/embarrassed.gif
xiaozhi-esp32-server/main/manager-web/public/generator/static/emojis/noto-emoji_64/funny.gif
xiaozhi-esp32-server/main/manager-web/public/generator/static/emojis/noto-emoji_64/happy.gif
xiaozhi-esp32-server/main/manager-web/public/generator/static/emojis/noto-emoji_64/kissy.gif
xiaozhi-esp32-server/main/manager-web/public/generator/static/emojis/noto-emoji_64/laughing.gif
xiaozhi-esp32-server/main/manager-web/public/generator/static/emojis/noto-emoji_64/loving.gif
xiaozhi-esp32-server/main/manager-web/public/generator/static/emojis/noto-emoji_64/neutral.gif
xiaozhi-esp32-server/main/manager-web/public/generator/static/emojis/noto-emoji_64/relaxed.gif
xiaozhi-esp32-server/main/manager-web/public/generator/static/emojis/noto-emoji_64/sad.gif
xiaozhi-esp32-server/main/manager-web/public/generator/static/emojis/noto-emoji_64/shocked.gif
xiaozhi-esp32-server/main/manager-web/public/generator/static/emojis/noto-emoji_64/silly.gif
xiaozhi-esp32-server/main/manager-web/public/generator/static/emojis/noto-emoji_64/sleepy.gif
xiaozhi-esp32-server/main/manager-web/public/generator/static/emojis/noto-emoji_64/surprised.gif
xiaozhi-esp32-server/main/manager-web/public/generator/static/emojis/noto-emoji_64/thinking.gif
xiaozhi-esp32-server/main/manager-web/public/generator/static/emojis/noto-emoji_64/winking.gif
xiaozhi-esp32-server/main/manager-web/public/generator/static/emojis/twemoji32/angry.png
xiaozhi-esp32-server/main/manager-web/public/generator/static/emojis/twemoji32/confident.png
xiaozhi-esp32-server/main/manager-web/public/generator/static/emojis/twemoji32/confused.png
xiaozhi-esp32-server/main/manager-web/public/generator/static/emojis/twemoji32/cool.png
xiaozhi-esp32-server/main/manager-web/public/generator/static/emojis/twemoji32/crying.png
xiaozhi-esp32-server/main/manager-web/public/generator/static/emojis/twemoji32/delicious.png
xiaozhi-esp32-server/main/manager-web/public/generator/static/emojis/twemoji32/embarrassed.png
xiaozhi-esp32-server/main/manager-web/public/generator/static/emojis/twemoji32/funny.png
xiaozhi-esp32-server/main/manager-web/public/generator/static/emojis/twemoji32/happy.png
xiaozhi-esp32-server/main/manager-web/public/generator/static/emojis/twemoji32/kissy.png
xiaozhi-esp32-server/main/manager-web/public/generator/static/emojis/twemoji32/laughing.png
xiaozhi-esp32-server/main/manager-web/public/generator/static/emojis/twemoji32/loving.png
xiaozhi-esp32-server/main/manager-web/public/generator/static/emojis/twemoji32/neutral.png
xiaozhi-esp32-server/main/manager-web/public/generator/static/emojis/twemoji32/relaxed.png
xiaozhi-esp32-server/main/manager-web/public/generator/static/emojis/twemoji32/sad.png
xiaozhi-esp32-server/main/manager-web/public/generator/static/emojis/twemoji32/shocked.png
xiaozhi-esp32-server/main/manager-web/public/generator/static/emojis/twemoji32/silly.png
xiaozhi-esp32-server/main/manager-web/public/generator/static/emojis/twemoji32/sleepy.png
xiaozhi-esp32-server/main/manager-web/public/generator/static/emojis/twemoji32/surprised.png
xiaozhi-esp32-server/main/manager-web/public/generator/static/emojis/twemoji32/thinking.png
xiaozhi-esp32-server/main/manager-web/public/generator/static/emojis/twemoji32/winking.png
xiaozhi-esp32-server/main/manager-web/public/generator/static/emojis/twemoji64/angry.png
xiaozhi-esp32-server/main/manager-web/public/generator/static/emojis/twemoji64/confident.png
xiaozhi-esp32-server/main/manager-web/public/generator/static/emojis/twemoji64/confused.png
xiaozhi-esp32-server/main/manager-web/public/generator/static/emojis/twemoji64/cool.png
xiaozhi-esp32-server/main/manager-web/public/generator/static/emojis/twemoji64/crying.png
xiaozhi-esp32-server/main/manager-web/public/generator/static/emojis/twemoji64/delicious.png
xiaozhi-esp32-server/main/manager-web/public/generator/static/emojis/twemoji64/embarrassed.png
xiaozhi-esp32-server/main/manager-web/public/generator/static/emojis/twemoji64/funny.png
xiaozhi-esp32-server/main/manager-web/public/generator/static/emojis/twemoji64/happy.png
xiaozhi-esp32-server/main/manager-web/public/generator/static/emojis/twemoji64/kissy.png
xiaozhi-esp32-server/main/manager-web/public/generator/static/emojis/twemoji64/laughing.png
xiaozhi-esp32-server/main/manager-web/public/generator/static/emojis/twemoji64/loving.png
xiaozhi-esp32-server/main/manager-web/public/generator/static/emojis/twemoji64/neutral.png
xiaozhi-esp32-server/main/manager-web/public/generator/static/emojis/twemoji64/relaxed.png
xiaozhi-esp32-server/main/manager-web/public/generator/static/emojis/twemoji64/sad.png
xiaozhi-esp32-server/main/manager-web/public/generator/static/emojis/twemoji64/shocked.png
xiaozhi-esp32-server/main/manager-web/public/generator/static/emojis/twemoji64/silly.png
xiaozhi-esp32-server/main/manager-web/public/generator/static/emojis/twemoji64/sleepy.png
xiaozhi-esp32-server/main/manager-web/public/generator/static/emojis/twemoji64/surprised.png
xiaozhi-esp32-server/main/manager-web/public/generator/static/emojis/twemoji64/thinking.png
xiaozhi-esp32-server/main/manager-web/public/generator/static/emojis/twemoji64/winking.png
xiaozhi-esp32-server/main/manager-web/public/generator/static/fonts/font_noto_qwen_14_1.bin
xiaozhi-esp32-server/main/manager-web/public/generator/static/fonts/font_noto_qwen_16_4.bin
xiaozhi-esp32-server/main/manager-web/public/generator/static/fonts/font_noto_qwen_20_4.bin
xiaozhi-esp32-server/main/manager-web/public/generator/static/fonts/font_noto_qwen_30_4.bin
xiaozhi-esp32-server/main/manager-web/public/generator/static/fonts/font_puhui_deepseek_14_1.bin
xiaozhi-esp32-server/main/manager-web/public/generator/static/fonts/font_puhui_deepseek_16_4.bin
xiaozhi-esp32-server/main/manager-web/public/generator/static/fonts/font_puhui_deepseek_20_4.bin
xiaozhi-esp32-server/main/manager-web/public/generator/static/fonts/font_puhui_deepseek_30_4.bin
xiaozhi-esp32-server/main/manager-web/public/generator/static/fonts/noto_qwen.ttf
xiaozhi-esp32-server/main/manager-web/public/generator/static/fonts/puhui_deepseek.ttf
xiaozhi-esp32-server/main/manager-web/public/generator/static/multinet_model/fst/commands_cn.txt
xiaozhi-esp32-server/main/manager-web/public/generator/static/multinet_model/fst/commands_en.txt
xiaozhi-esp32-server/main/manager-web/public/generator/static/multinet_model/mn6_cn/_MODEL_INFO_
xiaozhi-esp32-server/main/manager-web/public/generator/static/multinet_model/mn6_cn/mn6_data
xiaozhi-esp32-server/main/manager-web/public/generator/static/multinet_model/mn6_cn/mn6_index
xiaozhi-esp32-server/main/manager-web/public/generator/static/multinet_model/mn6_cn/vocab
xiaozhi-esp32-server/main/manager-web/public/generator/static/multinet_model/mn6_en/_MODEL_INFO_
xiaozhi-esp32-server/main/manager-web/public/generator/static/multinet_model/mn6_en/mn6_data
xiaozhi-esp32-server/main/manager-web/public/generator/static/multinet_model/mn6_en/mn6_index
xiaozhi-esp32-server/main/manager-web/public/generator/static/multinet_model/mn6_en/vocab
xiaozhi-esp32-server/main/manager-web/public/generator/static/multinet_model/mn7_cn/_MODEL_INFO_
xiaozhi-esp32-server/main/manager-web/public/generator/static/multinet_model/mn7_cn/mn7_data
xiaozhi-esp32-server/main/manager-web/public/generator/static/multinet_model/mn7_cn/mn7_index
xiaozhi-esp32-server/main/manager-web/public/generator/static/multinet_model/mn7_cn/vocab
xiaozhi-esp32-server/main/manager-web/public/generator/static/multinet_model/mn7_en/_MODEL_INFO_
xiaozhi-esp32-server/main/manager-web/public/generator/static/multinet_model/mn7_en/mn7_data
xiaozhi-esp32-server/main/manager-web/public/generator/static/multinet_model/mn7_en/mn7_index
xiaozhi-esp32-server/main/manager-web/public/generator/static/multinet_model/mn7_en/vocab
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn7_xiaoaitongxue/_MODEL_INFO_
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn7_xiaoaitongxue/wn7_data
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn7_xiaoaitongxue/wn7_index
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn7q8_xiaoaitongxue/_MODEL_INFO_
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn7q8_xiaoaitongxue/wn7q8_data
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn7q8_xiaoaitongxue/wn7q8_index
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn8_alexa/_MODEL_INFO_
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn8_alexa/wn8_data
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn8_alexa/wn8_index
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn8_hiesp/_MODEL_INFO_
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn8_hiesp/wn8_data
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn8_hiesp/wn8_index
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn8_hilexin/_MODEL_INFO_
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn8_hilexin/wn8_data
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn8_hilexin/wn8_index
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_alexa/_MODEL_INFO_
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_alexa/wn9_data
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_alexa/wn9_index
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_astrolabe_tts/_MODEL_INFO_
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_astrolabe_tts/wn9_data
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_astrolabe_tts/wn9_index
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_bluechip_tts2/_MODEL_INFO_
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_bluechip_tts2/wn9_data
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_bluechip_tts2/wn9_index
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_computer_tts/_MODEL_INFO_
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_computer_tts/wn9_data
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_computer_tts/wn9_index
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_customword/_MODEL_INFO_
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_customword/wn9_data
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_customword/wn9_index
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_hai1xiao3ou1_tts3/_MODEL_INFO_
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_hai1xiao3ou1_tts3/wn9_data
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_hai1xiao3ou1_tts3/wn9_index
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_haixiaowu_tts/_MODEL_INFO_
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_haixiaowu_tts/wn9_data
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_haixiaowu_tts/wn9_index
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_heyily_tts2/_MODEL_INFO_
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_heyily_tts2/wn9_data
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_heyily_tts2/wn9_index
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_heyivy_tts2/_MODEL_INFO_
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_heyivy_tts2/wn9_data
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_heyivy_tts2/wn9_index
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_heyprinter_tts/_MODEL_INFO_
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_heyprinter_tts/wn9_data
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_heyprinter_tts/wn9_index
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_heywanda_tts/_MODEL_INFO_
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_heywanda_tts/wn9_data
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_heywanda_tts/wn9_index
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_heywillow_tts/_MODEL_INFO_
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_heywillow_tts/wn9_data
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_heywillow_tts/wn9_index
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_hiandy_tts2/_MODEL_INFO_
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_hiandy_tts2/wn9_data
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_hiandy_tts2/wn9_index
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_hiesp/_MODEL_INFO_
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_hiesp/wn9_data
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_hiesp/wn9_index
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_hifairy_tts2/_MODEL_INFO_
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_hifairy_tts2/wn9_data
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_hifairy_tts2/wn9_index
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_hijason_tts2/_MODEL_INFO_
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_hijason_tts2/wn9_data
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_hijason_tts2/wn9_index
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_hijolly_tts2/_MODEL_INFO_
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_hijolly_tts2/wn9_data
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_hijolly_tts2/wn9_index
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_hijoy_tts/_MODEL_INFO_
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_hijoy_tts/wn9_data
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_hijoy_tts/wn9_index
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_hilexin/_MODEL_INFO_
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_hilexin/wn9_data
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_hilexin/wn9_index
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_hilili_tts/_MODEL_INFO_
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_hilili_tts/wn9_data
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_hilili_tts/wn9_index
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_himfive/_MODEL_INFO_
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_himfive/wn9_data
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_himfive/wn9_index
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_himiaomiao_tts/_MODEL_INFO_
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_himiaomiao_tts/wn9_data
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_himiaomiao_tts/wn9_index
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_histackchan_tts3/_MODEL_INFO_
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_histackchan_tts3/wn9_data
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_histackchan_tts3/wn9_index
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_hitelly_tts/_MODEL_INFO_
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_hitelly_tts/wn9_data
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_hitelly_tts/wn9_index
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_hiwalle_tts2/_MODEL_INFO_
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_hiwalle_tts2/wn9_data
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_hiwalle_tts2/wn9_index
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_hixiaoxing_tts/_MODEL_INFO_
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_hixiaoxing_tts/wn9_data
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_hixiaoxing_tts/wn9_index
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_jarvis_tts/_MODEL_INFO_
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_jarvis_tts/wn9_data
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_jarvis_tts/wn9_index
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_linaiban_tts2/_MODEL_INFO_
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_linaiban_tts2/wn9_data
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_linaiban_tts2/wn9_index
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_miaomiaotongxue_tts/_MODEL_INFO_
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_miaomiaotongxue_tts/wn9_data
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_miaomiaotongxue_tts/wn9_index
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_mycroft_tts/_MODEL_INFO_
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_mycroft_tts/wn9_data
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_mycroft_tts/wn9_index
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_ni3hao3xiao3mai4_tts2/_MODEL_INFO_
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_ni3hao3xiao3mai4_tts2/wn9_data
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_ni3hao3xiao3mai4_tts2/wn9_index
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_ni3hao3xiao3rui4_tts3/_MODEL_INFO_
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_ni3hao3xiao3rui4_tts3/wn9_data
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_ni3hao3xiao3rui4_tts3/wn9_index
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_nihaobaiying_tts2/_MODEL_INFO_
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_nihaobaiying_tts2/wn9_data
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_nihaobaiying_tts2/wn9_index
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_nihaodongdong_tts2/_MODEL_INFO_
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_nihaodongdong_tts2/wn9_data
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_nihaodongdong_tts2/wn9_index
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_nihaomiaoban_tts2/_MODEL_INFO_
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_nihaomiaoban_tts2/wn9_data
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_nihaomiaoban_tts2/wn9_index
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_nihaoxiaoan_tts2/_MODEL_INFO_
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_nihaoxiaoan_tts2/wn9_data
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_nihaoxiaoan_tts2/wn9_index
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_nihaoxiaoxin_tts/_MODEL_INFO_
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_nihaoxiaoxin_tts/wn9_data
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_nihaoxiaoxin_tts/wn9_index
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_nihaoxiaoyi_tts2/_MODEL_INFO_
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_nihaoxiaoyi_tts2/wn9_data
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_nihaoxiaoyi_tts2/wn9_index
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_nihaoxiaozhi/_MODEL_INFO_
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_nihaoxiaozhi/wn9_data
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_nihaoxiaozhi/wn9_index
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_nihaoxiaozhi_tts/_MODEL_INFO_
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_nihaoxiaozhi_tts/wn9_data
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_nihaoxiaozhi_tts/wn9_index
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_sophia_tts/_MODEL_INFO_
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_sophia_tts/wn9_data
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_sophia_tts/wn9_index
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_sophia_tts_v1/_MODEL_INFO_
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_sophia_tts_v1/wn9_data
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_sophia_tts_v1/wn9_index
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_xiao3feng1xiao3feng1_tts3/_MODEL_INFO_
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_xiao3feng1xiao3feng1_tts3/wn9_data
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_xiao3feng1xiao3feng1_tts3/wn9_index
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_xiao3jia1xiao3jia1_tts3/_MODEL_INFO_
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_xiao3jia1xiao3jia1_tts3/wn9_data
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_xiao3jia1xiao3jia1_tts3/wn9_index
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_xiaoaitongxue/_MODEL_INFO_
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_xiaoaitongxue/wn9_data
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_xiaoaitongxue/wn9_index
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_xiaobinxiaobin_tts/_MODEL_INFO_
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_xiaobinxiaobin_tts/wn9_data
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_xiaobinxiaobin_tts/wn9_index
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_xiaojianxiaojian_tts2/_MODEL_INFO_
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_xiaojianxiaojian_tts2/wn9_data
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_xiaojianxiaojian_tts2/wn9_index
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_xiaokangtongxue_tts2/_MODEL_INFO_
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_xiaokangtongxue_tts2/wn9_data
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_xiaokangtongxue_tts2/wn9_index
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_xiaolongxiaolong_tts/_MODEL_INFO_
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_xiaolongxiaolong_tts/wn9_data
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_xiaolongxiaolong_tts/wn9_index
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_xiaoluxiaolu_tts2/_MODEL_INFO_
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_xiaoluxiaolu_tts2/wn9_data
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_xiaoluxiaolu_tts2/wn9_index
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_xiaomeitongxue_tts/_MODEL_INFO_
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_xiaomeitongxue_tts/wn9_data
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_xiaomeitongxue_tts/wn9_index
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_xiaomingtongxue_tts2/_MODEL_INFO_
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_xiaomingtongxue_tts2/wn9_data
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_xiaomingtongxue_tts2/wn9_index
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_xiaosurou_tts2/_MODEL_INFO_
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_xiaosurou_tts2/wn9_data
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_xiaosurou_tts2/wn9_index
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_xiaotexiaote_tts2/_MODEL_INFO_
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_xiaotexiaote_tts2/wn9_data
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_xiaotexiaote_tts2/wn9_index
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_xiaoyaxiaoya_tts2/_MODEL_INFO_
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_xiaoyaxiaoya_tts2/wn9_data
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_xiaoyaxiaoya_tts2/wn9_index
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_xiaoyutongxue_tts2/_MODEL_INFO_
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_xiaoyutongxue_tts2/wn9_data
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9_xiaoyutongxue_tts2/wn9_index
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9s_alexa/_MODEL_INFO_
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9s_alexa/wn9_data
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9s_alexa/wn9_index
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9s_hiesp/_MODEL_INFO_
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9s_hiesp/wn9_data
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9s_hiesp/wn9_index
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9s_hijason/_MODEL_INFO_
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9s_hijason/wn9_data
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9s_hijason/wn9_index
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9s_hilexin/_MODEL_INFO_
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9s_hilexin/wn9_data
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9s_hilexin/wn9_index
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9s_nihaoxiaozhi/_MODEL_INFO_
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9s_nihaoxiaozhi/wn9_data
xiaozhi-esp32-server/main/manager-web/public/generator/static/wakenet_model/wn9s_nihaoxiaozhi/wn9_index
xiaozhi-esp32-server/main/manager-web/public/generator/workers/gif.js
xiaozhi-esp32-server/main/manager-web/public/generator/workers/gif.worker.js
xiaozhi-esp32-server/main/manager-web/public/index.html
xiaozhi-esp32-server/main/manager-web/public/offline.html
xiaozhi-esp32-server/main/manager-web/public/privacy-policy-en.html
xiaozhi-esp32-server/main/manager-web/public/privacy-policy.html
xiaozhi-esp32-server/main/manager-web/public/user-agreement-en.html
xiaozhi-esp32-server/main/manager-web/public/user-agreement.html
xiaozhi-esp32-server/main/manager-web/scripts/check-i18n.js
xiaozhi-esp32-server/main/manager-web/src/App.vue
xiaozhi-esp32-server/main/manager-web/src/apis/api.js
xiaozhi-esp32-server/main/manager-web/src/apis/httpRequest.js
xiaozhi-esp32-server/main/manager-web/src/apis/module/addressBook.js
xiaozhi-esp32-server/main/manager-web/src/apis/module/admin.js
xiaozhi-esp32-server/main/manager-web/src/apis/module/agent.js
xiaozhi-esp32-server/main/manager-web/src/apis/module/agentSnapshotApi.test.mjs
xiaozhi-esp32-server/main/manager-web/src/apis/module/correctWord.js
xiaozhi-esp32-server/main/manager-web/src/apis/module/device.js
xiaozhi-esp32-server/main/manager-web/src/apis/module/dict.js
xiaozhi-esp32-server/main/manager-web/src/apis/module/knowledgeBase.js
xiaozhi-esp32-server/main/manager-web/src/apis/module/model.js
xiaozhi-esp32-server/main/manager-web/src/apis/module/ota.js
xiaozhi-esp32-server/main/manager-web/src/apis/module/timbre.js
xiaozhi-esp32-server/main/manager-web/src/apis/module/user.js
xiaozhi-esp32-server/main/manager-web/src/apis/module/voiceClone.js
xiaozhi-esp32-server/main/manager-web/src/apis/module/voiceResource.js
xiaozhi-esp32-server/main/manager-web/src/assets/device-avatars/xiaozhi-logo1.png
xiaozhi-esp32-server/main/manager-web/src/assets/device-avatars/xiaozhi-logo10.png
xiaozhi-esp32-server/main/manager-web/src/assets/device-avatars/xiaozhi-logo11.png
xiaozhi-esp32-server/main/manager-web/src/assets/device-avatars/xiaozhi-logo12.png
xiaozhi-esp32-server/main/manager-web/src/assets/device-avatars/xiaozhi-logo13.png
xiaozhi-esp32-server/main/manager-web/src/assets/device-avatars/xiaozhi-logo14.png
xiaozhi-esp32-server/main/manager-web/src/assets/device-avatars/xiaozhi-logo15.png
xiaozhi-esp32-server/main/manager-web/src/assets/device-avatars/xiaozhi-logo16.png
xiaozhi-esp32-server/main/manager-web/src/assets/device-avatars/xiaozhi-logo2.png
xiaozhi-esp32-server/main/manager-web/src/assets/device-avatars/xiaozhi-logo3.png
xiaozhi-esp32-server/main/manager-web/src/assets/device-avatars/xiaozhi-logo4.png
xiaozhi-esp32-server/main/manager-web/src/assets/device-avatars/xiaozhi-logo5.png
xiaozhi-esp32-server/main/manager-web/src/assets/device-avatars/xiaozhi-logo6.png
xiaozhi-esp32-server/main/manager-web/src/assets/device-avatars/xiaozhi-logo7.png
xiaozhi-esp32-server/main/manager-web/src/assets/device-avatars/xiaozhi-logo8.png
xiaozhi-esp32-server/main/manager-web/src/assets/device-avatars/xiaozhi-logo9.png
xiaozhi-esp32-server/main/manager-web/src/assets/header/address_book.png
xiaozhi-esp32-server/main/manager-web/src/assets/header/knowledge_base.png
xiaozhi-esp32-server/main/manager-web/src/assets/header/model_config.png
xiaozhi-esp32-server/main/manager-web/src/assets/header/param_management.png
xiaozhi-esp32-server/main/manager-web/src/assets/header/robot.png
xiaozhi-esp32-server/main/manager-web/src/assets/header/user_management.png
xiaozhi-esp32-server/main/manager-web/src/assets/header/voice.png
xiaozhi-esp32-server/main/manager-web/src/assets/home/avatar.png
xiaozhi-esp32-server/main/manager-web/src/assets/home/close.png
xiaozhi-esp32-server/main/manager-web/src/assets/home/delete.png
xiaozhi-esp32-server/main/manager-web/src/assets/home/equipment.png
xiaozhi-esp32-server/main/manager-web/src/assets/home/info.png
xiaozhi-esp32-server/main/manager-web/src/assets/home/main-top-bg.png
xiaozhi-esp32-server/main/manager-web/src/assets/home/red-info.png
xiaozhi-esp32-server/main/manager-web/src/assets/home/search.png
xiaozhi-esp32-server/main/manager-web/src/assets/home/setting-user.png
xiaozhi-esp32-server/main/manager-web/src/assets/knowledge-base/MD.png
xiaozhi-esp32-server/main/manager-web/src/assets/knowledge-base/default.png
xiaozhi-esp32-server/main/manager-web/src/assets/knowledge-base/docX.png
xiaozhi-esp32-server/main/manager-web/src/assets/knowledge-base/level.png
xiaozhi-esp32-server/main/manager-web/src/assets/knowledge-base/pdf.png
xiaozhi-esp32-server/main/manager-web/src/assets/knowledge-base/star.png
xiaozhi-esp32-server/main/manager-web/src/assets/knowledge-base/txt.png
xiaozhi-esp32-server/main/manager-web/src/assets/knowledge-base/xlsx.png
xiaozhi-esp32-server/main/manager-web/src/assets/login/down-arrow.png
xiaozhi-esp32-server/main/manager-web/src/assets/login/hi.png
xiaozhi-esp32-server/main/manager-web/src/assets/login/login-person.png
xiaozhi-esp32-server/main/manager-web/src/assets/login/password.png
xiaozhi-esp32-server/main/manager-web/src/assets/login/phone.png
xiaozhi-esp32-server/main/manager-web/src/assets/login/register-person.png
xiaozhi-esp32-server/main/manager-web/src/assets/login/shield.png
xiaozhi-esp32-server/main/manager-web/src/assets/login/username.png
xiaozhi-esp32-server/main/manager-web/src/assets/model/inner_conf.png
xiaozhi-esp32-server/main/manager-web/src/assets/model/model.png
xiaozhi-esp32-server/main/manager-web/src/assets/model/output_conf.png
xiaozhi-esp32-server/main/manager-web/src/assets/setting/addressBook.png
xiaozhi-esp32-server/main/manager-web/src/assets/setting/agent.png
xiaozhi-esp32-server/main/manager-web/src/assets/setting/asr.png
xiaozhi-esp32-server/main/manager-web/src/assets/setting/knowledgeBase.png
xiaozhi-esp32-server/main/manager-web/src/assets/setting/mcpAccessPoint.png
xiaozhi-esp32-server/main/manager-web/src/assets/setting/menu.png
xiaozhi-esp32-server/main/manager-web/src/assets/setting/vad.png
xiaozhi-esp32-server/main/manager-web/src/assets/setting/voiceclone.png
xiaozhi-esp32-server/main/manager-web/src/assets/setting/voiceprint.png
xiaozhi-esp32-server/main/manager-web/src/assets/user-avatar1.png
xiaozhi-esp32-server/main/manager-web/src/assets/user-avatar2.png
xiaozhi-esp32-server/main/manager-web/src/assets/user-avatar3.png
xiaozhi-esp32-server/main/manager-web/src/assets/user-avatar4.png
xiaozhi-esp32-server/main/manager-web/src/assets/user-avatar5.png
xiaozhi-esp32-server/main/manager-web/src/assets/xiaozhi-ai.png
xiaozhi-esp32-server/main/manager-web/src/assets/xiaozhi-ai_de.png
xiaozhi-esp32-server/main/manager-web/src/assets/xiaozhi-ai_en.png
xiaozhi-esp32-server/main/manager-web/src/assets/xiaozhi-ai_vi.png
xiaozhi-esp32-server/main/manager-web/src/assets/xiaozhi-ai_zh_CN.png
xiaozhi-esp32-server/main/manager-web/src/assets/xiaozhi-ai_zh_TW.png
xiaozhi-esp32-server/main/manager-web/src/assets/xiaozhi-logo.png
xiaozhi-esp32-server/main/manager-web/src/components/AddDeviceDialog.vue
xiaozhi-esp32-server/main/manager-web/src/components/AddModelDialog.vue
xiaozhi-esp32-server/main/manager-web/src/components/AddWisdomBodyDialog.vue
xiaozhi-esp32-server/main/manager-web/src/components/AddressBookDialog.vue
xiaozhi-esp32-server/main/manager-web/src/components/AgentSnapshotDialog.vue
xiaozhi-esp32-server/main/manager-web/src/components/AudioPlayer.vue
xiaozhi-esp32-server/main/manager-web/src/components/CacheViewer.vue
xiaozhi-esp32-server/main/manager-web/src/components/ChangePasswordDialog.vue
xiaozhi-esp32-server/main/manager-web/src/components/ChatHistoryDialog.vue
xiaozhi-esp32-server/main/manager-web/src/components/ContextProviderDialog.vue
xiaozhi-esp32-server/main/manager-web/src/components/CustomButton.vue
xiaozhi-esp32-server/main/manager-web/src/components/CustomDialog.vue
xiaozhi-esp32-server/main/manager-web/src/components/CustomPagination.vue
xiaozhi-esp32-server/main/manager-web/src/components/CustomTable.vue
xiaozhi-esp32-server/main/manager-web/src/components/DeviceItem.vue
xiaozhi-esp32-server/main/manager-web/src/components/DictDataDialog.vue
xiaozhi-esp32-server/main/manager-web/src/components/DictTypeDialog.vue
xiaozhi-esp32-server/main/manager-web/src/components/EditVoiceDialog.vue
xiaozhi-esp32-server/main/manager-web/src/components/FirmwareDialog.vue
xiaozhi-esp32-server/main/manager-web/src/components/FunctionDialog.vue
xiaozhi-esp32-server/main/manager-web/src/components/HeaderBar.vue
xiaozhi-esp32-server/main/manager-web/src/components/KnowledgeBaseDialog.vue
xiaozhi-esp32-server/main/manager-web/src/components/MacAddressMask.vue
xiaozhi-esp32-server/main/manager-web/src/components/ManualAddDeviceDialog.vue
xiaozhi-esp32-server/main/manager-web/src/components/ManualIcon.vue
xiaozhi-esp32-server/main/manager-web/src/components/ModelEditDialog.vue
xiaozhi-esp32-server/main/manager-web/src/components/ParamDialog.vue
xiaozhi-esp32-server/main/manager-web/src/components/ProviderDialog.vue
xiaozhi-esp32-server/main/manager-web/src/components/ReplacementWordDialog.vue
xiaozhi-esp32-server/main/manager-web/src/components/TtsAdvancedSettings.vue
xiaozhi-esp32-server/main/manager-web/src/components/TtsModel.vue
xiaozhi-esp32-server/main/manager-web/src/components/VersionFooter.vue
xiaozhi-esp32-server/main/manager-web/src/components/ViewPasswordDialog.vue
xiaozhi-esp32-server/main/manager-web/src/components/VoiceCloneDialog.vue
xiaozhi-esp32-server/main/manager-web/src/components/VoicePrintDialog.vue
xiaozhi-esp32-server/main/manager-web/src/components/VoiceResourceDialog.vue
xiaozhi-esp32-server/main/manager-web/src/components/agentSnapshotDisplayUtils.mjs
xiaozhi-esp32-server/main/manager-web/src/components/agentSnapshotDisplayUtils.test.mjs
xiaozhi-esp32-server/main/manager-web/src/i18n/de.js
xiaozhi-esp32-server/main/manager-web/src/i18n/en.js
xiaozhi-esp32-server/main/manager-web/src/i18n/index.js
xiaozhi-esp32-server/main/manager-web/src/i18n/pt_BR.js
xiaozhi-esp32-server/main/manager-web/src/i18n/vi.js
xiaozhi-esp32-server/main/manager-web/src/i18n/zh_CN.js
xiaozhi-esp32-server/main/manager-web/src/i18n/zh_TW.js
xiaozhi-esp32-server/main/manager-web/src/main.js
xiaozhi-esp32-server/main/manager-web/src/registerServiceWorker.js
xiaozhi-esp32-server/main/manager-web/src/router/index.js
xiaozhi-esp32-server/main/manager-web/src/service-worker.js
xiaozhi-esp32-server/main/manager-web/src/store/index.js
xiaozhi-esp32-server/main/manager-web/src/styles/global.scss
xiaozhi-esp32-server/main/manager-web/src/utils/cacheViewer.js
xiaozhi-esp32-server/main/manager-web/src/utils/constant.js
xiaozhi-esp32-server/main/manager-web/src/utils/date.js
xiaozhi-esp32-server/main/manager-web/src/utils/deviceTime.mjs
xiaozhi-esp32-server/main/manager-web/src/utils/featureManager.js
xiaozhi-esp32-server/main/manager-web/src/utils/format.js
xiaozhi-esp32-server/main/manager-web/src/utils/index.js
xiaozhi-esp32-server/main/manager-web/src/views/AddressBookManagement.vue
xiaozhi-esp32-server/main/manager-web/src/views/AgentTemplateManagement.vue
xiaozhi-esp32-server/main/manager-web/src/views/DeviceManagement.vue
xiaozhi-esp32-server/main/manager-web/src/views/DictManagement.vue
xiaozhi-esp32-server/main/manager-web/src/views/FeatureManagement.vue
xiaozhi-esp32-server/main/manager-web/src/views/KnowledgeBaseItem.vue
xiaozhi-esp32-server/main/manager-web/src/views/KnowledgeBaseManagement.vue
xiaozhi-esp32-server/main/manager-web/src/views/ModelConfig.vue
xiaozhi-esp32-server/main/manager-web/src/views/OtaManagement.vue
xiaozhi-esp32-server/main/manager-web/src/views/ParamsManagement.vue
xiaozhi-esp32-server/main/manager-web/src/views/ProviderManagement.vue
xiaozhi-esp32-server/main/manager-web/src/views/ReplacementWordManagement.vue
xiaozhi-esp32-server/main/manager-web/src/views/ServerSideManager.vue
xiaozhi-esp32-server/main/manager-web/src/views/TemplateQuickConfig.vue
xiaozhi-esp32-server/main/manager-web/src/views/UserManagement.vue
xiaozhi-esp32-server/main/manager-web/src/views/VoiceCloneManagement.vue
xiaozhi-esp32-server/main/manager-web/src/views/VoicePrint.vue
xiaozhi-esp32-server/main/manager-web/src/views/VoiceResourceManagement.vue
xiaozhi-esp32-server/main/manager-web/src/views/auth.scss
xiaozhi-esp32-server/main/manager-web/src/views/home.vue
xiaozhi-esp32-server/main/manager-web/src/views/login.vue
xiaozhi-esp32-server/main/manager-web/src/views/register.vue
xiaozhi-esp32-server/main/manager-web/src/views/retrievePassword.vue
xiaozhi-esp32-server/main/manager-web/src/views/roleConfig.vue
xiaozhi-esp32-server/main/manager-web/tests/deviceTime.test.mjs
xiaozhi-esp32-server/main/manager-web/tests/frontendContract.test.mjs
xiaozhi-esp32-server/main/manager-web/tests/timbreContract.test.mjs
xiaozhi-esp32-server/main/manager-web/vue.config.js
xiaozhi-esp32-server/main/xiaozhi-server/agent-base-prompt.txt
xiaozhi-esp32-server/main/xiaozhi-server/app.py
xiaozhi-esp32-server/main/xiaozhi-server/config.yaml
xiaozhi-esp32-server/main/xiaozhi-server/config/assets/bind_code.wav
xiaozhi-esp32-server/main/xiaozhi-server/config/assets/bind_code/0.wav
xiaozhi-esp32-server/main/xiaozhi-server/config/assets/bind_code/1.wav
xiaozhi-esp32-server/main/xiaozhi-server/config/assets/bind_code/2.wav
xiaozhi-esp32-server/main/xiaozhi-server/config/assets/bind_code/3.wav
xiaozhi-esp32-server/main/xiaozhi-server/config/assets/bind_code/4.wav
xiaozhi-esp32-server/main/xiaozhi-server/config/assets/bind_code/5.wav
xiaozhi-esp32-server/main/xiaozhi-server/config/assets/bind_code/6.wav
xiaozhi-esp32-server/main/xiaozhi-server/config/assets/bind_code/7.wav
xiaozhi-esp32-server/main/xiaozhi-server/config/assets/bind_code/8.wav
xiaozhi-esp32-server/main/xiaozhi-server/config/assets/bind_code/9.wav
xiaozhi-esp32-server/main/xiaozhi-server/config/assets/bind_not_found.wav
xiaozhi-esp32-server/main/xiaozhi-server/config/assets/max_output_size.wav
xiaozhi-esp32-server/main/xiaozhi-server/config/assets/tts_notify.mp3
xiaozhi-esp32-server/main/xiaozhi-server/config/assets/wakeup_words.wav
xiaozhi-esp32-server/main/xiaozhi-server/config/assets/wakeup_words_short.wav
xiaozhi-esp32-server/main/xiaozhi-server/config/config_loader.py
xiaozhi-esp32-server/main/xiaozhi-server/config/logger.py
xiaozhi-esp32-server/main/xiaozhi-server/config/manage_api_client.py
xiaozhi-esp32-server/main/xiaozhi-server/config/settings.py
xiaozhi-esp32-server/main/xiaozhi-server/config_from_api.yaml
xiaozhi-esp32-server/main/xiaozhi-server/core/api/base_handler.py
xiaozhi-esp32-server/main/xiaozhi-server/core/api/ota_handler.py
xiaozhi-esp32-server/main/xiaozhi-server/core/api/vision_handler.py
xiaozhi-esp32-server/main/xiaozhi-server/core/auth.py
xiaozhi-esp32-server/main/xiaozhi-server/core/connection.py
xiaozhi-esp32-server/main/xiaozhi-server/core/handle/abortHandle.py
xiaozhi-esp32-server/main/xiaozhi-server/core/handle/helloHandle.py
xiaozhi-esp32-server/main/xiaozhi-server/core/handle/intentHandler.py
xiaozhi-esp32-server/main/xiaozhi-server/core/handle/receiveAudioHandle.py
xiaozhi-esp32-server/main/xiaozhi-server/core/handle/reportHandle.py
xiaozhi-esp32-server/main/xiaozhi-server/core/handle/sendAudioHandle.py
xiaozhi-esp32-server/main/xiaozhi-server/core/handle/textHandle.py
xiaozhi-esp32-server/main/xiaozhi-server/core/handle/textHandler/abortMessageHandler.py
xiaozhi-esp32-server/main/xiaozhi-server/core/handle/textHandler/helloMessageHandler.py
xiaozhi-esp32-server/main/xiaozhi-server/core/handle/textHandler/iotMessageHandler.py
xiaozhi-esp32-server/main/xiaozhi-server/core/handle/textHandler/listenMessageHandler.py
xiaozhi-esp32-server/main/xiaozhi-server/core/handle/textHandler/mcpMessageHandler.py
xiaozhi-esp32-server/main/xiaozhi-server/core/handle/textHandler/pingMessageHandler.py
xiaozhi-esp32-server/main/xiaozhi-server/core/handle/textHandler/serverMessageHandler.py
xiaozhi-esp32-server/main/xiaozhi-server/core/handle/textMessageHandler.py
xiaozhi-esp32-server/main/xiaozhi-server/core/handle/textMessageHandlerRegistry.py
xiaozhi-esp32-server/main/xiaozhi-server/core/handle/textMessageProcessor.py
xiaozhi-esp32-server/main/xiaozhi-server/core/handle/textMessageType.py
xiaozhi-esp32-server/main/xiaozhi-server/core/http_server.py
xiaozhi-esp32-server/main/xiaozhi-server/core/providers/asr/aliyun.py
xiaozhi-esp32-server/main/xiaozhi-server/core/providers/asr/aliyun_stream.py
xiaozhi-esp32-server/main/xiaozhi-server/core/providers/asr/aliyunbl_stream.py
xiaozhi-esp32-server/main/xiaozhi-server/core/providers/asr/baidu.py
xiaozhi-esp32-server/main/xiaozhi-server/core/providers/asr/base.py
xiaozhi-esp32-server/main/xiaozhi-server/core/providers/asr/doubao.py
xiaozhi-esp32-server/main/xiaozhi-server/core/providers/asr/doubao_stream.py
xiaozhi-esp32-server/main/xiaozhi-server/core/providers/asr/dto/dto.py
xiaozhi-esp32-server/main/xiaozhi-server/core/providers/asr/fun_local.py
xiaozhi-esp32-server/main/xiaozhi-server/core/providers/asr/fun_server.py
xiaozhi-esp32-server/main/xiaozhi-server/core/providers/asr/openai.py
xiaozhi-esp32-server/main/xiaozhi-server/core/providers/asr/qwen3_asr_flash.py
xiaozhi-esp32-server/main/xiaozhi-server/core/providers/asr/sherpa_onnx_local.py
xiaozhi-esp32-server/main/xiaozhi-server/core/providers/asr/tencent.py
xiaozhi-esp32-server/main/xiaozhi-server/core/providers/asr/utils.py
xiaozhi-esp32-server/main/xiaozhi-server/core/providers/asr/vosk.py
xiaozhi-esp32-server/main/xiaozhi-server/core/providers/asr/xunfei_stream.py
xiaozhi-esp32-server/main/xiaozhi-server/core/providers/intent/base.py
xiaozhi-esp32-server/main/xiaozhi-server/core/providers/intent/function_call/function_call.py
xiaozhi-esp32-server/main/xiaozhi-server/core/providers/intent/intent_llm/intent_llm.py
xiaozhi-esp32-server/main/xiaozhi-server/core/providers/intent/nointent/nointent.py
xiaozhi-esp32-server/main/xiaozhi-server/core/providers/llm/AliBL/AliBL.py
xiaozhi-esp32-server/main/xiaozhi-server/core/providers/llm/base.py
xiaozhi-esp32-server/main/xiaozhi-server/core/providers/llm/coze/coze.py
xiaozhi-esp32-server/main/xiaozhi-server/core/providers/llm/dify/dify.py
xiaozhi-esp32-server/main/xiaozhi-server/core/providers/llm/fastgpt/fastgpt.py
xiaozhi-esp32-server/main/xiaozhi-server/core/providers/llm/gemini/gemini.py
xiaozhi-esp32-server/main/xiaozhi-server/core/providers/llm/homeassistant/homeassistant.py
xiaozhi-esp32-server/main/xiaozhi-server/core/providers/llm/ollama/ollama.py
xiaozhi-esp32-server/main/xiaozhi-server/core/providers/llm/openai/openai.py
xiaozhi-esp32-server/main/xiaozhi-server/core/providers/llm/system_prompt.py
xiaozhi-esp32-server/main/xiaozhi-server/core/providers/llm/xinference/xinference.py
xiaozhi-esp32-server/main/xiaozhi-server/core/providers/memory/base.py
xiaozhi-esp32-server/main/xiaozhi-server/core/providers/memory/mem0ai/mem0ai.py
xiaozhi-esp32-server/main/xiaozhi-server/core/providers/memory/mem_local_short/mem_local_short.py
xiaozhi-esp32-server/main/xiaozhi-server/core/providers/memory/mem_report_only/mem_report_only.py
xiaozhi-esp32-server/main/xiaozhi-server/core/providers/memory/nomem/nomem.py
xiaozhi-esp32-server/main/xiaozhi-server/core/providers/memory/powermem/powermem.py
xiaozhi-esp32-server/main/xiaozhi-server/core/providers/tools/__init__.py
xiaozhi-esp32-server/main/xiaozhi-server/core/providers/tools/base/__init__.py
xiaozhi-esp32-server/main/xiaozhi-server/core/providers/tools/base/tool_executor.py
xiaozhi-esp32-server/main/xiaozhi-server/core/providers/tools/base/tool_types.py
xiaozhi-esp32-server/main/xiaozhi-server/core/providers/tools/device_iot/__init__.py
xiaozhi-esp32-server/main/xiaozhi-server/core/providers/tools/device_iot/iot_descriptor.py
xiaozhi-esp32-server/main/xiaozhi-server/core/providers/tools/device_iot/iot_executor.py
xiaozhi-esp32-server/main/xiaozhi-server/core/providers/tools/device_iot/iot_handler.py
xiaozhi-esp32-server/main/xiaozhi-server/core/providers/tools/device_mcp/__init__.py
xiaozhi-esp32-server/main/xiaozhi-server/core/providers/tools/device_mcp/mcp_client.py
xiaozhi-esp32-server/main/xiaozhi-server/core/providers/tools/device_mcp/mcp_executor.py
xiaozhi-esp32-server/main/xiaozhi-server/core/providers/tools/device_mcp/mcp_handler.py
xiaozhi-esp32-server/main/xiaozhi-server/core/providers/tools/mcp_endpoint/__init__.py
xiaozhi-esp32-server/main/xiaozhi-server/core/providers/tools/mcp_endpoint/mcp_endpoint_client.py
xiaozhi-esp32-server/main/xiaozhi-server/core/providers/tools/mcp_endpoint/mcp_endpoint_executor.py
xiaozhi-esp32-server/main/xiaozhi-server/core/providers/tools/mcp_endpoint/mcp_endpoint_handler.py
xiaozhi-esp32-server/main/xiaozhi-server/core/providers/tools/server_mcp/__init__.py
xiaozhi-esp32-server/main/xiaozhi-server/core/providers/tools/server_mcp/mcp_client.py
xiaozhi-esp32-server/main/xiaozhi-server/core/providers/tools/server_mcp/mcp_executor.py
xiaozhi-esp32-server/main/xiaozhi-server/core/providers/tools/server_mcp/mcp_manager.py
xiaozhi-esp32-server/main/xiaozhi-server/core/providers/tools/server_plugins/__init__.py
xiaozhi-esp32-server/main/xiaozhi-server/core/providers/tools/server_plugins/plugin_executor.py
xiaozhi-esp32-server/main/xiaozhi-server/core/providers/tools/unified_tool_handler.py
xiaozhi-esp32-server/main/xiaozhi-server/core/providers/tools/unified_tool_manager.py
xiaozhi-esp32-server/main/xiaozhi-server/core/providers/tts/alibl_stream.py
xiaozhi-esp32-server/main/xiaozhi-server/core/providers/tts/aliyun.py
xiaozhi-esp32-server/main/xiaozhi-server/core/providers/tts/aliyun_stream.py
xiaozhi-esp32-server/main/xiaozhi-server/core/providers/tts/base.py
xiaozhi-esp32-server/main/xiaozhi-server/core/providers/tts/cozecn.py
xiaozhi-esp32-server/main/xiaozhi-server/core/providers/tts/custom.py
xiaozhi-esp32-server/main/xiaozhi-server/core/providers/tts/default.py
xiaozhi-esp32-server/main/xiaozhi-server/core/providers/tts/doubao.py
xiaozhi-esp32-server/main/xiaozhi-server/core/providers/tts/dto/dto.py
xiaozhi-esp32-server/main/xiaozhi-server/core/providers/tts/edge.py
xiaozhi-esp32-server/main/xiaozhi-server/core/providers/tts/fishspeech.py
xiaozhi-esp32-server/main/xiaozhi-server/core/providers/tts/gpt_sovits_v2.py
xiaozhi-esp32-server/main/xiaozhi-server/core/providers/tts/gpt_sovits_v3.py
xiaozhi-esp32-server/main/xiaozhi-server/core/providers/tts/huoshan_double_stream.py
xiaozhi-esp32-server/main/xiaozhi-server/core/providers/tts/index_stream.py
xiaozhi-esp32-server/main/xiaozhi-server/core/providers/tts/minimax_httpstream.py
xiaozhi-esp32-server/main/xiaozhi-server/core/providers/tts/openai.py
xiaozhi-esp32-server/main/xiaozhi-server/core/providers/tts/paddle_speech.py
xiaozhi-esp32-server/main/xiaozhi-server/core/providers/tts/siliconflow.py
xiaozhi-esp32-server/main/xiaozhi-server/core/providers/tts/tencent.py
xiaozhi-esp32-server/main/xiaozhi-server/core/providers/tts/xunfei_stream.py
xiaozhi-esp32-server/main/xiaozhi-server/core/providers/vad/base.py
xiaozhi-esp32-server/main/xiaozhi-server/core/providers/vad/silero.py
xiaozhi-esp32-server/main/xiaozhi-server/core/providers/vllm/base.py
xiaozhi-esp32-server/main/xiaozhi-server/core/providers/vllm/openai.py
xiaozhi-esp32-server/main/xiaozhi-server/core/utils/asr.py
xiaozhi-esp32-server/main/xiaozhi-server/core/utils/audioRateController.py
xiaozhi-esp32-server/main/xiaozhi-server/core/utils/auth.py
xiaozhi-esp32-server/main/xiaozhi-server/core/utils/cache/config.py
xiaozhi-esp32-server/main/xiaozhi-server/core/utils/cache/manager.py
xiaozhi-esp32-server/main/xiaozhi-server/core/utils/cache/strategies.py
xiaozhi-esp32-server/main/xiaozhi-server/core/utils/context_provider.py
xiaozhi-esp32-server/main/xiaozhi-server/core/utils/current_time.py
xiaozhi-esp32-server/main/xiaozhi-server/core/utils/dialogue.py
xiaozhi-esp32-server/main/xiaozhi-server/core/utils/gc_manager.py
xiaozhi-esp32-server/main/xiaozhi-server/core/utils/intent.py
xiaozhi-esp32-server/main/xiaozhi-server/core/utils/llm.py
xiaozhi-esp32-server/main/xiaozhi-server/core/utils/memory.py
xiaozhi-esp32-server/main/xiaozhi-server/core/utils/modules_initialize.py
xiaozhi-esp32-server/main/xiaozhi-server/core/utils/opus_encoder_utils.py
xiaozhi-esp32-server/main/xiaozhi-server/core/utils/output_counter.py
xiaozhi-esp32-server/main/xiaozhi-server/core/utils/p3.py
xiaozhi-esp32-server/main/xiaozhi-server/core/utils/prompt_manager.py
xiaozhi-esp32-server/main/xiaozhi-server/core/utils/textUtils.py
xiaozhi-esp32-server/main/xiaozhi-server/core/utils/tts.py
xiaozhi-esp32-server/main/xiaozhi-server/core/utils/util.py
xiaozhi-esp32-server/main/xiaozhi-server/core/utils/vad.py
xiaozhi-esp32-server/main/xiaozhi-server/core/utils/vllm.py
xiaozhi-esp32-server/main/xiaozhi-server/core/utils/voiceprint_provider.py
xiaozhi-esp32-server/main/xiaozhi-server/core/utils/wakeup_word.py
xiaozhi-esp32-server/main/xiaozhi-server/core/websocket_server.py
xiaozhi-esp32-server/main/xiaozhi-server/docker-compose.yml
xiaozhi-esp32-server/main/xiaozhi-server/docker-compose_all.yml
xiaozhi-esp32-server/main/xiaozhi-server/mcp_server_settings.json
xiaozhi-esp32-server/main/xiaozhi-server/models/SenseVoiceSmall/chn_jpn_yue_eng_ko_spectok.bpe.model
xiaozhi-esp32-server/main/xiaozhi-server/models/SenseVoiceSmall/config.yaml
xiaozhi-esp32-server/main/xiaozhi-server/models/SenseVoiceSmall/configuration.json
xiaozhi-esp32-server/main/xiaozhi-server/models/SenseVoiceSmall/demo.py
xiaozhi-esp32-server/main/xiaozhi-server/models/SenseVoiceSmall/example/en.mp3
xiaozhi-esp32-server/main/xiaozhi-server/models/SenseVoiceSmall/example/ja.mp3
xiaozhi-esp32-server/main/xiaozhi-server/models/SenseVoiceSmall/example/ko.mp3
xiaozhi-esp32-server/main/xiaozhi-server/models/SenseVoiceSmall/example/yue.mp3
xiaozhi-esp32-server/main/xiaozhi-server/models/SenseVoiceSmall/example/zh.mp3
xiaozhi-esp32-server/main/xiaozhi-server/models/snakers4_silero-vad/hubconf.py
xiaozhi-esp32-server/main/xiaozhi-server/models/snakers4_silero-vad/src/silero_vad/__init__.py
xiaozhi-esp32-server/main/xiaozhi-server/models/snakers4_silero-vad/src/silero_vad/data/__init__.py
xiaozhi-esp32-server/main/xiaozhi-server/models/snakers4_silero-vad/src/silero_vad/data/silero_vad.jit
xiaozhi-esp32-server/main/xiaozhi-server/models/snakers4_silero-vad/src/silero_vad/data/silero_vad.onnx
xiaozhi-esp32-server/main/xiaozhi-server/models/snakers4_silero-vad/src/silero_vad/data/silero_vad_16k_op15.onnx
xiaozhi-esp32-server/main/xiaozhi-server/models/snakers4_silero-vad/src/silero_vad/data/silero_vad_half.onnx
xiaozhi-esp32-server/main/xiaozhi-server/models/snakers4_silero-vad/src/silero_vad/model.py
xiaozhi-esp32-server/main/xiaozhi-server/models/snakers4_silero-vad/src/silero_vad/utils_vad.py
xiaozhi-esp32-server/main/xiaozhi-server/performance_tester.py
xiaozhi-esp32-server/main/xiaozhi-server/performance_tester/performance_tester_asr.py
xiaozhi-esp32-server/main/xiaozhi-server/performance_tester/performance_tester_llm.py
xiaozhi-esp32-server/main/xiaozhi-server/performance_tester/performance_tester_stream_asr.py
xiaozhi-esp32-server/main/xiaozhi-server/performance_tester/performance_tester_stream_tts.py
xiaozhi-esp32-server/main/xiaozhi-server/performance_tester/performance_tester_tts.py
xiaozhi-esp32-server/main/xiaozhi-server/performance_tester/performance_tester_vllm.py
xiaozhi-esp32-server/main/xiaozhi-server/plugins_func/functions/call_device.py
xiaozhi-esp32-server/main/xiaozhi-server/plugins_func/functions/change_role.py
xiaozhi-esp32-server/main/xiaozhi-server/plugins_func/functions/get_news_from_chinanews.py
xiaozhi-esp32-server/main/xiaozhi-server/plugins_func/functions/get_news_from_newsnow.py
xiaozhi-esp32-server/main/xiaozhi-server/plugins_func/functions/get_time.py
xiaozhi-esp32-server/main/xiaozhi-server/plugins_func/functions/get_weather.py
xiaozhi-esp32-server/main/xiaozhi-server/plugins_func/functions/handle_exit_intent.py
xiaozhi-esp32-server/main/xiaozhi-server/plugins_func/functions/hass_init.py
xiaozhi-esp32-server/main/xiaozhi-server/plugins_func/functions/hass_play_music.py
xiaozhi-esp32-server/main/xiaozhi-server/plugins_func/functions/hass_state.py
xiaozhi-esp32-server/main/xiaozhi-server/plugins_func/functions/play_music.py
xiaozhi-esp32-server/main/xiaozhi-server/plugins_func/functions/search_from_ragflow.py
xiaozhi-esp32-server/main/xiaozhi-server/plugins_func/functions/web_search.py
xiaozhi-esp32-server/main/xiaozhi-server/plugins_func/loadplugins.py
xiaozhi-esp32-server/main/xiaozhi-server/plugins_func/register.py
xiaozhi-esp32-server/main/xiaozhi-server/requirements.txt |